Skip to content

Commit ab72bee

Browse files
committed
Working better implem for glitch
1 parent f2f17dd commit ab72bee

6 files changed

+152
-71
lines changed

Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ OBJS = \
99
checker_helper.o \
1010
checker.o \
1111
binverif.o \
12+
gray.o \
1213
prob_desc.o
1314

1415
binverif: $(OBJS)
1516
$(CC) -lpthread -o $@ $(OBJS)
1617

17-
binverif.o: binverif.c checker_helper.o prob_desc.o checker.o combinations.o
18+
binverif.o: binverif.c checker_helper.o prob_desc.o checker.o combinations.o gray.o
1819
$(CC) $(FLAGS) -o $@ -c $<
1920

2021
%.o: %.c %.h prob_desc.h

checker.c

+92-34
Original file line numberDiff line numberDiff line change
@@ -4,86 +4,144 @@
44
#include <stdio.h>
55

66
#include "combinations.h"
7-
#include "prob_desc.h"
87
#include "checker_helper.h"
98
#include "checker.h"
9+
#include "gray.h"
1010

1111
#ifdef VECT
1212

13-
int check_support(const int k, const int nb_internal, __m256i probes_a_curr,
14-
__m256i probes_b_curr, uint64_t probes_r_curr, __m256i **probes_a_all,
15-
__m256i **probes_b_all, int check_sni)
13+
int check_support(const struct comb_t comb_struct, const int nb_internal, __m256i probes_a_curr,
14+
__m256i probes_b_curr, uint64_t probes_r_curr, __m256i **probes_a_all,
15+
__m256i **probes_b_all, uint64_t *probes_r_all[NB_PR], int check_sni)
1616
{
17+
18+
#ifdef GLITCH
19+
20+
uint64_t *counters = malloc(comb_struct.k*sizeof(uint64_t));
21+
int *local_radices = malloc(comb_struct.k*sizeof(int));
22+
int *corres = malloc(comb_struct.k*sizeof(int));
23+
24+
int nb_nontrivials = 0;
25+
uint64_t c = 0;
26+
uint64_t i;
27+
int to_incr, to_incr_bin, p;
28+
int attack = 0;
29+
30+
for (i = 0; i < comb_struct.k; i++) {
31+
if (radices[comb_struct.combination[i]] > 1) {
32+
//printf("nb: %d\n", nb_nontrivials);
33+
counters[nb_nontrivials] = 1;
34+
local_radices[nb_nontrivials] = radices[comb_struct.combination[i]];
35+
corres[nb_nontrivials] = i;
36+
nb_nontrivials++;
37+
}
38+
}
39+
40+
41+
while ((to_incr = next_increment(&c, local_radices, nb_nontrivials)) != -1) {
42+
43+
// Increment lower-level gray code
44+
to_incr_bin = next_increment_bin(&(counters[to_incr]), local_radices[to_incr]);
45+
p = comb_struct.combination[corres[to_incr]];
46+
probes_a_curr = _mm256_xor_si256(probes_a_curr, probes_a_all[p][to_incr_bin]);
47+
probes_b_curr = _mm256_xor_si256(probes_b_curr, probes_b_all[p][to_incr_bin]);
48+
probes_r_curr ^= probes_r_all[p][to_incr_bin];
49+
50+
if (counters[to_incr] == 0) {
51+
to_incr_bin = next_increment_bin(&(counters[to_incr]), local_radices[to_incr]);
52+
p = comb_struct.combination[corres[to_incr]];
53+
probes_a_curr = _mm256_xor_si256(probes_a_curr, probes_a_all[p][to_incr_bin]);
54+
probes_b_curr = _mm256_xor_si256(probes_b_curr, probes_b_all[p][to_incr_bin]);
55+
probes_r_curr ^= probes_r_all[p][to_incr_bin];
56+
}
57+
58+
59+
if (check_sni) {
60+
attack |= check_attack_sni(comb_struct.k, nb_internal, probes_r_curr, probes_a_curr, probes_b_curr);
61+
} else {
62+
attack |= check_attack_ni(comb_struct.k, probes_r_curr, probes_a_curr, probes_b_curr);
63+
}
64+
65+
}
66+
67+
free(counters);
68+
free(local_radices);
69+
free(corres);
70+
71+
return attack;
72+
#endif
73+
1774
if (check_sni) {
18-
return check_attack_sni(k, nb_internal, probes_r_curr, probes_a_curr, probes_b_curr);
75+
return check_attack_sni(comb_struct.k, nb_internal, probes_r_curr, probes_a_curr, probes_b_curr);
1976
} else {
20-
return check_attack_ni(k, probes_r_curr, probes_a_curr, probes_b_curr);
77+
return check_attack_ni(comb_struct.k, probes_r_curr, probes_a_curr, probes_b_curr);
2178
}
2279

2380
}
2481

