Add macro for error code addition

Adds a macro (`MBEDTLS_ERR_ADD`) to add error codes together and check that the
result will not be corrupted. This additional check is only enabled during
testing when `MBEDTLS_TEST_HOOKS` is defined.

Also includes a reference usage example in `rsa.c` where two high-level error
codes could be incorrectly added together under the right conditions. This now
ensures that when this error occurs during testing it will be correctly
reported.

Signed-off-by: Chris Jones <christopher.jones@arm.com>
diff --git a/library/error.c b/library/error.c
index 901a369..486afed 100644
--- a/library/error.c
+++ b/library/error.c
@@ -210,6 +210,13 @@
 #include "mbedtls/xtea.h"
 #endif
 
+#if defined(MBEDTLS_TEST_HOOKS)
+int mbedtls_err_add( int high, int low, const char *file, int line ) {
+    if( mbedtls_test_err_add_hook != NULL )
+        (*mbedtls_test_err_add_hook)( high, low, file, line );
+    return ( high + low );
+}
+#endif
 
 const char * mbedtls_high_level_strerr( int error_code )
 {
diff --git a/library/rsa.c b/library/rsa.c
index fea76bf..f4bec46 100644
--- a/library/rsa.c
+++ b/library/rsa.c
@@ -1085,7 +1085,7 @@
     mbedtls_mpi_free( &I );
 
     if( ret != 0 && ret >= -0x007f )
-        return( MBEDTLS_ERR_RSA_PRIVATE_FAILED + ret );
+        return( MBEDTLS_ERR_ADD( MBEDTLS_ERR_RSA_PRIVATE_FAILED, ret ) );
 
     return( ret );
 }