Skip to content

Commit 519b689

Browse files
author
Storm1289
committed
revert(audit): drop auditor changes; auditor rewrite moves to LFDT-Panurus#1717
The protobuf-level rewrite in LFDT-Panurus#1717 supersedes the auditor changes originally bundled in this PR. Keep only the driver-level Match, MatchInputs, and ValidateReceivers refactor here; auditor input correctness will be re-introduced as part of LFDT-Panurus#1717. Signed-off-by: Storm1289 <divakarsharm2934@gmail.com>
1 parent a937599 commit 519b689

2 files changed

Lines changed: 26 additions & 115 deletions

File tree

token/core/zkatdlog/nogh/v1/audit/auditor.go

Lines changed: 12 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ SPDX-License-Identifier: Apache-2.0
77
package audit
88

99
import (
10+
"bytes"
1011
"context"
1112

1213
math "github.com/IBM/mathlib"
@@ -121,6 +122,7 @@ func (a *Auditor) Check(
121122
inputTokens [][]*token.Token,
122123
txID driver.TokenRequestAnchor,
123124
) error {
125+
// TODO: inputTokens should be checked against the actions
124126
// De-obfuscate issue requests
125127
a.Logger.DebugfContext(ctx, "Get audit info for %d issues", len(tokenRequest.Issues))
126128
outputsFromIssue, identitiesFromIssue, err := a.GetAuditInfoForIssues(tokenRequest.Issues, tokenRequestMetadata.Issues)
@@ -142,7 +144,7 @@ func (a *Auditor) Check(
142144
}
143145
// De-obfuscate transfer requests
144146
a.Logger.DebugfContext(ctx, "Get audit info for %d transfers", len(tokenRequest.Transfers))
145-
auditableInputs, outputsFromTransfer, err := a.GetAuditInfoForTransfers(ctx, tokenRequest.Transfers, tokenRequestMetadata.Transfers, inputTokens)
147+
auditableInputs, outputsFromTransfer, err := a.GetAuditInfoForTransfers(tokenRequest.Transfers, tokenRequestMetadata.Transfers, inputTokens)
146148
if err != nil {
147149
return errors.Wrapf(err, "failed getting audit info for transfers for [%s]", txID)
148150
}
@@ -256,7 +258,7 @@ func (a *Auditor) InspectIdentity(ctx context.Context, matcher InfoMatcher, iden
256258
// If identity is provided in metadata, it must match the one in the action
257259
if len(identity.IdentityFromMeta) != 0 {
258260
// enforce equality
259-
if !identity.IdentityFromMeta.Equal(identity.Identity) {
261+
if !bytes.Equal(identity.IdentityFromMeta, identity.Identity) {
260262
return errors.Errorf("failed to inspect identity at index [%d]: identity does not match the identity form metadata", index)
261263
}
262264
}
@@ -331,7 +333,7 @@ func (a *Auditor) GetAuditInfoForIssues(issues [][]byte, issueMetadata []*driver
331333

332334
// GetAuditInfoForTransfers returns an array of InspectableToken for each transfer action.
333335
// It takes an array of serialized transfer actions, an array of transfer metadata and input tokens.
334-
func (a *Auditor) GetAuditInfoForTransfers(ctx context.Context, transfers [][]byte, metadata []*driver.TransferMetadata, inputs [][]*token.Token) ([][]*InspectableToken, [][]*InspectableToken, error) {
336+
func (a *Auditor) GetAuditInfoForTransfers(transfers [][]byte, metadata []*driver.TransferMetadata, inputs [][]*token.Token) ([][]*InspectableToken, [][]*InspectableToken, error) {
335337
if len(transfers) != len(metadata) {
336338
return nil, nil, errors.Errorf("number of transfers does not match the number of provided metadata")
337339
}
@@ -361,50 +363,29 @@ func (a *Auditor) GetAuditInfoForTransfers(ctx context.Context, transfers [][]by
361363
}
362364
}
363365
ta := &transfer.Action{}
364-
if err := ta.Deserialize(transfers[k]); err != nil {
366+
err := ta.Deserialize(transfers[k])
367+
if err != nil {
365368
return nil, nil, err
366369
}
367-
// Validate structural consistency between action and metadata (counts, signers, issuer).
368-
if err := transferMetadata.Match(ta); err != nil {
369-
return nil, nil, errors.Wrapf(err, "transfer at index [%d]", k)
370-
}
371-
// Build serialized forms and validate input tokens match the action.
372-
actionInputSer := make([][]byte, len(ta.Inputs))
373-
for i, actionInput := range ta.Inputs {
374-
if actionInput.Token == nil {
375-
continue // upgrade-witness input: no zkatdlog commitment to compare
376-
}
377-
ser, err := actionInput.Token.Serialize()
378-
if err != nil {
379-
return nil, nil, errors.Errorf("failed serializing action input at [%d][%d]: %s", k, i, err)
380-
}
381-
actionInputSer[i] = ser
382-
}
383-
ledgerInputSer := make([][]byte, len(inputs[k]))
384-
for i, t := range inputs[k] {
385-
ser, err := t.Serialize()
386-
if err != nil {
387-
return nil, nil, errors.Errorf("failed serializing ledger input at [%d][%d]: %s", k, i, err)
388-
}
389-
ledgerInputSer[i] = ser
390-
}
391-
if err := transferMetadata.MatchInputs(actionInputSer, ledgerInputSer); err != nil {
392-
return nil, nil, errors.Wrapf(err, "transfer at index [%d]", k)
370+
if len(ta.Outputs) != len(transferMetadata.Outputs) {
371+
return nil, nil, errors.Errorf("number of outputs does not match the number of output metadata [%d]!=[%d]", len(ta.Outputs), len(transferMetadata.Outputs))
393372
}
394373
// Process auditable outputs
395374
outputs[k] = make([]*InspectableToken, len(ta.Outputs))
396375
for i := range len(ta.Outputs) {
397376
if ta.Outputs[i] == nil {
398377
return nil, nil, errors.Errorf("output token at index [%d] is nil", i)
399378
}
379+
400380
if transferMetadata.Outputs[i] == nil {
401381
return nil, nil, errors.Errorf("metadata for output token at index [%d] is nil", i)
402382
}
403383
ti := &token.Metadata{}
404-
err := ti.Deserialize(transferMetadata.Outputs[i].OutputMetadata)
384+
err = ti.Deserialize(transferMetadata.Outputs[i].OutputMetadata)
405385
if err != nil {
406386
return nil, nil, err
407387
}
388+
// TODO: we need to check also how many recipients the output contains, and check them all in isolation and compatibility
408389
outputs[k][i], err = NewInspectableToken(
409390
ta.Outputs[i],
410391
transferMetadata.Outputs[i].OutputAuditInfo,
@@ -415,24 +396,6 @@ func (a *Auditor) GetAuditInfoForTransfers(ctx context.Context, transfers [][]by
415396
if err != nil {
416397
return nil, nil, err
417398
}
418-
// Verify each receiver's audit info matches their identity for non-redeem outputs.
419-
if !ta.Outputs[i].IsRedeem() {
420-
if err := transferMetadata.Outputs[i].ValidateReceivers(); err != nil {
421-
return nil, nil, errors.Wrapf(err, "output at index [%d][%d]", k, i)
422-
}
423-
for j, receiver := range transferMetadata.Outputs[i].Receivers {
424-
identityToVerify := receiver.Identity
425-
if identityToVerify.IsNone() {
426-
identityToVerify = ta.Outputs[i].Owner
427-
}
428-
if err := a.InspectIdentity(ctx, a.InfoMatcher, &InspectableIdentity{
429-
Identity: identityToVerify,
430-
AuditInfo: receiver.AuditInfo,
431-
}, j); err != nil {
432-
return nil, nil, errors.Wrapf(err, "failed inspecting receiver at index [%d][%d][%d]", k, i, j)
433-
}
434-
}
435-
}
436399
}
437400
}
438401

token/core/zkatdlog/nogh/v1/audit/auditor_test.go

Lines changed: 14 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,11 @@ func TestAuditor_Errors(t *testing.T) {
128128
// in the number of transfers, transfer metadata, or input tokens.
129129
t.Run("GetAuditInfoForTransfers length mismatch", func(t *testing.T) {
130130
_, _, auditor := setupAuditorTest(t)
131-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{{1}}, nil, nil)
131+
_, _, err := auditor.GetAuditInfoForTransfers([][]byte{{1}}, nil, nil)
132132
require.Error(t, err)
133133
require.Contains(t, err.Error(), "number of transfers does not match the number of provided metadata")
134134

135-
_, _, err = auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{{1}}, []*driver.TransferMetadata{{}}, nil)
135+
_, _, err = auditor.GetAuditInfoForTransfers([][]byte{{1}}, []*driver.TransferMetadata{{}}, nil)
136136
require.Error(t, err)
137137
require.Contains(t, err.Error(), "number of inputs does not match the number of provided metadata")
138138
})
@@ -280,7 +280,7 @@ func TestAuditor_GetAuditInfo_Errors(t *testing.T) {
280280
// for a transfer is nil.
281281
t.Run("GetAuditInfoForTransfers nil input token", func(t *testing.T) {
282282
_, _, auditor := setupAuditorTest(t)
283-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{{}}, []*driver.TransferMetadata{{Inputs: []*driver.TransferInputMetadata{{}}}}, [][]*token.Token{{nil}})
283+
_, _, err := auditor.GetAuditInfoForTransfers([][]byte{{}}, []*driver.TransferMetadata{{Inputs: []*driver.TransferInputMetadata{{}}}}, [][]*token.Token{{nil}})
284284
require.Error(t, err)
285285
require.Contains(t, err.Error(), "input[0][0] is nil")
286286
})
@@ -289,7 +289,7 @@ func TestAuditor_GetAuditInfo_Errors(t *testing.T) {
289289
// metadata for a transfer input is nil.
290290
t.Run("GetAuditInfoForTransfers invalid input metadata", func(t *testing.T) {
291291
_, _, auditor := setupAuditorTest(t)
292-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{{}}, []*driver.TransferMetadata{{Inputs: []*driver.TransferInputMetadata{nil}}}, [][]*token.Token{{&token.Token{}}})
292+
_, _, err := auditor.GetAuditInfoForTransfers([][]byte{{}}, []*driver.TransferMetadata{{Inputs: []*driver.TransferInputMetadata{nil}}}, [][]*token.Token{{&token.Token{}}})
293293
require.Error(t, err)
294294
require.Contains(t, err.Error(), "invalid metadata for input[0][0]")
295295
})
@@ -299,7 +299,7 @@ func TestAuditor_GetAuditInfo_Errors(t *testing.T) {
299299
t.Run("GetAuditInfoForTransfers transfer deserialization error", func(t *testing.T) {
300300
_, _, auditor := setupAuditorTest(t)
301301
inputs := []*driver.TransferInputMetadata{{Senders: []*driver.AuditableIdentity{{AuditInfo: []byte{1}}}}}
302-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{{1, 2, 3}}, []*driver.TransferMetadata{{Inputs: inputs}}, [][]*token.Token{{&token.Token{}}})
302+
_, _, err := auditor.GetAuditInfoForTransfers([][]byte{{1, 2, 3}}, []*driver.TransferMetadata{{Inputs: inputs}}, [][]*token.Token{{&token.Token{}}})
303303
require.Error(t, err)
304304
require.Contains(t, err.Error(), "failed to deserialize transfer action")
305305
})
@@ -308,22 +308,22 @@ func TestAuditor_GetAuditInfo_Errors(t *testing.T) {
308308
// of outputs in a transfer action does not match the number of provided output metadata.
309309
t.Run("GetAuditInfoForTransfers output count mismatch", func(t *testing.T) {
310310
_, pp, auditor := setupAuditorTest(t)
311-
transfer, meta, tokens := createTransfer(t, pp)
311+
transfer, meta, _ := createTransfer(t, pp)
312312
raw, _ := transfer.Serialize()
313313
meta.Outputs = meta.Outputs[:len(meta.Outputs)-1]
314-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{raw}, []*driver.TransferMetadata{meta}, tokens)
314+
_, _, err := auditor.GetAuditInfoForTransfers([][]byte{raw}, []*driver.TransferMetadata{meta}, [][]*token.Token{{&token.Token{}, &token.Token{}}})
315315
require.Error(t, err)
316-
require.Contains(t, err.Error(), "expected [1] outputs but got [2]")
316+
require.Contains(t, err.Error(), "number of outputs does not match the number of output metadata")
317317
})
318318

319319
// GetAuditInfoForTransfers nil output token tests that an error is returned when one of the outputs
320320
// in a transfer action is nil.
321321
t.Run("GetAuditInfoForTransfers nil output token", func(t *testing.T) {
322322
_, pp, auditor := setupAuditorTest(t)
323-
transfer, meta, tokens := createTransfer(t, pp)
323+
transfer, meta, _ := createTransfer(t, pp)
324324
transfer.Outputs[0] = nil
325325
raw, _ := transfer.Serialize()
326-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{raw}, []*driver.TransferMetadata{meta}, tokens)
326+
_, _, err := auditor.GetAuditInfoForTransfers([][]byte{raw}, []*driver.TransferMetadata{meta}, [][]*token.Token{{&token.Token{}, &token.Token{}}})
327327
require.Error(t, err)
328328
require.Contains(t, err.Error(), "output token at index [0] is nil")
329329
})
@@ -332,10 +332,10 @@ func TestAuditor_GetAuditInfo_Errors(t *testing.T) {
332332
// for a transfer output is nil.
333333
t.Run("GetAuditInfoForTransfers nil output metadata", func(t *testing.T) {
334334
_, pp, auditor := setupAuditorTest(t)
335-
transfer, meta, tokens := createTransfer(t, pp)
335+
transfer, meta, _ := createTransfer(t, pp)
336336
meta.Outputs[0] = nil
337337
raw, _ := transfer.Serialize()
338-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{raw}, []*driver.TransferMetadata{meta}, tokens)
338+
_, _, err := auditor.GetAuditInfoForTransfers([][]byte{raw}, []*driver.TransferMetadata{meta}, [][]*token.Token{{&token.Token{}, &token.Token{}}})
339339
require.Error(t, err)
340340
require.Contains(t, err.Error(), "metadata for output token at index [0] is nil")
341341
})
@@ -344,65 +344,13 @@ func TestAuditor_GetAuditInfo_Errors(t *testing.T) {
344344
// the metadata for a transfer output cannot be deserialized.
345345
t.Run("GetAuditInfoForTransfers output metadata deserialization error", func(t *testing.T) {
346346
_, pp, auditor := setupAuditorTest(t)
347-
transfer, meta, tokens := createTransfer(t, pp)
347+
transfer, meta, _ := createTransfer(t, pp)
348348
meta.Outputs[0].OutputMetadata = []byte{1, 2, 3}
349349
raw, _ := transfer.Serialize()
350-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{raw}, []*driver.TransferMetadata{meta}, tokens)
350+
_, _, err := auditor.GetAuditInfoForTransfers([][]byte{raw}, []*driver.TransferMetadata{meta}, [][]*token.Token{{&token.Token{}, &token.Token{}}})
351351
require.Error(t, err)
352352
require.Contains(t, err.Error(), "failed deserializing metadata")
353353
})
354-
355-
// GetAuditInfoForTransfers input token commitment mismatch tests that an error is returned when
356-
// an input token's serialized form does not match the one embedded in the transfer action.
357-
t.Run("GetAuditInfoForTransfers input token commitment mismatch", func(t *testing.T) {
358-
_, pp, auditor := setupAuditorTest(t)
359-
transfer, meta, tokens := createTransfer(t, pp)
360-
raw, _ := transfer.Serialize()
361-
tokens[0][0].Data = pp.PedersenGenerators[0] // tamper with commitment
362-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{raw}, []*driver.TransferMetadata{meta}, tokens)
363-
require.Error(t, err)
364-
require.Contains(t, err.Error(), "does not match the transfer action")
365-
})
366-
367-
// GetAuditInfoForTransfers input token owner mismatch tests that an error is returned when
368-
// an input token's serialized form does not match the one embedded in the transfer action.
369-
t.Run("GetAuditInfoForTransfers input token owner mismatch", func(t *testing.T) {
370-
_, pp, auditor := setupAuditorTest(t)
371-
transfer, meta, tokens := createTransfer(t, pp)
372-
raw, _ := transfer.Serialize()
373-
tokens[0][0].Owner = []byte("wrong-owner") // tamper with owner
374-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{raw}, []*driver.TransferMetadata{meta}, tokens)
375-
require.Error(t, err)
376-
require.Contains(t, err.Error(), "does not match the transfer action")
377-
})
378-
379-
// GetAuditInfoForTransfers no receivers for output tests that an error is returned when a
380-
// non-redeemed output has no declared receivers.
381-
t.Run("GetAuditInfoForTransfers no receivers for output", func(t *testing.T) {
382-
_, pp, auditor := setupAuditorTest(t)
383-
transfer, meta, tokens := createTransfer(t, pp)
384-
raw, _ := transfer.Serialize()
385-
meta.Outputs[0].Receivers = nil
386-
_, _, err := auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{raw}, []*driver.TransferMetadata{meta}, tokens)
387-
require.Error(t, err)
388-
require.Contains(t, err.Error(), "has no receivers")
389-
})
390-
391-
// GetAuditInfoForTransfers receiver audit info mismatch tests that an error is returned when
392-
// a receiver's audit info does not match the output owner.
393-
t.Run("GetAuditInfoForTransfers receiver audit info mismatch", func(t *testing.T) {
394-
_, pp, auditor := setupAuditorTest(t)
395-
transfer, meta, tokens := createTransfer(t, pp)
396-
_, differentAuditInfo := getIdemixInfo(t, "./testdata/bls12_381_bbs/idemix")
397-
differentAuditInfoRaw, err := differentAuditInfo.Bytes()
398-
require.NoError(t, err)
399-
raw, err := transfer.Serialize()
400-
require.NoError(t, err)
401-
meta.Outputs[0].Receivers[0].AuditInfo = differentAuditInfoRaw
402-
_, _, err = auditor.GetAuditInfoForTransfers(t.Context(), [][]byte{raw}, []*driver.TransferMetadata{meta}, tokens)
403-
require.Error(t, err)
404-
require.Contains(t, err.Error(), "failed inspecting receiver")
405-
})
406354
}
407355

408356
// TestAuditor_Check_Errors tests error handling for the Check method, ensuring the auditor

0 commit comments

Comments
 (0)