- mpi_init() and mpi_free() only accept a single argument and do not accept variable arguments anymore. This prevents unexpected memory corruption in a number of use cases.

diff --git a/ChangeLog b/ChangeLog
index 88db5f3..a084e55 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,6 +13,8 @@
      instead of int for buffer lengths and loop variables for
 	 better unsigned / signed use. Renamed internal bigint types
 	 t_int and t_dbl to t_uint and t_udbl in the process
+   * mpi_init() and mpi_free() now only accept a single MPI
+     argument and do not accept variable argument lists anymore.
 
 = Version 0.99-pre4 released on 2011-04-01
 Features
diff --git a/include/polarssl/bignum.h b/include/polarssl/bignum.h
index a6d7d4a..3800967 100644
--- a/include/polarssl/bignum.h
+++ b/include/polarssl/bignum.h
@@ -92,14 +92,18 @@
 #endif
 
 /**
- * \brief          Initialize one or more mpi
+ * \brief           Initialize one MPI
+ *
+ * \param X         One MPI to initialize.
  */
-void mpi_init( mpi *X, ... );
+void mpi_init( mpi *X );
 
 /**
- * \brief          Unallocate one or more mpi
+ * \brief          Unallocate one MPI
+ *
+ * \param X        One MPI to unallocate.
  */
-void mpi_free( mpi *X, ... );
+void mpi_free( mpi *X );
 
 /**
  * \brief          Enlarge to the specified number of limbs
diff --git a/library/bignum.c b/library/bignum.c
index 2b6e234..2e3595c 100644
--- a/library/bignum.c
+++ b/library/bignum.c
@@ -38,7 +38,6 @@
 #include "polarssl/bn_mul.h"
 
 #include <stdlib.h>
-#include <stdarg.h>
 
 #define ciL    (sizeof(t_uint))         /* chars in limb  */
 #define biL    (ciL << 3)               /* bits  in limb  */
@@ -51,51 +50,35 @@
 #define CHARS_TO_LIMBS(i) (((i) + ciL - 1) / ciL)
 
 /*
- * Initialize one or more mpi
+ * Initialize one MPI
  */
-void mpi_init( mpi *X, ... )
+void mpi_init( mpi *X )
 {
-    va_list args;
+    if( X == NULL )
+        return;
 
-    va_start( args, X );
-
-    while( X != NULL )
-    {
-        X->s = 1;
-        X->n = 0;
-        X->p = NULL;
-
-        X = va_arg( args, mpi* );
-    }
-
-    va_end( args );
+    X->s = 1;
+    X->n = 0;
+    X->p = NULL;
 }
 
 /*
- * Unallocate one or more mpi
+ * Unallocate one MPI
  */
