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.
23 public CKeyPair(bool Compressed=true)
25 ECKeyGenerationParameters genParams = new ECKeyGenerationParameters(domain, new SecureRandom());
26 ECKeyPairGenerator generator = new ECKeyPairGenerator("ECDSA");
27 generator.Init(genParams);
28 AsymmetricCipherKeyPair ecKeyPair = generator.GenerateKeyPair();
30 _Private = (ECPrivateKeyParameters)ecKeyPair.Private;
31 _Public = (ECPublicKeyParameters)ecKeyPair.Public;
35 _Public = Compress(_Public);
40 /// Init key pair using secret sequence of bytes
42 /// <param name="secretBytes">Byte sequence</param>
43 public CKeyPair(IEnumerable<byte> secretBytes, bool Compressed=true)
45 // Deserialize secret value
46 BigInteger D = new BigInteger(secretBytes.ToArray());
48 // Calculate public key
49 ECPoint Q = curve.G.Multiply(D);
51 _Private = new ECPrivateKeyParameters(D, domain);
52 _Public = new ECPublicKeyParameters(Q, domain);
56 _Public = Compress(_Public);
61 /// Create signature for supplied data
63 /// <param name="data">Data bytes sequence</param>
64 /// <returns>Signature bytes sequence</returns>
65 public IEnumerable<byte> Sign(IEnumerable<byte> data)
67 byte[] dataBytes = data.ToArray();
69 ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
70 signer.Init(true, _Private);
71 signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
73 return signer.GenerateSignature();
76 public CPubKey GetPubKey()
78 return new CPubKey(Public);
82 /// Secret part of key pair
84 public IEnumerable<byte> Secret
86 get { return _Private.D.ToByteArray(); }
89 public override string ToString()
91 StringBuilder sb = new StringBuilder();
93 sb.AppendFormat("CKeyPair(Secret={0}, Public={1})", Interop.ToHex(Secret), Interop.ToHex(Public));