/* * Copyright 2014-2021 The GmSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include "internal/dso.h" #include "internal/skf_int.h" #include "../../e_os.h" SKF_METHOD *skf_method = NULL; SKF_VENDOR *skf_vendor = NULL; extern SKF_VENDOR skf_wisec; ULONG SKF_LoadLibrary(LPSTR so_path, LPSTR vendor) { if (skf_method) { SKF_METHOD_free(skf_method); skf_method = NULL; } if (!(skf_method = SKF_METHOD_load_library((char *)so_path))) { SKFerr(SKF_F_SKF_LOADLIBRARY, SKF_R_LOAD_LIBRARY_FAILURE); return SAR_FAIL; } if (vendor) { if (strcmp((char *)vendor, skf_wisec.name) == 0) { skf_vendor = &skf_wisec; } else { SKFerr(SKF_F_SKF_LOADLIBRARY, SKF_R_UNKNOWN_VENDOR); return SAR_FAIL; } } return SAR_OK; } ULONG SKF_UnloadLibrary(void) { SKF_METHOD_free(skf_method); skf_method = NULL; skf_vendor = NULL; return SAR_OK; } static SKF_ERR_REASON skf_errors[] = { { SAR_OK, SKF_R_SUCCESS }, { SAR_FAIL, SKF_R_FAILURE }, { SAR_UNKNOWNERR, SKF_R_UNKNOWN_ERROR }, { SAR_NOTSUPPORTYETERR, SKF_R_OPERATION_NOT_SUPPORTED }, { SAR_FILEERR, SKF_R_FILE_ERROR }, { SAR_INVALIDHANDLEERR, SKF_R_INVALID_HANDLE }, { SAR_INVALIDPARAMERR, SKF_R_INVALID_PARAMETER }, { SAR_READFILEERR, SKF_R_READ_FILE_FAILURE }, { SAR_WRITEFILEERR, SKF_R_WRITE_FILE_FAILURE }, { SAR_NAMELENERR, SKF_R_INVALID_NAME_LENGTH }, { SAR_KEYUSAGEERR, SKF_R_INVALID_KEY_USAGE }, { SAR_MODULUSLENERR, SKF_R_INVALID_MODULUS_LENGTH }, { SAR_NOTINITIALIZEERR, SKF_R_NOT_INITIALIZED }, { SAR_OBJERR, SKF_R_INVALID_OBJECT }, { SAR_MEMORYERR, SKF_R_MEMORY_ERROR }, { SAR_TIMEOUTERR, SKF_R_TIMEOUT }, { SAR_INDATALENERR, SKF_R_INVALID_INPUT_LENGTH }, { SAR_INDATAERR, SKF_R_INVALID_INPUT_VALUE }, { SAR_GENRANDERR, SKF_R_RANDOM_GENERATION_FAILED }, { SAR_HASHOBJERR, SKF_R_INVALID_DIGEST_HANDLE }, { SAR_HASHERR, SKF_R_DIGEST_ERROR }, { SAR_GENRSAKEYERR, SKF_R_RSA_KEY_GENERATION_FAILURE }, { SAR_RSAMODULUSLENERR, SKF_R_INVALID_RSA_MODULUS_LENGTH }, { SAR_CSPIMPRTPUBKEYERR, SKF_R_CSP_IMPORT_PUBLIC_KEY_ERROR }, { SAR_RSAENCERR, SKF_R_RSA_ENCRYPTION_FAILURE }, { SAR_RSADECERR, SKF_R_RSA_DECRYPTION_FAILURE }, { SAR_HASHNOTEQUALERR, SKF_R_HASH_NOT_EQUAL }, { SAR_KEYNOTFOUNTERR, SKF_R_KEY_NOT_FOUND }, { SAR_CERTNOTFOUNTERR, SKF_R_CERTIFICATE_NOT_FOUND }, { SAR_NOTEXPORTERR, SKF_R_EXPORT_FAILED }, { SAR_DECRYPTPADERR, SKF_R_DECRYPT_INVALID_PADDING }, { SAR_MACLENERR, SKF_R_INVALID_MAC_LENGTH }, { SAR_BUFFER_TOO_SMALL, SKF_R_BUFFER_TOO_SMALL }, { SAR_KEYINFOTYPEERR, SKF_R_INVALID_KEY_INFO_TYPE }, { SAR_NOT_EVENTERR, SKF_R_NO_EVENT }, { SAR_DEVICE_REMOVED, SKF_R_DEVICE_REMOVED }, { SAR_PIN_INCORRECT, SKF_R_PIN_INCORRECT }, { SAR_PIN_LOCKED, SKF_R_PIN_LOCKED }, { SAR_PIN_INVALID, SKF_R_INVALID_PIN }, { SAR_PIN_LEN_RANGE, SKF_R_INVALID_PIN_LENGTH }, { SAR_USER_ALREADY_LOGGED_IN, SKF_R_USER_ALREADY_LOGGED_IN }, { SAR_USER_PIN_NOT_INITIALIZED, SKF_R_USER_PIN_NOT_INITIALIZED }, { SAR_USER_TYPE_INVALID, SKF_R_INVALID_USER_TYPE }, { SAR_APPLICATION_NAME_INVALID, SKF_R_INVALID_APPLICATION_NAME }, { SAR_APPLICATION_EXISTS, SKF_R_APPLICATION_ALREADY_EXIST }, { SAR_USER_NOT_LOGGED_IN, SKF_R_USER_NOT_LOGGED_IN }, { SAR_APPLICATION_NOT_EXISTS, SKF_R_APPLICATION_NOT_EXIST }, { SAR_FILE_ALREADY_EXIST, SKF_R_FILE_ALREADY_EXIST }, { SAR_NO_ROOM, SKF_R_NO_SPACE }, { SAR_FILE_NOT_EXIST, SKF_R_FILE_NOT_EXIST }, }; static unsigned long skf_get_error_reason(ULONG ulError) { int i; for (i = 0; i < OSSL_NELEM(skf_errors); i++) { if (ulError == skf_errors[i].err) { return skf_errors[i].reason; } } if (skf_vendor) { return skf_vendor->get_error_reason(ulError); } return 0; } ULONG SKF_GetErrorString(ULONG ulError, LPSTR *szErrorStr) { unsigned long reason; if ((reason = skf_get_error_reason(ulError)) != 0) { *szErrorStr = (LPSTR)ERR_reason_error_string(reason); } else { *szErrorStr = (LPSTR)"(unknown)"; } return SAR_OK; } ULONG DEVAPI SKF_WaitForDevEvent( LPSTR szDevName, ULONG *pulDevNameLen, ULONG *pulEvent) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_WAITFORDEVEVENT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->WaitForDevEvent) { SKFerr(SKF_F_SKF_WAITFORDEVEVENT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->WaitForDevEvent( szDevName, pulDevNameLen, pulEvent)) != SAR_OK) { SKFerr(SKF_F_SKF_WAITFORDEVEVENT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_CancelWaitForDevEvent( void) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CANCELWAITFORDEVEVENT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->CancelWaitForDevEvent) { SKFerr(SKF_F_SKF_CANCELWAITFORDEVEVENT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_method->CancelWaitForDevEvent) { return skf_method->CancelWaitForDevEvent(); } if ((rv = skf_method->CancelWaitForDevEvent()) != SAR_OK) { SKFerr(SKF_F_SKF_CANCELWAITFORDEVEVENT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_EnumDev( BOOL bPresent, LPSTR szNameList, ULONG *pulSize) { ULONG rv; // check output of all enum functions !!!! if (!skf_method) { SKFerr(SKF_F_SKF_ENUMDEV, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->EnumDev) { SKFerr(SKF_F_SKF_ENUMDEV, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (szNameList) { memset(szNameList, 0, *pulSize); } if ((rv = skf_method->EnumDev( bPresent, szNameList, pulSize)) != SAR_OK) { SKFerr(SKF_F_SKF_ENUMDEV, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ConnectDev( LPSTR szName, DEVHANDLE *phDev) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CONNECTDEV, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ConnectDev) { SKFerr(SKF_F_SKF_CONNECTDEV, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ConnectDev( szName, phDev)) != SAR_OK) { SKFerr(SKF_F_SKF_CONNECTDEV, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DisConnectDev( DEVHANDLE hDev) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DISCONNECTDEV, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DisConnectDev) { SKFerr(SKF_F_SKF_DISCONNECTDEV, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DisConnectDev( hDev)) != SAR_OK) { SKFerr(SKF_F_SKF_DISCONNECTDEV, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GetDevState( LPSTR szDevName, ULONG *pulDevState) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GETDEVSTATE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GetDevState) { SKFerr(SKF_F_SKF_GETDEVSTATE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->GetDevState( szDevName, pulDevState)) != SAR_OK) { SKFerr(SKF_F_SKF_GETDEVSTATE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_SetLabel( DEVHANDLE hDev, LPSTR szLabel) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_SETLABEL, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->SetLabel) { SKFerr(SKF_F_SKF_SETLABEL, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->SetLabel( hDev, szLabel)) != SAR_OK) { SKFerr(SKF_F_SKF_SETLABEL, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GetDevInfo( DEVHANDLE hDev, DEVINFO *pDevInfo) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GETDEVINFO, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GetDevInfo) { SKFerr(SKF_F_SKF_GETDEVINFO, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } memset(pDevInfo, 0, sizeof(DEVINFO)); if ((rv = skf_method->GetDevInfo( hDev, pDevInfo)) != SAR_OK) { SKFerr(SKF_F_SKF_GETDEVINFO, skf_get_error_reason(rv)); printf("rv = %8x\n", rv); return rv; } if (skf_vendor) { pDevInfo->AlgSymCap = skf_vendor->get_cipher_cap(pDevInfo->AlgSymCap); pDevInfo->AlgAsymCap = skf_vendor->get_pkey_cap(pDevInfo->AlgAsymCap); pDevInfo->AlgHashCap = skf_vendor->get_digest_cap(pDevInfo->AlgHashCap); pDevInfo->DevAuthAlgId = skf_vendor->get_cipher_cap(pDevInfo->DevAuthAlgId); } return SAR_OK; } ULONG DEVAPI SKF_LockDev( DEVHANDLE hDev, ULONG ulTimeOut) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_LOCKDEV, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->LockDev) { SKFerr(SKF_F_SKF_LOCKDEV, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->LockDev( hDev, ulTimeOut)) != SAR_OK) { SKFerr(SKF_F_SKF_LOCKDEV, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_UnlockDev( DEVHANDLE hDev) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_UNLOCKDEV, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->UnlockDev) { SKFerr(SKF_F_SKF_UNLOCKDEV, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->UnlockDev( hDev)) != SAR_OK) { SKFerr(SKF_F_SKF_UNLOCKDEV, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_Transmit( DEVHANDLE hDev, BYTE *pbCommand, ULONG ulCommandLen, BYTE *pbData, ULONG *pulDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_TRANSMIT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->Transmit) { SKFerr(SKF_F_SKF_TRANSMIT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->Transmit( hDev, pbCommand, ulCommandLen, pbData, pulDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_TRANSMIT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ChangeDevAuthKey( DEVHANDLE hDev, BYTE *pbKeyValue, ULONG ulKeyLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CHANGEDEVAUTHKEY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ChangeDevAuthKey) { SKFerr(SKF_F_SKF_CHANGEDEVAUTHKEY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ChangeDevAuthKey( hDev, pbKeyValue, ulKeyLen)) != SAR_OK) { SKFerr(SKF_F_SKF_CHANGEDEVAUTHKEY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DevAuth( DEVHANDLE hDev, BYTE *pbAuthData, ULONG ulLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DEVAUTH, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DevAuth) { SKFerr(SKF_F_SKF_DEVAUTH, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DevAuth( hDev, pbAuthData, ulLen)) != SAR_OK) { SKFerr(SKF_F_SKF_DEVAUTH, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ChangePIN( HAPPLICATION hApplication, ULONG ulPINType, LPSTR szOldPin, LPSTR szNewPin, ULONG *pulRetryCount) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CHANGEPIN, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ChangePIN) { SKFerr(SKF_F_SKF_CHANGEPIN, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ChangePIN( hApplication, ulPINType, szOldPin, szNewPin, pulRetryCount)) != SAR_OK) { SKFerr(SKF_F_SKF_CHANGEPIN, skf_get_error_reason(rv)); return rv; } return SAR_OK; } LONG DEVAPI SKF_GetPINInfo( HAPPLICATION hApplication, ULONG ulPINType, ULONG *pulMaxRetryCount, ULONG *pulRemainRetryCount, BOOL *pbDefaultPin) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GETPININFO, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GetPINInfo) { SKFerr(SKF_F_SKF_GETPININFO, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->GetPINInfo( hApplication, ulPINType, pulMaxRetryCount, pulRemainRetryCount, pbDefaultPin)) != SAR_OK) { SKFerr(SKF_F_SKF_GETPININFO, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_VerifyPIN( HAPPLICATION hApplication, ULONG ulPINType, LPSTR szPIN, ULONG *pulRetryCount) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_VERIFYPIN, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->VerifyPIN) { SKFerr(SKF_F_SKF_VERIFYPIN, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->VerifyPIN( hApplication, ulPINType, szPIN, pulRetryCount)) != SAR_OK) { SKFerr(SKF_F_SKF_VERIFYPIN, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_UnblockPIN( HAPPLICATION hApplication, LPSTR szAdminPIN, LPSTR szNewUserPIN, ULONG *pulRetryCount) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_UNBLOCKPIN, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->UnblockPIN) { SKFerr(SKF_F_SKF_UNBLOCKPIN, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->UnblockPIN( hApplication, szAdminPIN, szNewUserPIN, pulRetryCount)) != SAR_OK) { SKFerr(SKF_F_SKF_UNBLOCKPIN, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ClearSecureState( HAPPLICATION hApplication) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CLEARSECURESTATE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ClearSecureState) { SKFerr(SKF_F_SKF_CLEARSECURESTATE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ClearSecureState( hApplication)) != SAR_OK) { SKFerr(SKF_F_SKF_CLEARSECURESTATE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_CreateApplication( DEVHANDLE hDev, LPSTR szAppName, LPSTR szAdminPin, DWORD dwAdminPinRetryCount, LPSTR szUserPin, DWORD dwUserPinRetryCount, DWORD dwCreateFileRights, HAPPLICATION *phApplication) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CREATEAPPLICATION, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->CreateApplication) { SKFerr(SKF_F_SKF_CREATEAPPLICATION, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->CreateApplication( hDev, szAppName, szAdminPin, dwAdminPinRetryCount, szUserPin, dwUserPinRetryCount, dwCreateFileRights, phApplication)) != SAR_OK) { SKFerr(SKF_F_SKF_CREATEAPPLICATION, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_EnumApplication( DEVHANDLE hDev, LPSTR szAppName, ULONG *pulSize) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ENUMAPPLICATION, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->EnumApplication) { SKFerr(SKF_F_SKF_ENUMAPPLICATION, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->EnumApplication( hDev, szAppName, pulSize)) != SAR_OK) { SKFerr(SKF_F_SKF_ENUMAPPLICATION, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DeleteApplication( DEVHANDLE hDev, LPSTR szAppName) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DELETEAPPLICATION, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DeleteApplication) { SKFerr(SKF_F_SKF_DELETEAPPLICATION, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DeleteApplication( hDev, szAppName)) != SAR_OK) { SKFerr(SKF_F_SKF_DELETEAPPLICATION, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_OpenApplication( DEVHANDLE hDev, LPSTR szAppName, HAPPLICATION *phApplication) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_OPENAPPLICATION, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->OpenApplication) { SKFerr(SKF_F_SKF_OPENAPPLICATION, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->OpenApplication( hDev, szAppName, phApplication)) != SAR_OK) { SKFerr(SKF_F_SKF_OPENAPPLICATION, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_CloseApplication( HAPPLICATION hApplication) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CLOSEAPPLICATION, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->CloseApplication) { SKFerr(SKF_F_SKF_CLOSEAPPLICATION, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->CloseApplication( hApplication)) != SAR_OK) { SKFerr(SKF_F_SKF_CLOSEAPPLICATION, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_CreateFile( HAPPLICATION hApplication, LPSTR szFileName, ULONG ulFileSize, ULONG ulReadRights, ULONG ulWriteRights) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CREATEFILE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->CreateObject) { SKFerr(SKF_F_SKF_CREATEFILE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->CreateObject( hApplication, szFileName, ulFileSize, ulReadRights, ulWriteRights)) != SAR_OK) { SKFerr(SKF_F_SKF_CREATEFILE, skf_get_error_reason(rv)); //LPSTR str = NULL; //printf("error = %08X\n", rv); //SKF_GetErrorString(rv, &str); //printf("error = %s\n", (char *)str); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DeleteFile( HAPPLICATION hApplication, LPSTR szFileName) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DELETEFILE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DeleteObject) { SKFerr(SKF_F_SKF_DELETEFILE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DeleteObject( hApplication, szFileName)) != SAR_OK) { SKFerr(SKF_F_SKF_DELETEFILE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_EnumFiles( HAPPLICATION hApplication, LPSTR szFileList, ULONG *pulSize) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ENUMFILES, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->EnumObjects) { SKFerr(SKF_F_SKF_ENUMFILES, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->EnumObjects( hApplication, szFileList, pulSize)) != SAR_OK) { SKFerr(SKF_F_SKF_ENUMFILES, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GetFileInfo( HAPPLICATION hApplication, LPSTR szFileName, FILEATTRIBUTE *pFileInfo) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GETFILEINFO, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GetObjectInfo) { SKFerr(SKF_F_SKF_GETFILEINFO, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } memset(pFileInfo, 0, sizeof(FILEATTRIBUTE)); if ((rv = skf_method->GetObjectInfo( hApplication, szFileName, pFileInfo)) != SAR_OK) { SKFerr(SKF_F_SKF_GETFILEINFO, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ReadFile( HAPPLICATION hApplication, LPSTR szFileName, ULONG ulOffset, ULONG ulSize, BYTE *pbOutData, ULONG *pulOutLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_READFILE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ReadObject) { SKFerr(SKF_F_SKF_READFILE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ReadObject( hApplication, szFileName, ulOffset, ulSize, pbOutData, pulOutLen)) != SAR_OK) { SKFerr(SKF_F_SKF_READFILE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_WriteFile( HAPPLICATION hApplication, LPSTR szFileName, ULONG ulOffset, BYTE *pbData, ULONG ulSize) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_WRITEFILE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->WriteObject) { SKFerr(SKF_F_SKF_WRITEFILE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->WriteObject( hApplication, szFileName, ulOffset, pbData, ulSize)) != SAR_OK) { SKFerr(SKF_F_SKF_WRITEFILE, skf_get_error_reason(rv)); printf("error = %08X\n", rv); return rv; } return SAR_OK; } ULONG DEVAPI SKF_CreateContainer( HAPPLICATION hApplication, LPSTR szContainerName, HCONTAINER *phContainer) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CREATECONTAINER, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->CreateContainer) { SKFerr(SKF_F_SKF_CREATECONTAINER, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->CreateContainer( hApplication, szContainerName, phContainer)) != SAR_OK) { SKFerr(SKF_F_SKF_CREATECONTAINER, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DeleteContainer( HAPPLICATION hApplication, LPSTR szContainerName) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DELETECONTAINER, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DeleteContainer) { SKFerr(SKF_F_SKF_DELETECONTAINER, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DeleteContainer( hApplication, szContainerName)) != SAR_OK) { SKFerr(SKF_F_SKF_DELETECONTAINER, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_EnumContainer( HAPPLICATION hApplication, LPSTR szContainerName, ULONG *pulSize) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ENUMCONTAINER, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->EnumContainer) { SKFerr(SKF_F_SKF_ENUMCONTAINER, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->EnumContainer( hApplication, szContainerName, pulSize)) != SAR_OK) { SKFerr(SKF_F_SKF_ENUMCONTAINER, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_OpenContainer( HAPPLICATION hApplication, LPSTR szContainerName, HCONTAINER *phContainer) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_OPENCONTAINER, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->OpenContainer) { SKFerr(SKF_F_SKF_OPENCONTAINER, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->OpenContainer( hApplication, szContainerName, phContainer)) != SAR_OK) { SKFerr(SKF_F_SKF_OPENCONTAINER, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_CloseContainer( HCONTAINER hContainer) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CLOSECONTAINER, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->CloseContainer) { SKFerr(SKF_F_SKF_CLOSECONTAINER, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->CloseContainer( hContainer)) != SAR_OK) { SKFerr(SKF_F_SKF_CLOSECONTAINER, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GetContainerType( HCONTAINER hContainer, ULONG *pulContainerType) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GETCONTAINERTYPE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GetContainerType) { SKFerr(SKF_F_SKF_GETCONTAINERTYPE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->GetContainerType( hContainer, pulContainerType)) != SAR_OK) { SKFerr(SKF_F_SKF_GETCONTAINERTYPE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ImportCertificate( HCONTAINER hContainer, BOOL bExportSignKey, BYTE *pbCert, ULONG ulCertLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_IMPORTCERTIFICATE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ImportCertificate) { SKFerr(SKF_F_SKF_IMPORTCERTIFICATE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ImportCertificate( hContainer, bExportSignKey, pbCert, ulCertLen)) != SAR_OK) { SKFerr(SKF_F_SKF_IMPORTCERTIFICATE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ExportCertificate( HCONTAINER hContainer, BOOL bSignFlag, BYTE *pbCert, ULONG *pulCertLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_EXPORTCERTIFICATE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ExportCertificate) { SKFerr(SKF_F_SKF_EXPORTCERTIFICATE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ExportCertificate( hContainer, bSignFlag, pbCert, pulCertLen)) != SAR_OK) { SKFerr(SKF_F_SKF_EXPORTCERTIFICATE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ExportPublicKey( HCONTAINER hContainer, BOOL bSignFlag, BYTE *pbBlob, ULONG *pulBlobLen) { ULONG rv; // TODO: check the output length, clear the memmory. // if pbBlob is NULL, return the length if (!skf_method) { SKFerr(SKF_F_SKF_EXPORTPUBLICKEY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ExportPublicKey) { SKFerr(SKF_F_SKF_EXPORTPUBLICKEY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ExportPublicKey( hContainer, bSignFlag, pbBlob, pulBlobLen)) != SAR_OK) { SKFerr(SKF_F_SKF_EXPORTPUBLICKEY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GenRandom( DEVHANDLE hDev, BYTE *pbRandom, ULONG ulRandomLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GENRANDOM, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GenRandom) { SKFerr(SKF_F_SKF_GENRANDOM, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->GenRandom( hDev, pbRandom, ulRandomLen)) != SAR_OK) { SKFerr(SKF_F_SKF_GENRANDOM, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GenExtRSAKey( DEVHANDLE hDev, ULONG ulBitsLen, RSAPRIVATEKEYBLOB *pBlob) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GENEXTRSAKEY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GenExtRSAKey) { SKFerr(SKF_F_SKF_GENEXTRSAKEY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->GenExtRSAKey( hDev, ulBitsLen, pBlob)) != SAR_OK) { SKFerr(SKF_F_SKF_GENEXTRSAKEY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GenRSAKeyPair( HCONTAINER hContainer, ULONG ulBitsLen, RSAPUBLICKEYBLOB *pBlob) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GENRSAKEYPAIR, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GenRSAKeyPair) { SKFerr(SKF_F_SKF_GENRSAKEYPAIR, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } memset(pBlob, 0, sizeof(RSAPUBLICKEYBLOB)); if ((rv = skf_method->GenRSAKeyPair( hContainer, ulBitsLen, pBlob)) != SAR_OK) { SKFerr(SKF_F_SKF_GENRSAKEYPAIR, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ImportRSAKeyPair( HCONTAINER hContainer, ULONG ulSymAlgId, BYTE *pbWrappedKey, ULONG ulWrappedKeyLen, BYTE *pbEncryptedData, ULONG ulEncryptedDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_IMPORTRSAKEYPAIR, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ImportRSAKeyPair) { SKFerr(SKF_F_SKF_IMPORTRSAKEYPAIR, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulSymAlgId = skf_vendor->get_cipher_algor(ulSymAlgId))) { SKFerr(SKF_F_SKF_IMPORTRSAKEYPAIR, SKF_R_NOT_SUPPORTED_CIPHER_ALGOR); return SAR_NOTSUPPORTYETERR; } } if ((rv = skf_method->ImportRSAKeyPair( hContainer, ulSymAlgId, pbWrappedKey, ulWrappedKeyLen, pbEncryptedData, ulEncryptedDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_IMPORTRSAKEYPAIR, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_RSASignData( HCONTAINER hContainer, BYTE *pbData, ULONG ulDataLen, BYTE *pbSignature, ULONG *pulSignLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_RSASIGNDATA, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->RSASignData) { SKFerr(SKF_F_SKF_RSASIGNDATA, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->RSASignData( hContainer, pbData, ulDataLen, pbSignature, pulSignLen)) != SAR_OK) { SKFerr(SKF_F_SKF_RSASIGNDATA, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_RSAVerify( DEVHANDLE hDev, RSAPUBLICKEYBLOB *pRSAPubKeyBlob, BYTE *pbData, ULONG ulDataLen, BYTE *pbSignature, ULONG ulSignLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_RSAVERIFY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->RSAVerify) { SKFerr(SKF_F_SKF_RSAVERIFY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->RSAVerify( hDev, pRSAPubKeyBlob, pbData, ulDataLen, pbSignature, ulSignLen)) != SAR_OK) { SKFerr(SKF_F_SKF_RSAVERIFY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_RSAExportSessionKey( HCONTAINER hContainer, ULONG ulAlgId, RSAPUBLICKEYBLOB *pPubKey, BYTE *pbData, ULONG *pulDataLen, HANDLE *phSessionKey) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_RSAEXPORTSESSIONKEY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->RSAExportSessionKey) { SKFerr(SKF_F_SKF_RSAEXPORTSESSIONKEY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) { SKFerr(SKF_F_SKF_RSAEXPORTSESSIONKEY, SKF_R_NOT_SUPPORTED_CIPHER_ALGOR); return SAR_NOTSUPPORTYETERR; } } if ((rv = skf_method->RSAExportSessionKey( hContainer, ulAlgId, pPubKey, pbData, pulDataLen, phSessionKey)) != SAR_OK) { SKFerr(SKF_F_SKF_RSAEXPORTSESSIONKEY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ExtRSAPubKeyOperation( DEVHANDLE hDev, RSAPUBLICKEYBLOB *pRSAPubKeyBlob, BYTE *pbInput, ULONG ulInputLen, BYTE *pbOutput, ULONG *pulOutputLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_EXTRSAPUBKEYOPERATION, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ExtRSAPubKeyOperation) { SKFerr(SKF_F_SKF_EXTRSAPUBKEYOPERATION, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ExtRSAPubKeyOperation( hDev, pRSAPubKeyBlob, pbInput, ulInputLen, pbOutput, pulOutputLen)) != SAR_OK) { SKFerr(SKF_F_SKF_EXTRSAPUBKEYOPERATION, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ExtRSAPriKeyOperation( DEVHANDLE hDev, RSAPRIVATEKEYBLOB *pRSAPriKeyBlob, BYTE *pbInput, ULONG ulInputLen, BYTE *pbOutput, ULONG *pulOutputLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_EXTRSAPRIKEYOPERATION, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ExtRSAPriKeyOperation) { SKFerr(SKF_F_SKF_EXTRSAPRIKEYOPERATION, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ExtRSAPriKeyOperation( hDev, pRSAPriKeyBlob, pbInput, ulInputLen, pbOutput, pulOutputLen)) != SAR_OK) { SKFerr(SKF_F_SKF_EXTRSAPRIKEYOPERATION, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GenECCKeyPair( HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pBlob) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GENECCKEYPAIR, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GenECCKeyPair) { SKFerr(SKF_F_SKF_GENECCKEYPAIR, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulAlgId = skf_vendor->get_pkey_algor(ulAlgId))) { SKFerr(SKF_F_SKF_GENECCKEYPAIR, SKF_R_NOT_SUPPORTED_PKEY_ALGOR); return SAR_NOTSUPPORTYETERR; } } memset(pBlob, 0, sizeof(ECCPUBLICKEYBLOB)); if ((rv = skf_method->GenECCKeyPair( hContainer, ulAlgId, pBlob)) != SAR_OK) { SKFerr(SKF_F_SKF_GENECCKEYPAIR, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ImportECCKeyPair( HCONTAINER hContainer, ENVELOPEDKEYBLOB *pEnvelopedKeyBlob) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_IMPORTECCKEYPAIR, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ImportECCKeyPair) { SKFerr(SKF_F_SKF_IMPORTECCKEYPAIR, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ImportECCKeyPair( hContainer, pEnvelopedKeyBlob)) != SAR_OK) { SKFerr(SKF_F_SKF_IMPORTECCKEYPAIR, skf_get_error_reason(rv)); printf("%s %d: error = %08X\n", __FILE__, __LINE__, rv); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ECCSignData( HCONTAINER hContainer, BYTE *pbDigest, ULONG ulDigestLen, ECCSIGNATUREBLOB *pSignature) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ECCSIGNDATA, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ECCSignData) { SKFerr(SKF_F_SKF_ECCSIGNDATA, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ECCSignData( hContainer, pbDigest, ulDigestLen, pSignature)) != SAR_OK) { SKFerr(SKF_F_SKF_ECCSIGNDATA, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ECCVerify( DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, ECCSIGNATUREBLOB *pSignature) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ECCVERIFY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ECCVerify) { SKFerr(SKF_F_SKF_ECCVERIFY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ECCVerify( hDev, pECCPubKeyBlob, pbData, ulDataLen, pSignature)) != SAR_OK) { SKFerr(SKF_F_SKF_ECCVERIFY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ECCExportSessionKey( HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pPubKey, ECCCIPHERBLOB *pData, HANDLE *phSessionKey) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ECCEXPORTSESSIONKEY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ECCExportSessionKey) { SKFerr(SKF_F_SKF_ECCEXPORTSESSIONKEY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) { SKFerr(SKF_F_SKF_ECCEXPORTSESSIONKEY, SKF_R_NOT_SUPPORTED_CIPHER_ALGOR); return SAR_NOTSUPPORTYETERR; } } if ((rv = skf_method->ECCExportSessionKey( hContainer, ulAlgId, pPubKey, pData, phSessionKey)) != SAR_OK) { SKFerr(SKF_F_SKF_ECCEXPORTSESSIONKEY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ECCDecrypt( HCONTAINER hContainer, ECCCIPHERBLOB *pCipherText, BYTE *pbPlainText, ULONG *pulPlainTextLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ECCDECRYPT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ECCDecrypt) { SKFerr(SKF_F_SKF_ECCDECRYPT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ECCDecrypt( hContainer, pCipherText, pbPlainText, pulPlainTextLen)) != SAR_OK) { SKFerr(SKF_F_SKF_ECCDECRYPT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ExtECCEncrypt( DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbPlainText, ULONG ulPlainTextLen, ECCCIPHERBLOB *pCipherText) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_EXTECCENCRYPT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ExtECCEncrypt) { SKFerr(SKF_F_SKF_EXTECCENCRYPT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ExtECCEncrypt( hDev, pECCPubKeyBlob, pbPlainText, ulPlainTextLen, pCipherText)) != SAR_OK) { SKFerr(SKF_F_SKF_EXTECCENCRYPT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ExtECCDecrypt( DEVHANDLE hDev, ECCPRIVATEKEYBLOB *pECCPriKeyBlob, ECCCIPHERBLOB *pCipherText, BYTE *pbPlainText, ULONG *pulPlainTextLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_EXTECCDECRYPT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ExtECCDecrypt) { SKFerr(SKF_F_SKF_EXTECCDECRYPT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ExtECCDecrypt( hDev, pECCPriKeyBlob, pCipherText, pbPlainText, pulPlainTextLen)) != SAR_OK) { SKFerr(SKF_F_SKF_EXTECCDECRYPT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ExtECCSign( DEVHANDLE hDev, ECCPRIVATEKEYBLOB *pECCPriKeyBlob, BYTE *pbData, ULONG ulDataLen, ECCSIGNATUREBLOB *pSignature) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_EXTECCSIGN, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ExtECCSign) { SKFerr(SKF_F_SKF_EXTECCSIGN, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ExtECCSign( hDev, pECCPriKeyBlob, pbData, ulDataLen, pSignature)) != SAR_OK) { SKFerr(SKF_F_SKF_EXTECCSIGN, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ExtECCVerify( DEVHANDLE hDev, ECCPUBLICKEYBLOB *pECCPubKeyBlob, BYTE *pbData, ULONG ulDataLen, ECCSIGNATUREBLOB *pSignature) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_EXTECCVERIFY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ExtECCVerify) { SKFerr(SKF_F_SKF_EXTECCVERIFY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->ExtECCVerify( hDev, pECCPubKeyBlob, pbData, ulDataLen, pSignature)) != SAR_OK) { SKFerr(SKF_F_SKF_EXTECCVERIFY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GenerateAgreementDataWithECC( HCONTAINER hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pTempECCPubKeyBlob, BYTE *pbID, ULONG ulIDLen, HANDLE *phAgreementHandle) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAWITHECC, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GenerateAgreementDataWithECC) { SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAWITHECC, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) { SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAWITHECC, SKF_R_NOT_SUPPORTED_CIPHER_ALGOR); return SAR_NOTSUPPORTYETERR; } } if ((rv = skf_method->GenerateAgreementDataWithECC( hContainer, ulAlgId, pTempECCPubKeyBlob, pbID, ulIDLen, phAgreementHandle)) != SAR_OK) { SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAWITHECC, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GenerateAgreementDataAndKeyWithECC( HANDLE hContainer, ULONG ulAlgId, ECCPUBLICKEYBLOB *pSponsorECCPubKeyBlob, ECCPUBLICKEYBLOB *pSponsorTempECCPubKeyBlob, ECCPUBLICKEYBLOB *pTempECCPubKeyBlob, BYTE *pbID, ULONG ulIDLen, BYTE *pbSponsorID, ULONG ulSponsorIDLen, HANDLE *phKeyHandle) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAANDKEYWITHECC, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GenerateAgreementDataAndKeyWithECC) { SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAANDKEYWITHECC, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) { SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAANDKEYWITHECC, SKF_R_NOT_SUPPORTED_CIPHER_ALGOR); return SAR_NOTSUPPORTYETERR; } } if ((rv = skf_method->GenerateAgreementDataAndKeyWithECC( hContainer, ulAlgId, pSponsorECCPubKeyBlob, pSponsorTempECCPubKeyBlob, pTempECCPubKeyBlob, pbID, ulIDLen, pbSponsorID, ulSponsorIDLen, phKeyHandle)) != SAR_OK) { SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAANDKEYWITHECC, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_GenerateKeyWithECC( HANDLE hAgreementHandle, ECCPUBLICKEYBLOB *pECCPubKeyBlob, ECCPUBLICKEYBLOB *pTempECCPubKeyBlob, BYTE *pbID, ULONG ulIDLen, HANDLE *phKeyHandle) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_GENERATEKEYWITHECC, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->GenerateKeyWithECC) { SKFerr(SKF_F_SKF_GENERATEKEYWITHECC, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->GenerateKeyWithECC( hAgreementHandle, pECCPubKeyBlob, pTempECCPubKeyBlob, pbID, ulIDLen, phKeyHandle)) != SAR_OK) { SKFerr(SKF_F_SKF_GENERATEKEYWITHECC, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_ImportSessionKey( HCONTAINER hContainer, ULONG ulAlgId, BYTE *pbWrapedData, ULONG ulWrapedLen, HANDLE *phKey) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_IMPORTSESSIONKEY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->ImportSessionKey) { SKFerr(SKF_F_SKF_IMPORTSESSIONKEY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) { SKFerr(SKF_F_SKF_IMPORTSESSIONKEY, SKF_R_NOT_SUPPORTED_CIPHER_ALGOR); return SAR_NOTSUPPORTYETERR; } } if ((rv = skf_method->ImportSessionKey( hContainer, ulAlgId, pbWrapedData, ulWrapedLen, phKey)) != SAR_OK) { SKFerr(SKF_F_SKF_IMPORTSESSIONKEY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_SetSymmKey( DEVHANDLE hDev, BYTE *pbKey, ULONG ulAlgID, HANDLE *phKey) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_SETSYMMKEY, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->SetSymmKey) { SKFerr(SKF_F_SKF_SETSYMMKEY, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulAlgID = skf_vendor->get_cipher_algor(ulAlgID))) { SKFerr(SKF_F_SKF_SETSYMMKEY, SKF_R_NOT_SUPPORTED_CIPHER_ALGOR); return SAR_NOTSUPPORTYETERR; } } if ((rv = skf_method->SetSymmKey( hDev, pbKey, ulAlgID, phKey)) != SAR_OK) { SKFerr(SKF_F_SKF_SETSYMMKEY, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_EncryptInit( HANDLE hKey, BLOCKCIPHERPARAM EncryptParam) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ENCRYPTINIT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->EncryptInit) { SKFerr(SKF_F_SKF_ENCRYPTINIT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->EncryptInit( hKey, EncryptParam)) != SAR_OK) { SKFerr(SKF_F_SKF_ENCRYPTINIT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_Encrypt( HANDLE hKey, BYTE *pbData, ULONG ulDataLen, BYTE *pbEncryptedData, ULONG *pulEncryptedLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ENCRYPT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->Encrypt) { SKFerr(SKF_F_SKF_ENCRYPT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->Encrypt( hKey, pbData, ulDataLen, pbEncryptedData, pulEncryptedLen)) != SAR_OK) { SKFerr(SKF_F_SKF_ENCRYPT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_EncryptUpdate( HANDLE hKey, BYTE *pbData, ULONG ulDataLen, BYTE *pbEncryptedData, ULONG *pulEncryptedLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ENCRYPTUPDATE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->EncryptUpdate) { SKFerr(SKF_F_SKF_ENCRYPTUPDATE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->EncryptUpdate( hKey, pbData, ulDataLen, pbEncryptedData, pulEncryptedLen)) != SAR_OK) { SKFerr(SKF_F_SKF_ENCRYPTUPDATE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_EncryptFinal( HANDLE hKey, BYTE *pbEncryptedData, ULONG *pulEncryptedDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_ENCRYPTFINAL, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->EncryptFinal) { SKFerr(SKF_F_SKF_ENCRYPTFINAL, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->EncryptFinal( hKey, pbEncryptedData, pulEncryptedDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_ENCRYPTFINAL, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DecryptInit( HANDLE hKey, BLOCKCIPHERPARAM DecryptParam) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DECRYPTINIT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DecryptInit) { SKFerr(SKF_F_SKF_DECRYPTINIT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DecryptInit( hKey, DecryptParam)) != SAR_OK) { SKFerr(SKF_F_SKF_DECRYPTINIT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_Decrypt( HANDLE hKey, BYTE *pbEncryptedData, ULONG ulEncryptedLen, BYTE *pbData, ULONG *pulDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DECRYPT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->Decrypt) { SKFerr(SKF_F_SKF_DECRYPT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->Decrypt( hKey, pbEncryptedData, ulEncryptedLen, pbData, pulDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_DECRYPT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DecryptUpdate( HANDLE hKey, BYTE *pbEncryptedData, ULONG ulEncryptedLen, BYTE *pbData, ULONG *pulDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DECRYPTUPDATE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DecryptUpdate) { SKFerr(SKF_F_SKF_DECRYPTUPDATE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DecryptUpdate( hKey, pbEncryptedData, ulEncryptedLen, pbData, pulDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_DECRYPTUPDATE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DecryptFinal( HANDLE hKey, BYTE *pbDecryptedData, ULONG *pulDecryptedDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DECRYPTFINAL, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DecryptFinal) { SKFerr(SKF_F_SKF_DECRYPTFINAL, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DecryptFinal( hKey, pbDecryptedData, pulDecryptedDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_DECRYPTFINAL, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DigestInit( DEVHANDLE hDev, ULONG ulAlgID, ECCPUBLICKEYBLOB *pPubKey, BYTE *pbID, ULONG ulIDLen, HANDLE *phHash) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DIGESTINIT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DigestInit) { SKFerr(SKF_F_SKF_DIGESTINIT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if (skf_vendor) { if (!(ulAlgID = skf_vendor->get_digest_algor(ulAlgID))) { SKFerr(SKF_F_SKF_DIGESTINIT, SKF_R_NOT_SUPPORTED_DIGEST_ALGOR); return SAR_NOTSUPPORTYETERR; } } if ((rv = skf_method->DigestInit( hDev, ulAlgID, pPubKey, pbID, ulIDLen, phHash)) != SAR_OK) { SKFerr(SKF_F_SKF_DIGESTINIT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_Digest( HANDLE hHash, BYTE *pbData, ULONG ulDataLen, BYTE *pbHashData, ULONG *pulHashLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DIGEST, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->Digest) { SKFerr(SKF_F_SKF_DIGEST, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->Digest( hHash, pbData, ulDataLen, pbHashData, pulHashLen)) != SAR_OK) { SKFerr(SKF_F_SKF_DIGEST, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DigestUpdate( HANDLE hHash, BYTE *pbData, ULONG ulDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DIGESTUPDATE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DigestUpdate) { SKFerr(SKF_F_SKF_DIGESTUPDATE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DigestUpdate( hHash, pbData, ulDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_DIGESTUPDATE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_DigestFinal( HANDLE hHash, BYTE *pHashData, ULONG *pulHashLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_DIGESTFINAL, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->DigestFinal) { SKFerr(SKF_F_SKF_DIGESTFINAL, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->DigestFinal( hHash, pHashData, pulHashLen)) != SAR_OK) { SKFerr(SKF_F_SKF_DIGESTFINAL, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_MacInit( HANDLE hKey, BLOCKCIPHERPARAM *pMacParam, HANDLE *phMac) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_MACINIT, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->MacInit) { SKFerr(SKF_F_SKF_MACINIT, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->MacInit( hKey, pMacParam, phMac)) != SAR_OK) { SKFerr(SKF_F_SKF_MACINIT, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_Mac( HANDLE hMac, BYTE *pbData, ULONG ulDataLen, BYTE *pbMacData, ULONG *pulMacLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_MAC, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->Mac) { SKFerr(SKF_F_SKF_MAC, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->Mac( hMac, pbData, ulDataLen, pbMacData, pulMacLen)) != SAR_OK) { SKFerr(SKF_F_SKF_MAC, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_MacUpdate( HANDLE hMac, BYTE *pbData, ULONG ulDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_MACUPDATE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->MacUpdate) { SKFerr(SKF_F_SKF_MACUPDATE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->MacUpdate( hMac, pbData, ulDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_MACUPDATE, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_MacFinal( HANDLE hMac, BYTE *pbMacData, ULONG *pulMacDataLen) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_MACFINAL, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->MacFinal) { SKFerr(SKF_F_SKF_MACFINAL, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->MacFinal( hMac, pbMacData, pulMacDataLen)) != SAR_OK) { SKFerr(SKF_F_SKF_MACFINAL, skf_get_error_reason(rv)); return rv; } return SAR_OK; } ULONG DEVAPI SKF_CloseHandle( HANDLE hHandle) { ULONG rv; if (!skf_method) { SKFerr(SKF_F_SKF_CLOSEHANDLE, SKF_R_SKF_METHOD_NOT_INITIALIZED); return SAR_NOTINITIALIZEERR; } if (!skf_method->CloseHandle) { SKFerr(SKF_F_SKF_CLOSEHANDLE, SKF_R_FUNCTION_NOT_SUPPORTED); return SAR_NOTSUPPORTYETERR; } if ((rv = skf_method->CloseHandle( hHandle)) != SAR_OK) { SKFerr(SKF_F_SKF_CLOSEHANDLE, skf_get_error_reason(rv)); return rv; } return SAR_OK; }