We had this problem here, and solved making little changes in the attached files. You can just replace your by these and recompile the module

RABLAT Guillaume wrote:


Hello,

I'm using muscleframework-1.1.5 and tried to install libmusclepkcs11 on
Firefox on Linux (Mandriva2006), but it says "Unable to add module". The
same happens with Mozilla  1.7.5.

ldconfig seems to have load libmusclepkcs11 correctly:
# ldconfig -p|grep pkcs
libmusclepkcs11.so.0 (libc6) => /usr/local/lib/libmusclepkcs11.so.0
libmusclepkcs11.so (libc6) => /usr/local/lib/libmusclepkcs11.so

Even with a $HOME/.pkcs11rc file, no log appears in /tmp/PKCS11.log

I have done a strace on firefox-bin process, but I cannot see any clues.

Anyone have any suggestions how can I debug this ?



_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle
/******************************************************************************
** 
**  $Id: p11_crypt.c,v 1.10 2003/10/04 08:30:18 rousseau Exp $
**
**  Package: PKCS-11
**  Author : Chris Osgood <[EMAIL PROTECTED]>
**  License: Copyright (C) 2002 Schlumberger Network Solutions
**           <http://www.slb.com/sns>
**  Purpose: Encryption and decryption
** 
******************************************************************************/
#include <assert.h>
#include "cryptoki.h"

/* Removed by Netscape
#include <openssl/rsa.h>
*/

/**
 * Padding algorithm defined in RSA's PKCS #1.
 * to: pre-allocated buffer to receive the padded data
 * toLen: the length of the buffer. This should be the same as the size
 *      of the RSA modulus.  (toLen - 3) > fromLen.
 * from: data to be padded.
 * fromLen: size of data to be padded. fromLen < (toLen-3).
 * Returns: nonzero for success, zero for failure.
 */
int
padRSAType1(CK_BYTE* to, CK_ULONG toLen, CK_BYTE*from, CK_ULONG fromLen)
{
    int i = 0;
    int padLen = toLen - 3 - fromLen;

    assert( toLen > fromLen );
    assert( padLen >= 0 );
    if( toLen < fromLen || padLen < 0 ) {
        return 0;
    }

    /* First byte: 00 */
    to[i++] = 0x00;

    /* Second Byte: Block Type == 01 */
    to[i++] = 0x01;

    /* Padding String, each byte is 0xFF for block type 01 */
    memset(to+i, 0xFF, padLen);
    i += padLen;

    /* Separator byte: 00 */
    to[i++] = 0x00;

    /* Finally, the data */
    memcpy(to+i, from, fromLen);
    i += fromLen;

    assert( (CK_ULONG) i == toLen );

    return 1;
}


/* C_EncryptInit initializes an encryption operation. */
CK_DEFINE_FUNCTION(CK_RV, C_EncryptInit)
(
  CK_SESSION_HANDLE hSession,    /* the session's handle */
  CK_MECHANISM_PTR  pMechanism,  /* the encryption mechanism */
  CK_OBJECT_HANDLE  hKey         /* handle of encryption key */
)
{
    CK_RV rv = CKR_OK;
    P11_Session *session; /* = (P11_Session *)hSession; */

    P11_LOG_START("C_EncryptInit");

    thread_MutexLock(st.async_lock);

    /* Added by Netscape */
	session = session_LookupSession(hSession);
    if( session == NULL ) {
        rv = CKR_SESSION_HANDLE_INVALID;
        goto finish;
    }
    /* end */

    log_Log(LOG_LOW, "Encrypt mech: %X", *pMechanism);
    log_Log(LOG_LOW, "Encrypt key: %lX", hKey);

    if (CKR_ERROR(rv = slot_TokenChanged()))
        rv = CKR_SESSION_HANDLE_INVALID;
    else if (!pMechanism || !hKey)
        rv = CKR_ARGUMENTS_BAD;

/* removed by Netscape 
	else if (INVALID_SESSION)
        rv = CKR_SESSION_HANDLE_INVALID;
*/
	
	else if (!USER_MODE)
        rv = CKR_USER_NOT_LOGGED_IN;
    else if (pMechanism->mechanism != CKM_RSA_PKCS)
        rv = CKR_MECHANISM_INVALID;
    else
    {
        /* Fixme: need to verify that the card supports the mechanism and its parameters */
        /* Fixme: should probably add session.encrypt_mech and session.encrypt_key */
        session->sign_mech = *pMechanism;
        session->sign_key = hKey;
    }

finish:
    thread_MutexUnlock(st.async_lock);

    P11_LOG_END("C_EncryptInit");

    return rv;
}


