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.

78 lines 10.5 kB
/** * @license * Copyright 2023 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 { InvalidArgumentsException } from '../../../exception/invalid_arguments_exception'; import { bytesAsU8 } from '../../../internal/proto_shims'; import * as bytes from '../../../subtle/bytes'; import { HybridEncrypt } from '../hybrid_encrypt'; import * as hpkeContext from './hpke_context'; import { HpkePrimitiveFactory } from './hpke_primitive_factory'; /** * Hybrid Public Key Encryption (HPKE) encryption. * * @final */ export class HpkeEncrypt extends HybridEncrypt { constructor(recipientPublicKey, kem, kdf, aead) { super(); if (!recipientPublicKey) { throw new InvalidArgumentsException('Recipient public key must be non-null.'); } if (!kem) { throw new InvalidArgumentsException('KEM algorithm must be non-null.'); } if (!kdf) { throw new InvalidArgumentsException('KDF algorithm must be non-null.'); } if (!aead) { throw new InvalidArgumentsException('AEAD algorithm must be non-null.'); } this.recipientPublicKey = recipientPublicKey; this.kem = kem; this.kdf = kdf; this.aead = aead; } /** * Returns an HPKE encryption primitive created from a given * recipient public key. */ static createHpkeEncrypt(recipientPublicKey) { return __awaiter(this, void 0, void 0, function* () { if (bytesAsU8(recipientPublicKey.getPublicKey()).length === 0) { throw new InvalidArgumentsException('Recipient public key is empty.'); } const params = recipientPublicKey.getParams(); if (!params) { throw new InvalidArgumentsException('Public key is missing params field.'); } const kem = HpkePrimitiveFactory.createKemFromParams(params); const kdf = HpkePrimitiveFactory.createKdfFromParams(params); const aead = HpkePrimitiveFactory.createAeadFromParams(params); return new HpkeEncrypt(recipientPublicKey, kem, kdf, aead); }); } encrypt(plaintext, contextInfo) { return __awaiter(this, void 0, void 0, function* () { if (!contextInfo) { contextInfo = new Uint8Array(0); } const recipientPublicKeyBytes = bytesAsU8(this.recipientPublicKey.getPublicKey()); const context = yield hpkeContext.createSenderContext(recipientPublicKeyBytes, this.kem, this.kdf, this.aead, contextInfo); const ciphertext = yield context.seal(plaintext, HpkeEncrypt.EMPTY_ASSOCIATED_DATA); return bytes.concat(context.getEncapsulatedKey(), ciphertext); }); } } HpkeEncrypt.EMPTY_ASSOCIATED_DATA = new Uint8Array(0); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHBrZV9lbmNyeXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vaHlicmlkL2ludGVybmFsL2hwa2UvaHBrZV9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUV6RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEtBQUssTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxLQUFLLFdBQVcsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUU5RDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFdBQVksU0FBUSxhQUFhO0lBUTVDLFlBQ0ksa0JBQW1DLEVBQUUsR0FBWSxFQUFFLEdBQVksRUFDL0QsSUFBYztRQUNoQixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN2QixNQUFNLElBQUkseUJBQXlCLENBQy9CLHdDQUF3QyxDQUFDLENBQUM7U0FDL0M7UUFDRCxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLHlCQUF5QixDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDeEU7UUFDRCxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLHlCQUF5QixDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDeEU7UUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLHlCQUF5QixDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDekU7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQU8saUJBQWlCLENBQUMsa0JBQW1DOztZQUNoRSxJQUFJLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzdELE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2FBQ3ZFO1lBQ0QsTUFBTSxNQUFNLEdBQTJCLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsTUFBTSxJQUFJLHlCQUF5QixDQUMvQixxQ0FBcUMsQ0FBQyxDQUFDO2FBQzVDO1lBRUQsTUFBTSxHQUFHLEdBQVksb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEUsTUFBTSxHQUFHLEdBQVksb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEUsTUFBTSxJQUFJLEdBQWEsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdELENBQUM7S0FBQTtJQUVLLE9BQU8sQ0FBQyxTQUFxQixFQUFFLFdBQXdCOztZQUMzRCxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNoQixXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakM7WUFFRCxNQUFNLHVCQUF1QixHQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxXQUFXLENBQUMsbUJBQW1CLENBQ2pELHVCQUF1QixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sVUFBVSxHQUNaLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDckUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7S0FBQTs7QUEvRHVCLGlDQUFxQixHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQge0ludmFsaWRBcmd1bWVudHNFeGNlcHRpb259IGZyb20gJy4uLy4uLy4uL2V4Y2VwdGlvbi9pbnZhbGlkX2FyZ3VtZW50c19leGNlcHRpb24nO1xuaW1wb3J0IHtQYkhwa2VQYXJhbXMsIFBiSHBrZVB1YmxpY0tleX0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvcHJvdG8nO1xuaW1wb3J0IHtieXRlc0FzVTh9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3Byb3RvX3NoaW1zJztcbmltcG9ydCAqIGFzIGJ5dGVzIGZyb20gJy4uLy4uLy4uL3N1YnRsZS9ieXRlcyc7XG5pbXBvcnQge0h5YnJpZEVuY3J5cHR9IGZyb20gJy4uL2h5YnJpZF9lbmNyeXB0JztcblxuaW1wb3J0IHtIcGtlQWVhZH0gZnJvbSAnLi9ocGtlX2FlYWQnO1xuaW1wb3J0ICogYXMgaHBrZUNvbnRleHQgZnJvbSAnLi9ocGtlX2NvbnRleHQnO1xuaW1wb3J0IHtIcGtlS2RmfSBmcm9tICcuL2hwa2Vfa2RmJztcbmltcG9ydCB7SHBrZUtlbX0gZnJvbSAnLi9ocGtlX2tlbSc7XG5pbXBvcnQge0hwa2VQcmltaXRpdmVGYWN0b3J5fSBmcm9tICcuL2hwa2VfcHJpbWl0aXZlX2ZhY3RvcnknO1xuXG4vKipcbiAqIEh5YnJpZCBQdWJsaWMgS2V5IEVuY3J5cHRpb24gKEhQS0UpIGVuY3J5cHRpb24uXG4gKlxuICogQGZpbmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBIcGtlRW5jcnlwdCBleHRlbmRzIEh5YnJpZEVuY3J5cHQge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFTVBUWV9BU1NPQ0lBVEVEX0RBVEEgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlY2lwaWVudFB1YmxpY0tleTogUGJIcGtlUHVibGljS2V5O1xuICBwcml2YXRlIHJlYWRvbmx5IGtlbTogSHBrZUtlbTtcbiAgcHJpdmF0ZSByZWFkb25seSBrZGY6IEhwa2VLZGY7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWVhZDogSHBrZUFlYWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICByZWNpcGllbnRQdWJsaWNLZXk6IFBiSHBrZVB1YmxpY0tleSwga2VtOiBIcGtlS2VtLCBrZGY6IEhwa2VLZGYsXG4gICAgICBhZWFkOiBIcGtlQWVhZCkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCFyZWNpcGllbnRQdWJsaWNLZXkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uKFxuICAgICAgICAgICdSZWNpcGllbnQgcHVibGljIGtleSBtdXN0IGJlIG5vbi1udWxsLicpO1xuICAgIH1cbiAgICBpZiAoIWtlbSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNFeGNlcHRpb24oJ0tFTSBhbGdvcml0aG0gbXVzdCBiZSBub24tbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCFrZGYpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uKCdLREYgYWxnb3JpdGhtIG11c3QgYmUgbm9uLW51bGwuJyk7XG4gICAgfVxuICAgIGlmICghYWVhZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNFeGNlcHRpb24oJ0FFQUQgYWxnb3JpdGhtIG11c3QgYmUgbm9uLW51bGwuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWNpcGllbnRQdWJsaWNLZXkgPSByZWNpcGllbnRQdWJsaWNLZXk7XG4gICAgdGhpcy5rZW0gPSBrZW07XG4gICAgdGhpcy5rZGYgPSBrZGY7XG4gICAgdGhpcy5hZWFkID0gYWVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIEhQS0UgZW5jcnlwdGlvbiBwcmltaXRpdmUgY3JlYXRlZCBmcm9tIGEgZ2l2ZW5cbiAgICogcmVjaXBpZW50IHB1YmxpYyBrZXkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlSHBrZUVuY3J5cHQocmVjaXBpZW50UHVibGljS2V5OiBQYkhwa2VQdWJsaWNLZXkpIHtcbiAgICBpZiAoYnl0ZXNBc1U4KHJlY2lwaWVudFB1YmxpY0tleS5nZXRQdWJsaWNLZXkoKSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbignUmVjaXBpZW50IHB1YmxpYyBrZXkgaXMgZW1wdHkuJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtczogUGJIcGtlUGFyYW1zfHVuZGVmaW5lZCA9IHJlY2lwaWVudFB1YmxpY0tleS5nZXRQYXJhbXMoKTtcbiAgICBpZiAoIXBhcmFtcykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNFeGNlcHRpb24oXG4gICAgICAgICAgJ1B1YmxpYyBrZXkgaXMgbWlzc2luZyBwYXJhbXMgZmllbGQuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2VtOiBIcGtlS2VtID0gSHBrZVByaW1pdGl2ZUZhY3RvcnkuY3JlYXRlS2VtRnJvbVBhcmFtcyhwYXJhbXMpO1xuICAgIGNvbnN0IGtkZjogSHBrZUtkZiA9IEhwa2VQcmltaXRpdmVGYWN0b3J5LmNyZWF0ZUtkZkZyb21QYXJhbXMocGFyYW1zKTtcbiAgICBjb25zdCBhZWFkOiBIcGtlQWVhZCA9IEhwa2VQcmltaXRpdmVGYWN0b3J5LmNyZWF0ZUFlYWRGcm9tUGFyYW1zKHBhcmFtcyk7XG4gICAgcmV0dXJuIG5ldyBIcGtlRW5jcnlwdChyZWNpcGllbnRQdWJsaWNLZXksIGtlbSwga2RmLCBhZWFkKTtcbiAgfVxuXG4gIGFzeW5jIGVuY3J5cHQocGxhaW50ZXh0OiBVaW50OEFycmF5LCBjb250ZXh0SW5mbz86IFVpbnQ4QXJyYXkpIHtcbiAgICBpZiAoIWNvbnRleHRJbmZvKSB7XG4gICAgICBjb250ZXh0SW5mbyA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudFB1YmxpY0tleUJ5dGVzID1cbiAgICAgICAgYnl0ZXNBc1U4KHRoaXMucmVjaXBpZW50UHVibGljS2V5LmdldFB1YmxpY0tleSgpKTtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgaHBrZUNvbnRleHQuY3JlYXRlU2VuZGVyQ29udGV4dChcbiAgICAgICAgcmVjaXBpZW50UHVibGljS2V5Qnl0ZXMsIHRoaXMua2VtLCB0aGlzLmtkZiwgdGhpcy5hZWFkLCBjb250ZXh0SW5mbyk7XG4gICAgY29uc3QgY2lwaGVydGV4dCA9XG4gICAgICAgIGF3YWl0IGNvbnRleHQuc2VhbChwbGFpbnRleHQsIEhwa2VFbmNyeXB0LkVNUFRZX0FTU09DSUFURURfREFUQSk7XG4gICAgcmV0dXJuIGJ5dGVzLmNvbmNhdChjb250ZXh0LmdldEVuY2Fwc3VsYXRlZEtleSgpLCBjaXBoZXJ0ZXh0KTtcbiAgfVxufVxuIl19