@@ -385,13 +385,17 @@ function readPkcs8EdDSAPrivate(der) {
385385 var k = der . readString ( asn1 . Ber . OctetString , true ) ;
386386 k = utils . zeroPadToLength ( k , 32 ) ;
387387
388- var A ;
389- if ( der . peek ( ) === asn1 . Ber . BitString ) {
390- A = utils . readBitString ( der ) ;
391- A = utils . zeroPadToLength ( A , 32 ) ;
392- } else {
393- A = utils . calculateED25519Public ( k ) ;
388+ var A , tag ;
389+ while ( ( tag = der . peek ( ) ) !== null ) {
390+ if ( tag === ( asn1 . Ber . Context | 1 ) ) {
391+ A = utils . readBitString ( der , tag ) ;
392+ } else {
393+ der . readSequence ( tag ) ;
394+ der . _offset += der . length ;
395+ }
394396 }
397+ if ( A === undefined )
398+ A = utils . calculateED25519Public ( k ) ;
395399
396400 var key = {
397401 type : 'ed25519' ,
@@ -435,8 +439,11 @@ function writePkcs8(der, key) {
435439 der . startSequence ( ) ;
436440
437441 if ( PrivateKey . isPrivateKey ( key ) ) {
438- var sillyInt = Buffer . from ( [ 0 ] ) ;
439- der . writeBuffer ( sillyInt , asn1 . Ber . Integer ) ;
442+ var version = 0 ;
443+ if ( key . type === 'ed25519' )
444+ version = 1 ;
445+ var vbuf = Buffer . from ( [ version ] ) ;
446+ der . writeBuffer ( vbuf , asn1 . Ber . Integer ) ;
440447 }
441448
442449 der . startSequence ( ) ;
@@ -465,9 +472,9 @@ function writePkcs8(der, key) {
465472 case 'ed25519' :
466473 der . writeOID ( '1.3.101.112' ) ;
467474 if ( PrivateKey . isPrivateKey ( key ) )
468- throw ( new Error ( 'Ed25519 private keys in pkcs8 ' +
469- 'format are not supported' ) ) ;
470- writePkcs8EdDSAPublic ( key , der ) ;
475+ writePkcs8EdDSAPrivate ( key , der ) ;
476+ else
477+ writePkcs8EdDSAPublic ( key , der ) ;
471478 break ;
472479 default :
473480 throw ( new Error ( 'Unsupported key type: ' + key . type ) ) ;
@@ -624,8 +631,13 @@ function writePkcs8EdDSAPublic(key, der) {
624631function writePkcs8EdDSAPrivate ( key , der ) {
625632 der . endSequence ( ) ;
626633
627- var k = utils . mpNormalize ( key . part . k . data , true ) ;
628634 der . startSequence ( asn1 . Ber . OctetString ) ;
635+ var k = utils . mpNormalize ( key . part . k . data ) ;
636+ /* RFCs call for storing exactly 32 bytes, so strip any leading zeros */
637+ while ( k . length > 32 && k [ 0 ] === 0x00 )
638+ k = k . slice ( 1 ) ;
629639 der . writeBuffer ( k , asn1 . Ber . OctetString ) ;
630640 der . endSequence ( ) ;
641+
642+ utils . writeBitString ( der , key . part . A . data , asn1 . Ber . Context | 1 ) ;
631643}
0 commit comments