示例#1
0
void
wpa_calc_pmkR0(uchar *ssid, int ssid_len, uint16 mdid, uint8 *r0kh,
	uint r0kh_len, struct ether_addr *sta_ea,
	uint8 *pmk, uint pmk_len, uint8 *pmkr0, uint8 *pmkr0name)
{
	uint8 data[128], digest[PRF_OUTBUF_LEN];
	const char prefix[] = "FT-R0";
	const char prefix1[] = "FT-R0N";
	int data_len = 0;

	bcopy(prefix, data, strlen(prefix));
	data_len += strlen(prefix);
	data[data_len++] = (uint8)ssid_len;
	bcopy(ssid, &data[data_len], ssid_len);
	data_len += ssid_len;
	htol16_ua_store(mdid, &data[data_len]);
	data_len += sizeof(uint16);
	data[data_len++] = (uint8)r0kh_len;	/* ROKHlength */
	bcopy(r0kh, &data[data_len], r0kh_len);
	data_len += r0kh_len;
	bcopy(sta_ea, &data[data_len], ETHER_ADDR_LEN);
	data_len += ETHER_ADDR_LEN;

	hmac_sha256_n(pmk, pmk_len, data, data_len, digest, 48);
	bcopy(digest, pmkr0, 32);

	/* calc and return PMKR0Name */
	bcopy(prefix1, data, strlen(prefix1));
	data_len = strlen(prefix1);
	bcopy(&digest[32], &data[data_len], 16);
	data_len += 16;
	sha256(data, data_len, digest, 0);
	bcopy(digest, pmkr0name, WPA2_PMKID_LEN);
}
int
bcm_xtlv_put_16(struct bcm_tlvbuf *tbuf, uint16 type, const int16 data)
{
	bcm_xtlv_t *xtlv;
	if (tbuf == NULL || bcm_xtlv_buf_rlen(tbuf) < (2 + BCM_XTLV_HDR_SIZE))
		return BCME_BADARG;
	xtlv = (bcm_xtlv_t *)bcm_xtlv_buf(tbuf);
	xtlv->id = htol16(type);
	xtlv->len = htol16(sizeof(data));
	htol16_ua_store(data, xtlv->data);
	tbuf->buf += BCM_XTLV_SIZE(xtlv);
	return BCME_OK;
}