--- /dev/null
+\feffusing System.Collections.Generic;
+using System.Linq;
+
+using Org.BouncyCastle.Crypto;
+using Org.BouncyCastle.Crypto.Parameters;
+
+using Org.BouncyCastle.Asn1.X9;
+using Org.BouncyCastle.Security;
+using Org.BouncyCastle.Asn1.Sec;
+
+namespace Novacoin
+{
+ /// <summary>
+ /// Basic pubkey functionality
+ /// </summary>
+ public abstract class CKey
+ {
+ // These fields are inherited by CPubKey and CKeyPair
+ protected ECPublicKeyParameters _Public;
+
+ protected static X9ECParameters curve = SecNamedCurves.GetByName("secp256k1");
+ protected static ECDomainParameters domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
+
+ /// <summary>
+ /// Does the signature matches our public key?
+ /// </summary>
+ /// <param name="data">Data bytes</param>
+ /// <param name="signature">Signature bytes</param>
+ /// <returns>Checking result</returns>
+ public bool VerifySignature(IEnumerable<byte> data, IEnumerable<byte> signature)
+ {
+ byte[] dataBytes = data.ToArray();
+
+ ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
+ signer.Init(false, _Public);
+ signer.BlockUpdate(dataBytes, 0, dataBytes.Length);
+
+ return signer.VerifySignature(signature.ToArray());
+ }
+
+ /// <summary>
+ /// Calculate Hash160 and create new CKeyID instance.
+ /// </summary>
+ /// <returns>New key ID</returns>
+ public CKeyID GetKeyID()
+ {
+ return new CKeyID(Hash160.Compute160(Public));
+ }
+
+ /// <summary>
+ /// Public part of key pair
+ /// </summary>
+ public IEnumerable<byte> Public
+ {
+ get { return _Public.Q.GetEncoded(); }
+ }
+ }
+}
-\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()
-\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
{
/// <summary>
/// Representation of ECDSA public key
/// </summary>
- public class CPubKey
+ public class CPubKey : CKey
{
- 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());
-
/// <summary>
/// Initializes a new instance of CPubKey class as the copy of another instance
/// </summary>
/// <param name="pubKey">Another CPubKey instance</param>
public CPubKey(CPubKey pubKey)
{
- Q = pubKey.Q;
+ _Public = pubKey._Public;
}
/// <summary>
/// <param name="bytes">Byte sequence</param>
public CPubKey(IEnumerable<byte> bytes)
{
- Q = ((ECPublicKeyParameters)PublicKeyFactory.CreateKey(bytes.ToArray())).Q;
- }
-
- public CPubKey(ECPoint pQ)
- {
- Q = pQ;
+ ECPoint pQ = curve.Curve.DecodePoint(bytes.ToArray());
+ _Public = new ECPublicKeyParameters(pQ, domain);
}
/// <summary>
/// <returns>Validation result</returns>
public bool IsValid
{
- get { return !Q.IsInfinity; }
+ get { return !_Public.Q.IsInfinity; }
}
/// <summary>
/// <returns></returns>
public bool IsCompressed
{
- get { return Q.IsCompressed; }
- }
-
- /// <summary>
- /// Calculate Hash160 and create new CKeyID instance.
- /// </summary>
- /// <returns>New key ID</returns>
- public CKeyID GetKeyID()
- {
- return new CKeyID(Hash160.Compute160(Raw));
- }
-
- 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());
- }
-
- /// <summary>
- /// Accessor for internal representation
- /// </summary>
- public IEnumerable<byte> Raw
- {
- get { return Q.GetEncoded(); }
+ get { return _Public.Q.IsCompressed; }
}
public override string ToString()
{
- return Interop.ToHex(Raw);
+ return Interop.ToHex(Public);
}
}
}
\feffusing System;
using System.Linq;
using System.Text;
-
-using System.Collections;
using System.Collections.Generic;
namespace Novacoin
foreach (CPubKey key in keys)
{
- PushData(key.Raw.ToList());
+ PushData(key.Public.ToList());
}
AddOp(ScriptOpcode.EncodeOP_N(keys.Count()));
AddOp(opcodetype.OP_CHECKMULTISIG);
using System.Collections.Generic;
using System.Linq;
using System.Text;
-using System.Threading.Tasks;
namespace Novacoin
{
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="CKey.cs" />
<Compile Include="CKeyID.cs" />
<Compile Include="CKeyPair.cs" />
<Compile Include="CPubKey.cs" />
using System.Collections.Generic;
using System.Linq;
using System.Text;
-using System.Threading.Tasks;
namespace Novacoin
{
\feffusing System;
-using System.Collections.Generic;
using System.Linq;
using System.Text;
-using System.Threading.Tasks;
namespace NovacoinTest
byte[] signature = keyPair1.Sign(dataBytes).ToArray();
Console.WriteLine("Signature: {0}", Interop.ToHex(signature));
- Console.WriteLine("Signature is OK: {0} (CKeyPair)", keyPair1.Verify(dataBytes, signature));
- Console.WriteLine("Signature is OK: {0} (CPubKey)", pubKey.Verify(dataBytes, signature));
+ Console.WriteLine("Signature is OK: {0} (CKeyPair)", keyPair1.VerifySignature(dataBytes, signature));
+ Console.WriteLine("Signature is OK: {0} (CPubKey)", pubKey.VerifySignature(dataBytes, signature));
Console.ReadLine();
}