etc~ scripts and random things |
| git clone https://github.com/djnnvx/etc.git |
| log | files | refs | archive |
fuzz_cert.c (2772B)
1 /* 2 * X.509 cert parsing via ksba_cert_init_from_mem. Parsing is lazy, so the 3 * accessors below force the deep parse (cert/dn/keyinfo/name/oid/time). 4 * Reachable via gpgsm with an attacker-supplied certificate. 5 */ 6 #include "harness.h" 7 8 static int fuzz_one(const uint8_t *data, size_t size) 9 { 10 ksba_cert_t cert; 11 12 if (ksba_cert_new(&cert)) 13 return 0; 14 15 if (!ksba_cert_init_from_mem(cert, data, size)) { 16 char *s; 17 ksba_isotime_t t; 18 ksba_sexp_t kid, serial; 19 ksba_name_t nm, nm2; 20 ksba_crl_reason_t reason; 21 const char *oid; 22 int i, crit, ca, pathlen; 23 unsigned int flags; 24 size_t off, len; 25 26 ksba_free(ksba_cert_get_serial(cert)); 27 (void)ksba_cert_get_digest_algo(cert); /* const, do not free */ 28 29 for (i = 0; i < KSBA_FUZZ_MAXITER && (s = ksba_cert_get_issuer(cert, i)); i++) 30 ksba_free(s); 31 for (i = 0; i < KSBA_FUZZ_MAXITER && (s = ksba_cert_get_subject(cert, i)); i++) 32 ksba_free(s); 33 34 ksba_cert_get_validity(cert, 0, t); 35 ksba_cert_get_validity(cert, 1, t); 36 37 ksba_free(ksba_cert_get_public_key(cert)); 38 ksba_free(ksba_cert_get_sig_val(cert)); 39 40 for (i = 0; i < KSBA_FUZZ_MAXITER && 41 !ksba_cert_get_extension(cert, i, &oid, &crit, &off, &len); i++) 42 ; 43 44 ksba_cert_is_ca(cert, &ca, &pathlen); 45 ksba_cert_get_key_usage(cert, &flags); 46 if (!ksba_cert_get_cert_policies(cert, &s)) 47 ksba_free(s); 48 if (!ksba_cert_get_ext_key_usages(cert, &s)) 49 ksba_free(s); 50 51 for (i = 0; i < KSBA_FUZZ_MAXITER; i++) { 52 nm = nm2 = NULL; 53 if (ksba_cert_get_crl_dist_point(cert, i, &nm, &nm2, &reason)) 54 break; 55 drain_name(nm); 56 drain_name(nm2); 57 } 58 59 kid = serial = NULL; 60 nm = NULL; 61 if (!ksba_cert_get_auth_key_id(cert, &kid, &nm, &serial)) { 62 ksba_free(kid); 63 ksba_free(serial); 64 drain_name(nm); 65 } 66 kid = NULL; 67 if (!ksba_cert_get_subj_key_id(cert, &crit, &kid)) 68 ksba_free(kid); 69 70 for (i = 0; i < KSBA_FUZZ_MAXITER; i++) { 71 char *method = NULL; 72 nm = NULL; 73 if (ksba_cert_get_authority_info_access(cert, i, &method, &nm)) 74 break; 75 ksba_free(method); 76 drain_name(nm); 77 } 78 for (i = 0; i < KSBA_FUZZ_MAXITER; i++) { 79 char *method = NULL; 80 nm = NULL; 81 if (ksba_cert_get_subject_info_access(cert, i, &method, &nm)) 82 break; 83 ksba_free(method); 84 drain_name(nm); 85 } 86 } 87 88 ksba_cert_release(cert); 89 return 0; 90 }