Пример #1
0
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);
}
Пример #2
0
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;
}