VirtualBox

source: vbox/trunk/src/libs/openssl-3.1.4/crypto/sha/sha256.c@ 103112

最後變更 在這個檔案從103112是 102863,由 vboxsync 提交於 14 月 前

openssl-3.1.4: Applied and adjusted our OpenSSL changes to 3.1.3. bugref:10577

檔案大小: 13.4 KB
 
1/*
2 * Copyright 2004-2022 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 * SHA256 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/opensslconf.h>
17
18#include <stdlib.h>
19#include <string.h>
20
21#include <openssl/crypto.h>
22#include <openssl/sha.h>
23#include <openssl/opensslv.h>
24#include "internal/endian.h"
25
26int SHA224_Init(SHA256_CTX *c)
27{
28 memset(c, 0, sizeof(*c));
29 c->h[0] = 0xc1059ed8UL;
30 c->h[1] = 0x367cd507UL;
31 c->h[2] = 0x3070dd17UL;
32 c->h[3] = 0xf70e5939UL;
33 c->h[4] = 0xffc00b31UL;
34 c->h[5] = 0x68581511UL;
35 c->h[6] = 0x64f98fa7UL;
36 c->h[7] = 0xbefa4fa4UL;
37 c->md_len = SHA224_DIGEST_LENGTH;
38 return 1;
39}
40
41int SHA256_Init(SHA256_CTX *c)
42{
43 memset(c, 0, sizeof(*c));
44 c->h[0] = 0x6a09e667UL;
45 c->h[1] = 0xbb67ae85UL;
46 c->h[2] = 0x3c6ef372UL;
47 c->h[3] = 0xa54ff53aUL;
48 c->h[4] = 0x510e527fUL;
49 c->h[5] = 0x9b05688cUL;
50 c->h[6] = 0x1f83d9abUL;
51 c->h[7] = 0x5be0cd19UL;
52 c->md_len = SHA256_DIGEST_LENGTH;
53 return 1;
54}
55
56int SHA224_Update(SHA256_CTX *c, const void *data, size_t len)
57{
58 return SHA256_Update(c, data, len);
59}
60
61int SHA224_Final(unsigned char *md, SHA256_CTX *c)
62{
63 return SHA256_Final(md, c);
64}
65
66#define DATA_ORDER_IS_BIG_ENDIAN
67
68#define HASH_LONG SHA_LONG
69#define HASH_CTX SHA256_CTX
70#define HASH_CBLOCK SHA_CBLOCK
71
72/*
73 * Note that FIPS180-2 discusses "Truncation of the Hash Function Output."
74 * default: case below covers for it. It's not clear however if it's
75 * permitted to truncate to amount of bytes not divisible by 4. I bet not,
76 * but if it is, then default: case shall be extended. For reference.
77 * Idea behind separate cases for pre-defined lengths is to let the
78 * compiler decide if it's appropriate to unroll small loops.
79 */
80#define HASH_MAKE_STRING(c,s) do { \
81 unsigned long ll; \
82 unsigned int nn; \
83 switch ((c)->md_len) \
84 { case SHA224_DIGEST_LENGTH: \
85 for (nn=0;nn<SHA224_DIGEST_LENGTH/4;nn++) \
86 { ll=(c)->h[nn]; (void)HOST_l2c(ll,(s)); } \
87 break; \
88 case SHA256_DIGEST_LENGTH: \
89 for (nn=0;nn<SHA256_DIGEST_LENGTH/4;nn++) \
90 { ll=(c)->h[nn]; (void)HOST_l2c(ll,(s)); } \
91 break; \
92 default: \
93 if ((c)->md_len > SHA256_DIGEST_LENGTH) \
94 return 0; \
95 for (nn=0;nn<(c)->md_len/4;nn++) \
96 { ll=(c)->h[nn]; (void)HOST_l2c(ll,(s)); } \
97 break; \
98 } \
99 } while (0)
100
101#define HASH_UPDATE SHA256_Update
102#define HASH_TRANSFORM SHA256_Transform
103#define HASH_FINAL SHA256_Final
104#define HASH_BLOCK_DATA_ORDER sha256_block_data_order
105#ifndef SHA256_ASM
106static
107#endif
108void sha256_block_data_order(SHA256_CTX *ctx, const void *in, size_t num);
109
110#include "crypto/md32_common.h"
111
112#ifndef SHA256_ASM
113static const SHA_LONG K256[64] = {
114 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
115 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
116 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
117 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
118 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
119 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
120 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
121 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
122 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
123 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
124 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
125 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
126 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
127 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
128 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
129 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
130};
131
132# ifndef PEDANTIC
133# if defined(__GNUC__) && __GNUC__>=2 && \
134 !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
135# if defined(__riscv_zknh)
136# define Sigma0(x) ({ MD32_REG_T ret; \
137 asm ("sha256sum0 %0, %1" \
138 : "=r"(ret) \
139 : "r"(x)); ret; })
140# define Sigma1(x) ({ MD32_REG_T ret; \
141 asm ("sha256sum1 %0, %1" \
142 : "=r"(ret) \
143 : "r"(x)); ret; })
144# define sigma0(x) ({ MD32_REG_T ret; \
145 asm ("sha256sig0 %0, %1" \
146 : "=r"(ret) \
147 : "r"(x)); ret; })
148# define sigma1(x) ({ MD32_REG_T ret; \
149 asm ("sha256sig1 %0, %1" \
150 : "=r"(ret) \
151 : "r"(x)); ret; })
152# endif
153# if defined(__riscv_zbt) || defined(__riscv_zpn)
154# define Ch(x,y,z) ({ MD32_REG_T ret; \
155 asm (".insn r4 0x33, 1, 0x3, %0, %2, %1, %3"\
156 : "=r"(ret) \
157 : "r"(x), "r"(y), "r"(z)); ret; })
158# define Maj(x,y,z) ({ MD32_REG_T ret; \
159 asm (".insn r4 0x33, 1, 0x3, %0, %2, %1, %3"\
160 : "=r"(ret) \
161 : "r"(x^z), "r"(y), "r"(x)); ret; })
162# endif
163# endif
164# endif
165
166/*
167 * FIPS specification refers to right rotations, while our ROTATE macro
168 * is left one. This is why you might notice that rotation coefficients
169 * differ from those observed in FIPS document by 32-N...
170 */
171# ifndef Sigma0
172# define Sigma0(x) (ROTATE((x),30) ^ ROTATE((x),19) ^ ROTATE((x),10))
173# endif
174# ifndef Sigma1
175# define Sigma1(x) (ROTATE((x),26) ^ ROTATE((x),21) ^ ROTATE((x),7))
176# endif
177# ifndef sigma0
178# define sigma0(x) (ROTATE((x),25) ^ ROTATE((x),14) ^ ((x)>>3))
179# endif
180# ifndef sigma1
181# define sigma1(x) (ROTATE((x),15) ^ ROTATE((x),13) ^ ((x)>>10))
182# endif
183# ifndef Ch
184# define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
185# endif
186# ifndef Maj
187# define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
188# endif
189
190# ifdef OPENSSL_SMALL_FOOTPRINT
191
192static void sha256_block_data_order(SHA256_CTX *ctx, const void *in,
193 size_t num)
194{
195 unsigned MD32_REG_T a, b, c, d, e, f, g, h, s0, s1, T1, T2;
196 SHA_LONG X[16], l;
197 int i;
198 const unsigned char *data = in;
199
200 while (num--) {
201
202 a = ctx->h[0];
203 b = ctx->h[1];
204 c = ctx->h[2];
205 d = ctx->h[3];
206 e = ctx->h[4];
207 f = ctx->h[5];
208 g = ctx->h[6];
209 h = ctx->h[7];
210
211 for (i = 0; i < 16; i++) {
212 (void)HOST_c2l(data, l);
213 T1 = X[i] = l;
214 T1 += h + Sigma1(e) + Ch(e, f, g) + K256[i];
215 T2 = Sigma0(a) + Maj(a, b, c);
216 h = g;
217 g = f;
218 f = e;
219 e = d + T1;
220 d = c;
221 c = b;
222 b = a;
223 a = T1 + T2;
224 }
225
226 for (; i < 64; i++) {
227 s0 = X[(i + 1) & 0x0f];
228 s0 = sigma0(s0);
229 s1 = X[(i + 14) & 0x0f];
230 s1 = sigma1(s1);
231
232 T1 = X[i & 0xf] += s0 + s1 + X[(i + 9) & 0xf];
233 T1 += h + Sigma1(e) + Ch(e, f, g) + K256[i];
234 T2 = Sigma0(a) + Maj(a, b, c);
235 h = g;
236 g = f;
237 f = e;
238 e = d + T1;
239 d = c;
240 c = b;
241 b = a;
242 a = T1 + T2;
243 }
244
245 ctx->h[0] += a;
246 ctx->h[1] += b;
247 ctx->h[2] += c;
248 ctx->h[3] += d;
249 ctx->h[4] += e;
250 ctx->h[5] += f;
251 ctx->h[6] += g;
252 ctx->h[7] += h;
253
254 }
255}
256
257# else
258
259# define ROUND_00_15(i,a,b,c,d,e,f,g,h) do { \
260 T1 += h + Sigma1(e) + Ch(e,f,g) + K256[i]; \
261 h = Sigma0(a) + Maj(a,b,c); \
262 d += T1; h += T1; } while (0)
263
264# define ROUND_16_63(i,a,b,c,d,e,f,g,h,X) do { \
265 s0 = X[(i+1)&0x0f]; s0 = sigma0(s0); \
266 s1 = X[(i+14)&0x0f]; s1 = sigma1(s1); \
267 T1 = X[(i)&0x0f] += s0 + s1 + X[(i+9)&0x0f]; \
268 ROUND_00_15(i,a,b,c,d,e,f,g,h); } while (0)
269
270static void sha256_block_data_order(SHA256_CTX *ctx, const void *in,
271 size_t num)
272{
273 unsigned MD32_REG_T a, b, c, d, e, f, g, h, s0, s1, T1;
274 SHA_LONG X[16];
275 int i;
276 const unsigned char *data = in;
277 DECLARE_IS_ENDIAN;
278
279 while (num--) {
280
281 a = ctx->h[0];
282 b = ctx->h[1];
283 c = ctx->h[2];
284 d = ctx->h[3];
285 e = ctx->h[4];
286 f = ctx->h[5];
287 g = ctx->h[6];
288 h = ctx->h[7];
289
290 if (!IS_LITTLE_ENDIAN && sizeof(SHA_LONG) == 4
291 && ((size_t)in % 4) == 0) {
292 const SHA_LONG *W = (const SHA_LONG *)data;
293
294 T1 = X[0] = W[0];
295 ROUND_00_15(0, a, b, c, d, e, f, g, h);
296 T1 = X[1] = W[1];
297 ROUND_00_15(1, h, a, b, c, d, e, f, g);
298 T1 = X[2] = W[2];
299 ROUND_00_15(2, g, h, a, b, c, d, e, f);
300 T1 = X[3] = W[3];
301 ROUND_00_15(3, f, g, h, a, b, c, d, e);
302 T1 = X[4] = W[4];
303 ROUND_00_15(4, e, f, g, h, a, b, c, d);
304 T1 = X[5] = W[5];
305 ROUND_00_15(5, d, e, f, g, h, a, b, c);
306 T1 = X[6] = W[6];
307 ROUND_00_15(6, c, d, e, f, g, h, a, b);
308 T1 = X[7] = W[7];
309 ROUND_00_15(7, b, c, d, e, f, g, h, a);
310 T1 = X[8] = W[8];
311 ROUND_00_15(8, a, b, c, d, e, f, g, h);
312 T1 = X[9] = W[9];
313 ROUND_00_15(9, h, a, b, c, d, e, f, g);
314 T1 = X[10] = W[10];
315 ROUND_00_15(10, g, h, a, b, c, d, e, f);
316 T1 = X[11] = W[11];
317 ROUND_00_15(11, f, g, h, a, b, c, d, e);
318 T1 = X[12] = W[12];
319 ROUND_00_15(12, e, f, g, h, a, b, c, d);
320 T1 = X[13] = W[13];
321 ROUND_00_15(13, d, e, f, g, h, a, b, c);
322 T1 = X[14] = W[14];
323 ROUND_00_15(14, c, d, e, f, g, h, a, b);
324 T1 = X[15] = W[15];
325 ROUND_00_15(15, b, c, d, e, f, g, h, a);
326
327 data += SHA256_CBLOCK;
328 } else {
329 SHA_LONG l;
330
331 (void)HOST_c2l(data, l);
332 T1 = X[0] = l;
333 ROUND_00_15(0, a, b, c, d, e, f, g, h);
334 (void)HOST_c2l(data, l);
335 T1 = X[1] = l;
336 ROUND_00_15(1, h, a, b, c, d, e, f, g);
337 (void)HOST_c2l(data, l);
338 T1 = X[2] = l;
339 ROUND_00_15(2, g, h, a, b, c, d, e, f);
340 (void)HOST_c2l(data, l);
341 T1 = X[3] = l;
342 ROUND_00_15(3, f, g, h, a, b, c, d, e);
343 (void)HOST_c2l(data, l);
344 T1 = X[4] = l;
345 ROUND_00_15(4, e, f, g, h, a, b, c, d);
346 (void)HOST_c2l(data, l);
347 T1 = X[5] = l;
348 ROUND_00_15(5, d, e, f, g, h, a, b, c);
349 (void)HOST_c2l(data, l);
350 T1 = X[6] = l;
351 ROUND_00_15(6, c, d, e, f, g, h, a, b);
352 (void)HOST_c2l(data, l);
353 T1 = X[7] = l;
354 ROUND_00_15(7, b, c, d, e, f, g, h, a);
355 (void)HOST_c2l(data, l);
356 T1 = X[8] = l;
357 ROUND_00_15(8, a, b, c, d, e, f, g, h);
358 (void)HOST_c2l(data, l);
359 T1 = X[9] = l;
360 ROUND_00_15(9, h, a, b, c, d, e, f, g);
361 (void)HOST_c2l(data, l);
362 T1 = X[10] = l;
363 ROUND_00_15(10, g, h, a, b, c, d, e, f);
364 (void)HOST_c2l(data, l);
365 T1 = X[11] = l;
366 ROUND_00_15(11, f, g, h, a, b, c, d, e);
367 (void)HOST_c2l(data, l);
368 T1 = X[12] = l;
369 ROUND_00_15(12, e, f, g, h, a, b, c, d);
370 (void)HOST_c2l(data, l);
371 T1 = X[13] = l;
372 ROUND_00_15(13, d, e, f, g, h, a, b, c);
373 (void)HOST_c2l(data, l);
374 T1 = X[14] = l;
375 ROUND_00_15(14, c, d, e, f, g, h, a, b);
376 (void)HOST_c2l(data, l);
377 T1 = X[15] = l;
378 ROUND_00_15(15, b, c, d, e, f, g, h, a);
379 }
380
381 for (i = 16; i < 64; i += 8) {
382 ROUND_16_63(i + 0, a, b, c, d, e, f, g, h, X);
383 ROUND_16_63(i + 1, h, a, b, c, d, e, f, g, X);
384 ROUND_16_63(i + 2, g, h, a, b, c, d, e, f, X);
385 ROUND_16_63(i + 3, f, g, h, a, b, c, d, e, X);
386 ROUND_16_63(i + 4, e, f, g, h, a, b, c, d, X);
387 ROUND_16_63(i + 5, d, e, f, g, h, a, b, c, X);
388 ROUND_16_63(i + 6, c, d, e, f, g, h, a, b, X);
389 ROUND_16_63(i + 7, b, c, d, e, f, g, h, a, X);
390 }
391
392 ctx->h[0] += a;
393 ctx->h[1] += b;
394 ctx->h[2] += c;
395 ctx->h[3] += d;
396 ctx->h[4] += e;
397 ctx->h[5] += f;
398 ctx->h[6] += g;
399 ctx->h[7] += h;
400
401 }
402}
403
404# endif
405#endif /* SHA256_ASM */
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette