I want to sign some data in client using eosjs-ecc.sign() and result is a string like "SIG_K1_KcTmv..." I want to use the
recover_key(const checksum256* digest, const char* sig, size_t siglen, char* pub, size_t publen );
to recover the public key. However the parameter sig need to type "signature"(which is 66 byes). How do I convert result of eosjs-ecc.sign to be used in contract recover_key?
-
directly pass the SIG_K1_xxx with type signature, and contract will convert it directly for you– Jimmy GuoCommented Jul 26, 2018 at 5:26
-
If I directly pass the SIG_K1_xx string, the recover_key function in contract throw exception. It is expect some format of binary data– WayneCommented Jul 26, 2018 at 17:41
-
I say with type signature– Jimmy GuoCommented Jul 27, 2018 at 4:55
Add a comment
|
1 Answer
You need to use signature
structure from eoslib small working example of keycheck
function is attached.
#include <eosiolib/eosio.hpp>
#include <eosiolib/crypto.h>
#include <string>
template<typename CharT>
static std::string to_hex( const CharT* d, uint32_t s ) {
std::string r;
const char* to_hex="0123456789abcdef";
uint8_t* c = (uint8_t*)d;
for( uint32_t i = 0; i < s; ++i ) {
(r += to_hex[(c[i] >> 4)]) += to_hex[(c[i] & 0x0f)];
}
return r;
}
namespace example {
using namespace eosio;
class recover : public contract
{
public:
using contract::contract;
recover(account_name self) : contract(self) {};
///@abi action
void keycheck(const checksum256 &digest, const signature &sig, const public_key &crosscheck_pk)
{
require_auth(_self);
public_key pk;
auto r = recover_key(&digest, (char *)&sig, sizeof(sig), (char *)&pk, sizeof(pk));
print_f("public_key: %\n", to_hex(&pk, sizeof(pk)).c_str());
print_f("crosscheck public_key: %\n", to_hex(&crosscheck_pk, sizeof(crosscheck_pk)).c_str());
auto cmp = memcmp(&pk, &crosscheck_pk, sizeof(public_key));
eosio_assert(memcmp(&pk, &crosscheck_pk, sizeof(public_key)) == 0, "keycheck: pubkey cross check failed");
}
};
}
EOSIO_ABI(example::recover, (keycheck))
-
how to send parameters? first parameters is data's hash? thank you. cleos push action signature keycheck
'["01c77713adf37144f4d4ab1fff11c66d9a54d5fef490253674bf009ef586a066", "SIG_K1_K2jD49Nz8h77fXbZvHgojsygojb9SnUBKs4PMXSFLABnDcSvPB1QJG3rsYVz6tpXYEBSfaxWKqpSqyzFv86wf4KjFEETat", "EOS4wpa8kRBbZof9JEpPAAgbnN65NhbBobW4x5gyxQoFfamhQCAMX"]' -p signature
Commented Nov 8, 2018 at 7:19