1/* 2 * Copyright (C) 2008 Felix Fietkau <nbd@nbd.name> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 6 * as published by the Free Software Foundation 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 */ 13 14#ifndef __EAD_H 15#define __EAD_H 16 17#define EAD_DEBUGLEVEL 1 18 19#include <stdint.h> 20#include <stddef.h> 21 22#ifndef MAXSALTLEN 23#define MAXSALTLEN 32 24#endif 25 26#define EAD_PORT 56026UL 27#define EAD_MAGIC 3671771902UL 28#define EAD_CMD_TIMEOUT 10 29 30#define EAD_MAX_IV_INCR 128 31 32/* request/response types */ 33/* response id == request id + 1 */ 34enum ead_type { 35 EAD_TYPE_PING, 36 EAD_TYPE_PONG, 37 38 EAD_TYPE_SET_USERNAME, 39 EAD_TYPE_ACK_USERNAME, 40 41 EAD_TYPE_GET_PRIME, 42 EAD_TYPE_PRIME, 43 44 EAD_TYPE_SEND_A, 45 EAD_TYPE_SEND_B, 46 47 EAD_TYPE_SEND_AUTH, 48 EAD_TYPE_DONE_AUTH, 49 50 EAD_TYPE_SEND_CMD, 51 EAD_TYPE_RESULT_CMD, 52 53 EAD_TYPE_LAST 54}; 55 56enum ead_auth_type { 57 EAD_AUTH_DEFAULT, 58 EAD_AUTH_MD5 59}; 60 61enum ead_cmd_type { 62 EAD_CMD_NORMAL, 63 EAD_CMD_BACKGROUND, 64 EAD_CMD_LAST 65}; 66 67struct ead_msg_pong { 68 uint16_t auth_type; 69 char name[]; 70} __attribute__((packed)); 71 72struct ead_msg_number { 73 uint8_t id; 74 unsigned char data[]; 75} __attribute__((packed)); 76 77struct ead_msg_salt { 78 uint8_t prime; 79 uint8_t len; 80 unsigned char salt[MAXSALTLEN]; 81 unsigned char ext_salt[MAXSALTLEN]; 82} __attribute__((packed)); 83 84struct ead_msg_user { 85 char username[32]; 86} __attribute__((packed)); 87 88struct ead_msg_auth { 89 unsigned char data[20]; 90} __attribute__((packed)); 91 92struct ead_msg_cmd { 93 uint8_t type; 94 uint16_t timeout; 95 unsigned char data[]; 96} __attribute__((packed)); 97 98struct ead_msg_cmd_data { 99 uint8_t done; 100 unsigned char data[]; 101} __attribute__((packed)); 102 103struct ead_msg_encrypted { 104 uint32_t hash[5]; 105 uint32_t iv; 106 uint8_t pad; 107 union { 108 struct ead_msg_cmd cmd; 109 struct ead_msg_cmd_data cmd_data; 110 } data[]; 111} __attribute__((packed)); 112 113 114#define EAD_DATA(_msg, _type) (&((_msg)->data[0]._type)) 115#define EAD_ENC_DATA(_msg, _type) (&((_msg)->data[0].enc.data[0]._type)) 116 117/* for ead_msg::sid */ 118#define EAD_INSTANCE_MASK 0xf000 119#define EAD_INSTANCE_SHIFT 12 120 121struct ead_msg { 122 uint32_t magic; 123 uint32_t len; 124 uint32_t type; 125 uint16_t nid; /* node id */ 126 uint16_t sid; /* session id */ 127 uint32_t ip; /* source ip for responses from the server */ 128 union { 129 struct ead_msg_pong pong; 130 struct ead_msg_user user; 131 struct ead_msg_number number; 132 struct ead_msg_auth auth; 133 struct ead_msg_salt salt; 134 struct ead_msg_encrypted enc; 135 } data[]; 136} __attribute__((packed)); 137 138 139#endif 140