Hi,
Below are a few more minor patches:
1. x_slot_no_duplicate_enum.diff
- avoid re-examine of session object everytime a match is found
2. x_slot_mech.diff
- I think mechanism info shall include only flags that supported by
the token. In particular, the CKF_WRAP flag caused some previous
versions of Mozilla Suite failed on keygen as Mozilla try to
use the token to do a key wrapping that is unsupported.
3. x_session_free.diff
- simplified the code a bit.
4. x_object_write_key_attrib.diff
- token may interest in some properties introduced by the caller
of the pkcs11 module. The additional code gives chance to the token
to examine the key template attributes.
5. x_object_more_logAttr.diff
- added lookup of a few attributes used by Mozilla
6. crypt_datalen.diff
- I think error should be raised if datalen > keysize
Rgds.
Martin
--- cvs\muscleapps\PKCS11\src\p11_crypt.c 2005-01-23 00:11:35.000000000
+0800
+++ muscleapps\PKCS11\src\p11_crypt.c 2005-07-21 15:35:22.296875000 +0800
@@ -160,17 +160,17 @@
/* 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)
+ 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;
--- cvs\muscleapps\PKCS11\src\p11x_object.c 2005-05-24 15:13:21.000000000
+0800
+++ muscleapps\PKCS11\src\p11x_object.c 2005-07-20 17:03:30.453125000 +0800
@@ -1052,16 +1083,28 @@
log_Log(LOG_LOW, "CKA_NEVER_EXTRACTABLE:%s", buf);
break;
case CKA_ALWAYS_SENSITIVE:
log_Log(LOG_LOW, "CKA_CKA_ALWAYS_SENSITIVE:%s", buf);
break;
case CKA_SENSITIVE:
log_Log(LOG_LOW, "CKA_SENSITIVE:%s", buf);
break;
+ case CKA_ENCRYPT:
+ log_Log(LOG_LOW, "CKA_ENCRYPT:%s", buf);
+ break;
+ case CKA_WRAP:
+ log_Log(LOG_LOW, "CKA_WRAP:%s", buf);
+ break;
+ case CKA_VERIFY:
+ log_Log(LOG_LOW, "CKA_VERIFY:%s", buf);
+ break;
+ case CKA_MODULUS_BITS:
+ log_Log(LOG_LOW, "CKA_MODULUS_BITS:%s", buf);
+ break;
default:
log_Log(LOG_LOW, "CKA_UNKNOWN (0x%lX):%s", attrib->type, buf);
break;
}
}
free(buf);
}
--- cvs\muscleapps\PKCS11\src\p11x_object.c 2005-05-24 15:13:21.000000000
+0800
+++ muscleapps\PKCS11\src\p11x_object.c 2005-07-20 16:57:14.406250000 +0800
@@ -881,16 +885,43 @@
(void)CKR_ERROR(object_GetAttrib(CKA_MODULUS, objectPub, &p11_attrib));
(void)CKR_ERROR(object_AddAttribute(objectPrv,
p11_attrib->attrib.type,
TRUE, /* Fixme: Always a token
attribute? */
(CK_BYTE
*)p11_attrib->attrib.pValue,
p11_attrib->attrib.ulValueLen, 0));
+ /* add all attributes in templates to the key objects */
+ for (i=0; i < ulPrivateKeyAttributeCount; i++)
+ {
+ if (pPrivateKeyTemplate->type != CKA_DECRYPT &&
pPrivateKeyTemplate->type != CKA_SIGN)
+ (void)CKR_ERROR(object_AddAttribute(objectPrv,
+
pPrivateKeyTemplate->type,
+
TRUE,
+
pPrivateKeyTemplate->pValue,
+
pPrivateKeyTemplate->ulValueLen,0));
+ pPrivateKeyTemplate++;
+ }
+
+ for (i=0; i < ulPublicKeyAttributeCount; i++)
+ {
+ (void)CKR_ERROR(object_AddAttribute(objectPub,
+
pPublicKeyTemplate->type,
+
TRUE,
+
pPublicKeyTemplate->pValue,
+
pPublicKeyTemplate->ulValueLen,0));
+ pPublicKeyTemplate++;
+ }
+
+ /* write to token */
+ rv = object_WriteAttributes(hSession, objectPrv);
+ if (rv == CKR_OK)
+ rv = object_WriteAttributes(hSession, objectPub);
+
}
return rv;
}
/******************************************************************************
** Function: object_LogObjects
**
--- cvs\muscleapps\PKCS11\src\p11x_session.c 2003-10-04 16:30:18.000000000
+0800
+++ muscleapps\PKCS11\src\p11x_session.c 2005-07-21 09:58:26.203125000
+0800
@@ -138,37 +138,26 @@
}
prev->hnext = prev->hnext->hnext;
}
/*
* Take the session out of the session list
*/
- if (session->prev) /* Fixme: check for head of list? st.sessions */
- {
+ if (session->prev) /* not head, may be tail */
session->prev->next = session->next;
- if (session == st.sessions) /* Fixme: Is this needed? */
- st.sessions = session->prev;
- }
+ else /* head */
+ st.sessions = session->next;
- if (session->next)
- {
+ if (session->next) /* not tail */
session->next->prev = session->prev;
- if (session == st.sessions)
- st.sessions = session->next;
- }
-
- if (!session->prev && !session->next)
- st.sessions = 0x00;
-
if (session->search_attrib)
free(session->search_attrib);
-
/* Clear memory, just to be safe */
memset(session, 0x00, sizeof(P11_Session));
free(session);
return rv;
}
--- cvs\muscleapps\PKCS11\src\p11x_slot.c 2005-01-23 00:05:39.000000000
+0800
+++ muscleapps\PKCS11\src\p11x_slot.c 2005-07-21 15:00:16.625000000 +0800
@@ -417,26 +417,26 @@
if (crypto_alg & MSC_SUPPORT_RSA)
{
log_Log(LOG_LOW, "Card supports RSA");
slot_AddMechanism(slot, CKM_SHA1_RSA_PKCS, &mech);
mech->info.ulMinKeySize = slot_MinRSAKeySize(temp_cap);
mech->info.ulMaxKeySize = slot_MaxRSAKeySize(temp_cap);
/* Fixme: these flags may be wrong */
- mech->info.flags = CKF_ENCRYPT |
- CKF_DECRYPT |
- CKF_SIGN |
- CKF_SIGN_RECOVER |
- CKF_VERIFY |
- CKF_VERIFY_RECOVER |
- CKF_GENERATE |
- CKF_GENERATE_KEY_PAIR |
- CKF_WRAP |
- CKF_UNWRAP;
+ mech->info.flags = //CKF_ENCRYPT |
+ //CKF_DECRYPT |
+ CKF_SIGN;
+ // CKF_SIGN_RECOVER |
+ // CKF_VERIFY |
+ // CKF_VERIFY_RECOVER |
+ // CKF_GENERATE |
+ //CKF_GENERATE_KEY_PAIR |
+ // CKF_WRAP |
+ //CKF_UNWRAP;
if (!MSC_ERROR(msc_GetCapabilities(&slot->conn,
MSC_TAG_CAPABLE_RSA,
(MSCUChar8 *)&temp_cap, &len)))
{
if (temp_cap & MSC_CAPABLE_RSA_KEYGEN)
{
log_Log(LOG_LOW, "Card supports RSA key gen");
slot_AddMechanism(slot, CKM_RSA_PKCS_KEY_PAIR_GEN, &mech);
@@ -458,23 +458,24 @@
slot_AddMechanism(slot, CKM_RSA_PKCS, &mech);
mech->info.ulMinKeySize = slot_MinRSAKeySize(temp_cap);
mech->info.ulMaxKeySize = slot_MaxRSAKeySize(temp_cap);
/* Fixme: these flags may be wrong */
mech->info.flags = CKF_ENCRYPT |
CKF_DECRYPT |
- CKF_SIGN |
- CKF_SIGN_RECOVER |
- CKF_VERIFY |
- CKF_VERIFY_RECOVER;
+ CKF_SIGN;
+ //CKF_SIGN_RECOVER |
+ //CKF_VERIFY |
+ //CKF_VERIFY_RECOVER;
if (temp_cap & MSC_CAPABLE_RSA_NOPAD)
- mech->info.flags = CKF_WRAP |
CKF_UNWRAP;
+ mech->info.flags = //CKF_WRAP |
+
CKF_UNWRAP;
}
}
}
if (crypto_alg & MSC_SUPPORT_DSA)
{
log_Log(LOG_LOW, "Card supports DSA");
slot_AddMechanism(slot, CKM_DSA, &mech);
--- cvs\muscleapps\PKCS11\src\p11x_slot.c 2005-01-23 00:05:39.000000000
+0800
+++ muscleapps\PKCS11\src\p11x_slot.c 2005-07-21 15:22:59.078125000 +0800
@@ -864,35 +865,32 @@
**
** Returns:
** CKR_SLOT_ID_INVALID if slotID is invalid
** CKR_OK
*******************************************************************************/
CK_RV slot_DisconnectSlot(CK_ULONG slotID, CK_ULONG action)
{
CK_RV rv = CKR_OK;
- P11_Session *session_l;
+ P11_Session *session_l, *session_tmp;
P11_Slot *slot;
if (INVALID_SLOT)
rv = CKR_SLOT_ID_INVALID;
else
{
slot = &st.slots[slotID - 1];
session_l = st.sessions;
while (session_l)
{
- if (session_l->session.slotID == slotID)
- {
- session_FreeSession(session_l);
- session_l = st.sessions;
- }
- else
- session_l = session_l->next;
+ session_tmp = session_l;
+ session_l = session_l->next;
+ if (session_tmp->session.slotID == slotID)
+ session_FreeSession(session_tmp);
}
object_FreeAllObjects(slotID, st.slots[slotID - 1].objects);
slot_FreeAllMechanisms(slot->mechanisms);
slot->mechanisms = 0;
memset(slot->pins, 0x00, sizeof(slot->pins));
slot->pin_state = 0;
slot_BlankTokenInfo(&slot->token_info);
_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle