package release import ( "crypto/ed25519" "encoding/json" "errors" "testing" ) func TestRootEnvelopeRoundTripAndRefusals(t *testing.T) { pub, priv, err := ed25519.GenerateKey(nil) if err != nil { t.Fatal(err) } type payload struct { V int `json:"v"` ID string `json:"id"` } wire, err := SignRootEnvelope(RootSigner(priv), payload{V: 1, ID: "loss-1"}) if err != nil { t.Fatal(err) } var got payload if err := VerifyRootEnvelope(pub, wire, &got); err != nil || got != (payload{V: 1, ID: "loss-1"}) { t.Fatalf("verify = %+v, %v", got, err) } var wrapper map[string]any if err := json.Unmarshal(wire, &wrapper); err != nil { t.Fatal(err) } wrapper["extra"] = true bad, _ := json.Marshal(wrapper) if err := VerifyRootEnvelope(pub, bad, &got); !errors.Is(err, ErrRootEnvelope) { t.Fatalf("unknown wrapper field = %v", err) } wire[len(wire)-2] ^= 1 if err := VerifyRootEnvelope(pub, wire, &got); !errors.Is(err, ErrRootEnvelope) { t.Fatalf("tampered envelope = %v", err) } if _, err := SignRootEnvelope(Signer{}, got); !errors.Is(err, ErrRootEnvelope) { t.Fatalf("zero signer = %v", err) } }