123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #include "okv.h"
- #include <openssl/rand.h>
- #include <omp.h>
- #include <math.h>
- //opti! adjust size
- #define MAX_DB_SIZE 1000010
- vatRow db[MAX_DB_SIZE];
- int dbSize = 0;
- uint128_t seed;
- EVP_CIPHER_CTX *ctx[MAX_THREADS];
- void initializeServer(int numThreads){
-
- for(int i = 0; i < numThreads; i++){
- //set fixed key
- if(!(ctx[i] = EVP_CIPHER_CTX_new()))
- printf("errors occured in creating context\n");
- unsigned char *aeskey = (unsigned char*) "0123456789123456";
- if(1 != EVP_EncryptInit_ex(ctx[i], EVP_aes_128_ecb(), NULL, aeskey, NULL))
- printf("errors occured in init\n");
- EVP_CIPHER_CTX_set_padding(ctx[i], 0);
- }
-
- memset(&seed, 0, 16);
- }
- //creates a new DB
- void createDb(int isLeader, int dataSize){
- vatRow entry;
- if (isLeader == 1) {
- entry.newKeyA = getRandomBlock();
- if(!(entry.rowKeyA = EVP_CIPHER_CTX_new()))
- printf("errors occured in creating context\n");
- if(1 != EVP_EncryptInit_ex(entry.rowKeyA, EVP_aes_128_ecb(), NULL, (uint8_t*)&entry.newKeyA, NULL))
- printf("errors occured in init\n");
- EVP_CIPHER_CTX_set_padding(entry.rowKeyA, 0);
-
- } else {
- entry.newKeyB = getRandomBlock();
- if(!(entry.rowKeyB = EVP_CIPHER_CTX_new()))
- printf("errors occured in creating context\n");
- if(1 != EVP_EncryptInit_ex(entry.rowKeyB, EVP_aes_128_ecb(), NULL, (uint8_t*)&entry.newKeyB, NULL))
- printf("errors occured in init\n");
- EVP_CIPHER_CTX_set_padding(entry.rowKeyB, 0);
- }
-
- entry.dataSize = dataSize;
- entry.data = malloc(dataSize);
- entry.mask = malloc(dataSize);
- memset(entry.mask, 0 , dataSize);
- memset(entry.data, 0 , dataSize);
- db[dbSize] = entry;
- int i = dbSize;//to make code below work without changing stuff
- dbSize = dbSize + 1;
-
-
- //now do the encryption/rerandomization for this entry so it can be retrieved normally
- uint8_t* maskTemp = (uint8_t*) malloc(dataSize+16);
- uint8_t* seedTemp = (uint8_t*) malloc(dataSize+16);
- //get rerandomization mask
- for(int j = 0; j < (db[i].dataSize+16)/16; j++){
- memcpy(&seedTemp[16*j], &seed, 16);
- seedTemp[16*j] = seedTemp[16*j] ^ j;
- }
- int len;
-
- if (isLeader == 1) {
- if(1 != EVP_EncryptUpdate(db[i].rowKeyA, maskTemp, &len, seedTemp, ((dataSize-1)|15)+1))
- printf("errors occured in rerandomization of entry %d\n", i);
- } else {
- if(1 != EVP_EncryptUpdate(db[i].rowKeyB, maskTemp, &len, seedTemp, ((dataSize-1)|15)+1))
- printf("errors occured in rerandomization of entry %d\n", i);
- }
-
- //xor data into db and rerandomize db entry
- for(int j = 0; j < dataSize; j++){
- db[i].data[j] = db[i].data[j] ^ maskTemp[j];
- db[i].mask[j] = maskTemp[j];
- }
- free(maskTemp);
- free(seedTemp);
- }
- void xorIn(int i, uint8_t *data){
- for(int j = 0; j < db[i].dataSize; j++){
- db[i].data[j] = db[i].data[j] ^ data[j];
- }
- }
- void resetDb() {
- memset(db, 0, MAX_DB_SIZE);
- dbSize = 0;
- }
- //read an entry
- void readData(int index, uint8_t *data){
- memcpy(data, db[index].data, db[index].dataSize);
- }
- //gets the seed
- void readSeed(uint8_t *seedIn){
- memcpy(seedIn, &seed, 16);
- }
- //returns a uint128_t representation of the input
- uint128_t getUint128_t(int i){
- return (uint128_t) i;
- }
- //decrypt and recover a row
- void decryptRow(int localIndex, uint8_t *out, uint8_t *dataA, uint8_t *dataB, uint8_t *seedA, uint8_t *seedB){
- int len;
-
- uint8_t *maskA = (uint8_t*) malloc(db[localIndex].dataSize+16);
- uint8_t *maskB = (uint8_t*) malloc(db[localIndex].dataSize+16);
- uint8_t *seedTempA = (uint8_t*) malloc(db[localIndex].dataSize+16);
- uint8_t *seedTempB = (uint8_t*) malloc(db[localIndex].dataSize+16);
-
- //get the masks
- for(int j = 0; j < (db[localIndex].dataSize+16)/16; j++){
- memcpy(&seedTempA[16*j], seedA, 16);
- seedTempA[16*j] = seedTempA[16*j] ^ j;
- }
- if(1 != EVP_EncryptUpdate(db[localIndex].rowKeyA, maskA, &len, seedTempA, ((db[localIndex].dataSize-1)|15)+1))
- printf("errors occured in rerandomization of entry %d\n", localIndex);
- for(int j = 0; j < (db[localIndex].dataSize+16)/16; j++){
- memcpy(&seedTempB[16*j], seedB, 16);
- seedTempB[16*j] = seedTempB[16*j] ^ j;
- }
- if(1 != EVP_EncryptUpdate(db[localIndex].rowKeyB, maskB, &len, seedTempB, ((db[localIndex].dataSize-1)|15)+1))
- printf("errors occured in rerandomization of entry %d\n", localIndex);
-
- for(int i = 0; i < db[localIndex].dataSize; i++){
- out[i] = dataA[i] ^ dataB[i] ^ maskA[i] ^ maskB[i];
- }
-
- free(maskA);
- free(maskB);
- free(seedTempA);
- free(seedTempB);
- }
- //gets the block that was used to calculate the cipher
- void getCipher(int isLeader, int i, uint8_t *array) {
- if (isLeader == 1) {
- memcpy(array, &db[i].newKeyA, 16);
- } else {
- memcpy(array, &db[i].newKeyB, 16);
- }
- }
- //puts in the block that was used to calculate the cipher on the other server and calculates the missing one
- void putCipher(int isLeader, int i, uint8_t *array) {
- if (isLeader == 0) {
- memcpy(&db[i].newKeyA, array, 16);
- if(!(db[i].rowKeyA = EVP_CIPHER_CTX_new()))
- printf("errors occured in creating context\n");
- if(1 != EVP_EncryptInit_ex(db[i].rowKeyA, EVP_aes_128_ecb(), NULL, (uint8_t*)&db[i].newKeyA, NULL))
- printf("errors occured in init\n");
- EVP_CIPHER_CTX_set_padding(db[i].rowKeyA, 0);
- } else {
- memcpy(&db[i].newKeyB, array, 16);
-
- if(!(db[i].rowKeyB = EVP_CIPHER_CTX_new()))
- printf("errors occured in creating context\n");
- if(1 != EVP_EncryptInit_ex(db[i].rowKeyB, EVP_aes_128_ecb(), NULL, (uint8_t*)&db[i].newKeyB, NULL))
- printf("errors occured in init\n");
- EVP_CIPHER_CTX_set_padding(db[i].rowKeyB, 0);
- }
- }
|