From dd659d394d5eb04a2adf2aa24f20aff09e76934a Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Tue, 24 Sep 2013 16:01:00 +0200 Subject: [PATCH] Add method for extracting public key, type and size from x509 objects --- src/x509.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/x509.c b/src/x509.c index 5f71cd0..311d0c1 100644 --- a/src/x509.c +++ b/src/x509.c @@ -283,6 +283,52 @@ static int meth_pem(lua_State* L) return 1; } +/** + * Extract public key in PEM format. + */ +static int meth_pubkey(lua_State* L) +{ + char* data; + long bytes; + int ret = 1; + X509* cert = lsec_checkx509(L, 1); + BIO *bio = BIO_new(BIO_s_mem()); + EVP_PKEY *pkey = X509_get_pubkey(cert); + if(PEM_write_bio_PUBKEY(bio, pkey)) { + bytes = BIO_get_mem_data(bio, &data); + if (bytes > 0) { + lua_pushlstring(L, data, bytes); + switch(EVP_PKEY_type(pkey->type)) { + case EVP_PKEY_RSA: + lua_pushstring(L, "RSA"); + break; + case EVP_PKEY_DSA: + lua_pushstring(L, "DSA"); + break; + case EVP_PKEY_DH: + lua_pushstring(L, "DH"); + break; + case EVP_PKEY_EC: + lua_pushstring(L, "EC"); + break; + default: + lua_pushstring(L, "Unknown"); + break; + } + lua_pushinteger(L, EVP_PKEY_bits(pkey)); + ret = 3; + } + else + lua_pushnil(L); + } + else + lua_pushnil(L); + /* Cleanup */ + BIO_free(bio); + EVP_PKEY_free(pkey); + return ret; +} + /** * Compute the fingerprint. */ @@ -415,6 +461,7 @@ static luaL_Reg methods[] = { {"notbefore", meth_notbefore}, {"notafter", meth_notafter}, {"pem", meth_pem}, + {"pubkey", meth_pubkey}, {"serial", meth_serial}, {"subject", meth_subject}, {"validat", meth_valid_at},