diff options
author | Joel Sing <jsing@cvs.openbsd.org> | 2023-08-10 13:54:22 +0000 |
---|---|---|
committer | Joel Sing <jsing@cvs.openbsd.org> | 2023-08-10 13:54:22 +0000 |
commit | eec80de0f1e9f478a6257c4a4aec725c012c7b57 (patch) | |
tree | 4be27c8ce818de76d4eb75710f6fa5166225eaca /lib/libcrypto/md5 | |
parent | 007b263e73941f53b208ffc6f31e59fb1eaef48a (diff) |
Implement MD5_{Update,Transform,Final}() directly in md5.c.
Copy the update, transform and final functions from md32_common.h, manually
expanding the macros for MD5. This will allow for further clean up to
occur.
No change in generated assembly.
Diffstat (limited to 'lib/libcrypto/md5')
-rw-r--r-- | lib/libcrypto/md5/md5.c | 104 |
1 files changed, 103 insertions, 1 deletions
diff --git a/lib/libcrypto/md5/md5.c b/lib/libcrypto/md5/md5.c index 7f6535506c3..5169627c02e 100644 --- a/lib/libcrypto/md5/md5.c +++ b/lib/libcrypto/md5/md5.c @@ -1,4 +1,4 @@ -/* $OpenBSD: md5.c,v 1.8 2023/08/10 13:41:18 jsing Exp $ */ +/* $OpenBSD: md5.c,v 1.9 2023/08/10 13:54:21 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -96,7 +96,109 @@ __END_HIDDEN_DECLS } while (0) #define HASH_BLOCK_DATA_ORDER md5_block_data_order +#define HASH_NO_UPDATE +#define HASH_NO_TRANSFORM +#define HASH_NO_FINAL + #include "md32_common.h" + +int +MD5_Update(MD5_CTX *c, const void *data_, size_t len) +{ + const unsigned char *data = data_; + unsigned char *p; + MD5_LONG l; + size_t n; + + if (len == 0) + return 1; + + l = (c->Nl + (((MD5_LONG)len) << 3))&0xffffffffUL; + /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to + * Wei Dai <weidai@eskimo.com> for pointing it out. */ + if (l < c->Nl) /* overflow */ + c->Nh++; + c->Nh+=(MD5_LONG)(len>>29); /* might cause compiler warning on 16-bit */ + c->Nl = l; + + n = c->num; + if (n != 0) { + p = (unsigned char *)c->data; + + if (len >= MD5_CBLOCK || len + n >= MD5_CBLOCK) { + memcpy(p + n, data, MD5_CBLOCK - n); + md5_block_data_order(c, p, 1); + n = MD5_CBLOCK - n; + data += n; + len -= n; + c->num = 0; + memset(p, 0, MD5_CBLOCK); /* keep it zeroed */ + } else { + memcpy(p + n, data, len); + c->num += (unsigned int)len; + return 1; + } + } + + n = len/MD5_CBLOCK; + if (n > 0) { + md5_block_data_order (c, data, n); + n *= MD5_CBLOCK; + data += n; + len -= n; + } + + if (len != 0) { + p = (unsigned char *)c->data; + c->num = (unsigned int)len; + memcpy (p, data, len); + } + return 1; +} + +void +MD5_Transform(MD5_CTX *c, const unsigned char *data) +{ + md5_block_data_order(c, data, 1); +} + +int +MD5_Final(unsigned char *md, MD5_CTX *c) +{ + unsigned char *p = (unsigned char *)c->data; + size_t n = c->num; + + p[n] = 0x80; /* there is always room for one */ + n++; + + if (n > (MD5_CBLOCK - 8)) { + memset(p + n, 0, MD5_CBLOCK - n); + n = 0; + md5_block_data_order(c, p, 1); + } + memset(p + n, 0, MD5_CBLOCK - 8 - n); + + p += MD5_CBLOCK - 8; +#if defined(DATA_ORDER_IS_BIG_ENDIAN) + HOST_l2c(c->Nh, p); + HOST_l2c(c->Nl, p); +#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) + HOST_l2c(c->Nl, p); + HOST_l2c(c->Nh, p); +#endif + p -= MD5_CBLOCK; + md5_block_data_order(c, p, 1); + c->num = 0; + memset(p, 0, MD5_CBLOCK); + +#ifndef HASH_MAKE_STRING +#error "HASH_MAKE_STRING must be defined!" +#else + HASH_MAKE_STRING(c, md); +#endif + + return 1; +} LCRYPTO_ALIAS(MD5_Update); LCRYPTO_ALIAS(MD5_Transform); LCRYPTO_ALIAS(MD5_Final); |