diff options
| author | william <william@25tandclement.com> | 2014-07-15 21:07:44 -0700 |
|---|---|---|
| committer | william <william@25tandclement.com> | 2014-07-15 21:07:44 -0700 |
| commit | a5b46c650b477cdc673bc52a58a39232460f29fc (patch) | |
| tree | 9f2e002aa24a552b89cf1565173f9122cde513b1 /src | |
| parent | fe955f0f54278f0208c1e1ccec0b5497e5918e6a (diff) | |
| parent | 97c5e6aff52b83fa66f1bea644078d2da2880336 (diff) | |
| download | luaossl-a5b46c650b477cdc673bc52a58a39232460f29fc.tar.gz luaossl-a5b46c650b477cdc673bc52a58a39232460f29fc.tar.bz2 luaossl-a5b46c650b477cdc673bc52a58a39232460f29fc.zip | |
Merge branch 'kunkku-pkcs12'
Diffstat (limited to 'src')
| -rw-r--r-- | src/GNUmakefile | 1 | ||||
| -rw-r--r-- | src/openssl.c | 133 | ||||
| -rw-r--r-- | src/openssl.pkcs12.lua | 1 |
3 files changed, 135 insertions, 0 deletions
diff --git a/src/GNUmakefile b/src/GNUmakefile index 75e8c3a..240a773 100644 --- a/src/GNUmakefile +++ b/src/GNUmakefile | |||
| @@ -96,6 +96,7 @@ MODS$(1)_$(d) = \ | |||
| 96 | $$(DESTDIR)$(3)/openssl/x509/chain.lua \ | 96 | $$(DESTDIR)$(3)/openssl/x509/chain.lua \ |
| 97 | $$(DESTDIR)$(3)/openssl/x509/crl.lua \ | 97 | $$(DESTDIR)$(3)/openssl/x509/crl.lua \ |
| 98 | $$(DESTDIR)$(3)/openssl/x509/store.lua \ | 98 | $$(DESTDIR)$(3)/openssl/x509/store.lua \ |
| 99 | $$(DESTDIR)$(3)/openssl/pkcs12.lua \ | ||
| 99 | $$(DESTDIR)$(3)/openssl/ssl/context.lua \ | 100 | $$(DESTDIR)$(3)/openssl/ssl/context.lua \ |
| 100 | $$(DESTDIR)$(3)/openssl/ssl.lua \ | 101 | $$(DESTDIR)$(3)/openssl/ssl.lua \ |
| 101 | $$(DESTDIR)$(3)/openssl/digest.lua \ | 102 | $$(DESTDIR)$(3)/openssl/digest.lua \ |
diff --git a/src/openssl.c b/src/openssl.c index e1c3b8d..b183524 100644 --- a/src/openssl.c +++ b/src/openssl.c | |||
| @@ -65,6 +65,7 @@ | |||
| 65 | #include <openssl/asn1.h> | 65 | #include <openssl/asn1.h> |
| 66 | #include <openssl/x509.h> | 66 | #include <openssl/x509.h> |
| 67 | #include <openssl/x509v3.h> | 67 | #include <openssl/x509v3.h> |
| 68 | #include <openssl/pkcs12.h> | ||
| 68 | #include <openssl/evp.h> | 69 | #include <openssl/evp.h> |
| 69 | #include <openssl/pem.h> | 70 | #include <openssl/pem.h> |
| 70 | #include <openssl/ssl.h> | 71 | #include <openssl/ssl.h> |
| @@ -89,6 +90,7 @@ | |||
| 89 | #define X509_CRL_CLASS "X509_CRL*" | 90 | #define X509_CRL_CLASS "X509_CRL*" |
| 90 | #define X509_STORE_CLASS "X509_STORE*" | 91 | #define X509_STORE_CLASS "X509_STORE*" |
| 91 | #define X509_STCTX_CLASS "X509_STORE_CTX*" | 92 | #define X509_STCTX_CLASS "X509_STORE_CTX*" |
| 93 | #define PKCS12_CLASS "PKCS12*" | ||
| 92 | #define SSL_CTX_CLASS "SSL_CTX*" | 94 | #define SSL_CTX_CLASS "SSL_CTX*" |
| 93 | #define SSL_CLASS "SSL*" | 95 | #define SSL_CLASS "SSL*" |
| 94 | #define DIGEST_CLASS "EVP_MD_CTX" /* not a pointer */ | 96 | #define DIGEST_CLASS "EVP_MD_CTX" /* not a pointer */ |
| @@ -364,6 +366,18 @@ static _Bool loadfield(lua_State *L, int index, const char *k, int type, void *p | |||
| 364 | } /* loadfield() */ | 366 | } /* loadfield() */ |
| 365 | 367 | ||
| 366 | 368 | ||
| 369 | static void *loadfield_udata(lua_State *L, int index, const char *k, const char *tname) { | ||
| 370 | if (!getfield(L, index, k)) | ||
| 371 | return NULL; | ||
| 372 | |||
| 373 | void **p = luaL_checkudata(L, -1, tname); | ||
| 374 | |||
| 375 | lua_pop(L, 1); /* table keeps reference */ | ||
| 376 | |||
| 377 | return *p; | ||
| 378 | } /* loadfield_udata() */ | ||
| 379 | |||
| 380 | |||
| 367 | static const char *pushnid(lua_State *L, int nid) { | 381 | static const char *pushnid(lua_State *L, int nid) { |
| 368 | const char *txt; | 382 | const char *txt; |
| 369 | ASN1_OBJECT *obj; | 383 | ASN1_OBJECT *obj; |
| @@ -3644,6 +3658,124 @@ int luaopen__openssl_x509_store_context(lua_State *L) { | |||
| 3644 | 3658 | ||
| 3645 | 3659 | ||
| 3646 | /* | 3660 | /* |
| 3661 | * PKCS12 - openssl.pkcs12 | ||
| 3662 | * | ||
| 3663 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | ||
| 3664 | |||
| 3665 | static int p12_new(lua_State *L) { | ||
| 3666 | char *pass = NULL; | ||
| 3667 | loadfield(L, 1, "password", LUA_TSTRING, &pass); | ||
| 3668 | |||
| 3669 | EVP_PKEY *key = loadfield_udata(L, 1, "key", PKEY_CLASS); | ||
| 3670 | STACK_OF(X509) *certs = loadfield_udata(L, 1, "certs", X509_CHAIN_CLASS); | ||
| 3671 | |||
| 3672 | PKCS12 **ud = prepsimple(L, PKCS12_CLASS); | ||
| 3673 | |||
| 3674 | int i; | ||
| 3675 | int no_kcert = 0; | ||
| 3676 | X509 *cert = NULL; | ||
| 3677 | X509 *kcert = NULL; | ||
| 3678 | STACK_OF(X509) *ca; | ||
| 3679 | |||
| 3680 | if (!(ca = sk_X509_new_null())) | ||
| 3681 | goto error; | ||
| 3682 | |||
| 3683 | for (i = 0; i < sk_X509_num(certs); i++) { | ||
| 3684 | cert = sk_X509_value(certs, i); | ||
| 3685 | if (key && X509_check_private_key(cert, key)) { | ||
| 3686 | if (!(kcert = X509_dup(cert))) | ||
| 3687 | goto error; | ||
| 3688 | X509_keyid_set1(kcert, NULL, 0); | ||
| 3689 | X509_alias_set1(kcert, NULL, 0); | ||
| 3690 | } | ||
| 3691 | else sk_X509_push(ca, cert); | ||
| 3692 | } | ||
| 3693 | if (key && !kcert) { | ||
| 3694 | no_kcert = 1; | ||
| 3695 | goto error; | ||
| 3696 | } | ||
| 3697 | |||
| 3698 | if (!(*ud = PKCS12_create(pass, NULL, key, kcert, ca, 0, 0, 0, 0, 0))) | ||
| 3699 | goto error; | ||
| 3700 | |||
| 3701 | if (kcert) | ||
| 3702 | X509_free(kcert); | ||
| 3703 | sk_X509_free(ca); | ||
| 3704 | |||
| 3705 | return 1; | ||
| 3706 | |||
| 3707 | error: | ||
| 3708 | if (kcert) | ||
| 3709 | X509_free(kcert); | ||
| 3710 | if (ca) | ||
| 3711 | sk_X509_free(ca); | ||
| 3712 | |||
| 3713 | if (no_kcert) | ||
| 3714 | luaL_argerror(L, 1, lua_pushfstring(L, "certificate matching the key not found")); | ||
| 3715 | |||
| 3716 | return throwssl(L, "pkcs12.new"); | ||
| 3717 | } /* p12_new() */ | ||
| 3718 | |||
| 3719 | |||
| 3720 | static int p12_interpose(lua_State *L) { | ||
| 3721 | return interpose(L, PKCS12_CLASS); | ||
| 3722 | } /* p12_interpose() */ | ||
| 3723 | |||
| 3724 | |||
| 3725 | static int p12__tostring(lua_State *L) { | ||
| 3726 | PKCS12 *p12 = checksimple(L, 1, PKCS12_CLASS); | ||
| 3727 | BIO *bio = getbio(L); | ||
| 3728 | char *data; | ||
| 3729 | long len; | ||
| 3730 | |||
| 3731 | if (!i2d_PKCS12_bio(bio, p12)) | ||
| 3732 | return throwssl(L, "pkcs12:__tostring"); | ||
| 3733 | |||
| 3734 | len = BIO_get_mem_data(bio, &data); | ||
| 3735 | |||
| 3736 | lua_pushlstring(L, data, len); | ||
| 3737 | |||
| 3738 | return 1; | ||
| 3739 | } /* p12__tostring() */ | ||
| 3740 | |||
| 3741 | |||
| 3742 | static int p12__gc(lua_State *L) { | ||
| 3743 | PKCS12 **ud = luaL_checkudata(L, 1, PKCS12_CLASS); | ||
| 3744 | |||
| 3745 | PKCS12_free(*ud); | ||
| 3746 | *ud = NULL; | ||
| 3747 | |||
| 3748 | return 0; | ||
| 3749 | } /* p12__gc() */ | ||
| 3750 | |||
| 3751 | |||
| 3752 | static const luaL_Reg p12_methods[] = { | ||
| 3753 | { "tostring", &p12__tostring }, | ||
| 3754 | { NULL, NULL }, | ||
| 3755 | }; | ||
| 3756 | |||
| 3757 | static const luaL_Reg p12_metatable[] = { | ||
| 3758 | { "__tostring", &p12__tostring }, | ||
| 3759 | { "__gc", &p12__gc }, | ||
| 3760 | { NULL, NULL }, | ||
| 3761 | }; | ||
| 3762 | |||
| 3763 | static const luaL_Reg p12_globals[] = { | ||
| 3764 | { "new", &p12_new }, | ||
| 3765 | { "interpose", &p12_interpose }, | ||
| 3766 | { NULL, NULL }, | ||
| 3767 | }; | ||
| 3768 | |||
| 3769 | int luaopen__openssl_pkcs12(lua_State *L) { | ||
| 3770 | initall(L); | ||
| 3771 | |||
| 3772 | luaL_newlib(L, p12_globals); | ||
| 3773 | |||
| 3774 | return 1; | ||
| 3775 | } /* luaopen__openssl_pkcs12() */ | ||
| 3776 | |||
| 3777 | |||
| 3778 | /* | ||
| 3647 | * SSL_CTX - openssl.ssl.context | 3779 | * SSL_CTX - openssl.ssl.context |
| 3648 | * | 3780 | * |
| 3649 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | 3781 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
| @@ -4840,6 +4972,7 @@ static void initall(lua_State *L) { | |||
| 4840 | addclass(L, X509_CRL_CLASS, xx_methods, xx_metatable); | 4972 | addclass(L, X509_CRL_CLASS, xx_methods, xx_metatable); |
| 4841 | addclass(L, X509_CHAIN_CLASS, xl_methods, xl_metatable); | 4973 | addclass(L, X509_CHAIN_CLASS, xl_methods, xl_metatable); |
| 4842 | addclass(L, X509_STORE_CLASS, xs_methods, xs_metatable); | 4974 | addclass(L, X509_STORE_CLASS, xs_methods, xs_metatable); |
| 4975 | addclass(L, PKCS12_CLASS, p12_methods, p12_metatable); | ||
| 4843 | addclass(L, SSL_CTX_CLASS, sx_methods, sx_metatable); | 4976 | addclass(L, SSL_CTX_CLASS, sx_methods, sx_metatable); |
| 4844 | addclass(L, SSL_CLASS, ssl_methods, ssl_metatable); | 4977 | addclass(L, SSL_CLASS, ssl_methods, ssl_metatable); |
| 4845 | addclass(L, DIGEST_CLASS, md_methods, md_metatable); | 4978 | addclass(L, DIGEST_CLASS, md_methods, md_metatable); |
diff --git a/src/openssl.pkcs12.lua b/src/openssl.pkcs12.lua new file mode 100644 index 0000000..d8f70c2 --- /dev/null +++ b/src/openssl.pkcs12.lua | |||
| @@ -0,0 +1 @@ | |||
| return require('_openssl.pkcs12') | |||
