Ejemplo n.º 1
0
        public static uint MulWordDwordAdd(uint x, ulong y, uint[] z, int zOff)
        {
            Debug.Assert(zOff <= 5);
            ulong c = 0, xVal = x;

            c          += xVal * y + z[zOff + 0];
            z[zOff + 0] = (uint)c;
            c         >>= 32;
            c          += xVal * (y >> 32) + z[zOff + 1];
            z[zOff + 1] = (uint)c;
            c         >>= 32;
            c          += z[zOff + 2];
            z[zOff + 2] = (uint)c;
            c         >>= 32;
            return(c == 0 ? 0 : Nat.IncAt(8, z, zOff, 3));
        }
Ejemplo n.º 2
0
        public static uint Mul33WordAdd(uint x, uint y, uint[] z, int zOff)
        {
            Debug.Assert(x >> 31 == 0);
            Debug.Assert(zOff <= 4);
            ulong c = 0, yVal = y;

            c          += yVal * x + z[zOff + 0];
            z[zOff + 0] = (uint)c;
            c         >>= 32;
            c          += yVal + z[zOff + 1];
            z[zOff + 1] = (uint)c;
            c         >>= 32;
            c          += z[zOff + 2];
            z[zOff + 2] = (uint)c;
            c         >>= 32;
            return(c == 0 ? 0 : Nat.IncAt(7, z, zOff, 3));
        }
Ejemplo n.º 3
0
        private static void AddPInvTo(uint[] z)
        {
            long num = z[0] + 1L;

            z[0] = (uint)num;
            num  = num >> 0x20;
            if (num != 0L)
            {
                num += z[1];
                z[1] = (uint)num;
                num  = num >> 0x20;
            }
            num  = ((long)((ulong)num)) + (z[2] + 1L);
            z[2] = (uint)num;
            num  = num >> 0x20;
            if (num != 0L)
            {
                Nat.IncAt(6, z, 3);
            }
        }
Ejemplo n.º 4
0
        private static void AddPInvTo(uint[] z)
        {
            long c = (long)z[0] + 1;

            z[0] = (uint)c;
            c  >>= 32;
            if (c != 0)
            {
                c   += (long)z[1];
                z[1] = (uint)c;
                c  >>= 32;
            }
            c   += (long)z[2] + 1;
            z[2] = (uint)c;
            c  >>= 32;
            if (c != 0)
            {
                Nat.IncAt(6, z, 3);
            }
        }
Ejemplo n.º 5
0
        private static void AddPInvTo(uint[] z)
        {
            long num = (long)z[0] + 1L;

            z[0]  = (uint)num;
            num >>= 32;
            if (num != 0)
            {
                num  += z[1];
                z[1]  = (uint)num;
                num >>= 32;
            }
            num  += (long)z[2] + 1L;
            z[2]  = (uint)num;
            num >>= 32;
            if (num != 0)
            {
                Nat.IncAt(6, z, 3);
            }
        }
Ejemplo n.º 6
0
        private static int SubPExtFrom(uint[] zz)
        {
            long num = (long)((ulong)zz[0] - (ulong)Curve25519Field.PExt[0]);

            zz[0] = (uint)num;
            num >>= 32;
            if (num != 0L)
            {
                num = (long)Nat.DecAt(8, zz, 1);
            }
            num  += (long)((ulong)zz[8] + 19uL);
            zz[8] = (uint)num;
            num >>= 32;
            if (num != 0L)
            {
                num = (long)((ulong)Nat.IncAt(15, zz, 9));
            }
            num   += (long)((ulong)zz[15] - (ulong)(Curve25519Field.PExt[15] + 1u));
            zz[15] = (uint)num;
            num  >>= 32;
            return((int)num);
        }
Ejemplo n.º 7
0
        private static uint AddPExtTo(uint[] zz)
        {
            long num = (long)((ulong)zz[0] + (ulong)Curve25519Field.PExt[0]);

            zz[0] = (uint)num;
            num >>= 32;
            if (num != 0L)
            {
                num = (long)((ulong)Nat.IncAt(8, zz, 1));
            }
            num  += (long)((ulong)zz[8] - 19uL);
            zz[8] = (uint)num;
            num >>= 32;
            if (num != 0L)
            {
                num = (long)Nat.DecAt(15, zz, 9);
            }
            num   += (long)((ulong)zz[15] + (ulong)(Curve25519Field.PExt[15] + 1u));
            zz[15] = (uint)num;
            num  >>= 32;
            return((uint)num);
        }
