Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  key-storage.proto   Sprache: unbekannt

 
Spracherkennung für: .proto vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

syntax = "proto3";

package app;

option java_package = "ch.threema.localcrypto.protobuf";
option java_multiple_files = true;

message InnerKeyStorage {
  enum Version {
    // Initial version
    V1_0 = 0;
  }
}

// Inner key storage V1, encoded in the following way:
//
// 1. Let `data` be the result of encoding this key storage to bytes.
// 2. Let `version` be the selected `InnerKeyStorage.Version.V1_X` version.
// 3. Return `u16-le(version) || data`.
message InnerKeyStorageV1 {
  // Master key, used for the database, files, encrypted settings, etc.
  bytes master_key = 1;
}

message IntermediateKeyStorage {
  enum Version {
    // Initial version
    V1_0 = 0;
  }
}

// Intermediate key storage V1, encoded in the following way:
//
// 1. Let `data` be the result of encoding this key storage to bytes.
// 2. Let `version` be the selected `IntermediateKeyStorage.Version.V1_X` version.
// 3. Return `u16-le(version) || data`.
message IntermediateKeyStorageV1 {
  message RemoteSecretProtected {
    // Associated remote secret authentication token
    bytes remote_secret_authentication_token = 1;

    // Associated remote secret hash
    bytes remote_secret_hash = 2;

    // Encapsulated compatible, version-prefixed inner key storage, encrypted
    // and encoded in the following way:
    //
    // 1. Let `RS` be the remote secret.
    // 2. Let `RSSK` be the result of
    //    `BLAKE2b(key=RS, salt='rssk-a', personal='3ma-rs')`.
    // 3. Let `inner` be the plaintext `Inner`, encoded to bytes.
    // 4. Let `nonce` be a random nonce.
    // 5. Let `encrypted-inner` be the result of encrypting `inner` by
    //    `XChaCha20-Poly1305(key=RSSK, nonce)`.
    // 6. Set this field to `nonce || encrypted-inner` (i.e. an
    //    `extra.crypto.encrypted-data-with-nonce-ahead` struct).
    bytes encrypted_inner = 3;
  }

  oneof inner {
    // A compatible, version-prefixed inner key storage without any further
    // protection
    bytes plaintext_inner = 1;

    // Inner key storage protected by the Remote Secret protocol
    RemoteSecretProtected remote_secret_protected_inner = 2;
  }
}

message OuterKeyStorage {
  enum Version {
    // Initial version
    V1_0 = 0;
  }
}

// Outer key storage V1, encoded in the following way:
//
// 1. Let `data` be the result of encoding this key storage to bytes.
// 2. Let `version` be the selected `OuterKeyStorage.Version.V1_X` version.
// 3. Return `u16-le(version) || data`.
message OuterKeyStorageV1 {
  message Argon2idProtected {
    // Version of Argon2
    enum Argon2Version {
      VERSION_1_3 = 0;
    }
    Argon2Version version = 1;

    // Random salt (16 bytes)
    bytes salt = 2;

    // Memory usage in bytes (≥ 128 MiB)
    uint32 memory_bytes = 3;

    // Number of iterations (≥ 3)
    uint32 iterations = 4;

    // Amount of parallelism (≥ 1, recommended to be 1)
    uint32 parallelism = 5;

    // Encapsulated compatible, version-prefixed intermediate key storage,
    // encrypted and encoded in the following way:
    //
    // 1. Let `SK` be a 32 byte secret key derived by running Argon2id with the
    //    given parameters and the user-provided passphrase.
    // 2. Let `nonce` be a random nonce.
    // 3. Let `intermediate` be a compatible, version-prefixed intermediate key
    //    storage encoded to bytes.
    // 4. Let `encrypted-intermediate` be the result of encrypting `intermediate`
    //    by `XChaCha20-Poly1305(key=SK, nonce)`.
    // 5. Set this field to `nonce || encrypted-intermediate` (i.e. an
    //    `extra.crypto.encrypted-data-with-nonce-ahead` struct).
    bytes encrypted_intermediate = 6;
  }

  oneof intermediate {
    // A compatible, version-prefixed intermediate key storage without any
    // further protection
    bytes plaintext_intermediate = 1;

    // Intermediate key storage protected by a passphrase, using Argon2id
    Argon2idProtected argon2id_protected_intermediate = 2;
  }
}

// Outer outer key storage, wraps an instance of `OuterKeyStorage`,
// encrypted with a secret key stored in the Android Key Store.
message KeyWrapper {
  // Alias of the secret key from the Android KeyStore that was used to encrypt the data in `encrypted_key_storage_data`
  string key_store_alias = 1;

  // The IV associated with the encrypted data in `encrypted_key_storage_data`
  bytes iv = 2;

  // The encrypted bytes of `OuterKeyStorage`
  bytes encrypted_key_storage_data = 3;
}

[Dauer der Verarbeitung: 0.17 Sekunden, vorverarbeitet 2026-04-27]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge