summary refs log tree commit diff
path: root/crypto/src/asn1/isismtt/x509/Admissions.cs
blob: 0ea209a350a85053d971e43aeaf20c6d523b5c21 (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;

namespace Org.BouncyCastle.Asn1.IsisMtt.X509
{
    /**
	* An Admissions structure.
	* <p/>
	* <pre>
	*            Admissions ::= SEQUENCE
	*            {
	*              admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
	*              namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
	*              professionInfos SEQUENCE OF ProfessionInfo
	*            }
	* <p/>
	* </pre>
	*
	* @see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax
	* @see Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo
	* @see Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority
	*/
    public class Admissions
		: Asn1Encodable
	{
		public static Admissions GetInstance(object obj)
		{
			if (obj == null)
				return null;
			if (obj is Admissions admissions)
				return admissions;
			return new Admissions(Asn1Sequence.GetInstance(obj));
		}

        public static Admissions GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) =>
            new Admissions(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));

        public static Admissions GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) =>
            new Admissions(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));

        private readonly GeneralName m_admissionAuthority;
        private readonly NamingAuthority m_namingAuthority;
        private readonly Asn1Sequence m_professionInfos;

        /**
		* Constructor from Asn1Sequence.
		* <p/>
		* The sequence is of type ProcurationSyntax:
		* <p/>
		* <pre>
		*            Admissions ::= SEQUENCE
		*            {
		*              admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
		*              namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
		*              professionInfos SEQUENCE OF ProfessionInfo
		*            }
		* </pre>
		*
		* @param seq The ASN.1 sequence.
		*/
        private Admissions(Asn1Sequence seq)
		{
            int count = seq.Count, pos = 0;
            if (count < 1 || count > 3)
                throw new ArgumentException("Bad sequence size: " + count, nameof(seq));

			m_admissionAuthority = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 0, true, GeneralName.GetTagged);
            m_namingAuthority = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 1, true, NamingAuthority.GetTagged);
			m_professionInfos = Asn1Sequence.GetInstance(seq[pos++]);

            if (pos != count)
                throw new ArgumentException("Unexpected elements in sequence", nameof(seq));
		}

        /**
		* Constructor from a given details.
		* <p/>
		* Parameter <code>professionInfos</code> is mandatory.
		*
		* @param admissionAuthority The admission authority.
		* @param namingAuthority    The naming authority.
		* @param professionInfos    The profession infos.
		*/
        public Admissions(GeneralName admissionAuthority, NamingAuthority namingAuthority,
			ProfessionInfo[] professionInfos)
        {
            m_admissionAuthority = admissionAuthority;
            m_namingAuthority = namingAuthority;
            m_professionInfos = DerSequence.FromElements(professionInfos);
        }

		public virtual GeneralName AdmissionAuthority => m_admissionAuthority;

		public virtual NamingAuthority NamingAuthority => m_namingAuthority;

		public ProfessionInfo[] GetProfessionInfos() => m_professionInfos.MapElements(ProfessionInfo.GetInstance);

		/**
		* Produce an object suitable for an Asn1OutputStream.
		* <p/>
		* Returns:
		* <p/>
		* <pre>
		*       Admissions ::= SEQUENCE
		*       {
		*         admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
		*         namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
		*         professionInfos SEQUENCE OF ProfessionInfo
		*       }
		* <p/>
		* </pre>
		*
		* @return an Asn1Object
		*/
		public override Asn1Object ToAsn1Object()
		{
			Asn1EncodableVector v = new Asn1EncodableVector(3);
            v.AddOptionalTagged(true, 0, m_admissionAuthority);
            v.AddOptionalTagged(true, 1, m_namingAuthority);
			v.Add(m_professionInfos);
			return new DerSequence(v);
		}
	}
}