| /* |
| * Copyright 2026 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #ifndef API_SFRAME_SFRAME_DECRYPTOR_INTERFACE_H_ |
| #define API_SFRAME_SFRAME_DECRYPTOR_INTERFACE_H_ |
| |
| #include <cstdint> |
| #include <memory> |
| #include <optional> |
| #include <span> |
| |
| #include "absl/functional/any_invocable.h" |
| #include "api/frame_transformer_interface.h" |
| #include "api/ref_count.h" |
| #include "api/rtc_error.h" |
| |
| namespace webrtc { |
| |
| enum class SframeDecryptErrorType { |
| kAuthentication, // Authentication tag validation failed. |
| kKeyId, // Unknown key identifier in the Sframe header. |
| kSyntax, // Payload does not follow the Sframe format. |
| }; |
| |
| // The error reported when Sframe decryption fails, |
| // aligned with SFrameTransformErrorEvent: |
| // https://w3c.github.io/webrtc-encoded-transform/#dom-sframetransformerrorrevent |
| struct SframeDecryptError { |
| SframeDecryptErrorType error_type; |
| // Key identifier parsed from the Sframe header. |
| // Set only when `error_type` is kKeyId; otherwise nullopt. |
| std::optional<uint64_t> key_id; |
| // Frame/Packet that failed decryption. The payload is the unmodified |
| // encrypted data — Sframe verifies authentication before decrypting |
| // (RFC 9605, Section 4.5.1), so no plaintext is ever exposed here. |
| // TODO(bugs.webrtc.org/479862368): Add tests verifying that the frame |
| // payload is unmodified ciphertext when this field is populated. |
| std::unique_ptr<TransformableFrameInterface> frame; |
| }; |
| |
| // Invoked when Sframe decryption fails. |
| // |
| // The Sframe transform algorithm requires firing an error on each decrypt |
| // failure, which can mean one event per frame/packet for a sustained failure. |
| // WebRTC may instead invoke this at most once while the same error recurs |
| // consecutively. Whether the spec should limit such events is tracked in |
| // https://github.com/w3c/webrtc-encoded-transform/issues/307 |
| using SframeDecryptErrorCallback = absl::AnyInvocable<void(SframeDecryptError)>; |
| |
| // Key management handle for Sframe receiver decryption. |
| class SframeDecryptorInterface : public RefCountInterface { |
| public: |
| virtual RTCError AddDecryptionKey(uint64_t key_id, |
| std::span<const uint8_t> key_material) = 0; |
| |
| virtual RTCError RemoveDecryptionKey(uint64_t key_id) = 0; |
| |
| protected: |
| ~SframeDecryptorInterface() override = default; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // API_SFRAME_SFRAME_DECRYPTOR_INTERFACE_H_ |