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.
104 lines • 11.4 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());
});
};
/**
* @fileoverview An implementation of HKDF, RFC 5869.
*/
import { InvalidArgumentsException } from '../exception/invalid_arguments_exception';
import { fromRawKey as hmacFromRawKey } from './hmac';
import * as Validators from './validators';
/**
* Computes an HKDF.
*
* @param size 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 hash the name of the hash function. Accepted names are SHA-1,
* SHA-256 and SHA-512
* @param ikm Input keying material.
* @param info Context and application specific
* information (can be a zero-length array).
* @param opt_salt Salt value (a non-secret random
* value). If not provided, it is set to a string of hash length zeros.
* @return Output keying material (okm).
*/
export function compute(size, hash, ikm, info, opt_salt) {
return __awaiter(this, void 0, void 0, function* () {
let digestSize;
if (!Number.isInteger(size)) {
throw new InvalidArgumentsException('size must be an integer');
}
if (size <= 0) {
throw new InvalidArgumentsException('size must be positive');
}
switch (hash) {
case 'SHA-1':
digestSize = 20;
if (size > 255 * 20) {
throw new InvalidArgumentsException('size too large');
}
break;
case 'SHA-256':
digestSize = 32;
if (size > 255 * 32) {
throw new InvalidArgumentsException('size too large');
}
break;
case 'SHA-512':
digestSize = 64;
if (size > 255 * 64) {
throw new InvalidArgumentsException('size too large');
}
break;
default:
throw new InvalidArgumentsException(hash + ' is not supported');
}
Validators.requireUint8Array(ikm);
Validators.requireUint8Array(info);
let salt = opt_salt;
if (opt_salt == null || salt === undefined || salt.length == 0) {
salt = new Uint8Array(digestSize);
}
Validators.requireUint8Array(salt);
// Extract.
let hmac = yield hmacFromRawKey(hash, salt, digestSize);
const prk = yield hmac.computeMac(
// Pseudorandom Key
ikm);
// Expand
hmac = yield hmacFromRawKey(hash, prk, digestSize);
let ctr = 1;
let pos = 0;
let digest = new Uint8Array(0);
const result = new Uint8Array(size);
while (true) {
const input = new Uint8Array(digest.length + info.length + 1);
input.set(digest, 0);
input.set(info, digest.length);
input[input.length - 1] = ctr;
digest = yield hmac.computeMac(input);
if (pos + digest.length < size) {
result.set(digest, pos);
pos += digest.length;
ctr++;
}
else {
result.set(digest.subarray(0, size - pos), pos);
break;
}
}
return result;
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGtkZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3N1YnRsZS9oa2RmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7QUFHSDs7R0FFRztBQUNILE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBRW5GLE9BQU8sRUFBQyxVQUFVLElBQUksY0FBYyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3BELE9BQU8sS0FBSyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRTNDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFnQixPQUFPLENBQ3pCLElBQVksRUFBRSxJQUFZLEVBQUUsR0FBZSxFQUFFLElBQWdCLEVBQzdELFFBQXFCOztRQUN2QixJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNCLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQ2IsTUFBTSxJQUFJLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDOUQ7UUFDRCxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssT0FBTztnQkFDVixVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFO29CQUNuQixNQUFNLElBQUkseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDdkQ7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssU0FBUztnQkFDWixVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFO29CQUNuQixNQUFNLElBQUkseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDdkQ7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssU0FBUztnQkFDWixVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFO29CQUNuQixNQUFNLElBQUkseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDdkQ7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztTQUNuRTtRQUNELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQzlELElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNuQztRQUNELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuQyxXQUFXO1FBQ1gsSUFBSSxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVO1FBQzdCLG1CQUFtQjtRQUNuQixHQUFHLENBQUMsQ0FBQztRQUVULFNBQVM7UUFDVCxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxPQUFPLElBQUksRUFBRTtZQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5RCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyQixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzlCLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUU7Z0JBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDckIsR0FBRyxFQUFFLENBQUM7YUFDUDtpQkFBTTtnQkFDTCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDaEQsTUFBTTthQUNQO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEFuIGltcGxlbWVudGF0aW9uIG9mIEhLREYsIFJGQyA1ODY5LlxuICovXG5pbXBvcnQge0ludmFsaWRBcmd1bWVudHNFeGNlcHRpb259IGZyb20gJy4uL2V4Y2VwdGlvbi9pbnZhbGlkX2FyZ3VtZW50c19leGNlcHRpb24nO1xuXG5pbXBvcnQge2Zyb21SYXdLZXkgYXMgaG1hY0Zyb21SYXdLZXl9IGZyb20gJy4vaG1hYyc7XG5pbXBvcnQgKiBhcyBWYWxpZGF0b3JzIGZyb20gJy4vdmFsaWRhdG9ycyc7XG5cbi8qKlxuICogQ29tcHV0ZXMgYW4gSEtERi5cbiAqXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbGVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgcHNldWRvcmFuZG9tIHN0cmluZyBpblxuICogICAgIGJ5dGVzLiBUaGUgbWF4aW1hbCBzaXplIGlzIDI1NSAqIERpZ2VzdFNpemUsIHdoZXJlIERpZ2VzdFNpemUgaXMgdGhlIHNpemVcbiAqICAgICBvZiB0aGUgdW5kZXJseWluZyBITUFDLlxuICogQHBhcmFtIGhhc2ggdGhlIG5hbWUgb2YgdGhlIGhhc2ggZnVuY3Rpb24uIEFjY2VwdGVkIG5hbWVzIGFyZSBTSEEtMSxcbiAqICAgICBTSEEtMjU2IGFuZCBTSEEtNTEyXG4gKiBAcGFyYW0gaWttIElucHV0IGtleWluZyBtYXRlcmlhbC5cbiAqIEBwYXJhbSBpbmZvIENvbnRleHQgYW5kIGFwcGxpY2F0aW9uIHNwZWNpZmljXG4gKiAgICAgaW5mb3JtYXRpb24gKGNhbiBiZSBhIHplcm8tbGVuZ3RoIGFycmF5KS5cbiAqIEBwYXJhbSBvcHRfc2FsdCBTYWx0IHZhbHVlIChhIG5vbi1zZWNyZXQgcmFuZG9tXG4gKiAgICAgdmFsdWUpLiBJZiBub3QgcHJvdmlkZWQsIGl0IGlzIHNldCB0byBhIHN0cmluZyBvZiBoYXNoIGxlbmd0aCB6ZXJvcy5cbiAqIEByZXR1cm4gT3V0cHV0IGtleWluZyBtYXRlcmlhbCAob2ttKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXB1dGUoXG4gICAgc2l6ZTogbnVtYmVyLCBoYXNoOiBzdHJpbmcsIGlrbTogVWludDhBcnJheSwgaW5mbzogVWludDhBcnJheSxcbiAgICBvcHRfc2FsdD86IFVpbnQ4QXJyYXkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgbGV0IGRpZ2VzdFNpemU7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihzaXplKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uKCdzaXplIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICB9XG4gIGlmIChzaXplIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbignc2l6ZSBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gIH1cbiAgc3dpdGNoIChoYXNoKSB7XG4gICAgY2FzZSAnU0hBLTEnOlxuICAgICAgZGlnZXN0U2l6ZSA9IDIwO1xuICAgICAgaWYgKHNpemUgPiAyNTUgKiAyMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbignc2l6ZSB0b28gbGFyZ2UnKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NIQS0yNTYnOlxuICAgICAgZGlnZXN0U2l6ZSA9IDMyO1xuICAgICAgaWYgKHNpemUgPiAyNTUgKiAzMikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbignc2l6ZSB0b28gbGFyZ2UnKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NIQS01MTInOlxuICAgICAgZGlnZXN0U2l6ZSA9IDY0O1xuICAgICAgaWYgKHNpemUgPiAyNTUgKiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbignc2l6ZSB0b28gbGFyZ2UnKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbihoYXNoICsgJyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgVmFsaWRhdG9ycy5yZXF1aXJlVWludDhBcnJheShpa20pO1xuICBWYWxpZGF0b3JzLnJlcXVpcmVVaW50OEFycmF5KGluZm8pO1xuICBsZXQgc2FsdCA9IG9wdF9zYWx0O1xuICBpZiAob3B0X3NhbHQgPT0gbnVsbCB8fCBzYWx0ID09PSB1bmRlZmluZWQgfHwgc2FsdC5sZW5ndGggPT0gMCkge1xuICAgIHNhbHQgPSBuZXcgVWludDhBcnJheShkaWdlc3RTaXplKTtcbiAgfVxuICBWYWxpZGF0b3JzLnJlcXVpcmVVaW50OEFycmF5KHNhbHQpO1xuXG4gIC8vIEV4dHJhY3QuXG4gIGxldCBobWFjID0gYXdhaXQgaG1hY0Zyb21SYXdLZXkoaGFzaCwgc2FsdCwgZGlnZXN0U2l6ZSk7XG4gIGNvbnN0IHByayA9IGF3YWl0IGhtYWMuY29tcHV0ZU1hYyhcbiAgICAgIC8vIFBzZXVkb3JhbmRvbSBLZXlcbiAgICAgIGlrbSk7XG5cbiAgLy8gRXhwYW5kXG4gIGhtYWMgPSBhd2FpdCBobWFjRnJvbVJhd0tleShoYXNoLCBwcmssIGRpZ2VzdFNpemUpO1xuICBsZXQgY3RyID0gMTtcbiAgbGV0IHBvcyA9IDA7XG4gIGxldCBkaWdlc3QgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgVWludDhBcnJheShkaWdlc3QubGVuZ3RoICsgaW5mby5sZW5ndGggKyAxKTtcbiAgICBpbnB1dC5zZXQoZGlnZXN0LCAwKTtcbiAgICBpbnB1dC5zZXQoaW5mbywgZGlnZXN0Lmxlbmd0aCk7XG4gICAgaW5wdXRbaW5wdXQubGVuZ3RoIC0gMV0gPSBjdHI7XG4gICAgZGlnZXN0ID0gYXdhaXQgaG1hYy5jb21wdXRlTWFjKGlucHV0KTtcbiAgICBpZiAocG9zICsgZGlnZXN0Lmxlbmd0aCA8IHNpemUpIHtcbiAgICAgIHJlc3VsdC5zZXQoZGlnZXN0LCBwb3MpO1xuICAgICAgcG9zICs9IGRpZ2VzdC5sZW5ndGg7XG4gICAgICBjdHIrKztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnNldChkaWdlc3Quc3ViYXJyYXkoMCwgc2l6ZSAtIHBvcyksIHBvcyk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==