1*62c56f98SSadaf Ebrahimi /* 2*62c56f98SSadaf Ebrahimi * Zeroize application for debugger-driven testing 3*62c56f98SSadaf Ebrahimi * 4*62c56f98SSadaf Ebrahimi * This is a simple test application used for debugger-driven testing to check 5*62c56f98SSadaf Ebrahimi * whether calls to mbedtls_platform_zeroize() are being eliminated by compiler 6*62c56f98SSadaf Ebrahimi * optimizations. This application is used by the GDB script at 7*62c56f98SSadaf Ebrahimi * tests/scripts/test_zeroize.gdb: the script sets a breakpoint at the last 8*62c56f98SSadaf Ebrahimi * return statement in the main() function of this program. The debugger 9*62c56f98SSadaf Ebrahimi * facilities are then used to manually inspect the memory and verify that the 10*62c56f98SSadaf Ebrahimi * call to mbedtls_platform_zeroize() was not eliminated. 11*62c56f98SSadaf Ebrahimi * 12*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors 13*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 14*62c56f98SSadaf Ebrahimi */ 15*62c56f98SSadaf Ebrahimi 16*62c56f98SSadaf Ebrahimi #include "mbedtls/build_info.h" 17*62c56f98SSadaf Ebrahimi 18*62c56f98SSadaf Ebrahimi #include <stdio.h> 19*62c56f98SSadaf Ebrahimi 20*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h" 21*62c56f98SSadaf Ebrahimi 22*62c56f98SSadaf Ebrahimi #include "mbedtls/platform_util.h" 23*62c56f98SSadaf Ebrahimi 24*62c56f98SSadaf Ebrahimi #define BUFFER_LEN 1024 25*62c56f98SSadaf Ebrahimi usage(void)26*62c56f98SSadaf Ebrahimivoid usage(void) 27*62c56f98SSadaf Ebrahimi { 28*62c56f98SSadaf Ebrahimi mbedtls_printf("Zeroize is a simple program to assist with testing\n"); 29*62c56f98SSadaf Ebrahimi mbedtls_printf("the mbedtls_platform_zeroize() function by using the\n"); 30*62c56f98SSadaf Ebrahimi mbedtls_printf("debugger. This program takes a file as input and\n"); 31*62c56f98SSadaf Ebrahimi mbedtls_printf("prints the first %d characters. Usage:\n\n", BUFFER_LEN); 32*62c56f98SSadaf Ebrahimi mbedtls_printf(" zeroize <FILE>\n"); 33*62c56f98SSadaf Ebrahimi } 34*62c56f98SSadaf Ebrahimi main(int argc,char ** argv)35*62c56f98SSadaf Ebrahimiint main(int argc, char **argv) 36*62c56f98SSadaf Ebrahimi { 37*62c56f98SSadaf Ebrahimi int exit_code = MBEDTLS_EXIT_FAILURE; 38*62c56f98SSadaf Ebrahimi FILE *fp; 39*62c56f98SSadaf Ebrahimi char buf[BUFFER_LEN]; 40*62c56f98SSadaf Ebrahimi char *p = buf; 41*62c56f98SSadaf Ebrahimi char *end = p + BUFFER_LEN; 42*62c56f98SSadaf Ebrahimi int c; 43*62c56f98SSadaf Ebrahimi 44*62c56f98SSadaf Ebrahimi if (argc != 2) { 45*62c56f98SSadaf Ebrahimi mbedtls_printf("This program takes exactly 1 argument\n"); 46*62c56f98SSadaf Ebrahimi usage(); 47*62c56f98SSadaf Ebrahimi mbedtls_exit(exit_code); 48*62c56f98SSadaf Ebrahimi } 49*62c56f98SSadaf Ebrahimi 50*62c56f98SSadaf Ebrahimi fp = fopen(argv[1], "r"); 51*62c56f98SSadaf Ebrahimi if (fp == NULL) { 52*62c56f98SSadaf Ebrahimi mbedtls_printf("Could not open file '%s'\n", argv[1]); 53*62c56f98SSadaf Ebrahimi mbedtls_exit(exit_code); 54*62c56f98SSadaf Ebrahimi } 55*62c56f98SSadaf Ebrahimi 56*62c56f98SSadaf Ebrahimi while ((c = fgetc(fp)) != EOF && p < end - 1) { 57*62c56f98SSadaf Ebrahimi *p++ = (char) c; 58*62c56f98SSadaf Ebrahimi } 59*62c56f98SSadaf Ebrahimi *p = '\0'; 60*62c56f98SSadaf Ebrahimi 61*62c56f98SSadaf Ebrahimi if (p - buf != 0) { 62*62c56f98SSadaf Ebrahimi mbedtls_printf("%s\n", buf); 63*62c56f98SSadaf Ebrahimi exit_code = MBEDTLS_EXIT_SUCCESS; 64*62c56f98SSadaf Ebrahimi } else { 65*62c56f98SSadaf Ebrahimi mbedtls_printf("The file is empty!\n"); 66*62c56f98SSadaf Ebrahimi } 67*62c56f98SSadaf Ebrahimi 68*62c56f98SSadaf Ebrahimi fclose(fp); 69*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(buf, sizeof(buf)); 70*62c56f98SSadaf Ebrahimi 71*62c56f98SSadaf Ebrahimi mbedtls_exit(exit_code); // GDB_BREAK_HERE -- don't remove this comment! 72*62c56f98SSadaf Ebrahimi } 73