ceremonyclient/nekryptology/pkg/tecdsa/dkls/v0/ot_test.go
2023-07-05 00:32:28 -05:00

114 lines
3.1 KiB
Go

//
// Copyright Coinbase, Inc. All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
package v0
import (
"crypto/rand"
"math/big"
"testing"
"github.com/btcsuite/btcd/btcec"
"github.com/stretchr/testify/require"
"source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/core/curves"
)
func TestSeedOT(t *testing.T) {
params, err := NewParams(btcec.S256(), curves.NewK256Scalar())
require.Nil(t, err)
sender := &seedOTSender{params: params}
receiver := &seedOTReceiver{params: params}
senderPipe, receiverPipe := NewPipeWrappers()
errors := make(chan error, 2) // warning: if one party errors, the other will sit there forever. add timeouts.
go func() {
errors <- sender.kosSetup(senderPipe)
}()
go func() {
errors <- receiver.kosSetup(receiverPipe)
}()
for i := 0; i < 2; i++ {
require.Nil(t, <-errors)
}
for i := 0; i < kappa; i++ {
require.Equal(t, receiver.Rho[i], sender.Rho[i][receiver.choice[i]])
}
}
func TestCOTExtension(t *testing.T) {
params, err := NewParams(btcec.S256(), curves.NewK256Scalar())
require.Nil(t, err)
const multiplicity = 2
sender := newCOTSender(multiplicity, &seedOTReceiver{params: params})
receiver := newCOTReceiver(multiplicity, &seedOTSender{params: params})
senderPipe, receiverPipe := NewPipeWrappers()
errors := make(chan error, 2) // warning: if one party errors, the other will sit there forever. add timeouts.
go func() {
errors <- receiver.sender.kosSetup(receiverPipe)
}()
go func() {
errors <- sender.receiver.kosSetup(senderPipe)
}()
for i := 0; i < 2; i++ {
require.Nil(t, <-errors)
}
for i := 0; i < kappa; i++ {
require.Equal(t, sender.receiver.Rho[i], receiver.sender.Rho[i][sender.receiver.choice[i]])
}
idExt := [32]byte{}
_, err = rand.Read(idExt[:])
require.Nil(t, err)
choice := make([]byte, receiver.l>>3) // Bob's
_, err = rand.Read(choice[:])
require.Nil(t, err)
input := [2 * kappa * multiplicity]*big.Int{} // Alice's
inputOT := [2 * s][]*big.Int{} // Alice's
for i := 0; i < 2*s; i++ {
inputOT[i] = make([]*big.Int, multiplicity)
}
for j := 0; j < 2*kappa*multiplicity; j++ {
input[j], err = params.Scalar.Random()
require.Nil(t, err)
}
for j := 0; j < 2*s; j++ {
for k := 0; k < multiplicity; k++ {
inputOT[j][k], err = params.Scalar.Random()
require.Nil(t, err)
}
}
go func() {
errors <- receiver.cOT(idExt, choice, receiverPipe)
}()
go func() {
errors <- sender.cOT(idExt, input[:], inputOT, senderPipe)
}()
for i := 0; i < 2; i++ {
require.Nil(t, <-errors)
}
for j := 0; j < 2*kappa*multiplicity; j++ {
bit := choice[j>>3]>>(j&0x07)&0x01 == 1
temp := params.Scalar.Add(sender.tA[j], receiver.tB[j])
if bit {
require.Equal(t, temp, input[j])
} else {
require.Zero(t, temp.Cmp(new(big.Int)))
}
}
for j := 0; j < 2*s; j++ {
bit := choice[(2*kappa*multiplicity+j)>>3]>>(j&0x07)&0x01 == 1
for k := 0; k < multiplicity; k++ {
temp := params.Scalar.Add(sender.tAOT[j][k], receiver.tBOT[j][k])
if bit {
require.Equal(t, temp, inputOT[j][k])
} else {
require.Zero(t, temp.Cmp(new(big.Int)))
}
}
}
}