diff --git a/apps/scheme.c b/apps/scheme.c index 2346cc9365f64e5eb398206b61edfcc879118275..59ee1d56d5222cb1d5307da5fe6c4c9c5c1b9a27 100644 --- a/apps/scheme.c +++ b/apps/scheme.c @@ -20,8 +20,8 @@ struct ct { void initialize_relic() { core_init(); - fp_prime_init(); pc_param_set_any(); + } struct key setup(int size) { @@ -69,25 +69,6 @@ struct ct enc(struct key key, int *message, int size) { zp_vec sxATsAAT10_Bi = matrix_multiply(sxATsAAT10, key.Bi, 1, B_SIZE, B_SIZE); ct.ctk = vector_raise(key.base, sxATsAAT10_Bi, B_SIZE); - // Testing. - int temp[] = {1, 1, 1, 1, 1, 1}; - zp_vec temp_zp = vector_zp_from_int(temp, B_SIZE); - zp_vec vec_1 = matrix_multiply(temp_zp, key.B, 1, B_SIZE, B_SIZE); - zp_vec vec_2 = matrix_multiply(temp_zp, key.Bi, 1, B_SIZE, B_SIZE); - - g_vec vec_11 = vector_raise(key.base, vec_1, B_SIZE); - g_vec vec_22 = vector_raise(key.base, vec_2, B_SIZE); - - gt z; - pc_map_sim(z, vec_11, vec_22, B_SIZE); - - // Check correctness. - gt desired_output; - gt_exp_dig(desired_output, key.t_base, 6); - - if (gt_cmp(desired_output, z) == RLC_EQ) printf("Magic happened."); - else printf("Fuck my life."); - return ct; } @@ -112,12 +93,26 @@ void eval(struct key key, struct ct x, struct ct y, int size) { int main() { initialize_relic(); - int x[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; - +// int x[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; struct key key = setup(10); +// struct ct ct_x = enc(key, x, 10); +// eval(key, ct_x, ct_x, 10); - struct ct ct_x = enc(key, x, 10); + bn_t a, b, c, n; + pc_get_ord(n); -// eval(key, ct_x, ct_x, 10); + bn_rand_mod(a, n); + bn_rand_mod(b, n); + bn_mul(c, a, a); + bn_mod(c, c, n); + + g g1, g2; + g1_mul(g1, key.base, a); + g1_mul(g2, key.base, b); + + gt gt1, gt2;pc_map(gt1, g1, g2); + gt_exp(gt2, key.t_base, c); + + printf("Works if 1: %i", gt_cmp(gt1, gt2) == RLC_EQ); return 0; -} \ No newline at end of file +} diff --git a/include/vector.h b/include/vector.h index 24a72dd7f06c2bd0b4e3f8a9e0bc3f125a15b440..f55dd9ccc3dec6f496c3ccbeb75d43f43b65c8a0 100644 --- a/include/vector.h +++ b/include/vector.h @@ -15,6 +15,8 @@ zp_vec vector_merge(zp_vec a, zp_vec b, int size_a, int size_b); zp_vec vector_add(zp_vec a, zp_vec b, int size); +void zp_inner_product(zp r, zp_vec a, zp_vec b, int size); + g_vec vector_raise(g base, zp_vec x, int size); void inner_product(gt r, g_vec a, g_vec b, int size); diff --git a/src/vector.c b/src/vector.c index ed48b177caa92ea26b8ab132f81ece3b3c988125..8aa18bcf7f4ade68f1108f72ba1d01c3dd4b8ffc 100644 --- a/src/vector.c +++ b/src/vector.c @@ -29,6 +29,15 @@ zp_vec vector_add(zp_vec a, zp_vec b, int size) { return r; } +void zp_inner_product(dig_t *r, zp_vec a, zp_vec b, int size) { + zp_zero(r); + zp temp; + for (int i = 0; i < size; i++) { + zp_multiply(temp, a[i], b[i]); + zp_add(r, r, temp); + } +} + g_vec vector_raise(g base, zp_vec x, int size) { g_vec r; r = (g_vec) malloc(sizeof(g) * size); @@ -37,7 +46,12 @@ g_vec vector_raise(g base, zp_vec x, int size) { } void inner_product(gt r, g_vec a, g_vec b, int size) { - pc_map_sim(r, a, b, size); + gt temp; + gt_set_unity(r); + for (int i = 0; i < size; i++) { + pc_map(temp, a[i], b[i]); + gt_mul(r, r, temp); + } } @@ -45,3 +59,6 @@ void inner_product(gt r, g_vec a, g_vec b, int size) { + + + diff --git a/tests/test_vector.c b/tests/test_vector.c index f38abb4d09cac4c2f84c43e645d39eecd685df75..767660ec6cc7e8c5aa372acd912352f84feb333f 100644 --- a/tests/test_vector.c +++ b/tests/test_vector.c @@ -27,6 +27,18 @@ int test_add_vector() { return zp_is_int(z[2], 36); } +int test_zp_inner_product() { + zp_vec x, y; + int int_vec_x[3] = {1, 2, 3}; + int int_vec_y[3] = {11, 22, 33}; + x = vector_zp_from_int(int_vec_x, 3); + y = vector_zp_from_int(int_vec_y, 3); + + zp r; + zp_inner_product(r, x, y, 3); + return zp_is_int(r, 154); +} + int test_inner_product() { zp_vec x, y; int int_vec_x[3] = {1, 2, 3}; @@ -58,6 +70,7 @@ int main() { if (test_zp_from_int() != 1) return 1; if (test_merge_vector() != 1) return 1; if (test_add_vector() != 1) return 1; + if (test_zp_inner_product() != 1) return 1; if (test_inner_product() != RLC_EQ) return 1; return 0;