diff --git a/docs/architecture/testing/invasive-testing.md b/docs/architecture/testing/invasive-testing.md
index 464f761..bf8d631 100644
--- a/docs/architecture/testing/invasive-testing.md
+++ b/docs/architecture/testing/invasive-testing.md
@@ -275,7 +275,7 @@
 
 Goal: test that `mbedtls_platform_zeroize` does wipe the memory buffer.
 
-Solution ([debugger](#debugger-based-testing)): implemented in `tests/scripts/test_zeroize.gdb`.
+Solution ([debugger](#debugger-based-testing)): implemented in `framework/tests/programs/test_zeroize.gdb`.
 
 Rationale: this cannot be tested by adding C code, because the danger is that the compiler optimizes the zeroization away, and any C code that observes the zeroization would cause the compiler not to optimize it away.
 
diff --git a/framework b/framework
index 9c2eb75..523a12d 160000
--- a/framework
+++ b/framework
@@ -1 +1 @@
-Subproject commit 9c2eb756ca8c8edbbc100ac2530c3066833952a7
+Subproject commit 523a12d05b91301b020e2aa560d9774135e3a801
diff --git a/programs/.gitignore b/programs/.gitignore
index c3e61c1..939e405 100644
--- a/programs/.gitignore
+++ b/programs/.gitignore
@@ -46,7 +46,6 @@
 ssl/ssl_pthread_server
 ssl/ssl_server
 ssl/ssl_server2
-test/benchmark
 test/cpp_dummy_build
 test/cpp_dummy_build.cpp
 test/dlopen
diff --git a/programs/Makefile b/programs/Makefile
index c177c28..79bb402 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -1,4 +1,5 @@
 MBEDTLS_TEST_PATH = ../tests
+FRAMEWORK = ${MBEDTLS_PATH}/framework
 include ../scripts/common.make
 
 ifeq ($(shell uname -s),Linux)
@@ -24,6 +25,8 @@
 BUILD_DLOPEN =
 endif
 
+LOCAL_CFLAGS += -I$(FRAMEWORK)/tests/programs
+
 ## The following assignment is the list of base names of applications that
 ## will be built on Windows. Extra Linux/Unix/POSIX-only applications can
 ## be declared by appending with `APPS += ...` afterwards.
@@ -76,7 +79,6 @@
 	ssl/ssl_mail_client \
 	ssl/ssl_server \
 	ssl/ssl_server2 \
-	test/benchmark \
 	test/metatest \
 	test/query_compile_time_config \
 	test/query_included_headers \
@@ -301,7 +303,7 @@
 
 SSL_TEST_OBJECTS = test/query_config.o ssl/ssl_test_lib.o
 SSL_TEST_DEPS = $(SSL_TEST_OBJECTS) \
-		test/query_config.h \
+		$(FRAMEWORK)/tests/programs/query_config.h \
 		ssl/ssl_test_lib.h \
 		ssl/ssl_test_common_source.c \
 		$(DEP)
@@ -322,7 +324,7 @@
 	echo "  CC    ssl/ssl_server2.c"
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_server2.c $(SSL_TEST_OBJECTS) $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
-ssl/ssl_context_info$(EXEXT): ssl/ssl_context_info.c test/query_config.o test/query_config.h $(DEP)
+ssl/ssl_context_info$(EXEXT): ssl/ssl_context_info.c test/query_config.o $(FRAMEWORK)/tests/programs/query_config.h $(DEP)
 	echo "  CC    ssl/ssl_context_info.c"
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_context_info.c test/query_config.o $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
@@ -342,10 +344,6 @@
 	echo "  CC    ssl/mini_client.c"
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/mini_client.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
-test/benchmark$(EXEXT): test/benchmark.c $(DEP)
-	echo "  CC    test/benchmark.c"
-	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/benchmark.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
-
 test/cpp_dummy_build.cpp: test/generate_cpp_dummy_build.sh
 	echo "  Gen   test/cpp_dummy_build.cpp"
 	test/generate_cpp_dummy_build.sh
@@ -363,17 +361,17 @@
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/dlopen.c $(LDFLAGS) $(DLOPEN_LDFLAGS) -o $@
 endif
 
-test/metatest$(EXEXT): test/metatest.c $(DEP)
-	echo "  CC    test/metatest.c"
-	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) -I../library -I../tf-psa-crypto/core test/metatest.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
+test/metatest$(EXEXT): $(FRAMEWORK)/tests/programs/metatest.c $(DEP)
+	echo "  CC    $(FRAMEWORK)/tests/programs/metatest.c"
+	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) -I../library -I../tf-psa-crypto/core $(FRAMEWORK)/tests/programs/metatest.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
-test/query_config.o: test/query_config.c test/query_config.h $(DEP)
+test/query_config.o: test/query_config.c $(FRAMEWORK)/tests/programs/query_config.h $(DEP)
 	echo "  CC    test/query_config.c"
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) -c test/query_config.c -o $@
 
-test/query_included_headers$(EXEXT): test/query_included_headers.c $(DEP)
-	echo "  CC    test/query_included_headers.c"
-	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/query_included_headers.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
+test/query_included_headers$(EXEXT): $(FRAMEWORK)/tests/programs/query_included_headers.c $(DEP)
+	echo "  CC    $(FRAMEWORK)/tests/programs/query_included_headers.c"
+	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $(FRAMEWORK)/tests/programs/query_included_headers.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
 test/selftest$(EXEXT): test/selftest.c $(DEP)
 	echo "  CC    test/selftest.c"
@@ -383,13 +381,13 @@
 	echo "  CC    test/udp_proxy.c"
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/udp_proxy.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
-test/zeroize$(EXEXT): test/zeroize.c $(DEP)
-	echo "  CC    test/zeroize.c"
-	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/zeroize.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
+test/zeroize$(EXEXT): $(FRAMEWORK)/tests/programs/zeroize.c $(DEP)
+	echo "  CC    $(FRAMEWORK)/tests/programs/zeroize.c"
+	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $(FRAMEWORK)/tests/programs/zeroize.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
-test/query_compile_time_config$(EXEXT): test/query_compile_time_config.c test/query_config.o test/query_config.h $(DEP)
-	echo "  CC    test/query_compile_time_config.c"
-	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/query_compile_time_config.c test/query_config.o $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
+test/query_compile_time_config$(EXEXT): $(FRAMEWORK)/tests/programs/query_compile_time_config.c test/query_config.o $(FRAMEWORK)/tests/programs/query_config.h $(DEP)
+	echo "  CC    $(FRAMEWORK)/tests/programs/query_compile_time_config.c"
+	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $(FRAMEWORK)/tests/programs/query_compile_time_config.c test/query_config.o $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
 util/pem2der$(EXEXT): util/pem2der.c $(DEP)
 	echo "  CC    util/pem2der.c"
diff --git a/programs/README.md b/programs/README.md
index f53bde5..5e5f40a 100644
--- a/programs/README.md
+++ b/programs/README.md
@@ -53,7 +53,7 @@
 
 ## Random number generator (RNG) examples
 
-* [`random/gen_entropy.c`](random/gen_entropy.c): shows how to use the default entropy sources to generate random data.  
+* [`random/gen_entropy.c`](random/gen_entropy.c): shows how to use the default entropy sources to generate random data.
   Note: most applications should only use the entropy generator to seed a cryptographic pseudorandom generator, as illustrated by `random/gen_random_ctr_drbg.c`.
 
 * [`random/gen_random_ctr_drbg.c`](random/gen_random_ctr_drbg.c): shows how to use the default entropy sources to seed a pseudorandom generator, and how to use the resulting random generator to generate random data.
@@ -90,13 +90,11 @@
 
 ## Test utilities
 
-* [`test/benchmark.c`](test/benchmark.c): benchmark for cryptographic algorithms.
-
 * [`test/selftest.c`](test/selftest.c): runs the self-test function in each library module.
 
 * [`test/udp_proxy.c`](test/udp_proxy.c): a UDP proxy that can inject certain failures (delay, duplicate, drop). Useful for testing DTLS.
 
-* [`test/zeroize.c`](test/zeroize.c): a test program for `mbedtls_platform_zeroize`, used by [`tests/scripts/test_zeroize.gdb`](tests/scripts/test_zeroize.gdb).
+* [`test/zeroize.c`](../framework/tests/programs/zeroize.c): a test program for `mbedtls_platform_zeroize`, used by [`test_zeroize.gdb`](../framework/tests/programs/test_zeroize.gdb).
 
 ## Development utilities
 
@@ -115,4 +113,3 @@
 * [`x509/crl_app.c`](x509/crl_app.c): loads and dumps a certificate revocation list (CRL).
 
 * [`x509/req_app.c`](x509/req_app.c): loads and dumps a certificate signing request (CSR).
-
diff --git a/programs/demo_common.sh b/programs/demo_common.sh
deleted file mode 100644
index d8fcda5..0000000
--- a/programs/demo_common.sh
+++ /dev/null
@@ -1,137 +0,0 @@
-## Common shell functions used by demo scripts programs/*/*.sh.
-
-## How to write a demo script
-## ==========================
-##
-## Include this file near the top of each demo script:
-##   . "${0%/*}/../demo_common.sh"
-##
-## Start with a "msg" call that explains the purpose of the script.
-## Then call the "depends_on" function to ensure that all config
-## dependencies are met.
-##
-## As the last thing in the script, call the cleanup function.
-##
-## You can use the functions and variables described below.
-
-set -e -u
-
-## $root_dir is the root directory of the Mbed TLS source tree.
-root_dir="${0%/*}"
-# Find a nice path to the root directory, avoiding unnecessary "../".
-# The code supports demo scripts nested up to 4 levels deep.
-# The code works no matter where the demo script is relative to the current
-# directory, even if it is called with a relative path.
-n=4 # limit the search depth
-while ! [ -d "$root_dir/programs" ] || ! [ -d "$root_dir/library" ]; do
-  if [ $n -eq 0 ]; then
-    echo >&2 "This doesn't seem to be an Mbed TLS source tree."
-    exit 125
-  fi
-  n=$((n - 1))
-  case $root_dir in
-    .) root_dir="..";;
-    ..|?*/..) root_dir="$root_dir/..";;
-    ?*/*) root_dir="${root_dir%/*}";;
-    /*) root_dir="/";;
-    *) root_dir=".";;
-  esac
-done
-
-## $programs_dir is the directory containing the sample programs.
-# Assume an in-tree build.
-programs_dir="$root_dir/programs"
-
-## msg LINE...
-## msg <TEXT_ORIGIN
-## Display an informational message.
-msg () {
-  if [ $# -eq 0 ]; then
-    sed 's/^/# /'
-  else
-    for x in "$@"; do
-      echo "# $x"
-    done
-  fi
-}
-
-## run "Message" COMMAND ARGUMENT...
-## Display the message, then run COMMAND with the specified arguments.
-run () {
-    echo
-    echo "# $1"
-    shift
-    echo "+ $*"
-    "$@"
-}
-
-## Like '!', but stop on failure with 'set -e'
-not () {
-  if "$@"; then false; fi
-}
-
-## run_bad "Message" COMMAND ARGUMENT...
-## Like run, but the command is expected to fail.
-run_bad () {
-  echo
-  echo "$1 This must fail."
-  shift
-  echo "+ ! $*"
-  not "$@"
-}
-
-## config_has SYMBOL...
-## Succeeds if the library configuration has all SYMBOLs set.
-config_has () {
-  for x in "$@"; do
-    "$programs_dir/test/query_compile_time_config" "$x"
-  done
-}
-
-## depends_on SYMBOL...
-## Exit if the library configuration does not have all SYMBOLs set.
-depends_on () {
-  m=
-  for x in "$@"; do
-    if ! config_has "$x"; then
-      m="$m $x"
-    fi
-  done
-  if [ -n "$m" ]; then
-    cat >&2 <<EOF
-$0: this demo requires the following
-configuration options to be enabled at compile time:
- $m
-EOF
-    # Exit with a success status so that this counts as a pass for run_demos.py.
-    exit
-  fi
-}
-
-## Add the names of files to clean up to this whitespace-separated variable.
-## The file names must not contain whitespace characters.
-files_to_clean=
-
-## Call this function at the end of each script.
-## It is called automatically if the script is killed by a signal.
-cleanup () {
-  rm -f -- $files_to_clean
-}
-
-
-
-################################################################
-## End of the public interfaces. Code beyond this point is not
-## meant to be called directly from a demo script.
-
-trap 'cleanup; trap - HUP; kill -HUP $$' HUP
-trap 'cleanup; trap - INT; kill -INT $$' INT
-trap 'cleanup; trap - TERM; kill -TERM $$' TERM
-
-if config_has MBEDTLS_ENTROPY_NV_SEED; then
-  # Create a seedfile that's sufficiently long in all library configurations.
-  # This is necessary for programs that use randomness.
-  # Assume that the name of the seedfile is the default name.
-  files_to_clean="$files_to_clean seedfile"
-  dd if=/dev/urandom of=seedfile ibs=64 obs=64 count=1
-fi
diff --git a/programs/ssl/CMakeLists.txt b/programs/ssl/CMakeLists.txt
index a27c626..65f65b9 100644
--- a/programs/ssl/CMakeLists.txt
+++ b/programs/ssl/CMakeLists.txt
@@ -35,7 +35,7 @@
     if(exe STREQUAL "ssl_client2" OR exe STREQUAL "ssl_server2")
         list(APPEND extra_sources
             ssl_test_lib.c
-            ${CMAKE_CURRENT_SOURCE_DIR}/../test/query_config.h
+            ${MBEDTLS_FRAMEWORK_DIR}/tests/programs/query_config.h
             ${CMAKE_CURRENT_BINARY_DIR}/../test/query_config.c)
     endif()
     add_executable(${exe}
@@ -45,14 +45,13 @@
         ${extra_sources})
     set_base_compile_options(${exe})
     target_link_libraries(${exe} ${libs} ${CMAKE_THREAD_LIBS_INIT})
-    target_include_directories(${exe} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../framework/tests/include
+    target_include_directories(${exe} PRIVATE ${MBEDTLS_FRAMEWORK_DIR}/tests/programs
+                                              ${MBEDTLS_FRAMEWORK_DIR}/tests/include
                                               ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/include)
     if(exe STREQUAL "ssl_client2" OR exe STREQUAL "ssl_server2")
         if(GEN_FILES)
             add_dependencies(${exe} generate_query_config_c)
         endif()
-        target_include_directories(${exe}
-            PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../test)
     endif()
 endforeach()
 
@@ -62,7 +61,8 @@
         $<TARGET_OBJECTS:mbedtls_test>
         $<TARGET_OBJECTS:mbedtls_test_helpers>)
     set_base_compile_options(ssl_pthread_server)
-    target_include_directories(ssl_pthread_server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../framework/tests/include
+    target_include_directories(ssl_pthread_server PRIVATE ${MBEDTLS_FRAMEWORK_DIR}/tests/programs
+                                                          ${MBEDTLS_FRAMEWORK_DIR}/tests/include
                                                           ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/include)
     target_link_libraries(ssl_pthread_server ${libs} ${CMAKE_THREAD_LIBS_INIT})
     list(APPEND executables ssl_pthread_server)
diff --git a/programs/ssl/ssl_test_lib.h b/programs/ssl/ssl_test_lib.h
index a8387d7..6fc3d73 100644
--- a/programs/ssl/ssl_test_lib.h
+++ b/programs/ssl/ssl_test_lib.h
@@ -66,7 +66,7 @@
 
 #include <test/helpers.h>
 
-#include "../test/query_config.h"
+#include "query_config.h"
 
 #define ALPN_LIST_SIZE    10
 #define GROUP_LIST_SIZE   25
diff --git a/programs/test/CMakeLists.txt b/programs/test/CMakeLists.txt
index dec1e8c..089f8a6 100644
--- a/programs/test/CMakeLists.txt
+++ b/programs/test/CMakeLists.txt
@@ -13,7 +13,6 @@
 add_dependencies(${ssl_opt_target} udp_proxy)
 
 set(executables_mbedcrypto
-    benchmark
     zeroize
 )
 add_dependencies(${programs_target} ${executables_mbedcrypto})
@@ -76,17 +75,24 @@
 endif()
 
 foreach(exe IN LISTS executables_libs executables_mbedcrypto)
+    set(source ${exe}.c)
     set(extra_sources "")
+    if(NOT EXISTS ${source} AND
+       EXISTS ${MBEDTLS_FRAMEWORK_DIR}/tests/programs/${source})
+         set(source ${MBEDTLS_FRAMEWORK_DIR}/tests/programs/${source})
+    endif()
+
     if(exe STREQUAL "query_compile_time_config")
         list(APPEND extra_sources
-            ${CMAKE_CURRENT_SOURCE_DIR}/query_config.h
+            ${MBEDTLS_FRAMEWORK_DIR}/tests/programs/query_config.h
             ${CMAKE_CURRENT_BINARY_DIR}/query_config.c)
     endif()
-    add_executable(${exe} ${exe}.c $<TARGET_OBJECTS:mbedtls_test>
+    add_executable(${exe} ${source} $<TARGET_OBJECTS:mbedtls_test>
         ${extra_sources})
     set_base_compile_options(${exe})
     target_include_directories(${exe}
-        PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../framework/tests/include)
+        PRIVATE ${MBEDTLS_FRAMEWORK_DIR}/tests/include
+                ${MBEDTLS_FRAMEWORK_DIR}/tests/programs)
     target_include_directories(${exe}
         PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../library
                 ${CMAKE_CURRENT_SOURCE_DIR}/../../tf-psa-crypto/core)
diff --git a/programs/test/benchmark.c b/programs/test/benchmark.c
deleted file mode 100644
index c878e34..0000000
--- a/programs/test/benchmark.c
+++ /dev/null
@@ -1,1272 +0,0 @@
-/*
- *  Benchmark demonstration program
- *
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#include "mbedtls/build_info.h"
-
-#include "mbedtls/platform.h"
-
-#if !defined(MBEDTLS_HAVE_TIME)
-int main(void)
-{
-    mbedtls_printf("MBEDTLS_HAVE_TIME not defined.\n");
-    mbedtls_exit(0);
-}
-#else
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "mbedtls/md5.h"
-#include "mbedtls/ripemd160.h"
-#include "mbedtls/sha1.h"
-#include "mbedtls/sha256.h"
-#include "mbedtls/sha512.h"
-#include "mbedtls/sha3.h"
-
-#include "mbedtls/des.h"
-#include "mbedtls/aes.h"
-#include "mbedtls/aria.h"
-#include "mbedtls/camellia.h"
-#include "mbedtls/chacha20.h"
-#include "mbedtls/gcm.h"
-#include "mbedtls/ccm.h"
-#include "mbedtls/chachapoly.h"
-#include "mbedtls/cmac.h"
-#include "mbedtls/poly1305.h"
-
-#include "mbedtls/ctr_drbg.h"
-#include "mbedtls/hmac_drbg.h"
-
-#include "mbedtls/rsa.h"
-#include "mbedtls/dhm.h"
-#include "mbedtls/ecdsa.h"
-#include "mbedtls/ecdh.h"
-
-#include "mbedtls/error_common.h"
-
-/* *INDENT-OFF* */
-#ifndef asm
-#define asm __asm
-#endif
-/* *INDENT-ON* */
-
-#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
-
-#include <windows.h>
-#include <process.h>
-
-struct _hr_time {
-    LARGE_INTEGER start;
-};
-
-#else
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <signal.h>
-#include <time.h>
-
-struct _hr_time {
-    struct timeval start;
-};
-
-#endif /* _WIN32 && !EFIX64 && !EFI32 */
-
-#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
-#include "mbedtls/memory_buffer_alloc.h"
-#endif
-
-#ifdef MBEDTLS_TIMING_ALT
-void mbedtls_set_alarm(int seconds);
-unsigned long mbedtls_timing_hardclock(void);
-extern volatile int mbedtls_timing_alarmed;
-#else
-static void mbedtls_set_alarm(int seconds);
-static unsigned long mbedtls_timing_hardclock(void);
-#endif
-
-/*
- * For heap usage estimates, we need an estimate of the overhead per allocated
- * block. ptmalloc2/3 (used in gnu libc for instance) uses 2 size_t per block,
- * so use that as our baseline.
- */
-#define MEM_BLOCK_OVERHEAD  (2 * sizeof(size_t))
-
-/*
- * Size to use for the alloc buffer if MEMORY_BUFFER_ALLOC_C is defined.
- */
-#define HEAP_SIZE       (1u << 16)  /* 64k */
-
-#define BUFSIZE         1024
-#define HEADER_FORMAT   "  %-24s :  "
-#define TITLE_LEN       25
-
-#define OPTIONS                                                              \
-    "md5, ripemd160, sha1, sha256, sha512,\n"                                \
-    "sha3_224, sha3_256, sha3_384, sha3_512,\n"                              \
-    "des3, des, camellia, chacha20,\n"                                       \
-    "aes_cbc, aes_cfb128, aes_cfb8, aes_gcm, aes_ccm, aes_xts, chachapoly\n" \
-    "aes_cmac, des3_cmac, poly1305\n"                                        \
-    "ctr_drbg, hmac_drbg\n"                                                  \
-    "rsa, dhm, ecdsa, ecdh.\n"
-
-#if defined(MBEDTLS_ERROR_C)
-#define PRINT_ERROR                                                     \
-    mbedtls_printf("Error code: %d", ret);
-/* mbedtls_strerror(ret, (char *) tmp, sizeof(tmp));          \
-   mbedtls_printf("FAILED: %s\n", tmp); */
-#else
-#define PRINT_ERROR                                                     \
-    mbedtls_printf("FAILED: -0x%04x\n", (unsigned int) -ret);
-#endif
-
-#define TIME_AND_TSC(TITLE, CODE)                                     \
-    do {                                                                    \
-        unsigned long ii, jj, tsc;                                          \
-        int ret = 0;                                                        \
-                                                                        \
-        mbedtls_printf(HEADER_FORMAT, TITLE);                             \
-        fflush(stdout);                                                   \
-                                                                        \
-        mbedtls_set_alarm(1);                                             \
-        for (ii = 1; ret == 0 && !mbedtls_timing_alarmed; ii++)           \
-        {                                                                   \
-            ret = CODE;                                                     \
-        }                                                                   \
-                                                                        \
-        tsc = mbedtls_timing_hardclock();                                   \
-        for (jj = 0; ret == 0 && jj < 1024; jj++)                          \
-        {                                                                   \
-            ret = CODE;                                                     \
-        }                                                                   \
-                                                                        \
-        if (ret != 0)                                                      \
-        {                                                                   \
-            PRINT_ERROR;                                                    \
-        }                                                                   \
-        else                                                                \
-        {                                                                   \
-            mbedtls_printf("%9lu KiB/s,  %9lu cycles/byte\n",              \
-                           ii * BUFSIZE / 1024,                           \
-                           (mbedtls_timing_hardclock() - tsc)           \
-                           / (jj * BUFSIZE));                          \
-        }                                                                   \
-    } while (0)
-
-#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_MEMORY_DEBUG)
-
-/* How much space to reserve for the title when printing heap usage results.
- * Updated manually as the output of the following command:
- *
- *  sed -n 's/.*[T]IME_PUBLIC.*"\(.*\)",/\1/p' programs/test/benchmark.c |
- *      awk '{print length+3}' | sort -rn | head -n1
- *
- * This computes the maximum length of a title +3, because we appends "/s" and
- * want at least one space. (If the value is too small, the only consequence
- * is poor alignment.) */
-#define TITLE_SPACE 17
-
-#define MEMORY_MEASURE_INIT                                             \
-    size_t max_used, max_blocks, max_bytes;                             \
-    size_t prv_used, prv_blocks;                                        \
-    size_t alloc_cnt, free_cnt, prv_alloc, prv_free;                    \
-    mbedtls_memory_buffer_alloc_cur_get(&prv_used, &prv_blocks);      \
-    mbedtls_memory_buffer_alloc_max_reset();
-
-#define MEMORY_MEASURE_RESET                                            \
-    mbedtls_memory_buffer_alloc_count_get(&prv_alloc, &prv_free);
-
-#define MEMORY_MEASURE_PRINT(title_len)                               \
-    mbedtls_memory_buffer_alloc_max_get(&max_used, &max_blocks);      \
-    mbedtls_memory_buffer_alloc_count_get(&alloc_cnt, &free_cnt);     \
-    ii = TITLE_SPACE > (title_len) ? TITLE_SPACE - (title_len) : 1;     \
-    while (ii--) mbedtls_printf(" ");                                \
-    max_used -= prv_used;                                               \
-    max_blocks -= prv_blocks;                                           \
-    max_bytes = max_used + MEM_BLOCK_OVERHEAD * max_blocks;             \
-    mbedtls_printf("%6u heap bytes, %6u allocs",                       \
-                   (unsigned) max_bytes,                               \
-                   (unsigned) (alloc_cnt - prv_alloc));
-
-#else
-#define MEMORY_MEASURE_INIT
-#define MEMORY_MEASURE_RESET
-#define MEMORY_MEASURE_PRINT(title_len)
-#endif
-
-#define TIME_PUBLIC(TITLE, TYPE, CODE)                                \
-    do {                                                                    \
-        unsigned long ii;                                                   \
-        int ret;                                                            \
-        MEMORY_MEASURE_INIT;                                                \
-                                                                        \
-        mbedtls_printf(HEADER_FORMAT, TITLE);                             \
-        fflush(stdout);                                                   \
-        mbedtls_set_alarm(3);                                             \
-                                                                        \
-        ret = 0;                                                            \
-        for (ii = 1; !mbedtls_timing_alarmed && !ret; ii++)             \
-        {                                                                   \
-            MEMORY_MEASURE_RESET;                                           \
-            CODE;                                                           \
-        }                                                                   \
-                                                                        \
-        if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED)               \
-        {                                                                   \
-            mbedtls_printf("Feature Not Supported. Skipping.\n");         \
-            ret = 0;                                                        \
-        }                                                                   \
-        else if (ret != 0)                                                 \
-        {                                                                   \
-            PRINT_ERROR;                                                    \
-        }                                                                   \
-        else                                                                \
-        {                                                                   \
-            mbedtls_printf("%6lu " TYPE "/s", ii / 3);                    \
-            MEMORY_MEASURE_PRINT(sizeof(TYPE) + 1);                     \
-            mbedtls_printf("\n");                                         \
-        }                                                                   \
-    } while (0)
-
-#if !defined(MBEDTLS_TIMING_ALT)
-#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \
-    (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
-
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    unsigned long tsc;
-    __asm   rdtsc
-    __asm   mov[tsc], eax
-    return tsc;
-}
-#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
-          ( _MSC_VER && _M_IX86 ) || __WATCOMC__ */
-
-/* some versions of mingw-64 have 32-bit longs even on x84_64 */
-#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \
-    defined(__GNUC__) && (defined(__i386__) || (                       \
-    (defined(__amd64__) || defined(__x86_64__)) && __SIZEOF_LONG__ == 4))
-
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    unsigned long lo, hi;
-    asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
-    return lo;
-}
-#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
-          __GNUC__ && __i386__ */
-
-#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \
-    defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__))
-
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    unsigned long lo, hi;
-    asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
-    return lo | (hi << 32);
-}
-#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
-          __GNUC__ && ( __amd64__ || __x86_64__ ) */
-
-#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \
-    defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
-
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    unsigned long tbl, tbu0, tbu1;
-
-    do {
-        asm volatile ("mftbu %0" : "=r" (tbu0));
-        asm volatile ("mftb  %0" : "=r" (tbl));
-        asm volatile ("mftbu %0" : "=r" (tbu1));
-    } while (tbu0 != tbu1);
-
-    return tbl;
-}
-#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
-          __GNUC__ && ( __powerpc__ || __ppc__ ) */
-
-#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \
-    defined(__GNUC__) && defined(__sparc64__)
-
-#if defined(__OpenBSD__)
-#warning OpenBSD does not allow access to tick register using software version instead
-#else
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    unsigned long tick;
-    asm volatile ("rdpr %%tick, %0;" : "=&r" (tick));
-    return tick;
-}
-#endif /* __OpenBSD__ */
-#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
-          __GNUC__ && __sparc64__ */
-
-#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \
-    defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__)
-
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    unsigned long tick;
-    asm volatile (".byte 0x83, 0x41, 0x00, 0x00");
-    asm volatile ("mov   %%g1, %0" : "=r" (tick));
-    return tick;
-}
-#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
-          __GNUC__ && __sparc__ && !__sparc64__ */
-
-#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&      \
-    defined(__GNUC__) && defined(__alpha__)
-
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    unsigned long cc;
-    asm volatile ("rpcc %0" : "=r" (cc));
-    return cc & 0xFFFFFFFF;
-}
-#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
-          __GNUC__ && __alpha__ */
-
-#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&      \
-    defined(__GNUC__) && defined(__ia64__)
-
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    unsigned long itc;
-    asm volatile ("mov %0 = ar.itc" : "=r" (itc));
-    return itc;
-}
-#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
-          __GNUC__ && __ia64__ */
-
-#if !defined(HAVE_HARDCLOCK) && defined(_WIN32) && \
-    !defined(EFIX64) && !defined(EFI32)
-
-#define HAVE_HARDCLOCK
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    LARGE_INTEGER offset;
-
-    QueryPerformanceCounter(&offset);
-
-    return (unsigned long) (offset.QuadPart);
-}
-#endif /* !HAVE_HARDCLOCK && _WIN32 && !EFIX64 && !EFI32 */
-
-#if !defined(HAVE_HARDCLOCK)
-
-#define HAVE_HARDCLOCK
-
-static int hardclock_init = 0;
-static struct timeval tv_init;
-
-static unsigned long mbedtls_timing_hardclock(void)
-{
-    struct timeval tv_cur;
-
-    if (hardclock_init == 0) {
-        gettimeofday(&tv_init, NULL);
-        hardclock_init = 1;
-    }
-
-    gettimeofday(&tv_cur, NULL);
-    return (tv_cur.tv_sec  - tv_init.tv_sec) * 1000000U
-           + (tv_cur.tv_usec - tv_init.tv_usec);
-}
-#endif /* !HAVE_HARDCLOCK */
-
-volatile int mbedtls_timing_alarmed = 0;
-
-#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
-
-/* It's OK to use a global because alarm() is supposed to be global anyway */
-static DWORD alarmMs;
-
-static void TimerProc(void *TimerContext)
-{
-    (void) TimerContext;
-    Sleep(alarmMs);
-    mbedtls_timing_alarmed = 1;
-    /* _endthread will be called implicitly on return
-     * That ensures execution of thread function's epilogue */
-}
-
-static void mbedtls_set_alarm(int seconds)
-{
-    if (seconds == 0) {
-        /* No need to create a thread for this simple case.
-         * Also, this shorcut is more reliable at least on MinGW32 */
-        mbedtls_timing_alarmed = 1;
-        return;
-    }
-
-    mbedtls_timing_alarmed = 0;
-    alarmMs = seconds * 1000;
-    (void) _beginthread(TimerProc, 0, NULL);
-}
-
-#else /* _WIN32 && !EFIX64 && !EFI32 */
-
-static void sighandler(int signum)
-{
-    mbedtls_timing_alarmed = 1;
-    signal(signum, sighandler);
-}
-
-static void mbedtls_set_alarm(int seconds)
-{
-    mbedtls_timing_alarmed = 0;
-    signal(SIGALRM, sighandler);
-    alarm(seconds);
-    if (seconds == 0) {
-        /* alarm(0) cancelled any previous pending alarm, but the
-           handler won't fire, so raise the flag straight away. */
-        mbedtls_timing_alarmed = 1;
-    }
-}
-
-#endif /* _WIN32 && !EFIX64 && !EFI32 */
-#endif /* !MBEDTLS_TIMING_ALT */
-
-static int myrand(void *rng_state, unsigned char *output, size_t len)
-{
-    size_t use_len;
-    int rnd;
-
-    if (rng_state != NULL) {
-        rng_state  = NULL;
-    }
-
-    while (len > 0) {
-        use_len = len;
-        if (use_len > sizeof(int)) {
-            use_len = sizeof(int);
-        }
-
-        rnd = rand();
-        memcpy(output, &rnd, use_len);
-        output += use_len;
-        len -= use_len;
-    }
-
-    return 0;
-}
-
-#define CHECK_AND_CONTINUE(R)                                         \
-    {                                                                   \
-        int CHECK_AND_CONTINUE_ret = (R);                             \
-        if (CHECK_AND_CONTINUE_ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED) { \
-            mbedtls_printf("Feature not supported. Skipping.\n");     \
-            continue;                                                   \
-        }                                                               \
-        else if (CHECK_AND_CONTINUE_ret != 0) {                        \
-            mbedtls_exit(1);                                          \
-        }                                                               \
-    }
-
-#if defined(MBEDTLS_ECP_C)
-static int set_ecp_curve(const char *string, mbedtls_ecp_curve_info *curve)
-{
-    const mbedtls_ecp_curve_info *found =
-        mbedtls_ecp_curve_info_from_name(string);
-    if (found != NULL) {
-        *curve = *found;
-        return 1;
-    } else {
-        return 0;
-    }
-}
-#endif
-
-unsigned char buf[BUFSIZE];
-
-typedef struct {
-    char md5, ripemd160, sha1, sha256, sha512,
-         sha3_224, sha3_256, sha3_384, sha3_512,
-         des3, des,
-         aes_cbc, aes_cfb128, aes_cfb8, aes_ctr, aes_gcm, aes_ccm, aes_xts, chachapoly,
-         aes_cmac, des3_cmac,
-         aria, camellia, chacha20,
-         poly1305,
-         ctr_drbg, hmac_drbg,
-         rsa, dhm, ecdsa, ecdh;
-} todo_list;
-
-
-int main(int argc, char *argv[])
-{
-    int i;
-    unsigned char tmp[200];
-    char title[TITLE_LEN];
-    todo_list todo;
-#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
-    unsigned char alloc_buf[HEAP_SIZE] = { 0 };
-#endif
-#if defined(MBEDTLS_ECP_C)
-    mbedtls_ecp_curve_info single_curve[2] = {
-        { MBEDTLS_ECP_DP_NONE, 0, 0, NULL },
-        { MBEDTLS_ECP_DP_NONE, 0, 0, NULL },
-    };
-    const mbedtls_ecp_curve_info *curve_list = mbedtls_ecp_curve_list();
-#endif
-
-#if defined(MBEDTLS_ECP_C)
-    (void) curve_list; /* Unused in some configurations where no benchmark uses ECC */
-#endif
-
-    if (argc <= 1) {
-        memset(&todo, 1, sizeof(todo));
-    } else {
-        memset(&todo, 0, sizeof(todo));
-
-        for (i = 1; i < argc; i++) {
-            if (strcmp(argv[i], "md5") == 0) {
-                todo.md5 = 1;
-            } else if (strcmp(argv[i], "ripemd160") == 0) {
-                todo.ripemd160 = 1;
-            } else if (strcmp(argv[i], "sha1") == 0) {
-                todo.sha1 = 1;
-            } else if (strcmp(argv[i], "sha256") == 0) {
-                todo.sha256 = 1;
-            } else if (strcmp(argv[i], "sha512") == 0) {
-                todo.sha512 = 1;
-            } else if (strcmp(argv[i], "sha3_224") == 0) {
-                todo.sha3_224 = 1;
-            } else if (strcmp(argv[i], "sha3_256") == 0) {
-                todo.sha3_256 = 1;
-            } else if (strcmp(argv[i], "sha3_384") == 0) {
-                todo.sha3_384 = 1;
-            } else if (strcmp(argv[i], "sha3_512") == 0) {
-                todo.sha3_512 = 1;
-            } else if (strcmp(argv[i], "des3") == 0) {
-                todo.des3 = 1;
-            } else if (strcmp(argv[i], "des") == 0) {
-                todo.des = 1;
-            } else if (strcmp(argv[i], "aes_cbc") == 0) {
-                todo.aes_cbc = 1;
-            } else if (strcmp(argv[i], "aes_cfb128") == 0) {
-                todo.aes_cfb128 = 1;
-            } else if (strcmp(argv[i], "aes_cfb8") == 0) {
-                todo.aes_cfb8 = 1;
-            } else if (strcmp(argv[i], "aes_ctr") == 0) {
-                todo.aes_ctr = 1;
-            } else if (strcmp(argv[i], "aes_xts") == 0) {
-                todo.aes_xts = 1;
-            } else if (strcmp(argv[i], "aes_gcm") == 0) {
-                todo.aes_gcm = 1;
-            } else if (strcmp(argv[i], "aes_ccm") == 0) {
-                todo.aes_ccm = 1;
-            } else if (strcmp(argv[i], "chachapoly") == 0) {
-                todo.chachapoly = 1;
-            } else if (strcmp(argv[i], "aes_cmac") == 0) {
-                todo.aes_cmac = 1;
-            } else if (strcmp(argv[i], "des3_cmac") == 0) {
-                todo.des3_cmac = 1;
-            } else if (strcmp(argv[i], "aria") == 0) {
-                todo.aria = 1;
-            } else if (strcmp(argv[i], "camellia") == 0) {
-                todo.camellia = 1;
-            } else if (strcmp(argv[i], "chacha20") == 0) {
-                todo.chacha20 = 1;
-            } else if (strcmp(argv[i], "poly1305") == 0) {
-                todo.poly1305 = 1;
-            } else if (strcmp(argv[i], "ctr_drbg") == 0) {
-                todo.ctr_drbg = 1;
-            } else if (strcmp(argv[i], "hmac_drbg") == 0) {
-                todo.hmac_drbg = 1;
-            } else if (strcmp(argv[i], "rsa") == 0) {
-                todo.rsa = 1;
-            } else if (strcmp(argv[i], "dhm") == 0) {
-                todo.dhm = 1;
-            } else if (strcmp(argv[i], "ecdsa") == 0) {
-                todo.ecdsa = 1;
-            } else if (strcmp(argv[i], "ecdh") == 0) {
-                todo.ecdh = 1;
-            }
-#if defined(MBEDTLS_ECP_C)
-            else if (set_ecp_curve(argv[i], single_curve)) {
-                curve_list = single_curve;
-            }
-#endif
-            else {
-                mbedtls_printf("Unrecognized option: %s\n", argv[i]);
-                mbedtls_printf("Available options: " OPTIONS);
-            }
-        }
-    }
-
-    mbedtls_printf("\n");
-
-#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
-    mbedtls_memory_buffer_alloc_init(alloc_buf, sizeof(alloc_buf));
-#endif
-    memset(buf, 0xAA, sizeof(buf));
-    memset(tmp, 0xBB, sizeof(tmp));
-
-    /* Avoid "unused static function" warning in configurations without
-     * symmetric crypto. */
-    (void) mbedtls_timing_hardclock;
-
-#if defined(MBEDTLS_MD5_C)
-    if (todo.md5) {
-        TIME_AND_TSC("MD5", mbedtls_md5(buf, BUFSIZE, tmp));
-    }
-#endif
-
-#if defined(MBEDTLS_RIPEMD160_C)
-    if (todo.ripemd160) {
-        TIME_AND_TSC("RIPEMD160", mbedtls_ripemd160(buf, BUFSIZE, tmp));
-    }
-#endif
-
-#if defined(MBEDTLS_SHA1_C)
-    if (todo.sha1) {
-        TIME_AND_TSC("SHA-1", mbedtls_sha1(buf, BUFSIZE, tmp));
-    }
-#endif
-
-#if defined(MBEDTLS_SHA256_C)
-    if (todo.sha256) {
-        TIME_AND_TSC("SHA-256", mbedtls_sha256(buf, BUFSIZE, tmp, 0));
-    }
-#endif
-
-#if defined(MBEDTLS_SHA512_C)
-    if (todo.sha512) {
-        TIME_AND_TSC("SHA-512", mbedtls_sha512(buf, BUFSIZE, tmp, 0));
-    }
-#endif
-#if defined(MBEDTLS_SHA3_C)
-    if (todo.sha3_224) {
-        TIME_AND_TSC("SHA3-224", mbedtls_sha3(MBEDTLS_SHA3_224, buf, BUFSIZE, tmp, 28));
-    }
-    if (todo.sha3_256) {
-        TIME_AND_TSC("SHA3-256", mbedtls_sha3(MBEDTLS_SHA3_256, buf, BUFSIZE, tmp, 32));
-    }
-    if (todo.sha3_384) {
-        TIME_AND_TSC("SHA3-384", mbedtls_sha3(MBEDTLS_SHA3_384, buf, BUFSIZE, tmp, 48));
-    }
-    if (todo.sha3_512) {
-        TIME_AND_TSC("SHA3-512", mbedtls_sha3(MBEDTLS_SHA3_512, buf, BUFSIZE, tmp, 64));
-    }
-#endif
-
-#if defined(MBEDTLS_DES_C)
-#if defined(MBEDTLS_CIPHER_MODE_CBC)
-    if (todo.des3) {
-        mbedtls_des3_context des3;
-
-        mbedtls_des3_init(&des3);
-        if (mbedtls_des3_set3key_enc(&des3, tmp) != 0) {
-            mbedtls_exit(1);
-        }
-        TIME_AND_TSC("3DES",
-                     mbedtls_des3_crypt_cbc(&des3, MBEDTLS_DES_ENCRYPT, BUFSIZE, tmp, buf, buf));
-        mbedtls_des3_free(&des3);
-    }
-
-    if (todo.des) {
-        mbedtls_des_context des;
-
-        mbedtls_des_init(&des);
-        if (mbedtls_des_setkey_enc(&des, tmp) != 0) {
-            mbedtls_exit(1);
-        }
-        TIME_AND_TSC("DES",
-                     mbedtls_des_crypt_cbc(&des, MBEDTLS_DES_ENCRYPT, BUFSIZE, tmp, buf, buf));
-        mbedtls_des_free(&des);
-    }
-
-#endif /* MBEDTLS_CIPHER_MODE_CBC */
-#if defined(MBEDTLS_CMAC_C)
-    if (todo.des3_cmac) {
-        unsigned char output[8];
-        const mbedtls_cipher_info_t *cipher_info;
-
-        memset(buf, 0, sizeof(buf));
-        memset(tmp, 0, sizeof(tmp));
-
-        cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_DES_EDE3_ECB);
-
-        TIME_AND_TSC("3DES-CMAC",
-                     mbedtls_cipher_cmac(cipher_info, tmp, 192, buf,
-                                         BUFSIZE, output));
-    }
-#endif /* MBEDTLS_CMAC_C */
-#endif /* MBEDTLS_DES_C */
-
-#if defined(MBEDTLS_AES_C)
-#if defined(MBEDTLS_CIPHER_MODE_CBC)
-    if (todo.aes_cbc) {
-        int keysize;
-        mbedtls_aes_context aes;
-
-        mbedtls_aes_init(&aes);
-        for (keysize = 128; keysize <= 256; keysize += 64) {
-            mbedtls_snprintf(title, sizeof(title), "AES-CBC-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            CHECK_AND_CONTINUE(mbedtls_aes_setkey_enc(&aes, tmp, keysize));
-
-            TIME_AND_TSC(title,
-                         mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, BUFSIZE, tmp, buf, buf));
-        }
-        mbedtls_aes_free(&aes);
-    }
-#endif
-#if defined(MBEDTLS_CIPHER_MODE_CFB)
-    if (todo.aes_cfb128) {
-        int keysize;
-        size_t iv_off = 0;
-        mbedtls_aes_context aes;
-
-        mbedtls_aes_init(&aes);
-        for (keysize = 128; keysize <= 256; keysize += 64) {
-            mbedtls_snprintf(title, sizeof(title), "AES-CFB128-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            CHECK_AND_CONTINUE(mbedtls_aes_setkey_enc(&aes, tmp, keysize));
-
-            TIME_AND_TSC(title,
-                         mbedtls_aes_crypt_cfb128(&aes, MBEDTLS_AES_ENCRYPT, BUFSIZE,
-                                                  &iv_off, tmp, buf, buf));
-        }
-        mbedtls_aes_free(&aes);
-    }
-    if (todo.aes_cfb8) {
-        int keysize;
-        mbedtls_aes_context aes;
-
-        mbedtls_aes_init(&aes);
-        for (keysize = 128; keysize <= 256; keysize += 64) {
-            mbedtls_snprintf(title, sizeof(title), "AES-CFB8-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            CHECK_AND_CONTINUE(mbedtls_aes_setkey_enc(&aes, tmp, keysize));
-
-            TIME_AND_TSC(title,
-                         mbedtls_aes_crypt_cfb8(&aes, MBEDTLS_AES_ENCRYPT, BUFSIZE, tmp, buf, buf));
-        }
-        mbedtls_aes_free(&aes);
-    }
-#endif
-#if defined(MBEDTLS_CIPHER_MODE_CTR)
-    if (todo.aes_ctr) {
-        int keysize;
-        mbedtls_aes_context aes;
-
-        uint8_t stream_block[16];
-        size_t nc_off;
-
-        mbedtls_aes_init(&aes);
-        for (keysize = 128; keysize <= 256; keysize += 64) {
-            mbedtls_snprintf(title, sizeof(title), "AES-CTR-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            memset(stream_block, 0, sizeof(stream_block));
-            nc_off = 0;
-
-            CHECK_AND_CONTINUE(mbedtls_aes_setkey_enc(&aes, tmp, keysize));
-
-            TIME_AND_TSC(title, mbedtls_aes_crypt_ctr(&aes, BUFSIZE, &nc_off, tmp, stream_block,
-                                                      buf, buf));
-        }
-        mbedtls_aes_free(&aes);
-    }
-#endif
-#if defined(MBEDTLS_CIPHER_MODE_XTS)
-    if (todo.aes_xts) {
-        int keysize;
-        mbedtls_aes_xts_context ctx;
-
-        mbedtls_aes_xts_init(&ctx);
-        for (keysize = 128; keysize <= 256; keysize += 128) {
-            mbedtls_snprintf(title, sizeof(title), "AES-XTS-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            CHECK_AND_CONTINUE(mbedtls_aes_xts_setkey_enc(&ctx, tmp, keysize * 2));
-
-            TIME_AND_TSC(title,
-                         mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, BUFSIZE,
-                                               tmp, buf, buf));
-
-            mbedtls_aes_xts_free(&ctx);
-        }
-    }
-#endif
-#if defined(MBEDTLS_GCM_C)
-    if (todo.aes_gcm) {
-        int keysize;
-        mbedtls_gcm_context gcm;
-
-        mbedtls_gcm_init(&gcm);
-        for (keysize = 128; keysize <= 256; keysize += 64) {
-            mbedtls_snprintf(title, sizeof(title), "AES-GCM-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
-
-            TIME_AND_TSC(title,
-                         mbedtls_gcm_crypt_and_tag(&gcm, MBEDTLS_GCM_ENCRYPT, BUFSIZE, tmp,
-                                                   12, NULL, 0, buf, buf, 16, tmp));
-
-            mbedtls_gcm_free(&gcm);
-        }
-    }
-#endif
-#if defined(MBEDTLS_CCM_C)
-    if (todo.aes_ccm) {
-        int keysize;
-        mbedtls_ccm_context ccm;
-
-        mbedtls_ccm_init(&ccm);
-        for (keysize = 128; keysize <= 256; keysize += 64) {
-            mbedtls_snprintf(title, sizeof(title), "AES-CCM-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            mbedtls_ccm_setkey(&ccm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
-
-            TIME_AND_TSC(title,
-                         mbedtls_ccm_encrypt_and_tag(&ccm, BUFSIZE, tmp,
-                                                     12, NULL, 0, buf, buf, tmp, 16));
-
-            mbedtls_ccm_free(&ccm);
-        }
-    }
-#endif
-#if defined(MBEDTLS_CHACHAPOLY_C)
-    if (todo.chachapoly) {
-        mbedtls_chachapoly_context chachapoly;
-
-        mbedtls_chachapoly_init(&chachapoly);
-        memset(buf, 0, sizeof(buf));
-        memset(tmp, 0, sizeof(tmp));
-
-        mbedtls_snprintf(title, sizeof(title), "ChaCha20-Poly1305");
-
-        mbedtls_chachapoly_setkey(&chachapoly, tmp);
-
-        TIME_AND_TSC(title,
-                     mbedtls_chachapoly_encrypt_and_tag(&chachapoly,
-                                                        BUFSIZE, tmp, NULL, 0, buf, buf, tmp));
-
-        mbedtls_chachapoly_free(&chachapoly);
-    }
-#endif
-#if defined(MBEDTLS_CMAC_C)
-    if (todo.aes_cmac) {
-        unsigned char output[16];
-        const mbedtls_cipher_info_t *cipher_info;
-        mbedtls_cipher_type_t cipher_type;
-        int keysize;
-
-        for (keysize = 128, cipher_type = MBEDTLS_CIPHER_AES_128_ECB;
-             keysize <= 256;
-             keysize += 64, cipher_type++) {
-            mbedtls_snprintf(title, sizeof(title), "AES-CMAC-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-
-            cipher_info = mbedtls_cipher_info_from_type(cipher_type);
-
-            TIME_AND_TSC(title,
-                         mbedtls_cipher_cmac(cipher_info, tmp, keysize,
-                                             buf, BUFSIZE, output));
-        }
-
-        memset(buf, 0, sizeof(buf));
-        memset(tmp, 0, sizeof(tmp));
-        TIME_AND_TSC("AES-CMAC-PRF-128",
-                     mbedtls_aes_cmac_prf_128(tmp, 16, buf, BUFSIZE,
-                                              output));
-    }
-#endif /* MBEDTLS_CMAC_C */
-#endif /* MBEDTLS_AES_C */
-
-#if defined(MBEDTLS_ARIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
-    if (todo.aria) {
-        int keysize;
-        mbedtls_aria_context aria;
-
-        mbedtls_aria_init(&aria);
-        for (keysize = 128; keysize <= 256; keysize += 64) {
-            mbedtls_snprintf(title, sizeof(title), "ARIA-CBC-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            mbedtls_aria_setkey_enc(&aria, tmp, keysize);
-
-            TIME_AND_TSC(title,
-                         mbedtls_aria_crypt_cbc(&aria, MBEDTLS_ARIA_ENCRYPT,
-                                                BUFSIZE, tmp, buf, buf));
-        }
-        mbedtls_aria_free(&aria);
-    }
-#endif
-
-#if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
-    if (todo.camellia) {
-        int keysize;
-        mbedtls_camellia_context camellia;
-
-        mbedtls_camellia_init(&camellia);
-        for (keysize = 128; keysize <= 256; keysize += 64) {
-            mbedtls_snprintf(title, sizeof(title), "CAMELLIA-CBC-%d", keysize);
-
-            memset(buf, 0, sizeof(buf));
-            memset(tmp, 0, sizeof(tmp));
-            mbedtls_camellia_setkey_enc(&camellia, tmp, keysize);
-
-            TIME_AND_TSC(title,
-                         mbedtls_camellia_crypt_cbc(&camellia, MBEDTLS_CAMELLIA_ENCRYPT,
-                                                    BUFSIZE, tmp, buf, buf));
-        }
-        mbedtls_camellia_free(&camellia);
-    }
-#endif
-
-#if defined(MBEDTLS_CHACHA20_C)
-    if (todo.chacha20) {
-        TIME_AND_TSC("ChaCha20", mbedtls_chacha20_crypt(buf, buf, 0U, BUFSIZE, buf, buf));
-    }
-#endif
-
-#if defined(MBEDTLS_POLY1305_C)
-    if (todo.poly1305) {
-        TIME_AND_TSC("Poly1305", mbedtls_poly1305_mac(buf, buf, BUFSIZE, buf));
-    }
-#endif
-
-#if defined(MBEDTLS_CTR_DRBG_C)
-    if (todo.ctr_drbg) {
-        mbedtls_ctr_drbg_context ctr_drbg;
-
-        mbedtls_ctr_drbg_init(&ctr_drbg);
-        if (mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0) != 0) {
-            mbedtls_exit(1);
-        }
-        TIME_AND_TSC("CTR_DRBG (NOPR)",
-                     mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
-        mbedtls_ctr_drbg_free(&ctr_drbg);
-
-        mbedtls_ctr_drbg_init(&ctr_drbg);
-        if (mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0) != 0) {
-            mbedtls_exit(1);
-        }
-        mbedtls_ctr_drbg_set_prediction_resistance(&ctr_drbg, MBEDTLS_CTR_DRBG_PR_ON);
-        TIME_AND_TSC("CTR_DRBG (PR)",
-                     mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
-        mbedtls_ctr_drbg_free(&ctr_drbg);
-    }
-#endif
-
-#if defined(MBEDTLS_HMAC_DRBG_C) && \
-    (defined(MBEDTLS_SHA1_C) || defined(MBEDTLS_SHA256_C))
-    if (todo.hmac_drbg) {
-        mbedtls_hmac_drbg_context hmac_drbg;
-        const mbedtls_md_info_t *md_info;
-
-        mbedtls_hmac_drbg_init(&hmac_drbg);
-
-#if defined(MBEDTLS_SHA1_C)
-        if ((md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1)) == NULL) {
-            mbedtls_exit(1);
-        }
-
-        if (mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0) != 0) {
-            mbedtls_exit(1);
-        }
-        TIME_AND_TSC("HMAC_DRBG SHA-1 (NOPR)",
-                     mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
-
-        if (mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0) != 0) {
-            mbedtls_exit(1);
-        }
-        mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
-                                                    MBEDTLS_HMAC_DRBG_PR_ON);
-        TIME_AND_TSC("HMAC_DRBG SHA-1 (PR)",
-                     mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
-#endif
-
-#if defined(MBEDTLS_SHA256_C)
-        if ((md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256)) == NULL) {
-            mbedtls_exit(1);
-        }
-
-        if (mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0) != 0) {
-            mbedtls_exit(1);
-        }
-        TIME_AND_TSC("HMAC_DRBG SHA-256 (NOPR)",
-                     mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
-
-        if (mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0) != 0) {
-            mbedtls_exit(1);
-        }
-        mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
-                                                    MBEDTLS_HMAC_DRBG_PR_ON);
-        TIME_AND_TSC("HMAC_DRBG SHA-256 (PR)",
-                     mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
-#endif
-        mbedtls_hmac_drbg_free(&hmac_drbg);
-    }
-#endif /* MBEDTLS_HMAC_DRBG_C && ( MBEDTLS_SHA1_C || MBEDTLS_SHA256_C ) */
-
-#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
-    if (todo.rsa) {
-        int keysize;
-        mbedtls_rsa_context rsa;
-
-        for (keysize = 2048; keysize <= 4096; keysize += 1024) {
-            mbedtls_snprintf(title, sizeof(title), "RSA-%d", keysize);
-
-            mbedtls_rsa_init(&rsa);
-            mbedtls_rsa_gen_key(&rsa, myrand, NULL, keysize, 65537);
-
-            TIME_PUBLIC(title, " public",
-                        buf[0] = 0;
-                        ret = mbedtls_rsa_public(&rsa, buf, buf));
-
-            TIME_PUBLIC(title, "private",
-                        buf[0] = 0;
-                        ret = mbedtls_rsa_private(&rsa, myrand, NULL, buf, buf));
-
-            mbedtls_rsa_free(&rsa);
-        }
-    }
-#endif
-
-#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
-    if (todo.dhm) {
-        int dhm_sizes[] = { 2048, 3072 };
-        static const unsigned char dhm_P_2048[] =
-            MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
-        static const unsigned char dhm_P_3072[] =
-            MBEDTLS_DHM_RFC3526_MODP_3072_P_BIN;
-        static const unsigned char dhm_G_2048[] =
-            MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
-        static const unsigned char dhm_G_3072[] =
-            MBEDTLS_DHM_RFC3526_MODP_3072_G_BIN;
-
-        const unsigned char *dhm_P[] = { dhm_P_2048, dhm_P_3072 };
-        const size_t dhm_P_size[] = { sizeof(dhm_P_2048),
-                                      sizeof(dhm_P_3072) };
-
-        const unsigned char *dhm_G[] = { dhm_G_2048, dhm_G_3072 };
-        const size_t dhm_G_size[] = { sizeof(dhm_G_2048),
-                                      sizeof(dhm_G_3072) };
-
-        mbedtls_dhm_context dhm;
-        size_t olen;
-        size_t n;
-        mbedtls_mpi P, G;
-        mbedtls_mpi_init(&P); mbedtls_mpi_init(&G);
-
-        for (i = 0; (size_t) i < sizeof(dhm_sizes) / sizeof(dhm_sizes[0]); i++) {
-            mbedtls_dhm_init(&dhm);
-
-            if (mbedtls_mpi_read_binary(&P, dhm_P[i],
-                                        dhm_P_size[i]) != 0 ||
-                mbedtls_mpi_read_binary(&G, dhm_G[i],
-                                        dhm_G_size[i]) != 0 ||
-                mbedtls_dhm_set_group(&dhm, &P, &G) != 0) {
-                mbedtls_exit(1);
-            }
-
-            n = mbedtls_dhm_get_len(&dhm);
-            mbedtls_dhm_make_public(&dhm, (int) n, buf, n, myrand, NULL);
-
-            if (mbedtls_dhm_read_public(&dhm, buf, n) != 0) {
-                mbedtls_exit(1);
-            }
-
-            mbedtls_snprintf(title, sizeof(title), "DHE-%d", dhm_sizes[i]);
-            TIME_PUBLIC(title, "handshake",
-                        ret |= mbedtls_dhm_make_public(&dhm, (int) n, buf, n,
-                                                       myrand, NULL);
-                        ret |=
-                            mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf), &olen, myrand, NULL));
-
-            mbedtls_snprintf(title, sizeof(title), "DH-%d", dhm_sizes[i]);
-            TIME_PUBLIC(title, "handshake",
-                        ret |=
-                            mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf), &olen, myrand, NULL));
-
-            mbedtls_dhm_free(&dhm);
-            mbedtls_mpi_free(&P), mbedtls_mpi_free(&G);
-        }
-    }
-#endif
-
-#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
-    if (todo.ecdsa) {
-        mbedtls_ecdsa_context ecdsa;
-        const mbedtls_ecp_curve_info *curve_info;
-        size_t sig_len;
-
-        memset(buf, 0x2A, sizeof(buf));
-
-        for (curve_info = curve_list;
-             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
-             curve_info++) {
-            if (!mbedtls_ecdsa_can_do(curve_info->grp_id)) {
-                continue;
-            }
-
-            mbedtls_ecdsa_init(&ecdsa);
-
-            if (mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL) != 0) {
-                mbedtls_exit(1);
-            }
-
-            mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
-                             curve_info->name);
-            TIME_PUBLIC(title,
-                        "sign",
-                        ret =
-                            mbedtls_ecdsa_write_signature(&ecdsa, MBEDTLS_MD_SHA256, buf,
-                                                          curve_info->bit_size,
-                                                          tmp, sizeof(tmp), &sig_len, myrand,
-                                                          NULL));
-
-            mbedtls_ecdsa_free(&ecdsa);
-        }
-
-        for (curve_info = curve_list;
-             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
-             curve_info++) {
-            if (!mbedtls_ecdsa_can_do(curve_info->grp_id)) {
-                continue;
-            }
-
-            mbedtls_ecdsa_init(&ecdsa);
-
-            if (mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL) != 0 ||
-                mbedtls_ecdsa_write_signature(&ecdsa, MBEDTLS_MD_SHA256, buf, curve_info->bit_size,
-                                              tmp, sizeof(tmp), &sig_len, myrand, NULL) != 0) {
-                mbedtls_exit(1);
-            }
-
-            mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
-                             curve_info->name);
-            TIME_PUBLIC(title, "verify",
-                        ret = mbedtls_ecdsa_read_signature(&ecdsa, buf, curve_info->bit_size,
-                                                           tmp, sig_len));
-
-            mbedtls_ecdsa_free(&ecdsa);
-        }
-    }
-#endif
-
-#if defined(MBEDTLS_ECDH_C)
-    if (todo.ecdh) {
-        mbedtls_ecdh_context ecdh_srv, ecdh_cli;
-        unsigned char buf_srv[BUFSIZE], buf_cli[BUFSIZE];
-        const mbedtls_ecp_curve_info *curve_info;
-        size_t params_len, publen, seclen;
-
-        for (curve_info = curve_list;
-             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
-             curve_info++) {
-            if (!mbedtls_ecdh_can_do(curve_info->grp_id)) {
-                continue;
-            }
-
-            mbedtls_ecdh_init(&ecdh_srv);
-
-            CHECK_AND_CONTINUE(mbedtls_ecdh_setup(&ecdh_srv, curve_info->grp_id));
-            CHECK_AND_CONTINUE(mbedtls_ecdh_make_params(&ecdh_srv, &params_len, buf_srv,
-                                                        sizeof(buf_srv), myrand, NULL));
-
-            mbedtls_snprintf(title, sizeof(title), "ECDHE-%s", curve_info->name);
-            TIME_PUBLIC(title,
-                        "ephemeral handshake",
-                        const unsigned char *p_srv = buf_srv;
-                        mbedtls_ecdh_init(&ecdh_cli);
-
-                        CHECK_AND_CONTINUE(mbedtls_ecdh_read_params(&ecdh_cli, &p_srv,
-                                                                    p_srv + params_len));
-                        CHECK_AND_CONTINUE(mbedtls_ecdh_make_public(&ecdh_cli, &publen, buf_cli,
-                                                                    sizeof(buf_cli), myrand, NULL));
-
-                        CHECK_AND_CONTINUE(mbedtls_ecdh_calc_secret(&ecdh_cli, &seclen, buf_cli,
-                                                                    sizeof(buf_cli), myrand, NULL));
-                        mbedtls_ecdh_free(&ecdh_cli);
-                        );
-
-            mbedtls_ecdh_free(&ecdh_srv);
-        }
-
-        for (curve_info = curve_list;
-             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
-             curve_info++) {
-            if (!mbedtls_ecdh_can_do(curve_info->grp_id)) {
-                continue;
-            }
-
-            mbedtls_ecdh_init(&ecdh_srv);
-            mbedtls_ecdh_init(&ecdh_cli);
-
-            CHECK_AND_CONTINUE(mbedtls_ecdh_setup(&ecdh_srv, curve_info->grp_id));
-            CHECK_AND_CONTINUE(mbedtls_ecdh_make_params(&ecdh_srv, &params_len, buf_srv,
-                                                        sizeof(buf_srv), myrand, NULL));
-
-            const unsigned char *p_srv = buf_srv;
-            CHECK_AND_CONTINUE(mbedtls_ecdh_read_params(&ecdh_cli, &p_srv,
-                                                        p_srv + params_len));
-            CHECK_AND_CONTINUE(mbedtls_ecdh_make_public(&ecdh_cli, &publen, buf_cli,
-                                                        sizeof(buf_cli), myrand, NULL));
-
-
-            mbedtls_snprintf(title, sizeof(title), "ECDH-%s", curve_info->name);
-            TIME_PUBLIC(title,
-                        "static handshake",
-                        CHECK_AND_CONTINUE(mbedtls_ecdh_calc_secret(&ecdh_cli, &seclen, buf_cli,
-                                                                    sizeof(buf_cli), myrand, NULL));
-                        );
-
-            mbedtls_ecdh_free(&ecdh_cli);
-            mbedtls_ecdh_free(&ecdh_srv);
-        }
-    }
-#endif
-
-    mbedtls_printf("\n");
-
-#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
-    mbedtls_memory_buffer_alloc_free();
-#endif
-
-    mbedtls_exit(0);
-}
-
-#endif /* MBEDTLS_HAVE_TIME */
diff --git a/programs/test/dlopen_demo.sh b/programs/test/dlopen_demo.sh
deleted file mode 100755
index 7280f1d..0000000
--- a/programs/test/dlopen_demo.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-
-# Run the shared library dynamic loading demo program.
-# This is only expected to work when Mbed TLS is built as a shared library.
-
-# Copyright The Mbed TLS Contributors
-# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
-
-. "${0%/*}/../demo_common.sh"
-
-msg "Test the dynamic loading of libmbed*"
-
-program="$programs_dir/test/dlopen"
-library_dir="$root_dir/library"
-
-# Skip this test if we don't have a shared library build. Detect this
-# through the absence of the demo program.
-if [ ! -e "$program" ]; then
-    msg "$0: this demo requires a shared library build."
-    # Exit with a success status so that this counts as a pass for run_demos.py.
-    exit
-fi
-
-# ELF-based Unix-like (Linux, *BSD, Solaris, ...)
-if [ -n "${LD_LIBRARY_PATH-}" ]; then
-    LD_LIBRARY_PATH="$library_dir:$LD_LIBRARY_PATH"
-else
-    LD_LIBRARY_PATH="$library_dir"
-fi
-export LD_LIBRARY_PATH
-
-# OSX/macOS
-if [ -n "${DYLD_LIBRARY_PATH-}" ]; then
-    DYLD_LIBRARY_PATH="$library_dir:$DYLD_LIBRARY_PATH"
-else
-    DYLD_LIBRARY_PATH="$library_dir"
-fi
-export DYLD_LIBRARY_PATH
-
-msg "Running dynamic loading test program: $program"
-msg "Loading libraries from: $library_dir"
-"$program"
diff --git a/programs/test/metatest.c b/programs/test/metatest.c
deleted file mode 100644
index f39cb54..0000000
--- a/programs/test/metatest.c
+++ /dev/null
@@ -1,484 +0,0 @@
-/** \file metatest.c
- *
- *  \brief Test features of the test framework.
- *
- * When you run this program, it runs a single "meta-test". A meta-test
- * performs an operation which should be caught as a failure by our
- * test framework. The meta-test passes if this program calls `exit` with
- * a nonzero status, or aborts, or is terminated by a signal, or if the
- * framework running the program considers the run an error (this happens
- * with Valgrind for a memory leak). The non-success of the meta-test
- * program means that the test failure has been caught correctly.
- *
- * Some failures are purely functional: the logic of the code causes the
- * test result to be set to FAIL. Other failures come from extra
- * instrumentation which is not present in a normal build; for example,
- * Asan or Valgrind to detect memory leaks. This is reflected by the
- * "platform" associated with each meta-test.
- *
- * Use the companion script `tests/scripts/run-metatests.sh` to run all
- * the meta-tests for a given platform and validate that they trigger a
- * detected failure as expected.
- */
-
-/*
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-
-#include <mbedtls/debug.h>
-#include <mbedtls/platform.h>
-#include <mbedtls/platform_util.h>
-#include "test/helpers.h"
-#include "test/threading_helpers.h"
-#include "test/macros.h"
-#include "test/memory.h"
-#include "common.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#if defined(MBEDTLS_THREADING_C)
-#include <mbedtls/threading.h>
-#endif
-
-
-/* This is an external variable, so the compiler doesn't know that we're never
- * changing its value.
- */
-volatile int false_but_the_compiler_does_not_know = 0;
-
-/* Hide calls to calloc/free from static checkers such as
- * `gcc-12 -Wuse-after-free`, to avoid compile-time complaints about
- * code where we do mean to cause a runtime error. */
-void * (* volatile calloc_but_the_compiler_does_not_know)(size_t, size_t) = mbedtls_calloc;
-void(*volatile free_but_the_compiler_does_not_know)(void *) = mbedtls_free;
-
-/* Set n bytes at the address p to all-bits-zero, in such a way that
- * the compiler should not know that p is all-bits-zero. */
-static void set_to_zero_but_the_compiler_does_not_know(volatile void *p, size_t n)
-{
-    memset((void *) p, false_but_the_compiler_does_not_know, n);
-}
-
-/* Simulate an access to the given object, to avoid compiler optimizations
- * in code that prepares or consumes the object. */
-static void do_nothing_with_object(void *p)
-{
-    (void) p;
-}
-void(*volatile do_nothing_with_object_but_the_compiler_does_not_know)(void *) =
-    do_nothing_with_object;
-
-
-/****************************************************************/
-/* Test framework features */
-/****************************************************************/
-
-static void meta_test_fail(const char *name)
-{
-    (void) name;
-    mbedtls_test_fail("Forced test failure", __LINE__, __FILE__);
-}
-
-static void meta_test_not_equal(const char *name)
-{
-    int left = 20;
-    int right = 10;
-
-    (void) name;
-
-    TEST_EQUAL(left, right);
-exit:
-    ;
-}
-
-static void meta_test_not_le_s(const char *name)
-{
-    int left = 20;
-    int right = 10;
-
-    (void) name;
-
-    TEST_LE_S(left, right);
-exit:
-    ;
-}
-
-static void meta_test_not_le_u(const char *name)
-{
-    size_t left = 20;
-    size_t right = 10;
-
-    (void) name;
-
-    TEST_LE_U(left, right);
-exit:
-    ;
-}
-
-/****************************************************************/
-/* Platform features */
-/****************************************************************/
-
-static void null_pointer_dereference(const char *name)
-{
-    (void) name;
-    volatile char *volatile p;
-    set_to_zero_but_the_compiler_does_not_know(&p, sizeof(p));
-    /* Undefined behavior (read from null data pointer) */
-    mbedtls_printf("%p -> %u\n", (void *) p, (unsigned) *p);
-}
-
-static void null_pointer_call(const char *name)
-{
-    (void) name;
-    unsigned(*volatile p)(void);
-    set_to_zero_but_the_compiler_does_not_know(&p, sizeof(p));
-    /* Undefined behavior (execute null function pointer) */
-    /* The pointer representation may be truncated, but we don't care:
-     * the only point of printing it is to have some use of the pointer
-     * to dissuade the compiler from optimizing it away. */
-    mbedtls_printf("%lx() -> %u\n", (unsigned long) (uintptr_t) p, p());
-}
-
-
-/****************************************************************/
-/* Memory */
-/****************************************************************/
-
-static void read_after_free(const char *name)
-{
-    (void) name;
-    volatile char *p = calloc_but_the_compiler_does_not_know(1, 1);
-    *p = 'a';
-    free_but_the_compiler_does_not_know((void *) p);
-    /* Undefined behavior (read after free) */
-    mbedtls_printf("%u\n", (unsigned) *p);
-}
-
-static void double_free(const char *name)
-{
-    (void) name;
-    volatile char *p = calloc_but_the_compiler_does_not_know(1, 1);
-    *p = 'a';
-    free_but_the_compiler_does_not_know((void *) p);
-    /* Undefined behavior (double free) */
-    free_but_the_compiler_does_not_know((void *) p);
-}
-
-static void read_uninitialized_stack(const char *name)
-{
-    (void) name;
-    char buf[1];
-    if (false_but_the_compiler_does_not_know) {
-        buf[0] = '!';
-    }
-    char *volatile p = buf;
-    if (*p != 0) {
-        /* Unspecified result (read from uninitialized memory) */
-        mbedtls_printf("%u\n", (unsigned) *p);
-    }
-}
-
-static void memory_leak(const char *name)
-{
-    (void) name;
-    volatile char *p = calloc_but_the_compiler_does_not_know(1, 1);
-    mbedtls_printf("%u\n", (unsigned) *p);
-    /* Leak of a heap object */
-}
-
-/* name = "test_memory_poison_%(start)_%(offset)_%(count)_%(direction)"
- * Poison a region starting at start from an 8-byte aligned origin,
- * encompassing count bytes. Access the region at offset from the start.
- * %(start), %(offset) and %(count) are decimal integers.
- * %(direction) is either the character 'r' for read or 'w' for write.
- */
-static void test_memory_poison(const char *name)
-{
-    size_t start = 0, offset = 0, count = 0;
-    char direction = 'r';
-    if (sscanf(name,
-               "%*[^0-9]%" MBEDTLS_PRINTF_SIZET
-               "%*[^0-9]%" MBEDTLS_PRINTF_SIZET
-               "%*[^0-9]%" MBEDTLS_PRINTF_SIZET
-               "_%c",
-               &start, &offset, &count, &direction) != 4) {
-        mbedtls_fprintf(stderr, "%s: Bad name format: %s\n", __func__, name);
-        return;
-    }
-
-    union {
-        long long ll;
-        unsigned char buf[32];
-    } aligned;
-    memset(aligned.buf, 'a', sizeof(aligned.buf));
-
-    if (start > sizeof(aligned.buf)) {
-        mbedtls_fprintf(stderr,
-                        "%s: start=%" MBEDTLS_PRINTF_SIZET
-                        " > size=%" MBEDTLS_PRINTF_SIZET,
-                        __func__, start, sizeof(aligned.buf));
-        return;
-    }
-    if (start + count > sizeof(aligned.buf)) {
-        mbedtls_fprintf(stderr,
-                        "%s: start+count=%" MBEDTLS_PRINTF_SIZET
-                        " > size=%" MBEDTLS_PRINTF_SIZET,
-                        __func__, start + count, sizeof(aligned.buf));
-        return;
-    }
-    if (offset >= count) {
-        mbedtls_fprintf(stderr,
-                        "%s: offset=%" MBEDTLS_PRINTF_SIZET
-                        " >= count=%" MBEDTLS_PRINTF_SIZET,
-                        __func__, offset, count);
-        return;
-    }
-
-    MBEDTLS_TEST_MEMORY_POISON(aligned.buf + start, count);
-
-    if (direction == 'w') {
-        aligned.buf[start + offset] = 'b';
-        do_nothing_with_object_but_the_compiler_does_not_know(aligned.buf);
-    } else {
-        do_nothing_with_object_but_the_compiler_does_not_know(aligned.buf);
-        mbedtls_printf("%u\n", (unsigned) aligned.buf[start + offset]);
-    }
-}
-
-
-/****************************************************************/
-/* Threading */
-/****************************************************************/
-
-static void mutex_lock_not_initialized(const char *name)
-{
-    (void) name;
-#if defined(MBEDTLS_THREADING_C)
-    mbedtls_threading_mutex_t mutex;
-    memset(&mutex, 0, sizeof(mutex));
-    /* This mutex usage error is detected by our test framework's mutex usage
-     * verification framework. See framework/tests/src/threading_helpers.c. Other
-     * threading implementations (e.g. pthread without our instrumentation)
-     * might consider this normal usage. */
-    TEST_ASSERT(mbedtls_mutex_lock(&mutex) == 0);
-exit:
-    ;
-#endif
-}
-
-static void mutex_unlock_not_initialized(const char *name)
-{
-    (void) name;
-#if defined(MBEDTLS_THREADING_C)
-    mbedtls_threading_mutex_t mutex;
-    memset(&mutex, 0, sizeof(mutex));
-    /* This mutex usage error is detected by our test framework's mutex usage
-     * verification framework. See framework/tests/src/threading_helpers.c. Other
-     * threading implementations (e.g. pthread without our instrumentation)
-     * might consider this normal usage. */
-    TEST_ASSERT(mbedtls_mutex_unlock(&mutex) == 0);
-exit:
-    ;
-#endif
-}
-
-static void mutex_free_not_initialized(const char *name)
-{
-    (void) name;
-#if defined(MBEDTLS_THREADING_C)
-    mbedtls_threading_mutex_t mutex;
-    memset(&mutex, 0, sizeof(mutex));
-    /* This mutex usage error is detected by our test framework's mutex usage
-     * verification framework. See framework/tests/src/threading_helpers.c. Other
-     * threading implementations (e.g. pthread without our instrumentation)
-     * might consider this normal usage. */
-    mbedtls_mutex_free(&mutex);
-#endif
-}
-
-static void mutex_double_init(const char *name)
-{
-    (void) name;
-#if defined(MBEDTLS_THREADING_C)
-    mbedtls_threading_mutex_t mutex;
-    mbedtls_mutex_init(&mutex);
-    /* This mutex usage error is detected by our test framework's mutex usage
-     * verification framework. See framework/tests/src/threading_helpers.c. Other
-     * threading implementations (e.g. pthread without our instrumentation)
-     * might consider this normal usage. */
-    mbedtls_mutex_init(&mutex);
-    mbedtls_mutex_free(&mutex);
-#endif
-}
-
-static void mutex_double_free(const char *name)
-{
-    (void) name;
-#if defined(MBEDTLS_THREADING_C)
-    mbedtls_threading_mutex_t mutex;
-    mbedtls_mutex_init(&mutex);
-    mbedtls_mutex_free(&mutex);
-    /* This mutex usage error is detected by our test framework's mutex usage
-     * verification framework. See framework/tests/src/threading_helpers.c. Other
-     * threading implementations (e.g. pthread without our instrumentation)
-     * might consider this normal usage. */
-    mbedtls_mutex_free(&mutex);
-#endif
-}
-
-static void mutex_leak(const char *name)
-{
-    (void) name;
-#if defined(MBEDTLS_THREADING_C)
-    mbedtls_threading_mutex_t mutex;
-    mbedtls_mutex_init(&mutex);
-#endif
-    /* This mutex usage error is detected by our test framework's mutex usage
-     * verification framework. See framework/tests/src/threading_helpers.c. Other
-     * threading implementations (e.g. pthread without our instrumentation)
-     * might consider this normal usage. */
-}
-
-
-/****************************************************************/
-/* Command line entry point */
-/****************************************************************/
-
-typedef struct {
-    /** Command line argument that will trigger that metatest.
-     *
-     * Conventionally matches "[a-z0-9_]+". */
-    const char *name;
-
-    /** Platform under which that metatest is valid.
-     *
-     * - "any": should work anywhere.
-     * - "asan": triggers ASan (Address Sanitizer).
-     * - "msan": triggers MSan (Memory Sanitizer).
-     * - "pthread": requires MBEDTLS_THREADING_PTHREAD and MBEDTLS_TEST_HOOKS,
-     *   which enables MBEDTLS_TEST_MUTEX_USAGE internally in the test
-     *   framework (see framework/tests/src/threading_helpers.c).
-     */
-    const char *platform;
-
-    /** Function that performs the metatest.
-     *
-     * The function receives the name as an argument. This allows using the
-     * same function to perform multiple variants of a test based on the name.
-     *
-     * When executed on a conforming platform, the function is expected to
-     * either cause a test failure (mbedtls_test_fail()), or cause the
-     * program to abort in some way (e.g. by causing a segfault or by
-     * triggering a sanitizer).
-     *
-     * When executed on a non-conforming platform, the function may return
-     * normally or may have unpredictable behavior.
-     */
-    void (*entry_point)(const char *name);
-} metatest_t;
-
-/* The list of available meta-tests. Remember to register new functions here!
- *
- * Note that we always compile all the functions, so that `metatest --list`
- * will always list all the available meta-tests.
- *
- * See the documentation of metatest_t::platform for the meaning of
- * platform values.
- */
-metatest_t metatests[] = {
-    { "test_fail", "any", meta_test_fail },
-    { "test_not_equal", "any", meta_test_not_equal },
-    { "test_not_le_s", "any", meta_test_not_le_s },
-    { "test_not_le_u", "any", meta_test_not_le_u },
-    { "null_dereference", "any", null_pointer_dereference },
-    { "null_call", "any", null_pointer_call },
-    { "read_after_free", "asan", read_after_free },
-    { "double_free", "asan", double_free },
-    { "read_uninitialized_stack", "msan", read_uninitialized_stack },
-    { "memory_leak", "asan", memory_leak },
-    { "test_memory_poison_0_0_8_r", "poison", test_memory_poison },
-    { "test_memory_poison_0_0_8_w", "poison", test_memory_poison },
-    { "test_memory_poison_0_7_8_r", "poison", test_memory_poison },
-    { "test_memory_poison_0_7_8_w", "poison", test_memory_poison },
-    { "test_memory_poison_0_0_1_r", "poison", test_memory_poison },
-    { "test_memory_poison_0_0_1_w", "poison", test_memory_poison },
-    { "test_memory_poison_0_1_2_r", "poison", test_memory_poison },
-    { "test_memory_poison_0_1_2_w", "poison", test_memory_poison },
-    { "test_memory_poison_7_0_8_r", "poison", test_memory_poison },
-    { "test_memory_poison_7_0_8_w", "poison", test_memory_poison },
-    { "test_memory_poison_7_7_8_r", "poison", test_memory_poison },
-    { "test_memory_poison_7_7_8_w", "poison", test_memory_poison },
-    { "test_memory_poison_7_0_1_r", "poison", test_memory_poison },
-    { "test_memory_poison_7_0_1_w", "poison", test_memory_poison },
-    { "test_memory_poison_7_1_2_r", "poison", test_memory_poison },
-    { "test_memory_poison_7_1_2_w", "poison", test_memory_poison },
-    { "mutex_lock_not_initialized", "pthread", mutex_lock_not_initialized },
-    { "mutex_unlock_not_initialized", "pthread", mutex_unlock_not_initialized },
-    { "mutex_free_not_initialized", "pthread", mutex_free_not_initialized },
-    { "mutex_double_init", "pthread", mutex_double_init },
-    { "mutex_double_free", "pthread", mutex_double_free },
-    { "mutex_leak", "pthread", mutex_leak },
-    { NULL, NULL, NULL }
-};
-
-static void help(FILE *out, const char *argv0)
-{
-    mbedtls_fprintf(out, "Usage: %s list|TEST\n", argv0);
-    mbedtls_fprintf(out, "Run a meta-test that should cause a test failure.\n");
-    mbedtls_fprintf(out, "With 'list', list the available tests and their platform requirement.\n");
-}
-
-int main(int argc, char *argv[])
-{
-    const char *argv0 = argc > 0 ? argv[0] : "metatest";
-    if (argc != 2) {
-        help(stderr, argv0);
-        mbedtls_exit(MBEDTLS_EXIT_FAILURE);
-    }
-
-    /* Support "-help", "--help", "--list", etc. */
-    const char *command = argv[1];
-    while (*command == '-') {
-        ++command;
-    }
-
-    if (strcmp(argv[1], "help") == 0) {
-        help(stdout, argv0);
-        mbedtls_exit(MBEDTLS_EXIT_SUCCESS);
-    }
-    if (strcmp(argv[1], "list") == 0) {
-        for (const metatest_t *p = metatests; p->name != NULL; p++) {
-            mbedtls_printf("%s %s\n", p->name, p->platform);
-        }
-        mbedtls_exit(MBEDTLS_EXIT_SUCCESS);
-    }
-
-#if defined(MBEDTLS_TEST_MUTEX_USAGE)
-    mbedtls_test_mutex_usage_init();
-#endif
-
-    for (const metatest_t *p = metatests; p->name != NULL; p++) {
-        if (strcmp(argv[1], p->name) == 0) {
-            mbedtls_printf("Running metatest %s...\n", argv[1]);
-            p->entry_point(argv[1]);
-#if defined(MBEDTLS_TEST_MUTEX_USAGE)
-            mbedtls_test_mutex_usage_check();
-#endif
-            int result = (int) mbedtls_test_get_result();
-
-            mbedtls_printf("Running metatest %s... done, result=%d\n",
-                           argv[1], result);
-            mbedtls_exit(result == MBEDTLS_TEST_RESULT_SUCCESS ?
-                         MBEDTLS_EXIT_SUCCESS :
-                         MBEDTLS_EXIT_FAILURE);
-        }
-    }
-
-    mbedtls_fprintf(stderr, "%s: FATAL: No such metatest: %s\n",
-                    argv0, command);
-    mbedtls_exit(MBEDTLS_EXIT_FAILURE);
-}
diff --git a/programs/test/query_compile_time_config.c b/programs/test/query_compile_time_config.c
deleted file mode 100644
index a70e6da..0000000
--- a/programs/test/query_compile_time_config.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Query the Mbed TLS compile time configuration
- *
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#include "mbedtls/build_info.h"
-
-#include "mbedtls/platform.h"
-
-#define USAGE                                                                   \
-    "usage: %s [ -all | -any | -l ] <MBEDTLS_CONFIG> ...\n\n"                   \
-    "This program takes command line arguments which correspond to\n"           \
-    "the string representation of Mbed TLS compile time configurations.\n\n"    \
-    "If \"--all\" and \"--any\" are not used, then, if all given arguments\n"   \
-    "are defined in the Mbed TLS build, 0 is returned; otherwise 1 is\n"        \
-    "returned. Macro expansions of configurations will be printed (if any).\n"                                 \
-    "-l\tPrint all available configuration.\n"                                  \
-    "-all\tReturn 0 if all configurations are defined. Otherwise, return 1\n"   \
-    "-any\tReturn 0 if any configuration is defined. Otherwise, return 1\n"     \
-    "-h\tPrint this usage\n"
-
-#include <string.h>
-#include "query_config.h"
-
-int main(int argc, char *argv[])
-{
-    int i;
-
-    if (argc < 2 || strcmp(argv[1], "-h") == 0) {
-        mbedtls_printf(USAGE, argv[0]);
-        return MBEDTLS_EXIT_FAILURE;
-    }
-
-    if (strcmp(argv[1], "-l") == 0) {
-        list_config();
-        return 0;
-    }
-
-    if (strcmp(argv[1], "-all") == 0) {
-        for (i = 2; i < argc; i++) {
-            if (query_config(argv[i]) != 0) {
-                return 1;
-            }
-        }
-        return 0;
-    }
-
-    if (strcmp(argv[1], "-any") == 0) {
-        for (i = 2; i < argc; i++) {
-            if (query_config(argv[i]) == 0) {
-                return 0;
-            }
-        }
-        return 1;
-    }
-
-    for (i = 1; i < argc; i++) {
-        if (query_config(argv[i]) != 0) {
-            return 1;
-        }
-    }
-
-    return 0;
-}
diff --git a/programs/test/query_config.h b/programs/test/query_config.h
deleted file mode 100644
index 43f120b..0000000
--- a/programs/test/query_config.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Query Mbed TLS compile time configurations from mbedtls_config.h
- *
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#ifndef MBEDTLS_PROGRAMS_TEST_QUERY_CONFIG_H
-#define MBEDTLS_PROGRAMS_TEST_QUERY_CONFIG_H
-
-#include "mbedtls/build_info.h"
-
-/** Check whether a given configuration symbol is enabled.
- *
- * \param config    The symbol to query (e.g. "MBEDTLS_RSA_C").
- * \return          \c 0 if the symbol was defined at compile time
- *                  (in MBEDTLS_CONFIG_FILE or mbedtls_config.h),
- *                  \c 1 otherwise.
- *
- * \note            This function is defined in `programs/test/query_config.c`
- *                  which is automatically generated by
- *                  `scripts/generate_query_config.pl`.
- */
-int query_config(const char *config);
-
-/** List all enabled configuration symbols
- *
- * \note            This function is defined in `programs/test/query_config.c`
- *                  which is automatically generated by
- *                  `scripts/generate_query_config.pl`.
- */
-void list_config(void);
-
-#endif /* MBEDTLS_PROGRAMS_TEST_QUERY_CONFIG_H */
diff --git a/programs/test/query_included_headers.c b/programs/test/query_included_headers.c
deleted file mode 100644
index cdafa16..0000000
--- a/programs/test/query_included_headers.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Ad hoc report on included headers. */
-/*
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#include <psa/crypto.h>
-#include <mbedtls/platform.h>
-
-int main(void)
-{
-
-    /* Which PSA platform header? */
-#if defined(PSA_CRYPTO_PLATFORM_H)
-    mbedtls_printf("PSA_CRYPTO_PLATFORM_H\n");
-#endif
-#if defined(PSA_CRYPTO_PLATFORM_ALT_H)
-    mbedtls_printf("PSA_CRYPTO_PLATFORM_ALT_H\n");
-#endif
-
-    /* Which PSA struct header? */
-#if defined(PSA_CRYPTO_STRUCT_H)
-    mbedtls_printf("PSA_CRYPTO_STRUCT_H\n");
-#endif
-#if defined(PSA_CRYPTO_STRUCT_ALT_H)
-    mbedtls_printf("PSA_CRYPTO_STRUCT_ALT_H\n");
-#endif
-
-}
diff --git a/programs/test/zeroize.c b/programs/test/zeroize.c
deleted file mode 100644
index c1cee0d..0000000
--- a/programs/test/zeroize.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Zeroize application for debugger-driven testing
- *
- * This is a simple test application used for debugger-driven testing to check
- * whether calls to mbedtls_platform_zeroize() are being eliminated by compiler
- * optimizations. This application is used by the GDB script at
- * tests/scripts/test_zeroize.gdb: the script sets a breakpoint at the last
- * return statement in the main() function of this program. The debugger
- * facilities are then used to manually inspect the memory and verify that the
- * call to mbedtls_platform_zeroize() was not eliminated.
- *
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#include "mbedtls/build_info.h"
-
-#include <stdio.h>
-
-#include "mbedtls/platform.h"
-
-#include "mbedtls/platform_util.h"
-
-#define BUFFER_LEN 1024
-
-static void usage(void)
-{
-    mbedtls_printf("Zeroize is a simple program to assist with testing\n");
-    mbedtls_printf("the mbedtls_platform_zeroize() function by using the\n");
-    mbedtls_printf("debugger. This program takes a file as input and\n");
-    mbedtls_printf("prints the first %d characters. Usage:\n\n", BUFFER_LEN);
-    mbedtls_printf("       zeroize <FILE>\n");
-}
-
-int main(int argc, char **argv)
-{
-    int exit_code = MBEDTLS_EXIT_FAILURE;
-    FILE *fp;
-    char buf[BUFFER_LEN];
-    char *p = buf;
-    char *end = p + BUFFER_LEN;
-    int c;
-
-    if (argc != 2) {
-        mbedtls_printf("This program takes exactly 1 argument\n");
-        usage();
-        mbedtls_exit(exit_code);
-    }
-
-    fp = fopen(argv[1], "r");
-    if (fp == NULL) {
-        mbedtls_printf("Could not open file '%s'\n", argv[1]);
-        mbedtls_exit(exit_code);
-    }
-
-    while ((c = fgetc(fp)) != EOF && p < end - 1) {
-        *p++ = (char) c;
-    }
-    *p = '\0';
-
-    if (p - buf != 0) {
-        mbedtls_printf("%s\n", buf);
-        exit_code = MBEDTLS_EXIT_SUCCESS;
-    } else {
-        mbedtls_printf("The file is empty!\n");
-    }
-
-    fclose(fp);
-    mbedtls_platform_zeroize(buf, sizeof(buf));
-
-    mbedtls_exit(exit_code);   // GDB_BREAK_HERE -- don't remove this comment!
-}
diff --git a/scripts/ecc-heap.sh b/scripts/ecc-heap.sh
deleted file mode 100755
index 3eb2ff4..0000000
--- a/scripts/ecc-heap.sh
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/sh
-
-# Measure heap usage (and performance) of ECC operations with various values of
-# the relevant tunable compile-time parameters.
-#
-# Usage (preferably on a 32-bit platform):
-# cmake -D CMAKE_BUILD_TYPE=Release .
-# scripts/ecc-heap.sh | tee ecc-heap.log
-#
-# Copyright The Mbed TLS Contributors
-# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
-
-set -eu
-
-CONFIG_H='include/mbedtls/mbedtls_config.h'
-
-if [ -r $CONFIG_H ]; then :; else
-    echo "$CONFIG_H not found" >&2
-    exit 1
-fi
-
-if grep -i cmake Makefile >/dev/null; then :; else
-    echo "Needs Cmake" >&2
-    exit 1
-fi
-
-if git status | grep -F $CONFIG_H >/dev/null 2>&1; then
-    echo "mbedtls_config.h not clean" >&2
-    exit 1
-fi
-
-CONFIG_BAK=${CONFIG_H}.bak
-cp $CONFIG_H $CONFIG_BAK
-
-cat << EOF >$CONFIG_H
-#define MBEDTLS_PLATFORM_C
-#define MBEDTLS_PLATFORM_MEMORY
-#define MBEDTLS_MEMORY_BUFFER_ALLOC_C
-#define MBEDTLS_MEMORY_DEBUG
-
-#define MBEDTLS_TIMING_C
-
-#define MBEDTLS_BIGNUM_C
-#define MBEDTLS_ECP_C
-#define MBEDTLS_ASN1_PARSE_C
-#define MBEDTLS_ASN1_WRITE_C
-#define MBEDTLS_ECDSA_C
-#define MBEDTLS_SHA256_C // ECDSA benchmark needs it
-#define MBEDTLS_SHA224_C // SHA256 requires this for now
-#define MBEDTLS_ECDH_C
-
-// NIST curves >= 256 bits
-#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
-#define MBEDTLS_ECP_DP_SECP384R1_ENABLED
-#define MBEDTLS_ECP_DP_SECP521R1_ENABLED
-// SECP "koblitz-like" curve >= 256 bits
-#define MBEDTLS_ECP_DP_SECP256K1_ENABLED
-// Brainpool curves (no specialised "mod p" routine)
-#define MBEDTLS_ECP_DP_BP256R1_ENABLED
-#define MBEDTLS_ECP_DP_BP384R1_ENABLED
-#define MBEDTLS_ECP_DP_BP512R1_ENABLED
-// Montgomery curves
-#define MBEDTLS_ECP_DP_CURVE25519_ENABLED
-#define MBEDTLS_ECP_DP_CURVE448_ENABLED
-
-#define MBEDTLS_HAVE_ASM // just make things a bit faster
-#define MBEDTLS_ECP_NIST_OPTIM // faster and less allocations
-
-//#define MBEDTLS_ECP_WINDOW_SIZE            4
-//#define MBEDTLS_ECP_FIXED_POINT_OPTIM      1
-EOF
-
-for F in 0 1; do
-    for W in 2 3 4; do
-        scripts/config.py set MBEDTLS_ECP_WINDOW_SIZE $W
-        scripts/config.py set MBEDTLS_ECP_FIXED_POINT_OPTIM $F
-        make benchmark >/dev/null 2>&1
-        echo "fixed point optim = $F, max window size = $W"
-        echo "--------------------------------------------"
-        programs/test/benchmark ecdh ecdsa
-    done
-done
-
-# cleanup
-
-mv $CONFIG_BAK $CONFIG_H
-make clean
diff --git a/scripts/generate_visualc_files.pl b/scripts/generate_visualc_files.pl
index d0fcb7d..053040a 100755
--- a/scripts/generate_visualc_files.pl
+++ b/scripts/generate_visualc_files.pl
@@ -22,6 +22,7 @@
 my $vsx_sln_file = "$vsx_dir/mbedTLS.sln";
 
 my $mbedtls_programs_dir = "programs";
