|
@@ -697,22 +697,6 @@ static void tls_add_handshake ( struct tls_session *tls,
|
697
|
697
|
data, len );
|
698
|
698
|
}
|
699
|
699
|
|
700
|
|
-/**
|
701
|
|
- * Size of handshake output buffer
|
702
|
|
- *
|
703
|
|
- * @v tls TLS session
|
704
|
|
- */
|
705
|
|
-static size_t tls_verify_handshake_len ( struct tls_session *tls ) {
|
706
|
|
-
|
707
|
|
- if ( tls->version >= TLS_VERSION_TLS_1_2 ) {
|
708
|
|
- /* Use SHA-256 for TLSv1.2 and later */
|
709
|
|
- return SHA256_DIGEST_SIZE;
|
710
|
|
- } else {
|
711
|
|
- /* Use MD5+SHA1 for TLSv1.1 and earlier */
|
712
|
|
- return MD5_SHA1_DIGEST_SIZE;
|
713
|
|
- }
|
714
|
|
-}
|
715
|
|
-
|
716
|
700
|
/**
|
717
|
701
|
* Calculate handshake verification hash
|
718
|
702
|
*
|
|
@@ -723,22 +707,11 @@ static size_t tls_verify_handshake_len ( struct tls_session *tls ) {
|
723
|
707
|
* messages seen so far.
|
724
|
708
|
*/
|
725
|
709
|
static void tls_verify_handshake ( struct tls_session *tls, void *out ) {
|
726
|
|
- union {
|
727
|
|
- uint8_t md5_sha1[MD5_SHA1_CTX_SIZE];
|
728
|
|
- uint8_t sha256[SHA256_CTX_SIZE];
|
729
|
|
- } ctx;
|
|
710
|
+ struct digest_algorithm *digest = tls->handshake_digest;
|
|
711
|
+ uint8_t ctx[ digest->ctxsize ];
|
730
|
712
|
|
731
|
|
- if ( tls->version >= TLS_VERSION_TLS_1_2 ) {
|
732
|
|
- /* Use SHA-256 for TLSv1.2 and later */
|
733
|
|
- memcpy ( ctx.sha256, tls->handshake_sha256_ctx,
|
734
|
|
- sizeof ( ctx.sha256 ) );
|
735
|
|
- digest_final ( &sha256_algorithm, ctx.sha256, out );
|
736
|
|
- } else {
|
737
|
|
- /* Use MD5+SHA1 for TLSv1.1 and earlier */
|
738
|
|
- memcpy ( ctx.md5_sha1, tls->handshake_md5_sha1_ctx,
|
739
|
|
- sizeof ( ctx.md5_sha1 ) );
|
740
|
|
- digest_final ( &md5_sha1_algorithm, ctx.md5_sha1, out );
|
741
|
|
- }
|
|
713
|
+ memcpy ( ctx, tls->handshake_ctx, sizeof ( ctx ) );
|
|
714
|
+ digest_final ( digest, ctx, out );
|
742
|
715
|
}
|
743
|
716
|
|
744
|
717
|
/******************************************************************************
|
|
@@ -915,20 +888,21 @@ static int tls_send_change_cipher ( struct tls_session *tls ) {
|
915
|
888
|
* @ret rc Return status code
|
916
|
889
|
*/
|
917
|
890
|
static int tls_send_finished ( struct tls_session *tls ) {
|
|
891
|
+ struct digest_algorithm *digest = tls->handshake_digest;
|
918
|
892
|
struct {
|
919
|
893
|
uint32_t type_length;
|
920
|
894
|
uint8_t verify_data[12];
|
921
|
895
|
} __attribute__ (( packed )) finished;
|
922
|
|
- uint8_t digest[ tls_verify_handshake_len ( tls ) ];
|
|
896
|
+ uint8_t digest_out[ digest->digestsize ];
|
923
|
897
|
|
924
|
898
|
memset ( &finished, 0, sizeof ( finished ) );
|
925
|
899
|
finished.type_length = ( cpu_to_le32 ( TLS_FINISHED ) |
|
926
|
900
|
htonl ( sizeof ( finished ) -
|
927
|
901
|
sizeof ( finished.type_length ) ) );
|
928
|
|
- tls_verify_handshake ( tls, digest );
|
|
902
|
+ tls_verify_handshake ( tls, digest_out );
|
929
|
903
|
tls_prf_label ( tls, &tls->master_secret, sizeof ( tls->master_secret ),
|
930
|
904
|
finished.verify_data, sizeof ( finished.verify_data ),
|
931
|
|
- "client finished", digest, sizeof ( digest ) );
|
|
905
|
+ "client finished", digest_out, sizeof ( digest_out ) );
|
932
|
906
|
|
933
|
907
|
return tls_send_handshake ( tls, &finished, sizeof ( finished ) );
|
934
|
908
|
}
|
|
@@ -1052,6 +1026,14 @@ static int tls_new_server_hello ( struct tls_session *tls,
|
1052
|
1026
|
DBGC ( tls, "TLS %p using protocol version %d.%d\n",
|
1053
|
1027
|
tls, ( version >> 8 ), ( version & 0xff ) );
|
1054
|
1028
|
|
|
1029
|
+ /* Use MD5+SHA1 digest algorithm for handshake verification
|
|
1030
|
+ * for versions earlier than TLSv1.2.
|
|
1031
|
+ */
|
|
1032
|
+ if ( tls->version < TLS_VERSION_TLS_1_2 ) {
|
|
1033
|
+ tls->handshake_digest = &md5_sha1_algorithm;
|
|
1034
|
+ tls->handshake_ctx = tls->handshake_md5_sha1_ctx;
|
|
1035
|
+ }
|
|
1036
|
+
|
1055
|
1037
|
/* Copy out server random bytes */
|
1056
|
1038
|
memcpy ( &tls->server_random, &hello_a->random,
|
1057
|
1039
|
sizeof ( tls->server_random ) );
|
|
@@ -1254,12 +1236,13 @@ static int tls_new_server_hello_done ( struct tls_session *tls,
|
1254
|
1236
|
*/
|
1255
|
1237
|
static int tls_new_finished ( struct tls_session *tls,
|
1256
|
1238
|
const void *data, size_t len ) {
|
|
1239
|
+ struct digest_algorithm *digest = tls->handshake_digest;
|
1257
|
1240
|
const struct {
|
1258
|
1241
|
uint8_t verify_data[12];
|
1259
|
1242
|
char next[0];
|
1260
|
1243
|
} __attribute__ (( packed )) *finished = data;
|
1261
|
1244
|
const void *end = finished->next;
|
1262
|
|
- uint8_t digest[ tls_verify_handshake_len ( tls ) ];
|
|
1245
|
+ uint8_t digest_out[ digest->digestsize ];
|
1263
|
1246
|
uint8_t verify_data[ sizeof ( finished->verify_data ) ];
|
1264
|
1247
|
|
1265
|
1248
|
/* Sanity check */
|
|
@@ -1270,10 +1253,10 @@ static int tls_new_finished ( struct tls_session *tls,
|
1270
|
1253
|
}
|
1271
|
1254
|
|
1272
|
1255
|
/* Verify data */
|
1273
|
|
- tls_verify_handshake ( tls, digest );
|
|
1256
|
+ tls_verify_handshake ( tls, digest_out );
|
1274
|
1257
|
tls_prf_label ( tls, &tls->master_secret, sizeof ( tls->master_secret ),
|
1275
|
1258
|
verify_data, sizeof ( verify_data ), "server finished",
|
1276
|
|
- digest, sizeof ( digest ) );
|
|
1259
|
+ digest_out, sizeof ( digest_out ) );
|
1277
|
1260
|
if ( memcmp ( verify_data, finished->verify_data,
|
1278
|
1261
|
sizeof ( verify_data ) ) != 0 ) {
|
1279
|
1262
|
DBGC ( tls, "TLS %p verification failed\n", tls );
|
|
@@ -2014,8 +1997,8 @@ static void tls_tx_step ( struct tls_session *tls ) {
|
2014
|
1997
|
} else if ( tls->tx_pending & TLS_TX_CLIENT_KEY_EXCHANGE ) {
|
2015
|
1998
|
/* Send Client Key Exchange */
|
2016
|
1999
|
if ( ( rc = tls_send_client_key_exchange ( tls ) ) != 0 ) {
|
2017
|
|
- DBGC ( tls, "TLS %p could send Client Key Exchange: "
|
2018
|
|
- "%s\n", tls, strerror ( rc ) );
|
|
2000
|
+ DBGC ( tls, "TLS %p could not send Client Key "
|
|
2001
|
+ "Exchange: %s\n", tls, strerror ( rc ) );
|
2019
|
2002
|
goto err;
|
2020
|
2003
|
}
|
2021
|
2004
|
tls->tx_pending &= ~TLS_TX_CLIENT_KEY_EXCHANGE;
|
|
@@ -2099,6 +2082,8 @@ int add_tls ( struct interface *xfer, const char *name,
|
2099
|
2082
|
}
|
2100
|
2083
|
digest_init ( &md5_sha1_algorithm, tls->handshake_md5_sha1_ctx );
|
2101
|
2084
|
digest_init ( &sha256_algorithm, tls->handshake_sha256_ctx );
|
|
2085
|
+ tls->handshake_digest = &sha256_algorithm;
|
|
2086
|
+ tls->handshake_ctx = tls->handshake_sha256_ctx;
|
2102
|
2087
|
tls->tx_pending = TLS_TX_CLIENT_HELLO;
|
2103
|
2088
|
process_init ( &tls->process, &tls_process_desc, &tls->refcnt );
|
2104
|
2089
|
|