/* C_Encrypt encrypts single-part data. */
CK_DEFINE_FUNCTION(CK_RV, C_Encrypt)
(
  CK_SESSION_HANDLE hSession,            /* session's handle */
  CK_BYTE_PTR       pData,               /* the plaintext data */
  CK_ULONG          ulDataLen,           /* bytes of plaintext */
  CK_BYTE_PTR       pEncryptedData,      /* gets ciphertext */
  CK_ULONG_PTR      pulEncryptedDataLen  /* gets c-text size */
)
{
    CK_RV rv = CKR_OK;
    P11_Session *session; // = (P11_Session *)hSession;
    P11_Object *key; // = (P11_Object *)session->sign_key;
    MSCCryptInit cryptInit;
    CK_BYTE *t_data1 = 0;
    CK_ULONG t_data1_len;

	P11_Slot *slot;
	CK_ULONG slotID;

    P11_LOG_START("C_Encrypt");

    thread_MutexLock(st.async_lock);

    session = session_LookupSession(hSession);
    if( session == NULL ) {
        rv = CKR_SESSION_HANDLE_INVALID;
        goto finish;
    }

    slotID = session->session.slotID;
    slot = &st.slots[slotID-1];

    key = (P11_Object *)session->sign_key;

    if (CKR_ERROR(rv = slot_TokenChanged()))
        rv = CKR_SESSION_HANDLE_INVALID;
    else if (!pEncryptedData || !pData)
        rv = CKR_ARGUMENTS_BAD;

/*    else if (INVALID_SESSION) 
        rv = CKR_SESSION_HANDLE_INVALID;
*/

    else if (!key)
        rv = CKR_OPERATION_NOT_INITIALIZED;
    else if (!USER_MODE)
        rv = CKR_USER_NOT_LOGGED_IN;
    else if ((CK_ULONG)(key->msc_key->keySize / 8) > ulDataLen)
        rv = CKR_ENCRYPTED_DATA_LEN_RANGE;
    else if (CKR_ERROR(rv = slot_BeginTransaction(session->session.slotID)))
        /* Intentionally blank */;
    else if (session->sign_mech.mechanism == CKM_RSA_PKCS)
    {
        /* Fixme: this is not fully implemented since it doesn't look at the mechanism parameter */

        cryptInit.keyNum = key->msc_key->keyNum;
        cryptInit.cipherMode = MSC_MODE_RSA_NOPAD;
        cryptInit.cipherDirection = MSC_DIR_SIGN;
        cryptInit.optParams = 0;
        cryptInit.optParamsSize = 0;

        log_Log(LOG_LOW, "Using key number: %d", cryptInit.keyNum);

        t_data1_len = key->msc_key->keySize / 8;
        t_data1 = (CK_BYTE *)malloc(t_data1_len);

        if (!t_data1)
            rv = CKR_HOST_MEMORY;
        else if (t_data1_len > *pulEncryptedDataLen)
            rv = CKR_BUFFER_TOO_SMALL;
/*
		else if (!RSA_padding_add_PKCS1_type_1(t_data1, t_data1_len, pData, ulDataLen))
*/

		else if (!padRSAType1(t_data1, t_data1_len, pData, ulDataLen))
		    rv = CKR_FUNCTION_FAILED;

/*
		else if (MSC_ERROR(msc_ComputeCrypt(&st.slots[session->session.slotID - 1].conn,
                                            &cryptInit,
                                            t_data1,
                                            t_data1_len,
                                            pEncryptedData,
                                            pulEncryptedDataLen)))
*/

		else if (MSC_ERROR(msc_ComputeCrypt(slot, slotID, &slot->conn,
                                            &cryptInit,
                                            t_data1,
                                            t_data1_len,
                                            pEncryptedData,
                                            pulEncryptedDataLen)))
        {
            P11_ERR("MSCComputeCrypt failed");
            rv = CKR_FUNCTION_FAILED;
        }

        if (t_data1)
            free(t_data1);

        (void)CKR_ERROR(slot_EndTransaction(session->session.slotID, MSC_LEAVE_TOKEN));
    }
    else
    {
        (void)CKR_ERROR(slot_EndTransaction(session->session.slotID, MSC_LEAVE_TOKEN));
        rv = CKR_MECHANISM_INVALID;
    }

    session->sign_key = 0;

finish:

    thread_MutexUnlock(st.async_lock);

    P11_LOG_END("C_Encrypt");

    return rv;
}


