Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

pem

Package Overview
Dependencies
Maintainers
1
Versions
56
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

pem - npm Package Compare versions

Comparing version 1.4.5 to 1.4.6

.jshintrc

557

lib/pem.js

@@ -1,14 +0,14 @@

"use strict";
'use strict';
var spawn = require("child_process").spawn,
os = require("os"),
pathlib = require("path"),
fs = require("fs"),
net = require("net"),
crypto = require("crypto"),
var spawn = require('child_process').spawn,
os = require('os'),
pathlib = require('path'),
fs = require('fs'),
net = require('net'),
crypto = require('crypto'),
pathOpenSSL,
tempDir = process.env.PEMJS_TMPDIR || (os.tmpdir || os.tmpDir) && (os.tmpdir || os.tmpDir)() || "/tmp";
tempDir = process.env.PEMJS_TMPDIR || (os.tmpdir || os.tmpDir) && (os.tmpdir || os.tmpDir)() || '/tmp';
module.exports.createPrivateKey = createPrivateKey;
module.exports.createCSR =createCSR;
module.exports.createCSR = createCSR;
module.exports.createCertificate = createCertificate;

@@ -29,4 +29,4 @@ module.exports.readCertificateInfo = readCertificateInfo;

*/
function createPrivateKey(keyBitsize, callback){
if(!callback && typeof keyBitsize == "function"){
function createPrivateKey(keyBitsize, callback) {
if (!callback && typeof keyBitsize === 'function') {
callback = keyBitsize;

@@ -38,13 +38,15 @@ keyBitsize = undefined;

var params = ["genrsa",
"-rand",
"/var/log/mail:/var/log/messages",
keyBitsize
];
var params = ['genrsa',
'-rand',
'/var/log/mail:/var/log/messages',
keyBitsize
];
execOpenSSL(params, "RSA PRIVATE KEY", function(error, key){
if(error){
execOpenSSL(params, 'RSA PRIVATE KEY', function(error, key) {
if (error) {
return callback(error);
}
return callback(null, {key: key});
return callback(null, {
key: key
});
});

@@ -68,3 +70,3 @@ }

* @param {String} [options.organizationUnit] CSR organizational unit field
* @param {String} [options.commonName="localhost"] CSR common name field
* @param {String} [options.commonName='localhost'] CSR common name field
* @param {String} [options.emailAddress] CSR email address field

@@ -76,4 +78,4 @@ * @param {Array} [options.altNames] is a list of subjectAltNames in the subjectAltName field

function createCSR(options, callback){
if(!callback && typeof options == "function"){
function createCSR(options, callback) {
if (!callback && typeof options === 'function') {
callback = options;

@@ -89,3 +91,3 @@ options = undefined;

options.altNames = [options.commonName];
} else if (options.altNames.indexOf(options.commonName) == -1) {
} else if (options.altNames.indexOf(options.commonName) === -1) {
options.altNames = options.altNames.concat([options.commonName]);

@@ -95,5 +97,5 @@ }

if(!options.clientKey){
createPrivateKey(options.keyBitsize || 2048, function(error, keyData){
if(error){
if (!options.clientKey) {
createPrivateKey(options.keyBitsize || 2048, function(error, keyData) {
if (error) {
return callback(error);

@@ -107,10 +109,10 @@ }

var params = ["req",
"-new",
"-" + (options.hash || "sha256"),
"-subj",
generateCSRSubject(options),
"-key",
"--TMPFILE--"
];
var params = ['req',
'-new',
'-' + (options.hash || 'sha256'),
'-subj',
generateCSRSubject(options),
'-key',
'--TMPFILE--'
];
var tmpfiles = [options.clientKey];

@@ -120,34 +122,34 @@ var config = null;

if (options.altNames) {
params.push("-extensions");
params.push("v3_req");
params.push("-config");
params.push("--TMPFILE--");
params.push('-extensions');
params.push('v3_req');
params.push('-config');
params.push('--TMPFILE--');
var altNamesRep = [];
for (var i = 0; i < options.altNames.length; i++) {
altNamesRep.push((net.isIP(options.altNames[i]) ? "IP" : "DNS") + "." + (i+1) + " = " + options.altNames[i]);
altNamesRep.push((net.isIP(options.altNames[i]) ? 'IP' : 'DNS') + '.' + (i + 1) + ' = ' + options.altNames[i]);
}
tmpfiles.push(config = [
"[req]",
"req_extensions = v3_req",
"distinguished_name = req_distinguished_name",
"[v3_req]",
"subjectAltName = @alt_names",
"[alt_names]",
altNamesRep.join("\n"),
"[req_distinguished_name]",
"commonName = Common Name",
"commonName_max = 64",
].join("\n"));
'[req]',
'req_extensions = v3_req',
'distinguished_name = req_distinguished_name',
'[v3_req]',
'subjectAltName = @alt_names',
'[alt_names]',
altNamesRep.join('\n'),
'[req_distinguished_name]',
'commonName = Common Name',
'commonName_max = 64',
].join('\n'));
}
execOpenSSL(params, "CERTIFICATE REQUEST", tmpfiles, function(error, data){
if(error){
execOpenSSL(params, 'CERTIFICATE REQUEST', tmpfiles, function(error, data) {
if (error) {
return callback(error);
}
var response = {
csr: data,
config: config,
clientKey: options.clientKey
};
csr: data,
config: config,
clientKey: options.clientKey
};
return callback(null, response);

@@ -171,4 +173,4 @@

*/
function createCertificate(options, callback){
if(!callback && typeof options == "function"){
function createCertificate(options, callback) {
if (!callback && typeof options === 'function') {
callback = options;

@@ -180,5 +182,5 @@ options = undefined;

if(!options.csr){
createCSR(options, function(error, keyData){
if(error){
if (!options.csr) {
createCSR(options, function(error, keyData) {
if (error) {
return callback(error);

@@ -194,9 +196,9 @@ }

if(!options.serviceKey){
if (!options.serviceKey) {
if(options.selfSigned){
if (options.selfSigned) {
options.serviceKey = options.clientKey;
}else{
createPrivateKey(options.keyBitsize || 2048, function(error, keyData){
if(error){
} else {
createPrivateKey(options.keyBitsize || 2048, function(error, keyData) {
if (error) {
return callback(error);

@@ -211,10 +213,10 @@ }

var params = ["x509",
"-req",
"-" + (options.hash || "sha256"),
"-days",
Number(options.days) || "365",
"-in",
"--TMPFILE--"
];
var params = ['x509',
'-req',
'-' + (options.hash || 'sha256'),
'-days',
Number(options.days) || '365',
'-in',
'--TMPFILE--'
];
var tmpfiles = [options.csr];

@@ -224,15 +226,15 @@

if (!options.serial) {
return callback(new Error("serial option required for CA signing"));
return callback(new Error('serial option required for CA signing'));
}
params.push("-CA");
params.push("--TMPFILE--");
params.push("-CAkey");
params.push("--TMPFILE--");
params.push("-set_serial");
params.push("0x" + ("00000000" + options.serial.toString(16)).slice(-8));
params.push('-CA');
params.push('--TMPFILE--');
params.push('-CAkey');
params.push('--TMPFILE--');
params.push('-set_serial');
params.push('0x' + ('00000000' + options.serial.toString(16)).slice(-8));
tmpfiles.push(options.serviceCertificate);
tmpfiles.push(options.serviceKey);
} else {
params.push("-signkey");
params.push("--TMPFILE--");
params.push('-signkey');
params.push('--TMPFILE--');
tmpfiles.push(options.serviceKey);

@@ -242,19 +244,19 @@ }

if (options.config) {
params.push("-extensions");
params.push("v3_req");
params.push("-extfile");
params.push("--TMPFILE--");
params.push('-extensions');
params.push('v3_req');
params.push('-extfile');
params.push('--TMPFILE--');
tmpfiles.push(options.config);
}
execOpenSSL(params, "CERTIFICATE", tmpfiles, function(error, data){
if(error){
execOpenSSL(params, 'CERTIFICATE', tmpfiles, function(error, data) {
if (error) {
return callback(error);
}
var response = {
csr: options.csr,
clientKey: options.clientKey,
certificate: data,
serviceKey: options.serviceKey
};
csr: options.csr,
clientKey: options.clientKey,
certificate: data,
serviceKey: options.serviceKey
};
return callback(null, response);

@@ -270,4 +272,4 @@ });

*/
function getPublicKey(certificate, callback){
if(!callback && typeof certificate == "function"){
function getPublicKey(certificate, callback) {
if (!callback && typeof certificate === 'function') {
callback = certificate;

@@ -277,30 +279,35 @@ certificate = undefined;

certificate = (certificate || "").toString();
certificate = (certificate || '').toString();
var params;
if(certificate.match(/BEGIN(\sNEW)? CERTIFICATE REQUEST/)){
params = ["req",
"-in",
"--TMPFILE--",
"-pubkey",
"-noout"];
}else if(certificate.match(/BEGIN RSA PRIVATE KEY/)){
params = ["rsa",
"-in",
"--TMPFILE--",
"-pubout"];
}else{
params = ["x509",
"-in",
"--TMPFILE--",
"-pubkey",
"-noout"];
if (certificate.match(/BEGIN(\sNEW)? CERTIFICATE REQUEST/)) {
params = ['req',
'-in',
'--TMPFILE--',
'-pubkey',
'-noout'
];
} else if (certificate.match(/BEGIN RSA PRIVATE KEY/)) {
params = ['rsa',
'-in',
'--TMPFILE--',
'-pubout'
];
} else {
params = ['x509',
'-in',
'--TMPFILE--',
'-pubkey',
'-noout'
];
}
execOpenSSL(params, "PUBLIC KEY", certificate, function(error, key){
if(error){
execOpenSSL(params, 'PUBLIC KEY', certificate, function(error, key) {
if (error) {
return callback(error);
}
return callback(null, {publicKey: key});
return callback(null, {
publicKey: key
});
});

@@ -315,4 +322,4 @@ }

*/
function readCertificateInfo(certificate, callback){
if(!callback && typeof certificate == "function"){
function readCertificateInfo(certificate, callback) {
if (!callback && typeof certificate === 'function') {
callback = certificate;

@@ -322,12 +329,12 @@ certificate = undefined;

certificate = (certificate || "").toString();
certificate = (certificate || '').toString();
var type = certificate.match(/BEGIN(\sNEW)? CERTIFICATE REQUEST/)?"req":"x509",
var type = certificate.match(/BEGIN(\sNEW)? CERTIFICATE REQUEST/) ? 'req' : 'x509',
params = [type,
"-noout",
"-text",
"-in",
"--TMPFILE--"
];
spawnWrapper(params, certificate, function(err, code, stdout){
'-noout',
'-text',
'-in',
'--TMPFILE--'
];
spawnWrapper(params, certificate, function(err, code, stdout) {
if (err) {

@@ -346,20 +353,20 @@ return callback(err);

*/
function getModulus(certificate, callback){
function getModulus(certificate, callback) {
certificate = Buffer.isBuffer(certificate) && certificate.toString() || certificate;
var type = "";
if ( certificate.match(/BEGIN(\sNEW)? CERTIFICATE REQUEST/)){
type="req";
}else if ( certificate.match(/BEGIN RSA PRIVATE KEY/)){
type="rsa";
}else {
type="x509";
var type = '';
if (certificate.match(/BEGIN(\sNEW)? CERTIFICATE REQUEST/)) {
type = 'req';
} else if (certificate.match(/BEGIN RSA PRIVATE KEY/)) {
type = 'rsa';
} else {
type = 'x509';
}
var params = [type,
"-noout",
"-modulus",
"-in",
"--TMPFILE--"
'-noout',
'-modulus',
'-in',
'--TMPFILE--'
];
spawnWrapper(params, certificate, function(err, code, stdout){
spawnWrapper(params, certificate, function(err, code, stdout) {
if (err) {

@@ -369,6 +376,8 @@ return callback(err);

var match = stdout.match(/Modulus=([0-9a-fA-F]+)$/m);
if (match){
return callback(null, {modulus: match[1]});
if (match) {
return callback(null, {
modulus: match[1]
});
} else {
return callback(new Error("No modulus"));
return callback(new Error('No modulus'));
}

@@ -382,4 +391,4 @@ });

*/
function config(options){
if (options.pathOpenSSL){
function config(options) {
if (options.pathOpenSSL) {
pathOpenSSL = options.pathOpenSSL;

@@ -395,10 +404,11 @@ }

*/
function getFingerprint(certificate, callback){
var params = ["x509",
"-in",
"--TMPFILE--",
"-fingerprint",
"-noout"];
function getFingerprint(certificate, callback) {
var params = ['x509',
'-in',
'--TMPFILE--',
'-fingerprint',
'-noout'
];
spawnWrapper(params, certificate, function(err, code, stdout){
spawnWrapper(params, certificate, function(err, code, stdout) {
if (err) {

@@ -408,6 +418,8 @@ return callback(err);

var match = stdout.match(/Fingerprint=([0-9a-fA-F:]+)$/m);
if (match){
return callback(null, {fingerprint: match[1]});
if (match) {
return callback(null, {
fingerprint: match[1]
});
} else {
return callback(new Error("No fingerprint"));
return callback(new Error('No fingerprint'));
}

@@ -419,55 +431,62 @@ });

function fetchCertificateData(certData, callback){
certData = (certData || "").toString();
function fetchCertificateData(certData, callback) {
certData = (certData || '').toString();
var subject,subject2, extra, tmp, certValues = {};
var subject, subject2, extra, tmp, certValues = {};
var validity = {};
var san;
if((subject = certData.match(/Subject:([^\n]*)\n/)) && subject.length>1){
subject2 = linebrakes(subject[1]+'\n');
if ((subject = certData.match(/Subject:([^\n]*)\n/)) && subject.length > 1) {
subject2 = linebrakes(subject[1] + '\n');
subject = subject[1];
extra = subject.split("/");
subject = extra.shift()+"\n";
extra = extra.join("/")+"\n";
extra = subject.split('/');
subject = extra.shift() + '\n';
extra = extra.join('/') + '\n';
// country
tmp = subject2.match(/\sC=([^\n].*?)[\n]/);
certValues.country = tmp && tmp[1] || "";
certValues.country = tmp && tmp[1] || '';
// state
tmp = subject2.match(/\sST=([^\n].*?)[\n]/);
certValues.state = tmp && tmp[1] || "";
certValues.state = tmp && tmp[1] || '';
// locality
tmp = subject2.match(/\sL=([^\n].*?)[\n]/);
certValues.locality = tmp && tmp[1] || "";
certValues.locality = tmp && tmp[1] || '';
// organization
tmp = subject2.match(/\sO=([^\n].*?)[\n]/);
certValues.organization = tmp && tmp[1] || "";
certValues.organization = tmp && tmp[1] || '';
// unit
tmp = subject2.match(/\sOU=([^\n].*?)[\n]/);
certValues.organizationUnit = tmp && tmp[1] || "";
certValues.organizationUnit = tmp && tmp[1] || '';
// common name
tmp = subject2.match(/\sCN=([^\n].*?)[\n]/);
certValues.commonName = tmp && tmp[1] || "";
certValues.commonName = tmp && tmp[1] || '';
//email
tmp = extra.match(/emailAddress=([^\n\/].*?)[\n\/]/);
certValues.emailAddress = tmp && tmp[1] || "";
certValues.emailAddress = tmp && tmp[1] || '';
}
if((san = certData.match(/X509v3 Subject Alternative Name: \n([^\n]*)\n/)) && san.length>1){
san = san[1].trim()+'\n';
if ((san = certData.match(/X509v3 Subject Alternative Name: \n([^\n]*)\n/)) && san.length > 1) {
san = san[1].trim() + '\n';
certValues.san = {};
// country
tmp = preg_match_all('DNS:([^,\\n].*?)[,\\n]',san);
certValues.san.dns = tmp || "";
tmp = preg_match_all('DNS:([^,\\n].*?)[,\\n]', san);
certValues.san.dns = tmp || '';
// country
tmp = preg_match_all('IP Address:([^,\\n].*?)[,\\n\\s]',san);
certValues.san.ip = tmp || "";
tmp = preg_match_all('IP Address:([^,\\n].*?)[,\\n\\s]', san);
certValues.san.ip = tmp || '';
}
if ((tmp = certData.match(/Not Before\s?:\s?([^\n]*)\n/)) && tmp.length>1)
validity.start = Date.parse(tmp && tmp[1] || "");
if ((tmp = certData.match(/Not After\s?:\s?([^\n]*)\n/)) && tmp.length>1)
validity.end = Date.parse(tmp && tmp[1] || "");
if (validity.start && validity.end)
certValues.validity = validity;
if ((tmp = certData.match(/Not Before\s?:\s?([^\n]*)\n/)) && tmp.length > 1) {
validity.start = Date.parse(tmp && tmp[1] || '');
}
if ((tmp = certData.match(/Not After\s?:\s?([^\n]*)\n/)) && tmp.length > 1) {
validity.end = Date.parse(tmp && tmp[1] || '');
}
if (validity.start && validity.end) {
certValues.validity = validity;
}
callback(null, certValues);

@@ -477,37 +496,37 @@ }

function linebrakes (content){
var helper_x, p,subject;
helper_x = content.replace(/(C|L|O|OU|ST|CN)=/g, "\n$1=");
helper_x = preg_match_all('((C|L|O|OU|ST|CN)=[^\n].*)',helper_x);
for(p in helper_x){
subject = helper_x[p].trim();
content = subject.split("/");
subject = content.shift();
helper_x[p] = rtrim(subject,',');
function linebrakes(content) {
var helper_x, p, subject;
helper_x = content.replace(/(C|L|O|OU|ST|CN)=/g, '\n$1=');
helper_x = preg_match_all('((C|L|O|OU|ST|CN)=[^\n].*)', helper_x);
for (p in helper_x) {
subject = helper_x[p].trim();
content = subject.split('/');
subject = content.shift();
helper_x[p] = rtrim(subject, ',');
}
return ' ' + helper_x.join('\n') + '\n';
}
return " " + helper_x.join('\n') + "\n";
}
function rtrim(str, charlist) {
charlist = !charlist ? ' \\s\u00A0' : (charlist + '')
.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\\$1');
var re = new RegExp('[' + charlist + ']+$', 'g');
return (str + '')
.replace(re, '');
charlist = !charlist ? ' \\s\u00A0' : (charlist + '')
.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\\$1');
var re = new RegExp('[' + charlist + ']+$', 'g');
return (str + '')
.replace(re, '');
}
function preg_match_all(regex, haystack) {
var globalRegex = new RegExp(regex, 'g');
var globalMatch = haystack.match(globalRegex);
var matchArray = [], nonGlobalRegex, nonGlobalMatch;
for (var i in globalMatch) {
nonGlobalRegex = new RegExp(regex);
nonGlobalMatch = globalMatch[i].match(nonGlobalRegex);
matchArray.push(nonGlobalMatch[1]);
}
return matchArray;
var globalRegex = new RegExp(regex, 'g');
var globalMatch = haystack.match(globalRegex);
var matchArray = [],
nonGlobalRegex, nonGlobalMatch;
for (var i in globalMatch) {
nonGlobalRegex = new RegExp(regex);
nonGlobalMatch = globalMatch[i].match(nonGlobalRegex);
matchArray.push(nonGlobalMatch[1]);
}
return matchArray;
}
function generateCSRSubject(options){
function generateCSRSubject(options) {

@@ -517,19 +536,19 @@ options = options || {};

var csrData = {
C: options.country || options.C || "",
ST: options.state || options.ST || "",
L: options.locality || options.L || "",
O: options.organization || options.O || "",
OU: options.organizationUnit || options.OU || "",
CN: options.commonName || options.CN || "localhost",
emailAddress: options.emailAddress || ""
C: options.country || options.C || '',
ST: options.state || options.ST || '',
L: options.locality || options.L || '',
O: options.organization || options.O || '',
OU: options.organizationUnit || options.OU || '',
CN: options.commonName || options.CN || 'localhost',
emailAddress: options.emailAddress || ''
},
csrBuilder = [];
Object.keys(csrData).forEach(function(key){
if(csrData[key]){
csrBuilder.push("/" + key + "=" + csrData[key].replace(/[^\w \.\*\-@]+/g, " ").trim());
Object.keys(csrData).forEach(function(key) {
if (csrData[key]) {
csrBuilder.push('/' + key + '=' + csrData[key].replace(/[^\w \.\*\-@]+/g, ' ').trim());
}
});
return csrBuilder.join("");
return csrBuilder.join('');
}

@@ -547,11 +566,11 @@

var openssl = spawn(pathBin, params),
stdout = "",
stderr = "";
stdout = '',
stderr = '';
openssl.stdout.on('data', function (data) {
stdout += (data || "").toString("binary");
openssl.stdout.on('data', function(data) {
stdout += (data || '').toString('binary');
});
openssl.stderr.on('data', function (data) {
stderr += (data || "").toString("binary");
openssl.stderr.on('data', function(data) {
stderr += (data || '').toString('binary');
});

@@ -562,39 +581,49 @@

// making this fail periodically.
var needed = 2; // wait for both exit and close.
var needed = 2; // wait for both exit and close.
var code = -1;
var bothDone = function() {
if (code) {
callback(new Error("Invalid openssl exit code: " + code + "\n% openssl " + params.join(" ") + "\n" + stderr), code);
} else {
callback(null, code, stdout, stderr);
var finished = false;
var done = function(err) {
if (finished) {
return;
}
};
openssl.on('exit', function (ret) {
code = ret;
if (err) {
finished = true;
return callback(err);
}
if (--needed < 1) {
bothDone();
finished = true;
if (code) {
callback(new Error('Invalid openssl exit code: ' + code + '\n% openssl ' + params.join(' ') + '\n' + stderr), code);
} else {
callback(null, code, stdout, stderr);
}
}
});
};
openssl.on('close', function () {
stdout = new Buffer(stdout, "binary").toString("utf-8");
stderr = new Buffer(stderr, "binary").toString("utf-8");
openssl.on('error', done);
if (--needed < 1) {
bothDone();
}
openssl.on('exit', function(ret) {
code = ret;
done();
});
openssl.on('close', function() {
stdout = new Buffer(stdout, 'binary').toString('utf-8');
stderr = new Buffer(stderr, 'binary').toString('utf-8');
done();
});
}
function spawnWrapper(params, tmpfiles, callback){
function spawnWrapper(params, tmpfiles, callback) {
var files = [];
var toUnlink = [];
if(tmpfiles){
if (tmpfiles) {
tmpfiles = [].concat(tmpfiles || []);
params.forEach(function(value, i){
params.forEach(function(value, i) {
var fpath;
if(value == "--TMPFILE--"){
fpath = pathlib.join(tempDir, crypto.randomBytes(20).toString("hex"));
if (value === '--TMPFILE--') {
fpath = pathlib.join(tempDir, crypto.randomBytes(20).toString('hex'));
files.push({

@@ -609,10 +638,10 @@ path: fpath,

var processFiles = function(){
var processFiles = function() {
var file = files.shift();
if(!file){
if (!file) {
return spawnSSL();
}
fs.writeFile(file.path, file.contents, function(){
fs.writeFile(file.path, file.contents, function() {
toUnlink.push(file.path);

@@ -623,5 +652,5 @@ processFiles();

var spawnSSL = function(){
var spawnSSL = function() {
spawnOpenSSL(params, function(err, code, stdout, stderr) {
toUnlink.forEach(function(filePath){
toUnlink.forEach(function(filePath) {
fs.unlink(filePath);

@@ -640,4 +669,4 @@ });

*/
function execOpenSSL(params, searchStr, tmpfiles, callback){
if(!callback && typeof tmpfiles == "function"){
function execOpenSSL(params, searchStr, tmpfiles, callback) {
if (!callback && typeof tmpfiles === 'function') {
callback = tmpfiles;

@@ -654,20 +683,20 @@ tmpfiles = false;

if((start = stdout.match(new RegExp("\\-+BEGIN "+searchStr+"\\-+$", "m")))){
if ((start = stdout.match(new RegExp('\\-+BEGIN ' + searchStr + '\\-+$', 'm')))) {
start = start.index;
}else{
} else {
start = -1;
}
if((end = stdout.match(new RegExp("^\\-+END "+searchStr+"\\-+", "m")))){
end = end.index + (end[0] || "").length;
}else{
if ((end = stdout.match(new RegExp('^\\-+END ' + searchStr + '\\-+', 'm')))) {
end = end.index + (end[0] || '').length;
} else {
end = -1;
}
if(start >= 0 && end >=0){
if (start >= 0 && end >= 0) {
return callback(null, stdout.substring(start, end));
}else{
return callback(new Error(searchStr + " not found from openssl output:\n---stdout---\n" + stdout + "\n---stderr---\n" + stderr + "\ncode: " + code));
} else {
return callback(new Error(searchStr + ' not found from openssl output:\n---stdout---\n' + stdout + '\n---stderr---\n' + stderr + '\ncode: ' + code));
}
});
}
}

@@ -5,3 +5,3 @@ {

"description": "Create private keys and certificates with node.js",
"version": "1.4.5",
"version": "1.4.6",
"repository": {

@@ -23,2 +23,2 @@ "type": "git",

}
}
}

@@ -38,7 +38,7 @@ pem

var app = express();
app.get('/', requireAuth, function(req, res){
res.send("o hai!");
});
https.createServer({key: keys.serviceKey, cert: keys.certificate}, app).listen(443);

@@ -130,3 +130,3 @@ });

* **callback** is a callback function with an error object and `{country, state, locality, organization, organizationUnit, commonName, emailAddress, validity{start, end}, san{dns, ip}? }`
? *san* is only present if the CSR or certificate has SAN entries.

@@ -158,4 +158,2 @@

**MIT**
**MIT**

@@ -1,14 +0,17 @@

var pem = require(".."),
testCase = require('nodeunit').testCase;
process.env.PEMJS_TMPDIR = "./tmp";
var fs = require("fs");
'use strict';
var pem = require('..');
var fs = require('fs');
process.env.PEMJS_TMPDIR = './tmp';
try {
fs.mkdirSync("./tmp");
fs.mkdirSync('./tmp');
} catch (e) {}
exports["General Tests"] = {
exports['General Tests'] = {
"Create default sized Private key": function(test){
pem.createPrivateKey(function(error, data){
var key = (data && data.key || "").toString();
'Create default sized Private key': function(test) {
pem.createPrivateKey(function(error, data) {
var key = (data && data.key || '').toString();
test.ifError(error);

@@ -19,3 +22,3 @@ test.ok(key);

test.ok(key.trim().length > 850 && key.trim().length < 1900);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -25,5 +28,5 @@ });

"Create 2048bit Private key": function(test){
pem.createPrivateKey(2048, function(error, data){
var key = (data && data.key || "").toString();
'Create 2048bit Private key': function(test) {
pem.createPrivateKey(2048, function(error, data) {
var key = (data && data.key || '').toString();
test.ifError(error);

@@ -34,3 +37,3 @@ test.ok(key);

test.ok(key.trim().length > 1650 && key.trim().length < 1700);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -40,5 +43,5 @@ });

"Create default CSR": function(test){
pem.createCSR(function(error, data){
var csr = (data && data.csr || "").toString();
'Create default CSR': function(test) {
pem.createCSR(function(error, data) {
var csr = (data && data.csr || '').toString();
test.ifError(error);

@@ -50,3 +53,3 @@ test.ok(csr);

test.ok(data && data.clientKey);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -56,8 +59,10 @@ });

"Create CSR with own key": function(test){
pem.createPrivateKey(function(error, data){
var key = (data && data.key || "").toString();
'Create CSR with own key': function(test) {
pem.createPrivateKey(function(error, data) {
var key = (data && data.key || '').toString();
pem.createCSR({clientKey: key}, function(error, data){
var csr = (data && data.csr || "").toString();
pem.createCSR({
clientKey: key
}, function(error, data) {
var csr = (data && data.csr || '').toString();
test.ifError(error);

@@ -71,12 +76,11 @@ test.ok(csr);

test.ok(data && data.clientKey);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();
});
});
},
"Create default certificate": function(test){
pem.createCertificate(function(error, data){
var certificate = (data && data.certificate || "").toString();
'Create default certificate': function(test) {
pem.createCertificate(function(error, data) {
var certificate = (data && data.certificate || '').toString();
test.ifError(error);

@@ -87,3 +91,3 @@ test.ok(certificate);

test.ok((data && data.clientKey) != (data && data.serviceKey));
test.ok((data && data.clientKey) !== (data && data.serviceKey));

@@ -93,3 +97,3 @@ test.ok(data && data.clientKey);

test.ok(data && data.csr);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -99,5 +103,7 @@ });

"Create self signed certificate": function(test){
pem.createCertificate({selfSigned: true}, function(error, data){
var certificate = (data && data.certificate || "").toString();
'Create self signed certificate': function(test) {
pem.createCertificate({
selfSigned: true
}, function(error, data) {
var certificate = (data && data.certificate || '').toString();
test.ifError(error);

@@ -108,3 +114,3 @@ test.ok(certificate);

test.ok((data && data.clientKey) == (data && data.serviceKey));
test.ok((data && data.clientKey) === (data && data.serviceKey));

@@ -114,3 +120,3 @@ test.ok(data && data.clientKey);

test.ok(data && data.csr);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -120,11 +126,11 @@ });

"Read default cert data from CSR": function(test){
pem.createCSR(function(error, data){
var csr = (data && data.csr || "").toString();
'Read default cert data from CSR': function(test) {
pem.createCSR(function(error, data) {
var csr = (data && data.csr || '').toString();
test.ifError(error);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.readCertificateInfo(csr, function(error, data){
pem.readCertificateInfo(csr, function(error, data) {
test.ifError(error);
test.deepEqual(data,{
test.deepEqual(data, {
country: '',

@@ -136,4 +142,5 @@ state: '',

commonName: 'localhost',
emailAddress: '' });
test.ok(fs.readdirSync("./tmp").length == 0);
emailAddress: ''
});
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -144,19 +151,21 @@ });

"Read edited cert data from CSR": function(test){
var certInfo = {country:"EE",
state:"Harjumaa",
locality:"Tallinn",
organization:"Node.ee",
organizationUnit:"test",
commonName:"www.node.ee",
emailAddress:"andris@node.ee"};
pem.createCSR(Object.create(certInfo), function(error, data){
var csr = (data && data.csr || "").toString();
'Read edited cert data from CSR': function(test) {
var certInfo = {
country: 'EE',
state: 'Harjumaa',
locality: 'Tallinn',
organization: 'Node.ee',
organizationUnit: 'test',
commonName: 'www.node.ee',
emailAddress: 'andris@node.ee'
};
pem.createCSR(Object.create(certInfo), function(error, data) {
var csr = (data && data.csr || '').toString();
test.ifError(error);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.readCertificateInfo(csr, function(error, data){
pem.readCertificateInfo(csr, function(error, data) {
test.ifError(error);
test.deepEqual(data, certInfo);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -167,13 +176,16 @@ });

"Read default cert data from certificate": function(test){
pem.createCertificate(function(error, data){
var certificate = (data && data.certificate || "").toString();
'Read default cert data from certificate': function(test) {
pem.createCertificate(function(error, data) {
var certificate = (data && data.certificate || '').toString();
test.ifError(error);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.readCertificateInfo(certificate, function(error, data){
pem.readCertificateInfo(certificate, function(error, data) {
test.ifError(error);
if(data.validity)
if (data.validity) {
delete data.validity;
test.deepEqual(data,{
}
test.deepEqual(data, {
country: '',

@@ -185,4 +197,5 @@ state: '',

commonName: 'localhost',
emailAddress: '' });
test.ok(fs.readdirSync("./tmp").length == 0);
emailAddress: ''
});
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -193,21 +206,26 @@ });

"Read edited cert data from certificate": function(test){
var certInfo = {country:"EE",
state:"Harjumaa",
locality:"Tallinn",
organization:"Node.ee",
organizationUnit:"test",
commonName:"www.node.ee",
emailAddress:"andris@node.ee"};
pem.createCertificate(Object.create(certInfo), function(error, data){
var certificate = (data && data.certificate || "").toString();
'Read edited cert data from certificate': function(test) {
var certInfo = {
country: 'EE',
state: 'Harjumaa',
locality: 'Tallinn',
organization: 'Node.ee',
organizationUnit: 'test',
commonName: 'www.node.ee',
emailAddress: 'andris@node.ee'
};
pem.createCertificate(Object.create(certInfo), function(error, data) {
var certificate = (data && data.certificate || '').toString();
test.ifError(error);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.readCertificateInfo(certificate, function(error, data){
pem.readCertificateInfo(certificate, function(error, data) {
test.ifError(error);
if(data.validity)
if (data.validity) {
delete data.validity;
}
test.deepEqual(data, certInfo);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -218,11 +236,11 @@ });

"Get public key from private key": function(test){
pem.createPrivateKey(function(error, data){
var key = (data && data.key || "").toString();
'Get public key from private key': function(test) {
pem.createPrivateKey(function(error, data) {
var key = (data && data.key || '').toString();
test.ifError(error);
test.ok(key);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.getPublicKey(key, function(error, data){
var pubkey = (data && data.publicKey || "").toString();
pem.getPublicKey(key, function(error, data) {
var pubkey = (data && data.publicKey || '').toString();
test.ifError(error);

@@ -233,19 +251,18 @@ test.ok(pubkey);

test.ok(pubkey.match(/\n\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-\n*$/));
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();
});
});
},
"Get public key from CSR": function(test){
pem.createCSR(function(error, data){
var key = (data && data.clientKey || "").toString();
'Get public key from CSR': function(test) {
pem.createCSR(function(error, data) {
var key = (data && data.clientKey || '').toString();
test.ifError(error);
test.ok(key);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.getPublicKey(key, function(error, data){
var pubkey = (data && data.publicKey || "").toString();
pem.getPublicKey(key, function(error, data) {
var pubkey = (data && data.publicKey || '').toString();
test.ifError(error);

@@ -256,19 +273,18 @@ test.ok(pubkey);

test.ok(pubkey.match(/\n\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-\n*$/));
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();
});
});
},
"Get public key from certificate": function(test){
pem.createCertificate(function(error, data){
var key = (data && data.clientKey || "").toString();
'Get public key from certificate': function(test) {
pem.createCertificate(function(error, data) {
var key = (data && data.clientKey || '').toString();
test.ifError(error);
test.ok(key);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.getPublicKey(key, function(error, data){
var pubkey = (data && data.publicKey || "").toString();
pem.getPublicKey(key, function(error, data) {
var pubkey = (data && data.publicKey || '').toString();
test.ifError(error);

@@ -279,69 +295,66 @@ test.ok(pubkey);

test.ok(pubkey.match(/\n\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-\n*$/));
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();
});
});
},
"Get fingerprint from certificate": function(test){
pem.createCertificate(function(error, data){
var certificate = (data && data.certificate || "").toString();
'Get fingerprint from certificate': function(test) {
pem.createCertificate(function(error, data) {
var certificate = (data && data.certificate || '').toString();
test.ifError(error);
test.ok(certificate);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.getFingerprint(certificate, function(error, data){
var fingerprint = (data && data.fingerprint || "").toString();
pem.getFingerprint(certificate, function(error, data) {
var fingerprint = (data && data.fingerprint || '').toString();
test.ifError(error);
test.ok(fingerprint);
test.ok(fingerprint.match(/^[0-9A-F]{2}(:[0-9A-F]{2}){19}$/));
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();
});
});
},
"Get modulus from certificate": function(test){
pem.createCertificate(function(error, data){
var certificate = (data && data.certificate || "").toString();
var key = (data && data.clientKey || "").toString();
'Get modulus from certificate': function(test) {
pem.createCertificate(function(error, data) {
var certificate = (data && data.certificate || '').toString();
test.ifError(error);
test.ok(certificate);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.getModulus(certificate, function(error, data){
var certmodulus = (data && data.modulus || "").toString();
pem.getModulus(certificate, function(error, data) {
var certmodulus = (data && data.modulus || '').toString();
test.ifError(error);
test.ok(certmodulus);
test.ok(certmodulus.match(/^[0-9A-F]*$/));
test.ok(fs.readdirSync("./tmp").length == 0);
pem.getModulus(certificate, function(error, data){
var keymodulus = (data && data.modulus || "").toString();
test.ok(fs.readdirSync('./tmp').length === 0);
pem.getModulus(certificate, function(error, data) {
var keymodulus = (data && data.modulus || '').toString();
test.ifError(error);
test.ok(keymodulus);
test.ok(keymodulus.match(/^[0-9A-F]*$/));
test.ok(keymodulus == certmodulus);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(keymodulus === certmodulus);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();
});
});
});
},
"Create and verify wildcard certificate": function(test) {
var certInfo = {commonName:"*.node.ee"};
pem.createCertificate(Object.create(certInfo), function(error, data){
var certificate = (data && data.certificate || "").toString();
'Create and verify wildcard certificate': function(test) {
var certInfo = {
commonName: '*.node.ee'
};
pem.createCertificate(Object.create(certInfo), function(error, data) {
var certificate = (data && data.certificate || '').toString();
test.ifError(error);
test.ok(fs.readdirSync("./tmp").length == 0);
test.ok(fs.readdirSync('./tmp').length === 0);
pem.readCertificateInfo(certificate, function(error, data){
pem.readCertificateInfo(certificate, function(error, data) {
test.ifError(error);
test.equal(data.commonName, certInfo.commonName);
test.ok(fs.readdirSync("./tmp").length == 0);
test.equal(data.commonName, certInfo.commonName);
test.ok(fs.readdirSync('./tmp').length === 0);
test.done();

@@ -351,2 +364,2 @@ });

}
};
};

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc