On 15-03-2017 13:30, Eduardo Barretto wrote:
> On 14-03-2017 13:04, Harald Freudenberger wrote:
>> Signed-off-by: Harald Freudenberger <fre...@linux.vnet.ibm.com>
>> ---
>>  testcases/pkcs11/Makefile.am    |   3 +-
>>  testcases/pkcs11/sess_opstate.c | 266 
>> ++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 268 insertions(+), 1 deletion(-)
>>  create mode 100644 testcases/pkcs11/sess_opstate.c
>>
>> diff --git a/testcases/pkcs11/Makefile.am b/testcases/pkcs11/Makefile.am
>> index a7488ad..04fe127 100644
>> --- a/testcases/pkcs11/Makefile.am
>> +++ b/testcases/pkcs11/Makefile.am
>> @@ -1,4 +1,4 @@
>> -noinst_PROGRAMS=hw_fn sess_mgmt_tests sess_bench attribute findobjects 
>> destroyobjects copyobjects generate_keypair gen_purpose getobjectsize
>> +noinst_PROGRAMS=hw_fn sess_mgmt_tests sess_bench sess_opstate attribute 
>> findobjects destroyobjects copyobjects generate_keypair gen_purpose 
>> getobjectsize
>>
>>  AM_CFLAGS=-I. -I../../usr/include/pkcs11 -I../include -I../common 
>> -I../../usr/lib/pkcs11/common -Wall
>>
>> @@ -7,6 +7,7 @@ AM_LDFLAGS=-L../common -lc  -ldl -lpthread -lcommon
>>  hw_fn_SOURCES = hw_fn.c
>>  sess_mgmt_tests_SOURCES = sess_mgmt.c
>>  sess_bench_SOURCES = sess_perf.c
>> +sess_opstate_SOURCES = sess_opstate.c
>>  attribute_SOURCES = attribute.c
>>  findobjects_SOURCES = findobjects.c
>>  destroyobjects_SOURCES = destroyobjects.c
>> diff --git a/testcases/pkcs11/sess_opstate.c 
>> b/testcases/pkcs11/sess_opstate.c
>> new file mode 100644
>> index 0000000..8ae0db4
>> --- /dev/null
>> +++ b/testcases/pkcs11/sess_opstate.c
>> @@ -0,0 +1,266 @@
> 
Hi Harald,

I've made the fixes mentioned below, tested it and integrated it to
master branch.

