using System; using Org.BouncyCastle.Asn1.Oiw; using Org.BouncyCastle.Asn1.X509; namespace Org.BouncyCastle.Asn1.Pkcs { public class RsaesOaepParameters : Asn1Encodable { public static readonly AlgorithmIdentifier DefaultHashAlgorithm = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance); public static readonly AlgorithmIdentifier DefaultMaskGenAlgorithm = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, DefaultHashAlgorithm); [Obsolete("Use 'DefaultMaskGenAlgorithm' instead")] public static readonly AlgorithmIdentifier DefaultMaskGenFunction = DefaultMaskGenAlgorithm; public static readonly AlgorithmIdentifier DefaultPSourceAlgorithm = new AlgorithmIdentifier(PkcsObjectIdentifiers.IdPSpecified, new DerOctetString(new byte[0])); public static RsaesOaepParameters GetInstance(object obj) { if (obj == null) return null; if (obj is RsaesOaepParameters rsaesOaepParameters) return rsaesOaepParameters; #pragma warning disable CS0618 // Type or member is obsolete return new RsaesOaepParameters(Asn1Sequence.GetInstance(obj)); #pragma warning restore CS0618 // Type or member is obsolete } public static RsaesOaepParameters GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { #pragma warning disable CS0618 // Type or member is obsolete return new RsaesOaepParameters(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); #pragma warning restore CS0618 // Type or member is obsolete } private readonly AlgorithmIdentifier m_hashAlgorithm; private readonly AlgorithmIdentifier m_maskGenAlgorithm; private readonly AlgorithmIdentifier m_pSourceAlgorithm; [Obsolete("Use 'GetInstance' instead")] public RsaesOaepParameters(Asn1Sequence seq) { int count = seq.Count, pos = 0; if (count < 0 || count > 3) throw new ArgumentException("Bad sequence size: " + count, nameof(seq)); m_hashAlgorithm = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 0, true, AlgorithmIdentifier.GetTagged) ?? DefaultHashAlgorithm; m_maskGenAlgorithm = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 1, true, AlgorithmIdentifier.GetTagged) ?? DefaultMaskGenAlgorithm; m_pSourceAlgorithm = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 2, true, AlgorithmIdentifier.GetTagged) ?? DefaultPSourceAlgorithm; if (pos != count) throw new ArgumentException("Unexpected elements in sequence", nameof(seq)); } /** * The default version */ public RsaesOaepParameters() : this(DefaultHashAlgorithm, DefaultMaskGenAlgorithm, DefaultPSourceAlgorithm) { } public RsaesOaepParameters(AlgorithmIdentifier hashAlgorithm, AlgorithmIdentifier maskGenAlgorithm) : this(hashAlgorithm, maskGenAlgorithm, DefaultPSourceAlgorithm) { } public RsaesOaepParameters(AlgorithmIdentifier hashAlgorithm, AlgorithmIdentifier maskGenAlgorithm, AlgorithmIdentifier pSourceAlgorithm) { m_hashAlgorithm = hashAlgorithm; m_maskGenAlgorithm = maskGenAlgorithm; m_pSourceAlgorithm = pSourceAlgorithm; } public AlgorithmIdentifier HashAlgorithm => m_hashAlgorithm; public AlgorithmIdentifier MaskGenAlgorithm => m_maskGenAlgorithm; public AlgorithmIdentifier PSourceAlgorithm => m_pSourceAlgorithm; /** *
* RSAES-OAEP-params ::= SEQUENCE { * hashAlgorithm [0] OAEP-PSSDigestAlgorithms DEFAULT sha1, * maskGenAlgorithm [1] PKCS1MGFAlgorithms DEFAULT mgf1SHA1, * pSourceAlgorithm [2] PKCS1PSourceAlgorithms DEFAULT pSpecifiedEmpty * } * * OAEP-PSSDigestAlgorithms ALGORITHM-IDENTIFIER ::= { * { OID id-sha1 PARAMETERS NULL }| * { OID id-sha256 PARAMETERS NULL }| * { OID id-sha384 PARAMETERS NULL }| * { OID id-sha512 PARAMETERS NULL }, * ... -- Allows for future expansion -- * } * PKCS1MGFAlgorithms ALGORITHM-IDENTIFIER ::= { * { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms }, * ... -- Allows for future expansion -- * } * PKCS1PSourceAlgorithms ALGORITHM-IDENTIFIER ::= { * { OID id-pSpecified PARAMETERS OCTET STRING }, * ... -- Allows for future expansion -- * } ** @return the asn1 primitive representing the parameters. */ public override Asn1Object ToAsn1Object() { Asn1EncodableVector v = new Asn1EncodableVector(3); if (!DefaultHashAlgorithm.Equals(m_hashAlgorithm)) { v.Add(new DerTaggedObject(true, 0, m_hashAlgorithm)); } if (!DefaultMaskGenAlgorithm.Equals(m_maskGenAlgorithm)) { v.Add(new DerTaggedObject(true, 1, m_maskGenAlgorithm)); } if (!DefaultPSourceAlgorithm.Equals(m_pSourceAlgorithm)) { v.Add(new DerTaggedObject(true, 2, m_pSourceAlgorithm)); } return new DerSequence(v); } } }