1 /* Copyright (c) 2014 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 * Utility functions for message digest functions.
6 */
7
8 #include "2sysincludes.h"
9 #include "2common.h"
10 #include "2rsa.h"
11 #include "2sha.h"
12
13 #if VB2_SUPPORT_SHA1
14 #define CTH_SHA1 VB2_HASH_SHA1
15 #else
16 #define CTH_SHA1 VB2_HASH_INVALID
17 #endif
18
19 #if VB2_SUPPORT_SHA256
20 #define CTH_SHA256 VB2_HASH_SHA256
21 #else
22 #define CTH_SHA256 VB2_HASH_INVALID
23 #endif
24
25 #if VB2_SUPPORT_SHA512
26 #define CTH_SHA512 VB2_HASH_SHA512
27 #else
28 #define CTH_SHA512 VB2_HASH_INVALID
29 #endif
30
31 static const uint8_t crypto_to_hash[] = {
32 CTH_SHA1,
33 CTH_SHA256,
34 CTH_SHA512,
35 CTH_SHA1,
36 CTH_SHA256,
37 CTH_SHA512,
38 CTH_SHA1,
39 CTH_SHA256,
40 CTH_SHA512,
41 CTH_SHA1,
42 CTH_SHA256,
43 CTH_SHA512,
44 };
45
46 /**
47 * Convert vb2_crypto_algorithm to vb2_hash_algorithm.
48 *
49 * @param algorithm Crypto algorithm (vb2_crypto_algorithm)
50 *
51 * @return The hash algorithm for that crypto algorithm, or VB2_HASH_INVALID if
52 * the crypto algorithm or its corresponding hash algorithm is invalid or not
53 * supported.
54 */
vb2_crypto_to_hash(uint32_t algorithm)55 enum vb2_hash_algorithm vb2_crypto_to_hash(uint32_t algorithm)
56 {
57 if (algorithm < ARRAY_SIZE(crypto_to_hash))
58 return crypto_to_hash[algorithm];
59 else
60 return VB2_HASH_INVALID;
61 }
62
vb2_digest_size(enum vb2_hash_algorithm hash_alg)63 int vb2_digest_size(enum vb2_hash_algorithm hash_alg)
64 {
65 switch (hash_alg) {
66 #if VB2_SUPPORT_SHA1
67 case VB2_HASH_SHA1:
68 return VB2_SHA1_DIGEST_SIZE;
69 #endif
70 #if VB2_SUPPORT_SHA256
71 case VB2_HASH_SHA256:
72 return VB2_SHA256_DIGEST_SIZE;
73 #endif
74 #if VB2_SUPPORT_SHA512
75 case VB2_HASH_SHA512:
76 return VB2_SHA512_DIGEST_SIZE;
77 #endif
78 default:
79 return 0;
80 }
81 }
82
vb2_digest_init(struct vb2_digest_context * dc,enum vb2_hash_algorithm hash_alg)83 int vb2_digest_init(struct vb2_digest_context *dc,
84 enum vb2_hash_algorithm hash_alg)
85 {
86 dc->hash_alg = hash_alg;
87 dc->using_hwcrypto = 0;
88
89 switch (dc->hash_alg) {
90 #if VB2_SUPPORT_SHA1
91 case VB2_HASH_SHA1:
92 vb2_sha1_init(&dc->sha1);
93 return VB2_SUCCESS;
94 #endif
95 #if VB2_SUPPORT_SHA256
96 case VB2_HASH_SHA256:
97 vb2_sha256_init(&dc->sha256);
98 return VB2_SUCCESS;
99 #endif
100 #if VB2_SUPPORT_SHA512
101 case VB2_HASH_SHA512:
102 vb2_sha512_init(&dc->sha512);
103 return VB2_SUCCESS;
104 #endif
105 default:
106 return VB2_ERROR_SHA_INIT_ALGORITHM;
107 }
108 }
109
vb2_digest_extend(struct vb2_digest_context * dc,const uint8_t * buf,uint32_t size)110 int vb2_digest_extend(struct vb2_digest_context *dc,
111 const uint8_t *buf,
112 uint32_t size)
113 {
114 switch (dc->hash_alg) {
115 #if VB2_SUPPORT_SHA1
116 case VB2_HASH_SHA1:
117 vb2_sha1_update(&dc->sha1, buf, size);
118 return VB2_SUCCESS;
119 #endif
120 #if VB2_SUPPORT_SHA256
121 case VB2_HASH_SHA256:
122 vb2_sha256_update(&dc->sha256, buf, size);
123 return VB2_SUCCESS;
124 #endif
125 #if VB2_SUPPORT_SHA512
126 case VB2_HASH_SHA512:
127 vb2_sha512_update(&dc->sha512, buf, size);
128 return VB2_SUCCESS;
129 #endif
130 default:
131 return VB2_ERROR_SHA_EXTEND_ALGORITHM;
132 }
133 }
134
vb2_digest_finalize(struct vb2_digest_context * dc,uint8_t * digest,uint32_t digest_size)135 int vb2_digest_finalize(struct vb2_digest_context *dc,
136 uint8_t *digest,
137 uint32_t digest_size)
138 {
139 if (digest_size < vb2_digest_size(dc->hash_alg))
140 return VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE;
141
142 switch (dc->hash_alg) {
143 #if VB2_SUPPORT_SHA1
144 case VB2_HASH_SHA1:
145 vb2_sha1_finalize(&dc->sha1, digest);
146 return VB2_SUCCESS;
147 #endif
148 #if VB2_SUPPORT_SHA256
149 case VB2_HASH_SHA256:
150 vb2_sha256_finalize(&dc->sha256, digest);
151 return VB2_SUCCESS;
152 #endif
153 #if VB2_SUPPORT_SHA512
154 case VB2_HASH_SHA512:
155 vb2_sha512_finalize(&dc->sha512, digest);
156 return VB2_SUCCESS;
157 #endif
158 default:
159 return VB2_ERROR_SHA_FINALIZE_ALGORITHM;
160 }
161 }
162