wlantest: Implement tkip_encrypt()
Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
		
							parent
							
								
									4425645113
								
							
						
					
					
						commit
						729f02e149
					
				
					 1 changed files with 49 additions and 2 deletions
				
			
		|  | @ -376,6 +376,53 @@ void tkip_get_pn(u8 *pn, const u8 *data) | |||
| u8 * tkip_encrypt(const u8 *tk, u8 *frame, size_t len, size_t hdrlen, u8 *qos, | ||||
| 		  u8 *pn, int keyid, size_t *encrypted_len) | ||||
| { | ||||
| 	/* TODO */ | ||||
| 	return NULL; | ||||
| 	u8 michael_hdr[16]; | ||||
| 	u8 mic[8]; | ||||
| 	struct ieee80211_hdr *hdr; | ||||
| 	u16 fc; | ||||
| 	const u8 *mic_key; | ||||
| 	u8 *crypt, *pos; | ||||
| 	u16 iv16; | ||||
| 	u32 iv32; | ||||
| 	u16 ttak[5]; | ||||
| 	u8 rc4key[16]; | ||||
| 
 | ||||
| 	if (len < sizeof(*hdr) || len < hdrlen) | ||||
| 		return NULL; | ||||
| 	hdr = (struct ieee80211_hdr *) frame; | ||||
| 	fc = le_to_host16(hdr->frame_control); | ||||
| 
 | ||||
| 	michael_mic_hdr(hdr, michael_hdr); | ||||
| 	mic_key = tk + ((fc & WLAN_FC_FROMDS) ? 16 : 24); | ||||
| 	michael_mic(mic_key, michael_hdr, frame + hdrlen, len - hdrlen, mic); | ||||
| 	wpa_hexdump(MSG_EXCESSIVE, "TKIP: MIC", mic, sizeof(mic)); | ||||
| 
 | ||||
| 	iv32 = WPA_GET_BE32(pn); | ||||
| 	iv16 = WPA_GET_BE16(pn + 4); | ||||
| 	tkip_mixing_phase1(ttak, tk, hdr->addr2, iv32); | ||||
| 	wpa_hexdump(MSG_EXCESSIVE, "TKIP TTAK", (u8 *) ttak, sizeof(ttak)); | ||||
| 	tkip_mixing_phase2(rc4key, tk, ttak, iv16); | ||||
| 	wpa_hexdump(MSG_EXCESSIVE, "TKIP RC4KEY", rc4key, sizeof(rc4key)); | ||||
| 
 | ||||
| 	crypt = os_malloc(len + 8 + sizeof(mic) + 4); | ||||
| 	if (crypt == NULL) | ||||
| 		return NULL; | ||||
| 	os_memcpy(crypt, frame, hdrlen); | ||||
| 	pos = crypt + hdrlen; | ||||
| 	os_memcpy(pos, rc4key, 3); | ||||
| 	pos += 3; | ||||
| 	*pos++ = keyid << 6 | BIT(5); | ||||
| 	*pos++ = pn[3]; | ||||
| 	*pos++ = pn[2]; | ||||
| 	*pos++ = pn[1]; | ||||
| 	*pos++ = pn[0]; | ||||
| 
 | ||||
| 	os_memcpy(pos, frame + hdrlen, len - hdrlen); | ||||
| 	os_memcpy(pos + len - hdrlen, mic, sizeof(mic)); | ||||
| 	WPA_PUT_LE32(pos + len - hdrlen + sizeof(mic), | ||||
| 		     crc32(pos, len - hdrlen + sizeof(mic))); | ||||
| 	wep_crypt(rc4key, pos, len - hdrlen + sizeof(mic) + 4); | ||||
| 
 | ||||
| 	*encrypted_len = len + 8 + sizeof(mic) + 4; | ||||
| 	return crypt; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Jouni Malinen
						Jouni Malinen