use heapless::Vec;
use crate::backend::{Scp02Backend, Scp03Backend};
use crate::error::ScllError;
use crate::report::{AppletTransmitParams, AppletTransmitReport};
use crate::scp::ScpSession;
use crate::transport::Transport;
use crate::workflow::session;
pub fn transmit<B>(
t: &mut dyn Transport,
backend: &B,
session: &mut ScpSession,
plaintext_capdu: &[u8],
) -> Result<AppletTransmitReport, ScllError>
where
B: Scp02Backend + Scp03Backend,
{
let session_id = session.session_id();
let sec_level = session.security_level();
let scp_protocol = session.protocol();
let (data, sw) = session::transmit_in_session(t, backend, session, plaintext_capdu)?;
let capdu_plaintext_len = u16::try_from(plaintext_capdu.len()).unwrap_or(u16::MAX);
let rapdu_plaintext_len = u16::try_from(data.len()).unwrap_or(u16::MAX);
Ok(AppletTransmitReport {
rapdu: data,
sw,
effective: AppletTransmitParams {
session_id,
capdu_plaintext_len,
rapdu_plaintext_len,
sw: sw.to_be_bytes(),
sec_level,
scp_protocol,
},
warnings: Vec::new(),
})
}