From 7826ab30ab9bb85809470a6a830a29e343f25a49 Mon Sep 17 00:00:00 2001 From: "David M. Syzdek" Date: Thu, 12 Jan 2023 02:22:54 -0900 Subject: test-otp: adding test --- Makefile.am | 10 +++ tests/test-otp.c | 247 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 257 insertions(+) create mode 100644 tests/test-otp.c diff --git a/Makefile.am b/Makefile.am index ed10090..32bcbfc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -85,6 +85,7 @@ EXTRA_PROGRAMS = examples/totp-example \ tests/otp-data-convert \ tests/test-dict-otp \ tests/test-hotp \ + tests/test-otp \ tests/test-otp-decode \ tests/test-otp-encode \ tests/test-totp @@ -159,6 +160,7 @@ if ENABLE_TESTS TESTS += tests/test-otputil-hotp.sh TESTS += tests/test-otputil-totp.sh TESTS += tests/test-hotp + TESTS += tests/test-otp TESTS += tests/test-otp-decode TESTS += tests/test-otp-encode TESTS += tests/test-totp @@ -251,6 +253,14 @@ tests_test_hotp_LDADD = $(AM_LIBS) $(noinst_LIBRARIES) $(lib_LTLIBRARIES) tests_test_hotp_SOURCES = tests/test-hotp.c +# macros for tests/test-otp +tests_test_otp_DEPENDENCIES = Makefile $(noinst_LIBRARIES) $(lib_LTLIBRARIES) +tests_test_otp_LDADD = $(AM_LIBS) $(noinst_LIBRARIES) $(lib_LTLIBRARIES) +tests_test_otp_SOURCES = tests/test-otp.c \ + tests/otp-data.c \ + tests/otp-data.h + + # macros for tests/test-otp-decode tests_test_otp_decode_DEPENDENCIES = Makefile $(noinst_LIBRARIES) $(lib_LTLIBRARIES) tests_test_otp_decode_LDADD = $(AM_LIBS) $(noinst_LIBRARIES) $(lib_LTLIBRARIES) diff --git a/tests/test-otp.c b/tests/test-otp.c new file mode 100644 index 0000000..f9f4f43 --- /dev/null +++ b/tests/test-otp.c @@ -0,0 +1,247 @@ +/* + * OTP Utilities + * Copyright (C) 2022 David M. Syzdek . + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of David M. Syzdek nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID M SYZDEK BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* + * @file tests/test-otp.c + */ +#define _TESTS_TEST_OTP_C 1 + +/////////////// +// // +// Headers // +// // +/////////////// +#pragma mark - Headers + +#include + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "otp-data.h" + + +/////////////////// +// // +// Definitions // +// // +/////////////////// +#pragma mark - Definitions + +#ifndef PROGRAM_NAME +#define PROGRAM_NAME "test-otp" +#endif +#ifndef PACKAGE_BUGREPORT +#define PACKAGE_BUGREPORT "david@syzdek.net" +#endif +#ifndef PACKAGE_COPYRIGHT +#define PACKAGE_COPYRIGHT "" +#endif +#ifndef PACKAGE_NAME +#define PACKAGE_NAME "" +#endif +#ifndef PACKAGE_VERSION +#define PACKAGE_VERSION "" +#endif + + +///////////////// +// // +// Variables // +// // +///////////////// +#pragma mark - Variables + +static int verbose = 0; +static int quiet = 0; +static int ignore_errors = 0; + + +////////////////// +// // +// Prototypes // +// // +////////////////// +#pragma mark - Prototypes + +int +main( + int argc, + char * argv[] ); + + +///////////////// +// // +// Functions // +// // +///////////////// +#pragma mark - Functions + +int +main( + int argc, + char * argv[] ) +{ + int c; + int opt_index; + int pos; + const otputil_bv_t * dat; + otptest_t * rec; + int errs; + char * res; + + // getopt options + static const char * short_opt = "chqVv"; + static struct option long_opt[] = + { + {"help", no_argument, NULL, 'h' }, + {"quiet", no_argument, NULL, 'q' }, + {"silent", no_argument, NULL, 'q' }, + {"version", no_argument, NULL, 'V' }, + {"verbose", no_argument, NULL, 'v' }, + { NULL, 0, NULL, 0 } + }; + + while((c = getopt_long(argc, argv, short_opt, long_opt, &opt_index)) != -1) + { + switch(c) + { + case -1: /* no more arguments */ + case 0: /* long options toggles */ + break; + + case 'c': + ignore_errors = 1; + break; + + case 'h': + printf("Usage: %s [OPTIONS]\n", PROGRAM_NAME); + printf("OPTIONS:\n"); + printf(" -c report errors, but continue\n"); + printf(" -h, --help print this help and exit\n"); + printf(" -q, --quiet, --silent do not print messages\n"); + printf(" -V, --version print version number and exit\n"); + printf(" -v, --verbose print verbose messages\n"); + printf("\n"); + return(0); + + case 'q': + quiet++; + break; + + case 'V': + printf("%s (%s) %s\n", PROGRAM_NAME, PACKAGE_NAME, PACKAGE_VERSION); + printf("Written by David M. Syzdek.\n"); + return(0); + + case 'v': + verbose++; + break; + + case '?': + fprintf(stderr, "Try `%s --help' for more information.\n", PROGRAM_NAME); + return(1); + + default: + fprintf(stderr, "%s: unrecognized option `--%c'\n", PROGRAM_NAME, c); + fprintf(stderr, "Try `%s --help' for more information.\n", PROGRAM_NAME); + return(1); + }; + }; + + errs = 0; + + if (!(quiet)) + { + printf("Hash Pass Phrase Seed Cnt Hex Six Word Format\n"); + printf("=========================================================================================\n"); + }; + for(pos = 0; ((otp_test_data[pos].hex)); pos++) + { + rec = &otp_test_data[pos]; + dat = &rec->dat; + + if ( (!(rec->pass)) || (!(rec->seed)) ) + continue; + switch(rec->method) + { + case OTPUTIL_MD_MD4: break; + case OTPUTIL_MD_MD5: break; + case OTPUTIL_MD_SHA1: break; + default: continue; + }; + + if (!(quiet)) + { + printf("%-5s ", otputil_md2str(rec->method)); + printf("%-17s ", rec->pass); + printf("%-9s ", rec->seed); + printf("%2i ", rec->count); + printf("%-20s ", rec->hex); + printf("%s\n", rec->six); + }; + + if ((res = otputil_otp_str(rec->pass, rec->seed, rec->count, rec->method, NULL, 0)) == NULL) + { + printf("otputil_otp_str(): unknown error\n"); + if (!(ignore_errors)) + return(1); + errs++; + }; + if ((res)) + { + if ((strcasecmp(res, rec->six))) + { + printf("otputil_otp_str(): expected \"%s\"\n", rec->six); + printf(" received \"%s\"\n", res); + if (!(ignore_errors)) + return(1); + errs++; + }; + }; + }; + + if (!(quiet)) + printf("%i errors encountered\n", errs); + + return( ((errs)) ? 1 : 0 ); +} + +/* end of source file */ -- cgit v1.2.3