ceremonyclient/node/crypto/doubleratchet_test.go
2023-09-03 18:47:09 -05:00

130 lines
3.7 KiB
Go

package crypto_test
import (
"crypto/rand"
"testing"
"github.com/stretchr/testify/require"
"source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/core/curves"
"source.quilibrium.com/quilibrium/monorepo/node/crypto"
)
func TestRatchetEncrypt(t *testing.T) {
x448SendingIdentityPrivateKey := curves.ED448().Scalar.Random(rand.Reader)
x448SendingEphemeralPrivateKey := curves.ED448().Scalar.Random(rand.Reader)
x448ReceivingIdentityPrivateKey := curves.ED448().Scalar.Random(rand.Reader)
x448ReceivingSignedPrePrivateKey := curves.ED448().Scalar.Random(rand.Reader)
x448SendingIdentityKey := curves.ED448().NewGeneratorPoint().Mul(x448SendingIdentityPrivateKey)
x448SendingEphemeralKey := curves.ED448().NewGeneratorPoint().Mul(x448SendingEphemeralPrivateKey)
x448ReceivingIdentityKey := curves.ED448().NewGeneratorPoint().Mul(x448ReceivingIdentityPrivateKey)
x448ReceivingSignedPreKey := curves.ED448().NewGeneratorPoint().Mul(x448ReceivingSignedPrePrivateKey)
senderResult := crypto.SenderX3DH(
x448SendingIdentityPrivateKey,
x448SendingEphemeralPrivateKey,
x448ReceivingIdentityKey,
x448ReceivingSignedPreKey,
96,
)
receiverResult := crypto.ReceiverX3DH(
x448ReceivingIdentityPrivateKey,
x448ReceivingSignedPrePrivateKey,
x448SendingIdentityKey,
x448SendingEphemeralKey,
96,
)
sender, err := crypto.NewDoubleRatchetParticipant(
senderResult[:32],
senderResult[32:64],
senderResult[64:],
true,
x448SendingEphemeralPrivateKey,
x448ReceivingSignedPreKey,
*curves.ED448(),
nil,
)
require.NoError(t, err)
receiver, err := crypto.NewDoubleRatchetParticipant(
receiverResult[:32],
receiverResult[32:64],
receiverResult[64:],
false,
x448ReceivingSignedPrePrivateKey,
x448SendingEphemeralKey,
*curves.ED448(),
nil,
)
require.NoError(t, err)
envelope1, err := sender.RatchetEncrypt([]byte("hello there"))
require.NoError(t, err)
envelope2, err := sender.RatchetEncrypt([]byte("general kenobi"))
require.NoError(t, err)
plaintext1, err := receiver.RatchetDecrypt(envelope1)
require.NoError(t, err)
plaintext2, err := receiver.RatchetDecrypt(envelope2)
require.NoError(t, err)
envelope3, err := receiver.RatchetEncrypt([]byte("you are a bold one"))
require.NoError(t, err)
envelope4, err := receiver.RatchetEncrypt([]byte("[mechanical laughing]"))
require.NoError(t, err)
plaintext3, err := sender.RatchetDecrypt(envelope3)
require.NoError(t, err)
plaintext4, err := sender.RatchetDecrypt(envelope4)
require.NoError(t, err)
// confirm large messages
msg5 := make([]byte, 1024*1024*10)
msg6 := make([]byte, 1024*1024*10)
msg7 := make([]byte, 1024*1024*10)
msg8 := make([]byte, 1024*1024*10)
rand.Read(msg5)
rand.Read(msg6)
rand.Read(msg7)
rand.Read(msg8)
envelope5, err := sender.RatchetEncrypt(msg5)
require.NoError(t, err)
envelope6, err := sender.RatchetEncrypt(msg6)
require.NoError(t, err)
plaintext5, err := receiver.RatchetDecrypt(envelope5)
require.NoError(t, err)
plaintext6, err := receiver.RatchetDecrypt(envelope6)
require.NoError(t, err)
envelope7, err := receiver.RatchetEncrypt(msg7)
require.NoError(t, err)
envelope8, err := receiver.RatchetEncrypt(msg8)
require.NoError(t, err)
plaintext7, err := sender.RatchetDecrypt(envelope7)
require.NoError(t, err)
plaintext8, err := sender.RatchetDecrypt(envelope8)
require.NoError(t, err)
require.Equal(t, []byte("hello there"), plaintext1)
require.Equal(t, []byte("general kenobi"), plaintext2)
require.Equal(t, []byte("you are a bold one"), plaintext3)
require.Equal(t, []byte("[mechanical laughing]"), plaintext4)
require.Equal(t, msg5, plaintext5)
require.Equal(t, msg6, plaintext6)
require.Equal(t, msg7, plaintext7)
require.Equal(t, msg8, plaintext8)
}