41#if PPP_SUPPORT && MPPE_SUPPORT
53#define MPPE_MAX_KEY_LEN 16
56#define MPPE_OPT_40 0x01
57#define MPPE_OPT_128 0x02
58#define MPPE_OPT_STATEFUL 0x04
60#define MPPE_OPT_56 0x08
61#define MPPE_OPT_MPPC 0x10
62#define MPPE_OPT_D 0x20
63#define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D)
64#define MPPE_OPT_UNKNOWN 0x40
73#define MPPE_C_BIT 0x01
74#define MPPE_D_BIT 0x10
75#define MPPE_L_BIT 0x20
76#define MPPE_S_BIT 0x40
77#define MPPE_M_BIT 0x80
78#define MPPE_H_BIT 0x01
81#define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT)
84#define MPPE_OPTS_TO_CI(opts, ci) \
89 if (opts & MPPE_OPT_STATEFUL) \
92 *ptr++ = MPPE_H_BIT; \
98 if (opts & MPPE_OPT_128) \
100 if (opts & MPPE_OPT_40) \
101 *ptr |= MPPE_L_BIT; \
106#define MPPE_CI_TO_OPTS(ci, opts) \
108 const u_char *ptr = ci; \
113 if (!(ptr[0] & MPPE_H_BIT)) \
114 opts |= MPPE_OPT_STATEFUL; \
117 if (ptr[3] & MPPE_S_BIT) \
118 opts |= MPPE_OPT_128; \
119 if (ptr[3] & MPPE_L_BIT) \
120 opts |= MPPE_OPT_40; \
123 if (ptr[3] & MPPE_M_BIT) \
124 opts |= MPPE_OPT_56; \
125 if (ptr[3] & MPPE_D_BIT) \
126 opts |= MPPE_OPT_D; \
127 if (ptr[3] & MPPE_C_BIT) \
128 opts |= MPPE_OPT_MPPC; \
131 if (ptr[0] & ~MPPE_H_BIT) \
132 opts |= MPPE_OPT_UNKNOWN; \
133 if (ptr[1] || ptr[2]) \
134 opts |= MPPE_OPT_UNKNOWN; \
135 if (ptr[3] & ~MPPE_ALL_BITS) \
136 opts |= MPPE_OPT_UNKNOWN; \
140#define SHA1_PAD_SIZE 40
142static const u8_t mppe_sha1_pad1[SHA1_PAD_SIZE] = {
143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
148static const u8_t mppe_sha1_pad2[SHA1_PAD_SIZE] = {
149 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
150 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
151 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
152 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2
158typedef struct ppp_mppe_state {
159 lwip_arc4_context arc4;
160 u8_t master_key[MPPE_MAX_KEY_LEN];
161 u8_t session_key[MPPE_MAX_KEY_LEN];
169 unsigned int stateful :1;
170 unsigned int discard :1;
173void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key);
174void mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options);
175void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state);
176err_t mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state,
struct pbuf **pb, u16_t protocol);
177void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state);
178err_t mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state,
struct pbuf **pb);