|
Lines 362-384
pkcs11_open_session(struct pkcs11_provider *p, CK_ULONG slotidx, char *pin)
Link Here
|
| 362 |
CK_RV rv; |
362 |
CK_RV rv; |
| 363 |
CK_FUNCTION_LIST *f; |
363 |
CK_FUNCTION_LIST *f; |
| 364 |
CK_SESSION_HANDLE session; |
364 |
CK_SESSION_HANDLE session; |
| 365 |
int login_required; |
365 |
int flags, login_required, have_pinpad; |
| 366 |
|
366 |
|
| 367 |
f = p->function_list; |
367 |
f = p->function_list; |
| 368 |
login_required = p->slotinfo[slotidx].token.flags & CKF_LOGIN_REQUIRED; |
368 |
flags = p->slotinfo[slotidx].token.flags; |
| 369 |
if (pin && login_required && !strlen(pin)) { |
369 |
have_pinpad = flags & CKF_PROTECTED_AUTHENTICATION_PATH; |
|
|
370 |
login_required = flags & CKF_LOGIN_REQUIRED; |
| 371 |
|
| 372 |
/* fail early before opening session */ |
| 373 |
if (login_required && !have_pinpad && pin && !strlen(pin)) { |
| 370 |
error("pin required"); |
374 |
error("pin required"); |
| 371 |
return (-1); |
375 |
return (-1); |
| 372 |
} |
376 |
} |
|
|
377 |
|
| 373 |
if ((rv = f->C_OpenSession(p->slotlist[slotidx], CKF_RW_SESSION| |
378 |
if ((rv = f->C_OpenSession(p->slotlist[slotidx], CKF_RW_SESSION| |
| 374 |
CKF_SERIAL_SESSION, NULL, NULL, &session)) |
379 |
CKF_SERIAL_SESSION, NULL, NULL, &session)) |
| 375 |
!= CKR_OK) { |
380 |
!= CKR_OK) { |
| 376 |
error("C_OpenSession failed: %lu", rv); |
381 |
error("C_OpenSession failed: %lu", rv); |
| 377 |
return (-1); |
382 |
return (-1); |
| 378 |
} |
383 |
} |
| 379 |
if (login_required && pin) { |
384 |
if (login_required) { |
| 380 |
rv = f->C_Login(session, CKU_USER, |
385 |
if (have_pinpad && (!pin || !strlen(pin))) { |
| 381 |
(u_char *)pin, strlen(pin)); |
386 |
/* defer PIN entry to the reader keypad */ |
|
|
387 |
rv = f->C_Login(session, CKU_USER, NULL_PTR, 0); |
| 388 |
} else { |
| 389 |
rv = f->C_Login(session, CKU_USER, |
| 390 |
(u_char *)pin, strlen(pin)); |
| 391 |
} |
| 382 |
if (rv != CKR_OK && rv != CKR_USER_ALREADY_LOGGED_IN) { |
392 |
if (rv != CKR_OK && rv != CKR_USER_ALREADY_LOGGED_IN) { |
| 383 |
error("C_Login failed: %lu", rv); |
393 |
error("C_Login failed: %lu", rv); |
| 384 |
if ((rv = f->C_CloseSession(session)) != CKR_OK) |
394 |
if ((rv = f->C_CloseSession(session)) != CKR_OK) |