xref: /netbsd-src/crypto/external/bsd/openssl/dist/test/testutil/tests.c (revision 8fbed61efdd901c0e09614c9f45356aeeab23fe3)
113d40330Schristos /*
2fb48e4b2Schristos  * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved.
313d40330Schristos  *
4*8fbed61eSchristos  * Licensed under the Apache License 2.0 (the "License").  You may not use
513d40330Schristos  * this file except in compliance with the License.  You can obtain a copy
613d40330Schristos  * in the file LICENSE in the source distribution or at
713d40330Schristos  * https://www.openssl.org/source/license.html
813d40330Schristos  */
913d40330Schristos 
1013d40330Schristos #include "../testutil.h"
1113d40330Schristos #include "output.h"
1213d40330Schristos #include "tu_local.h"
1313d40330Schristos 
1413d40330Schristos #include <errno.h>
1513d40330Schristos #include <string.h>
1613d40330Schristos #include <ctype.h>
1713d40330Schristos #include "internal/nelem.h"
1813d40330Schristos #include <openssl/asn1.h>
1913d40330Schristos 
2013d40330Schristos /*
2113d40330Schristos  * Output a failed test first line.
2213d40330Schristos  * All items are optional are generally not preinted if passed as NULL.
2313d40330Schristos  * The special cases are for prefix where "ERROR" is assumed and for left
2413d40330Schristos  * and right where a non-failure message is produced if either is NULL.
2513d40330Schristos  */
test_fail_message_prefix(const char * prefix,const char * file,int line,const char * type,const char * left,const char * right,const char * op)2613d40330Schristos void test_fail_message_prefix(const char *prefix, const char *file,
2713d40330Schristos                               int line, const char *type,
2813d40330Schristos                               const char *left, const char *right,
2913d40330Schristos                               const char *op)
3013d40330Schristos {
3113d40330Schristos     test_printf_stderr("%s: ", prefix != NULL ? prefix : "ERROR");
3213d40330Schristos     if (type)
3313d40330Schristos         test_printf_stderr("(%s) ", type);
3413d40330Schristos     if (op != NULL) {
3513d40330Schristos         if (left != NULL && right != NULL)
3613d40330Schristos             test_printf_stderr("'%s %s %s' failed", left, op, right);
3713d40330Schristos         else
3813d40330Schristos             test_printf_stderr("'%s'", op);
3913d40330Schristos     }
4013d40330Schristos     if (file != NULL) {
4113d40330Schristos         test_printf_stderr(" @ %s:%d", file, line);
4213d40330Schristos     }
4313d40330Schristos     test_printf_stderr("\n");
4413d40330Schristos }
4513d40330Schristos 
4613d40330Schristos /*
4713d40330Schristos  * A common routine to output test failure messages.  Generally this should not
4813d40330Schristos  * be called directly, rather it should be called by the following functions.
4913d40330Schristos  *
5013d40330Schristos  * |desc| is a printf formatted description with arguments |args| that is
5113d40330Schristos  * supplied by the user and |desc| can be NULL.  |type| is the data type
5213d40330Schristos  * that was tested (int, char, ptr, ...).  |fmt| is a system provided
5313d40330Schristos  * printf format with following arguments that spell out the failure
5413d40330Schristos  * details i.e. the actual values compared and the operator used.
5513d40330Schristos  *
5613d40330Schristos  * The typical use for this is from an utility test function:
5713d40330Schristos  *
5813d40330Schristos  * int test6(const char *file, int line, int n) {
5913d40330Schristos  *     if (n != 6) {
6013d40330Schristos  *         test_fail_message(1, file, line, "int", "value %d is not %d", n, 6);
6113d40330Schristos  *         return 0;
6213d40330Schristos  *     }
6313d40330Schristos  *     return 1;
6413d40330Schristos  * }
6513d40330Schristos  *
6613d40330Schristos  * calling test6(3, "oops") will return 0 and produce out along the lines of:
6713d40330Schristos  *      FAIL oops: (int) value 3 is not 6\n
6813d40330Schristos  */
6913d40330Schristos static void test_fail_message(const char *prefix, const char *file, int line,
7013d40330Schristos                               const char *type, const char *left,
7113d40330Schristos                               const char *right, const char *op,
7213d40330Schristos                               const char *fmt, ...)
7313d40330Schristos             PRINTF_FORMAT(8, 9);
7413d40330Schristos 
75b328a949Sjoerg PRINTF_FORMAT(8, 0)
test_fail_message_va(const char * prefix,const char * file,int line,const char * type,const char * left,const char * right,const char * op,const char * fmt,va_list ap)7613d40330Schristos static void test_fail_message_va(const char *prefix, const char *file,
7713d40330Schristos                                  int line, const char *type,
7813d40330Schristos                                  const char *left, const char *right,
7913d40330Schristos                                  const char *op, const char *fmt, va_list ap)
8013d40330Schristos {
8113d40330Schristos     test_fail_message_prefix(prefix, file, line, type, left, right, op);
8213d40330Schristos     if (fmt != NULL) {
8313d40330Schristos         test_vprintf_stderr(fmt, ap);
8413d40330Schristos         test_printf_stderr("\n");
8513d40330Schristos     }
8613d40330Schristos     test_flush_stderr();
8713d40330Schristos }
8813d40330Schristos 
test_fail_message(const char * prefix,const char * file,int line,const char * type,const char * left,const char * right,const char * op,const char * fmt,...)8913d40330Schristos static void test_fail_message(const char *prefix, const char *file,
9013d40330Schristos                               int line, const char *type,
9113d40330Schristos                               const char *left, const char *right,
9213d40330Schristos                               const char *op, const char *fmt, ...)
9313d40330Schristos {
9413d40330Schristos     va_list ap;
9513d40330Schristos 
9613d40330Schristos     va_start(ap, fmt);
9713d40330Schristos     test_fail_message_va(prefix, file, line, type, left, right, op, fmt, ap);
9813d40330Schristos     va_end(ap);
9913d40330Schristos }
10013d40330Schristos 
test_info_c90(const char * desc,...)10113d40330Schristos void test_info_c90(const char *desc, ...)
10213d40330Schristos {
10313d40330Schristos     va_list ap;
10413d40330Schristos 
10513d40330Schristos     va_start(ap, desc);
10613d40330Schristos     test_fail_message_va("INFO", NULL, -1, NULL, NULL, NULL, NULL, desc, ap);
10713d40330Schristos     va_end(ap);
10813d40330Schristos }
10913d40330Schristos 
test_info(const char * file,int line,const char * desc,...)11013d40330Schristos void test_info(const char *file, int line, const char *desc, ...)
11113d40330Schristos {
11213d40330Schristos     va_list ap;
11313d40330Schristos 
11413d40330Schristos     va_start(ap, desc);
11513d40330Schristos     test_fail_message_va("INFO", file, line, NULL, NULL, NULL, NULL, desc, ap);
11613d40330Schristos     va_end(ap);
11713d40330Schristos }
11813d40330Schristos 
test_error_c90(const char * desc,...)11913d40330Schristos void test_error_c90(const char *desc, ...)
12013d40330Schristos {
12113d40330Schristos     va_list ap;
12213d40330Schristos 
12313d40330Schristos     va_start(ap, desc);
12413d40330Schristos     test_fail_message_va(NULL, NULL, -1, NULL, NULL, NULL, NULL, desc, ap);
12513d40330Schristos     va_end(ap);
12613d40330Schristos     test_printf_stderr("\n");
12713d40330Schristos }
12813d40330Schristos 
test_error(const char * file,int line,const char * desc,...)12913d40330Schristos void test_error(const char *file, int line, const char *desc, ...)
13013d40330Schristos {
13113d40330Schristos     va_list ap;
13213d40330Schristos 
13313d40330Schristos     va_start(ap, desc);
13413d40330Schristos     test_fail_message_va(NULL, file, line, NULL, NULL, NULL, NULL, desc, ap);
13513d40330Schristos     va_end(ap);
13613d40330Schristos     test_printf_stderr("\n");
13713d40330Schristos }
13813d40330Schristos 
test_perror(const char * s)13913d40330Schristos void test_perror(const char *s)
14013d40330Schristos {
14113d40330Schristos     /*
14213d40330Schristos      * Using openssl_strerror_r causes linking issues since it isn't
14313d40330Schristos      * exported from libcrypto.so
14413d40330Schristos      */
14513d40330Schristos     TEST_error("%s: %s", s, strerror(errno));
14613d40330Schristos }
14713d40330Schristos 
test_note(const char * fmt,...)14813d40330Schristos void test_note(const char *fmt, ...)
14913d40330Schristos {
15013d40330Schristos     if (fmt != NULL) {
15113d40330Schristos         va_list ap;
15213d40330Schristos 
15313d40330Schristos         va_start(ap, fmt);
15413d40330Schristos         test_vprintf_stderr(fmt, ap);
15513d40330Schristos         va_end(ap);
15613d40330Schristos         test_printf_stderr("\n");
15713d40330Schristos     }
15813d40330Schristos     test_flush_stderr();
15913d40330Schristos }
16013d40330Schristos 
161*8fbed61eSchristos 
test_skip(const char * file,int line,const char * desc,...)162*8fbed61eSchristos int test_skip(const char *file, int line, const char *desc, ...)
163*8fbed61eSchristos {
164*8fbed61eSchristos     va_list ap;
165*8fbed61eSchristos 
166*8fbed61eSchristos     va_start(ap, desc);
167*8fbed61eSchristos     test_fail_message_va("SKIP", file, line, NULL, NULL, NULL, NULL, desc, ap);
168*8fbed61eSchristos     va_end(ap);
169*8fbed61eSchristos     return TEST_SKIP_CODE;
170*8fbed61eSchristos }
171*8fbed61eSchristos 
test_skip_c90(const char * desc,...)172*8fbed61eSchristos int test_skip_c90(const char *desc, ...)
173*8fbed61eSchristos {
174*8fbed61eSchristos     va_list ap;
175*8fbed61eSchristos 
176*8fbed61eSchristos     va_start(ap, desc);
177*8fbed61eSchristos     test_fail_message_va("SKIP", NULL, -1, NULL, NULL, NULL, NULL, desc, ap);
178*8fbed61eSchristos     va_end(ap);
179*8fbed61eSchristos     test_printf_stderr("\n");
180*8fbed61eSchristos     return TEST_SKIP_CODE;
181*8fbed61eSchristos }
182*8fbed61eSchristos 
183*8fbed61eSchristos 
test_openssl_errors(void)18413d40330Schristos void test_openssl_errors(void)
18513d40330Schristos {
18613d40330Schristos     ERR_print_errors_cb(openssl_error_cb, NULL);
18713d40330Schristos     ERR_clear_error();
18813d40330Schristos }
18913d40330Schristos 
19013d40330Schristos /*
19113d40330Schristos  * Define some comparisons between pairs of various types.
19213d40330Schristos  * These functions return 1 if the test is true.
19313d40330Schristos  * Otherwise, they return 0 and pretty-print diagnostics.
19413d40330Schristos  *
19513d40330Schristos  * In each case the functions produced are:
19613d40330Schristos  *  int test_name_eq(const type t1, const type t2, const char *desc, ...);
19713d40330Schristos  *  int test_name_ne(const type t1, const type t2, const char *desc, ...);
19813d40330Schristos  *  int test_name_lt(const type t1, const type t2, const char *desc, ...);
19913d40330Schristos  *  int test_name_le(const type t1, const type t2, const char *desc, ...);
20013d40330Schristos  *  int test_name_gt(const type t1, const type t2, const char *desc, ...);
20113d40330Schristos  *  int test_name_ge(const type t1, const type t2, const char *desc, ...);
20213d40330Schristos  *
20313d40330Schristos  * The t1 and t2 arguments are to be compared for equality, inequality,
20413d40330Schristos  * less than, less than or equal to, greater than and greater than or
20513d40330Schristos  * equal to respectively.  If the specified condition holds, the functions
20613d40330Schristos  * return 1.  If the condition does not hold, the functions print a diagnostic
20713d40330Schristos  * message and return 0.
20813d40330Schristos  *
20913d40330Schristos  * The desc argument is a printf format string followed by its arguments and
21013d40330Schristos  * this is included in the output if the condition being tested for is false.
21113d40330Schristos  */
21213d40330Schristos #define DEFINE_COMPARISON(type, name, opname, op, fmt)                  \
21313d40330Schristos     int test_ ## name ## _ ## opname(const char *file, int line,        \
21413d40330Schristos                                      const char *s1, const char *s2,    \
21513d40330Schristos                                      const type t1, const type t2)      \
21613d40330Schristos     {                                                                   \
21713d40330Schristos         if (t1 op t2)                                                   \
21813d40330Schristos             return 1;                                                   \
21913d40330Schristos         test_fail_message(NULL, file, line, #type, s1, s2, #op,         \
22013d40330Schristos                           "[" fmt "] compared to [" fmt "]",            \
22113d40330Schristos                           t1, t2);                                      \
22213d40330Schristos         return 0;                                                       \
22313d40330Schristos     }
22413d40330Schristos 
22513d40330Schristos #define DEFINE_COMPARISONS(type, name, fmt)                             \
22613d40330Schristos     DEFINE_COMPARISON(type, name, eq, ==, fmt)                          \
22713d40330Schristos     DEFINE_COMPARISON(type, name, ne, !=, fmt)                          \
22813d40330Schristos     DEFINE_COMPARISON(type, name, lt, <, fmt)                           \
22913d40330Schristos     DEFINE_COMPARISON(type, name, le, <=, fmt)                          \
23013d40330Schristos     DEFINE_COMPARISON(type, name, gt, >, fmt)                           \
23113d40330Schristos     DEFINE_COMPARISON(type, name, ge, >=, fmt)
23213d40330Schristos 
23313d40330Schristos DEFINE_COMPARISONS(int, int, "%d")
23413d40330Schristos DEFINE_COMPARISONS(unsigned int, uint, "%u")
23513d40330Schristos DEFINE_COMPARISONS(char, char, "%c")
23613d40330Schristos DEFINE_COMPARISONS(unsigned char, uchar, "%u")
23713d40330Schristos DEFINE_COMPARISONS(long, long, "%ld")
23813d40330Schristos DEFINE_COMPARISONS(unsigned long, ulong, "%lu")
23913d40330Schristos DEFINE_COMPARISONS(size_t, size_t, "%zu")
240*8fbed61eSchristos DEFINE_COMPARISONS(double, double, "%g")
24113d40330Schristos 
24213d40330Schristos DEFINE_COMPARISON(void *, ptr, eq, ==, "%p")
24313d40330Schristos DEFINE_COMPARISON(void *, ptr, ne, !=, "%p")
24413d40330Schristos 
test_ptr_null(const char * file,int line,const char * s,const void * p)24513d40330Schristos int test_ptr_null(const char *file, int line, const char *s, const void *p)
24613d40330Schristos {
24713d40330Schristos     if (p == NULL)
24813d40330Schristos         return 1;
24913d40330Schristos     test_fail_message(NULL, file, line, "ptr", s, "NULL", "==", "%p", p);
25013d40330Schristos     return 0;
25113d40330Schristos }
25213d40330Schristos 
test_ptr(const char * file,int line,const char * s,const void * p)25313d40330Schristos int test_ptr(const char *file, int line, const char *s, const void *p)
25413d40330Schristos {
25513d40330Schristos     if (p != NULL)
25613d40330Schristos         return 1;
25713d40330Schristos     test_fail_message(NULL, file, line, "ptr", s, "NULL", "!=", "%p", p);
25813d40330Schristos     return 0;
25913d40330Schristos }
26013d40330Schristos 
test_true(const char * file,int line,const char * s,int b)26113d40330Schristos int test_true(const char *file, int line, const char *s, int b)
26213d40330Schristos {
26313d40330Schristos     if (b)
26413d40330Schristos         return 1;
26513d40330Schristos     test_fail_message(NULL, file, line, "bool", s, "true", "==", "false");
26613d40330Schristos     return 0;
26713d40330Schristos }
26813d40330Schristos 
test_false(const char * file,int line,const char * s,int b)26913d40330Schristos int test_false(const char *file, int line, const char *s, int b)
27013d40330Schristos {
27113d40330Schristos     if (!b)
27213d40330Schristos         return 1;
27313d40330Schristos     test_fail_message(NULL, file, line, "bool", s, "false", "==", "true");
27413d40330Schristos     return 0;
27513d40330Schristos }
27613d40330Schristos 
test_str_eq(const char * file,int line,const char * st1,const char * st2,const char * s1,const char * s2)27713d40330Schristos int test_str_eq(const char *file, int line, const char *st1, const char *st2,
27813d40330Schristos                 const char *s1, const char *s2)
27913d40330Schristos {
28013d40330Schristos     if (s1 == NULL && s2 == NULL)
28113d40330Schristos       return 1;
28213d40330Schristos     if (s1 == NULL || s2 == NULL || strcmp(s1, s2) != 0) {
28313d40330Schristos         test_fail_string_message(NULL, file, line, "string", st1, st2, "==",
28413d40330Schristos                                  s1, s1 == NULL ? 0 : strlen(s1),
28513d40330Schristos                                  s2, s2 == NULL ? 0 : strlen(s2));
28613d40330Schristos         return 0;
28713d40330Schristos     }
28813d40330Schristos     return 1;
28913d40330Schristos }
29013d40330Schristos 
test_str_ne(const char * file,int line,const char * st1,const char * st2,const char * s1,const char * s2)29113d40330Schristos int test_str_ne(const char *file, int line, const char *st1, const char *st2,
29213d40330Schristos                 const char *s1, const char *s2)
29313d40330Schristos {
29413d40330Schristos     if ((s1 == NULL) ^ (s2 == NULL))
29513d40330Schristos       return 1;
29613d40330Schristos     if (s1 == NULL || strcmp(s1, s2) == 0) {
29713d40330Schristos         test_fail_string_message(NULL, file, line, "string", st1, st2, "!=",
29813d40330Schristos                                  s1, s1 == NULL ? 0 : strlen(s1),
29913d40330Schristos                                  s2, s2 == NULL ? 0 : strlen(s2));
30013d40330Schristos         return 0;
30113d40330Schristos     }
30213d40330Schristos     return 1;
30313d40330Schristos }
30413d40330Schristos 
test_strn_eq(const char * file,int line,const char * st1,const char * st2,const char * s1,size_t n1,const char * s2,size_t n2)30513d40330Schristos int test_strn_eq(const char *file, int line, const char *st1, const char *st2,
306*8fbed61eSchristos                  const char *s1, size_t n1, const char *s2, size_t n2)
30713d40330Schristos {
30813d40330Schristos     if (s1 == NULL && s2 == NULL)
30913d40330Schristos       return 1;
310*8fbed61eSchristos     if (n1 != n2 || s1 == NULL || s2 == NULL || strncmp(s1, s2, n1) != 0) {
31113d40330Schristos         test_fail_string_message(NULL, file, line, "string", st1, st2, "==",
312*8fbed61eSchristos                                  s1, s1 == NULL ? 0 : OPENSSL_strnlen(s1, n1),
313*8fbed61eSchristos                                  s2, s2 == NULL ? 0 : OPENSSL_strnlen(s2, n2));
31413d40330Schristos         return 0;
31513d40330Schristos     }
31613d40330Schristos     return 1;
31713d40330Schristos }
31813d40330Schristos 
test_strn_ne(const char * file,int line,const char * st1,const char * st2,const char * s1,size_t n1,const char * s2,size_t n2)31913d40330Schristos int test_strn_ne(const char *file, int line, const char *st1, const char *st2,
320*8fbed61eSchristos                  const char *s1, size_t n1, const char *s2, size_t n2)
32113d40330Schristos {
32213d40330Schristos     if ((s1 == NULL) ^ (s2 == NULL))
32313d40330Schristos       return 1;
324*8fbed61eSchristos     if (n1 != n2 || s1 == NULL || strncmp(s1, s2, n1) == 0) {
32513d40330Schristos         test_fail_string_message(NULL, file, line, "string", st1, st2, "!=",
326*8fbed61eSchristos                                  s1, s1 == NULL ? 0 : OPENSSL_strnlen(s1, n1),
327*8fbed61eSchristos                                  s2, s2 == NULL ? 0 : OPENSSL_strnlen(s2, n2));
32813d40330Schristos         return 0;
32913d40330Schristos     }
33013d40330Schristos     return 1;
33113d40330Schristos }
33213d40330Schristos 
test_mem_eq(const char * file,int line,const char * st1,const char * st2,const void * s1,size_t n1,const void * s2,size_t n2)33313d40330Schristos int test_mem_eq(const char *file, int line, const char *st1, const char *st2,
33413d40330Schristos                 const void *s1, size_t n1, const void *s2, size_t n2)
33513d40330Schristos {
33613d40330Schristos     if (s1 == NULL && s2 == NULL)
33713d40330Schristos         return 1;
33813d40330Schristos     if (n1 != n2 || s1 == NULL || s2 == NULL || memcmp(s1, s2, n1) != 0) {
33913d40330Schristos         test_fail_memory_message(NULL, file, line, "memory", st1, st2, "==",
34013d40330Schristos                                  s1, n1, s2, n2);
34113d40330Schristos         return 0;
34213d40330Schristos     }
34313d40330Schristos     return 1;
34413d40330Schristos }
34513d40330Schristos 
test_mem_ne(const char * file,int line,const char * st1,const char * st2,const void * s1,size_t n1,const void * s2,size_t n2)34613d40330Schristos int test_mem_ne(const char *file, int line, const char *st1, const char *st2,
34713d40330Schristos                 const void *s1, size_t n1, const void *s2, size_t n2)
34813d40330Schristos {
34913d40330Schristos     if ((s1 == NULL) ^ (s2 == NULL))
35013d40330Schristos         return 1;
35113d40330Schristos     if (n1 != n2)
35213d40330Schristos         return 1;
35313d40330Schristos     if (s1 == NULL || memcmp(s1, s2, n1) == 0) {
35413d40330Schristos         test_fail_memory_message(NULL, file, line, "memory", st1, st2, "!=",
35513d40330Schristos                                  s1, n1, s2, n2);
35613d40330Schristos         return 0;
35713d40330Schristos     }
35813d40330Schristos     return 1;
35913d40330Schristos }
36013d40330Schristos 
36113d40330Schristos #define DEFINE_BN_COMPARISONS(opname, op, zero_cond)                    \
36213d40330Schristos     int test_BN_ ## opname(const char *file, int line,                  \
36313d40330Schristos                            const char *s1, const char *s2,              \
36413d40330Schristos                            const BIGNUM *t1, const BIGNUM *t2)          \
36513d40330Schristos     {                                                                   \
36613d40330Schristos         if (BN_cmp(t1, t2) op 0)                                        \
36713d40330Schristos             return 1;                                                   \
36813d40330Schristos         test_fail_bignum_message(NULL, file, line, "BIGNUM", s1, s2,    \
36913d40330Schristos                                  #op, t1, t2);                          \
37013d40330Schristos         return 0;                                                       \
37113d40330Schristos     }                                                                   \
37213d40330Schristos     int test_BN_ ## opname ## _zero(const char *file, int line,         \
37313d40330Schristos                                     const char *s, const BIGNUM *a)     \
37413d40330Schristos     {                                                                   \
37513d40330Schristos         if (a != NULL &&(zero_cond))                                    \
37613d40330Schristos             return 1;                                                   \
37713d40330Schristos         test_fail_bignum_mono_message(NULL, file, line, "BIGNUM",       \
37813d40330Schristos                                       s, "0", #op, a);                  \
37913d40330Schristos         return 0;                                                       \
38013d40330Schristos     }
38113d40330Schristos 
38213d40330Schristos DEFINE_BN_COMPARISONS(eq, ==, BN_is_zero(a))
38313d40330Schristos DEFINE_BN_COMPARISONS(ne, !=, !BN_is_zero(a))
38413d40330Schristos DEFINE_BN_COMPARISONS(gt, >,  !BN_is_negative(a) && !BN_is_zero(a))
38513d40330Schristos DEFINE_BN_COMPARISONS(ge, >=, !BN_is_negative(a) || BN_is_zero(a))
38613d40330Schristos DEFINE_BN_COMPARISONS(lt, <,  BN_is_negative(a) && !BN_is_zero(a))
38713d40330Schristos DEFINE_BN_COMPARISONS(le, <=, BN_is_negative(a) || BN_is_zero(a))
38813d40330Schristos 
test_BN_eq_one(const char * file,int line,const char * s,const BIGNUM * a)38913d40330Schristos int test_BN_eq_one(const char *file, int line, const char *s, const BIGNUM *a)
39013d40330Schristos {
39113d40330Schristos     if (a != NULL && BN_is_one(a))
39213d40330Schristos         return 1;
39313d40330Schristos     test_fail_bignum_mono_message(NULL, file, line, "BIGNUM", s, "1", "==", a);
39413d40330Schristos     return 0;
39513d40330Schristos }
39613d40330Schristos 
test_BN_odd(const char * file,int line,const char * s,const BIGNUM * a)39713d40330Schristos int test_BN_odd(const char *file, int line, const char *s, const BIGNUM *a)
39813d40330Schristos {
39913d40330Schristos     if (a != NULL && BN_is_odd(a))
40013d40330Schristos         return 1;
40113d40330Schristos     test_fail_bignum_mono_message(NULL, file, line, "BIGNUM", "ODD(", ")", s, a);
40213d40330Schristos     return 0;
40313d40330Schristos }
40413d40330Schristos 
test_BN_even(const char * file,int line,const char * s,const BIGNUM * a)40513d40330Schristos int test_BN_even(const char *file, int line, const char *s, const BIGNUM *a)
40613d40330Schristos {
40713d40330Schristos     if (a != NULL && !BN_is_odd(a))
40813d40330Schristos         return 1;
40913d40330Schristos     test_fail_bignum_mono_message(NULL, file, line, "BIGNUM", "EVEN(", ")", s,
41013d40330Schristos                                   a);
41113d40330Schristos     return 0;
41213d40330Schristos }
41313d40330Schristos 
test_BN_eq_word(const char * file,int line,const char * bns,const char * ws,const BIGNUM * a,BN_ULONG w)41413d40330Schristos int test_BN_eq_word(const char *file, int line, const char *bns, const char *ws,
41513d40330Schristos                     const BIGNUM *a, BN_ULONG w)
41613d40330Schristos {
41713d40330Schristos     BIGNUM *bw;
41813d40330Schristos 
41913d40330Schristos     if (a != NULL && BN_is_word(a, w))
42013d40330Schristos         return 1;
421fb48e4b2Schristos     if ((bw = BN_new()) != NULL)
42213d40330Schristos         BN_set_word(bw, w);
42313d40330Schristos     test_fail_bignum_message(NULL, file, line, "BIGNUM", bns, ws, "==", a, bw);
42413d40330Schristos     BN_free(bw);
42513d40330Schristos     return 0;
42613d40330Schristos }
42713d40330Schristos 
test_BN_abs_eq_word(const char * file,int line,const char * bns,const char * ws,const BIGNUM * a,BN_ULONG w)42813d40330Schristos int test_BN_abs_eq_word(const char *file, int line, const char *bns,
42913d40330Schristos                         const char *ws, const BIGNUM *a, BN_ULONG w)
43013d40330Schristos {
43113d40330Schristos     BIGNUM *bw, *aa;
43213d40330Schristos 
43313d40330Schristos     if (a != NULL && BN_abs_is_word(a, w))
43413d40330Schristos         return 1;
435fb48e4b2Schristos     if ((aa = BN_dup(a)) != NULL)
43613d40330Schristos         BN_set_negative(aa, 0);
437fb48e4b2Schristos     if ((bw = BN_new()) != NULL)
43813d40330Schristos         BN_set_word(bw, w);
43913d40330Schristos     test_fail_bignum_message(NULL, file, line, "BIGNUM", bns, ws, "abs==",
44013d40330Schristos                              aa, bw);
44113d40330Schristos     BN_free(bw);
44213d40330Schristos     BN_free(aa);
44313d40330Schristos     return 0;
44413d40330Schristos }
44513d40330Schristos 
print_time(const ASN1_TIME * t)44613d40330Schristos static const char *print_time(const ASN1_TIME *t)
44713d40330Schristos {
448e0ea3921Schristos     return t == NULL ? "<null>" : (const char *)ASN1_STRING_get0_data(t);
44913d40330Schristos }
45013d40330Schristos 
45113d40330Schristos #define DEFINE_TIME_T_COMPARISON(opname, op)                            \
45213d40330Schristos     int test_time_t_ ## opname(const char *file, int line,              \
45313d40330Schristos                                const char *s1, const char *s2,          \
45413d40330Schristos                                const time_t t1, const time_t t2)        \
45513d40330Schristos     {                                                                   \
45613d40330Schristos         ASN1_TIME *at1 = ASN1_TIME_set(NULL, t1);                       \
45713d40330Schristos         ASN1_TIME *at2 = ASN1_TIME_set(NULL, t2);                       \
45813d40330Schristos         int r = at1 != NULL && at2 != NULL                              \
45913d40330Schristos                 && ASN1_TIME_compare(at1, at2) op 0;                    \
46013d40330Schristos         if (!r)                                                         \
46113d40330Schristos             test_fail_message(NULL, file, line, "time_t", s1, s2, #op,  \
46213d40330Schristos                               "[%s] compared to [%s]",                  \
46313d40330Schristos                               print_time(at1), print_time(at2));        \
46413d40330Schristos         ASN1_STRING_free(at1);                                          \
46513d40330Schristos         ASN1_STRING_free(at2);                                          \
46613d40330Schristos         return r;                                                       \
46713d40330Schristos     }
46813d40330Schristos DEFINE_TIME_T_COMPARISON(eq, ==)
46913d40330Schristos DEFINE_TIME_T_COMPARISON(ne, !=)
47013d40330Schristos DEFINE_TIME_T_COMPARISON(gt, >)
47113d40330Schristos DEFINE_TIME_T_COMPARISON(ge, >=)
47213d40330Schristos DEFINE_TIME_T_COMPARISON(lt, <)
47313d40330Schristos DEFINE_TIME_T_COMPARISON(le, <=)
474