Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corefx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Barton <jbarton@microsoft.com>2017-12-19 03:31:12 +0300
committerJeremy Barton <jbarton@microsoft.com>2017-12-19 07:41:16 +0300
commitdfbd27b1a79ed653dd6fb4213dc594ac400567e8 (patch)
tree3518724e7cda0c28664d5c0b4f5f34409065c6b2 /src/System.Security.Cryptography.Encoding
parent075cec7a82fe2cdec403315c3350b88973119abe (diff)
Make GeneralizedTime correctly read down to the tick
TimeSpan.From* rounds to the millisecond, but the writer is 10000x as precise, so make the reader be as precise as the writer. For future work around cryptographic timestamps the microseconds and hundred-nanoseconds might be relevant.
Diffstat (limited to 'src/System.Security.Cryptography.Encoding')
-rw-r--r--src/System.Security.Cryptography.Encoding/tests/Asn1/Reader/ReadGeneralizedTime.cs26
-rw-r--r--src/System.Security.Cryptography.Encoding/tests/Asn1/Serializer/SimpleDeserialize.cs2
2 files changed, 25 insertions, 3 deletions
diff --git a/src/System.Security.Cryptography.Encoding/tests/Asn1/Reader/ReadGeneralizedTime.cs b/src/System.Security.Cryptography.Encoding/tests/Asn1/Reader/ReadGeneralizedTime.cs
index 02dfa3810d..6798b068a4 100644
--- a/src/System.Security.Cryptography.Encoding/tests/Asn1/Reader/ReadGeneralizedTime.cs
+++ b/src/System.Security.Cryptography.Encoding/tests/Asn1/Reader/ReadGeneralizedTime.cs
@@ -53,13 +53,13 @@ namespace System.Security.Cryptography.Tests.Asn1
// yyyyMMddHHmmss+HHmm (20161106012345+0118)
[InlineData(PublicEncodingRules.BER, "181332303136313130363031323334352B30313138", 2016, 11, 6, 1, 23, 45, 0, 1, 18)]
// yyyyMMddHHmmss.secondFrac (20161106012345.6789) - Ambiguous time due to DST "fall back" in US & Canada
- [InlineData(PublicEncodingRules.BER, "181332303136313130363031323334352E36373839", 2016, 11, 6, 1, 23, 45, 679, null, 0)]
+ [InlineData(PublicEncodingRules.BER, "181332303136313130363031323334352E36373839", 2016, 11, 6, 1, 23, 45, 678, null, 0)]
// yyyyMMddHHmmss,secondFracZ (20161106012345,7654Z)
[InlineData(PublicEncodingRules.BER, "181432303136313130363031323334352C373635345A", 2016, 11, 6, 1, 23, 45, 765, 0, 0)]
// yyyyMMddHHmmss.secondFrac-HH (20161106012345.001-01)
[InlineData(PublicEncodingRules.BER, "181532303136313130363031323334352E3030312D3031", 2016, 11, 6, 1, 23, 45, 1, -1, 0)]
// yyyyMMddHHmmss,secondFrac+HHmm (20161106012345,0009+0118)
- [InlineData(PublicEncodingRules.BER, "181832303136313130363031323334352C303030392B30313138", 2016, 11, 6, 1, 23, 45, 1, 1, 18)]
+ [InlineData(PublicEncodingRules.BER, "181832303136313130363031323334352C303030392B30313138", 2016, 11, 6, 1, 23, 45, 0, 1, 18)]
// yyyyMMddHHmmssZ (20161106012345Z)
[InlineData(PublicEncodingRules.CER, "180F32303136313130363031323334355A", 2016, 11, 6, 1, 23, 45, 0, 0, 0)]
@@ -208,6 +208,27 @@ namespace System.Security.Cryptography.Tests.Asn1
Assert.True(derReader.HasData, "derReader.HasData");
}
+ [Theory]
+ [InlineData(PublicEncodingRules.BER, "2017121900.06861111087Z")]
+ [InlineData(PublicEncodingRules.BER, "201712190004.11666665167Z")]
+ [InlineData(PublicEncodingRules.BER, "201712190004.11666665167Z")]
+ [InlineData(PublicEncodingRules.BER, "20171219000406.9999991Z")]
+ [InlineData(PublicEncodingRules.CER, "20171219000406.9999991Z")]
+ [InlineData(PublicEncodingRules.DER, "20171219000406.9999991Z")]
+ public static void MaximumEffectivePrecision(PublicEncodingRules ruleSet, string dateAscii)
+ {
+ DateTimeOffset expectedTime = new DateTimeOffset(2017, 12, 19, 0, 4, 6, TimeSpan.Zero);
+ expectedTime += new TimeSpan(TimeSpan.TicksPerSecond - 9);
+
+ byte[] inputData = new byte[dateAscii.Length + 2];
+ inputData[0] = 0x18;
+ inputData[1] = (byte)dateAscii.Length;
+ Text.Encoding.ASCII.GetBytes(dateAscii, 0, dateAscii.Length, inputData, 2);
+
+ AsnReader reader = new AsnReader(inputData, (AsnEncodingRules)ruleSet);
+ Assert.Equal(expectedTime, reader.GetGeneralizedTime());
+ }
+
[Fact]
public static void ExcessivelyPreciseFraction()
{
@@ -218,6 +239,7 @@ namespace System.Security.Cryptography.Tests.Asn1
Assert.False(berReader.HasData, "berReader.HasData");
DateTimeOffset expected = new DateTimeOffset(2017, 9, 21, 18, 0, 44, 444, TimeSpan.Zero);
+ expected += new TimeSpan(4440);
Assert.Equal(expected, value);
}
diff --git a/src/System.Security.Cryptography.Encoding/tests/Asn1/Serializer/SimpleDeserialize.cs b/src/System.Security.Cryptography.Encoding/tests/Asn1/Serializer/SimpleDeserialize.cs
index 2fe1e1acb4..a99e323abc 100644
--- a/src/System.Security.Cryptography.Encoding/tests/Asn1/Serializer/SimpleDeserialize.cs
+++ b/src/System.Security.Cryptography.Encoding/tests/Asn1/Serializer/SimpleDeserialize.cs
@@ -133,7 +133,7 @@ namespace System.Security.Cryptography.Tests.Asn1
Assert.Equal(new byte[] { 0, 1, 254, 127, 255 }, atst.LittleUInts);
Assert.Equal(new DateTimeOffset(1950, 1, 2, 12, 34, 56, TimeSpan.Zero), atst.UtcTime2049);
Assert.Equal(new DateTimeOffset(2050, 1, 2, 12, 34, 56, TimeSpan.Zero), atst.UtcTime2099);
- Assert.Equal(new DateTimeOffset(2016, 11, 6, 1, 23, 45, 765, TimeSpan.Zero), atst.GeneralizedTimeWithFractions);
+ Assert.Equal(new DateTimeOffset(2016, 11, 6, 1, 23, 45, TimeSpan.Zero) + new TimeSpan(7654000), atst.GeneralizedTimeWithFractions);
Assert.Equal(new DateTimeOffset(2016, 11, 6, 1, 23, 45, TimeSpan.Zero), atst.GeneralizedTimeNoFractions);
Assert.Equal(BigInteger.Parse("0102030405060708090A0B0C0D0E0F", NumberStyles.HexNumber), atst.BigInteger);
}