mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-19 08:01:16 +00:00
106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
package crypt
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/rand"
|
|
"crypto/rsa"
|
|
"crypto/x509"
|
|
"encoding/base64"
|
|
"encoding/pem"
|
|
"testing"
|
|
)
|
|
|
|
func makeKeyPairB64(t *testing.T) (privB64, pubB64 string) {
|
|
t.Helper()
|
|
|
|
// Generate a test RSA keypair
|
|
privKey, err := rsa.GenerateKey(rand.Reader, 2048)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// --- Private key ---
|
|
privBytes := x509.MarshalPKCS1PrivateKey(privKey)
|
|
privPem := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: privBytes})
|
|
privB64 = base64.StdEncoding.EncodeToString(privPem)
|
|
|
|
// --- Public key ---
|
|
pubBytes, err := x509.MarshalPKIXPublicKey(&privKey.PublicKey)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
pubPem := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: pubBytes})
|
|
pubB64 = base64.StdEncoding.EncodeToString(pubPem)
|
|
|
|
return privB64, pubB64
|
|
}
|
|
|
|
func TestAsymmetric_EncryptDecrypt_RoundTrip(t *testing.T) {
|
|
privB64, pubB64 := makeKeyPairB64(t)
|
|
|
|
privClient, err := AsymmetricPrivateKey(privB64)
|
|
if err != nil {
|
|
t.Fatalf("AsymmetricPrivateKey failed: %v", err)
|
|
}
|
|
pubClient, err := AsymmetricPublicKey(pubB64)
|
|
if err != nil {
|
|
t.Fatalf("AsymmetricPublicKey failed: %v", err)
|
|
}
|
|
|
|
tests := []string{
|
|
"",
|
|
"Hello, world!",
|
|
"🚀 This message should survive RSA+AES encryption!",
|
|
}
|
|
|
|
for _, msg := range tests {
|
|
t.Run(msg, func(t *testing.T) {
|
|
ciphertext, err := pubClient.Encrypt([]byte(msg))
|
|
if err != nil {
|
|
t.Fatalf("Encrypt failed: %v", err)
|
|
}
|
|
|
|
plaintext, err := privClient.Decrypt(ciphertext)
|
|
if err != nil {
|
|
t.Fatalf("Decrypt failed: %v", err)
|
|
}
|
|
|
|
if !bytes.Equal(plaintext, []byte(msg)) {
|
|
t.Errorf("decrypted mismatch:\n got=%q\nwant=%q", plaintext, msg)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestAsymmetricPublicKey_InvalidInputs(t *testing.T) {
|
|
// Not base64
|
|
if _, err := AsymmetricPublicKey("invalid!!"); err == nil {
|
|
t.Error("expected error for invalid base64 input")
|
|
}
|
|
|
|
// Not a PEM block
|
|
badPem := base64.StdEncoding.EncodeToString([]byte("not pem"))
|
|
if _, err := AsymmetricPublicKey(badPem); err == nil {
|
|
t.Error("expected error for invalid PEM")
|
|
}
|
|
}
|
|
|
|
func TestAsymmetricPrivateKey_MismatchedKeys(t *testing.T) {
|
|
// Two independent keypairs
|
|
_, pub1B64 := makeKeyPairB64(t)
|
|
priv2B64, _ := makeKeyPairB64(t)
|
|
|
|
privClient2, _ := AsymmetricPrivateKey(priv2B64)
|
|
pubClient1, _ := AsymmetricPublicKey(pub1B64)
|
|
|
|
ciphertext, err := pubClient1.Encrypt([]byte("top secret"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Decrypt with wrong key → should fail
|
|
if _, err := privClient2.Decrypt(ciphertext); err == nil {
|
|
t.Error("expected decryption failure with mismatched key")
|
|
}
|
|
}
|