forked from integridb/Code
-
Notifications
You must be signed in to change notification settings - Fork 0
/
database.hpp
183 lines (150 loc) · 7.36 KB
/
database.hpp
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <fstream>
#include <cstring>
#include <openssl/sha.h>
#include <vector>
#include <openssl/evp.h>
#include <NTL/ZZ.h>
#include <NTL/ZZ_p.h>
#include <NTL/ZZ_pX.h>
#include <NTL/vec_ZZ_p.h>
#include <NTL/vector.h>
#include <sstream>
#include <string>
#include <list>
#include <mysql/mysql.h>
#include <time.h>
#include "bn.h"
#include "test_point.hpp"
#define q 1000
#define AES_BLOCK_SIZE 128
#define INF 10000000
#define NINF -1
#define MAX_LEVEL 15
#define P 0.5
extern EVP_CIPHER_CTX *en, *de;
extern MYSQL *conn;
//public keys
extern std::vector<bn::Ec1> pubs_g1;//(q+1);
extern std::vector<bn::Ec2> pubs_g2;//(q+1);
extern std::vector<bn::Ec1> pubas_g1;//(q+1);
extern bn::Ec2 pubas_g2;
char* zToString(const NTL::ZZ_p &z);
NTL::ZZ_p StringToz(char* str);
//encryption
int aes_init(unsigned char *key_data, int key_data_len, unsigned char *salt, EVP_CIPHER_CTX *e_ctx,EVP_CIPHER_CTX *d_ctx);
unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len);
unsigned char *aes_encrypt(EVP_CIPHER_CTX *e, unsigned char *plaintext, int *len);
//hash
bool simpleSHA256(void* input1, void* input2, unsigned long length1, unsigned long length2, unsigned char* md);
//bilinear
bn::Ec1 compute_digest_pub(std::vector<int> array, const bn::Ec1 g1);
bn::Ec1 compute_digest_pub_inverse(std::vector<int> array, const bn::Ec1 g1);
bn::Ec1 compute_digest_puba(std::vector<int> array, const bn::Ec1 g1);
bn::Ec1 compute_digest_puba_inverse(std::vector<int> array, const bn::Ec1 g1);
std::vector<int> intersection(std::vector<int> a, std::vector<int> b);
std::vector<int> difference(std::vector<int> a, std::vector<int> I);
void prove_intersection(std::vector<int>* I, bn::Ec1* digestI, bn::Ec1* w_extra, std::vector<int> a, std::vector<int> b, bn::Ec2* w1, bn::Ec2* w2, bn::Ec1* Q1, bn::Ec1* Q2, bn::Ec1 g1, bn::Ec2 g2);
void prove_intersection_inverse(std::vector<int>* I, bn::Ec1* digestI, bn::Ec1* w_extra, std::vector<int> a, std::vector<int> b, bn::Ec2* w1, bn::Ec2* w2, bn::Ec1* Q1, bn::Ec1* Q2, bn::Ec1 g1, bn::Ec2 g2);
bool verify_intersection(bn::Ec1 digestI, bn::Ec1 w_extra, bn::Ec1 a, bn::Ec1 b, bn::Ec2 w1, bn::Ec2 w2, bn::Ec1 Q1, bn::Ec1 Q2, bn::Ec1 g1, bn::Ec2 g2);
//random
float frand();
int random_level();
struct proofnode{
int v;
unsigned char f[32];
int flag;
};
struct snode
{
int value;
int rowID;
//int enc;
NTL::ZZ_p enc2;
unsigned char encry[255];
bn::Ec1 g1_digest;
bn::Ec2 g2_digest;
unsigned char hash[SHA256_DIGEST_LENGTH];
snode *right;
snode *up;
snode *down;
snode *right0;
snode(int value)
{
right = NULL;
up = NULL;
down = NULL;
right0 = NULL;
this->value = value;
//enc = 1;
}
};
struct skiplist
{
snode *header;
skiplist()
{
snode* temp;
header = new snode(NINF);
char buf[254];
temp = header;
header->rowID = NINF;
header->enc2 = NTL::conv<NTL::ZZ_p>(1);
{
int len = 254;
strcpy(buf,zToString(header->enc2));
memcpy(temp->encry , aes_encrypt(en, (unsigned char *)buf, &len),254);
}
for(int i=0;i<MAX_LEVEL-1;i++){
temp->down = new snode(NINF);
temp->down->rowID = NINF;
temp->down->enc2 = NTL::conv<NTL::ZZ_p>(1);
int len = 254;
memcpy(temp->down->encry , aes_encrypt(en, (unsigned char *)buf, &len),254);
temp->down->up = temp;
temp = temp->down;
}
{
int len = 254;
temp->right = new snode(INF);
temp->right->rowID = INF;
temp->right->enc2 = NTL::conv<NTL::ZZ_p>(1);
memcpy(temp->right->encry , aes_encrypt(en, (unsigned char *)buf, &len),254);
simpleSHA256(&temp->right->value, NULL, 4, 0, temp->right->hash);
}
temp->right0 = temp->right;
}
~skiplist()
{
delete header;
}
void display();
bool contains(int );
void insert_element(int , int, NTL::ZZ_p , bn::Ec1, bn::Ec2);
void insert_element_inorder(int , int, NTL::ZZ_p , bn::Ec1, bn::Ec2);
void insert_element_inverse(int , int, NTL::ZZ_p , bn::Ec1, bn::Ec2);
void insert_element_inverse_inorder(int , int, NTL::ZZ_p , bn::Ec1, bn::Ec2);
void delete_element(int , bn::Ec1, bn::Ec2);
std::vector<snode> range_search(int value_s, int value_e);
std::vector<int> range_cover(snode* ancestor);
std::vector<proofnode> prove_path(int );
};
//authenticated skiplist functions
void hash_from_path(std::vector<proofnode>, unsigned char*);
//database procedures
void single_d_query(std::string query, int start, int end, int col, std::vector<int> &result, std::vector<snode> &bi_digest, std::vector<bn::Ec1> &bi_proof, bn::Ec1 g1);
void single_d_query_inverse(int col2, std::string query, int start, int end, int col, std::vector<int> &result, std::vector<snode> &bi_digest, std::vector<bn::Ec1> &bi_proof, bn::Ec1 g1);
bool single_d_verify(std::vector<snode> bi_digest, std::vector<bn::Ec1> bi_proof, std::vector<int> result, bn::Ec1 g1, bn::Ec2 g2);
void multi_d_query(int dimension, std::vector<std::string> query, std::vector<int> start, std::vector<int> end, std::vector<int> col, std::vector<int> &result, std::vector<std::vector<snode> > &bi_digest, std::vector<std::vector<bn::Ec1> > &bi_proof, std::vector<bn::Ec1> &digestI, std::vector<bn::Ec1> &w_extra, std::vector<bn::Ec2> &w1, std::vector<bn::Ec2> &w2, std::vector<bn::Ec1> &Q1, std::vector<bn::Ec1> &Q2, bn::Ec1 g1, bn::Ec2 g2);
bool multi_d_verify(int dimension, std::vector<int> result, std::vector<std::vector<snode> > bi_digest, std::vector<std::vector<bn::Ec1> > bi_proof, std::vector<bn::Ec1> digestI, std::vector<bn::Ec1> w_extra, std::vector<bn::Ec2> w1, std::vector<bn::Ec2> w2, std::vector<bn::Ec1> Q1, std::vector<bn::Ec1> Q2, bn::Ec1 g1, bn::Ec2 g2);
void sum_single_d_query(std::string query, int start, int end, int col, int col2, int &result, std::vector<snode> &bi_digest, std::vector<bn::Ec1> &bi_proof, NTL::ZZ_p &c0, NTL::ZZ_p &c1, bn::Ec1 &c0_proof, bn::Ec1 &c1_proof, bn::Ec1 g1);
bool sum_single_d_verify(std::vector<snode> bi_digest, std::vector<bn::Ec1> bi_proof, int result, NTL::ZZ_p c0, NTL::ZZ_p c1, bn::Ec1 c0_proof, bn::Ec1 c1_proof, bn::Ec1 g1, bn::Ec2 g2);
void sum_multi_d_query(int dimension, std::vector<std::string> query, std::vector<int> start, std::vector<int> end, std::vector<int> col, int col2, int &result, std::vector<std::vector<snode> > &bi_digest, std::vector<std::vector<bn::Ec1> > &bi_proof, std::vector<bn::Ec1> &digestI, std::vector<bn::Ec1> &w_extra, std::vector<bn::Ec2> &w1, std::vector<bn::Ec2> &w2, std::vector<bn::Ec1> &Q1, std::vector<bn::Ec1> &Q2, NTL::ZZ_p &c0, NTL::ZZ_p &c1, bn::Ec1 &c0_proof, bn::Ec1 &c1_proof, bn::Ec1 g1, bn::Ec2 g2);
bool sum_multi_d_verify(int dimension, int result, std::vector<std::vector<snode> > bi_digest, std::vector<std::vector<bn::Ec1> > bi_proof, std::vector<bn::Ec1> digestI, std::vector<bn::Ec1> w_extra, std::vector<bn::Ec2> w1, std::vector<bn::Ec2> w2, std::vector<bn::Ec1> Q1, std::vector<bn::Ec1> Q2, NTL::ZZ_p c0, NTL::ZZ_p c1, bn::Ec1 c0_proof, bn::Ec1 c1_proof, bn::Ec1 g1, bn::Ec2 g2);
int maxmin(std::string query);
//database global
extern std::vector<std::vector<skiplist> > ss;
extern std::vector<std::vector<std::vector<skiplist> > > ss_sum;