예제 #1
0
        public static void Mainloop(int[] Work, byte[] E)
        {
            int[] xzm1  = new int[64];
            int[] xzm   = new int[64];
            int[] xzmb  = new int[64];
            int[] Xzm1B = new int[64];
            int[] xznb  = new int[64];
            int[] Xzn1B = new int[64];
            int[] a0    = new int[64];
            int[] a1    = new int[64];
            int[] b0    = new int[64];
            int[] b1    = new int[64];
            int[] c1    = new int[64];
            int[] r     = new int[32];
            int[] s     = new int[32];
            int[] t     = new int[32];
            int[] u     = new int[32];

            for (int j = 0; j < 32; ++j)
            {
                xzm1[j] = Work[j];
            }

            xzm1[32] = 1;

            for (int j = 33; j < 64; ++j)
            {
                xzm1[j] = 0;
            }

            xzm[0] = 1;

            for (int j = 1; j < 64; ++j)
            {
                xzm[j] = 0;
            }

            int[] xzmbp = xzmb, A0P = a0, Xzm1Bp = Xzm1B;
            int[] A1P   = a1, B0P = b0, B1P = b1, C1P = c1;
            int[] xznbp = xznb, up = u, Xzn1Bp = Xzn1B;
            int[] workp = Work, sp = s, rp = r;

            for (int pos = 254; pos >= 0; --pos)
            {
                int b = (int)((uint)(E[pos / 8] & 0xFF) >> (pos & 7));
                b &= 1;
                Curve25519.Select(xzmb, Xzm1B, xzm, xzm1, b);
                Curve25519.Add(a0, 0, xzmb, 0, xzmbp, 32);
                Curve25519.Sub(A0P, 32, xzmb, 0, xzmbp, 32);
                Curve25519.Add(a1, 0, Xzm1B, 0, Xzm1Bp, 32);
                Curve25519.Sub(A1P, 32, Xzm1B, 0, Xzm1Bp, 32);
                Curve25519.Square(B0P, 0, A0P, 0);
                Curve25519.Square(B0P, 32, A0P, 32);
                Curve25519.Mult(B1P, 0, A1P, 0, A0P, 32);
                Curve25519.Mult(B1P, 32, A1P, 32, A0P, 0);
                Curve25519.Add(c1, 0, b1, 0, B1P, 32);
                Curve25519.Sub(C1P, 32, b1, 0, B1P, 32);
                Curve25519.Square(rp, 0, C1P, 32);
                Curve25519.Sub(sp, 0, b0, 0, B0P, 32);
                Curve25519.Mult121665(t, s);
                Curve25519.Add(u, 0, t, 0, B0P, 0);
                Curve25519.Mult(xznbp, 0, B0P, 0, B0P, 32);
                Curve25519.Mult(xznbp, 32, sp, 0, up, 0);
                Curve25519.Square(Xzn1Bp, 0, C1P, 0);
                Curve25519.Mult(Xzn1Bp, 32, rp, 0, workp, 0);
                Curve25519.Select(xzm, xzm1, xznb, Xzn1B, b);
            }

            for (int j = 0; j < 64; ++j)
            {
                Work[j] = xzm[j];
            }
        }