Blame testcases/misc_tests/speed.c

Packit 8681c6
/*
Packit 8681c6
 * COPYRIGHT (c) International Business Machines Corp. 2005-2017
Packit 8681c6
 *
Packit 8681c6
 * This program is provided under the terms of the Common Public License,
Packit 8681c6
 * version 1.0 (CPL-1.0). Any use, reproduction or distribution for this
Packit 8681c6
 * software constitutes recipient's acceptance of CPL-1.0 terms which can be
Packit 8681c6
 * found in the file LICENSE file or at
Packit 8681c6
 * https://opensource.org/licenses/cpl1.0.php
Packit 8681c6
 */
Packit 8681c6
Packit 8681c6
/* File: speed.c
Packit 8681c6
 *
Packit 8681c6
 * Performance tests for Opencryptoki
Packit 8681c6
 *
Packit 8681c6
 *    RSA keygen (with keylength 1024, 2048, 4096)
Packit 8681c6
 *    RSA sign and verify (with keylength 1024, 2048, 4096)
Packit 8681c6
 *    RSA encrypt and decrypt (with keylength 1024, 2048, 4096)
Packit 8681c6
 *    DES3 encrypt and decrypt (with modes ECB and CBC)
Packit 8681c6
 *    AES encrypt and decrypt (with modes ECB and CBC, with keylength 128, 192,
Packit 8681c6
 *    256), SHA1, SHA256, SHA512
Packit 8681c6
 */
Packit 8681c6
Packit 8681c6
Packit 8681c6
#include <stdio.h>
Packit 8681c6
#include <stdlib.h>
Packit 8681c6
#include <string.h>
Packit 8681c6
#include <memory.h>
Packit 8681c6
#include <sys/types.h>
Packit 8681c6
#include <sys/time.h>
Packit 8681c6
Packit 8681c6
#include "pkcs11types.h"
Packit 8681c6
#include "regress.h"
Packit 8681c6
#include "common.c"
Packit 8681c6
Packit 8681c6
#define SHA1_HASH_LEN   20
Packit 8681c6
#define SHA256_HASH_LEN 32
Packit 8681c6
#define SHA512_HASH_LEN 64
Packit 8681c6
#define MAX_HASH_LEN SHA512_HASH_LEN
Packit 8681c6
Packit 8681c6
Packit 8681c6
// the GetSystemTime and SYSTEMTIME implementation
Packit 8681c6
// from regress.h only has a ms resolution
Packit 8681c6
// and produces absolut inacceptable measurements.
Packit 8681c6
// So we use gettimeofday() and struct timeval
Packit 8681c6
// with us resolution instead.
Packit 8681c6
#ifdef SYSTEMTIME
Packit 8681c6
#undef SYSTEMTIME
Packit 8681c6
#endif
Packit 8681c6
#define SYSTEMTIME struct timeval
Packit 8681c6
#ifdef GetSystemTime
Packit 8681c6
#undef GetSystemTime
Packit 8681c6
#endif
Packit 8681c6
#define GetSystemTime(x) gettimeofday((x),NULL)
Packit 8681c6
static inline unsigned long delta_time_us(struct timeval *t1,
Packit 8681c6
                                          struct timeval *t2)
