diff --git a/src/ripple/app/hook/HookAPI.h b/src/ripple/app/hook/HookAPI.h index cd8ca9dc5..1bd1f854d 100644 --- a/src/ripple/app/hook/HookAPI.h +++ b/src/ripple/app/hook/HookAPI.h @@ -33,8 +33,13 @@ public: /// util APIs // util_raddr // util_accid - // util_verify - // util_sha512h + + Expected + util_verify(Slice const& data, Slice const& sig, Slice const& key) const; + + uint256 + util_sha512h(Slice const& data) const; + // util_keylet /// sto APIs diff --git a/src/ripple/app/hook/impl/HookAPI.cpp b/src/ripple/app/hook/impl/HookAPI.cpp index b007ab21d..c8f879f7b 100644 --- a/src/ripple/app/hook/impl/HookAPI.cpp +++ b/src/ripple/app/hook/impl/HookAPI.cpp @@ -295,6 +295,45 @@ const int64_t float_one_internal = using namespace ripple; using namespace hook_float; +/// util APIs +// util_raddr +// util_accid + +Expected +HookAPI::util_verify(Slice const& data, Slice const& sig, Slice const& key) + const +{ + if (key.size() != 33) + return Unexpected(INVALID_KEY); + + if (data.size() == 0) + return Unexpected(TOO_SMALL); + + if (sig.size() < 30) + return Unexpected(TOO_SMALL); + + if (!publicKeyType(key)) + return Unexpected(INVALID_KEY); + + ripple::PublicKey pubkey{key}; + return ripple::verify(pubkey, data, sig, false); +} + +uint256 +HookAPI::util_sha512h(Slice const& data) const +{ + return ripple::sha512Half(data); +} + +// util_keylet + +/// sto APIs +// sto_validate +// sto_subfield +// sto_subarray +// sto_emplace +// sto_erase + Expected HookAPI::otxn_field(uint32_t field_id) const { diff --git a/src/ripple/app/hook/impl/applyHook.cpp b/src/ripple/app/hook/impl/applyHook.cpp index 64a418ab2..f935fee28 100644 --- a/src/ripple/app/hook/impl/applyHook.cpp +++ b/src/ripple/app/hook/impl/applyHook.cpp @@ -3173,7 +3173,9 @@ DEFINE_HOOK_FUNCTION( NOT_IN_BOUNDS(read_ptr, read_len, memory_length)) return OUT_OF_BOUNDS; - auto hash = ripple::sha512Half(ripple::Slice{memory + read_ptr, read_len}); + hook::HookAPI api(hookCtx); + auto const hash = + api.util_sha512h(ripple::Slice{memory + read_ptr, read_len}); WRITE_WASM_MEMORY_AND_RETURN( write_ptr, 32, hash.data(), 32, memory, memory_length); @@ -3891,27 +3893,18 @@ DEFINE_HOOK_FUNCTION( NOT_IN_BOUNDS(kread_ptr, kread_len, memory_length)) return OUT_OF_BOUNDS; - if (kread_len != 33) - return INVALID_KEY; - - if (dread_len == 0) - return TOO_SMALL; - - if (sread_len < 30) - return TOO_SMALL; - - ripple::Slice keyslice{ + ripple::Slice key{ reinterpret_cast(kread_ptr + memory), kread_len}; ripple::Slice data{ reinterpret_cast(dread_ptr + memory), dread_len}; ripple::Slice sig{ reinterpret_cast(sread_ptr + memory), sread_len}; - if (!publicKeyType(keyslice)) - return INVALID_KEY; - - ripple::PublicKey key{keyslice}; - return verify(key, data, sig, false) ? 1 : 0; + hook::HookAPI api(hookCtx); + auto const result = api.util_verify(data, sig, key); + if (!result) + return result.error(); + return result.value() ? 1 : 0; HOOK_TEARDOWN(); }