Skip to content

Commit

Permalink
services/object: Inline signing service
Browse files Browse the repository at this point in the history
Continues 1e40321. Now sign service is gone.

Signed-off-by: Leonard Lyubich <[email protected]>
  • Loading branch information
cthulhu-rider committed Jan 20, 2025
1 parent b9fbe92 commit 2c3df2b
Show file tree
Hide file tree
Showing 5 changed files with 173 additions and 431 deletions.
10 changes: 2 additions & 8 deletions cmd/neofs-node/object.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import (
truststorage "github.com/nspcc-dev/neofs-node/pkg/services/reputation/local/storage"
"github.com/nspcc-dev/neofs-sdk-go/client"
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
eaclSDK "github.com/nspcc-dev/neofs-sdk-go/eacl"
netmapsdk "github.com/nspcc-dev/neofs-sdk-go/netmap"
objectSDK "github.com/nspcc-dev/neofs-sdk-go/object"
Expand Down Expand Up @@ -294,7 +293,7 @@ func initObjectService(c *cfg) {
)

// build service pipeline
// grpc | signature | response | acl | split
// grpc | response | acl | split

Check warning on line 296 in cmd/neofs-node/object.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-node/object.go#L296

Added line #L296 was not covered by tests

splitSvc := objectService.NewTransportSplitter(
c.cfgGRPC.maxChunkSize,
Expand Down Expand Up @@ -342,12 +341,7 @@ func initObjectService(c *cfg) {
c.respSvc,
)

signSvc := objectService.NewSignService(
&c.key.PrivateKey,
respSvc,
)

server := objectService.New(signSvc, mNumber, objNode, neofsecdsa.SignerRFC6979(c.shared.basics.key.PrivateKey), c.cfgNetmap.state, c.metricsCollector)
server := objectService.New(respSvc, mNumber, objNode, c.shared.basics.key.PrivateKey, c.cfgNetmap.state, c.metricsCollector)

Check warning on line 344 in cmd/neofs-node/object.go

View check run for this annotation

Codecov / codecov/patch

cmd/neofs-node/object.go#L344

Added line #L344 was not covered by tests

for _, srv := range c.cfgGRPC.servers {
objectGRPC.RegisterObjectServiceServer(srv, server)
Expand Down
194 changes: 159 additions & 35 deletions pkg/services/object/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package object
import (
"bytes"
"context"
"crypto/ecdsa"
"encoding/binary"
"errors"
"fmt"
Expand All @@ -13,6 +14,8 @@ import (
protoobject "github.com/nspcc-dev/neofs-api-go/v2/object/grpc"
refsv2 "github.com/nspcc-dev/neofs-api-go/v2/refs"
refs "github.com/nspcc-dev/neofs-api-go/v2/refs/grpc"
protosession "github.com/nspcc-dev/neofs-api-go/v2/session/grpc"
"github.com/nspcc-dev/neofs-api-go/v2/signature"
protostatus "github.com/nspcc-dev/neofs-api-go/v2/status/grpc"
"github.com/nspcc-dev/neofs-node/pkg/core/netmap"
objectcore "github.com/nspcc-dev/neofs-node/pkg/core/object"
Expand Down Expand Up @@ -110,14 +113,14 @@ type server struct {
srv ServiceServer

node Node
signer neofscrypto.Signer
signer ecdsa.PrivateKey
mNumber uint32
nmState netmap.StateDetailed
metrics MetricCollector
}

// New provides protoobject.ObjectServiceServer for the given parameters.
func New(c ServiceServer, magicNumber uint32, node Node, signer neofscrypto.Signer, nmState netmap.StateDetailed, m MetricCollector) protoobject.ObjectServiceServer {
func New(c ServiceServer, magicNumber uint32, node Node, signer ecdsa.PrivateKey, nmState netmap.StateDetailed, m MetricCollector) protoobject.ObjectServiceServer {
return &server{
srv: c,
node: node,
Expand All @@ -132,6 +135,21 @@ func (s *server) pushOpExecResult(op stat.Method, err error, startedAt time.Time
s.metrics.HandleOpExecResult(op, err == nil, time.Since(startedAt))
}

func (s *server) makeResponseMetaHeader(st *protostatus.Status) *protosession.ResponseMetaHeader {
return &protosession.ResponseMetaHeader{Status: st}

Check warning on line 139 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L138-L139

Added lines #L138 - L139 were not covered by tests
}

func (s *server) sendPutResponse(stream protoobject.ObjectService_PutServer, resp *protoobject.PutResponse) error {
resp = util.SignResponse(&s.signer, resp, v2object.PutResponse{})
return stream.SendAndClose(resp)

Check warning on line 144 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L142-L144

Added lines #L142 - L144 were not covered by tests
}

func (s *server) sendStatusPutResponse(stream protoobject.ObjectService_PutServer, err error) error {
return s.sendPutResponse(stream, &protoobject.PutResponse{
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
})

Check warning on line 150 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L147-L150

Added lines #L147 - L150 were not covered by tests
}

// Put opens internal Object service Put stream and overtakes data from gRPC stream to it.
func (s *server) Put(gStream protoobject.ObjectService_PutServer) error {
stream, err := s.srv.Put(gStream.Context())
Expand All @@ -148,7 +166,9 @@ func (s *server) Put(gStream protoobject.ObjectService_PutServer) error {
if req, err = gStream.Recv(); err != nil {
if errors.Is(err, io.EOF) {
if resp, err = stream.CloseAndRecv(); err == nil {
err = gStream.SendAndClose(resp.ToGRPCMessage().(*protoobject.PutResponse)) // assign for defer
err = s.sendPutResponse(gStream, resp.ToGRPCMessage().(*protoobject.PutResponse)) // assign for defer
} else {
err = s.sendStatusPutResponse(gStream, err)

Check warning on line 171 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L169-L171

Added lines #L169 - L171 were not covered by tests
}
}
return err
Expand All @@ -162,18 +182,34 @@ func (s *server) Put(gStream protoobject.ObjectService_PutServer) error {
if err = putReq.FromGRPCMessage(req); err != nil {
return err
}
if err = signature.VerifyServiceMessage(putReq); err != nil {
err = s.sendStatusPutResponse(gStream, util.ToRequestSignatureVerificationError(err)) // assign for defer
return err
}

Check warning on line 188 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L185-L188

Added lines #L185 - L188 were not covered by tests

if err = stream.Send(putReq); err != nil {
if errors.Is(err, util.ErrAbortStream) {
if resp, err = stream.CloseAndRecv(); err == nil {
err = gStream.SendAndClose(resp.ToGRPCMessage().(*protoobject.PutResponse)) // assign for defer
}
if resp, err = stream.CloseAndRecv(); err == nil {
err = s.sendPutResponse(gStream, resp.ToGRPCMessage().(*protoobject.PutResponse)) // assign for defer
} else {
err = s.sendStatusPutResponse(gStream, err)

Check warning on line 194 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L191-L194

Added lines #L191 - L194 were not covered by tests
}
return err
}
}
}

func (s *server) signDeleteResponse(startTime time.Time, err error, resp *protoobject.DeleteResponse) (*protoobject.DeleteResponse, error) {
resp = util.SignResponse(&s.signer, resp, v2object.DeleteResponse{})
s.pushOpExecResult(stat.MethodObjectDelete, err, startTime)
return resp, nil

Check warning on line 204 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L201-L204

Added lines #L201 - L204 were not covered by tests
}

func (s *server) makeStatusDeleteResponse(startTime time.Time, err error) (*protoobject.DeleteResponse, error) {
return s.signDeleteResponse(startTime, err, &protoobject.DeleteResponse{
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
})

Check warning on line 210 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L207-L210

Added lines #L207 - L210 were not covered by tests
}

// Delete converts gRPC DeleteRequest message and passes it to internal Object service.
func (s *server) Delete(ctx context.Context, req *protoobject.DeleteRequest) (*protoobject.DeleteResponse, error) {
delReq := new(v2object.DeleteRequest)
Expand All @@ -182,13 +218,27 @@ func (s *server) Delete(ctx context.Context, req *protoobject.DeleteRequest) (*p
}

t := time.Now()
if err := signature.VerifyServiceMessage(delReq); err != nil {
return s.makeStatusDeleteResponse(t, err)
}

Check warning on line 223 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L221-L223

Added lines #L221 - L223 were not covered by tests
resp, err := s.srv.Delete(ctx, delReq)
s.pushOpExecResult(stat.MethodObjectDelete, err, t)
if err != nil {
return nil, err
return s.makeStatusDeleteResponse(t, err)

Check warning on line 226 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L226

Added line #L226 was not covered by tests
}

return resp.ToGRPCMessage().(*protoobject.DeleteResponse), nil
return s.signDeleteResponse(t, util.StatusOKErr, resp.ToGRPCMessage().(*protoobject.DeleteResponse))

Check warning on line 229 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L229

Added line #L229 was not covered by tests
}

func (s *server) signHeadResponse(err error, startTime time.Time, resp *protoobject.HeadResponse) (*protoobject.HeadResponse, error) {
resp = util.SignResponse(&s.signer, resp, v2object.HeadResponse{})
s.pushOpExecResult(stat.MethodObjectHead, err, startTime)
return resp, nil

Check warning on line 235 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L232-L235

Added lines #L232 - L235 were not covered by tests
}

func (s *server) makeStatusHeadResponse(startTime time.Time, err error) (*protoobject.HeadResponse, error) {
return s.signHeadResponse(err, startTime, &protoobject.HeadResponse{
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
})

Check warning on line 241 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L238-L241

Added lines #L238 - L241 were not covered by tests
}

// Head converts gRPC HeadRequest message and passes it to internal Object service.
Expand All @@ -199,13 +249,27 @@ func (s *server) Head(ctx context.Context, req *protoobject.HeadRequest) (*proto
}

t := time.Now()
if err := signature.VerifyServiceMessage(searchReq); err != nil {
return s.makeStatusHeadResponse(t, err)
}

Check warning on line 254 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L252-L254

Added lines #L252 - L254 were not covered by tests
resp, err := s.srv.Head(ctx, searchReq)
s.pushOpExecResult(stat.MethodObjectHead, err, t)
if err != nil {
return nil, err
return s.makeStatusHeadResponse(t, err)

Check warning on line 257 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L257

Added line #L257 was not covered by tests
}

return resp.ToGRPCMessage().(*protoobject.HeadResponse), nil
return s.signHeadResponse(nil, t, resp.ToGRPCMessage().(*protoobject.HeadResponse))

Check warning on line 260 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L260

Added line #L260 was not covered by tests
}

func (s *server) signHashResponse(startTime time.Time, err error, resp *protoobject.GetRangeHashResponse) (*protoobject.GetRangeHashResponse, error) {
resp = util.SignResponse(&s.signer, resp, v2object.GetRangeHashResponse{})
s.pushOpExecResult(stat.MethodObjectHash, err, startTime)
return resp, nil

Check warning on line 266 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L263-L266

Added lines #L263 - L266 were not covered by tests
}

func (s *server) makeStatusHashResponse(startTime time.Time, err error) (*protoobject.GetRangeHashResponse, error) {
return s.signHashResponse(startTime, err, &protoobject.GetRangeHashResponse{
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
})

Check warning on line 272 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L269-L272

Added lines #L269 - L272 were not covered by tests
}

// GetRangeHash converts gRPC GetRangeHashRequest message and passes it to internal Object service.
Expand All @@ -216,26 +280,42 @@ func (s *server) GetRangeHash(ctx context.Context, req *protoobject.GetRangeHash
}

t := time.Now()
if err := signature.VerifyServiceMessage(hashRngReq); err != nil {
return s.makeStatusHashResponse(t, err)
}

Check warning on line 285 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L283-L285

Added lines #L283 - L285 were not covered by tests
resp, err := s.srv.GetRangeHash(ctx, hashRngReq)
s.pushOpExecResult(stat.MethodObjectHash, err, t)
if err != nil {
return nil, err
return s.makeStatusHashResponse(t, err)

Check warning on line 289 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L289

Added line #L289 was not covered by tests
}

return resp.ToGRPCMessage().(*protoobject.GetRangeHashResponse), nil
return s.signHashResponse(t, nil, resp.ToGRPCMessage().(*protoobject.GetRangeHashResponse))

Check warning on line 292 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L292

Added line #L292 was not covered by tests
}

func (s *server) sendGetResponse(stream protoobject.ObjectService_GetServer, resp *protoobject.GetResponse) error {
resp = util.SignResponse(&s.signer, resp, v2object.GetResponse{})
return stream.Send(resp)

Check warning on line 297 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L295-L297

Added lines #L295 - L297 were not covered by tests
}

func (s *server) sendStatusGetResponse(startTime time.Time, stream protoobject.ObjectService_GetServer, err error) error {
sendErr := s.sendGetResponse(stream, &protoobject.GetResponse{
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
})
s.pushOpExecResult(stat.MethodObjectGet, err, startTime)
return sendErr

Check warning on line 305 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L300-L305

Added lines #L300 - L305 were not covered by tests
}

type getStreamerV2 struct {
protoobject.ObjectService_GetServer
metrics MetricCollector
srv *server
}

func (s *getStreamerV2) Send(resp *v2object.GetResponse) error {
r := resp.ToGRPCMessage().(*protoobject.GetResponse)
if c := r.GetBody().GetChunk(); c != nil {
s.metrics.AddGetPayload(len(c))
s.srv.metrics.AddGetPayload(len(c))

Check warning on line 316 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L316

Added line #L316 was not covered by tests
}
return s.ObjectService_GetServer.Send(r)
return s.srv.sendGetResponse(s.ObjectService_GetServer, r)

Check warning on line 318 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L318

Added line #L318 was not covered by tests
}

// Get converts gRPC GetRequest message and server-side stream and overtakes its data
Expand All @@ -246,25 +326,43 @@ func (s *server) Get(req *protoobject.GetRequest, gStream protoobject.ObjectServ
return err
}
t := time.Now()
if err := signature.VerifyServiceMessage(getReq); err != nil {
return s.sendStatusGetResponse(t, gStream, err)
}

Check warning on line 331 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L329-L331

Added lines #L329 - L331 were not covered by tests
err := s.srv.Get(
getReq,
&getStreamerV2{
ObjectService_GetServer: gStream,
metrics: s.metrics,
srv: s,

Check warning on line 336 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L336

Added line #L336 was not covered by tests
},
)
s.pushOpExecResult(stat.MethodObjectGet, err, t)
return err
if err != nil {
return s.sendStatusGetResponse(t, gStream, err)
}
s.pushOpExecResult(stat.MethodObjectGet, nil, t)
return nil

Check warning on line 343 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L339-L343

Added lines #L339 - L343 were not covered by tests
}

func (s *server) sendRangeResponse(stream protoobject.ObjectService_GetRangeServer, resp *protoobject.GetRangeResponse) error {
resp = util.SignResponse(&s.signer, resp, v2object.GetRangeResponse{})
return stream.Send(resp)

Check warning on line 348 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L346-L348

Added lines #L346 - L348 were not covered by tests
}

func (s *server) sendStatusRangeResponse(startTime time.Time, stream protoobject.ObjectService_GetRangeServer, err error) error {
sendErr := s.sendRangeResponse(stream, &protoobject.GetRangeResponse{
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
})
s.pushOpExecResult(stat.MethodObjectRange, err, startTime)
return sendErr

Check warning on line 356 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L351-L356

Added lines #L351 - L356 were not covered by tests
}

type getRangeStreamerV2 struct {
protoobject.ObjectService_GetRangeServer
srv *server
}

func (s *getRangeStreamerV2) Send(resp *v2object.GetRangeResponse) error {
return s.ObjectService_GetRangeServer.Send(
resp.ToGRPCMessage().(*protoobject.GetRangeResponse),
)
return s.srv.sendRangeResponse(s.ObjectService_GetRangeServer, resp.ToGRPCMessage().(*protoobject.GetRangeResponse))

Check warning on line 365 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L365

Added line #L365 was not covered by tests
}

// GetRange converts gRPC GetRangeRequest message and server-side stream and overtakes its data
Expand All @@ -275,24 +373,43 @@ func (s *server) GetRange(req *protoobject.GetRangeRequest, gStream protoobject.
return err
}
t := time.Now()
if err := signature.VerifyServiceMessage(getRngReq); err != nil {
return s.sendStatusRangeResponse(t, gStream, err)
}

Check warning on line 378 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L376-L378

Added lines #L376 - L378 were not covered by tests
err := s.srv.GetRange(
getRngReq,
&getRangeStreamerV2{
ObjectService_GetRangeServer: gStream,
srv: s,

Check warning on line 383 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L383

Added line #L383 was not covered by tests
},
)
s.pushOpExecResult(stat.MethodObjectRange, err, t)
return err
if err != nil {
return s.sendStatusRangeResponse(t, gStream, err)
}
s.pushOpExecResult(stat.MethodObjectRange, nil, t)
return nil

Check warning on line 390 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L386-L390

Added lines #L386 - L390 were not covered by tests
}

func (s *server) sendSearchResponse(stream protoobject.ObjectService_SearchServer, resp *protoobject.SearchResponse) error {
resp = util.SignResponse(&s.signer, resp, v2object.SearchResponse{})
return stream.Send(resp)

Check warning on line 395 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L393-L395

Added lines #L393 - L395 were not covered by tests
}

func (s *server) sendStatusSearchResponse(startTime time.Time, stream protoobject.ObjectService_SearchServer, err error) error {
sendErr := s.sendSearchResponse(stream, &protoobject.SearchResponse{
MetaHeader: s.makeResponseMetaHeader(util.ToStatus(err)),
})
s.pushOpExecResult(stat.MethodObjectSearch, err, startTime)
return sendErr

Check warning on line 403 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L398-L403

Added lines #L398 - L403 were not covered by tests
}

type searchStreamerV2 struct {
protoobject.ObjectService_SearchServer
srv *server
}

func (s *searchStreamerV2) Send(resp *v2object.SearchResponse) error {
return s.ObjectService_SearchServer.Send(
resp.ToGRPCMessage().(*protoobject.SearchResponse),
)
return s.srv.sendSearchResponse(s.ObjectService_SearchServer, resp.ToGRPCMessage().(*protoobject.SearchResponse))

Check warning on line 412 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L412

Added line #L412 was not covered by tests
}

// Search converts gRPC SearchRequest message and server-side stream and overtakes its data
Expand All @@ -303,14 +420,21 @@ func (s *server) Search(req *protoobject.SearchRequest, gStream protoobject.Obje
return err
}
t := time.Now()
if err := signature.VerifyServiceMessage(searchReq); err != nil {
return s.sendStatusSearchResponse(t, gStream, err)
}

Check warning on line 425 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L423-L425

Added lines #L423 - L425 were not covered by tests
err := s.srv.Search(
searchReq,
&searchStreamerV2{
ObjectService_SearchServer: gStream,
srv: s,

Check warning on line 430 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L430

Added line #L430 was not covered by tests
},
)
s.pushOpExecResult(stat.MethodObjectSearch, err, t)
return err
if err != nil {
return s.sendStatusSearchResponse(t, gStream, err)
}
s.pushOpExecResult(stat.MethodObjectSearch, nil, t)
return nil

Check warning on line 437 in pkg/services/object/server.go

View check run for this annotation

Codecov / codecov/patch

pkg/services/object/server.go#L433-L437

Added lines #L433 - L437 were not covered by tests
}

// Replicate serves neo.fs.v2.object.ObjectService/Replicate RPC.
Expand Down Expand Up @@ -542,16 +666,16 @@ func (s *server) metaInfoSignature(o object.Object) ([]byte, error) {
var firstSig neofscrypto.Signature
var secondSig neofscrypto.Signature
var thirdSig neofscrypto.Signature

err := firstSig.Calculate(s.signer, firstMeta)
signer := neofsecdsa.SignerRFC6979(s.signer)
err := firstSig.Calculate(signer, firstMeta)
if err != nil {
return nil, fmt.Errorf("signature failure: %w", err)
}
err = secondSig.Calculate(s.signer, secondMeta)
err = secondSig.Calculate(signer, secondMeta)
if err != nil {
return nil, fmt.Errorf("signature failure: %w", err)
}
err = thirdSig.Calculate(s.signer, thirdMeta)
err = thirdSig.Calculate(signer, thirdMeta)
if err != nil {
return nil, fmt.Errorf("signature failure: %w", err)
}
Expand Down
Loading

0 comments on commit 2c3df2b

Please sign in to comment.