fast SMS4 with Intel AVX2/KNC-NI

This commit is contained in:
Zhi Guan
2016-05-09 09:20:02 +02:00
parent addcac4896
commit 8c0439e7d6
83 changed files with 3536 additions and 5882 deletions

View File

@@ -1,3 +1,7 @@
/*
* The SKF ENGINE will be released when EC_KEY_METHOD is avaiable
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -28,74 +32,106 @@ static int skf_destroy(ENGINE *e);
#define SKF_CMD_LIST_DEVS ENGINE_CMD_BASE
static int skf_open_container(const char *dev,
const unsigned char *authkey, size_t authkeylen,
const char *app, const char *pin,
const char *container, HCONTAINER *phContainer)
{
ULONG rv;
DEVINFO devInfo;
DEVHANDLE hDev = NULL;
HAPPLICATION hApp = NULL;
HCONTAINER hContainer = NULL;
if ((rv = SKF_ConnectDev(dev, &hDev)) != SAR_OK) {
goto end;
}
if ((rv = SKF_GetDevInfo(hDev, &devInfo)) != SAR_OK) {
goto end;
}
if ((rv = SKF_GenRandom(hDev, authRand, sizeof(authRand))) != SAR_OK) {
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
goto end;
}
/* Encrypt(authRand, authData, authKey) */
if ((rv = SKF_DevAuth(hDev, authData, len)) != SAR_OK) {
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
goto end;
}
if ((rv = SKF_OpenApplication(hDev, appName, &hApp)) != SAR_OK) {
goto end;
}
if ((rv = SKF_VerifyPIN(hApp, USER_TYPE, pin, &retryCount)) != SAR_OK) {
goto end;
}
if ((rv = SKF_OpenContainer(hApp, containerName, &hContainer)) != SAR_OK) {
goto end;
}
if ((rv = SKF_GetContainerType(hContainer, &containerType)) != SAR_OK) {
goto end;
}
if (containerType != CONTAINER_TYPE_ECC) {
goto end;
}
end:
return 0;
}
static EVP_PKEY *skf_load_pubkey(ENGINE *e, const char *key_id,
UI_METHOD *ui_method, void *callback_data)
{
ULONG rv, len;
EVP_PKEY *ret = NULL;
EC_KEY *ec_key = NULL;
ECCPUBLICKEYBLOB blob;
BIGNUM *x = NULL;
BIGNUM *y = NULL;
int nbytes;
len = sizeof(blob);
if ((rv = SKF_ExportPublicKey(hContainer, TRUE, &blob, &len)) != SAR_OK) {
goto end;
}
if (!(ec_key = EC_KEY_new_by_curve_name(NID_sm2p256v1))) {
goto end;
}
if (EC_KEY_get_degree(ec_key) != blob.BitLen) {
goto end;
}
nbytes = (blob.BitLen + 7)/8;
if (!(x = BN_bin2bn(&(blob.XCoordinate), nbytes, NULL))) {
goto end;
}
if (!(y = BN_bin2bn(&(blob.YCoordinate), nbytes, NULL))) {
goto end;
}
if (!EC_KEY_set_public_key_affine_coordinates(ec_key, x, y)) {
goto end;
}
if (!(ret = EVP_PKEY_new())) {
goto end;
}
EVP_PKEY_assign_SM2(ret, ec_key);
end:
EC_KEY_free(ec_key);
BN_free(x);
BN_free(y)
return ret;
}
static int skf_init(ENGINE *e)
{
ULONG rv;
ULONG len;
BOOL bPresent = TRUE;
CHAR *devNameList = NULL;
LPSTR devName;
ULONG devState;
DEVINFO devInfo;
BYTE authData[16];
CHAR appNameList[256];
LPSTR appName;
HAPPLICATION hApp;
CHAR containerNameList[256];
LPSTR containerName;
HCONTAINER hContainer;
ULONG containerType;
if ((rv = SKF_EnumDev(bPresent, NULL, &len)) != SAR_OK) {
SKFerr(SKF_F_SKF_INIT, skf_err2openssl(rv));
goto end;
}
if (!(devNameList = OPENSSL_malloc(len))) {
goto end;
}
if ((rv = SKF_EnumDev(bPresent, devNameList, &len)) != SAR_OK) {
goto end;
}
if (devNameList[0] = 0) {
return -1;
}
devName = devNameList;
if ((rv = SKF_ConnectDev(devName, &hDev)) != SAR_OK) {
return -1;
}
if ((rv = SKF_GetDevInfo(hDev, &devInfo)) != SAR_OK) {
return -1;
}
if ((rv = SKF_DevAuth(hDev, authData, sizeof(authData))) != SAR_OK) {
return -1;
}
if ((rv = SKF_EnumApplication(hDev, NULL, &len)) != SAR_OK) {
return -1;
}
if (!(appNameList = OPENSSL_malloc(len))) {
return -1;
}
if ((rv = SKF_EnumApplication(hDev, appNameList, &len)) != SAR_OK) {
return -1;
}
if (appNameList[0] = 0) {
return -1;
}
appName = appNameList;
if ((rv = SKF_OpenApplication(hDev, appName, &hApp)) != SAR_OK) {
return -1;
}
for (p = containerNameList; p; p += strlen(p)) {
// check container type
}
return 0;
}
@@ -104,12 +140,6 @@ static int skf_finish(ENGINE *e)
return 0;
}
typedef struct {
HANDLE hKey;
} EVP_SKF_KEY;
static int skf_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
const unsigned char *iv, int enc)
{
@@ -476,7 +506,7 @@ static ENGINE *engine_skf(void)
return ret;
}
void ENGINE_load_4758cca(void)
void ENGINE_load_skf(void)
{
ENGINE *e_skf = engine_skf();
if (!e_skf) {
@@ -500,9 +530,15 @@ static int bind(ENGINE *e, const char *id)
if (!ENGINE_set_id(e, engine_skf_id) ||
!ENGINE_set_name(e, engine_skf_name) ||
!ENGINE_set_init_function(e, skf_init) ||
!ENGINE_set_finish_function(e, skf_finish) ||
!ENGINE_set_ctrl_function(e, skf_ctrl) ||
!ENGINE_set_destroy_function(e, skf_destroy) ||
!ENGINE_set_digests(e, skf_digests) ||
!ENGINE_set_ciphers(e, skf_ciphers) ||
!ENGINE_set_load_pubkey_function(e, skf_load_pubkey) ||
!ENGINE_set_RAND(e, &skf_random)) {
return 0;
}

BIN
engines/skf/a.out Executable file

Binary file not shown.

View File

@@ -143,9 +143,6 @@ typedef HANDLE HCONTAINER;
#define SECURE_USER_ACCOUNT 0x00000010
#define SECURE_ANYONE_ACCOUNT 0x000000FF
#define DEV_ABSENT_STATE 0x00000000
#define DEV_PRESENT_STATE 0x00000001
#define DEV_UNKNOW_STATE 0x00000010
@@ -259,6 +256,10 @@ ULONG DEVAPI SKF_EnumDev(BOOL bPresent,
ULONG DEVAPI SKF_ConnectDev(LPSTR szName,
DEVHANDLE *phDev);
ULONG DEVAPI SKF_DisConnectDev(DEVHANDLE hDev);
#define DEV_ABSENT_STATE 0x00000000
#define DEV_PRESENT_STATE 0x00000001
#define DEV_UNKNOW_STATE 0x00000010
ULONG DEVAPI SKF_GetDevState(LPSTR szDevName,
ULONG *pulDevState);
ULONG DEVAPI SKF_SetLabel(DEVHANDLE hDev,
@@ -354,17 +355,30 @@ ULONG DEVAPI SKF_OpenContainer(HAPPLICATION hApplication,
LPSTR szContainerName,
HCONTAINER *phContainer);
ULONG DEVAPI SKF_CloseContainer(HCONTAINER hContainer);
#define CONTAINER_TYPE_UNDEF 0
#define CONTAINER_TYPE_RSA 1
#define CONTAINER_TYPE_ECC 2
ULONG DEVAPI SKF_GetContainerType(HCONTAINER hContainer,
ULONG *pulContainerType);
ULONG DEVAPI SKF_ImportCertificate(HCONTAINER hContainer,
BOOL bSignFlag,
BOOL bExportSignKey,
BYTE *pbCert,
ULONG ulCertLen);
ULONG DEVAPI SKF_ExportCertificate(HCONTAINER hContainer,
BOOL bSignFlag,
BYTE *pbCert,
ULONG *pulCertLen);
ULONG DEVAPI SKF_ExportPublicKey(HCONTAINER hContainer,
BOOL bSignFlag,
BYTE *pbBlob,
ULONG *pulBlobLen);
ULONG DEVAPI SKF_GenRandom(DEVHANDLE hDev,
BYTE *pbRandom,
ULONG ulRandomLen);
@@ -409,14 +423,16 @@ ULONG DEVAPI SKF_ExtRSAPriKeyOperation(DEVHANDLE hDev,
ULONG ulInputLen,
BYTE *pbOutput,
ULONG *pulOutputLen);
ULONG DEVAPI SKF_GenECCKeyPair(HCONTAINER hContainer,
ULONG ulAlgId,
ECCPUBLICKEYBLOB *pBlob);
ULONG DEVAPI SKF_ImportECCKeyPair(HCONTAINER hContainer,
PENVELOPEDKEYBLOB pEnvelopedKeyBlob);
ULONG DEVAPI SKF_ECCSignData(HCONTAINER hContainer,
BYTE *pbData,
ULONG ulDataLen,
BYTE *pbDigest,
ULONG ulDigestLen,
PECCSIGNATUREBLOB pSignature);
ULONG DEVAPI SKF_ECCVerify(DEVHANDLE hDev,
@@ -439,7 +455,7 @@ ULONG DEVAPI SKF_ExtECCDecrypt(DEVHANDLE hDev,
PECCCIPHERBLOB pCipherText,
BYTE *pbPlainText,
ULONG *pulPlainTextLen);
ULONG DEVAPI SKF_ExtECCSign(DEVHANDLE hDev,
ULONG DEVAPI SKF_ExtECCSign(DEVHANDLE hDev,
ECCPRIVATEKEYBLOB *pECCPriKeyBlob,
BYTE *pbData,
ULONG ulDataLen,
@@ -449,6 +465,7 @@ ULONG DEVAPI SKF_ExtECCVerify(DEVHANDLE hDev,
BYTE *pbData,
ULONG ulDataLen,
PECCSIGNATUREBLOB pSignature);
ULONG DEVAPI SKF_GenerateAgreementDataWithECC(HCONTAINER hContainer,
ULONG ulAlgId,
ECCPUBLICKEYBLOB *pTempECCPubKeyBlob,
@@ -471,10 +488,8 @@ ULONG DEVAPI SKF_GenerateKeyWithECC(HANDLE hAgreementHandle,
BYTE *pbID,
ULONG ulIDLen,
HANDLE *phKeyHandle);
ULONG DEVAPI SKF_ExportPublicKey(HCONTAINER hContainer,
BOOL bSignFlag,
BYTE *pbBlob,
ULONG *pulBlobLen);
ULONG DEVAPI SKF_ImportSessionKey(HCONTAINER hContainer,
ULONG ulAlgId,
BYTE *pbWrapedData,
@@ -484,6 +499,7 @@ ULONG DEVAPI SKF_SetSymmKey(DEVHANDLE hDev,
BYTE *pbKey,
ULONG ulAlgID,
HANDLE *phKey);
ULONG DEVAPI SKF_EncryptInit(HANDLE hKey,
BLOCKCIPHERPARAM EncryptParam);
ULONG DEVAPI SKF_Encrypt(HANDLE hKey,
@@ -514,6 +530,7 @@ ULONG DEVAPI SKF_DecryptUpdate(HANDLE hKey,
ULONG DEVAPI SKF_DecryptFinal(HANDLE hKey,
BYTE *pbDecryptedData,
ULONG *pulDecryptedDataLen);
ULONG DEVAPI SKF_DigestInit(DEVHANDLE hDev,
ULONG ulAlgID,
ECCPUBLICKEYBLOB *pPubKey,

View File

@@ -2,24 +2,14 @@
#include <string.h>
#include "skf.h"
#define DEV_NAME "dev0"
#define DEV_NAME "skf-soft-token"
#define DEV_NAME_LIST DEV_NAME"\0"
#define APP_NAME "app0"
#define APP_NAME "default-app"
#define APP_NAME_LIST APP_NAME"\0"
#define CONTAINER_NAME "container0"
#define CONTAINER_NAME_LIST CONTAINER_NAME"\0"
#define CONTAINER_TYPE_UNDEF 0
#define CONTAINER_TYPE_RSA 1
#define CONTAINER_TYPE_ECC 2
int default_dev = 1;
int default_app = 1;
int default_container = 1;
DEVHANDLE DEV_HANDLE = &default_dev;
HAPPLICATION APP_HANDLE = &default_app;
HCONTAINER CONTAINER_HANDLE = &default_container;
ULONG DEVAPI SKF_WaitForDevEvent(LPSTR szDevName,
ULONG *pulDevNameLen, ULONG *pulEvent)
@@ -36,39 +26,12 @@ ULONG DEVAPI SKF_EnumDev(BOOL bPresent,
LPSTR szNameList,
ULONG *pulSize)
{
if (!szNameList) {
*pulSize = sizeof(DEV_NAME_LIST);
return SAR_OK;
}
if (*pulSize < sizeof(DEV_NAME_LIST)) {
return SAR_BUFFER_TOO_SMALL;
}
memcpy(szNameList, DEV_NAME_LIST, sizeof(DEV_NAME_LIST));
*pulSize = sizeof(DEV_NAME_LIST);
return SAR_OK;
}
ULONG DEVAPI SKF_ConnectDev(LPSTR szName,
DEVHANDLE *phDev)
{
printf("%s\n", (char *)szName);
if (!phDev) {
printf("shit\n");
return SAR_INVALIDPARAMERR;
}
if (memcmp(szName, DEV_NAME, sizeof(DEV_NAME))) {
printf("%s %s\n", szName, DEV_NAME);
return SAR_FAIL;
}
*phDev = DEV_HANDLE;
return SAR_OK;
}
@@ -80,23 +43,17 @@ ULONG DEVAPI SKF_DisConnectDev(DEVHANDLE hDev)
ULONG DEVAPI SKF_GetDevState(LPSTR szDevName,
ULONG *pulDevState)
{
if (!szDevName || !pulDevState) {
if (!pulDevState) {
return SAR_INVALIDPARAMERR;
}
if (memcmp(szDevName, DEV_NAME, sizeof(DEV_NAME))) {
return SAR_FAIL;
}
*pulDevState = DEV_PRESENT_STATE;
return SAR_OK;
}
ULONG DEVAPI SKF_SetLabel(DEVHANDLE hDev,
LPSTR szLabel)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_GetDevInfo(DEVHANDLE hDev,
@@ -131,12 +88,12 @@ ULONG DEVAPI SKF_GetDevInfo(DEVHANDLE hDev,
ULONG DEVAPI SKF_LockDev(DEVHANDLE hDev,
ULONG ulTimeOut)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_UnlockDev(DEVHANDLE hDev)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_Transmit(DEVHANDLE hDev,
@@ -145,14 +102,14 @@ ULONG DEVAPI SKF_Transmit(DEVHANDLE hDev,
BYTE *pbData,
ULONG *pulDataLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_ChangeDevAuthKey(DEVHANDLE hDev,
BYTE *pbKeyValue,
ULONG ulKeyLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_DevAuth(DEVHANDLE hDev,
@@ -168,7 +125,7 @@ ULONG DEVAPI SKF_ChangePIN(HAPPLICATION hApplication,
LPSTR szNewPin,
ULONG *pulRetryCount)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
LONG DEVAPI SKF_GetPINInfo(HAPPLICATION hApplication,
@@ -193,12 +150,12 @@ ULONG DEVAPI SKF_UnblockPIN(HAPPLICATION hApplication,
LPSTR szNewUserPIN,
ULONG *pulRetryCount)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_ClearSecureState(HAPPLICATION hApplication)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_CreateApplication(DEVHANDLE hDev,
@@ -210,7 +167,7 @@ ULONG DEVAPI SKF_CreateApplication(DEVHANDLE hDev,
DWORD dwCreateFileRights,
HAPPLICATION *phApplication)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_EnumApplication(DEVHANDLE hDev,
@@ -221,45 +178,31 @@ ULONG DEVAPI SKF_EnumApplication(DEVHANDLE hDev,
*pulSize = sizeof(APP_NAME_LIST);
return SAR_OK;
}
if (*pulSize < sizeof(APP_NAME_LIST)) {
return SAR_BUFFER_TOO_SMALL;
}
memcpy(szAppName, APP_NAME_LIST, sizeof(APP_NAME_LIST));
return SAR_OK;
}
ULONG DEVAPI SKF_DeleteApplication(DEVHANDLE hDev,
LPSTR szAppName)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_OpenApplication(DEVHANDLE hDev,
LPSTR szAppName,
HAPPLICATION *phApplication)
{
if (!szAppName || !phApplication) {
if (!phApplication) {
return SAR_INVALIDPARAMERR;
}
if (hDev != DEV_HANDLE || memcmp(szAppName, APP_NAME, sizeof(APP_NAME))) {
return SAR_FAIL;
}
*phApplication = APP_HANDLE;
return SAR_OK;
}
ULONG DEVAPI SKF_CloseApplication(HAPPLICATION hApplication)
{
if (hApplication != APP_HANDLE) {
return SAR_FAIL;
}
return SAR_OK;
}
@@ -315,13 +258,13 @@ ULONG DEVAPI SKF_CreateContainer(HAPPLICATION hApplication,
LPSTR szContainerName,
HCONTAINER *phContainer)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_DeleteContainer(HAPPLICATION hApplication,
LPSTR szContainerName)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_EnumContainer(HAPPLICATION hApplication,
@@ -331,22 +274,14 @@ ULONG DEVAPI SKF_EnumContainer(HAPPLICATION hApplication,
if (!pulSize) {
return SAR_INVALIDPARAMERR;
}
if (hApplication != APP_HANDLE) {
return SAR_FAIL;
}
if (!szContainerName) {
*pulSize = sizeof(CONTAINER_NAME_LIST);
return SAR_OK;
}
if (*pulSize < sizeof(CONTAINER_NAME_LIST)) {
return SAR_BUFFER_TOO_SMALL;
}
memcpy(szContainerName, CONTAINER_NAME_LIST, sizeof(CONTAINER_NAME_LIST));
return SAR_OK;
}
@@ -354,25 +289,11 @@ ULONG DEVAPI SKF_OpenContainer(HAPPLICATION hApplication,
LPSTR szContainerName,
HCONTAINER *phContainer)
{
if (!szContainerName || !phContainer) {
return SAR_INVALIDPARAMERR;
}
if (hApplication != APP_HANDLE || memcmp(szContainerName, CONTAINER_NAME, sizeof(CONTAINER_NAME))) {
return SAR_FAIL;
}
*phContainer = CONTAINER_HANDLE;
return SAR_OK;
}
ULONG DEVAPI SKF_CloseContainer(HCONTAINER hContainer)
{
if (hContainer != CONTAINER_HANDLE) {
return SAR_FAIL;
}
return SAR_OK;
}
@@ -382,13 +303,7 @@ ULONG DEVAPI SKF_GetContainerType(HCONTAINER hContainer,
if (!pulContainerType) {
return SAR_INVALIDPARAMERR;
}
if (hContainer != CONTAINER_HANDLE) {
return SAR_FAIL;
}
*pulContainerType = CONTAINER_TYPE_UNDEF;
*pulContainerType = CONTAINER_TYPE_ECC;
return SAR_OK;
}
@@ -397,7 +312,7 @@ ULONG DEVAPI SKF_ImportCertificate(HCONTAINER hContainer,
BYTE *pbCert,
ULONG ulCertLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_ExportCertificate(HCONTAINER hContainer,
@@ -412,19 +327,6 @@ ULONG DEVAPI SKF_GenRandom(DEVHANDLE hDev,
BYTE *pbRandom,
ULONG ulRandomLen)
{
/*
if (!pbRandom || ulRandomLen > 100 * 1024 * 1024) {
return SAR_INVALIDPARAMERR;
}
if (hDev != DEV_HANDLE) {
return SAR_FAIL;
}
if (!RAND_pseudo_bytes(pbRandom, ulRandomLen)) {
return SAR_GENRANDERR;
}
*/
return SAR_OK;
}
@@ -632,13 +534,13 @@ ULONG DEVAPI SKF_SetSymmKey(DEVHANDLE hDev,
ULONG ulAlgID,
HANDLE *phKey)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_EncryptInit(HANDLE hKey,
BLOCKCIPHERPARAM EncryptParam)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_Encrypt(HANDLE hKey,
@@ -647,7 +549,7 @@ ULONG DEVAPI SKF_Encrypt(HANDLE hKey,
BYTE *pbEncryptedData,
ULONG *pulEncryptedLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_EncryptUpdate(HANDLE hKey,
@@ -656,20 +558,20 @@ ULONG DEVAPI SKF_EncryptUpdate(HANDLE hKey,
BYTE *pbEncryptedData,
ULONG *pulEncryptedLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_EncryptFinal(HANDLE hKey,
BYTE *pbEncryptedData,
ULONG *pulEncryptedDataLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_DecryptInit(HANDLE hKey,
BLOCKCIPHERPARAM DecryptParam)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_Decrypt(HANDLE hKey,
@@ -678,7 +580,7 @@ ULONG DEVAPI SKF_Decrypt(HANDLE hKey,
BYTE *pbData,
ULONG *pulDataLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_DecryptUpdate(HANDLE hKey,
@@ -687,14 +589,14 @@ ULONG DEVAPI SKF_DecryptUpdate(HANDLE hKey,
BYTE *pbData,
ULONG *pulDataLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_DecryptFinal(HANDLE hKey,
BYTE *pbDecryptedData,
ULONG *pulDecryptedDataLen)
{
return SAR_NOTSUPPORTYETERR;
return SAR_OK;
}
ULONG DEVAPI SKF_DigestInit(DEVHANDLE hDev,

View File

@@ -4,45 +4,81 @@
#include <assert.h>
#include "skf.h"
#define AUTH_RAND_LEN 16
#define AUTH_DATA_LEN 16
#define AUTH_KEY_LEN 16
int main(int argc, char **argv)
{
ULONG rv;
BYTE buf[2048];
ULONG len;
BOOL bPresent = TRUE;
CHAR devNameList[256];
LPSTR devName;
DEVHANDLE hDev;
DEVHANDLE hDev = NULL;
ULONG devState;
char *devStateStr;
DEVINFO devInfo;
BYTE authData[16];
BYTE authRand[AUTH_RAND_LEN];
BYTE authData[AUTH_DATA_LEN];
BYTE authKey[AUTH_KEY_LEN];
BLOCKCIPHERPARAM authParam;
HANDLE hAuthKey = NULL;
CHAR appNameList[256];
LPSTR appName;
HAPPLICATION hApp;
HAPPLICATION hApp = NULL;
CHAR containerNameList[256];
LPSTR containerName;
HCONTAINER hContainer;
HCONTAINER hContainer = NULL;
ULONG containerType;
char *containerTypeStr;
BYTE dgst[32];
ULONG dgstLen = sizeof(dgst);
ECCSIGNATUREBLOB sigblob;
len = sizeof(devNameList);
rv = SKF_EnumDev(bPresent, devNameList, &len);
assert(rv == SAR_OK);
if ((rv = SKF_EnumDev(bPresent, devNameList, &len)) != SAR_OK) {
goto end;
}
devName = devNameList;
printf(" Device Name : %s\n", devName);
printf("Device Name : %s\n", devName);
rv = SKF_GetDevState(devName, &devState);
assert(rv == SAR_OK);
printf(" Device State: %ld\n", devState);
rv = SKF_ConnectDev(devName, &hDev);
assert(rv == SAR_OK);
if ((rv = SKF_GetDevState(devName, &devState)) != SAR_OK) {
goto end;
}
rv = SKF_GetDevInfo(hDev, &devInfo);
assert(rv == SAR_OK);
switch (devState) {
case DEV_ABSENT_STATE:
devStateStr = "DEV_ABSENT_STATE";
break;
case DEV_PRESENT_STATE:
devStateStr = "DEV_PRESENT_STATE";
break;
case DEV_UNKNOW_STATE:
devStateStr = "DEV_UNKNOW_STATE";
break;
default:
devStateStr = "(undefined)";
}
printf("Device State: %s\n", devStateStr);
if ((rv = SKF_ConnectDev(devName, &hDev)) != SAR_OK) {
goto end;
}
if ((rv = SKF_GetDevInfo(hDev, &devInfo)) != SAR_OK) {
goto end;
}
printf("Device Info:\n");
printf(" Device Version : %d.%d\n", devInfo.Version.major, devInfo.Version.minor);
printf(" Manufacturer : %s\n", devInfo.Manufacturer);
printf(" Issuer : %s\n", devInfo.Issuer);
@@ -54,67 +90,119 @@ int main(int argc, char **argv)
printf(" AlgAsymCap : 0x%08x\n", devInfo.AlgAsymCap);
printf(" AlgHashCap : 0x%08x\n", devInfo.AlgHashCap);
printf(" AlgHashCap : 0x%08x\n", devInfo.DevAuthAlgId);
printf(" Total Space : %ld\n", devInfo.TotalSpace);
printf(" Free Space : %ld\n", devInfo.FreeSpace);
printf(" MaxECCBuffer : %ld\n", devInfo.MaxECCBufferSize);
printf(" MaxBuffer : %ld\n", devInfo.MaxBufferSize);
printf(" Total Space : %u\n", devInfo.TotalSpace);
printf(" Free Space : %u\n", devInfo.FreeSpace);
printf(" MaxECCBuffer : %u\n", devInfo.MaxECCBufferSize);
printf(" MaxBuffer : %u\n", devInfo.MaxBufferSize);
/* Device Authentication */
if ((rv = SKF_GenRandom(hDev, authRand, sizeof(authRand))) != SAR_OK) {
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
goto end;
}
ULONG ulAuthAlgId = devInfo.DevAuthAlgId;
unsigned char pbAuthKey[16] = {0};
if ((rv = SKF_SetSymmKey(hDev, authKey, devInfo.DevAuthAlgId, &hAuthKey)) != SAR_OK) {
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
goto end;
}
bzero(&authParam, sizeof(authParam));
if ((rv = SKF_EncryptInit(hAuthKey, authParam)) != SAR_OK) {
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
goto end;
}
if ((rv = SKF_Encrypt(hAuthKey, authRand, sizeof(authRand), authData, &len)) != SAR_OK) {
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
goto end;
}
if ((rv = SKF_DevAuth(hDev, authData, len)) != SAR_OK) {
fprintf(stderr, "error: %s %d\n", __FILE__, __LINE__);
goto end;
}
printf("Device Authentication Passed.\n");
/* get the DevAuth challenge from GenRandom API
* encrypt challenge with DevAuthKey
*/
rv = SKF_GenRandom(hDev, authRandom, sizeof(authRandom));
rv = SKF_EncryptInit(hKey, param);
rv = SKF_Encrypt(hKey, authRandom, 16, authResponse, &ulAuthLen);
rv = SKF_DevAuth(hDev, authData, authDataLen);
assert(rv == SAR_OK);
/*
*/
/* Open Application */
len = sizeof(appNameList);
rv = SKF_EnumApplication(hDev, appNameList, &len);
assert(rv == SAR_OK);
if ((rv = SKF_EnumApplication(hDev, appNameList, &len)) != SAR_OK) {
goto end;
}
appName = appNameList;
printf("Application Name : %s\n", appName);
rv = SKF_OpenApplication(hDev, appName, &hApp);
assert(rv == SAR_OK);
if ((rv = SKF_OpenApplication(hDev, appName, &hApp)) != SAR_OK) {
goto end;
}
/* Open Containter */
len = sizeof(containerNameList);
rv = SKF_EnumContainer(hApp, containerNameList, &len);
assert(rv == SAR_OK);
if ((rv = SKF_EnumContainer(hApp, containerNameList, &len)) != SAR_OK) {
goto end;
}
containerName = containerNameList;
printf("Container Name: %s\n", containerName);
rv = SKF_OpenContainer(hApp, containerName, &hContainer);
assert(rv == SAR_OK);
if ((rv = SKF_OpenContainer(hApp, containerName, &hContainer)) != SAR_OK) {
goto end;
}
rv = SKF_GetContainerType(hContainer, &containerType);
assert(rv == SAR_OK);
if ((rv = SKF_GetContainerType(hContainer, &containerType)) != SAR_OK) {
goto end;
}
printf("Container Type: %ld\n", containerType);
switch (containerType) {
case CONTAINER_TYPE_UNDEF:
containerTypeStr = "Undef";
break;
case CONTAINER_TYPE_RSA:
containerTypeStr = "RSA";
break;
case CONTAINER_TYPE_ECC:
containerTypeStr = "ECC";
break;
default:
containerTypeStr = "(error)";
}
printf("Container Type: %s\n", containerTypeStr);
rv = SKF_CloseContainer(hContainer);
assert(rv == SAR_OK);
/* Sign */
if ((rv = SKF_ECCSignData(hContainer, dgst, dgstLen, &sigblob)) != SAR_OK) {
goto end;
}
rv = SKF_CloseApplication(hApp);
assert(rv == SAR_OK);
/* Export Signing Public Key */
if ((rv = SKF_ExportPublicKey(hContainer, TRUE, buf, &len)) != SAR_OK) {
goto end;
}
printf("Success\n");
end:
//SKF_CloseContainer(hContainer);
//SKF_CloseApplication(hApp);
return 0;
}
int open_container(const char *dev, const char *app, const char *container,
const unsigned char *authkey, size_t authkeylen)
{
DEVHANDLE hDev = NULL;
DEVINFO devInfo;
HAPPLICATION hApp = NULL;
HCONTAINER hContainer = NULL;
return 0;
}

BIN
engines/skf/skftest.o Normal file

Binary file not shown.