From cc50b30399e2b029dec31a65a9de753178a454c1 Mon Sep 17 00:00:00 2001 From: stelar7 Date: Thu, 31 Jul 2025 11:46:32 +0200 Subject: [PATCH] LibWeb/EME: Implement a KeySystem --- .../EncryptedMediaExtensions/KeySystem.h | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Libraries/LibWeb/EncryptedMediaExtensions/KeySystem.h diff --git a/Libraries/LibWeb/EncryptedMediaExtensions/KeySystem.h b/Libraries/LibWeb/EncryptedMediaExtensions/KeySystem.h new file mode 100644 index 00000000000..7c8275df386 --- /dev/null +++ b/Libraries/LibWeb/EncryptedMediaExtensions/KeySystem.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025, stelar7 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::EncryptedMediaExtensions { + +class KeySystem { +public: + virtual ~KeySystem() = default; + + virtual bool supports_init_data_type(Utf16String const& init_data_type) const = 0; + virtual bool supports_encryption_scheme(Utf16String const& encryption_scheme) const = 0; + virtual bool supports_robustness(Utf16String const& robustness) const = 0; + virtual bool definitely_supports_playback(Utf16String const& container, Utf16String const& media_types, Optional encryption_scheme, Utf16String const& robustness, Bindings::MediaKeySystemConfiguration const& accumulated_configuration, MediaKeyRestrictions const& restrictions) const = 0; + +private: +}; + +class ClearKeySystem : public KeySystem { +public: + ClearKeySystem() = default; + virtual ~ClearKeySystem() override = default; + + // https://w3c.github.io/encrypted-media/#clear-key-behavior + virtual bool supports_init_data_type(Utf16String const& init_data_type) const override + { + // Implementations SHOULD support the "keyids" type + // TODO: Implementations MAY support any combination of registered Initialization Data Types + // https://www.w3.org/TR/eme-initdata-registry/ + constexpr Array registered_init_data_types = { + "keyids"sv, + }; + + return registered_init_data_types.contains_slow(init_data_type); + } + + // https://w3c.github.io/encrypted-media/#clear-key-capabilities + virtual bool supports_encryption_scheme(Utf16String const& encryption_scheme) const override + { + // encryptionScheme: Implementations MUST support the "cenc" scheme, and MAY support other schemes. + return encryption_scheme == "cenc"sv; + } + + // https://w3c.github.io/encrypted-media/#clear-key-capabilities + virtual bool supports_robustness(Utf16String const& robustness) const override + { + // robustness: Only the empty string is supported. + return robustness.is_empty(); + } + + virtual bool definitely_supports_playback(Utf16String const& container, Utf16String const& media_types, Optional encryption_scheme, Utf16String const& robustness, Bindings::MediaKeySystemConfiguration const& accumulated_configuration, MediaKeyRestrictions const& restrictions) const override + { + (void)container; + (void)media_types; + (void)encryption_scheme; + (void)robustness; + (void)accumulated_configuration; + (void)restrictions; + + // FIXME: Do some checks here + return true; + } +}; + +}