@@ -4296,3 +4296,55 @@ fn validation() -> TestResult {
42964296
42974297 Ok ( ( ) )
42984298}
4299+
4300+ #[ test]
4301+ #[ serial]
4302+ fn object_handle_new_from_raw ( ) -> TestResult {
4303+ let ( pkcs11, slot) = init_pins ( ) ;
4304+
4305+ // open a session
4306+ let session = pkcs11. open_rw_session ( slot) ?;
4307+
4308+ // log in the session
4309+ session. login ( UserType :: User , Some ( & AuthPin :: new ( USER_PIN . into ( ) ) ) ) ?;
4310+
4311+ // get mechanism
4312+ let mechanism = Mechanism :: RsaPkcsKeyPairGen ;
4313+
4314+ let public_exponent: Vec < u8 > = vec ! [ 0x01 , 0x00 , 0x01 ] ;
4315+ let modulus_bits = 2048 ;
4316+
4317+ // pub key template
4318+ let pub_key_template = vec ! [
4319+ Attribute :: Token ( true ) ,
4320+ Attribute :: Private ( false ) ,
4321+ Attribute :: PublicExponent ( public_exponent) ,
4322+ Attribute :: ModulusBits ( modulus_bits. into( ) ) ,
4323+ Attribute :: Verify ( true ) ,
4324+ ] ;
4325+
4326+ // priv key template
4327+ let priv_key_template = vec ! [ Attribute :: Token ( true ) , Attribute :: Sign ( true ) ] ;
4328+
4329+ // generate a key pair
4330+ let ( public, private) =
4331+ session. generate_key_pair ( & mechanism, & pub_key_template, & priv_key_template) ?;
4332+
4333+ let private_cloned = unsafe { ObjectHandle :: new_from_raw ( private. handle ( ) ) } ;
4334+ let public_cloned = unsafe { ObjectHandle :: new_from_raw ( public. handle ( ) ) } ;
4335+
4336+ // data to sign
4337+ let data = [ 0xFF , 0x55 , 0xDD ] ;
4338+
4339+ // sign something with it
4340+ let signature = session. sign ( & Mechanism :: RsaPkcs , private_cloned, & data) ?;
4341+
4342+ // verify the signature
4343+ session. verify ( & Mechanism :: RsaPkcs , public_cloned, & data, & signature) ?;
4344+
4345+ // delete keys
4346+ session. destroy_object ( public) ?;
4347+ session. destroy_object ( private) ?;
4348+
4349+ Ok ( ( ) )
4350+ }
0 commit comments