access-engine/internal/emission/numeric_replay_test.go
tegwick 2b064eee51
Some checks failed
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s
Build and Publish Container Image / build-and-push (push) Failing after 1m10s
Bind trusted task approval to exact producer facts and lifetime
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a140c4-354a-7823-8f0d-8f717397f786
2026-10-16 17:27:30 +02:00

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")
}
}