Beispiel #1
0
static int wpa_supplicant_install_gtk(struct wpa_sm *sm, const struct wpa_gtk_data *gd, const u8 *key_rsc)
{
	const u8 *_gtk = gd->gtk;
	u8 gtk_buf[32];

	//printf("wpa_supplicant_install_gtk %d %d\n", sm->group_cipher, sm->pairwise_cipher);
	printf("igtk\n");
	if (sm->group_cipher == WPA_CIPHER_TKIP) 
	{
		/* Swap Tx/Rx keys for Michael MIC */
		os_memcpy(gtk_buf, gd->gtk, 16);
		os_memcpy(gtk_buf + 16, gd->gtk + 24, 8);
		os_memcpy(gtk_buf + 24, gd->gtk + 16, 8);
		_gtk = gtk_buf;
	}
	if (sm->pairwise_cipher == WPA_CIPHER_NONE) 
	{
		if (wpa_driver_wext_set_key_ext(sm, gd->alg,
				   (u8 *) "\xff\xff\xff\xff\xff\xff",
				   gd->keyidx, 1, key_rsc, gd->key_rsc_len,
				   _gtk, gd->gtk_len) < 0) 
		{
			lwip_log("WPA: Failed to set GTK to the driver (Group only).\n");
			return -1;
		}
	} 
	else if (wpa_driver_wext_set_key_ext(sm, gd->alg, (u8 *)"\xff\xff\xff\xff\xff\xff",
				  gd->keyidx, gd->tx, key_rsc, gd->key_rsc_len, _gtk, gd->gtk_len) < 0) 
	{
		lwip_log("WPA: Failed to set GTK to the driver.\n");
		return -1;
	}
	//printf("gtk end\n");
	return 0;
}
static int wpa_driver_wext_set_key(void *priv, wpa_alg alg,
				   const u8 *addr, int key_idx,
				   int set_tx, const u8 *seq, size_t seq_len,
				   const u8 *key, size_t key_len)
{
	struct wpa_driver_wext_data *drv = priv;
	struct iwreq iwr;
	int ret = 0;

	wpa_printf(MSG_DEBUG, "%s: alg=%d key_idx=%d set_tx=%d seq_len=%lu "
		   "key_len=%lu",
		   __FUNCTION__, alg, key_idx, set_tx,
		   (unsigned long) seq_len, (unsigned long) key_len);

	ret = wpa_driver_wext_set_key_ext(drv, alg, addr, key_idx, set_tx,
					  seq, seq_len, key, key_len);
	if (ret == 0)
		return 0;

	if (ret == -EOPNOTSUPP &&
	    (alg == WPA_ALG_NONE || alg == WPA_ALG_WEP)) {
		wpa_printf(MSG_DEBUG, "Driver did not support "
			   "SIOCSIWENCODEEXT, trying SIOCSIWENCODE");
		ret = 0;
	} else {
		wpa_printf(MSG_DEBUG, "Driver did not support "
			   "SIOCSIWENCODEEXT");
		return ret;
	}

	memset(&iwr, 0, sizeof(iwr));
	strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
	iwr.u.encoding.flags = key_idx + 1;
	if (alg == WPA_ALG_NONE)
		iwr.u.encoding.flags |= IW_ENCODE_DISABLED;
	iwr.u.encoding.pointer = (caddr_t) key;
	iwr.u.encoding.length = key_len;

	if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {
		perror("ioctl[SIOCSIWENCODE]");
		ret = -1;
	}

	if (set_tx && alg != WPA_ALG_NONE) {
		memset(&iwr, 0, sizeof(iwr));
		strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
		iwr.u.encoding.flags = key_idx + 1;
		iwr.u.encoding.pointer = (caddr_t) key;
		iwr.u.encoding.length = 0;
		if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {
			perror("ioctl[SIOCSIWENCODE] (set_tx)");
			ret = -1;
		}
	}

	return ret;
}
Beispiel #3
0
static int wpa_supplicant_install_ptk(struct wpa_sm *sm, const struct wpa_eapol_key *key)
{
	int keylen, rsclen, i;
	wpa_alg alg;
	const u8 *key_rsc;
	u8 null_rsc[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };

	printf("iptk\n");
	switch (sm->pairwise_cipher) 
	{
	case WPA_CIPHER_CCMP:
		alg = WPA_ALG_CCMP;
		keylen = 16;
		rsclen = 6;
		break;
	case WPA_CIPHER_TKIP:
		alg = WPA_ALG_TKIP;
		keylen = 32;
		rsclen = 6;
		break;
	case WPA_CIPHER_NONE:
		lwip_log("WPA: Pairwise Cipher Suite: NONE - do not use pairwise keys\n");
		return 0;
	default:
		lwip_log("WPA: Unsupported pairwise cipher %d\n", sm->pairwise_cipher);
		return -1;
	}

	if (sm->proto == WPA_PROTO_RSN) 
	{
		key_rsc = null_rsc;
	} 
	else 
	{
		key_rsc = key->key_rsc;
	}

    if (wpa_driver_wext_set_key_ext(sm, alg, sm->bssid, 0, 1, key_rsc, rsclen, (u8*)sm->ptk.tk1, keylen) < 0)
    {
		lwip_log("WPA: Failed to set PTK to the driver.\n");
		return -1;       
    }
	return 0;
}