123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- #pragma warning disable
- using System;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
- namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Cms
- {
- public class AuthenticatedData
- : Asn1Encodable
- {
- private DerInteger version;
- private OriginatorInfo originatorInfo;
- private Asn1Set recipientInfos;
- private AlgorithmIdentifier macAlgorithm;
- private AlgorithmIdentifier digestAlgorithm;
- private ContentInfo encapsulatedContentInfo;
- private Asn1Set authAttrs;
- private Asn1OctetString mac;
- private Asn1Set unauthAttrs;
- public AuthenticatedData(
- OriginatorInfo originatorInfo,
- Asn1Set recipientInfos,
- AlgorithmIdentifier macAlgorithm,
- AlgorithmIdentifier digestAlgorithm,
- ContentInfo encapsulatedContent,
- Asn1Set authAttrs,
- Asn1OctetString mac,
- Asn1Set unauthAttrs)
- {
- if (digestAlgorithm != null || authAttrs != null)
- {
- if (digestAlgorithm == null || authAttrs == null)
- {
- throw new ArgumentException("digestAlgorithm and authAttrs must be set together");
- }
- }
- version = new DerInteger(CalculateVersion(originatorInfo));
- this.originatorInfo = originatorInfo;
- this.macAlgorithm = macAlgorithm;
- this.digestAlgorithm = digestAlgorithm;
- this.recipientInfos = recipientInfos;
- this.encapsulatedContentInfo = encapsulatedContent;
- this.authAttrs = authAttrs;
- this.mac = mac;
- this.unauthAttrs = unauthAttrs;
- }
- private AuthenticatedData(
- Asn1Sequence seq)
- {
- int index = 0;
- version = (DerInteger)seq[index++];
- Asn1Encodable tmp = seq[index++];
- if (tmp is Asn1TaggedObject)
- {
- originatorInfo = OriginatorInfo.GetInstance((Asn1TaggedObject)tmp, false);
- tmp = seq[index++];
- }
- recipientInfos = Asn1Set.GetInstance(tmp);
- macAlgorithm = AlgorithmIdentifier.GetInstance(seq[index++]);
- tmp = seq[index++];
- if (tmp is Asn1TaggedObject)
- {
- digestAlgorithm = AlgorithmIdentifier.GetInstance((Asn1TaggedObject)tmp, false);
- tmp = seq[index++];
- }
- encapsulatedContentInfo = ContentInfo.GetInstance(tmp);
- tmp = seq[index++];
- if (tmp is Asn1TaggedObject)
- {
- authAttrs = Asn1Set.GetInstance((Asn1TaggedObject)tmp, false);
- tmp = seq[index++];
- }
- mac = Asn1OctetString.GetInstance(tmp);
- if (seq.Count > index)
- {
- unauthAttrs = Asn1Set.GetInstance((Asn1TaggedObject)seq[index], false);
- }
- }
- /**
- * return an AuthenticatedData object from a tagged object.
- *
- * @param obj the tagged object holding the object we want.
- * @param isExplicit true if the object is meant to be explicitly
- * tagged false otherwise.
- * @throws ArgumentException if the object held by the
- * tagged object cannot be converted.
- */
- public static AuthenticatedData GetInstance(
- Asn1TaggedObject obj,
- bool isExplicit)
- {
- return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
- }
- /**
- * return an AuthenticatedData object from the given object.
- *
- * @param obj the object we want converted.
- * @throws ArgumentException if the object cannot be converted.
- */
- public static AuthenticatedData GetInstance(
- object obj)
- {
- if (obj == null || obj is AuthenticatedData)
- {
- return (AuthenticatedData)obj;
- }
- if (obj is Asn1Sequence)
- {
- return new AuthenticatedData((Asn1Sequence)obj);
- }
- throw new ArgumentException("Invalid AuthenticatedData: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.GetTypeName(obj));
- }
- public DerInteger Version
- {
- get { return version; }
- }
- public OriginatorInfo OriginatorInfo
- {
- get { return originatorInfo; }
- }
- public Asn1Set RecipientInfos
- {
- get { return recipientInfos; }
- }
- public AlgorithmIdentifier MacAlgorithm
- {
- get { return macAlgorithm; }
- }
- public AlgorithmIdentifier DigestAlgorithm
- {
- get { return digestAlgorithm; }
- }
- public ContentInfo EncapsulatedContentInfo
- {
- get { return encapsulatedContentInfo; }
- }
- public Asn1Set AuthAttrs
- {
- get { return authAttrs; }
- }
- public Asn1OctetString Mac
- {
- get { return mac; }
- }
- public Asn1Set UnauthAttrs
- {
- get { return unauthAttrs; }
- }
- /**
- * Produce an object suitable for an Asn1OutputStream.
- * <pre>
- * AuthenticatedData ::= SEQUENCE {
- * version CMSVersion,
- * originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
- * recipientInfos RecipientInfos,
- * macAlgorithm MessageAuthenticationCodeAlgorithm,
- * digestAlgorithm [1] DigestAlgorithmIdentifier OPTIONAL,
- * encapContentInfo EncapsulatedContentInfo,
- * authAttrs [2] IMPLICIT AuthAttributes OPTIONAL,
- * mac MessageAuthenticationCode,
- * unauthAttrs [3] IMPLICIT UnauthAttributes OPTIONAL }
- *
- * AuthAttributes ::= SET SIZE (1..MAX) OF Attribute
- *
- * UnauthAttributes ::= SET SIZE (1..MAX) OF Attribute
- *
- * MessageAuthenticationCode ::= OCTET STRING
- * </pre>
- */
- public override Asn1Object ToAsn1Object()
- {
- Asn1EncodableVector v = new Asn1EncodableVector(version);
- v.AddOptionalTagged(false, 0, originatorInfo);
- v.Add(recipientInfos, macAlgorithm);
- v.AddOptionalTagged(false, 1, digestAlgorithm);
- v.Add(encapsulatedContentInfo);
- v.AddOptionalTagged(false, 2, authAttrs);
- v.Add(mac);
- v.AddOptionalTagged(false, 3, unauthAttrs);
- return new BerSequence(v);
- }
- public static int CalculateVersion(OriginatorInfo origInfo)
- {
- if (origInfo == null)
- return 0;
- int ver = 0;
- foreach (object obj in origInfo.Certificates)
- {
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tag = (Asn1TaggedObject)obj;
- if (tag.TagNo == 2)
- {
- ver = 1;
- }
- else if (tag.TagNo == 3)
- {
- ver = 3;
- break;
- }
- }
- }
- foreach (object obj in origInfo.Crls)
- {
- if (obj is Asn1TaggedObject)
- {
- Asn1TaggedObject tag = (Asn1TaggedObject)obj;
- if (tag.TagNo == 1)
- {
- ver = 3;
- break;
- }
- }
- }
- return ver;
- }
- }
- }
- #pragma warning restore
- #endif
|