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; }