Skip to content

Commit 7e4eddd

Browse files
jjhoughtonmoxonj
authored andcommitted
add the ability to specify a passphase for the private key (#2)
Signed-off-by: James Moxon <[email protected]> Signed-off-by: Joshua Houghton <[email protected]>
1 parent ec99d71 commit 7e4eddd

File tree

17 files changed

+1033
-85
lines changed

17 files changed

+1033
-85
lines changed

binding.gyp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
"targets": [
33
{
44
"target_name": "node_openssl",
5-
"sources": [ "./main.c" ]
5+
"sources": [ "./main.c" ],
6+
"cflags": [
7+
"-Wall"
8+
]
69
}
710
]
811
}

main.c

Lines changed: 85 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
149159
static napi_value
150160
rsa_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

273332
static 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)

main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
module.exports = require("./build/Release/node_openssl");
1+
module.exports = require('bindings')('node_openssl');

package.json

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@
55
"private": true,
66
"gypfile": true,
77
"scripts": {
8-
"start": "node-gyp configure build && node module.js",
9-
"test": "node test.js"
8+
"configure": "node-gyp configure",
9+
"build": "node-gyp --debug rebuild",
10+
"indent": "indent *.c *.h",
11+
"test": "cd test && node test.js"
12+
},
13+
"dependencies": {
14+
"bindings": "^1.2.1",
15+
"node-gyp": ""
1016
},
1117
"engines": {
12-
"node" : ">=8.4.0"
18+
"node": ">=8.4.0"
1319
},
1420
"author": "Joshua Houghton <[email protected]",
1521
"license": "LGPL"

test.js

Lines changed: 0 additions & 58 deletions
This file was deleted.

test/1cert

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC0TCCAbkCAQEwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCR0IxEzARBgNV
3+
BAgMCkNoZWx0ZW5oYW0xDzANBgNVBAoMBlJpcGphcjESMBAGA1UEAwwJUmlwamFy
4+
IENBMB4XDTE5MDQxNTEyNDgzMFoXDTQ2MDgzMTEyNDgzMFowFjEUMBIGA1UEAwwL
5+
SmFtZXMgTW94b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNpKKs
6+
xlWUokSUY1XBRRHlkkz5BKnr8xtb3FPJeOElouDKZTNjF/15V4z3sz/rm3iTioJw
7+
5PJu3y/Yzg5X1eg4SL90QkuKlqwPHLuoGhh+38JCmsPlwlBf3bQp0TET0RogTHPJ
8+
i9W+66FwkOSd1PmzX5jAcFn4WtyBIISFPoRsRBeGvHEuPDsSai3fBES2kqWt/SMm
9+
Qeqv3B0vt14wSlCvllqtKhWQ2enghGaWDgmM9tW/HOUCH+Ajeag9W92gMrF61qxC
10+
rsJK5PK98jFEoE+IUcnG3e3NiOrwhXf+FYc+eejB//e1BUgcOBMvrKzEM6K1HP2P
11+
woPHPRfp6Ayaeq+vAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAFNGe7so0G+nZcl0
12+
Lr/76IWO+3U0aZVeY2lOqyhICWxqexspSvfCJB5Zs3fh/HAMGhGCz0HueLY7/zoJ
13+
E+sOtOx1zmqNxKGR9U8jEv578ou24atyRWmXcTY67Sld+zGES3tnJeF7VZZ0wTed
14+
1y3i/KxxWxxob2W7ub0K6ULu6st3upVZ0K3T20gaqJ1gfnJEKUsOFocDX4WjTo13
15+
+NlMQw7Fhzt4rqzrRaam2y/hye/Vnvu81K+rbi8vC8bmH1lFttlXfic+0bYiLNzc
16+
sBbSr3qHmq2mLUtiBnAgBniIaVjBu0yssdkod3BLUwka2inUtVsynrB/rF3XUbbt
17+
ZsP1whw=
18+
-----END CERTIFICATE-----

