@@ -61,8 +61,7 @@ x509_cert_pub_key (napi_env env, napi_callback_info info)
6161 napi_throw_error (env , NULL , "Failed to allocate memory" );
6262 return NULL ;
6363 }
64- if (napi_get_value_string_utf8 (env , argv [0 ], buf ,
65- size , & size ) != napi_ok )
64+ if (napi_get_value_string_utf8 (env , argv [0 ], buf , size , & size ) != napi_ok )
6665 {
6766 napi_throw_error (env , NULL , "Failed to parse string" );
6867 free (buf );
@@ -77,7 +76,7 @@ x509_cert_pub_key (napi_env env, napi_callback_info info)
7776 }
7877 if ((x509 = PEM_read_bio_X509 (bio , 0 , 0 , 0 )) == NULL )
7978 {
80- napi_throw_error (env , NULL , "Failed to read x509 from bio " );
79+ napi_throw_error (env , NULL , "Failed to read x509 from BIO " );
8180 BIO_free (bio );
8281 free (buf );
8382 return NULL ;
@@ -103,7 +102,7 @@ x509_cert_pub_key (napi_env env, napi_callback_info info)
103102 if (public_key -> n == NULL || public_key -> e == NULL )
104103 {
105104 napi_throw_error (env , NULL , "One or more required values in the "
106- "public key is null" );
105+ "public key is null" );
107106 RSA_free (public_key );
108107 EVP_PKEY_free (evp_pubkey );
109108 X509_free (x509 );
@@ -146,17 +145,30 @@ x509_cert_pub_key (napi_env env, napi_callback_info info)
146145 return obj ;
147146}
148147
148+ static int
149+ pass_cb (char * buf , int size , int rwflag , void * u )
150+ {
151+ if (u == NULL )
152+ return -1 ;
153+
154+ size_t len = strlen (u );
155+ memcpy (buf , u , len > (size_t ) size ? (size_t ) size : len );
156+ return len ;
157+ }
158+
149159static napi_value
150160rsa_priv_key (napi_env env , napi_callback_info info )
151161{
152- size_t argc = 1 , size ;
162+ size_t argc = 2 , size , pass_size ;
153163 napi_value argv [argc ];
154- char * buf ;
164+ char * buf , * passphrase = NULL ;
155165 napi_status status = napi_ok ;
166+ napi_valuetype valuetype ;
156167
157- RSA * private_key ;
168+ RSA * private_key ;
158169 BIO * bio ;
159- char * n_hex , * e_hex , * d_hex , * p_hex , * q_hex , * dmp1_hex , * dmq1_hex , * iqmp_hex ;
170+ char * n_hex , * e_hex , * d_hex , * p_hex , * q_hex , * dmp1_hex , * dmq1_hex ,
171+ * iqmp_hex ;
160172 napi_value n_val , e_val , d_val , p_val , q_val , dmp1_val , dmq1_val , iqmp_val ;
161173 napi_value obj ;
162174
@@ -180,24 +192,64 @@ rsa_priv_key (napi_env env, napi_callback_info info)
180192 napi_throw_error (env , NULL , "Failed to allocate memory" );
181193 return NULL ;
182194 }
183- if (napi_get_value_string_utf8 (env , argv [0 ], buf ,
184- size , & size ) != napi_ok )
195+ if (napi_get_value_string_utf8 (env , argv [0 ], buf , size , & size ) != napi_ok )
185196 {
186197 napi_throw_error (env , NULL , "Failed to parse string" );
187198 free (buf );
188199 return NULL ;
189200 }
201+ if (argc > 1 )
202+ {
203+ if (napi_typeof (env , argv [1 ], & valuetype ) != napi_ok )
204+ {
205+ napi_throw_error (env , NULL , "cannot get type of second argument" );
206+ free (buf );
207+ return NULL ;
208+ }
209+ }
210+ if (argc > 1 && valuetype != napi_undefined && valuetype != napi_null )
211+ {
212+ if (napi_get_value_string_utf8 (env , argv [1 ], NULL , 0 , & pass_size ) !=
213+ napi_ok )
214+ {
215+ napi_throw_error (env , NULL , "Failed to read passphrase: "
216+ "make sure passphrase is a string" );
217+ free (buf );
218+ return NULL ;
219+ }
220+ if ((passphrase = malloc (++ pass_size )) == NULL )
221+ {
222+ napi_throw_error (env , NULL , "Failed to allocate memory" );
223+ free (buf );
224+ return NULL ;
225+ }
226+ if (napi_get_value_string_utf8
227+ (env , argv [1 ], passphrase , pass_size , & pass_size ) != napi_ok )
228+ {
229+ napi_throw_error (env , NULL , "Failed to read passphrase: "
230+ "make sure passphrase is a string" );
231+ free (buf );
232+ if (passphrase )
233+ free (passphrase );
234+ return NULL ;
235+ }
236+ }
190237 if ((bio = BIO_new_mem_buf (buf , size )) == NULL )
191238 {
192239 napi_throw_error (env , NULL , "Failed to copy key into buffer" );
193240 free (buf );
241+ if (passphrase )
242+ free (passphrase );
194243 return NULL ;
195244 }
196- if ((private_key = PEM_read_bio_RSAPrivateKey (bio , 0 , 0 , 0 )) == NULL )
245+ if ((private_key =
246+ PEM_read_bio_RSAPrivateKey (bio , NULL , pass_cb , passphrase )) == NULL )
197247 {
198- napi_throw_error (env , NULL , "Failed to read key from bio " );
248+ napi_throw_error (env , NULL , "Failed to read private key from BIO " );
199249 BIO_free (bio );
200250 free (buf );
251+ if (passphrase )
252+ free (passphrase );
201253 return NULL ;
202254 }
203255
@@ -207,10 +259,12 @@ rsa_priv_key (napi_env env, napi_callback_info info)
207259 private_key -> dmq1 == NULL || private_key -> iqmp == NULL )
208260 {
209261 napi_throw_error (env , NULL , "One or more required values in the "
210- "private key is null" );
262+ "private key is null" );
211263 RSA_free (private_key );
212264 BIO_free (bio );
213265 free (buf );
266+ if (passphrase )
267+ free (passphrase );
214268 return NULL ;
215269 }
216270
@@ -226,15 +280,20 @@ rsa_priv_key (napi_env env, napi_callback_info info)
226280 BIO_free (bio );
227281 RSA_free (private_key );
228282 free (buf );
283+ if (passphrase )
284+ free (passphrase );
229285
230286 status |= napi_create_string_utf8 (env , n_hex , strlen (n_hex ), & n_val );
231287 status |= napi_create_string_utf8 (env , e_hex , strlen (e_hex ), & e_val );
232288 status |= napi_create_string_utf8 (env , d_hex , strlen (d_hex ), & d_val );
233289 status |= napi_create_string_utf8 (env , p_hex , strlen (p_hex ), & p_val );
234290 status |= napi_create_string_utf8 (env , q_hex , strlen (q_hex ), & q_val );
235- status |= napi_create_string_utf8 (env , dmp1_hex , strlen (dmp1_hex ), & dmp1_val );
236- status |= napi_create_string_utf8 (env , dmq1_hex , strlen (dmq1_hex ), & dmq1_val );
237- status |= napi_create_string_utf8 (env , iqmp_hex , strlen (iqmp_hex ), & iqmp_val );
291+ status |=
292+ napi_create_string_utf8 (env , dmp1_hex , strlen (dmp1_hex ), & dmp1_val );
293+ status |=
294+ napi_create_string_utf8 (env , dmq1_hex , strlen (dmq1_hex ), & dmq1_val );
295+ status |=
296+ napi_create_string_utf8 (env , iqmp_hex , strlen (iqmp_hex ), & iqmp_val );
238297 status |= napi_create_object (env , & obj );
239298
240299 free (n_hex );
@@ -271,24 +330,28 @@ rsa_priv_key (napi_env env, napi_callback_info info)
271330}
272331
273332static napi_value
274- init (napi_env env , napi_value exports ) {
333+ init (napi_env env , napi_value exports )
334+ {
275335 napi_value rsa_fn , x509_fn ;
276336
337+ OpenSSL_add_all_algorithms ();
338+ OpenSSL_add_all_ciphers ();
339+
277340 if (napi_create_function (env , NULL , 0 , rsa_priv_key ,
278- NULL , & rsa_fn ) != napi_ok )
341+ NULL , & rsa_fn ) != napi_ok )
279342 napi_throw_error (env , NULL , "Unable to wrap native rsa function" );
280343 if (napi_create_function (env , NULL , 0 , x509_cert_pub_key ,
281- NULL , & x509_fn ) != napi_ok )
344+ NULL , & x509_fn ) != napi_ok )
282345 napi_throw_error (env , NULL , "Unable to wrap native x509 function" );
283346
284347 if (napi_set_named_property (env , exports , "RSAPrivateKey" ,
285- rsa_fn ) != napi_ok )
348+ rsa_fn ) != napi_ok )
286349 napi_throw_error (env , NULL , "Unable to populate exports with rsa" );
287350 if (napi_set_named_property (env , exports , "X509PublicKey" ,
288- x509_fn ) != napi_ok )
351+ x509_fn ) != napi_ok )
289352 napi_throw_error (env , NULL , "Unable to populate exports with x509" );
290353
291354 return exports ;
292355}
293356
294- NAPI_MODULE (NODE_GYP_MODULE_NAME , init )
357+ NAPI_MODULE (NODE_GYP_MODULE_NAME , init )
0 commit comments