6f9ce353fff8d314d2a68999152843385e0d3eec
[NovacoinLibrary.git] / Novacoin / CKey.cs
1 \feffusing System.Collections.Generic;
2 using System.Linq;
3
4 using Org.BouncyCastle.Crypto;
5 using Org.BouncyCastle.Crypto.Parameters;
6
7 using Org.BouncyCastle.Asn1.X9;
8 using Org.BouncyCastle.Security;
9 using Org.BouncyCastle.Asn1.Sec;
10
11 using Org.BouncyCastle.Math.EC;
12
13
14 namespace Novacoin
15 {
16     /// <summary>
17     /// Basic pubkey functionality
18     /// </summary>
19     public abstract class CKey
20     {
21         // These fields are inherited by CPubKey and CKeyPair
22         protected ECPublicKeyParameters _Public;
23
24         protected static X9ECParameters curve = SecNamedCurves.GetByName("secp256k1");
25         protected static ECDomainParameters domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
26
27         /// <summary>
28         /// Regenerate public key parameters (ECPoint compression)
29         /// </summary>
30         /// <param name="pubKeyParams">Non-compressed key parameters</param>
31         /// <returns>Parameters for compressed key</returns>
32         protected ECPublicKeyParameters Compress(ECPublicKeyParameters pubKeyParams)
33         {
34             if (pubKeyParams.Q.IsCompressed)
35             {
36                 // Already compressed
37                 return pubKeyParams;
38             }
39
40             ECPoint q = new FpPoint(curve.Curve, pubKeyParams.Q.X, pubKeyParams.Q.Y, true);
41
42             return new ECPublicKeyParameters(q, domain);
43         }
44
45         /// <summary>
46         /// Regenerate public key parameters (ECPoint decompression)
47         /// </summary>
48         /// <param name="pubKeyParams">Compressed key parameters</param>
49         /// <returns>Parameters for non-compressed key</returns>
50         protected ECPublicKeyParameters Decompress(ECPublicKeyParameters pubKeyParams)
51         {
52             if (!pubKeyParams.Q.IsCompressed)
53             {
54                 // Isn't compressed
55                 return pubKeyParams;
56             }
57
58             ECPoint q = new FpPoint(curve.Curve, pubKeyParams.Q.X, pubKeyParams.Q.Y, false);
59
60             return new ECPublicKeyParameters(q, domain);
61         }
62
63         /// <summary>
64         /// Does the signature matches our public key?
65         /// </summary>
66         /// <param name="data">Data bytes</param>
67         /// <param name="signature">Signature bytes</param>
68         /// <returns>Checking result</returns>
69         public bool VerifySignature(IEnumerable<byte> data, IEnumerable<byte> signature)
70         {
71             byte[] dataBytes = data.ToArray();
72
73             ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
74             signer.Init(false, _Public);
75             signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
76
77             return signer.VerifySignature(signature.ToArray());
78         }
79
80         /// <summary>
81         /// Calculate Hash160 and create new CKeyID instance.
82         /// </summary>
83         /// <returns>New key ID</returns>
84         public CKeyID GetKeyID()
85         {
86             return new CKeyID(Hash160.Compute160(Public));
87         }
88
89         /// <summary>
90         /// Public part of key pair
91         /// </summary>
92         public IEnumerable<byte> Public
93         {
94             get { return _Public.Q.GetEncoded(); }
95         }
96     }
97 }