1 // cc_fuzz_target test for public key parsing.
2
3 #include <stddef.h>
4 #include <stdio.h>
5 #include <stdint.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 extern "C" {
10
11 #include "includes.h"
12 #include "sshkey.h"
13 #include "ssherr.h"
14
generate_or_die(int type,unsigned bits)15 static struct sshkey *generate_or_die(int type, unsigned bits) {
16 int r;
17 struct sshkey *ret;
18 if ((r = sshkey_generate(type, bits, &ret)) != 0) {
19 fprintf(stderr, "generate(%d, %u): %s", type, bits, ssh_err(r));
20 abort();
21 }
22 return ret;
23 }
24
LLVMFuzzerTestOneInput(const uint8_t * sig,size_t slen)25 int LLVMFuzzerTestOneInput(const uint8_t* sig, size_t slen)
26 {
27 #ifdef WITH_OPENSSL
28 static struct sshkey *rsa = generate_or_die(KEY_RSA, 2048);
29 static struct sshkey *dsa = generate_or_die(KEY_DSA, 1024);
30 static struct sshkey *ecdsa256 = generate_or_die(KEY_ECDSA, 256);
31 static struct sshkey *ecdsa384 = generate_or_die(KEY_ECDSA, 384);
32 static struct sshkey *ecdsa521 = generate_or_die(KEY_ECDSA, 521);
33 #endif
34 struct sshkey_sig_details *details = NULL;
35 static struct sshkey *ed25519 = generate_or_die(KEY_ED25519, 0);
36 static const char *data = "If everyone started announcing his nose had "
37 "run away, I don’t know how it would all end";
38 static const size_t dlen = strlen(data);
39
40 #ifdef WITH_OPENSSL
41 sshkey_verify(rsa, sig, slen, (const u_char *)data, dlen, NULL, 0, &details);
42 sshkey_sig_details_free(details);
43 details = NULL;
44 sshkey_verify(dsa, sig, slen, (const u_char *)data, dlen, NULL, 0, &details);
45 sshkey_sig_details_free(details);
46 details = NULL;
47 sshkey_verify(ecdsa256, sig, slen, (const u_char *)data, dlen, NULL, 0, &details);
48 sshkey_sig_details_free(details);
49 details = NULL;
50 sshkey_verify(ecdsa384, sig, slen, (const u_char *)data, dlen, NULL, 0, &details);
51 sshkey_sig_details_free(details);
52 details = NULL;
53 sshkey_verify(ecdsa521, sig, slen, (const u_char *)data, dlen, NULL, 0, &details);
54 sshkey_sig_details_free(details);
55 details = NULL;
56 #endif
57 sshkey_verify(ed25519, sig, slen, (const u_char *)data, dlen, NULL, 0, &details);
58 sshkey_sig_details_free(details);
59 return 0;
60 }
61
62 } // extern
63