Thanks,
Eduardo
> Hi Harald, on the top of the sess_opstate.c could you please add the
> following header with the License information:
> /*
>  * COPYRIGHT (c) International Business Machines Corp. 2017
>  *
>  * This program is provided under the terms of the Common Public License,
>  * version 1.0 (CPL-1.0). Any use, reproduction or distribution for this
>  * software constitutes recipient's acceptance of CPL-1.0 terms which can be
>  * found in the file LICENSE file or at
>  * https://opensource.org/licenses/cpl1.0.php
>  */
> 
> There are also some trailing whitespaces on this sess_opstate.c on
> lines: 31, 82, 101, 128 and 174.
> 
> As soon as you fix it just send the patch again and I will merge it.
> I've already tested it and it looks good.
> 
> Thanks,
> Eduardo
>> +/*
>> + * Testcase for
>> + * C_GetOperationState / C_SetOperationState
>> + */
>> +
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include <memory.h>
>> +#include <time.h>
>> +
>> +#include "pkcs11types.h"
>> +#include "regress.h"
>> +#include "common.c"
>> +
>> +
>> +CK_BYTE_PTR alloc_random_buf(CK_SESSION_HANDLE sess, CK_LONG nbytes)
>> +{
>> +    CK_RV rc;
>> +    CK_BYTE_PTR ptr = malloc(nbytes);
>> +    if (ptr == NULL) {
>> +            testcase_error("malloc(%lu) failed", nbytes);
>> +            return NULL;
>> +    }
>> +    rc = funcs->C_GenerateRandom(sess, ptr, nbytes);
>> +    if (rc != CKR_OK) {
>> +            testcase_error("C_GenerateRandom() rc=%s", p11_get_ckr(rc));
>> +            free(ptr);
>> +            return NULL;
>> +    }
>> +    return ptr;             
>> +}
>> +
>> +
>> +int sess_opstate_funcs(int loops)
>> +{
>> +    CK_SESSION_HANDLE s1, s2;
>> +    CK_SLOT_ID        slot_id = SLOT_ID;
>> +    CK_ULONG          flags;
>> +    CK_RV             rc;
>> +    int               i, counter, rbytes;
>> +    CK_BYTE           *rdata = NULL;
>> +    CK_MECHANISM      mech1 = {CKM_SHA256, 0, 0};
>> +    CK_MECHANISM      mech2 = {CKM_SHA_1, 0, 0};
>> +    CK_ULONG          r1hlen, r2hlen, hlen;
>> +    CK_BYTE           r1hash[32], r2hash[32], hash[32];
>> +    CK_ULONG          opstatelen;
>> +    CK_BYTE           *opstate = NULL;
>> +
>> +    // open 2 sessions
>> +    flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;
>> +    rc = funcs->C_OpenSession(slot_id, flags, NULL, NULL, &s1);
>> +    if (rc != CKR_OK) {
>> +            testcase_error("C_OpenSession() rc=%s", p11_get_ckr(rc));
>> +            goto out;
>> +    }
>> +    rc = funcs->C_OpenSession(slot_id, flags, NULL, NULL, &s2);
>> +    if (rc != CKR_OK) {
>> +            testcase_error("C_OpenSession() rc=%s", p11_get_ckr(rc));
>> +            goto out;
>> +    }
>> +
>> +    // init digest for both sessions
>> +    rc = funcs->C_DigestInit(s1, &mech1);
>> +    if (rc != CKR_OK) {
>> +            testcase_error("C_DigestInit rc=%s", p11_get_ckr(rc));
>> +            goto out;
>> +    }
>> +    rc = funcs->C_DigestInit(s2, &mech1);
>> +    if (rc != CKR_OK) {
>> +            testcase_error("C_DigestInit rc=%s", p11_get_ckr(rc));
>> +            goto out;
>> +    }
>> +
>> +    // now loop over some digest updates
>> +    for (counter = 0; counter < loops; counter ++) {
>> +
>> +            // create some random data
>> +            rbytes = random() % sizeof(rdata);
>> +            rdata = alloc_random_buf(s1, rbytes);
>> +            if (!rdata) goto out;
>> +            
>> +            // digest update on session 1
>> +            rc = funcs->C_DigestUpdate(s1, rdata, rbytes);
>> +            if (rc != CKR_OK) {
>> +                    testcase_error("C_DigestUpdate rc=%s", p11_get_ckr(rc));
>> +                    goto out;
>> +            }
>> +
>> +            // restore op state on session 2
>> +            if (opstate != NULL) {
>> +                    rc = funcs->C_SetOperationState(s2, opstate, 
>> opstatelen, 0, 0);
>> +                    if (rc != CKR_OK) {
>> +                            testcase_error("C_SetOperationState rc=%s", 
>> p11_get_ckr(rc));
>> +                            goto out;
>> +                    }
>> +                    free(opstate);
>> +                    opstate = NULL;
>> +            }
>> +
>> +            // digest update on session 2                   
>> +            rc = funcs->C_DigestUpdate(s2, rdata, rbytes);
>> +            if (rc != CKR_OK) {
>> +                    testcase_error("C_DigestUpdate rc=%s", p11_get_ckr(rc));
>> +                    goto out;
>> +            }
>> +
>> +            // fetch op state on session 2
>> +            opstatelen = 0;
>> +            rc = funcs->C_GetOperationState(s2, NULL, &opstatelen);
>> +            if (rc != CKR_OK) {
>> +                    testcase_error("C_GetOperationState rc=%s", 
>> p11_get_ckr(rc));
>> +                    goto out;
>> +            }
>> +            opstate = malloc(opstatelen);
>> +            if (opstate == NULL) {
>> +                    testcase_error("malloc(%lu) failed", opstatelen);
>> +                    goto out;
>> +            }
>> +            rc = funcs->C_GetOperationState(s2, opstate, &opstatelen);
>> +            if (rc != CKR_OK) {
>> +                    testcase_error("C_GetOperationState rc=%s", 
>> p11_get_ckr(rc));
>> +                    goto out;
>> +            }
>> +
>> +            free(rdata);
>> +            rdata = NULL;
>> +            
>> +            // now do something different on session 2, but first
>> +            // we have to wipe out the started digest operation
>> +
>> +            hlen = sizeof(hash);
>> +            rc = funcs->C_DigestFinal(s2, hash, &hlen);
>> +            if (rc != CKR_OK) {
>> +                    testcase_error("C_DigestFinal rc=%s", p11_get_ckr(rc));
>> +                    goto out;
>> +            }
>> +
>> +            // so now let's do a digest init/update/finish
>> +            // to randomize the memory a little
>> +
>> +            rc = funcs->C_DigestInit(s2, &mech2);
>> +            if (rc != CKR_OK) {
>> +                    testcase_error("C_DigestInit rc=%s", p11_get_ckr(rc));
>> +                    goto out;
>> +            }
>> +            for (i = 0; i < loops; i++) {
>> +                    rbytes = random() % sizeof(rdata);
>> +                    rdata = alloc_random_buf(s1, rbytes);
>> +                    if (!rdata) goto out;
>> +                    rc = funcs->C_DigestUpdate(s2, rdata, rbytes);
>> +                    if (rc != CKR_OK) {
>> +                            testcase_error("C_DigestUpdate rc=%s", 
>> p11_get_ckr(rc));
>> +                            goto out;
>> +                    }
>> +                    free(rdata);
>> +                    rdata = NULL;
>> +            }
>> +            hlen = sizeof(hash);
>> +            rc = funcs->C_DigestFinal(s2, hash, &hlen);
>> +            if (rc != CKR_OK) {
>> +                    testcase_error("C_DigestFinal rc=%s", p11_get_ckr(rc));
>> +                    goto out;
>> +            }
>> +
>> +    }
>> +
>> +    // restore op state on session 2
>> +    rc = funcs->C_SetOperationState(s2, opstate, opstatelen, 0, 0);
>> +    if (rc != CKR_OK) {
>> +            testcase_error("C_SetOperationState rc=%s", p11_get_ckr(rc));
>> +            goto out;
>> +    }
>> +    
>> +    // digest finish
>> +    r1hlen = sizeof(r1hash);
>> +    rc = funcs->C_DigestFinal(s1, r1hash, &r1hlen);
>> +    if (rc != CKR_OK) {
>> +            testcase_error("C_DigestFinal rc=%s", p11_get_ckr(rc));
>> +            goto out;
>> +    }
>> +    r2hlen = sizeof(r2hash);
>> +    rc = funcs->C_DigestFinal(s2, r2hash, &r2hlen);
>> +    if (rc != CKR_OK) {
>> +            testcase_error("C_DigestFinal rc=%s", p11_get_ckr(rc));
>> +            goto out;
>> +    }
>> +
>> +    // check both hashes
>> +    if (r1hlen != r2hlen) {
>> +            testcase_fail("hash length differ");
>> +            goto out;
>> +    }               
>> +    if (memcmp(r1hash, r2hash, r1hlen) != 0) {
>> +            testcase_fail("hash values differs");
>> +            goto out;
>> +    }
>> +
>> +    testcase_pass("Get/SetOperationState digest test");
>> +
>> +out:
>> +    if (opstate) free(opstate);
>> +    if (rdata) free(rdata);
>> +    funcs->C_CloseAllSessions(slot_id);
>> +    return rc;
>> +}
>> +
>> +
>> +int main(int argc, char **argv)
>> +{
>> +    CK_C_INITIALIZE_ARGS cinit_args;
>> +    int rc, i, j, loops = 0;
>> +    CK_RV rv;
>> +
>> +    SLOT_ID = 0;
>> +    no_init = FALSE;
>> +
>> +    srandom(time(0));
>> +
>> +    for (i=0; i < argc; i++) {
>> +            if (strncmp(argv[i], "loops=", 6) == 0) {
>> +                    sscanf(argv[i]+6, "%i", &loops);
>> +                    for (j=i; j < argc; j++)
>> +                            argv[j] = argv[j+1];
>> +                    argc--;
>> +            }
>> +    }
>> +    if (loops < 1) loops = 100;
>> +
>> +    rc = do_ParseArgs(argc, argv);
>> +    if (rc != 1)
>> +            return rc;
>> +
>> +    printf("Using slot #%lu...\n\n", SLOT_ID );
>> +    printf("With option: no_init: %d\n", no_init);
>> +    printf("Running %d loops...\n", loops );
>> +
>> +    rc = do_GetFunctionList();
>> +    if (!rc) {
>> +            PRINT_ERR("ERROR do_GetFunctionList() Failed , rc = 0x%0x\n", 
>> rc);
>> +            return rc;
>> +    }
>> +
>> +    memset( &cinit_args, 0x0, sizeof(cinit_args) );
>> +    cinit_args.flags = CKF_OS_LOCKING_OK;
>> +
>> +    funcs->C_Initialize( &cinit_args );
>> +
>> +    {
>> +            CK_SESSION_HANDLE  hsess = 0;
>> +            
>> +            rc = funcs->C_GetFunctionStatus(hsess);
>> +            if (rc  != CKR_FUNCTION_NOT_PARALLEL)
>> +                    return rc;
>> +            
>> +            rc = funcs->C_CancelFunction(hsess);
>> +            if (rc  != CKR_FUNCTION_NOT_PARALLEL)
>> +                    return rc;
>> +            
>> +    }
>> +
>> +    rv = sess_opstate_funcs(loops);
>> +
>> +    /* make sure we return non-zero if rv is non-zero */
>> +    return ((rv==0) || (rv % 256) ? rv : -1);
>> +}
>>
> 


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opencryptoki-tech mailing list
Opencryptoki-tech@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech

Reply via email to