use super::{
raw::{self, HmacSha1Signature},
Arm9, Overlay, OverlayError,
};
use crate::crypto::hmac_sha1::HmacSha1;
#[derive(Clone, Default)]
pub struct OverlayTable<'a> {
overlays: Vec<Overlay<'a>>,
signature: Option<HmacSha1Signature>,
}
impl<'a> OverlayTable<'a> {
pub fn new(overlays: Vec<Overlay<'a>>) -> Self {
Self { overlays, signature: None }
}
pub fn overlays(&self) -> &[Overlay<'a>] {
&self.overlays
}
pub fn overlays_mut(&mut self) -> &mut [Overlay<'a>] {
&mut self.overlays
}
pub fn len(&self) -> usize {
self.overlays.len()
}
pub fn is_empty(&self) -> bool {
self.overlays.is_empty()
}
pub fn parse_arm9(raw: raw::OverlayTable, rom: &'a raw::Rom, arm9: &Arm9) -> Result<Self, OverlayError> {
let overlays =
raw.overlays().iter().map(|overlay| Overlay::parse_arm9(overlay, rom, arm9)).collect::<Result<Vec<_>, _>>()?;
let signature = raw.signature();
Ok(Self { overlays, signature })
}
pub fn parse_arm7(raw: raw::OverlayTable, rom: &'a raw::Rom) -> Result<Self, OverlayError> {
let overlays =
raw.overlays().iter().map(|overlay| Overlay::parse_arm7(overlay, rom)).collect::<Result<Vec<_>, _>>()?;
let signature = raw.signature();
Ok(Self { overlays, signature })
}
pub fn build(&self) -> raw::OverlayTable<'a> {
let overlays: Vec<raw::Overlay> = self.overlays.iter().map(|overlay| overlay.build()).collect();
let signature = self.signature;
raw::OverlayTable::new(overlays, signature)
}
pub fn compute_signature(&self, hmac_sha1: &HmacSha1) -> HmacSha1Signature {
self.build().compute_signature(hmac_sha1)
}
pub fn verify_signature(&self, hmac_sha1: &HmacSha1) -> bool {
self.build().verify_signature(hmac_sha1)
}
pub fn signature(&self) -> Option<HmacSha1Signature> {
self.signature
}
pub fn sign(&mut self, hmac_sha1: &HmacSha1) {
self.signature = Some(self.compute_signature(hmac_sha1));
}
pub fn is_signed(&self) -> bool {
self.signature.is_some()
}
pub fn set_signature(&mut self, signature: HmacSha1Signature) {
self.signature = Some(signature);
}
}