@ -1,4 +1,4 @@
/* $OpenBSD: md5.c,v 1.1 2004/04/28 16:46:03 millert Exp $ */
/* $OpenBSD: md5.c,v 1.2 2004/04/28 16:52:08 millert Exp $ */
/*
* This code implements the MD5 message - digest algorithm .
@ -18,7 +18,7 @@
*/
# if defined(LIBC_SCCS) && !defined(lint)
static const char rcsid [ ] = " $OpenBSD: md5.c,v 1.1 2004/04/28 16:46:03 millert Exp $ " ;
static const char rcsid [ ] = " $OpenBSD: md5.c,v 1.2 2004/04/28 16:52:08 millert Exp $ " ;
# endif /* LIBC_SCCS and not lint */
# include <sys/types.h>
@ -26,20 +26,56 @@ static const char rcsid[] = "$OpenBSD: md5.c,v 1.1 2004/04/28 16:46:03 millert E
# include <md5.h>
# if BYTE_ORDER == LITTLE_ENDIAN
# define htole32n(buf, n) /* Nothing */
# define htole32_4(buf) /* Nothing */
# define htole32_14(buf) /* Nothing */
# define htole32_16(buf) /* Nothing */
# else
/*
* Note : this code is harmless on little - endian machines .
* XXX - unroll calls to htole32n - > htole32 ?
*/
void
htole32n ( u_int32_t * buf , size_t n )
{
while ( n - - ) {
* buf = htole32 ( * buf ) ;
buf + + ;
}
}
# define htole32_4(buf) do { \
( buf ) [ 0 ] = htole32 ( ( buf ) [ 0 ] ) ; \
( buf ) [ 1 ] = htole32 ( ( buf ) [ 1 ] ) ; \
( buf ) [ 2 ] = htole32 ( ( buf ) [ 2 ] ) ; \
( buf ) [ 3 ] = htole32 ( ( buf ) [ 3 ] ) ; \
} while ( 0 )
# define htole32_14(buf) do { \
( buf ) [ 0 ] = htole32 ( ( buf ) [ 0 ] ) ; \
( buf ) [ 1 ] = htole32 ( ( buf ) [ 1 ] ) ; \
( buf ) [ 2 ] = htole32 ( ( buf ) [ 2 ] ) ; \
( buf ) [ 3 ] = htole32 ( ( buf ) [ 3 ] ) ; \
( buf ) [ 4 ] = htole32 ( ( buf ) [ 4 ] ) ; \
( buf ) [ 5 ] = htole32 ( ( buf ) [ 5 ] ) ; \
( buf ) [ 6 ] = htole32 ( ( buf ) [ 6 ] ) ; \
( buf ) [ 7 ] = htole32 ( ( buf ) [ 7 ] ) ; \
( buf ) [ 8 ] = htole32 ( ( buf ) [ 8 ] ) ; \
( buf ) [ 9 ] = htole32 ( ( buf ) [ 9 ] ) ; \
( buf ) [ 10 ] = htole32 ( ( buf ) [ 10 ] ) ; \
( buf ) [ 11 ] = htole32 ( ( buf ) [ 11 ] ) ; \
( buf ) [ 12 ] = htole32 ( ( buf ) [ 12 ] ) ; \
( buf ) [ 13 ] = htole32 ( ( buf ) [ 13 ] ) ; \
} while ( 0 )
# define htole32_16(buf) do { \
( buf ) [ 0 ] = htole32 ( ( buf ) [ 0 ] ) ; \
( buf ) [ 1 ] = htole32 ( ( buf ) [ 1 ] ) ; \
( buf ) [ 2 ] = htole32 ( ( buf ) [ 2 ] ) ; \
( buf ) [ 3 ] = htole32 ( ( buf ) [ 3 ] ) ; \
( buf ) [ 4 ] = htole32 ( ( buf ) [ 4 ] ) ; \
( buf ) [ 5 ] = htole32 ( ( buf ) [ 5 ] ) ; \
( buf ) [ 6 ] = htole32 ( ( buf ) [ 6 ] ) ; \
( buf ) [ 7 ] = htole32 ( ( buf ) [ 7 ] ) ; \
( buf ) [ 8 ] = htole32 ( ( buf ) [ 8 ] ) ; \
( buf ) [ 9 ] = htole32 ( ( buf ) [ 9 ] ) ; \
( buf ) [ 10 ] = htole32 ( ( buf ) [ 10 ] ) ; \
( buf ) [ 11 ] = htole32 ( ( buf ) [ 11 ] ) ; \
( buf ) [ 12 ] = htole32 ( ( buf ) [ 12 ] ) ; \
( buf ) [ 13 ] = htole32 ( ( buf ) [ 13 ] ) ; \
( buf ) [ 14 ] = htole32 ( ( buf ) [ 14 ] ) ; \
( buf ) [ 15 ] = htole32 ( ( buf ) [ 15 ] ) ; \
} while ( 0 )
# endif
/*
@ -49,13 +85,11 @@ htole32n(u_int32_t *buf, size_t n)
void
MD5Init ( MD5_CTX * ctx )
{
ctx - > buf [ 0 ] = 0x67452301 ;
ctx - > buf [ 1 ] = 0xefcdab89 ;
ctx - > buf [ 2 ] = 0x98badcfe ;
ctx - > buf [ 3 ] = 0x10325476 ;
ctx - > bits [ 0 ] = 0 ;
ctx - > bits [ 1 ] = 0 ;
ctx - > count = 0 ;
ctx - > state [ 0 ] = 0x67452301 ;
ctx - > state [ 1 ] = 0xefcdab89 ;
ctx - > state [ 2 ] = 0x98badcfe ;
ctx - > state [ 3 ] = 0x10325476 ;
}
/*
@ -65,45 +99,41 @@ MD5Init(MD5_CTX *ctx)
void
MD5Update ( MD5_CTX * ctx , const unsigned char * buf , size_t len )
{
u_int32_t t ;
u_int32_t coun t;
/* Update bitcount */
/* Bytes already stored in ctx->buffer */
count = ( u_int32_t ) ( ( ctx - > count > > 3 ) & 0x3f ) ;
t = ctx - > bits [ 0 ] ;
if ( ( ctx - > bits [ 0 ] = t + ( ( u_int32_t ) len < < 3 ) ) < t )
ctx - > bits [ 1 ] + + ; /* Carry from low to high */
ctx - > bits [ 1 ] + = len > > 29 ;
t = ( t > > 3 ) & 0x3f ; /* Bytes already in shsInfo->data */
/* Update bitcount */
ctx - > count + = ( u_int64_t ) len < < 3 ;
/* Handle any leading odd-sized chunks */
if ( count ) {
unsigned char * p = ( unsigned char * ) ctx - > buffer + count ;
if ( t ) {
unsigned char * p = ( unsigned char * ) ctx - > in + t ;
t = 64 - t ;
if ( len < t ) {
count = MD5_BLOCK_LENGTH - count ;
if ( len < count ) {
memcpy ( p , buf , len ) ;
return ;
}
memcpy ( p , buf , t ) ;
htole32n ( ( u_int32_t * ) ctx - > in , 16 ) ;
MD5Transform ( ctx - > buf , ctx - > in ) ;
buf + = t ;
len - = t ;
memcpy ( p , buf , coun t) ;
htole32_16 ( ( u_int32_t * ) ctx - > buffer ) ;
MD5Transform ( ctx - > state , ctx - > buffer ) ;
buf + = coun t;
len - = coun t;
}
/* Process data in 64 -byte chunks */
while ( len > = 64 ) {
memcpy ( ctx - > in , buf , 64 ) ;
htole32n ( ( u_int32_t * ) ctx - > in , 16 ) ;
MD5Transform ( ctx - > buf , ctx - > in ) ;
buf + = 64 ;
len - = 64 ;
/* Process data in MD5_BLOCK_LENGTH -byte chunks */
while ( len > = MD5_BLOCK_LENGTH ) {
memcpy ( ctx - > buffer , buf , MD5_BLOCK_LENGTH ) ;
htole32_16 ( ( u_int32_t * ) ctx - > buffer ) ;
MD5Transform ( ctx - > state , ctx - > buffer ) ;
buf + = MD5_BLOCK_LENGTH ;
len - = MD5_BLOCK_LENGTH ;
}
/* Handle any remaining bytes of data. */
memcpy ( ctx - > in , buf , len ) ;
memcpy ( ctx - > buffer , buf , len ) ;
}
/*
@ -111,19 +141,19 @@ MD5Update(MD5_CTX *ctx, const unsigned char *buf, size_t len)
* 1 0 * ( 64 - bit count of bits processed , MSB - first )
*/
void
MD5Final ( unsigned char digest [ 16 ] , MD5_CTX * ctx )
MD5Final ( unsigned char digest [ MD5_DIGEST_LENGTH ] , MD5_CTX * ctx )
{
size _t count ;
u_int32 _t count ;
unsigned char * p ;
/* number of bytes mod 64 */
count = ( ctx - > bits [ 0 ] > > 3 ) & 0x3F ;
count = ( u_int32_t ) ( ctx - > count > > 3 ) & 0x3f ;
/*
* Set the first char of padding to 0x80 .
* This is safe since there is always at least one byte free .
*/
p = ctx - > in + count ;
p = ctx - > buffer + count ;
* p + + = 0x80 ;
/* Bytes of padding needed to make 64 bytes */
@ -133,24 +163,24 @@ MD5Final(unsigned char digest[16], MD5_CTX *ctx)
if ( count < 8 ) {
/* Two lots of padding: Pad the first block to 64 bytes */
memset ( p , 0 , count ) ;
htole32n ( ( u_int32_t * ) ctx - > in , 16 ) ;
MD5Transform ( ctx - > buf , ctx - > in ) ;
htole32_16 ( ( u_int32_t * ) ctx - > buffer ) ;
MD5Transform ( ctx - > state , ctx - > buffer ) ;
/* Now fill the next block with 56 bytes */
memset ( ctx - > in , 0 , 56 ) ;
memset ( ctx - > buffer , 0 , 56 ) ;
} else {
/* Pad block to 56 bytes */
memset ( p , 0 , count - 8 ) ;
}
htole32n ( ( u_int32_t * ) ctx - > in , 14 ) ;
htole32_14 ( ( u_int32_t * ) ctx - > buffer ) ;
/* Append length in bits and transform */
( ( u_int32_t * ) ctx - > in ) [ 14 ] = ctx - > bits [ 0 ] ;
( ( u_int32_t * ) ctx - > in ) [ 15 ] = ctx - > bits [ 1 ] ;
/* Append bit count and transform */
( ( u_int32_t * ) ctx - > buffer ) [ 14 ] = ctx - > count & 0xffffffff ;
( ( u_int32_t * ) ctx - > buffer ) [ 15 ] = ( u_int32_t ) ( ctx - > count > > 32 ) ;
MD5Transform ( ctx - > buf , ctx - > in ) ;
htole32n ( ctx - > buf , 4 ) ;
memcpy ( digest , ctx - > buf , 16 ) ;
MD5Transform ( ctx - > state , ctx - > buffer ) ;
htole32_4 ( ctx - > state ) ;
memcpy ( digest , ctx - > state , MD5_DIGEST_LENGTH ) ;
memset ( ctx , 0 , sizeof ( ctx ) ) ; /* In case it's sensitive */
}
@ -173,7 +203,7 @@ MD5Final(unsigned char digest[16], MD5_CTX *ctx)
* the data and converts bytes into longwords for this routine .
*/
void
MD5Transform ( u_int32_t buf [ 4 ] , const unsigned char inc [ 64 ] )
MD5Transform ( u_int32_t buf [ 4 ] , const unsigned char inc [ MD5_BLOCK_LENGTH ] )
{
u_int32_t a , b , c , d ;
const u_int32_t * in = ( const u_int32_t * ) inc ;
@ -183,73 +213,73 @@ MD5Transform(u_int32_t buf[4], const unsigned char inc[64])
c = buf [ 2 ] ;
d = buf [ 3 ] ;
MD5STEP ( F1 , a , b , c , d , in [ 0 ] + 0xd76aa478 , 7 ) ;
MD5STEP ( F1 , d , a , b , c , in [ 1 ] + 0xe8c7b756 , 12 ) ;
MD5STEP ( F1 , c , d , a , b , in [ 2 ] + 0x242070db , 17 ) ;
MD5STEP ( F1 , b , c , d , a , in [ 3 ] + 0xc1bdceee , 22 ) ;
MD5STEP ( F1 , a , b , c , d , in [ 4 ] + 0xf57c0faf , 7 ) ;
MD5STEP ( F1 , d , a , b , c , in [ 5 ] + 0x4787c62a , 12 ) ;
MD5STEP ( F1 , c , d , a , b , in [ 6 ] + 0xa8304613 , 17 ) ;
MD5STEP ( F1 , b , c , d , a , in [ 7 ] + 0xfd469501 , 22 ) ;
MD5STEP ( F1 , a , b , c , d , in [ 8 ] + 0x698098d8 , 7 ) ;
MD5STEP ( F1 , d , a , b , c , in [ 9 ] + 0x8b44f7af , 12 ) ;
MD5STEP ( F1 , a , b , c , d , in [ 0 ] + 0xd76aa478 , 7 ) ;
MD5STEP ( F1 , d , a , b , c , in [ 1 ] + 0xe8c7b756 , 12 ) ;
MD5STEP ( F1 , c , d , a , b , in [ 2 ] + 0x242070db , 17 ) ;
MD5STEP ( F1 , b , c , d , a , in [ 3 ] + 0xc1bdceee , 22 ) ;
MD5STEP ( F1 , a , b , c , d , in [ 4 ] + 0xf57c0faf , 7 ) ;
MD5STEP ( F1 , d , a , b , c , in [ 5 ] + 0x4787c62a , 12 ) ;
MD5STEP ( F1 , c , d , a , b , in [ 6 ] + 0xa8304613 , 17 ) ;
MD5STEP ( F1 , b , c , d , a , in [ 7 ] + 0xfd469501 , 22 ) ;
MD5STEP ( F1 , a , b , c , d , in [ 8 ] + 0x698098d8 , 7 ) ;
MD5STEP ( F1 , d , a , b , c , in [ 9 ] + 0x8b44f7af , 12 ) ;
MD5STEP ( F1 , c , d , a , b , in [ 10 ] + 0xffff5bb1 , 17 ) ;
MD5STEP ( F1 , b , c , d , a , in [ 11 ] + 0x895cd7be , 22 ) ;
MD5STEP ( F1 , a , b , c , d , in [ 12 ] + 0x6b901122 , 7 ) ;
MD5STEP ( F1 , a , b , c , d , in [ 12 ] + 0x6b901122 , 7 ) ;
MD5STEP ( F1 , d , a , b , c , in [ 13 ] + 0xfd987193 , 12 ) ;
MD5STEP ( F1 , c , d , a , b , in [ 14 ] + 0xa679438e , 17 ) ;
MD5STEP ( F1 , b , c , d , a , in [ 15 ] + 0x49b40821 , 22 ) ;
MD5STEP ( F2 , a , b , c , d , in [ 1 ] + 0xf61e2562 , 5 ) ;
MD5STEP ( F2 , d , a , b , c , in [ 6 ] + 0xc040b340 , 9 ) ;
MD5STEP ( F2 , a , b , c , d , in [ 1 ] + 0xf61e2562 , 5 ) ;
MD5STEP ( F2 , d , a , b , c , in [ 6 ] + 0xc040b340 , 9 ) ;
MD5STEP ( F2 , c , d , a , b , in [ 11 ] + 0x265e5a51 , 14 ) ;
MD5STEP ( F2 , b , c , d , a , in [ 0 ] + 0xe9b6c7aa , 20 ) ;
MD5STEP ( F2 , a , b , c , d , in [ 5 ] + 0xd62f105d , 5 ) ;
MD5STEP ( F2 , d , a , b , c , in [ 10 ] + 0x02441453 , 9 ) ;
MD5STEP ( F2 , b , c , d , a , in [ 0 ] + 0xe9b6c7aa , 20 ) ;
MD5STEP ( F2 , a , b , c , d , in [ 5 ] + 0xd62f105d , 5 ) ;
MD5STEP ( F2 , d , a , b , c , in [ 10 ] + 0x02441453 , 9 ) ;
MD5STEP ( F2 , c , d , a , b , in [ 15 ] + 0xd8a1e681 , 14 ) ;
MD5STEP ( F2 , b , c , d , a , in [ 4 ] + 0xe7d3fbc8 , 20 ) ;
MD5STEP ( F2 , a , b , c , d , in [ 9 ] + 0x21e1cde6 , 5 ) ;
MD5STEP ( F2 , d , a , b , c , in [ 14 ] + 0xc33707d6 , 9 ) ;
MD5STEP ( F2 , c , d , a , b , in [ 3 ] + 0xf4d50d87 , 14 ) ;
MD5STEP ( F2 , b , c , d , a , in [ 8 ] + 0x455a14ed , 20 ) ;
MD5STEP ( F2 , a , b , c , d , in [ 13 ] + 0xa9e3e905 , 5 ) ;
MD5STEP ( F2 , d , a , b , c , in [ 2 ] + 0xfcefa3f8 , 9 ) ;
MD5STEP ( F2 , c , d , a , b , in [ 7 ] + 0x676f02d9 , 14 ) ;
MD5STEP ( F2 , b , c , d , a , in [ 4 ] + 0xe7d3fbc8 , 20 ) ;
MD5STEP ( F2 , a , b , c , d , in [ 9 ] + 0x21e1cde6 , 5 ) ;
MD5STEP ( F2 , d , a , b , c , in [ 14 ] + 0xc33707d6 , 9 ) ;
MD5STEP ( F2 , c , d , a , b , in [ 3 ] + 0xf4d50d87 , 14 ) ;
MD5STEP ( F2 , b , c , d , a , in [ 8 ] + 0x455a14ed , 20 ) ;
MD5STEP ( F2 , a , b , c , d , in [ 13 ] + 0xa9e3e905 , 5 ) ;
MD5STEP ( F2 , d , a , b , c , in [ 2 ] + 0xfcefa3f8 , 9 ) ;
MD5STEP ( F2 , c , d , a , b , in [ 7 ] + 0x676f02d9 , 14 ) ;
MD5STEP ( F2 , b , c , d , a , in [ 12 ] + 0x8d2a4c8a , 20 ) ;
MD5STEP ( F3 , a , b , c , d , in [ 5 ] + 0xfffa3942 , 4 ) ;
MD5STEP ( F3 , d , a , b , c , in [ 8 ] + 0x8771f681 , 11 ) ;
MD5STEP ( F3 , a , b , c , d , in [ 5 ] + 0xfffa3942 , 4 ) ;
MD5STEP ( F3 , d , a , b , c , in [ 8 ] + 0x8771f681 , 11 ) ;
MD5STEP ( F3 , c , d , a , b , in [ 11 ] + 0x6d9d6122 , 16 ) ;
MD5STEP ( F3 , b , c , d , a , in [ 14 ] + 0xfde5380c , 23 ) ;
MD5STEP ( F3 , a , b , c , d , in [ 1 ] + 0xa4beea44 , 4 ) ;
MD5STEP ( F3 , d , a , b , c , in [ 4 ] + 0x4bdecfa9 , 11 ) ;
MD5STEP ( F3 , c , d , a , b , in [ 7 ] + 0xf6bb4b60 , 16 ) ;
MD5STEP ( F3 , a , b , c , d , in [ 1 ] + 0xa4beea44 , 4 ) ;
MD5STEP ( F3 , d , a , b , c , in [ 4 ] + 0x4bdecfa9 , 11 ) ;
MD5STEP ( F3 , c , d , a , b , in [ 7 ] + 0xf6bb4b60 , 16 ) ;
MD5STEP ( F3 , b , c , d , a , in [ 10 ] + 0xbebfbc70 , 23 ) ;
MD5STEP ( F3 , a , b , c , d , in [ 13 ] + 0x289b7ec6 , 4 ) ;
MD5STEP ( F3 , d , a , b , c , in [ 0 ] + 0xeaa127fa , 11 ) ;
MD5STEP ( F3 , c , d , a , b , in [ 3 ] + 0xd4ef3085 , 16 ) ;
MD5STEP ( F3 , b , c , d , a , in [ 6 ] + 0x04881d05 , 23 ) ;
MD5STEP ( F3 , a , b , c , d , in [ 9 ] + 0xd9d4d039 , 4 ) ;
MD5STEP ( F3 , a , b , c , d , in [ 13 ] + 0x289b7ec6 , 4 ) ;
MD5STEP ( F3 , d , a , b , c , in [ 0 ] + 0xeaa127fa , 11 ) ;
MD5STEP ( F3 , c , d , a , b , in [ 3 ] + 0xd4ef3085 , 16 ) ;
MD5STEP ( F3 , b , c , d , a , in [ 6 ] + 0x04881d05 , 23 ) ;
MD5STEP ( F3 , a , b , c , d , in [ 9 ] + 0xd9d4d039 , 4 ) ;
MD5STEP ( F3 , d , a , b , c , in [ 12 ] + 0xe6db99e5 , 11 ) ;
MD5STEP ( F3 , c , d , a , b , in [ 15 ] + 0x1fa27cf8 , 16 ) ;
MD5STEP ( F3 , b , c , d , a , in [ 2 ] + 0xc4ac5665 , 23 ) ;
MD5STEP ( F3 , b , c , d , a , in [ 2 ] + 0xc4ac5665 , 23 ) ;
MD5STEP ( F4 , a , b , c , d , in [ 0 ] + 0xf4292244 , 6 ) ;
MD5STEP ( F4 , d , a , b , c , in [ 7 ] + 0x432aff97 , 10 ) ;
MD5STEP ( F4 , a , b , c , d , in [ 0 ] + 0xf4292244 , 6 ) ;
MD5STEP ( F4 , d , a , b , c , in [ 7 ] + 0x432aff97 , 10 ) ;
MD5STEP ( F4 , c , d , a , b , in [ 14 ] + 0xab9423a7 , 15 ) ;
MD5STEP ( F4 , b , c , d , a , in [ 5 ] + 0xfc93a039 , 21 ) ;
MD5STEP ( F4 , a , b , c , d , in [ 12 ] + 0x655b59c3 , 6 ) ;
MD5STEP ( F4 , d , a , b , c , in [ 3 ] + 0x8f0ccc92 , 10 ) ;
MD5STEP ( F4 , b , c , d , a , in [ 5 ] + 0xfc93a039 , 21 ) ;
MD5STEP ( F4 , a , b , c , d , in [ 12 ] + 0x655b59c3 , 6 ) ;
MD5STEP ( F4 , d , a , b , c , in [ 3 ] + 0x8f0ccc92 , 10 ) ;
MD5STEP ( F4 , c , d , a , b , in [ 10 ] + 0xffeff47d , 15 ) ;
MD5STEP ( F4 , b , c , d , a , in [ 1 ] + 0x85845dd1 , 21 ) ;
MD5STEP ( F4 , a , b , c , d , in [ 8 ] + 0x6fa87e4f , 6 ) ;
MD5STEP ( F4 , b , c , d , a , in [ 1 ] + 0x85845dd1 , 21 ) ;
MD5STEP ( F4 , a , b , c , d , in [ 8 ] + 0x6fa87e4f , 6 ) ;
MD5STEP ( F4 , d , a , b , c , in [ 15 ] + 0xfe2ce6e0 , 10 ) ;
MD5STEP ( F4 , c , d , a , b , in [ 6 ] + 0xa3014314 , 15 ) ;
MD5STEP ( F4 , c , d , a , b , in [ 6 ] + 0xa3014314 , 15 ) ;
MD5STEP ( F4 , b , c , d , a , in [ 13 ] + 0x4e0811a1 , 21 ) ;
MD5STEP ( F4 , a , b , c , d , in [ 4 ] + 0xf7537e82 , 6 ) ;
MD5STEP ( F4 , a , b , c , d , in [ 4 ] + 0xf7537e82 , 6 ) ;
MD5STEP ( F4 , d , a , b , c , in [ 11 ] + 0xbd3af235 , 10 ) ;
MD5STEP ( F4 , c , d , a , b , in [ 2 ] + 0x2ad7d2bb , 15 ) ;
MD5STEP ( F4 , b , c , d , a , in [ 9 ] + 0xeb86d391 , 21 ) ;
MD5STEP ( F4 , c , d , a , b , in [ 2 ] + 0x2ad7d2bb , 15 ) ;
MD5STEP ( F4 , b , c , d , a , in [ 9 ] + 0xeb86d391 , 21 ) ;
buf [ 0 ] + = a ;
buf [ 1 ] + = b ;