diff options
author | tedu <> | 2014-04-16 20:39:09 +0000 |
---|---|---|
committer | tedu <> | 2014-04-16 20:39:09 +0000 |
commit | e7892d59587f55067ca2e2bc6fa26cf4bcd6c084 (patch) | |
tree | 761d3461cd8f278c74120d2836c29dd21dc95be6 /src/lib/libssl/s3_srvr.c | |
parent | 750d86a4fc04f53024575d65269281ea6c4e450c (diff) | |
download | openbsd-e7892d59587f55067ca2e2bc6fa26cf4bcd6c084.tar.gz openbsd-e7892d59587f55067ca2e2bc6fa26cf4bcd6c084.tar.bz2 openbsd-e7892d59587f55067ca2e2bc6fa26cf4bcd6c084.zip |
add back SRP. i was being too greedy.
Diffstat (limited to 'src/lib/libssl/s3_srvr.c')
-rw-r--r-- | src/lib/libssl/s3_srvr.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c index 1a924f828e..cc46e241d4 100644 --- a/src/lib/libssl/s3_srvr.c +++ b/src/lib/libssl/s3_srvr.c | |||
@@ -180,6 +180,28 @@ static const SSL_METHOD | |||
180 | return (NULL); | 180 | return (NULL); |
181 | } | 181 | } |
182 | 182 | ||
183 | #ifndef OPENSSL_NO_SRP | ||
184 | static int | ||
185 | ssl_check_srp_ext_ClientHello(SSL *s, int *al) | ||
186 | { | ||
187 | int ret = SSL_ERROR_NONE; | ||
188 | |||
189 | *al = SSL_AD_UNRECOGNIZED_NAME; | ||
190 | |||
191 | if ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) && | ||
192 | (s->srp_ctx.TLS_ext_srp_username_callback != NULL)) { | ||
193 | if (s->srp_ctx.login == NULL) { | ||
194 | /* RFC 5054 says SHOULD reject, | ||
195 | we do so if There is no srp login name */ | ||
196 | ret = SSL3_AL_FATAL; | ||
197 | *al = SSL_AD_UNKNOWN_PSK_IDENTITY; | ||
198 | } else { | ||
199 | ret = SSL_srp_server_param_with_username(s, al); | ||
200 | } | ||
201 | } | ||
202 | return ret; | ||
203 | } | ||
204 | #endif | ||
183 | 205 | ||
184 | IMPLEMENT_ssl3_meth_func(SSLv3_server_method, | 206 | IMPLEMENT_ssl3_meth_func(SSLv3_server_method, |
185 | ssl3_accept, ssl_undefined_function, ssl3_get_server_method) | 207 | ssl3_accept, ssl_undefined_function, ssl3_get_server_method) |
@@ -317,6 +339,39 @@ ssl3_accept(SSL *s) | |||
317 | if (ret <= 0) | 339 | if (ret <= 0) |
318 | goto end; | 340 | goto end; |
319 | } | 341 | } |
342 | #ifndef OPENSSL_NO_SRP | ||
343 | { | ||
344 | int al; | ||
345 | if ((ret = | ||
346 | ssl_check_srp_ext_ClientHello(s, &al)) | ||
347 | < 0) { | ||
348 | /* | ||
349 | * Callback indicates further work to | ||
350 | * be done. | ||
351 | */ | ||
352 | s->rwstate = SSL_X509_LOOKUP; | ||
353 | goto end; | ||
354 | } | ||
355 | if (ret != SSL_ERROR_NONE) { | ||
356 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
357 | |||
358 | /* | ||
359 | * This is not really an error but the | ||
360 | * only means for a client to detect | ||
361 | * whether srp is supported. | ||
362 | */ | ||
363 | if (al != TLS1_AD_UNKNOWN_PSK_IDENTITY) | ||
364 | SSLerr(SSL_F_SSL3_ACCEPT, | ||
365 | SSL_R_CLIENTHELLO_TLSEXT); | ||
366 | |||
367 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | ||
368 | |||
369 | ret = -1; | ||
370 | goto end; | ||
371 | |||
372 | } | ||
373 | } | ||
374 | #endif | ||
320 | 375 | ||
321 | s->renegotiate = 2; | 376 | s->renegotiate = 2; |
322 | s->state = SSL3_ST_SW_SRVR_HELLO_A; | 377 | s->state = SSL3_ST_SW_SRVR_HELLO_A; |
@@ -415,6 +470,10 @@ ssl3_accept(SSL *s) | |||
415 | #ifndef OPENSSL_NO_PSK | 470 | #ifndef OPENSSL_NO_PSK |
416 | || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint) | 471 | || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint) |
417 | #endif | 472 | #endif |
473 | #ifndef OPENSSL_NO_SRP | ||
474 | /* SRP: send ServerKeyExchange */ | ||
475 | || (alg_k & SSL_kSRP) | ||
476 | #endif | ||
418 | || (alg_k & (SSL_kDHr|SSL_kDHd|SSL_kEDH)) | 477 | || (alg_k & (SSL_kDHr|SSL_kDHd|SSL_kEDH)) |
419 | || (alg_k & SSL_kEECDH) | 478 | || (alg_k & SSL_kEECDH) |
420 | || ((alg_k & SSL_kRSA) | 479 | || ((alg_k & SSL_kRSA) |
@@ -1751,6 +1810,19 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1751 | n += 2 + pskhintlen; | 1810 | n += 2 + pskhintlen; |
1752 | } else | 1811 | } else |
1753 | #endif /* !OPENSSL_NO_PSK */ | 1812 | #endif /* !OPENSSL_NO_PSK */ |
1813 | #ifndef OPENSSL_NO_SRP | ||
1814 | if (type & SSL_kSRP) { | ||
1815 | if ((s->srp_ctx.N == NULL) || (s->srp_ctx.g == NULL) || | ||
1816 | (s->srp_ctx.s == NULL) || (s->srp_ctx.B == NULL)) { | ||
1817 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, SSL_R_MISSING_SRP_PARAM); | ||
1818 | goto err; | ||
1819 | } | ||
1820 | r[0] = s->srp_ctx.N; | ||
1821 | r[1] = s->srp_ctx.g; | ||
1822 | r[2] = s->srp_ctx.s; | ||
1823 | r[3] = s->srp_ctx.B; | ||
1824 | } else | ||
1825 | #endif | ||
1754 | { | 1826 | { |
1755 | al = SSL_AD_HANDSHAKE_FAILURE; | 1827 | al = SSL_AD_HANDSHAKE_FAILURE; |
1756 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE); | 1828 | SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE); |
@@ -1758,6 +1830,11 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1758 | } | 1830 | } |
1759 | for (i = 0; i < 4 && r[i] != NULL; i++) { | 1831 | for (i = 0; i < 4 && r[i] != NULL; i++) { |
1760 | nr[i] = BN_num_bytes(r[i]); | 1832 | nr[i] = BN_num_bytes(r[i]); |
1833 | #ifndef OPENSSL_NO_SRP | ||
1834 | if ((i == 2) && (type & SSL_kSRP)) | ||
1835 | n += 1 + nr[i]; | ||
1836 | else | ||
1837 | #endif | ||
1761 | n += 2 + nr[i]; | 1838 | n += 2 + nr[i]; |
1762 | } | 1839 | } |
1763 | 1840 | ||
@@ -1783,6 +1860,12 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1783 | p = &(d[4]); | 1860 | p = &(d[4]); |
1784 | 1861 | ||
1785 | for (i = 0; i < 4 && r[i] != NULL; i++) { | 1862 | for (i = 0; i < 4 && r[i] != NULL; i++) { |
1863 | #ifndef OPENSSL_NO_SRP | ||
1864 | if ((i == 2) && (type & SSL_kSRP)) { | ||
1865 | *p = nr[i]; | ||
1866 | p++; | ||
1867 | } else | ||
1868 | #endif | ||
1786 | s2n(nr[i], p); | 1869 | s2n(nr[i], p); |
1787 | BN_bn2bin(r[i], p); | 1870 | BN_bn2bin(r[i], p); |
1788 | p += nr[i]; | 1871 | p += nr[i]; |
@@ -2651,6 +2734,43 @@ ssl3_get_client_key_exchange(SSL *s) | |||
2651 | goto f_err; | 2734 | goto f_err; |
2652 | } else | 2735 | } else |
2653 | #endif | 2736 | #endif |
2737 | #ifndef OPENSSL_NO_SRP | ||
2738 | if (alg_k & SSL_kSRP) { | ||
2739 | int param_len; | ||
2740 | |||
2741 | n2s(p, i); | ||
2742 | param_len = i + 2; | ||
2743 | if (param_len > n) { | ||
2744 | al = SSL_AD_DECODE_ERROR; | ||
2745 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
2746 | SSL_R_BAD_SRP_A_LENGTH); | ||
2747 | goto f_err; | ||
2748 | } | ||
2749 | if (!(s->srp_ctx.A = BN_bin2bn(p, i, NULL))) { | ||
2750 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
2751 | ERR_R_BN_LIB); | ||
2752 | goto err; | ||
2753 | } | ||
2754 | if (s->session->srp_username != NULL) | ||
2755 | OPENSSL_free(s->session->srp_username); | ||
2756 | s->session->srp_username = BUF_strdup(s->srp_ctx.login); | ||
2757 | if (s->session->srp_username == NULL) { | ||
2758 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
2759 | ERR_R_MALLOC_FAILURE); | ||
2760 | goto err; | ||
2761 | } | ||
2762 | |||
2763 | if ((s->session->master_key_length = | ||
2764 | SRP_generate_server_master_secret(s, | ||
2765 | s->session->master_key)) < 0) { | ||
2766 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | ||
2767 | ERR_R_INTERNAL_ERROR); | ||
2768 | goto err; | ||
2769 | } | ||
2770 | |||
2771 | p += i; | ||
2772 | } else | ||
2773 | #endif /* OPENSSL_NO_SRP */ | ||
2654 | if (alg_k & SSL_kGOST) { | 2774 | if (alg_k & SSL_kGOST) { |
2655 | int ret = 0; | 2775 | int ret = 0; |
2656 | EVP_PKEY_CTX *pkey_ctx; | 2776 | EVP_PKEY_CTX *pkey_ctx; |
@@ -2731,7 +2851,9 @@ ssl3_get_client_key_exchange(SSL *s) | |||
2731 | return (1); | 2851 | return (1); |
2732 | f_err: | 2852 | f_err: |
2733 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2853 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
2854 | #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_SRP) | ||
2734 | err: | 2855 | err: |
2856 | #endif | ||
2735 | #ifndef OPENSSL_NO_ECDH | 2857 | #ifndef OPENSSL_NO_ECDH |
2736 | EVP_PKEY_free(clnt_pub_pkey); | 2858 | EVP_PKEY_free(clnt_pub_pkey); |
2737 | EC_POINT_free(clnt_ecpoint); | 2859 | EC_POINT_free(clnt_ecpoint); |