Remove unnecessary usings, rewrite pubkey serialization code
authorCryptoManiac <balthazar.ad@gmail.com>
Tue, 18 Aug 2015 13:04:37 +0000 (16:04 +0300)
committerCryptoManiac <balthazar.ad@gmail.com>
Tue, 18 Aug 2015 13:04:37 +0000 (16:04 +0300)
Novacoin/CKey.cs [new file with mode: 0644]
Novacoin/CKeyPair.cs
Novacoin/CPubKey.cs
Novacoin/CScript.cs
Novacoin/Interop.cs
Novacoin/Novacoin.csproj
Novacoin/ScriptOpcode.cs
NovacoinTest/Program.cs

diff --git a/Novacoin/CKey.cs b/Novacoin/CKey.cs
new file mode 100644 (file)
index 0000000..e06086c
--- /dev/null
@@ -0,0 +1,58 @@
+\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(); }
+        }
+    }
+}
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()
index a6227a6..8ad4c3e 100644 (file)
@@ -1,38 +1,22 @@
-\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>
@@ -41,12 +25,8 @@ namespace Novacoin
         /// <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>
@@ -55,7 +35,7 @@ namespace Novacoin
         /// <returns>Validation result</returns>
         public bool IsValid
         {
-            get { return !Q.IsInfinity; }
+            get { return !_Public.Q.IsInfinity; }
         }
 
         /// <summary>
@@ -64,41 +44,12 @@ namespace Novacoin
         /// <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);
         }
     }
 }
index 65b824a..f77b8c8 100644 (file)
@@ -1,8 +1,6 @@
 \feffusing System;
 using System.Linq;
 using System.Text;
-
-using System.Collections;
 using System.Collections.Generic;
 
 namespace Novacoin
@@ -352,7 +350,7 @@ 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);
index 2405890..a2ead39 100644 (file)
@@ -2,7 +2,6 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using System.Threading.Tasks;
 
 namespace Novacoin
 {
index c8d8539..5e158c0 100644 (file)
@@ -35,6 +35,7 @@
     <Reference Include="System" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="CKey.cs" />
     <Compile Include="CKeyID.cs" />
     <Compile Include="CKeyPair.cs" />
     <Compile Include="CPubKey.cs" />
index a5a524c..436de24 100644 (file)
@@ -2,7 +2,6 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using System.Threading.Tasks;
 
 namespace Novacoin
 {
index 2270b8c..fe54e2a 100644 (file)
@@ -1,8 +1,6 @@
 \feffusing System;
-using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using System.Threading.Tasks;
 
 
 namespace NovacoinTest
@@ -58,8 +56,8 @@ 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();
         }