aboutsummaryrefslogtreecommitdiff
path: root/src/encoding
diff options
context:
space:
mode:
authorMichael Teichgraeber <mteichgraeber@gmx.de>2018-04-20 01:22:30 +0200
committerGopher Robot <gobot@golang.org>2023-03-28 16:22:36 +0000
commitf7156f63b52af3242e8415a209ff6fea119f5903 (patch)
tree9a706939a110e7cf8b0d4331df6ce1de676404e8 /src/encoding
parent4c49d52439805c248f4a01d529b90b22e821b7d6 (diff)
downloadgo-f7156f63b52af3242e8415a209ff6fea119f5903.tar.xz
encoding/asn1: support fractions of a second when unmarshaling GeneralizedTime
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>
Diffstat (limited to 'src/encoding')
-rw-r--r--src/encoding/asn1/asn1.go2
-rw-r--r--src/encoding/asn1/asn1_test.go4
2 files changed, 5 insertions, 1 deletions
diff --git a/src/encoding/asn1/asn1.go b/src/encoding/asn1/asn1.go
index 2e320897e3..f743cd6f69 100644
--- a/src/encoding/asn1/asn1.go
+++ b/src/encoding/asn1/asn1.go
@@ -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 {
diff --git a/src/encoding/asn1/asn1_test.go b/src/encoding/asn1/asn1_test.go
index 90bdfcddf9..0e67dbf396 100644
--- a/src/encoding/asn1/asn1_test.go
+++ b/src/encoding/asn1/asn1_test.go
@@ -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