@@ -15,6 +15,7 @@ import (
1515"fmt"
1616"hash"
1717"hash/crc32"
18+ "hash/crc64"
1819"io"
1920"log"
2021"reflect"
@@ -29,6 +30,8 @@ import (
2930"github.com/aws/smithy-go/middleware"
3031)
3132
33+ const crc64NVME = 0x9a6c_9329_ac4b_c9b5
34+
3235var integBuf12MB = make ([]byte , 1024 * 1024 * 12 )
3336var integMD512MB = fmt .Sprintf ("%x" , md5 .Sum (integBuf12MB ))
3437
@@ -124,6 +127,7 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
124127singlePartBytes := integBuf12MB [0 :manager .DefaultUploadPartSize ]
125128singlePartCRC32 := base64Sum (crc32 .NewIEEE (), singlePartBytes )
126129singlePartCRC32C := base64Sum (crc32 .New (crc32 .MakeTable (crc32 .Castagnoli )), singlePartBytes )
130+ singlePartCRC64NVME := base64Sum (crc64 .New (crc64 .MakeTable (crc64NVME )), singlePartBytes )
127131singlePartSHA1 := base64Sum (sha1 .New (), singlePartBytes )
128132singlePartSHA256 := base64Sum (sha256 .New (), singlePartBytes )
129133singlePartMD5 := base64Sum (md5 .New (), singlePartBytes )
@@ -132,6 +136,7 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
132136multiPartTailBytes := integBuf12MB [manager .DefaultUploadPartSize * 2 :]
133137multiPartTailCRC32 := base64Sum (crc32 .NewIEEE (), multiPartTailBytes )
134138multiPartTailCRC32C := base64Sum (crc32 .New (crc32 .MakeTable (crc32 .Castagnoli )), multiPartTailBytes )
139+ multiPartTailCRC64NVME := base64Sum (crc64 .New (crc64 .MakeTable (crc64NVME )), multiPartTailBytes )
135140multiPartTailSHA1 := base64Sum (sha1 .New (), multiPartTailBytes )
136141multiPartTailSHA256 := base64Sum (sha256 .New (), multiPartTailBytes )
137142multiPartTailETag := fmt .Sprintf ("%q" , hexSum (md5 .New (), multiPartTailBytes ))
@@ -143,20 +148,25 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
143148multiPartSHA256 := base64SumOfSums (sha256 .New (), []string {singlePartSHA256 , singlePartSHA256 , multiPartTailSHA256 })
144149multiPartETag := `"4e982d58b6c2ce178ae042c23f9bca6e-3"` // Not obvious how this is computed
145150
151+ // s3 wants running checksum for crc64nvme
152+ multiPartCRC64NVME := base64Sum (crc64 .New (crc64 .MakeTable (crc64NVME )), integBuf12MB )
153+
146154cases := map [string ]map [string ]struct {
147- algorithm s3types.ChecksumAlgorithm
148- payload io.Reader
149- checksumCRC32 string
150- checksumCRC32C string
151- checksumSHA1 string
152- checksumSHA256 string
153- contentMD5 string
154- expectParts []s3types.CompletedPart
155- expectChecksumCRC32 string
156- expectChecksumCRC32C string
157- expectChecksumSHA1 string
158- expectChecksumSHA256 string
159- expectETag string
155+ algorithm s3types.ChecksumAlgorithm
156+ payload io.Reader
157+ checksumCRC32 string
158+ checksumCRC32C string
159+ checksumCRC64NVME string
160+ checksumSHA1 string
161+ checksumSHA256 string
162+ contentMD5 string
163+ expectParts []s3types.CompletedPart
164+ expectChecksumCRC32 string
165+ expectChecksumCRC32C string
166+ expectChecksumCRC64NVME string
167+ expectChecksumSHA1 string
168+ expectChecksumSHA256 string
169+ expectETag string
160170}{
161171"auto single part" : {
162172"no checksum algorithm passed" : {
@@ -176,6 +186,12 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
176186expectChecksumCRC32C : singlePartCRC32C ,
177187expectETag : singlePartETag ,
178188},
189+ "CRC64NVME" : {
190+ algorithm : s3types .ChecksumAlgorithmCrc64nvme ,
191+ payload : bytes .NewReader (singlePartBytes ),
192+ expectChecksumCRC64NVME : singlePartCRC64NVME ,
193+ expectETag : singlePartETag ,
194+ },
179195"SHA1" : {
180196algorithm : s3types .ChecksumAlgorithmSha1 ,
181197payload : bytes .NewReader (singlePartBytes ),
@@ -202,6 +218,12 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
202218expectChecksumCRC32C : singlePartCRC32C ,
203219expectETag : singlePartETag ,
204220},
221+ "CRC64NVME" : {
222+ payload : bytes .NewReader (singlePartBytes ),
223+ checksumCRC64NVME : singlePartCRC64NVME ,
224+ expectChecksumCRC64NVME : singlePartCRC64NVME ,
225+ expectETag : singlePartETag ,
226+ },
205227"SHA1" : {
206228payload : bytes .NewReader (singlePartBytes ),
207229checksumSHA1 : singlePartSHA1 ,
@@ -290,6 +312,29 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
290312expectChecksumCRC32C : multiPartCRC32C ,
291313expectETag : multiPartETag ,
292314},
315+ "CRC64NVME" : {
316+ algorithm : s3types .ChecksumAlgorithmCrc64nvme ,
317+ payload : bytes .NewReader (multiPartBytes ),
318+ expectParts : []s3types.CompletedPart {
319+ {
320+ ChecksumCRC64NVME : aws .String (singlePartCRC64NVME ),
321+ ETag : aws .String (singlePartETag ),
322+ PartNumber : aws .Int32 (1 ),
323+ },
324+ {
325+ ChecksumCRC64NVME : aws .String (singlePartCRC64NVME ),
326+ ETag : aws .String (singlePartETag ),
327+ PartNumber : aws .Int32 (2 ),
328+ },
329+ {
330+ ChecksumCRC64NVME : aws .String (multiPartTailCRC64NVME ),
331+ ETag : aws .String (multiPartTailETag ),
332+ PartNumber : aws .Int32 (3 ),
333+ },
334+ },
335+ expectChecksumCRC64NVME : multiPartCRC64NVME ,
336+ expectETag : multiPartETag ,
337+ },
293338"SHA1" : {
294339algorithm : s3types .ChecksumAlgorithmSha1 ,
295340payload : bytes .NewReader (multiPartBytes ),
@@ -386,6 +431,30 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
386431expectChecksumCRC32C : multiPartCRC32C ,
387432expectETag : multiPartETag ,
388433},
434+ "CRC64NVME" : {
435+ algorithm : s3types .ChecksumAlgorithmCrc64nvme ,
436+ payload : bytes .NewReader (multiPartBytes ),
437+ checksumCRC64NVME : multiPartCRC64NVME ,
438+ expectParts : []s3types.CompletedPart {
439+ {
440+ ChecksumCRC64NVME : aws .String (singlePartCRC64NVME ),
441+ ETag : aws .String (singlePartETag ),
442+ PartNumber : aws .Int32 (1 ),
443+ },
444+ {
445+ ChecksumCRC64NVME : aws .String (singlePartCRC64NVME ),
446+ ETag : aws .String (singlePartETag ),
447+ PartNumber : aws .Int32 (2 ),
448+ },
449+ {
450+ ChecksumCRC64NVME : aws .String (multiPartTailCRC64NVME ),
451+ ETag : aws .String (multiPartTailETag ),
452+ PartNumber : aws .Int32 (3 ),
453+ },
454+ },
455+ expectChecksumCRC64NVME : multiPartCRC64NVME ,
456+ expectETag : multiPartETag ,
457+ },
389458"SHA1" : {
390459algorithm : s3types .ChecksumAlgorithmSha1 ,
391460payload : bytes .NewReader (multiPartBytes ),
@@ -449,6 +518,7 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
449518ChecksumAlgorithm : c .algorithm ,
450519ChecksumCRC32 : toStringPtr (c .checksumCRC32 ),
451520ChecksumCRC32C : toStringPtr (c .checksumCRC32C ),
521+ ChecksumCRC64NVME : toStringPtr (c .checksumCRC64NVME ),
452522ChecksumSHA1 : toStringPtr (c .checksumSHA1 ),
453523ChecksumSHA256 : toStringPtr (c .checksumSHA256 ),
454524ContentMD5 : toStringPtr (c .contentMD5 ),
@@ -467,6 +537,9 @@ func TestInteg_UploadPresetChecksum(t *testing.T) {
467537if e , a := c .expectChecksumCRC32C , aws .ToString (out .ChecksumCRC32C ); e != a {
468538t .Errorf ("expect %v CRC32C checksum, got %v" , e , a )
469539}
540+ if e , a := c .expectChecksumCRC64NVME , aws .ToString (out .ChecksumCRC64NVME ); e != a {
541+ t .Errorf ("expect %v CRC64NVME checksum, got %v" , e , a )
542+ }
470543if e , a := c .expectChecksumSHA1 , aws .ToString (out .ChecksumSHA1 ); e != a {
471544t .Errorf ("expect %v SHA1 checksum, got %v" , e , a )
472545}
0 commit comments