-
Notifications
You must be signed in to change notification settings - Fork 0
/
secure_deep_learning.oc~
124 lines (113 loc) · 2.45 KB
/
secure_deep_learning.oc~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include<obliv.oh>
#include"deep2.h"
#include<stdio.h>
#include<stdlib.h>
void extended_euclid(long long A1, long long A2, long long A3, long long B1, long long B2,long long B3)
{
long long Q;
long long T1,T2,T3;
if(B3==0){
mul_inverse= -1;
return;
}
if(B3==1){
mul_inverse= B2;
return;
}
Q=(long long)(A3/B3);
T1=A1-Q*B1;
T2=A2-Q*B2;
T3=A3-Q*B3;
A1=B1;
A2=B2;
A3=B3;
B1=T1;
B2=T2;
B3=T3;
extended_euclid(A1,A2,A3,B1,B2,B3);
}
void initiateRandoms(void* args)
{
protocolIO *io = args;
io->R1 = rand() % 294764863 + 2; // 294764863 is a 9 digit prime number
extended_euclid(1, 0, P, 0, 1, io->R1);
io->R1_ = (mul_inverse>=0)?mul_inverse:(P + mul_inverse);
io->R2 = rand() % 294764863 + 2;
extended_euclid(1, 0, P, 0, 1, io->R2);
io->R2_ = (mul_inverse>=0)?mul_inverse:(P + mul_inverse);
}
obliv long long mul(obliv long long a, obliv long long b)
{
obliv bool sign;
obliv long long s = 0;
long long bb;
obliv if(a>=0) // Handling the sign of the inputs
{
obliv if(b>=0)
sign = false;
else
sign = true;
}
else
{
obliv if(b<0)
sign = false;
else
sign = true;
}
obliv if(a<0)
a = 0 - a;
obliv if(b<0)
b = 0 - b;
revealOblivLLong(&bb, b, 0);
while(bb)
{
if(bb%2)
s = (s+a)%P;
bb /= 2;
a = (a+a)%P;
}
obliv if(sign)
s = 0 - s;
return s;
}
void computeNN(void* args)
{
obliv long long x[WIN*D], wx[WIN*D][H], w[H][C], h[H], y[C], R2;
obliv int res;
protocolIO *io = args;
for(int i = 0; i < WIN*D; i++)
x[i] = feedOblivLLong(io->x[i],1);
for(int i = 0; i < WIN*D; i++)
for(int j = 0; j < H; j++)
wx[i][j] = feedOblivLLong(io->wx[i][j],2);
for(int i = 0; i < H; i++)
for(int j = 0; j < C; j++)
w[i][j] = feedOblivLLong(io->w[i][j],2);
R2 = feedOblivLLong(io->R2,2);
// Compute the output 'h' of hidden layer
for(int i = 0; i < H; i++)
{
h[i] = 0;
for(int j = 0; j < WIN*D; j++)
h[i] = (h[i] + mul(x[j], wx[j][i]))%P;
obliv if(mul(R2, h[i]) > 10000000000000)
h[i] -= P;
obliv if(mul(R2, h[i]) < -10000000000000)
h[i] += P;
obliv if(h[i] < 0) // relu() non-linearity function
h[i] = 0;
}
// Compute the output 'y' of output layer
for(int i = 0; i < C; i++)
{
y[i] = 0;
for(int j = 0; j < H; j++)
y[i] = (y[i] + mul(h[j], w[j][i]))%P;
}
obliv if(y[0] > y[1])
res = 0;
else
res = 1;
revealOblivInt(&io->res, res, 0);
}