1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "util/crypto/certificate_utils.h"
6 
7 #include <openssl/bio.h>
8 #include <openssl/bn.h>
9 #include <openssl/rsa.h>
10 #include <openssl/x509.h>
11 
12 #include <chrono>
13 
14 #include "gtest/gtest.h"
15 #include "platform/api/time.h"
16 #include "platform/base/error.h"
17 #include "util/std_util.h"
18 
19 namespace openscreen {
20 namespace {
21 
22 constexpr char kName[] = "test.com";
23 constexpr auto kDuration = std::chrono::seconds(31556952);
24 
TEST(CertificateUtilTest,CreatesValidCertificate)25 TEST(CertificateUtilTest, CreatesValidCertificate) {
26   bssl::UniquePtr<EVP_PKEY> pkey = GenerateRsaKeyPair();
27   ASSERT_TRUE(pkey);
28 
29   ErrorOr<bssl::UniquePtr<X509>> certificate =
30       CreateSelfSignedX509Certificate(kName, kDuration, *pkey);
31   ASSERT_TRUE(certificate.is_value());
32 
33   // Validate the generated certificate.
34   EXPECT_NE(0, X509_verify(certificate.value().get(), pkey.get()));
35 }
36 
TEST(CertificateUtilTest,ExportsAndImportsCertificate)37 TEST(CertificateUtilTest, ExportsAndImportsCertificate) {
38   bssl::UniquePtr<EVP_PKEY> pkey = GenerateRsaKeyPair();
39   ASSERT_TRUE(pkey);
40   ErrorOr<bssl::UniquePtr<X509>> certificate =
41       CreateSelfSignedX509Certificate(kName, kDuration, *pkey);
42   ASSERT_TRUE(certificate.is_value());
43 
44   ErrorOr<std::vector<uint8_t>> exported =
45       ExportX509CertificateToDer(*certificate.value());
46   ASSERT_TRUE(exported.is_value()) << exported.error();
47   EXPECT_FALSE(exported.value().empty());
48 
49   ErrorOr<bssl::UniquePtr<X509>> imported =
50       ImportCertificate(exported.value().data(), exported.value().size());
51   ASSERT_TRUE(imported.is_value()) << imported.error();
52   ASSERT_TRUE(imported.value().get());
53 
54   // Validate the imported certificate.
55   EXPECT_NE(0, X509_verify(imported.value().get(), pkey.get()));
56 }
57 
58 }  // namespace
59 }  // namespace openscreen
60