diff options
Diffstat (limited to 'client/client.c')
| -rw-r--r-- | client/client.c | 69 |
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 |
