package attesto // [P3.4] Receipt-export parity corpus — Go verifier. import ( "encoding/json" "os" "path/filepath" "testing" ) func TestReceiptExportParity(t *testing.T) { raw, err := os.ReadFile(filepath.Join("..", "..", "golden-vectors", "sdk-parity", "receipt-export.json")) if err != nil { t.Fatalf("read corpus: %v", err) } var corpus struct { Cases []struct { ID string `json:"id"` ExpectOK bool `json:"expect_ok"` PublicKeyHex *string `json:"public_key_hex"` Export json.RawMessage `json:"export"` } `json:"cases"` } if err := json.Unmarshal(raw, &corpus); err != nil { t.Fatalf("parse corpus: %v", err) } if len(corpus.Cases) < 5 { t.Fatalf("expected >=5 cases, got %d", len(corpus.Cases)) } for _, testCase := range corpus.Cases { t.Run(testCase.ID, func(t *testing.T) { key := "" if testCase.PublicKeyHex != nil { key = *testCase.PublicKeyHex } report := VerifyReceiptExport(testCase.Export, key) if report.OK != testCase.ExpectOK { t.Fatalf("ok=%v want %v (problems: %v)", report.OK, testCase.ExpectOK, report.Problems) } if testCase.PublicKeyHex == nil && testCase.ExpectOK && report.Kind != "receipt-export-selfcontained" { t.Fatalf("kind=%q, want receipt-export-selfcontained", report.Kind) } }) } } func TestExportReceiptFileRoundTrip(t *testing.T) { raw, err := os.ReadFile(filepath.Join("..", "..", "golden-vectors", "sdk-parity", "receipt-export.json")) if err != nil { t.Fatalf("read corpus: %v", err) } var corpus struct { Cases []struct { PublicKeyHex *string `json:"public_key_hex"` Export struct { Receipt json.RawMessage `json:"receipt"` } `json:"export"` } `json:"cases"` } if err := json.Unmarshal(raw, &corpus); err != nil { t.Fatalf("parse corpus: %v", err) } valid := corpus.Cases[0] path := filepath.Join(t.TempDir(), "receipt.attesto.json") if _, err := ExportReceiptFile(valid.Export.Receipt, path, *valid.PublicKeyHex); err != nil { t.Fatalf("export: %v", err) } exported, err := os.ReadFile(path) if err != nil { t.Fatalf("read export: %v", err) } report := VerifyReceiptExport(exported, *valid.PublicKeyHex) if !report.OK { t.Fatalf("round-trip verify failed: %v", report.Problems) } }