1
+ use std:: mem:: MaybeUninit ;
2
+
3
+ use hex_simd:: { AsOut , AsciiCase } ;
4
+ use hyper:: body:: Bytes ;
5
+
1
6
/// verify sha256 checksum string
2
7
pub fn is_sha256_checksum ( s : & str ) -> bool {
3
8
// TODO: optimize
@@ -24,3 +29,54 @@ pub fn hmac_sha256(key: impl AsRef<[u8]>, data: impl AsRef<[u8]>) -> [u8; 32] {
24
29
m. update ( data. as_ref ( ) ) ;
25
30
m. finalize ( ) . into_bytes ( ) . into ( )
26
31
}
32
+
33
+ pub fn hex ( data : impl AsRef < [ u8 ] > ) -> String {
34
+ hex_simd:: encode_to_string ( data, hex_simd:: AsciiCase :: Lower )
35
+ }
36
+
37
+ /// `f(hex(src))`
38
+ fn hex_bytes32 < R > ( src : impl AsRef < [ u8 ] > , f : impl FnOnce ( & str ) -> R ) -> R {
39
+ let buf: & mut [ _ ] = & mut [ MaybeUninit :: uninit ( ) ; 64 ] ;
40
+ let ans = hex_simd:: encode_as_str ( src. as_ref ( ) , buf. as_out ( ) , AsciiCase :: Lower ) ;
41
+ f ( ans)
42
+ }
43
+
44
+ #[ cfg( not( all( feature = "openssl" , not( windows) ) ) ) ]
45
+ fn sha256 ( data : & [ u8 ] ) -> impl AsRef < [ u8 ; 32 ] > {
46
+ use sha2:: { Digest , Sha256 } ;
47
+ <Sha256 as Digest >:: digest ( data)
48
+ }
49
+
50
+ #[ cfg( all( feature = "openssl" , not( windows) ) ) ]
51
+ fn sha256 ( data : & [ u8 ] ) -> impl AsRef < [ u8 ] > {
52
+ use openssl:: hash:: { Hasher , MessageDigest } ;
53
+ let mut h = Hasher :: new ( MessageDigest :: sha256 ( ) ) . unwrap ( ) ;
54
+ h. update ( data) . unwrap ( ) ;
55
+ h. finish ( ) . unwrap ( )
56
+ }
57
+
58
+ #[ cfg( not( all( feature = "openssl" , not( windows) ) ) ) ]
59
+ fn sha256_chunk ( chunk : & [ Bytes ] ) -> impl AsRef < [ u8 ; 32 ] > {
60
+ use sha2:: { Digest , Sha256 } ;
61
+ let mut h = <Sha256 as Digest >:: new ( ) ;
62
+ chunk. iter ( ) . for_each ( |data| h. update ( data) ) ;
63
+ h. finalize ( )
64
+ }
65
+
66
+ #[ cfg( all( feature = "openssl" , not( windows) ) ) ]
67
+ fn sha256_chunk ( chunk : & [ Bytes ] ) -> impl AsRef < [ u8 ] > {
68
+ use openssl:: hash:: { Hasher , MessageDigest } ;
69
+ let mut h = Hasher :: new ( MessageDigest :: sha256 ( ) ) . unwrap ( ) ;
70
+ chunk. iter ( ) . for_each ( |data| h. update ( data) . unwrap ( ) ) ;
71
+ h. finish ( ) . unwrap ( )
72
+ }
73
+
74
+ /// `f(hex(sha256(data)))`
75
+ pub fn hex_sha256 < R > ( data : & [ u8 ] , f : impl FnOnce ( & str ) -> R ) -> R {
76
+ hex_bytes32 ( sha256 ( data) . as_ref ( ) , f)
77
+ }
78
+
79
+ /// `f(hex(sha256(chunk)))`
80
+ pub fn hex_sha256_chunk < R > ( chunk : & [ Bytes ] , f : impl FnOnce ( & str ) -> R ) -> R {
81
+ hex_bytes32 ( sha256_chunk ( chunk) . as_ref ( ) , f)
82
+ }
0 commit comments