use heapless::Vec;
use crate::backend::key::{KeyBackend, KeyHandle};
use crate::error::BackendError;
use crate::limits::{CAPDU_MAX, ENC_KEY_BLOCK_MAX, RAPDU_MAX};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Scp02Session(u16);
impl Scp02Session {
#[must_use]
pub const fn new(index: u16) -> Self {
Self(index)
}
#[must_use]
pub const fn index(self) -> u16 {
self.0
}
}
pub trait Scp02Backend: KeyBackend {
fn scp02_derive_session(
&self,
base_enc: &KeyHandle,
base_mac: &KeyHandle,
base_dek: &KeyHandle,
seq_counter: [u8; 2],
) -> Result<Scp02Session, BackendError>;
fn scp02_card_cryptogram(
&self,
s: &Scp02Session,
host_ch: &[u8; 8],
card_ch: &[u8; 8],
) -> Result<[u8; 8], BackendError>;
fn scp02_host_cryptogram(
&self,
s: &Scp02Session,
host_ch: &[u8; 8],
card_ch: &[u8; 8],
) -> Result<[u8; 8], BackendError>;
fn scp02_wrap_command(
&self,
s: &mut Scp02Session,
capdu: &[u8],
) -> Result<Vec<u8, CAPDU_MAX>, BackendError>;
fn scp02_unwrap_response(
&self,
s: &mut Scp02Session,
rapdu: &[u8],
) -> Result<Vec<u8, RAPDU_MAX>, BackendError>;
fn scp02_encrypt_put_key_payload_for_session(
&self,
s: &Scp02Session,
new_key: &KeyHandle,
) -> Result<Vec<u8, ENC_KEY_BLOCK_MAX>, BackendError>;
fn scp02_close_session(&self, _s: Scp02Session) {}
}