[kaffe] CVS kaffe (dalibor): Added the moved sha-1 files

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Mon May 24 11:09:04 2004


PatchSet 4780 
Date: 2004/05/24 18:02:54
Author: dalibor
Branch: HEAD
Tag: (none) 
Log:
Added the moved sha-1 files

Members: 
	libraries/clib/security/sha-1.c:INITIAL->1.1 
	libraries/clib/security/sha-1.h:INITIAL->1.1 

===================================================================
Checking out kaffe/libraries/clib/security/sha-1.c
RCS:  /home/cvs/kaffe/kaffe/libraries/clib/security/sha-1.c,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/clib/security/sha-1.c	Mon May 24 18:07:12 2004
@@ -0,0 +1,417 @@
+
+/*
+ * Copyright (c) 1995-1999 Eric Young
+ * All rights reserved.
+ * 
+ * Subject to the following obligations and disclaimer of warranty, use and
+ * redistribution of this software, in source or object code forms, with or
+ * without modifications are expressly permitted by Eric Young; provided,
+ * however, that:
+ * 1. Any and all reproductions of the source or object code must include the
+ *    copyright notice above and the following disclaimer of warranties; and
+ * 2. No rights are granted, in any manner or form, to use Eric Young
+ *    trademarks, including the mark "Eric Young" on advertising,
+ *    endorsements, or otherwise except as such appears in the above
+ *    copyright notice or in the software.
+ * 
+ * THIS SOFTWARE IS BEING PROVIDED BY ERIC YOUNG "AS IS", AND TO THE
+ * MAXIMUM EXTENT PERMITTED BY LAW, ERIC YOUNG MAKES NO REPRESENTATIONS
+ * OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
+ * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
+ * ERIC YOUNG DOES NOT WARRANT, GUARANTEE, OR MAKE ANY REPRESENTATIONS
+ * REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS SOFTWARE
+ * IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
+ * IN NO EVENT SHALL ERIC YOUNG BE LIABLE FOR ANY DAMAGES RESULTING
+ * FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING WITHOUT
+ * LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED
+ * AND UNDER 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 ERIC YOUNG IS
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "config-std.h"
+#include "config-mem.h"
+#include "sha-1.h"
+
+#if !defined(BIG_ENDIAN)
+#define	BIG_ENDIAN	1
+#endif
+#if !defined(LITTLE_ENDIAN)
+#define	LITTLE_ENDIAN	2
+#endif
+#if !defined(BYTE_ORDER)
+#if defined(WORDS_BIGENDIAN)
+#define	BYTE_ORDER	BIG_ENDIAN
+#else
+#define	BYTE_ORDER	LITTLE_ENDIAN
+#endif
+#endif
+
+/* 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
+
+static void sha1_block(SHA1_CTX *c, register unsigned long *p);
+
+void SHA1Init(c)
+SHA1_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 SHA1Update(c, data, len)
+SHA1_CTX *c;
+register const unsigned char *data;
+unsigned long len;
+	{
+	register ULONG *p;
+	int ew,ec,sw,sc;
+	ULONG l;
+
+	if (len == 0) return;
+
+	l=(c->Nl+(len<<3))&0xffffffff;
+	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];
+			p_c2nl(data,l,sc);
+			p[sw++]=l;
+			for (; sw<SHA_LBLOCK; sw++)
+				{
+				c2nl(data,l);
+				p[sw]=l;
+				}
+			len-=(SHA_CBLOCK-c->num);
+
+			sha1_block(c,p);
+			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];
+				p_c2nl_p(data,l,sc,len);
+				p[sw]=l;
+				}
+			else
+				{
+				ew=(c->num>>2);
+				ec=(c->num&0x03);
+				l= p[sw];
+				p_c2nl(data,l,sc);
+				p[sw++]=l;
+				for (; sw < ew; sw++)
+					{ c2nl(data,l); p[sw]=l; }
+				if (ec)
+					{
+					c2nl_p(data,l,ec);
+					p[sw]=l;
+					}
+				}
+			return;
+			}
+		}
+	/* 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 defined(BYTE_ORDER) && (defined(BIG_ENDIAN) || defined(LITTLE_ENDIAN))
+		memcpy(p,data,SHA_CBLOCK);
+		data+=SHA_CBLOCK;
+#if BYTE_ORDER == LITTLE_ENDIAN
+		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;
+			}
+#endif
+#else
+		for (sw=(SHA_BLOCK/4); sw; sw--)
+			{
+			c2nl(data,l); *(p++)=l;
+			c2nl(data,l); *(p++)=l;
+			c2nl(data,l); *(p++)=l;
+			c2nl(data,l); *(p++)=l;
+			}
+#endif
+		p=c->data;
+		sha1_block(c,p);
+		len-=SHA_CBLOCK;
+		}
+	ec=(int)len;
+	c->num=ec;
+	ew=(ec>>2);
+	ec&=0x03;
+
+	for (sw=0; sw < ew; sw++)
+		{ c2nl(data,l); p[sw]=l; }
+	c2nl_p(data,l,ec);
+	p[sw]=l;
+	}
+
+static void sha1_block(c, X)
+SHA1_CTX *c;
+register unsigned long *X;
+	{
+	register ULONG A,B,C,D,E,T;
+
+	A=c->h0;
+	B=c->h1;
+	C=c->h2;
+	D=c->h3;
+	E=c->h4;
+
+	BODY_00_15( 0,A,B,C,D,E,T);
+	BODY_00_15( 1,T,A,B,C,D,E);
+	BODY_00_15( 2,E,T,A,B,C,D);
+	BODY_00_15( 3,D,E,T,A,B,C);
+	BODY_00_15( 4,C,D,E,T,A,B);
+	BODY_00_15( 5,B,C,D,E,T,A);
+	BODY_00_15( 6,A,B,C,D,E,T);
+	BODY_00_15( 7,T,A,B,C,D,E);
+	BODY_00_15( 8,E,T,A,B,C,D);
+	BODY_00_15( 9,D,E,T,A,B,C);
+	BODY_00_15(10,C,D,E,T,A,B);
+	BODY_00_15(11,B,C,D,E,T,A);
+	BODY_00_15(12,A,B,C,D,E,T);
+	BODY_00_15(13,T,A,B,C,D,E);
+	BODY_00_15(14,E,T,A,B,C,D);
+	BODY_00_15(15,D,E,T,A,B,C);
+	BODY_16_19(16,C,D,E,T,A,B);
+	BODY_16_19(17,B,C,D,E,T,A);
+	BODY_16_19(18,A,B,C,D,E,T);
+	BODY_16_19(19,T,A,B,C,D,E);
+
+	BODY_20_39(20,E,T,A,B,C,D);
+	BODY_20_39(21,D,E,T,A,B,C);
+	BODY_20_39(22,C,D,E,T,A,B);
+	BODY_20_39(23,B,C,D,E,T,A);
+	BODY_20_39(24,A,B,C,D,E,T);
+	BODY_20_39(25,T,A,B,C,D,E);
+	BODY_20_39(26,E,T,A,B,C,D);
+	BODY_20_39(27,D,E,T,A,B,C);
+	BODY_20_39(28,C,D,E,T,A,B);
+	BODY_20_39(29,B,C,D,E,T,A);
+	BODY_20_39(30,A,B,C,D,E,T);
+	BODY_20_39(31,T,A,B,C,D,E);
+	BODY_20_39(32,E,T,A,B,C,D);
+	BODY_20_39(33,D,E,T,A,B,C);
+	BODY_20_39(34,C,D,E,T,A,B);
+	BODY_20_39(35,B,C,D,E,T,A);
+	BODY_20_39(36,A,B,C,D,E,T);
+	BODY_20_39(37,T,A,B,C,D,E);
+	BODY_20_39(38,E,T,A,B,C,D);
+	BODY_20_39(39,D,E,T,A,B,C);
+
+	BODY_40_59(40,C,D,E,T,A,B);
+	BODY_40_59(41,B,C,D,E,T,A);
+	BODY_40_59(42,A,B,C,D,E,T);
+	BODY_40_59(43,T,A,B,C,D,E);
+	BODY_40_59(44,E,T,A,B,C,D);
+	BODY_40_59(45,D,E,T,A,B,C);
+	BODY_40_59(46,C,D,E,T,A,B);
+	BODY_40_59(47,B,C,D,E,T,A);
+	BODY_40_59(48,A,B,C,D,E,T);
+	BODY_40_59(49,T,A,B,C,D,E);
+	BODY_40_59(50,E,T,A,B,C,D);
+	BODY_40_59(51,D,E,T,A,B,C);
+	BODY_40_59(52,C,D,E,T,A,B);
+	BODY_40_59(53,B,C,D,E,T,A);
+	BODY_40_59(54,A,B,C,D,E,T);
+	BODY_40_59(55,T,A,B,C,D,E);
+	BODY_40_59(56,E,T,A,B,C,D);
+	BODY_40_59(57,D,E,T,A,B,C);
+	BODY_40_59(58,C,D,E,T,A,B);
+	BODY_40_59(59,B,C,D,E,T,A);
+
+	BODY_60_79(60,A,B,C,D,E,T);
+	BODY_60_79(61,T,A,B,C,D,E);
+	BODY_60_79(62,E,T,A,B,C,D);
+	BODY_60_79(63,D,E,T,A,B,C);
+	BODY_60_79(64,C,D,E,T,A,B);
+	BODY_60_79(65,B,C,D,E,T,A);
+	BODY_60_79(66,A,B,C,D,E,T);
+	BODY_60_79(67,T,A,B,C,D,E);
+	BODY_60_79(68,E,T,A,B,C,D);
+	BODY_60_79(69,D,E,T,A,B,C);
+	BODY_60_79(70,C,D,E,T,A,B);
+	BODY_60_79(71,B,C,D,E,T,A);
+	BODY_60_79(72,A,B,C,D,E,T);
+	BODY_60_79(73,T,A,B,C,D,E);
+	BODY_60_79(74,E,T,A,B,C,D);
+	BODY_60_79(75,D,E,T,A,B,C);
+	BODY_60_79(76,C,D,E,T,A,B);
+	BODY_60_79(77,B,C,D,E,T,A);
+	BODY_60_79(78,A,B,C,D,E,T);
+	BODY_60_79(79,T,A,B,C,D,E);
+
+	c->h0=(c->h0+E)&0xffffffff; 
+	c->h1=(c->h1+T)&0xffffffff;
+	c->h2=(c->h2+A)&0xffffffff;
+	c->h3=(c->h3+B)&0xffffffff;
+	c->h4=(c->h4+C)&0xffffffff;
+	}
+
+void SHA1Final(md, c)
+unsigned char *md;
+SHA1_CTX *c;
+	{
+	register int i,j;
+	register ULONG l;
+	register ULONG *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];
+	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);
+		i=0;
+		}
+	for (; i<(SHA_LBLOCK-2); i++)
+		p[i]=0;
+	p[SHA_LBLOCK-2]=c->Nh;
+	p[SHA_LBLOCK-1]=c->Nl;
+	sha1_block(c,p);
+	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));*/
+	}
+
+#ifdef MAIN_TEST
+
+char *test[]={
+        "abc",
+        "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+        NULL,
+};
+char *ret[]={
+        "a9993e364706816aba3e25717850c26c9cd0d89d",
+        "84983e441c3bd26ebaae4aa1f95129e5e54670f1",
+};
+
+#define SHA_DIGEST_LENGTH 20
+
+unsigned char *SHA1(d, n, md)
+unsigned char *d;
+unsigned long n;
+unsigned char *md;
+{
+        SHA1_CTX c;
+        static unsigned char m[SHA_DIGEST_LENGTH];
+
+        if (md == NULL) md=m;
+        SHA1Init(&c);
+        SHA1Update(&c,d,n);
+        SHA1Final(md,&c);
+        memset(&c,0,sizeof(c));
+        return(md);
+}
+
+static char *pt(md)
+unsigned char *md;
+{
+        int i;
+        static char buf[80];
+
+        for (i=0; i<SHA_DIGEST_LENGTH; i++)
+                sprintf(&(buf[i*2]),"%02x",md[i]);
+        return(buf);
+}
+
+int main(argc,argv)
+int argc;
+char *argv[];
+{
+        int i,err=0;
+        unsigned char **P,**R;
+        static unsigned char buf[1000];
+        char *p,*r;
+        SHA1_CTX c;
+        unsigned char md[SHA_DIGEST_LENGTH];
+
+        P=(unsigned char **)test;
+        R=(unsigned char **)ret;
+        i=1;
+        while (*P != NULL)
+                {
+                p=pt(SHA1(*P,(unsigned long)strlen((char *)*P),NULL));
+                if (strcmp(p,(char *)*R) != 0)
+                        {
+                        printf("error calculating SHA1 on '%s'\n",*P);
+                        printf("got %s instead of %s\n",p,*R);
+                        err++;
+                        }
+                else
+                        printf("test %d ok\n",i);
+                i++;
+                R++;
+                P++;
+        }
+
+        return(0);
+}
+
+#endif /* MAIN_TEST */
===================================================================
Checking out kaffe/libraries/clib/security/sha-1.h
RCS:  /home/cvs/kaffe/kaffe/libraries/clib/security/sha-1.h,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/clib/security/sha-1.h	Mon May 24 18:07:13 2004
@@ -0,0 +1,188 @@
+
+/*
+ * Copyright (c) 1995-1999 Eric Young
+ * All rights reserved.
+ * 
+ * Subject to the following obligations and disclaimer of warranty, use and
+ * redistribution of this software, in source or object code forms, with or
+ * without modifications are expressly permitted by Eric Young; provided,
+ * however, that:
+ * 1. Any and all reproductions of the source or object code must include the
+ *    copyright notice above and the following disclaimer of warranties; and
+ * 2. No rights are granted, in any manner or form, to use Eric Young
+ *    trademarks, including the mark "Eric Young" on advertising,
+ *    endorsements, or otherwise except as such appears in the above
+ *    copyright notice or in the software.
+ * 
+ * THIS SOFTWARE IS BEING PROVIDED BY ERIC YOUNG "AS IS", AND TO THE
+ * MAXIMUM EXTENT PERMITTED BY LAW, ERIC YOUNG MAKES NO REPRESENTATIONS
+ * OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
+ * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
+ * ERIC YOUNG DOES NOT WARRANT, GUARANTEE, OR MAKE ANY REPRESENTATIONS
+ * REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS SOFTWARE
+ * IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
+ * IN NO EVENT SHALL ERIC YOUNG BE LIABLE FOR ANY DAMAGES RESULTING
+ * FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING WITHOUT
+ * LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED
+ * AND UNDER 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 ERIC YOUNG IS
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _SHA_1_H_
+#define _SHA_1_H_
+
+#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
+	{
+	unsigned long h0,h1,h2,h3,h4;
+	unsigned long Nl,Nh;
+	unsigned long data[SHA_LBLOCK];
+	int num;
+	} SHA1_CTX;
+
+void SHA1Init(SHA1_CTX *c);
+void SHA1Update(SHA1_CTX *c, const unsigned char *data, unsigned long len);
+void SHA1Final(unsigned char *md, SHA1_CTX *c);
+
+/* one or the other needs to be defined */
+#define SHA_1 /* FIPE 180-1 */
+
+#define ULONG	unsigned long
+#define UCHAR	unsigned char
+#define UINT	unsigned int
+
+#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))
+
+/* I have taken some of this code from my MD5 implementation */
+
+#undef ROTATE
+#if defined(WIN32) && !defined(__GNUC__)
+#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) \
+	X[(i)&0x0f]=(a)=\
+		(X[(i)&0x0f]^X[((i)+2)&0x0f]^X[((i)+8)&0x0f]^X[((i)+13)&0x0f]);
+#endif
+#ifdef SHA_1
+#undef Xupdate
+#define Xupdate(a,i) \
+	(a)=(X[(i)&0x0f]^X[((i)+2)&0x0f]^X[((i)+8)&0x0f]^X[((i)+13)&0x0f]); \
+	X[(i)&0x0f]=(a)=ROTATE((a),1);
+#endif
+
+#define BODY_00_15(i,a,b,c,d,e,f) \
+	(f)=X[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) \
+	Xupdate(f,i); \
+	(f)+=(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \
+	(b)=ROTATE((b),30);
+
+#define BODY_20_39(i,a,b,c,d,e,f) \
+	Xupdate(f,i); \
+	(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) \
+	Xupdate(f,i); \
+	(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) \
+	Xupdate(f,i); \
+	(f)=X[(i)&0x0f]+(e)+K_60_79+ROTATE((a),5)+F_60_79((b),(c),(d)); \
+	(b)=ROTATE((b),30);
+
+#endif
+