public static int ge_frombytes_negate_vartime(Ge_p3 h, byte[] s)
        {
            int[] u     = new int[10];
            int[] v     = new int[10];
            int[] v3    = new int[10];
            int[] vxx   = new int[10];
            int[] check = new int[10];

            Fe_frombytes.fe_frombytes(h.Y, s);
            Fe_1.fe_1(h.Z);
            Fe_sq.fe_sq(u, h.Y);
            Fe_mul.fe_mul(v, u, d);
            Fe_sub.fe_sub(u, u, h.Z);       /* u = y^2-1 */
            Fe_add.fe_add(v, v, h.Z);       /* v = dy^2+1 */

            Fe_sq.fe_sq(v3, v);
            Fe_mul.fe_mul(v3, v3, v);        /* v3 = v^3 */
            Fe_sq.fe_sq(h.X, v3);
            Fe_mul.fe_mul(h.X, h.X, v);
            Fe_mul.fe_mul(h.X, h.X, u);        /* x = uv^7 */

            Fe_pow22523.fe_pow22523(h.X, h.X); /* x = (uv^7)^((q-5)/8) */
            Fe_mul.fe_mul(h.X, h.X, v3);
            Fe_mul.fe_mul(h.X, h.X, u);        /* x = uv^3(uv^7)^((q-5)/8) */

            Fe_sq.fe_sq(vxx, h.X);
            Fe_mul.fe_mul(vxx, vxx, v);
            Fe_sub.fe_sub(check, vxx, u);    /* vx^2-u */
            if (Fe_isnonzero.fe_isnonzero(check) != 0)
            {
                Fe_add.fe_add(check, vxx, u);  /* vx^2+u */
                if (Fe_isnonzero.fe_isnonzero(check) != 0)
                {
                    return(-1);
                }
                Fe_mul.fe_mul(h.X, h.X, sqrtm1);
            }

            if (Fe_isnegative.fe_isnegative(h.X) == ((((uint)s[31]) >> 7) & 0x01))
            {
                Fe_neg.fe_neg(h.X, h.X);
            }

            Fe_mul.fe_mul(h.T, h.X, h.Y);
            return(0);
        }
Exemplo n.º 2
0
        /* Preconditions: a is square or zero */
        public static void fe_sqrt(int[] iOut, int[] a)
        {
            int[] exp = new int[10];
            int[] b   = new int[10];
            int[] b2  = new int[10];
            int[] bi  = new int[10];
            int[] i   = new int[10];

            Fe_frombytes.fe_frombytes(i, i_bytes);
            Fe_pow22523.fe_pow22523(exp, a);    /* b = a^(q-5)/8 */

            /* PRECONDITION: legendre symbol == 1 (square) or 0 (a == zero) */
            //#ifndef NDEBUG
            //fe legendre, zero, one;
            //fe_sq(legendre, exp);            /* in^((q-5)/4) */
            //fe_sq(legendre, legendre);       /* in^((q-5)/2) */
            //fe_mul(legendre, legendre, a);   /* in^((q-3)/2) */
            //fe_mul(legendre, legendre, a);   /* in^((q-1)/2) */

            //fe_0(zero);
            //fe_1(one);
            //assert(fe_isequal(legendre, zero) || fe_isequal(legendre, one));
            //#endif

            Fe_mul.fe_mul(b, a, exp);           /* b = a * a^(q-5)/8 */
            Fe_sq.fe_sq(b2, b);                 /* b^2 = a * a^(q-1)/4 */

            /* note b^4 == a^2, so b^2 == a or -a
             * if b^2 != a, multiply it by sqrt(-1) */
            Fe_mul.fe_mul(bi, b, i);
            Fe_cmov.fe_cmov(b, bi, 1 ^ Fe_isequal.fe_isequal(b2, a));
            Fe_copy.fe_copy(iOut, b);

            /* PRECONDITION: out^2 == a */
            //#ifndef NDEBUG
            //fe_sq(b2, out);
            //assert(fe_isequal(a, b2));
            //#endif
        }