1 /* $NetBSD: check-gen.c,v 1.2 2017/01/28 21:31:45 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1999 - 2005 Kungliga Tekniska Högskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Portions Copyright (c) 2009 Apple Inc. All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 21 * 3. Neither the name of the Institute nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 */ 37 38 #include <config.h> 39 #include <stdio.h> 40 #include <string.h> 41 #include <err.h> 42 #include <krb5/roken.h> 43 44 #include <krb5/asn1-common.h> 45 #include <krb5/asn1_err.h> 46 #include <krb5/der.h> 47 #include <krb5/krb5_asn1.h> 48 #include <krb5/heim_asn1.h> 49 #include <krb5/rfc2459_asn1.h> 50 #include <test_asn1.h> 51 #include <krb5/cms_asn1.h> 52 53 #include "check-common.h" 54 55 static char *lha_principal[] = { "lha" }; 56 static char *lharoot_princ[] = { "lha", "root" }; 57 static char *datan_princ[] = { "host", "nutcracker.e.kth.se" }; 58 static char *nada_tgt_principal[] = { "krbtgt", "NADA.KTH.SE" }; 59 60 static int 61 cmp_principal (void *a, void *b) 62 { 63 Principal *pa = a; 64 Principal *pb = b; 65 int i; 66 67 COMPARE_STRING(pa,pb,realm); 68 COMPARE_INTEGER(pa,pb,name.name_type); 69 COMPARE_INTEGER(pa,pb,name.name_string.len); 70 71 for (i = 0; i < pa->name.name_string.len; i++) 72 COMPARE_STRING(pa,pb,name.name_string.val[i]); 73 74 return 0; 75 } 76 77 static int 78 test_principal (void) 79 { 80 81 struct test_case tests[] = { 82 { NULL, 29, 83 "\x30\x1b\xa0\x10\x30\x0e\xa0\x03\x02\x01\x01\xa1\x07\x30\x05\x1b" 84 "\x03\x6c\x68\x61\xa1\x07\x1b\x05\x53\x55\x2e\x53\x45", 85 NULL 86 }, 87 { NULL, 35, 88 "\x30\x21\xa0\x16\x30\x14\xa0\x03\x02\x01\x01\xa1\x0d\x30\x0b\x1b" 89 "\x03\x6c\x68\x61\x1b\x04\x72\x6f\x6f\x74\xa1\x07\x1b\x05\x53\x55" 90 "\x2e\x53\x45", 91 NULL 92 }, 93 { NULL, 54, 94 "\x30\x34\xa0\x26\x30\x24\xa0\x03\x02\x01\x03\xa1\x1d\x30\x1b\x1b" 95 "\x04\x68\x6f\x73\x74\x1b\x13\x6e\x75\x74\x63\x72\x61\x63\x6b\x65" 96 "\x72\x2e\x65\x2e\x6b\x74\x68\x2e\x73\x65\xa1\x0a\x1b\x08\x45\x2e" 97 "\x4b\x54\x48\x2e\x53\x45", 98 NULL 99 } 100 }; 101 102 103 Principal values[] = { 104 { { KRB5_NT_PRINCIPAL, { 1, lha_principal } }, "SU.SE" }, 105 { { KRB5_NT_PRINCIPAL, { 2, lharoot_princ } }, "SU.SE" }, 106 { { KRB5_NT_SRV_HST, { 2, datan_princ } }, "E.KTH.SE" } 107 }; 108 int i, ret; 109 int ntests = sizeof(tests) / sizeof(*tests); 110 111 for (i = 0; i < ntests; ++i) { 112 tests[i].val = &values[i]; 113 if (asprintf (&tests[i].name, "Principal %d", i) < 0) 114 errx(1, "malloc"); 115 if (tests[i].name == NULL) 116 errx(1, "malloc"); 117 } 118 119 ret = generic_test (tests, ntests, sizeof(Principal), 120 (generic_encode)encode_Principal, 121 (generic_length)length_Principal, 122 (generic_decode)decode_Principal, 123 (generic_free)free_Principal, 124 cmp_principal, 125 NULL); 126 for (i = 0; i < ntests; ++i) 127 free (tests[i].name); 128 129 return ret; 130 } 131 132 static int 133 cmp_authenticator (void *a, void *b) 134 { 135 Authenticator *aa = a; 136 Authenticator *ab = b; 137 int i; 138 139 COMPARE_INTEGER(aa,ab,authenticator_vno); 140 COMPARE_STRING(aa,ab,crealm); 141 142 COMPARE_INTEGER(aa,ab,cname.name_type); 143 COMPARE_INTEGER(aa,ab,cname.name_string.len); 144 145 for (i = 0; i < aa->cname.name_string.len; i++) 146 COMPARE_STRING(aa,ab,cname.name_string.val[i]); 147 148 return 0; 149 } 150 151 static int 152 test_authenticator (void) 153 { 154 struct test_case tests[] = { 155 { NULL, 63, 156 "\x62\x3d\x30\x3b\xa0\x03\x02\x01\x05\xa1\x0a\x1b\x08" 157 "\x45\x2e\x4b\x54\x48\x2e\x53\x45\xa2\x10\x30\x0e\xa0" 158 "\x03\x02\x01\x01\xa1\x07\x30\x05\x1b\x03\x6c\x68\x61" 159 "\xa4\x03\x02\x01\x0a\xa5\x11\x18\x0f\x31\x39\x37\x30" 160 "\x30\x31\x30\x31\x30\x30\x30\x31\x33\x39\x5a", 161 NULL 162 }, 163 { NULL, 67, 164 "\x62\x41\x30\x3f\xa0\x03\x02\x01\x05\xa1\x07\x1b\x05" 165 "\x53\x55\x2e\x53\x45\xa2\x16\x30\x14\xa0\x03\x02\x01" 166 "\x01\xa1\x0d\x30\x0b\x1b\x03\x6c\x68\x61\x1b\x04\x72" 167 "\x6f\x6f\x74\xa4\x04\x02\x02\x01\x24\xa5\x11\x18\x0f" 168 "\x31\x39\x37\x30\x30\x31\x30\x31\x30\x30\x31\x36\x33" 169 "\x39\x5a", 170 NULL 171 } 172 }; 173 174 Authenticator values[] = { 175 { 5, "E.KTH.SE", { KRB5_NT_PRINCIPAL, { 1, lha_principal } }, 176 NULL, 10, 99, NULL, NULL, NULL }, 177 { 5, "SU.SE", { KRB5_NT_PRINCIPAL, { 2, lharoot_princ } }, 178 NULL, 292, 999, NULL, NULL, NULL } 179 }; 180 int i, ret; 181 int ntests = sizeof(tests) / sizeof(*tests); 182 183 for (i = 0; i < ntests; ++i) { 184 tests[i].val = &values[i]; 185 if (asprintf (&tests[i].name, "Authenticator %d", i) < 0) 186 errx(1, "malloc"); 187 if (tests[i].name == NULL) 188 errx(1, "malloc"); 189 } 190 191 ret = generic_test (tests, ntests, sizeof(Authenticator), 192 (generic_encode)encode_Authenticator, 193 (generic_length)length_Authenticator, 194 (generic_decode)decode_Authenticator, 195 (generic_free)free_Authenticator, 196 cmp_authenticator, 197 (generic_copy)copy_Authenticator); 198 for (i = 0; i < ntests; ++i) 199 free(tests[i].name); 200 201 return ret; 202 } 203 204 static int 205 cmp_KRB_ERROR (void *a, void *b) 206 { 207 KRB_ERROR *aa = a; 208 KRB_ERROR *ab = b; 209 int i; 210 211 COMPARE_INTEGER(aa,ab,pvno); 212 COMPARE_INTEGER(aa,ab,msg_type); 213 214 IF_OPT_COMPARE(aa,ab,ctime) { 215 COMPARE_INTEGER(aa,ab,ctime); 216 } 217 IF_OPT_COMPARE(aa,ab,cusec) { 218 COMPARE_INTEGER(aa,ab,cusec); 219 } 220 COMPARE_INTEGER(aa,ab,stime); 221 COMPARE_INTEGER(aa,ab,susec); 222 COMPARE_INTEGER(aa,ab,error_code); 223 224 IF_OPT_COMPARE(aa,ab,crealm) { 225 COMPARE_OPT_STRING(aa,ab,crealm); 226 } 227 #if 0 228 IF_OPT_COMPARE(aa,ab,cname) { 229 COMPARE_OPT_STRING(aa,ab,cname); 230 } 231 #endif 232 COMPARE_STRING(aa,ab,realm); 233 234 COMPARE_INTEGER(aa,ab,sname.name_string.len); 235 for (i = 0; i < aa->sname.name_string.len; i++) 236 COMPARE_STRING(aa,ab,sname.name_string.val[i]); 237 238 IF_OPT_COMPARE(aa,ab,e_text) { 239 COMPARE_OPT_STRING(aa,ab,e_text); 240 } 241 IF_OPT_COMPARE(aa,ab,e_data) { 242 /* COMPARE_OPT_OCTET_STRING(aa,ab,e_data); */ 243 } 244 245 return 0; 246 } 247 248 static int 249 test_krb_error (void) 250 { 251 struct test_case tests[] = { 252 { NULL, 127, 253 "\x7e\x7d\x30\x7b\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x1e\xa4\x11" 254 "\x18\x0f\x32\x30\x30\x33\x31\x31\x32\x34\x30\x30\x31\x31\x31\x39" 255 "\x5a\xa5\x05\x02\x03\x04\xed\xa5\xa6\x03\x02\x01\x1f\xa7\x0d\x1b" 256 "\x0b\x4e\x41\x44\x41\x2e\x4b\x54\x48\x2e\x53\x45\xa8\x10\x30\x0e" 257 "\xa0\x03\x02\x01\x01\xa1\x07\x30\x05\x1b\x03\x6c\x68\x61\xa9\x0d" 258 "\x1b\x0b\x4e\x41\x44\x41\x2e\x4b\x54\x48\x2e\x53\x45\xaa\x20\x30" 259 "\x1e\xa0\x03\x02\x01\x01\xa1\x17\x30\x15\x1b\x06\x6b\x72\x62\x74" 260 "\x67\x74\x1b\x0b\x4e\x41\x44\x41\x2e\x4b\x54\x48\x2e\x53\x45", 261 "KRB-ERROR Test 1" 262 } 263 }; 264 int ntests = sizeof(tests) / sizeof(*tests); 265 KRB_ERROR e1; 266 PrincipalName lhaprincipalname = { 1, { 1, lha_principal } }; 267 PrincipalName tgtprincipalname = { 1, { 2, nada_tgt_principal } }; 268 char *realm = "NADA.KTH.SE"; 269 270 e1.pvno = 5; 271 e1.msg_type = 30; 272 e1.ctime = NULL; 273 e1.cusec = NULL; 274 e1.stime = 1069632679; 275 e1.susec = 322981; 276 e1.error_code = 31; 277 e1.crealm = &realm; 278 e1.cname = &lhaprincipalname; 279 e1.realm = "NADA.KTH.SE"; 280 e1.sname = tgtprincipalname; 281 e1.e_text = NULL; 282 e1.e_data = NULL; 283 284 tests[0].val = &e1; 285 286 return generic_test (tests, ntests, sizeof(KRB_ERROR), 287 (generic_encode)encode_KRB_ERROR, 288 (generic_length)length_KRB_ERROR, 289 (generic_decode)decode_KRB_ERROR, 290 (generic_free)free_KRB_ERROR, 291 cmp_KRB_ERROR, 292 (generic_copy)copy_KRB_ERROR); 293 } 294 295 static int 296 cmp_Name (void *a, void *b) 297 { 298 Name *aa = a; 299 Name *ab = b; 300 301 COMPARE_INTEGER(aa,ab,element); 302 303 return 0; 304 } 305 306 static int 307 test_Name (void) 308 { 309 struct test_case tests[] = { 310 { NULL, 35, 311 "\x30\x21\x31\x1f\x30\x0b\x06\x03\x55\x04\x03\x13\x04\x4c\x6f\x76" 312 "\x65\x30\x10\x06\x03\x55\x04\x07\x13\x09\x53\x54\x4f\x43\x4b\x48" 313 "\x4f\x4c\x4d", 314 "Name CN=Love+L=STOCKHOLM" 315 }, 316 { NULL, 35, 317 "\x30\x21\x31\x1f\x30\x0b\x06\x03\x55\x04\x03\x13\x04\x4c\x6f\x76" 318 "\x65\x30\x10\x06\x03\x55\x04\x07\x13\x09\x53\x54\x4f\x43\x4b\x48" 319 "\x4f\x4c\x4d", 320 "Name L=STOCKHOLM+CN=Love" 321 } 322 }; 323 324 int ntests = sizeof(tests) / sizeof(*tests); 325 Name n1, n2; 326 RelativeDistinguishedName rdn1[1]; 327 RelativeDistinguishedName rdn2[1]; 328 AttributeTypeAndValue atv1[2]; 329 AttributeTypeAndValue atv2[2]; 330 unsigned cmp_CN[] = { 2, 5, 4, 3 }; 331 unsigned cmp_L[] = { 2, 5, 4, 7 }; 332 333 /* n1 */ 334 n1.element = choice_Name_rdnSequence; 335 n1.u.rdnSequence.val = rdn1; 336 n1.u.rdnSequence.len = sizeof(rdn1)/sizeof(rdn1[0]); 337 rdn1[0].val = atv1; 338 rdn1[0].len = sizeof(atv1)/sizeof(atv1[0]); 339 340 atv1[0].type.length = sizeof(cmp_CN)/sizeof(cmp_CN[0]); 341 atv1[0].type.components = cmp_CN; 342 atv1[0].value.element = choice_DirectoryString_printableString; 343 atv1[0].value.u.printableString.data = "Love"; 344 atv1[0].value.u.printableString.length = 4; 345 346 atv1[1].type.length = sizeof(cmp_L)/sizeof(cmp_L[0]); 347 atv1[1].type.components = cmp_L; 348 atv1[1].value.element = choice_DirectoryString_printableString; 349 atv1[1].value.u.printableString.data = "STOCKHOLM"; 350 atv1[1].value.u.printableString.length = 9; 351 352 /* n2 */ 353 n2.element = choice_Name_rdnSequence; 354 n2.u.rdnSequence.val = rdn2; 355 n2.u.rdnSequence.len = sizeof(rdn2)/sizeof(rdn2[0]); 356 rdn2[0].val = atv2; 357 rdn2[0].len = sizeof(atv2)/sizeof(atv2[0]); 358 359 atv2[0].type.length = sizeof(cmp_L)/sizeof(cmp_L[0]); 360 atv2[0].type.components = cmp_L; 361 atv2[0].value.element = choice_DirectoryString_printableString; 362 atv2[0].value.u.printableString.data = "STOCKHOLM"; 363 atv2[0].value.u.printableString.length = 9; 364 365 atv2[1].type.length = sizeof(cmp_CN)/sizeof(cmp_CN[0]); 366 atv2[1].type.components = cmp_CN; 367 atv2[1].value.element = choice_DirectoryString_printableString; 368 atv2[1].value.u.printableString.data = "Love"; 369 atv2[1].value.u.printableString.length = 4; 370 371 /* */ 372 tests[0].val = &n1; 373 tests[1].val = &n2; 374 375 return generic_test (tests, ntests, sizeof(Name), 376 (generic_encode)encode_Name, 377 (generic_length)length_Name, 378 (generic_decode)decode_Name, 379 (generic_free)free_Name, 380 cmp_Name, 381 (generic_copy)copy_Name); 382 } 383 384 static int 385 cmp_KeyUsage (void *a, void *b) 386 { 387 KeyUsage *aa = a; 388 KeyUsage *ab = b; 389 390 return KeyUsage2int(*aa) != KeyUsage2int(*ab); 391 } 392 393 static int 394 test_bit_string (void) 395 { 396 struct test_case tests[] = { 397 { NULL, 4, 398 "\x03\x02\x07\x80", 399 "bitstring 1" 400 }, 401 { NULL, 4, 402 "\x03\x02\x05\xa0", 403 "bitstring 2" 404 }, 405 { NULL, 5, 406 "\x03\x03\x07\x00\x80", 407 "bitstring 3" 408 }, 409 { NULL, 3, 410 "\x03\x01\x00", 411 "bitstring 4" 412 } 413 }; 414 415 int ntests = sizeof(tests) / sizeof(*tests); 416 KeyUsage ku1, ku2, ku3, ku4; 417 418 memset(&ku1, 0, sizeof(ku1)); 419 ku1.digitalSignature = 1; 420 tests[0].val = &ku1; 421 422 memset(&ku2, 0, sizeof(ku2)); 423 ku2.digitalSignature = 1; 424 ku2.keyEncipherment = 1; 425 tests[1].val = &ku2; 426 427 memset(&ku3, 0, sizeof(ku3)); 428 ku3.decipherOnly = 1; 429 tests[2].val = &ku3; 430 431 memset(&ku4, 0, sizeof(ku4)); 432 tests[3].val = &ku4; 433 434 435 return generic_test (tests, ntests, sizeof(KeyUsage), 436 (generic_encode)encode_KeyUsage, 437 (generic_length)length_KeyUsage, 438 (generic_decode)decode_KeyUsage, 439 (generic_free)free_KeyUsage, 440 cmp_KeyUsage, 441 (generic_copy)copy_KeyUsage); 442 } 443 444 static int 445 cmp_TicketFlags (void *a, void *b) 446 { 447 TicketFlags *aa = a; 448 TicketFlags *ab = b; 449 450 return TicketFlags2int(*aa) != TicketFlags2int(*ab); 451 } 452 453 static int 454 test_bit_string_rfc1510 (void) 455 { 456 struct test_case tests[] = { 457 { NULL, 7, 458 "\x03\x05\x00\x80\x00\x00\x00", 459 "TF bitstring 1" 460 }, 461 { NULL, 7, 462 "\x03\x05\x00\x40\x20\x00\x00", 463 "TF bitstring 2" 464 }, 465 { NULL, 7, 466 "\x03\x05\x00\x00\x20\x00\x00", 467 "TF bitstring 3" 468 }, 469 { NULL, 7, 470 "\x03\x05\x00\x00\x00\x00\x00", 471 "TF bitstring 4" 472 } 473 }; 474 475 int ntests = sizeof(tests) / sizeof(*tests); 476 TicketFlags tf1, tf2, tf3, tf4; 477 478 memset(&tf1, 0, sizeof(tf1)); 479 tf1.reserved = 1; 480 tests[0].val = &tf1; 481 482 memset(&tf2, 0, sizeof(tf2)); 483 tf2.forwardable = 1; 484 tf2.pre_authent = 1; 485 tests[1].val = &tf2; 486 487 memset(&tf3, 0, sizeof(tf3)); 488 tf3.pre_authent = 1; 489 tests[2].val = &tf3; 490 491 memset(&tf4, 0, sizeof(tf4)); 492 tests[3].val = &tf4; 493 494 495 return generic_test (tests, ntests, sizeof(TicketFlags), 496 (generic_encode)encode_TicketFlags, 497 (generic_length)length_TicketFlags, 498 (generic_decode)decode_TicketFlags, 499 (generic_free)free_TicketFlags, 500 cmp_TicketFlags, 501 (generic_copy)copy_TicketFlags); 502 } 503 504 static int 505 cmp_KerberosTime (void *a, void *b) 506 { 507 KerberosTime *aa = a; 508 KerberosTime *ab = b; 509 510 return *aa != *ab; 511 } 512 513 static int 514 test_time (void) 515 { 516 struct test_case tests[] = { 517 { NULL, 17, 518 "\x18\x0f\x31\x39\x37\x30\x30\x31\x30\x31\x30\x31\x31\x38\x33\x31" 519 "\x5a", 520 "time 1" }, 521 { NULL, 17, 522 "\x18\x0f\x32\x30\x30\x39\x30\x35\x32\x34\x30\x32\x30\x32\x34\x30" 523 "\x5a", 524 "time 2" } 525 }; 526 527 int ntests = sizeof(tests) / sizeof(*tests); 528 KerberosTime times[] = { 529 4711, 530 1243130560 531 }; 532 533 tests[0].val = ×[0]; 534 tests[1].val = ×[1]; 535 536 return generic_test (tests, ntests, sizeof(KerberosTime), 537 (generic_encode)encode_KerberosTime, 538 (generic_length)length_KerberosTime, 539 (generic_decode)decode_KerberosTime, 540 (generic_free)free_KerberosTime, 541 cmp_KerberosTime, 542 (generic_copy)copy_KerberosTime); 543 } 544 545 struct { 546 const char *cert; 547 size_t len; 548 } certs[] = { 549 { 550 "\x30\x82\x02\x6c\x30\x82\x01\xd5\xa0\x03\x02\x01\x02\x02\x09\x00" 551 "\x99\x32\xde\x61\x0e\x40\x19\x8a\x30\x0d\x06\x09\x2a\x86\x48\x86" 552 "\xf7\x0d\x01\x01\x05\x05\x00\x30\x2a\x31\x1b\x30\x19\x06\x03\x55" 553 "\x04\x03\x0c\x12\x68\x78\x35\x30\x39\x20\x54\x65\x73\x74\x20\x52" 554 "\x6f\x6f\x74\x20\x43\x41\x31\x0b\x30\x09\x06\x03\x55\x04\x06\x13" 555 "\x02\x53\x45\x30\x1e\x17\x0d\x30\x39\x30\x34\x32\x36\x32\x30\x32" 556 "\x39\x34\x30\x5a\x17\x0d\x31\x39\x30\x34\x32\x34\x32\x30\x32\x39" 557 "\x34\x30\x5a\x30\x2a\x31\x1b\x30\x19\x06\x03\x55\x04\x03\x0c\x12" 558 "\x68\x78\x35\x30\x39\x20\x54\x65\x73\x74\x20\x52\x6f\x6f\x74\x20" 559 "\x43\x41\x31\x0b\x30\x09\x06\x03\x55\x04\x06\x13\x02\x53\x45\x30" 560 "\x81\x9f\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05" 561 "\x00\x03\x81\x8d\x00\x30\x81\x89\x02\x81\x81\x00\xb9\xd3\x1b\x67" 562 "\x1c\xf7\x5e\x26\x81\x3b\x82\xff\x03\xa4\x43\xb5\xb2\x63\x0b\x89" 563 "\x58\x43\xfe\x3d\xe0\x38\x7d\x93\x74\xbb\xad\x21\xa4\x29\xd9\x34" 564 "\x79\xf3\x1c\x8c\x5a\xd6\xb0\xd7\x19\xea\xcc\xaf\xe0\xa8\x40\x02" 565 "\x1d\x91\xf1\xac\x36\xb0\xfb\x08\xbd\xcc\x9a\xe1\xb7\x6e\xee\x0a" 566 "\x69\xbf\x6d\x2b\xee\x20\x82\x61\x06\xf2\x18\xcc\x89\x11\x64\x7e" 567 "\xb2\xff\x47\xd1\x3b\x52\x73\xeb\x5a\xc0\x03\xa6\x4b\xc7\x40\x7e" 568 "\xbc\xe1\x0e\x65\x44\x3f\x40\x8b\x02\x82\x54\x04\xd9\xcc\x2c\x67" 569 "\x01\xb6\x16\x82\xd8\x33\x53\x17\xd7\xde\x8d\x5d\x02\x03\x01\x00" 570 "\x01\xa3\x81\x99\x30\x81\x96\x30\x1d\x06\x03\x55\x1d\x0e\x04\x16" 571 "\x04\x14\x6e\x48\x13\xdc\xbf\x8b\x95\x4c\x13\xf3\x1f\x97\x30\xdd" 572 "\x27\x96\x59\x9b\x0e\x68\x30\x5a\x06\x03\x55\x1d\x23\x04\x53\x30" 573 "\x51\x80\x14\x6e\x48\x13\xdc\xbf\x8b\x95\x4c\x13\xf3\x1f\x97\x30" 574 "\xdd\x27\x96\x59\x9b\x0e\x68\xa1\x2e\xa4\x2c\x30\x2a\x31\x1b\x30" 575 "\x19\x06\x03\x55\x04\x03\x0c\x12\x68\x78\x35\x30\x39\x20\x54\x65" 576 "\x73\x74\x20\x52\x6f\x6f\x74\x20\x43\x41\x31\x0b\x30\x09\x06\x03" 577 "\x55\x04\x06\x13\x02\x53\x45\x82\x09\x00\x99\x32\xde\x61\x0e\x40" 578 "\x19\x8a\x30\x0c\x06\x03\x55\x1d\x13\x04\x05\x30\x03\x01\x01\xff" 579 "\x30\x0b\x06\x03\x55\x1d\x0f\x04\x04\x03\x02\x01\xe6\x30\x0d\x06" 580 "\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x81\x81\x00" 581 "\x52\x9b\xe4\x0e\xee\xc2\x5d\xb7\xf1\xba\x47\xe3\xfe\xaf\x3d\x51" 582 "\x10\xfd\xe8\x0d\x14\x58\x05\x36\xa7\xeb\xd8\x05\xe5\x27\x6f\x51" 583 "\xb8\xec\x90\xd9\x03\xe1\xbc\x9c\x93\x38\x21\x5c\xaf\x4e\x6c\x7b" 584 "\x6c\x65\xa9\x92\xcd\x94\xef\xa8\xae\x90\x12\x14\x78\x2d\xa3\x15" 585 "\xaa\x42\xf1\xd9\x44\x64\x2c\x3c\xc0\xbd\x3a\x48\xd8\x80\x45\x8b" 586 "\xd1\x79\x82\xe0\x0f\xdf\x08\x3c\x60\x21\x6f\x31\x47\x98\xae\x2f" 587 "\xcb\xb1\xa1\xb9\xc1\xa3\x71\x5e\x4a\xc2\x67\xdf\x66\x0a\x51\xb5" 588 "\xad\x60\x05\xdb\x02\xd4\x1a\xd2\xb9\x4e\x01\x08\x2b\xc3\x57\xaf", 589 624 }, 590 { 591 "\x30\x82\x02\x54\x30\x82\x01\xbd\xa0\x03\x02\x01\x02\x02\x01\x08" 592 "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05\x05\x00\x30" 593 "\x2a\x31\x1b\x30\x19\x06\x03\x55\x04\x03\x0c\x12\x68\x78\x35\x30" 594 "\x39\x20\x54\x65\x73\x74\x20\x52\x6f\x6f\x74\x20\x43\x41\x31\x0b" 595 "\x30\x09\x06\x03\x55\x04\x06\x13\x02\x53\x45\x30\x1e\x17\x0d\x30" 596 "\x39\x30\x34\x32\x36\x32\x30\x32\x39\x34\x30\x5a\x17\x0d\x31\x39" 597 "\x30\x34\x32\x34\x32\x30\x32\x39\x34\x30\x5a\x30\x1b\x31\x0b\x30" 598 "\x09\x06\x03\x55\x04\x06\x13\x02\x53\x45\x31\x0c\x30\x0a\x06\x03" 599 "\x55\x04\x03\x0c\x03\x6b\x64\x63\x30\x81\x9f\x30\x0d\x06\x09\x2a" 600 "\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x00\x30\x81" 601 "\x89\x02\x81\x81\x00\xd2\x41\x7a\xf8\x4b\x55\xb2\xaf\x11\xf9\x43" 602 "\x9b\x43\x81\x09\x3b\x9a\x94\xcf\x00\xf4\x85\x75\x92\xd7\x2a\xa5" 603 "\x11\xf1\xa8\x50\x6e\xc6\x84\x74\x24\x17\xda\x84\xc8\x03\x37\xb2" 604 "\x20\xf3\xba\xb5\x59\x36\x21\x4d\xab\x70\xe2\xc3\x09\x93\x68\x14" 605 "\x12\x79\xc5\xbb\x9e\x1b\x4a\xf0\xc6\x24\x59\x25\xc3\x1c\xa8\x70" 606 "\x66\x5b\x3e\x41\x8e\xe3\x25\x71\x9a\x94\xa0\x5b\x46\x91\x6f\xdd" 607 "\x58\x14\xec\x89\xe5\x8c\x96\xc5\x38\x60\xe4\xab\xf2\x75\xee\x6e" 608 "\x62\xfc\xe1\xbd\x03\x47\xff\xc4\xbe\x0f\xca\x70\x73\xe3\x74\x58" 609 "\x3a\x2f\x04\x2d\x39\x02\x03\x01\x00\x01\xa3\x81\x98\x30\x81\x95" 610 "\x30\x09\x06\x03\x55\x1d\x13\x04\x02\x30\x00\x30\x0b\x06\x03\x55" 611 "\x1d\x0f\x04\x04\x03\x02\x05\xe0\x30\x12\x06\x03\x55\x1d\x25\x04" 612 "\x0b\x30\x09\x06\x07\x2b\x06\x01\x05\x02\x03\x05\x30\x1d\x06\x03" 613 "\x55\x1d\x0e\x04\x16\x04\x14\x3a\xd3\x73\xff\xab\xdb\x7d\x8d\xc6" 614 "\x3a\xa2\x26\x3e\xae\x78\x95\x80\xc9\xe6\x31\x30\x48\x06\x03\x55" 615 "\x1d\x11\x04\x41\x30\x3f\xa0\x3d\x06\x06\x2b\x06\x01\x05\x02\x02" 616 "\xa0\x33\x30\x31\xa0\x0d\x1b\x0b\x54\x45\x53\x54\x2e\x48\x35\x4c" 617 "\x2e\x53\x45\xa1\x20\x30\x1e\xa0\x03\x02\x01\x01\xa1\x17\x30\x15" 618 "\x1b\x06\x6b\x72\x62\x74\x67\x74\x1b\x0b\x54\x45\x53\x54\x2e\x48" 619 "\x35\x4c\x2e\x53\x45\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01" 620 "\x01\x05\x05\x00\x03\x81\x81\x00\x83\xf4\x14\xa7\x6e\x59\xff\x80" 621 "\x64\xe7\xfa\xcf\x13\x80\x86\xe1\xed\x02\x38\xad\x96\x72\x25\xe5" 622 "\x06\x7a\x9a\xbc\x24\x74\xa9\x75\x55\xb2\x49\x80\x69\x45\x95\x4a" 623 "\x4c\x76\xa9\xe3\x4e\x49\xd3\xc2\x69\x5a\x95\x03\xeb\xba\x72\x23" 624 "\x9c\xfd\x3d\x8b\xc6\x07\x82\x3b\xf4\xf3\xef\x6c\x2e\x9e\x0b\xac" 625 "\x9e\x6c\xbb\x37\x4a\xa1\x9e\x73\xd1\xdc\x97\x61\xba\xfc\xd3\x49" 626 "\xa6\xc2\x4c\x55\x2e\x06\x37\x76\xb5\xef\x57\xe7\x57\x58\x8a\x71" 627 "\x63\xf3\xeb\xe7\x55\x68\x0d\xf6\x46\x4c\xfb\xf9\x43\xbb\x0c\x92" 628 "\x4f\x4e\x22\x7b\x63\xe8\x4f\x9c", 629 600 630 } 631 }; 632 633 static int 634 test_cert(void) 635 { 636 Certificate c, c2; 637 size_t size; 638 size_t i; 639 int ret; 640 641 for (i = 0; i < sizeof(certs)/sizeof(certs[0]); i++) { 642 643 ret = decode_Certificate((unsigned char *)certs[i].cert, 644 certs[i].len, &c, &size); 645 if (ret) 646 return ret; 647 648 ret = copy_Certificate(&c, &c2); 649 free_Certificate(&c); 650 if (ret) 651 return ret; 652 653 free_Certificate(&c2); 654 } 655 656 return 0; 657 } 658 659 struct { 660 const char *sd; 661 size_t len; 662 } signeddata[] = { 663 { 664 "\x30\x80\x02\x01\x03\x31\x0b\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a" 665 "\x05\x00\x30\x80\x06\x07\x2b\x06\x01\x05\x02\x03\x03\xa0\x80\x24" 666 "\x80\x04\x50\x30\x4e\xa0\x2b\x30\x29\xa0\x03\x02\x01\x12\xa1\x22" 667 "\x04\x20\x78\xf4\x86\x31\xc6\xc2\xc9\xcb\xef\x0c\xd7\x3a\x2a\xcd" 668 "\x8c\x13\x34\x83\xb1\x5c\xa8\xbe\xbf\x2f\xea\xd2\xbb\xd8\x8c\x18" 669 "\x47\x01\xa1\x1f\x30\x1d\xa0\x03\x02\x01\x0c\xa1\x16\x04\x14\xa6" 670 "\x2c\x52\xb2\x80\x98\x30\x40\xbc\x5f\xb0\x77\x2d\x8a\xd7\xa1\xda" 671 "\x3c\xc5\x62\x00\x00\x00\x00\x00\x00\xa0\x82\x02\x09\x30\x82\x02" 672 "\x05\x30\x82\x01\x6e\xa0\x03\x02\x01\x02\x02\x04\x49\x75\x57\xbf" 673 "\x30\x0b\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05\x30\x3b\x31" 674 "\x1f\x30\x1d\x06\x03\x55\x04\x03\x0c\x16\x63\x6f\x6d\x2e\x61\x70" 675 "\x70\x6c\x65\x2e\x6b\x65\x72\x62\x65\x72\x6f\x73\x2e\x6b\x64\x63" 676 "\x31\x18\x30\x16\x06\x03\x55\x04\x0a\x0c\x0f\x53\x79\x73\x74\x65" 677 "\x6d\x20\x49\x64\x65\x6e\x74\x69\x74\x79\x30\x1e\x17\x0d\x30\x39" 678 "\x31\x32\x30\x34\x30\x30\x32\x30\x32\x34\x5a\x17\x0d\x32\x39\x31" 679 "\x31\x32\x39\x30\x30\x32\x30\x32\x34\x5a\x30\x3b\x31\x1f\x30\x1d" 680 "\x06\x03\x55\x04\x03\x0c\x16\x63\x6f\x6d\x2e\x61\x70\x70\x6c\x65" 681 "\x2e\x6b\x65\x72\x62\x65\x72\x6f\x73\x2e\x6b\x64\x63\x31\x18\x30" 682 "\x16\x06\x03\x55\x04\x0a\x0c\x0f\x53\x79\x73\x74\x65\x6d\x20\x49" 683 "\x64\x65\x6e\x74\x69\x74\x79\x30\x81\x9f\x30\x0d\x06\x09\x2a\x86" 684 "\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x00\x30\x81\x89" 685 "\x02\x81\x81\x00\xb2\xc5\x4b\x34\xe3\x93\x99\xbb\xaa\xd1\x70\x62" 686 "\x6c\x9c\xcc\xa6\xbc\x47\xc3\x23\xff\x15\xb9\x11\x27\x0a\xf8\x55" 687 "\x4c\xb2\x43\x34\x75\xad\x55\xbb\xb9\x8a\xd0\x25\x64\xa4\x8c\x82" 688 "\x74\x5d\x89\x52\xe2\x76\x75\x08\x67\xb5\x9c\x9c\x69\x86\x0c\x6d" 689 "\x79\xf7\xa0\xbe\x42\x8f\x90\x46\x0c\x18\xf4\x7a\x56\x17\xa4\x65" 690 "\x00\x3a\x5e\x3e\xbf\xbc\xf5\xe2\x2c\x26\x03\x52\xdd\xd4\x85\x3f" 691 "\x03\xd7\x0c\x45\x7f\xff\xdd\x1e\x70\x6c\x9f\xb0\x8c\xd0\x33\xad" 692 "\x92\x54\x17\x9d\x88\x89\x1a\xee\xef\xf7\x96\x3e\x68\xc3\xd1\x60" 693 "\x47\x86\x80\x5d\x02\x03\x01\x00\x01\xa3\x18\x30\x16\x30\x14\x06" 694 "\x03\x55\x1d\x25\x04\x0d\x30\x0b\x06\x09\x2a\x86\x48\x86\xf7\x63" 695 "\x64\x04\x04\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05" 696 "\x05\x00\x03\x81\x81\x00\x9b\xbb\xaa\x63\x66\xd8\x70\x84\x3e\xf6" 697 "\xa1\x3b\xf3\xe6\xd7\x3d\xfc\x4f\xc9\x45\xaa\x31\x43\x8d\xb5\x72" 698 "\xe4\x34\x95\x7b\x6e\x5f\xe5\xc8\x5e\xaf\x12\x08\x6d\xd7\x25\x76" 699 "\x40\xd5\xdc\x83\x7f\x2f\x74\xd1\x63\xc0\x7c\x26\x4d\x53\x10\xe7" 700 "\xfa\xcc\xf2\x60\x41\x63\xdf\x56\xd6\xd9\xc0\xb4\xd0\x73\x99\x54" 701 "\x40\xad\x90\x79\x2d\xd2\x5e\xcb\x13\x22\x2b\xd0\x76\xef\x8a\x48" 702 "\xfd\xb2\x6e\xca\x04\x4e\x91\x3f\xb4\x63\xad\x22\x3a\xf7\x20\x9c" 703 "\x4c\x0e\x47\x78\xe5\x2a\x85\x0e\x90\x7a\xce\x46\xe6\x15\x02\xb0" 704 "\x83\xe7\xac\xfa\x92\xf8\x31\x81\xe8\x30\x81\xe5\x02\x01\x01\x30" 705 "\x43\x30\x3b\x31\x1f\x30\x1d\x06\x03\x55\x04\x03\x0c\x16\x63\x6f" 706 "\x6d\x2e\x61\x70\x70\x6c\x65\x2e\x6b\x65\x72\x62\x65\x72\x6f\x73" 707 "\x2e\x6b\x64\x63\x31\x18\x30\x16\x06\x03\x55\x04\x0a\x0c\x0f\x53" 708 "\x79\x73\x74\x65\x6d\x20\x49\x64\x65\x6e\x74\x69\x74\x79\x02\x04" 709 "\x49\x75\x57\xbf\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x30" 710 "\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81" 711 "\x80\x50\x2c\x69\xe1\xd2\xc4\xd1\xcc\xdc\xe0\xe9\x8a\x6b\x6a\x97" 712 "\x1b\xb4\xe0\xa8\x20\xbe\x09\x6d\xe1\x55\x5f\x07\x70\x94\x2e\x14" 713 "\xed\x4e\xb1\x69\x75\x40\xbb\x99\x87\xed\x23\x50\x27\x5f\xaa\xc4" 714 "\x84\x60\x06\xfe\x45\xfd\x7e\x1b\x18\xe0\x0b\x77\x35\x2a\xb2\xf2" 715 "\xe0\x88\x31\xad\x82\x31\x4a\xbc\x6d\x71\x62\xe6\x4d\x33\xb4\x09" 716 "\x6e\x3f\x14\x12\xf2\x89\x29\x31\x84\x60\x2b\xa8\x2d\xe6\xca\x2f" 717 "\x03\x3d\xd4\x69\x89\xb3\x98\xfd\xac\x63\x14\xaf\x6a\x52\x2a\xac" 718 "\xe3\x8e\xfa\x21\x41\x8f\xcc\x04\x2d\x52\xee\x49\x54\x0d\x58\x51" 719 "\x77\x00\x00", 720 883 721 } 722 }; 723 724 static int 725 test_SignedData(void) 726 { 727 SignedData sd; 728 size_t size, i; 729 int ret; 730 731 for (i = 0; i < sizeof(signeddata) / sizeof(signeddata[0]); i++) { 732 733 ret = decode_SignedData((unsigned char *)signeddata[i].sd, 734 signeddata[i].len, &sd, &size); 735 if (ret) 736 return ret; 737 738 free_SignedData(&sd); 739 } 740 741 return 0; 742 } 743 744 745 static int 746 cmp_TESTLargeTag (void *a, void *b) 747 { 748 TESTLargeTag *aa = a; 749 TESTLargeTag *ab = b; 750 751 COMPARE_INTEGER(aa,ab,foo); 752 COMPARE_INTEGER(aa,ab,bar); 753 return 0; 754 } 755 756 static int 757 test_large_tag (void) 758 { 759 struct test_case tests[] = { 760 { NULL, 15, "\x30\x0d\xbf\x7f\x03\x02\x01\x01\xbf\x81\x00\x03\x02\x01\x02", "large tag 1" } 761 }; 762 763 int ntests = sizeof(tests) / sizeof(*tests); 764 TESTLargeTag lt1; 765 766 memset(<1, 0, sizeof(lt1)); 767 lt1.foo = 1; 768 lt1.bar = 2; 769 770 tests[0].val = <1; 771 772 return generic_test (tests, ntests, sizeof(TESTLargeTag), 773 (generic_encode)encode_TESTLargeTag, 774 (generic_length)length_TESTLargeTag, 775 (generic_decode)decode_TESTLargeTag, 776 (generic_free)free_TESTLargeTag, 777 cmp_TESTLargeTag, 778 (generic_copy)copy_TESTLargeTag); 779 } 780 781 struct test_data { 782 int ok; 783 size_t len; 784 size_t expected_len; 785 void *data; 786 }; 787 788 static int 789 check_tag_length(void) 790 { 791 struct test_data td[] = { 792 { 1, 3, 3, "\x02\x01\x00"}, 793 { 1, 3, 3, "\x02\x01\x7f"}, 794 { 1, 4, 4, "\x02\x02\x00\x80"}, 795 { 1, 4, 4, "\x02\x02\x01\x00"}, 796 { 1, 4, 4, "\x02\x02\x02\x00"}, 797 { 0, 3, 0, "\x02\x02\x00"}, 798 { 0, 3, 0, "\x02\x7f\x7f"}, 799 { 0, 4, 0, "\x02\x03\x00\x80"}, 800 { 0, 4, 0, "\x02\x7f\x01\x00"}, 801 { 0, 5, 0, "\x02\xff\x7f\x02\x00"} 802 }; 803 size_t sz; 804 TESTuint32 values[] = {0, 127, 128, 256, 512, 805 0, 127, 128, 256, 512 }; 806 TESTuint32 u; 807 int i, ret, failed = 0; 808 void *buf; 809 810 for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { 811 struct map_page *page; 812 813 buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page); 814 815 ret = decode_TESTuint32(buf, td[i].len, &u, &sz); 816 if (ret) { 817 if (td[i].ok) { 818 printf("failed with tag len test %d\n", i); 819 failed = 1; 820 } 821 } else { 822 if (td[i].ok == 0) { 823 printf("failed with success for tag len test %d\n", i); 824 failed = 1; 825 } 826 if (td[i].expected_len != sz) { 827 printf("wrong expected size for tag test %d\n", i); 828 failed = 1; 829 } 830 if (values[i] != u) { 831 printf("wrong value for tag test %d\n", i); 832 failed = 1; 833 } 834 } 835 map_free(page, "test", "decode"); 836 } 837 return failed; 838 } 839 840 static int 841 check_tag_length64(void) 842 { 843 struct test_data td[] = { 844 { 1, 3, 3, "\x02\x01\x00"}, 845 { 1, 7, 7, "\x02\x05\x01\xff\xff\xff\xff"}, 846 { 1, 7, 7, "\x02\x05\x02\x00\x00\x00\x00"}, 847 { 1, 9, 9, "\x02\x07\x7f\xff\xff\xff\xff\xff\xff"}, 848 { 1, 10, 10, "\x02\x08\x00\x80\x00\x00\x00\x00\x00\x00"}, 849 { 1, 10, 10, "\x02\x08\x7f\xff\xff\xff\xff\xff\xff\xff"}, 850 { 1, 11, 11, "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff"}, 851 { 0, 3, 0, "\x02\x02\x00"}, 852 { 0, 3, 0, "\x02\x7f\x7f"}, 853 { 0, 4, 0, "\x02\x03\x00\x80"}, 854 { 0, 4, 0, "\x02\x7f\x01\x00"}, 855 { 0, 5, 0, "\x02\xff\x7f\x02\x00"} 856 }; 857 size_t sz; 858 TESTuint64 values[] = {0, 8589934591LL, 8589934592LL, 859 36028797018963967LL, 36028797018963968LL, 860 9223372036854775807LL, 18446744073709551615ULL, 861 0, 127, 128, 256, 512 }; 862 TESTuint64 u; 863 int i, ret, failed = 0; 864 void *buf; 865 866 if (sizeof(TESTuint64) != sizeof(uint64_t)) { 867 ret += 1; 868 printf("sizeof(TESTuint64) %d != sizeof(uint64_t) %d\n", 869 (int)sizeof(TESTuint64), (int)sizeof(uint64_t)); 870 } 871 872 for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { 873 struct map_page *page; 874 875 buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page); 876 877 ret = decode_TESTuint64(buf, td[i].len, &u, &sz); 878 if (ret) { 879 if (td[i].ok) { 880 printf("failed with tag len test %d\n", i); 881 printf("ret = %d\n", ret); 882 failed = 1; 883 } 884 } else { 885 if (td[i].ok == 0) { 886 printf("failed with success for tag len test %d\n", i); 887 failed = 1; 888 } 889 if (td[i].expected_len != sz) { 890 printf("wrong expected size for tag test %d\n", i); 891 printf("sz = %lu\n", (unsigned long)sz); 892 failed = 1; 893 } 894 if (values[i] != u) { 895 printf("wrong value for tag test %d\n", i); 896 printf("Expected value: %llu\nActual value: %llu\n", 897 (unsigned long long)values[i], (unsigned long long)u); 898 failed = 1; 899 } 900 } 901 map_free(page, "test", "decode"); 902 } 903 return failed; 904 } 905 906 static int 907 check_tag_length64s(void) 908 { 909 struct test_data td[] = { 910 { 1, 3, 3, "\x02\x01\x00"}, 911 { 1, 7, 7, "\x02\x05\xfe\x00\x00\x00\x01"}, 912 { 1, 7, 7, "\x02\x05\xfe\x00\x00\x00\x00"}, 913 { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x01"}, 914 { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x00"}, 915 { 1, 10, 10, "\x02\x08\x80\x00\x00\x00\x00\x00\x00\x01"}, 916 { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x01"}, 917 { 0, 3, 0, "\x02\x02\x00"}, 918 { 0, 3, 0, "\x02\x7f\x7f"}, 919 { 0, 4, 0, "\x02\x03\x00\x80"}, 920 { 0, 4, 0, "\x02\x7f\x01\x00"}, 921 { 0, 5, 0, "\x02\xff\x7f\x02\x00"} 922 }; 923 size_t sz; 924 TESTint64 values[] = {0, -8589934591LL, -8589934592LL, 925 -36028797018963967LL, -36028797018963968LL, 926 -9223372036854775807LL, -36028797018963967LL, 927 0, 127, 128, 256, 512 }; 928 TESTint64 u; 929 int i, ret, failed = 0; 930 void *buf; 931 932 for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { 933 struct map_page *page; 934 935 buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page); 936 937 ret = decode_TESTint64(buf, td[i].len, &u, &sz); 938 if (ret) { 939 if (td[i].ok) { 940 printf("failed with tag len test %d\n", i); 941 printf("ret = %d\n", ret); 942 failed = 1; 943 } 944 } else { 945 if (td[i].ok == 0) { 946 printf("failed with success for tag len test %d\n", i); 947 failed = 1; 948 } 949 if (td[i].expected_len != sz) { 950 printf("wrong expected size for tag test %d\n", i); 951 printf("sz = %lu\n", (unsigned long)sz); 952 failed = 1; 953 } 954 if (values[i] != u) { 955 printf("wrong value for tag test %d\n", i); 956 printf("Expected value: %lld\nActual value: %lld\n", 957 (long long)values[i], (long long)u); 958 failed = 1; 959 } 960 } 961 map_free(page, "test", "decode"); 962 } 963 return failed; 964 } 965 966 static int 967 cmp_TESTChoice (void *a, void *b) 968 { 969 return 0; 970 } 971 972 static int 973 test_choice (void) 974 { 975 struct test_case tests[] = { 976 { NULL, 5, "\xa1\x03\x02\x01\x01", "large choice 1" }, 977 { NULL, 5, "\xa2\x03\x02\x01\x02", "large choice 2" } 978 }; 979 980 int ret = 0, ntests = sizeof(tests) / sizeof(*tests); 981 TESTChoice1 c1; 982 TESTChoice1 c2_1; 983 TESTChoice2 c2_2; 984 985 memset(&c1, 0, sizeof(c1)); 986 c1.element = choice_TESTChoice1_i1; 987 c1.u.i1 = 1; 988 tests[0].val = &c1; 989 990 memset(&c2_1, 0, sizeof(c2_1)); 991 c2_1.element = choice_TESTChoice1_i2; 992 c2_1.u.i2 = 2; 993 tests[1].val = &c2_1; 994 995 ret += generic_test (tests, ntests, sizeof(TESTChoice1), 996 (generic_encode)encode_TESTChoice1, 997 (generic_length)length_TESTChoice1, 998 (generic_decode)decode_TESTChoice1, 999 (generic_free)free_TESTChoice1, 1000 cmp_TESTChoice, 1001 (generic_copy)copy_TESTChoice1); 1002 1003 memset(&c2_2, 0, sizeof(c2_2)); 1004 c2_2.element = choice_TESTChoice2_asn1_ellipsis; 1005 c2_2.u.asn1_ellipsis.data = "\xa2\x03\x02\x01\x02"; 1006 c2_2.u.asn1_ellipsis.length = 5; 1007 tests[1].val = &c2_2; 1008 1009 ret += generic_test (tests, ntests, sizeof(TESTChoice2), 1010 (generic_encode)encode_TESTChoice2, 1011 (generic_length)length_TESTChoice2, 1012 (generic_decode)decode_TESTChoice2, 1013 (generic_free)free_TESTChoice2, 1014 cmp_TESTChoice, 1015 (generic_copy)copy_TESTChoice2); 1016 1017 return ret; 1018 } 1019 1020 #ifdef IMPLICIT_TAGGING_WORKS 1021 static int 1022 cmp_TESTImplicit (void *a, void *b) 1023 { 1024 TESTImplicit *aa = a; 1025 TESTImplicit *ab = b; 1026 1027 COMPARE_INTEGER(aa,ab,ti1); 1028 COMPARE_INTEGER(aa,ab,ti2.foo); 1029 COMPARE_INTEGER(aa,ab,ti3); 1030 return 0; 1031 } 1032 #endif 1033 1034 /* 1035 UNIV CONS Sequence 14 1036 CONTEXT PRIM 0 1 00 1037 CONTEXT CONS 1 6 1038 CONTEXT CONS 127 3 1039 UNIV PRIM Integer 1 02 1040 CONTEXT PRIM 2 1 03 1041 */ 1042 1043 static int 1044 test_implicit (void) 1045 { 1046 int ret = 0; 1047 #ifdef IMPLICIT_TAGGING_WORKS 1048 struct test_case tests[] = { 1049 { NULL, 18, 1050 "\x30\x10\x80\x01\x00\xa1\x06\xbf" 1051 "\x7f\x03\x02\x01\x02\xa2\x03\x84\x01\x03", 1052 "implicit 1" } 1053 }; 1054 1055 int ntests = sizeof(tests) / sizeof(*tests); 1056 TESTImplicit c0; 1057 1058 memset(&c0, 0, sizeof(c0)); 1059 c0.ti1 = 0; 1060 c0.ti2.foo = 2; 1061 c0.ti3 = 3; 1062 tests[0].val = &c0; 1063 1064 ret += generic_test (tests, ntests, sizeof(TESTImplicit), 1065 (generic_encode)encode_TESTImplicit, 1066 (generic_length)length_TESTImplicit, 1067 (generic_decode)decode_TESTImplicit, 1068 (generic_free)free_TESTImplicit, 1069 cmp_TESTImplicit, 1070 (generic_copy)copy_TESTImplicit); 1071 1072 ret += generic_test (tests, ntests, sizeof(TESTImplicit2), 1073 (generic_encode)encode_TESTImplicit2, 1074 (generic_length)length_TESTImplicit2, 1075 (generic_decode)decode_TESTImplicit2, 1076 (generic_free)free_TESTImplicit2, 1077 cmp_TESTImplicit, 1078 NULL); 1079 1080 #endif /* IMPLICIT_TAGGING_WORKS */ 1081 return ret; 1082 } 1083 1084 static int 1085 cmp_TESTAlloc (void *a, void *b) 1086 { 1087 TESTAlloc *aa = a; 1088 TESTAlloc *ab = b; 1089 1090 IF_OPT_COMPARE(aa,ab,tagless) { 1091 COMPARE_INTEGER(aa,ab,tagless->ai); 1092 } 1093 1094 COMPARE_INTEGER(aa,ab,three); 1095 1096 IF_OPT_COMPARE(aa,ab,tagless2) { 1097 COMPARE_OPT_OCTET_STRING(aa, ab, tagless2); 1098 } 1099 1100 return 0; 1101 } 1102 1103 /* 1104 UNIV CONS Sequence 12 1105 UNIV CONS Sequence 5 1106 CONTEXT CONS 0 3 1107 UNIV PRIM Integer 1 01 1108 CONTEXT CONS 1 3 1109 UNIV PRIM Integer 1 03 1110 1111 UNIV CONS Sequence 5 1112 CONTEXT CONS 1 3 1113 UNIV PRIM Integer 1 03 1114 1115 UNIV CONS Sequence 8 1116 CONTEXT CONS 1 3 1117 UNIV PRIM Integer 1 04 1118 UNIV PRIM Integer 1 05 1119 1120 */ 1121 1122 static int 1123 test_taglessalloc (void) 1124 { 1125 struct test_case tests[] = { 1126 { NULL, 14, 1127 "\x30\x0c\x30\x05\xa0\x03\x02\x01\x01\xa1\x03\x02\x01\x03", 1128 "alloc 1" }, 1129 { NULL, 7, 1130 "\x30\x05\xa1\x03\x02\x01\x03", 1131 "alloc 2" }, 1132 { NULL, 10, 1133 "\x30\x08\xa1\x03\x02\x01\x04\x02\x01\x05", 1134 "alloc 3" } 1135 }; 1136 1137 int ret = 0, ntests = sizeof(tests) / sizeof(*tests); 1138 TESTAlloc c1, c2, c3; 1139 heim_any any3; 1140 1141 memset(&c1, 0, sizeof(c1)); 1142 c1.tagless = ecalloc(1, sizeof(*c1.tagless)); 1143 c1.tagless->ai = 1; 1144 c1.three = 3; 1145 tests[0].val = &c1; 1146 1147 memset(&c2, 0, sizeof(c2)); 1148 c2.tagless = NULL; 1149 c2.three = 3; 1150 tests[1].val = &c2; 1151 1152 memset(&c3, 0, sizeof(c3)); 1153 c3.tagless = NULL; 1154 c3.three = 4; 1155 c3.tagless2 = &any3; 1156 any3.data = "\x02\x01\x05"; 1157 any3.length = 3; 1158 tests[2].val = &c3; 1159 1160 ret += generic_test (tests, ntests, sizeof(TESTAlloc), 1161 (generic_encode)encode_TESTAlloc, 1162 (generic_length)length_TESTAlloc, 1163 (generic_decode)decode_TESTAlloc, 1164 (generic_free)free_TESTAlloc, 1165 cmp_TESTAlloc, 1166 (generic_copy)copy_TESTAlloc); 1167 1168 free(c1.tagless); 1169 1170 return ret; 1171 } 1172 1173 static int 1174 cmp_TESTOptional (void *a, void *b) 1175 { 1176 TESTOptional *aa = a; 1177 TESTOptional *ab = b; 1178 1179 IF_OPT_COMPARE(aa,ab,zero) { 1180 COMPARE_OPT_INTEGER(aa,ab,zero); 1181 } 1182 IF_OPT_COMPARE(aa,ab,one) { 1183 COMPARE_OPT_INTEGER(aa,ab,one); 1184 } 1185 return 0; 1186 } 1187 1188 /* 1189 UNIV CONS Sequence 5 1190 CONTEXT CONS 0 3 1191 UNIV PRIM Integer 1 00 1192 1193 UNIV CONS Sequence 5 1194 CONTEXT CONS 1 3 1195 UNIV PRIM Integer 1 03 1196 1197 UNIV CONS Sequence 10 1198 CONTEXT CONS 0 3 1199 UNIV PRIM Integer 1 00 1200 CONTEXT CONS 1 3 1201 UNIV PRIM Integer 1 01 1202 1203 */ 1204 1205 static int 1206 test_optional (void) 1207 { 1208 struct test_case tests[] = { 1209 { NULL, 2, 1210 "\x30\x00", 1211 "optional 0" }, 1212 { NULL, 7, 1213 "\x30\x05\xa0\x03\x02\x01\x00", 1214 "optional 1" }, 1215 { NULL, 7, 1216 "\x30\x05\xa1\x03\x02\x01\x01", 1217 "optional 2" }, 1218 { NULL, 12, 1219 "\x30\x0a\xa0\x03\x02\x01\x00\xa1\x03\x02\x01\x01", 1220 "optional 3" } 1221 }; 1222 1223 int ret = 0, ntests = sizeof(tests) / sizeof(*tests); 1224 TESTOptional c0, c1, c2, c3; 1225 int zero = 0; 1226 int one = 1; 1227 1228 c0.zero = NULL; 1229 c0.one = NULL; 1230 tests[0].val = &c0; 1231 1232 c1.zero = &zero; 1233 c1.one = NULL; 1234 tests[1].val = &c1; 1235 1236 c2.zero = NULL; 1237 c2.one = &one; 1238 tests[2].val = &c2; 1239 1240 c3.zero = &zero; 1241 c3.one = &one; 1242 tests[3].val = &c3; 1243 1244 ret += generic_test (tests, ntests, sizeof(TESTOptional), 1245 (generic_encode)encode_TESTOptional, 1246 (generic_length)length_TESTOptional, 1247 (generic_decode)decode_TESTOptional, 1248 (generic_free)free_TESTOptional, 1249 cmp_TESTOptional, 1250 (generic_copy)copy_TESTOptional); 1251 1252 return ret; 1253 } 1254 1255 static int 1256 check_fail_largetag(void) 1257 { 1258 struct test_case tests[] = { 1259 {NULL, 14, "\x30\x0c\xbf\x87\xff\xff\xff\xff\xff\x7f\x03\x02\x01\x01", 1260 "tag overflow"}, 1261 {NULL, 0, "", "empty buffer"}, 1262 {NULL, 7, "\x30\x05\xa1\x03\x02\x02\x01", 1263 "one too short" }, 1264 {NULL, 7, "\x30\x04\xa1\x03\x02\x02\x01", 1265 "two too short" }, 1266 {NULL, 7, "\x30\x03\xa1\x03\x02\x02\x01", 1267 "three too short" }, 1268 {NULL, 7, "\x30\x02\xa1\x03\x02\x02\x01", 1269 "four too short" }, 1270 {NULL, 7, "\x30\x01\xa1\x03\x02\x02\x01", 1271 "five too short" }, 1272 {NULL, 7, "\x30\x00\xa1\x03\x02\x02\x01", 1273 "six too short" }, 1274 {NULL, 7, "\x30\x05\xa1\x04\x02\x02\x01", 1275 "inner one too long" }, 1276 {NULL, 7, "\x30\x00\xa1\x02\x02\x02\x01", 1277 "inner one too short" }, 1278 {NULL, 8, "\x30\x05\xbf\x7f\x03\x02\x02\x01", 1279 "inner one too short"}, 1280 {NULL, 8, "\x30\x06\xbf\x64\x03\x02\x01\x01", 1281 "wrong tag"}, 1282 {NULL, 10, "\x30\x08\xbf\x9a\x9b\x38\x03\x02\x01\x01", 1283 "still wrong tag"} 1284 }; 1285 int ntests = sizeof(tests) / sizeof(*tests); 1286 1287 return generic_decode_fail(tests, ntests, sizeof(TESTLargeTag), 1288 (generic_decode)decode_TESTLargeTag); 1289 } 1290 1291 1292 static int 1293 check_fail_sequence(void) 1294 { 1295 struct test_case tests[] = { 1296 {NULL, 0, "", "empty buffer"}, 1297 {NULL, 24, 1298 "\x30\x16\xa0\x03\x02\x01\x01\xa1\x08\x30\x06\xbf\x7f\x03\x02\x01\x01" 1299 "\x02\x01\x01\xa2\x03\x02\x01\x01", 1300 "missing one byte from the end, internal length ok"}, 1301 {NULL, 25, 1302 "\x30\x18\xa0\x03\x02\x01\x01\xa1\x08\x30\x06\xbf\x7f\x03\x02\x01\x01" 1303 "\x02\x01\x01\xa2\x03\x02\x01\x01", 1304 "inner length one byte too long"}, 1305 {NULL, 24, 1306 "\x30\x17\xa0\x03\x02\x01\x01\xa1\x08\x30\x06\xbf\x7f\x03\x02\x01" 1307 "\x01\x02\x01\x01\xa2\x03\x02\x01\x01", 1308 "correct buffer but missing one too short"} 1309 }; 1310 int ntests = sizeof(tests) / sizeof(*tests); 1311 1312 return generic_decode_fail(tests, ntests, sizeof(TESTSeq), 1313 (generic_decode)decode_TESTSeq); 1314 } 1315 1316 static int 1317 check_fail_choice(void) 1318 { 1319 struct test_case tests[] = { 1320 {NULL, 6, 1321 "\xa1\x02\x02\x01\x01", 1322 "choice one too short"}, 1323 {NULL, 6, 1324 "\xa1\x03\x02\x02\x01", 1325 "choice one too short inner"} 1326 }; 1327 int ntests = sizeof(tests) / sizeof(*tests); 1328 1329 return generic_decode_fail(tests, ntests, sizeof(TESTChoice1), 1330 (generic_decode)decode_TESTChoice1); 1331 } 1332 1333 static int 1334 check_fail_Ticket(void) 1335 { 1336 char buf[100]; 1337 size_t i; 1338 int ret; 1339 struct test_case test; 1340 Ticket ticket; 1341 1342 for (i = 0; i < sizeof(buf); i++) { 1343 memset(buf, 0, sizeof(buf)); 1344 memset(&ticket, 0, sizeof(ticket)); 1345 test.val = &ticket; 1346 test.byte_len = i; 1347 test.bytes = buf; 1348 test.name = "zero life"; 1349 ret = generic_decode_fail(&test, 1, sizeof(Ticket), 1350 (generic_decode)decode_Ticket); 1351 if (ret) 1352 return ret; 1353 } 1354 return 0; 1355 } 1356 1357 static int 1358 check_seq(void) 1359 { 1360 TESTSeqOf seq; 1361 TESTInteger i; 1362 int ret; 1363 1364 seq.val = NULL; 1365 seq.len = 0; 1366 1367 ret = add_TESTSeqOf(&seq, &i); 1368 if (ret) { printf("failed adding\n"); goto out; } 1369 ret = add_TESTSeqOf(&seq, &i); 1370 if (ret) { printf("failed adding\n"); goto out; } 1371 ret = add_TESTSeqOf(&seq, &i); 1372 if (ret) { printf("failed adding\n"); goto out; } 1373 ret = add_TESTSeqOf(&seq, &i); 1374 if (ret) { printf("failed adding\n"); goto out; } 1375 1376 ret = remove_TESTSeqOf(&seq, seq.len - 1); 1377 if (ret) { printf("failed removing\n"); goto out; } 1378 ret = remove_TESTSeqOf(&seq, 2); 1379 if (ret) { printf("failed removing\n"); goto out; } 1380 ret = remove_TESTSeqOf(&seq, 0); 1381 if (ret) { printf("failed removing\n"); goto out; } 1382 ret = remove_TESTSeqOf(&seq, 0); 1383 if (ret) { printf("failed removing\n"); goto out; } 1384 ret = remove_TESTSeqOf(&seq, 0); 1385 if (ret == 0) { 1386 printf("can remove from empty list"); 1387 return 1; 1388 } 1389 1390 if (seq.len != 0) { 1391 printf("seq not empty!"); 1392 return 1; 1393 } 1394 free_TESTSeqOf(&seq); 1395 ret = 0; 1396 1397 out: 1398 1399 return ret; 1400 } 1401 1402 #define test_seq_of(type, ok, ptr) \ 1403 { \ 1404 heim_octet_string os; \ 1405 size_t size; \ 1406 type decode; \ 1407 ASN1_MALLOC_ENCODE(type, os.data, os.length, ptr, &size, ret); \ 1408 if (ret) \ 1409 return ret; \ 1410 if (os.length != size) \ 1411 abort(); \ 1412 ret = decode_##type(os.data, os.length, &decode, &size); \ 1413 free(os.data); \ 1414 if (ret) { \ 1415 if (ok) \ 1416 return 1; \ 1417 } else { \ 1418 free_##type(&decode); \ 1419 if (!ok) \ 1420 return 1; \ 1421 if (size != 0) \ 1422 return 1; \ 1423 } \ 1424 return 0; \ 1425 } 1426 1427 static int 1428 check_seq_of_size(void) 1429 { 1430 #if 0 /* template */ 1431 TESTInteger integers[4] = { 1, 2, 3, 4 }; 1432 int ret; 1433 1434 { 1435 TESTSeqSizeOf1 ssof1f1 = { 1, integers }; 1436 TESTSeqSizeOf1 ssof1ok1 = { 2, integers }; 1437 TESTSeqSizeOf1 ssof1f2 = { 3, integers }; 1438 1439 test_seq_of(TESTSeqSizeOf1, 0, &ssof1f1); 1440 test_seq_of(TESTSeqSizeOf1, 1, &ssof1ok1); 1441 test_seq_of(TESTSeqSizeOf1, 0, &ssof1f2); 1442 } 1443 { 1444 TESTSeqSizeOf2 ssof2f1 = { 0, NULL }; 1445 TESTSeqSizeOf2 ssof2ok1 = { 1, integers }; 1446 TESTSeqSizeOf2 ssof2ok2 = { 2, integers }; 1447 TESTSeqSizeOf2 ssof2f2 = { 3, integers }; 1448 1449 test_seq_of(TESTSeqSizeOf2, 0, &ssof2f1); 1450 test_seq_of(TESTSeqSizeOf2, 1, &ssof2ok1); 1451 test_seq_of(TESTSeqSizeOf2, 1, &ssof2ok2); 1452 test_seq_of(TESTSeqSizeOf2, 0, &ssof2f2); 1453 } 1454 { 1455 TESTSeqSizeOf3 ssof3f1 = { 0, NULL }; 1456 TESTSeqSizeOf3 ssof3ok1 = { 1, integers }; 1457 TESTSeqSizeOf3 ssof3ok2 = { 2, integers }; 1458 1459 test_seq_of(TESTSeqSizeOf3, 0, &ssof3f1); 1460 test_seq_of(TESTSeqSizeOf3, 1, &ssof3ok1); 1461 test_seq_of(TESTSeqSizeOf3, 1, &ssof3ok2); 1462 } 1463 { 1464 TESTSeqSizeOf4 ssof4ok1 = { 0, NULL }; 1465 TESTSeqSizeOf4 ssof4ok2 = { 1, integers }; 1466 TESTSeqSizeOf4 ssof4ok3 = { 2, integers }; 1467 TESTSeqSizeOf4 ssof4f1 = { 3, integers }; 1468 1469 test_seq_of(TESTSeqSizeOf4, 1, &ssof4ok1); 1470 test_seq_of(TESTSeqSizeOf4, 1, &ssof4ok2); 1471 test_seq_of(TESTSeqSizeOf4, 1, &ssof4ok3); 1472 test_seq_of(TESTSeqSizeOf4, 0, &ssof4f1); 1473 } 1474 #endif 1475 return 0; 1476 } 1477 1478 static int 1479 check_TESTMechTypeList(void) 1480 { 1481 TESTMechTypeList tl; 1482 unsigned oid1[] = { 1, 2, 840, 48018, 1, 2, 2}; 1483 unsigned oid2[] = { 1, 2, 840, 113554, 1, 2, 2}; 1484 unsigned oid3[] = { 1, 3, 6, 1, 4, 1, 311, 2, 2, 30}; 1485 unsigned oid4[] = { 1, 3, 6, 1, 4, 1, 311, 2, 2, 10}; 1486 TESTMechType array[] = {{ 7, oid1 }, 1487 { 7, oid2 }, 1488 { 10, oid3 }, 1489 { 10, oid4 }}; 1490 size_t size, len; 1491 void *ptr; 1492 int ret; 1493 1494 tl.len = 4; 1495 tl.val = array; 1496 1497 ASN1_MALLOC_ENCODE(TESTMechTypeList, ptr, len, &tl, &size, ret); 1498 if (ret) 1499 errx(1, "TESTMechTypeList: %d", ret); 1500 if (len != size) 1501 abort(); 1502 return 0; 1503 } 1504 1505 #ifdef IMPLICIT_TAGGING_WORKS 1506 static int 1507 cmp_TESTSeqOf4(void *a, void *b) 1508 { 1509 TESTSeqOf4 *aa = a; 1510 TESTSeqOf4 *ab = b; 1511 int i; 1512 1513 IF_OPT_COMPARE(aa, ab, b1) { 1514 COMPARE_INTEGER(aa->b1, ab->b1, len); 1515 for (i = 0; i < aa->b1->len; ++i) { 1516 COMPARE_INTEGER(aa->b1->val+i, ab->b1->val+i, u1); 1517 COMPARE_INTEGER(aa->b1->val+i, ab->b1->val+i, u2); 1518 COMPARE_OCTET_STRING(aa->b1->val+i, ab->b1->val+i, s1); 1519 COMPARE_OCTET_STRING(aa->b1->val+i, ab->b1->val+i, s2); 1520 } 1521 } 1522 IF_OPT_COMPARE(aa, ab, b2) { 1523 COMPARE_INTEGER(aa->b2, ab->b2, len); 1524 for (i = 0; i < aa->b2->len; ++i) { 1525 COMPARE_INTEGER(aa->b2->val+i, ab->b2->val+i, u1); 1526 COMPARE_INTEGER(aa->b2->val+i, ab->b2->val+i, u2); 1527 COMPARE_INTEGER(aa->b2->val+i, ab->b2->val+i, u3); 1528 COMPARE_OCTET_STRING(aa->b2->val+i, ab->b2->val+i, s1); 1529 COMPARE_OCTET_STRING(aa->b2->val+i, ab->b2->val+i, s2); 1530 COMPARE_OCTET_STRING(aa->b2->val+i, ab->b2->val+i, s3); 1531 } 1532 } 1533 IF_OPT_COMPARE(aa, ab, b3) { 1534 COMPARE_INTEGER(aa->b3, ab->b3, len); 1535 for (i = 0; i < aa->b3->len; ++i) { 1536 COMPARE_INTEGER(aa->b3->val+i, ab->b3->val+i, u1); 1537 COMPARE_INTEGER(aa->b3->val+i, ab->b3->val+i, u2); 1538 COMPARE_INTEGER(aa->b3->val+i, ab->b3->val+i, u3); 1539 COMPARE_INTEGER(aa->b3->val+i, ab->b3->val+i, u4); 1540 COMPARE_OCTET_STRING(aa->b3->val+i, ab->b3->val+i, s1); 1541 COMPARE_OCTET_STRING(aa->b3->val+i, ab->b3->val+i, s2); 1542 COMPARE_OCTET_STRING(aa->b3->val+i, ab->b3->val+i, s3); 1543 COMPARE_OCTET_STRING(aa->b3->val+i, ab->b3->val+i, s4); 1544 } 1545 } 1546 return 0; 1547 } 1548 #endif /* IMPLICIT_TAGGING_WORKS */ 1549 1550 static int 1551 test_seq4 (void) 1552 { 1553 int ret = 0; 1554 #ifdef IMPLICIT_TAGGING_WORKS 1555 struct test_case tests[] = { 1556 { NULL, 2, 1557 "\x30\x00", 1558 "seq4 0" }, 1559 { NULL, 4, 1560 "\x30\x02" "\xa1\x00", 1561 "seq4 1" }, 1562 { NULL, 8, 1563 "\x30\x06" "\xa0\x02\x30\x00" "\xa1\x00", 1564 "seq4 2" }, 1565 { NULL, 2 + (2 + 0x18) + (2 + 0x27) + (2 + 0x31), 1566 "\x30\x76" /* 2 SEQ */ 1567 "\xa0\x18\x30\x16" /* 4 [0] SEQ */ 1568 "\x30\x14" /* 2 SEQ */ 1569 "\x04\x00" /* 2 OCTET-STRING */ 1570 "\x04\x02\x01\x02" /* 4 OCTET-STRING */ 1571 "\x02\x01\x01" /* 3 INT */ 1572 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" 1573 /* 11 INT */ 1574 "\xa1\x27" /* 2 [1] IMPL SEQ */ 1575 "\x30\x25" /* 2 SEQ */ 1576 "\x02\x01\x01" /* 3 INT */ 1577 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" 1578 /* 11 INT */ 1579 "\x02\x09\x00\x80\x00\x00\x00\x00\x00\x00\x00" 1580 /* 11 INT */ 1581 "\x04\x00" /* 2 OCTET-STRING */ 1582 "\x04\x02\x01\x02" /* 4 OCTET-STRING */ 1583 "\x04\x04\x00\x01\x02\x03" /* 6 OCTET-STRING */ 1584 "\xa2\x31" /* 2 [2] IMPL SEQ */ 1585 "\x30\x2f" /* 2 SEQ */ 1586 "\x04\x00" /* 2 OCTET-STRING */ 1587 "\x02\x01\x01" /* 3 INT */ 1588 "\x04\x02\x01\x02" /* 4 OCTET-STRING */ 1589 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" 1590 /* 11 INT */ 1591 "\x04\x04\x00\x01\x02\x03" /* 6 OCTET-STRING */ 1592 "\x02\x09\x00\x80\x00\x00\x00\x00\x00\x00\x00" 1593 /* 11 INT */ 1594 "\x04\x01\x00" /* 3 OCTET-STRING */ 1595 "\x02\x05\x01\x00\x00\x00\x00", /* 7 INT */ 1596 "seq4 3" }, 1597 }; 1598 1599 int ntests = sizeof(tests) / sizeof(*tests); 1600 TESTSeqOf4 c[4]; 1601 struct TESTSeqOf4_b1 b1[4]; 1602 struct TESTSeqOf4_b2 b2[4]; 1603 struct TESTSeqOf4_b3 b3[4]; 1604 struct TESTSeqOf4_b1_val b1val[4]; 1605 struct TESTSeqOf4_b2_val b2val[4]; 1606 struct TESTSeqOf4_b3_val b3val[4]; 1607 1608 c[0].b1 = NULL; 1609 c[0].b2 = NULL; 1610 c[0].b3 = NULL; 1611 tests[0].val = &c[0]; 1612 1613 b2[1].len = 0; 1614 b2[1].val = NULL; 1615 c[1].b1 = NULL; 1616 c[1].b2 = &b2[1]; 1617 c[1].b3 = NULL; 1618 tests[1].val = &c[1]; 1619 1620 b1[2].len = 0; 1621 b1[2].val = NULL; 1622 b2[2].len = 0; 1623 b2[2].val = NULL; 1624 c[2].b1 = &b1[2]; 1625 c[2].b2 = &b2[2]; 1626 c[2].b3 = NULL; 1627 tests[2].val = &c[2]; 1628 1629 b1val[3].s1.data = ""; 1630 b1val[3].s1.length = 0; 1631 b1val[3].u1 = 1LL; 1632 b1val[3].s2.data = "\x01\x02"; 1633 b1val[3].s2.length = 2; 1634 b1val[3].u2 = -1LL; 1635 1636 b2val[3].s1.data = ""; 1637 b2val[3].s1.length = 0; 1638 b2val[3].u1 = 1LL; 1639 b2val[3].s2.data = "\x01\x02"; 1640 b2val[3].s2.length = 2; 1641 b2val[3].u2 = -1LL; 1642 b2val[3].s3.data = "\x00\x01\x02\x03"; 1643 b2val[3].s3.length = 4; 1644 b2val[3].u3 = 1LL<<63; 1645 1646 b3val[3].s1.data = ""; 1647 b3val[3].s1.length = 0; 1648 b3val[3].u1 = 1LL; 1649 b3val[3].s2.data = "\x01\x02"; 1650 b3val[3].s2.length = 2; 1651 b3val[3].u2 = -1LL; 1652 b3val[3].s3.data = "\x00\x01\x02\x03"; 1653 b3val[3].s3.length = 4; 1654 b3val[3].u3 = 1LL<<63; 1655 b3val[3].s4.data = "\x00"; 1656 b3val[3].s4.length = 1; 1657 b3val[3].u4 = 1LL<<32; 1658 1659 b1[3].len = 1; 1660 b1[3].val = &b1val[3]; 1661 b2[3].len = 1; 1662 b2[3].val = &b2val[3]; 1663 b3[3].len = 1; 1664 b3[3].val = &b3val[3]; 1665 c[3].b1 = &b1[3]; 1666 c[3].b2 = &b2[3]; 1667 c[3].b3 = &b3[3]; 1668 tests[3].val = &c[3]; 1669 1670 ret += generic_test (tests, ntests, sizeof(TESTSeqOf4), 1671 (generic_encode)encode_TESTSeqOf4, 1672 (generic_length)length_TESTSeqOf4, 1673 (generic_decode)decode_TESTSeqOf4, 1674 (generic_free)free_TESTSeqOf4, 1675 cmp_TESTSeqOf4, 1676 (generic_copy)copy_TESTSeqOf4); 1677 #endif /* IMPLICIT_TAGGING_WORKS */ 1678 return ret; 1679 } 1680 1681 static int 1682 cmp_test_seqof5 (void *a, void *b) 1683 { 1684 TESTSeqOf5 *aval = a; 1685 TESTSeqOf5 *bval = b; 1686 1687 IF_OPT_COMPARE(aval, bval, outer) { 1688 COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u0); 1689 COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s0); 1690 COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u1); 1691 COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s1); 1692 COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u2); 1693 COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s2); 1694 COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u3); 1695 COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s3); 1696 COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u4); 1697 COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s4); 1698 COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u5); 1699 COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s5); 1700 COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u6); 1701 COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s6); 1702 COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u7); 1703 COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s7); 1704 } 1705 return 0; 1706 } 1707 1708 static int 1709 test_seqof5(void) 1710 { 1711 struct test_case tests[] = { 1712 { NULL, 2, "\x30\x00", "seq5 0" }, 1713 { NULL, 126, 1714 "\x30\x7c" /* SEQ */ 1715 "\x30\x7a" /* SEQ */ 1716 "\x30\x78" /* SEQ */ 1717 "\x02\x01\x01" /* INT 1 */ 1718 "\x04\x06\x01\x01\x01\x01\x01\x01" /* "\0x1"x6 */ 1719 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfe" /* INT ~1 */ 1720 "\x04\x06\x02\x02\x02\x02\x02\x02" /* "\x02"x6 */ 1721 "\x02\x01\x02" /* INT 2 */ 1722 "\x04\x06\x03\x03\x03\x03\x03\x03" /* "\x03"x6 */ 1723 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfd" /* INT ~2 */ 1724 "\x04\x06\x04\x04\x04\x04\x04\x04" /* ... */ 1725 "\x02\x01\x03" 1726 "\x04\x06\x05\x05\x05\x05\x05\x05" 1727 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfc" 1728 "\x04\x06\x06\x06\x06\x06\x06\x06" 1729 "\x02\x01\x04" 1730 "\x04\x06\x07\x07\x07\x07\x07\x07" 1731 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfb" 1732 "\x04\x06\x08\x08\x08\x08\x08\x08", 1733 "seq5 1" }, 1734 }; 1735 1736 int ret = 0, ntests = sizeof(tests) / sizeof(*tests); 1737 TESTSeqOf5 c[2]; 1738 struct TESTSeqOf5_outer outer; 1739 struct TESTSeqOf5_outer_inner inner; 1740 TESTuint64 u[8]; 1741 heim_octet_string s[8]; 1742 int i; 1743 1744 c[0].outer = NULL; 1745 tests[0].val = &c[0]; 1746 1747 for (i = 0; i < 8; ++i) { 1748 u[i] = (i&1) == 0 ? i/2+1 : ~(i/2+1); 1749 s[i].data = memset(malloc(s[i].length = 6), i+1, 6); 1750 } 1751 1752 inner.u0 = u[0]; inner.u1 = u[1]; inner.u2 = u[2]; inner.u3 = u[3]; 1753 inner.u4 = u[4]; inner.u5 = u[5]; inner.u6 = u[6]; inner.u7 = u[7]; 1754 inner.s0 = s[0]; inner.s1 = s[1]; inner.s2 = s[2]; inner.s3 = s[3]; 1755 inner.s4 = s[4]; inner.s5 = s[5]; inner.s6 = s[6]; inner.s7 = s[7]; 1756 1757 outer.inner = inner; 1758 c[1].outer = &outer; 1759 tests[1].val = &c[1]; 1760 1761 ret += generic_test (tests, ntests, sizeof(TESTSeqOf5), 1762 (generic_encode)encode_TESTSeqOf5, 1763 (generic_length)length_TESTSeqOf5, 1764 (generic_decode)decode_TESTSeqOf5, 1765 (generic_free)free_TESTSeqOf5, 1766 cmp_test_seqof5, 1767 NULL); 1768 1769 for (i = 0; i < 8; ++i) 1770 free(s[i].data); 1771 1772 return ret; 1773 } 1774 1775 int 1776 main(int argc, char **argv) 1777 { 1778 int ret = 0; 1779 1780 ret += test_principal (); 1781 ret += test_authenticator(); 1782 ret += test_krb_error(); 1783 ret += test_Name(); 1784 ret += test_bit_string(); 1785 ret += test_bit_string_rfc1510(); 1786 ret += test_time(); 1787 ret += test_cert(); 1788 1789 ret += check_tag_length(); 1790 ret += check_tag_length64(); 1791 ret += check_tag_length64s(); 1792 ret += test_large_tag(); 1793 ret += test_choice(); 1794 1795 ret += test_implicit(); 1796 1797 ret += test_taglessalloc(); 1798 ret += test_optional(); 1799 1800 ret += check_fail_largetag(); 1801 ret += check_fail_sequence(); 1802 ret += check_fail_choice(); 1803 ret += check_fail_Ticket(); 1804 1805 ret += check_seq(); 1806 ret += check_seq_of_size(); 1807 ret += test_SignedData(); 1808 1809 ret += check_TESTMechTypeList(); 1810 ret += test_seq4(); 1811 ret += test_seqof5(); 1812 1813 return ret; 1814 } 1815