summaryrefslogtreecommitdiff
path: root/client/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/client.c')
-rw-r--r--client/client.c69
1 files changed, 68 insertions, 1 deletions
diff --git a/client/client.c b/client/client.c
index bac1b6e..155d895 100644
--- a/client/client.c
+++ b/client/client.c
@@ -525,4 +525,71 @@ struct data_packet mp_run_pow(struct data_packet packet, byte leading_zeros) {
return packet;
}
-keypair mp_generate_keypair(void) { return generate_keypair(); } \ No newline at end of file
+keypair mp_generate_keypair(void) { return generate_keypair(); }
+
+mp_client_error_t mp_query_author_packets(
+ const char *ip,
+ int port,
+ keypair author_keys,
+ uint16_t count,
+ uint64_t offset,
+ struct data_packet_list *out_list) {
+ byte msg[ 32 + 32 + 2 + 8 ];
+ memcpy(msg, author_keys.encryption_pub, 32);
+ memcpy(msg + 32, author_keys.signing_pub, 32);
+ write_u16_le(msg + 64, count);
+ write_u64_le(msg + 66, offset);
+ byte sig[ 64 ];
+ if (crypto_sign_detached(sig, NULL, msg, sizeof(msg), author_keys.signing_priv) != 0) {
+ return MP_CLIENT_ERROR_BAD_ARGUMENT;
+ }
+ const size_t send_len = 1 + 32 + 32 + 64 + 2 + 8;
+ byte *send_data = malloc(send_len);
+ if (!send_data) return MP_CLIENT_ERROR_ALLOC_FAILED;
+ size_t off = 0;
+ send_data[ off++ ] = query_packets;
+ memcpy(send_data + off, author_keys.encryption_pub, 32);
+ off += 32;
+ memcpy(send_data + off, author_keys.signing_pub, 32);
+ off += 32;
+ memcpy(send_data + off, sig, 64);
+ off += 64;
+ write_u16_le(send_data + off, count);
+ off += 2;
+ write_u64_le(send_data + off, offset);
+ off += 8;
+ byte *response = NULL;
+ size_t resp_len = 0;
+ mp_client_error_t ret = mp_client_request(ip, port, send_data, send_len, &response, &resp_len);
+ free(send_data);
+ if (ret != MP_CLIENT_SUCCESS) {
+ free(response);
+ return ret;
+ }
+ if (resp_len < 11 || response[ 0 ] != queried_author_packets) {
+ free(response);
+ return MP_CLIENT_ERROR_INVALID_RESPONSE;
+ }
+ uint16_t resp_count = read_u16_le(response + 1);
+ uint64_t new_offset = read_u64_le(response + 3);
+ size_t expected_len = 11 + (size_t) resp_count * PACKET_SIZE;
+ if (resp_len != expected_len) {
+ free(response);
+ return MP_CLIENT_ERROR_INVALID_RESPONSE;
+ }
+ out_list->packets = malloc((size_t) resp_count * sizeof(struct data_packet));
+ if (!out_list->packets) {
+ free(response);
+ return MP_CLIENT_ERROR_ALLOC_FAILED;
+ }
+ out_list->count = 0;
+ out_list->new_offset = new_offset;
+ for (uint16_t i = 0; i < resp_count; ++i) {
+ bool success;
+ struct data_packet packet
+ = s2data_packet(PACKET_SIZE, response + 11 + (size_t) i * PACKET_SIZE, &success);
+ if (success) { out_list->packets[ out_list->count++ ] = packet; }
+ }
+ free(response);
+ return MP_CLIENT_SUCCESS;
+} \ No newline at end of file