From 2cc99ee904419b6a839b9edb11833a633b5cd9dd Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Tue, 25 Jan 2000 23:01:58 +0000 Subject: [PATCH] move to the pseudo-standard APIs for md4,md5,sha git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7815 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/des/md4.c | 51 ++++++++++++++++++++--------------- lib/des/md4.h | 13 ++++----- lib/des/md5.c | 74 ++++++++++++++++++++------------------------------- lib/des/md5.h | 39 +++++---------------------- lib/des/sha.c | 51 ++++++++++++++++++++--------------- lib/des/sha.h | 15 ++++++----- 6 files changed, 110 insertions(+), 133 deletions(-) diff --git a/lib/des/md4.c b/lib/des/md4.c index 4bf583e4f..33cec0982 100644 --- a/lib/des/md4.c +++ b/lib/des/md4.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -47,10 +47,10 @@ RCSID("$Id$"); #define X data void -md4_init (struct md4 *m) +MD4Init (struct md4 *m) { - m->offset = 0; - m->sz = 0; + m->sz[0] = 0; + m->sz[1] = 0; D = 0x10325476; C = 0x98badcfe; B = 0xefcdab89; @@ -175,17 +175,23 @@ struct x32{ }; void -md4_update (struct md4 *m, const void *v, size_t len) +MD4Update (struct md4 *m, const void *v, size_t len) { const unsigned char *p = v; - m->sz += len; - while(len > 0){ - size_t l = min(len, 64 - m->offset); - memcpy(m->save + m->offset, p, l); - m->offset += l; + size_t old_sz = m->sz[0]; + size_t offset; + + m->sz[0] += len * 8; + if (m->sz[0] < old_sz) + ++m->sz[1]; + offset = (old_sz / 8) % 64; + while(len > 0) { + size_t l = min(len, 64 - offset); + memcpy(m->save + offset, p, l); + offset += l; p += l; len -= l; - if(m->offset == 64){ + if(offset == 64) { #if defined(WORDS_BIGENDIAN) int i; u_int32_t current[16]; @@ -198,26 +204,29 @@ md4_update (struct md4 *m, const void *v, size_t len) #else calc(m, (u_int32_t*)m->save); #endif - m->offset = 0; + offset = 0; } } } void -md4_finito (struct md4 *m, void *res) +MD4Final (void *res, struct md4 *m) { static unsigned char zeros[72]; - u_int32_t len; - unsigned int dstart = (120 - m->offset - 1) % 64 + 1; + unsigned offset = (m->sz[0] / 8) % 64; + unsigned int dstart = (120 - offset - 1) % 64 + 1; *zeros = 0x80; memset (zeros + 1, 0, sizeof(zeros) - 1); - len = 8 * m->sz; - zeros[dstart+0] = (len >> 0) & 0xff; - zeros[dstart+1] = (len >> 8) & 0xff; - zeros[dstart+2] = (len >> 16) & 0xff; - zeros[dstart+3] = (len >> 24) & 0xff; - md4_update (m, zeros, dstart + 8); + zeros[dstart+0] = (m->sz[0] >> 0) & 0xff; + zeros[dstart+1] = (m->sz[0] >> 8) & 0xff; + zeros[dstart+2] = (m->sz[0] >> 16) & 0xff; + zeros[dstart+3] = (m->sz[0] >> 24) & 0xff; + zeros[dstart+4] = (m->sz[1] >> 0) & 0xff; + zeros[dstart+5] = (m->sz[1] >> 8) & 0xff; + zeros[dstart+6] = (m->sz[1] >> 16) & 0xff; + zeros[dstart+7] = (m->sz[1] >> 24) & 0xff; + MD4Update (m, zeros, dstart + 8); { int i; unsigned char *r = (unsigned char *)res; diff --git a/lib/des/md4.h b/lib/des/md4.h index d03477f95..3b7749309 100644 --- a/lib/des/md4.h +++ b/lib/des/md4.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -47,12 +47,13 @@ #endif struct md4 { - unsigned int offset; - unsigned int sz; + unsigned int sz[2]; u_int32_t counter[4]; unsigned char save[64]; }; -void md4_init (struct md4 *m); -void md4_update (struct md4 *m, const void *p, size_t len); -void md4_finito (struct md4 *m, void *res); +typedef struct md4 MD4_CTX; + +void MD4Init (struct md4 *m); +void MD4Update (struct md4 *m, const void *p, size_t len); +void MD4Final (void *res, struct md4 *m); diff --git a/lib/des/md5.c b/lib/des/md5.c index 8831ea1f7..efdf29342 100644 --- a/lib/des/md5.c +++ b/lib/des/md5.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -47,10 +47,10 @@ RCSID("$Id$"); #define X data void -md5_init (struct md5 *m) +MD5Init (struct md5 *m) { - m->offset = 0; - m->sz = 0; + m->sz[0] = 0; + m->sz[1] = 0; D = 0x10325476; C = 0x98badcfe; B = 0xefcdab89; @@ -199,17 +199,23 @@ struct x32{ }; void -md5_update (struct md5 *m, const void *v, size_t len) +MD5Update (struct md5 *m, const void *v, size_t len) { const unsigned char *p = v; - m->sz += len; + size_t old_sz = m->sz[0]; + size_t offset; + + m->sz[0] += len * 8; + if (m->sz[0] < old_sz) + ++m->sz[1]; + offset = (old_sz / 8) % 64; while(len > 0){ - size_t l = min(len, 64 - m->offset); - memcpy(m->save + m->offset, p, l); - m->offset += l; + size_t l = min(len, 64 - offset); + memcpy(m->save + offset, p, l); + offset += l; p += l; len -= l; - if(m->offset == 64){ + if(offset == 64){ #if defined(WORDS_BIGENDIAN) int i; u_int32_t current[16]; @@ -222,26 +228,29 @@ md5_update (struct md5 *m, const void *v, size_t len) #else calc(m, (u_int32_t*)m->save); #endif - m->offset = 0; + offset = 0; } } } void -md5_finito (struct md5 *m, void *res) +MD5Final (void *res, struct md5 *m) { static unsigned char zeros[72]; - u_int32_t len; - unsigned int dstart = (120 - m->offset - 1) % 64 + 1; + unsigned offset = (m->sz[0] / 8) % 64; + unsigned int dstart = (120 - offset - 1) % 64 + 1; *zeros = 0x80; memset (zeros + 1, 0, sizeof(zeros) - 1); - len = 8 * m->sz; - zeros[dstart+0] = (len >> 0) & 0xff; - zeros[dstart+1] = (len >> 8) & 0xff; - zeros[dstart+2] = (len >> 16) & 0xff; - zeros[dstart+3] = (len >> 24) & 0xff; - md5_update (m, zeros, dstart + 8); + zeros[dstart+0] = (m->sz[0] >> 0) & 0xff; + zeros[dstart+1] = (m->sz[0] >> 8) & 0xff; + zeros[dstart+2] = (m->sz[0] >> 16) & 0xff; + zeros[dstart+3] = (m->sz[0] >> 24) & 0xff; + zeros[dstart+4] = (m->sz[1] >> 0) & 0xff; + zeros[dstart+5] = (m->sz[1] >> 8) & 0xff; + zeros[dstart+6] = (m->sz[1] >> 16) & 0xff; + zeros[dstart+7] = (m->sz[1] >> 24) & 0xff; + MD5Update (m, zeros, dstart + 8); { int i; unsigned char *r = (unsigned char *)res; @@ -263,28 +272,3 @@ md5_finito (struct md5 *m, void *res) } #endif } - -/* - * This is only for linkage compatibility! - */ -#undef MD5Init -#undef MD5Update -#undef MD5Final - -void -MD5Init (MD5_CTX *mdContext) -{ - md5_init(&mdContext->m.d5); -} - -void -MD5Update (MD5_CTX *mdContext, const unsigned char *inBuf, unsigned int inLen) -{ - md5_update(&mdContext->m.d5, (const unsigned char *)inBuf, inLen); -} - -void -MD5Final (unsigned char digest[16], MD5_CTX *mdContext) -{ - md5_finito(&mdContext->m.d5, digest); -} diff --git a/lib/des/md5.h b/lib/des/md5.h index 513bd40e0..6d12cefeb 100644 --- a/lib/des/md5.h +++ b/lib/des/md5.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -47,40 +47,13 @@ #endif struct md5 { - unsigned int offset; - unsigned int sz; + unsigned int sz[2]; u_int32_t counter[4]; unsigned char save[64]; }; -void md5_init (struct md5 *m); -void md5_update (struct md5 *m, const void *p, size_t len); -void md5_finito (struct md5 *m, void *res); /* u_int32_t res[4] */ +typedef struct md5 MD5_CTX; -/* - * Functions for compatibility that have never been tested. - */ -typedef struct { - u_int32_t i[2]; /* number of _bits_ handled mod 2^64 */ - u_int32_t buf[4]; /* scratch buffer */ - unsigned char in[64]; /* input buffer */ -} MD5_CTX_PREAMBLE; - -typedef struct { - union { - MD5_CTX_PREAMBLE preamble_; - struct md5 d5; - } m; -} MD5_CTX; - -void MD5Init (MD5_CTX *mdContext); -void MD5Update (MD5_CTX *mdContext, - const unsigned char *inBuf, - unsigned int inLen); -void MD5Final (unsigned char digest[16], MD5_CTX *mdContext); - -#ifndef NO_MD5_MACROS -#define MD5Init(mdContext) md5_init(&(mdContext)->m.d5) -#define MD5Update(mdCtx, inBuf, inLen) md5_update(&(mdCtx)->m.d5, inBuf, inLen) -#define MD5Final(digest, mdCtx) md5_finito(&(mdCtx)->m.d5, (digest)) -#endif +void MD5Init (struct md5 *m); +void MD5Update (struct md5 *m, const void *p, size_t len); +void MD5Final (void *res, struct md5 *m); /* u_int32_t res[4] */ diff --git a/lib/des/sha.c b/lib/des/sha.c index ea3d151b7..8a5af8a8f 100644 --- a/lib/des/sha.c +++ b/lib/des/sha.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -48,10 +48,10 @@ RCSID("$Id$"); #define X data void -sha_init (struct sha *m) +SHA1Init (struct sha1 *m) { - m->offset = 0; - m->sz = 0; + m->sz[0] = 0; + m->sz[1] = 0; A = 0x67452301; B = 0xefcdab89; C = 0x98badcfe; @@ -83,7 +83,7 @@ do { \ } while(0) static inline void -calc (struct sha *m, u_int32_t *in) +calc (struct sha1 *m, u_int32_t *in) { u_int32_t AA, BB, CC, DD, EE; u_int32_t data[80]; @@ -225,17 +225,23 @@ struct x32{ }; void -sha_update (struct sha *m, const void *v, size_t len) +SHA1Update (struct sha1 *m, const void *v, size_t len) { const unsigned char *p = v; - m->sz += len; + size_t old_sz = m->sz[0]; + size_t offset; + + m->sz[0] += len * 8; + if (m->sz[0] < old_sz) + ++m->sz[1]; + offset = (old_sz / 8) % 64; while(len > 0){ - size_t l = min(len, 64 - m->offset); - memcpy(m->save + m->offset, p, l); - m->offset += l; + size_t l = min(len, 64 - offset); + memcpy(m->save + offset, p, l); + offset += l; p += l; len -= l; - if(m->offset == 64){ + if(offset == 64){ #if !defined(WORDS_BIGENDIAN) || defined(_CRAY) int i; u_int32_t current[16]; @@ -248,26 +254,29 @@ sha_update (struct sha *m, const void *v, size_t len) #else calc(m, (u_int32_t*)m->save); #endif - m->offset = 0; + offset = 0; } } } void -sha_finito (struct sha *m, void *res) +SHA1Final (void *res, struct sha1 *m) { static unsigned char zeros[72]; - u_int32_t len; - unsigned int dstart = (120 - m->offset - 1) % 64 + 1; + unsigned offset = (m->sz[0] / 8) % 64; + unsigned int dstart = (120 - offset - 1) % 64 + 1; *zeros = 0x80; memset (zeros + 1, 0, sizeof(zeros) - 1); - len = 8 * m->sz; - zeros[dstart+7] = (len >> 0) & 0xff; - zeros[dstart+6] = (len >> 8) & 0xff; - zeros[dstart+5] = (len >> 16) & 0xff; - zeros[dstart+4] = (len >> 24) & 0xff; - sha_update (m, zeros, dstart + 8); + zeros[dstart+7] = (m->sz[0] >> 0) & 0xff; + zeros[dstart+6] = (m->sz[0] >> 8) & 0xff; + zeros[dstart+5] = (m->sz[0] >> 16) & 0xff; + zeros[dstart+4] = (m->sz[0] >> 24) & 0xff; + zeros[dstart+3] = (m->sz[1] >> 0) & 0xff; + zeros[dstart+2] = (m->sz[1] >> 8) & 0xff; + zeros[dstart+1] = (m->sz[1] >> 16) & 0xff; + zeros[dstart+0] = (m->sz[1] >> 24) & 0xff; + SHA1Update (m, zeros, dstart + 8); { int i; unsigned char *r = (unsigned char*)res; diff --git a/lib/des/sha.h b/lib/des/sha.h index 692d28503..ff62c7ab9 100644 --- a/lib/des/sha.h +++ b/lib/des/sha.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -46,13 +46,14 @@ #include #endif -struct sha { - unsigned int offset; - unsigned int sz; +struct sha1 { + unsigned int sz[2]; u_int32_t counter[5]; unsigned char save[64]; }; -void sha_init (struct sha *m); -void sha_update (struct sha *m, const void *v, size_t len); -void sha_finito (struct sha *m, void *res); +typedef struct sha1 SHA1_CTX; + +void SHA1Init (struct sha1 *m); +void SHA1Update (struct sha1 *m, const void *v, size_t len); +void SHA1Final (void *res, struct sha1 *m);