Files
heicode-mananger/heicode/common/crypto_test.go
T

93 lines
2.6 KiB
Go

package common
import (
"crypto/ed25519"
"crypto/rand"
"encoding/base64"
"strings"
"testing"
)
func TestVerifyEd25519Signature_RoundTrip(t *testing.T) {
pub, priv, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
t.Fatalf("generate key: %v", err)
}
msg := []byte("hello world")
sig := ed25519.Sign(priv, msg)
pubB64 := base64.StdEncoding.EncodeToString(pub)
sigB64 := base64.StdEncoding.EncodeToString(sig)
if err := VerifyEd25519Signature(pubB64, msg, sigB64); err != nil {
t.Fatalf("expected verify to pass, got error: %v", err)
}
}
func TestVerifyEd25519Signature_WrongMessage(t *testing.T) {
pub, priv, _ := ed25519.GenerateKey(rand.Reader)
sig := ed25519.Sign(priv, []byte("real"))
err := VerifyEd25519Signature(
base64.StdEncoding.EncodeToString(pub),
[]byte("forged"),
base64.StdEncoding.EncodeToString(sig),
)
if err == nil {
t.Fatal("expected verify to fail on tampered message, got nil")
}
}
func TestVerifyEd25519Signature_TamperedSignature(t *testing.T) {
pub, priv, _ := ed25519.GenerateKey(rand.Reader)
sig := ed25519.Sign(priv, []byte("hello"))
sig[0] ^= 0xff
err := VerifyEd25519Signature(
base64.StdEncoding.EncodeToString(pub),
[]byte("hello"),
base64.StdEncoding.EncodeToString(sig),
)
if err == nil {
t.Fatal("expected verify to fail on tampered signature, got nil")
}
}
func TestVerifyEd25519Signature_MalformedInputs(t *testing.T) {
cases := []struct {
name string
pubkey string
message []byte
sig string
wantSub string // substring that must appear in the error message
}{
{"empty_pubkey", "", []byte("x"), "AAAA", "empty public key"},
{"empty_sig", base64Of32Zeros(), []byte("x"), "", "empty signature"},
{"bad_pubkey_b64", "!!!not-base64!!!", []byte("x"), base64Of64Zeros(), "valid base64"},
{"short_pubkey", base64.StdEncoding.EncodeToString([]byte("short")), []byte("x"), base64Of64Zeros(), "wrong length"},
{"bad_sig_b64", base64Of32Zeros(), []byte("x"), "!!!not-base64!!!", "valid base64"},
{"short_sig", base64Of32Zeros(), []byte("x"), base64.StdEncoding.EncodeToString([]byte("short")), "wrong length"},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
err := VerifyEd25519Signature(tc.pubkey, tc.message, tc.sig)
if err == nil {
t.Fatalf("expected error containing %q, got nil", tc.wantSub)
}
if !strings.Contains(err.Error(), tc.wantSub) {
t.Fatalf("expected error to contain %q, got %q", tc.wantSub, err.Error())
}
})
}
}
func base64Of32Zeros() string {
var b [32]byte
return base64.StdEncoding.EncodeToString(b[:])
}
func base64Of64Zeros() string {
var b [64]byte
return base64.StdEncoding.EncodeToString(b[:])
}