-void mpi_free( mpi *X, ... )
+void mpi_free( mpi *X )
 {
-    va_list args;
+    if( X == NULL )
+        return;
 
-    va_start( args, X );
-
-    while( X != NULL )
+    if( X->p != NULL )
     {
-        if( X->p != NULL )
-        {
-            memset( X->p, 0, X->n * ciL );
-            free( X->p );
-        }
-
-        X->s = 1;
-        X->n = 0;
-        X->p = NULL;
-
-        X = va_arg( args, mpi* );
+        memset( X->p, 0, X->n * ciL );
+        free( X->p );
     }
 
-    va_end( args );
+    X->s = 1;
+    X->n = 0;
+    X->p = NULL;
 }
 
 /*
@@ -258,7 +241,7 @@
     if( radix < 2 || radix > 16 )
         return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
 
-    mpi_init( &T, NULL );
+    mpi_init( &T );
 
     slen = strlen( s );
 
@@ -309,7 +292,7 @@
 
 cleanup:
 
-    mpi_free( &T, NULL );
+    mpi_free( &T );
 
     return( ret );
 }
@@ -366,7 +349,7 @@
     }
 
     p = s;
-    mpi_init( &T, NULL );
+    mpi_init( &T );
 
     if( X->s == -1 )
         *p++ = '-';
@@ -405,7 +388,7 @@
 
 cleanup:
 
-    mpi_free( &T, NULL );
+    mpi_free( &T );
 
     return( ret );
 }
@@ -771,7 +754,7 @@
     if( mpi_cmp_abs( A, B ) < 0 )
         return( POLARSSL_ERR_MPI_NEGATIVE_VALUE );
 
-    mpi_init( &TB, NULL );
+    mpi_init( &TB );
 
     if( X == B )
     {
@@ -797,7 +780,7 @@
 
 cleanup:
 
-    mpi_free( &TB, NULL );
+    mpi_free( &TB );
 
     return( ret );
 }
@@ -969,7 +952,7 @@
     size_t i, j;
     mpi TA, TB;
 
-    mpi_init( &TA, &TB, NULL );
+    mpi_init( &TA ); mpi_init( &TB );
 
     if( X == A ) { MPI_CHK( mpi_copy( &TA, A ) ); A = &TA; }
     if( X == B ) { MPI_CHK( mpi_copy( &TB, B ) ); B = &TB; }
@@ -992,7 +975,7 @@
 
 cleanup:
 
-    mpi_free( &TB, &TA, NULL );
+    mpi_free( &TB ); mpi_free( &TA );
 
     return( ret );
 }
@@ -1025,7 +1008,8 @@
     if( mpi_cmp_int( B, 0 ) == 0 )
         return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
 
-    mpi_init( &X, &Y, &Z, &T1, &T2, NULL );
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
+    mpi_init( &T1 ); mpi_init( &T2 );
 
     if( mpi_cmp_abs( A, B ) < 0 )
     {
@@ -1170,7 +1154,8 @@
 
 cleanup:
 
-    mpi_free( &X, &Y, &Z, &T1, &T2, NULL );
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
+    mpi_free( &T1 ); mpi_free( &T2 );
 
     return( ret );
 }
@@ -1363,7 +1348,7 @@
      * Init temps and window size
      */
     mpi_montg_init( &mm, N );
-    mpi_init( &RR, &T, NULL );
+    mpi_init( &RR ); mpi_init( &T );
     memset( W, 0, sizeof( W ) );
 
     i = mpi_msb( E );
@@ -1514,11 +1499,12 @@
 cleanup:
 
     for( i = (one << (wsize - 1)); i < (one << wsize); i++ )
-        mpi_free( &W[i], NULL );
+        mpi_free( &W[i] );
 
-    if( _RR != NULL )
-         mpi_free( &W[1], &T, NULL );
-    else mpi_free( &W[1], &T, &RR, NULL );
+    mpi_free( &W[1] ); mpi_free( &T );
+
+    if( _RR == NULL )
+        mpi_free( &RR );
 
     return( ret );
 }
@@ -1532,7 +1518,7 @@
     size_t lz, lzt;
     mpi TG, TA, TB;
 
-    mpi_init( &TG, &TA, &TB, NULL );
+    mpi_init( &TG ); mpi_init( &TA ); mpi_init( &TB );
 
     MPI_CHK( mpi_copy( &TA, A ) );
     MPI_CHK( mpi_copy( &TB, B ) );
@@ -1570,7 +1556,7 @@
 
 cleanup:
 
-    mpi_free( &TB, &TA, &TG, NULL );
+    mpi_free( &TG ); mpi_free( &TA ); mpi_free( &TB );
 
     return( ret );
 }
@@ -1605,8 +1591,9 @@
     if( mpi_cmp_int( N, 0 ) <= 0 )
         return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
 
-    mpi_init( &TA, &TU, &U1, &U2, &G,
-              &TB, &TV, &V1, &V2, NULL );
+    mpi_init( &TA ); mpi_init( &TU ); mpi_init( &U1 ); mpi_init( &U2 );
+    mpi_init( &G ); mpi_init( &TB ); mpi_init( &TV );
+    mpi_init( &V1 ); mpi_init( &V2 );
 
     MPI_CHK( mpi_gcd( &G, A, N ) );
 
@@ -1681,8 +1668,9 @@
 
 cleanup:
 
-    mpi_free( &V2, &V1, &TV, &TB, &G,
-              &U2, &U1, &TU, &TA, NULL );
+    mpi_free( &TA ); mpi_free( &TU ); mpi_free( &U1 ); mpi_free( &U2 );
+    mpi_free( &G ); mpi_free( &TB ); mpi_free( &TV );
+    mpi_free( &V1 ); mpi_free( &V2 );
 
     return( ret );
 }
@@ -1728,7 +1716,8 @@
     if( mpi_cmp_int( X, 2 ) == 0 )
         return( 0 );
 
