Files
2025-06-27 20:03:37 -07:00

97 lines
2.7 KiB
Go

package crypto
import (
"bytes"
"crypto/rand"
"crypto/rsa"
"encoding/base64"
mathrand "math/rand"
"testing"
"github.com/stretchr/testify/require"
)
func TestRSAEncryptHashed(t *testing.T) {
testKey := []byte(`-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJhOrkbrOi7/fFQRN2+8W5+Inx
bdxo7XH5DDKgFvXPDDe8cQINO3/kFat7KlpC2n2sS8ApZQkmREANg0XpImL9lCHB
v1FgQmL0xtnaURKo7FzaoaL4jCf5556NQr1th9F3oeN67mR4+BF0vPP9Gu6GY5Z1
BSqi+FEREW/2aWSgSwIDAQAB
-----END PUBLIC KEY-----`)
keys, err := ParseRSAPublicKeys(testKey)
if err != nil {
t.Fatal(err)
}
key := keys[0]
rnd := mathrand.New(mathrand.NewSource(239))
result, err := RSAEncryptHashed([]byte("hello world"), key, rnd)
if err != nil {
t.Fatal(err)
}
expectedBase64 := "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/GJXcAWGFq4zkN+CjnRXNgFL1" +
"PFMxY/KZT5wq3UcHCD3A+0hxePcHZywJFJ0JIJyOkFYno0uTZAWy/7sgR5Ucpd6SlUFDVp" +
"TinnaM9hKWpBmzT8HNgrGd7HAPqqNiq9cmLrQsPhLd+Xt4JCdWiIvbm+HrgXdrZx1iiIVB" +
"eDHu3g=="
gotBase64 := base64.StdEncoding.EncodeToString(result)
if expectedBase64 != gotBase64 {
t.Error(gotBase64)
}
if _, err := RSAEncryptHashed(bytes.Repeat([]byte{1, 2, 3}, 1000), key, rnd); err == nil {
t.Error("should error")
}
}
func TestRSADecryptHashed(t *testing.T) {
a := require.New(t)
src := rand.Reader
k, err := rsa.GenerateKey(src, RSAKeyBits)
a.NoError(err)
plaintext := []byte("abcd")
encrypted, err := RSAEncryptHashed(plaintext, &k.PublicKey, src)
a.NoError(err)
decrypted, err := RSADecryptHashed(encrypted, k)
a.NoError(err)
a.Equal(plaintext, decrypted)
}
func TestRSAEncryptHashedCorpus(t *testing.T) {
reader := mathrand.New(mathrand.NewSource(0))
k, err := rsa.GenerateKey(reader, RSAKeyBits)
require.NoError(t, err)
for _, s := range []string{
"\xbd\xbf\xef\x1e\x11p",
} {
t.Run(s, func(t *testing.T) {
data := []byte(s)
encrypted, err := RSAEncryptHashed(data, &k.PublicKey, reader)
require.NoError(t, err)
decrypted, err := RSADecryptHashed(encrypted, k)
require.NoError(t, err)
require.Equal(t, data, decrypted)
})
}
}
func TestRSAEncryptHashedFuzz(t *testing.T) {
src := mathrand.New(mathrand.NewSource(1))
k, err := rsa.GenerateKey(src, RSAKeyBits)
require.NoError(t, err)
for i := 0; i < 100; i++ {
n, err := RandInt64n(src, rsaDataLen)
require.NoError(t, err)
data := make([]byte, int(n))
encrypted, err := RSAEncryptHashed(data, &k.PublicKey, src)
require.NoError(t, err)
decrypted, err := RSADecryptHashed(encrypted, k)
require.NoError(t, err)
require.Equal(t, data, decrypted)
}
}