using System.Collections.Generic; using System.Linq; using System.Text; 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.Security; namespace Novacoin { public class CKeyPair : CKey { private ECPrivateKeyParameters _Private; /// /// 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(); _Public = (ECPublicKeyParameters)ecKeyPair.Public; _Private = (ECPrivateKeyParameters)ecKeyPair.Private; } /// /// Init key pair using secret sequence of bytes /// /// Byte sequence public CKeyPair(IEnumerable secretBytes) { // Deserialize secret value BigInteger D = new BigInteger(secretBytes.ToArray()); // Calculate public key ECPoint Q = curve.G.Multiply(D); _Public = new ECPublicKeyParameters(Q, domain); _Private = new ECPrivateKeyParameters(D, domain); } /// /// Create signature for supplied data /// /// Data bytes sequence /// Signature bytes sequence public IEnumerable Sign(IEnumerable data) { byte[] dataBytes = data.ToArray(); ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA"); signer.Init(true, _Private); signer.BlockUpdate(dataBytes, 0, dataBytes.Length); return signer.GenerateSignature(); } public CPubKey GetPubKey() { return new CPubKey(Public); } /// /// Secret part of key pair /// public IEnumerable Secret { get { return _Private.D.ToByteArray(); } } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.AppendFormat("CKeyPair(Secret={0}, Public={1})", Interop.ToHex(Secret), Interop.ToHex(Public)); return sb.ToString(); } } }