@@ -2,6 +2,30 @@ var ber = require('asn1').Ber;
2
2
var _ = require ( '../utils' ) . _ ;
3
3
var utils = require ( '../utils' ) ;
4
4
5
+ const PRIVATE_OPENING_BOUNDARY = '-----BEGIN RSA PRIVATE KEY-----' ;
6
+ const PRIVATE_CLOSING_BOUNDARY = '-----END RSA PRIVATE KEY-----' ;
7
+
8
+ const PUBLIC_OPENING_BOUNDARY = '-----BEGIN RSA PUBLIC KEY-----' ;
9
+ const PUBLIC_CLOSING_BOUNDARY = '-----END RSA PUBLIC KEY-----' ;
10
+
11
+ /**
12
+ * Strips everything around the opening and closing lines, including the lines
13
+ * themselves.
14
+ */
15
+ function trimSurroundingText ( data , opening , closing ) {
16
+ let openingBoundaryIndex = data . indexOf ( opening ) ;
17
+ if ( openingBoundaryIndex < 0 ) {
18
+ throw Error ( 'Unsupported key format - Missing BEGIN line' ) ;
19
+ }
20
+
21
+ let closingBoundaryIndex = data . indexOf ( closing , openingBoundaryIndex ) ;
22
+ if ( closingBoundaryIndex < 0 ) {
23
+ throw Error ( 'Unsupported key format - Missing END line' ) ;
24
+ }
25
+
26
+ return data . substring ( openingBoundaryIndex + opening . length , closingBoundaryIndex ) ;
27
+ }
28
+
5
29
module . exports = {
6
30
privateExport : function ( key , options ) {
7
31
options = options || { } ;
@@ -46,8 +70,7 @@ module.exports = {
46
70
}
47
71
48
72
if ( _ . isString ( data ) ) {
49
- var pem = data . replace ( '-----BEGIN RSA PRIVATE KEY-----' , '' )
50
- . replace ( '-----END RSA PRIVATE KEY-----' , '' )
73
+ let pem = trimSurroundingText ( data , PRIVATE_OPENING_BOUNDARY , PRIVATE_CLOSING_BOUNDARY )
51
74
. replace ( / \s + | \n \r | \n | \r $ / gm, '' ) ;
52
75
buffer = Buffer . from ( pem , 'base64' ) ;
53
76
} else {
@@ -103,8 +126,7 @@ module.exports = {
103
126
}
104
127
105
128
if ( _ . isString ( data ) ) {
106
- var pem = data . replace ( '-----BEGIN RSA PUBLIC KEY-----' , '' )
107
- . replace ( '-----END RSA PUBLIC KEY-----' , '' )
129
+ var pem = trimSurroundingText ( data , PUBLIC_OPENING_BOUNDARY , PUBLIC_CLOSING_BOUNDARY )
108
130
. replace ( / \s + | \n \r | \n | \r $ / gm, '' ) ;
109
131
buffer = Buffer . from ( pem , 'base64' ) ;
110
132
}
@@ -128,12 +150,13 @@ module.exports = {
128
150
* @param data
129
151
*/
130
152
autoImport : function ( key , data ) {
131
- 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 * ) + ) ) \1- - - - - E N D R S A P R I V A T E K E Y - - - - - \s * $ / g. test ( data ) ) {
153
+ // [\S\s]* matches zero or more of any character
154
+ if ( / ^ [ \S \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 * ) + ) ) \1- - - - - E N D R S A P R I V A T E K E Y - - - - - [ \S \s ] * $ / g. test ( data ) ) {
132
155
module . exports . privateImport ( key , data ) ;
133
156
return true ;
134
157
}
135
158
136
- 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 * ) + ) ) \1- - - - - E N D R S A P U B L I C K E Y - - - - - \s * $ / g. test ( data ) ) {
159
+ if ( / ^ [ \S \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 * ) + ) ) \1- - - - - E N D R S A P U B L I C K E Y - - - - - [ \S \s ] * $ / g. test ( data ) ) {
137
160
module . exports . publicImport ( key , data ) ;
138
161
return true ;
139
162
}
0 commit comments