Home | History | Annotate | Download | only in eap_peer

Lines Matching defs:pac

2  * EAP peer method: EAP-FAST PAC file processing
16 /* TODO: encrypt PAC-Key in the PAC file */
21 "wpa_supplicant EAP-FAST PAC file - version 1";
30 * Sequence of PAC entries:
31 * 2-octet PAC-Type (big endian)
32 * 32-octet PAC-Key
33 * 2-octet PAC-Opaque length (big endian)
34 * <variable len> PAC-Opaque data (length bytes)
35 * 2-octet PAC-Info length (big endian)
36 * <variable len> PAC-Info data (length bytes)
44 * eap_fast_free_pac - Free PAC data
45 * @pac: Pointer to the PAC entry
47 * Note that the PAC entry must not be in a list since this function does not
50 void eap_fast_free_pac(struct eap_fast_pac *pac)
52 os_free(pac->pac_opaque);
53 os_free(pac->pac_info);
54 os_free(pac->a_id);
55 os_free(pac->i_id);
56 os_free(pac->a_id_info);
57 os_free(pac);
62 * eap_fast_get_pac - Get a PAC entry based on A-ID
63 * @pac_root: Pointer to root of the PAC list
66 * @pac_type: PAC-Type to search for
67 * Returns: Pointer to the PAC entry, or %NULL if A-ID not found
73 struct eap_fast_pac *pac = pac_root;
75 while (pac) {
76 if (pac->pac_type == pac_type && pac->a_id_len == a_id_len &&
77 os_memcmp(pac->a_id, a_id, a_id_len) == 0) {
78 return pac;
80 pac = pac->next;
90 struct eap_fast_pac *pac, *prev;
92 pac = *pac_root;
95 while (pac) {
96 if (pac->pac_type == pac_type && pac->a_id_len == a_id_len &&
97 os_memcmp(pac->a_id, a_id, a_id_len) == 0) {
99 *pac_root = pac->next;
101 prev->next = pac->next;
102 if (*pac_current == pac)
104 eap_fast_free_pac(pac);
107 prev = pac;
108 pac = pac->next;
128 * eap_fast_add_pac - Add a copy of a PAC entry to a list
129 * @pac_root: Pointer to PAC list root pointer
130 * @pac_current: Pointer to the current PAC pointer
134 * This function makes a clone of the given PAC entry and adds this copied
136 * it will be removed from the PAC list and in this case, pac_current entry
143 struct eap_fast_pac *pac;
153 pac = os_zalloc(sizeof(*pac));
154 if (pac == NULL)
157 pac->pac_type = entry->pac_type;
158 os_memcpy(pac->pac_key, entry->pac_key, EAP_FAST_PAC_KEY_LEN);
159 if (eap_fast_copy_buf(&pac->pac_opaque, &pac->pac_opaque_len,
161 eap_fast_copy_buf(&pac->pac_info, &pac->pac_info_len,
163 eap_fast_copy_buf(&pac->a_id, &pac->a_id_len,
165 eap_fast_copy_buf(&pac->i_id, &pac->i_id_len,
167 eap_fast_copy_buf(&pac->a_id_info, &pac->a_id_info_len,
169 eap_fast_free_pac(pac);
173 pac->next = *pac_root;
174 *pac_root = pac;
268 wpa_printf(MSG_INFO, "EAP-FAST: No PAC blob '%s' - "
269 "assume no PAC entries have been "
279 wpa_printf(MSG_INFO, "EAP-FAST: No PAC file '%s' - "
280 "assume no PAC entries have been "
299 static const char * eap_fast_parse_start(struct eap_fast_pac **pac)
301 if (*pac)
304 *pac = os_zalloc(sizeof(struct eap_fast_pac));
305 if (*pac == NULL)
306 return "No memory for PAC entry";
307 (*pac)->pac_type = PAC_TYPE_TUNNEL_PAC;
313 struct eap_fast_pac **pac)
315 if (*pac == NULL)
321 end->next = *pac;
323 *pac_root = *pac;
325 *pac = NULL;
330 static const char * eap_fast_parse_pac_type(struct eap_fast_pac *pac,
334 return "Cannot parse pac type";
335 pac->pac_type = atoi(pos);
336 if (pac->pac_type != PAC_TYPE_TUNNEL_PAC &&
337 pac->pac_type != PAC_TYPE_USER_AUTHORIZATION &&
338 pac->pac_type != PAC_TYPE_MACHINE_AUTHENTICATION)
339 return "Unrecognized PAC-Type";
345 static const char * eap_fast_parse_pac_key(struct eap_fast_pac *pac, char *pos)
353 return "Invalid PAC-Key";
356 os_memcpy(pac->pac_key, key, EAP_FAST_PAC_KEY_LEN);
363 static const char * eap_fast_parse_pac_opaque(struct eap_fast_pac *pac,
366 os_free(pac->pac_opaque);
367 pac->pac_opaque = eap_fast_parse_hex(pos, &pac->pac_opaque_len);
368 if (pac->pac_opaque == NULL)
369 return "Invalid PAC-Opaque";
374 static const char * eap_fast_parse_a_id(struct eap_fast_pac *pac, char *pos)
376 os_free(pac->a_id);
377 pac->a_id = eap_fast_parse_hex(pos, &pac->a_id_len);
378 if (pac->a_id == NULL)
384 static const char * eap_fast_parse_i_id(struct eap_fast_pac *pac, char *pos)
386 os_free(pac->i_id);
387 pac->i_id = eap_fast_parse_hex(pos, &pac->i_id_len);
388 if (pac->i_id == NULL)
394 static const char * eap_fast_parse_a_id_info(struct eap_fast_pac *pac,
397 os_free(pac->a_id_info);
398 pac->a_id_info = eap_fast_parse_hex(pos, &pac->a_id_info_len);
399 if (pac->a_id_info == NULL)
406 * eap_fast_load_pac - Load PAC entries (text format)
408 * @pac_root: Pointer to root of the PAC list (to be filled)
409 * @pac_file: Name of the PAC file/blob to load
416 struct eap_fast_pac *pac = NULL;
437 err = eap_fast_parse_start(&pac);
439 err = eap_fast_parse_end(pac_root, &pac);
441 } else if (!pac)
443 else if (os_strcmp(rc.buf, "PAC-Type") == 0)
444 err = eap_fast_parse_pac_type(pac, pos);
445 else if (os_strcmp(rc.buf, "PAC-Key") == 0)
446 err = eap_fast_parse_pac_key(pac, pos);
447 else if (os_strcmp(rc.buf, "PAC-Opaque") == 0)
448 err = eap_fast_parse_pac_opaque(pac, pos);
450 err = eap_fast_parse_a_id(pac, pos);
452 err = eap_fast_parse_i_id(pac, pos);
454 err = eap_fast_parse_a_id_info(pac, pos);
457 if (pac) {
458 err = "PAC block not terminated with END";
459 eap_fast_free_pac(pac);
470 wpa_printf(MSG_DEBUG, "EAP-FAST: Read %d PAC entries from '%s'",
556 wpa_printf(MSG_INFO, "EAP-FAST: Failed to open PAC "
574 static int eap_fast_add_pac_data(struct eap_fast_pac *pac, char **buf,
580 "START\nPAC-Type=%d\n", pac->pac_type);
585 eap_fast_write(buf, pos, buf_len, "PAC-Key",
586 pac->pac_key, EAP_FAST_PAC_KEY_LEN, 0);
587 eap_fast_write(buf, pos, buf_len, "PAC-Opaque",
588 pac->pac_opaque, pac->pac_opaque_len, 0);
589 eap_fast_write(buf, pos, buf_len, "PAC-Info",
590 pac->pac_info, pac->pac_info_len, 0);
592 pac->a_id, pac->a_id_len, 0);
594 pac->i_id, pac->i_id_len, 1);
596 pac->a_id_info, pac->a_id_info_len, 1);
598 wpa_printf(MSG_DEBUG, "EAP-FAST: No memory for PAC "
612 * eap_fast_save_pac - Save PAC entries (text format)
614 * @pac_root: Root of the PAC list
615 * @pac_file: Name of the PAC file/blob
621 struct eap_fast_pac *pac;
641 pac = pac_root;
642 while (pac) {
643 if (eap_fast_add_pac_data(pac, &buf, &pos, &buf_len)) {
648 pac = pac->next;
656 wpa_printf(MSG_DEBUG, "EAP-FAST: Wrote %d PAC entries into '%s'",
664 * eap_fast_pac_list_truncate - Truncate a PAC list to the given length
665 * @pac_root: Root of the PAC list
667 * Returns: Number of PAC entries removed
672 struct eap_fast_pac *pac, *prev;
675 pac = pac_root;
679 while (pac) {
683 prev = pac;
684 pac = pac->next;
693 while (pac) {
694 prev = pac;
695 pac = pac->next;
704 static void eap_fast_pac_get_a_id(struct eap_fast_pac *pac)
709 pos = pac->pac_info;
710 end = pos + pac->pac_info_len;
721 os_free(pac->a_id);
722 pac->a_id = os_malloc(len);
723 if (pac->a_id == NULL)
725 os_memcpy(pac->a_id, pos, len);
726 pac->a_id_len = len;
730 os_free(pac->a_id_info);
731 pac->a_id_info = os_malloc(len);
732 if (pac->a_id_info == NULL)
734 os_memcpy(pac->a_id_info, pos, len);
735 pac->a_id_info_len = len;
744 * eap_fast_load_pac_bin - Load PAC entries (binary format)
746 * @pac_root: Pointer to root of the PAC list (to be filled)
747 * @pac_file: Name of the PAC file/blob to load
756 struct eap_fast_pac *pac, *prev;
766 wpa_printf(MSG_INFO, "EAP-FAST: No PAC blob '%s' - "
767 "assume no PAC entries have been "
776 wpa_printf(MSG_INFO, "EAP-FAST: No PAC file '%s' - "
777 "assume no PAC entries have been "
791 wpa_printf(MSG_INFO, "EAP-FAST: Invalid PAC file '%s' (bin)",
798 pac = prev = NULL;
805 pac = os_zalloc(sizeof(*pac));
806 if (pac == NULL)
809 pac->pac_type = WPA_GET_BE16(pos);
811 os_memcpy(pac->pac_key, pos, EAP_FAST_PAC_KEY_LEN);
813 pac->pac_opaque_len = WPA_GET_BE16(pos);
815 if (pos + pac->pac_opaque_len + 2 > end)
817 pac->pac_opaque = os_malloc(pac->pac_opaque_len);
818 if (pac->pac_opaque == NULL)
820 os_memcpy(pac->pac_opaque, pos, pac->pac_opaque_len);
821 pos += pac->pac_opaque_len;
822 pac->pac_info_len = WPA_GET_BE16(pos);
824 if (pos + pac->pac_info_len > end)
826 pac->pac_info = os_malloc(pac->pac_info_len);
827 if (pac->pac_info == NULL)
829 os_memcpy(pac->pac_info, pos, pac->pac_info_len);
830 pos += pac->pac_info_len;
831 eap_fast_pac_get_a_id(pac);
835 prev->next = pac;
837 *pac_root = pac;
838 prev = pac;
844 wpa_printf(MSG_DEBUG, "EAP-FAST: Read %lu PAC entries from '%s' (bin)",
850 wpa_printf(MSG_INFO, "EAP-FAST: Failed to parse PAC file '%s' (bin)",
854 if (pac)
855 eap_fast_free_pac(pac);
861 * eap_fast_save_pac_bin - Save PAC entries (binary format)
863 * @pac_root: Root of the PAC list
864 * @pac_file: Name of the PAC file/blob
871 struct eap_fast_pac *pac;
875 pac = pac_root;
876 while (pac) {
877 if (pac->pac_opaque_len > 65535 ||
878 pac->pac_info_len > 65535)
880 len += 2 + EAP_FAST_PAC_KEY_LEN + 2 + pac->pac_opaque_len +
881 2 + pac->pac_info_len;
882 pac = pac->next;
895 pac = pac_root;
896 while (pac) {
897 WPA_PUT_BE16(pos, pac->pac_type);
899 os_memcpy(pos, pac->pac_key, EAP_FAST_PAC_KEY_LEN);
901 WPA_PUT_BE16(pos, pac->pac_opaque_len);
903 os_memcpy(pos, pac->pac_opaque, pac->pac_opaque_len);
904 pos += pac->pac_opaque_len;
905 WPA_PUT_BE16(pos, pac->pac_info_len);
907 os_memcpy(pos, pac->pac_info, pac->pac_info_len);
908 pos += pac->pac_info_len;
910 pac = pac->next;
919 wpa_printf(MSG_DEBUG, "EAP-FAST: Wrote %lu PAC entries into '%s' "