Skip to content

Commit 6d2df93

Browse files
vkkoskieionut-arm
authored andcommitted
Replace SessionFlags with bool to open session
There are only two flags supported as arguments when opening a session. One of them must always be true, but perversely defaults to false. This forces client code to construct a trivial value to pass. This commit now hides this flag, setting it to its only valid value always. This also removes a single test which checked for failure when the flag was set to false. With only one flag (read/write) remaining, the open session call now accepts a boolean for the option and conversion to a wider integer type is handled internally. Signed-off-by: Keith Koskie <[email protected]>
1 parent ded651c commit 6d2df93

File tree

5 files changed

+26
-33
lines changed

5 files changed

+26
-33
lines changed

cryptoki/src/context/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub use locking::*;
2727

2828
use crate::error::{Error, Result, Rv};
2929
use crate::mechanism::{MechanismInfo, MechanismType};
30-
use crate::session::{Session, SessionFlags};
30+
use crate::session::Session;
3131
use crate::slot::{Slot, SlotInfo, TokenInfo};
3232

3333
use derivative::Derivative;
@@ -159,7 +159,7 @@ impl Pkcs11 {
159159
}
160160

161161
/// Open a new session with no callback set
162-
pub fn open_session_no_callback(&self, slot_id: Slot, flags: SessionFlags) -> Result<Session> {
163-
session_management::open_session_no_callback(self, slot_id, flags)
162+
pub fn open_session_no_callback(&self, slot_id: Slot, read_write: bool) -> Result<Session> {
163+
session_management::open_session_no_callback(self, slot_id, read_write)
164164
}
165165
}

