blob: 9d5423f50ec109ee31c259a5b80aaac83b81e5d2 [file] [log] [blame]
// 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.
//
////////////////////////////////////////////////////////////////////////////////
goog.module('tink.HybridEncrypt');
/**
* Interface for hybrid encryption.
*
* Hybrid Encryption combines the efficiency of symmetric encryption with the
* convenience of public-key encryption: to encrypt a message a fresh symmetric
* key is generated and used to encrypt the actual plaintext data, while the
* recipient’s public key is used to encrypt the symmetric key only, and the
* final ciphertext consists of the symmetric ciphertext and the encrypted
* symmetric key.
*
* WARNING: Hybrid Encryption does not provide authenticity, that is the
* recipient of an encrypted message does not know the identity of the sender.
* Similar to general public-key encryption schemes the security goal of Hybrid
* Encryption is to provide privacy only. In other words, Hybrid Encryption is
* secure if and only if the recipient can accept anonymous messages or can rely
* on other mechanisms to authenticate the sender.
*
* Security guarantees: The functionality of Hybrid Encryption is represented as
* a pair of primitives (interfaces): `HybridEncrypt` for encryption of data,
* and `HybridDecrypt` for decryption. Implementations of these interfaces are
* secure against adaptive chosen ciphertext attacks.
*
* In addition to `plaintext` the encryption takes an extra, optional parameter
* `opt_contextInfo`, which usually is public data implicit from the context,
* but should be bound to the resulting ciphertext, i.e. the ciphertext allows
* for checking the integrity of `opt_contextInfo` (but there are no guarantees
* wrt. the secrecy or authenticity of `opt_contextInfo`).
*
* `opt_contextInfo` can be empty or null, but to ensure the correct
* decryption of a ciphertext the same value must be provided for the decryption
* operation as was used during encryption (cf. `HybridEncrypt`}).
*
* A concrete instantiation of this interface can implement the binding of
* contextInfo to the ciphertext in various ways, for example:
* * use `opt_contextInfo` as "associated data"-input for the employed
* AEAD symmetric encryption (cf. https://tools.ietf.org/html/rfc5116).
* * use `opt_contextInfo` as "CtxInfo"-input for HKDF (if the
* implementation uses HKDF as key derivation function, cf.
* https://tools.ietf.org/html/rfc5869).
*
* @record
*/
class HybridEncrypt {
/**
* Encryption operation: encrypts `plaintext` binding `opt_contextInfo` to the
* resulting ciphertext.
*
* @param {!Uint8Array} plaintext the plaintext to be encrypted, must be
* non-null.
* @param {?Uint8Array=} opt_contextInfo optional context info to be
* authenticated. It can be null, which is equivalent to an empty
* (zero-length) byte array.
* @return {!Promise<!Uint8Array>} resulting ciphertext
*/
encrypt(plaintext, opt_contextInfo) {}
}
goog.exportSymbol('tink.HybridEncrypt', HybridEncrypt);
exports = HybridEncrypt;