/*
- * ==FILEVERSION 20020320==
+ * ==FILEVERSION 20020521==
*
* ppp_mppe_compress.c - interface MPPE to the PPP code.
- * This version is for use with Linux kernel 2.2.x (ppp driver 2.3.x).
+ * This version is for use with Linux kernel 2.2.19+ and 2.4.x.
*
* By Frank Cusack <frank@google.com>.
* Copyright (c) 2002 Google, Inc.
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/string.h>
#include <linux/ppp_defs.h>
#define MPPE_CCOUNT(p) ((((p)[4] & 0x0f) << 8) + (p)[5])
#define MPPE_CCOUNT_SPACE 0x1000 /* The size of the ccount space */
-/*
- * MPPE overhead/packet.
- * Note that we use this differently than other compressors.
- */
#define MPPE_OVHD 2 /* MPPE overhead/packet */
-/* Max bogon factor we will tolerate */
-#define SANITY_MAX 1600
+#define SANITY_MAX 1600 /* Max bogon factor we will tolerate */
static void GetNewKeyFromSHA __P((unsigned char *StartKey,
unsigned char *SessionKey,
if (debug) {
int i;
- char mkey[sizeof(state->master_key) * 3 + 1];
- char skey[sizeof(state->session_key) * 3 + 1];
+ char mkey[sizeof(state->master_key) * 2 + 1];
+ char skey[sizeof(state->session_key) * 2 + 1];
printk(KERN_DEBUG "%s[%d]: initialized with %d-bit %s mode\n", debugstr,
unit, (state->keylen == 16)? 128: 40,
(state->stateful)? "stateful": "stateless");
for (i = 0; i < sizeof(state->master_key); i++)
- sprintf(mkey + i * 2, "%.2x ", state->master_key[i]);
+ sprintf(mkey + i * 2, "%.2x", state->master_key[i]);
for (i = 0; i < sizeof(state->session_key); i++)
- sprintf(skey + i * 2, "%.2x ", state->session_key[i]);
+ sprintf(skey + i * 2, "%.2x", state->session_key[i]);
printk(KERN_DEBUG "%s[%d]: keys: master: %s initial session: %s\n",
debugstr, unit, mkey, skey);
}
state->unit, isize);
return DECOMP_ERROR;
}
- /* Strange ... our output size is always LESS than the input size. */
- /* assert(osize >= isize - MPPE_OVHD - 2); */
+ /* Make sure we have enough room to decrypt the packet. */
+ if (osize < isize - MPPE_OVHD - 2) {
+ printk(KERN_DEBUG "mppe_decompress[%d]: osize too small! "
+ "(have: %d need: %d)\n", state->unit,
+ osize, isize - MPPE_OVHD - 2);
+ return DECOMP_ERROR;
+ }
osize = isize - MPPE_OVHD - 2;
ccount = MPPE_CCOUNT(ibuf);
* comes from the decrypted data.
*/
obuf[0] = PPP_ADDRESS(ibuf); /* +1 */
- obuf[1] = PPP_CONTROL(ibuf); /* +2 */
+ obuf[1] = PPP_CONTROL(ibuf); /* +1 */
obuf += 2;
ibuf += PPP_HDRLEN + MPPE_OVHD;
isize -= PPP_HDRLEN + MPPE_OVHD; /* -6 */
- /* net: -4 */
+ /* net osize: isize-4 */
/* And finally, decrypt the packet. */
arcfour_decrypt(&state->arcfour_context, ibuf, isize, obuf);
* Module interface table
*************************************************************/
-/* These are in ppp.c */
+/* These are in ppp.c (2.2.x) or ppp_generic.c (2.4.x) */
extern int ppp_register_compressor (struct compressor *cp);
extern void ppp_unregister_compressor (struct compressor *cp);
mppe_comp_stats, /* decomp_stat */
};
-__initfunc(int ppp_mppe_install(void))
+/* 2.2 compatibility defines */
+#ifndef __init
+#define __init
+#endif
+#ifndef __exit
+#define __exit
+#endif
+#ifndef MODULE_LICENSE
+#define MODULE_LICENSE(license)
+#endif
+
+int __init
+ppp_mppe_init(void)
{
int answer = ppp_register_compressor(&ppp_mppe);
return answer;
}
-#ifdef MODULE
-
-int
-init_module(void)
+void __exit
+ppp_mppe_cleanup(void)
{
- return ppp_mppe_install();
+ ppp_unregister_compressor(&ppp_mppe);
}
-
-void
-cleanup_module(void)
-{
- if (MOD_IN_USE)
- printk(KERN_INFO "PPP MPPE Compression module busy\n");
- else
- ppp_unregister_compressor(&ppp_mppe);
-}
-#endif
+
+module_init(ppp_mppe_init);
+module_exit(ppp_mppe_cleanup);
+MODULE_LICENSE("BSD without advertisement clause");