Unverified Commit 5683ee17 authored by Stan Kladko's avatar Stan Kladko Committed by GitHub

Merge pull request #142 from skalenetwork/SKALE-3067-cleanup3

Skale 3067 cleanup3
parents 6f35e65a e37986d6
......@@ -67,6 +67,7 @@ vector <string> genECDSAKey() {
vector <string> keys(3);
vector<char> hexEncrKey(BUF_LEN * 2, 0);
carray2Hex(encr_pr_key.data(), enc_len, hexEncrKey.data());
keys.at(0) = hexEncrKey.data();
keys.at(1) = string(pub_key_x.data()) + string(pub_key_y.data());
......
Subproject commit f980b79f086b27b187bb696de1d7b99a0988859b
Subproject commit 8dc9f547c612010ea0b6257d86bcbd4ff7149565
Subproject commit 6c863ecc15eb5580e469f6b7f59817fdd08da1d1
Subproject commit 78ea56c3b5251e9d840ef65705bb2c5f8f193662
Subproject commit b0a445ba09e96e1d0507487e5c496485a9cf3742
Subproject commit 95eaa6f6693cd86c35e10a22b4f8e483373c987c
......@@ -63,6 +63,16 @@ int AES_encrypt(char *message, uint8_t *encr_message, uint64_t encrLen) {
int AES_decrypt(uint8_t *encr_message, uint64_t length, char *message, uint64_t msgLen) {
if (!message) {
LOG_ERROR("Null message in AES_encrypt");
return -1;
}
if (!encr_message) {
LOG_ERROR("Null encr message in AES_encrypt");
return -2;
}
if (length < SGX_AESGCM_MAC_SIZE + SGX_AESGCM_IV_SIZE) {
LOG_ERROR("length < SGX_AESGCM_MAC_SIZE - SGX_AESGCM_IV_SIZE");
......
......@@ -23,12 +23,16 @@
#include <stdlib.h>
#include <stdbool.h>
#ifdef USER_SPACE
#include <gmp.h>
#else
#include <../tgmp-build/include/sgx_tgmp.h>
#endif
#include "EnclaveConstants.h"
#include "DomainParameters.h"
#include "Curves.h"
#include "Point.h"
......@@ -38,144 +42,227 @@
#include "EnclaveCommon.h"
#include <string.h>
void gen_session_key(char *skey_str, char* pb_keyB, char* common_key) {
char* pb_keyB_x = (char*)calloc(65, 1);
int gen_session_key(char *skey_str, char *pb_keyB, char *common_key) {
int ret = -1;
LOG_INFO(__FUNCTION__);
SAFE_CHAR_BUF(pb_keyB_x, 65);SAFE_CHAR_BUF(pb_keyB_y, 65);
mpz_t skey;
mpz_init(skey);
point pub_keyB = point_init();
point session_key = point_init();
if (!common_key) {
LOG_ERROR("gen_session_key: Null common_key");
goto clean;
}
common_key[0] = 0;
if (!skey_str) {
LOG_ERROR("gen_session_key: Null skey_str");
goto clean;
}
if (!pb_keyB) {
LOG_ERROR("gen_session_key: Null skey_str");
goto clean;
}
strncpy(pb_keyB_x, pb_keyB, 64);
pb_keyB_x[64] = 0;
char* pb_keyB_y = (char*)calloc(65,1);
strncpy(pb_keyB_y, pb_keyB + 64, 64);
pb_keyB_y[64] = 0;
domain_parameters curve = domain_parameters_init();
domain_parameters_load_curve(curve, secp256k1);
mpz_t skey;
mpz_init(skey);
mpz_set_str(skey, skey_str, 16);
point pub_keyB = point_init();
point_set_hex(pub_keyB, pb_keyB_x, pb_keyB_y);
point session_key = point_init();
point_multiplication(session_key, skey, pub_keyB, curve);
char arr_x[mpz_sizeinbase (session_key->x, 16) + 2];
SAFE_CHAR_BUF(arr_x, BUF_LEN);
mpz_get_str(arr_x, 16, session_key->x);
int n_zeroes = 64 - strlen(arr_x);
for ( int i = 0; i < n_zeroes; i++){
common_key[i] = '0';
for (int i = 0; i < n_zeroes; i++) {
common_key[i] = '0';
}
strncpy(common_key + n_zeroes, arr_x, strlen(arr_x));
common_key[64] = 0;
ret = 0;
clean:
mpz_clear(skey);
point_clear(pub_keyB);
point_clear(session_key);
domain_parameters_clear(curve);
free(pb_keyB_x);
free(pb_keyB_y);
return ret;
}
void session_key_recover(const char *skey_str, const char* sshare, char* common_key) {
char* pb_keyB_x = (char*)calloc(65, 1);
int session_key_recover(const char *skey_str, const char *sshare, char *common_key) {
int ret = -1;
if (!common_key) {
LOG_ERROR("session_key_recover: Null common_key");
goto clean;
}
common_key[0] = 0;
if (!skey_str) {
LOG_ERROR("session_key_recover: Null skey_str");
goto clean;
}
if (!sshare) {
LOG_ERROR("session_key_recover: Null sshare");
goto clean;
}
SAFE_CHAR_BUF(pb_keyB_x, 65);
strncpy(pb_keyB_x, sshare + 64, 64);
pb_keyB_x[64] = 0;
char* pb_keyB_y = (char*)calloc(65, 1);
SAFE_CHAR_BUF(pb_keyB_y, 65);
strncpy(pb_keyB_y, sshare + 128, 64);
pb_keyB_y[64] = 0;
domain_parameters curve = domain_parameters_init();
domain_parameters_load_curve(curve, secp256k1);
mpz_t skey;
mpz_init(skey);
if (mpz_set_str(skey, skey_str, 16) == -1) {
common_key = NULL;
mpz_clear(skey);
domain_parameters_clear(curve);
free(pb_keyB_x);
free(pb_keyB_y);
point pub_keyB = point_init();
point session_key = point_init();
return;
if (mpz_set_str(skey, skey_str, 16) == -1) {
goto clean;
}
point pub_keyB = point_init();
point_set_hex(pub_keyB, pb_keyB_x, pb_keyB_y);
point session_key = point_init();
point_multiplication(session_key, skey, pub_keyB, curve);
char arr_x[mpz_sizeinbase (session_key->x, 16) + 2];
SAFE_CHAR_BUF(arr_x, BUF_LEN);
mpz_get_str(arr_x, 16, session_key->x);
int n_zeroes = 64 - strlen(arr_x);
for ( int i = 0; i < n_zeroes; i++){
for (int i = 0; i < n_zeroes; i++) {
common_key[i] = '0';
}
strncpy(common_key + n_zeroes, arr_x, strlen(arr_x));
ret = 0;
clean:
mpz_clear(skey);
point_clear(pub_keyB);
point_clear(session_key);
domain_parameters_clear(curve);
free(pb_keyB_x);
free(pb_keyB_y);
return ret;
}
void xor_encrypt(char* key, char* message, char* cypher) {
uint8_t cypher_bin[33];
int xor_encrypt(char *key, char *message, char *cypher) {
uint8_t* key_bin = (uint8_t*)calloc(33,1);
uint64_t key_length;
if (!hex2carray(key, &key_length, key_bin)){
cypher = NULL;
free(key_bin);
return;
}
int ret = -1;
uint64_t msg_length;
uint8_t msg_bin[33];
if (!hex2carray(message, &msg_length, msg_bin)){
cypher = NULL;
free(key_bin);
return;
}
if (!cypher) {
LOG_ERROR("xor_encrypt: null cypher");
goto clean;
}
for (int i = 0; i < 32; i++){
cypher_bin[i] = msg_bin[i] ^ key_bin[i];
}
if (!key) {
LOG_ERROR("xor_encrypt: null key");
goto clean;
}
carray2Hex(cypher_bin, 32, cypher);
if (!message) {
LOG_ERROR("xor_encrypt: null message");
goto clean;
}
free(key_bin);
}
SAFE_CHAR_BUF(cypher_bin, 33);
SAFE_CHAR_BUF(key_bin, 33);
uint64_t key_length;
void xor_decrypt(char* key, char* cypher, char* message) {
if (!hex2carray(key, &key_length, key_bin)) {
goto clean;
}
uint64_t msg_length;
uint8_t msg_bin[33];
if (!hex2carray(message, &msg_length, msg_bin)) {
goto clean;
}
for (int i = 0; i < 32; i++) {
cypher_bin[i] = msg_bin[i] ^ key_bin[i];
}
carray2Hex(cypher_bin, 32, cypher);
ret = 0;
clean:
;
return ret;
}
int xor_decrypt(char *key, char *cypher, char *message) {
int ret = -1;
if (!cypher) {
LOG_ERROR("xor_encrypt: null cypher");
goto clean;
}
if (!key) {
LOG_ERROR("xor_encrypt: null key");
goto clean;
}
if (!message) {
LOG_ERROR("xor_encrypt: null message");
goto clean;
}
SAFE_CHAR_BUF(msg_bin,33);
SAFE_CHAR_BUF(key_bin,33)
uint8_t* key_bin = (uint8_t*)calloc(33,1);
uint64_t key_length;
if (!hex2carray(key, &key_length, key_bin)){
message = NULL;
free(key_bin);
return;
if (!hex2carray(key, &key_length, key_bin)) {
goto clean;
}
uint64_t cypher_length;
uint8_t cypher_bin[33];
if (!hex2carray(cypher, &cypher_length, cypher_bin)){
message = NULL;
free(key_bin);
return;
SAFE_CHAR_BUF(cypher_bin, 33);
if (!hex2carray(cypher, &cypher_length, cypher_bin)) {
goto clean;
}
for (int i = 0; i < 32; i++){
for (int i = 0; i < 32; i++) {
msg_bin[i] = cypher_bin[i] ^ key_bin[i];
}
carray2Hex(msg_bin, 32, message);
free(key_bin);
ret = 0;
clean:
;
return ret;
}
......@@ -24,12 +24,12 @@
#ifndef SGXD_DRIVE_KEY_DKG_H
#define SGXD_DRIVE_KEY_DKG_H
void gen_session_key(char* skey, char* pub_keyB, char* common_key);
int gen_session_key(char* skey, char* pub_keyB, char* common_key);
void session_key_recover(const char *skey_str, const char* sshare, char* common_key);
int session_key_recover(const char *skey_str, const char* sshare, char* common_key);
void xor_encrypt(char* key, char* message, char* cypher);
int xor_encrypt(char* key, char* message, char* cypher);
void xor_decrypt(char* key, char* cypher, char* message);
int xor_decrypt(char* key, char* cypher, char* message);
#endif //SGXD_DRIVE_KEY_DKG_H
......@@ -47,58 +47,79 @@ using namespace std;
string stringFromFr(const libff::alt_bn128_Fr &_el) {
string ret = "";
mpz_t t;
mpz_init(t);
try {
mpz_t t;
mpz_init(t);
_el.as_bigint().to_mpz(t);
char arr[mpz_sizeinbase(t, 10) + 2];
SAFE_CHAR_BUF(arr, BUF_LEN);
char *tmp = mpz_get_str(arr, 10, t);
mpz_clear(t);
return string(tmp);
ret = string(tmp);
} catch (exception &e) {
LOG_ERROR(e.what());
return "";
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return "";
goto clean;
}
clean:
mpz_clear(t);
return ret;
}
template<class T>
string ConvertToString(const T &field_elem, int base = 10) {
string ret;
mpz_t t;
mpz_init(t);
try {
mpz_t t;
mpz_init(t);
field_elem.as_bigint().to_mpz(t);
char arr[mpz_sizeinbase(t, base) + 2];
SAFE_CHAR_BUF(arr, BUF_LEN);
char *tmp = mpz_get_str(arr, base, t);
mpz_clear(t);
string output = tmp;
return output;
ret = string(tmp);
goto clean;
} catch (exception &e) {
LOG_ERROR(e.what());
return "";
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return "";
goto clean;
}
clean:
mpz_clear(t);
return ret;
}
string ConvertG2ToString(const libff::alt_bn128_G2 &elem, int base = 10, const string &delim = ":") {
string result = "";
try {
string result;
result += ConvertToString(elem.X.c0);
result += delim;
result += ConvertToString(elem.X.c1);
......@@ -107,23 +128,28 @@ string ConvertG2ToString(const libff::alt_bn128_G2 &elem, int base = 10, const s
result += delim;
result += ConvertToString(elem.Y.c1);
return result;
goto clean;
} catch (exception &e) {
LOG_ERROR(e.what());
return nullptr;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return nullptr;
goto clean;
}
clean:
return result;
}
vector <libff::alt_bn128_Fr> SplitStringToFr(const char *coeffs, const char symbol) {
vector <libff::alt_bn128_Fr> tokens;
vector <libff::alt_bn128_Fr> result;
string str(coeffs);
string delim;
try {
string str(coeffs);
string delim;
delim.push_back(symbol);
size_t prev = 0, pos = 0;
......@@ -133,25 +159,31 @@ vector <libff::alt_bn128_Fr> SplitStringToFr(const char *coeffs, const char symb
string token = str.substr(prev, pos - prev);
if (!token.empty()) {
libff::alt_bn128_Fr coeff(token.c_str());
tokens.push_back(coeff);
result.push_back(coeff);
}
prev = pos + delim.length();
} while (pos < str.length() && prev < str.length());
return tokens;
goto clean;
} catch (exception &e) {
LOG_ERROR(e.what());
return tokens;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return tokens;
goto clean;
}
clean:
return result;
}
int gen_dkg_poly(char *secret, unsigned _t) {
int status = 1;
string result;
try {
string result;
for (size_t i = 0; i < _t; ++i) {
libff::alt_bn128_Fr cur_coef = libff::alt_bn128_Fr::random_element();
......@@ -164,42 +196,47 @@ int gen_dkg_poly(char *secret, unsigned _t) {
strncpy(secret, result.c_str(), result.length() + 1);
if (strlen(secret) == 0) {
return 1;
goto clean;
}
return 0;
status = 0;
} catch (exception &e) {
LOG_ERROR(e.what());
return 1;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return 1;
goto clean;
}
clean:
return status;
}
libff::alt_bn128_Fr PolynomialValue(const vector <libff::alt_bn128_Fr> &pol, libff::alt_bn128_Fr point, unsigned _t) {
libff::alt_bn128_Fr value = libff::alt_bn128_Fr::zero();
libff::alt_bn128_Fr result = libff::alt_bn128_Fr::zero();
try {
libff::alt_bn128_Fr pow = libff::alt_bn128_Fr::one();
for (unsigned i = 0; i < pol.size(); ++i) {
value += pol[i] * pow;
result += pol[i] * pow;
pow *= point;
}
return value;
goto clean;
} catch (exception &e) {
LOG_ERROR(e.what());
return value;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return value;
goto clean;
}
clean:
return result;
}
void calc_secret_shares(const char *decrypted_coeffs,
......@@ -233,11 +270,13 @@ void calc_secret_shares(const char *decrypted_coeffs,
int calc_secret_share(const char *decrypted_coeffs, char *s_share,
unsigned _t, unsigned _n, unsigned ind) {
int result = 1;
try {
char symbol = ':';
vector <libff::alt_bn128_Fr> poly = SplitStringToFr(decrypted_coeffs, symbol);
if (poly.size() != _t) {
return 1;
goto clean;
}
libff::alt_bn128_Fr secret_share = PolynomialValue(poly, libff::alt_bn128_Fr(ind), _t);
......@@ -246,15 +285,19 @@ int calc_secret_share(const char *decrypted_coeffs, char *s_share,
cur_share.insert(0, n_zeroes, '0');
strncpy(s_share, cur_share.c_str(), cur_share.length() + 1);
return 0;
result = 0;
goto clean;
} catch (exception &e) {
LOG_ERROR(e.what());
return 1;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return 1;
goto clean;
}
clean:
return result;
}
void calc_secret_shareG2_old(const char *decrypted_coeffs, char *s_shareG2,
......@@ -281,17 +324,20 @@ void calc_secret_shareG2_old(const char *decrypted_coeffs, char *s_shareG2,
int calc_secret_shareG2(const char *s_share, char *s_shareG2) {
int result = 1;
mpz_t share;
mpz_init(share);
try {
mpz_t share;
mpz_init(share);
if (mpz_set_str(share, s_share, 16) == -1) {
mpz_clear(share);
return 1;
goto clean;
}
char arr[mpz_sizeinbase(share, 10) + 2];
SAFE_CHAR_BUF(arr, BUF_LEN);
char *share_str = mpz_get_str(arr, 10, share);
libff::alt_bn128_Fr secret_share(share_str);
......@@ -303,18 +349,22 @@ int calc_secret_shareG2(const char *s_share, char *s_shareG2) {
string secret_shareG2_str = ConvertG2ToString(secret_shareG2);
strncpy(s_shareG2, secret_shareG2_str.c_str(), secret_shareG2_str.length() + 1);
mpz_clear(share);
return 0;
result = 0;
goto clean;
} catch (exception &e) {
LOG_ERROR(e.what());
return 1;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return 1;
goto clean;
}
clean:
mpz_clear(share);
return result;
}
int calc_public_shares(const char *decrypted_coeffs, char *public_shares,
......
......@@ -44,93 +44,117 @@ uint8_t *getThreadLocalDecryptedDkgPoly() {
string *stringFromKey(libff::alt_bn128_Fr *_key) {
try {
mpz_t t;
mpz_init(t);
string *ret = nullptr;
mpz_t t;
mpz_init(t);
_key->as_bigint().to_mpz(t);
SAFE_CHAR_BUF(arr, BUF_LEN);
char arr[mpz_sizeinbase(t, 10) + 2];
try {
_key->as_bigint().to_mpz(t);
char *tmp = mpz_get_str(arr, 10, t);
mpz_clear(t);
return new string(tmp);
if (!tmp) {
LOG_ERROR("stringFromKey: mpz_get_str failed");
goto clean;
}
ret = new string(tmp);
} catch (exception &e) {
LOG_ERROR(e.what());
return nullptr;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return nullptr;
goto clean;
}
clean:
mpz_clear(t);
return ret;
}
string *stringFromFq(libff::alt_bn128_Fq *_fq) {
try {
mpz_t t;
mpz_init(t);
_fq->as_bigint().to_mpz(t);
char arr[mpz_sizeinbase(t, 10) + 2];
string *ret = nullptr;
mpz_t t;
mpz_init(t);SAFE_CHAR_BUF(arr, BUF_LEN);
try {
_fq->as_bigint().to_mpz(t);
char *tmp = mpz_get_str(arr, 10, t);
mpz_clear(t);
return new string(tmp);
ret = new string(tmp);
} catch (exception &e) {
LOG_ERROR(e.what());
return nullptr;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return nullptr;
goto clean;
}
clean:
mpz_clear(t);
return ret;
}
string *stringFromG1(libff::alt_bn128_G1 *_g1) {
string *sX = nullptr;
string *sY = nullptr;
string *ret = nullptr;
try {
_g1->to_affine_coordinates();
auto sX = stringFromFq(&_g1->X);
auto sY = stringFromFq(&_g1->Y);
auto sG1 = new string(*sX + ":" + *sY);
if (!sX) {
goto clean;
}
delete (sX);
delete (sY);
auto sY = stringFromFq(&_g1->Y);
if (!sY) {
goto clean;
}
return sG1;
ret = new string(*sX + ":" + *sY);
} catch (exception &e) {
LOG_ERROR(e.what());
return nullptr;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return nullptr;
goto clean;
}
clean:
SAFE_FREE(sX);
SAFE_FREE(sY);
return ret;
}
libff::alt_bn128_Fr *keyFromString(const char *_keyStringHex) {
try {
mpz_t skey;
mpz_init(skey);
mpz_set_str(skey, _keyStringHex, 16);
char skey_dec[mpz_sizeinbase(skey, 10) + 2];
mpz_get_str(skey_dec, 10, skey);
mpz_clear(skey);
mpz_t skey;
mpz_init(skey);SAFE_CHAR_BUF(skey_dec, BUF_LEN);
libff::alt_bn128_Fr *ret = nullptr;
return new libff::alt_bn128_Fr(skey_dec);
} catch (exception &e) {
LOG_ERROR(e.what());
return nullptr;
} catch (...) {
LOG_ERROR("Unknown throwable");
return nullptr;
}
mpz_set_str(skey, _keyStringHex, 16);
mpz_get_str(skey_dec, 10, skey);
ret = new libff::alt_bn128_Fr(skey_dec);
goto clean;
clean:
mpz_clear(skey);
return ret;
}
int inited = 0;
......@@ -149,11 +173,39 @@ void enclave_init() {
bool enclave_sign(const char *_keyString, const char *_hashXString, const char *_hashYString,
char *sig) {
bool ret = false;
libff::alt_bn128_Fr* key = nullptr;
string * r = nullptr;
if (!_keyString) {
LOG_ERROR("Null key string");
goto clean;
}
if (!_hashXString) {
LOG_ERROR("Null hashX");
goto clean;
}
if (!_hashYString) {
LOG_ERROR("Null hashY");
goto clean;
}
if (!sig) {
LOG_ERROR("Null sig");
goto clean;
}
try {
auto key = keyFromString(_keyString);
if (key == nullptr) {
throw invalid_argument("Null key");
if (!key) {
LOG_ERROR("Null key");
goto clean;
}
libff::alt_bn128_Fq hashX(_hashXString);
......@@ -164,8 +216,6 @@ bool enclave_sign(const char *_keyString, const char *_hashXString, const char *
libff::alt_bn128_G1 sign = key->as_bigint() * hash;
delete key;
sign.to_affine_coordinates();
auto r = stringFromG1(&sign);
......@@ -174,21 +224,25 @@ bool enclave_sign(const char *_keyString, const char *_hashXString, const char *
strncpy(sig, r->c_str(), BUF_LEN);
delete r;
return true;
ret = true;
} catch (exception &e) {
LOG_ERROR(e.what());
return false;
goto clean;
} catch (...) {
LOG_ERROR("Unknown throwable");
return false;
goto clean;
}
clean:
SAFE_DELETE(key);
SAFE_DELETE(r);
return ret;
}
void carray2Hex(const unsigned char *d, int _len, char* _hexArray) {
void carray2Hex(const unsigned char *d, int _len, char *_hexArray) {
char hexval[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
......
......@@ -64,5 +64,9 @@ extern unsigned char* globalRandom;
extern domain_parameters curve;
#define SAFE_FREE(__X__) if (__X__) {free(__X__); __X__ = NULL;}
#define SAFE_DELETE(__X__) if (__X__) {delete(__X__); __X__ = NULL;}
#define SAFE_CHAR_BUF(__X__, __Y__) ;char __X__ [ __Y__ ]; memset(__X__, 0, __Y__);
#endif //SGXWALLET_ENCLAVECOMMON_H
......@@ -56,12 +56,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "EnclaveConstants.h"
#include "EnclaveCommon.h"
#define SAFE_FREE(__X__) if (!__X__) {free(__X__); __X__ = NULL;}
#define SAFE_CHAR_BUF(__X__, __Y__) ;char __X__ [ __Y__ ]; memset(__X__, 0, __Y__);
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define INIT_ERROR_STATE *errString = 0; *errStatus = UNKNOWN_ERROR;
#define SET_SUCCESS *errStatus = 0;
#define CHECK_STATE(_EXPRESSION_) \
if (!(_EXPRESSION_)) { \
LOG_ERROR("State check failed::");LOG_ERROR(#_EXPRESSION_); \
......@@ -78,6 +79,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*errStatus = -1; \
goto clean;}
#define CHECK_STATUS(__ERRMESSAGE__) if (status != SGX_SUCCESS) { \
snprintf(errString, BUF_LEN, __ERRMESSAGE__); \
LOG_ERROR(errString); \
*errStatus = status; \
goto clean; \
};
#define CHECK_STATUS2(__ERRMESSAGE__) if (status != SGX_SUCCESS) { \
snprintf(errString, BUF_LEN, __ERRMESSAGE__, status); \
LOG_ERROR(errString); \
*errStatus = status; \
goto clean; \
};
void *(*gmp_realloc_func)(void *, size_t, size_t);
......@@ -150,7 +165,6 @@ void *reallocate_function(void *ptr, size_t osize, size_t nsize) {
return (void *) nptr;
}
void get_global_random(unsigned char *_randBuff, uint64_t _size) {
char errString[BUF_LEN];
......@@ -163,7 +177,6 @@ void get_global_random(unsigned char *_randBuff, uint64_t _size) {
CHECK_STATE(_size <= 32)
CHECK_STATE(_randBuff);
sgx_sha_state_handle_t shaStateHandle;
CHECK_STATE(sgx_sha256_init(&shaStateHandle) == SGX_SUCCESS);
......@@ -176,25 +189,14 @@ void get_global_random(unsigned char *_randBuff, uint64_t _size) {
}
void trustedGenerateSEK(int *errStatus, char *errString,
uint8_t *encrypted_SEK, uint32_t *enc_len, char *SEK_hex) {
LOG_DEBUG(__FUNCTION__);
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(encrypted_SEK);
CHECK_STATE(SEK_hex);
CHECK_STATE(encrypted_SEK);
CHECK_STATE(SEK_hex);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
SAFE_CHAR_BUF(SEK_raw, SGX_AESGCM_KEY_SIZE);;
......@@ -209,12 +211,7 @@ void trustedGenerateSEK(int *errStatus, char *errString,
sgx_status_t status = sgx_seal_data(0, NULL, hex_aes_key_length + 1, (uint8_t *) SEK_hex, sealedLen,
(sgx_sealed_data_t *) encrypted_SEK);
if (status != SGX_SUCCESS) {
snprintf(errString, BUF_LEN, "seal SEK failed");
*errStatus = status;
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS("seal SEK failed");
*enc_len = sealedLen;
......@@ -224,39 +221,29 @@ void trustedGenerateSEK(int *errStatus, char *errString,
}
void trustedSetSEK(int *errStatus, char *errString, uint8_t *encrypted_SEK, uint64_t encr_len) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(encrypted_SEK);
SAFE_CHAR_BUF(aes_key_hex, BUF_LEN);
sgx_status_t status = sgx_unseal_data(
(const sgx_sealed_data_t *) encrypted_SEK, NULL, 0, aes_key_hex, &encr_len);
if (status != SGX_SUCCESS) {
*errStatus = status;
snprintf(errString, BUF_LEN, "sgx unseal SEK failed with status %d", status);
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS2("sgx unseal SEK failed with status %d");
uint64_t len;
hex2carray(aes_key_hex, &len, (uint8_t *) AES_key);
*errStatus = 0;
hex2carray(aes_key_hex, &len, (uint8_t *) AES_key);
SET_SUCCESS
clean:
;
}
void trustedSetSEK_backup(int *errStatus, char *errString,
uint8_t *encrypted_SEK, uint32_t *enc_len, const char *SEK_hex) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(encrypted_SEK);
CHECK_STATE(SEK_hex);
......@@ -268,43 +255,40 @@ void trustedSetSEK_backup(int *errStatus, char *errString,
sgx_status_t status = sgx_seal_data(0, NULL, strlen(SEK_hex) + 1, (uint8_t *) SEK_hex, sealedLen,
(sgx_sealed_data_t *) encrypted_SEK);
if (status != SGX_SUCCESS) {
snprintf(errString, BUF_LEN, "seal SEK failed with status %d", status);
*errStatus = status;
LOG_ERROR(errString);
}
CHECK_STATUS2("seal SEK failed with status %d")
*enc_len = sealedLen;
*errStatus = 0;
SET_SUCCESS
clean:
;
}
void trustedGenerateEcdsaKeyAES(int *errStatus, char *errString,
uint8_t *encryptedPrivateKey, uint32_t *enc_len, char *pub_key_x, char *pub_key_y) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(encryptedPrivateKey);
CHECK_STATE(pub_key_x);
CHECK_STATE(pub_key_y);
SAFE_CHAR_BUF(rand_char, 32);
get_global_random(rand_char, 32);
mpz_t seed;
mpz_init(seed);
mpz_import(seed, 32, 1, sizeof(rand_char[0]), 0, 0, rand_char);
mpz_t skey;
mpz_init(skey);
mpz_mod(skey, seed, curve->p);
mpz_clear(seed);
//Public key
point Pkey = point_init();
get_global_random(rand_char, 32);
mpz_import(seed, 32, 1, sizeof(rand_char[0]), 0, 0, rand_char);
mpz_mod(skey, seed, curve->p);
signature_extract_public_key(Pkey, skey, curve);
int len = mpz_sizeinbase(Pkey->x, ECDSA_SKEY_BASE) + 2;SAFE_CHAR_BUF(arr_x, BUF_LEN);
......@@ -334,29 +318,18 @@ void trustedGenerateEcdsaKeyAES(int *errStatus, char *errString,
skey_str[ECDSA_SKEY_LEN - 1] = 0;
snprintf(errString, BUF_LEN, "skey len is %d\n", strlen(skey_str));
int stat = AES_encrypt(skey_str, encryptedPrivateKey, BUF_LEN);
if (stat != 0) {
snprintf(errString, BUF_LEN, "ecdsa private key encryption failed");
*errStatus = stat;
LOG_ERROR(errString);
goto clean;
}
int status = AES_encrypt(skey_str, encryptedPrivateKey, BUF_LEN);
CHECK_STATUS("ecdsa private key encryption failed");
*enc_len = strlen(skey_str) + SGX_AESGCM_MAC_SIZE + SGX_AESGCM_IV_SIZE;
stat = AES_decrypt(encryptedPrivateKey, *enc_len, skey_str, ECDSA_SKEY_LEN);
status = AES_decrypt(encryptedPrivateKey, *enc_len, skey_str, ECDSA_SKEY_LEN);
if (stat != 0) {
snprintf(errString, BUF_LEN, "ecdsa private key decr failed with status %d", stat);
*errStatus = stat;
LOG_ERROR(errString);
goto clean;
}
*errStatus = 0;
CHECK_STATUS2("ecdsa private key decr failed with status %d");
SET_SUCCESS
clean:
mpz_clear(seed);
mpz_clear(skey);
point_clear(Pkey);
}
......@@ -364,43 +337,27 @@ void trustedGenerateEcdsaKeyAES(int *errStatus, char *errString,
void trustedGetPublicEcdsaKeyAES(int *errStatus, char *errString,
uint8_t *encryptedPrivateKey, uint32_t enc_len, char *pub_key_x, char *pub_key_y) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
INIT_ERROR_STATE
CHECK_STATE(encryptedPrivateKey);
CHECK_STATE(pub_key_x);
CHECK_STATE(pub_key_y);
SAFE_CHAR_BUF(skey, ECDSA_SKEY_LEN);
mpz_t privateKeyMpz;
mpz_init(privateKeyMpz);
//Public key
point Pkey = point_init();
int status = AES_decrypt(encryptedPrivateKey, enc_len, skey, ECDSA_SKEY_LEN);
skey[enc_len - SGX_AESGCM_MAC_SIZE - SGX_AESGCM_IV_SIZE] = '\0';
if (status != 0) {
snprintf(errString, BUF_LEN, "AES_decrypt failed with status %d", status);
*errStatus = status;
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS2("AES_decrypt failed with status %d");
skey[enc_len - SGX_AESGCM_MAC_SIZE - SGX_AESGCM_IV_SIZE] = '\0';
strncpy(errString, skey, 1024);
if (mpz_set_str(privateKeyMpz, skey, ECDSA_SKEY_BASE) == -1) {
snprintf(errString, BUF_LEN, "wrong string to init private key");
LOG_ERROR(errString);
*errStatus = -10;
goto clean;
}
status = mpz_set_str(privateKeyMpz, skey, ECDSA_SKEY_BASE);
CHECK_STATUS("mpz_set_str failed for private key");
signature_extract_public_key(Pkey, privateKeyMpz, curve);
......@@ -433,8 +390,7 @@ void trustedGetPublicEcdsaKeyAES(int *errStatus, char *errString,
}
strncpy(pub_key_y + n_zeroes, arr_y, 1024 - n_zeroes);
*errStatus = 0;
SET_SUCCESS
clean:
mpz_clear(privateKeyMpz);
point_clear(Pkey);
......@@ -447,8 +403,7 @@ void trustedEcdsaSignAES(int *errStatus, char *errString, uint8_t *encryptedPriv
const char *hash, char *sigR, char *sigS, uint8_t *sig_v, int base) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
INIT_ERROR_STATE
CHECK_STATE(encryptedPrivateKey);
CHECK_STATE(hash);
......@@ -465,12 +420,7 @@ void trustedEcdsaSignAES(int *errStatus, char *errString, uint8_t *encryptedPriv
int status = AES_decrypt(encryptedPrivateKey, enc_len, skey, ECDSA_SKEY_LEN);
if (status != 0) {
*errStatus = status;
snprintf(errString, BUF_LEN, "aes decrypt failed with status %d", status);
LOG_ERROR(status);
goto clean;
}
CHECK_STATUS2("aes decrypt failed with status %d");
skey[enc_len - SGX_AESGCM_MAC_SIZE - SGX_AESGCM_IV_SIZE] = '\0';
......@@ -481,7 +431,6 @@ void trustedEcdsaSignAES(int *errStatus, char *errString, uint8_t *encryptedPriv
goto clean;
}
if (mpz_set_str(msgMpz, hash, 16) == -1) {
*errStatus = -1;
snprintf(errString, BUF_LEN, "invalid message hash");
......@@ -523,8 +472,7 @@ void trustedEcdsaSignAES(int *errStatus, char *errString, uint8_t *encryptedPriv
*sig_v = sign->v;
*errStatus = 0;
SET_SUCCESS
clean:
mpz_clear(privateKeyMpz);
......@@ -544,26 +492,17 @@ void trustedEncryptKeyAES(int *errStatus, char *errString, const char *key,
*errStatus = UNKNOWN_ERROR;
int stat = AES_encrypt(key, encryptedPrivateKey, BUF_LEN);
if (stat != 0) {
*errStatus = stat;
snprintf(errString, BUF_LEN, "AES encrypt failed with status %d", stat);
LOG_ERROR(errString);
goto clean;
}
int status = AES_encrypt(key, encryptedPrivateKey, BUF_LEN);
CHECK_STATUS2("AES encrypt failed with status %d");
*enc_len = strlen(key) + SGX_AESGCM_MAC_SIZE + SGX_AESGCM_IV_SIZE;
SAFE_CHAR_BUF(decryptedKey, BUF_LEN);
stat = AES_decrypt(encryptedPrivateKey, *enc_len, decryptedKey, BUF_LEN);
status = AES_decrypt(encryptedPrivateKey, *enc_len, decryptedKey, BUF_LEN);
if (stat != 0) {
*errStatus = stat;
snprintf(errString, BUF_LEN, "trustedDecryptKey failed with status %d", stat);
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS2("trustedDecryptKey failed with status %d");
uint64_t decryptedKeyLen = strnlen(decryptedKey, MAX_KEY_LENGTH);
......@@ -581,8 +520,7 @@ void trustedEncryptKeyAES(int *errStatus, char *errString, const char *key,
goto clean;
}
*errStatus = 0;
SET_SUCCESS
clean:
;
}
......@@ -591,9 +529,7 @@ void trustedDecryptKeyAES(int *errStatus, char *errString, uint8_t *encryptedPri
uint32_t enc_len, char *key) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
INIT_ERROR_STATE
CHECK_STATE(encryptedPrivateKey);
CHECK_STATE(key);
......@@ -619,20 +555,16 @@ void trustedDecryptKeyAES(int *errStatus, char *errString, uint8_t *encryptedPri
goto clean;
}
*errStatus = 0;
SET_SUCCESS
clean:
;
}
void trustedBlsSignMessageAES(int *errStatus, char *errString, uint8_t *encryptedPrivateKey,
uint32_t enc_len, char *_hashX,
char *_hashY, char *signature) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
INIT_ERROR_STATE
CHECK_STATE(encryptedPrivateKey);
CHECK_STATE(_hashX);
......@@ -641,15 +573,9 @@ void trustedBlsSignMessageAES(int *errStatus, char *errString, uint8_t *encrypte
SAFE_CHAR_BUF(key, BUF_LEN);SAFE_CHAR_BUF(sig, BUF_LEN);
int status = AES_decrypt(encryptedPrivateKey, enc_len, key, BUF_LEN);
if (status != 0) {
*errStatus = status;
strncpy(errString, "AES decrypt failed", BUF_LEN);
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS("AES decrypt failed")
enclave_sign(key, _hashX, _hashY, sig);
......@@ -662,39 +588,27 @@ void trustedBlsSignMessageAES(int *errStatus, char *errString, uint8_t *encrypte
goto clean;
}
*errStatus = 0;
SET_SUCCESS
clean:
;
}
void
trustedGenDkgSecretAES(int *errStatus, char *errString, uint8_t *encrypted_dkg_secret, uint32_t *enc_len, size_t _t) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(encrypted_dkg_secret);
SAFE_CHAR_BUF(dkg_secret, DKG_BUFER_LENGTH);
int status = gen_dkg_poly(dkg_secret, _t);
if (gen_dkg_poly(dkg_secret, _t) != 0) {
*errStatus = -1;
strncpy(errString, "gen_dkg_poly failed", BUF_LEN);
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS("gen_dkg_poly failed")
int status = AES_encrypt(dkg_secret, encrypted_dkg_secret, 3 * BUF_LEN);
status = AES_encrypt(dkg_secret, encrypted_dkg_secret, 3 * BUF_LEN);
if (status != SGX_SUCCESS) {
snprintf(errString, BUF_LEN, "SGX AES encrypt DKG poly failed");
LOG_ERROR(errString);
*errStatus = status;
goto clean;
}
CHECK_STATUS("SGX AES encrypt DKG poly failed");
*enc_len = strlen(dkg_secret) + SGX_AESGCM_MAC_SIZE + SGX_AESGCM_IV_SIZE;
......@@ -702,12 +616,8 @@ trustedGenDkgSecretAES(int *errStatus, char *errString, uint8_t *encrypted_dkg_s
status = AES_decrypt(encrypted_dkg_secret, *enc_len, decr_dkg_secret,
DKG_BUFER_LENGTH);
if (status != SGX_SUCCESS) {
snprintf(errString, BUF_LEN, "aes decrypt dkg poly failed");
LOG_ERROR(errString);
*errStatus = status;
goto clean;
}
CHECK_STATUS("aes decrypt dkg poly failed");
if (strcmp(dkg_secret, decr_dkg_secret) != 0) {
snprintf(errString, BUF_LEN,
......@@ -717,8 +627,7 @@ trustedGenDkgSecretAES(int *errStatus, char *errString, uint8_t *encrypted_dkg_s
goto clean;
}
*errStatus = 0;
SET_SUCCESS
clean:
;
}
......@@ -727,11 +636,8 @@ void
trustedDecryptDkgSecretAES(int *errStatus, char *errString, uint8_t *encrypted_dkg_secret,
uint32_t enc_len,
uint8_t *decrypted_dkg_secret) {
*errString = 0;
*errStatus = UNKNOWN_ERROR;
LOG_DEBUG(__FUNCTION__);
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(encrypted_dkg_secret);
CHECK_STATE(decrypted_dkg_secret);
......@@ -739,14 +645,9 @@ trustedDecryptDkgSecretAES(int *errStatus, char *errString, uint8_t *encrypted_d
int status = AES_decrypt(encrypted_dkg_secret, enc_len, (char *) decrypted_dkg_secret,
3072);
if (status != SGX_SUCCESS) {
snprintf(errString, BUF_LEN, "aes decrypt data - encrypted_dkg_secret failed with status %d", status);
LOG_ERROR(errString);
*errStatus = status;
goto clean;
}
CHECK_STATUS2("aes decrypt data - encrypted_dkg_secret failed with status %d")
*errStatus = 0;
SET_SUCCESS
clean:
;
......@@ -754,26 +655,19 @@ trustedDecryptDkgSecretAES(int *errStatus, char *errString, uint8_t *encrypted_d
void trustedSetEncryptedDkgPolyAES(int *errStatus, char *errString, uint8_t *encrypted_poly, uint32_t enc_len) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(encrypted_poly);
memset(getThreadLocalDecryptedDkgPoly(), 0, DKG_BUFER_LENGTH);
int status = AES_decrypt(encrypted_poly, enc_len, (char *) getThreadLocalDecryptedDkgPoly(),
DKG_BUFER_LENGTH);
if (status != SGX_SUCCESS) {
*errStatus = -1;
snprintf(errString, BUF_LEN, "sgx_unseal_data - encrypted_poly failed with status %d", status);
LOG_ERROR(errString);
goto clean;
}
*errStatus = 0;
CHECK_STATUS2("sgx_unseal_data - encrypted_poly failed with status %d")
SET_SUCCESS
clean:
;
}
......@@ -783,9 +677,10 @@ void trustedGetEncryptedSecretShareAES(int *errStatus, char *errString, uint8_t
uint8_t ind) {
LOG_DEBUG(__FUNCTION__);
INIT_ERROR_STATE
*errString = 0;
*errStatus = UNKNOWN_ERROR;
uint32_t enc_len;
int status;
CHECK_STATE(encrypted_skey);
CHECK_STATE(result_str);
......@@ -798,61 +693,43 @@ void trustedGetEncryptedSecretShareAES(int *errStatus, char *errString, uint8_t
SAFE_CHAR_BUF(pub_key_x, BUF_LEN);SAFE_CHAR_BUF(pub_key_y, BUF_LEN);
uint32_t enc_len;
int status;
trustedGenerateEcdsaKeyAES(&status, errString, encrypted_skey, &enc_len, pub_key_x, pub_key_y);
if (status != 0) {
snprintf(errString, BUF_LEN, "trustedGenerateEcdsaKeyAES failed");
*errStatus = status;
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS("trustedGenerateEcdsaKeyAES failed");
status = AES_decrypt(encrypted_skey, enc_len, skey, ECDSA_SKEY_LEN);
skey[ECDSA_SKEY_LEN - 1] = 0;
if (status != SGX_SUCCESS) {
snprintf(errString, BUF_LEN, "AES_decrypt failed (in trustedGetEncryptedSecretShareAES) with status %d",
status);
LOG_ERROR(errString);
*errStatus = status;
goto clean;
}
CHECK_STATUS2("AES_decrypt failed (in trustedGetEncryptedSecretShareAES) with status %d");
*dec_len = enc_len;
SAFE_CHAR_BUF(common_key, ECDSA_SKEY_LEN);
gen_session_key(skey, pub_keyB, common_key);
status = gen_session_key(skey, pub_keyB, common_key);
CHECK_STATUS("gen_session_key failed")
SAFE_CHAR_BUF(s_share, ECDSA_SKEY_LEN);
if (calc_secret_share(getThreadLocalDecryptedDkgPoly(), s_share, _t, _n, ind) != 0) {
*errStatus = -1;
snprintf(errString, BUF_LEN, "calc secret share failed");
LOG_ERROR(errString);
goto clean;
}
status = calc_secret_share(getThreadLocalDecryptedDkgPoly(), s_share, _t, _n, ind);
CHECK_STATUS("calc secret share failed")
if (calc_secret_shareG2(s_share, s_shareG2) != 0) {
*errStatus = -1;
snprintf(errString, BUF_LEN, "invalid decr secret share");
LOG_ERROR(errString);
goto clean;
}
status = calc_secret_shareG2(s_share, s_shareG2);
CHECK_STATUS("invalid decr secret share");
SAFE_CHAR_BUF(cypher, ECDSA_SKEY_LEN);
xor_encrypt(common_key, s_share, cypher);
status=xor_encrypt(common_key, s_share, cypher);
CHECK_STATUS("xor_encrypt failed")
strncpy(result_str, cypher, strlen(cypher));
strncpy(result_str + strlen(cypher), pub_key_x, strlen(pub_key_x));
strncpy(result_str + strlen(pub_key_x) + strlen(pub_key_y), pub_key_y, strlen(pub_key_y));
*errStatus = 0;
SET_SUCCESS
clean:
;
......@@ -861,10 +738,9 @@ void trustedGetEncryptedSecretShareAES(int *errStatus, char *errString, uint8_t
void trustedGetPublicSharesAES(int *errStatus, char *errString, uint8_t *encrypted_dkg_secret, uint32_t enc_len,
char *public_shares,
unsigned _t, unsigned _n) {
LOG_DEBUG(__FUNCTION__);
LOG_INFO(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
INIT_ERROR_STATE
CHECK_STATE(encrypted_dkg_secret);
CHECK_STATE(public_shares);
......@@ -875,21 +751,12 @@ void trustedGetPublicSharesAES(int *errStatus, char *errString, uint8_t *encrypt
int status = AES_decrypt(encrypted_dkg_secret, enc_len, decrypted_dkg_secret,
DKG_MAX_SEALED_LEN);
if (status != SGX_SUCCESS) {
snprintf(errString, BUF_LEN, "aes decrypt data - encrypted_dkg_secret failed with status %d", status);
*errStatus = status;
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS2("aes decrypt data - encrypted_dkg_secret failed with status %d");
if (calc_public_shares(decrypted_dkg_secret, public_shares, _t) != 0) {
*errStatus = -1;
snprintf(errString, BUF_LEN, "t does not match polynomial in db");
LOG_ERROR(errString);
goto clean;
}
status = calc_public_shares(decrypted_dkg_secret, public_shares, _t) != 0;
CHECK_STATUS("t does not match polynomial in db");
*errStatus = 0;
SET_SUCCESS
clean:
;
......@@ -897,11 +764,9 @@ void trustedGetPublicSharesAES(int *errStatus, char *errString, uint8_t *encrypt
void trustedDkgVerifyAES(int *errStatus, char *errString, const char *public_shares, const char *s_share,
uint8_t *encryptedPrivateKey, uint64_t enc_len, unsigned _t, int _ind, int *result) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(public_shares);
CHECK_STATE(s_share);
......@@ -914,12 +779,7 @@ void trustedDkgVerifyAES(int *errStatus, char *errString, const char *public_sha
int status = AES_decrypt(encryptedPrivateKey, enc_len, skey, ECDSA_SKEY_LEN);
if (status != SGX_SUCCESS) {
snprintf(errString, BUF_LEN, "AES_decrypt failed (in trustedDkgVerifyAES) with status %d", status);
*errStatus = status;
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS2("AES_decrypt failed (in trustedDkgVerifyAES) with status %d");
SAFE_CHAR_BUF(encr_sshare, ECDSA_SKEY_LEN);
......@@ -927,34 +787,35 @@ void trustedDkgVerifyAES(int *errStatus, char *errString, const char *public_sha
SAFE_CHAR_BUF(common_key, ECDSA_SKEY_LEN);
session_key_recover(skey, s_share, common_key);
status = session_key_recover(skey, s_share, common_key);
CHECK_STATUS("session_key_recover failed");
SAFE_CHAR_BUF(decr_sshare, ECDSA_SKEY_LEN);
xor_decrypt(common_key, encr_sshare, decr_sshare);
status=xor_decrypt(common_key, encr_sshare, decr_sshare);
if (mpz_set_str(s, decr_sshare, 16) == -1) {
*errStatus = 1;
snprintf(errString, BUF_LEN, "invalid decr secret share");
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS("xor_decrypt failed")
*result = Verification(public_shares, s, _t, _ind);
*errStatus = 0;
status = mpz_set_str(s, decr_sshare, 16);
CHECK_STATUS("invalid decr secret share");
*result = Verification(public_shares, s, _t, _ind);
SET_SUCCESS
clean:
mpz_clear(s);
}
void trustedCreateBlsKeyAES(int *errStatus, char *errString, const char *s_shares,
uint8_t *encryptedPrivateKey, uint64_t key_len, uint8_t *encr_bls_key,
uint32_t *enc_bls_key_len) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
LOG_INFO(__FUNCTION__);
INIT_ERROR_STATE
CHECK_STATE(s_shares);
CHECK_STATE(encryptedPrivateKey);
......@@ -975,12 +836,7 @@ void trustedCreateBlsKeyAES(int *errStatus, char *errString, const char *s_share
int status = AES_decrypt(encryptedPrivateKey, key_len, skey, ECDSA_SKEY_LEN);
if (status != SGX_SUCCESS) {
*errStatus = status;
snprintf(errString, BUF_LEN, "aes decrypt failed with status %d", status);
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS2("aes decrypt failed with status %d");
skey[ECDSA_SKEY_LEN - 1] = 0;
......@@ -995,11 +851,20 @@ void trustedCreateBlsKeyAES(int *errStatus, char *errString, const char *s_share
s_share[192] = 0;
SAFE_CHAR_BUF(common_key, 65);
session_key_recover(skey, s_share, common_key);
status = session_key_recover(skey, s_share, common_key);
CHECK_STATUS("session_key_recover failed");
common_key[64] = 0;
SAFE_CHAR_BUF(decr_sshare, 65);
xor_decrypt(common_key, encr_sshare, decr_sshare);
status = xor_decrypt(common_key, encr_sshare, decr_sshare);
CHECK_STATUS("xor_decrypt failed");
decr_sshare[64] = 0;
......@@ -1035,18 +900,13 @@ void trustedCreateBlsKeyAES(int *errStatus, char *errString, const char *s_share
status = AES_encrypt(key_share, encr_bls_key, BUF_LEN);
if (status != SGX_SUCCESS) {
*errStatus = -1;
snprintf(errString, BUF_LEN, "aes encrypt bls private key failed with status %d ", status);
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS2("aes encrypt bls private key failed with status %d ");
*enc_bls_key_len = strlen(key_share) + SGX_AESGCM_MAC_SIZE + SGX_AESGCM_IV_SIZE;
*errStatus = 0;
SET_SUCCESS
clean:
mpz_clear(bls_key);
mpz_clear(sum);
mpz_clear(q);
......@@ -1057,8 +917,7 @@ trustedGetBlsPubKeyAES(int *errStatus, char *errString, uint8_t *encryptedPrivat
char *bls_pub_key) {
LOG_DEBUG(__FUNCTION__);
*errString = 0;
*errStatus = UNKNOWN_ERROR;
INIT_ERROR_STATE
CHECK_STATE(bls_pub_key);
CHECK_STATE(encryptedPrivateKey);
......@@ -1066,25 +925,16 @@ trustedGetBlsPubKeyAES(int *errStatus, char *errString, uint8_t *encryptedPrivat
SAFE_CHAR_BUF(skey_hex, ECDSA_SKEY_LEN);
int status = AES_decrypt(encryptedPrivateKey, key_len, skey_hex, ECDSA_SKEY_LEN);
if (status != SGX_SUCCESS) {
*errStatus = 1;
snprintf(errString, BUF_LEN, "aes_decrypt failed with status %d", status);
LOG_ERROR(errString);
goto clean;
}
CHECK_STATUS2("AES decrypt failed %d");
skey_hex[ECDSA_SKEY_LEN - 1] = 0;
if (calc_bls_public_key(skey_hex, bls_pub_key) != 0) {
LOG_ERROR(skey_hex);
*errStatus = -1;
snprintf(errString, BUF_LEN, "could not calculate bls public key");
LOG_ERROR(errString);
goto clean;
}
status = calc_bls_public_key(skey_hex, bls_pub_key);
*errStatus = 0;
CHECK_STATUS("could not calculate bls public key");
SET_SUCCESS
clean:
;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment