CDT  v4.2.0
инструменты разработчика
crypto.hpp
См. документацию.
1
5#pragma once
6
7#include "fixed_bytes.hpp"
8#include "varint.hpp"
9#include "serialize.hpp"
10#include "name.hpp"
11
12#include <array>
13
14namespace eosio {
15
30 using ecc_public_key = std::array<char, 33>;
31
37 struct webauthn_public_key {
42 enum class user_presence_t : uint8_t {
43 USER_PRESENCE_NONE,
44 USER_PRESENCE_PRESENT,
45 USER_PRESENCE_VERIFIED
46 };
47
51 ecc_public_key key;
52
57 user_presence_t user_presence;
58
63 std::string rpid;
64
66
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);
69 }
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);
72 }
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);
75 }
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);
78 }
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);
81 }
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);
84 }
85
87 };
88
99 using public_key = std::variant<ecc_public_key, ecc_public_key, webauthn_public_key>;
100
101
103
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;
116 return ds;
117 }
118
128 template<typename DataStream>
129 inline DataStream& operator>>(DataStream& ds, eosio::webauthn_public_key& pubkey) {
130 ds >> pubkey.key >> pubkey.user_presence >> pubkey.rpid;
131 return ds;
132 }
133
135
150 using ecc_signature = std::array<char, 65>;
151
157 struct webauthn_signature {
161 ecc_signature compact_signature;
162
167 std::vector<uint8_t> auth_data;
168
173 std::string client_json;
174
176
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);
179 }
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);
182 }
183
185 };
186
197 using signature = std::variant<ecc_signature, ecc_signature, webauthn_signature>;
198
200
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;
212 return ds;
213 }
214
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;
226 return ds;
227 }
228
230
246 void assert_sha256( const char* data, uint32_t length, const eosio::checksum256& hash );
247
257 void assert_sha1( const char* data, uint32_t length, const eosio::checksum160& hash );
258
268 void assert_sha512( const char* data, uint32_t length, const eosio::checksum512& hash );
269
278 void assert_ripemd160( const char* data, uint32_t length, const eosio::checksum160& hash );
279
288 eosio::checksum256 sha256( const char* data, uint32_t length );
289
299 eosio::checksum160 sha1( const char* data, uint32_t length );
300
309 eosio::checksum512 sha512( const char* data, uint32_t length );
310
319 eosio::checksum160 ripemd160( const char* data, uint32_t length );
320
329 eosio::public_key recover_key( const eosio::checksum256& digest, const eosio::signature& sig );
330
339 void assert_recover_key( const eosio::checksum256& digest, const eosio::signature& sig, const eosio::public_key& pubkey );
340
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 );
360}