Bazaar/StreamCypher : added a couple of class for stream data encoding/decoding

git-svn-id: svn://ultimatepp.org/upp/trunk@2726 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
micio 2010-09-29 17:40:12 +00:00
parent e39a414b71
commit b23908dff1
19 changed files with 1165 additions and 0 deletions

View file

@ -0,0 +1,90 @@
#include "RC4.h"
NAMESPACE_UPP
RC4::RC4()
{
memset(sbox, 0, 256);
si = sj = 0;
}
RC4::RC4(String const &key)
{
SetKey(key);
}
RC4::RC4(byte const *keyBuf, int keyLen)
{
SetKey(keyBuf, keyLen);
}
bool RC4::SetKey(String const &key)
{
byte const *b = (byte const *)~key;
int keyLen = key.GetCount();
return SetKey(b, keyLen);
}
bool RC4::SetKey(byte const *keyBuf, int keyLen)
{
int i, j;
unsigned char keyarr[256], swap;
si = sj = 0;
for (i = j = 0; i < 256; i++, j = (j + 1) % keyLen)
{
sbox[i] = i;
keyarr[i] = keyBuf[j];
}
for (i = j = 0; i < 256; i++)
{
j += sbox[i] + keyarr[i];
j %= 256;
swap = sbox[i];
sbox[i] = sbox[j];
sbox[j] = swap;
}
return true;
}
void RC4::Encode(const byte *src, byte *dst, size_t len)
{
unsigned char swap;
while (len--)
{
sj += sbox[++si];
swap = sbox[si];
sbox[si] = sbox[sj];
sbox[sj] = swap;
swap = sbox[si] + sbox[sj];
*dst++ = *src++ ^ sbox[swap];
}
}
void RC4::Encode(byte *buf, size_t len)
{
Encode(buf, buf, len);
}
String RC4::Encode(String const &s)
{
unsigned char swap;
int i = 0;
int len = s.GetCount();
String res;
while (len--)
{
sj += sbox[++si];
swap = sbox[si];
sbox[si] = sbox[sj];
sbox[sj] = swap;
swap = sbox[si] + sbox[sj];
res += s[i++] ^ sbox[swap];
}
return res;
}
END_UPP_NAMESPACE;

31
bazaar/StreamCypher/RC4.h Normal file
View file

@ -0,0 +1,31 @@
#ifndef _TestProtec_RC4_h_
#define _TestProtec_RC4_h_
#include <Core/Core.h>
NAMESPACE_UPP
class RC4
{
private:
byte sbox[256];
byte si, sj;
public:
RC4();
RC4(String const &key);
RC4(byte const *keyBuf, int keyLen);
bool SetKey(String const &key);
bool SetKey(byte const *keyBuf, int keyLen);
void Encode(const byte *src, byte *dst, size_t len);
void Encode(byte *buf, size_t len);
String Encode(String const &s);
};
END_UPP_NAMESPACE
#endif

View file

