Exemplo n.º 1
0
        public ECKeyInfo(
            int length,
            string p_str,
            string a_str,
            string b_str,
            string gx_str,
            string gy_str,
            string n_str)
        {
            this.length = length;
            p           = new Org.BouncyCastle.Math.BigInteger(p_str, 16);
            a           = new Org.BouncyCastle.Math.BigInteger(a_str, 16);
            b           = new Org.BouncyCastle.Math.BigInteger(b_str, 16);
            gx          = new Org.BouncyCastle.Math.BigInteger(gx_str, 16);
            gy          = new Org.BouncyCastle.Math.BigInteger(gy_str, 16);
            n           = new Org.BouncyCastle.Math.BigInteger(n_str, 16);
            Org.BouncyCastle.Math.BigInteger h = Org.BouncyCastle.Math.BigInteger.One;

            this.curve = new Org.BouncyCastle.Math.EC.FpCurve(p, a, b, n, h);

            //spec = new ECParameterSpec(curve, new ECPoint(gx, gy), n, 1);
            this.spec = new Org.BouncyCastle.Crypto.Parameters.ECDomainParameters(
                curve
                , curve.CreatePoint(gx, gy) // G
                , n
                , h
                );
        }
Exemplo n.º 2
0
        public void SetUpSecp256k1()
        {
            //Set up OpenECC Curve
            OpenECCSecp256k1 = OpenECC.CurveFactory.secp256k1;
            OpenECCGenerator = OpenECCSecp256k1.Generator;
            OpenECCPoint1 = OpenECCGenerator * 3;
            OpenECCPoint2 = OpenECCGenerator * 5;

            //Set up BouncyCastle curve
            var bc_stuff = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256k1");
            BCSecp256k1 = bc_stuff.Curve;
            BCGenerator = bc_stuff.G;
            BCPoint1 = BCGenerator.Multiply(new Org.BouncyCastle.Math.BigInteger("3"));
            BCPoint2 = BCGenerator.Multiply(new Org.BouncyCastle.Math.BigInteger("5"));
        }
Exemplo n.º 3
0
        public static Key Deserialize(IEnumerable <byte> payload)
        {
            if (payload == null)
            {
                throw new ArgumentNullException(nameof(payload));
            }

            var c      = SecNamedCurves.GetByName("secp256k1");
            var domain = new ECDomainParameters(c.Curve, c.G, c.N, c.H);

            Org.BouncyCastle.Math.EC.ECCurve curve = domain.Curve;
            Org.BouncyCastle.Math.EC.ECPoint q     = curve.DecodePoint(payload.ToArray());
            var publicKey = new ECPublicKeyParameters(q, domain);

            return(new Key(null, publicKey));
        }
Exemplo n.º 4
0
        public static Key Deserialize(BigInteger publicKey, BigInteger privateKey)
        {
            if (publicKey == null)
            {
                throw new ArgumentNullException(nameof(publicKey));
            }

            if (privateKey == null)
            {
                throw new ArgumentNullException(nameof(privateKey));
            }

            var c      = SecNamedCurves.GetByName("secp256k1");
            var domain = new ECDomainParameters(c.Curve, c.G, c.N, c.H);

            Org.BouncyCastle.Math.EC.ECCurve curve = domain.Curve;
            Org.BouncyCastle.Math.EC.ECPoint q     = curve.DecodePoint(publicKey.ToByteArray());
            var pubK = new ECPublicKeyParameters(q, domain);
            var prK  = new ECPrivateKeyParameters(privateKey, domain);

            return(new Key(prK, pubK));
        }
Exemplo n.º 5
0
        public bool VerifySignature(byte[] message, byte[] signature, byte[] pubkey)
        {
            if (pubkey.Length == 33 && (pubkey[0] == 0x02 || pubkey[0] == 0x03))
            {
                try
                {
                    pubkey = ECPoint.DecodePoint(pubkey, ECCurve.Secp256r1).EncodePoint(false).Skip(1).ToArray();
                }
                catch
                {
                    return(false);
                }
            }
            else if (pubkey.Length == 65 && pubkey[0] == 0x04)
            {
                pubkey = pubkey.Skip(1).ToArray();
            }
            else if (pubkey.Length != 64)
            {
                throw new ArgumentException();
            }

            BigInteger x = new BigInteger(1, pubkey.Take(32).ToArray());
            BigInteger y = new BigInteger(1, pubkey.Skip(32).ToArray());

            X9ECParameters     ecParams         = NistNamedCurves.GetByName("P-256");
            ECDomainParameters domainParameters = new ECDomainParameters(ecParams.Curve, ecParams.G, ecParams.N,
                                                                         ecParams.H, ecParams.GetSeed());
            var G = ecParams.G;

            Org.BouncyCastle.Math.EC.ECCurve curve = ecParams.Curve;
            Org.BouncyCastle.Math.EC.ECPoint q     = curve.CreatePoint(x, y);

            ECPublicKeyParameters pubkeyParam = new ECPublicKeyParameters(q, domainParameters);

            var verifier = SignerUtilities.GetSigner("SHA-256withECDSA");

            verifier.Init(false, pubkeyParam);
            verifier.BlockUpdate(message, 0, message.Length);
            // expected format is SEQUENCE {INTEGER r, INTEGER s}
            var derSignature = new DerSequence(
                // first 32 bytes is "r" number
                new DerInteger(new BigInteger(1, signature.Take(32).ToArray())),
                // last 32 bytes is "s" number
                new DerInteger(new BigInteger(1, signature.Skip(32).ToArray())))
                               .GetDerEncoded();

            ///old verify method
            ///

            /*
             * const int ECDSA_PUBLIC_P256_MAGIC = 0x31534345;
             * pubkey = BitConverter.GetBytes(ECDSA_PUBLIC_P256_MAGIC).Concat(BitConverter.GetBytes(32)).Concat(pubkey).ToArray();
             * using (CngKey key = CngKey.Import(pubkey, CngKeyBlobFormat.EccPublicBlob))
             * using (ECDsaCng ecdsa = new ECDsaCng(key))
             * {
             * var result = ecdsa.VerifyData(message, signature, HashAlgorithmName.SHA256);
             * }
             */
            ///////////////////
            return(verifier.VerifySignature(derSignature));
        }