1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Numerics;
6 using System.Security.Cryptography.Asn1;
7 using Xunit;
8 
9 namespace System.Security.Cryptography.Tests.Asn1
10 {
11     public class WriteInteger : Asn1WriterTests
12     {
13         [Theory]
14         [InlineData(PublicEncodingRules.BER, 0, "020100")]
15         [InlineData(PublicEncodingRules.CER, 0, "020100")]
16         [InlineData(PublicEncodingRules.DER, 0, "020100")]
17         [InlineData(PublicEncodingRules.BER, -1, "0201FF")]
18         [InlineData(PublicEncodingRules.CER, -1, "0201FF")]
19         [InlineData(PublicEncodingRules.DER, -1, "0201FF")]
20         [InlineData(PublicEncodingRules.BER, -2, "0201FE")]
21         [InlineData(PublicEncodingRules.DER, sbyte.MinValue, "020180")]
22         [InlineData(PublicEncodingRules.BER, sbyte.MinValue + 1, "020181")]
23         [InlineData(PublicEncodingRules.CER, sbyte.MinValue - 1, "0202FF7F")]
24         [InlineData(PublicEncodingRules.DER, sbyte.MinValue - 2, "0202FF7E")]
25         [InlineData(PublicEncodingRules.BER, -256, "0202FF00")]
26         [InlineData(PublicEncodingRules.CER, -257, "0202FEFF")]
27         [InlineData(PublicEncodingRules.DER, short.MinValue, "02028000")]
28         [InlineData(PublicEncodingRules.BER, short.MinValue + 1, "02028001")]
29         [InlineData(PublicEncodingRules.CER, short.MinValue + byte.MaxValue, "020280FF")]
30         [InlineData(PublicEncodingRules.DER, short.MinValue - 1, "0203FF7FFF")]
31         [InlineData(PublicEncodingRules.BER, short.MinValue - 2, "0203FF7FFE")]
32         [InlineData(PublicEncodingRules.CER, -65281, "0203FF00FF")]
33         [InlineData(PublicEncodingRules.DER, -8388608, "0203800000")]
34         [InlineData(PublicEncodingRules.BER, -8388607, "0203800001")]
35         [InlineData(PublicEncodingRules.CER, -8388609, "0204FF7FFFFF")]
36         [InlineData(PublicEncodingRules.DER, -16777216, "0204FF000000")]
37         [InlineData(PublicEncodingRules.BER, -16777217, "0204FEFFFFFF")]
38         [InlineData(PublicEncodingRules.CER, int.MinValue, "020480000000")]
39         [InlineData(PublicEncodingRules.DER, int.MinValue + 1, "020480000001")]
40         [InlineData(PublicEncodingRules.BER, (long)int.MinValue - 1, "0205FF7FFFFFFF")]
41         [InlineData(PublicEncodingRules.CER, (long)int.MinValue - 2, "0205FF7FFFFFFE")]
42         [InlineData(PublicEncodingRules.DER, -4294967296, "0205FF00000000")]
43         [InlineData(PublicEncodingRules.BER, -4294967295, "0205FF00000001")]
44         [InlineData(PublicEncodingRules.CER, -4294967294, "0205FF00000002")]
45         [InlineData(PublicEncodingRules.DER, -4294967297, "0205FEFFFFFFFF")]
46         [InlineData(PublicEncodingRules.BER, -549755813888, "02058000000000")]
47         [InlineData(PublicEncodingRules.CER, -549755813887, "02058000000001")]
48         [InlineData(PublicEncodingRules.DER, -549755813889, "0206FF7FFFFFFFFF")]
49         [InlineData(PublicEncodingRules.BER, -549755813890, "0206FF7FFFFFFFFE")]
50         [InlineData(PublicEncodingRules.CER, -140737488355328, "0206800000000000")]
51         [InlineData(PublicEncodingRules.DER, -140737488355327, "0206800000000001")]
52         [InlineData(PublicEncodingRules.BER, -140737488355329, "0207FF7FFFFFFFFFFF")]
53         [InlineData(PublicEncodingRules.CER, -281474976710656, "0207FF000000000000")]
54         [InlineData(PublicEncodingRules.DER, -281474976710655, "0207FF000000000001")]
55         [InlineData(PublicEncodingRules.BER, -281474976710657, "0207FEFFFFFFFFFFFF")]
56         [InlineData(PublicEncodingRules.CER, -36028797018963968, "020780000000000000")]
57         [InlineData(PublicEncodingRules.DER, -36028797018963967, "020780000000000001")]
58         [InlineData(PublicEncodingRules.DER, -36028797018963969, "0208FF7FFFFFFFFFFFFF")]
59         [InlineData(PublicEncodingRules.BER, -36028797018963970, "0208FF7FFFFFFFFFFFFE")]
60         [InlineData(PublicEncodingRules.CER, -72057594037927936, "0208FF00000000000000")]
61         [InlineData(PublicEncodingRules.DER, -72057594037927935, "0208FF00000000000001")]
62         [InlineData(PublicEncodingRules.BER, -72057594037927937, "0208FEFFFFFFFFFFFFFF")]
63         [InlineData(PublicEncodingRules.CER, long.MinValue + 1, "02088000000000000001")]
64         [InlineData(PublicEncodingRules.DER, long.MinValue, "02088000000000000000")]
65         [InlineData(PublicEncodingRules.BER, 1, "020101")]
66         [InlineData(PublicEncodingRules.CER, 127, "02017F")]
67         [InlineData(PublicEncodingRules.DER, 126, "02017E")]
68         [InlineData(PublicEncodingRules.BER, 128, "02020080")]
69         [InlineData(PublicEncodingRules.CER, 129, "02020081")]
70         [InlineData(PublicEncodingRules.DER, 254, "020200FE")]
71         [InlineData(PublicEncodingRules.BER, 255, "020200FF")]
72         [InlineData(PublicEncodingRules.CER, 256, "02020100")]
73         [InlineData(PublicEncodingRules.DER, 32767, "02027FFF")]
74         [InlineData(PublicEncodingRules.BER, 32766, "02027FFE")]
75         [InlineData(PublicEncodingRules.CER, 32768, "0203008000")]
76         [InlineData(PublicEncodingRules.DER, 32769, "0203008001")]
77         [InlineData(PublicEncodingRules.BER, 65535, "020300FFFF")]
78         [InlineData(PublicEncodingRules.CER, 65534, "020300FFFE")]
79         [InlineData(PublicEncodingRules.DER, 65536, "0203010000")]
80         [InlineData(PublicEncodingRules.BER, 65537, "0203010001")]
81         [InlineData(PublicEncodingRules.CER, 8388607, "02037FFFFF")]
82         [InlineData(PublicEncodingRules.DER, 8388606, "02037FFFFE")]
83         [InlineData(PublicEncodingRules.BER, 8388608, "020400800000")]
84         [InlineData(PublicEncodingRules.CER, 8388609, "020400800001")]
85         [InlineData(PublicEncodingRules.DER, 16777215, "020400FFFFFF")]
86         [InlineData(PublicEncodingRules.BER, 16777214, "020400FFFFFE")]
87         [InlineData(PublicEncodingRules.CER, 16777216, "020401000000")]
88         [InlineData(PublicEncodingRules.DER, 16777217, "020401000001")]
89         [InlineData(PublicEncodingRules.BER, 2147483647, "02047FFFFFFF")]
90         [InlineData(PublicEncodingRules.CER, 2147483646, "02047FFFFFFE")]
91         [InlineData(PublicEncodingRules.DER, 2147483648, "02050080000000")]
92         [InlineData(PublicEncodingRules.BER, 2147483649, "02050080000001")]
93         [InlineData(PublicEncodingRules.BER, 4294967295, "020500FFFFFFFF")]
94         [InlineData(PublicEncodingRules.CER, 4294967294, "020500FFFFFFFE")]
95         [InlineData(PublicEncodingRules.DER, 4294967296, "02050100000000")]
96         [InlineData(PublicEncodingRules.BER, 4294967297, "02050100000001")]
97         [InlineData(PublicEncodingRules.CER, 549755813887, "02057FFFFFFFFF")]
98         [InlineData(PublicEncodingRules.DER, 549755813886, "02057FFFFFFFFE")]
99         [InlineData(PublicEncodingRules.BER, 549755813888, "0206008000000000")]
100         [InlineData(PublicEncodingRules.CER, 549755813889, "0206008000000001")]
101         [InlineData(PublicEncodingRules.DER, 1099511627775, "020600FFFFFFFFFF")]
102         [InlineData(PublicEncodingRules.BER, 1099511627774, "020600FFFFFFFFFE")]
103         [InlineData(PublicEncodingRules.CER, 1099511627776, "0206010000000000")]
104         [InlineData(PublicEncodingRules.DER, 1099511627777, "0206010000000001")]
105         [InlineData(PublicEncodingRules.BER, 140737488355327, "02067FFFFFFFFFFF")]
106         [InlineData(PublicEncodingRules.CER, 140737488355326, "02067FFFFFFFFFFE")]
107         [InlineData(PublicEncodingRules.DER, 140737488355328, "020700800000000000")]
108         [InlineData(PublicEncodingRules.BER, 140737488355329, "020700800000000001")]
109         [InlineData(PublicEncodingRules.CER, 281474976710655, "020700FFFFFFFFFFFF")]
110         [InlineData(PublicEncodingRules.DER, 281474976710654, "020700FFFFFFFFFFFE")]
111         [InlineData(PublicEncodingRules.BER, 281474976710656, "020701000000000000")]
112         [InlineData(PublicEncodingRules.CER, 281474976710657, "020701000000000001")]
113         [InlineData(PublicEncodingRules.DER, 36028797018963967, "02077FFFFFFFFFFFFF")]
114         [InlineData(PublicEncodingRules.BER, 36028797018963966, "02077FFFFFFFFFFFFE")]
115         [InlineData(PublicEncodingRules.CER, 36028797018963968, "02080080000000000000")]
116         [InlineData(PublicEncodingRules.DER, 36028797018963969, "02080080000000000001")]
117         [InlineData(PublicEncodingRules.BER, 72057594037927935, "020800FFFFFFFFFFFFFF")]
118         [InlineData(PublicEncodingRules.CER, 72057594037927934, "020800FFFFFFFFFFFFFE")]
119         [InlineData(PublicEncodingRules.DER, 72057594037927936, "02080100000000000000")]
120         [InlineData(PublicEncodingRules.BER, 72057594037927937, "02080100000000000001")]
121         [InlineData(PublicEncodingRules.CER, 9223372036854775807, "02087FFFFFFFFFFFFFFF")]
122         [InlineData(PublicEncodingRules.DER, 9223372036854775806, "02087FFFFFFFFFFFFFFE")]
VerifyWriteInteger_Long(PublicEncodingRules ruleSet, long value, string expectedHex)123         public void VerifyWriteInteger_Long(PublicEncodingRules ruleSet, long value, string expectedHex)
124         {
125             using (AsnWriter writer = new AsnWriter((AsnEncodingRules)ruleSet))
126             {
127                 writer.WriteInteger(value);
128 
129                 Verify(writer, expectedHex);
130             }
131         }
132 
133         [Theory]
134         [InlineData(PublicEncodingRules.BER, 0, "020100")]
135         [InlineData(PublicEncodingRules.CER, 0, "020100")]
136         [InlineData(PublicEncodingRules.DER, 0, "020100")]
137         [InlineData(PublicEncodingRules.BER, 1, "020101")]
138         [InlineData(PublicEncodingRules.CER, 127, "02017F")]
139         [InlineData(PublicEncodingRules.DER, 126, "02017E")]
140         [InlineData(PublicEncodingRules.BER, 128, "02020080")]
141         [InlineData(PublicEncodingRules.CER, 129, "02020081")]
142         [InlineData(PublicEncodingRules.DER, 254, "020200FE")]
143         [InlineData(PublicEncodingRules.BER, 255, "020200FF")]
144         [InlineData(PublicEncodingRules.CER, 256, "02020100")]
145         [InlineData(PublicEncodingRules.DER, 32767, "02027FFF")]
146         [InlineData(PublicEncodingRules.BER, 32766, "02027FFE")]
147         [InlineData(PublicEncodingRules.CER, 32768, "0203008000")]
148         [InlineData(PublicEncodingRules.DER, 32769, "0203008001")]
149         [InlineData(PublicEncodingRules.BER, 65535, "020300FFFF")]
150         [InlineData(PublicEncodingRules.CER, 65534, "020300FFFE")]
151         [InlineData(PublicEncodingRules.DER, 65536, "0203010000")]
152         [InlineData(PublicEncodingRules.BER, 65537, "0203010001")]
153         [InlineData(PublicEncodingRules.CER, 8388607, "02037FFFFF")]
154         [InlineData(PublicEncodingRules.DER, 8388606, "02037FFFFE")]
155         [InlineData(PublicEncodingRules.BER, 8388608, "020400800000")]
156         [InlineData(PublicEncodingRules.CER, 8388609, "020400800001")]
157         [InlineData(PublicEncodingRules.DER, 16777215, "020400FFFFFF")]
158         [InlineData(PublicEncodingRules.BER, 16777214, "020400FFFFFE")]
159         [InlineData(PublicEncodingRules.CER, 16777216, "020401000000")]
160         [InlineData(PublicEncodingRules.DER, 16777217, "020401000001")]
161         [InlineData(PublicEncodingRules.BER, 2147483647, "02047FFFFFFF")]
162         [InlineData(PublicEncodingRules.CER, 2147483646, "02047FFFFFFE")]
163         [InlineData(PublicEncodingRules.DER, 2147483648, "02050080000000")]
164         [InlineData(PublicEncodingRules.BER, 2147483649, "02050080000001")]
165         [InlineData(PublicEncodingRules.BER, 4294967295, "020500FFFFFFFF")]
166         [InlineData(PublicEncodingRules.CER, 4294967294, "020500FFFFFFFE")]
167         [InlineData(PublicEncodingRules.DER, 4294967296, "02050100000000")]
168         [InlineData(PublicEncodingRules.BER, 4294967297, "02050100000001")]
169         [InlineData(PublicEncodingRules.CER, 549755813887, "02057FFFFFFFFF")]
170         [InlineData(PublicEncodingRules.DER, 549755813886, "02057FFFFFFFFE")]
171         [InlineData(PublicEncodingRules.BER, 549755813888, "0206008000000000")]
172         [InlineData(PublicEncodingRules.CER, 549755813889, "0206008000000001")]
173         [InlineData(PublicEncodingRules.DER, 1099511627775, "020600FFFFFFFFFF")]
174         [InlineData(PublicEncodingRules.BER, 1099511627774, "020600FFFFFFFFFE")]
175         [InlineData(PublicEncodingRules.CER, 1099511627776, "0206010000000000")]
176         [InlineData(PublicEncodingRules.DER, 1099511627777, "0206010000000001")]
177         [InlineData(PublicEncodingRules.BER, 140737488355327, "02067FFFFFFFFFFF")]
178         [InlineData(PublicEncodingRules.CER, 140737488355326, "02067FFFFFFFFFFE")]
179         [InlineData(PublicEncodingRules.DER, 140737488355328, "020700800000000000")]
180         [InlineData(PublicEncodingRules.BER, 140737488355329, "020700800000000001")]
181         [InlineData(PublicEncodingRules.CER, 281474976710655, "020700FFFFFFFFFFFF")]
182         [InlineData(PublicEncodingRules.DER, 281474976710654, "020700FFFFFFFFFFFE")]
183         [InlineData(PublicEncodingRules.BER, 281474976710656, "020701000000000000")]
184         [InlineData(PublicEncodingRules.CER, 281474976710657, "020701000000000001")]
185         [InlineData(PublicEncodingRules.DER, 36028797018963967, "02077FFFFFFFFFFFFF")]
186         [InlineData(PublicEncodingRules.BER, 36028797018963966, "02077FFFFFFFFFFFFE")]
187         [InlineData(PublicEncodingRules.CER, 36028797018963968, "02080080000000000000")]
188         [InlineData(PublicEncodingRules.DER, 36028797018963969, "02080080000000000001")]
189         [InlineData(PublicEncodingRules.BER, 72057594037927935, "020800FFFFFFFFFFFFFF")]
190         [InlineData(PublicEncodingRules.CER, 72057594037927934, "020800FFFFFFFFFFFFFE")]
191         [InlineData(PublicEncodingRules.DER, 72057594037927936, "02080100000000000000")]
192         [InlineData(PublicEncodingRules.BER, 72057594037927937, "02080100000000000001")]
193         [InlineData(PublicEncodingRules.CER, 9223372036854775807, "02087FFFFFFFFFFFFFFF")]
194         [InlineData(PublicEncodingRules.DER, 9223372036854775806, "02087FFFFFFFFFFFFFFE")]
195         [InlineData(PublicEncodingRules.BER, 9223372036854775808, "0209008000000000000000")]
196         [InlineData(PublicEncodingRules.CER, 9223372036854775809, "0209008000000000000001")]
197         [InlineData(PublicEncodingRules.DER, ulong.MaxValue, "020900FFFFFFFFFFFFFFFF")]
198         [InlineData(PublicEncodingRules.BER, ulong.MaxValue-1, "020900FFFFFFFFFFFFFFFE")]
VerifyWriteInteger_ULong(PublicEncodingRules ruleSet, ulong value, string expectedHex)199         public void VerifyWriteInteger_ULong(PublicEncodingRules ruleSet, ulong value, string expectedHex)
200         {
201             using (AsnWriter writer = new AsnWriter((AsnEncodingRules)ruleSet))
202             {
203                 writer.WriteInteger(value);
204 
205                 Verify(writer, expectedHex);
206             }
207         }
208 
209         [Theory]
210         [InlineData(PublicEncodingRules.BER, "0", "020100")]
211         [InlineData(PublicEncodingRules.CER, "127", "02017F")]
212         [InlineData(PublicEncodingRules.DER, "128", "02020080")]
213         [InlineData(PublicEncodingRules.BER, "32767", "02027FFF")]
214         [InlineData(PublicEncodingRules.CER, "32768", "0203008000")]
215         [InlineData(PublicEncodingRules.DER, "9223372036854775807", "02087FFFFFFFFFFFFFFF")]
216         [InlineData(PublicEncodingRules.BER, "9223372036854775808", "0209008000000000000000")]
217         [InlineData(PublicEncodingRules.CER, "18446744073709551615", "020900FFFFFFFFFFFFFFFF")]
218         [InlineData(PublicEncodingRules.DER, "18446744073709551616", "0209010000000000000000")]
219         [InlineData(PublicEncodingRules.BER, "1339673755198158349044581307228491520", "02100102030405060708090A0B0C0D0E0F00")]
220         [InlineData(PublicEncodingRules.CER, "320182027492359845421654932427609477120", "021100F0E0D0C0B0A090807060504030201000")]
221         [InlineData(PublicEncodingRules.DER, "-1339673755198158349044581307228491520", "0210FEFDFCFBFAF9F8F7F6F5F4F3F2F1F100")]
VerifyWriteInteger_BigInteger(PublicEncodingRules ruleSet, string decimalValue, string expectedHex)222         public void VerifyWriteInteger_BigInteger(PublicEncodingRules ruleSet, string decimalValue, string expectedHex)
223         {
224             BigInteger value = BigInteger.Parse(decimalValue);
225 
226             using (AsnWriter writer = new AsnWriter((AsnEncodingRules)ruleSet))
227             {
228                 writer.WriteInteger(value);
229 
230                 Verify(writer, expectedHex);
231             }
232         }
233 
234         [Theory]
235         [InlineData(PublicEncodingRules.BER, 0, "470100")]
236         [InlineData(PublicEncodingRules.CER, long.MinValue + 1, "47088000000000000001")]
237         [InlineData(PublicEncodingRules.DER, 9223372036854775806, "47087FFFFFFFFFFFFFFE")]
VerifyWriteInteger_Application7_Long(PublicEncodingRules ruleSet, long value, string expectedHex)238         public void VerifyWriteInteger_Application7_Long(PublicEncodingRules ruleSet, long value, string expectedHex)
239         {
240             using (AsnWriter writer = new AsnWriter((AsnEncodingRules)ruleSet))
241             {
242                 writer.WriteInteger(new Asn1Tag(TagClass.Application, 7), value);
243 
244                 Verify(writer, expectedHex);
245             }
246         }
247 
248         [Theory]
249         [InlineData(PublicEncodingRules.BER, 0, "890100")]
250         [InlineData(PublicEncodingRules.CER, 9223372036854775809, "8909008000000000000001")]
251         [InlineData(PublicEncodingRules.DER, 9223372036854775806, "89087FFFFFFFFFFFFFFE")]
VerifyWriteInteger_Context9_ULong(PublicEncodingRules ruleSet, ulong value, string expectedHex)252         public void VerifyWriteInteger_Context9_ULong(PublicEncodingRules ruleSet, ulong value, string expectedHex)
253         {
254             using (AsnWriter writer = new AsnWriter((AsnEncodingRules)ruleSet))
255             {
256                 writer.WriteInteger(new Asn1Tag(TagClass.ContextSpecific, 9), value);
257 
258                 Verify(writer, expectedHex);
259             }
260         }
261 
262         [Theory]
263         [InlineData(PublicEncodingRules.BER, 0, "D00100")]
264         [InlineData(PublicEncodingRules.BER, "1339673755198158349044581307228491520", "D0100102030405060708090A0B0C0D0E0F00")]
265         [InlineData(PublicEncodingRules.CER, "320182027492359845421654932427609477120", "D01100F0E0D0C0B0A090807060504030201000")]
266         [InlineData(PublicEncodingRules.DER, "-1339673755198158349044581307228491520", "D010FEFDFCFBFAF9F8F7F6F5F4F3F2F1F100")]
VerifyWriteInteger_Private16_BigInteger( PublicEncodingRules ruleSet, string decimalValue, string expectedHex)267         public void VerifyWriteInteger_Private16_BigInteger(
268             PublicEncodingRules ruleSet,
269             string decimalValue,
270             string expectedHex)
271         {
272             BigInteger value = BigInteger.Parse(decimalValue);
273 
274             using (AsnWriter writer = new AsnWriter((AsnEncodingRules)ruleSet))
275             {
276                 writer.WriteInteger(new Asn1Tag(TagClass.Private, 16), value);
277 
278                 Verify(writer, expectedHex);
279             }
280         }
281 
282         [Theory]
283         [InlineData(PublicEncodingRules.BER)]
284         [InlineData(PublicEncodingRules.CER)]
285         [InlineData(PublicEncodingRules.DER)]
VerifyWriteInteger_EndOfContents(PublicEncodingRules ruleSet)286         public void VerifyWriteInteger_EndOfContents(PublicEncodingRules ruleSet)
287         {
288             using (AsnWriter writer = new AsnWriter((AsnEncodingRules)ruleSet))
289             {
290                 AssertExtensions.Throws<ArgumentException>(
291                     "tag",
292                     () => writer.WriteInteger(Asn1Tag.EndOfContents, 0L));
293 
294                 AssertExtensions.Throws<ArgumentException>(
295                     "tag",
296                     () => writer.WriteInteger(Asn1Tag.EndOfContents, 0UL));
297 
298                 AssertExtensions.Throws<ArgumentException>(
299                     "tag",
300                     () => writer.WriteInteger(Asn1Tag.EndOfContents, BigInteger.Zero));
301             }
302         }
303 
304         [Theory]
305         [InlineData(PublicEncodingRules.BER)]
306         [InlineData(PublicEncodingRules.CER)]
307         [InlineData(PublicEncodingRules.DER)]
VerifyWriteInteger_ConstructedIgnored(PublicEncodingRules ruleSet)308         public void VerifyWriteInteger_ConstructedIgnored(PublicEncodingRules ruleSet)
309         {
310             using (AsnWriter writer = new AsnWriter((AsnEncodingRules)ruleSet))
311             {
312                 writer.WriteInteger(new Asn1Tag(UniversalTagNumber.Integer, isConstructed: true), 0L);
313                 writer.WriteInteger(new Asn1Tag(TagClass.ContextSpecific, 0, isConstructed: true), 0L);
314                 writer.WriteInteger(new Asn1Tag(UniversalTagNumber.Integer, isConstructed: true), 0UL);
315                 writer.WriteInteger(new Asn1Tag(TagClass.ContextSpecific, 0, isConstructed: true), 0UL);
316                 writer.WriteInteger(new Asn1Tag(UniversalTagNumber.Integer, isConstructed: true), BigInteger.Zero);
317                 writer.WriteInteger(new Asn1Tag(TagClass.ContextSpecific, 0, isConstructed: true), BigInteger.Zero);
318 
319                 Verify(writer, "020100800100020100800100020100800100");
320             }
321         }
322     }
323 }
324