summary refs log tree commit diff
path: root/crypto/src/asn1/isismtt/x509/DeclarationOfMajority.cs
blob: d76a351bfdff0f90ca4cd84bc1dafa7981cfd26b (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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
using System;

using Org.BouncyCastle.Utilities;

namespace Org.BouncyCastle.Asn1.IsisMtt.X509
{
	/**
	* A declaration of majority.
	* <p/>
	* <pre>
	*           DeclarationOfMajoritySyntax ::= CHOICE
	*           {
	*             notYoungerThan [0] IMPLICIT INTEGER,
	*             fullAgeAtCountry [1] IMPLICIT SEQUENCE
	*             {
	*               fullAge BOOLEAN DEFAULT TRUE,
	*               country PrintableString (SIZE(2))
	*             }
	*             dateOfBirth [2] IMPLICIT GeneralizedTime
	*           }
	* </pre>
	* <p/>
	* fullAgeAtCountry indicates the majority of the owner with respect to the laws
	* of a specific country.
	*/
	public class DeclarationOfMajority
		: Asn1Encodable, IAsn1Choice
	{
		public enum Choice
		{
			NotYoungerThan = 0,
			FullAgeAtCountry = 1,
			DateOfBirth = 2
		};

		private readonly Asn1TaggedObject m_declaration;

		public DeclarationOfMajority(int notYoungerThan)
		{
			m_declaration = new DerTaggedObject(false, 0, new DerInteger(notYoungerThan));
		}

		public DeclarationOfMajority(bool fullAge, string country)
		{
			if (country.Length > 2)
				throw new ArgumentException("country can only be 2 characters", nameof(country));

			DerPrintableString countryString = new DerPrintableString(country, true);

			DerSequence seq;
			if (fullAge)
			{
				seq = new DerSequence(countryString);
			}
			else
			{
				seq = new DerSequence(DerBoolean.False, countryString);
			}

			m_declaration = new DerTaggedObject(false, 1, seq);
		}

		public DeclarationOfMajority(Asn1GeneralizedTime dateOfBirth)
		{
			m_declaration = new DerTaggedObject(false, 2, dateOfBirth);
		}

		public static DeclarationOfMajority GetInstance(object obj)
		{
			if (obj == null)
				return null;

			if (obj is DeclarationOfMajority declarationOfMajority)
				return declarationOfMajority;

			if (obj is Asn1TaggedObject taggedObject)
				return new DeclarationOfMajority(Asn1Utilities.CheckContextTag(taggedObject));

            throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), nameof(obj));
		}

		private DeclarationOfMajority(Asn1TaggedObject o)
		{
			if (o.TagNo > 2)
				throw new ArgumentException("Bad tag number: " + o.TagNo);

			m_declaration = o;
		}

		/**
		* Produce an object suitable for an Asn1OutputStream.
		* <p/>
		* Returns:
		* <p/>
		* <pre>
		*           DeclarationOfMajoritySyntax ::= CHOICE
		*           {
		*             notYoungerThan [0] IMPLICIT INTEGER,
		*             fullAgeAtCountry [1] IMPLICIT SEQUENCE
		*             {
		*               fullAge BOOLEAN DEFAULT TRUE,
		*               country PrintableString (SIZE(2))
		*             }
		*             dateOfBirth [2] IMPLICIT GeneralizedTime
		*           }
		* </pre>
		*
		* @return an Asn1Object
		*/
		public override Asn1Object ToAsn1Object()
		{
			return m_declaration;
		}

		public Choice Type
		{
			get { return (Choice)m_declaration.TagNo; }
		}

		/**
		* @return notYoungerThan if that's what we are, -1 otherwise
		*/
		public virtual int NotYoungerThan
		{
			get
			{
				switch (Type)
				{
				case Choice.NotYoungerThan:
                    return DerInteger.GetInstance(m_declaration, false).IntValueExact;
				default:
					return -1;
				}
			}
		}

		public virtual Asn1Sequence FullAgeAtCountry
		{
			get
			{
				switch (Type)
				{
				case Choice.FullAgeAtCountry:
					return Asn1Sequence.GetInstance(m_declaration, false);
				default:
					return null;
				}
			}
		}

		public virtual Asn1GeneralizedTime DateOfBirth
		{
			get
			{
				switch (Type)
				{
				case Choice.DateOfBirth:
					return Asn1GeneralizedTime.GetInstance(m_declaration, false);
				default:
					return null;
				}
			}
		}
	}
}