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
eb8325c2
Unverified
Commit
eb8325c2
authored
Oct 02, 2019
by
svetaro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SKALE-1512 Merge
parent
d92bb2eb
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
1001 additions
and
138 deletions
+1001
-138
Makefile.am
Makefile.am
+12
-4
DKGUtils.cpp
secure_enclave/DKGUtils.cpp
+11
-9
Makefile.am
secure_enclave/Makefile.am
+2
-1
Makefile.in
secure_enclave/Makefile.in
+35
-10
drive_key_dkg.c
secure_enclave/drive_key_dkg.c
+44
-0
drive_key_dkg.h
secure_enclave/drive_key_dkg.h
+12
-0
secure_enclave.c
secure_enclave/secure_enclave.c
+267
-83
secure_enclave.edl
secure_enclave/secure_enclave.edl
+34
-11
signature.c
secure_enclave/signature.c
+258
-0
testw.cpp
testw.cpp
+315
-20
alt_bn128_init.cpp
...d_libff/libff/algebra/curves/alt_bn128/alt_bn128_init.cpp
+11
-0
No files found.
Makefile.am
View file @
eb8325c2
...
...
@@ -65,7 +65,8 @@ bin_PROGRAMS = sgxwallet testw
COMMON_SRC
=
sgx_stub.c sgx_detect_linux.c create_enclave.c oc_alloc.c
COMMON_ENCLAVE_SRC
=
secure_enclave_u.c secure_enclave_u.h
sgxwallet_SOURCES
=
sgxwallet.c SGXWalletServer.cpp RPCException.cpp BLSCrypto.cpp ServerInit.cpp BLSPrivateKeyShareSGX.cpp LevelDB.cpp
$(COMMON_SRC)
sgxwallet_SOURCES
=
sgxwallet.c SGXWalletServer.cpp RPCException.cpp BLSCrypto.cpp ECDSACrypto.cpp ServerInit.cpp BLSPrivateKeyShareSGX.cpp LevelDB.cpp
$(COMMON_SRC)
nodist_sgxwallet_SOURCES
=
$(COMMON_ENCLAVE_SRC)
EXTRA_sgxwallet_DEPENDENCIES
=
secure_enclave.signed.so
...
...
@@ -88,9 +89,16 @@ secure_enclave.signed.so: secure_enclave/secure_enclave.signed.so
## Use the variables, not the actual library names to ensure these
## targets work on simulation builds.
sgxwallet_LDADD
=
-l
$(SGX_URTS_LIB)
-Lleveldb
/build
-LlibBLS
/build
-LlibBLS
/build/libff/libff
-l
:libbls.a
-l
:libleveldb.a
-l
:libff.a
-lgmp
-ldl
-l
:libsgx_capable.a
-l
:libsgx_tprotected_fs.a
-ljsonrpccpp-stub
-lpthread
-ljsonrpccpp-common
-ljsonrpccpp-server
-ljsoncpp
-lprocps
sgxwallet_LDADD
=
-l
$(SGX_URTS_LIB)
-Lleveldb
/build
-LlibBLS
/build
-LlibBLS
/build/libff/libff
-l
:libbls.a
-l
:libleveldb.a
\
-l
:libff.a
-lgmp
-ldl
-l
:libsgx_capable.a
-l
:libsgx_tprotected_fs.a
-ljsonrpccpp-stub
-lpthread
-ljsonrpccpp-common
\
-ljsonrpccpp-server
-ljsonrpccpp-client
-ljsoncpp
-lcurl
-lprocps
intel-sgx-ssl/Linux/package/lib64/libsgx_usgxssl.a
\
intel-sgx-ssl/Linux/package/lib64/libsgx_tsgxssl_crypto.a
testw_SOURCES
=
testw.cpp SGXWalletServer.cpp RPCException.cpp BLSCrypto.cpp ServerInit.cpp LevelDB.cpp BLSPrivateKeyShareSGX.cpp
$(COMMON_SRC)
testw_SOURCES
=
testw.cpp stubclient.cpp SGXWalletServer.cpp RPCException.cpp BLSCrypto.cpp ServerInit.cpp LevelDB.cpp
\
BLSPrivateKeyShareSGX.cpp ECDSACrypto.cpp
$(COMMON_SRC)
nodist_testw_SOURCES
=
${
nodist_sgxwallet_SOURCES
}
EXTRA_testw_DEPENDENCIES
=
${
EXTRA_sgxwallet_DEPENDENCIES
}
testw_LDADD
=
${
sgxwallet_LDADD
}
\ No newline at end of file
testw_LDADD
=
${
sgxwallet_LDADD
}
secure_enclave/DKGUtils.cpp
View file @
eb8325c2
...
...
@@ -47,9 +47,10 @@ std::string ConvertToString(T field_elem) {
return
output
;
}
std
::
vector
<
libff
::
alt_bn128_Fr
>
SplitStringToFr
(
const
char
*
koefs
,
const
char
*
symbol
){
std
::
vector
<
libff
::
alt_bn128_Fr
>
SplitStringToFr
(
const
char
*
koefs
,
const
char
symbol
){
std
::
string
str
(
koefs
);
std
::
string
delim
(
symbol
);
std
::
string
delim
;
delim
.
push_back
(
symbol
);
std
::
vector
<
libff
::
alt_bn128_Fr
>
tokens
;
size_t
prev
=
0
,
pos
=
0
;
do
...
...
@@ -90,7 +91,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
;
...
...
@@ -104,13 +105,13 @@ void calc_secret_shares(const char* decrypted_koefs, char * secret_shares,
// calculate for each node a list of secret values that will be used for verification
std
::
string
result
;
char
symbol
=
':'
;
std
::
vector
<
libff
::
alt_bn128_Fr
>
poly
=
SplitStringToFr
(
decrypted_koefs
,
&
symbol
);
for
(
size_t
i
=
0
;
i
<
_n
;
++
i
)
{
std
::
vector
<
libff
::
alt_bn128_Fr
>
poly
=
SplitStringToFr
(
decrypted_koefs
,
symbol
);
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
+=
ConvertToString
(
secret_share
);
//
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
,
...
...
@@ -118,9 +119,10 @@ void calc_public_shares(const char* decrypted_koefs, char * public_shares,
// calculate for each node a list of public shares
std
::
string
result
;
char
symbol
=
':'
;
std
::
vector
<
libff
::
alt_bn128_Fr
>
poly
=
SplitStringToFr
(
decrypted_koefs
,
&
symbol
);
std
::
vector
<
libff
::
alt_bn128_Fr
>
poly
=
SplitStringToFr
(
decrypted_koefs
,
symbol
);
libff
::
alt_bn128_Fr
three
=
3
;
for
(
size_t
i
=
0
;
i
<
_t
;
++
i
)
{
libff
::
alt_bn128_G2
pub_share
=
poly
.
at
(
i
)
*
libff
::
alt_bn128_G2
::
one
()
;
libff
::
alt_bn128_G2
pub_share
=
poly
.
at
(
i
)
*
libff
::
alt_bn128_G2
::
one
()
;
pub_share
.
to_affine_coordinates
();
result
+=
ConvertToString
(
pub_share
.
X
.
c0
);
result
+=
":"
;
...
...
secure_enclave/Makefile.am
View file @
eb8325c2
...
...
@@ -85,7 +85,8 @@ CLEANFILES+= secure_enclave_t.c secure_enclave_t.h
secure_enclave_SOURCES
=
secure_enclave_t.c secure_enclave_t.h
\
secure_enclave.c
\
DKGUtils.cpp BLSUtils.cpp ../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_init.cpp
\
curves.c domain_parameters.c numbertheory.c point.c signature.c drive_key_dkg.c
\
DKGUtils.cpp BLSEnclave.cpp ../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_init.cpp
\
../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_g2.cpp
\
../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_g1.cpp
$(ENCLAVE_KEY)
$(ENCLAVE_CONFIG)
...
...
secure_enclave/Makefile.in
View file @
eb8325c2
...
...
@@ -107,7 +107,10 @@ am__installdirs = "$(DESTDIR)$(libexecdir)"
PROGRAMS
=
$(libexec_PROGRAMS)
am__objects_1
=
am_secure_enclave_OBJECTS
=
secure_enclave_t.
$(OBJEXT)
\
secure_enclave.
$(OBJEXT)
DKGUtils.
$(OBJEXT)
BLSUtils.
$(OBJEXT)
\
secure_enclave.
$(OBJEXT)
curves.
$(OBJEXT)
\
domain_parameters.
$(OBJEXT)
numbertheory.
$(OBJEXT)
\
point.
$(OBJEXT)
signature.
$(OBJEXT)
drive_key_dkg.
$(OBJEXT)
\
DKGUtils.
$(OBJEXT)
BLSEnclave.
$(OBJEXT)
\
alt_bn128_init.
$(OBJEXT)
alt_bn128_g2.
$(OBJEXT)
\
alt_bn128_g1.
$(OBJEXT)
$(am__objects_1)
$(am__objects_1)
secure_enclave_OBJECTS
=
$(am_secure_enclave_OBJECTS)
...
...
@@ -135,10 +138,13 @@ am__v_at_1 =
DEFAULT_INCLUDES
=
-I
.@am__isrc@
depcomp
=
$(SHELL)
$(top_srcdir)
/depcomp
am__maybe_remake_depfiles
=
depfiles
am__depfiles_remade
=
./
$(DEPDIR)
/BLSUtils.Po ./
$(DEPDIR)
/DKGUtils.Po
\
./
$(DEPDIR)
/alt_bn128_g1.Po ./
$(DEPDIR)
/alt_bn128_g2.Po
\
./
$(DEPDIR)
/alt_bn128_init.Po ./
$(DEPDIR)
/secure_enclave.Po
\
./
$(DEPDIR)
/secure_enclave_t.Po
\
am__depfiles_remade
=
./
$(DEPDIR)
/BLSEnclave.Po
\
./
$(DEPDIR)
/DKGUtils.Po ./
$(DEPDIR)
/alt_bn128_g1.Po
\
./
$(DEPDIR)
/alt_bn128_g2.Po ./
$(DEPDIR)
/alt_bn128_init.Po
\
./
$(DEPDIR)
/curves.Po ./
$(DEPDIR)
/domain_parameters.Po
\
./
$(DEPDIR)
/drive_key_dkg.Po ./
$(DEPDIR)
/numbertheory.Po
\
./
$(DEPDIR)
/point.Po ./
$(DEPDIR)
/secure_enclave.Po
\
./
$(DEPDIR)
/secure_enclave_t.Po ./
$(DEPDIR)
/signature.Po
\
./
$(DEPDIR)
/signed_enclave_debug.Po
\
./
$(DEPDIR)
/signed_enclave_rel.Po
am__mv
=
mv
-f
...
...
@@ -338,7 +344,8 @@ ENCLAVE_CONFIG = $(ENCLAVE).config.xml
ENCLAVE_KEY
=
$(ENCLAVE)
_private.pem
secure_enclave_SOURCES
=
secure_enclave_t.c secure_enclave_t.h
\
secure_enclave.c
\
DKGUtils.cpp BLSUtils.cpp ../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_init.cpp
\
curves.c domain_parameters.c numbertheory.c point.c signature.c drive_key_dkg.c
\
DKGUtils.cpp BLSEnclave.cpp ../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_init.cpp
\
../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_g2.cpp
\
../trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_g1.cpp
$(ENCLAVE_KEY)
$(ENCLAVE_CONFIG)
...
...
@@ -431,13 +438,19 @@ mostlyclean-compile:
distclean-compile
:
-
rm
-f
*
.tab.c
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/BLS
Utils
.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/BLS
Enclave
.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/DKGUtils.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/alt_bn128_g1.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/alt_bn128_g2.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/alt_bn128_init.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/curves.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/domain_parameters.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/drive_key_dkg.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/numbertheory.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/point.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/secure_enclave.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/secure_enclave_t.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/signature.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/signed_enclave_debug.Po@am__quote@
# am--include-marker
@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/signed_enclave_rel.Po@am__quote@
# am--include-marker
...
...
@@ -645,13 +658,19 @@ clean: clean-am
clean-am
:
clean-generic clean-libexecPROGRAMS mostlyclean-am
distclean
:
distclean-am
-
rm
-f
./
$(DEPDIR)
/BLS
Utils
.Po
-
rm
-f
./
$(DEPDIR)
/BLS
Enclave
.Po
-
rm
-f
./
$(DEPDIR)
/DKGUtils.Po
-
rm
-f
./
$(DEPDIR)
/alt_bn128_g1.Po
-
rm
-f
./
$(DEPDIR)
/alt_bn128_g2.Po
-
rm
-f
./
$(DEPDIR)
/alt_bn128_init.Po
-
rm
-f
./
$(DEPDIR)
/curves.Po
-
rm
-f
./
$(DEPDIR)
/domain_parameters.Po
-
rm
-f
./
$(DEPDIR)
/drive_key_dkg.Po
-
rm
-f
./
$(DEPDIR)
/numbertheory.Po
-
rm
-f
./
$(DEPDIR)
/point.Po
-
rm
-f
./
$(DEPDIR)
/secure_enclave.Po
-
rm
-f
./
$(DEPDIR)
/secure_enclave_t.Po
-
rm
-f
./
$(DEPDIR)
/signature.Po
-
rm
-f
./
$(DEPDIR)
/signed_enclave_debug.Po
-
rm
-f
./
$(DEPDIR)
/signed_enclave_rel.Po
-
rm
-f
Makefile
...
...
@@ -699,13 +718,19 @@ install-ps-am:
installcheck-am
:
maintainer-clean
:
maintainer-clean-am
-
rm
-f
./
$(DEPDIR)
/BLS
Utils
.Po
-
rm
-f
./
$(DEPDIR)
/BLS
Enclave
.Po
-
rm
-f
./
$(DEPDIR)
/DKGUtils.Po
-
rm
-f
./
$(DEPDIR)
/alt_bn128_g1.Po
-
rm
-f
./
$(DEPDIR)
/alt_bn128_g2.Po
-
rm
-f
./
$(DEPDIR)
/alt_bn128_init.Po
-
rm
-f
./
$(DEPDIR)
/curves.Po
-
rm
-f
./
$(DEPDIR)
/domain_parameters.Po
-
rm
-f
./
$(DEPDIR)
/drive_key_dkg.Po
-
rm
-f
./
$(DEPDIR)
/numbertheory.Po
-
rm
-f
./
$(DEPDIR)
/point.Po
-
rm
-f
./
$(DEPDIR)
/secure_enclave.Po
-
rm
-f
./
$(DEPDIR)
/secure_enclave_t.Po
-
rm
-f
./
$(DEPDIR)
/signature.Po
-
rm
-f
./
$(DEPDIR)
/signed_enclave_debug.Po
-
rm
-f
./
$(DEPDIR)
/signed_enclave_rel.Po
-
rm
-f
Makefile
...
...
@@ -745,7 +770,7 @@ uninstall-am: uninstall-libexecPROGRAMS
%_t.h %_t.c
:
%.edl
$(SGX_EDGER8R)
--search-path
$(SGXSDK_INCDIR)
$(SGX_EDGER8R_FLAGS)
--trusted
$<
$(SGX_EDGER8R)
--search-path
$(SGXSDK_INCDIR)
:
${
PWD
}
/../intel-sgx-ssl/Linux/package/include
$(SGX_EDGER8R_FLAGS)
--trusted
$<
@ENCLAVE_RELEASE_SIGN_TRUE@.PHONY
:
signed_enclave_rel
@ENCLAVE_RELEASE_SIGN_FALSE@.PHONY
:
signed_enclave_debug
...
...
secure_enclave/drive_key_dkg.c
0 → 100644
View file @
eb8325c2
//
// Created by kladko on 10/1/19.
//
#include <stdlib.h>
#include <../tgmp-build/include/sgx_tgmp.h>
#include <stdbool.h>
#include "domain_parameters.h"
#include "curves.h"
#include "point.h"
#include "numbertheory.h"
void
gen_session_keys
(
mpz_t
skey
,
char
*
pb_key
){
domain_parameters
curve
=
domain_parameters_init
();
domain_parameters_load_curve
(
curve
,
secp256k1
);
unsigned
char
*
rand_char
=
(
unsigned
char
*
)
malloc
(
32
);
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_t
skey_mpz
;
mpz_init
(
skey_mpz
);
mpz_mod
(
skey_mpz
,
seed
,
curve
->
p
);
mpz_clear
(
seed
);
char
arr
[
mpz_sizeinbase
(
skey_mpz
,
16
)
+
2
];
char
*
sk
=
mpz_get_str
(
arr
,
16
,
skey_mpz
);
// memcpy(skey, arr, 32);
// strncpy(skey, arr, 1024);
mpz_set
(
skey
,
skey_mpz
);
point
pub_key
=
point_init
();
point_multiplication
(
pub_key
,
skey
,
curve
->
G
,
curve
);
mpz_clear
(
skey_mpz
);
point_clear
(
pub_key
);
domain_parameters_clear
(
curve
);
}
\ No newline at end of file
secure_enclave/drive_key_dkg.h
0 → 100644
View file @
eb8325c2
//
// Created by kladko on 10/1/19.
//
#ifndef SGXD_DRIVE_KEY_DKG_H
#define SGXD_DRIVE_KEY_DKG_H
void
gen_session_keys
(
mpz_t
skey
,
char
*
pub_key
);
#endif //SGXD_DRIVE_KEY_DKG_H
secure_enclave/secure_enclave.c
View file @
eb8325c2
This diff is collapsed.
Click to expand it.
secure_enclave/secure_enclave.edl
View file @
eb8325c2
enclave {
from "sgx_tsgxssl.edl" import *;
trusted {
include "sgx_tgmp.h"
...
...
@@ -24,8 +26,18 @@ enclave {
public void generate_ecdsa_key (
[user_check] int *err_status,
[out, count = 1024] char* err_string,
[out, count = 1024] uint8_t* encrypted_key, [user_check] uint32_t *enc_len);
[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,
...
...
@@ -49,14 +61,6 @@ enclave {
[in, count = 1024] char* hashY ,
[out, count = 1024] char* signature);
public void ecdsa_sign_message (
[user_check] int *err_status,
[out, count = 1024] char* err_string,
[in, count = 1024] uint8_t* encrypted_key,
uint32_t enc_len,
[in, count = 1024] uint8_t* hash,
[out, count = 1024] char* signature);
public void gen_dkg_secret (
[user_check] int *err_status,
[out, count = 1024] char* err_string,
...
...
@@ -74,7 +78,7 @@ enclave {
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,
...
...
@@ -88,6 +92,25 @@ enclave {
[out, count = 4000] char* public_shares,
unsigned _t,
unsigned _n);
public void ecdsa_sign1(
[user_check] int *err_status,
[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,
[user_check] uint8_t* sig_v,
int base);
public void drive_key(
[user_check]int *err_status,
[out, count = 1024] char *err_string,
[out, count = 1024] uint8_t *encrypted_skey,
[user_check]uint32_t* enc_len,
[out, count = 1024] char* result_str,
[out, count = 1024] char* pub_keyB );
};
...
...
secure_enclave/signature.c
0 → 100644
View file @
eb8325c2
#include <stdlib.h>
#include <stdio.h>
#include <../tgmp-build/include/sgx_tgmp.h>
#include <stdbool.h>
#include <assert.h>
#include "domain_parameters.h"
#include "point.h"
#include "signature.h"
#include "numbertheory.h"
/*Initialize a signature*/
signature
signature_init
()
{
signature
sig
;
sig
=
malloc
(
sizeof
(
struct
signature_s
));
mpz_init
(
sig
->
r
);
mpz_init
(
sig
->
s
);
sig
->
v
=
0
;
return
sig
;
}
/*Print signature to standart output stream*/
void
signature_print
(
signature
sig
)
{
/*printf("\nSignature (r,s): \n\t(");
mpz_out_str(stdout, 10, sig->r);
printf(",\n\t");
mpz_out_str(stdout, 10, sig->s);
printf(")\n");*/
}
/*Set signature from strings of a base from 2-62*/
void
signature_set_str
(
signature
sig
,
char
*
r
,
char
*
s
,
int
base
)
{
mpz_set_str
(
sig
->
r
,
r
,
base
);
mpz_set_str
(
sig
->
s
,
s
,
base
);
}
/*Set signature from hexadecimal strings*/
void
signature_set_hex
(
signature
sig
,
char
*
r
,
char
*
s
)
{
signature_set_str
(
sig
,
r
,
s
,
16
);
}
/*Set signature from decimal unsigned long ints*/
void
signature_set_ui
(
signature
sig
,
unsigned
long
int
r
,
unsigned
long
int
s
)
{
mpz_set_ui
(
sig
->
r
,
r
);
mpz_set_ui
(
sig
->
s
,
s
);
}
/*Make R a copy of P*/
void
signature_copy
(
signature
R
,
signature
sig
)
{
mpz_set
(
R
->
r
,
sig
->
r
);
mpz_set
(
R
->
s
,
sig
->
s
);
}
/*Compare two signatures return 1 if not the same, returns 0 if they are the same*/
bool
signature_cmp
(
signature
sig1
,
signature
sig2
)
{
return
!
mpz_cmp
(
sig1
->
r
,
sig2
->
r
)
&&
!
mpz_cmp
(
sig1
->
s
,
sig2
->
s
);
}
/*Generates a public key for a private key*/
void
signature_generate_key
(
point
public_key
,
mpz_t
private_key
,
domain_parameters
curve
)
{
point_multiplication
(
public_key
,
private_key
,
curve
->
G
,
curve
);
}
/*Generate signature for a message*/
void
signature_sign
(
signature
sig
,
mpz_t
message
,
mpz_t
private_key
,
domain_parameters
curve
)
{
//message must not have a bit length longer than that of n
//see: Guide to Elliptic Curve Cryptography, section 4.4.1.
assert
(
mpz_sizeinbase
(
message
,
2
)
<=
mpz_sizeinbase
(
curve
->
n
,
2
));
//Initializing variables
mpz_t
k
;
mpz_init
(
k
);
mpz_t
x
;
mpz_init
(
x
);
point
Q
=
point_init
();
mpz_t
r
;
mpz_init
(
r
);
mpz_t
t1
;
mpz_init
(
t1
);
mpz_t
t2
;
mpz_init
(
t2
);
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
);
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
);
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
);
//Calculate r
mpz_mod
(
r
,
x
,
curve
->
n
);
if
(
!
mpz_sgn
(
r
))
//Start over if r=0, note haven't been tested memory might die :)
goto
signature_sign_start
;
mpz_clear
(
x
);
//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_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
);
//Release k,r and s
mpz_clear
(
k
);
mpz_clear
(
r
);
mpz_clear
(
s
);
}
/*Verify the integrity of a message using it's signature*/
bool
signature_verify
(
mpz_t
message
,
signature
sig
,
point
public_key
,
domain_parameters
curve
)
{
//verify r and s are within [1, n-1]
mpz_t
one
;
mpz_init
(
one
);
mpz_set_ui
(
one
,
1
);
if
(
mpz_cmp
(
sig
->
r
,
one
)
<
0
&&
mpz_cmp
(
curve
->
n
,
sig
->
r
)
<=
0
&&
mpz_cmp
(
sig
->
s
,
one
)
<
0
&&
mpz_cmp
(
curve
->
n
,
sig
->
s
)
<=
0
)
{
mpz_clear
(
one
);
return
false
;
}
mpz_clear
(
one
);
//Initialize variables
mpz_t
w
;
mpz_init
(
w
);
mpz_t
u1
;
mpz_init
(
u1
);
mpz_t
u2
;
mpz_init
(
u2
);
mpz_t
t
;
mpz_init
(
t
);
mpz_t
tt2
;
mpz_init
(
tt2
);
point
x
=
point_init
();
point
t1
=
point_init
();
point
t2
=
point_init
();
//w = s¯¹ mod n
number_theory_inverse
(
w
,
sig
->
s
,
curve
->
n
);
//u1 = message * w mod n
mpz_mod
(
tt2
,
message
,
curve
->
n
);
mpz_mul
(
t
,
tt2
,
w
);
mpz_mod
(
u1
,
t
,
curve
->
n
);
//u2 = r*w mod n
mpz_mul
(
t
,
sig
->
r
,
w
);
mpz_mod
(
u2
,
t
,
curve
->
n
);
//x = u1*G+u2*Q
point_multiplication
(
t1
,
u1
,
curve
->
G
,
curve
);
point_multiplication
(
t2
,
u2
,
public_key
,
curve
);
point_addition
(
x
,
t1
,
t2
,
curve
);
//Get the result, by comparing x value with r and verifying that x is NOT at infinity
bool
result
=
mpz_cmp
(
sig
->
r
,
x
->
x
)
==
0
&&
!
x
->
infinity
;
//release memory
point_clear
(
x
);
point_clear
(
t1
);
point_clear
(
t2
);
mpz_clear
(
w
);
mpz_clear
(
u1
);
mpz_clear
(
u2
);
mpz_clear
(
t
);
mpz_clear
(
tt2
);
//Return result
return
result
;
}
/*Release signature*/
void
signature_clear
(
signature
sig
)
{
mpz_clear
(
sig
->
r
);
mpz_clear
(
sig
->
s
);
free
(
sig
);
}
testw.cpp
View file @
eb8325c2
This diff is collapsed.
Click to expand it.
trusted_libff/libff/algebra/curves/alt_bn128/alt_bn128_init.cpp
View file @
eb8325c2
...
...
@@ -6,6 +6,7 @@
*****************************************************************************/
#include <libff/algebra/curves/alt_bn128/alt_bn128_g1.hpp>
#include <libff/algebra/curves/alt_bn128/alt_bn128_g2.hpp>
#include <libff/algebra/curves/alt_bn128/alt_bn128_init.hpp>
namespace
libff
{
...
...
@@ -166,6 +167,16 @@ void init_alt_bn128_params()
// window 22 is unbeaten in [34552892.20, inf]
alt_bn128_G1
::
fixed_base_exp_window_table
.
push_back
(
34552892
);
alt_bn128_G2
::
G2_zero
=
alt_bn128_G2
(
alt_bn128_Fq2
::
zero
(),
alt_bn128_Fq2
::
one
(),
alt_bn128_Fq2
::
zero
());
alt_bn128_G2
::
G2_one
=
alt_bn128_G2
(
alt_bn128_Fq2
(
alt_bn128_Fq
(
"10857046999023057135944570762232829481370756359578518086990519993285655852781"
),
alt_bn128_Fq
(
"11559732032986387107991004021392285783925812861821192530917403151452391805634"
)),
alt_bn128_Fq2
(
alt_bn128_Fq
(
"8495653923123431417604973247489272438418190587263600148770280649306958101930"
),
alt_bn128_Fq
(
"4082367875863433681332203403145435568316851327593401208105741076214120093531"
)),
alt_bn128_Fq2
::
one
());
/* pairing parameters */
...
...
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