Ejemplo n.º 8
0
        private static uint AddPExtTo(uint[] zz)
        {
            long num = zz[0] + PExt[0];

            zz[0] = (uint)num;
            num   = num >> 0x20;
            if (num != 0L)
            {
                num = Nat.IncAt(8, zz, 1);
            }
            num   = ((long)((ulong)num)) + (zz[8] - 0x13L);
            zz[8] = (uint)num;
            num   = num >> 0x20;
            if (num != 0L)
            {
                num = Nat.DecAt(15, zz, 9);
            }
            num    = (long)(((ulong)num) + (zz[15] + (PExt[15] + 1)));
            zz[15] = (uint)num;
            num    = num >> 0x20;
            return((uint)num);
        }
Ejemplo n.º 9
0
        private static int SubPExtFrom(uint[] zz)
        {
            long c = (long)zz[0] - PExt[0];

            zz[0] = (uint)c;
            c   >>= 32;
            if (c != 0)
            {
                c = Nat.DecAt(8, zz, 1);
            }
            c    += (long)zz[8] + PInv;
            zz[8] = (uint)c;
            c   >>= 32;
            if (c != 0)
            {
                c = Nat.IncAt(15, zz, 9);
            }
            c     += (long)zz[15] - (PExt[15] + 1);
            zz[15] = (uint)c;
            c    >>= 32;
            return((int)c);
        }
Ejemplo n.º 10
0
        private static int SubPExtFrom(uint[] zz)
        {
            long num = (long)zz[0] - (long)PExt[0];

            zz[0] = (uint)num;
            num >>= 32;
            if (num != 0)
            {
                num = Nat.DecAt(8, zz, 1);
            }
            num  += (long)zz[8] + 19L;
            zz[8] = (uint)num;
            num >>= 32;
            if (num != 0)
            {
                num = Nat.IncAt(15, zz, 9);
            }
            num   += (long)zz[15] - (long)(PExt[15] + 1);
            zz[15] = (uint)num;
            num  >>= 32;
            return((int)num);
        }
Ejemplo n.º 11
0
        private static uint AddPExtTo(uint[] zz)
        {
            long c = (long)zz[0] + PExt[0];

            zz[0] = (uint)c;
            c   >>= 32;
            if (c != 0)
            {
                c = Nat.IncAt(8, zz, 1);
            }
            c    += (long)zz[8] - PInv;
            zz[8] = (uint)c;
            c   >>= 32;
            if (c != 0)
            {
                c = Nat.DecAt(15, zz, 9);
            }
            c     += (long)zz[15] + (PExt[15] + 1);
            zz[15] = (uint)c;
            c    >>= 32;
            return((uint)c);
        }
Ejemplo n.º 12
0
        private static uint AddPExtTo(uint[] zz)
        {
            long num = (long)zz[0] + (long)PExt[0];

            zz[0] = (uint)num;
            num >>= 32;
            if (num != 0)
            {
                num = Nat.IncAt(8, zz, 1);
            }
            num  += (long)zz[8] - 19L;
            zz[8] = (uint)num;
            num >>= 32;
            if (num != 0)
            {
                num = Nat.DecAt(15, zz, 9);
            }
            num   += (long)zz[15] + (long)(PExt[15] + 1);
            zz[15] = (uint)num;
            num  >>= 32;
            return((uint)num);
        }
Ejemplo n.º 13
0
        private static int SubPExtFrom(uint[] zz)
        {
            long num = zz[0] - PExt[0];

            zz[0] = (uint)num;
            num   = num >> 0x20;
            if (num != 0L)
            {
                num = Nat.DecAt(8, zz, 1);
            }
            num   = ((long)((ulong)num)) + (zz[8] + 0x13L);
            zz[8] = (uint)num;
            num   = num >> 0x20;
            if (num != 0L)
            {
                num = Nat.IncAt(15, zz, 9);
            }
            num    = (long)(((ulong)num) + (zz[15] - (PExt[15] + 1)));
            zz[15] = (uint)num;
            num    = num >> 0x20;
            return((int)num);
        }