cryptoki/src/context/session_management.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,31 @@
22
// SPDX-License-Identifier: Apache-2.0
33
//! Session management functions
44
5+
use cryptoki_sys::{CKF_RW_SESSION, CKF_SERIAL_SESSION};
6+
57
use crate::context::Pkcs11;
68
use crate::error::{Result, Rv};
7-
use crate::session::{Session, SessionFlags};
9+
use crate::session::Session;
810
use crate::slot::Slot;
911
use std::convert::TryInto;
10-
1112
// See public docs on stub in parent mod.rs
1213
#[inline(always)]
1314
pub(super) fn open_session_no_callback(
1415
ctx: &Pkcs11,
1516
slot_id: Slot,
16-
flags: SessionFlags,
17+
read_write: bool,
1718
) -> Result<Session> {
1819
let mut session_handle = 0;
1920

21+
let flags = if read_write {
22+
CKF_SERIAL_SESSION | CKF_RW_SESSION
23+
} else {
24+
CKF_SERIAL_SESSION
25+
};
2026
unsafe {
2127
Rv::from(get_pkcs11!(ctx, C_OpenSession)(
2228
slot_id.try_into()?,
23-
flags.into(),
29+
flags,
2430
// TODO: abstract those types or create new functions for callbacks
2531
std::ptr::null_mut(),
2632
None,

cryptoki/src/session/mod.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ impl Session {
151151
/// use cryptoki::context::CInitializeArgs;
152152
/// use cryptoki::object::AttributeType;
153153
/// use cryptoki::session::UserType;
154-
/// use cryptoki::session::SessionFlags;
155154
/// use std::collections::HashMap;
156155
/// use std::env;
157156
///
@@ -163,10 +162,8 @@ impl Session {
163162
///
164163
/// pkcs11.initialize(CInitializeArgs::OsThreads).unwrap();
165164
/// let slot = pkcs11.get_slots_with_token().unwrap().remove(0);
166-
/// let mut flags = SessionFlags::new();
167-
/// let _ = flags.set_rw_session(true).set_serial_session(true);
168165
///
169-
/// let session = pkcs11.open_session_no_callback(slot, flags).unwrap();
166+
/// let session = pkcs11.open_session_no_callback(slot, true).unwrap();
170167
/// session.login(UserType::User, Some("fedcba"));
171168
///
172169
/// let empty_attrib= vec![];

cryptoki/tests/basic.rs

+11-21
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn sign_verify() -> Result<()> {
3333
let _ = flags.set_rw_session(true).set_serial_session(true);
3434

3535
// open a session
36-
let session = pkcs11.open_session_no_callback(slot, flags)?;
36+
let session = pkcs11.open_session_no_callback(slot, true)?;
3737

3838
// log in the session
3939
session.login(UserType::User, Some(USER_PIN))?;
@@ -85,7 +85,7 @@ fn encrypt_decrypt() -> Result<()> {
8585
let _ = flags.set_rw_session(true).set_serial_session(true);
8686

8787
// open a session
88-
let session = pkcs11.open_session_no_callback(slot, flags)?;
88+
let session = pkcs11.open_session_no_callback(slot, true)?;
8989

9090
// log in the session
9191
session.login(UserType::User, Some(USER_PIN))?;
@@ -141,7 +141,7 @@ fn derive_key() -> Result<()> {
141141
let _ = flags.set_rw_session(true).set_serial_session(true);
142142

143143
// open a session
144-
let session = pkcs11.open_session_no_callback(slot, flags)?;
144+
let session = pkcs11.open_session_no_callback(slot, true)?;
145145

146146
// log in the session
147147
session.login(UserType::User, Some(USER_PIN))?;
@@ -236,7 +236,7 @@ fn import_export() -> Result<()> {
236236
let _ = flags.set_rw_session(true).set_serial_session(true);
237237

238238
// open a session
239-
let session = pkcs11.open_session_no_callback(slot, flags)?;
239+
let session = pkcs11.open_session_no_callback(slot, true)?;
240240

241241
// log in the session
242242
session.login(UserType::User, Some(USER_PIN))?;
@@ -306,7 +306,7 @@ fn wrap_and_unwrap_key() {
306306
let _ = flags.set_rw_session(true).set_serial_session(true);
307307

308308
// open a session
309-
let session = pkcs11.open_session_no_callback(slot, flags).unwrap();
309+
let session = pkcs11.open_session_no_callback(slot, true).unwrap();
310310

311311
// log in the session
312312
session.login(UserType::User, Some(USER_PIN)).unwrap();
@@ -400,7 +400,7 @@ fn login_feast() {
400400
for _ in 0..SESSIONS {
401401
let pkcs11 = pkcs11.clone();
402402
threads.push(thread::spawn(move || {
403-
let session = pkcs11.open_session_no_callback(slot, flags).unwrap();
403+
let session = pkcs11.open_session_no_callback(slot, true).unwrap();
404404
match session.login(UserType::User, Some(USER_PIN)) {
405405
Ok(_) | Err(Error::Pkcs11(RvError::UserAlreadyLoggedIn)) => {}
406406
Err(e) => panic!("Bad error response: {}", e),
@@ -463,19 +463,9 @@ fn get_session_info_test() -> Result<()> {
463463
let (pkcs11, slot) = init_pins();
464464

465465
let mut flags = SessionFlags::new();
466-
467-
// Check that OpenSession errors when CKF_SERIAL_SESSION is not set
468-
if let Err(cryptoki::error::Error::Pkcs11(rv_error)) =
469-
pkcs11.open_session_no_callback(slot, flags)
470-
{
471-
assert_eq!(rv_error, RvError::SessionParallelNotSupported);
472-
} else {
473-
panic!("Should error when CKF_SERIAL_SESSION is not set");
474-
}
475-
476466
let _ = flags.set_serial_session(true);
477467
{
478-
let session = pkcs11.open_session_no_callback(slot, flags)?;
468+
let session = pkcs11.open_session_no_callback(slot, false)?;
479469
let session_info = session.get_session_info()?;
480470
assert!(!session_info.read_write());
481471
assert_eq!(session_info.slot_id(), slot);
@@ -504,7 +494,7 @@ fn get_session_info_test() -> Result<()> {
504494

505495
let _ = flags.set_rw_session(true);
506496

507-
let session = pkcs11.open_session_no_callback(slot, flags)?;
497+
let session = pkcs11.open_session_no_callback(slot, true)?;
508498
let session_info = session.get_session_info()?;
509499
assert!(session_info.read_write());
510500
assert_eq!(session_info.slot_id(), slot);
@@ -539,7 +529,7 @@ fn generate_random_test() -> Result<()> {
539529
let mut flags = SessionFlags::new();
540530

541531
let _ = flags.set_serial_session(true);
542-
let session = pkcs11.open_session_no_callback(slot, flags)?;
532+
let session = pkcs11.open_session_no_callback(slot, false)?;
543533

544534
let poor_seed: [u8; 32] = [0; 32];
545535
session.seed_random(&poor_seed)?;
@@ -566,7 +556,7 @@ fn set_pin_test() -> Result<()> {
566556
let mut flags = SessionFlags::new();
567557

568558
let _ = flags.set_serial_session(true).set_rw_session(true);
569-
let session = pkcs11.open_session_no_callback(slot, flags)?;
559+
let session = pkcs11.open_session_no_callback(slot, true)?;
570560

571561
session.login(UserType::User, Some(USER_PIN))?;
572562
session.set_pin(USER_PIN, new_user_pin)?;
@@ -585,7 +575,7 @@ fn get_attribute_info_test() -> Result<()> {
585575
let _ = flags.set_rw_session(true).set_serial_session(true);
586576

587577
// open a session
588-
let session = pkcs11.open_session_no_callback(slot, flags)?;
578+
let session = pkcs11.open_session_no_callback(slot, true)?;
589579

590580
// log in the session
591581
session.login(UserType::User, Some(USER_PIN))?;

cryptoki/tests/common.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub fn init_pins() -> (Pkcs11, Slot) {
3232

3333
{
3434
// open a session
35-
let session = pkcs11.open_session_no_callback(slot, flags).unwrap();
35+
let session = pkcs11.open_session_no_callback(slot, true).unwrap();
3636
// log in the session
3737
session.login(UserType::So, Some(SO_PIN)).unwrap();
3838
session.init_pin(USER_PIN).unwrap();

0 commit comments

Comments
 (0)