//public static readonly FieldElement Zero = new FieldElement(); //public static readonly FieldElement One = new FieldElement() { x0 = 1 }; internal FieldElement(params int[] elements) { InternalAssert.Assert(elements.Length == 10, "elements.Length != 10"); x0 = elements[0]; x1 = elements[1]; x2 = elements[2]; x3 = elements[3]; x4 = elements[4]; x5 = elements[5]; x6 = elements[6]; x7 = elements[7]; x8 = elements[8]; x9 = elements[9]; }
public static void HSalsa(out Array16\\ output, ref Array16\\ input, int rounds) { InternalAssert.Assert(rounds % 2 == 0, "Number of salsa rounds must be even"); int doubleRounds = rounds / 2; UInt32 x0 = input.x0; UInt32 x1 = input.x1; UInt32 x2 = input.x2; UInt32 x3 = input.x3; UInt32 x4 = input.x4; UInt32 x5 = input.x5; UInt32 x6 = input.x6; UInt32 x7 = input.x7; UInt32 x8 = input.x8; UInt32 x9 = input.x9; UInt32 x10 = input.x10; UInt32 x11 = input.x11; UInt32 x12 = input.x12; UInt32 x13 = input.x13; UInt32 x14 = input.x14; UInt32 x15 = input.x15; unchecked { for (int i = 0; i \\\>\ (32 - 7)); y = x4 + x0; x8 ^= (y \\\>\ (32 - 9)); y = x8 + x4; x12 ^= (y \\\>\ (32 - 13)); y = x12 + x8; x0 ^= (y \\\>\ (32 - 18)); // row 1 y = x5 + x1; x9 ^= (y \\\>\ (32 - 7)); y = x9 + x5; x13 ^= (y \\\>\ (32 - 9)); y = x13 + x9; x1 ^= (y \\\>\ (32 - 13)); y = x1 + x13; x5 ^= (y \\\>\ (32 - 18)); // row 2 y = x10 + x6; x14 ^= (y \\\>\ (32 - 7)); y = x14 + x10; x2 ^= (y \\\>\ (32 - 9)); y = x2 + x14; x6 ^= (y \\\>\ (32 - 13)); y = x6 + x2; x10 ^= (y \\\>\ (32 - 18)); // row 3 y = x15 + x11; x3 ^= (y \\\>\ (32 - 7)); y = x3 + x15; x7 ^= (y \\\>\ (32 - 9)); y = x7 + x3; x11 ^= (y \\\>\ (32 - 13)); y = x11 + x7; x15 ^= (y \\\>\ (32 - 18)); // column 0 y = x0 + x3; x1 ^= (y \\\>\ (32 - 7)); y = x1 + x0; x2 ^= (y \\\>\ (32 - 9)); y = x2 + x1; x3 ^= (y \\\>\ (32 - 13)); y = x3 + x2; x0 ^= (y \\\>\ (32 - 18)); // column 1 y = x5 + x4; x6 ^= (y \\\>\ (32 - 7)); y = x6 + x5; x7 ^= (y \\\>\ (32 - 9)); y = x7 + x6; x4 ^= (y \\\>\ (32 - 13)); y = x4 + x7; x5 ^= (y \\\>\ (32 - 18)); // column 2 y = x10 + x9; x11 ^= (y \\\>\ (32 - 7)); y = x11 + x10; x8 ^= (y \\\>\ (32 - 9)); y = x8 + x11; x9 ^= (y \\\>\ (32 - 13)); y = x9 + x8; x10 ^= (y \\\>\ (32 - 18)); // column 3 y = x15 + x14; x12 ^= (y \\\>\ (32 - 7)); y = x12 + x15; x13 ^= (y \\\>\ (32 - 9)); y = x13 + x12; x14 ^= (y \\\>\ (32 - 13)); y = x14 + x13; x15 ^= (y \\\>\ (32 - 18)); } }
public void AssertFail() { InternalAssert.Assert(false, "a"); }
public static void HSalsa(out Array16 <uint> output, ref Array16 <uint> input, int rounds) { InternalAssert.Assert(rounds % 2 == 0, "Number of salsa rounds must be even"); var doubleRounds = rounds / 2; var x0 = input.x0; var x1 = input.x1; var x2 = input.x2; var x3 = input.x3; var x4 = input.x4; var x5 = input.x5; var x6 = input.x6; var x7 = input.x7; var x8 = input.x8; var x9 = input.x9; var x10 = input.x10; var x11 = input.x11; var x12 = input.x12; var x13 = input.x13; var x14 = input.x14; var x15 = input.x15; unchecked { for (var i = 0; i < doubleRounds; i++) { uint y; // row 0 y = x0 + x12; x4 ^= (y << 7) | (y >> (32 - 7)); y = x4 + x0; x8 ^= (y << 9) | (y >> (32 - 9)); y = x8 + x4; x12 ^= (y << 13) | (y >> (32 - 13)); y = x12 + x8; x0 ^= (y << 18) | (y >> (32 - 18)); // row 1 y = x5 + x1; x9 ^= (y << 7) | (y >> (32 - 7)); y = x9 + x5; x13 ^= (y << 9) | (y >> (32 - 9)); y = x13 + x9; x1 ^= (y << 13) | (y >> (32 - 13)); y = x1 + x13; x5 ^= (y << 18) | (y >> (32 - 18)); // row 2 y = x10 + x6; x14 ^= (y << 7) | (y >> (32 - 7)); y = x14 + x10; x2 ^= (y << 9) | (y >> (32 - 9)); y = x2 + x14; x6 ^= (y << 13) | (y >> (32 - 13)); y = x6 + x2; x10 ^= (y << 18) | (y >> (32 - 18)); // row 3 y = x15 + x11; x3 ^= (y << 7) | (y >> (32 - 7)); y = x3 + x15; x7 ^= (y << 9) | (y >> (32 - 9)); y = x7 + x3; x11 ^= (y << 13) | (y >> (32 - 13)); y = x11 + x7; x15 ^= (y << 18) | (y >> (32 - 18)); // column 0 y = x0 + x3; x1 ^= (y << 7) | (y >> (32 - 7)); y = x1 + x0; x2 ^= (y << 9) | (y >> (32 - 9)); y = x2 + x1; x3 ^= (y << 13) | (y >> (32 - 13)); y = x3 + x2; x0 ^= (y << 18) | (y >> (32 - 18)); // column 1 y = x5 + x4; x6 ^= (y << 7) | (y >> (32 - 7)); y = x6 + x5; x7 ^= (y << 9) | (y >> (32 - 9)); y = x7 + x6; x4 ^= (y << 13) | (y >> (32 - 13)); y = x4 + x7; x5 ^= (y << 18) | (y >> (32 - 18)); // column 2 y = x10 + x9; x11 ^= (y << 7) | (y >> (32 - 7)); y = x11 + x10; x8 ^= (y << 9) | (y >> (32 - 9)); y = x8 + x11; x9 ^= (y << 13) | (y >> (32 - 13)); y = x9 + x8; x10 ^= (y << 18) | (y >> (32 - 18)); // column 3 y = x15 + x14; x12 ^= (y << 7) | (y >> (32 - 7)); y = x12 + x15; x13 ^= (y << 9) | (y >> (32 - 9)); y = x13 + x12; x14 ^= (y << 13) | (y >> (32 - 13)); y = x14 + x13; x15 ^= (y << 18) | (y >> (32 - 18)); } } output.x0 = x0; output.x1 = x1; output.x2 = x2; output.x3 = x3; output.x4 = x4; output.x5 = x5; output.x6 = x6; output.x7 = x7; output.x8 = x8; output.x9 = x9; output.x10 = x10; output.x11 = x11; output.x12 = x12; output.x13 = x13; output.x14 = x14; output.x15 = x15; }
public void AssertSuccess() { InternalAssert.Assert(true, "a"); }