/* XXX */ static nssSession * nssTrustDomain_GetSessionForToken ( NSSTrustDomain *td, NSSToken *token ) { return nssToken_GetDefaultSession(token); }
NSS_IMPLEMENT PRStatus nssCryptokiPrivateKey_SetCertificate ( nssCryptokiObject *keyObject, nssSession *sessionOpt, const NSSUTF8 *nickname, NSSItem *id, NSSDER *subject ) { CK_RV ckrv; CK_ATTRIBUTE_PTR attr; CK_ATTRIBUTE key_template[3]; CK_ULONG key_size; void *epv = nssToken_GetCryptokiEPV(keyObject->token); nssSession *session; NSSToken *token = keyObject->token; nssSession *defaultSession = nssToken_GetDefaultSession(token); PRBool createdSession = PR_FALSE; NSS_CK_TEMPLATE_START(key_template, attr, key_size); NSS_CK_SET_ATTRIBUTE_UTF8(attr, CKA_LABEL, nickname); NSS_CK_SET_ATTRIBUTE_ITEM(attr, CKA_ID, id); NSS_CK_SET_ATTRIBUTE_ITEM(attr, CKA_SUBJECT, subject); NSS_CK_TEMPLATE_FINISH(key_template, attr, key_size); if (sessionOpt) { if (!nssSession_IsReadWrite(sessionOpt)) { return PR_FAILURE; } session = sessionOpt; } else if (defaultSession && nssSession_IsReadWrite(defaultSession)) { session = defaultSession; } else { NSSSlot *slot = nssToken_GetSlot(token); session = nssSlot_CreateSession(token->slot, NULL, PR_TRUE); nssSlot_Destroy(slot); if (!session) { return PR_FAILURE; } createdSession = PR_TRUE; } ckrv = CKAPI(epv)->C_SetAttributeValue(session->handle, keyObject->handle, key_template, key_size); if (createdSession) { nssSession_Destroy(session); } return (ckrv == CKR_OK) ? PR_SUCCESS : PR_FAILURE; }
NSS_IMPLEMENT PRStatus nssCryptokiCRL_GetAttributes( nssCryptokiObject *crlObject, nssSession *sessionOpt, NSSArena *arenaOpt, NSSItem *encodingOpt, NSSItem *subjectOpt, CK_ULONG *crl_class, NSSUTF8 **urlOpt, PRBool *isKRLOpt) { PRStatus status; NSSSlot *slot; nssSession *session; CK_ATTRIBUTE_PTR attr; CK_ATTRIBUTE crl_template[7]; CK_ULONG crl_size; PRUint32 i; NSS_CK_TEMPLATE_START(crl_template, attr, crl_size); if (crl_class) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_CLASS); } if (encodingOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_VALUE); } if (urlOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_NSS_URL); } if (isKRLOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_NSS_KRL); } if (subjectOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_SUBJECT); } NSS_CK_TEMPLATE_FINISH(crl_template, attr, crl_size); status = nssToken_GetCachedObjectAttributes(crlObject->token, NULL, crlObject, CKO_NSS_CRL, crl_template, crl_size); if (status != PR_SUCCESS) { session = sessionOpt ? sessionOpt : nssToken_GetDefaultSession(crlObject->token); if (session == NULL) { nss_SetError(NSS_ERROR_INVALID_ARGUMENT); return PR_FAILURE; } slot = nssToken_GetSlot(crlObject->token); status = nssCKObject_GetAttributes(crlObject->handle, crl_template, crl_size, arenaOpt, session, slot); nssSlot_Destroy(slot); if (status != PR_SUCCESS) { return status; } } i = 0; if (crl_class) { NSS_CK_ATTRIBUTE_TO_ULONG(&crl_template[i], *crl_class); i++; } if (encodingOpt) { NSS_CK_ATTRIBUTE_TO_ITEM(&crl_template[i], encodingOpt); i++; } if (urlOpt) { NSS_CK_ATTRIBUTE_TO_UTF8(&crl_template[i], *urlOpt); i++; } if (isKRLOpt) { NSS_CK_ATTRIBUTE_TO_BOOL(&crl_template[i], *isKRLOpt); i++; } if (subjectOpt) { NSS_CK_ATTRIBUTE_TO_ITEM(&crl_template[i], subjectOpt); i++; } return PR_SUCCESS; }
NSS_IMPLEMENT PRStatus nssCryptokiTrust_GetAttributes( nssCryptokiObject *trustObject, nssSession *sessionOpt, NSSItem *sha1_hash, nssTrustLevel *serverAuth, nssTrustLevel *clientAuth, nssTrustLevel *codeSigning, nssTrustLevel *emailProtection, PRBool *stepUpApproved) { PRStatus status; NSSSlot *slot; nssSession *session; CK_BBOOL isToken = PR_FALSE; CK_BBOOL stepUp = PR_FALSE; CK_TRUST saTrust = CKT_NSS_TRUST_UNKNOWN; CK_TRUST caTrust = CKT_NSS_TRUST_UNKNOWN; CK_TRUST epTrust = CKT_NSS_TRUST_UNKNOWN; CK_TRUST csTrust = CKT_NSS_TRUST_UNKNOWN; CK_ATTRIBUTE_PTR attr; CK_ATTRIBUTE trust_template[7]; CK_ATTRIBUTE_PTR sha1_hash_attr; CK_ULONG trust_size; /* Use the trust object to find the trust settings */ NSS_CK_TEMPLATE_START(trust_template, attr, trust_size); NSS_CK_SET_ATTRIBUTE_VAR(attr, CKA_TOKEN, isToken); NSS_CK_SET_ATTRIBUTE_VAR(attr, CKA_TRUST_SERVER_AUTH, saTrust); NSS_CK_SET_ATTRIBUTE_VAR(attr, CKA_TRUST_CLIENT_AUTH, caTrust); NSS_CK_SET_ATTRIBUTE_VAR(attr, CKA_TRUST_EMAIL_PROTECTION, epTrust); NSS_CK_SET_ATTRIBUTE_VAR(attr, CKA_TRUST_CODE_SIGNING, csTrust); NSS_CK_SET_ATTRIBUTE_VAR(attr, CKA_TRUST_STEP_UP_APPROVED, stepUp); sha1_hash_attr = attr; NSS_CK_SET_ATTRIBUTE_ITEM(attr, CKA_CERT_SHA1_HASH, sha1_hash); NSS_CK_TEMPLATE_FINISH(trust_template, attr, trust_size); status = nssToken_GetCachedObjectAttributes(trustObject->token, NULL, trustObject, CKO_NSS_TRUST, trust_template, trust_size); if (status != PR_SUCCESS) { session = sessionOpt ? sessionOpt : nssToken_GetDefaultSession(trustObject->token); if (!session) { nss_SetError(NSS_ERROR_INVALID_ARGUMENT); return PR_FAILURE; } slot = nssToken_GetSlot(trustObject->token); status = nssCKObject_GetAttributes(trustObject->handle, trust_template, trust_size, NULL, session, slot); nssSlot_Destroy(slot); if (status != PR_SUCCESS) { return status; } } if (sha1_hash_attr->ulValueLen == -1) { /* The trust object does not have the CKA_CERT_SHA1_HASH attribute. */ sha1_hash_attr->ulValueLen = 0; } sha1_hash->size = sha1_hash_attr->ulValueLen; *serverAuth = get_nss_trust(saTrust); *clientAuth = get_nss_trust(caTrust); *emailProtection = get_nss_trust(epTrust); *codeSigning = get_nss_trust(csTrust); *stepUpApproved = stepUp; return PR_SUCCESS; }
/* incoming pointers must be valid */ NSS_IMPLEMENT PRStatus nssCryptokiCertificate_GetAttributes( nssCryptokiObject *certObject, nssSession *sessionOpt, NSSArena *arenaOpt, NSSCertificateType *certTypeOpt, NSSItem *idOpt, NSSDER *encodingOpt, NSSDER *issuerOpt, NSSDER *serialOpt, NSSDER *subjectOpt) { PRStatus status; PRUint32 i; nssSession *session; NSSSlot *slot; CK_ULONG template_size; CK_ATTRIBUTE_PTR attr; CK_ATTRIBUTE cert_template[6]; /* Set up a template of all options chosen by caller */ NSS_CK_TEMPLATE_START(cert_template, attr, template_size); if (certTypeOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_CERTIFICATE_TYPE); } if (idOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_ID); } if (encodingOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_VALUE); } if (issuerOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_ISSUER); } if (serialOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_SERIAL_NUMBER); } if (subjectOpt) { NSS_CK_SET_ATTRIBUTE_NULL(attr, CKA_SUBJECT); } NSS_CK_TEMPLATE_FINISH(cert_template, attr, template_size); if (template_size == 0) { /* caller didn't want anything */ return PR_SUCCESS; } status = nssToken_GetCachedObjectAttributes(certObject->token, arenaOpt, certObject, CKO_CERTIFICATE, cert_template, template_size); if (status != PR_SUCCESS) { session = sessionOpt ? sessionOpt : nssToken_GetDefaultSession(certObject->token); if (!session) { nss_SetError(NSS_ERROR_INVALID_ARGUMENT); return PR_FAILURE; } slot = nssToken_GetSlot(certObject->token); status = nssCKObject_GetAttributes(certObject->handle, cert_template, template_size, arenaOpt, session, slot); nssSlot_Destroy(slot); if (status != PR_SUCCESS) { return status; } } i = 0; if (certTypeOpt) { *certTypeOpt = nss_cert_type_from_ck_attrib(&cert_template[i]); i++; } if (idOpt) { NSS_CK_ATTRIBUTE_TO_ITEM(&cert_template[i], idOpt); i++; } if (encodingOpt) { NSS_CK_ATTRIBUTE_TO_ITEM(&cert_template[i], encodingOpt); i++; } if (issuerOpt) { NSS_CK_ATTRIBUTE_TO_ITEM(&cert_template[i], issuerOpt); i++; } if (serialOpt) { NSS_CK_ATTRIBUTE_TO_ITEM(&cert_template[i], serialOpt); i++; } if (subjectOpt) { NSS_CK_ATTRIBUTE_TO_ITEM(&cert_template[i], subjectOpt); i++; } return PR_SUCCESS; }
NSS_IMPLEMENT PRBool nssSlot_IsTokenPresent ( NSSSlot *slot ) { CK_RV ckrv; PRStatus nssrv; /* XXX */ nssSession *session; CK_SLOT_INFO slotInfo; void *epv; /* permanent slots are always present unless they're disabled */ if (nssSlot_IsPermanent(slot)) { return !PK11_IsDisabled(slot->pk11slot); } /* avoid repeated calls to check token status within set interval */ if (within_token_delay_period(slot)) { return ((slot->ckFlags & CKF_TOKEN_PRESENT) != 0); } /* First obtain the slot info */ epv = slot->epv; if (!epv) { return PR_FALSE; } nssSlot_EnterMonitor(slot); ckrv = CKAPI(epv)->C_GetSlotInfo(slot->slotID, &slotInfo); nssSlot_ExitMonitor(slot); if (ckrv != CKR_OK) { slot->token->base.name[0] = 0; /* XXX */ return PR_FALSE; } slot->ckFlags = slotInfo.flags; /* check for the presence of the token */ if ((slot->ckFlags & CKF_TOKEN_PRESENT) == 0) { if (!slot->token) { /* token was never present */ return PR_FALSE; } session = nssToken_GetDefaultSession(slot->token); if (session) { nssSession_EnterMonitor(session); /* token is not present */ if (session->handle != CK_INVALID_SESSION) { /* session is valid, close and invalidate it */ CKAPI(epv)->C_CloseSession(session->handle); session->handle = CK_INVALID_SESSION; } nssSession_ExitMonitor(session); } if (slot->token->base.name[0] != 0) { /* notify the high-level cache that the token is removed */ slot->token->base.name[0] = 0; /* XXX */ nssToken_NotifyCertsNotVisible(slot->token); } slot->token->base.name[0] = 0; /* XXX */ /* clear the token cache */ nssToken_Remove(slot->token); return PR_FALSE; } /* token is present, use the session info to determine if the card * has been removed and reinserted. */ session = nssToken_GetDefaultSession(slot->token); if (session) { PRBool isPresent = PR_FALSE; nssSession_EnterMonitor(session); if (session->handle != CK_INVALID_SESSION) { CK_SESSION_INFO sessionInfo; ckrv = CKAPI(epv)->C_GetSessionInfo(session->handle, &sessionInfo); if (ckrv != CKR_OK) { /* session is screwy, close and invalidate it */ CKAPI(epv)->C_CloseSession(session->handle); session->handle = CK_INVALID_SESSION; } } isPresent = session->handle != CK_INVALID_SESSION; nssSession_ExitMonitor(session); /* token not removed, finished */ if (isPresent) return PR_TRUE; } /* the token has been removed, and reinserted, or the slot contains * a token it doesn't recognize. invalidate all the old * information we had on this token, if we can't refresh, clear * the present flag */ nssToken_NotifyCertsNotVisible(slot->token); nssToken_Remove(slot->token); /* token has been removed, need to refresh with new session */ nssrv = nssSlot_Refresh(slot); if (nssrv != PR_SUCCESS) { slot->token->base.name[0] = 0; /* XXX */ slot->ckFlags &= ~CKF_TOKEN_PRESENT; return PR_FALSE; } return PR_TRUE; }