blob: fc30524b7a8f72bfce299765fe8811ffead3d399 [file] [log] [blame]
/*
* 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;
}