Ejemplo n.º 14
0
        private static void AddPInvTo(uint[] z)
        {
            long num = (long)((ulong)z[0] - 1uL);

            z[0]  = (uint)num;
            num >>= 32;
            if (num != 0L)
            {
                num  += (long)((ulong)z[1]);
                z[1]  = (uint)num;
                num >>= 32;
                num  += (long)((ulong)z[2]);
                z[2]  = (uint)num;
                num >>= 32;
            }
            num  += (long)((ulong)z[3] + 1uL);
            z[3]  = (uint)num;
            num >>= 32;
            if (num != 0L)
            {
                Nat.IncAt(7, z, 4);
            }
        }
Ejemplo n.º 15
0
        public static uint Mul33DWordAdd(uint x, ulong y, uint[] z, int zOff)
        {
            Debug.Assert(x >> 31 == 0);
            Debug.Assert(zOff <= 3);
            ulong c = 0, xVal = x;
            ulong y00 = y & M;

            c          += xVal * y00 + z[zOff + 0];
            z[zOff + 0] = (uint)c;
            c         >>= 32;
            ulong y01 = y >> 32;

            c          += xVal * y01 + y00 + z[zOff + 1];
            z[zOff + 1] = (uint)c;
            c         >>= 32;
            c          += y01 + z[zOff + 2];
            z[zOff + 2] = (uint)c;
            c         >>= 32;
            c          += z[zOff + 3];
            z[zOff + 3] = (uint)c;
            c         >>= 32;
            return(c == 0 ? 0 : Nat.IncAt(7, z, zOff, 4));
        }
Ejemplo n.º 16
0
        public static void Reduce32(uint x, uint[] z)
        {
            ulong num = 0uL;

            if (x != 0u)
            {
                num  += (ulong)z[0] + (ulong)x;
                z[0]  = (uint)num;
                num >>= 32;
                if (num != 0uL)
                {
                    num  += (ulong)z[1];
                    z[1]  = (uint)num;
                    num >>= 32;
                }
                num  += (ulong)z[2] + (ulong)x;
                z[2]  = (uint)num;
                num >>= 32;
            }
            if ((num != 0uL && Nat.IncAt(6, z, 3) != 0u) || (z[5] == 4294967295u && Nat192.Gte(z, SecP192R1Field.P)))
            {
                SecP192R1Field.AddPInvTo(z);
            }
        }
Ejemplo n.º 17
0
        public static void Reduce32(uint x, uint[] z)
        {
            long cc = 0;

            if (x != 0)
            {
                long xx12 = x;

                cc  += (long)z[0] + xx12;
                z[0] = (uint)cc;
                cc >>= 32;
                cc  += (long)z[1] - xx12;
                z[1] = (uint)cc;
                cc >>= 32;
                if (cc != 0)
                {
                    cc  += (long)z[2];
                    z[2] = (uint)cc;
                    cc >>= 32;
                }
                cc  += (long)z[3] + xx12;
                z[3] = (uint)cc;
                cc >>= 32;
                cc  += (long)z[4] + xx12;
                z[4] = (uint)cc;
                cc >>= 32;

                Debug.Assert(cc == 0 || cc == 1);
            }

            if ((cc != 0 && Nat.IncAt(12, z, 5) != 0) ||
                (z[11] == P11 && Nat.Gte(12, z, P)))
            {
                AddPInvTo(z);
            }
        }
Ejemplo n.º 18
0
        public static void Reduce32(uint x, uint[] z)
        {
            ulong num = 0L;

            if (x != 0)
            {
                num += z[0] + x;
                z[0] = (uint)num;
                num  = num >> 0x20;
                if (num != 0L)
                {
                    num += z[1];
                    z[1] = (uint)num;
                    num  = num >> 0x20;
                }
                num += z[2] + x;
                z[2] = (uint)num;
                num  = num >> 0x20;
            }
            if (((num != 0L) && (Nat.IncAt(6, z, 3) != 0)) || ((z[5] == uint.MaxValue) && Nat192.Gte(z, P)))
            {
                AddPInvTo(z);
            }
        }
