libressl-portable/tests/bn_to_string.c
2023-09-03 18:24:16 -07:00

253 lines
4.5 KiB
C

/* $OpenBSD: bn_to_string.c,v 1.5 2023/04/10 21:00:16 tb Exp $ */
/*
* Copyright (c) 2019 Theo Buehler <tb@openbsd.org>
*
* 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 <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/x509v3.h>
struct bn_to_string_tests {
const char *input;
const char *want;
} testcases[] = {
{
.input = "0x0",
.want = "0",
},
{
.input = "-0x0",
.want = "0",
},
{
.input = "0x7",
.want = "7",
},
{
.input = "-0x7",
.want = "-7",
},
{
.input = "0x8",
.want = "8",
},
{
.input = "-0x8",
.want = "-8",
},
{
.input = "0xF",
.want = "15",
},
{
.input = "-0xF",
.want = "-15",
},
{
.input = "0x10",
.want = "16",
},
{
.input = "-0x10",
.want = "-16",
},
{
.input = "0x7F",
.want = "127",
},
{
.input = "-0x7F",
.want = "-127",
},
{
.input = "0x80",
.want = "128",
},
{
.input = "-0x80",
.want = "-128",
},
{
.input = "0xFF",
.want = "255",
},
{
.input = "-0xFF",
.want = "-255",
},
{
.input = "0x100",
.want = "256",
},
{
.input = "0x7FFF",
.want = "32767",
},
{
.input = "-0x7FFF",
.want = "-32767",
},
{
.input = "0x8000",
.want = "32768",
},
{
.input = "-0x8000",
.want = "-32768",
},
{
.input = "0xFFFF",
.want = "65535",
},
{
.input = "-0xFFFF",
.want = "-65535",
},
{
.input = "0x10000",
.want = "65536",
},
{
.input = "-0x10000",
.want = "-65536",
},
{
.input = "0x7FFFFFFF",
.want = "2147483647",
},
{
.input = "-0x7FFFFFFF",
.want = "-2147483647",
},
{
.input = "0x80000000",
.want = "2147483648",
},
{
.input = "-0x80000000",
.want = "-2147483648",
},
{
.input = "0xFFFFFFFF",
.want = "4294967295",
},
{
.input = "-0xFFFFFFFF",
.want = "-4294967295",
},
{
.input = "0x100000000",
.want = "4294967296",
},
{
.input = "-0x100000000",
.want = "-4294967296",
},
{
.input = "0x7FFFFFFFFFFFFFFF",
.want = "9223372036854775807",
},
{
.input = "-0x7FFFFFFFFFFFFFFF",
.want = "-9223372036854775807",
},
{
.input = "0x8000000000000000",
.want = "9223372036854775808",
},
{
.input = "-0x8000000000000000",
.want = "-9223372036854775808",
},
{
.input = "0xFFFFFFFFFFFFFFFF",
.want = "18446744073709551615",
},
{
.input = "-0xFFFFFFFFFFFFFFFF",
.want = "-18446744073709551615",
},
{
.input = "0x10000000000000000",
.want = "18446744073709551616",
},
{
.input = "-0x10000000000000000",
.want = "-18446744073709551616",
},
{
.input = "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
.want = "170141183460469231731687303715884105727",
},
{
.input = "-0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
.want = "-170141183460469231731687303715884105727",
},
{
.input = "0x80000000000000000000000000000000",
.want = "0x80000000000000000000000000000000",
},
{
.input = "-0x80000000000000000000000000000000",
.want = "-0x80000000000000000000000000000000",
},
{
.input = "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
.want = "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
},
{
.input = "-0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
.want = "-0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
},
{
.input = "0x100000000000000000000000000000000",
.want = "0x0100000000000000000000000000000000",
},
{
.input = "-0x100000000000000000000000000000000",
.want = "-0x0100000000000000000000000000000000",
},
{
.input = NULL,
},
};
int
main(void)
{
struct bn_to_string_tests *test;
ASN1_INTEGER *aint;
char *got;
int failed = 0;
for (test = testcases; test->input != NULL; test++) {
if ((aint = s2i_ASN1_INTEGER(NULL, test->input)) == NULL)
errx(1, "s2i_ASN1_INTEGER(%s)", test->input);
if ((got = i2s_ASN1_INTEGER(NULL, aint)) == NULL)
errx(1, "i2s_ASN1_INTEGER(%s)", test->input);
if (strcmp(got, test->want) != 0) {
warnx("want: %s, got: %s", test->want, got);
failed |= 1;
}
ASN1_INTEGER_free(aint);
free(got);
}
return failed;
}