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.1.2 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 * 30 1.1 christos * Test driver 31 1.1 christos * 32 1.1 christos ***/ 33 1.1 christos 34 1.1 christos static TESTDATA tests[] = { 35 1.1 christos { "20001201000000Z", 0, V_ASN1_GENERALIZEDTIME }, 36 1.1 christos { "20001201010000+0100", 0, V_ASN1_GENERALIZEDTIME }, 37 1.1 christos { "20001201050000+0500", 0, V_ASN1_GENERALIZEDTIME }, 38 1.1 christos { "20001130230000-0100", 0, V_ASN1_GENERALIZEDTIME }, 39 1.1 christos { "20001130190000-0500", 0, V_ASN1_GENERALIZEDTIME }, 40 1.1 christos { "20001130190001-0500", 1, V_ASN1_GENERALIZEDTIME }, /* +1 second */ 41 1.1 christos { "20001130185959-0500", -1, V_ASN1_GENERALIZEDTIME }, /* -1 second */ 42 1.1 christos { "001201000000Z", 0, V_ASN1_UTCTIME }, 43 1.1 christos { "001201010000+0100", 0, V_ASN1_UTCTIME }, 44 1.1 christos { "001201050000+0500", 0, V_ASN1_UTCTIME }, 45 1.1 christos { "001130230000-0100", 0, V_ASN1_UTCTIME }, 46 1.1 christos { "001130190000-0500", 0, V_ASN1_UTCTIME }, 47 1.1 christos { "001201000000-0000", 0, V_ASN1_UTCTIME }, 48 1.1 christos { "001201000001-0000", 1, V_ASN1_UTCTIME }, /* +1 second */ 49 1.1 christos { "001130235959-0000", -1, V_ASN1_UTCTIME }, /* -1 second */ 50 1.1 christos { "20001201000000+0000", 0, V_ASN1_GENERALIZEDTIME }, 51 1.1 christos { "20001201000000+0100", -1, V_ASN1_GENERALIZEDTIME }, 52 1.1 christos { "001201000000+0100", -1, V_ASN1_UTCTIME }, 53 1.1 christos { "20001201000000-0100", 1, V_ASN1_GENERALIZEDTIME }, 54 1.1 christos { "001201000000-0100", 1, V_ASN1_UTCTIME }, 55 1.1 christos { "20001201123400+1234", 0, V_ASN1_GENERALIZEDTIME }, 56 1.1 christos { "20001130112600-1234", 0, V_ASN1_GENERALIZEDTIME }, 57 1.1 christos }; 58 1.1 christos 59 1.1 christos static time_t the_time = 975628800; 60 1.1 christos static ASN1_TIME the_asn1_time = { 61 1.1 christos 15, 62 1.1 christos V_ASN1_GENERALIZEDTIME, 63 1.1 christos (unsigned char*)"20001201000000Z", 64 1.1 christos 0 65 1.1 christos }; 66 1.1 christos 67 1.1 christos static int test_offset(int idx) 68 1.1 christos { 69 1.1 christos ASN1_TIME at; 70 1.1 christos const TESTDATA *testdata = &tests[idx]; 71 1.1 christos int ret = -2; 72 1.1 christos int day, sec; 73 1.1 christos 74 1.1 christos at.data = (unsigned char*)testdata->data; 75 1.1 christos at.length = strlen(testdata->data); 76 1.1 christos at.type = testdata->type; 77 1.1 christos at.flags = 0; 78 1.1 christos 79 1.1 christos if (!TEST_true(ASN1_TIME_diff(&day, &sec, &the_asn1_time, &at))) { 80 1.1 christos TEST_info("ASN1_TIME_diff() failed for %s\n", at.data); 81 1.1 christos return 0; 82 1.1 christos } 83 1.1 christos if (day > 0) 84 1.1 christos ret = 1; 85 1.1 christos else if (day < 0) 86 1.1 christos ret = -1; 87 1.1 christos else if (sec > 0) 88 1.1 christos ret = 1; 89 1.1 christos else if (sec < 0) 90 1.1 christos ret = -1; 91 1.1 christos else 92 1.1 christos ret = 0; 93 1.1 christos 94 1.1 christos if (!TEST_int_eq(testdata->time_result, ret)) { 95 1.1 christos TEST_info("ASN1_TIME_diff() test failed for %s day=%d sec=%d\n", at.data, day, sec); 96 1.1 christos return 0; 97 1.1 christos } 98 1.1 christos 99 1.1 christos ret = ASN1_TIME_cmp_time_t(&at, the_time); 100 1.1 christos 101 1.1 christos if (!TEST_int_eq(testdata->time_result, ret)) { 102 1.1 christos TEST_info("ASN1_UTCTIME_cmp_time_t() test failed for %s\n", at.data); 103 1.1 christos return 0; 104 1.1 christos } 105 1.1 christos 106 1.1 christos return 1; 107 1.1 christos } 108 1.1 christos 109 1.1 christos int setup_tests(void) 110 1.1 christos { 111 1.1 christos ADD_ALL_TESTS(test_offset, OSSL_NELEM(tests)); 112 1.1 christos return 1; 113 1.1 christos } 114