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