]>
git.saurik.com Git - apple/xnu.git/blob - osfmk/corecrypto/ccdigest/src/ccdigest_update.c
5 * Created by Michael Brouwer on 11/30/10.
6 * Copyright 2010,2011 Apple Inc. All rights reserved.
10 #include <corecrypto/ccdigest.h>
11 #include <corecrypto/cc_priv.h>
13 void ccdigest_update(const struct ccdigest_info
*di
, ccdigest_ctx_t ctx
,
14 unsigned long len
, const void *data
) {
15 char * data_ptr
= (char *) data
;
17 if (ccdigest_num(di
, ctx
) == 0 && len
> di
->block_size
) {
18 unsigned long nblocks
= len
/ di
->block_size
;
19 di
->compress(ccdigest_state(di
, ctx
), nblocks
, data_ptr
);
20 unsigned long nbytes
= nblocks
* di
->block_size
;
23 ccdigest_nbits(di
, ctx
) += nbytes
* 8;
25 unsigned long n
= di
->block_size
- ccdigest_num(di
, ctx
);
28 CC_MEMCPY(ccdigest_data(di
, ctx
) + ccdigest_num(di
, ctx
), data_ptr
, n
);
29 /* typecast: less than block size, will always fit into an int */
30 ccdigest_num(di
, ctx
) += (unsigned int)n
;
33 if (ccdigest_num(di
, ctx
) == di
->block_size
) {
34 di
->compress(ccdigest_state(di
, ctx
), 1, ccdigest_data(di
, ctx
));
35 ccdigest_nbits(di
, ctx
) += ccdigest_num(di
, ctx
) * 8;
36 ccdigest_num(di
, ctx
) = 0;