js-crypto-key-utils
Version:
Universal Module for Cryptographic Key Utilities in JavaScript, including PEM-JWK converters
176 lines • 6.79 kB
JavaScript
/**
* 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
;