3
3
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
5
5
use anyhow:: { anyhow, Context , Result } ;
6
- use clap:: Parser ;
6
+ use clap:: { Parser , ValueEnum } ;
7
7
use hubtools:: RawHubrisArchive ;
8
- use sha3:: { Digest , Sha3_256 } ;
8
+ use sha2:: { digest:: DynDigest , Digest as _, Sha256 } ;
9
+ use sha3:: Sha3_256 ;
9
10
use std:: { ops:: Range , str} ;
10
11
11
12
pub const LPC55_FLASH_PAGE_SIZE : usize = 512 ;
@@ -22,11 +23,35 @@ pub const LPC55_FLASH_PAGE_SIZE: usize = 512;
22
23
/// of hubris archives
23
24
#[ derive( Parser , Debug ) ]
24
25
struct Args {
26
+ /// Hash algorithm used to generate FWID
27
+ #[ clap( default_value_t, env = "HUBEDIT_DIGEST" , long, value_enum) ]
28
+ digest : Digest ,
29
+
25
30
/// Hubris archive
26
31
#[ clap( env = "HUBEDIT_ARCHIVE" ) ]
27
32
archive : String ,
28
33
}
29
34
35
+ // We provide names explicitly for each variant to map each to the IANA named
36
+ // information hash algorithm registry hash name strings.
37
+ #[ derive( Clone , Debug , Default , ValueEnum ) ]
38
+ enum Digest {
39
+ #[ clap( name = "sha-256" ) ]
40
+ Sha256 ,
41
+ #[ clap( name = "sha3-256" ) ]
42
+ #[ default]
43
+ Sha3_256 ,
44
+ }
45
+
46
+ impl Digest {
47
+ fn to_dyn_digest ( & self ) -> Box < dyn DynDigest > {
48
+ match self {
49
+ Digest :: Sha256 => Box :: new ( Sha256 :: new ( ) ) ,
50
+ Digest :: Sha3_256 => Box :: new ( Sha3_256 :: new ( ) ) ,
51
+ }
52
+ }
53
+ }
54
+
30
55
#[ derive( Debug ) ]
31
56
enum Chip {
32
57
Lpc55 ,
@@ -172,9 +197,9 @@ fn main() -> Result<()> {
172
197
}
173
198
} ;
174
199
175
- let mut digest = Sha3_256 :: new ( ) ;
200
+ let mut digest = args . digest . to_dyn_digest ( ) ;
176
201
digest. update ( & image) ;
177
- digest. update ( vec ! [ 0xff ; pad] ) ;
202
+ digest. update ( vec ! [ 0xff ; pad] . as_ref ( ) ) ;
178
203
179
204
let digest = digest. finalize ( ) ;
180
205
0 commit comments