1 \feffusing System.Collections.Generic;
5 using Org.BouncyCastle.Math;
6 using Org.BouncyCastle.Math.EC;
8 using Org.BouncyCastle.Crypto;
9 using Org.BouncyCastle.Crypto.Generators;
10 using Org.BouncyCastle.Crypto.Parameters;
11 using Org.BouncyCastle.Security;
16 public class CKeyPair : CKey
18 private ECPrivateKeyParameters _Private;
21 /// Initialize new CKeyPair instance with random secret.
25 ECKeyGenerationParameters genParams = new ECKeyGenerationParameters(domain, new SecureRandom());
26 ECKeyPairGenerator generator = new ECKeyPairGenerator("ECDSA");
27 generator.Init(genParams);
28 AsymmetricCipherKeyPair ecKeyPair = generator.GenerateKeyPair();
30 _Public = (ECPublicKeyParameters)ecKeyPair.Public;
31 _Private = (ECPrivateKeyParameters)ecKeyPair.Private;
35 /// Init key pair using secret sequence of bytes
37 /// <param name="secretBytes">Byte sequence</param>
38 public CKeyPair(IEnumerable<byte> secretBytes)
40 // Deserialize secret value
41 BigInteger D = new BigInteger(secretBytes.ToArray());
43 // Calculate public key
44 ECPoint Q = curve.G.Multiply(D);
46 _Public = new ECPublicKeyParameters(Q, domain);
47 _Private = new ECPrivateKeyParameters(D, domain);
51 /// Create signature for supplied data
53 /// <param name="data">Data bytes sequence</param>
54 /// <returns>Signature bytes sequence</returns>
55 public IEnumerable<byte> Sign(IEnumerable<byte> data)
57 byte[] dataBytes = data.ToArray();
59 ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
60 signer.Init(true, _Private);
61 signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
63 return signer.GenerateSignature();
66 public CPubKey GetPubKey()
68 return new CPubKey(Public);
72 /// Secret part of key pair
74 public IEnumerable<byte> Secret
76 get { return _Private.D.ToByteArray(); }
79 public override string ToString()
81 StringBuilder sb = new StringBuilder();
83 sb.AppendFormat("CKeyPair(Secret={0}, Public={1})", Interop.ToHex(Secret), Interop.ToHex(Public));