// Copyright (c) 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Provides wire-type for cryptohome Key objects. It does not // represent the entirety of the bookkeeping data needed by Cryptohome. // // Anything in this file may be persisted on disk. Update carefully! syntax = "proto2"; option optimize_for = LITE_RUNTIME; package cryptohome; message KeyAuthorizationSecretUsage { optional bool encrypt = 1; optional bool sign = 2; } message KeyAuthorizationSecret { optional KeyAuthorizationSecretUsage usage = 1; optional bytes symmetric_key = 2; optional bytes public_key = 3; // Indicates if the symmetric_key is wrapped. optional bool wrapped = 4 [default=false]; } message KeyAuthorizationData { enum KeyAuthorizationType { KEY_AUTHORIZATION_TYPE_HMACSHA256 = 0; KEY_AUTHORIZATION_TYPE_AES256CBC_HMACSHA256 = 1; } optional KeyAuthorizationType type = 1; repeated KeyAuthorizationSecret secrets = 2; } // Software-enforced privileges. message KeyPrivileges { // Allows the key to mount the cryptohome. optional bool mount = 1 [default=true]; // Allows new keys to be added. optional bool add = 2 [default=true]; // Allows other existing keys to be removed. optional bool remove = 3 [default=true]; // Allows the key to update itself. optional bool update = 4 [default=true]; // Allows a key to update itself iff the requested change // is authorized as per KeyAuthorizationData. optional bool authorized_update = 5 [default=false]; } // Public metadata stored on behalf of the KeyProvider. message KeyProviderData { message Entry { optional string name = 1; optional int64 number = 2; optional bytes bytes = 3; } repeated Entry entry = 1; } message KeyData { // The KeyType should specify the handling needed by Cryptohome // and not a provider KeyType. enum KeyType { KEY_TYPE_PASSWORD = 0; } optional KeyType type = 1; // All keys must be labeled when persisted to disk, but when KeyData // is used in an UpdateKeyRequest, only defined fields are necessary // (so that the caller doesn't need the full KeyData first). optional string label = 2; // If undefined, use the default settings. optional KeyPrivileges privileges = 3; optional int64 revision = 4; // At present, only support for one authorization mechanism is implemented. repeated KeyAuthorizationData authorization_data = 5; // Data stored for use by the provider of the key, often for pre-processing // of passwords or custom provider key typing. // This will be size-limited by serialized size (e.g., 4096 bytes). optional KeyProviderData provider_data = 6; } // Key is not presently persisted to disk, but it acts as the single authority // for what comprises a key. message Key { // In most cases, |data| is required. When used in an UpdateKeyRequest, it // is only required if KeyData is changing. If only the |secret| is changing, // this field may be left unset. optional KeyData data = 1; // |secret| is required for many requests, like AddKeyRequest, but not all. // An UpdateKeyRequest only requires the changes to the Key that was // was authorized in the AuthorizationRequest. Making |secret| required would // logically force a key rotation even if the values were the same. optional bytes secret = 2; }