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