Skip to content

Commit 3296766

Browse files
committed
channel tests
1 parent cfbacec commit 3296766

File tree

10 files changed

+344
-29
lines changed

10 files changed

+344
-29
lines changed

lib/Channel.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef CHANNEL_H
22
#define CHANNEL_H
33

4+
#include "Common.h"
45
#include "Polynomial.h"
56

67
typedef struct {
@@ -15,10 +16,12 @@ typedef struct {
1516
} Channel;
1617

1718
typedef struct {
18-
uint64_t ***lambda;
19-
size_t size[3];
19+
Matrix2D *data;
20+
size_t size;
2021
} Lambda;
2122

23+
Matrix2D *lambda_get(Lambda *lambda, size_t idx);
24+
2225
int init_channel(Channel *, uint64_t, uint64_t, uint64_t);
2326

2427
int generate_u(const Channel *, const Parameters *, Polynomial *);

lib/Common.h

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
extern "C" {
66
#endif
77

8+
#include <stddef.h>
89
#include <stdint.h>
910

11+
#define TRANSFORM_COUNT 3
12+
1013
// gcd = ax + by
1114
typedef struct {
1215
uint64_t gcd;
@@ -19,6 +22,26 @@ typedef struct {
1922
uint64_t second;
2023
} Pair;
2124

25+
typedef struct {
26+
size_t dim;
27+
uint64_t *data;
28+
} Matrix2D;
29+
30+
static inline uint64_t *matrix2d_row(Matrix2D *matrix, size_t row) {
31+
return matrix->data + row * matrix->dim;
32+
}
33+
34+
static inline uint64_t matrix2d_get(Matrix2D *matrix, size_t row, size_t col) {
35+
size_t dim = matrix->dim;
36+
return matrix->data[row * dim + col];
37+
}
38+
39+
static inline void matrix2d_set(Matrix2D *matrix, size_t row, size_t col,
40+
uint64_t value) {
41+
size_t dim = matrix->dim;
42+
matrix->data[row * dim + col] = value;
43+
}
44+
2245
uint64_t gcd(uint64_t x, uint64_t y);
2346

2447
Xgcd xgcd(uint64_t a, uint64_t b);
@@ -28,7 +51,6 @@ int are_coprime(uint64_t x, uint64_t y);
2851
Pair randinverse(uint64_t value);
2952

3053
uint64_t randrange(uint64_t lower, uint64_t upper);
31-
// factors(uint64_t value);
3254

3355
uint64_t normal_rand(double mean, double stddev);
3456

@@ -41,13 +63,18 @@ static inline uint64_t clamp(uint64_t min_value, uint64_t max_value,
4163
return max(min_value, min(max_value, value));
4264
}
4365

44-
int fill_inv_random(size_t dim, uint64_t m[dim][dim], inv_m[dim][dim]);
66+
int matrix2d_multiply(Matrix2D *m, Matrix2D *invm, Matrix2D *result,
67+
uint64_t mod);
4568

46-
int random_swap_transform(size_t dim, uint64_t m[dim][dim]) {}
69+
typedef int (*Transformer)(Matrix2D *m, Matrix2D *invm, uint64_t mod);
4770

48-
int random_multiply_transform(size_t dim, uint64_t m[dim][dim]) {}
71+
int swap_transform(Matrix2D *m, Matrix2D *invm, uint64_t mod);
72+
int linear_mix_transform(Matrix2D *m, Matrix2D *invm, uint64_t mod);
73+
int scale_transform(Matrix2D *m, Matrix2D *invm, uint64_t mod);
4974

50-
int random_linear_transform(size_t dim, uint64_t m[dim][dim]) {}
75+
int matrix2d_eye(Matrix2D *m);
76+
int fill_random_invertible_pairs(Matrix2D *m, Matrix2D *invm, uint64_t mod,
77+
size_t iterations);
5178

5279
#ifdef __cplusplus
5380
}

src/Channel.c

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
#include <math.h>
44

5-
#include "Common.h"
6-
75
int init_channel(Channel *channel, uint64_t p, uint64_t q, uint64_t w) {
86
channel->w = w;
97
channel->p = p;
@@ -15,6 +13,8 @@ int init_channel(Channel *channel, uint64_t p, uint64_t q, uint64_t w) {
1513
return 0;
1614
}
1715

16+
Matrix2D *lambda_get(Lambda *lambda, size_t idx) { return &lambda->data[idx]; }
17+
1818
int generate_u(const Channel *channel, const Parameters *param, Polynomial *u) {
1919
uint64_t nonzeros = randrange(
2020
param->dim / 2,
@@ -48,17 +48,46 @@ int generate_u(const Channel *channel, const Parameters *param, Polynomial *u) {
4848

4949
int generate_secret(const Channel *channel, const Parameters *param,
5050
const Polynomial *u, PolyArray *secret, Lambda *lambda) {
51-
uint64_t m[param.dim][param.dim];
52-
uint64_t inv_m[param.dim][param.dim];
53-
fill_inv_random(m, inv_m, param.dim);
54-
//
55-
// for (int i = 0; i < secret->size; ++i) {
56-
// for (int j = 0; j < secret[i]->size; ++j) {
57-
// secret[i][j] = m[j][i];
58-
// }
59-
// }
51+
Matrix2D m;
52+
Matrix2D invm;
53+
54+
m.dim = param->dim;
55+
invm.dim = param->dim;
56+
57+
size_t required_mem = m.dim * m.dim;
58+
uint64_t mem[2 * required_mem];
59+
m.data = mem;
60+
invm.data = mem + required_mem;
61+
62+
fill_random_invertible_pairs(&m, &invm, channel->q, 600);
63+
64+
secret->size = m.dim;
65+
for (int i = 0; i < m.dim; ++i) {
66+
for (int j = 0; j < m.dim; ++j) {
67+
secret->polies[i].coeffs[j] = matrix2d_get(&m, j, i); // m[j][i];
68+
}
69+
}
6070

61-
// TODO:
71+
Matrix2D *arr = &m;
72+
Polynomial a_ij_poly; // TODO:
73+
74+
Coeff miim[2 * secret->size];
75+
76+
for (int i = 0; i < secret->size; ++i) {
77+
for (int j = 0; j < secret->size; ++j) {
78+
set_polynomial(&a_ij_poly, miim, 2 * secret->size);
79+
poly_mul(&secret->polies[i], &secret->polies[j], &a_ij_poly, channel->q);
80+
poly_mod(&a_ij_poly, u, channel->q);
81+
82+
for (int row = 0; row < arr->dim; row++) {
83+
matrix2d_set(arr, row, j, a_ij_poly.coeffs[arr->dim - row - 1]);
84+
}
85+
}
86+
87+
matrix2d_multiply(&invm, arr, lambda_get(lambda, i), channel->q);
88+
}
89+
90+
return 0;
6291
}
6392

6493
int generate_f0(const Channel *channel, const Parameters *param,

src/Common.c

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "Common.h"
22

33
#include <stdlib.h>
4+
#include <string.h>
45

56
uint64_t normal_rand(double mean, double stddev) {
67
// TODO:
@@ -58,10 +59,100 @@ Pair randinverse(uint64_t value) {
5859

5960
Xgcd result = xgcd(a, value);
6061

61-
Pair p = {.first = a, .second = result.a};
62+
Pair p = {.first = a, .second = result.a > 0 ? result.a : result.a + value};
6263
return p;
6364
}
6465

65-
// factors(uint64_t value) {
66-
// // TODO:
67-
// }
66+
int matrix2d_multiply(Matrix2D *m, Matrix2D *invm, Matrix2D *result,
67+
uint64_t mod) {
68+
size_t dim = m->dim;
69+
for (int i = 0; i < dim; i++) {
70+
for (int j = 0; j < dim; j++) {
71+
matrix2d_set(result, i, j, 0);
72+
for (int k = 0; k < dim; k++) {
73+
matrix2d_set(result, i, j,
74+
matrix2d_get(result, i, j) +
75+
matrix2d_get(m, i, k) * matrix2d_get(invm, k, j));
76+
}
77+
matrix2d_set(result, i, j, matrix2d_get(result, i, j) % mod);
78+
}
79+
}
80+
81+
return 0;
82+
}
83+
84+
int swap_transform(Matrix2D *m, Matrix2D *invm, uint64_t mod) {
85+
size_t dim = m->dim;
86+
uint64_t tmp;
87+
uint64_t tmp_row[dim];
88+
89+
size_t source = randrange(1, dim - 1);
90+
size_t target = randrange(0, source - 1);
91+
92+
for (size_t row = 0; row < dim; ++row) {
93+
tmp = matrix2d_get(m, row, source);
94+
matrix2d_set(m, row, source, matrix2d_get(m, row, target));
95+
matrix2d_set(m, row, target, tmp);
96+
}
97+
98+
memcpy(tmp_row, matrix2d_row(invm, source), sizeof(uint64_t) * dim);
99+
memcpy(matrix2d_row(invm, source), matrix2d_row(invm, target),
100+
sizeof(uint64_t) * dim);
101+
memcpy(matrix2d_row(invm, target), tmp_row, sizeof(uint64_t) * dim);
102+
103+
return 0;
104+
}
105+
106+
int scale_transform(Matrix2D *m, Matrix2D *invm, uint64_t mod) {
107+
size_t dim = m->dim;
108+
Pair scale = randinverse(mod);
109+
for (size_t idx = 0; idx < dim * dim; ++idx) {
110+
m->data[idx] = (m->data[idx] * scale.first) % mod;
111+
invm->data[idx] = (invm->data[idx] * scale.second) % mod;
112+
}
113+
return 1;
114+
}
115+
116+
int linear_mix_transform(Matrix2D *m, Matrix2D *invm, uint64_t mod) {
117+
size_t dim = m->dim;
118+
size_t scale = randrange(1, mod - 1);
119+
size_t source = randrange(1, dim - 1);
120+
size_t target = randrange(0, source - 1);
121+
122+
for (size_t row = 0; row < dim; ++row) {
123+
matrix2d_set(
124+
m, row, target,
125+
(matrix2d_get(m, row, target) + matrix2d_get(m, row, source) * scale) %
126+
mod);
127+
matrix2d_set(invm, source, row,
128+
(matrix2d_get(invm, source, row) +
129+
matrix2d_get(invm, target, row) * (mod - scale)) %
130+
mod);
131+
}
132+
133+
return 0;
134+
}
135+
136+
int matrix2d_eye(Matrix2D *m) {
137+
size_t dim = m->dim;
138+
memset(m->data, 0, dim * dim * sizeof(uint64_t));
139+
140+
for (size_t row = 0; row < dim; ++row)
141+
matrix2d_set(m, row, row, 1);
142+
143+
return 0;
144+
}
145+
146+
int fill_random_invertible_pairs(Matrix2D *m, Matrix2D *invm, uint64_t mod,
147+
size_t iterations) {
148+
const Transformer transformers[TRANSFORM_COUNT] = {
149+
&swap_transform, &scale_transform, &linear_mix_transform};
150+
151+
matrix2d_eye(m);
152+
matrix2d_eye(invm);
153+
154+
for (int i = 0; i < iterations; ++i) {
155+
size_t select = randrange(0, TRANSFORM_COUNT - 1);
156+
transformers[select](m, invm, mod);
157+
}
158+
}

src/Polynomial.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ int poly_lshift(const Polynomial *poly1, const Polynomial *poly2,
139139
result->coeffs[i] = poly1->coeffs[i];
140140
}
141141

142+
poly_fit(result, mod);
142143
return 0;
143144
}
144145

tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ find_package(Threads REQUIRED)
33
set(TESTS_SOURCES
44
polynomial-test.c
55
channel-test.c
6+
common-test.c
67
main-test.c
78
)
89

tests/channel-test.c

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <Polynomial.h>
55

66
#include <assert.h>
7-
#include <stdio.h>
87

98
int generate_u_test() {
109
Polynomial u;
@@ -41,18 +40,48 @@ int generate_f0_test() {
4140
param.dim = 10;
4241

4342
generate_f0(&channel, &param, &f0);
44-
for (int i = 0; i < 10; i++) {
45-
for (int j = 0; j < 10; j++) {
46-
printf("%ld\t", f0.polies[i].coeffs[j]);
47-
}
48-
printf("\n");
43+
44+
return 1;
45+
}
46+
47+
int generate_secret_test() {
48+
Channel channel;
49+
init_channel(&channel, 2, 33, 1);
50+
51+
Parameters param;
52+
param.dim = 10;
53+
54+
Coeff mem_u[11];
55+
Polynomial u;
56+
set_polynomial(&u, mem_u, 11);
57+
set_zero(&u);
58+
generate_u(&channel, &param, &u);
59+
60+
Polynomial polies[10];
61+
Coeff mem_secret[10][10];
62+
for (int i = 0; i < 10; ++i)
63+
set_polynomial(&polies[i], mem_secret[i], 10);
64+
PolyArray secret;
65+
secret.size = 10;
66+
secret.polies = polies;
67+
68+
Matrix2D data[10];
69+
uint64_t mem_lambda[10][100];
70+
for (int i = 0; i < 10; ++i) {
71+
data[i].data = mem_lambda[i];
72+
data[i].dim = 10;
4973
}
74+
Lambda lambda;
75+
lambda.size = 10;
76+
lambda.data = data;
5077

78+
generate_secret(&channel, &param, &u, &secret, &lambda);
5179
return 1;
5280
}
5381

5482
int run_channel_tests() {
5583
assert(generate_u_test());
5684
assert(generate_f0_test());
85+
assert(generate_secret_test());
5786
return 1;
5887
}

0 commit comments

Comments
 (0)