www.pudn.com > 基于SHA-256的HMAC文件校验器.rar > Sha256.cpp


// Sha256.cpp: implementation of the CSha256 class. 
// Programmed by Gamsn 2005.10.22 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "HMac.h" 
#include "Sha256.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CSha256::CSha256() 
{ 
 
} 
 
CSha256::~CSha256() 
{ 
 
} 
 
void CSha256::Init(DWORD dwFullLen) 
{ 
	bOneMore=0; 
	dwA=0x6A09E667; 
	dwB=0xBB67AE85; 
	dwC=0x3C6EF372; 
	dwD=0xA54FF53A; 
	dwE=0x510E527F; 
	dwF=0x9B05688C; 
	dwG=0x1F83D9AB; 
	dwH=0x5BE0CD19; 
	dwLen=dwFullLen; 
	OA=0;OB=0;OC=0;OD=0;OE=0; 
} 
 
DWORD CSha256::f(BYTE t,DWORD B,DWORD C,DWORD D) 
{ 
	if(0<=t && t<=19) 
	{ 
		return (B&C)|(~B&D); 
	} 
	else if(20<=t && t<=39 || 60<=t && t<=79) 
	{ 
		return B^C^D; 
	} 
	else if(40<=t && t<=59) 
	{ 
		return (B&C)|(B&D)|(C&D); 
	} 
	else {AfxMessageBox("WRONG");return 0;} 
} 
 
DWORD CSha256::mod32(DWORD A,DWORD B) 
{ 
	return (A+B)%4294967296; 
} 
 
DWORD CSha256::K(BYTE t) 
{ 
	if(0<=t && t<=19) 
	{ 
		return 0x5A827999; 
	} 
	else if(20<=t && t<=39) 
	{ 
		return 0x6ED9EBA1; 
	} 
	else if(40<=t && t<=59) 
	{ 
		return 0x8F1BBCDC; 
	} 
	else if(60<=t && t<=79) 
	{ 
		return 0xCA62C1D6; 
	} 
	else {AfxMessageBox("WRONG");return 0;} 
} 
 
DWORD CSha256::Maj(DWORD x,DWORD y,DWORD z) 
{ 
	DWORD dwT1=x^y,dwT2=x^z; 
	return mod32(mod32(dwT1,dwT2),dwT2); 
} 
 
DWORD CSha256::Ch(DWORD x,DWORD y,DWORD z) 
{ 
	DWORD dwT1=x^y,dwT2=(~x)^z; 
	return mod32(dwT1,dwT2); 
} 
 
DWORD CSha256::Sum0to256(DWORD x) 
{ 
	DWORD dwT1=_lrotr(x,2),dwT2=_lrotr(x,13),dwT3=_lrotr(x,22); 
	return mod32(mod32(dwT1,dwT2),dwT3); 
} 
 
DWORD CSha256::Sum1to256(DWORD x) 
{ 
	DWORD dwT1=_lrotr(x,6),dwT2=_lrotr(x,11),dwT3=_lrotr(x,25); 
	return mod32(mod32(dwT1,dwT2),dwT3); 
} 
 
void CSha256::Steps() 
{ 
	DWORD A,B,C,D,E,F,G,H,TMP; 
	for(BYTE t=0;t<80;t++) 
	{ 
		A=dwA,B=dwB,C=dwC,D=dwD,E=dwE,F=dwF,G=dwG,H=dwH; 
		TMP=mod32(H,Sum1to256(E)); 
		TMP=mod32(TMP,Ch(E,F,G)); 
		TMP=mod32(TMP,K(t)); 
		TMP=mod32(TMP,dwW[t]); 
		dwA=mod32(mod32(TMP,Sum0to256(E)),Maj(A,B,C)); 
		dwB=A; 
		dwC=B; 
		dwD=C; 
		dwE=mod32(D,TMP); 
		dwF=E; 
		dwG=F; 
		dwH=G; 
	} 
	if(bOneMore) 
	{ 
		BYTE *buffer=new BYTE[64]; 
		for(int i=0;i<56;i++) buffer[i]=0; 
		buffer[56]=(dwLen>>24); 
		dwLen=dwLen & 0x0fff; 
		buffer[57]=(dwLen>>16); 
		dwLen=dwLen & 0x00ff; 
		buffer[58]=(dwLen>>8); 
		dwLen=dwLen & 0x000f; 
		buffer[59]=dwLen; 
		for(i=60;i<64;i++) buffer[i]=0; 
		GenW(buffer,64); 
		for(BYTE t=0;t<80;t++) 
		{ 
			A=dwA,B=dwB,C=dwC,D=dwD,E=dwE,F=dwF,G=dwG,H=dwH; 
			TMP=mod32(H,Sum1to256(E)); 
			TMP=mod32(TMP,Ch(E,F,G)); 
			TMP=mod32(TMP,K(t)); 
			TMP=mod32(TMP,dwW[t]); 
			dwA=mod32(mod32(TMP,Sum0to256(E)),Maj(A,B,C)); 
			dwB=A; 
			dwC=B; 
			dwD=C; 
			dwE=mod32(D,TMP); 
			dwF=E; 
			dwG=F; 
			dwH=G; 
		} 
	} 
	OA=dwA;OB=dwB;OC=dwC;OD=dwD;OE=dwE;OF=dwF;OG=dwG;OH=dwH; 
} 
 
void CSha256::GenW(BYTE buffer[],int nlen) 
{ 
	int i,j=0; 
	BYTE *buffer2=new BYTE[64]; 
	if(nlen<56) 
	{ 
		for(i=0;i>24; 
		dwLen=dwLen & 0x0fff; 
		buffer2[57]=dwLen>>16; 
		dwLen=dwLen & 0x00ff; 
		buffer2[58]=dwLen>>8; 
		dwLen=dwLen & 0x000f; 
		buffer2[59]=dwLen; 
		for(i=60;i<64;i++)	buffer2[i]=0; 
	} 
	else if(nlen>=56 && nlen<64) 
	{ 
		bOneMore=1; 
		for(i=0;i