|  | 
| 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_INIT), || { | 
|  | 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