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
|
using System;
namespace Org.BouncyCastle.Asn1
{
public class DerSequence
: Asn1Sequence
{
public static readonly DerSequence Empty = new DerSequence();
public static DerSequence Concatenate(params Asn1Sequence[] sequences)
{
if (sequences == null)
return Empty;
switch (sequences.Length)
{
case 0:
return Empty;
case 1:
return FromSequence(sequences[0]);
default:
return FromElements(ConcatenateElements(sequences));
}
}
internal static DerSequence FromElements(Asn1Encodable[] elements)
{
return elements.Length < 1 ? Empty : new DerSequence(elements, clone: false);
}
public static DerSequence FromSequence(Asn1Sequence sequence)
{
if (sequence is DerSequence derSequence)
return derSequence;
return FromElements(sequence.m_elements);
}
public static DerSequence FromVector(Asn1EncodableVector elementVector)
{
return elementVector.Count < 1 ? Empty : new DerSequence(elementVector);
}
/**
* create an empty sequence
*/
public DerSequence()
: base()
{
}
/**
* create a sequence containing one object
*/
public DerSequence(Asn1Encodable element)
: base(element)
{
}
/**
* create a sequence containing two objects
*/
public DerSequence(Asn1Encodable element1, Asn1Encodable element2)
: base(element1, element2)
{
}
public DerSequence(params Asn1Encodable[] elements)
: base(elements)
{
}
/**
* create a sequence containing a vector of objects.
*/
public DerSequence(Asn1EncodableVector elementVector)
: base(elementVector)
{
}
internal DerSequence(Asn1Encodable[] elements, bool clone)
: base(elements, clone)
{
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
return new ConstructedDLEncoding(Asn1Tags.Universal, Asn1Tags.Sequence,
Asn1OutputStream.GetContentsEncodings(Asn1OutputStream.EncodingDer, m_elements));
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
return new ConstructedDLEncoding(tagClass, tagNo,
Asn1OutputStream.GetContentsEncodings(Asn1OutputStream.EncodingDer, m_elements));
}
internal sealed override DerEncoding GetEncodingDer()
{
return new ConstructedDerEncoding(Asn1Tags.Universal, Asn1Tags.Sequence,
Asn1OutputStream.GetContentsEncodingsDer(m_elements));
}
internal sealed override DerEncoding GetEncodingDerImplicit(int tagClass, int tagNo)
{
return new ConstructedDerEncoding(tagClass, tagNo,
Asn1OutputStream.GetContentsEncodingsDer(m_elements));
}
internal override DerBitString ToAsn1BitString()
{
return new DerBitString(BerBitString.FlattenBitStrings(GetConstructedBitStrings()), false);
}
internal override DerExternal ToAsn1External()
{
return new DerExternal(this);
}
internal override Asn1OctetString ToAsn1OctetString()
{
return new DerOctetString(BerOctetString.FlattenOctetStrings(GetConstructedOctetStrings()));
}
internal override Asn1Set ToAsn1Set()
{
// NOTE: DLSet is intentional, we don't want sorting
return new DLSet(false, m_elements);
}
internal static int GetEncodingLength(int contentsLength)
{
return Asn1OutputStream.GetLengthOfEncodingDL(Asn1Tags.Sequence, contentsLength);
}
}
}
|