@@ -720,49 +720,57 @@ static void gtls_sessionid_free(void *sessionid, size_t idsize)
720
720
free (sessionid );
721
721
}
722
722
723
- static CURLcode gtls_update_session_id (struct Curl_cfilter * cf ,
724
- struct Curl_easy * data ,
725
- gnutls_session_t session )
723
+ CURLcode Curl_gtls_update_session_id (struct Curl_cfilter * cf ,
724
+ struct Curl_easy * data ,
725
+ gnutls_session_t session ,
726
+ struct ssl_peer * peer ,
727
+ const char * alpn )
726
728
{
727
729
struct ssl_config_data * ssl_config = Curl_ssl_cf_get_config (cf , data );
728
- struct ssl_connect_data * connssl = cf -> ctx ;
730
+ void * connect_sessionid ;
731
+ size_t connect_idsize = 0 ;
729
732
CURLcode result = CURLE_OK ;
730
733
731
- if (ssl_config -> primary .cache_session ) {
732
- /* we always unconditionally get the session id here, as even if we
733
- already got it from the cache and asked to use it in the connection, it
734
- might've been rejected and then a new one is in use now and we need to
735
- detect that. */
736
- void * connect_sessionid ;
737
- size_t connect_idsize = 0 ;
738
-
739
- /* get the session ID data size */
740
- gnutls_session_get_data (session , NULL , & connect_idsize );
741
- if (!connect_idsize ) /* gnutls does this for some version combinations */
742
- return CURLE_OK ;
743
-
744
- connect_sessionid = malloc (connect_idsize ); /* get a buffer for it */
745
- if (!connect_sessionid ) {
746
- return CURLE_OUT_OF_MEMORY ;
747
- }
748
- else {
749
- /* extract session ID to the allocated buffer */
750
- gnutls_session_get_data (session , connect_sessionid , & connect_idsize );
751
-
752
- CURL_TRC_CF (data , cf , "get session id (len=%zu) and store in cache" ,
753
- connect_idsize );
754
- Curl_ssl_sessionid_lock (data );
755
- /* store this session id, takes ownership */
756
- result = Curl_ssl_set_sessionid (cf , data , & connssl -> peer ,
757
- connssl -> alpn_negotiated ,
758
- connect_sessionid , connect_idsize ,
759
- gtls_sessionid_free );
760
- Curl_ssl_sessionid_unlock (data );
761
- }
762
- }
734
+ if (!ssl_config -> primary .cache_session )
735
+ return CURLE_OK ;
736
+
737
+ /* we always unconditionally get the session id here, as even if we
738
+ already got it from the cache and asked to use it in the connection, it
739
+ might've been rejected and then a new one is in use now and we need to
740
+ detect that. */
741
+
742
+ /* get the session ID data size */
743
+ gnutls_session_get_data (session , NULL , & connect_idsize );
744
+ if (!connect_idsize ) /* gnutls does this for some version combinations */
745
+ return CURLE_OK ;
746
+
747
+ connect_sessionid = malloc (connect_idsize ); /* get a buffer for it */
748
+ if (!connect_sessionid )
749
+ return CURLE_OUT_OF_MEMORY ;
750
+
751
+ /* extract session ID to the allocated buffer */
752
+ gnutls_session_get_data (session , connect_sessionid , & connect_idsize );
753
+
754
+ CURL_TRC_CF (data , cf , "get session id (len=%zu, alpn=%s) and store in cache" ,
755
+ connect_idsize , alpn ? alpn : "-" );
756
+ Curl_ssl_sessionid_lock (data );
757
+ /* store this session id, takes ownership */
758
+ result = Curl_ssl_set_sessionid (cf , data , peer , alpn ,
759
+ connect_sessionid , connect_idsize ,
760
+ gtls_sessionid_free );
761
+ Curl_ssl_sessionid_unlock (data );
763
762
return result ;
764
763
}
765
764
765
+ static CURLcode cf_gtls_update_session_id (struct Curl_cfilter * cf ,
766
+ struct Curl_easy * data ,
767
+ gnutls_session_t session )
768
+ {
769
+ struct ssl_connect_data * connssl = cf -> ctx ;
770
+ return Curl_gtls_update_session_id (cf , data , session , & connssl -> peer ,
771
+ connssl -> alpn_negotiated );
772
+ }
773
+
766
774
static int gtls_handshake_cb (gnutls_session_t session , unsigned int htype ,
767
775
unsigned when , unsigned int incoming ,
768
776
const gnutls_datum_t * msg )
@@ -778,7 +786,7 @@ static int gtls_handshake_cb(gnutls_session_t session, unsigned int htype,
778
786
incoming ? "incoming" : "outgoing" , htype );
779
787
switch (htype ) {
780
788
case GNUTLS_HANDSHAKE_NEW_SESSION_TICKET : {
781
- gtls_update_session_id (cf , data , session );
789
+ cf_gtls_update_session_id (cf , data , session );
782
790
break ;
783
791
}
784
792
default :
@@ -1043,13 +1051,13 @@ CURLcode Curl_gtls_ctx_init(struct gtls_ctx *gctx,
1043
1051
struct Curl_easy * data ,
1044
1052
struct ssl_peer * peer ,
1045
1053
const unsigned char * alpn , size_t alpn_len ,
1054
+ struct ssl_connect_data * connssl ,
1046
1055
Curl_gtls_ctx_setup_cb * cb_setup ,
1047
1056
void * cb_user_data ,
1048
1057
void * ssl_user_data )
1049
1058
{
1050
1059
struct ssl_primary_config * conn_config = Curl_ssl_cf_get_primary_config (cf );
1051
1060
struct ssl_config_data * ssl_config = Curl_ssl_cf_get_config (cf , data );
1052
- struct ssl_connect_data * connssl = cf -> ctx ;
1053
1061
gnutls_datum_t gtls_alpns [5 ];
1054
1062
size_t gtls_alpns_count = 0 ;
1055
1063
CURLcode result ;
@@ -1090,13 +1098,14 @@ CURLcode Curl_gtls_ctx_init(struct gtls_ctx *gctx,
1090
1098
if (rc < 0 )
1091
1099
infof (data , "SSL failed to set session ID" );
1092
1100
else {
1093
- infof (data , "SSL reusing session ID (size=%zu)" , ssl_idsize );
1101
+ infof (data , "SSL reusing session ID (size=%zu, alpn=%s)" ,
1102
+ ssl_idsize , session_alpn ? session_alpn : "-" );
1094
1103
#ifdef DEBUGBUILD
1095
1104
if ((ssl_config -> earlydata || !!getenv ("CURL_USE_EARLYDATA" )) &&
1096
1105
#else
1097
1106
if (ssl_config -> earlydata &&
1098
1107
#endif
1099
- !cf -> conn -> connect_only &&
1108
+ !cf -> conn -> connect_only && connssl &&
1100
1109
(gnutls_protocol_get_version (gctx -> session ) == GNUTLS_TLS1_3 ) &&
1101
1110
Curl_alpn_contains_proto (connssl -> alpn , session_alpn )) {
1102
1111
connssl -> earlydata_max =
@@ -1188,7 +1197,7 @@ gtls_connect_step1(struct Curl_cfilter *cf, struct Curl_easy *data)
1188
1197
}
1189
1198
1190
1199
result = Curl_gtls_ctx_init (& backend -> gtls , cf , data , & connssl -> peer ,
1191
- proto .data , proto .len , NULL , NULL , cf );
1200
+ proto .data , proto .len , connssl , NULL , NULL , cf );
1192
1201
if (result )
1193
1202
return result ;
1194
1203
@@ -1734,7 +1743,7 @@ static CURLcode gtls_verifyserver(struct Curl_cfilter *cf,
1734
1743
/* Only on TLSv1.2 or lower do we have the session id now. For
1735
1744
* TLSv1.3 we get it via a SESSION_TICKET message that arrives later. */
1736
1745
if (gnutls_protocol_get_version (session ) < GNUTLS_TLS1_3 )
1737
- result = gtls_update_session_id (cf , data , session );
1746
+ result = cf_gtls_update_session_id (cf , data , session );
1738
1747
1739
1748
out :
1740
1749
return result ;
0 commit comments