diff options
Diffstat (limited to 'vchat-ssl.c')
-rwxr-xr-x | vchat-ssl.c | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/vchat-ssl.c b/vchat-ssl.c index 73a56fa..fab5ffe 100755 --- a/vchat-ssl.c +++ b/vchat-ssl.c | |||
@@ -34,6 +34,33 @@ | |||
34 | 34 | ||
35 | const char *vchat_ssl_version = "vchat-ssl.c $Id$"; | 35 | const char *vchat_ssl_version = "vchat-ssl.c $Id$"; |
36 | 36 | ||
37 | typedef int (*vc_x509verify_cb_t)(int, X509_STORE_CTX *); | ||
38 | struct vc_x509store_t { | ||
39 | char *cafile; | ||
40 | char *capath; | ||
41 | char *crlfile; | ||
42 | vc_x509verify_cb_t callback; | ||
43 | vc_askpass_cb_t askpass_callback; | ||
44 | STACK_OF(X509) *certs; | ||
45 | STACK_OF(X509_CRL) *crls; | ||
46 | char *use_certfile; | ||
47 | STACK_OF(X509) *use_certs; | ||
48 | char *use_keyfile; | ||
49 | EVP_PKEY *use_key; | ||
50 | int flags; | ||
51 | }; | ||
52 | |||
53 | static void vc_cleanup_x509store(vc_x509store_t *); // Should not be static but is unused | ||
54 | static SSL_CTX * vc_create_sslctx( vc_x509store_t *vc_store ); | ||
55 | static int vc_verify_callback(int, X509_STORE_CTX *); | ||
56 | static X509_STORE * vc_x509store_create(vc_x509store_t *); | ||
57 | static void vc_x509store_clearflags(vc_x509store_t *, int); | ||
58 | static void vc_x509store_setcafile(vc_x509store_t *, char *); | ||
59 | static void vc_x509store_setcapath(vc_x509store_t *, char *); | ||
60 | static void vc_x509store_setcrlfile(vc_x509store_t *, char *); | ||
61 | static void vc_x509store_addcert(vc_x509store_t *, X509 *); | ||
62 | static void vc_x509store_setcb(vc_x509store_t *, vc_x509verify_cb_t); | ||
63 | |||
37 | #define VC_CTX_ERR_EXIT(se, cx) do { \ | 64 | #define VC_CTX_ERR_EXIT(se, cx) do { \ |
38 | snprintf(tmpstr, TMPSTRSIZE, "CREATE CTX: %s", \ | 65 | snprintf(tmpstr, TMPSTRSIZE, "CREATE CTX: %s", \ |
39 | ERR_error_string (ERR_get_error (), NULL)); \ | 66 | ERR_error_string (ERR_get_error (), NULL)); \ |
@@ -51,7 +78,7 @@ const char *vchat_ssl_version = "vchat-ssl.c $Id$"; | |||
51 | return(NULL); \ | 78 | return(NULL); \ |
52 | } while(0) | 79 | } while(0) |
53 | 80 | ||
54 | SSL_CTX * vc_create_sslctx( vc_x509store_t *vc_store ) | 81 | static SSL_CTX * vc_create_sslctx( vc_x509store_t *vc_store ) |
55 | { | 82 | { |
56 | int i = 0; | 83 | int i = 0; |
57 | int n = 0; | 84 | int n = 0; |
@@ -372,20 +399,31 @@ void vc_x509store_setcertfile(vc_x509store_t *store, char *file) | |||
372 | } | 399 | } |
373 | 400 | ||
374 | 401 | ||
375 | void vc_init_x509store(vc_x509store_t *s) | 402 | vc_x509store_t *vc_init_x509store() |
376 | { | 403 | { |
377 | s->cafile = NULL; | 404 | vc_x509store_t *s = malloc(sizeof(vc_x509store_t)); |
378 | s->capath = NULL; | 405 | if (s) { |
379 | s->crlfile = NULL; | 406 | |
380 | s->callback = NULL; | 407 | static int sslinit; |
381 | s->askpass_callback = NULL; | 408 | if( !sslinit++ ) { |
382 | s->certs = sk_X509_new_null(); | 409 | SSL_library_init (); |
383 | s->crls = sk_X509_CRL_new_null(); | 410 | SSL_load_error_strings(); |
384 | s->use_certfile = NULL; | 411 | } |
385 | s->use_certs = sk_X509_new_null(); | 412 | |
386 | s->use_keyfile = NULL; | 413 | s->cafile = NULL; |
387 | s->use_key = NULL; | 414 | s->capath = NULL; |
388 | s->flags = 0; | 415 | s->crlfile = NULL; |
416 | s->callback = NULL; | ||
417 | s->askpass_callback = NULL; | ||
418 | s->certs = sk_X509_new_null(); | ||
419 | s->crls = sk_X509_CRL_new_null(); | ||
420 | s->use_certfile = NULL; | ||
421 | s->use_certs = sk_X509_new_null(); | ||
422 | s->use_keyfile = NULL; | ||
423 | s->use_key = NULL; | ||
424 | s->flags = 0; | ||
425 | } | ||
426 | return s; | ||
389 | } | 427 | } |
390 | 428 | ||
391 | void vc_cleanup_x509store(vc_x509store_t *s) | 429 | void vc_cleanup_x509store(vc_x509store_t *s) |