Remove unnecessary usings, rewrite pubkey serialization code
[NovacoinLibrary.git] / Novacoin / CKeyPair.cs
1 \feffusing System.Collections.Generic;
2 using System.Linq;
3 using System.Text;
4
5 using Org.BouncyCastle.Math;
6 using Org.BouncyCastle.Math.EC;
7
8 using Org.BouncyCastle.Crypto;
9 using Org.BouncyCastle.Crypto.Generators;
10 using Org.BouncyCastle.Crypto.Parameters;
11 using Org.BouncyCastle.Security;
12
13
14 namespace Novacoin
15 {
16     public class CKeyPair : CKey
17     {
18         private ECPrivateKeyParameters _Private;
19
20         /// <summary>
21         /// Initialize new CKeyPair instance with random secret.
22         /// </summary>
23         public CKeyPair()
24         {
25             ECKeyGenerationParameters genParams = new ECKeyGenerationParameters(domain, new SecureRandom());
26             ECKeyPairGenerator generator = new ECKeyPairGenerator("ECDSA");
27             generator.Init(genParams);
28             AsymmetricCipherKeyPair ecKeyPair = generator.GenerateKeyPair();
29
30             _Public = (ECPublicKeyParameters)ecKeyPair.Public;
31             _Private = (ECPrivateKeyParameters)ecKeyPair.Private;
32         }
33
34         /// <summary>
35         /// Init key pair using secret sequence of bytes
36         /// </summary>
37         /// <param name="secretBytes">Byte sequence</param>
38         public CKeyPair(IEnumerable<byte> secretBytes)
39         {
40             // Deserialize secret value
41             BigInteger D = new BigInteger(secretBytes.ToArray());
42
43             // Calculate public key
44             ECPoint Q = curve.G.Multiply(D);
45
46             _Public = new ECPublicKeyParameters(Q, domain);
47             _Private = new ECPrivateKeyParameters(D, domain);
48         }
49
50         /// <summary>
51         /// Create signature for supplied data
52         /// </summary>
53         /// <param name="data">Data bytes sequence</param>
54         /// <returns>Signature bytes sequence</returns>
55         public IEnumerable<byte> Sign(IEnumerable<byte> data)
56         {
57             byte[] dataBytes = data.ToArray();
58
59             ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
60             signer.Init(true, _Private);
61             signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
62
63             return signer.GenerateSignature();
64         }
65
66         public CPubKey GetPubKey()
67         {
68             return new CPubKey(Public);
69         }
70
71         /// <summary>
72         /// Secret part of key pair
73         /// </summary>
74         public IEnumerable<byte> Secret
75         {
76             get { return _Private.D.ToByteArray(); }
77         }
78
79         public override string ToString()
80         {
81             StringBuilder sb = new StringBuilder();
82
83             sb.AppendFormat("CKeyPair(Secret={0}, Public={1})", Interop.ToHex(Secret), Interop.ToHex(Public));
84
85             return sb.ToString();
86         }
87     }
88 }