/src/openssl30/crypto/evp/legacy_sha.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved. |
3 | | * |
4 | | * Licensed under the Apache License 2.0 (the "License"). You may not use |
5 | | * this file except in compliance with the License. You can obtain a copy |
6 | | * in the file LICENSE in the source distribution or at |
7 | | * https://www.openssl.org/source/license.html |
8 | | */ |
9 | | |
10 | | /* |
11 | | * All SHA low level APIs are deprecated for public use, but still ok for |
12 | | * internal use. |
13 | | */ |
14 | | #include "internal/deprecated.h" |
15 | | |
16 | | #include <openssl/sha.h> /* diverse SHA macros */ |
17 | | #include "internal/sha3.h" /* KECCAK1600_WIDTH */ |
18 | | #include "crypto/evp.h" |
19 | | /* Used by legacy methods */ |
20 | | #include "crypto/sha.h" |
21 | | #include "legacy_meth.h" |
22 | | #include "evp_local.h" |
23 | | |
24 | | /*- |
25 | | * LEGACY methods for SHA. |
26 | | * These only remain to support engines that can get these methods. |
27 | | * Hardware support for SHA3 has been removed from these legacy cases. |
28 | | */ |
29 | | #define IMPLEMENT_LEGACY_EVP_MD_METH_SHA3(nm, fn, tag) \ |
30 | 0 | static int nm##_init(EVP_MD_CTX *ctx) \ |
31 | 0 | { \ |
32 | 0 | return fn##_init(EVP_MD_CTX_get0_md_data(ctx), tag, ctx->digest->md_size * 8); \ |
33 | 0 | } \ |
34 | 0 | static int nm##_update(EVP_MD_CTX *ctx, const void *data, size_t count) \ |
35 | 0 | { \ |
36 | 0 | return fn##_update(EVP_MD_CTX_get0_md_data(ctx), data, count); \ |
37 | 0 | } \ |
38 | 0 | static int nm##_final(EVP_MD_CTX *ctx, unsigned char *md) \ |
39 | 0 | { \ |
40 | 0 | return fn##_final(md, EVP_MD_CTX_get0_md_data(ctx)); \ |
41 | 0 | } |
42 | | #define IMPLEMENT_LEGACY_EVP_MD_METH_SHAKE(nm, fn, tag) \ |
43 | 0 | static int nm##_init(EVP_MD_CTX *ctx) \ |
44 | 0 | { \ |
45 | 0 | return fn##_init(EVP_MD_CTX_get0_md_data(ctx), tag, ctx->digest->md_size * 8); \ |
46 | 0 | } \ |
47 | | |
48 | 0 | #define sha512_224_Init sha512_224_init |
49 | 0 | #define sha512_256_Init sha512_256_init |
50 | | |
51 | 0 | #define sha512_224_Update SHA512_Update |
52 | 0 | #define sha512_224_Final SHA512_Final |
53 | 0 | #define sha512_256_Update SHA512_Update |
54 | 0 | #define sha512_256_Final SHA512_Final |
55 | | |
56 | | IMPLEMENT_LEGACY_EVP_MD_METH(sha1, SHA1) |
57 | | IMPLEMENT_LEGACY_EVP_MD_METH(sha224, SHA224) |
58 | | IMPLEMENT_LEGACY_EVP_MD_METH(sha256, SHA256) |
59 | | IMPLEMENT_LEGACY_EVP_MD_METH(sha384, SHA384) |
60 | | IMPLEMENT_LEGACY_EVP_MD_METH(sha512, SHA512) |
61 | | IMPLEMENT_LEGACY_EVP_MD_METH(sha512_224_int, sha512_224) |
62 | | IMPLEMENT_LEGACY_EVP_MD_METH(sha512_256_int, sha512_256) |
63 | | IMPLEMENT_LEGACY_EVP_MD_METH_SHA3(sha3_int, ossl_sha3, '\x06') |
64 | | IMPLEMENT_LEGACY_EVP_MD_METH_SHAKE(shake, ossl_sha3, '\x1f') |
65 | | |
66 | | static int sha1_int_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2) |
67 | 0 | { |
68 | 0 | return ossl_sha1_ctrl(ctx != NULL ? EVP_MD_CTX_get0_md_data(ctx) : NULL, |
69 | 0 | cmd, p1, p2); |
70 | 0 | } |
71 | | |
72 | | static int shake_ctrl(EVP_MD_CTX *evp_ctx, int cmd, int p1, void *p2) |
73 | 0 | { |
74 | 0 | KECCAK1600_CTX *ctx; |
75 | |
|
76 | 0 | if (evp_ctx == NULL) |
77 | 0 | return 0; |
78 | 0 | ctx = evp_ctx->md_data; |
79 | |
|
80 | 0 | switch (cmd) { |
81 | 0 | case EVP_MD_CTRL_XOF_LEN: |
82 | 0 | ctx->md_size = p1; |
83 | 0 | return 1; |
84 | 0 | default: |
85 | 0 | return 0; |
86 | 0 | } |
87 | 0 | } |
88 | | |
89 | | |
90 | | |
91 | | static const EVP_MD sha1_md = { |
92 | | NID_sha1, |
93 | | NID_sha1WithRSAEncryption, |
94 | | SHA_DIGEST_LENGTH, |
95 | | EVP_MD_FLAG_DIGALGID_ABSENT, |
96 | | EVP_ORIG_GLOBAL, |
97 | | LEGACY_EVP_MD_METH_TABLE(sha1_init, sha1_update, sha1_final, sha1_int_ctrl, |
98 | | SHA_CBLOCK), |
99 | | }; |
100 | | |
101 | | const EVP_MD *EVP_sha1(void) |
102 | 339k | { |
103 | 339k | return &sha1_md; |
104 | 339k | } |
105 | | |
106 | | static const EVP_MD sha224_md = { |
107 | | NID_sha224, |
108 | | NID_sha224WithRSAEncryption, |
109 | | SHA224_DIGEST_LENGTH, |
110 | | EVP_MD_FLAG_DIGALGID_ABSENT, |
111 | | EVP_ORIG_GLOBAL, |
112 | | LEGACY_EVP_MD_METH_TABLE(sha224_init, sha224_update, sha224_final, NULL, |
113 | | SHA256_CBLOCK), |
114 | | }; |
115 | | |
116 | | const EVP_MD *EVP_sha224(void) |
117 | 71 | { |
118 | 71 | return &sha224_md; |
119 | 71 | } |
120 | | |
121 | | static const EVP_MD sha256_md = { |
122 | | NID_sha256, |
123 | | NID_sha256WithRSAEncryption, |
124 | | SHA256_DIGEST_LENGTH, |
125 | | EVP_MD_FLAG_DIGALGID_ABSENT, |
126 | | EVP_ORIG_GLOBAL, |
127 | | LEGACY_EVP_MD_METH_TABLE(sha256_init, sha256_update, sha256_final, NULL, |
128 | | SHA256_CBLOCK), |
129 | | }; |
130 | | |
131 | | const EVP_MD *EVP_sha256(void) |
132 | 71 | { |
133 | 71 | return &sha256_md; |
134 | 71 | } |
135 | | |
136 | | static const EVP_MD sha512_224_md = { |
137 | | NID_sha512_224, |
138 | | NID_sha512_224WithRSAEncryption, |
139 | | SHA224_DIGEST_LENGTH, |
140 | | EVP_MD_FLAG_DIGALGID_ABSENT, |
141 | | EVP_ORIG_GLOBAL, |
142 | | LEGACY_EVP_MD_METH_TABLE(sha512_224_int_init, sha512_224_int_update, |
143 | | sha512_224_int_final, NULL, SHA512_CBLOCK), |
144 | | }; |
145 | | |
146 | | const EVP_MD *EVP_sha512_224(void) |
147 | 71 | { |
148 | 71 | return &sha512_224_md; |
149 | 71 | } |
150 | | |
151 | | static const EVP_MD sha512_256_md = { |
152 | | NID_sha512_256, |
153 | | NID_sha512_256WithRSAEncryption, |
154 | | SHA256_DIGEST_LENGTH, |
155 | | EVP_MD_FLAG_DIGALGID_ABSENT, |
156 | | EVP_ORIG_GLOBAL, |
157 | | LEGACY_EVP_MD_METH_TABLE(sha512_256_int_init, sha512_256_int_update, |
158 | | sha512_256_int_final, NULL, SHA512_CBLOCK), |
159 | | }; |
160 | | |
161 | | const EVP_MD *EVP_sha512_256(void) |
162 | 71 | { |
163 | 71 | return &sha512_256_md; |
164 | 71 | } |
165 | | |
166 | | static const EVP_MD sha384_md = { |
167 | | NID_sha384, |
168 | | NID_sha384WithRSAEncryption, |
169 | | SHA384_DIGEST_LENGTH, |
170 | | EVP_MD_FLAG_DIGALGID_ABSENT, |
171 | | EVP_ORIG_GLOBAL, |
172 | | LEGACY_EVP_MD_METH_TABLE(sha384_init, sha384_update, sha384_final, NULL, |
173 | | SHA512_CBLOCK), |
174 | | }; |
175 | | |
176 | | const EVP_MD *EVP_sha384(void) |
177 | 71 | { |
178 | 71 | return &sha384_md; |
179 | 71 | } |
180 | | |
181 | | static const EVP_MD sha512_md = { |
182 | | NID_sha512, |
183 | | NID_sha512WithRSAEncryption, |
184 | | SHA512_DIGEST_LENGTH, |
185 | | EVP_MD_FLAG_DIGALGID_ABSENT, |
186 | | EVP_ORIG_GLOBAL, |
187 | | LEGACY_EVP_MD_METH_TABLE(sha512_init, sha512_update, sha512_final, NULL, |
188 | | SHA512_CBLOCK), |
189 | | }; |
190 | | |
191 | | const EVP_MD *EVP_sha512(void) |
192 | 71 | { |
193 | 71 | return &sha512_md; |
194 | 71 | } |
195 | | |
196 | | #define EVP_MD_SHA3(bitlen) \ |
197 | 284 | const EVP_MD *EVP_sha3_##bitlen(void) \ |
198 | 284 | { \ |
199 | 284 | static const EVP_MD sha3_##bitlen##_md = { \ |
200 | 284 | NID_sha3_##bitlen, \ |
201 | 284 | NID_RSA_SHA3_##bitlen, \ |
202 | 284 | bitlen / 8, \ |
203 | 284 | EVP_MD_FLAG_DIGALGID_ABSENT, \ |
204 | 284 | EVP_ORIG_GLOBAL, \ |
205 | 284 | LEGACY_EVP_MD_METH_TABLE(sha3_int_init, sha3_int_update, \ |
206 | 284 | sha3_int_final, NULL, \ |
207 | 284 | (KECCAK1600_WIDTH - bitlen * 2) / 8), \ |
208 | 284 | }; \ |
209 | 284 | return &sha3_##bitlen##_md; \ |
210 | 284 | } Line | Count | Source | 197 | 71 | const EVP_MD *EVP_sha3_##bitlen(void) \ | 198 | 71 | { \ | 199 | 71 | static const EVP_MD sha3_##bitlen##_md = { \ | 200 | 71 | NID_sha3_##bitlen, \ | 201 | 71 | NID_RSA_SHA3_##bitlen, \ | 202 | 71 | bitlen / 8, \ | 203 | 71 | EVP_MD_FLAG_DIGALGID_ABSENT, \ | 204 | 71 | EVP_ORIG_GLOBAL, \ | 205 | 71 | LEGACY_EVP_MD_METH_TABLE(sha3_int_init, sha3_int_update, \ | 206 | 71 | sha3_int_final, NULL, \ | 207 | 71 | (KECCAK1600_WIDTH - bitlen * 2) / 8), \ | 208 | 71 | }; \ | 209 | 71 | return &sha3_##bitlen##_md; \ | 210 | 71 | } |
Line | Count | Source | 197 | 71 | const EVP_MD *EVP_sha3_##bitlen(void) \ | 198 | 71 | { \ | 199 | 71 | static const EVP_MD sha3_##bitlen##_md = { \ | 200 | 71 | NID_sha3_##bitlen, \ | 201 | 71 | NID_RSA_SHA3_##bitlen, \ | 202 | 71 | bitlen / 8, \ | 203 | 71 | EVP_MD_FLAG_DIGALGID_ABSENT, \ | 204 | 71 | EVP_ORIG_GLOBAL, \ | 205 | 71 | LEGACY_EVP_MD_METH_TABLE(sha3_int_init, sha3_int_update, \ | 206 | 71 | sha3_int_final, NULL, \ | 207 | 71 | (KECCAK1600_WIDTH - bitlen * 2) / 8), \ | 208 | 71 | }; \ | 209 | 71 | return &sha3_##bitlen##_md; \ | 210 | 71 | } |
Line | Count | Source | 197 | 71 | const EVP_MD *EVP_sha3_##bitlen(void) \ | 198 | 71 | { \ | 199 | 71 | static const EVP_MD sha3_##bitlen##_md = { \ | 200 | 71 | NID_sha3_##bitlen, \ | 201 | 71 | NID_RSA_SHA3_##bitlen, \ | 202 | 71 | bitlen / 8, \ | 203 | 71 | EVP_MD_FLAG_DIGALGID_ABSENT, \ | 204 | 71 | EVP_ORIG_GLOBAL, \ | 205 | 71 | LEGACY_EVP_MD_METH_TABLE(sha3_int_init, sha3_int_update, \ | 206 | 71 | sha3_int_final, NULL, \ | 207 | 71 | (KECCAK1600_WIDTH - bitlen * 2) / 8), \ | 208 | 71 | }; \ | 209 | 71 | return &sha3_##bitlen##_md; \ | 210 | 71 | } |
Line | Count | Source | 197 | 71 | const EVP_MD *EVP_sha3_##bitlen(void) \ | 198 | 71 | { \ | 199 | 71 | static const EVP_MD sha3_##bitlen##_md = { \ | 200 | 71 | NID_sha3_##bitlen, \ | 201 | 71 | NID_RSA_SHA3_##bitlen, \ | 202 | 71 | bitlen / 8, \ | 203 | 71 | EVP_MD_FLAG_DIGALGID_ABSENT, \ | 204 | 71 | EVP_ORIG_GLOBAL, \ | 205 | 71 | LEGACY_EVP_MD_METH_TABLE(sha3_int_init, sha3_int_update, \ | 206 | 71 | sha3_int_final, NULL, \ | 207 | 71 | (KECCAK1600_WIDTH - bitlen * 2) / 8), \ | 208 | 71 | }; \ | 209 | 71 | return &sha3_##bitlen##_md; \ | 210 | 71 | } |
|
211 | | #define EVP_MD_SHAKE(bitlen) \ |
212 | 142 | const EVP_MD *EVP_shake##bitlen(void) \ |
213 | 142 | { \ |
214 | 142 | static const EVP_MD shake##bitlen##_md = { \ |
215 | 142 | NID_shake##bitlen, \ |
216 | 142 | 0, \ |
217 | 142 | bitlen / 8, \ |
218 | 142 | EVP_MD_FLAG_XOF | EVP_MD_FLAG_DIGALGID_ABSENT, \ |
219 | 142 | EVP_ORIG_GLOBAL, \ |
220 | 142 | LEGACY_EVP_MD_METH_TABLE(shake_init, sha3_int_update, sha3_int_final, \ |
221 | 142 | shake_ctrl, (KECCAK1600_WIDTH - bitlen * 2) / 8), \ |
222 | 142 | }; \ |
223 | 142 | return &shake##bitlen##_md; \ |
224 | 142 | } Line | Count | Source | 212 | 71 | const EVP_MD *EVP_shake##bitlen(void) \ | 213 | 71 | { \ | 214 | 71 | static const EVP_MD shake##bitlen##_md = { \ | 215 | 71 | NID_shake##bitlen, \ | 216 | 71 | 0, \ | 217 | 71 | bitlen / 8, \ | 218 | 71 | EVP_MD_FLAG_XOF | EVP_MD_FLAG_DIGALGID_ABSENT, \ | 219 | 71 | EVP_ORIG_GLOBAL, \ | 220 | 71 | LEGACY_EVP_MD_METH_TABLE(shake_init, sha3_int_update, sha3_int_final, \ | 221 | 71 | shake_ctrl, (KECCAK1600_WIDTH - bitlen * 2) / 8), \ | 222 | 71 | }; \ | 223 | 71 | return &shake##bitlen##_md; \ | 224 | 71 | } |
Line | Count | Source | 212 | 71 | const EVP_MD *EVP_shake##bitlen(void) \ | 213 | 71 | { \ | 214 | 71 | static const EVP_MD shake##bitlen##_md = { \ | 215 | 71 | NID_shake##bitlen, \ | 216 | 71 | 0, \ | 217 | 71 | bitlen / 8, \ | 218 | 71 | EVP_MD_FLAG_XOF | EVP_MD_FLAG_DIGALGID_ABSENT, \ | 219 | 71 | EVP_ORIG_GLOBAL, \ | 220 | 71 | LEGACY_EVP_MD_METH_TABLE(shake_init, sha3_int_update, sha3_int_final, \ | 221 | 71 | shake_ctrl, (KECCAK1600_WIDTH - bitlen * 2) / 8), \ | 222 | 71 | }; \ | 223 | 71 | return &shake##bitlen##_md; \ | 224 | 71 | } |
|
225 | | |
226 | | EVP_MD_SHA3(224) |
227 | | EVP_MD_SHA3(256) |
228 | | EVP_MD_SHA3(384) |
229 | | EVP_MD_SHA3(512) |
230 | | |
231 | | EVP_MD_SHAKE(128) |
232 | | EVP_MD_SHAKE(256) |