From cf609dbc4bcde2ac63a737907b8a3ef04454fdd7d5a12882414996c17c48de2b Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Tue, 14 Jan 2025 11:38:11 +0300 Subject: [PATCH] =?utf8?q?Ability=20to=20skip=20UTC=E2=86=92TAI=20conversi?= =?utf8?q?on=20during=20encoding?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- go/cmd/test-vector-anys/main.go | 2 +- go/encode.go | 25 ++++++++++++++++--------- go/fuzz_test.go | 2 +- go/pki/av.go | 2 +- go/pki/cer.go | 2 +- go/pki/cmd/kekscertool/main.go | 4 ++-- go/pki/cmd/kekssdtool/main.go | 2 +- go/pki/signed-data.go | 2 +- 8 files changed, 24 insertions(+), 17 deletions(-) diff --git a/go/cmd/test-vector-anys/main.go b/go/cmd/test-vector-anys/main.go index a5d232a..650eee1 100644 --- a/go/cmd/test-vector-anys/main.go +++ b/go/cmd/test-vector-anys/main.go @@ -104,7 +104,7 @@ func main() { "uuid": uuid.MustParse("0e875e3f-d385-49eb-87b4-be42d641c367"), } var buf bytes.Buffer - _, err := keks.Encode(&buf, data) + _, err := keks.Encode(&buf, data, nil) if err != nil { log.Fatal(err) } diff --git a/go/encode.go b/go/encode.go index 6dcbc29..cd478f1 100644 --- a/go/encode.go +++ b/go/encode.go @@ -33,7 +33,12 @@ import ( var bigIntZero = big.NewInt(0) -func Encode(w io.Writer, v any) (written int64, err error) { +type EncodeOpts struct { + // Do not convert time.Time to TAI, assume no conversion is needed. + LeaveTAI bool +} + +func Encode(w io.Writer, v any, opts *EncodeOpts) (written int64, err error) { if v == nil { return ByteEncode(w, byte(AtomNIL)) } @@ -49,7 +54,9 @@ func Encode(w io.Writer, v any) (written int64, err error) { case BlobReader: return BlobEncode(w, v.ChunkLen, v.R) case time.Time: - v = tai64n.Leapsecs.Add(v) + if opts == nil || !opts.LeaveTAI { + v = tai64n.Leapsecs.Add(v) + } if v.Nanosecond() > 0 { var tai tai64n.TAI64N tai.FromTime(v) @@ -108,7 +115,7 @@ func Encode(w io.Writer, v any) (written int64, err error) { if vv.IsNil() { return ByteEncode(w, byte(AtomNIL)) } - return Encode(w, vv.Elem().Interface()) + return Encode(w, vv.Elem().Interface(), opts) case reflect.Slice: _, err = ByteEncode(w, byte(AtomList)) if err != nil { @@ -118,7 +125,7 @@ func Encode(w io.Writer, v any) (written int64, err error) { var n64 int64 if anys, ok := v.([]any); ok { for _, v := range anys { - n64, err = Encode(w, v) + n64, err = Encode(w, v, opts) written += n64 if err != nil { return @@ -126,7 +133,7 @@ func Encode(w io.Writer, v any) (written int64, err error) { } } else { for i := 0; i < vv.Len(); i++ { - n64, err = Encode(w, vv.Index(i).Interface()) + n64, err = Encode(w, vv.Index(i).Interface(), opts) written += n64 if err != nil { return @@ -154,7 +161,7 @@ func Encode(w io.Writer, v any) (written int64, err error) { if err != nil { return } - n64, err = Encode(w, vv.MapIndex(k).Interface()) + n64, err = Encode(w, vv.MapIndex(k).Interface(), opts) written += n64 if err != nil { return @@ -217,7 +224,7 @@ func Encode(w io.Writer, v any) (written int64, err error) { if err != nil { return } - n64, err = Encode(w, fv.Interface()) + n64, err = Encode(w, fv.Interface(), opts) written += n64 if err != nil { return @@ -234,8 +241,8 @@ func Encode(w io.Writer, v any) (written int64, err error) { return } -func EncodeBuf(v any) ([]byte, error) { +func EncodeBuf(v any, opts *EncodeOpts) ([]byte, error) { var b bytes.Buffer - _, err := Encode(&b, v) + _, err := Encode(&b, v, opts) return b.Bytes(), err } diff --git a/go/fuzz_test.go b/go/fuzz_test.go index b7f4c4a..2fbe92b 100644 --- a/go/fuzz_test.go +++ b/go/fuzz_test.go @@ -23,7 +23,7 @@ func FuzzDecode(f *testing.F) { t.Fatal(err) } buf.Reset() - _, err = Encode(&buf, v) + _, err = Encode(&buf, v, nil) if err != nil { t.Fatal(err) } diff --git a/go/pki/av.go b/go/pki/av.go index f8bf2e0..289bac3 100644 --- a/go/pki/av.go +++ b/go/pki/av.go @@ -45,7 +45,7 @@ func (av *AV) Id() (id uuid.UUID) { id = uuid.Nil return } - _, err := keks.Encode(hasher, av) + _, err := keks.Encode(hasher, av, nil) if err != nil { panic(err) } diff --git a/go/pki/cer.go b/go/pki/cer.go index cdb5ac8..02a9120 100644 --- a/go/pki/cer.go +++ b/go/pki/cer.go @@ -190,7 +190,7 @@ func (sd *SignedData) CerCheckSignatureFrom(parent *CerLoad) (err error) { return } tbs := SignedDataTBS{T: sd.Load.T, V: sd.Load.V, TBS: sig.TBS} - buf, err := keks.EncodeBuf(tbs) + buf, err := keks.EncodeBuf(tbs, nil) if err != nil { return } diff --git a/go/pki/cmd/kekscertool/main.go b/go/pki/cmd/kekscertool/main.go index d09e97b..2658f41 100644 --- a/go/pki/cmd/kekscertool/main.go +++ b/go/pki/cmd/kekscertool/main.go @@ -157,7 +157,7 @@ func main() { log.Fatal(err) } var data []byte - data, err = keks.EncodeBuf(pki.AV{A: *algo, V: prvRaw}) + data, err = keks.EncodeBuf(pki.AV{A: *algo, V: prvRaw}, nil) if err != nil { log.Fatal(err) } @@ -190,7 +190,7 @@ func main() { } var data []byte - data, err = keks.EncodeBuf(sd) + data, err = keks.EncodeBuf(sd, nil) if err != nil { log.Fatal(err) } diff --git a/go/pki/cmd/kekssdtool/main.go b/go/pki/cmd/kekssdtool/main.go index 9ff790e..3e6e40a 100644 --- a/go/pki/cmd/kekssdtool/main.go +++ b/go/pki/cmd/kekssdtool/main.go @@ -114,7 +114,7 @@ func main() { log.Fatal(err) } var data []byte - data, err = keks.EncodeBuf(sd) + data, err = keks.EncodeBuf(sd, nil) if err != nil { log.Fatal(err) } diff --git a/go/pki/signed-data.go b/go/pki/signed-data.go index e95c30b..5d2bb87 100644 --- a/go/pki/signed-data.go +++ b/go/pki/signed-data.go @@ -147,7 +147,7 @@ func (sd *SignedData) SignWith( sig := Sig{TBS: sigTBS} sig.Sign.A = parent.Pub[0].A var buf []byte - buf, err = keks.EncodeBuf(sdTBS) + buf, err = keks.EncodeBuf(sdTBS, nil) if err != nil { return } -- 2.48.1