public static EcdsaSignature DecodeFromDer(byte[] bytes) { try { var decoder = new Asn1InputStream(bytes); var seq = (Asn1Sequence)decoder.ReadObject(); DerInteger r, s; try { r = (DerInteger)seq[0]; s = (DerInteger)seq[1]; } catch (InvalidCastException) { return null; } decoder.Close(); // OpenSSL deviates from the DER spec by interpreting these values as unsigned, though they should not be // Thus, we always use the positive versions. See: http://r6.ca/blog/20111119T211504Z.html return new EcdsaSignature(r.PositiveValue, s.PositiveValue); } catch (IOException e) { throw new ApplicationException("Decoding form DER failed", e); } }
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.Close(); }
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())); decoder.Close(); return builder.ToString(); }
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(); decoder.Close(); return new ECKey(bits, true); }