fix EC padding
This commit is contained in:
		
							parent
							
								
									afdd93b267
								
							
						
					
					
						commit
						bcc503596f
					
				| @ -66,17 +66,17 @@ SSH._packKey = function (opts) { | ||||
|     els.push(Enc.binToHex('ssh-rsa')); | ||||
|     if (jwk.d) { | ||||
|       // unswap n and e for private key format
 | ||||
|       els.push(SSH._padRsa(Enc.base64ToHex(jwk.n))); | ||||
|       els.push(SSH._padRsa(Enc.base64ToHex(jwk.e))); | ||||
|       els.push(SSH._padRsa(Enc.base64ToHex(jwk.d))); | ||||
|       els.push(SSH._padRsa(Enc.base64ToHex(jwk.qi))); | ||||
|       els.push(SSH._padRsa(Enc.base64ToHex(jwk.p))); | ||||
|       els.push(SSH._padRsa(Enc.base64ToHex(jwk.q))); | ||||
|       els.push(SSH._padBigInt(Enc.base64ToHex(jwk.n))); | ||||
|       els.push(SSH._padBigInt(Enc.base64ToHex(jwk.e))); | ||||
|       els.push(SSH._padBigInt(Enc.base64ToHex(jwk.d))); | ||||
|       els.push(SSH._padBigInt(Enc.base64ToHex(jwk.qi))); | ||||
|       els.push(SSH._padBigInt(Enc.base64ToHex(jwk.p))); | ||||
|       els.push(SSH._padBigInt(Enc.base64ToHex(jwk.q))); | ||||
|       els.push(Enc.binToHex(opts.comment || '')); | ||||
|     } else { | ||||
|       // swap n and e for public key format
 | ||||
|       els.push(SSH._padRsa(Enc.base64ToHex(jwk.e))); | ||||
|       els.push(SSH._padRsa(Enc.base64ToHex(jwk.n))); | ||||
|       els.push(SSH._padBigInt(Enc.base64ToHex(jwk.e))); | ||||
|       els.push(SSH._padBigInt(Enc.base64ToHex(jwk.n))); | ||||
|     } | ||||
|     return els; | ||||
|   } | ||||
| @ -94,11 +94,16 @@ SSH._packKey = function (opts) { | ||||
|   } | ||||
| 
 | ||||
|   els.push('04' | ||||
|     + SSH._padEc(Enc.base64ToHex(jwk.x), len) | ||||
|     + SSH._padEc(Enc.base64ToHex(jwk.y), len) | ||||
|     + SSH._padBytes(Enc.base64ToHex(jwk.x), len) | ||||
|     + SSH._padBytes(Enc.base64ToHex(jwk.y), len) | ||||
|   ); | ||||
|   if (jwk.d) { | ||||
|     els.push(SSH._padEc(Enc.base64ToHex(jwk.d), len)); | ||||
|     // I was able to empirically confirm that the leading 00 is expected for
 | ||||
|     // ambiguous BigInt negatives (0x80 set), and that the length can dip down
 | ||||
|     // to 31 bytes when the leading byte is 0x00. I suspect that if I had tried
 | ||||
|     // 65k iterations that I'd have seen at least one 30 byte number
 | ||||
|     els.push(SSH._padBigInt(Enc.base64ToHex(jwk.d))); | ||||
|     //console.warn('els:', els[els.length - 1]);
 | ||||
|     els.push(Enc.binToHex(opts.comment || '')); | ||||
|   } | ||||
| 
 | ||||
| @ -119,18 +124,20 @@ SSH._numToUint32Hex = function (num) { | ||||
|   return hex; | ||||
| }; | ||||
| 
 | ||||
| SSH._padRsa = function (hex) { | ||||
| SSH._padBigInt = function (hex) { | ||||
|   // BigInt is negative if the high order bit 0x80 is set,
 | ||||
|   // so ASN1, SSH, and many other formats pad with '0x00'
 | ||||
|   // to signifiy a positive number.
 | ||||
|   var i = parseInt(hex.slice(0, 2), 16); | ||||
|   //console.warn('l', hex.length/2, 'i', i);
 | ||||
|   if (0x80 & i) { | ||||
|     //console.warn('0x80 true');
 | ||||
|     return '00' + hex; | ||||
|   } | ||||
|   return hex; | ||||
| }; | ||||
| 
 | ||||
| SSH._padEc = function (hex, len) { | ||||
| SSH._padBytes = function (hex, len) { | ||||
|   while (hex.length < len * 2) { | ||||
|     hex = '00' + hex; | ||||
|   } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user