@confluentinc/schemaregistry
Version:
Node.js client for Confluent Schema Registry
128 lines (127 loc) • 4.68 kB
JavaScript
;
/**
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.compute = compute;
/**
* An implementation of HKDF, RFC 5869.
*/
const invalid_arguments_exception_1 = require("./exception/invalid_arguments_exception");
const hmac_1 = require("./hmac");
const Validators = __importStar(require("./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.
* @returns Output keying material (okm).
*/
async function compute(size, hash, ikm, info, opt_salt) {
let digestSize;
if (!Number.isInteger(size)) {
throw new invalid_arguments_exception_1.InvalidArgumentsException('size must be an integer');
}
if (size <= 0) {
throw new invalid_arguments_exception_1.InvalidArgumentsException('size must be positive');
}
switch (hash) {
case 'SHA-1':
digestSize = 20;
if (size > 255 * 20) {
throw new invalid_arguments_exception_1.InvalidArgumentsException('size too large');
}
break;
case 'SHA-256':
digestSize = 32;
if (size > 255 * 32) {
throw new invalid_arguments_exception_1.InvalidArgumentsException('size too large');
}
break;
case 'SHA-512':
digestSize = 64;
if (size > 255 * 64) {
throw new invalid_arguments_exception_1.InvalidArgumentsException('size too large');
}
break;
default:
throw new invalid_arguments_exception_1.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 = await (0, hmac_1.fromRawKey)(hash, salt, digestSize);
const prk = await hmac.computeMac(
// Pseudorandom Key
ikm);
// Expand
hmac = await (0, hmac_1.fromRawKey)(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 = await 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;
}