Example #1
0
        public static void AddOne(uint[] x, uint[] z)
        {
            Nat.Copy(12, x, z);
            uint c = Nat.Inc(12, z, 0);

            if (c != 0 || (z[11] == P11 && Nat.Gte(12, z, P)))
            {
                Nat.Sub(12, z, P, z);
            }
        }
Example #2
0
        public static void AddOne(uint[] x, uint[] z)
        {
            Nat.Copy(16, x, z);
            uint c = Nat.Inc(16, z, 0) + x[16];

            if (c > P16 || (c == P16 && Nat.Eq(16, z, P)))
            {
                c += Nat.Inc(16, z, 0);
                c &= P16;
            }
            z[16] = c;
        }
Example #3
0
        public override ECLookupTable CreateCacheSafeLookupTable(ECPoint[] points, int off, int len)
        {
            uint[] table = new uint[len * SECP521R1_FE_INTS * 2];
            {
                int pos = 0;
                for (int i = 0; i < len; ++i)
                {
                    ECPoint p = points[off + i];
                    Nat.Copy(SECP521R1_FE_INTS, ((SecP521R1FieldElement)p.RawXCoord).x, 0, table, pos); pos += SECP521R1_FE_INTS;
                    Nat.Copy(SECP521R1_FE_INTS, ((SecP521R1FieldElement)p.RawYCoord).x, 0, table, pos); pos += SECP521R1_FE_INTS;
                }
            }

            return(new SecP521R1LookupTable(this, table, len));
        }
Example #4
0
    public static void Invert(uint[] p, uint[] x, uint[] z)
    {
        int num = p.Length;

        if (Nat.IsZero(num, x))
        {
            throw new ArgumentException("cannot be 0", "x");
        }
        if (Nat.IsOne(num, x))
        {
            Array.Copy(x, 0, z, 0, num);
            return;
        }
        uint[] array  = Nat.Copy(num, x);
        uint[] array2 = Nat.Create(num);
        array2[0] = 1u;
        int xc = 0;

        if ((array[0] & 1) == 0)
        {
            InversionStep(p, array, num, array2, ref xc);
        }
        if (Nat.IsOne(num, array))
        {
            InversionResult(p, xc, array2, z);
            return;
        }
        uint[] array3 = Nat.Copy(num, p);
        uint[] array4 = Nat.Create(num);
        int    xc2    = 0;
        int    num2   = num;

        while (true)
        {
            if (array[num2 - 1] == 0 && array3[num2 - 1] == 0)
            {
                num2--;
            }
            else if (Nat.Gte(num, array, array3))
            {
                Nat.SubFrom(num, array3, array);
                xc += Nat.SubFrom(num, array4, array2) - xc2;
                InversionStep(p, array, num2, array2, ref xc);
                if (Nat.IsOne(num, array))
                {
                    InversionResult(p, xc, array2, z);
                    return;
                }
            }
            else
            {
                Nat.SubFrom(num, array, array3);
                xc2 += Nat.SubFrom(num, array2, array4) - xc;
                InversionStep(p, array3, num2, array4, ref xc2);
                if (Nat.IsOne(num, array3))
                {
                    break;
                }
            }
        }
        InversionResult(p, xc2, array4, z);
    }