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.

69 lines 8.92 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 * as Bytes from './bytes'; import * as EllipticCurves from './elliptic_curves'; import * as Hkdf from './hkdf'; /** * HKDF-based ECIES-KEM (key encapsulation mechanism) for ECIES recipient. */ export class EciesHkdfKemRecipient { constructor(privateKey) { if (!privateKey) { throw new SecurityException('Private key has to be non-null.'); } // CryptoKey should have the properties type and algorithm. if (privateKey.type !== 'private' || !privateKey.algorithm) { throw new SecurityException('Expected crypto key of type: private.'); } this.privateKey_ = privateKey; } /** * @param kemToken the public ephemeral point. * @param keySizeInBytes The length of the generated pseudorandom * string in bytes. The maximal size is 255 * DigestSize, where DigestSize * is the size of the underlying HMAC. * @param pointFormat The format of the * public ephemeral point. * @param hkdfHash the name of the hash function. Accepted names are * SHA-1, SHA-256 and SHA-512. * @param hkdfInfo Context and application specific * information (can be a zero-length array). * @param opt_hkdfSalt Salt value (a non-secret random * value). If not provided, it is set to a string of hash length zeros. * @return The KEM key and token. */ decapsulate(kemToken, keySizeInBytes, pointFormat, hkdfHash, hkdfInfo, opt_hkdfSalt) { return __awaiter(this, void 0, void 0, function* () { const { namedCurve } = this.privateKey_.algorithm; if (!namedCurve) { throw new SecurityException('Curve has to be defined.'); } const jwk = EllipticCurves.pointDecode(namedCurve, pointFormat, kemToken); const publicKey = yield EllipticCurves.importPublicKey('ECDH', jwk); const sharedSecret = yield EllipticCurves.computeEcdhSharedSecret(this.privateKey_, publicKey); const hkdfIkm = Bytes.concat(kemToken, sharedSecret); const kemKey = yield Hkdf.compute(keySizeInBytes, hkdfHash, hkdfIkm, hkdfInfo, opt_hkdfSalt); return kemKey; }); } } export function fromJsonWebKey(jwk) { return __awaiter(this, void 0, void 0, function* () { const privateKey = yield EllipticCurves.importPrivateKey('ECDH', jwk); return new EciesHkdfKemRecipient(privateKey); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNpZXNfaGtkZl9rZW1fcmVjaXBpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3VidGxlL2VjaWVzX2hrZGZfa2VtX3JlY2lwaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHOzs7Ozs7Ozs7O0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxLQUFLLEtBQUssTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxLQUFLLGNBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUUvQjs7R0FFRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFHaEMsWUFBWSxVQUFxQjtRQUMvQixJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsTUFBTSxJQUFJLGlCQUFpQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDaEU7UUFFRCwyREFBMkQ7UUFDM0QsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7WUFDMUQsTUFBTSxJQUFJLGlCQUFpQixDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDdEU7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDRyxXQUFXLENBQ2IsUUFBb0IsRUFBRSxjQUFzQixFQUM1QyxXQUEyQyxFQUFFLFFBQWdCLEVBQzdELFFBQW9CLEVBQUUsWUFBeUI7O1lBQ2pELE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBNEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7WUFDekUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDZixNQUFNLElBQUksaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsQ0FBQzthQUN6RDtZQUNELE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxRSxNQUFNLFNBQVMsR0FBRyxNQUFNLGNBQWMsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sWUFBWSxHQUFHLE1BQU0sY0FBYyxDQUFDLHVCQUF1QixDQUM3RCxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3JELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FDN0IsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9ELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FBQTtDQUNGO0FBRUQsTUFBTSxVQUFnQixjQUFjLENBQUMsR0FBZTs7UUFFbEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxjQUFjLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7U2VjdXJpdHlFeGNlcHRpb259IGZyb20gJy4uL2V4Y2VwdGlvbi9zZWN1cml0eV9leGNlcHRpb24nO1xuXG5pbXBvcnQgKiBhcyBCeXRlcyBmcm9tICcuL2J5dGVzJztcbmltcG9ydCAqIGFzIEVsbGlwdGljQ3VydmVzIGZyb20gJy4vZWxsaXB0aWNfY3VydmVzJztcbmltcG9ydCAqIGFzIEhrZGYgZnJvbSAnLi9oa2RmJztcblxuLyoqXG4gKiBIS0RGLWJhc2VkIEVDSUVTLUtFTSAoa2V5IGVuY2Fwc3VsYXRpb24gbWVjaGFuaXNtKSBmb3IgRUNJRVMgcmVjaXBpZW50LlxuICovXG5leHBvcnQgY2xhc3MgRWNpZXNIa2RmS2VtUmVjaXBpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcml2YXRlS2V5XzogQ3J5cHRvS2V5O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGVLZXk6IENyeXB0b0tleSkge1xuICAgIGlmICghcHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdQcml2YXRlIGtleSBoYXMgdG8gYmUgbm9uLW51bGwuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3J5cHRvS2V5IHNob3VsZCBoYXZlIHRoZSBwcm9wZXJ0aWVzIHR5cGUgYW5kIGFsZ29yaXRobS5cbiAgICBpZiAocHJpdmF0ZUtleS50eXBlICE9PSAncHJpdmF0ZScgfHwgIXByaXZhdGVLZXkuYWxnb3JpdGhtKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0V4cGVjdGVkIGNyeXB0byBrZXkgb2YgdHlwZTogcHJpdmF0ZS4nKTtcbiAgICB9XG4gICAgdGhpcy5wcml2YXRlS2V5XyA9IHByaXZhdGVLZXk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGtlbVRva2VuIHRoZSBwdWJsaWMgZXBoZW1lcmFsIHBvaW50LlxuICAgKiBAcGFyYW0ga2V5U2l6ZUluQnl0ZXMgVGhlIGxlbmd0aCBvZiB0aGUgZ2VuZXJhdGVkIHBzZXVkb3JhbmRvbVxuICAgKiAgICAgc3RyaW5nIGluIGJ5dGVzLiBUaGUgbWF4aW1hbCBzaXplIGlzIDI1NSAqIERpZ2VzdFNpemUsIHdoZXJlIERpZ2VzdFNpemVcbiAgICogICAgIGlzIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIEhNQUMuXG4gICAqIEBwYXJhbSBwb2ludEZvcm1hdCBUaGUgZm9ybWF0IG9mIHRoZVxuICAgKiAgICAgcHVibGljIGVwaGVtZXJhbCBwb2ludC5cbiAgICogQHBhcmFtIGhrZGZIYXNoIHRoZSBuYW1lIG9mIHRoZSBoYXNoIGZ1bmN0aW9uLiBBY2NlcHRlZCBuYW1lcyBhcmVcbiAgICogICAgIFNIQS0xLCBTSEEtMjU2IGFuZCBTSEEtNTEyLlxuICAgKiBAcGFyYW0gaGtkZkluZm8gQ29udGV4dCBhbmQgYXBwbGljYXRpb24gc3BlY2lmaWNcbiAgICogICAgIGluZm9ybWF0aW9uIChjYW4gYmUgYSB6ZXJvLWxlbmd0aCBhcnJheSkuXG4gICAqIEBwYXJhbSBvcHRfaGtkZlNhbHQgU2FsdCB2YWx1ZSAoYSBub24tc2VjcmV0IHJhbmRvbVxuICAgKiAgICAgdmFsdWUpLiBJZiBub3QgcHJvdmlkZWQsIGl0IGlzIHNldCB0byBhIHN0cmluZyBvZiBoYXNoIGxlbmd0aCB6ZXJvcy5cbiAgICogQHJldHVybiBUaGUgS0VNIGtleSBhbmQgdG9rZW4uXG4gICAqL1xuICBhc3luYyBkZWNhcHN1bGF0ZShcbiAgICAgIGtlbVRva2VuOiBVaW50OEFycmF5LCBrZXlTaXplSW5CeXRlczogbnVtYmVyLFxuICAgICAgcG9pbnRGb3JtYXQ6IEVsbGlwdGljQ3VydmVzLlBvaW50Rm9ybWF0VHlwZSwgaGtkZkhhc2g6IHN0cmluZyxcbiAgICAgIGhrZGZJbmZvOiBVaW50OEFycmF5LCBvcHRfaGtkZlNhbHQ/OiBVaW50OEFycmF5KTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3Qge25hbWVkQ3VydmV9OiBQYXJ0aWFsPEVjS2V5QWxnb3JpdGhtPiA9IHRoaXMucHJpdmF0ZUtleV8uYWxnb3JpdGhtO1xuICAgIGlmICghbmFtZWRDdXJ2ZSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdDdXJ2ZSBoYXMgdG8gYmUgZGVmaW5lZC4nKTtcbiAgICB9XG4gICAgY29uc3QgandrID0gRWxsaXB0aWNDdXJ2ZXMucG9pbnREZWNvZGUobmFtZWRDdXJ2ZSwgcG9pbnRGb3JtYXQsIGtlbVRva2VuKTtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBFbGxpcHRpY0N1cnZlcy5pbXBvcnRQdWJsaWNLZXkoJ0VDREgnLCBqd2spO1xuICAgIGNvbnN0IHNoYXJlZFNlY3JldCA9IGF3YWl0IEVsbGlwdGljQ3VydmVzLmNvbXB1dGVFY2RoU2hhcmVkU2VjcmV0KFxuICAgICAgICB0aGlzLnByaXZhdGVLZXlfLCBwdWJsaWNLZXkpO1xuICAgIGNvbnN0IGhrZGZJa20gPSBCeXRlcy5jb25jYXQoa2VtVG9rZW4sIHNoYXJlZFNlY3JldCk7XG4gICAgY29uc3Qga2VtS2V5ID0gYXdhaXQgSGtkZi5jb21wdXRlKFxuICAgICAgICBrZXlTaXplSW5CeXRlcywgaGtkZkhhc2gsIGhrZGZJa20sIGhrZGZJbmZvLCBvcHRfaGtkZlNhbHQpO1xuICAgIHJldHVybiBrZW1LZXk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZyb21Kc29uV2ViS2V5KGp3azogSnNvbldlYktleSk6XG4gICAgUHJvbWlzZTxFY2llc0hrZGZLZW1SZWNpcGllbnQ+IHtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IEVsbGlwdGljQ3VydmVzLmltcG9ydFByaXZhdGVLZXkoJ0VDREgnLCBqd2spO1xuICByZXR1cm4gbmV3IEVjaWVzSGtkZktlbVJlY2lwaWVudChwcml2YXRlS2V5KTtcbn1cbiJdfQ==