Lines Matching defs:msg

52 struct radius_hdr * radius_msg_get_hdr(struct radius_msg *msg)
54 return msg->hdr;
58 struct wpabuf * radius_msg_get_buf(struct radius_msg *msg)
60 return msg->buf;
65 radius_get_attr_hdr(struct radius_msg *msg, int idx)
68 (wpabuf_mhead_u8(msg->buf) + msg->attr_pos[idx]);
72 static void radius_msg_set_hdr(struct radius_msg *msg, u8 code, u8 identifier)
74 msg->hdr->code = code;
75 msg->hdr->identifier = identifier;
79 static int radius_msg_initialize(struct radius_msg *msg)
81 msg->attr_pos = os_calloc(RADIUS_DEFAULT_ATTR_COUNT,
82 sizeof(*msg->attr_pos));
83 if (msg->attr_pos == NULL)
86 msg->attr_size = RADIUS_DEFAULT_ATTR_COUNT;
87 msg->attr_used = 0;
104 struct radius_msg *msg;
106 msg = os_zalloc(sizeof(*msg));
107 if (msg == NULL)
110 msg->buf = wpabuf_alloc(RADIUS_DEFAULT_MSG_SIZE);
111 if (msg->buf == NULL || radius_msg_initialize(msg)) {
112 radius_msg_free(msg);
115 msg->hdr = wpabuf_put(msg->buf, sizeof(struct radius_hdr));
117 radius_msg_set_hdr(msg, code, identifier);
119 return msg;
125 * @msg: RADIUS message from radius_msg_new() or radius_msg_parse()
127 void radius_msg_free(struct radius_msg *msg)
129 if (msg == NULL)
132 wpabuf_free(msg->buf);
133 os_free(msg->attr_pos);
134 os_free(msg);
411 void radius_msg_dump(struct radius_msg *msg)
416 msg->hdr->code, radius_code_string(msg->hdr->code),
417 msg->hdr->identifier, be_to_host16(msg->hdr->length));
419 for (i = 0; i < msg->attr_used; i++) {
420 struct radius_attr_hdr *attr = radius_get_attr_hdr(msg, i);
426 u8 * radius_msg_add_msg_auth(struct radius_msg *msg)
432 attr = radius_msg_add_attr(msg, RADIUS_ATTR_MESSAGE_AUTHENTICATOR,
444 static u8 * radius_msg_auth_pos(struct radius_msg *msg)
449 if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_MESSAGE_AUTHENTICATOR,
457 return radius_msg_add_msg_auth(msg);
461 int radius_msg_finish(struct radius_msg *msg, const u8 *secret,
467 pos = radius_msg_auth_pos(msg);
470 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
471 if (hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
472 wpabuf_len(msg->buf), pos) < 0)
475 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
477 if (wpabuf_len(msg->buf) > 0xffff) {
479 (unsigned long) wpabuf_len(msg->buf));
486 int radius_msg_finish_srv(struct radius_msg *msg, const u8 *secret,
493 pos = radius_msg_auth_pos(msg);
496 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
497 os_memcpy(msg->hdr->authenticator, req_authenticator,
498 sizeof(msg->hdr->authenticator));
499 if (hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
500 wpabuf_len(msg->buf), pos) < 0)
504 addr[0] = (u8 *) msg->hdr;
508 addr[2] = wpabuf_head_u8(msg->buf) + sizeof(struct radius_hdr);
509 len[2] = wpabuf_len(msg->buf) - sizeof(struct radius_hdr);
512 md5_vector(4, addr, len, msg->hdr->authenticator);
514 if (wpabuf_len(msg->buf) > 0xffff) {
516 (unsigned long) wpabuf_len(msg->buf));
523 int radius_msg_finish_das_resp(struct radius_msg *msg, const u8 *secret,
531 pos = radius_msg_auth_pos(msg);
535 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
536 os_memcpy(msg->hdr->authenticator, req_hdr->authenticator, 16);
537 if (hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
538 wpabuf_len(msg->buf), pos) < 0)
542 addr[0] = wpabuf_head_u8(msg->buf);
543 len[0] = wpabuf_len(msg->buf);
546 if (md5_vector(2, addr, len, msg->hdr->authenticator) < 0)
549 if (wpabuf_len(msg->buf) > 0xffff) {
551 (unsigned long) wpabuf_len(msg->buf));
558 void radius_msg_finish_acct(struct radius_msg *msg, const u8 *secret,
564 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
565 os_memset(msg->hdr->authenticator, 0, MD5_MAC_LEN);
566 addr[0] = wpabuf_head(msg->buf);
567 len[0] = wpabuf_len(msg->buf);
570 md5_vector(2, addr, len, msg->hdr->authenticator);
572 if (wpabuf_len(msg->buf) > 0xffff) {
574 (unsigned long) wpabuf_len(msg->buf));
579 void radius_msg_finish_acct_resp(struct radius_msg *msg, const u8 *secret,
585 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
586 os_memcpy(msg->hdr->authenticator, req_authenticator, MD5_MAC_LEN);
587 addr[0] = wpabuf_head(msg->buf);
588 len[0] = wpabuf_len(msg->buf);
591 md5_vector(2, addr, len, msg->hdr->authenticator);
593 if (wpabuf_len(msg->buf) > 0xffff) {
595 (unsigned long) wpabuf_len(msg->buf));
600 int radius_msg_verify_acct_req(struct radius_msg *msg, const u8 *secret,
609 addr[0] = (u8 *) msg->hdr;
613 addr[2] = (u8 *) (msg->hdr + 1);
614 len[2] = wpabuf_len(msg->buf) - sizeof(struct radius_hdr);
618 return os_memcmp_const(msg->hdr->authenticator, hash, MD5_MAC_LEN) != 0;
622 int radius_msg_verify_das_req(struct radius_msg *msg, const u8 *secret,
637 addr[0] = (u8 *) msg->hdr;
641 addr[2] = (u8 *) (msg->hdr + 1);
642 len[2] = wpabuf_len(msg->buf) - sizeof(struct radius_hdr);
646 if (os_memcmp_const(msg->hdr->authenticator, hash, MD5_MAC_LEN) != 0)
649 for (i = 0; i < msg->attr_used; i++) {
650 tmp = radius_get_attr_hdr(msg, i);
673 os_memcpy(orig_authenticator, msg->hdr->authenticator,
675 os_memset(msg->hdr->authenticator, 0,
676 sizeof(msg->hdr->authenticator));
677 hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
678 wpabuf_len(msg->buf), auth);
680 os_memcpy(msg->hdr->authenticator, orig_authenticator,
687 static int radius_msg_add_attr_to_array(struct radius_msg *msg,
690 if (msg->attr_used >= msg->attr_size) {
692 size_t nlen = msg->attr_size * 2;
694 nattr_pos = os_realloc_array(msg->attr_pos, nlen,
695 sizeof(*msg->attr_pos));
699 msg->attr_pos = nattr_pos;
700 msg->attr_size = nlen;
703 msg->attr_pos[msg->attr_used++] =
704 (unsigned char *) attr - wpabuf_head_u8(msg->buf);
710 struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u16 type,
759 if (wpabuf_tailroom(msg->buf) < buf_needed) {
761 if (wpabuf_resize(&msg->buf, buf_needed) < 0)
763 msg->hdr = wpabuf_mhead(msg->buf);
772 ext = wpabuf_put(msg->buf,
779 wpabuf_put_u8(msg->buf, data_len > alen ? 0x80 : 0);
780 wpabuf_put_data(msg->buf, data, data_len);
784 msg, (struct radius_attr_hdr *) ext))
788 ext = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr_ext));
793 wpabuf_put_data(msg->buf, data, data_len);
794 if (radius_msg_add_attr_to_array(msg, attr))
797 attr = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr));
800 wpabuf_put_data(msg->buf, data, data_len);
801 if (radius_msg_add_attr_to_array(msg, attr))
820 struct radius_msg *msg;
842 msg = os_zalloc(sizeof(*msg));
843 if (msg == NULL)
846 msg->buf = wpabuf_alloc_copy(data, msg_len);
847 if (msg->buf == NULL || radius_msg_initialize(msg)) {
848 radius_msg_free(msg);
851 msg->hdr = wpabuf_mhead(msg->buf);
854 pos = wpabuf_mhead_u8(msg->buf) + sizeof(struct radius_hdr);
855 end = wpabuf_mhead_u8(msg->buf) + wpabuf_len(msg->buf);
867 if (radius_msg_add_attr_to_array(msg, attr))
873 return msg;
876 radius_msg_free(msg);
881 int radius_msg_add_eap(struct radius_msg *msg, const u8 *data, size_t data_len)
893 if (!radius_msg_add_attr(msg, RADIUS_ATTR_EAP_MESSAGE,
905 struct wpabuf * radius_msg_get_eap(struct radius_msg *msg)
911 if (msg == NULL)
915 for (i = 0; i < msg->attr_used; i++) {
916 attr = radius_get_attr_hdr(msg, i);
929 for (i = 0; i < msg->attr_used; i++) {
930 attr = radius_get_attr_hdr(msg, i);
942 int radius_msg_verify_msg_auth(struct radius_msg *msg, const u8 *secret,
950 for (i = 0; i < msg->attr_used; i++) {
951 tmp = radius_get_attr_hdr(msg, i);
969 os_memcpy(orig_authenticator, msg->hdr->authenticator,
971 os_memcpy(msg->hdr->authenticator, req_auth,
972 sizeof(msg->hdr->authenticator));
974 if (hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
975 wpabuf_len(msg->buf), auth) < 0)
979 os_memcpy(msg->hdr->authenticator, orig_authenticator,
992 int radius_msg_verify(struct radius_msg *msg, const u8 *secret,
1008 if (radius_msg_get_attr_ptr(msg,
1019 radius_msg_verify_msg_auth(msg, secret, secret_len,
1025 addr[0] = (u8 *) msg->hdr;
1029 addr[2] = wpabuf_head_u8(msg->buf) + sizeof(struct radius_hdr);
1030 len[2] = wpabuf_len(msg->buf) - sizeof(struct radius_hdr);
1034 os_memcmp_const(hash, msg->hdr->authenticator, MD5_MAC_LEN) != 0) {
1067 int radius_msg_make_authenticator(struct radius_msg *msg)
1069 return os_get_random((u8 *) &msg->hdr->authenticator,
1070 sizeof(msg->hdr->authenticator));
1080 static u8 *radius_msg_get_vendor_attr(struct radius_msg *msg, u32 vendor,
1086 if (msg == NULL)
1089 for (i = 0; i < msg->attr_used; i++) {
1090 struct radius_attr_hdr *attr = radius_get_attr_hdr(msg, i);
1265 radius_msg_get_ms_keys(struct radius_msg *msg, struct radius_msg *sent_msg,
1272 if (msg == NULL || sent_msg == NULL)
1279 key = radius_msg_get_vendor_attr(msg, RADIUS_VENDOR_ID_MICROSOFT,
1294 key = radius_msg_get_vendor_attr(msg, RADIUS_VENDOR_ID_MICROSOFT,
1314 radius_msg_get_cisco_keys(struct radius_msg *msg, struct radius_msg *sent_msg,
1321 if (msg == NULL || sent_msg == NULL)
1328 key = radius_msg_get_vendor_attr(msg, RADIUS_VENDOR_ID_CISCO,
1343 int radius_msg_add_mppe_keys(struct radius_msg *msg,
1382 attr = radius_msg_add_attr(msg, RADIUS_ATTR_VENDOR_SPECIFIC,
1407 attr = radius_msg_add_attr(msg, RADIUS_ATTR_VENDOR_SPECIFIC,
1418 int radius_msg_add_wfa(struct radius_msg *msg, u8 subtype, const u8 *data,
1435 attr = radius_msg_add_attr(msg, RADIUS_ATTR_VENDOR_SPECIFIC,
1445 int radius_msg_add_ext_vs(struct radius_msg *msg, u16 type, u32 vendor_id,
1461 attr = radius_msg_add_attr(msg, type, buf, alen);
1467 int radius_user_password_hide(struct radius_msg *msg,
1493 addr[1] = msg->hdr->authenticator;
1521 radius_msg_add_attr_user_password(struct radius_msg *msg,
1528 res = radius_user_password_hide(msg, data, data_len,
1533 return radius_msg_add_attr(msg, RADIUS_ATTR_USER_PASSWORD,
1538 int radius_msg_get_attr(struct radius_msg *msg, u8 type, u8 *buf, size_t len)
1543 for (i = 0; i < msg->attr_used; i++) {
1544 tmp = radius_get_attr_hdr(msg, i);
1561 int radius_msg_get_attr_ptr(struct radius_msg *msg, u8 type, u8 **buf,
1567 for (i = 0; i < msg->attr_used; i++) {
1568 tmp = radius_get_attr_hdr(msg, i);
1585 int radius_msg_count_attr(struct radius_msg *msg, u8 type, int min_len)
1590 for (count = 0, i = 0; i < msg->attr_used; i++) {
1591 struct radius_attr_hdr *attr = radius_get_attr_hdr(msg, i);
1624 * @msg: RADIUS message
1631 int radius_msg_get_vlanid(struct radius_msg *msg, int *untagged, int numtagged,
1647 for (i = 0; i < msg->attr_used; i++) {
1648 attr = radius_get_attr_hdr(msg, i);
1726 * @msg: Received RADIUS message
1734 char * radius_msg_get_tunnel_password(struct radius_msg *msg, int *keylen,
1755 for (i = 0; i < msg->attr_used; i++) {
1756 attr = radius_get_attr_hdr(msg, i);
1880 u8 radius_msg_find_unlisted_attr(struct radius_msg *msg, u8 *attrs)
1885 for (i = 0; i < msg->attr_used; i++) {
1886 attr = radius_get_attr_hdr(msg, i);