// wake.cpp - written and placed in the public domain by Wei Dai #include "pch.h" #include "wake.h" #include "strciphr.cpp" NAMESPACE_BEGIN(CryptoPP) void WAKE_TestInstantiations() { WAKE_CFB<>::Encryption x1; WAKE_CFB<>::Decryption x3; WAKE_OFB<>::Encryption x2; WAKE_OFB<>::Decryption x4; } inline word32 WAKE_Base::M(word32 x, word32 y) { word32 w = x+y; return (w>>8) ^ t[(byte)w]; } void WAKE_Base::GenKey(word32 k0, word32 k1, word32 k2, word32 k3) { long x, z; int p ; static long tt[10]= { 0x726a8f3bL, // table 0xe69a3b5cL, 0xd3c71fe5L, 0xab3c73d2L, 0x4d3a8eb3L, 0x0396d6e8L, 0x3d4c2f7aL, 0x9ee27cf3L, } ; t[0] = k0; t[1] = k1; t[2] = k2; t[3] = k3; for (p=4 ; p<256 ; p++) { x=t[p-4]+t[p-1] ; // fill t t[p]= (x>>3) ^ tt[byte(x&7)] ; } for (p=0 ; p<23 ; p++) t[p]+=t[p+89] ; // mix first entries x=t[33] ; z=t[59] | 0x01000001L ; z=z&0xff7fffffL ; for (p=0 ; p<256 ; p++) { //change top byte to x=(x&0xff7fffffL)+z ; // a permutation etc t[p]=(t[p] & 0x00ffffffL) ^ x ; } t[256]=t[0] ; byte y=byte(x); for (p=0 ; p<256 ; p++) { // further change perm. t[p]=t[y=byte(t[p^y]^y)] ; // and other digits t[y]=t[p+1] ; } } template void WAKE_Policy::CipherSetKey(const NameValuePairs ¶ms, const byte *key, unsigned int length) { word32 k0, k1, k2, k3; BlockGetAndPut::Get(key)(r3)(r4)(r5)(r6)(k0)(k1)(k2)(k3); GenKey(k0, k1, k2, k3); } // CFB template void WAKE_Policy::Iterate(byte *output, const byte *input, CipherDir dir, unsigned int iterationCount) { RegisterOutput registerOutput(output, input, dir); while (iterationCount--) { r3 = M(r3, ConditionalByteReverse(B::ToEnum(), r6)); r4 = M(r4, r3); r5 = M(r5, r4); r6 = M(r6, r5); registerOutput(r6); } } // OFB template void WAKE_Policy::OperateKeystream(KeystreamOperation operation, byte *output, const byte *input, unsigned int iterationCount) { KeystreamOutput keystreamOperation(operation, output, input); while (iterationCount--) { keystreamOperation(r6); r3 = M(r3, r6); r4 = M(r4, r3); r5 = M(r5, r4); r6 = M(r6, r5); } } /* template void WAKE_ROFB_Policy::Iterate(KeystreamOperation operation, byte *output, const byte *input, unsigned int iterationCount) { KeystreamOutput keystreamOperation(operation, output, input); while (iterationCount--) { keystreamOperation(r6); r3 = M(r3, r6); r4 = M(r4, r3); r5 = M(r5, r4); r6 = M(r6, r5); } } */ template class WAKE_Policy; template class WAKE_Policy; //template class WAKE_ROFB_Policy; //template class WAKE_ROFB_Policy; NAMESPACE_END