/* * Enumerate all certs on the card */ int pkcs11_enumerate_certs(PKCS11_TOKEN *token, PKCS11_CERT **certp, unsigned int *countp) { PKCS11_SLOT *slot = TOKEN2SLOT(token); PKCS11_CTX *ctx = SLOT2CTX(slot); PKCS11_TOKEN_private *tpriv = PRIVTOKEN(token); PKCS11_SLOT_private *spriv = PRIVSLOT(slot); PKCS11_CTX_private *cpriv = PRIVCTX(ctx); int rv; if (tpriv->ncerts < 0) { /* Make sure we have a session */ if (!spriv->haveSession && PKCS11_open_session(slot, 0)) return -1; CRYPTO_THREAD_write_lock(cpriv->rwlock); rv = pkcs11_find_certs(token); CRYPTO_THREAD_unlock(cpriv->rwlock); if (rv < 0) { pkcs11_destroy_certs(token); return -1; } } if (certp) *certp = tpriv->certs; if (countp) *countp = tpriv->ncerts; return 0; }
static void pkcs11_destroy_token(PKCS11_TOKEN * token) { pkcs11_destroy_keys(token, CKO_PRIVATE_KEY); pkcs11_destroy_keys(token, CKO_PUBLIC_KEY); pkcs11_destroy_certs(token); OPENSSL_free(token->label); OPENSSL_free(token->manufacturer); OPENSSL_free(token->model); OPENSSL_free(token->serialnr); OPENSSL_free(token->_private); memset(token, 0, sizeof(*token)); }
/* * Enumerate all certs on the card */ int PKCS11_enumerate_certs(PKCS11_TOKEN * token, PKCS11_CERT ** certp, unsigned int *countp) { PKCS11_TOKEN_private *priv = PRIVTOKEN(token); if (priv->ncerts < 0) { priv->ncerts = 0; if (pkcs11_find_certs(token)) { pkcs11_destroy_certs(token); return -1; } } *certp = priv->certs; *countp = priv->ncerts; return 0; }