Remove unnecessary usings, rewrite pubkey serialization code
[NovacoinLibrary.git] / Novacoin / CKeyPair.cs
index 0abbb25..f5b778f 100644 (file)
@@ -1,8 +1,6 @@
-\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;
@@ -10,20 +8,14 @@ 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.
@@ -31,13 +23,12 @@ namespace Novacoin
         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>
@@ -46,8 +37,14 @@ namespace Novacoin
         /// <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>
@@ -60,37 +57,15 @@ namespace Novacoin
             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>
@@ -98,15 +73,7 @@ namespace Novacoin
         /// </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()