1+ use std:: mem:: MaybeUninit ;
2+
3+ use hex_simd:: { AsOut , AsciiCase } ;
4+ use hyper:: body:: Bytes ;
5+
16/// verify sha256 checksum string
27pub fn is_sha256_checksum ( s : & str ) -> bool {
38 // TODO: optimize
@@ -24,3 +29,54 @@ pub fn hmac_sha256(key: impl AsRef<[u8]>, data: impl AsRef<[u8]>) -> [u8; 32] {
2429 m. update ( data. as_ref ( ) ) ;
2530 m. finalize ( ) . into_bytes ( ) . into ( )
2631}
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