using System;
using 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
{
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());
///
/// 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;
}
///
/// Init key pair using secret sequence of bytes
///
/// Byte sequence
public CKeyPair(IEnumerable secretBytes)
{
D = new BigInteger(secretBytes.ToArray());
Q = curve.G.Multiply(D);
}
///
/// Secret part of key pair
///
public IEnumerable Secret
{
get { return D.ToByteArray(); }
}
///
/// Public part of key pair
///
public IEnumerable Public
{
get { return Q.GetEncoded(); }
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("CKeyPair(Secret={0}, Public={1})", Interop.ToHex(Secret), Interop.ToHex(Public));
return sb.ToString();
}
}
}