Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
sgxwallet
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
董子豪
sgxwallet
Commits
913ba03c
Unverified
Commit
913ba03c
authored
Sep 30, 2019
by
svetaro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SKALE-1594 Correct v calculation.Add leading zeroes to public key
parent
c58207e0
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
89 additions
and
61 deletions
+89
-61
ECDSACrypto.cpp
ECDSACrypto.cpp
+4
-1
ECDSACrypto.h
ECDSACrypto.h
+1
-0
SGXWalletServer.cpp
SGXWalletServer.cpp
+11
-2
DKGUtils.cpp
secure_enclave/DKGUtils.cpp
+3
-3
secure_enclave.c
secure_enclave/secure_enclave.c
+26
-25
secure_enclave.edl
secure_enclave/secure_enclave.edl
+2
-2
signature.c
secure_enclave/signature.c
+29
-5
signature.h
secure_enclave/signature.h
+1
-0
testw.cpp
testw.cpp
+12
-23
No files found.
ECDSACrypto.cpp
View file @
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
;
...
...
@@ -70,9 +71,11 @@ std::vector<std::string> ecdsa_sign_hash(const char* encryptedKeyHex, const char
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
);
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
;
...
...
ECDSACrypto.h
View file @
913ba03c
...
...
@@ -22,4 +22,5 @@ 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
SGXWalletServer.cpp
View file @
913ba03c
...
...
@@ -185,11 +185,19 @@ Json::Value ecdsaSignMessageHashImpl(int base, const std::string &_keyName, cons
result
[
"signature_s"
]
=
""
;
std
::
vector
<
std
::
string
>
sign_vect
(
3
);
std
::
cerr
<<
"entered ecdsaSignMessageHashImpl"
<<
std
::
endl
;
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
);
// std::cerr << "read encr key" << *key_ptr << std::endl;
sign_vect
=
ecdsa_sign_hash
(
key_ptr
->
c_str
(),
message
Hash
.
c_str
(),
base
);
sign_vect
=
ecdsa_sign_hash
(
key_ptr
->
c_str
(),
cut
Hash
.
c_str
(),
base
);
}
catch
(
RPCException
&
_e
)
{
std
::
cerr
<<
"err str "
<<
_e
.
errString
<<
std
::
endl
;
result
[
"status"
]
=
_e
.
status
;
...
...
@@ -240,6 +248,7 @@ Json::Value SGXWalletServer::getPublicECDSAKey(const std::string &_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
);
}
...
...
secure_enclave/DKGUtils.cpp
View file @
913ba03c
...
...
@@ -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
,
...
...
secure_enclave/secure_enclave.c
View file @
913ba03c
...
...
@@ -164,14 +164,21 @@ void generate_ecdsa_key(int *err_status, char *err_string,
//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);
strncpy
(
pub_key_x
,
arr_x
,
1024
);
//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
);
strncpy
(
pub_key_y
,
arr_y
,
1024
);
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
));
...
...
@@ -210,7 +217,7 @@ void get_public_ecdsa_key(int *err_status, char *err_string,
return
;
}
strncpy
(
err_string
,
skey
,
1024
);
//
strncpy(err_string, skey, 1024);
mpz_t
skey_mpz
;
mpz_init
(
skey_mpz
);
...
...
@@ -238,11 +245,20 @@ void get_public_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
);
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
);
...
...
@@ -442,7 +458,7 @@ void get_public_shares(int *err_status, char* err_string, uint8_t* encrypted_dkg
}
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
)
{
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
);
...
...
@@ -477,6 +493,7 @@ void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key, uint
signature
sign
=
signature_init
();
signature_sign
(
sign
,
msg_mpz
,
skey_mpz
,
curve
);
point
Pkey
=
point_init
();
...
...
@@ -504,26 +521,10 @@ void ecdsa_sign1(int *err_status, char *err_string, uint8_t *encrypted_key, uint
char
*
s
=
mpz_get_str
(
arr_s
,
base
,
sign
->
s
);
strncpy
(
sig_s
,
arr_s
,
1024
);
sig_v
=
0
;
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
=
1
;
}
else
if
(
mpz_sgn
(
rem
)
>
0
&&
r_gr_n
>
0
){
sig_v
=
3
;
}
else
if
(
mpz_sgn
(
rem
)
==
0
&&
r_gr_n
>
0
){
sig_v
=
2
;
}
*
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
);
...
...
secure_enclave/secure_enclave.edl
View file @
913ba03c
...
...
@@ -78,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*
de
crypted_dkg_secret,
[in, count = 2000] uint8_t*
en
crypted_dkg_secret,
uint32_t enc_len,
[out, count = 2000] char* secret_shares,
unsigned _t,
...
...
@@ -101,7 +101,7 @@ from "sgx_tsgxssl.edl" import *;
[in, count = 1024] unsigned char* hash,
[out, count = 1024] char* sig_r,
[out, count = 1024] char* sig_s,
uint8_t
sig_v,
[user_check] uint8_t*
sig_v,
int base);
};
...
...
secure_enclave/signature.c
View file @
913ba03c
...
...
@@ -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
;
}
...
...
@@ -106,11 +107,11 @@ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_para
//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
);
...
...
@@ -131,10 +132,32 @@ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_para
mpz_init
(
t3
);
mpz_mul
(
t3
,
t2
,
t1
);
//t3 = t2 * t1
mpz_mod
(
s
,
t3
,
curve
->
n
);
//s = t3 mod n
/*
mpz_t n_div_2;
//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
+ 1
, 2);
mpz_cdiv_q_ui
(
n_div_2
,
curve
->
n
,
2
);
if
(
mpz_cmp
(
s
,
n_div_2
)
>
0
)
{
mpz_t
neg
;
...
...
@@ -148,12 +171,13 @@ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_para
mpz_clear
(
neg
);
}
mpz_clear(n_div_2);
*/
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
);
...
...
secure_enclave/signature.h
View file @
913ba03c
...
...
@@ -4,6 +4,7 @@ struct signature_s
{
mpz_t
r
;
mpz_t
s
;
unsigned
int
v
;
};
typedef
struct
signature_s
*
signature
;
...
...
testw.cpp
View file @
913ba03c
...
...
@@ -318,7 +318,7 @@ std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char*
return
tokens
;
}
TEST_CASE
(
"DKG
auto
secret shares test"
,
"[dkg-s_shares]"
)
{
TEST_CASE
(
"DKG secret shares test"
,
"[dkg-s_shares]"
)
{
//init_all();
init_enclave
();
...
...
@@ -330,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
(
"
\n
get_secret_shares: %d %s
\n
"
,
err_status
,
errMsg1
);
...
...
@@ -380,7 +380,6 @@ std::vector<libff::alt_bn128_Fr> SplitStringToFr(const char* koefs, const char*
}
TEST_CASE
(
"ECDSA keygen and signature test"
,
"[ecdsa_test]"
)
{
init_enclave
();
...
...
@@ -406,12 +405,13 @@ TEST_CASE("ECDSA keygen and signature test", "[ecdsa_test]") {
printf("%u ", encr_pr_key[i]);*/
// char* hex = "4b688df40bcedbe641ddb16ff0a1842d9c67ea1c3bf63f3e0471baa664531d1a";
char
*
hex
=
"3F891FDA3704F0368DAB65FA81EBE616F4AA2A0854995DA4DC0B59D2CADBD64F"
;
char
*
hex
=
"0x09c6137b97cdf159b9950f1492ee059d1e2b10eaf7d51f3a97d61f2eee2e81db"
;
printf
(
"hash length %d "
,
strlen
(
hex
));
char
*
signature_r
=
(
char
*
)
calloc
(
1024
,
1
);
char
*
signature_s
=
(
char
*
)
calloc
(
1024
,
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
,
16
);
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
(
"
\n
signature r : %s "
,
signature_r
);
printf
(
"
\n
signature s: %s "
,
signature_s
);
...
...
@@ -481,8 +481,9 @@ TEST_CASE("get public ECDSA key", "[get_pub_ecdsa_key_test]") {
printf
(
"
\n
errMsg %s
\n
"
,
errMsg
);
REQUIRE
(
status
==
SGX_SUCCESS
);
printf
(
"
\n
was pub_key_x %s:
\n
"
,
pub_key_x
);
printf
(
"
\n
was pub_key_y %s:
\n
"
,
pub_key_y
);
printf
(
"
\n
was pub_key_x %s length %d:
\n
"
,
pub_key_x
,
strlen
(
pub_key_x
));
printf
(
"
\n
was 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]);*/
...
...
@@ -521,23 +522,11 @@ TEST_CASE("API test", "[api_test]") {
cerr
<<
"Client inited"
<<
endl
;
try
{
cout
<<
c
.
generateECDSAKey
(
"known_key1"
)
<<
endl
;
//
cout << c.generateECDSAKey("known_key1") << endl;
//cout<<c.getPublicECDSAKey("test_key");
//cout << c.ecdsaSignMessageHash(16, "known_key1","3F891FDA3704F0368DAB65FA81EBE616F4AA2A0854995DA4DC0B59D2CADBD64F
" );
cout
<<
c
.
ecdsaSignMessageHash
(
16
,
"known_key1"
,
"0x09c6137b97cdf159b9950f1492ee059d1e2b10eaf7d51f3a97d61f2eee2e81db
"
);
}
catch
(
JsonRpcException
&
e
)
{
cerr
<<
e
.
what
()
<<
endl
;
}
}
TEST_CASE
(
"bytes to hex test"
,
"[bytes_to_hex_test]"
)
{
char
kavun
[]
=
{
'a'
,
'b'
,
'c'
,
'd'
};
uint8_t
raw_kavun
[
3
];
uint64_t
n
=
0
;
hex2carray
(
kavun
,
&
n
,
raw_kavun
);
char
new_kavun
[
10
];
carray2Hex
(
raw_kavun
,
5
,
new_kavun
);
std
::
cerr
<<
" got kavun "
<<
new_kavun
<<
std
::
endl
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment