Skip to content

Commit 3bef7e3

Browse files
committed
.
1 parent c821821 commit 3bef7e3

3 files changed

Lines changed: 34 additions & 47 deletions

File tree

src/DeterministicIoPackaging/DeterministicIoPackaging.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
</PropertyGroup>
55
<ItemGroup>
66
<PackageReference Include="Polyfill" PrivateAssets="all" />
7+
<PackageReference Include="System.IO.Hashing" />
78
<PackageReference Include="ProjectDefaults" PrivateAssets="all" />
89
<PackageReference Include="Microsoft.Sbom.Targets" PrivateAssets="all" Condition="'$(CI)' == 'true'" />
910
</ItemGroup>
1011
<ItemGroup Condition="'$(TargetFramework)' == 'net472' OR '$(TargetFramework)' == 'net48'">
1112
<PackageReference Include="System.Threading.Tasks.Extensions" />
1213
<PackageReference Include="System.Buffers" />
13-
<PackageReference Include="System.IO.Hashing" />
1414
<PackageReference Include="System.IO.Compression" />
1515
<PackageReference Include="System.Memory" />
1616
</ItemGroup>

src/DeterministicIoPackaging/PngNormalizer.cs

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ static bool ProcessChunk(byte[] header, byte[] body, int chunkLength, Stream tar
7272
if (!flushedIdat && idatData.Length > 0)
7373
{
7474
flushedIdat = true;
75-
WriteNormalizedIdat(target, idatData);
75+
WriteNormalizedIdat(target, idatData.GetBuffer(), (int) idatData.Length);
7676
}
7777

7878
target.Write(header);
@@ -82,44 +82,31 @@ static bool ProcessChunk(byte[] header, byte[] body, int chunkLength, Stream tar
8282
return isIend;
8383
}
8484

85-
static void WriteNormalizedIdat(Stream target, MemoryStream idatData)
85+
static void WriteNormalizedIdat(Stream target, byte[] zlibBytes, int zlibLength)
8686
{
87-
var zlibBytes = idatData.ToArray();
88-
89-
byte[] decompressed;
90-
using (var zlibInput = new MemoryStream(zlibBytes))
87+
using var decompressedStream = new MemoryStream();
88+
using (var zlibInput = new MemoryStream(zlibBytes, 0, zlibLength))
9189
using (var zlibStream = new ZLibStream(zlibInput, CompressionMode.Decompress))
92-
using (var decompressedStream = new MemoryStream())
9390
{
9491
zlibStream.CopyTo(decompressedStream);
95-
decompressed = decompressedStream.ToArray();
9692
}
9793

98-
byte[] newIdatData;
99-
using (var compressOutput = new MemoryStream())
94+
using var compressOutput = new MemoryStream();
95+
using (var zlibStream = new ZLibStream(compressOutput, CompressionLevel.Optimal, leaveOpen: true))
10096
{
101-
using (var zlibStream = new ZLibStream(compressOutput, CompressionLevel.Optimal, leaveOpen: true))
102-
{
103-
zlibStream.Write(decompressed);
104-
}
105-
106-
newIdatData = compressOutput.ToArray();
97+
zlibStream.Write(decompressedStream.GetBuffer(), 0, (int) decompressedStream.Length);
10798
}
10899

109-
WriteChunk(target, idatType, newIdatData);
110-
}
111-
112-
static void WriteChunk(Stream target, byte[] type, byte[] data)
113-
{
100+
var length = (int) compressOutput.Length;
114101
var header = new byte[4];
115-
BinaryPrimitives.WriteInt32BigEndian(header, data.Length);
102+
BinaryPrimitives.WriteInt32BigEndian(header, length);
116103
target.Write(header);
117-
target.Write(type);
118-
target.Write(data);
104+
target.Write(idatType);
105+
target.Write(compressOutput.GetBuffer(), 0, length);
119106

120107
var crc = new Crc32();
121-
crc.Append(type);
122-
crc.Append(data);
108+
crc.Append(idatType);
109+
crc.Append(compressOutput.GetBuffer().AsSpan(0, length));
123110
var crcBytes = new byte[4];
124111
BinaryPrimitives.WriteUInt32BigEndian(crcBytes, crc.GetCurrentHashAsUInt32());
125112
target.Write(crcBytes);

src/Tests/PngNormalizerTests.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -179,39 +179,39 @@ static void AssertValidPng(byte[] data)
179179

180180
static byte[] BuildPng(CompressionLevel level)
181181
{
182-
using var ms = new MemoryStream();
183-
ms.Write(pngSignature);
182+
using var stream = new MemoryStream();
183+
stream.Write(pngSignature);
184184

185185
var ihdrData = new byte[13];
186186
BinaryPrimitives.WriteInt32BigEndian(ihdrData.AsSpan(0), 2); // width
187187
BinaryPrimitives.WriteInt32BigEndian(ihdrData.AsSpan(4), 2); // height
188188
ihdrData[8] = 8; // bit depth
189189
ihdrData[9] = 2; // color type: RGB
190-
WriteChunk(ms, ihdrType, ihdrData);
190+
WriteChunk(stream, ihdrType, ihdrData);
191191

192192
byte[] rawPixels =
193193
[
194194
0, 255, 0, 0, 255, 0, 0, // row 1: filter=0, red, red
195195
0, 255, 0, 0, 255, 0, 0 // row 2: filter=0, red, red
196196
];
197197

198-
WriteChunk(ms, idatType, ZlibCompress(rawPixels, level));
199-
WriteChunk(ms, iendType, Array.Empty<byte>());
198+
WriteChunk(stream, idatType, ZlibCompress(rawPixels, level));
199+
WriteChunk(stream, iendType, Array.Empty<byte>());
200200

201-
return ms.ToArray();
201+
return stream.ToArray();
202202
}
203203

204204
static byte[] BuildPngWithSplitIdat()
205205
{
206-
using var ms = new MemoryStream();
207-
ms.Write(pngSignature);
206+
using var stream = new MemoryStream();
207+
stream.Write(pngSignature);
208208

209209
var ihdrData = new byte[13];
210210
BinaryPrimitives.WriteInt32BigEndian(ihdrData.AsSpan(0), 2);
211211
BinaryPrimitives.WriteInt32BigEndian(ihdrData.AsSpan(4), 2);
212212
ihdrData[8] = 8;
213213
ihdrData[9] = 2;
214-
WriteChunk(ms, ihdrType, ihdrData);
214+
WriteChunk(stream, ihdrType, ihdrData);
215215

216216
byte[] rawPixels =
217217
[
@@ -221,37 +221,37 @@ static byte[] BuildPngWithSplitIdat()
221221

222222
var zlibData = ZlibCompress(rawPixels, CompressionLevel.Fastest);
223223
var mid = zlibData.Length / 2;
224-
WriteChunk(ms, idatType, zlibData.AsSpan(0, mid).ToArray());
225-
WriteChunk(ms, idatType, zlibData.AsSpan(mid).ToArray());
226-
WriteChunk(ms, iendType, Array.Empty<byte>());
224+
WriteChunk(stream, idatType, zlibData.AsSpan(0, mid).ToArray());
225+
WriteChunk(stream, idatType, zlibData.AsSpan(mid).ToArray());
226+
WriteChunk(stream, iendType, Array.Empty<byte>());
227227

228-
return ms.ToArray();
228+
return stream.ToArray();
229229
}
230230

231231
static byte[] BuildPngWithTextChunk(string keyword, string text)
232232
{
233-
using var ms = new MemoryStream();
234-
ms.Write(pngSignature);
233+
using var stream = new MemoryStream();
234+
stream.Write(pngSignature);
235235

236236
var ihdrData = new byte[13];
237237
BinaryPrimitives.WriteInt32BigEndian(ihdrData.AsSpan(0), 1);
238238
BinaryPrimitives.WriteInt32BigEndian(ihdrData.AsSpan(4), 1);
239239
ihdrData[8] = 8;
240240
ihdrData[9] = 2;
241-
WriteChunk(ms, ihdrType, ihdrData);
241+
WriteChunk(stream, ihdrType, ihdrData);
242242

243243
var keywordBytes = Encoding.Latin1.GetBytes(keyword);
244244
var textBytes = Encoding.Latin1.GetBytes(text);
245245
var textChunkData = new byte[keywordBytes.Length + 1 + textBytes.Length];
246246
keywordBytes.CopyTo(textChunkData, 0);
247247
textChunkData[keywordBytes.Length] = 0;
248248
textBytes.CopyTo(textChunkData, keywordBytes.Length + 1);
249-
WriteChunk(ms, textType, textChunkData);
249+
WriteChunk(stream, textType, textChunkData);
250250

251-
WriteChunk(ms, idatType, ZlibCompress([0, 255, 0, 0], CompressionLevel.Fastest));
252-
WriteChunk(ms, iendType, []);
251+
WriteChunk(stream, idatType, ZlibCompress([0, 255, 0, 0], CompressionLevel.Fastest));
252+
WriteChunk(stream, iendType, []);
253253

254-
return ms.ToArray();
254+
return stream.ToArray();
255255
}
256256

257257
static byte[] ZlibCompress(byte[] data, CompressionLevel level)

0 commit comments

Comments
 (0)