2 using System.Collections.Generic;
5 using System.Threading.Tasks;
7 using Org.BouncyCastle.Math;
8 using Org.BouncyCastle.Math.EC;
10 using Org.BouncyCastle.Crypto;
11 using Org.BouncyCastle.Crypto.Generators;
12 using Org.BouncyCastle.Crypto.Parameters;
14 using Org.BouncyCastle.Asn1.X9;
15 using Org.BouncyCastle.Security;
16 using Org.BouncyCastle.Asn1.Sec;
25 private static X9ECParameters curve = SecNamedCurves.GetByName("secp256k1");
26 private static ECDomainParameters domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
29 /// Initialize new CKeyPair instance with random secret.
33 ECKeyGenerationParameters genParams = new ECKeyGenerationParameters(domain, new SecureRandom());
35 ECKeyPairGenerator generator = new ECKeyPairGenerator("ECDSA");
36 generator.Init(genParams);
37 AsymmetricCipherKeyPair ecKeyPair = generator.GenerateKeyPair();
39 Q = ((ECPublicKeyParameters)ecKeyPair.Public).Q;
40 D = ((ECPrivateKeyParameters)ecKeyPair.Private).D;
44 /// Init key pair using secret sequence of bytes
46 /// <param name="secretBytes">Byte sequence</param>
47 public CKeyPair(IEnumerable<byte> secretBytes)
49 D = new BigInteger(secretBytes.ToArray());
50 Q = curve.G.Multiply(D);
54 /// Create signature for supplied data
56 /// <param name="data">Data bytes sequence</param>
57 /// <returns>Signature bytes sequence</returns>
58 public IEnumerable<byte> Sign(IEnumerable<byte> data)
60 byte[] dataBytes = data.ToArray();
62 ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
63 ECPrivateKeyParameters keyParameters = new ECPrivateKeyParameters(D, domain);
64 signer.Init(true, keyParameters);
65 signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
67 return signer.GenerateSignature();
71 /// Secret part of key pair
73 public IEnumerable<byte> Secret
75 get { return D.ToByteArray(); }
79 /// Public part of key pair
81 public IEnumerable<byte> Public
83 get { return Q.GetEncoded(); }
86 public override string ToString()
88 StringBuilder sb = new StringBuilder();
90 sb.AppendFormat("CKeyPair(Secret={0}, Public={1})", Interop.ToHex(Secret), Interop.ToHex(Public));