1 1.1 christos /* 2 1.1 christos * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved. 3 1.1 christos * 4 1.1 christos * Licensed under the Apache License 2.0 (the "License"). You may not use 5 1.1 christos * this file except in compliance with the License. You can obtain a copy 6 1.1 christos * in the file LICENSE in the source distribution or at 7 1.1 christos * https://www.openssl.org/source/license.html 8 1.1 christos */ 9 1.1 christos 10 1.1 christos /* time_t/offset (+/-XXXX) tests for ASN1 and X509 */ 11 1.1 christos 12 1.1 christos #include <stdio.h> 13 1.1 christos #include <string.h> 14 1.1 christos #include <time.h> 15 1.1 christos 16 1.1 christos #include <openssl/asn1.h> 17 1.1 christos #include <openssl/x509.h> 18 1.1 christos #include "testutil.h" 19 1.1 christos #include "internal/nelem.h" 20 1.1 christos 21 1.1 christos typedef struct { 22 1.1 christos const char *data; 23 1.1 christos int time_result; 24 1.1 christos int type; 25 1.1 christos } TESTDATA; 26 1.1 christos 27 1.1 christos /********************************************************************** 28 1.1 christos * 29 1.1 christos * Test driver 30 1.1 christos * 31 1.1 christos ***/ 32 1.1 christos 33 1.1 christos static TESTDATA tests[] = { 34 1.1.1.2 christos { "20001201000000Z", 0, V_ASN1_GENERALIZEDTIME }, 35 1.1.1.2 christos { "20001201010000+0100", 0, V_ASN1_GENERALIZEDTIME }, 36 1.1.1.2 christos { "20001201050000+0500", 0, V_ASN1_GENERALIZEDTIME }, 37 1.1.1.2 christos { "20001130230000-0100", 0, V_ASN1_GENERALIZEDTIME }, 38 1.1.1.2 christos { "20001130190000-0500", 0, V_ASN1_GENERALIZEDTIME }, 39 1.1.1.2 christos { "20001130190001-0500", 1, V_ASN1_GENERALIZEDTIME }, /* +1 second */ 40 1.1 christos { "20001130185959-0500", -1, V_ASN1_GENERALIZEDTIME }, /* -1 second */ 41 1.1.1.2 christos { "001201000000Z", 0, V_ASN1_UTCTIME }, 42 1.1.1.2 christos { "001201010000+0100", 0, V_ASN1_UTCTIME }, 43 1.1.1.2 christos { "001201050000+0500", 0, V_ASN1_UTCTIME }, 44 1.1.1.2 christos { "001130230000-0100", 0, V_ASN1_UTCTIME }, 45 1.1.1.2 christos { "001130190000-0500", 0, V_ASN1_UTCTIME }, 46 1.1.1.2 christos { "001201000000-0000", 0, V_ASN1_UTCTIME }, 47 1.1.1.2 christos { "001201000001-0000", 1, V_ASN1_UTCTIME }, /* +1 second */ 48 1.1.1.2 christos { "001130235959-0000", -1, V_ASN1_UTCTIME }, /* -1 second */ 49 1.1.1.2 christos { "20001201000000+0000", 0, V_ASN1_GENERALIZEDTIME }, 50 1.1 christos { "20001201000000+0100", -1, V_ASN1_GENERALIZEDTIME }, 51 1.1.1.2 christos { "001201000000+0100", -1, V_ASN1_UTCTIME }, 52 1.1.1.2 christos { "20001201000000-0100", 1, V_ASN1_GENERALIZEDTIME }, 53 1.1.1.2 christos { "001201000000-0100", 1, V_ASN1_UTCTIME }, 54 1.1.1.2 christos { "20001201123400+1234", 0, V_ASN1_GENERALIZEDTIME }, 55 1.1.1.2 christos { "20001130112600-1234", 0, V_ASN1_GENERALIZEDTIME }, 56 1.1 christos }; 57 1.1 christos 58 1.1 christos static time_t the_time = 975628800; 59 1.1 christos static ASN1_TIME the_asn1_time = { 60 1.1 christos 15, 61 1.1 christos V_ASN1_GENERALIZEDTIME, 62 1.1.1.2 christos (unsigned char *)"20001201000000Z", 63 1.1 christos 0 64 1.1 christos }; 65 1.1 christos 66 1.1 christos static int test_offset(int idx) 67 1.1 christos { 68 1.1 christos ASN1_TIME at; 69 1.1 christos const TESTDATA *testdata = &tests[idx]; 70 1.1 christos int ret = -2; 71 1.1 christos int day, sec; 72 1.1 christos 73 1.1.1.2 christos at.data = (unsigned char *)testdata->data; 74 1.1 christos at.length = strlen(testdata->data); 75 1.1 christos at.type = testdata->type; 76 1.1 christos at.flags = 0; 77 1.1 christos 78 1.1 christos if (!TEST_true(ASN1_TIME_diff(&day, &sec, &the_asn1_time, &at))) { 79 1.1 christos TEST_info("ASN1_TIME_diff() failed for %s\n", at.data); 80 1.1 christos return 0; 81 1.1 christos } 82 1.1 christos if (day > 0) 83 1.1 christos ret = 1; 84 1.1 christos else if (day < 0) 85 1.1 christos ret = -1; 86 1.1 christos else if (sec > 0) 87 1.1 christos ret = 1; 88 1.1 christos else if (sec < 0) 89 1.1 christos ret = -1; 90 1.1 christos else 91 1.1 christos ret = 0; 92 1.1 christos 93 1.1 christos if (!TEST_int_eq(testdata->time_result, ret)) { 94 1.1 christos TEST_info("ASN1_TIME_diff() test failed for %s day=%d sec=%d\n", at.data, day, sec); 95 1.1 christos return 0; 96 1.1 christos } 97 1.1 christos 98 1.1 christos ret = ASN1_TIME_cmp_time_t(&at, the_time); 99 1.1 christos 100 1.1 christos if (!TEST_int_eq(testdata->time_result, ret)) { 101 1.1 christos TEST_info("ASN1_UTCTIME_cmp_time_t() test failed for %s\n", at.data); 102 1.1 christos return 0; 103 1.1 christos } 104 1.1 christos 105 1.1 christos return 1; 106 1.1 christos } 107 1.1 christos 108 1.1 christos int setup_tests(void) 109 1.1 christos { 110 1.1 christos ADD_ALL_TESTS(test_offset, OSSL_NELEM(tests)); 111 1.1 christos return 1; 112 1.1 christos } 113