ds_rom/rom/
overlay_table.rs1use crate::crypto::hmac_sha1::HmacSha1;
2
3use super::{
4 raw::{self, HmacSha1Signature},
5 Arm9, Overlay, OverlayError,
6};
7
8#[derive(Clone, Default)]
10pub struct OverlayTable<'a> {
11 overlays: Vec<Overlay<'a>>,
12 signature: Option<HmacSha1Signature>,
13}
14
15impl<'a> OverlayTable<'a> {
16 pub fn new(overlays: Vec<Overlay<'a>>) -> Self {
18 Self { overlays, signature: None }
19 }
20
21 pub fn overlays(&self) -> &[Overlay<'a>] {
23 &self.overlays
24 }
25
26 pub fn len(&self) -> usize {
28 self.overlays.len()
29 }
30
31 pub fn is_empty(&self) -> bool {
33 self.overlays.is_empty()
34 }
35
36 pub fn parse_arm9(raw: raw::OverlayTable, rom: &'a raw::Rom, arm9: &Arm9) -> Result<Self, OverlayError> {
42 let overlays =
43 raw.overlays().iter().map(|overlay| Overlay::parse_arm9(overlay, rom, arm9)).collect::<Result<Vec<_>, _>>()?;
44 let signature = raw.signature();
45 Ok(Self { overlays, signature })
46 }
47
48 pub fn parse_arm7(raw: raw::OverlayTable, rom: &'a raw::Rom) -> Result<Self, OverlayError> {
54 let overlays =
55 raw.overlays().iter().map(|overlay| Overlay::parse_arm7(overlay, rom)).collect::<Result<Vec<_>, _>>()?;
56 let signature = raw.signature();
57 Ok(Self { overlays, signature })
58 }
59
60 pub fn build(&self) -> raw::OverlayTable {
62 let overlays: Vec<raw::Overlay> = self.overlays.iter().map(|overlay| overlay.build()).collect();
63 let signature = self.signature;
64 raw::OverlayTable::new(overlays, signature)
65 }
66
67 pub fn compute_signature(&self, hmac_sha1: &HmacSha1) -> HmacSha1Signature {
69 self.build().compute_signature(hmac_sha1)
70 }
71
72 pub fn verify_signature(&self, hmac_sha1: &HmacSha1) -> bool {
74 self.build().verify_signature(hmac_sha1)
75 }
76
77 pub fn signature(&self) -> Option<HmacSha1Signature> {
79 self.signature
80 }
81
82 pub fn sign(&mut self, hmac_sha1: &HmacSha1) {
84 self.signature = Some(self.compute_signature(hmac_sha1));
85 }
86
87 pub fn is_signed(&self) -> bool {
89 self.signature.is_some()
90 }
91
92 pub fn set_signature(&mut self, signature: HmacSha1Signature) {
94 self.signature = Some(signature);
95 }
96}