@@ -239,6 +239,56 @@ fn sign_verify_eddsa_with_ed448_schemes() -> TestResult {
239239 Ok ( ( ) )
240240}
241241
242+ #[ test]
243+ #[ serial]
244+ fn sign_verify_single_part ( ) -> TestResult {
245+ let ( pkcs11, slot) = init_pins ( ) ;
246+
247+ // Open a session and log in
248+ let session = pkcs11. open_rw_session ( slot) ?;
249+ session. login ( UserType :: User , Some ( & AuthPin :: new ( USER_PIN . into ( ) ) ) ) ?;
250+
251+ // Define parameters for keypair
252+ let public_exponent = vec ! [ 0x01 , 0x00 , 0x01 ] ;
253+ let modulus_bits = 2048 ;
254+
255+ let pub_key_template = vec ! [
256+ Attribute :: Token ( true ) ,
257+ Attribute :: Private ( false ) ,
258+ Attribute :: PublicExponent ( public_exponent) ,
259+ Attribute :: ModulusBits ( modulus_bits. into( ) ) ,
260+ Attribute :: Verify ( true ) ,
261+ ] ;
262+ let priv_key_template = vec ! [ Attribute :: Token ( true ) , Attribute :: Sign ( true ) ] ;
263+
264+ // Generate keypair
265+ let ( pub_key, priv_key) = session. generate_key_pair (
266+ & Mechanism :: RsaPkcsKeyPairGen ,
267+ & pub_key_template,
268+ & priv_key_template,
269+ ) ?;
270+
271+ // Data to sign
272+ let data = [ 0xFF , 0x55 , 0xDD , 0x11 , 0xBB , 0x33 ] ;
273+
274+ // Sign data in a single part using separate init and single call
275+ session. sign_init ( & Mechanism :: Sha256RsaPkcs , priv_key) ?;
276+ let signature = session. sign_single ( & data) ?;
277+
278+ // Verify signature in a single part using separate init and single call
279+ session. verify_init ( & Mechanism :: Sha256RsaPkcs , pub_key) ?;
280+ session. verify_single ( & data, & signature) ?;
281+
282+ // Delete keys
283+ session. destroy_object ( pub_key) ?;
284+ session. destroy_object ( priv_key) ?;
285+
286+ session. close ( ) ?;
287+ pkcs11. finalize ( ) ?;
288+
289+ Ok ( ( ) )
290+ }
291+
242292#[ test]
243293#[ serial]
244294fn sign_verify_multipart ( ) -> TestResult {
@@ -480,6 +530,50 @@ fn encrypt_decrypt() -> TestResult {
480530 Ok ( ( ) )
481531}
482532
533+ #[ test]
534+ #[ serial]
535+ fn encrypt_decrypt_single_part ( ) -> TestResult {
536+ let ( pkcs11, slot) = init_pins ( ) ;
537+
538+ // Open a session and log in
539+ let session = pkcs11. open_rw_session ( slot) ?;
540+ session. login ( UserType :: User , Some ( & AuthPin :: new ( USER_PIN . into ( ) ) ) ) ?;
541+
542+ // Generate key
543+ let template = vec ! [
544+ Attribute :: Token ( true ) ,
545+ Attribute :: Private ( false ) ,
546+ Attribute :: ValueLen ( AES128_BLOCK_SIZE ) ,
547+ Attribute :: Encrypt ( true ) ,
548+ Attribute :: Decrypt ( true ) ,
549+ ] ;
550+ let key = session. generate_key ( & Mechanism :: AesKeyGen , & template) ?;
551+
552+ // Data to encrypt
553+ let data = vec ! [
554+ 0xFF , 0x55 , 0xDD , 0x11 , 0xBB , 0x33 , 0x99 , 0x77 , 0xFF , 0x55 , 0xDD , 0x11 , 0xBB , 0x33 , 0x99 ,
555+ 0x77 ,
556+ ] ;
557+
558+ // Encrypt data in a single part using separate init and single call
559+ session. encrypt_init ( & Mechanism :: AesEcb , key) ?;
560+ let encrypted_data = session. encrypt_single ( & data) ?;
561+
562+ // Decrypt data in a single part using separate init and single call
563+ session. decrypt_init ( & Mechanism :: AesEcb , key) ?;
564+ let decrypted_data = session. decrypt_single ( & encrypted_data) ?;
565+
566+ assert_eq ! ( data, decrypted_data) ;
567+
568+ // Delete key
569+ session. destroy_object ( key) ?;
570+
571+ session. close ( ) ?;
572+ pkcs11. finalize ( ) ?;
573+
574+ Ok ( ( ) )
575+ }
576+
483577#[ test]
484578#[ serial]
485579fn encrypt_decrypt_multipart ( ) -> TestResult {
@@ -2277,6 +2371,35 @@ fn sha256_digest() -> TestResult {
22772371 Ok ( ( ) )
22782372}
22792373
2374+ #[ test]
2375+ #[ serial]
2376+ fn sha256_digest_single_part ( ) -> TestResult {
2377+ let ( pkcs11, slot) = init_pins ( ) ;
2378+
2379+ // open a session
2380+ let session = pkcs11. open_rw_session ( slot) ?;
2381+
2382+ // log in the session
2383+ session. login ( UserType :: User , Some ( & AuthPin :: new ( USER_PIN . into ( ) ) ) ) ?;
2384+
2385+ // data to digest
2386+ let data = vec ! [ 0xAA , 0xBB , 0xCC , 0xDD , 0xEE , 0xFF ] ;
2387+
2388+ let want = [
2389+ 0x17 , 0x22 , 0x6b , 0x1f , 0x68 , 0xae , 0xba , 0xcd , 0xef , 0x07 , 0x46 , 0x45 , 0x0f , 0x64 , 0x28 ,
2390+ 0x74 , 0x63 , 0x8b , 0x29 , 0x57 , 0x07 , 0xef , 0x73 , 0xfb , 0x2c , 0x6b , 0xb7 , 0xf8 , 0x8e , 0x89 ,
2391+ 0x92 , 0x9f ,
2392+ ] ;
2393+ session. digest_init ( & Mechanism :: Sha256 ) ?;
2394+ let have = session. digest_single ( & data) ?;
2395+ assert_eq ! ( want[ ..] , have[ ..] ) ;
2396+
2397+ session. close ( ) ?;
2398+ pkcs11. finalize ( ) ?;
2399+
2400+ Ok ( ( ) )
2401+ }
2402+
22802403#[ test]
22812404#[ serial]
22822405fn sha256_digest_multipart ( ) -> TestResult {
0 commit comments