der test: add example of decoding a X.509 v3 cert with the flexi decoder
you can define "LTC_DER_TESTS_PRINT_FLEXI" at compile time to print the decoded cert whenn running the test executable... well not all of it, since some parts of the cert are marked as "context-specific" so we would need to do some further digging ...these are the parts that are output as "EOL"...
This commit is contained in:
		
							parent
							
								
									c1e81ad469
								
							
						
					
					
						commit
						2e426e2d57
					
				| @ -13,6 +13,487 @@ int der_tests(void) | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| static const unsigned char _der_tests_cacert_root_cert[] = | ||||
|    "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\
 | ||||
|     IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\ | ||||
|     IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\ | ||||
|     Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\ | ||||
|     BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi\ | ||||
|     MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ\ | ||||
|     ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\ | ||||
|     CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ\ | ||||
|     8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6\ | ||||
|     zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y\ | ||||
|     fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7\ | ||||
|     w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc\ | ||||
|     G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k\ | ||||
|     epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q\ | ||||
|     laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ\ | ||||
|     QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU\ | ||||
|     fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826\ | ||||
|     YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w\ | ||||
|     ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY\ | ||||
|     gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe\ | ||||
|     MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0\ | ||||
|     IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy\ | ||||
|     dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw\ | ||||
|     czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0\ | ||||
|     dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl\ | ||||
|     aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC\ | ||||
|     AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg\ | ||||
|     b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB\ | ||||
|     ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc\ | ||||
|     nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg\ | ||||
|     18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c\ | ||||
|     gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl\ | ||||
|     Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY\ | ||||
|     sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T\ | ||||
|     SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF\ | ||||
|     CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum\ | ||||
|     GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\ | ||||
|     zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\ | ||||
|     omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD"; | ||||
| 
 | ||||
| /*
 | ||||
| SEQUENCE(3 elem) | ||||
|     SEQUENCE(8 elem) | ||||
|         [0](1) | ||||
|             INTEGER  2 | ||||
|         INTEGER  0 | ||||
|         SEQUENCE(2 elem) | ||||
|             OBJECT IDENTIFIER 1.2.840.113549.1.1.4 | ||||
|             NULL | ||||
|         SEQUENCE(4 elem) | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.10 | ||||
|                     PrintableString  Root CA | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.11 | ||||
|                     PrintableString  http://www.cacert.org
 | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.3 | ||||
|                     PrintableString  CA Cert Signing Authority | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 1.2.840.113549.1.9.1 | ||||
|                     IA5String support@cacert.org | ||||
|         SEQUENCE(2 elem) | ||||
|             UTCTime03-03-30 12:29:49 UTC | ||||
|             UTCTime33-03-29 12:29:49 UTC | ||||
|         SEQUENCE(4 elem) | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.10 | ||||
|                     PrintableString Root CA | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.11 | ||||
|                     PrintableString http://www.cacert.org
 | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.3 | ||||
|                     PrintableString CA Cert Signing Authority | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 1.2.840.113549.1.9.1 | ||||
|                     IA5String support@cacert.org | ||||
|         SEQUENCE(2 elem) | ||||
|             SEQUENCE(2 elem) | ||||
|                 OBJECT IDENTIFIER 1.2.840.113549.1.1.1 | ||||
|                 NULL | ||||
|             BIT STRING(1 elem) | ||||
|         SEQUENCE(2 elem) | ||||
|             INTEGER (4096 bit) | ||||
|             INTEGER 65537 | ||||
|         [3](1) | ||||
|             SEQUENCE(7 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.29.14 | ||||
|                     OCTET STRING(1 elem) | ||||
|                         OCTET STRING(20 byte) 16B5321BD4C7F3E0E68EF3BDD2B03AEEB23918D1 | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.29.35 | ||||
|                     OCTET STRING(1 elem) | ||||
|                         SEQUENCE(3 elem) | ||||
|                             [0] | ||||
|                             [1](1) | ||||
|                                 [4](1) | ||||
|                                 SEQUENCE(4 elem) | ||||
|                                     SET(1 elem) | ||||
|                                         SEQUENCE(2 elem) | ||||
|                                             OBJECT IDENTIFIER 2.5.4.10 | ||||
|                                             PrintableString Root CA | ||||
|                                     SET(1 elem) | ||||
|                                         SEQUENCE(2 elem) | ||||
|                                             OBJECT IDENTIFIER 2.5.4.11 | ||||
|                                             PrintableString http://www.cacert.org
 | ||||
|                                     SET(1 elem) | ||||
|                                         SEQUENCE(2 elem) | ||||
|                                             OBJECT IDENTIFIER 2.5.4.3 | ||||
|                                             PrintableString CA Cert Signing Authority | ||||
|                                     SET(1 elem) | ||||
|                                         SEQUENCE(2 elem) | ||||
|                                             OBJECT IDENTIFIER 1.2.840.113549.1.9.1 | ||||
|                                             IA5String support@cacert.org | ||||
|                             [2] | ||||
|                 SEQUENCE(3 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.29.19 | ||||
|                     BOOLEAN true | ||||
|                     OCTET STRING(1 elem) | ||||
|                         SEQUENCE(1 elem) | ||||
|                             BOOLEAN true | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.29.31 | ||||
|                     OCTET STRING(1 elem) | ||||
|                         SEQUENCE(1 elem) | ||||
|                             SEQUENCE(1 elem) | ||||
|                                 [0](1) | ||||
|                                     [0](1) | ||||
|                                         [6] | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.16.840.1.113730.1.4 | ||||
|                     OCTET STRING(1 elem) | ||||
|                         IA5String https://www.cacert.org/revoke.crl
 | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.16.840.1.113730.1.8 | ||||
|                     OCTET STRING(1 elem) | ||||
|                         IA5String http://www.cacert.org/index.php?id=10
 | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.16.840.1.113730.1.13 | ||||
|                     OCTET STRING(1 elem) | ||||
|                         IA5String To get your own certificate for FREE head over to http://www.cacert.org
 | ||||
|     SEQUENCE(2 elem) | ||||
|         OBJECT IDENTIFIER 1.2.840.113549.1.1.4 | ||||
|         NULL | ||||
|     BIT STRING(4096 bit) | ||||
|  */ | ||||
| 
 | ||||