/* C_EncryptUpdate continues a multiple-part encryption
 * operation. */
CK_DEFINE_FUNCTION(CK_RV, C_EncryptUpdate)
(
  CK_SESSION_HANDLE hSession,           /* session's handle */
  CK_BYTE_PTR       pPart,              /* the plaintext data */
  CK_ULONG          ulPartLen,          /* plaintext data len */
  CK_BYTE_PTR       pEncryptedPart,     /* gets ciphertext */
  CK_ULONG_PTR      pulEncryptedPartLen /* gets c-text size */
)
{
    CK_RV rv = CKR_OK;

    P11_LOG_START("C_EncryptUpdate");

    thread_MutexLock(st.async_lock);

    rv = CKR_FUNCTION_NOT_SUPPORTED;
    log_Log(LOG_MED, "Function not supported");

    thread_MutexUnlock(st.async_lock);

    P11_LOG_END("C_EncryptUpdate");

    return rv;
}


/* C_EncryptFinal finishes a multiple-part encryption
 * operation. */
CK_DEFINE_FUNCTION(CK_RV, C_EncryptFinal)
(
  CK_SESSION_HANDLE hSession,                /* session handle */
  CK_BYTE_PTR       pLastEncryptedPart,      /* last c-text */
  CK_ULONG_PTR      pulLastEncryptedPartLen  /* gets last size */
)
{
    CK_RV rv = CKR_OK;

    P11_LOG_START("C_EncryptFinal");

    thread_MutexLock(st.async_lock);

    rv = CKR_FUNCTION_NOT_SUPPORTED;
    log_Log(LOG_MED, "Function not supported");

    thread_MutexUnlock(st.async_lock);

    P11_LOG_END("C_EncryptFinal");

    return rv;
}


/* C_DecryptInit initializes a decryption operation. */
CK_DEFINE_FUNCTION(CK_RV, C_DecryptInit)
(
  CK_SESSION_HANDLE hSession,    /* the session's handle */
  CK_MECHANISM_PTR  pMechanism,  /* the decryption mechanism */
  CK_OBJECT_HANDLE  hKey         /* handle of decryption key */
)
{
    CK_RV rv = CKR_OK;
    P11_Session *session; // = (P11_Session *)hSession;

    P11_LOG_START("C_DecryptInit");

    thread_MutexLock(st.async_lock);

    session = session_LookupSession(hSession);
    if( session == NULL ) {
        rv = CKR_SESSION_HANDLE_INVALID;
        goto finish;
    }

    log_Log(LOG_LOW, "Decrypt mech: %X", *pMechanism);
    log_Log(LOG_LOW, "Decrypt key: %lX", hKey);

    if (CKR_ERROR(rv = slot_TokenChanged()))
        rv = CKR_SESSION_HANDLE_INVALID;
    else if (!pMechanism || !hKey)
        rv = CKR_ARGUMENTS_BAD;
/*
	else if (INVALID_SESSION)
        rv = CKR_SESSION_HANDLE_INVALID;
*/

    else if (!USER_MODE)
        rv = CKR_USER_NOT_LOGGED_IN;
    else if (pMechanism->mechanism != CKM_RSA_PKCS)
        rv = CKR_MECHANISM_INVALID;
    else
    {
        /* Fixme: need to verify that the card supports the mechanism and its parameters */
        /* Fixme: should probably add session.decrypt_mech and session.decrypt_key */
        session->sign_mech = *pMechanism;
        session->sign_key = hKey;
    }

finish:
    thread_MutexUnlock(st.async_lock);

    P11_LOG_END("C_DecryptInit");

    return rv;
}


