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); } }
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; }
BigInt Replace(BigInt old, BigInt new_) { old.Clear(); return(new_); }
public void Clear() { x.Clear(); y.Clear(); }
internal void Clear() { x.Clear(); y.Clear(); }