int radius_get_string_attr(const RADIUS_PACKET* packet, u_int8_t type, char* str) { u_int8_t len; if(radius_get_raw_attr(packet, type, str, &len) != 0) return 1; str[len] = '\0'; return 0; }
struct in_addr radius_get_ipv4_attr_retval(const RADIUS_PACKET* packet, u_int8_t type) { struct in_addr addr; u_int8_t len; if(radius_get_raw_attr(packet, type, &addr, &len) != 0) addr.s_addr = htonl(INADDR_ANY); if(len != sizeof(struct in_addr)) addr.s_addr = htonl(INADDR_ANY); return addr; }
u_int32_t radius_get_uint32_attr_retval(const RADIUS_PACKET* packet, u_int8_t type) { u_int32_t nval; u_int8_t len; if(radius_get_raw_attr(packet, type, &nval, &len) != 0) return 0xffffffff; if(len != sizeof(u_int32_t)) return 0xffffffff; return ntohl(nval); }
int radius_get_ipv4_attr(const RADIUS_PACKET* packet, u_int8_t type, struct in_addr* addr) { struct in_addr tmp; u_int8_t len; if(radius_get_raw_attr(packet, type, &tmp, &len) != 0) return 1; if(len != sizeof(struct in_addr)) return 1; *addr = tmp; return 0; }
int radius_get_uint32_attr(const RADIUS_PACKET* packet, u_int8_t type, u_int32_t* val) { u_int32_t nval; u_int8_t len; if(radius_get_raw_attr(packet, type, &nval, &len) != 0) return 1; if(len != sizeof(u_int32_t)) return 1; *val = ntohl(nval); return 0; }
int radius_check_message_authenticator(RADIUS_PACKET *packet, const char *secret) { int rval; u_char len, md5result0[16], md5result1[16]; radius_hmac_md5(packet, secret, strlen(secret), (caddr_t)md5result0, 1); if ((rval = radius_get_raw_attr(packet, RADIUS_TYPE_MESSAGE_AUTHENTICATOR, md5result1, &len)) != 0) return rval; if (len != sizeof(md5result1)) return -1; return memcmp(md5result0, md5result1, sizeof(md5result1)); }
static void radius_dump(FILE *out, RADIUS_PACKET *pkt, bool resp, const char *secret) { size_t len; char buf[256], buf1[256]; uint32_t u32val; struct in_addr ipv4; fprintf(out, " Id = %d\n" " Code = %s(%d)\n", (int)radius_get_id(pkt), radius_code_str((int)radius_get_code(pkt)), (int)radius_get_code(pkt)); if (resp && secret) fprintf(out, " Message-Authenticator = %s\n", (radius_check_response_authenticator(pkt, secret) == 0) ? "Verified" : "NG"); if (radius_get_string_attr(pkt, RADIUS_TYPE_USER_NAME, buf, sizeof(buf)) == 0) fprintf(out, " User-Name = \"%s\"\n", buf); if (secret && radius_get_user_password_attr(pkt, buf, sizeof(buf), secret) == 0) fprintf(out, " User-Password = \"%s\"\n", buf); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_raw_attr(pkt, RADIUS_TYPE_CHAP_PASSWORD, buf, &len) == 0) fprintf(out, " CHAP-Password = %s\n", (hexstr(buf, len, buf1, sizeof(buf1))) ? buf1 : "(too long)"); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_raw_attr(pkt, RADIUS_TYPE_CHAP_CHALLENGE, buf, &len) == 0) fprintf(out, " CHAP-Challenge = %s\n", (hexstr(buf, len, buf1, sizeof(buf1))) ? buf1 : "(too long)"); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_vs_raw_attr(pkt, RADIUS_VENDOR_MICROSOFT, RADIUS_VTYPE_MS_CHAP_CHALLENGE, buf, &len) == 0) fprintf(out, " MS-CHAP-Challenge = %s\n", (hexstr(buf, len, buf1, sizeof(buf1))) ? buf1 : "(too long)"); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_vs_raw_attr(pkt, RADIUS_VENDOR_MICROSOFT, RADIUS_VTYPE_MS_CHAP2_RESPONSE, buf, &len) == 0) fprintf(out, " MS-CHAP2-Response = %s\n", (hexstr(buf, len, buf1, sizeof(buf1))) ? buf1 : "(too long)"); memset(buf, 0, sizeof(buf)); len = sizeof(buf) - 1; if (radius_get_vs_raw_attr(pkt, RADIUS_VENDOR_MICROSOFT, RADIUS_VTYPE_MS_CHAP2_SUCCESS, buf, &len) == 0) { fprintf(out, " MS-CHAP-Success = Id=%u \"%s\"\n", (u_int)(u_char)buf[0], buf + 1); } memset(buf, 0, sizeof(buf)); len = sizeof(buf) - 1; if (radius_get_vs_raw_attr(pkt, RADIUS_VENDOR_MICROSOFT, RADIUS_VTYPE_MS_CHAP_ERROR, buf, &len) == 0) { fprintf(out, " MS-CHAP-Error = Id=%u \"%s\"\n", (u_int)(u_char)buf[0], buf + 1); } memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_vs_raw_attr(pkt, RADIUS_VENDOR_MICROSOFT, RADIUS_VTYPE_MPPE_SEND_KEY, buf, &len) == 0) fprintf(out, " MS-MPPE-Send-Key = %s\n", (hexstr(buf, len, buf1, sizeof(buf1))) ? buf1 : "(too long)"); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_vs_raw_attr(pkt, RADIUS_VENDOR_MICROSOFT, RADIUS_VTYPE_MPPE_RECV_KEY, buf, &len) == 0) fprintf(out, " MS-MPPE-Recv-Key = %s\n", (hexstr(buf, len, buf1, sizeof(buf1))) ? buf1 : "(too long)"); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_vs_raw_attr(pkt, RADIUS_VENDOR_MICROSOFT, RADIUS_VTYPE_MPPE_ENCRYPTION_POLICY, buf, &len) == 0) fprintf(out, " MS-MPPE-Encryption-Policy = 0x%08x\n", ntohl(*(u_long *)buf)); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_vs_raw_attr(pkt, RADIUS_VENDOR_MICROSOFT, RADIUS_VTYPE_MPPE_ENCRYPTION_TYPES, buf, &len) == 0) fprintf(out, " MS-MPPE-Encryption-Types = 0x%08x\n", ntohl(*(u_long *)buf)); if (radius_get_string_attr(pkt, RADIUS_TYPE_REPLY_MESSAGE, buf, sizeof(buf)) == 0) fprintf(out, " Reply-Message = \"%s\"\n", buf); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_uint32_attr(pkt, RADIUS_TYPE_NAS_PORT, &u32val) == 0) fprintf(out, " NAS-Port = %lu\n", (u_long)u32val); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_ipv4_attr(pkt, RADIUS_TYPE_NAS_IP_ADDRESS, &ipv4) == 0) fprintf(out, " NAS-IP-Address = %s\n", inet_ntoa(ipv4)); memset(buf, 0, sizeof(buf)); len = sizeof(buf); if (radius_get_raw_attr(pkt, RADIUS_TYPE_NAS_IPV6_ADDRESS, buf, &len) == 0) fprintf(out, " NAS-IPv6-Address = %s\n", inet_ntop(AF_INET6, buf, buf1, len)); }