Add FI/SCA compliant versions of mem-functions

Add FI/SCA compliant memset, memcmp and memcpy-functions
to platform_util. Also add a stub implementation of a global
RNG-function.
diff --git a/library/platform_util.c b/library/platform_util.c
index 6f6d8b6..73759cd 100644
--- a/library/platform_util.c
+++ b/library/platform_util.c
@@ -79,6 +79,71 @@
 }
 #endif /* MBEDTLS_PLATFORM_ZEROIZE_ALT */
 
+void mbedtls_platform_memset( void *ptr, int value, size_t num )
+{
+    /* Randomize start offset. */
+    size_t startOffset = mbedtls_random_in_range( num );
+    /* Randomize data */
+    size_t data = mbedtls_random_in_range( 0xff );
+
+    /* Perform a pair of memset operations from random locations with
+     * random data */
+    memset( ( void * ) ( ptr + startOffset ), value, ( num - startOffset ) );
+    memset( ( void * ) ptr, data, startOffset );
+
+    /* Perform the original memset */
+    memset( ptr, value, num );
+}
+
+void mbedtls_platform_memcpy( void *dst, const void *src, size_t num )
+{
+    /* Randomize start offset. */
+    size_t startOffset = mbedtls_random_in_range( num );
+    /* Randomize initial data to prevent leakage while copying */
+    size_t data = mbedtls_random_in_range( 0xff );
+
+    memset( ( void * ) dst, data, num );
+    memcpy( ( void * ) ( ( unsigned char * ) dst + startOffset ),
+            ( void * ) ( ( unsigned char * ) src + startOffset ),
+            ( num - startOffset ) );
+    memcpy( ( void * ) dst, ( void * ) src, startOffset );
+}
+
+int mbedtls_platform_memcmp( const void *buf1, const void *buf2, size_t num )
+{
+    volatile unsigned int equal = 0;
+
+    size_t i = num;
+
+    size_t startOffset = mbedtls_random_in_range( num );
+
+    for( i = startOffset; i < num; i++ )
+    {
+        equal += ( ( ( unsigned char * ) buf1 )[i] ==
+                   ( ( unsigned char * ) buf2 )[i] );
+    }
+
+    for( i = 0; i < startOffset; i++ )
+    {
+        equal += ( ( ( unsigned char * ) buf1 )[i] ==
+                   ( ( unsigned char * ) buf2 )[i] );
+    }
+
+    if ( equal == num )
+    {
+        return 0;
+    }
+
+    return 1;
+}
+
+//TODO: This is a stub implementation of the global RNG function.
+size_t mbedtls_random_in_range( size_t num )
+{
+    (void) num;
+    return 0;
+}
+
 #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT)
 #include <time.h>
 #if !defined(_WIN32) && (defined(unix) || \