diff options
Diffstat (limited to '')
30 files changed, 2 insertions, 5120 deletions
diff --git a/src/lib/libssl/d1_clnt.c b/src/lib/libssl/d1_clnt.c index 38118b1385..8967879f70 100644 --- a/src/lib/libssl/d1_clnt.c +++ b/src/lib/libssl/d1_clnt.c | |||
| @@ -115,9 +115,6 @@ | |||
| 115 | 115 | ||
| 116 | #include <stdio.h> | 116 | #include <stdio.h> |
| 117 | #include "ssl_locl.h" | 117 | #include "ssl_locl.h" |
| 118 | #ifndef OPENSSL_NO_KRB5 | ||
| 119 | #include "kssl_lcl.h" | ||
| 120 | #endif | ||
| 121 | #include <openssl/buffer.h> | 118 | #include <openssl/buffer.h> |
| 122 | #include <openssl/rand.h> | 119 | #include <openssl/rand.h> |
| 123 | #include <openssl/objects.h> | 120 | #include <openssl/objects.h> |
| @@ -926,9 +923,6 @@ dtls1_send_client_key_exchange(SSL *s) | |||
| 926 | unsigned long alg_k; | 923 | unsigned long alg_k; |
| 927 | unsigned char *q; | 924 | unsigned char *q; |
| 928 | EVP_PKEY *pkey = NULL; | 925 | EVP_PKEY *pkey = NULL; |
| 929 | #ifndef OPENSSL_NO_KRB5 | ||
| 930 | KSSL_ERR kssl_err; | ||
| 931 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 932 | #ifndef OPENSSL_NO_ECDH | 926 | #ifndef OPENSSL_NO_ECDH |
| 933 | EC_KEY *clnt_ecdh = NULL; | 927 | EC_KEY *clnt_ecdh = NULL; |
| 934 | const EC_POINT *srvr_ecpoint = NULL; | 928 | const EC_POINT *srvr_ecpoint = NULL; |
| @@ -992,134 +986,6 @@ dtls1_send_client_key_exchange(SSL *s) | |||
| 992 | tmp_buf, sizeof tmp_buf); | 986 | tmp_buf, sizeof tmp_buf); |
| 993 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); | 987 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); |
| 994 | } | 988 | } |
| 995 | #ifndef OPENSSL_NO_KRB5 | ||
| 996 | else if (alg_k & SSL_kKRB5) { | ||
| 997 | krb5_error_code krb5rc; | ||
| 998 | KSSL_CTX *kssl_ctx = s->kssl_ctx; | ||
| 999 | /* krb5_data krb5_ap_req; */ | ||
| 1000 | krb5_data *enc_ticket; | ||
| 1001 | krb5_data authenticator, *authp = NULL; | ||
| 1002 | EVP_CIPHER_CTX ciph_ctx; | ||
| 1003 | const EVP_CIPHER *enc = NULL; | ||
| 1004 | unsigned char iv[EVP_MAX_IV_LENGTH]; | ||
| 1005 | unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; | ||
| 1006 | unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH | ||
| 1007 | + EVP_MAX_IV_LENGTH]; | ||
| 1008 | int padl, outl = sizeof(epms); | ||
| 1009 | |||
| 1010 | EVP_CIPHER_CTX_init(&ciph_ctx); | ||
| 1011 | |||
| 1012 | #ifdef KSSL_DEBUG | ||
| 1013 | printf("ssl3_send_client_key_exchange(%lx & %lx)\n", | ||
| 1014 | alg_k, SSL_kKRB5); | ||
| 1015 | #endif /* KSSL_DEBUG */ | ||
| 1016 | |||
| 1017 | authp = NULL; | ||
| 1018 | #ifdef KRB5SENDAUTH | ||
| 1019 | if (KRB5SENDAUTH) | ||
| 1020 | authp = &authenticator; | ||
| 1021 | #endif /* KRB5SENDAUTH */ | ||
| 1022 | |||
| 1023 | krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp, | ||
| 1024 | &kssl_err); | ||
| 1025 | enc = kssl_map_enc(kssl_ctx->enctype); | ||
| 1026 | if (enc == NULL) | ||
| 1027 | goto err; | ||
| 1028 | #ifdef KSSL_DEBUG | ||
| 1029 | { | ||
| 1030 | printf("kssl_cget_tkt rtn %d\n", krb5rc); | ||
| 1031 | if (krb5rc && kssl_err.text) | ||
| 1032 | printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text); | ||
| 1033 | } | ||
| 1034 | #endif /* KSSL_DEBUG */ | ||
| 1035 | |||
| 1036 | if (krb5rc) { | ||
| 1037 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 1038 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 1039 | SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, | ||
| 1040 | kssl_err.reason); | ||
| 1041 | goto err; | ||
| 1042 | } | ||
| 1043 | |||
| 1044 | /* 20010406 VRS - Earlier versions used KRB5 AP_REQ | ||
| 1045 | ** in place of RFC 2712 KerberosWrapper, as in: | ||
| 1046 | ** | ||
| 1047 | ** Send ticket (copy to *p, set n = length) | ||
| 1048 | ** n = krb5_ap_req.length; | ||
| 1049 | ** memcpy(p, krb5_ap_req.data, krb5_ap_req.length); | ||
| 1050 | ** if (krb5_ap_req.data) | ||
| 1051 | ** kssl_krb5_free_data_contents(NULL,&krb5_ap_req); | ||
| 1052 | ** | ||
| 1053 | ** Now using real RFC 2712 KerberosWrapper | ||
| 1054 | ** (Thanks to Simon Wilkinson <sxw@sxw.org.uk>) | ||
| 1055 | ** Note: 2712 "opaque" types are here replaced | ||
| 1056 | ** with a 2-byte length followed by the value. | ||
| 1057 | ** Example: | ||
| 1058 | ** KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms | ||
| 1059 | ** Where "xx xx" = length bytes. Shown here with | ||
| 1060 | ** optional authenticator omitted. | ||
| 1061 | */ | ||
| 1062 | |||
| 1063 | /* KerberosWrapper.Ticket */ | ||
| 1064 | s2n(enc_ticket->length, p); | ||
| 1065 | memcpy(p, enc_ticket->data, enc_ticket->length); | ||
| 1066 | p += enc_ticket->length; | ||
| 1067 | n = enc_ticket->length + 2; | ||
| 1068 | |||
| 1069 | /* KerberosWrapper.Authenticator */ | ||
| 1070 | if (authp && authp->length) { | ||
| 1071 | s2n(authp->length, p); | ||
| 1072 | memcpy(p, authp->data, authp->length); | ||
| 1073 | p += authp->length; | ||
| 1074 | n += authp->length + 2; | ||
| 1075 | |||
| 1076 | free(authp->data); | ||
| 1077 | authp->data = NULL; | ||
| 1078 | authp->length = 0; | ||
| 1079 | } else { | ||
| 1080 | s2n(0, p);/* null authenticator length */ | ||
| 1081 | n += 2; | ||
| 1082 | } | ||
| 1083 | |||
| 1084 | if (RAND_bytes(tmp_buf, sizeof tmp_buf) <= 0) | ||
| 1085 | goto err; | ||
| 1086 | |||
| 1087 | /* 20010420 VRS. Tried it this way; failed. | ||
| 1088 | ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); | ||
| 1089 | ** EVP_CIPHER_CTX_set_key_length(&ciph_ctx, | ||
| 1090 | ** kssl_ctx->length); | ||
| 1091 | ** EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv); | ||
| 1092 | */ | ||
| 1093 | |||
| 1094 | memset(iv, 0, sizeof iv); | ||
| 1095 | /* per RFC 1510 */ | ||
| 1096 | EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, | ||
| 1097 | kssl_ctx->key, iv); | ||
| 1098 | EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf, | ||
| 1099 | sizeof tmp_buf); | ||
| 1100 | EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl); | ||
| 1101 | outl += padl; | ||
| 1102 | if (outl > (int)sizeof epms) { | ||
| 1103 | SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | ||
| 1104 | goto err; | ||
| 1105 | } | ||
| 1106 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
| 1107 | |||
| 1108 | /* KerberosWrapper.EncryptedPreMasterSecret */ | ||
| 1109 | s2n(outl, p); | ||
| 1110 | memcpy(p, epms, outl); | ||
| 1111 | p += outl; | ||
| 1112 | n += outl + 2; | ||
| 1113 | |||
| 1114 | s->session->master_key_length = | ||
| 1115 | s->method->ssl3_enc->generate_master_secret(s, | ||
| 1116 | s->session->master_key, | ||
| 1117 | tmp_buf, sizeof tmp_buf); | ||
| 1118 | |||
| 1119 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); | ||
| 1120 | OPENSSL_cleanse(epms, outl); | ||
| 1121 | } | ||
| 1122 | #endif | ||
| 1123 | #ifndef OPENSSL_NO_DH | 989 | #ifndef OPENSSL_NO_DH |
| 1124 | else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { | 990 | else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { |
| 1125 | DH *dh_srvr, *dh_clnt; | 991 | DH *dh_srvr, *dh_clnt; |
diff --git a/src/lib/libssl/d1_srvr.c b/src/lib/libssl/d1_srvr.c index 9995278a26..6183815a6d 100644 --- a/src/lib/libssl/d1_srvr.c +++ b/src/lib/libssl/d1_srvr.c | |||
| @@ -429,9 +429,6 @@ dtls1_accept(SSL *s) | |||
| 429 | /* clear this, it may get reset by | 429 | /* clear this, it may get reset by |
| 430 | * send_server_key_exchange */ | 430 | * send_server_key_exchange */ |
| 431 | if ((s->options & SSL_OP_EPHEMERAL_RSA) | 431 | if ((s->options & SSL_OP_EPHEMERAL_RSA) |
| 432 | #ifndef OPENSSL_NO_KRB5 | ||
| 433 | && !(alg_k & SSL_kKRB5) | ||
| 434 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 435 | ) | 432 | ) |
| 436 | /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key | 433 | /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key |
| 437 | * even when forbidden by protocol specs | 434 | * even when forbidden by protocol specs |
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index eb55fc9682..68817cd33a 100644 --- a/src/lib/libssl/s3_clnt.c +++ b/src/lib/libssl/s3_clnt.c | |||
| @@ -369,17 +369,6 @@ ssl3_connect(SSL *s) | |||
| 369 | ret = ssl3_get_server_done(s); | 369 | ret = ssl3_get_server_done(s); |
| 370 | if (ret <= 0) | 370 | if (ret <= 0) |
| 371 | goto end; | 371 | goto end; |
| 372 | #ifndef OPENSSL_NO_SRP | ||
| 373 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { | ||
| 374 | if ((ret = SRP_Calc_A_param(s)) <= 0) { | ||
| 375 | SSLerr(SSL_F_SSL3_CONNECT, | ||
| 376 | SSL_R_SRP_A_CALC); | ||
| 377 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 378 | SSL_AD_INTERNAL_ERROR); | ||
| 379 | goto end; | ||
| 380 | } | ||
| 381 | } | ||
| 382 | #endif | ||
| 383 | if (s->s3->tmp.cert_req) | 372 | if (s->s3->tmp.cert_req) |
| 384 | s->state = SSL3_ST_CW_CERT_A; | 373 | s->state = SSL3_ST_CW_CERT_A; |
| 385 | else | 374 | else |
| @@ -1137,10 +1126,6 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1137 | 1126 | ||
| 1138 | i = ssl_verify_cert_chain(s, sk); | 1127 | i = ssl_verify_cert_chain(s, sk); |
| 1139 | if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0) | 1128 | if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0) |
| 1140 | #ifndef OPENSSL_NO_KRB5 | ||
| 1141 | && !((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) && | ||
| 1142 | (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)) | ||
| 1143 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 1144 | ) { | 1129 | ) { |
| 1145 | al = ssl_verify_alarm_type(s->verify_result); | 1130 | al = ssl_verify_alarm_type(s->verify_result); |
| 1146 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | 1131 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| @@ -1361,81 +1346,6 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1361 | n -= param_len; | 1346 | n -= param_len; |
| 1362 | } else | 1347 | } else |
| 1363 | #endif /* !OPENSSL_NO_PSK */ | 1348 | #endif /* !OPENSSL_NO_PSK */ |
| 1364 | #ifndef OPENSSL_NO_SRP | ||
| 1365 | if (alg_k & SSL_kSRP) { | ||
| 1366 | n2s(p, i); | ||
| 1367 | param_len = i + 2; | ||
| 1368 | if (param_len > n) { | ||
| 1369 | al = SSL_AD_DECODE_ERROR; | ||
| 1370 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1371 | SSL_R_BAD_SRP_N_LENGTH); | ||
| 1372 | goto f_err; | ||
| 1373 | } | ||
| 1374 | if (!(s->srp_ctx.N = BN_bin2bn(p, i, NULL))) { | ||
| 1375 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1376 | ERR_R_BN_LIB); | ||
| 1377 | goto err; | ||
| 1378 | } | ||
| 1379 | p += i; | ||
| 1380 | |||
| 1381 | n2s(p, i); | ||
| 1382 | param_len += i + 2; | ||
| 1383 | if (param_len > n) { | ||
| 1384 | al = SSL_AD_DECODE_ERROR; | ||
| 1385 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1386 | SSL_R_BAD_SRP_G_LENGTH); | ||
| 1387 | goto f_err; | ||
| 1388 | } | ||
| 1389 | if (!(s->srp_ctx.g = BN_bin2bn(p, i, NULL))) { | ||
| 1390 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1391 | ERR_R_BN_LIB); | ||
| 1392 | goto err; | ||
| 1393 | } | ||
| 1394 | p += i; | ||
| 1395 | |||
| 1396 | i = (unsigned int)(p[0]); | ||
| 1397 | p++; | ||
| 1398 | param_len += i + 1; | ||
| 1399 | if (param_len > n) { | ||
| 1400 | al = SSL_AD_DECODE_ERROR; | ||
| 1401 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1402 | SSL_R_BAD_SRP_S_LENGTH); | ||
| 1403 | goto f_err; | ||
| 1404 | } | ||
| 1405 | if (!(s->srp_ctx.s = BN_bin2bn(p, i, NULL))) { | ||
| 1406 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1407 | ERR_R_BN_LIB); | ||
| 1408 | goto err; | ||
| 1409 | } | ||
| 1410 | p += i; | ||
| 1411 | |||
| 1412 | n2s(p, i); | ||
| 1413 | param_len += i + 2; | ||
| 1414 | if (param_len > n) { | ||
| 1415 | al = SSL_AD_DECODE_ERROR; | ||
| 1416 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1417 | SSL_R_BAD_SRP_B_LENGTH); | ||
| 1418 | goto f_err; | ||
| 1419 | } | ||
| 1420 | if (!(s->srp_ctx.B = BN_bin2bn(p, i, NULL))) { | ||
| 1421 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1422 | ERR_R_BN_LIB); | ||
| 1423 | goto err; | ||
| 1424 | } | ||
| 1425 | p += i; | ||
| 1426 | n -= param_len; | ||
| 1427 | |||
| 1428 | /* We must check if there is a certificate */ | ||
| 1429 | if (alg_a & SSL_aRSA) | ||
| 1430 | pkey = X509_get_pubkey( | ||
| 1431 | s->session->sess_cert->peer_pkeys[ | ||
| 1432 | SSL_PKEY_RSA_ENC].x509); | ||
| 1433 | else if (alg_a & SSL_aDSS) | ||
| 1434 | pkey = X509_get_pubkey( | ||
| 1435 | s->session->sess_cert->peer_pkeys[ | ||
| 1436 | SSL_PKEY_DSA_SIGN].x509); | ||
| 1437 | } else | ||
| 1438 | #endif /* !OPENSSL_NO_SRP */ | ||
| 1439 | if (alg_k & SSL_kRSA) { | 1349 | if (alg_k & SSL_kRSA) { |
| 1440 | if ((rsa = RSA_new()) == NULL) { | 1350 | if ((rsa = RSA_new()) == NULL) { |
| 1441 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1351 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| @@ -2156,9 +2066,6 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2156 | unsigned long alg_k; | 2066 | unsigned long alg_k; |
| 2157 | unsigned char *q; | 2067 | unsigned char *q; |
| 2158 | EVP_PKEY *pkey = NULL; | 2068 | EVP_PKEY *pkey = NULL; |
| 2159 | #ifndef OPENSSL_NO_KRB5 | ||
| 2160 | KSSL_ERR kssl_err; | ||
| 2161 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 2162 | #ifndef OPENSSL_NO_ECDH | 2069 | #ifndef OPENSSL_NO_ECDH |
| 2163 | EC_KEY *clnt_ecdh = NULL; | 2070 | EC_KEY *clnt_ecdh = NULL; |
| 2164 | const EC_POINT *srvr_ecpoint = NULL; | 2071 | const EC_POINT *srvr_ecpoint = NULL; |
| @@ -2226,140 +2133,6 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2226 | s, s->session->master_key, tmp_buf, sizeof tmp_buf); | 2133 | s, s->session->master_key, tmp_buf, sizeof tmp_buf); |
| 2227 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); | 2134 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); |
| 2228 | } | 2135 | } |
| 2229 | #ifndef OPENSSL_NO_KRB5 | ||
| 2230 | else if (alg_k & SSL_kKRB5) { | ||
| 2231 | krb5_error_code krb5rc; | ||
| 2232 | KSSL_CTX *kssl_ctx = s->kssl_ctx; | ||
| 2233 | /* krb5_data krb5_ap_req; */ | ||
| 2234 | krb5_data *enc_ticket; | ||
| 2235 | krb5_data authenticator, *authp = NULL; | ||
| 2236 | EVP_CIPHER_CTX ciph_ctx; | ||
| 2237 | const EVP_CIPHER *enc = NULL; | ||
| 2238 | unsigned char iv[EVP_MAX_IV_LENGTH]; | ||
| 2239 | unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; | ||
| 2240 | unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH | ||
| 2241 | + EVP_MAX_IV_LENGTH]; | ||
| 2242 | int padl, outl = sizeof(epms); | ||
| 2243 | |||
| 2244 | EVP_CIPHER_CTX_init(&ciph_ctx); | ||
| 2245 | |||
| 2246 | #ifdef KSSL_DEBUG | ||
| 2247 | printf("ssl3_send_client_key_exchange(%lx & %lx)\n", | ||
| 2248 | alg_k, SSL_kKRB5); | ||
| 2249 | #endif /* KSSL_DEBUG */ | ||
| 2250 | |||
| 2251 | authp = NULL; | ||
| 2252 | #ifdef KRB5SENDAUTH | ||
| 2253 | if (KRB5SENDAUTH) | ||
| 2254 | authp = &authenticator; | ||
| 2255 | #endif /* KRB5SENDAUTH */ | ||
| 2256 | |||
| 2257 | krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, | ||
| 2258 | authp, &kssl_err); | ||
| 2259 | enc = kssl_map_enc(kssl_ctx->enctype); | ||
| 2260 | if (enc == NULL) | ||
| 2261 | goto err; | ||
| 2262 | #ifdef KSSL_DEBUG | ||
| 2263 | { | ||
| 2264 | printf("kssl_cget_tkt rtn %d\n", krb5rc); | ||
| 2265 | if (krb5rc && kssl_err.text) | ||
| 2266 | printf("kssl_cget_tkt kssl_err=%s\n", | ||
| 2267 | kssl_err.text); | ||
| 2268 | } | ||
| 2269 | #endif /* KSSL_DEBUG */ | ||
| 2270 | |||
| 2271 | if (krb5rc) { | ||
| 2272 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 2273 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 2274 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2275 | kssl_err.reason); | ||
| 2276 | goto err; | ||
| 2277 | } | ||
| 2278 | |||
| 2279 | /* | ||
| 2280 | * 20010406 VRS - Earlier versions used KRB5 AP_REQ | ||
| 2281 | * in place of RFC 2712 KerberosWrapper, as in: | ||
| 2282 | * | ||
| 2283 | * Send ticket (copy to *p, set n = length) | ||
| 2284 | * n = krb5_ap_req.length; | ||
| 2285 | * memcpy(p, krb5_ap_req.data, krb5_ap_req.length); | ||
| 2286 | * if (krb5_ap_req.data) | ||
| 2287 | * kssl_krb5_free_data_contents(NULL,&krb5_ap_req); | ||
| 2288 | * | ||
| 2289 | * Now using real RFC 2712 KerberosWrapper | ||
| 2290 | * (Thanks to Simon Wilkinson <sxw@sxw.org.uk>) | ||
| 2291 | * Note: 2712 "opaque" types are here replaced | ||
| 2292 | * with a 2-byte length followed by the value. | ||
| 2293 | * Example: | ||
| 2294 | * KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms | ||
| 2295 | * Where "xx xx" = length bytes. Shown here with | ||
| 2296 | * optional authenticator omitted. | ||
| 2297 | */ | ||
| 2298 | |||
| 2299 | /* KerberosWrapper.Ticket */ | ||
| 2300 | s2n(enc_ticket->length, p); | ||
| 2301 | memcpy(p, enc_ticket->data, enc_ticket->length); | ||
| 2302 | p += enc_ticket->length; | ||
| 2303 | n = enc_ticket->length + 2; | ||
| 2304 | |||
| 2305 | /* KerberosWrapper.Authenticator */ | ||
| 2306 | if (authp && authp->length) { | ||
| 2307 | s2n(authp->length, p); | ||
| 2308 | memcpy(p, authp->data, authp->length); | ||
| 2309 | p += authp->length; | ||
| 2310 | n += authp->length + 2; | ||
| 2311 | |||
| 2312 | free(authp->data); | ||
| 2313 | authp->data = NULL; | ||
| 2314 | authp->length = 0; | ||
| 2315 | } else { | ||
| 2316 | s2n(0,p);/* null authenticator length */ | ||
| 2317 | n += 2; | ||
| 2318 | } | ||
| 2319 | |||
| 2320 | tmp_buf[0] = s->client_version >> 8; | ||
| 2321 | tmp_buf[1] = s->client_version & 0xff; | ||
| 2322 | if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0) | ||
| 2323 | goto err; | ||
| 2324 | |||
| 2325 | /* | ||
| 2326 | * 20010420 VRS. Tried it this way; failed. | ||
| 2327 | * EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); | ||
| 2328 | * EVP_CIPHER_CTX_set_key_length(&ciph_ctx, | ||
| 2329 | * kssl_ctx->length); | ||
| 2330 | * EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv); | ||
| 2331 | */ | ||
| 2332 | |||
| 2333 | memset(iv, 0, sizeof iv); | ||
| 2334 | /* per RFC 1510 */ | ||
| 2335 | EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, | ||
| 2336 | kssl_ctx->key, iv); | ||
| 2337 | EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf, | ||
| 2338 | sizeof tmp_buf); | ||
| 2339 | EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl); | ||
| 2340 | outl += padl; | ||
| 2341 | if (outl > (int)sizeof epms) { | ||
| 2342 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2343 | ERR_R_INTERNAL_ERROR); | ||
| 2344 | goto err; | ||
| 2345 | } | ||
| 2346 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
| 2347 | |||
| 2348 | /* KerberosWrapper.EncryptedPreMasterSecret */ | ||
| 2349 | s2n(outl, p); | ||
| 2350 | memcpy(p, epms, outl); | ||
| 2351 | p += outl; | ||
| 2352 | n += outl + 2; | ||
| 2353 | |||
| 2354 | s->session->master_key_length = | ||
| 2355 | s->method->ssl3_enc->generate_master_secret(s, | ||
| 2356 | s->session->master_key, | ||
| 2357 | tmp_buf, sizeof tmp_buf); | ||
| 2358 | |||
| 2359 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); | ||
| 2360 | OPENSSL_cleanse(epms, outl); | ||
| 2361 | } | ||
| 2362 | #endif | ||
| 2363 | #ifndef OPENSSL_NO_DH | 2136 | #ifndef OPENSSL_NO_DH |
| 2364 | else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { | 2137 | else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { |
| 2365 | DH *dh_srvr, *dh_clnt; | 2138 | DH *dh_srvr, *dh_clnt; |
| @@ -2716,37 +2489,6 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2716 | EVP_PKEY_free(pub_key); | 2489 | EVP_PKEY_free(pub_key); |
| 2717 | 2490 | ||
| 2718 | } | 2491 | } |
| 2719 | #ifndef OPENSSL_NO_SRP | ||
| 2720 | else if (alg_k & SSL_kSRP) { | ||
| 2721 | if (s->srp_ctx.A != NULL) { | ||
| 2722 | /* send off the data */ | ||
| 2723 | n = BN_num_bytes(s->srp_ctx.A); | ||
| 2724 | s2n(n, p); | ||
| 2725 | BN_bn2bin(s->srp_ctx.A, p); | ||
| 2726 | n += 2; | ||
| 2727 | } else { | ||
| 2728 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2729 | ERR_R_INTERNAL_ERROR); | ||
| 2730 | goto err; | ||
| 2731 | } | ||
| 2732 | if (s->session->srp_username != NULL) | ||
| 2733 | free(s->session->srp_username); | ||
| 2734 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); | ||
| 2735 | if (s->session->srp_username == NULL) { | ||
| 2736 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2737 | ERR_R_MALLOC_FAILURE); | ||
| 2738 | goto err; | ||
| 2739 | } | ||
| 2740 | |||
| 2741 | if ((s->session->master_key_length = | ||
| 2742 | SRP_generate_client_master_secret(s, | ||
| 2743 | s->session->master_key)) < 0) { | ||
| 2744 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2745 | ERR_R_INTERNAL_ERROR); | ||
| 2746 | goto err; | ||
| 2747 | } | ||
| 2748 | } | ||
| 2749 | #endif | ||
| 2750 | #ifndef OPENSSL_NO_PSK | 2492 | #ifndef OPENSSL_NO_PSK |
| 2751 | else if (alg_k & SSL_kPSK) { | 2493 | else if (alg_k & SSL_kPSK) { |
| 2752 | char identity[PSK_MAX_IDENTITY_LEN]; | 2494 | char identity[PSK_MAX_IDENTITY_LEN]; |
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index 12ce8a1605..c68748809c 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
| @@ -605,232 +605,6 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] = { | |||
| 605 | 168, | 605 | 168, |
| 606 | 168, | 606 | 168, |
| 607 | }, | 607 | }, |
| 608 | #ifndef OPENSSL_NO_KRB5 | ||
| 609 | /* The Kerberos ciphers*/ | ||
| 610 | /* Cipher 1E */ | ||
| 611 | { | ||
| 612 | 1, | ||
| 613 | SSL3_TXT_KRB5_DES_64_CBC_SHA, | ||
| 614 | SSL3_CK_KRB5_DES_64_CBC_SHA, | ||
| 615 | SSL_kKRB5, | ||
| 616 | SSL_aKRB5, | ||
| 617 | SSL_DES, | ||
| 618 | SSL_SHA1, | ||
| 619 | SSL_SSLV3, | ||
| 620 | SSL_NOT_EXP|SSL_LOW, | ||
| 621 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 622 | 56, | ||
| 623 | 56, | ||
| 624 | }, | ||
| 625 | |||
| 626 | /* Cipher 1F */ | ||
| 627 | { | ||
| 628 | 1, | ||
| 629 | SSL3_TXT_KRB5_DES_192_CBC3_SHA, | ||
| 630 | SSL3_CK_KRB5_DES_192_CBC3_SHA, | ||
| 631 | SSL_kKRB5, | ||
| 632 | SSL_aKRB5, | ||
| 633 | SSL_3DES, | ||
| 634 | SSL_SHA1, | ||
| 635 | SSL_SSLV3, | ||
| 636 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, | ||
| 637 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 638 | 168, | ||
| 639 | 168, | ||
| 640 | }, | ||
| 641 | |||
| 642 | /* Cipher 20 */ | ||
| 643 | { | ||
| 644 | 1, | ||
| 645 | SSL3_TXT_KRB5_RC4_128_SHA, | ||
| 646 | SSL3_CK_KRB5_RC4_128_SHA, | ||
| 647 | SSL_kKRB5, | ||
| 648 | SSL_aKRB5, | ||
| 649 | SSL_RC4, | ||
| 650 | SSL_SHA1, | ||
| 651 | SSL_SSLV3, | ||
| 652 | SSL_NOT_EXP|SSL_MEDIUM, | ||
| 653 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 654 | 128, | ||
| 655 | 128, | ||
| 656 | }, | ||
| 657 | |||
| 658 | /* Cipher 21 */ | ||
| 659 | { | ||
| 660 | 1, | ||
| 661 | SSL3_TXT_KRB5_IDEA_128_CBC_SHA, | ||
| 662 | SSL3_CK_KRB5_IDEA_128_CBC_SHA, | ||
| 663 | SSL_kKRB5, | ||
| 664 | SSL_aKRB5, | ||
| 665 | SSL_IDEA, | ||
| 666 | SSL_SHA1, | ||
| 667 | SSL_SSLV3, | ||
| 668 | SSL_NOT_EXP|SSL_MEDIUM, | ||
| 669 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 670 | 128, | ||
| 671 | 128, | ||
| 672 | }, | ||
| 673 | |||
| 674 | /* Cipher 22 */ | ||
| 675 | { | ||
| 676 | 1, | ||
| 677 | SSL3_TXT_KRB5_DES_64_CBC_MD5, | ||
| 678 | SSL3_CK_KRB5_DES_64_CBC_MD5, | ||
| 679 | SSL_kKRB5, | ||
| 680 | SSL_aKRB5, | ||
| 681 | SSL_DES, | ||
| 682 | SSL_MD5, | ||
| 683 | SSL_SSLV3, | ||
| 684 | SSL_NOT_EXP|SSL_LOW, | ||
| 685 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 686 | 56, | ||
| 687 | 56, | ||
| 688 | }, | ||
| 689 | |||
| 690 | /* Cipher 23 */ | ||
| 691 | { | ||
| 692 | 1, | ||
| 693 | SSL3_TXT_KRB5_DES_192_CBC3_MD5, | ||
| 694 | SSL3_CK_KRB5_DES_192_CBC3_MD5, | ||
| 695 | SSL_kKRB5, | ||
| 696 | SSL_aKRB5, | ||
| 697 | SSL_3DES, | ||
| 698 | SSL_MD5, | ||
| 699 | SSL_SSLV3, | ||
| 700 | SSL_NOT_EXP|SSL_HIGH, | ||
| 701 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 702 | 168, | ||
| 703 | 168, | ||
| 704 | }, | ||
| 705 | |||
| 706 | /* Cipher 24 */ | ||
| 707 | { | ||
| 708 | 1, | ||
| 709 | SSL3_TXT_KRB5_RC4_128_MD5, | ||
| 710 | SSL3_CK_KRB5_RC4_128_MD5, | ||
| 711 | SSL_kKRB5, | ||
| 712 | SSL_aKRB5, | ||
| 713 | SSL_RC4, | ||
| 714 | SSL_MD5, | ||
| 715 | SSL_SSLV3, | ||
| 716 | SSL_NOT_EXP|SSL_MEDIUM, | ||
| 717 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 718 | 128, | ||
| 719 | 128, | ||
| 720 | }, | ||
| 721 | |||
| 722 | /* Cipher 25 */ | ||
| 723 | { | ||
| 724 | 1, | ||
| 725 | SSL3_TXT_KRB5_IDEA_128_CBC_MD5, | ||
| 726 | SSL3_CK_KRB5_IDEA_128_CBC_MD5, | ||
| 727 | SSL_kKRB5, | ||
| 728 | SSL_aKRB5, | ||
| 729 | SSL_IDEA, | ||
| 730 | SSL_MD5, | ||
| 731 | SSL_SSLV3, | ||
| 732 | SSL_NOT_EXP|SSL_MEDIUM, | ||
| 733 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 734 | 128, | ||
| 735 | 128, | ||
| 736 | }, | ||
| 737 | |||
| 738 | /* Cipher 26 */ | ||
| 739 | { | ||
| 740 | 1, | ||
| 741 | SSL3_TXT_KRB5_DES_40_CBC_SHA, | ||
| 742 | SSL3_CK_KRB5_DES_40_CBC_SHA, | ||
| 743 | SSL_kKRB5, | ||
| 744 | SSL_aKRB5, | ||
| 745 | SSL_DES, | ||
| 746 | SSL_SHA1, | ||
| 747 | SSL_SSLV3, | ||
| 748 | SSL_EXPORT|SSL_EXP40, | ||
| 749 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 750 | 40, | ||
| 751 | 56, | ||
| 752 | }, | ||
| 753 | |||
| 754 | /* Cipher 27 */ | ||
| 755 | { | ||
| 756 | 1, | ||
| 757 | SSL3_TXT_KRB5_RC2_40_CBC_SHA, | ||
| 758 | SSL3_CK_KRB5_RC2_40_CBC_SHA, | ||
| 759 | SSL_kKRB5, | ||
| 760 | SSL_aKRB5, | ||
| 761 | SSL_RC2, | ||
| 762 | SSL_SHA1, | ||
| 763 | SSL_SSLV3, | ||
| 764 | SSL_EXPORT|SSL_EXP40, | ||
| 765 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 766 | 40, | ||
| 767 | 128, | ||
| 768 | }, | ||
| 769 | |||
| 770 | /* Cipher 28 */ | ||
| 771 | { | ||
| 772 | 1, | ||
| 773 | SSL3_TXT_KRB5_RC4_40_SHA, | ||
| 774 | SSL3_CK_KRB5_RC4_40_SHA, | ||
| 775 | SSL_kKRB5, | ||
| 776 | SSL_aKRB5, | ||
| 777 | SSL_RC4, | ||
| 778 | SSL_SHA1, | ||
| 779 | SSL_SSLV3, | ||
| 780 | SSL_EXPORT|SSL_EXP40, | ||
| 781 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 782 | 40, | ||
| 783 | 128, | ||
| 784 | }, | ||
| 785 | |||
| 786 | /* Cipher 29 */ | ||
| 787 | { | ||
| 788 | 1, | ||
| 789 | SSL3_TXT_KRB5_DES_40_CBC_MD5, | ||
| 790 | SSL3_CK_KRB5_DES_40_CBC_MD5, | ||
| 791 | SSL_kKRB5, | ||
| 792 | SSL_aKRB5, | ||
| 793 | SSL_DES, | ||
| 794 | SSL_MD5, | ||
| 795 | SSL_SSLV3, | ||
| 796 | SSL_EXPORT|SSL_EXP40, | ||
| 797 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 798 | 40, | ||
| 799 | 56, | ||
| 800 | }, | ||
| 801 | |||
| 802 | /* Cipher 2A */ | ||
| 803 | { | ||
| 804 | 1, | ||
| 805 | SSL3_TXT_KRB5_RC2_40_CBC_MD5, | ||
| 806 | SSL3_CK_KRB5_RC2_40_CBC_MD5, | ||
| 807 | SSL_kKRB5, | ||
| 808 | SSL_aKRB5, | ||
| 809 | SSL_RC2, | ||
| 810 | SSL_MD5, | ||
| 811 | SSL_SSLV3, | ||
| 812 | SSL_EXPORT|SSL_EXP40, | ||
| 813 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 814 | 40, | ||
| 815 | 128, | ||
| 816 | }, | ||
| 817 | |||
| 818 | /* Cipher 2B */ | ||
| 819 | { | ||
| 820 | 1, | ||
| 821 | SSL3_TXT_KRB5_RC4_40_MD5, | ||
| 822 | SSL3_CK_KRB5_RC4_40_MD5, | ||
| 823 | SSL_kKRB5, | ||
| 824 | SSL_aKRB5, | ||
| 825 | SSL_RC4, | ||
| 826 | SSL_MD5, | ||
| 827 | SSL_SSLV3, | ||
| 828 | SSL_EXPORT|SSL_EXP40, | ||
| 829 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 830 | 40, | ||
| 831 | 128, | ||
| 832 | }, | ||
| 833 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 834 | 608 | ||
| 835 | /* New AES ciphersuites */ | 609 | /* New AES ciphersuites */ |
| 836 | /* Cipher 2F */ | 610 | /* Cipher 2F */ |
| @@ -2250,151 +2024,6 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] = { | |||
| 2250 | }, | 2024 | }, |
| 2251 | #endif /* OPENSSL_NO_ECDH */ | 2025 | #endif /* OPENSSL_NO_ECDH */ |
| 2252 | 2026 | ||
| 2253 | #ifndef OPENSSL_NO_SRP | ||
| 2254 | /* Cipher C01A */ | ||
| 2255 | { | ||
| 2256 | 1, | ||
| 2257 | TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA, | ||
| 2258 | TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA, | ||
| 2259 | SSL_kSRP, | ||
| 2260 | SSL_aNULL, | ||
| 2261 | SSL_3DES, | ||
| 2262 | SSL_SHA1, | ||
| 2263 | SSL_TLSV1, | ||
| 2264 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2265 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2266 | 168, | ||
| 2267 | 168, | ||
| 2268 | }, | ||
| 2269 | |||
| 2270 | /* Cipher C01B */ | ||
| 2271 | { | ||
| 2272 | 1, | ||
| 2273 | TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, | ||
| 2274 | TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, | ||
| 2275 | SSL_kSRP, | ||
| 2276 | SSL_aRSA, | ||
| 2277 | SSL_3DES, | ||
| 2278 | SSL_SHA1, | ||
| 2279 | SSL_TLSV1, | ||
| 2280 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2281 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2282 | 168, | ||
| 2283 | 168, | ||
| 2284 | }, | ||
| 2285 | |||
| 2286 | /* Cipher C01C */ | ||
| 2287 | { | ||
| 2288 | 1, | ||
| 2289 | TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, | ||
| 2290 | TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, | ||
| 2291 | SSL_kSRP, | ||
| 2292 | SSL_aDSS, | ||
| 2293 | SSL_3DES, | ||
| 2294 | SSL_SHA1, | ||
| 2295 | SSL_TLSV1, | ||
| 2296 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2297 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2298 | 168, | ||
| 2299 | 168, | ||
| 2300 | }, | ||
| 2301 | |||
| 2302 | /* Cipher C01D */ | ||
| 2303 | { | ||
| 2304 | 1, | ||
| 2305 | TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA, | ||
| 2306 | TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA, | ||
| 2307 | SSL_kSRP, | ||
| 2308 | SSL_aNULL, | ||
| 2309 | SSL_AES128, | ||
| 2310 | SSL_SHA1, | ||
| 2311 | SSL_TLSV1, | ||
| 2312 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2313 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2314 | 128, | ||
| 2315 | 128, | ||
| 2316 | }, | ||
| 2317 | |||
| 2318 | /* Cipher C01E */ | ||
| 2319 | { | ||
| 2320 | 1, | ||
| 2321 | TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, | ||
| 2322 | TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, | ||
| 2323 | SSL_kSRP, | ||
| 2324 | SSL_aRSA, | ||
| 2325 | SSL_AES128, | ||
| 2326 | SSL_SHA1, | ||
| 2327 | SSL_TLSV1, | ||
| 2328 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2329 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2330 | 128, | ||
| 2331 | 128, | ||
| 2332 | }, | ||
| 2333 | |||
| 2334 | /* Cipher C01F */ | ||
| 2335 | { | ||
| 2336 | 1, | ||
| 2337 | TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, | ||
| 2338 | TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, | ||
| 2339 | SSL_kSRP, | ||
| 2340 | SSL_aDSS, | ||
| 2341 | SSL_AES128, | ||
| 2342 | SSL_SHA1, | ||
| 2343 | SSL_TLSV1, | ||
| 2344 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2345 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2346 | 128, | ||
| 2347 | 128, | ||
| 2348 | }, | ||
| 2349 | |||
| 2350 | /* Cipher C020 */ | ||
| 2351 | { | ||
| 2352 | 1, | ||
| 2353 | TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA, | ||
| 2354 | TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA, | ||
| 2355 | SSL_kSRP, | ||
| 2356 | SSL_aNULL, | ||
| 2357 | SSL_AES256, | ||
| 2358 | SSL_SHA1, | ||
| 2359 | SSL_TLSV1, | ||
| 2360 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2361 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2362 | 256, | ||
| 2363 | 256, | ||
| 2364 | }, | ||
| 2365 | |||
| 2366 | /* Cipher C021 */ | ||
| 2367 | { | ||
| 2368 | 1, | ||
| 2369 | TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, | ||
| 2370 | TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, | ||
| 2371 | SSL_kSRP, | ||
| 2372 | SSL_aRSA, | ||
| 2373 | SSL_AES256, | ||
| 2374 | SSL_SHA1, | ||
| 2375 | SSL_TLSV1, | ||
| 2376 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2377 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2378 | 256, | ||
| 2379 | 256, | ||
| 2380 | }, | ||
| 2381 | |||
| 2382 | /* Cipher C022 */ | ||
| 2383 | { | ||
| 2384 | 1, | ||
| 2385 | TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, | ||
| 2386 | TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, | ||
| 2387 | SSL_kSRP, | ||
| 2388 | SSL_aDSS, | ||
| 2389 | SSL_AES256, | ||
| 2390 | SSL_SHA1, | ||
| 2391 | SSL_TLSV1, | ||
| 2392 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2393 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2394 | 256, | ||
| 2395 | 256, | ||
| 2396 | }, | ||
| 2397 | #endif /* OPENSSL_NO_SRP */ | ||
| 2398 | #ifndef OPENSSL_NO_ECDH | 2027 | #ifndef OPENSSL_NO_ECDH |
| 2399 | 2028 | ||
| 2400 | /* HMAC based TLS v1.2 ciphersuites from RFC5289 */ | 2029 | /* HMAC based TLS v1.2 ciphersuites from RFC5289 */ |
| @@ -2787,9 +2416,6 @@ ssl3_new(SSL *s) | |||
| 2787 | 2416 | ||
| 2788 | s->s3 = s3; | 2417 | s->s3 = s3; |
| 2789 | 2418 | ||
| 2790 | #ifndef OPENSSL_NO_SRP | ||
| 2791 | SSL_SRP_CTX_init(s); | ||
| 2792 | #endif | ||
| 2793 | s->method->ssl_clear(s); | 2419 | s->method->ssl_clear(s); |
| 2794 | return (1); | 2420 | return (1); |
| 2795 | err: | 2421 | err: |
| @@ -2832,9 +2458,6 @@ ssl3_free(SSL *s) | |||
| 2832 | } | 2458 | } |
| 2833 | if (s->s3->handshake_dgst) | 2459 | if (s->s3->handshake_dgst) |
| 2834 | ssl3_free_digest_list(s); | 2460 | ssl3_free_digest_list(s); |
| 2835 | #ifndef OPENSSL_NO_SRP | ||
| 2836 | SSL_SRP_CTX_free(s); | ||
| 2837 | #endif | ||
| 2838 | OPENSSL_cleanse(s->s3, sizeof *s->s3); | 2461 | OPENSSL_cleanse(s->s3, sizeof *s->s3); |
| 2839 | free(s->s3); | 2462 | free(s->s3); |
| 2840 | s->s3 = NULL; | 2463 | s->s3 = NULL; |
| @@ -2919,13 +2542,6 @@ ssl3_clear(SSL *s) | |||
| 2919 | #endif | 2542 | #endif |
| 2920 | } | 2543 | } |
| 2921 | 2544 | ||
| 2922 | #ifndef OPENSSL_NO_SRP | ||
| 2923 | static char * | ||
| 2924 | srp_password_from_info_cb(SSL *s, void *arg) | ||
| 2925 | { | ||
| 2926 | return BUF_strdup(s->srp_ctx.info); | ||
| 2927 | } | ||
| 2928 | #endif | ||
| 2929 | 2545 | ||
| 2930 | long | 2546 | long |
| 2931 | ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | 2547 | ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) |
| @@ -3380,40 +2996,6 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3380 | return 1; | 2996 | return 1; |
| 3381 | break; | 2997 | break; |
| 3382 | 2998 | ||
| 3383 | #ifndef OPENSSL_NO_SRP | ||
| 3384 | case SSL_CTRL_SET_TLS_EXT_SRP_USERNAME: | ||
| 3385 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3386 | if (ctx->srp_ctx.login != NULL) | ||
| 3387 | free(ctx->srp_ctx.login); | ||
| 3388 | ctx->srp_ctx.login = NULL; | ||
| 3389 | if (parg == NULL) | ||
| 3390 | break; | ||
| 3391 | if (strlen((const char *)parg) > 255 || | ||
| 3392 | strlen((const char *)parg) < 1) { | ||
| 3393 | SSLerr(SSL_F_SSL3_CTX_CTRL, | ||
| 3394 | SSL_R_INVALID_SRP_USERNAME); | ||
| 3395 | return 0; | ||
| 3396 | } | ||
| 3397 | if ((ctx->srp_ctx.login = BUF_strdup((char *)parg)) == NULL) { | ||
| 3398 | SSLerr(SSL_F_SSL3_CTX_CTRL, | ||
| 3399 | ERR_R_INTERNAL_ERROR); | ||
| 3400 | return 0; | ||
| 3401 | } | ||
| 3402 | break; | ||
| 3403 | case SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD: | ||
| 3404 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = | ||
| 3405 | srp_password_from_info_cb; | ||
| 3406 | ctx->srp_ctx.info = parg; | ||
| 3407 | break; | ||
| 3408 | case SSL_CTRL_SET_SRP_ARG: | ||
| 3409 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3410 | ctx->srp_ctx.SRP_cb_arg = parg; | ||
| 3411 | break; | ||
| 3412 | |||
| 3413 | case SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH: | ||
| 3414 | ctx->srp_ctx.strength = larg; | ||
| 3415 | break; | ||
| 3416 | #endif | ||
| 3417 | #endif /* !OPENSSL_NO_TLSEXT */ | 2999 | #endif /* !OPENSSL_NO_TLSEXT */ |
| 3418 | 3000 | ||
| 3419 | /* A Thawte special :-) */ | 3001 | /* A Thawte special :-) */ |
| @@ -3491,23 +3073,6 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 3491 | unsigned char *, EVP_CIPHER_CTX *, HMAC_CTX *, int))fp; | 3073 | unsigned char *, EVP_CIPHER_CTX *, HMAC_CTX *, int))fp; |
| 3492 | break; | 3074 | break; |
| 3493 | 3075 | ||
| 3494 | #ifndef OPENSSL_NO_SRP | ||
| 3495 | case SSL_CTRL_SET_SRP_VERIFY_PARAM_CB: | ||
| 3496 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3497 | ctx->srp_ctx.SRP_verify_param_callback = | ||
| 3498 | (int (*)(SSL *, void *))fp; | ||
| 3499 | break; | ||
| 3500 | case SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB: | ||
| 3501 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3502 | ctx->srp_ctx.TLS_ext_srp_username_callback = | ||
| 3503 | (int (*)(SSL *, int *, void *))fp; | ||
| 3504 | break; | ||
| 3505 | case SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB: | ||
| 3506 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3507 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = | ||
| 3508 | (char *(*)(SSL *, void *))fp; | ||
| 3509 | break; | ||
| 3510 | #endif | ||
| 3511 | #endif | 3076 | #endif |
| 3512 | default: | 3077 | default: |
| 3513 | return (0); | 3078 | return (0); |
| @@ -3616,10 +3181,6 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3616 | mask_a = cert->mask_a; | 3181 | mask_a = cert->mask_a; |
| 3617 | emask_k = cert->export_mask_k; | 3182 | emask_k = cert->export_mask_k; |
| 3618 | emask_a = cert->export_mask_a; | 3183 | emask_a = cert->export_mask_a; |
| 3619 | #ifndef OPENSSL_NO_SRP | ||
| 3620 | mask_k = cert->mask_k | s->srp_ctx.srp_Mask; | ||
| 3621 | emask_k = cert->export_mask_k | s->srp_ctx.srp_Mask; | ||
| 3622 | #endif | ||
| 3623 | 3184 | ||
| 3624 | #ifdef KSSL_DEBUG | 3185 | #ifdef KSSL_DEBUG |
| 3625 | /* printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms);*/ | 3186 | /* printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms);*/ |
| @@ -3628,12 +3189,6 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3628 | alg_k = c->algorithm_mkey; | 3189 | alg_k = c->algorithm_mkey; |
| 3629 | alg_a = c->algorithm_auth; | 3190 | alg_a = c->algorithm_auth; |
| 3630 | 3191 | ||
| 3631 | #ifndef OPENSSL_NO_KRB5 | ||
| 3632 | if (alg_k & SSL_kKRB5) { | ||
| 3633 | if (!kssl_keytab_is_available(s->kssl_ctx) ) | ||
| 3634 | continue; | ||
| 3635 | } | ||
| 3636 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 3637 | #ifndef OPENSSL_NO_PSK | 3192 | #ifndef OPENSSL_NO_PSK |
| 3638 | /* with PSK there must be server callback set */ | 3193 | /* with PSK there must be server callback set */ |
| 3639 | if ((alg_k & SSL_kPSK) && s->psk_server_callback == NULL) | 3194 | if ((alg_k & SSL_kPSK) && s->psk_server_callback == NULL) |
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c index 6d8ccd66b7..081aebf1f5 100644 --- a/src/lib/libssl/s3_srvr.c +++ b/src/lib/libssl/s3_srvr.c | |||
| @@ -164,9 +164,6 @@ | |||
| 164 | #include <openssl/dh.h> | 164 | #include <openssl/dh.h> |
| 165 | #endif | 165 | #endif |
| 166 | #include <openssl/bn.h> | 166 | #include <openssl/bn.h> |
| 167 | #ifndef OPENSSL_NO_KRB5 | ||
| 168 | #include <openssl/krb5_asn.h> | ||
| 169 | #endif | ||
| 170 | #include <openssl/md5.h> | 167 | #include <openssl/md5.h> |
| 171 | 168 | ||
| 172 | static const SSL_METHOD *ssl3_get_server_method(int ver); | 169 | static const SSL_METHOD *ssl3_get_server_method(int ver); |
| @@ -179,30 +176,6 @@ ssl3_get_server_method(int ver) | |||
| 179 | return (NULL); | 176 | return (NULL); |
| 180 | } | 177 | } |
| 181 | 178 | ||
| 182 | #ifndef OPENSSL_NO_SRP | ||
| 183 | static int | ||
| 184 | ssl_check_srp_ext_ClientHello(SSL *s, int *al) | ||
| 185 | { | ||
| 186 | int ret = SSL_ERROR_NONE; | ||
| 187 | |||
| 188 | *al = SSL_AD_UNRECOGNIZED_NAME; | ||
| 189 | |||
| 190 | if ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) && | ||
| 191 | (s->srp_ctx.TLS_ext_srp_username_callback != NULL)) { | ||
| 192 | if (s->srp_ctx.login == NULL) { | ||
| 193 | /* | ||
| 194 | * RFC 5054 says SHOULD reject, | ||
| 195 | * we do so if There is no srp login name | ||
| 196 | */ | ||
| 197 | ret = SSL3_AL_FATAL; | ||
| 198 | *al = SSL_AD_UNKNOWN_PSK_IDENTITY; | ||
| 199 | } else { | ||
| 200 | ret = SSL_srp_server_param_with_username(s, al); | ||
| 201 | } | ||
| 202 | } | ||
| 203 | return (ret); | ||
| 204 | } | ||
| 205 | #endif | ||
| 206 | 179 | ||
| 207 | IMPLEMENT_ssl3_meth_func(SSLv3_server_method, | 180 | IMPLEMENT_ssl3_meth_func(SSLv3_server_method, |
| 208 | ssl3_accept, ssl_undefined_function, ssl3_get_server_method) | 181 | ssl3_accept, ssl_undefined_function, ssl3_get_server_method) |
| @@ -342,39 +315,6 @@ ssl3_accept(SSL *s) | |||
| 342 | if (ret <= 0) | 315 | if (ret <= 0) |
| 343 | goto end; | 316 | goto end; |
| 344 | } | 317 | } |
| 345 | #ifndef OPENSSL_NO_SRP | ||
| 346 | { | ||
| 347 | int al; | ||
| 348 | if ((ret = | ||
| 349 | ssl_check_srp_ext_ClientHello(s, &al)) | ||
| 350 | < 0) { | ||
| 351 | /* | ||
| 352 | * Callback indicates further work to | ||
| 353 | * be done. | ||
| 354 | */ | ||
| 355 | s->rwstate = SSL_X509_LOOKUP; | ||
| 356 | goto end; | ||
| 357 | } | ||
| 358 | if (ret != SSL_ERROR_NONE) { | ||
| 359 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
| 360 | |||
| 361 | /* | ||
| 362 | * This is not really an error but the | ||
| 363 | * only means for a client to detect | ||
| 364 | * whether srp is supported. | ||
| 365 | */ | ||
| 366 | if (al != TLS1_AD_UNKNOWN_PSK_IDENTITY) | ||
| 367 | SSLerr(SSL_F_SSL3_ACCEPT, | ||
| 368 | SSL_R_CLIENTHELLO_TLSEXT); | ||
| 369 | |||
| 370 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | ||
| 371 | |||
| 372 | ret = -1; | ||
| 373 | goto end; | ||
| 374 | |||
| 375 | } | ||
| 376 | } | ||
| 377 | #endif | ||
| 378 | 318 | ||
| 379 | s->renegotiate = 2; | 319 | s->renegotiate = 2; |
| 380 | s->state = SSL3_ST_SW_SRVR_HELLO_A; | 320 | s->state = SSL3_ST_SW_SRVR_HELLO_A; |
| @@ -441,9 +381,6 @@ ssl3_accept(SSL *s) | |||
| 441 | * send_server_key_exchange. | 381 | * send_server_key_exchange. |
| 442 | */ | 382 | */ |
| 443 | if ((s->options & SSL_OP_EPHEMERAL_RSA) | 383 | if ((s->options & SSL_OP_EPHEMERAL_RSA) |
| 444 | #ifndef OPENSSL_NO_KRB5 | ||
| 445 | && !(alg_k & SSL_kKRB5) | ||
| 446 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 447 | ) | 384 | ) |
| 448 | /* | 385 | /* |
| 449 | * option SSL_OP_EPHEMERAL_RSA sends temporary | 386 | * option SSL_OP_EPHEMERAL_RSA sends temporary |
| @@ -473,10 +410,6 @@ ssl3_accept(SSL *s) | |||
| 473 | #ifndef OPENSSL_NO_PSK | 410 | #ifndef OPENSSL_NO_PSK |
| 474 | || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint) | 411 | || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint) |
| 475 | #endif | 412 | #endif |
| 476 | #ifndef OPENSSL_NO_SRP | ||
| 477 | /* SRP: send ServerKeyExchange */ | ||
| 478 | || (alg_k & SSL_kSRP) | ||
| 479 | #endif | ||
| 480 | || (alg_k & (SSL_kDHr|SSL_kDHd|SSL_kEDH)) | 413 | || (alg_k & (SSL_kDHr|SSL_kDHd|SSL_kEDH)) |
| 481 | || (alg_k & SSL_kEECDH) | 414 | || (alg_k & SSL_kEECDH) |
| 482 | || ((alg_k & SSL_kRSA) | 415 | || ((alg_k & SSL_kRSA) |
| @@ -1796,20 +1729,6 @@ ssl3_send_server_key_exchange(SSL *s) | |||
| 1796 | n += 2 + pskhintlen; | 1729 | n += 2 + pskhintlen; |
| 1797 | } else | 1730 | } else |
| 1798 | #endif /* !OPENSSL_NO_PSK */ | 1731 | #endif /* !OPENSSL_NO_PSK */ |
| 1799 | #ifndef OPENSSL_NO_SRP | ||
| 1800 | if (type & SSL_kSRP) { | ||
| 1801 | if ((s->srp_ctx.N == NULL) || (s->srp_ctx.g == NULL) || | ||
| 1802 | (s->srp_ctx.s == NULL) || (s->srp_ctx.B == NULL)) { | ||
| 1803 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, | ||
| 1804 | SSL_R_MISSING_SRP_PARAM); | ||
| 1805 | goto err; | ||
| 1806 | } | ||
| 1807 | r[0] = s->srp_ctx.N; | ||
| 1808 | r[1] = s->srp_ctx.g; | ||
| 1809 | r[2] = s->srp_ctx.s; | ||
| 1810 | r[3] = s->srp_ctx.B; | ||
| 1811 | } else | ||
| 1812 | #endif | ||
| 1813 | { | 1732 | { |
| 1814 | al = SSL_AD_HANDSHAKE_FAILURE; | 1733 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 1815 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, | 1734 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, |
| @@ -1818,11 +1737,6 @@ ssl3_send_server_key_exchange(SSL *s) | |||
| 1818 | } | 1737 | } |
| 1819 | for (i = 0; i < 4 && r[i] != NULL; i++) { | 1738 | for (i = 0; i < 4 && r[i] != NULL; i++) { |
| 1820 | nr[i] = BN_num_bytes(r[i]); | 1739 | nr[i] = BN_num_bytes(r[i]); |
| 1821 | #ifndef OPENSSL_NO_SRP | ||
| 1822 | if ((i == 2) && (type & SSL_kSRP)) | ||
| 1823 | n += 1 + nr[i]; | ||
| 1824 | else | ||
| 1825 | #endif | ||
| 1826 | n += 2 + nr[i]; | 1740 | n += 2 + nr[i]; |
| 1827 | } | 1741 | } |
| 1828 | 1742 | ||
| @@ -1848,12 +1762,6 @@ ssl3_send_server_key_exchange(SSL *s) | |||
| 1848 | p = &(d[4]); | 1762 | p = &(d[4]); |
| 1849 | 1763 | ||
| 1850 | for (i = 0; i < 4 && r[i] != NULL; i++) { | 1764 | for (i = 0; i < 4 && r[i] != NULL; i++) { |
| 1851 | #ifndef OPENSSL_NO_SRP | ||
| 1852 | if ((i == 2) && (type & SSL_kSRP)) { | ||
| 1853 | *p = nr[i]; | ||
| 1854 | p++; | ||
| 1855 | } else | ||
| 1856 | #endif | ||
| 1857 | s2n(nr[i], p); | 1765 | s2n(nr[i], p); |
| 1858 | BN_bn2bin(r[i], p); | 1766 | BN_bn2bin(r[i], p); |
| 1859 | p += nr[i]; | 1767 | p += nr[i]; |
| @@ -2112,9 +2020,6 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 2112 | BIGNUM *pub = NULL; | 2020 | BIGNUM *pub = NULL; |
| 2113 | DH *dh_srvr; | 2021 | DH *dh_srvr; |
| 2114 | #endif | 2022 | #endif |
| 2115 | #ifndef OPENSSL_NO_KRB5 | ||
| 2116 | KSSL_ERR kssl_err; | ||
| 2117 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 2118 | 2023 | ||
| 2119 | #ifndef OPENSSL_NO_ECDH | 2024 | #ifndef OPENSSL_NO_ECDH |
| 2120 | EC_KEY *srvr_ecdh = NULL; | 2025 | EC_KEY *srvr_ecdh = NULL; |
| @@ -2299,191 +2204,6 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 2299 | OPENSSL_cleanse(p, i); | 2204 | OPENSSL_cleanse(p, i); |
| 2300 | } else | 2205 | } else |
| 2301 | #endif | 2206 | #endif |
| 2302 | #ifndef OPENSSL_NO_KRB5 | ||
| 2303 | if (alg_k & SSL_kKRB5) { | ||
| 2304 | krb5_error_code krb5rc; | ||
| 2305 | krb5_data enc_ticket; | ||
| 2306 | krb5_data authenticator; | ||
| 2307 | krb5_data enc_pms; | ||
| 2308 | KSSL_CTX *kssl_ctx = s->kssl_ctx; | ||
| 2309 | EVP_CIPHER_CTX ciph_ctx; | ||
| 2310 | const EVP_CIPHER *enc = NULL; | ||
| 2311 | unsigned char iv[EVP_MAX_IV_LENGTH]; | ||
| 2312 | unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH | ||
| 2313 | + EVP_MAX_BLOCK_LENGTH]; | ||
| 2314 | int padl, outl; | ||
| 2315 | krb5_timestamp authtime = 0; | ||
| 2316 | krb5_ticket_times ttimes; | ||
| 2317 | |||
| 2318 | EVP_CIPHER_CTX_init(&ciph_ctx); | ||
| 2319 | |||
| 2320 | if (!kssl_ctx) | ||
| 2321 | kssl_ctx = kssl_ctx_new(); | ||
| 2322 | |||
| 2323 | n2s(p, i); | ||
| 2324 | enc_ticket.length = i; | ||
| 2325 | |||
| 2326 | if (n < (long)(enc_ticket.length + 6)) { | ||
| 2327 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2328 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2329 | goto err; | ||
| 2330 | } | ||
| 2331 | |||
| 2332 | enc_ticket.data = (char *)p; | ||
| 2333 | p += enc_ticket.length; | ||
| 2334 | |||
| 2335 | n2s(p, i); | ||
| 2336 | authenticator.length = i; | ||
| 2337 | |||
| 2338 | if (n < (long)(enc_ticket.length + authenticator.length + 6)) { | ||
| 2339 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2340 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2341 | goto err; | ||
| 2342 | } | ||
| 2343 | |||
| 2344 | authenticator.data = (char *)p; | ||
| 2345 | p += authenticator.length; | ||
| 2346 | |||
| 2347 | n2s(p, i); | ||
| 2348 | enc_pms.length = i; | ||
| 2349 | enc_pms.data = (char *)p; | ||
| 2350 | p += enc_pms.length; | ||
| 2351 | |||
| 2352 | /* | ||
| 2353 | * Note that the length is checked again below, | ||
| 2354 | * after decryption | ||
| 2355 | */ | ||
| 2356 | if (enc_pms.length > sizeof pms) { | ||
| 2357 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2358 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2359 | goto err; | ||
| 2360 | } | ||
| 2361 | |||
| 2362 | if (n != (long)(enc_ticket.length + authenticator.length + | ||
| 2363 | enc_pms.length + 6)) { | ||
| 2364 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2365 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2366 | goto err; | ||
| 2367 | } | ||
| 2368 | |||
| 2369 | if ((krb5rc = kssl_sget_tkt(kssl_ctx, &enc_ticket, &ttimes, | ||
| 2370 | &kssl_err)) != 0) { | ||
| 2371 | #ifdef KSSL_DEBUG | ||
| 2372 | printf("kssl_sget_tkt rtn %d [%d]\n", | ||
| 2373 | krb5rc, kssl_err.reason); | ||
| 2374 | if (kssl_err.text) | ||
| 2375 | printf("kssl_err text= %s\n", kssl_err.text); | ||
| 2376 | #endif /* KSSL_DEBUG */ | ||
| 2377 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2378 | kssl_err.reason); | ||
| 2379 | goto err; | ||
| 2380 | } | ||
| 2381 | |||
| 2382 | /* Note: no authenticator is not considered an error, | ||
| 2383 | ** but will return authtime == 0. | ||
| 2384 | */ | ||
| 2385 | if ((krb5rc = kssl_check_authent(kssl_ctx, &authenticator, | ||
| 2386 | &authtime, &kssl_err)) != 0) { | ||
| 2387 | #ifdef KSSL_DEBUG | ||
| 2388 | printf("kssl_check_authent rtn %d [%d]\n", | ||
| 2389 | krb5rc, kssl_err.reason); | ||
| 2390 | if (kssl_err.text) | ||
| 2391 | printf("kssl_err text= %s\n", kssl_err.text); | ||
| 2392 | #endif /* KSSL_DEBUG */ | ||
| 2393 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2394 | kssl_err.reason); | ||
| 2395 | goto err; | ||
| 2396 | } | ||
| 2397 | |||
| 2398 | if ((krb5rc = kssl_validate_times(authtime, &ttimes)) != 0) { | ||
| 2399 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2400 | krb5rc); | ||
| 2401 | goto err; | ||
| 2402 | } | ||
| 2403 | |||
| 2404 | #ifdef KSSL_DEBUG | ||
| 2405 | kssl_ctx_show(kssl_ctx); | ||
| 2406 | #endif /* KSSL_DEBUG */ | ||
| 2407 | |||
| 2408 | enc = kssl_map_enc(kssl_ctx->enctype); | ||
| 2409 | if (enc == NULL) | ||
| 2410 | goto err; | ||
| 2411 | |||
| 2412 | memset(iv, 0, sizeof iv); /* per RFC 1510 */ | ||
| 2413 | |||
| 2414 | if (!EVP_DecryptInit_ex(&ciph_ctx, enc, NULL, | ||
| 2415 | kssl_ctx->key, iv)) { | ||
| 2416 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2417 | SSL_R_DECRYPTION_FAILED); | ||
| 2418 | goto err; | ||
| 2419 | } | ||
| 2420 | if (!EVP_DecryptUpdate(&ciph_ctx, pms, &outl, | ||
| 2421 | (unsigned char *)enc_pms.data, enc_pms.length)) { | ||
| 2422 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2423 | SSL_R_DECRYPTION_FAILED); | ||
| 2424 | goto err; | ||
| 2425 | } | ||
| 2426 | if (outl > SSL_MAX_MASTER_KEY_LENGTH) { | ||
| 2427 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2428 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2429 | goto err; | ||
| 2430 | } | ||
| 2431 | if (!EVP_DecryptFinal_ex(&ciph_ctx, &(pms[outl]), &padl)) { | ||
| 2432 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2433 | SSL_R_DECRYPTION_FAILED); | ||
| 2434 | goto err; | ||
| 2435 | } | ||
| 2436 | outl += padl; | ||
| 2437 | if (outl > SSL_MAX_MASTER_KEY_LENGTH) { | ||
| 2438 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2439 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2440 | goto err; | ||
| 2441 | } | ||
| 2442 | if (!((pms[0] == (s->client_version >> 8)) && (pms[1] == (s->client_version & 0xff)))) { | ||
| 2443 | /* | ||
| 2444 | * The premaster secret must contain the same version | ||
| 2445 | * number as the ClientHello to detect version rollback | ||
| 2446 | * attacks (strangely, the protocol does not offer such | ||
| 2447 | * protection for DH ciphersuites). | ||
| 2448 | * However, buggy clients exist that send random bytes | ||
| 2449 | * instead of the protocol version. | ||
| 2450 | * | ||
| 2451 | * If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such | ||
| 2452 | * clients. | ||
| 2453 | * (Perhaps we should have a separate BUG value for | ||
| 2454 | * the Kerberos cipher) | ||
| 2455 | */ | ||
| 2456 | if (!(s->options & SSL_OP_TLS_ROLLBACK_BUG)) { | ||
| 2457 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2458 | SSL_AD_DECODE_ERROR); | ||
| 2459 | goto err; | ||
| 2460 | } | ||
| 2461 | } | ||
| 2462 | |||
| 2463 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
| 2464 | |||
| 2465 | s->session->master_key_length = | ||
| 2466 | s->method->ssl3_enc->generate_master_secret(s, | ||
| 2467 | s->session->master_key, pms, outl); | ||
| 2468 | |||
| 2469 | if (kssl_ctx->client_princ) { | ||
| 2470 | size_t len = strlen(kssl_ctx->client_princ); | ||
| 2471 | if (len < SSL_MAX_KRB5_PRINCIPAL_LENGTH ) { | ||
| 2472 | s->session->krb5_client_princ_len = len; | ||
| 2473 | memcpy(s->session->krb5_client_princ, | ||
| 2474 | kssl_ctx->client_princ, len); | ||
| 2475 | } | ||
| 2476 | } | ||
| 2477 | |||
| 2478 | |||
| 2479 | /* | ||
| 2480 | * Was doing kssl_ctx_free() here, but it caused problems for | ||
| 2481 | * apache. | ||
| 2482 | * kssl_ctx = kssl_ctx_free(kssl_ctx); | ||
| 2483 | * if (s->kssl_ctx) s->kssl_ctx = NULL; | ||
| 2484 | */ | ||
| 2485 | } else | ||
| 2486 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 2487 | 2207 | ||
| 2488 | #ifndef OPENSSL_NO_ECDH | 2208 | #ifndef OPENSSL_NO_ECDH |
| 2489 | if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) { | 2209 | if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) { |
| @@ -2717,43 +2437,6 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 2717 | goto f_err; | 2437 | goto f_err; |
| 2718 | } else | 2438 | } else |
| 2719 | #endif | 2439 | #endif |
| 2720 | #ifndef OPENSSL_NO_SRP | ||
| 2721 | if (alg_k & SSL_kSRP) { | ||
| 2722 | int param_len; | ||
| 2723 | |||
| 2724 | n2s(p, i); | ||
| 2725 | param_len = i + 2; | ||
| 2726 | if (param_len > n) { | ||
| 2727 | al = SSL_AD_DECODE_ERROR; | ||
| 2728 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2729 | SSL_R_BAD_SRP_A_LENGTH); | ||
| 2730 | goto f_err; | ||
| 2731 | } | ||
| 2732 | if (!(s->srp_ctx.A = BN_bin2bn(p, i, NULL))) { | ||
| 2733 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2734 | ERR_R_BN_LIB); | ||
| 2735 | goto err; | ||
| 2736 | } | ||
| 2737 | if (s->session->srp_username != NULL) | ||
| 2738 | free(s->session->srp_username); | ||
| 2739 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); | ||
| 2740 | if (s->session->srp_username == NULL) { | ||
| 2741 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2742 | ERR_R_MALLOC_FAILURE); | ||
| 2743 | goto err; | ||
| 2744 | } | ||
| 2745 | |||
| 2746 | if ((s->session->master_key_length = | ||
| 2747 | SRP_generate_server_master_secret(s, | ||
| 2748 | s->session->master_key)) < 0) { | ||
| 2749 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2750 | ERR_R_INTERNAL_ERROR); | ||
| 2751 | goto err; | ||
| 2752 | } | ||
| 2753 | |||
| 2754 | p += i; | ||
| 2755 | } else | ||
| 2756 | #endif /* OPENSSL_NO_SRP */ | ||
| 2757 | if (alg_k & SSL_kGOST) { | 2440 | if (alg_k & SSL_kGOST) { |
| 2758 | int ret = 0; | 2441 | int ret = 0; |
| 2759 | EVP_PKEY_CTX *pkey_ctx; | 2442 | EVP_PKEY_CTX *pkey_ctx; |
diff --git a/src/lib/libssl/src/ssl/d1_clnt.c b/src/lib/libssl/src/ssl/d1_clnt.c index 38118b1385..8967879f70 100644 --- a/src/lib/libssl/src/ssl/d1_clnt.c +++ b/src/lib/libssl/src/ssl/d1_clnt.c | |||
| @@ -115,9 +115,6 @@ | |||
| 115 | 115 | ||
| 116 | #include <stdio.h> | 116 | #include <stdio.h> |
| 117 | #include "ssl_locl.h" | 117 | #include "ssl_locl.h" |
| 118 | #ifndef OPENSSL_NO_KRB5 | ||
| 119 | #include "kssl_lcl.h" | ||
| 120 | #endif | ||
| 121 | #include <openssl/buffer.h> | 118 | #include <openssl/buffer.h> |
| 122 | #include <openssl/rand.h> | 119 | #include <openssl/rand.h> |
| 123 | #include <openssl/objects.h> | 120 | #include <openssl/objects.h> |
| @@ -926,9 +923,6 @@ dtls1_send_client_key_exchange(SSL *s) | |||
| 926 | unsigned long alg_k; | 923 | unsigned long alg_k; |
| 927 | unsigned char *q; | 924 | unsigned char *q; |
| 928 | EVP_PKEY *pkey = NULL; | 925 | EVP_PKEY *pkey = NULL; |
| 929 | #ifndef OPENSSL_NO_KRB5 | ||
| 930 | KSSL_ERR kssl_err; | ||
| 931 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 932 | #ifndef OPENSSL_NO_ECDH | 926 | #ifndef OPENSSL_NO_ECDH |
| 933 | EC_KEY *clnt_ecdh = NULL; | 927 | EC_KEY *clnt_ecdh = NULL; |
| 934 | const EC_POINT *srvr_ecpoint = NULL; | 928 | const EC_POINT *srvr_ecpoint = NULL; |
| @@ -992,134 +986,6 @@ dtls1_send_client_key_exchange(SSL *s) | |||
| 992 | tmp_buf, sizeof tmp_buf); | 986 | tmp_buf, sizeof tmp_buf); |
| 993 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); | 987 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); |
| 994 | } | 988 | } |
| 995 | #ifndef OPENSSL_NO_KRB5 | ||
| 996 | else if (alg_k & SSL_kKRB5) { | ||
| 997 | krb5_error_code krb5rc; | ||
| 998 | KSSL_CTX *kssl_ctx = s->kssl_ctx; | ||
| 999 | /* krb5_data krb5_ap_req; */ | ||
| 1000 | krb5_data *enc_ticket; | ||
| 1001 | krb5_data authenticator, *authp = NULL; | ||
| 1002 | EVP_CIPHER_CTX ciph_ctx; | ||
| 1003 | const EVP_CIPHER *enc = NULL; | ||
| 1004 | unsigned char iv[EVP_MAX_IV_LENGTH]; | ||
| 1005 | unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; | ||
| 1006 | unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH | ||
| 1007 | + EVP_MAX_IV_LENGTH]; | ||
| 1008 | int padl, outl = sizeof(epms); | ||
| 1009 | |||
| 1010 | EVP_CIPHER_CTX_init(&ciph_ctx); | ||
| 1011 | |||
| 1012 | #ifdef KSSL_DEBUG | ||
| 1013 | printf("ssl3_send_client_key_exchange(%lx & %lx)\n", | ||
| 1014 | alg_k, SSL_kKRB5); | ||
| 1015 | #endif /* KSSL_DEBUG */ | ||
| 1016 | |||
| 1017 | authp = NULL; | ||
| 1018 | #ifdef KRB5SENDAUTH | ||
| 1019 | if (KRB5SENDAUTH) | ||
| 1020 | authp = &authenticator; | ||
| 1021 | #endif /* KRB5SENDAUTH */ | ||
| 1022 | |||
| 1023 | krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp, | ||
| 1024 | &kssl_err); | ||
| 1025 | enc = kssl_map_enc(kssl_ctx->enctype); | ||
| 1026 | if (enc == NULL) | ||
| 1027 | goto err; | ||
| 1028 | #ifdef KSSL_DEBUG | ||
| 1029 | { | ||
| 1030 | printf("kssl_cget_tkt rtn %d\n", krb5rc); | ||
| 1031 | if (krb5rc && kssl_err.text) | ||
| 1032 | printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text); | ||
| 1033 | } | ||
| 1034 | #endif /* KSSL_DEBUG */ | ||
| 1035 | |||
| 1036 | if (krb5rc) { | ||
| 1037 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 1038 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 1039 | SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, | ||
| 1040 | kssl_err.reason); | ||
| 1041 | goto err; | ||
| 1042 | } | ||
| 1043 | |||
| 1044 | /* 20010406 VRS - Earlier versions used KRB5 AP_REQ | ||
| 1045 | ** in place of RFC 2712 KerberosWrapper, as in: | ||
| 1046 | ** | ||
| 1047 | ** Send ticket (copy to *p, set n = length) | ||
| 1048 | ** n = krb5_ap_req.length; | ||
| 1049 | ** memcpy(p, krb5_ap_req.data, krb5_ap_req.length); | ||
| 1050 | ** if (krb5_ap_req.data) | ||
| 1051 | ** kssl_krb5_free_data_contents(NULL,&krb5_ap_req); | ||
| 1052 | ** | ||
| 1053 | ** Now using real RFC 2712 KerberosWrapper | ||
| 1054 | ** (Thanks to Simon Wilkinson <sxw@sxw.org.uk>) | ||
| 1055 | ** Note: 2712 "opaque" types are here replaced | ||
| 1056 | ** with a 2-byte length followed by the value. | ||
| 1057 | ** Example: | ||
| 1058 | ** KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms | ||
| 1059 | ** Where "xx xx" = length bytes. Shown here with | ||
| 1060 | ** optional authenticator omitted. | ||
| 1061 | */ | ||
| 1062 | |||
| 1063 | /* KerberosWrapper.Ticket */ | ||
| 1064 | s2n(enc_ticket->length, p); | ||
| 1065 | memcpy(p, enc_ticket->data, enc_ticket->length); | ||
| 1066 | p += enc_ticket->length; | ||
| 1067 | n = enc_ticket->length + 2; | ||
| 1068 | |||
| 1069 | /* KerberosWrapper.Authenticator */ | ||
| 1070 | if (authp && authp->length) { | ||
| 1071 | s2n(authp->length, p); | ||
| 1072 | memcpy(p, authp->data, authp->length); | ||
| 1073 | p += authp->length; | ||
| 1074 | n += authp->length + 2; | ||
| 1075 | |||
| 1076 | free(authp->data); | ||
| 1077 | authp->data = NULL; | ||
| 1078 | authp->length = 0; | ||
| 1079 | } else { | ||
| 1080 | s2n(0, p);/* null authenticator length */ | ||
| 1081 | n += 2; | ||
| 1082 | } | ||
| 1083 | |||
| 1084 | if (RAND_bytes(tmp_buf, sizeof tmp_buf) <= 0) | ||
| 1085 | goto err; | ||
| 1086 | |||
| 1087 | /* 20010420 VRS. Tried it this way; failed. | ||
| 1088 | ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); | ||
| 1089 | ** EVP_CIPHER_CTX_set_key_length(&ciph_ctx, | ||
| 1090 | ** kssl_ctx->length); | ||
| 1091 | ** EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv); | ||
| 1092 | */ | ||
| 1093 | |||
| 1094 | memset(iv, 0, sizeof iv); | ||
| 1095 | /* per RFC 1510 */ | ||
| 1096 | EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, | ||
| 1097 | kssl_ctx->key, iv); | ||
| 1098 | EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf, | ||
| 1099 | sizeof tmp_buf); | ||
| 1100 | EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl); | ||
| 1101 | outl += padl; | ||
| 1102 | if (outl > (int)sizeof epms) { | ||
| 1103 | SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | ||
| 1104 | goto err; | ||
| 1105 | } | ||
| 1106 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
| 1107 | |||
| 1108 | /* KerberosWrapper.EncryptedPreMasterSecret */ | ||
| 1109 | s2n(outl, p); | ||
| 1110 | memcpy(p, epms, outl); | ||
| 1111 | p += outl; | ||
| 1112 | n += outl + 2; | ||
| 1113 | |||
| 1114 | s->session->master_key_length = | ||
| 1115 | s->method->ssl3_enc->generate_master_secret(s, | ||
| 1116 | s->session->master_key, | ||
| 1117 | tmp_buf, sizeof tmp_buf); | ||
| 1118 | |||
| 1119 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); | ||
| 1120 | OPENSSL_cleanse(epms, outl); | ||
| 1121 | } | ||
| 1122 | #endif | ||
| 1123 | #ifndef OPENSSL_NO_DH | 989 | #ifndef OPENSSL_NO_DH |
| 1124 | else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { | 990 | else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { |
| 1125 | DH *dh_srvr, *dh_clnt; | 991 | DH *dh_srvr, *dh_clnt; |
diff --git a/src/lib/libssl/src/ssl/d1_srvr.c b/src/lib/libssl/src/ssl/d1_srvr.c index 9995278a26..6183815a6d 100644 --- a/src/lib/libssl/src/ssl/d1_srvr.c +++ b/src/lib/libssl/src/ssl/d1_srvr.c | |||
| @@ -429,9 +429,6 @@ dtls1_accept(SSL *s) | |||
| 429 | /* clear this, it may get reset by | 429 | /* clear this, it may get reset by |
| 430 | * send_server_key_exchange */ | 430 | * send_server_key_exchange */ |
| 431 | if ((s->options & SSL_OP_EPHEMERAL_RSA) | 431 | if ((s->options & SSL_OP_EPHEMERAL_RSA) |
| 432 | #ifndef OPENSSL_NO_KRB5 | ||
| 433 | && !(alg_k & SSL_kKRB5) | ||
| 434 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 435 | ) | 432 | ) |
| 436 | /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key | 433 | /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key |
| 437 | * even when forbidden by protocol specs | 434 | * even when forbidden by protocol specs |
diff --git a/src/lib/libssl/src/ssl/kssl.c b/src/lib/libssl/src/ssl/kssl.c deleted file mode 100644 index b04c83e17f..0000000000 --- a/src/lib/libssl/src/ssl/kssl.c +++ /dev/null | |||
| @@ -1,1549 +0,0 @@ | |||
| 1 | /* ssl/kssl.c -*- mode: C; c-file-style: "eay" -*- */ | ||
| 2 | /* Written by Vern Staats <staatsvr@asc.hpc.mil> for the OpenSSL project 2000. | ||
| 3 | */ | ||
| 4 | /* ==================================================================== | ||
| 5 | * Copyright (c) 2000 The OpenSSL Project. All rights reserved. | ||
| 6 | * | ||
| 7 | * Redistribution and use in source and binary forms, with or without | ||
| 8 | * modification, are permitted provided that the following conditions | ||
| 9 | * are met: | ||
| 10 | * | ||
| 11 | * 1. Redistributions of source code must retain the above copyright | ||
| 12 | * notice, this list of conditions and the following disclaimer. | ||
| 13 | * | ||
| 14 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 15 | * notice, this list of conditions and the following disclaimer in | ||
| 16 | * the documentation and/or other materials provided with the | ||
| 17 | * distribution. | ||
| 18 | * | ||
| 19 | * 3. All advertising materials mentioning features or use of this | ||
| 20 | * software must display the following acknowledgment: | ||
| 21 | * "This product includes software developed by the OpenSSL Project | ||
| 22 | * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | ||
| 23 | * | ||
| 24 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
| 25 | * endorse or promote products derived from this software without | ||
| 26 | * prior written permission. For written permission, please contact | ||
| 27 | * licensing@OpenSSL.org. | ||
| 28 | * | ||
| 29 | * 5. Products derived from this software may not be called "OpenSSL" | ||
| 30 | * nor may "OpenSSL" appear in their names without prior written | ||
| 31 | * permission of the OpenSSL Project. | ||
| 32 | * | ||
| 33 | * 6. Redistributions of any form whatsoever must retain the following | ||
| 34 | * acknowledgment: | ||
| 35 | * "This product includes software developed by the OpenSSL Project | ||
| 36 | * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | ||
| 37 | * | ||
| 38 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
| 39 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 40 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
| 41 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
| 42 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 43 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 44 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 45 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 46 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 47 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 48 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 49 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 50 | * ==================================================================== | ||
| 51 | * | ||
| 52 | * This product includes cryptographic software written by Eric Young | ||
| 53 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 54 | * Hudson (tjh@cryptsoft.com). | ||
| 55 | * | ||
| 56 | */ | ||
| 57 | |||
| 58 | |||
| 59 | /* ssl/kssl.c -- Routines to support (& debug) Kerberos5 auth for openssl | ||
| 60 | ** | ||
| 61 | ** 19990701 VRS Started. | ||
| 62 | ** 200011?? Jeffrey Altman, Richard Levitte | ||
| 63 | ** Generalized for Heimdal, Newer MIT, & Win32. | ||
| 64 | ** Integrated into main OpenSSL 0.9.7 snapshots. | ||
| 65 | ** 20010413 Simon Wilkinson, VRS | ||
| 66 | ** Real RFC2712 KerberosWrapper replaces AP_REQ. | ||
| 67 | */ | ||
| 68 | |||
| 69 | #include <openssl/opensslconf.h> | ||
| 70 | |||
| 71 | #include <string.h> | ||
| 72 | |||
| 73 | #define KRB5_PRIVATE 1 | ||
| 74 | |||
| 75 | #include <openssl/ssl.h> | ||
| 76 | #include <openssl/evp.h> | ||
| 77 | #include <openssl/objects.h> | ||
| 78 | #include <openssl/krb5_asn.h> | ||
| 79 | #include "kssl_lcl.h" | ||
| 80 | |||
| 81 | #ifndef OPENSSL_NO_KRB5 | ||
| 82 | |||
| 83 | #ifndef ENOMEM | ||
| 84 | #define ENOMEM KRB5KRB_ERR_GENERIC | ||
| 85 | #endif | ||
| 86 | |||
| 87 | char * | ||
| 88 | kstring(char *string) | ||
| 89 | { | ||
| 90 | static char *null = "[NULL]"; | ||
| 91 | |||
| 92 | return ((string == NULL) ? null : string); | ||
| 93 | } | ||
| 94 | |||
| 95 | /* Given KRB5 enctype (basically DES or 3DES), | ||
| 96 | ** return closest match openssl EVP_ encryption algorithm. | ||
| 97 | ** Return NULL for unknown or problematic (krb5_dk_encrypt) enctypes. | ||
| 98 | ** Assume ENCTYPE_*_RAW (krb5_raw_encrypt) are OK. | ||
| 99 | */ | ||
| 100 | const EVP_CIPHER * | ||
| 101 | kssl_map_enc(krb5_enctype enctype) | ||
| 102 | { | ||
| 103 | switch (enctype) { | ||
| 104 | case ENCTYPE_DES_HMAC_SHA1: /* EVP_des_cbc(); */ | ||
| 105 | case ENCTYPE_DES_CBC_CRC: | ||
| 106 | case ENCTYPE_DES_CBC_MD4: | ||
| 107 | case ENCTYPE_DES_CBC_MD5: | ||
| 108 | case ENCTYPE_DES_CBC_RAW: | ||
| 109 | return EVP_des_cbc(); | ||
| 110 | break; | ||
| 111 | case ENCTYPE_DES3_CBC_SHA1: /* EVP_des_ede3_cbc(); */ | ||
| 112 | case ENCTYPE_DES3_CBC_SHA: | ||
| 113 | case ENCTYPE_DES3_CBC_RAW: | ||
| 114 | return EVP_des_ede3_cbc(); | ||
| 115 | break; | ||
| 116 | default: | ||
| 117 | return NULL; | ||
| 118 | break; | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | |||
| 123 | /* Return true:1 if p "looks like" the start of the real authenticator | ||
| 124 | ** described in kssl_skip_confound() below. The ASN.1 pattern is | ||
| 125 | ** "62 xx 30 yy" (APPLICATION-2, SEQUENCE), where xx-yy =~ 2, and | ||
| 126 | ** xx and yy are possibly multi-byte length fields. | ||
| 127 | */ | ||
| 128 | static int | ||
| 129 | kssl_test_confound(unsigned char *p) | ||
| 130 | { | ||
| 131 | int len = 2; | ||
| 132 | int xx = 0, yy = 0; | ||
| 133 | |||
| 134 | if (*p++ != 0x62) | ||
| 135 | return 0; | ||
| 136 | if (*p > 0x82) | ||
| 137 | return 0; | ||
| 138 | switch (*p) { | ||
| 139 | case 0x82: | ||
| 140 | p++; | ||
| 141 | xx = (*p++ << 8); | ||
| 142 | xx += *p++; | ||
| 143 | break; | ||
| 144 | case 0x81: | ||
| 145 | p++; | ||
| 146 | xx = *p++; | ||
| 147 | break; | ||
| 148 | case 0x80: | ||
| 149 | return 0; | ||
| 150 | default: | ||
| 151 | xx = *p++; | ||
| 152 | break; | ||
| 153 | } | ||
| 154 | if (*p++ != 0x30) | ||
| 155 | return 0; | ||
| 156 | if (*p > 0x82) | ||
| 157 | return 0; | ||
| 158 | switch (*p) { | ||
| 159 | case 0x82: | ||
| 160 | p++; | ||
| 161 | len += 2; | ||
| 162 | yy = (*p++ << 8); | ||
| 163 | yy += *p++; | ||
| 164 | break; | ||
| 165 | case 0x81: | ||
| 166 | p++; | ||
| 167 | len++; | ||
| 168 | yy = *p++; | ||
| 169 | break; | ||
| 170 | case 0x80: | ||
| 171 | return 0; | ||
| 172 | default: | ||
| 173 | yy = *p++; | ||
| 174 | break; | ||
| 175 | } | ||
| 176 | |||
| 177 | return (xx - len == yy) ? 1 : 0; | ||
| 178 | } | ||
| 179 | |||
| 180 | /* Allocate, fill, and return cksumlens array of checksum lengths. | ||
| 181 | ** This array holds just the unique elements from the krb5_cksumarray[]. | ||
| 182 | ** array[n] == 0 signals end of data. | ||
| 183 | ** | ||
| 184 | ** The krb5_cksumarray[] was an internal variable that has since been | ||
| 185 | ** replaced by a more general method for storing the data. It should | ||
| 186 | ** not be used. Instead we use real API calls and make a guess for | ||
| 187 | ** what the highest assigned CKSUMTYPE_ constant is. As of 1.2.2 | ||
| 188 | ** it is 0x000c (CKSUMTYPE_HMAC_SHA1_DES3). So we will use 0x0010. | ||
| 189 | */ | ||
| 190 | static size_t * | ||
| 191 | populate_cksumlens(void) | ||
| 192 | { | ||
| 193 | int i, j, n; | ||
| 194 | static size_t *cklens = NULL; | ||
| 195 | |||
| 196 | #ifdef KRB5_MIT_OLD11 | ||
| 197 | n = krb5_max_cksum; | ||
| 198 | #else | ||
| 199 | n = 0x0010; | ||
| 200 | #endif /* KRB5_MIT_OLD11 */ | ||
| 201 | |||
| 202 | #ifdef KRB5CHECKAUTH | ||
| 203 | if (!cklens && !(cklens = (size_t *) | ||
| 204 | calloc(sizeof(int), n + 1))) return NULL; | ||
| 205 | |||
| 206 | for (i = 0; i < n; i++) { | ||
| 207 | if (!valid_cksumtype(i)) | ||
| 208 | continue; /* array has holes */ | ||
| 209 | for (j = 0; j < n; j++) { | ||
| 210 | if (cklens[j] == 0) { | ||
| 211 | cklens[j] = krb5_checksum_size(NULL, i); | ||
| 212 | break; | ||
| 213 | /* krb5 elem was new: add */ | ||
| 214 | } | ||
| 215 | if (cklens[j] == krb5_checksum_size(NULL, i)) { | ||
| 216 | break; | ||
| 217 | /* ignore duplicate elements */ | ||
| 218 | } | ||
| 219 | } | ||
| 220 | } | ||
| 221 | #endif /* KRB5CHECKAUTH */ | ||
| 222 | |||
| 223 | return cklens; | ||
| 224 | } | ||
| 225 | |||
| 226 | /* Return pointer to start of real authenticator within authenticator, or | ||
| 227 | ** return NULL on error. | ||
| 228 | ** Decrypted authenticator looks like this: | ||
| 229 | ** [0 or 8 byte confounder] [4-24 byte checksum] [real authent'r] | ||
| 230 | ** This hackery wouldn't be necessary if MIT KRB5 1.0.6 had the | ||
| 231 | ** krb5_auth_con_getcksumtype() function advertised in its krb5.h. | ||
| 232 | */ | ||
| 233 | unsigned char * | ||
| 234 | kssl_skip_confound(krb5_enctype etype, unsigned char *a) | ||
| 235 | { | ||
| 236 | int i, conlen; | ||
| 237 | size_t cklen; | ||
| 238 | static size_t *cksumlens = NULL; | ||
| 239 | unsigned char *test_auth; | ||
| 240 | |||
| 241 | conlen = (etype) ? 8 : 0; | ||
| 242 | |||
| 243 | if (!cksumlens && !(cksumlens = populate_cksumlens())) | ||
| 244 | return NULL; | ||
| 245 | for (i = 0; (cklen = cksumlens[i]) != 0; i++) { | ||
| 246 | test_auth = a + conlen + cklen; | ||
| 247 | if (kssl_test_confound(test_auth)) | ||
| 248 | return test_auth; | ||
| 249 | } | ||
| 250 | |||
| 251 | return NULL; | ||
| 252 | } | ||
| 253 | |||
| 254 | |||
| 255 | /* Set kssl_err error info when reason text is a simple string | ||
| 256 | ** kssl_err = struct { int reason; char text[KSSL_ERR_MAX]; } | ||
| 257 | */ | ||
| 258 | void | ||
| 259 | kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text) | ||
| 260 | { | ||
| 261 | if (kssl_err == NULL) | ||
| 262 | return; | ||
| 263 | |||
| 264 | kssl_err->reason = reason; | ||
| 265 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, "%s", text); | ||
| 266 | return; | ||
| 267 | } | ||
| 268 | |||
| 269 | |||
| 270 | /* Display contents of krb5_data struct, for debugging | ||
| 271 | */ | ||
| 272 | void | ||
| 273 | print_krb5_data(char *label, krb5_data *kdata) | ||
| 274 | { | ||
| 275 | int i; | ||
| 276 | |||
| 277 | printf("%s[%d] ", label, kdata->length); | ||
| 278 | for (i = 0; i < (int)kdata->length; i++) { | ||
| 279 | if (0 && isprint((int) kdata->data[i])) | ||
| 280 | printf( "%c ", kdata->data[i]); | ||
| 281 | else | ||
| 282 | printf( "%02x ", (unsigned char) kdata->data[i]); | ||
| 283 | } | ||
| 284 | printf("\n"); | ||
| 285 | } | ||
| 286 | |||
| 287 | |||
| 288 | /* Display contents of krb5_authdata struct, for debugging | ||
| 289 | */ | ||
| 290 | void | ||
| 291 | print_krb5_authdata(char *label, krb5_authdata **adata) | ||
| 292 | { | ||
| 293 | if (adata == NULL) { | ||
| 294 | printf("%s, authdata==0\n", label); | ||
| 295 | return; | ||
| 296 | } | ||
| 297 | printf("%s [%p]\n", label, (void *)adata); | ||
| 298 | #if 0 | ||
| 299 | { | ||
| 300 | int i; | ||
| 301 | printf("%s[at%d:%d] ", label, adata->ad_type, adata->length); | ||
| 302 | for (i = 0; i < adata->length; i++) { | ||
| 303 | printf((isprint(adata->contents[i]))? "%c ": "%02x", | ||
| 304 | adata->contents[i]); | ||
| 305 | } | ||
| 306 | printf("\n"); | ||
| 307 | } | ||
| 308 | #endif | ||
| 309 | } | ||
| 310 | |||
| 311 | |||
| 312 | /* Display contents of krb5_keyblock struct, for debugging | ||
| 313 | */ | ||
| 314 | void | ||
| 315 | print_krb5_keyblock(char *label, krb5_keyblock *keyblk) | ||
| 316 | { | ||
| 317 | int i; | ||
| 318 | |||
| 319 | if (keyblk == NULL) { | ||
| 320 | printf("%s, keyblk==0\n", label); | ||
| 321 | return; | ||
| 322 | } | ||
| 323 | #ifdef KRB5_HEIMDAL | ||
| 324 | printf("%s\n\t[et%d:%d]: ", label, keyblk->keytype, | ||
| 325 | keyblk->keyvalue->length); | ||
| 326 | for (i = 0; i < (int)keyblk->keyvalue->length; i++) { | ||
| 327 | printf("%02x",(unsigned char *)(keyblk->keyvalue->contents)[i]); | ||
| 328 | } | ||
| 329 | printf("\n"); | ||
| 330 | #else | ||
| 331 | printf("%s\n\t[et%d:%d]: ", label, keyblk->enctype, keyblk->length); | ||
| 332 | for (i = 0; i < (int)keyblk->length; i++) { | ||
| 333 | printf("%02x", keyblk->contents[i]); | ||
| 334 | } | ||
| 335 | printf("\n"); | ||
| 336 | #endif | ||
| 337 | } | ||
| 338 | |||
| 339 | |||
| 340 | /* Display contents of krb5_principal_data struct, for debugging | ||
| 341 | ** (krb5_principal is typedef'd == krb5_principal_data *) | ||
| 342 | */ | ||
| 343 | static void | ||
| 344 | print_krb5_princ(char *label, krb5_principal_data *princ) | ||
| 345 | { | ||
| 346 | int i, ui, uj; | ||
| 347 | |||
| 348 | printf("%s principal Realm: ", label); | ||
| 349 | if (princ == NULL) | ||
| 350 | return; | ||
| 351 | for (ui = 0; ui < (int)princ->realm.length; ui++) | ||
| 352 | putchar(princ->realm.data[ui]); | ||
| 353 | printf(" (nametype %d) has %d strings:\n", princ->type, princ->length); | ||
| 354 | for (i = 0; i < (int)princ->length; i++) { | ||
| 355 | printf("\t%d [%d]: ", i, princ->data[i].length); | ||
| 356 | for (uj = 0; uj < (int)princ->data[i].length; uj++) { | ||
| 357 | putchar(princ->data[i].data[uj]); | ||
| 358 | } | ||
| 359 | printf("\n"); | ||
| 360 | } | ||
| 361 | return; | ||
| 362 | } | ||
| 363 | |||
| 364 | |||
| 365 | /* Given krb5 service (typically "kssl") and hostname in kssl_ctx, | ||
| 366 | ** Return encrypted Kerberos ticket for service @ hostname. | ||
| 367 | ** If authenp is non-NULL, also return encrypted authenticator, | ||
| 368 | ** whose data should be freed by caller. | ||
| 369 | ** (Originally was: Create Kerberos AP_REQ message for SSL Client.) | ||
| 370 | ** | ||
| 371 | ** 19990628 VRS Started; Returns Kerberos AP_REQ message. | ||
| 372 | ** 20010409 VRS Modified for RFC2712; Returns enc tkt. | ||
| 373 | ** 20010606 VRS May also return optional authenticator. | ||
| 374 | */ | ||
| 375 | krb5_error_code | ||
| 376 | kssl_cget_tkt( | ||
| 377 | /* UPDATE */ KSSL_CTX *kssl_ctx, | ||
| 378 | /* OUT */ krb5_data **enc_ticketp, | ||
| 379 | /* UPDATE */ krb5_data *authenp, | ||
| 380 | /* OUT */ KSSL_ERR *kssl_err) | ||
| 381 | { | ||
| 382 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | ||
| 383 | krb5_context krb5context = NULL; | ||
| 384 | krb5_auth_context krb5auth_context = NULL; | ||
| 385 | krb5_ccache krb5ccdef = NULL; | ||
| 386 | krb5_creds krb5creds, *krb5credsp = NULL; | ||
| 387 | krb5_data krb5_app_req; | ||
| 388 | |||
| 389 | kssl_err_set(kssl_err, 0, ""); | ||
| 390 | memset((char *)&krb5creds, 0, sizeof(krb5creds)); | ||
| 391 | |||
| 392 | if (!kssl_ctx) { | ||
| 393 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 394 | "No kssl_ctx defined.\n"); | ||
| 395 | goto err; | ||
| 396 | } else if (!kssl_ctx->service_host) { | ||
| 397 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 398 | "kssl_ctx service_host undefined.\n"); | ||
| 399 | goto err; | ||
| 400 | } | ||
| 401 | |||
| 402 | if ((krb5rc = krb5_init_context(&krb5context)) != 0) { | ||
| 403 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 404 | "krb5_init_context() fails: %d\n", krb5rc); | ||
| 405 | kssl_err->reason = SSL_R_KRB5_C_INIT; | ||
| 406 | goto err; | ||
| 407 | } | ||
| 408 | |||
| 409 | if ((krb5rc = krb5_sname_to_principal(krb5context, | ||
| 410 | kssl_ctx->service_host, | ||
| 411 | (kssl_ctx->service_name) ? kssl_ctx->service_name : KRB5SVC, | ||
| 412 | KRB5_NT_SRV_HST, &krb5creds.server)) != 0) { | ||
| 413 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 414 | "krb5_sname_to_principal() fails for %s/%s\n", | ||
| 415 | kssl_ctx->service_host, (kssl_ctx->service_name) ? | ||
| 416 | kssl_ctx->service_name : KRB5SVC); | ||
| 417 | kssl_err->reason = SSL_R_KRB5_C_INIT; | ||
| 418 | goto err; | ||
| 419 | } | ||
| 420 | |||
| 421 | if ((krb5rc = krb5_cc_default(krb5context, &krb5ccdef)) != 0) { | ||
| 422 | kssl_err_set(kssl_err, SSL_R_KRB5_C_CC_PRINC, | ||
| 423 | "krb5_cc_default fails.\n"); | ||
| 424 | goto err; | ||
| 425 | } | ||
| 426 | |||
| 427 | if ((krb5rc = krb5_cc_get_principal(krb5context, krb5ccdef, | ||
| 428 | &krb5creds.client)) != 0) { | ||
| 429 | kssl_err_set(kssl_err, SSL_R_KRB5_C_CC_PRINC, | ||
| 430 | "krb5_cc_get_principal() fails.\n"); | ||
| 431 | goto err; | ||
| 432 | } | ||
| 433 | |||
| 434 | if ((krb5rc = krb5_get_credentials(krb5context, 0, krb5ccdef, | ||
| 435 | &krb5creds, &krb5credsp)) != 0) { | ||
| 436 | kssl_err_set(kssl_err, SSL_R_KRB5_C_GET_CRED, | ||
| 437 | "krb5_get_credentials() fails.\n"); | ||
| 438 | goto err; | ||
| 439 | } | ||
| 440 | |||
| 441 | *enc_ticketp = &krb5credsp->ticket; | ||
| 442 | #ifdef KRB5_HEIMDAL | ||
| 443 | kssl_ctx->enctype = krb5credsp->session.keytype; | ||
| 444 | #else | ||
| 445 | kssl_ctx->enctype = krb5credsp->keyblock.enctype; | ||
| 446 | #endif | ||
| 447 | |||
| 448 | krb5rc = KRB5KRB_ERR_GENERIC; | ||
| 449 | /* caller should free data of krb5_app_req */ | ||
| 450 | /* 20010406 VRS deleted for real KerberosWrapper | ||
| 451 | ** 20010605 VRS reinstated to offer Authenticator to KerberosWrapper | ||
| 452 | */ | ||
| 453 | krb5_app_req.length = 0; | ||
| 454 | if (authenp) { | ||
| 455 | krb5_data krb5in_data; | ||
| 456 | const unsigned char *p; | ||
| 457 | long arlen; | ||
| 458 | KRB5_APREQBODY *ap_req; | ||
| 459 | |||
| 460 | authenp->length = 0; | ||
| 461 | krb5in_data.data = NULL; | ||
| 462 | krb5in_data.length = 0; | ||
| 463 | if ((krb5rc = krb5_mk_req_extended(krb5context, | ||
| 464 | &krb5auth_context, 0, &krb5in_data, krb5credsp, | ||
| 465 | &krb5_app_req)) != 0) { | ||
| 466 | kssl_err_set(kssl_err, SSL_R_KRB5_C_MK_REQ, | ||
| 467 | "krb5_mk_req_extended() fails.\n"); | ||
| 468 | goto err; | ||
| 469 | } | ||
| 470 | |||
| 471 | arlen = krb5_app_req.length; | ||
| 472 | p = (unsigned char *)krb5_app_req.data; | ||
| 473 | ap_req = (KRB5_APREQBODY *) d2i_KRB5_APREQ(NULL, &p, arlen); | ||
| 474 | if (ap_req) { | ||
| 475 | authenp->length = i2d_KRB5_ENCDATA( | ||
| 476 | ap_req->authenticator, NULL); | ||
| 477 | if (authenp->length && | ||
| 478 | (authenp->data = malloc(authenp->length))) { | ||
| 479 | unsigned char *adp = (unsigned char *)authenp->data; | ||
| 480 | authenp->length = i2d_KRB5_ENCDATA( | ||
| 481 | ap_req->authenticator, &adp); | ||
| 482 | } | ||
| 483 | } | ||
| 484 | |||
| 485 | if (ap_req) | ||
| 486 | KRB5_APREQ_free((KRB5_APREQ *) ap_req); | ||
| 487 | if (krb5_app_req.length) | ||
| 488 | kssl_krb5_free_data_contents(krb5context, &krb5_app_req); | ||
| 489 | } | ||
| 490 | #ifdef KRB5_HEIMDAL | ||
| 491 | if (kssl_ctx_setkey(kssl_ctx, &krb5credsp->session)) { | ||
| 492 | kssl_err_set(kssl_err, SSL_R_KRB5_C_INIT, | ||
| 493 | "kssl_ctx_setkey() fails.\n"); | ||
| 494 | } | ||
| 495 | #else | ||
| 496 | if (kssl_ctx_setkey(kssl_ctx, &krb5credsp->keyblock)) { | ||
| 497 | kssl_err_set(kssl_err, SSL_R_KRB5_C_INIT, | ||
| 498 | "kssl_ctx_setkey() fails.\n"); | ||
| 499 | } | ||
| 500 | #endif | ||
| 501 | else | ||
| 502 | krb5rc = 0; | ||
| 503 | |||
| 504 | err: | ||
| 505 | #ifdef KSSL_DEBUG | ||
| 506 | kssl_ctx_show(kssl_ctx); | ||
| 507 | #endif /* KSSL_DEBUG */ | ||
| 508 | |||
| 509 | if (krb5creds.client) | ||
| 510 | krb5_free_principal(krb5context, krb5creds.client); | ||
| 511 | if (krb5creds.server) | ||
| 512 | krb5_free_principal(krb5context, krb5creds.server); | ||
| 513 | if (krb5auth_context) | ||
| 514 | krb5_auth_con_free(krb5context, krb5auth_context); | ||
| 515 | if (krb5context) | ||
| 516 | krb5_free_context(krb5context); | ||
| 517 | return (krb5rc); | ||
| 518 | } | ||
| 519 | |||
| 520 | |||
| 521 | /* Given d2i_-decoded asn1ticket, allocate and return a new krb5_ticket. | ||
| 522 | ** Return Kerberos error code and kssl_err struct on error. | ||
| 523 | ** Allocates krb5_ticket and krb5_principal; caller should free these. | ||
| 524 | ** | ||
| 525 | ** 20010410 VRS Implemented krb5_decode_ticket() as | ||
| 526 | ** old_krb5_decode_ticket(). Missing from MIT1.0.6. | ||
| 527 | ** 20010615 VRS Re-cast as openssl/asn1 d2i_*() functions. | ||
| 528 | ** Re-used some of the old krb5_decode_ticket() | ||
| 529 | ** code here. This tkt should alloc/free just | ||
| 530 | ** like the real thing. | ||
| 531 | */ | ||
| 532 | static krb5_error_code | ||
| 533 | kssl_TKT2tkt( | ||
| 534 | /* IN */ krb5_context krb5context, | ||
| 535 | /* IN */ KRB5_TKTBODY *asn1ticket, | ||
| 536 | /* OUT */ krb5_ticket **krb5ticket, | ||
| 537 | /* OUT */ KSSL_ERR *kssl_err ) | ||
| 538 | { | ||
| 539 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | ||
| 540 | krb5_ticket *new5ticket = NULL; | ||
| 541 | ASN1_GENERALSTRING *gstr_svc, *gstr_host; | ||
| 542 | |||
| 543 | *krb5ticket = NULL; | ||
| 544 | |||
| 545 | if (asn1ticket == NULL || asn1ticket->realm == NULL || | ||
| 546 | asn1ticket->sname == NULL || | ||
| 547 | sk_ASN1_GENERALSTRING_num(asn1ticket->sname->namestring) < 2) { | ||
| 548 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 549 | "Null field in asn1ticket.\n"); | ||
| 550 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 551 | return KRB5KRB_ERR_GENERIC; | ||
| 552 | } | ||
| 553 | |||
| 554 | if ((new5ticket = calloc(1, sizeof(krb5_ticket))) == NULL) { | ||
| 555 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 556 | "Unable to allocate new krb5_ticket.\n"); | ||
| 557 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 558 | return ENOMEM; /* or KRB5KRB_ERR_GENERIC; */ | ||
| 559 | } | ||
| 560 | |||
| 561 | gstr_svc = sk_ASN1_GENERALSTRING_value(asn1ticket->sname->namestring, 0); | ||
| 562 | gstr_host = sk_ASN1_GENERALSTRING_value(asn1ticket->sname->namestring, 1); | ||
| 563 | |||
| 564 | if ((krb5rc = kssl_build_principal_2(krb5context, &new5ticket->server, | ||
| 565 | asn1ticket->realm->length, (char *)asn1ticket->realm->data, | ||
| 566 | gstr_svc->length, (char *)gstr_svc->data, gstr_host->length, | ||
| 567 | (char *)gstr_host->data)) != 0) { | ||
| 568 | free(new5ticket); | ||
| 569 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 570 | "Error building ticket server principal.\n"); | ||
| 571 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 572 | return krb5rc; /* or KRB5KRB_ERR_GENERIC; */ | ||
| 573 | } | ||
| 574 | |||
| 575 | krb5_princ_type(krb5context, new5ticket->server) = | ||
| 576 | asn1ticket->sname->nametype->data[0]; | ||
| 577 | new5ticket->enc_part.enctype = asn1ticket->encdata->etype->data[0]; | ||
| 578 | new5ticket->enc_part.kvno = asn1ticket->encdata->kvno->data[0]; | ||
| 579 | new5ticket->enc_part.ciphertext.length = | ||
| 580 | asn1ticket->encdata->cipher->length; | ||
| 581 | if ((new5ticket->enc_part.ciphertext.data = | ||
| 582 | calloc(1, asn1ticket->encdata->cipher->length)) == NULL) { | ||
| 583 | free(new5ticket); | ||
| 584 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 585 | "Error allocating cipher in krb5ticket.\n"); | ||
| 586 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 587 | return KRB5KRB_ERR_GENERIC; | ||
| 588 | } else { | ||
| 589 | memcpy(new5ticket->enc_part.ciphertext.data, | ||
| 590 | asn1ticket->encdata->cipher->data, | ||
| 591 | asn1ticket->encdata->cipher->length); | ||
| 592 | } | ||
| 593 | |||
| 594 | *krb5ticket = new5ticket; | ||
| 595 | return 0; | ||
| 596 | } | ||
| 597 | |||
| 598 | |||
| 599 | /* Given krb5 service name in KSSL_CTX *kssl_ctx (typically "kssl"), | ||
| 600 | ** and krb5 AP_REQ message & message length, | ||
| 601 | ** Return Kerberos session key and client principle | ||
| 602 | ** to SSL Server in KSSL_CTX *kssl_ctx. | ||
| 603 | ** | ||
| 604 | ** 19990702 VRS Started. | ||
| 605 | */ | ||
| 606 | krb5_error_code | ||
| 607 | kssl_sget_tkt( | ||
| 608 | /* UPDATE */ KSSL_CTX *kssl_ctx, | ||
| 609 | /* IN */ krb5_data *indata, | ||
| 610 | /* OUT */ krb5_ticket_times *ttimes, | ||
| 611 | /* OUT */ KSSL_ERR *kssl_err ) | ||
| 612 | { | ||
| 613 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | ||
| 614 | static krb5_context krb5context = NULL; | ||
| 615 | static krb5_auth_context krb5auth_context = NULL; | ||
| 616 | krb5_ticket *krb5ticket = NULL; | ||
| 617 | KRB5_TKTBODY *asn1ticket = NULL; | ||
| 618 | const unsigned char *p; | ||
| 619 | krb5_keytab krb5keytab = NULL; | ||
| 620 | krb5_keytab_entry kt_entry; | ||
| 621 | krb5_principal krb5server; | ||
| 622 | krb5_rcache rcache = NULL; | ||
| 623 | |||
| 624 | kssl_err_set(kssl_err, 0, ""); | ||
| 625 | |||
| 626 | if (!kssl_ctx) { | ||
| 627 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 628 | "No kssl_ctx defined.\n"); | ||
| 629 | goto err; | ||
| 630 | } | ||
| 631 | |||
| 632 | #ifdef KSSL_DEBUG | ||
| 633 | printf("in kssl_sget_tkt(%s)\n", kstring(kssl_ctx->service_name)); | ||
| 634 | #endif /* KSSL_DEBUG */ | ||
| 635 | |||
| 636 | if (!krb5context && (krb5rc = krb5_init_context(&krb5context))) { | ||
| 637 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 638 | "krb5_init_context() fails.\n"); | ||
| 639 | goto err; | ||
| 640 | } | ||
| 641 | if (krb5auth_context && | ||
| 642 | (krb5rc = krb5_auth_con_free(krb5context, krb5auth_context))) { | ||
| 643 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 644 | "krb5_auth_con_free() fails.\n"); | ||
| 645 | goto err; | ||
| 646 | } else | ||
| 647 | krb5auth_context = NULL; | ||
| 648 | if (!krb5auth_context && | ||
| 649 | (krb5rc = krb5_auth_con_init(krb5context, &krb5auth_context))) { | ||
| 650 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 651 | "krb5_auth_con_init() fails.\n"); | ||
| 652 | goto err; | ||
| 653 | } | ||
| 654 | |||
| 655 | if ((krb5rc = krb5_auth_con_getrcache(krb5context, krb5auth_context, | ||
| 656 | &rcache))) { | ||
| 657 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 658 | "krb5_auth_con_getrcache() fails.\n"); | ||
| 659 | goto err; | ||
| 660 | } | ||
| 661 | |||
| 662 | if ((krb5rc = krb5_sname_to_principal(krb5context, NULL, | ||
| 663 | (kssl_ctx->service_name) ? kssl_ctx->service_name : KRB5SVC, | ||
| 664 | KRB5_NT_SRV_HST, &krb5server)) != 0) { | ||
| 665 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 666 | "krb5_sname_to_principal() fails.\n"); | ||
| 667 | goto err; | ||
| 668 | } | ||
| 669 | |||
| 670 | if (rcache == NULL) { | ||
| 671 | if ((krb5rc = krb5_get_server_rcache(krb5context, | ||
| 672 | krb5_princ_component(krb5context, krb5server, 0), | ||
| 673 | &rcache))) { | ||
| 674 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 675 | "krb5_get_server_rcache() fails.\n"); | ||
| 676 | goto err; | ||
| 677 | } | ||
| 678 | } | ||
| 679 | |||
| 680 | if ((krb5rc = krb5_auth_con_setrcache(krb5context, krb5auth_context, | ||
| 681 | rcache))) { | ||
| 682 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 683 | "krb5_auth_con_setrcache() fails.\n"); | ||
| 684 | goto err; | ||
| 685 | } | ||
| 686 | |||
| 687 | |||
| 688 | /* kssl_ctx->keytab_file == NULL ==> use Kerberos default | ||
| 689 | */ | ||
| 690 | if (kssl_ctx->keytab_file) { | ||
| 691 | krb5rc = krb5_kt_resolve(krb5context, kssl_ctx->keytab_file, | ||
| 692 | &krb5keytab); | ||
| 693 | if (krb5rc) { | ||
| 694 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 695 | "krb5_kt_resolve() fails.\n"); | ||
| 696 | goto err; | ||
| 697 | } | ||
| 698 | } else { | ||
| 699 | krb5rc = krb5_kt_default(krb5context, &krb5keytab); | ||
| 700 | if (krb5rc) { | ||
| 701 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 702 | "krb5_kt_default() fails.\n"); | ||
| 703 | goto err; | ||
| 704 | } | ||
| 705 | } | ||
| 706 | |||
| 707 | /* Actual Kerberos5 krb5_recvauth() has initial conversation here | ||
| 708 | ** o check KRB5_SENDAUTH_BADAUTHVERS | ||
| 709 | ** unless KRB5_RECVAUTH_SKIP_VERSION | ||
| 710 | ** o check KRB5_SENDAUTH_BADAPPLVERS | ||
| 711 | ** o send "0" msg if all OK | ||
| 712 | */ | ||
| 713 | |||
| 714 | /* 20010411 was using AP_REQ instead of true KerberosWrapper | ||
| 715 | ** | ||
| 716 | ** if ((krb5rc = krb5_rd_req(krb5context, &krb5auth_context, | ||
| 717 | ** &krb5in_data, krb5server, krb5keytab, | ||
| 718 | ** &ap_option, &krb5ticket)) != 0) { Error } | ||
| 719 | */ | ||
| 720 | |||
| 721 | p = (unsigned char *)indata->data; | ||
| 722 | if ((asn1ticket = (KRB5_TKTBODY *) d2i_KRB5_TICKET(NULL, &p, | ||
| 723 | (long)indata->length)) == NULL) { | ||
| 724 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 725 | "d2i_KRB5_TICKET() ASN.1 decode failure.\n"); | ||
| 726 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 727 | goto err; | ||
| 728 | } | ||
| 729 | |||
| 730 | /* Was: krb5rc = krb5_decode_ticket(krb5in_data,&krb5ticket)) != 0) */ | ||
| 731 | if ((krb5rc = kssl_TKT2tkt(krb5context, asn1ticket, &krb5ticket, | ||
| 732 | kssl_err)) != 0) { | ||
| 733 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 734 | "Error converting ASN.1 ticket to krb5_ticket.\n"); | ||
| 735 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 736 | goto err; | ||
| 737 | } | ||
| 738 | |||
| 739 | if (!krb5_principal_compare(krb5context, krb5server, | ||
| 740 | krb5ticket->server)) { | ||
| 741 | krb5rc = KRB5_PRINC_NOMATCH; | ||
| 742 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 743 | "server principal != ticket principal\n"); | ||
| 744 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 745 | goto err; | ||
| 746 | } | ||
| 747 | if ((krb5rc = krb5_kt_get_entry(krb5context, krb5keytab, | ||
| 748 | krb5ticket->server, krb5ticket->enc_part.kvno, | ||
| 749 | krb5ticket->enc_part.enctype, &kt_entry)) != 0) { | ||
| 750 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 751 | "krb5_kt_get_entry() fails with %x.\n", krb5rc); | ||
| 752 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 753 | goto err; | ||
| 754 | } | ||
| 755 | if ((krb5rc = krb5_decrypt_tkt_part(krb5context, &kt_entry.key, | ||
| 756 | krb5ticket)) != 0) { | ||
| 757 | (void) snprintf(kssl_err->text, KSSL_ERR_MAX, | ||
| 758 | "krb5_decrypt_tkt_part() failed.\n"); | ||
| 759 | kssl_err->reason = SSL_R_KRB5_S_RD_REQ; | ||
| 760 | goto err; | ||
| 761 | } else { | ||
| 762 | krb5_kt_free_entry(krb5context, &kt_entry); | ||
| 763 | #ifdef KSSL_DEBUG | ||
| 764 | { | ||
| 765 | int i; | ||
| 766 | krb5_address **paddr = krb5ticket->enc_part2->caddrs; | ||
| 767 | printf("Decrypted ticket fields:\n"); | ||
| 768 | printf("\tflags: %X, transit-type: %X", | ||
| 769 | krb5ticket->enc_part2->flags, | ||
| 770 | krb5ticket->enc_part2->transited.tr_type); | ||
| 771 | print_krb5_data("\ttransit-data: ", | ||
| 772 | &(krb5ticket->enc_part2->transited.tr_contents)); | ||
| 773 | printf("\tcaddrs: %p, authdata: %p\n", | ||
| 774 | krb5ticket->enc_part2->caddrs, | ||
| 775 | krb5ticket->enc_part2->authorization_data); | ||
| 776 | if (paddr) { | ||
| 777 | printf("\tcaddrs:\n"); | ||
| 778 | for (i = 0; paddr[i] != NULL; i++) { | ||
| 779 | krb5_data d; | ||
| 780 | d.length = paddr[i]->length; | ||
| 781 | d.data = paddr[i]->contents; | ||
| 782 | print_krb5_data("\t\tIP: ", &d); | ||
| 783 | } | ||
| 784 | } | ||
| 785 | printf("\tstart/auth/end times: %d / %d / %d\n", | ||
| 786 | krb5ticket->enc_part2->times.starttime, | ||
| 787 | krb5ticket->enc_part2->times.authtime, | ||
| 788 | krb5ticket->enc_part2->times.endtime); | ||
| 789 | } | ||
| 790 | #endif /* KSSL_DEBUG */ | ||
| 791 | } | ||
| 792 | |||
| 793 | krb5rc = KRB5_NO_TKT_SUPPLIED; | ||
| 794 | if (!krb5ticket || !krb5ticket->enc_part2 || | ||
| 795 | !krb5ticket->enc_part2->client || | ||
| 796 | !krb5ticket->enc_part2->client->data || | ||
| 797 | !krb5ticket->enc_part2->session) { | ||
| 798 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, | ||
| 799 | "bad ticket from krb5_rd_req.\n"); | ||
| 800 | } else if (kssl_ctx_setprinc(kssl_ctx, KSSL_CLIENT, | ||
| 801 | &krb5ticket->enc_part2->client->realm, | ||
| 802 | krb5ticket->enc_part2->client->data, | ||
| 803 | krb5ticket->enc_part2->client->length)) { | ||
| 804 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, | ||
| 805 | "kssl_ctx_setprinc() fails.\n"); | ||
| 806 | } else if (kssl_ctx_setkey(kssl_ctx, krb5ticket->enc_part2->session)) { | ||
| 807 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, | ||
| 808 | "kssl_ctx_setkey() fails.\n"); | ||
| 809 | } else if (krb5ticket->enc_part2->flags & TKT_FLG_INVALID) { | ||
| 810 | krb5rc = KRB5KRB_AP_ERR_TKT_INVALID; | ||
| 811 | kssl_err_set(kssl_err, SSL_R_KRB5_S_BAD_TICKET, | ||
| 812 | "invalid ticket from krb5_rd_req.\n"); | ||
| 813 | } else | ||
| 814 | krb5rc = 0; | ||
| 815 | |||
| 816 | kssl_ctx->enctype = krb5ticket->enc_part.enctype; | ||
| 817 | ttimes->authtime = krb5ticket->enc_part2->times.authtime; | ||
| 818 | ttimes->starttime = krb5ticket->enc_part2->times.starttime; | ||
| 819 | ttimes->endtime = krb5ticket->enc_part2->times.endtime; | ||
| 820 | ttimes->renew_till = krb5ticket->enc_part2->times.renew_till; | ||
| 821 | |||
| 822 | err: | ||
| 823 | #ifdef KSSL_DEBUG | ||
| 824 | kssl_ctx_show(kssl_ctx); | ||
| 825 | #endif /* KSSL_DEBUG */ | ||
| 826 | |||
| 827 | if (asn1ticket) | ||
| 828 | KRB5_TICKET_free((KRB5_TICKET *) asn1ticket); | ||
| 829 | if (krb5keytab) | ||
| 830 | krb5_kt_close(krb5context, krb5keytab); | ||
| 831 | if (krb5ticket) | ||
| 832 | krb5_free_ticket(krb5context, krb5ticket); | ||
| 833 | if (krb5server) | ||
| 834 | krb5_free_principal(krb5context, krb5server); | ||
| 835 | return (krb5rc); | ||
| 836 | } | ||
| 837 | |||
| 838 | |||
| 839 | /* Allocate & return a new kssl_ctx struct. | ||
| 840 | */ | ||
| 841 | KSSL_CTX * | ||
| 842 | kssl_ctx_new(void) | ||
| 843 | { | ||
| 844 | return (calloc(1, sizeof(KSSL_CTX))); | ||
| 845 | } | ||
| 846 | |||
| 847 | |||
| 848 | /* Frees a kssl_ctx struct and any allocated memory it holds. | ||
| 849 | ** Returns NULL. | ||
| 850 | */ | ||
| 851 | KSSL_CTX * | ||
| 852 | kssl_ctx_free(KSSL_CTX *kssl_ctx) | ||
| 853 | { | ||
| 854 | if (kssl_ctx == NULL) | ||
| 855 | return kssl_ctx; | ||
| 856 | |||
| 857 | if (kssl_ctx->key) | ||
| 858 | OPENSSL_cleanse(kssl_ctx->key, kssl_ctx->length); | ||
| 859 | if (kssl_ctx->key) | ||
| 860 | free(kssl_ctx->key); | ||
| 861 | if (kssl_ctx->client_princ) | ||
| 862 | free(kssl_ctx->client_princ); | ||
| 863 | if (kssl_ctx->service_host) | ||
| 864 | free(kssl_ctx->service_host); | ||
| 865 | if (kssl_ctx->service_name) | ||
| 866 | free(kssl_ctx->service_name); | ||
| 867 | if (kssl_ctx->keytab_file) | ||
| 868 | free(kssl_ctx->keytab_file); | ||
| 869 | |||
| 870 | free(kssl_ctx); | ||
| 871 | return (KSSL_CTX *) NULL; | ||
| 872 | } | ||
| 873 | |||
| 874 | |||
| 875 | /* Given an array of (krb5_data *) entity (and optional realm), | ||
| 876 | ** set the plain (char *) client_princ or service_host member | ||
| 877 | ** of the kssl_ctx struct. | ||
| 878 | */ | ||
| 879 | krb5_error_code | ||
| 880 | kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, krb5_data *realm, | ||
| 881 | krb5_data *entity, int nentities) | ||
| 882 | { | ||
| 883 | char **princ; | ||
| 884 | int length; | ||
| 885 | int i; | ||
| 886 | |||
| 887 | if (kssl_ctx == NULL || entity == NULL) | ||
| 888 | return KSSL_CTX_ERR; | ||
| 889 | |||
| 890 | switch (which) { | ||
| 891 | case KSSL_CLIENT: | ||
| 892 | princ = &kssl_ctx->client_princ; | ||
| 893 | break; | ||
| 894 | case KSSL_SERVER: | ||
| 895 | princ = &kssl_ctx->service_host; | ||
| 896 | break; | ||
| 897 | default: | ||
| 898 | return KSSL_CTX_ERR; | ||
| 899 | break; | ||
| 900 | } | ||
| 901 | free(*princ); | ||
| 902 | *princ = NULL; | ||
| 903 | |||
| 904 | /* Add up all the entity->lengths */ | ||
| 905 | length = 0; | ||
| 906 | for (i = 0; i < nentities; i++) { | ||
| 907 | length += entity[i].length; | ||
| 908 | } | ||
| 909 | /* Add in space for the '/' character(s) (if any) */ | ||
| 910 | length += nentities - 1; | ||
| 911 | /* Space for the ('@'+realm+NULL | NULL) */ | ||
| 912 | length += ((realm) ? realm->length + 2 : 1); | ||
| 913 | |||
| 914 | if ((*princ = calloc(1, length)) == NULL) | ||
| 915 | return KSSL_CTX_ERR; | ||
| 916 | else { | ||
| 917 | for (i = 0; i < nentities; i++) { | ||
| 918 | strncat(*princ, entity[i].data, entity[i].length); | ||
| 919 | if (i < nentities - 1) { | ||
| 920 | strcat (*princ, "/"); | ||
| 921 | } | ||
| 922 | } | ||
| 923 | if (realm) { | ||
| 924 | strcat (*princ, "@"); | ||
| 925 | (void) strncat(*princ, realm->data, realm->length); | ||
| 926 | } | ||
| 927 | } | ||
| 928 | |||
| 929 | return KSSL_CTX_OK; | ||
| 930 | } | ||
| 931 | |||
| 932 | |||
| 933 | /* Set one of the plain (char *) string members of the kssl_ctx struct. | ||
| 934 | ** Default values should be: | ||
| 935 | ** which == KSSL_SERVICE => "khost" (KRB5SVC) | ||
| 936 | ** which == KSSL_KEYTAB => "/etc/krb5.keytab" (KRB5KEYTAB) | ||
| 937 | */ | ||
| 938 | krb5_error_code | ||
| 939 | kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text) | ||
| 940 | { | ||
| 941 | char **string; | ||
| 942 | |||
| 943 | if (!kssl_ctx) | ||
| 944 | return KSSL_CTX_ERR; | ||
| 945 | |||
| 946 | switch (which) { | ||
| 947 | case KSSL_SERVICE: | ||
| 948 | string = &kssl_ctx->service_name; | ||
| 949 | break; | ||
| 950 | case KSSL_SERVER: | ||
| 951 | string = &kssl_ctx->service_host; | ||
| 952 | break; | ||
| 953 | case KSSL_CLIENT: | ||
| 954 | string = &kssl_ctx->client_princ; | ||
| 955 | break; | ||
| 956 | case KSSL_KEYTAB: | ||
| 957 | string = &kssl_ctx->keytab_file; | ||
| 958 | break; | ||
| 959 | default: | ||
| 960 | return KSSL_CTX_ERR; | ||
| 961 | break; | ||
| 962 | } | ||
| 963 | free(*string); | ||
| 964 | *string = NULL; | ||
| 965 | |||
| 966 | if (text && (*string = strdup(text)) == NULL) | ||
| 967 | return KSSL_CTX_ERR; | ||
| 968 | |||
| 969 | return KSSL_CTX_OK; | ||
| 970 | } | ||
| 971 | |||
| 972 | |||
| 973 | /* Copy the Kerberos session key from a (krb5_keyblock *) to a kssl_ctx | ||
| 974 | ** struct. Clear kssl_ctx->key if Kerberos session key is NULL. | ||
| 975 | */ | ||
| 976 | krb5_error_code | ||
| 977 | kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session) | ||
| 978 | { | ||
| 979 | int length; | ||
| 980 | krb5_enctype enctype; | ||
| 981 | krb5_octet FAR *contents = NULL; | ||
| 982 | |||
| 983 | if (!kssl_ctx) | ||
| 984 | return KSSL_CTX_ERR; | ||
| 985 | |||
| 986 | if (kssl_ctx->key) { | ||
| 987 | OPENSSL_cleanse(kssl_ctx->key, kssl_ctx->length); | ||
| 988 | free(kssl_ctx->key); | ||
| 989 | kssl_ctx->key = NULL; | ||
| 990 | } | ||
| 991 | |||
| 992 | if (session) { | ||
| 993 | |||
| 994 | #ifdef KRB5_HEIMDAL | ||
| 995 | length = session->keyvalue->length; | ||
| 996 | enctype = session->keytype; | ||
| 997 | contents = session->keyvalue->contents; | ||
| 998 | #else | ||
| 999 | length = session->length; | ||
| 1000 | enctype = session->enctype; | ||
| 1001 | contents = session->contents; | ||
| 1002 | #endif | ||
| 1003 | kssl_ctx->enctype = enctype; | ||
| 1004 | kssl_ctx->length = length; | ||
| 1005 | } else { | ||
| 1006 | kssl_ctx->enctype = ENCTYPE_UNKNOWN; | ||
| 1007 | kssl_ctx->length = 0; | ||
| 1008 | return KSSL_CTX_OK; | ||
| 1009 | } | ||
| 1010 | |||
| 1011 | if ((kssl_ctx->key = calloc(1, kssl_ctx->length)) == NULL) { | ||
| 1012 | kssl_ctx->length = 0; | ||
| 1013 | return KSSL_CTX_ERR; | ||
| 1014 | } else | ||
| 1015 | memcpy(kssl_ctx->key, contents, length); | ||
| 1016 | |||
| 1017 | return KSSL_CTX_OK; | ||
| 1018 | } | ||
| 1019 | |||
| 1020 | |||
| 1021 | /* Display contents of kssl_ctx struct | ||
| 1022 | */ | ||
| 1023 | void | ||
| 1024 | kssl_ctx_show(KSSL_CTX *kssl_ctx) | ||
| 1025 | { | ||
| 1026 | int i; | ||
| 1027 | |||
| 1028 | printf("kssl_ctx: "); | ||
| 1029 | if (kssl_ctx == NULL) { | ||
| 1030 | printf("NULL\n"); | ||
| 1031 | return; | ||
| 1032 | } else | ||
| 1033 | printf("%p\n", (void *)kssl_ctx); | ||
| 1034 | |||
| 1035 | printf("\tservice:\t%s\n", | ||
| 1036 | (kssl_ctx->service_name) ? kssl_ctx->service_name : "NULL"); | ||
| 1037 | printf("\tclient:\t%s\n", | ||
| 1038 | (kssl_ctx->client_princ) ? kssl_ctx->client_princ : "NULL"); | ||
| 1039 | printf("\tserver:\t%s\n", | ||
| 1040 | (kssl_ctx->service_host) ? kssl_ctx->service_host : "NULL"); | ||
| 1041 | printf("\tkeytab:\t%s\n", | ||
| 1042 | (kssl_ctx->keytab_file) ? kssl_ctx->keytab_file : "NULL"); | ||
| 1043 | printf("\tkey [%d:%d]:\t", | ||
| 1044 | kssl_ctx->enctype, kssl_ctx->length); | ||
| 1045 | |||
| 1046 | for (i = 0; i < kssl_ctx->length && kssl_ctx->key; i++) { | ||
| 1047 | printf("%02x", kssl_ctx->key[i]); | ||
| 1048 | } | ||
| 1049 | printf("\n"); | ||
| 1050 | return; | ||
| 1051 | } | ||
| 1052 | |||
| 1053 | int | ||
| 1054 | kssl_keytab_is_available(KSSL_CTX *kssl_ctx) | ||
| 1055 | { | ||
| 1056 | krb5_context krb5context = NULL; | ||
| 1057 | krb5_keytab krb5keytab = NULL; | ||
| 1058 | krb5_keytab_entry entry; | ||
| 1059 | krb5_principal princ = NULL; | ||
| 1060 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | ||
| 1061 | int rc = 0; | ||
| 1062 | |||
| 1063 | if ((krb5rc = krb5_init_context(&krb5context))) | ||
| 1064 | return (0); | ||
| 1065 | |||
| 1066 | /* kssl_ctx->keytab_file == NULL ==> use Kerberos default | ||
| 1067 | */ | ||
| 1068 | if (kssl_ctx->keytab_file) { | ||
| 1069 | krb5rc = krb5_kt_resolve(krb5context, kssl_ctx->keytab_file, | ||
| 1070 | &krb5keytab); | ||
| 1071 | if (krb5rc) | ||
| 1072 | goto exit; | ||
| 1073 | } else { | ||
| 1074 | krb5rc = krb5_kt_default(krb5context, &krb5keytab); | ||
| 1075 | if (krb5rc) | ||
| 1076 | goto exit; | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | /* the host key we are looking for */ | ||
| 1080 | krb5rc = krb5_sname_to_principal(krb5context, NULL, | ||
| 1081 | kssl_ctx->service_name ? kssl_ctx->service_name : KRB5SVC, | ||
| 1082 | KRB5_NT_SRV_HST, &princ); | ||
| 1083 | |||
| 1084 | if (krb5rc) | ||
| 1085 | goto exit; | ||
| 1086 | |||
| 1087 | krb5rc = krb5_kt_get_entry(krb5context, krb5keytab, princ, | ||
| 1088 | 0 /* IGNORE_VNO */, | ||
| 1089 | 0 /* IGNORE_ENCTYPE */, | ||
| 1090 | &entry); | ||
| 1091 | if (krb5rc == KRB5_KT_NOTFOUND) { | ||
| 1092 | rc = 1; | ||
| 1093 | goto exit; | ||
| 1094 | } else if (krb5rc) | ||
| 1095 | goto exit; | ||
| 1096 | |||
| 1097 | krb5_kt_free_entry(krb5context, &entry); | ||
| 1098 | rc = 1; | ||
| 1099 | |||
| 1100 | exit: | ||
| 1101 | if (krb5keytab) | ||
| 1102 | krb5_kt_close(krb5context, krb5keytab); | ||
| 1103 | if (princ) | ||
| 1104 | krb5_free_principal(krb5context, princ); | ||
| 1105 | if (krb5context) | ||
| 1106 | krb5_free_context(krb5context); | ||
| 1107 | return (rc); | ||
| 1108 | } | ||
| 1109 | |||
| 1110 | int | ||
| 1111 | kssl_tgt_is_available(KSSL_CTX *kssl_ctx) | ||
| 1112 | { | ||
| 1113 | krb5_error_code krb5rc = KRB5KRB_ERR_GENERIC; | ||
| 1114 | krb5_context krb5context = NULL; | ||
| 1115 | krb5_ccache krb5ccdef = NULL; | ||
| 1116 | krb5_creds krb5creds, *krb5credsp = NULL; | ||
| 1117 | int rc = 0; | ||
| 1118 | |||
| 1119 | memset((char *)&krb5creds, 0, sizeof(krb5creds)); | ||
| 1120 | |||
| 1121 | if (!kssl_ctx) | ||
| 1122 | return (0); | ||
| 1123 | |||
| 1124 | if (!kssl_ctx->service_host) | ||
| 1125 | return (0); | ||
| 1126 | |||
| 1127 | if ((krb5rc = krb5_init_context(&krb5context)) != 0) | ||
| 1128 | goto err; | ||
| 1129 | |||
| 1130 | if ((krb5rc = krb5_sname_to_principal( | ||
| 1131 | krb5context, kssl_ctx->service_host, | ||
| 1132 | (kssl_ctx->service_name) ? kssl_ctx->service_name : KRB5SVC, | ||
| 1133 | KRB5_NT_SRV_HST, &krb5creds.server)) != 0) | ||
| 1134 | goto err; | ||
| 1135 | |||
| 1136 | if ((krb5rc = krb5_cc_default(krb5context, &krb5ccdef)) != 0) | ||
| 1137 | goto err; | ||
| 1138 | |||
| 1139 | if ((krb5rc = krb5_cc_get_principal(krb5context, krb5ccdef, | ||
| 1140 | &krb5creds.client)) != 0) | ||
| 1141 | goto err; | ||
| 1142 | |||
| 1143 | if ((krb5rc = krb5_get_credentials(krb5context, 0, krb5ccdef, | ||
| 1144 | &krb5creds, &krb5credsp)) != 0) | ||
| 1145 | goto err; | ||
| 1146 | |||
| 1147 | rc = 1; | ||
| 1148 | |||
| 1149 | err: | ||
| 1150 | #ifdef KSSL_DEBUG | ||
| 1151 | kssl_ctx_show(kssl_ctx); | ||
| 1152 | #endif /* KSSL_DEBUG */ | ||
| 1153 | |||
| 1154 | if (krb5creds.client) | ||
| 1155 | krb5_free_principal(krb5context, krb5creds.client); | ||
| 1156 | if (krb5creds.server) | ||
| 1157 | krb5_free_principal(krb5context, krb5creds.server); | ||
| 1158 | if (krb5context) | ||
| 1159 | krb5_free_context(krb5context); | ||
| 1160 | return (rc); | ||
| 1161 | } | ||
| 1162 | |||
| 1163 | void | ||
| 1164 | kssl_krb5_free_data_contents(krb5_context context, krb5_data *data) | ||
| 1165 | { | ||
| 1166 | #ifdef KRB5_HEIMDAL | ||
| 1167 | data->length = 0; | ||
| 1168 | if (data->data) | ||
| 1169 | free(data->data); | ||
| 1170 | #elif defined(KRB5_MIT_OLD11) | ||
| 1171 | if (data->data) { | ||
| 1172 | krb5_xfree(data->data); | ||
| 1173 | data->data = 0; | ||
| 1174 | } | ||
| 1175 | #else | ||
| 1176 | krb5_free_data_contents(NULL, data); | ||
| 1177 | #endif | ||
| 1178 | } | ||
| 1179 | |||
| 1180 | /* Given pointers to KerberosTime and struct tm structs, convert the | ||
| 1181 | ** KerberosTime string to struct tm. Note that KerberosTime is a | ||
| 1182 | ** ASN1_GENERALIZEDTIME value, constrained to GMT with no fractional | ||
| 1183 | ** seconds as defined in RFC 1510. | ||
| 1184 | ** Return pointer to the (partially) filled in struct tm on success, | ||
| 1185 | ** return NULL on failure. | ||
| 1186 | */ | ||
| 1187 | static struct tm * | ||
| 1188 | k_gmtime(ASN1_GENERALIZEDTIME *gtime, struct tm *k_tm) | ||
| 1189 | { | ||
| 1190 | char c, *p; | ||
| 1191 | |||
| 1192 | if (!k_tm) | ||
| 1193 | return NULL; | ||
| 1194 | if (gtime == NULL || gtime->length < 14) | ||
| 1195 | return NULL; | ||
| 1196 | if (gtime->data == NULL) | ||
| 1197 | return NULL; | ||
| 1198 | |||
| 1199 | p = (char *)>ime->data[14]; | ||
| 1200 | |||
| 1201 | c = *p; | ||
| 1202 | *p = '\0'; | ||
| 1203 | p -= 2; | ||
| 1204 | k_tm->tm_sec = atoi(p); | ||
| 1205 | *(p + 2) = c; | ||
| 1206 | c = *p; | ||
| 1207 | *p = '\0'; | ||
| 1208 | p -= 2; | ||
| 1209 | k_tm->tm_min = atoi(p); | ||
| 1210 | *(p + 2) = c; | ||
| 1211 | c = *p; | ||
| 1212 | *p = '\0'; | ||
| 1213 | p -= 2; | ||
| 1214 | k_tm->tm_hour = atoi(p); | ||
| 1215 | *(p + 2) = c; | ||
| 1216 | c = *p; | ||
| 1217 | *p = '\0'; | ||
| 1218 | p -= 2; | ||
| 1219 | k_tm->tm_mday = atoi(p); | ||
| 1220 | *(p + 2) = c; | ||
| 1221 | c = *p; | ||
| 1222 | *p = '\0'; | ||
| 1223 | p -= 2; | ||
| 1224 | k_tm->tm_mon = atoi(p) - 1; | ||
| 1225 | *(p + 2) = c; | ||
| 1226 | c = *p; | ||
| 1227 | *p = '\0'; | ||
| 1228 | p -= 4; | ||
| 1229 | k_tm->tm_year = atoi(p) - 1900; | ||
| 1230 | *(p + 4) = c; | ||
| 1231 | |||
| 1232 | return k_tm; | ||
| 1233 | } | ||
| 1234 | |||
| 1235 | |||
| 1236 | /* Helper function for kssl_validate_times(). | ||
| 1237 | ** We need context->clockskew, but krb5_context is an opaque struct. | ||
| 1238 | ** So we try to sneek the clockskew out through the replay cache. | ||
| 1239 | ** If that fails just return a likely default (300 seconds). | ||
| 1240 | */ | ||
| 1241 | static krb5_deltat | ||
| 1242 | get_rc_clockskew(krb5_context context) | ||
| 1243 | { | ||
| 1244 | krb5_rcache rc; | ||
| 1245 | krb5_deltat clockskew; | ||
| 1246 | |||
| 1247 | if (krb5_rc_default(context, &rc)) | ||
| 1248 | return KSSL_CLOCKSKEW; | ||
| 1249 | if (krb5_rc_initialize(context, rc, 0)) | ||
| 1250 | return KSSL_CLOCKSKEW; | ||
| 1251 | if (krb5_rc_get_lifespan(context, rc, &clockskew)) { | ||
| 1252 | clockskew = KSSL_CLOCKSKEW; | ||
| 1253 | } | ||
| 1254 | (void)krb5_rc_destroy(context, rc); | ||
| 1255 | return clockskew; | ||
| 1256 | } | ||
| 1257 | |||
| 1258 | |||
| 1259 | /* kssl_validate_times() combines (and more importantly exposes) | ||
| 1260 | ** the MIT KRB5 internal function krb5_validate_times() and the | ||
| 1261 | ** in_clock_skew() macro. The authenticator client time is checked | ||
| 1262 | ** to be within clockskew secs of the current time and the current | ||
| 1263 | ** time is checked to be within the ticket start and expire times. | ||
| 1264 | ** Either check may be omitted by supplying a NULL value. | ||
| 1265 | ** Returns 0 for valid times, SSL_R_KRB5* error codes otherwise. | ||
| 1266 | ** See Also: (Kerberos source)/krb5/lib/krb5/krb/valid_times.c | ||
| 1267 | ** 20010420 VRS | ||
| 1268 | */ | ||
| 1269 | krb5_error_code | ||
| 1270 | kssl_validate_times(krb5_timestamp atime, krb5_ticket_times *ttimes) | ||
| 1271 | { | ||
| 1272 | krb5_deltat skew; | ||
| 1273 | krb5_timestamp start, now; | ||
| 1274 | krb5_error_code rc; | ||
| 1275 | krb5_context context; | ||
| 1276 | |||
| 1277 | if ((rc = krb5_init_context(&context))) | ||
| 1278 | return SSL_R_KRB5_S_BAD_TICKET; | ||
| 1279 | skew = get_rc_clockskew(context); | ||
| 1280 | |||
| 1281 | if ((rc = krb5_timeofday(context, &now))) | ||
| 1282 | return SSL_R_KRB5_S_BAD_TICKET; | ||
| 1283 | krb5_free_context(context); | ||
| 1284 | |||
| 1285 | if (atime && labs(atime - now) >= skew) | ||
| 1286 | return SSL_R_KRB5_S_TKT_SKEW; | ||
| 1287 | |||
| 1288 | if (!ttimes) | ||
| 1289 | return 0; | ||
| 1290 | |||
| 1291 | start = (ttimes->starttime != 0) ? ttimes->starttime : ttimes->authtime; | ||
| 1292 | if (start - now > skew) | ||
| 1293 | return SSL_R_KRB5_S_TKT_NYV; | ||
| 1294 | if ((now - ttimes->endtime) > skew) | ||
| 1295 | return SSL_R_KRB5_S_TKT_EXPIRED; | ||
| 1296 | |||
| 1297 | #ifdef KSSL_DEBUG | ||
| 1298 | printf("kssl_validate_times: %d |<- | %d - %d | < %d ->| %d\n", | ||
| 1299 | start, atime, now, skew, ttimes->endtime); | ||
| 1300 | #endif /* KSSL_DEBUG */ | ||
| 1301 | |||
| 1302 | return 0; | ||
| 1303 | } | ||
| 1304 | |||
| 1305 | |||
| 1306 | /* Decode and decrypt given DER-encoded authenticator, then pass | ||
| 1307 | ** authenticator ctime back in *atimep (or 0 if time unavailable). | ||
| 1308 | ** Returns krb5_error_code and kssl_err on error. A NULL | ||
| 1309 | ** authenticator (authentp->length == 0) is not considered an error. | ||
| 1310 | ** Note that kssl_check_authent() makes use of the KRB5 session key; | ||
| 1311 | ** you must call kssl_sget_tkt() to get the key before calling this routine. | ||
| 1312 | */ | ||
| 1313 | krb5_error_code | ||
| 1314 | kssl_check_authent( | ||
| 1315 | /* IN */ KSSL_CTX *kssl_ctx, | ||
| 1316 | /* IN */ krb5_data *authentp, | ||
| 1317 | /* OUT */ krb5_timestamp *atimep, | ||
| 1318 | /* OUT */ KSSL_ERR *kssl_err ) | ||
| 1319 | { | ||
| 1320 | krb5_error_code krb5rc = 0; | ||
| 1321 | KRB5_ENCDATA *dec_authent = NULL; | ||
| 1322 | KRB5_AUTHENTBODY *auth = NULL; | ||
| 1323 | krb5_enctype enctype; | ||
| 1324 | EVP_CIPHER_CTX ciph_ctx; | ||
| 1325 | const EVP_CIPHER *enc = NULL; | ||
| 1326 | unsigned char iv[EVP_MAX_IV_LENGTH]; | ||
| 1327 | const unsigned char *p; | ||
| 1328 | unsigned char *unenc_authent; | ||
| 1329 | int outl, unencbufsize; | ||
| 1330 | struct tm tm_time, *tm_l, *tm_g; | ||
| 1331 | time_t now, tl, tg, tr, tz_offset; | ||
| 1332 | |||
| 1333 | EVP_CIPHER_CTX_init(&ciph_ctx); | ||
| 1334 | *atimep = 0; | ||
| 1335 | kssl_err_set(kssl_err, 0, ""); | ||
| 1336 | |||
| 1337 | #ifndef KRB5CHECKAUTH | ||
| 1338 | authentp = NULL; | ||
| 1339 | #else | ||
| 1340 | #if KRB5CHECKAUTH == 0 | ||
| 1341 | authentp = NULL; | ||
| 1342 | #endif | ||
| 1343 | #endif /* KRB5CHECKAUTH */ | ||
| 1344 | |||
| 1345 | if (authentp == NULL || authentp->length == 0) | ||
| 1346 | return 0; | ||
| 1347 | |||
| 1348 | #ifdef KSSL_DEBUG | ||
| 1349 | { | ||
| 1350 | unsigned int ui; | ||
| 1351 | printf("kssl_check_authent: authenticator[%d]:\n", authentp->length); | ||
| 1352 | p = authentp->data; | ||
| 1353 | |||
| 1354 | for (ui = 0; ui < authentp->length; ui++) printf("%02x ", p[ui]); | ||
| 1355 | printf("\n"); | ||
| 1356 | } | ||
| 1357 | #endif /* KSSL_DEBUG */ | ||
| 1358 | |||
| 1359 | unencbufsize = 2 * authentp->length; | ||
| 1360 | if ((unenc_authent = calloc(1, unencbufsize)) == NULL) { | ||
| 1361 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 1362 | "Unable to allocate authenticator buffer.\n"); | ||
| 1363 | krb5rc = KRB5KRB_ERR_GENERIC; | ||
| 1364 | goto err; | ||
| 1365 | } | ||
| 1366 | |||
| 1367 | p = (unsigned char *)authentp->data; | ||
| 1368 | if ((dec_authent = d2i_KRB5_ENCDATA(NULL, &p, | ||
| 1369 | (long)authentp->length)) == NULL) { | ||
| 1370 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 1371 | "Error decoding authenticator.\n"); | ||
| 1372 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | ||
| 1373 | goto err; | ||
| 1374 | } | ||
| 1375 | |||
| 1376 | enctype = dec_authent->etype->data[0]; /* should = kssl_ctx->enctype */ | ||
| 1377 | #if !defined(KRB5_MIT_OLD11) | ||
| 1378 | switch (enctype ) { | ||
| 1379 | case ENCTYPE_DES3_CBC_SHA1: /* EVP_des_ede3_cbc(); */ | ||
| 1380 | case ENCTYPE_DES3_CBC_SHA: | ||
| 1381 | case ENCTYPE_DES3_CBC_RAW: | ||
| 1382 | krb5rc = 0; | ||
| 1383 | /* Skip, can't handle derived keys */ | ||
| 1384 | goto err; | ||
| 1385 | } | ||
| 1386 | #endif | ||
| 1387 | enc = kssl_map_enc(enctype); | ||
| 1388 | memset(iv, 0, sizeof iv); | ||
| 1389 | /* per RFC 1510 */ | ||
| 1390 | |||
| 1391 | if (enc == NULL) { | ||
| 1392 | /* Disable kssl_check_authent for ENCTYPE_DES3_CBC_SHA1. | ||
| 1393 | ** This enctype indicates the authenticator was encrypted | ||
| 1394 | ** using key-usage derived keys which openssl cannot decrypt. | ||
| 1395 | */ | ||
| 1396 | goto err; | ||
| 1397 | } | ||
| 1398 | |||
| 1399 | if (!EVP_CipherInit(&ciph_ctx, enc, kssl_ctx->key, iv, 0)) { | ||
| 1400 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 1401 | "EVP_CipherInit error decrypting authenticator.\n"); | ||
| 1402 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | ||
| 1403 | goto err; | ||
| 1404 | } | ||
| 1405 | outl = dec_authent->cipher->length; | ||
| 1406 | if (!EVP_Cipher(&ciph_ctx, unenc_authent, dec_authent->cipher->data, outl)) { | ||
| 1407 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 1408 | "EVP_Cipher error decrypting authenticator.\n"); | ||
| 1409 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | ||
| 1410 | goto err; | ||
| 1411 | } | ||
| 1412 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
| 1413 | |||
| 1414 | #ifdef KSSL_DEBUG | ||
| 1415 | { | ||
| 1416 | int padl; | ||
| 1417 | printf("kssl_check_authent: decrypted authenticator[%d] =\n", outl); | ||
| 1418 | for (padl = 0; padl < outl; padl++) printf("%02x ", unenc_authent[padl]); | ||
| 1419 | printf("\n"); | ||
| 1420 | } | ||
| 1421 | #endif /* KSSL_DEBUG */ | ||
| 1422 | |||
| 1423 | if ((p = kssl_skip_confound(enctype, unenc_authent)) == NULL) { | ||
| 1424 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 1425 | "confounded by authenticator.\n"); | ||
| 1426 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | ||
| 1427 | goto err; | ||
| 1428 | } | ||
| 1429 | outl -= p - unenc_authent; | ||
| 1430 | |||
| 1431 | if ((auth = (KRB5_AUTHENTBODY *)d2i_KRB5_AUTHENT(NULL, &p, | ||
| 1432 | (long)outl)) == NULL) { | ||
| 1433 | kssl_err_set(kssl_err, SSL_R_KRB5_S_INIT, | ||
| 1434 | "Error decoding authenticator body.\n"); | ||
| 1435 | krb5rc = KRB5KRB_AP_ERR_BAD_INTEGRITY; | ||
| 1436 | goto err; | ||
| 1437 | } | ||
| 1438 | |||
| 1439 | memset(&tm_time, 0, sizeof(struct tm)); | ||
| 1440 | if (k_gmtime(auth->ctime, &tm_time) && | ||
| 1441 | ((tr = mktime(&tm_time)) != (time_t)(-1))) { | ||
| 1442 | now = time(&now); | ||
| 1443 | tm_l = localtime(&now); | ||
| 1444 | tl = mktime(tm_l); | ||
| 1445 | tm_g = gmtime(&now); | ||
| 1446 | tg = mktime(tm_g); | ||
| 1447 | tz_offset = tg - tl; | ||
| 1448 | |||
| 1449 | *atimep = (krb5_timestamp)(tr - tz_offset); | ||
| 1450 | } | ||
| 1451 | |||
| 1452 | #ifdef KSSL_DEBUG | ||
| 1453 | printf("kssl_check_authent: returns %d for client time ", *atimep); | ||
| 1454 | if (auth && auth->ctime && auth->ctime->length && auth->ctime->data) | ||
| 1455 | printf("%.*s\n", auth->ctime->length, auth->ctime->data); | ||
| 1456 | else | ||
| 1457 | printf("NULL\n"); | ||
| 1458 | #endif /* KSSL_DEBUG */ | ||
| 1459 | |||
| 1460 | err: | ||
| 1461 | if (auth) | ||
| 1462 | KRB5_AUTHENT_free((KRB5_AUTHENT *) auth); | ||
| 1463 | if (dec_authent) | ||
| 1464 | KRB5_ENCDATA_free(dec_authent); | ||
| 1465 | if (unenc_authent) | ||
| 1466 | free(unenc_authent); | ||
| 1467 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
| 1468 | return krb5rc; | ||
| 1469 | } | ||
| 1470 | |||
| 1471 | |||
| 1472 | /* Replaces krb5_build_principal_ext(), with varargs length == 2 (svc, host), | ||
| 1473 | ** because I dont't know how to stub varargs. | ||
| 1474 | ** Returns krb5_error_code == ENOMEM on alloc error, otherwise | ||
| 1475 | ** passes back newly constructed principal, which should be freed by caller. | ||
| 1476 | */ | ||
| 1477 | krb5_error_code | ||
| 1478 | kssl_build_principal_2( | ||
| 1479 | /* UPDATE */ krb5_context context, | ||
| 1480 | /* OUT */ krb5_principal *princ, | ||
| 1481 | /* IN */ int rlen, const char *realm, | ||
| 1482 | /* IN */ int slen, const char *svc, | ||
| 1483 | /* IN */ int hlen, const char *host) | ||
| 1484 | { | ||
| 1485 | krb5_data *p_data = NULL; | ||
| 1486 | krb5_principal new_p = NULL; | ||
| 1487 | char *new_r = NULL; | ||
| 1488 | |||
| 1489 | if ((p_data = calloc(2, sizeof(krb5_data))) == NULL || | ||
| 1490 | (new_p = calloc(1, sizeof(krb5_principal_data))) == NULL) | ||
| 1491 | goto err; | ||
| 1492 | new_p->length = 2; | ||
| 1493 | new_p->data = p_data; | ||
| 1494 | |||
| 1495 | if ((new_r = calloc(1, rlen + 1)) == NULL) | ||
| 1496 | goto err; | ||
| 1497 | memcpy(new_r, realm, rlen); | ||
| 1498 | krb5_princ_set_realm_length(context, new_p, rlen); | ||
| 1499 | krb5_princ_set_realm_data(context, new_p, new_r); | ||
| 1500 | |||
| 1501 | if ((new_p->data[0].data = calloc(1, slen + 1)) == NULL) | ||
| 1502 | goto err; | ||
| 1503 | memcpy(new_p->data[0].data, svc, slen); | ||
| 1504 | new_p->data[0].length = slen; | ||
| 1505 | |||
| 1506 | if ((new_p->data[1].data = calloc(1, hlen + 1)) == NULL) | ||
| 1507 | goto err; | ||
| 1508 | memcpy(new_p->data[1].data, host, hlen); | ||
| 1509 | new_p->data[1].length = hlen; | ||
| 1510 | |||
| 1511 | krb5_princ_type(context, new_p) = KRB5_NT_UNKNOWN; | ||
| 1512 | *princ = new_p; | ||
| 1513 | return 0; | ||
| 1514 | |||
| 1515 | err: | ||
| 1516 | if (new_p && new_p[0].data) | ||
| 1517 | free(new_p[0].data); | ||
| 1518 | if (new_p && new_p[1].data) | ||
| 1519 | free(new_p[1].data); | ||
| 1520 | if (new_p) | ||
| 1521 | free(new_p); | ||
| 1522 | if (new_r) | ||
| 1523 | free(new_r); | ||
| 1524 | return ENOMEM; | ||
| 1525 | } | ||
| 1526 | |||
| 1527 | void | ||
| 1528 | SSL_set0_kssl_ctx(SSL *s, KSSL_CTX *kctx) | ||
| 1529 | { | ||
| 1530 | s->kssl_ctx = kctx; | ||
| 1531 | } | ||
| 1532 | |||
| 1533 | KSSL_CTX * | ||
| 1534 | SSL_get0_kssl_ctx(SSL *s) | ||
| 1535 | { | ||
| 1536 | return s->kssl_ctx; | ||
| 1537 | } | ||
| 1538 | |||
| 1539 | char * | ||
| 1540 | kssl_ctx_get0_client_princ(KSSL_CTX *kctx) | ||
| 1541 | { | ||
| 1542 | if (kctx) | ||
| 1543 | return kctx->client_princ; | ||
| 1544 | return NULL; | ||
| 1545 | } | ||
| 1546 | |||
| 1547 | #else /* !OPENSSL_NO_KRB5 */ | ||
| 1548 | |||
| 1549 | #endif /* !OPENSSL_NO_KRB5 */ | ||
diff --git a/src/lib/libssl/src/ssl/kssl.h b/src/lib/libssl/src/ssl/kssl.h index ec75188a8e..5070066cb3 100644 --- a/src/lib/libssl/src/ssl/kssl.h +++ b/src/lib/libssl/src/ssl/kssl.h | |||
| @@ -65,118 +65,4 @@ | |||
| 65 | 65 | ||
| 66 | #include <openssl/opensslconf.h> | 66 | #include <openssl/opensslconf.h> |
| 67 | 67 | ||
| 68 | #ifndef OPENSSL_NO_KRB5 | ||
| 69 | |||
| 70 | #include <stdio.h> | ||
| 71 | #include <ctype.h> | ||
| 72 | #include <krb5.h> | ||
| 73 | |||
| 74 | #ifdef __cplusplus | ||
| 75 | extern "C" { | ||
| 76 | #endif | ||
| 77 | |||
| 78 | /* | ||
| 79 | ** Depending on which KRB5 implementation used, some types from | ||
| 80 | ** the other may be missing. Resolve that here and now | ||
| 81 | */ | ||
| 82 | #ifdef KRB5_HEIMDAL | ||
| 83 | typedef unsigned char krb5_octet; | ||
| 84 | #define FAR | ||
| 85 | #else | ||
| 86 | |||
| 87 | #ifndef FAR | ||
| 88 | #define FAR | ||
| 89 | #endif | ||
| 90 | |||
| 91 | #endif | ||
| 92 | |||
| 93 | /* Uncomment this to debug kssl problems or | ||
| 94 | ** to trace usage of the Kerberos session key | ||
| 95 | ** | ||
| 96 | ** #define KSSL_DEBUG | ||
| 97 | */ | ||
| 98 | |||
| 99 | #ifndef KRB5SVC | ||
| 100 | #define KRB5SVC "host" | ||
| 101 | #endif | ||
| 102 | |||
| 103 | #ifndef KRB5KEYTAB | ||
| 104 | #define KRB5KEYTAB "/etc/krb5.keytab" | ||
| 105 | #endif | ||
| 106 | |||
| 107 | #ifndef KRB5SENDAUTH | ||
| 108 | #define KRB5SENDAUTH 1 | ||
| 109 | #endif | ||
| 110 | |||
| 111 | #ifndef KRB5CHECKAUTH | ||
| 112 | #define KRB5CHECKAUTH 1 | ||
| 113 | #endif | ||
| 114 | |||
| 115 | #ifndef KSSL_CLOCKSKEW | ||
| 116 | #define KSSL_CLOCKSKEW 300; | ||
| 117 | #endif | ||
| 118 | |||
| 119 | #define KSSL_ERR_MAX 256 | ||
| 120 | typedef struct kssl_err_st { | ||
| 121 | int reason; | ||
| 122 | char text[KSSL_ERR_MAX]; | ||
| 123 | } KSSL_ERR; | ||
| 124 | |||
| 125 | |||
| 126 | /* Context for passing | ||
| 127 | ** (1) Kerberos session key to SSL, and | ||
| 128 | ** (2) Config data between application and SSL lib | ||
| 129 | */ | ||
| 130 | typedef struct kssl_ctx_st { | ||
| 131 | /* used by: disposition: */ | ||
| 132 | char *service_name; /* C,S default ok (kssl) */ | ||
| 133 | char *service_host; /* C input, REQUIRED */ | ||
| 134 | char *client_princ; /* S output from krb5 ticket */ | ||
| 135 | char *keytab_file; /* S NULL (/etc/krb5.keytab) */ | ||
| 136 | char *cred_cache; /* C NULL (default) */ | ||
| 137 | krb5_enctype enctype; | ||
| 138 | int length; | ||
| 139 | krb5_octet FAR *key; | ||
| 140 | } KSSL_CTX; | ||
| 141 | |||
| 142 | #define KSSL_CLIENT 1 | ||
| 143 | #define KSSL_SERVER 2 | ||
| 144 | #define KSSL_SERVICE 3 | ||
| 145 | #define KSSL_KEYTAB 4 | ||
| 146 | |||
| 147 | #define KSSL_CTX_OK 0 | ||
| 148 | #define KSSL_CTX_ERR 1 | ||
| 149 | #define KSSL_NOMEM 2 | ||
| 150 | |||
| 151 | /* Public (for use by applications that use OpenSSL with Kerberos 5 support */ | ||
| 152 | krb5_error_code kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text); | ||
| 153 | KSSL_CTX *kssl_ctx_new(void); | ||
| 154 | KSSL_CTX *kssl_ctx_free(KSSL_CTX *kssl_ctx); | ||
| 155 | void kssl_ctx_show(KSSL_CTX *kssl_ctx); | ||
| 156 | krb5_error_code kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which, | ||
| 157 | krb5_data *realm, krb5_data *entity, int nentities); | ||
| 158 | krb5_error_code kssl_cget_tkt(KSSL_CTX *kssl_ctx, krb5_data **enc_tktp, | ||
| 159 | krb5_data *authenp, KSSL_ERR *kssl_err); | ||
| 160 | krb5_error_code kssl_sget_tkt(KSSL_CTX *kssl_ctx, krb5_data *indata, | ||
| 161 | krb5_ticket_times *ttimes, KSSL_ERR *kssl_err); | ||
| 162 | krb5_error_code kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session); | ||
| 163 | void kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text); | ||
| 164 | void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data); | ||
| 165 | krb5_error_code kssl_build_principal_2(krb5_context context, | ||
| 166 | krb5_principal *princ, int rlen, const char *realm, int slen, | ||
| 167 | const char *svc, int hlen, const char *host); | ||
| 168 | krb5_error_code kssl_validate_times(krb5_timestamp atime, | ||
| 169 | krb5_ticket_times *ttimes); | ||
| 170 | krb5_error_code kssl_check_authent(KSSL_CTX *kssl_ctx, krb5_data *authentp, | ||
| 171 | krb5_timestamp *atimep, KSSL_ERR *kssl_err); | ||
| 172 | unsigned char *kssl_skip_confound(krb5_enctype enctype, unsigned char *authn); | ||
| 173 | |||
| 174 | void SSL_set0_kssl_ctx(SSL *s, KSSL_CTX *kctx); | ||
| 175 | KSSL_CTX *SSL_get0_kssl_ctx(SSL *s); | ||
| 176 | char *kssl_ctx_get0_client_princ(KSSL_CTX *kctx); | ||
| 177 | |||
| 178 | #ifdef __cplusplus | ||
| 179 | } | ||
| 180 | #endif | ||
| 181 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 182 | #endif /* KSSL_H */ | 68 | #endif /* KSSL_H */ |
diff --git a/src/lib/libssl/src/ssl/kssl_lcl.h b/src/lib/libssl/src/ssl/kssl_lcl.h index c039c91b4e..35e203b7d6 100644 --- a/src/lib/libssl/src/ssl/kssl_lcl.h +++ b/src/lib/libssl/src/ssl/kssl_lcl.h | |||
| @@ -61,27 +61,4 @@ | |||
| 61 | 61 | ||
| 62 | #include <openssl/kssl.h> | 62 | #include <openssl/kssl.h> |
| 63 | 63 | ||
| 64 | #ifndef OPENSSL_NO_KRB5 | ||
| 65 | |||
| 66 | #ifdef __cplusplus | ||
| 67 | extern "C" { | ||
| 68 | #endif | ||
| 69 | |||
| 70 | /* Private (internal to OpenSSL) */ | ||
| 71 | void print_krb5_data(char *label, krb5_data *kdata); | ||
| 72 | void print_krb5_authdata(char *label, krb5_authdata **adata); | ||
| 73 | void print_krb5_keyblock(char *label, krb5_keyblock *keyblk); | ||
| 74 | |||
| 75 | char *kstring(char *string); | ||
| 76 | char *knumber(int len, krb5_octet *contents); | ||
| 77 | |||
| 78 | const EVP_CIPHER *kssl_map_enc(krb5_enctype enctype); | ||
| 79 | |||
| 80 | int kssl_keytab_is_available(KSSL_CTX *kssl_ctx); | ||
| 81 | int kssl_tgt_is_available(KSSL_CTX *kssl_ctx); | ||
| 82 | |||
| 83 | #ifdef __cplusplus | ||
| 84 | } | ||
| 85 | #endif | ||
| 86 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 87 | #endif /* KSSL_LCL_H */ | 64 | #endif /* KSSL_LCL_H */ |
diff --git a/src/lib/libssl/src/ssl/s3_clnt.c b/src/lib/libssl/src/ssl/s3_clnt.c index eb55fc9682..68817cd33a 100644 --- a/src/lib/libssl/src/ssl/s3_clnt.c +++ b/src/lib/libssl/src/ssl/s3_clnt.c | |||
| @@ -369,17 +369,6 @@ ssl3_connect(SSL *s) | |||
| 369 | ret = ssl3_get_server_done(s); | 369 | ret = ssl3_get_server_done(s); |
| 370 | if (ret <= 0) | 370 | if (ret <= 0) |
| 371 | goto end; | 371 | goto end; |
| 372 | #ifndef OPENSSL_NO_SRP | ||
| 373 | if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { | ||
| 374 | if ((ret = SRP_Calc_A_param(s)) <= 0) { | ||
| 375 | SSLerr(SSL_F_SSL3_CONNECT, | ||
| 376 | SSL_R_SRP_A_CALC); | ||
| 377 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 378 | SSL_AD_INTERNAL_ERROR); | ||
| 379 | goto end; | ||
| 380 | } | ||
| 381 | } | ||
| 382 | #endif | ||
| 383 | if (s->s3->tmp.cert_req) | 372 | if (s->s3->tmp.cert_req) |
| 384 | s->state = SSL3_ST_CW_CERT_A; | 373 | s->state = SSL3_ST_CW_CERT_A; |
| 385 | else | 374 | else |
| @@ -1137,10 +1126,6 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1137 | 1126 | ||
| 1138 | i = ssl_verify_cert_chain(s, sk); | 1127 | i = ssl_verify_cert_chain(s, sk); |
| 1139 | if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0) | 1128 | if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0) |
| 1140 | #ifndef OPENSSL_NO_KRB5 | ||
| 1141 | && !((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) && | ||
| 1142 | (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)) | ||
| 1143 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 1144 | ) { | 1129 | ) { |
| 1145 | al = ssl_verify_alarm_type(s->verify_result); | 1130 | al = ssl_verify_alarm_type(s->verify_result); |
| 1146 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | 1131 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| @@ -1361,81 +1346,6 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1361 | n -= param_len; | 1346 | n -= param_len; |
| 1362 | } else | 1347 | } else |
| 1363 | #endif /* !OPENSSL_NO_PSK */ | 1348 | #endif /* !OPENSSL_NO_PSK */ |
| 1364 | #ifndef OPENSSL_NO_SRP | ||
| 1365 | if (alg_k & SSL_kSRP) { | ||
| 1366 | n2s(p, i); | ||
| 1367 | param_len = i + 2; | ||
| 1368 | if (param_len > n) { | ||
| 1369 | al = SSL_AD_DECODE_ERROR; | ||
| 1370 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1371 | SSL_R_BAD_SRP_N_LENGTH); | ||
| 1372 | goto f_err; | ||
| 1373 | } | ||
| 1374 | if (!(s->srp_ctx.N = BN_bin2bn(p, i, NULL))) { | ||
| 1375 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1376 | ERR_R_BN_LIB); | ||
| 1377 | goto err; | ||
| 1378 | } | ||
| 1379 | p += i; | ||
| 1380 | |||
| 1381 | n2s(p, i); | ||
| 1382 | param_len += i + 2; | ||
| 1383 | if (param_len > n) { | ||
| 1384 | al = SSL_AD_DECODE_ERROR; | ||
| 1385 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1386 | SSL_R_BAD_SRP_G_LENGTH); | ||
| 1387 | goto f_err; | ||
| 1388 | } | ||
| 1389 | if (!(s->srp_ctx.g = BN_bin2bn(p, i, NULL))) { | ||
| 1390 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1391 | ERR_R_BN_LIB); | ||
| 1392 | goto err; | ||
| 1393 | } | ||
| 1394 | p += i; | ||
| 1395 | |||
| 1396 | i = (unsigned int)(p[0]); | ||
| 1397 | p++; | ||
| 1398 | param_len += i + 1; | ||
| 1399 | if (param_len > n) { | ||
| 1400 | al = SSL_AD_DECODE_ERROR; | ||
| 1401 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1402 | SSL_R_BAD_SRP_S_LENGTH); | ||
| 1403 | goto f_err; | ||
| 1404 | } | ||
| 1405 | if (!(s->srp_ctx.s = BN_bin2bn(p, i, NULL))) { | ||
| 1406 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1407 | ERR_R_BN_LIB); | ||
| 1408 | goto err; | ||
| 1409 | } | ||
| 1410 | p += i; | ||
| 1411 | |||
| 1412 | n2s(p, i); | ||
| 1413 | param_len += i + 2; | ||
| 1414 | if (param_len > n) { | ||
| 1415 | al = SSL_AD_DECODE_ERROR; | ||
| 1416 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1417 | SSL_R_BAD_SRP_B_LENGTH); | ||
| 1418 | goto f_err; | ||
| 1419 | } | ||
| 1420 | if (!(s->srp_ctx.B = BN_bin2bn(p, i, NULL))) { | ||
| 1421 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1422 | ERR_R_BN_LIB); | ||
| 1423 | goto err; | ||
| 1424 | } | ||
| 1425 | p += i; | ||
| 1426 | n -= param_len; | ||
| 1427 | |||
| 1428 | /* We must check if there is a certificate */ | ||
| 1429 | if (alg_a & SSL_aRSA) | ||
| 1430 | pkey = X509_get_pubkey( | ||
| 1431 | s->session->sess_cert->peer_pkeys[ | ||
| 1432 | SSL_PKEY_RSA_ENC].x509); | ||
| 1433 | else if (alg_a & SSL_aDSS) | ||
| 1434 | pkey = X509_get_pubkey( | ||
| 1435 | s->session->sess_cert->peer_pkeys[ | ||
| 1436 | SSL_PKEY_DSA_SIGN].x509); | ||
| 1437 | } else | ||
| 1438 | #endif /* !OPENSSL_NO_SRP */ | ||
| 1439 | if (alg_k & SSL_kRSA) { | 1349 | if (alg_k & SSL_kRSA) { |
| 1440 | if ((rsa = RSA_new()) == NULL) { | 1350 | if ((rsa = RSA_new()) == NULL) { |
| 1441 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1351 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| @@ -2156,9 +2066,6 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2156 | unsigned long alg_k; | 2066 | unsigned long alg_k; |
| 2157 | unsigned char *q; | 2067 | unsigned char *q; |
| 2158 | EVP_PKEY *pkey = NULL; | 2068 | EVP_PKEY *pkey = NULL; |
| 2159 | #ifndef OPENSSL_NO_KRB5 | ||
| 2160 | KSSL_ERR kssl_err; | ||
| 2161 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 2162 | #ifndef OPENSSL_NO_ECDH | 2069 | #ifndef OPENSSL_NO_ECDH |
| 2163 | EC_KEY *clnt_ecdh = NULL; | 2070 | EC_KEY *clnt_ecdh = NULL; |
| 2164 | const EC_POINT *srvr_ecpoint = NULL; | 2071 | const EC_POINT *srvr_ecpoint = NULL; |
| @@ -2226,140 +2133,6 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2226 | s, s->session->master_key, tmp_buf, sizeof tmp_buf); | 2133 | s, s->session->master_key, tmp_buf, sizeof tmp_buf); |
| 2227 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); | 2134 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); |
| 2228 | } | 2135 | } |
| 2229 | #ifndef OPENSSL_NO_KRB5 | ||
| 2230 | else if (alg_k & SSL_kKRB5) { | ||
| 2231 | krb5_error_code krb5rc; | ||
| 2232 | KSSL_CTX *kssl_ctx = s->kssl_ctx; | ||
| 2233 | /* krb5_data krb5_ap_req; */ | ||
| 2234 | krb5_data *enc_ticket; | ||
| 2235 | krb5_data authenticator, *authp = NULL; | ||
| 2236 | EVP_CIPHER_CTX ciph_ctx; | ||
| 2237 | const EVP_CIPHER *enc = NULL; | ||
| 2238 | unsigned char iv[EVP_MAX_IV_LENGTH]; | ||
| 2239 | unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; | ||
| 2240 | unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH | ||
| 2241 | + EVP_MAX_IV_LENGTH]; | ||
| 2242 | int padl, outl = sizeof(epms); | ||
| 2243 | |||
| 2244 | EVP_CIPHER_CTX_init(&ciph_ctx); | ||
| 2245 | |||
| 2246 | #ifdef KSSL_DEBUG | ||
| 2247 | printf("ssl3_send_client_key_exchange(%lx & %lx)\n", | ||
| 2248 | alg_k, SSL_kKRB5); | ||
| 2249 | #endif /* KSSL_DEBUG */ | ||
| 2250 | |||
| 2251 | authp = NULL; | ||
| 2252 | #ifdef KRB5SENDAUTH | ||
| 2253 | if (KRB5SENDAUTH) | ||
| 2254 | authp = &authenticator; | ||
| 2255 | #endif /* KRB5SENDAUTH */ | ||
| 2256 | |||
| 2257 | krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, | ||
| 2258 | authp, &kssl_err); | ||
| 2259 | enc = kssl_map_enc(kssl_ctx->enctype); | ||
| 2260 | if (enc == NULL) | ||
| 2261 | goto err; | ||
| 2262 | #ifdef KSSL_DEBUG | ||
| 2263 | { | ||
| 2264 | printf("kssl_cget_tkt rtn %d\n", krb5rc); | ||
| 2265 | if (krb5rc && kssl_err.text) | ||
| 2266 | printf("kssl_cget_tkt kssl_err=%s\n", | ||
| 2267 | kssl_err.text); | ||
| 2268 | } | ||
| 2269 | #endif /* KSSL_DEBUG */ | ||
| 2270 | |||
| 2271 | if (krb5rc) { | ||
| 2272 | ssl3_send_alert(s, SSL3_AL_FATAL, | ||
| 2273 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 2274 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2275 | kssl_err.reason); | ||
| 2276 | goto err; | ||
| 2277 | } | ||
| 2278 | |||
| 2279 | /* | ||
| 2280 | * 20010406 VRS - Earlier versions used KRB5 AP_REQ | ||
| 2281 | * in place of RFC 2712 KerberosWrapper, as in: | ||
| 2282 | * | ||
| 2283 | * Send ticket (copy to *p, set n = length) | ||
| 2284 | * n = krb5_ap_req.length; | ||
| 2285 | * memcpy(p, krb5_ap_req.data, krb5_ap_req.length); | ||
| 2286 | * if (krb5_ap_req.data) | ||
| 2287 | * kssl_krb5_free_data_contents(NULL,&krb5_ap_req); | ||
| 2288 | * | ||
| 2289 | * Now using real RFC 2712 KerberosWrapper | ||
| 2290 | * (Thanks to Simon Wilkinson <sxw@sxw.org.uk>) | ||
| 2291 | * Note: 2712 "opaque" types are here replaced | ||
| 2292 | * with a 2-byte length followed by the value. | ||
| 2293 | * Example: | ||
| 2294 | * KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms | ||
| 2295 | * Where "xx xx" = length bytes. Shown here with | ||
| 2296 | * optional authenticator omitted. | ||
| 2297 | */ | ||
| 2298 | |||
| 2299 | /* KerberosWrapper.Ticket */ | ||
| 2300 | s2n(enc_ticket->length, p); | ||
| 2301 | memcpy(p, enc_ticket->data, enc_ticket->length); | ||
| 2302 | p += enc_ticket->length; | ||
| 2303 | n = enc_ticket->length + 2; | ||
| 2304 | |||
| 2305 | /* KerberosWrapper.Authenticator */ | ||
| 2306 | if (authp && authp->length) { | ||
| 2307 | s2n(authp->length, p); | ||
| 2308 | memcpy(p, authp->data, authp->length); | ||
| 2309 | p += authp->length; | ||
| 2310 | n += authp->length + 2; | ||
| 2311 | |||
| 2312 | free(authp->data); | ||
| 2313 | authp->data = NULL; | ||
| 2314 | authp->length = 0; | ||
| 2315 | } else { | ||
| 2316 | s2n(0,p);/* null authenticator length */ | ||
| 2317 | n += 2; | ||
| 2318 | } | ||
| 2319 | |||
| 2320 | tmp_buf[0] = s->client_version >> 8; | ||
| 2321 | tmp_buf[1] = s->client_version & 0xff; | ||
| 2322 | if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0) | ||
| 2323 | goto err; | ||
| 2324 | |||
| 2325 | /* | ||
| 2326 | * 20010420 VRS. Tried it this way; failed. | ||
| 2327 | * EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); | ||
| 2328 | * EVP_CIPHER_CTX_set_key_length(&ciph_ctx, | ||
| 2329 | * kssl_ctx->length); | ||
| 2330 | * EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv); | ||
| 2331 | */ | ||
| 2332 | |||
| 2333 | memset(iv, 0, sizeof iv); | ||
| 2334 | /* per RFC 1510 */ | ||
| 2335 | EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, | ||
| 2336 | kssl_ctx->key, iv); | ||
| 2337 | EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf, | ||
| 2338 | sizeof tmp_buf); | ||
| 2339 | EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl); | ||
| 2340 | outl += padl; | ||
| 2341 | if (outl > (int)sizeof epms) { | ||
| 2342 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2343 | ERR_R_INTERNAL_ERROR); | ||
| 2344 | goto err; | ||
| 2345 | } | ||
| 2346 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
| 2347 | |||
| 2348 | /* KerberosWrapper.EncryptedPreMasterSecret */ | ||
| 2349 | s2n(outl, p); | ||
| 2350 | memcpy(p, epms, outl); | ||
| 2351 | p += outl; | ||
| 2352 | n += outl + 2; | ||
| 2353 | |||
| 2354 | s->session->master_key_length = | ||
| 2355 | s->method->ssl3_enc->generate_master_secret(s, | ||
| 2356 | s->session->master_key, | ||
| 2357 | tmp_buf, sizeof tmp_buf); | ||
| 2358 | |||
| 2359 | OPENSSL_cleanse(tmp_buf, sizeof tmp_buf); | ||
| 2360 | OPENSSL_cleanse(epms, outl); | ||
| 2361 | } | ||
| 2362 | #endif | ||
| 2363 | #ifndef OPENSSL_NO_DH | 2136 | #ifndef OPENSSL_NO_DH |
| 2364 | else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { | 2137 | else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { |
| 2365 | DH *dh_srvr, *dh_clnt; | 2138 | DH *dh_srvr, *dh_clnt; |
| @@ -2716,37 +2489,6 @@ ssl3_send_client_key_exchange(SSL *s) | |||
| 2716 | EVP_PKEY_free(pub_key); | 2489 | EVP_PKEY_free(pub_key); |
| 2717 | 2490 | ||
| 2718 | } | 2491 | } |
| 2719 | #ifndef OPENSSL_NO_SRP | ||
| 2720 | else if (alg_k & SSL_kSRP) { | ||
| 2721 | if (s->srp_ctx.A != NULL) { | ||
| 2722 | /* send off the data */ | ||
| 2723 | n = BN_num_bytes(s->srp_ctx.A); | ||
| 2724 | s2n(n, p); | ||
| 2725 | BN_bn2bin(s->srp_ctx.A, p); | ||
| 2726 | n += 2; | ||
| 2727 | } else { | ||
| 2728 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2729 | ERR_R_INTERNAL_ERROR); | ||
| 2730 | goto err; | ||
| 2731 | } | ||
| 2732 | if (s->session->srp_username != NULL) | ||
| 2733 | free(s->session->srp_username); | ||
| 2734 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); | ||
| 2735 | if (s->session->srp_username == NULL) { | ||
| 2736 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2737 | ERR_R_MALLOC_FAILURE); | ||
| 2738 | goto err; | ||
| 2739 | } | ||
| 2740 | |||
| 2741 | if ((s->session->master_key_length = | ||
| 2742 | SRP_generate_client_master_secret(s, | ||
| 2743 | s->session->master_key)) < 0) { | ||
| 2744 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
| 2745 | ERR_R_INTERNAL_ERROR); | ||
| 2746 | goto err; | ||
| 2747 | } | ||
| 2748 | } | ||
| 2749 | #endif | ||
| 2750 | #ifndef OPENSSL_NO_PSK | 2492 | #ifndef OPENSSL_NO_PSK |
| 2751 | else if (alg_k & SSL_kPSK) { | 2493 | else if (alg_k & SSL_kPSK) { |
| 2752 | char identity[PSK_MAX_IDENTITY_LEN]; | 2494 | char identity[PSK_MAX_IDENTITY_LEN]; |
diff --git a/src/lib/libssl/src/ssl/s3_lib.c b/src/lib/libssl/src/ssl/s3_lib.c index 12ce8a1605..c68748809c 100644 --- a/src/lib/libssl/src/ssl/s3_lib.c +++ b/src/lib/libssl/src/ssl/s3_lib.c | |||
| @@ -605,232 +605,6 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] = { | |||
| 605 | 168, | 605 | 168, |
| 606 | 168, | 606 | 168, |
| 607 | }, | 607 | }, |
| 608 | #ifndef OPENSSL_NO_KRB5 | ||
| 609 | /* The Kerberos ciphers*/ | ||
| 610 | /* Cipher 1E */ | ||
| 611 | { | ||
| 612 | 1, | ||
| 613 | SSL3_TXT_KRB5_DES_64_CBC_SHA, | ||
| 614 | SSL3_CK_KRB5_DES_64_CBC_SHA, | ||
| 615 | SSL_kKRB5, | ||
| 616 | SSL_aKRB5, | ||
| 617 | SSL_DES, | ||
| 618 | SSL_SHA1, | ||
| 619 | SSL_SSLV3, | ||
| 620 | SSL_NOT_EXP|SSL_LOW, | ||
| 621 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 622 | 56, | ||
| 623 | 56, | ||
| 624 | }, | ||
| 625 | |||
| 626 | /* Cipher 1F */ | ||
| 627 | { | ||
| 628 | 1, | ||
| 629 | SSL3_TXT_KRB5_DES_192_CBC3_SHA, | ||
| 630 | SSL3_CK_KRB5_DES_192_CBC3_SHA, | ||
| 631 | SSL_kKRB5, | ||
| 632 | SSL_aKRB5, | ||
| 633 | SSL_3DES, | ||
| 634 | SSL_SHA1, | ||
| 635 | SSL_SSLV3, | ||
| 636 | SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, | ||
| 637 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 638 | 168, | ||
| 639 | 168, | ||
| 640 | }, | ||
| 641 | |||
| 642 | /* Cipher 20 */ | ||
| 643 | { | ||
| 644 | 1, | ||
| 645 | SSL3_TXT_KRB5_RC4_128_SHA, | ||
| 646 | SSL3_CK_KRB5_RC4_128_SHA, | ||
| 647 | SSL_kKRB5, | ||
| 648 | SSL_aKRB5, | ||
| 649 | SSL_RC4, | ||
| 650 | SSL_SHA1, | ||
| 651 | SSL_SSLV3, | ||
| 652 | SSL_NOT_EXP|SSL_MEDIUM, | ||
| 653 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 654 | 128, | ||
| 655 | 128, | ||
| 656 | }, | ||
| 657 | |||
| 658 | /* Cipher 21 */ | ||
| 659 | { | ||
| 660 | 1, | ||
| 661 | SSL3_TXT_KRB5_IDEA_128_CBC_SHA, | ||
| 662 | SSL3_CK_KRB5_IDEA_128_CBC_SHA, | ||
| 663 | SSL_kKRB5, | ||
| 664 | SSL_aKRB5, | ||
| 665 | SSL_IDEA, | ||
| 666 | SSL_SHA1, | ||
| 667 | SSL_SSLV3, | ||
| 668 | SSL_NOT_EXP|SSL_MEDIUM, | ||
| 669 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 670 | 128, | ||
| 671 | 128, | ||
| 672 | }, | ||
| 673 | |||
| 674 | /* Cipher 22 */ | ||
| 675 | { | ||
| 676 | 1, | ||
| 677 | SSL3_TXT_KRB5_DES_64_CBC_MD5, | ||
| 678 | SSL3_CK_KRB5_DES_64_CBC_MD5, | ||
| 679 | SSL_kKRB5, | ||
| 680 | SSL_aKRB5, | ||
| 681 | SSL_DES, | ||
| 682 | SSL_MD5, | ||
| 683 | SSL_SSLV3, | ||
| 684 | SSL_NOT_EXP|SSL_LOW, | ||
| 685 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 686 | 56, | ||
| 687 | 56, | ||
| 688 | }, | ||
| 689 | |||
| 690 | /* Cipher 23 */ | ||
| 691 | { | ||
| 692 | 1, | ||
| 693 | SSL3_TXT_KRB5_DES_192_CBC3_MD5, | ||
| 694 | SSL3_CK_KRB5_DES_192_CBC3_MD5, | ||
| 695 | SSL_kKRB5, | ||
| 696 | SSL_aKRB5, | ||
| 697 | SSL_3DES, | ||
| 698 | SSL_MD5, | ||
| 699 | SSL_SSLV3, | ||
| 700 | SSL_NOT_EXP|SSL_HIGH, | ||
| 701 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 702 | 168, | ||
| 703 | 168, | ||
| 704 | }, | ||
| 705 | |||
| 706 | /* Cipher 24 */ | ||
| 707 | { | ||
| 708 | 1, | ||
| 709 | SSL3_TXT_KRB5_RC4_128_MD5, | ||
| 710 | SSL3_CK_KRB5_RC4_128_MD5, | ||
| 711 | SSL_kKRB5, | ||
| 712 | SSL_aKRB5, | ||
| 713 | SSL_RC4, | ||
| 714 | SSL_MD5, | ||
| 715 | SSL_SSLV3, | ||
| 716 | SSL_NOT_EXP|SSL_MEDIUM, | ||
| 717 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 718 | 128, | ||
| 719 | 128, | ||
| 720 | }, | ||
| 721 | |||
| 722 | /* Cipher 25 */ | ||
| 723 | { | ||
| 724 | 1, | ||
| 725 | SSL3_TXT_KRB5_IDEA_128_CBC_MD5, | ||
| 726 | SSL3_CK_KRB5_IDEA_128_CBC_MD5, | ||
| 727 | SSL_kKRB5, | ||
| 728 | SSL_aKRB5, | ||
| 729 | SSL_IDEA, | ||
| 730 | SSL_MD5, | ||
| 731 | SSL_SSLV3, | ||
| 732 | SSL_NOT_EXP|SSL_MEDIUM, | ||
| 733 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 734 | 128, | ||
| 735 | 128, | ||
| 736 | }, | ||
| 737 | |||
| 738 | /* Cipher 26 */ | ||
| 739 | { | ||
| 740 | 1, | ||
| 741 | SSL3_TXT_KRB5_DES_40_CBC_SHA, | ||
| 742 | SSL3_CK_KRB5_DES_40_CBC_SHA, | ||
| 743 | SSL_kKRB5, | ||
| 744 | SSL_aKRB5, | ||
| 745 | SSL_DES, | ||
| 746 | SSL_SHA1, | ||
| 747 | SSL_SSLV3, | ||
| 748 | SSL_EXPORT|SSL_EXP40, | ||
| 749 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 750 | 40, | ||
| 751 | 56, | ||
| 752 | }, | ||
| 753 | |||
| 754 | /* Cipher 27 */ | ||
| 755 | { | ||
| 756 | 1, | ||
| 757 | SSL3_TXT_KRB5_RC2_40_CBC_SHA, | ||
| 758 | SSL3_CK_KRB5_RC2_40_CBC_SHA, | ||
| 759 | SSL_kKRB5, | ||
| 760 | SSL_aKRB5, | ||
| 761 | SSL_RC2, | ||
| 762 | SSL_SHA1, | ||
| 763 | SSL_SSLV3, | ||
| 764 | SSL_EXPORT|SSL_EXP40, | ||
| 765 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 766 | 40, | ||
| 767 | 128, | ||
| 768 | }, | ||
| 769 | |||
| 770 | /* Cipher 28 */ | ||
| 771 | { | ||
| 772 | 1, | ||
| 773 | SSL3_TXT_KRB5_RC4_40_SHA, | ||
| 774 | SSL3_CK_KRB5_RC4_40_SHA, | ||
| 775 | SSL_kKRB5, | ||
| 776 | SSL_aKRB5, | ||
| 777 | SSL_RC4, | ||
| 778 | SSL_SHA1, | ||
| 779 | SSL_SSLV3, | ||
| 780 | SSL_EXPORT|SSL_EXP40, | ||
| 781 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 782 | 40, | ||
| 783 | 128, | ||
| 784 | }, | ||
| 785 | |||
| 786 | /* Cipher 29 */ | ||
| 787 | { | ||
| 788 | 1, | ||
| 789 | SSL3_TXT_KRB5_DES_40_CBC_MD5, | ||
| 790 | SSL3_CK_KRB5_DES_40_CBC_MD5, | ||
| 791 | SSL_kKRB5, | ||
| 792 | SSL_aKRB5, | ||
| 793 | SSL_DES, | ||
| 794 | SSL_MD5, | ||
| 795 | SSL_SSLV3, | ||
| 796 | SSL_EXPORT|SSL_EXP40, | ||
| 797 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 798 | 40, | ||
| 799 | 56, | ||
| 800 | }, | ||
| 801 | |||
| 802 | /* Cipher 2A */ | ||
| 803 | { | ||
| 804 | 1, | ||
| 805 | SSL3_TXT_KRB5_RC2_40_CBC_MD5, | ||
| 806 | SSL3_CK_KRB5_RC2_40_CBC_MD5, | ||
| 807 | SSL_kKRB5, | ||
| 808 | SSL_aKRB5, | ||
| 809 | SSL_RC2, | ||
| 810 | SSL_MD5, | ||
| 811 | SSL_SSLV3, | ||
| 812 | SSL_EXPORT|SSL_EXP40, | ||
| 813 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 814 | 40, | ||
| 815 | 128, | ||
| 816 | }, | ||
| 817 | |||
| 818 | /* Cipher 2B */ | ||
| 819 | { | ||
| 820 | 1, | ||
| 821 | SSL3_TXT_KRB5_RC4_40_MD5, | ||
| 822 | SSL3_CK_KRB5_RC4_40_MD5, | ||
| 823 | SSL_kKRB5, | ||
| 824 | SSL_aKRB5, | ||
| 825 | SSL_RC4, | ||
| 826 | SSL_MD5, | ||
| 827 | SSL_SSLV3, | ||
| 828 | SSL_EXPORT|SSL_EXP40, | ||
| 829 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 830 | 40, | ||
| 831 | 128, | ||
| 832 | }, | ||
| 833 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 834 | 608 | ||
| 835 | /* New AES ciphersuites */ | 609 | /* New AES ciphersuites */ |
| 836 | /* Cipher 2F */ | 610 | /* Cipher 2F */ |
| @@ -2250,151 +2024,6 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] = { | |||
| 2250 | }, | 2024 | }, |
| 2251 | #endif /* OPENSSL_NO_ECDH */ | 2025 | #endif /* OPENSSL_NO_ECDH */ |
| 2252 | 2026 | ||
| 2253 | #ifndef OPENSSL_NO_SRP | ||
| 2254 | /* Cipher C01A */ | ||
| 2255 | { | ||
| 2256 | 1, | ||
| 2257 | TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA, | ||
| 2258 | TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA, | ||
| 2259 | SSL_kSRP, | ||
| 2260 | SSL_aNULL, | ||
| 2261 | SSL_3DES, | ||
| 2262 | SSL_SHA1, | ||
| 2263 | SSL_TLSV1, | ||
| 2264 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2265 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2266 | 168, | ||
| 2267 | 168, | ||
| 2268 | }, | ||
| 2269 | |||
| 2270 | /* Cipher C01B */ | ||
| 2271 | { | ||
| 2272 | 1, | ||
| 2273 | TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, | ||
| 2274 | TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, | ||
| 2275 | SSL_kSRP, | ||
| 2276 | SSL_aRSA, | ||
| 2277 | SSL_3DES, | ||
| 2278 | SSL_SHA1, | ||
| 2279 | SSL_TLSV1, | ||
| 2280 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2281 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2282 | 168, | ||
| 2283 | 168, | ||
| 2284 | }, | ||
| 2285 | |||
| 2286 | /* Cipher C01C */ | ||
| 2287 | { | ||
| 2288 | 1, | ||
| 2289 | TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, | ||
| 2290 | TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, | ||
| 2291 | SSL_kSRP, | ||
| 2292 | SSL_aDSS, | ||
| 2293 | SSL_3DES, | ||
| 2294 | SSL_SHA1, | ||
| 2295 | SSL_TLSV1, | ||
| 2296 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2297 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2298 | 168, | ||
| 2299 | 168, | ||
| 2300 | }, | ||
| 2301 | |||
| 2302 | /* Cipher C01D */ | ||
| 2303 | { | ||
| 2304 | 1, | ||
| 2305 | TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA, | ||
| 2306 | TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA, | ||
| 2307 | SSL_kSRP, | ||
| 2308 | SSL_aNULL, | ||
| 2309 | SSL_AES128, | ||
| 2310 | SSL_SHA1, | ||
| 2311 | SSL_TLSV1, | ||
| 2312 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2313 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2314 | 128, | ||
| 2315 | 128, | ||
| 2316 | }, | ||
| 2317 | |||
| 2318 | /* Cipher C01E */ | ||
| 2319 | { | ||
| 2320 | 1, | ||
| 2321 | TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, | ||
| 2322 | TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, | ||
| 2323 | SSL_kSRP, | ||
| 2324 | SSL_aRSA, | ||
| 2325 | SSL_AES128, | ||
| 2326 | SSL_SHA1, | ||
| 2327 | SSL_TLSV1, | ||
| 2328 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2329 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2330 | 128, | ||
| 2331 | 128, | ||
| 2332 | }, | ||
| 2333 | |||
| 2334 | /* Cipher C01F */ | ||
| 2335 | { | ||
| 2336 | 1, | ||
| 2337 | TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, | ||
| 2338 | TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, | ||
| 2339 | SSL_kSRP, | ||
| 2340 | SSL_aDSS, | ||
| 2341 | SSL_AES128, | ||
| 2342 | SSL_SHA1, | ||
| 2343 | SSL_TLSV1, | ||
| 2344 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2345 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2346 | 128, | ||
| 2347 | 128, | ||
| 2348 | }, | ||
| 2349 | |||
| 2350 | /* Cipher C020 */ | ||
| 2351 | { | ||
| 2352 | 1, | ||
| 2353 | TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA, | ||
| 2354 | TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA, | ||
| 2355 | SSL_kSRP, | ||
| 2356 | SSL_aNULL, | ||
| 2357 | SSL_AES256, | ||
| 2358 | SSL_SHA1, | ||
| 2359 | SSL_TLSV1, | ||
| 2360 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2361 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2362 | 256, | ||
| 2363 | 256, | ||
| 2364 | }, | ||
| 2365 | |||
| 2366 | /* Cipher C021 */ | ||
| 2367 | { | ||
| 2368 | 1, | ||
| 2369 | TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, | ||
| 2370 | TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, | ||
| 2371 | SSL_kSRP, | ||
| 2372 | SSL_aRSA, | ||
| 2373 | SSL_AES256, | ||
| 2374 | SSL_SHA1, | ||
| 2375 | SSL_TLSV1, | ||
| 2376 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2377 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2378 | 256, | ||
| 2379 | 256, | ||
| 2380 | }, | ||
| 2381 | |||
| 2382 | /* Cipher C022 */ | ||
| 2383 | { | ||
| 2384 | 1, | ||
| 2385 | TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, | ||
| 2386 | TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, | ||
| 2387 | SSL_kSRP, | ||
| 2388 | SSL_aDSS, | ||
| 2389 | SSL_AES256, | ||
| 2390 | SSL_SHA1, | ||
| 2391 | SSL_TLSV1, | ||
| 2392 | SSL_NOT_EXP|SSL_HIGH, | ||
| 2393 | SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, | ||
| 2394 | 256, | ||
| 2395 | 256, | ||
| 2396 | }, | ||
| 2397 | #endif /* OPENSSL_NO_SRP */ | ||
| 2398 | #ifndef OPENSSL_NO_ECDH | 2027 | #ifndef OPENSSL_NO_ECDH |
| 2399 | 2028 | ||
| 2400 | /* HMAC based TLS v1.2 ciphersuites from RFC5289 */ | 2029 | /* HMAC based TLS v1.2 ciphersuites from RFC5289 */ |
| @@ -2787,9 +2416,6 @@ ssl3_new(SSL *s) | |||
| 2787 | 2416 | ||
| 2788 | s->s3 = s3; | 2417 | s->s3 = s3; |
| 2789 | 2418 | ||
| 2790 | #ifndef OPENSSL_NO_SRP | ||
| 2791 | SSL_SRP_CTX_init(s); | ||
| 2792 | #endif | ||
| 2793 | s->method->ssl_clear(s); | 2419 | s->method->ssl_clear(s); |
| 2794 | return (1); | 2420 | return (1); |
| 2795 | err: | 2421 | err: |
| @@ -2832,9 +2458,6 @@ ssl3_free(SSL *s) | |||
| 2832 | } | 2458 | } |
| 2833 | if (s->s3->handshake_dgst) | 2459 | if (s->s3->handshake_dgst) |
| 2834 | ssl3_free_digest_list(s); | 2460 | ssl3_free_digest_list(s); |
| 2835 | #ifndef OPENSSL_NO_SRP | ||
| 2836 | SSL_SRP_CTX_free(s); | ||
| 2837 | #endif | ||
| 2838 | OPENSSL_cleanse(s->s3, sizeof *s->s3); | 2461 | OPENSSL_cleanse(s->s3, sizeof *s->s3); |
| 2839 | free(s->s3); | 2462 | free(s->s3); |
| 2840 | s->s3 = NULL; | 2463 | s->s3 = NULL; |
| @@ -2919,13 +2542,6 @@ ssl3_clear(SSL *s) | |||
| 2919 | #endif | 2542 | #endif |
| 2920 | } | 2543 | } |
| 2921 | 2544 | ||
| 2922 | #ifndef OPENSSL_NO_SRP | ||
| 2923 | static char * | ||
| 2924 | srp_password_from_info_cb(SSL *s, void *arg) | ||
| 2925 | { | ||
| 2926 | return BUF_strdup(s->srp_ctx.info); | ||
| 2927 | } | ||
| 2928 | #endif | ||
| 2929 | 2545 | ||
| 2930 | long | 2546 | long |
| 2931 | ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | 2547 | ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) |
| @@ -3380,40 +2996,6 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
| 3380 | return 1; | 2996 | return 1; |
| 3381 | break; | 2997 | break; |
| 3382 | 2998 | ||
| 3383 | #ifndef OPENSSL_NO_SRP | ||
| 3384 | case SSL_CTRL_SET_TLS_EXT_SRP_USERNAME: | ||
| 3385 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3386 | if (ctx->srp_ctx.login != NULL) | ||
| 3387 | free(ctx->srp_ctx.login); | ||
| 3388 | ctx->srp_ctx.login = NULL; | ||
| 3389 | if (parg == NULL) | ||
| 3390 | break; | ||
| 3391 | if (strlen((const char *)parg) > 255 || | ||
| 3392 | strlen((const char *)parg) < 1) { | ||
| 3393 | SSLerr(SSL_F_SSL3_CTX_CTRL, | ||
| 3394 | SSL_R_INVALID_SRP_USERNAME); | ||
| 3395 | return 0; | ||
| 3396 | } | ||
| 3397 | if ((ctx->srp_ctx.login = BUF_strdup((char *)parg)) == NULL) { | ||
| 3398 | SSLerr(SSL_F_SSL3_CTX_CTRL, | ||
| 3399 | ERR_R_INTERNAL_ERROR); | ||
| 3400 | return 0; | ||
| 3401 | } | ||
| 3402 | break; | ||
| 3403 | case SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD: | ||
| 3404 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = | ||
| 3405 | srp_password_from_info_cb; | ||
| 3406 | ctx->srp_ctx.info = parg; | ||
| 3407 | break; | ||
| 3408 | case SSL_CTRL_SET_SRP_ARG: | ||
| 3409 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3410 | ctx->srp_ctx.SRP_cb_arg = parg; | ||
| 3411 | break; | ||
| 3412 | |||
| 3413 | case SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH: | ||
| 3414 | ctx->srp_ctx.strength = larg; | ||
| 3415 | break; | ||
| 3416 | #endif | ||
| 3417 | #endif /* !OPENSSL_NO_TLSEXT */ | 2999 | #endif /* !OPENSSL_NO_TLSEXT */ |
| 3418 | 3000 | ||
| 3419 | /* A Thawte special :-) */ | 3001 | /* A Thawte special :-) */ |
| @@ -3491,23 +3073,6 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | |||
| 3491 | unsigned char *, EVP_CIPHER_CTX *, HMAC_CTX *, int))fp; | 3073 | unsigned char *, EVP_CIPHER_CTX *, HMAC_CTX *, int))fp; |
| 3492 | break; | 3074 | break; |
| 3493 | 3075 | ||
| 3494 | #ifndef OPENSSL_NO_SRP | ||
| 3495 | case SSL_CTRL_SET_SRP_VERIFY_PARAM_CB: | ||
| 3496 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3497 | ctx->srp_ctx.SRP_verify_param_callback = | ||
| 3498 | (int (*)(SSL *, void *))fp; | ||
| 3499 | break; | ||
| 3500 | case SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB: | ||
| 3501 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3502 | ctx->srp_ctx.TLS_ext_srp_username_callback = | ||
| 3503 | (int (*)(SSL *, int *, void *))fp; | ||
| 3504 | break; | ||
| 3505 | case SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB: | ||
| 3506 | ctx->srp_ctx.srp_Mask|=SSL_kSRP; | ||
| 3507 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = | ||
| 3508 | (char *(*)(SSL *, void *))fp; | ||
| 3509 | break; | ||
| 3510 | #endif | ||
| 3511 | #endif | 3076 | #endif |
| 3512 | default: | 3077 | default: |
| 3513 | return (0); | 3078 | return (0); |
| @@ -3616,10 +3181,6 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3616 | mask_a = cert->mask_a; | 3181 | mask_a = cert->mask_a; |
| 3617 | emask_k = cert->export_mask_k; | 3182 | emask_k = cert->export_mask_k; |
| 3618 | emask_a = cert->export_mask_a; | 3183 | emask_a = cert->export_mask_a; |
| 3619 | #ifndef OPENSSL_NO_SRP | ||
| 3620 | mask_k = cert->mask_k | s->srp_ctx.srp_Mask; | ||
| 3621 | emask_k = cert->export_mask_k | s->srp_ctx.srp_Mask; | ||
| 3622 | #endif | ||
| 3623 | 3184 | ||
| 3624 | #ifdef KSSL_DEBUG | 3185 | #ifdef KSSL_DEBUG |
| 3625 | /* printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms);*/ | 3186 | /* printf("ssl3_choose_cipher %d alg= %lx\n", i,c->algorithms);*/ |
| @@ -3628,12 +3189,6 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt, | |||
| 3628 | alg_k = c->algorithm_mkey; | 3189 | alg_k = c->algorithm_mkey; |
| 3629 | alg_a = c->algorithm_auth; | 3190 | alg_a = c->algorithm_auth; |
| 3630 | 3191 | ||
| 3631 | #ifndef OPENSSL_NO_KRB5 | ||
| 3632 | if (alg_k & SSL_kKRB5) { | ||
| 3633 | if (!kssl_keytab_is_available(s->kssl_ctx) ) | ||
| 3634 | continue; | ||
| 3635 | } | ||
| 3636 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 3637 | #ifndef OPENSSL_NO_PSK | 3192 | #ifndef OPENSSL_NO_PSK |
| 3638 | /* with PSK there must be server callback set */ | 3193 | /* with PSK there must be server callback set */ |
| 3639 | if ((alg_k & SSL_kPSK) && s->psk_server_callback == NULL) | 3194 | if ((alg_k & SSL_kPSK) && s->psk_server_callback == NULL) |
diff --git a/src/lib/libssl/src/ssl/s3_srvr.c b/src/lib/libssl/src/ssl/s3_srvr.c index 6d8ccd66b7..081aebf1f5 100644 --- a/src/lib/libssl/src/ssl/s3_srvr.c +++ b/src/lib/libssl/src/ssl/s3_srvr.c | |||
| @@ -164,9 +164,6 @@ | |||
| 164 | #include <openssl/dh.h> | 164 | #include <openssl/dh.h> |
| 165 | #endif | 165 | #endif |
| 166 | #include <openssl/bn.h> | 166 | #include <openssl/bn.h> |
| 167 | #ifndef OPENSSL_NO_KRB5 | ||
| 168 | #include <openssl/krb5_asn.h> | ||
| 169 | #endif | ||
| 170 | #include <openssl/md5.h> | 167 | #include <openssl/md5.h> |
| 171 | 168 | ||
| 172 | static const SSL_METHOD *ssl3_get_server_method(int ver); | 169 | static const SSL_METHOD *ssl3_get_server_method(int ver); |
| @@ -179,30 +176,6 @@ ssl3_get_server_method(int ver) | |||
| 179 | return (NULL); | 176 | return (NULL); |
| 180 | } | 177 | } |
| 181 | 178 | ||
| 182 | #ifndef OPENSSL_NO_SRP | ||
| 183 | static int | ||
| 184 | ssl_check_srp_ext_ClientHello(SSL *s, int *al) | ||
| 185 | { | ||
| 186 | int ret = SSL_ERROR_NONE; | ||
| 187 | |||
| 188 | *al = SSL_AD_UNRECOGNIZED_NAME; | ||
| 189 | |||
| 190 | if ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) && | ||
| 191 | (s->srp_ctx.TLS_ext_srp_username_callback != NULL)) { | ||
| 192 | if (s->srp_ctx.login == NULL) { | ||
| 193 | /* | ||
| 194 | * RFC 5054 says SHOULD reject, | ||
| 195 | * we do so if There is no srp login name | ||
| 196 | */ | ||
| 197 | ret = SSL3_AL_FATAL; | ||
| 198 | *al = SSL_AD_UNKNOWN_PSK_IDENTITY; | ||
| 199 | } else { | ||
| 200 | ret = SSL_srp_server_param_with_username(s, al); | ||
| 201 | } | ||
| 202 | } | ||
| 203 | return (ret); | ||
| 204 | } | ||
| 205 | #endif | ||
| 206 | 179 | ||
| 207 | IMPLEMENT_ssl3_meth_func(SSLv3_server_method, | 180 | IMPLEMENT_ssl3_meth_func(SSLv3_server_method, |
| 208 | ssl3_accept, ssl_undefined_function, ssl3_get_server_method) | 181 | ssl3_accept, ssl_undefined_function, ssl3_get_server_method) |
| @@ -342,39 +315,6 @@ ssl3_accept(SSL *s) | |||
| 342 | if (ret <= 0) | 315 | if (ret <= 0) |
| 343 | goto end; | 316 | goto end; |
| 344 | } | 317 | } |
| 345 | #ifndef OPENSSL_NO_SRP | ||
| 346 | { | ||
| 347 | int al; | ||
| 348 | if ((ret = | ||
| 349 | ssl_check_srp_ext_ClientHello(s, &al)) | ||
| 350 | < 0) { | ||
| 351 | /* | ||
| 352 | * Callback indicates further work to | ||
| 353 | * be done. | ||
| 354 | */ | ||
| 355 | s->rwstate = SSL_X509_LOOKUP; | ||
| 356 | goto end; | ||
| 357 | } | ||
| 358 | if (ret != SSL_ERROR_NONE) { | ||
| 359 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
| 360 | |||
| 361 | /* | ||
| 362 | * This is not really an error but the | ||
| 363 | * only means for a client to detect | ||
| 364 | * whether srp is supported. | ||
| 365 | */ | ||
| 366 | if (al != TLS1_AD_UNKNOWN_PSK_IDENTITY) | ||
| 367 | SSLerr(SSL_F_SSL3_ACCEPT, | ||
| 368 | SSL_R_CLIENTHELLO_TLSEXT); | ||
| 369 | |||
| 370 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | ||
| 371 | |||
| 372 | ret = -1; | ||
| 373 | goto end; | ||
| 374 | |||
| 375 | } | ||
| 376 | } | ||
| 377 | #endif | ||
| 378 | 318 | ||
| 379 | s->renegotiate = 2; | 319 | s->renegotiate = 2; |
| 380 | s->state = SSL3_ST_SW_SRVR_HELLO_A; | 320 | s->state = SSL3_ST_SW_SRVR_HELLO_A; |
| @@ -441,9 +381,6 @@ ssl3_accept(SSL *s) | |||
| 441 | * send_server_key_exchange. | 381 | * send_server_key_exchange. |
| 442 | */ | 382 | */ |
| 443 | if ((s->options & SSL_OP_EPHEMERAL_RSA) | 383 | if ((s->options & SSL_OP_EPHEMERAL_RSA) |
| 444 | #ifndef OPENSSL_NO_KRB5 | ||
| 445 | && !(alg_k & SSL_kKRB5) | ||
| 446 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 447 | ) | 384 | ) |
| 448 | /* | 385 | /* |
| 449 | * option SSL_OP_EPHEMERAL_RSA sends temporary | 386 | * option SSL_OP_EPHEMERAL_RSA sends temporary |
| @@ -473,10 +410,6 @@ ssl3_accept(SSL *s) | |||
| 473 | #ifndef OPENSSL_NO_PSK | 410 | #ifndef OPENSSL_NO_PSK |
| 474 | || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint) | 411 | || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint) |
| 475 | #endif | 412 | #endif |
| 476 | #ifndef OPENSSL_NO_SRP | ||
| 477 | /* SRP: send ServerKeyExchange */ | ||
| 478 | || (alg_k & SSL_kSRP) | ||
| 479 | #endif | ||
| 480 | || (alg_k & (SSL_kDHr|SSL_kDHd|SSL_kEDH)) | 413 | || (alg_k & (SSL_kDHr|SSL_kDHd|SSL_kEDH)) |
| 481 | || (alg_k & SSL_kEECDH) | 414 | || (alg_k & SSL_kEECDH) |
| 482 | || ((alg_k & SSL_kRSA) | 415 | || ((alg_k & SSL_kRSA) |
| @@ -1796,20 +1729,6 @@ ssl3_send_server_key_exchange(SSL *s) | |||
| 1796 | n += 2 + pskhintlen; | 1729 | n += 2 + pskhintlen; |
| 1797 | } else | 1730 | } else |
| 1798 | #endif /* !OPENSSL_NO_PSK */ | 1731 | #endif /* !OPENSSL_NO_PSK */ |
| 1799 | #ifndef OPENSSL_NO_SRP | ||
| 1800 | if (type & SSL_kSRP) { | ||
| 1801 | if ((s->srp_ctx.N == NULL) || (s->srp_ctx.g == NULL) || | ||
| 1802 | (s->srp_ctx.s == NULL) || (s->srp_ctx.B == NULL)) { | ||
| 1803 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, | ||
| 1804 | SSL_R_MISSING_SRP_PARAM); | ||
| 1805 | goto err; | ||
| 1806 | } | ||
| 1807 | r[0] = s->srp_ctx.N; | ||
| 1808 | r[1] = s->srp_ctx.g; | ||
| 1809 | r[2] = s->srp_ctx.s; | ||
| 1810 | r[3] = s->srp_ctx.B; | ||
| 1811 | } else | ||
| 1812 | #endif | ||
| 1813 | { | 1732 | { |
| 1814 | al = SSL_AD_HANDSHAKE_FAILURE; | 1733 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 1815 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, | 1734 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, |
| @@ -1818,11 +1737,6 @@ ssl3_send_server_key_exchange(SSL *s) | |||
| 1818 | } | 1737 | } |
| 1819 | for (i = 0; i < 4 && r[i] != NULL; i++) { | 1738 | for (i = 0; i < 4 && r[i] != NULL; i++) { |
| 1820 | nr[i] = BN_num_bytes(r[i]); | 1739 | nr[i] = BN_num_bytes(r[i]); |
| 1821 | #ifndef OPENSSL_NO_SRP | ||
| 1822 | if ((i == 2) && (type & SSL_kSRP)) | ||
| 1823 | n += 1 + nr[i]; | ||
| 1824 | else | ||
| 1825 | #endif | ||
| 1826 | n += 2 + nr[i]; | 1740 | n += 2 + nr[i]; |
| 1827 | } | 1741 | } |
| 1828 | 1742 | ||
| @@ -1848,12 +1762,6 @@ ssl3_send_server_key_exchange(SSL *s) | |||
| 1848 | p = &(d[4]); | 1762 | p = &(d[4]); |
| 1849 | 1763 | ||
| 1850 | for (i = 0; i < 4 && r[i] != NULL; i++) { | 1764 | for (i = 0; i < 4 && r[i] != NULL; i++) { |
| 1851 | #ifndef OPENSSL_NO_SRP | ||
| 1852 | if ((i == 2) && (type & SSL_kSRP)) { | ||
| 1853 | *p = nr[i]; | ||
| 1854 | p++; | ||
| 1855 | } else | ||
| 1856 | #endif | ||
| 1857 | s2n(nr[i], p); | 1765 | s2n(nr[i], p); |
| 1858 | BN_bn2bin(r[i], p); | 1766 | BN_bn2bin(r[i], p); |
| 1859 | p += nr[i]; | 1767 | p += nr[i]; |
| @@ -2112,9 +2020,6 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 2112 | BIGNUM *pub = NULL; | 2020 | BIGNUM *pub = NULL; |
| 2113 | DH *dh_srvr; | 2021 | DH *dh_srvr; |
| 2114 | #endif | 2022 | #endif |
| 2115 | #ifndef OPENSSL_NO_KRB5 | ||
| 2116 | KSSL_ERR kssl_err; | ||
| 2117 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 2118 | 2023 | ||
| 2119 | #ifndef OPENSSL_NO_ECDH | 2024 | #ifndef OPENSSL_NO_ECDH |
| 2120 | EC_KEY *srvr_ecdh = NULL; | 2025 | EC_KEY *srvr_ecdh = NULL; |
| @@ -2299,191 +2204,6 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 2299 | OPENSSL_cleanse(p, i); | 2204 | OPENSSL_cleanse(p, i); |
| 2300 | } else | 2205 | } else |
| 2301 | #endif | 2206 | #endif |
| 2302 | #ifndef OPENSSL_NO_KRB5 | ||
| 2303 | if (alg_k & SSL_kKRB5) { | ||
| 2304 | krb5_error_code krb5rc; | ||
| 2305 | krb5_data enc_ticket; | ||
| 2306 | krb5_data authenticator; | ||
| 2307 | krb5_data enc_pms; | ||
| 2308 | KSSL_CTX *kssl_ctx = s->kssl_ctx; | ||
| 2309 | EVP_CIPHER_CTX ciph_ctx; | ||
| 2310 | const EVP_CIPHER *enc = NULL; | ||
| 2311 | unsigned char iv[EVP_MAX_IV_LENGTH]; | ||
| 2312 | unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH | ||
| 2313 | + EVP_MAX_BLOCK_LENGTH]; | ||
| 2314 | int padl, outl; | ||
| 2315 | krb5_timestamp authtime = 0; | ||
| 2316 | krb5_ticket_times ttimes; | ||
| 2317 | |||
| 2318 | EVP_CIPHER_CTX_init(&ciph_ctx); | ||
| 2319 | |||
| 2320 | if (!kssl_ctx) | ||
| 2321 | kssl_ctx = kssl_ctx_new(); | ||
| 2322 | |||
| 2323 | n2s(p, i); | ||
| 2324 | enc_ticket.length = i; | ||
| 2325 | |||
| 2326 | if (n < (long)(enc_ticket.length + 6)) { | ||
| 2327 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2328 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2329 | goto err; | ||
| 2330 | } | ||
| 2331 | |||
| 2332 | enc_ticket.data = (char *)p; | ||
| 2333 | p += enc_ticket.length; | ||
| 2334 | |||
| 2335 | n2s(p, i); | ||
| 2336 | authenticator.length = i; | ||
| 2337 | |||
| 2338 | if (n < (long)(enc_ticket.length + authenticator.length + 6)) { | ||
| 2339 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2340 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2341 | goto err; | ||
| 2342 | } | ||
| 2343 | |||
| 2344 | authenticator.data = (char *)p; | ||
| 2345 | p += authenticator.length; | ||
| 2346 | |||
| 2347 | n2s(p, i); | ||
| 2348 | enc_pms.length = i; | ||
| 2349 | enc_pms.data = (char *)p; | ||
| 2350 | p += enc_pms.length; | ||
| 2351 | |||
| 2352 | /* | ||
| 2353 | * Note that the length is checked again below, | ||
| 2354 | * after decryption | ||
| 2355 | */ | ||
| 2356 | if (enc_pms.length > sizeof pms) { | ||
| 2357 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2358 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2359 | goto err; | ||
| 2360 | } | ||
| 2361 | |||
| 2362 | if (n != (long)(enc_ticket.length + authenticator.length + | ||
| 2363 | enc_pms.length + 6)) { | ||
| 2364 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2365 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2366 | goto err; | ||
| 2367 | } | ||
| 2368 | |||
| 2369 | if ((krb5rc = kssl_sget_tkt(kssl_ctx, &enc_ticket, &ttimes, | ||
| 2370 | &kssl_err)) != 0) { | ||
| 2371 | #ifdef KSSL_DEBUG | ||
| 2372 | printf("kssl_sget_tkt rtn %d [%d]\n", | ||
| 2373 | krb5rc, kssl_err.reason); | ||
| 2374 | if (kssl_err.text) | ||
| 2375 | printf("kssl_err text= %s\n", kssl_err.text); | ||
| 2376 | #endif /* KSSL_DEBUG */ | ||
| 2377 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2378 | kssl_err.reason); | ||
| 2379 | goto err; | ||
| 2380 | } | ||
| 2381 | |||
| 2382 | /* Note: no authenticator is not considered an error, | ||
| 2383 | ** but will return authtime == 0. | ||
| 2384 | */ | ||
| 2385 | if ((krb5rc = kssl_check_authent(kssl_ctx, &authenticator, | ||
| 2386 | &authtime, &kssl_err)) != 0) { | ||
| 2387 | #ifdef KSSL_DEBUG | ||
| 2388 | printf("kssl_check_authent rtn %d [%d]\n", | ||
| 2389 | krb5rc, kssl_err.reason); | ||
| 2390 | if (kssl_err.text) | ||
| 2391 | printf("kssl_err text= %s\n", kssl_err.text); | ||
| 2392 | #endif /* KSSL_DEBUG */ | ||
| 2393 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2394 | kssl_err.reason); | ||
| 2395 | goto err; | ||
| 2396 | } | ||
| 2397 | |||
| 2398 | if ((krb5rc = kssl_validate_times(authtime, &ttimes)) != 0) { | ||
| 2399 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2400 | krb5rc); | ||
| 2401 | goto err; | ||
| 2402 | } | ||
| 2403 | |||
| 2404 | #ifdef KSSL_DEBUG | ||
| 2405 | kssl_ctx_show(kssl_ctx); | ||
| 2406 | #endif /* KSSL_DEBUG */ | ||
| 2407 | |||
| 2408 | enc = kssl_map_enc(kssl_ctx->enctype); | ||
| 2409 | if (enc == NULL) | ||
| 2410 | goto err; | ||
| 2411 | |||
| 2412 | memset(iv, 0, sizeof iv); /* per RFC 1510 */ | ||
| 2413 | |||
| 2414 | if (!EVP_DecryptInit_ex(&ciph_ctx, enc, NULL, | ||
| 2415 | kssl_ctx->key, iv)) { | ||
| 2416 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2417 | SSL_R_DECRYPTION_FAILED); | ||
| 2418 | goto err; | ||
| 2419 | } | ||
| 2420 | if (!EVP_DecryptUpdate(&ciph_ctx, pms, &outl, | ||
| 2421 | (unsigned char *)enc_pms.data, enc_pms.length)) { | ||
| 2422 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2423 | SSL_R_DECRYPTION_FAILED); | ||
| 2424 | goto err; | ||
| 2425 | } | ||
| 2426 | if (outl > SSL_MAX_MASTER_KEY_LENGTH) { | ||
| 2427 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2428 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2429 | goto err; | ||
| 2430 | } | ||
| 2431 | if (!EVP_DecryptFinal_ex(&ciph_ctx, &(pms[outl]), &padl)) { | ||
| 2432 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2433 | SSL_R_DECRYPTION_FAILED); | ||
| 2434 | goto err; | ||
| 2435 | } | ||
| 2436 | outl += padl; | ||
| 2437 | if (outl > SSL_MAX_MASTER_KEY_LENGTH) { | ||
| 2438 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2439 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 2440 | goto err; | ||
| 2441 | } | ||
| 2442 | if (!((pms[0] == (s->client_version >> 8)) && (pms[1] == (s->client_version & 0xff)))) { | ||
| 2443 | /* | ||
| 2444 | * The premaster secret must contain the same version | ||
| 2445 | * number as the ClientHello to detect version rollback | ||
| 2446 | * attacks (strangely, the protocol does not offer such | ||
| 2447 | * protection for DH ciphersuites). | ||
| 2448 | * However, buggy clients exist that send random bytes | ||
| 2449 | * instead of the protocol version. | ||
| 2450 | * | ||
| 2451 | * If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such | ||
| 2452 | * clients. | ||
| 2453 | * (Perhaps we should have a separate BUG value for | ||
| 2454 | * the Kerberos cipher) | ||
| 2455 | */ | ||
| 2456 | if (!(s->options & SSL_OP_TLS_ROLLBACK_BUG)) { | ||
| 2457 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2458 | SSL_AD_DECODE_ERROR); | ||
| 2459 | goto err; | ||
| 2460 | } | ||
| 2461 | } | ||
| 2462 | |||
| 2463 | EVP_CIPHER_CTX_cleanup(&ciph_ctx); | ||
| 2464 | |||
| 2465 | s->session->master_key_length = | ||
| 2466 | s->method->ssl3_enc->generate_master_secret(s, | ||
| 2467 | s->session->master_key, pms, outl); | ||
| 2468 | |||
| 2469 | if (kssl_ctx->client_princ) { | ||
| 2470 | size_t len = strlen(kssl_ctx->client_princ); | ||
| 2471 | if (len < SSL_MAX_KRB5_PRINCIPAL_LENGTH ) { | ||
| 2472 | s->session->krb5_client_princ_len = len; | ||
| 2473 | memcpy(s->session->krb5_client_princ, | ||
| 2474 | kssl_ctx->client_princ, len); | ||
| 2475 | } | ||
| 2476 | } | ||
| 2477 | |||
| 2478 | |||
| 2479 | /* | ||
| 2480 | * Was doing kssl_ctx_free() here, but it caused problems for | ||
| 2481 | * apache. | ||
| 2482 | * kssl_ctx = kssl_ctx_free(kssl_ctx); | ||
| 2483 | * if (s->kssl_ctx) s->kssl_ctx = NULL; | ||
| 2484 | */ | ||
| 2485 | } else | ||
| 2486 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 2487 | 2207 | ||
| 2488 | #ifndef OPENSSL_NO_ECDH | 2208 | #ifndef OPENSSL_NO_ECDH |
| 2489 | if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) { | 2209 | if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe)) { |
| @@ -2717,43 +2437,6 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 2717 | goto f_err; | 2437 | goto f_err; |
| 2718 | } else | 2438 | } else |
| 2719 | #endif | 2439 | #endif |
| 2720 | #ifndef OPENSSL_NO_SRP | ||
| 2721 | if (alg_k & SSL_kSRP) { | ||
| 2722 | int param_len; | ||
| 2723 | |||
| 2724 | n2s(p, i); | ||
| 2725 | param_len = i + 2; | ||
| 2726 | if (param_len > n) { | ||
| 2727 | al = SSL_AD_DECODE_ERROR; | ||
| 2728 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2729 | SSL_R_BAD_SRP_A_LENGTH); | ||
| 2730 | goto f_err; | ||
| 2731 | } | ||
| 2732 | if (!(s->srp_ctx.A = BN_bin2bn(p, i, NULL))) { | ||
| 2733 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2734 | ERR_R_BN_LIB); | ||
| 2735 | goto err; | ||
| 2736 | } | ||
| 2737 | if (s->session->srp_username != NULL) | ||
| 2738 | free(s->session->srp_username); | ||
| 2739 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); | ||
| 2740 | if (s->session->srp_username == NULL) { | ||
| 2741 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2742 | ERR_R_MALLOC_FAILURE); | ||
| 2743 | goto err; | ||
| 2744 | } | ||
| 2745 | |||
| 2746 | if ((s->session->master_key_length = | ||
| 2747 | SRP_generate_server_master_secret(s, | ||
| 2748 | s->session->master_key)) < 0) { | ||
| 2749 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
| 2750 | ERR_R_INTERNAL_ERROR); | ||
| 2751 | goto err; | ||
| 2752 | } | ||
| 2753 | |||
| 2754 | p += i; | ||
| 2755 | } else | ||
| 2756 | #endif /* OPENSSL_NO_SRP */ | ||
| 2757 | if (alg_k & SSL_kGOST) { | 2440 | if (alg_k & SSL_kGOST) { |
| 2758 | int ret = 0; | 2441 | int ret = 0; |
| 2759 | EVP_PKEY_CTX *pkey_ctx; | 2442 | EVP_PKEY_CTX *pkey_ctx; |
diff --git a/src/lib/libssl/src/ssl/ssl.h b/src/lib/libssl/src/ssl/ssl.h index 0e117dbca4..dc56abaa99 100644 --- a/src/lib/libssl/src/ssl/ssl.h +++ b/src/lib/libssl/src/ssl/ssl.h | |||
| @@ -466,10 +466,6 @@ struct ssl_session_st { | |||
| 466 | unsigned int sid_ctx_length; | 466 | unsigned int sid_ctx_length; |
| 467 | unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; | 467 | unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; |
| 468 | 468 | ||
| 469 | #ifndef OPENSSL_NO_KRB5 | ||
| 470 | unsigned int krb5_client_princ_len; | ||
| 471 | unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH]; | ||
| 472 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 473 | #ifndef OPENSSL_NO_PSK | 469 | #ifndef OPENSSL_NO_PSK |
| 474 | char *psk_identity_hint; | 470 | char *psk_identity_hint; |
| 475 | char *psk_identity; | 471 | char *psk_identity; |
| @@ -522,9 +518,6 @@ struct ssl_session_st { | |||
| 522 | size_t tlsext_ticklen; /* Session ticket length */ | 518 | size_t tlsext_ticklen; /* Session ticket length */ |
| 523 | long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ | 519 | long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ |
| 524 | #endif | 520 | #endif |
| 525 | #ifndef OPENSSL_NO_SRP | ||
| 526 | char *srp_username; | ||
| 527 | #endif | ||
| 528 | }; | 521 | }; |
| 529 | 522 | ||
| 530 | #endif | 523 | #endif |
| @@ -672,42 +665,6 @@ void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, | |||
| 672 | #define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) | 665 | #define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) |
| 673 | #define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) | 666 | #define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) |
| 674 | 667 | ||
| 675 | #ifndef OPENSSL_NO_SRP | ||
| 676 | |||
| 677 | #ifndef OPENSSL_NO_SSL_INTERN | ||
| 678 | |||
| 679 | typedef struct srp_ctx_st { | ||
| 680 | /* param for all the callbacks */ | ||
| 681 | void *SRP_cb_arg; | ||
| 682 | /* set client Hello login callback */ | ||
| 683 | int (*TLS_ext_srp_username_callback)(SSL *, int *, void *); | ||
| 684 | /* set SRP N/g param callback for verification */ | ||
| 685 | int (*SRP_verify_param_callback)(SSL *, void *); | ||
| 686 | /* set SRP client passwd callback */ | ||
| 687 | char *(*SRP_give_srp_client_pwd_callback)(SSL *, void *); | ||
| 688 | |||
| 689 | char *login; | ||
| 690 | BIGNUM *N, *g, *s, *B, *A; | ||
| 691 | BIGNUM *a, *b, *v; | ||
| 692 | char *info; | ||
| 693 | int strength; | ||
| 694 | |||
| 695 | unsigned long srp_Mask; | ||
| 696 | } SRP_CTX; | ||
| 697 | |||
| 698 | #endif | ||
| 699 | |||
| 700 | /* see tls_srp.c */ | ||
| 701 | int SSL_SRP_CTX_init(SSL *s); | ||
| 702 | int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); | ||
| 703 | int SSL_SRP_CTX_free(SSL *ctx); | ||
| 704 | int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); | ||
| 705 | int SSL_srp_server_param_with_username(SSL *s, int *ad); | ||
| 706 | int SRP_generate_server_master_secret(SSL *s, unsigned char *master_key); | ||
| 707 | int SRP_Calc_A_param(SSL *s); | ||
| 708 | int SRP_generate_client_master_secret(SSL *s, unsigned char *master_key); | ||
| 709 | |||
| 710 | #endif | ||
| 711 | 668 | ||
| 712 | #define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */ | 669 | #define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */ |
| 713 | 670 | ||
| @@ -922,9 +879,6 @@ struct ssl_ctx_st { | |||
| 922 | unsigned char *psk, unsigned int max_psk_len); | 879 | unsigned char *psk, unsigned int max_psk_len); |
| 923 | #endif | 880 | #endif |
| 924 | 881 | ||
| 925 | #ifndef OPENSSL_NO_SRP | ||
| 926 | SRP_CTX srp_ctx; /* ctx for SRP authentication */ | ||
| 927 | #endif | ||
| 928 | 882 | ||
| 929 | #ifndef OPENSSL_NO_TLSEXT | 883 | #ifndef OPENSSL_NO_TLSEXT |
| 930 | 884 | ||
| @@ -1213,9 +1167,6 @@ struct ssl_st { | |||
| 1213 | int error; /* error bytes to be written */ | 1167 | int error; /* error bytes to be written */ |
| 1214 | int error_code; /* actual code */ | 1168 | int error_code; /* actual code */ |
| 1215 | 1169 | ||
| 1216 | #ifndef OPENSSL_NO_KRB5 | ||
| 1217 | KSSL_CTX *kssl_ctx; /* Kerberos 5 context */ | ||
| 1218 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 1219 | 1170 | ||
| 1220 | #ifndef OPENSSL_NO_PSK | 1171 | #ifndef OPENSSL_NO_PSK |
| 1221 | unsigned int (*psk_client_callback)(SSL *ssl, const char *hint, | 1172 | unsigned int (*psk_client_callback)(SSL *ssl, const char *hint, |
| @@ -1327,9 +1278,6 @@ struct ssl_st { | |||
| 1327 | * 2 if we are a server and are inside a handshake | 1278 | * 2 if we are a server and are inside a handshake |
| 1328 | * (i.e. not just sending a HelloRequest) */ | 1279 | * (i.e. not just sending a HelloRequest) */ |
| 1329 | 1280 | ||
| 1330 | #ifndef OPENSSL_NO_SRP | ||
| 1331 | SRP_CTX srp_ctx; /* ctx for SRP authentication */ | ||
| 1332 | #endif | ||
| 1333 | }; | 1281 | }; |
| 1334 | 1282 | ||
| 1335 | #endif | 1283 | #endif |
| @@ -1771,24 +1719,6 @@ int SSL_set_trust(SSL *s, int trust); | |||
| 1771 | int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); | 1719 | int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); |
| 1772 | int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); | 1720 | int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); |
| 1773 | 1721 | ||
| 1774 | #ifndef OPENSSL_NO_SRP | ||
| 1775 | int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); | ||
| 1776 | int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); | ||
| 1777 | int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); | ||
| 1778 | int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, char *(*cb)(SSL *, void *)); | ||
| 1779 | int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, int (*cb)(SSL *, void *)); | ||
| 1780 | int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, int (*cb)(SSL *, int *, void *)); | ||
| 1781 | int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); | ||
| 1782 | |||
| 1783 | int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, BIGNUM *sa, BIGNUM *v, char *info); | ||
| 1784 | int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, const char *grp); | ||
| 1785 | |||
| 1786 | BIGNUM *SSL_get_srp_g(SSL *s); | ||
| 1787 | BIGNUM *SSL_get_srp_N(SSL *s); | ||
| 1788 | |||
| 1789 | char *SSL_get_srp_username(SSL *s); | ||
| 1790 | char *SSL_get_srp_userinfo(SSL *s); | ||
| 1791 | #endif | ||
| 1792 | 1722 | ||
| 1793 | void SSL_free(SSL *ssl); | 1723 | void SSL_free(SSL *ssl); |
| 1794 | int SSL_accept(SSL *ssl); | 1724 | int SSL_accept(SSL *ssl); |
diff --git a/src/lib/libssl/src/ssl/ssl_asn1.c b/src/lib/libssl/src/ssl/ssl_asn1.c index 1d2590268c..566590f171 100644 --- a/src/lib/libssl/src/ssl/ssl_asn1.c +++ b/src/lib/libssl/src/ssl/ssl_asn1.c | |||
| @@ -97,9 +97,6 @@ typedef struct ssl_session_asn1_st { | |||
| 97 | ASN1_OCTET_STRING master_key; | 97 | ASN1_OCTET_STRING master_key; |
| 98 | ASN1_OCTET_STRING session_id; | 98 | ASN1_OCTET_STRING session_id; |
| 99 | ASN1_OCTET_STRING session_id_context; | 99 | ASN1_OCTET_STRING session_id_context; |
| 100 | #ifndef OPENSSL_NO_KRB5 | ||
| 101 | ASN1_OCTET_STRING krb5_princ; | ||
| 102 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 103 | ASN1_INTEGER time; | 100 | ASN1_INTEGER time; |
| 104 | ASN1_INTEGER timeout; | 101 | ASN1_INTEGER timeout; |
| 105 | ASN1_INTEGER verify_result; | 102 | ASN1_INTEGER verify_result; |
| @@ -112,9 +109,6 @@ typedef struct ssl_session_asn1_st { | |||
| 112 | ASN1_OCTET_STRING psk_identity_hint; | 109 | ASN1_OCTET_STRING psk_identity_hint; |
| 113 | ASN1_OCTET_STRING psk_identity; | 110 | ASN1_OCTET_STRING psk_identity; |
| 114 | #endif /* OPENSSL_NO_PSK */ | 111 | #endif /* OPENSSL_NO_PSK */ |
| 115 | #ifndef OPENSSL_NO_SRP | ||
| 116 | ASN1_OCTET_STRING srp_username; | ||
| 117 | #endif /* OPENSSL_NO_SRP */ | ||
| 118 | } SSL_SESSION_ASN1; | 112 | } SSL_SESSION_ASN1; |
| 119 | 113 | ||
| 120 | int | 114 | int |
| @@ -132,9 +126,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 132 | unsigned char cbuf; | 126 | unsigned char cbuf; |
| 133 | int v11 = 0; | 127 | int v11 = 0; |
| 134 | #endif | 128 | #endif |
| 135 | #ifndef OPENSSL_NO_SRP | ||
| 136 | int v12 = 0; | ||
| 137 | #endif | ||
| 138 | long l; | 129 | long l; |
| 139 | SSL_SESSION_ASN1 a; | 130 | SSL_SESSION_ASN1 a; |
| 140 | M_ASN1_I2D_vars(in); | 131 | M_ASN1_I2D_vars(in); |
| @@ -189,13 +180,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 189 | a.session_id_context.type = V_ASN1_OCTET_STRING; | 180 | a.session_id_context.type = V_ASN1_OCTET_STRING; |
| 190 | a.session_id_context.data = in->sid_ctx; | 181 | a.session_id_context.data = in->sid_ctx; |
| 191 | 182 | ||
| 192 | #ifndef OPENSSL_NO_KRB5 | ||
| 193 | if (in->krb5_client_princ_len) { | ||
| 194 | a.krb5_princ.length = in->krb5_client_princ_len; | ||
| 195 | a.krb5_princ.type = V_ASN1_OCTET_STRING; | ||
| 196 | a.krb5_princ.data = in->krb5_client_princ; | ||
| 197 | } | ||
| 198 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 199 | 183 | ||
| 200 | if (in->time != 0L) { | 184 | if (in->time != 0L) { |
| 201 | a.time.length = LSIZE2; | 185 | a.time.length = LSIZE2; |
| @@ -248,23 +232,12 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 248 | a.psk_identity.data = (unsigned char *)(in->psk_identity); | 232 | a.psk_identity.data = (unsigned char *)(in->psk_identity); |
| 249 | } | 233 | } |
| 250 | #endif /* OPENSSL_NO_PSK */ | 234 | #endif /* OPENSSL_NO_PSK */ |
| 251 | #ifndef OPENSSL_NO_SRP | ||
| 252 | if (in->srp_username) { | ||
| 253 | a.srp_username.length = strlen(in->srp_username); | ||
| 254 | a.srp_username.type = V_ASN1_OCTET_STRING; | ||
| 255 | a.srp_username.data = (unsigned char *)(in->srp_username); | ||
| 256 | } | ||
| 257 | #endif /* OPENSSL_NO_SRP */ | ||
| 258 | 235 | ||
| 259 | M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER); | 236 | M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER); |
| 260 | M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER); | 237 | M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER); |
| 261 | M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING); | 238 | M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING); |
| 262 | M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING); | 239 | M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING); |
| 263 | M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING); | 240 | M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING); |
| 264 | #ifndef OPENSSL_NO_KRB5 | ||
| 265 | if (in->krb5_client_princ_len) | ||
| 266 | M_ASN1_I2D_len(&(a.krb5_princ), i2d_ASN1_OCTET_STRING); | ||
| 267 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 268 | if (in->time != 0L) | 241 | if (in->time != 0L) |
| 269 | M_ASN1_I2D_len_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); | 242 | M_ASN1_I2D_len_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); |
| 270 | if (in->timeout != 0L) | 243 | if (in->timeout != 0L) |
| @@ -293,10 +266,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 293 | if (in->psk_identity) | 266 | if (in->psk_identity) |
| 294 | M_ASN1_I2D_len_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING, 8, v8); | 267 | M_ASN1_I2D_len_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING, 8, v8); |
| 295 | #endif /* OPENSSL_NO_PSK */ | 268 | #endif /* OPENSSL_NO_PSK */ |
| 296 | #ifndef OPENSSL_NO_SRP | ||
| 297 | if (in->srp_username) | ||
| 298 | M_ASN1_I2D_len_EXP_opt(&(a.srp_username), i2d_ASN1_OCTET_STRING, 12, v12); | ||
| 299 | #endif /* OPENSSL_NO_SRP */ | ||
| 300 | 269 | ||
| 301 | M_ASN1_I2D_seq_total(); | 270 | M_ASN1_I2D_seq_total(); |
| 302 | 271 | ||
| @@ -305,10 +274,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 305 | M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING); | 274 | M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING); |
| 306 | M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING); | 275 | M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING); |
| 307 | M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING); | 276 | M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING); |
| 308 | #ifndef OPENSSL_NO_KRB5 | ||
| 309 | if (in->krb5_client_princ_len) | ||
| 310 | M_ASN1_I2D_put(&(a.krb5_princ), i2d_ASN1_OCTET_STRING); | ||
| 311 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 312 | if (in->time != 0L) | 277 | if (in->time != 0L) |
| 313 | M_ASN1_I2D_put_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); | 278 | M_ASN1_I2D_put_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); |
| 314 | if (in->timeout != 0L) | 279 | if (in->timeout != 0L) |
| @@ -339,10 +304,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 339 | if (in->compress_meth) | 304 | if (in->compress_meth) |
| 340 | M_ASN1_I2D_put_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING, 11, v11); | 305 | M_ASN1_I2D_put_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING, 11, v11); |
| 341 | #endif | 306 | #endif |
| 342 | #ifndef OPENSSL_NO_SRP | ||
| 343 | if (in->srp_username) | ||
| 344 | M_ASN1_I2D_put_EXP_opt(&(a.srp_username), i2d_ASN1_OCTET_STRING, 12, v12); | ||
| 345 | #endif /* OPENSSL_NO_SRP */ | ||
| 346 | M_ASN1_I2D_finish(); | 307 | M_ASN1_I2D_finish(); |
| 347 | } | 308 | } |
| 348 | 309 | ||
| @@ -420,21 +381,6 @@ d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, long length) | |||
| 420 | 381 | ||
| 421 | os.length = 0; | 382 | os.length = 0; |
| 422 | 383 | ||
| 423 | #ifndef OPENSSL_NO_KRB5 | ||
| 424 | os.length = 0; | ||
| 425 | M_ASN1_D2I_get_opt(osp, d2i_ASN1_OCTET_STRING, V_ASN1_OCTET_STRING); | ||
| 426 | if (os.data) { | ||
| 427 | if (os.length > SSL_MAX_KRB5_PRINCIPAL_LENGTH) | ||
| 428 | ret->krb5_client_princ_len = 0; | ||
| 429 | else | ||
| 430 | ret->krb5_client_princ_len = os.length; | ||
| 431 | memcpy(ret->krb5_client_princ, os.data, ret->krb5_client_princ_len); | ||
| 432 | free(os.data); | ||
| 433 | os.data = NULL; | ||
| 434 | os.length = 0; | ||
| 435 | } else | ||
| 436 | ret->krb5_client_princ_len = 0; | ||
| 437 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 438 | 384 | ||
| 439 | ai.length = 0; | 385 | ai.length = 0; |
| 440 | M_ASN1_D2I_get_EXP_opt(aip, d2i_ASN1_INTEGER, 1); /* XXX 2038 */ | 386 | M_ASN1_D2I_get_EXP_opt(aip, d2i_ASN1_INTEGER, 1); /* XXX 2038 */ |
| @@ -561,18 +507,6 @@ d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, long length) | |||
| 561 | } | 507 | } |
| 562 | #endif | 508 | #endif |
| 563 | 509 | ||
| 564 | #ifndef OPENSSL_NO_SRP | ||
| 565 | os.length = 0; | ||
| 566 | os.data = NULL; | ||
| 567 | M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 12); | ||
| 568 | if (os.data) { | ||
| 569 | ret->srp_username = BUF_strndup((char *)os.data, os.length); | ||
| 570 | free(os.data); | ||
| 571 | os.data = NULL; | ||
| 572 | os.length = 0; | ||
| 573 | } else | ||
| 574 | ret->srp_username = NULL; | ||
| 575 | #endif /* OPENSSL_NO_SRP */ | ||
| 576 | 510 | ||
| 577 | M_ASN1_D2I_Finish(a, SSL_SESSION_free, SSL_F_D2I_SSL_SESSION); | 511 | M_ASN1_D2I_Finish(a, SSL_SESSION_free, SSL_F_D2I_SSL_SESSION); |
| 578 | } | 512 | } |
diff --git a/src/lib/libssl/src/ssl/ssl_ciph.c b/src/lib/libssl/src/ssl/ssl_ciph.c index 00ab752de1..a1523524a1 100644 --- a/src/lib/libssl/src/ssl/ssl_ciph.c +++ b/src/lib/libssl/src/ssl/ssl_ciph.c | |||
| @@ -702,10 +702,8 @@ ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, unsigned long | |||
| 702 | *mkey |= SSL_kDHr|SSL_kDHd|SSL_kEDH; | 702 | *mkey |= SSL_kDHr|SSL_kDHd|SSL_kEDH; |
| 703 | *auth |= SSL_aDH; | 703 | *auth |= SSL_aDH; |
| 704 | #endif | 704 | #endif |
| 705 | #ifdef OPENSSL_NO_KRB5 | ||
| 706 | *mkey |= SSL_kKRB5; | 705 | *mkey |= SSL_kKRB5; |
| 707 | *auth |= SSL_aKRB5; | 706 | *auth |= SSL_aKRB5; |
| 708 | #endif | ||
| 709 | #ifdef OPENSSL_NO_ECDSA | 707 | #ifdef OPENSSL_NO_ECDSA |
| 710 | *auth |= SSL_aECDSA; | 708 | *auth |= SSL_aECDSA; |
| 711 | #endif | 709 | #endif |
| @@ -717,9 +715,7 @@ ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, unsigned long | |||
| 717 | *mkey |= SSL_kPSK; | 715 | *mkey |= SSL_kPSK; |
| 718 | *auth |= SSL_aPSK; | 716 | *auth |= SSL_aPSK; |
| 719 | #endif | 717 | #endif |
| 720 | #ifdef OPENSSL_NO_SRP | ||
| 721 | *mkey |= SSL_kSRP; | 718 | *mkey |= SSL_kSRP; |
| 722 | #endif | ||
| 723 | /* Check for presence of GOST 34.10 algorithms, and if they | 719 | /* Check for presence of GOST 34.10 algorithms, and if they |
| 724 | * do not present, disable appropriate auth and key exchange */ | 720 | * do not present, disable appropriate auth and key exchange */ |
| 725 | if (!get_optional_pkey_id("gost94")) { | 721 | if (!get_optional_pkey_id("gost94")) { |
diff --git a/src/lib/libssl/src/ssl/ssl_lib.c b/src/lib/libssl/src/ssl/ssl_lib.c index 195271a554..d046480feb 100644 --- a/src/lib/libssl/src/ssl/ssl_lib.c +++ b/src/lib/libssl/src/ssl/ssl_lib.c | |||
| @@ -284,9 +284,6 @@ SSL_new(SSL_CTX *ctx) | |||
| 284 | if (s == NULL) | 284 | if (s == NULL) |
| 285 | goto err; | 285 | goto err; |
| 286 | 286 | ||
| 287 | #ifndef OPENSSL_NO_KRB5 | ||
| 288 | s->kssl_ctx = kssl_ctx_new(); | ||
| 289 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 290 | 287 | ||
| 291 | s->options = ctx->options; | 288 | s->options = ctx->options; |
| 292 | s->mode = ctx->mode; | 289 | s->mode = ctx->mode; |
| @@ -580,10 +577,6 @@ SSL_free(SSL *s) | |||
| 580 | if (s->ctx) | 577 | if (s->ctx) |
| 581 | SSL_CTX_free(s->ctx); | 578 | SSL_CTX_free(s->ctx); |
| 582 | 579 | ||
| 583 | #ifndef OPENSSL_NO_KRB5 | ||
| 584 | if (s->kssl_ctx != NULL) | ||
| 585 | kssl_ctx_free(s->kssl_ctx); | ||
| 586 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 587 | 580 | ||
| 588 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) | 581 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) |
| 589 | if (s->next_proto_negotiated) | 582 | if (s->next_proto_negotiated) |
| @@ -1415,9 +1408,6 @@ ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, | |||
| 1415 | int i, j = 0; | 1408 | int i, j = 0; |
| 1416 | SSL_CIPHER *c; | 1409 | SSL_CIPHER *c; |
| 1417 | unsigned char *q; | 1410 | unsigned char *q; |
| 1418 | #ifndef OPENSSL_NO_KRB5 | ||
| 1419 | int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx); | ||
| 1420 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 1421 | 1411 | ||
| 1422 | if (sk == NULL) | 1412 | if (sk == NULL) |
| 1423 | return (0); | 1413 | return (0); |
| @@ -1429,11 +1419,6 @@ ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, | |||
| 1429 | if ((c->algorithm_ssl & SSL_TLSV1_2) && | 1419 | if ((c->algorithm_ssl & SSL_TLSV1_2) && |
| 1430 | (TLS1_get_client_version(s) < TLS1_2_VERSION)) | 1420 | (TLS1_get_client_version(s) < TLS1_2_VERSION)) |
| 1431 | continue; | 1421 | continue; |
| 1432 | #ifndef OPENSSL_NO_KRB5 | ||
| 1433 | if (((c->algorithm_mkey & SSL_kKRB5) || | ||
| 1434 | (c->algorithm_auth & SSL_aKRB5)) && nokrb5) | ||
| 1435 | continue; | ||
| 1436 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 1437 | #ifndef OPENSSL_NO_PSK | 1422 | #ifndef OPENSSL_NO_PSK |
| 1438 | /* with PSK there must be client callback set */ | 1423 | /* with PSK there must be client callback set */ |
| 1439 | if (((c->algorithm_mkey & SSL_kPSK) || | 1424 | if (((c->algorithm_mkey & SSL_kPSK) || |
| @@ -1877,9 +1862,6 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1877 | ret->psk_client_callback = NULL; | 1862 | ret->psk_client_callback = NULL; |
| 1878 | ret->psk_server_callback = NULL; | 1863 | ret->psk_server_callback = NULL; |
| 1879 | #endif | 1864 | #endif |
| 1880 | #ifndef OPENSSL_NO_SRP | ||
| 1881 | SSL_CTX_SRP_CTX_init(ret); | ||
| 1882 | #endif | ||
| 1883 | #ifndef OPENSSL_NO_ENGINE | 1865 | #ifndef OPENSSL_NO_ENGINE |
| 1884 | ret->client_cert_engine = NULL; | 1866 | ret->client_cert_engine = NULL; |
| 1885 | #ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO | 1867 | #ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO |
| @@ -1983,9 +1965,6 @@ SSL_CTX_free(SSL_CTX *a) | |||
| 1983 | if (a->psk_identity_hint) | 1965 | if (a->psk_identity_hint) |
| 1984 | free(a->psk_identity_hint); | 1966 | free(a->psk_identity_hint); |
| 1985 | #endif | 1967 | #endif |
| 1986 | #ifndef OPENSSL_NO_SRP | ||
| 1987 | SSL_CTX_SRP_CTX_free(a); | ||
| 1988 | #endif | ||
| 1989 | #ifndef OPENSSL_NO_ENGINE | 1968 | #ifndef OPENSSL_NO_ENGINE |
| 1990 | if (a->client_cert_engine) | 1969 | if (a->client_cert_engine) |
| 1991 | ENGINE_finish(a->client_cert_engine); | 1970 | ENGINE_finish(a->client_cert_engine); |
| @@ -2147,12 +2126,6 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
| 2147 | mask_a|=SSL_aNULL; | 2126 | mask_a|=SSL_aNULL; |
| 2148 | emask_a|=SSL_aNULL; | 2127 | emask_a|=SSL_aNULL; |
| 2149 | 2128 | ||
| 2150 | #ifndef OPENSSL_NO_KRB5 | ||
| 2151 | mask_k|=SSL_kKRB5; | ||
| 2152 | mask_a|=SSL_aKRB5; | ||
| 2153 | emask_k|=SSL_kKRB5; | ||
| 2154 | emask_a|=SSL_aKRB5; | ||
| 2155 | #endif | ||
| 2156 | 2129 | ||
| 2157 | /* | 2130 | /* |
| 2158 | * An ECC certificate may be usable for ECDH and/or | 2131 | * An ECC certificate may be usable for ECDH and/or |
diff --git a/src/lib/libssl/src/ssl/ssl_sess.c b/src/lib/libssl/src/ssl/ssl_sess.c index 2b8da1ccae..05c6948efc 100644 --- a/src/lib/libssl/src/ssl/ssl_sess.c +++ b/src/lib/libssl/src/ssl/ssl_sess.c | |||
| @@ -223,9 +223,6 @@ SSL_SESSION_new(void) | |||
| 223 | ss->psk_identity_hint = NULL; | 223 | ss->psk_identity_hint = NULL; |
| 224 | ss->psk_identity = NULL; | 224 | ss->psk_identity = NULL; |
| 225 | #endif | 225 | #endif |
| 226 | #ifndef OPENSSL_NO_SRP | ||
| 227 | ss->srp_username = NULL; | ||
| 228 | #endif | ||
| 229 | return (ss); | 226 | return (ss); |
| 230 | } | 227 | } |
| 231 | 228 | ||
| @@ -726,10 +723,6 @@ SSL_SESSION_free(SSL_SESSION *ss) | |||
| 726 | if (ss->psk_identity != NULL) | 723 | if (ss->psk_identity != NULL) |
| 727 | free(ss->psk_identity); | 724 | free(ss->psk_identity); |
| 728 | #endif | 725 | #endif |
| 729 | #ifndef OPENSSL_NO_SRP | ||
| 730 | if (ss->srp_username != NULL) | ||
| 731 | free(ss->srp_username); | ||
| 732 | #endif | ||
| 733 | OPENSSL_cleanse(ss, sizeof(*ss)); | 726 | OPENSSL_cleanse(ss, sizeof(*ss)); |
| 734 | free(ss); | 727 | free(ss); |
| 735 | } | 728 | } |
| @@ -754,15 +747,6 @@ SSL_set_session(SSL *s, SSL_SESSION *session) | |||
| 754 | return (0); | 747 | return (0); |
| 755 | } | 748 | } |
| 756 | 749 | ||
| 757 | #ifndef OPENSSL_NO_KRB5 | ||
| 758 | if (s->kssl_ctx && !s->kssl_ctx->client_princ && | ||
| 759 | session->krb5_client_princ_len > 0) { | ||
| 760 | s->kssl_ctx->client_princ = malloc(session->krb5_client_princ_len + 1); | ||
| 761 | memcpy(s->kssl_ctx->client_princ, session->krb5_client_princ, | ||
| 762 | session->krb5_client_princ_len); | ||
| 763 | s->kssl_ctx->client_princ[session->krb5_client_princ_len] = '\0'; | ||
| 764 | } | ||
| 765 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 766 | 750 | ||
| 767 | /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/ | 751 | /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/ |
| 768 | CRYPTO_add(&session->references, 1, CRYPTO_LOCK_SSL_SESSION); | 752 | CRYPTO_add(&session->references, 1, CRYPTO_LOCK_SSL_SESSION); |
diff --git a/src/lib/libssl/src/ssl/ssl_txt.c b/src/lib/libssl/src/ssl/ssl_txt.c index c6bfd68de6..01dd846596 100644 --- a/src/lib/libssl/src/ssl/ssl_txt.c +++ b/src/lib/libssl/src/ssl/ssl_txt.c | |||
| @@ -161,19 +161,6 @@ SSL_SESSION_print(BIO *bp, const SSL_SESSION *x) | |||
| 161 | if (BIO_printf(bp, "%02X", x->master_key[i]) <= 0) | 161 | if (BIO_printf(bp, "%02X", x->master_key[i]) <= 0) |
| 162 | goto err; | 162 | goto err; |
| 163 | } | 163 | } |
| 164 | #ifndef OPENSSL_NO_KRB5 | ||
| 165 | if (BIO_puts(bp, "\n Krb5 Principal: ") <= 0) | ||
| 166 | goto err; | ||
| 167 | if (x->krb5_client_princ_len == 0) { | ||
| 168 | if (BIO_puts(bp, "None") <= 0) | ||
| 169 | goto err; | ||
| 170 | } else { | ||
| 171 | for (i = 0; i < x->krb5_client_princ_len; i++) { | ||
| 172 | if (BIO_printf(bp, "%02X", x->krb5_client_princ[i]) <= 0) | ||
| 173 | goto err; | ||
| 174 | } | ||
| 175 | } | ||
| 176 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 177 | #ifndef OPENSSL_NO_PSK | 164 | #ifndef OPENSSL_NO_PSK |
| 178 | if (BIO_puts(bp, "\n PSK identity: ") <= 0) | 165 | if (BIO_puts(bp, "\n PSK identity: ") <= 0) |
| 179 | goto err; | 166 | goto err; |
| @@ -184,12 +171,6 @@ SSL_SESSION_print(BIO *bp, const SSL_SESSION *x) | |||
| 184 | if (BIO_printf(bp, "%s", x->psk_identity_hint ? x->psk_identity_hint : "None") <= 0) | 171 | if (BIO_printf(bp, "%s", x->psk_identity_hint ? x->psk_identity_hint : "None") <= 0) |
| 185 | goto err; | 172 | goto err; |
| 186 | #endif | 173 | #endif |
| 187 | #ifndef OPENSSL_NO_SRP | ||
| 188 | if (BIO_puts(bp, "\n SRP username: ") <= 0) | ||
| 189 | goto err; | ||
| 190 | if (BIO_printf(bp, "%s", x->srp_username ? x->srp_username : "None") <= 0) | ||
| 191 | goto err; | ||
| 192 | #endif | ||
| 193 | #ifndef OPENSSL_NO_TLSEXT | 174 | #ifndef OPENSSL_NO_TLSEXT |
| 194 | if (x->tlsext_tick_lifetime_hint) { | 175 | if (x->tlsext_tick_lifetime_hint) { |
| 195 | if (BIO_printf(bp, | 176 | if (BIO_printf(bp, |
diff --git a/src/lib/libssl/src/ssl/ssltest.c b/src/lib/libssl/src/ssl/ssltest.c index 1f5014baf3..879bf4b3ed 100644 --- a/src/lib/libssl/src/ssl/ssltest.c +++ b/src/lib/libssl/src/ssl/ssltest.c | |||
| @@ -178,9 +178,6 @@ | |||
| 178 | #ifndef OPENSSL_NO_DH | 178 | #ifndef OPENSSL_NO_DH |
| 179 | #include <openssl/dh.h> | 179 | #include <openssl/dh.h> |
| 180 | #endif | 180 | #endif |
| 181 | #ifndef OPENSSL_NO_SRP | ||
| 182 | #include <openssl/srp.h> | ||
| 183 | #endif | ||
| 184 | #include <openssl/bn.h> | 181 | #include <openssl/bn.h> |
| 185 | 182 | ||
| 186 | #define _XOPEN_SOURCE_EXTENDED 1 | 183 | #define _XOPEN_SOURCE_EXTENDED 1 |
| @@ -227,46 +224,6 @@ static unsigned int psk_server_callback(SSL *ssl, const char *identity, | |||
| 227 | unsigned char *psk, unsigned int max_psk_len); | 224 | unsigned char *psk, unsigned int max_psk_len); |
| 228 | #endif | 225 | #endif |
| 229 | 226 | ||
| 230 | #ifndef OPENSSL_NO_SRP | ||
| 231 | /* SRP client */ | ||
| 232 | /* This is a context that we pass to all callbacks */ | ||
| 233 | typedef struct srp_client_arg_st { | ||
| 234 | char *srppassin; | ||
| 235 | char *srplogin; | ||
| 236 | } SRP_CLIENT_ARG; | ||
| 237 | |||
| 238 | #define PWD_STRLEN 1024 | ||
| 239 | |||
| 240 | static char * | ||
| 241 | ssl_give_srp_client_pwd_cb(SSL *s, void *arg) | ||
| 242 | { | ||
| 243 | SRP_CLIENT_ARG *srp_client_arg = (SRP_CLIENT_ARG *)arg; | ||
| 244 | return BUF_strdup((char *)srp_client_arg->srppassin); | ||
| 245 | } | ||
| 246 | |||
| 247 | /* SRP server */ | ||
| 248 | /* This is a context that we pass to SRP server callbacks */ | ||
| 249 | typedef struct srp_server_arg_st { | ||
| 250 | char *expected_user; | ||
| 251 | char *pass; | ||
| 252 | } SRP_SERVER_ARG; | ||
| 253 | |||
| 254 | static int | ||
| 255 | ssl_srp_server_param_cb(SSL *s, int *ad, void *arg) | ||
| 256 | { | ||
| 257 | SRP_SERVER_ARG *p = (SRP_SERVER_ARG *) arg; | ||
| 258 | |||
| 259 | if (strcmp(p->expected_user, SSL_get_srp_username(s)) != 0) { | ||
| 260 | fprintf(stderr, "User %s doesn't exist\n", SSL_get_srp_username(s)); | ||
| 261 | return SSL3_AL_FATAL; | ||
| 262 | } | ||
| 263 | if (SSL_set_srp_server_param_pw(s, p->expected_user, p->pass, "1024") < 0) { | ||
| 264 | *ad = SSL_AD_INTERNAL_ERROR; | ||
| 265 | return SSL3_AL_FATAL; | ||
| 266 | } | ||
| 267 | return SSL_ERROR_NONE; | ||
| 268 | } | ||
| 269 | #endif | ||
| 270 | 227 | ||
| 271 | static BIO *bio_err = NULL; | 228 | static BIO *bio_err = NULL; |
| 272 | static BIO *bio_stdout = NULL; | 229 | static BIO *bio_stdout = NULL; |
| @@ -311,10 +268,6 @@ sv_usage(void) | |||
| 311 | #ifndef OPENSSL_NO_PSK | 268 | #ifndef OPENSSL_NO_PSK |
| 312 | fprintf(stderr, " -psk arg - PSK in hex (without 0x)\n"); | 269 | fprintf(stderr, " -psk arg - PSK in hex (without 0x)\n"); |
| 313 | #endif | 270 | #endif |
| 314 | #ifndef OPENSSL_NO_SRP | ||
| 315 | fprintf(stderr, " -srpuser user - SRP username to use\n"); | ||
| 316 | fprintf(stderr, " -srppass arg - password for 'user'\n"); | ||
| 317 | #endif | ||
| 318 | fprintf(stderr, " -ssl3 - use SSLv3\n"); | 271 | fprintf(stderr, " -ssl3 - use SSLv3\n"); |
| 319 | fprintf(stderr, " -tls1 - use TLSv1\n"); | 272 | fprintf(stderr, " -tls1 - use TLSv1\n"); |
| 320 | fprintf(stderr, " -CApath arg - PEM format directory of CA's\n"); | 273 | fprintf(stderr, " -CApath arg - PEM format directory of CA's\n"); |
| @@ -484,12 +437,6 @@ main(int argc, char *argv[]) | |||
| 484 | #ifndef OPENSSL_NO_ECDH | 437 | #ifndef OPENSSL_NO_ECDH |
| 485 | EC_KEY *ecdh = NULL; | 438 | EC_KEY *ecdh = NULL; |
| 486 | #endif | 439 | #endif |
| 487 | #ifndef OPENSSL_NO_SRP | ||
| 488 | /* client */ | ||
| 489 | SRP_CLIENT_ARG srp_client_arg = {NULL, NULL}; | ||
| 490 | /* server */ | ||
| 491 | SRP_SERVER_ARG srp_server_arg = {NULL, NULL}; | ||
| 492 | #endif | ||
| 493 | int no_dhe = 0; | 440 | int no_dhe = 0; |
| 494 | int no_ecdhe = 0; | 441 | int no_ecdhe = 0; |
| 495 | int no_psk = 0; | 442 | int no_psk = 0; |
| @@ -577,19 +524,6 @@ main(int argc, char *argv[]) | |||
| 577 | no_psk = 1; | 524 | no_psk = 1; |
| 578 | #endif | 525 | #endif |
| 579 | } | 526 | } |
| 580 | #ifndef OPENSSL_NO_SRP | ||
| 581 | else if (strcmp(*argv, "-srpuser") == 0) { | ||
| 582 | if (--argc < 1) | ||
| 583 | goto bad; | ||
| 584 | srp_server_arg.expected_user = srp_client_arg.srplogin= *(++argv); | ||
| 585 | tls1 = 1; | ||
| 586 | } else if (strcmp(*argv, "-srppass") == 0) { | ||
| 587 | if (--argc < 1) | ||
| 588 | goto bad; | ||
| 589 | srp_server_arg.pass = srp_client_arg.srppassin= *(++argv); | ||
| 590 | tls1 = 1; | ||
| 591 | } | ||
| 592 | #endif | ||
| 593 | else if (strcmp(*argv, "-ssl2") == 0) | 527 | else if (strcmp(*argv, "-ssl2") == 0) |
| 594 | ssl2 = 1; | 528 | ssl2 = 1; |
| 595 | else if (strcmp(*argv, "-tls1") == 0) | 529 | else if (strcmp(*argv, "-tls1") == 0) |
| @@ -895,42 +829,10 @@ bad: | |||
| 895 | } | 829 | } |
| 896 | #endif | 830 | #endif |
| 897 | } | 831 | } |
| 898 | #ifndef OPENSSL_NO_SRP | ||
| 899 | if (srp_client_arg.srplogin) { | ||
| 900 | if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin)) { | ||
| 901 | BIO_printf(bio_err, "Unable to set SRP username\n"); | ||
| 902 | goto end; | ||
| 903 | } | ||
| 904 | SSL_CTX_set_srp_cb_arg(c_ctx, &srp_client_arg); | ||
| 905 | SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb); | ||
| 906 | /*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/ | ||
| 907 | } | ||
| 908 | |||
| 909 | if (srp_server_arg.expected_user != NULL) { | ||
| 910 | SSL_CTX_set_verify(s_ctx, SSL_VERIFY_NONE, verify_callback); | ||
| 911 | SSL_CTX_set_srp_cb_arg(s_ctx, &srp_server_arg); | ||
| 912 | SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb); | ||
| 913 | } | ||
| 914 | #endif | ||
| 915 | 832 | ||
| 916 | c_ssl = SSL_new(c_ctx); | 833 | c_ssl = SSL_new(c_ctx); |
| 917 | s_ssl = SSL_new(s_ctx); | 834 | s_ssl = SSL_new(s_ctx); |
| 918 | 835 | ||
| 919 | #ifndef OPENSSL_NO_KRB5 | ||
| 920 | if (c_ssl && c_ssl->kssl_ctx) { | ||
| 921 | char localhost[MAXHOSTNAMELEN + 2]; | ||
| 922 | |||
| 923 | if (gethostname(localhost, sizeof localhost - 1) == 0) { | ||
| 924 | localhost[sizeof localhost - 1] = '\0'; | ||
| 925 | if (strlen(localhost) == sizeof localhost - 1) { | ||
| 926 | BIO_printf(bio_err, "localhost name too long\n"); | ||
| 927 | goto end; | ||
| 928 | } | ||
| 929 | kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER, | ||
| 930 | localhost); | ||
| 931 | } | ||
| 932 | } | ||
| 933 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 934 | 836 | ||
| 935 | for (i = 0; i < number; i++) { | 837 | for (i = 0; i < number; i++) { |
| 936 | if (!reuse) | 838 | if (!reuse) |
diff --git a/src/lib/libssl/src/ssl/t1_lib.c b/src/lib/libssl/src/ssl/t1_lib.c index bb33331862..2e183bb233 100644 --- a/src/lib/libssl/src/ssl/t1_lib.c +++ b/src/lib/libssl/src/ssl/t1_lib.c | |||
| @@ -415,35 +415,6 @@ ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit) | |||
| 415 | ret += el; | 415 | ret += el; |
| 416 | } | 416 | } |
| 417 | 417 | ||
| 418 | #ifndef OPENSSL_NO_SRP | ||
| 419 | /* Add SRP username if there is one */ | ||
| 420 | if (s->srp_ctx.login != NULL) { | ||
| 421 | /* Add TLS extension SRP username to the Client Hello message */ | ||
| 422 | |||
| 423 | int login_len = strlen(s->srp_ctx.login); | ||
| 424 | |||
| 425 | if (login_len > 255 || login_len == 0) { | ||
| 426 | SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR); | ||
| 427 | return NULL; | ||
| 428 | } | ||
| 429 | |||
| 430 | /* check for enough space. | ||
| 431 | 4 for the srp type type and entension length | ||
| 432 | 1 for the srp user identity | ||
| 433 | + srp user identity length | ||
| 434 | */ | ||
| 435 | if ((limit - ret - 5 - login_len) < 0) | ||
| 436 | return NULL; | ||
| 437 | |||
| 438 | |||
| 439 | /* fill in the extension */ | ||
| 440 | s2n(TLSEXT_TYPE_srp, ret); | ||
| 441 | s2n(login_len + 1, ret); | ||
| 442 | (*ret++) = (unsigned char) login_len; | ||
| 443 | memcpy(ret, s->srp_ctx.login, login_len); | ||
| 444 | ret += login_len; | ||
| 445 | } | ||
| 446 | #endif | ||
| 447 | 418 | ||
| 448 | #ifndef OPENSSL_NO_EC | 419 | #ifndef OPENSSL_NO_EC |
| 449 | if (s->tlsext_ecpointformatlist != NULL && | 420 | if (s->tlsext_ecpointformatlist != NULL && |
| @@ -1063,27 +1034,6 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
| 1063 | } | 1034 | } |
| 1064 | 1035 | ||
| 1065 | } | 1036 | } |
| 1066 | #ifndef OPENSSL_NO_SRP | ||
| 1067 | else if (type == TLSEXT_TYPE_srp) { | ||
| 1068 | if (size <= 0 || ((len = data[0])) != (size - 1)) { | ||
| 1069 | *al = SSL_AD_DECODE_ERROR; | ||
| 1070 | return 0; | ||
| 1071 | } | ||
| 1072 | if (s->srp_ctx.login != NULL) { | ||
| 1073 | *al = SSL_AD_DECODE_ERROR; | ||
| 1074 | return 0; | ||
| 1075 | } | ||
| 1076 | if ((s->srp_ctx.login = malloc(len + 1)) == NULL) | ||
| 1077 | return -1; | ||
| 1078 | memcpy(s->srp_ctx.login, &data[1], len); | ||
| 1079 | s->srp_ctx.login[len] = '\0'; | ||
| 1080 | |||
| 1081 | if (strlen(s->srp_ctx.login) != len) { | ||
| 1082 | *al = SSL_AD_DECODE_ERROR; | ||
| 1083 | return 0; | ||
| 1084 | } | ||
| 1085 | } | ||
| 1086 | #endif | ||
| 1087 | 1037 | ||
| 1088 | #ifndef OPENSSL_NO_EC | 1038 | #ifndef OPENSSL_NO_EC |
| 1089 | else if (type == TLSEXT_TYPE_ec_point_formats && | 1039 | else if (type == TLSEXT_TYPE_ec_point_formats && |
diff --git a/src/lib/libssl/src/ssl/tls_srp.c b/src/lib/libssl/src/ssl/tls_srp.c deleted file mode 100644 index e03eabcef6..0000000000 --- a/src/lib/libssl/src/ssl/tls_srp.c +++ /dev/null | |||
| @@ -1,516 +0,0 @@ | |||
| 1 | /* ssl/tls_srp.c */ | ||
| 2 | /* Written by Christophe Renou (christophe.renou@edelweb.fr) with | ||
| 3 | * the precious help of Peter Sylvester (peter.sylvester@edelweb.fr) | ||
| 4 | * for the EdelKey project and contributed to the OpenSSL project 2004. | ||
| 5 | */ | ||
| 6 | /* ==================================================================== | ||
| 7 | * Copyright (c) 2004-2011 The OpenSSL Project. All rights reserved. | ||
| 8 | * | ||
| 9 | * Redistribution and use in source and binary forms, with or without | ||
| 10 | * modification, are permitted provided that the following conditions | ||
| 11 | * are met: | ||
| 12 | * | ||
| 13 | * 1. Redistributions of source code must retain the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer. | ||
| 15 | * | ||
| 16 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 17 | * notice, this list of conditions and the following disclaimer in | ||
| 18 | * the documentation and/or other materials provided with the | ||
| 19 | * distribution. | ||
| 20 | * | ||
| 21 | * 3. All advertising materials mentioning features or use of this | ||
| 22 | * software must display the following acknowledgment: | ||
| 23 | * "This product includes software developed by the OpenSSL Project | ||
| 24 | * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | ||
| 25 | * | ||
| 26 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
| 27 | * endorse or promote products derived from this software without | ||
| 28 | * prior written permission. For written permission, please contact | ||
| 29 | * licensing@OpenSSL.org. | ||
| 30 | * | ||
| 31 | * 5. Products derived from this software may not be called "OpenSSL" | ||
| 32 | * nor may "OpenSSL" appear in their names without prior written | ||
| 33 | * permission of the OpenSSL Project. | ||
| 34 | * | ||
| 35 | * 6. Redistributions of any form whatsoever must retain the following | ||
| 36 | * acknowledgment: | ||
| 37 | * "This product includes software developed by the OpenSSL Project | ||
| 38 | * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | ||
| 39 | * | ||
| 40 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
| 41 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 42 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
| 43 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
| 44 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 45 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 46 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 47 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 48 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 49 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 50 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 51 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 52 | * ==================================================================== | ||
| 53 | * | ||
| 54 | * This product includes cryptographic software written by Eric Young | ||
| 55 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 56 | * Hudson (tjh@cryptsoft.com). | ||
| 57 | * | ||
| 58 | */ | ||
| 59 | #include "ssl_locl.h" | ||
| 60 | #ifndef OPENSSL_NO_SRP | ||
| 61 | |||
| 62 | #include <openssl/rand.h> | ||
| 63 | #include <openssl/srp.h> | ||
| 64 | #include <openssl/err.h> | ||
| 65 | |||
| 66 | int | ||
| 67 | SSL_CTX_SRP_CTX_free(struct ssl_ctx_st *ctx) | ||
| 68 | { | ||
| 69 | if (ctx == NULL) | ||
| 70 | return 0; | ||
| 71 | free(ctx->srp_ctx.login); | ||
| 72 | BN_free(ctx->srp_ctx.N); | ||
| 73 | BN_free(ctx->srp_ctx.g); | ||
| 74 | BN_free(ctx->srp_ctx.s); | ||
| 75 | BN_free(ctx->srp_ctx.B); | ||
| 76 | BN_free(ctx->srp_ctx.A); | ||
| 77 | BN_free(ctx->srp_ctx.a); | ||
| 78 | BN_free(ctx->srp_ctx.b); | ||
| 79 | BN_free(ctx->srp_ctx.v); | ||
| 80 | ctx->srp_ctx.TLS_ext_srp_username_callback = NULL; | ||
| 81 | ctx->srp_ctx.SRP_cb_arg = NULL; | ||
| 82 | ctx->srp_ctx.SRP_verify_param_callback = NULL; | ||
| 83 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = NULL; | ||
| 84 | ctx->srp_ctx.N = NULL; | ||
| 85 | ctx->srp_ctx.g = NULL; | ||
| 86 | ctx->srp_ctx.s = NULL; | ||
| 87 | ctx->srp_ctx.B = NULL; | ||
| 88 | ctx->srp_ctx.A = NULL; | ||
| 89 | ctx->srp_ctx.a = NULL; | ||
| 90 | ctx->srp_ctx.b = NULL; | ||
| 91 | ctx->srp_ctx.v = NULL; | ||
| 92 | ctx->srp_ctx.login = NULL; | ||
| 93 | ctx->srp_ctx.info = NULL; | ||
| 94 | ctx->srp_ctx.strength = SRP_MINIMAL_N; | ||
| 95 | ctx->srp_ctx.srp_Mask = 0; | ||
| 96 | return (1); | ||
| 97 | } | ||
| 98 | |||
| 99 | int | ||
| 100 | SSL_SRP_CTX_free(struct ssl_st *s) | ||
| 101 | { | ||
| 102 | if (s == NULL) | ||
| 103 | return 0; | ||
| 104 | free(s->srp_ctx.login); | ||
| 105 | BN_free(s->srp_ctx.N); | ||
| 106 | BN_free(s->srp_ctx.g); | ||
| 107 | BN_free(s->srp_ctx.s); | ||
| 108 | BN_free(s->srp_ctx.B); | ||
| 109 | BN_free(s->srp_ctx.A); | ||
| 110 | BN_free(s->srp_ctx.a); | ||
| 111 | BN_free(s->srp_ctx.b); | ||
| 112 | BN_free(s->srp_ctx.v); | ||
| 113 | s->srp_ctx.TLS_ext_srp_username_callback = NULL; | ||
| 114 | s->srp_ctx.SRP_cb_arg = NULL; | ||
| 115 | s->srp_ctx.SRP_verify_param_callback = NULL; | ||
| 116 | s->srp_ctx.SRP_give_srp_client_pwd_callback = NULL; | ||
| 117 | s->srp_ctx.N = NULL; | ||
| 118 | s->srp_ctx.g = NULL; | ||
| 119 | s->srp_ctx.s = NULL; | ||
| 120 | s->srp_ctx.B = NULL; | ||
| 121 | s->srp_ctx.A = NULL; | ||
| 122 | s->srp_ctx.a = NULL; | ||
| 123 | s->srp_ctx.b = NULL; | ||
| 124 | s->srp_ctx.v = NULL; | ||
| 125 | s->srp_ctx.login = NULL; | ||
| 126 | s->srp_ctx.info = NULL; | ||
| 127 | s->srp_ctx.strength = SRP_MINIMAL_N; | ||
| 128 | s->srp_ctx.srp_Mask = 0; | ||
| 129 | return (1); | ||
| 130 | } | ||
| 131 | |||
| 132 | int | ||
| 133 | SSL_SRP_CTX_init(struct ssl_st *s) | ||
| 134 | { | ||
| 135 | SSL_CTX *ctx; | ||
| 136 | |||
| 137 | if ((s == NULL) || ((ctx = s->ctx) == NULL)) | ||
| 138 | return 0; | ||
| 139 | s->srp_ctx.SRP_cb_arg = ctx->srp_ctx.SRP_cb_arg; | ||
| 140 | /* set client Hello login callback */ | ||
| 141 | s->srp_ctx.TLS_ext_srp_username_callback = ctx->srp_ctx.TLS_ext_srp_username_callback; | ||
| 142 | /* set SRP N/g param callback for verification */ | ||
| 143 | s->srp_ctx.SRP_verify_param_callback = ctx->srp_ctx.SRP_verify_param_callback; | ||
| 144 | /* set SRP client passwd callback */ | ||
| 145 | s->srp_ctx.SRP_give_srp_client_pwd_callback = ctx->srp_ctx.SRP_give_srp_client_pwd_callback; | ||
| 146 | |||
| 147 | s->srp_ctx.N = NULL; | ||
| 148 | s->srp_ctx.g = NULL; | ||
| 149 | s->srp_ctx.s = NULL; | ||
| 150 | s->srp_ctx.B = NULL; | ||
| 151 | s->srp_ctx.A = NULL; | ||
| 152 | s->srp_ctx.a = NULL; | ||
| 153 | s->srp_ctx.b = NULL; | ||
| 154 | s->srp_ctx.v = NULL; | ||
| 155 | s->srp_ctx.login = NULL; | ||
| 156 | s->srp_ctx.info = ctx->srp_ctx.info; | ||
| 157 | s->srp_ctx.strength = ctx->srp_ctx.strength; | ||
| 158 | |||
| 159 | if (((ctx->srp_ctx.N != NULL) && | ||
| 160 | ((s->srp_ctx.N = BN_dup(ctx->srp_ctx.N)) == NULL)) || | ||
| 161 | ((ctx->srp_ctx.g != NULL) && | ||
| 162 | ((s->srp_ctx.g = BN_dup(ctx->srp_ctx.g)) == NULL)) || | ||
| 163 | ((ctx->srp_ctx.s != NULL) && | ||
| 164 | ((s->srp_ctx.s = BN_dup(ctx->srp_ctx.s)) == NULL)) || | ||
| 165 | ((ctx->srp_ctx.B != NULL) && | ||
| 166 | ((s->srp_ctx.B = BN_dup(ctx->srp_ctx.B)) == NULL)) || | ||
| 167 | ((ctx->srp_ctx.A != NULL) && | ||
| 168 | ((s->srp_ctx.A = BN_dup(ctx->srp_ctx.A)) == NULL)) || | ||
| 169 | ((ctx->srp_ctx.a != NULL) && | ||
| 170 | ((s->srp_ctx.a = BN_dup(ctx->srp_ctx.a)) == NULL)) || | ||
| 171 | ((ctx->srp_ctx.v != NULL) && | ||
| 172 | ((s->srp_ctx.v = BN_dup(ctx->srp_ctx.v)) == NULL)) || | ||
| 173 | ((ctx->srp_ctx.b != NULL) && | ||
| 174 | ((s->srp_ctx.b = BN_dup(ctx->srp_ctx.b)) == NULL))) { | ||
| 175 | SSLerr(SSL_F_SSL_SRP_CTX_INIT, ERR_R_BN_LIB); | ||
| 176 | goto err; | ||
| 177 | } | ||
| 178 | if ((ctx->srp_ctx.login != NULL) && | ||
| 179 | ((s->srp_ctx.login = BUF_strdup(ctx->srp_ctx.login)) == NULL)) { | ||
| 180 | SSLerr(SSL_F_SSL_SRP_CTX_INIT, ERR_R_INTERNAL_ERROR); | ||
| 181 | goto err; | ||
| 182 | } | ||
| 183 | s->srp_ctx.srp_Mask = ctx->srp_ctx.srp_Mask; | ||
| 184 | |||
| 185 | return (1); | ||
| 186 | err: | ||
| 187 | free(s->srp_ctx.login); | ||
| 188 | BN_free(s->srp_ctx.N); | ||
| 189 | BN_free(s->srp_ctx.g); | ||
| 190 | BN_free(s->srp_ctx.s); | ||
| 191 | BN_free(s->srp_ctx.B); | ||
| 192 | BN_free(s->srp_ctx.A); | ||
| 193 | BN_free(s->srp_ctx.a); | ||
| 194 | BN_free(s->srp_ctx.b); | ||
| 195 | BN_free(s->srp_ctx.v); | ||
| 196 | return (0); | ||
| 197 | } | ||
| 198 | |||
| 199 | int | ||
| 200 | SSL_CTX_SRP_CTX_init(struct ssl_ctx_st *ctx) | ||
| 201 | { | ||
| 202 | if (ctx == NULL) | ||
| 203 | return 0; | ||
| 204 | |||
| 205 | ctx->srp_ctx.SRP_cb_arg = NULL; | ||
| 206 | /* set client Hello login callback */ | ||
| 207 | ctx->srp_ctx.TLS_ext_srp_username_callback = NULL; | ||
| 208 | /* set SRP N/g param callback for verification */ | ||
| 209 | ctx->srp_ctx.SRP_verify_param_callback = NULL; | ||
| 210 | /* set SRP client passwd callback */ | ||
| 211 | ctx->srp_ctx.SRP_give_srp_client_pwd_callback = NULL; | ||
| 212 | |||
| 213 | ctx->srp_ctx.N = NULL; | ||
| 214 | ctx->srp_ctx.g = NULL; | ||
| 215 | ctx->srp_ctx.s = NULL; | ||
| 216 | ctx->srp_ctx.B = NULL; | ||
| 217 | ctx->srp_ctx.A = NULL; | ||
| 218 | ctx->srp_ctx.a = NULL; | ||
| 219 | ctx->srp_ctx.b = NULL; | ||
| 220 | ctx->srp_ctx.v = NULL; | ||
| 221 | ctx->srp_ctx.login = NULL; | ||
| 222 | ctx->srp_ctx.srp_Mask = 0; | ||
| 223 | ctx->srp_ctx.info = NULL; | ||
| 224 | ctx->srp_ctx.strength = SRP_MINIMAL_N; | ||
| 225 | |||
| 226 | return (1); | ||
| 227 | } | ||
| 228 | |||
| 229 | /* server side */ | ||
| 230 | int | ||
| 231 | SSL_srp_server_param_with_username(SSL *s, int *ad) | ||
| 232 | { | ||
| 233 | unsigned char b[SSL_MAX_MASTER_KEY_LENGTH]; | ||
| 234 | int al; | ||
| 235 | |||
| 236 | *ad = SSL_AD_UNKNOWN_PSK_IDENTITY; | ||
| 237 | if ((s->srp_ctx.TLS_ext_srp_username_callback !=NULL) && | ||
| 238 | ((al = s->srp_ctx.TLS_ext_srp_username_callback(s, ad, | ||
| 239 | s->srp_ctx.SRP_cb_arg)) != SSL_ERROR_NONE)) | ||
| 240 | return al; | ||
| 241 | |||
| 242 | *ad = SSL_AD_INTERNAL_ERROR; | ||
| 243 | if ((s->srp_ctx.N == NULL) || (s->srp_ctx.g == NULL) || | ||
| 244 | (s->srp_ctx.s == NULL) || (s->srp_ctx.v == NULL)) | ||
| 245 | return SSL3_AL_FATAL; | ||
| 246 | |||
| 247 | if (RAND_bytes(b, sizeof(b)) <= 0) | ||
| 248 | return SSL3_AL_FATAL; | ||
| 249 | s->srp_ctx.b = BN_bin2bn(b, sizeof(b), NULL); | ||
| 250 | OPENSSL_cleanse(b, sizeof(b)); | ||
| 251 | |||
| 252 | /* Calculate: B = (kv + g^b) % N */ | ||
| 253 | |||
| 254 | return ((s->srp_ctx.B = SRP_Calc_B(s->srp_ctx.b, s->srp_ctx.N, s->srp_ctx.g, s->srp_ctx.v)) != NULL) ? SSL_ERROR_NONE : SSL3_AL_FATAL; | ||
| 255 | } | ||
| 256 | |||
| 257 | /* If the server just has the raw password, make up a verifier entry on the fly */ | ||
| 258 | int | ||
| 259 | SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, const char *grp) | ||
| 260 | { | ||
| 261 | SRP_gN *GN = SRP_get_default_gN(grp); | ||
| 262 | if (GN == NULL) | ||
| 263 | return -1; | ||
| 264 | s->srp_ctx.N = BN_dup(GN->N); | ||
| 265 | s->srp_ctx.g = BN_dup(GN->g); | ||
| 266 | if (s->srp_ctx.v != NULL) { | ||
| 267 | BN_clear_free(s->srp_ctx.v); | ||
| 268 | s->srp_ctx.v = NULL; | ||
| 269 | } | ||
| 270 | if (s->srp_ctx.s != NULL) { | ||
| 271 | BN_clear_free(s->srp_ctx.s); | ||
| 272 | s->srp_ctx.s = NULL; | ||
| 273 | } | ||
| 274 | if (!SRP_create_verifier_BN(user, pass, &s->srp_ctx.s, &s->srp_ctx.v, | ||
| 275 | GN->N, GN->g)) | ||
| 276 | return -1; | ||
| 277 | |||
| 278 | return 1; | ||
| 279 | } | ||
| 280 | |||
| 281 | int | ||
| 282 | SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, | ||
| 283 | BIGNUM *sa, BIGNUM *v, char *info) | ||
| 284 | { | ||
| 285 | if (N != NULL) { | ||
| 286 | if (s->srp_ctx.N != NULL) { | ||
| 287 | if (!BN_copy(s->srp_ctx.N, N)) { | ||
| 288 | BN_free(s->srp_ctx.N); | ||
| 289 | s->srp_ctx.N = NULL; | ||
| 290 | } | ||
| 291 | } else | ||
| 292 | s->srp_ctx.N = BN_dup(N); | ||
| 293 | } | ||
| 294 | if (g != NULL) { | ||
| 295 | if (s->srp_ctx.g != NULL) { | ||
| 296 | if (!BN_copy(s->srp_ctx.g, g)) { | ||
| 297 | BN_free(s->srp_ctx.g); | ||
| 298 | s->srp_ctx.g = NULL; | ||
| 299 | } | ||
| 300 | } else | ||
| 301 | s->srp_ctx.g = BN_dup(g); | ||
| 302 | } | ||
| 303 | if (sa != NULL) { | ||
| 304 | if (s->srp_ctx.s != NULL) { | ||
| 305 | if (!BN_copy(s->srp_ctx.s, sa)) { | ||
| 306 | BN_free(s->srp_ctx.s); | ||
| 307 | s->srp_ctx.s = NULL; | ||
| 308 | } | ||
| 309 | } else | ||
| 310 | s->srp_ctx.s = BN_dup(sa); | ||
| 311 | } | ||
| 312 | if (v != NULL) { | ||
| 313 | if (s->srp_ctx.v != NULL) { | ||
| 314 | if (!BN_copy(s->srp_ctx.v, v)) { | ||
| 315 | BN_free(s->srp_ctx.v); | ||
| 316 | s->srp_ctx.v = NULL; | ||
| 317 | } | ||
| 318 | } else | ||
| 319 | s->srp_ctx.v = BN_dup(v); | ||
| 320 | } | ||
| 321 | s->srp_ctx.info = info; | ||
| 322 | |||
| 323 | if (!(s->srp_ctx.N) || !(s->srp_ctx.g) || | ||
| 324 | !(s->srp_ctx.s) || !(s->srp_ctx.v)) | ||
| 325 | return -1; | ||
| 326 | |||
| 327 | return 1; | ||
| 328 | } | ||
| 329 | |||
| 330 | int | ||
| 331 | SRP_generate_server_master_secret(SSL *s, unsigned char *master_key) | ||
| 332 | { | ||
| 333 | BIGNUM *K = NULL, *u = NULL; | ||
| 334 | int ret = -1, tmp_len; | ||
| 335 | unsigned char *tmp = NULL; | ||
| 336 | |||
| 337 | if (!SRP_Verify_A_mod_N(s->srp_ctx.A, s->srp_ctx.N)) | ||
| 338 | goto err; | ||
| 339 | if (!(u = SRP_Calc_u(s->srp_ctx.A, s->srp_ctx.B, s->srp_ctx.N))) | ||
| 340 | goto err; | ||
| 341 | if (!(K = SRP_Calc_server_key(s->srp_ctx.A, s->srp_ctx.v, u, s->srp_ctx.b, s->srp_ctx.N))) | ||
| 342 | goto err; | ||
| 343 | |||
| 344 | tmp_len = BN_num_bytes(K); | ||
| 345 | if ((tmp = malloc(tmp_len)) == NULL) | ||
| 346 | goto err; | ||
| 347 | BN_bn2bin(K, tmp); | ||
| 348 | ret = s->method->ssl3_enc->generate_master_secret(s, master_key, tmp, tmp_len); | ||
| 349 | err: | ||
| 350 | if (tmp) { | ||
| 351 | OPENSSL_cleanse(tmp, tmp_len); | ||
| 352 | free(tmp); | ||
| 353 | } | ||
| 354 | BN_clear_free(K); | ||
| 355 | BN_clear_free(u); | ||
| 356 | return ret; | ||
| 357 | } | ||
| 358 | |||
| 359 | /* client side */ | ||
| 360 | int | ||
| 361 | SRP_generate_client_master_secret(SSL *s, unsigned char *master_key) | ||
| 362 | { | ||
| 363 | BIGNUM *x = NULL, *u = NULL, *K = NULL; | ||
| 364 | int ret = -1, tmp_len; | ||
| 365 | char *passwd = NULL; | ||
| 366 | unsigned char *tmp = NULL; | ||
| 367 | |||
| 368 | /* Checks if b % n == 0 | ||
| 369 | */ | ||
| 370 | if (SRP_Verify_B_mod_N(s->srp_ctx.B, s->srp_ctx.N) == 0) | ||
| 371 | goto err; | ||
| 372 | if (!(u = SRP_Calc_u(s->srp_ctx.A, s->srp_ctx.B, s->srp_ctx.N))) | ||
| 373 | goto err; | ||
| 374 | if (s->srp_ctx.SRP_give_srp_client_pwd_callback == NULL) | ||
| 375 | goto err; | ||
| 376 | if (!(passwd = s->srp_ctx.SRP_give_srp_client_pwd_callback(s, | ||
| 377 | s->srp_ctx.SRP_cb_arg))) | ||
| 378 | goto err; | ||
| 379 | if (!(x = SRP_Calc_x(s->srp_ctx.s, s->srp_ctx.login, passwd))) | ||
| 380 | goto err; | ||
| 381 | if (!(K = SRP_Calc_client_key(s->srp_ctx.N, s->srp_ctx.B, s->srp_ctx.g, | ||
| 382 | x, s->srp_ctx.a, u))) | ||
| 383 | goto err; | ||
| 384 | |||
| 385 | tmp_len = BN_num_bytes(K); | ||
| 386 | if ((tmp = malloc(tmp_len)) == NULL) | ||
| 387 | goto err; | ||
| 388 | BN_bn2bin(K, tmp); | ||
| 389 | ret = s->method->ssl3_enc->generate_master_secret(s, master_key, | ||
| 390 | tmp, tmp_len); | ||
| 391 | err: | ||
| 392 | if (tmp) { | ||
| 393 | OPENSSL_cleanse(tmp, tmp_len); | ||
| 394 | free(tmp); | ||
| 395 | } | ||
| 396 | BN_clear_free(K); | ||
| 397 | BN_clear_free(x); | ||
| 398 | if (passwd) { | ||
| 399 | OPENSSL_cleanse(passwd, strlen(passwd)); | ||
| 400 | free(passwd); | ||
| 401 | } | ||
| 402 | BN_clear_free(u); | ||
| 403 | return ret; | ||
| 404 | } | ||
| 405 | |||
| 406 | int | ||
| 407 | SRP_Calc_A_param(SSL *s) | ||
| 408 | { | ||
| 409 | unsigned char rnd[SSL_MAX_MASTER_KEY_LENGTH]; | ||
| 410 | |||
| 411 | if (BN_num_bits(s->srp_ctx.N) < s->srp_ctx.strength) | ||
| 412 | return -1; | ||
| 413 | |||
| 414 | if (s->srp_ctx.SRP_verify_param_callback ==NULL && | ||
| 415 | !SRP_check_known_gN_param(s->srp_ctx.g, s->srp_ctx.N)) | ||
| 416 | return -1; | ||
| 417 | |||
| 418 | RAND_bytes(rnd, sizeof(rnd)); | ||
| 419 | s->srp_ctx.a = BN_bin2bn(rnd, sizeof(rnd), s->srp_ctx.a); | ||
| 420 | OPENSSL_cleanse(rnd, sizeof(rnd)); | ||
| 421 | |||
| 422 | if (!(s->srp_ctx.A = SRP_Calc_A(s->srp_ctx.a, s->srp_ctx.N, | ||
| 423 | s->srp_ctx.g))) | ||
| 424 | return -1; | ||
| 425 | |||
| 426 | /* We can have a callback to verify SRP param!! */ | ||
| 427 | if (s->srp_ctx.SRP_verify_param_callback !=NULL) | ||
| 428 | return s->srp_ctx.SRP_verify_param_callback(s, | ||
| 429 | s->srp_ctx.SRP_cb_arg); | ||
| 430 | |||
| 431 | return 1; | ||
| 432 | } | ||
| 433 | |||
| 434 | BIGNUM * | ||
| 435 | SSL_get_srp_g(SSL *s) | ||
| 436 | { | ||
| 437 | if (s->srp_ctx.g != NULL) | ||
| 438 | return s->srp_ctx.g; | ||
| 439 | return s->ctx->srp_ctx.g; | ||
| 440 | } | ||
| 441 | |||
| 442 | BIGNUM * | ||
| 443 | SSL_get_srp_N(SSL *s) | ||
| 444 | { | ||
| 445 | if (s->srp_ctx.N != NULL) | ||
| 446 | return s->srp_ctx.N; | ||
| 447 | return s->ctx->srp_ctx.N; | ||
| 448 | } | ||
| 449 | |||
| 450 | char * | ||
| 451 | SSL_get_srp_username(SSL *s) | ||
| 452 | { | ||
| 453 | if (s->srp_ctx.login != NULL) | ||
| 454 | return s->srp_ctx.login; | ||
| 455 | return s->ctx->srp_ctx.login; | ||
| 456 | } | ||
| 457 | |||
| 458 | char * | ||
| 459 | SSL_get_srp_userinfo(SSL *s) | ||
| 460 | { | ||
| 461 | if (s->srp_ctx.info != NULL) | ||
| 462 | return s->srp_ctx.info; | ||
| 463 | return s->ctx->srp_ctx.info; | ||
| 464 | } | ||
| 465 | |||
| 466 | #define tls1_ctx_ctrl ssl3_ctx_ctrl | ||
| 467 | #define tls1_ctx_callback_ctrl ssl3_ctx_callback_ctrl | ||
| 468 | |||
| 469 | int | ||
| 470 | SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name) | ||
| 471 | { | ||
| 472 | return tls1_ctx_ctrl(ctx, SSL_CTRL_SET_TLS_EXT_SRP_USERNAME, 0, name); | ||
| 473 | } | ||
| 474 | |||
| 475 | int | ||
| 476 | SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password) | ||
| 477 | { | ||
| 478 | return tls1_ctx_ctrl(ctx, SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD, 0, password); | ||
| 479 | } | ||
| 480 | |||
| 481 | int | ||
| 482 | SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength) | ||
| 483 | { | ||
| 484 | return tls1_ctx_ctrl(ctx, SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH, strength, | ||
| 485 | NULL); | ||
| 486 | } | ||
| 487 | |||
| 488 | int | ||
| 489 | SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, int (*cb)(SSL *, void *)) | ||
| 490 | { | ||
| 491 | return tls1_ctx_callback_ctrl(ctx, SSL_CTRL_SET_SRP_VERIFY_PARAM_CB, | ||
| 492 | (void (*)(void))cb); | ||
| 493 | } | ||
| 494 | |||
| 495 | int | ||
| 496 | SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg) | ||
| 497 | { | ||
| 498 | return tls1_ctx_ctrl(ctx, SSL_CTRL_SET_SRP_ARG, 0, arg); | ||
| 499 | } | ||
| 500 | |||
| 501 | int | ||
| 502 | SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, | ||
| 503 | int (*cb)(SSL *, int *, void *)) | ||
| 504 | { | ||
| 505 | return tls1_ctx_callback_ctrl(ctx, SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB, | ||
| 506 | (void (*)(void))cb); | ||
| 507 | } | ||
| 508 | |||
| 509 | int | ||
| 510 | SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, char *(*cb)(SSL *, void *)) | ||
| 511 | { | ||
| 512 | return tls1_ctx_callback_ctrl(ctx, SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB, | ||
| 513 | (void (*)(void))cb); | ||
| 514 | } | ||
| 515 | |||
| 516 | #endif | ||
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h index 0e117dbca4..dc56abaa99 100644 --- a/src/lib/libssl/ssl.h +++ b/src/lib/libssl/ssl.h | |||
| @@ -466,10 +466,6 @@ struct ssl_session_st { | |||
| 466 | unsigned int sid_ctx_length; | 466 | unsigned int sid_ctx_length; |
| 467 | unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; | 467 | unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH]; |
| 468 | 468 | ||
| 469 | #ifndef OPENSSL_NO_KRB5 | ||
| 470 | unsigned int krb5_client_princ_len; | ||
| 471 | unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH]; | ||
| 472 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 473 | #ifndef OPENSSL_NO_PSK | 469 | #ifndef OPENSSL_NO_PSK |
| 474 | char *psk_identity_hint; | 470 | char *psk_identity_hint; |
| 475 | char *psk_identity; | 471 | char *psk_identity; |
| @@ -522,9 +518,6 @@ struct ssl_session_st { | |||
| 522 | size_t tlsext_ticklen; /* Session ticket length */ | 518 | size_t tlsext_ticklen; /* Session ticket length */ |
| 523 | long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ | 519 | long tlsext_tick_lifetime_hint; /* Session lifetime hint in seconds */ |
| 524 | #endif | 520 | #endif |
| 525 | #ifndef OPENSSL_NO_SRP | ||
| 526 | char *srp_username; | ||
| 527 | #endif | ||
| 528 | }; | 521 | }; |
| 529 | 522 | ||
| 530 | #endif | 523 | #endif |
| @@ -672,42 +665,6 @@ void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, | |||
| 672 | #define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) | 665 | #define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) |
| 673 | #define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) | 666 | #define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) |
| 674 | 667 | ||
| 675 | #ifndef OPENSSL_NO_SRP | ||
| 676 | |||
| 677 | #ifndef OPENSSL_NO_SSL_INTERN | ||
| 678 | |||
| 679 | typedef struct srp_ctx_st { | ||
| 680 | /* param for all the callbacks */ | ||
| 681 | void *SRP_cb_arg; | ||
| 682 | /* set client Hello login callback */ | ||
| 683 | int (*TLS_ext_srp_username_callback)(SSL *, int *, void *); | ||
| 684 | /* set SRP N/g param callback for verification */ | ||
| 685 | int (*SRP_verify_param_callback)(SSL *, void *); | ||
| 686 | /* set SRP client passwd callback */ | ||
| 687 | char *(*SRP_give_srp_client_pwd_callback)(SSL *, void *); | ||
| 688 | |||
| 689 | char *login; | ||
| 690 | BIGNUM *N, *g, *s, *B, *A; | ||
| 691 | BIGNUM *a, *b, *v; | ||
| 692 | char *info; | ||
| 693 | int strength; | ||
| 694 | |||
| 695 | unsigned long srp_Mask; | ||
| 696 | } SRP_CTX; | ||
| 697 | |||
| 698 | #endif | ||
| 699 | |||
| 700 | /* see tls_srp.c */ | ||
| 701 | int SSL_SRP_CTX_init(SSL *s); | ||
| 702 | int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); | ||
| 703 | int SSL_SRP_CTX_free(SSL *ctx); | ||
| 704 | int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); | ||
| 705 | int SSL_srp_server_param_with_username(SSL *s, int *ad); | ||
| 706 | int SRP_generate_server_master_secret(SSL *s, unsigned char *master_key); | ||
| 707 | int SRP_Calc_A_param(SSL *s); | ||
| 708 | int SRP_generate_client_master_secret(SSL *s, unsigned char *master_key); | ||
| 709 | |||
| 710 | #endif | ||
| 711 | 668 | ||
| 712 | #define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */ | 669 | #define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */ |
| 713 | 670 | ||
| @@ -922,9 +879,6 @@ struct ssl_ctx_st { | |||
| 922 | unsigned char *psk, unsigned int max_psk_len); | 879 | unsigned char *psk, unsigned int max_psk_len); |
| 923 | #endif | 880 | #endif |
| 924 | 881 | ||
| 925 | #ifndef OPENSSL_NO_SRP | ||
| 926 | SRP_CTX srp_ctx; /* ctx for SRP authentication */ | ||
| 927 | #endif | ||
| 928 | 882 | ||
| 929 | #ifndef OPENSSL_NO_TLSEXT | 883 | #ifndef OPENSSL_NO_TLSEXT |
| 930 | 884 | ||
| @@ -1213,9 +1167,6 @@ struct ssl_st { | |||
| 1213 | int error; /* error bytes to be written */ | 1167 | int error; /* error bytes to be written */ |
| 1214 | int error_code; /* actual code */ | 1168 | int error_code; /* actual code */ |
| 1215 | 1169 | ||
| 1216 | #ifndef OPENSSL_NO_KRB5 | ||
| 1217 | KSSL_CTX *kssl_ctx; /* Kerberos 5 context */ | ||
| 1218 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 1219 | 1170 | ||
| 1220 | #ifndef OPENSSL_NO_PSK | 1171 | #ifndef OPENSSL_NO_PSK |
| 1221 | unsigned int (*psk_client_callback)(SSL *ssl, const char *hint, | 1172 | unsigned int (*psk_client_callback)(SSL *ssl, const char *hint, |
| @@ -1327,9 +1278,6 @@ struct ssl_st { | |||
| 1327 | * 2 if we are a server and are inside a handshake | 1278 | * 2 if we are a server and are inside a handshake |
| 1328 | * (i.e. not just sending a HelloRequest) */ | 1279 | * (i.e. not just sending a HelloRequest) */ |
| 1329 | 1280 | ||
| 1330 | #ifndef OPENSSL_NO_SRP | ||
| 1331 | SRP_CTX srp_ctx; /* ctx for SRP authentication */ | ||
| 1332 | #endif | ||
| 1333 | }; | 1281 | }; |
| 1334 | 1282 | ||
| 1335 | #endif | 1283 | #endif |
| @@ -1771,24 +1719,6 @@ int SSL_set_trust(SSL *s, int trust); | |||
| 1771 | int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); | 1719 | int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); |
| 1772 | int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); | 1720 | int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); |
| 1773 | 1721 | ||
| 1774 | #ifndef OPENSSL_NO_SRP | ||
| 1775 | int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); | ||
| 1776 | int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); | ||
| 1777 | int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); | ||
| 1778 | int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, char *(*cb)(SSL *, void *)); | ||
| 1779 | int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, int (*cb)(SSL *, void *)); | ||
| 1780 | int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, int (*cb)(SSL *, int *, void *)); | ||
| 1781 | int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); | ||
| 1782 | |||
| 1783 | int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, BIGNUM *sa, BIGNUM *v, char *info); | ||
| 1784 | int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, const char *grp); | ||
| 1785 | |||
| 1786 | BIGNUM *SSL_get_srp_g(SSL *s); | ||
| 1787 | BIGNUM *SSL_get_srp_N(SSL *s); | ||
| 1788 | |||
| 1789 | char *SSL_get_srp_username(SSL *s); | ||
| 1790 | char *SSL_get_srp_userinfo(SSL *s); | ||
| 1791 | #endif | ||
| 1792 | 1722 | ||
| 1793 | void SSL_free(SSL *ssl); | 1723 | void SSL_free(SSL *ssl); |
| 1794 | int SSL_accept(SSL *ssl); | 1724 | int SSL_accept(SSL *ssl); |
diff --git a/src/lib/libssl/ssl/Makefile b/src/lib/libssl/ssl/Makefile index 64dd10bb6d..737121fce4 100644 --- a/src/lib/libssl/ssl/Makefile +++ b/src/lib/libssl/ssl/Makefile | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | # $OpenBSD: Makefile,v 1.40 2014/04/23 05:13:57 beck Exp $ | 1 | # $OpenBSD: Makefile,v 1.41 2014/05/05 15:03:22 tedu Exp $ |
| 2 | 2 | ||
| 3 | LIB= ssl | 3 | LIB= ssl |
| 4 | 4 | ||
| @@ -19,7 +19,7 @@ SRCS=\ | |||
| 19 | ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c \ | 19 | ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c \ |
| 20 | ssl_ciph.c ssl_stat.c ssl_rsa.c \ | 20 | ssl_ciph.c ssl_stat.c ssl_rsa.c \ |
| 21 | ssl_asn1.c ssl_txt.c ssl_algs.c \ | 21 | ssl_asn1.c ssl_txt.c ssl_algs.c \ |
| 22 | bio_ssl.c ssl_err.c kssl.c tls_srp.c t1_reneg.c | 22 | bio_ssl.c ssl_err.c t1_reneg.c |
| 23 | SRCS+= s3_cbc.c | 23 | SRCS+= s3_cbc.c |
| 24 | 24 | ||
| 25 | HDRS= srtp.h ssl.h ssl2.h ssl3.h ssl23.h tls1.h dtls1.h kssl.h | 25 | HDRS= srtp.h ssl.h ssl2.h ssl3.h ssl23.h tls1.h dtls1.h kssl.h |
diff --git a/src/lib/libssl/ssl_asn1.c b/src/lib/libssl/ssl_asn1.c index 1d2590268c..566590f171 100644 --- a/src/lib/libssl/ssl_asn1.c +++ b/src/lib/libssl/ssl_asn1.c | |||
| @@ -97,9 +97,6 @@ typedef struct ssl_session_asn1_st { | |||
| 97 | ASN1_OCTET_STRING master_key; | 97 | ASN1_OCTET_STRING master_key; |
| 98 | ASN1_OCTET_STRING session_id; | 98 | ASN1_OCTET_STRING session_id; |
| 99 | ASN1_OCTET_STRING session_id_context; | 99 | ASN1_OCTET_STRING session_id_context; |
| 100 | #ifndef OPENSSL_NO_KRB5 | ||
| 101 | ASN1_OCTET_STRING krb5_princ; | ||
| 102 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 103 | ASN1_INTEGER time; | 100 | ASN1_INTEGER time; |
| 104 | ASN1_INTEGER timeout; | 101 | ASN1_INTEGER timeout; |
| 105 | ASN1_INTEGER verify_result; | 102 | ASN1_INTEGER verify_result; |
| @@ -112,9 +109,6 @@ typedef struct ssl_session_asn1_st { | |||
| 112 | ASN1_OCTET_STRING psk_identity_hint; | 109 | ASN1_OCTET_STRING psk_identity_hint; |
| 113 | ASN1_OCTET_STRING psk_identity; | 110 | ASN1_OCTET_STRING psk_identity; |
| 114 | #endif /* OPENSSL_NO_PSK */ | 111 | #endif /* OPENSSL_NO_PSK */ |
| 115 | #ifndef OPENSSL_NO_SRP | ||
| 116 | ASN1_OCTET_STRING srp_username; | ||
| 117 | #endif /* OPENSSL_NO_SRP */ | ||
| 118 | } SSL_SESSION_ASN1; | 112 | } SSL_SESSION_ASN1; |
| 119 | 113 | ||
| 120 | int | 114 | int |
| @@ -132,9 +126,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 132 | unsigned char cbuf; | 126 | unsigned char cbuf; |
| 133 | int v11 = 0; | 127 | int v11 = 0; |
| 134 | #endif | 128 | #endif |
| 135 | #ifndef OPENSSL_NO_SRP | ||
| 136 | int v12 = 0; | ||
| 137 | #endif | ||
| 138 | long l; | 129 | long l; |
| 139 | SSL_SESSION_ASN1 a; | 130 | SSL_SESSION_ASN1 a; |
| 140 | M_ASN1_I2D_vars(in); | 131 | M_ASN1_I2D_vars(in); |
| @@ -189,13 +180,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 189 | a.session_id_context.type = V_ASN1_OCTET_STRING; | 180 | a.session_id_context.type = V_ASN1_OCTET_STRING; |
| 190 | a.session_id_context.data = in->sid_ctx; | 181 | a.session_id_context.data = in->sid_ctx; |
| 191 | 182 | ||
| 192 | #ifndef OPENSSL_NO_KRB5 | ||
| 193 | if (in->krb5_client_princ_len) { | ||
| 194 | a.krb5_princ.length = in->krb5_client_princ_len; | ||
| 195 | a.krb5_princ.type = V_ASN1_OCTET_STRING; | ||
| 196 | a.krb5_princ.data = in->krb5_client_princ; | ||
| 197 | } | ||
| 198 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 199 | 183 | ||
| 200 | if (in->time != 0L) { | 184 | if (in->time != 0L) { |
| 201 | a.time.length = LSIZE2; | 185 | a.time.length = LSIZE2; |
| @@ -248,23 +232,12 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 248 | a.psk_identity.data = (unsigned char *)(in->psk_identity); | 232 | a.psk_identity.data = (unsigned char *)(in->psk_identity); |
| 249 | } | 233 | } |
| 250 | #endif /* OPENSSL_NO_PSK */ | 234 | #endif /* OPENSSL_NO_PSK */ |
| 251 | #ifndef OPENSSL_NO_SRP | ||
| 252 | if (in->srp_username) { | ||
| 253 | a.srp_username.length = strlen(in->srp_username); | ||
| 254 | a.srp_username.type = V_ASN1_OCTET_STRING; | ||
| 255 | a.srp_username.data = (unsigned char *)(in->srp_username); | ||
| 256 | } | ||
| 257 | #endif /* OPENSSL_NO_SRP */ | ||
| 258 | 235 | ||
| 259 | M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER); | 236 | M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER); |
| 260 | M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER); | 237 | M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER); |
| 261 | M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING); | 238 | M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING); |
| 262 | M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING); | 239 | M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING); |
| 263 | M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING); | 240 | M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING); |
| 264 | #ifndef OPENSSL_NO_KRB5 | ||
| 265 | if (in->krb5_client_princ_len) | ||
| 266 | M_ASN1_I2D_len(&(a.krb5_princ), i2d_ASN1_OCTET_STRING); | ||
| 267 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 268 | if (in->time != 0L) | 241 | if (in->time != 0L) |
| 269 | M_ASN1_I2D_len_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); | 242 | M_ASN1_I2D_len_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); |
| 270 | if (in->timeout != 0L) | 243 | if (in->timeout != 0L) |
| @@ -293,10 +266,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 293 | if (in->psk_identity) | 266 | if (in->psk_identity) |
| 294 | M_ASN1_I2D_len_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING, 8, v8); | 267 | M_ASN1_I2D_len_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING, 8, v8); |
| 295 | #endif /* OPENSSL_NO_PSK */ | 268 | #endif /* OPENSSL_NO_PSK */ |
| 296 | #ifndef OPENSSL_NO_SRP | ||
| 297 | if (in->srp_username) | ||
| 298 | M_ASN1_I2D_len_EXP_opt(&(a.srp_username), i2d_ASN1_OCTET_STRING, 12, v12); | ||
| 299 | #endif /* OPENSSL_NO_SRP */ | ||
| 300 | 269 | ||
| 301 | M_ASN1_I2D_seq_total(); | 270 | M_ASN1_I2D_seq_total(); |
| 302 | 271 | ||
| @@ -305,10 +274,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 305 | M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING); | 274 | M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING); |
| 306 | M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING); | 275 | M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING); |
| 307 | M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING); | 276 | M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING); |
| 308 | #ifndef OPENSSL_NO_KRB5 | ||
| 309 | if (in->krb5_client_princ_len) | ||
| 310 | M_ASN1_I2D_put(&(a.krb5_princ), i2d_ASN1_OCTET_STRING); | ||
| 311 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 312 | if (in->time != 0L) | 277 | if (in->time != 0L) |
| 313 | M_ASN1_I2D_put_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); | 278 | M_ASN1_I2D_put_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); |
| 314 | if (in->timeout != 0L) | 279 | if (in->timeout != 0L) |
| @@ -339,10 +304,6 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 339 | if (in->compress_meth) | 304 | if (in->compress_meth) |
| 340 | M_ASN1_I2D_put_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING, 11, v11); | 305 | M_ASN1_I2D_put_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING, 11, v11); |
| 341 | #endif | 306 | #endif |
| 342 | #ifndef OPENSSL_NO_SRP | ||
| 343 | if (in->srp_username) | ||
| 344 | M_ASN1_I2D_put_EXP_opt(&(a.srp_username), i2d_ASN1_OCTET_STRING, 12, v12); | ||
| 345 | #endif /* OPENSSL_NO_SRP */ | ||
| 346 | M_ASN1_I2D_finish(); | 307 | M_ASN1_I2D_finish(); |
| 347 | } | 308 | } |
| 348 | 309 | ||
| @@ -420,21 +381,6 @@ d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, long length) | |||
| 420 | 381 | ||
| 421 | os.length = 0; | 382 | os.length = 0; |
| 422 | 383 | ||
| 423 | #ifndef OPENSSL_NO_KRB5 | ||
| 424 | os.length = 0; | ||
| 425 | M_ASN1_D2I_get_opt(osp, d2i_ASN1_OCTET_STRING, V_ASN1_OCTET_STRING); | ||
| 426 | if (os.data) { | ||
| 427 | if (os.length > SSL_MAX_KRB5_PRINCIPAL_LENGTH) | ||
| 428 | ret->krb5_client_princ_len = 0; | ||
| 429 | else | ||
| 430 | ret->krb5_client_princ_len = os.length; | ||
| 431 | memcpy(ret->krb5_client_princ, os.data, ret->krb5_client_princ_len); | ||
| 432 | free(os.data); | ||
| 433 | os.data = NULL; | ||
| 434 | os.length = 0; | ||
| 435 | } else | ||
| 436 | ret->krb5_client_princ_len = 0; | ||
| 437 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 438 | 384 | ||
| 439 | ai.length = 0; | 385 | ai.length = 0; |
| 440 | M_ASN1_D2I_get_EXP_opt(aip, d2i_ASN1_INTEGER, 1); /* XXX 2038 */ | 386 | M_ASN1_D2I_get_EXP_opt(aip, d2i_ASN1_INTEGER, 1); /* XXX 2038 */ |
| @@ -561,18 +507,6 @@ d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, long length) | |||
| 561 | } | 507 | } |
| 562 | #endif | 508 | #endif |
| 563 | 509 | ||
| 564 | #ifndef OPENSSL_NO_SRP | ||
| 565 | os.length = 0; | ||
| 566 | os.data = NULL; | ||
| 567 | M_ASN1_D2I_get_EXP_opt(osp, d2i_ASN1_OCTET_STRING, 12); | ||
| 568 | if (os.data) { | ||
| 569 | ret->srp_username = BUF_strndup((char *)os.data, os.length); | ||
| 570 | free(os.data); | ||
| 571 | os.data = NULL; | ||
| 572 | os.length = 0; | ||
| 573 | } else | ||
| 574 | ret->srp_username = NULL; | ||
| 575 | #endif /* OPENSSL_NO_SRP */ | ||
| 576 | 510 | ||
| 577 | M_ASN1_D2I_Finish(a, SSL_SESSION_free, SSL_F_D2I_SSL_SESSION); | 511 | M_ASN1_D2I_Finish(a, SSL_SESSION_free, SSL_F_D2I_SSL_SESSION); |
| 578 | } | 512 | } |
diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c index 00ab752de1..a1523524a1 100644 --- a/src/lib/libssl/ssl_ciph.c +++ b/src/lib/libssl/ssl_ciph.c | |||
| @@ -702,10 +702,8 @@ ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, unsigned long | |||
| 702 | *mkey |= SSL_kDHr|SSL_kDHd|SSL_kEDH; | 702 | *mkey |= SSL_kDHr|SSL_kDHd|SSL_kEDH; |
| 703 | *auth |= SSL_aDH; | 703 | *auth |= SSL_aDH; |
| 704 | #endif | 704 | #endif |
| 705 | #ifdef OPENSSL_NO_KRB5 | ||
| 706 | *mkey |= SSL_kKRB5; | 705 | *mkey |= SSL_kKRB5; |
| 707 | *auth |= SSL_aKRB5; | 706 | *auth |= SSL_aKRB5; |
| 708 | #endif | ||
| 709 | #ifdef OPENSSL_NO_ECDSA | 707 | #ifdef OPENSSL_NO_ECDSA |
| 710 | *auth |= SSL_aECDSA; | 708 | *auth |= SSL_aECDSA; |
| 711 | #endif | 709 | #endif |
| @@ -717,9 +715,7 @@ ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, unsigned long | |||
| 717 | *mkey |= SSL_kPSK; | 715 | *mkey |= SSL_kPSK; |
| 718 | *auth |= SSL_aPSK; | 716 | *auth |= SSL_aPSK; |
| 719 | #endif | 717 | #endif |
| 720 | #ifdef OPENSSL_NO_SRP | ||
| 721 | *mkey |= SSL_kSRP; | 718 | *mkey |= SSL_kSRP; |
| 722 | #endif | ||
| 723 | /* Check for presence of GOST 34.10 algorithms, and if they | 719 | /* Check for presence of GOST 34.10 algorithms, and if they |
| 724 | * do not present, disable appropriate auth and key exchange */ | 720 | * do not present, disable appropriate auth and key exchange */ |
| 725 | if (!get_optional_pkey_id("gost94")) { | 721 | if (!get_optional_pkey_id("gost94")) { |
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 195271a554..d046480feb 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
| @@ -284,9 +284,6 @@ SSL_new(SSL_CTX *ctx) | |||
| 284 | if (s == NULL) | 284 | if (s == NULL) |
| 285 | goto err; | 285 | goto err; |
| 286 | 286 | ||
| 287 | #ifndef OPENSSL_NO_KRB5 | ||
| 288 | s->kssl_ctx = kssl_ctx_new(); | ||
| 289 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 290 | 287 | ||
| 291 | s->options = ctx->options; | 288 | s->options = ctx->options; |
| 292 | s->mode = ctx->mode; | 289 | s->mode = ctx->mode; |
| @@ -580,10 +577,6 @@ SSL_free(SSL *s) | |||
| 580 | if (s->ctx) | 577 | if (s->ctx) |
| 581 | SSL_CTX_free(s->ctx); | 578 | SSL_CTX_free(s->ctx); |
| 582 | 579 | ||
| 583 | #ifndef OPENSSL_NO_KRB5 | ||
| 584 | if (s->kssl_ctx != NULL) | ||
| 585 | kssl_ctx_free(s->kssl_ctx); | ||
| 586 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 587 | 580 | ||
| 588 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) | 581 | #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) |
| 589 | if (s->next_proto_negotiated) | 582 | if (s->next_proto_negotiated) |
| @@ -1415,9 +1408,6 @@ ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, | |||
| 1415 | int i, j = 0; | 1408 | int i, j = 0; |
| 1416 | SSL_CIPHER *c; | 1409 | SSL_CIPHER *c; |
| 1417 | unsigned char *q; | 1410 | unsigned char *q; |
| 1418 | #ifndef OPENSSL_NO_KRB5 | ||
| 1419 | int nokrb5 = !kssl_tgt_is_available(s->kssl_ctx); | ||
| 1420 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 1421 | 1411 | ||
| 1422 | if (sk == NULL) | 1412 | if (sk == NULL) |
| 1423 | return (0); | 1413 | return (0); |
| @@ -1429,11 +1419,6 @@ ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, unsigned char *p, | |||
| 1429 | if ((c->algorithm_ssl & SSL_TLSV1_2) && | 1419 | if ((c->algorithm_ssl & SSL_TLSV1_2) && |
| 1430 | (TLS1_get_client_version(s) < TLS1_2_VERSION)) | 1420 | (TLS1_get_client_version(s) < TLS1_2_VERSION)) |
| 1431 | continue; | 1421 | continue; |
| 1432 | #ifndef OPENSSL_NO_KRB5 | ||
| 1433 | if (((c->algorithm_mkey & SSL_kKRB5) || | ||
| 1434 | (c->algorithm_auth & SSL_aKRB5)) && nokrb5) | ||
| 1435 | continue; | ||
| 1436 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 1437 | #ifndef OPENSSL_NO_PSK | 1422 | #ifndef OPENSSL_NO_PSK |
| 1438 | /* with PSK there must be client callback set */ | 1423 | /* with PSK there must be client callback set */ |
| 1439 | if (((c->algorithm_mkey & SSL_kPSK) || | 1424 | if (((c->algorithm_mkey & SSL_kPSK) || |
| @@ -1877,9 +1862,6 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
| 1877 | ret->psk_client_callback = NULL; | 1862 | ret->psk_client_callback = NULL; |
| 1878 | ret->psk_server_callback = NULL; | 1863 | ret->psk_server_callback = NULL; |
| 1879 | #endif | 1864 | #endif |
| 1880 | #ifndef OPENSSL_NO_SRP | ||
| 1881 | SSL_CTX_SRP_CTX_init(ret); | ||
| 1882 | #endif | ||
| 1883 | #ifndef OPENSSL_NO_ENGINE | 1865 | #ifndef OPENSSL_NO_ENGINE |
| 1884 | ret->client_cert_engine = NULL; | 1866 | ret->client_cert_engine = NULL; |
| 1885 | #ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO | 1867 | #ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO |
| @@ -1983,9 +1965,6 @@ SSL_CTX_free(SSL_CTX *a) | |||
| 1983 | if (a->psk_identity_hint) | 1965 | if (a->psk_identity_hint) |
| 1984 | free(a->psk_identity_hint); | 1966 | free(a->psk_identity_hint); |
| 1985 | #endif | 1967 | #endif |
| 1986 | #ifndef OPENSSL_NO_SRP | ||
| 1987 | SSL_CTX_SRP_CTX_free(a); | ||
| 1988 | #endif | ||
| 1989 | #ifndef OPENSSL_NO_ENGINE | 1968 | #ifndef OPENSSL_NO_ENGINE |
| 1990 | if (a->client_cert_engine) | 1969 | if (a->client_cert_engine) |
| 1991 | ENGINE_finish(a->client_cert_engine); | 1970 | ENGINE_finish(a->client_cert_engine); |
| @@ -2147,12 +2126,6 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
| 2147 | mask_a|=SSL_aNULL; | 2126 | mask_a|=SSL_aNULL; |
| 2148 | emask_a|=SSL_aNULL; | 2127 | emask_a|=SSL_aNULL; |
| 2149 | 2128 | ||
| 2150 | #ifndef OPENSSL_NO_KRB5 | ||
| 2151 | mask_k|=SSL_kKRB5; | ||
| 2152 | mask_a|=SSL_aKRB5; | ||
| 2153 | emask_k|=SSL_kKRB5; | ||
| 2154 | emask_a|=SSL_aKRB5; | ||
| 2155 | #endif | ||
| 2156 | 2129 | ||
| 2157 | /* | 2130 | /* |
| 2158 | * An ECC certificate may be usable for ECDH and/or | 2131 | * An ECC certificate may be usable for ECDH and/or |
diff --git a/src/lib/libssl/ssl_sess.c b/src/lib/libssl/ssl_sess.c index 2b8da1ccae..05c6948efc 100644 --- a/src/lib/libssl/ssl_sess.c +++ b/src/lib/libssl/ssl_sess.c | |||
| @@ -223,9 +223,6 @@ SSL_SESSION_new(void) | |||
| 223 | ss->psk_identity_hint = NULL; | 223 | ss->psk_identity_hint = NULL; |
| 224 | ss->psk_identity = NULL; | 224 | ss->psk_identity = NULL; |
| 225 | #endif | 225 | #endif |
| 226 | #ifndef OPENSSL_NO_SRP | ||
| 227 | ss->srp_username = NULL; | ||
| 228 | #endif | ||
| 229 | return (ss); | 226 | return (ss); |
| 230 | } | 227 | } |
| 231 | 228 | ||
| @@ -726,10 +723,6 @@ SSL_SESSION_free(SSL_SESSION *ss) | |||
| 726 | if (ss->psk_identity != NULL) | 723 | if (ss->psk_identity != NULL) |
| 727 | free(ss->psk_identity); | 724 | free(ss->psk_identity); |
| 728 | #endif | 725 | #endif |
| 729 | #ifndef OPENSSL_NO_SRP | ||
| 730 | if (ss->srp_username != NULL) | ||
| 731 | free(ss->srp_username); | ||
| 732 | #endif | ||
| 733 | OPENSSL_cleanse(ss, sizeof(*ss)); | 726 | OPENSSL_cleanse(ss, sizeof(*ss)); |
| 734 | free(ss); | 727 | free(ss); |
| 735 | } | 728 | } |
| @@ -754,15 +747,6 @@ SSL_set_session(SSL *s, SSL_SESSION *session) | |||
| 754 | return (0); | 747 | return (0); |
| 755 | } | 748 | } |
| 756 | 749 | ||
| 757 | #ifndef OPENSSL_NO_KRB5 | ||
| 758 | if (s->kssl_ctx && !s->kssl_ctx->client_princ && | ||
| 759 | session->krb5_client_princ_len > 0) { | ||
| 760 | s->kssl_ctx->client_princ = malloc(session->krb5_client_princ_len + 1); | ||
| 761 | memcpy(s->kssl_ctx->client_princ, session->krb5_client_princ, | ||
| 762 | session->krb5_client_princ_len); | ||
| 763 | s->kssl_ctx->client_princ[session->krb5_client_princ_len] = '\0'; | ||
| 764 | } | ||
| 765 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 766 | 750 | ||
| 767 | /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/ | 751 | /* CRYPTO_w_lock(CRYPTO_LOCK_SSL);*/ |
| 768 | CRYPTO_add(&session->references, 1, CRYPTO_LOCK_SSL_SESSION); | 752 | CRYPTO_add(&session->references, 1, CRYPTO_LOCK_SSL_SESSION); |
diff --git a/src/lib/libssl/ssl_txt.c b/src/lib/libssl/ssl_txt.c index c6bfd68de6..01dd846596 100644 --- a/src/lib/libssl/ssl_txt.c +++ b/src/lib/libssl/ssl_txt.c | |||
| @@ -161,19 +161,6 @@ SSL_SESSION_print(BIO *bp, const SSL_SESSION *x) | |||
| 161 | if (BIO_printf(bp, "%02X", x->master_key[i]) <= 0) | 161 | if (BIO_printf(bp, "%02X", x->master_key[i]) <= 0) |
| 162 | goto err; | 162 | goto err; |
| 163 | } | 163 | } |
| 164 | #ifndef OPENSSL_NO_KRB5 | ||
| 165 | if (BIO_puts(bp, "\n Krb5 Principal: ") <= 0) | ||
| 166 | goto err; | ||
| 167 | if (x->krb5_client_princ_len == 0) { | ||
| 168 | if (BIO_puts(bp, "None") <= 0) | ||
| 169 | goto err; | ||
| 170 | } else { | ||
| 171 | for (i = 0; i < x->krb5_client_princ_len; i++) { | ||
| 172 | if (BIO_printf(bp, "%02X", x->krb5_client_princ[i]) <= 0) | ||
| 173 | goto err; | ||
| 174 | } | ||
| 175 | } | ||
| 176 | #endif /* OPENSSL_NO_KRB5 */ | ||
| 177 | #ifndef OPENSSL_NO_PSK | 164 | #ifndef OPENSSL_NO_PSK |
| 178 | if (BIO_puts(bp, "\n PSK identity: ") <= 0) | 165 | if (BIO_puts(bp, "\n PSK identity: ") <= 0) |
| 179 | goto err; | 166 | goto err; |
| @@ -184,12 +171,6 @@ SSL_SESSION_print(BIO *bp, const SSL_SESSION *x) | |||
| 184 | if (BIO_printf(bp, "%s", x->psk_identity_hint ? x->psk_identity_hint : "None") <= 0) | 171 | if (BIO_printf(bp, "%s", x->psk_identity_hint ? x->psk_identity_hint : "None") <= 0) |
| 185 | goto err; | 172 | goto err; |
| 186 | #endif | 173 | #endif |
| 187 | #ifndef OPENSSL_NO_SRP | ||
| 188 | if (BIO_puts(bp, "\n SRP username: ") <= 0) | ||
| 189 | goto err; | ||
| 190 | if (BIO_printf(bp, "%s", x->srp_username ? x->srp_username : "None") <= 0) | ||
| 191 | goto err; | ||
| 192 | #endif | ||
| 193 | #ifndef OPENSSL_NO_TLSEXT | 174 | #ifndef OPENSSL_NO_TLSEXT |
| 194 | if (x->tlsext_tick_lifetime_hint) { | 175 | if (x->tlsext_tick_lifetime_hint) { |
| 195 | if (BIO_printf(bp, | 176 | if (BIO_printf(bp, |
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index bb33331862..2e183bb233 100644 --- a/src/lib/libssl/t1_lib.c +++ b/src/lib/libssl/t1_lib.c | |||
| @@ -415,35 +415,6 @@ ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit) | |||
| 415 | ret += el; | 415 | ret += el; |
| 416 | } | 416 | } |
| 417 | 417 | ||
| 418 | #ifndef OPENSSL_NO_SRP | ||
| 419 | /* Add SRP username if there is one */ | ||
| 420 | if (s->srp_ctx.login != NULL) { | ||
| 421 | /* Add TLS extension SRP username to the Client Hello message */ | ||
| 422 | |||
| 423 | int login_len = strlen(s->srp_ctx.login); | ||
| 424 | |||
| 425 | if (login_len > 255 || login_len == 0) { | ||
| 426 | SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR); | ||
| 427 | return NULL; | ||
| 428 | } | ||
| 429 | |||
| 430 | /* check for enough space. | ||
| 431 | 4 for the srp type type and entension length | ||
| 432 | 1 for the srp user identity | ||
| 433 | + srp user identity length | ||
| 434 | */ | ||
| 435 | if ((limit - ret - 5 - login_len) < 0) | ||
| 436 | return NULL; | ||
| 437 | |||
| 438 | |||
| 439 | /* fill in the extension */ | ||
| 440 | s2n(TLSEXT_TYPE_srp, ret); | ||
| 441 | s2n(login_len + 1, ret); | ||
| 442 | (*ret++) = (unsigned char) login_len; | ||
| 443 | memcpy(ret, s->srp_ctx.login, login_len); | ||
| 444 | ret += login_len; | ||
| 445 | } | ||
| 446 | #endif | ||
| 447 | 418 | ||
| 448 | #ifndef OPENSSL_NO_EC | 419 | #ifndef OPENSSL_NO_EC |
| 449 | if (s->tlsext_ecpointformatlist != NULL && | 420 | if (s->tlsext_ecpointformatlist != NULL && |
| @@ -1063,27 +1034,6 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
| 1063 | } | 1034 | } |
| 1064 | 1035 | ||
| 1065 | } | 1036 | } |
| 1066 | #ifndef OPENSSL_NO_SRP | ||
| 1067 | else if (type == TLSEXT_TYPE_srp) { | ||
| 1068 | if (size <= 0 || ((len = data[0])) != (size - 1)) { | ||
| 1069 | *al = SSL_AD_DECODE_ERROR; | ||
| 1070 | return 0; | ||
| 1071 | } | ||
| 1072 | if (s->srp_ctx.login != NULL) { | ||
| 1073 | *al = SSL_AD_DECODE_ERROR; | ||
| 1074 | return 0; | ||
| 1075 | } | ||
| 1076 | if ((s->srp_ctx.login = malloc(len + 1)) == NULL) | ||
| 1077 | return -1; | ||
| 1078 | memcpy(s->srp_ctx.login, &data[1], len); | ||
| 1079 | s->srp_ctx.login[len] = '\0'; | ||
| 1080 | |||
| 1081 | if (strlen(s->srp_ctx.login) != len) { | ||
| 1082 | *al = SSL_AD_DECODE_ERROR; | ||
| 1083 | return 0; | ||
| 1084 | } | ||
| 1085 | } | ||
| 1086 | #endif | ||
| 1087 | 1037 | ||
| 1088 | #ifndef OPENSSL_NO_EC | 1038 | #ifndef OPENSSL_NO_EC |
| 1089 | else if (type == TLSEXT_TYPE_ec_point_formats && | 1039 | else if (type == TLSEXT_TYPE_ec_point_formats && |