/* C_Decrypt decrypts encrypted data in a single part. */
CK_DEFINE_FUNCTION(CK_RV, C_Decrypt)
(
  CK_SESSION_HANDLE hSession,           /* session's handle */
  CK_BYTE_PTR       pEncryptedData,     /* ciphertext */
  CK_ULONG          ulEncryptedDataLen, /* ciphertext length */
  CK_BYTE_PTR       pData,              /* gets plaintext */
  CK_ULONG_PTR      pulDataLen          /* gets p-text size */
)
{
    CK_RV rv = CKR_OK;
    P11_Session *session; /* = (P11_Session *)hSession; */
    P11_Object *key; /* = (P11_Object *)session->sign_key; */
    MSCCryptInit cryptInit;
    CK_BYTE *t_data1 = 0, *t_data2 = 0;
    CK_ULONG t_data1_len, t_data2_len;

	P11_Slot *slot;
	CK_ULONG slotID;

    P11_LOG_START("C_Decrypt");

    thread_MutexLock(st.async_lock);

    session = session_LookupSession(hSession);
    if( session == NULL ) {
        rv = CKR_SESSION_HANDLE_INVALID;
        goto finish;
    }

    slotID = session->session.slotID;
    slot = &st.slots[slotID-1];

    key = (P11_Object *)session->sign_key;

    if (CKR_ERROR(rv = slot_TokenChanged()))
        rv = CKR_SESSION_HANDLE_INVALID;
    else if (!pEncryptedData || !pData)
        rv = CKR_ARGUMENTS_BAD;

/*
	else if (INVALID_SESSION)
        rv = CKR_SESSION_HANDLE_INVALID;
*/

	else if (!key)
        rv = CKR_OPERATION_NOT_INITIALIZED;
    else if (!USER_MODE)
        rv = CKR_USER_NOT_LOGGED_IN;
    else if ((CK_ULONG)(key->msc_key->keySize / 8) > ulEncryptedDataLen)
        rv = CKR_ENCRYPTED_DATA_LEN_RANGE;
    else if (CKR_ERROR(rv = slot_BeginTransaction(session->session.slotID)))
        /* Intentionally blank */;
    else if (session->sign_mech.mechanism == CKM_RSA_PKCS)
    {
        CK_ULONG  ulValue, lenValue;
        /* Fixme: this is not fully implemented since it doesn't look at the mechanism parameter */

/*
		if (MSC_ERROR(msc_GetCapabilities(&st.slots[session->session.slotID - 1].conn,
                        MSC_TAG_CAPABLE_RSA,
                        (CK_BYTE_PTR) &ulValue,
                        &lenValue)))
*/

		if (MSC_ERROR(msc_GetCapabilities(&slot->conn,
                        MSC_TAG_CAPABLE_RSA,
                        (CK_BYTE_PTR) &ulValue,
                        &lenValue)))

                 rv = CKR_FUNCTION_FAILED;
        else if (ulValue & MSC_CAPABLE_RSA_NOPAD) {
            log_Log(LOG_LOW, "Decrypt: RSA NOPAD; key %i; keysize %i",
                    key->msc_key->keyNum, key->msc_key->keySize);

        cryptInit.keyNum = key->msc_key->keyNum;
        cryptInit.cipherMode      = MSC_MODE_RSA_NOPAD;
        cryptInit.cipherDirection = MSC_DIR_DECRYPT;
        cryptInit.optParams       = 0;
        cryptInit.optParamsSize   = 0;

        t_data1 = (CK_BYTE *)malloc(key->msc_key->keySize / 8);
        t_data2 = (CK_BYTE *)malloc(key->msc_key->keySize / 8);
        t_data2_len = key->msc_key->keySize / 8; // PATCH

        if (!t_data1 || !t_data2)
            rv = CKR_HOST_MEMORY;
            else if (MSC_ERROR(msc_ComputeCrypt(
                            /* &st.slots[session->session.slotID - 1].conn, */
							           slot,
									   slotID,
									   &slot->conn,
                                       &cryptInit,
                                       pEncryptedData,
                                       ulEncryptedDataLen,
                                       t_data1,
                                       &t_data1_len)))
        {
            P11_ERR("MSCComputeCrypt failed");
            rv = CKR_FUNCTION_FAILED;
        }
            else if (CKR_ERROR(rv = util_StripPKCS1(t_data1, t_data1_len, 
                            t_data2, &t_data2_len)))
            /* Intentionally blank */;
        else if (t_data2_len > *pulDataLen)
            rv = CKR_BUFFER_TOO_SMALL;
        else
        {
            memcpy(pData, t_data2, t_data2_len);
            *pulDataLen = t_data2_len;
        }
        }
        else if (ulValue & MSC_CAPABLE_RSA_PKCS1)
        {
            log_Log(LOG_LOW, "Decrypt: RSA PKCS1; key %i; keysize %i",
                    key->msc_key->keyNum, key->msc_key->keySize);
            
            cryptInit.keyNum = key->msc_key->keyNum;
            cryptInit.cipherDirection = MSC_DIR_DECRYPT;
            cryptInit.cipherMode      = MSC_MODE_RSA_PAD_PKCS1;
            cryptInit.optParams       = 0;
            cryptInit.optParamsSize   = 0;

            t_data1 = (CK_BYTE *)malloc(key->msc_key->keySize / 8);

            if (!t_data1)
                rv = CKR_HOST_MEMORY;
            else if (MSC_ERROR(msc_ComputeCrypt(
                        /*    &st.slots[session->session.slotID - 1].conn, */
						    slot,
							slotID,
							&slot->conn,
                            &cryptInit,
                            pEncryptedData,
                            ulEncryptedDataLen,
                            t_data1,
                            &t_data1_len)))
            {
                P11_ERR("MSCComputeCrypt failed");
                rv = CKR_FUNCTION_FAILED;
            }
            if (t_data1_len > *pulDataLen)
                rv = CKR_BUFFER_TOO_SMALL;
            else {
                memcpy(pData, t_data1, t_data1_len);
                *pulDataLen = t_data1_len;
            }
        } else
            rv = CKR_MECHANISM_PARAM_INVALID;

        if (t_data1)
            free(t_data1);

        if (t_data2)
            free(t_data2);

        (void)CKR_ERROR(slot_EndTransaction(session->session.slotID, MSC_LEAVE_TOKEN));
    } else {
        (void)CKR_ERROR(slot_EndTransaction(session->session.slotID, MSC_LEAVE_TOKEN));
        rv = CKR_MECHANISM_INVALID;
    }

    session->sign_key = 0;

finish:
    thread_MutexUnlock(st.async_lock);

    P11_LOG_END("C_Decrypt");

    return rv;
}