2582
int next_support(struct comb_t *comb_struct, struct comb_diff_t *comb_diff,
2683
__m256i *probes_a_curr, __m256i *probes_b_curr, uint64_t *probes_r_curr,
27-
__m256i **probes_a_all, __m256i **probes_b_all,
84+
__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR], uint64_t *probes_r_all[NB_PR],
2885
uint64_t *nb_internal, int check_sni)
2986
{
30-
next_combination(comb_struct, comb_diff);
31-
if (comb_struct->done) return -1;
87+
next_combination(comb_struct, comb_diff);
88+
if (comb_struct->done) return -1;
3289

33-
// Adjust the number of internal probes
34-
if (check_sni) {
35-
if (comb_diff->to_del < NB_INT) nb_internal--;
36-
if (comb_diff->to_add < NB_INT) nb_internal++;
37-
}
90+
// Adjust the number of internal probes
91+
if (check_sni) {
92+
if (comb_diff->to_del < NB_INT) nb_internal--;
93+
if (comb_diff->to_add < NB_INT) nb_internal++;
94+
}
3895

39-
*probes_a_curr = _mm256_xor_si256(*probes_a_curr, probes_a_all[comb_diff->to_del][0]);
40-
*probes_a_curr = _mm256_xor_si256(*probes_a_curr, probes_a_all[comb_diff->to_add][0]);
96+
*probes_a_curr = _mm256_xor_si256(*probes_a_curr, probes_a_all[comb_diff->to_del][0]);
97+
*probes_a_curr = _mm256_xor_si256(*probes_a_curr, probes_a_all[comb_diff->to_add][0]);
4198

42-
*probes_b_curr = _mm256_xor_si256(*probes_b_curr, probes_b_all[comb_diff->to_del][0]);
43-
*probes_b_curr = _mm256_xor_si256(*probes_b_curr, probes_b_all[comb_diff->to_add][0]);
99+
*probes_b_curr = _mm256_xor_si256(*probes_b_curr, probes_b_all[comb_diff->to_del][0]);
100+
*probes_b_curr = _mm256_xor_si256(*probes_b_curr, probes_b_all[comb_diff->to_add][0]);
44101

45-
*probes_r_curr ^= probes_r[comb_diff->to_del] ^ probes_r[comb_diff->to_add];
102+
*probes_r_curr ^= probes_r_all[comb_diff->to_del][0] ^ probes_r_all[comb_diff->to_add][0];
46103

47-
return 0;
104+
return 0;
48105
}
49106

50107
int check_partial(struct comb_t comb_struct, uint64_t nb, int check_sni)
51108
{
52109
uint64_t nb_internal;
53110
struct comb_diff_t comb_diff;
54111
uint64_t probes_r_curr;
112+
uint64_t *probes_r_all[NB_PR];
55113
int attack = 0;
56114
uint64_t c = 0;
57115
__m256i probes_a_curr;
58116
__m256i probes_b_curr;
59117
__m256i *probes_a_all[NB_PR];
60118
__m256i *probes_b_all[NB_PR];
61-
init_sh_all(probes_a_all, probes_b_all);
119+
init_all(probes_a_all, probes_b_all, probes_r_all);
62120

63121
init_sh_curr(&probes_a_curr, probes_a_all, comb_struct.combination, comb_struct.k);
64122
init_sh_curr(&probes_b_curr, probes_b_all, comb_struct.combination, comb_struct.k);
65-
init_r_curr(&probes_r_curr, comb_struct.combination, comb_struct.k);
123+
init_r_curr(&probes_r_curr, probes_r_all, comb_struct.combination, comb_struct.k);
66124

67125
c = 0;
68-
nb_internal = 0;
69-
for (uint64_t i = 0; i < comb_struct.k; i++)
70-
nb_internal += comb_struct.combination[i] < NB_INT ? 1 : 0;
126+
nb_internal = 0;
127+
for (uint64_t i = 0; i < comb_struct.k; i++)
128+
nb_internal += comb_struct.combination[i] < NB_INT ? 1 : 0;
71129

72130
while (!attack && c < nb) {
73131
c++;
74132

75133

76-
attack = check_support(comb_struct.k, nb_internal, probes_a_curr,
134+
attack = check_support(comb_struct, nb_internal, probes_a_curr,
77135
probes_b_curr, probes_r_curr, probes_a_all, probes_b_all,
78-
check_sni);
136+
probes_r_all, check_sni);
79137
if (next_support(&comb_struct, &comb_diff, &probes_a_curr, &probes_b_curr,
80-
&probes_r_curr, probes_a_all, probes_b_all, &nb_internal,
81-
check_sni)) {
138+
&probes_r_curr, probes_a_all, probes_b_all, probes_r_all,
139+
&nb_internal, check_sni)) {
82140
break;
83141
}
84142
}
85143

