// 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.hybrid.HybridEncryptWrapper'); const Bytes = goog.require('tink.subtle.Bytes'); const HybridEncrypt = goog.require('tink.HybridEncrypt'); const PrimitiveSet = goog.require('tink.PrimitiveSet'); const PrimitiveWrapper = goog.require('tink.PrimitiveWrapper'); const SecurityException = goog.require('tink.exception.SecurityException'); /** * @implements {HybridEncrypt} * @final */ class WrappedHybridEncrypt { // The constructor should be @private, but it is not supported by Closure // (see https://github.com/google/closure-compiler/issues/2761). /** @param {!PrimitiveSet.PrimitiveSet} hybridEncryptPrimitiveSet */ constructor(hybridEncryptPrimitiveSet) { /** @private @const {!PrimitiveSet.PrimitiveSet} */ this.hybridEncryptPrimitiveSet_ = hybridEncryptPrimitiveSet; } /** * @param {!PrimitiveSet.PrimitiveSet} hybridEncryptPrimitiveSet * @return {!HybridEncrypt} */ static newHybridEncrypt(hybridEncryptPrimitiveSet) { if (!hybridEncryptPrimitiveSet) { throw new SecurityException('Primitive set has to be non-null.'); } if (!hybridEncryptPrimitiveSet.getPrimary()) { throw new SecurityException('Primary has to be non-null.'); } return new WrappedHybridEncrypt(hybridEncryptPrimitiveSet); } /** @override */ async encrypt(plaintext, opt_contextInfo) { if (!plaintext) { throw new SecurityException('Plaintext has to be non-null.'); } const primitive = this.hybridEncryptPrimitiveSet_.getPrimary().getPrimitive(); const ciphertext = await primitive.encrypt(plaintext, opt_contextInfo); const keyId = this.hybridEncryptPrimitiveSet_.getPrimary().getIdentifier(); return Bytes.concat(keyId, ciphertext); } } /** * @implements {PrimitiveWrapper<HybridEncrypt>} */ class HybridEncryptWrapper { // The constructor should be @private, but it is not supported by Closure // (see https://github.com/google/closure-compiler/issues/2761). constructor() {} /** * @override */ wrap(primitiveSet) { return WrappedHybridEncrypt.newHybridEncrypt(primitiveSet); } /** * @override */ getPrimitiveType() { return HybridEncrypt; } } goog.exportSymbol('tink.hybrid.HybridEncryptWrapper', HybridEncryptWrapper); exports = HybridEncryptWrapper;