// 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.mem;

enum ProvisioningStatus {
    NOT_PROVISIONED = 1;
    PROVISIONED = 2;
};

/// A message originating from the [`Provisioner`] that the caller must route to
/// the provisioning server.
struct ProvisioningRequest {
    /// An optional server to send the [`ProvisioningRequest`] to. This field is
    /// not required to be set and the client is not required to use it if one
    /// is provided.
    string? default_provisioning_server_url;
    fuchsia.mem.Buffer message;
};

/// A message originating from the provisioning server that the caller must
/// provide to [`Provisioner.ProcessProvisioningResponse`].
struct ProvisioningResponse {
    fuchsia.mem.Buffer message;
};

/// A protocol for exchanging messages pertaining to the establishment of a
/// provisioning certificate.
protocol Provisioner {
    /// Gets the current status of provisioning for this service instance.
    ///
    /// - response `status` indicates whether the service instance is
    ///   sufficiently provisioned.
    GetStatus() -> (ProvisioningStatus status);

    /// Sets the certificate to be used for encrypting outgoing messages.
    ///
    /// + request `certificate` a buffer containing the certificate to be used.
    /// * error an [`Error`] indicating the reason for failure.
    SetServerCertificate(bytes certificate) -> () error Error;

    /// Generates a provisioning request for this service instance.
    ///
    /// If the underlying DRM system requires provisioning for individual
    /// providers (the owner of the service instance), then this method can be
    /// used to generate [`ProvisioningRequest`]s. This message must be routed
    /// to the provisioning server by the client and the server's response must
    /// be routed back to `ProcessProvisioningResponse`.
    ///
    /// - response `request` a `ProvisioningRequest` message to be provided to a
    ///   provisioning server in order to receiving a provisioning certificate.
    GenerateProvisioningRequest() -> (ProvisioningRequest request);

    /// Updates the [`Provisioner`] with a message from the provisioning server.
    ///
    /// Not all underlying DRM systems will require provisioning for individual
    /// providers. If they do, this method will carry the provisioning message
    /// to the service instance so that it may persistently store the provider
    /// certificate.
    ///
    /// + request `response` a [`ProvisioningResponse`] from the provisioning
    ///   server. It should contain the provisioning certificate.
    /// * error an [`Error`] indicating the reason for failure.
    ProcessProvisioningResponse(ProvisioningResponse response)
        -> () error Error;

    /// Removes all provider based provisioning for this service instance.
    ///
    /// Any active [`ContentDecryptionModule`]s on this service instance that
    /// relied on this provisioning will be closed, as they will no longer be
    /// usable without it. This does not impact any factory provisioning.
    RemoveProvisioning();
};
