summaryrefslogtreecommitdiffhomepage
path: root/fuzzer-pubkey.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2020-10-15 19:55:15 +0800
committerMatt Johnston <matt@ucc.asn.au>2020-10-15 19:55:15 +0800
commit0e3e8db5bfca0c579be55e7580a46c593c1384be (patch)
tree2b1a718f633fb95c1f2d689a591cf9e8642697f3 /fuzzer-pubkey.c
parent78e17f6ee9a944430da3e517ee1fe384fd6b275b (diff)
parent17873e8c922eded2cec86184673a6d110df6403f (diff)
merge from main
--HG-- branch : fuzz
Diffstat (limited to 'fuzzer-pubkey.c')
-rw-r--r--fuzzer-pubkey.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/fuzzer-pubkey.c b/fuzzer-pubkey.c
index 3dfe7b5..7c12cdc 100644
--- a/fuzzer-pubkey.c
+++ b/fuzzer-pubkey.c
@@ -20,19 +20,29 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
m_malloc_set_epoch(1);
- /* choose a keytype based on input */
- uint8_t b = 0;
- size_t i;
- for (i = 0; i < Size; i++) {
- b ^= Data[i];
- }
- const char* algoname = fuzz_signkey_names[b%DROPBEAR_SIGNKEY_NUM_NAMED];
- const char* keyblob = "blob"; /* keep short */
-
if (setjmp(fuzz.jmp) == 0) {
- fuzz_checkpubkey_line(fuzz.input, 5, "/home/me/authorized_keys",
- algoname, strlen(algoname),
- (unsigned char*)keyblob, strlen(keyblob));
+ buffer *line = buf_getstringbuf(fuzz.input);
+ buffer *keyblob = buf_getstringbuf(fuzz.input);
+
+ unsigned int algolen;
+ char* algoname = buf_getstring(keyblob, &algolen);
+
+ if (signature_type_from_name(algoname, algolen) == DROPBEAR_SIGNKEY_NONE) {
+ dropbear_exit("fuzzer imagined a bogus algorithm");
+ }
+
+ int ret = fuzz_checkpubkey_line(line, 5, "/home/me/authorized_keys",
+ algoname, algolen,
+ keyblob->data, keyblob->len);
+
+ if (ret == DROPBEAR_SUCCESS) {
+ /* fuzz_checkpubkey_line() should have cleaned up for failure */
+ svr_pubkey_options_cleanup();
+ }
+
+ buf_free(line);
+ buf_free(keyblob);
+ m_free(algoname);
m_malloc_free_epoch(1, 0);
} else {
m_malloc_free_epoch(1, 1);