Beispiel #1
0
 public BIG(DBIG x)
 {
     for (int i = 0; i < NLEN; i++)
     {
         w[i] = x.w[i];
     }
 }
Beispiel #2
0
        /* Create random BIG in portable way, one bit at a time */
        public static BIG RandomNum(BIG q, RAND rng)
        {
            DBIG d = new DBIG(0);
            int  i, b, j = 0, r = 0;

            for (i = 0; i < 2 * q.NBits(); i++)
            {
                if (j == 0)
                {
                    r = rng.Byte;
                }
                else
                {
                    r >>= 1;
                }

                b = r & 1;
                d.Shl(1);
                d.w[0] += b; // m.inc(b);
                j++;
                j &= 7;
            }

            BIG m = d.Mod(q);

            return(m);
        }
Beispiel #3
0
        /* return a^2 as DBIG */
        /* Input must be normed */
        public static DBIG Sqr(BIG a)
        {
            DBIG c = new DBIG(0);
            long carry;

            long[] cr = new long[2];

            for (int i = 0; i < NLEN; i++)
            {
                carry = 0;
                for (int j = i + 1; j < NLEN; j++)
                {
                    cr         = MulAdd(2 * a.w[i], a.w[j], carry, c.w[i + j]);
                    carry      = cr[0];
                    c.w[i + j] = cr[1];
                }

                c.w[NLEN + i] = carry;
            }

            for (int i = 0; i < NLEN; i++)
            {
                cr              = MulAdd(a.w[i], a.w[i], 0, c.w[2 * i]);
                c.w[2 * i + 1] += cr[0];
                c.w[2 * i]      = cr[1];
            }

            c.Norm();
            return(c);
        }
Beispiel #4
0
 public virtual void Copy(DBIG x)
 {
     for (int i = 0; i < NLEN; i++)
     {
         w[i] = x.w[i];
     }
 }
Beispiel #5
0
        /* return a^2 mod m */
        public static BIG ModSqr(BIG a1, BIG m)
        {
            BIG a = new BIG(a1);

            a.Mod(m);
            DBIG d = Sqr(a);

            return(d.Mod(m));
        }
Beispiel #6
0
        /* return a*b mod m */
        public static BIG ModMul(BIG a1, BIG b1, BIG m)
        {
            BIG a = new BIG(a1);
            BIG b = new BIG(b1);

            a.Mod(m);
            b.Mod(m);
            DBIG d = Mul(a, b);

            return(d.Mod(m));
        }
Beispiel #7
0
        /* return this*c and catch overflow in DBIG */
        public virtual DBIG PXMul(int c)
        {
            DBIG m = new DBIG(0);

            long[] cr;
            long   carry = 0;

            for (int j = 0; j < NLEN; j++)
            {
                cr     = MulAdd(w[j], (long)c, carry, m.w[j]);
                carry  = cr[0];
                m.w[j] = cr[1];
            }

            m.w[NLEN] = carry;
            return(m);
        }
Beispiel #8
0
        internal static BIG Monty(BIG md, long MC, DBIG d)
        {
            BIG  b;
            long m, carry;

            long[] cr = new long[2];
            for (int i = 0; i < NLEN; i++)
            {
                if (MC == -1)
                {
                    m = -d.w[i] & BMASK;
                }
                else
                {
                    if (MC == 1)
                    {
                        m = d.w[i];
                    }
                    else
                    {
                        m = (MC * d.w[i]) & BMASK;
                    }
                }

                carry = 0;
                for (int j = 0; j < NLEN; j++)
                {
                    cr         = MulAdd(m, md.w[j], carry, d.w[i + j]);
                    carry      = cr[0];
                    d.w[i + j] = cr[1];
                }

                d.w[NLEN + i] += carry;
            }

            b = new BIG(0);
            for (int i = 0; i < NLEN; i++)
            {
                b.w[i] = d.w[NLEN + i];
            }

            b.Norm();
            return(b);
        }
Beispiel #9
0
        /* return a*b as DBIG */
        /* Inputs must be normed */
        public static DBIG Mul(BIG a, BIG b)
        {
            DBIG c = new DBIG(0);
            long carry;

            long[] cr = new long[2];

            for (int i = 0; i < NLEN; i++)
            {
                carry = 0;
                for (int j = 0; j < NLEN; j++)
                {
                    cr         = MulAdd(a.w[i], b.w[j], carry, c.w[i + j]);
                    carry      = cr[0];
                    c.w[i + j] = cr[1];
                }

                c.w[NLEN + i] = carry;
            }

            return(c);
        }