if (flags & SESSION_LOGIN) {
ret =
pkcs11_login(sinfo, pin_info, info,
- (flags & SESSION_SO) ? 1 : 0);
+ (flags & SESSION_SO) ? 1 : 0, 0);
if (ret < 0) {
gnutls_assert();
pkcs11_close_session(sinfo);
if (flags & SESSION_LOGIN) {
ret =
pkcs11_login(&sinfo, pin_info,
- info, (flags & SESSION_SO) ? 1 : 0);
+ info, (flags & SESSION_SO) ? 1 : 0,
+ 0);
if (ret < 0) {
gnutls_assert();
return ret;
pkcs11_login(struct pkcs11_session_info *sinfo,
struct pin_info_st *pin_info,
struct p11_kit_uri *info,
- int so)
+ unsigned so,
+ unsigned force)
{
struct ck_session_info session_info;
int attempt = 0, ret;
/* Check whether the session is already logged in, and if so, just skip */
rv = (sinfo->module)->C_GetSessionInfo(sinfo->pks,
&session_info);
- if (rv == CKR_OK
- && (session_info.state == CKS_RO_USER_FUNCTIONS
+ if (rv == CKR_OK && force == 0 &&
+ (session_info.state == CKS_RO_USER_FUNCTIONS
|| session_info.state == CKS_RW_USER_FUNCTIONS)) {
ret = 0;
goto cleanup;
size_t * output_size);
int pkcs11_login(struct pkcs11_session_info *sinfo,
struct pin_info_st *pin_info,
- struct p11_kit_uri *info, int so);
+ struct p11_kit_uri *info, unsigned so,
+ unsigned force);
int pkcs11_call_token_func(struct p11_kit_uri *info, const unsigned retry);
if (key->reauth) {
ret =
pkcs11_login(&key->sinfo, &key->pin,
- key->uinfo, 0);
+ key->uinfo, 0, 1);
if (ret < 0) {
gnutls_assert();
_gnutls_debug_log("PKCS #11 login failed, trying operation anyway\n");
if (key->reauth) {
ret =
pkcs11_login(&key->sinfo, &key->pin,
- key->uinfo, 0);
+ key->uinfo, 0, 1);
if (ret < 0) {
gnutls_assert();
_gnutls_debug_log("PKCS #11 login failed, trying operation anyway\n");