diff options
| -rw-r--r-- | openssl.c | 313 |
1 files changed, 306 insertions, 7 deletions
| @@ -48,12 +48,16 @@ | |||
| 48 | #include <lauxlib.h> | 48 | #include <lauxlib.h> |
| 49 | 49 | ||
| 50 | 50 | ||
| 51 | #define BIGNUM_CLASS "OpenSSL BN" | 51 | #define BIGNUM_CLASS "OpenSSL Bignum" |
| 52 | #define PUBKEY_CLASS "OpenSSL PK" | 52 | #define PUBKEY_CLASS "OpenSSL Pubkey" |
| 53 | #define X509_NAME_CLASS "OpenSSL X.509 Name" | 53 | #define X509_NAME_CLASS "OpenSSL X.509 Name" |
| 54 | #define X509_GENS_CLASS "OpenSSL X.509 AltName" | 54 | #define X509_GENS_CLASS "OpenSSL X.509 AltName" |
| 55 | #define X509_CERT_CLASS "OpenSSL X.509 Cert" | 55 | #define X509_CERT_CLASS "OpenSSL X.509" |
| 56 | #define X509_CSR_CLASS "OpenSSL X.509 Request" | 56 | #define X509_CHAIN_CLASS "OpenSSL X.509 Chain" |
| 57 | #define X509_CSR_CLASS "OpenSSL X.509 Request" | ||
| 58 | #define X509_CHAIN_CLASS "OpenSSL X.509 Chain" | ||
| 59 | #define X509_STORE_CLASS "OpenSSL X.509 Store" | ||
| 60 | #define X509_STCTX_CLASS "OpenSSL X.509 Store Context" | ||
| 57 | 61 | ||
| 58 | 62 | ||
| 59 | #define countof(a) (sizeof (a) / sizeof *(a)) | 63 | #define countof(a) (sizeof (a) / sizeof *(a)) |
| @@ -2202,6 +2206,43 @@ static int xc_setBasicConstraintsCritical(lua_State *L) { | |||
| 2202 | } /* xc_setBasicConstraintsCritical() */ | 2206 | } /* xc_setBasicConstraintsCritical() */ |
| 2203 | 2207 | ||
| 2204 | 2208 | ||
| 2209 | static int xc_isIssuedBy(lua_State *L) { | ||
| 2210 | X509 *crt = checksimple(L, 1, X509_CERT_CLASS); | ||
| 2211 | X509 *issuer = checksimple(L, 2, X509_CERT_CLASS); | ||
| 2212 | EVP_PKEY *key; | ||
| 2213 | int ok, why = 0; | ||
| 2214 | |||
| 2215 | ERR_clear_error(); | ||
| 2216 | |||
| 2217 | if (X509_V_OK != (why = X509_check_issued(issuer, crt))) | ||
| 2218 | goto done; | ||
| 2219 | |||
| 2220 | if (!(key = X509_get_pubkey(issuer))) { | ||
| 2221 | why = X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY; | ||
| 2222 | goto done; | ||
| 2223 | } | ||
| 2224 | |||
| 2225 | ok = (1 == X509_verify(crt, key)); | ||
| 2226 | |||
| 2227 | EVP_PKEY_free(key); | ||
| 2228 | |||
| 2229 | if (!ok) | ||
| 2230 | why = X509_V_ERR_CERT_SIGNATURE_FAILURE; | ||
| 2231 | |||
| 2232 | done: | ||
| 2233 | if (why != X509_V_OK) { | ||
| 2234 | lua_pushboolean(L, 0); | ||
| 2235 | lua_pushstring(L, X509_verify_cert_error_string(why)); | ||
| 2236 | |||
| 2237 | return 2; | ||
| 2238 | } else { | ||
| 2239 | lua_pushboolean(L, 1); | ||
| 2240 | |||
| 2241 | return 1; | ||
| 2242 | } | ||
| 2243 | } /* xc_isIssuedBy() */ | ||
| 2244 | |||
| 2245 | |||
| 2205 | static int xc_getPublicKey(lua_State *L) { | 2246 | static int xc_getPublicKey(lua_State *L) { |
| 2206 | X509 *crt = checksimple(L, 1, X509_CERT_CLASS); | 2247 | X509 *crt = checksimple(L, 1, X509_CERT_CLASS); |
| 2207 | EVP_PKEY **key = prepsimple(L, PUBKEY_CLASS); | 2248 | EVP_PKEY **key = prepsimple(L, PUBKEY_CLASS); |
| @@ -2312,6 +2353,7 @@ static const luaL_Reg xc_methods[] = { | |||
| 2312 | { "setBasicConstraint", &xc_setBasicConstraint }, | 2353 | { "setBasicConstraint", &xc_setBasicConstraint }, |
| 2313 | { "getBasicConstraintsCritical", &xc_getBasicConstraintsCritical }, | 2354 | { "getBasicConstraintsCritical", &xc_getBasicConstraintsCritical }, |
| 2314 | { "setBasicConstraintsCritical", &xc_setBasicConstraintsCritical }, | 2355 | { "setBasicConstraintsCritical", &xc_setBasicConstraintsCritical }, |
| 2356 | { "isIssuedBy", &xc_isIssuedBy }, | ||
| 2315 | { "getPublicKey", &xc_getPublicKey }, | 2357 | { "getPublicKey", &xc_getPublicKey }, |
| 2316 | { "setPublicKey", &xc_setPublicKey }, | 2358 | { "setPublicKey", &xc_setPublicKey }, |
| 2317 | { "sign", &xc_sign }, | 2359 | { "sign", &xc_sign }, |
| @@ -2530,6 +2572,261 @@ int luaopen__openssl_x509_csr(lua_State *L) { | |||
| 2530 | } /* luaopen__openssl_x509_csr() */ | 2572 | } /* luaopen__openssl_x509_csr() */ |
| 2531 | 2573 | ||
| 2532 | 2574 | ||
| 2575 | /* | ||
| 2576 | * STACK_OF(X509) - openssl.x509.chain | ||
| 2577 | * | ||
| 2578 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | ||
| 2579 | |||
| 2580 | static int xl_new(lua_State *L) { | ||
| 2581 | STACK_OF(X509) **chain = prepsimple(L, X509_CHAIN_CLASS); | ||
| 2582 | |||
| 2583 | if (!(*chain = sk_X509_new_null())) | ||
| 2584 | return throwssl(L, "x509.chain.new"); | ||
| 2585 | |||
| 2586 | return 1; | ||
| 2587 | } /* xl_new() */ | ||
| 2588 | |||
| 2589 | |||
| 2590 | static int xl_interpose(lua_State *L) { | ||
| 2591 | return interpose(L, X509_CHAIN_CLASS); | ||
| 2592 | } /* xl_interpose() */ | ||
| 2593 | |||
| 2594 | |||
| 2595 | static int xl_add(lua_State *L) { | ||
| 2596 | STACK_OF(X509) *chain = checksimple(L, 1, X509_CHAIN_CLASS); | ||
| 2597 | X509 *crt = checksimple(L, 2, X509_CERT_CLASS); | ||
| 2598 | X509 *dup; | ||
| 2599 | |||
| 2600 | if (!(dup = X509_dup(crt))) | ||
| 2601 | return throwssl(L, "x509.chain:add"); | ||
| 2602 | |||
| 2603 | if (!sk_X509_push(chain, dup)) { | ||
| 2604 | X509_free(dup); | ||
| 2605 | return throwssl(L, "x509.chain:add"); | ||
| 2606 | } | ||
| 2607 | |||
| 2608 | lua_pushboolean(L, 1); | ||
| 2609 | |||
| 2610 | return 1; | ||
| 2611 | } /* xl_add() */ | ||
| 2612 | |||
| 2613 | |||
| 2614 | static int xl__next(lua_State *L) { | ||
| 2615 | STACK_OF(X509) *chain = checksimple(L, lua_upvalueindex(1), X509_CHAIN_CLASS); | ||
| 2616 | int i = lua_tointeger(L, lua_upvalueindex(2)); | ||
| 2617 | int n = sk_X509_num(chain); | ||
| 2618 | |||
| 2619 | lua_settop(L, 0); | ||
| 2620 | |||
| 2621 | while (i < n) { | ||
| 2622 | X509 *crt, **ret; | ||
| 2623 | |||
| 2624 | if (!(crt = sk_X509_value(chain, i++))) | ||
| 2625 | continue; | ||
| 2626 | |||
| 2627 | ret = prepsimple(L, X509_CHAIN_CLASS); | ||
| 2628 | |||
| 2629 | if (!(*ret = X509_dup(crt))) | ||
| 2630 | return throwssl(L, "x509.chain:__next"); | ||
| 2631 | |||
| 2632 | break; | ||
| 2633 | } | ||
| 2634 | |||
| 2635 | lua_pushinteger(L, i); | ||
| 2636 | lua_replace(L, lua_upvalueindex(2)); | ||
| 2637 | |||
| 2638 | return lua_gettop(L); | ||
| 2639 | } /* xl__next() */ | ||
| 2640 | |||
| 2641 | static int xl__pairs(lua_State *L) { | ||
| 2642 | lua_settop(L, 1); | ||
| 2643 | lua_pushinteger(L, 0); | ||
| 2644 | lua_pushcclosure(L, &xl__next, 2); | ||
| 2645 | |||
| 2646 | return 1; | ||
| 2647 | } /* xl__pairs() */ | ||
| 2648 | |||
| 2649 | |||
| 2650 | static int xl__gc(lua_State *L) { | ||
| 2651 | STACK_OF(X509) **chain = luaL_checkudata(L, 1, X509_CHAIN_CLASS); | ||
| 2652 | |||
| 2653 | sk_X509_pop_free(*chain, X509_free); | ||
| 2654 | *chain = NULL; | ||
| 2655 | |||
| 2656 | return 0; | ||
| 2657 | } /* xl__gc() */ | ||
| 2658 | |||
| 2659 | |||
| 2660 | static const luaL_Reg xl_methods[] = { | ||
| 2661 | { "add", &xl_add }, | ||
| 2662 | { NULL, NULL }, | ||
| 2663 | }; | ||
| 2664 | |||
| 2665 | static const luaL_Reg xl_metatable[] = { | ||
| 2666 | { "__pairs", &xl__pairs }, | ||
| 2667 | { "__gc", &xl__gc }, | ||
| 2668 | { NULL, NULL }, | ||
| 2669 | }; | ||
| 2670 | |||
| 2671 | static const luaL_Reg xl_globals[] = { | ||
| 2672 | { "new", &xl_new }, | ||
| 2673 | { "interpose", &xl_interpose }, | ||
| 2674 | { NULL, NULL }, | ||
| 2675 | }; | ||
| 2676 | |||
| 2677 | int luaopen__openssl_x509_chain(lua_State *L) { | ||
| 2678 | initall(L); | ||
| 2679 | |||
| 2680 | luaL_newlib(L, xl_globals); | ||
| 2681 | |||
| 2682 | return 1; | ||
| 2683 | } /* luaopen__openssl_x509_chain() */ | ||
| 2684 | |||
| 2685 | |||
| 2686 | /* | ||
| 2687 | * X509_STORE - openssl.x509.store | ||
| 2688 | * | ||
| 2689 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | ||
| 2690 | |||
| 2691 | static int xs_new(lua_State *L) { | ||
| 2692 | X509_STORE **ud = prepsimple(L, X509_STORE_CLASS); | ||
| 2693 | |||
| 2694 | if (!(*ud = X509_STORE_new())) | ||
| 2695 | return throwssl(L, "x509.store"); | ||
| 2696 | |||
| 2697 | return 1; | ||
| 2698 | } /* xs_new() */ | ||
| 2699 | |||
| 2700 | |||
| 2701 | static int xs_interpose(lua_State *L) { | ||
| 2702 | return interpose(L, X509_STORE_CLASS); | ||
| 2703 | } /* xs_interpose() */ | ||
| 2704 | |||
| 2705 | |||
| 2706 | static int xs_add(lua_State *L) { | ||
| 2707 | X509_STORE *store = checksimple(L, 1, X509_STORE_CLASS); | ||
| 2708 | X509 *crt = checksimple(L, 2, X509_CERT_CLASS); | ||
| 2709 | X509 *dup; | ||
| 2710 | |||
| 2711 | if (!(dup = X509_dup(crt))) | ||
| 2712 | return throwssl(L, "x509.store:add"); | ||
| 2713 | |||
| 2714 | if (!X509_STORE_add_cert(store, dup)) { | ||
| 2715 | X509_free(dup); | ||
| 2716 | return throwssl(L, "x509.store:add"); | ||
| 2717 | } | ||
| 2718 | |||
| 2719 | lua_pushboolean(L, 1); | ||
| 2720 | |||
| 2721 | return 1; | ||
| 2722 | } /* xs_add() */ | ||
| 2723 | |||
| 2724 | |||
| 2725 | static int xs__gc(lua_State *L) { | ||
| 2726 | X509_STORE **ud = luaL_checkudata(L, 1, X509_STORE_CLASS); | ||
| 2727 | |||
| 2728 | X509_STORE_free(*ud); | ||
| 2729 | *ud = NULL; | ||
| 2730 | |||
| 2731 | return 0; | ||
| 2732 | } /* xs__gc() */ | ||
| 2733 | |||
| 2734 | |||
| 2735 | static const luaL_Reg xs_methods[] = { | ||
| 2736 | { "add", &xs_add }, | ||
| 2737 | { NULL, NULL }, | ||
| 2738 | }; | ||
| 2739 | |||
| 2740 | static const luaL_Reg xs_metatable[] = { | ||
| 2741 | { "__gc", &xs__gc }, | ||
| 2742 | { NULL, NULL }, | ||
| 2743 | }; | ||
| 2744 | |||
| 2745 | static const luaL_Reg xs_globals[] = { | ||
| 2746 | { "new", &xs_new }, | ||
| 2747 | { "interpose", &xs_interpose }, | ||
| 2748 | { NULL, NULL }, | ||
| 2749 | }; | ||
| 2750 | |||
| 2751 | int luaopen__openssl_x509_store(lua_State *L) { | ||
| 2752 | initall(L); | ||
| 2753 | |||
| 2754 | luaL_newlib(L, xs_globals); | ||
| 2755 | |||
| 2756 | return 1; | ||
| 2757 | } /* luaopen__openssl_x509_store() */ | ||
| 2758 | |||
| 2759 | |||
| 2760 | /* | ||
| 2761 | * X509_STORE_CTX - openssl.x509.store.context | ||
| 2762 | * | ||
| 2763 | * This object is intended to be a temporary container in OpenSSL, so the | ||
| 2764 | * memory management is quite clumsy. In particular, it doesn't take | ||
| 2765 | * ownership of the X509_STORE object, which means the reference must be | ||
| 2766 | * held externally for the life of the X509_STORE_CTX object. | ||
| 2767 | * | ||
| 2768 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | ||
| 2769 | |||
| 2770 | static int sx_new(lua_State *L) { | ||
| 2771 | X509_STORE_CTX **ud = prepsimple(L, X509_STCTX_CLASS); | ||
| 2772 | STACK_OF(X509) *chain; | ||
| 2773 | |||
| 2774 | if (!(*ud = X509_STORE_CTX_new())) | ||
| 2775 | return throwssl(L, "x509.store.context"); | ||
| 2776 | |||
| 2777 | return 1; | ||
| 2778 | } /* sx_new() */ | ||
| 2779 | |||
| 2780 | |||
| 2781 | static int sx_interpose(lua_State *L) { | ||
| 2782 | return interpose(L, X509_STCTX_CLASS); | ||
| 2783 | } /* sx_interpose() */ | ||
| 2784 | |||
| 2785 | |||
| 2786 | static int sx_add(lua_State *L) { | ||
| 2787 | X509_STORE_CTX *ctx = checksimple(L, 1, X509_STCTX_CLASS); | ||
| 2788 | |||
| 2789 | |||
| 2790 | |||
| 2791 | return 0; | ||
| 2792 | } /* sx_add() */ | ||
| 2793 | |||
| 2794 | |||
| 2795 | static int sx__gc(lua_State *L) { | ||
| 2796 | X509_STORE **ud = luaL_checkudata(L, 1, X509_STORE_CLASS); | ||
| 2797 | |||
| 2798 | X509_STORE_free(*ud); | ||
| 2799 | *ud = NULL; | ||
| 2800 | |||
| 2801 | return 0; | ||
| 2802 | } /* sx__gc() */ | ||
| 2803 | |||
| 2804 | |||
| 2805 | static const luaL_Reg sx_methods[] = { | ||
| 2806 | { "add", &sx_add }, | ||
| 2807 | { NULL, NULL }, | ||
| 2808 | }; | ||
| 2809 | |||
| 2810 | static const luaL_Reg sx_metatable[] = { | ||
| 2811 | { "__gc", &sx__gc }, | ||
| 2812 | { NULL, NULL }, | ||
| 2813 | }; | ||
| 2814 | |||
| 2815 | static const luaL_Reg sx_globals[] = { | ||
| 2816 | { "new", &sx_new }, | ||
| 2817 | { "interpose", &sx_interpose }, | ||
| 2818 | { NULL, NULL }, | ||
| 2819 | }; | ||
| 2820 | |||
| 2821 | int luaopen__openssl_x509_store_context(lua_State *L) { | ||
| 2822 | initall(L); | ||
| 2823 | |||
| 2824 | luaL_newlib(L, sx_globals); | ||
| 2825 | |||
| 2826 | return 1; | ||
| 2827 | } /* luaopen__openssl_x509_store_context() */ | ||
| 2828 | |||
| 2829 | |||
| 2533 | 2830 | ||
| 2534 | static void initall(lua_State *L) { | 2831 | static void initall(lua_State *L) { |
| 2535 | ERR_load_crypto_strings(); | 2832 | ERR_load_crypto_strings(); |
| @@ -2540,7 +2837,9 @@ static void initall(lua_State *L) { | |||
| 2540 | addclass(L, X509_NAME_CLASS, xn_methods, xn_metatable); | 2837 | addclass(L, X509_NAME_CLASS, xn_methods, xn_metatable); |
| 2541 | addclass(L, X509_GENS_CLASS, gn_methods, gn_metatable); | 2838 | addclass(L, X509_GENS_CLASS, gn_methods, gn_metatable); |
| 2542 | addclass(L, X509_CERT_CLASS, xc_methods, xc_metatable); | 2839 | addclass(L, X509_CERT_CLASS, xc_methods, xc_metatable); |
| 2543 | addclass(L, X509_CSR_CLASS, xr_methods, xr_metatable); | 2840 | addclass(L, X509_CSR_CLASS, xr_methods, xr_metatable); |
| 2841 | addclass(L, X509_CHAIN_CLASS, xl_methods, xl_metatable); | ||
| 2842 | addclass(L, X509_STORE_CLASS, xs_methods, xs_metatable); | ||
| 2544 | } /* initall() */ | 2843 | } /* initall() */ |
| 2545 | 2844 | ||
| 2546 | 2845 | ||
