tls-crypto: Generalizing DH group to TLS group mapping
This simplifies writing the key share extension as the TLS group does not have to be cached.
This commit is contained in:
committed by
Tobias Brunner
parent
ab70f68cf9
commit
066ac8809c
@@ -2319,3 +2319,20 @@ int tls_crypto_get_supported_suites(bool null, tls_version_t version,
|
|||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header.
|
||||||
|
*/
|
||||||
|
tls_named_group_t tls_ec_group_to_curve(diffie_hellman_group_t group)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < countof(curves); i++)
|
||||||
|
{
|
||||||
|
if (curves[i].group == group)
|
||||||
|
{
|
||||||
|
return curves[i].curve;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -669,4 +669,12 @@ tls_crypto_t *tls_crypto_create(tls_t *tls, tls_cache_t *cache);
|
|||||||
int tls_crypto_get_supported_suites(bool null, tls_version_t version,
|
int tls_crypto_get_supported_suites(bool null, tls_version_t version,
|
||||||
tls_cipher_suite_t **suites);
|
tls_cipher_suite_t **suites);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the TLS curve of a given EC DH group
|
||||||
|
*
|
||||||
|
* @param group diffie hellman group indicator
|
||||||
|
* @return TLS group indicator
|
||||||
|
*/
|
||||||
|
tls_named_group_t tls_ec_group_to_curve(diffie_hellman_group_t group);
|
||||||
|
|
||||||
#endif /** TLS_CRYPTO_H_ @}*/
|
#endif /** TLS_CRYPTO_H_ @}*/
|
||||||
|
|||||||
@@ -158,8 +158,7 @@ struct private_tls_peer_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Implemented in tls_server.c */
|
/* Implemented in tls_server.c */
|
||||||
bool tls_write_key_share(bio_writer_t **key_share, tls_named_group_t group,
|
bool tls_write_key_share(bio_writer_t **key_share, diffie_hellman_t *dh);
|
||||||
diffie_hellman_t *dh);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify the DH group/key type requested by the server is valid.
|
* Verify the DH group/key type requested by the server is valid.
|
||||||
@@ -1202,7 +1201,7 @@ static status_t send_client_hello(private_tls_peer_t *this,
|
|||||||
bio_writer_t *extensions, *curves = NULL, *versions, *key_share, *signatures;
|
bio_writer_t *extensions, *curves = NULL, *versions, *key_share, *signatures;
|
||||||
tls_version_t version_max, version_min;
|
tls_version_t version_max, version_min;
|
||||||
diffie_hellman_group_t group;
|
diffie_hellman_group_t group;
|
||||||
tls_named_group_t curve, selected_curve = 0;
|
tls_named_group_t curve;
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
int count, i, v;
|
int count, i, v;
|
||||||
rng_t *rng;
|
rng_t *rng;
|
||||||
@@ -1296,7 +1295,6 @@ static status_t send_client_hello(private_tls_peer_t *this,
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
selected_curve = curve;
|
|
||||||
}
|
}
|
||||||
curves->write_uint16(curves, curve);
|
curves->write_uint16(curves, curve);
|
||||||
}
|
}
|
||||||
@@ -1355,13 +1353,12 @@ static status_t send_client_hello(private_tls_peer_t *this,
|
|||||||
extensions->write_data16(extensions, signatures->get_buf(signatures));
|
extensions->write_data16(extensions, signatures->get_buf(signatures));
|
||||||
signatures->destroy(signatures);
|
signatures->destroy(signatures);
|
||||||
|
|
||||||
if (this->tls->get_version_max(this->tls) >= TLS_1_3 &&
|
if (this->tls->get_version_max(this->tls) >= TLS_1_3)
|
||||||
this->dh)
|
|
||||||
{
|
{
|
||||||
DBG2(DBG_TLS, "sending extension: %N",
|
DBG2(DBG_TLS, "sending extension: %N",
|
||||||
tls_extension_names, TLS_EXT_KEY_SHARE);
|
tls_extension_names, TLS_EXT_KEY_SHARE);
|
||||||
extensions->write_uint16(extensions, TLS_EXT_KEY_SHARE);
|
extensions->write_uint16(extensions, TLS_EXT_KEY_SHARE);
|
||||||
if (!tls_write_key_share(&key_share, selected_curve, this->dh))
|
if (!tls_write_key_share(&key_share, this->dh))
|
||||||
{
|
{
|
||||||
this->alert->add(this->alert, TLS_FATAL, TLS_INTERNAL_ERROR);
|
this->alert->add(this->alert, TLS_FATAL, TLS_INTERNAL_ERROR);
|
||||||
extensions->destroy(extensions);
|
extensions->destroy(extensions);
|
||||||
|
|||||||
+13
-31
@@ -954,20 +954,25 @@ METHOD(tls_handshake_t, process, status_t,
|
|||||||
/**
|
/**
|
||||||
* Write public key into key share extension
|
* Write public key into key share extension
|
||||||
*/
|
*/
|
||||||
bool tls_write_key_share(bio_writer_t **key_share, tls_named_group_t group,
|
bool tls_write_key_share(bio_writer_t **key_share, diffie_hellman_t *dh)
|
||||||
diffie_hellman_t *dh)
|
|
||||||
{
|
{
|
||||||
bio_writer_t *writer;
|
bio_writer_t *writer;
|
||||||
|
tls_named_group_t curve;
|
||||||
chunk_t pub;
|
chunk_t pub;
|
||||||
|
|
||||||
if (!dh || !dh->get_my_public_value(dh, &pub))
|
if (!dh)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
curve = tls_ec_group_to_curve(dh->get_dh_group(dh));
|
||||||
|
if (!curve || !dh->get_my_public_value(dh, &pub))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
*key_share = writer = bio_writer_create(pub.len + 7);
|
*key_share = writer = bio_writer_create(pub.len + 7);
|
||||||
writer->write_uint16(writer, group);
|
writer->write_uint16(writer, curve);
|
||||||
if (group == TLS_CURVE25519 ||
|
if (curve == TLS_CURVE25519 ||
|
||||||
group == TLS_CURVE448)
|
curve == TLS_CURVE448)
|
||||||
{
|
{
|
||||||
writer->write_data16(writer, pub);
|
writer->write_data16(writer, pub);
|
||||||
}
|
}
|
||||||
@@ -1019,7 +1024,7 @@ static status_t send_server_hello(private_tls_server_t *this,
|
|||||||
tls_extension_names, TLS_EXT_KEY_SHARE);
|
tls_extension_names, TLS_EXT_KEY_SHARE);
|
||||||
extensions->write_uint16(extensions, TLS_EXT_KEY_SHARE);
|
extensions->write_uint16(extensions, TLS_EXT_KEY_SHARE);
|
||||||
|
|
||||||
if (!tls_write_key_share(&key_share, this->requested_curve, this->dh))
|
if (!tls_write_key_share(&key_share, this->dh))
|
||||||
{
|
{
|
||||||
this->alert->add(this->alert, TLS_FATAL, TLS_INTERNAL_ERROR);
|
this->alert->add(this->alert, TLS_FATAL, TLS_INTERNAL_ERROR);
|
||||||
extensions->destroy(extensions);
|
extensions->destroy(extensions);
|
||||||
@@ -1197,29 +1202,6 @@ static status_t send_certificate_request(private_tls_server_t *this,
|
|||||||
return NEED_MORE;
|
return NEED_MORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the TLS curve of a given EC DH group
|
|
||||||
*/
|
|
||||||
static tls_named_group_t ec_group_to_curve(private_tls_server_t *this,
|
|
||||||
diffie_hellman_group_t group)
|
|
||||||
{
|
|
||||||
diffie_hellman_group_t current;
|
|
||||||
tls_named_group_t curve;
|
|
||||||
enumerator_t *enumerator;
|
|
||||||
|
|
||||||
enumerator = this->crypto->create_ec_enumerator(this->crypto);
|
|
||||||
while (enumerator->enumerate(enumerator, ¤t, &curve))
|
|
||||||
{
|
|
||||||
if (current == group)
|
|
||||||
{
|
|
||||||
enumerator->destroy(enumerator);
|
|
||||||
return curve;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
enumerator->destroy(enumerator);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to find a curve supported by both, client and server
|
* Try to find a curve supported by both, client and server
|
||||||
*/
|
*/
|
||||||
@@ -1256,7 +1238,7 @@ static status_t send_server_key_exchange(private_tls_server_t *this,
|
|||||||
|
|
||||||
if (diffie_hellman_group_is_ec(group))
|
if (diffie_hellman_group_is_ec(group))
|
||||||
{
|
{
|
||||||
curve = ec_group_to_curve(this, group);
|
curve = tls_ec_group_to_curve(group);
|
||||||
if (!curve || (!peer_supports_curve(this, curve) &&
|
if (!curve || (!peer_supports_curve(this, curve) &&
|
||||||
!find_supported_curve(this, &curve)))
|
!find_supported_curve(this, &curve)))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user