diff options
Diffstat (limited to 'diamond.cpp')
-rw-r--r-- | diamond.cpp | 572 |
1 files changed, 0 insertions, 572 deletions
diff --git a/diamond.cpp b/diamond.cpp deleted file mode 100644 index 6e68cf4d..00000000 --- a/diamond.cpp +++ /dev/null @@ -1,572 +0,0 @@ -// diamond.cpp - modified by Wei Dai from: - -/* diamond2.c - Encryption designed to exceed DES in security. - This file and the Diamond2 and Diamond2 Lite Block Ciphers - described herein are hereby dedicated to the Public Domain by the - author and inventor, Michael Paul Johnson. Feel free to use these - for any purpose that is legally and morally right. The names - "Diamond2 Block Cipher" and "Diamond2 Lite Block Cipher" should only - be used to describe the algorithms described in this file, to avoid - confusion. - - Disclaimers: the following comes with no warranty, expressed or - implied. You, the user, must determine the suitability of this - information to your own uses. You must also find out what legal - requirements exist with respect to this data and programs using - it, and comply with whatever valid requirements exist. -*/ - -#include "pch.h" -#include "diamond.h" -#include "crc.h" - -NAMESPACE_BEGIN(CryptoPP) - -class Diamond2SboxMaker -{ -public: - Diamond2SboxMaker(const byte *external_key, unsigned int key_size, - unsigned int rounds, bool lite); - - void MakeSbox(byte *sbox, CipherDir direction); - -private: - unsigned int keyrand(unsigned int max_value, const byte *prevSbox); - void makeonebox(byte *s, unsigned int i, unsigned int j); - - CRC32 crc; - const byte *const key; - const unsigned keysize; - unsigned keyindex; - const unsigned numrounds; - const unsigned roundsize; // Number of bytes in one round of substitution boxes - const unsigned blocksize; -}; - -Diamond2SboxMaker::Diamond2SboxMaker(const byte *external_key, unsigned int key_size, unsigned int rounds, - bool lite) - : key(external_key), - keysize(key_size), - keyindex(0), - numrounds(rounds), - roundsize(lite ? 2048 : 4096), - blocksize(lite ? 8 : 16) -{ - assert((rounds * blocksize) <= 255); -} - -// Returns uniformly distributed pseudorandom value based on key[], sized keysize -inline unsigned int Diamond2SboxMaker::keyrand(unsigned int max_value, const byte *prevSbox) -{ - assert(max_value <= 255); - - if (!max_value) return 0; - - unsigned int mask, prandvalue, i; - - // Create a mask to get the minimum number of - // bits to cover the range 0 to max_value. - for (i=max_value, mask=0; i > 0; i = i >> 1) - mask = (mask << 1) | 1; - - assert(i==0); - do - { - if (prevSbox) - crc.UpdateByte(prevSbox[key[keyindex++]]); - else - crc.UpdateByte(key[keyindex++]); - - if (keyindex >= keysize) - { - keyindex = 0; /* Recycle thru the key */ - crc.UpdateByte(byte(keysize)); - crc.UpdateByte(byte(keysize >> 8)); - } - prandvalue = crc.GetCrcByte(0) & mask; - if ((++i>97) && (prandvalue > max_value)) /* Don't loop forever. */ - prandvalue -= max_value; /* Introduce negligible bias. */ - } - while (prandvalue > max_value); /* Discard out of range values. */ - return prandvalue; -} - -void Diamond2SboxMaker::makeonebox(byte *s, unsigned int i, unsigned int j) -{ - bool filled[256]; - byte *sbox = s + (roundsize*i) + (256*j); - byte *prevSbox = (i||j) ? sbox-256 : 0; - - unsigned m; - for (m = 0; m < 256; m++) /* The filled array is used to make sure that */ - filled[m] = false; /* each byte of the array is filled only once. */ - for (int n = 255; n >= 0 ; n--) /* n counts the number of bytes left to fill */ - { - // pos is the position among the UNFILLED - // components of the s array that the number n should be placed. - unsigned pos = keyrand(n, prevSbox); - unsigned p=0; - while (filled[p]) p++; - for (m=0; m<pos; m++) - { - p++; - while (filled[p]) p++; - } - assert(p<256); - sbox[p] = n; - filled[p] = true; - } -} - -void Diamond2SboxMaker::MakeSbox(byte *s, CipherDir direction) -{ - unsigned int i, j, k; - - for (i = 0; i < numrounds; i++) - for (j = 0; j < blocksize; j++) - makeonebox(s, i, j); - - if (direction==DECRYPTION) - { - SecByteBlock si(numrounds * roundsize); - for (i = 0; i < numrounds; i++) - for (j = 0; j < blocksize; j++) - for (k = 0; k < 256; k++) - *(si + (roundsize * i) + (256 * j) + *(s + (roundsize * i) + (256 * j) + k)) = k; - memcpy(s, si, numrounds * roundsize); - } -} - -void Diamond2::Base::UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length, unsigned int rounds) -{ - AssertValidKeyLength(length); - - numrounds = rounds; - s.New(numrounds * ROUNDSIZE); - - Diamond2SboxMaker m(userKey, length, rounds, false); - m.MakeSbox(s, direction); -} - -inline void Diamond2::Base::substitute(int round, byte *x, const byte *y) const -{ - const byte *sbox = s + (ROUNDSIZE*round); - x[0] = sbox[0*256+y[0]]; - x[1] = sbox[1*256+y[1]]; - x[2] = sbox[2*256+y[2]]; - x[3] = sbox[3*256+y[3]]; - x[4] = sbox[4*256+y[4]]; - x[5] = sbox[5*256+y[5]]; - x[6] = sbox[6*256+y[6]]; - x[7] = sbox[7*256+y[7]]; - x[8] = sbox[8*256+y[8]]; - x[9] = sbox[9*256+y[9]]; - x[10] = sbox[10*256+y[10]]; - x[11] = sbox[11*256+y[11]]; - x[12] = sbox[12*256+y[12]]; - x[13] = sbox[13*256+y[13]]; - x[14] = sbox[14*256+y[14]]; - x[15] = sbox[15*256+y[15]]; -} - -#ifdef DIAMOND_USE_PERMTABLE - -inline void Diamond2::Base::permute(byte *a) -{ -#ifdef IS_LITTLE_ENDIAN - word32 temp0 = (a[0] | (word32(a[10])<<24)) & 0x80000001; -#else - word32 temp0 = ((word32(a[0])<<24) | a[10]) & 0x01000080; -#endif - temp0 |= permtable[0][a[1]] | - permtable[1][a[2]] | permtable[2][a[3]] | - permtable[3][a[4]] | permtable[4][a[5]] | - permtable[5][a[6]] | permtable[6][a[7]] | - permtable[7][a[8]] | permtable[8][a[9]]; - -#ifdef IS_LITTLE_ENDIAN - word32 temp1 = (a[4] | (word32(a[14])<<24)) & 0x80000001; -#else - word32 temp1 = ((word32(a[4])<<24) | a[14]) & 0x01000080; -#endif - temp1 |= permtable[0][a[5]] | - permtable[1][a[6]] | permtable[2][a[7]] | - permtable[3][a[8]] | permtable[4][a[9]] | - permtable[5][a[10]] | permtable[6][a[11]] | - permtable[7][a[12]] | permtable[8][a[13]]; - -#ifdef IS_LITTLE_ENDIAN - word32 temp2 = (a[8] | (word32(a[2])<<24)) & 0x80000001; -#else - word32 temp2 = ((word32(a[8])<<24) | a[2]) & 0x01000080; -#endif - temp2 |= permtable[0][a[9]] | - permtable[1][a[10]] | permtable[2][a[11]] | - permtable[3][a[12]] | permtable[4][a[13]] | - permtable[5][a[14]] | permtable[6][a[15]] | - permtable[7][a[0]] | permtable[8][a[1]]; - -#ifdef IS_LITTLE_ENDIAN - word32 temp3 = (a[12] | (word32(a[6])<<24)) & 0x80000001; -#else - word32 temp3 = ((word32(a[12])<<24) | a[6]) & 0x01000080; -#endif - ((word32 *)a)[3] = temp3 | permtable[0][a[13]] | - permtable[1][a[14]] | permtable[2][a[15]] | - permtable[3][a[0]] | permtable[4][a[1]] | - permtable[5][a[2]] | permtable[6][a[3]] | - permtable[7][a[4]] | permtable[8][a[5]]; - - ((word32 *)a)[0] = temp0; - ((word32 *)a)[1] = temp1; - ((word32 *)a)[2] = temp2; -} - -inline void Diamond2::Base::ipermute(byte *a) -{ -#ifdef IS_LITTLE_ENDIAN - word32 temp0 = (a[9] | (word32(a[3])<<24)) & 0x01000080; -#else - word32 temp0 = ((word32(a[9])<<24) | a[3]) & 0x80000001; -#endif - temp0 |= ipermtable[0][a[2]] | - ipermtable[1][a[1]] | ipermtable[2][a[0]] | - ipermtable[3][a[15]] | ipermtable[4][a[14]] | - ipermtable[5][a[13]] | ipermtable[6][a[12]] | - ipermtable[7][a[11]] | ipermtable[8][a[10]]; - -#ifdef IS_LITTLE_ENDIAN - word32 temp1 = (a[13] | (word32(a[7])<<24)) & 0x01000080; -#else - word32 temp1 = ((word32(a[13])<<24) | a[7]) & 0x80000001; -#endif - temp1 |= ipermtable[0][a[6]] | - ipermtable[1][a[5]] | ipermtable[2][a[4]] | - ipermtable[3][a[3]] | ipermtable[4][a[2]] | - ipermtable[5][a[1]] | ipermtable[6][a[0]] | - ipermtable[7][a[15]] | ipermtable[8][a[14]]; - -#ifdef IS_LITTLE_ENDIAN - word32 temp2 = (a[1] | (word32(a[11])<<24)) & 0x01000080; -#else - word32 temp2 = ((word32(a[1])<<24) | a[11]) & 0x80000001; -#endif - temp2 |= ipermtable[0][a[10]] | - ipermtable[1][a[9]] | ipermtable[2][a[8]] | - ipermtable[3][a[7]] | ipermtable[4][a[6]] | - ipermtable[5][a[5]] | ipermtable[6][a[4]] | - ipermtable[7][a[3]] | ipermtable[8][a[2]]; - -#ifdef IS_LITTLE_ENDIAN - word32 temp3 = (a[5] | (word32(a[15])<<24)) & 0x01000080; -#else - word32 temp3 = ((word32(a[5])<<24) | a[15]) & 0x80000001; -#endif - ((word32 *)a)[3] = temp3 | ipermtable[0][a[14]] | - ipermtable[1][a[13]] | ipermtable[2][a[12]] | - ipermtable[3][a[11]] | ipermtable[4][a[10]] | - ipermtable[5][a[9]] | ipermtable[6][a[8]] | - ipermtable[7][a[7]] | ipermtable[8][a[6]]; - - ((word32 *)a)[0] = temp0; - ((word32 *)a)[1] = temp1; - ((word32 *)a)[2] = temp2; -} - -#else // DIAMOND_USE_PERMTABLE - -inline void Diamond2::Base::permute(byte *x) -{ - byte y[16]; - - y[0] = (x[0] & 1) | (x[1] & 2) | (x[2] & 4) | - (x[3] & 8) | (x[4] & 16) | (x[5] & 32) | - (x[6] & 64) | (x[7] & 128); - y[1] = (x[1] & 1) | (x[2] & 2) | (x[3] & 4) | - (x[4] & 8) | (x[5] & 16) | (x[6] & 32) | - (x[7] & 64) | (x[8] & 128); - y[2] = (x[2] & 1) | (x[3] & 2) | (x[4] & 4) | - (x[5] & 8) | (x[6] & 16) | (x[7] & 32) | - (x[8] & 64) | (x[9] & 128); - y[3] = (x[3] & 1) | (x[4] & 2) | (x[5] & 4) | - (x[6] & 8) | (x[7] & 16) | (x[8] & 32) | - (x[9] & 64) | (x[10] & 128); - y[4] = (x[4] & 1) | (x[5] & 2) | (x[6] & 4) | - (x[7] & 8) | (x[8] & 16) | (x[9] & 32) | - (x[10] & 64) | (x[11] & 128); - y[5] = (x[5] & 1) | (x[6] & 2) | (x[7] & 4) | - (x[8] & 8) | (x[9] & 16) | (x[10] & 32) | - (x[11] & 64) | (x[12] & 128); - y[6] = (x[6] & 1) | (x[7] & 2) | (x[8] & 4) | - (x[9] & 8) | (x[10] & 16) | (x[11] & 32) | - (x[12] & 64) | (x[13] & 128); - y[7] = (x[7] & 1) | (x[8] & 2) | (x[9] & 4) | - (x[10] & 8) | (x[11] & 16) | (x[12] & 32) | - (x[13] & 64) | (x[14] & 128); - y[8] = (x[8] & 1) | (x[9] & 2) | (x[10] & 4) | - (x[11] & 8) | (x[12] & 16) | (x[13] & 32) | - (x[14] & 64) | (x[15] & 128); - y[9] = (x[9] & 1) | (x[10] & 2) | (x[11] & 4) | - (x[12] & 8) | (x[13] & 16) | (x[14] & 32) | - (x[15] & 64) | (x[0] & 128); - y[10] = (x[10] & 1) | (x[11] & 2) | (x[12] & 4) | - (x[13] & 8) | (x[14] & 16) | (x[15] & 32) | - (x[0] & 64) | (x[1] & 128); - y[11] = (x[11] & 1) | (x[12] & 2) | (x[13] & 4) | - (x[14] & 8) | (x[15] & 16) | (x[0] & 32) | - (x[1] & 64) | (x[2] & 128); - y[12] = (x[12] & 1) | (x[13] & 2) | (x[14] & 4) | - (x[15] & 8) | (x[0] & 16) | (x[1] & 32) | - (x[2] & 64) | (x[3] & 128); - y[13] = (x[13] & 1) | (x[14] & 2) | (x[15] & 4) | - (x[0] & 8) | (x[1] & 16) | (x[2] & 32) | - (x[3] & 64) | (x[4] & 128); - y[14] = (x[14] & 1) | (x[15] & 2) | (x[0] & 4) | - (x[1] & 8) | (x[2] & 16) | (x[3] & 32) | - (x[4] & 64) | (x[5] & 128); - y[15] = (x[15] & 1) | (x[0] & 2) | (x[1] & 4) | - (x[2] & 8) | (x[3] & 16) | (x[4] & 32) | - (x[5] & 64) | (x[6] & 128); - - memcpy(x, y, 16); -} - -inline void Diamond2::Base::ipermute(byte *x) -{ - byte y[16]; - - y[0] = (x[0] & 1) | (x[15] & 2) | (x[14] & 4) | - (x[13] & 8) | (x[12] & 16) | (x[11] & 32) | - (x[10] & 64) | (x[9] & 128); - y[1] = (x[1] & 1) | (x[0] & 2) | (x[15] & 4) | - (x[14] & 8) | (x[13] & 16) | (x[12] & 32) | - (x[11] & 64) | (x[10] & 128); - y[2] = (x[2] & 1) | (x[1] & 2) | (x[0] & 4) | - (x[15] & 8) | (x[14] & 16) | (x[13] & 32) | - (x[12] & 64) | (x[11] & 128); - y[3] = (x[3] & 1) | (x[2] & 2) | (x[1] & 4) | - (x[0] & 8) | (x[15] & 16) | (x[14] & 32) | - (x[13] & 64) | (x[12] & 128); - y[4] = (x[4] & 1) | (x[3] & 2) | (x[2] & 4) | - (x[1] & 8) | (x[0] & 16) | (x[15] & 32) | - (x[14] & 64) | (x[13] & 128); - y[5] = (x[5] & 1) | (x[4] & 2) | (x[3] & 4) | - (x[2] & 8) | (x[1] & 16) | (x[0] & 32) | - (x[15] & 64) | (x[14] & 128); - y[6] = (x[6] & 1) | (x[5] & 2) | (x[4] & 4) | - (x[3] & 8) | (x[2] & 16) | (x[1] & 32) | - (x[0] & 64) | (x[15] & 128); - y[7] = (x[7] & 1) | (x[6] & 2) | (x[5] & 4) | - (x[4] & 8) | (x[3] & 16) | (x[2] & 32) | - (x[1] & 64) | (x[0] & 128); - y[8] = (x[8] & 1) | (x[7] & 2) | (x[6] & 4) | - (x[5] & 8) | (x[4] & 16) | (x[3] & 32) | - (x[2] & 64) | (x[1] & 128); - y[9] = (x[9] & 1) | (x[8] & 2) | (x[7] & 4) | - (x[6] & 8) | (x[5] & 16) | (x[4] & 32) | - (x[3] & 64) | (x[2] & 128); - y[10] = (x[10] & 1) | (x[9] & 2) | (x[8] & 4) | - (x[7] & 8) | (x[6] & 16) | (x[5] & 32) | - (x[4] & 64) | (x[3] & 128); - y[11] = (x[11] & 1) | (x[10] & 2) | (x[9] & 4) | - (x[8] & 8) | (x[7] & 16) | (x[6] & 32) | - (x[5] & 64) | (x[4] & 128); - y[12] = (x[12] & 1) | (x[11] & 2) | (x[10] & 4) | - (x[9] & 8) | (x[8] & 16) | (x[7] & 32) | - (x[6] & 64) | (x[5] & 128); - y[13] = (x[13] & 1) | (x[12] & 2) | (x[11] & 4) | - (x[10] & 8) | (x[9] & 16) | (x[8] & 32) | - (x[7] & 64) | (x[6] & 128); - y[14] = (x[14] & 1) | (x[13] & 2) | (x[12] & 4) | - (x[11] & 8) | (x[10] & 16) | (x[9] & 32) | - (x[8] & 64) | (x[7] & 128); - y[15] = (x[15] & 1) | (x[14] & 2) | (x[13] & 4) | - (x[12] & 8) | (x[11] & 16) | (x[10] & 32) | - (x[9] & 64) | (x[8] & 128); - - memcpy(x, y, 16); -} - -#endif // DIAMOND_USE_PERMTABLE - -void Diamond2::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const -{ - const byte *x = inBlock; - byte y[16]; - - substitute(0, y, x); - for (int round=1; round < numrounds; round++) - { - permute(y); - substitute(round, y, y); - } - - if (xorBlock) - xorbuf(outBlock, xorBlock, y, BLOCKSIZE); - else - memcpy(outBlock, y, BLOCKSIZE); -} - -void Diamond2::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const -{ - const byte *x = inBlock; - byte y[16]; - - substitute(numrounds-1, y, x); - for (int round=numrounds-2; round >= 0; round--) - { - ipermute(y); - substitute(round, y, y); - } - - if (xorBlock) - xorbuf(outBlock, xorBlock, y, BLOCKSIZE); - else - memcpy(outBlock, y, BLOCKSIZE); -} - -void Diamond2Lite::Base::UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length, unsigned int rounds) -{ - AssertValidKeyLength(length); - - numrounds = rounds; - s.New(numrounds * ROUNDSIZE); - - Diamond2SboxMaker m(userKey, length, rounds, true); - m.MakeSbox(s, direction); -} - -inline void Diamond2Lite::Base::substitute(int round, byte *x, const byte *y) const -{ - const byte *sbox = s + (ROUNDSIZE*round); - x[0] = sbox[0*256+y[0]]; - x[1] = sbox[1*256+y[1]]; - x[2] = sbox[2*256+y[2]]; - x[3] = sbox[3*256+y[3]]; - x[4] = sbox[4*256+y[4]]; - x[5] = sbox[5*256+y[5]]; - x[6] = sbox[6*256+y[6]]; - x[7] = sbox[7*256+y[7]]; -} - -#ifdef DIAMOND_USE_PERMTABLE - -inline void Diamond2Lite::Base::permute(byte *a) -{ - word32 temp = permtable[0][a[0]] | permtable[1][a[1]] | - permtable[2][a[2]] | permtable[3][a[3]] | - permtable[4][a[4]] | permtable[5][a[5]] | - permtable[6][a[6]] | permtable[7][a[7]]; - - ((word32 *)a)[1] = permtable[0][a[4]] | permtable[1][a[5]] | - permtable[2][a[6]] | permtable[3][a[7]] | - permtable[4][a[0]] | permtable[5][a[1]] | - permtable[6][a[2]] | permtable[7][a[3]]; - - ((word32 *)a)[0] = temp; -} - -inline void Diamond2Lite::Base::ipermute(byte *a) -{ - word32 temp = ipermtable[0][a[0]] | ipermtable[1][a[1]] | - ipermtable[2][a[2]] | ipermtable[3][a[3]] | - ipermtable[4][a[4]] | ipermtable[5][a[5]] | - ipermtable[6][a[6]] | ipermtable[7][a[7]]; - - ((word32 *)a)[1] = ipermtable[0][a[4]] | ipermtable[1][a[5]] | - ipermtable[2][a[6]] | ipermtable[3][a[7]] | - ipermtable[4][a[0]] | ipermtable[5][a[1]] | - ipermtable[6][a[2]] | ipermtable[7][a[3]]; - - ((word32 *)a)[0] = temp; -} - -#else - -inline void Diamond2Lite::Base::permute(byte *a) -{ - byte b[8]; - - b[0] = (a[0] & 1) + (a[1] & 2) + (a[2] & 4) + (a[3] & 8) + (a[4] & 0x10) + - (a[5] & 0x20) + (a[6] & 0x40) + (a[7] & 0x80); - b[1] = (a[1] & 1) + (a[2] & 2) + (a[3] & 4) + (a[4] & 8) + (a[5] & 0x10) + - (a[6] & 0x20) + (a[7] & 0x40) + (a[0] & 0x80); - b[2] = (a[2] & 1) + (a[3] & 2) + (a[4] & 4) + (a[5] & 8) + (a[6] & 0x10) + - (a[7] & 0x20) + (a[0] & 0x40) + (a[1] & 0x80); - b[3] = (a[3] & 1) + (a[4] & 2) + (a[5] & 4) + (a[6] & 8) + (a[7] & 0x10) + - (a[0] & 0x20) + (a[1] & 0x40) + (a[2] & 0x80); - b[4] = (a[4] & 1) + (a[5] & 2) + (a[6] & 4) + (a[7] & 8) + (a[0] & 0x10) + - (a[1] & 0x20) + (a[2] & 0x40) + (a[3] & 0x80); - b[5] = (a[5] & 1) + (a[6] & 2) + (a[7] & 4) + (a[0] & 8) + (a[1] & 0x10) + - (a[2] & 0x20) + (a[3] & 0x40) + (a[4] & 0x80); - b[6] = (a[6] & 1) + (a[7] & 2) + (a[0] & 4) + (a[1] & 8) + (a[2] & 0x10) + - (a[3] & 0x20) + (a[4] & 0x40) + (a[5] & 0x80); - b[7] = (a[7] & 1) + (a[0] & 2) + (a[1] & 4) + (a[2] & 8) + (a[3] & 0x10) + - (a[4] & 0x20) + (a[5] & 0x40) + (a[6] & 0x80); - - memcpy(a, b, 8); -} - -inline void Diamond2Lite::Base::ipermute(byte *b) -{ - byte a[8]; - - a[0] = (b[0] & 1) + (b[7] & 2) + (b[6] & 4) + (b[5] & 8) + (b[4] & 0x10) + - (b[3] & 0x20) + (b[2] & 0x40) + (b[1] & 0x80); - a[1] = (b[1] & 1) + (b[0] & 2) + (b[7] & 4) + (b[6] & 8) + (b[5] & 0x10) + - (b[4] & 0x20) + (b[3] & 0x40) + (b[2] & 0x80); - a[2] = (b[2] & 1) + (b[1] & 2) + (b[0] & 4) + (b[7] & 8) + (b[6] & 0x10) + - (b[5] & 0x20) + (b[4] & 0x40) + (b[3] & 0x80); - a[3] = (b[3] & 1) + (b[2] & 2) + (b[1] & 4) + (b[0] & 8) + (b[7] & 0x10) + - (b[6] & 0x20) + (b[5] & 0x40) + (b[4] & 0x80); - a[4] = (b[4] & 1) + (b[3] & 2) + (b[2] & 4) + (b[1] & 8) + (b[0] & 0x10) + - (b[7] & 0x20) + (b[6] & 0x40) + (b[5] & 0x80); - a[5] = (b[5] & 1) + (b[4] & 2) + (b[3] & 4) + (b[2] & 8) + (b[1] & 0x10) + - (b[0] & 0x20) + (b[7] & 0x40) + (b[6] & 0x80); - a[6] = (b[6] & 1) + (b[5] & 2) + (b[4] & 4) + (b[3] & 8) + (b[2] & 0x10) + - (b[1] & 0x20) + (b[0] & 0x40) + (b[7] & 0x80); - a[7] = (b[7] & 1) + (b[6] & 2) + (b[5] & 4) + (b[4] & 8) + (b[3] & 0x10) + - (b[2] & 0x20) + (b[1] & 0x40) + (b[0] & 0x80); - - memcpy(b, a, 8); -} - -#endif // DIAMOND_USE_PERMTABLE - -void Diamond2Lite::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const -{ - const byte *x = inBlock; - byte y[8]; - - substitute(0, y, x); - for (int round=1; round < numrounds; round++) - { - permute(y); - substitute(round, y, y); - } - - if (xorBlock) - xorbuf(outBlock, xorBlock, y, BLOCKSIZE); - else - memcpy(outBlock, y, BLOCKSIZE); -} - -void Diamond2Lite::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const -{ - const byte *x = inBlock; - byte y[8]; - - substitute(numrounds-1, y, x); - for (int round=numrounds-2; round >= 0; round--) - { - ipermute(y); - substitute(round, y, y); - } - - if (xorBlock) - xorbuf(outBlock, xorBlock, y, BLOCKSIZE); - else - memcpy(outBlock, y, BLOCKSIZE); -} - -NAMESPACE_END |