test/1key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDNpKKsxlWUokSU
3+
Y1XBRRHlkkz5BKnr8xtb3FPJeOElouDKZTNjF/15V4z3sz/rm3iTioJw5PJu3y/Y
4+
zg5X1eg4SL90QkuKlqwPHLuoGhh+38JCmsPlwlBf3bQp0TET0RogTHPJi9W+66Fw
5+
kOSd1PmzX5jAcFn4WtyBIISFPoRsRBeGvHEuPDsSai3fBES2kqWt/SMmQeqv3B0v
6+
t14wSlCvllqtKhWQ2enghGaWDgmM9tW/HOUCH+Ajeag9W92gMrF61qxCrsJK5PK9
7+
8jFEoE+IUcnG3e3NiOrwhXf+FYc+eejB//e1BUgcOBMvrKzEM6K1HP2PwoPHPRfp
8+
6Ayaeq+vAgMBAAECggEAOtzAL6JJxtS3up3AYyTpHYRGAhViqgYZM68aUJYIJCS+
9+
IVDcZ6XrSPtVf2VQi5kh52GDOttdxXyfDnjUxDGXWd0A6D89rjq4n07DLDfkART9
10+
XuE75506MmacdkfJu3lj+BDKJ8ud8Bs0R6tBtSfMHZrkd1jxd9RSP6fWJumhL/e+
11+
QM92ZNgbc8Uqk/tvxmrLcjrMgb46kvb5SC/FwGsOII+06fEpRde6O7IzknDIYu1w
12+
iKGi2gEZ38DA/Pp24AqrErYQ8TQ1V9sz0ddJCUez5YH8WnE6hjmpcxnqn6McTbP1
13+
n8QK2/98Yq/hbdJ3oz2zfCjrwGvj4V052i/rgUIHsQKBgQDpivZL8yl5qXM49oOe
14+
mSJ0XnZ3PmgFTQ45/6WeD1Epf0LyG49/Q5FF4cERUS7HU3QWZVYDE1OpmkIxKh7t
15+
nCoDJqkPWPEhGZskCD/fBgP1+miUtrdMr4klDWhLX98+Wta9ULWvu9rHuijRkFoW
16+
KYe/Ai09L3kSWDvyXD6pJZmx5wKBgQDhauBYLwQtPCPkCexdwwHDxIDAnTT06dFr
17+
KYEmaKmVu6Jqt1KR8tG4tIhAo9XRRjDjRJ8+5kvhXlD1+vDKXvt4JVqqa3ANyvGS
18+
YHGVJaQEU8p6A7J0avNmWWm1jlEybdyvuXx3Kc/lMIEmmxRyvpJOM0rpxpoJcRBO
19+
KRoFBLVq+QKBgCGC6yyiy8TFZ984oFJVrvf7xgv+THbWQ8BWyrEPiZnmxPhws/qS
20+
+3mHl2iguZGoi/PavqjaURr5I55iaOW3jt+84G1vWcpiHjzhYijieBcHw5HzVgIO
21+
/iLu9ZQ7QZF0/3NS7X81+YLHV6wahpK/itcBvPQWp8zWFGQGkIc8+fzpAoGBAMrz
22+
S8t5gTws4m+E06/TS/pzKCzDHZPIFIl0E9h98PljtyZ3qTrIMTQoLmhsWa0Skh98
23+
gBfEhtsA7MmaxkKd47DXiNrY4kk4x+ivNnQ/MH3I5wqV24zfYgdrRzZ0TPynV0NL
24+
MBmlpozF7/HPPEjW9ai8m50A91y61CBa9xc/lwsZAoGAVRIBD/OsDKoH/fMicg/L
25+
+dDeO1hjTRLOY/03w70SRnZsUhfZlSS9CmLC27+4OqVniI446UmzP8veOSqbVoUV
26+
Btg7HmFMSSmoQde79G4F0lmkBBimwcbEKbzZln9QSyI9vM4221+V7MM1VNcXJPuG
27+
nrcTOpBvGFCDEZP80lItePs=
28+
-----END PRIVATE KEY-----

test/1mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CDA4A2ACC65594A244946355C14511E5924CF904A9EBF31B5BDC53C978E125A2E0CA65336317FD79578CF7B33FEB9B78938A8270E4F26EDF2FD8CE0E57D5E83848BF74424B8A96AC0F1CBBA81A187EDFC2429AC3E5C2505FDDB429D13113D11A204C73C98BD5BEEBA17090E49DD4F9B35F98C07059F85ADC812084853E846C441786BC712E3C3B126A2DDF0444B692A5ADFD232641EAAFDC1D2FB75E304A50AF965AAD2A1590D9E9E08466960E098CF6D5BF1CE5021FE02379A83D5BDDA032B17AD6AC42AEC24AE4F2BDF23144A04F8851C9C6DDEDCD88EAF08577FE15873E79E8C1FFF7B505481C38132FACACC433A2B51CFD8FC283C73D17E9E80C9A7AAFAF