-    mpi_init( &W, &R, &T, &A, &RR, NULL );
+    mpi_init( &W ); mpi_init( &R ); mpi_init( &T ); mpi_init( &A );
+    mpi_init( &RR );
 
     xs = X->s; X->s = 1;
 
@@ -1821,7 +1810,8 @@
 
     X->s = xs;
 
-    mpi_free( &RR, &A, &T, &R, &W, NULL );
+    mpi_free( &W ); mpi_free( &R ); mpi_free( &T ); mpi_free( &A );
+    mpi_free( &RR );
 
     return( ret );
 }
@@ -1839,7 +1829,7 @@
     if( nbits < 3 || nbits > 4096 )
         return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
 
-    mpi_init( &Y, NULL );
+    mpi_init( &Y );
 
     n = BITS_TO_LIMBS( nbits );
 
@@ -1888,7 +1878,7 @@
 
 cleanup:
 
-    mpi_free( &Y, NULL );
+    mpi_free( &Y );
 
     return( ret );
 }
@@ -1914,7 +1904,8 @@
     int ret, i;
     mpi A, E, N, X, Y, U, V;
 
-    mpi_init( &A, &E, &N, &X, &Y, &U, &V, NULL );
+    mpi_init( &A ); mpi_init( &E ); mpi_init( &N ); mpi_init( &X );
+    mpi_init( &Y ); mpi_init( &U ); mpi_init( &V );
 
     MPI_CHK( mpi_read_string( &A, 16,
         "EFE021C2645FD1DC586E69184AF4A31E" \
@@ -2052,7 +2043,8 @@
     if( ret != 0 && verbose != 0 )
         printf( "Unexpected error, return code = %08X\n", ret );
 
-    mpi_free( &V, &U, &Y, &X, &N, &E, &A, NULL );
+    mpi_free( &A ); mpi_free( &E ); mpi_free( &N ); mpi_free( &X );
+    mpi_free( &Y ); mpi_free( &U ); mpi_free( &V );
 
     if( verbose != 0 )
         printf( "\n" );
diff --git a/library/dhm.c b/library/dhm.c
index 59e78f8..9c8daef 100644
--- a/library/dhm.c
+++ b/library/dhm.c
@@ -74,7 +74,7 @@
     mpi L, U;
     int ret = POLARSSL_ERR_DHM_BAD_INPUT_DATA;
 
-    mpi_init( &L, &U, NULL );
+    mpi_init( &L ); mpi_init( &U );
     mpi_lset( &L, 2 );
     mpi_sub_int( &U, P, 2 );
 
@@ -84,7 +84,7 @@
         ret = 0;
     }
 
-    mpi_free( &L, &U, NULL );
+    mpi_free( &L ); mpi_free( &U );
 
     return( ret );
 }
@@ -270,9 +270,9 @@
  */
 void dhm_free( dhm_context *ctx )
 {
-    mpi_free( &ctx->RP, &ctx->K, &ctx->GY,
-              &ctx->GX, &ctx->X, &ctx->G,
-              &ctx->P, NULL );    
+    mpi_free( &ctx->RP ); mpi_free( &ctx->K ); mpi_free( &ctx->GY );
+    mpi_free( &ctx->GX ); mpi_free( &ctx->X ); mpi_free( &ctx->G );
+    mpi_free( &ctx->P );
 }
 
 #if defined(POLARSSL_SELF_TEST)
diff --git a/library/rsa.c b/library/rsa.c
index 4d3fc4c..3018eb4 100644
--- a/library/rsa.c
+++ b/library/rsa.c
@@ -68,7 +68,7 @@
     if( f_rng == NULL || nbits < 128 || exponent < 3 )
         return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
 
-    mpi_init( &P1, &Q1, &H, &G, NULL );
+    mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
 
     /*
      * find primes P and Q with Q < P so that:
@@ -116,7 +116,7 @@
 
 cleanup:
 
-    mpi_free( &G, &H, &Q1, &P1, NULL );
+    mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
 
     if( ret != 0 )
     {
@@ -166,7 +166,9 @@
     if( !ctx->P.p || !ctx->Q.p || !ctx->D.p )
         return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
 
-    mpi_init( &PQ, &DE, &P1, &Q1, &H, &I, &G, &G2, &L1, &L2, NULL );
+    mpi_init( &PQ ); mpi_init( &DE ); mpi_init( &P1 ); mpi_init( &Q1 );
+    mpi_init( &H  ); mpi_init( &I  ); mpi_init( &G  ); mpi_init( &G2 );
+    mpi_init( &L1 ); mpi_init( &L2 );
 
     MPI_CHK( mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) );
     MPI_CHK( mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) );
@@ -182,20 +184,25 @@
     /*
      * Check for a valid PKCS1v2 private key
      */
