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