@@ -13,6 +13,7 @@ require "resty.openssl.ec"
13
13
local bn_lib = require " resty.openssl.bn"
14
14
require " resty.openssl.bio"
15
15
require " resty.openssl.pem"
16
+ require " resty.openssl.objects"
16
17
local util = require " resty.openssl.util"
17
18
require " resty.openssl.x509"
18
19
local format_error = require (" resty.openssl.err" ).format_error
@@ -188,39 +189,41 @@ local PEM_write_bio_PrivateKey_args = { null, null, 0, null, null }
188
189
local PEM_write_bio_PUBKEY_args = {}
189
190
190
191
local function tostring (self , fmt )
191
- local method
192
+ local method , args
192
193
if fmt == ' private' or fmt == ' PrivateKey' then
193
194
method = ' PEM_write_bio_PrivateKey'
195
+ args = PEM_write_bio_PrivateKey_args
194
196
elseif not fmt or fmt == ' public' or fmt == ' PublicKey' then
195
197
method = ' PEM_write_bio_PUBKEY'
198
+ args = PEM_write_bio_PUBKEY_args
196
199
else
197
200
return nil , " can only export private or public key, not " .. fmt
198
201
end
199
202
200
- local args
201
- if method == ' PEM_write_bio_PrivateKey' then
202
- args = PEM_write_bio_PrivateKey_args
203
- else
204
- args = PEM_write_bio_PUBKEY_args
205
- end
206
-
207
203
return util .read_using_bio (method , self .ctx , unpack (args ))
208
204
end
209
205
210
206
local _M = {}
211
207
local mt = { __index = _M , __tostring = tostring }
212
208
209
+ local evp_ptr_ct = ffi .typeof (' EVP_PKEY*' )
213
210
-- type
214
211
-- bits
215
212
-- exp
216
213
-- curve
217
214
function _M .new (s , ...)
218
- local ctx , err , has_private
215
+ local ctx , err
219
216
s = s or {}
220
217
if type (s ) == ' table' then
221
218
ctx , err = generate_key (s )
222
219
elseif type (s ) == ' string' then
223
220
ctx , err = load_pkey (s , ... )
221
+ elseif type (s ) == ' cdata' then
222
+ if ffi .istype (evp_ptr_ct , s ) then
223
+ ctx = s
224
+ else
225
+ return nil , " expect a EVP_PKEY* cdata at #1"
226
+ end
224
227
else
225
228
return nil , " unexpected type " .. type (s ) .. " at #1"
226
229
end
@@ -237,7 +240,6 @@ function _M.new(s, ...)
237
240
238
241
local self = setmetatable ({
239
242
ctx = ctx ,
240
- -- has_private = has_private,
241
243
key_size = key_size ,
242
244
}, mt )
243
245
@@ -246,8 +248,12 @@ function _M.new(s, ...)
246
248
return self , nil
247
249
end
248
250
251
+ function _M .istype (l )
252
+ return l .ctx and ffi .istype (evp_ptr_ct , l .ctx )
253
+ end
254
+
249
255
local empty_table = {}
250
- local bnptr_type = ffi .typeof (" const BIGNUM *[1]" )
256
+ local bn_ptrptr_ct = ffi .typeof (" const BIGNUM *[1]" )
251
257
local function get_rsa_params_11 (pkey )
252
258
-- {"n", "e", "d", "p", "q", "dmp1", "dmq1", "iqmp"}
253
259
local rsa_st = C .EVP_PKEY_get0_RSA (pkey )
@@ -258,17 +264,17 @@ local function get_rsa_params_11(pkey)
258
264
return setmetatable (empty_table , {
259
265
__index = function (tbl , k )
260
266
if k == ' n' then
261
- local bnptr = bnptr_type ()
262
- C .RSA_get0_key (rsa_st , bnptr , nil , nil )
263
- return bn_lib .new (bnptr [0 ]), nil
267
+ local ptr = bn_ptrptr_ct ()
268
+ C .RSA_get0_key (rsa_st , ptr , nil , nil )
269
+ return bn_lib .new (ptr [0 ]), nil
264
270
elseif k == ' e' then
265
- local bnptr = bnptr_type ()
266
- C .RSA_get0_key (rsa_st , nil , bnptr , nil )
267
- return bn_lib .new (bnptr [0 ]), nil
271
+ local ptr = bn_ptrptr_ct ()
272
+ C .RSA_get0_key (rsa_st , nil , ptr , nil )
273
+ return bn_lib .new (ptr [0 ]), nil
268
274
elseif k == ' d' then
269
- local bnptr = bnptr_type ()
270
- C .RSA_get0_key (rsa_st , nil , nil , bnptr )
271
- return bn_lib .new (bnptr [0 ]), nil
275
+ local ptr = bn_ptrptr_ct ()
276
+ C .RSA_get0_key (rsa_st , nil , nil , ptr )
277
+ return bn_lib .new (ptr [0 ]), nil
272
278
end
273
279
end
274
280
}), nil
0 commit comments