207 */ |
207 */ |
208 static int meth_create(lua_State *L) |
208 static int meth_create(lua_State *L) |
209 { |
209 { |
210 p_ssl ssl; |
210 p_ssl ssl; |
211 int mode = ctx_getmode(L, 1); |
211 int mode = ctx_getmode(L, 1); |
212 SSL_CTX *ctx = ctx_getcontext(L, 1); |
212 p_context ctx = checkctx(L, 1); |
213 |
213 |
214 if (mode == MD_CTX_INVALID) { |
214 if (mode == MD_CTX_INVALID) { |
215 lua_pushnil(L); |
215 lua_pushnil(L); |
216 lua_pushstring(L, "invalid mode"); |
216 lua_pushstring(L, "invalid mode"); |
217 return 2; |
217 return 2; |
|
218 } |
|
219 if (luasec_ssl_idx == -1) { |
|
220 luasec_ssl_idx = SSL_get_ex_new_index(0, "luasec context", NULL, NULL, NULL); |
|
221 if (luasec_ssl_idx == -1) { |
|
222 lua_pushnil(L); |
|
223 lua_pushstring(L, "error creating luasec SSL index"); |
|
224 return 2; |
|
225 } |
218 } |
226 } |
219 ssl = (p_ssl) lua_newuserdata(L, sizeof(t_ssl)); |
227 ssl = (p_ssl) lua_newuserdata(L, sizeof(t_ssl)); |
220 if (!ssl) { |
228 if (!ssl) { |
221 lua_pushnil(L); |
229 lua_pushnil(L); |
222 lua_pushstring(L, "error creating SSL object"); |
230 lua_pushstring(L, "error creating SSL object"); |
223 return 2; |
231 return 2; |
224 } |
232 } |
225 ssl->ssl = SSL_new(ctx); |
233 ssl->ssl = SSL_new(ctx->context); |
226 if (!ssl->ssl) { |
234 if (!ssl->ssl) { |
227 lua_pushnil(L); |
235 lua_pushnil(L); |
228 lua_pushstring(L, "error creating SSL object"); |
236 lua_pushstring(L, "error creating SSL object"); |
229 return 2;; |
237 return 2;; |
230 } |
238 } |
234 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); |
242 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); |
235 |
243 |
236 #ifdef SSL_MODE_RELEASE_BUFFERS |
244 #ifdef SSL_MODE_RELEASE_BUFFERS |
237 SSL_set_mode(ssl->ssl, SSL_MODE_RELEASE_BUFFERS); |
245 SSL_set_mode(ssl->ssl, SSL_MODE_RELEASE_BUFFERS); |
238 #endif |
246 #endif |
|
247 |
|
248 SSL_set_ex_data(ssl->ssl, luasec_ssl_idx, ctx); |
239 |
249 |
240 if (mode == MD_CTX_SERVER) |
250 if (mode == MD_CTX_SERVER) |
241 SSL_set_accept_state(ssl->ssl); |
251 SSL_set_accept_state(ssl->ssl); |
242 else |
252 else |
243 SSL_set_connect_state(ssl->ssl); |
253 SSL_set_connect_state(ssl->ssl); |