1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2014 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 * Utility functions for message digest functions.
6*8617a60dSAndroid Build Coastguard Worker */
7*8617a60dSAndroid Build Coastguard Worker
8*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
9*8617a60dSAndroid Build Coastguard Worker #include "2sha.h"
10*8617a60dSAndroid Build Coastguard Worker #include "2sysincludes.h"
11*8617a60dSAndroid Build Coastguard Worker
vb2_digest_size(enum vb2_hash_algorithm hash_alg)12*8617a60dSAndroid Build Coastguard Worker size_t vb2_digest_size(enum vb2_hash_algorithm hash_alg)
13*8617a60dSAndroid Build Coastguard Worker {
14*8617a60dSAndroid Build Coastguard Worker switch (hash_alg) {
15*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA1
16*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA1:
17*8617a60dSAndroid Build Coastguard Worker return VB2_SHA1_DIGEST_SIZE;
18*8617a60dSAndroid Build Coastguard Worker #endif
19*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA256
20*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA224:
21*8617a60dSAndroid Build Coastguard Worker return VB2_SHA224_DIGEST_SIZE;
22*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA256:
23*8617a60dSAndroid Build Coastguard Worker return VB2_SHA256_DIGEST_SIZE;
24*8617a60dSAndroid Build Coastguard Worker #endif
25*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA512
26*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA384:
27*8617a60dSAndroid Build Coastguard Worker return VB2_SHA384_DIGEST_SIZE;
28*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA512:
29*8617a60dSAndroid Build Coastguard Worker return VB2_SHA512_DIGEST_SIZE;
30*8617a60dSAndroid Build Coastguard Worker #endif
31*8617a60dSAndroid Build Coastguard Worker default:
32*8617a60dSAndroid Build Coastguard Worker return 0;
33*8617a60dSAndroid Build Coastguard Worker }
34*8617a60dSAndroid Build Coastguard Worker }
35*8617a60dSAndroid Build Coastguard Worker
vb2_hash_block_size(enum vb2_hash_algorithm alg)36*8617a60dSAndroid Build Coastguard Worker size_t vb2_hash_block_size(enum vb2_hash_algorithm alg)
37*8617a60dSAndroid Build Coastguard Worker {
38*8617a60dSAndroid Build Coastguard Worker switch (alg) {
39*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA1
40*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA1:
41*8617a60dSAndroid Build Coastguard Worker return VB2_SHA1_BLOCK_SIZE;
42*8617a60dSAndroid Build Coastguard Worker #endif
43*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA256
44*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA224: /* SHA224 reuses SHA256 internal structures */
45*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA256:
46*8617a60dSAndroid Build Coastguard Worker return VB2_SHA256_BLOCK_SIZE;
47*8617a60dSAndroid Build Coastguard Worker #endif
48*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA512
49*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA384: /* SHA384 reuses SHA512 internal structures */
50*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA512:
51*8617a60dSAndroid Build Coastguard Worker return VB2_SHA512_BLOCK_SIZE;
52*8617a60dSAndroid Build Coastguard Worker #endif
53*8617a60dSAndroid Build Coastguard Worker default:
54*8617a60dSAndroid Build Coastguard Worker return 0;
55*8617a60dSAndroid Build Coastguard Worker }
56*8617a60dSAndroid Build Coastguard Worker }
57*8617a60dSAndroid Build Coastguard Worker
58*8617a60dSAndroid Build Coastguard Worker test_mockable
vb2_digest_init(struct vb2_digest_context * dc,bool allow_hwcrypto,enum vb2_hash_algorithm algo,uint32_t data_size)59*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_digest_init(struct vb2_digest_context *dc, bool allow_hwcrypto,
60*8617a60dSAndroid Build Coastguard Worker enum vb2_hash_algorithm algo, uint32_t data_size)
61*8617a60dSAndroid Build Coastguard Worker {
62*8617a60dSAndroid Build Coastguard Worker const char msg[] = "%u bytes, hash algo %d, HW acceleration %s";
63*8617a60dSAndroid Build Coastguard Worker
64*8617a60dSAndroid Build Coastguard Worker dc->hash_alg = algo;
65*8617a60dSAndroid Build Coastguard Worker dc->using_hwcrypto = 0;
66*8617a60dSAndroid Build Coastguard Worker
67*8617a60dSAndroid Build Coastguard Worker if (allow_hwcrypto) {
68*8617a60dSAndroid Build Coastguard Worker vb2_error_t rv = vb2ex_hwcrypto_digest_init(algo, data_size);
69*8617a60dSAndroid Build Coastguard Worker if (rv == VB2_SUCCESS) {
70*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG(msg, data_size, algo, "enabled\n");
71*8617a60dSAndroid Build Coastguard Worker dc->using_hwcrypto = 1;
72*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
73*8617a60dSAndroid Build Coastguard Worker }
74*8617a60dSAndroid Build Coastguard Worker if (rv != VB2_ERROR_EX_HWCRYPTO_UNSUPPORTED) {
75*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG(msg, data_size, algo, "initialization error");
76*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG_RAW(": %#x\n", rv);
77*8617a60dSAndroid Build Coastguard Worker return rv;
78*8617a60dSAndroid Build Coastguard Worker }
79*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG(msg, data_size, algo, "unsupported\n");
80*8617a60dSAndroid Build Coastguard Worker } else {
81*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG(msg, data_size, algo, "forbidden\n");
82*8617a60dSAndroid Build Coastguard Worker }
83*8617a60dSAndroid Build Coastguard Worker
84*8617a60dSAndroid Build Coastguard Worker switch (algo) {
85*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA1
86*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA1:
87*8617a60dSAndroid Build Coastguard Worker vb2_sha1_init(&dc->sha1);
88*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
89*8617a60dSAndroid Build Coastguard Worker #endif
90*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA256
91*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA224:
92*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA256:
93*8617a60dSAndroid Build Coastguard Worker vb2_sha256_init(&dc->sha256, algo);
94*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
95*8617a60dSAndroid Build Coastguard Worker #endif
96*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA512
97*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA384:
98*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA512:
99*8617a60dSAndroid Build Coastguard Worker vb2_sha512_init(&dc->sha512, algo);
100*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
101*8617a60dSAndroid Build Coastguard Worker #endif
102*8617a60dSAndroid Build Coastguard Worker default:
103*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_SHA_INIT_ALGORITHM;
104*8617a60dSAndroid Build Coastguard Worker }
105*8617a60dSAndroid Build Coastguard Worker }
106*8617a60dSAndroid Build Coastguard Worker
107*8617a60dSAndroid Build Coastguard Worker test_mockable
vb2_digest_extend(struct vb2_digest_context * dc,const uint8_t * buf,uint32_t size)108*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_digest_extend(struct vb2_digest_context *dc, const uint8_t *buf,
109*8617a60dSAndroid Build Coastguard Worker uint32_t size)
110*8617a60dSAndroid Build Coastguard Worker {
111*8617a60dSAndroid Build Coastguard Worker if (dc->using_hwcrypto)
112*8617a60dSAndroid Build Coastguard Worker return vb2ex_hwcrypto_digest_extend(buf, size);
113*8617a60dSAndroid Build Coastguard Worker
114*8617a60dSAndroid Build Coastguard Worker switch (dc->hash_alg) {
115*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA1
116*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA1:
117*8617a60dSAndroid Build Coastguard Worker vb2_sha1_update(&dc->sha1, buf, size);
118*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
119*8617a60dSAndroid Build Coastguard Worker #endif
120*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA256
121*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA224:
122*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA256:
123*8617a60dSAndroid Build Coastguard Worker vb2_sha256_update(&dc->sha256, buf, size);
124*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
125*8617a60dSAndroid Build Coastguard Worker #endif
126*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA512
127*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA384:
128*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA512:
129*8617a60dSAndroid Build Coastguard Worker vb2_sha512_update(&dc->sha512, buf, size);
130*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
131*8617a60dSAndroid Build Coastguard Worker #endif
132*8617a60dSAndroid Build Coastguard Worker default:
133*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_SHA_EXTEND_ALGORITHM;
134*8617a60dSAndroid Build Coastguard Worker }
135*8617a60dSAndroid Build Coastguard Worker }
136*8617a60dSAndroid Build Coastguard Worker
137*8617a60dSAndroid Build Coastguard Worker test_mockable
vb2_digest_finalize(struct vb2_digest_context * dc,uint8_t * digest,uint32_t digest_size)138*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_digest_finalize(struct vb2_digest_context *dc, uint8_t *digest,
139*8617a60dSAndroid Build Coastguard Worker uint32_t digest_size)
140*8617a60dSAndroid Build Coastguard Worker {
141*8617a60dSAndroid Build Coastguard Worker if (dc->using_hwcrypto)
142*8617a60dSAndroid Build Coastguard Worker return vb2ex_hwcrypto_digest_finalize(digest, digest_size);
143*8617a60dSAndroid Build Coastguard Worker
144*8617a60dSAndroid Build Coastguard Worker if (digest_size < vb2_digest_size(dc->hash_alg))
145*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE;
146*8617a60dSAndroid Build Coastguard Worker
147*8617a60dSAndroid Build Coastguard Worker switch (dc->hash_alg) {
148*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA1
149*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA1:
150*8617a60dSAndroid Build Coastguard Worker vb2_sha1_finalize(&dc->sha1, digest);
151*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
152*8617a60dSAndroid Build Coastguard Worker #endif
153*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA256
154*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA224:
155*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA256:
156*8617a60dSAndroid Build Coastguard Worker vb2_sha256_finalize(&dc->sha256, digest, dc->hash_alg);
157*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
158*8617a60dSAndroid Build Coastguard Worker #endif
159*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA512
160*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA384:
161*8617a60dSAndroid Build Coastguard Worker case VB2_HASH_SHA512:
162*8617a60dSAndroid Build Coastguard Worker vb2_sha512_finalize(&dc->sha512, digest, dc->hash_alg);
163*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
164*8617a60dSAndroid Build Coastguard Worker #endif
165*8617a60dSAndroid Build Coastguard Worker default:
166*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_SHA_FINALIZE_ALGORITHM;
167*8617a60dSAndroid Build Coastguard Worker }
168*8617a60dSAndroid Build Coastguard Worker }
169*8617a60dSAndroid Build Coastguard Worker
vb2_hash_calculate(bool allow_hwcrypto,const void * buf,uint32_t size,enum vb2_hash_algorithm algo,struct vb2_hash * hash)170*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_hash_calculate(bool allow_hwcrypto, const void *buf,
171*8617a60dSAndroid Build Coastguard Worker uint32_t size, enum vb2_hash_algorithm algo,
172*8617a60dSAndroid Build Coastguard Worker struct vb2_hash *hash)
173*8617a60dSAndroid Build Coastguard Worker {
174*8617a60dSAndroid Build Coastguard Worker struct vb2_digest_context dc;
175*8617a60dSAndroid Build Coastguard Worker hash->algo = algo;
176*8617a60dSAndroid Build Coastguard Worker
177*8617a60dSAndroid Build Coastguard Worker VB2_TRY(vb2_digest_init(&dc, allow_hwcrypto, algo, size));
178*8617a60dSAndroid Build Coastguard Worker VB2_TRY(vb2_digest_extend(&dc, buf, size));
179*8617a60dSAndroid Build Coastguard Worker
180*8617a60dSAndroid Build Coastguard Worker return vb2_digest_finalize(&dc, hash->raw, vb2_digest_size(algo));
181*8617a60dSAndroid Build Coastguard Worker }
182*8617a60dSAndroid Build Coastguard Worker
vb2_hash_verify(bool allow_hwcrypto,const void * buf,uint32_t size,const struct vb2_hash * hash)183*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_hash_verify(bool allow_hwcrypto, const void *buf, uint32_t size,
184*8617a60dSAndroid Build Coastguard Worker const struct vb2_hash *hash)
185*8617a60dSAndroid Build Coastguard Worker {
186*8617a60dSAndroid Build Coastguard Worker struct vb2_hash tmp;
187*8617a60dSAndroid Build Coastguard Worker
188*8617a60dSAndroid Build Coastguard Worker VB2_TRY(vb2_hash_calculate(allow_hwcrypto, buf, size, hash->algo, &tmp));
189*8617a60dSAndroid Build Coastguard Worker if (memcmp(tmp.raw, hash->raw, vb2_digest_size(hash->algo)))
190*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_SHA_MISMATCH;
191*8617a60dSAndroid Build Coastguard Worker else
192*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
193*8617a60dSAndroid Build Coastguard Worker }
194