| #define __ASN1_ERR(l) fprintf(stderr, "line: %d, type=%d, size=%lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, (l)->type, (l)->size, (l)->next, (l)->prev, (l)->parent, (l)->child); \ | ||||
|     exit(EXIT_FAILURE) | ||||
| 
 | ||||
| #define __CHECK_ASN1_HAS(l, w) do { if ((l)->w == NULL) { \ | ||||
|     __ASN1_ERR(l);\ | ||||
| } } while(0) | ||||
| 
 | ||||
| #define __CHECK_ASN1_HAS_NO(l, w) do { if ((l)->w != NULL) { \ | ||||
|     __ASN1_ERR(l);\ | ||||
| } } while(0) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #define CHECK_ASN1_TYPE(l, t) do { if ((l)->type != (t)) { \ | ||||
|     __ASN1_ERR(l);\ | ||||
| } } while(0) | ||||
| 
 | ||||
| #define CHECK_ASN1_HAS_CHILD(l) __CHECK_ASN1_HAS(l, child) | ||||
| #define CHECK_ASN1_HAS_NO_CHILD(l) __CHECK_ASN1_HAS_NO(l, child) | ||||
| #define CHECK_ASN1_HAS_NEXT(l) __CHECK_ASN1_HAS(l, next) | ||||
| #define CHECK_ASN1_HAS_NO_NEXT(l) __CHECK_ASN1_HAS_NO(l, next) | ||||
| 
 | ||||
