Skip to content

Commit c73e08a

Browse files
committed
node-sshpk#93 sha384 certificate signatures can't be used
1 parent 8df0385 commit c73e08a

File tree

4 files changed

+95
-22
lines changed

4 files changed

+95
-22
lines changed

lib/signature.js

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -33,37 +33,40 @@ function Signature(opts) {
3333
}
3434

3535
Signature.prototype.toBuffer = function (format) {
36-
if (format === undefined)
37-
format = 'asn1';
38-
assert.string(format, 'format');
36+
if (format !== undefined)
37+
assert.string(format, 'format');
3938

4039
var buf;
4140
var stype = 'ssh-' + this.type;
4241

4342
switch (this.type) {
4443
case 'rsa':
45-
switch (this.hashAlgorithm) {
46-
case 'sha256':
47-
stype = 'rsa-sha2-256';
48-
break;
49-
case 'sha512':
50-
stype = 'rsa-sha2-512';
51-
break;
52-
case 'sha1':
53-
case undefined:
54-
break;
55-
default:
56-
throw (new Error('SSH signature ' +
57-
'format does not support hash ' +
58-
'algorithm ' + this.hashAlgorithm));
59-
}
6044
if (format === 'ssh') {
45+
switch (this.hashAlgorithm) {
46+
case 'sha256':
47+
stype = 'rsa-sha2-256';
48+
break;
49+
case 'sha512':
50+
stype = 'rsa-sha2-512';
51+
break;
52+
case 'sha1':
53+
case undefined:
54+
break;
55+
default:
56+
throw (new Error('SSH signature format does ' +
57+
'not support RSA with hash algorithm ' +
58+
this.hashAlgorithm));
59+
}
6160
buf = new SSHBuffer({});
6261
buf.writeString(stype);
6362
buf.writePart(this.part.sig);
6463
return (buf.toBuffer());
65-
} else {
64+
} else if (format === 'asn1' || format === 'raw' ||
65+
format === undefined) {
6666
return (this.part.sig.data);
67+
} else {
68+
throw (new Error('Unsupported signature format: ' +
69+
format));
6770
}
6871
break;
6972

@@ -73,15 +76,19 @@ Signature.prototype.toBuffer = function (format) {
7376
buf.writeString(stype);
7477
buf.writePart(this.part.sig);
7578
return (buf.toBuffer());
76-
} else {
79+
} else if (format === 'asn1' || format === 'raw' ||
80+
format === undefined) {
7781
return (this.part.sig.data);
82+
} else {
83+
throw (new Error('Unsupported signature format: ' +
84+
format));
7885
}
7986
break;
8087

8188
case 'dsa':
8289
case 'ecdsa':
8390
var r, s;
84-
if (format === 'asn1') {
91+
if (format === 'asn1' || format === undefined) {
8592
var der = new asn1.BerWriter();
8693
der.startSequence();
8794
r = utils.mpNormalize(this.part.r.data);
@@ -129,7 +136,7 @@ Signature.prototype.toBuffer = function (format) {
129136
buf.writeBuffer(inner.toBuffer());
130137
return (buf.toBuffer());
131138
}
132-
throw (new Error('Invalid signature format'));
139+
throw (new Error('Invalid signature format: ' + format));
133140
default:
134141
throw (new Error('Invalid signature data'));
135142
}

test/assets/sha384test-cert.pem

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICszCCAZsCFCvhb5Lx45XMZk54N2L49kMRQgoEMA0GCSqGSIb3DQEBDAUAMBYx
3+
FDASBgNVBAMMC3NoYTM4NCB0ZXN0MB4XDTIzMTIxOTA0MTE1OFoXDTI0MDExODA0
4+
MTE1OFowFjEUMBIGA1UEAwwLc2hhMzg0IHRlc3QwggEiMA0GCSqGSIb3DQEBAQUA
5+
A4IBDwAwggEKAoIBAQDnSjZEEGZ0015lc/3I1HvyP13GmVqTZz1xspVWYqGj5A3N
6+
sQsjRZyI9xeQp1jl/5f2VUdnjvxlpq2z6s3g6vq8tNlBnOhSSBEofD6X0A3uq9Jc
7+
Q/KyMlClxBRoOE4sETXd13cUy5mrb3NymtNEwMGIgUNxrjrkZ4twT1I0EOdnImVV
8+
WNpY6xsdpS2Aoz3R1scd2dbwpLosXTwqNfD11wVkrWjYG/VflYQEVSOzRbggRdNF
9+
8aTUfJjsvaGByBMF+Ke47/nS4WrwnvyLnmSOXs7rMSwl//AlDKq8yIs0Qmrnahp8
10+
qD8MBqYdL5ohfBtZwIKeXt23IiuKJ65kHLJ2NsxfAgMBAAEwDQYJKoZIhvcNAQEM
11+
BQADggEBAKaE5I4CHunzUPaRC/2v9LGwdfbedCYttO57VaTpGf+G2iiuV8q1Dnw0
12+
AKGP44NFNJ9bQved8OfhM0E7HlbRW6c1qGmsLtwJB9A8LKdslJAzZtXgBduwcPdH
13+
IjDSRfpSwiO48hre7wJGrJnxUaBl+QKFkiEYl4URglpjq887ma72ol7wG+Qqmy6w
14+
YsxUzerDm7ubvptms7Y2y53UFz9LQstxsJOIKXdLlN009BI6B6FIT/vgWAruykXf
15+
WsO0pIO5xWhk5zqIEEHQDKmPVbEceQTnsYKWjvdb8XFmJn38sWgtf0iuPgJkqEd/
16+
yEGTp0vsRBx6+l8c7OgFCbsQsP8hqFY=
17+
-----END CERTIFICATE-----

test/assets/sha384test-key.pem

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDnSjZEEGZ0015l
3+
c/3I1HvyP13GmVqTZz1xspVWYqGj5A3NsQsjRZyI9xeQp1jl/5f2VUdnjvxlpq2z
4+
6s3g6vq8tNlBnOhSSBEofD6X0A3uq9JcQ/KyMlClxBRoOE4sETXd13cUy5mrb3Ny
5+
mtNEwMGIgUNxrjrkZ4twT1I0EOdnImVVWNpY6xsdpS2Aoz3R1scd2dbwpLosXTwq
6+
NfD11wVkrWjYG/VflYQEVSOzRbggRdNF8aTUfJjsvaGByBMF+Ke47/nS4WrwnvyL
7+
nmSOXs7rMSwl//AlDKq8yIs0Qmrnahp8qD8MBqYdL5ohfBtZwIKeXt23IiuKJ65k
8+
HLJ2NsxfAgMBAAECggEAQiqQWKtqbBx1wkdLAHONG9G15ZVEfKvJv6eLomFoBYc9
9+
zazK12XYMLSjaK3/OBkFI6Lk4QLeQMRMqA5RpHkEjwybpHIbYkKcqfzVOT/7ZF6C
10+
OQP1P7Y2LR3piqEk9+VaiCLWPbw7M3iYSd5x9xa/pun33eMulN3sXY5LoXp+gJmi
11+
rqcqKQ0Z8EC6lEgNfSXCx1lJ3vYpeMLMtCz6F1w/raZJ3m0Yw6DpQGRjiJJmWAQ7
12+
kHe8awnrO1WjZ7FPF5JRFIjX/vjn0Wz9LsDvVX16Vbxe5XT+GK2lUGO4sobICf1u
13+
VN9DCDR67zXPOdywaGjdn2tkI6zDKJ3l/4Lb/+bFTQKBgQD3RGIMT9t/xBMk6QJ7
14+
vy/RIuom/4BqTuMpzgMbQ4ow2ZaE8ToQypaPUj9gFFKSjI+E/8p1SFs1Ozk1reJK
15+
hvB/cCzUiZP8fJen7lv1AJ1EfK7ThPDdMAtmTVPW/znKucD3jPJEhF7W+pzEgzjK
16+
3jnv5WG4+94gxG2tA4iv0lAvPQKBgQDvdV+929j7gZ+YPljBLr4lpzTYDGVH2B7f
17+
0ZHN8Wf+xWFvsyVwUX4s/troYs9OGP+u/FAKlMMi1NmRIkjj08JCHtShNae0J5EF
18+
MKTO0JqUijRQ8a0W02Qqm4gpCbHg1A+NzjAeaEjHfGjXVFpKhWFkRe+76ZN8XXzo
19+
NqB7xZwjywKBgQDp+KYCWmorqqAm0+kKqS0Y6r2/6xJbBYyEGTDtUmpnsOxxnUTB
20+
cMEomr3nLzO3AhQn2FZ9xdqwMvr+ZSv0M11MaRuyfQAv8MEcITqYSV2G2agf8/Jq
21+
ibSvt8n2bYkE3+HNHGx+Evce2wMOG9DYfZE7A8UFYiacwOG6zdY/8HT5TQKBgBTq
22+
D36poP32iFXnvCDDUGBBhmAIVSA9RBUQXMe7+fVKkAQNhYuV0otjhwMc/jY4ALzr
23+
1KHX9GMqbAY9FFixuhnET5X09bzKZ+QoJ3zYw2eN2pvnP9Lqi6kdBHtxGVQlsWYV
24+
SCafvRuPRijoeSphE+yKHzIuaG9ISwyNGN82lziZAoGAMxAvsE4WxJDqveyY6jMx
25+
WShFY5lU6W7rRRN5ZYkX1tvaBcEF7tWyku76LCki7vYySqRHcwbXXJI2i8aAODEl
26+
jyVzmMywzFrQ9SdWKzFmbzb/pN0Q8PmYUWn2tDkiSVe+eL+2NO1PfYn+uTgOL2xX
27+
sNbIamzBjAZ/yynumJzte/A=
28+
-----END PRIVATE KEY-----

test/certs.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,24 @@ test('example cert: openssh extensions', function (t) {
452452

453453
t.end();
454454
});
455+
456+
test('example cert: sha384 rsa', function (t) {
457+
var cert = sshpk.parseCertificate(
458+
fs.readFileSync(path.join(testDir, 'sha384test-cert.pem')),
459+
'pem');
460+
t.strictEqual(cert.subjectKey.type, 'rsa');
461+
t.strictEqual(cert.subjects[0].cn, 'sha384 test');
462+
463+
var key = sshpk.parsePrivateKey(
464+
fs.readFileSync(path.join(testDir, 'sha384test-key.pem')),
465+
'pem');
466+
t.strictEqual(key.type, 'rsa');
467+
468+
t.ok(cert.isSignedByKey(key));
469+
t.ok(cert.subjectKey.fingerprint().matches(key));
470+
471+
t.strictEqual(cert.fingerprint('sha1').toString(),
472+
'SHA1:BITz0TaHh9R5H1NNyidAPcJ1yIs');
473+
474+
t.end();
475+
});

0 commit comments

Comments
 (0)