Пример #1
0
            public BigInt ModInv(BigInt p, BigInt negP)
            {
                var u  = this.Clone();
                var v  = p.Clone();
                var x1 = new BigInt(1, p.Length);
                var x2 = new BigInt(0, p.Length);

                while (!u.IsOne() && !v.IsOne())
                {
                    while (u.IsEven())
                    {
                        u.Div2Trunc();
                        x1.Div2(p);
                    }
                    while (v.IsEven())
                    {
                        v.Div2Trunc();
                        x2.Div2(p);
                    }
                    if (u >= v)
                    {
                        var uTmp = u;
                        u = u.SubMod(v, p, negP);
                        uTmp.Clear();
                        var x1Tmp = x1;
                        x1 = x1.SubMod(x2, p, negP);
                        x1Tmp.Clear();
                    }
                    else
                    {
                        var vTmp = v;
                        v = v.SubMod(u, p, negP);
                        vTmp.Clear();
                        var x2Tmp = x2;
                        x2 = x2.SubMod(x1, p, negP);
                        x2Tmp.Clear();
                    }
                }
                v.Clear();
                if (u.IsOne())
                {
                    u.Clear();
                    x2.Clear();
                    return(x1);
                }
                else
                {
                    u.Clear();
                    x1.Clear();
                    return(x2);
                }
            }
Пример #2
0
            internal void ModP384()
            {
                var p = EllipticCurve.P384.p;
                var negP = EllipticCurve.P384.negP;

                var a = _bits;
                var t = new BigInt { _bits = new uint[] { a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11] } };
                var s1 = new BigInt { _bits = new uint[] { 0, 0, 0, 0, a[21], a[22], a[23], 0, 0, 0, 0, 0 } };
                var s2 = new BigInt { _bits = new uint[] { a[12], a[13], a[14], a[15], a[16], a[17], a[18], a[19], a[20], a[21], a[22], a[23] } };
                var s3 = new BigInt { _bits = new uint[] { a[21], a[22], a[23], a[12], a[13], a[14], a[15], a[16], a[17], a[18], a[19], a[20] } };
                var s4 = new BigInt { _bits = new uint[] { 0, a[23], 0, a[20], a[12], a[13], a[14], a[15], a[16], a[17], a[18], a[19] } };
                var s5 = new BigInt { _bits = new uint[] { 0, 0, 0, 0, a[20], a[21], a[22], a[23], 0, 0, 0, 0 } };
                var s6 = new BigInt { _bits = new uint[] { a[20], 0, 0, a[21], a[22], a[23], 0, 0, 0, 0, 0, 0 } };
                var d1 = new BigInt { _bits = new uint[] { a[23], a[12], a[13], a[14], a[15], a[16], a[17], a[18], a[19], a[20], a[21], a[22] } };
                var d2 = new BigInt { _bits = new uint[] { 0, a[20], a[21], a[22], a[23], 0, 0, 0, 0, 0, 0, 0 } };
                var d3 = new BigInt { _bits = new uint[] { 0, 0, 0, a[23], a[23], 0, 0, 0, 0, 0, 0, 0 } };

                BigInt.TwosComplement(d1._bits, d1._bits);
                BigInt.AddRaw(d1._bits, p._bits, d1._bits);

                BigInt.TwosComplement(d2._bits, d2._bits);
                BigInt.AddRaw(d2._bits, s2._bits, s2._bits);

                BigInt.TwosComplement(d3._bits, d3._bits);
                BigInt.AddRaw(d3._bits, s2._bits, s2._bits);

                var res = s1;
                BigInt.AddRaw(res._bits, res._bits, res._bits);
                BigInt.AddRaw(res._bits, s5._bits, res._bits);
                BigInt.AddRaw(res._bits, s6._bits, res._bits);

                var toAdd = new BigInt[] { t, s2, s3, s4, d1 };
                foreach (var num in toAdd)
                {
                    var carry = BigInt.AddRaw(num._bits, res._bits, res._bits) == 1;
                    if (carry || res >= p)
                    {
                        BigInt.AddRaw(res._bits, negP._bits, res._bits);
                    }
                }
                s5.Clear();
                s6.Clear();
                d2.Clear();
                d3.Clear();
                foreach (var num in toAdd)
                {
                    num.Clear();
                }
                Clear();
                _bits = res._bits;
            }
Пример #3
0
 BigInt Replace(BigInt old, BigInt new_)
 {
     old.Clear();
     return(new_);
 }
Пример #4
0
 public void Clear()
 {
     x.Clear();
     y.Clear();
 }
Пример #5
0
 internal void Clear()
 {
     x.Clear();
     y.Clear();
 }