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