#include <stdio.h>
#include <string.h>
#include "f_store.h"
typedef unsigned char UCHAR; 
typedef unsigned long ULONG;
typedef unsigned char  BYTE;

#include "201/WinPlatform.h"

#include "pkcs11.h"

typedef CK_ULONG CK_UINTX;
       CK_BBOOL token = 0;
        CK_BBOOL isPrivate = 1;
        CK_BBOOL derive = 0;
        CK_BBOOL sensitive = 0;
        CK_BBOOL encrypt = 1;
        CK_BBOOL decrypt = 1;
        CK_BBOOL sign = 0;
        CK_BBOOL verify = 0;
        CK_BBOOL wrap = 0;
        CK_BBOOL unwrap = 0;
        CK_UINTX valueLen = 64;

void main(){
        char *pin = "complo";

        CK_SESSION_HANDLE SessionHandle;
        CK_SLOT_ID slot;
        CK_RV rtn, status;
        CK_SLOT_ID_PTR pSlotList;
        pSlotList = new CK_SLOT_ID[20];

ULONG Count = 20;


C_Initialize(NULL_PTR);
         

rtn = C_GetSlotList(0, pSlotList, &Count);
rtn = C_GetSlotList(1, pSlotList, &Count);

slot = pSlotList[0];
        rtn = C_OpenSession(slot, CKF_RW_SESSION | CKF_SERIAL_SESSION, 0, NULL, 
&SessionHandle);
        if(rtn != CKR_OK) printf("Failed to open a slot\n");
        
//sucesss to open a slot

status = C_Login(SessionHandle, CKU_USER, (UCHAR *)pin, strlen(pin));
if(status ==CKR_OK) printf("LOGIN is OK\n");

//up-to-now login is ok 
CK_ATTRIBUTE keyTemplate[] =  //key Object
        {
                {CKA_TOKEN, &token, sizeof(token)},
                {CKA_PRIVATE, &isPrivate, sizeof(isPrivate)},
                {CKA_DERIVE, &derive, sizeof(derive)},
                {CKA_SENSITIVE, &sensitive, sizeof(sensitive)},
        
                {CKA_ENCRYPT, &encrypt, sizeof(encrypt)},
                {CKA_DECRYPT, &decrypt, sizeof(decrypt)},
                {CKA_SIGN, &sign, sizeof(sign)},
                {CKA_VERIFY, &verify, sizeof(verify)},
                {CKA_WRAP, &wrap, sizeof(wrap)},
                {CKA_UNWRAP, &unwrap, sizeof(unwrap)},

                {CKA_VALUE_LEN, &valueLen, sizeof(valueLen)},
        };
        const CK_UINTX keyTemplateCount = sizeof(keyTemplate) / 
sizeof(CK_ATTRIBUTE);
        
        CK_MECHANISM mechanism;
        
        CK_OBJECT_HANDLE keyHandle = 0;

        memset(&mechanism, 0, sizeof(mechanism));
        mechanism.mechanism = CKM_RC4_KEY_GEN;

        status = C_GenerateKey(SessionHandle,
                &mechanism, keyTemplate, keyTemplateCount, &keyHandle);


////////////////////////////////////////////////////////////////////
//after generate a Key, below start to wrap a generate key
        
CK_OBJECT_HANDLE wKey;
CK_BYTE w[100]; memset(w, '\0', sizeof(w));
CK_MECHANISM mechanism1 = {
          CKM_RC4, NULL_PTR, 0
        };

        CK_ULONG wlen;
        wlen = sizeof(w);
                status = C_WrapKey(SessionHandle, &mechanism1, wKey, keyHandle, 
w, &wlen);

if(status != CKR_OK) printf("Failed to wrap key\n");
status = C_Logout(SessionHandle);
}


I don't know why C_WrapKey fail.
Please help
 
 
This message posted from opensolaris.org

Reply via email to