diff options
| author | jsing <> | 2018-08-16 17:39:50 +0000 |
|---|---|---|
| committer | jsing <> | 2018-08-16 17:39:50 +0000 |
| commit | 9fa624a2bed90c47dc3c7a30f33591128ce8ee07 (patch) | |
| tree | b373f4cb97c8546fc6d21a90b12e5ff0f899b04c /src/lib/libssl/ssl_clnt.c | |
| parent | 61047d88f0630349c7e9d77bb765951611173867 (diff) | |
| download | openbsd-9fa624a2bed90c47dc3c7a30f33591128ce8ee07.tar.gz openbsd-9fa624a2bed90c47dc3c7a30f33591128ce8ee07.tar.bz2 openbsd-9fa624a2bed90c47dc3c7a30f33591128ce8ee07.zip | |
Convert ssl3_get_server_key_exchange() to CBS.
ok inoguchi@ tb@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/ssl_clnt.c | 124 |
1 files changed, 55 insertions, 69 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 83b2c1be58..c53fbda4ba 100644 --- a/src/lib/libssl/ssl_clnt.c +++ b/src/lib/libssl/ssl_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_clnt.c,v 1.29 2018/08/14 16:31:02 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.30 2018/08/16 17:39:50 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -1189,9 +1189,9 @@ err: | |||
| 1189 | } | 1189 | } |
| 1190 | 1190 | ||
| 1191 | static int | 1191 | static int |
| 1192 | ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | 1192 | ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) |
| 1193 | { | 1193 | { |
| 1194 | CBS cbs, dhp, dhg, dhpk; | 1194 | CBS dhp, dhg, dhpk; |
| 1195 | BN_CTX *bn_ctx = NULL; | 1195 | BN_CTX *bn_ctx = NULL; |
| 1196 | SESS_CERT *sc = NULL; | 1196 | SESS_CERT *sc = NULL; |
| 1197 | DH *dh = NULL; | 1197 | DH *dh = NULL; |
| @@ -1201,31 +1201,26 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
| 1201 | alg_a = S3I(s)->hs.new_cipher->algorithm_auth; | 1201 | alg_a = S3I(s)->hs.new_cipher->algorithm_auth; |
| 1202 | sc = SSI(s)->sess_cert; | 1202 | sc = SSI(s)->sess_cert; |
| 1203 | 1203 | ||
| 1204 | if (*nn < 0) | ||
| 1205 | goto err; | ||
| 1206 | |||
| 1207 | CBS_init(&cbs, *pp, *nn); | ||
| 1208 | |||
| 1209 | if ((dh = DH_new()) == NULL) { | 1204 | if ((dh = DH_new()) == NULL) { |
| 1210 | SSLerror(s, ERR_R_DH_LIB); | 1205 | SSLerror(s, ERR_R_DH_LIB); |
| 1211 | goto err; | 1206 | goto err; |
| 1212 | } | 1207 | } |
| 1213 | 1208 | ||
| 1214 | if (!CBS_get_u16_length_prefixed(&cbs, &dhp)) | 1209 | if (!CBS_get_u16_length_prefixed(cbs, &dhp)) |
| 1215 | goto truncated; | 1210 | goto truncated; |
| 1216 | if ((dh->p = BN_bin2bn(CBS_data(&dhp), CBS_len(&dhp), NULL)) == NULL) { | 1211 | if ((dh->p = BN_bin2bn(CBS_data(&dhp), CBS_len(&dhp), NULL)) == NULL) { |
| 1217 | SSLerror(s, ERR_R_BN_LIB); | 1212 | SSLerror(s, ERR_R_BN_LIB); |
| 1218 | goto err; | 1213 | goto err; |
| 1219 | } | 1214 | } |
| 1220 | 1215 | ||
| 1221 | if (!CBS_get_u16_length_prefixed(&cbs, &dhg)) | 1216 | if (!CBS_get_u16_length_prefixed(cbs, &dhg)) |
| 1222 | goto truncated; | 1217 | goto truncated; |
| 1223 | if ((dh->g = BN_bin2bn(CBS_data(&dhg), CBS_len(&dhg), NULL)) == NULL) { | 1218 | if ((dh->g = BN_bin2bn(CBS_data(&dhg), CBS_len(&dhg), NULL)) == NULL) { |
| 1224 | SSLerror(s, ERR_R_BN_LIB); | 1219 | SSLerror(s, ERR_R_BN_LIB); |
| 1225 | goto err; | 1220 | goto err; |
| 1226 | } | 1221 | } |
| 1227 | 1222 | ||
| 1228 | if (!CBS_get_u16_length_prefixed(&cbs, &dhpk)) | 1223 | if (!CBS_get_u16_length_prefixed(cbs, &dhpk)) |
| 1229 | goto truncated; | 1224 | goto truncated; |
| 1230 | if ((dh->pub_key = BN_bin2bn(CBS_data(&dhpk), CBS_len(&dhpk), | 1225 | if ((dh->pub_key = BN_bin2bn(CBS_data(&dhpk), CBS_len(&dhpk), |
| 1231 | NULL)) == NULL) { | 1226 | NULL)) == NULL) { |
| @@ -1250,9 +1245,6 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
| 1250 | 1245 | ||
| 1251 | sc->peer_dh_tmp = dh; | 1246 | sc->peer_dh_tmp = dh; |
| 1252 | 1247 | ||
| 1253 | *nn = CBS_len(&cbs); | ||
| 1254 | *pp = (unsigned char *)CBS_data(&cbs); | ||
| 1255 | |||
| 1256 | return (1); | 1248 | return (1); |
| 1257 | 1249 | ||
| 1258 | truncated: | 1250 | truncated: |
| @@ -1353,9 +1345,9 @@ ssl3_get_server_kex_ecdhe_ecx(SSL *s, SESS_CERT *sc, int nid, CBS *public) | |||
| 1353 | } | 1345 | } |
| 1354 | 1346 | ||
| 1355 | static int | 1347 | static int |
| 1356 | ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | 1348 | ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) |
| 1357 | { | 1349 | { |
| 1358 | CBS cbs, public; | 1350 | CBS public; |
| 1359 | uint8_t curve_type; | 1351 | uint8_t curve_type; |
| 1360 | uint16_t curve_id; | 1352 | uint16_t curve_id; |
| 1361 | SESS_CERT *sc; | 1353 | SESS_CERT *sc; |
| @@ -1366,15 +1358,10 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
| 1366 | alg_a = S3I(s)->hs.new_cipher->algorithm_auth; | 1358 | alg_a = S3I(s)->hs.new_cipher->algorithm_auth; |
| 1367 | sc = SSI(s)->sess_cert; | 1359 | sc = SSI(s)->sess_cert; |
| 1368 | 1360 | ||
| 1369 | if (*nn < 0) | ||
| 1370 | goto err; | ||
| 1371 | |||
| 1372 | CBS_init(&cbs, *pp, *nn); | ||
| 1373 | |||
| 1374 | /* Only named curves are supported. */ | 1361 | /* Only named curves are supported. */ |
| 1375 | if (!CBS_get_u8(&cbs, &curve_type) || | 1362 | if (!CBS_get_u8(cbs, &curve_type) || |
| 1376 | curve_type != NAMED_CURVE_TYPE || | 1363 | curve_type != NAMED_CURVE_TYPE || |
| 1377 | !CBS_get_u16(&cbs, &curve_id)) { | 1364 | !CBS_get_u16(cbs, &curve_id)) { |
| 1378 | al = SSL_AD_DECODE_ERROR; | 1365 | al = SSL_AD_DECODE_ERROR; |
| 1379 | SSLerror(s, SSL_R_LENGTH_TOO_SHORT); | 1366 | SSLerror(s, SSL_R_LENGTH_TOO_SHORT); |
| 1380 | goto f_err; | 1367 | goto f_err; |
| @@ -1396,7 +1383,7 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
| 1396 | goto f_err; | 1383 | goto f_err; |
| 1397 | } | 1384 | } |
| 1398 | 1385 | ||
| 1399 | if (!CBS_get_u8_length_prefixed(&cbs, &public)) | 1386 | if (!CBS_get_u8_length_prefixed(cbs, &public)) |
| 1400 | goto truncated; | 1387 | goto truncated; |
| 1401 | 1388 | ||
| 1402 | if (nid == NID_X25519) { | 1389 | if (nid == NID_X25519) { |
| @@ -1420,9 +1407,6 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
| 1420 | /* XXX - Anonymous ECDH, so no certificate or pkey. */ | 1407 | /* XXX - Anonymous ECDH, so no certificate or pkey. */ |
| 1421 | *pkey = NULL; | 1408 | *pkey = NULL; |
| 1422 | 1409 | ||
| 1423 | *nn = CBS_len(&cbs); | ||
| 1424 | *pp = (unsigned char *)CBS_data(&cbs); | ||
| 1425 | |||
| 1426 | return (1); | 1410 | return (1); |
| 1427 | 1411 | ||
| 1428 | truncated: | 1412 | truncated: |
| @@ -1439,12 +1423,17 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
| 1439 | int | 1423 | int |
| 1440 | ssl3_get_server_key_exchange(SSL *s) | 1424 | ssl3_get_server_key_exchange(SSL *s) |
| 1441 | { | 1425 | { |
| 1442 | EVP_MD_CTX md_ctx; | 1426 | CBS cbs, signature; |
| 1443 | unsigned char *param, *p; | 1427 | const EVP_MD *md = NULL; |
| 1444 | int al, i, j, param_len, ok; | 1428 | EVP_PKEY *pkey = NULL; |
| 1445 | long n, alg_k, alg_a; | 1429 | EVP_MD_CTX md_ctx; |
| 1446 | EVP_PKEY *pkey = NULL; | 1430 | const unsigned char *param; |
| 1447 | const EVP_MD *md = NULL; | 1431 | uint8_t hash_id, sig_id; |
| 1432 | long n, alg_k, alg_a; | ||
| 1433 | int al, ok, sigalg; | ||
| 1434 | size_t param_len; | ||
| 1435 | |||
| 1436 | EVP_MD_CTX_init(&md_ctx); | ||
| 1448 | 1437 | ||
| 1449 | alg_k = S3I(s)->hs.new_cipher->algorithm_mkey; | 1438 | alg_k = S3I(s)->hs.new_cipher->algorithm_mkey; |
| 1450 | alg_a = S3I(s)->hs.new_cipher->algorithm_auth; | 1439 | alg_a = S3I(s)->hs.new_cipher->algorithm_auth; |
| @@ -1458,7 +1447,10 @@ ssl3_get_server_key_exchange(SSL *s) | |||
| 1458 | if (!ok) | 1447 | if (!ok) |
| 1459 | return ((int)n); | 1448 | return ((int)n); |
| 1460 | 1449 | ||
| 1461 | EVP_MD_CTX_init(&md_ctx); | 1450 | if (n < 0) |
| 1451 | goto err; | ||
| 1452 | |||
| 1453 | CBS_init(&cbs, s->internal->init_msg, n); | ||
| 1462 | 1454 | ||
| 1463 | if (S3I(s)->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { | 1455 | if (S3I(s)->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { |
| 1464 | /* | 1456 | /* |
| @@ -1491,14 +1483,14 @@ ssl3_get_server_key_exchange(SSL *s) | |||
| 1491 | goto err; | 1483 | goto err; |
| 1492 | } | 1484 | } |
| 1493 | 1485 | ||
| 1494 | param = p = (unsigned char *)s->internal->init_msg; | 1486 | param = CBS_data(&cbs); |
| 1495 | param_len = n; | 1487 | param_len = CBS_len(&cbs); |
| 1496 | 1488 | ||
| 1497 | if (alg_k & SSL_kDHE) { | 1489 | if (alg_k & SSL_kDHE) { |
| 1498 | if (ssl3_get_server_kex_dhe(s, &pkey, &p, &n) != 1) | 1490 | if (ssl3_get_server_kex_dhe(s, &pkey, &cbs) != 1) |
| 1499 | goto err; | 1491 | goto err; |
| 1500 | } else if (alg_k & SSL_kECDHE) { | 1492 | } else if (alg_k & SSL_kECDHE) { |
| 1501 | if (ssl3_get_server_kex_ecdhe(s, &pkey, &p, &n) != 1) | 1493 | if (ssl3_get_server_kex_ecdhe(s, &pkey, &cbs) != 1) |
| 1502 | goto err; | 1494 | goto err; |
| 1503 | } else if (alg_k != 0) { | 1495 | } else if (alg_k != 0) { |
| 1504 | al = SSL_AD_UNEXPECTED_MESSAGE; | 1496 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| @@ -1506,47 +1498,42 @@ ssl3_get_server_key_exchange(SSL *s) | |||
| 1506 | goto f_err; | 1498 | goto f_err; |
| 1507 | } | 1499 | } |
| 1508 | 1500 | ||
| 1509 | param_len = param_len - n; | 1501 | param_len -= CBS_len(&cbs); |
| 1510 | 1502 | ||
| 1511 | /* if it was signed, check the signature */ | 1503 | /* if it was signed, check the signature */ |
| 1512 | if (pkey != NULL) { | 1504 | if (pkey != NULL) { |
| 1513 | if (SSL_USE_SIGALGS(s)) { | 1505 | if (SSL_USE_SIGALGS(s)) { |
| 1514 | int sigalg = tls12_get_sigid(pkey); | 1506 | if (!CBS_get_u8(&cbs, &hash_id)) |
| 1515 | if (sigalg == -1) { | 1507 | goto truncated; |
| 1508 | if (!CBS_get_u8(&cbs, &sig_id)) | ||
| 1509 | goto truncated; | ||
| 1510 | |||
| 1511 | if ((md = tls12_get_hash(hash_id)) == NULL) { | ||
| 1512 | SSLerror(s, SSL_R_UNKNOWN_DIGEST); | ||
| 1513 | al = SSL_AD_DECODE_ERROR; | ||
| 1514 | goto f_err; | ||
| 1515 | } | ||
| 1516 | |||
| 1517 | /* Check key type is consistent with signature. */ | ||
| 1518 | if ((sigalg = tls12_get_sigid(pkey)) == -1) { | ||
| 1516 | /* Should never happen */ | 1519 | /* Should never happen */ |
| 1517 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1520 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 1518 | goto err; | 1521 | goto err; |
| 1519 | } | 1522 | } |
| 1520 | /* Check key type is consistent with signature. */ | 1523 | if (sigalg != sig_id) { |
| 1521 | if (2 > n) | ||
| 1522 | goto truncated; | ||
| 1523 | if (sigalg != (int)p[1]) { | ||
| 1524 | SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); | 1524 | SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); |
| 1525 | al = SSL_AD_DECODE_ERROR; | 1525 | al = SSL_AD_DECODE_ERROR; |
| 1526 | goto f_err; | 1526 | goto f_err; |
| 1527 | } | 1527 | } |
| 1528 | md = tls12_get_hash(p[0]); | ||
| 1529 | if (md == NULL) { | ||
| 1530 | SSLerror(s, SSL_R_UNKNOWN_DIGEST); | ||
| 1531 | al = SSL_AD_DECODE_ERROR; | ||
| 1532 | goto f_err; | ||
| 1533 | } | ||
| 1534 | p += 2; | ||
| 1535 | n -= 2; | ||
| 1536 | } else if (pkey->type == EVP_PKEY_RSA) { | 1528 | } else if (pkey->type == EVP_PKEY_RSA) { |
| 1537 | md = EVP_md5_sha1(); | 1529 | md = EVP_md5_sha1(); |
| 1538 | } else { | 1530 | } else { |
| 1539 | md = EVP_sha1(); | 1531 | md = EVP_sha1(); |
| 1540 | } | 1532 | } |
| 1541 | 1533 | ||
| 1542 | if (2 > n) | 1534 | if (!CBS_get_u16_length_prefixed(&cbs, &signature)) |
| 1543 | goto truncated; | 1535 | goto truncated; |
| 1544 | n2s(p, i); | 1536 | if (CBS_len(&signature) > EVP_PKEY_size(pkey)) { |
| 1545 | n -= 2; | ||
| 1546 | j = EVP_PKEY_size(pkey); | ||
| 1547 | |||
| 1548 | if (i != n || n > j) { | ||
| 1549 | /* wrong packet length */ | ||
| 1550 | al = SSL_AD_DECODE_ERROR; | 1537 | al = SSL_AD_DECODE_ERROR; |
| 1551 | SSLerror(s, SSL_R_WRONG_SIGNATURE_LENGTH); | 1538 | SSLerror(s, SSL_R_WRONG_SIGNATURE_LENGTH); |
| 1552 | goto f_err; | 1539 | goto f_err; |
| @@ -1562,8 +1549,8 @@ ssl3_get_server_key_exchange(SSL *s) | |||
| 1562 | goto err; | 1549 | goto err; |
| 1563 | if (!EVP_VerifyUpdate(&md_ctx, param, param_len)) | 1550 | if (!EVP_VerifyUpdate(&md_ctx, param, param_len)) |
| 1564 | goto err; | 1551 | goto err; |
| 1565 | if (EVP_VerifyFinal(&md_ctx, p, (int)n, pkey) <= 0) { | 1552 | if (EVP_VerifyFinal(&md_ctx, CBS_data(&signature), |
| 1566 | /* bad signature */ | 1553 | CBS_len(&signature), pkey) <= 0) { |
| 1567 | al = SSL_AD_DECRYPT_ERROR; | 1554 | al = SSL_AD_DECRYPT_ERROR; |
| 1568 | SSLerror(s, SSL_R_BAD_SIGNATURE); | 1555 | SSLerror(s, SSL_R_BAD_SIGNATURE); |
| 1569 | goto f_err; | 1556 | goto f_err; |
| @@ -1574,12 +1561,12 @@ ssl3_get_server_key_exchange(SSL *s) | |||
| 1574 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1561 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 1575 | goto err; | 1562 | goto err; |
| 1576 | } | 1563 | } |
| 1577 | /* still data left over */ | 1564 | } |
| 1578 | if (n != 0) { | 1565 | |
| 1579 | al = SSL_AD_DECODE_ERROR; | 1566 | if (CBS_len(&cbs) != 0) { |
| 1580 | SSLerror(s, SSL_R_EXTRA_DATA_IN_MESSAGE); | 1567 | al = SSL_AD_DECODE_ERROR; |
| 1581 | goto f_err; | 1568 | SSLerror(s, SSL_R_EXTRA_DATA_IN_MESSAGE); |
| 1582 | } | 1569 | goto f_err; |
| 1583 | } | 1570 | } |
| 1584 | 1571 | ||
| 1585 | EVP_PKEY_free(pkey); | 1572 | EVP_PKEY_free(pkey); |
| @@ -1588,7 +1575,6 @@ ssl3_get_server_key_exchange(SSL *s) | |||
| 1588 | return (1); | 1575 | return (1); |
| 1589 | 1576 | ||
| 1590 | truncated: | 1577 | truncated: |
| 1591 | /* wrong packet length */ | ||
| 1592 | al = SSL_AD_DECODE_ERROR; | 1578 | al = SSL_AD_DECODE_ERROR; |
| 1593 | SSLerror(s, SSL_R_BAD_PACKET_LENGTH); | 1579 | SSLerror(s, SSL_R_BAD_PACKET_LENGTH); |
| 1594 | 1580 | ||
