@parse/node-apn
Version:
An interface to the Apple Push Notification service for Node.js
56 lines (48 loc) • 1.5 kB
JavaScript
const forge = require('node-forge');
const APNKey = require('./APNKey');
function findAndDecryptKey(pemMessages, passphrase) {
let apnKey = null;
pemMessages.forEach(function (message) {
if (!message.type.match(/KEY/)) {
return;
}
const key = forge.pki.decryptRsaPrivateKey(forge.pem.encode(message), passphrase);
if (!key) {
if (
(message.procType && message.procType.type === 'ENCRYPTED') ||
message.type.match(/ENCRYPTED/)
) {
throw new Error('unable to parse key, incorrect passphrase');
}
} else if (apnKey) {
throw new Error('multiple keys found in PEM file');
} else {
apnKey = new APNKey(key);
}
});
return apnKey;
}
function apnKeyFromPem(keyPem, passphrase) {
if (!keyPem) {
return null;
}
try {
const pemMessages = forge.pem.decode(keyPem);
const apnKey = findAndDecryptKey(pemMessages, passphrase);
if (apnKey) {
return apnKey;
}
} catch (e) {
if (e.message.match(/Unsupported OID/)) {
throw new Error('unable to parse key, unsupported format: ' + e.oid);
} else if (e.message.match(/Invalid PEM formatted message/)) {
throw new Error('unable to parse key, not a valid PEM file');
} else if (e.message.match(/multiple keys/)) {
throw e;
} else if (e.message.match(/unable to parse key/)) {
throw e;
}
}
throw new Error('unable to parse key, no private key found');
}
module.exports = apnKeyFromPem;