/* * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the OpenSSL license (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html */ // Tests for X509 time functions. #include #include #include #include #include struct TestData { const char *data; int type; time_t cmp_time; // -1 if asn1_time <= cmp_time, 1 if asn1_time > cmp_time, 0 if error. int expected; }; static TestData kX509CmpTests[] = { { "20170217180154Z", V_ASN1_GENERALIZEDTIME, // The same in seconds since epoch. 1487354514, -1, }, { "20170217180154Z", V_ASN1_GENERALIZEDTIME, // One second more. 1487354515, -1, }, { "20170217180154Z", V_ASN1_GENERALIZEDTIME, // One second less. 1487354513, 1, }, // Same as UTC time. { "170217180154Z", V_ASN1_UTCTIME, // The same in seconds since epoch. 1487354514, -1, }, { "170217180154Z", V_ASN1_UTCTIME, // One second more. 1487354515, -1, }, { "170217180154Z", V_ASN1_UTCTIME, // One second less. 1487354513, 1, }, // UTCTime from the 20th century. { "990217180154Z", V_ASN1_UTCTIME, // The same in seconds since epoch. 919274514, -1, }, { "990217180154Z", V_ASN1_UTCTIME, // One second more. 919274515, -1, }, { "990217180154Z", V_ASN1_UTCTIME, // One second less. 919274513, 1, }, // Various invalid formats. { // No trailing Z. "20170217180154", V_ASN1_GENERALIZEDTIME, 0, 0, }, { // No trailing Z, UTCTime. "170217180154", V_ASN1_UTCTIME, 0, 0, }, { // No seconds. "201702171801Z", V_ASN1_GENERALIZEDTIME, 0, 0, }, { // No seconds, UTCTime. "1702171801Z", V_ASN1_UTCTIME, 0, 0, }, { // Fractional seconds. "20170217180154.001Z", V_ASN1_GENERALIZEDTIME, 0, 0, }, { // Fractional seconds, UTCTime. "170217180154.001Z", V_ASN1_UTCTIME, 0, 0, }, { // Timezone offset. "20170217180154+0100", V_ASN1_GENERALIZEDTIME, 0, 0, }, { // Timezone offset, UTCTime. "170217180154+0100", V_ASN1_UTCTIME, 0, 0, }, { // Extra digits. "2017021718015400Z", V_ASN1_GENERALIZEDTIME, 0, 0, }, { // Extra digits, UTCTime. "17021718015400Z", V_ASN1_UTCTIME, 0, 0, }, { // Non-digits. "2017021718015aZ", V_ASN1_GENERALIZEDTIME, 0, 0, }, { // Non-digits, UTCTime. "17021718015aZ", V_ASN1_UTCTIME, 0, 0, }, { // Trailing garbage. "20170217180154Zlongtrailinggarbage", V_ASN1_GENERALIZEDTIME, 0, 0, }, { // Trailing garbage, UTCTime. "170217180154Zlongtrailinggarbage", V_ASN1_UTCTIME, 0, 0, }, { // Swapped type. "20170217180154Z", V_ASN1_UTCTIME, 0, 0, }, { // Swapped type. "170217180154Z", V_ASN1_GENERALIZEDTIME, 0, 0, }, { // Bad type. "20170217180154Z", V_ASN1_OCTET_STRING, 0, 0, }, }; TEST(X509TimeTest, TestCmpTime) { for (auto &test : kX509CmpTests) { SCOPED_TRACE(test.data); ASN1_TIME t; memset(&t, 0, sizeof(t)); t.type = test.type; t.data = (unsigned char*) test.data; t.length = strlen(test.data); EXPECT_EQ(test.expected, X509_cmp_time(&t, &test.cmp_time)); } } TEST(X509TimeTest, TestCmpTimeCurrent) { time_t now = time(NULL); // Pick a day earlier and later, relative to any system clock. bssl::UniquePtr asn1_before(ASN1_TIME_adj(NULL, now, -1, 0)); bssl::UniquePtr asn1_after(ASN1_TIME_adj(NULL, now, 1, 0)); ASSERT_EQ(-1, X509_cmp_time(asn1_before.get(), NULL)); ASSERT_EQ(1, X509_cmp_time(asn1_after.get(), NULL)); }