etc.git


etc

~ scripts and random things
git clone https://github.com/djnnvx/etc.git
log | files | refs | archive

fuzz_cms.c (2203B)

      1 /*
      2  * CMS / PKCS#7 (S/MIME) parsing, reachable via gpgsm on an attacker-supplied
      3  * message. Iterated ksba_cms_parse drives the state machine, then the accessors.
      4  * Largest parser in the tree: cms.c + cms-parser.c.
      5  */
      6 #include "harness.h"
      7 
      8 static int fuzz_one(const uint8_t *data, size_t size)
      9 {
     10     ksba_reader_t reader;
     11     ksba_cms_t cms;
     12     ksba_stop_reason_t sr = KSBA_SR_RUNNING;
     13     int guard = 0, i;
     14 
     15     if (ksba_reader_new(&reader))
     16         return 0;
     17     if (ksba_reader_set_mem(reader, data, size)) {
     18         ksba_reader_release(reader);
     19         return 0;
     20     }
     21     if (ksba_cms_new(&cms)) {
     22         ksba_reader_release(reader);
     23         return 0;
     24     }
     25     ksba_cms_set_reader_writer(cms, reader, NULL);
     26 
     27     do {
     28         if (ksba_cms_parse(cms, &sr))
     29             break;
     30     } while (sr != KSBA_SR_READY && ++guard < 100000);
     31 
     32     ksba_cms_get_content_type(cms, 0);
     33     ksba_cms_get_content_type(cms, 1);
     34 
     35     for (i = 0; i < KSBA_FUZZ_MAXITER && ksba_cms_get_digest_algo_list(cms, i); i++)
     36         ;
     37     for (i = 0; i < KSBA_FUZZ_MAXITER; i++) {
     38         char *issuer = NULL;
     39         ksba_sexp_t serial = NULL;
     40         if (ksba_cms_get_issuer_serial(cms, i, &issuer, &serial))
     41             break;
     42         ksba_free(issuer);
     43         ksba_free(serial);
     44     }
     45     for (i = 0; i < KSBA_FUZZ_MAXITER; i++) {
     46         ksba_cert_t c = ksba_cms_get_cert(cms, i);
     47         if (!c)
     48             break;
     49         ksba_cert_release(c);
     50     }
     51     for (i = 0; i < KSBA_FUZZ_MAXITER; i++) {
     52         char *digest = NULL;
     53         size_t dlen;
     54         if (ksba_cms_get_message_digest(cms, i, &digest, &dlen))
     55             break;
     56         ksba_free(digest);
     57     }
     58     for (i = 0; i < KSBA_FUZZ_MAXITER; i++) {
     59         ksba_isotime_t st;
     60         if (ksba_cms_get_signing_time(cms, i, st))
     61             break;
     62     }
     63     for (i = 0; i < KSBA_FUZZ_MAXITER; i++) {
     64         ksba_sexp_t v = ksba_cms_get_sig_val(cms, i);
     65         if (!v)
     66             break;
     67         ksba_free(v);
     68     }
     69     for (i = 0; i < KSBA_FUZZ_MAXITER; i++) {
     70         ksba_sexp_t v = ksba_cms_get_enc_val(cms, i);
     71         if (!v)
     72             break;
     73         ksba_free(v);
     74     }
     75 
     76     ksba_cms_release(cms);
     77     ksba_reader_release(reader);
     78     return 0;
     79 }