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.

129 lines 14.8 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 * as Registry from '../internal/registry'; import { Aead } from './internal/aead'; /** * @final */ class WrappedAead extends Aead { // The constructor should be @private, but it is not supported by Closure // (see https://github.com/google/closure-compiler/issues/2761). constructor(aeadSet) { super(); this.aeadSet = aeadSet; } static newAead(aeadSet) { if (!aeadSet) { throw new SecurityException('Primitive set has to be non-null.'); } if (!aeadSet.getPrimary()) { throw new SecurityException('Primary has to be non-null.'); } return new WrappedAead(aeadSet); } /** */ encrypt(plaintext, opt_associatedData) { return __awaiter(this, void 0, void 0, function* () { if (!plaintext) { throw new SecurityException('Plaintext has to be non-null.'); } const primary = this.aeadSet.getPrimary(); if (!primary) { throw new SecurityException('Primary has to be non-null.'); } const primitive = primary.getPrimitive(); const encryptedText = yield primitive.encrypt(plaintext, opt_associatedData); const keyId = primary.getIdentifier(); const ciphertext = new Uint8Array(keyId.length + encryptedText.length); ciphertext.set(keyId, 0); ciphertext.set(encryptedText, keyId.length); return ciphertext; }); } /** */ decrypt(ciphertext, opt_associatedData) { 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 entries = yield this.aeadSet.getPrimitives(keyId); const rawCiphertext = ciphertext.subarray(CryptoFormat.NON_RAW_PREFIX_SIZE, ciphertext.length); let decryptedText; try { decryptedText = yield this.tryDecryption(entries, rawCiphertext, opt_associatedData); } catch (e) { } if (decryptedText) { return decryptedText; } } const entries = yield this.aeadSet.getRawPrimitives(); const decryptedText = yield this.tryDecryption(entries, ciphertext, opt_associatedData); return decryptedText; }); } /** * Tries to decrypt the ciphertext using each entry in entriesArray and * returns the ciphertext decrypted by first primitive which succeed. It * throws an exception if no entry succeeds. * * */ tryDecryption(entriesArray, ciphertext, opt_associatedData) { return __awaiter(this, void 0, void 0, function* () { const entriesArrayLength = entriesArray.length; for (let i = 0; i < entriesArrayLength; i++) { if (entriesArray[i].getKeyStatus() != PbKeyStatusType.ENABLED) { continue; } const primitive = entriesArray[i].getPrimitive(); let decryptionResult; try { decryptionResult = yield primitive.decrypt(ciphertext, opt_associatedData); } catch (e) { continue; } return decryptionResult; } throw new SecurityException('Decryption failed for the given ciphertext.'); }); } } export class AeadWrapper { /** */ wrap(primitiveSet) { return WrappedAead.newAead(primitiveSet); } /** */ getPrimitiveType() { return Aead; } static register() { Registry.registerPrimitiveWrapper(new AeadWrapper()); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWVhZF93cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYWVhZC9hZWFkX3dyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRzs7Ozs7Ozs7OztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUd2RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUdqRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFckM7O0dBRUc7QUFDSCxNQUFNLFdBQVksU0FBUSxJQUFJO0lBQzVCLHlFQUF5RTtJQUN6RSxnRUFBZ0U7SUFDaEUsWUFBNkIsT0FBd0M7UUFDbkUsS0FBSyxFQUFFLENBQUM7UUFEbUIsWUFBTyxHQUFQLE9BQU8sQ0FBaUM7SUFFckUsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBd0M7UUFDckQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN6QixNQUFNLElBQUksaUJBQWlCLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUM1RDtRQUNELE9BQU8sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEO09BQ0c7SUFDRyxPQUFPLENBQUMsU0FBcUIsRUFBRSxrQkFBb0M7O1lBRXZFLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLGlCQUFpQixDQUFDLCtCQUErQixDQUFDLENBQUM7YUFDOUQ7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FB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QjtZQUNELE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7S0FBQTtDQUNGO0FBRUQsTUFBTSxPQUFPLFdBQVc7SUFDdEI7T0FDRztJQUNILElBQUksQ0FBQyxZQUE2QztRQUNoRCxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEO09BQ0c7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUTtRQUNiLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQge1NlY3VyaXR5RXhjZXB0aW9ufSBmcm9tICcuLi9leGNlcHRpb24vc2VjdXJpdHlfZXhjZXB0aW9uJztcbmltcG9ydCB7Q3J5cHRvRm9ybWF0fSBmcm9tICcuLi9pbnRlcm5hbC9jcnlwdG9fZm9ybWF0JztcbmltcG9ydCAqIGFzIFByaW1pdGl2ZVNldCBmcm9tICcuLi9pbnRlcm5hbC9wcmltaXRpdmVfc2V0JztcbmltcG9ydCB7UHJpbWl0aXZlV3JhcHBlcn0gZnJvbSAnLi4vaW50ZXJuYWwvcHJpbWl0aXZlX3dyYXBwZXInO1xuaW1wb3J0IHtQYktleVN0YXR1c1R5cGV9IGZyb20gJy4uL2ludGVybmFsL3Byb3RvJztcbmltcG9ydCAqIGFzIFJlZ2lzdHJ5IGZyb20gJy4uL2ludGVybmFsL3JlZ2lzdHJ5JztcbmltcG9ydCB7Q29uc3RydWN0b3J9IGZyb20gJy4uL2ludGVybmFsL3V0aWwnO1xuXG5pbXBvcnQge0FlYWR9IGZyb20gJy4vaW50ZXJuYWwvYWVhZCc7XG5cbi8qKlxuICogQGZpbmFsXG4gKi9cbmNsYXNzIFdyYXBwZWRBZWFkIGV4dGVuZHMgQWVhZCB7XG4gIC8vIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgQHByaXZhdGUsIGJ1dCBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IENsb3N1cmVcbiAgLy8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzI3NjEpLlxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFlYWRTZXQ6IFByaW1pdGl2ZVNldC5QcmltaXRpdmVTZXQ8QWVhZD4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3RhdGljIG5ld0FlYWQoYWVhZFNldDogUHJpbWl0aXZlU2V0LlByaW1pdGl2ZVNldDxBZWFkPik6IEFlYWQge1xuICAgIGlmICghYWVhZFNldCkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdQcmltaXRpdmUgc2V0IGhhcyB0byBiZSBub24tbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCFhZWFkU2V0LmdldFByaW1hcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdQcmltYXJ5IGhhcyB0byBiZSBub24tbnVsbC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBXcmFwcGVkQWVhZChhZWFkU2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgYXN5bmMgZW5jcnlwdChwbGFpbnRleHQ6IFVpbnQ4QXJyYXksIG9wdF9hc3NvY2lhdGVkRGF0YT86IFVpbnQ4QXJyYXl8bnVsbCk6XG4gICAgICBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBpZiAoIXBsYWludGV4dCkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdQbGFpbnRleHQgaGFzIHRvIGJlIG5vbi1udWxsLicpO1xuICAgIH1cbiAgICBjb25zdCBwcmltYXJ5ID0gdGhpcy5hZWFkU2V0LmdldFByaW1hcnkoKVxuICAgIGlmICghcHJpbWFyeSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdQcmltYXJ5IGhhcyB0byBiZSBub24tbnVsbC4nKTtcbiAgICB9XG4gICAgY29uc3QgcHJpbWl0aXZlID0gcHJpbWFyeS5nZXRQcmltaXRpdmUoKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRUZXh0ID1cbiAgICAgICAgYXdhaXQgcHJpbWl0aXZlLmVuY3J5cHQocGxhaW50ZXh0LCBvcHRfYXNzb2NpYXRlZERhdGEpO1xuICAgIGNvbnN0IGtleUlkID0gcHJpbWFyeS5nZXRJZGVudGlmaWVyKCk7XG4gICAgY29uc3QgY2lwaGVydGV4dCA9IG5ldyBVaW50OEFycmF5KGtleUlkLmxlbmd0aCArIGVuY3J5cHRlZFRleHQubGVuZ3RoKTtcbiAgICBjaXBoZXJ0ZXh0LnNldChrZXlJZCwgMCk7XG4gICAgY2lwaGVydGV4dC5zZXQoZW5jcnlwdGVkVGV4dCwga2V5SWQubGVuZ3RoKTtcbiAgICByZXR1cm4gY2lwaGVydGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgYXN5bmMgZGVjcnlwdChjaXBoZXJ0ZXh0OiBVaW50OEFycmF5LCBvcHRfYXNzb2NpYXRlZERhdGE/OiBVaW50OEFycmF5fG51bGwpOlxuICAgICAgUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgaWYgKCFjaXBoZXJ0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0NpcGhlcnRleHQgaGFzIHRvIGJlIG5vbi1udWxsLicpO1xuICAgIH1cbiAgICBpZiAoY2lwaGVydGV4dC5sZW5ndGggPiBDcnlwdG9Gb3JtYXQuTk9OX1JBV19QUkVGSVhfU0laRSkge1xuICAgICAgY29uc3Qga2V5SWQgPSBjaXBoZXJ0ZXh0LnN1YmFycmF5KDAsIENyeXB0b0Zvcm1hdC5OT05fUkFXX1BSRUZJWF9TSVpFKTtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmFlYWRTZXQuZ2V0UHJpbWl0aXZlcyhrZXlJZCk7XG4gICAgICBjb25zdCByYXdDaXBoZXJ0ZXh0ID0gY2lwaGVydGV4dC5zdWJhcnJheShcbiAgICAgICAgICBDcnlwdG9Gb3JtYXQuTk9OX1JBV19QUkVGSVhfU0laRSwgY2lwaGVydGV4dC5sZW5ndGgpO1xuICAgICAgbGV0IGRlY3J5cHRlZFRleHQ6IFVpbnQ4QXJyYXl8dW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVjcnlwdGVkVGV4dCA9IGF3YWl0IHRoaXMudHJ5RGVjcnlwdGlvbihcbiAgICAgICAgICAgIGVudHJpZXMsIHJhd0NpcGhlcnRleHQsIG9wdF9hc3NvY2lhdGVkRGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICB9XG4gICAgICBpZiAoZGVjcnlwdGVkVGV4dCkge1xuICAgICAgICByZXR1cm4gZGVjcnlwdGVkVGV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuYWVhZFNldC5nZXRSYXdQcmltaXRpdmVzKCk7XG4gICAgY29uc3QgZGVjcnlwdGVkVGV4dCA9XG4gICAgICAgIGF3YWl0IHRoaXMudHJ5RGVjcnlwdGlvbihlbnRyaWVzLCBjaXBoZXJ0ZXh0LCBvcHRfYXNzb2NpYXRlZERhdGEpO1xuICAgIHJldHVybiBkZWNyeXB0ZWRUZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIGRlY3J5cHQgdGhlIGNpcGhlcnRleHQgdXNpbmcgZWFjaCBlbnRyeSBpbiBlbnRyaWVzQXJyYXkgYW5kXG4gICAqIHJldHVybnMgdGhlIGNpcGhlcnRleHQgZGVjcnlwdGVkIGJ5IGZpcnN0IHByaW1pdGl2ZSB3aGljaCBzdWNjZWVkLiBJdFxuICAgKiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIG5vIGVudHJ5IHN1Y2NlZWRzLlxuICAgKlxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cnlEZWNyeXB0aW9uKFxuICAgICAgZW50cmllc0FycmF5OiBBcnJheTxQcmltaXRpdmVTZXQuRW50cnk8QWVhZD4+LCBjaXBoZXJ0ZXh0OiBVaW50OEFycmF5LFxuICAgICAgb3B0X2Fzc29jaWF0ZWREYXRhPzogVWludDhBcnJheXxudWxsKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgZW50cmllc0FycmF5TGVuZ3RoID0gZW50cmllc0FycmF5Lmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXNBcnJheUxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZW50cmllc0FycmF5W2ldLmdldEtleVN0YXR1cygpICE9IFBiS2V5U3RhdHVzVHlwZS5FTkFCTEVEKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJpbWl0aXZlID0gZW50cmllc0FycmF5W2ldLmdldFByaW1pdGl2ZSgpO1xuICAgICAgbGV0IGRlY3J5cHRpb25SZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICBkZWNyeXB0aW9uUmVzdWx0ID1cbiAgICAgICAgICAgIGF3YWl0IHByaW1pdGl2ZS5kZWNyeXB0KGNpcGhlcnRleHQsIG9wdF9hc3NvY2lhdGVkRGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlY3J5cHRpb25SZXN1bHQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignRGVjcnlwdGlvbiBmYWlsZWQgZm9yIHRoZSBnaXZlbiBjaXBoZXJ0ZXh0LicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBZWFkV3JhcHBlciBpbXBsZW1lbnRzIFByaW1pdGl2ZVdyYXBwZXI8QWVhZD4ge1xuICAvKipcbiAgICovXG4gIHdyYXAocHJpbWl0aXZlU2V0OiBQcmltaXRpdmVTZXQuUHJpbWl0aXZlU2V0PEFlYWQ+KTogQWVhZCB7XG4gICAgcmV0dXJuIFdyYXBwZWRBZWFkLm5ld0FlYWQocHJpbWl0aXZlU2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgZ2V0UHJpbWl0aXZlVHlwZSgpOiBDb25zdHJ1Y3RvcjxBZWFkPiB7XG4gICAgcmV0dXJuIEFlYWQ7XG4gIH1cblxuICBzdGF0aWMgcmVnaXN0ZXIoKSB7XG4gICAgUmVnaXN0cnkucmVnaXN0ZXJQcmltaXRpdmVXcmFwcGVyKG5ldyBBZWFkV3JhcHBlcigpKTtcbiAgfVxufVxuIl19