86-
free_sh_all(probes_a_all, probes_b_all);
144+
free_all(probes_a_all, probes_b_all, probes_r_all);
87145
if (attack) {
88146
printf("\n");
89147
print_combination(comb_struct);
@@ -119,11 +177,11 @@ int check_partial(struct comb_t comb_struct, uint64_t nb, int check_sni)
119177
init_r_curr(probes_r_curr, comb_struct.combination, comb_struct.k);
120178

121179
c = 0;
122-
nb_internal = 0;
123-
for (uint64_t i = 0; i < comb_struct.k; i++)
124-
nb_internal += comb_struct.combination[i] < NB_INT ? 1 : 0;
180+
nb_internal = 0;
181+
for (uint64_t i = 0; i < comb_struct.k; i++)
182+
nb_internal += comb_struct.combination[i] < NB_INT ? 1 : 0;
125183

126-
while (!attack_ni && !attack_sni && c < nb) {
184+
while (!attack_ni && !attack_sni && c < nb) {
127185
c++;
128186

129187
if (check_sni) {

checker_helper.c

+12-6
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@
88
#include "popcount256_16.h"
99
#include <stdio.h>
1010

11-
void init_sh_all(__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR])
11+
void init_all(__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR],
12+
uint64_t *probes_r_all[NB_PR])
1213
{
1314
uint64_t i, j;
1415
uint64_t c = 0;
1516

1617
for (i = 0; i < NB_PR; i++) {
1718
probes_a_all[i] = aligned_alloc(32, radices[i]*sizeof(__m256i));
1819
probes_b_all[i] = aligned_alloc(32, radices[i]*sizeof(__m256i));
20+
probes_r_all[i] = calloc(radices[i], sizeof(uint64_t));
1921
for (j = 0; j < radices[i]; j++) {
2022
probes_a_all[i][j] = _mm256_loadu_si256((__m256i*)(probes_sh_a[c]));
2123
probes_b_all[i][j] = _mm256_loadu_si256((__m256i*)(probes_sh_b[c]));
24+
probes_r_all[i][j] = probes_r[c];
2225
c++;
2326
}
2427
}
@@ -36,22 +39,25 @@ void init_sh_curr(__m256i *probes_sh_curr, __m256i *probes_sh_all[NB_PR],
3639
}
3740
}
3841

39-
void init_r_curr(uint64_t *probes_r_curr, uint64_t *combination, uint64_t k)
42+
void init_r_curr(uint64_t *probes_r_curr, uint64_t *probes_r_all[NB_PR],
43+
uint64_t *combination, uint64_t k)
4044
{
4145
uint64_t i, j;
4246
*probes_r_curr = 0;
4347
for (i = 0; i < k; i++) {
4448
j = combination[i];
45-
*probes_r_curr ^= probes_r[j];
49+
*probes_r_curr ^= probes_r_all[j][0];
4650
}
4751
}
4852

49-
void free_sh_all(__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR])
53+
void free_all(__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR],
54+
uint64_t *probes_r_all[NB_PR])
5055
{
5156
uint64_t i;
5257
for (i = 0; i < NB_PR; i++) {
5358
free(probes_a_all[i]);
5459
free(probes_b_all[i]);
60+
free(probes_r_all[i]);
5561
}
5662
}
5763

@@ -164,8 +170,8 @@ void init_sh_curr(uint64_t probes_sh_curr[NB_SH][SIZE_SH],
164170

165171
/* Adding the right probes */
166172
for (i = 0; i < k; i++) {
167-
j = combination[i];
168-
probes_sh_xor(probes_sh_curr, probes_sh_all[j]);
173+
j = combination[i];
174+
probes_sh_xor(probes_sh_curr, probes_sh_all[j]);
169175
}
170176
}
171177

checker_helper.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
#ifdef VECT
66

