summaryrefslogtreecommitdiff
path: root/src/asn1Decoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/asn1Decoding.c')
-rw-r--r--src/asn1Decoding.c327
1 files changed, 0 insertions, 327 deletions
diff --git a/src/asn1Decoding.c b/src/asn1Decoding.c
deleted file mode 100644
index 65456bf..0000000
--- a/src/asn1Decoding.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/* asn1Decoding.c --- program to generate an ASN1 type from a DER coding.
- * Copyright (C) 2002-2014 Free Software Foundation, Inc.
- *
- * This file is part of LIBTASN1.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-
-#include <libtasn1.h>
-
-#include <progname.h>
-#include <version-etc.h>
-#include <read-file.h>
-#include "benchmark.h"
-
-static int decode (asn1_node definitions, const char *typeName, void *der,
- int der_len, int benchmark, int strict);
-
-/* This feature is available in gcc versions 2.5 and later. */
-#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
-#define ATTR_NO_RETRUN
-#else
-#define ATTR_NO_RETRUN __attribute__ ((__noreturn__))
-#endif
-
-ATTR_NO_RETRUN static void
-usage (int status)
-{
- if (status != EXIT_SUCCESS)
- fprintf (stderr, "Try `%s --help' for more information.\n", program_name);
- else
- {
- printf ("\
-Usage: %s [OPTION] DEFINITIONS ENCODED ASN1TYPE\n", program_name);
- printf ("\
-Decodes DER data in ENCODED file, for the ASN1TYPE element\n\
-described in ASN.1 DEFINITIONS file, and print decoded structures.\n\
-\n");
- printf ("\
- -b, --benchmark perform a benchmark on decoding\n\
- -s, --strict use strict DER decoding\n\
- -t, --no-time-strict use strict DER decoding but not in time fields\n\
- -h, --help display this help and exit\n\
- -v, --version output version information and exit\n");
- emit_bug_reporting_address ();
- }
- exit (status);
-}
-
-int
-main (int argc, char *argv[])
-{
- static const struct option long_options[] = {
- {"help", no_argument, 0, 'h'},
- {"strict", no_argument, 0, 's'},
- {"no-time-strict", no_argument, 0, 't'},
- {"debug", no_argument, 0, 'd'},
- {"benchmark", no_argument, 0, 'b'},
- {"version", no_argument, 0, 'v'},
- {0, 0, 0, 0}
- };
- int option_index = 0;
- int option_result;
- char *inputFileAsnName = NULL;
- char *inputFileDerName = NULL;
- char *typeName = NULL;
- asn1_node definitions = NULL;
- char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
- int asn1_result = ASN1_SUCCESS;
- unsigned char *der;
- int der_len = 0, benchmark = 0;
- int flags = 0, debug = 0;
- /* FILE *outputFile; */
-
- set_program_name (argv[0]);
-
- opterr = 0; /* disable error messages from getopt */
-
- while (1)
- {
-
- option_result =
- getopt_long (argc, argv, "hbdsvtc", long_options, &option_index);
-
- if (option_result == -1)
- break;
-
- switch (option_result)
- {
- case 'h': /* HELP */
- usage (EXIT_SUCCESS);
- break;
- case 'b':
- benchmark = 1;
- break;
- case 'd':
- debug = 1;
- break;
- case 's':
- case 't':
- flags |= ASN1_DECODE_FLAG_STRICT_DER;
- if (option_result == 't')
- flags |= ASN1_DECODE_FLAG_ALLOW_INCORRECT_TIME;
- break;
- case 'v': /* VERSION */
- version_etc (stdout, program_name, PACKAGE, VERSION,
- "Fabio Fiorina", NULL);
- exit (0);
- break;
- case '?': /* UNKNOW OPTION */
- fprintf (stderr,
- "asn1Decoding: option '%s' not recognized or without argument.\n\n",
- argv[optind - 1]);
- usage (EXIT_FAILURE);
- break;
- default:
- fprintf (stderr,
- "asn1Decoding: ?? getopt returned character code Ox%x ??\n",
- (unsigned)option_result);
- }
- }
-
- if (optind == argc || optind == argc - 1 || optind == argc - 2)
- {
- fprintf (stderr, "asn1Decoding: input files or ASN.1 type "
- "name missing\n");
- usage (EXIT_FAILURE);
- }
-
- inputFileAsnName = strdup(argv[optind]);
- inputFileDerName = strdup(argv[optind + 1]);
- typeName = strdup(argv[optind + 2]);
-
- if (!(inputFileAsnName && inputFileDerName && typeName))
- {
- fprintf(stderr, "allocation failed\n");
- free(inputFileAsnName);
- free(inputFileDerName);
- free(typeName);
- exit(1);
- }
-
- asn1_result =
- asn1_parser2tree (inputFileAsnName, &definitions, errorDescription);
-
- switch (asn1_result)
- {
- case ASN1_SUCCESS:
- fprintf (stderr, "Parse: done.\n");
- break;
- case ASN1_FILE_NOT_FOUND:
- fprintf (stderr, "asn1Decoding: FILE %s NOT FOUND\n", inputFileAsnName);
- break;
- case ASN1_SYNTAX_ERROR:
- case ASN1_IDENTIFIER_NOT_FOUND:
- case ASN1_NAME_TOO_LONG:
- fprintf (stderr, "asn1Decoding: %s\n", errorDescription);
- break;
- default:
- fprintf (stderr, "libtasn1 ERROR: %s\n", asn1_strerror (asn1_result));
- }
-
- if (asn1_result != ASN1_SUCCESS)
- {
- free (inputFileAsnName);
- free (inputFileDerName);
- free (typeName);
- exit (1);
- }
-
-
- {
- size_t tmplen;
- der = (unsigned char *) read_binary_file (inputFileDerName, &tmplen);
- der_len = tmplen;
- }
-
- /* read_binary_file() returns a buffer with more data than required,
- * with this reallocation we ensure that memory accesses outside the
- * boundaries are detected */
- if (der != NULL && debug != 0)
- der = realloc(der, der_len);
-
- if (der == NULL)
- {
- fprintf (stderr, "asn1Decoding: could not read '%s'\n",
- inputFileDerName);
- asn1_delete_structure (&definitions);
-
- free (inputFileAsnName);
- free (inputFileDerName);
- free (typeName);
- exit (1);
- }
-
- /*****************************************/
- /* ONLY FOR TEST */
- /*****************************************/
- /*
- der_len=0;
- outputFile=fopen("data.p12","w");
- while(fscanf(inputFile,"%c",der+der_len) != EOF){
- if((der_len>=0x11) && (der_len<=(0xe70)))
- fprintf(outputFile,"%c",der[der_len]);
- der_len++;
- }
- fclose(outputFile);
- fclose(inputFile);
- */
-
- if (decode (definitions, typeName, der, der_len, benchmark, flags) != ASN1_SUCCESS)
- {
- asn1_delete_structure (&definitions);
- free (inputFileAsnName);
- free (inputFileDerName);
- free (typeName);
- free (der);
- exit (1);
- }
-
- asn1_delete_structure (&definitions);
-
- free (der);
-
- free (inputFileAsnName);
- free (inputFileDerName);
- free (typeName);
-
- if (asn1_result != ASN1_SUCCESS)
- exit (1);
-
- exit (0);
-}
-
-static int
-simple_decode (asn1_node definitions, const char *typeName, void *der,
- int der_len, int benchmark, int flags)
-{
-
- int asn1_result;
- asn1_node structure = NULL;
- char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
-
- asn1_result = asn1_create_element (definitions, typeName, &structure);
-
- /* asn1_print_structure(stdout,structure,"",ASN1_PRINT_ALL); */
-
-
- if (asn1_result != ASN1_SUCCESS)
- {
- fprintf (stderr, "Structure creation: %s\n",
- asn1_strerror (asn1_result));
- asn1_delete_structure (&structure);
- return asn1_result;
- }
-
- if (flags != 0)
- asn1_result =
- asn1_der_decoding2(&structure, der, &der_len, flags, errorDescription);
- else
- asn1_result =
- asn1_der_decoding (&structure, der, der_len, errorDescription);
-
- if (!benchmark)
- fprintf (stderr, "\nDecoding: %s\n", asn1_strerror (asn1_result));
- if (asn1_result != ASN1_SUCCESS)
- {
- fprintf (stderr, "asn1Decoding: %s\n", errorDescription);
- asn1_delete_structure (&structure);
- return asn1_result;
- }
-
- if (!benchmark)
- {
- fprintf (stderr, "\nDECODING RESULT:\n");
- asn1_print_structure (stdout, structure, "",
- ASN1_PRINT_NAME_TYPE_VALUE);
- }
- asn1_delete_structure (&structure);
- return ASN1_SUCCESS;
-}
-
-static int
-decode (asn1_node definitions, const char *typeName, void *der, int der_len,
- int benchmark, int flags)
-{
- struct benchmark_st st;
-
- if (benchmark == 0)
- return simple_decode (definitions, typeName, der, der_len, benchmark, flags);
- else
- {
- start_benchmark (&st);
-
- do
- {
- simple_decode (definitions, typeName, der, der_len, benchmark, flags);
- st.size++;
- }
- while (benchmark_must_finish == 0);
-
- stop_benchmark (&st, "structures");
- fprintf (stdout, "\n");
-
- }
- return ASN1_SUCCESS;
-}