diff options
-rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 105 |
1 files changed, 58 insertions, 47 deletions
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c index f91b790f99..fdaf251be4 100644 --- a/src/lib/libssl/ssl_tlsext.c +++ b/src/lib/libssl/ssl_tlsext.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_tlsext.c,v 1.50 2019/11/15 15:14:02 beck Exp $ */ | 1 | /* $OpenBSD: ssl_tlsext.c,v 1.51 2019/11/16 15:36:53 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
@@ -1223,11 +1223,17 @@ tlsext_keyshare_client_needs(SSL *s) | |||
1223 | TLS1_3_VERSION); | 1223 | TLS1_3_VERSION); |
1224 | } | 1224 | } |
1225 | 1225 | ||
1226 | static int | 1226 | int |
1227 | tlsext_keyshare_x25519_internal(SSL *s, CBB *cbb) | 1227 | tlsext_keyshare_client_build(SSL *s, CBB *cbb) |
1228 | { | 1228 | { |
1229 | uint8_t *public_key = NULL, *private_key = NULL; | 1229 | uint8_t *public_key = NULL, *private_key = NULL; |
1230 | CBB key_exchange; | 1230 | CBB client_shares, key_exchange; |
1231 | |||
1232 | /* Generate and provide key shares. */ | ||
1233 | if (!CBB_add_u16_length_prefixed(cbb, &client_shares)) | ||
1234 | return 0; | ||
1235 | |||
1236 | /* XXX - other groups. */ | ||
1231 | 1237 | ||
1232 | /* Generate X25519 key pair. */ | 1238 | /* Generate X25519 key pair. */ |
1233 | if ((public_key = malloc(X25519_KEY_LENGTH)) == NULL) | 1239 | if ((public_key = malloc(X25519_KEY_LENGTH)) == NULL) |
@@ -1237,13 +1243,16 @@ tlsext_keyshare_x25519_internal(SSL *s, CBB *cbb) | |||
1237 | X25519_keypair(public_key, private_key); | 1243 | X25519_keypair(public_key, private_key); |
1238 | 1244 | ||
1239 | /* Add the group and serialize the public key. */ | 1245 | /* Add the group and serialize the public key. */ |
1240 | if (!CBB_add_u16(cbb, tls1_ec_nid2curve_id(NID_X25519))) | 1246 | if (!CBB_add_u16(&client_shares, tls1_ec_nid2curve_id(NID_X25519))) |
1241 | goto err; | 1247 | goto err; |
1242 | if (!CBB_add_u16_length_prefixed(cbb, &key_exchange)) | 1248 | if (!CBB_add_u16_length_prefixed(&client_shares, &key_exchange)) |
1243 | goto err; | 1249 | goto err; |
1244 | if (!CBB_add_bytes(&key_exchange, public_key, X25519_KEY_LENGTH)) | 1250 | if (!CBB_add_bytes(&key_exchange, public_key, X25519_KEY_LENGTH)) |
1245 | goto err; | 1251 | goto err; |
1246 | 1252 | ||
1253 | if (!CBB_flush(cbb)) | ||
1254 | goto err; | ||
1255 | |||
1247 | S3I(s)->hs_tls13.x25519_public = public_key; | 1256 | S3I(s)->hs_tls13.x25519_public = public_key; |
1248 | S3I(s)->hs_tls13.x25519_private = private_key; | 1257 | S3I(s)->hs_tls13.x25519_private = private_key; |
1249 | 1258 | ||
@@ -1257,32 +1266,6 @@ tlsext_keyshare_x25519_internal(SSL *s, CBB *cbb) | |||
1257 | } | 1266 | } |
1258 | 1267 | ||
1259 | int | 1268 | int |
1260 | tlsext_keyshare_client_build(SSL *s, CBB *cbb) | ||
1261 | { | ||
1262 | CBB client_shares; | ||
1263 | |||
1264 | /* Generate and provide key shares. */ | ||
1265 | if (!CBB_add_u16_length_prefixed(cbb, &client_shares)) | ||
1266 | return 0; | ||
1267 | |||
1268 | /* XXX - other groups. */ | ||
1269 | |||
1270 | if (!tlsext_keyshare_x25519_internal(s, &client_shares)) | ||
1271 | return 0; | ||
1272 | |||
1273 | if (!CBB_flush(cbb)) | ||
1274 | goto err; | ||
1275 | |||
1276 | return 1; | ||
1277 | |||
1278 | err: | ||
1279 | freezero(S3I(s)->hs_tls13.x25519_public, X25519_KEY_LENGTH); | ||
1280 | freezero(S3I(s)->hs_tls13.x25519_private, X25519_KEY_LENGTH); | ||
1281 | |||
1282 | return 0; | ||
1283 | } | ||
1284 | |||
1285 | int | ||
1286 | tlsext_keyshare_server_parse(SSL *s, CBS *cbs, int *alert) | 1269 | tlsext_keyshare_server_parse(SSL *s, CBS *cbs, int *alert) |
1287 | { | 1270 | { |
1288 | CBS client_shares; | 1271 | CBS client_shares; |
@@ -1341,21 +1324,41 @@ tlsext_keyshare_server_needs(SSL *s) | |||
1341 | int | 1324 | int |
1342 | tlsext_keyshare_server_build(SSL *s, CBB *cbb) | 1325 | tlsext_keyshare_server_build(SSL *s, CBB *cbb) |
1343 | { | 1326 | { |
1327 | uint8_t *public_key = NULL, *private_key = NULL; | ||
1328 | CBB key_exchange; | ||
1329 | |||
1330 | /* XXX deduplicate with client code */ | ||
1331 | |||
1344 | /* X25519 */ | 1332 | /* X25519 */ |
1345 | if (S3I(s)->hs_tls13.x25519_peer_public == NULL) | 1333 | if (S3I(s)->hs_tls13.x25519_peer_public == NULL) |
1346 | return 0; | 1334 | return 0; |
1347 | 1335 | ||
1348 | if (!tlsext_keyshare_x25519_internal(s, cbb)) | 1336 | /* Generate X25519 key pair. */ |
1349 | return 0; | 1337 | if ((public_key = malloc(X25519_KEY_LENGTH)) == NULL) |
1338 | goto err; | ||
1339 | if ((private_key = malloc(X25519_KEY_LENGTH)) == NULL) | ||
1340 | goto err; | ||
1341 | X25519_keypair(public_key, private_key); | ||
1342 | |||
1343 | /* Add the group and serialize the public key. */ | ||
1344 | if (!CBB_add_u16(cbb, tls1_ec_nid2curve_id(NID_X25519))) | ||
1345 | goto err; | ||
1346 | if (!CBB_add_u16_length_prefixed(cbb, &key_exchange)) | ||
1347 | goto err; | ||
1348 | if (!CBB_add_bytes(&key_exchange, public_key, X25519_KEY_LENGTH)) | ||
1349 | goto err; | ||
1350 | 1350 | ||
1351 | if (!CBB_flush(cbb)) | 1351 | if (!CBB_flush(cbb)) |
1352 | goto err; | 1352 | goto err; |
1353 | 1353 | ||
1354 | S3I(s)->hs_tls13.x25519_public = public_key; | ||
1355 | S3I(s)->hs_tls13.x25519_private = private_key; | ||
1356 | |||
1354 | return 1; | 1357 | return 1; |
1355 | 1358 | ||
1356 | err: | 1359 | err: |
1357 | freezero(S3I(s)->hs_tls13.x25519_public, X25519_KEY_LENGTH); | 1360 | freezero(public_key, X25519_KEY_LENGTH); |
1358 | freezero(S3I(s)->hs_tls13.x25519_private, X25519_KEY_LENGTH); | 1361 | freezero(private_key, X25519_KEY_LENGTH); |
1359 | 1362 | ||
1360 | return 0; | 1363 | return 0; |
1361 | } | 1364 | } |
@@ -1531,8 +1534,8 @@ tlsext_cookie_client_needs(SSL *s) | |||
1531 | S3I(s)->hs_tls13.cookie != NULL); | 1534 | S3I(s)->hs_tls13.cookie != NULL); |
1532 | } | 1535 | } |
1533 | 1536 | ||
1534 | static int | 1537 | int |
1535 | tlsext_cookie_build_internal(SSL *s, CBB *cbb) | 1538 | tlsext_cookie_client_build(SSL *s, CBB *cbb) |
1536 | { | 1539 | { |
1537 | CBB cookie; | 1540 | CBB cookie; |
1538 | 1541 | ||
@@ -1550,12 +1553,6 @@ tlsext_cookie_build_internal(SSL *s, CBB *cbb) | |||
1550 | } | 1553 | } |
1551 | 1554 | ||
1552 | int | 1555 | int |
1553 | tlsext_cookie_client_build(SSL *s, CBB *cbb) | ||
1554 | { | ||
1555 | return tlsext_cookie_build_internal(s, cbb); | ||
1556 | } | ||
1557 | |||
1558 | int | ||
1559 | tlsext_cookie_server_parse(SSL *s, CBS *cbs, int *alert) | 1556 | tlsext_cookie_server_parse(SSL *s, CBS *cbs, int *alert) |
1560 | { | 1557 | { |
1561 | CBS cookie; | 1558 | CBS cookie; |
@@ -1602,10 +1599,24 @@ tlsext_cookie_server_needs(SSL *s) | |||
1602 | } | 1599 | } |
1603 | 1600 | ||
1604 | int | 1601 | int |
1605 | tlsext_cookie_server_build(SSL *s, CBB *cbb) { | 1602 | tlsext_cookie_server_build(SSL *s, CBB *cbb) |
1606 | return tlsext_cookie_build_internal(s, cbb); | 1603 | { |
1607 | } | 1604 | CBB cookie; |
1605 | |||
1606 | /* XXX deduplicate with client code */ | ||
1608 | 1607 | ||
1608 | if (!CBB_add_u16_length_prefixed(cbb, &cookie)) | ||
1609 | return 0; | ||
1610 | |||
1611 | if (!CBB_add_bytes(&cookie, S3I(s)->hs_tls13.cookie, | ||
1612 | S3I(s)->hs_tls13.cookie_len)) | ||
1613 | return 0; | ||
1614 | |||
1615 | if (!CBB_flush(cbb)) | ||
1616 | return 0; | ||
1617 | |||
1618 | return 1; | ||
1619 | } | ||
1609 | 1620 | ||
1610 | int | 1621 | int |
1611 | tlsext_cookie_client_parse(SSL *s, CBS *cbs, int *alert) | 1622 | tlsext_cookie_client_parse(SSL *s, CBS *cbs, int *alert) |