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