Mercurial > dropbear
comparison fuzz/fuzzer-kexcurve25519.c @ 1756:d5680e12ac33
Move fuzzing code to fuzz/ subdirectory, improve Makefile.in
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 23 Oct 2020 23:10:20 +0800 |
parents | fuzzer-kexcurve25519.c@d32bcb5c557d |
children | 0cc85b4a4abb |
comparison
equal
deleted
inserted
replaced
1753:7c0fcd19e492 | 1756:d5680e12ac33 |
---|---|
1 #include "fuzz.h" | |
2 #include "session.h" | |
3 #include "fuzz-wrapfd.h" | |
4 #include "debug.h" | |
5 #include "runopts.h" | |
6 #include "algo.h" | |
7 #include "bignum.h" | |
8 | |
9 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { | |
10 static int once = 0; | |
11 static struct key_context* keep_newkeys = NULL; | |
12 /* number of generated parameters is limited by the timeout for the first run. | |
13 TODO move this to the libfuzzer initialiser function instead if the timeout | |
14 doesn't apply there */ | |
15 #define NUM_PARAMS 20 | |
16 static struct kex_curve25519_param *curve25519_params[NUM_PARAMS]; | |
17 | |
18 if (!once) { | |
19 fuzz_common_setup(); | |
20 fuzz_svr_setup(); | |
21 | |
22 keep_newkeys = (struct key_context*)m_malloc(sizeof(struct key_context)); | |
23 keep_newkeys->algo_kex = fuzz_get_algo(sshkex, "curve25519-sha256"); | |
24 keep_newkeys->algo_hostkey = DROPBEAR_SIGNKEY_ED25519; | |
25 ses.newkeys = keep_newkeys; | |
26 | |
27 /* Pre-generate parameters */ | |
28 int i; | |
29 for (i = 0; i < NUM_PARAMS; i++) { | |
30 curve25519_params[i] = gen_kexcurve25519_param(); | |
31 } | |
32 | |
33 once = 1; | |
34 } | |
35 | |
36 if (fuzz_set_input(Data, Size) == DROPBEAR_FAILURE) { | |
37 return 0; | |
38 } | |
39 | |
40 m_malloc_set_epoch(1); | |
41 | |
42 if (setjmp(fuzz.jmp) == 0) { | |
43 /* Based on recv_msg_kexdh_init()/send_msg_kexdh_reply() | |
44 with DROPBEAR_KEX_CURVE25519 */ | |
45 ses.newkeys = keep_newkeys; | |
46 | |
47 /* Choose from the collection of curve25519 params */ | |
48 unsigned int e = buf_getint(fuzz.input); | |
49 struct kex_curve25519_param *curve25519_param = curve25519_params[e % NUM_PARAMS]; | |
50 | |
51 buffer * ecdh_qs = buf_getstringbuf(fuzz.input); | |
52 | |
53 ses.kexhashbuf = buf_new(KEXHASHBUF_MAX_INTS); | |
54 kexcurve25519_comb_key(curve25519_param, ecdh_qs, svr_opts.hostkey); | |
55 | |
56 mp_clear(ses.dh_K); | |
57 m_free(ses.dh_K); | |
58 buf_free(ecdh_qs); | |
59 | |
60 buf_free(ses.hash); | |
61 buf_free(ses.session_id); | |
62 /* kexhashbuf is freed in kexdh_comb_key */ | |
63 | |
64 m_malloc_free_epoch(1, 0); | |
65 } else { | |
66 m_malloc_free_epoch(1, 1); | |
67 TRACE(("dropbear_exit longjmped")) | |
68 /* dropbear_exit jumped here */ | |
69 } | |
70 | |
71 return 0; | |
72 } |