From: jsing Date: Fri, 7 Jul 2023 15:09:45 +0000 (+0000) Subject: Implement SHA1_{Update,Transform,Final}() directly in sha1.c. X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=cbefc5ebed268192d608617f124cfec4c70cb4f3;p=openbsd 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. --- diff --git a/lib/libcrypto/sha/sha1.c b/lib/libcrypto/sha/sha1.c index 25c87e9bc36..67eb2a8b57c 100644 --- a/lib/libcrypto/sha/sha1.c +++ b/lib/libcrypto/sha/sha1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sha1.c,v 1.5 2023/04/11 10:39:50 jsing Exp $ */ +/* $OpenBSD: sha1.c,v 1.6 2023/07/07 15:09:45 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -71,6 +71,7 @@ #define HASH_LONG SHA_LONG #define HASH_CTX SHA_CTX #define HASH_CBLOCK SHA_CBLOCK + #define HASH_MAKE_STRING(c, s) do { \ unsigned long ll; \ ll=(c)->h0; HOST_l2c(ll,(s)); \ @@ -80,10 +81,6 @@ ll=(c)->h4; HOST_l2c(ll,(s)); \ } while (0) -#define HASH_UPDATE SHA1_Update -#define HASH_TRANSFORM SHA1_Transform -#define HASH_FINAL SHA1_Final -#define HASH_INIT SHA1_Init #define HASH_BLOCK_DATA_ORDER sha1_block_data_order #define Xupdate(a, ix, ia, ib, ic, id) ( (a)=(ia^ib^ic^id), \ ix=(a)=ROTATE((a),1) \ @@ -94,8 +91,110 @@ static #endif void sha1_block_data_order(SHA_CTX *c, const void *p, size_t num); +#define HASH_NO_UPDATE +#define HASH_NO_TRANSFORM +#define HASH_NO_FINAL + #include "md32_common.h" +int +SHA1_Update(SHA_CTX *c, const void *data_, size_t len) +{ + const unsigned char *data = data_; + unsigned char *p; + SHA_LONG l; + size_t n; + + if (len == 0) + return 1; + + l = (c->Nl + (((SHA_LONG)len) << 3))&0xffffffffUL; + /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to + * Wei Dai for pointing it out. */ + if (l < c->Nl) /* overflow */ + c->Nh++; + c->Nh+=(SHA_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 >= SHA_CBLOCK || len + n >= SHA_CBLOCK) { + memcpy(p + n, data, SHA_CBLOCK - n); + sha1_block_data_order(c, p, 1); + n = SHA_CBLOCK - n; + data += n; + len -= n; + c->num = 0; + memset(p,0,SHA_CBLOCK); /* keep it zeroed */ + } else { + memcpy(p + n, data, len); + c->num += (unsigned int)len; + return 1; + } + } + + n = len/SHA_CBLOCK; + if (n > 0) { + sha1_block_data_order(c, data, n); + n *= SHA_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 +SHA1_Transform(SHA_CTX *c, const unsigned char *data) +{ + sha1_block_data_order(c, data, 1); +} + +int +SHA1_Final(unsigned char *md, SHA_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 > (SHA_CBLOCK - 8)) { + memset(p + n, 0, SHA_CBLOCK - n); + n = 0; + sha1_block_data_order(c, p, 1); + } + memset(p + n, 0, SHA_CBLOCK - 8 - n); + + p += SHA_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 -= SHA_CBLOCK; + sha1_block_data_order(c, p, 1); + c->num = 0; + memset(p, 0, SHA_CBLOCK); + +#ifndef HASH_MAKE_STRING +#error "HASH_MAKE_STRING must be defined!" +#else + HASH_MAKE_STRING(c, md); +#endif + + return 1; +} + int SHA1_Init(SHA_CTX *c) {