Add a callback for platform faults in platform_util.c

Signed-off-by: Andrzej Kurek <andrzej.kurek@arm.com>
diff --git a/include/mbedtls/config.h b/include/mbedtls/config.h
index 0e539be..dce8f48 100644
--- a/include/mbedtls/config.h
+++ b/include/mbedtls/config.h
@@ -2952,6 +2952,18 @@
 //#define MBEDTLS_MEMORY_BUFFER_ALLOC_C
 
 /**
+ * \def MBEDTLS_PLATFORM_FAULT_CALLBACKS
+ *
+ * Uncomment to provide your own alternate implementation for mbedtls_platform_fault(),
+ * used in library/platform_util.c to signal a fault injection in either
+ * mbedtls_platform_memcpy or mbedtls_platform_memset.
+ *
+ * You will need to provide a header "platform_fault.h" and an implementation at
+ * compile time.
+ */
+//#define MBEDTLS_PLATFORM_FAULT_CALLBACKS
+
+/**
  * \def MBEDTLS_NET_C
  *
  * Enable the TCP and UDP over IPv6/IPv4 networking routines.
diff --git a/library/platform_util.c b/library/platform_util.c
index 19ba7b9..ecfdb84 100644
--- a/library/platform_util.c
+++ b/library/platform_util.c
@@ -48,6 +48,12 @@
 #include "mbedtls/entropy_poll.h"
 #endif
 
+#if defined(MBEDTLS_PLATFORM_FAULT_CALLBACKS)
+#include "platform_fault.h"
+#else
+static void mbedtls_platform_fault(){}
+#endif
+
 #include <stddef.h>
 #include <string.h>
 
@@ -167,7 +173,7 @@
             return ptr;
         }
     }
-
+    mbedtls_platform_fault();
     return NULL;
 }
 
@@ -207,6 +213,7 @@
             return dst;
         }
     }
+    mbedtls_platform_fault();
     return NULL;
 }
 
diff --git a/library/version_features.c b/library/version_features.c
index b0e1637..8044dc9 100644
--- a/library/version_features.c
+++ b/library/version_features.c
@@ -729,6 +729,9 @@
 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
     "MBEDTLS_MEMORY_BUFFER_ALLOC_C",
 #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
+#if defined(MBEDTLS_PLATFORM_FAULT_CALLBACKS)
+    "MBEDTLS_PLATFORM_FAULT_CALLBACKS",
+#endif /* MBEDTLS_PLATFORM_FAULT_CALLBACKS */
 #if defined(MBEDTLS_NET_C)
     "MBEDTLS_NET_C",
 #endif /* MBEDTLS_NET_C */
diff --git a/programs/ssl/query_config.c b/programs/ssl/query_config.c
index bc6499d..e86fdb5 100644
--- a/programs/ssl/query_config.c
+++ b/programs/ssl/query_config.c
@@ -1986,6 +1986,14 @@
     }
 #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
 
+#if defined(MBEDTLS_PLATFORM_FAULT_CALLBACKS)
+    if( strcmp( "MBEDTLS_PLATFORM_FAULT_CALLBACKS", config ) == 0 )
+    {
+        MACRO_EXPANSION_TO_STR( MBEDTLS_PLATFORM_FAULT_CALLBACKS );
+        return( 0 );
+    }
+#endif /* MBEDTLS_PLATFORM_FAULT_CALLBACKS */
+
 #if defined(MBEDTLS_NET_C)
     if( strcmp( "MBEDTLS_NET_C", config ) == 0 )
     {
diff --git a/scripts/config.pl b/scripts/config.pl
index 0a65ef4..82d7113 100755
--- a/scripts/config.pl
+++ b/scripts/config.pl
@@ -146,6 +146,7 @@
 MBEDTLS_SSL_TRANSFORM_OPTIMIZE_CIPHERS
 MBEDTLS_VALIDATE_SSL_KEYS_INTEGRITY
 MBEDTLS_OPTIMIZE_TINYCRYPT_ASM
+MBEDTLS_PLATFORM_FAULT_CALLBACKS
 _ALT\s*$
 );