30 using ecc_public_key = std::array<char, 33>;
37 struct webauthn_public_key {
42 enum class user_presence_t : uint8_t {
44 USER_PRESENCE_PRESENT,
45 USER_PRESENCE_VERIFIED
57 user_presence_t user_presence;
67 friend bool operator == (
const webauthn_public_key& a,
const webauthn_public_key& b ) {
68 return std::tie(a.key,a.user_presence,a.rpid) == std::tie(b.key,b.user_presence,b.rpid);
70 friend bool operator != (
const webauthn_public_key& a,
const webauthn_public_key& b ) {
71 return std::tie(a.key,a.user_presence,a.rpid) != std::tie(b.key,b.user_presence,b.rpid);
73 friend bool operator < (
const webauthn_public_key& a,
const webauthn_public_key& b ) {
74 return std::tie(a.key,a.user_presence,a.rpid) < std::tie(b.key,b.user_presence,b.rpid);
76 friend bool operator <= (
const webauthn_public_key& a,
const webauthn_public_key& b ) {
77 return std::tie(a.key,a.user_presence,a.rpid) <= std::tie(b.key,b.user_presence,b.rpid);
79 friend bool operator > (
const webauthn_public_key& a,
const webauthn_public_key& b ) {
80 return std::tie(a.key,a.user_presence,a.rpid) > std::tie(b.key,b.user_presence,b.rpid);
82 friend bool operator >= (
const webauthn_public_key& a,
const webauthn_public_key& b ) {
83 return std::tie(a.key,a.user_presence,a.rpid) >= std::tie(b.key,b.user_presence,b.rpid);
99 using public_key = std::variant<ecc_public_key, ecc_public_key, webauthn_public_key>;
113 template<
typename DataStream>
114 inline DataStream&
operator<<(DataStream& ds,
const eosio::webauthn_public_key& pubkey) {
115 ds << pubkey.key << pubkey.user_presence << pubkey.rpid;
128 template<
typename DataStream>
129 inline DataStream&
operator>>(DataStream& ds, eosio::webauthn_public_key& pubkey) {
130 ds >> pubkey.key >> pubkey.user_presence >> pubkey.rpid;
150 using ecc_signature = std::array<char, 65>;
157 struct webauthn_signature {
161 ecc_signature compact_signature;
167 std::vector<uint8_t> auth_data;
173 std::string client_json;
177 friend bool operator == (
const webauthn_signature& a,
const webauthn_signature& b ) {
178 return std::tie(a.compact_signature,a.auth_data,a.client_json) == std::tie(b.compact_signature,b.auth_data,b.client_json);
180 friend bool operator != (
const webauthn_signature& a,
const webauthn_signature& b ) {
181 return std::tie(a.compact_signature,a.auth_data,a.client_json) != std::tie(b.compact_signature,b.auth_data,b.client_json);
197 using signature = std::variant<ecc_signature, ecc_signature, webauthn_signature>;
209 template<
typename DataStream>
210 inline DataStream&
operator<<(DataStream& ds,
const eosio::webauthn_signature& sig) {
211 ds << sig.compact_signature << sig.auth_data << sig.client_json;
223 template<
typename DataStream>
224 inline DataStream&
operator>>(DataStream& ds, eosio::webauthn_signature& sig) {
225 ds >> sig.compact_signature >> sig.auth_data >> sig.client_json;
246 void assert_sha256(
const char* data,
uint32_t length,
const eosio::checksum256&
hash );
257 void assert_sha1(
const char* data,
uint32_t length,
const eosio::checksum160&
hash );
268 void assert_sha512(
const char* data,
uint32_t length,
const eosio::checksum512&
hash );
278 void assert_ripemd160(
const char* data,
uint32_t length,
const eosio::checksum160&
hash );
288 eosio::checksum256 sha256(
const char* data,
uint32_t length );
299 eosio::checksum160 sha1(
const char* data,
uint32_t length );
309 eosio::checksum512 sha512(
const char* data,
uint32_t length );
319 eosio::checksum160 ripemd160(
const char* data,
uint32_t length );
329 eosio::public_key recover_key(
const eosio::checksum256& digest,
const eosio::signature& sig );
339 void assert_recover_key(
const eosio::checksum256& digest,
const eosio::signature& sig,
const eosio::public_key& pubkey );
359 void assert_recover_key_account(
const eosio::checksum256& digest,
const eosio::signature& sig,
const eosio::public_key& pubkey,
eosio::name account,
eosio::name permission );