| /* |
| * Copyright (C) 2019 Free Software Foundation, Inc. |
| * |
| * This file is part of LIBTASN1. |
| * |
| * The LIBTASN1 library 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 2.1 of the License, or (at your option) any later version. |
| * |
| * This library 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 this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| * 02110-1301, USA |
| */ |
| |
| /* |
| Helper tool to convert a corpus from libtasn1_array2tree_fuzzer into a asn1_static_node C code. |
| |
| Example usage: |
| $ cat libtasn1_array2tree_fuzzer.in/e04b8bc97fcf0d6386dfa44e32b1700e42e0eb64 | ./corpus2array |
| const asn1_static_node tab[] = { |
| { "999=999", CONST_UNIVERSAL|CONST_IMPLICIT|CONST_SET|CONST_ASSIGN|CONST_DOWN, "993\xff~\xff$y\xd9\x80" }, |
| { NULL, 0, NULL } |
| }; cat leak-d69d42ff01f6c3acca35dee27538a99e6821fced | ./corpus2array |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <ctype.h> |
| |
| struct fuzz_elem { |
| unsigned int type; |
| char name[20]; |
| char value[20]; |
| }; |
| |
| static char *escape(unsigned char *s) |
| { |
| static char out[19 * 6 + 1]; |
| char *p = out; |
| |
| while (*s) { |
| if (*s > 127) { |
| if (isxdigit(s[1])) { |
| sprintf(p, "\\u%04x", *s++); |
| p += 6; |
| } else { |
| sprintf(p, "\\x%02x", *s++); |
| p += 4; |
| } |
| } else if (*s == '\n') { |
| sprintf(p, "\\n"); |
| p += 2; |
| s++; |
| } else if (*s == '\t') { |
| sprintf(p, "\\t"); |
| p += 2; |
| s++; |
| } else |
| *p++ = *s++; |
| } |
| *p = 0; |
| |
| return out; |
| } |
| |
| static const char *typename[24] = { |
| "CONST_UNIVERSAL", |
| "CONST_PRIVATE", |
| "CONST_APPLICATION", |
| "CONST_EXPLICIT", |
| "CONST_IMPLICIT", |
| "CONST_TAG", |
| "CONST_OPTION", |
| "CONST_DEFAULT", |
| "CONST_TRUE", |
| "CONST_FALSE", |
| "CONST_LIST", |
| "CONST_MIN_MAX", |
| "CONST_1_PARAM", |
| "CONST_SIZE", |
| "CONST_DEFINED_BY", |
| "CONST_GENERALIZED", |
| "CONST_UTC", |
| NULL, /* #define CONST_IMPORTS (1<<25) */ |
| "CONST_NOT_USED", |
| "CONST_SET", |
| "CONST_ASSIGN", |
| "CONST_DOWN", |
| "CONST_RIGHT", |
| NULL |
| }; |
| |
| int main(void) |
| { |
| struct fuzz_elem e; |
| |
| printf("const asn1_static_node tab[] = {\n"); |
| |
| while (fread(&e, sizeof(e), 1, stdin) == 1) { |
| e.name[sizeof(e.name) - 1] = 0; |
| e.value[sizeof(e.value) - 1] = 0; |
| if (strcmp(e.name, "NULL")) |
| printf(" { \"%s\"", escape((unsigned char *) e.name)); |
| else |
| printf(" { NULL"); |
| |
| if (e.type) { |
| int add = 0; |
| |
| // we leave the lowest 8 bit out |
| if ((e.type & 0xFF) == 17) { |
| printf(", ASN1_ETYPE_TIME"); |
| add = 1; |
| } |
| |
| for (int i = 8; i < 32 ; i++) { |
| if ((e.type & (1U << i)) && typename[i - 8]) { |
| printf(add ? "|%s" : ", %s", typename[i - 8]); |
| add = 1; |
| } |
| } |
| |
| if (!add) |
| printf(", %u", e.type); |
| } else |
| printf(", 0"); |
| |
| if (strcmp(e.value, "NULL")) |
| printf(", \"%s\" },\n", escape((unsigned char *) e.value)); |
| else |
| printf(", NULL },"); |
| } |
| |
| printf(" { NULL, 0, NULL }\n"); |
| printf("};\n"); |
| |
| return 0; |
| } |