using System; using Org.BouncyCastle.Asn1.X509; namespace Org.BouncyCastle.Asn1.Crmf { public class EncryptedValue : Asn1Encodable { public static EncryptedValue GetInstance(object obj) { if (obj is EncryptedValue encryptedValue) return encryptedValue; if (obj != null) return new EncryptedValue(Asn1Sequence.GetInstance(obj)); return null; } private readonly AlgorithmIdentifier m_intendedAlg; private readonly AlgorithmIdentifier m_symmAlg; private readonly DerBitString m_encSymmKey; private readonly AlgorithmIdentifier m_keyAlg; private readonly Asn1OctetString m_valueHint; private readonly DerBitString m_encValue; private EncryptedValue(Asn1Sequence seq) { int index = 0; while (seq[index] is Asn1TaggedObject tObj) { switch (tObj.TagNo) { case 0: m_intendedAlg = AlgorithmIdentifier.GetInstance(tObj, false); break; case 1: m_symmAlg = AlgorithmIdentifier.GetInstance(tObj, false); break; case 2: m_encSymmKey = DerBitString.GetInstance(tObj, false); break; case 3: m_keyAlg = AlgorithmIdentifier.GetInstance(tObj, false); break; case 4: m_valueHint = Asn1OctetString.GetInstance(tObj, false); break; } ++index; } m_encValue = DerBitString.GetInstance(seq[index]); } public EncryptedValue(AlgorithmIdentifier intendedAlg, AlgorithmIdentifier symmAlg, DerBitString encSymmKey, AlgorithmIdentifier keyAlg, Asn1OctetString valueHint, DerBitString encValue) { if (encValue == null) throw new ArgumentNullException(nameof(encValue)); m_intendedAlg = intendedAlg; m_symmAlg = symmAlg; m_encSymmKey = encSymmKey; m_keyAlg = keyAlg; m_valueHint = valueHint; m_encValue = encValue; } public virtual AlgorithmIdentifier IntendedAlg => m_intendedAlg; public virtual AlgorithmIdentifier SymmAlg => m_symmAlg; public virtual DerBitString EncSymmKey => m_encSymmKey; public virtual AlgorithmIdentifier KeyAlg => m_keyAlg; public virtual Asn1OctetString ValueHint => m_valueHint; public virtual DerBitString EncValue => m_encValue; /** *
         * (IMPLICIT TAGS)
         * EncryptedValue ::= SEQUENCE {
         *                     intendedAlg   [0] AlgorithmIdentifier  OPTIONAL,
         *                     -- the intended algorithm for which the value will be used
         *                     symmAlg       [1] AlgorithmIdentifier  OPTIONAL,
         *                     -- the symmetric algorithm used to encrypt the value
         *                     encSymmKey    [2] BIT STRING           OPTIONAL,
         *                     -- the (encrypted) symmetric key used to encrypt the value
         *                     keyAlg        [3] AlgorithmIdentifier  OPTIONAL,
         *                     -- algorithm used to encrypt the symmetric key
         *                     valueHint     [4] OCTET STRING         OPTIONAL,
         *                     -- a brief description or identifier of the encValue content
         *                     -- (may be meaningful only to the sending entity, and used only
         *                     -- if EncryptedValue might be re-examined by the sending entity
         *                     -- in the future)
         *                     encValue       BIT STRING }
         *                     -- the encrypted value itself
         * 
* @return a basic ASN.1 object representation. */ public override Asn1Object ToAsn1Object() { Asn1EncodableVector v = new Asn1EncodableVector(6); v.AddOptionalTagged(false, 0, m_intendedAlg); v.AddOptionalTagged(false, 1, m_symmAlg); v.AddOptionalTagged(false, 2, m_encSymmKey); v.AddOptionalTagged(false, 3, m_keyAlg); v.AddOptionalTagged(false, 4, m_valueHint); v.Add(m_encValue); return new DerSequence(v); } } }