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.

74 lines 9.84 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 sender. */ export class EciesHkdfKemSender { constructor(recipientPublicKey) { if (!recipientPublicKey) { throw new SecurityException('Recipient public key has to be non-null.'); } // CryptoKey should have the properties type and algorithm. if (recipientPublicKey.type !== 'public' || !recipientPublicKey.algorithm) { throw new SecurityException('Expected Crypto key of type: public.'); } this.publicKey = recipientPublicKey; } /** * @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. */ encapsulate(keySizeInBytes, pointFormat, hkdfHash, hkdfInfo, opt_hkdfSalt) { return __awaiter(this, void 0, void 0, function* () { const { namedCurve } = this.publicKey.algorithm; if (!namedCurve) { throw new SecurityException('Curve has to be defined.'); } const ephemeralKeyPair = yield EllipticCurves.generateKeyPair('ECDH', namedCurve); const sharedSecret = yield EllipticCurves.computeEcdhSharedSecret(ephemeralKeyPair.privateKey, this.publicKey); const jwk = yield EllipticCurves.exportCryptoKey(ephemeralKeyPair.publicKey); const { crv } = jwk; if (!crv) { throw new SecurityException('Curve has to be defined.'); } const kemToken = EllipticCurves.pointEncode(crv, pointFormat, jwk); const hkdfIkm = Bytes.concat(kemToken, sharedSecret); const kemKey = yield Hkdf.compute(keySizeInBytes, hkdfHash, hkdfIkm, hkdfInfo, opt_hkdfSalt); return { 'key': kemKey, 'token': kemToken }; }); } } export function fromJsonWebKey(jwk) { return __awaiter(this, void 0, void 0, function* () { const publicKey = yield EllipticCurves.importPublicKey('ECDH', jwk); return new EciesHkdfKemSender(publicKey); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNpZXNfaGtkZl9rZW1fc2VuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3VidGxlL2VjaWVzX2hrZGZfa2VtX3NlbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHOzs7Ozs7Ozs7O0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxLQUFLLEtBQUssTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxLQUFLLGNBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUUvQjs7R0FFRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFBWSxrQkFBNkI7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQ3pFO1FBRUQsMkRBQTJEO1FBQzNELElBQUksa0JBQWtCLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRTtZQUN6RSxNQUFNLElBQUksaUJBQWlCLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNyRTtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsa0JBQWtCLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0csV0FBVyxDQUNiLGNBQXNCLEVBQUUsV0FBMkMsRUFDbkUsUUFBZ0IsRUFBRSxRQUFvQixFQUFFLFlBQXlCOztZQUVuRSxNQUFNLEVBQUMsVUFBVSxFQUFDLEdBQTRCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBCQUEwQixDQUFDLENBQUM7YUFDekQ7WUFDRCxNQUFNLGdCQUFnQixHQUNsQixNQUFNLGNBQWMsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLE1BQU0sY0FBYyxDQUFDLHVCQUF1QixDQUM3RCxnQkFBZ0IsQ0FBQyxVQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sR0FBRyxHQUNMLE1BQU0sY0FBYyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFVLENBQUMsQ0FBQztZQUN0RSxNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1IsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBCQUEwQixDQUFDLENBQUM7YUFDekQ7WUFDRCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUM3QixjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDL0QsT0FBTyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO1FBQzVDLENBQUM7S0FBQTtDQUNGO0FBRUQsTUFBTSxVQUFnQixjQUFjLENBQUMsR0FBZTs7UUFFbEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRSxPQUFPLElBQUksa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQge1NlY3VyaXR5RXhjZXB0aW9ufSBmcm9tICcuLi9leGNlcHRpb24vc2VjdXJpdHlfZXhjZXB0aW9uJztcblxuaW1wb3J0ICogYXMgQnl0ZXMgZnJvbSAnLi9ieXRlcyc7XG5pbXBvcnQgKiBhcyBFbGxpcHRpY0N1cnZlcyBmcm9tICcuL2VsbGlwdGljX2N1cnZlcyc7XG5pbXBvcnQgKiBhcyBIa2RmIGZyb20gJy4vaGtkZic7XG5cbi8qKlxuICogSEtERi1iYXNlZCBFQ0lFUy1LRU0gKGtleSBlbmNhcHN1bGF0aW9uIG1lY2hhbmlzbSkgZm9yIEVDSUVTIHNlbmRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVjaWVzSGtkZktlbVNlbmRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGljS2V5OiBDcnlwdG9LZXk7XG5cbiAgY29uc3RydWN0b3IocmVjaXBpZW50UHVibGljS2V5OiBDcnlwdG9LZXkpIHtcbiAgICBpZiAoIXJlY2lwaWVudFB1YmxpY0tleSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdSZWNpcGllbnQgcHVibGljIGtleSBoYXMgdG8gYmUgbm9uLW51bGwuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3J5cHRvS2V5IHNob3VsZCBoYXZlIHRoZSBwcm9wZXJ0aWVzIHR5cGUgYW5kIGFsZ29yaXRobS5cbiAgICBpZiAocmVjaXBpZW50UHVibGljS2V5LnR5cGUgIT09ICdwdWJsaWMnIHx8ICFyZWNpcGllbnRQdWJsaWNLZXkuYWxnb3JpdGhtKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0V4cGVjdGVkIENyeXB0byBrZXkgb2YgdHlwZTogcHVibGljLicpO1xuICAgIH1cbiAgICB0aGlzLnB1YmxpY0tleSA9IHJlY2lwaWVudFB1YmxpY0tleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ga2V5U2l6ZUluQnl0ZXMgVGhlIGxlbmd0aCBvZiB0aGUgZ2VuZXJhdGVkIHBzZXVkb3JhbmRvbVxuICAgKiAgICAgc3RyaW5nIGluIGJ5dGVzLiBUaGUgbWF4aW1hbCBzaXplIGlzIDI1NSAqIERpZ2VzdFNpemUsIHdoZXJlIERpZ2VzdFNpemVcbiAgICogICAgIGlzIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIEhNQUMuXG4gICAqIEBwYXJhbSBwb2ludEZvcm1hdCBUaGUgZm9ybWF0IG9mIHRoZVxuICAgKiAgICAgcHVibGljIGVwaGVtZXJhbCBwb2ludC5cbiAgICogQHBhcmFtIGhrZGZIYXNoIHRoZSBuYW1lIG9mIHRoZSBoYXNoIGZ1bmN0aW9uLiBBY2NlcHRlZCBuYW1lcyBhcmVcbiAgICogICAgIFNIQS0xLCBTSEEtMjU2IGFuZCBTSEEtNTEyLlxuICAgKiBAcGFyYW0gaGtkZkluZm8gQ29udGV4dCBhbmQgYXBwbGljYXRpb24gc3BlY2lmaWNcbiAgICogICAgIGluZm9ybWF0aW9uIChjYW4gYmUgYSB6ZXJvLWxlbmd0aCBhcnJheSkuXG4gICAqIEBwYXJhbSBvcHRfaGtkZlNhbHQgU2FsdCB2YWx1ZSAoYSBub24tc2VjcmV0IHJhbmRvbVxuICAgKiAgICAgdmFsdWUpLiBJZiBub3QgcHJvdmlkZWQsIGl0IGlzIHNldCB0byBhIHN0cmluZyBvZiBoYXNoIGxlbmd0aCB6ZXJvcy5cbiAgICogQHJldHVybiBUaGUgS0VNIGtleSBhbmRcbiAgICogICAgIHRva2VuLlxuICAgKi9cbiAgYXN5bmMgZW5jYXBzdWxhdGUoXG4gICAgICBrZXlTaXplSW5CeXRlczogbnVtYmVyLCBwb2ludEZvcm1hdDogRWxsaXB0aWNDdXJ2ZXMuUG9pbnRGb3JtYXRUeXBlLFxuICAgICAgaGtkZkhhc2g6IHN0cmluZywgaGtkZkluZm86IFVpbnQ4QXJyYXksIG9wdF9oa2RmU2FsdD86IFVpbnQ4QXJyYXkpOlxuICAgICAgUHJvbWlzZTx7a2V5OiBVaW50OEFycmF5LCB0b2tlbjogVWludDhBcnJheX0+IHtcbiAgICBjb25zdCB7bmFtZWRDdXJ2ZX06IFBhcnRpYWw8RWNLZXlBbGdvcml0aG0+ID0gdGhpcy5wdWJsaWNLZXkuYWxnb3JpdGhtO1xuICAgIGlmICghbmFtZWRDdXJ2ZSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdDdXJ2ZSBoYXMgdG8gYmUgZGVmaW5lZC4nKTtcbiAgICB9XG4gICAgY29uc3QgZXBoZW1lcmFsS2V5UGFpciA9XG4gICAgICAgIGF3YWl0IEVsbGlwdGljQ3VydmVzLmdlbmVyYXRlS2V5UGFpcignRUNESCcsIG5hbWVkQ3VydmUpO1xuICAgIGNvbnN0IHNoYXJlZFNlY3JldCA9IGF3YWl0IEVsbGlwdGljQ3VydmVzLmNvbXB1dGVFY2RoU2hhcmVkU2VjcmV0KFxuICAgICAgICBlcGhlbWVyYWxLZXlQYWlyLnByaXZhdGVLZXkhLCB0aGlzLnB1YmxpY0tleSk7XG4gICAgY29uc3QgandrID1cbiAgICAgICAgYXdhaXQgRWxsaXB0aWNDdXJ2ZXMuZXhwb3J0Q3J5cHRvS2V5KGVwaGVtZXJhbEtleVBhaXIucHVibGljS2V5ISk7XG4gICAgY29uc3Qge2Nydn0gPSBqd2s7XG4gICAgaWYgKCFjcnYpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignQ3VydmUgaGFzIHRvIGJlIGRlZmluZWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IGtlbVRva2VuID0gRWxsaXB0aWNDdXJ2ZXMucG9pbnRFbmNvZGUoY3J2LCBwb2ludEZvcm1hdCwgandrKTtcbiAgICBjb25zdCBoa2RmSWttID0gQnl0ZXMuY29uY2F0KGtlbVRva2VuLCBzaGFyZWRTZWNyZXQpO1xuICAgIGNvbnN0IGtlbUtleSA9IGF3YWl0IEhrZGYuY29tcHV0ZShcbiAgICAgICAga2V5U2l6ZUluQnl0ZXMsIGhrZGZIYXNoLCBoa2RmSWttLCBoa2RmSW5mbywgb3B0X2hrZGZTYWx0KTtcbiAgICByZXR1cm4geydrZXknOiBrZW1LZXksICd0b2tlbic6IGtlbVRva2VufTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZnJvbUpzb25XZWJLZXkoandrOiBKc29uV2ViS2V5KTpcbiAgICBQcm9taXNlPEVjaWVzSGtkZktlbVNlbmRlcj4ge1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBFbGxpcHRpY0N1cnZlcy5pbXBvcnRQdWJsaWNLZXkoJ0VDREgnLCBqd2spO1xuICByZXR1cm4gbmV3IEVjaWVzSGtkZktlbVNlbmRlcihwdWJsaWNLZXkpO1xufVxuIl19