Skip to content

Commit 4e434b2

Browse files
chore: make extra signers auditable in dlog metadata
Closes #993 In both IssueMetadata and TransferMetadata, ExtraSigners was typed as []Identity. This prevented auditors with access to the metadata from resolving those identities, unlike Issuer, Senders, and Receivers which already use AuditableIdentity. Changes: - token/driver/protos/request.proto: change extra_signers field from repeated Identity to repeated AuditableIdentity in both TransferMetadata and IssueMetadata messages - token/driver/protos-go/request/request.pb.go: update generated struct fields and getter methods accordingly - token/driver/request.go: change ExtraSigners []Identity to []*AuditableIdentity in both structs; update ToProtos/FromProtos to use protos.ToProtosSlice/FromProtosSlice consistent with other auditable fields - token/request.go: extract .Identity when building public Issue/Transfer structs (which keep []Identity as their API); fix extra-signer binding loop to use eid.Identity - token/metadata.go: fix Match() comparisons to compare against es.Identity - token/driver/request_test.go, token/metadata_test.go, token/request_test.go: update all test fixtures and assertions to use []*AuditableIdentity Signed-off-by: SurbhiAgarwal1 <agarwalsurbhi1807@gmail.com>
1 parent c9c9ff5 commit 4e434b2

8 files changed

Lines changed: 97 additions & 59 deletions

File tree

token/driver/protos-go/request/request.pb.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

