Add Full Object Checksums and CRC64-NVME (#20855)
Backport of AIStor PR 247. Add support for full object checksums as described here: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html New checksum types are fully supported. Mint tests from https://github.com/minio/minio-go/pull/2026 are now passing. Includes fixes from https://github.com/minio/minio/pull/20743 for mint tests. Add using checksums as validation for object content. Fixes #20845 #20849 Fixes checksum replication (downstream PR 250)
This commit is contained in:
26
cmd/utils.go
26
cmd/utils.go
@@ -20,7 +20,9 @@ package cmd
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/md5"
|
||||
"crypto/tls"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
@@ -254,10 +256,26 @@ func xmlDecoder(body io.Reader, v interface{}, size int64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// hasContentMD5 returns true if Content-MD5 header is set.
|
||||
func hasContentMD5(h http.Header) bool {
|
||||
_, ok := h[xhttp.ContentMD5]
|
||||
return ok
|
||||
// validateLengthAndChecksum returns if a content checksum is set,
|
||||
// and will replace r.Body with a reader that checks the provided checksum
|
||||
func validateLengthAndChecksum(r *http.Request) bool {
|
||||
if mdFive := r.Header.Get(xhttp.ContentMD5); mdFive != "" {
|
||||
want, err := base64.StdEncoding.DecodeString(mdFive)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
r.Body = hash.NewChecker(r.Body, md5.New(), want, r.ContentLength)
|
||||
return true
|
||||
}
|
||||
cs, err := hash.GetContentChecksum(r.Header)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if !cs.Type.IsSet() {
|
||||
return false
|
||||
}
|
||||
r.Body = hash.NewChecker(r.Body, cs.Type.Hasher(), cs.Raw, r.ContentLength)
|
||||
return true
|
||||
}
|
||||
|
||||
// http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadingObjects.html
|
||||
|
||||
Reference in New Issue
Block a user