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
JavaScript
/**
* @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==