summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2024-03-28 08:01:01 +0000
committerjsing <>2024-03-28 08:01:01 +0000
commitf0a0106e518cbe00fa1420a9dbae4269ff01fffa (patch)
treebef6cd6c4ca72cf58e5eaaf837173e56d5548606
parent891b03fdc7c654ebced58052ea3edfc8cccdd353 (diff)
downloadopenbsd-f0a0106e518cbe00fa1420a9dbae4269ff01fffa.tar.gz
openbsd-f0a0106e518cbe00fa1420a9dbae4269ff01fffa.tar.bz2
openbsd-f0a0106e518cbe00fa1420a9dbae4269ff01fffa.zip
Inline functions from md32_common.h.
No change in generated assembly.
-rw-r--r--src/lib/libcrypto/sm3/sm3.c102
1 files changed, 101 insertions, 1 deletions
diff --git a/src/lib/libcrypto/sm3/sm3.c b/src/lib/libcrypto/sm3/sm3.c
index 80be935f74..04fc9f29f2 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.6 2023/07/08 06:36:55 jsing Exp $ */ 1/* $OpenBSD: sm3.c,v 1.7 2024/03/28 08:01:01 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, Ribose Inc 3 * Copyright (c) 2018, Ribose Inc
4 * 4 *
@@ -47,8 +47,108 @@
47void SM3_block_data_order(SM3_CTX *c, const void *p, size_t num); 47void SM3_block_data_order(SM3_CTX *c, const void *p, size_t num);
48void SM3_transform(SM3_CTX *c, const unsigned char *data); 48void SM3_transform(SM3_CTX *c, const unsigned char *data);
49 49
50#define HASH_NO_UPDATE
51#define HASH_NO_TRANSFORM
52#define HASH_NO_FINAL
53
50#include "md32_common.h" 54#include "md32_common.h"
51 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
52#define P0(X) (X ^ ROTATE(X, 9) ^ ROTATE(X, 17)) 152#define P0(X) (X ^ ROTATE(X, 9) ^ ROTATE(X, 17))
53#define P1(X) (X ^ ROTATE(X, 15) ^ ROTATE(X, 23)) 153#define P1(X) (X ^ ROTATE(X, 15) ^ ROTATE(X, 23))
54 154