xref: /aosp_15_r20/external/openscreen/cast/common/certificate/cast_crl.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef CAST_COMMON_CERTIFICATE_CAST_CRL_H_
6*3f982cf4SFabien Sanglard #define CAST_COMMON_CERTIFICATE_CAST_CRL_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <openssl/x509.h>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include <memory>
11*3f982cf4SFabien Sanglard #include <string>
12*3f982cf4SFabien Sanglard #include <unordered_map>
13*3f982cf4SFabien Sanglard #include <unordered_set>
14*3f982cf4SFabien Sanglard #include <vector>
15*3f982cf4SFabien Sanglard 
16*3f982cf4SFabien Sanglard #include "cast/common/certificate/cast_cert_validator.h"
17*3f982cf4SFabien Sanglard #include "cast/common/certificate/proto/revocation.pb.h"
18*3f982cf4SFabien Sanglard #include "platform/base/macros.h"
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard namespace openscreen {
21*3f982cf4SFabien Sanglard namespace cast {
22*3f982cf4SFabien Sanglard 
23*3f982cf4SFabien Sanglard // TODO(crbug.com/openscreen/90): Remove these after Chromium is migrated to
24*3f982cf4SFabien Sanglard // openscreen::cast
25*3f982cf4SFabien Sanglard using CrlBundle = ::cast::certificate::CrlBundle;
26*3f982cf4SFabien Sanglard using Crl = ::cast::certificate::Crl;
27*3f982cf4SFabien Sanglard using TbsCrl = ::cast::certificate::TbsCrl;
28*3f982cf4SFabien Sanglard using SerialNumberRange = ::cast::certificate::SerialNumberRange;
29*3f982cf4SFabien Sanglard 
30*3f982cf4SFabien Sanglard // This class represents the certificate revocation list information parsed from
31*3f982cf4SFabien Sanglard // the binary in a protobuf message.
32*3f982cf4SFabien Sanglard class CastCRL {
33*3f982cf4SFabien Sanglard  public:
34*3f982cf4SFabien Sanglard   CastCRL(const TbsCrl& tbs_crl, const DateTime& overall_not_after);
35*3f982cf4SFabien Sanglard   ~CastCRL();
36*3f982cf4SFabien Sanglard 
37*3f982cf4SFabien Sanglard   // Verifies the revocation status of a cast device certificate given a chain
38*3f982cf4SFabien Sanglard   // of X.509 certificates.
39*3f982cf4SFabien Sanglard   //
40*3f982cf4SFabien Sanglard   // Inputs:
41*3f982cf4SFabien Sanglard   // * |trusted_chain| is the chain of verified certificates, starting with
42*3f982cf4SFabien Sanglard   //   trust anchor.
43*3f982cf4SFabien Sanglard   //
44*3f982cf4SFabien Sanglard   // * |time| is the timestamp to use for determining if the certificate is
45*3f982cf4SFabien Sanglard   //   revoked.
46*3f982cf4SFabien Sanglard   //
47*3f982cf4SFabien Sanglard   // Output:
48*3f982cf4SFabien Sanglard   // Returns true if no certificate in the chain was revoked.
49*3f982cf4SFabien Sanglard   bool CheckRevocation(const std::vector<X509*>& trusted_chain,
50*3f982cf4SFabien Sanglard                        const DateTime& time) const;
51*3f982cf4SFabien Sanglard 
52*3f982cf4SFabien Sanglard  private:
53*3f982cf4SFabien Sanglard   struct SerialNumberRange {
54*3f982cf4SFabien Sanglard     uint64_t first_serial;
55*3f982cf4SFabien Sanglard     uint64_t last_serial;
56*3f982cf4SFabien Sanglard   };
57*3f982cf4SFabien Sanglard 
58*3f982cf4SFabien Sanglard   DateTime not_before_;
59*3f982cf4SFabien Sanglard   DateTime not_after_;
60*3f982cf4SFabien Sanglard 
61*3f982cf4SFabien Sanglard   // Revoked public key hashes.
62*3f982cf4SFabien Sanglard   // The values consist of the SHA256 hash of the SubjectPublicKeyInfo.
63*3f982cf4SFabien Sanglard   std::unordered_set<std::string> revoked_hashes_;
64*3f982cf4SFabien Sanglard 
65*3f982cf4SFabien Sanglard   // Revoked serial number ranges indexed by issuer public key hash.
66*3f982cf4SFabien Sanglard   // The key is the SHA256 hash of issuer's SubjectPublicKeyInfo.
67*3f982cf4SFabien Sanglard   // The value is a list of revoked serial number ranges.
68*3f982cf4SFabien Sanglard   std::unordered_map<std::string, std::vector<SerialNumberRange>>
69*3f982cf4SFabien Sanglard       revoked_serial_numbers_;
70*3f982cf4SFabien Sanglard 
71*3f982cf4SFabien Sanglard   OSP_DISALLOW_COPY_AND_ASSIGN(CastCRL);
72*3f982cf4SFabien Sanglard };
73*3f982cf4SFabien Sanglard 
74*3f982cf4SFabien Sanglard struct TrustStore;
75*3f982cf4SFabien Sanglard 
76*3f982cf4SFabien Sanglard // Parses and verifies the CRL used to verify the revocation status of
77*3f982cf4SFabien Sanglard // Cast device certificates, using the built-in Cast CRL trust anchors.
78*3f982cf4SFabien Sanglard //
79*3f982cf4SFabien Sanglard // Inputs:
80*3f982cf4SFabien Sanglard // * |crl_proto| is a serialized cast_certificate.CrlBundle proto.
81*3f982cf4SFabien Sanglard // * |time| is the timestamp to use for determining if the CRL is valid.
82*3f982cf4SFabien Sanglard // * |trust_store| is the set of trust anchors to use.  This should be nullptr
83*3f982cf4SFabien Sanglard //   in production, but can be overridden in tests.
84*3f982cf4SFabien Sanglard //
85*3f982cf4SFabien Sanglard // Output:
86*3f982cf4SFabien Sanglard // Returns the CRL object if success, nullptr otherwise.
87*3f982cf4SFabien Sanglard std::unique_ptr<CastCRL> ParseAndVerifyCRL(const std::string& crl_proto,
88*3f982cf4SFabien Sanglard                                            const DateTime& time,
89*3f982cf4SFabien Sanglard                                            TrustStore* trust_store = nullptr);
90*3f982cf4SFabien Sanglard 
91*3f982cf4SFabien Sanglard }  // namespace cast
92*3f982cf4SFabien Sanglard }  // namespace openscreen
93*3f982cf4SFabien Sanglard 
94*3f982cf4SFabien Sanglard #endif  // CAST_COMMON_CERTIFICATE_CAST_CRL_H_
95