Skip to content

Commit 815fe5b

Browse files
committed
polynomial unit tests
1 parent 7c50386 commit 815fe5b

File tree

14 files changed

+486
-88
lines changed

14 files changed

+486
-88
lines changed

CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS On)
1919
add_compile_options(-Wall -Wextra -pedantic -Werror)
2020

2121
set(SOURCE_FILES
22-
${CMAKE_CURRENT_SOURCE_DIR}/src/Aces.c
22+
#${CMAKE_CURRENT_SOURCE_DIR}/src/Aces.c
23+
#${CMAKE_CURRENT_SOURCE_DIR}/src/Channel.c
24+
${CMAKE_CURRENT_SOURCE_DIR}/src/Common.c
25+
#${CMAKE_CURRENT_SOURCE_DIR}/src/Operations.c
26+
${CMAKE_CURRENT_SOURCE_DIR}/src/Polynomial.c
2327
)
2428

2529
add_library(CAces STATIC ${SOURCE_FILES})
@@ -36,7 +40,7 @@ if (CACES_BENCHMARK)
3640
add_subdirectory(benchmarks)
3741
endif()
3842

39-
if (CACES_TESTS)
43+
if (CACES_TEST)
4044
add_subdirectory(tests)
4145
endif()
4246

lib/Aces.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,37 @@ extern "C" {
1010

1111
#define EPROB 0.5
1212

13-
typename struct {
13+
typedef struct {
1414
Polynomial u;
1515
Lambda lambda;
1616
} PublicKey;
1717

18-
typename struct {
18+
typedef struct {
1919
PolyArray x;
2020
PolyArray f0;
2121
Polynomial f1;
2222
} PrivateKey;
2323

24-
typename struct {
24+
typedef struct {
2525
Channel channel;
2626
Parameters param;
2727
PublicKey pk;
2828
} SharedInfo;
2929

30-
typename struct {
30+
typedef struct {
3131
SharedInfo info;
3232
PrivateKey privte_key;
3333
} Aces;
3434

35-
typename struct {
35+
typedef struct {
3636
PolyArray c1;
3737
Polynomial c2;
3838
uint64_t level;
3939
} CipherMessage;
4040

41-
int aces_encrypt(const Aces *aces, const uint64_t *message, size_t size,
42-
CipherMessage *result);
41+
int aces_encrypt(const Aces *, const uint64_t *, size_t, CipherMessage *);
4342

44-
int aces_decrypt(const Aces *aces, const CipherMessage *message, size_t size,
45-
uint64_t *message);
43+
int aces_decrypt(const Aces *, const CipherMessage *, size_t size, uint64_t *);
4644

4745
#ifdef __cplusplus
4846
}

lib/Channel.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,33 @@
33

44
#include "Polynomial.h"
55

6-
typename struct {
6+
typedef struct {
77
uint64_t dim;
88
uint64_t N;
99
} Parameters;
1010

11-
typename struct {
11+
typedef struct {
1212
uint64_t p;
1313
uint64_t q;
1414
uint64_t w;
1515
} Channel;
1616

17-
typename struct {
17+
typedef struct {
1818
uint64_t ***lambda;
1919
size_t size[3];
2020
} Lambda;
2121

22-
int init_channel(Channel *channel, uint64_t p, uint64_t q, uint64_t w);
22+
int init_channel(Channel *, uint64_t, uint64_t, uint64_t);
2323

24-
int generate_u(const Channel *channel, const Parameters *param, Polynomial *u);
24+
int generate_u(const Channel *, const Parameters *, Polynomial *);
2525

26-
int generate_secret(const Channel *channel, const Parameters *param,
27-
const Polynomial *u, PolyArray *secret, Lambda *lambda);
26+
int generate_secret(const Channel *, const Parameters *, const Polynomial *,
27+
PolyArray *, Lambda *);
2828

29-
int generate_f0(const Channel *channel, const Parameters *param, PolyArray *f0);
29+
int generate_f0(const Channel *, const Parameters *, PolyArray *);
3030

31-
int generate_f1(const Channel *channel, const Parameters *param,
32-
const PolyArray *f0, const PolyArray *x, Polynomial *f1);
31+
int generate_f1(const Channel *, const Parameters *, const PolyArray *,
32+
const PolyArray *, Polynomial *);
3333

3434
#ifdef __cplusplus
3535
}

lib/Common.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,39 @@
55
extern "C" {
66
#endif
77

8+
#include <stdint.h>
9+
810
// gcd = ax + by
9-
typename struct {
11+
typedef struct {
1012
uint64_t gcd;
1113
int64_t a;
1214
int64_t b;
1315
} Xgcd;
1416

17+
typedef struct {
18+
uint64_t first;
19+
uint64_t second;
20+
} Pair;
21+
1522
uint64_t gcd(uint64_t x, uint64_t y);
1623

1724
Xgcd xgcd(uint64_t a, uint64_t b);
1825

1926
int are_coprime(uint64_t x, uint64_t y);
2027

21-
randinverse(uint64_t value);
22-
factors(uint64_t value);
28+
Pair randinverse(uint64_t value);
29+
30+
uint64_t randrange(uint64_t lower, uint64_t upper);
31+
// factors(uint64_t value);
2332

2433
uint64_t normal_rand(double mean, double stddev);
2534

26-
uint64_t max(uint64_t a, uint64_t b) { a > b ? a : b; }
35+
static inline uint64_t max(uint64_t a, uint64_t b) { return a > b ? a : b; }
2736

28-
uint64_t min(uint64_t a, uint64_t b) { a < b ? a : b; }
37+
static inline uint64_t min(uint64_t a, uint64_t b) { return a < b ? a : b; }
2938

30-
uint64_t clamp(uint64_t min_value, uint64_t max_value, uint64_t value) {
39+
static inline uint64_t clamp(uint64_t min_value, uint64_t max_value,
40+
uint64_t value) {
3141
return max(min_value, min(max_value, value));
3242
}
3343

lib/Operations.h

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

4-
int aces_add(const CipherMessage *a, const CipherMessage *b,
5-
const SharedInfo *info, CipherMessage *result);
4+
#include "Aces.h"
65

7-
int aces_mul(const CipherMessage *a, const CipherMessage *b,
8-
const SharedInfo *info, CipherMessage *result);
6+
int aces_add(const CipherMessage *, const CipherMessage *, const SharedInfo *,
7+
CipherMessage *);
98

10-
int aces_refresh(CipherMessage *a, uint64_t k);
9+
int aces_mul(const CipherMessage *, const CipherMessage *, const SharedInfo *,
10+
CipherMessage *);
11+
12+
int aces_refresh(CipherMessage *, uint64_t);
1113

1214
#ifdef __cplusplus
1315
}

lib/Polynomial.h

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

8-
typename uint64_t Coeff;
8+
#include <stddef.h>
9+
#include <stdint.h>
910

10-
typename struct {
11+
typedef uint64_t Coeff;
12+
13+
typedef struct {
1114
Coeff *coeffs;
1215
size_t size;
1316
} Polynomial;
1417

15-
typename struct {
16-
Polynomial *secret;
18+
typedef struct {
19+
Polynomial *polies;
1720
size_t size;
1821
} PolyArray;
1922

23+
int poly_equal(const Polynomial *, const Polynomial *);
24+
void poly_free(Polynomial *poly);
25+
26+
int set_polynomial(Polynomial *p, Coeff *coeffs, size_t size);
27+
28+
int get_polynomial(Polynomial *p, size_t size);
29+
30+
int get_polyarray(PolyArray *p, size_t size);
31+
32+
int set_zero(const Polynomial *);
33+
2034
uint64_t coef_sum(const Polynomial *);
2135

2236
uint64_t poly_degree(const Polynomial *);
2337

24-
int poly_fit(const Polynomial *poly, uint64_t mod);
38+
int poly_fit(Polynomial *poly, uint64_t mod);
2539

2640
int poly_mul(const Polynomial *poly1, const Polynomial *poly2,
2741
Polynomial *result, uint64_t mod);
2842

2943
int poly_add(const Polynomial *poly1, const Polynomial *poly2,
3044
Polynomial *result, uint64_t mod);
3145

46+
int poly_sub(const Polynomial *poly1, const Polynomial *poly2,
47+
Polynomial *result, uint64_t mod);
48+
3249
int poly_lshift(const Polynomial *poly1, const Polynomial *poly2,
3350
Polynomial *result, uint64_t mod);
3451

35-
int poly_mod(const Polynomial *poly1, const Polynomial *poly2,
36-
Polynomial *result, uint64_t mod);
52+
int poly_mod(Polynomial *, const Polynomial *, uint64_t);
53+
54+
int poly_sub_scaler(const Polynomial *, uint64_t, Polynomial *, uint64_t);
55+
56+
int poly_add_scaler(const Polynomial *, uint64_t, Polynomial *, uint64_t);
3757

3858
#ifdef __cplusplus
3959
}

src/Aces.c

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,36 @@
11
#include "Aces.h"
2+
#include "Common.h"
3+
#include <stddef.h>
24

35
static int generate_error(uint64_t q, uint64_t dim, uint64_t message,
46
Polynomial *rm) {
57
for (int i = 0; i < rm->size; ++i)
68
rm->coeffs[i] = randrange(0, q);
79

8-
rm->coeffs[0] += m - sum(rm);
10+
// rm->coeffs[0] += m - sum(rm);
911
rm->coeffs[0] %= q;
12+
return 0;
1013
}
1114

12-
static ssize_t generate_vanisher(uint64_t p, uint64_t q, uint64_t dim,
13-
Polynomial *e) {
15+
static uint64_t generate_vanisher(uint64_t p, uint64_t q, uint64_t dim,
16+
Polynomial *e) {
1417
uint64_t k = randrange(0, 1) < EPROB ? 0 : 1;
15-
for (int i = 0; i < rm->size; ++i)
18+
for (int i = 0; i < e->size; ++i)
1619
e->coeffs[i] = randrange(0, q);
1720

1821
e->coeffs[0] += p * k - sum(e);
1922
e->coeffs[0] %= q;
23+
return k;
2024
}
2125

22-
static ssize_t generate_linear(uint64_t p, uint64_t q, uint64_t dim,
23-
Polynomial *b) {
26+
static uint64_t generate_linear(uint64_t p, uint64_t q, uint64_t dim,
27+
Polynomial *b) {
2428
uint64_t k = randrange(0, p);
25-
for (int i = 0; i < rm->size; ++i)
29+
for (int i = 0; i < b->size; ++i)
2630
b->coeffs[i] = randrange(0, q);
27-
b->coeffs[0] += k - sum(e);
31+
b->coeffs[0] += k - sum(b);
2832
b->coeffs[0] %= q;
33+
return k;
2934
}
3035

3136
int aces_encrypt(const Aces *aces, const uint64_t *message, size_t size,
@@ -35,37 +40,43 @@ int aces_encrypt(const Aces *aces, const uint64_t *message, size_t size,
3540
Polynomial b;
3641

3742
for (int i = 0; i < size; ++i) {
38-
generate_error(aces->info.channel.q, aces->info.param.dim, message[i], &rm);
43+
generate_error(aces->info.channel.q, aces->info.param.dim, message[i],
44+
&r_m);
3945
uint64_t k = generate_vanisher(aces->info.channel.p, aces->info.channel.q,
4046
aces->info.param.dim, &e);
4147
generate_linear(aces->info.channel.p, aces->info.channel.q,
4248
aces->info.param.dim, &b);
4349

4450
for (int j = 0; j < aces->info.param.dim; ++j) {
45-
poly_mul(b, aces->privte_key.f0[j], result[i].c1[j]);
46-
poly_mod(result[i].c1[j], aces->info.pk.u, result[i].c1[j]);
51+
poly_mul(&b, &(aces->privte_key.f0.polys[j]), &(result[i].c1.polys[j]),
52+
aces->info.channel.q);
53+
poly_mod(&(result[i].c1.polys[j]), &(aces->info.pk.u),
54+
&(result[i].c1.polys[j]), aces->info.channel.q);
4755
}
4856

49-
result[i].c2 = (r_m + b * (self.f1 + e)) % self.u; // TODO
57+
// result[i].c2 = (r_m + b * (self.f1 + e)) % self.u; // TODO
5058
result[i].level = k * sum(b) % aces->info.channel.q;
5159
}
60+
61+
return 0;
5262
}
5363

5464
int aces_decrypt(const Aces *aces, const CipherMessage *message, size_t size,
5565
uint64_t *result) {
5666
Polynomial c0Tx;
5767
Polynomial tmp;
5868
Polynomial m_pre;
59-
set_zero(c0Tx);
69+
set_zero(&c0Tx);
6070

6171
for (int i = 0; i < size; ++i) {
6272
for (int j = 0; j < aces->info.param.dim; ++j) {
63-
poly_mul(message[i].c1[j], aces->privte_key.x[j], tmp);
64-
poly_add(c0Tx, tmp, c0Tx);
73+
poly_mul(&(message[i].c1.polys[j]), &(aces->privte_key.x.polys[j]), &tmp,
74+
aces->info.channel.q);
75+
poly_add(&c0Tx, &tmp, &c0Tx, aces->info.channel.q);
6576
}
6677

67-
poly_sub(message[i].c2, c0Tx, m_pre);
68-
result[i] = (sum(m_pre) % q) % p;
78+
poly_sub(&(message[i].c2), &c0Tx, &m_pre, aces->info.channel.q);
79+
result[i] = (sum(m_pre) % aces->info.channel.q) % aces->info.channel.p;
6980
}
7081

7182
return 0;

src/Channel.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include "Channel.h"
2+
13
int init_channel(Channel *channel, uint64_t p, uint64_t q, uint64_t w) {
24
channel->w = w;
35
channel->p = p;

0 commit comments

Comments
 (0)