Step 1:一开始什么都不知道,按部就班摸索安装。
类比编译原理实验,大概知道了这个编译器是个怎么回事。解决了一开始因VS对编译器留下的刻板印象。(原来还有这么简陋的命令行编程)
Step2:进入test看代码。发现看不懂。于是找了个文件看。(建议用谷歌)
API介绍:
第一方调用该函数监听提供的端口号。监听的应该是自己的端口号。【猜想】等待对方主动来连接自己大概,好像和三次握手不一样。 第二方调用该函数,用于连接第一方。参数server是第一方的ip。其中两个函数的port必须一样,否则会connect失败。【验证成功】
实例中,party多为1、2这样的数字,protocolDesc是一个对象。代码中创建协议就是通过初始化这个对象,可能和底部API实现有关。
提供需要执行的函数名和输入,执行Yao的加密电路协议。
Step3:结合文件理解代码,并编写代码。
#pragma once
#define MAXN 20
typedef struct protocolIO
{
char* s;//输入
int size;//输入的大小
char l[MAXN];//输出
} protocolIO;
int get_common(void* args);//功能函数
const char* mySide();//返回边名称,即是哪一方
————test1.c————
#include<obliv.h>
#include"../common/util.h"
//引用了该文件中的TCP连接函数ocTestUtilTcpOrDie(&pd,remote_host,argv[1]);
#include"test1.h"
const char* mySide(int currentParty)
{
if(currentParty==1) return "Generator";
else return "Evaluator";
}
int main(int argc,char *argv[])
{
ProtocolDesc pd;
protocolIO io;
if(argc<4)
{
fprintf(stderr,"%d: static missing\n",argv[1][0]=='1'?1:2);
return 1;
}
// skip input sanitization
const char* remote_host = (strcmp(argv[2],"--")?argv[2]:NULL);
io.size=strlen(argv[3]);//输入数据
if(io.size>MAXN)
{ fprintf(stderr,"string too big\n");
return 1;
}
io.s=argv[3];
//sscanf(argv[3],"%s",&io.s);
for(int i=io.size;i<MAXN;i++)
io.s[i]=remote_host?'#':'$';
//protocolUseStdio(&pd);
ocTestUtilTcpOrDie(&pd,remote_host,argv[1]);//tcp连接
int currentParty = (remote_host?2:1);
setCurrentParty(&pd,currentParty);
execYaoProtocol(&pd,get_common,&io);//加密电路协议的执行
cleanupProtocol(&pd);
fprintf(stderr,"\n%s ",mySide(currentParty));
fprintf(stderr," Common: %s\n",io.l);
return 0;
}
#include<obliv.oh>
#include<stdio.h>
#include"test1.h"
void readString(obliv unsigned char* dest, obliv int n,int party,char c);
int get_common(void* args)
{
protocolIO *io=args;
obliv char a[MAXN],b[MAXN];//这里注意不能用指针,未定义的指针会导致内存错误
obliv int size_a,size_b;
size_a = feedOblivInt(io->size,1);
size_b = feedOblivInt(io->size,2);
feedOblivCharArray(a,io->s,MAXN,1);
feedOblivCharArray(b,io->s,MAXN,2);
int n=0;//共同的字符个数
//使用obliv加密的语言的输入要用feed的API。非obliv则可用另外一个broadcast。【猜想已验证】
for(int i=0;i<MAXN;i++)
obliv if(i<size_a)
{
for(int j=0;j<MAXN;j++)
obliv if(j<size_b)
{
~obliv(_c)
{
bool d;
revealOblivBool(&d,a[i]==b[j],0);
if(d){revealOblivChar(&io->l[n],a[i],0);n++;}
} //该无条件执行块是为了修改n,因为n为外部定义的数据,在obliv块中被frozon,不能修改。
}
}
return 0;
}
//最后创建两个虚拟机,分别执行,第二方输入第一方的ip地址。执行成功!
第一台虚拟机输入:
./a.out port – 字符串 &
第二个虚拟机输入:
./a.out port ip地址 字符串