Files
mautrix-telegram/pkg/gotd/crypto/rsa_pad_test.go
T
2025-06-27 20:03:37 -07:00

85 lines
2.3 KiB
Go

package crypto
import (
"bytes"
"crypto/rand"
"crypto/rsa"
"encoding/hex"
"io"
"testing"
"github.com/stretchr/testify/require"
"go.mau.fi/mautrix-telegram/pkg/gotd/testutil"
)
func TestRSAPad(t *testing.T) {
a := require.New(t)
keys, err := ParseRSAPublicKeys([]byte(`
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g
5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO
62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/
+aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9
t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs
5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB
-----END RSA PUBLIC KEY-----`))
a.NoError(err)
data := bytes.Repeat([]byte{'a'}, 144)
encrypted, err := RSAPad(data, keys[0], testutil.ZeroRand{})
a.NoError(err)
a.Len(encrypted, 256)
hexResult := "bf68719e836806b040cd261ecaf66eb3c4ba19f3bbea3031b2e6cf29167bab647201d101b291dc" +
"5b716a42e789a38d947fe59e9bcce8f30ef46a946743ea8b6babbce7fc0afc46b802aa453e83471d82a4dfad83f971f35" +
"0b4b4fb474cd1c48fdf427e4b5fecce9ec3178ae7dac3985856fdefa21d6fdc5e0e0fd8a57bc4f51580d637d372be8d87" +
"c9aa3fde8e6f8287bcb3be846aadcdd59465375479e248f62ed438f9804fbe36d41ca906243a5f740f3937949aa149ba8" +
"a8b8e68b3f3e1e3cd3f946387520e21eee55845e1f015a919a22f6a72bfaecd2cae946c91983b41f9ffabe97963bbde8f" +
"30eaf5fd3c5b8cecab8711bd269e441b6084f385726ff0"
expected, err := hex.DecodeString(hexResult)
a.NoError(err)
a.Equal(expected, encrypted)
}
func TestDecodeRSAPad(t *testing.T) {
a := require.New(t)
r := rand.Reader
key, err := rsa.GenerateKey(r, RSAKeyBits)
a.NoError(err)
size := 144
data := make([]byte, size)
_, err = io.ReadFull(r, data)
a.NoError(err)
encrypted, err := RSAPad(data, &key.PublicKey, r)
a.NoError(err)
a.Len(encrypted, 256)
decrypted, err := DecodeRSAPad(encrypted, key)
a.NoError(err)
a.Equal(data, decrypted[:size])
}
func BenchmarkRSAPad(b *testing.B) {
key := testutil.RSAPrivateKey()
data := make([]byte, 144)
if _, err := io.ReadFull(rand.Reader, data); err != nil {
b.Fatal(err)
}
b.SetBytes(int64(len(data)))
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
if _, err := RSAPad(data, &key.PublicKey, rand.Reader); err != nil {
b.Fatal(err)
}
}
}