| #ifdef LTC_DER_TESTS_PRINT_FLEXI | ||||
| static void _der_tests_print_flexi(ltc_asn1_list* l, unsigned int level) | ||||
| { | ||||
|   char buf[1024]; | ||||
|   char* name = NULL; | ||||
|   char* text = NULL; | ||||
|   ltc_asn1_list* ostring = NULL; | ||||
|   unsigned int n; | ||||
| 
 | ||||
|   switch (l->type) | ||||
|     { | ||||
|   case LTC_ASN1_EOL: | ||||
|     name = "EOL"; | ||||
|     text = ""; | ||||
|     break; | ||||
|   case LTC_ASN1_BOOLEAN: | ||||
|     name = "BOOLEAN"; | ||||
|     { | ||||
|       if (*(int*)l->data) | ||||
|         text = "true"; | ||||
|       else | ||||
|         text = "false"; | ||||
|     } | ||||
|     break; | ||||
|   case LTC_ASN1_INTEGER: | ||||
|     name = "INTEGER"; | ||||
|     break; | ||||
|   case LTC_ASN1_SHORT_INTEGER: | ||||
|     name = "SHORT INTEGER"; | ||||
|     break; | ||||
|   case LTC_ASN1_BIT_STRING: | ||||
|     name = "BIT STRING"; | ||||
|     break; | ||||
|   case LTC_ASN1_OCTET_STRING: | ||||
|     name = "OCTET STRING"; | ||||
|     { | ||||
|       unsigned long ostring_l = l->size; | ||||
|       /* sometimes there's another sequence in an octet string...
 | ||||
|        * try to decode that... if it fails print out the octet string | ||||
|        */ | ||||
|       if (der_decode_sequence_flexi(l->data, &ostring_l, &ostring) == CRYPT_OK) { | ||||
|           text = ""; | ||||
|       } | ||||
|       else { | ||||
|           int r; | ||||
|           char* s = buf; | ||||
|           int sz = sizeof(buf); | ||||
|           for (n = 0; n < l->size; ++n) { | ||||
|               r = snprintf(s, sz, "%02X", ((unsigned char*)l->data)[n]); | ||||
|               if (r < 0 || r >= sz) { | ||||
|                   printf("Octet string boom"); | ||||
|                   exit(EXIT_FAILURE); | ||||
|               } | ||||
|               s += r; | ||||
|               sz -= r; | ||||
|           } | ||||
|           text = buf; | ||||
|       } | ||||
|     } | ||||
|     break; | ||||
|   case LTC_ASN1_NULL: | ||||
|     name = "NULL"; | ||||
|     text = ""; | ||||
|     break; | ||||
|   case LTC_ASN1_OBJECT_IDENTIFIER: | ||||
|     name = "OBJECT IDENTIFIER"; | ||||
|     { | ||||
|       unsigned long i; | ||||
|       int r; | ||||
|       char* s = buf; | ||||
|       int sz = sizeof(buf); | ||||
|       for (i = 0; i < l->size; ++i) { | ||||
|         r = snprintf(s, sz, "%lu.", ((unsigned long*)l->data)[i]); | ||||
|         if (r < 0 || r >= sz) { | ||||
|             printf("OID boom"); | ||||
|             exit(EXIT_FAILURE); | ||||
|         } | ||||
|         s += r; | ||||
|         sz -= r; | ||||
|       } | ||||
|       /* replace the last . with a \0 */ | ||||
|       *(s - 1) = '\0'; | ||||
|       text = buf; | ||||
|     } | ||||
|     break; | ||||
|   case LTC_ASN1_IA5_STRING: | ||||
|     name = "IA5 STRING"; | ||||
|     text = l->data; | ||||
|     break; | ||||
|   case LTC_ASN1_PRINTABLE_STRING: | ||||
|     name = "PRINTABLE STRING"; | ||||
|     text = l->data; | ||||
|     break; | ||||
|   case LTC_ASN1_UTF8_STRING: | ||||
|     name = "UTF8 STRING"; | ||||
|     break; | ||||
|   case LTC_ASN1_UTCTIME: | ||||
|     name = "UTCTIME"; | ||||
|     { | ||||
|       ltc_utctime* ut = l->data; | ||||
|       snprintf(buf, sizeof(buf), "%02d-%02d-%02d %02d:%02d:%02d %c%02d:%02d", | ||||
|           ut->YY, ut->MM, ut->DD, ut->hh, ut->mm, ut->ss, | ||||
|           ut->off_dir ? '-' : '+', ut->off_hh, ut->off_mm); | ||||
|       text = buf; | ||||
|     } | ||||
|     break; | ||||
|   case LTC_ASN1_CHOICE: | ||||
|     name = "CHOICE"; | ||||
|     break; | ||||
|   case LTC_ASN1_SEQUENCE: | ||||
|     name = "SEQUENCE"; | ||||
|     text = ""; | ||||
|     break; | ||||
|   case LTC_ASN1_SET: | ||||
|     name = "SET"; | ||||
|     text = ""; | ||||
|     break; | ||||
|   case LTC_ASN1_SETOF: | ||||
|     name = "SETOF"; | ||||
|     text = ""; | ||||
|     break; | ||||
|   case LTC_ASN1_RAW_BIT_STRING: | ||||
|     name = "RAW BIT STRING"; | ||||
|     break; | ||||
|   case LTC_ASN1_TELETEX_STRING: | ||||
|     name = "TELETEX STRING"; | ||||
|     text = l->data; | ||||
|     break; | ||||
|   case LTC_ASN1_CONSTRUCTED: | ||||
|     name = "CONSTRUCTED"; | ||||
|     text = ""; | ||||
|     break; | ||||
|   } | ||||
| 
 | ||||
|   for (n = 0; n < level; ++n) { | ||||
|     printf("    "); | ||||
|   } | ||||
|   if (name) { | ||||
|       if (text) | ||||
|         printf("%s %s\n", name, text); | ||||
|       else | ||||
|         printf("%s <missing decoding>\n", name); | ||||
|   } | ||||
|   else | ||||
|     printf("WTF type=%i\n", l->type); | ||||
| 
 | ||||
|   if (ostring) { | ||||
|       _der_tests_print_flexi(ostring, level + 1); | ||||
|       der_free_sequence_flexi(ostring); | ||||
|   } | ||||
| 
 | ||||
|   if (l->child) | ||||
|     _der_tests_print_flexi(l->child, level + 1); | ||||
| 
 | ||||
|   if (l->next) | ||||
|     _der_tests_print_flexi(l->next, level); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static void der_cacert_test(void) | ||||
| { | ||||
|   unsigned char buf[sizeof(_der_tests_cacert_root_cert)]; | ||||
|   unsigned long len1 = sizeof(buf), len2; | ||||
| 
 | ||||
|   ltc_asn1_list *decoded_list, *l, *l1, *l2; | ||||
| 
 | ||||
|   DO(base64_decode(_der_tests_cacert_root_cert, sizeof(_der_tests_cacert_root_cert), buf, &len1)); | ||||
|   len2 = len1; | ||||
|   DO(der_decode_sequence_flexi(buf, &len2, &decoded_list)); | ||||
| 
 | ||||
| #ifdef LTC_DER_TESTS_PRINT_FLEXI | ||||
|   printf("\n\n--- test print start ---\n\n"); | ||||
|   _der_tests_print_flexi(decoded_list, 0); | ||||
|   printf("\n\n--- test print end ---\n\n"); | ||||
| #endif | ||||
| 
 | ||||
|   l = decoded_list; | ||||
| 
 | ||||
|   /*
 | ||||
| SEQUENCE(3 elem) | ||||
|     SEQUENCE(8 elem) | ||||
|    */ | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l, LTC_ASN1_SEQUENCE); | ||||
|   CHECK_ASN1_HAS_CHILD(l); | ||||
|   CHECK_ASN1_HAS_NO_NEXT(l); | ||||
| 
 | ||||
|   l = l->child; | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l, LTC_ASN1_SEQUENCE); | ||||
|   CHECK_ASN1_HAS_CHILD(l); | ||||
|   CHECK_ASN1_HAS_NEXT(l); | ||||
| 
 | ||||
