#include <security/cryptoki.h>
#include "pkcs11Global.h"
#include "pkcs11Conf.h"
#include "pkcs11Session.h"
#include "pkcs11Slot.h"
CK_RV
C_DigestInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism)
{
CK_RV rv;
pkcs11_session_t *sessp;
CK_SLOT_ID slotid;
if (purefastpath || policyfastpath) {
if (policyfastpath &&
pkcs11_is_dismech(fast_slot, pMechanism->mechanism)) {
return (CKR_MECHANISM_INVALID);
}
return (fast_funcs->C_DigestInit(hSession, pMechanism));
}
if (!pkcs11_initialized) {
return (CKR_CRYPTOKI_NOT_INITIALIZED);
}
HANDLE2SESSION(hSession, sessp, rv);
if (rv != CKR_OK) {
return (rv);
}
slotid = sessp->se_slotid;
if (pkcs11_is_dismech(slotid, pMechanism->mechanism)) {
return (CKR_MECHANISM_INVALID);
}
rv = FUNCLIST(slotid)->C_DigestInit(sessp->se_handle,
pMechanism);
if (rv == CKR_FUNCTION_NOT_SUPPORTED) {
return (CKR_FUNCTION_FAILED);
}
return (rv);
}
CK_RV
C_Digest(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen,
CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen)
{
CK_RV rv;
pkcs11_session_t *sessp;
if (purefastpath || policyfastpath) {
return (fast_funcs->C_Digest(hSession, pData, ulDataLen,
pDigest, pulDigestLen));
}
if (!pkcs11_initialized) {
return (CKR_CRYPTOKI_NOT_INITIALIZED);
}
HANDLE2SESSION(hSession, sessp, rv);
if (rv != CKR_OK) {
return (rv);
}
rv = FUNCLIST(sessp->se_slotid)->C_Digest(sessp->se_handle, pData,
ulDataLen, pDigest, pulDigestLen);
if (rv == CKR_FUNCTION_NOT_SUPPORTED) {
return (CKR_FUNCTION_FAILED);
}
return (rv);
}
CK_RV
C_DigestUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
CK_ULONG ulPartLen)
{
CK_RV rv;
pkcs11_session_t *sessp;
if (purefastpath || policyfastpath) {
return (fast_funcs->C_DigestUpdate(hSession, pPart,
ulPartLen));
}
if (!pkcs11_initialized) {
return (CKR_CRYPTOKI_NOT_INITIALIZED);
}
HANDLE2SESSION(hSession, sessp, rv);
if (rv != CKR_OK) {
return (rv);
}
rv = FUNCLIST(sessp->se_slotid)->C_DigestUpdate(sessp->se_handle,
pPart, ulPartLen);
if (rv == CKR_FUNCTION_NOT_SUPPORTED) {
return (CKR_FUNCTION_FAILED);
}
return (rv);
}
CK_RV
C_DigestKey(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey)
{
CK_RV rv;
pkcs11_session_t *sessp;
if (purefastpath || policyfastpath) {
return (fast_funcs->C_DigestKey(hSession, hKey));
}
if (!pkcs11_initialized) {
return (CKR_CRYPTOKI_NOT_INITIALIZED);
}
HANDLE2SESSION(hSession, sessp, rv);
if (rv != CKR_OK) {
return (rv);
}
rv = FUNCLIST(sessp->se_slotid)->C_DigestKey(sessp->se_handle, hKey);
if (rv == CKR_FUNCTION_NOT_SUPPORTED) {
return (CKR_FUNCTION_FAILED);
}
return (rv);
}
CK_RV
C_DigestFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest,
CK_ULONG_PTR pulDigestLen)
{
CK_RV rv;
pkcs11_session_t *sessp;
if (purefastpath || policyfastpath) {
return (fast_funcs->C_DigestFinal(hSession, pDigest,
pulDigestLen));
}
if (!pkcs11_initialized) {
return (CKR_CRYPTOKI_NOT_INITIALIZED);
}
HANDLE2SESSION(hSession, sessp, rv);
if (rv != CKR_OK) {
return (rv);
}
rv = FUNCLIST(sessp->se_slotid)->C_DigestFinal(sessp->se_handle,
pDigest, pulDigestLen);
if (rv == CKR_FUNCTION_NOT_SUPPORTED) {
return (CKR_FUNCTION_FAILED);
}
return (rv);
}