Added unittests for chacha20
This commit is contained in:
parent
7acebd713e
commit
753a0cd366
1 changed files with 49 additions and 49 deletions
|
@ -9,7 +9,7 @@ private import bitmanip;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// TODO: Create unittests!!!!
|
// TODO: Check unittests (Use reliable software to check if the results are correct)
|
||||||
|
|
||||||
auto chacha20Cipher(R)(R range, ubyte[32] key, ubyte[8] nonce)
|
auto chacha20Cipher(R)(R range, ubyte[32] key, ubyte[8] nonce)
|
||||||
if(isInputRange!R && is(ElementType!R : ubyte))
|
if(isInputRange!R && is(ElementType!R : ubyte))
|
||||||
|
@ -81,7 +81,7 @@ enum string quarterRound(alias _x0, alias _x1, alias _x2, alias _x3) = q{
|
||||||
}.format(__traits(identifier, _x0), __traits(identifier, _x1),
|
}.format(__traits(identifier, _x0), __traits(identifier, _x1),
|
||||||
__traits(identifier, _x2), __traits(identifier, _x3));
|
__traits(identifier, _x2), __traits(identifier, _x3));
|
||||||
|
|
||||||
/*unittest
|
unittest
|
||||||
{
|
{
|
||||||
uint a1 = 0x00000000, a2 = 0x00000000, a3 = 0x00000000, a4 = 0x00000000,
|
uint a1 = 0x00000000, a2 = 0x00000000, a3 = 0x00000000, a4 = 0x00000000,
|
||||||
b1 = 0x00000001, b2 = 0x00000000, b3 = 0x00000000, b4 = 0x00000000,
|
b1 = 0x00000001, b2 = 0x00000000, b3 = 0x00000000, b4 = 0x00000000,
|
||||||
|
@ -100,13 +100,13 @@ enum string quarterRound(alias _x0, alias _x1, alias _x2, alias _x3) = q{
|
||||||
mixin(quarterRound!(g1, g2, g3, g4));
|
mixin(quarterRound!(g1, g2, g3, g4));
|
||||||
|
|
||||||
assert([a1, a2, a3, a4] == [0x00000000, 0x00000000, 0x00000000, 0x00000000]);
|
assert([a1, a2, a3, a4] == [0x00000000, 0x00000000, 0x00000000, 0x00000000]);
|
||||||
assert([b1, b2, b3, b4] == [0x08008145, 0x00000080, 0x00010200, 0x20500000]);
|
assert([b1, b2, b3, b4] == [0x10000001, 0x80808808, 0x01010110, 0x01000110]);
|
||||||
assert([c1, c2, c3, c4] == [0x88000100, 0x00000001, 0x00000200, 0x00402000]);
|
assert([c1, c2, c3, c4] == [0x10001001, 0x88888808, 0x01110110, 0x01100110]);
|
||||||
assert([d1, d2, d3, d4] == [0x80040000, 0x00000000, 0x00000001, 0x00002000]);
|
assert([d1, d2, d3, d4] == [0x00001000, 0x08080080, 0x00100001, 0x00100000]);
|
||||||
assert([e1, e2, e3, e4] == [0x00048044, 0x00000080, 0x00010000, 0x20100001]);
|
assert([e1, e2, e3, e4] == [0x10000000, 0x80800808, 0x01010010, 0x01000010]);
|
||||||
assert([f1, f2, f3, f4] == [0xe876d72b, 0x9361dfd5, 0xf1460244, 0x948541a3]);
|
assert([f1, f2, f3, f4] == [0x207cb2a0, 0x1f261df7, 0x9da4fd26, 0xc8768450]);
|
||||||
assert([g1, g2, g3, g4] == [0x3e2f308c, 0xd90a8f36, 0x6ab2a923, 0x2883524c]);
|
assert([g1, g2, g3, g4] == [0x18cb6df2, 0x41821bf8, 0x1fcb29a7, 0x92cbf922]);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
enum string rowRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
enum string rowRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
||||||
alias _x04, alias _x05, alias _x06, alias _x07,
|
alias _x04, alias _x05, alias _x06, alias _x07,
|
||||||
|
@ -125,7 +125,7 @@ enum string rowRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
||||||
__traits(identifier, _x12), __traits(identifier, _x13),
|
__traits(identifier, _x12), __traits(identifier, _x13),
|
||||||
__traits(identifier, _x14), __traits(identifier, _x15));
|
__traits(identifier, _x14), __traits(identifier, _x15));
|
||||||
|
|
||||||
/*unittest
|
unittest
|
||||||
{
|
{
|
||||||
uint y00 = 0x00000001, y01 = 0x00000000, y02 = 0x00000000, y03 = 0x00000000,
|
uint y00 = 0x00000001, y01 = 0x00000000, y02 = 0x00000000, y03 = 0x00000000,
|
||||||
y04 = 0x00000001, y05 = 0x00000000, y06 = 0x00000000, y07 = 0x00000000,
|
y04 = 0x00000001, y05 = 0x00000000, y06 = 0x00000000, y07 = 0x00000000,
|
||||||
|
@ -149,16 +149,16 @@ enum string rowRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
||||||
uint[] test1 = [x00, x01, x02, x03, x04, x05, x06, x07,
|
uint[] test1 = [x00, x01, x02, x03, x04, x05, x06, x07,
|
||||||
x08, x09, x10, x11, x12, x13, x14, x15];
|
x08, x09, x10, x11, x12, x13, x14, x15];
|
||||||
|
|
||||||
assert(test0 == [0x08008145, 0x00000080, 0x00010200, 0x20500000,
|
assert(test0 == [0x10000001, 0x10000000, 0x00001000, 0x10001001,
|
||||||
0x20100001, 0x00048044, 0x00000080, 0x00010000,
|
0x88888808, 0x80808808, 0x80800808, 0x08080080,
|
||||||
0x00000001, 0x00002000, 0x80040000, 0x00000000,
|
0x00100001, 0x01110110, 0x01010110, 0x01010010,
|
||||||
0x00000001, 0x00000200, 0x00402000, 0x88000100]);
|
0x01000010, 0x00100000, 0x01100110, 0x01000110]);
|
||||||
|
|
||||||
assert(test1 == [0xa890d39d, 0x65d71596, 0xe9487daa, 0xc8ca6a86,
|
assert(test1 == [0x9318dab2, 0x6219299a, 0xd68946c3, 0x3eb5b75f,
|
||||||
0x949d2192, 0x764b7754, 0xe408d9b9, 0x7a41b4d1,
|
0xe0df816c, 0x476df40b, 0xbb2e1d6f, 0x7608ad18,
|
||||||
0x3402e183, 0x3c3af432, 0x50669f96, 0xd89ef0a8,
|
0x71b82d0d, 0xe707569d, 0x4c71a945, 0x0b2b589a,
|
||||||
0x0040ede5, 0xb545fbce, 0xd257ed4f, 0x1818882d]);
|
0xe34c7f87, 0x5239bb58, 0x8a47d068, 0x475ec56d]);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
enum string colRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
enum string colRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
||||||
alias _x04, alias _x05, alias _x06, alias _x07,
|
alias _x04, alias _x05, alias _x06, alias _x07,
|
||||||
|
@ -177,7 +177,7 @@ enum string colRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
||||||
__traits(identifier, _x12), __traits(identifier, _x13),
|
__traits(identifier, _x12), __traits(identifier, _x13),
|
||||||
__traits(identifier, _x14), __traits(identifier, _x15));
|
__traits(identifier, _x14), __traits(identifier, _x15));
|
||||||
|
|
||||||
/*unittest{
|
unittest{
|
||||||
uint y00 = 0x00000001, y01 = 0x00000000, y02 = 0x00000000, y03 = 0x00000000,
|
uint y00 = 0x00000001, y01 = 0x00000000, y02 = 0x00000000, y03 = 0x00000000,
|
||||||
y04 = 0x00000001, y05 = 0x00000000, y06 = 0x00000000, y07 = 0x00000000,
|
y04 = 0x00000001, y05 = 0x00000000, y06 = 0x00000000, y07 = 0x00000000,
|
||||||
y08 = 0x00000001, y09 = 0x00000000, y10 = 0x00000000, y11 = 0x00000000,
|
y08 = 0x00000001, y09 = 0x00000000, y10 = 0x00000000, y11 = 0x00000000,
|
||||||
|
@ -201,16 +201,16 @@ enum string colRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
||||||
uint[] test1 = [x00, x01, x02, x03, x04, x05, x06, x07,
|
uint[] test1 = [x00, x01, x02, x03, x04, x05, x06, x07,
|
||||||
x08, x09, x10, x11, x12, x13, x14, x15];
|
x08, x09, x10, x11, x12, x13, x14, x15];
|
||||||
|
|
||||||
assert(test0 == [0x10090288, 0x00000000, 0x00000000, 0x00000000,
|
assert(test0 == [0x30000002, 0x00000000, 0x00000000, 0x00000000,
|
||||||
0x00000101, 0x00000000, 0x00000000, 0x00000000,
|
0x81811899, 0x00000000, 0x00000000, 0x00000000,
|
||||||
0x00020401, 0x00000000, 0x00000000, 0x00000000,
|
0x03030231, 0x00000000, 0x00000000, 0x00000000,
|
||||||
0x40a04001, 0x00000000, 0x00000000, 0x00000000]);
|
0x03000230, 0x00000000, 0x00000000, 0x00000000]);
|
||||||
|
|
||||||
assert(test1 == [0x8c9d190a, 0xce8e4c90, 0x1ef8e9d3, 0x1326a71a,
|
assert(test1 == [0x54c4775a, 0xb72a4bef, 0xcaba7b13, 0xdc9d2cb9,
|
||||||
0x90a20123, 0xead3c4f3, 0x63a091a0, 0xf0708d69,
|
0x01a21f25, 0x229f731a, 0xb515e4fe, 0xcd79967d,
|
||||||
0x789b010c, 0xd195a681, 0xeb7d5504, 0xa774135c,
|
0xcd26b517, 0x533f496f, 0x5cd61313, 0x3c6a9772,
|
||||||
0x481c2027, 0x53a8e4b5, 0x4c1f89c5, 0x3f78c9c8]);
|
0xf5529d13, 0xfbee0de7, 0x7c5c8c13, 0x9c847b82]);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
ubyte[] chacha20(in ubyte[] input) @safe nothrow pure
|
ubyte[] chacha20(in ubyte[] input) @safe nothrow pure
|
||||||
in
|
in
|
||||||
|
@ -256,7 +256,7 @@ body
|
||||||
littleEndianInv(x14 + y14) ~ littleEndianInv(x15 + y15);
|
littleEndianInv(x14 + y14) ~ littleEndianInv(x15 + y15);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*unittest
|
unittest
|
||||||
{
|
{
|
||||||
ubyte[] test0 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
ubyte[] test0 = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
@ -288,21 +288,21 @@ body
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||||
|
|
||||||
assert(test1 == [109, 42,178,168,156,240,248,238,168,196,190,203, 26,110,170,154,
|
assert(test1 == [ 19,135,149, 14, 40,180,217,109,187,122,124,114, 23, 14,107,241,
|
||||||
29, 29,150, 26,150, 30,235,249,190,163,251, 48, 69,144, 51, 57,
|
231, 18, 85,210, 56,159, 57,224, 96, 71, 85,167,202,180, 98, 96,
|
||||||
118, 40,152,157,180, 57, 27, 94,107, 42,236, 35, 27,111,114,114,
|
185, 76, 56,161,168,230,132,189, 84, 59, 55,254, 39, 21, 41,153,
|
||||||
219,236,232,135,111,155,110, 18, 24,232, 95,158,179, 19, 48,202]);
|
144,151, 5,208,189, 9,140, 64,226,151,219, 26, 80,221,237,194]);
|
||||||
|
|
||||||
assert(test2 == [179, 19, 48,202,219,236,232,135,111,155,110, 18, 24,232, 95,158,
|
assert(test2 == [ 76, 1, 30, 79,130,234,169,252,194, 25,110,243,141, 64, 68,140,
|
||||||
26,110,170,154,109, 42,178,168,156,240,248,238,168,196,190,203,
|
106, 32,248,152,219, 73,115,133, 10,143, 99,162, 72,155,138, 55,
|
||||||
69,144, 51, 57, 29, 29,150, 26,150, 30,235,249,190,163,251, 48,
|
58,214, 79, 49, 97, 63,201,155,178,203, 15, 94, 66,224,216,184,
|
||||||
27,111,114,114,118, 40,152,157,180, 57, 27, 94,107, 42,236, 35]);
|
64, 85,186,170, 65, 79, 11, 91, 22,247,191, 72, 68,250,229,108]);
|
||||||
|
|
||||||
assert(test3 == [ 8, 18, 38,199,119, 76,215, 67,173,127,144,162,103,212,176,217,
|
assert(test3 == [ 88, 97,168, 54,215,192,249,115,185,160,231, 86,203,147, 27, 34,
|
||||||
192, 19,233, 33,159,197,154,160,128,243,219, 65,171,136,135,225,
|
237,252,228, 40, 1,135,107, 88,160,239, 5,182,250, 16,217,224,
|
||||||
123, 11, 68, 86,237, 82, 20,155,133,189, 9, 83,167,116,194, 78,
|
101, 27,113, 5, 50,192, 52, 70, 7,110,217, 10, 3,226, 85,129,
|
||||||
122,127,195,185,185,204,188, 90,245, 9,183,248,226, 85,245,104]);
|
29,214,235,224, 96, 42, 55, 53,188, 35, 81,171, 81,218,221, 44]);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
enum ubyte[4] σ0 = [101, 120, 112, 97];
|
enum ubyte[4] σ0 = [101, 120, 112, 97];
|
||||||
enum ubyte[4] σ1 = [110, 100, 32, 51];
|
enum ubyte[4] σ1 = [110, 100, 32, 51];
|
||||||
|
@ -324,7 +324,7 @@ body
|
||||||
return chacha20(σ0 ~ key[0..16] ~ σ1 ~ n ~ σ2 ~ key[16..$] ~ σ3);
|
return chacha20(σ0 ~ key[0..16] ~ σ1 ~ n ~ σ2 ~ key[16..$] ~ σ3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*unittest
|
unittest
|
||||||
{
|
{
|
||||||
ubyte[] key;
|
ubyte[] key;
|
||||||
ubyte[] n;
|
ubyte[] n;
|
||||||
|
@ -338,8 +338,8 @@ body
|
||||||
foreach(i; 0..16)
|
foreach(i; 0..16)
|
||||||
n[i] = cast(ubyte)(i + 1+ 100);
|
n[i] = cast(ubyte)(i + 1+ 100);
|
||||||
|
|
||||||
assert(chacha20Exp(key, n) == [ 69, 37, 68, 39, 41, 15,107,193,255,139,122, 6,170,233,217, 98,
|
assert(chacha20Exp(key, n) == [ 2, 7, 55,183,240,232, 0,145,207,208,120,131,146, 9,130, 31,
|
||||||
89,144,182,106, 21, 51,200, 65,239, 49,222, 34,215,114, 40,126,
|
99,154, 60, 98,194,161,191, 80,167, 61,100,101,173,193, 48,203,
|
||||||
104,197, 7,225,197,153, 31, 2,102, 78, 76,176, 84,245,246,184,
|
248, 45, 55, 12, 69, 21,147,216,142,141,137,131, 14, 7,181, 1,
|
||||||
177,160,133,130, 6, 72,149,119,192,195,132,236,234,103,246, 74]);
|
63,126,214,246, 74,167, 55,124,119,140,129,165,170,250,173, 94]);
|
||||||
}*/
|
}
|
||||||
|
|
Loading…
Reference in a new issue