1extern crate cose;
6
7use std::slice;
8use cose::decoder::decode_signature;
9use cose::SignatureAlgorithm;
10use std::os::raw;
11
12unsafe fn from_raw(ptr: *const u8, len: usize) -> Vec<u8> {
13 slice::from_raw_parts(ptr, len).to_vec()
14}
15
16type VerifyCallback = extern "C" fn(*const u8, usize, *const *const u8, usize, *const usize, *const u8, usize, *const u8, usize, u8, *const raw::c_void )
27 -> bool;
28
29#[no_mangle]
30pub extern "C" fn verify_cose_signature_ffi(
31 payload: *const u8,
32 payload_len: usize,
33 cose_signature: *const u8,
34 cose_signature_len: usize,
35 ctx: *const raw::c_void,
36 verify_callback: VerifyCallback,
37) -> bool {
38 if payload.is_null() || cose_signature.is_null() || payload_len == 0 ||
39 cose_signature_len == 0
40 {
41 return false;
42 }
43
44 let payload = unsafe { from_raw(payload, payload_len) };
46 let cose_signature = unsafe { from_raw(cose_signature, cose_signature_len) };
47
48 let cose_signatures = decode_signature(&cose_signature, &payload);
50 let cose_signatures = match cose_signatures {
51 Ok(signatures) => signatures,
52 Err(_) => Vec::new(),
53 };
54 if cose_signatures.len() == 0 {
55 return false;
56 }
57
58 return cose_signatures.into_iter().all(|cose_signature| {
59 let signature_type = cose_signature.signature_type;
60 let signature_type = match signature_type {
62 SignatureAlgorithm::ES256 => 0,
63 SignatureAlgorithm::ES384 => 1,
64 SignatureAlgorithm::ES512 => 2,
65 SignatureAlgorithm::PS256 => 3,
66 };
67 let signature_bytes = cose_signature.signature;
68 let real_payload = cose_signature.to_verify;
69
70 let certs: Vec<_> = cose_signature.certs.iter().map(|c| c.as_ptr()).collect();
72 let cert_lens: Vec<_> = cose_signature.certs.iter().map(|c| c.len()).collect();
73
74 verify_callback(
76 real_payload.as_ptr(),
77 real_payload.len(),
78 certs.as_ptr(),
79 certs.len(),
80 cert_lens.as_ptr(),
81 cose_signature.signer_cert.as_ptr(),
82 cose_signature.signer_cert.len(),
83 signature_bytes.as_ptr(),
84 signature_bytes.len(),
85 signature_type,
86 ctx,
87 )
88 });
89}