Example #1
0
        public static ECKey FromDER(byte[] der)
        {
            // To understand this code, see the definition of the ASN.1 format for EC private keys in the OpenSSL source
            // code in ec_asn1.c:
            //
            // ASN1_SEQUENCE(EC_PRIVATEKEY) = {
            //   ASN1_SIMPLE(EC_PRIVATEKEY, version, LONG),
            //   ASN1_SIMPLE(EC_PRIVATEKEY, privateKey, ASN1_OCTET_STRING),
            //   ASN1_EXP_OPT(EC_PRIVATEKEY, parameters, ECPKPARAMETERS, 0),
            //   ASN1_EXP_OPT(EC_PRIVATEKEY, publicKey, ASN1_BIT_STRING, 1)
            // } ASN1_SEQUENCE_END(EC_PRIVATEKEY)
            //

            Asn1InputStream decoder = new Asn1InputStream(der);
            DerSequence     seq     = (DerSequence)decoder.ReadObject();

            CheckArgument(seq.Count == 4, "Input does not appear to be an ASN.1 OpenSSL EC private key");
            CheckArgument(((DerInteger)seq[0]).Value.Equals(BigInteger.One),
                          "Input is of wrong version");
            byte[] bits = ((DerOctetString)seq[1]).GetOctets();
#if !PORTABLE
            decoder.Close();
#else
            decoder.Dispose();
#endif
            return(new ECKey(bits, true));
        }
Example #2
0
        public static void Main(string[] args)
        {
            FileStream      fIn = File.OpenRead(args[0]);
            Asn1InputStream bIn = new Asn1InputStream(fIn);

            Asn1Object obj;

            while ((obj = bIn.ReadObject()) != null)
            {
                Console.WriteLine(Asn1Dump.DumpAsString(obj));
            }

            bIn.Dispose();
        }
Example #3
0
        public static ECSignature GenerateSignature(Hash data, ECKeyPair keyPair)
        {
#if NATIVE_ECDSA
            using (var eC = ECDsa.Create(keyPair))
            {
                Hash sign = eC.SignHash(data);
                return(new ECSignature(sign));
            }
#else
            try
            {
                ISigner            signer                   = SignerUtilities.GetSigner("NONEwithECDSA");
                X9ECParameters     curve                    = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName(keyPair.CurveType.ToString().ToLower());
                ECDomainParameters domain                   = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H);
                Org.BouncyCastle.Math.BigInteger bn         = new Org.BouncyCastle.Math.BigInteger(keyPair.D);
                ECPrivateKeyParameters           parameters = new ECPrivateKeyParameters(bn, domain);
                signer.Init(true, parameters);
                signer.BlockUpdate(data, 0, data.Length);
                byte[]          sigBytes = signer.GenerateSignature();
                Asn1InputStream decoder  = new Asn1InputStream(sigBytes);
                DerSequence     seq      = (DerSequence)decoder.ReadObject();
                DerInteger      r        = (DerInteger)seq[0];
                DerInteger      s        = (DerInteger)seq[1];
                decoder.Dispose();
                var rArr = r.Value.ToByteArray();
                var sArr = s.Value.ToByteArray();
                if (rArr[0] == 0)
                {
                    rArr = rArr.Skip(1).ToArray();
                }
                if (sArr[0] == 0)
                {
                    sArr = sArr.Skip(1).ToArray();
                }
                return(new ECSignature
                {
                    R = r.Value.ToByteArray(),
                    S = s.Value.ToByteArray(),
                    SigCompat = sigBytes
                });
            }
            catch (Exception e)
            {
                return(new ECSignature());
            }
#endif
        }
Example #4
0
        public static string DumpDer(byte[] der)
        {
            StringBuilder   builder = new StringBuilder();
            Asn1InputStream decoder = new Asn1InputStream(der);
            DerSequence     seq     = (DerSequence)decoder.ReadObject();

            builder.AppendLine("Version : " + Encoders.Hex.EncodeData(seq[0].GetDerEncoded()));
            builder.AppendLine("Private : " + Encoders.Hex.EncodeData(seq[1].GetDerEncoded()));
            builder.AppendLine("Params : " + Encoders.Hex.EncodeData(((DerTaggedObject)seq[2]).GetObject().GetDerEncoded()));
            builder.AppendLine("Public : " + Encoders.Hex.EncodeData(seq[3].GetDerEncoded()));
#if !PORTABLE
            decoder.Close();
#else
            decoder.Dispose();
#endif
            return(builder.ToString());
        }