1 // Copyright 2018 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 "services/network/public/cpp/digitally_signed_mojom_traits.h"
6 
7 #include "base/test/gtest_util.h"
8 #include "mojo/public/cpp/test_support/test_utils.h"
9 #include "net/cert/signed_certificate_timestamp.h"
10 #include "services/network/public/mojom/digitally_signed.mojom.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 
13 namespace network {
14 namespace {
15 
TEST(DigitallySignedTraitsTest,Roundtrips)16 TEST(DigitallySignedTraitsTest, Roundtrips) {
17   for (auto sig_alg : {net::ct::DigitallySigned::SIG_ALGO_ANONYMOUS,
18                        net::ct::DigitallySigned::SIG_ALGO_RSA,
19                        net::ct::DigitallySigned::SIG_ALGO_DSA,
20                        net::ct::DigitallySigned::SIG_ALGO_ECDSA}) {
21     for (auto hash_alg : {net::ct::DigitallySigned::HASH_ALGO_NONE,
22                           net::ct::DigitallySigned::HASH_ALGO_MD5,
23                           net::ct::DigitallySigned::HASH_ALGO_SHA1,
24                           net::ct::DigitallySigned::HASH_ALGO_SHA224,
25                           net::ct::DigitallySigned::HASH_ALGO_SHA256,
26                           net::ct::DigitallySigned::HASH_ALGO_SHA384,
27                           net::ct::DigitallySigned::HASH_ALGO_SHA512}) {
28       net::ct::DigitallySigned original;
29       original.hash_algorithm = hash_alg;
30       original.signature_algorithm = sig_alg;
31       original.signature_data.assign(5, static_cast<char>(hash_alg));
32 
33       net::ct::DigitallySigned copied;
34       EXPECT_TRUE(mojo::test::SerializeAndDeserialize<mojom::DigitallySigned>(
35           &original, &copied))
36           << "with hash " << hash_alg << " and sig " << sig_alg;
37       EXPECT_EQ(original.hash_algorithm, copied.hash_algorithm);
38       EXPECT_EQ(original.signature_algorithm, copied.signature_algorithm);
39       EXPECT_EQ(original.signature_data, copied.signature_data);
40     }
41   }
42 }
43 
TEST(DigitallySignedTraitsTest,EmptySignatureRejected)44 TEST(DigitallySignedTraitsTest, EmptySignatureRejected) {
45   net::ct::DigitallySigned original;
46   original.hash_algorithm = net::ct::DigitallySigned::HASH_ALGO_SHA256;
47   original.signature_algorithm = net::ct::DigitallySigned::SIG_ALGO_ECDSA;
48   original.signature_data.clear();
49 
50   net::ct::DigitallySigned copied;
51   EXPECT_FALSE(mojo::test::SerializeAndDeserialize<mojom::DigitallySigned>(
52       &original, &copied));
53 }
54 
TEST(DigitallySignedTraitsTest,OutOfBoundsEnumsRejected)55 TEST(DigitallySignedTraitsTest, OutOfBoundsEnumsRejected) {
56   net::ct::DigitallySigned original;
57   original.hash_algorithm =
58       static_cast<net::ct::DigitallySigned::HashAlgorithm>(-1);
59   original.signature_algorithm = net::ct::DigitallySigned::SIG_ALGO_ECDSA;
60   original.signature_data.assign(32, '\x01');
61 
62   net::ct::DigitallySigned copied;
63   EXPECT_DCHECK_DEATH(
64       mojo::test::SerializeAndDeserialize<mojom::DigitallySigned>(&original,
65                                                                   &copied));
66 }
67 
68 }  // namespace
69 }  // namespace network
70