Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / lwip / repo / lwip / src / include / netif / ppp / mppe.h
1 /*
2  * mppe.h - Definitions for MPPE
3  *
4  * Copyright (c) 2008 Paul Mackerras. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  *
18  * 3. The name(s) of the authors of this software must not be used to
19  *    endorse or promote products derived from this software without
20  *    prior written permission.
21  *
22  * 4. Redistributions of any form whatsoever must retain the following
23  *    acknowledgment:
24  *    "This product includes software developed by Paul Mackerras
25  *     <paulus@samba.org>".
26  *
27  * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
28  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
29  * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
30  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
31  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
32  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
33  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
34  */
35
36 #include "netif/ppp/ppp_opts.h"
37 #if PPP_SUPPORT && MPPE_SUPPORT  /* don't build if not configured for use in lwipopts.h */
38
39 #ifndef MPPE_H
40 #define MPPE_H
41
42 #include "netif/ppp/pppcrypt.h"
43
44 #define MPPE_PAD                4       /* MPPE growth per frame */
45 #define MPPE_MAX_KEY_LEN        16      /* largest key length (128-bit) */
46
47 /* option bits for ccp_options.mppe */
48 #define MPPE_OPT_40             0x01    /* 40 bit */
49 #define MPPE_OPT_128            0x02    /* 128 bit */
50 #define MPPE_OPT_STATEFUL       0x04    /* stateful mode */
51 /* unsupported opts */
52 #define MPPE_OPT_56             0x08    /* 56 bit */
53 #define MPPE_OPT_MPPC           0x10    /* MPPC compression */
54 #define MPPE_OPT_D              0x20    /* Unknown */
55 #define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D)
56 #define MPPE_OPT_UNKNOWN        0x40    /* Bits !defined in RFC 3078 were set */
57
58 /*
59  * This is not nice ... the alternative is a bitfield struct though.
60  * And unfortunately, we cannot share the same bits for the option
61  * names above since C and H are the same bit.  We could do a u_int32
62  * but then we have to do a lwip_htonl() all the time and/or we still need
63  * to know which octet is which.
64  */
65 #define MPPE_C_BIT              0x01    /* MPPC */
66 #define MPPE_D_BIT              0x10    /* Obsolete, usage unknown */
67 #define MPPE_L_BIT              0x20    /* 40-bit */
68 #define MPPE_S_BIT              0x40    /* 128-bit */
69 #define MPPE_M_BIT              0x80    /* 56-bit, not supported */
70 #define MPPE_H_BIT              0x01    /* Stateless (in a different byte) */
71
72 /* Does not include H bit; used for least significant octet only. */
73 #define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT)
74
75 /* Build a CI from mppe opts (see RFC 3078) */
76 #define MPPE_OPTS_TO_CI(opts, ci)               \
77     do {                                        \
78         u_char *ptr = ci; /* u_char[4] */       \
79                                                 \
80         /* H bit */                             \
81         if (opts & MPPE_OPT_STATEFUL)           \
82             *ptr++ = 0x0;                       \
83         else                                    \
84             *ptr++ = MPPE_H_BIT;                \
85         *ptr++ = 0;                             \
86         *ptr++ = 0;                             \
87                                                 \
88         /* S,L bits */                          \
89         *ptr = 0;                               \
90         if (opts & MPPE_OPT_128)                \
91             *ptr |= MPPE_S_BIT;                 \
92         if (opts & MPPE_OPT_40)                 \
93             *ptr |= MPPE_L_BIT;                 \
94         /* M,D,C bits not supported */          \
95     } while (/* CONSTCOND */ 0)
96
97 /* The reverse of the above */
98 #define MPPE_CI_TO_OPTS(ci, opts)               \
99     do {                                        \
100         const u_char *ptr = ci; /* u_char[4] */ \
101                                                 \
102         opts = 0;                               \
103                                                 \
104         /* H bit */                             \
105         if (!(ptr[0] & MPPE_H_BIT))             \
106             opts |= MPPE_OPT_STATEFUL;          \
107                                                 \
108         /* S,L bits */                          \
109         if (ptr[3] & MPPE_S_BIT)                \
110             opts |= MPPE_OPT_128;               \
111         if (ptr[3] & MPPE_L_BIT)                \
112             opts |= MPPE_OPT_40;                \
113                                                 \
114         /* M,D,C bits */                        \
115         if (ptr[3] & MPPE_M_BIT)                \
116             opts |= MPPE_OPT_56;                \
117         if (ptr[3] & MPPE_D_BIT)                \
118             opts |= MPPE_OPT_D;                 \
119         if (ptr[3] & MPPE_C_BIT)                \
120             opts |= MPPE_OPT_MPPC;              \
121                                                 \
122         /* Other bits */                        \
123         if (ptr[0] & ~MPPE_H_BIT)               \
124             opts |= MPPE_OPT_UNKNOWN;           \
125         if (ptr[1] || ptr[2])                   \
126             opts |= MPPE_OPT_UNKNOWN;           \
127         if (ptr[3] & ~MPPE_ALL_BITS)            \
128             opts |= MPPE_OPT_UNKNOWN;           \
129     } while (/* CONSTCOND */ 0)
130
131 /* Shared MPPE padding between MSCHAP and MPPE */
132 #define SHA1_PAD_SIZE 40
133
134 static const u8_t mppe_sha1_pad1[SHA1_PAD_SIZE] = {
135   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
136   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
139 };
140 static const u8_t mppe_sha1_pad2[SHA1_PAD_SIZE] = {
141   0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
142   0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
143   0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
144   0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2
145 };
146
147 /*
148  * State for an MPPE (de)compressor.
149  */
150 typedef struct ppp_mppe_state {
151         lwip_arc4_context arc4;
152         u8_t master_key[MPPE_MAX_KEY_LEN];
153         u8_t session_key[MPPE_MAX_KEY_LEN];
154         u8_t keylen;                /* key length in bytes */
155         /* NB: 128-bit == 16, 40-bit == 8!
156          * If we want to support 56-bit, the unit has to change to bits
157          */
158         u8_t bits;                  /* MPPE control bits */
159         u16_t ccount;               /* 12-bit coherency count (seqno)  */
160         u16_t sanity_errors;        /* take down LCP if too many */
161         unsigned int stateful  :1;  /* stateful mode flag */
162         unsigned int discard   :1;  /* stateful mode packet loss flag */
163 } ppp_mppe_state;
164
165 void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key);
166 void mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options);
167 void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state);
168 err_t mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol);
169 void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state);
170 err_t mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb);
171
172 #endif /* MPPE_H */
173 #endif /* PPP_SUPPORT && MPPE_SUPPORT */