Convert the capability device to use SHA1
[akaros.git] / kern / lib / crypto / 2hmac.c
1 /* Copyright 2016 The Chromium OS Authors. All rights reserved.
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  */
5
6 #include <crypto/2sysincludes.h>
7 #include <crypto/2common.h>
8 #include <crypto/2sha.h>
9
10 int hmac(enum vb2_hash_algorithm alg,
11          const void *key, uint32_t key_size,
12          const void *msg, uint32_t msg_size,
13          uint8_t *mac, uint32_t mac_size)
14 {
15         uint32_t block_size;
16         uint32_t digest_size;
17         uint8_t k[VB2_MAX_BLOCK_SIZE];
18         uint8_t o_pad[VB2_MAX_BLOCK_SIZE];
19         uint8_t i_pad[VB2_MAX_BLOCK_SIZE];
20         uint8_t b[VB2_MAX_DIGEST_SIZE];
21         struct vb2_digest_context dc;
22         int i;
23
24         if (!key | !msg | !mac)
25                 return -1;
26
27         digest_size = vb2_digest_size(alg);
28         block_size = vb2_hash_block_size(alg);
29         if (!digest_size || !block_size)
30                 return -1;
31
32         if (mac_size < digest_size)
33                 return -1;
34
35         if (key_size > block_size) {
36                 vb2_digest_buffer((uint8_t *)key, key_size, alg, k, block_size);
37                 key_size = digest_size;
38         } else {
39                 memcpy(k, key, key_size);
40         }
41         if (key_size < block_size)
42                 memset(k + key_size, 0, block_size - key_size);
43
44         for (i = 0; i < block_size; i++) {
45                 o_pad[i] = 0x5c ^ k[i];
46                 i_pad[i] = 0x36 ^ k[i];
47         }
48
49         vb2_digest_init(&dc, alg);
50         vb2_digest_extend(&dc, i_pad, block_size);
51         vb2_digest_extend(&dc, msg, msg_size);
52         vb2_digest_finalize(&dc, b, digest_size);
53
54         vb2_digest_init(&dc, alg);
55         vb2_digest_extend(&dc, o_pad, block_size);
56         vb2_digest_extend(&dc, b, digest_size);
57         vb2_digest_finalize(&dc, mac, mac_size);
58
59         return 0;
60 }