22// SPDX-License-Identifier: Apache-2.0 
33
44use  e2e_tests:: * ; 
5+ use  openssl:: md:: Md ; 
6+ use  openssl:: md_ctx:: MdCtx ; 
7+ use  openssl:: pkey:: Private ; 
58use  parsec_client:: core:: basic_client:: BasicClient ; 
69use  parsec_client:: core:: interface:: operations:: psa_algorithm:: { AsymmetricSignature ,  Hash } ; 
10+ use  parsec_client:: core:: interface:: operations:: { 
11+     psa_hash_compare,  psa_hash_compute,  psa_sign_hash, 
12+ } ; 
713use  parsec_openssl_provider:: parsec_openssl2:: ossl_param; 
814use  parsec_openssl_provider:: parsec_openssl2:: { openssl_returns_1,  Openssl2Error } ; 
15+ use  parsec_openssl_provider:: signature:: EccSignature ; 
916use  parsec_openssl_provider:: { 
1017    PARSEC_PROVIDER_DFLT_PROPERTIES ,  PARSEC_PROVIDER_ECDSA_NAME ,  PARSEC_PROVIDER_KEY_NAME , 
1118    PARSEC_PROVIDER_RSA_NAME , 
@@ -21,10 +28,6 @@ fn sign_verify(
2128    sign_algorithm :  AsymmetricSignature , 
2229    key_type :  & [ u8 ] , 
2330)  -> Result < ( ) ,  Openssl2Error >  { 
24-     // These are a backup to be used with different modalities of EVP_PKEY_sign 
25-     let  mut  other_signature:  Vec < u8 >  = vec ! [ 0 ;  signature. len( ) ] ; 
26-     let  mut  other_len = signature. len ( ) ; 
27- 
2831    let  provider_path = String :: from ( "../../target/debug/" ) ; 
2932    let  provider_name = String :: from ( "libparsec_openssl_provider_shared" ) ; 
3033
@@ -33,10 +36,7 @@ fn sign_verify(
3336
3437    let  mut  param = ossl_param ! ( PARSEC_PROVIDER_KEY_NAME ,  OSSL_PARAM_UTF8_PTR ,  key_name) ; 
3538
36-     let  mut  hasher = Sha256 :: new ( ) ; 
37-     hasher. update ( b"Parsec OpenSSL Provider" ) ; 
38-     let  hash = hasher. finalize ( ) ; 
39- 
39+     let  test_string:  & [ u8 ;  23 ]  = b"Parsec OpenSSL Provider" ; 
4040    unsafe  { 
4141        let  mut  parsec_pkey:  * mut  EVP_PKEY  = std:: ptr:: null_mut ( ) ; 
4242        load_key ( & lib_ctx,  & mut  param,  & mut  parsec_pkey,  key_type) ; 
@@ -47,55 +47,38 @@ fn sign_verify(
4747            PARSEC_PROVIDER_DFLT_PROPERTIES . as_ptr ( )  as  * const  :: std:: os:: raw:: c_char , 
4848        ) ; 
4949
50-         let  mut  sign_len = 0 ; 
51- 
52-         // Initialize and perform signing operation using EVP interfaces 
53-         openssl_returns_1 ( EVP_PKEY_sign_init ( evp_ctx) ) . unwrap ( ) ; 
54- 
55-         openssl_returns_1 ( EVP_PKEY_sign ( 
56-             evp_ctx, 
57-             std:: ptr:: null_mut ( ) , 
58-             & mut  sign_len, 
59-             hash. as_ptr ( ) , 
60-             hash. len ( ) , 
61-         ) ) 
62-         . unwrap ( ) ; 
63-         assert_eq ! ( sign_len,  signature. len( ) ) ; 
64- 
65-         openssl_returns_1 ( EVP_PKEY_sign ( 
66-             evp_ctx, 
67-             signature. as_mut_ptr ( ) , 
68-             & mut  sign_len, 
69-             hash. as_ptr ( ) , 
70-             hash. len ( ) , 
71-         ) ) 
72-         . unwrap ( ) ; 
73- 
74-         openssl_returns_1 ( EVP_PKEY_sign ( 
75-             evp_ctx, 
76-             other_signature. as_mut_ptr ( ) , 
77-             & mut  other_len, 
78-             hash. as_ptr ( ) , 
79-             hash. len ( ) , 
80-         ) ) 
81-         . unwrap ( ) ; 
50+         let  mut  mdctx = MdCtx :: new ( ) . unwrap ( ) ; 
51+         let  md = Md :: fetch ( None ,  "SHA256" ,  None ) . unwrap ( ) ; 
52+         let  pkey:  openssl:: pkey:: PKey < Private >  = openssl:: pkey:: PKey :: from_ptr ( parsec_pkey as  _ ) ; 
53+         mdctx. digest_sign_init ( Some ( & md) ,  & pkey) . unwrap ( ) ; 
54+ 
55+         mdctx. digest_sign ( test_string,  Some ( signature) ) . unwrap ( ) ; 
8256
8357        EVP_PKEY_free ( parsec_pkey) ; 
8458    } 
8559
8660    let  client = BasicClient :: new ( Some ( String :: from ( "parsec-tool" ) ) ) . unwrap ( ) ; 
8761
88-     client
89-         . psa_verify_hash ( key_name,  & hash,  sign_algorithm,  signature) 
90-         . unwrap ( ) ; 
91-     client
92-         . psa_verify_hash ( 
93-             key_name, 
94-             & hash, 
95-             sign_algorithm, 
96-             other_signature. as_mut_slice ( ) , 
97-         ) 
98-         . unwrap ( ) ; 
62+     let  hash = client. psa_hash_compute ( Hash :: Sha256 ,  test_string) . unwrap ( ) ; 
63+ 
64+     if  sign_algorithm. is_ecc_alg ( )  { 
65+         let  deserialized:  EccSignature  = picky_asn1_der:: from_bytes ( signature) . unwrap ( ) ; 
66+         let  mut  sign_res_a = deserialized. r . as_unsigned_bytes_be ( ) . to_vec ( ) ; 
67+         let  sign_res_b = deserialized. s . as_unsigned_bytes_be ( ) . to_vec ( ) ; 
68+         sign_res_a. extend ( sign_res_b) ; 
69+         client
70+             . psa_verify_hash ( 
71+                 key_name, 
72+                 hash. as_slice ( ) , 
73+                 sign_algorithm, 
74+                 sign_res_a. as_slice ( ) , 
75+             ) 
76+             . unwrap ( ) ; 
77+     }  else  { 
78+         client
79+             . psa_verify_hash ( key_name,  hash. as_slice ( ) ,  sign_algorithm,  signature) 
80+             . unwrap ( ) ; 
81+     } 
9982    Ok ( ( ) ) 
10083} 
10184
@@ -105,7 +88,7 @@ fn test_signing_ecdsa() {
10588    let  key_name = String :: from ( "PARSEC_TEST_ECDSA_KEY" ) ; 
10689
10790    // A 256 bit ECDSA signing operation produces 64 bytes signature 
108-     let  mut  signature:  [ u8 ;  64 ]  = [ 0 ;  64 ] ; 
91+     let  mut  signature:  [ u8 ;  128 ]  = [ 0 ;  128 ] ; 
10992    let  sign_alg = AsymmetricSignature :: Ecdsa  { 
11093        hash_alg :  Hash :: Sha256 . into ( ) , 
11194    } ; 
0 commit comments