-    if( mpi_cmp_mpi( &PQ, &ctx->N ) == 0 &&
-        mpi_cmp_int( &L2, 0 ) == 0 &&
-        mpi_cmp_int( &I, 1 ) == 0 &&
-        mpi_cmp_int( &G, 1 ) == 0 )
+    if( mpi_cmp_mpi( &PQ, &ctx->N ) != 0 ||
+        mpi_cmp_int( &L2, 0 ) != 0 ||
+        mpi_cmp_int( &I, 1 ) != 0 ||
+        mpi_cmp_int( &G, 1 ) != 0 )
     {
-        mpi_free( &G, &I, &H, &Q1, &P1, &DE, &PQ, &G2, &L1, &L2, NULL );
-        return( 0 );
+        ret = POLARSSL_ERR_RSA_KEY_CHECK_FAILED;
     }
 
     
 cleanup:
 
-    mpi_free( &G, &I, &H, &Q1, &P1, &DE, &PQ, &G2, &L1, &L2, NULL );
-    return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED | ret );
+    mpi_free( &PQ ); mpi_free( &DE ); mpi_free( &P1 ); mpi_free( &Q1 );
+    mpi_free( &H  ); mpi_free( &I  ); mpi_free( &G  ); mpi_free( &G2 );
+    mpi_free( &L1 ); mpi_free( &L2 );
+
+    if( ret != 0 )
+        return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED | ret );
+
+    return( 0 );
 }
 
 /*
@@ -209,13 +216,13 @@
     size_t olen;
     mpi T;
 
-    mpi_init( &T, NULL );
+    mpi_init( &T );
 
     MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
 
     if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
     {
-        mpi_free( &T, NULL );
+        mpi_free( &T );
         return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
     }
 
@@ -225,7 +232,7 @@
 
 cleanup:
 
-    mpi_free( &T, NULL );
+    mpi_free( &T );
 
     if( ret != 0 )
         return( POLARSSL_ERR_RSA_PUBLIC_FAILED | ret );
@@ -244,13 +251,13 @@
     size_t olen;
     mpi T, T1, T2;
 
-    mpi_init( &T, &T1, &T2, NULL );
+    mpi_init( &T ); mpi_init( &T1 ); mpi_init( &T2 );
 
     MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
 
     if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
     {
-        mpi_free( &T, NULL );
+        mpi_free( &T );
         return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
     }
 
@@ -285,7 +292,7 @@
 
 cleanup:
 
-    mpi_free( &T, &T1, &T2, NULL );
+    mpi_free( &T ); mpi_free( &T1 ); mpi_free( &T2 );
 
     if( ret != 0 )
         return( POLARSSL_ERR_RSA_PRIVATE_FAILED | ret );
@@ -1006,10 +1013,10 @@
  */
 void rsa_free( rsa_context *ctx )
 {
-    mpi_free( &ctx->RQ, &ctx->RP, &ctx->RN,
-              &ctx->QP, &ctx->DQ, &ctx->DP,
-              &ctx->Q,  &ctx->P,  &ctx->D,
-              &ctx->E,  &ctx->N,  NULL );
+    mpi_free( &ctx->RQ ); mpi_free( &ctx->RP ); mpi_free( &ctx->RN );
+    mpi_free( &ctx->QP ); mpi_free( &ctx->DQ ); mpi_free( &ctx->DP );
+    mpi_free( &ctx->Q  ); mpi_free( &ctx->P  ); mpi_free( &ctx->D );
+    mpi_free( &ctx->E  ); mpi_free( &ctx->N  );
 }
 
 #if defined(POLARSSL_SELF_TEST)
diff --git a/programs/pkey/dh_genprime.c b/programs/pkey/dh_genprime.c
index 72a2916..840a569 100644
--- a/programs/pkey/dh_genprime.c
+++ b/programs/pkey/dh_genprime.c
@@ -49,7 +49,7 @@
     havege_state hs;
     FILE *fout;
 
