^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #define MPPE_PAD 4 /* MPPE growth per frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define MPPE_MAX_KEY_LEN 16 /* largest key length (128-bit) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /* option bits for ccp_options.mppe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #define MPPE_OPT_40 0x01 /* 40 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define MPPE_OPT_128 0x02 /* 128 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define MPPE_OPT_STATEFUL 0x04 /* stateful mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /* unsupported opts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define MPPE_OPT_56 0x08 /* 56 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define MPPE_OPT_MPPC 0x10 /* MPPC compression */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define MPPE_OPT_D 0x20 /* Unknown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define MPPE_OPT_UNKNOWN 0x40 /* Bits !defined in RFC 3078 were set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * This is not nice ... the alternative is a bitfield struct though.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * And unfortunately, we cannot share the same bits for the option
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * names above since C and H are the same bit. We could do a u_int32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * but then we have to do a htonl() all the time and/or we still need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * to know which octet is which.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define MPPE_C_BIT 0x01 /* MPPC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define MPPE_D_BIT 0x10 /* Obsolete, usage unknown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define MPPE_L_BIT 0x20 /* 40-bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define MPPE_S_BIT 0x40 /* 128-bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define MPPE_M_BIT 0x80 /* 56-bit, not supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define MPPE_H_BIT 0x01 /* Stateless (in a different byte) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /* Does not include H bit; used for least significant octet only. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /* Build a CI from mppe opts (see RFC 3078) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define MPPE_OPTS_TO_CI(opts, ci) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) u_char *ptr = ci; /* u_char[4] */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* H bit */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) if (opts & MPPE_OPT_STATEFUL) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) *ptr++ = 0x0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) *ptr++ = MPPE_H_BIT; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) *ptr++ = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) *ptr++ = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /* S,L bits */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) *ptr = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) if (opts & MPPE_OPT_128) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) *ptr |= MPPE_S_BIT; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) if (opts & MPPE_OPT_40) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) *ptr |= MPPE_L_BIT; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* M,D,C bits not supported */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) } while (/* CONSTCOND */ 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /* The reverse of the above */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define MPPE_CI_TO_OPTS(ci, opts) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) u_char *ptr = ci; /* u_char[4] */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) opts = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* H bit */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) if (!(ptr[0] & MPPE_H_BIT)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) opts |= MPPE_OPT_STATEFUL; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* S,L bits */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (ptr[3] & MPPE_S_BIT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) opts |= MPPE_OPT_128; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (ptr[3] & MPPE_L_BIT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) opts |= MPPE_OPT_40; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* M,D,C bits */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) if (ptr[3] & MPPE_M_BIT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) opts |= MPPE_OPT_56; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) if (ptr[3] & MPPE_D_BIT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) opts |= MPPE_OPT_D; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if (ptr[3] & MPPE_C_BIT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) opts |= MPPE_OPT_MPPC; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* Other bits */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) if (ptr[0] & ~MPPE_H_BIT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) opts |= MPPE_OPT_UNKNOWN; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) if (ptr[1] || ptr[2]) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) opts |= MPPE_OPT_UNKNOWN; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (ptr[3] & ~MPPE_ALL_BITS) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) opts |= MPPE_OPT_UNKNOWN; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) } while (/* CONSTCOND */ 0)