2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
4
use e2e_tests:: * ;
5
+ use openssl:: md:: Md ;
6
+ use openssl:: md_ctx:: MdCtx ;
7
+ use openssl:: pkey:: Private ;
5
8
use parsec_client:: core:: basic_client:: BasicClient ;
6
9
use 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
+ } ;
7
13
use parsec_openssl_provider:: parsec_openssl2:: ossl_param;
8
14
use parsec_openssl_provider:: parsec_openssl2:: { openssl_returns_1, Openssl2Error } ;
15
+ use parsec_openssl_provider:: signature:: EccSignature ;
9
16
use parsec_openssl_provider:: {
10
17
PARSEC_PROVIDER_DFLT_PROPERTIES , PARSEC_PROVIDER_ECDSA_NAME , PARSEC_PROVIDER_KEY_NAME ,
11
18
PARSEC_PROVIDER_RSA_NAME ,
@@ -21,10 +28,6 @@ fn sign_verify(
21
28
sign_algorithm : AsymmetricSignature ,
22
29
key_type : & [ u8 ] ,
23
30
) -> 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
-
28
31
let provider_path = String :: from ( "../../target/debug/" ) ;
29
32
let provider_name = String :: from ( "libparsec_openssl_provider_shared" ) ;
30
33
@@ -33,10 +36,7 @@ fn sign_verify(
33
36
34
37
let mut param = ossl_param ! ( PARSEC_PROVIDER_KEY_NAME , OSSL_PARAM_UTF8_PTR , key_name) ;
35
38
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" ;
40
40
unsafe {
41
41
let mut parsec_pkey: * mut EVP_PKEY = std:: ptr:: null_mut ( ) ;
42
42
load_key ( & lib_ctx, & mut param, & mut parsec_pkey, key_type) ;
@@ -47,55 +47,38 @@ fn sign_verify(
47
47
PARSEC_PROVIDER_DFLT_PROPERTIES . as_ptr ( ) as * const :: std:: os:: raw:: c_char ,
48
48
) ;
49
49
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 ( ) ;
82
56
83
57
EVP_PKEY_free ( parsec_pkey) ;
84
58
}
85
59
86
60
let client = BasicClient :: new ( Some ( String :: from ( "parsec-tool" ) ) ) . unwrap ( ) ;
87
61
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
+ }
99
82
Ok ( ( ) )
100
83
}
101
84
@@ -105,7 +88,7 @@ fn test_signing_ecdsa() {
105
88
let key_name = String :: from ( "PARSEC_TEST_ECDSA_KEY" ) ;
106
89
107
90
// 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 ] ;
109
92
let sign_alg = AsymmetricSignature :: Ecdsa {
110
93
hash_alg : Hash :: Sha256 . into ( ) ,
111
94
} ;
0 commit comments