|
4 | 4 | use crate::keymgmt::ParsecProviderKeyObject; |
5 | 5 | use crate::openssl_bindings::{ |
6 | 6 | OSSL_ALGORITHM, OSSL_DISPATCH, OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_NEWCTX, |
7 | | - OSSL_FUNC_SIGNATURE_SIGN_INIT, OSSL_PARAM, |
| 7 | + OSSL_FUNC_SIGNATURE_SIGN, OSSL_FUNC_SIGNATURE_SIGN_INIT, OSSL_PARAM, |
8 | 8 | }; |
9 | 9 | use crate::{ |
10 | 10 | PARSEC_PROVIDER_DESCRIPTION_ECDSA, PARSEC_PROVIDER_DESCRIPTION_RSA, |
11 | 11 | PARSEC_PROVIDER_DFLT_PROPERTIES, PARSEC_PROVIDER_ECDSA_NAME, PARSEC_PROVIDER_RSA_NAME, |
12 | 12 | }; |
| 13 | +use parsec_client::core::interface::operations::psa_algorithm::{AsymmetricSignature, Hash}; |
13 | 14 | use parsec_openssl2::types::VOID_PTR; |
14 | 15 | use parsec_openssl2::*; |
15 | 16 |
|
@@ -97,20 +98,88 @@ unsafe extern "C" fn parsec_provider_signature_sign_init( |
97 | 98 | } |
98 | 99 | } |
99 | 100 |
|
| 101 | +unsafe extern "C" fn parsec_provider_signature_sign( |
| 102 | + ctx: VOID_PTR, |
| 103 | + sig: *mut std::os::raw::c_uchar, |
| 104 | + siglen: *mut std::os::raw::c_uint, |
| 105 | + sigsize: std::os::raw::c_uint, |
| 106 | + tbs: *const std::os::raw::c_uchar, |
| 107 | + tbslen: std::os::raw::c_uint, |
| 108 | +) -> std::os::raw::c_int { |
| 109 | + let result = super::r#catch(Some(|| super::Error::PROVIDER_SIGNATURE_SIGN), || { |
| 110 | + if ctx.is_null() || tbs.is_null() || sig.is_null() || siglen.is_null() { |
| 111 | + return Err("Received unexpected NULL pointer as an argument.".into()); |
| 112 | + } |
| 113 | + |
| 114 | + Arc::increment_strong_count(ctx as *const ParsecProviderSignatureContext); |
| 115 | + let arc_sig_ctx = Arc::from_raw(ctx as *const ParsecProviderSignatureContext); |
| 116 | + |
| 117 | + let keyobj = match *arc_sig_ctx.keyobj.lock().unwrap() { |
| 118 | + None => { |
| 119 | + return Err("Key Object not set. This should be done through sign_init()".into()) |
| 120 | + } |
| 121 | + Some(ref keyobj) => keyobj.clone(), |
| 122 | + }; |
| 123 | + |
| 124 | + let key_name_binding = keyobj.get_key_name(); |
| 125 | + let key_name = match *key_name_binding { |
| 126 | + None => return Err("Key name not set in the Key Object".into()), |
| 127 | + Some(ref name) => name, |
| 128 | + }; |
| 129 | + |
| 130 | + let tbs_slice: &[u8] = core::slice::from_raw_parts(tbs, tbslen as usize); |
| 131 | + |
| 132 | + let sign_algorithm = AsymmetricSignature::RsaPkcs1v15Sign { |
| 133 | + hash_alg: Hash::Sha256.into(), |
| 134 | + }; |
| 135 | + |
| 136 | + let sign_res: Vec<u8> = keyobj |
| 137 | + .get_provctx() |
| 138 | + .get_client() |
| 139 | + .psa_sign_hash(key_name, tbs_slice, sign_algorithm) |
| 140 | + .map_err(|_| "Parsec Client failed to sign".to_string())?; |
| 141 | + |
| 142 | + if sigsize > sign_res.len() as u32 { |
| 143 | + std::ptr::copy(sign_res.as_ptr(), sig, sign_res.len()); |
| 144 | + } else { |
| 145 | + std::ptr::copy(sign_res.as_ptr(), sig, sigsize as usize); |
| 146 | + } |
| 147 | + |
| 148 | + *siglen = sign_res.len() as u32; |
| 149 | + |
| 150 | + Ok(OPENSSL_SUCCESS) |
| 151 | + }); |
| 152 | + |
| 153 | + match result { |
| 154 | + Ok(result) => result, |
| 155 | + Err(()) => OPENSSL_ERROR, |
| 156 | + } |
| 157 | +} |
| 158 | + |
100 | 159 | pub type SignatureNewCtxPtr = |
101 | 160 | unsafe extern "C" fn(VOID_PTR, *const std::os::raw::c_char) -> VOID_PTR; |
102 | 161 | pub type SignatureFreeCtxPtr = unsafe extern "C" fn(VOID_PTR); |
| 162 | +pub type SignatureSignPtr = unsafe extern "C" fn( |
| 163 | + VOID_PTR, |
| 164 | + *mut std::os::raw::c_uchar, |
| 165 | + *mut std::os::raw::c_uint, |
| 166 | + std::os::raw::c_uint, |
| 167 | + *const std::os::raw::c_uchar, |
| 168 | + std::os::raw::c_uint, |
| 169 | +) -> std::os::raw::c_int; |
103 | 170 | pub type SignatureSignInitPtr = |
104 | 171 | unsafe extern "C" fn(VOID_PTR, VOID_PTR, *const OSSL_PARAM) -> std::os::raw::c_int; |
105 | 172 |
|
106 | 173 | const OSSL_FUNC_SIGNATURE_NEWCTX_PTR: SignatureNewCtxPtr = parsec_provider_signature_newctx; |
107 | 174 | const OSSL_FUNC_SIGNATURE_FREECTX_PTR: SignatureFreeCtxPtr = parsec_provider_signature_freectx; |
| 175 | +const OSSL_FUNC_SIGNATURE_SIGN_PTR: SignatureSignPtr = parsec_provider_signature_sign; |
108 | 176 | const OSSL_FUNC_SIGNATURE_SIGN_INIT_PTR: SignatureSignInitPtr = parsec_provider_signature_sign_init; |
109 | 177 |
|
110 | 178 | const PARSEC_PROVIDER_ECDSA_SIGN_IMPL: [OSSL_DISPATCH; 1] = [ossl_dispatch!()]; |
111 | | -const PARSEC_PROVIDER_RSA_SIGN_IMPL: [OSSL_DISPATCH; 4] = [ |
| 179 | +const PARSEC_PROVIDER_RSA_SIGN_IMPL: [OSSL_DISPATCH; 5] = [ |
112 | 180 | unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_NEWCTX, OSSL_FUNC_SIGNATURE_NEWCTX_PTR) }, |
113 | 181 | unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_FREECTX_PTR) }, |
| 182 | + unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_SIGN, OSSL_FUNC_SIGNATURE_SIGN_PTR) }, |
114 | 183 | unsafe { |
115 | 184 | ossl_dispatch!( |
116 | 185 | OSSL_FUNC_SIGNATURE_SIGN_INIT, |
|
0 commit comments