UNPKG

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
/** * @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==