Add HashData/TryHashData/HashDataAsync polyfills for MD5, SHA1, SHA256, SHA384, SHA512 - #126
Conversation
… SHA256, SHA384, SHA512 Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/c63e2bb4-0293-4830-ad77-809fd431f85c Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
…ream directly Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/c63e2bb4-0293-4830-ad77-809fd431f85c Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
|
@copilot delegate methods to each other as much as possible to reduce LOC and improve self-testing |
Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/d2868d3c-91cb-44e1-93ed-5fa411112785 Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
… improve self-testing Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/0d5e3b8b-9d21-4e50-880b-7b41375adbe7 Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
Done in e00a241. For all 5 Net50 algorithms the delegation chain is now:
Net70 was already well-chained ( |
…lyfill callees before callers Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/f5d387d9-adf9-45b0-9ea5-d2ba0158a16c Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/f182e29d-b1b8-4eba-a869-7cf0b22ee1d2 Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
…below main TFM guard in polyfills Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/15604d40-08a8-4a8c-beb9-539e378e5850 Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/e9d4c2e3-ddbe-4368-8385-6108659223d5 Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## prime #126 +/- ##
==========================================
+ Coverage 90.43% 90.93% +0.49%
==========================================
Files 289 310 +21
Lines 5070 5866 +796
Branches 419 429 +10
==========================================
+ Hits 4585 5334 +749
- Misses 389 426 +37
- Partials 96 106 +10 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
This PR adds PolyShim polyfills for the one-shot hashing APIs introduced in newer .NET versions—HashData, TryHashData, and HashDataAsync—for MD5 and the SHA* family, so consumers can hash buffers/streams without manually creating HashAlgorithm instances.
Changes:
- Added .NET 5-era
HashData/TryHashDatapolyfills for MD5/SHA1/SHA256/SHA384/SHA512. - Added .NET 7-era stream-based
HashData(Stream)andHashDataAsync(...)polyfills for the same algorithms. - Added/updated tests and refreshed
Signatures.mdto reflect the new surface area.
Reviewed changes
Copilot reviewed 22 out of 22 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| Signatures.md | Updates the generated public API signature listing to include new hash APIs. |
| PolyShim/Net70/MD5.cs | Adds .NET 7-style stream hashing APIs for MD5. |
| PolyShim/Net70/SHA1.cs | Adds .NET 7-style stream hashing APIs for SHA1. |
| PolyShim/Net70/SHA256.cs | Adds .NET 7-style stream hashing APIs for SHA256. |
| PolyShim/Net70/SHA384.cs | Adds .NET 7-style stream hashing APIs for SHA384. |
| PolyShim/Net70/SHA512.cs | Adds .NET 7-style stream hashing APIs for SHA512. |
| PolyShim/Net50/MD5.cs | Adds .NET 5-style HashData/TryHashData polyfills for MD5. |
| PolyShim/Net50/SHA1.cs | Adds .NET 5-style HashData/TryHashData polyfills for SHA1. |
| PolyShim/Net50/SHA256.cs | Adds .NET 5-style HashData/TryHashData polyfills for SHA256. |
| PolyShim/Net50/SHA384.cs | Adds .NET 5-style HashData/TryHashData polyfills for SHA384. |
| PolyShim/Net50/SHA512.cs | Adds .NET 5-style HashData/TryHashData polyfills for SHA512. |
| PolyShim/Net50/HashAlgorithm.cs | Adds a HashAlgorithm.ComputeHashAsync(Stream, CancellationToken) polyfill used by the stream hashing APIs. |
| PolyShim.Tests/Net70/MD5Tests.cs | Tests the stream-based async hashing destination overload for MD5. |
| PolyShim.Tests/Net70/SHA1Tests.cs | Tests the stream-based async hashing destination overload for SHA1. |
| PolyShim.Tests/Net70/SHA256Tests.cs | Tests the stream-based async hashing destination overload for SHA256. |
| PolyShim.Tests/Net70/SHA384Tests.cs | Tests the stream-based async hashing destination overload for SHA384. |
| PolyShim.Tests/Net70/SHA512Tests.cs | Tests the stream-based async hashing destination overload for SHA512. |
| PolyShim.Tests/Net50/MD5Tests.cs | Tests HashData and TryHashData behavior for MD5. |
| PolyShim.Tests/Net50/SHA1Tests.cs | Tests HashData and TryHashData behavior for SHA1. |
| PolyShim.Tests/Net50/SHA256Tests.cs | Tests HashData and TryHashData behavior for SHA256. |
| PolyShim.Tests/Net50/SHA384Tests.cs | Tests HashData and TryHashData behavior for SHA384. |
| PolyShim.Tests/Net50/SHA512Tests.cs | Tests HashData and TryHashData behavior for SHA512. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@copilot please fix formatting errors |
Agent-Logs-Url: https://github.com/Tyrrrz/PolyShim/sessions/933cba9e-88c6-4a65-b53a-d55e54e11a01 Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
Polyfills the static
HashData,TryHashData, andHashDataAsyncmethods introduced in .NET 5–7 for MD5, SHA1, SHA256, SHA384, and SHA512, enabling one-shot hashing without manually instantiating aHashAlgorithm.Net50 —
PolyShim/Net50/<Algorithm>.csGuard:
(NETCOREAPP && !NET5_0_OR_GREATER) || NETFRAMEWORK || NETSTANDARDHashData(byte[])→byte[](primary; creates the hasher and callsComputeHash)HashData(ReadOnlySpan<byte>)→byte[](delegates viaToArray())HashData(ReadOnlySpan<byte>, Span<byte>)→intTryHashData(ReadOnlySpan<byte>, Span<byte>, out int)→boolNet50 —
PolyShim/Net50/HashAlgorithm.csGuard:
(NETCOREAPP && !NET5_0_OR_GREATER) || NETFRAMEWORK || NETSTANDARDComputeHashAsync(Stream, CancellationToken)→Task<byte[]>(polyfilled viaTask.Run)Net70 —
PolyShim/Net70/<Algorithm>.csGuard:
(NETCOREAPP && !NET7_0_OR_GREATER) || NETFRAMEWORK || NETSTANDARDHashData(Stream)→byte[]HashDataAsync(Stream, CancellationToken)→ValueTask<byte[]>(delegates toHashAlgorithm.ComputeHashAsync)HashDataAsync(Stream, Memory<byte>, CancellationToken)→ValueTask<int>Async methods are gated on
#if FEATURE_TASK. All crypto-using code is gated on#if !NETSTANDARD || NETSTANDARD1_3_OR_GREATERsince these types aren't available before netstandard1.3.HashDataAsync(Stream, CT)creates a hash instance and delegates toComputeHashAsync(Stream, CT), which is itself polyfilled viaTask.Run(() => ComputeHash(stream), cancellationToken)for pre-.NET 5 targets.