summary refs log tree commit diff
path: root/crypto/src/asn1/cms/EnvelopedDataParser.cs
blob: 06e10c1045422b0f453db462b2958feb91da005f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;

namespace Org.BouncyCastle.Asn1.Cms
{
    /**
	* Produce an object suitable for an Asn1OutputStream.
	* <pre>
	* EnvelopedData ::= SEQUENCE {
	*     version CMSVersion,
	*     originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
	*     recipientInfos RecipientInfos,
	*     encryptedContentInfo EncryptedContentInfo,
	*     unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL
	* }
	* </pre>
	*/
    public class EnvelopedDataParser
    {
        private Asn1SequenceParser _seq;
        private DerInteger _version;
        private IAsn1Convertible _nextObject;
        private bool _originatorInfoCalled;

        public EnvelopedDataParser(
            Asn1SequenceParser seq)
        {
            this._seq = seq;
            this._version = (DerInteger)seq.ReadObject();
        }

        public DerInteger Version
        {
            get { return _version; }
        }

        public OriginatorInfo GetOriginatorInfo()
        {
            _originatorInfoCalled = true;

            if (_nextObject == null)
            {
                _nextObject = _seq.ReadObject();
            }

            if (_nextObject is Asn1TaggedObjectParser o)
            {
                if (o.HasContextTag(0))
                {
                    Asn1SequenceParser originatorInfo = (Asn1SequenceParser)o.ParseBaseUniversal(false, Asn1Tags.Sequence);
                    _nextObject = null;
                    return OriginatorInfo.GetInstance(originatorInfo.ToAsn1Object());
                }
            }

            return null;
        }

        public Asn1SetParser GetRecipientInfos()
        {
            if (!_originatorInfoCalled)
            {
                GetOriginatorInfo();
            }

            if (_nextObject == null)
            {
                _nextObject = _seq.ReadObject();
            }

            Asn1SetParser recipientInfos = (Asn1SetParser)_nextObject;
            _nextObject = null;
            return recipientInfos;
        }

        public EncryptedContentInfoParser GetEncryptedContentInfo()
        {
            if (_nextObject == null)
            {
                _nextObject = _seq.ReadObject();
            }

            if (_nextObject != null)
            {
                Asn1SequenceParser o = (Asn1SequenceParser)_nextObject;
                _nextObject = null;
                return new EncryptedContentInfoParser(o);
            }

            return null;
        }

        public Asn1SetParser GetUnprotectedAttrs()
        {
            if (_nextObject == null)
            {
                _nextObject = _seq.ReadObject();
            }

            if (_nextObject != null)
            {
                Asn1TaggedObjectParser o = (Asn1TaggedObjectParser)_nextObject;
                _nextObject = null;
                return (Asn1SetParser)Asn1Utilities.ParseContextBaseUniversal(o, 1, false, Asn1Tags.SetOf);
            }

            return null;
        }
    }
}