forked from coolaj86/eckles.js
		
	cleanup
This commit is contained in:
		
							parent
							
								
									1d050b5991
								
							
						
					
					
						commit
						b13165d6dc
					
				| @ -1,6 +1,8 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| var EC = module.exports; | ||||
| var Hex = {}; | ||||
| var PEM = {}; | ||||
| 
 | ||||
| // 1.2.840.10045.3.1.7
 | ||||
| // 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)
 | ||||
| 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
 | ||||
| // https://davidederosa.com/basic-blockchain-programming/elliptic-curve-keys/
 | ||||
| 
 | ||||
| var PEM = {}; | ||||
| PEM._toUrlSafeBase64 = function (u8) { | ||||
|   //console.log('Len:', u8.byteLength);
 | ||||
|   return Buffer.from(u8).toString('base64') | ||||
|     .replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); | ||||
| }; | ||||
| 
 | ||||
| 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; | ||||
| 
 | ||||
| function parsePem(pem) { | ||||
| PEM.parseBlock = function pemToDer(pem) { | ||||
|   var typ; | ||||
|   var pub; | ||||
|   var crv; | ||||
| @ -71,9 +58,29 @@ function parsePem(pem) { | ||||
|   } | ||||
| 
 | ||||
|   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 len = 32; | ||||
|   var olen = OBJ_ID_EC.length/2; | ||||
| @ -111,8 +118,9 @@ function parseEcOnlyPrivkey(u8, jwk) { | ||||
|   , y: PEM._toUrlSafeBase64(y) | ||||
|   //, yh: y
 | ||||
|   }; | ||||
| } | ||||
| function parseEcPkcs8Privkey(u8, jwk) { | ||||
| }; | ||||
| 
 | ||||
| EC.parsePkcs8 = function parseEcPkcs8(u8, jwk) { | ||||
|   var index = 24 + (OBJ_ID_EC.length/2); | ||||
|   var len = 32; | ||||
|   if ("P-384" === jwk.crv) { | ||||
| @ -147,8 +155,9 @@ function parseEcPkcs8Privkey(u8, jwk) { | ||||
|   , y: PEM._toUrlSafeBase64(y) | ||||
|   //, yh: y
 | ||||
|   }; | ||||
| } | ||||
| function parseEcPub(u8, jwk) { | ||||
| }; | ||||
| 
 | ||||
| EC.parseSpki = function parsePem(u8, jwk) { | ||||
|   var ci = 16 + OBJ_ID_EC.length/2; | ||||
|   var len = 32; | ||||
| 
 | ||||
| @ -176,16 +185,17 @@ function parseEcPub(u8, jwk) { | ||||
|   , y: PEM._toUrlSafeBase64(y) | ||||
|   //, yh: y
 | ||||
|   }; | ||||
| } | ||||
| }; | ||||
| EC.parsePkix = EC.parseSpki; | ||||
| 
 | ||||
| /*global Promise*/ | ||||
| function parseEcPrivkey(opts) { | ||||
| EC.parse = function parseEc(opts) { | ||||
|   return Promise.resolve().then(function () { | ||||
|     if (!opts || !opts.pem) { | ||||
|       throw new Error("must pass { pem: pem }"); | ||||
|     } | ||||
|     var pem = opts.pem; | ||||
|     var u8 = parsePem(pem).der; | ||||
|     var u8 = PEM.parseBlock(pem).der; | ||||
|     var hex = toHex(u8); | ||||
|     var jwk = { kty: 'EC', crv: null, x: null, y: null }; | ||||
| 
 | ||||
| @ -196,15 +206,15 @@ function parseEcPrivkey(opts) { | ||||
|       // PKCS8
 | ||||
|       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));
 | ||||
|         return parseEcPkcs8Privkey(u8, jwk); | ||||
|         return EC.parsePkcs8(u8, jwk); | ||||
|       // EC-only
 | ||||
|       } 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));
 | ||||
|         return parseEcOnlyPrivkey(u8, jwk); | ||||
|         return EC.parseSec1(u8, jwk); | ||||
|       // SPKI/PKIK (Public)
 | ||||
|       } 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));
 | ||||
|         return parseEcPub(u8, jwk); | ||||
|         return EC.parseSpki(u8, jwk); | ||||
|       // Error
 | ||||
|       } else { | ||||
|         //console.log("PKCS8", u8[3].toString(16), u8[6].toString(16), u8[8].toString(16));
 | ||||
| @ -218,15 +228,15 @@ function parseEcPrivkey(opts) { | ||||
|       // PKCS8
 | ||||
|       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));
 | ||||
|         return parseEcPkcs8Privkey(u8, jwk); | ||||
|         return EC.parsePkcs8(u8, jwk); | ||||
|       // EC-only
 | ||||
|       } 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));
 | ||||
|         return parseEcOnlyPrivkey(u8, jwk); | ||||
|         return EC.parseSec1(u8, jwk); | ||||
|       // SPKI/PKIK (Public)
 | ||||
|       } 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));
 | ||||
|         return parseEcPub(u8, jwk); | ||||
|         return EC.parseSpki(u8, jwk); | ||||
|       // Error
 | ||||
|       } else { | ||||
|         //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"); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| module.exports.import = parseEcPrivkey; | ||||
| }; | ||||
| EC.toJwk = EC.import = EC.parse; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user