1 \feffusing System.Collections.Generic;
4 using Org.BouncyCastle.Crypto;
5 using Org.BouncyCastle.Crypto.Parameters;
7 using Org.BouncyCastle.Asn1.X9;
8 using Org.BouncyCastle.Security;
9 using Org.BouncyCastle.Asn1.Sec;
11 using Org.BouncyCastle.Math.EC;
17 /// Basic pubkey functionality
19 public abstract class CKey
21 // These fields are inherited by CPubKey and CKeyPair
22 protected ECPublicKeyParameters _Public;
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());
28 /// Regenerate public key parameters (ECPoint compression)
30 /// <param name="pubKeyParams">Non-compressed key parameters</param>
31 /// <returns>Parameters for compressed key</returns>
32 protected ECPublicKeyParameters Compress(ECPublicKeyParameters pubKeyParams)
34 if (pubKeyParams.Q.IsCompressed)
40 ECPoint q = new FpPoint(curve.Curve, pubKeyParams.Q.X, pubKeyParams.Q.Y, true);
42 return new ECPublicKeyParameters(q, domain);
46 /// Regenerate public key parameters (ECPoint decompression)
48 /// <param name="pubKeyParams">Compressed key parameters</param>
49 /// <returns>Parameters for non-compressed key</returns>
50 protected ECPublicKeyParameters Decompress(ECPublicKeyParameters pubKeyParams)
52 if (!pubKeyParams.Q.IsCompressed)
58 ECPoint q = new FpPoint(curve.Curve, pubKeyParams.Q.X, pubKeyParams.Q.Y, false);
60 return new ECPublicKeyParameters(q, domain);
64 /// Does the signature matches our public key?
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)
71 byte[] dataBytes = data.ToArray();
73 ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
74 signer.Init(false, _Public);
75 signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
77 return signer.VerifySignature(signature.ToArray());
81 /// Calculate Hash160 and create new CKeyID instance.
83 /// <returns>New key ID</returns>
86 get { return new CKeyID(Hash160.Compute160(PublicBytes)); }
90 /// PublicBytes part of key pair
92 public IEnumerable<byte> PublicBytes
94 get { return _Public.Q.GetEncoded(); }
98 /// Is this a compressed public key?
100 /// <returns></returns>
101 public bool IsCompressed
103 get { return _Public.Q.IsCompressed; }