// Copyright (c) 2012 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.
//
// Sync protocol datatype extension for nigori keys.

// Update proto_value_conversions{.h,.cc,_unittest.cc} if you change
// any fields in this file.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;
option retain_unknown_fields = true;

package sync_pb;

import "encryption.proto";

message NigoriKey {
  optional string name = 1;
  optional bytes user_key = 2;
  optional bytes encryption_key = 3;
  optional bytes mac_key = 4;
}

message NigoriKeyBag {
  repeated NigoriKey key = 2;
}

// Properties of nigori sync object.
message NigoriSpecifics {
  optional EncryptedData encryption_keybag = 1;
  // Once keystore migration is performed, we have to freeze the keybag so that
  // older clients (that don't support keystore encryption) do not attempt to
  // update the keybag.
  // Previously |using_explicit_passphrase|.
  optional bool keybag_is_frozen = 2;

  // Obsolete encryption fields. These were deprecated due to legacy versions
  // that understand their usage but did not perform encryption properly.
  // optional bool deprecated_encrypt_bookmarks = 3;
  // optional bool deprecated_encrypt_preferences = 4;
  // optional bool deprecated_encrypt_autofill_profile = 5;
  // optional bool deprecated_encrypt_autofill = 6;
  // optional bool deprecated_encrypt_themes = 7;
  // optional bool deprecated_encrypt_typed_urls = 8;
  // optional bool deprecated_encrypt_extensions = 9;
  // optional bool deprecated_encrypt_sessions = 10;
  // optional bool deprecated_encrypt_apps = 11;
  // optional bool deprecated_encrypt_search_engines = 12;

  // Booleans corresponding to whether a datatype should be encrypted.
  // Passwords are always encrypted, so we don't need a field here.
  // History delete directives need to be consumable by the server, and
  // thus can't be encrypted.
  // Synced Notifications need to be consumed by the server (the read flag)
  // and thus can't be encrypted.
  // Synced Notification App Info is set by the server, and thus cannot be
  // encrypted.
  optional bool encrypt_bookmarks = 13;
  optional bool encrypt_preferences = 14;
  optional bool encrypt_autofill_profile = 15;
  optional bool encrypt_autofill = 16;
  optional bool encrypt_themes = 17;
  optional bool encrypt_typed_urls = 18;
  optional bool encrypt_extensions = 19;
  optional bool encrypt_sessions = 20;
  optional bool encrypt_apps = 21;
  optional bool encrypt_search_engines = 22;

  // Deprecated on clients where tab sync is enabled by default.
  // optional bool sync_tabs = 23;

  // If true, all current and future datatypes will be encrypted.
  optional bool encrypt_everything = 24;

  optional bool encrypt_extension_settings = 25;
  optional bool encrypt_app_notifications = 26;
  optional bool encrypt_app_settings = 27;

  // User device information. Contains information about each device that has a
  // sync-enabled Chrome browser connected to the user account.
  // This has been moved to the DeviceInfo message.
  // repeated DeviceInformation deprecated_device_information = 28;

  // Enable syncing favicons as part of tab sync.
  optional bool sync_tab_favicons = 29;

  // The state of the passphrase required to decrypt |encryption_keybag|.
  enum PassphraseType {
    // Gaia-based encryption passphrase. Deprecated.
    IMPLICIT_PASSPHRASE = 1;
    // Keystore key encryption passphrase. Uses |keystore_bootstrap| to
    // decrypt |encryption_keybag|.
    KEYSTORE_PASSPHRASE = 2;
    // Previous Gaia-based passphrase frozen and treated as a custom passphrase.
    FROZEN_IMPLICIT_PASSPHRASE  = 3;
    // User provided custom passphrase.
    CUSTOM_PASSPHRASE = 4;
  }
  optional PassphraseType passphrase_type = 30
      [default = IMPLICIT_PASSPHRASE];

  // The keystore decryptor token blob. Encrypted with the keystore key, and
  // contains the encryption key used to decrypt |encryption_keybag|.
  // Only set if passphrase_state == KEYSTORE_PASSPHRASE.
  optional EncryptedData keystore_decryptor_token = 31;

  // The time (in epoch milliseconds) at which the keystore migration was
  // performed.
  optional int64 keystore_migration_time = 32;

  // The time (in epoch milliseconds) at which a custom passphrase was set.
  // Note: this field may not be set if the custom passphrase was applied before
  // this field was introduced.
  optional int64 custom_passphrase_time = 33;

  // Boolean corresponding to whether custom spelling dictionary should be
  // encrypted.
  optional bool encrypt_dictionary = 34;

  // Boolean corresponding to Whether to encrypt favicons data or not.
  optional bool encrypt_favicon_images = 35;
  optional bool encrypt_favicon_tracking = 36;

  // Boolean corresponding to whether articles should be encrypted.
  optional bool encrypt_articles = 37;

  // Boolean corresponding to whether app list items should be encrypted.
  optional bool encrypt_app_list = 38;
}

