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.

87 lines 13 kB
/** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { AeadConfig } from '../aead/aead_config'; import { SecurityException } from '../exception/security_exception'; import { PbEllipticCurveType, PbHashType, PbPointFormat } from '../internal/proto'; import { bytesLength } from '../internal/proto_shims'; import * as Validators from '../subtle/validators'; function validateKemParams(kemParams) { const curve = kemParams.getCurveType(); if (curve !== PbEllipticCurveType.NIST_P256 && curve !== PbEllipticCurveType.NIST_P384 && curve !== PbEllipticCurveType.NIST_P521) { throw new SecurityException('Invalid KEM params - unknown curve type.'); } const hashType = kemParams.getHkdfHashType(); if (hashType !== PbHashType.SHA1 && hashType !== PbHashType.SHA256 && hashType !== PbHashType.SHA384 && hashType !== PbHashType.SHA512) { throw new SecurityException('Invalid KEM params - unknown hash type.'); } } function validateDemParams(demParams) { if (!demParams.getAeadDem()) { throw new SecurityException('Invalid DEM params - missing AEAD key template.'); } // It is checked also here due to methods for creating new keys. We do not // allow creating new keys from formats which contains key templates of // not supported key types. const aeadKeyType = demParams.getAeadDem().getTypeUrl(); if (aeadKeyType != AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL && aeadKeyType != AeadConfig.AES_GCM_TYPE_URL) { throw new SecurityException('Invalid DEM params - ' + aeadKeyType + ' template is not supported by ECIES AEAD HKDF.'); } } export function validateParams(params) { const kemParams = params.getKemParams(); if (!kemParams) { throw new SecurityException('Invalid params - missing KEM params.'); } validateKemParams(kemParams); const demParams = params.getDemParams(); if (!demParams) { throw new SecurityException('Invalid params - missing DEM params.'); } validateDemParams(demParams); const pointFormat = params.getEcPointFormat(); if (pointFormat !== PbPointFormat.UNCOMPRESSED && pointFormat !== PbPointFormat.COMPRESSED && pointFormat !== PbPointFormat.DO_NOT_USE_CRUNCHY_UNCOMPRESSED) { throw new SecurityException('Invalid key params - unknown EC point format.'); } } export function validateKeyFormat(keyFormat) { const params = keyFormat.getParams(); if (!params) { throw new SecurityException('Invalid key format - missing key params.'); } validateParams(params); } 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.getX()) || !bytesLength(key.getY())) { throw new SecurityException('Invalid public key - missing value of X or Y.'); } } // TODO Should we add more checks here? export function validatePrivateKey(key, privateKeyManagerVersion, publicKeyManagerVersion) { Validators.validateVersion(key.getVersion(), privateKeyManagerVersion); if (!key.getKeyValue()) { 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 information.'); } validatePublicKey(publicKey, publicKeyManagerVersion); } // TODO Should we add more checks here? //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNpZXNfYWVhZF9oa2RmX3ZhbGlkYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9oeWJyaWQvZWNpZXNfYWVhZF9oa2RmX3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQW1KLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNuTyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxTQUFTLGlCQUFpQixDQUFDLFNBQStCO0lBQ3hELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxJQUFJLEtBQUssS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO1FBQ3ZDLEtBQUssS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO1FBQ3ZDLEtBQUssS0FBSyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUU7UUFDM0MsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7S0FDekU7SUFDRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDN0MsSUFBSSxRQUFRLEtBQUssVUFBVSxDQUFDLElBQUksSUFBSSxRQUFRLEtBQUssVUFBVSxDQUFDLE1BQU07UUFDOUQsUUFBUSxLQUFLLFVBQVUsQ0FBQyxNQUFNLElBQUksUUFBUSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDcEUsTUFBTSxJQUFJLGlCQUFpQixDQUFDLHlDQUF5QyxDQUFDLENBQUM7S0FDeEU7QUFDSCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxTQUEr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WSxFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNkLE1BQU0sSUFBSSxpQkFBaUIsQ0FDdkIsdURBQXVELENBQUMsQ0FBQztLQUM5RDtJQUNELGlCQUFpQixDQUFDLFNBQVMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCx1Q0FBdUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7QWVhZENvbmZpZ30gZnJvbSAnLi4vYWVhZC9hZWFkX2NvbmZpZyc7XG5pbXBvcnQge1NlY3VyaXR5RXhjZXB0aW9ufSBmcm9tICcuLi9leGNlcHRpb24vc2VjdXJpdHlfZXhjZXB0aW9uJztcbmltcG9ydCB7UGJFY2llc0FlYWREZW1QYXJhbXMsIFBiRWNpZXNBZWFkSGtkZktleUZvcm1hdCwgUGJFY2llc0FlYWRIa2RmUGFyYW1zLCBQYkVjaWVzQWVhZEhrZGZQcml2YXRlS2V5LCBQYkVjaWVzQWVhZEhrZGZQdWJsaWNLZXksIFBiRWNpZXNIa2RmS2VtUGFyYW1zLCBQYkVsbGlwdGljQ3VydmVUeXBlLCBQYkhhc2hUeXBlLCBQYlBvaW50Rm9ybWF0fSBmcm9tICcuLi9pbnRlcm5hbC9wcm90byc7XG5pbXBvcnQge2J5dGVzTGVuZ3RofSBmcm9tICcuLi9pbnRlcm5hbC9wcm90b19zaGltcyc7XG5pbXBvcnQgKiBhcyBWYWxpZGF0b3JzIGZyb20gJy4uL3N1YnRsZS92YWxpZGF0b3JzJztcblxuZnVuY3Rpb24gdmFsaWRhdGVLZW1QYXJhbXMoa2VtUGFyYW1zOiBQYkVjaWVzSGtkZktlbVBhcmFtcykge1xuICBjb25zdCBjdXJ2ZSA9IGtlbVBhcmFtcy5nZXRDdXJ2ZVR5cGUoKTtcbiAgaWYgKGN1cnZlICE9PSBQYkVsbGlwdGljQ3VydmVUeXBlLk5JU1RfUDI1NiAmJlxuICAgICAgY3VydmUgIT09IFBiRWxsaXB0aWNDdXJ2ZVR5cGUuTklTVF9QMzg0ICYmXG4gICAgICBjdXJ2ZSAhPT0gUGJFbGxpcHRpY0N1cnZlVHlwZS5OSVNUX1A1MjEpIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0ludmFsaWQgS0VNIHBhcmFtcyAtIHVua25vd24gY3VydmUgdHlwZS4nKTtcbiAgfVxuICBjb25zdCBoYXNoVHlwZSA9IGtlbVBhcmFtcy5nZXRIa2RmSGFzaFR5cGUoKTtcbiAgaWYgKGhhc2hUeXBlICE9PSBQYkhhc2hUeXBlLlNIQTEgJiYgaGFzaFR5cGUgIT09IFBiSGFzaFR5cGUuU0hBMjU2ICYmXG4gICAgICBoYXNoVHlwZSAhPT0gUGJIYXNoVHlwZS5TSEEzODQgJiYgaGFzaFR5cGUgIT09IFBiSGFzaFR5cGUuU0hBNTEyKSB7XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdJbnZhbGlkIEtFTSBwYXJhbXMgLSB1bmtub3duIGhhc2ggdHlwZS4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURlbVBhcmFtcyhkZW1QYXJhbXM6IFBiRWNpZXNBZWFkRGVtUGFyYW1zKSB7XG4gIGlmICghZGVtUGFyYW1zLmdldEFlYWREZW0oKSkge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgJ0ludmFsaWQgREVNIHBhcmFtcyAtIG1pc3NpbmcgQUVBRCBrZXkgdGVtcGxhdGUuJyk7XG4gIH1cblxuICAvLyBJdCBpcyBjaGVja2VkIGFsc28gaGVyZSBkdWUgdG8gbWV0aG9kcyBmb3IgY3JlYXRpbmcgbmV3IGtleXMuIFdlIGRvIG5vdFxuICAvLyBhbGxvdyBjcmVhdGluZyBuZXcga2V5cyBmcm9tIGZvcm1hdHMgd2hpY2ggY29udGFpbnMga2V5IHRlbXBsYXRlcyBvZlxuICAvLyBub3Qgc3VwcG9ydGVkIGtleSB0eXBlcy5cbiAgY29uc3QgYWVhZEtleVR5cGUgPSBkZW1QYXJhbXMuZ2V0QWVhZERlbSgpIS5nZXRUeXBlVXJsKCk7XG4gIGlmIChhZWFkS2V5VHlwZSAhPSBBZWFkQ29uZmlnLkFFU19DVFJfSE1BQ19BRUFEX1RZUEVfVVJMICYmXG4gICAgICBhZWFkS2V5VHlwZSAhPSBBZWFkQ29uZmlnLkFFU19HQ01fVFlQRV9VUkwpIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICdJbnZhbGlkIERFTSBwYXJhbXMgLSAnICsgYWVhZEtleVR5cGUgK1xuICAgICAgICAnIHRlbXBsYXRlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgRUNJRVMgQUVBRCBIS0RGLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IFBiRWNpZXNBZWFkSGtkZlBhcmFtcykge1xuICBjb25zdCBrZW1QYXJhbXMgPSBwYXJhbXMuZ2V0S2VtUGFyYW1zKCk7XG4gIGlmICgha2VtUGFyYW1zKSB7XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdJbnZhbGlkIHBhcmFtcyAtIG1pc3NpbmcgS0VNIHBhcmFtcy4nKTtcbiAgfVxuICB2YWxpZGF0ZUtlbVBhcmFtcyhrZW1QYXJhbXMpO1xuICBjb25zdCBkZW1QYXJhbXMgPSBwYXJhbXMuZ2V0RGVtUGFyYW1zKCk7XG4gIGlmICghZGVtUGFyYW1zKSB7XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdJbnZhbGlkIHBhcmFtcyAtIG1pc3NpbmcgREVNIHBhcmFtcy4nKTtcbiAgfVxuICB2YWxpZGF0ZURlbVBhcmFtcyhkZW1QYXJhbXMpO1xuICBjb25zdCBwb2ludEZvcm1hdCA9IHBhcmFtcy5nZXRFY1BvaW50Rm9ybWF0KCk7XG4gIGlmIChwb2ludEZvcm1hdCAhPT0gUGJQb2ludEZvcm1hdC5VTkNPTVBSRVNTRUQgJiZcbiAgICAgIHBvaW50Rm9ybWF0ICE9PSBQYlBvaW50Rm9ybWF0LkNPTVBSRVNTRUQgJiZcbiAgICAgIHBvaW50Rm9ybWF0ICE9PSBQYlBvaW50Rm9ybWF0LkRPX05PVF9VU0VfQ1JVTkNIWV9VTkNPTVBSRVNTRUQpIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICdJbnZhbGlkIGtleSBwYXJhbXMgLSB1bmtub3duIEVDIHBvaW50IGZvcm1hdC4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVLZXlGb3JtYXQoa2V5Rm9ybWF0OiBQYkVjaWVzQWVhZEhrZGZLZXlGb3JtYXQpIHtcbiAgY29uc3QgcGFyYW1zID0ga2V5Rm9ybWF0LmdldFBhcmFtcygpO1xuICBpZiAoIXBhcmFtcykge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignSW52YWxpZCBrZXkgZm9ybWF0IC0gbWlzc2luZyBrZXkgcGFyYW1zLicpO1xuICB9XG4gIHZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVB1YmxpY0tleShcbiAgICBrZXk6IFBiRWNpZXNBZWFkSGtkZlB1YmxpY0tleSwgcHVibGljS2V5TWFuYWdlclZlcnNpb246IG51bWJlcikge1xuICBWYWxpZGF0b3JzLnZhbGlkYXRlVmVyc2lvbihrZXkuZ2V0VmVyc2lvbigpLCBwdWJsaWNLZXlNYW5hZ2VyVmVyc2lvbik7XG4gIGNvbnN0IHBhcmFtcyA9IGtleS5nZXRQYXJhbXMoKTtcbiAgaWYgKCFwYXJhbXMpIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0ludmFsaWQgcHVibGljIGtleSAtIG1pc3Npbmcga2V5IHBhcmFtcy4nKTtcbiAgfVxuICB2YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xuICBpZiAoIWJ5dGVzTGVuZ3RoKGtleS5nZXRYKCkpIHx8ICFieXRlc0xlbmd0aChrZXkuZ2V0WSgpKSkge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgJ0ludmFsaWQgcHVibGljIGtleSAtIG1pc3NpbmcgdmFsdWUgb2YgWCBvciBZLicpO1xuICB9XG59XG5cbi8vIFRPRE8gU2hvdWxkIHdlIGFkZCBtb3JlIGNoZWNrcyBoZXJlP1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUHJpdmF0ZUtleShcbiAgICBrZXk6IFBiRWNpZXNBZWFkSGtkZlByaXZhdGVLZXksIHByaXZhdGVLZXlNYW5hZ2VyVmVyc2lvbjogbnVtYmVyLFxuICAgIHB1YmxpY0tleU1hbmFnZXJWZXJzaW9uOiBudW1iZXIpIHtcbiAgVmFsaWRhdG9ycy52YWxpZGF0ZVZlcnNpb24oa2V5LmdldFZlcnNpb24oKSwgcHJpdmF0ZUtleU1hbmFnZXJWZXJzaW9uKTtcbiAgaWYgKCFrZXkuZ2V0S2V5VmFsdWUoKSkge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgJ0ludmFsaWQgcHJpdmF0ZSBrZXkgLSBtaXNzaW5nIHByaXZhdGUga2V5IHZhbHVlLicpO1xuICB9XG4gIGNvbnN0IHB1YmxpY0tleSA9IGtleS5nZXRQdWJsaWNLZXkoKTtcbiAgaWYgKCFwdWJsaWNLZXkpIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICdJbnZhbGlkIHByaXZhdGUga2V5IC0gbWlzc2luZyBwdWJsaWMga2V5IGluZm9ybWF0aW9uLicpO1xuICB9XG4gIHZhbGlkYXRlUHVibGljS2V5KHB1YmxpY0tleSwgcHVibGljS2V5TWFuYWdlclZlcnNpb24pO1xufVxuXG4vLyBUT0RPIFNob3VsZCB3ZSBhZGQgbW9yZSBjaGVja3MgaGVyZT9cbiJdfQ==