7-
void init_sh_all(__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR]);
7+
void init_all(__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR],
8+
uint64_t *probes_r_all[NB_PR]);
89
void init_sh_curr(__m256i *probes_sh_curr, __m256i *probes_sh_all[NB_PR],
910
uint64_t *combination, uint64_t k);
10-
void init_r_curr(uint64_t *probes_r_curr, uint64_t *combination, uint64_t k);
11-
void free_sh_all(__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR]);
11+
void init_r_curr(uint64_t *probes_r_curr, uint64_t *probes_r_all[NB_PR],
12+
uint64_t *combination, uint64_t k);
13+
void free_all(__m256i *probes_a_all[NB_PR], __m256i *probes_b_all[NB_PR],
14+
uint64_t *probes_r_all[NB_PR]);
1215
int check_attack_ni(uint64_t nb_probes, uint64_t r_sum, __m256i sh_sum_a,
1316
__m256i sh_sum_b);
1417
int check_attack_sni(uint64_t nb_probes, uint64_t nb_internal, uint64_t r_sum,

gen_prob_desc.sage

+37-19
Original file line numberDiff line numberDiff line change
@@ -181,17 +181,36 @@ def radices_to_c(radices):
181181
return code
182182

183183

184-
def update_radices(radices, probe_expl):
185-
if probe_expl not in radices:
186-
radices[probe_expl] = 0
187-
radices[probe_expl] += 1
184+
def sort_all_probes(all_probes):
185+
"""
186+
all_probes = (probes_r, probes_sh, probes_expl)
187+
"""
188+
new_all_probes = []
189+
while all_probes:
190+
pex = all_probes[0][2]
191+
for i, p in enumerate(all_probes):
192+
if p[2] == pex:
193+
new_all_probes.append(all_probes.pop(i))
194+
195+
return new_all_probes
196+
197+
198+
def compute_radices(all_probes):
199+
print(len(all_probes))
200+
radices = []
201+
curr_exp = all_probes[0][2]
202+
c = 0
203+
for p in all_probes:
204+
if p[2] == curr_exp:
205+
c += 1
206+
else:
207+
radices.append(c)
208+
c = 1
209+
curr_exp = p[2]
188210

211+
radices.append(c)
189212

190-
def sorted_radices_array(radices, probes_expl):
191-
res = []
192-
for probe_expl in probes_expl:
193-
res.append(radices[probe_expl])
194-
return res
213+
return radices
195214

196215

197216
if __name__ == "__main__":
@@ -229,7 +248,6 @@ if __name__ == "__main__":
229248
parser = MyParser(d, names_r, glitch)
230249

231250
all_probes = []
232-
radices = {}
233251
nb_external = 0
234252

235253
for l in txt_desc[2:]:
@@ -243,17 +261,15 @@ if __name__ == "__main__":
243261
if probe_expl == l:
244262
nb_external += 1
245263
all_probes.append((probe_r, probe_sh, probe_expl))
246-
update_radices(radices, probe_expl)
247264

248265
# Ensure uniqueness of probe expression
249266
for probe_r, probe_sh, probe_expl in res:
250267
if any(probe_r == p[0] and probe_sh == p[1] for p in all_probes):
251268
continue
252269
all_probes.insert(0, (probe_r, probe_sh, probe_expl))
253-
update_radices(radices, probe_expl)
254270

271+
all_probes = sort_all_probes(all_probes)
255272
(probes_r, probes_sh, probes_expl) = list(zip(*all_probes))
256-
probes_r = matrix(probes_r).transpose()
257273

258274
if not glitch:
259275
# Exclude redundant probes
@@ -277,11 +293,14 @@ if __name__ == "__main__":
277293
if p not in probes_todel:
278294
pos_to_keep.append(i)
279295

280-
probes_r = probes_r.matrix_from_columns(pos_to_keep)
296+
probes_r = [probes_r[i] for i in pos_to_keep]
281297
probes_sh = [probes_sh[i] for i in pos_to_keep]
282298
probes_expl = [probes_expl[i] for i in pos_to_keep]
283299

284-
radices = sorted_radices_array(radices, probes_expl)
300+
301+
radices = compute_radices(list(zip(probes_r, probes_sh, probes_expl)))
302+
303+
probes_r = matrix(probes_r).transpose()
285304
nb_sh = len(probes_sh[0].rows()[0])
286305
nb_r = len(probes_r.columns()[0])
287306
vect = False
@@ -320,20 +339,19 @@ if __name__ == "__main__":
320339
f.write("#ifndef PROBES_DESC_H\n")
321340
f.write("#define PROBES_DESC_H\n\n")
322341
f.write("#define NB_SH {}\n".format(nb_sh))
323-
f.write("#define NB_PR {}\n".format(len(probes_sh)))
342+
f.write("#define NB_PR {}\n".format(len(radices)))
324343
f.write("#define NB_R {}\n".format(nb_r))
325344
f.write("#define D {}\n".format(d))
326345
f.write("#define NB_INT {}\n".format(nb_internal))
327346
if not vect:
328347
f.write("#define SIZE_SH {}\n".format(nb_sh // 64 + 1))
329348
f.write("#define SIZE_R {}\n".format(nb_r // 64 + 1))
330349
else:
331-
f.write("#define VECT")
350+
f.write("#define VECT\n")
332351

333352
if glitch:
334-
f.write("#define GLITCH")
353+
f.write("#define GLITCH\n")
335354

336-
f.write("\n")
337355
f.write("/* Probe description for {} */".format(filename))
338356
f.write("\n\n")
339357
f.write("char *filename;")

0 commit comments

Comments
 (0)