Skip to content

Commit 86a4479

Browse files
committed
'safegcd' modular inversion
1 parent c11e0f9 commit 86a4479

31 files changed

+770
-846
lines changed

crypto/src/bcpg/RsaSecretBcpgKey.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22

33
using Org.BouncyCastle.Math;
4+
using Org.BouncyCastle.Utilities;
45

56
namespace Org.BouncyCastle.Bcpg
67
{
@@ -21,7 +22,7 @@ public RsaSecretBcpgKey(
2122

2223
this.expP = d.Value.Remainder(p.Value.Subtract(BigInteger.One));
2324
this.expQ = d.Value.Remainder(q.Value.Subtract(BigInteger.One));
24-
this.crt = q.Value.ModInverse(p.Value);
25+
this.crt = BigIntegers.ModOddInverse(p.Value, q.Value);
2526
}
2627

2728
public RsaSecretBcpgKey(
@@ -44,11 +45,11 @@ public RsaSecretBcpgKey(
4445
this.d = new MPInteger(d);
4546
this.p = new MPInteger(p);
4647
this.q = new MPInteger(q);
47-
this.u = new MPInteger(p.ModInverse(q));
48+
this.u = new MPInteger(BigIntegers.ModOddInverse(q, p));
4849

4950
this.expP = d.Remainder(p.Subtract(BigInteger.One));
5051
this.expQ = d.Remainder(q.Subtract(BigInteger.One));
51-
this.crt = q.ModInverse(p);
52+
this.crt = BigIntegers.ModOddInverse(p, q);
5253
}
5354

5455
public BigInteger Modulus

crypto/src/crypto/engines/RSABlindedEngine.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public virtual byte[] ProcessBlock(
132132
BigInteger blindedInput = r.ModPow(e, m).Multiply(input).Mod(m);
133133
BigInteger blindedResult = core.ProcessBlock(blindedInput);
134134

135-
BigInteger rInv = r.ModInverse(m);
135+
BigInteger rInv = BigIntegers.ModOddInverse(m, r);
136136
result = blindedResult.Multiply(rInv).Mod(m);
137137

138138
// defence against Arjen Lenstra’s CRT attack

crypto/src/crypto/engines/RSABlindingEngine.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
using Org.BouncyCastle.Crypto.Parameters;
44
using Org.BouncyCastle.Math;
5+
using Org.BouncyCastle.Utilities;
56

67
namespace Org.BouncyCastle.Crypto.Engines
78
{
@@ -139,7 +140,7 @@ private BigInteger UnblindMessage(
139140
{
140141
BigInteger m = key.Modulus;
141142
BigInteger msg = blindedMsg;
142-
BigInteger blindFactorInverse = blindingFactor.ModInverse(m);
143+
BigInteger blindFactorInverse = BigIntegers.ModOddInverse(m, blindingFactor);
143144
msg = msg.Multiply(blindFactorInverse);
144145
msg = msg.Mod(m);
145146

crypto/src/crypto/generators/RsaKeyPairGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public virtual AsymmetricCipherKeyPair GenerateKeyPair()
127127
//
128128
BigInteger dP = d.Remainder(pSub1);
129129
BigInteger dQ = d.Remainder(qSub1);
130-
BigInteger qInv = q.ModInverse(p);
130+
BigInteger qInv = BigIntegers.ModOddInverse(p, q);
131131

132132
return new AsymmetricCipherKeyPair(
133133
new RsaKeyParameters(false, n, e),

crypto/src/crypto/parameters/ECDomainParameters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public BigInteger HInv
8989
{
9090
if (hInv == null)
9191
{
92-
hInv = h.ModInverse(n);
92+
hInv = BigIntegers.ModOddInverseVar(n, h);
9393
}
9494
return hInv;
9595
}

crypto/src/crypto/signers/DsaSigner.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
using System;
22

3-
using Org.BouncyCastle.Crypto.Digests;
43
using Org.BouncyCastle.Crypto.Parameters;
54
using Org.BouncyCastle.Math;
65
using Org.BouncyCastle.Security;
6+
using Org.BouncyCastle.Utilities;
77

88
namespace Org.BouncyCastle.Crypto.Signers
99
{
@@ -104,7 +104,7 @@ public virtual BigInteger[] GenerateSignature(byte[] message)
104104

105105
BigInteger r = parameters.G.ModPow(k, parameters.P).Mod(q);
106106

107-
k = k.ModInverse(q).Multiply(m.Add(x.Multiply(r)));
107+
k = BigIntegers.ModOddInverse(q, k).Multiply(m.Add(x.Multiply(r)));
108108

109109
BigInteger s = k.Mod(q);
110110

@@ -132,7 +132,7 @@ public virtual bool VerifySignature(byte[] message, BigInteger r, BigInteger s)
132132
return false;
133133
}
134134

135-
BigInteger w = s.ModInverse(q);
135+
BigInteger w = BigIntegers.ModOddInverseVar(q, s);
136136

137137
BigInteger u1 = m.Multiply(w).Mod(q);
138138
BigInteger u2 = r.Multiply(w).Mod(q);

crypto/src/crypto/signers/ECDsaSigner.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Org.BouncyCastle.Math.EC;
77
using Org.BouncyCastle.Math.EC.Multiplier;
88
using Org.BouncyCastle.Security;
9+
using Org.BouncyCastle.Utilities;
910

1011
namespace Org.BouncyCastle.Crypto.Signers
1112
{
@@ -123,7 +124,7 @@ public virtual BigInteger[] GenerateSignature(byte[] message)
123124
}
124125
while (r.SignValue == 0);
125126

126-
s = k.ModInverse(n).Multiply(e.Add(d.Multiply(r))).Mod(n);
127+
s = BigIntegers.ModOddInverse(n, k).Multiply(e.Add(d.Multiply(r))).Mod(n);
127128
}
128129
while (s.SignValue == 0);
129130

@@ -148,7 +149,7 @@ public virtual bool VerifySignature(byte[] message, BigInteger r, BigInteger s)
148149
}
149150

150151
BigInteger e = CalculateE(n, message);
151-
BigInteger c = s.ModInverse(n);
152+
BigInteger c = BigIntegers.ModOddInverseVar(n, s);
152153

153154
BigInteger u1 = e.Multiply(c).Mod(n);
154155
BigInteger u2 = r.Multiply(c).Mod(n);

crypto/src/crypto/signers/ECGOST3410Signer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public virtual bool VerifySignature(
145145
return false;
146146
}
147147

148-
BigInteger v = e.ModInverse(n);
148+
BigInteger v = BigIntegers.ModOddInverseVar(n, e);
149149

150150
BigInteger z1 = s.Multiply(v).Mod(n);
151151
BigInteger z2 = (n.Subtract(r)).Multiply(v).Mod(n);

crypto/src/crypto/signers/SM2Signer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Org.BouncyCastle.Math.EC;
77
using Org.BouncyCastle.Math.EC.Multiplier;
88
using Org.BouncyCastle.Security;
9+
using Org.BouncyCastle.Utilities;
910
using Org.BouncyCastle.Utilities.Encoders;
1011

1112
namespace Org.BouncyCastle.Crypto.Signers
@@ -164,7 +165,7 @@ public virtual byte[] GenerateSignature()
164165
while (r.SignValue == 0 || r.Add(k).Equals(n));
165166

166167
// A6
167-
BigInteger dPlus1ModN = d.Add(BigInteger.One).ModInverse(n);
168+
BigInteger dPlus1ModN = BigIntegers.ModOddInverse(n, d.Add(BigIntegers.One));
168169

169170
s = k.Subtract(r.Multiply(d)).Mod(n);
170171
s = dPlus1ModN.Multiply(s).Mod(n);

crypto/src/math/ec/ECFieldElement.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Diagnostics;
33

4-
using Org.BouncyCastle.Math.Raw;
54
using Org.BouncyCastle.Utilities;
65

76
namespace Org.BouncyCastle.Math.EC
@@ -434,13 +433,7 @@ protected virtual BigInteger ModHalfAbs(BigInteger x)
434433

435434
protected virtual BigInteger ModInverse(BigInteger x)
436435
{
437-
int bits = FieldSize;
438-
int len = (bits + 31) >> 5;
439-
uint[] p = Nat.FromBigInteger(bits, q);
440-
uint[] n = Nat.FromBigInteger(bits, x);
441-
uint[] z = Nat.Create(len);
442-
Mod.Invert(p, n, z);
443-
return Nat.ToBigInteger(len, z);
436+
return BigIntegers.ModOddInverse(q, x);
444437
}
445438

446439
protected virtual BigInteger ModMult(BigInteger x1, BigInteger x2)

0 commit comments

Comments
 (0)