in src/vtok_p11/src/crypto/sign.rs [176:202]
fn sign(mut self: Box<Self>, data: &[u8]) -> Result<Vec<u8>, Error> {
let mut sig = vec![0u8; self.sig_len];
let mut sig_len: ffi::c_size_t = self.sig_len as ffi::c_size_t;
let rc = unsafe {
ffi::EVP_PKEY_sign(
self.evp_pkey_ctx.as_mut_ptr(),
sig.as_mut_ptr(),
&mut sig_len as *mut ffi::c_size_t,
data.as_ptr(),
data.len() as ffi::c_size_t,
)
};
if rc != 1 {
return Err(Error::DirectSign);
}
let pkey = unsafe { ffi::EVP_PKEY_CTX_get0_pkey(self.evp_pkey_ctx.as_ptr()) };
if pkey.is_null() {
return Err(Error::GeneralError);
}
match self.algo {
KeyAlgo::Ec => ecdsa_sig_der_to_ckrs(sig.as_slice()),
KeyAlgo::Rsa => Ok(sig),
}
}