Hi Fabrizio,

All those divisions should be modular divisions. To perform a modular division using BigInteger you use the ModInverse method:

x / y mod m => y.ModInverse(m).Multiply(x).Mod(m)

Regards,
Pete Dettman


On 3/01/2024 8:41 pm, Fabrizio Lieggi wrote:

Hi everyone,

I’m starting to learn the BouncyCastle C# lib use,  can anybody help me with this code:

publicstaticECDomainParameters BabyJubJubDomainParameters()

{

// EC parameters (Montgomery Form)

// values from https://eips.ethereum.org/EIPS/eip-2494

varp = newOrg.BouncyCastle.Math.BigInteger("21888242871839275222246405745257275088548364400416034343698204186575808495617");

varh = newOrg.BouncyCastle.Math.BigInteger("8");

varn = newOrg.BouncyCastle.Math.BigInteger("21888242871839275222246405745257275088614511777268538073601725287587578984328");

vara = newOrg.BouncyCastle.Math.BigInteger("168698");

varb = newOrg.BouncyCastle.Math.BigInteger("1");

varM_GX = newOrg.BouncyCastle.Math.BigInteger("7");

varM_GY = newOrg.BouncyCastle.Math.BigInteger("4258727773875940690362607550498304598101071202821725296872974770776423442226");

varorder = n.Multiply(h);

/*

https://upcommons.upc.edu/bitstream/handle/2117/361741/mathematics-09-03022.pdf?sequence=1

# Transform a Montgomery curve to a short Weierstrass .

a = (3 - A^2) / (3 * B^2)

b = (2 * A^3 - 9*A) / (27 * B^3)

x0,y0 = (x0 + A/3) / B , y0 / B

x1,y1 = (x1 + A/3) / B , y1 / B

*/

varnove = newOrg.BouncyCastle.Math.BigInteger("9");

varW_a = ((Org.BouncyCastle.Math.BigInteger.Three.Subtract(a.Pow(2))).Divide(Org.BouncyCastle.Math.BigInteger.Three.Multiply(b.Pow(2)))).Mod(p);

varW_b = (Org.BouncyCastle.Math.BigInteger.Two.Multiply(a.Pow(3)).Subtract(nove.Multiply(a))).Divide((newOrg.BouncyCastle.Math.BigInteger("27")).Multiply(b.Pow(3))); //.Mod(p);

varW_GX = (M_GX.Add(a.Divide(Org.BouncyCastle.Math.BigInteger.Three))).Divide(b); //.Mod(p);

varW_GY = M_GY.Divide(b); //.Mod(p);

Org.BouncyCastle.Math.EC.ECCurve curve = newFpCurve(p, W_a, W_b, n, h);

  Org.BouncyCastle.Math.EC.ECPoint generatorPoint = curve.CreatePoint(W_GX, W_GY);

returnnewECDomainParameters(curve, generatorPoint, n, h);

}

varecParameters = CryptoUtils.BabyJubJubDomainParameters();

The internal method ValidatePublicPoint of the class ECDomainParameters returns an exception:

*System.ArgumentException:*'Point not on curve (Parameter 'q')'

Thanks in advance,

Best regards

F

Reply via email to