fixed some issues introduced by the stash

This commit is contained in:
Michael Zohner 2016-01-20 10:17:13 +01:00
parent 71e6c7af84
commit 5070bed04a
10 changed files with 93 additions and 22 deletions

View File

@ -6,8 +6,11 @@ EXT=${SRC}/externals
# compiler settings
CC=g++
COMPILER_OPTIONS=-O2
#COMPILER_OPTIONS=-O2
COMPILER_OPTIONS=-g3 -ggdb -O0 -Wall -Wextra
DEBUG_OPTIONS=-g3
BATCH=
ARCHITECTURE = $(shell uname -m)
@ -57,7 +60,7 @@ OBJECTS_MIRACL=${MIRACL_LIB_DIR}/*.o
MIRACL_LIB=${EXT}/miracl_lib/miracl.a
all: miracl core bench demo
all: miracl core bench demo cuckoo
@echo "make all done."

View File

@ -1,4 +1,5 @@
Michael.Zohner@ec-spride.de
Evelyne.Wagener@tvcablenet.be
Hasso.Rauscher@qq.com
Milos.Hepp@orange.net
Paolo.Liebmann@hotmail.com
@ -215,7 +216,6 @@ Rabea.Salewski@fibertel.com.ar
Dieter.Maas@live.com
Johan.Breit@web.de
Mario.Decker@sbcglobal.net
Evelyne.Wagener@tvcablenet.be
Leonard.Mahnke@neuf.fr
Tina.Swoboda@free.fr
Marija.Schirmer@safe-mail.net

View File

@ -1,4 +1,5 @@
Michael.Zohner@ec-spride.de
Evelyne.Wagener@tvcablenet.be
Wolfram.Hipp@yahoo.co.jp
Carl.Zitzmann@facebook.com
Tilmann.Wittke@neuf.fr
@ -8,7 +9,6 @@ Semra.Kranz@live.com.ar
Timm.Junge@laposte.net
Bekir.Winter@bt.com
Hildegard.Theis@wanadoo.fr
Evelyne.Wagener@tvcablenet.be
Kerstin.Aßmann@hush.com
Gloria.Irrgang@hanmail.net
Kay-Uwe.Boll@yahoo.com

View File

@ -91,7 +91,7 @@ cuckoo_hashing(uint8_t* elements, uint32_t neles, uint32_t nbins, uint32_t bitle
cout << (dec) << endl;*/
#else
cerr << "Insertion not successful for element " <<i <<"!" << endl;
exit(0);
//exit(0);
#endif
}
}

View File

