in src/vtok_p11/src/crypto/mod.rs [357:395]
fn ecdsa_sig_der_to_ckrs(sig_der: &[u8]) -> Result<Vec<u8>> {
let mut sig_der_ptr = sig_der.as_ptr();
let ec_sig = FfiBox::new(unsafe {
ffi::d2i_ECDSA_SIG(
std::ptr::null_mut(),
&mut sig_der_ptr,
sig_der.len() as std::os::raw::c_long,
)
})?;
let mut bn_r: *const ffi::BIGNUM = std::ptr::null();
let mut bn_s: *const ffi::BIGNUM = std::ptr::null();
unsafe { ffi::ECDSA_SIG_get0(ec_sig.as_ptr(), &mut bn_r, &mut bn_s) };
if bn_r.is_null() || bn_s.is_null() {
return Err(Error::GeneralError);
}
let r_len = unsafe { ffi::BN_num_bytes(bn_r) } as usize;
let s_len = unsafe { ffi::BN_num_bytes(bn_s) } as usize;
let order_len = if r_len >= s_len { r_len } else { s_len };
let mut ret = vec![0u8; 2 * order_len];
let rv = unsafe { ffi::BN_bn2bin_padded(ret.as_mut_ptr(), order_len as ffi::c_size_t, bn_r) };
if rv != 1 {
return Err(Error::GeneralError);
}
let rv = unsafe {
ffi::BN_bn2bin_padded(
ret[order_len..].as_mut_ptr(),
order_len as ffi::c_size_t,
bn_s,
)
};
if rv != 1 {
return Err(Error::GeneralError);
}
Ok(ret)
}