From 725e2e31524c46af042e95f47b6eb978aa2666da Mon Sep 17 00:00:00 2001 From: jsing Date: Thu, 9 Dec 2021 16:30:05 +0000 Subject: [PATCH] Add initial tests for coverage of ASN.1 basic/primitive types. --- regress/lib/libcrypto/asn1/Makefile | 3 +- regress/lib/libcrypto/asn1/asn1basic.c | 133 +++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 regress/lib/libcrypto/asn1/asn1basic.c diff --git a/regress/lib/libcrypto/asn1/Makefile b/regress/lib/libcrypto/asn1/Makefile index 4b47bfdc2be..046d85bc81d 100644 --- a/regress/lib/libcrypto/asn1/Makefile +++ b/regress/lib/libcrypto/asn1/Makefile @@ -1,6 +1,7 @@ -# $OpenBSD: Makefile,v 1.7 2021/11/30 07:34:29 jsing Exp $ +# $OpenBSD: Makefile,v 1.8 2021/12/09 16:30:05 jsing Exp $ TESTS = \ + asn1basic \ asn1evp \ asn1string_copy \ asn1time \ diff --git a/regress/lib/libcrypto/asn1/asn1basic.c b/regress/lib/libcrypto/asn1/asn1basic.c new file mode 100644 index 00000000000..d2a1fc97ba4 --- /dev/null +++ b/regress/lib/libcrypto/asn1/asn1basic.c @@ -0,0 +1,133 @@ +/* $OpenBSD: asn1basic.c,v 1.1 2021/12/09 16:30:05 jsing Exp $ */ +/* + * Copyright (c) 2017, 2021 Joel Sing + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include + +static void +hexdump(const unsigned char *buf, size_t len) +{ + size_t i; + + for (i = 1; i <= len; i++) + fprintf(stderr, " 0x%02hhx,%s", buf[i - 1], i % 8 ? "" : "\n"); + + fprintf(stderr, "\n"); +} + +static int +asn1_compare_bytes(const char *label, const unsigned char *d1, int len1, + const unsigned char *d2, int len2) +{ + if (len1 != len2) { + fprintf(stderr, "FAIL: %s - byte lengths differ " + "(%i != %i)\n", label, len1, len2); + return 0; + } + if (memcmp(d1, d2, len1) != 0) { + fprintf(stderr, "FAIL: %s - bytes differ\n", label); + fprintf(stderr, "Got:\n"); + hexdump(d1, len1); + fprintf(stderr, "Want:\n"); + hexdump(d2, len2); + return 0; + } + return 1; +} + +const uint8_t asn1_boolean_false[] = { + 0x01, 0x01, 0x00, +}; +const uint8_t asn1_boolean_true[] = { + 0x01, 0x01, 0x01, +}; + +static int +asn1_boolean_test(void) +{ + uint8_t *p = NULL, *pp; + const uint8_t *q; + int len; + int failed = 1; + + if ((len = i2d_ASN1_BOOLEAN(0, NULL)) < 0) { + fprintf(stderr, "FAIL: i2d_ASN1_BOOLEAN false with NULL\n"); + goto failed; + } + if ((p = calloc(1, len)) == NULL) + errx(1, "calloc"); + pp = p; + if ((i2d_ASN1_BOOLEAN(0, &pp)) != len) { + fprintf(stderr, "FAIL: i2d_ASN1_BOOLEAN false\n"); + goto failed; + } + + if (!asn1_compare_bytes("BOOLEAN false", p, len, asn1_boolean_false, + sizeof(asn1_boolean_false))) + goto failed; + + q = p; + if (d2i_ASN1_BOOLEAN(NULL, &q, len) != 0) { + fprintf(stderr, "FAIL: BOOLEAN false did not decode to 0\n"); + goto failed; + } + + free(p); + p = NULL; + + if ((len = i2d_ASN1_BOOLEAN(1, NULL)) < 0) { + fprintf(stderr, "FAIL: i2d_ASN1_BOOLEAN true with NULL\n"); + goto failed; + } + if ((p = calloc(1, len)) == NULL) + errx(1, "calloc"); + pp = p; + if ((i2d_ASN1_BOOLEAN(1, &pp)) != len) { + fprintf(stderr, "FAIL: i2d_ASN1_BOOLEAN true\n"); + goto failed; + } + + if (!asn1_compare_bytes("BOOLEAN true", p, len, asn1_boolean_true, + sizeof(asn1_boolean_true))) + goto failed; + + q = p; + if (d2i_ASN1_BOOLEAN(NULL, &q, len) != 1) { + fprintf(stderr, "FAIL: BOOLEAN true did not decode to 0\n"); + goto failed; + } + + failed = 0; + + failed: + free(p); + + return failed; +} + +int +main(int argc, char **argv) +{ + int failed = 0; + + failed |= asn1_boolean_test(); + + return (failed); +} -- 2.20.1