diff options
Diffstat (limited to 'src/lib/libssl/src/apps/s_server.c')
| -rw-r--r-- | src/lib/libssl/src/apps/s_server.c | 356 |
1 files changed, 328 insertions, 28 deletions
diff --git a/src/lib/libssl/src/apps/s_server.c b/src/lib/libssl/src/apps/s_server.c index 8a0c34cf0f..3f9b3704c6 100644 --- a/src/lib/libssl/src/apps/s_server.c +++ b/src/lib/libssl/src/apps/s_server.c | |||
| @@ -186,6 +186,9 @@ typedef unsigned int u_int; | |||
| 186 | #ifndef OPENSSL_NO_RSA | 186 | #ifndef OPENSSL_NO_RSA |
| 187 | #include <openssl/rsa.h> | 187 | #include <openssl/rsa.h> |
| 188 | #endif | 188 | #endif |
| 189 | #ifndef OPENSSL_NO_SRP | ||
| 190 | #include <openssl/srp.h> | ||
| 191 | #endif | ||
| 189 | #include "s_apps.h" | 192 | #include "s_apps.h" |
| 190 | #include "timeouts.h" | 193 | #include "timeouts.h" |
| 191 | 194 | ||
| @@ -290,6 +293,9 @@ static int cert_status_cb(SSL *s, void *arg); | |||
| 290 | static int s_msg=0; | 293 | static int s_msg=0; |
| 291 | static int s_quiet=0; | 294 | static int s_quiet=0; |
| 292 | 295 | ||
| 296 | static char *keymatexportlabel=NULL; | ||
| 297 | static int keymatexportlen=20; | ||
| 298 | |||
| 293 | static int hack=0; | 299 | static int hack=0; |
| 294 | #ifndef OPENSSL_NO_ENGINE | 300 | #ifndef OPENSSL_NO_ENGINE |
| 295 | static char *engine_id=NULL; | 301 | static char *engine_id=NULL; |
| @@ -302,6 +308,7 @@ static long socket_mtu; | |||
| 302 | static int cert_chain = 0; | 308 | static int cert_chain = 0; |
| 303 | #endif | 309 | #endif |
| 304 | 310 | ||
| 311 | |||
| 305 | #ifndef OPENSSL_NO_PSK | 312 | #ifndef OPENSSL_NO_PSK |
| 306 | static char *psk_identity="Client_identity"; | 313 | static char *psk_identity="Client_identity"; |
| 307 | char *psk_key=NULL; /* by default PSK is not used */ | 314 | char *psk_key=NULL; /* by default PSK is not used */ |
| @@ -369,6 +376,52 @@ static unsigned int psk_server_cb(SSL *ssl, const char *identity, | |||
| 369 | } | 376 | } |
| 370 | #endif | 377 | #endif |
| 371 | 378 | ||
| 379 | #ifndef OPENSSL_NO_SRP | ||
| 380 | /* This is a context that we pass to callbacks */ | ||
| 381 | typedef struct srpsrvparm_st | ||
| 382 | { | ||
| 383 | char *login; | ||
| 384 | SRP_VBASE *vb; | ||
| 385 | SRP_user_pwd *user; | ||
| 386 | } srpsrvparm; | ||
| 387 | |||
| 388 | /* This callback pretends to require some asynchronous logic in order to obtain | ||
| 389 | a verifier. When the callback is called for a new connection we return | ||
| 390 | with a negative value. This will provoke the accept etc to return with | ||
| 391 | an LOOKUP_X509. The main logic of the reinvokes the suspended call | ||
| 392 | (which would normally occur after a worker has finished) and we | ||
| 393 | set the user parameters. | ||
| 394 | */ | ||
| 395 | static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg) | ||
| 396 | { | ||
| 397 | srpsrvparm *p = (srpsrvparm *)arg; | ||
| 398 | if (p->login == NULL && p->user == NULL ) | ||
| 399 | { | ||
| 400 | p->login = SSL_get_srp_username(s); | ||
| 401 | BIO_printf(bio_err, "SRP username = \"%s\"\n", p->login); | ||
| 402 | return (-1) ; | ||
| 403 | } | ||
| 404 | |||
| 405 | if (p->user == NULL) | ||
| 406 | { | ||
| 407 | BIO_printf(bio_err, "User %s doesn't exist\n", p->login); | ||
| 408 | return SSL3_AL_FATAL; | ||
| 409 | } | ||
| 410 | if (SSL_set_srp_server_param(s, p->user->N, p->user->g, p->user->s, p->user->v, | ||
| 411 | p->user->info) < 0) | ||
| 412 | { | ||
| 413 | *ad = SSL_AD_INTERNAL_ERROR; | ||
| 414 | return SSL3_AL_FATAL; | ||
| 415 | } | ||
| 416 | BIO_printf(bio_err, "SRP parameters set: username = \"%s\" info=\"%s\" \n", p->login,p->user->info); | ||
| 417 | /* need to check whether there are memory leaks */ | ||
| 418 | p->user = NULL; | ||
| 419 | p->login = NULL; | ||
| 420 | return SSL_ERROR_NONE; | ||
| 421 | } | ||
| 422 | |||
| 423 | #endif | ||
| 424 | |||
| 372 | #ifdef MONOLITH | 425 | #ifdef MONOLITH |
| 373 | static void s_server_init(void) | 426 | static void s_server_init(void) |
| 374 | { | 427 | { |
| @@ -456,8 +509,14 @@ static void sv_usage(void) | |||
| 456 | BIO_printf(bio_err," -jpake arg - JPAKE secret to use\n"); | 509 | BIO_printf(bio_err," -jpake arg - JPAKE secret to use\n"); |
| 457 | # endif | 510 | # endif |
| 458 | #endif | 511 | #endif |
| 512 | #ifndef OPENSSL_NO_SRP | ||
| 513 | BIO_printf(bio_err," -srpvfile file - The verifier file for SRP\n"); | ||
| 514 | BIO_printf(bio_err," -srpuserseed string - A seed string for a default user salt.\n"); | ||
| 515 | #endif | ||
| 459 | BIO_printf(bio_err," -ssl2 - Just talk SSLv2\n"); | 516 | BIO_printf(bio_err," -ssl2 - Just talk SSLv2\n"); |
| 460 | BIO_printf(bio_err," -ssl3 - Just talk SSLv3\n"); | 517 | BIO_printf(bio_err," -ssl3 - Just talk SSLv3\n"); |
| 518 | BIO_printf(bio_err," -tls1_2 - Just talk TLSv1.2\n"); | ||
| 519 | BIO_printf(bio_err," -tls1_1 - Just talk TLSv1.1\n"); | ||
| 461 | BIO_printf(bio_err," -tls1 - Just talk TLSv1\n"); | 520 | BIO_printf(bio_err," -tls1 - Just talk TLSv1\n"); |
| 462 | BIO_printf(bio_err," -dtls1 - Just talk DTLSv1\n"); | 521 | BIO_printf(bio_err," -dtls1 - Just talk DTLSv1\n"); |
| 463 | BIO_printf(bio_err," -timeout - Enable timeouts\n"); | 522 | BIO_printf(bio_err," -timeout - Enable timeouts\n"); |
| @@ -466,6 +525,8 @@ static void sv_usage(void) | |||
| 466 | BIO_printf(bio_err," -no_ssl2 - Just disable SSLv2\n"); | 525 | BIO_printf(bio_err," -no_ssl2 - Just disable SSLv2\n"); |
| 467 | BIO_printf(bio_err," -no_ssl3 - Just disable SSLv3\n"); | 526 | BIO_printf(bio_err," -no_ssl3 - Just disable SSLv3\n"); |
| 468 | BIO_printf(bio_err," -no_tls1 - Just disable TLSv1\n"); | 527 | BIO_printf(bio_err," -no_tls1 - Just disable TLSv1\n"); |
| 528 | BIO_printf(bio_err," -no_tls1_1 - Just disable TLSv1.1\n"); | ||
| 529 | BIO_printf(bio_err," -no_tls1_2 - Just disable TLSv1.2\n"); | ||
| 469 | #ifndef OPENSSL_NO_DH | 530 | #ifndef OPENSSL_NO_DH |
| 470 | BIO_printf(bio_err," -no_dhe - Disable ephemeral DH\n"); | 531 | BIO_printf(bio_err," -no_dhe - Disable ephemeral DH\n"); |
| 471 | #endif | 532 | #endif |
| @@ -492,7 +553,13 @@ static void sv_usage(void) | |||
| 492 | BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n"); | 553 | BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n"); |
| 493 | BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n"); | 554 | BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n"); |
| 494 | BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n"); | 555 | BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n"); |
| 556 | # ifndef OPENSSL_NO_NEXTPROTONEG | ||
| 557 | BIO_printf(bio_err," -nextprotoneg arg - set the advertised protocols for the NPN extension (comma-separated list)\n"); | ||
| 558 | # endif | ||
| 559 | BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n"); | ||
| 495 | #endif | 560 | #endif |
| 561 | BIO_printf(bio_err," -keymatexport label - Export keying material using label\n"); | ||
| 562 | BIO_printf(bio_err," -keymatexportlen len - Export len bytes of keying material (default 20)\n"); | ||
| 496 | } | 563 | } |
| 497 | 564 | ||
| 498 | static int local_argc=0; | 565 | static int local_argc=0; |
| @@ -826,6 +893,26 @@ BIO_printf(err, "cert_status: received %d ids\n", sk_OCSP_RESPID_num(ids)); | |||
| 826 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | 893 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; |
| 827 | goto done; | 894 | goto done; |
| 828 | } | 895 | } |
| 896 | |||
| 897 | # ifndef OPENSSL_NO_NEXTPROTONEG | ||
| 898 | /* This is the context that we pass to next_proto_cb */ | ||
| 899 | typedef struct tlsextnextprotoctx_st { | ||
| 900 | unsigned char *data; | ||
| 901 | unsigned int len; | ||
| 902 | } tlsextnextprotoctx; | ||
| 903 | |||
| 904 | static int next_proto_cb(SSL *s, const unsigned char **data, unsigned int *len, void *arg) | ||
| 905 | { | ||
| 906 | tlsextnextprotoctx *next_proto = arg; | ||
| 907 | |||
| 908 | *data = next_proto->data; | ||
| 909 | *len = next_proto->len; | ||
| 910 | |||
| 911 | return SSL_TLSEXT_ERR_OK; | ||
| 912 | } | ||
| 913 | # endif /* ndef OPENSSL_NO_NEXTPROTONEG */ | ||
| 914 | |||
| 915 | |||
| 829 | #endif | 916 | #endif |
| 830 | 917 | ||
| 831 | int MAIN(int, char **); | 918 | int MAIN(int, char **); |
| @@ -833,6 +920,10 @@ int MAIN(int, char **); | |||
| 833 | #ifndef OPENSSL_NO_JPAKE | 920 | #ifndef OPENSSL_NO_JPAKE |
| 834 | static char *jpake_secret = NULL; | 921 | static char *jpake_secret = NULL; |
| 835 | #endif | 922 | #endif |
| 923 | #ifndef OPENSSL_NO_SRP | ||
| 924 | static srpsrvparm srp_callback_parm; | ||
| 925 | #endif | ||
| 926 | static char *srtp_profiles = NULL; | ||
| 836 | 927 | ||
| 837 | int MAIN(int argc, char *argv[]) | 928 | int MAIN(int argc, char *argv[]) |
| 838 | { | 929 | { |
| @@ -864,21 +955,21 @@ int MAIN(int argc, char *argv[]) | |||
| 864 | #ifndef OPENSSL_NO_TLSEXT | 955 | #ifndef OPENSSL_NO_TLSEXT |
| 865 | EVP_PKEY *s_key2 = NULL; | 956 | EVP_PKEY *s_key2 = NULL; |
| 866 | X509 *s_cert2 = NULL; | 957 | X509 *s_cert2 = NULL; |
| 867 | #endif | ||
| 868 | #ifndef OPENSSL_NO_TLSEXT | ||
| 869 | tlsextctx tlsextcbp = {NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING}; | 958 | tlsextctx tlsextcbp = {NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING}; |
| 959 | # ifndef OPENSSL_NO_NEXTPROTONEG | ||
| 960 | const char *next_proto_neg_in = NULL; | ||
| 961 | tlsextnextprotoctx next_proto; | ||
| 962 | # endif | ||
| 870 | #endif | 963 | #endif |
| 871 | #ifndef OPENSSL_NO_PSK | 964 | #ifndef OPENSSL_NO_PSK |
| 872 | /* by default do not send a PSK identity hint */ | 965 | /* by default do not send a PSK identity hint */ |
| 873 | static char *psk_identity_hint=NULL; | 966 | static char *psk_identity_hint=NULL; |
| 874 | #endif | 967 | #endif |
| 875 | #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3) | 968 | #ifndef OPENSSL_NO_SRP |
| 876 | meth=SSLv23_server_method(); | 969 | char *srpuserseed = NULL; |
| 877 | #elif !defined(OPENSSL_NO_SSL3) | 970 | char *srp_verifier_file = NULL; |
| 878 | meth=SSLv3_server_method(); | ||
| 879 | #elif !defined(OPENSSL_NO_SSL2) | ||
| 880 | meth=SSLv2_server_method(); | ||
| 881 | #endif | 971 | #endif |
| 972 | meth=SSLv23_server_method(); | ||
| 882 | 973 | ||
| 883 | local_argc=argc; | 974 | local_argc=argc; |
| 884 | local_argv=argv; | 975 | local_argv=argv; |
| @@ -1103,13 +1194,27 @@ int MAIN(int argc, char *argv[]) | |||
| 1103 | psk_key=*(++argv); | 1194 | psk_key=*(++argv); |
| 1104 | for (i=0; i<strlen(psk_key); i++) | 1195 | for (i=0; i<strlen(psk_key); i++) |
| 1105 | { | 1196 | { |
| 1106 | if (isxdigit((int)psk_key[i])) | 1197 | if (isxdigit((unsigned char)psk_key[i])) |
| 1107 | continue; | 1198 | continue; |
| 1108 | BIO_printf(bio_err,"Not a hex number '%s'\n",*argv); | 1199 | BIO_printf(bio_err,"Not a hex number '%s'\n",*argv); |
| 1109 | goto bad; | 1200 | goto bad; |
| 1110 | } | 1201 | } |
| 1111 | } | 1202 | } |
| 1112 | #endif | 1203 | #endif |
| 1204 | #ifndef OPENSSL_NO_SRP | ||
| 1205 | else if (strcmp(*argv, "-srpvfile") == 0) | ||
| 1206 | { | ||
| 1207 | if (--argc < 1) goto bad; | ||
| 1208 | srp_verifier_file = *(++argv); | ||
| 1209 | meth=TLSv1_server_method(); | ||
| 1210 | } | ||
| 1211 | else if (strcmp(*argv, "-srpuserseed") == 0) | ||
| 1212 | { | ||
| 1213 | if (--argc < 1) goto bad; | ||
| 1214 | srpuserseed = *(++argv); | ||
| 1215 | meth=TLSv1_server_method(); | ||
| 1216 | } | ||
| 1217 | #endif | ||
| 1113 | else if (strcmp(*argv,"-www") == 0) | 1218 | else if (strcmp(*argv,"-www") == 0) |
| 1114 | { www=1; } | 1219 | { www=1; } |
| 1115 | else if (strcmp(*argv,"-WWW") == 0) | 1220 | else if (strcmp(*argv,"-WWW") == 0) |
| @@ -1122,6 +1227,10 @@ int MAIN(int argc, char *argv[]) | |||
| 1122 | { off|=SSL_OP_NO_SSLv3; } | 1227 | { off|=SSL_OP_NO_SSLv3; } |
| 1123 | else if (strcmp(*argv,"-no_tls1") == 0) | 1228 | else if (strcmp(*argv,"-no_tls1") == 0) |
| 1124 | { off|=SSL_OP_NO_TLSv1; } | 1229 | { off|=SSL_OP_NO_TLSv1; } |
| 1230 | else if (strcmp(*argv,"-no_tls1_1") == 0) | ||
| 1231 | { off|=SSL_OP_NO_TLSv1_1; } | ||
| 1232 | else if (strcmp(*argv,"-no_tls1_2") == 0) | ||
| 1233 | { off|=SSL_OP_NO_TLSv1_2; } | ||
| 1125 | else if (strcmp(*argv,"-no_comp") == 0) | 1234 | else if (strcmp(*argv,"-no_comp") == 0) |
| 1126 | { off|=SSL_OP_NO_COMPRESSION; } | 1235 | { off|=SSL_OP_NO_COMPRESSION; } |
| 1127 | #ifndef OPENSSL_NO_TLSEXT | 1236 | #ifndef OPENSSL_NO_TLSEXT |
| @@ -1139,6 +1248,10 @@ int MAIN(int argc, char *argv[]) | |||
| 1139 | #ifndef OPENSSL_NO_TLS1 | 1248 | #ifndef OPENSSL_NO_TLS1 |
| 1140 | else if (strcmp(*argv,"-tls1") == 0) | 1249 | else if (strcmp(*argv,"-tls1") == 0) |
| 1141 | { meth=TLSv1_server_method(); } | 1250 | { meth=TLSv1_server_method(); } |
| 1251 | else if (strcmp(*argv,"-tls1_1") == 0) | ||
| 1252 | { meth=TLSv1_1_server_method(); } | ||
| 1253 | else if (strcmp(*argv,"-tls1_2") == 0) | ||
| 1254 | { meth=TLSv1_2_server_method(); } | ||
| 1142 | #endif | 1255 | #endif |
| 1143 | #ifndef OPENSSL_NO_DTLS1 | 1256 | #ifndef OPENSSL_NO_DTLS1 |
| 1144 | else if (strcmp(*argv,"-dtls1") == 0) | 1257 | else if (strcmp(*argv,"-dtls1") == 0) |
| @@ -1191,7 +1304,13 @@ int MAIN(int argc, char *argv[]) | |||
| 1191 | if (--argc < 1) goto bad; | 1304 | if (--argc < 1) goto bad; |
| 1192 | s_key_file2= *(++argv); | 1305 | s_key_file2= *(++argv); |
| 1193 | } | 1306 | } |
| 1194 | 1307 | # ifndef OPENSSL_NO_NEXTPROTONEG | |
| 1308 | else if (strcmp(*argv,"-nextprotoneg") == 0) | ||
| 1309 | { | ||
| 1310 | if (--argc < 1) goto bad; | ||
| 1311 | next_proto_neg_in = *(++argv); | ||
| 1312 | } | ||
| 1313 | # endif | ||
| 1195 | #endif | 1314 | #endif |
| 1196 | #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK) | 1315 | #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK) |
| 1197 | else if (strcmp(*argv,"-jpake") == 0) | 1316 | else if (strcmp(*argv,"-jpake") == 0) |
| @@ -1200,6 +1319,22 @@ int MAIN(int argc, char *argv[]) | |||
| 1200 | jpake_secret = *(++argv); | 1319 | jpake_secret = *(++argv); |
| 1201 | } | 1320 | } |
| 1202 | #endif | 1321 | #endif |
| 1322 | else if (strcmp(*argv,"-use_srtp") == 0) | ||
| 1323 | { | ||
| 1324 | if (--argc < 1) goto bad; | ||
| 1325 | srtp_profiles = *(++argv); | ||
| 1326 | } | ||
| 1327 | else if (strcmp(*argv,"-keymatexport") == 0) | ||
| 1328 | { | ||
| 1329 | if (--argc < 1) goto bad; | ||
| 1330 | keymatexportlabel= *(++argv); | ||
| 1331 | } | ||
| 1332 | else if (strcmp(*argv,"-keymatexportlen") == 0) | ||
| 1333 | { | ||
| 1334 | if (--argc < 1) goto bad; | ||
| 1335 | keymatexportlen=atoi(*(++argv)); | ||
| 1336 | if (keymatexportlen == 0) goto bad; | ||
| 1337 | } | ||
| 1203 | else | 1338 | else |
| 1204 | { | 1339 | { |
| 1205 | BIO_printf(bio_err,"unknown option %s\n",*argv); | 1340 | BIO_printf(bio_err,"unknown option %s\n",*argv); |
| @@ -1296,6 +1431,22 @@ bad: | |||
| 1296 | goto end; | 1431 | goto end; |
| 1297 | } | 1432 | } |
| 1298 | } | 1433 | } |
| 1434 | |||
| 1435 | # ifndef OPENSSL_NO_NEXTPROTONEG | ||
| 1436 | if (next_proto_neg_in) | ||
| 1437 | { | ||
| 1438 | unsigned short len; | ||
| 1439 | next_proto.data = next_protos_parse(&len, | ||
| 1440 | next_proto_neg_in); | ||
| 1441 | if (next_proto.data == NULL) | ||
| 1442 | goto end; | ||
| 1443 | next_proto.len = len; | ||
| 1444 | } | ||
| 1445 | else | ||
| 1446 | { | ||
| 1447 | next_proto.data = NULL; | ||
| 1448 | } | ||
| 1449 | # endif | ||
| 1299 | #endif | 1450 | #endif |
| 1300 | } | 1451 | } |
| 1301 | 1452 | ||
| @@ -1399,6 +1550,9 @@ bad: | |||
| 1399 | else | 1550 | else |
| 1400 | SSL_CTX_sess_set_cache_size(ctx,128); | 1551 | SSL_CTX_sess_set_cache_size(ctx,128); |
| 1401 | 1552 | ||
| 1553 | if (srtp_profiles != NULL) | ||
| 1554 | SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles); | ||
| 1555 | |||
| 1402 | #if 0 | 1556 | #if 0 |
| 1403 | if (cipher == NULL) cipher=getenv("SSL_CIPHER"); | 1557 | if (cipher == NULL) cipher=getenv("SSL_CIPHER"); |
| 1404 | #endif | 1558 | #endif |
| @@ -1476,6 +1630,11 @@ bad: | |||
| 1476 | if (vpm) | 1630 | if (vpm) |
| 1477 | SSL_CTX_set1_param(ctx2, vpm); | 1631 | SSL_CTX_set1_param(ctx2, vpm); |
| 1478 | } | 1632 | } |
| 1633 | |||
| 1634 | # ifndef OPENSSL_NO_NEXTPROTONEG | ||
| 1635 | if (next_proto.data) | ||
| 1636 | SSL_CTX_set_next_protos_advertised_cb(ctx, next_proto_cb, &next_proto); | ||
| 1637 | # endif | ||
| 1479 | #endif | 1638 | #endif |
| 1480 | 1639 | ||
| 1481 | #ifndef OPENSSL_NO_DH | 1640 | #ifndef OPENSSL_NO_DH |
| @@ -1684,6 +1843,25 @@ bad: | |||
| 1684 | } | 1843 | } |
| 1685 | #endif | 1844 | #endif |
| 1686 | 1845 | ||
| 1846 | #ifndef OPENSSL_NO_SRP | ||
| 1847 | if (srp_verifier_file != NULL) | ||
| 1848 | { | ||
| 1849 | srp_callback_parm.vb = SRP_VBASE_new(srpuserseed); | ||
| 1850 | srp_callback_parm.user = NULL; | ||
| 1851 | srp_callback_parm.login = NULL; | ||
| 1852 | if ((ret = SRP_VBASE_init(srp_callback_parm.vb, srp_verifier_file)) != SRP_NO_ERROR) | ||
| 1853 | { | ||
| 1854 | BIO_printf(bio_err, | ||
| 1855 | "Cannot initialize SRP verifier file \"%s\":ret=%d\n", | ||
| 1856 | srp_verifier_file, ret); | ||
| 1857 | goto end; | ||
| 1858 | } | ||
| 1859 | SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE,verify_callback); | ||
| 1860 | SSL_CTX_set_srp_cb_arg(ctx, &srp_callback_parm); | ||
| 1861 | SSL_CTX_set_srp_username_callback(ctx, ssl_srp_server_param_cb); | ||
| 1862 | } | ||
| 1863 | else | ||
| 1864 | #endif | ||
| 1687 | if (CAfile != NULL) | 1865 | if (CAfile != NULL) |
| 1688 | { | 1866 | { |
| 1689 | SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile)); | 1867 | SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile)); |
| @@ -1765,6 +1943,9 @@ static int sv_body(char *hostname, int s, unsigned char *context) | |||
| 1765 | unsigned long l; | 1943 | unsigned long l; |
| 1766 | SSL *con=NULL; | 1944 | SSL *con=NULL; |
| 1767 | BIO *sbio; | 1945 | BIO *sbio; |
| 1946 | #ifndef OPENSSL_NO_KRB5 | ||
| 1947 | KSSL_CTX *kctx; | ||
| 1948 | #endif | ||
| 1768 | struct timeval timeout; | 1949 | struct timeval timeout; |
| 1769 | #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5) | 1950 | #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5) |
| 1770 | struct timeval tv; | 1951 | struct timeval tv; |
| @@ -1805,12 +1986,11 @@ static int sv_body(char *hostname, int s, unsigned char *context) | |||
| 1805 | } | 1986 | } |
| 1806 | #endif | 1987 | #endif |
| 1807 | #ifndef OPENSSL_NO_KRB5 | 1988 | #ifndef OPENSSL_NO_KRB5 |
| 1808 | if ((con->kssl_ctx = kssl_ctx_new()) != NULL) | 1989 | if ((kctx = kssl_ctx_new()) != NULL) |
| 1809 | { | 1990 | { |
| 1810 | kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE, | 1991 | SSL_set0_kssl_ctx(con, kctx); |
| 1811 | KRB5SVC); | 1992 | kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC); |
| 1812 | kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB, | 1993 | kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB); |
| 1813 | KRB5KEYTAB); | ||
| 1814 | } | 1994 | } |
| 1815 | #endif /* OPENSSL_NO_KRB5 */ | 1995 | #endif /* OPENSSL_NO_KRB5 */ |
| 1816 | if(context) | 1996 | if(context) |
| @@ -1873,7 +2053,7 @@ static int sv_body(char *hostname, int s, unsigned char *context) | |||
| 1873 | 2053 | ||
| 1874 | if (s_debug) | 2054 | if (s_debug) |
| 1875 | { | 2055 | { |
| 1876 | con->debug=1; | 2056 | SSL_set_debug(con, 1); |
| 1877 | BIO_set_callback(SSL_get_rbio(con),bio_dump_callback); | 2057 | BIO_set_callback(SSL_get_rbio(con),bio_dump_callback); |
| 1878 | BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out); | 2058 | BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out); |
| 1879 | } | 2059 | } |
| @@ -2002,6 +2182,16 @@ static int sv_body(char *hostname, int s, unsigned char *context) | |||
| 2002 | goto err; | 2182 | goto err; |
| 2003 | } | 2183 | } |
| 2004 | 2184 | ||
| 2185 | #ifndef OPENSSL_NO_HEARTBEATS | ||
| 2186 | if ((buf[0] == 'B') && | ||
| 2187 | ((buf[1] == '\n') || (buf[1] == '\r'))) | ||
| 2188 | { | ||
| 2189 | BIO_printf(bio_err,"HEARTBEATING\n"); | ||
| 2190 | SSL_heartbeat(con); | ||
| 2191 | i=0; | ||
| 2192 | continue; | ||
| 2193 | } | ||
| 2194 | #endif | ||
| 2005 | if ((buf[0] == 'r') && | 2195 | if ((buf[0] == 'r') && |
| 2006 | ((buf[1] == '\n') || (buf[1] == '\r'))) | 2196 | ((buf[1] == '\n') || (buf[1] == '\r'))) |
| 2007 | { | 2197 | { |
| @@ -2045,6 +2235,18 @@ static int sv_body(char *hostname, int s, unsigned char *context) | |||
| 2045 | { static count=0; if (++count == 100) { count=0; SSL_renegotiate(con); } } | 2235 | { static count=0; if (++count == 100) { count=0; SSL_renegotiate(con); } } |
| 2046 | #endif | 2236 | #endif |
| 2047 | k=SSL_write(con,&(buf[l]),(unsigned int)i); | 2237 | k=SSL_write(con,&(buf[l]),(unsigned int)i); |
| 2238 | #ifndef OPENSSL_NO_SRP | ||
| 2239 | while (SSL_get_error(con,k) == SSL_ERROR_WANT_X509_LOOKUP) | ||
| 2240 | { | ||
| 2241 | BIO_printf(bio_s_out,"LOOKUP renego during write\n"); | ||
| 2242 | srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login); | ||
| 2243 | if (srp_callback_parm.user) | ||
| 2244 | BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info); | ||
| 2245 | else | ||
| 2246 | BIO_printf(bio_s_out,"LOOKUP not successful\n"); | ||
| 2247 | k=SSL_write(con,&(buf[l]),(unsigned int)i); | ||
| 2248 | } | ||
| 2249 | #endif | ||
| 2048 | switch (SSL_get_error(con,k)) | 2250 | switch (SSL_get_error(con,k)) |
| 2049 | { | 2251 | { |
| 2050 | case SSL_ERROR_NONE: | 2252 | case SSL_ERROR_NONE: |
| @@ -2092,6 +2294,18 @@ static int sv_body(char *hostname, int s, unsigned char *context) | |||
| 2092 | { | 2294 | { |
| 2093 | again: | 2295 | again: |
| 2094 | i=SSL_read(con,(char *)buf,bufsize); | 2296 | i=SSL_read(con,(char *)buf,bufsize); |
| 2297 | #ifndef OPENSSL_NO_SRP | ||
| 2298 | while (SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP) | ||
| 2299 | { | ||
| 2300 | BIO_printf(bio_s_out,"LOOKUP renego during read\n"); | ||
| 2301 | srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login); | ||
| 2302 | if (srp_callback_parm.user) | ||
| 2303 | BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info); | ||
| 2304 | else | ||
| 2305 | BIO_printf(bio_s_out,"LOOKUP not successful\n"); | ||
| 2306 | i=SSL_read(con,(char *)buf,bufsize); | ||
| 2307 | } | ||
| 2308 | #endif | ||
| 2095 | switch (SSL_get_error(con,i)) | 2309 | switch (SSL_get_error(con,i)) |
| 2096 | { | 2310 | { |
| 2097 | case SSL_ERROR_NONE: | 2311 | case SSL_ERROR_NONE: |
| @@ -2104,7 +2318,6 @@ again: | |||
| 2104 | break; | 2318 | break; |
| 2105 | case SSL_ERROR_WANT_WRITE: | 2319 | case SSL_ERROR_WANT_WRITE: |
| 2106 | case SSL_ERROR_WANT_READ: | 2320 | case SSL_ERROR_WANT_READ: |
| 2107 | case SSL_ERROR_WANT_X509_LOOKUP: | ||
| 2108 | BIO_printf(bio_s_out,"Read BLOCK\n"); | 2321 | BIO_printf(bio_s_out,"Read BLOCK\n"); |
| 2109 | break; | 2322 | break; |
| 2110 | case SSL_ERROR_SYSCALL: | 2323 | case SSL_ERROR_SYSCALL: |
| @@ -2159,8 +2372,30 @@ static int init_ssl_connection(SSL *con) | |||
| 2159 | X509 *peer; | 2372 | X509 *peer; |
| 2160 | long verify_error; | 2373 | long verify_error; |
| 2161 | MS_STATIC char buf[BUFSIZ]; | 2374 | MS_STATIC char buf[BUFSIZ]; |
| 2375 | #ifndef OPENSSL_NO_KRB5 | ||
| 2376 | char *client_princ; | ||
| 2377 | #endif | ||
| 2378 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) | ||
| 2379 | const unsigned char *next_proto_neg; | ||
| 2380 | unsigned next_proto_neg_len; | ||
| 2381 | #endif | ||
| 2382 | unsigned char *exportedkeymat; | ||
| 2162 | 2383 | ||
| 2163 | if ((i=SSL_accept(con)) <= 0) | 2384 | |
| 2385 | i=SSL_accept(con); | ||
| 2386 | #ifndef OPENSSL_NO_SRP | ||
| 2387 | while (i <= 0 && SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP) | ||
| 2388 | { | ||
| 2389 | BIO_printf(bio_s_out,"LOOKUP during accept %s\n",srp_callback_parm.login); | ||
| 2390 | srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login); | ||
| 2391 | if (srp_callback_parm.user) | ||
| 2392 | BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info); | ||
| 2393 | else | ||
| 2394 | BIO_printf(bio_s_out,"LOOKUP not successful\n"); | ||
| 2395 | i=SSL_accept(con); | ||
| 2396 | } | ||
| 2397 | #endif | ||
| 2398 | if (i <= 0) | ||
| 2164 | { | 2399 | { |
| 2165 | if (BIO_sock_should_retry(i)) | 2400 | if (BIO_sock_should_retry(i)) |
| 2166 | { | 2401 | { |
| @@ -2198,19 +2433,67 @@ static int init_ssl_connection(SSL *con) | |||
| 2198 | BIO_printf(bio_s_out,"Shared ciphers:%s\n",buf); | 2433 | BIO_printf(bio_s_out,"Shared ciphers:%s\n",buf); |
| 2199 | str=SSL_CIPHER_get_name(SSL_get_current_cipher(con)); | 2434 | str=SSL_CIPHER_get_name(SSL_get_current_cipher(con)); |
| 2200 | BIO_printf(bio_s_out,"CIPHER is %s\n",(str != NULL)?str:"(NONE)"); | 2435 | BIO_printf(bio_s_out,"CIPHER is %s\n",(str != NULL)?str:"(NONE)"); |
| 2201 | if (con->hit) BIO_printf(bio_s_out,"Reused session-id\n"); | 2436 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) |
| 2437 | SSL_get0_next_proto_negotiated(con, &next_proto_neg, &next_proto_neg_len); | ||
| 2438 | if (next_proto_neg) | ||
| 2439 | { | ||
| 2440 | BIO_printf(bio_s_out,"NEXTPROTO is "); | ||
| 2441 | BIO_write(bio_s_out, next_proto_neg, next_proto_neg_len); | ||
| 2442 | BIO_printf(bio_s_out, "\n"); | ||
| 2443 | } | ||
| 2444 | #endif | ||
| 2445 | { | ||
| 2446 | SRTP_PROTECTION_PROFILE *srtp_profile | ||
| 2447 | = SSL_get_selected_srtp_profile(con); | ||
| 2448 | |||
| 2449 | if(srtp_profile) | ||
| 2450 | BIO_printf(bio_s_out,"SRTP Extension negotiated, profile=%s\n", | ||
| 2451 | srtp_profile->name); | ||
| 2452 | } | ||
| 2453 | if (SSL_cache_hit(con)) BIO_printf(bio_s_out,"Reused session-id\n"); | ||
| 2202 | if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) & | 2454 | if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) & |
| 2203 | TLS1_FLAGS_TLS_PADDING_BUG) | 2455 | TLS1_FLAGS_TLS_PADDING_BUG) |
| 2204 | BIO_printf(bio_s_out,"Peer has incorrect TLSv1 block padding\n"); | 2456 | BIO_printf(bio_s_out, |
| 2457 | "Peer has incorrect TLSv1 block padding\n"); | ||
| 2205 | #ifndef OPENSSL_NO_KRB5 | 2458 | #ifndef OPENSSL_NO_KRB5 |
| 2206 | if (con->kssl_ctx->client_princ != NULL) | 2459 | client_princ = kssl_ctx_get0_client_princ(SSL_get0_kssl_ctx(con)); |
| 2460 | if (client_princ != NULL) | ||
| 2207 | { | 2461 | { |
| 2208 | BIO_printf(bio_s_out,"Kerberos peer principal is %s\n", | 2462 | BIO_printf(bio_s_out,"Kerberos peer principal is %s\n", |
| 2209 | con->kssl_ctx->client_princ); | 2463 | client_princ); |
| 2210 | } | 2464 | } |
| 2211 | #endif /* OPENSSL_NO_KRB5 */ | 2465 | #endif /* OPENSSL_NO_KRB5 */ |
| 2212 | BIO_printf(bio_s_out, "Secure Renegotiation IS%s supported\n", | 2466 | BIO_printf(bio_s_out, "Secure Renegotiation IS%s supported\n", |
| 2213 | SSL_get_secure_renegotiation_support(con) ? "" : " NOT"); | 2467 | SSL_get_secure_renegotiation_support(con) ? "" : " NOT"); |
| 2468 | if (keymatexportlabel != NULL) | ||
| 2469 | { | ||
| 2470 | BIO_printf(bio_s_out, "Keying material exporter:\n"); | ||
| 2471 | BIO_printf(bio_s_out, " Label: '%s'\n", keymatexportlabel); | ||
| 2472 | BIO_printf(bio_s_out, " Length: %i bytes\n", | ||
| 2473 | keymatexportlen); | ||
| 2474 | exportedkeymat = OPENSSL_malloc(keymatexportlen); | ||
| 2475 | if (exportedkeymat != NULL) | ||
| 2476 | { | ||
| 2477 | if (!SSL_export_keying_material(con, exportedkeymat, | ||
| 2478 | keymatexportlen, | ||
| 2479 | keymatexportlabel, | ||
| 2480 | strlen(keymatexportlabel), | ||
| 2481 | NULL, 0, 0)) | ||
| 2482 | { | ||
| 2483 | BIO_printf(bio_s_out, " Error\n"); | ||
| 2484 | } | ||
| 2485 | else | ||
| 2486 | { | ||
| 2487 | BIO_printf(bio_s_out, " Keying material: "); | ||
| 2488 | for (i=0; i<keymatexportlen; i++) | ||
| 2489 | BIO_printf(bio_s_out, "%02X", | ||
| 2490 | exportedkeymat[i]); | ||
| 2491 | BIO_printf(bio_s_out, "\n"); | ||
| 2492 | } | ||
| 2493 | OPENSSL_free(exportedkeymat); | ||
| 2494 | } | ||
| 2495 | } | ||
| 2496 | |||
| 2214 | return(1); | 2497 | return(1); |
| 2215 | } | 2498 | } |
| 2216 | 2499 | ||
| @@ -2228,6 +2511,9 @@ err: | |||
| 2228 | return(ret); | 2511 | return(ret); |
| 2229 | } | 2512 | } |
| 2230 | #endif | 2513 | #endif |
| 2514 | #ifndef OPENSSL_NO_KRB5 | ||
| 2515 | char *client_princ; | ||
| 2516 | #endif | ||
| 2231 | 2517 | ||
| 2232 | #if 0 | 2518 | #if 0 |
| 2233 | static int load_CA(SSL_CTX *ctx, char *file) | 2519 | static int load_CA(SSL_CTX *ctx, char *file) |
| @@ -2258,6 +2544,9 @@ static int www_body(char *hostname, int s, unsigned char *context) | |||
| 2258 | SSL *con; | 2544 | SSL *con; |
| 2259 | const SSL_CIPHER *c; | 2545 | const SSL_CIPHER *c; |
| 2260 | BIO *io,*ssl_bio,*sbio; | 2546 | BIO *io,*ssl_bio,*sbio; |
| 2547 | #ifndef OPENSSL_NO_KRB5 | ||
| 2548 | KSSL_CTX *kctx; | ||
| 2549 | #endif | ||
| 2261 | 2550 | ||
| 2262 | buf=OPENSSL_malloc(bufsize); | 2551 | buf=OPENSSL_malloc(bufsize); |
| 2263 | if (buf == NULL) return(0); | 2552 | if (buf == NULL) return(0); |
| @@ -2289,10 +2578,10 @@ static int www_body(char *hostname, int s, unsigned char *context) | |||
| 2289 | } | 2578 | } |
| 2290 | #endif | 2579 | #endif |
| 2291 | #ifndef OPENSSL_NO_KRB5 | 2580 | #ifndef OPENSSL_NO_KRB5 |
| 2292 | if ((con->kssl_ctx = kssl_ctx_new()) != NULL) | 2581 | if ((kctx = kssl_ctx_new()) != NULL) |
| 2293 | { | 2582 | { |
| 2294 | kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE, KRB5SVC); | 2583 | kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC); |
| 2295 | kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB, KRB5KEYTAB); | 2584 | kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB); |
| 2296 | } | 2585 | } |
| 2297 | #endif /* OPENSSL_NO_KRB5 */ | 2586 | #endif /* OPENSSL_NO_KRB5 */ |
| 2298 | if(context) SSL_set_session_id_context(con, context, | 2587 | if(context) SSL_set_session_id_context(con, context, |
| @@ -2318,7 +2607,7 @@ static int www_body(char *hostname, int s, unsigned char *context) | |||
| 2318 | 2607 | ||
| 2319 | if (s_debug) | 2608 | if (s_debug) |
| 2320 | { | 2609 | { |
| 2321 | con->debug=1; | 2610 | SSL_set_debug(con, 1); |
| 2322 | BIO_set_callback(SSL_get_rbio(con),bio_dump_callback); | 2611 | BIO_set_callback(SSL_get_rbio(con),bio_dump_callback); |
| 2323 | BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out); | 2612 | BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out); |
| 2324 | } | 2613 | } |
| @@ -2333,7 +2622,18 @@ static int www_body(char *hostname, int s, unsigned char *context) | |||
| 2333 | if (hack) | 2622 | if (hack) |
| 2334 | { | 2623 | { |
| 2335 | i=SSL_accept(con); | 2624 | i=SSL_accept(con); |
| 2336 | 2625 | #ifndef OPENSSL_NO_SRP | |
| 2626 | while (i <= 0 && SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP) | ||
| 2627 | { | ||
| 2628 | BIO_printf(bio_s_out,"LOOKUP during accept %s\n",srp_callback_parm.login); | ||
| 2629 | srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login); | ||
| 2630 | if (srp_callback_parm.user) | ||
| 2631 | BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info); | ||
| 2632 | else | ||
| 2633 | BIO_printf(bio_s_out,"LOOKUP not successful\n"); | ||
| 2634 | i=SSL_accept(con); | ||
| 2635 | } | ||
| 2636 | #endif | ||
| 2337 | switch (SSL_get_error(con,i)) | 2637 | switch (SSL_get_error(con,i)) |
| 2338 | { | 2638 | { |
| 2339 | case SSL_ERROR_NONE: | 2639 | case SSL_ERROR_NONE: |
| @@ -2439,7 +2739,7 @@ static int www_body(char *hostname, int s, unsigned char *context) | |||
| 2439 | } | 2739 | } |
| 2440 | BIO_puts(io,"\n"); | 2740 | BIO_puts(io,"\n"); |
| 2441 | } | 2741 | } |
| 2442 | BIO_printf(io,((con->hit) | 2742 | BIO_printf(io,(SSL_cache_hit(con) |
| 2443 | ?"---\nReused, " | 2743 | ?"---\nReused, " |
| 2444 | :"---\nNew, ")); | 2744 | :"---\nNew, ")); |
| 2445 | c=SSL_get_current_cipher(con); | 2745 | c=SSL_get_current_cipher(con); |