+my $framework_programs_dir = "framework/tests/programs";
 my $tfpsacrypto_programs_dir = "tf-psa-crypto/programs";
 
 my $mbedtls_header_dir = 'include/mbedtls';
@@ -59,6 +60,7 @@
     tf-psa-crypto/drivers/everest/include/everest/kremlib
     tests/include
     framework/tests/include
+    framework/tests/programs
 );
 my $include_directories = join(';', map {"../../$_"} @include_directories);
 
@@ -125,6 +127,7 @@
         && -d $tls_test_header_dir
         && -d $test_drivers_header_dir
         && -d $mbedtls_programs_dir
+        && -d $framework_programs_dir
         && -d $tfpsacrypto_programs_dir;
 }
 
@@ -164,7 +167,14 @@
     (my $appname = $path) =~ s/.*\\//;
     my $is_test_app = ($path =~ m/^test\\/);
 
-    my $srcs = "<ClCompile Include=\"..\\..\\programs\\$path.c\" \/>";
+    my $srcs;
+    if( $appname eq "metatest" or $appname eq "query_compile_time_config" or
+        $appname eq "query_included_headers" or $appname eq "zeroize" ) {
+        $srcs = "<ClCompile Include=\"..\\..\\framework\\tests\\programs\\$appname.c\" \/>";
+    } else {
+        $srcs = "<ClCompile Include=\"..\\..\\programs\\$path.c\" \/>";
+    }
+
     if( $appname eq "ssl_client2" or $appname eq "ssl_server2" or
         $appname eq "query_compile_time_config" ) {
         $srcs .= "\n    <ClCompile Include=\"..\\..\\programs\\test\\query_config.c\" \/>";
@@ -283,6 +293,7 @@
                        $tls_source_dir,
                        $crypto_core_source_dir,
                        $crypto_source_dir,
+                       $framework_programs_dir,
                        @thirdparty_header_dirs,
                       );
     my @headers = (map { <$_/*.h> } @header_dirs);
diff --git a/tests/scripts/components-build-system.sh b/tests/scripts/components-build-system.sh
index d6ad88a..91a999e 100644
--- a/tests/scripts/components-build-system.sh
+++ b/tests/scripts/components-build-system.sh
@@ -13,7 +13,7 @@
     msg "build/test: make shared" # ~ 40s
     make SHARED=1 TEST_CPP=1 all check
     ldd programs/util/strerror | grep libmbedcrypto
-    programs/test/dlopen_demo.sh
+    $FRAMEWORK/tests/programs/dlopen_demo.sh
 }
 
 component_test_cmake_shared () {
@@ -22,7 +22,7 @@
     make
     ldd programs/util/strerror | grep libtfpsacrypto
     make test
-    programs/test/dlopen_demo.sh
+    $FRAMEWORK/tests/programs/dlopen_demo.sh
 }
 
 support_test_cmake_out_of_source () {
diff --git a/tests/scripts/components-compiler.sh b/tests/scripts/components-compiler.sh
index 469c62c..74543b1 100644
--- a/tests/scripts/components-compiler.sh
+++ b/tests/scripts/components-compiler.sh
@@ -136,7 +136,7 @@
         for compiler in clang gcc; do
             msg "test: $compiler $optimization_flag, mbedtls_platform_zeroize()"
             make programs CC="$compiler" DEBUG=1 CFLAGS="$optimization_flag"
-            gdb -ex "$gdb_disable_aslr" -x tests/scripts/test_zeroize.gdb -nw -batch -nx 2>&1 | tee test_zeroize.log
+            gdb -ex "$gdb_disable_aslr" -x $FRAMEWORK/tests/programs/test_zeroize.gdb -nw -batch -nx 2>&1 | tee test_zeroize.log
             grep "The buffer was correctly zeroized" test_zeroize.log
             not grep -i "error" test_zeroize.log
             rm -f test_zeroize.log
diff --git a/tests/scripts/test_zeroize.gdb b/tests/scripts/test_zeroize.gdb
deleted file mode 100644
index 57f771f..0000000
--- a/tests/scripts/test_zeroize.gdb
+++ /dev/null
@@ -1,64 +0,0 @@
-# test_zeroize.gdb
-#
-# Copyright The Mbed TLS Contributors
-# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
-#
-# Purpose
-#
-# Run a test using the debugger to check that the mbedtls_platform_zeroize()
-# function in platform_util.h is not being optimized out by the compiler. To do
-# so, the script loads the test program at programs/test/zeroize.c and sets a
-# breakpoint at the last return statement in main(). When the breakpoint is
-# hit, the debugger manually checks the contents to be zeroized and checks that
-# it is actually cleared.
-#
-# The mbedtls_platform_zeroize() test is debugger driven because there does not
-# seem to be a mechanism to reliably check whether the zeroize calls are being
-# eliminated by compiler optimizations from within the compiled program. The
-# problem is that a compiler would typically remove what it considers to be
-# "unnecessary" assignments as part of redundant code elimination. To identify
-# such code, the compilar will create some form dependency graph between
-# reads and writes to variables (among other situations). It will then use this
-# data structure to remove redundant code that does not have an impact on the
-# program's observable behavior. In the case of mbedtls_platform_zeroize(), an
-# intelligent compiler could determine that this function clears a block of
-# memory that is not accessed later in the program, so removing the call to
-# mbedtls_platform_zeroize() does not have an observable behavior. However,
-# inserting a test after a call to mbedtls_platform_zeroize() to check whether
-# the block of memory was correctly zeroed would force the compiler to not
-# eliminate the mbedtls_platform_zeroize() call. If this does not occur, then
-# the compiler potentially has a bug.
-#
-# Note: This test requires that the test program is compiled with -g3.
-
-set confirm off
-
-file ./programs/test/zeroize
-
-search GDB_BREAK_HERE
-break $_
-
-set args ./programs/test/zeroize.c
-run
-
-set $i = 0
-set $len = sizeof(buf)
-set $buf = buf
-
-while $i < $len
-    if $buf[$i++] != 0
-        echo The buffer at was not zeroized\n
-        quit 1
-    end
-end
-
-echo The buffer was correctly zeroized\n
-
-continue
-
-if $_exitcode != 0
-    echo The program did not terminate correctly\n
-    quit 1
-end
-
-quit 0
diff --git a/tests/suites/test_suite_test_helpers.function b/tests/suites/test_suite_test_helpers.function
index 8c5d5ad..0139faf 100644
--- a/tests/suites/test_suite_test_helpers.function
+++ b/tests/suites/test_suite_test_helpers.function
@@ -15,7 +15,7 @@
 /* Test that poison+unpoison leaves the memory accessible. */
 /* We can't test that poisoning makes the memory inaccessible:
  * there's no sane way to catch an Asan/Valgrind complaint.
- * That negative testing is done in programs/test/metatest.c. */
+ * That negative testing is done in framework/tests/programs/metatest.c. */
 void memory_poison_unpoison(int align, int size)
 {
     unsigned char *buf = NULL;
diff --git a/tf-psa-crypto b/tf-psa-crypto
index da76c6b..2cfed8e 160000
--- a/tf-psa-crypto
+++ b/tf-psa-crypto
@@ -1 +1 @@
-Subproject commit da76c6b1915c75e9dd9efc32f7d206a05b5d36c8
+Subproject commit 2cfed8e711554ffc9432209caa62244938a7da7b
