Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a140c4-354a-7823-8f0d-8f717397f786
53 lines
1.6 KiB
Go
53 lines
1.6 KiB
Go
package emission
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/ed25519"
|
|
"encoding/json"
|
|
"github.com/netkingdom/access-engine/internal/sign"
|
|
"github.com/netkingdom/access-engine/pkg/api"
|
|
"testing"
|
|
)
|
|
|
|
func TestOutboxReplayPreservesProducerNumericSignature(t *testing.T) {
|
|
folder := t.TempDir()
|
|
outbox, err := Open(folder, "synthetic-source")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
key := ed25519.NewKeyFromSeed(bytes.Repeat([]byte{21}, 32))
|
|
envelope := api.DecisionEnvelope{ID: "decision:synthetic-numeric", Effect: api.DecisionEffectDeny, Resource: api.ResourceRef{ID: "synthetic", Type: "tenant", System: "tenant-engine"}}
|
|
envelope.Binding = &api.DecisionBinding{Context: map[string]any{"float": json.Number("1.0"), "negative_zero": json.Number("-0.0"), "integer": json.Number("9007199254740993"), "exponent": json.Number("1e-07")}}
|
|
if err := sign.Sign(&envelope, key, "synthetic-numeric"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := outbox.Append(envelope); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
outbox.Close()
|
|
outbox, err = Open(folder, "synthetic-source")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer outbox.Close()
|
|
entry, _, err := outbox.nextEntry()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
wire, err := json.Marshal(entry.Event.Data)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
replayed, err := sign.DecodeEnvelope(wire)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := sign.Verify(replayed, map[string]ed25519.PublicKey{"synthetic-numeric": key.Public().(ed25519.PublicKey)}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
before, _ := sign.CanonicalBytes(envelope)
|
|
after, _ := sign.CanonicalBytes(replayed)
|
|
if !bytes.Equal(before, after) {
|
|
t.Fatal("replayed signed bytes changed")
|
|
}
|
|
}
|