blob: decebc91466202bda97c4126cbec30c4a38c20f0 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.media.drm;
using fuchsia.io;
/// A sentinel value for use with [`KeySystem.CreateContentDecryptionModule2`]
/// to create a [`ContentDecryptionModule`] without a client data store.
const uint32 NO_DATA_STORE = 0;
protocol KeySystem {
/// Get various static properties of the `KeySystem` implementation.
///
/// The properties include the capabilities and requirements of the
/// `KeySystem`, such as whether the implementation is hardware-based or
/// whether it requires client-provided data stores to operate.
///
/// - response `properties` the properties of the `KeySystem`
/// implementation.
GetProperties() -> (KeySystemProperties properties);
/// Adds a client data store to the `KeySystem`.
///
/// DRM systems generate data on behalf of clients as part of provisioning
/// and license management. This data is only usable by the DRM system, but
/// the client is the owner of the data. The client controls the lifetime of
/// the data and can select which data set is to be used for a
/// [`ContentDecryptionModule`].
///
/// + request `data_store_id` a client-assigned identifier for the data
/// store. The identifier is scoped to the `KeySystem` channel. It is
/// invalid for the client to provide [`NO_DATA_STORE`] or an already
/// added `data_store_id` and the server should close the channel.
/// + request `data_store_params` the parameters to be used for this data
/// store.
AddDataStore(uint32 data_store_id,
DataStoreParams data_store_params) -> () error Error;
/// Destroys the client data store.
///
/// This method permanently removes this data store and all of its contents.
/// All provisioning and license data will be removed and any active
/// [`ContentDecryptionModule`] using this data store will be closed.
///
/// + request `data_store_id` the client-assigned identifier for the data
/// store to be removed. It is invalid for the client to provide
/// [`NO_DATA_STORE`] or a `data_store_id` value that has not previously
/// been added or has been previously destroyed.
DestroyDataStoreAndConfirm(uint32 data_store_id) -> ();
/// Creates a new [`ContentDecryptionModule`].
///
/// Creates a `ContentDecryptionModule` that will use the associated data
/// store, if provided. If [`NO_DATA_STORE`] is provided for the
/// `data_store_id`, then the created `ContentDecryptionModule` will only
/// support [`LicenseSession`]s of [`LicenseSessionType.TEMPORARY`] type.
/// If a `data_store_id` is provided, then the created
/// `ContentDecryptionModule` will persist data to that data store. If the
/// `KeySystem` requires a data store and `NO_DATA_STORE` was provided or
/// the `KeySystem` does not support data stores and one was provided, then
/// the server should close the `cdm`.
///
/// If the `data_store_id` does not exist, the `cdm` will be closed with a
/// `ZX_ERR_NOT_FOUND` epitaph.
///
/// + request `data_store_id` the data store that should be used by the
/// `ContentDecryptionModule`.
/// + request `cdm` the server endpoint of the `ContentDecryptionModule`.
CreateContentDecryptionModule2(uint32 data_store_id,
request<ContentDecryptionModule> cdm);
};
resource table DataStoreParams {
/// Directory into which this data store should write persistent
/// provisioning and licenses, or their proxy. This field is required.
1: fuchsia.io.Directory data_directory;
/// Certificate to use for encrypting provisioning messages. This field is
/// optional.
2: bytes provision_server_certificate;
/// The client endpoint of the [`ProvisioningFetcher`] to be used when this
/// data store requires provisioning. If the DRM system requires data store
/// provisioning, then this field is required to be set. Otherwise, it is
/// optional.
3: ProvisioningFetcher provisioning_fetcher;
};
// TODO(fxbug.dev/13674): Convert these protocols to services once available.
/// A service hub providing access to the ClearKey key system. This key system
/// is defined by the [`W3C Encrypted Media Extensions`]. It uses plain-text
/// keys to decrypt the source.
///
/// If the client closes the `ClearKey` channel, derived
/// `ContentDecryptionModule`s will remain active.
///
/// [`W3C Encrypted Media Extensions`]:
/// https://www.w3.org/TR/encrypted-media
[Discoverable]
protocol ClearKey {
compose KeySystem;
};
/// A service hub providing access to the Widevine key system.
///
/// If the client closes the `Widevine` channel, derived
/// `ContentDecryptionModule`s will remain active.
[Discoverable]
protocol Widevine {
compose KeySystem;
};
/// A service hub providing access to the PlayReady key system.
///
/// If the client closes the `PlayReady` channel, derived
/// `ContentDecryptionModule`s will remain active.
[Discoverable]
protocol PlayReady {
compose KeySystem;
};