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)); }
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(); }
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 }
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()); }