32 #if PPP_SUPPORT && CHAP_SUPPORT 45 #if LWIP_INCLUDED_POLARSSL_MD5 51 #define MD5_HASH_SIZE 16 52 #define MD5_MIN_CHALLENGE 17 53 #define MD5_MAX_CHALLENGE 24 54 #define MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE 3 57 static void chap_md5_generate_challenge(ppp_pcb *pcb,
unsigned char *cp) {
61 clen = MD5_MIN_CHALLENGE + magic_pow(MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE);
63 magic_random_bytes(cp, clen);
66 static int chap_md5_verify_response(ppp_pcb *pcb,
int id,
const char *name,
67 const unsigned char *secret,
int secret_len,
68 const unsigned char *challenge,
const unsigned char *response,
69 char *message,
int message_space) {
71 unsigned char idbyte = id;
72 unsigned char hash[MD5_HASH_SIZE];
73 int challenge_len, response_len;
77 challenge_len = *challenge++;
78 response_len = *response++;
79 if (response_len == MD5_HASH_SIZE) {
82 md5_update(&ctx, &idbyte, 1);
83 md5_update(&ctx, secret, secret_len);
84 md5_update(&ctx, challenge, challenge_len);
85 md5_finish(&ctx, hash);
88 if (memcmp(hash, response, MD5_HASH_SIZE) == 0) {
89 ppp_slprintf(message, message_space,
"Access granted");
93 ppp_slprintf(message, message_space,
"Access denied");
98 static void chap_md5_make_response(ppp_pcb *pcb,
unsigned char *response,
int id,
const char *our_name,
99 const unsigned char *challenge,
const char *secret,
int secret_len,
100 unsigned char *private_) {
102 unsigned char idbyte = id;
103 int challenge_len = *challenge++;
109 md5_update(&ctx, &idbyte, 1);
110 md5_update(&ctx, (
const u_char *)secret, secret_len);
111 md5_update(&ctx, challenge, challenge_len);
112 md5_finish(&ctx, &response[1]);
113 response[0] = MD5_HASH_SIZE;
116 const struct chap_digest_type md5_digest = {
119 chap_md5_generate_challenge,
120 chap_md5_verify_response,
122 chap_md5_make_response,
#define LWIP_UNUSED_ARG(x)