xref: /freebsd/crypto/openssh/regress/misc/fuzz-harness/sig_fuzz.cc (revision dd41de95a84d979615a2ef11df6850622bf6184e)
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 
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 
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   static struct sshkey *ed25519 = generate_or_die(KEY_ED25519, 0);
35   static const char *data = "If everyone started announcing his nose had "
36       "run away, I don’t know how it would all end";
37   static const size_t dlen = strlen(data);
38 
39 #ifdef WITH_OPENSSL
40   sshkey_verify(rsa, sig, slen, (const u_char *)data, dlen, NULL, 0);
41   sshkey_verify(dsa, sig, slen, (const u_char *)data, dlen, NULL, 0);
42   sshkey_verify(ecdsa256, sig, slen, (const u_char *)data, dlen, NULL, 0);
43   sshkey_verify(ecdsa384, sig, slen, (const u_char *)data, dlen, NULL, 0);
44   sshkey_verify(ecdsa521, sig, slen, (const u_char *)data, dlen, NULL, 0);
45 #endif
46   sshkey_verify(ed25519, sig, slen, (const u_char *)data, dlen, NULL, 0);
47   return 0;
48 }
49 
50 } // extern
51