1 /* 2 * Copyright 2021-2024 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <string.h> 11 #include "apps.h" 12 #include "testutil.h" 13 #include "crypto/asn1.h" 14 15 #define binname "ca_internals_test" 16 17 char *default_config_file = NULL; 18 19 static int test_do_updatedb(void) 20 { 21 CA_DB *db = NULL; 22 time_t testdateutc; 23 int rv; 24 size_t argc = test_get_argument_count(); 25 BIO *bio_tmp; 26 char *testdate; 27 char *indexfile; 28 int need64bit; 29 int have64bit; 30 31 if (argc != 4) { 32 TEST_error("Usage: %s: do_updatedb dbfile testdate need64bit\n", binname); 33 TEST_error(" testdate format: ASN1-String\n"); 34 return 0; 35 } 36 37 /* 38 * if the test will only work with 64bit time_t and 39 * the build only supports 32, assume the test as success 40 */ 41 need64bit = (int)strtol(test_get_argument(3), NULL, 0); 42 have64bit = sizeof(time_t) > sizeof(uint32_t); 43 if (need64bit && !have64bit) { 44 BIO_printf(bio_out, "skipping test (need64bit: %i, have64bit: %i)", 45 need64bit, have64bit); 46 return 1; 47 } 48 49 testdate = test_get_argument(2); 50 testdateutc = test_asn1_string_to_time_t(testdate); 51 if (TEST_time_t_lt(testdateutc, 0)) { 52 return 0; 53 } 54 55 indexfile = test_get_argument(1); 56 db = load_index(indexfile, NULL); 57 if (TEST_ptr_null(db)) { 58 return 0; 59 } 60 61 bio_tmp = bio_err; 62 bio_err = bio_out; 63 rv = do_updatedb(db, &testdateutc); 64 bio_err = bio_tmp; 65 66 if (rv > 0) { 67 if (!TEST_true(save_index(indexfile, "new", db))) 68 goto end; 69 70 if (!TEST_true(rotate_index(indexfile, "new", "old"))) 71 goto end; 72 } 73 end: 74 free_index(db); 75 return 1; 76 } 77 78 int setup_tests(void) 79 { 80 char *command = test_get_argument(0); 81 82 if (test_get_argument_count() < 1) { 83 TEST_error("%s: no command specified for testing\n", binname); 84 return 0; 85 } 86 87 if (strcmp(command, "do_updatedb") == 0) 88 return test_do_updatedb(); 89 90 TEST_error("%s: command '%s' is not supported for testing\n", binname, command); 91 return 0; 92 } 93 94