@@ -471,6 +471,9 @@ pub enum Error {
471
471
472
472
#[ error( "packing error: {0}" ) ]
473
473
PackingError ( String ) ,
474
+
475
+ #[ error( "invalid epoch value: {0}" ) ]
476
+ InvalidEpoch ( String ) ,
474
477
}
475
478
476
479
////////////////////////////////////////////////////////////////////////////////
@@ -618,13 +621,25 @@ impl RawHubrisArchive {
618
621
pub fn write_version_to_caboose (
619
622
& mut self ,
620
623
version : & str ,
624
+ epoch : Option < & String > ,
621
625
) -> Result < ( ) , Error > {
622
626
// Manually build the TLV-C data for the caboose
623
- let data = tlvc_text:: Piece :: Chunk (
624
- tlvc_text:: Tag :: new ( caboose:: tags:: VERS ) ,
625
- vec ! [ tlvc_text:: Piece :: String ( version. to_owned( ) ) ] ,
626
- ) ;
627
- let out = tlvc_text:: pack ( & [ data] ) ;
627
+ let mut chunks = vec ! [
628
+ tlvc_text:: Piece :: Chunk (
629
+ tlvc_text:: Tag :: new( caboose:: tags:: VERS ) ,
630
+ vec![ tlvc_text:: Piece :: String ( version. to_owned( ) ) ] ,
631
+ ) ,
632
+ ] ;
633
+ if let Some ( param) = epoch {
634
+ let epoc = param. parse :: < u32 > ( ) . map_err ( |_| Error :: InvalidEpoch ( param. to_string ( ) ) ) ?;
635
+ let caboose_epoc = format ! ( "{:010}" , epoc) . to_owned ( ) ;
636
+ let data = tlvc_text:: Piece :: Chunk (
637
+ tlvc_text:: Tag :: new ( caboose:: tags:: EPOC ) ,
638
+ vec ! [ tlvc_text:: Piece :: String ( caboose_epoc) ] ,
639
+ ) ;
640
+ chunks. push ( data) ;
641
+ }
642
+ let out = tlvc_text:: pack ( & chunks) ;
628
643
self . write_caboose ( & out) ?;
629
644
Ok ( ( ) )
630
645
}
@@ -642,6 +657,7 @@ impl RawHubrisArchive {
642
657
fn generate_default_caboose (
643
658
& mut self ,
644
659
version : Option < & String > ,
660
+ epoch : Option < & String > ,
645
661
) -> Result < Vec < tlvc_text:: Piece > , Error > {
646
662
let manifest = self . extract_file ( "app.toml" ) ?;
647
663
let git = self . extract_file ( "git-rev" ) ?;
@@ -667,19 +683,21 @@ impl RawHubrisArchive {
667
683
. as_str ( )
668
684
. ok_or ( Error :: BadTomlType ) ?
669
685
. to_owned ( ) ;
670
- let epoch = if let Some ( epoch) =
671
- manifest. as_table ( ) . ok_or ( Error :: BadTomlType ) ?. get ( "epoch" )
672
- {
673
- epoch. as_integer ( ) . ok_or ( Error :: BadTomlType ) ?
686
+ // Hubris has an epoch in the app.toml but Bootleby does not.
687
+ // CLI arg overrides app.toml, value will default to zero.
688
+ let epoc: u32 = if let Some ( param) = epoch {
689
+ param. parse :: < u32 > ( ) . map_err ( |_| Error :: InvalidEpoch ( param. to_string ( ) ) ) ?
690
+ } else if let Some ( param) = manifest. as_table ( ) . ok_or ( Error :: BadTomlType ) ?. get ( "epoch" ) {
691
+ let toml_int = param. as_integer ( ) . ok_or ( Error :: BadTomlType ) ?;
692
+ u32:: try_from ( toml_int) . map_err ( |_| Error :: InvalidEpoch ( format ! ( "epoch from toml = {}" , toml_int) ) ) ?
674
693
} else {
675
694
// Default is zero if missing from app.toml
676
- 0i64
695
+ 0u32
677
696
} ;
678
697
// EPOC in the caboose is a u32, zero-padded 10-digit ascii number.
679
698
// Missing EPOC or all-zeros is equivalent to EPOC zero.
680
699
// Anything else represents some future scheme or a typo in toml file.
681
- let epoch = u32:: try_from ( epoch) . map_err ( |_| Error :: BadTomlType ) ?;
682
- let epoch = format ! ( "{:010}" , epoch as u32 ) . to_owned ( ) ;
700
+ let caboose_epoc = format ! ( "{:010}" , epoc) . to_owned ( ) ;
683
701
684
702
// If this Hubris archive used our TOML inheritance system, then the
685
703
// name could be overridden in the `patches.toml` file.
@@ -713,7 +731,7 @@ impl RawHubrisArchive {
713
731
) ,
714
732
tlvc_text:: Piece :: Chunk (
715
733
tlvc_text:: Tag :: new( caboose:: tags:: EPOC ) ,
716
- vec![ tlvc_text:: Piece :: String ( epoch ) ] ,
734
+ vec![ tlvc_text:: Piece :: String ( caboose_epoc ) ] ,
717
735
) ,
718
736
] ;
719
737
if let Some ( v) = version {
@@ -729,8 +747,9 @@ impl RawHubrisArchive {
729
747
pub fn write_default_caboose (
730
748
& mut self ,
731
749
version : Option < & String > ,
750
+ epoch : Option < & String > ,
732
751
) -> Result < ( ) , Error > {
733
- let out = tlvc_text:: pack ( & self . generate_default_caboose ( version) ?) ;
752
+ let out = tlvc_text:: pack ( & self . generate_default_caboose ( version, epoch ) ?) ;
734
753
self . write_caboose ( & out)
735
754
}
736
755
@@ -876,6 +895,7 @@ impl RawHubrisArchive {
876
895
root_certs : Vec < Certificate > ,
877
896
signing_certs : Vec < Certificate > ,
878
897
version : Option < & String > ,
898
+ epoch : Option < & String > ,
879
899
) -> Result < Vec < u8 > , Error > {
880
900
match self . is_lpc55 ( ) {
881
901
Ok ( _) => {
@@ -911,7 +931,7 @@ impl RawHubrisArchive {
911
931
) ?;
912
932
}
913
933
914
- let mut caboose = self . generate_default_caboose ( version) ?;
934
+ let mut caboose = self . generate_default_caboose ( version, epoch ) ?;
915
935
916
936
caboose. push ( tlvc_text:: Piece :: Chunk (
917
937
tlvc_text:: Tag :: new ( caboose:: tags:: SIGN ) ,
@@ -930,7 +950,7 @@ impl RawHubrisArchive {
930
950
Ok ( stamped)
931
951
}
932
952
Err ( _) => {
933
- self . write_default_caboose ( version) ?;
953
+ self . write_default_caboose ( version, epoch ) ?;
934
954
// Not an LPC55 image, just return the image back for now
935
955
self . image . to_binary ( )
936
956
}
0 commit comments