|
|
@ -17,6 +17,7 @@ SSH.parse = function (pem, jwk) { |
|
|
|
var offset = (buf.byteOffset || 0); |
|
|
|
// using dataview to be browser-compatible (I do want _some_ code reuse)
|
|
|
|
var dv = new DataView(buf.buffer.slice(offset, offset + buf.byteLength)); |
|
|
|
var el; |
|
|
|
|
|
|
|
if (SSH.RSA !== Enc.bufToHex(buf.slice(0, SSH.RSA.length/2))) { |
|
|
|
throw new Error("does not lead with ssh header"); |
|
|
@ -27,7 +28,12 @@ SSH.parse = function (pem, jwk) { |
|
|
|
if (i > 3) { throw new Error("15+ elements, probably not a public ssh key"); } |
|
|
|
len = dv.getUint32(index, false); |
|
|
|
index += 4; |
|
|
|
els.push(buf.slice(index, index + len)); |
|
|
|
el = buf.slice(index, index + len); |
|
|
|
// remove BigUInt '00' prefix
|
|
|
|
if (0x00 === el[0]) { |
|
|
|
el = el.slice(1); |
|
|
|
} |
|
|
|
els.push(el); |
|
|
|
index += len; |
|
|
|
} |
|
|
|
|
|
|
@ -36,3 +42,39 @@ SSH.parse = function (pem, jwk) { |
|
|
|
|
|
|
|
return jwk; |
|
|
|
}; |
|
|
|
|
|
|
|
SSH.pack = function (opts) { |
|
|
|
var jwk = opts.jwk; |
|
|
|
var header = 'ssh-rsa'; |
|
|
|
var comment = opts.comment || 'rsa@localhost'; |
|
|
|
var e = SSH._padHexInt(Enc.base64ToHex(jwk.e)); |
|
|
|
var n = SSH._padHexInt(Enc.base64ToHex(jwk.n)); |
|
|
|
var hex = [ |
|
|
|
SSH._numToUint32Hex(header.length) |
|
|
|
, Enc.strToHex(header) |
|
|
|
, SSH._numToUint32Hex(e.length/2) |
|
|
|
, e |
|
|
|
, SSH._numToUint32Hex(n.length/2) |
|
|
|
, n |
|
|
|
].join(''); |
|
|
|
return [ header, Enc.hexToBase64(hex), comment ].join(' '); |
|
|
|
}; |
|
|
|
|
|
|
|
SSH._numToUint32Hex = function (num) { |
|
|
|
var hex = num.toString(16); |
|
|
|
while (hex.length < 8) { |
|
|
|
hex = '0' + hex; |
|
|
|
} |
|
|
|
return hex; |
|
|
|
}; |
|
|
|
|
|
|
|
SSH._padHexInt = 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); |
|
|
|
if (0x80 & i) { |
|
|
|
return '00' + hex; |
|
|
|
} |
|
|
|
return hex; |
|
|
|
}; |
|
|
|