* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Linq;
using System;
+using System.Diagnostics.Contracts;
namespace Novacoin
{
+
public class CKeyPair : CKey
{
private ECPrivateKeyParameters _Private;
- private RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
/// <summary>
/// Initialize new CKeyPair instance with random secret.
/// </summary>
public CKeyPair(bool Compressed = true)
{
-
-
var genParams = new ECKeyGenerationParameters(domain, new SecureRandom());
var generator = new ECKeyPairGenerator("ECDSA");
generator.Init(genParams);
_Private = (ECPrivateKeyParameters)ecKeyPair.Private;
_Public = (ECPublicKeyParameters)ecKeyPair.Public;
- /*
- BigInteger D;
- var buffer1 = new byte[32];
- var buffer2 = new byte[32];
-
- do
- {
- rng.GetBytes(buffer1);
- rng.GetNonZeroBytes(buffer2);
-
- D = new BigInteger(Hash256.ComputeRaw256(ref buffer1, ref buffer2));
-
- if (D.BitLength < 249)
- System.Console.WriteLine(D.BitLength);
- }
- while (D.SignValue == -1);
-
- var Q = curve.G.Multiply(D);
-
- _Private = new ECPrivateKeyParameters(D, domain);
- _Public = new ECPublicKeyParameters(Q, domain);
- */
-
if (Compressed)
{
_Public = Compress(_Public);
/// <param name="Compressed">Compression flag</param>
public CKeyPair(byte[] secretBytes, bool Compressed=true)
{
- if (secretBytes.Length != 32)
- {
- throw new ArgumentException("Serialized secret key must be 32 bytes long.");
- }
+ Contract.Requires<ArgumentException>(secretBytes.Length == 32, "Serialized secret key must be 32 bytes long.");
// Deserialize secret value
var D = new BigInteger(secretBytes);
{
var rawSecretBytes = AddressTools.Base58DecodeCheck(strBase58);
- if (rawSecretBytes.Length > 34 || rawSecretBytes.Length < 33)
+ if (rawSecretBytes.Length != 33 && rawSecretBytes.Length != 34)
{
throw new ArgumentException("Though you have provided a correct Base58 representation of some data, this data doesn't represent a valid private key.");
}
/// </summary>
/// <param name="data">Hash to sigh</param>
/// <returns>Signature bytes sequence</returns>
- public byte[] Sign(Hash sigHash)
+ public byte[] Sign(uint256 sigHash)
{
var signer = SignerUtilities.GetSigner("NONEwithECDSA");
signer.Init(true, _Private);
- signer.BlockUpdate(sigHash.hashBytes, 0, sigHash.hashSize);
+ signer.BlockUpdate(sigHash, 0, sigHash.Size);
return signer.GenerateSignature();
}
public CPubKey PubKey
{
- get { return new CPubKey(PublicBytes); }
+ get { return new CPubKey(_Public.Q.GetEncoded()); }
}
/// <summary>
/// SecretBytes part of key pair
/// </summary>
- public byte[] SecretBytes
+ public static implicit operator byte[] (CKeyPair kp)
{
- get
- {
- var secretBytes = new List<byte>(_Private.D.ToByteArray());
-
- if (secretBytes.Count == 33 && secretBytes[0] == 0x00)
- {
- // Remove sign
- secretBytes.RemoveAt(0);
- }
+ var secretBytes = new List<byte>(kp._Private.D.ToByteArray());
- if (IsCompressed)
- {
- // Set compression flag
- secretBytes.Add(0x01);
- }
+ if (secretBytes.Count == 33 && secretBytes[0] == 0x00)
+ {
+ // Remove sign
+ secretBytes.RemoveAt(0);
+ }
- return secretBytes.ToArray();
+ if (kp.IsCompressed)
+ {
+ // Set compression flag
+ secretBytes.Add(0x01);
}
+
+ return secretBytes.ToArray();
}
public string ToHex()
{
- return Interop.ToHex(SecretBytes);
+ return Interop.ToHex((byte[])this);
}
/// <summary>
var r = new List<byte>();
r.Add((byte)(128 + AddrType.PUBKEY_ADDRESS)); // Key version
- r.AddRange(SecretBytes); // Key data
+ r.AddRange((byte[])this); // Key data
return AddressTools.Base58EncodeCheck(r.ToArray());
}