|
|
@@ -88,125 +88,29 @@ const char ltc_der_tests_cacert_root_cert[] =
|
|
|
"omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD";
|
|
|
const unsigned long ltc_der_tests_cacert_root_cert_size = sizeof(ltc_der_tests_cacert_root_cert);
|
|
|
|
|
|
-/*
|
|
|
-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 [email protected]
|
|
|
- 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 [email protected]
|
|
|
- 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 [email protected]
|
|
|
- [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)
|
|
|
- */
|
|
|
+#ifdef LTC_DER_TESTS_PRINT_FLEXI
|
|
|
+
|
|
|
+#define LTC_DER_PRINT_FLEXI_NO_MAIN
|
|
|
+#include "../demos/der_print_flexi.c"
|
|
|
|
|
|
+static void s_der_tests_print_flexi(ltc_asn1_list* l)
|
|
|
+{
|
|
|
+ fprintf(stderr, "\n\n");
|
|
|
+ s_der_print_flexi_i(l, 0);
|
|
|
+ fprintf(stderr, "\n\n");
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+static void s_der_tests_print_flexi(ltc_asn1_list* l)
|
|
|
+{
|
|
|
+ LTC_UNUSED_PARAM(l);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef ASN1_FMTSTRING_FMT
|
|
|
#define ASN1_FMTSTRING_FMT "line: %d, type=%d, size=%lu, data=%p, self=%p, next=%p, prev=%p, parent=%p, child=%p"
|
|
|
#define ASN1_FMTSTRING_VAL(l) __LINE__, (l)->type, (l)->size, (l)->data, (l), (l)->next, (l)->prev, (l)->parent, (l)->child
|
|
|
+#endif
|
|
|
|
|
|
#define ASN1_ERR(l) fprintf(stderr, ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l)); \
|
|
|
exit(EXIT_FAILURE)
|
|
|
@@ -230,238 +134,6 @@ SEQUENCE(3 elem)
|
|
|
#define CHECK_ASN1_HAS_DATA(l) CHECK_ASN1_HAS(l, data)
|
|
|
#define CHECK_ASN1_HAS_NO_DATA(l) CHECK_ASN1_HAS_NO(l, data)
|
|
|
|
|
|
-#ifdef LTC_DER_TESTS_PRINT_FLEXI
|
|
|
-
|
|
|
-static void* s_xmalloc(int l)
|
|
|
-{
|
|
|
- void *r = XMALLOC(l);
|
|
|
-
|
|
|
-#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 3
|
|
|
- fprintf(stderr, "ALLOC %9d to %p\n", l, r);
|
|
|
-#endif
|
|
|
- if (!r) {
|
|
|
- fprintf(stderr, "Could not allocate %d bytes of memory\n", l);
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
- return r;
|
|
|
-}
|
|
|
-
|
|
|
-static void s_free(void *p)
|
|
|
-{
|
|
|
-#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 3
|
|
|
- fprintf(stderr, "FREE %p\n", p);
|
|
|
-#endif
|
|
|
- XFREE(p);
|
|
|
-}
|
|
|
-
|
|
|
-static void s_der_tests_print_flexi_i(ltc_asn1_list* l, unsigned int level)
|
|
|
-{
|
|
|
- char *buf = NULL;
|
|
|
- const char* name = NULL;
|
|
|
- const char* text = NULL;
|
|
|
- ltc_asn1_list* ostring = NULL;
|
|
|
- unsigned int n;
|
|
|
- int slen;
|
|
|
-
|
|
|
- switch (l->type)
|
|
|
- {
|
|
|
- case LTC_ASN1_EOL:
|
|
|
- name = "EOL";
|
|
|
- slen = snprintf(NULL, 0, ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l));
|
|
|
- buf = s_xmalloc(slen);
|
|
|
- slen = snprintf(buf, slen, ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l));
|
|
|
- text = buf;
|
|
|
- break;
|
|
|
- case LTC_ASN1_BOOLEAN:
|
|
|
- name = "BOOLEAN";
|
|
|
- {
|
|
|
- if (*(int*)l->data)
|
|
|
- text = "true";
|
|
|
- else
|
|
|
- text = "false";
|
|
|
- }
|
|
|
- break;
|
|
|
- case LTC_ASN1_INTEGER:
|
|
|
- name = "INTEGER";
|
|
|
- buf = s_xmalloc(((ltc_mp_get_digit_count(l->data) + 1) * ltc_mp.bits_per_digit) / 3);
|
|
|
- ltc_mp_toradix(l->data, buf, 10);
|
|
|
- text = buf;
|
|
|
- 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;
|
|
|
- int sz = l->size * 2 + 1;
|
|
|
- char* s = buf = s_xmalloc(sz);
|
|
|
- for (n = 0; n < l->size; ++n) {
|
|
|
- r = snprintf(s, sz, "%02X", ((unsigned char*)l->data)[n]);
|
|
|
- if (r < 0 || r >= sz) {
|
|
|
- fprintf(stderr, "%s boom\n", name);
|
|
|
- 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 len = 0;
|
|
|
- if (pk_oid_num_to_str(l->data, l->size, buf, &len) != CRYPT_BUFFER_OVERFLOW) {
|
|
|
- fprintf(stderr, "%s WTF\n", name);
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
- buf = s_xmalloc(len);
|
|
|
- if (pk_oid_num_to_str(l->data, l->size, buf, &len) != CRYPT_OK) {
|
|
|
- fprintf(stderr, "%s boom\n", name);
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
- 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;
|
|
|
- slen = 32;
|
|
|
- buf = s_xmalloc(slen);
|
|
|
- snprintf(buf, slen, "%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_GENERALIZEDTIME:
|
|
|
- name = "GENERALIZED TIME";
|
|
|
- {
|
|
|
- ltc_generalizedtime* gt = l->data;
|
|
|
- slen = 32;
|
|
|
- buf = s_xmalloc(slen);
|
|
|
- if(gt->fs)
|
|
|
- snprintf(buf, slen, "%04d-%02d-%02d %02d:%02d:%02d.%02dZ",
|
|
|
- gt->YYYY, gt->MM, gt->DD, gt->hh, gt->mm, gt->ss, gt->fs);
|
|
|
- else
|
|
|
- snprintf(buf, slen, "%04d-%02d-%02d %02d:%02d:%02dZ",
|
|
|
- gt->YYYY, gt->MM, gt->DD, gt->hh, gt->mm, gt->ss);
|
|
|
- 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_CUSTOM_TYPE:
|
|
|
- name = "NON STANDARD";
|
|
|
- {
|
|
|
- int r;
|
|
|
- int sz = 128;
|
|
|
- char* s = buf = s_xmalloc(sz);
|
|
|
-
|
|
|
- r = snprintf(s, sz, "[%s %s %llu]", der_asn1_class_to_string_map[l->klass], der_asn1_pc_to_string_map[l->pc], l->tag);
|
|
|
- if (r < 0 || r >= sz) {
|
|
|
- fprintf(stderr, "%s boom\n", name);
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
- s += r;
|
|
|
- sz -= r;
|
|
|
-
|
|
|
- text = buf;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- for (n = 0; n < level; ++n) {
|
|
|
- fprintf(stderr, " ");
|
|
|
- }
|
|
|
- if (name) {
|
|
|
- if (text)
|
|
|
- fprintf(stderr, "%s %s\n", name, text);
|
|
|
- else
|
|
|
- fprintf(stderr, "%s <missing decoding>\n", name);
|
|
|
- }
|
|
|
- else
|
|
|
- fprintf(stderr, "WTF type=%i\n", l->type);
|
|
|
-
|
|
|
- if (buf) {
|
|
|
- s_free(buf);
|
|
|
- buf = NULL;
|
|
|
- }
|
|
|
-
|
|
|
- if (ostring) {
|
|
|
- s_der_tests_print_flexi_i(ostring, level + 1);
|
|
|
- der_free_sequence_flexi(ostring);
|
|
|
- }
|
|
|
-
|
|
|
- if (l->child)
|
|
|
- s_der_tests_print_flexi_i(l->child, level + 1);
|
|
|
-
|
|
|
- if (l->next)
|
|
|
- s_der_tests_print_flexi_i(l->next, level);
|
|
|
-}
|
|
|
-
|
|
|
-static void s_der_tests_print_flexi(ltc_asn1_list* l)
|
|
|
-{
|
|
|
- fprintf(stderr, "\n\n");
|
|
|
- s_der_tests_print_flexi_i(l, 0);
|
|
|
- fprintf(stderr, "\n\n");
|
|
|
-}
|
|
|
-
|
|
|
-#else
|
|
|
-static void s_der_tests_print_flexi(ltc_asn1_list* l)
|
|
|
-{
|
|
|
- LTC_UNUSED_PARAM(l);
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
static void der_cacert_test(void)
|
|
|
{
|
|
|
unsigned char buf[sizeof(ltc_der_tests_cacert_root_cert)];
|