The aes testcase now rekognizes a new command line option -datasize <size> with size beeing a number optional followed by k or K for kilo, m or M for mega. Together with this argument comes an improvment on the EncryptDecrypt and the EncryptDecryptUpdate tests which now run the tests with the given data size. This datasize was card coded to BIGREQUEST (4k) and if this parameter is not given, the default datasize is exact this 4k.
Signed-off-by: Harald Freudenberger <[email protected]> --- testcases/crypto/aes_func.c | 150 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 120 insertions(+), 30 deletions(-) diff --git a/testcases/crypto/aes_func.c b/testcases/crypto/aes_func.c index c9b8c44..1ef898b 100644 --- a/testcases/crypto/aes_func.c +++ b/testcases/crypto/aes_func.c @@ -11,6 +11,9 @@ CK_ULONG key_lens[] = {16, 24, 32}; +// holds value of the -datasize argument if given +static unsigned data_size = 0; + /* aes-ctr has 3encck+3decck+3encsk+3decsk+3keywrap+1RSA * aes-ecb has 3encck+3decck+3encsk+3decsk+3keywrap+1RSA * aec-cbc has 3encck+3decck+3encsk+3decsk+3keywrap+3encpad+3decpad+ @@ -19,12 +22,11 @@ CK_ULONG key_lens[] = {16, 24, 32}; * of assertions is the same whether using clearkey or securekey. */ -CK_RV do_EncryptDecryptAES(struct generated_test_suite_info *tsuite) +CK_RV do_EncryptDecryptAES(struct generated_test_suite_info *tsuite, size_t datasize) { int i; - CK_BYTE original[BIG_REQUEST]; - CK_BYTE crypt[BIG_REQUEST + AES_BLOCK_SIZE]; - CK_BYTE decrypt[BIG_REQUEST + AES_BLOCK_SIZE]; + CK_BYTE *original, *crypt, *decrypt; + size_t original_size, crypt_size, decrypt_size; CK_BYTE user_pin[PKCS11_MAX_PIN_LEN]; CK_ULONG j; CK_ULONG user_pin_len; @@ -37,10 +39,25 @@ CK_RV do_EncryptDecryptAES(struct generated_test_suite_info *tsuite) CK_RV rc = CKR_OK; CK_SLOT_ID slot_id = SLOT_ID; - testsuite_begin("%s Encryption/Decryption.",tsuite->name); + /** begin testsuite **/ + testsuite_begin("%s Encryption/Decryption with %u bytes", + tsuite->name, (unsigned)datasize); testcase_rw_session(); testcase_user_login(); + /* allocate buffers */ + if (datasize < AES_BLOCK_SIZE) datasize = AES_BLOCK_SIZE; + original_size = datasize; + crypt_size = datasize + AES_BLOCK_SIZE; + decrypt_size = datasize + AES_BLOCK_SIZE; + original = (CK_BYTE*) malloc(original_size); + crypt = (CK_BYTE*) malloc(crypt_size); + decrypt = (CK_BYTE*) malloc(decrypt_size); + if (!original || !crypt || !decrypt) { + fprintf(stderr, "Memory Allocation Error, aborting test run !!!\n"); + exit(1); + } + /** skip tests if the slot doesn't support this mechanism **/ if (! mech_supported(slot_id, tsuite->mech.mechanism)){ testsuite_skip(3, @@ -69,12 +86,12 @@ CK_RV do_EncryptDecryptAES(struct generated_test_suite_info *tsuite) } /** clear buffers **/ - memset(original,0,sizeof(original)); - memset(crypt,0,sizeof(crypt)); - memset(decrypt,0,sizeof(decrypt)); + memset(original,0,original_size); + memset(crypt,0,crypt_size); + memset(decrypt,0,decrypt_size); /** generate data **/ - orig_len = sizeof(original); + orig_len = original_size; for (j=0; j < orig_len; j++) original[j] = j % 255; @@ -90,7 +107,7 @@ CK_RV do_EncryptDecryptAES(struct generated_test_suite_info *tsuite) goto error; } - crypt_len = sizeof(crypt); + crypt_len = crypt_size; rc = funcs->C_Encrypt(session, original, @@ -112,7 +129,7 @@ CK_RV do_EncryptDecryptAES(struct generated_test_suite_info *tsuite) goto testcase_cleanup; } - decrypt_len = sizeof(decrypt); + decrypt_len = decrypt_size; rc = funcs->C_Decrypt(session, crypt, @@ -130,10 +147,10 @@ CK_RV do_EncryptDecryptAES(struct generated_test_suite_info *tsuite) testcase_new_assertion(); if (decrypt_len != orig_len) { - testcase_fail("decrypted data length does not " - "match original data length.\nexpected " - "length=%ld, but found length=%ld\n", - orig_len, decrypt_len); + testcase_fail("decrypted data length does not " + "match original data length.\nexpected " + "length=%ld, but found length=%ld\n", + orig_len, decrypt_len); } else if (memcmp(decrypt, original, orig_len)){ @@ -166,15 +183,17 @@ testcase_cleanup: if (rc != CKR_OK) { testcase_error("C_CloseAllSessions rc=%s", p11_get_ckr(rc)); } + free(original); + free(crypt); + free(decrypt); return rc; } -CK_RV do_EncryptDecryptUpdateAES(struct generated_test_suite_info *tsuite) +CK_RV do_EncryptDecryptUpdateAES(struct generated_test_suite_info *tsuite, size_t datasize) { int i; - CK_BYTE original[BIG_REQUEST]; - CK_BYTE crypt[BIG_REQUEST + AES_BLOCK_SIZE]; - CK_BYTE decrypt[BIG_REQUEST + AES_BLOCK_SIZE]; + CK_BYTE *original, *crypt, *decrypt; + size_t original_size, crypt_size, decrypt_size; CK_BYTE user_pin[PKCS11_MAX_PIN_LEN]; CK_ULONG j, k, tmp; CK_ULONG user_pin_len; @@ -188,10 +207,24 @@ CK_RV do_EncryptDecryptUpdateAES(struct generated_test_suite_info *tsuite) CK_RV rc = CKR_OK; /** begin testsuite **/ - testsuite_begin("%s Multipart Encryption/Decryption.", tsuite->name); + testsuite_begin("%s Multipart Encryption/Decryption with %u bytes", + tsuite->name, (unsigned)datasize); testcase_rw_session(); testcase_user_login(); + /* allocate buffers */ + if (datasize < AES_BLOCK_SIZE) datasize = AES_BLOCK_SIZE; + original_size = datasize; + crypt_size = datasize + AES_BLOCK_SIZE; + decrypt_size = datasize + AES_BLOCK_SIZE; + original = (CK_BYTE*) malloc(original_size); + crypt = (CK_BYTE*) malloc(crypt_size); + decrypt = (CK_BYTE*) malloc(decrypt_size); + if (!original || !crypt || !decrypt) { + fprintf(stderr, "Memory Allocation Error, aborting test run !!!\n"); + exit(1); + } + /** skip test if the slot doesn't support this mechanism **/ if (! mech_supported(slot_id, tsuite->mech.mechanism)){ testcase_skip("Slot %u doesn't support %s (%u)", @@ -217,12 +250,12 @@ CK_RV do_EncryptDecryptUpdateAES(struct generated_test_suite_info *tsuite) } /** clear buffers **/ - memset(original,0,sizeof(original)); - memset(crypt,0,sizeof(crypt)); - memset(decrypt,0,sizeof(decrypt)); + memset(original,0,original_size); + memset(crypt,0,crypt_size); + memset(decrypt,0,decrypt_size); /** generate data **/ - orig_len = sizeof(original); + orig_len = original_size; for (j=0; j < orig_len; j++) original[j] = j % 255; @@ -239,7 +272,7 @@ CK_RV do_EncryptDecryptUpdateAES(struct generated_test_suite_info *tsuite) j = k = 0; // j indexes source buffer // k indexes destination buffer - crypt_len = sizeof(crypt); + crypt_len = crypt_size; while (j < orig_len) { tmp = crypt_len - k; // room is left in mpcrypt rc = funcs->C_EncryptUpdate(session, @@ -257,7 +290,7 @@ CK_RV do_EncryptDecryptUpdateAES(struct generated_test_suite_info *tsuite) j += AES_BLOCK_SIZE; } - crypt_len = sizeof(crypt) - k; + crypt_len = crypt_size - k; rc = funcs->C_EncryptFinal(session, &crypt[k], &crypt_len); if (rc != CKR_OK) { @@ -276,7 +309,7 @@ CK_RV do_EncryptDecryptUpdateAES(struct generated_test_suite_info *tsuite) j = k = 0; // j indexes source buffer, // k indexes destination buffer - decrypt_len = sizeof(decrypt); + decrypt_len = decrypt_size; while (j < crypt_len) { tmp = decrypt_len - k; // room left in mpdecrypt rc = funcs->C_DecryptUpdate(session, @@ -293,7 +326,7 @@ CK_RV do_EncryptDecryptUpdateAES(struct generated_test_suite_info *tsuite) j += AES_BLOCK_SIZE; } - decrypt_len = sizeof(decrypt) - k; + decrypt_len = decrypt_size - k; rc = funcs->C_DecryptFinal(session, &decrypt[k], &decrypt_len); if (rc != CKR_OK) { @@ -343,6 +376,9 @@ testcase_cleanup: if (rc != CKR_OK) { testcase_error("C_CloseAllSessions rc=%s", p11_get_ckr(rc)); } + free(original); + free(crypt); + free(decrypt); return rc; } @@ -1636,6 +1672,11 @@ CK_RV aes_funcs() { generate_key = securekey; // true if mech requires secure key // generate keys and skip published tests + // set default data size for variable data tests + // if no value is given on the command line + if (data_size == 0) + data_size = BIG_REQUEST; + for (i = 0; i < NUM_OF_PUBLISHED_TESTSUITES; i++) { if (!generate_key) { rv = do_EncryptAES(&published_test_suites[i]); @@ -1658,11 +1699,11 @@ CK_RV aes_funcs() { } for (i = 0; i < NUM_OF_GENERATED_TESTSUITES; i++) { - rv = do_EncryptDecryptAES(&generated_test_suites[i]); + rv = do_EncryptDecryptAES(&generated_test_suites[i], data_size); if (rv != CKR_OK && (!no_stop)) break; - rv = do_EncryptDecryptUpdateAES(&generated_test_suites[i]); + rv = do_EncryptDecryptUpdateAES(&generated_test_suites[i], data_size); if (rv != CKR_OK && (!no_stop)) break; @@ -1691,11 +1732,60 @@ CK_RV aes_funcs() { return rv; } +/* + * Process arguments which are only local to this testcase + * and not recognized by do_ParseArgs from common.c. + * This function manipulates argv and argc (which is valid + * according to Posix) to hide the processed arguments and + * thus should be called before do_ParseArgs() is invoked. + */ +static int do_ParseLocalArgs(int *argc, char **argv) +{ + char c; + int i, j; + + for (i=1; i < *argc; i++) { + if (strcmp(argv[i], "-datasize") == 0) { + if (i+1 >= *argc) { + fprintf (stderr, "Wrong/missing argument for '-datasize'\n"); + return -1; + } + j = strlen(argv[i+1]); + if (j < 1) { + fprintf (stderr, "Wrong/missing numerical value for 'datasize'\n"); + return -1; + } + c = argv[i+1][j-1]; + j = atoi(argv[i+1]); + if (j < 1) { + fprintf (stderr, "Wrong/missing numerical value for 'datasize'\n"); + return -1; + } + data_size = j; + if (c == 'k' || c == 'K') + data_size *= 1024; + if (c == 'm' || c == 'M') + data_size *= 1024*1024; + // remove argv[i] and argv[i+1] (thats "-datasize <size>") from argv + for (j=i; j+2 < *argc; j++) + argv[j] = argv[j+2]; + *argc -= 2; + i--; + } + + } + return 0; +} + int main (int argc, char **argv) { int rc; CK_C_INITIALIZE_ARGS cinit_args; CK_RV rv = 0; + rc = do_ParseLocalArgs(&argc, argv); + if ( rc < 0) + return rc; + rc = do_ParseArgs(argc, argv); if (rc != 1) return rc; -- 1.7.9.5 ------------------------------------------------------------------------------ Want fast and easy access to all the code in your enterprise? Index and search up to 200,000 lines of code with a free copy of Black Duck Code Sight - the same software that powers the world's largest code search on Ohloh, the Black Duck Open Hub! Try it now. http://p.sf.net/sfu/bds _______________________________________________ Opencryptoki-tech mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech
