Loading...
Select Version
&pagelevel(3)&pagelevel
Im Beispielprogramm werden die folgenden Funktionen von CRYPT verwendet:
Mit C_OpenSession wird eine Sitzung zwischen einer Anwendung und einem Token in einem bestimmten Slot eröffnet.
C_GenerateKey generiert einen geheimen Schlüssel.
Anschließend wird mit C_EncryptInit eine Verschlüsselungsoperation initialisiert und mit C_EncryptUpdate fortgesetzt.
C_EncryptFinal beendet die mehrteilige Verschlüsselungsoperation.
Mit C_DecryptInit wird eine Entschlüsselungsoperation initialisiert und mit C_DecryptUpdate fortgesetzt.
C_DecryptFinal beendet die mehrteilige Entschlüsselungsoperation.
Mit C_CloseSession wird die Sitzung geschlossen.
Programmquelltext:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "pkcs11.h"
static CK_BBOOL aTrue = TRUE;
static CK_BBOOL aFalse = FALSE;
void main()
{
CK_MECHANISM MGDES1 = {CKM_DES_KEY_GEN, 0, 0};
CK_MECHANISM MCDES1E = {CKM_DES_ECB, 0, 0};
CK_ATTRIBUTE AGDES[] =
{
{CKA_EXTRACTABLE, &aTrue, sizeof(aTrue)}
,{CKA_SENSITIVE, &aFalse, sizeof(aFalse)}
,{CKA_ENCRYPT, &aTrue, sizeof(aTrue)}
,{CKA_DECRYPT, &aTrue, sizeof(aTrue)}
};
CK_ULONG NGDES = sizeof(AGDES)/12;
CK_MECHANISM_PTR mgdes1 = &MGDES1;
void *encin = 0;
void *encout = 0;
void *decout = 0;
unsigned int encinlen = 32*1024;
unsigned int encoutlen = 34*1024;
unsigned int decoutlen = 34*1024;
CK_BYTE_PTR encAktIn;
CK_BYTE_PTR encAktOut;
CK_BYTE_PTR decAktOut;
CK_ULONG encAcrylOutLen = 0;
CK_ULONG decAcrylOutLen = 0;
unsigned int i;
CK_RV rc;
CK_SESSION_HANDLE session;
CK_OBJECT_HANDLE key;
CK_ULONG inLen;
CK_ULONG outLen;
char *nextChar;
encin = calloc(encinlen, 1);
if (!encin)
{
printf("----no more memory\n");
return;
}
nextChar = (char*) encin;
for (i = 0; i < encinlen; i++)
*nextChar++ = i % 256;
encout = malloc(encoutlen);
if (!encout)
{
printf("----no more memory\n");
return;
}
decout = malloc(decoutlen);
if (!decout)
{
printf ("----no more memory\n");
return;
}
/* Sitzung eröffnen */
rc = C_OpenSession(0, CKF_SERIAL_SESSION | CKF_RW_SESSION,
NULL_PTR, NULL_PTR, &session);
if (rc != CKR_OK)
{
printf("---- open session rc: %08x\n", rc);
return;
}
printf("++++ open session: ok; session: %08X\n", session);
/* geheimen Schlüssel generieren */
rc = C_GenerateKey(session, mgdes1, AGDES, NGDES, &key);
if (rc != CKR_OK)
{
printf("---- genkey rc: %08x\n", rc);
return;
}
printf("++++ genkey: ok; key: %08X\n", key);
/* Verschlüsselungsoperation initialisieren */
rc = C_EncryptInit(session, &MCDES1E, key);
if (rc != CKR_OK)
{
printf("---- cryini rc: %08x\n", rc);
return;
}
printf("++++ cryini: encryptinit DES_ECB ok\n");
encAktIn = (CK_BYTE_PTR) encin;
encAktOut = (CK_BYTE_PTR) encout;
for (i = 0; i < 32; i++)
{
/* outLen = 1024; */
outLen = encoutlen - encAcrylOutLen;
/* mehrteilige Verschlüsselungsoperation fortsetzen */
rc = C_EncryptUpdate(session, encAktIn, 1024, encAktOut, &outLen);
if (rc != CKR_OK)
{
printf("---- cry rc: %08x\n", rc);
return;
}
encAcrylOutLen += outLen;
encAktIn += 1024; /* next portion */
encAktOut += outLen;
} /* for (i = 0; i < 32; i++) */
outLen = encoutlen - encAcrylOutLen;
/* Verschlüsselungsoperation beenden */
rc = C_EncryptFinal(session, encAktOut, &outLen);
if (rc != CKR_OK)
{
printf("---- cryfin rc: %08x\n", rc);
return;
}
encAcrylOutLen += outLen;
printf("++++ cry: encrypt DES_ECB ok\n");
/* Entschlüsselungsoperation initialisieren */
rc = C_DecryptInit(session, &MCDES1E, key);
if (rc != CKR_OK)
{
printf("---- cryini rc: %08x\n", rc);
return;
}
printf("++++ cryini: decryptinit DES_ECB ok\n");
encAktOut = (CK_BYTE_PTR) encout;
decAktOut = (CK_BYTE_PTR) decout;
inLen = encAcrylOutLen >= 1024 ? 1024 : encAcrylOutLen;
while (inLen > 0)
{
/* outLen = 1024; */
outLen = decoutlen - decAcrylOutLen;
/* mehrteilige Entschlüsselungsoperation fortsetzen */
rc = C_DecryptUpdate(session, encAktOut, inLen,
decAktOut, &outLen);
if (rc != CKR_OK)
{
printf("---- cry rc: %08x\n", rc);
return;
}
encAcrylOutLen -= inLen;
if (encAcrylOutLen < 1024)
inLen = encAcrylOutLen;
decAcrylOutLen += outLen;
encAktOut += 1024; /* next portion */
decAktOut += outLen;
} /* while (encAcrylOutLen > 0) */
outLen = decoutlen - decAcrylOutLen;
/* Entschlüsselungsoperation beenden */
rc = C_DecryptFinal(session, decAktOut, &outLen);
decAcrylOutLen += outLen;
printf("++++ cry: decrypt DES_ECB ok\n");
if (decAcrylOutLen == encinlen)
{
printf("++++ length ok \n");
}
else
{
printf("---- enc/dec: length diff %d %d\n", encinlen,
decAcrylOutLen);
return;
}
if (memcmp(encin, decout, decAcrylOutLen) == 0)
{
printf("++++ output ok \n");
}
else
{
printf("---- enc/dec: diff \n");
return;
}
/* Sitzung schließen */
rc = C_CloseSession(session);
if (rc != CKR_OK)
{
printf("---- close session rc: %08x\n", rc);
return;
}
printf ("++++ close session: ok\n");
}
Schematischer Compiler-Aufruf:
/START-CPLUS-COMPILER //MODIFY-SOURCE-PROPERTIES - // LANG=*C(MODE=*ANSI) //MODIFY-INCLUDE-LIBRARIES - // STD-INCLUDE-LIBRARY=*USER-INCLUDE-LIBRARY, - // USER-INCLUDE-LIBRARY=( - // $.SYSLIB.CRYPT.nnn .... //...
Schematischer BINDER-Aufruf:
/START-BINDER ... //INCLUDE-MODULES ELEMENT= //INCLUDE-MODULES ELEMENT=CRYADAP,LIB=$.SYSLIB.CRYPT.nnn //RESOLVE-BY-AUTOLINK LIBRARY=... //... //SAVE-LLM LIB=... //END