Test Specification for Hal Crypto Chibios Hal Crypto Test Suite. Test suite for ChibiOS Crypto Hal. The purpose of this suite is to perform unit tests on the Hal Crypto and to converge to 100% code coverage through successive improvements. cry_ > 8u ) | ( (v & 0xff000000) >> 24u ); } #endif void cryptoTest_setStream(BaseSequentialStream * s) { ts = s; } void cryptoTest_printArray(const uint8_t *a,size_t len) { #if CRYPTO_LOG_LEVEL == 1 for(size_t i=0;i Internal Tests AES ECB AES ECB #include "ref_aes.h" static const CRYConfig config_Polling = { TRANSFER_POLLING, AES_CFBS_128 //cfbs }; static const CRYConfig config_DMA = { TRANSFER_DMA, AES_CFBS_128 //cfbs }; ]]> AES ECB Polling testing AES ECB with various Keys loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt loading the key with 32 byte size Encrypt Decrypt AES ECB DMA testing AES ECB with various Keys loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt loading the key with 32 byte size Encrypt Decrypt Internal Tests AES CFB AES CFB #include "ref_aes.h" static const CRYConfig config_Polling = { TRANSFER_POLLING, AES_CFBS_128 //cfbs }; static const CRYConfig config_DMA = { TRANSFER_DMA, AES_CFBS_128 //cfbs }; ]]> AES CFB Polling testing AES CFB with various Keys loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt loading the key with 32 byte size Encrypt Decrypt AES CFB DMA testing AES CFB with various Keys loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt loading the key with 32 byte size Encrypt Decrypt Internal Tests AES CBC AES CBC #include "ref_aes.h" static const CRYConfig config_Polling = { TRANSFER_POLLING, AES_CFBS_128 //cfbs }; static const CRYConfig config_DMA = { TRANSFER_DMA, AES_CFBS_128 //cfbs }; ]]> AES CBC Polling testing AES CBC with various Keys loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt loading the key with 32 byte size Encrypt Decrypt AES CBC DMA testing AES CBC with various Keys loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt loading the key with 32 byte size Encrypt Decrypt Internal Tests (T)DES (T)DES testing #include "ref_des.h" static const CRYConfig configDES_Polling= { TRANSFER_POLLING, 0 }; static const CRYConfig configDES_DMA= { TRANSFER_DMA, 0 }; ]]> DES Polling testing DES in polled mode loading the key with 8 byte size Encrypt Decrypt TDES CBC Polling testing TDES CBC in polled mode loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt TDES ECB Polling testing TDES ECB in polling mode loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt TDES CBC DMA testing TDES CBC in polled mode loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt TDES ECB DMA testing TDES ECB in DMA mode loading the key with 16 byte size Encrypt Decrypt loading the key with 24 byte size Encrypt Decrypt Internal Tests TRNG TRNG testing static const CRYConfig configTRNG_Polling= { TRANSFER_POLLING, 0 }; ]]> TRNG Polling testing TRNG in polled mode Random generation and test Internal Tests SHA SHA testing #include "ref_sha.h" /* Buffer size for each SHA transfer, size should be multiple of block size (block size: 64 for SHA_1/SHA_256/SHA_224, 128 for SHA_384/SHA_512) */ #define MAX_SHA_BLOCK_SIZE TEST_MSG_DATA_BYTE_LEN #define MAX_SHA_BLOCK_SIZE_INWORD (MAX_SHA_BLOCK_SIZE/4) #define shabuffer msg_decrypted #define MAX_DIGEST_SIZE_INBYTE TEST_MSG_DATA_BYTE_LEN #define MAX_DIGEST_SIZE_INWORD (MAX_DIGEST_SIZE_INBYTE/4) #define digest msg_encrypted static const CRYConfig configSHA_Polling= { TRANSFER_POLLING, 0 }; static cryerror_t crySHA1(CRYDriver *cryp, size_t size,const uint8_t *in, uint8_t *out) { cryerror_t ret; SHA1Context shactxp; shactxp.sha.sha_buffer = (uint8_t*)&shabuffer[0]; shactxp.sha.sha_buffer_size = MAX_SHA_BLOCK_SIZE; ret = crySHA1Init(cryp,&shactxp); ret = crySHA1Update(cryp,&shactxp,size,in); ret = crySHA1Final(cryp,&shactxp,out); return ret; } static cryerror_t crySHA256(CRYDriver *cryp, size_t size,const uint8_t *in, uint8_t *out) { cryerror_t ret; SHA256Context shactxp; shactxp.sha.sha_buffer = (uint8_t*)&shabuffer[0]; shactxp.sha.sha_buffer_size = MAX_SHA_BLOCK_SIZE; ret = crySHA256Init(cryp,&shactxp); ret = crySHA256Update(cryp,&shactxp,size,in); ret = crySHA256Final(cryp,&shactxp,out); return ret; } static cryerror_t crySHA512(CRYDriver *cryp, size_t size,const uint8_t *in, uint8_t *out) { cryerror_t ret; SHA512Context shactxp; shactxp.sha.sha_buffer = (uint8_t*)&shabuffer[0]; shactxp.sha.sha_buffer_size = MAX_SHA_BLOCK_SIZE; ret = crySHA512Init(cryp,&shactxp); ret = crySHA512Update(cryp,&shactxp,size,in); ret = crySHA512Final(cryp,&shactxp,out); return ret; } ]]> SHA1 Polling testing SHA1 in polled mode Digest SHA256 Polling testing SHA256 in polled mode Digest SHA512 Polling testing SHA512 in polled mode Digest Internal Tests SHA SHA testing #include "ref_sha.h" /* Buffer size for each SHA transfer, size should be multiple of block size (block size: 64 for SHA_1/SHA_256/SHA_224, 128 for SHA_384/SHA_512) */ #define MAX_SHA_BLOCK_SIZE TEST_MSG_DATA_BYTE_LEN #define MAX_SHA_BLOCK_SIZE_INWORD (MAX_SHA_BLOCK_SIZE/4) #define shabuffer msg_decrypted #define MAX_DIGEST_SIZE_INBYTE TEST_MSG_DATA_BYTE_LEN #define MAX_DIGEST_SIZE_INWORD (MAX_DIGEST_SIZE_INBYTE/4) #define digest msg_encrypted static const CRYConfig configSHA_DMA= { TRANSFER_DMA, 0 }; static cryerror_t crySHA1(CRYDriver *cryp, size_t size,const uint8_t *in, uint8_t *out) { cryerror_t ret; SHA1Context shactxp; shactxp.sha.sha_buffer = (uint8_t*)&shabuffer[0]; shactxp.sha.sha_buffer_size = MAX_SHA_BLOCK_SIZE; ret = crySHA1Init(cryp,&shactxp); ret = crySHA1Update(cryp,&shactxp,size,in); ret = crySHA1Final(cryp,&shactxp,out); return ret; } static cryerror_t crySHA256(CRYDriver *cryp, size_t size,const uint8_t *in, uint8_t *out) { cryerror_t ret; SHA256Context shactxp; shactxp.sha.sha_buffer = (uint8_t*)&shabuffer[0]; shactxp.sha.sha_buffer_size = MAX_SHA_BLOCK_SIZE; ret = crySHA256Init(cryp,&shactxp); ret = crySHA256Update(cryp,&shactxp,size,in); ret = crySHA256Final(cryp,&shactxp,out); return ret; } static cryerror_t crySHA512(CRYDriver *cryp, size_t size,const uint8_t *in, uint8_t *out) { cryerror_t ret; SHA512Context shactxp; shactxp.sha.sha_buffer = (uint8_t*)&shabuffer[0]; shactxp.sha.sha_buffer_size = MAX_SHA_BLOCK_SIZE; ret = crySHA512Init(cryp,&shactxp); ret = crySHA512Update(cryp,&shactxp,size,in); ret = crySHA512Final(cryp,&shactxp,out); return ret; } ]]> SHA1 DMA testing SHA1 in DMA mode Digest SHA256 DMA testing SHA256 in DMA mode Digest SHA512 DMA testing SHA512 in DMA mode Digest Internal Tests GCM GCM testing #include "ref_gcm.h" #define plaintext msg_clear #define cypher msg_encrypted #define authtag msg_decrypted static const CRYConfig config_Polling= { TRANSFER_POLLING, 0 }; static const CRYConfig config_DMA= { TRANSFER_DMA, 0 }; struct test_el_t { uint32_t size; const uint8_t * data; }; struct test_gcm_t { struct test_el_t key; struct test_el_t p; struct test_el_t iv; struct test_el_t aad; struct test_el_t c; struct test_el_t t; }; #define TEST_GCM_LEN 3 const struct test_gcm_t test_gcm_k[TEST_GCM_LEN]={ { {K3_LEN,K3},{P3_LEN,P3},{IV3_LEN,IV3},{AAD3_LEN,A3},{C3_LEN,C3},{T3_LEN,T3} }, { {K4_LEN,K4},{P4_LEN,P4},{IV4_LEN,IV4},{AAD4_LEN,A4},{C4_LEN,C4},{T4_LEN,T4} }, { {K5_LEN,K5},{P5_LEN,P5},{IV5_LEN,IV5},{AAD5_LEN,A5},{C5_LEN,C5},{T5_LEN,T5} } }; ]]> GCM Polling testing GCM in polled mode loading the key, encrypt and decrypt GCM DMA testing GCM in DMA mode loading the key, encrypt and decrypt Internal Tests HMAC HMAC testing #include "ref_hmac.h" #define plaintext msg_clear #define HMACOUT msg_encrypted #define shabuffer msg_decrypted #define MAX_SHA_BLOCK_SIZE TEST_MSG_DATA_BYTE_LEN #define MAX_SHA_BLOCK_SIZE_INWORD (MAX_SHA_BLOCK_SIZE/4) static const CRYConfig config_Polling= { TRANSFER_POLLING, 0 }; static const CRYConfig config_DMA= { TRANSFER_DMA, 0 }; static const int hmackeys_size[]= { 20, 4, 20 }; static const uint8_t hmackey_1[]= { 0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B, 0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B, }; // "Hi There", static const uint8_t hmacmsg1[8]= "Hi There"; static const size_t hmacmsg_size[]= { 8, }; static void cryHMAC256(CRYDriver *cryp) { cryerror_t ret; HMACSHA256Context hmacshactxp; uint8_t *keyp; hmacshactxp.shacontext.sha.sha_buffer = (uint8_t*)&shabuffer[0]; hmacshactxp.shacontext.sha.sha_buffer_size = MAX_SHA_BLOCK_SIZE; keyp =(uint8_t *)hmackey_1; ret = cryLoadTransientKey(&CRYD1, (cryalgorithm_t) cry_algo_hmac,hmackeys_size[0], keyp); test_assert(ret == CRY_NOERROR, "failed load transient key"); ret = cryHMACSHA256Init(cryp,&hmacshactxp); test_assert(ret == CRY_NOERROR, "failed init HMACSHA256"); ret = cryHMACSHA256Update(cryp,&hmacshactxp,hmacmsg_size[0],(const uint8_t *)&hmacmsg1); test_assert(ret == CRY_NOERROR, "failed update HMACSHA256"); ret = cryHMACSHA256Final(cryp,&hmacshactxp,(uint8_t *)HMACOUT); test_assert(ret == CRY_NOERROR, "failed final HMACSHA256"); SHOW_DATA(HMACOUT,8); } static void cryHMAC512(CRYDriver *cryp) { cryerror_t ret; HMACSHA512Context hmacshactxp; uint8_t *keyp; hmacshactxp.shacontext.sha.sha_buffer = (uint8_t*)&shabuffer[0]; hmacshactxp.shacontext.sha.sha_buffer_size = MAX_SHA_BLOCK_SIZE; keyp =(uint8_t *)hmackey_1; ret = cryLoadTransientKey(&CRYD1, (cryalgorithm_t) cry_algo_hmac,hmackeys_size[0], keyp); test_assert(ret == CRY_NOERROR, "failed load transient key"); ret = cryHMACSHA512Init(cryp,&hmacshactxp); test_assert(ret == CRY_NOERROR, "failed init HMACSHA512"); ret = cryHMACSHA512Update(cryp,&hmacshactxp,hmacmsg_size[0],(const uint8_t *)&hmacmsg1); test_assert(ret == CRY_NOERROR, "failed update HMACSHA512"); ret = cryHMACSHA512Final(cryp,&hmacshactxp,(uint8_t *)HMACOUT); test_assert(ret == CRY_NOERROR, "failed final HMACSHA512"); SHOW_DATA(HMACOUT,16); } ]]> HMAC Polling testing HMAC in polled mode hmac 256 hmac 512 HMAC DMA testing HMAC in DMA mode hmac 256 hmac 512