#include "sha384.h"
void mySHA384_SubHASH(unsigned _int64 InputData[16],unsigned _int64 HashValue[8])
{
#define SHR(x,n) (x >> n)
#define ROTR(x,n) (SHR(x,n) | (x << (64 - n)))
#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
#define F0(x,y,z) ((x & y) | (z & (x | y)))
#define F1(x,y,z) (z ^ (x & (y ^ z)))
#define P(a,b,c,d,e,f,g,h,x,K) \
{ \
temp1 = h + S3(e) + F1(e,f,g) + K + x; \
temp2 = S2(a) + F0(a,b,c); \
d += temp1; \
h = temp1 + temp2; \
}
unsigned _int64 K[80] =
{
0x428A2F98D728AE22, 0x7137449123EF65CD,
0xB5C0FBCFEC4D3B2F, 0xE9B5DBA58189DBBC,
0x3956C25BF348B538, 0x59F111F1B605D019,
0x923F82A4AF194F9B, 0xAB1C5ED5DA6D8118,
0xD807AA98A3030242, 0x12835B0145706FBE,
0x243185BE4EE4B28C, 0x550C7DC3D5FFB4E2,
0x72BE5D74F27B896F, 0x80DEB1FE3B1696B1,
0x9BDC06A725C71235, 0xC19BF174CF692694,
0xE49B69C19EF14AD2, 0xEFBE4786384F25E3,
0x0FC19DC68B8CD5B5, 0x240CA1CC77AC9C65,
0x2DE92C6F592B0275, 0x4A7484AA6EA6E483,
0x5CB0A9DCBD41FBD4, 0x76F988DA831153B5,
0x983E5152EE66DFAB, 0xA831C66D2DB43210,
0xB00327C898FB213F, 0xBF597FC7BEEF0EE4,
0xC6E00BF33DA88FC2, 0xD5A79147930AA725,
0x06CA6351E003826F, 0x142929670A0E6E70,
0x27B70A8546D22FFC, 0x2E1B21385C26C926,
0x4D2C6DFC5AC42AED, 0x53380D139D95B3DF,
0x650A73548BAF63DE, 0x766A0ABB3C77B2A8,
0x81C2C92E47EDAEE6, 0x92722C851482353B,
0xA2BFE8A14CF10364, 0xA81A664BBC423001,
0xC24B8B70D0F89791, 0xC76C51A30654BE30,
0xD192E819D6EF5218, 0xD69906245565A910,
0xF40E35855771202A, 0x106AA07032BBD1B8,
0x19A4C116B8D2D0C8, 0x1E376C085141AB53,
0x2748774CDF8EEB99, 0x34B0BCB5E19B48A8,
0x391C0CB3C5C95A63, 0x4ED8AA4AE3418ACB,
0x5B9CCA4F7763E373, 0x682E6FF3D6B2B8A3,
0x748F82EE5DEFB2FC, 0x78A5636F43172F60,
0x84C87814A1F0AB72, 0x8CC702081A6439EC,
0x90BEFFFA23631E28, 0xA4506CEBDE82BDE9,
0xBEF9A3F7B2C67915, 0xC67178F2E372532B,
0xCA273ECEEA26619C, 0xD186B8C721C0C207,
0xEADA7DD6CDE0EB1E, 0xF57D4F7FEE6ED178,
0x06F067AA72176FBA, 0x0A637DC5A2C898A6,
0x113F9804BEF90DAE, 0x1B710B35131C471B,
0x28DB77F523047D84, 0x32CAAB7B40C72493,
0x3C9EBE0A15C9BEBC, 0x431D67C49C100D4C,
0x4CC5D4BECB3E42B6, 0x597F299CFC657E2A,
0x5FCB6FAB3AD6FAEC, 0x6C44198C4A475817
} ;
int i;
unsigned _int64 temp1, temp2, W[80];
unsigned _int64 A, B, C, D, E, F, G, H;
for( i = 0; i < 16; i++ )
{
W[i] = ( (unsigned _int64) ((BYTE *)InputData)[i * 8] << 56 )
| ( (unsigned _int64) ((BYTE *)InputData)[i * 8 + 1] << 48 )
| ( (unsigned _int64) ((BYTE *)InputData)[i * 8 + 2] << 40 )
| ( (unsigned _int64) ((BYTE *)InputData)[i * 8 + 3] << 32 )
| ( (unsigned _int64) ((BYTE *)InputData)[i * 8 + 4] << 24 )
| ( (unsigned _int64) ((BYTE *)InputData)[i * 8 + 5] << 16 )
| ( (unsigned _int64) ((BYTE *)InputData)[i * 8 + 6] << 8 )
| ( (unsigned _int64) ((BYTE *)InputData)[i * 8 + 7] );
}
for( ; i < 80; i++ )
{
W[i] = S1(W[i - 2]) + W[i - 7] + S0(W[i - 15]) + W[i - 16];
}
A = HashValue[0];
B = HashValue[1];
C = HashValue[2];
D = HashValue[3];
E = HashValue[4];
F = HashValue[5];
G = HashValue[6];
H = HashValue[7];
i = 0;
do
{
P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++;
P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++;
P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++;
P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++;
P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++;
P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++;
P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++;
P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++;
}
while( i < 80 );
HashValue[0] += A;
HashValue[1] += B;
HashValue[2] += C;
HashValue[3] += D;
HashValue[4] += E;
HashValue[5] += F;
HashValue[6] += G;
HashValue[7] += H;
}
void mySHA384_Run( BYTE *InStr , unsigned _int64 LenData , unsigned _int64 OutInt[6] )
{
unsigned _int64 OutIntData[8] = {0} ;
OutIntData[0] = 0xCBBB9D5DC1059ED8;
OutIntData[1] = 0x629A292A367CD507;
OutIntData[2] = 0x9159015A3070DD17;
OutIntData[3] = 0x152FECD8F70E5939;
OutIntData[4] = 0x67332667FFC00B31;
OutIntData[5] = 0x8EB44A8768581511;
OutIntData[6] = 0xDB0C2E0D64F98FA7;
OutIntData[7] = 0x47B5481DBEFA4FA4;
unsigned _int64 TheLen( LenData ) , i(0) ;
BYTE Data128[128] = {0} ;
while( TheLen >= 128 )
{
memcpy( Data128 , InStr + LenData - TheLen , 128 ) ;
mySHA384_SubHASH( (unsigned _int64 *)Data128 , OutIntData ) ;
TheLen -= 128 ;
}
if( TheLen < 112 )
{
BYTE LastData128[128] = {0} ;
for( i = 0 ; i < TheLen ; i++ )
LastData128[i] = InStr[LenData - TheLen + i] ;
LastData128[ TheLen ] = 0x80 ;
LastData128[119] = (BYTE)(LenData >> 61 ) ;
LastData128[120] = (BYTE)(LenData >> 53 ) ;
LastData128[121] = (BYTE)(LenData >> 45 ) ;
LastData128[122] = (BYTE)(LenData >> 37 ) ;
LastData128[123] = (BYTE)(LenData >> 29 ) ;
LastData128[124] = (BYTE)(LenData >> 21 ) ;
LastData128[125] = (BYTE)(LenData >> 13 ) ;
LastData128[126] = (BYTE)(LenData >> 5 ) ;
LastData128[127] = (BYTE)(LenData << 3 ) ;
mySHA384_SubHASH( (unsigned _int64 *)LastData128 , OutIntData ) ;
}
else
{
BYTE LastData128[256] = {0} ;
for( i = 0 ; i < TheLen ; i++ )
LastData128[i] = InStr[LenData - TheLen + i] ;
LastData128[ TheLen ] = 0x80 ;
LastData128[247] = (BYTE)(LenData >> 61 ) ;
LastData128[248] = (BYTE)(LenData >> 53 ) ;
LastData128[249] = (BYTE)(LenData >> 45 ) ;
LastData128[250] = (BYTE)(LenData >> 37 ) ;
LastData128[251] = (BYTE)(LenData >> 29 ) ;
LastData128[252] = (BYTE)(LenData >> 21 ) ;
LastData128[253] = (BYTE)(LenData >> 13 ) ;
LastData128[254] = (BYTE)(LenData >> 5 ) ;
LastData128[255] = (BYTE)(LenData << 3 ) ;
mySHA384_SubHASH( (unsigned _int64 *)LastData128 , OutIntData ) ;
mySHA384_SubHASH( (unsigned _int64 *)LastData128 + 16 , OutIntData ) ;
}
memcpy( OutInt , OutIntData , 6 * sizeof(unsigned _int64) ) ;
return;
}
void mySHA384_RunStr( BYTE *InStr , unsigned _int64 LenData , char OutPutStr[96] )
{
unsigned _int64 OutInt[6] ;
mySHA384_Run(InStr,LenData,OutInt) ;
for( BYTE i = 0 ; i < 6 ; i++ )
{
itoa( (BYTE)(OutInt[i] >> 60) & 0xf , OutPutStr + i * 16 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 56) & 0xf , OutPutStr + i * 16 + 1 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 52) & 0xf , OutPutStr + i * 16 + 2 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 48) & 0xf , OutPutStr + i * 16 + 3 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 44) & 0xf , OutPutStr + i * 16 + 4 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 40) & 0xf , OutPutStr + i * 16 + 5 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 36) & 0xf , OutPutStr + i * 16 + 6 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 32) & 0xf , OutPutStr + i * 16 + 7 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 28) & 0xf , OutPutStr + i * 16 + 8 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 24) & 0xf , OutPutStr + i * 16 + 9 , 16 ) ;
itoa( (BYTE)(OutInt[i] >> 20) & 0xf , OutPutStr + i * 16 + 10, 16 ) ;
itoa( (BYTE)(OutInt[i] >> 16) & 0xf , OutPutStr + i * 16 + 11, 16 ) ;
itoa( (BYTE)(OutInt[i] >> 12) & 0xf , OutPutStr + i * 16 + 12, 16 ) ;
itoa( (BYTE)(OutInt[i] >> 8 ) & 0xf , OutPutStr + i * 16 + 13, 16 ) ;
itoa( (BYTE)(OutInt[i] >> 4 ) & 0xf , OutPutStr + i * 16 + 14, 16 ) ;
itoa( (BYTE)(OutInt[i] ) & 0xf , OutPutStr + i * 16 + 15, 16 ) ;
}
return ;
}
void main() {
};
评论0