internal void ModP256() { var p = EllipticCurve.P256.p; var negP = EllipticCurve.P256.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] } }; var s1 = new BigInt { _bits = new uint[] { 0, 0, 0, a[11], a[12], a[13], a[14], a[15] } }; var s2 = new BigInt { _bits = new uint[] { 0, 0, 0, a[12], a[13], a[14], a[15], 0 } }; var s3 = new BigInt { _bits = new uint[] { a[8], a[9], a[10], 0, 0, 0, a[14], a[15] } }; var s4 = new BigInt { _bits = new uint[] { a[9], a[10], a[11], a[13], a[14], a[15], a[13], a[8] } }; var d1 = new BigInt { _bits = new uint[] { a[11], a[12], a[13], 0, 0, 0, a[8], a[10] } }; var d2 = new BigInt { _bits = new uint[] { a[12], a[13], a[14], a[15], 0, 0, a[9], a[11] } }; var d3 = new BigInt { _bits = new uint[] { a[13], a[14], a[15], a[8], a[9], a[10], 0, a[12] } }; var d4 = new BigInt { _bits = new uint[] { a[14], a[15], 0, a[9], a[10], a[11], 0, a[13] } }; var extraAddD1 = d1 >= p; BigInt.TwosComplement(d1._bits, d1._bits); BigInt.AddRaw(d1._bits, p._bits, d1._bits); if (extraAddD1) BigInt.AddRaw(d1._bits, p._bits, d1._bits); var extraAddD2 = d2 >= p; BigInt.TwosComplement(d2._bits, d2._bits); BigInt.AddRaw(d2._bits, p._bits, d2._bits); if (extraAddD2) BigInt.AddRaw(d2._bits, p._bits, d2._bits); BigInt.TwosComplement(d3._bits, d3._bits); BigInt.AddRaw(d3._bits, p._bits, d3._bits); BigInt.TwosComplement(d4._bits, d4._bits); BigInt.AddRaw(d4._bits, p._bits, d4._bits); var res = BigInt.Create(8); var toAdd = new BigInt[] { t, s1, s1, s2, s2, s3, s4, d1, d2, d3, d4 }; 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); } } foreach (var num in toAdd) { num.Clear(); } Clear(); _bits = res._bits; }
internal void ModP521() { var a = _bits; var t = BigInt.Create(17); var s = BigInt.Create(17); for (var i = 0; i < 16; i++) { t[i] = a[i]; } t[16] = a[16] & 0x1ff; for (var i = 0; i < 16; i++) { s[i] = (a[16 + i] >> 9) | (a[17 + i] << 23); } s[16] = a[32] >> 9; var res = t.AddMod(s, EllipticCurve.P521.p, EllipticCurve.P521.negP); t.Clear(); s.Clear(); Clear(); _bits = res._bits; }