@@ -9,6 +9,7 @@ package attachment
99import (
1010 "crypto/aes"
1111 "crypto/cipher"
12+ "crypto/hmac"
1213 "crypto/sha256"
1314 "encoding/base64"
1415 "errors"
@@ -217,9 +218,7 @@ func (r *encryptingReader) Close() (err error) {
217218 err = closer .Close ()
218219 }
219220 if r .isDecrypting {
220- var downloadedChecksum [utils .SHAHashLength ]byte
221- r .hash .Sum (downloadedChecksum [:])
222- if downloadedChecksum != r .file .decoded .sha256 {
221+ if ! hmac .Equal (r .hash .Sum (nil ), r .file .decoded .sha256 [:]) {
223222 return HashMismatch
224223 }
225224 } else {
@@ -274,12 +273,13 @@ func (ef *EncryptedFile) PrepareForDecryption() error {
274273func (ef * EncryptedFile ) DecryptInPlace (data []byte ) error {
275274 if err := ef .PrepareForDecryption (); err != nil {
276275 return err
277- } else if ef .decoded .sha256 != sha256 .Sum256 (data ) {
276+ }
277+ dataHash := sha256 .Sum256 (data )
278+ if ! hmac .Equal (ef .decoded .sha256 [:], dataHash [:]) {
278279 return HashMismatch
279- } else {
280- utils .XorA256CTR (data , ef .decoded .key , ef .decoded .iv )
281- return nil
282280 }
281+ utils .XorA256CTR (data , ef .decoded .key , ef .decoded .iv )
282+ return nil
283283}
284284
285285// DecryptStream wraps the given io.Reader in order to decrypt the data.
@@ -292,9 +292,10 @@ func (ef *EncryptedFile) DecryptInPlace(data []byte) error {
292292func (ef * EncryptedFile ) DecryptStream (reader io.Reader ) io.ReadSeekCloser {
293293 block , _ := aes .NewCipher (ef .decoded .key [:])
294294 return & encryptingReader {
295- stream : cipher .NewCTR (block , ef .decoded .iv [:]),
296- hash : sha256 .New (),
297- source : reader ,
298- file : ef ,
295+ isDecrypting : true ,
296+ stream : cipher .NewCTR (block , ef .decoded .iv [:]),
297+ hash : sha256 .New (),
298+ source : reader ,
299+ file : ef ,
299300 }
300301}
0 commit comments