|   l1 = l->child; | ||||
| 
 | ||||
|   /*
 | ||||
|         [0](1) | ||||
|             INTEGER  2 | ||||
|    */ | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l1, LTC_ASN1_CONSTRUCTED); | ||||
|   CHECK_ASN1_HAS_CHILD(l1); | ||||
|   CHECK_ASN1_HAS_NEXT(l1); | ||||
| 
 | ||||
|   l2 = l1->child; | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l2, LTC_ASN1_INTEGER); | ||||
|   CHECK_ASN1_HAS_NO_CHILD(l2); | ||||
|   CHECK_ASN1_HAS_NO_NEXT(l2); | ||||
| 
 | ||||
|   l1 = l1->next; | ||||
| 
 | ||||
|   /*
 | ||||
|         INTEGER  0 | ||||
|    */ | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l1, LTC_ASN1_INTEGER); | ||||
|   CHECK_ASN1_HAS_NO_CHILD(l1); | ||||
|   CHECK_ASN1_HAS_NEXT(l1); | ||||
| 
 | ||||
|   l1 = l1->next; | ||||
| 
 | ||||
|   /*
 | ||||
|         SEQUENCE(2 elem) | ||||
|             OBJECT IDENTIFIER 1.2.840.113549.1.1.4 | ||||
|             NULL | ||||
|    */ | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l1, LTC_ASN1_SEQUENCE); | ||||
|   CHECK_ASN1_HAS_CHILD(l1); | ||||
|   CHECK_ASN1_HAS_NEXT(l1); | ||||
| 
 | ||||
