最近研究了spdz源代码里的BaseOT.h
写了两个测试程序。第一个是OT里的发送者,第二个是接受者。
useOT.cpp
#include <iostream>
#include "OT/BaseOT.h"
#include "Networking/Player.h"
#include "Tools/octetStream.h"
using namespace std;
int main()
{
int player = 0;
int nplayers = 2;
const char* servername = "127.0.0.1";
int pnb = 8000;
int my_port = 8001;
Names n = Names(player,nplayers,servername,pnb,my_port);
//Names n = Names(player,nplayers,servername,pnb,Names::DEFAULT_PORT);
RealTwoPartyPlayer tp = RealTwoPartyPlayer(n,1,101);
//PlainPlayer p = PlainPlayer(n,10);
OT_ROLE ot_role = SENDER;
//int mynum = 8000;
RealTwoPartyPlayer *s;
s = &tp;
BaseOT send = BaseOT(8,128,s, ot_role);
send.exec_base();
cout<< "Success !!" <<endl;
return 0;
}
程序详解:
- 实例化类
Names
用来开启并监听端口,进行通信。 - 实例化类
RealTwoPartyPlaye
用来模拟两个参与方。- 第一个参数是Names类
- 第二个参数:other_player,表示另一个参与者的编号
- 第三个参数:唯一标志id
- 实例化一个BaseOT类
- 第一个参数nOT,表示执行OT的数量,这里我设置为8,注意必须为4的倍数,要不会报错。
- 第二参数表示消息的长度,这里我设置为128比特。
- 第三个参数,参与方的类指针
- 第四个参数,ot的角色,这里有三个角色:发送者(SENDER),接收者(RECEIVER),两者都是(BOTH)。
- 实例化时候,也可以只给第三四个参数,这时候nOT和ot_length都默认为128
- 调用类方法
exec_base()
。运行的时候只需要这些参数,所有消息和选择比特都随机生成了。
useOTRec.cpp
#include <iostream>
#include "OT/BaseOT.h"
#include "Networking/Player.h"
#include "Tools/octetStream.h"
using namespace std;
int main()
{
int player = 1;
int nplayers = 2;
const char* servername = "127.0.0.1";
int pnb = 8000;
int my_port = 8002;
Names n = Names(player,nplayers,servername,pnb,my_port);
//Names n = Names(player,nplayers,servername,pnb,Names::DEFAULT_PORT);
RealTwoPartyPlayer tp = RealTwoPartyPlayer(n,0,101);
//PlainPlayer p = PlainPlayer(n,10);
OT_ROLE ot_role = RECEIVER;
//int mynum = 8000;
RealTwoPartyPlayer *s;
s = &tp;
BaseOT rec = BaseOT(8,128,s, ot_role);
rec.exec_base();
cout<< "Success !!" <<endl;
return 0;
}
makefile文件
# objs_SimpleOT = ../SimpleOT/ot_sender.o ../SimpleOT/ot_receiver.o ../SimpleOT/sc25519_random.o ../SimpleOT/ge25519_pack.o ../SimpleOT/ge25519_double.o ../SimpleOT/fe25519_pack.o
objs_SimpleOT = ../SimpleOT/*.o
all: useOT useOTRec
useOT: useOT.o
g++ -o useOT useOT.o ../OT/*.o $(objs_SimpleOT) ../libSPDZ.so -lntl -lmpirxx -lmpir -lsodium -lboost_system -lssl -lcrypto -lrt
useOTRec: useOTRec.o
g++ -o useOTRec useOTRec.o ../OT/*.o $(objs_SimpleOT) ../libSPDZ.so -lntl -lmpirxx -lmpir -lsodium -lboost_system -lssl -lcrypto -lrt
useOT.o: useOT.cpp ../Networking/Player.h ../OT/BaseOT.h
g++ -c useOT.cpp -I ~/spdz029 -march=native -g -Wextra -Wall -O3 -I. -pthread -DUSE_GF2N_LONG '-DPREP_DIR="Player-Data/"' -std=c++11 -Werror -fPIC -MMD -MP -c
useOTRec.o: useOTRec.cpp ../Networking/Player.h ../OT/BaseOT.h
g++ -c useOTRec.cpp -I ~/spdz029 -march=native -g -Wextra -Wall -O3 -I. -pthread -DUSE_GF2N_LONG '-DPREP_DIR="Player-Data/"' -std=c++11 -Werror -fPIC -MMD -MP -c
clean:
rm -f *.o main *.out useOT useOTRec *.d
编译
make all
编译时注意事项
把SimpleOT
文件夹里,ot_sender_test.c
和ot_receiver_test.c
里的main函数注释掉。然后分别运行命令make SimpleOT/ot_sender_test.o
和make SimpleOT/ot_receiver_test.o
运行
开两个终端,一个终端运行./useOT
,另一个运行./useOTRec
运行结果截图
./useOT
./useOTRec
运行说明
如果你的运行结果只有 Success!! 也表示运行成功。如果你想像上面一样显示结果,你需要修改OT/BaseOT.cpp
文件,在里面定义一个宏#define BASE_OT_DEBUG
。然后编译make BaseOT.o
。最后,make clean
和make all
两个测试程序。
--------------------------分割线---------------------------------------------
细心的小伙伴可能会在运行截图里发现一个bug。这个bug具体是什么,我不在这里说了,大家可以找一找,欢迎在评论区讨论。对于这个bug,根据与作者沟通,发布版本是不存在的,是因为我加了宏BASE_OT_DEBUG引起的。但是这个bug也不是我写的,确实是存在在0.2.9版本(博主使用的spdz版本)中的。在使用spdz库时,只要你不加这个宏,就没有bug。