Blame testcases/crypto/ssl3_func.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
#include <windows.h>
Packit 8681c6
Packit 8681c6
#include <stdio.h>
Packit 8681c6
#include <stdlib.h>
Packit 8681c6
#include <string.h>
Packit 8681c6
#include <memory.h>
Packit 8681c6
Packit 8681c6
#include "pkcs11types.h"
Packit 8681c6
#include "regress.h"
Packit 8681c6
#include "common.c"
Packit 8681c6
#include "mech_to_str.h"
Packit 8681c6
Packit 8681c6
static CK_BBOOL true = TRUE;
Packit 8681c6
static CK_BBOOL false = FALSE;
Packit 8681c6
Packit 8681c6
//
Packit 8681c6
//
Packit 8681c6
CK_RV do_SignVerify_SSL3_MD5_MAC(CK_SESSION_HANDLE session)
Packit 8681c6
{
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_ULONG mac_size;
Packit 8681c6
    CK_ULONG i;
Packit 8681c6
    CK_RV rc = CKR_OK;
Packit 8681c6
Packit 8681c6
    CK_OBJECT_HANDLE h_key;
Packit 8681c6
    CK_OBJECT_CLASS key_class = CKO_SECRET_KEY;
Packit 8681c6
    CK_KEY_TYPE key_type = CKK_GENERIC_SECRET;
Packit 8681c6
    CK_BBOOL false = FALSE;
Packit 8681c6
    CK_BYTE hash[MD5_HASH_LEN];
Packit 8681c6
    CK_BYTE data[50];
Packit 8681c6
    CK_BYTE data2[500];
Packit 8681c6
    CK_BYTE key_data[48];
Packit 8681c6
    CK_ULONG hash_len;
Packit 8681c6
    CK_ULONG data_len;
Packit 8681c6
    CK_ATTRIBUTE key_attribs[] = {
Packit 8681c6
        {CKA_CLASS, &key_class, sizeof(key_class)},
Packit 8681c6
        {CKA_KEY_TYPE, &key_type, sizeof(key_type)},
Packit 8681c6
        {CKA_TOKEN, &false, sizeof(false)},
Packit 8681c6
        {CKA_VALUE, &key_data, sizeof(key_data)}
Packit 8681c6
    };
Packit 8681c6
    CK_SLOT_ID slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_begin("starting do_SignVerify_SSL3_MD5_MAC...\n");
Packit 8681c6
Packit 8681c6
    mac_size = 16;
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_SSL3_MD5_MAC;
Packit 8681c6
    mech.ulParameterLen = sizeof(CK_ULONG);
Packit 8681c6
    mech.pParameter = &mac_size;
Packit 8681c6
Packit 8681c6
Packit 8681c6
    /** skip test if the slot doesn't support this mechanism **/
Packit 8681c6
    if (!mech_supported(slot_id, mech.mechanism)) {
Packit 8681c6
        testsuite_skip(48, "Slot %u doesn't support %s (%u)",
Packit 8681c6
                       (unsigned int) slot_id,
Packit 8681c6
                       mech_to_str(mech.mechanism),
Packit 8681c6
                       (unsigned int) mech.mechanism);
Packit 8681c6
        goto skipped;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    for (i = 0; i < 48; i++)
Packit 8681c6
        key_data[i] = i;
Packit 8681c6
Packit 8681c6
    memset(data, 0xb, 50);
Packit 8681c6
    data_len = 50;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_CreateObject(session, key_attribs, 4, &h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_CreateObject() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_SignInit(session, &mech, h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_SignInit() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    hash_len = sizeof(hash);
Packit 8681c6
    rc = funcs->C_Sign(session, data, data_len, hash, &hash_len);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_fail("C_Sign() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (hash_len != mac_size) {
Packit 8681c6
        testcase_fail("Error: C_Sign generated bad MAC length\n");
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Successfully signed.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_VerifyInit(session, &mech, h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_VerifyInit() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    rc = funcs->C_Verify(session, data, data_len, hash, hash_len);
Packit 8681c6
    if (rc != CKR_OK)
Packit 8681c6
        testcase_fail("C_Verify() rc = %s", p11_get_ckr(rc));
Packit 8681c6
    else
Packit 8681c6
        testcase_pass("Successfully verified.");
Packit 8681c6
Packit 8681c6
    rc = funcs->C_DestroyObject(session, h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_DestroyObject() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
    // TESTCASE #2
Packit 8681c6
Packit 8681c6
    for (i = 0; i < 48; i++)
Packit 8681c6
        key_data[i] = i;
Packit 8681c6
Packit 8681c6
    memset(data2, 0xb, 500);
Packit 8681c6
    data_len = 500;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_CreateObject(session, key_attribs, 4, &h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_CreateObject() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_SignInit(session, &mech, h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_SignInit() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    for (i = 0; i < 500; i += 100) {
Packit 8681c6
        rc = funcs->C_SignUpdate(session, &data2[i], 100);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("Iteration #%ld, C_SignUpdate() rc = %s", i / 100,
Packit 8681c6
                           p11_get_ckr(rc));
Packit 8681c6
            goto done;
Packit 8681c6
        }
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    hash_len = sizeof(hash);
Packit 8681c6
    rc = funcs->C_SignFinal(session, hash, &hash_len);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_SignFinal() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (hash_len != mac_size) {
Packit 8681c6
        testcase_fail("Error: C_SignUpdate/Final generated bad MAC length\n");
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Sucessfully signed in multipart.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_VerifyInit(session, &mech, h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_VerifyInit() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    for (i = 0; i < 500; i += 100) {
Packit 8681c6
        rc = funcs->C_VerifyUpdate(session, &data2[i], 100);
Packit 8681c6
        if (rc != CKR_OK) {
Packit 8681c6
            testcase_error("Iteration #%ld, C_VerifyUpdate() rc = %s", i / 100,
Packit 8681c6
                           p11_get_ckr(rc));
Packit 8681c6
            goto done;
Packit 8681c6
        }
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    rc = funcs->C_VerifyFinal(session, hash, hash_len);
Packit 8681c6
    if (rc != CKR_OK)
Packit 8681c6
        testcase_fail("C_VerifyFinal rc = %s", p11_get_ckr(rc));
Packit 8681c6
    else
Packit 8681c6
        testcase_pass("Successfully verified signature in multipart.");
Packit 8681c6
Packit 8681c6
done:
Packit 8681c6
    if (funcs->C_DestroyObject(session, h_key) != CKR_OK)
Packit 8681c6
        testcase_error("C_DestroyObject failed.");
Packit 8681c6
Packit 8681c6
skipped:
Packit 8681c6
    return rc;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
Packit 8681c6
//
Packit 8681c6
//
Packit 8681c6
CK_RV do_SignVerify_SSL3_SHA1_MAC(CK_SESSION_HANDLE session)
Packit 8681c6
{
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_ULONG mac_size;
Packit 8681c6
    CK_ULONG i;
Packit 8681c6
    CK_RV rc = CKR_OK;
Packit 8681c6
Packit 8681c6
    CK_OBJECT_HANDLE h_key;
Packit 8681c6
    CK_OBJECT_CLASS key_class = CKO_SECRET_KEY;
Packit 8681c6
    CK_KEY_TYPE key_type = CKK_GENERIC_SECRET;
Packit 8681c6
    CK_BBOOL false = FALSE;
Packit 8681c6
    CK_BYTE hash[SHA1_HASH_LEN];
Packit 8681c6
    CK_BYTE data[50];
Packit 8681c6
    CK_BYTE key_data[48];
Packit 8681c6
    CK_ULONG hash_len;
Packit 8681c6
    CK_ULONG data_len;
Packit 8681c6
    CK_ATTRIBUTE key_attribs[] = {
Packit 8681c6
        {CKA_CLASS, &key_class, sizeof(key_class)},
Packit 8681c6
        {CKA_KEY_TYPE, &key_type, sizeof(key_type)},
Packit 8681c6
        {CKA_TOKEN, &false, sizeof(false)},
Packit 8681c6
        {CKA_VALUE, &key_data, sizeof(key_data)}
Packit 8681c6
    };
Packit 8681c6
    CK_SLOT_ID slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_begin("starting do_SignVerify_SSL3_SHA1_MAC...\n");
Packit 8681c6
Packit 8681c6
    mac_size = 20;
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_SSL3_SHA1_MAC;
Packit 8681c6
    mech.ulParameterLen = sizeof(CK_ULONG);
Packit 8681c6
    mech.pParameter = &mac_size;
Packit 8681c6
Packit 8681c6
    /** skip test if the slot doesn't support this mechanism **/
Packit 8681c6
    if (!mech_supported(slot_id, mech.mechanism)) {
Packit 8681c6
        testsuite_skip(48, "Slot %u doesn't support %s (%u)",
Packit 8681c6
                       (unsigned int) slot_id,
Packit 8681c6
                       mech_to_str(mech.mechanism),
Packit 8681c6
                       (unsigned int) mech.mechanism);
Packit 8681c6
        goto skipped;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    for (i = 0; i < 48; i++)
Packit 8681c6
        key_data[i] = i;
Packit 8681c6
Packit 8681c6
    memset(data, 0xb, 50);
Packit 8681c6
    data_len = 50;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_CreateObject(session, key_attribs, 4, &h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_CreateObject() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_SignInit(session, &mech, h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_fail("C_SignInit() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    hash_len = sizeof(hash);
Packit 8681c6
    rc = funcs->C_Sign(session, data, data_len, hash, &hash_len);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_fail("C_Sign() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (hash_len != mac_size) {
Packit 8681c6
        testcase_fail("Error: C_Sign generated bad MAC length\n");
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Successfully signed.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_VerifyInit(session, &mech, h_key);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_VerifyInit() rc = %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    rc = funcs->C_Verify(session, data, data_len, hash, hash_len);
Packit 8681c6
    if (rc != CKR_OK)
Packit 8681c6
        testcase_fail("C_Verify() rc = %s", p11_get_ckr(rc));
Packit 8681c6
    else
Packit 8681c6
        testcase_pass("Successfully verified signature.");
Packit 8681c6
Packit 8681c6
done:
Packit 8681c6
    if (funcs->C_DestroyObject(session, h_key) != CKR_OK)
Packit 8681c6
        testcase_error("C_DestroyObject() failed.");
Packit 8681c6
Packit 8681c6
skipped:
Packit 8681c6
    return rc;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
Packit 8681c6
//
Packit 8681c6
//
Packit 8681c6
CK_RV do_SSL3_PreMasterKeyGen(CK_SESSION_HANDLE session)
Packit 8681c6
{
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_VERSION version;
Packit 8681c6
    CK_OBJECT_HANDLE h_key;
Packit 8681c6
    CK_RV rc = CKR_OK;
Packit 8681c6
    CK_SLOT_ID slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_begin("starting do_SSL3_PreMasterKeyGen...\n");
Packit 8681c6
Packit 8681c6
    version.major = 3;
Packit 8681c6
    version.minor = 0;
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_SSL3_PRE_MASTER_KEY_GEN;
Packit 8681c6
    mech.pParameter = &version;
Packit 8681c6
    mech.ulParameterLen = sizeof(CK_VERSION);
Packit 8681c6
Packit 8681c6
    /** skip test if the slot doesn't support this mechanism **/
Packit 8681c6
    if (!mech_supported(slot_id, mech.mechanism)) {
Packit 8681c6
        testsuite_skip(1, "Slot %u doesn't support %s (%u)",
Packit 8681c6
                       (unsigned int) slot_id,
Packit 8681c6
                       mech_to_str(mech.mechanism),
Packit 8681c6
                       (unsigned int) mech.mechanism);
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_GenerateKey(session, &mech, NULL, 0, &h_key);
Packit 8681c6
    if (rc != CKR_OK)
Packit 8681c6
        testcase_fail("C_GenerateKey() rc = %s", p11_get_ckr(rc));
Packit 8681c6
    else
Packit 8681c6
        testcase_pass("Successfully generated a generic secret key.");
Packit 8681c6
Packit 8681c6
    if (funcs->C_DestroyObject(session, h_key) != CKR_OK)
Packit 8681c6
        testcase_error("C_DestroyObject() failed");
Packit 8681c6
Packit 8681c6
done:
Packit 8681c6
    return rc;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
Packit 8681c6
//
Packit 8681c6
//
Packit 8681c6
CK_RV do_SSL3_MasterKeyDerive(CK_SESSION_HANDLE session)
Packit 8681c6
{
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_OBJECT_HANDLE h_pm_secret = CK_INVALID_HANDLE;
Packit 8681c6
    CK_OBJECT_HANDLE h_mk = CK_INVALID_HANDLE;
Packit 8681c6
    CK_RV rc = CKR_OK;
Packit 8681c6
Packit 8681c6
    CK_VERSION version = { 3, 0 };
Packit 8681c6
    CK_ATTRIBUTE pm_tmpl[] = {
Packit 8681c6
        {CKA_SENSITIVE, &false, sizeof(CK_BBOOL)},
Packit 8681c6
        {CKA_EXTRACTABLE, &true, sizeof(CK_BBOOL)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_BYTE client_random_data[256];
Packit 8681c6
    CK_BYTE server_random_data[256];
Packit 8681c6
    CK_ATTRIBUTE m_tmpl[] = {
Packit 8681c6
        {CKA_SENSITIVE, &true, sizeof(CK_BBOOL)},
Packit 8681c6
        {CKA_EXTRACTABLE, &false, sizeof(CK_BBOOL)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_SSL3_MASTER_KEY_DERIVE_PARAMS mk_params;
Packit 8681c6
    CK_ULONG i;
Packit 8681c6
Packit 8681c6
    CK_OBJECT_CLASS class;
Packit 8681c6
    CK_KEY_TYPE keyType;
Packit 8681c6
    CK_ATTRIBUTE test_tmpl[] = {
Packit 8681c6
        {CKA_CLASS, &class, sizeof(class)},
Packit 8681c6
        {CKA_KEY_TYPE, &keyType, sizeof(keyType)}
Packit 8681c6
    };
Packit 8681c6
    CK_SLOT_ID slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_begin("starting do_SSL3_MasterKeyDerive...\n");
Packit 8681c6
Packit 8681c6
    // generate the pre-master secret key
Packit 8681c6
    //
Packit 8681c6
    mech.mechanism = CKM_SSL3_PRE_MASTER_KEY_GEN;
Packit 8681c6
    mech.pParameter = &version;
Packit 8681c6
    mech.ulParameterLen = sizeof(CK_VERSION);
Packit 8681c6
Packit 8681c6
    /** skip test if the slot doesn't support this mechanism **/
Packit 8681c6
    if (!mech_supported(slot_id, mech.mechanism)) {
Packit 8681c6
        testsuite_skip(32, "Slot %u doesn't support %s (%u)",
Packit 8681c6
                       (unsigned int) slot_id,
Packit 8681c6
                       mech_to_str(mech.mechanism),
Packit 8681c6
                       (unsigned int) mech.mechanism);
Packit 8681c6
        goto skipped;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_GenerateKey(session, &mech, pm_tmpl, 2, &h_pm_secret);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_fail("C_GenerateKey() rc= %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Successfully generated a generic secret key.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    // derive a master key
Packit 8681c6
    //
Packit 8681c6
Packit 8681c6
    for (i = 0; i < 32; i++) {
Packit 8681c6
        client_random_data[i] = i;
Packit 8681c6
        server_random_data[i] = 32 - i;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    mk_params.pVersion = &version;
Packit 8681c6
Packit 8681c6
    mk_params.RandomInfo.pClientRandom = client_random_data;
Packit 8681c6
    mk_params.RandomInfo.pServerRandom = server_random_data;
Packit 8681c6
    mk_params.RandomInfo.ulClientRandomLen = 32;
Packit 8681c6
    mk_params.RandomInfo.ulServerRandomLen = 32;
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_SSL3_MASTER_KEY_DERIVE;
Packit 8681c6
    mech.pParameter = &mk_params;
Packit 8681c6
    mech.ulParameterLen = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS);
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_DeriveKey(session, &mech, h_pm_secret, m_tmpl, 2, &h_mk);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_fail("C_DeriveKey() rc= %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Successfully derived a key from pre-master.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    /*
Packit 8681c6
     * This mechanism provides the following attributes:
Packit 8681c6
     * CKA_CLASS = CKO_SECRET_KEY
Packit 8681c6
     * CKA_KEY_TYPE = CKK_GENERIC_SECRET
Packit 8681c6
     * CKA_VALUE_LEN = 48
Packit 8681c6
     * Check that the newly derived key has these.
Packit 8681c6
     */
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_GetAttributeValue(session, h_pm_secret, test_tmpl, 2);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_GetAttributeValue() rc= %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
    if (*(CK_OBJECT_CLASS *) test_tmpl[0].pValue != CKO_SECRET_KEY) {
Packit 8681c6
        testcase_fail("Derived key has incorrect class.");
Packit 8681c6
        goto done;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    if (*(CK_KEY_TYPE *) test_tmpl[1].pValue != CKK_GENERIC_SECRET) {
Packit 8681c6
        testcase_fail("Derived key has incorrect key type.");
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Derived key has correct attributes.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
done:
Packit 8681c6
    if (funcs->C_DestroyObject(session, h_mk) != CKR_OK)
Packit 8681c6
        testcase_error("C_DestroyObject rc=%s", p11_get_ckr(rc));
Packit 8681c6
Packit 8681c6
    if (funcs->C_DestroyObject(session, h_pm_secret) != CKR_OK)
Packit 8681c6
        testcase_error("C_DestroyObject() failed");
Packit 8681c6
Packit 8681c6
skipped:
Packit 8681c6
    return rc;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
CK_RV do_SSL3_MultipleKeysDerive(CK_SESSION_HANDLE session)
Packit 8681c6
{
Packit 8681c6
    CK_MECHANISM mech;
Packit 8681c6
    CK_OBJECT_HANDLE h_pm_secret;
Packit 8681c6
    CK_RV rc = CKR_OK;
Packit 8681c6
    CK_ULONG i;
Packit 8681c6
Packit 8681c6
    CK_VERSION version = { 3, 0 };
Packit 8681c6
    CK_BBOOL true_value = TRUE;
Packit 8681c6
    CK_BBOOL false_value = FALSE;
Packit 8681c6
    CK_ATTRIBUTE pm_tmpl[] = {
Packit 8681c6
        {CKA_TOKEN, &true_value, sizeof(true_value)},
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_BYTE client_random_data[32];
Packit 8681c6
    CK_BYTE server_random_data[32];
Packit 8681c6
    CK_ATTRIBUTE incomplete_tmpl[] = {
Packit 8681c6
        {CKA_TOKEN, &false_value, sizeof(false_value)},
Packit 8681c6
        {CKA_SENSITIVE, &false_value, sizeof(false_value)},
Packit 8681c6
        {CKA_EXTRACTABLE, &true_value, sizeof(true_value)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_OBJECT_CLASS class = CKO_SECRET_KEY;
Packit 8681c6
    CK_KEY_TYPE key_type = CKK_AES;
Packit 8681c6
    CK_ULONG key_len = 16;
Packit 8681c6
    CK_ATTRIBUTE complete_tmpl[] = {
Packit 8681c6
        {CKA_CLASS, &class, sizeof(class)},
Packit 8681c6
        {CKA_KEY_TYPE, &key_type, sizeof(key_type)},
Packit 8681c6
        {CKA_VALUE_LEN, &key_len, sizeof(CK_ULONG)},
Packit 8681c6
        {CKA_TOKEN, &false_value, sizeof(false_value)},
Packit 8681c6
        {CKA_SENSITIVE, &false_value, sizeof(false_value)},
Packit 8681c6
        {CKA_EXTRACTABLE, &true_value, sizeof(true_value)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_BYTE iv_client[128 / 8] = { 0, };
Packit 8681c6
    CK_BYTE iv_server[128 / 8] = { 0, };
Packit 8681c6
Packit 8681c6
    CK_SSL3_KEY_MAT_OUT param_out = {
Packit 8681c6
        .hClientMacSecret = 0,
Packit 8681c6
        .hServerMacSecret = 0,
Packit 8681c6
        .hClientKey = 0,
Packit 8681c6
        .hServerKey = 0,
Packit 8681c6
        .pIVClient = iv_client,
Packit 8681c6
        .pIVServer = iv_server,
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_SSL3_KEY_MAT_PARAMS params = {
Packit 8681c6
        .ulMacSizeInBits = 128,
Packit 8681c6
        .ulKeySizeInBits = key_len * 8,
Packit 8681c6
        .ulIVSizeInBits = 128,
Packit 8681c6
        .bIsExport = FALSE,
Packit 8681c6
        .RandomInfo =
Packit 8681c6
        {
Packit 8681c6
            .pClientRandom = client_random_data,
Packit 8681c6
            .ulClientRandomLen = sizeof(client_random_data),
Packit 8681c6
            .pServerRandom = server_random_data,
Packit 8681c6
            .ulServerRandomLen = sizeof(server_random_data),
Packit 8681c6
        },
Packit 8681c6
        .pReturnedKeyMaterial = &param_out,
Packit 8681c6
    };
Packit 8681c6
    CK_SLOT_ID slot_id = SLOT_ID;
Packit 8681c6
Packit 8681c6
    testcase_begin("starting do_SSL3_MultipleKeysDerive...\n");
Packit 8681c6
Packit 8681c6
    // generate the pre-master secret key
Packit 8681c6
    //
Packit 8681c6
    mech.mechanism = CKM_SSL3_PRE_MASTER_KEY_GEN;
Packit 8681c6
    mech.pParameter = &version;
Packit 8681c6
    mech.ulParameterLen = sizeof(CK_VERSION);
Packit 8681c6
Packit 8681c6
    /** skip test if the slot doesn't support this mechanism **/
Packit 8681c6
    if (!mech_supported(slot_id, mech.mechanism)) {
Packit 8681c6
        testsuite_skip(3, "Slot %u doesn't support %s (%u)",
Packit 8681c6
                       (unsigned int) slot_id,
Packit 8681c6
                       mech_to_str(mech.mechanism),
Packit 8681c6
                       (unsigned int) mech.mechanism);
Packit 8681c6
        goto skipped;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_GenerateKey(session, &mech, pm_tmpl,
Packit 8681c6
                              sizeof(pm_tmpl) / sizeof(*pm_tmpl), &h_pm_secret);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_fail("C_GenerateKey() rc= %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Successfully generated a generic secret key.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    for (i = 0; i < sizeof(client_random_data); i++) {
Packit 8681c6
        client_random_data[i] = i;
Packit 8681c6
        server_random_data[i] = sizeof(client_random_data) - i;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    mech.mechanism = CKM_SSL3_KEY_AND_MAC_DERIVE;
Packit 8681c6
    mech.pParameter = ¶m;;
Packit 8681c6
    mech.ulParameterLen = sizeof(params);
Packit 8681c6
Packit 8681c6
    /*
Packit 8681c6
     * Try deriving the key without required attributes...
Packit 8681c6
     */
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_DeriveKey(session, &mech, h_pm_secret, incomplete_tmpl,
Packit 8681c6
                            sizeof(incomplete_tmpl) / sizeof(*incomplete_tmpl),
Packit 8681c6
                            NULL);
Packit 8681c6
    if (rc != CKR_TEMPLATE_INCOMPLETE) {
Packit 8681c6
        testcase_fail("C_DeriveKey did not recognize missing attributes.");
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Success, could not derive key without required "
Packit 8681c6
                      "attributes.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    /*
Packit 8681c6
     * Now derive key with required attributes...
Packit 8681c6
     */
Packit 8681c6
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
    rc = funcs->C_DeriveKey(session, &mech, h_pm_secret, complete_tmpl,
Packit 8681c6
                            sizeof(complete_tmpl) / sizeof(*complete_tmpl),
Packit 8681c6
                            NULL);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_fail("C_DeriveKey() rc= %s", p11_get_ckr(rc));
Packit 8681c6
        goto done;
Packit 8681c6
    } else {
Packit 8681c6
        testcase_pass("Successfully derived a keys from pre-master.");
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
Packit 8681c6
    if (funcs->C_DestroyObject(session, param_out.hClientMacSecret))
Packit 8681c6
        testcase_error("C_DestroyObject rc=%s", p11_get_ckr(rc));
Packit 8681c6
    if (funcs->C_DestroyObject(session, param_out.hServerMacSecret))
Packit 8681c6
        testcase_error("C_DestroyObject rc=%s", p11_get_ckr(rc));
Packit 8681c6
    if (funcs->C_DestroyObject(session, param_out.hClientKey))
Packit 8681c6
        testcase_error("C_DestroyObject rc=%s", p11_get_ckr(rc));
Packit 8681c6
    if (funcs->C_DestroyObject(session, param_out.hServerKey))
Packit 8681c6
        testcase_error("C_DestroyObject rc=%s", p11_get_ckr(rc));
Packit 8681c6
Packit 8681c6
done:
Packit 8681c6
    if (funcs->C_DestroyObject(session, h_pm_secret) != CKR_OK)
Packit 8681c6
        testcase_error("C_DestroyObject() failed");
Packit 8681c6
Packit 8681c6
skipped:
Packit 8681c6
    return rc;
Packit 8681c6
}
Packit 8681c6
Packit 8681c6
CK_RV ssl3_functions()
Packit 8681c6
{
Packit 8681c6
    CK_RV rc;
Packit 8681c6
    SYSTEMTIME t1, t2;
Packit 8681c6
    CK_SLOT_ID slot_id = SLOT_ID;
Packit 8681c6
    CK_SESSION_HANDLE session;
Packit 8681c6
    CK_FLAGS flags;
Packit 8681c6
    CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
Packit 8681c6
    CK_ULONG user_pin_len;
Packit 8681c6
Packit 8681c6
    testcase_rw_session();
Packit 8681c6
    testcase_user_login();
Packit 8681c6
Packit 8681c6
    GetSystemTime(&t1;;
Packit 8681c6
    rc = do_SSL3_PreMasterKeyGen(session);
Packit 8681c6
    if (rc && !no_stop)
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    GetSystemTime(&t2;;
Packit 8681c6
    process_time(t1, t2);
Packit 8681c6
Packit 8681c6
    GetSystemTime(&t1;;
Packit 8681c6
    rc = do_SSL3_MasterKeyDerive(session);
Packit 8681c6
    if (rc && !no_stop)
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    GetSystemTime(&t2;;
Packit 8681c6
    process_time(t1, t2);
Packit 8681c6
Packit 8681c6
    GetSystemTime(&t1;;
Packit 8681c6
    rc = do_SSL3_MultipleKeysDerive(session);
Packit 8681c6
    if (rc && !no_stop)
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    GetSystemTime(&t2;;
Packit 8681c6
    process_time(t1, t2);
Packit 8681c6
Packit 8681c6
    GetSystemTime(&t1;;
Packit 8681c6
    rc = do_SignVerify_SSL3_SHA1_MAC(session);
Packit 8681c6
    if (rc && !no_stop)
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    GetSystemTime(&t2;;
Packit 8681c6
    process_time(t1, t2);
Packit 8681c6
Packit 8681c6
    GetSystemTime(&t1;;
Packit 8681c6
    rc = do_SignVerify_SSL3_MD5_MAC(session);
Packit 8681c6
    if (rc && !no_stop)
Packit 8681c6
        return rc;
Packit 8681c6
    GetSystemTime(&t2;;
Packit 8681c6
    process_time(t1, t2);
Packit 8681c6
Packit 8681c6
testcase_cleanup:
Packit 8681c6
    testcase_user_logout();
Packit 8681c6
    rc = funcs->C_CloseAllSessions(slot_id);
Packit 8681c6
    if (rc != CKR_OK) {
Packit 8681c6
        testcase_error("C_CloseSessions rc=%s", p11_get_ckr(rc));
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    return rc;
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;
Packit 8681c6
    CK_RV rv;
Packit 8681c6
Packit 8681c6
    rc = do_ParseArgs(argc, argv);
Packit 8681c6
    if (rc != 1)
Packit 8681c6
        return rc;
Packit 8681c6
Packit 8681c6
    printf("Using slot #%lu...\n\n", SLOT_ID);
Packit 8681c6
    printf("With option: no_init: %d\n", no_init);
Packit 8681c6
Packit 8681c6
    rc = do_GetFunctionList();
Packit 8681c6
    if (!rc) {
Packit 8681c6
        PRINT_ERR("ERROR do_GetFunctionList() Failed , rc = 0x%0x\n", rc);
Packit 8681c6
        return rc;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    memset(&cinit_args, 0x0, sizeof(cinit_args));
Packit 8681c6
    cinit_args.flags = CKF_OS_LOCKING_OK;
Packit 8681c6
Packit 8681c6
    // SAB Add calls to ALL functions before the C_Initialize gets hit
Packit 8681c6
Packit 8681c6
    funcs->C_Initialize(&cinit_args);
Packit 8681c6
Packit 8681c6
    {
Packit 8681c6
        CK_SESSION_HANDLE hsess = 0;
Packit 8681c6
Packit 8681c6
        rc = funcs->C_GetFunctionStatus(hsess);
Packit 8681c6
        if (rc != CKR_FUNCTION_NOT_PARALLEL)
Packit 8681c6
            return rc;
Packit 8681c6
Packit 8681c6
        rc = funcs->C_CancelFunction(hsess);
Packit 8681c6
        if (rc != CKR_FUNCTION_NOT_PARALLEL)
Packit 8681c6
            return rc;
Packit 8681c6
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_setup(0);
Packit 8681c6
Packit 8681c6
    rv = ssl3_functions();
Packit 8681c6
Packit 8681c6
    testcase_print_result();
Packit 8681c6
Packit 8681c6
    funcs->C_Finalize(NULL);
Packit 8681c6
Packit 8681c6
    /* make sure we return non-zero if rv is non-zero */
Packit 8681c6
    return ((rv == 0) || (rv % 256) ? (int)rv : -1);
Packit 8681c6
}