Loading CHANGES +4 −1 Original line number Diff line number Diff line Loading @@ -5,6 +5,9 @@ Changes between 0.9.2b and 0.9.3 *) SHA-1 cleanups and performance enhancements. [Andy Polyakov <appro@fy.chalmers.se>] *) Sparc v8plus assembler for the bignum library. [Andy Polyakov <appro@fy.chalmers.se>] Loading Configure +3 −0 Original line number Diff line number Diff line Loading @@ -587,6 +587,9 @@ while (<IN>) { printf OUT "#define RC4_INT unsigned %s\n",$type[$rc4_int]; } elsif (/^#((define)|(undef))\s+RC4_INDEX/) { printf OUT "#%s RC4_INDEX\n",($rc4_idx)?"define":"undef"; } elsif (/^#(define|undef)\s+I386_ONLY/) { printf OUT "#%s I386_ONLY\n", ($processor == 386)? "define":"undef"; } elsif (/^#define\s+MD2_INT\s/) { printf OUT "#define MD2_INT unsigned %s\n",$type[$md2_int]; } elsif (/^#define\s+IDEA_INT\s/) Loading crypto/opensslconf.h.in +8 −5 Original line number Diff line number Diff line /* crypto/opensslconf.h */ /* WARNING: This file is autogenerated by Configure */ /* Generate 80386 code? */ #undef I386_ONLY #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/usr/local/ssl" #endif Loading Loading @@ -34,7 +37,7 @@ #if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) #define CONFIG_HEADER_BN_H #define BN_LLONG #undef BN_LLONG /* Should we define BN_DIV2W here? */ Loading @@ -53,7 +56,7 @@ #define CONFIG_HEADER_RC4_LOCL_H /* if this is defined data[i] is used instead of *data, this is a %20 * speedup on x86 */ #define RC4_INDEX #undef RC4_INDEX #endif #if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) Loading @@ -67,14 +70,14 @@ /* the following is tweaked from a config script, that is why it is a * protected undef/define */ #ifndef DES_PTR #define DES_PTR #undef DES_PTR #endif /* This helps C compiler generate the correct code for multiple functional * units. It reduces register dependancies at the expense of 2 more * registers */ #ifndef DES_RISC1 #define DES_RISC1 #undef DES_RISC1 #endif #ifndef DES_RISC2 Loading @@ -88,7 +91,7 @@ YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! /* Unroll the inner loop, this sometimes helps, sometimes hinders. * Very mucy CPU dependant */ #ifndef DES_UNROLL #define DES_UNROLL #undef DES_UNROLL #endif /* These default values were supplied by Loading crypto/sha/sha.h +18 −8 Original line number Diff line number Diff line Loading @@ -67,19 +67,29 @@ extern "C" { #error SHA is disabled. #endif #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 /* * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ! * ! SHA_LONG_LOG2 has to be defined along. ! * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ #ifdef WIN16 #if defined(WIN16) || defined(__LP32__) #define SHA_LONG unsigned long #elif defined(_CRAY) || defined(__ILP64__) #define SHA_LONG unsigned long #define SHA_LONG_LOG2 3 #else #define SHA_LONG unsigned int #endif #define SHA_LBLOCK 16 #define SHA_CBLOCK (SHA_LBLOCK*4) /* SHA treats input data as a * contiguous array of 32 bit * wide big-endian values. */ #define SHA_LAST_BLOCK (SHA_CBLOCK-8) #define SHA_DIGEST_LENGTH 20 typedef struct SHAstate_st { SHA_LONG h0,h1,h2,h3,h4; Loading crypto/sha/sha1dgst.c +97 −56 Original line number Diff line number Diff line Loading @@ -83,12 +83,12 @@ char *SHA1_version="SHA1" OPENSSL_VERSION_PTEXT; #ifdef SHA1_ASM void sha1_block_x86(SHA_CTX *c, register SHA_LONG *p, int num); # define sha1_block sha1_block_x86 # define sha1_block(c,p,n) sha1_block_x86((c),(p),(n)*SHA_CBLOCK) #else void sha1_block(SHA_CTX *c, register SHA_LONG *p, int num); static void sha1_block(SHA_CTX *c, register SHA_LONG *p, int num); #endif #if defined(L_ENDIAN) && defined(SHA1_ASM) #if !defined(B_ENDIAN) && defined(SHA1_ASM) # define M_c2nl c2l # define M_p_c2nl p_c2l # define M_c2nl_p c2l_p Loading Loading @@ -147,7 +147,7 @@ void SHA1_Update(SHA_CTX *c, const register unsigned char *data, } len-=(SHA_CBLOCK-c->num); sha1_block(c,p,64); sha1_block(c,p,1); c->num=0; /* drop through and do the rest */ } Loading Loading @@ -184,15 +184,15 @@ void SHA1_Update(SHA_CTX *c, const register unsigned char *data, * copies it to a local array. I should be able to do this for * the C version as well.... */ #if 1 #if SHA_LONG_LOG2==2 #if defined(B_ENDIAN) || defined(SHA1_ASM) if ((((unsigned long)data)%sizeof(SHA_LONG)) == 0) { sw=len/SHA_CBLOCK; if (sw) { sw*=SHA_CBLOCK; sha1_block(c,(SHA_LONG *)data,sw); sw*=SHA_CBLOCK; data+=sw; len-=sw; } Loading @@ -204,35 +204,61 @@ void SHA1_Update(SHA_CTX *c, const register unsigned char *data, p=c->data; while (len >= SHA_CBLOCK) { #if defined(B_ENDIAN) || defined(L_ENDIAN) #if SHA_LONG_LOG2==2 #if defined(B_ENDIAN) || defined(SHA1_ASM) #define SHA_NO_TAIL_CODE /* * Basically we get here only when data happens * to be unaligned. */ if (p != (SHA_LONG *)data) memcpy(p,data,SHA_CBLOCK); data+=SHA_CBLOCK; # ifdef L_ENDIAN # ifndef SHA1_ASM /* Will not happen */ sha1_block(c,p=c->data,1); len-=SHA_CBLOCK; #else /* little-endian */ #define BE_COPY(dst,src,i) { \ l = ((SHA_LONG *)src)[i]; \ Endian_Reverse32(l); \ dst[i] = l; \ } if ((((unsigned long)data)%sizeof(SHA_LONG)) == 0) { for (sw=(SHA_LBLOCK/4); sw; sw--) { Endian_Reverse32(p[0]); Endian_Reverse32(p[1]); Endian_Reverse32(p[2]); Endian_Reverse32(p[3]); BE_COPY(p,data,0); BE_COPY(p,data,1); BE_COPY(p,data,2); BE_COPY(p,data,3); p+=4; data += 4*sizeof(SHA_LONG); } sha1_block(c,p=c->data,1); len-=SHA_CBLOCK; continue; } p=c->data; #endif #endif #else for (sw=(SHA_BLOCK/4); sw; sw--) #ifndef SHA_NO_TAIL_CODE /* * In addition to "sizeof(SHA_LONG)!= 4" case the * following code covers unaligned access cases on * little-endian machines. * <appro@fy.chalmers.se> */ p=c->data; for (sw=(SHA_LBLOCK/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; M_c2nl(data,l); p[0]=l; M_c2nl(data,l); p[1]=l; M_c2nl(data,l); p[2]=l; M_c2nl(data,l); p[3]=l; p+=4; } p=c->data; #endif sha1_block(c,p,64); sha1_block(c,p,1); len-=SHA_CBLOCK; #endif } ec=(int)len; c->num=ec; Loading @@ -247,26 +273,35 @@ void SHA1_Update(SHA_CTX *c, const register unsigned char *data, void SHA1_Transform(SHA_CTX *c, unsigned char *b) { SHA_LONG p[16]; #ifndef B_ENDIAN SHA_LONG p[SHA_LBLOCK]; SHA_LONG *q; int i; #endif #if defined(B_ENDIAN) || defined(L_ENDIAN) memcpy(p,b,64); #ifdef L_ENDIAN #if SHA_LONG_LOG2==2 #if defined(B_ENDIAN) || defined(SHA1_ASM) memcpy(p,b,SHA_CBLOCK); sha1_block(c,p,1); return; #else if (((unsigned long)b%sizeof(SHA_LONG)) == 0) { 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]); unsigned long l; BE_COPY(q,b,0); /* BE_COPY was defined above */ BE_COPY(q,b,1); BE_COPY(q,b,2); BE_COPY(q,b,3); q+=4; b+=4*sizeof(SHA_LONG); } sha1_block(c,p,1); return; } #endif #else #endif #ifndef SHA_NO_TAIL_CODE /* defined above, see comment */ q=p; for (i=(SHA_LBLOCK/4); i; i--) { Loading @@ -276,16 +311,15 @@ void SHA1_Transform(SHA_CTX *c, unsigned char *b) c2nl(b,l); *(q++)=l; c2nl(b,l); *(q++)=l; } sha1_block(c,p,1); #endif sha1_block(c,p,64); } #ifndef SHA1_ASM void sha1_block(SHA_CTX *c, register SHA_LONG *W, int num) static void sha1_block(SHA_CTX *c, register SHA_LONG *W, int num) { register SHA_LONG A,B,C,D,E,T; SHA_LONG X[16]; SHA_LONG X[SHA_LBLOCK]; A=c->h0; B=c->h1; Loading Loading @@ -385,8 +419,7 @@ void sha1_block(SHA_CTX *c, register SHA_LONG *W, int num) c->h3=(c->h3+B)&0xffffffffL; c->h4=(c->h4+C)&0xffffffffL; num-=64; if (num <= 0) break; if (--num <= 0) break; A=c->h0; B=c->h1; Loading @@ -394,7 +427,12 @@ void sha1_block(SHA_CTX *c, register SHA_LONG *W, int num) D=c->h3; E=c->h4; W+=16; W+=SHA_LBLOCK; /* Note! This can happen only when sizeof(SHA_LONG) * is 4. Whenever it's not the actual case this * function is never called with num larger than 1 * and we never advance down here. * <appro@fy.chalmers.se> */ } } #endif Loading Loading @@ -423,18 +461,20 @@ void SHA1_Final(unsigned char *md, SHA_CTX *c) { for (; i<SHA_LBLOCK; i++) p[i]=0; sha1_block(c,p,64); sha1_block(c,p,1); i=0; } for (; i<(SHA_LBLOCK-2); i++) p[i]=0; p[SHA_LBLOCK-2]=c->Nh; p[SHA_LBLOCK-1]=c->Nl; #if defined(L_ENDIAN) && defined(SHA1_ASM) #if SHA_LONG_LOG2==2 #if !defined(B_ENDIAN) && defined(SHA1_ASM) Endian_Reverse32(p[SHA_LBLOCK-2]); Endian_Reverse32(p[SHA_LBLOCK-1]); #endif sha1_block(c,p,64); #endif sha1_block(c,p,1); cp=md; l=c->h0; nl2c(l,cp); l=c->h1; nl2c(l,cp); Loading @@ -442,10 +482,11 @@ void SHA1_Final(unsigned char *md, SHA_CTX *c) 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));*/ /* sha_block may be leaving some stuff on the stack * but I'm not worried :-) memset((void *)c,0,sizeof(SHA_CTX)); */ } #endif Loading
CHANGES +4 −1 Original line number Diff line number Diff line Loading @@ -5,6 +5,9 @@ Changes between 0.9.2b and 0.9.3 *) SHA-1 cleanups and performance enhancements. [Andy Polyakov <appro@fy.chalmers.se>] *) Sparc v8plus assembler for the bignum library. [Andy Polyakov <appro@fy.chalmers.se>] Loading
Configure +3 −0 Original line number Diff line number Diff line Loading @@ -587,6 +587,9 @@ while (<IN>) { printf OUT "#define RC4_INT unsigned %s\n",$type[$rc4_int]; } elsif (/^#((define)|(undef))\s+RC4_INDEX/) { printf OUT "#%s RC4_INDEX\n",($rc4_idx)?"define":"undef"; } elsif (/^#(define|undef)\s+I386_ONLY/) { printf OUT "#%s I386_ONLY\n", ($processor == 386)? "define":"undef"; } elsif (/^#define\s+MD2_INT\s/) { printf OUT "#define MD2_INT unsigned %s\n",$type[$md2_int]; } elsif (/^#define\s+IDEA_INT\s/) Loading
crypto/opensslconf.h.in +8 −5 Original line number Diff line number Diff line /* crypto/opensslconf.h */ /* WARNING: This file is autogenerated by Configure */ /* Generate 80386 code? */ #undef I386_ONLY #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/usr/local/ssl" #endif Loading Loading @@ -34,7 +37,7 @@ #if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) #define CONFIG_HEADER_BN_H #define BN_LLONG #undef BN_LLONG /* Should we define BN_DIV2W here? */ Loading @@ -53,7 +56,7 @@ #define CONFIG_HEADER_RC4_LOCL_H /* if this is defined data[i] is used instead of *data, this is a %20 * speedup on x86 */ #define RC4_INDEX #undef RC4_INDEX #endif #if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) Loading @@ -67,14 +70,14 @@ /* the following is tweaked from a config script, that is why it is a * protected undef/define */ #ifndef DES_PTR #define DES_PTR #undef DES_PTR #endif /* This helps C compiler generate the correct code for multiple functional * units. It reduces register dependancies at the expense of 2 more * registers */ #ifndef DES_RISC1 #define DES_RISC1 #undef DES_RISC1 #endif #ifndef DES_RISC2 Loading @@ -88,7 +91,7 @@ YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!! /* Unroll the inner loop, this sometimes helps, sometimes hinders. * Very mucy CPU dependant */ #ifndef DES_UNROLL #define DES_UNROLL #undef DES_UNROLL #endif /* These default values were supplied by Loading
crypto/sha/sha.h +18 −8 Original line number Diff line number Diff line Loading @@ -67,19 +67,29 @@ extern "C" { #error SHA is disabled. #endif #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 /* * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then ! * ! SHA_LONG_LOG2 has to be defined along. ! * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ #ifdef WIN16 #if defined(WIN16) || defined(__LP32__) #define SHA_LONG unsigned long #elif defined(_CRAY) || defined(__ILP64__) #define SHA_LONG unsigned long #define SHA_LONG_LOG2 3 #else #define SHA_LONG unsigned int #endif #define SHA_LBLOCK 16 #define SHA_CBLOCK (SHA_LBLOCK*4) /* SHA treats input data as a * contiguous array of 32 bit * wide big-endian values. */ #define SHA_LAST_BLOCK (SHA_CBLOCK-8) #define SHA_DIGEST_LENGTH 20 typedef struct SHAstate_st { SHA_LONG h0,h1,h2,h3,h4; Loading
crypto/sha/sha1dgst.c +97 −56 Original line number Diff line number Diff line Loading @@ -83,12 +83,12 @@ char *SHA1_version="SHA1" OPENSSL_VERSION_PTEXT; #ifdef SHA1_ASM void sha1_block_x86(SHA_CTX *c, register SHA_LONG *p, int num); # define sha1_block sha1_block_x86 # define sha1_block(c,p,n) sha1_block_x86((c),(p),(n)*SHA_CBLOCK) #else void sha1_block(SHA_CTX *c, register SHA_LONG *p, int num); static void sha1_block(SHA_CTX *c, register SHA_LONG *p, int num); #endif #if defined(L_ENDIAN) && defined(SHA1_ASM) #if !defined(B_ENDIAN) && defined(SHA1_ASM) # define M_c2nl c2l # define M_p_c2nl p_c2l # define M_c2nl_p c2l_p Loading Loading @@ -147,7 +147,7 @@ void SHA1_Update(SHA_CTX *c, const register unsigned char *data, } len-=(SHA_CBLOCK-c->num); sha1_block(c,p,64); sha1_block(c,p,1); c->num=0; /* drop through and do the rest */ } Loading Loading @@ -184,15 +184,15 @@ void SHA1_Update(SHA_CTX *c, const register unsigned char *data, * copies it to a local array. I should be able to do this for * the C version as well.... */ #if 1 #if SHA_LONG_LOG2==2 #if defined(B_ENDIAN) || defined(SHA1_ASM) if ((((unsigned long)data)%sizeof(SHA_LONG)) == 0) { sw=len/SHA_CBLOCK; if (sw) { sw*=SHA_CBLOCK; sha1_block(c,(SHA_LONG *)data,sw); sw*=SHA_CBLOCK; data+=sw; len-=sw; } Loading @@ -204,35 +204,61 @@ void SHA1_Update(SHA_CTX *c, const register unsigned char *data, p=c->data; while (len >= SHA_CBLOCK) { #if defined(B_ENDIAN) || defined(L_ENDIAN) #if SHA_LONG_LOG2==2 #if defined(B_ENDIAN) || defined(SHA1_ASM) #define SHA_NO_TAIL_CODE /* * Basically we get here only when data happens * to be unaligned. */ if (p != (SHA_LONG *)data) memcpy(p,data,SHA_CBLOCK); data+=SHA_CBLOCK; # ifdef L_ENDIAN # ifndef SHA1_ASM /* Will not happen */ sha1_block(c,p=c->data,1); len-=SHA_CBLOCK; #else /* little-endian */ #define BE_COPY(dst,src,i) { \ l = ((SHA_LONG *)src)[i]; \ Endian_Reverse32(l); \ dst[i] = l; \ } if ((((unsigned long)data)%sizeof(SHA_LONG)) == 0) { for (sw=(SHA_LBLOCK/4); sw; sw--) { Endian_Reverse32(p[0]); Endian_Reverse32(p[1]); Endian_Reverse32(p[2]); Endian_Reverse32(p[3]); BE_COPY(p,data,0); BE_COPY(p,data,1); BE_COPY(p,data,2); BE_COPY(p,data,3); p+=4; data += 4*sizeof(SHA_LONG); } sha1_block(c,p=c->data,1); len-=SHA_CBLOCK; continue; } p=c->data; #endif #endif #else for (sw=(SHA_BLOCK/4); sw; sw--) #ifndef SHA_NO_TAIL_CODE /* * In addition to "sizeof(SHA_LONG)!= 4" case the * following code covers unaligned access cases on * little-endian machines. * <appro@fy.chalmers.se> */ p=c->data; for (sw=(SHA_LBLOCK/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; M_c2nl(data,l); p[0]=l; M_c2nl(data,l); p[1]=l; M_c2nl(data,l); p[2]=l; M_c2nl(data,l); p[3]=l; p+=4; } p=c->data; #endif sha1_block(c,p,64); sha1_block(c,p,1); len-=SHA_CBLOCK; #endif } ec=(int)len; c->num=ec; Loading @@ -247,26 +273,35 @@ void SHA1_Update(SHA_CTX *c, const register unsigned char *data, void SHA1_Transform(SHA_CTX *c, unsigned char *b) { SHA_LONG p[16]; #ifndef B_ENDIAN SHA_LONG p[SHA_LBLOCK]; SHA_LONG *q; int i; #endif #if defined(B_ENDIAN) || defined(L_ENDIAN) memcpy(p,b,64); #ifdef L_ENDIAN #if SHA_LONG_LOG2==2 #if defined(B_ENDIAN) || defined(SHA1_ASM) memcpy(p,b,SHA_CBLOCK); sha1_block(c,p,1); return; #else if (((unsigned long)b%sizeof(SHA_LONG)) == 0) { 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]); unsigned long l; BE_COPY(q,b,0); /* BE_COPY was defined above */ BE_COPY(q,b,1); BE_COPY(q,b,2); BE_COPY(q,b,3); q+=4; b+=4*sizeof(SHA_LONG); } sha1_block(c,p,1); return; } #endif #else #endif #ifndef SHA_NO_TAIL_CODE /* defined above, see comment */ q=p; for (i=(SHA_LBLOCK/4); i; i--) { Loading @@ -276,16 +311,15 @@ void SHA1_Transform(SHA_CTX *c, unsigned char *b) c2nl(b,l); *(q++)=l; c2nl(b,l); *(q++)=l; } sha1_block(c,p,1); #endif sha1_block(c,p,64); } #ifndef SHA1_ASM void sha1_block(SHA_CTX *c, register SHA_LONG *W, int num) static void sha1_block(SHA_CTX *c, register SHA_LONG *W, int num) { register SHA_LONG A,B,C,D,E,T; SHA_LONG X[16]; SHA_LONG X[SHA_LBLOCK]; A=c->h0; B=c->h1; Loading Loading @@ -385,8 +419,7 @@ void sha1_block(SHA_CTX *c, register SHA_LONG *W, int num) c->h3=(c->h3+B)&0xffffffffL; c->h4=(c->h4+C)&0xffffffffL; num-=64; if (num <= 0) break; if (--num <= 0) break; A=c->h0; B=c->h1; Loading @@ -394,7 +427,12 @@ void sha1_block(SHA_CTX *c, register SHA_LONG *W, int num) D=c->h3; E=c->h4; W+=16; W+=SHA_LBLOCK; /* Note! This can happen only when sizeof(SHA_LONG) * is 4. Whenever it's not the actual case this * function is never called with num larger than 1 * and we never advance down here. * <appro@fy.chalmers.se> */ } } #endif Loading Loading @@ -423,18 +461,20 @@ void SHA1_Final(unsigned char *md, SHA_CTX *c) { for (; i<SHA_LBLOCK; i++) p[i]=0; sha1_block(c,p,64); sha1_block(c,p,1); i=0; } for (; i<(SHA_LBLOCK-2); i++) p[i]=0; p[SHA_LBLOCK-2]=c->Nh; p[SHA_LBLOCK-1]=c->Nl; #if defined(L_ENDIAN) && defined(SHA1_ASM) #if SHA_LONG_LOG2==2 #if !defined(B_ENDIAN) && defined(SHA1_ASM) Endian_Reverse32(p[SHA_LBLOCK-2]); Endian_Reverse32(p[SHA_LBLOCK-1]); #endif sha1_block(c,p,64); #endif sha1_block(c,p,1); cp=md; l=c->h0; nl2c(l,cp); l=c->h1; nl2c(l,cp); Loading @@ -442,10 +482,11 @@ void SHA1_Final(unsigned char *md, SHA_CTX *c) 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));*/ /* sha_block may be leaving some stuff on the stack * but I'm not worried :-) memset((void *)c,0,sizeof(SHA_CTX)); */ } #endif