-    mpi_init( &G, &P, &Q, NULL );
+    mpi_init( &G ); mpi_init( &P ); mpi_init( &Q );
     mpi_read_string( &G, 10, GENERATOR );
 
     printf( "\n  . Seeding the random number generator..." );
@@ -113,7 +113,7 @@
 
 exit:
 
-    mpi_free( &Q, &P, &G, NULL );
+    mpi_free( &G ); mpi_free( &P ); mpi_free( &Q );
 #else
     printf( "\n  ! Prime-number generation is not available.\n\n" );
 #endif
diff --git a/programs/pkey/mpi_demo.c b/programs/pkey/mpi_demo.c
index 008d334..b29f9a1 100644
--- a/programs/pkey/mpi_demo.c
+++ b/programs/pkey/mpi_demo.c
@@ -35,8 +35,9 @@
 {
     mpi E, P, Q, N, H, D, X, Y, Z;
 
-    mpi_init( &E, &P, &Q, &N, &H,
-              &D, &X, &Y, &Z, NULL );
+    mpi_init( &E ); mpi_init( &P ); mpi_init( &Q ); mpi_init( &N );
+    mpi_init( &H ); mpi_init( &D ); mpi_init( &X ); mpi_init( &Y );
+    mpi_init( &Z );
 
     mpi_read_string( &P, 10, "2789" );
     mpi_read_string( &Q, 10, "3203" );
@@ -69,8 +70,9 @@
     mpi_write_file( "  Z (decrypted)  = Y^D mod N = ", &Z, 10, NULL );
     printf( "\n" );
 
-    mpi_free( &Z, &Y, &X, &D, &H,
-              &N, &Q, &P, &E, NULL );
+    mpi_free( &E ); mpi_free( &P ); mpi_free( &Q ); mpi_free( &N );
+    mpi_free( &H ); mpi_free( &D ); mpi_free( &X ); mpi_free( &Y );
+    mpi_free( &Z );
 
 #ifdef WIN32
     printf( "  Press Enter to exit this program.\n" );
diff --git a/tests/suites/test_suite_debug.function b/tests/suites/test_suite_debug.function
index 4efa1e9..0172de6 100644
--- a/tests/suites/test_suite_debug.function
+++ b/tests/suites/test_suite_debug.function
@@ -45,7 +45,7 @@
     struct buffer_data buffer;
     mpi val;
 
-    mpi_init( &val, NULL );
+    mpi_init( &val );
 
     memset( &ssl, 0, sizeof( ssl_context ) );
     memset( buffer.buf, 0, 2000 );
@@ -57,6 +57,8 @@
     debug_print_mpi( &ssl, 0, {file}, {line}, {prefix}, &val);
 
     TEST_ASSERT( strcmp( buffer.buf, {result_str} ) == 0 );
+
+    mpi_free( &val );
 }
 END_CASE
 
diff --git a/tests/suites/test_suite_mpi.function b/tests/suites/test_suite_mpi.function
index 7755ab2..c31589e 100644
--- a/tests/suites/test_suite_mpi.function
+++ b/tests/suites/test_suite_mpi.function
@@ -18,7 +18,7 @@
     char str[1000];
     size_t len = {output_size};
 
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == {result_read} );
     if( {result_read} == 0 )
@@ -29,6 +29,8 @@
             TEST_ASSERT( strcasecmp( str, {input_A} ) == 0 );
         }
     }
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -41,13 +43,15 @@
     size_t len = 1000;
     size_t input_len;
 
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     input_len = unhexify( buf, {input_X} );
 
     TEST_ASSERT( mpi_read_binary( &X, buf, input_len ) == 0 );
     TEST_ASSERT( mpi_write_string( &X, {radix_A}, (char *) str, &len ) == 0 );
     TEST_ASSERT( strcmp( (char *) str, {input_A} ) == 0 );
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -62,7 +66,7 @@
     memset( buf, 0x00, 1000 );
     memset( str, 0x00, 1000 );
 
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     
@@ -77,6 +81,8 @@
 
         TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
     }
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -92,7 +98,7 @@
     memset( buf, 0x00, 1000 );
     memset( str, 0x00, 1000 );
 
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     file = fopen( {input_file}, "r" );
     TEST_ASSERT( mpi_read_file( &X, {radix_X}, file ) == {result} );
