summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/sm3/sm3.c231
1 files changed, 115 insertions, 116 deletions
diff --git a/src/lib/libcrypto/sm3/sm3.c b/src/lib/libcrypto/sm3/sm3.c
index 5269655594..06b5f167f0 100644
--- a/src/lib/libcrypto/sm3/sm3.c
+++ b/src/lib/libcrypto/sm3/sm3.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: sm3.c,v 1.8 2024/03/28 08:04:27 jsing Exp $ */ 1/* $OpenBSD: sm3.c,v 1.9 2024/03/28 08:13:11 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, Ribose Inc 3 * Copyright (c) 2018, Ribose Inc
4 * 4 *
@@ -53,102 +53,6 @@ void SM3_transform(SM3_CTX *c, const unsigned char *data);
53 53
54#include "md32_common.h" 54#include "md32_common.h"
55 55
56int
57HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len)
58{
59 const unsigned char *data = data_;
60 unsigned char *p;
61 HASH_LONG l;
62 size_t n;
63
64 if (len == 0)
65 return 1;
66
67 l = (c->Nl + (((HASH_LONG)len) << 3))&0xffffffffUL;
68 /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
69 * Wei Dai <weidai@eskimo.com> for pointing it out. */
70 if (l < c->Nl) /* overflow */
71 c->Nh++;
72 c->Nh+=(HASH_LONG)(len>>29); /* might cause compiler warning on 16-bit */
73 c->Nl = l;
74
75 n = c->num;
76 if (n != 0) {
77 p = (unsigned char *)c->data;
78
79 if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) {
80 memcpy (p + n, data, HASH_CBLOCK - n);
81 HASH_BLOCK_DATA_ORDER (c, p, 1);
82 n = HASH_CBLOCK - n;
83 data += n;
84 len -= n;
85 c->num = 0;
86 memset (p,0,HASH_CBLOCK); /* keep it zeroed */
87 } else {
88 memcpy (p + n, data, len);
89 c->num += (unsigned int)len;
90 return 1;
91 }
92 }
93
94 n = len/HASH_CBLOCK;
95 if (n > 0) {
96 HASH_BLOCK_DATA_ORDER (c, data, n);
97 n *= HASH_CBLOCK;
98 data += n;
99 len -= n;
100 }
101
102 if (len != 0) {
103 p = (unsigned char *)c->data;
104 c->num = (unsigned int)len;
105 memcpy (p, data, len);
106 }
107 return 1;
108}
109
110void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data)
111{
112 HASH_BLOCK_DATA_ORDER (c, data, 1);
113}
114
115int HASH_FINAL (unsigned char *md, HASH_CTX *c)
116{
117 unsigned char *p = (unsigned char *)c->data;
118 size_t n = c->num;
119
120 p[n] = 0x80; /* there is always room for one */
121 n++;
122
123 if (n > (HASH_CBLOCK - 8)) {
124 memset (p + n, 0, HASH_CBLOCK - n);
125 n = 0;
126 HASH_BLOCK_DATA_ORDER (c, p, 1);
127 }
128 memset (p + n, 0, HASH_CBLOCK - 8 - n);
129
130 p += HASH_CBLOCK - 8;
131#if defined(DATA_ORDER_IS_BIG_ENDIAN)
132 HOST_l2c(c->Nh, p);
133 HOST_l2c(c->Nl, p);
134#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
135 HOST_l2c(c->Nl, p);
136 HOST_l2c(c->Nh, p);
137#endif
138 p -= HASH_CBLOCK;
139 HASH_BLOCK_DATA_ORDER (c, p, 1);
140 c->num = 0;
141 memset (p, 0, HASH_CBLOCK);
142
143#ifndef HASH_MAKE_STRING
144#error "HASH_MAKE_STRING must be defined!"
145#else
146 HASH_MAKE_STRING(c, md);
147#endif
148
149 return 1;
150}
151
152#define P0(X) (X ^ ROTATE(X, 9) ^ ROTATE(X, 17)) 56#define P0(X) (X ^ ROTATE(X, 9) ^ ROTATE(X, 17))
153#define P1(X) (X ^ ROTATE(X, 15) ^ ROTATE(X, 23)) 57#define P1(X) (X ^ ROTATE(X, 15) ^ ROTATE(X, 23))
154 58
@@ -188,25 +92,6 @@ int HASH_FINAL (unsigned char *md, HASH_CTX *c)
188#define SM3_G 0xe38dee4dUL 92#define SM3_G 0xe38dee4dUL
189#define SM3_H 0xb0fb0e4eUL 93#define SM3_H 0xb0fb0e4eUL
190 94
191LCRYPTO_ALIAS(SM3_Update);
192LCRYPTO_ALIAS(SM3_Final);
193
194int
195SM3_Init(SM3_CTX *c)
196{
197 memset(c, 0, sizeof(*c));
198 c->A = SM3_A;
199 c->B = SM3_B;
200 c->C = SM3_C;
201 c->D = SM3_D;
202 c->E = SM3_E;
203 c->F = SM3_F;
204 c->G = SM3_G;
205 c->H = SM3_H;
206 return 1;
207}
208LCRYPTO_ALIAS(SM3_Init);
209
210void 95void
211SM3_block_data_order(SM3_CTX *ctx, const void *p, size_t num) 96SM3_block_data_order(SM3_CTX *ctx, const void *p, size_t num)
212{ 97{
@@ -374,4 +259,118 @@ SM3_block_data_order(SM3_CTX *ctx, const void *p, size_t num)
374 } 259 }
375} 260}
376 261
262int
263SM3_Init(SM3_CTX *c)
264{
265 memset(c, 0, sizeof(*c));
266 c->A = SM3_A;
267 c->B = SM3_B;
268 c->C = SM3_C;
269 c->D = SM3_D;
270 c->E = SM3_E;
271 c->F = SM3_F;
272 c->G = SM3_G;
273 c->H = SM3_H;
274 return 1;
275}
276LCRYPTO_ALIAS(SM3_Init);
277
278int
279HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len)
280{
281 const unsigned char *data = data_;
282 unsigned char *p;
283 HASH_LONG l;
284 size_t n;
285
286 if (len == 0)
287 return 1;
288
289 l = (c->Nl + (((HASH_LONG)len) << 3))&0xffffffffUL;
290 /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
291 * Wei Dai <weidai@eskimo.com> for pointing it out. */
292 if (l < c->Nl) /* overflow */
293 c->Nh++;
294 c->Nh+=(HASH_LONG)(len>>29); /* might cause compiler warning on 16-bit */
295 c->Nl = l;
296
297 n = c->num;
298 if (n != 0) {
299 p = (unsigned char *)c->data;
300
301 if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) {
302 memcpy (p + n, data, HASH_CBLOCK - n);
303 HASH_BLOCK_DATA_ORDER (c, p, 1);
304 n = HASH_CBLOCK - n;
305 data += n;
306 len -= n;
307 c->num = 0;
308 memset (p,0,HASH_CBLOCK); /* keep it zeroed */
309 } else {
310 memcpy (p + n, data, len);
311 c->num += (unsigned int)len;
312 return 1;
313 }
314 }
315
316 n = len/HASH_CBLOCK;
317 if (n > 0) {
318 HASH_BLOCK_DATA_ORDER (c, data, n);
319 n *= HASH_CBLOCK;
320 data += n;
321 len -= n;
322 }
323
324 if (len != 0) {
325 p = (unsigned char *)c->data;
326 c->num = (unsigned int)len;
327 memcpy (p, data, len);
328 }
329 return 1;
330}
331LCRYPTO_ALIAS(SM3_Update);
332
333void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data)
334{
335 HASH_BLOCK_DATA_ORDER (c, data, 1);
336}
337
338int HASH_FINAL (unsigned char *md, HASH_CTX *c)
339{
340 unsigned char *p = (unsigned char *)c->data;
341 size_t n = c->num;
342
343 p[n] = 0x80; /* there is always room for one */
344 n++;
345
346 if (n > (HASH_CBLOCK - 8)) {
347 memset (p + n, 0, HASH_CBLOCK - n);
348 n = 0;
349 HASH_BLOCK_DATA_ORDER (c, p, 1);
350 }
351 memset (p + n, 0, HASH_CBLOCK - 8 - n);
352
353 p += HASH_CBLOCK - 8;
354#if defined(DATA_ORDER_IS_BIG_ENDIAN)
355 HOST_l2c(c->Nh, p);
356 HOST_l2c(c->Nl, p);
357#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
358 HOST_l2c(c->Nl, p);
359 HOST_l2c(c->Nh, p);
360#endif
361 p -= HASH_CBLOCK;
362 HASH_BLOCK_DATA_ORDER (c, p, 1);
363 c->num = 0;
364 memset (p, 0, HASH_CBLOCK);
365
366#ifndef HASH_MAKE_STRING
367#error "HASH_MAKE_STRING must be defined!"
368#else
369 HASH_MAKE_STRING(c, md);
370#endif
371
372 return 1;
373}
374LCRYPTO_ALIAS(SM3_Final);
375
377#endif /* !OPENSSL_NO_SM3 */ 376#endif /* !OPENSSL_NO_SM3 */