@@ -68547,6 +68547,81 @@ static int test_dtls_dropped_ccs(void)
6854768547#endif
6854868548 return EXPECT_RESULT();
6854968549}
68550+
68551+ #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS) \
68552+ && !defined(WOLFSSL_NO_TLS12)
68553+ static int test_dtls_seq_num_downgrade_check_num(byte* ioBuf, int ioBufLen,
68554+ byte seq_num)
68555+ {
68556+ EXPECT_DECLS;
68557+ DtlsRecordLayerHeader* dtlsRH;
68558+ byte sequence_number[8];
68559+
68560+ XMEMSET(&sequence_number, 0, sizeof(sequence_number));
68561+
68562+ ExpectIntGE(ioBufLen, sizeof(*dtlsRH));
68563+ dtlsRH = (DtlsRecordLayerHeader*)ioBuf;
68564+ ExpectIntEQ(dtlsRH->type, handshake);
68565+ ExpectIntEQ(dtlsRH->pvMajor, DTLS_MAJOR);
68566+ ExpectIntEQ(dtlsRH->pvMinor, DTLSv1_2_MINOR);
68567+ sequence_number[7] = seq_num;
68568+ ExpectIntEQ(XMEMCMP(sequence_number, dtlsRH->sequence_number,
68569+ sizeof(sequence_number)), 0);
68570+
68571+ return EXPECT_RESULT();
68572+ }
68573+ #endif
68574+
68575+ /*
68576+ * Make sure that we send the correct sequence number after a HelloVerifyRequest
68577+ * and after a HelloRetryRequest. This is testing the server side as it is
68578+ * operating statelessly and should copy the sequence number of the ClientHello.
68579+ */
68580+ static int test_dtls_seq_num_downgrade(void)
68581+ {
68582+ EXPECT_DECLS;
68583+ #if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS) \
68584+ && !defined(WOLFSSL_NO_TLS12)
68585+ WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL;
68586+ WOLFSSL *ssl_c = NULL, *ssl_s = NULL;
68587+ struct test_memio_ctx test_ctx;
68588+
68589+ XMEMSET(&test_ctx, 0, sizeof(test_ctx));
68590+
68591+ ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s,
68592+ wolfDTLSv1_2_client_method, wolfDTLS_server_method), 0);
68593+
68594+ /* CH1 */
68595+ ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1);
68596+ ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ);
68597+ ExpectIntEQ(test_dtls_seq_num_downgrade_check_num(test_ctx.s_buff,
68598+ test_ctx.s_len, 0), TEST_SUCCESS);
68599+ /* HVR */
68600+ ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1);
68601+ ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ);
68602+ ExpectIntEQ(test_dtls_seq_num_downgrade_check_num(test_ctx.c_buff,
68603+ test_ctx.c_len, 0), TEST_SUCCESS);
68604+ /* CH2 */
68605+ ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1);
68606+ ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ);
68607+ ExpectIntEQ(test_dtls_seq_num_downgrade_check_num(test_ctx.s_buff,
68608+ test_ctx.s_len, 1), TEST_SUCCESS);
68609+ /* Server first flight */
68610+ ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1);
68611+ ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ);
68612+ ExpectIntEQ(test_dtls_seq_num_downgrade_check_num(test_ctx.c_buff,
68613+ test_ctx.c_len, 1), TEST_SUCCESS);
68614+
68615+ ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0);
68616+
68617+ wolfSSL_free(ssl_c);
68618+ wolfSSL_CTX_free(ctx_c);
68619+ wolfSSL_free(ssl_s);
68620+ wolfSSL_CTX_free(ctx_s);
68621+ #endif
68622+ return EXPECT_RESULT();
68623+ }
68624+
6855068625/**
6855168626 * Make sure we don't send RSA Signature Hash Algorithms in the
6855268627 * CertificateRequest when we don't have any such ciphers set.
@@ -70789,6 +70864,7 @@ TEST_CASE testCases[] = {
7078970864 TEST_DECL(test_dtls_client_hello_timeout_downgrade),
7079070865 TEST_DECL(test_dtls_client_hello_timeout),
7079170866 TEST_DECL(test_dtls_dropped_ccs),
70867+ TEST_DECL(test_dtls_seq_num_downgrade),
7079270868 TEST_DECL(test_certreq_sighash_algos),
7079370869 TEST_DECL(test_revoked_loaded_int_cert),
7079470870 TEST_DECL(test_dtls_frag_ch),
0 commit comments