token/driver/protos/request.proto

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ message OutputMetadata {
5050
message TransferMetadata {
5151
repeated TransferInputMetadata inputs = 1; // Inputs
5252
repeated OutputMetadata outputs = 2; // Outputs
53-
repeated Identity extra_signers = 8; // Additional signers for the transfer
53+
repeated AuditableIdentity extra_signers = 8; // Additional signers for the transfer
5454
Identity issuer = 3; // Issuer signer for the redeem transfer
5555
}
5656

@@ -63,7 +63,7 @@ message IssueMetadata {
6363
AuditableIdentity issuer = 1; // Issuer of the tokens
6464
repeated IssueInputMetadata inputs = 2; // Inputs
6565
repeated OutputMetadata outputs = 3; // Outputs
66-
repeated Identity extra_signers = 4; // Additional signers for the issuance
66+
repeated AuditableIdentity extra_signers = 4; // Additional signers for the issuance
6767
}
6868

6969
// Union type containing either issue or transfer metadata

token/driver/request.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ type IssueMetadata struct {
385385
Outputs []*IssueOutputMetadata
386386
// ExtraSigners is the list of extra identities that are not part of the issue action per se
387387
// but needs to sign the request
388-
ExtraSigners []Identity
388+
ExtraSigners []*AuditableIdentity
389389
}
390390

391391
func (i *IssueMetadata) ToProtos() (*request.IssueMetadata, error) {
@@ -402,11 +402,16 @@ func (i *IssueMetadata) ToProtos() (*request.IssueMetadata, error) {
402402
return nil, errors.Wrapf(err, "failed marshalling outputs")
403403
}
404404

405+
extraSigners, err := protos.ToProtosSlice[request.AuditableIdentity, *AuditableIdentity](i.ExtraSigners)
406+
if err != nil {
407+
return nil, errors.Wrapf(err, "failed marshalling extra signers")
408+
}
409+
405410
return &request.IssueMetadata{
406411
Issuer: issuer,
407412
Inputs: inputs,
408413
Outputs: outputs,
409-
ExtraSigners: ToProtoIdentitySlice(i.ExtraSigners),
414+
ExtraSigners: extraSigners,
410415
}, nil
411416
}
412417

@@ -426,7 +431,10 @@ func (i *IssueMetadata) FromProtos(issueMetadata *request.IssueMetadata) error {
426431
if err != nil {
427432
return errors.Wrap(err, "failed unmarshalling output metadata")
428433
}
429-
i.ExtraSigners = FromProtoIdentitySlice(issueMetadata.ExtraSigners)
434+
i.ExtraSigners = slices.GenericSliceOfPointers[AuditableIdentity](len(issueMetadata.ExtraSigners))
435+
if err = protos.FromProtosSlice[request.AuditableIdentity, *AuditableIdentity](issueMetadata.ExtraSigners, i.ExtraSigners); err != nil {
436+
return errors.Wrap(err, "failed unmarshalling extra signers")
437+
}
430438

431439
return nil
432440
}
@@ -536,7 +544,7 @@ type TransferMetadata struct {
536544
Outputs []*TransferOutputMetadata
537545
// ExtraSigners is the list of extra identities that are not part of the transfer action per se
538546
// but needs to sign the request
539-
ExtraSigners []Identity
547+
ExtraSigners []*AuditableIdentity
540548
// Issuer contains the identity of the issuer to sign the transfer action
541549
Issuer Identity
542550
}
@@ -560,6 +568,10 @@ func (t *TransferMetadata) ToProtos() (*request.TransferMetadata, error) {
560568
if err != nil {
561569
return nil, errors.Wrapf(err, "failed marshalling outputs")
562570
}
571+
extraSigners, err := protos.ToProtosSlice[request.AuditableIdentity, *AuditableIdentity](t.ExtraSigners)
572+
if err != nil {
573+
return nil, errors.Wrapf(err, "failed marshalling extra signers")
574+
}
563575

564576
var issuer *request.Identity
565577
if t.Issuer != nil {
@@ -571,7 +583,7 @@ func (t *TransferMetadata) ToProtos() (*request.TransferMetadata, error) {
571583
return &request.TransferMetadata{
572584
Inputs: inputs,
573585
Outputs: outputs,
574-
ExtraSigners: ToProtoIdentitySlice(t.ExtraSigners),
586+
ExtraSigners: extraSigners,
575587
Issuer: issuer,
576588
}, nil
577589
}
@@ -585,7 +597,10 @@ func (t *TransferMetadata) FromProtos(transferMetadata *request.TransferMetadata
585597
if err := protos.FromProtosSlice(transferMetadata.Outputs, t.Outputs); err != nil {
586598
return errors.Wrap(err, "failed unmarshalling outputs")
587599
}
588-
t.ExtraSigners = FromProtoIdentitySlice(transferMetadata.ExtraSigners)
600+
t.ExtraSigners = slices.GenericSliceOfPointers[AuditableIdentity](len(transferMetadata.ExtraSigners))
601+
if err := protos.FromProtosSlice[request.AuditableIdentity, *AuditableIdentity](transferMetadata.ExtraSigners, t.ExtraSigners); err != nil {
602+
return errors.Wrap(err, "failed unmarshalling extra signers")
603+
}
589604

590605
t.Issuer = nil
591606
if transferMetadata.Issuer != nil {

token/driver/request_test.go

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,9 @@ func TestIssueMetadata_ToProtos(t *testing.T) {
387387
Outputs: []*IssueOutputMetadata{
388388
{OutputMetadata: []byte("output1")},
389389
},
390-
ExtraSigners: []Identity{Identity("signer1")},
390+
ExtraSigners: []*AuditableIdentity{
391+
{Identity: Identity("signer1")},
392+
},
391393
}
392394

393395
proto, err := im.ToProtos()
@@ -401,7 +403,7 @@ func TestIssueMetadata_ToProtos(t *testing.T) {
401403
assert.Len(t, proto.Outputs, 1)
402404
assert.Equal(t, []byte("output1"), proto.Outputs[0].Metadata)
403405
assert.Len(t, proto.ExtraSigners, 1)
404-
assert.Equal(t, []byte("signer1"), proto.ExtraSigners[0].Raw)
406+
assert.Equal(t, []byte("signer1"), proto.ExtraSigners[0].Identity.Raw)
405407
}
406408

407409
// TestIssueMetadata_FromProtos tests conversion from protobuf
@@ -417,8 +419,8 @@ func TestIssueMetadata_FromProtos(t *testing.T) {
417419
Outputs: []*request.OutputMetadata{
418420
{Metadata: []byte("output1")},
419421
},
420-
ExtraSigners: []*request.Identity{
421-
{Raw: []byte("signer1")},
422+
ExtraSigners: []*request.AuditableIdentity{
423+
{Identity: &request.Identity{Raw: []byte("signer1")}},
422424
},
423425
}
424426

@@ -432,7 +434,7 @@ func TestIssueMetadata_FromProtos(t *testing.T) {
432434
assert.Len(t, im.Outputs, 1)
433435
assert.Equal(t, []byte("output1"), im.Outputs[0].OutputMetadata)
434436
assert.Len(t, im.ExtraSigners, 1)
435-
assert.Equal(t, Identity("signer1"), im.ExtraSigners[0])
437+
assert.Equal(t, Identity("signer1"), im.ExtraSigners[0].Identity)
436438
}
437439

438440
// TestTransferInputMetadata_ToProtos tests conversion to protobuf
@@ -648,7 +650,9 @@ func TestTransferMetadata_ToProtos(t *testing.T) {
648650
Outputs: []*TransferOutputMetadata{
649651
{OutputMetadata: []byte("output1")},
650652
},
651-
ExtraSigners: []Identity{Identity("signer1")},
653+
ExtraSigners: []*AuditableIdentity{
654+
{Identity: Identity("signer1")},
655+
},
652656
Issuer: Identity("issuer1"),
653657
}
654658

@@ -661,7 +665,7 @@ func TestTransferMetadata_ToProtos(t *testing.T) {
661665
assert.Len(t, proto.Outputs, 1)
662666
assert.Equal(t, []byte("output1"), proto.Outputs[0].Metadata)
663667
assert.Len(t, proto.ExtraSigners, 1)
664-
assert.Equal(t, []byte("signer1"), proto.ExtraSigners[0].Raw)
668+
assert.Equal(t, []byte("signer1"), proto.ExtraSigners[0].Identity.Raw)
665669
assert.NotNil(t, proto.Issuer)
666670
assert.Equal(t, []byte("issuer1"), proto.Issuer.Raw)
667671
}
@@ -689,8 +693,8 @@ func TestTransferMetadata_FromProtos(t *testing.T) {
689693
Outputs: []*request.OutputMetadata{
690694
{Metadata: []byte("output1")},
691695
},
692-
ExtraSigners: []*request.Identity{
693-
{Raw: []byte("signer1")},
696+
ExtraSigners: []*request.AuditableIdentity{
697+
{Identity: &request.Identity{Raw: []byte("signer1")}},
694698
},
695699
Issuer: &request.Identity{Raw: []byte("issuer1")},
696700
}
@@ -704,7 +708,7 @@ func TestTransferMetadata_FromProtos(t *testing.T) {
704708
assert.Len(t, tm.Outputs, 1)
705709
assert.Equal(t, []byte("output1"), tm.Outputs[0].OutputMetadata)
706710
assert.Len(t, tm.ExtraSigners, 1)
707-
assert.Equal(t, Identity("signer1"), tm.ExtraSigners[0])
711+
assert.Equal(t, Identity("signer1"), tm.ExtraSigners[0].Identity)
708712
assert.Equal(t, Identity("issuer1"), tm.Issuer)
709713
}
710714

@@ -751,9 +755,9 @@ func TestTokenRequestMetadataSerialization(t *testing.T) {
751755
},
752756
},
753757
},
754-
ExtraSigners: []Identity{
755-
[]byte("issue_extra_signer1"),
756-
[]byte("issue_extra_signer2"),
758+
ExtraSigners: []*AuditableIdentity{
759+
{Identity: []byte("issue_extra_signer1")},
760+
{Identity: []byte("issue_extra_signer2")},
757761
},
758762
},
759763
},
@@ -807,9 +811,9 @@ func TestTokenRequestMetadataSerialization(t *testing.T) {
807811
},
808812
},
809813
},
810-
ExtraSigners: []Identity{
811-
[]byte("extra_signer1"),
812-
[]byte("extra_signer2"),
814+
ExtraSigners: []*AuditableIdentity{
815+
{Identity: []byte("extra_signer1")},
816+
{Identity: []byte("extra_signer2")},
813817
},
814818
Issuer: Identity([]byte("issuer")),
815819
},
@@ -1312,20 +1316,23 @@ func TestIssueMetadata_ToProtos_WithExtraSigners(t *testing.T) {
13121316
Outputs: []*IssueOutputMetadata{
13131317
{OutputMetadata: []byte("output1")},
13141318
},
1315-
ExtraSigners: []Identity{
1316-
Identity("signer1"),
1317-
Identity("signer2"),
1318-
Identity("signer3"),
1319+
ExtraSigners: []*AuditableIdentity{
1320+
{Identity: Identity("signer1"), AuditInfo: []byte("audit1")},
1321+
{Identity: Identity("signer2"), AuditInfo: []byte("audit2")},
1322+
{Identity: Identity("signer3"), AuditInfo: []byte("audit3")},
13191323
},
13201324
}
13211325

13221326
proto, err := im.ToProtos()
13231327
require.NoError(t, err)
13241328
assert.NotNil(t, proto)
13251329
assert.Len(t, proto.ExtraSigners, 3)
1326-
assert.Equal(t, []byte("signer1"), proto.ExtraSigners[0].Raw)
1327-
assert.Equal(t, []byte("signer2"), proto.ExtraSigners[1].Raw)
1328-
assert.Equal(t, []byte("signer3"), proto.ExtraSigners[2].Raw)
1330+
assert.Equal(t, []byte("signer1"), proto.ExtraSigners[0].Identity.Raw)
1331+
assert.Equal(t, []byte("audit1"), proto.ExtraSigners[0].AuditInfo)
1332+
assert.Equal(t, []byte("signer2"), proto.ExtraSigners[1].Identity.Raw)
1333+
assert.Equal(t, []byte("audit2"), proto.ExtraSigners[1].AuditInfo)
1334+
assert.Equal(t, []byte("signer3"), proto.ExtraSigners[2].Identity.Raw)
1335+
assert.Equal(t, []byte("audit3"), proto.ExtraSigners[2].AuditInfo)
13291336
}
13301337

13311338
// TestTransferMetadata_ToProtos_WithExtraSigners tests ToProtos with extra signers
@@ -1337,9 +1344,9 @@ func TestTransferMetadata_ToProtos_WithExtraSigners(t *testing.T) {
13371344
Outputs: []*TransferOutputMetadata{
13381345
{OutputMetadata: []byte("output1")},
13391346
},
1340-
ExtraSigners: []Identity{
1341-
Identity("signer1"),
1342-
Identity("signer2"),
1347+
ExtraSigners: []*AuditableIdentity{
1348+
{Identity: Identity("signer1"), AuditInfo: []byte("audit1")},
1349+
{Identity: Identity("signer2"), AuditInfo: []byte("audit2")},
13431350
},
13441351
Issuer: Identity("issuer1"),
13451352
}
@@ -1348,8 +1355,10 @@ func TestTransferMetadata_ToProtos_WithExtraSigners(t *testing.T) {
13481355
require.NoError(t, err)
13491356
assert.NotNil(t, proto)
13501357
assert.Len(t, proto.ExtraSigners, 2)
1351-
assert.Equal(t, []byte("signer1"), proto.ExtraSigners[0].Raw)
1352-
assert.Equal(t, []byte("signer2"), proto.ExtraSigners[1].Raw)
1358+
assert.Equal(t, []byte("signer1"), proto.ExtraSigners[0].Identity.Raw)
1359+
assert.Equal(t, []byte("audit1"), proto.ExtraSigners[0].AuditInfo)
1360+
assert.Equal(t, []byte("signer2"), proto.ExtraSigners[1].Identity.Raw)
1361+
assert.Equal(t, []byte("audit2"), proto.ExtraSigners[1].AuditInfo)
13531362
assert.NotNil(t, proto.Issuer)
13541363
assert.Equal(t, []byte("issuer1"), proto.Issuer.Raw)
13551364
}

token/metadata.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,9 @@ func (m *IssueMetadata) Match(action *IssueAction) error {
247247
return errors.Errorf("expected [%d] extra signers but got [%d]", len(extraSigners), len(m.ExtraSigners))
248248
}
249249
for i, signer := range extraSigners {
250-
if !slices.ContainsFunc(m.ExtraSigners, signer.Equal) {
250+
if !slices.ContainsFunc(m.ExtraSigners, func(es *driver.AuditableIdentity) bool {
251+
return es != nil && signer.Equal(es.Identity)
252+
}) {
251253
return errors.Errorf("expected extra signer [%s] but got [%s]", signer, m.ExtraSigners[i])
252254
}
253255
}
@@ -302,7 +304,7 @@ func (m *TransferMetadata) Match(action *TransferAction) error {
302304
return errors.Errorf("expected [%d] extra signers but got [%d]", len(m.ExtraSigners), len(extraSigners))
303305
}
304306
for i, signer := range extraSigners {
305-
if !signer.Equal(m.ExtraSigners[i]) {
307+
if m.ExtraSigners[i] == nil || !signer.Equal(m.ExtraSigners[i].Identity) {
306308
return errors.Errorf("expected extra signer [%s] but got [%s]", m.ExtraSigners[i], signer)
307309
}
308310
}

token/metadata_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ func TestMetadata_TestMatchTransferAction(t *testing.T) {
251251
Issuer: mockIssuer,
252252
Inputs: []*driver.TransferInputMetadata{{}},
253253
Outputs: []*driver.TransferOutputMetadata{{}},
254-
ExtraSigners: []token.Identity{signer1},
254+
ExtraSigners: []*driver.AuditableIdentity{{Identity: signer1}},
255255
},
256256
},
257257
wantErr: false,
@@ -309,7 +309,7 @@ func TestMetadata_TestMatchTransferAction(t *testing.T) {
309309
&driver.TransferMetadata{
310310
Inputs: []*driver.TransferInputMetadata{{}},
311311
Outputs: []*driver.TransferOutputMetadata{{}},
312-
ExtraSigners: []token.Identity{},
312+
ExtraSigners: []*driver.AuditableIdentity{},
313313
},
314314
},
315315
wantErr: true,
@@ -322,7 +322,7 @@ func TestMetadata_TestMatchTransferAction(t *testing.T) {
322322
&driver.TransferMetadata{
323323
Inputs: []*driver.TransferInputMetadata{{}},
324324
Outputs: []*driver.TransferOutputMetadata{{}},
325-
ExtraSigners: []token.Identity{token.Identity("other")},
325+
ExtraSigners: []*driver.AuditableIdentity{{Identity: token.Identity("other")}},
326326
},
327327
},
328328
wantErr: true,
@@ -336,7 +336,7 @@ func TestMetadata_TestMatchTransferAction(t *testing.T) {
336336
Issuer: token.Identity("other"),
337337
Inputs: []*driver.TransferInputMetadata{{}},
338338
Outputs: []*driver.TransferOutputMetadata{{}},
339-
ExtraSigners: []token.Identity{signer1},
339+
ExtraSigners: []*driver.AuditableIdentity{{Identity: signer1}},
340340
},
341341
},
342342
wantErr: true,
@@ -525,7 +525,7 @@ func TestIssueMetadata_Match(t *testing.T) {
525525
Issuer: driver.AuditableIdentity{Identity: issuer1},
526526
Inputs: []*driver.IssueInputMetadata{{}},
527527
Outputs: []*driver.IssueOutputMetadata{{}},
528-
ExtraSigners: []token.Identity{signer1},
528+
ExtraSigners: []*driver.AuditableIdentity{{Identity: signer1}},
529529
},
530530
},
531531
action: token.NewIssueAction(action),
@@ -583,7 +583,7 @@ func TestIssueMetadata_Match(t *testing.T) {
583583
IssueMetadata: &driver.IssueMetadata{
584584
Inputs: []*driver.IssueInputMetadata{{}},
585585
Outputs: []*driver.IssueOutputMetadata{{}},
586-
ExtraSigners: []token.Identity{},
586+
ExtraSigners: []*driver.AuditableIdentity{},
587587
},
588588
},
589589
action: token.NewIssueAction(action),
@@ -596,7 +596,7 @@ func TestIssueMetadata_Match(t *testing.T) {
596596
IssueMetadata: &driver.IssueMetadata{
597597
Inputs: []*driver.IssueInputMetadata{{}},
598598
Outputs: []*driver.IssueOutputMetadata{{}},
599-
ExtraSigners: []token.Identity{token.Identity("other")},
599+
ExtraSigners: []*driver.AuditableIdentity{{Identity: token.Identity("other")}},
600600
},
601601
},
602602
action: token.NewIssueAction(action),
@@ -610,7 +610,7 @@ func TestIssueMetadata_Match(t *testing.T) {
610610
Issuer: driver.AuditableIdentity{Identity: issuer2},
611611
Inputs: []*driver.IssueInputMetadata{{}},
612612
Outputs: []*driver.IssueOutputMetadata{{}},
613-
ExtraSigners: []token.Identity{signer1},
613+
ExtraSigners: []*driver.AuditableIdentity{{Identity: signer1}},
614614
},
615615
},
616616
action: token.NewIssueAction(action),

0 commit comments

Comments
 (0)