using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Asn1.X9; using Org.BouncyCastle.Security; using Org.BouncyCastle.Asn1.Sec; namespace Novacoin { public class CKeyPair { private BigInteger D; private ECPoint Q; private static X9ECParameters curve = SecNamedCurves.GetByName("secp256k1"); private static ECDomainParameters domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed()); /// /// Initialize new CKeyPair instance with random secret. /// public CKeyPair() { ECKeyGenerationParameters genParams = new ECKeyGenerationParameters(domain, new SecureRandom()); ECKeyPairGenerator generator = new ECKeyPairGenerator("ECDSA"); generator.Init(genParams); AsymmetricCipherKeyPair ecKeyPair = generator.GenerateKeyPair(); Q = ((ECPublicKeyParameters)ecKeyPair.Public).Q; D = ((ECPrivateKeyParameters)ecKeyPair.Private).D; } /// /// Init key pair using secret sequence of bytes /// /// Byte sequence public CKeyPair(IEnumerable secretBytes) { D = new BigInteger(secretBytes.ToArray()); Q = curve.G.Multiply(D); } /// /// Secret part of key pair /// public IEnumerable Secret { get { return D.ToByteArray(); } } /// /// Public part of key pair /// public IEnumerable Public { get { return Q.GetEncoded(); } } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.AppendFormat("CKeyPair(Secret={0}, Public={1})", Interop.ToHex(Secret), Interop.ToHex(Public)); return sb.ToString(); } } }