crypto/md5 — validation proof

Go’s own crypto/md5 test suite, converted to C# by go2cs, built against the converted standard library, run under the Go-semantics test host, and compared verdict for verdict against a clean go test -json baseline of the same sources. This page is generated by the converter from that comparison — it is the evidence behind the crypto/md5 row in Validated Test Packages.

Validated 2026-10-25 · converter 3e3f18925

14 matched · 1 disclosed — Go 1.26.10, windows/amd64, converted package src/core/crypto/md5.

Measured at Release (tiered JIT off), oracle go version go1.26.10 windows/amd64.

Verdicts

Test go test go2cs
TestAllocations pass fail (disclosed)
TestBlockGeneric pass pass
TestExtraLarge pass pass
TestExtraMethods pass pass
TestGolden pass pass
TestGoldenMarshal pass pass
TestLarge pass pass
TestLargeHashes pass pass
TestMD5Hash pass pass
TestMD5Hash/Clone pass pass
TestMD5Hash/OutOfBoundsRead pass pass
TestMD5Hash/ResetState pass pass
TestMD5Hash/StatefulWrite pass pass
TestMD5Hash/SumAppend pass pass
TestMD5Hash/WriteWithoutError pass pass

Disclosed divergences

A disclosed divergence is a specific Go assertion this conversion does not satisfy — not a skipped test and not a tolerance. Each one is pinned by exact failure signature in the package’s hand-owned go2cs_test_disclosures.json; a disclosed test that fails any other way is still a hard mismatch.

The Class column says which kind each one is: a deferred entry is an assertion the managed CLR can meet, pinned against the named plan that will retire it; every other class is one it provably cannot satisfy.

Test Class Pinned reason
TestAllocations deferred want-zero AllocsPerRun assert: Sum copies the digest (d0 := *d) so the caller can keep writing, and that copy must deep-copy the digest’s [4]uint32 state and [64]byte block — golib’s array is a struct over a heap T[], so the copy is two managed allocations where Go's is stack-resident; Write/Sum also allocate through the hash.Hash interface surface. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O1): alloc-profile -> deferred. The fixed-array family (a Go array VALUE emitted as golib array over a heap T[]) is deferred, never structural: net10.0 has value-typed fixed storage (DESIGN-zh-box-reduction.md:519-521). 6 per run = 5 class-4 + 1 box, read at md5.cs:167-198. The reason above names the same copy; its 'Write/Sum also allocate through the hash.Hash interface surface' is not in the counted figure. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 6 per run at go1.24.13 to 8 per run on windows and linux; the test body is identical at go1.24.13 and go1.26.10.

Excluded declarations

Declarations filtered from both sides of the comparison, and therefore not claimed above: Benchmark, Fuzz and Example declarations the converted host does not execute, plus any test requiring a capability the managed runtime does not provide — a testing member the host has not implemented, or a platform behavior it provably cannot reproduce. Each is named with the capability it needs.