ccdigest_final_64be.c [plain text]
#include <corecrypto/ccdigest_priv.h>
#include <corecrypto/cc_priv.h>
void ccdigest_final_64be(const struct ccdigest_info *di, ccdigest_ctx_t ctx,
unsigned char *digest) {
ccdigest_nbits(di, ctx) += ccdigest_num(di, ctx) * 8;
ccdigest_data(di, ctx)[ccdigest_num(di, ctx)++] = 0x80;
if (ccdigest_num(di, ctx) > 64 - 8) {
while (ccdigest_num(di, ctx) < 64) {
ccdigest_data(di, ctx)[ccdigest_num(di, ctx)++] = 0;
}
di->compress(ccdigest_state(di, ctx), 1, ccdigest_data(di, ctx));
ccdigest_num(di, ctx) = 0;
}
while (ccdigest_num(di, ctx) < 64 - 8) {
ccdigest_data(di, ctx)[ccdigest_num(di, ctx)++] = 0;
}
CC_STORE64_BE(ccdigest_nbits(di, ctx), ccdigest_data(di, ctx) + 64 - 8);
di->compress(ccdigest_state(di, ctx), 1, ccdigest_data(di, ctx));
for (unsigned int i = 0; i < di->output_size / 4; i++) {
CC_STORE32_BE(ccdigest_state_u32(di, ctx)[i], digest+(4*i));
}
}