internal ChunkedUploadWrapperStream(Stream stream, int wrappedStreamBufferSize, AWS4SigningResult headerSigningResult) : base(stream) { HeaderSigningResult = headerSigningResult; PreviousChunkSignature = headerSigningResult.Signature; _wrappedStreamBufferSize = wrappedStreamBufferSize; _inputBuffer = new byte[DefaultChunkSize]; _outputBuffer = new byte[CalculateChunkHeaderLength(DefaultChunkSize)]; // header+data #if BCL // if the wrapped stream implements encryption, switch to a read-and-copy // strategy for filling the chunk buffer var encryptionStream = SearchWrappedStream(s => { var encryptUploadPartStream = s as EncryptUploadPartStream; if (encryptUploadPartStream != null) { return(true); } var encryptStream = s as EncryptStream; return(encryptStream != null); }); if (encryptionStream != null) { _readStrategy = ReadStrategy.ReadAndCopy; } #endif }
public void ChecksumAndOtherTrailingHeaders() { var contentStream = new MemoryStream(Encoding.Default.GetBytes("Hello world")); var trailingHeaders = new Dictionary <string, string> { { "header-a", "value-a" }, { "header-b", "value-b" }, { "x-amz-checksum-sha256", "" } // checksum will be calculated as the stream is read then replaced at the end }; var headerSigningResult = new AWS4SigningResult(_accessKey, _fixedSigningTimestamp, "", "", _signingKey, _headerSignature); var wrappedStream = new ChunkedUploadWrapperStream(contentStream, 8192, headerSigningResult, CoreChecksumAlgorithm.SHA256, trailingHeaders); var actualContent = new StreamReader(wrappedStream).ReadToEnd(); var expectedContent = "B;chunk-signature=6a4d50a3307c001ad83900a73442136a0a0f203520fd8c0e966f655cc830bbe8\r\n" + "Hello world\r\n" + "0;chunk-signature=9384094dc67fd7c29a4c7e0aa3866233b3774e41d1470b8f51a96becbd91f60c\r\n" + "header-a:value-a\r\n" + "header-b:value-b\r\n" + "x-amz-checksum-sha256:ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\r\n" + "x-amz-trailer-signature:0e357651fe17d33ea0d4173b2fd745d596354a66347ee8b5e4de44036c62becb\r\n" + "\r\n"; Assert.AreEqual(expectedContent.Length, wrappedStream.Length); Assert.AreEqual(expectedContent, actualContent); }
public void NonChecksumTrailingHeaders() { var contentStream = new MemoryStream(Encoding.Default.GetBytes("Hello world")); var trailingHeaders = new Dictionary <string, string> { { "header-a", "value-a" }, { "header-b", "value-b" } }; var headerSigningResult = new AWS4SigningResult(_accessKey, _fixedSigningTimestamp, "", "", _signingKey, _headerSignature); var wrappedStream = new ChunkedUploadWrapperStream(contentStream, 8192, headerSigningResult, CoreChecksumAlgorithm.NONE, trailingHeaders); var actualContent = new StreamReader(wrappedStream).ReadToEnd(); var expectedContent = "B;chunk-signature=6a4d50a3307c001ad83900a73442136a0a0f203520fd8c0e966f655cc830bbe8\r\n" + "Hello world\r\n" + "0;chunk-signature=9384094dc67fd7c29a4c7e0aa3866233b3774e41d1470b8f51a96becbd91f60c\r\n" + "header-a:value-a\r\n" + "header-b:value-b\r\n" + "x-amz-trailer-signature:ff2899b910cb941057f921d11738b5d875f2e117ea9504cfea4f9c7a788a0852\r\n" + "\r\n"; Assert.AreEqual(expectedContent.Length, wrappedStream.Length); Assert.AreEqual(expectedContent, actualContent); }
public void LargeData() { var data = new string('a', 100000); var contentStream = new MemoryStream(Encoding.Default.GetBytes(data)); var trailingHeaders = new Dictionary <string, string> { { "x-amz-checksum-sha256", "" } // checksum will be calculated as the stream is read then replaced at the end }; var headerSigningResult = new AWS4SigningResult(_accessKey, _fixedSigningTimestamp, "", "", _signingKey, _headerSignature); var wrappedStream = new ChunkedUploadWrapperStream(contentStream, 8192, headerSigningResult, CoreChecksumAlgorithm.SHA256, trailingHeaders); var actualContent = new StreamReader(wrappedStream).ReadToEnd(); var expectedContent = "14000;chunk-signature=dd6818ebe851d9f6006431fac25c71960881bf8d86501344f19a43c1a2c2a9a7\r\n" + $"{new string('a', 81920)}\r\n" + "46A0;chunk-signature=88f059571f2bc312c8fd7ebd2082f587561ca83a6d5bb863e6e3d4ef78819256\r\n" + $"{new string('a', 18080)}\r\n" + "0;chunk-signature=07857eed4f1a53ae7d042e0c410053d610ed947827ca1c5572ed401666732805\r\n" + "x-amz-checksum-sha256:bRzyLXzAmwhd/CXuGh864CZYBMYHvCB0rSU7zIL9ge4=\r\n" + "x-amz-trailer-signature:cd8a0ba8bc4abaaa5f6e9921c30ca6e018110bcbaa3ea876e7b777b924bb4009\r\n" + "\r\n"; Assert.AreEqual(expectedContent.Length, wrappedStream.Length); Assert.AreEqual(expectedContent, actualContent); }
internal ChunkedUploadWrapperStream(Stream stream, int wrappedStreamBufferSize, AWS4SigningResult headerSigningResult) : base(stream) { HeaderSigningResult = headerSigningResult; PreviousChunkSignature = headerSigningResult.Signature; _wrappedStreamBufferSize = wrappedStreamBufferSize; _inputBuffer = new byte[DefaultChunkSize]; _outputBuffer = new byte[CalculateChunkHeaderLength(DefaultChunkSize)]; }
public void TestTrailingChecksum(string checksumKey, CoreChecksumAlgorithm algorithm, string expectedContent) { var contentStream = new MemoryStream(Encoding.Default.GetBytes("Hello world")); var trailingHeaders = new Dictionary <string, string> { { checksumKey, "" } // checksum will be calculated as the stream is read then replaced at the end }; var headerSigningResult = new AWS4SigningResult(_accessKey, _fixedSigningTimestamp, "", "", _signingKey, _headerSignature); var wrappedStream = new ChunkedUploadWrapperStream(contentStream, 8192, headerSigningResult, algorithm, trailingHeaders); var actualContent = new StreamReader(wrappedStream).ReadToEnd(); Assert.AreEqual(expectedContent.Length, wrappedStream.Length); Assert.AreEqual(expectedContent, actualContent); }
public void SmallBuffer() { var contentStream = new MemoryStream(Encoding.Default.GetBytes("Hello world")); var trailingHeaders = new Dictionary <string, string> { { "x-amz-checksum-sha256", "" } // checksum will be calculated as the stream is read then replaced at the end }; var headerSigningResult = new AWS4SigningResult(_accessKey, _fixedSigningTimestamp, "", "", _signingKey, _headerSignature); var wrappedStream = new ChunkedUploadWrapperStream(contentStream, 1, headerSigningResult, CoreChecksumAlgorithm.SHA256, trailingHeaders); var bytesRead = -1; var bufferSize = 1; var buffer = new byte[bufferSize]; var outputAsString = ""; while (bytesRead != 0) { bytesRead = wrappedStream.Read(buffer, 0, bufferSize); outputAsString += Encoding.Default.GetString(buffer, 0, bytesRead); } Assert.AreEqual(expectedSHA256Content.Length, wrappedStream.Length); Assert.AreEqual(expectedSHA256Content, outputAsString); }
public override void Sign(IRequest request, IClientConfig clientConfig, RequestMetrics metrics, string awsAccessKeyId, string awsSecretAccessKey) { AWS4Signer val = this.SelectSigner(this, _useSigV4, request, clientConfig) as AWS4Signer; if (val != null) { AmazonS3Uri amazonS3Uri; RegionEndpoint alternateEndpoint = default(RegionEndpoint); if (AmazonS3Uri.TryParseAmazonS3Uri(request.get_Endpoint(), out amazonS3Uri) && amazonS3Uri.Bucket != null && BucketRegionDetector.BucketRegionCache.TryGetValue(amazonS3Uri.Bucket, ref alternateEndpoint)) { request.set_AlternateEndpoint(alternateEndpoint); } AWS4SigningResult val2 = val.SignRequest(request, clientConfig, metrics, awsAccessKeyId, awsSecretAccessKey); request.get_Headers()["Authorization"] = val2.get_ForAuthorizationHeader(); if (request.get_UseChunkEncoding()) { request.set_AWS4SignerResult(val2); } } else { SignRequest(request, metrics, awsAccessKeyId, awsSecretAccessKey); } }