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

Reply via email to