diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index e0783ef..14b334c 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -22,7 +22,8 @@ set(SOURCE_FILES src/rpcrypt.c src/takion.c src/senkusha.c - src/utils.h) + src/utils.h + src/pb_utils.h) add_subdirectory(protobuf) include_directories("${NANOPB_SOURCE_DIR}") @@ -39,4 +40,6 @@ find_package(Threads) target_link_libraries(chiaki-lib Threads::Threads) find_package(OpenSSL REQUIRED) -target_link_libraries(chiaki-lib OpenSSL::Crypto) \ No newline at end of file +target_link_libraries(chiaki-lib OpenSSL::Crypto) + +target_link_libraries(chiaki-lib protobuf-nanopb-static) \ No newline at end of file diff --git a/lib/include/chiaki/takion.h b/lib/include/chiaki/takion.h index 340ed39..3fca1ef 100644 --- a/lib/include/chiaki/takion.h +++ b/lib/include/chiaki/takion.h @@ -62,7 +62,7 @@ typedef struct chiaki_takion_t CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_connect(ChiakiTakion *takion, ChiakiTakionConnectInfo *info); CHIAKI_EXPORT void chiaki_takion_close(ChiakiTakion *takion); CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send_raw(ChiakiTakion *takion, uint8_t *buf, size_t buf_size); -CHIAKI_EXPORT ChiakiErrorCode chiaki_send_message_data(ChiakiTakion *takion, uint8_t *buf, size_t buf_size); +CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send_message_data(ChiakiTakion *takion, uint32_t key_pos, uint8_t type_b, uint16_t channel, uint8_t *buf, size_t buf_size); #ifdef __cplusplus } diff --git a/lib/src/pb_utils.h b/lib/src/pb_utils.h new file mode 100644 index 0000000..ecc7a5f --- /dev/null +++ b/lib/src/pb_utils.h @@ -0,0 +1,33 @@ +/* + * This file is part of Chiaki. + * + * Chiaki is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Chiaki is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chiaki. If not, see . + */ + +#ifndef CHIAKI_PB_UTILS_H +#define CHIAKI_PB_UTILS_H + +#include + +bool chiaki_pb_encode_string(pb_ostream_t *stream, const pb_field_t *field, void *const *arg) +{ + char *str = *arg; + + if (!pb_encode_tag_for_field(stream, field)) + return false; + + return pb_encode_string(stream, (uint8_t*)str, strlen(str)); +} + +#endif // CHIAKI_PB_UTILS_H diff --git a/lib/src/senkusha.c b/lib/src/senkusha.c index abeea4a..8cb7910 100644 --- a/lib/src/senkusha.c +++ b/lib/src/senkusha.c @@ -25,6 +25,11 @@ #include #include "utils.h" +#include "pb_utils.h" + +#include +#include +#include #define SENKUSHA_SOCKET 9297 @@ -37,7 +42,8 @@ typedef struct senkusha_t } Senkusha; -void senkusha_takion_data(uint8_t *buf, size_t buf_size, void *user); +static void senkusha_takion_data(uint8_t *buf, size_t buf_size, void *user); +static ChiakiErrorCode senkusha_send_big(Senkusha *senkusha); CHIAKI_EXPORT ChiakiErrorCode chiaki_senkusha_run(ChiakiSession *session) { @@ -65,16 +71,61 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_senkusha_run(ChiakiSession *session) return err; } + CHIAKI_LOGI(&session->log, "Senkusha sending big\n"); + + err = senkusha_send_big(&senkusha); + if(err != CHIAKI_ERR_SUCCESS) + { + CHIAKI_LOGE(&session->log, "Senkusha failed to send big\n"); + return err; + // TODO: close takion + } + while(true) sleep(1); return CHIAKI_ERR_SUCCESS; } -void senkusha_takion_data(uint8_t *buf, size_t buf_size, void *user) +static void senkusha_takion_data(uint8_t *buf, size_t buf_size, void *user) { Senkusha *senkusha = user; CHIAKI_LOGD(senkusha->log, "Senkusha received data:\n"); chiaki_log_hexdump(senkusha->log, CHIAKI_LOG_DEBUG, buf, buf_size); -} \ No newline at end of file +} + +static ChiakiErrorCode senkusha_send_big(Senkusha *senkusha) +{ + tkproto_TakionMessage msg; + memset(&msg, 0, sizeof(msg)); + CHIAKI_LOGD(senkusha->log, "sizeof(tkproto_TakionMessage) = %lu\n", sizeof(tkproto_TakionMessage)); + + msg.type = tkproto_TakionMessage_PayloadType_BIG; + msg.has_big_payload = true; + msg.big_payload.client_version = 7; + msg.big_payload.session_key.arg = ""; + msg.big_payload.session_key.funcs.encode = chiaki_pb_encode_string; + msg.big_payload.launch_spec.arg = ""; + msg.big_payload.launch_spec.funcs.encode = chiaki_pb_encode_string; + msg.big_payload.encrypted_key.arg = ""; + msg.big_payload.encrypted_key.funcs.encode = chiaki_pb_encode_string; + + uint8_t buf[512]; + size_t buf_size; + + pb_ostream_t stream = pb_ostream_from_buffer(buf, sizeof(buf)); + bool pbr = pb_encode(&stream, tkproto_TakionMessage_fields, &msg); + if(!pbr) + { + CHIAKI_LOGE(senkusha->log, "Senkusha big protobuf encoding failed\n"); + return CHIAKI_ERR_UNKNOWN; + } + + buf_size = stream.bytes_written; + ChiakiErrorCode err = chiaki_takion_send_message_data(&senkusha->takion, 0, 1, 1, buf, buf_size); + + return err; +} + + diff --git a/lib/src/takion.c b/lib/src/takion.c index 42e243a..bd0189c 100644 --- a/lib/src/takion.c +++ b/lib/src/takion.c @@ -140,7 +140,7 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_connect(ChiakiTakion *takion, Chiaki init_payload.something = TAKION_LOCAL_SOMETHING; init_payload.min = TAKION_LOCAL_MIN; init_payload.max = TAKION_LOCAL_MIN; - init_payload.tag1 = takion->tag_remote; + init_payload.tag1 = takion->tag_local; ChiakiErrorCode err = takion_send_message_init(takion, &init_payload); if(err != CHIAKI_ERR_SUCCESS) { @@ -395,11 +395,11 @@ static ChiakiErrorCode takion_parse_message(ChiakiTakion *takion, uint8_t *buf, return CHIAKI_ERR_INVALID_DATA; } - msg->tag = htonl(*((uint32_t *)buf)); - msg->key_pos = htonl(*((uint32_t *)(buf + 0x8))); + msg->tag = ntohl(*((uint32_t *)buf)); + msg->key_pos = ntohl(*((uint32_t *)(buf + 0x8))); msg->type_a = buf[0xc]; msg->type_b = buf[0xd]; - msg->payload_size = htons(*((uint16_t *)(buf + 0xe))); + msg->payload_size = ntohs(*((uint16_t *)(buf + 0xe))); if(msg->tag != takion->tag_local) { @@ -490,11 +490,11 @@ static ChiakiErrorCode takion_recv_message_init_ack(ChiakiTakion *takion, Takion assert(msg.payload_size == 0x10 + TAKION_COOKIE_SIZE); uint8_t *pl = msg.payload; - payload->tag = htonl(*((uint32_t *)(pl + 0))); - payload->unknown0 = htonl(*((uint32_t *)(pl + 4))); - payload->min = htons(*((uint16_t *)(pl + 8))); - payload->max = htons(*((uint16_t *)(pl + 0xa))); - payload->unknown1 = htonl(*((uint16_t *)(pl + 0xc))); + payload->tag = ntohl(*((uint32_t *)(pl + 0))); + payload->unknown0 = ntohl(*((uint32_t *)(pl + 4))); + payload->min = ntohs(*((uint16_t *)(pl + 8))); + payload->max = ntohs(*((uint16_t *)(pl + 0xa))); + payload->unknown1 = ntohl(*((uint16_t *)(pl + 0xc))); memcpy(payload->cookie, pl + 0x10, TAKION_COOKIE_SIZE); return CHIAKI_ERR_SUCCESS;