diff options
Diffstat (limited to 'src/lib/libssl/ssl_lib.c')
-rw-r--r-- | src/lib/libssl/ssl_lib.c | 175 |
1 files changed, 143 insertions, 32 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index e192fc4cac..3109708480 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
@@ -61,22 +61,24 @@ | |||
61 | #include <stdio.h> | 61 | #include <stdio.h> |
62 | #include <openssl/objects.h> | 62 | #include <openssl/objects.h> |
63 | #include <openssl/lhash.h> | 63 | #include <openssl/lhash.h> |
64 | #include <openssl/x509v3.h> | ||
64 | #include "ssl_locl.h" | 65 | #include "ssl_locl.h" |
65 | 66 | ||
66 | char *SSL_version_str=OPENSSL_VERSION_TEXT; | 67 | const char *SSL_version_str=OPENSSL_VERSION_TEXT; |
67 | 68 | ||
68 | static STACK *ssl_meth=NULL; | 69 | static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_meth=NULL; |
69 | static STACK *ssl_ctx_meth=NULL; | 70 | static STACK_OF(CRYPTO_EX_DATA_FUNCS) *ssl_ctx_meth=NULL; |
70 | static int ssl_meth_num=0; | 71 | static int ssl_meth_num=0; |
71 | static int ssl_ctx_meth_num=0; | 72 | static int ssl_ctx_meth_num=0; |
72 | 73 | ||
73 | OPENSSL_GLOBAL SSL3_ENC_METHOD ssl3_undef_enc_method={ | 74 | OPENSSL_GLOBAL SSL3_ENC_METHOD ssl3_undef_enc_method={ |
75 | /* evil casts, but these functions are only called if there's a library bug */ | ||
76 | (int (*)(SSL *,int))ssl_undefined_function, | ||
77 | (int (*)(SSL *, unsigned char *, int))ssl_undefined_function, | ||
74 | ssl_undefined_function, | 78 | ssl_undefined_function, |
75 | ssl_undefined_function, | 79 | (int (*)(SSL *, unsigned char *, unsigned char *, int))ssl_undefined_function, |
76 | ssl_undefined_function, | 80 | (int (*)(SSL*, int))ssl_undefined_function, |
77 | ssl_undefined_function, | 81 | (int (*)(SSL *, EVP_MD_CTX *, EVP_MD_CTX *, const char*, int, unsigned char *))ssl_undefined_function |
78 | ssl_undefined_function, | ||
79 | ssl_undefined_function, | ||
80 | }; | 82 | }; |
81 | 83 | ||
82 | int SSL_clear(SSL *s) | 84 | int SSL_clear(SSL *s) |
@@ -93,10 +95,17 @@ int SSL_clear(SSL *s) | |||
93 | s->hit=0; | 95 | s->hit=0; |
94 | s->shutdown=0; | 96 | s->shutdown=0; |
95 | 97 | ||
96 | #if 0 | 98 | #if 0 /* Disabled since version 1.10 of this file (early return not |
99 | * needed because SSL_clear is not called when doing renegotiation) */ | ||
97 | /* This is set if we are doing dynamic renegotiation so keep | 100 | /* This is set if we are doing dynamic renegotiation so keep |
98 | * the old cipher. It is sort of a SSL_clear_lite :-) */ | 101 | * the old cipher. It is sort of a SSL_clear_lite :-) */ |
99 | if (s->new_session) return(1); | 102 | if (s->new_session) return(1); |
103 | #else | ||
104 | if (s->new_session) | ||
105 | { | ||
106 | SSLerr(SSL_F_SSL_CLEAR,SSL_R_INTERNAL_ERROR); | ||
107 | return 0; | ||
108 | } | ||
100 | #endif | 109 | #endif |
101 | 110 | ||
102 | state=s->state; /* Keep to check if we throw away the session-id */ | 111 | state=s->state; /* Keep to check if we throw away the session-id */ |
@@ -201,6 +210,8 @@ SSL *SSL_new(SSL_CTX *ctx) | |||
201 | s->verify_mode=ctx->verify_mode; | 210 | s->verify_mode=ctx->verify_mode; |
202 | s->verify_depth=ctx->verify_depth; | 211 | s->verify_depth=ctx->verify_depth; |
203 | s->verify_callback=ctx->default_verify_callback; | 212 | s->verify_callback=ctx->default_verify_callback; |
213 | s->purpose = ctx->purpose; | ||
214 | s->trust = ctx->trust; | ||
204 | CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX); | 215 | CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX); |
205 | s->ctx=ctx; | 216 | s->ctx=ctx; |
206 | 217 | ||
@@ -218,7 +229,7 @@ SSL *SSL_new(SSL_CTX *ctx) | |||
218 | s->mode=ctx->mode; | 229 | s->mode=ctx->mode; |
219 | SSL_clear(s); | 230 | SSL_clear(s); |
220 | 231 | ||
221 | CRYPTO_new_ex_data(ssl_meth,(char *)s,&s->ex_data); | 232 | CRYPTO_new_ex_data(ssl_meth,s,&s->ex_data); |
222 | 233 | ||
223 | return(s); | 234 | return(s); |
224 | err: | 235 | err: |
@@ -262,6 +273,46 @@ int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx, | |||
262 | return 1; | 273 | return 1; |
263 | } | 274 | } |
264 | 275 | ||
276 | int SSL_CTX_set_purpose(SSL_CTX *s, int purpose) | ||
277 | { | ||
278 | if(X509_PURPOSE_get_by_id(purpose) == -1) { | ||
279 | SSLerr(SSL_F_SSL_CTX_SET_PURPOSE, SSL_R_INVALID_PURPOSE); | ||
280 | return 0; | ||
281 | } | ||
282 | s->purpose = purpose; | ||
283 | return 1; | ||
284 | } | ||
285 | |||
286 | int SSL_set_purpose(SSL *s, int purpose) | ||
287 | { | ||
288 | if(X509_PURPOSE_get_by_id(purpose) == -1) { | ||
289 | SSLerr(SSL_F_SSL_SET_PURPOSE, SSL_R_INVALID_PURPOSE); | ||
290 | return 0; | ||
291 | } | ||
292 | s->purpose = purpose; | ||
293 | return 1; | ||
294 | } | ||
295 | |||
296 | int SSL_CTX_set_trust(SSL_CTX *s, int trust) | ||
297 | { | ||
298 | if(X509_TRUST_get_by_id(trust) == -1) { | ||
299 | SSLerr(SSL_F_SSL_CTX_SET_TRUST, SSL_R_INVALID_TRUST); | ||
300 | return 0; | ||
301 | } | ||
302 | s->trust = trust; | ||
303 | return 1; | ||
304 | } | ||
305 | |||
306 | int SSL_set_trust(SSL *s, int trust) | ||
307 | { | ||
308 | if(X509_TRUST_get_by_id(trust) == -1) { | ||
309 | SSLerr(SSL_F_SSL_SET_TRUST, SSL_R_INVALID_TRUST); | ||
310 | return 0; | ||
311 | } | ||
312 | s->trust = trust; | ||
313 | return 1; | ||
314 | } | ||
315 | |||
265 | void SSL_free(SSL *s) | 316 | void SSL_free(SSL *s) |
266 | { | 317 | { |
267 | int i; | 318 | int i; |
@@ -324,7 +375,7 @@ void SSL_free(SSL *s) | |||
324 | 375 | ||
325 | if (s->method != NULL) s->method->ssl_free(s); | 376 | if (s->method != NULL) s->method->ssl_free(s); |
326 | 377 | ||
327 | Free((char *)s); | 378 | Free(s); |
328 | } | 379 | } |
329 | 380 | ||
330 | void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio) | 381 | void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio) |
@@ -433,6 +484,38 @@ err: | |||
433 | } | 484 | } |
434 | #endif | 485 | #endif |
435 | 486 | ||
487 | |||
488 | /* return length of latest Finished message we sent, copy to 'buf' */ | ||
489 | size_t SSL_get_finished(SSL *s, void *buf, size_t count) | ||
490 | { | ||
491 | size_t ret = 0; | ||
492 | |||
493 | if (s->s3 != NULL) | ||
494 | { | ||
495 | ret = s->s3->tmp.finish_md_len; | ||
496 | if (count > ret) | ||
497 | count = ret; | ||
498 | memcpy(buf, s->s3->tmp.finish_md, count); | ||
499 | } | ||
500 | return ret; | ||
501 | } | ||
502 | |||
503 | /* return length of latest Finished message we expected, copy to 'buf' */ | ||
504 | size_t SSL_get_peer_finished(SSL *s, void *buf, size_t count) | ||
505 | { | ||
506 | size_t ret = 0; | ||
507 | |||
508 | if (s->s3 != NULL) | ||
509 | { | ||
510 | ret = s->s3->tmp.peer_finish_md_len; | ||
511 | if (count > ret) | ||
512 | count = ret; | ||
513 | memcpy(buf, s->s3->tmp.peer_finish_md, count); | ||
514 | } | ||
515 | return ret; | ||
516 | } | ||
517 | |||
518 | |||
436 | int SSL_get_verify_mode(SSL *s) | 519 | int SSL_get_verify_mode(SSL *s) |
437 | { | 520 | { |
438 | return(s->verify_mode); | 521 | return(s->verify_mode); |
@@ -706,6 +789,20 @@ long SSL_ctrl(SSL *s,int cmd,long larg,char *parg) | |||
706 | } | 789 | } |
707 | } | 790 | } |
708 | 791 | ||
792 | long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)()) | ||
793 | { | ||
794 | switch(cmd) | ||
795 | { | ||
796 | default: | ||
797 | return(s->method->ssl_callback_ctrl(s,cmd,fp)); | ||
798 | } | ||
799 | } | ||
800 | |||
801 | struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx) | ||
802 | { | ||
803 | return ctx->sessions; | ||
804 | } | ||
805 | |||
709 | long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg) | 806 | long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg) |
710 | { | 807 | { |
711 | long l; | 808 | long l; |
@@ -765,6 +862,15 @@ long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg) | |||
765 | } | 862 | } |
766 | } | 863 | } |
767 | 864 | ||
865 | long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)()) | ||
866 | { | ||
867 | switch(cmd) | ||
868 | { | ||
869 | default: | ||
870 | return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp)); | ||
871 | } | ||
872 | } | ||
873 | |||
768 | int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b) | 874 | int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b) |
769 | { | 875 | { |
770 | long l; | 876 | long l; |
@@ -834,8 +940,8 @@ const char *SSL_get_cipher_list(SSL *s,int n) | |||
834 | return(c->name); | 940 | return(c->name); |
835 | } | 941 | } |
836 | 942 | ||
837 | /** specify the ciphers to be used by defaut by the SSL_CTX */ | 943 | /** specify the ciphers to be used by default by the SSL_CTX */ |
838 | int SSL_CTX_set_cipher_list(SSL_CTX *ctx,char *str) | 944 | int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) |
839 | { | 945 | { |
840 | STACK_OF(SSL_CIPHER) *sk; | 946 | STACK_OF(SSL_CIPHER) *sk; |
841 | 947 | ||
@@ -846,7 +952,7 @@ int SSL_CTX_set_cipher_list(SSL_CTX *ctx,char *str) | |||
846 | } | 952 | } |
847 | 953 | ||
848 | /** specify the ciphers to be used by the SSL */ | 954 | /** specify the ciphers to be used by the SSL */ |
849 | int SSL_set_cipher_list(SSL *s,char *str) | 955 | int SSL_set_cipher_list(SSL *s,const char *str) |
850 | { | 956 | { |
851 | STACK_OF(SSL_CIPHER) *sk; | 957 | STACK_OF(SSL_CIPHER) *sk; |
852 | 958 | ||
@@ -1127,7 +1233,7 @@ void SSL_CTX_free(SSL_CTX *a) | |||
1127 | sk_X509_pop_free(a->extra_certs,X509_free); | 1233 | sk_X509_pop_free(a->extra_certs,X509_free); |
1128 | if (a->comp_methods != NULL) | 1234 | if (a->comp_methods != NULL) |
1129 | sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free); | 1235 | sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free); |
1130 | Free((char *)a); | 1236 | Free(a); |
1131 | } | 1237 | } |
1132 | 1238 | ||
1133 | void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb) | 1239 | void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb) |
@@ -1254,10 +1360,8 @@ void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher) | |||
1254 | emask|=SSL_aDSS; | 1360 | emask|=SSL_aDSS; |
1255 | } | 1361 | } |
1256 | 1362 | ||
1257 | #ifdef SSL_ALLOW_ADH | ||
1258 | mask|=SSL_aNULL; | 1363 | mask|=SSL_aNULL; |
1259 | emask|=SSL_aNULL; | 1364 | emask|=SSL_aNULL; |
1260 | #endif | ||
1261 | 1365 | ||
1262 | c->mask=mask; | 1366 | c->mask=mask; |
1263 | c->export_mask=emask; | 1367 | c->export_mask=emask; |
@@ -1274,7 +1378,7 @@ X509 *ssl_get_server_send_cert(SSL *s) | |||
1274 | c=s->cert; | 1378 | c=s->cert; |
1275 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); | 1379 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); |
1276 | alg=s->s3->tmp.new_cipher->algorithms; | 1380 | alg=s->s3->tmp.new_cipher->algorithms; |
1277 | is_export=SSL_IS_EXPORT(alg); | 1381 | is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher); |
1278 | mask=is_export?c->export_mask:c->mask; | 1382 | mask=is_export?c->export_mask:c->mask; |
1279 | kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK); | 1383 | kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK); |
1280 | 1384 | ||
@@ -1527,7 +1631,7 @@ SSL_METHOD *ssl_bad_method(int ver) | |||
1527 | return(NULL); | 1631 | return(NULL); |
1528 | } | 1632 | } |
1529 | 1633 | ||
1530 | char *SSL_get_version(SSL *s) | 1634 | const char *SSL_get_version(SSL *s) |
1531 | { | 1635 | { |
1532 | if (s->version == TLS1_VERSION) | 1636 | if (s->version == TLS1_VERSION) |
1533 | return("TLSv1"); | 1637 | return("TLSv1"); |
@@ -1831,8 +1935,8 @@ long SSL_get_verify_result(SSL *ssl) | |||
1831 | return(ssl->verify_result); | 1935 | return(ssl->verify_result); |
1832 | } | 1936 | } |
1833 | 1937 | ||
1834 | int SSL_get_ex_new_index(long argl,char *argp,int (*new_func)(), | 1938 | int SSL_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func, |
1835 | int (*dup_func)(),void (*free_func)()) | 1939 | CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func) |
1836 | { | 1940 | { |
1837 | ssl_meth_num++; | 1941 | ssl_meth_num++; |
1838 | return(CRYPTO_get_ex_new_index(ssl_meth_num-1, | 1942 | return(CRYPTO_get_ex_new_index(ssl_meth_num-1, |
@@ -1849,8 +1953,8 @@ void *SSL_get_ex_data(SSL *s,int idx) | |||
1849 | return(CRYPTO_get_ex_data(&s->ex_data,idx)); | 1953 | return(CRYPTO_get_ex_data(&s->ex_data,idx)); |
1850 | } | 1954 | } |
1851 | 1955 | ||
1852 | int SSL_CTX_get_ex_new_index(long argl,char *argp,int (*new_func)(), | 1956 | int SSL_CTX_get_ex_new_index(long argl,void *argp,CRYPTO_EX_new *new_func, |
1853 | int (*dup_func)(),void (*free_func)()) | 1957 | CRYPTO_EX_dup *dup_func,CRYPTO_EX_free *free_func) |
1854 | { | 1958 | { |
1855 | ssl_ctx_meth_num++; | 1959 | ssl_ctx_meth_num++; |
1856 | return(CRYPTO_get_ex_new_index(ssl_ctx_meth_num-1, | 1960 | return(CRYPTO_get_ex_new_index(ssl_ctx_meth_num-1, |
@@ -1899,13 +2003,16 @@ int SSL_want(SSL *s) | |||
1899 | void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl, | 2003 | void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl, |
1900 | int is_export, | 2004 | int is_export, |
1901 | int keylength)) | 2005 | int keylength)) |
1902 | { SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,0,(char *)cb); } | 2006 | { |
1903 | #endif | 2007 | SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb); |
2008 | } | ||
1904 | 2009 | ||
1905 | #ifndef NO_RSA | 2010 | void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl, |
1906 | void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,int is_export, | 2011 | int is_export, |
1907 | int keylength)) | 2012 | int keylength)) |
1908 | { SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,0,(char *)cb); } | 2013 | { |
2014 | SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb); | ||
2015 | } | ||
1909 | #endif | 2016 | #endif |
1910 | 2017 | ||
1911 | #ifdef DOXYGEN | 2018 | #ifdef DOXYGEN |
@@ -1932,11 +2039,15 @@ RSA *cb(SSL *ssl,int is_export,int keylength) | |||
1932 | #ifndef NO_DH | 2039 | #ifndef NO_DH |
1933 | void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export, | 2040 | void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export, |
1934 | int keylength)) | 2041 | int keylength)) |
1935 | { SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,0,(char *)dh); } | 2042 | { |
2043 | SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh); | ||
2044 | } | ||
1936 | 2045 | ||
1937 | void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export, | 2046 | void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export, |
1938 | int keylength)) | 2047 | int keylength)) |
1939 | { SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,0,(char *)dh); } | 2048 | { |
2049 | SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh); | ||
2050 | } | ||
1940 | #endif | 2051 | #endif |
1941 | 2052 | ||
1942 | #if defined(_WINDLL) && defined(WIN16) | 2053 | #if defined(_WINDLL) && defined(WIN16) |