| /* |
| * Copyright(c) 2019 Free Software Foundation, Inc. |
| * |
| * This file is part of libtasn1. |
| * |
| * Libtasn1 is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU Lesser General Public License as published by |
| * the Free Software Foundation, either version 3 of the License, or |
| * (at your option) any later version. |
| * |
| * Libtasn1 is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public License |
| * along with libtasn1. If not, see <https://www.gnu.org/licenses/>. |
| * |
| * This fuzzer is testing asn1_array2tree()'s robustness with arbitrary |
| * input data. |
| */ |
| |
| #include <config.h> |
| |
| #include <assert.h> // assert |
| #include <stdlib.h> // malloc, free |
| #include <string.h> // memcpy |
| |
| #include "libtasn1.h" |
| #include "fuzzer.h" |
| |
| const asn1_static_node pkix_asn1_tab[] = { |
| { "PKIX1Implicit88", 536875024, NULL }, |
| { NULL, 0, NULL } |
| }; |
| |
| #define NAMESIZE 20 |
| #define VALUESIZE 20 |
| struct fuzz_elem { |
| unsigned int type; |
| char name[NAMESIZE]; |
| char value[VALUESIZE]; |
| }; |
| |
| #define MAXELEM 100 |
| #define MAXDATASIZE (100 * sizeof(struct fuzz_elem)) |
| |
| int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) |
| { |
| if (size > MAXDATASIZE) // same as max_len = <MAXDATASIZE> in .options file |
| return 0; |
| |
| struct fuzz_elem *elem = (struct fuzz_elem *) malloc(size); |
| assert(elem != NULL); |
| memcpy(elem, data, size); |
| |
| int nelem = size / sizeof(struct fuzz_elem); |
| asn1_static_node tab[MAXELEM + 1]; // avoid VLA here |
| |
| for (int it = 0; it < nelem; it++) { |
| tab[it].type = elem[it].type; |
| elem[it].name[NAMESIZE - 1] = 0; |
| if (strcmp(elem[it].name, "NULL")) |
| tab[it].name = elem[it].name; |
| else |
| tab[it].name = NULL; |
| elem[it].value[VALUESIZE -1] = 0; |
| if (strcmp(elem[it].value, "NULL")) |
| tab[it].value = elem[it].value; |
| else |
| tab[it].value = NULL; |
| } |
| |
| // end-of-array indicator |
| tab[nelem].type = 0; |
| tab[nelem].name = NULL; |
| tab[nelem].value = NULL; |
| |
| int result; |
| asn1_node node = NULL; |
| char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE]; |
| |
| result = |
| asn1_array2tree(tab, &node, errorDescription); |
| |
| if (result == ASN1_SUCCESS) |
| asn1_delete_structure(&node); |
| |
| free(elem); |
| |
| return 0; |
| } |