forked from coolaj86/eckles.js
56 lines
1.6 KiB
JavaScript
56 lines
1.6 KiB
JavaScript
'use strict';
|
|
|
|
var SSH = module.exports;
|
|
var Enc = require('./encoding.js');
|
|
|
|
// 19 e c d s a - s h a 2 - n i s t p 2 5 6
|
|
var SSH_EC_P256 = '00000013 65 63 64 73 61 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36'
|
|
.replace(/\s+/g, '').toLowerCase();
|
|
// 19 e c d s a - s h a 2 - n i s t p 3 8 4
|
|
var SSH_EC_P384 = '00000013 65 63 64 73 61 2d 73 68 61 32 2d 6e 69 73 74 70 33 38 34'
|
|
.replace(/\s+/g, '').toLowerCase();
|
|
|
|
SSH.parseSsh = function (pem) {
|
|
var jwk = { kty: 'EC', crv: null, x: null, y: null };
|
|
var b64 = pem.split(/\s+/g)[1];
|
|
var buf = Buffer.from(b64, 'base64');
|
|
var hex = Enc.bufToHex(buf);
|
|
var index = 40;
|
|
var len;
|
|
if (0 === hex.indexOf(SSH_EC_P256)) {
|
|
jwk.crv = 'P-256';
|
|
len = 32;
|
|
} else if (0 === hex.indexOf(SSH_EC_P384)) {
|
|
jwk.crv = 'P-384';
|
|
len = 48;
|
|
}
|
|
var x = buf.slice(index, index + len);
|
|
var y = buf.slice(index + len, index + len + len);
|
|
jwk.x = Enc.bufToUrlBase64(x);
|
|
jwk.y = Enc.bufToUrlBase64(y);
|
|
return jwk;
|
|
};
|
|
|
|
|
|
SSH.packSsh = function (jwk) {
|
|
// Custom SSH format
|
|
var typ = 'ecdsa-sha2-nistp256';
|
|
var a = '32 35 36';
|
|
var b = '41';
|
|
var comment = jwk.crv + '@localhost';
|
|
if ('P-256' !== jwk.crv) {
|
|
typ = 'ecdsa-sha2-nistp384';
|
|
a = '33 38 34';
|
|
b = '61';
|
|
}
|
|
var x = Enc.base64ToHex(jwk.x);
|
|
var y = Enc.base64ToHex(jwk.y);
|
|
var ssh = Enc.hexToUint8(
|
|
('00 00 00 13 65 63 64 73 61 2d 73 68 61 32 2d 6e 69 73 74 70'
|
|
+ a + '00 00 00 08 6e 69 73 74 70' + a + '00 00 00' + b
|
|
+ '04' + x + y).replace(/\s+/g, '').toLowerCase()
|
|
);
|
|
|
|
return typ + ' ' + Enc.bufToBase64(ssh) + ' ' + comment;
|
|
};
|