-\feffusing System;
-using System.Collections.Generic;
+\feffusing System.Collections.Generic;
using System.Linq;
using System.Text;
-using System.Threading.Tasks;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
-
-using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Asn1.Sec;
+
namespace Novacoin
{
- public class CKeyPair
+ public class CKeyPair : CKey
{
- private BigInteger D;
- private ECPoint Q;
-
- private static X9ECParameters curve = SecNamedCurves.GetByName("secp256k1");
- private static ECDomainParameters domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
+ private ECPrivateKeyParameters _Private;
/// <summary>
/// Initialize new CKeyPair instance with random secret.
public CKeyPair()
{
ECKeyGenerationParameters genParams = new ECKeyGenerationParameters(domain, new SecureRandom());
-
ECKeyPairGenerator generator = new ECKeyPairGenerator("ECDSA");
generator.Init(genParams);
AsymmetricCipherKeyPair ecKeyPair = generator.GenerateKeyPair();
- Q = ((ECPublicKeyParameters)ecKeyPair.Public).Q;
- D = ((ECPrivateKeyParameters)ecKeyPair.Private).D;
+ _Public = (ECPublicKeyParameters)ecKeyPair.Public;
+ _Private = (ECPrivateKeyParameters)ecKeyPair.Private;
}
/// <summary>
/// <param name="secretBytes">Byte sequence</param>
public CKeyPair(IEnumerable<byte> secretBytes)
{
- D = new BigInteger(secretBytes.ToArray());
- Q = curve.G.Multiply(D);
+ // Deserialize secret value
+ BigInteger D = new BigInteger(secretBytes.ToArray());
+
+ // Calculate public key
+ ECPoint Q = curve.G.Multiply(D);
+
+ _Public = new ECPublicKeyParameters(Q, domain);
+ _Private = new ECPrivateKeyParameters(D, domain);
}
/// <summary>
byte[] dataBytes = data.ToArray();
ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
- ECPrivateKeyParameters keyParameters = new ECPrivateKeyParameters(D, domain);
- signer.Init(true, keyParameters);
+ signer.Init(true, _Private);
signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
return signer.GenerateSignature();
}
- public bool Verify(IEnumerable<byte> data, IEnumerable<byte> signature)
- {
- byte[] dataBytes = data.ToArray();
-
- ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
- ECPublicKeyParameters keyParameters = new ECPublicKeyParameters(Q, domain);
- signer.Init(false, keyParameters);
- signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
-
- return signer.VerifySignature(signature.ToArray());
- }
-
public CPubKey GetPubKey()
{
- return new CPubKey(Q);
- }
-
- /// <summary>
- /// Calculate Hash160 and create new CKeyID instance.
- /// </summary>
- /// <returns>New key ID</returns>
- public CKeyID GetKeyID()
- {
- return new CKeyID(Hash160.Compute160(Public));
+ return new CPubKey(Public);
}
/// <summary>
/// </summary>
public IEnumerable<byte> Secret
{
- get { return D.ToByteArray(); }
- }
-
- /// <summary>
- /// Public part of key pair
- /// </summary>
- public IEnumerable<byte> Public
- {
- get { return Q.GetEncoded(); }
+ get { return _Private.D.ToByteArray(); }
}
public override string ToString()