@ -0,0 +1,626 @@
#include "Snow2.h"
NAMESPACE_UPP
static dword snow_alpha_mul[256]=
{
0x00000000,0xE19FCF13,0x6B973726,0x8A08F835,0xD6876E4C,0x3718A15F,0xBD10596A,0x5C8F9679,
0x05A7DC98,0xE438138B,0x6E30EBBE,0x8FAF24AD,0xD320B2D4,0x32BF7DC7,0xB8B785F2,0x59284AE1,
0x0AE71199,0xEB78DE8A,0x617026BF,0x80EFE9AC,0xDC607FD5,0x3DFFB0C6,0xB7F748F3,0x566887E0,
0x0F40CD01,0xEEDF0212,0x64D7FA27,0x85483534,0xD9C7A34D,0x38586C5E,0xB250946B,0x53CF5B78,
0x1467229B,0xF5F8ED88,0x7FF015BD,0x9E6FDAAE,0xC2E04CD7,0x237F83C4,0xA9777BF1,0x48E8B4E2,
0x11C0FE03,0xF05F3110,0x7A57C925,0x9BC80636,0xC747904F,0x26D85F5C,0xACD0A769,0x4D4F687A,
0x1E803302,0xFF1FFC11,0x75170424,0x9488CB37,0xC8075D4E,0x2998925D,0xA3906A68,0x420FA57B,
0x1B27EF9A,0xFAB82089,0x70B0D8BC,0x912F17AF,0xCDA081D6,0x2C3F4EC5,0xA637B6F0,0x47A879E3,
0x28CE449F,0xC9518B8C,0x435973B9,0xA2C6BCAA,0xFE492AD3,0x1FD6E5C0,0x95DE1DF5,0x7441D2E6,
0x2D699807,0xCCF65714,0x46FEAF21,0xA7616032,0xFBEEF64B,0x1A713958,0x9079C16D,0x71E60E7E,
0x22295506,0xC3B69A15,0x49BE6220,0xA821AD33,0xF4AE3B4A,0x1531F459,0x9F390C6C,0x7EA6C37F,
0x278E899E,0xC611468D,0x4C19BEB8,0xAD8671AB,0xF109E7D2,0x109628C1,0x9A9ED0F4,0x7B011FE7,
0x3CA96604,0xDD36A917,0x573E5122,0xB6A19E31,0xEA2E0848, 0xBB1C75B,0x81B93F6E,0x6026F07D,
0x390EBA9C,0xD891758F,0x52998DBA,0xB30642A9,0xEF89D4D0, 0xE161BC3,0x841EE3F6,0x65812CE5,
0x364E779D,0xD7D1B88E,0x5DD940BB,0xBC468FA8,0xE0C919D1, 0x156D6C2,0x8B5E2EF7,0x6AC1E1E4,
0x33E9AB05,0xD2766416,0x587E9C23,0xB9E15330,0xE56EC549, 0x4F10A5A,0x8EF9F26F,0x6F663D7C,
0x50358897,0xB1AA4784,0x3BA2BFB1,0xDA3D70A2,0x86B2E6DB,0x672D29C8,0xED25D1FD, 0xCBA1EEE,
0x5592540F,0xB40D9B1C,0x3E056329,0xDF9AAC3A,0x83153A43,0x628AF550,0xE8820D65, 0x91DC276,
0x5AD2990E,0xBB4D561D,0x3145AE28,0xD0DA613B,0x8C55F742,0x6DCA3851,0xE7C2C064, 0x65D0F77,
0x5F754596,0xBEEA8A85,0x34E272B0,0xD57DBDA3,0x89F22BDA,0x686DE4C9,0xE2651CFC, 0x3FAD3EF,
0x4452AA0C,0xA5CD651F,0x2FC59D2A,0xCE5A5239,0x92D5C440,0x734A0B53,0xF942F366,0x18DD3C75,
0x41F57694,0xA06AB987,0x2A6241B2,0xCBFD8EA1,0x977218D8,0x76EDD7CB,0xFCE52FFE,0x1D7AE0ED,
0x4EB5BB95,0xAF2A7486,0x25228CB3,0xC4BD43A0,0x9832D5D9,0x79AD1ACA,0xF3A5E2FF,0x123A2DEC,
0x4B12670D,0xAA8DA81E,0x2085502B,0xC11A9F38,0x9D950941,0x7C0AC652,0xF6023E67,0x179DF174,
0x78FBCC08,0x9964031B,0x136CFB2E,0xF2F3343D,0xAE7CA244,0x4FE36D57,0xC5EB9562,0x24745A71,
0x7D5C1090,0x9CC3DF83,0x16CB27B6,0xF754E8A5,0xABDB7EDC,0x4A44B1CF,0xC04C49FA,0x21D386E9,
0x721CDD91,0x93831282,0x198BEAB7,0xF81425A4,0xA49BB3DD,0x45047CCE,0xCF0C84FB,0x2E934BE8,
0x77BB0109,0x9624CE1A,0x1C2C362F,0xFDB3F93C,0xA13C6F45,0x40A3A056,0xCAAB5863,0x2B349770,
0x6C9CEE93,0x8D032180, 0x70BD9B5,0xE69416A6,0xBA1B80DF,0x5B844FCC,0xD18CB7F9,0x301378EA,
0x693B320B,0x88A4FD18, 0x2AC052D,0xE333CA3E,0xBFBC5C47,0x5E239354,0xD42B6B61,0x35B4A472,
0x667BFF0A,0x87E43019, 0xDECC82C,0xEC73073F,0xB0FC9146,0x51635E55,0xDB6BA660,0x3AF46973,
0x63DC2392,0x8243EC81, 0x84B14B4,0xE9D4DBA7,0xB55B4DDE,0x54C482CD,0xDECC7AF8,0x3F53B5EB
};
static dword snow_alphainv_mul[256]=
{
0x00000000,0x180F40CD,0x301E8033,0x2811C0FE,0x603CA966,0x7833E9AB,0x50222955,0x482D6998,
0xC078FBCC,0xD877BB01,0xF0667BFF,0xE8693B32,0xA04452AA,0xB84B1267,0x905AD299,0x88559254,
0x29F05F31,0x31FF1FFC,0x19EEDF02, 0x1E19FCF,0x49CCF657,0x51C3B69A,0x79D27664,0x61DD36A9,
0xE988A4FD,0xF187E430,0xD99624CE,0xC1996403,0x89B40D9B,0x91BB4D56,0xB9AA8DA8,0xA1A5CD65,
0x5249BE62,0x4A46FEAF,0x62573E51,0x7A587E9C,0x32751704,0x2A7A57C9, 0x26B9737,0x1A64D7FA,
0x923145AE,0x8A3E0563,0xA22FC59D,0xBA208550,0xF20DECC8,0xEA02AC05,0xC2136CFB,0xDA1C2C36,
0x7BB9E153,0x63B6A19E,0x4BA76160,0x53A821AD,0x1B854835, 0x38A08F8,0x2B9BC806,0x339488CB,
0xBBC11A9F,0xA3CE5A52,0x8BDF9AAC,0x93D0DA61,0xDBFDB3F9,0xC3F2F334,0xEBE333CA,0xF3EC7307,
0xA492D5C4,0xBC9D9509,0x948C55F7,0x8C83153A,0xC4AE7CA2,0xDCA13C6F,0xF4B0FC91,0xECBFBC5C,
0x64EA2E08,0x7CE56EC5,0x54F4AE3B,0x4CFBEEF6, 0x4D6876E,0x1CD9C7A3,0x34C8075D,0x2CC74790,
0x8D628AF5,0x956DCA38,0xBD7C0AC6,0xA5734A0B,0xED5E2393,0xF551635E,0xDD40A3A0,0xC54FE36D,
0x4D1A7139,0x551531F4,0x7D04F10A,0x650BB1C7,0x2D26D85F,0x35299892,0x1D38586C, 0x53718A1,
0xF6DB6BA6,0xEED42B6B,0xC6C5EB95,0xDECAAB58,0x96E7C2C0,0x8EE8820D,0xA6F942F3,0xBEF6023E,
0x36A3906A,0x2EACD0A7, 0x6BD1059,0x1EB25094,0x569F390C,0x4E9079C1,0x6681B93F,0x7E8EF9F2,
0xDF2B3497,0xC724745A,0xEF35B4A4,0xF73AF469,0xBF179DF1,0xA718DD3C,0x8F091DC2,0x97065D0F,
0x1F53CF5B, 0x75C8F96,0x2F4D4F68,0x37420FA5,0x7F6F663D,0x676026F0,0x4F71E60E,0x577EA6C3,
0xE18D0321,0xF98243EC,0xD1938312,0xC99CC3DF,0x81B1AA47,0x99BEEA8A,0xB1AF2A74,0xA9A06AB9,
0x21F5F8ED,0x39FAB820,0x11EB78DE, 0x9E43813,0x41C9518B,0x59C61146,0x71D7D1B8,0x69D89175,
0xC87D5C10,0xD0721CDD,0xF863DC23,0xE06C9CEE,0xA841F576,0xB04EB5BB,0x985F7545,0x80503588,
0x0805A7DC,0x100AE711,0x381B27EF,0x20146722,0x68390EBA,0x70364E77,0x58278E89,0x4028CE44,
0xB3C4BD43,0xABCBFD8E,0x83DA3D70,0x9BD57DBD,0xD3F81425,0xCBF754E8,0xE3E69416,0xFBE9D4DB,
0x73BC468F,0x6BB30642,0x43A2C6BC,0x5BAD8671,0x1380EFE9, 0xB8FAF24,0x239E6FDA,0x3B912F17,
0x9A34E272,0x823BA2BF,0xAA2A6241,0xB225228C,0xFA084B14,0xE2070BD9,0xCA16CB27,0xD2198BEA,
0x5A4C19BE,0x42435973,0x6A52998D,0x725DD940,0x3A70B0D8,0x227FF015, 0xA6E30EB,0x12617026,
0x451FD6E5,0x5D109628,0x750156D6,0x6D0E161B,0x25237F83,0x3D2C3F4E,0x153DFFB0, 0xD32BF7D,
0x85672D29,0x9D686DE4,0xB579AD1A,0xAD76EDD7,0xE55B844F,0xFD54C482,0xD545047C,0xCD4A44B1,
0x6CEF89D4,0x74E0C919,0x5CF109E7,0x44FE492A, 0xCD320B2,0x14DC607F,0x3CCDA081,0x24C2E04C,
0xAC977218,0xB49832D5,0x9C89F22B,0x8486B2E6,0xCCABDB7E,0xD4A49BB3,0xFCB55B4D,0xE4BA1B80,
0x17566887, 0xF59284A,0x2748E8B4,0x3F47A879,0x776AC1E1,0x6F65812C,0x477441D2,0x5F7B011F,
0xD72E934B,0xCF21D386,0xE7301378,0xFF3F53B5,0xB7123A2D,0xAF1D7AE0,0x870CBA1E,0x9F03FAD3,
0x3EA637B6,0x26A9777B, 0xEB8B785,0x16B7F748,0x5E9A9ED0,0x4695DE1D,0x6E841EE3,0x768B5E2E,
0xFEDECC7A,0xE6D18CB7,0xCEC04C49,0xD6CF0C84,0x9EE2651C,0x86ED25D1,0xAEFCE52F,0xB6F3A5E2};
static dword snow_T0[256]=
{
0xa56363c6,0x847c7cf8,0x997777ee,0x8d7b7bf6, 0xdf2f2ff,0xbd6b6bd6,0xb16f6fde,0x54c5c591,
0x50303060,0x03010102,0xa96767ce,0x7d2b2b56,0x19fefee7,0x62d7d7b5,0xe6abab4d,0x9a7676ec,
0x45caca8f,0x9d82821f,0x40c9c989,0x877d7dfa,0x15fafaef,0xeb5959b2,0xc947478e, 0xbf0f0fb,
0xecadad41,0x67d4d4b3,0xfda2a25f,0xeaafaf45,0xbf9c9c23,0xf7a4a453,0x967272e4,0x5bc0c09b,
0xc2b7b775,0x1cfdfde1,0xae93933d,0x6a26264c,0x5a36366c,0x413f3f7e, 0x2f7f7f5,0x4fcccc83,
0x5c343468,0xf4a5a551,0x34e5e5d1, 0x8f1f1f9,0x937171e2,0x73d8d8ab,0x53313162,0x3f15152a,
0x0c040408,0x52c7c795,0x65232346,0x5ec3c39d,0x28181830,0xa1969637, 0xf05050a,0xb59a9a2f,
0x0907070e,0x36121224,0x9b80801b,0x3de2e2df,0x26ebebcd,0x6927274e,0xcdb2b27f,0x9f7575ea,
0x1b090912,0x9e83831d,0x742c2c58,0x2e1a1a34,0x2d1b1b36,0xb26e6edc,0xee5a5ab4,0xfba0a05b,
0xf65252a4,0x4d3b3b76,0x61d6d6b7,0xceb3b37d,0x7b292952,0x3ee3e3dd,0x712f2f5e,0x97848413,
0xf55353a6,0x68d1d1b9,0x00000000,0x2cededc1,0x60202040,0x1ffcfce3,0xc8b1b179,0xed5b5bb6,
0xbe6a6ad4,0x46cbcb8d,0xd9bebe67,0x4b393972,0xde4a4a94,0xd44c4c98,0xe85858b0,0x4acfcf85,
0x6bd0d0bb,0x2aefefc5,0xe5aaaa4f,0x16fbfbed,0xc5434386,0xd74d4d9a,0x55333366,0x94858511,
0xcf45458a,0x10f9f9e9, 0x6020204,0x817f7ffe,0xf05050a0,0x443c3c78,0xba9f9f25,0xe3a8a84b,
0xf35151a2,0xfea3a35d,0xc0404080,0x8a8f8f05,0xad92923f,0xbc9d9d21,0x48383870, 0x4f5f5f1,
0xdfbcbc63,0xc1b6b677,0x75dadaaf,0x63212142,0x30101020,0x1affffe5, 0xef3f3fd,0x6dd2d2bf,
0x4ccdcd81,0x140c0c18,0x35131326,0x2fececc3,0xe15f5fbe,0xa2979735,0xcc444488,0x3917172e,
0x57c4c493,0xf2a7a755,0x827e7efc,0x473d3d7a,0xac6464c8,0xe75d5dba,0x2b191932,0x957373e6,
0xa06060c0,0x98818119,0xd14f4f9e,0x7fdcdca3,0x66222244,0x7e2a2a54,0xab90903b,0x8388880b,
0xca46468c,0x29eeeec7,0xd3b8b86b,0x3c141428,0x79dedea7,0xe25e5ebc,0x1d0b0b16,0x76dbdbad,
0x3be0e0db,0x56323264,0x4e3a3a74,0x1e0a0a14,0xdb494992, 0xa06060c,0x6c242448,0xe45c5cb8,
0x5dc2c29f,0x6ed3d3bd,0xefacac43,0xa66262c4,0xa8919139,0xa4959531,0x37e4e4d3,0x8b7979f2,
0x32e7e7d5,0x43c8c88b,0x5937376e,0xb76d6dda,0x8c8d8d01,0x64d5d5b1,0xd24e4e9c,0xe0a9a949,
0xb46c6cd8,0xfa5656ac, 0x7f4f4f3,0x25eaeacf,0xaf6565ca,0x8e7a7af4,0xe9aeae47,0x18080810,
0xd5baba6f,0x887878f0,0x6f25254a,0x722e2e5c,0x241c1c38,0xf1a6a657,0xc7b4b473,0x51c6c697,
0x23e8e8cb,0x7cdddda1,0x9c7474e8,0x211f1f3e,0xdd4b4b96,0xdcbdbd61,0x868b8b0d,0x858a8a0f,
0x907070e0,0x423e3e7c,0xc4b5b571,0xaa6666cc,0xd8484890, 0x5030306, 0x1f6f6f7,0x120e0e1c,
0xa36161c2,0x5f35356a,0xf95757ae,0xd0b9b969,0x91868617,0x58c1c199,0x271d1d3a,0xb99e9e27,
0x38e1e1d9,0x13f8f8eb,0xb398982b,0x33111122,0xbb6969d2,0x70d9d9a9,0x898e8e07,0xa7949433,
0xb69b9b2d,0x221e1e3c,0x92878715,0x20e9e9c9,0x49cece87,0xff5555aa,0x78282850,0x7adfdfa5,
0x8f8c8c03,0xf8a1a159,0x80898909,0x170d0d1a,0xdabfbf65,0x31e6e6d7,0xc6424284,0xb86868d0,
0xc3414182,0xb0999929,0x772d2d5a,0x110f0f1e,0xcbb0b07b,0xfc5454a8,0xd6bbbb6d,0x3a16162c
};
static dword snow_T1[256]=
{
0x6363c6a5,0x7c7cf884,0x7777ee99,0x7b7bf68d,0xf2f2ff0d,0x6b6bd6bd,0x6f6fdeb1,0xc5c59154,
0x30306050, 0x1010203,0x6767cea9,0x2b2b567d,0xfefee719,0xd7d7b562,0xabab4de6,0x7676ec9a,
0xcaca8f45,0x82821f9d,0xc9c98940,0x7d7dfa87,0xfafaef15,0x5959b2eb,0x47478ec9,0xf0f0fb0b,
0xadad41ec,0xd4d4b367,0xa2a25ffd,0xafaf45ea,0x9c9c23bf,0xa4a453f7,0x7272e496,0xc0c09b5b,
0xb7b775c2,0xfdfde11c,0x93933dae,0x26264c6a,0x36366c5a,0x3f3f7e41,0xf7f7f502,0xcccc834f,
0x3434685c,0xa5a551f4,0xe5e5d134,0xf1f1f908,0x7171e293,0xd8d8ab73,0x31316253,0x15152a3f,
0x0404080c,0xc7c79552,0x23234665,0xc3c39d5e,0x18183028,0x969637a1, 0x5050a0f,0x9a9a2fb5,
0x07070e09,0x12122436,0x80801b9b,0xe2e2df3d,0xebebcd26,0x27274e69,0xb2b27fcd,0x7575ea9f,
0x0909121b,0x83831d9e,0x2c2c5874,0x1a1a342e,0x1b1b362d,0x6e6edcb2,0x5a5ab4ee,0xa0a05bfb,
0x5252a4f6,0x3b3b764d,0xd6d6b761,0xb3b37dce,0x2929527b,0xe3e3dd3e,0x2f2f5e71,0x84841397,
0x5353a6f5,0xd1d1b968,0x00000000,0xededc12c,0x20204060,0xfcfce31f,0xb1b179c8,0x5b5bb6ed,
0x6a6ad4be,0xcbcb8d46,0xbebe67d9,0x3939724b,0x4a4a94de,0x4c4c98d4,0x5858b0e8,0xcfcf854a,
0xd0d0bb6b,0xefefc52a,0xaaaa4fe5,0xfbfbed16,0x434386c5,0x4d4d9ad7,0x33336655,0x85851194,
0x45458acf,0xf9f9e910, 0x2020406,0x7f7ffe81,0x5050a0f0,0x3c3c7844,0x9f9f25ba,0xa8a84be3,
0x5151a2f3,0xa3a35dfe,0x404080c0,0x8f8f058a,0x92923fad,0x9d9d21bc,0x38387048,0xf5f5f104,
0xbcbc63df,0xb6b677c1,0xdadaaf75,0x21214263,0x10102030,0xffffe51a,0xf3f3fd0e,0xd2d2bf6d,
0xcdcd814c,0x0c0c1814,0x13132635,0xececc32f,0x5f5fbee1,0x979735a2,0x444488cc,0x17172e39,
0xc4c49357,0xa7a755f2,0x7e7efc82,0x3d3d7a47,0x6464c8ac,0x5d5dbae7,0x1919322b,0x7373e695,
0x6060c0a0,0x81811998,0x4f4f9ed1,0xdcdca37f,0x22224466,0x2a2a547e,0x90903bab,0x88880b83,
0x46468cca,0xeeeec729,0xb8b86bd3,0x1414283c,0xdedea779,0x5e5ebce2, 0xb0b161d,0xdbdbad76,
0xe0e0db3b,0x32326456,0x3a3a744e, 0xa0a141e,0x494992db, 0x6060c0a,0x2424486c,0x5c5cb8e4,
0xc2c29f5d,0xd3d3bd6e,0xacac43ef,0x6262c4a6,0x919139a8,0x959531a4,0xe4e4d337,0x7979f28b,
0xe7e7d532,0xc8c88b43,0x37376e59,0x6d6ddab7,0x8d8d018c,0xd5d5b164,0x4e4e9cd2,0xa9a949e0,
0x6c6cd8b4,0x5656acfa,0xf4f4f307,0xeaeacf25,0x6565caaf,0x7a7af48e,0xaeae47e9, 0x8081018,
0xbaba6fd5,0x7878f088,0x25254a6f,0x2e2e5c72,0x1c1c3824,0xa6a657f1,0xb4b473c7,0xc6c69751,
0xe8e8cb23,0xdddda17c,0x7474e89c,0x1f1f3e21,0x4b4b96dd,0xbdbd61dc,0x8b8b0d86,0x8a8a0f85,
0x7070e090,0x3e3e7c42,0xb5b571c4,0x6666ccaa,0x484890d8, 0x3030605,0xf6f6f701, 0xe0e1c12,
0x6161c2a3,0x35356a5f,0x5757aef9,0xb9b969d0,0x86861791,0xc1c19958,0x1d1d3a27,0x9e9e27b9,
0xe1e1d938,0xf8f8eb13,0x98982bb3,0x11112233,0x6969d2bb,0xd9d9a970,0x8e8e0789,0x949433a7,
0x9b9b2db6,0x1e1e3c22,0x87871592,0xe9e9c920,0xcece8749,0x5555aaff,0x28285078,0xdfdfa57a,
0x8c8c038f,0xa1a159f8,0x89890980, 0xd0d1a17,0xbfbf65da,0xe6e6d731,0x424284c6,0x6868d0b8,
0x414182c3,0x999929b0,0x2d2d5a77, 0xf0f1e11,0xb0b07bcb,0x5454a8fc,0xbbbb6dd6,0x16162c3a
};
static dword snow_T2[256]=
{
0x63c6a563,0x7cf8847c,0x77ee9977,0x7bf68d7b,0xf2ff0df2,0x6bd6bd6b,0x6fdeb16f,0xc59154c5,
0x30605030, 0x1020301,0x67cea967,0x2b567d2b,0xfee719fe,0xd7b562d7,0xab4de6ab,0x76ec9a76,
0xca8f45ca,0x821f9d82,0xc98940c9,0x7dfa877d,0xfaef15fa,0x59b2eb59,0x478ec947,0xf0fb0bf0,
0xad41ecad,0xd4b367d4,0xa25ffda2,0xaf45eaaf,0x9c23bf9c,0xa453f7a4,0x72e49672,0xc09b5bc0,
0xb775c2b7,0xfde11cfd,0x933dae93,0x264c6a26,0x366c5a36,0x3f7e413f,0xf7f502f7,0xcc834fcc,
0x34685c34,0xa551f4a5,0xe5d134e5,0xf1f908f1,0x71e29371,0xd8ab73d8,0x31625331,0x152a3f15,
0x04080c04,0xc79552c7,0x23466523,0xc39d5ec3,0x18302818,0x9637a196, 0x50a0f05,0x9a2fb59a,
0x070e0907,0x12243612,0x801b9b80,0xe2df3de2,0xebcd26eb,0x274e6927,0xb27fcdb2,0x75ea9f75,
0x09121b09,0x831d9e83,0x2c58742c,0x1a342e1a,0x1b362d1b,0x6edcb26e,0x5ab4ee5a,0xa05bfba0,
0x52a4f652,0x3b764d3b,0xd6b761d6,0xb37dceb3,0x29527b29,0xe3dd3ee3,0x2f5e712f,0x84139784,
0x53a6f553,0xd1b968d1,0x00000000,0xedc12ced,0x20406020,0xfce31ffc,0xb179c8b1,0x5bb6ed5b,
0x6ad4be6a,0xcb8d46cb,0xbe67d9be,0x39724b39,0x4a94de4a,0x4c98d44c,0x58b0e858,0xcf854acf,
0xd0bb6bd0,0xefc52aef,0xaa4fe5aa,0xfbed16fb,0x4386c543,0x4d9ad74d,0x33665533,0x85119485,
0x458acf45,0xf9e910f9, 0x2040602,0x7ffe817f,0x50a0f050,0x3c78443c,0x9f25ba9f,0xa84be3a8,
0x51a2f351,0xa35dfea3,0x4080c040,0x8f058a8f,0x923fad92,0x9d21bc9d,0x38704838,0xf5f104f5,
0xbc63dfbc,0xb677c1b6,0xdaaf75da,0x21426321,0x10203010,0xffe51aff,0xf3fd0ef3,0xd2bf6dd2,
0xcd814ccd,0x0c18140c,0x13263513,0xecc32fec,0x5fbee15f,0x9735a297,0x4488cc44,0x172e3917,
0xc49357c4,0xa755f2a7,0x7efc827e,0x3d7a473d,0x64c8ac64,0x5dbae75d,0x19322b19,0x73e69573,
0x60c0a060,0x81199881,0x4f9ed14f,0xdca37fdc,0x22446622,0x2a547e2a,0x903bab90,0x880b8388,
0x468cca46,0xeec729ee,0xb86bd3b8,0x14283c14,0xdea779de,0x5ebce25e, 0xb161d0b,0xdbad76db,
0xe0db3be0,0x32645632,0x3a744e3a, 0xa141e0a,0x4992db49, 0x60c0a06,0x24486c24,0x5cb8e45c,
0xc29f5dc2,0xd3bd6ed3,0xac43efac,0x62c4a662,0x9139a891,0x9531a495,0xe4d337e4,0x79f28b79,
0xe7d532e7,0xc88b43c8,0x376e5937,0x6ddab76d,0x8d018c8d,0xd5b164d5,0x4e9cd24e,0xa949e0a9,
0x6cd8b46c,0x56acfa56,0xf4f307f4,0xeacf25ea,0x65caaf65,0x7af48e7a,0xae47e9ae, 0x8101808,
0xba6fd5ba,0x78f08878,0x254a6f25,0x2e5c722e,0x1c38241c,0xa657f1a6,0xb473c7b4,0xc69751c6,
0xe8cb23e8,0xdda17cdd,0x74e89c74,0x1f3e211f,0x4b96dd4b,0xbd61dcbd,0x8b0d868b,0x8a0f858a,
0x70e09070,0x3e7c423e,0xb571c4b5,0x66ccaa66,0x4890d848, 0x3060503,0xf6f701f6, 0xe1c120e,
0x61c2a361,0x356a5f35,0x57aef957,0xb969d0b9,0x86179186,0xc19958c1,0x1d3a271d,0x9e27b99e,
0xe1d938e1,0xf8eb13f8,0x982bb398,0x11223311,0x69d2bb69,0xd9a970d9,0x8e07898e,0x9433a794,
0x9b2db69b,0x1e3c221e,0x87159287,0xe9c920e9,0xce8749ce,0x55aaff55,0x28507828,0xdfa57adf,
0x8c038f8c,0xa159f8a1,0x89098089, 0xd1a170d,0xbf65dabf,0xe6d731e6,0x4284c642,0x68d0b868,
0x4182c341,0x9929b099,0x2d5a772d, 0xf1e110f,0xb07bcbb0,0x54a8fc54,0xbb6dd6bb,0x162c3a16
};
static dword snow_T3[256]=
{
0xc6a56363,0xf8847c7c,0xee997777,0xf68d7b7b,0xff0df2f2,0xd6bd6b6b,0xdeb16f6f,0x9154c5c5,
0x60503030, 0x2030101,0xcea96767,0x567d2b2b,0xe719fefe,0xb562d7d7,0x4de6abab,0xec9a7676,
0x8f45caca,0x1f9d8282,0x8940c9c9,0xfa877d7d,0xef15fafa,0xb2eb5959,0x8ec94747,0xfb0bf0f0,
0x41ecadad,0xb367d4d4,0x5ffda2a2,0x45eaafaf,0x23bf9c9c,0x53f7a4a4,0xe4967272,0x9b5bc0c0,
0x75c2b7b7,0xe11cfdfd,0x3dae9393,0x4c6a2626,0x6c5a3636,0x7e413f3f,0xf502f7f7,0x834fcccc,
0x685c3434,0x51f4a5a5,0xd134e5e5,0xf908f1f1,0xe2937171,0xab73d8d8,0x62533131,0x2a3f1515,
0x080c0404,0x9552c7c7,0x46652323,0x9d5ec3c3,0x30281818,0x37a19696, 0xa0f0505,0x2fb59a9a,
0x0e090707,0x24361212,0x1b9b8080,0xdf3de2e2,0xcd26ebeb,0x4e692727,0x7fcdb2b2,0xea9f7575,
0x121b0909,0x1d9e8383,0x58742c2c,0x342e1a1a,0x362d1b1b,0xdcb26e6e,0xb4ee5a5a,0x5bfba0a0,
0xa4f65252,0x764d3b3b,0xb761d6d6,0x7dceb3b3,0x527b2929,0xdd3ee3e3,0x5e712f2f,0x13978484,
0xa6f55353,0xb968d1d1,0x00000000,0xc12ceded,0x40602020,0xe31ffcfc,0x79c8b1b1,0xb6ed5b5b,
0xd4be6a6a,0x8d46cbcb,0x67d9bebe,0x724b3939,0x94de4a4a,0x98d44c4c,0xb0e85858,0x854acfcf,
0xbb6bd0d0,0xc52aefef,0x4fe5aaaa,0xed16fbfb,0x86c54343,0x9ad74d4d,0x66553333,0x11948585,
0x8acf4545,0xe910f9f9, 0x4060202,0xfe817f7f,0xa0f05050,0x78443c3c,0x25ba9f9f,0x4be3a8a8,
0xa2f35151,0x5dfea3a3,0x80c04040, 0x58a8f8f,0x3fad9292,0x21bc9d9d,0x70483838,0xf104f5f5,
0x63dfbcbc,0x77c1b6b6,0xaf75dada,0x42632121,0x20301010,0xe51affff,0xfd0ef3f3,0xbf6dd2d2,
0x814ccdcd,0x18140c0c,0x26351313,0xc32fecec,0xbee15f5f,0x35a29797,0x88cc4444,0x2e391717,
0x9357c4c4,0x55f2a7a7,0xfc827e7e,0x7a473d3d,0xc8ac6464,0xbae75d5d,0x322b1919,0xe6957373,
0xc0a06060,0x19988181,0x9ed14f4f,0xa37fdcdc,0x44662222,0x547e2a2a,0x3bab9090, 0xb838888,
0x8cca4646,0xc729eeee,0x6bd3b8b8,0x283c1414,0xa779dede,0xbce25e5e,0x161d0b0b,0xad76dbdb,
0xdb3be0e0,0x64563232,0x744e3a3a,0x141e0a0a,0x92db4949, 0xc0a0606,0x486c2424,0xb8e45c5c,
0x9f5dc2c2,0xbd6ed3d3,0x43efacac,0xc4a66262,0x39a89191,0x31a49595,0xd337e4e4,0xf28b7979,
0xd532e7e7,0x8b43c8c8,0x6e593737,0xdab76d6d, 0x18c8d8d,0xb164d5d5,0x9cd24e4e,0x49e0a9a9,
0xd8b46c6c,0xacfa5656,0xf307f4f4,0xcf25eaea,0xcaaf6565,0xf48e7a7a,0x47e9aeae,0x10180808,
0x6fd5baba,0xf0887878,0x4a6f2525,0x5c722e2e,0x38241c1c,0x57f1a6a6,0x73c7b4b4,0x9751c6c6,
0xcb23e8e8,0xa17cdddd,0xe89c7474,0x3e211f1f,0x96dd4b4b,0x61dcbdbd, 0xd868b8b, 0xf858a8a,
0xe0907070,0x7c423e3e,0x71c4b5b5,0xccaa6666,0x90d84848, 0x6050303,0xf701f6f6,0x1c120e0e,
0xc2a36161,0x6a5f3535,0xaef95757,0x69d0b9b9,0x17918686,0x9958c1c1,0x3a271d1d,0x27b99e9e,
0xd938e1e1,0xeb13f8f8,0x2bb39898,0x22331111,0xd2bb6969,0xa970d9d9, 0x7898e8e,0x33a79494,
0x2db69b9b,0x3c221e1e,0x15928787,0xc920e9e9,0x8749cece,0xaaff5555,0x50782828,0xa57adfdf,
0x038f8c8c,0x59f8a1a1, 0x9808989,0x1a170d0d,0x65dabfbf,0xd731e6e6,0x84c64242,0xd0b86868,
0x82c34141,0x29b09999,0x5a772d2d,0x1e110f0f,0x7bcbb0b0,0xa8fc5454,0x6dd6bbbb,0x2c3a1616
};
#define getByte(n,w) (((w)>>(n*8)) & 0xff)
#define ainv_mul(w) (((w)>>8)^(snow_alphainv_mul[w&0xff]))
#define a_mul(w) (((w)<<8)^(snow_alpha_mul[w>>24]))
/*
* Function: loadkey
*
* Synopsis:
* Loads the key material and performs the initial mixing.
*
* Returns: void
*
* Assumptions:
* keysize is either 128 or 256.
* key is of proper length, for keysize=128, key is of lenght 16 bytes
* and for keysize=256, key is of length 32 bytes.
* key is given in big endian format,
* For 128 bit key:
* key[0]-> msb of k_3
* ...
* key[3]-> lsb of k_3
* ...
* key[12]-> msb of k_0
* ...
* key[15]-> lsb of k_0
*
* For 256 bit key:
* key[0]-> msb of k_7
* ...
* key[3]-> lsb of k_7
* ...
* key[28]-> msb of k_0
* ...
* key[31]-> lsb of k_0
*/
void Snow2::loadkey(byte const *key,dword keysize,dword IV3,dword IV2,dword IV1,dword IV0)
{
int i;
if (keysize==128)
{
s15=(((dword)*(key+0))<<24) | (((dword)*(key+1))<<16) |
(((dword)*(key+2))<<8) | (((dword)*(key+3)));
s14=(((dword)*(key+4))<<24) | (((dword)*(key+5))<<16) |
(((dword)*(key+6))<<8) | (((dword)*(key+7)));
s13=(((dword)*(key+8))<<24) | (((dword)*(key+9))<<16) |
(((dword)*(key+10))<<8) | (((dword)*(key+11)));
s12=(((dword)*(key+12))<<24) | (((dword)*(key+13))<<16) |
(((dword)*(key+14))<<8) | (((dword)*(key+15)));
s11 =~s15; /* bitwise inverse */
s10 =~s14;
s9 =~s13;
s8 =~s12;
s7 = s15; /* just copy */
s6 = s14;
s5 = s13;
s4 = s12;
s3 =~s15; /* bitwise inverse */
s2 =~s14;
s1 =~s13;
s0 =~s12;
}
else
{
/* assume keysize=256 */
s15=(((dword)*(key+0))<<24) | (((dword)*(key+1))<<16) |
(((dword)*(key+2))<<8) | (((dword)*(key+3)));
s14=(((dword)*(key+4))<<24) | (((dword)*(key+5))<<16) |
(((dword)*(key+6))<<8) | (((dword)*(key+7)));
s13=(((dword)*(key+8))<<24) | (((dword)*(key+9))<<16) |
(((dword)*(key+10))<<8) | (((dword)*(key+11)));
s12=(((dword)*(key+12))<<24) | (((dword)*(key+13))<<16) |
(((dword)*(key+14))<<8) | (((dword)*(key+15)));
s11=(((dword)*(key+16))<<24) | (((dword)*(key+17))<<16) |
(((dword)*(key+18))<<8) | (((dword)*(key+19)));
s10=(((dword)*(key+20))<<24) | (((dword)*(key+21))<<16) |
(((dword)*(key+22))<<8) | (((dword)*(key+23)));
s9=(((dword)*(key+24))<<24) | (((dword)*(key+25))<<16) |
(((dword)*(key+26))<<8) | (((dword)*(key+27)));
s8=(((dword)*(key+28))<<24) | (((dword)*(key+29))<<16) |
(((dword)*(key+30))<<8) | (((dword)*(key+31)));
s7 =~s15; /* bitwise inverse */
s6 =~s14;
s5 =~s13;
s4 =~s12;
s3 =~s11;
s2 =~s10;
s1 =~s9;
s0 =~s8;
}
/* XOR IV values */
s15^=IV0;
s12^=IV1;
s10^=IV2;
s9^=IV3;
r1=0;
r2=0;
/* Do 32 initial clockings */
for(i=0;i<2;i++)
{
outfrom_fsm=(r1+ s15 )^r2;
s0 =a_mul(s0 )^ s2 ^ainv_mul(s11 )^outfrom_fsm;
fsmtmp=r2+ s5 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s0 )^r2;
s1 =a_mul(s1 )^ s3 ^ainv_mul(s12 )^outfrom_fsm;
fsmtmp=r2+ s6 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s1 )^r2;
s2 =a_mul(s2 )^ s4 ^ainv_mul(s13 )^outfrom_fsm;
fsmtmp=r2+ s7 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s2 )^r2;
s3 =a_mul(s3 )^ s5 ^ainv_mul(s14 )^outfrom_fsm;
fsmtmp=r2+ s8 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s3 )^r2;
s4 =a_mul(s4 )^ s6 ^ainv_mul(s15 )^outfrom_fsm;
fsmtmp=r2+ s9 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s4 )^r2;
s5 =a_mul(s5 )^ s7 ^ainv_mul(s0 )^outfrom_fsm;
fsmtmp=r2+ s10 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s5 )^r2;
s6 =a_mul(s6 )^ s8 ^ainv_mul(s1 )^outfrom_fsm;
fsmtmp=r2+ s11 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s6 )^r2;
s7 =a_mul(s7 )^ s9 ^ainv_mul(s2 )^outfrom_fsm;
fsmtmp=r2+ s12 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s7 )^r2;
s8 =a_mul(s8 )^ s10 ^ainv_mul(s3 )^outfrom_fsm;
fsmtmp=r2+ s13 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s8 )^r2;
s9 =a_mul(s9 )^ s11 ^ainv_mul(s4 )^outfrom_fsm;
fsmtmp=r2+ s14 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s9 )^r2;
s10 =a_mul(s10 )^ s12 ^ainv_mul(s5 )^outfrom_fsm;
fsmtmp=r2+ s15 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s10 )^r2;
s11 =a_mul(s11 )^ s13 ^ainv_mul(s6 )^outfrom_fsm;
fsmtmp=r2+ s0 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s11 )^r2;
s12 =a_mul(s12 )^ s14 ^ainv_mul(s7 )^outfrom_fsm;
fsmtmp=r2+ s1 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s12 )^r2;
s13 =a_mul(s13 )^ s15 ^ainv_mul(s8 )^outfrom_fsm;
fsmtmp=r2+ s2 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s13 )^r2;
s14 =a_mul(s14 )^ s0 ^ainv_mul(s9 )^outfrom_fsm;
fsmtmp=r2+ s3 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
outfrom_fsm=(r1+ s14 )^r2;
s15 =a_mul(s15 )^ s1 ^ainv_mul(s10 )^outfrom_fsm;
fsmtmp=r2+ s4 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
}
}
/*
* Function: keystream
*
* Synopsis:
* Clocks the cipher 16 times and returns 16 words of keystream symbols
* in keystream_block.
*
* Returns: void
*
*/
void Snow2::keystream(dword *keystream_block)
{
s0 =a_mul(s0 )^ s2 ^ainv_mul(s11 );
fsmtmp=r2+ s5 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[0]=(r1+ s0 )^r2^ s1 ;
s1 =a_mul(s1 )^ s3 ^ainv_mul(s12 );
fsmtmp=r2+ s6 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[1]=(r1+ s1 )^r2^ s2 ;
s2 =a_mul(s2 )^ s4 ^ainv_mul(s13 );
fsmtmp=r2+ s7 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[2]=(r1+ s2 )^r2^ s3 ;
s3 =a_mul(s3 )^ s5 ^ainv_mul(s14 );
fsmtmp=r2+ s8 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[3]=(r1+ s3 )^r2^ s4 ;
s4 =a_mul(s4 )^ s6 ^ainv_mul(s15 );
fsmtmp=r2+ s9 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[4]=(r1+ s4 )^r2^ s5 ;
s5 =a_mul(s5 )^ s7 ^ainv_mul(s0 );
fsmtmp=r2+ s10 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[5]=(r1+ s5 )^r2^ s6 ;
s6 =a_mul(s6 )^ s8 ^ainv_mul(s1 );
fsmtmp=r2+ s11 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[6]=(r1+ s6 )^r2^ s7 ;
s7 =a_mul(s7 )^ s9 ^ainv_mul(s2 );
fsmtmp=r2+ s12 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[7]=(r1+ s7 )^r2^ s8 ;
s8 =a_mul(s8 )^ s10 ^ainv_mul(s3 );
fsmtmp=r2+ s13 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[8]=(r1+ s8 )^r2^ s9 ;
s9 =a_mul(s9 )^ s11 ^ainv_mul(s4 );
fsmtmp=r2+ s14 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[9]=(r1+ s9 )^r2^ s10 ;
s10 =a_mul(s10 )^ s12 ^ainv_mul(s5 );
fsmtmp=r2+ s15 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[10]=(r1+ s10 )^r2^ s11 ;
s11 =a_mul(s11 )^ s13 ^ainv_mul(s6 );
fsmtmp=r2+ s0 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[11]=(r1+ s11 )^r2^ s12 ;
s12 =a_mul(s12 )^ s14 ^ainv_mul(s7 );
fsmtmp=r2+ s1 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[12]=(r1+ s12 )^r2^ s13 ;
s13 =a_mul(s13 )^ s15 ^ainv_mul(s8 );
fsmtmp=r2+ s2 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[13]=(r1+ s13 )^r2^ s14 ;
s14 =a_mul(s14 )^ s0 ^ainv_mul(s9 );
fsmtmp=r2+ s3 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[14]=(r1+ s14 )^r2^ s15 ;
s15 =a_mul(s15 )^ s1 ^ainv_mul(s10 );
fsmtmp=r2+ s4 ;
r2=snow_T0[getByte(0,r1)]^snow_T1[getByte(1,r1)]^snow_T2[getByte(2,r1)]^snow_T3[getByte(3,r1)];
r1=fsmtmp;
keystream_block[15]=(r1+ s15 )^r2^ s0 ;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
// constructors
Snow2::Snow2()
{
byteIndex = 0;
}
Snow2::Snow2(const String &key)
{
SetKey(key);
}
Snow2::Snow2(byte const *keyBuf, int keyLen)
{
SetKey(keyBuf, keyLen);
}
// key settings
bool Snow2::SetKey(const String &key)
{
return SetKey((byte const *)~key, key.GetCount());
}
bool Snow2::SetKey(byte const *keyBuf, int keyLen)
{
byteIndex = 0;
if(keyLen != 16 && keyLen != 32)
return false;
// initializes the encoder box with key
loadkey(keyBuf, keyLen, 0, 0, 0, 0);
// load first 16 dword of keystream into buffer
keystream(keyStream);
}
// encode string
String Snow2::Encode(String const &s)
{
StringBuffer sb(s.GetCount());
Encode((const byte *)~s, (byte *)~sb, s.GetCount());
return sb;
}
// encode buffer, dest on different buffer
void Snow2::Encode(byte const *sBuf, byte *dBuf, dword bufLen)
{
// code first partial chunk, if any
const byte *byteKeyStream = (const byte *)keyStream + byteIndex;
while((byteIndex & 63) != 0 && bufLen)
{
*dBuf++ = *sBuf++ ^ *byteKeyStream++;
byteIndex++;
bufLen--;
}
// load next keyStream if needed
if(byteIndex >= 64)
{
keystream(keyStream);
byteIndex = 0;
}
// encode full 16 dword blocks
const qword *qsBuf = (const qword *)sBuf;
qword *qdBuf = (qword *)dBuf;
while(bufLen >= 64)
{
const qword *qStream = (const qword *)keyStream;
for(int i = 0; i < 8; i++)
*qdBuf++ = *qsBuf++ ^ *qStream++;
keystream(keyStream);
bufLen -= 64;
}
sBuf = (const byte *)qsBuf;
dBuf = (byte *)qdBuf;
// encode last partial chunk, if any
byteKeyStream = (const byte *)keyStream;
for(; bufLen; bufLen--)
{
*dBuf++ = *sBuf++ ^ *byteKeyStream++;
byteIndex++;
}
}
// encode buffer in place
void Snow2::Encode(byte *buf, dword bufLen)
{
Encode(buf, buf, bufLen);
}
END_UPP_NAMESPACE

View file

@ -0,0 +1,82 @@
#ifndef _Snow2_h_
#define _Snow2_h_
#include <Core/Core.h>
NAMESPACE_UPP
class Snow2
{
private:
// snow2 box and data
dword s15,s14,s13,s12,s11,s10,s9,s8,s7,s6,s5,s4,s3,s2,s1,s0;
dword outfrom_fsm,fsmtmp,r1,r2;
// index of byte being encoded -- needed to sync with 16 x dword generated
// keystream smaller chunks
dword byteIndex;
// keystream buffer
dword keyStream[16];
/*
* Function: loadkey
*
* Synopsis:
* Loads the key material and performs the initial mixing.
*
* Returns: void
*
* Assumptions:
* keysize is either 128 or 256.
* key is of proper length, for keysize=128, key is of lenght 16 bytes
* and for keysize=256, key is of length 32 bytes.
* key is given in big endian format,
* thus key[0]->msb of s15
* key[1]->second msb of s15
* ...
* key[3]-> lsb of s15
* ...
*/
void loadkey(byte const *key, dword keysize, dword IV3, dword IV2, dword IV1, dword IV0);
/*
* Function: keystream
*
* Synopsis:
* Clocks the cipher 16 times and returns 16 words of keystream symbols
* in keystream_block.
*
* Returns: void
*
*/
void keystream(dword *keystream_block);
protected:
public:
// constructors
Snow2();
Snow2(const String &key);
Snow2(byte const *keyBuf, int keyLen);
// key settings
bool SetKey(const String &key);
bool SetKey(byte const *keyBuf, int keyLen);
// encode string
String Encode(String const &s);
// encode buffer, dest on different buffer
void Encode(byte const *sBuf, byte *dBuf, dword bufLen);
// encode buffer in place
void Encode(byte *buf, dword bufLen);
}; // END Class Snow2Cypher
END_UPP_NAMESPACE
#endif

View file

@ -0,0 +1,7 @@
#ifndef _StreamCypher_StreamCypher_h_
#define _StreamCypher_StreamCypher_h_
#include "Snow2.h"
#include "RC4.h"
#endif

View file

@ -0,0 +1,13 @@
description "Encrypt/Decrypt routines using Snow2 OR RC4 stream cypher\377";
uses
Core;
file
StreamCypher.h,
Snow2.h,
Snow2.cpp,
RC4.h,
RC4.cpp,
srcdoc.tpp;

4
bazaar/StreamCypher/init Normal file
View file

@ -0,0 +1,4 @@
#ifndef _StreamCypher_icpp_init_stub
#define _StreamCypher_icpp_init_stub
#include "Core/init"
#endif

View file

@ -0,0 +1,25 @@
topic "RC4 Encoder";
[ $$0,0#00000000000000000000000000000000:Default]
[{_}%EN-US
[s0;%- [*R6 RC4 Encoder]&]
[s0; &]
[s0; RC4 Encoder is a simple and fast [^topic`:`/`/StreamCypher`/srcdoc`/StreamCryptography`$en`-us^ s
tream encoder] with quite weak security.&]
[s0; The complete algorhithm description can be found [^http`:`/`/en`.wikipedia`.org`/wiki`/RC4^ h
ere].&]
[s0; &]
[s0; The usage is quite simple :&]
[s0; &]
[s0;l160; [/ #include <StreamCypher/StreamCypher.h>]&]
[s0;l160;/ &]
[s0;l160; [/ String EncodeWithRC4(String key, String data)]&]
[s0;l160; [/ `{]&]
[s0;l160; [/ -|RC4 rc4(key);]&]
[s0;l160; [/ -|return rc4.Encode(data);]&]
[s0;l160; [/ `}]&]
[s0; &]
[s0; There are also encoding functions for in`-place buffer encoding
and for out`-of`-place buffer encoding; you can also give the
key as a buffer/length couple.&]
[s0; See the source code (RC4.h) for details.&]
[s0; ]

View file

@ -0,0 +1,5 @@
TITLE("RC4 Encoder")
COMPRESSED
120,156,133,82,77,111,219,48,12,253,43,4,154,14,73,81,219,25,80,244,144,20,187,116,189,238,208,180,216,193,112,42,85,166,109,33,138,228,233,99,129,209,245,191,143,178,157,34,31,40,106,192,176,76,62,138,143,124,47,135,201,100,126,61,191,152,127,241,44,126,98,197,131,242,69,254,246,242,126,249,240,43,121,94,65,238,230,203,203,4,242,171,199,91,120,188,191,129,7,45,76,137,182,248,86,196,12,140,159,131,12,72,7,28,156,220,182,10,129,235,18,42,238,60,228,107,111,90,41,216,130,101,44,91,121,139,124,123,223,181,13,90,150,57,43,74,35,62,162,182,107,189,169,45,111,155,142,77,80,179,36,184,53,184,62,7,56,54,135,157,244,13,252,9,210,35,236,144,111,192,161,8,86,250,46,29,249,60,53,8,194,68,10,132,224,170,54,182,161,138,45,148,232,132,149,173,151,70,131,224,26,94,17,42,19,136,100,190,110,188,111,7,122,212,52,221,201,141,108,177,148,156,165,198,214,44,139,255,44,163,49,215,64,164,177,72,143,231,143,253,130,227,53,198,233,7,
94,227,6,22,71,64,245,253,150,206,121,6,23,82,11,21,74,132,187,195,101,28,109,38,109,126,20,7,85,217,233,21,132,149,186,30,215,254,155,198,35,118,211,49,184,193,238,122,15,40,185,231,179,226,164,152,189,157,70,146,127,81,68,43,110,166,84,60,91,158,167,45,250,96,117,68,164,67,207,105,127,243,25,146,189,23,103,203,177,164,66,124,149,51,131,136,145,88,21,180,136,74,56,210,128,108,67,82,183,138,11,132,215,80,85,228,163,15,92,111,34,66,152,224,89,98,170,79,96,75,232,76,232,69,237,187,212,242,47,130,39,89,104,26,224,209,146,3,62,83,168,107,50,143,48,129,228,217,203,184,194,1,236,76,176,34,90,135,148,153,210,62,210,102,214,183,46,209,115,169,220,30,94,252,7,234,38,23,15,

View file

@ -0,0 +1,30 @@
topic "Snow2 Encoder";
[ $$0,0#00000000000000000000000000000000:Default]
[{_}%EN-US
[s0;%- [*R6 Snow2 Encoder]&]
[s0; &]
[s0; Snow2 [^topic`:`/`/StreamCypher`/srcdoc`/StreamCryptography`$en`-us^ Stream
Encoder] is somehow more complicated as RC4 one. but has a strong
security, unviolated up do current days.&]
[s0; The implementation choosen here is the [/ fast ]version of original
reference implementation code by its creators.&]
[s0; The complete algorhithm description can be found [^http`:`/`/en`.wikipedia`.org`/wiki`/SNOW^ h
ere].&]
[s0; One small caveat of snow2 algorythm is the need of a key of
exactly 128 OR 256 bits (16 OR 32 bytes) length.&]
[s0; &]
[s0; The usage is quite simple :&]
[s0; &]
[s0;l160; [/ #include <StreamCypher/StreamCypher.h>]&]
[s0;l160;/ &]
[s0;l160; [/ String EncodeWithSnow2(String key, String data)]&]
[s0;l160; [/ `{]&]
[s0;l160; [/ -|Snow2 snow2(key);]&]
[s0;l160; [/ -|return snow2.Encode(data);]&]
[s0;l160; [/ `}]&]
[s0; &]
[s0; There are also encoding functions for in`-place buffer encoding
and for out`-of`-place buffer encoding; you can also give the
key as a buffer/length couple.&]
[s0; See the source code (Snow2.h) for details.&]
[s0; ]

View file

@ -0,0 +1,6 @@
TITLE("Snow2 Encoder")
COMPRESSED
120,156,133,83,219,78,219,64,16,253,149,145,128,42,169,136,29,210,54,170,160,234,11,229,21,36,210,138,135,200,212,155,245,216,94,177,217,113,247,18,106,1,255,222,217,117,160,132,168,170,37,203,246,206,153,203,57,115,188,132,195,195,233,241,244,96,250,159,235,244,27,214,34,104,95,44,31,126,62,29,93,92,78,126,44,96,233,166,103,71,19,88,190,191,158,195,194,208,253,12,46,140,164,10,109,241,174,136,49,216,62,134,216,242,214,83,167,100,121,90,230,101,190,240,22,197,250,188,239,90,180,101,238,172,172,72,190,156,218,190,243,212,88,209,181,125,121,136,166,156,4,119,11,67,236,165,3,40,7,142,214,216,210,61,172,201,34,72,90,119,90,73,225,177,2,225,224,250,252,35,144,193,12,86,193,67,203,7,2,156,183,100,26,112,40,131,85,190,63,134,96,54,138,116,202,8,29,84,4,28,176,104,60,84,162,119,217,118,248,239,45,130,226,210,184,230,136,240,138,12,200,150,200,161,1,158,29,227,28,158,33,203,28,106,225,60,20,27,180,46,130,168,6,178,170,81,
70,104,176,88,51,212,200,253,74,204,5,86,61,40,239,64,50,63,79,118,167,113,34,133,30,65,232,134,108,171,124,187,134,10,157,180,170,27,242,133,129,21,66,77,193,84,44,112,235,125,55,232,203,170,101,247,234,78,117,88,41,81,102,100,155,50,143,223,172,241,229,213,205,109,26,189,120,238,116,101,16,220,90,104,205,245,54,60,68,156,221,165,157,165,182,125,236,186,165,105,144,197,226,176,128,59,236,227,11,254,22,210,235,30,78,102,159,225,234,26,102,159,230,176,138,108,70,39,243,248,253,97,198,244,60,186,49,104,52,141,111,179,93,103,68,142,193,137,38,201,248,43,40,102,234,146,68,112,186,3,212,39,115,126,103,141,15,148,145,58,176,104,95,94,59,104,199,78,89,251,181,120,149,149,191,45,193,88,197,54,24,140,116,195,146,38,123,142,182,199,76,235,248,25,82,9,47,198,197,155,244,242,225,237,201,228,113,48,120,146,108,196,5,198,103,251,16,139,62,88,51,96,178,161,247,40,213,223,195,150,79,197,158,72,236,51,17,111,237,8,48,38,199,241,234,96,
100,116,129,227,253,91,80,252,159,116,90,176,199,86,161,102,187,253,197,9,246,70,68,80,240,229,132,234,127,192,206,160,167,144,12,149,186,52,106,131,105,227,113,207,233,247,25,240,249,176,71,118,102,224,53,61,175,115,129,3,216,81,176,18,7,91,143,146,42,89,59,78,205,43,244,66,233,23,115,23,127,0,50,99,127,63,

View file

@ -0,0 +1,41 @@
topic "Stream Cryptography";
[ $$0,0#00000000000000000000000000000000:Default]
[{_}%EN-US
[s0;%- [*R6 Stream Cyptography]&]
[s0;/%- &]
[s0; There are 2 main types of cryptography, represented by [* block
encoders] and [* stream encoders].&]
[s0; &]
[s0; [* Block encoders], like AES, are designed to work with fixed`-size
data blocks, for example of 256 bytes size.&]
[s0; [* Stream encoders], on the other side, are designed to encode
continuous byte streams, without limit of block size.&]
[s0; &]
[s0; Formers are usually used for media encryption (as disk sectors,
for example) or other kinds of data which structure is represented
by fixed size of data chunks; latter are better suited for contiuous
data streams, for example audio and video streams, or variable`-sized
data like disk files.&]
[s0; &]
[s0; [* Stream encoders] can, of course, be used for block encoding,
but they`'re usually less efficient and believed less secure
than block encoders; using [* block encoders] for streaming data
is also possible, but with the caveat of having to wait for complete
data blocks before proceeding or to pad partial data blocks with
some (usually null) dummy data.&]
[s0; &]
[s0; Another differentiation between encoders is given by [* symmetric
]and [* asymmetric ]ones.&]
[s0; Without going too deep inside matter, the main difference between
both is that symmetric encoders use the same key for encoding
and decoding, while asymmetric encoders don`'t.&]
[s0; &]
[s0; Here we present 2 [* Symmetric Stream encoders], one slightly
faster but by far less secure [^topic`:`/`/StreamCypher`/srcdoc`/RC4`$en`-us^ RC4],
and the other slightly slower but giving very strong encoding,
[^topic`:`/`/StreamCypher`/srcdoc`/Snow2`$en`-us^ Snow2].&]
[s0; As the only advantage or RC4 over Snow2 is the smaller code
footprint and a (really small) speed advantage, we suggest Snow2
usage on all case where security is the main need; RC4 is, for
example, used for WEP wireless encryption which is known to be
broken with ease.]

View file

@ -0,0 +1,7 @@
TITLE("Stream Cryptography")
COMPRESSED
120,156,141,85,209,110,219,70,16,252,149,5,226,36,118,65,91,134,209,230,33,126,114,82,23,125,42,138,168,69,30,4,165,60,145,75,242,32,242,142,184,59,74,97,139,254,123,103,239,40,81,82,12,52,6,100,82,228,222,206,236,236,236,106,69,87,87,247,217,253,171,251,255,249,123,255,51,87,106,104,195,122,245,207,95,255,190,126,254,237,246,207,37,173,252,253,227,235,91,90,253,240,233,29,45,131,99,213,209,199,177,15,182,118,170,111,198,245,155,181,4,44,16,145,238,232,143,134,29,147,194,231,129,58,165,13,133,177,103,79,182,162,194,205,231,50,114,220,59,246,108,2,151,180,25,145,159,54,173,45,182,196,166,176,37,59,191,38,101,74,121,236,19,232,241,249,221,4,52,93,16,241,225,252,96,70,173,222,50,61,61,47,179,200,163,100,175,107,3,152,96,105,111,221,150,246,58,52,84,233,175,92,230,183,94,255,141,8,21,84,130,247,25,85,214,17,127,85,93,223,178,176,126,248,233,29,248,5,148,32,161,119,51,234,242,130,87,70,22,197,54,56,132,127,14,209,
37,127,139,159,162,169,176,38,104,51,216,193,199,220,83,141,0,23,106,118,8,168,160,211,65,224,39,85,78,177,167,203,47,214,117,192,141,16,131,31,84,219,142,184,2,70,10,232,184,212,74,208,68,115,13,98,215,202,83,169,61,50,113,17,172,59,175,243,134,112,159,104,111,181,41,99,183,162,38,251,70,23,141,176,27,138,48,0,71,251,203,190,69,25,35,189,227,161,162,25,204,214,63,82,171,66,64,70,225,183,225,120,235,7,29,38,130,81,129,40,64,60,115,20,224,84,125,53,148,218,70,27,236,32,166,157,131,16,179,83,78,171,77,203,169,131,101,202,18,251,30,171,172,116,203,254,91,167,92,246,140,10,101,178,232,77,59,56,143,126,109,120,214,240,196,143,218,212,120,135,190,64,163,49,127,123,162,56,96,60,113,85,233,66,67,147,72,118,195,173,230,29,146,196,119,208,91,148,11,141,50,23,14,127,68,18,36,126,201,250,2,159,170,149,128,88,27,164,87,173,183,212,91,239,53,10,79,124,162,149,197,116,133,218,177,138,142,105,212,78,14,137,217,21,60,148,
196,22,61,195,153,209,65,19,175,152,122,103,11,102,169,80,100,197,169,94,149,248,184,160,85,123,22,31,161,188,237,152,174,15,197,155,161,109,111,168,28,186,110,140,161,23,130,63,153,228,169,82,87,21,150,2,26,174,162,23,225,134,61,179,57,214,43,181,213,122,135,39,105,17,248,177,235,56,56,93,208,122,218,1,234,228,145,53,115,103,63,79,227,82,219,84,178,197,176,113,79,218,200,244,97,253,136,235,178,168,79,92,69,7,34,5,31,57,108,64,81,240,209,159,112,2,124,164,6,55,196,243,94,161,240,45,143,201,160,147,39,98,187,75,62,24,4,211,34,174,125,33,75,105,77,254,54,92,200,243,171,44,202,189,116,32,206,19,246,165,56,244,120,248,165,253,2,30,173,174,155,0,237,43,229,101,164,196,4,50,134,202,157,217,109,245,37,216,94,23,249,251,124,145,47,82,38,108,109,52,35,95,120,87,148,182,200,23,159,62,254,152,95,177,201,111,7,255,133,240,5,0,82,206,201,6,59,64,249,214,238,39,40,180,73,234,222,177,27,197,160,22,247,243,128,124,
7,232,210,216,253,195,12,27,191,30,55,250,147,79,232,6,152,170,220,41,19,84,205,226,74,176,35,11,204,20,159,218,5,41,58,152,144,197,221,232,117,101,109,232,157,158,70,80,209,53,208,197,162,49,232,134,124,15,143,207,73,51,209,221,15,117,205,62,76,73,7,31,193,12,166,172,197,52,161,237,251,248,75,22,5,213,97,60,160,70,35,25,100,123,140,180,244,249,206,202,230,245,241,249,249,119,204,140,227,180,33,230,77,156,118,42,178,109,129,107,100,226,176,116,54,206,110,225,198,56,99,12,240,187,245,127,178,219,180,207,

View file

@ -0,0 +1,12 @@
TOPIC("RC4$en-us")
#include "RC4$en-us.tppi"
END_TOPIC
TOPIC("StreamCryptography$en-us")
#include "StreamCryptography$en-us.tppi"
END_TOPIC
TOPIC("Snow2$en-us")
#include "Snow2$en-us.tppi"
END_TOPIC

View file

@ -0,0 +1,126 @@
#include "StreamCypherTest.h"
#include <StreamCypher/StreamCypher.h>
StreamCypherTest::StreamCypherTest()
{
CtrlLayout(*this, "Stream cypher test");
goBtn <<= THISBACK(onGo);
cancelBtn.Cancel() <<= Breaker(0);
cypherSwitch <<= THISBACK(onCypherSwitch);
onCypherSwitch();
keyEdit <<= "AABBCCDDEEFF00112233445566778899";
splitSwitch = 0;
cypherSwitch = 0;
}
void StreamCypherTest::onCypherSwitch(void)
{
if(cypherSwitch == 0)
keyLabel.SetText("Key (16 or 32 bytes long, hex-ascii format - 0011223344) :");
else
keyLabel.SetText("Key, usually from 5 to 32 bytes long, hex-ascii format - 0011223344) :");
}
void StreamCypherTest::onGo()
{
String hexAsciiKey = ToUpper(String(~keyEdit));
if(hexAsciiKey.GetCount() != 32 && hexAsciiKey.GetCount() != 64 && cypherSwitch == 0)
{
PromptOK("Key MUST be 16 or 32 bytes long for snow2 cypher");
return;
}
// convert key in hex bytes
String key;
for(int i = 0; i < hexAsciiKey.GetCount()-1;)
{
byte b;
char c = hexAsciiKey[i++];
if(c >= '0' && c <= '9')
b = c - '0';
else if(c >= 'A' && c <= 'F')
b = c - 'A' + 10;
else
{
PromptOK(String("Invalid hex digit '") + c + "' in key");
return;
}
b <<= 4;
c = hexAsciiKey[i++];
if(c >= '0' && c <= '9')
b += c - '0';
else if(c >= 'A' && c <= 'F')
b += c - 'A' + 10;
else
{
PromptOK(String("Invalid hex digit '") + c + "' in key");
return;
}
key.Cat(b);
}
// check source and dest file names
if(~sourceEdit == "" || ~destEdit == "")
return;
if(!FileExists(~sourceEdit))
{
PromptOK(String("File '") + sourceEdit + "' don't exists");
return;
}
if(FileExists(~destEdit))
if(!PromptYesNo(String("File '") + destEdit + "' exists&[*= OVERWRITE ?]"))
return;
// load file to encode
String s = LoadFile(~sourceEdit);
// encode it
String d;
if(cypherSwitch == 0) // snow2 Cypher
{
Snow2 S(key);
if(splitSwitch == 0)
{
d = S.Encode(s);
}
else
{
int len = s.GetCount();
int randMax = len / 10;
while(len)
{
int rnd = min((int)(Random(randMax) + 1), len);
String ss = s.Left(rnd);
s = s.Right(len - rnd);
len = s.GetCount();
d += S.Encode(ss);
}
}
}
else // RC4 Cypher
{
RC4 rc4(key);
d = rc4.Encode(s);
}
// save encoded file
if(!SaveFile(~destEdit, d))
{
PromptOK("Error writing dest file!");
return;
}
PromptOK("Encoding ok!");
}
GUI_APP_MAIN
{
StreamCypherTest().Run();
}

View file

@ -0,0 +1,25 @@
#ifndef _Snow2CypherTest_Snow2CypherTest_h
#define _Snow2CypherTest_Snow2CypherTest_h
#include <CtrlLib/CtrlLib.h>
#include <Controls4U/Controls4U.h>
using namespace Upp;
#define LAYOUTFILE <StreamCypherTest/StreamCypherTest.lay>
#include <CtrlCore/lay.h>
class StreamCypherTest : public WithStreamCypherTestLayout<TopWindow>
{
private:
void onCypherSwitch(void);
void onGo(void);
public:
typedef StreamCypherTest CLASSNAME;
StreamCypherTest();
};
#endif

View file

@ -0,0 +1,14 @@
LAYOUT(StreamCypherTestLayout, 320, 268)
ITEM(EditFile, destEdit, LeftPosZ(4, 312).TopPosZ(180, 19))
ITEM(Label, dv___1, SetLabel(t_("Encoded/decoded file :")).LeftPosZ(4, 312).TopPosZ(160, 16))
ITEM(Label, keyLabel, SetLabel(t_("Key (16 or 32 bytes long, hex-ascii format - 0011223344) :")).LeftPosZ(4, 312).TopPosZ(72, 16))
ITEM(EditFile, sourceEdit, LeftPosZ(4, 312).TopPosZ(136, 19))
ITEM(Button, goBtn, SetLabel(t_("Go")).LeftPosZ(4, 56).TopPosZ(248, 15))
ITEM(Button, cancelBtn, SetLabel(t_("Cancel")).LeftPosZ(260, 56).TopPosZ(248, 15))
ITEM(Label, dv___6, SetLabel(t_("Snow2Cypher encryptor test")).SetAlign(ALIGN_CENTER).SetFont(StdFontZ(14).Bold()).LeftPosZ(4, 316).TopPosZ(4, 20))
ITEM(Label, dv___7, SetLabel(t_("File to encode/decode :")).LeftPosZ(4, 312).TopPosZ(116, 16))
ITEM(EditString, keyEdit, LeftPosZ(4, 312).TopPosZ(92, 19))
ITEM(Switch, splitSwitch, SetLabel(t_("Whole file at once\nSplit into random chunks (tests streaming behaviour)")).LeftPosZ(4, 312).TopPosZ(208, 32))
ITEM(Switch, cypherSwitch, SetLabel(t_("Snow2 (strong security)\nRC4 (weak security)")).LeftPosZ(4, 312).TopPosZ(32, 32))
END_LAYOUT

View file

@ -0,0 +1,15 @@
description "Test for Snow2Cypher package\377";
uses
CtrlLib,
StreamCypher,
Controls4U;
file
StreamCypherTest.lay,
StreamCypherTest.h,
StreamCypherTest.cpp;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,6 @@
#ifndef _StreamCypherTest_icpp_init_stub
#define _StreamCypherTest_icpp_init_stub
#include "CtrlLib/init"
#include "StreamCypher/init"
#include "Controls4U/init"
#endif