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
fc264d08
Unverified
Commit
fc264d08
authored
Feb 08, 2021
by
kladko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bug/SKALE-3751-enable-zeromq
parent
6f537ff7
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
118 additions
and
95 deletions
+118
-95
ServerWorker.cpp
ServerWorker.cpp
+85
-75
ServerWorker.h
ServerWorker.h
+2
-0
ZMQClient.cpp
ZMQClient.cpp
+6
-4
ZMQMessage.cpp
ZMQMessage.cpp
+15
-16
sgxwallet_common.h
sgxwallet_common.h
+10
-0
No files found.
ServerWorker.cpp
View file @
fc264d08
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include "common.h"
#include "common.h"
#include "sgxwallet_common.h"
#include <json/writer.h>
#include <json/writer.h>
...
@@ -52,114 +53,123 @@ ServerWorker::ServerWorker(zmq::context_t &ctx, int sock_type, bool _checkSignat
...
@@ -52,114 +53,123 @@ ServerWorker::ServerWorker(zmq::context_t &ctx, int sock_type, bool _checkSignat
zmq_setsockopt
(
worker_
,
ZMQ_LINGER
,
&
linger
,
sizeof
(
linger
));
zmq_setsockopt
(
worker_
,
ZMQ_LINGER
,
&
linger
,
sizeof
(
linger
));
};
};
void
ServerWorker
::
work
()
{
worker_
.
connect
(
"inproc://backend"
);
std
::
string
replyStr
;
void
ServerWorker
::
doOneServerLoop
()
noexcept
{
string
replyStr
;
while
(
!
isExitRequested
)
{
Json
::
Value
result
;
result
[
"status"
]
=
ZMQ_SERVER_ERROR
;
result
[
"errorMessage"
]
=
""
;
Json
::
Value
result
;
zmq
::
message_t
identity
;
int
errStatus
=
-
1
*
(
10000
+
__LINE__
);
zmq
::
message_t
identit2
;
result
[
"status"
]
=
errStatus
;
zmq
::
message_t
copied_id
;
result
[
"errorMessage"
]
=
"Server error"
;
try
{
zmq
::
message_t
identity
;
zmq
::
message_t
identit2
;
zmq
::
message_t
copied_id
;
try
{
zmq_pollitem_t
items
[
1
];
items
[
0
].
socket
=
worker_
;
items
[
0
].
events
=
ZMQ_POLLIN
;
zmq_pollitem_t
items
[
1
];
int
pollResult
=
0
;
items
[
0
].
socket
=
worker_
;
items
[
0
].
events
=
ZMQ_POLLIN
;
int
pollResult
=
0
;
do
{
pollResult
=
zmq_poll
(
items
,
1
,
1000
);
if
(
isExitRequested
)
{
return
;
}
}
while
(
pollResult
==
0
);
do
{
pollResult
=
zmq_poll
(
items
,
1
,
1000
);
if
(
isExitRequested
)
{
goto
clean
;
}
}
while
(
pollResult
==
0
);
zmq
::
message_t
msg
;
zmq
::
message_t
copied_msg
;
worker_
.
recv
(
&
identity
);
copied_id
.
copy
(
&
identity
);
worker_
.
recv
(
&
msg
);
zmq
::
message_t
msg
;
int64_t
more
;
zmq
::
message_t
copied_msg
;
size_t
more_size
=
sizeof
(
more
);
worker_
.
recv
(
&
identity
);
auto
rc
=
zmq_getsockopt
(
worker_
,
ZMQ_RCVMORE
,
&
more
,
&
more_size
);
copied_id
.
copy
(
&
identity
);
worker_
.
recv
(
&
msg
);
int64_t
more
;
CHECK_STATE2
(
rc
==
0
,
ZMQ_COULD_NOT_GET_SOCKOPT
);
size_t
more_size
=
sizeof
(
more
);
auto
rc
=
zmq_getsockopt
(
worker_
,
ZMQ_RCVMORE
,
&
more
,
&
more_size
);
CHECK_STATE
(
rc
==
0
);
vector
<
uint8_t
>
msgData
(
msg
.
size
()
+
1
,
0
);
vector
<
uint8_t
>
msgData
(
msg
.
size
()
+
1
,
0
);
memcpy
(
msgData
.
data
(),
msg
.
data
(),
msg
.
size
()
);
memcpy
(
msgData
.
data
(),
msg
.
data
(),
msg
.
size
());
CHECK_STATE2
(
msg
.
size
()
>
5
||
msgData
.
at
(
0
)
==
'{'
||
msgData
[
msg
.
size
()]
==
'}'
,
ZMQ_INVALID_MESSAGE
);
CHECK_STATE
(
msg
.
size
()
>
5
||
msgData
.
at
(
0
)
==
'{'
||
msgData
[
msg
.
size
()]
==
'}'
);
memcpy
(
msgData
.
data
(),
msg
.
data
(),
msg
.
size
()
);
memcpy
(
msgData
.
data
(),
msg
.
data
(),
msg
.
size
());
auto
parsedMsg
=
ZMQMessage
::
parse
(
(
const
char
*
)
msgData
.
data
(),
msg
.
size
(),
true
,
checkSignature
);
auto
parsedMsg
=
ZMQMessage
::
parse
(
CHECK_STATE2
(
parsedMsg
,
ZMQ_COULD_NOT_PARSE
);
(
const
char
*
)
msgData
.
data
(),
msg
.
size
(),
true
,
checkSignature
);
CHECK_STATE
(
parsedMsg
);
result
=
parsedMsg
->
process
();
result
=
parsedMsg
->
process
();
}
catch
(
SGXException
&
e
)
{
}
catch
(
SGXException
&
e
)
{
result
[
"status"
]
=
e
.
getStatus
();
result
[
"status"
]
=
e
.
getStatus
();
result
[
"errorMessage"
]
=
e
.
getMessage
();
result
[
"errorMessage"
]
=
e
.
getMessage
();
spdlog
::
error
(
"Exception in zmq server worker:{}"
,
e
.
what
());
spdlog
::
error
(
"Exception in zmq server worker:{}"
,
e
.
what
());
}
catch
(
std
::
exception
&
e
)
{
if
(
isExitRequested
)
{
return
;
}
}
catch
(
std
::
exception
&
e
)
{
result
[
"errorMessage"
]
=
string
(
e
.
what
());
if
(
isExitRequested
)
{
spdlog
::
error
(
"Exception in zmq server worker:{}"
,
e
.
what
());
return
;
}
catch
(...)
{
}
if
(
isExitRequested
)
{
result
[
"errorMessage"
]
=
string
(
e
.
what
());
return
;
spdlog
::
error
(
"Exception in zmq server worker:{}"
,
e
.
what
());
}
catch
(...)
{
if
(
isExitRequested
)
{
goto
clean
;
}
spdlog
::
error
(
"Error in zmq server worker"
);
result
[
"errorMessage"
]
=
"Error in zmq server worker"
;
}
}
spdlog
::
error
(
"Error in zmq server worker"
);
result
[
"errorMessage"
]
=
"Error in zmq server worker"
;
}
try
{
try
{
Json
::
FastWriter
fastWriter
;
Json
::
FastWriter
fastWriter
;
replyStr
=
fastWriter
.
write
(
result
);
replyStr
=
fastWriter
.
write
(
result
);
replyStr
=
replyStr
.
substr
(
0
,
replyStr
.
size
()
-
1
);
replyStr
=
replyStr
.
substr
(
0
,
replyStr
.
size
()
-
1
);
CHECK_STATE
(
replyStr
.
size
()
>
2
);
CHECK_STATE
(
replyStr
.
size
()
>
2
);
CHECK_STATE
(
replyStr
.
front
()
==
'{'
);
CHECK_STATE
(
replyStr
.
front
()
==
'{'
);
CHECK_STATE
(
replyStr
.
back
()
==
'}'
);
CHECK_STATE
(
replyStr
.
back
()
==
'}'
);
zmq
::
message_t
replyMsg
(
replyStr
.
c_str
(),
replyStr
.
size
()
+
1
);
zmq
::
message_t
replyMsg
(
replyStr
.
c_str
(),
replyStr
.
size
()
+
1
);
worker_
.
send
(
copied_id
,
ZMQ_SNDMORE
);
worker_
.
send
(
copied_id
,
ZMQ_SNDMORE
);
worker_
.
send
(
replyMsg
);
worker_
.
send
(
replyMsg
);
}
catch
(
std
::
exception
&
e
)
{
}
catch
(
std
::
exception
&
e
)
{
if
(
isExitRequested
)
{
if
(
isExitRequested
)
{
goto
clean
;
return
;
}
}
spdlog
::
error
(
"Exception in zmq server worker send :{}"
,
e
.
what
());
spdlog
::
error
(
"Exception in zmq server worker send :{}"
,
e
.
what
());
}
catch
(...)
{
if
(
isExitRequested
)
{
return
;
}
spdlog
::
error
(
"Unklnown exception in zmq server worker send"
);
}
}
void
ServerWorker
::
work
()
{
worker_
.
connect
(
"inproc://backend"
);
while
(
!
isExitRequested
)
{
try
{
doOneServerLoop
();
}
catch
(...)
{
}
catch
(...)
{
if
(
isExitRequested
)
{
spdlog
::
error
(
"doOneServerLoop threw exception. This should never happen!"
);
goto
clean
;
}
spdlog
::
error
(
"Unklnown exception in zmq server worker send"
);
}
}
}
}
clean
:
spdlog
::
info
(
"Exited worker thread {}"
,
index
);
spdlog
::
info
(
"Exited worker thread {}"
,
index
);
}
}
...
...
ServerWorker.h
View file @
fc264d08
...
@@ -54,6 +54,8 @@ private:
...
@@ -54,6 +54,8 @@ private:
std
::
atomic
<
bool
>
isExitRequested
;
std
::
atomic
<
bool
>
isExitRequested
;
void
doOneServerLoop
()
noexcept
;
static
std
::
atomic
<
uint64_t
>
workerCount
;
static
std
::
atomic
<
uint64_t
>
workerCount
;
uint64_t
index
;
uint64_t
index
;
};
};
...
...
ZMQClient.cpp
View file @
fc264d08
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
#include <streambuf>
#include <streambuf>
#include <regex>
#include <regex>
#include "sgxwallet_common.h"
#include "common.h"
#include "common.h"
#include "BLSCrypto.h"
#include "BLSCrypto.h"
#include "BLSSignReqMessage.h"
#include "BLSSignReqMessage.h"
...
@@ -137,6 +137,7 @@ string ZMQClient::readFileIntoString(const string &_fileName) {
...
@@ -137,6 +137,7 @@ string ZMQClient::readFileIntoString(const string &_fileName) {
}
}
void
ZMQClient
::
verifySig
(
EVP_PKEY
*
_pubkey
,
const
string
&
_str
,
const
string
&
_sig
)
{
void
ZMQClient
::
verifySig
(
EVP_PKEY
*
_pubkey
,
const
string
&
_str
,
const
string
&
_sig
)
{
CHECK_STATE
(
_pubkey
);
CHECK_STATE
(
_pubkey
);
...
@@ -145,12 +146,12 @@ void ZMQClient::verifySig(EVP_PKEY* _pubkey, const string& _str, const string& _
...
@@ -145,12 +146,12 @@ void ZMQClient::verifySig(EVP_PKEY* _pubkey, const string& _str, const string& _
static
std
::
regex
r
(
"
\\
s+"
);
static
std
::
regex
r
(
"
\\
s+"
);
auto
msgToSign
=
std
::
regex_replace
(
_str
,
r
,
""
);
auto
msgToSign
=
std
::
regex_replace
(
_str
,
r
,
""
);
vector
<
uint8_t
>
binSig
(
256
,
0
);
vector
<
uint8_t
>
binSig
(
256
,
0
);
uint64_t
binLen
=
0
;
uint64_t
binLen
=
0
;
CHECK_STATE
(
hex2carray
(
_sig
.
c_str
(),
&
binLen
,
binSig
.
data
(),
binSig
.
size
()));
CHECK_STATE2
(
hex2carray
(
_sig
.
c_str
(),
&
binLen
,
binSig
.
data
(),
binSig
.
size
()),
ZMQ_COULD_NOT_PARSE
);
CHECK_STATE
(
binLen
>
0
);
CHECK_STATE
(
binLen
>
0
);
...
@@ -170,7 +171,8 @@ void ZMQClient::verifySig(EVP_PKEY* _pubkey, const string& _str, const string& _
...
@@ -170,7 +171,8 @@ void ZMQClient::verifySig(EVP_PKEY* _pubkey, const string& _str, const string& _
CHECK_STATE
(
EVP_DigestVerifyFinal
(
mdctx
,
binSig
.
data
(),
binLen
)
==
1
);
CHECK_STATE2
(
EVP_DigestVerifyFinal
(
mdctx
,
binSig
.
data
(),
binLen
)
==
1
,
ZMQ_COULD_NOT_VERIFY_SIG
);
if
(
mdctx
)
EVP_MD_CTX_destroy
(
mdctx
);
if
(
mdctx
)
EVP_MD_CTX_destroy
(
mdctx
);
...
...
ZMQMessage.cpp
View file @
fc264d08
...
@@ -22,6 +22,7 @@
...
@@ -22,6 +22,7 @@
*/
*/
#include "common.h"
#include "common.h"
#include "sgxwallet_common.h"
#include <third_party/cryptlite/sha256.h>
#include <third_party/cryptlite/sha256.h>
#include <iostream>
#include <iostream>
#include <fstream>
#include <fstream>
...
@@ -51,36 +52,37 @@ string ZMQMessage::getStringRapid(const char *_name) {
...
@@ -51,36 +52,37 @@ string ZMQMessage::getStringRapid(const char *_name) {
};
};
shared_ptr
<
ZMQMessage
>
ZMQMessage
::
parse
(
const
char
*
_msg
,
shared_ptr
<
ZMQMessage
>
ZMQMessage
::
parse
(
const
char
*
_msg
,
size_t
_size
,
bool
_isRequest
,
size_t
_size
,
bool
_isRequest
,
bool
_verifySig
)
{
bool
_verifySig
)
{
CHECK_STATE
(
_msg
);
CHECK_STATE
(
_msg
);
CHECK_STATE
(
_size
>
5
);
CHECK_STATE
2
(
_size
>
5
,
ZMQ_INVALID_MESSAGE_SIZE
);
// CHECK NULL TERMINATED
// CHECK NULL TERMINATED
CHECK_STATE
(
_msg
[
_size
]
==
0
);
CHECK_STATE
(
_msg
[
_size
]
==
0
);
CHECK_STATE
(
_msg
[
_size
-
1
]
==
'}'
);
CHECK_STATE
2
(
_msg
[
_size
-
1
]
==
'}'
,
ZMQ_INVALID_MESSAGE
);
CHECK_STATE
(
_msg
[
0
]
==
'{'
);
CHECK_STATE
2
(
_msg
[
0
]
==
'{'
,
ZMQ_INVALID_MESSAGE
);
auto
d
=
make_shared
<
rapidjson
::
Document
>
();
auto
d
=
make_shared
<
rapidjson
::
Document
>
();
cerr
<<
_msg
<<
endl
;
d
->
Parse
(
_msg
);
d
->
Parse
(
_msg
);
CHECK_STATE
(
!
d
->
HasParseError
()
);
CHECK_STATE
2
(
!
d
->
HasParseError
(),
ZMQ_COULD_NOT_PARSE
);
CHECK_STATE
(
d
->
IsObject
())
CHECK_STATE
2
(
d
->
IsObject
(),
ZMQ_COULD_NOT_PARSE
);
CHECK_STATE
(
d
->
HasMember
(
"type"
)
);
CHECK_STATE
2
(
d
->
HasMember
(
"type"
),
ZMQ_NO_TYPE_IN_MESSAGE
);
CHECK_STATE
((
*
d
)[
"type"
].
IsString
()
);
CHECK_STATE
2
((
*
d
)[
"type"
].
IsString
(),
ZMQ_NO_TYPE_IN_MESSAGE
);
string
type
=
(
*
d
)[
"type"
].
GetString
();
string
type
=
(
*
d
)[
"type"
].
GetString
();
if
(
_verifySig
)
{
if
(
_verifySig
)
{
CHECK_STATE
(
d
->
HasMember
(
"cert"
)
);
CHECK_STATE
2
(
d
->
HasMember
(
"cert"
),
ZMQ_NO_CERT_IN_MESSAGE
);
CHECK_STATE
(
d
->
HasMember
(
"msgSig"
)
);
CHECK_STATE
2
(
d
->
HasMember
(
"msgSig"
),
ZMQ_NO_SIG_IN_MESSAGE
);
CHECK_STATE
((
*
d
)[
"cert"
].
IsString
()
);
CHECK_STATE
2
((
*
d
)[
"cert"
].
IsString
(),
ZMQ_NO_CERT_IN_MESSAGE
);
auto
cert
=
make_shared
<
string
>
((
*
d
)[
"cert"
].
GetString
()
);
CHECK_STATE2
((
*
d
)[
"msgSig"
].
IsString
(),
ZMQ_NO_SIG_IN_MESSAGE
);
auto
cert
=
make_shared
<
string
>
((
*
d
)[
"cert"
].
GetString
());
string
hash
=
cryptlite
::
sha256
::
hash_hex
(
*
cert
);
string
hash
=
cryptlite
::
sha256
::
hash_hex
(
*
cert
);
auto
filepath
=
"/tmp/sgx_wallet_cert_hash_"
+
hash
;
auto
filepath
=
"/tmp/sgx_wallet_cert_hash_"
+
hash
;
...
@@ -103,7 +105,6 @@ shared_ptr <ZMQMessage> ZMQMessage::parse(const char *_msg,
...
@@ -103,7 +105,6 @@ shared_ptr <ZMQMessage> ZMQMessage::parse(const char *_msg,
auto
handles
=
ZMQClient
::
readPublicKeyFromCertStr
(
*
cert
);
auto
handles
=
ZMQClient
::
readPublicKeyFromCertStr
(
*
cert
);
CHECK_STATE
(
handles
.
first
);
CHECK_STATE
(
handles
.
first
);
CHECK_STATE
(
handles
.
second
);
CHECK_STATE
(
handles
.
second
);
verifiedCerts
.
put
(
*
cert
,
handles
);
verifiedCerts
.
put
(
*
cert
,
handles
);
remove
(
cert
->
c_str
());
remove
(
cert
->
c_str
());
}
}
...
@@ -112,9 +113,7 @@ shared_ptr <ZMQMessage> ZMQMessage::parse(const char *_msg,
...
@@ -112,9 +113,7 @@ shared_ptr <ZMQMessage> ZMQMessage::parse(const char *_msg,
CHECK_STATE
(
publicKey
);
CHECK_STATE
(
publicKey
);
CHECK_STATE
((
*
d
)[
"msgSig"
].
IsString
());
auto
msgSig
=
make_shared
<
string
>
((
*
d
)[
"msgSig"
].
GetString
());
auto
msgSig
=
make_shared
<
string
>
((
*
d
)[
"msgSig"
].
GetString
());
cerr
<<
"Got msgSig:"
<<
msgSig
<<
endl
;
d
->
RemoveMember
(
"msgSig"
);
d
->
RemoveMember
(
"msgSig"
);
...
...
sgxwallet_common.h
View file @
fc264d08
...
@@ -159,6 +159,16 @@ extern bool autoconfirm;
...
@@ -159,6 +159,16 @@ extern bool autoconfirm;
#define ECDSA_SIGN_INVALID_KEY_HEX -86
#define ECDSA_SIGN_INVALID_KEY_HEX -86
#define SET_SEK_INVALID_SEK_HEX -87
#define SET_SEK_INVALID_SEK_HEX -87
#define TEST_INVALID_HEX -88
#define TEST_INVALID_HEX -88
#define ZMQ_SERVER_ERROR -89
#define ZMQ_COULD_NOT_PARSE -90
#define ZMQ_INVALID_MESSAGE -91
#define ZMQ_COULD_NOT_GET_SOCKOPT -92
#define ZMQ_INVALID_MESSAGE_SIZE -93
#define ZMQ_NO_TYPE_IN_MESSAGE -94
#define ZMQ_NO_SIG_IN_MESSAGE -95
#define ZMQ_NO_CERT_IN_MESSAGE -96
#define ZMQ_COULD_NOT_VERIFY_SIG -97
#define SGX_ENCLAVE_ERROR -666
#define SGX_ENCLAVE_ERROR -666
...
...
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