summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2023-07-07 15:09:45 +0000
committerjsing <>2023-07-07 15:09:45 +0000
commitc35b0467e312b8a1b5e4fc8d8340d2652dae3820 (patch)
treec245c2a9327f9ea7771b9899167203c43e2fa652 /src
parent8f94354b3d028c101be3492aee5742c619a27d12 (diff)
downloadopenbsd-c35b0467e312b8a1b5e4fc8d8340d2652dae3820.tar.gz
openbsd-c35b0467e312b8a1b5e4fc8d8340d2652dae3820.tar.bz2
openbsd-c35b0467e312b8a1b5e4fc8d8340d2652dae3820.zip
Implement SHA1_{Update,Transform,Final}() directly in sha1.c.
Copy the update, transform and final functions from md32_common.h, manually expanding the macros for SHA1. This will allow for further clean up to occur. No change in generated assembly.
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/sha/sha1.c109
1 files changed, 104 insertions, 5 deletions
diff --git a/src/lib/libcrypto/sha/sha1.c b/src/lib/libcrypto/sha/sha1.c
index 25c87e9bc3..67eb2a8b57 100644
--- a/src/lib/libcrypto/sha/sha1.c
+++ b/src/lib/libcrypto/sha/sha1.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: sha1.c,v 1.5 2023/04/11 10:39:50 jsing Exp $ */ 1/* $OpenBSD: sha1.c,v 1.6 2023/07/07 15:09:45 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -71,6 +71,7 @@
71#define HASH_LONG SHA_LONG 71#define HASH_LONG SHA_LONG
72#define HASH_CTX SHA_CTX 72#define HASH_CTX SHA_CTX
73#define HASH_CBLOCK SHA_CBLOCK 73#define HASH_CBLOCK SHA_CBLOCK
74
74#define HASH_MAKE_STRING(c, s) do { \ 75#define HASH_MAKE_STRING(c, s) do { \
75 unsigned long ll; \ 76 unsigned long ll; \
76 ll=(c)->h0; HOST_l2c(ll,(s)); \ 77 ll=(c)->h0; HOST_l2c(ll,(s)); \
@@ -80,10 +81,6 @@
80 ll=(c)->h4; HOST_l2c(ll,(s)); \ 81 ll=(c)->h4; HOST_l2c(ll,(s)); \
81 } while (0) 82 } while (0)
82 83
83#define HASH_UPDATE SHA1_Update
84#define HASH_TRANSFORM SHA1_Transform
85#define HASH_FINAL SHA1_Final
86#define HASH_INIT SHA1_Init
87#define HASH_BLOCK_DATA_ORDER sha1_block_data_order 84#define HASH_BLOCK_DATA_ORDER sha1_block_data_order
88#define Xupdate(a, ix, ia, ib, ic, id) ( (a)=(ia^ib^ic^id), \ 85#define Xupdate(a, ix, ia, ib, ic, id) ( (a)=(ia^ib^ic^id), \
89 ix=(a)=ROTATE((a),1) \ 86 ix=(a)=ROTATE((a),1) \
@@ -94,9 +91,111 @@ static
94#endif 91#endif
95void sha1_block_data_order(SHA_CTX *c, const void *p, size_t num); 92void sha1_block_data_order(SHA_CTX *c, const void *p, size_t num);
96 93
94#define HASH_NO_UPDATE
95#define HASH_NO_TRANSFORM
96#define HASH_NO_FINAL
97
97#include "md32_common.h" 98#include "md32_common.h"
98 99
99int 100int
101SHA1_Update(SHA_CTX *c, const void *data_, size_t len)
102{
103 const unsigned char *data = data_;
104 unsigned char *p;
105 SHA_LONG l;
106 size_t n;
107
108 if (len == 0)
109 return 1;
110
111 l = (c->Nl + (((SHA_LONG)len) << 3))&0xffffffffUL;
112 /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
113 * Wei Dai <weidai@eskimo.com> for pointing it out. */
114 if (l < c->Nl) /* overflow */
115 c->Nh++;
116 c->Nh+=(SHA_LONG)(len>>29); /* might cause compiler warning on 16-bit */
117 c->Nl = l;
118
119 n = c->num;
120 if (n != 0) {
121 p = (unsigned char *)c->data;
122
123 if (len >= SHA_CBLOCK || len + n >= SHA_CBLOCK) {
124 memcpy(p + n, data, SHA_CBLOCK - n);
125 sha1_block_data_order(c, p, 1);
126 n = SHA_CBLOCK - n;
127 data += n;
128 len -= n;
129 c->num = 0;
130 memset(p,0,SHA_CBLOCK); /* keep it zeroed */
131 } else {
132 memcpy(p + n, data, len);
133 c->num += (unsigned int)len;
134 return 1;
135 }
136 }
137
138 n = len/SHA_CBLOCK;
139 if (n > 0) {
140 sha1_block_data_order(c, data, n);
141 n *= SHA_CBLOCK;
142 data += n;
143 len -= n;
144 }
145
146 if (len != 0) {
147 p = (unsigned char *)c->data;
148 c->num = (unsigned int)len;
149 memcpy(p, data, len);
150 }
151 return 1;
152}
153
154void
155SHA1_Transform(SHA_CTX *c, const unsigned char *data)
156{
157 sha1_block_data_order(c, data, 1);
158}
159
160int
161SHA1_Final(unsigned char *md, SHA_CTX *c)
162{
163 unsigned char *p = (unsigned char *)c->data;
164 size_t n = c->num;
165
166 p[n] = 0x80; /* there is always room for one */
167 n++;
168
169 if (n > (SHA_CBLOCK - 8)) {
170 memset(p + n, 0, SHA_CBLOCK - n);
171 n = 0;
172 sha1_block_data_order(c, p, 1);
173 }
174 memset(p + n, 0, SHA_CBLOCK - 8 - n);
175
176 p += SHA_CBLOCK - 8;
177#if defined(DATA_ORDER_IS_BIG_ENDIAN)
178 HOST_l2c(c->Nh, p);
179 HOST_l2c(c->Nl, p);
180#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
181 HOST_l2c(c->Nl, p);
182 HOST_l2c(c->Nh, p);
183#endif
184 p -= SHA_CBLOCK;
185 sha1_block_data_order(c, p, 1);
186 c->num = 0;
187 memset(p, 0, SHA_CBLOCK);
188
189#ifndef HASH_MAKE_STRING
190#error "HASH_MAKE_STRING must be defined!"
191#else
192 HASH_MAKE_STRING(c, md);
193#endif
194
195 return 1;
196}
197
198int
100SHA1_Init(SHA_CTX *c) 199SHA1_Init(SHA_CTX *c)
101{ 200{
102 memset(c, 0, sizeof(*c)); 201 memset(c, 0, sizeof(*c));