Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Adds xrp support #569

Merged
merged 20 commits into from
Nov 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 196 additions & 0 deletions apps/xrp_app/xrp_api.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
/**
* @file xrp_api.c
* @author Cypherock X1 Team
* @brief Defines helpers apis for XRP app.
* @copyright Copyright (c) 2024 HODL TECH PTE LTD
* <br/> You may obtain a copy of license at <a href="https://mitcc.org/"
*target=_blank>https://mitcc.org/</a>
*
******************************************************************************
* @attention
*
* (c) Copyright 2024 by HODL TECH PTE LTD
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*
* "Commons Clause" License Condition v1.0
*
* The Software is provided to you by the Licensor under the License,
* as defined below, subject to the following condition.
*
* Without limiting other conditions in the License, the grant of
* rights under the License will not include, and the License does not
* grant to you, the right to Sell the Software.
*
* For purposes of the foregoing, "Sell" means practicing any or all
* of the rights granted to you under the License to provide to third
* parties, for a fee or other consideration (including without
* limitation fees for hosting or consulting/ support services related
* to the Software), a product or service whose value derives, entirely
* or substantially, from the functionality of the Software. Any license
* notice or attribution required by the License must also include
* this Commons Clause License Condition notice.
*
* Software: All X1Wallet associated files.
* License: MIT
* Licensor: HODL TECH PTE LTD
*
******************************************************************************
*/

/*****************************************************************************
* INCLUDES
*****************************************************************************/

#include "xrp_api.h"

#include <pb_decode.h>
#include <pb_encode.h>

#include "common_error.h"
#include "core_api.h"
#include "events.h"

/*****************************************************************************
* EXTERN VARIABLES
*****************************************************************************/

/*****************************************************************************
* PRIVATE MACROS AND DEFINES
*****************************************************************************/

/*****************************************************************************
* PRIVATE TYPEDEFS
*****************************************************************************/

/*****************************************************************************
* STATIC VARIABLES
*****************************************************************************/

/*****************************************************************************
* GLOBAL VARIABLES
*****************************************************************************/

/*****************************************************************************
* STATIC FUNCTION PROTOTYPES
*****************************************************************************/

/*****************************************************************************
* STATIC FUNCTIONS
*****************************************************************************/

/*****************************************************************************
* GLOBAL FUNCTIONS
*****************************************************************************/
bool decode_xrp_query(const uint8_t *data,
uint16_t data_size,
xrp_query_t *query_out) {
if (NULL == data || NULL == query_out || 0 == data_size) {
xrp_send_error(ERROR_COMMON_ERROR_CORRUPT_DATA_TAG,
ERROR_DATA_FLOW_DECODING_FAILED);
return false;
}

// zeroise for safety from garbage in the query reference
memzero(query_out, sizeof(xrp_query_t));

/* Create a stream that reads from the buffer. */
pb_istream_t stream = pb_istream_from_buffer(data, data_size);

/* Now we are ready to decode the message. */
bool status = pb_decode(&stream, XRP_QUERY_FIELDS, query_out);

/* Send error to host if status is false*/
if (false == status) {
xrp_send_error(ERROR_COMMON_ERROR_CORRUPT_DATA_TAG,
ERROR_DATA_FLOW_DECODING_FAILED);
}

return status;
}

bool encode_xrp_result(const xrp_result_t *result,
uint8_t *buffer,
uint16_t max_buffer_len,
size_t *bytes_written_out) {
if (NULL == result || NULL == buffer || NULL == bytes_written_out)
return false;

/* Create a stream that will write to our buffer. */
pb_ostream_t stream = pb_ostream_from_buffer(buffer, max_buffer_len);

/* Now we are ready to encode the message! */
bool status = pb_encode(&stream, XRP_RESULT_FIELDS, result);

if (true == status) {
*bytes_written_out = stream.bytes_written;
}

return status;
}

bool check_xrp_query(const xrp_query_t *query, pb_size_t exp_query_tag) {
if ((NULL == query) || (exp_query_tag != query->which_request)) {
xrp_send_error(ERROR_COMMON_ERROR_CORRUPT_DATA_TAG,
ERROR_DATA_FLOW_INVALID_QUERY);
return false;
}
return true;
}

xrp_result_t init_xrp_result(pb_size_t result_tag) {
xrp_result_t result = XRP_RESULT_INIT_ZERO;
result.which_response = result_tag;
return result;
}

void xrp_send_error(pb_size_t which_error, uint32_t error_code) {
xrp_result_t result = init_xrp_result(XRP_RESULT_COMMON_ERROR_TAG);
result.common_error = init_common_error(which_error, error_code);
xrp_send_result(&result);
}

