|
Lines 366-384
pkcs11_open_session(struct pkcs11_provider *p, CK_ULONG slotidx, char *pin)
Link Here
|
| 366 |
|
366 |
|
| 367 |
f = p->function_list; |
367 |
f = p->function_list; |
| 368 |
login_required = p->slotinfo[slotidx].token.flags & CKF_LOGIN_REQUIRED; |
368 |
login_required = p->slotinfo[slotidx].token.flags & CKF_LOGIN_REQUIRED; |
| 369 |
if (pin && login_required && !strlen(pin)) { |
369 |
|
| 370 |
error("pin required"); |
|
|
| 371 |
return (-1); |
| 372 |
} |
| 373 |
if ((rv = f->C_OpenSession(p->slotlist[slotidx], CKF_RW_SESSION| |
370 |
if ((rv = f->C_OpenSession(p->slotlist[slotidx], CKF_RW_SESSION| |
| 374 |
CKF_SERIAL_SESSION, NULL, NULL, &session)) |
371 |
CKF_SERIAL_SESSION, NULL, NULL, &session)) |
| 375 |
!= CKR_OK) { |
372 |
!= CKR_OK) { |
| 376 |
error("C_OpenSession failed: %lu", rv); |
373 |
error("C_OpenSession failed: %lu", rv); |
| 377 |
return (-1); |
374 |
return (-1); |
| 378 |
} |
375 |
} |
| 379 |
if (login_required && pin) { |
376 |
if (login_required) { |
| 380 |
rv = f->C_Login(session, CKU_USER, |
377 |
rv = f->C_Login(session, CKU_USER, |
| 381 |
(u_char *)pin, strlen(pin)); |
378 |
(u_char *)pin, (pin != NULL) ? strlen(pin) : 0); |
| 382 |
if (rv != CKR_OK && rv != CKR_USER_ALREADY_LOGGED_IN) { |
379 |
if (rv != CKR_OK && rv != CKR_USER_ALREADY_LOGGED_IN) { |
| 383 |
error("C_Login failed: %lu", rv); |
380 |
error("C_Login failed: %lu", rv); |
| 384 |
if ((rv = f->C_CloseSession(session)) != CKR_OK) |
381 |
if ((rv = f->C_CloseSession(session)) != CKR_OK) |