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.

58 lines 8.67 kB
/** * @license * Copyright 2023 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { SecurityException } from '../../../exception/security_exception'; import { PbHpkeAead, PbHpkeKdf, PbHpkeKem } from '../../../internal/proto'; import { bytesLength } from '../../../internal/proto_shims'; import * as validators from '../../../subtle/validators'; /** Validate HPKE params. */ export function validateParams(params) { const kem = params.getKem(); if (kem !== PbHpkeKem.DHKEM_P256_HKDF_SHA256 && kem !== PbHpkeKem.DHKEM_P521_HKDF_SHA512) { throw new SecurityException('Invalid hpke params - unknown KEM identifier.'); } const kdf = params.getKdf(); if (kdf !== PbHpkeKdf.HKDF_SHA256 && kdf !== PbHpkeKdf.HKDF_SHA512) { throw new SecurityException('Invalid hpke params - unknown KDF identifier.'); } const aead = params.getAead(); if (aead !== PbHpkeAead.AES_128_GCM && aead !== PbHpkeAead.AES_256_GCM) { throw new SecurityException('Invalid hpke params - unknown AEAD identifier.'); } } /** Validate HPKE key format. */ export function validateKeyFormat(keyFormat) { const params = keyFormat.getParams(); if (!params) { throw new SecurityException('Invalid key format - missing key params.'); } validateParams(params); } /** Validate HPKE public key. */ export function validatePublicKey(key, publicKeyManagerVersion) { validators.validateVersion(key.getVersion(), publicKeyManagerVersion); const params = key.getParams(); if (!params) { throw new SecurityException('Invalid public key - missing key params.'); } validateParams(params); if (bytesLength(key.getPublicKey()) === 0) { throw new SecurityException('Invalid public key - missing public key value.'); } } /** Validate HPKE private key. */ export function validatePrivateKey(key, privateKeyManagerVersion, publicKeyManagerVersion) { validators.validateVersion(key.getVersion(), privateKeyManagerVersion); if (bytesLength(key.getPrivateKey()) === 0) { throw new SecurityException('Invalid private key - missing private key value.'); } const publicKey = key.getPublicKey(); if (!publicKey) { throw new SecurityException('Invalid private key - missing public key field.'); } validatePublicKey(publicKey, publicKeyManagerVersion); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHBrZV92YWxpZGF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vaHlicmlkL2ludGVybmFsL2hwa2UvaHBrZV92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQW1FLE1BQU0seUJBQXlCLENBQUM7QUFDM0ksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sS0FBSyxVQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsNEJBQTRCO0FBQzVCLE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBb0I7SUFDakQsTUFBTSxHQUFHLEdBQWMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZDLElBQUksR0FBRyxLQUFLLFNBQVMsQ0FBQyxzQkFBc0I7UUFDeEMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRTtRQUM1QyxNQUFNLElBQUksaUJBQWlCLENBQ3ZCLCtDQUErQyxDQUFDLENBQUM7S0FDdEQ7SUFFRCxNQUFNLEdBQUcsR0FBYyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdkMsSUFBSSxHQUFHLEtBQUssU0FBUyxDQUFDLFdBQVcsSUFBSSxHQUFHLEtBQUssU0FBUyxDQUFDLFdBQVcsRUFBRTtRQUNsRSxNQUFNLElBQUksaUJBQWlCLENBQ3ZCLCtDQUErQyxDQUFDLENBQUM7S0FDdEQ7SUFFRCxNQUFNLElBQUksR0FBZSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUMsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLFdBQVcsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUN0RSxNQUFNLElBQUksaUJBQWlCLENBQ3ZCLGdEQUFnRCxDQUFDLENBQUM7S0FDdkQ7QUFDSCxDQUFDO0FBRUQsZ0NBQWdDO0FBQ2hDLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxTQUEwQjtJQUMxRCxNQUFNLE1BQU0sR0FBMkIsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzdELElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztLQUN6RTtJQUNELGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsZ0NBQWdDO0FBQ2hDLE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsR0FBb0IsRUFBRSx1QkFBK0I7SUFDdkQsVUFBVSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBMkIsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3ZELElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztLQUN6RTtJQUNELGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QixJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDekMsTUFBTSxJQUFJLGlCQUFpQixDQUN2QixnREFBZ0QsQ0FBQyxDQUFDO0tBQ3ZEO0FBQ0gsQ0FBQztBQUVELGlDQUFpQztBQUNqQyxNQUFNLFVBQVUsa0JBQWtCLENBQzlCLEdBQXFCLEVBQUUsd0JBQWdDLEVBQ3ZELHVCQUErQjtJQUNqQyxVQUFVLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUMxQyxNQUFNLElBQUksaUJBQWlCLENBQ3ZCLGtEQUFrRCxDQUFDLENBQUM7S0FDekQ7SUFDRCxNQUFNLFNBQVMsR0FBOEIsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2hFLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDZCxNQUFNLElBQUksaUJBQWlCLENBQ3ZCLGlEQUFpRCxDQUFDLENBQUM7S0FDeEQ7SUFDRCxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQge1NlY3VyaXR5RXhjZXB0aW9ufSBmcm9tICcuLi8uLi8uLi9leGNlcHRpb24vc2VjdXJpdHlfZXhjZXB0aW9uJztcbmltcG9ydCB7UGJIcGtlQWVhZCwgUGJIcGtlS2RmLCBQYkhwa2VLZW0sIFBiSHBrZUtleUZvcm1hdCwgUGJIcGtlUGFyYW1zLCBQYkhwa2VQcml2YXRlS2V5LCBQYkhwa2VQdWJsaWNLZXl9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3Byb3RvJztcbmltcG9ydCB7Ynl0ZXNMZW5ndGh9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3Byb3RvX3NoaW1zJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnLi4vLi4vLi4vc3VidGxlL3ZhbGlkYXRvcnMnO1xuXG4vKiogVmFsaWRhdGUgSFBLRSBwYXJhbXMuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQYXJhbXMocGFyYW1zOiBQYkhwa2VQYXJhbXMpIHtcbiAgY29uc3Qga2VtOiBQYkhwa2VLZW0gPSBwYXJhbXMuZ2V0S2VtKCk7XG4gIGlmIChrZW0gIT09IFBiSHBrZUtlbS5ESEtFTV9QMjU2X0hLREZfU0hBMjU2ICYmXG4gICAgICBrZW0gIT09IFBiSHBrZUtlbS5ESEtFTV9QNTIxX0hLREZfU0hBNTEyKSB7XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAnSW52YWxpZCBocGtlIHBhcmFtcyAtIHVua25vd24gS0VNIGlkZW50aWZpZXIuJyk7XG4gIH1cblxuICBjb25zdCBrZGY6IFBiSHBrZUtkZiA9IHBhcmFtcy5nZXRLZGYoKTtcbiAgaWYgKGtkZiAhPT0gUGJIcGtlS2RmLkhLREZfU0hBMjU2ICYmIGtkZiAhPT0gUGJIcGtlS2RmLkhLREZfU0hBNTEyKSB7XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAnSW52YWxpZCBocGtlIHBhcmFtcyAtIHVua25vd24gS0RGIGlkZW50aWZpZXIuJyk7XG4gIH1cblxuICBjb25zdCBhZWFkOiBQYkhwa2VBZWFkID0gcGFyYW1zLmdldEFlYWQoKTtcbiAgaWYgKGFlYWQgIT09IFBiSHBrZUFlYWQuQUVTXzEyOF9HQ00gJiYgYWVhZCAhPT0gUGJIcGtlQWVhZC5BRVNfMjU2X0dDTSkge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgJ0ludmFsaWQgaHBrZSBwYXJhbXMgLSB1bmtub3duIEFFQUQgaWRlbnRpZmllci4nKTtcbiAgfVxufVxuXG4vKiogVmFsaWRhdGUgSFBLRSBrZXkgZm9ybWF0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlS2V5Rm9ybWF0KGtleUZvcm1hdDogUGJIcGtlS2V5Rm9ybWF0KSB7XG4gIGNvbnN0IHBhcmFtczogUGJIcGtlUGFyYW1zfHVuZGVmaW5lZCA9IGtleUZvcm1hdC5nZXRQYXJhbXMoKTtcbiAgaWYgKCFwYXJhbXMpIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0ludmFsaWQga2V5IGZvcm1hdCAtIG1pc3Npbmcga2V5IHBhcmFtcy4nKTtcbiAgfVxuICB2YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xufVxuXG4vKiogVmFsaWRhdGUgSFBLRSBwdWJsaWMga2V5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUHVibGljS2V5KFxuICAgIGtleTogUGJIcGtlUHVibGljS2V5LCBwdWJsaWNLZXlNYW5hZ2VyVmVyc2lvbjogbnVtYmVyKSB7XG4gIHZhbGlkYXRvcnMudmFsaWRhdGVWZXJzaW9uKGtleS5nZXRWZXJzaW9uKCksIHB1YmxpY0tleU1hbmFnZXJWZXJzaW9uKTtcbiAgY29uc3QgcGFyYW1zOiBQYkhwa2VQYXJhbXN8dW5kZWZpbmVkID0ga2V5LmdldFBhcmFtcygpO1xuICBpZiAoIXBhcmFtcykge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignSW52YWxpZCBwdWJsaWMga2V5IC0gbWlzc2luZyBrZXkgcGFyYW1zLicpO1xuICB9XG4gIHZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7XG4gIGlmIChieXRlc0xlbmd0aChrZXkuZ2V0UHVibGljS2V5KCkpID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAnSW52YWxpZCBwdWJsaWMga2V5IC0gbWlzc2luZyBwdWJsaWMga2V5IHZhbHVlLicpO1xuICB9XG59XG5cbi8qKiBWYWxpZGF0ZSBIUEtFIHByaXZhdGUga2V5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUHJpdmF0ZUtleShcbiAgICBrZXk6IFBiSHBrZVByaXZhdGVLZXksIHByaXZhdGVLZXlNYW5hZ2VyVmVyc2lvbjogbnVtYmVyLFxuICAgIHB1YmxpY0tleU1hbmFnZXJWZXJzaW9uOiBudW1iZXIpIHtcbiAgdmFsaWRhdG9ycy52YWxpZGF0ZVZlcnNpb24oa2V5LmdldFZlcnNpb24oKSwgcHJpdmF0ZUtleU1hbmFnZXJWZXJzaW9uKTtcbiAgaWYgKGJ5dGVzTGVuZ3RoKGtleS5nZXRQcml2YXRlS2V5KCkpID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAnSW52YWxpZCBwcml2YXRlIGtleSAtIG1pc3NpbmcgcHJpdmF0ZSBrZXkgdmFsdWUuJyk7XG4gIH1cbiAgY29uc3QgcHVibGljS2V5OiBQYkhwa2VQdWJsaWNLZXl8dW5kZWZpbmVkID0ga2V5LmdldFB1YmxpY0tleSgpO1xuICBpZiAoIXB1YmxpY0tleSkge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgJ0ludmFsaWQgcHJpdmF0ZSBrZXkgLSBtaXNzaW5nIHB1YmxpYyBrZXkgZmllbGQuJyk7XG4gIH1cbiAgdmFsaWRhdGVQdWJsaWNLZXkocHVibGljS2V5LCBwdWJsaWNLZXlNYW5hZ2VyVmVyc2lvbik7XG59XG4iXX0=