Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdint.h>
- #include <string.h>
- #include "spocknet.h"
- typedef struct {
- int32_t protocol_version;
- size_t addr_len;
- char *server_addr;
- uint16_t server_port;
- uint8_t next_state;
- } hs00_t;
- int encode_varint(int32_t varint, uint8_t *buf, size_t buf_len) {
- int len = 0;
- for(; varint >= 0x80; ++buf, ++len) {
- if(len >= buf_len) {
- return -1;
- }
- *buf = 0x80|(varint&0x7F);
- varint >>= 7;
- }
- if(len >= buf_len) {
- return -1;
- }
- *buf = varint;
- return ++len;
- }
- int encode_string(char *string, size_t size, uint8_t *buf, size_t buf_len) {
- int ret = encode_varint(size, buf, buf_len);
- if((ret < 0)||(ret + size > buf_len)) {
- return -1;
- }
- memcpy(buf + ret, string, size);
- return ret + size;
- }
- int encode_plen(uint8_t *buf, size_t buf_len, uint8_t *pbuf, size_t pbuf_len) {
- int ret = encode_varint(pbuf_len, buf, buf_len);
- if(ret < 0) {
- return ret;
- } else if(ret + pbuf_len > buf_len) {
- return -1;
- }
- memcpy(buf + ret, pbuf, pbuf_len);
- return ret + pbuf_len;
- }
- int encode_hs00(hs00_t *packet, uint8_t *buf, uint8_t *tbuf, size_t buf_len) {
- if(buf_len < sizeof(uint8_t)) {
- return -1;
- }
- int len = 1;
- int ret;
- *tbuf = 0x00;
- ret = encode_varint(packet->protocol_version, tbuf + len, buf_len - len);
- if(ret < 0) {
- return ret;
- }
- len += ret;
- ret = encode_string(packet->server_addr, packet->addr_len, tbuf + len,
- buf_len - len);
- if(ret < 0) {
- return ret;
- }
- len += ret;
- if(buf_len - len < sizeof(uint16_t) + sizeof(uint8_t)) {
- return ret;
- }
- uint16_t port = hton16(packet->server_port);
- memcpy(tbuf+len, &port, sizeof(port));
- len += sizeof(port);
- *(tbuf + len) = packet->next_state;
- return encode_plen(buf, buf_len, tbuf, ++len);
- }
- int ByteToHex(uint8_t *bytes, size_t len) {
- size_t i;
- for (i = 0; i < len; i++) {
- if (i > 0) printf(" ");
- printf("%02X", bytes[i]);
- }
- printf("\n");
- }
- int main(int argc, char *argv[]) {
- uint8_t buf[4096], tbuf[4096];
- hs00_t handshake = {
- .protocol_version = 5,
- .addr_len = strlen("nickg.org"),
- .server_addr = "nickg.org",
- .server_port = 25565,
- .next_state = 1
- };
- int ret = encode_hs00(&handshake, buf, tbuf, 4096);
- printf("Bytes: %d\n", ret);
- ByteToHex(buf, ret);
- }
Add Comment
Please, Sign In to add comment