|   l2 = l1->child; | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l2, LTC_ASN1_OBJECT_IDENTIFIER); | ||||
|   CHECK_ASN1_HAS_NO_CHILD(l2); | ||||
|   CHECK_ASN1_HAS_NEXT(l2); | ||||
| 
 | ||||
|   l2 = l2->next; | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l2, LTC_ASN1_NULL); | ||||
|   CHECK_ASN1_HAS_NO_CHILD(l2); | ||||
|   CHECK_ASN1_HAS_NO_NEXT(l2); | ||||
| 
 | ||||
|   /*
 | ||||
|         SEQUENCE(4 elem) | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.10 | ||||
|                     PrintableString  Root CA | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.11 | ||||
|                     PrintableString  http://www.cacert.org
 | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 2.5.4.3 | ||||
|                     PrintableString  CA Cert Signing Authority | ||||
|             SET(1 elem) | ||||
|                 SEQUENCE(2 elem) | ||||
|                     OBJECT IDENTIFIER 1.2.840.113549.1.9.1 | ||||
|                     IA5String support@cacert.org | ||||
|    */ | ||||
| 
 | ||||
|   l = l->next; | ||||
| 
 | ||||
|   /*
 | ||||
|     SEQUENCE(2 elem) | ||||
|         OBJECT IDENTIFIER 1.2.840.113549.1.1.4 | ||||
|         NULL | ||||
|    */ | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l, LTC_ASN1_SEQUENCE); | ||||
|   CHECK_ASN1_HAS_CHILD(l); | ||||
|   CHECK_ASN1_HAS_NEXT(l); | ||||
| 
 | ||||
|   l1 = l->child; | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l1, LTC_ASN1_OBJECT_IDENTIFIER); | ||||
|   CHECK_ASN1_HAS_NO_CHILD(l1); | ||||
|   CHECK_ASN1_HAS_NEXT(l1); | ||||
| 
 | ||||
|   l1 = l1->next; | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l1, LTC_ASN1_NULL); | ||||
|   CHECK_ASN1_HAS_NO_CHILD(l1); | ||||
|   CHECK_ASN1_HAS_NO_NEXT(l1); | ||||
| 
 | ||||
|   l = l->next; | ||||
| 
 | ||||
|   /*
 | ||||
|     BIT STRING(4096 bit) | ||||
|    */ | ||||
| 
 | ||||
|   CHECK_ASN1_TYPE(l, LTC_ASN1_BIT_STRING); | ||||
|   CHECK_ASN1_HAS_NO_CHILD(l); | ||||
|   CHECK_ASN1_HAS_NO_NEXT(l); | ||||
| 
 | ||||
|   der_free_sequence_flexi(decoded_list); | ||||
| } | ||||
| 
 | ||||
| static void der_set_test(void) | ||||
| { | ||||
|    ltc_asn1_list list[10]; | ||||
| @ -519,6 +1000,8 @@ int der_tests(void) | ||||
|    unsigned char utf8_buf[32]; | ||||
|    wchar_t utf8_out[32]; | ||||
| 
 | ||||
|    der_cacert_test(); | ||||
| 
 | ||||
|    DO(mp_init_multi(&a, &b, &c, &d, &e, &f, &g, NULL)); | ||||
|    for (zz = 0; zz < 16; zz++) { | ||||
| #ifdef USE_TFM | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user