NickG

cspock is alive

Feb 12th, 2014
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include "spocknet.h"
  5.  
  6. typedef struct {
  7.     int32_t protocol_version;
  8.     size_t addr_len;
  9.     char *server_addr;
  10.     uint16_t server_port;
  11.     uint8_t next_state;
  12. } hs00_t;
  13.  
  14. int encode_varint(int32_t varint, uint8_t *buf, size_t buf_len) {
  15.     int len = 0;
  16.     for(; varint >= 0x80; ++buf, ++len) {
  17.         if(len >= buf_len) {
  18.             return -1;
  19.         }
  20.         *buf = 0x80|(varint&0x7F);
  21.         varint >>= 7;
  22.     }
  23.     if(len >= buf_len) {
  24.         return -1;
  25.     }
  26.     *buf = varint;
  27.     return ++len;
  28. }
  29.  
  30. int encode_string(char *string, size_t size, uint8_t *buf, size_t buf_len) {
  31.     int ret = encode_varint(size, buf, buf_len);
  32.     if((ret < 0)||(ret + size > buf_len)) {
  33.         return -1;
  34.     }
  35.     memcpy(buf + ret, string, size);
  36.     return ret + size;
  37. }
  38.  
  39. int encode_plen(uint8_t *buf, size_t buf_len, uint8_t *pbuf, size_t pbuf_len) {
  40.     int ret = encode_varint(pbuf_len, buf, buf_len);
  41.     if(ret < 0) {
  42.         return ret;
  43.     } else if(ret + pbuf_len > buf_len) {
  44.         return -1;
  45.     }
  46.     memcpy(buf + ret, pbuf, pbuf_len);
  47.     return ret + pbuf_len;
  48. }
  49.  
  50. int encode_hs00(hs00_t *packet, uint8_t *buf, uint8_t *tbuf, size_t buf_len) {
  51.     if(buf_len < sizeof(uint8_t)) {
  52.         return -1;
  53.     }
  54.     int len = 1;
  55.     int ret;
  56.     *tbuf = 0x00;
  57.     ret = encode_varint(packet->protocol_version, tbuf + len, buf_len - len);
  58.     if(ret < 0) {
  59.         return ret;
  60.     }
  61.     len += ret;
  62.     ret = encode_string(packet->server_addr, packet->addr_len, tbuf + len,
  63.         buf_len - len);
  64.     if(ret < 0) {
  65.         return ret;
  66.     }
  67.     len += ret;
  68.     if(buf_len - len < sizeof(uint16_t) + sizeof(uint8_t)) {
  69.         return ret;
  70.     }
  71.     uint16_t port = hton16(packet->server_port);
  72.     memcpy(tbuf+len, &port, sizeof(port));
  73.     len += sizeof(port);
  74.     *(tbuf + len) = packet->next_state;
  75.     return encode_plen(buf, buf_len, tbuf, ++len);
  76. }
  77.  
  78. int ByteToHex(uint8_t *bytes, size_t len) {
  79.     size_t i;
  80.     for (i = 0; i < len; i++) {
  81.         if (i > 0) printf(" ");
  82.         printf("%02X", bytes[i]);
  83.     }
  84.     printf("\n");
  85. }
  86.  
  87. int main(int argc, char *argv[]) {
  88.     uint8_t buf[4096], tbuf[4096];
  89.     hs00_t handshake = {
  90.         .protocol_version = 5,
  91.         .addr_len         = strlen("nickg.org"),
  92.         .server_addr      = "nickg.org",
  93.         .server_port      = 25565,
  94.         .next_state       = 1
  95.     };
  96.     int ret = encode_hs00(&handshake, buf, tbuf, 4096);
  97.     printf("Bytes: %d\n", ret);
  98.     ByteToHex(buf, ret);
  99. }
Add Comment
Please, Sign In to add comment