package publicrelease import ( "crypto/ed25519" "encoding/base64" "strings" "testing" ) func TestVerifySumsIsStrict(t *testing.T) { pub, priv, _ := ed25519.GenerateKey(nil) key := base64.StdEncoding.EncodeToString(pub) sign := func(s string) string { return base64.StdEncoding.EncodeToString(ed25519.Sign(priv, []byte(s))) + "\n" } a, b := strings.Repeat("a", 64), strings.Repeat("b", 64) good := a + " carlos-linux-arm64\n" + b + " carlos-linux-amd64\n" got, err := VerifySums(key, []byte(good), sign(good)) if err != nil || len(got) != 2 || got["carlos-linux-arm64"] != a || got["carlos-linux-amd64"] != b { t.Fatal(got, err) } _, other, _ := ed25519.GenerateKey(nil) for name, tc := range map[string]struct{ key, sums, sig string }{ "other signer": {key, good, base64.StdEncoding.EncodeToString(ed25519.Sign(other, []byte(good)))}, "changed after": {key, good + b + " extra\n", sign(good)}, "bad key": {"not-a-key", good, sign(good)}, "no signature": {key, good, ""}, "duplicate name": {key, a + " x\n" + b + " x\n", sign(a + " x\n" + b + " x\n")}, "upper hex": {key, strings.ToUpper(a) + " x\n", sign(strings.ToUpper(a) + " x\n")}, "binary marker": {key, a + " *x\n", sign(a + " *x\n")}, "one space": {key, a + " x\n", sign(a + " x\n")}, "blank line": {key, a + " x\n\n", sign(a + " x\n\n")}, "no newline": {key, a + " x", sign(a + " x")}, "empty": {key, "", sign("")}, "short hash": {key, a[:63] + " x\n", sign(a[:63] + " x\n")}, "name with space": {key, a + " x y\n", sign(a + " x y\n")}, } { t.Run(name, func(t *testing.T) { if _, err := VerifySums(tc.key, []byte(tc.sums), tc.sig); err == nil { t.Fatal("accepted") } }) } }