summary refs log tree commit diff
path: root/crypto/src/asn1/BerTaggedObject.cs
blob: 4bf27e12f3eb77462c5fbb4f37f79648f8dc5264 (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
using System;
using System.Collections;

using Org.BouncyCastle.Utilities;

namespace Org.BouncyCastle.Asn1
{
	/**
	 * BER TaggedObject - in ASN.1 notation this is any object preceded by
	 * a [n] where n is some number - these are assumed to follow the construction
	 * rules (as with sequences).
	 */
	public class BerTaggedObject
		: DerTaggedObject
	{
		/**
		 * @param tagNo the tag number for this object.
		 * @param obj the tagged object.
		 */
		public BerTaggedObject(
			int				tagNo,
			Asn1Encodable	obj)
			: base(tagNo, obj)
		{
		}

		/**
		 * @param explicitly true if an explicitly tagged object.
		 * @param tagNo the tag number for this object.
		 * @param obj the tagged object.
		 */
		public BerTaggedObject(
			bool			explicitly,
			int				tagNo,
			Asn1Encodable	obj)
			: base(explicitly, tagNo, obj)
		{
		}

		/**
		 * create an implicitly tagged object that contains a zero
		 * length sequence.
		 */
		public BerTaggedObject(
			int tagNo)
			: base(false, tagNo, BerSequence.Empty)
		{
		}

        internal override string Asn1Encoding
        {
            get { return Ber; }
        }

        internal override bool EncodeConstructed()
        {
            throw Platform.CreateNotImplementedException("BerTaggedObject.EncodeConstructed");

            // TODO This depends on knowing it's not DER
            //return IsExplicit() || obj.ToAsn1Object().EncodeConstructed();
        }

        internal override int EncodedLength(bool withID)
        {
            throw Platform.CreateNotImplementedException("BerTaggedObject.EncodedLength");
        }

        internal override void Encode(Asn1OutputStream asn1Out, bool withID)
		{
			if (asn1Out.IsBer)
			{
                if (withID)
                {
                    asn1Out.WriteIdentifier(true, Asn1Tags.Constructed | TagClass, TagNo);
                }

                asn1Out.WriteByte(0x80);

				if (!explicitly)
				{
					IEnumerable eObj;
					if (obj is Asn1OctetString)
					{
						if (obj is BerOctetString)
						{
							eObj = (BerOctetString) obj;
						}
						else
						{
							Asn1OctetString octs = (Asn1OctetString)obj;
							eObj = new BerOctetString(octs.GetOctets());
						}
					}
					else if (obj is Asn1Sequence)
					{
						eObj = (Asn1Sequence) obj;
					}
					else if (obj is Asn1Set)
					{
						eObj = (Asn1Set) obj;
					}
					else
					{
						throw Platform.CreateNotImplementedException(Platform.GetTypeName(obj));
					}

					foreach (Asn1Encodable o in eObj)
					{
						asn1Out.WritePrimitive(o.ToAsn1Object(), true);
					}
				}
				else
				{
					asn1Out.WritePrimitive(obj.ToAsn1Object(), true);
				}

				asn1Out.WriteByte(0x00);
				asn1Out.WriteByte(0x00);
			}
			else
			{
				base.Encode(asn1Out, withID);
			}
		}

        internal override Asn1Sequence RebuildConstructed(Asn1Object asn1Object)
        {
            return new BerSequence(asn1Object);
        }
    }
}