/// <summary> /// Writes a key to the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <param name="parameters">The RSA parameters of the key.</param> protected override void WriteCore(Stream stream, RSAParameters parameters) { Requires.NotNull(stream, "stream"); var rootElement = new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.ObjectIdentifier, Pkcs1KeyFormatter.RsaEncryptionObjectIdentifier), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.Null, new byte[0])), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.BitString, PrependLeadingZero(KeyFormatter.Pkcs1PrependZeros.Write(parameters, includePrivateKey: false), alwaysPrependZero: true))); stream.WriteAsn1Element(rootElement); }
/// <summary> /// Reads a key from the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <returns> /// The RSA Parameters of the key. /// </returns> protected override RSAParameters ReadCore(Stream stream) { var universalConstructedSequence = stream.ReadAsn1Elements().Single(); var sequence = Asn.ReadAsn1Elements(universalConstructedSequence.Content).ToList(); KeyFormatter.VerifyFormat(sequence[0].Content.Length == 1 && sequence[0].Content[0] == 0x00, Strings.UnrecognizedVersion); Asn.DataElement oid = Asn.ReadAsn1Elements(sequence[1].Content).First(); KeyFormatter.VerifyFormat(X509SubjectPublicKeyInfoFormatter.BufferEqual(oid.Content, Pkcs1KeyFormatter.RsaEncryptionObjectIdentifier), Strings.UnrecognizedObjectIdentifier); return(KeyFormatter.Pkcs1.Read(sequence[2].Content)); }
/// <summary> /// Writes a key to the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <param name="parameters">The RSA parameters of the key.</param> protected override void WriteCore(Stream stream, RSAParameters parameters) { var rootElement = new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( // Version 0 Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.Integer, new byte[] { 0x00 }), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( // privateKeyAlgorithm Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.ObjectIdentifier, Pkcs1KeyFormatter.RsaEncryptionObjectIdentifier), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.Null, new byte[0])), new Asn.DataElement( // rsaPrivateKey Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.OctetString, KeyFormatter.Pkcs1PrependZeros.Write(parameters, HasPrivateKey(parameters))), new Asn.DataElement( Asn.BerClass.ContextSpecific, Asn.BerPC.Constructed, Asn.BerTag.EndOfContent, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.ObjectIdentifier, new byte[] { 0x55, 0x1d, 0x0f }), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.SetAndSetOf, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.BitString, new byte[] { 0x00, 0x10 }))))); Asn.WriteAsn1Element(stream, rootElement); }
/// <summary> /// Writes a key to the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <param name="parameters">The RSA parameters of the key.</param> protected override void WriteCore(Stream stream, RSAParameters parameters) { var version0 = new Asn.DataElement(Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.Integer, new byte[] { 0x00 }); var privateKeyAlgorithm = new Asn.DataElement(Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.ObjectIdentifier, RsaEncryptionObjectIdentifier); var rsaPrivateKey = new Asn.DataElement(Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.OctetString, Pkcs1.Write(parameters, HasPrivateKey(parameters))); var rootElement = new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, version0, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, privateKeyAlgorithm, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.Null, Array.Empty <byte>())), rsaPrivateKey, new Asn.DataElement( Asn.BerClass.ContextSpecific, Asn.BerPC.Constructed, Asn.BerTag.EndOfContent, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.ObjectIdentifier, new byte[] { 0x55, 0x1d, 0x0f }), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.SetAndSetOf, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.BitString, new byte[] { 0x00, 0x10 }))))); Asn.WriteAsn1Element(stream, rootElement); }
/// <summary> /// Writes a key to the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <param name="parameters">The RSA parameters of the key.</param> protected override void WriteCore(Stream stream, RSAParameters parameters) { Requires.NotNull(stream, "stream"); var rootElement = new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.ObjectIdentifier, Pkcs1KeyFormatter.RsaEncryptionObjectIdentifier), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.Null, new byte[0])), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.BitString, PrependLeadingZero(KeyFormatter.Pkcs1PrependZeros.Write(parameters, includePrivateKey: false), alwaysPrependZero: true))); stream.WriteAsn1Element(rootElement); }
/// <summary> /// Writes a key to the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <param name="parameters">The RSA parameters of the key.</param> protected override void WriteCore(Stream stream, RSAParameters parameters) { var rootElement = new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( // Version 0 Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.Integer, new byte[] { 0x00 }), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( // privateKeyAlgorithm Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.ObjectIdentifier, Pkcs1KeyFormatter.RsaEncryptionObjectIdentifier), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.Null, new byte[0])), new Asn.DataElement( // rsaPrivateKey Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.OctetString, KeyFormatter.Pkcs1PrependZeros.Write(parameters, HasPrivateKey(parameters))), new Asn.DataElement( Asn.BerClass.ContextSpecific, Asn.BerPC.Constructed, Asn.BerTag.EndOfContent, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.Sequence, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.ObjectIdentifier, new byte[] { 0x55, 0x1d, 0x0f }), new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Constructed, Asn.BerTag.SetAndSetOf, new Asn.DataElement( Asn.BerClass.Universal, Asn.BerPC.Primitive, Asn.BerTag.BitString, new byte[] { 0x00, 0x10 }))))); Asn.WriteAsn1Element(stream, rootElement); }