@ -84,7 +84,7 @@ int32_t benchroutine(int32_t argc, char** argv) {
ntasks, cardinality, ftype);
break;
case OT_PSI:
intersect_size = otpsi(role, nelements, pnelements, elebytelen*8, elements, &intersection, &crypto, sockfd.data(),
intersect_size = otpsi(role, nelements, pnelements, elebytelen, elements, &intersection, &crypto, sockfd.data(),
ntasks, epsilon, detailed_timings);
break;
default:break;

View File

@ -98,6 +98,12 @@ int32_t psi_demonstrator(int32_t argc, char** argv) {
cout << endl;
}
}
for(i = 0; i < intersect_size; i++) {
free(intersection[i]);
}
if(intersect_size > 0)
free(res_bytelens);
}
for(i = 0; i < sockfd.size(); i++) {
@ -111,6 +117,7 @@ int32_t psi_demonstrator(int32_t argc, char** argv) {
cout << "Data received:\t" << ((double)bytes_received)/mbfac << " MB" << endl;
}
for(i = 0; i < nelements; i++)
free(elements[i]);
free(elements);

View File

@ -130,6 +130,7 @@ uint32_t otpsi_client(uint8_t* elements, uint32_t neles, uint32_t nbins, uint32_
query_ctx* query_data = (query_ctx*) malloc(sizeof(query_ctx) * ntasks);
mask_rcv_ctx rcv_ctx;
timeval t_start, t_end;
uint32_t stashsize = get_stash_size(neles);
nelesinbin = (uint32_t*) calloc(nbins, sizeof(uint32_t));
maskbytelen = ceil_divide(maskbitlen, 8);
@ -207,6 +208,21 @@ uint32_t otpsi_client(uint8_t* elements, uint32_t neles, uint32_t nbins, uint32_
cerr << "Error in joining pthread at cuckoo hashing!" << endl;
exit(0);
}
#ifdef ENABLE_STASH
//receive the masks for the stash
//cout << "allocating a stash of size " << pneles << " * " << maskbytelen << " * " << stashsize << endl;
uint8_t* stashmasks = (uint8_t*) malloc(pneles * maskbytelen * stashsize);
rcv_ctx.rcv_buf = server_masks;
rcv_ctx.nmasks = stashsize * pneles;
rcv_ctx.maskbytelen = maskbytelen;
rcv_ctx.sock = sock;
if(pthread_create(&rcv_masks_thread, NULL, receive_masks, (void*) (&rcv_ctx))) {
cerr << "Error in creating new pthread at cuckoo hashing!" << endl;
exit(0);
}
#endif
if(DETAILED_TIMINGS) {
gettimeofday(&t_end, NULL);
cout << "Time for receiving masks:\t" << fixed << std::setprecision(2) <<
@ -254,14 +270,28 @@ uint32_t otpsi_client(uint8_t* elements, uint32_t neles, uint32_t nbins, uint32_
getMillies(t_start, t_end) << " ms" << endl;
}
free(masks);
/*free(masks);
free(hash_table);
free(nelesinbin);
free(perm);
free(server_masks);
free(query_map_thread);
free(query_data);
//free(map);
free(query_data);*/
//cout << "joining" << endl;
//meanwhile generate the hash table
//GHashTable* map = otpsi_create_hash_table(ceil_divide(inbitlen,8), masks, neles, maskbytelen, perm);
//intersect_size = otpsi_find_intersection(eleptr, result, ceil_divide(inbitlen,8), masks, neles, server_masks,
// neles * NUM_HASH_FUNCTIONS, maskbytelen, perm);
#ifdef ENABLE_STASH
//wait for receiving thread
if(pthread_join(rcv_masks_thread, NULL)) {
cerr << "Error in joining pthread at cuckoo hashing!" << endl;
exit(0);
}
free(stashmasks);
#endif
return intersect_size;
}
@ -274,6 +304,9 @@ void otpsi_server(uint8_t* elements, uint32_t neles, uint32_t nbins, uint32_t pn
uint32_t* nelesinbin;
uint32_t outbitlen, maskbytelen;
timeval t_start, t_end;
#ifdef ENABLE_STASH
uint32_t stashsize = get_stash_size(neles);
#endif
nelesinbin = (uint32_t*) malloc(sizeof(uint32_t) * nbins);
maskbytelen = ceil_divide(maskbitlen, 8);
@ -314,6 +347,16 @@ void otpsi_server(uint8_t* elements, uint32_t neles, uint32_t nbins, uint32_t pn
#endif
//send the masks to the receiver
send_masks(masks, neles * NUM_HASH_FUNCTIONS, maskbytelen, sock[0]);
#ifdef ENABLE_STASH
//TODO: implement correctly
//send masks for all items on the stash
for(uint32_t i = 0; i < stashsize; i++) {
send_masks(masks, neles, maskbytelen, sock[0]);
}
#endif
if(DETAILED_TIMINGS) {
gettimeofday(&t_end, NULL);
cout << "Time for sending masks:\t\t" << fixed << std::setprecision(2) <<
@ -508,7 +551,7 @@ void oprg_server(uint8_t* hash_table, uint32_t nbins, uint32_t totaleles, uint32
#ifdef PRINT_OPRG_MASKS
for(i = 0; i < totaleles; i++) {
cout << "Result for element i = " << i << " ";
cout << "OPRG output for element i = " << i << " ";
for(uint32_t j = 0; j < OTsPerBin; j++) {
cout << setw(2) << setfill('0') << (hex) << (uint32_t) hash_table[i * OTsPerBin + j] << (dec);
}
@ -527,7 +570,7 @@ void oprg_server(uint8_t* hash_table, uint32_t nbins, uint32_t totaleles, uint32
#ifdef PRINT_CRF_EVAL
for(i = 0; i < totaleles; i++) {
cout << "Result for element i = " << i << ": ";
cout << "CRF output for element i = " << i << ": ";
for(uint32_t j = 0; j < maskbytelen; j++) {
cout << setw(2) << setfill('0') << (hex) << (uint32_t) res_buf[i * maskbytelen + j] << (dec);
}
@ -692,8 +735,10 @@ uint32_t otpsi_find_intersection(uint32_t** result, uint8_t* my_hashes,
uint32_t* tmpkeys;
uint32_t* invperm = (uint32_t*) malloc(sizeof(uint32_t) * my_neles);
for(uint32_t i = 0; i < my_neles; i++)
for(uint32_t i = 0; i < my_neles; i++) {
assert(perm[i] < my_neles);
invperm[perm[i]] = i;
}
uint32_t size_intersect, i, intersect_ctr, tmp_hashbytelen;
@ -703,7 +748,7 @@ uint32_t otpsi_find_intersection(uint32_t** result, uint8_t* my_hashes,
tmp_hashbytelen = sizeof(uint64_t);
tmpkeys = (uint32_t*) calloc(my_neles * keys_stored, sizeof(uint32_t));
for(i = 0; i < my_neles; i++) {
memcpy(tmpkeys + 2*i, my_hashes + i*hashbytelen + sizeof(uint64_t), hashbytelen-sizeof(uint64_t));
memcpy(tmpkeys + 2*i, my_hashes + i*hashbytelen + tmp_hashbytelen, hashbytelen-sizeof(uint64_t));
memcpy(tmpkeys + 2*i + 1, perm + i, sizeof(uint32_t));
}
} else {
@ -715,7 +760,7 @@ uint32_t otpsi_find_intersection(uint32_t** result, uint8_t* my_hashes,
GHashTable *map= g_hash_table_new_full(g_int64_hash, g_int64_equal, NULL, NULL);
for(i = 0; i < my_neles; i++) {
//tmpbuf=0;
tmpbuf=0;
memcpy((uint8_t*) &tmpbuf, my_hashes + i*hashbytelen, tmp_hashbytelen);
//cout << "Insertion, " << i << " = " <<(hex) << tmpbuf << endl;
//for(uint32_t j = 0; j < tmp_hashbytelen; j++)
@ -726,7 +771,7 @@ uint32_t otpsi_find_intersection(uint32_t** result, uint8_t* my_hashes,
for(i = 0, intersect_ctr = 0; i < pa_neles; i++) {
//tmpbuf=0;
memcpy((uint8_t*) &tmpbuf, pa_hashes + i*hashbytelen, tmp_hashbytelen);
//cout << "Query, " << i << " = " <<(hex) << tmpbuf << endl;
//cout << "Query, " << i << " = " <<(hex) << tmpbuf << (dec) << endl;
if(g_hash_table_lookup_extended(map, (void*) &tmpbuf, NULL, (void**) &tmpval)) {
if(keys_stored > 1) {
tmpbuf = 0;
@ -738,6 +783,7 @@ uint32_t otpsi_find_intersection(uint32_t** result, uint8_t* my_hashes,
//cout << "Match found at " << tmpval[0] << endl;
}
} else {
//cout << "I have found a match for mask " << (hex) << tmpbuf << (dec) << endl;
matches[intersect_ctr] = tmpval[0];
//cout << "intersection found at position " << tmpval[0] << " for key " << (hex) << tmpbuf << (dec) << endl;
if(intersect_ctr<my_neles)
@ -748,15 +794,14 @@ uint32_t otpsi_find_intersection(uint32_t** result, uint8_t* my_hashes,
}
}
if(intersect_ctr > my_neles) {
cout << "more intersections than elements: " << intersect_ctr << " vs " << my_neles << endl;
//cout << "Number of matches: " << intersect_ctr << ", my neles: " << my_neles << ", hashbytelen = " << hashbytelen << endl;
assert(intersect_ctr <= my_neles);
/*if(intersect_ctr > my_neles) {
cerr << "more intersections than elements: " << intersect_ctr << " vs " << my_neles << endl;
intersect_ctr = my_neles;
}
//assert(intersect_ctr <= my_neles);
}*/
size_intersect = intersect_ctr;
//result = (uint8_t**) malloc(sizeof(uint8_t*));
(*result) = (uint32_t*) malloc(sizeof(uint32_t) * size_intersect);
memcpy(*result, matches, sizeof(uint32_t) * size_intersect);
@ -809,3 +854,15 @@ void *receive_masks(void *ctx_tmp) {
ctx->sock->Receive(ctx->rcv_buf, ctx->maskbytelen * ctx->nmasks);
}
uint32_t get_stash_size(uint32_t neles) {
if(neles >= (1<<24))
return 2;
if(neles >= (1<<20))
return 3;
if(neles >= (1<<16))
return 4;
if(neles >= (1<<12))
return 6;
if(neles >= (1<<8))
return 12;
}

View File

@ -29,6 +29,7 @@ static bool DETAILED_TIMINGS=0;
//#define PRINT_OPRG_MASKS
//#define PRINT_RECEIVED_VALUES
//#define PRINT_CRF_EVAL
//#define ENABLE_STASH //TODO: enabling stash introduces errors. fix!
struct mask_rcv_ctx {
uint8_t* rcv_buf;
@ -90,4 +91,6 @@ void print_bin_content(uint8_t* hash_table, uint32_t nbins, uint32_t elebytelen,
void evaluate_crf(uint8_t* result, uint8_t* masks, uint32_t nelements, uint32_t elebytelen, crypto* crypt);
uint32_t get_stash_size(uint32_t neles);
#endif /* OT_PSI_H_ */

View File

@ -94,6 +94,7 @@ static void create_result_from_matches_var_bitlen(uint8_t*** result, uint32_t**
std::sort(matches, matches+intersect_size);
for(i = 0; i < intersect_size; i++) {
cout << "matches[" << i << "]: " << matches[i] << endl;
(*resbytelens)[i] = inbytelens[matches[i]];
(*result)[i] = (uint8_t*) malloc((*resbytelens)[i]);
memcpy((*result)[i], inputs[matches[i]], (*resbytelens)[i]);

View File

@ -32,7 +32,7 @@ typedef struct OTBlock_t {
OTBlock_t* next;
} OTBlock;
#define NUMOTBLOCKS 256
#define NUMOTBLOCKS 1024
#define REGISTER_BITS AES_BITS
#define REGISTER_BYTES AES_BYTES