void cchmac(const struct ccdigest_info *di, unsigned long key_len, const void *key, unsigned long data_len, const void *data, unsigned char *mac) { cchmac_di_decl(di, hc); cchmac_init(di, hc, key_len, key); cchmac_update(di, hc, data_len, data); cchmac_final(di, hc, mac); cchmac_di_clear(di, hc); }
int ccnistkdf_fb_hmac_fixed(const struct ccdigest_info *di, int use_counter, size_t kdkLen, const void *kdk, size_t fixedDataLen, const void *fixedData, size_t ivLen, const void *iv, size_t dkLen, void *dk) { size_t h = di->output_size; size_t n = cc_div_ceiling(dkLen, h); uint8_t result_buf[n*h]; uint8_t *result = result_buf; const uint8_t *iv_local = iv; uint8_t iv_local_len = ivLen; if(n > UINT32_MAX) return -1; if(kdkLen == 0 || kdk == NULL) return -1; if(dkLen == 0 || dk == NULL) return -1; use_counter = (use_counter) ? 1: 0; cchmac_di_decl(di, hc); cchmac_state_cache(di, istate); cchmac_init(di, hc, kdkLen, kdk); cchmac_cache_state(di, hc, istate); for(size_t i = 1; i <= n; i++, result += h) { F(di, hc, istate, iv_local_len, iv_local, i*use_counter, fixedDataLen, fixedData, result); iv_local = result; iv_local_len = h; } CC_MEMCPY(dk, result_buf, dkLen); cc_clear(n*h,result_buf); cchmac_di_clear(di, hc); cc_clear(di->state_size, istate); return 0; }