1 /* 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef RTC_BASE_RTC_CERTIFICATE_GENERATOR_H_ 12 #define RTC_BASE_RTC_CERTIFICATE_GENERATOR_H_ 13 14 #include <stdint.h> 15 16 #include "absl/functional/any_invocable.h" 17 #include "absl/types/optional.h" 18 #include "api/scoped_refptr.h" 19 #include "rtc_base/rtc_certificate.h" 20 #include "rtc_base/ssl_identity.h" 21 #include "rtc_base/system/rtc_export.h" 22 #include "rtc_base/thread.h" 23 24 namespace rtc { 25 26 // Generates `RTCCertificate`s. 27 // See `RTCCertificateGenerator` for the WebRTC repo's implementation. 28 class RTCCertificateGeneratorInterface { 29 public: 30 // Functor that will be called when certificate is generated asynchroniosly. 31 // Called with nullptr as the parameter on failure. 32 using Callback = absl::AnyInvocable<void(scoped_refptr<RTCCertificate>) &&>; 33 34 virtual ~RTCCertificateGeneratorInterface() = default; 35 36 // Generates a certificate asynchronously on the worker thread. 37 // Must be called on the signaling thread. The `callback` is invoked with the 38 // result on the signaling thread. `exipres_ms` optionally specifies for how 39 // long we want the certificate to be valid, but the implementation may choose 40 // its own restrictions on the expiration time. 41 virtual void GenerateCertificateAsync( 42 const KeyParams& key_params, 43 const absl::optional<uint64_t>& expires_ms, 44 Callback callback) = 0; 45 }; 46 47 // Standard implementation of `RTCCertificateGeneratorInterface`. 48 // The static function `GenerateCertificate` generates a certificate on the 49 // current thread. The `RTCCertificateGenerator` instance generates certificates 50 // asynchronously on the worker thread with `GenerateCertificateAsync`. 51 class RTC_EXPORT RTCCertificateGenerator 52 : public RTCCertificateGeneratorInterface { 53 public: 54 // Generates a certificate on the current thread. Returns null on failure. 55 // If `expires_ms` is specified, the certificate will expire in approximately 56 // that many milliseconds from now. `expires_ms` is limited to a year, a 57 // larger value than that is clamped down to a year. If `expires_ms` is not 58 // specified, a default expiration time is used. 59 static scoped_refptr<RTCCertificate> GenerateCertificate( 60 const KeyParams& key_params, 61 const absl::optional<uint64_t>& expires_ms); 62 63 RTCCertificateGenerator(Thread* signaling_thread, Thread* worker_thread); ~RTCCertificateGenerator()64 ~RTCCertificateGenerator() override {} 65 66 // `RTCCertificateGeneratorInterface` overrides. 67 // If `expires_ms` is specified, the certificate will expire in approximately 68 // that many milliseconds from now. `expires_ms` is limited to a year, a 69 // larger value than that is clamped down to a year. If `expires_ms` is not 70 // specified, a default expiration time is used. 71 void GenerateCertificateAsync(const KeyParams& key_params, 72 const absl::optional<uint64_t>& expires_ms, 73 Callback callback) override; 74 75 private: 76 Thread* const signaling_thread_; 77 Thread* const worker_thread_; 78 }; 79 80 } // namespace rtc 81 82 #endif // RTC_BASE_RTC_CERTIFICATE_GENERATOR_H_ 83