Hi,

I like what these changes are trying to do, I just think having a 
datasize parameter in the appropriate places in digest.h would be
better. If datasize is part of generated test vector, then the testcase
would malloc data according to the test vector input data size.
Published test vectors already have set input sizes so do not need nor
require a datasize. The malloc could be based on the input data
length...

Would it be possible for you to change this such that datasize is 
part of a structure or parameter in digest.h? 
That way, testcases are automatically run with different data sizes
for generated testcases.

regards,
Joy

On Thu, 2014-07-17 at 14:51 +0200, Harald Freudenberger wrote:
> Improvements on the digest testcase:
> - multipart digest update now really breaks down the data
>   into junks of DIGEST_UPDATE_JUNK_SIZE (currently 32 bytes)
>   size.
> - new testcase single part digest with variable data size
>   which allocs -datasize <nr_of_bytes> and runs all the
>   defined digest tests with this. If no datasize parameter
>   is given, defaults to BIG_REQUEST (4k) data size.
> - new testcase multiple parts digest with variable data size
>   which allocs -datasize <nr_of_bytes> and runs all the
>   defined digest tests with this.  If no datasize parameter
>   is given, defaults to BIG_REQUEST (4k) data size.
> 
> Signed-off-by: Harald Freudenberger <[email protected]>
> ---
>  testcases/crypto/digest.h      |    2 +
>  testcases/crypto/digest_func.c |  262 
> +++++++++++++++++++++++++++++++++++++---
>  2 files changed, 248 insertions(+), 16 deletions(-)
> 
> diff --git a/testcases/crypto/digest.h b/testcases/crypto/digest.h
> index dff3e12..c425804 100644
> --- a/testcases/crypto/digest.h
> +++ b/testcases/crypto/digest.h
> @@ -1,8 +1,10 @@
>  #include "pkcs11types.h"
> 
>  #define MAX_KEY_SIZE  150 
> +#define MIN_DATA_SIZE 64
>  #define MAX_DATA_SIZE 512
>  #define MAX_HASH_SIZE 64
> +#define DIGEST_UPDATE_JUNK_SIZE 32
> 
>  CK_ULONG four = 4;
>  CK_ULONG ten = 10;
> diff --git a/testcases/crypto/digest_func.c b/testcases/crypto/digest_func.c
> index 156c238..bb16eab 100644
> --- a/testcases/crypto/digest_func.c
> +++ b/testcases/crypto/digest_func.c
> @@ -46,6 +46,10 @@ CK_RV do_Digest(struct digest_test_suite_info *tsuite)
>       /** iterate over test vectors **/
>       for(i = 0; i < tsuite->tvcount; i++){
> 
> +             /** begin test **/
> +             testcase_begin("Starting %s Digest with test vector %d.",
> +                            tsuite->name, i);
> +
>               rc = CKR_OK;    // set rc
> 
>               /** clear buffers **/
> @@ -82,8 +86,9 @@ CK_RV do_Digest(struct digest_test_suite_info *tsuite)
>               testcase_new_assertion();
> 
>               if (actual_len != expected_len) {
> -                     testcase_fail("hashed data length does not match test 
> vector's"                                 " hashed data length.\nexpected 
> length=%ld, found "
> -                              "length=%ld.", expected_len, actual_len);
> +                     testcase_fail("hashed data length does not match test 
> vector's"
> +                                   " hashed data length.\nexpected 
> length=%ld, found "
> +                                   "length=%ld.", expected_len, actual_len);
>                       }
> 
>               else if (memcmp(actual, expected, expected_len)){
> @@ -105,12 +110,105 @@ testcase_cleanup:
>       return rc;
>  }
> 
> +/** Tests messge digest with variable data size. **/
> +CK_RV do_Digest2(struct digest_test_suite_info *tsuite, size_t datasize)
> +{
> +
> +     int             i, j;
> +     CK_BYTE         *data;
> +     CK_ULONG        data_len;
> +     CK_BYTE         actual[MAX_HASH_SIZE];
> +     CK_ULONG        actual_len;
> +     CK_MECHANISM    mech;
> +
> +     CK_SESSION_HANDLE       session;
> +     CK_SLOT_ID              slot_id = SLOT_ID;
> +     CK_ULONG                flags;
> +     CK_RV                   rc;
> +
> +     // begin test suite
> +     testsuite_begin("%s Digest with %u bytes", tsuite->name, 
> (unsigned)datasize);
> +     testcase_rw_session();
> +
> +     // allocate buffers
> +     if (datasize < MIN_DATA_SIZE) datasize = MIN_DATA_SIZE;
> +     data = (CK_BYTE*) malloc(datasize);
> +     if (!data) {
> +             fprintf(stderr, "Memory Allocation Error, aborting test run 
> !!!\n");
> +             exit(1);
> +     }
> +
> +     // skip test if mech is not supported with this slot
> +     if (! mech_supported(slot_id, tsuite->mech.mechanism)){
> +             testsuite_skip(tsuite->tvcount,
> +                            "mechanism %s is not supported with slot %ld",
> +                            tsuite->name, slot_id);
> +             goto testcase_cleanup;
> +     }
> +
> +     // iterate over test vectors
> +     for(i = 0; i < tsuite->tvcount; i++){
> +
> +             /** begin test **/
> +             testcase_begin("Starting %s Digest with test vector %d.",
> +                            tsuite->name, i);
> +
> +             rc = CKR_OK;    // set rc
> +
> +             // clear buffers
> +             memset(actual, 0, sizeof(actual));
> +
> +             // set up data buffer
> +             data_len = datasize;
> +             for (j=0; j < data_len; j++)
> +                     data[i] = (CK_BYTE) j;
> +
> +             // get mech
> +             mech = tsuite->mech;
> +
> +             // initialize single digest
> +             rc = funcs->C_DigestInit(session, &mech);
> +             if (rc != CKR_OK) {
> +                     testcase_error("C_DigestInit rc=%s", p11_get_ckr(rc));
> +                     goto testcase_cleanup;
> +             }
> +
> +             actual_len = sizeof(actual);    // set digest buffer size
> +
> +             // do single digest
> +             rc = funcs->C_Digest(session, data, data_len, actual, 
> &actual_len);
> +             if (rc != CKR_OK) {
> +                     testcase_error("C_Digest rc=%s", p11_get_ckr(rc));
> +                     goto testcase_cleanup;
> +             }
> +
> +             // if hash was sucessful generated that's all we expect here
> +             if (actual_len != tsuite->tv[i].hash_len) {
> +                     testcase_fail("hashed data length does not match test 
> vector's"
> +                                   " hashed data length.\nexpected 
> length=%ld, found "
> +                                   "length=%ld.",
> +                                   tsuite->tv[i].hash_len, actual_len);
> +             } else {
> +                     testcase_pass("%s Digest with test vector %d and %u 
> bytes of data passed.",
> +                                   tsuite->name, i, (unsigned)datasize);
> +             }
> +     }
> +
> +testcase_cleanup:
> +     rc = funcs->C_CloseAllSessions(slot_id);
> +     if (rc != CKR_OK) {
> +             testcase_error("C_CloseAllSessions rc=%s", p11_get_ckr(rc));
> +     }
> +     free(data);
> +     return rc;
> +}
> +
>  /** Tests multipart message digest with published test vectors. **/
>  CK_RV do_DigestUpdate(struct digest_test_suite_info *tsuite)
>  {
>       int             i;
>       CK_BYTE         data[MAX_DATA_SIZE];
> -     CK_ULONG        data_len;
> +     CK_ULONG        data_len, data_done;
>       CK_BYTE         actual[MAX_HASH_SIZE];
>       CK_ULONG        actual_len;
>       CK_BYTE         expected[MAX_HASH_SIZE];
> @@ -118,9 +216,9 @@ CK_RV do_DigestUpdate(struct digest_test_suite_info 
> *tsuite)
>       CK_MECHANISM    mech;
> 
>       CK_SESSION_HANDLE       session;
> -     CK_SLOT_ID              slot_id = SLOT_ID;
> +     CK_SLOT_ID              slot_id = SLOT_ID;
>       CK_ULONG                flags;
> -     CK_RV                   rc;
> +     CK_RV                   rc;
> 
>       /** begin test **/
>       testsuite_begin("Starting %s Multipart Digest.", tsuite->name);
> @@ -149,6 +247,7 @@ CK_RV do_DigestUpdate(struct digest_test_suite_info 
> *tsuite)
>               memset(expected, 0, sizeof(expected));
> 
>               /** get test vector info **/
> +             data_done = 0;
>               data_len = tsuite->tv[i].data_len;
>               expected_len = tsuite->tv[i].hash_len;
>               memcpy(data, tsuite->tv[i].data, data_len);
> @@ -167,13 +266,16 @@ CK_RV do_DigestUpdate(struct digest_test_suite_info 
> *tsuite)
>               actual_len = sizeof(actual);
> 
>               /** do multipart digest **/
> -             if (data_len > 0) {
> -                     rc = funcs->C_DigestUpdate(session, &data[0], data_len);
> +             while (data_done < data_len) {
> +                     CK_ULONG len = data_len - data_done;
> +                     if (len >= DIGEST_UPDATE_JUNK_SIZE)
> +                             len = DIGEST_UPDATE_JUNK_SIZE;
> +                     rc = funcs->C_DigestUpdate(session, data + data_done, 
> len);
>                       if (rc != CKR_OK) {
> -                             testcase_error("C_DigestUpdate rc=%s",
> -                                     p11_get_ckr(rc));
> +                             testcase_error("C_DigestUpdate rc=%s", 
> p11_get_ckr(rc));
>                               goto testcase_cleanup;
>                       }
> +                     data_done += len;
>               }
> 
>               /** finalize multipart digest **/
> @@ -211,6 +313,112 @@ testcase_cleanup:
>       return rc;
>  }
> 
> +/** Tests multipart message digest with variable data size. **/
> +CK_RV do_DigestUpdate2(struct digest_test_suite_info *tsuite, size_t 
> datasize)
> +{
> +     int             i, j;
> +     CK_BYTE         *data;
> +     CK_ULONG        data_len, data_done;
> +     CK_BYTE         actual[MAX_HASH_SIZE];
> +     CK_ULONG        actual_len;
> +     CK_MECHANISM    mech;
> +
> +     CK_SESSION_HANDLE       session;
> +     CK_SLOT_ID              slot_id = SLOT_ID;
> +     CK_ULONG                flags;
> +     CK_RV                   rc;
> +
> +     // begin test
> +     testsuite_begin("Starting %s Multipart Digest with %u bytes",
> +                     tsuite->name, (unsigned)datasize);
> +     testcase_rw_session();
> +
> +     // allocate buffers
> +     if (datasize < MIN_DATA_SIZE) datasize = MIN_DATA_SIZE;
> +     data = (CK_BYTE*) malloc(datasize);
> +     if (!data) {
> +             fprintf(stderr, "Memory Allocation Error, aborting test run 
> !!!\n");
> +             exit(1);
> +     }
> +
> +     // skip test if mech is not supported with this slot
> +     if (! mech_supported(slot_id, tsuite->mech.mechanism)){
> +             testsuite_skip(tsuite->tvcount,
> +                            "mechanism %s is not supported with slot %ld",
> +                            tsuite->name, slot_id);
> +             goto testcase_cleanup;
> +     }
> +
> +     // iterate over test vectors
> +     for(i = 0; i < tsuite->tvcount; i++){
> +
> +             // begin test
> +             testcase_begin("Starting %s Multipart Digest with test vector 
> %d.",
> +                            tsuite->name, i);
> +
> +             rc = CKR_OK;    // set rc
> +
> +             // clear buffers
> +             memset(actual, 0, sizeof(actual));
> +
> +             // set up data buffer
> +             data_done = 0;
> +             data_len = datasize;
> +             for (j=0; j < data_len; j++)
> +                     data[i] = (CK_BYTE) j;
> +
> +             // get mechanism
> +             mech = tsuite->mech;
> +
> +             // initialize multipart digest
> +             rc = funcs->C_DigestInit(session, &mech);
> +             if (rc != CKR_OK) {
> +                     testcase_error("C_DigestInit rc=%s", p11_get_ckr(rc));
> +                     goto testcase_cleanup;
> +             }
> +
> +             actual_len = sizeof(actual);
> +
> +             // do multipart digest
> +             while (data_done < data_len) {
> +                     CK_ULONG len = data_len - data_done;
> +                     if (len >= DIGEST_UPDATE_JUNK_SIZE)
> +                             len = DIGEST_UPDATE_JUNK_SIZE;
> +                     rc = funcs->C_DigestUpdate(session, data + data_done, 
> len);
> +                     if (rc != CKR_OK) {
> +                             testcase_error("C_DigestUpdate rc=%s", 
> p11_get_ckr(rc));
> +                             goto testcase_cleanup;
> +                     }
> +                     data_done += len;
> +             }
> +
> +             // finalize multipart digest
> +             rc = funcs->C_DigestFinal(session, actual, &actual_len);
> +             if (rc != CKR_OK) {
> +                     testcase_error("C_DigestFinal rc=%s", p11_get_ckr(rc));
> +                     goto testcase_cleanup;
> +             }
> +
> +             // if hash was sucessful generated that's all we expect here
> +             if (actual_len != tsuite->tv[i].hash_len) {
> +                     testcase_fail("hashed multipart data length does not "
> +                                   "match test vector's hashed data 
> length.\n");
> +             } else {
> +                     testcase_pass("%s Multipart Digest with test vector "
> +                                   "%d and %u bytes of data passed.",
> +                                   tsuite->name, i, (unsigned)datasize);
> +             }
> +     }
> +
> +testcase_cleanup:
> +     rc = funcs->C_CloseAllSessions(slot_id);
> +     if (rc != CKR_OK) {
> +             testcase_error("C_CloseAllSessions rc=%s", p11_get_ckr(rc));
> +     }
> +     free(data);
> +     return rc;
> +}
> +
>  /** Tests signature verification with published test vectors. **/
>  CK_RV do_SignVerify_HMAC(struct HMAC_TEST_SUITE_INFO *tsuite){
> 
> @@ -258,7 +466,7 @@ CK_RV do_SignVerify_HMAC(struct HMAC_TEST_SUITE_INFO 
> *tsuite){
> 
>               /** get mechanism **/
>               mech = tsuite->mech;
> -             
> +
>               /* for ep11, check if key len is supported */
>               key_len = tsuite->tv[i].key_len;
> 
> @@ -416,7 +624,7 @@ CK_RV do_SignVerify_HMAC_Update(struct 
> HMAC_TEST_SUITE_INFO *tsuite)
> 
>               /** get mechanism **/
>               mech = tsuite->mech;
> -             
> +
>               /* for ep11, check if key len is supported */
>               key_len = tsuite->tv[i].key_len;
> 
> @@ -461,20 +669,20 @@ CK_RV do_SignVerify_HMAC_Update(struct 
> HMAC_TEST_SUITE_INFO *tsuite)
>                       len1 = 0;
>                       len2 = 0;
>                       /* do in 2 parts */
> -                     if (data_len < 20) 
> +                     if (data_len < 20)
>                               len1 = data_len;
>                       else {
>                               len1 = data_len - 20;
>                               len2 = 20;
>                       }
> -     
> +
>                       rc = funcs->C_SignUpdate(session, data, len1);
>                       if (rc != CKR_OK) {
>                               testcase_error("C_SignUpdate rc=%s",
>                                               p11_get_ckr(rc));
>                               goto error;
>                       }
> -                     
> +
>                       if (len2) {
>                               rc = funcs->C_SignUpdate(session, data + len1,
>                                                        len2);
> @@ -516,7 +724,7 @@ CK_RV do_SignVerify_HMAC_Update(struct 
> HMAC_TEST_SUITE_INFO *tsuite)
>                                       goto error;
>                               }
>                       }
> -             }       
> +             }
>               rc = funcs->C_VerifyFinal(session, actual, actual_len);
>               if (rc != CKR_OK) {
>                       testcase_error("C_VerifyFinal rc=%s", p11_get_ckr(rc));
> @@ -566,6 +774,11 @@ CK_RV digest_funcs() {
>       CK_RV rc;
>       int i;
> 
> +     // 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;
> +
>       /** Digest tests **/
>       for (i = 0; i < NUM_DIGEST_TEST_SUITES; i++){
>               rc = do_Digest(&digest_test_suites[i]);
> @@ -574,6 +787,14 @@ CK_RV digest_funcs() {
>               }
>       }
> 
> +     /** Digest tests with variable data size **/
> +     for (i = 0; i < NUM_DIGEST_TEST_SUITES; i++){
> +             rc = do_Digest2(&digest_test_suites[i], data_size);
> +             if (rc && !no_stop) {
> +                     return rc;
> +             }
> +     }
> +
>       /** Multipart Digest tests **/
>       for (i = 0; i < NUM_DIGEST_TEST_SUITES; i++){
>               rc = do_DigestUpdate(&digest_test_suites[i]);
> @@ -581,6 +802,15 @@ CK_RV digest_funcs() {
>                       return rc;
>               }
>       }
> +
> +     /** Multipart Digest tests with variable data data size **/
> +     for (i = 0; i < NUM_DIGEST_TEST_SUITES; i++){
> +             rc = do_DigestUpdate2(&digest_test_suites[i], data_size);
> +             if (rc && !no_stop) {
> +                     return rc;
> +             }
> +     }
> +
>       /** HMAC tests **/
>       for(i = 0; i < NUM_OF_HMAC_TEST_SUITES; i++){
>               rc = do_SignVerify_HMAC(&hmac_test_suites[i]);
> @@ -601,7 +831,7 @@ CK_RV digest_funcs() {
>                       }
>               }
>       }
> -     
> +
>       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
> 



------------------------------------------------------------------------------
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