@@ -107,6 +113,8 @@
 
         TEST_ASSERT( strcasecmp( (char *) str, {input_A} ) == 0 );
     }
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -116,7 +124,7 @@
     mpi X, Y;
     FILE *file_out, *file_in;
 
-    mpi_init( &X, &Y, NULL );
+    mpi_init( &X ); mpi_init( &Y );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
 
@@ -129,6 +137,8 @@
     fclose(file_in);
 
     TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y );
 }
 END_CASE
 
@@ -136,10 +146,12 @@
 mpi_lsb:radix_X:input_X:nr_bits
 {
     mpi X;
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_lsb( &X ) == {nr_bits} );
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -147,10 +159,12 @@
 mpi_msb:radix_X:input_X:nr_bits
 {
     mpi X;
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_msb( &X ) == {nr_bits} );
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -158,13 +172,15 @@
 mpi_gcd:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
 {
     mpi A, X, Y, Z;
-    mpi_init(&A, &X, &Y, &Z, NULL);
+    mpi_init( &A ); mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
+
+    mpi_free( &A ); mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z );
 }
 END_CASE
 
@@ -172,10 +188,12 @@
 mpi_cmp_int:input_X:input_A:result_CMP
 {
     mpi X;
-    mpi_init(&X, NULL);
+    mpi_init( &X  );
 
     TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0);
     TEST_ASSERT( mpi_cmp_int( &X, {input_A} ) == {result_CMP});
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -183,11 +201,13 @@
 mpi_cmp_mpi:radix_X:input_X:radix_Y:input_Y:input_A
 {
     mpi X, Y;
-    mpi_init(&X, &Y, NULL);
+    mpi_init( &X ); mpi_init( &Y );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == {input_A} );
+
+    mpi_free( &X ); mpi_free( &Y );
 }
 END_CASE
 
@@ -195,11 +215,13 @@
 mpi_cmp_abs:radix_X:input_X:radix_Y:input_Y:input_A
 {
     mpi X, Y;
-    mpi_init(&X, &Y, NULL);
+    mpi_init( &X ); mpi_init( &Y );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == {input_A} );
+
+    mpi_free( &X ); mpi_free( &Y );
 }
 END_CASE
 
