mirror of https://github.com/openssl/openssl.git
				
				
				
			Use separate functions for supported and peer groups lists
Reviewed-by: Rich Salz <rsalz@openssl.org> (Merged from https://github.com/openssl/openssl/pull/4475)
This commit is contained in:
		
							parent
							
								
									f0b843c1f4
								
							
						
					
					
						commit
						ff6d20a67b
					
				|  | @ -2085,6 +2085,13 @@ static ossl_inline int ssl_has_cert(const SSL *s, int idx) | ||||||
|         && s->cert->pkeys[idx].privatekey != NULL; |         && s->cert->pkeys[idx].privatekey != NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static ossl_inline void tls1_get_peer_groups(SSL *s, const uint16_t **pgroups, | ||||||
|  |                                              size_t *pgroupslen) | ||||||
|  | { | ||||||
|  |     *pgroups = s->session->ext.supportedgroups; | ||||||
|  |     *pgroupslen = s->session->ext.supportedgroups_len; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| # ifndef OPENSSL_UNIT_TEST | # ifndef OPENSSL_UNIT_TEST | ||||||
| 
 | 
 | ||||||
| __owur int ssl_read_internal(SSL *s, void *buf, size_t num, size_t *readbytes); | __owur int ssl_read_internal(SSL *s, void *buf, size_t num, size_t *readbytes); | ||||||
|  | @ -2354,8 +2361,8 @@ __owur EVP_PKEY *ssl_generate_param_group(uint16_t id); | ||||||
| #  endif                        /* OPENSSL_NO_EC */ | #  endif                        /* OPENSSL_NO_EC */ | ||||||
| 
 | 
 | ||||||
| __owur int tls_curve_allowed(SSL *s, uint16_t curve, int op); | __owur int tls_curve_allowed(SSL *s, uint16_t curve, int op); | ||||||
| void tls1_get_grouplist(SSL *s, int sess, const uint16_t **pcurves, | void tls1_get_supported_groups(SSL *s, const uint16_t **pgroups, | ||||||
|                         size_t *num_curves); |                                size_t *pgroupslen); | ||||||
| 
 | 
 | ||||||
| __owur int tls1_set_server_sigalgs(SSL *s); | __owur int tls1_set_server_sigalgs(SSL *s); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1174,8 +1174,8 @@ static int final_key_share(SSL *s, unsigned int context, int sent, int *al) | ||||||
|             /* Check if a shared group exists */ |             /* Check if a shared group exists */ | ||||||
| 
 | 
 | ||||||
|             /* Get the clients list of supported groups. */ |             /* Get the clients list of supported groups. */ | ||||||
|             tls1_get_grouplist(s, 1, &clntcurves, &clnt_num_curves); |             tls1_get_peer_groups(s, &clntcurves, &clnt_num_curves); | ||||||
|             tls1_get_grouplist(s, 0, &pcurves, &num_curves); |             tls1_get_supported_groups(s, &pcurves, &num_curves); | ||||||
| 
 | 
 | ||||||
|             /* Find the first group we allow that is also in client's list */ |             /* Find the first group we allow that is also in client's list */ | ||||||
|             for (i = 0; i < num_curves; i++) { |             for (i = 0; i < num_curves; i++) { | ||||||
|  |  | ||||||
|  | @ -149,7 +149,7 @@ EXT_RETURN tls_construct_ctos_supported_groups(SSL *s, WPACKET *pkt, | ||||||
|      * Add TLS extension supported_groups to the ClientHello message |      * Add TLS extension supported_groups to the ClientHello message | ||||||
|      */ |      */ | ||||||
|     /* TODO(TLS1.3): Add support for DHE groups */ |     /* TODO(TLS1.3): Add support for DHE groups */ | ||||||
|     tls1_get_grouplist(s, 0, &pcurves, &num_curves); |     tls1_get_supported_groups(s, &pcurves, &num_curves); | ||||||
| 
 | 
 | ||||||
|     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups) |     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups) | ||||||
|                /* Sub-packet for supported_groups extension */ |                /* Sub-packet for supported_groups extension */ | ||||||
|  | @ -604,7 +604,7 @@ EXT_RETURN tls_construct_ctos_key_share(SSL *s, WPACKET *pkt, | ||||||
|         return EXT_RETURN_FAIL; |         return EXT_RETURN_FAIL; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     tls1_get_grouplist(s, 0, &pcurves, &num_curves); |     tls1_get_supported_groups(s, &pcurves, &num_curves); | ||||||
| 
 | 
 | ||||||
|     /*
 |     /*
 | ||||||
|      * TODO(TLS1.3): Make the number of key_shares sent configurable. For |      * TODO(TLS1.3): Make the number of key_shares sent configurable. For | ||||||
|  | @ -1534,7 +1534,7 @@ int tls_parse_stoc_key_share(SSL *s, PACKET *pkt, unsigned int context, X509 *x, | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /* Validate the selected group is one we support */ |         /* Validate the selected group is one we support */ | ||||||
|         tls1_get_grouplist(s, 0, &pcurves, &num_curves); |         tls1_get_supported_groups(s, &pcurves, &num_curves); | ||||||
|         for (i = 0; i < num_curves; i++) { |         for (i = 0; i < num_curves; i++) { | ||||||
|             if (group_id == pcurves[i]) |             if (group_id == pcurves[i]) | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|  | @ -520,9 +520,9 @@ int tls_parse_ctos_key_share(SSL *s, PACKET *pkt, unsigned int context, X509 *x, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Get our list of supported curves */ |     /* Get our list of supported curves */ | ||||||
|     tls1_get_grouplist(s, 0, &srvrcurves, &srvr_num_curves); |     tls1_get_supported_groups(s, &srvrcurves, &srvr_num_curves); | ||||||
|     /* Get the clients list of supported curves. */ |     /* Get the clients list of supported curves. */ | ||||||
|     tls1_get_grouplist(s, 1, &clntcurves, &clnt_num_curves); |     tls1_get_peer_groups(s, &clntcurves, &clnt_num_curves); | ||||||
|     if (clnt_num_curves == 0) { |     if (clnt_num_curves == 0) { | ||||||
|         /*
 |         /*
 | ||||||
|          * This can only happen if the supported_groups extension was not sent, |          * This can only happen if the supported_groups extension was not sent, | ||||||
|  | @ -885,7 +885,7 @@ EXT_RETURN tls_construct_stoc_supported_groups(SSL *s, WPACKET *pkt, | ||||||
|         return EXT_RETURN_NOT_SENT; |         return EXT_RETURN_NOT_SENT; | ||||||
| 
 | 
 | ||||||
|     /* Get our list of supported groups */ |     /* Get our list of supported groups */ | ||||||
|     tls1_get_grouplist(s, 0, &groups, &numgroups); |     tls1_get_supported_groups(s, &groups, &numgroups); | ||||||
|     if (numgroups == 0) { |     if (numgroups == 0) { | ||||||
|         SSLerr(SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS, ERR_R_INTERNAL_ERROR); |         SSLerr(SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS, ERR_R_INTERNAL_ERROR); | ||||||
|         return EXT_RETURN_FAIL; |         return EXT_RETURN_FAIL; | ||||||
|  |  | ||||||
							
								
								
									
										61
									
								
								ssl/t1_lib.c
								
								
								
								
							
							
						
						
									
										61
									
								
								ssl/t1_lib.c
								
								
								
								
							|  | @ -205,47 +205,37 @@ static uint16_t tls1_nid2group_id(int nid) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Get curves list, if "sess" is set return client curves otherwise |  * Set *pgroups to the supported groups list and *pgroupslen to | ||||||
|  * preferred list. |  * the number of groups supported. | ||||||
|  * Sets |num_curves| to the number of curves in the list, i.e., |  | ||||||
|  * the length of |pcurves| is num_curves. |  | ||||||
|  * Returns 1 on success and 0 if the client curves list has invalid format. |  | ||||||
|  * The latter indicates an internal error: we should not be accepting such |  | ||||||
|  * lists in the first place. |  | ||||||
|  */ |  */ | ||||||
| void tls1_get_grouplist(SSL *s, int sess, const uint16_t **pcurves, | void tls1_get_supported_groups(SSL *s, const uint16_t **pgroups, | ||||||
|                         size_t *pcurveslen) |                                size_t *pgroupslen) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|     if (sess) { |  | ||||||
|         *pcurves = s->session->ext.supportedgroups; |  | ||||||
|         *pcurveslen = s->session->ext.supportedgroups_len; |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|     /* For Suite B mode only include P-256, P-384 */ |     /* For Suite B mode only include P-256, P-384 */ | ||||||
|     switch (tls1_suiteb(s)) { |     switch (tls1_suiteb(s)) { | ||||||
|     case SSL_CERT_FLAG_SUITEB_128_LOS: |     case SSL_CERT_FLAG_SUITEB_128_LOS: | ||||||
|         *pcurves = suiteb_curves; |         *pgroups = suiteb_curves; | ||||||
|         *pcurveslen = OSSL_NELEM(suiteb_curves); |         *pgroupslen = OSSL_NELEM(suiteb_curves); | ||||||
|         break; |         break; | ||||||
| 
 | 
 | ||||||
|     case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY: |     case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY: | ||||||
|         *pcurves = suiteb_curves; |         *pgroups = suiteb_curves; | ||||||
|         *pcurveslen = 1; |         *pgroupslen = 1; | ||||||
|         break; |         break; | ||||||
| 
 | 
 | ||||||
|     case SSL_CERT_FLAG_SUITEB_192_LOS: |     case SSL_CERT_FLAG_SUITEB_192_LOS: | ||||||
|         *pcurves = suiteb_curves + 1; |         *pgroups = suiteb_curves + 1; | ||||||
|         *pcurveslen = 1; |         *pgroupslen = 1; | ||||||
|         break; |         break; | ||||||
| 
 | 
 | ||||||
|     default: |     default: | ||||||
|         if (s->ext.supportedgroups == NULL) { |         if (s->ext.supportedgroups == NULL) { | ||||||
|             *pcurves = eccurves_default; |             *pgroups = eccurves_default; | ||||||
|             *pcurveslen = OSSL_NELEM(eccurves_default); |             *pgroupslen = OSSL_NELEM(eccurves_default); | ||||||
|         } else { |         } else { | ||||||
|             *pcurves = s->ext.supportedgroups; |             *pgroups = s->ext.supportedgroups; | ||||||
|             *pcurveslen = s->ext.supportedgroups_len; |             *pgroupslen = s->ext.supportedgroups_len; | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  | @ -300,7 +290,7 @@ int tls1_check_curve(SSL *s, const unsigned char *p, size_t len) | ||||||
|         } else                  /* Should never happen */ |         } else                  /* Should never happen */ | ||||||
|             return 0; |             return 0; | ||||||
|     } |     } | ||||||
|     tls1_get_grouplist(s, 0, &curves, &num_curves); |     tls1_get_supported_groups(s, &curves, &num_curves); | ||||||
|     if (!tls1_in_list(curve_id, curves, num_curves)) |     if (!tls1_in_list(curve_id, curves, num_curves)) | ||||||
|         return 0; |         return 0; | ||||||
|     return tls_curve_allowed(s, curve_id, SSL_SECOP_CURVE_CHECK); |     return tls_curve_allowed(s, curve_id, SSL_SECOP_CURVE_CHECK); | ||||||
|  | @ -341,15 +331,16 @@ uint16_t tls1_shared_group(SSL *s, int nmatch) | ||||||
|         nmatch = 0; |         nmatch = 0; | ||||||
|     } |     } | ||||||
|     /*
 |     /*
 | ||||||
|      * Avoid truncation. tls1_get_grouplist takes an int |      * If server preference set, our groups are the preference order | ||||||
|      * but s->options is a long... |      * otherwise peer decides. | ||||||
|      */ |      */ | ||||||
|     tls1_get_grouplist(s, |     if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) { | ||||||
|             (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) != 0, |         tls1_get_supported_groups(s, &pref, &num_pref); | ||||||
|             &supp, &num_supp); |         tls1_get_peer_groups(s, &supp, &num_supp); | ||||||
|     tls1_get_grouplist(s, |     } else { | ||||||
|             (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) == 0, |         tls1_get_peer_groups(s, &pref, &num_pref); | ||||||
|             &pref, &num_pref); |         tls1_get_supported_groups(s, &supp, &num_supp); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     for (k = 0, i = 0; i < num_pref; i++) { |     for (k = 0, i = 0; i < num_pref; i++) { | ||||||
|         uint16_t id = pref[i]; |         uint16_t id = pref[i]; | ||||||
|  | @ -514,7 +505,7 @@ static int tls1_check_group_id(SSL *s, uint16_t group_id) | ||||||
|         return 0; |         return 0; | ||||||
| 
 | 
 | ||||||
|     /* Check group is one of our preferences */ |     /* Check group is one of our preferences */ | ||||||
|     tls1_get_grouplist(s, 0, &groups, &groups_len); |     tls1_get_supported_groups(s, &groups, &groups_len); | ||||||
|     if (!tls1_in_list(group_id, groups, groups_len)) |     if (!tls1_in_list(group_id, groups, groups_len)) | ||||||
|         return 0; |         return 0; | ||||||
| 
 | 
 | ||||||
|  | @ -523,7 +514,7 @@ static int tls1_check_group_id(SSL *s, uint16_t group_id) | ||||||
|         return 1; |         return 1; | ||||||
| 
 | 
 | ||||||
|     /* Check group is one of peers preferences */ |     /* Check group is one of peers preferences */ | ||||||
|     tls1_get_grouplist(s, 1, &groups, &groups_len); |     tls1_get_peer_groups(s, &groups, &groups_len); | ||||||
| 
 | 
 | ||||||
|     /*
 |     /*
 | ||||||
|      * RFC 4492 does not require the supported elliptic curves extension |      * RFC 4492 does not require the supported elliptic curves extension | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue