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);
352 void radius_msg_dump(struct radius_msg *msg)
357 msg->hdr->code, radius_code_string(msg->hdr->code),
358 msg->hdr->identifier, be_to_host16(msg->hdr->length));
360 for (i = 0; i < msg->attr_used; i++) {
361 struct radius_attr_hdr *attr = radius_get_attr_hdr(msg, i);
367 int radius_msg_finish(struct radius_msg *msg, const u8 *secret,
375 attr = radius_msg_add_attr(msg,
383 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
384 hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
385 wpabuf_len(msg->buf), (u8 *) (attr + 1));
387 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
389 if (wpabuf_len(msg->buf) > 0xffff) {
391 (unsigned long) wpabuf_len(msg->buf));
398 int radius_msg_finish_srv(struct radius_msg *msg, const u8 *secret,
407 attr = radius_msg_add_attr(msg, RADIUS_ATTR_MESSAGE_AUTHENTICATOR,
413 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
414 os_memcpy(msg->hdr->authenticator, req_authenticator,
415 sizeof(msg->hdr->authenticator));
416 hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
417 wpabuf_len(msg->buf), (u8 *) (attr + 1));
420 addr[0] = (u8 *) msg->hdr;
424 addr[2] = wpabuf_head_u8(msg->buf) + sizeof(struct radius_hdr);
425 len[2] = wpabuf_len(msg->buf) - sizeof(struct radius_hdr);
428 md5_vector(4, addr, len, msg->hdr->authenticator);
430 if (wpabuf_len(msg->buf) > 0xffff) {
432 (unsigned long) wpabuf_len(msg->buf));
439 int radius_msg_finish_das_resp(struct radius_msg *msg, const u8 *secret,
449 attr = radius_msg_add_attr(msg, RADIUS_ATTR_MESSAGE_AUTHENTICATOR,
456 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
457 os_memcpy(msg->hdr->authenticator, req_hdr->authenticator, 16);
458 hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
459 wpabuf_len(msg->buf), (u8 *) (attr + 1));
462 addr[0] = wpabuf_head_u8(msg->buf);
463 len[0] = wpabuf_len(msg->buf);
466 if (md5_vector(2, addr, len, msg->hdr->authenticator) < 0)
469 if (wpabuf_len(msg->buf) > 0xffff) {
471 (unsigned long) wpabuf_len(msg->buf));
478 void radius_msg_finish_acct(struct radius_msg *msg, const u8 *secret,
484 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
485 os_memset(msg->hdr->authenticator, 0, MD5_MAC_LEN);
486 addr[0] = wpabuf_head(msg->buf);
487 len[0] = wpabuf_len(msg->buf);
490 md5_vector(2, addr, len, msg->hdr->authenticator);
492 if (wpabuf_len(msg->buf) > 0xffff) {
494 (unsigned long) wpabuf_len(msg->buf));
499 void radius_msg_finish_acct_resp(struct radius_msg *msg, const u8 *secret,
505 msg->hdr->length = host_to_be16(wpabuf_len(msg->buf));
506 os_memcpy(msg->hdr->authenticator, req_authenticator, MD5_MAC_LEN);
507 addr[0] = wpabuf_head(msg->buf);
508 len[0] = wpabuf_len(msg->buf);
511 md5_vector(2, addr, len, msg->hdr->authenticator);
513 if (wpabuf_len(msg->buf) > 0xffff) {
515 (unsigned long) wpabuf_len(msg->buf));
520 int radius_msg_verify_acct_req(struct radius_msg *msg, const u8 *secret,
529 addr[0] = (u8 *) msg->hdr;
533 addr[2] = (u8 *) (msg->hdr + 1);
534 len[2] = wpabuf_len(msg->buf) - sizeof(struct radius_hdr);
538 return os_memcmp_const(msg->hdr->authenticator, hash, MD5_MAC_LEN) != 0;
542 int radius_msg_verify_das_req(struct radius_msg *msg, const u8 *secret,
557 addr[0] = (u8 *) msg->hdr;
561 addr[2] = (u8 *) (msg->hdr + 1);
562 len[2] = wpabuf_len(msg->buf) - sizeof(struct radius_hdr);
566 if (os_memcmp_const(msg->hdr->authenticator, hash, MD5_MAC_LEN) != 0)
569 for (i = 0; i < msg->attr_used; i++) {
570 tmp = radius_get_attr_hdr(msg, i);
593 os_memcpy(orig_authenticator, msg->hdr->authenticator,
595 os_memset(msg->hdr->authenticator, 0,
596 sizeof(msg->hdr->authenticator));
597 hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
598 wpabuf_len(msg->buf), auth);
600 os_memcpy(msg->hdr->authenticator, orig_authenticator,
607 static int radius_msg_add_attr_to_array(struct radius_msg *msg,
610 if (msg->attr_used >= msg->attr_size) {
612 int nlen = msg->attr_size * 2;
614 nattr_pos = os_realloc_array(msg->attr_pos, nlen,
615 sizeof(*msg->attr_pos));
619 msg->attr_pos = nattr_pos;
620 msg->attr_size = nlen;
623 msg->attr_pos[msg->attr_used++] =
624 (unsigned char *) attr - wpabuf_head_u8(msg->buf);
630 struct radius_attr_hdr *radius_msg_add_attr(struct radius_msg *msg, u8 type,
647 if (wpabuf_tailroom(msg->buf) < buf_needed) {
649 if (wpabuf_resize(&msg->buf, buf_needed) < 0)
651 msg->hdr = wpabuf_mhead(msg->buf);
654 attr = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr));
657 wpabuf_put_data(msg->buf, data, data_len);
659 if (radius_msg_add_attr_to_array(msg, attr))
677 struct radius_msg *msg;
699 msg = os_zalloc(sizeof(*msg));
700 if (msg == NULL)
703 msg->buf = wpabuf_alloc_copy(data, msg_len);
704 if (msg->buf == NULL || radius_msg_initialize(msg)) {
705 radius_msg_free(msg);
708 msg->hdr = wpabuf_mhead(msg->buf);
711 pos = wpabuf_mhead_u8(msg->buf) + sizeof(struct radius_hdr);
712 end = wpabuf_mhead_u8(msg->buf) + wpabuf_len(msg->buf);
724 if (radius_msg_add_attr_to_array(msg, attr))
730 return msg;
733 radius_msg_free(msg);
738 int radius_msg_add_eap(struct radius_msg *msg, const u8 *data, size_t data_len)
750 if (!radius_msg_add_attr(msg, RADIUS_ATTR_EAP_MESSAGE,
762 struct wpabuf * radius_msg_get_eap(struct radius_msg *msg)
768 if (msg == NULL)
772 for (i = 0; i < msg->attr_used; i++) {
773 attr = radius_get_attr_hdr(msg, i);
786 for (i = 0; i < msg->attr_used; i++) {
787 attr = radius_get_attr_hdr(msg, i);
799 int radius_msg_verify_msg_auth(struct radius_msg *msg, const u8 *secret,
807 for (i = 0; i < msg->attr_used; i++) {
808 tmp = radius_get_attr_hdr(msg, i);
826 os_memcpy(orig_authenticator, msg->hdr->authenticator,
828 os_memcpy(msg->hdr->authenticator, req_auth,
829 sizeof(msg->hdr->authenticator));
831 if (hmac_md5(secret, secret_len, wpabuf_head(msg->buf),
832 wpabuf_len(msg->buf), auth) < 0)
836 os_memcpy(msg->hdr->authenticator, orig_authenticator,
849 int radius_msg_verify(struct radius_msg *msg, const u8 *secret,
862 radius_msg_verify_msg_auth(msg, secret, secret_len,
868 addr[0] = (u8 *) msg->hdr;
872 addr[2] = wpabuf_head_u8(msg->buf) + sizeof(struct radius_hdr);
873 len[2] = wpabuf_len(msg->buf) - sizeof(struct radius_hdr);
877 os_memcmp_const(hash, msg->hdr->authenticator, MD5_MAC_LEN) != 0) {
910 int radius_msg_make_authenticator(struct radius_msg *msg)
912 return os_get_random((u8 *) &msg->hdr->authenticator,
913 sizeof(msg->hdr->authenticator));
923 static u8 *radius_msg_get_vendor_attr(struct radius_msg *msg, u32 vendor,
929 if (msg == NULL)
932 for (i = 0; i < msg->attr_used; i++) {
933 struct radius_attr_hdr *attr = radius_get_attr_hdr(msg, i);
1108 radius_msg_get_ms_keys(struct radius_msg *msg, struct radius_msg *sent_msg,
1115 if (msg == NULL || sent_msg == NULL)
1122 key = radius_msg_get_vendor_attr(msg, RADIUS_VENDOR_ID_MICROSOFT,
1137 key = radius_msg_get_vendor_attr(msg, RADIUS_VENDOR_ID_MICROSOFT,
1157 radius_msg_get_cisco_keys(struct radius_msg *msg, struct radius_msg *sent_msg,
1164 if (msg == NULL || sent_msg == NULL)
1171 key = radius_msg_get_vendor_attr(msg, RADIUS_VENDOR_ID_CISCO,
1186 int radius_msg_add_mppe_keys(struct radius_msg *msg,
1225 attr = radius_msg_add_attr(msg, RADIUS_ATTR_VENDOR_SPECIFIC,
1250 attr = radius_msg_add_attr(msg, RADIUS_ATTR_VENDOR_SPECIFIC,
1261 int radius_msg_add_wfa(struct radius_msg *msg, u8 subtype, const u8 *data,
1278 attr = radius_msg_add_attr(msg, RADIUS_ATTR_VENDOR_SPECIFIC,
1288 int radius_user_password_hide(struct radius_msg *msg,
1314 addr[1] = msg->hdr->authenticator;
1342 radius_msg_add_attr_user_password(struct radius_msg *msg,
1349 res = radius_user_password_hide(msg, data, data_len,
1354 return radius_msg_add_attr(msg, RADIUS_ATTR_USER_PASSWORD,
1359 int radius_msg_get_attr(struct radius_msg *msg, u8 type, u8 *buf, size_t len)
1364 for (i = 0; i < msg->attr_used; i++) {
1365 tmp = radius_get_attr_hdr(msg, i);
1382 int radius_msg_get_attr_ptr(struct radius_msg *msg, u8 type, u8 **buf,
1388 for (i = 0; i < msg->attr_used; i++) {
1389 tmp = radius_get_attr_hdr(msg, i);
1406 int radius_msg_count_attr(struct radius_msg *msg, u8 type, int min_len)
1411 for (count = 0, i = 0; i < msg->attr_used; i++) {
1412 struct radius_attr_hdr *attr = radius_get_attr_hdr(msg, i);
1445 * @msg: RADIUS message
1452 int radius_msg_get_vlanid(struct radius_msg *msg, int *untagged, int numtagged,
1468 for (i = 0; i < msg->attr_used; i++) {
1469 attr = radius_get_attr_hdr(msg, i);
1547 * @msg: Received RADIUS message
1555 char * radius_msg_get_tunnel_password(struct radius_msg *msg, int *keylen,
1576 for (i = 0; i < msg->attr_used; i++) {
1577 attr = radius_get_attr_hdr(msg, i);
1701 u8 radius_msg_find_unlisted_attr(struct radius_msg *msg, u8 *attrs)
1706 for (i = 0; i < msg->attr_used; i++) {
1707 attr = radius_get_attr_hdr(msg, i);