Add new error code PLATFORM_ALLOC_FAILED for mbedtls_platform_memmove()

Signed-off-by: Piotr Nowicki <piotr.nowicki@arm.com>
diff --git a/include/mbedtls/error.h b/include/mbedtls/error.h
index a52f9f5..9696f17 100644
--- a/include/mbedtls/error.h
+++ b/include/mbedtls/error.h
@@ -86,7 +86,7 @@
  * CHACHA20  3                  0x0051-0x0055
  * POLY1305  3                  0x0057-0x005B
  * CHACHAPOLY 2 0x0054-0x0056
- * PLATFORM  3  0x0070-0x0072   0x0071-0x0071
+ * PLATFORM  4  0x0070-0x0072   0x0071-0x0071 0x0076-0x0076
  *
  * High-level module nr (3 bits - 0x0...-0x7...)
  * Name      ID  Nr of Errors
diff --git a/include/mbedtls/nist_kw.h b/include/mbedtls/nist_kw.h
index 3b67b59..c94c15a 100644
--- a/include/mbedtls/nist_kw.h
+++ b/include/mbedtls/nist_kw.h
@@ -133,6 +133,7 @@
  *
  * \return          \c 0 on success.
  * \return          \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for invalid input length.
+ * \return          \c MBEDTLS_ERR_PLATFORM_ALLOC_FAILED in case of a memory allocation failure.
  * \return          cipher-specific error code on failure of the underlying cipher.
  */
 int mbedtls_nist_kw_wrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode,
diff --git a/include/mbedtls/platform.h b/include/mbedtls/platform.h
index ec1df15..8a88ce7 100644
--- a/include/mbedtls/platform.h
+++ b/include/mbedtls/platform.h
@@ -42,6 +42,7 @@
 #define MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED     -0x0070 /**< Hardware accelerator failed */
 #define MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED -0x0072 /**< The requested feature is not supported by the platform */
 #define MBEDTLS_ERR_PLATFORM_FAULT_DETECTED      -0x0071 /**< A hardware fault was detected in a critical path. As a security precaution this should be treated as a potential physical attack */
+#define MBEDTLS_ERR_PLATFORM_ALLOC_FAILED        -0x0076 /**< Memory allocation failed */
 
 #if defined(MBEDTLS_PLATFORM_C)
 
diff --git a/include/mbedtls/platform_util.h b/include/mbedtls/platform_util.h
index d05c3c7..4e0f989 100644
--- a/include/mbedtls/platform_util.h
+++ b/include/mbedtls/platform_util.h
@@ -209,8 +209,8 @@
  * \param src   Source buffer where the data is being moved from.
  * \param num   The length of the buffers in bytes.
  *
- * \return      0 if the operation was successful or -1 if memory allocation
- *              failed.
+ * \return      0 if the operation was successful
+ * \return      #MBEDTLS_ERR_PLATFORM_ALLOC_FAILED if a memory allocation failed
  */
 int mbedtls_platform_memmove( void *dst, const void *src, size_t num );
 
diff --git a/library/bignum.c b/library/bignum.c
index 2cc8e22..f4ab0db 100644
--- a/library/bignum.c
+++ b/library/bignum.c
@@ -558,11 +558,7 @@
         length++;
     } while( mbedtls_mpi_cmp_int( X, 0 ) != 0 );
 
-    if( 0 != mbedtls_platform_memmove( *p, p_end, length ) )
-    {
-        ret = MBEDTLS_ERR_MPI_ALLOC_FAILED;
-        goto cleanup;
-    }
+    MBEDTLS_MPI_CHK( mbedtls_platform_memmove( *p, p_end, length ) );
     *p += length;
 
 cleanup:
diff --git a/library/error.c b/library/error.c
index ecdec78..893de7f 100644
--- a/library/error.c
+++ b/library/error.c
@@ -843,6 +843,8 @@
         mbedtls_snprintf( buf, buflen, "PLATFORM - The requested feature is not supported by the platform" );
     if( use_ret == -(MBEDTLS_ERR_PLATFORM_FAULT_DETECTED) )
         mbedtls_snprintf( buf, buflen, "PLATFORM - A hardware fault was detected in a critical path. As a security precaution this should be treated as a potential physical attack" );
+    if( use_ret == -(MBEDTLS_ERR_PLATFORM_ALLOC_FAILED) )
+        mbedtls_snprintf( buf, buflen, "PLATFORM - Memory allocation failed" );
 #endif /* MBEDTLS_PLATFORM_C */
 
 #if defined(MBEDTLS_POLY1305_C)
diff --git a/library/nist_kw.c b/library/nist_kw.c
index 5b5aa1c..2f7f082 100644
--- a/library/nist_kw.c
+++ b/library/nist_kw.c
@@ -222,9 +222,10 @@
         }
 
         mbedtls_platform_memcpy( output, NIST_KW_ICV1, KW_SEMIBLOCK_LENGTH );
-        if( 0 != mbedtls_platform_memmove( output + KW_SEMIBLOCK_LENGTH, input, in_len ) )
+        ret = mbedtls_platform_memmove( output + KW_SEMIBLOCK_LENGTH, input, in_len );
+        if( ret != 0 )
         {
-            return MBEDTLS_ERR_CIPHER_ALLOC_FAILED;
+            return ret;
         }
     }
     else
@@ -346,10 +347,11 @@
     }
 
     mbedtls_platform_memcpy( A, input, KW_SEMIBLOCK_LENGTH );
-    if( 0 != mbedtls_platform_memmove( output, input + KW_SEMIBLOCK_LENGTH,
-                                       ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH ) )
+    ret = mbedtls_platform_memmove( output, input + KW_SEMIBLOCK_LENGTH,
+                                       ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH );
+    if( ret != 0 )
     {
-        return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED );
+        return ret;
     }
 
     /* Calculate intermediate values */
diff --git a/library/pk.c b/library/pk.c
index f2df7db..cf4cfbb 100644
--- a/library/pk.c
+++ b/library/pk.c
@@ -623,15 +623,17 @@
                               size_t n_len )
 {
     size_t len = 0;
+    int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
 
     if( (size_t)( *p - start ) < n_len )
         return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
 
     len = n_len;
     *p -= len;
-    if( 0 != mbedtls_platform_memmove( *p, start, len ) )
+    ret = mbedtls_platform_memmove( *p, start, len );
+    if( ret != 0 )
     {
-        return( MBEDTLS_ERR_PK_ALLOC_FAILED );
+        return( ret );
     }
 
     /* ASN.1 DER encoding requires minimal length, so skip leading 0s.
@@ -694,11 +696,11 @@
     *--p = MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
     len += 2;
 
-    if( 0 != mbedtls_platform_memmove( sig, p, len ) )
+    ret = mbedtls_platform_memmove( sig, p, len );
+    if( ret != 0 )
     {
-        return( MBEDTLS_ERR_PK_ALLOC_FAILED );
+        return( ret );
     }
-    ret = 0;
     *sig_len = len;
 
     return( ret );
diff --git a/library/platform_util.c b/library/platform_util.c
index 694e23a..17913b4 100644
--- a/library/platform_util.c
+++ b/library/platform_util.c
@@ -141,7 +141,7 @@
         return 0;
     }
 
-    return -1;
+    return MBEDTLS_ERR_PLATFORM_ALLOC_FAILED;
 }
 
 int mbedtls_platform_memcmp( const void *buf1, const void *buf2, size_t num )