void CryptData::DecryptBlock20(unsigned char *Buf) { unsigned char InBuf[16]; unsigned int A,B,C,D,T,TA,TB; #if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT) A=((unsigned int)Buf[0]|((unsigned int)Buf[1]<<8)|((unsigned int)Buf[2]<<16)|((unsigned int)Buf[3]<<24))^Key[0]; B=((unsigned int)Buf[4]|((unsigned int)Buf[5]<<8)|((unsigned int)Buf[6]<<16)|((unsigned int)Buf[7]<<24))^Key[1]; C=((unsigned int)Buf[8]|((unsigned int)Buf[9]<<8)|((unsigned int)Buf[10]<<16)|((unsigned int)Buf[11]<<24))^Key[2]; D=((unsigned int)Buf[12]|((unsigned int)Buf[13]<<8)|((unsigned int)Buf[14]<<16)|((unsigned int)Buf[15]<<24))^Key[3]; #else uint32 *BufPtr=(uint32 *)Buf; A=BufPtr[0]^Key[0]; B=BufPtr[1]^Key[1]; C=BufPtr[2]^Key[2]; D=BufPtr[3]^Key[3]; #endif memcpy(InBuf,Buf,sizeof(InBuf)); for(int I=NROUNDS-1;I>=0;I--) { T=((C+rol(D,11,32))^Key[I&3]); TA=A^substLong(T); T=((D^rol(C,17,32))+Key[I&3]); TB=B^substLong(T); A=C; B=D; C=TA; D=TB; } #if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT) C^=Key[0]; Buf[0]=(unsigned char)C; Buf[1]=(unsigned char)(C>>8); Buf[2]=(unsigned char)(C>>16); Buf[3]=(unsigned char)(C>>24); D^=Key[1]; Buf[4]=(unsigned char)D; Buf[5]=(unsigned char)(D>>8); Buf[6]=(unsigned char)(D>>16); Buf[7]=(unsigned char)(D>>24); A^=Key[2]; Buf[8]=(unsigned char)A; Buf[9]=(unsigned char)(A>>8); Buf[10]=(unsigned char)(A>>16); Buf[11]=(unsigned char)(A>>24); B^=Key[3]; Buf[12]=(unsigned char)B; Buf[13]=(unsigned char)(B>>8); Buf[14]=(unsigned char)(B>>16); Buf[15]=(unsigned char)(B>>24); #else BufPtr[0]=C^Key[0]; BufPtr[1]=D^Key[1]; BufPtr[2]=A^Key[2]; BufPtr[3]=B^Key[3]; #endif UpdKeys(InBuf); }
void CryptData::EncryptBlock20(byte *Buf) { uint A,B,C,D,T,TA,TB; #if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT) A=((uint)Buf[0]|((uint)Buf[1]<<8)|((uint)Buf[2]<<16)|((uint)Buf[3]<<24))^Key[0]; B=((uint)Buf[4]|((uint)Buf[5]<<8)|((uint)Buf[6]<<16)|((uint)Buf[7]<<24))^Key[1]; C=((uint)Buf[8]|((uint)Buf[9]<<8)|((uint)Buf[10]<<16)|((uint)Buf[11]<<24))^Key[2]; D=((uint)Buf[12]|((uint)Buf[13]<<8)|((uint)Buf[14]<<16)|((uint)Buf[15]<<24))^Key[3]; #else uint32 *BufPtr=(uint32 *)Buf; A=BufPtr[0]^Key[0]; B=BufPtr[1]^Key[1]; C=BufPtr[2]^Key[2]; D=BufPtr[3]^Key[3]; #endif for(int I=0;I<NROUNDS;I++) { T=((C+rol(D,11,32))^Key[I&3]); TA=A^substLong(T); T=((D^rol(C,17,32))+Key[I&3]); TB=B^substLong(T); A=C; B=D; C=TA; D=TB; } #if defined(BIG_ENDIAN) || !defined(PRESENT_INT32) || !defined(ALLOW_NOT_ALIGNED_INT) C^=Key[0]; Buf[0]=(byte)C; Buf[1]=(byte)(C>>8); Buf[2]=(byte)(C>>16); Buf[3]=(byte)(C>>24); D^=Key[1]; Buf[4]=(byte)D; Buf[5]=(byte)(D>>8); Buf[6]=(byte)(D>>16); Buf[7]=(byte)(D>>24); A^=Key[2]; Buf[8]=(byte)A; Buf[9]=(byte)(A>>8); Buf[10]=(byte)(A>>16); Buf[11]=(byte)(A>>24); B^=Key[3]; Buf[12]=(byte)B; Buf[13]=(byte)(B>>8); Buf[14]=(byte)(B>>16); Buf[15]=(byte)(B>>24); #else BufPtr[0]=C^Key[0]; BufPtr[1]=D^Key[1]; BufPtr[2]=A^Key[2]; BufPtr[3]=B^Key[3]; #endif UpdKeys(Buf); }