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