INT NfcBuildWscProfileTLV( IN PRTMP_ADAPTER pAd, IN PWSC_CTRL pWscCtrl, OUT UCHAR *pbuf, OUT USHORT *pBufLen) { INT Status = NDIS_STATUS_SUCCESS; PWSC_CREDENTIAL pCredential = NULL; UCHAR apidx = pWscCtrl->EntryIfIdx; UCHAR *TB = NULL; UCHAR *pData = NULL, *pSrcData = NULL; INT CerLen = 0; USHORT AuthType = 0; USHORT EncrType = 0; PWSC_REG_DATA pReg = (PWSC_REG_DATA) &pWscCtrl->RegData; INT Len = 0, templen = 0; struct wifi_dev *wdev; MULTISSID_STRUCT *pMbss; #ifdef WSC_V2_SUPPORT PWSC_TLV pWscTLV = &pWscCtrl->WscV2Info.ExtraTlv; #endif /* WSC_V2_SUPPORT */ os_alloc_mem(pAd, (UCHAR **)&pData, (NFC_WSC_TLV_SIZE*sizeof(UCHAR))); if (pData == NULL) { return NDIS_STATUS_RESOURCES; } os_alloc_mem(pAd, (UCHAR **)&TB, (256*sizeof(UCHAR))); if (TB == NULL) { os_free_mem(NULL, pData); return NDIS_STATUS_RESOURCES; } pMbss = &pAd->ApCfg.MBSSID[apidx]; wdev = &pMbss->wdev; pSrcData = pData; NdisZeroMemory(pData, NFC_WSC_TLV_SIZE); NdisZeroMemory(&TB[0], 256); WscCreateProfileFromCfg(pAd, REGISTRAR_ACTION | AP_MODE, pWscCtrl, &pWscCtrl->WscProfile); pCredential = &pAd->ApCfg.MBSSID[apidx].WscControl.WscProfile.Profile[0]; // Credential CerLen += AppendWSCTLV(WSC_ID_NW_INDEX, &TB[0], (PUCHAR)"1", 0); AuthType = cpu2be16(pCredential->AuthType); EncrType = cpu2be16(pCredential->EncrType); CerLen += AppendWSCTLV(WSC_ID_SSID, &TB[CerLen], pCredential->SSID.Ssid, pCredential->SSID.SsidLength); CerLen += AppendWSCTLV(WSC_ID_AUTH_TYPE, &TB[CerLen], (UINT8 *)&AuthType, 0); CerLen += AppendWSCTLV(WSC_ID_ENCR_TYPE, &TB[CerLen], (UINT8 *)&EncrType, 0); CerLen += AppendWSCTLV(WSC_ID_NW_KEY_INDEX, &TB[CerLen], &pCredential->KeyIndex, 0); CerLen += AppendWSCTLV(WSC_ID_NW_KEY, &TB[CerLen], pCredential->Key, pCredential->KeyLength); CerLen += AppendWSCTLV(WSC_ID_MAC_ADDR, &TB[CerLen], wdev->bssid, 0); // Prepare plain text // Reguired attribute item in M8 if Enrollee is STA. templen = AppendWSCTLV(WSC_ID_CREDENTIAL, pData, TB, CerLen); pData += templen; Len += templen; /* Optional items. RF_Band, AP_Channel, MAC_Address */ UCHAR RF_Band; if (pAd->CommonCfg.Channel > 14) RF_Band = 0x02; /* 5.0GHz */ else RF_Band = 0x01; /* 2.4GHz */ templen = AppendWSCTLV(WSC_ID_RF_BAND, pData, &RF_Band, 0); pData += templen; Len += templen; USHORT Channel = 0; Channel = pAd->CommonCfg.Channel; #ifdef RT_BIG_ENDIAN Channel = SWAP16(Channel); #endif /* RT_BIG_ENDIAN */ templen = AppendWSCTLV(WSC_ID_AP_CHANNEL, pData, (UINT8 *)&Channel, 0); pData += templen; Len += templen; templen = AppendWSCTLV(WSC_ID_MAC_ADDR, pData, wdev->bssid, 0); pData += templen; Len += templen; #ifdef WSC_V2_SUPPORT if (pWscCtrl->WscV2Info.bEnableWpsV2) { /* Version2 */ WscGenV2Msg(pWscCtrl, FALSE, NULL, 0, &pData, &Len); /* Extra attribute that is not defined in WSC Sepc. */ if (pWscTLV->pTlvData && pWscTLV->TlvLen) { templen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen); pData += templen; Len += templen; } } #endif // WSC_V2_SUPPORT // hex_dump("NfcBuildWscProfileTLV - pData", pSrcData, Len); if (pbuf && (Len < NFC_WSC_TLV_SIZE)) { NdisMoveMemory(pbuf, pSrcData, Len); *pBufLen = (USHORT)Len; hex_dump("NfcBuildWscProfileTLV", pbuf, *pBufLen); } else { DBGPRINT(RT_DEBUG_TRACE, ("%s: (Len=%d)\n", __FUNCTION__, Len)); Status = NDIS_STATUS_RESOURCES; } os_free_mem(NULL, pSrcData); os_free_mem(NULL, TB); return Status; }
BOOLEAN WscWriteProfileToUfdFile( IN PRTMP_ADAPTER pAd, IN UCHAR ApIdx, IN PSTRING pUfdFileName) { PWSC_CTRL pWscControl = &pAd->ApCfg.MBSSID[ApIdx].WscControl; PWSC_CREDENTIAL pCredential = &pWscControl->WscProfile.Profile[0]; RTMP_OS_FS_INFO osFSInfo; RTMP_OS_FD file_w; PSTRING offset, pXmlTemplate = (PSTRING)XML_TEMPLATE; BOOLEAN bFound = FALSE, bRtn = TRUE; UCHAR Guid[UUID_LEN_HEX]; UCHAR Guid_Str[UUID_LEN_STR]; if (pUfdFileName == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("--> %s: pUfdFileName is NULL\n", __FUNCTION__)); return FALSE; } RtmpOSFSInfoChange(&osFSInfo, TRUE); file_w = RtmpOSFileOpen(pUfdFileName, O_WRONLY|O_TRUNC|O_CREAT, 0); if (IS_FILE_OPEN_ERR(file_w)) { DBGPRINT(RT_DEBUG_TRACE, ("--> %s: Error opening file %s\n", __FUNCTION__, pUfdFileName)); return FALSE; } else { WscCreateProfileFromCfg(pAd, AP_MODE, pWscControl, &pWscControl->WscProfile); WscGenerateUUID(pAd, &Guid[0], &Guid_Str[0], ApIdx, TRUE); if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_GUID_MARK)) != NULL) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); RtmpOSFileWrite(file_w, (PSTRING)&Guid_Str[0], (int)UUID_LEN_STR); pXmlTemplate = offset + strlen(XML_GUID_MARK); } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_AP_GUID_MARK)) != NULL) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); RtmpOSFileWrite(file_w, (PSTRING)&pWscControl->Wsc_Uuid_Str[0], (int)UUID_LEN_STR); pXmlTemplate = offset + strlen(XML_AP_GUID_MARK); } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_SSID_MARK)) != NULL) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); RtmpOSFileWrite(file_w, (PSTRING)&pCredential->SSID.Ssid[0], (int)pCredential->SSID.SsidLength); pXmlTemplate = offset + strlen(XML_SSID_MARK); } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_AUTH_MARK)) != NULL) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); for (PWSC_UFD_AUTH_TYPE = WSC_UFD_AUTH_TYPE; PWSC_UFD_AUTH_TYPE->auth_str; PWSC_UFD_AUTH_TYPE++) { if (PWSC_UFD_AUTH_TYPE->auth_type == pCredential->AuthType) { RtmpOSFileWrite(file_w, (PSTRING)PWSC_UFD_AUTH_TYPE->auth_str, (int)strlen(PWSC_UFD_AUTH_TYPE->auth_str)); bFound = TRUE; break; } } pXmlTemplate = offset + strlen(XML_AUTH_MARK); if (bFound == FALSE) { DBGPRINT(RT_DEBUG_TRACE, ("--> %s: Unknow Auth Type(=%x)\n", __FUNCTION__, pCredential->AuthType)); bRtn = FALSE; goto out; } } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_ENCR_MARK)) != NULL) { bFound = FALSE; RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); for (PWSC_UFD_ENCR_TYPE = WSC_UFD_ENCR_TYPE; PWSC_UFD_ENCR_TYPE->encr_str; PWSC_UFD_ENCR_TYPE++) { if (PWSC_UFD_ENCR_TYPE->encr_type == pCredential->EncrType) { RtmpOSFileWrite(file_w, (PSTRING)PWSC_UFD_ENCR_TYPE->encr_str, (int)strlen(PWSC_UFD_ENCR_TYPE->encr_str)); bFound = TRUE; } } pXmlTemplate = offset + strlen(XML_ENCR_MARK); if (bFound == FALSE) { DBGPRINT(RT_DEBUG_TRACE, ("--> %s: Unknow Encr Type(=%x)\n", __FUNCTION__, pCredential->EncrType)); bRtn = FALSE; goto out; } } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_KEY_MARK)) != NULL) { if (pCredential->EncrType != WSC_ENCRTYPE_NONE) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); RtmpOSFileWrite(file_w, (PSTRING)pCredential->Key, (int)pCredential->KeyLength); pXmlTemplate = offset + strlen(XML_KEY_MARK); } else { RtmpOSFileWrite(file_w, (PSTRING)XML_ENCR_END, (int)strlen(XML_ENCR_END)); RtmpOSFileWrite(file_w, (PSTRING)"\n", (int)1); pXmlTemplate = offset + strlen(XML_KEY_MARK) + strlen(XML_KEY_END) + 1; /* 1: '\n' */ } } RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)strlen(pXmlTemplate)); } out: RtmpOSFileClose(file_w); RtmpOSFSInfoChange(&osFSInfo, FALSE); return bRtn; }