private static void VerifyExpectedRequest(Rfc3161TimestampRequest request, bool viaSpan) { // Captured with Fiddler from a CryptRetrieveTimestamp call const string ExpectedHex = "30390201013031300D06096086480165030402010500042011806C2441295EA6" + "97EA96EE4247C0F9C71EE7638863CB8E29CD941A488FCB5A0101FF"; Assert.Equal(1, request.Version); Assert.Equal( "11806C2441295EA697EA96EE4247C0F9C71EE7638863CB8E29CD941A488FCB5A", request.GetMessageHash().ByteArrayToHex()); Assert.False(request.GetNonce().HasValue, "request.GetNonce().HasValue"); Assert.Equal("2.16.840.1.101.3.4.2.1", request.HashAlgorithmId.Value); Assert.Null(request.RequestedPolicyId); Assert.True(request.RequestSignerCertificate, "request.RequestSignerCertificate"); Assert.False(request.HasExtensions); if (viaSpan) { // Twice as big as it needs to be. byte[] buf = new byte[ExpectedHex.Length]; const byte FillByte = 0x55; buf.AsSpan().Fill(FillByte); // Too small Assert.False(request.TryEncode(Span <byte> .Empty, out int bytesWritten)); Assert.Equal(0, bytesWritten); const int WriteOffset = 7; // Too small Span <byte> dest = new Span <byte>(buf, WriteOffset, (ExpectedHex.Length / 2) - 1); Assert.False(request.TryEncode(dest, out bytesWritten)); Assert.Equal(0, bytesWritten); Assert.Equal(new string('5', buf.Length * 2), buf.ByteArrayToHex()); // Bigger than needed dest = new Span <byte>(buf, WriteOffset, buf.Length - WriteOffset); Assert.True(request.TryEncode(dest, out bytesWritten)); Assert.Equal(ExpectedHex.Length / 2, bytesWritten); Assert.Equal(ExpectedHex, dest.Slice(0, bytesWritten).ByteArrayToHex()); Assert.Equal(FillByte, buf[WriteOffset - 1]); Assert.Equal(FillByte, buf[WriteOffset + bytesWritten]); // Reset dest.Fill(FillByte); // Perfectly sized dest = dest.Slice(0, bytesWritten); Assert.True(request.TryEncode(dest, out bytesWritten)); Assert.Equal(ExpectedHex.Length / 2, bytesWritten); Assert.Equal(ExpectedHex, dest.ByteArrayToHex()); Assert.Equal(FillByte, buf[WriteOffset - 1]); Assert.Equal(FillByte, buf[WriteOffset + bytesWritten]); } else { byte[] encoded = request.Encode(); Assert.Equal(ExpectedHex, encoded.ByteArrayToHex()); } }