blob: 394acd97a91c687ad4c2d2b4c0d2198d4ca1a384 [file] [log] [blame]
// Copyright 2025 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.
@available(added=HEAD)
library fuchsia.security.keymint;
/// Allows a client to generate sealing keys and then use these keys to seal and unseal secrets.
/// Sealed secrets are safe for offline storage.
///
/// Note that (un)seal is synonymous with (un)wrap, e.g., wrapping an encryption key is the same
/// as sealing an encryption key.
@discoverable
closed protocol SealingKeys {
/// Generates a new sealing key to seal and unseal secrets.
///
/// |key_info| is information to be cryptographically bound to the returned key.
/// * The client will have to supply it in all uses (other than key deletion) of the returned
/// key.
/// * It serves two purposes: (1) internally by the key manager to identify the key owner and
/// (2) as a password to mitigate potential attacks from the key manager and as well as
/// other clients.
/// * It is recommended to include sufficient entropy in it (using it as a password) to
/// mitigage potential attacks from the secure world (the key manager's execution
/// environment) or from other clients.
/// * It is acceptible to pass a constant if deriving and persisting a password is too
/// cumbersome and the client fully trust the secure world and there are not many other
/// clients.
///
/// The client is responsible for persisting both |key_info| and the returned |key_blob|.
/// The key blob is encrypted with a TEE-private key. It is guaranteed to be unique for each
/// call (even with the same key info). It can be stored in unsecure storage.
///
/// Returns:
/// * The sealing key if everything worked.
/// * FAILED_CREATE if the key creation failed, e.g., the |key_info| was empty.
strict CreateSealingKey(struct {
key_info vector<uint8>:MAX;
}) -> (struct {
key_blob vector<uint8>:MAX;
}) error CreateError;
/// Seals a secret using a sealing key identified by its info and blob:
/// * The key info has to match the one supplied when generating the sealing key.
///
/// Note that the secret may be a key itself. It has no bearing on the seal operation.
///
/// Returns:
/// * The sealed secret if everything worked.
/// * FAILED_SEAL if the sealing failed, e.g., sealing key info or blob mismatch.
strict Seal(struct {
key_info vector<uint8>:MAX;
key_blob vector<uint8>:MAX;
secret vector<uint8>:MAX;
}) -> (struct {
sealed_secret vector<uint8>:MAX;
}) error SealError;
/// Unseals a sealed secret using a sealing key identified by its info and blob:
/// * The key info has to match the one supplied when generating the sealing key.
/// * The key blob has to match the one used to seal the secret.
///
/// Note that the secret may be a key itself. It has no bearing on the unseal operation.
///
/// Returns:
/// * The unsealed secret if everything worked.
/// * FAILED_UNSEAL if the unsealing failed, e.g., sealing key info or blob mismatch.
strict Unseal(struct {
key_info vector<uint8>:MAX;
key_blob vector<uint8>:MAX;
sealed_secret vector<uint8>:MAX;
}) -> (struct {
unsealed_secret vector<uint8>:MAX;
}) error UnsealError;
// TODO(http://fxbug.dev/423694897): add "delete all keys" method.
};
type CreateError = flexible enum {
@unknown
UNKNOWN = 0;
FAILED_CREATION = 1;
};
type SealError = flexible enum {
@unknown
UNKNOWN = 0;
FAILED_SEAL = 1;
};
type UnsealError = flexible enum {
@unknown
UNKNOWN = 0;
FAILED_UNSEAL = 1;
};