Obliv-c学习之旅


                    Obliv-c学习之旅

Step 1:一开始什么都不知道,按部就班摸索安装。

    类比编译原理实验,大概知道了这个编译器是个怎么回事。解决了一开始因VS对编译器留下的刻板印象。(原来还有这么简陋的命令行编程)

Step2:进入test看代码。发现看不懂。于是找了个文件看。(建议用谷歌)

Obliv-C

API介绍:

  

  第一方调用该函数监听提供的端口号。监听的应该是自己的端口号。【猜想】等待对方主动来连接自己大概,好像和三次握手不一样。 第二方调用该函数,用于连接第一方。参数server是第一方的ip。其中两个函数的port必须一样,否则会connect失败。【验证成功】

 实例中,party多为12这样的数字,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<stdio.h>

#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地址 字符串

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值