/* C_DecryptUpdate continues a multiple-part decryption
 * operation. */
CK_DEFINE_FUNCTION(CK_RV, C_DecryptUpdate)
(
  CK_SESSION_HANDLE hSession,            /* session's handle */
  CK_BYTE_PTR       pEncryptedPart,      /* encrypted data */
  CK_ULONG          ulEncryptedPartLen,  /* input length */
  CK_BYTE_PTR       pPart,               /* gets plaintext */
  CK_ULONG_PTR      pulPartLen           /* p-text size */
)
{
    CK_RV rv = CKR_OK;

    P11_LOG_START("C_DecryptUpdate");

    thread_MutexLock(st.async_lock);

    rv = CKR_FUNCTION_NOT_SUPPORTED;
    log_Log(LOG_MED, "Function not supported");

    thread_MutexUnlock(st.async_lock);

    P11_LOG_END("C_DecryptUpdate");

    return rv;
}


/* C_DecryptFinal finishes a multiple-part decryption
 * operation. */
CK_DEFINE_FUNCTION(CK_RV, C_DecryptFinal)
(
  CK_SESSION_HANDLE hSession,       /* the session's handle */
  CK_BYTE_PTR       pLastPart,      /* gets plaintext */
  CK_ULONG_PTR      pulLastPartLen  /* p-text size */
)
{
    CK_RV rv = CKR_OK;

    P11_LOG_START("C_DecryptFinal");

    thread_MutexLock(st.async_lock);

    rv = CKR_FUNCTION_NOT_SUPPORTED;
    log_Log(LOG_MED, "Function not supported");

    thread_MutexUnlock(st.async_lock);

    P11_LOG_END("C_DecryptFinal");

    return rv;
}


