]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/asn1: support fractions of a second when unmarshaling GeneralizedTime
authorMichael Teichgraeber <mteichgraeber@gmx.de>
Thu, 19 Apr 2018 23:22:30 +0000 (01:22 +0200)
committerGopher Robot <gobot@golang.org>
Tue, 28 Mar 2023 16:22:36 +0000 (16:22 +0000)
A GeneralizedTime value may contain an optional fractional seconds
element (according to X.680 46.2, restricted by X.690 11.7.3). This
change adds support for this fractional part, up to nine digits, so that
Unmarshal won't fail when decoding a DER encoded GeneralizedTime value
with fractional digits.  Also, test cases related to this change have
been added.

X.680 and X.690 can be found at:
https://www.itu.int/rec/T-REC-X.680
https://www.itu.int/rec/T-REC-X.690

Fixes #15842

Change-Id: If217c007e01b686db508a940e9e2ed3bfb901879
Reviewed-on: https://go-review.googlesource.com/c/go/+/108355
Run-TryBot: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/encoding/asn1/asn1.go
src/encoding/asn1/asn1_test.go

index 2e320897e31dc64455f96e66204a627123ebc906..f743cd6f69e9568db4d7907c8d71ad55f6584efa 100644 (file)
@@ -365,7 +365,7 @@ func parseUTCTime(bytes []byte) (ret time.Time, err error) {
 // parseGeneralizedTime parses the GeneralizedTime from the given byte slice
 // and returns the resulting time.
 func parseGeneralizedTime(bytes []byte) (ret time.Time, err error) {
-       const formatStr = "20060102150405Z0700"
+       const formatStr = "20060102150405.999999999Z0700"
        s := string(bytes)
 
        if ret, err = time.Parse(formatStr, s); err != nil {
index 90bdfcddf994ede1232f62d67428f29748f40d84..0e67dbf3966bc5e8a92351070fb6913f019d6efe 100644 (file)
@@ -323,6 +323,10 @@ func TestUTCTime(t *testing.T) {
 var generalizedTimeTestData = []timeTest{
        {"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)},
        {"20100102030405", false, time.Time{}},
+       {"20100102030405.123456Z", true, time.Date(2010, 01, 02, 03, 04, 05, 123456e3, time.UTC)},
+       {"20100102030405.123456", false, time.Time{}},
+       {"20100102030405.Z", false, time.Time{}},
+       {"20100102030405.", false, time.Time{}},
        {"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))},
        {"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))},
        /* These are invalid times. However, the time package normalises times