test/2key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEAyDnDB9i0Q3HldUz/S2k47pxqH83mOTZc1aevxhEDzAI4v5Um
3+
kPNASimKlkCSsPSFW6/gkxCVJIfYM+XC4/XF3dsR8Mu0jXiqjTrQJNAeaOFR9Pss
4+
/2nVFLcJEtepIJ7jwSED2Jtsooyzmm0mteXeOID3JmzVjo1bcU71bKLjqFt7/mkV
5+
aIjxVTiZB0u6GBYba86572YixiJUDfHaBvZfrlfIOT7IgczwsgazdPnzyiOHXEbw
6+
8DcT950E/eOE1yD9daYWFlkc094R8JllOHzyUoZ8QpL+1rFV9Dwjm+QlV9nxcQqp
7+
5nsyBKarbrQDnafUQwEImBtGNOomAk6Cf/PGsQIDAQABAoIBAQCwrGcvMUQ+ju2N
8+
h5dtDzexNEtgLOqMaS+ZRxGOj8zt4rf4NL+G/10nE2i6E9hcVCaoNJTQr70qMsPP
9+
Z1mElIU3seous1Bp1KOJYu/uy8VJfig3JrsZ1GS0lp1nBuyxYAJPk7Y1F0/QTp7c
10+
EJwrvN1Mtl9ehIIb+xdI8AcXCNQg5Kjkyb1BOgd1T3+nUi9hchAqCL2B9ppXoeXz
11+
19WcAJJsgCFutLF+AetSR8H8KJMyMa/pp7fH7ydAcA9CmBaLE0uaxWWCHHjKt3oA
12+
EJ4cdvUxHUkvJGpUMtOm1/zSNz/pc1tUkFhYInqlg3DPB4pwQnPaH5sf2Fg4mUwW
13+
YH+ILCERAoGBAOgXhKIPJ9GZ2DMALgE3MZXGHY+iS/XtMfU7IfGvbOlbYIRljoPv
14+
oAhI6cNPD9zpmptqIv7BhFdVmDb6hNRORgGC8iawI+8aL3Ks4hg/smiIMwnFA/ag
15+
Vy/vcKtueWwOqLlqYl8bB0x1GTh+pufO0lv5hVN9N9c09/P+rOmQ2M6/AoGBANzZ
16+
5qeuD4qnY6KBOFw7x6I6HSYTJP5ELPWGoDJX1A3O/zUHR4Ig7/hGmtaqyBNk5Vix
17+
EPmIW17obXVf3ClE8DQts1Br/UfCW5Hlsb+f0rG0ANkxcaqNvAUBE+m+p66R1Rma
18+
xBJOGvBPMY2zZp1OHN3kJQFNusI9S+ZDHFavxDaPAoGADnWgosQU8/8EtDC3rQW2
19+
RiGAp/kxiFHNwfx8IeWPAH7b5YO6PEgKjVmVjsB3OYkoQ7R6F6sQxqwjfpFfAycZ
20+
P3DcC0MACh50hE13DJGzWMXbgClRFOVqaSceut94Gx5SrrKNDGXPr5jACIADf/+n
21+
pWlHQCtV9kdrhzz/otGOYFsCgYEAq0+LD36BJ7h4HNHHeiQU0s3pVmN7SpBvn3Ry
22+
RxrBroRmiie/XD1YZ2m9Kc8Hq6OUE5wl4qnW1mPMpENbb9e9y3u3oCZkLYmhpiZa
23+
Hp5GvPk3v0IPPZD7y5XucF4ni84rUtUuSlSzqLyFX7lNW6//zE7wNXap64nImjBs
24+
hwGIXhkCgYA2ChGJCBQrsy1iRzKwRMNwkGPFDxJh+S9yr0G3uqXbKEZg4IAwSFYy
25+
rkAVQzV9EYl4ZuLJjlACSMsGEwzF0dXzVpnIKt9dl/3LdJy8ZV7spwI6/ctnJtbz
26+
V17zJpfiSVOl1JTLNG/r3OBQsvYn4Ly8mNMWBXeGxBah8D9vfKFxnw==
27+
-----END RSA PRIVATE KEY-----

test/2mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
C839C307D8B44371E5754CFF4B6938EE9C6A1FCDE639365CD5A7AFC61103CC0238BF952690F3404A298A964092B0F4855BAFE09310952487D833E5C2E3F5C5DDDB11F0CBB48D78AA8D3AD024D01E68E151F4FB2CFF69D514B70912D7A9209EE3C12103D89B6CA28CB39A6D26B5E5DE3880F7266CD58E8D5B714EF56CA2E3A85B7BFE69156888F1553899074BBA18161B6BCEB9EF6622C622540DF1DA06F65FAE57C8393EC881CCF0B206B374F9F3CA23875C46F0F03713F79D04FDE384D720FD75A61616591CD3DE11F09965387CF252867C4292FED6B155F43C239BE42557D9F1710AA9E67B3204A6AB6EB4039DA7D4430108981B4634EA26024E827FF3C6B1

0 commit comments

Comments
 (0)