/******************************************************************************
**
**  $Id: p11x_thread.c,v 1.8 2003/11/26 20:22:38 rousseau Exp $
**
**  Package: PKCS-11
**  Author : Chris Osgood
**  License: Copyright (C) 2002 Schlumberger Network Solutions
**           <http://www.slb.com/sns>
**  Purpose: Thread functions.  This should probably just use the Musclecard
**           framework functions instead (if in native mode).
**
******************************************************************************/

#include "cryptoki.h"

#include "thread_generic.h"

static int (*p11_pthread_mutex_init)(PCSCLITE_MUTEX_T mMutex) = 0;
static int (*p11_pthread_mutex_destroy)(PCSCLITE_MUTEX_T mMutex) = 0;
static int (*p11_pthread_mutex_lock)(PCSCLITE_MUTEX_T mMutex) = 0;
static int (*p11_pthread_mutex_unlock)(PCSCLITE_MUTEX_T mMutex) = 0;

static CK_CREATEMUTEX p11_createmutex = 0;
static CK_DESTROYMUTEX p11_destroymutex = 0;
static CK_LOCKMUTEX p11_lockmutex = 0;
static CK_UNLOCKMUTEX p11_unlockmutex = 0;

int SYS_MutexInit(PCSCLITE_MUTEX_T mMutex)
{
	return pthread_mutex_init(mMutex, NULL);
}

int SYS_MutexDestroy(PCSCLITE_MUTEX_T mMutex)
{
	return pthread_mutex_destroy(mMutex);
}

int SYS_MutexLock(PCSCLITE_MUTEX_T mMutex)
{
	return pthread_mutex_lock(mMutex);
}

int SYS_MutexUnLock(PCSCLITE_MUTEX_T mMutex)
{
	return pthread_mutex_unlock(mMutex);
}

/******************************************************************************
** Function: thread_Initialize
**
** Initializes the thread subsystem
**
** Parameters:
**  none
**
** Returns:
**  CKR_FUNCTION_FAILED on error
**  CKR_OK
*******************************************************************************/
CK_RV thread_Initialize()
{
    CK_RV rv = CKR_OK;

    if (st.prefs.threaded && st.native_locks)
    {
        p11_pthread_mutex_init    = SYS_MutexInit;
        p11_pthread_mutex_destroy = SYS_MutexDestroy;
        p11_pthread_mutex_lock    = SYS_MutexLock;
        p11_pthread_mutex_unlock  = SYS_MutexUnLock;
    }

    return rv;
}

/******************************************************************************
** Function: thread_InitFunctions
**
** Initializes the thread subsystem to use external locking mechanisms
**
** Parameters:
**  none
**
** Returns:
**  CKR_ARGUMENTS_BAD if any function is null
**  CKR_FUNCTION_FAILED on error
**  CKR_OK
*******************************************************************************/
CK_RV thread_InitFunctions(CK_CREATEMUTEX fn_createmutex,
                           CK_DESTROYMUTEX fn_destroymutex,
                           CK_LOCKMUTEX fn_lockmutex,
                           CK_UNLOCKMUTEX fn_unlockmutex)
{
    CK_RV rv = CKR_OK;

    if (!st.prefs.threaded)
        rv = CKR_FUNCTION_FAILED;
    else
    {
        if (!fn_createmutex || !fn_destroymutex || !fn_lockmutex || !fn_unlockmutex)
            rv = CKR_ARGUMENTS_BAD;
        else
        {
            log_Log(LOG_LOW, "Using application supplied locking functions");
            p11_createmutex = fn_createmutex;
            p11_destroymutex = fn_destroymutex;
            p11_lockmutex = fn_lockmutex;
            p11_unlockmutex = fn_unlockmutex;
        }
    }

    return rv;
}

