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;
14 /// Basic pubkey functionality
16 public abstract class CKey
18 // These fields are inherited by CPubKey and CKeyPair
19 protected ECPublicKeyParameters _Public;
21 protected static X9ECParameters curve = SecNamedCurves.GetByName("secp256k1");
22 protected static ECDomainParameters domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
25 /// Does the signature matches our public key?
27 /// <param name="data">Data bytes</param>
28 /// <param name="signature">Signature bytes</param>
29 /// <returns>Checking result</returns>
30 public bool VerifySignature(IEnumerable<byte> data, IEnumerable<byte> signature)
32 byte[] dataBytes = data.ToArray();
34 ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
35 signer.Init(false, _Public);
36 signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
38 return signer.VerifySignature(signature.ToArray());
42 /// Calculate Hash160 and create new CKeyID instance.
44 /// <returns>New key ID</returns>
45 public CKeyID GetKeyID()
47 return new CKeyID(Hash160.Compute160(Public));
51 /// Public part of key pair
53 public IEnumerable<byte> Public
55 get { return _Public.Q.GetEncoded(); }