mirror of
https://github.com/openbsd/src.git
synced 2024-12-21 23:18:00 -08:00
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.
This commit is contained in:
parent
b039d94945
commit
cbefc5ebed
@ -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 <weidai@eskimo.com> 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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user