X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;ds=inline;f=pppd%2Fplugins%2Fradius%2Fradius.c;h=3c773cb2c49137eeb8923b12772e2469d1d6a46e;hb=e227ca9c99af2e3320e1a41be3fd140429c2a995;hp=68bd0849e268e08ca20740f73d19aa4a3ad96ce6;hpb=3746d8ed0bbf48bb2939b1079147d59703c8fb42;p=ppp.git diff --git a/pppd/plugins/radius/radius.c b/pppd/plugins/radius/radius.c index 68bd084..3c773cb 100644 --- a/pppd/plugins/radius/radius.c +++ b/pppd/plugins/radius/radius.c @@ -24,7 +24,7 @@ * ***********************************************************************/ static char const RCSID[] = -"$Id: radius.c,v 1.24 2004/04/12 05:14:53 kad Exp $"; +"$Id: radius.c,v 1.31 2006/05/22 00:01:40 paulus Exp $"; #include "pppd.h" #include "chap-new.h" @@ -41,6 +41,8 @@ static char const RCSID[] = #include #include #include +#include +#include #define BUF_LEN 1024 @@ -74,7 +76,7 @@ static int radius_chap_verify(char *user, char *ourname, int id, struct chap_digest_type *digest, unsigned char *challenge, unsigned char *response, - unsigned char *message, int message_space); + char *message, int message_space); static void radius_ip_up(void *opaque, int arg); static void radius_ip_down(void *opaque, int arg); @@ -282,7 +284,8 @@ radius_pap_auth(char *user, if (*remote_number) { rc_avpair_add(&send, PW_CALLING_STATION_ID, remote_number, 0, VENDOR_NONE); - } + } else if (ipparam) + rc_avpair_add(&send, PW_CALLING_STATION_ID, ipparam, 0, VENDOR_NONE); /* Add user specified vp's */ if (rstate.avp) @@ -329,7 +332,7 @@ static int radius_chap_verify(char *user, char *ourname, int id, struct chap_digest_type *digest, unsigned char *challenge, unsigned char *response, - unsigned char *message, int message_space) + char *message, int message_space) { VALUE_PAIR *send, *received; UINT4 av_type; @@ -407,18 +410,14 @@ radius_chap_verify(char *user, char *ourname, int id, case CHAP_MICROSOFT: { /* MS-CHAP-Challenge and MS-CHAP-Response */ - MS_ChapResponse *rmd = (MS_ChapResponse *) response; u_char *p = cpassword; if (response_len != MS_CHAP_RESPONSE_LEN) return 0; *p++ = id; /* The idiots use a different field order in RADIUS than PPP */ - memcpy(p, rmd->UseNT, sizeof(rmd->UseNT)); - p += sizeof(rmd->UseNT); - memcpy(p, rmd->LANManResp, sizeof(rmd->LANManResp)); - p += sizeof(rmd->LANManResp); - memcpy(p, rmd->NTResp, sizeof(rmd->NTResp)); + *p++ = response[MS_CHAP_USENT]; + memcpy(p, response, MS_CHAP_LANMANRESP_LEN + MS_CHAP_NTRESP_LEN); rc_avpair_add(&send, PW_MS_CHAP_CHALLENGE, challenge, challenge_len, VENDOR_MICROSOFT); @@ -430,20 +429,15 @@ radius_chap_verify(char *user, char *ourname, int id, case CHAP_MICROSOFT_V2: { /* MS-CHAP-Challenge and MS-CHAP2-Response */ - MS_Chap2Response *rmd = (MS_Chap2Response *) response; u_char *p = cpassword; if (response_len != MS_CHAP2_RESPONSE_LEN) return 0; *p++ = id; /* The idiots use a different field order in RADIUS than PPP */ - memcpy(p, rmd->Flags, sizeof(rmd->Flags)); - p += sizeof(rmd->Flags); - memcpy(p, rmd->PeerChallenge, sizeof(rmd->PeerChallenge)); - p += sizeof(rmd->PeerChallenge); - memcpy(p, rmd->Reserved, sizeof(rmd->Reserved)); - p += sizeof(rmd->Reserved); - memcpy(p, rmd->NTResp, sizeof(rmd->NTResp)); + *p++ = response[MS_CHAP2_FLAGS]; + memcpy(p, response, (MS_CHAP2_PEER_CHAL_LEN + MS_CHAP2_RESERVED_LEN + + MS_CHAP2_NTRESP_LEN)); rc_avpair_add(&send, PW_MS_CHAP_CHALLENGE, challenge, challenge_len, VENDOR_MICROSOFT); @@ -457,7 +451,8 @@ radius_chap_verify(char *user, char *ourname, int id, if (*remote_number) { rc_avpair_add(&send, PW_CALLING_STATION_ID, remote_number, 0, VENDOR_NONE); - } + } else if (ipparam) + rc_avpair_add(&send, PW_CALLING_STATION_ID, ipparam, 0, VENDOR_NONE); /* Add user specified vp's */ if (rstate.avp) @@ -476,6 +471,8 @@ radius_chap_verify(char *user, char *ourname, int id, req_info); } + strlcpy(message, radius_msg, message_space); + if (result == OK_RC) { if (!rstate.done_chap_once) { if (radius_setparams(received, radius_msg, req_info, digest, @@ -738,18 +735,18 @@ radius_setmppekeys(VALUE_PAIR *vp, REQUEST_INFO *req_info, memcpy(plain, vp->strvalue, sizeof(plain)); - MD5Init(&Context); - MD5Update(&Context, req_info->secret, strlen(req_info->secret)); - MD5Update(&Context, req_info->request_vector, AUTH_VECTOR_LEN); - MD5Final(buf, &Context); + MD5_Init(&Context); + MD5_Update(&Context, req_info->secret, strlen(req_info->secret)); + MD5_Update(&Context, req_info->request_vector, AUTH_VECTOR_LEN); + MD5_Final(buf, &Context); for (i = 0; i < 16; i++) plain[i] ^= buf[i]; - MD5Init(&Context); - MD5Update(&Context, req_info->secret, strlen(req_info->secret)); - MD5Update(&Context, vp->strvalue, 16); - MD5Final(buf, &Context); + MD5_Init(&Context); + MD5_Update(&Context, req_info->secret, strlen(req_info->secret)); + MD5_Update(&Context, vp->strvalue, 16); + MD5_Final(buf, &Context); for(i = 0; i < 16; i++) plain[i + 16] ^= buf[i]; @@ -802,11 +799,11 @@ radius_setmppekeys2(VALUE_PAIR *vp, REQUEST_INFO *req_info) memcpy(plain, crypt, 32); - MD5Init(&Context); - MD5Update(&Context, req_info->secret, strlen(req_info->secret)); - MD5Update(&Context, req_info->request_vector, AUTH_VECTOR_LEN); - MD5Update(&Context, salt, 2); - MD5Final(buf, &Context); + MD5_Init(&Context); + MD5_Update(&Context, req_info->secret, strlen(req_info->secret)); + MD5_Update(&Context, req_info->request_vector, AUTH_VECTOR_LEN); + MD5_Update(&Context, salt, 2); + MD5_Final(buf, &Context); for (i = 0; i < 16; i++) plain[i] ^= buf[i]; @@ -817,10 +814,10 @@ radius_setmppekeys2(VALUE_PAIR *vp, REQUEST_INFO *req_info) return -1; } - MD5Init(&Context); - MD5Update(&Context, req_info->secret, strlen(req_info->secret)); - MD5Update(&Context, crypt, 16); - MD5Final(buf, &Context); + MD5_Init(&Context); + MD5_Update(&Context, req_info->secret, strlen(req_info->secret)); + MD5_Update(&Context, crypt, 16); + MD5_Final(buf, &Context); plain[16] ^= buf[0]; /* only need the first byte */ @@ -880,7 +877,8 @@ radius_acct_start(void) if (*remote_number) { rc_avpair_add(&send, PW_CALLING_STATION_ID, remote_number, 0, VENDOR_NONE); - } + } else if (ipparam) + rc_avpair_add(&send, PW_CALLING_STATION_ID, ipparam, 0, VENDOR_NONE); av_type = PW_RADIUS; rc_avpair_add(&send, PW_ACCT_AUTHENTIC, &av_type, 0, VENDOR_NONE); @@ -984,7 +982,8 @@ radius_acct_stop(void) if (*remote_number) { rc_avpair_add(&send, PW_CALLING_STATION_ID, remote_number, 0, VENDOR_NONE); - } + } else if (ipparam) + rc_avpair_add(&send, PW_CALLING_STATION_ID, ipparam, 0, VENDOR_NONE); av_type = ( using_pty ? PW_VIRTUAL : ( sync_serial ? PW_SYNC : PW_ASYNC ) ); rc_avpair_add(&send, PW_NAS_PORT_TYPE, &av_type, 0, VENDOR_NONE); @@ -1020,6 +1019,10 @@ radius_acct_stop(void) av_type = PW_ACCT_IDLE_TIMEOUT; break; + case EXIT_CALLBACK: + av_type = PW_CALLBACK; + break; + case EXIT_CONNECT_TIME: av_type = PW_ACCT_SESSION_TIMEOUT; break; @@ -1127,9 +1130,10 @@ radius_acct_interim(void *ignored) if (*remote_number) { rc_avpair_add(&send, PW_CALLING_STATION_ID, remote_number, 0, VENDOR_NONE); - } + } else if (ipparam) + rc_avpair_add(&send, PW_CALLING_STATION_ID, ipparam, 0, VENDOR_NONE); - av_type = using_pty ? PW_VIRTUAL : PW_ASYNC; + av_type = ( using_pty ? PW_VIRTUAL : ( sync_serial ? PW_SYNC : PW_ASYNC ) ); rc_avpair_add(&send, PW_NAS_PORT_TYPE, &av_type, 0, VENDOR_NONE); hisaddr = ho->hisaddr;