//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];
        }
Exemple #2
0
        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");
 }