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.

97 lines 9.59 kB
/** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { InvalidArgumentsException } from '../exception/invalid_arguments_exception'; import { SecurityException } from '../exception/security_exception'; import { PbOutputPrefixType } from './proto'; /** * Constants and methods that deal with the format of the outputs handled by * Tink. * * @static * @final */ export class CryptoFormat { /** * Generates the prefix for the outputs handled by the given 'key'. * Throws an exception if the prefix type of 'key' is invalid. * * */ static getOutputPrefix(key) { switch (key.getOutputPrefixType()) { case PbOutputPrefixType.LEGACY: // fall through case PbOutputPrefixType.CRUNCHY: return CryptoFormat.makeOutputPrefix(key.getKeyId(), CryptoFormat.LEGACY_START_BYTE); case PbOutputPrefixType.TINK: return CryptoFormat.makeOutputPrefix(key.getKeyId(), CryptoFormat.TINK_START_BYTE); case PbOutputPrefixType.RAW: return CryptoFormat.RAW_PREFIX; default: throw new SecurityException('Unsupported key prefix type.'); } } /** * Makes output prefix which consits of 4 bytes of key id in Big Endian * representation followed by 1 byte of key type identifier. * * @static * */ static makeOutputPrefix(keyId, keyTypeIdentifier) { let res = [keyTypeIdentifier]; res = res.concat(CryptoFormat.numberAsBigEndian(keyId)); return new Uint8Array(res); } /** * Returns the given number as Uint8Array in Big Endian format. * * Given number has to be a non-negative integer smaller than 2^32. * * @static * */ static numberAsBigEndian(n) { if (!Number.isInteger(n) || n < 0 || n >= Math.pow(2, 32)) { throw new InvalidArgumentsException('Number has to be unsigned 32-bit integer.'); } const numberOfBytes = 4; const res = new Array(numberOfBytes); for (let i = 0; i < numberOfBytes; i++) { res[i] = 255 & n >> 8 * (numberOfBytes - i - 1); } return res; } } /** * Prefix size of Tink and Legacy key types. */ CryptoFormat.NON_RAW_PREFIX_SIZE = 5; /** * Prefix size of Legacy key types. */ CryptoFormat.LEGACY_PREFIX_SIZE = CryptoFormat.NON_RAW_PREFIX_SIZE; /** * Legacy starts with 0 and is followed by 4-byte key id. */ CryptoFormat.LEGACY_START_BYTE = 0; /** * Prefix size of Tink key types. */ CryptoFormat.TINK_PREFIX_SIZE = CryptoFormat.NON_RAW_PREFIX_SIZE; /** * Tink starts with 1 and is followed by 4-byte key id. */ CryptoFormat.TINK_START_BYTE = 1; /** * Raw prefix should have length 0. */ CryptoFormat.RAW_PREFIX_SIZE = 0; /** * Raw prefix is empty Uint8Array. */ CryptoFormat.RAW_PREFIX = new Uint8Array(0); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvX2Zvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2ludGVybmFsL2NyeXB0b19mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ25GLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBRWxFLE9BQU8sRUFBYyxrQkFBa0IsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV4RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2Qjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBZ0I7UUFDckMsUUFBUSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsRUFBRTtZQUNqQyxLQUFLLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUUvQixlQUFlO1lBQ2YsS0FBSyxrQkFBa0IsQ0FBQyxPQUFPO2dCQUM3QixPQUFPLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDaEMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3RELEtBQUssa0JBQWtCLENBQUMsSUFBSTtnQkFDMUIsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLENBQ2hDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEQsS0FBSyxrQkFBa0IsQ0FBQyxHQUFHO2dCQUN6QixPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDakM7Z0JBQ0UsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxpQkFBeUI7UUFFdEUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlCLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBUztRQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFBLENBQUMsRUFBSSxFQUFFLENBQUEsRUFBRTtZQUNqRCxNQUFNLElBQUkseUJBQXlCLENBQy9CLDJDQUEyQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQUVEOztHQUVHO0FBQ2EsZ0NBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRXhDOztHQUVHO0FBQ2EsK0JBQWtCLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDO0FBRXRFOztHQUVHO0FBQ2EsOEJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRXRDOztHQUVHO0FBQ2EsNkJBQWdCLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDO0FBRXBFOztHQUVHO0FBQ2EsNEJBQWUsR0FBRyxDQUFDLENBQUM7QUFFcEM7O0dBRUc7QUFDYSw0QkFBZSxHQUFHLENBQUMsQ0FBQztBQUVwQzs7R0FFRztBQUNhLHVCQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7SW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbn0gZnJvbSAnLi4vZXhjZXB0aW9uL2ludmFsaWRfYXJndW1lbnRzX2V4Y2VwdGlvbic7XG5pbXBvcnQge1NlY3VyaXR5RXhjZXB0aW9ufSBmcm9tICcuLi9leGNlcHRpb24vc2VjdXJpdHlfZXhjZXB0aW9uJztcblxuaW1wb3J0IHtQYktleXNldEtleSwgUGJPdXRwdXRQcmVmaXhUeXBlfSBmcm9tICcuL3Byb3RvJztcblxuLyoqXG4gKiBDb25zdGFudHMgYW5kIG1ldGhvZHMgdGhhdCBkZWFsIHdpdGggdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0cyBoYW5kbGVkIGJ5XG4gKiBUaW5rLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBmaW5hbFxuICovXG5leHBvcnQgY2xhc3MgQ3J5cHRvRm9ybWF0IHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgcHJlZml4IGZvciB0aGUgb3V0cHV0cyBoYW5kbGVkIGJ5IHRoZSBnaXZlbiAna2V5Jy5cbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcHJlZml4IHR5cGUgb2YgJ2tleScgaXMgaW52YWxpZC5cbiAgICpcbiAgICpcbiAgICovXG4gIHN0YXRpYyBnZXRPdXRwdXRQcmVmaXgoa2V5OiBQYktleXNldEtleSk6IFVpbnQ4QXJyYXkge1xuICAgIHN3aXRjaCAoa2V5LmdldE91dHB1dFByZWZpeFR5cGUoKSkge1xuICAgICAgY2FzZSBQYk91dHB1dFByZWZpeFR5cGUuTEVHQUNZOlxuXG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgIGNhc2UgUGJPdXRwdXRQcmVmaXhUeXBlLkNSVU5DSFk6XG4gICAgICAgIHJldHVybiBDcnlwdG9Gb3JtYXQubWFrZU91dHB1dFByZWZpeChcbiAgICAgICAgICAgIGtleS5nZXRLZXlJZCgpLCBDcnlwdG9Gb3JtYXQuTEVHQUNZX1NUQVJUX0JZVEUpO1xuICAgICAgY2FzZSBQYk91dHB1dFByZWZpeFR5cGUuVElOSzpcbiAgICAgICAgcmV0dXJuIENyeXB0b0Zvcm1hdC5tYWtlT3V0cHV0UHJlZml4KFxuICAgICAgICAgICAga2V5LmdldEtleUlkKCksIENyeXB0b0Zvcm1hdC5USU5LX1NUQVJUX0JZVEUpO1xuICAgICAgY2FzZSBQYk91dHB1dFByZWZpeFR5cGUuUkFXOlxuICAgICAgICByZXR1cm4gQ3J5cHRvRm9ybWF0LlJBV19QUkVGSVg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIGtleSBwcmVmaXggdHlwZS4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgb3V0cHV0IHByZWZpeCB3aGljaCBjb25zaXRzIG9mIDQgYnl0ZXMgb2Yga2V5IGlkIGluIEJpZyBFbmRpYW5cbiAgICogcmVwcmVzZW50YXRpb24gZm9sbG93ZWQgYnkgMSBieXRlIG9mIGtleSB0eXBlIGlkZW50aWZpZXIuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICpcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG1ha2VPdXRwdXRQcmVmaXgoa2V5SWQ6IG51bWJlciwga2V5VHlwZUlkZW50aWZpZXI6IG51bWJlcik6XG4gICAgICBVaW50OEFycmF5IHtcbiAgICBsZXQgcmVzID0gW2tleVR5cGVJZGVudGlmaWVyXTtcbiAgICByZXMgPSByZXMuY29uY2F0KENyeXB0b0Zvcm1hdC5udW1iZXJBc0JpZ0VuZGlhbihrZXlJZCkpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGdpdmVuIG51bWJlciBhcyBVaW50OEFycmF5IGluIEJpZyBFbmRpYW4gZm9ybWF0LlxuICAgKlxuICAgKiBHaXZlbiBudW1iZXIgaGFzIHRvIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIDJeMzIuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICpcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG51bWJlckFzQmlnRW5kaWFuKG46IG51bWJlcik6IG51bWJlcltdIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobikgfHwgbiA8IDAgfHwgbiA+PSAyICoqIDMyKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbihcbiAgICAgICAgICAnTnVtYmVyIGhhcyB0byBiZSB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlci4nKTtcbiAgICB9XG4gICAgY29uc3QgbnVtYmVyT2ZCeXRlcyA9IDQ7XG4gICAgY29uc3QgcmVzID0gbmV3IEFycmF5KG51bWJlck9mQnl0ZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZCeXRlczsgaSsrKSB7XG4gICAgICByZXNbaV0gPSAyNTUgJiBuID4+IDggKiAobnVtYmVyT2ZCeXRlcyAtIGkgLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggc2l6ZSBvZiBUaW5rIGFuZCBMZWdhY3kga2V5IHR5cGVzLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IE5PTl9SQVdfUFJFRklYX1NJWkUgPSA1O1xuXG4gIC8qKlxuICAgKiBQcmVmaXggc2l6ZSBvZiBMZWdhY3kga2V5IHR5cGVzLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IExFR0FDWV9QUkVGSVhfU0laRSA9IENyeXB0b0Zvcm1hdC5OT05fUkFXX1BSRUZJWF9TSVpFO1xuXG4gIC8qKlxuICAgKiBMZWdhY3kgc3RhcnRzIHdpdGggMCBhbmQgaXMgZm9sbG93ZWQgYnkgNC1ieXRlIGtleSBpZC5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBMRUdBQ1lfU1RBUlRfQllURSA9IDA7XG5cbiAgLyoqXG4gICAqIFByZWZpeCBzaXplIG9mIFRpbmsga2V5IHR5cGVzLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IFRJTktfUFJFRklYX1NJWkUgPSBDcnlwdG9Gb3JtYXQuTk9OX1JBV19QUkVGSVhfU0laRTtcblxuICAvKipcbiAgICogVGluayBzdGFydHMgd2l0aCAxIGFuZCBpcyBmb2xsb3dlZCBieSA0LWJ5dGUga2V5IGlkLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IFRJTktfU1RBUlRfQllURSA9IDE7XG5cbiAgLyoqXG4gICAqIFJhdyBwcmVmaXggc2hvdWxkIGhhdmUgbGVuZ3RoIDAuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUkFXX1BSRUZJWF9TSVpFID0gMDtcblxuICAvKipcbiAgICogUmF3IHByZWZpeCBpcyBlbXB0eSBVaW50OEFycmF5LlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IFJBV19QUkVGSVggPSBuZXcgVWludDhBcnJheSgwKTtcbn1cbiJdfQ==