summary refs log tree commit diff
path: root/crypto/src/asn1/tsp/TimeStampReq.cs
blob: 6b3afd55344c4bc185dd2d85a41e2d8af2eafa68 (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;

using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Utilities;

namespace Org.BouncyCastle.Asn1.Tsp
{
	public class TimeStampReq
		: Asn1Encodable
	{
		private readonly DerInteger m_version;
		private readonly MessageImprint m_messageImprint;
		private readonly DerObjectIdentifier m_tsaPolicy;
		private readonly DerInteger m_nonce;
		private readonly DerBoolean m_certReq;
		private readonly X509Extensions m_extensions;

        public static TimeStampReq GetInstance(object obj)
        {
            if (obj == null)
                return null;
            if (obj is TimeStampReq timeStampReq)
                return timeStampReq;
            return new TimeStampReq(Asn1Sequence.GetInstance(obj));
        }

		public static TimeStampReq GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
		{
            return new TimeStampReq(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
        }

        private TimeStampReq(Asn1Sequence seq)
		{
			int nbObjects = seq.Count;
			int seqStart = 0;

			// version
			m_version = DerInteger.GetInstance(seq[seqStart++]);

			// messageImprint
			m_messageImprint = MessageImprint.GetInstance(seq[seqStart++]);

			for (int opt = seqStart; opt < nbObjects; opt++)
			{
				// tsaPolicy
				if (seq[opt] is DerObjectIdentifier oid)
				{
					m_tsaPolicy = oid;
				}
				// nonce
				else if (seq[opt] is DerInteger derInteger)
				{
					m_nonce = derInteger;
				}
				// certReq
				else if (seq[opt] is DerBoolean derBoolean)
				{
					m_certReq = derBoolean;
				}
				// extensions
				else if (seq[opt] is Asn1TaggedObject tagged)
				{
					if (tagged.TagNo == 0)
					{
						m_extensions = X509Extensions.GetInstance(tagged, false);
					}
				}
			}
		}

        public TimeStampReq(MessageImprint messageImprint, DerObjectIdentifier tsaPolicy, DerInteger nonce,
            DerBoolean certReq, X509Extensions extensions)
        {
            // default
            m_version = new DerInteger(1);

            m_messageImprint = messageImprint;
            m_tsaPolicy = tsaPolicy;
            m_nonce = nonce;
            m_certReq = certReq;
            m_extensions = extensions;
        }

		public DerInteger Version => m_version;

		public MessageImprint MessageImprint => m_messageImprint;

		public DerObjectIdentifier ReqPolicy => m_tsaPolicy;

		public DerInteger Nonce => m_nonce;

		public DerBoolean CertReq => m_certReq;

		public X509Extensions Extensions => m_extensions;

		/**
		 * <pre>
		 * TimeStampReq ::= SEQUENCE  {
		 *  version                      INTEGER  { v1(1) },
		 *  messageImprint               MessageImprint,
		 *    --a hash algorithm OID and the hash value of the data to be
		 *    --time-stamped
		 *  reqPolicy             TSAPolicyId              OPTIONAL,
		 *  nonce                 INTEGER                  OPTIONAL,
		 *  certReq               BOOLEAN                  DEFAULT FALSE,
		 *  extensions            [0] IMPLICIT Extensions  OPTIONAL
		 * }
		 * </pre>
		 */
        public override Asn1Object ToAsn1Object()
        {
            Asn1EncodableVector v = new Asn1EncodableVector(6);
			v.Add(m_version, m_messageImprint);
            v.AddOptional(m_tsaPolicy, m_nonce);

            if (m_certReq != null && m_certReq.IsTrue)
            {
                v.Add(m_certReq);
            }

            v.AddOptionalTagged(false, 0, m_extensions);
            return new DerSequence(v);
        }
	}
}