| /* |
| * 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 <openssl/x509.h> |
| |
| #include <string.h> |
| #include <time.h> |
| |
| #include <gtest/gtest.h> |
| #include <openssl/asn1.h> |
| |
| 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_TIME> asn1_before(ASN1_TIME_adj(NULL, now, -1, 0)); |
| bssl::UniquePtr<ASN1_TIME> 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)); |
| } |