support forge-only
This commit is contained in:
		
							parent
							
								
									3def25c44d
								
							
						
					
					
						commit
						58e43b8199
					
				
							
								
								
									
										115
									
								
								lib/letsencrypt-forge-extra.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								lib/letsencrypt-forge-extra.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,115 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * letiny-core
 | 
			
		||||
 * Copyright(c) 2015 AJ ONeal <aj@daplie.com> https://daplie.com
 | 
			
		||||
 * Apache-2.0 OR MIT (and hence also MPL 2.0)
 | 
			
		||||
*/
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
var crypto = require('crypto');
 | 
			
		||||
var forge = require('node-forge');
 | 
			
		||||
 | 
			
		||||
function binstrToB64(binstr) {
 | 
			
		||||
  return new Buffer(binstr, 'binary').toString('base64');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function b64ToBinstr(b64) {
 | 
			
		||||
  return new Buffer(b64, 'base64').toString('binary');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function toAcmePrivateKey(forgePrivkey) {
 | 
			
		||||
  //var forgePrivkey = forge.pki.privateKeyFromPem(privkeyPem);
 | 
			
		||||
 | 
			
		||||
  return {
 | 
			
		||||
    kty: "RSA"
 | 
			
		||||
  , n: binstrToB64(forgePrivkey.n)
 | 
			
		||||
  , e: binstrToB64(forgePrivkey.e)
 | 
			
		||||
  , d: binstrToB64(forgePrivkey.d)
 | 
			
		||||
  , p: binstrToB64(forgePrivkey.p)
 | 
			
		||||
  , q: binstrToB64(forgePrivkey.q)
 | 
			
		||||
  , dp: binstrToB64(forgePrivkey.dP)
 | 
			
		||||
  , dq: binstrToB64(forgePrivkey.dQ)
 | 
			
		||||
  , qi: binstrToB64(forgePrivkey.qInv)
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function toForgePrivateKey(forgePrivkey) {
 | 
			
		||||
  return forge.pki.rsa.setPrivateKey(
 | 
			
		||||
    b64ToBinstr(forgePrivkey.n)
 | 
			
		||||
  , b64ToBinstr(forgePrivkey.e)
 | 
			
		||||
  , b64ToBinstr(forgePrivkey.d)
 | 
			
		||||
  , b64ToBinstr(forgePrivkey.p)
 | 
			
		||||
  , b64ToBinstr(forgePrivkey.q)
 | 
			
		||||
  , b64ToBinstr(forgePrivkey.dp)
 | 
			
		||||
  , b64ToBinstr(forgePrivkey.dq)
 | 
			
		||||
  , b64ToBinstr(forgePrivkey.qi)
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WARNING: with forge this takes 20+ minutes on a Raspberry Pi!!!
 | 
			
		||||
// It takes SEVERAL seconds even on a nice macbook pro
 | 
			
		||||
function generateRsaKeypair(bitlen, exp, cb) {
 | 
			
		||||
  var pki = forge.pki;
 | 
			
		||||
  var keypair = pki.rsa.generateKeyPair({ bits: bitlen, e: exp });
 | 
			
		||||
  var pems = {
 | 
			
		||||
    publicKeyPem: pki.publicKeyToPem(keypair.publicKey)     // ascii PEM: ----BEGIN...
 | 
			
		||||
  , privateKeyPem: pki.privateKeyToPem(keypair.privateKey)  // ascii PEM: ----BEGIN...
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // I would have chosen sha1 or sha2... but whatever
 | 
			
		||||
  pems.publicKeyMd5 = crypto.createHash('md5').update(pems.publicKeyPem).digest('hex');
 | 
			
		||||
  // json { n: ..., e: ..., iq: ..., etc }
 | 
			
		||||
  pems.privateKeyJwk = toAcmePrivateKey(keypair.privateKey);
 | 
			
		||||
  // deprecate
 | 
			
		||||
  pems.privateKeyJson = pems.privateKeyJwk;
 | 
			
		||||
 | 
			
		||||
  // TODO thumbprint
 | 
			
		||||
 | 
			
		||||
  cb(null, pems);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parseAccountPrivateKey(pkj, cb) {
 | 
			
		||||
  var pki = forge.pki;
 | 
			
		||||
 | 
			
		||||
  Object.keys(pkj).forEach(function (key) {
 | 
			
		||||
    pkj[key] = new Buffer(pkj[key], 'base64');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  var priv;
 | 
			
		||||
  var pubPem;
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    priv = toForgePrivateKey(
 | 
			
		||||
      pkj.n // modulus
 | 
			
		||||
    , pkj.e // exponent
 | 
			
		||||
    , pkj.p
 | 
			
		||||
    , pkj.q
 | 
			
		||||
    , pkj.dp
 | 
			
		||||
    , pkj.dq
 | 
			
		||||
    , pkj.qi
 | 
			
		||||
    , pkj.d
 | 
			
		||||
    );
 | 
			
		||||
  } catch(e) {
 | 
			
		||||
    cb(e);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  pubPem = pki.publicKeyToPem(priv.publicKey);
 | 
			
		||||
  cb(null, {
 | 
			
		||||
    publicKeyPem: pubPem                                  // ascii PEM: ----BEGIN...
 | 
			
		||||
  , privateKeyPem: pki.privateKeyToPem(priv.privateKey)   // ascii PEM: ----BEGIN...
 | 
			
		||||
    // json { n: ..., e: ..., iq: ..., etc }
 | 
			
		||||
  , privateKeyJwt: pkj
 | 
			
		||||
    // deprecate
 | 
			
		||||
  , privateKeyJson: pkj
 | 
			
		||||
    // I would have chosen sha1 or sha2... but whatever
 | 
			
		||||
  , publicKeyMd5: crypto.createHash('md5').update(pubPem).digest('hex')
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports.generateRsaKeypair = generateRsaKeypair;
 | 
			
		||||
module.exports.privateJwkToPems = parseAccountPrivateKey;
 | 
			
		||||
module.exports.privatePemToJwk = toAcmePrivateKey;
 | 
			
		||||
 | 
			
		||||
// TODO deprecate
 | 
			
		||||
module.exports.toAcmePrivateKey = toAcmePrivateKey;
 | 
			
		||||
module.exports.parseAccountPrivateKey = parseAccountPrivateKey;
 | 
			
		||||
@ -8,6 +8,7 @@
 | 
			
		||||
var request = require('request');
 | 
			
		||||
var leUtils = require('./acme-util');
 | 
			
		||||
var leCrypto = require('./letsencrypt-node-crypto');
 | 
			
		||||
var leExtra = require('./letsencrypt-forge-extra');
 | 
			
		||||
var leForge = require('./letsencrypt-forge');
 | 
			
		||||
var leUrsa;
 | 
			
		||||
 | 
			
		||||
@ -22,6 +23,7 @@ try {
 | 
			
		||||
// order of crypto precdence is
 | 
			
		||||
// * native
 | 
			
		||||
// * ursa
 | 
			
		||||
// * forge extra (the new one aimed to be less-forgey)
 | 
			
		||||
// * forge (fallback)
 | 
			
		||||
Object.keys(leUrsa).forEach(function (key) {
 | 
			
		||||
  if (!leCrypto[key]) {
 | 
			
		||||
@ -29,6 +31,12 @@ Object.keys(leUrsa).forEach(function (key) {
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
Object.keys(leExtra).forEach(function (key) {
 | 
			
		||||
  if (!leCrypto[key]) {
 | 
			
		||||
    leCrypto[key] = leExtra[key];
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
Object.keys(leForge).forEach(function (key) {
 | 
			
		||||
  if (!leCrypto[key]) {
 | 
			
		||||
    leCrypto[key] = leForge[key];
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user