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.

104 lines 11.4 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()); }); }; /** * @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==