@@ -207,7 +229,7 @@
 mpi_copy:input_X:input_A
 {
     mpi X, Y, A;
-    mpi_init(&X, &Y, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
 
     TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
     TEST_ASSERT( mpi_lset( &Y, {input_A} ) == 0 );
@@ -217,6 +239,8 @@
     TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
 }
 END_CASE
 
@@ -224,11 +248,13 @@
 mpi_copy_self:input_X
 {
     mpi X;
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
     TEST_ASSERT( mpi_copy( &X, &X ) == 0 );
     TEST_ASSERT( mpi_cmp_int( &X, {input_X} ) == 0 );
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -236,7 +262,7 @@
 mpi_swap:input_X:input_Y
 {
     mpi X, Y, A;
-    mpi_init(&X, &Y, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
 
     TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
     TEST_ASSERT( mpi_lset( &Y, {input_Y} ) == 0 );
@@ -246,6 +272,8 @@
     mpi_swap( &X, &Y );
     TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
 }
 END_CASE
 
@@ -253,13 +281,15 @@
 mpi_add_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
 {
     mpi X, Y, Z, A;
-    mpi_init(&X, &Y, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -267,13 +297,15 @@
 mpi_add_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
 {
     mpi X, Y, Z, A;
-    mpi_init(&X, &Y, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -281,13 +313,15 @@
 mpi_add_abs_add_first:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
 {
     mpi X, Y, A;
-    mpi_init(&X, &Y, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_add_abs( &X, &X, &Y ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
 }
 END_CASE
 
@@ -295,13 +329,15 @@
 mpi_add_abs_add_second:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
 {
     mpi X, Y, A;
-    mpi_init(&X, &Y, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_add_abs( &Y, &X, &Y ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &A );
 }
 END_CASE
 
@@ -309,12 +345,14 @@
 mpi_add_int:radix_X:input_X:input_Y:radix_A:input_A
 {
     mpi X, Z, A;
-    mpi_init(&X, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_add_int( &Z, &X, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -322,13 +360,15 @@
 mpi_sub_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
 {
     mpi X, Y, Z, A;
-    mpi_init(&X, &Y, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -337,7 +377,7 @@
 {
     mpi X, Y, Z, A;
     int res;
-    mpi_init(&X, &Y, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
@@ -347,6 +387,8 @@
     TEST_ASSERT( res == {sub_result} );
     if( res == 0 )
         TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -354,12 +396,14 @@
 mpi_sub_int:radix_X:input_X:input_Y:radix_A:input_A
 {
     mpi X, Z, A;
-    mpi_init(&X, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_sub_int( &Z, &X, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -367,13 +411,15 @@
 mpi_mul_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
 {
     mpi X, Y, Z, A;
-    mpi_init(&X, &Y, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -381,12 +427,14 @@
 mpi_mul_int:radix_X:input_X:input_Y:radix_A:input_A:result_comparison
 {
     mpi X, Z, A;
-    mpi_init(&X, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_mul_int( &Z, &X, {input_Y} ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) {result_comparison} 0 );
+
+    mpi_free( &X ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -395,7 +443,8 @@
 {
     mpi X, Y, Q, R, A, B;
     int res;
-    mpi_init(&X, &Y, &Q, &R, &A, &B, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Q ); mpi_init( &R );
+    mpi_init( &A ); mpi_init( &B );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
@@ -408,6 +457,9 @@
         TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
         TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
     }
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Q ); mpi_free( &R );
+    mpi_free( &A ); mpi_free( &B );
 }
 END_CASE
 
@@ -416,7 +468,8 @@
 {
     mpi X, Q, R, A, B;
     int res;
-    mpi_init(&X, &Q, &R, &A, &B, NULL);
+    mpi_init( &X ); mpi_init( &Q ); mpi_init( &R ); mpi_init( &A );
+    mpi_init( &B );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
@@ -428,6 +481,9 @@
         TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
         TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
     }
+
+    mpi_free( &X ); mpi_free( &Q ); mpi_free( &R ); mpi_free( &A );
+    mpi_free( &B );
 }
 END_CASE
 
@@ -436,7 +492,7 @@
 {
     mpi X, Y, Z, A;
     int res;
-    mpi_init(&X, &Y, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
@@ -447,6 +503,8 @@
     {
         TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
     }
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -456,7 +514,7 @@
     mpi X;
     int res;
     t_uint r;
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     res = mpi_mod_int( &r, &X, {input_Y} );
@@ -465,6 +523,8 @@
     {
         TEST_ASSERT( r == {input_A} );
     }
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -473,7 +533,8 @@
 {
     mpi A, E, N, RR, Z, X;
     int res;
-    mpi_init(&A, &E, &N, &RR, &Z, &X, NULL);
+    mpi_init( &A  ); mpi_init( &E ); mpi_init( &N );
+    mpi_init( &RR ); mpi_init( &Z ); mpi_init( &X );
 
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_read_string( &E, {radix_E}, {input_E} ) == 0 );
@@ -489,6 +550,9 @@
     {
         TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
     }
+
+    mpi_free( &A  ); mpi_free( &E ); mpi_free( &N );
+    mpi_free( &RR ); mpi_free( &Z ); mpi_free( &X );
 }
 END_CASE
 
@@ -497,7 +561,7 @@
 {
     mpi X, Y, Z, A;
     int res;
-    mpi_init(&X, &Y, &Z, &A, NULL);
+    mpi_init( &X ); mpi_init( &Y ); mpi_init( &Z ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
@@ -508,6 +572,8 @@
     {
         TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
     }
+
+    mpi_free( &X ); mpi_free( &Y ); mpi_free( &Z ); mpi_free( &A );
 }
 END_CASE
 
@@ -516,11 +582,13 @@
 {
     mpi X;
     int res;
-    mpi_init(&X, NULL);
+    mpi_init( &X );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     res = mpi_is_prime( &X, myrand, NULL );
     TEST_ASSERT( res == {div_result} );
+
+    mpi_free( &X );
 }
 END_CASE
 
@@ -528,12 +596,14 @@
 mpi_shift_l:radix_X:input_X:shift_X:radix_A:input_A
 {
     mpi X, A;
-    mpi_init(&X, &A, NULL);
+    mpi_init( &X ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_shift_l( &X, {shift_X} ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &A );
 }
 END_CASE
 
@@ -541,12 +611,14 @@
 mpi_shift_r:radix_X:input_X:shift_X:radix_A:input_A
 {
     mpi X, A;
-    mpi_init(&X, &A, NULL);
+    mpi_init( &X ); mpi_init( &A );
 
     TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
     TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
     TEST_ASSERT( mpi_shift_r( &X, {shift_X} ) == 0 );
     TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
+
+    mpi_free( &X ); mpi_free( &A );
 }
 END_CASE
 
diff --git a/tests/suites/test_suite_pkcs1_v21.function b/tests/suites/test_suite_pkcs1_v21.function
index aa85f75..53b97b2 100644
--- a/tests/suites/test_suite_pkcs1_v21.function
+++ b/tests/suites/test_suite_pkcs1_v21.function
@@ -58,7 +58,7 @@
     size_t output_len;
     size_t msg_len;
 
-    mpi_init( &P1, &Q1, &H, &G, NULL );
+    mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
     rsa_init( &ctx, RSA_PKCS_V21, {hash} );
 
     memset( message_str, 0x00, 1000 );
@@ -91,6 +91,8 @@
 
         TEST_ASSERT( strncasecmp( (char *) output_str, {result_hex_str}, strlen( {result_hex_str} ) ) == 0 );
     }
+
+    mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
 }
 END_CASE
 
@@ -111,7 +113,7 @@
     info.buf = rnd_buf;
     info.per_call = 1;
 
-    mpi_init( &P1, &Q1, &H, &G, NULL );
+    mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
     rsa_init( &ctx, RSA_PKCS_V21, {hash} );
 
     memset( message_str, 0x00, 1000 );
@@ -185,6 +187,8 @@
 
         TEST_ASSERT( strcasecmp( (char *) output_str, {result_hex_str} ) == 0 );
     }
+
+    mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
 }
 END_CASE
 
diff --git a/tests/suites/test_suite_rsa.function b/tests/suites/test_suite_rsa.function
index 832b5d9..2ac03b8 100644
--- a/tests/suites/test_suite_rsa.function
+++ b/tests/suites/test_suite_rsa.function
@@ -28,7 +28,7 @@
     mpi P1, Q1, H, G;
     int msg_len;
 
-    mpi_init( &P1, &Q1, &H, &G, NULL );
+    mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
     rsa_init( &ctx, {padding_mode}, 0 );
 
     memset( message_str, 0x00, 1000 );
@@ -102,6 +102,8 @@
 
         TEST_ASSERT( strcasecmp( (char *) output_str, {result_hex_str} ) == 0 );
     }
+
+    mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
 }
 END_CASE
 
@@ -184,7 +186,7 @@
     mpi P1, Q1, H, G;
     int msg_len, hash_len;
 
-    mpi_init( &P1, &Q1, &H, &G, NULL );
+    mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
     rsa_init( &ctx, {padding_mode}, 0 );
 
     memset( message_str, 0x00, 1000 );
@@ -217,6 +219,8 @@
     hexify( output_str, output, ctx.len );
 
     TEST_ASSERT( strcasecmp( (char *) output_str, {result_hex_str} ) == 0 );
+
+    mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
 }
 END_CASE
 
@@ -325,7 +329,7 @@
     mpi P1, Q1, H, G;
     size_t output_len;
 
-    mpi_init( &P1, &Q1, &H, &G, NULL );
+    mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
     rsa_init( &ctx, {padding_mode}, 0 );
 
     memset( message_str, 0x00, 1000 );
@@ -359,6 +363,8 @@
 
         TEST_ASSERT( strncasecmp( (char *) output_str, {result_hex_str}, strlen( {result_hex_str} ) ) == 0 );
     }
+
+    mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
 }
 END_CASE
 
@@ -402,7 +408,7 @@
     rsa_context ctx;
     mpi P1, Q1, H, G;
 
-    mpi_init( &P1, &Q1, &H, &G, NULL );
+    mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
     rsa_init( &ctx, RSA_PKCS_V15, 0 );
 
     memset( message_str, 0x00, 1000 );
@@ -435,6 +441,8 @@
 
         TEST_ASSERT( strcasecmp( (char *) output_str, {result_hex_str} ) == 0 );
     }
+
+    mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
 }
 END_CASE