public void TestMultiply() { ECPoint p = ECCurve.Secp256k1.G; BigInteger k = BigInteger.Parse("100"); ECPoint.Multiply(p, k).Should().Be(new ECPoint(new ECFieldElement(BigInteger.Parse("107303582290733097924842193972465022053148211775194373671539518313500194639752"), ECCurve.Secp256k1), new ECFieldElement(BigInteger.Parse("103795966108782717446806684023742168462365449272639790795591544606836007446638"), ECCurve.Secp256k1), ECCurve.Secp256k1)); k = BigInteger.Parse("10000"); ECPoint.Multiply(p, k).Should().Be(new ECPoint(new ECFieldElement(BigInteger.Parse("55279067612272658004429375184716238028207484982037227804583126224321918234542"), ECCurve.Secp256k1), new ECFieldElement(BigInteger.Parse("93139664895507357192565643142424306097487832058389223752321585898830257071353"), ECCurve.Secp256k1), ECCurve.Secp256k1)); k = BigInteger.Parse("10000000000000"); ECPoint.Multiply(p, k).Should().Be(new ECPoint(new ECFieldElement(BigInteger.Parse("115045167963494515061513744671884131783397561769819471159495798754884242293003"), ECCurve.Secp256k1), new ECFieldElement(BigInteger.Parse("93759167105263077270762304290738437383691912799231615884447658154878797241853"), ECCurve.Secp256k1), ECCurve.Secp256k1)); k = BigInteger.Parse("1000000000000000000000000000000000000000"); ECPoint.Multiply(p, k).Should().Be(new ECPoint(new ECFieldElement(BigInteger.Parse("114831276968810911840931876895388845736099852671055832194631099067239418074350"), ECCurve.Secp256k1), new ECFieldElement(BigInteger.Parse("16721517996619732311261078486295444964227498319433363271180755596201863690708"), ECCurve.Secp256k1), ECCurve.Secp256k1)); k = new BigInteger(GeneratePrivateKey(100)); ECPoint.Multiply(p, k).Should().Be(new ECPoint(new ECFieldElement(BigInteger.Parse("19222995016448259376216431079553428738726180595337971417371897285865264889977"), ECCurve.Secp256k1), new ECFieldElement(BigInteger.Parse("6637081904924493791520919212064582313497884724460823966446023080706723904419"), ECCurve.Secp256k1), ECCurve.Secp256k1)); k = new BigInteger(GeneratePrivateKey(120)); ECPoint.Multiply(p, k).Should().Be(new ECPoint(new ECFieldElement(BigInteger.Parse("79652345192111851576650978679091010173409410384772942769927955775006682639778"), ECCurve.Secp256k1), new ECFieldElement(BigInteger.Parse("6460429961979335115790346961011058418773289452368186110818621539624566803831"), ECCurve.Secp256k1), ECCurve.Secp256k1)); k = new BigInteger(GeneratePrivateKey(300)); ECPoint.Multiply(p, k).Should().Be(new ECPoint(new ECFieldElement(BigInteger.Parse("105331914562708556186724786757483927866790351460145374033180496740107603569412"), ECCurve.Secp256k1), new ECFieldElement(BigInteger.Parse("60523670886755698512704385951571322569877668383890769288780681319304421873758"), ECCurve.Secp256k1), ECCurve.Secp256k1)); }
public BigInteger[] GenerateSignature(byte[] message) { if (privateKey == null) { throw new InvalidOperationException(); } BigInteger e = CalculateE(curve.N, message); BigInteger d = new BigInteger(privateKey.Reverse().Concat(new byte[1]).ToArray()); BigInteger r, s, isEven; using (RandomNumberGenerator rng = RandomNumberGenerator.Create()) { do { BigInteger k; do { do { k = rng.NextBigInteger(curve.N.GetBitLength()); }while (k.Sign == 0 || k.CompareTo(curve.N) >= 0); ECPoint p = ECPoint.Multiply(curve.G, k); isEven = p.Y.Value & 1; BigInteger x = p.X.Value; r = x.Mod(curve.N); }while (r.Sign == 0); s = (k.ModInverse(curve.N) * (e + d * r)).Mod(curve.N); if (s > curve.N / 2) { s = curve.N - s; isEven = isEven ^ 1; } }while (s.Sign == 0); } return(new BigInteger[] { r, s, isEven }); }