forked from coolaj86/eckles.js
		
	cleanup
This commit is contained in:
		
							parent
							
								
									1d050b5991
								
							
						
					
					
						commit
						b13165d6dc
					
				| @ -1,6 +1,8 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
| 
 | 
 | ||||||
|  | var EC = module.exports; | ||||||
| var Hex = {}; | var Hex = {}; | ||||||
|  | var PEM = {}; | ||||||
| 
 | 
 | ||||||
| // 1.2.840.10045.3.1.7
 | // 1.2.840.10045.3.1.7
 | ||||||
| // prime256v1 (ANSI X9.62 named elliptic curve)
 | // prime256v1 (ANSI X9.62 named elliptic curve)
 | ||||||
| @ -9,36 +11,21 @@ var OBJ_ID_EC  = '06 08 2A8648CE3D030107'.replace(/\s+/g, '').toLowerCase(); | |||||||
| // secp384r1 (SECG (Certicom) named elliptic curve)
 | // secp384r1 (SECG (Certicom) named elliptic curve)
 | ||||||
| var OBJ_ID_EC_384 = '06 05 2B81040022'.replace(/\s+/g, '').toLowerCase(); | var OBJ_ID_EC_384 = '06 05 2B81040022'.replace(/\s+/g, '').toLowerCase(); | ||||||
| 
 | 
 | ||||||
|  | // 1.2.840.10045.2.1
 | ||||||
|  | // ecPublicKey (ANSI X9.62 public key type)
 | ||||||
|  | var OBJ_ID_EC_PUB = '06 07 2A8648CE3D0201'.replace(/\s+/g, '').toLowerCase(); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| // The one good thing that came from the b***kchain hysteria: good EC documentation
 | // The one good thing that came from the b***kchain hysteria: good EC documentation
 | ||||||
| // https://davidederosa.com/basic-blockchain-programming/elliptic-curve-keys/
 | // https://davidederosa.com/basic-blockchain-programming/elliptic-curve-keys/
 | ||||||
| 
 | 
 | ||||||
