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