mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-05 22:29:49 +00:00
PPP, switched chap_digests linked list to a const table in .rodata/flash, saving about 100 bytes in .data segment if chap(md5) and mschap is enabled
This commit is contained in:
parent
e5a554f0b5
commit
7f97e354b4
@ -31,6 +31,6 @@
|
|||||||
#include "lwip/opt.h"
|
#include "lwip/opt.h"
|
||||||
#if PPP_SUPPORT && CHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */
|
#if PPP_SUPPORT && CHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
extern void chap_md5_init(void);
|
extern const struct chap_digest_type md5_digest;
|
||||||
|
|
||||||
#endif /* PPP_SUPPORT && CHAP_SUPPORT */
|
#endif /* PPP_SUPPORT && CHAP_SUPPORT */
|
||||||
|
@ -143,8 +143,6 @@ struct chap_digest_type {
|
|||||||
unsigned char *priv);
|
unsigned char *priv);
|
||||||
int (*check_success)(unsigned char *pkt, int len, unsigned char *priv);
|
int (*check_success)(unsigned char *pkt, int len, unsigned char *priv);
|
||||||
void (*handle_failure)(unsigned char *pkt, int len);
|
void (*handle_failure)(unsigned char *pkt, int len);
|
||||||
|
|
||||||
struct chap_digest_type *next;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -154,7 +152,7 @@ struct chap_digest_type {
|
|||||||
typedef struct chap_client_state {
|
typedef struct chap_client_state {
|
||||||
u8_t flags;
|
u8_t flags;
|
||||||
char *name;
|
char *name;
|
||||||
struct chap_digest_type *digest;
|
const struct chap_digest_type *digest;
|
||||||
unsigned char priv[64]; /* private area for digest's use */
|
unsigned char priv[64]; /* private area for digest's use */
|
||||||
} chap_client_state;
|
} chap_client_state;
|
||||||
|
|
||||||
@ -163,7 +161,7 @@ typedef struct chap_server_state {
|
|||||||
u8_t flags;
|
u8_t flags;
|
||||||
int id;
|
int id;
|
||||||
char *name;
|
char *name;
|
||||||
struct chap_digest_type *digest;
|
const struct chap_digest_type *digest;
|
||||||
int challenge_xmits;
|
int challenge_xmits;
|
||||||
int challenge_pktlen;
|
int challenge_pktlen;
|
||||||
unsigned char challenge[CHAL_MAX_PKTLEN];
|
unsigned char challenge[CHAL_MAX_PKTLEN];
|
||||||
@ -175,14 +173,11 @@ typedef struct chap_server_state {
|
|||||||
#if 0 /* UNUSED */
|
#if 0 /* UNUSED */
|
||||||
/* Hook for a plugin to validate CHAP challenge */
|
/* Hook for a plugin to validate CHAP challenge */
|
||||||
extern int (*chap_verify_hook)(char *name, char *ourname, int id,
|
extern int (*chap_verify_hook)(char *name, char *ourname, int id,
|
||||||
struct chap_digest_type *digest,
|
const struct chap_digest_type *digest,
|
||||||
unsigned char *challenge, unsigned char *response,
|
unsigned char *challenge, unsigned char *response,
|
||||||
char *message, int message_space);
|
char *message, int message_space);
|
||||||
#endif /* UNUSED */
|
#endif /* UNUSED */
|
||||||
|
|
||||||
/* Called by digest code to register a digest type */
|
|
||||||
extern void chap_register_digest(struct chap_digest_type *);
|
|
||||||
|
|
||||||
#if PPP_SERVER
|
#if PPP_SERVER
|
||||||
/* Called by authentication code to start authenticating the peer. */
|
/* Called by authentication code to start authenticating the peer. */
|
||||||
extern void chap_auth_peer(ppp_pcb *pcb, char *our_name, int digest_code);
|
extern void chap_auth_peer(ppp_pcb *pcb, char *our_name, int digest_code);
|
||||||
|
@ -106,7 +106,8 @@ void GenerateAuthenticatorResponse(u_char PasswordHashHash[MD4_SIGNATURE_SIZE],
|
|||||||
u_char *rchallenge, char *username,
|
u_char *rchallenge, char *username,
|
||||||
u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]);
|
u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]);
|
||||||
|
|
||||||
void chapms_init(void);
|
extern const struct chap_digest_type chapms_digest;
|
||||||
|
extern const struct chap_digest_type chapms2_digest;
|
||||||
|
|
||||||
#define __CHAPMS_INCLUDE__
|
#define __CHAPMS_INCLUDE__
|
||||||
#endif /* __CHAPMS_INCLUDE__ */
|
#endif /* __CHAPMS_INCLUDE__ */
|
||||||
|
@ -107,7 +107,7 @@ static void chap_md5_make_response(unsigned char *response, int id, char *our_na
|
|||||||
response[0] = MD5_HASH_SIZE;
|
response[0] = MD5_HASH_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct chap_digest_type md5_digest = {
|
const struct chap_digest_type md5_digest = {
|
||||||
CHAP_MD5, /* code */
|
CHAP_MD5, /* code */
|
||||||
#if PPP_SERVER
|
#if PPP_SERVER
|
||||||
chap_md5_generate_challenge,
|
chap_md5_generate_challenge,
|
||||||
@ -118,8 +118,4 @@ static struct chap_digest_type md5_digest = {
|
|||||||
NULL, /* handle_failure */
|
NULL, /* handle_failure */
|
||||||
};
|
};
|
||||||
|
|
||||||
void chap_md5_init(void) {
|
|
||||||
chap_register_digest(&md5_digest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* PPP_SUPPORT && CHAP_SUPPORT */
|
#endif /* PPP_SUPPORT && CHAP_SUPPORT */
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
/* Hook for a plugin to validate CHAP challenge */
|
/* Hook for a plugin to validate CHAP challenge */
|
||||||
int (*chap_verify_hook)(char *name, char *ourname, int id,
|
int (*chap_verify_hook)(char *name, char *ourname, int id,
|
||||||
struct chap_digest_type *digest,
|
const struct chap_digest_type *digest,
|
||||||
unsigned char *challenge, unsigned char *response,
|
unsigned char *challenge, unsigned char *response,
|
||||||
char *message, int message_space) = NULL;
|
char *message, int message_space) = NULL;
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ static void chap_generate_challenge(ppp_pcb *pcb);
|
|||||||
static void chap_handle_response(ppp_pcb *pcb, int code,
|
static void chap_handle_response(ppp_pcb *pcb, int code,
|
||||||
unsigned char *pkt, int len);
|
unsigned char *pkt, int len);
|
||||||
static int chap_verify_response(char *name, char *ourname, int id,
|
static int chap_verify_response(char *name, char *ourname, int id,
|
||||||
struct chap_digest_type *digest,
|
const struct chap_digest_type *digest,
|
||||||
unsigned char *challenge, unsigned char *response,
|
unsigned char *challenge, unsigned char *response,
|
||||||
char *message, int message_space);
|
char *message, int message_space);
|
||||||
#endif /* PPP_SERVER */
|
#endif /* PPP_SERVER */
|
||||||
@ -106,7 +106,14 @@ static int chap_print_pkt(unsigned char *p, int plen,
|
|||||||
#endif /* PRINTPKT_SUPPORT */
|
#endif /* PRINTPKT_SUPPORT */
|
||||||
|
|
||||||
/* List of digest types that we know about */
|
/* List of digest types that we know about */
|
||||||
static struct chap_digest_type *chap_digests;
|
const static struct chap_digest_type* const chap_digests[] = {
|
||||||
|
&md5_digest,
|
||||||
|
#if MSCHAP_SUPPORT
|
||||||
|
&chapms_digest,
|
||||||
|
&chapms2_digest,
|
||||||
|
#endif /* MSCHAP_SUPPORT */
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* chap_init - reset to initial state.
|
* chap_init - reset to initial state.
|
||||||
@ -117,19 +124,6 @@ static void chap_init(ppp_pcb *pcb) {
|
|||||||
#if PPP_SERVER
|
#if PPP_SERVER
|
||||||
memset(&pcb->chap_server, 0, sizeof(chap_server_state));
|
memset(&pcb->chap_server, 0, sizeof(chap_server_state));
|
||||||
#endif /* PPP_SERVER */
|
#endif /* PPP_SERVER */
|
||||||
|
|
||||||
chap_md5_init();
|
|
||||||
#if MSCHAP_SUPPORT
|
|
||||||
chapms_init();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add a new digest type to the list.
|
|
||||||
*/
|
|
||||||
void chap_register_digest(struct chap_digest_type *dp) {
|
|
||||||
dp->next = chap_digests;
|
|
||||||
chap_digests = dp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -163,13 +157,14 @@ static void chap_lowerdown(ppp_pcb *pcb) {
|
|||||||
*/
|
*/
|
||||||
void chap_auth_peer(ppp_pcb *pcb, char *our_name, int digest_code) {
|
void chap_auth_peer(ppp_pcb *pcb, char *our_name, int digest_code) {
|
||||||
struct chap_server_state *ss = &pcb->chap_server;
|
struct chap_server_state *ss = &pcb->chap_server;
|
||||||
struct chap_digest_type *dp;
|
const struct chap_digest_type *dp;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (pcb->chap_server.flags & AUTH_STARTED) {
|
if (pcb->chap_server.flags & AUTH_STARTED) {
|
||||||
ppp_error("CHAP: peer authentication already started!");
|
ppp_error("CHAP: peer authentication already started!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (dp = chap_digests; dp != NULL; dp = dp->next)
|
for (i = 0; (dp = chap_digests[i]) != NULL; ++i)
|
||||||
if (dp->code == digest_code)
|
if (dp->code == digest_code)
|
||||||
break;
|
break;
|
||||||
if (dp == NULL)
|
if (dp == NULL)
|
||||||
@ -191,7 +186,8 @@ void chap_auth_peer(ppp_pcb *pcb, char *our_name, int digest_code) {
|
|||||||
* There isn't much to do until we receive a challenge.
|
* There isn't much to do until we receive a challenge.
|
||||||
*/
|
*/
|
||||||
void chap_auth_with_peer(ppp_pcb *pcb, char *our_name, int digest_code) {
|
void chap_auth_with_peer(ppp_pcb *pcb, char *our_name, int digest_code) {
|
||||||
struct chap_digest_type *dp;
|
const struct chap_digest_type *dp;
|
||||||
|
int i;
|
||||||
|
|
||||||
if(NULL == our_name)
|
if(NULL == our_name)
|
||||||
return;
|
return;
|
||||||
@ -200,9 +196,10 @@ void chap_auth_with_peer(ppp_pcb *pcb, char *our_name, int digest_code) {
|
|||||||
ppp_error("CHAP: authentication with peer already started!");
|
ppp_error("CHAP: authentication with peer already started!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (dp = chap_digests; dp != NULL; dp = dp->next)
|
for (i = 0; (dp = chap_digests[i]) != NULL; ++i)
|
||||||
if (dp->code == digest_code)
|
if (dp->code == digest_code)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (dp == NULL)
|
if (dp == NULL)
|
||||||
ppp_fatal("CHAP digest 0x%x requested but not available",
|
ppp_fatal("CHAP digest 0x%x requested but not available",
|
||||||
digest_code);
|
digest_code);
|
||||||
@ -283,7 +280,7 @@ static void chap_handle_response(ppp_pcb *pcb, int id,
|
|||||||
unsigned char *response, *outp;
|
unsigned char *response, *outp;
|
||||||
struct pbuf *p;
|
struct pbuf *p;
|
||||||
char *name = NULL; /* initialized to shut gcc up */
|
char *name = NULL; /* initialized to shut gcc up */
|
||||||
int (*verifier)(char *, char *, int, struct chap_digest_type *,
|
int (*verifier)(char *, char *, int, const struct chap_digest_type *,
|
||||||
unsigned char *, unsigned char *, char *, int);
|
unsigned char *, unsigned char *, char *, int);
|
||||||
char rname[MAXNAMELEN+1];
|
char rname[MAXNAMELEN+1];
|
||||||
|
|
||||||
@ -398,7 +395,7 @@ static void chap_handle_response(ppp_pcb *pcb, int id,
|
|||||||
* succeeded), or 0 if it doesn't.
|
* succeeded), or 0 if it doesn't.
|
||||||
*/
|
*/
|
||||||
static int chap_verify_response(char *name, char *ourname, int id,
|
static int chap_verify_response(char *name, char *ourname, int id,
|
||||||
struct chap_digest_type *digest,
|
const struct chap_digest_type *digest,
|
||||||
unsigned char *challenge, unsigned char *response,
|
unsigned char *challenge, unsigned char *response,
|
||||||
char *message, int message_space) {
|
char *message, int message_space) {
|
||||||
int ok;
|
int ok;
|
||||||
|
@ -879,7 +879,7 @@ void set_mppe_enc_types(int policy, int types) {
|
|||||||
}
|
}
|
||||||
#endif /* MPPE */
|
#endif /* MPPE */
|
||||||
|
|
||||||
static struct chap_digest_type chapms_digest = {
|
const struct chap_digest_type chapms_digest = {
|
||||||
CHAP_MICROSOFT, /* code */
|
CHAP_MICROSOFT, /* code */
|
||||||
#if PPP_SERVER
|
#if PPP_SERVER
|
||||||
chapms_generate_challenge,
|
chapms_generate_challenge,
|
||||||
@ -890,7 +890,7 @@ static struct chap_digest_type chapms_digest = {
|
|||||||
chapms_handle_failure,
|
chapms_handle_failure,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct chap_digest_type chapms2_digest = {
|
const struct chap_digest_type chapms2_digest = {
|
||||||
CHAP_MICROSOFT_V2, /* code */
|
CHAP_MICROSOFT_V2, /* code */
|
||||||
#if PPP_SERVER
|
#if PPP_SERVER
|
||||||
chapms2_generate_challenge,
|
chapms2_generate_challenge,
|
||||||
@ -901,12 +901,4 @@ static struct chap_digest_type chapms2_digest = {
|
|||||||
chapms_handle_failure,
|
chapms_handle_failure,
|
||||||
};
|
};
|
||||||
|
|
||||||
void chapms_init(void) {
|
|
||||||
chap_register_digest(&chapms_digest);
|
|
||||||
chap_register_digest(&chapms2_digest);
|
|
||||||
#if PPP_OPTIONS
|
|
||||||
add_options(chapms_option_list);
|
|
||||||
#endif /* PPP_OPTIONS */
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */
|
#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */
|
||||||
|
Loading…
Reference in New Issue
Block a user