mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-11 09:50:12 +00:00
Fix bug in MDx test suite.
Add Eric Young's SHA-[01] implementations.
This commit is contained in:
parent
79a7a64b85
commit
c177a86b92
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=44290
@ -1,27 +1,47 @@
|
||||
# $Id: Makefile,v 1.27 1998/09/11 05:41:29 imp Exp $
|
||||
# $Id: Makefile,v 1.28 1998/11/12 04:08:10 jdp Exp $
|
||||
|
||||
LIB= md
|
||||
SRCS= md2c.c md4c.c md5c.c md2hl.c md4hl.c md5hl.c
|
||||
MAN3+= md2.3 md4.3 md5.3
|
||||
SRCS= md2c.c md4c.c md5c.c md2hl.c md4hl.c md5hl.c \
|
||||
sha0c.c sha0hl.c sha1c.c sha1hl.c
|
||||
MAN3+= md2.3 md4.3 md5.3 sha.3
|
||||
MLINKS+=md2.3 MD2Init.3 md2.3 MD2Update.3 md2.3 MD2Final.3
|
||||
MLINKS+=md2.3 MD2End.3 md2.3 MD2File.3 md2.3 MD2Data.3
|
||||
MLINKS+=md4.3 MD4Init.3 md4.3 MD4Update.3 md4.3 MD4Final.3
|
||||
MLINKS+=md4.3 MD4End.3 md4.3 MD4File.3 md4.3 MD4Data.3
|
||||
MLINKS+=md5.3 MD5Init.3 md5.3 MD5Update.3 md5.3 MD5Final.3
|
||||
MLINKS+=md5.3 MD5End.3 md5.3 MD5File.3 md5.3 MD5Data.3
|
||||
CLEANFILES+= md[245]hl.c md[245].ref md[245].3 mddriver
|
||||
CLEANFILES+= md[245]hl.c md[245].ref md[245].3 mddriver \
|
||||
sha0.ref sha0hl.c sha1.ref sha1hl.c shadriver
|
||||
CFLAGS+= -I${.CURDIR}
|
||||
|
||||
.if exists(${MACHINE_ARCH}/sha.S)
|
||||
SRCS+= ${MACHINE_ARCH}/sha.S
|
||||
CFLAGS+= -DSHA1_ASM -DELF
|
||||
.endif
|
||||
|
||||
all: md2.3 md4.3 md5.3
|
||||
|
||||
md2hl.c: mdXhl.c
|
||||
sed -e 's/mdX/md2/g' -e 's/MDX/MD2/g' ${.ALLSRC} > ${.TARGET}
|
||||
(echo '#define LENGTH 16'; \
|
||||
sed -e 's/mdX/md2/g' -e 's/MDX/MD2/g' ${.ALLSRC}) > ${.TARGET}
|
||||
|
||||
md4hl.c: mdXhl.c
|
||||
sed -e 's/mdX/md4/g' -e 's/MDX/MD4/g' ${.ALLSRC} > ${.TARGET}
|
||||
(echo '#define LENGTH 16'; \
|
||||
sed -e 's/mdX/md4/g' -e 's/MDX/MD4/g' ${.ALLSRC}) > ${.TARGET}
|
||||
|
||||
md5hl.c: mdXhl.c
|
||||
sed -e 's/mdX/md5/g' -e 's/MDX/MD5/g' ${.ALLSRC} > ${.TARGET}
|
||||
(echo '#define LENGTH 16'; \
|
||||
sed -e 's/mdX/md5/g' -e 's/MDX/MD5/g' ${.ALLSRC}) > ${.TARGET}
|
||||
|
||||
sha0hl.c: mdXhl.c
|
||||
(echo '#define LENGTH 20'; \
|
||||
sed -e 's/mdX/sha/g' -e 's/MDX/SHA_/g' -e 's/SHA__/SHA_/g' \
|
||||
${.ALLSRC}) > ${.TARGET}
|
||||
|
||||
sha1hl.c: mdXhl.c
|
||||
(echo '#define LENGTH 20'; \
|
||||
sed -e 's/mdX/sha/g' -e 's/MDX/SHA1_/g' -e 's/SHA1__/SHA1_/g' \
|
||||
${.ALLSRC}) > ${.TARGET}
|
||||
|
||||
md2.3: ${.CURDIR}/mdX.3
|
||||
sed -e 's/mdX/md2/g' -e 's/MDX/MD2/g' ${.ALLSRC} > ${.TARGET}
|
||||
@ -65,7 +85,33 @@ md5.ref:
|
||||
@echo 'MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f' >> ${.TARGET}
|
||||
@echo 'MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a' >> ${.TARGET}
|
||||
|
||||
test: md2.ref md4.ref md5.ref
|
||||
sha0.ref:
|
||||
(echo 'SHA-0 test suite:'; \
|
||||
echo 'SHA-0 ("") = f96cea198ad1dd5617ac084a3d92c6107708c0ef'; \
|
||||
echo 'SHA-0 ("abc") = 0164b8a914cd2a5e74c4f7ff082c4d97f1edf880'; \
|
||||
echo 'SHA-0 ("message digest") =' \
|
||||
'c1b0f222d150ebb9aa36a40cafdc8bcbed830b14'; \
|
||||
echo 'SHA-0 ("abcdefghijklmnopqrstuvwxyz") =' \
|
||||
'b40ce07a430cfd3c033039b9fe9afec95dc1bdcd'; \
|
||||
echo 'SHA-0 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =' \
|
||||
'79e966f7a3a990df33e40e3d7f8f18d2caebadfa'; \
|
||||
echo 'SHA-0 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =' \
|
||||
'4aa29d14d171522ece47bee8957e35a41f3e9cff' ) > ${.TARGET}
|
||||
|
||||
sha1.ref:
|
||||
(echo 'SHA-1 test suite:'; \
|
||||
echo 'SHA-1 ("") = da39a3ee5e6b4b0d3255bfef95601890afd80709'; \
|
||||
echo 'SHA-1 ("abc") = a9993e364706816aba3e25717850c26c9cd0d89d'; \
|
||||
echo 'SHA-1 ("message digest") =' \
|
||||
'c12252ceda8be8994d5fa0290a47231c1d16aae3'; \
|
||||
echo 'SHA-1 ("abcdefghijklmnopqrstuvwxyz") =' \
|
||||
'32d10c7b8cf96570ca04ce37f2a19d84240d3a89'; \
|
||||
echo 'SHA-1 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =' \
|
||||
'761c457bf73b14d27e9e9265c46f4b4dda11f940'; \
|
||||
echo 'SHA-1 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =' \
|
||||
'50abf5706a150990a08b2c5ea40fa0e585554732' ) > ${.TARGET}
|
||||
|
||||
test: md2.ref md4.ref md5.ref sha0.ref sha1.ref
|
||||
@${ECHO} if any of these test fail, the code produces wrong results
|
||||
@${ECHO} and should NOT be used.
|
||||
${CC} -static ${CFLAGS} ${LDFLAGS} -DMD=2 -o mddriver ${.CURDIR}/mddriver.c -L. -lmd
|
||||
@ -78,9 +124,16 @@ test: md2.ref md4.ref md5.ref
|
||||
./mddriver | cmp md5.ref -
|
||||
@${ECHO} MD5 passed test
|
||||
-rm -f mddriver
|
||||
${CC} -static ${CFLAGS} ${LDFLAGS} -DSHA=0 -o shadriver ${.CURDIR}/shadriver.c -L. -lmd
|
||||
./shadriver | cmp sha0.ref -
|
||||
@${ECHO} SHA-0 passed test
|
||||
${CC} -static ${CFLAGS} ${LDFLAGS} -DSHA=1 -o shadriver ${.CURDIR}/shadriver.c -L. -lmd
|
||||
./shadriver | cmp sha1.ref -
|
||||
@${ECHO} SHA-1 passed test
|
||||
-rm -f shadriver
|
||||
|
||||
beforeinstall:
|
||||
.for i in md2.h md4.h md5.h
|
||||
.for i in md2.h md4.h md5.h sha.h
|
||||
${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/$i \
|
||||
${DESTDIR}/usr/include
|
||||
.endfor
|
||||
|
1951
lib/libmd/i386/sha.S
Normal file
1951
lib/libmd/i386/sha.S
Normal file
File diff suppressed because it is too large
Load Diff
@ -6,7 +6,7 @@
|
||||
.\" this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
||||
.\" ----------------------------------------------------------------------------
|
||||
.\"
|
||||
.\" $Id: mdX.3,v 1.13 1998/03/27 10:22:07 phk Exp $
|
||||
.\" $Id: mdX.3,v 1.14 1999/02/11 20:31:49 wollman Exp $
|
||||
.\"
|
||||
.Dd February 11, 1999
|
||||
.Dt MDX 3
|
||||
@ -110,7 +110,8 @@ argument is non-null it must point to at least 33 characters of buffer space.
|
||||
.Sh SEE ALSO
|
||||
.Xr md2 3 ,
|
||||
.Xr md4 3 ,
|
||||
.Xr md5 3
|
||||
.Xr md5 3 ,
|
||||
.Xr sha 3
|
||||
.Rs
|
||||
.%A B. Kaliski
|
||||
.%T The MD2 Message-Digest Algorithm
|
||||
|
@ -6,7 +6,7 @@
|
||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* $Id: mdXhl.c,v 1.10 1997/02/22 15:07:23 peter Exp $
|
||||
* $Id: mdXhl.c,v 1.11 1997/08/25 05:24:25 joerg Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
@ -24,15 +24,15 @@ char *
|
||||
MDXEnd(MDX_CTX *ctx, char *buf)
|
||||
{
|
||||
int i;
|
||||
unsigned char digest[16];
|
||||
unsigned char digest[LENGTH];
|
||||
static const char hex[]="0123456789abcdef";
|
||||
|
||||
if (!buf)
|
||||
buf = malloc(33);
|
||||
buf = malloc(2*LENGTH + 1);
|
||||
if (!buf)
|
||||
return 0;
|
||||
MDXFinal(digest,ctx);
|
||||
for (i=0;i<16;i++) {
|
||||
MDXFinal(digest, ctx);
|
||||
for (i = 0; i < LENGTH; i++) {
|
||||
buf[i+i] = hex[digest[i] >> 4];
|
||||
buf[i+i+1] = hex[digest[i] & 0x0f];
|
||||
}
|
||||
@ -41,7 +41,7 @@ MDXEnd(MDX_CTX *ctx, char *buf)
|
||||
}
|
||||
|
||||
char *
|
||||
MDXFile (const char *filename, char *buf)
|
||||
MDXFile(const char *filename, char *buf)
|
||||
{
|
||||
unsigned char buffer[BUFSIZ];
|
||||
MDX_CTX ctx;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* MDDRIVER.C - test driver for MD2, MD4 and MD5
|
||||
* $Id: mddriver.c,v 1.3 1997/02/22 15:07:24 peter Exp $
|
||||
* $Id: mddriver.c,v 1.4 1997/08/25 05:24:26 joerg Exp $
|
||||
*/
|
||||
|
||||
/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
|
||||
@ -66,4 +66,5 @@ main()
|
||||
MDString
|
||||
("1234567890123456789012345678901234567890\
|
||||
1234567890123456789012345678901234567890");
|
||||
return 0;
|
||||
}
|
||||
|
138
lib/libmd/sha.3
Normal file
138
lib/libmd/sha.3
Normal file
@ -0,0 +1,138 @@
|
||||
.\"
|
||||
.\" ----------------------------------------------------------------------------
|
||||
.\" "THE BEER-WARE LICENSE" (Revision 42):
|
||||
.\" <phk@login.dkuug.dk> wrote this file. As long as you retain this notice you
|
||||
.\" can do whatever you want with this stuff. If we meet some day, and you think
|
||||
.\" this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
||||
.\" ----------------------------------------------------------------------------
|
||||
.\"
|
||||
.\" From: Id: mdX.3,v 1.14 1999/02/11 20:31:49 wollman Exp
|
||||
.\" $Id$
|
||||
.\"
|
||||
.Dd February 25, 1999
|
||||
.Dt SHAX 3
|
||||
.Os FreeBSD 4.0
|
||||
.Sh NAME
|
||||
.Nm SHA_Init ,
|
||||
.Nm SHA_Update ,
|
||||
.Nm SHA_Final ,
|
||||
.Nm SHA_End ,
|
||||
.Nm SHA_File ,
|
||||
.Nm SHA_Data ,
|
||||
.Nm SHA1_Init ,
|
||||
.Nm SHA1_Update ,
|
||||
.Nm SHA1_Final ,
|
||||
.Nm SHA1_End ,
|
||||
.Nm SHA1_File ,
|
||||
.Nm SHA1_Data
|
||||
.Nd calculate the FIPS 160 and 160-1 ``SHA'' message digests
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <sys/types.h>
|
||||
.Fd #include <sha.h>
|
||||
.Ft void
|
||||
.Fn SHA_Init "SHA_CTX *context"
|
||||
.Ft void
|
||||
.Fn SHA_Update "SHA_CTX *context" "const unsigned char *data" "unsigned int len"
|
||||
.Ft void
|
||||
.Fn SHA_Final "unsigned char digest[20]" "SHA_CTX *context"
|
||||
.Ft "char *"
|
||||
.Fn SHA_End "SHA_CTX *context" "char *buf"
|
||||
.Ft "char *"
|
||||
.Fn SHA_File "const char *filename" "char *buf"
|
||||
.Ft "char *"
|
||||
.Fn SHA_Data "const unsigned char *data" "unsigned int len" "char *buf"
|
||||
.Ft void
|
||||
.Fn SHA1_Init "SHA_CTX *context"
|
||||
.Ft void
|
||||
.Fn SHA1_Update "SHA_CTX *context" "const unsigned char *data" "unsigned int len"
|
||||
.Ft void
|
||||
.Fn SHA1_Final "unsigned char digest[20]" "SHA_CTX *context"
|
||||
.Ft "char *"
|
||||
.Fn SHA1_End "SHA_CTX *context" "char *buf"
|
||||
.Ft "char *"
|
||||
.Fn SHA1_File "const char *filename" "char *buf"
|
||||
.Ft "char *"
|
||||
.Fn SHA1_Data "const unsigned char *data" "unsigned int len" "char *buf"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Li SHA_
|
||||
and
|
||||
.Li SHA1_
|
||||
functions calculate a 160-bit cryptographic checksum (digest)
|
||||
for any number of input bytes. A cryptographic checksum is a one-way
|
||||
hash function; that is, it is computationally impractical to find
|
||||
the input corresponding to a particular output. This net result is
|
||||
a ``fingerprint'' of the input-data, which doesn't disclose the actual
|
||||
input.
|
||||
.Pp
|
||||
.Tn SHA
|
||||
.Pq \&or Tn SHA-0
|
||||
is the original Secure Hash Algorithm specified in
|
||||
.Tn FIPS
|
||||
160. It was quickly proven insecure, and has been superseded by
|
||||
.Tn SHA-1 .
|
||||
.Tn SHA-0
|
||||
is included for compatibility purposes only.
|
||||
.Pp
|
||||
The
|
||||
.Fn SHA1_Init ,
|
||||
.Fn SHA1_Update ,
|
||||
and
|
||||
.Fn SHA1_Final
|
||||
functions are the core functions. Allocate an SHA_CTX, initialize it with
|
||||
.Fn SHA1_Init ,
|
||||
run over the data with
|
||||
.Fn SHA1_Update ,
|
||||
and finally extract the result using
|
||||
.Fn SHA1_Final .
|
||||
.Pp
|
||||
.Fn SHA1_End
|
||||
is a wrapper for
|
||||
.Fn SHA1_Final
|
||||
which converts the return value to a 41-character
|
||||
(including the terminating '\e0')
|
||||
.Tn ASCII
|
||||
string which represents the 160 bits in hexadecimal.
|
||||
.Pp
|
||||
.Fn SHA1_File
|
||||
calculates the digest of a file, and uses
|
||||
.Fn SHA1_End
|
||||
to return the result.
|
||||
If the file cannot be opened, a null pointer is returned.
|
||||
.Fn SHA1_Data
|
||||
calculates the digest of a chunk of data in memory, and uses
|
||||
.Fn SHA1_End
|
||||
to return the result.
|
||||
.Pp
|
||||
When using
|
||||
.Fn SHA1_End ,
|
||||
.Fn SHA1_File ,
|
||||
or
|
||||
.Fn SHA1_Data ,
|
||||
the
|
||||
.Ar buf
|
||||
argument can be a null pointer, in which case the returned string
|
||||
is allocated with
|
||||
.Xr malloc 3
|
||||
and subsequently must be explicitly deallocated using
|
||||
.Xr free 3
|
||||
after use.
|
||||
If the
|
||||
.Ar buf
|
||||
argument is non-null it must point to at least 41 characters of buffer space.
|
||||
.Sh SEE ALSO
|
||||
.Xr md2 3 ,
|
||||
.Xr md4 3 ,
|
||||
.Xr md5 3
|
||||
.Sh AUTHORS
|
||||
The core hash routines were implemented by Eric Young based on the
|
||||
published
|
||||
.Tn FIPS
|
||||
standards.
|
||||
.Sh HISTORY
|
||||
These functions appeared in
|
||||
.Fx 4.0 .
|
||||
.Sh BUGS
|
||||
No method is known to exist which finds two files having the same hash value,
|
||||
nor to find a file with a specific hash value.
|
||||
There is on the other hand no guarantee that such a method doesn't exist.
|
99
lib/libmd/sha.h
Normal file
99
lib/libmd/sha.h
Normal file
@ -0,0 +1,99 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef _SHA_H_
|
||||
#define _SHA_H_ 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h> /* XXX switch to machine/ansi.h and __ types */
|
||||
|
||||
#define SHA_CBLOCK 64
|
||||
#define SHA_LBLOCK 16
|
||||
#define SHA_BLOCK 16
|
||||
#define SHA_LAST_BLOCK 56
|
||||
#define SHA_LENGTH_BLOCK 8
|
||||
#define SHA_DIGEST_LENGTH 20
|
||||
|
||||
typedef struct SHAstate_st {
|
||||
u_int32_t h0, h1, h2, h3, h4;
|
||||
u_int32_t Nl, Nh;
|
||||
u_int32_t data[SHA_LBLOCK];
|
||||
int num;
|
||||
} SHA_CTX;
|
||||
#define SHA1_CTX SHA_CTX
|
||||
|
||||
__BEGIN_DECLS
|
||||
void SHA_Init(SHA_CTX *c);
|
||||
void SHA_Update(SHA_CTX *c, const unsigned char *data, u_int32_t len);
|
||||
void SHA_Final(unsigned char *md, SHA_CTX *c);
|
||||
void SHA_Transform(SHA_CTX *c, unsigned char *data);
|
||||
char *SHA_End(SHA_CTX *, char *);
|
||||
char *SHA_File(const char *, char *);
|
||||
char *SHA_Data(const unsigned char *, unsigned int, char *);
|
||||
void SHA1_Init(SHA_CTX *c);
|
||||
void SHA1_Update(SHA_CTX *c, const unsigned char *data, unsigned long len);
|
||||
void SHA1_Final(unsigned char *md, SHA_CTX *c);
|
||||
unsigned char *SHA1(unsigned char *d, unsigned long n, unsigned char *md);
|
||||
void SHA1_Transform(SHA_CTX *c, unsigned char *data);
|
||||
char *SHA1_End(SHA_CTX *, char *);
|
||||
char *SHA1_File(const char *, char *);
|
||||
char *SHA1_Data(const unsigned char *, unsigned int, char *);
|
||||
__END_DECLS
|
||||
|
||||
#endif /* !_SHA_H_ */
|
452
lib/libmd/sha0c.c
Normal file
452
lib/libmd/sha0c.c
Normal file
@ -0,0 +1,452 @@
|
||||
/* crypto/sha/sha_dgst.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#if 0
|
||||
#include <machine/ansi.h> /* we use the __ variants of bit-sized types */
|
||||
#endif
|
||||
#include <machine/endian.h>
|
||||
|
||||
#define SHA_0
|
||||
#undef SHA_1
|
||||
#include "sha.h"
|
||||
#include "sha_locl.h"
|
||||
|
||||
char *SHA_version="SHA part of SSLeay 0.9.0b 11-Oct-1998";
|
||||
|
||||
/* Implemented from SHA-0 document - The Secure Hash Algorithm
|
||||
*/
|
||||
|
||||
#define INIT_DATA_h0 (unsigned long)0x67452301L
|
||||
#define INIT_DATA_h1 (unsigned long)0xefcdab89L
|
||||
#define INIT_DATA_h2 (unsigned long)0x98badcfeL
|
||||
#define INIT_DATA_h3 (unsigned long)0x10325476L
|
||||
#define INIT_DATA_h4 (unsigned long)0xc3d2e1f0L
|
||||
|
||||
#define K_00_19 0x5a827999L
|
||||
#define K_20_39 0x6ed9eba1L
|
||||
#define K_40_59 0x8f1bbcdcL
|
||||
#define K_60_79 0xca62c1d6L
|
||||
|
||||
#ifndef NOPROTO
|
||||
void sha_block(SHA_CTX *c, const u_int32_t *p, int num);
|
||||
#else
|
||||
void sha_block();
|
||||
#endif
|
||||
|
||||
#define M_c2nl c2nl
|
||||
#define M_p_c2nl p_c2nl
|
||||
#define M_c2nl_p c2nl_p
|
||||
#define M_p_c2nl_p p_c2nl_p
|
||||
#define M_nl2c nl2c
|
||||
|
||||
void SHA_Init(c)
|
||||
SHA_CTX *c;
|
||||
{
|
||||
c->h0=INIT_DATA_h0;
|
||||
c->h1=INIT_DATA_h1;
|
||||
c->h2=INIT_DATA_h2;
|
||||
c->h3=INIT_DATA_h3;
|
||||
c->h4=INIT_DATA_h4;
|
||||
c->Nl=0;
|
||||
c->Nh=0;
|
||||
c->num=0;
|
||||
}
|
||||
|
||||
void SHA_Update(c, data, len)
|
||||
SHA_CTX *c;
|
||||
const unsigned char *data;
|
||||
u_int32_t len;
|
||||
{
|
||||
register u_int32_t *p;
|
||||
int ew,ec,sw,sc;
|
||||
u_int32_t l;
|
||||
|
||||
if (len == 0) return;
|
||||
|
||||
l=(c->Nl+(len<<3))&0xffffffffL;
|
||||
if (l < c->Nl) /* overflow */
|
||||
c->Nh++;
|
||||
c->Nh+=(len>>29);
|
||||
c->Nl=l;
|
||||
|
||||
if (c->num != 0)
|
||||
{
|
||||
p=c->data;
|
||||
sw=c->num>>2;
|
||||
sc=c->num&0x03;
|
||||
|
||||
if ((c->num+len) >= SHA_CBLOCK)
|
||||
{
|
||||
l= p[sw];
|
||||
M_p_c2nl(data,l,sc);
|
||||
p[sw++]=l;
|
||||
for (; sw<SHA_LBLOCK; sw++)
|
||||
{
|
||||
M_c2nl(data,l);
|
||||
p[sw]=l;
|
||||
}
|
||||
len-=(SHA_CBLOCK-c->num);
|
||||
|
||||
sha_block(c,p,64);
|
||||
c->num=0;
|
||||
/* drop through and do the rest */
|
||||
}
|
||||
else
|
||||
{
|
||||
c->num+=(int)len;
|
||||
if ((sc+len) < 4) /* ugly, add char's to a word */
|
||||
{
|
||||
l= p[sw];
|
||||
M_p_c2nl_p(data,l,sc,len);
|
||||
p[sw]=l;
|
||||
}
|
||||
else
|
||||
{
|
||||
ew=(c->num>>2);
|
||||
ec=(c->num&0x03);
|
||||
l= p[sw];
|
||||
M_p_c2nl(data,l,sc);
|
||||
p[sw++]=l;
|
||||
for (; sw < ew; sw++)
|
||||
{ M_c2nl(data,l); p[sw]=l; }
|
||||
if (ec)
|
||||
{
|
||||
M_c2nl_p(data,l,ec);
|
||||
p[sw]=l;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* We can only do the following code for assember, the reason
|
||||
* being that the sha_block 'C' version changes the values
|
||||
* in the 'data' array. The assember code avoids this and
|
||||
* copies it to a local array. I should be able to do this for
|
||||
* the C version as well....
|
||||
*/
|
||||
#if 1
|
||||
#if BYTE_ORDER == BIG_ENDIAN || defined(SHA_ASM)
|
||||
if ((((unsigned int)data)%sizeof(u_int32_t)) == 0)
|
||||
{
|
||||
sw=len/SHA_CBLOCK;
|
||||
if (sw)
|
||||
{
|
||||
sw*=SHA_CBLOCK;
|
||||
sha_block(c,(u_int32_t *)data,sw);
|
||||
data+=sw;
|
||||
len-=sw;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
/* we now can process the input data in blocks of SHA_CBLOCK
|
||||
* chars and save the leftovers to c->data. */
|
||||
p=c->data;
|
||||
while (len >= SHA_CBLOCK)
|
||||
{
|
||||
#if BYTE_ORDER == BIG_ENDIAN || BYTE_ORDER == LITTLE_ENDIAN
|
||||
if (p != (u_int32_t *)data)
|
||||
memcpy(p,data,SHA_CBLOCK);
|
||||
data+=SHA_CBLOCK;
|
||||
# if BYTE_ORDER == LITTLE_ENDIAN
|
||||
# ifndef SHA_ASM /* Will not happen */
|
||||
for (sw=(SHA_LBLOCK/4); sw; sw--)
|
||||
{
|
||||
Endian_Reverse32(p[0]);
|
||||
Endian_Reverse32(p[1]);
|
||||
Endian_Reverse32(p[2]);
|
||||
Endian_Reverse32(p[3]);
|
||||
p+=4;
|
||||
}
|
||||
p=c->data;
|
||||
# endif
|
||||
# endif
|
||||
#else
|
||||
for (sw=(SHA_BLOCK/4); sw; sw--)
|
||||
{
|
||||
M_c2nl(data,l); *(p++)=l;
|
||||
M_c2nl(data,l); *(p++)=l;
|
||||
M_c2nl(data,l); *(p++)=l;
|
||||
M_c2nl(data,l); *(p++)=l;
|
||||
}
|
||||
p=c->data;
|
||||
#endif
|
||||
sha_block(c,p,64);
|
||||
len-=SHA_CBLOCK;
|
||||
}
|
||||
ec=(int)len;
|
||||
c->num=ec;
|
||||
ew=(ec>>2);
|
||||
ec&=0x03;
|
||||
|
||||
for (sw=0; sw < ew; sw++)
|
||||
{ M_c2nl(data,l); p[sw]=l; }
|
||||
M_c2nl_p(data,l,ec);
|
||||
p[sw]=l;
|
||||
}
|
||||
|
||||
void SHA_Transform(c,b)
|
||||
SHA_CTX *c;
|
||||
unsigned char *b;
|
||||
{
|
||||
u_int32_t p[16];
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||
u_int32_t *q;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#if BYTE_ORDER == BIG_ENDIAN || BYTE_ORDER == LITTLE_ENDIAN
|
||||
memcpy(p,b,64);
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||
q=p;
|
||||
for (i=(SHA_LBLOCK/4); i; i--)
|
||||
{
|
||||
Endian_Reverse32(q[0]);
|
||||
Endian_Reverse32(q[1]);
|
||||
Endian_Reverse32(q[2]);
|
||||
Endian_Reverse32(q[3]);
|
||||
q+=4;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
q=p;
|
||||
for (i=(SHA_LBLOCK/4); i; i--)
|
||||
{
|
||||
u_int32_t l;
|
||||
c2nl(b,l); *(q++)=l;
|
||||
c2nl(b,l); *(q++)=l;
|
||||
c2nl(b,l); *(q++)=l;
|
||||
c2nl(b,l); *(q++)=l;
|
||||
}
|
||||
#endif
|
||||
sha_block(c,p,64);
|
||||
}
|
||||
|
||||
void sha_block(c, W, num)
|
||||
SHA_CTX *c;
|
||||
const u_int32_t *W;
|
||||
int num;
|
||||
{
|
||||
register u_int32_t A,B,C,D,E,T;
|
||||
u_int32_t X[16];
|
||||
|
||||
A=c->h0;
|
||||
B=c->h1;
|
||||
C=c->h2;
|
||||
D=c->h3;
|
||||
E=c->h4;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
BODY_00_15( 0,A,B,C,D,E,T,W);
|
||||
BODY_00_15( 1,T,A,B,C,D,E,W);
|
||||
BODY_00_15( 2,E,T,A,B,C,D,W);
|
||||
BODY_00_15( 3,D,E,T,A,B,C,W);
|
||||
BODY_00_15( 4,C,D,E,T,A,B,W);
|
||||
BODY_00_15( 5,B,C,D,E,T,A,W);
|
||||
BODY_00_15( 6,A,B,C,D,E,T,W);
|
||||
BODY_00_15( 7,T,A,B,C,D,E,W);
|
||||
BODY_00_15( 8,E,T,A,B,C,D,W);
|
||||
BODY_00_15( 9,D,E,T,A,B,C,W);
|
||||
BODY_00_15(10,C,D,E,T,A,B,W);
|
||||
BODY_00_15(11,B,C,D,E,T,A,W);
|
||||
BODY_00_15(12,A,B,C,D,E,T,W);
|
||||
BODY_00_15(13,T,A,B,C,D,E,W);
|
||||
BODY_00_15(14,E,T,A,B,C,D,W);
|
||||
BODY_00_15(15,D,E,T,A,B,C,W);
|
||||
BODY_16_19(16,C,D,E,T,A,B,W,W,W,W);
|
||||
BODY_16_19(17,B,C,D,E,T,A,W,W,W,W);
|
||||
BODY_16_19(18,A,B,C,D,E,T,W,W,W,W);
|
||||
BODY_16_19(19,T,A,B,C,D,E,W,W,W,X);
|
||||
|
||||
BODY_20_31(20,E,T,A,B,C,D,W,W,W,X);
|
||||
BODY_20_31(21,D,E,T,A,B,C,W,W,W,X);
|
||||
BODY_20_31(22,C,D,E,T,A,B,W,W,W,X);
|
||||
BODY_20_31(23,B,C,D,E,T,A,W,W,W,X);
|
||||
BODY_20_31(24,A,B,C,D,E,T,W,W,X,X);
|
||||
BODY_20_31(25,T,A,B,C,D,E,W,W,X,X);
|
||||
BODY_20_31(26,E,T,A,B,C,D,W,W,X,X);
|
||||
BODY_20_31(27,D,E,T,A,B,C,W,W,X,X);
|
||||
BODY_20_31(28,C,D,E,T,A,B,W,W,X,X);
|
||||
BODY_20_31(29,B,C,D,E,T,A,W,W,X,X);
|
||||
BODY_20_31(30,A,B,C,D,E,T,W,X,X,X);
|
||||
BODY_20_31(31,T,A,B,C,D,E,W,X,X,X);
|
||||
BODY_32_39(32,E,T,A,B,C,D,X);
|
||||
BODY_32_39(33,D,E,T,A,B,C,X);
|
||||
BODY_32_39(34,C,D,E,T,A,B,X);
|
||||
BODY_32_39(35,B,C,D,E,T,A,X);
|
||||
BODY_32_39(36,A,B,C,D,E,T,X);
|
||||
BODY_32_39(37,T,A,B,C,D,E,X);
|
||||
BODY_32_39(38,E,T,A,B,C,D,X);
|
||||
BODY_32_39(39,D,E,T,A,B,C,X);
|
||||
|
||||
BODY_40_59(40,C,D,E,T,A,B,X);
|
||||
BODY_40_59(41,B,C,D,E,T,A,X);
|
||||
BODY_40_59(42,A,B,C,D,E,T,X);
|
||||
BODY_40_59(43,T,A,B,C,D,E,X);
|
||||
BODY_40_59(44,E,T,A,B,C,D,X);
|
||||
BODY_40_59(45,D,E,T,A,B,C,X);
|
||||
BODY_40_59(46,C,D,E,T,A,B,X);
|
||||
BODY_40_59(47,B,C,D,E,T,A,X);
|
||||
BODY_40_59(48,A,B,C,D,E,T,X);
|
||||
BODY_40_59(49,T,A,B,C,D,E,X);
|
||||
BODY_40_59(50,E,T,A,B,C,D,X);
|
||||
BODY_40_59(51,D,E,T,A,B,C,X);
|
||||
BODY_40_59(52,C,D,E,T,A,B,X);
|
||||
BODY_40_59(53,B,C,D,E,T,A,X);
|
||||
BODY_40_59(54,A,B,C,D,E,T,X);
|
||||
BODY_40_59(55,T,A,B,C,D,E,X);
|
||||
BODY_40_59(56,E,T,A,B,C,D,X);
|
||||
BODY_40_59(57,D,E,T,A,B,C,X);
|
||||
BODY_40_59(58,C,D,E,T,A,B,X);
|
||||
BODY_40_59(59,B,C,D,E,T,A,X);
|
||||
|
||||
BODY_60_79(60,A,B,C,D,E,T,X);
|
||||
BODY_60_79(61,T,A,B,C,D,E,X);
|
||||
BODY_60_79(62,E,T,A,B,C,D,X);
|
||||
BODY_60_79(63,D,E,T,A,B,C,X);
|
||||
BODY_60_79(64,C,D,E,T,A,B,X);
|
||||
BODY_60_79(65,B,C,D,E,T,A,X);
|
||||
BODY_60_79(66,A,B,C,D,E,T,X);
|
||||
BODY_60_79(67,T,A,B,C,D,E,X);
|
||||
BODY_60_79(68,E,T,A,B,C,D,X);
|
||||
BODY_60_79(69,D,E,T,A,B,C,X);
|
||||
BODY_60_79(70,C,D,E,T,A,B,X);
|
||||
BODY_60_79(71,B,C,D,E,T,A,X);
|
||||
BODY_60_79(72,A,B,C,D,E,T,X);
|
||||
BODY_60_79(73,T,A,B,C,D,E,X);
|
||||
BODY_60_79(74,E,T,A,B,C,D,X);
|
||||
BODY_60_79(75,D,E,T,A,B,C,X);
|
||||
BODY_60_79(76,C,D,E,T,A,B,X);
|
||||
BODY_60_79(77,B,C,D,E,T,A,X);
|
||||
BODY_60_79(78,A,B,C,D,E,T,X);
|
||||
BODY_60_79(79,T,A,B,C,D,E,X);
|
||||
|
||||
c->h0=(c->h0+E)&0xffffffffL;
|
||||
c->h1=(c->h1+T)&0xffffffffL;
|
||||
c->h2=(c->h2+A)&0xffffffffL;
|
||||
c->h3=(c->h3+B)&0xffffffffL;
|
||||
c->h4=(c->h4+C)&0xffffffffL;
|
||||
|
||||
num-=64;
|
||||
if (num <= 0) break;
|
||||
|
||||
A=c->h0;
|
||||
B=c->h1;
|
||||
C=c->h2;
|
||||
D=c->h3;
|
||||
E=c->h4;
|
||||
|
||||
W+=16;
|
||||
}
|
||||
}
|
||||
|
||||
void SHA_Final(md, c)
|
||||
unsigned char *md;
|
||||
SHA_CTX *c;
|
||||
{
|
||||
register int i,j;
|
||||
register u_int32_t l;
|
||||
register u_int32_t *p;
|
||||
static unsigned char end[4]={0x80,0x00,0x00,0x00};
|
||||
unsigned char *cp=end;
|
||||
|
||||
/* c->num should definitly have room for at least one more byte. */
|
||||
p=c->data;
|
||||
j=c->num;
|
||||
i=j>>2;
|
||||
#ifdef PURIFY
|
||||
if ((j&0x03) == 0) p[i]=0;
|
||||
#endif
|
||||
l=p[i];
|
||||
M_p_c2nl(cp,l,j&0x03);
|
||||
p[i]=l;
|
||||
i++;
|
||||
/* i is the next 'undefined word' */
|
||||
if (c->num >= SHA_LAST_BLOCK)
|
||||
{
|
||||
for (; i<SHA_LBLOCK; i++)
|
||||
p[i]=0;
|
||||
sha_block(c,p,64);
|
||||
i=0;
|
||||
}
|
||||
for (; i<(SHA_LBLOCK-2); i++)
|
||||
p[i]=0;
|
||||
p[SHA_LBLOCK-2]=c->Nh;
|
||||
p[SHA_LBLOCK-1]=c->Nl;
|
||||
sha_block(c,p,64);
|
||||
cp=md;
|
||||
l=c->h0; nl2c(l,cp);
|
||||
l=c->h1; nl2c(l,cp);
|
||||
l=c->h2; nl2c(l,cp);
|
||||
l=c->h3; nl2c(l,cp);
|
||||
l=c->h4; nl2c(l,cp);
|
||||
|
||||
/* clear stuff, sha_block may be leaving some stuff on the stack
|
||||
* but I'm not worried :-) */
|
||||
c->num=0;
|
||||
/* memset((char *)&c,0,sizeof(c));*/
|
||||
}
|
||||
|
486
lib/libmd/sha1c.c
Normal file
486
lib/libmd/sha1c.c
Normal file
@ -0,0 +1,486 @@
|
||||
/* crypto/sha/sha1dgst.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#if 0
|
||||
#include <machine/ansi.h> /* we use the __ variants of bit-sized types */
|
||||
#endif
|
||||
#include <machine/endian.h>
|
||||
|
||||
#undef SHA_0
|
||||
#define SHA_1
|
||||
#include "sha.h"
|
||||
#include "sha_locl.h"
|
||||
|
||||
/*
|
||||
* The assembly-language code is not position-independent, so don't
|
||||
* try to use it in a shared library.
|
||||
*/
|
||||
#ifdef PIC
|
||||
#undef SHA1_ASM
|
||||
#endif
|
||||
|
||||
char *SHA1_version="SHA1 part of SSLeay 0.9.0b 11-Oct-1998";
|
||||
|
||||
/* Implemented from SHA-1 document - The Secure Hash Algorithm
|
||||
*/
|
||||
|
||||
#define INIT_DATA_h0 (unsigned long)0x67452301L
|
||||
#define INIT_DATA_h1 (unsigned long)0xefcdab89L
|
||||
#define INIT_DATA_h2 (unsigned long)0x98badcfeL
|
||||
#define INIT_DATA_h3 (unsigned long)0x10325476L
|
||||
#define INIT_DATA_h4 (unsigned long)0xc3d2e1f0L
|
||||
|
||||
#define K_00_19 0x5a827999L
|
||||
#define K_20_39 0x6ed9eba1L
|
||||
#define K_40_59 0x8f1bbcdcL
|
||||
#define K_60_79 0xca62c1d6L
|
||||
|
||||
#ifndef NOPROTO
|
||||
# ifdef SHA1_ASM
|
||||
void sha1_block_x86(SHA_CTX *c, const u_int32_t *p, int num);
|
||||
# define sha1_block sha1_block_x86
|
||||
# else
|
||||
void sha1_block(SHA_CTX *c, const u_int32_t *p, int num);
|
||||
# endif
|
||||
#else
|
||||
# ifdef SHA1_ASM
|
||||
void sha1_block_x86();
|
||||
# define sha1_block sha1_block_x86
|
||||
# else
|
||||
void sha1_block();
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN && defined(SHA1_ASM)
|
||||
# define M_c2nl c2l
|
||||
# define M_p_c2nl p_c2l
|
||||
# define M_c2nl_p c2l_p
|
||||
# define M_p_c2nl_p p_c2l_p
|
||||
# define M_nl2c l2c
|
||||
#else
|
||||
# define M_c2nl c2nl
|
||||
# define M_p_c2nl p_c2nl
|
||||
# define M_c2nl_p c2nl_p
|
||||
# define M_p_c2nl_p p_c2nl_p
|
||||
# define M_nl2c nl2c
|
||||
#endif
|
||||
|
||||
void SHA1_Init(c)
|
||||
SHA_CTX *c;
|
||||
{
|
||||
c->h0=INIT_DATA_h0;
|
||||
c->h1=INIT_DATA_h1;
|
||||
c->h2=INIT_DATA_h2;
|
||||
c->h3=INIT_DATA_h3;
|
||||
c->h4=INIT_DATA_h4;
|
||||
c->Nl=0;
|
||||
c->Nh=0;
|
||||
c->num=0;
|
||||
}
|
||||
|
||||
void
|
||||
SHA1_Update(c, data, len)
|
||||
SHA_CTX *c;
|
||||
const unsigned char *data;
|
||||
unsigned long len;
|
||||
{
|
||||
register u_int32_t *p;
|
||||
int ew,ec,sw,sc;
|
||||
u_int32_t l;
|
||||
|
||||
if (len == 0) return;
|
||||
|
||||
l=(c->Nl+(len<<3))&0xffffffffL;
|
||||
if (l < c->Nl) /* overflow */
|
||||
c->Nh++;
|
||||
c->Nh+=(len>>29);
|
||||
c->Nl=l;
|
||||
|
||||
if (c->num != 0)
|
||||
{
|
||||
p=c->data;
|
||||
sw=c->num>>2;
|
||||
sc=c->num&0x03;
|
||||
|
||||
if ((c->num+len) >= SHA_CBLOCK)
|
||||
{
|
||||
l= p[sw];
|
||||
M_p_c2nl(data,l,sc);
|
||||
p[sw++]=l;
|
||||
for (; sw<SHA_LBLOCK; sw++)
|
||||
{
|
||||
M_c2nl(data,l);
|
||||
p[sw]=l;
|
||||
}
|
||||
len-=(SHA_CBLOCK-c->num);
|
||||
|
||||
sha1_block(c,p,64);
|
||||
c->num=0;
|
||||
/* drop through and do the rest */
|
||||
}
|
||||
else
|
||||
{
|
||||
c->num+=(int)len;
|
||||
if ((sc+len) < 4) /* ugly, add char's to a word */
|
||||
{
|
||||
l= p[sw];
|
||||
M_p_c2nl_p(data,l,sc,len);
|
||||
p[sw]=l;
|
||||
}
|
||||
else
|
||||
{
|
||||
ew=(c->num>>2);
|
||||
ec=(c->num&0x03);
|
||||
l= p[sw];
|
||||
M_p_c2nl(data,l,sc);
|
||||
p[sw++]=l;
|
||||
for (; sw < ew; sw++)
|
||||
{ M_c2nl(data,l); p[sw]=l; }
|
||||
if (ec)
|
||||
{
|
||||
M_c2nl_p(data,l,ec);
|
||||
p[sw]=l;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* We can only do the following code for assember, the reason
|
||||
* being that the sha1_block 'C' version changes the values
|
||||
* in the 'data' array. The assember code avoids this and
|
||||
* copies it to a local array. I should be able to do this for
|
||||
* the C version as well....
|
||||
*/
|
||||
#if 1
|
||||
#if BYTE_ORDER == BIG_ENDIAN || defined(SHA1_ASM)
|
||||
if ((((unsigned int)data)%sizeof(u_int32_t)) == 0)
|
||||
{
|
||||
sw=len/SHA_CBLOCK;
|
||||
if (sw)
|
||||
{
|
||||
sw*=SHA_CBLOCK;
|
||||
sha1_block(c,(u_int32_t *)data,sw);
|
||||
data+=sw;
|
||||
len-=sw;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
/* we now can process the input data in blocks of SHA_CBLOCK
|
||||
* chars and save the leftovers to c->data. */
|
||||
p=c->data;
|
||||
while (len >= SHA_CBLOCK)
|
||||
{
|
||||
#if BYTE_ORDER == BIG_ENDIAN || BYTE_ORDER == LITTLE_ENDIAN
|
||||
if (p != (u_int32_t *)data)
|
||||
memcpy(p,data,SHA_CBLOCK);
|
||||
data+=SHA_CBLOCK;
|
||||
# if BYTE_ORDER == LITTLE_ENDIAN
|
||||
# ifndef SHA1_ASM /* Will not happen */
|
||||
for (sw=(SHA_LBLOCK/4); sw; sw--)
|
||||
{
|
||||
Endian_Reverse32(p[0]);
|
||||
Endian_Reverse32(p[1]);
|
||||
Endian_Reverse32(p[2]);
|
||||
Endian_Reverse32(p[3]);
|
||||
p+=4;
|
||||
}
|
||||
p=c->data;
|
||||
# endif
|
||||
# endif
|
||||
#else
|
||||
for (sw=(SHA_BLOCK/4); sw; sw--)
|
||||
{
|
||||
M_c2nl(data,l); *(p++)=l;
|
||||
M_c2nl(data,l); *(p++)=l;
|
||||
M_c2nl(data,l); *(p++)=l;
|
||||
M_c2nl(data,l); *(p++)=l;
|
||||
}
|
||||
p=c->data;
|
||||
#endif
|
||||
sha1_block(c,p,64);
|
||||
len-=SHA_CBLOCK;
|
||||
}
|
||||
ec=(int)len;
|
||||
c->num=ec;
|
||||
ew=(ec>>2);
|
||||
ec&=0x03;
|
||||
|
||||
for (sw=0; sw < ew; sw++)
|
||||
{ M_c2nl(data,l); p[sw]=l; }
|
||||
M_c2nl_p(data,l,ec);
|
||||
p[sw]=l;
|
||||
}
|
||||
|
||||
void SHA1_Transform(c,b)
|
||||
SHA_CTX *c;
|
||||
unsigned char *b;
|
||||
{
|
||||
u_int32_t p[16];
|
||||
#if BYTE_ORDER != BIG_ENDIAN
|
||||
u_int32_t *q;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#if BYTE_ORDER == BIG_ENDIAN || BYTE_ORDER == LITTLE_ENDIAN
|
||||
memcpy(p,b,64);
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||
q=p;
|
||||
for (i=(SHA_LBLOCK/4); i; i--)
|
||||
{
|
||||
Endian_Reverse32(q[0]);
|
||||
Endian_Reverse32(q[1]);
|
||||
Endian_Reverse32(q[2]);
|
||||
Endian_Reverse32(q[3]);
|
||||
q+=4;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
q=p;
|
||||
for (i=(SHA_LBLOCK/4); i; i--)
|
||||
{
|
||||
u_int32_t l;
|
||||
c2nl(b,l); *(q++)=l;
|
||||
c2nl(b,l); *(q++)=l;
|
||||
c2nl(b,l); *(q++)=l;
|
||||
c2nl(b,l); *(q++)=l;
|
||||
}
|
||||
#endif
|
||||
sha1_block(c,p,64);
|
||||
}
|
||||
|
||||
#ifndef SHA1_ASM
|
||||
|
||||
void
|
||||
sha1_block(c, W, num)
|
||||
SHA_CTX *c;
|
||||
const u_int32_t *W;
|
||||
int num;
|
||||
{
|
||||
register u_int32_t A,B,C,D,E,T;
|
||||
u_int32_t X[16];
|
||||
|
||||
A=c->h0;
|
||||
B=c->h1;
|
||||
C=c->h2;
|
||||
D=c->h3;
|
||||
E=c->h4;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
BODY_00_15( 0,A,B,C,D,E,T,W);
|
||||
BODY_00_15( 1,T,A,B,C,D,E,W);
|
||||
BODY_00_15( 2,E,T,A,B,C,D,W);
|
||||
BODY_00_15( 3,D,E,T,A,B,C,W);
|
||||
BODY_00_15( 4,C,D,E,T,A,B,W);
|
||||
BODY_00_15( 5,B,C,D,E,T,A,W);
|
||||
BODY_00_15( 6,A,B,C,D,E,T,W);
|
||||
BODY_00_15( 7,T,A,B,C,D,E,W);
|
||||
BODY_00_15( 8,E,T,A,B,C,D,W);
|
||||
BODY_00_15( 9,D,E,T,A,B,C,W);
|
||||
BODY_00_15(10,C,D,E,T,A,B,W);
|
||||
BODY_00_15(11,B,C,D,E,T,A,W);
|
||||
BODY_00_15(12,A,B,C,D,E,T,W);
|
||||
BODY_00_15(13,T,A,B,C,D,E,W);
|
||||
BODY_00_15(14,E,T,A,B,C,D,W);
|
||||
BODY_00_15(15,D,E,T,A,B,C,W);
|
||||
BODY_16_19(16,C,D,E,T,A,B,W,W,W,W);
|
||||
BODY_16_19(17,B,C,D,E,T,A,W,W,W,W);
|
||||
BODY_16_19(18,A,B,C,D,E,T,W,W,W,W);
|
||||
BODY_16_19(19,T,A,B,C,D,E,W,W,W,X);
|
||||
|
||||
BODY_20_31(20,E,T,A,B,C,D,W,W,W,X);
|
||||
BODY_20_31(21,D,E,T,A,B,C,W,W,W,X);
|
||||
BODY_20_31(22,C,D,E,T,A,B,W,W,W,X);
|
||||
BODY_20_31(23,B,C,D,E,T,A,W,W,W,X);
|
||||
BODY_20_31(24,A,B,C,D,E,T,W,W,X,X);
|
||||
BODY_20_31(25,T,A,B,C,D,E,W,W,X,X);
|
||||
BODY_20_31(26,E,T,A,B,C,D,W,W,X,X);
|
||||
BODY_20_31(27,D,E,T,A,B,C,W,W,X,X);
|
||||
BODY_20_31(28,C,D,E,T,A,B,W,W,X,X);
|
||||
BODY_20_31(29,B,C,D,E,T,A,W,W,X,X);
|
||||
BODY_20_31(30,A,B,C,D,E,T,W,X,X,X);
|
||||
BODY_20_31(31,T,A,B,C,D,E,W,X,X,X);
|
||||
BODY_32_39(32,E,T,A,B,C,D,X);
|
||||
BODY_32_39(33,D,E,T,A,B,C,X);
|
||||
BODY_32_39(34,C,D,E,T,A,B,X);
|
||||
BODY_32_39(35,B,C,D,E,T,A,X);
|
||||
BODY_32_39(36,A,B,C,D,E,T,X);
|
||||
BODY_32_39(37,T,A,B,C,D,E,X);
|
||||
BODY_32_39(38,E,T,A,B,C,D,X);
|
||||
BODY_32_39(39,D,E,T,A,B,C,X);
|
||||
|
||||
BODY_40_59(40,C,D,E,T,A,B,X);
|
||||
BODY_40_59(41,B,C,D,E,T,A,X);
|
||||
BODY_40_59(42,A,B,C,D,E,T,X);
|
||||
BODY_40_59(43,T,A,B,C,D,E,X);
|
||||
BODY_40_59(44,E,T,A,B,C,D,X);
|
||||
BODY_40_59(45,D,E,T,A,B,C,X);
|
||||
BODY_40_59(46,C,D,E,T,A,B,X);
|
||||
BODY_40_59(47,B,C,D,E,T,A,X);
|
||||
BODY_40_59(48,A,B,C,D,E,T,X);
|
||||
BODY_40_59(49,T,A,B,C,D,E,X);
|
||||
BODY_40_59(50,E,T,A,B,C,D,X);
|
||||
BODY_40_59(51,D,E,T,A,B,C,X);
|
||||
BODY_40_59(52,C,D,E,T,A,B,X);
|
||||
BODY_40_59(53,B,C,D,E,T,A,X);
|
||||
BODY_40_59(54,A,B,C,D,E,T,X);
|
||||
BODY_40_59(55,T,A,B,C,D,E,X);
|
||||
BODY_40_59(56,E,T,A,B,C,D,X);
|
||||
BODY_40_59(57,D,E,T,A,B,C,X);
|
||||
BODY_40_59(58,C,D,E,T,A,B,X);
|
||||
BODY_40_59(59,B,C,D,E,T,A,X);
|
||||
|
||||
BODY_60_79(60,A,B,C,D,E,T,X);
|
||||
BODY_60_79(61,T,A,B,C,D,E,X);
|
||||
BODY_60_79(62,E,T,A,B,C,D,X);
|
||||
BODY_60_79(63,D,E,T,A,B,C,X);
|
||||
BODY_60_79(64,C,D,E,T,A,B,X);
|
||||
BODY_60_79(65,B,C,D,E,T,A,X);
|
||||
BODY_60_79(66,A,B,C,D,E,T,X);
|
||||
BODY_60_79(67,T,A,B,C,D,E,X);
|
||||
BODY_60_79(68,E,T,A,B,C,D,X);
|
||||
BODY_60_79(69,D,E,T,A,B,C,X);
|
||||
BODY_60_79(70,C,D,E,T,A,B,X);
|
||||
BODY_60_79(71,B,C,D,E,T,A,X);
|
||||
BODY_60_79(72,A,B,C,D,E,T,X);
|
||||
BODY_60_79(73,T,A,B,C,D,E,X);
|
||||
BODY_60_79(74,E,T,A,B,C,D,X);
|
||||
BODY_60_79(75,D,E,T,A,B,C,X);
|
||||
BODY_60_79(76,C,D,E,T,A,B,X);
|
||||
BODY_60_79(77,B,C,D,E,T,A,X);
|
||||
BODY_60_79(78,A,B,C,D,E,T,X);
|
||||
BODY_60_79(79,T,A,B,C,D,E,X);
|
||||
|
||||
c->h0=(c->h0+E)&0xffffffffL;
|
||||
c->h1=(c->h1+T)&0xffffffffL;
|
||||
c->h2=(c->h2+A)&0xffffffffL;
|
||||
c->h3=(c->h3+B)&0xffffffffL;
|
||||
c->h4=(c->h4+C)&0xffffffffL;
|
||||
|
||||
num-=64;
|
||||
if (num <= 0) break;
|
||||
|
||||
A=c->h0;
|
||||
B=c->h1;
|
||||
C=c->h2;
|
||||
D=c->h3;
|
||||
E=c->h4;
|
||||
|
||||
W+=16;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void SHA1_Final(md, c)
|
||||
unsigned char *md;
|
||||
SHA_CTX *c;
|
||||
{
|
||||
register int i,j;
|
||||
register u_int32_t l;
|
||||
register u_int32_t *p;
|
||||
static unsigned char end[4]={0x80,0x00,0x00,0x00};
|
||||
unsigned char *cp=end;
|
||||
|
||||
/* c->num should definitly have room for at least one more byte. */
|
||||
p=c->data;
|
||||
j=c->num;
|
||||
i=j>>2;
|
||||
#ifdef PURIFY
|
||||
if ((j&0x03) == 0) p[i]=0;
|
||||
#endif
|
||||
l=p[i];
|
||||
M_p_c2nl(cp,l,j&0x03);
|
||||
p[i]=l;
|
||||
i++;
|
||||
/* i is the next 'undefined word' */
|
||||
if (c->num >= SHA_LAST_BLOCK)
|
||||
{
|
||||
for (; i<SHA_LBLOCK; i++)
|
||||
p[i]=0;
|
||||
sha1_block(c,p,64);
|
||||
i=0;
|
||||
}
|
||||
for (; i<(SHA_LBLOCK-2); i++)
|
||||
p[i]=0;
|
||||
p[SHA_LBLOCK-2]=c->Nh;
|
||||
p[SHA_LBLOCK-1]=c->Nl;
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN && defined(SHA1_ASM)
|
||||
Endian_Reverse32(p[SHA_LBLOCK-2]);
|
||||
Endian_Reverse32(p[SHA_LBLOCK-1]);
|
||||
#endif
|
||||
sha1_block(c,p,64);
|
||||
cp=md;
|
||||
l=c->h0; nl2c(l,cp);
|
||||
l=c->h1; nl2c(l,cp);
|
||||
l=c->h2; nl2c(l,cp);
|
||||
l=c->h3; nl2c(l,cp);
|
||||
l=c->h4; nl2c(l,cp);
|
||||
|
||||
/* clear stuff, sha1_block may be leaving some stuff on the stack
|
||||
* but I'm not worried :-) */
|
||||
c->num=0;
|
||||
/* memset((char *)&c,0,sizeof(c));*/
|
||||
}
|
||||
|
243
lib/libmd/sha_locl.h
Normal file
243
lib/libmd/sha_locl.h
Normal file
@ -0,0 +1,243 @@
|
||||
/* crypto/sha/sha_locl.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#ifdef undef
|
||||
/* one or the other needs to be defined */
|
||||
#ifndef SHA_1 /* FIPE 180-1 */
|
||||
#define SHA_0 /* FIPS 180 */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define ULONG unsigned long
|
||||
#define UCHAR unsigned char
|
||||
#define UINT unsigned int
|
||||
|
||||
#ifdef NOCONST
|
||||
#define const
|
||||
#endif
|
||||
|
||||
#undef c2nl
|
||||
#define c2nl(c,l) (l =(((unsigned long)(*((c)++)))<<24), \
|
||||
l|=(((unsigned long)(*((c)++)))<<16), \
|
||||
l|=(((unsigned long)(*((c)++)))<< 8), \
|
||||
l|=(((unsigned long)(*((c)++))) ))
|
||||
|
||||
#undef p_c2nl
|
||||
#define p_c2nl(c,l,n) { \
|
||||
switch (n) { \
|
||||
case 0: l =((unsigned long)(*((c)++)))<<24; \
|
||||
case 1: l|=((unsigned long)(*((c)++)))<<16; \
|
||||
case 2: l|=((unsigned long)(*((c)++)))<< 8; \
|
||||
case 3: l|=((unsigned long)(*((c)++))); \
|
||||
} \
|
||||
}
|
||||
|
||||
#undef c2nl_p
|
||||
/* NOTE the pointer is not incremented at the end of this */
|
||||
#define c2nl_p(c,l,n) { \
|
||||
l=0; \
|
||||
(c)+=n; \
|
||||
switch (n) { \
|
||||
case 3: l =((unsigned long)(*(--(c))))<< 8; \
|
||||
case 2: l|=((unsigned long)(*(--(c))))<<16; \
|
||||
case 1: l|=((unsigned long)(*(--(c))))<<24; \
|
||||
} \
|
||||
}
|
||||
|
||||
#undef p_c2nl_p
|
||||
#define p_c2nl_p(c,l,sc,len) { \
|
||||
switch (sc) \
|
||||
{ \
|
||||
case 0: l =((unsigned long)(*((c)++)))<<24; \
|
||||
if (--len == 0) break; \
|
||||
case 1: l|=((unsigned long)(*((c)++)))<<16; \
|
||||
if (--len == 0) break; \
|
||||
case 2: l|=((unsigned long)(*((c)++)))<< 8; \
|
||||
} \
|
||||
}
|
||||
|
||||
#undef nl2c
|
||||
#define nl2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l) )&0xff))
|
||||
|
||||
#undef c2l
|
||||
#define c2l(c,l) (l =(((unsigned long)(*((c)++))) ), \
|
||||
l|=(((unsigned long)(*((c)++)))<< 8), \
|
||||
l|=(((unsigned long)(*((c)++)))<<16), \
|
||||
l|=(((unsigned long)(*((c)++)))<<24))
|
||||
|
||||
#undef p_c2l
|
||||
#define p_c2l(c,l,n) { \
|
||||
switch (n) { \
|
||||
case 0: l =((unsigned long)(*((c)++))); \
|
||||
case 1: l|=((unsigned long)(*((c)++)))<< 8; \
|
||||
case 2: l|=((unsigned long)(*((c)++)))<<16; \
|
||||
case 3: l|=((unsigned long)(*((c)++)))<<24; \
|
||||
} \
|
||||
}
|
||||
|
||||
#undef c2l_p
|
||||
/* NOTE the pointer is not incremented at the end of this */
|
||||
#define c2l_p(c,l,n) { \
|
||||
l=0; \
|
||||
(c)+=n; \
|
||||
switch (n) { \
|
||||
case 3: l =((unsigned long)(*(--(c))))<<16; \
|
||||
case 2: l|=((unsigned long)(*(--(c))))<< 8; \
|
||||
case 1: l|=((unsigned long)(*(--(c)))); \
|
||||
} \
|
||||
}
|
||||
|
||||
#undef p_c2l_p
|
||||
#define p_c2l_p(c,l,sc,len) { \
|
||||
switch (sc) \
|
||||
{ \
|
||||
case 0: l =((unsigned long)(*((c)++))); \
|
||||
if (--len == 0) break; \
|
||||
case 1: l|=((unsigned long)(*((c)++)))<< 8; \
|
||||
if (--len == 0) break; \
|
||||
case 2: l|=((unsigned long)(*((c)++)))<<16; \
|
||||
} \
|
||||
}
|
||||
|
||||
#undef l2c
|
||||
#define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>>24)&0xff))
|
||||
|
||||
#undef ROTATE
|
||||
#if defined(WIN32)
|
||||
#define ROTATE(a,n) _lrotl(a,n)
|
||||
#else
|
||||
#define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
|
||||
#endif
|
||||
|
||||
/* A nice byte order reversal from Wei Dai <weidai@eskimo.com> */
|
||||
#if defined(WIN32)
|
||||
/* 5 instructions with rotate instruction, else 9 */
|
||||
#define Endian_Reverse32(a) \
|
||||
{ \
|
||||
unsigned long l=(a); \
|
||||
(a)=((ROTATE(l,8)&0x00FF00FF)|(ROTATE(l,24)&0xFF00FF00)); \
|
||||
}
|
||||
#else
|
||||
/* 6 instructions with rotate instruction, else 8 */
|
||||
#define Endian_Reverse32(a) \
|
||||
{ \
|
||||
unsigned long l=(a); \
|
||||
l=(((l&0xFF00FF00)>>8L)|((l&0x00FF00FF)<<8L)); \
|
||||
(a)=ROTATE(l,16L); \
|
||||
}
|
||||
#endif
|
||||
|
||||
/* As pointed out by Wei Dai <weidai@eskimo.com>, F() below can be
|
||||
* simplified to the code in F_00_19. Wei attributes these optimisations
|
||||
* to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel.
|
||||
* #define F(x,y,z) (((x) & (y)) | ((~(x)) & (z)))
|
||||
* I've just become aware of another tweak to be made, again from Wei Dai,
|
||||
* in F_40_59, (x&a)|(y&a) -> (x|y)&a
|
||||
*/
|
||||
#define F_00_19(b,c,d) ((((c) ^ (d)) & (b)) ^ (d))
|
||||
#define F_20_39(b,c,d) ((b) ^ (c) ^ (d))
|
||||
#define F_40_59(b,c,d) (((b) & (c)) | (((b)|(c)) & (d)))
|
||||
#define F_60_79(b,c,d) F_20_39(b,c,d)
|
||||
|
||||
#ifdef SHA_0
|
||||
#undef Xupdate
|
||||
#define Xupdate(a,i,ia,ib,ic,id) X[(i)&0x0f]=(a)=\
|
||||
(ia[(i)&0x0f]^ib[((i)+2)&0x0f]^ic[((i)+8)&0x0f]^id[((i)+13)&0x0f]);
|
||||
#endif
|
||||
#ifdef SHA_1
|
||||
#undef Xupdate
|
||||
#define Xupdate(a,i,ia,ib,ic,id) (a)=\
|
||||
(ia[(i)&0x0f]^ib[((i)+2)&0x0f]^ic[((i)+8)&0x0f]^id[((i)+13)&0x0f]);\
|
||||
X[(i)&0x0f]=(a)=ROTATE((a),1);
|
||||
#endif
|
||||
|
||||
#define BODY_00_15(i,a,b,c,d,e,f,xa) \
|
||||
(f)=xa[i]+(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \
|
||||
(b)=ROTATE((b),30);
|
||||
|
||||
#define BODY_16_19(i,a,b,c,d,e,f,xa,xb,xc,xd) \
|
||||
Xupdate(f,i,xa,xb,xc,xd); \
|
||||
(f)+=(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \
|
||||
(b)=ROTATE((b),30);
|
||||
|
||||
#define BODY_20_31(i,a,b,c,d,e,f,xa,xb,xc,xd) \
|
||||
Xupdate(f,i,xa,xb,xc,xd); \
|
||||
(f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \
|
||||
(b)=ROTATE((b),30);
|
||||
|
||||
#define BODY_32_39(i,a,b,c,d,e,f,xa) \
|
||||
Xupdate(f,i,xa,xa,xa,xa); \
|
||||
(f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \
|
||||
(b)=ROTATE((b),30);
|
||||
|
||||
#define BODY_40_59(i,a,b,c,d,e,f,xa) \
|
||||
Xupdate(f,i,xa,xa,xa,xa); \
|
||||
(f)+=(e)+K_40_59+ROTATE((a),5)+F_40_59((b),(c),(d)); \
|
||||
(b)=ROTATE((b),30);
|
||||
|
||||
#define BODY_60_79(i,a,b,c,d,e,f,xa) \
|
||||
Xupdate(f,i,xa,xa,xa,xa); \
|
||||
(f)=X[(i)&0x0f]+(e)+K_60_79+ROTATE((a),5)+F_60_79((b),(c),(d)); \
|
||||
(b)=ROTATE((b),30);
|
||||
|
61
lib/libmd/shadriver.c
Normal file
61
lib/libmd/shadriver.c
Normal file
@ -0,0 +1,61 @@
|
||||
/* SHADRIVER.C - test driver for SHA-1 (and SHA-0)
|
||||
* $Id: mddriver.c,v 1.4 1997/08/25 05:24:26 joerg Exp $
|
||||
*/
|
||||
|
||||
/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
|
||||
rights reserved.
|
||||
|
||||
RSA Data Security, Inc. makes no representations concerning either
|
||||
the merchantability of this software or the suitability of this
|
||||
software for any particular purpose. It is provided "as is"
|
||||
without express or implied warranty of any kind.
|
||||
|
||||
These notices must be retained in any copies of any part of this
|
||||
documentation and/or software.
|
||||
*/
|
||||
|
||||
/* The following makes SHA default to SHA-1 if it has not already been
|
||||
defined with C compiler flags.
|
||||
*/
|
||||
#ifndef SHA
|
||||
#define SHA 1
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
#include "sha.h"
|
||||
#if SHA == 1
|
||||
#define SHA_Data SHA1_Data
|
||||
#endif
|
||||
|
||||
/* Digests a string and prints the result.
|
||||
*/
|
||||
static void SHAString (string)
|
||||
char *string;
|
||||
{
|
||||
char buf[2*20+1];
|
||||
|
||||
printf ("SHA-%d (\"%s\") = %s\n",
|
||||
SHA, string, SHA_Data(string,strlen(string),buf));
|
||||
}
|
||||
|
||||
/* Digests a reference suite of strings and prints the results.
|
||||
*/
|
||||
main()
|
||||
{
|
||||
printf ("SHA-%d test suite:\n", SHA);
|
||||
|
||||
SHAString ("");
|
||||
SHAString ("abc");
|
||||
SHAString ("message digest");
|
||||
SHAString ("abcdefghijklmnopqrstuvwxyz");
|
||||
SHAString
|
||||
("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
|
||||
SHAString
|
||||
("1234567890123456789012345678901234567890\
|
||||
1234567890123456789012345678901234567890");
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user