aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/sha/sha_dgst.c
diff options
context:
space:
mode:
authorRalf S. Engelschall <rse@openssl.org>1998-12-21 10:56:39 +0000
committerRalf S. Engelschall <rse@openssl.org>1998-12-21 10:56:39 +0000
commit58964a492275ca9a59a0cd9c8155cb2491b4b909 (patch)
treec7b16876a5789463bbbb468ef4829c8129b3d718 /crypto/sha/sha_dgst.c
parentd02b48c63a58ea4367a0e905979f140b7d090f86 (diff)
downloadopenssl-58964a492275ca9a59a0cd9c8155cb2491b4b909.tar.gz
Import of old SSLeay release: SSLeay 0.9.0b
Diffstat (limited to 'crypto/sha/sha_dgst.c')
-rw-r--r--crypto/sha/sha_dgst.c340
1 files changed, 204 insertions, 136 deletions
diff --git a/crypto/sha/sha_dgst.c b/crypto/sha/sha_dgst.c
index 311aa6fcc5..8ed533ea26 100644
--- a/crypto/sha/sha_dgst.c
+++ b/crypto/sha/sha_dgst.c
@@ -1,5 +1,5 @@
/* crypto/sha/sha_dgst.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
@@ -57,14 +57,15 @@
*/
#include <stdio.h>
-#define SHA_0
-#undef SHA_1
+#include <string.h>
+#define SHA_0
+#undef SHA_1
#include "sha.h"
#include "sha_locl.h"
-char *SHA_version="SHA part of SSLeay 0.8.1b 29-Jun-1998";
+char *SHA_version="SHA part of SSLeay 0.9.0b 29-Jun-1998";
-/* Implemented from SHA document - The Secure Hash Algorithm
+/* Implemented from SHA-0 document - The Secure Hash Algorithm
*/
#define INIT_DATA_h0 (unsigned long)0x67452301L
@@ -79,11 +80,17 @@ char *SHA_version="SHA part of SSLeay 0.8.1b 29-Jun-1998";
#define K_60_79 0xca62c1d6L
#ifndef NOPROTO
-static void sha_block(SHA_CTX *c, register unsigned long *p);
+ void sha_block(SHA_CTX *c, register unsigned long *p, int num);
#else
-static void sha_block();
+ 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;
{
@@ -103,12 +110,12 @@ register unsigned char *data;
unsigned long len;
{
register ULONG *p;
- int sw,sc,ew,ec;
+ int ew,ec,sw,sc;
ULONG l;
if (len == 0) return;
- l=(c->Nl+(len<<3))&0xffffffff;
+ l=(c->Nl+(len<<3))&0xffffffffL;
if (l < c->Nl) /* overflow */
c->Nh++;
c->Nh+=(len>>29);
@@ -123,16 +130,16 @@ unsigned long len;
if ((c->num+len) >= SHA_CBLOCK)
{
l= p[sw];
- p_c2nl(data,l,sc);
+ M_p_c2nl(data,l,sc);
p[sw++]=l;
for (; sw<SHA_LBLOCK; sw++)
{
- c2nl(data,l);
+ M_c2nl(data,l);
p[sw]=l;
}
len-=(SHA_CBLOCK-c->num);
- sha_block(c,p);
+ sha_block(c,p,64);
c->num=0;
/* drop through and do the rest */
}
@@ -142,7 +149,7 @@ unsigned long len;
if ((sc+len) < 4) /* ugly, add char's to a word */
{
l= p[sw];
- p_c2nl_p(data,l,sc,len);
+ M_p_c2nl_p(data,l,sc,len);
p[sw]=l;
}
else
@@ -150,28 +157,51 @@ unsigned long len;
ew=(c->num>>2);
ec=(c->num&0x03);
l= p[sw];
- p_c2nl(data,l,sc);
+ M_p_c2nl(data,l,sc);
p[sw++]=l;
for (; sw < ew; sw++)
- { c2nl(data,l); p[sw]=l; }
+ { M_c2nl(data,l); p[sw]=l; }
if (ec)
{
- c2nl_p(data,l,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 defined(B_ENDIAN) || defined(SHA_ASM)
+ if ((((unsigned int)data)%sizeof(ULONG)) == 0)
+ {
+ sw=len/SHA_CBLOCK;
+ if (sw)
+ {
+ sw*=SHA_CBLOCK;
+ sha_block(c,(ULONG *)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 defined(B_ENDIAN) || defined(L_ENDIAN)
- memcpy(p,data,SHA_CBLOCK);
+ if (p != (unsigned long *)data)
+ memcpy(p,data,SHA_CBLOCK);
data+=SHA_CBLOCK;
-#ifdef L_ENDIAN
+# ifdef L_ENDIAN
+# ifndef SHA_ASM /* Will not happen */
for (sw=(SHA_LBLOCK/4); sw; sw--)
{
Endian_Reverse32(p[0]);
@@ -180,18 +210,20 @@ unsigned long len;
Endian_Reverse32(p[3]);
p+=4;
}
-#endif
+ p=c->data;
+# endif
+# endif
#else
- for (sw=(SHA_LBLOCK/4); sw; sw--)
+ 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;
+ M_c2nl(data,l); *(p++)=l;
+ M_c2nl(data,l); *(p++)=l;
+ M_c2nl(data,l); *(p++)=l;
+ M_c2nl(data,l); *(p++)=l;
}
-#endif
p=c->data;
- sha_block(c,p);
+#endif
+ sha_block(c,p,64);
len-=SHA_CBLOCK;
}
ec=(int)len;
@@ -200,16 +232,55 @@ unsigned long len;
ec&=0x03;
for (sw=0; sw < ew; sw++)
- { c2nl(data,l); p[sw]=l; }
- c2nl_p(data,l,ec);
+ { M_c2nl(data,l); p[sw]=l; }
+ M_c2nl_p(data,l,ec);
p[sw]=l;
}
-static void sha_block(c, X)
+void SHA_Transform(c,b)
SHA_CTX *c;
-register unsigned long *X;
+unsigned char *b;
+ {
+ ULONG p[16];
+#if !defined(B_ENDIAN)
+ ULONG *q;
+ int i;
+#endif
+
+#if defined(B_ENDIAN) || defined(L_ENDIAN)
+ memcpy(p,b,64);
+#ifdef L_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--)
+ {
+ ULONG 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;
+register unsigned long *W;
+int num;
{
register ULONG A,B,C,D,E,T;
+ ULONG X[16];
A=c->h0;
B=c->h1;
@@ -217,95 +288,109 @@ register unsigned long *X;
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);
+ 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_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_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;
- 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);
+ num-=64;
+ if (num <= 0) break;
- 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);
+ A=c->h0;
+ B=c->h1;
+ C=c->h2;
+ D=c->h3;
+ E=c->h4;
- 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;
+ W+=16;
+ }
}
void SHA_Final(md, c)
@@ -326,7 +411,7 @@ SHA_CTX *c;
if ((j&0x03) == 0) p[i]=0;
#endif
l=p[i];
- p_c2nl(cp,l,j&0x03);
+ M_p_c2nl(cp,l,j&0x03);
p[i]=l;
i++;
/* i is the next 'undefined word' */
@@ -334,41 +419,24 @@ SHA_CTX *c;
{
for (; i<SHA_LBLOCK; i++)
p[i]=0;
- sha_block(c,p);
+ 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);
+ 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));*/
}
-
-#ifdef undef
-int printit(l)
-unsigned long *l;
- {
- int i,ii;
-
- for (i=0; i<2; i++)
- {
- for (ii=0; ii<8; ii++)
- {
- fprintf(stderr,"%08lx ",l[i*8+ii]);
- }
- fprintf(stderr,"\n");
- }
- }
-#endif
-