UNPKG

js-crypto-key-utils

Version:

Universal Module for Cryptographic Key Utilities in JavaScript, including PEM-JWK converters

176 lines 6.79 kB
"use strict"; /** * util.js */ 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 (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.appendLeadingZeros = exports.pruneLeadingZeros = exports.getJwkType = exports.getSec1KeyType = exports.getAsn1KeyType = exports.isAsn1Public = exports.isAsn1Encrypted = void 0; var js_encoding_utils_1 = __importDefault(require("js-encoding-utils")); var params = __importStar(require("./params")); var asn1def_1 = require("./asn1def"); /** * Check if the given key is encrypted. * @param {DER|PEM} key - Private key object in ASN.1 encoding. * @param {AsnFormat} [format='pem'] - pem or der * @return {boolean} - True if encrypted. */ var isAsn1Encrypted = function (key, format) { if (format === void 0) { format = 'pem'; } var keyType; try { keyType = (0, exports.getAsn1KeyType)(key, format); } catch (e) { return false; } return keyType === 'encryptedPrivate'; }; exports.isAsn1Encrypted = isAsn1Encrypted; /** * Check if the given key is public. * @param {DER|PEM} key - Public key object in ASN.1 encoding. * @param {AsnFormat} format - pem or der * @return {boolean} - True if public. */ var isAsn1Public = function (key, format) { if (format === void 0) { format = 'pem'; } var keyType; try { keyType = (0, exports.getAsn1KeyType)(key, format); } catch (e) { return false; } return (keyType === 'public'); }; exports.isAsn1Public = isAsn1Public; /** * Retrieve the key type of public or private in ASN.1 format * @param {DER|PEM} key - Key object in ASN.1 encoding. * @param {AsnFormat} format - pem or der * @return {'public'|'private'|'encryptedPrivate'} - The key type of the given key. * @throws {Error} - Throws if NotSpkiNorPkcs8Key. */ var getAsn1KeyType = function (key, format) { if (format === void 0) { format = 'pem'; } // Peel the pem strings var binKey = (format === 'pem') ? js_encoding_utils_1.default.formatter.pemToBin(key) : key; var decoded = asn1def_1.KeyStructure.decode(Buffer.from(binKey), 'der'); if (decoded.type === 'encryptedPrivateKeyInfo') return 'encryptedPrivate'; else if (decoded.type === 'oneAsymmetricKey') return 'private'; else if (decoded.type === 'subjectPublicKeyInfo') return 'public'; else throw new Error('NotSpkiNorPkcs8Key'); }; exports.getAsn1KeyType = getAsn1KeyType; /** * Retrieve the type of SEC1 octet key. * @param {OctetEC} sec1key - Key object in OctetEC encoding of Uint8Array. * @param {CurveTypes} namedCurve - Name of elliptic curve like 'P-256'. * @return {PublicOrPrivate} - public or private * @throws {Error} - Throws if UnsupportedKeyStructure. */ var getSec1KeyType = function (sec1key, namedCurve) { var len = params.namedCurves[namedCurve].payloadSize; var binKey = (sec1key instanceof Uint8Array) ? sec1key : js_encoding_utils_1.default.encoder.hexStringToArrayBuffer(sec1key); // original key type if (binKey.length <= len) return 'private'; else if ((binKey.length === 2 * len + 1 && binKey[0] === 0x04) || (binKey.length === len + 1 && (binKey[0] === 0x02 || binKey[0] === 0x03))) return 'public'; else throw new Error('UnsupportedKeyStructure'); }; exports.getSec1KeyType = getSec1KeyType; /** * Check key type of JWK. * @param {JsonWebKey} jwkey - Key object in JWK format. * @return {PublicOrPrivate} - public or private * @throws {Error} - Throws if InvalidECKey, InvalidRSAKey or UnsupportedJWKType. */ var getJwkType = function (jwkey) { if (jwkey.kty === 'EC') { if (jwkey.x && jwkey.y && jwkey.d) return 'private'; else if (jwkey.x && jwkey.y) return 'public'; else throw new Error('InvalidECKey'); } else if (jwkey.kty === 'RSA') { if (jwkey.n && jwkey.e && jwkey.d && jwkey.p && jwkey.q && jwkey.dp && jwkey.dq && jwkey.qi) return 'private'; else if (jwkey.n && jwkey.e) return 'public'; else throw new Error('InvalidRSAKey'); } else throw new Error('UnsupportedJWKType'); }; exports.getJwkType = getJwkType; /** * Prune leading zeros of an octet sequence in Uint8Array for jwk formatting of RSA. * https://tools.ietf.org/html/rfc7518#section-6.3 * @param {Uint8Array} array - The octet sequence. * @return {Uint8Array} - An octet sequence pruned leading zeros of length equal to or shorter than the input array. * @throws {Error} - Throws if NonUint8Array. */ var pruneLeadingZeros = function (array) { var offset = 0; for (var i = 0; i < array.length; i++) { if (array[i] !== 0x00) break; offset++; } var returnArray = new Uint8Array(array.length - offset); returnArray.set(array.slice(offset, array.length)); return returnArray; }; exports.pruneLeadingZeros = pruneLeadingZeros; // for pem/oct/der formatting from jwk of RSA /** * Append leading zeros and generate an octet sequence of fixed length. * @param {Uint8Array} array - An octet sequence. * @param {Number} len - Intended length of output sequence. * @returns {Uint8Array} - An octet sequence with leading zeros. * @throws {Error} - Throws if NonUint8Array or InvalidLength. */ var appendLeadingZeros = function (array, len) { if (array.length > len) throw new Error('InvalidLength'); var returnArray = new Uint8Array(len); // initialized with zeros returnArray.set(array, len - array.length); return returnArray; }; exports.appendLeadingZeros = appendLeadingZeros; //# sourceMappingURL=util.js.map