| var PEM = {}; |  | ||||||
| PEM._toUrlSafeBase64 = function (u8) { | PEM._toUrlSafeBase64 = function (u8) { | ||||||
|   //console.log('Len:', u8.byteLength);
 |   //console.log('Len:', u8.byteLength);
 | ||||||
|   return Buffer.from(u8).toString('base64') |   return Buffer.from(u8).toString('base64') | ||||||
|     .replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); |     .replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| function toHex(ab) { | PEM.parseBlock = function pemToDer(pem) { | ||||||
|   var hex = []; |  | ||||||
|   var u8 = new Uint8Array(ab); |  | ||||||
|   var size = u8.byteLength; |  | ||||||
|   var i; |  | ||||||
|   var h; |  | ||||||
|   for (i = 0; i < size; i += 1) { |  | ||||||
|     h = u8[i].toString(16); |  | ||||||
|     if (2 === h.length) { |  | ||||||
|       hex.push(h); |  | ||||||
|     } else { |  | ||||||
|       hex.push('0' + h); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return hex.join('').replace(/\s+/g, '').toLowerCase(); |  | ||||||
| } |  | ||||||
| Hex.fromAB = toHex; |  | ||||||
| 
 |  | ||||||
| function parsePem(pem) { |  | ||||||
|   var typ; |   var typ; | ||||||
|   var pub; |   var pub; | ||||||
|   var crv; |   var crv; | ||||||
| @ -71,9 +58,29 @@ function parsePem(pem) { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return { typ: typ, pub: pub, der: der, crv: crv }; |   return { typ: typ, pub: pub, der: der, crv: crv }; | ||||||
| } | }; | ||||||
| 
 | 
 | ||||||
| function parseEcOnlyPrivkey(u8, jwk) { | function toHex(ab) { | ||||||
|  |   var hex = []; | ||||||
|  |   var u8 = new Uint8Array(ab); | ||||||
|  |   var size = u8.byteLength; | ||||||
|  |   var i; | ||||||
|  |   var h; | ||||||
|  |   for (i = 0; i < size; i += 1) { | ||||||
|  |     h = u8[i].toString(16); | ||||||
|  |     if (2 === h.length) { | ||||||
|  |       hex.push(h); | ||||||
|  |     } else { | ||||||
|  |       hex.push('0' + h); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   return hex.join('').replace(/\s+/g, '').toLowerCase(); | ||||||
|  | } | ||||||
|  | Hex.fromAB = toHex; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | EC.parseSec1 = function parseEcOnlyPrivkey(u8, jwk) { | ||||||
|   var index = 7; |   var index = 7; | ||||||
|   var len = 32; |   var len = 32; | ||||||
|   var olen = OBJ_ID_EC.length/2; |   var olen = OBJ_ID_EC.length/2; | ||||||
| @ -111,8 +118,9 @@ function parseEcOnlyPrivkey(u8, jwk) { | |||||||
|   , y: PEM._toUrlSafeBase64(y) |   , y: PEM._toUrlSafeBase64(y) | ||||||
|   //, yh: y
 |   //, yh: y
 | ||||||
|   }; |   }; | ||||||
| } | }; | ||||||
| function parseEcPkcs8Privkey(u8, jwk) { | 
 | ||||||
|  | EC.parsePkcs8 = function parseEcPkcs8(u8, jwk) { | ||||||
|   var index = 24 + (OBJ_ID_EC.length/2); |   var index = 24 + (OBJ_ID_EC.length/2); | ||||||
|   var len = 32; |   var len = 32; | ||||||
|   if ("P-384" === jwk.crv) { |   if ("P-384" === jwk.crv) { | ||||||
| @ -147,8 +155,9 @@ function parseEcPkcs8Privkey(u8, jwk) { | |||||||
|   , y: PEM._toUrlSafeBase64(y) |   , y: PEM._toUrlSafeBase64(y) | ||||||
|   //, yh: y
 |   //, yh: y
 | ||||||
|   }; |   }; | ||||||
| } | }; | ||||||
| function parseEcPub(u8, jwk) { | 
 | ||||||
|  | EC.parseSpki = function parsePem(u8, jwk) { | ||||||
|   var ci = 16 + OBJ_ID_EC.length/2; |   var ci = 16 + OBJ_ID_EC.length/2; | ||||||
|   var len = 32; |   var len = 32; | ||||||
| 
 | 
 | ||||||
| @ -176,16 +185,17 @@ function parseEcPub(u8, jwk) { | |||||||
|   , y: PEM._toUrlSafeBase64(y) |   , y: PEM._toUrlSafeBase64(y) | ||||||
|   //, yh: y
 |   //, yh: y
 | ||||||
|   }; |   }; | ||||||
| } | }; | ||||||
|  | EC.parsePkix = EC.parseSpki; | ||||||
| 
 | 
 | ||||||
| /*global Promise*/ | /*global Promise*/ | ||||||
| function parseEcPrivkey(opts) { | EC.parse = function parseEc(opts) { | ||||||
|   return Promise.resolve().then(function () { |   return Promise.resolve().then(function () { | ||||||
|     if (!opts || !opts.pem) { |     if (!opts || !opts.pem) { | ||||||
|       throw new Error("must pass { pem: pem }"); |       throw new Error("must pass { pem: pem }"); | ||||||
|     } |     } | ||||||
|     var pem = opts.pem; |     var pem = opts.pem; | ||||||
|     var u8 = parsePem(pem).der; |     var u8 = PEM.parseBlock(pem).der; | ||||||
|     var hex = toHex(u8); |     var hex = toHex(u8); | ||||||
|     var jwk = { kty: 'EC', crv: null, x: null, y: null }; |     var jwk = { kty: 'EC', crv: null, x: null, y: null }; | ||||||
| 
 | 
 | ||||||
| @ -196,15 +206,15 @@ function parseEcPrivkey(opts) { | |||||||
|       // PKCS8
 |       // PKCS8
 | ||||||
|       if (0x02 === u8[3] && 0x30 === u8[6] && 0x06 === u8[8]) { |       if (0x02 === u8[3] && 0x30 === u8[6] && 0x06 === u8[8]) { | ||||||
|         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 |         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 | ||||||
|         return parseEcPkcs8Privkey(u8, jwk); |         return EC.parsePkcs8(u8, jwk); | ||||||
|       // EC-only
 |       // EC-only
 | ||||||
|       } else if (0x02 === u8[2] && 0x04 === u8[5] && 0xA0 === u8[39]) { |       } else if (0x02 === u8[2] && 0x04 === u8[5] && 0xA0 === u8[39]) { | ||||||
|         //console.log("EC---", u8[2].toString(16), u8[5].toString(16), u8[39].toString(16));
 |         //console.log("EC---", u8[2].toString(16), u8[5].toString(16), u8[39].toString(16));
 | ||||||
|         return parseEcOnlyPrivkey(u8, jwk); |         return EC.parseSec1(u8, jwk); | ||||||
|       // SPKI/PKIK (Public)
 |       // SPKI/PKIK (Public)
 | ||||||
|       } else if (0x30 === u8[2] && 0x06 === u8[4] && 0x06 === u8[13]) { |       } else if (0x30 === u8[2] && 0x06 === u8[4] && 0x06 === u8[13]) { | ||||||
|         //console.log("SPKI-", u8[2].toString(16), u8[4].toString(16), u8[13].toString(16));
 |         //console.log("SPKI-", u8[2].toString(16), u8[4].toString(16), u8[13].toString(16));
 | ||||||
|         return parseEcPub(u8, jwk); |         return EC.parseSpki(u8, jwk); | ||||||
|       // Error
 |       // Error
 | ||||||
|       } else { |       } else { | ||||||
|         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 |         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 | ||||||
| @ -218,15 +228,15 @@ function parseEcPrivkey(opts) { | |||||||
|       // PKCS8
 |       // PKCS8
 | ||||||
|       if (0x02 === u8[3] && 0x30 === u8[6] && 0x06 === u8[8]) { |       if (0x02 === u8[3] && 0x30 === u8[6] && 0x06 === u8[8]) { | ||||||
|         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 |         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 | ||||||
|         return parseEcPkcs8Privkey(u8, jwk); |         return EC.parsePkcs8(u8, jwk); | ||||||
|       // EC-only
 |       // EC-only
 | ||||||
|       } else if (0x02 === u8[3] && 0x04 === u8[6] && 0xA0 === u8[56]) { |       } else if (0x02 === u8[3] && 0x04 === u8[6] && 0xA0 === u8[56]) { | ||||||
|         //console.log("EC---", u8[3].toString(16), u8[6].toString(16), u8[56].toString(16));
 |         //console.log("EC---", u8[3].toString(16), u8[6].toString(16), u8[56].toString(16));
 | ||||||
|         return parseEcOnlyPrivkey(u8, jwk); |         return EC.parseSec1(u8, jwk); | ||||||
|       // SPKI/PKIK (Public)
 |       // SPKI/PKIK (Public)
 | ||||||
|       } else if (0x30 === u8[2] && 0x06 === u8[4] && 0x06 === u8[13]) { |       } else if (0x30 === u8[2] && 0x06 === u8[4] && 0x06 === u8[13]) { | ||||||
|         //console.log("SPKI-", u8[2].toString(16), u8[4].toString(16), u8[13].toString(16));
 |         //console.log("SPKI-", u8[2].toString(16), u8[4].toString(16), u8[13].toString(16));
 | ||||||
|         return parseEcPub(u8, jwk); |         return EC.parseSpki(u8, jwk); | ||||||
|       // Error
 |       // Error
 | ||||||
|       } else { |       } else { | ||||||
|         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 |         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 | ||||||
| @ -238,6 +248,5 @@ function parseEcPrivkey(opts) { | |||||||
|       throw new Error("Supported key types are P-256 and P-384"); |       throw new Error("Supported key types are P-256 and P-384"); | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| } | }; | ||||||
| 
 | EC.toJwk = EC.import = EC.parse; | ||||||
| module.exports.import = parseEcPrivkey; |  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user