Ejemplo n.º 19
0
        public static void Reduce32(uint x, uint[] z)
        {
            ulong num = 0uL;

            if (x != 0)
            {
                num  += (ulong)((long)z[0] + (long)x);
                z[0]  = (uint)num;
                num >>= 32;
                if (num != 0)
                {
                    num  += z[1];
                    z[1]  = (uint)num;
                    num >>= 32;
                }
                num  += (ulong)((long)z[2] + (long)x);
                z[2]  = (uint)num;
                num >>= 32;
            }
            if ((num != 0 && Nat.IncAt(6, z, 3) != 0) || (z[5] == 4294967295u && Nat192.Gte(z, P)))
            {
                AddPInvTo(z);
            }
        }
Ejemplo n.º 20
0
        public static void Reduce(uint[] xx, uint[] z)
        {
            ulong xx06 = xx[6], xx07 = xx[7], xx08 = xx[8];
            ulong xx09 = xx[9], xx10 = xx[10], xx11 = xx[11];

            ulong t0 = xx06 + xx10;
            ulong t1 = xx07 + xx11;

            ulong cc = 0;

            cc += (ulong)xx[0] + t0;
            uint z0 = (uint)cc;

            cc >>= 32;
            cc  += (ulong)xx[1] + t1;
            z[1] = (uint)cc;
            cc >>= 32;

            t0 += xx08;
            t1 += xx09;

            cc += (ulong)xx[2] + t0;
            ulong z2 = (uint)cc;

            cc >>= 32;
            cc  += (ulong)xx[3] + t1;
            z[3] = (uint)cc;
            cc >>= 32;

            t0 -= xx06;
            t1 -= xx07;

            cc  += (ulong)xx[4] + t0;
            z[4] = (uint)cc;
            cc >>= 32;
            cc  += (ulong)xx[5] + t1;
            z[5] = (uint)cc;
            cc >>= 32;

            z2 += cc;

            cc  += z0;
            z[0] = (uint)cc;
            cc >>= 32;
            if (cc != 0)
            {
                cc  += z[1];
                z[1] = (uint)cc;
                z2  += cc >> 32;
            }
            z[2] = (uint)z2;
            cc   = z2 >> 32;

            Debug.Assert(cc == 0 || cc == 1);

            if ((cc != 0 && Nat.IncAt(6, z, 3) != 0) ||
                (z[5] == P5 && Nat192.Gte(z, P)))
            {
                AddPInvTo(z);
            }
        }
Ejemplo n.º 21
0
        public static void Reduce(uint[] xx, uint[] z)
        {
            long xx10 = xx[10], xx11 = xx[11], xx12 = xx[12], xx13 = xx[13];

            const long n = 1;

            long t0 = (long)xx[7] + xx11 - n;
            long t1 = (long)xx[8] + xx12;
            long t2 = (long)xx[9] + xx13;

            long cc = 0;

            cc += (long)xx[0] - t0;
            long z0 = (uint)cc;

            cc >>= 32;
            cc  += (long)xx[1] - t1;
            z[1] = (uint)cc;
            cc >>= 32;
            cc  += (long)xx[2] - t2;
            z[2] = (uint)cc;
            cc >>= 32;
            cc  += (long)xx[3] + t0 - xx10;
            long z3 = (uint)cc;

            cc >>= 32;
            cc  += (long)xx[4] + t1 - xx11;
            z[4] = (uint)cc;
            cc >>= 32;
            cc  += (long)xx[5] + t2 - xx12;
            z[5] = (uint)cc;
            cc >>= 32;
            cc  += (long)xx[6] + xx10 - xx13;
            z[6] = (uint)cc;
            cc >>= 32;
            cc  += n;

            Debug.Assert(cc >= 0);

            z3 += cc;

            z0  -= cc;
            z[0] = (uint)z0;
            cc   = z0 >> 32;
            if (cc != 0)
            {
                cc  += (long)z[1];
                z[1] = (uint)cc;
                cc >>= 32;
                cc  += (long)z[2];
                z[2] = (uint)cc;
                z3  += cc >> 32;
            }
            z[3] = (uint)z3;
            cc   = z3 >> 32;

            Debug.Assert(cc == 0 || cc == 1);

            if ((cc != 0 && Nat.IncAt(7, z, 4) != 0) ||
                (z[6] == P6 && Nat224.Gte(z, P)))
            {
                AddPInvTo(z);
            }
        }