From c006761605d76a24dac13981a1b503c6b6936a72 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Mon, 4 Mar 2024 16:32:44 +0400 Subject: [PATCH] session: Add method to set token signature without issuer `Sign` method sets both issuer and signature of the token. There could be a need to set signature only, e.g. for testing. Now signature could be set via new method `SetSignature` also used by `Sign` itself. Refs #546. Signed-off-by: Leonard Lyubich --- session/common.go | 5 +---- session/container.go | 8 ++++++++ session/container_test.go | 4 ++++ session/object.go | 9 +++++++++ session/object_test.go | 4 ++++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/session/common.go b/session/common.go index 0e432c918..e72a3ff29 100644 --- a/session/common.go +++ b/session/common.go @@ -172,10 +172,7 @@ func (x commonData) signedData(w contextWriter) []byte { return x.fillBody(w).StableMarshal(nil) } -func (x *commonData) sign(signer user.Signer, w contextWriter) error { - x.issuer = signer.UserID() - x.issuerSet = true - +func (x *commonData) sign(signer neofscrypto.Signer, w contextWriter) error { var sig neofscrypto.Signature err := sig.Calculate(signer, x.signedData(w)) diff --git a/session/container.go b/session/container.go index 55584c1c7..0ee74f037 100644 --- a/session/container.go +++ b/session/container.go @@ -147,6 +147,14 @@ func (x *Container) UnmarshalJSON(data []byte) error { // // See also [Container.VerifySignature], [Container.SignedData]. func (x *Container) Sign(signer user.Signer) error { + x.issuer = signer.UserID() + x.issuerSet = true + return x.SetSignature(signer) +} + +// SetSignature allows to sign Container like [Container.Sign] but without +// issuer setting. +func (x *Container) SetSignature(signer neofscrypto.Signer) error { return x.sign(signer, x.writeContext) } diff --git a/session/container_test.go b/session/container_test.go index dc1a32798..d3937bbab 100644 --- a/session/container_test.go +++ b/session/container_test.go @@ -560,6 +560,10 @@ func TestContainer_Issuer(t *testing.T) { func TestContainer_Sign(t *testing.T) { val := sessiontest.Container() + require.NoError(t, val.SetSignature(test.RandomSignerRFC6979(t))) + require.Zero(t, val.Issuer()) + require.True(t, val.VerifySignature()) + require.NoError(t, val.Sign(test.RandomSignerRFC6979(t))) require.True(t, val.VerifySignature()) diff --git a/session/object.go b/session/object.go index 69ae4bcea..4c8d1382a 100644 --- a/session/object.go +++ b/session/object.go @@ -7,6 +7,7 @@ import ( "github.com/nspcc-dev/neofs-api-go/v2/refs" "github.com/nspcc-dev/neofs-api-go/v2/session" cid "github.com/nspcc-dev/neofs-sdk-go/container/id" + neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto" oid "github.com/nspcc-dev/neofs-sdk-go/object/id" "github.com/nspcc-dev/neofs-sdk-go/user" ) @@ -181,6 +182,14 @@ func (x *Object) UnmarshalJSON(data []byte) error { // // See also [Object.VerifySignature], [Object.SignedData]. func (x *Object) Sign(signer user.Signer) error { + x.issuer = signer.UserID() + x.issuerSet = true + return x.SetSignature(signer) +} + +// SetSignature allows to sign Object like [Object.Sign] but without issuer +// setting. +func (x *Object) SetSignature(signer neofscrypto.Signer) error { return x.sign(signer, x.writeContext) } diff --git a/session/object_test.go b/session/object_test.go index 8b3c0c493..79c66f5a1 100644 --- a/session/object_test.go +++ b/session/object_test.go @@ -623,6 +623,10 @@ func TestObject_Issuer(t *testing.T) { func TestObject_Sign(t *testing.T) { val := sessiontest.Object() + require.NoError(t, val.SetSignature(test.RandomSignerRFC6979(t))) + require.Zero(t, val.Issuer()) + require.True(t, val.VerifySignature()) + require.NoError(t, val.Sign(test.RandomSignerRFC6979(t))) require.True(t, val.VerifySignature())