@@ -214,3 +214,70 @@ int test_wc_CamelliaCbcEncryptDecrypt(void)
214214 return EXPECT_RESULT ();
215215} /* END test_wc_CamelliaCbcEncryptDecrypt */
216216
217+
218+ #include <wolfssl/wolfcrypt/random.h>
219+
220+ #define MC_CIPHER_TEST_COUNT 100
221+ #define MC_CAMELLIA_MAX_DATA_SZ 1024
222+
223+ /* Monte Carlo test for Camellia-CBC: random key, IV, and plaintext each
224+ * iteration */
225+ int test_wc_CamelliaCbc_MonteCarlo (void )
226+ {
227+ EXPECT_DECLS ;
228+ #ifdef HAVE_CAMELLIA
229+ static const word32 keySizes [] = {16 , 24 , 32 };
230+ int numKeySizes = (int )(sizeof (keySizes ) / sizeof (keySizes [0 ]));
231+ wc_Camellia camellia ;
232+ WC_RNG rng ;
233+ byte key [32 ];
234+ byte iv [WC_CAMELLIA_BLOCK_SIZE ];
235+ word32 plainLen = 0 , keyLen ;
236+ int i ;
237+ WC_DECLARE_VAR (plain , byte , MC_CAMELLIA_MAX_DATA_SZ , NULL );
238+ WC_DECLARE_VAR (cipher , byte , MC_CAMELLIA_MAX_DATA_SZ , NULL );
239+ WC_DECLARE_VAR (decrypted , byte , MC_CAMELLIA_MAX_DATA_SZ , NULL );
240+
241+ WC_ALLOC_VAR (plain , byte , MC_CAMELLIA_MAX_DATA_SZ , NULL );
242+ WC_ALLOC_VAR (cipher , byte , MC_CAMELLIA_MAX_DATA_SZ , NULL );
243+ WC_ALLOC_VAR (decrypted , byte , MC_CAMELLIA_MAX_DATA_SZ , NULL );
244+ #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC
245+ ExpectNotNull (plain );
246+ ExpectNotNull (cipher );
247+ ExpectNotNull (decrypted );
248+ #endif
249+
250+ XMEMSET (& camellia , 0 , sizeof (camellia ));
251+ XMEMSET (& rng , 0 , sizeof (rng ));
252+
253+ ExpectIntEQ (wc_InitRng (& rng ), 0 );
254+
255+ for (i = 0 ; i < MC_CIPHER_TEST_COUNT && EXPECT_SUCCESS (); i ++ ) {
256+ keyLen = keySizes [i % numKeySizes ];
257+ ExpectIntEQ (wc_RNG_GenerateBlock (& rng , key , keyLen ), 0 );
258+ ExpectIntEQ (wc_RNG_GenerateBlock (& rng , iv , sizeof (iv )), 0 );
259+ ExpectIntEQ (wc_RNG_GenerateBlock (& rng , (byte * )& plainLen ,
260+ sizeof (plainLen )), 0 );
261+ /* Length 1..1024, rounded up to Camellia block size */
262+ plainLen = (plainLen % MC_CAMELLIA_MAX_DATA_SZ ) + 1 ;
263+ plainLen = (plainLen + WC_CAMELLIA_BLOCK_SIZE - 1 ) &
264+ ~((word32 )WC_CAMELLIA_BLOCK_SIZE - 1 );
265+ ExpectIntEQ (wc_RNG_GenerateBlock (& rng , plain , plainLen ), 0 );
266+
267+ ExpectIntEQ (wc_CamelliaSetKey (& camellia , key , keyLen , iv ), 0 );
268+ ExpectIntEQ (wc_CamelliaCbcEncrypt (& camellia , cipher , plain ,
269+ plainLen ), 0 );
270+ /* Reset IV by calling SetKey again before decrypt */
271+ ExpectIntEQ (wc_CamelliaSetKey (& camellia , key , keyLen , iv ), 0 );
272+ ExpectIntEQ (wc_CamelliaCbcDecrypt (& camellia , decrypted , cipher ,
273+ plainLen ), 0 );
274+ ExpectBufEQ (decrypted , plain , plainLen );
275+ }
276+
277+ wc_FreeRng (& rng );
278+ WC_FREE_VAR (plain , NULL );
279+ WC_FREE_VAR (cipher , NULL );
280+ WC_FREE_VAR (decrypted , NULL );
281+ #endif
282+ return EXPECT_RESULT ();
283+ }
0 commit comments