Packit 8681c6
{
Packit 8681c6
    unsigned long d;
Packit 8681c6
    struct timeval td;
Packit 8681c6
Packit 8681c6
    timersub(t2, t1, &td);
Packit 8681c6
    d = td.tv_sec * 1000 * 1000 + td.tv_usec;
Packit 8681c6
Packit 8681c6
    return (d ? d : 1);         // return 1us if delta is 0
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
// keylength: 512, 1024, 2048, 4096
Packit 8681c6
int do_RSA_PKCS_EncryptDecrypt(int keylength)
Packit 8681c6
{
Packit 8681c6
    CK_SLOT_ID slot_id;
Packit 8681c6
    CK_SESSION_HANDLE session;
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_FLAGS flags;
Packit 8681c6
    CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
Packit 8681c6
    CK_ULONG user_pin_len;
Packit 8681c6
    CK_RV rv, rc;
Packit 8681c6
Packit 8681c6
    CK_OBJECT_HANDLE publ_key, priv_key;
Packit 8681c6
    CK_BYTE data1[100];
Packit 8681c6
    CK_BYTE data2[512];
Packit 8681c6
    CK_BYTE encdata[512];
Packit 8681c6
    CK_ULONG len1, len2, encdata_len;
Packit 8681c6
Packit 8681c6
    CK_ULONG i;
Packit 8681c6
    CK_ULONG iterations = 2000;
Packit 8681c6
    SYSTEMTIME t1, t2;
Packit 8681c6
    CK_ULONG diff, avg_time, min_time, max_time, tot_time;
Packit 8681c6
Packit 8681c6
    CK_ULONG bits = keylength;
Packit 8681c6
    CK_BYTE pub_exp[] = { 0x01, 0x00, 0x01 };
Packit 8681c6
Packit 8681c6
    CK_ATTRIBUTE pub_tmpl[] = {
Packit 8681c6
        {CKA_MODULUS_BITS, &bits, sizeof(bits)},
Packit 8681c6
        {CKA_PUBLIC_EXPONENT, &pub_exp, sizeof(pub_exp)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    testcase_begin("RSA PKCS Encrypt with keylen=%d datalen=%d",
Packit 8681c6
                   keylength, (int) sizeof(data1));
Packit 8681c6
Packit 8681c6
    slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_rw_session();
Packit 8681c6
    testcase_user_login();
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN;
Packit 8681c6
    mech.ulParameterLen = 0;
Packit 8681c6
    mech.pParameter = NULL;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_GenerateKeyPair(session, &mech, pub_tmpl, 2, NULL, 0,
Packit 8681c6
                                  &publ_key, &priv_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_GenerateKeyPair rc=%s", p11_get_ckr(rc));
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    len1 = sizeof(data1);
Packit 8681c6
    encdata_len = sizeof(encdata);
Packit 8681c6
    for (i = 0; i < len1; i++)
Packit 8681c6
        data1[i] = (unsigned char) i;
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_RSA_PKCS;
Packit 8681c6
    mech.ulParameterLen = 0;
Packit 8681c6
    mech.pParameter = NULL;
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
Packit 8681c6
        rc = funcs->C_EncryptInit(session, &mech, publ_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_EncryptInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        encdata_len = sizeof(encdata);
Packit 8681c6
        rc = funcs->C_Encrypt(session, data1, len1, encdata, &encdata_len);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Encrypt rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
Packit 8681c6
        tot_time += diff;
Packit 8681c6
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
    min_time /= 1000;
Packit 8681c6
    max_time /= 1000;
Packit 8681c6
    avg_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldms max=%ldms avg=%ldms "
Packit 8681c6
           "op/s=%.3f\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time);
Packit 8681c6
Packit 8681c6
    printf("RSA PKCS Decrypt with keylen=%d datalen=%d\n",
Packit 8681c6
           keylength, (int) encdata_len);
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
Packit 8681c6
        rc = funcs->C_DecryptInit(session, &mech, priv_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_DecryptInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        len2 = sizeof(data2);
Packit 8681c6
        rc = funcs->C_Decrypt(session, encdata, encdata_len, data2, &len2);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Decrypt rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
        if (len2 != len1) {
Packit 8681c6
            testcase_error("len1=%lu and len2=%lu do not match ?!?",
Packit 8681c6
                           len1, len2);
Packit 8681c6
            rc = CKR_FUNCTION_FAILED;;
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
Packit 8681c6
        tot_time += diff;
Packit 8681c6
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
    min_time /= 1000;
Packit 8681c6
    max_time /= 1000;
Packit 8681c6
    avg_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldms max=%ldms avg=%ldms "
Packit 8681c6
           "op/s=%.3f\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time);
Packit 8681c6
Packit 8681c6
testcase_cleanup:
Packit 8681c6
    rv = funcs->C_CloseAllSessions(slot_id);
Packit 8681c6
    if (rv != CKR_OK) {
Packit 8681c6
        testcase_error("C_CloseAllSessions rv=%s", p11_get_ckr(rv));
Packit 8681c6
        return FALSE;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return TRUE;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
// keylength: 512, 1024, 2048, 4096
Packit 8681c6
int do_RSA_KeyGen(int keylength)
Packit 8681c6
{
Packit 8681c6
    CK_SESSION_HANDLE session;
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_FLAGS flags;
Packit 8681c6
    CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
Packit 8681c6
    CK_ULONG user_pin_len;
Packit 8681c6
    CK_RV rv, rc;
Packit 8681c6
Packit 8681c6
    CK_ULONG iterations = 10;
Packit 8681c6
    SYSTEMTIME t1, t2;
Packit 8681c6
    CK_ULONG diff, avg_time, max_time, min_time, tot_time, i;
Packit 8681c6
    CK_ULONG bits = 2048;
Packit 8681c6
Packit 8681c6
    CK_OBJECT_HANDLE publ_key, priv_key;
Packit 8681c6
    CK_BYTE pub_exp[] = { 0x01, 0x00, 0x01 };
Packit 8681c6
    CK_ATTRIBUTE pub_tmpl[] = {
Packit 8681c6
        {CKA_MODULUS_BITS, &bits, sizeof(bits)},
Packit 8681c6
        {CKA_PUBLIC_EXPONENT, &pub_exp, sizeof(pub_exp)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    testcase_begin("RSA KeyGen with keylen=%d", keylength);
Packit 8681c6
Packit 8681c6
    testcase_rw_session();
Packit 8681c6
    testcase_user_login();
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN;
Packit 8681c6
    mech.ulParameterLen = 0;
Packit 8681c6
    mech.pParameter = NULL;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_GenerateKeyPair(session, &mech, pub_tmpl, 2, NULL, 0,
Packit 8681c6
                                  &publ_key, &priv_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_GenerateKeyPair rc=%s", p11_get_ckr(rc));
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
    max_time = 0x00000000;
Packit 8681c6
    tot_time = 0x00000000;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
        rc = funcs->C_GenerateKeyPair(session, &mech, pub_tmpl, 2,
Packit 8681c6
                                      NULL, 0, &publ_key, &priv_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_GenerateKeyPair rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
        tot_time += diff;
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
    min_time /= 1000;
Packit 8681c6
    max_time /= 1000;
Packit 8681c6
    avg_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldms max=%ldms avg=%ldms "
Packit 8681c6
           "op/s=%.3f\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time);
Packit 8681c6
Packit 8681c6
testcase_cleanup:
Packit 8681c6
    rv = funcs->C_CloseSession(session);
Packit 8681c6
    if (rv != CKR_OK) {
Packit 8681c6
        testcase_error("C_CloseSession rv=%s", p11_get_ckr(rv));
Packit 8681c6
        return FALSE;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return TRUE;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
// keylength: 512, 1024, 2048, 4096
Packit 8681c6
int do_RSA_PKCS_SignVerify(int keylength)
Packit 8681c6
{
Packit 8681c6
    CK_SLOT_ID slot_id;
Packit 8681c6
    CK_SESSION_HANDLE session;
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_FLAGS flags;
Packit 8681c6
    CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
Packit 8681c6
    CK_ULONG user_pin_len;
Packit 8681c6
    CK_RV rv, rc;
Packit 8681c6
Packit 8681c6
    CK_ULONG i, len1, sig_len;
Packit 8681c6
    CK_BYTE signature[512];
Packit 8681c6
    CK_BYTE data1[100];
Packit 8681c6
    CK_OBJECT_HANDLE publ_key, priv_key;
Packit 8681c6
Packit 8681c6
    SYSTEMTIME t1, t2;
Packit 8681c6
    CK_ULONG diff, avg_time, min_time, max_time, tot_time;
Packit 8681c6
    CK_ULONG iterations = 1000;
Packit 8681c6
Packit 8681c6
    CK_ULONG bits = keylength;
Packit 8681c6
    CK_BYTE pub_exp[] = { 0x01, 0x00, 0x01 };
Packit 8681c6
    CK_ATTRIBUTE pub_tmpl[] = {
Packit 8681c6
        {CKA_MODULUS_BITS, &bits, sizeof(bits)},
Packit 8681c6
        {CKA_PUBLIC_EXPONENT, &pub_exp, sizeof(pub_exp)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_begin("RSA PKCS Sign with keylen=%d datalen=%d",
Packit 8681c6
                   keylength, (int) sizeof(data1));
Packit 8681c6
Packit 8681c6
    testcase_rw_session();
Packit 8681c6
    testcase_user_login();
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN;
Packit 8681c6
    mech.ulParameterLen = 0;
Packit 8681c6
    mech.pParameter = NULL;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_GenerateKeyPair(session, &mech, pub_tmpl, 2, NULL, 0,
Packit 8681c6
                                  &publ_key, &priv_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_GenerateKeyPair rc=%s", p11_get_ckr(rc));
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
    // sign some data
Packit 8681c6
    len1 = sizeof(data1);
Packit 8681c6
    sig_len = sizeof(signature);
Packit 8681c6
Packit 8681c6
    for (i = 0; i < len1; i++)
Packit 8681c6
        data1[i] = (unsigned char) i;
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_RSA_PKCS;
Packit 8681c6
    mech.ulParameterLen = 0;
Packit 8681c6
    mech.pParameter = NULL;
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
Packit 8681c6
        rc = funcs->C_SignInit(session, &mech, priv_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_SignInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        sig_len = sizeof(signature);
Packit 8681c6
        rc = funcs->C_Sign(session, data1, len1, signature, &sig_len);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Sign rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
        tot_time += diff;
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
    min_time /= 1000;
Packit 8681c6
    max_time /= 1000;
Packit 8681c6
    avg_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldms max=%ldms avg=%ldms "
Packit 8681c6
           "op/s=%.3f\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time);
Packit 8681c6
Packit 8681c6
    printf("RSA PKCS Verify with keylen=%d datalen=%d\n",
Packit 8681c6
           keylength, (int) sizeof(data1));
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
        rc = funcs->C_VerifyInit(session, &mech, publ_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_VerifyInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        rc = funcs->C_Verify(session, data1, len1, signature, sig_len);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Verify rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
        tot_time += diff;
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
    min_time /= 1000;
Packit 8681c6
    max_time /= 1000;
Packit 8681c6
    avg_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldms max=%ldms avg=%ldms "
Packit 8681c6
           "op/s=%.3f\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time);
Packit 8681c6
Packit 8681c6
testcase_cleanup:
Packit 8681c6
    rv = funcs->C_CloseAllSessions(slot_id);
Packit 8681c6
    if (rv != CKR_OK) {
Packit 8681c6
        testcase_error("C_CloseAllSession rv=%s", p11_get_ckr(rv));
Packit 8681c6
        return FALSE;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return TRUE;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
// mode: ECB CBC
Packit 8681c6
int do_DES3_EncrDecr(const char *mode)
Packit 8681c6
{
Packit 8681c6
    CK_SLOT_ID slot_id;
Packit 8681c6
    CK_SESSION_HANDLE session;
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_FLAGS flags;
Packit 8681c6
    CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
Packit 8681c6
    CK_ULONG user_pin_len;
Packit 8681c6
    CK_RV rv, rc;
Packit 8681c6
Packit 8681c6
    CK_OBJECT_HANDLE h_key;
Packit 8681c6
    CK_BYTE original[BIG_REQUEST];
Packit 8681c6
    CK_BYTE cipher[BIG_REQUEST];
Packit 8681c6
    CK_BYTE clear[BIG_REQUEST];
Packit 8681c6
    CK_ULONG orig_len, cipher_len, clear_len;
Packit 8681c6
    CK_BYTE init_v[8] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
Packit 8681c6
Packit 8681c6
    SYSTEMTIME t1, t2;
Packit 8681c6
    CK_ULONG i, iterations = 10000;
Packit 8681c6
    CK_ULONG avg_time, tot_time, min_time, max_time, diff;
Packit 8681c6
Packit 8681c6
    slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_begin("DES3 Encrypt with mode=%s datalen=%d\n", mode, BIG_REQUEST);
Packit 8681c6
Packit 8681c6
    if (is_cca_token(SLOT_ID) && strcmp(mode, "ECB") == 0) {
Packit 8681c6
        testcase_skip("Slot %u doesn't support DES3 ECB En/Decrypt\n",
Packit 8681c6
                      (unsigned) SLOT_ID);
Packit 8681c6
        return TRUE;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_rw_session();
Packit 8681c6
    testcase_user_login();
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_DES3_KEY_GEN;
Packit 8681c6
    mech.ulParameterLen = 0;
Packit 8681c6
    mech.pParameter = NULL;
Packit 8681c6
Packit 8681c6
    // generate a DES3 key
Packit 8681c6
    rc = funcs->C_GenerateKey(session, &mech, NULL, 0, &h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_GenerateKey rc=%s", p11_get_ckr(rc));
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
    // clear buffers
Packit 8681c6
    memset(clear, 0, BIG_REQUEST);
Packit 8681c6
    memset(original, 0, BIG_REQUEST);
Packit 8681c6
    memset(cipher, 0, BIG_REQUEST);
Packit 8681c6
Packit 8681c6
    // encrypt some data
Packit 8681c6
    orig_len = BIG_REQUEST;
Packit 8681c6
    for (i = 0; i < orig_len; i++)
Packit 8681c6
        original[i] = i % 255;
Packit 8681c6
Packit 8681c6
    if (strcmp(mode, "ECB") == 0) {
Packit 8681c6
        mech.mechanism = CKM_DES3_ECB;
Packit 8681c6
        mech.ulParameterLen = 0;
Packit 8681c6
        mech.pParameter = NULL;
Packit 8681c6
    } else if (strcmp(mode, "CBC") == 0) {
Packit 8681c6
        mech.mechanism = CKM_DES3_CBC;
Packit 8681c6
        mech.ulParameterLen = 8;
Packit 8681c6
        mech.pParameter = init_v;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_error("unknown mode %s in do_DES3_EncrDecr()", mode);
Packit 8681c6
        rc = CKR_MECHANISM_INVALID;
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
        rc = funcs->C_EncryptInit(session, &mech, h_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_EncryptInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        cipher_len = BIG_REQUEST;
Packit 8681c6
        rc = funcs->C_Encrypt(session, original, orig_len, cipher, &cipher_len);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Encrypt rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
Packit 8681c6
        tot_time += diff;
Packit 8681c6
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldus max=%ldus avg=%ldus "
Packit 8681c6
           "op/s=%.3f %.3fMB/s\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time,
Packit 8681c6
           (((double) (iterations * 1000) / (double) (1024 * 1024)) *
Packit 8681c6
            BIG_REQUEST) / (double) tot_time);
Packit 8681c6
Packit 8681c6
    printf("DES3 Decrypt with mode=%s datalen=%d\n", mode, BIG_REQUEST);
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
Packit 8681c6
        rc = funcs->C_DecryptInit(session, &mech, h_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_DecryptInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        clear_len = BIG_REQUEST;
Packit 8681c6
        rc = funcs->C_Decrypt(session, cipher, cipher_len, clear, &clear_len);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Decrypt rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
Packit 8681c6
        tot_time += diff;
Packit 8681c6
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldus max=%ldus avg=%ldus "
Packit 8681c6
           "op/s=%.3f %.3fMB/s\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time,
Packit 8681c6
           (((double) (iterations * 1000) / (double) (1024 * 1024)) *
Packit 8681c6
            BIG_REQUEST) / (double) tot_time);
Packit 8681c6
Packit 8681c6
testcase_cleanup:
Packit 8681c6
    rv = funcs->C_CloseAllSessions(slot_id);
Packit 8681c6
    if (rv != CKR_OK) {
Packit 8681c6
        testcase_error("C_CloseAllSessions rc=%s", p11_get_ckr(rv));
Packit 8681c6
        return FALSE;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return TRUE;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
// keylength: 128...256
Packit 8681c6
// mode: ECB CBC
Packit 8681c6
int do_AES_EncrDecr(int keylength, const char *mode)
Packit 8681c6
{
Packit 8681c6
    CK_SLOT_ID slot_id;
Packit 8681c6
    CK_SESSION_HANDLE session;
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_FLAGS flags;
Packit 8681c6
    CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
Packit 8681c6
    CK_ULONG user_pin_len;
Packit 8681c6
    CK_RV rv, rc;
Packit 8681c6
Packit 8681c6
    CK_OBJECT_HANDLE h_key;
Packit 8681c6
    CK_BYTE original[BIG_REQUEST];
Packit 8681c6
    CK_BYTE cipher[BIG_REQUEST];
Packit 8681c6
    CK_BYTE clear[BIG_REQUEST];
Packit 8681c6
    CK_ULONG orig_len, cipher_len, clear_len;
Packit 8681c6
    CK_ULONG key_len = keylength / 8;
Packit 8681c6
Packit 8681c6
    CK_BYTE init_v[16] = {
Packit 8681c6
        0x01, 0x02, 0x03, 0x04, 0x05,
Packit 8681c6
        0x06, 0x07, 0x08, 0x09, 0x0A,
Packit 8681c6
        0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
Packit 8681c6
        0x10
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_ULONG i, iterations = 50000;
Packit 8681c6
    SYSTEMTIME t1, t2;
Packit 8681c6
    CK_ULONG avg_time, tot_time, min_time, max_time, diff;
Packit 8681c6
Packit 8681c6
    testcase_begin("AES Encrypt with mode=%s keylen=%ld datalen=%d\n",
Packit 8681c6
                   mode, key_len * 8, BIG_REQUEST);
Packit 8681c6
Packit 8681c6
    slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_rw_session();
Packit 8681c6
    testcase_user_login();
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_AES_KEY_GEN;
Packit 8681c6
    mech.ulParameterLen = 0;
Packit 8681c6
    mech.pParameter = NULL;
Packit 8681c6
Packit 8681c6
    rc = generate_AESKey(session, key_len, &mech, &h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_GenerateKey rc=%s", p11_get_ckr(rc));
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
    // clear buffers
Packit 8681c6
    memset(original, 0, BIG_REQUEST);
Packit 8681c6
    memset(clear, 0, BIG_REQUEST);
Packit 8681c6
    memset(cipher, 0, BIG_REQUEST);
Packit 8681c6
Packit 8681c6
    // encrypt some data
Packit 8681c6
    orig_len = BIG_REQUEST;
Packit 8681c6
    for (i = 0; i < orig_len; i++)
Packit 8681c6
        original[i] = i % 255;
Packit 8681c6
Packit 8681c6
    if (strcmp(mode, "ECB") == 0) {
Packit 8681c6
        mech.mechanism = CKM_AES_ECB;
Packit 8681c6
        mech.ulParameterLen = 0;
Packit 8681c6
        mech.pParameter = NULL;
Packit 8681c6
    } else if (strcmp(mode, "CBC") == 0) {
Packit 8681c6
        mech.mechanism = CKM_AES_CBC;
Packit 8681c6
        mech.ulParameterLen = 16;
Packit 8681c6
        mech.pParameter = init_v;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_error("unknown mode %s in do_AES_EncrDecr()", mode);
Packit 8681c6
        rc = CKR_MECHANISM_INVALID;
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
        rc = funcs->C_EncryptInit(session, &mech, h_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_EncryptInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        cipher_len = BIG_REQUEST;
Packit 8681c6
        rc = funcs->C_Encrypt(session, original, orig_len, cipher, &cipher_len);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Encrypt rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
        tot_time += diff;
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldus max=%ldus avg=%ldus "
Packit 8681c6
           "op/s=%.3f %.3fMB/s\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time,
Packit 8681c6
           (((double) (iterations * 1000) / (double) (1024 * 1024)) *
Packit 8681c6
            BIG_REQUEST) / (double) tot_time);
Packit 8681c6
Packit 8681c6
    printf("AES Decrypt with mode=%s keylen=%ld datalen=%d\n",
Packit 8681c6
           mode, key_len * 8, BIG_REQUEST);
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
        rc = funcs->C_DecryptInit(session, &mech, h_key);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_DecryptInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        clear_len = BIG_REQUEST;
Packit 8681c6
        rc = funcs->C_Decrypt(session, cipher, cipher_len, clear, &clear_len);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Decrypt rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
        tot_time += diff;
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldus max=%ldus avg=%ldus "
Packit 8681c6
           "op/s=%.3f %.3fMB/s\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time,
Packit 8681c6
           (((double) (iterations * 1000) / (double) (1024 * 1024)) *
Packit 8681c6
            BIG_REQUEST) / (double) tot_time);
Packit 8681c6
Packit 8681c6
Packit 8681c6
testcase_cleanup:
Packit 8681c6
    rv = funcs->C_CloseAllSessions(slot_id);
Packit 8681c6
    if (rv != CKR_OK) {
Packit 8681c6
        testcase_error("C_CloseAllSessions rc=%s", p11_get_ckr(rv));
Packit 8681c6
        return FALSE;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return TRUE;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
int do_SHA(const char *mode)
Packit 8681c6
{
Packit 8681c6
    CK_SLOT_ID slot_id;
Packit 8681c6
    CK_SESSION_HANDLE session;
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_FLAGS flags;
Packit 8681c6
    CK_RV rc, rv;
Packit 8681c6
Packit 8681c6
    CK_BYTE data[BIG_REQUEST];
Packit 8681c6
    CK_BYTE hash[MAX_HASH_LEN];
Packit 8681c6
    CK_ULONG data_len, hash_len, h_len;
Packit 8681c6
Packit 8681c6
    SYSTEMTIME t1, t2;
Packit 8681c6
    CK_ULONG diff, avg_time, tot_time, min_time, max_time;
Packit 8681c6
    CK_ULONG i, iterations = 20000;
Packit 8681c6
Packit 8681c6
    printf("SHA (%s) with datalen=%d\n", mode, BIG_REQUEST);
Packit 8681c6
Packit 8681c6
    slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_rw_session();
Packit 8681c6
Packit 8681c6
    mech.ulParameterLen = 0;
Packit 8681c6
    mech.pParameter = NULL;
Packit 8681c6
Packit 8681c6
    if (strcmp(mode, "SHA1") == 0) {
Packit 8681c6
        mech.mechanism = CKM_SHA_1;
Packit 8681c6
        hash_len = SHA1_HASH_LEN;
Packit 8681c6
    } else if (strcmp(mode, "SHA256") == 0) {
Packit 8681c6
        mech.mechanism = CKM_SHA256;
Packit 8681c6
        hash_len = SHA256_HASH_LEN;
Packit 8681c6
    } else if (strcmp(mode, "SHA512") == 0) {
Packit 8681c6
        mech.mechanism = CKM_SHA512;
Packit 8681c6
        hash_len = SHA512_HASH_LEN;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_error("unknown mode %s in do_SHA()", mode);
Packit 8681c6
        rc = CKR_MECHANISM_INVALID;
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    // generate some data to hash
Packit 8681c6
    //
Packit 8681c6
    data_len = BIG_REQUEST;
Packit 8681c6
    memset(data, 0, data_len);
Packit 8681c6
    for (i = 0; i < data_len; i++)
Packit 8681c6
        data[i] = i % 255;
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
Packit 8681c6
        rc = funcs->C_DigestInit(session, &mech);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_DigestInit rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        h_len = sizeof(hash);
Packit 8681c6
        rc = funcs->C_Digest(session, data, data_len, hash, &h_len);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("C_Digest rc=%s", p11_get_ckr(rc));
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        if (h_len != hash_len) {
Packit 8681c6
            testcase_error
Packit 8681c6
                ("returned hashlen %ld doesn't match to expected len %ld\n",
Packit 8681c6
                 h_len, hash_len);
Packit 8681c6
            rc = CKR_FUNCTION_FAILED;
Packit 8681c6
            goto testcase_cleanup;
Packit 8681c6
        }
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
        tot_time += diff;
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldus max=%ldus avg=%ldus "
Packit 8681c6
           "op/s=%.3f %.3fMB/s\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time,
Packit 8681c6
           (((double) (iterations * 1000) / (double) (1024 * 1024)) *
Packit 8681c6
            BIG_REQUEST) / (double) tot_time);
Packit 8681c6
Packit 8681c6
testcase_cleanup:
Packit 8681c6
    rv = funcs->C_CloseAllSessions(slot_id);
Packit 8681c6
    if (rv != CKR_OK) {
Packit 8681c6
        testcase_error("C_CloseAllSessions rv=%s", p11_get_ckr(rv));
Packit 8681c6
        return FALSE;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return TRUE;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
Packit 8681c6
int do_DummyFunction(void)
Packit 8681c6
{
Packit 8681c6
#if DUMMY
Packit 8681c6
    CK_SLOT_ID slot_id;
Packit 8681c6
    CK_ULONG i, diff, avg_time, min_time, max_time;
Packit 8681c6
    CK_ULONG iterations = 1000;
Packit 8681c6
    SYSTEMTIME t1, t2;
Packit 8681c6
Packit 8681c6
    testcase_begin("do_DummyFunction...");
Packit 8681c6
Packit 8681c6
    slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    tot_time = 0;
Packit 8681c6
    max_time = 0;
Packit 8681c6
    min_time = 0xFFFFFFFF;
Packit 8681c6
Packit 8681c6
    for (i = 0; i < iterations + 2; i++) {
Packit 8681c6
        GetSystemTime(&t1;;
Packit 8681c6
        DummyFunction(slot_id);
Packit 8681c6
Packit 8681c6
        GetSystemTime(&t2;;
Packit 8681c6
Packit 8681c6
        diff = delta_time_us(&t1, &t2;;
Packit 8681c6
        tot_time += diff;
Packit 8681c6
Packit 8681c6
        if (diff < min_time)
Packit 8681c6
            min_time = diff;
Packit 8681c6
Packit 8681c6
        if (diff > max_time)
Packit 8681c6
            max_time = diff;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    tot_time -= min_time;
Packit 8681c6
    tot_time -= max_time;
Packit 8681c6
    avg_time = tot_time / iterations;
Packit 8681c6
Packit 8681c6
    // us -> ms
Packit 8681c6
    tot_time /= 1000;
Packit 8681c6
    min_time /= 1000;
Packit 8681c6
    max_time /= 1000;
Packit 8681c6
Packit 8681c6
    printf("%ld iterations: total=%ldms min=%ldms max=%ldms avg=%ldms "
Packit 8681c6
           "op/s=%.3f\n\n", iterations, tot_time, min_time, max_time,
Packit 8681c6
           avg_time, (double) (iterations * 1000) / (double) tot_time);
Packit 8681c6
#endif
Packit 8681c6
Packit 8681c6
    return TRUE;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
void speed_usage(char *fct)
Packit 8681c6
{
Packit 8681c6
    printf("usage:  %s -slot <num>", fct);
Packit 8681c6
    printf(" [-rsa_keygen] [-rsa_signverify]");
Packit 8681c6
    printf(" [-rsa_endecrypt] [-des3] [-aes] [-sha]");
Packit 8681c6
    printf(" [-h] \n\n");
Packit 8681c6
Packit 8681c6
    return;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
int main(int argc, char **argv)
Packit 8681c6
{
Packit 8681c6
    CK_C_INITIALIZE_ARGS cinit_args;
Packit 8681c6
    int rc, i;
Packit 8681c6
    int do_rsa_keygen = 0;
Packit 8681c6
    int do_rsa_signverify = 0;
Packit 8681c6
    int do_rsa_endecrypt = 0;
Packit 8681c6
    int do_des3_endecrypt = 0;
Packit 8681c6
    int do_aes_endecrypt = 0;
Packit 8681c6
    int do_sha = 0;
Packit 8681c6
Packit 8681c6
    SLOT_ID = 1000;
Packit 8681c6
Packit 8681c6
    for (i = 1; i < argc; i++) {
Packit 8681c6
        if (strcmp(argv[i], "-slot") == 0) {
Packit 8681c6
            SLOT_ID = atoi(argv[i + 1]);
Packit 8681c6
            i++;
Packit 8681c6
            continue;
Packit 8681c6
        }
Packit 8681c6
        if (strcmp(argv[i], "-rsa_keygen") == 0) {
Packit 8681c6
            do_rsa_keygen = 1;
Packit 8681c6
        } else if (strcmp(argv[i], "-rsa_signverify") == 0) {
Packit 8681c6
            do_rsa_signverify = 1;
Packit 8681c6
        } else if (strcmp(argv[i], "-rsa_endecrypt") == 0) {
Packit 8681c6
            do_rsa_endecrypt = 1;
Packit 8681c6
        } else if (strcmp(argv[i], "-des3") == 0) {
Packit 8681c6
            do_des3_endecrypt = 1;
Packit 8681c6
        } else if (strcmp(argv[i], "-aes") == 0) {
Packit 8681c6
            do_aes_endecrypt = 1;
Packit 8681c6
        } else if (strcmp(argv[i], "-sha") == 0) {
Packit 8681c6
            do_sha = 1;
Packit 8681c6
        } else if (strcmp(argv[i], "-h") == 0) {
Packit 8681c6
            speed_usage(argv[0]);
Packit 8681c6
            return 0;
Packit 8681c6
        } else {
Packit 8681c6
            printf("unknown option '%s'\n", argv[i]);
Packit 8681c6
            speed_usage(argv[0]);
Packit 8681c6
            return 1;
Packit 8681c6
        }
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    // error if slot has not been identified.
Packit 8681c6
    if (SLOT_ID == 1000) {
Packit 8681c6
        printf("Please specify the slot to be tested.\n");
Packit 8681c6
        speed_usage(argv[0]);
Packit 8681c6
        return 1;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (do_rsa_keygen + do_rsa_signverify + do_rsa_endecrypt
Packit 8681c6
        + do_des3_endecrypt + do_aes_endecrypt + do_sha == 0) {
Packit 8681c6
        do_rsa_keygen = 1;
Packit 8681c6
        do_rsa_signverify = 1;
Packit 8681c6
        do_rsa_endecrypt = 1;
Packit 8681c6
        do_des3_endecrypt = 1;
Packit 8681c6
        do_aes_endecrypt = 1;
Packit 8681c6
        do_sha = 1;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    printf("Using slot #%lu...\n\n", SLOT_ID);
Packit 8681c6
Packit 8681c6
    rc = do_GetFunctionList();
Packit 8681c6
    if (!rc)
Packit 8681c6
        return rc;
Packit 8681c6
Packit 8681c6
    memset(&cinit_args, 0x0, sizeof(cinit_args));
Packit 8681c6
    cinit_args.flags = CKF_OS_LOCKING_OK;
Packit 8681c6
Packit 8681c6
    funcs->C_Initialize(&cinit_args);
Packit 8681c6
Packit 8681c6
    if (do_rsa_keygen) {
Packit 8681c6
        rc = do_RSA_KeyGen(1024);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_RSA_KeyGen(2048);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_RSA_KeyGen(4096);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (do_rsa_signverify) {
Packit 8681c6
        rc = do_RSA_PKCS_SignVerify(1024);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_RSA_PKCS_SignVerify(2048);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_RSA_PKCS_SignVerify(4096);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (do_rsa_endecrypt) {
Packit 8681c6
        rc = do_RSA_PKCS_EncryptDecrypt(1024);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_RSA_PKCS_EncryptDecrypt(2048);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_RSA_PKCS_EncryptDecrypt(4096);
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (do_des3_endecrypt) {
Packit 8681c6
        rc = do_DES3_EncrDecr("ECB");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_DES3_EncrDecr("CBC");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (do_aes_endecrypt) {
Packit 8681c6
        rc = do_AES_EncrDecr(128, "ECB");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_AES_EncrDecr(128, "CBC");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_AES_EncrDecr(192, "ECB");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_AES_EncrDecr(192, "CBC");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_AES_EncrDecr(256, "ECB");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_AES_EncrDecr(256, "CBC");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (do_sha) {
Packit 8681c6
        rc = do_SHA("SHA1");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_SHA("SHA256");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
        rc = do_SHA("SHA512");
Packit 8681c6
        if (!rc)
Packit 8681c6
            return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    funcs->C_Finalize(NULL);
Packit 8681c6
Packit 8681c6
    return 0;
Packit 8681c6
}