Unverified Commit 5e8794fb authored by Sveta Rogova's avatar Sveta Rogova Committed by GitHub

Merge pull request #4 from skalenetwork/enhancement/SKALE-1594-add-ECDSA-signatures-to-SGX

Enhancement/skale 1594 add ecdsa signatures to sgx
parents 4a694991 913ba03c
......@@ -7,6 +7,7 @@
#include "sgxwallet.h"
#include <iostream>
std::vector<std::string> gen_ecdsa_key(){
char *errMsg = (char *)calloc(1024, 1);
int err_status = 0;
......@@ -18,32 +19,83 @@ std::vector<std::string> gen_ecdsa_key(){
status = generate_ecdsa_key(eid, &err_status, errMsg, encr_pr_key, &enc_len, pub_key_x, pub_key_y );
std::vector<std::string> keys(2);
char *hexEncrKey = (char *) calloc(2 * BUF_LEN, 1);
char *hexEncrKey = (char *) calloc(2*BUF_LEN, 1);
carray2Hex(encr_pr_key, enc_len, hexEncrKey);
keys.at(0) = hexEncrKey;
keys.at(1) = std::string(pub_key_x) + std::string(pub_key_y);
std::cerr << "in ECDSACrypto encr key x " << keys.at(0) << std::endl;
//std::cerr << "in ECDSACrypto encr key x " << keys.at(0) << std::endl;
std::cerr << "in ECDSACrypto encr_len %d " << enc_len << std::endl;
free(errMsg);
free(pub_key_x);
free(pub_key_y);
free(encr_pr_key);
free(hexEncrKey);
return keys;
}
std::vector<std::string> ecdsa_sign_hash(const char* encryptedKeyHex, const char* hashHex){
std::string get_ecdsa_pubkey(const char* encryptedKeyHex){
char *errMsg = (char *)calloc(1024, 1);
int err_status = 0;
char *pub_key_x = (char *)calloc(1024, 1);
char *pub_key_y = (char *)calloc(1024, 1);
uint64_t enc_len = 0;
uint8_t encr_pr_key[BUF_LEN];
hex2carray(encryptedKeyHex, &enc_len, encr_pr_key);
status = get_public_ecdsa_key(eid, &err_status, errMsg, encr_pr_key, enc_len, pub_key_x, pub_key_y );
std::string pubKey = std::string(pub_key_x) + std::string(pub_key_y);
std::cerr << "err str " << errMsg << std::endl;
free(errMsg);
free(pub_key_x);
free(pub_key_y);
return pubKey;
}
std::vector<std::string> ecdsa_sign_hash(const char* encryptedKeyHex, const char* hashHex, int base){
std::vector<std::string> signature_vect(3);
char *errMsg = (char *)calloc(1024, 1);
int err_status = 0;
char* signature_r = (char*)malloc(1024);
char* signature_s = (char*)malloc(1024);
char* signature_v = (char*)calloc(4,1);
uint8_t signature_v = 0;
uint64_t dec_len = 0;
uint8_t encr_key[BUF_LEN];
hex2carray(encryptedKeyHex, &dec_len, encr_key);
status = ecdsa_sign1(eid, &err_status, errMsg, encr_key, dec_len, (unsigned char*)hashHex, signature_r, signature_s, signature_v );
std::cerr << "encryptedKeyHex: "<< encryptedKeyHex << std::endl;
std::cerr << "HASH: "<< hashHex << std::endl;
std::cerr << "encrypted len" << dec_len << std::endl;
status = ecdsa_sign1(eid, &err_status, errMsg, encr_key, ECDSA_ENCR_LEN, (unsigned char*)hashHex, signature_r, signature_s, &signature_v, base );
std::cerr << "signature r in ecdsa_sign_hash "<< signature_r << std::endl;
std::cerr << "signature s in ecdsa_sign_hash "<< signature_s << std::endl;
if ( status != SGX_SUCCESS){
std::cerr << "failed to sign " << std::endl;
}
signature_vect.at(0) = std::to_string(signature_v);
if ( base == 16) {
signature_vect.at(1) = "0x" + std::string(signature_r);
signature_vect.at(2) = "0x" + std::string(signature_s);
}
else{
signature_vect.at(1) = std::string(signature_r);
signature_vect.at(2) = std::string(signature_s);
}
signature_vect.at(0) = signature_v;
signature_vect.at(1) = "0x" + std::string(signature_r);
signature_vect.at(2) = "0x" + std::string(signature_s);
free(errMsg);
free(signature_r);
free(signature_s);
return signature_vect;
}
\ No newline at end of file
......@@ -18,6 +18,9 @@
std::vector<std::string> gen_ecdsa_key();
std::vector<std::string> ecdsa_sign_hash(const char* encryptedKeyHex, const char* hashHex);
std::string get_ecdsa_pubkey(const char* encryptedKeyHex);
std::vector<std::string> ecdsa_sign_hash(const char* encryptedKeyHex, const char* hashHex, int base);
#endif //SGXD_ECDSACRYPTO_H
......@@ -25,6 +25,7 @@
#include <stdexcept>
#include <memory>
#include <string>
#include <iostream>
#include "leveldb/db.h"
......@@ -54,6 +55,8 @@ std::shared_ptr<std::string> LevelDB::readString(const std::string &_key) {
auto status = db->Get(readOptions, _key, &*result);
std::cerr << "key to read from db: " << _key <<std::endl;
throwExceptionOnError(status);
if (status.IsNotFound())
......@@ -69,6 +72,8 @@ void LevelDB::writeString(const std::string &_key, const std::string &_value) {
auto status = db->Put(writeOptions, Slice(_key), Slice(_value));
throwExceptionOnError(status);
std::cerr << "written key " << _key << " value " << _value <<std::endl;
}
void LevelDB::writeByteArray(const char *_key, size_t _keyLen, const char *value,
......@@ -93,6 +98,7 @@ void LevelDB::writeByteArray(std::string &_key, const char *value,
}
void LevelDB::throwExceptionOnError(Status _status) {
std::cerr << " DB exception " << std::endl;
if (_status.IsNotFound())
return;
......
......@@ -31,21 +31,19 @@ SGXWalletServer::SGXWalletServer(AbstractServerConnector &connector,
serverVersion_t type)
: AbstractStubServer(connector, type) {}
SGXWalletServer* s = nullptr;
HttpServer* hs = nullptr;
SGXWalletServer *s = nullptr;
HttpServer *hs = nullptr;
int init_server() {
hs = new HttpServer(1025);
s = new SGXWalletServer(*hs,
hs = new HttpServer(1025);
s = new SGXWalletServer(*hs,
JSONRPC_SERVER_V2); // hybrid server (json-rpc 1.0 & 2.0)
if (!s->StartListening()) {
cerr << "Server could not start listening" << endl;
exit(-1);
}
return 0;
}
return 0;
}
Json::Value
......@@ -84,7 +82,6 @@ importBLSKeyShareImpl(int index, const std::string &_keyShare, const std::string
return result;
}
Json::Value blsSignMessageHashImpl(const std::string &keyShareName, const std::string &messageHash) {
Json::Value result;
result["status"] = -1;
......@@ -151,7 +148,7 @@ Json::Value generateECDSAKeyImpl(const std::string &_keyName) {
result["errorMessage"] = "";
result["encryptedKey"] = "";
cerr << "Calling method" << endl;
cerr << "Calling method generateECDSAKey" << endl;
std::vector<std::string>keys;
......@@ -161,9 +158,10 @@ Json::Value generateECDSAKeyImpl(const std::string &_keyName) {
if (keys.size() == 0 ) {
throw RPCException(UNKNOWN_ERROR, "");
}
// std::cerr << "write encr key" << keys.at(0) << std::endl;
writeECDSAKey(_keyName, keys.at(0));
} catch (RPCException &_e) {
std::cerr << " err str " << _e.errString << std::endl;
result["status"] = _e.status;
result["errorMessage"] = _e.errString;
}
......@@ -172,13 +170,13 @@ Json::Value generateECDSAKeyImpl(const std::string &_keyName) {
result["PublicKey"] = keys.at(1);
std::cerr << "in SGXWalletServer encr key x " << keys.at(0) << std::endl;
//std::cerr << "in SGXWalletServer encr key x " << keys.at(0) << std::endl;
return result;
}
Json::Value ecdsaSignMessageHashImpl(const std::string &_keyName, const std::string &messageHash) {
Json::Value ecdsaSignMessageHashImpl(int base, const std::string &_keyName, const std::string &messageHash) {
Json::Value result;
result["status"] = 0;
result["errorMessage"] = "";
......@@ -187,15 +185,25 @@ Json::Value ecdsaSignMessageHashImpl(const std::string &_keyName, const std::str
result["signature_s"] = "";
std::vector<std::string> sign_vect(3);
std::cerr << "entered ecdsaSignMessageHashImpl" << messageHash << "length " << messageHash.length() << std::endl;
std::string cutHash = messageHash;
if (cutHash[0] == '0' && (cutHash[1] == 'x'||cutHash[1] == 'X')){
cutHash.erase(cutHash.begin(), cutHash.begin()+2);
}
while (cutHash[0] == '0'){
cutHash.erase(cutHash.begin(), cutHash.begin()+1);
}
std::cerr << "Hash handled " << cutHash << std::endl;
try {
std::shared_ptr<std::string> key_ptr = readECDSAKey(_keyName);
sign_vect = ecdsa_sign_hash ((*key_ptr).c_str(), messageHash.c_str());
// std::cerr << "read encr key" << *key_ptr << std::endl;
sign_vect = ecdsa_sign_hash(key_ptr->c_str(),cutHash.c_str(), base);
} catch (RPCException &_e) {
std::cerr << "err str " << _e.errString << std::endl;
result["status"] = _e.status;
result["errorMessage"] = _e.errString;
}
std::cerr << "got signature_s " << sign_vect.at(2) << std::endl;
result["signature_v"] = sign_vect.at(0);
result["signature_r"] = sign_vect.at(1);
result["signature_s"] = sign_vect.at(2);
......@@ -203,12 +211,45 @@ Json::Value ecdsaSignMessageHashImpl(const std::string &_keyName, const std::str
return result;
}
Json::Value getPublicECDSAKeyImpl(const std::string& keyName){
Json::Value result;
result["status"] = 0;
result["errorMessage"] = "";
result["PublicKey"] = "";
cerr << "Calling method getPublicECDSAKey" << endl;
std::string Pkey;
try {
std::shared_ptr<std::string> key_ptr = readECDSAKey(keyName);
Pkey = get_ecdsa_pubkey( key_ptr->c_str());
} catch (RPCException &_e) {
result["status"] = _e.status;
result["errorMessage"] = _e.errString;
}
std::cerr << "PublicKey" << Pkey << std::endl;
result["PublicKey"] = Pkey;
//std::cerr << "in SGXWalletServer encr key x " << keys.at(0) << std::endl;
return result;
}
Json::Value SGXWalletServer::generateECDSAKey(const std::string &_keyName) {
return generateECDSAKeyImpl(_keyName);
}
Json::Value SGXWalletServer::ecdsaSignMessageHash(const std::string &_keyName, const std::string &messageHash) {
return ecdsaSignMessageHashImpl(_keyName, messageHash);
Json::Value SGXWalletServer::getPublicECDSAKey(const std::string &_keyName) {
return getPublicECDSAKeyImpl(_keyName);
}
Json::Value SGXWalletServer::ecdsaSignMessageHash(int base, const std::string &_keyName, const std::string &messageHash ) {
std::cerr << "entered ecdsaSignMessageHash" << std::endl;
std::cerr << "MessageHash first " << messageHash << std::endl;
return ecdsaSignMessageHashImpl(base,_keyName, messageHash);
}
Json::Value
......@@ -265,7 +306,7 @@ shared_ptr <std::string> readECDSAKey(const string &_keyName) {
auto keyStr = levelDb->readString("ECDSAKEY:" + _keyName);
if (keyStr == nullptr) {
throw RPCException(KEY_SHARE_DOES_NOT_EXIST, "Key share with this name does not exists");
throw RPCException(KEY_SHARE_DOES_NOT_EXIST, "Key with this name does not exists");
}
return keyStr;
......
......@@ -14,6 +14,7 @@ class SGXWalletServer : public AbstractStubServer {
SGXWalletServer* server = nullptr;
public:
SGXWalletServer(AbstractServerConnector &connector, serverVersion_t type);
......@@ -21,16 +22,11 @@ public:
virtual Json::Value blsSignMessageHash(const std::string& keyShareName, const std::string& messageHash);
virtual Json::Value importECDSAKey(const std::string& key, const std::string& keyName);
virtual Json::Value generateECDSAKey(const std::string& keyName);
virtual Json::Value ecdsaSignMessageHash(const std::string& keyShareName, const std::string& messageHash);
virtual Json::Value ecdsaSignMessageHash(int base, const std::string& keyShareName, const std::string& messageHash );
virtual Json::Value getPublicECDSAKey(const std::string& keyName);
};
void writeKeyShare(const string &_keyShareName, const string &value, int index, int n, int t);
shared_ptr<std::string> readKeyShare(const string& _keyShare);
......@@ -44,8 +40,8 @@ Json::Value importBLSKeyShareImpl(int index, const std::string& keyShare, const
Json::Value blsSignMessageHashImpl(const std::string& keyShareName, const std::string& messageHash);
Json::Value importECDSAKeyImpl(const std::string& key, const std::string& keyName);
Json::Value generateECDSAKeyImpl(const std::string& keyName);
Json::Value ecdsaSignMessageHashImpl(const std::string& keyName, const std::string& messageHash);
Json::Value ecdsaSignMessageHashImpl(int base, const std::string& keyName, const std::string& messageHash);
Json::Value getPublicECDSAKeyImpl(const std::string& keyName);
......
......@@ -16,7 +16,8 @@ class AbstractStubServer : public jsonrpc::AbstractServer<AbstractStubServer>
this->bindAndAddMethod(jsonrpc::Procedure("blsSignMessageHash", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "keyShareName",jsonrpc::JSON_STRING,"messageHash",jsonrpc::JSON_STRING, NULL), &AbstractStubServer::blsSignMessageHashI);
this->bindAndAddMethod(jsonrpc::Procedure("importECDSAKey", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "key",jsonrpc::JSON_STRING,"keyName",jsonrpc::JSON_STRING, NULL), &AbstractStubServer::importECDSAKeyI);
this->bindAndAddMethod(jsonrpc::Procedure("generateECDSAKey", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "keyName",jsonrpc::JSON_STRING, NULL), &AbstractStubServer::generateECDSAKeyI);
this->bindAndAddMethod(jsonrpc::Procedure("ecdsaSignMessageHash", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "keyShareName",jsonrpc::JSON_STRING,"messageHash",jsonrpc::JSON_STRING, NULL), &AbstractStubServer::ecdsaSignMessageHashI);
this->bindAndAddMethod(jsonrpc::Procedure("getPublicECDSAKey", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "keyName",jsonrpc::JSON_STRING, NULL), &AbstractStubServer::getPublicECDSAKeyI);
this->bindAndAddMethod(jsonrpc::Procedure("ecdsaSignMessageHash", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "base",jsonrpc::JSON_INTEGER,"keyName",jsonrpc::JSON_STRING,"messageHash",jsonrpc::JSON_STRING, NULL), &AbstractStubServer::ecdsaSignMessageHashI);
}
inline virtual void importBLSKeyShareI(const Json::Value &request, Json::Value &response)
......@@ -35,15 +36,20 @@ class AbstractStubServer : public jsonrpc::AbstractServer<AbstractStubServer>
{
response = this->generateECDSAKey(request["keyName"].asString());
}
inline virtual void getPublicECDSAKeyI(const Json::Value &request, Json::Value &response)
{
response = this->getPublicECDSAKey(request["keyName"].asString());
}
inline virtual void ecdsaSignMessageHashI(const Json::Value &request, Json::Value &response)
{
response = this->ecdsaSignMessageHash(request["keyShareName"].asString(), request["messageHash"].asString());
response = this->ecdsaSignMessageHash(request["base"].asInt(), request["keyName"].asString(), request["messageHash"].asString());
}
virtual Json::Value importBLSKeyShare(int index, const std::string& keyShare, const std::string& keyShareName, int n, int t) = 0;
virtual Json::Value blsSignMessageHash(const std::string& keyShareName, const std::string& messageHash) = 0;
virtual Json::Value importECDSAKey(const std::string& key, const std::string& keyName) = 0;
virtual Json::Value generateECDSAKey(const std::string& keyName) = 0;
virtual Json::Value ecdsaSignMessageHash(const std::string& keyShareName, const std::string& messageHash) = 0;
virtual Json::Value getPublicECDSAKey(const std::string& keyName) = 0;
virtual Json::Value ecdsaSignMessageHash(int base, const std::string& keyName, const std::string& messageHash) = 0;
};
#endif //JSONRPC_CPP_STUB_ABSTRACTSTUBSERVER_H_
secure_enclave.o: secure_enclave.c \
../intel-sgx-ssl/Linux/package/include/openssl/ecdsa.h \
../intel-sgx-ssl/Linux/package/include/openssl/ec.h \
../intel-sgx-ssl/Linux/package/include/openssl/opensslconf.h \
../intel-sgx-ssl/Linux/package/include/openssl/opensslv.h \
../intel-sgx-ssl/Linux/package/include/openssl/asn1.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/time.h \
secure_enclave.o: secure_enclave.c secure_enclave_t.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdint.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/stdint.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/cdefs.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/_types.h \
../intel-sgx-ssl/Linux/package/include/openssl/e_os2.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/inttypes.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/stdint.h \
../intel-sgx-ssl/Linux/package/include/openssl/bio.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdarg.h \
../intel-sgx-ssl/Linux/package/include/openssl/crypto.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdlib.h \
../intel-sgx-ssl/Linux/package/include/openssl/safestack.h \
../intel-sgx-ssl/Linux/package/include/openssl/stack.h \
../intel-sgx-ssl/Linux/package/include/openssl/ossl_typ.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/limits.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/limits.h \
../intel-sgx-ssl/Linux/package/include/openssl/cryptoerr.h \
../intel-sgx-ssl/Linux/package/include/openssl/symhacks.h \
../intel-sgx-ssl/Linux/package/include/pthread.h \
../intel-sgx-ssl/Linux/package/include/openssl/bioerr.h \
../intel-sgx-ssl/Linux/package/include/openssl/asn1err.h \
../intel-sgx-ssl/Linux/package/include/openssl/bn.h \
../intel-sgx-ssl/Linux/package/include/openssl/bnerr.h \
../intel-sgx-ssl/Linux/package/include/openssl/ecerr.h \
../intel-sgx-ssl/Linux/package/include/openssl/evp.h \
../intel-sgx-ssl/Linux/package/include/openssl/evperr.h \
../intel-sgx-ssl/Linux/package/include/openssl/objects.h \
../intel-sgx-ssl/Linux/package/include/openssl/obj_mac.h \
../intel-sgx-ssl/Linux/package/include/openssl/objectserr.h \
../intel-sgx-ssl/Linux/package/include/openssl/err.h \
../intel-sgx-ssl/Linux/package/include/openssl/lhash.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/errno.h \
../intel-sgx-ssl/Linux/package/include/openssl/rand.h \
../intel-sgx-ssl/Linux/package/include/openssl/randerr.h \
../intel-sgx-ssl/Linux/package/include/tSgxSSL_api.h secure_enclave_t.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdint.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/wchar.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stddef.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/sgx_edger8r.h \
......@@ -46,6 +10,9 @@ secure_enclave.o: secure_enclave.c \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/sgx_error.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/sgx_eid.h \
/home/kladko/sgxwallet/tgmp-build/include/sgx_tgmp.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/limits.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/limits.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdlib.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/sgx_tcrypto.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/sgx.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/sgx_attributes.h \
......@@ -58,94 +25,23 @@ secure_enclave.o: secure_enclave.c \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/float.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/string.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdio.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdarg.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdbool.h \
domain_parameters.h point.h signature.h curves.h ../sgxwallet_common.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/unistd.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/types.h \
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/endian.h
../intel-sgx-ssl/Linux/package/include/openssl/ecdsa.h:
../intel-sgx-ssl/Linux/package/include/openssl/ec.h:
../intel-sgx-ssl/Linux/package/include/openssl/opensslconf.h:
../intel-sgx-ssl/Linux/package/include/openssl/opensslv.h:
secure_enclave_t.h:
../intel-sgx-ssl/Linux/package/include/openssl/asn1.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdint.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/time.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/stdint.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/cdefs.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/_types.h:
../intel-sgx-ssl/Linux/package/include/openssl/e_os2.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/inttypes.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/stdint.h:
../intel-sgx-ssl/Linux/package/include/openssl/bio.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdarg.h:
../intel-sgx-ssl/Linux/package/include/openssl/crypto.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdlib.h:
../intel-sgx-ssl/Linux/package/include/openssl/safestack.h:
../intel-sgx-ssl/Linux/package/include/openssl/stack.h:
../intel-sgx-ssl/Linux/package/include/openssl/ossl_typ.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/limits.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/limits.h:
../intel-sgx-ssl/Linux/package/include/openssl/cryptoerr.h:
../intel-sgx-ssl/Linux/package/include/openssl/symhacks.h:
../intel-sgx-ssl/Linux/package/include/pthread.h:
../intel-sgx-ssl/Linux/package/include/openssl/bioerr.h:
../intel-sgx-ssl/Linux/package/include/openssl/asn1err.h:
../intel-sgx-ssl/Linux/package/include/openssl/bn.h:
../intel-sgx-ssl/Linux/package/include/openssl/bnerr.h:
../intel-sgx-ssl/Linux/package/include/openssl/ecerr.h:
../intel-sgx-ssl/Linux/package/include/openssl/evp.h:
../intel-sgx-ssl/Linux/package/include/openssl/evperr.h:
../intel-sgx-ssl/Linux/package/include/openssl/objects.h:
../intel-sgx-ssl/Linux/package/include/openssl/obj_mac.h:
../intel-sgx-ssl/Linux/package/include/openssl/objectserr.h:
../intel-sgx-ssl/Linux/package/include/openssl/err.h:
../intel-sgx-ssl/Linux/package/include/openssl/lhash.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/errno.h:
../intel-sgx-ssl/Linux/package/include/openssl/rand.h:
../intel-sgx-ssl/Linux/package/include/openssl/randerr.h:
../intel-sgx-ssl/Linux/package/include/tSgxSSL_api.h:
secure_enclave_t.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdint.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/wchar.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stddef.h:
......@@ -160,6 +56,12 @@ secure_enclave_t.h:
/home/kladko/sgxwallet/tgmp-build/include/sgx_tgmp.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/limits.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/sys/limits.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdlib.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/sgx_tcrypto.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/sgx.h:
......@@ -184,6 +86,8 @@ secure_enclave_t.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdio.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdarg.h:
/home/kladko/sgxwallet/sgx-sdk-build/sgxsdk/include/tlibc/stdbool.h:
domain_parameters.h:
......
......@@ -171,6 +171,18 @@ bool enclave_sign(const char *_keyString, const char *_hashXString, const char *
}
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'};
for (int j = 0; j < _len; j++) {
_hexArray[j * 2] = hexval[((d[j] >> 4) & 0xF)];
_hexArray[j * 2 + 1] = hexval[(d[j]) & 0x0F];
}
_hexArray[_len * 2] = 0;
}
......@@ -90,7 +90,7 @@ libff::alt_bn128_Fr PolynomialValue(const std::vector<libff::alt_bn128_Fr>& pol,
libff::alt_bn128_Fr pow = libff::alt_bn128_Fr::one();
for (size_t i = 0; i < _t; ++i) {
if (i == _t - 1 && pol[i] == libff::alt_bn128_Fr::zero()) {
throw std::runtime_error("Error, incorrect degree of a polynomial");
//snprintf(err_string, BUF_LEN,"sgx_unseal_data failed with status
}
value += pol[i] * pow;
pow *= point;
......@@ -105,12 +105,12 @@ void calc_secret_shares(const char* decrypted_koefs, char * secret_shares,
std::string result;
char symbol = ':';
std::vector<libff::alt_bn128_Fr> poly = SplitStringToFr(decrypted_koefs, &symbol);
for (size_t i = 0; i < _n; ++i) {
for (size_t i = 0; i < _n; ++i) {
libff::alt_bn128_Fr secret_share = PolynomialValue(poly, libff::alt_bn128_Fr(i + 1), _t);
result += stringFromFr(secret_share);
result += ":";
}
strncpy(secret_shares, result.c_str(), result.length());
strncpy(secret_shares, result.c_str(), 2000);//result.length());
}
void calc_public_shares(const char* decrypted_koefs, char * public_shares,
......
......@@ -17,5 +17,6 @@ EXTERNC void calc_secret_shares(const char* decrypted_koefs, char * secret_share
unsigned _t, unsigned _n);
EXTERNC void calc_public_shares(const char* decrypted_koefs, char * public_shares,
unsigned _t);
#endif //SGXD_DKGUTILS_H
......@@ -115,7 +115,7 @@ secure_enclave_LDADD = @SGX_ENCLAVE_LDADD@
## --startgroup and --endgroup flags. (This would be where you'd add
## SGXSSL libraries, and your trusted c++ library
SGX_EXTRA_TLIBS=-lsgx_tgmp -lsgx_tservice -lsgx_urts -lsgx_tcxx -lsgx_tcrypto
SGX_EXTRA_TLIBS=-lsgx_tgmp -lsgx_tservice -lsgx_urts -lsgx_tcxx
......
......@@ -349,7 +349,7 @@ secure_enclave_SOURCES = secure_enclave_t.c secure_enclave_t.h \
../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_g1.cpp $(ENCLAVE_KEY) $(ENCLAVE_CONFIG)
secure_enclave_LDADD = @SGX_ENCLAVE_LDADD@
SGX_EXTRA_TLIBS = -lsgx_tgmp -lsgx_tservice -lsgx_urts -lsgx_tcxx -lsgx_tcrypto
SGX_EXTRA_TLIBS = -lsgx_tgmp -lsgx_tservice -lsgx_urts -lsgx_tcxx
all: all-am
.SUFFIXES:
......
......@@ -31,13 +31,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <openssl/ecdsa.h>
/*#include <openssl/ecdsa.h>
#include <openssl/ec.h>
#include <openssl/bn.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include "tSgxSSL_api.h"
#include "tSgxSSL_api.h"*/
#include "secure_enclave_t.h"
#include "sgx_tcrypto.h"
......@@ -56,7 +56,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "curves.h"
#include <string.h>
#include <sgx_tcrypto.h>
#include "../sgxwallet_common.h"
......@@ -135,7 +134,7 @@ void generate_ecdsa_key(int *err_status, char *err_string,
domain_parameters_load_curve(curve, secp256k1);
unsigned char* rand_char = (unsigned char*)malloc(32);
sgx_read_rand( (unsigned char*)rand_char, 32);
sgx_read_rand( rand_char, 32);
mpz_t seed;
mpz_init(seed);
......@@ -148,8 +147,11 @@ void generate_ecdsa_key(int *err_status, char *err_string,
mpz_mod(skey, seed, curve->p);
mpz_clear(seed);
//mpz_set_str(skey, "4160780231445160889237664391382223604576", 10);
//mpz_set_str(skey, "4160780231445160889237664391382223604184857153814275770598791864649971919844", 10);
//mpz_set_str(skey, "1", 10);
//mpz_set_str(skey, "ebb2c082fd7727890a28ac82f6bdf97bad8de9f5d7c9028692de1a255cad3e0f", 16);
//mpz_set_str(skey, "D30519BCAE8D180DBFCC94FE0B8383DC310185B0BE97B4365083EBCECCD75759", 16);
//Public key
point Pkey = point_init();
......@@ -163,20 +165,27 @@ void generate_ecdsa_key(int *err_status, char *err_string,
char arr_x[len];
char* px = mpz_get_str(arr_x, base, Pkey->x);
//snprintf(err_string, BUF_LEN, "arr=%p px=%p\n", arr_x, px);
strncpy(pub_key_x, arr_x, 1024);
int n_zeroes = 64 - strlen(arr_x);
for ( int i = 0; i < n_zeroes; i++){
pub_key_x[i] = '0';
}
strncpy(pub_key_x + n_zeroes, arr_x, 1024 - n_zeroes);
char arr_y[mpz_sizeinbase (Pkey->y, base) + 2];
char* py = mpz_get_str(arr_y, base, Pkey->y);
strncpy(pub_key_y, arr_y, 1024);
char skey_str[mpz_sizeinbase (skey, 10) + 2];
char* s = mpz_get_str(skey_str, 10, skey);
// snprintf(err_string, BUF_LEN, "skey is %s\n", skey_str);
n_zeroes = 64 - strlen(arr_y);
for ( int i = 0; i < n_zeroes; i++){
pub_key_y[i] = '0';
}
strncpy(pub_key_y + n_zeroes, arr_y, 1024 - n_zeroes);
char skey_str[mpz_sizeinbase (skey, ECDSA_SKEY_BASE) + 2];
char* s = mpz_get_str(skey_str, ECDSA_SKEY_BASE, skey);
snprintf(err_string, BUF_LEN, "skey is %s len %d\n", skey_str, strlen(skey_str));
uint32_t sealedLen = sgx_calc_sealed_data_size(0, 39);
uint32_t sealedLen = sgx_calc_sealed_data_size(0, ECDSA_SKEY_LEN);
sgx_status_t status = sgx_seal_data(0, NULL, 39, (uint8_t *)skey_str, sealedLen,(sgx_sealed_data_t*)encrypted_key);
sgx_status_t status = sgx_seal_data(0, NULL, ECDSA_SKEY_LEN, (uint8_t *)skey_str, sealedLen,(sgx_sealed_data_t*)encrypted_key);
if( status != SGX_SUCCESS) {
snprintf(err_string, BUF_LEN,"seal ecsdsa private key failed");
return;
......@@ -190,6 +199,73 @@ void generate_ecdsa_key(int *err_status, char *err_string,
}
void get_public_ecdsa_key(int *err_status, char *err_string,
uint8_t *encrypted_key, uint32_t dec_len, char * pub_key_x, char * pub_key_y) {
//uint32_t dec_len = 0;
domain_parameters curve = domain_parameters_init();
domain_parameters_load_curve(curve, secp256k1);
char skey[ECDSA_SKEY_LEN];
sgx_status_t status = sgx_unseal_data(
(const sgx_sealed_data_t *)encrypted_key, NULL, 0, (uint8_t *)skey, &dec_len);
if (status != SGX_SUCCESS) {
snprintf(err_string, BUF_LEN,"sgx_unseal_data failed with status %d", status);
return;
}
//strncpy(err_string, skey, 1024);
mpz_t skey_mpz;
mpz_init(skey_mpz);
// mpz_import(skey_mpz, 32, 1, sizeof(skey[0]), 0, 0, skey);
if (mpz_set_str(skey_mpz, skey, ECDSA_SKEY_BASE) == -1){
snprintf(err_string, BUF_LEN,"wrong string to init private key");
}
//Public key
point Pkey = point_init();
signature_generate_key(Pkey, skey_mpz, curve);
point Pkey_test = point_init();
point_multiplication(Pkey_test, skey_mpz, curve->G, curve);
if (!point_cmp(Pkey, Pkey_test)){
snprintf(err_string, BUF_LEN,"Points are not equal");
}
int base = 16;
int len = mpz_sizeinbase (Pkey->x, base) + 2;
//snprintf(err_string, BUF_LEN, "len = %d\n", len);
char arr_x[len];
char* px = mpz_get_str(arr_x, base, Pkey->x);
//snprintf(err_string, BUF_LEN, "arr=%p px=%p\n", arr_x, px);
int n_zeroes = 64 - strlen(arr_x);
for ( int i = 0; i < n_zeroes; i++){
pub_key_x[i] = '0';
}
strncpy(pub_key_x + n_zeroes, arr_x, 1024 - n_zeroes);
char arr_y[mpz_sizeinbase (Pkey->y, base) + 2];
char* py = mpz_get_str(arr_y, base, Pkey->y);
n_zeroes = 64 - strlen(arr_y);
for ( int i = 0; i < n_zeroes; i++){
pub_key_y[i] = '0';
}
strncpy(pub_key_y + n_zeroes, arr_y, 1024 - n_zeroes);
mpz_clear(skey_mpz);
domain_parameters_clear(curve);
point_clear(Pkey);
}
void encrypt_key(int *err_status, char *err_string, char *key,
uint8_t *encrypted_key, uint32_t *enc_len) {
......@@ -381,13 +457,13 @@ void get_public_shares(int *err_status, char* err_string, uint8_t* encrypted_dkg
calc_public_shares(decrypted_dkg_secret, public_shares, _t);
}
void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key,
uint32_t dec_len, unsigned char* hash, char * sig_r, char * sig_s, char* sig_v) {
void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key, uint32_t dec_len,
unsigned char* hash, char * sig_r, char * sig_s, uint8_t* sig_v, int base) {
domain_parameters curve = domain_parameters_init();
domain_parameters_load_curve(curve, secp256k1);
char skey[SGX_ECP256_KEY_SIZE];
char skey[ECDSA_SKEY_LEN];
sgx_status_t status = sgx_unseal_data(
(const sgx_sealed_data_t *)encrypted_key, NULL, 0, skey, &dec_len);
......@@ -397,9 +473,10 @@ void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key,
return;
}
snprintf(err_string, BUF_LEN,"pr key is %s length %d ", skey, strlen(skey));
mpz_t skey_mpz;
mpz_init(skey_mpz);
mpz_set_str(skey_mpz, skey, 10);
mpz_set_str(skey_mpz, skey, ECDSA_SKEY_BASE);
/*mpz_t test_skey;
mpz_init(test_skey);
......@@ -411,10 +488,12 @@ void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key,
mpz_t msg_mpz;
mpz_init(msg_mpz);
mpz_set_str(msg_mpz, skey, 10);
mpz_set_str(msg_mpz, hash, 16);
//mpz_set_str(msg_mpz,"4b688df40bcedbe641ddb16ff0a1842d9c67ea1c3bf63f3e0471baa664531d1a", 16);
signature sign = signature_init();
signature_sign( sign, msg_mpz, skey_mpz, curve);
point Pkey = point_init();
......@@ -426,7 +505,13 @@ void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key,
return;
}
uint8_t base = 16;
//char arr_x[mpz_sizeinbase (Pkey->x, 16) + 2];
//char* px = mpz_get_str(arr_x, 16, Pkey->x);
//snprintf(err_string, BUF_LEN,"pub key x %s ", arr_x);
char arr_m[mpz_sizeinbase (msg_mpz, 16) + 2];
char* msg = mpz_get_str(arr_m, 16, msg_mpz);
snprintf(err_string, BUF_LEN,"message is %s ", arr_m);
char arr_r[mpz_sizeinbase (sign->r, base) + 2];
char* r = mpz_get_str(arr_r, base, sign->r);
......@@ -436,31 +521,13 @@ void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key,
char* s = mpz_get_str(arr_s, base, sign->s);
strncpy(sig_s, arr_s, 1024);
sig_v[0] = '0';
sig_v[1] = 'x';
sig_v[2] = '1';
sig_v[3] = 'b';
mpz_t rem;
mpz_init(rem);
mpz_mod_ui(rem, sign->r, 2);
int r_gr_n = mpz_cmp(sign->r, curve->n);
if (mpz_sgn(rem) && r_gr_n < 0){
sig_v[3] = 'c';
}
else if (mpz_sgn(rem) > 0 && r_gr_n > 0){
sig_v[3] = 'e';
}
else if (mpz_sgn(rem) == 0 && r_gr_n > 0){
sig_v[3] = 'd';
}
*sig_v = sign->v;
mpz_clear(skey_mpz);
mpz_clear(msg_mpz);
mpz_clear(rem);
domain_parameters_clear(curve);
signature_clear(sign);
point_clear(Pkey);
}
......@@ -26,11 +26,18 @@ from "sgx_tsgxssl.edl" import *;
public void generate_ecdsa_key (
[user_check] int *err_status,
[out, count = 1024] char* err_string,
[out, count = 2048] uint8_t* encrypted_key,
[out, count = 1024] uint8_t* encrypted_key,
[user_check] uint32_t *enc_len,
[out, count = 1024] char * pub_key_x,
[out, count = 1024] char * pub_key_y);
public void get_public_ecdsa_key (
[user_check] int *err_status,
[out, count = 1024] char* err_string,
[in, count = 1024] uint8_t* encrypted_key,
uint32_t dec_len,
[out, count = 1024] char * pub_key_x,
[out, count = 1024] char * pub_key_y);
public void encrypt_key (
[user_check] int *err_status,
......@@ -71,7 +78,7 @@ from "sgx_tsgxssl.edl" import *;
public void get_secret_shares (
[user_check] int *err_status,
[out, count = 1024] char* err_string,
[in, count = 2000] uint8_t* decrypted_dkg_secret,
[in, count = 2000] uint8_t* encrypted_dkg_secret,
uint32_t enc_len,
[out, count = 2000] char* secret_shares,
unsigned _t,
......@@ -88,13 +95,14 @@ from "sgx_tsgxssl.edl" import *;
public void ecdsa_sign1(
[user_check] int *err_status,
[out, count = 2048] char* err_string,
[in, count = 2048] uint8_t* encrypted_key,
uint32_t dec_len,
[out, count = 1024] char* err_string,
[in, count = 1024] uint8_t* encrypted_key,
uint32_t enc_len,
[in, count = 1024] unsigned char* hash,
[out, count = 1024] char* sig_r,
[out, count = 1024] char* sig_s,
[out, count = 4] char* sig_v);
[user_check] uint8_t* sig_v,
int base);
};
......
......@@ -16,6 +16,7 @@ signature signature_init()
sig = malloc(sizeof(struct signature_s));
mpz_init(sig->r);
mpz_init(sig->s);
sig->v = 0;
return sig;
}
......@@ -86,27 +87,31 @@ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_para
mpz_t t3;mpz_init(t3);
mpz_t s;mpz_init(s);
unsigned char* rand_char = (unsigned char*)malloc(32);
sgx_read_rand( rand_char, 32);
unsigned char* rand_char = (unsigned char*)malloc(32);
sgx_read_rand( rand_char, 32);
gmp_randstate_t r_state;
signature_sign_start:
//Set k
sgx_read_rand( rand_char, 32);
mpz_t seed;
mpz_init(seed);
mpz_import(seed, 32, 1, sizeof(rand_char[0]), 0, 0, rand_char);
free(rand_char);
sgx_read_rand( rand_char, 32);
mpz_t seed;
mpz_init(seed);
mpz_import(seed, 32, 1, sizeof(rand_char[0]), 0, 0, rand_char);
free(rand_char);
mpz_mod(k, seed, curve->p);
mpz_clear(seed);
mpz_mod(k, seed, curve->p);
mpz_clear(seed);
//mpz_set_str(k, "49a0d7b786ec9cde0d0721d72804befd06571c974b191efb42ecf322ba9ddd9a", 16);
// mpz_set_str(k, "DC87789C4C1A09C97FF4DE72C0D0351F261F10A2B9009C80AEE70DDEC77201A0", 16);
//mpz_set_str(k,"29932781130098090011281004827843485745127563886526054275935615017309884975795",10);
//Calculate x
point_multiplication(Q, k, curve->G, curve);
mpz_set(x, Q->x);
point_clear(Q);
//Calculate r
mpz_mod(r, x, curve->n);
......@@ -116,16 +121,63 @@ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_para
//Calculate s
//s = k¯¹(e+d*r) mod n = (k¯¹ mod n) * ((e+d*r) mod n) mod n
number_theory_inverse(t1, k, curve->n);//t1 = k¯¹ mod n
mpz_mul(t2, private_key, r);//t2 = d*r
//number_theory_inverse(t1, k, curve->n);//t1 = k¯¹ mod n
mpz_invert(t1, k, curve->n);
mpz_mul(t2, private_key, r); //t2 = d*r
mpz_add(t3, message, t2); //t3 = e+t2
mpz_clear(t2);
mpz_init(t2);
mpz_mod(t2, t3, curve->n); //t2 = t3 mod n
mpz_clear(t3);
mpz_init(t3);
mpz_mul(t3, t2, t1); //t3 = t2 * t1
mpz_mod(s, t3, curve->n); //s = t3 mod n
//Calculate v
mpz_t rem;
mpz_init(rem);
mpz_mod_ui(rem, Q->y, 2);
mpz_t s_mul_2;
mpz_init(s_mul_2);
mpz_mul_ui(s_mul_2, s, 2);
unsigned b = 0;
if (mpz_cmp(s_mul_2, curve->n) > 0) {
b = 1;
}
sig->v = mpz_get_ui(rem) ^ b ;
point_clear(Q);
mpz_clear(rem);
mpz_clear(s_mul_2);
mpz_t n_div_2;
mpz_init(n_div_2);
mpz_cdiv_q_ui(n_div_2, curve->n , 2);
if (mpz_cmp(s, n_div_2) > 0) {
mpz_t neg;
mpz_init(neg);
mpz_sub(neg, curve->n, s);
mpz_clear(s);
mpz_init(s);
mpz_set(s, neg);
mpz_clear(neg);
}
mpz_clear(n_div_2);
mpz_clear(t1);
mpz_clear(t2);
mpz_clear(t3);
//Set signature
mpz_set(sig->r, r);
mpz_set(sig->s, s);
......
......@@ -4,6 +4,7 @@ struct signature_s
{
mpz_t r;
mpz_t s;
unsigned int v;
};
typedef struct signature_s* signature;
......
......@@ -50,6 +50,7 @@ int updated;
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "h")) != -1) {
......@@ -68,6 +69,8 @@ int main(int argc, char *argv[]) {
init_all();
while (true) {
sleep(10);
}
......
......@@ -29,6 +29,10 @@
#define DKG_BUFER_LENGTH 1250
#define DKG_MAX_SEALED_LEN 2000
#define ECDSA_SKEY_LEN 65
#define ECDSA_SKEY_BASE 16
#define ECDSA_ENCR_LEN 625
#define UNKNOWN_ERROR -1
#define PLAINTEXT_KEY_TOO_LONG -2
#define UNPADDED_KEY -3
......
......@@ -56,13 +56,24 @@
}
},
{
"name": "getPublicECDSAKey",
"params": {
"keyName": "key1"
},
"returns": {
"status": 0,
"errorMessage": "12345",
"PublicKey": "12345"
}
},
{
"name": "ecdsaSignMessageHash",
"params": {
"keyName": "key1",
"messageHash": "1122334455"
"messageHash": "1122334455",
"base": 10
},
"returns": {
"status": 0,
......
......@@ -58,10 +58,21 @@ class StubClient : public jsonrpc::Client
else
throw jsonrpc::JsonRpcException(jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString());
}
Json::Value ecdsaSignMessageHash(const std::string& keyShareName, const std::string& messageHash) throw (jsonrpc::JsonRpcException)
Json::Value getPublicECDSAKey(const std::string& keyName) throw (jsonrpc::JsonRpcException)
{
Json::Value p;
p["keyShareName"] = keyShareName;
p["keyName"] = keyName;
Json::Value result = this->CallMethod("getPublicECDSAKey",p);
if (result.isObject())
return result;
else
throw jsonrpc::JsonRpcException(jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString());
}
Json::Value ecdsaSignMessageHash(int base, const std::string& keyName, const std::string& messageHash) throw (jsonrpc::JsonRpcException)
{
Json::Value p;
p["base"] = base;
p["keyName"] = keyName;
p["messageHash"] = messageHash;
Json::Value result = this->CallMethod("ecdsaSignMessageHash",p);
if (result.isObject())
......
......@@ -293,6 +293,8 @@ TEST_CASE( "DKG gen test", "[dkg-gen]" ) {
free(errMsg1);
free(encrypted_dkg_secret);
free(secret);
sgx_destroy_enclave(eid);
}
std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char* symbol){
......@@ -316,10 +318,10 @@ std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char*
return tokens;
}
/*TEST_CASE( "DKG auto secret shares test", "[dkg-s_shares]" ) {
init_all();
TEST_CASE( "DKG secret shares test", "[dkg-s_shares]" ) {
//init_all();
init_enclave();
uint8_t* encrypted_dkg_secret = (uint8_t*) calloc(DKG_MAX_SEALED_LEN, 1);
char* errMsg = (char*) calloc(1024,1);
......@@ -328,16 +330,16 @@ std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char*
unsigned t = 3, n = 4;
status = gen_dkg_secret (eid, &err_status, errMsg, encrypted_dkg_secret, &enc_len, 3);
status = gen_dkg_secret (eid, &err_status, errMsg, encrypted_dkg_secret, &enc_len, n);
REQUIRE(status == SGX_SUCCESS);
printf("gen_dkg_secret completed with status: %d %s \n", err_status, errMsg);
printf("\n Length: %d \n", enc_len);
char* errMsg1 = (char*) calloc(1024,1);
char colon = ':';
char* secret_shares = (char*)calloc(DKG_MAX_SEALED_LEN, sizeof(char));
char* secret_shares = (char*)calloc(DKG_MAX_SEALED_LEN, 1);
printf("BEFORE get_secret_shares\n");
status = get_secret_shares(eid, &err_status, errMsg1, encrypted_dkg_secret, enc_len, secret_shares, t, n);
REQUIRE(status == SGX_SUCCESS);
printf("\nget_secret_shares: %d %s \n", err_status, errMsg1);
......@@ -355,25 +357,37 @@ std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char*
std::vector < libff::alt_bn128_Fr> poly = SplitStringToFr((char*)secret, &colon);
std::vector < libff::alt_bn128_Fr> s_shares_dkg = dkg_obj.SecretKeyContribution(SplitStringToFr((char*)secret, &colon));
printf("calculated secret: \n");
for ( int i = 0; i < s_shares_dkg.size(); i++){
libff::alt_bn128_Fr cur_share = s_shares_dkg.at(i);
mpz_t(sshare);
mpz_init(sshare);
cur_share.as_bigint().to_mpz(sshare);
char arr[mpz_sizeinbase (sshare, 10) + 2];
char* share_str = mpz_get_str(arr, 10, sshare);
printf(" %s \n", share_str);
mpz_clear(sshare);
}
REQUIRE(s_shares == s_shares_dkg);
// REQUIRE(s_shares == s_shares_dkg);
free(errMsg);
free(errMsg1);
free(encrypted_dkg_secret);
free(secret_shares);
}*/
sgx_destroy_enclave(eid);
}
TEST_CASE("ECDSA keygen and signature test", "[ecdsa_test]") {
init_all();
init_enclave();
char *errMsg = (char *)calloc(1024, 1);
int err_status = 0;
uint8_t *encr_pr_key = (uint8_t *)calloc(1024, 1);
char *pub_key_x = (char *)calloc(1024, 1);
char *pub_key_y = (char *)calloc(1024, 1);
uint32_t enc_len = 0;
......@@ -384,26 +398,107 @@ TEST_CASE("ECDSA keygen and signature test", "[ecdsa_test]") {
printf("\nerrMsg %s\n", errMsg );
REQUIRE(status == SGX_SUCCESS);
printf("\npub_key_x %s: \n", pub_key_x);
printf("\npub_key_y %s: \n", pub_key_y);
printf("\nencr priv_key %s: \n");
printf("\nwas pub_key_x %s: \n", pub_key_x);
printf("\nwas pub_key_y %s: \n", pub_key_y);
/*printf("\nencr priv_key : \n");
for ( int i = 0; i < 1024 ; i++)
printf("%u ", encr_pr_key[i]);
printf("%u ", encr_pr_key[i]);*/
char* hex = "38433e5ce087dcc1be82fcc834eae83c256b3db87d34f84440d0b708daa0c6f7";
// char* hex = "4b688df40bcedbe641ddb16ff0a1842d9c67ea1c3bf63f3e0471baa664531d1a";
char* hex = "0x09c6137b97cdf159b9950f1492ee059d1e2b10eaf7d51f3a97d61f2eee2e81db";
printf("hash length %d ", strlen(hex));
char* signature_r = (char *)calloc(1024, 1);
char* signature_s = (char *)calloc(1024, 1);
char* signature_v = (char*)calloc(4,1);
uint8_t signature_v = 0;
status = ecdsa_sign1(eid, &err_status, errMsg, encr_pr_key, enc_len, (unsigned char*)hex, signature_r, signature_s, signature_v );
status = ecdsa_sign1(eid, &err_status, errMsg, encr_pr_key, enc_len, (unsigned char*)hex, signature_r, signature_s, &signature_v, 16);
REQUIRE(status == SGX_SUCCESS);
printf("\nsignature r : %s ", signature_r);
printf("\nsignature s: %s ", signature_s);
printf("\nsignature v: %s ", signature_v);
printf("\nsignature v: %u ", signature_v);
printf("\n %s \n", errMsg);
free(errMsg);
sgx_destroy_enclave(eid);
printf("the end of ecdsa test\n");
}
TEST_CASE("Test test", "[test_test]") {
init_enclave();
char *errMsg = (char *)calloc(1024, 1);
int err_status = 0;
uint8_t *encr_pr_key = (uint8_t *)calloc(1024, 1);
char *pub_key_x = (char *)calloc(1024, 1);
char *pub_key_y = (char *)calloc(1024, 1);
uint32_t enc_len = 0;
status = generate_ecdsa_key(eid, &err_status, errMsg, encr_pr_key, &enc_len, pub_key_x, pub_key_y );
//printf("\nerrMsg %s\n", errMsg );
REQUIRE(status == SGX_SUCCESS);
//printf("\nwas pub_key_x %s: \n", pub_key_x);
//printf("\nwas pub_key_y %s: \n", pub_key_y);
//printf("\nencr priv_key %s: \n");
//for ( int i = 0; i < 1024 ; i++)
// printf("%u ", encr_pr_key[i]);
//printf( "haha");
//free(errMsg);
sgx_destroy_enclave(eid);
}
TEST_CASE("get public ECDSA key", "[get_pub_ecdsa_key_test]") {
//init_all();
init_enclave();
char *errMsg = (char *)calloc(1024, 1);
int err_status = 0;
uint8_t *encr_pr_key = (uint8_t *)calloc(1024, 1);
char *pub_key_x = (char *)calloc(1024, 1);
char *pub_key_y = (char *)calloc(1024, 1);
uint32_t enc_len = 0;
//printf("before %p\n", pub_key_x);
status = generate_ecdsa_key(eid, &err_status, errMsg, encr_pr_key, &enc_len, pub_key_x, pub_key_y );
printf("\nerrMsg %s\n", errMsg );
REQUIRE(status == SGX_SUCCESS);
printf("\nwas pub_key_x %s length %d: \n", pub_key_x, strlen(pub_key_x));
printf("\nwas pub_key_y %s length %d: \n", pub_key_y, strlen(pub_key_y));
/*printf("\nencr priv_key %s: \n");
for ( int i = 0; i < 1024 ; i++)
printf("%u ", encr_pr_key[i]);*/
char *got_pub_key_x = (char *)calloc(1024, 1);
char *got_pub_key_y = (char *)calloc(1024, 1);
status = get_public_ecdsa_key(eid, &err_status, errMsg, encr_pr_key, enc_len, got_pub_key_x, got_pub_key_y);
REQUIRE(status == SGX_SUCCESS);
printf("\nnow pub_key_x %s: \n", got_pub_key_x);
printf("\nnow pub_key_y %s: \n", got_pub_key_y);
printf("\n pr key %s \n", errMsg);
free(errMsg);
sgx_destroy_enclave(eid);
}
#include "stubclient.h"
......@@ -427,12 +522,11 @@ TEST_CASE("API test", "[api_test]") {
cerr << "Client inited" << endl;
try {
//cout << c.generateECDSAKey("test_key") << endl;
cout << c.ecdsaSignMessageHash("test_key","38433e5ce087dcc1be82fcc834eae83c256b3db87d34f84440d0b708daa0c6f7" );
// cout << c.generateECDSAKey("known_key1") << endl;
//cout<<c.getPublicECDSAKey("test_key");
cout << c.ecdsaSignMessageHash(16, "known_key1","0x09c6137b97cdf159b9950f1492ee059d1e2b10eaf7d51f3a97d61f2eee2e81db" );
} catch (JsonRpcException &e) {
cerr << e.what() << endl;
}
}
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