4
4
use hex:: FromHex ;
5
5
use md5:: { digest:: generic_array:: GenericArray , Digest , Md5 } ;
6
6
use sha1:: Sha1 ;
7
+ use sha2:: { Sha256 , Sha512 } ;
7
8
use std:: { io, path:: Path } ;
8
9
use thiserror:: Error ;
9
10
@@ -49,6 +50,30 @@ pub fn compare_hash(
49
50
}
50
51
51
52
match expected_hash {
53
+ RequestChecksum :: Md5 ( sum) => {
54
+ let expected = <[ u8 ; 16 ] >:: from_hex ( sum)
55
+ . map ( GenericArray :: from)
56
+ . map_err ( |_| ChecksumError :: InvalidInput ( format ! ( "MD5 {}" , sum) ) ) ?;
57
+
58
+ let mut buffer = vec ! [ 0u8 ; 8 * 1024 ] ;
59
+ let mut hasher = Md5 :: new ( ) ;
60
+
61
+ loop {
62
+ match file. read ( & mut buffer) {
63
+ Ok ( 0 ) => break ,
64
+ Ok ( bytes) => hasher. update ( & buffer[ ..bytes] ) ,
65
+ Err ( why) => return Err ( ChecksumError :: FileRead ( why) ) ,
66
+ }
67
+ }
68
+
69
+ let hash = & * hasher. finalize ( ) ;
70
+
71
+ if & * expected == hash {
72
+ Ok ( ( ) )
73
+ } else {
74
+ Err ( ChecksumError :: Mismatch )
75
+ }
76
+ }
52
77
RequestChecksum :: Sha1 ( sum) => {
53
78
let expected = <[ u8 ; 20 ] >:: from_hex ( sum)
54
79
. map ( GenericArray :: from)
@@ -73,13 +98,37 @@ pub fn compare_hash(
73
98
Err ( ChecksumError :: Mismatch )
74
99
}
75
100
}
76
- RequestChecksum :: Md5 ( sum) => {
77
- let expected = <[ u8 ; 16 ] >:: from_hex ( sum)
101
+ RequestChecksum :: Sha256 ( sum) => {
102
+ let expected = <[ u8 ; 32 ] >:: from_hex ( sum)
78
103
. map ( GenericArray :: from)
79
- . map_err ( |_| ChecksumError :: InvalidInput ( format ! ( "MD5 {}" , sum) ) ) ?;
104
+ . map_err ( |_| ChecksumError :: InvalidInput ( format ! ( "SHA256 {}" , sum) ) ) ?;
80
105
81
106
let mut buffer = vec ! [ 0u8 ; 8 * 1024 ] ;
82
- let mut hasher = Md5 :: new ( ) ;
107
+ let mut hasher = Sha256 :: new ( ) ;
108
+
109
+ loop {
110
+ match file. read ( & mut buffer) {
111
+ Ok ( 0 ) => break ,
112
+ Ok ( bytes) => hasher. update ( & buffer[ ..bytes] ) ,
113
+ Err ( why) => return Err ( ChecksumError :: FileRead ( why) ) ,
114
+ }
115
+ }
116
+
117
+ let hash = & * hasher. finalize ( ) ;
118
+
119
+ if & * expected == hash {
120
+ Ok ( ( ) )
121
+ } else {
122
+ Err ( ChecksumError :: Mismatch )
123
+ }
124
+ }
125
+ RequestChecksum :: Sha512 ( sum) => {
126
+ let expected = <[ u8 ; 64 ] >:: from_hex ( sum)
127
+ . map ( GenericArray :: from)
128
+ . map_err ( |_| ChecksumError :: InvalidInput ( format ! ( "SHA512 {}" , sum) ) ) ?;
129
+
130
+ let mut buffer = vec ! [ 0u8 ; 8 * 1024 ] ;
131
+ let mut hasher = Sha512 :: new ( ) ;
83
132
84
133
loop {
85
134
match file. read ( & mut buffer) {
0 commit comments