fn ecdsa_sig_der_to_ckrs()

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)
}