void xrp_send_result(const xrp_result_t *result) {
// TODO: Set all option files
uint8_t buffer[1700] = {0};
size_t bytes_encoded = 0;
ASSERT(encode_xrp_result(result, buffer, sizeof(buffer), &bytes_encoded));
send_response_to_host(&buffer[0], bytes_encoded);
}

bool xrp_get_query(xrp_query_t *query, pb_size_t exp_query_tag) {
evt_status_t event = get_events(EVENT_CONFIG_USB, MAX_INACTIVITY_TIMEOUT);

if (true == event.p0_event.flag) {
return false;
}

if (!decode_xrp_query(
event.usb_event.p_msg, event.usb_event.msg_size, query)) {
return false;
}

if (!check_xrp_query(query, exp_query_tag)) {
return false;
}

return true;
}
113 changes: 113 additions & 0 deletions apps/xrp_app/xrp_api.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/**
* @file xrp_api.h
* @author Cypherock X1 Team
* @brief Header file to export some helper functions for the XRP app
* @copyright Copyright (c) 2024 HODL TECH PTE LTD
* <br/> You may obtain a copy of license at <a href="https://mitcc.org/"
* target=_blank>https://mitcc.org/</a>
*/
#ifndef XRP_API_H
#define XRP_API_H

/*****************************************************************************
* INCLUDES
*****************************************************************************/

#include <stdint.h>
#include <xrp/core.pb.h>

/*****************************************************************************
* MACROS AND DEFINES
*****************************************************************************/

/*****************************************************************************
* TYPEDEFS
*****************************************************************************/

/*****************************************************************************
* EXPORTED VARIABLES
*****************************************************************************/

/*****************************************************************************
* GLOBAL FUNCTION PROTOTYPES
*****************************************************************************/

/**
* @brief API to decode query from host with `XRP_QUERY_FIELDS`
*
* @param[in] data: PB encoded bytestream received from host
* @param[in] data_size: size of pb encoded bytestream
* @param[out] query_out: @ref xrp_query_t obj to copy the decoded result to
* @return bool True if decoding was successful, else false
*/
bool decode_xrp_query(const uint8_t *data,
uint16_t data_size,
xrp_query_t *query_out);

/**
* @brief Encodes the XRP result with `XRP_RESULT_FIELDS` to byte-stream
*
* @param[in] result: object of populated @ref xrp_result_t to be encoded
* @param[out] buffer: buffer to fill byte-stream into
* @param[in] max_buffer_len: Max length allowed for writing bytestream to
* buffer
* @param[out] bytes_written_out: bytes written to bytestream
* @return bool True if decoding was successful, else false
*/
bool encode_xrp_result(const xrp_result_t *result,
uint8_t *buffer,
uint16_t max_buffer_len,
size_t *bytes_written_out);

/**
* @brief This API checks if the `which_request` field of the query of type
* `xrp_query_t` matches against the expected tag.
*
* @param query The query of type `xrp_query_t` to be checked
* @param exp_query_tag The expected tag of the query
* @return true If the query tag matches the expected tag
* @return false If the query tag does not match the expected tag
*/
bool check_xrp_query(const xrp_query_t *query, pb_size_t exp_query_tag);

/**
* @brief Returns zero initialized object of type
* xrp_result_t result_tag set in result.which_response field
*
* @param result_tag Result tag to be set in the xrp_result_t result
* @return xrp_result_t Result object of type xrp_result_t
*/
xrp_result_t init_xrp_result(pb_size_t result_tag);

/**
* @brief Send the error to the host.
*
* @param which_error The error type to be sent
* @param error_code The error code to sent to the host
*/
void xrp_send_error(pb_size_t which_error, uint32_t error_code);

/**
* @brief This API encodes xrp_result_t in protobuf structure.
* @details If the encoding is successful, then it sends the corresponding
* result to the host.
*
* The function ASSERTs the result of encode_xrp_result internally.
*
* @param result The result which needs to be sent to the host.
*/
void xrp_send_result(const xrp_result_t *result);

/**
* @brief This API receives request of type xrp_query_t of type
* exp_query_tag from the host.
*
* @param query The reference to which the query needs to be populated
* @param exp_query_tag The expected tag of the query
* @return true If the query was recieved from the host matching the tag
* @return false If the request timed out or the recieved request did not match
* the tag
*/
bool xrp_get_query(xrp_query_t *query, pb_size_t exp_query_tag);

#endif
Loading
Loading