xrpld
Loading...
Searching...
No Matches
ChannelVerify.cpp
1#include <xrpld/rpc/Context.h>
2#include <xrpld/rpc/detail/RPCHelpers.h>
3
4#include <xrpl/basics/Slice.h>
5#include <xrpl/basics/StringUtilities.h>
6#include <xrpl/basics/base_uint.h>
7#include <xrpl/json/json_value.h>
8#include <xrpl/protocol/ErrorCodes.h>
9#include <xrpl/protocol/PayChan.h>
10#include <xrpl/protocol/PublicKey.h>
11#include <xrpl/protocol/RPCErr.h>
12#include <xrpl/protocol/Serializer.h>
13#include <xrpl/protocol/XRPAmount.h>
14#include <xrpl/protocol/jss.h>
15#include <xrpl/protocol/tokens.h>
16#include <xrpl/resource/Fees.h>
17
18#include <cstdint>
19#include <optional>
20#include <string>
21
22namespace xrpl {
23
24// {
25// public_key: <public_key>
26// channel_id: 256-bit channel id
27// drops: 64-bit uint (as string)
28// signature: signature to verify
29// }
30json::Value
32{
33 auto const& params(context.params);
34 for (auto const& p : {jss::public_key, jss::channel_id, jss::amount, jss::signature})
35 {
36 if (!params.isMember(p))
37 return rpc::missingFieldError(p);
38 }
39
41
43 {
44 std::string const strPk = params[jss::public_key].asString();
46
47 if (!pk)
48 {
49 auto pkHex = strUnHex(strPk);
50 if (!pkHex)
52 auto const pkType = publicKeyType(makeSlice(*pkHex));
53 if (!pkType)
55 pk.emplace(makeSlice(*pkHex));
56 }
57 }
58
59 uint256 channelId;
60 if (!channelId.parseHex(params[jss::channel_id].asString()))
62
63 std::optional<std::uint64_t> const optDrops =
64 params[jss::amount].isString() ? toUInt64(params[jss::amount].asString()) : std::nullopt;
65
66 if (!optDrops)
68
69 std::uint64_t const drops = *optDrops;
70
71 auto sig = strUnHex(params[jss::signature].asString());
72 if (!sig || sig->empty())
74
75 Serializer msg;
76 serializePayChanAuthorization(msg, channelId, XRPAmount(drops));
77
78 json::Value result;
79 result[jss::signature_verified] = verify(*pk, msg.slice(), makeSlice(*sig));
80 return result;
81}
82
83} // namespace xrpl
Represents a JSON value.
Definition json_value.h:117
constexpr bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
Definition base_uint.h:525
Slice slice() const noexcept
Definition Serializer.h:45
T emplace(T... args)
Charge const kFeeHeavyBurdenRpc
json::Value missingFieldError(std::string const &name)
Definition ErrorCodes.h:243
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
@ RpcChannelAmtMalformed
Definition ErrorCodes.h:84
@ RpcPublicMalformed
Definition ErrorCodes.h:100
@ RpcInvalidParams
Definition ErrorCodes.h:67
@ RpcChannelMalformed
Definition ErrorCodes.h:83
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig) noexcept
Verify a signature on a message.
void serializePayChanAuthorization(Serializer &msg, uint256 const &key, XRPAmount const &amt)
Definition PayChan.h:11
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Slice makeSlice(std::array< T, N > const &a)
Definition Slice.h:228
json::Value rpcError(ErrorCodeI iError)
Definition RPCErr.cpp:13
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
json::Value doChannelVerify(rpc::JsonContext &context)
std::optional< std::uint64_t > toUInt64(std::string const &s)
BaseUInt< 256 > uint256
Definition base_uint.h:580
resource::Charge & loadType
Definition Context.h:30
json::Value params
Definition Context.h:51