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="sigHash">Data hash</param>
67 /// <param name="signature">Signature bytes</param>
68 /// <returns>Checking result</returns>
69 public bool VerifySignature(Hash256 sigHash, IEnumerable<byte> signature)
71 ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
72 signer.Init(false, _Public);
73 signer.BlockUpdate(sigHash.hashBytes, 0, sigHash.hashSize);
75 return signer.VerifySignature(signature.ToArray());
79 /// Calculate Hash160 and create new CKeyID instance.
81 /// <returns>New key ID</returns>
84 get { return new CKeyID(Hash160.Compute160(PublicBytes)); }
88 /// PublicBytes part of key pair
90 public IEnumerable<byte> PublicBytes
92 get { return _Public.Q.GetEncoded(); }
96 /// Is this a compressed public key?
98 /// <returns></returns>
99 public bool IsCompressed
101 get { return _Public.Q.IsCompressed; }