summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2024-03-26 06:40:29 +0000
committerjsing <>2024-03-26 06:40:29 +0000
commitca877924b2e990690d4c771062a6fb0d95544bb9 (patch)
treeacfcd5e1d6f79e559119cd7439cdb64cbc6256ac /src/lib
parent6bc01c976544e30dd0109f9b3f569c2e5160252c (diff)
downloadopenbsd-ca877924b2e990690d4c771062a6fb0d95544bb9.tar.gz
openbsd-ca877924b2e990690d4c771062a6fb0d95544bb9.tar.bz2
openbsd-ca877924b2e990690d4c771062a6fb0d95544bb9.zip
Inline hash functions from md32_common.h.
No change to generated assembly.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/md4/md4.c103
1 files changed, 102 insertions, 1 deletions
diff --git a/src/lib/libcrypto/md4/md4.c b/src/lib/libcrypto/md4/md4.c
index 9bb0df21a7..fa40f5bdef 100644
--- a/src/lib/libcrypto/md4/md4.c
+++ b/src/lib/libcrypto/md4/md4.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: md4.c,v 1.8 2024/03/26 06:23:07 jsing Exp $ */ 1/* $OpenBSD: md4.c,v 1.9 2024/03/26 06:40:29 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 *
@@ -86,7 +86,108 @@ __END_HIDDEN_DECLS
86 } while (0) 86 } while (0)
87#define HASH_BLOCK_DATA_ORDER md4_block_data_order 87#define HASH_BLOCK_DATA_ORDER md4_block_data_order
88 88
89#define HASH_NO_UPDATE
90#define HASH_NO_TRANSFORM
91#define HASH_NO_FINAL
92
89#include "md32_common.h" 93#include "md32_common.h"
94
95int
96HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len)
97{
98 const unsigned char *data = data_;
99 unsigned char *p;
100 HASH_LONG l;
101 size_t n;
102
103 if (len == 0)
104 return 1;
105
106 l = (c->Nl + (((HASH_LONG)len) << 3))&0xffffffffUL;
107 /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
108 * Wei Dai <weidai@eskimo.com> for pointing it out. */
109 if (l < c->Nl) /* overflow */
110 c->Nh++;
111 c->Nh+=(HASH_LONG)(len>>29); /* might cause compiler warning on 16-bit */
112 c->Nl = l;
113
114 n = c->num;
115 if (n != 0) {
116 p = (unsigned char *)c->data;
117
118 if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) {
119 memcpy (p + n, data, HASH_CBLOCK - n);
120 HASH_BLOCK_DATA_ORDER (c, p, 1);
121 n = HASH_CBLOCK - n;
122 data += n;
123 len -= n;
124 c->num = 0;
125 memset (p,0,HASH_CBLOCK); /* keep it zeroed */
126 } else {
127 memcpy (p + n, data, len);
128 c->num += (unsigned int)len;
129 return 1;
130 }
131 }
132
133 n = len/HASH_CBLOCK;
134 if (n > 0) {
135 HASH_BLOCK_DATA_ORDER (c, data, n);
136 n *= HASH_CBLOCK;
137 data += n;
138 len -= n;
139 }
140
141 if (len != 0) {
142 p = (unsigned char *)c->data;
143 c->num = (unsigned int)len;
144 memcpy (p, data, len);
145 }
146 return 1;
147}
148
149void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data)
150{
151 HASH_BLOCK_DATA_ORDER (c, data, 1);
152}
153
154int HASH_FINAL (unsigned char *md, HASH_CTX *c)
155{
156 unsigned char *p = (unsigned char *)c->data;
157 size_t n = c->num;
158
159 p[n] = 0x80; /* there is always room for one */
160 n++;
161
162 if (n > (HASH_CBLOCK - 8)) {
163 memset (p + n, 0, HASH_CBLOCK - n);
164 n = 0;
165 HASH_BLOCK_DATA_ORDER (c, p, 1);
166 }
167 memset (p + n, 0, HASH_CBLOCK - 8 - n);
168
169 p += HASH_CBLOCK - 8;
170#if defined(DATA_ORDER_IS_BIG_ENDIAN)
171 HOST_l2c(c->Nh, p);
172 HOST_l2c(c->Nl, p);
173#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
174 HOST_l2c(c->Nl, p);
175 HOST_l2c(c->Nh, p);
176#endif
177 p -= HASH_CBLOCK;
178 HASH_BLOCK_DATA_ORDER (c, p, 1);
179 c->num = 0;
180 memset (p, 0, HASH_CBLOCK);
181
182#ifndef HASH_MAKE_STRING
183#error "HASH_MAKE_STRING must be defined!"
184#else
185 HASH_MAKE_STRING(c, md);
186#endif
187
188 return 1;
189}
190
90LCRYPTO_ALIAS(MD4_Update); 191LCRYPTO_ALIAS(MD4_Update);
91LCRYPTO_ALIAS(MD4_Final); 192LCRYPTO_ALIAS(MD4_Final);
92LCRYPTO_ALIAS(MD4_Transform); 193LCRYPTO_ALIAS(MD4_Transform);