xref: /aosp_15_r20/external/vboot_reference/firmware/2lib/2hmac.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2016 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  */
5*8617a60dSAndroid Build Coastguard Worker 
6*8617a60dSAndroid Build Coastguard Worker #include "2hmac.h"
7*8617a60dSAndroid Build Coastguard Worker #include "2sha.h"
8*8617a60dSAndroid Build Coastguard Worker #include "2sysincludes.h"
9*8617a60dSAndroid Build Coastguard Worker 
vb2_hmac_calculate(bool allow_hwcrypto,enum vb2_hash_algorithm alg,const void * key,uint32_t key_size,const void * msg,uint32_t msg_size,struct vb2_hash * mac)10*8617a60dSAndroid Build Coastguard Worker int vb2_hmac_calculate(bool allow_hwcrypto, enum vb2_hash_algorithm alg, const void *key,
11*8617a60dSAndroid Build Coastguard Worker 		       uint32_t key_size, const void *msg, uint32_t msg_size,
12*8617a60dSAndroid Build Coastguard Worker 		       struct vb2_hash *mac)
13*8617a60dSAndroid Build Coastguard Worker {
14*8617a60dSAndroid Build Coastguard Worker 	uint32_t block_size;
15*8617a60dSAndroid Build Coastguard Worker 	uint32_t digest_size;
16*8617a60dSAndroid Build Coastguard Worker 	uint8_t k[VB2_MAX_BLOCK_SIZE];
17*8617a60dSAndroid Build Coastguard Worker 	uint8_t o_pad[VB2_MAX_BLOCK_SIZE];
18*8617a60dSAndroid Build Coastguard Worker 	uint8_t i_pad[VB2_MAX_BLOCK_SIZE];
19*8617a60dSAndroid Build Coastguard Worker 	uint8_t b[VB2_MAX_DIGEST_SIZE];
20*8617a60dSAndroid Build Coastguard Worker 	struct vb2_digest_context dc;
21*8617a60dSAndroid Build Coastguard Worker 	int i;
22*8617a60dSAndroid Build Coastguard Worker 
23*8617a60dSAndroid Build Coastguard Worker 	if (!key | !msg | !mac)
24*8617a60dSAndroid Build Coastguard Worker 		return -1;
25*8617a60dSAndroid Build Coastguard Worker 
26*8617a60dSAndroid Build Coastguard Worker 	digest_size = vb2_digest_size(alg);
27*8617a60dSAndroid Build Coastguard Worker 	block_size = vb2_hash_block_size(alg);
28*8617a60dSAndroid Build Coastguard Worker 	if (!digest_size || !block_size)
29*8617a60dSAndroid Build Coastguard Worker 		return -1;
30*8617a60dSAndroid Build Coastguard Worker 
31*8617a60dSAndroid Build Coastguard Worker 	if (key_size > block_size) {
32*8617a60dSAndroid Build Coastguard Worker 		vb2_digest_init(&dc, allow_hwcrypto, alg, 0);
33*8617a60dSAndroid Build Coastguard Worker 		vb2_digest_extend(&dc, (uint8_t *)key, key_size);
34*8617a60dSAndroid Build Coastguard Worker 		vb2_digest_finalize(&dc, k, block_size);
35*8617a60dSAndroid Build Coastguard Worker 		key_size = digest_size;
36*8617a60dSAndroid Build Coastguard Worker 	} else {
37*8617a60dSAndroid Build Coastguard Worker 		memcpy(k, key, key_size);
38*8617a60dSAndroid Build Coastguard Worker 	}
39*8617a60dSAndroid Build Coastguard Worker 	if (key_size < block_size)
40*8617a60dSAndroid Build Coastguard Worker 		memset(k + key_size, 0, block_size - key_size);
41*8617a60dSAndroid Build Coastguard Worker 
42*8617a60dSAndroid Build Coastguard Worker 	for (i = 0; i < block_size; i++) {
43*8617a60dSAndroid Build Coastguard Worker 		o_pad[i] = 0x5c ^ k[i];
44*8617a60dSAndroid Build Coastguard Worker 		i_pad[i] = 0x36 ^ k[i];
45*8617a60dSAndroid Build Coastguard Worker 	}
46*8617a60dSAndroid Build Coastguard Worker 
47*8617a60dSAndroid Build Coastguard Worker 	vb2_digest_init(&dc, allow_hwcrypto, alg, 0);
48*8617a60dSAndroid Build Coastguard Worker 	vb2_digest_extend(&dc, i_pad, block_size);
49*8617a60dSAndroid Build Coastguard Worker 	vb2_digest_extend(&dc, msg, msg_size);
50*8617a60dSAndroid Build Coastguard Worker 	vb2_digest_finalize(&dc, b, digest_size);
51*8617a60dSAndroid Build Coastguard Worker 
52*8617a60dSAndroid Build Coastguard Worker 	vb2_digest_init(&dc, allow_hwcrypto, alg, 0);
53*8617a60dSAndroid Build Coastguard Worker 	vb2_digest_extend(&dc, o_pad, block_size);
54*8617a60dSAndroid Build Coastguard Worker 	vb2_digest_extend(&dc, b, digest_size);
55*8617a60dSAndroid Build Coastguard Worker 	vb2_digest_finalize(&dc, mac->raw, digest_size);
56*8617a60dSAndroid Build Coastguard Worker 	mac->algo = alg;
57*8617a60dSAndroid Build Coastguard Worker 
58*8617a60dSAndroid Build Coastguard Worker 	return 0;
59*8617a60dSAndroid Build Coastguard Worker }
60