/******************************************************************************
** Function: thread_Finalize
**
** Unloads the Pthread library
**
** Parameters:
**  none
**
** Returns:
**  CKR_FUNCTION_FAILED on general error
**  CKR_OK
*******************************************************************************/
CK_RV thread_Finalize()
{
    CK_RV rv = CKR_OK;

    if (st.prefs.threaded)
    {
        p11_pthread_mutex_init = 0;
        p11_pthread_mutex_destroy = 0;
        p11_pthread_mutex_lock = 0;
        p11_pthread_mutex_unlock = 0;
        p11_createmutex = 0;
        p11_destroymutex = 0;
        p11_lockmutex = 0;
        p11_unlockmutex = 0;
    }

    return rv;
}

/******************************************************************************
** Function: thread_MutexInit
**
** Initializes a mutex
**
** Parameters:
**  mutex - Pointer to mutex memory
**
** Returns:
**  CKR_HOST_MEMORY on memory alloc error
**  CKR_FUNCTION_FAILED on general error
**  CKR_OK
*******************************************************************************/
CK_RV thread_MutexInit(P11_Mutex *mutex)
{
    CK_RV rv = CKR_OK;

    if (st.prefs.threaded)
    {
        if (st.native_locks && mutex && p11_pthread_mutex_init)
        {
            *mutex = (P11_Mutex *)malloc(sizeof(PCSCLITE_MUTEX));

            if (!*mutex)
                rv = CKR_HOST_MEMORY;
            else
                p11_pthread_mutex_init((PCSCLITE_MUTEX_T)*mutex);
        }
        else if (!st.native_locks && mutex && p11_createmutex)
            p11_createmutex(mutex);
        else
            rv = CKR_FUNCTION_FAILED;
    }

    return rv;
}

/******************************************************************************
** Function: thread_MutexDestroy
**
** Destroys a mutex
**
** Parameters:
**  mutex - Pointer to mutex memory
**
** Returns:
**  CKR_FUNCTION_FAILED on general error
**  CKR_OK
*******************************************************************************/
CK_RV thread_MutexDestroy(P11_Mutex mutex)
{
    CK_RV rv = CKR_OK;

    if (st.prefs.threaded)
    {
        if (st.native_locks && mutex && p11_pthread_mutex_destroy)
        {
            p11_pthread_mutex_destroy((PCSCLITE_MUTEX_T)mutex);
            free(mutex);
        }
        else if (!st.native_locks && mutex && p11_destroymutex)
            p11_destroymutex(mutex);
        else
            rv = CKR_FUNCTION_FAILED;
    }

    return rv;
}

/******************************************************************************
** Function: thread_MutexLock
**
** Locks a mutex
**
** Parameters:
**  mutex - Pointer to mutex memory
**
** Returns:
**  CKR_FUNCTION_FAILED on general error
**  CKR_OK
*******************************************************************************/
CK_RV thread_MutexLock(P11_Mutex mutex)
{
    CK_RV rv = CKR_OK;

    if (st.prefs.threaded)
    {
        if (st.native_locks && mutex && p11_pthread_mutex_lock)
            p11_pthread_mutex_lock((PCSCLITE_MUTEX_T)mutex);
        else if (!st.native_locks && mutex && p11_lockmutex)
            p11_lockmutex(mutex);
        else
            rv = CKR_FUNCTION_FAILED;
    }

    return rv;
}

/******************************************************************************
** Function: thread_MutexUnlock
**
** Unlocks a mutex
**
** Parameters:
**  mutex - Pointer to mutex memory
**
** Returns:
**  CKR_FUNCTION_FAILED on general error
**  CKR_OK
*******************************************************************************/
CK_RV thread_MutexUnlock(P11_Mutex mutex)
{
    CK_RV rv = CKR_OK;

    if (st.prefs.threaded)
    {
        if (st.native_locks && mutex && p11_pthread_mutex_unlock)
            p11_pthread_mutex_unlock((PCSCLITE_MUTEX_T)mutex);
        else if (!st.native_locks && mutex && p11_unlockmutex)
            p11_unlockmutex(mutex);
        else
            rv = CKR_FUNCTION_FAILED;
    }

    return rv;
}


_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle

Reply via email to