46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var x509 = module.exports;
 | |
| 
 | |
| var PEM = require('./pem-parser.js');
 | |
| var EC = require('./x509-ec-parser.js');
 | |
| var RSA = require('./x509-rsa-parser.js');
 | |
| 
 | |
| x509.parse = function (opts) {
 | |
|   var pem = opts.pem;
 | |
|   var der = opts.der;
 | |
|   if ('string' === opts.key) {
 | |
|     pem = opts.key;
 | |
|   } else if (opts.key && opts.key.length) {
 | |
|     der = opts.key;
 | |
|   }
 | |
|   if (pem) { pem = PEM.parseBlock(pem); }
 | |
|   else { pem = { bytes: der, type: '' }; }
 | |
|   der = pem.bytes;
 | |
|   var typ = pem.type;
 | |
|   var pub = /PUBLIC KEY/.test(typ);
 | |
|   var prv = /PRIVATE KEY/.test(typ);
 | |
|   var ec = /EC P/.test(typ);
 | |
|   var rsa = /RSA P/.test(typ);
 | |
| 
 | |
|   // Try EC Private and Public keys
 | |
|   if (!rsa && !pub) {
 | |
|     try { return EC.parsePkcs8(der); } catch(e) { /*ignore*/ }
 | |
|     try { return EC.parseSec1(der); } catch(e) { /*ignore*/ }
 | |
|   } else if (!rsa && !prv) {
 | |
|     try { return EC.parseSpki(der); } catch(e) { /*ignore*/ }
 | |
|   }
 | |
| 
 | |
|   // Try RSA Private and Public keys
 | |
|   if (!ec && !pub) {
 | |
|     try { return RSA.parsePkcs8(der); } catch(e) { /*ignore*/ }
 | |
|     try { return RSA.parsePkcs1(der); } catch(e) { /*ignore*/ }
 | |
|   } else if (!ec && !prv) {
 | |
|     try { return RSA.parseSpki(der); } catch(e) { /*ignore*/ }
 | |
|     try { return RSA.parsePublicPkcs1(der); } catch(e) { /*ignore*/ }
 | |
|   }
 | |
| 
 | |
|   throw new Error("Invalid or Unsupported key:\n"
 | |
|     + "Tried ASN.1 PEM/DER PKCS1, SEC1, PKCS8, and SPKI/PKIX (RSA and EC Private and Public)");
 | |
| };
 |