Skip to content

Commit 5bbcafe

Browse files
e2e_tests/sign: Fix and simplify RSA and ECDSA signing tests
* Adapt to the fact that ECDSA signature is split and serialized. * Calculate hash and use the pre-computed digest for signature verification Signed-off-by: Tomás González <tomasagustin.gonzalezorlando@arm.com>
1 parent 289edd4 commit 5bbcafe

File tree

4 files changed

+40
-56
lines changed

4 files changed

+40
-56
lines changed

parsec-openssl-provider-shared/e2e_tests/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ parsec-openssl-provider = { path ="../../parsec-openssl-provider" }
1717
parsec-client = "0.16.0"
1818
sha2 = "0.10.8"
1919
openssl = "0.10.63"
20+
picky-asn1-der = "0.4.0"
2021

2122
[build-dependencies]
2223
pkg-config = "0.3.18"

parsec-openssl-provider-shared/e2e_tests/tests/sign.rs

Lines changed: 35 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
use e2e_tests::*;
5+
use openssl::md::Md;
6+
use openssl::md_ctx::MdCtx;
7+
use openssl::pkey::Private;
58
use parsec_client::core::basic_client::BasicClient;
69
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+
};
713
use parsec_openssl_provider::parsec_openssl2::ossl_param;
814
use parsec_openssl_provider::parsec_openssl2::{openssl_returns_1, Openssl2Error};
15+
use parsec_openssl_provider::signature::EccSignature;
916
use 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
};

parsec-openssl-provider/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use parsec_openssl2::types::VOID_PTR;
1717
use parsec_openssl2::{openssl_bindings, types};
1818

1919
mod keymgmt;
20-
mod signature;
20+
pub mod signature;
2121

2222
mod provider;
2323
use provider::*;

parsec-openssl-provider/src/signature/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ use std::ffi::CStr;
1818
use std::sync::{Arc, RwLock};
1919

2020
#[derive(Serialize, Deserialize)]
21-
struct EccSignature {
22-
r: IntegerAsn1,
23-
s: IntegerAsn1,
21+
pub struct EccSignature {
22+
pub r: IntegerAsn1,
23+
pub s: IntegerAsn1,
2424
}
2525

2626
struct ParsecProviderSignatureContext {

0 commit comments

Comments
 (0)