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
9extern "C" {
10
11#include "includes.h"
12#include "sshkey.h"
13#include "ssherr.h"
14
15static 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
25int 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