@@ -7,6 +7,8 @@ var fs = require('fs');
77var path = require ( 'path' ) ;
88var crypto = require ( 'crypto' ) ;
99var sinon = require ( 'sinon' ) ;
10+ var asn1 = require ( 'asn1' ) ;
11+ var SSHBuffer = require ( '../lib/ssh-buffer' ) ;
1012
1113var testDir = path . join ( __dirname , 'assets' ) ;
1214
@@ -250,6 +252,17 @@ test('example cert: digicert ca (x509)', function (t) {
250252 t . strictEqual ( cert . subjects . length , 1 ) ;
251253 t . deepEqual ( cert . purposes . sort ( ) ,
252254 [ 'ca' , 'clientAuth' , 'crl' , 'serverAuth' , 'signature' ] ) ;
255+ var exts = cert . getExtensions ( ) ;
256+ t . strictEqual ( exts . length , 8 ) ;
257+ exts . forEach ( function ( ext ) {
258+ t . strictEqual ( ext . format , 'x509' ) ;
259+ t . strictEqual ( typeof ( ext . oid ) , 'string' ) ;
260+ } ) ;
261+ var basicExt = cert . getExtension ( '2.5.29.19' ) ;
262+ t . strictEqual ( basicExt . oid , '2.5.29.19' ) ;
263+ t . strictEqual ( basicExt . critical , true ) ;
264+ t . strictEqual ( basicExt . format , 'x509' ) ;
265+ t . strictEqual ( basicExt . pathLen , 0 ) ;
253266 t . end ( ) ;
254267} ) ;
255268
@@ -386,3 +399,47 @@ test('cert with doubled-up DN attribute', function (t) {
386399
387400 t . end ( ) ;
388401} ) ;
402+
403+ test ( 'example cert: yubikey attestation cert' , function ( t ) {
404+ var cert = sshpk . parseCertificate (
405+ fs . readFileSync ( path . join ( testDir , 'yubikey.pem' ) ) ,
406+ 'pem' ) ;
407+ t . strictEqual ( cert . subjectKey . type , 'ecdsa' ) ;
408+ t . strictEqual ( cert . subjects [ 0 ] . cn , 'YubiKey PIV Attestation 9e' ) ;
409+
410+ var serialExt = cert . getExtension ( '1.3.6.1.4.1.41482.3.7' ) ;
411+ t . ok ( serialExt ) ;
412+ var der = new asn1 . Ber . Reader ( serialExt . data ) ;
413+ t . strictEqual ( der . readInt ( ) , 5213681 ) ;
414+
415+ var policyExt = cert . getExtension ( '1.3.6.1.4.1.41482.3.8' ) ;
416+ t . ok ( policyExt ) ;
417+ t . strictEqual ( policyExt . data [ 0 ] , 0x01 ) ; /* never require PIN */
418+ t . strictEqual ( policyExt . data [ 1 ] , 0x01 ) ; /* never require touch */
419+
420+ t . end ( ) ;
421+ } ) ;
422+
423+ test ( 'example cert: openssh extensions' , function ( t ) {
424+ var cert = sshpk . parseCertificate (
425+ fs . readFileSync ( path . join ( testDir , 'openssh-exts.pub' ) ) ,
426+ 'openssh' ) ;
427+ t . strictEqual ( cert . subjectKey . type , 'ecdsa' ) ;
428+ t . strictEqual ( cert . subjects [ 0 ] . uid , 'foo' ) ;
429+
430+ var forceCmdExt = cert . getExtension ( 'force-command' ) ;
431+ t . ok ( forceCmdExt ) ;
432+ t . strictEqual ( forceCmdExt . name , 'force-command' ) ;
433+ t . strictEqual ( forceCmdExt . critical , true ) ;
434+
435+ var cmdbuf = new SSHBuffer ( { buffer : forceCmdExt . data } ) ;
436+ var cmd = cmdbuf . readString ( ) ;
437+ t . strictEqual ( cmd , 'foobarcmd' ) ;
438+ t . ok ( cmdbuf . atEnd ( ) ) ;
439+
440+ t . ok ( cert . getExtension ( 'permit-port-forwarding' ) ) ;
441+ t . notOk ( cert . getExtension ( 'source-address' ) ) ;
442+ t . notOk ( cert . getExtension ( 'permit-pty' ) ) ;
443+
444+ t . end ( ) ;
445+ } ) ;
0 commit comments