tink-crypto
Version:
A multi-language, cross-platform library that provides cryptographic APIs that are secure, easy to use correctly, and hard(er) to misuse.
98 lines • 11.5 kB
JavaScript
/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { SecurityException } from '../exception/security_exception';
import { CryptoFormat } from '../internal/crypto_format';
import { PbKeyStatusType } from '../internal/proto';
import { HybridDecrypt } from './internal/hybrid_decrypt';
/**
* @final
*/
class WrappedHybridDecrypt extends HybridDecrypt {
// The constructor should be @private, but it is not supported by Closure
// (see https://github.com/google/closure-compiler/issues/2761).
constructor(hybridDecryptPrimitiveSet) {
super();
this.hybridDecryptPrimitiveSet = hybridDecryptPrimitiveSet;
}
static newHybridDecrypt(hybridDecryptPrimitiveSet) {
if (!hybridDecryptPrimitiveSet) {
throw new SecurityException('Primitive set has to be non-null.');
}
return new WrappedHybridDecrypt(hybridDecryptPrimitiveSet);
}
decrypt(ciphertext, opt_contextInfo) {
return __awaiter(this, void 0, void 0, function* () {
if (!ciphertext) {
throw new SecurityException('Ciphertext has to be non-null.');
}
if (ciphertext.length > CryptoFormat.NON_RAW_PREFIX_SIZE) {
const keyId = ciphertext.subarray(0, CryptoFormat.NON_RAW_PREFIX_SIZE);
const primitives = yield this.hybridDecryptPrimitiveSet.getPrimitives(keyId);
const rawCiphertext = ciphertext.subarray(CryptoFormat.NON_RAW_PREFIX_SIZE, ciphertext.length);
let decryptedText;
try {
decryptedText = yield this.tryDecryption(primitives, rawCiphertext, opt_contextInfo);
}
catch (e) {
}
if (decryptedText) {
return decryptedText;
}
}
const primitives = yield this.hybridDecryptPrimitiveSet.getRawPrimitives();
return this.tryDecryption(primitives, ciphertext, opt_contextInfo);
});
}
/**
* Tries to decrypt the ciphertext using each entry in primitives and
* returns the ciphertext decrypted by first primitive which succeed. It
* throws an exception if no entry succeeds.
*
*
*/
tryDecryption(primitives, ciphertext, opt_contextInfo) {
return __awaiter(this, void 0, void 0, function* () {
const primitivesLength = primitives.length;
for (let i = 0; i < primitivesLength; i++) {
if (primitives[i].getKeyStatus() != PbKeyStatusType.ENABLED) {
continue;
}
const primitive = primitives[i].getPrimitive();
let decryptionResult;
try {
decryptionResult = yield primitive.decrypt(ciphertext, opt_contextInfo);
}
catch (e) {
continue;
}
return decryptionResult;
}
throw new SecurityException('Decryption failed for the given ciphertext.');
});
}
}
export class HybridDecryptWrapper {
/**
*/
wrap(primitiveSet) {
return WrappedHybridDecrypt.newHybridDecrypt(primitiveSet);
}
/**
*/
getPrimitiveType() {
return HybridDecrypt;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlicmlkX2RlY3J5cHRfd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2h5YnJpZC9oeWJyaWRfZGVjcnlwdF93cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFHdkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RDs7R0FFRztBQUNILE1BQU0sb0JBQXFCLFNBQVEsYUFBYTtJQUM5Qyx5RUFBeUU7SUFDekUsZ0VBQWdFO0lBQ2hFLFlBQTZCLHlCQUMyQjtRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQUZtQiw4QkFBeUIsR0FBekIseUJBQXlCLENBQ0U7SUFFeEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFDNEM7UUFFbEUsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQzlCLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsT0FBTyxJQUFJLG9CQUFvQixDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVLLE9BQU8sQ0FBQyxVQUFzQixFQUFFLGVBQTRCOztZQUNoRSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDeEQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3ZFLE1BQU0sVUFBVSxHQUNaLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FDckMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekQsSUFBSSxhQUFtQyxDQUFDO2dCQUN4QyxJQUFJO29CQUNGLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQ3BDLFVBQVUsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7aUJBQ2pEO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO2lCQUNYO2dCQUNELElBQUksYUFBYSxFQUFFO29CQUNqQixPQUFPLGFBQWEsQ0FBQztpQkFDdEI7YUFDRjtZQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0UsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDckUsQ0FBQztLQUFBO0lBRUQ7Ozs7OztPQU1HO0lBQ1csYUFBYSxDQUN2QixVQUFvRCxFQUNwRCxVQUFzQixFQUN0QixlQUFpQzs7WUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRTtvQkFDM0QsU0FBUztpQkFDVjtnQkFDRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQy9DLElBQUksZ0JBQWdCLENBQUM7Z0JBQ3JCLElBQUk7b0JBQ0YsZ0JBQWdCLEdBQUcsTUFBTSxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztpQkFDekU7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsU0FBUztpQkFDVjtnQkFDRCxPQUFPLGdCQUFnQixDQUFDO2FBQ3pCO1lBQ0QsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDN0UsQ0FBQztLQUFBO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CO09BQ0c7SUFDSCxJQUFJLENBQUMsWUFBc0Q7UUFDekQsT0FBTyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7T0FDRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHtTZWN1cml0eUV4Y2VwdGlvbn0gZnJvbSAnLi4vZXhjZXB0aW9uL3NlY3VyaXR5X2V4Y2VwdGlvbic7XG5pbXBvcnQge0NyeXB0b0Zvcm1hdH0gZnJvbSAnLi4vaW50ZXJuYWwvY3J5cHRvX2Zvcm1hdCc7XG5pbXBvcnQgKiBhcyBQcmltaXRpdmVTZXQgZnJvbSAnLi4vaW50ZXJuYWwvcHJpbWl0aXZlX3NldCc7XG5pbXBvcnQge1ByaW1pdGl2ZVdyYXBwZXJ9IGZyb20gJy4uL2ludGVybmFsL3ByaW1pdGl2ZV93cmFwcGVyJztcbmltcG9ydCB7UGJLZXlTdGF0dXNUeXBlfSBmcm9tICcuLi9pbnRlcm5hbC9wcm90byc7XG5cbmltcG9ydCB7SHlicmlkRGVjcnlwdH0gZnJvbSAnLi9pbnRlcm5hbC9oeWJyaWRfZGVjcnlwdCc7XG5cbi8qKlxuICogQGZpbmFsXG4gKi9cbmNsYXNzIFdyYXBwZWRIeWJyaWREZWNyeXB0IGV4dGVuZHMgSHlicmlkRGVjcnlwdCB7XG4gIC8vIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgQHByaXZhdGUsIGJ1dCBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IENsb3N1cmVcbiAgLy8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzI3NjEpLlxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGh5YnJpZERlY3J5cHRQcmltaXRpdmVTZXQ6XG4gICAgICAgICAgICAgICAgICBQcmltaXRpdmVTZXQuUHJpbWl0aXZlU2V0PEh5YnJpZERlY3J5cHQ+KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHN0YXRpYyBuZXdIeWJyaWREZWNyeXB0KGh5YnJpZERlY3J5cHRQcmltaXRpdmVTZXQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVTZXQuUHJpbWl0aXZlU2V0PEh5YnJpZERlY3J5cHQ+KTpcbiAgICAgIEh5YnJpZERlY3J5cHQge1xuICAgIGlmICghaHlicmlkRGVjcnlwdFByaW1pdGl2ZVNldCkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdQcmltaXRpdmUgc2V0IGhhcyB0byBiZSBub24tbnVsbC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBXcmFwcGVkSHlicmlkRGVjcnlwdChoeWJyaWREZWNyeXB0UHJpbWl0aXZlU2V0KTtcbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHQoY2lwaGVydGV4dDogVWludDhBcnJheSwgb3B0X2NvbnRleHRJbmZvPzogVWludDhBcnJheSkge1xuICAgIGlmICghY2lwaGVydGV4dCkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdDaXBoZXJ0ZXh0IGhhcyB0byBiZSBub24tbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKGNpcGhlcnRleHQubGVuZ3RoID4gQ3J5cHRvRm9ybWF0Lk5PTl9SQVdfUFJFRklYX1NJWkUpIHtcbiAgICAgIGNvbnN0IGtleUlkID0gY2lwaGVydGV4dC5zdWJhcnJheSgwLCBDcnlwdG9Gb3JtYXQuTk9OX1JBV19QUkVGSVhfU0laRSk7XG4gICAgICBjb25zdCBwcmltaXRpdmVzID1cbiAgICAgICAgICBhd2FpdCB0aGlzLmh5YnJpZERlY3J5cHRQcmltaXRpdmVTZXQuZ2V0UHJpbWl0aXZlcyhrZXlJZCk7XG4gICAgICBjb25zdCByYXdDaXBoZXJ0ZXh0ID0gY2lwaGVydGV4dC5zdWJhcnJheShcbiAgICAgICAgICBDcnlwdG9Gb3JtYXQuTk9OX1JBV19QUkVGSVhfU0laRSwgY2lwaGVydGV4dC5sZW5ndGgpO1xuICAgICAgbGV0IGRlY3J5cHRlZFRleHQ6IFVpbnQ4QXJyYXl8dW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMudHJ5RGVjcnlwdGlvbihcbiAgICAgICAgICAgIHByaW1pdGl2ZXMsIHJhd0NpcGhlcnRleHQsIG9wdF9jb250ZXh0SW5mbyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICB9XG4gICAgICBpZiAoZGVjcnlwdGVkVGV4dCkge1xuICAgICAgICByZXR1cm4gZGVjcnlwdGVkVGV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJpbWl0aXZlcyA9IGF3YWl0IHRoaXMuaHlicmlkRGVjcnlwdFByaW1pdGl2ZVNldC5nZXRSYXdQcmltaXRpdmVzKCk7XG4gICAgcmV0dXJuIHRoaXMudHJ5RGVjcnlwdGlvbihwcmltaXRpdmVzLCBjaXBoZXJ0ZXh0LCBvcHRfY29udGV4dEluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIGRlY3J5cHQgdGhlIGNpcGhlcnRleHQgdXNpbmcgZWFjaCBlbnRyeSBpbiBwcmltaXRpdmVzIGFuZFxuICAgKiByZXR1cm5zIHRoZSBjaXBoZXJ0ZXh0IGRlY3J5cHRlZCBieSBmaXJzdCBwcmltaXRpdmUgd2hpY2ggc3VjY2VlZC4gSXRcbiAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBubyBlbnRyeSBzdWNjZWVkcy5cbiAgICpcbiAgICpcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdHJ5RGVjcnlwdGlvbihcbiAgICAgIHByaW1pdGl2ZXM6IEFycmF5PFByaW1pdGl2ZVNldC5FbnRyeTxIeWJyaWREZWNyeXB0Pj4sXG4gICAgICBjaXBoZXJ0ZXh0OiBVaW50OEFycmF5LFxuICAgICAgb3B0X2NvbnRleHRJbmZvPzogVWludDhBcnJheXxudWxsKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgcHJpbWl0aXZlc0xlbmd0aCA9IHByaW1pdGl2ZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJpbWl0aXZlc0xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJpbWl0aXZlc1tpXS5nZXRLZXlTdGF0dXMoKSAhPSBQYktleVN0YXR1c1R5cGUuRU5BQkxFRCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByaW1pdGl2ZSA9IHByaW1pdGl2ZXNbaV0uZ2V0UHJpbWl0aXZlKCk7XG4gICAgICBsZXQgZGVjcnlwdGlvblJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlY3J5cHRpb25SZXN1bHQgPSBhd2FpdCBwcmltaXRpdmUuZGVjcnlwdChjaXBoZXJ0ZXh0LCBvcHRfY29udGV4dEluZm8pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWNyeXB0aW9uUmVzdWx0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0RlY3J5cHRpb24gZmFpbGVkIGZvciB0aGUgZ2l2ZW4gY2lwaGVydGV4dC4nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSHlicmlkRGVjcnlwdFdyYXBwZXIgaW1wbGVtZW50cyBQcmltaXRpdmVXcmFwcGVyPEh5YnJpZERlY3J5cHQ+IHtcbiAgLyoqXG4gICAqL1xuICB3cmFwKHByaW1pdGl2ZVNldDogUHJpbWl0aXZlU2V0LlByaW1pdGl2ZVNldDxIeWJyaWREZWNyeXB0Pikge1xuICAgIHJldHVybiBXcmFwcGVkSHlicmlkRGVjcnlwdC5uZXdIeWJyaWREZWNyeXB0KHByaW1pdGl2ZVNldCk7XG4gIH1cblxuICAvKipcbiAgICovXG4gIGdldFByaW1pdGl2ZVR5cGUoKSB7XG4gICAgcmV0dXJuIEh5YnJpZERlY3J5cHQ7XG4gIH1cbn1cbiJdfQ==