11var ber = require ( 'asn1' ) . Ber ;
2+ var _ = require ( 'lodash' ) ;
23var utils = require ( '../utils' ) ;
34
45module . exports = {
5- privateExport : function ( key , options ) {
6+ privateExport : function ( key , options ) {
67 options = options || { } ;
78
8- var der = module . exports . privateDerEncode ( key ) ;
9- if ( options . binary ) {
10- return der ;
11- } else {
12- return '-----BEGIN RSA PRIVATE KEY-----\n' + utils . linebrk ( der . toString ( 'base64' ) , 64 ) + '\n-----END RSA PRIVATE KEY-----' ;
13- }
14- } ,
15-
16- publicExport : function ( key , options ) {
17- options = options || { } ;
18-
19- var der = module . exports . publicDerEncode ( key ) ;
20- if ( options . binary ) {
21- return der ;
22- } else {
23- return '-----BEGIN RSA PUBLIC KEY-----\n' + utils . linebrk ( der . toString ( 'base64' ) , 64 ) + '\n-----END RSA PUBLIC KEY-----' ;
24- }
25- } ,
26-
27- privateDerEncode : function ( key ) {
289 var n = key . n . toBuffer ( ) ;
2910 var d = key . d . toBuffer ( ) ;
3011 var p = key . p . toBuffer ( ) ;
@@ -48,10 +29,45 @@ module.exports = {
4829 writer . writeBuffer ( coeff , 2 ) ;
4930 writer . endSequence ( ) ;
5031
51- return writer . buffer ;
32+ if ( options . binary ) {
33+ return writer . buffer ;
34+ } else {
35+ return '-----BEGIN RSA PRIVATE KEY-----\n' + utils . linebrk ( writer . buffer . toString ( 'base64' ) , 64 ) + '\n-----END RSA PRIVATE KEY-----' ;
36+ }
5237 } ,
5338
54- publicDerEncode : function ( key ) {
39+ privateImport : function ( key , data ) {
40+ var buffer ;
41+
42+ if ( _ . isString ( data ) ) {
43+ var pem = data . replace ( '-----BEGIN RSA PRIVATE KEY-----' , '' )
44+ . replace ( '-----END RSA PRIVATE KEY-----' , '' )
45+ . replace ( / \s + | \n \r | \n | \r $ / gm, '' ) ;
46+ buffer = new Buffer ( pem , 'base64' ) ;
47+ } else if ( Buffer . isBuffer ( data ) ) {
48+ buffer = data ;
49+ } else {
50+ throw Error ( 'Unsupported key format' ) ;
51+ }
52+
53+ var reader = new ber . Reader ( buffer ) ;
54+ reader . readSequence ( ) ;
55+ reader . readString ( 2 , true ) ; // just zero
56+ key . setPrivate (
57+ reader . readString ( 2 , true ) , // modulus
58+ reader . readString ( 2 , true ) , // publicExponent
59+ reader . readString ( 2 , true ) , // privateExponent
60+ reader . readString ( 2 , true ) , // prime1
61+ reader . readString ( 2 , true ) , // prime2
62+ reader . readString ( 2 , true ) , // exponent1 -- d mod (p1)
63+ reader . readString ( 2 , true ) , // exponent2 -- d mod (q-1)
64+ reader . readString ( 2 , true ) // coefficient -- (inverse of q) mod p
65+ ) ;
66+ } ,
67+
68+ publicExport : function ( key , options ) {
69+ options = options || { } ;
70+
5571 var n = key . n . toBuffer ( ) ;
5672 var length = n . length + 512 ; // magic
5773
@@ -60,6 +76,30 @@ module.exports = {
6076 bodyWriter . writeBuffer ( n , 2 ) ;
6177 bodyWriter . writeInt ( key . e ) ;
6278 bodyWriter . endSequence ( ) ;
63- return bodyWriter . buffer ;
79+
80+ if ( options . binary ) {
81+ return bodyWriter . buffer ;
82+ } else {
83+ return '-----BEGIN RSA PUBLIC KEY-----\n' + utils . linebrk ( bodyWriter . buffer . toString ( 'base64' ) , 64 ) + '\n-----END RSA PUBLIC KEY-----' ;
84+ }
85+ } ,
86+
87+ /**
88+ * Trying autodetect and import key
89+ * @param key
90+ * @param data
91+ */
92+ autoImport : function ( key , data ) {
93+ if ( / ^ \s * - - - - - B E G I N R S A P R I V A T E K E Y - - - - - \s * ( [ A - Z a - z 0 - 9 + / = ] + \s * ) + - - - - - E N D R S A P R I V A T E K E Y - - - - - \s * $ / g. test ( data ) ) {
94+ module . exports . privateImport ( key , data ) ;
95+ return true ;
96+ }
97+
98+ if ( / ^ \s * - - - - - B E G I N R S A P U B L I C K E Y - - - - - \s * ( [ A - Z a - z 0 - 9 + / = ] + \s * ) + - - - - - E N D R S A P U B L I C K E Y - - - - - \s * $ / g. test ( data ) ) {
99+ module . exports . publicImport ( key , data ) ;
100+ return true ;
101+ }
102+
103+ return false ;
64104 }
65105} ;
0 commit comments