| // Copyright 2018 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #ifndef TINK_HYBRID_HYBRID_KEY_TEMPLATES_H_ |
| #define TINK_HYBRID_HYBRID_KEY_TEMPLATES_H_ |
| |
| #include "proto/tink.pb.h" |
| |
| namespace crypto { |
| namespace tink { |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // Pre-generated KeyTemplate for hybrid key types. One can use these templates |
| // to generate a new KeysetHandle object with fresh keys. |
| // To generate a new keyset that contains a single EciesAeadHkdfPrivateKey, |
| // one can do: |
| // |
| // auto status = HybridConfig::Register(); |
| // if (!status.ok()) { /* fail with error */ } |
| // auto handle_result = KeysetHandle::GenerateNew( |
| // HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128Gcm()); |
| // if (!handle_result.ok()) { /* fail with error */ } |
| // auto keyset_handle = std::move(handle_result.value()); |
| class HybridKeyTemplates { |
| public: |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over NIST P-256 |
| // - DEM: AES128-GCM |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Uncompressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesP256HkdfHmacSha256Aes128Gcm(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over NIST P-256 |
| // - DEM: AES128-GCM |
| // - KDF: HKDF-HMAC-SHA512 with an empty salt |
| // - EC Point Format: Uncompressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesP256HkdfHmacSha512Aes128Gcm(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over NIST P-256 |
| // - DEM: AES128-GCM |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Compressed |
| // - OutputPrefixType: RAW |
| static const google::crypto::tink::KeyTemplate& |
| EciesP256HkdfHmacSha256Aes128GcmCompressedWithoutPrefix(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over NIST P-256 |
| // - DEM: AES128-CTR-HMAC-SHA256 with the following parameters: |
| // * AES key size: 16 bytes |
| // * AES CTR IV size: 16 bytes |
| // * HMAC key size: 32 bytes |
| // * HMAC tag size: 16 bytes |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Uncompressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesP256HkdfHmacSha256Aes128CtrHmacSha256(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over NIST P-256 |
| // - DEM: AES128-CTR-HMAC-SHA256 with the following parameters: |
| // * AES key size: 16 bytes |
| // * AES CTR IV size: 16 bytes |
| // * HMAC key size: 32 bytes |
| // * HMAC tag size: 16 bytes |
| // - KDF: HKDF-HMAC-SHA512 with an empty salt |
| // - EC Point Format: Uncompressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesP256HkdfHmacSha512Aes128CtrHmacSha256(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over NIST P-256 |
| // - DEM: AES128-GCM |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Compressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesP256CompressedHkdfHmacSha256Aes128Gcm(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over NIST P-256 |
| // - DEM: AES128-CTR-HMAC-SHA256 with the following parameters: |
| // * AES key size: 16 bytes |
| // * AES CTR IV size: 16 bytes |
| // * HMAC key size: 32 bytes |
| // * HMAC tag size: 16 bytes |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Compressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesP256CompressedHkdfHmacSha256Aes128CtrHmacSha256(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 |
| // - DEM: AES128-GCM |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Compressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesX25519HkdfHmacSha256Aes128Gcm(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 |
| // - DEM: AES256-GCM |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Compressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesX25519HkdfHmacSha256Aes256Gcm(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 |
| // - DEM: AES128-CTR-HMAC-SHA256 with the following parameters: |
| // * AES key size: 16 bytes |
| // * AES CTR IV size: 16 bytes |
| // * HMAC key size: 32 bytes |
| // * HMAC tag size: 16 bytes |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Compressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesX25519HkdfHmacSha256Aes128CtrHmacSha256(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 |
| // - DEM: XChaCha20-Poly1305 with the following parameters: |
| // * XChaCha20 key size: 32 bytes |
| // * IV size: 24 bytes |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Compressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesX25519HkdfHmacSha256XChaCha20Poly1305(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // EciesAeadHkdfPrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 |
| // - DEM: AES-SIV (Deterministic Aead) |
| // - KDF: HKDF-HMAC-SHA256 with an empty salt |
| // - EC Point Format: Compressed |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| EciesX25519HkdfHmacSha256DeterministicAesSiv(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // HpkePrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 plus HKDF-SHA256 |
| // - KDF: HKDF-SHA256 |
| // - AEAD: AES-128-GCM |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| HpkeX25519HkdfSha256Aes128Gcm(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // HpkePrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 plus HKDF-SHA256 |
| // - KDF: HKDF-SHA256 |
| // - AEAD: AES-128-GCM |
| // - OutputPrefixType: RAW |
| static const google::crypto::tink::KeyTemplate& |
| HpkeX25519HkdfSha256Aes128GcmRaw(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // HpkePrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 plus HKDF-SHA256 |
| // - KDF: HKDF-SHA256 |
| // - AEAD: AES-256-GCM |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| HpkeX25519HkdfSha256Aes256Gcm(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // HpkePrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 plus HKDF-SHA256 |
| // - KDF: HKDF-SHA256 |
| // - AEAD: AES-256-GCM |
| // - OutputPrefixType: RAW |
| static const google::crypto::tink::KeyTemplate& |
| HpkeX25519HkdfSha256Aes256GcmRaw(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // HpkePrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 plus HKDF-SHA256 |
| // - KDF: HKDF-SHA256 |
| // - AEAD: ChaCha20-Poly1305 |
| // - OutputPrefixType: TINK |
| static const google::crypto::tink::KeyTemplate& |
| HpkeX25519HkdfSha256ChaCha20Poly1305(); |
| |
| // Returns a KeyTemplate that generates new instances of |
| // HpkePrivateKey with the following parameters: |
| // - KEM: ECDH over curve 25519 plus HKDF-SHA256 |
| // - KDF: HKDF-SHA256 |
| // - AEAD: ChaCha20-Poly1305 |
| // - OutputPrefixType: RAW |
| static const google::crypto::tink::KeyTemplate& |
| HpkeX25519HkdfSha256ChaCha20Poly1305Raw(); |
| }; |
| |
| } // namespace tink |
| } // namespace crypto |
| |
| #endif // TINK_HYBRID_HYBRID_KEY_TEMPLATES_H_ |