diff options
Diffstat (limited to 'network/wlan/WDI/COMMON/Wapi.h')
| -rw-r--r-- | network/wlan/WDI/COMMON/Wapi.h | 478 |
1 files changed, 478 insertions, 0 deletions
diff --git a/network/wlan/WDI/COMMON/Wapi.h b/network/wlan/WDI/COMMON/Wapi.h new file mode 100644 index 00000000..bf45131d --- /dev/null +++ b/network/wlan/WDI/COMMON/Wapi.h @@ -0,0 +1,478 @@ +#ifndef __INC_WAPI_H +#define __INC_WAPI_H + + //add by ylb for WAPI IHV Support 20111114 +#define DOT11_AUTH_ALGO_WAPI_PSK DOT11_AUTH_ALGO_IHV_START + 0x00000010L +#define DOT11_AUTH_ALGO_WAPI_CERTIFICATE DOT11_AUTH_ALGO_IHV_START + 0x00000011L +#define DOT11_CIPHER_ALGO_WAPI_SMS4 DOT11_CIPHER_ALGO_IHV_START + 0x00000010L + +#define WAPI_END NULL +typedef enum _RT_WAPI_CALLBACK_FUNC_DEF +{ + //One Param + WAPI_ENABLEWAPISUPPORT=0, + WAPI_INIT=1, + WAPI_RETURNALLCAMENTRY=2, + WAPI_RETURNALLSTAINFO=3, + WAPI_FREEALLSTAINFO=4, + WAPI_CONSTRUCTBEACON=5, + //Two Param + WAPI_CONSTRUCTASSOCIATEREQ=6, + WAPI_CONSTRUCTPROBERSP=7, + WAPI_ENABLEHWSECCONFIG=8, + WAPI_MLMEONASSOCOK=9, + WAPI_PRETRANSMITTCB=10, + WAPI_PROCESSRECEIVEDPACKET=11, + WAPI_DROPFORRXREORDER=12, + WAPI_DROPFORSECKEYABSENT= 13, + WAPI_RETURNONESTAINFO=14, + WAPI_RETURNONESTACAMENTRY=15, + WAPI_SECSWSMS4ENCRYPTION= 16, + WAPI_SECSWSMS4DECRYPTION=17, + //Three Param + WAPI_SECHEADERFILLIV = 18, + WAPI_SECISWAIPACKET = 19, + WAPI_SETAUTHENCRYPTSTATE = 20, + //four Param + WAPI_SETCAMENTRY = 21, + + WAPI_MAX =100, +}RT_WAPI_FUNC_E; + + +#if (WAPI_SUPPORT == 1) +#define WAPI_MAXARGS 3 +#define WAPI_QUERY 0 +#define WAPI_SET 1 +typedef enum _RT_WAPI_QUERYSET_VARIABLE +{ + WAPI_VAR_WAPISUPPORT, + WAPI_VAR_WAPIENABLE, + WAPI_VAR_WAPIIHVSUPPORT, + WAPI_VAR_ISCAMUSED, + WAPI_VAR_FIRSTAUTHENTIATEINPROGRESS, + WAPI_VAR_NOTSETENCMACHEADER, + WAPI_VAR_WAPIPSK, + + WAPI_VAR_MAX =255, +}RT_WAPI_QUERYSET_VARIABLE; + +typedef enum _WAPI_REQUEST_TYPE +{ + WAPI_REQUEST_QUERY, + WAPI_REQUEST_SET, + WAPI_REQUEST_METHOD, +} WAPI_REQUEST_TYPE, *PWAPI_REQUEST_TYPE; + + +typedef union _WAPI_REQUEST_DATA +{ + struct _WAPI_QUERY_INFO + { + ULONG Oid; + ULONG BytesWritten; + ULONG BytesNeeded; + ULONG InformationBufferLength; + UCHAR InformationBuffer[1]; + } WAPI_QUERY_INFO; + + struct _WAPI_SET_INFO + { + ULONG Oid; + ULONG BytesRead; + ULONG BytesNeeded; + ULONG InformationBufferLength; + UCHAR InformationBuffer[1]; + } WAPI_SET_INFO; + + struct _WAPI_METHOD_INFO + { + ULONG Oid; + ULONG BytesWritten; + ULONG BytesNeeded; + ULONG BytesRead; + ULONG InputBufferLength; + ULONG InformationBufferLength; + UCHAR InformationBuffer[1]; + } WAPI_METHOD_INFO; + +} WAPI_REQUEST_DATA, *PWAPI_REQUEST_DATA; + + +typedef struct _WAPI_REQUEST +{ + ULONG wapiRequestLen; // length of entire structure + UCHAR wapiRequestOUI[4]; // vendor specific OUI value + WAPI_REQUEST_TYPE wapiRequestType; + WAPI_REQUEST_DATA wapiRequestData; +} WAPI_REQUEST, *PWAPI_REQUEST; + + + //add by ylb for WAPI IHV Support 20111114 +#define DOT11_AUTH_ALGO_WAPI_PSK DOT11_AUTH_ALGO_IHV_START + 0x00000010L +#define DOT11_AUTH_ALGO_WAPI_CERTIFICATE DOT11_AUTH_ALGO_IHV_START + 0x00000011L +#define DOT11_CIPHER_ALGO_WAPI_SMS4 DOT11_CIPHER_ALGO_IHV_START + 0x00000010L + + +#define WAPI_LITTLE_ENDIAN +#define ENCRYPT 0 +#define DECRYPT 1 +typedef unsigned char muint8; +typedef unsigned short muint16; +typedef unsigned int muint32; + +static const muint8 Sbox_WAPI[256] = { +0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, +0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99, +0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62, +0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6, +0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8, +0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35, +0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87, +0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e, +0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1, +0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3, +0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f, +0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51, +0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8, +0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0, +0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84, +0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48 +}; + +static const muint32 CK[32] = { + 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, + 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, + 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, + 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, + 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, + 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 }; + +#define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y)))) + +#define ByteSub(_A) (Sbox_WAPI[(_A) >> 24 & 0xFF] << 24 ^ \ + Sbox_WAPI[(_A) >> 16 & 0xFF] << 16 ^ \ + Sbox_WAPI[(_A) >> 8 & 0xFF] << 8 ^ \ + Sbox_WAPI[(_A) & 0xFF]) + +#define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24)) +#define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23)) + + +/*--------------------------------------------------------------------------- +WAPI Related OID +-----------------------------------------------------------------------------*/ +#define OID_RT_WAPI_GET_INFO 0xFFEDC201 +#define OID_RT_WAPI_SET_KEY 0xFFEDC202 +#define OID_RT_WAPI_GET_PN 0xFFEDC203 +#define OID_RT_WAPI_RECEIVE_PACKET 0xFFEDC204 +#define OID_RT_WAPI_SET_DESTNATION_ADDRESS 0xFFEDC205 +#define OID_RT_WAPI_SEND_WAI_PACKET 0xFFEDC206 +#define OID_WAPI_ASUE_CREATE_THREAD 0xFFEDC207 +#define OID_WAPI_ASUE_SET_MUTICAST_PN 0xFFEDC208 +#define OID_RT_WAPI_SUPPORT 0xFFEDC209 +#define OID_RT_WAPI_AE_START 0xFFEDC20A +#define OID_RT_WAPI_IHV_SUPPORT 0xFFEDC20B //For WAPI IHV service support add by ylb 20111114 +#define OID_RT_WAPI_ENABLE 0xFFEDC20C //For WAPI Enbale. add by YJ, 20121112 + +#define WAPI_MAX_BKID_NUM 64 +#define WAPI_MAX_RECEIVE_NUM 128 +#define WAPI_MAX_OPTION_NUM 64 +#define WAPI_CAM_ENTRY_NUM 14 // 28/2=14 + +// +// 2011/01/11 MH Add for WAPI callback function table. +// +typedef struct tag_Wapi_Handler_Def +{ + //char *name; /* Wapi function string */ + //char *desc; /* Description */ + //char *usage; /* Usage of the command */ + //int directory; /* Directory */ + INT32 wapi_func_name; /* Use enum to define the function name. */ + RT_STATUS (*wapi_func1) + ( IN PADAPTER pAdapter); + RT_STATUS (*wapi_func2) + ( IN PADAPTER pAdapter, + IN PVOID pWapiParam); + RT_STATUS (*wapi_func3) + ( IN PADAPTER pAdapter, + IN PVOID pWapiParam1, + IN PVOID pWapiParam2); + RT_STATUS (*wapi_func4) + ( IN PADAPTER pAdapter, + IN PVOID pWapiParam1, + IN PVOID pWapiParam2, + IN PVOID pWapiParam3); + /* WAPI function pointer */ +}WAPI_T; + +// 2011/01/12 MH Define All the WAPI functio from the entry point +// typedef enum _RT_WAPI_CALLBACK_FUNC_DEF +// { +// //One Param +// WAPI_ENABLEWAPISUPPORT=0, +// WAPI_INIT=1, +// WAPI_RETURNALLCAMENTRY=2, +// WAPI_RETURNALLSTAINFO=3, +// WAPI_FREEALLSTAINFO=4, +// WAPI_CONSTRUCTBEACON=5, +// //Two Param +// WAPI_CONSTRUCTASSOCIATEREQ=6, +// WAPI_CONSTRUCTPROBERSP=7, +// WAPI_ENABLEHWSECCONFIG=8, +// WAPI_MLMEONASSOCOK=9, +// WAPI_PRETRANSMITTCB=10, +// WAPI_PROCESSRECEIVEDPACKET=11, +// WAPI_DROPFORRXREORDER=12, +// WAPI_DROPFORSECKEYABSENT= 13, +// WAPI_RETURNONESTAINFO=14, +// WAPI_RETURNONESTACAMENTRY=15, +// WAPI_SECSWSMS4ENCRYPTION= 16, +// WAPI_SECSWSMS4DECRYPTION=17, +// //Three Param +// WAPI_SECHEADERFILLIV = 18, +// WAPI_SECISWAIPACKET = 19, +// WAPI_SETAUTHENCRYPTSTATE = 20, +// //four Param +// WAPI_SETCAMENTRY = 21, +// +// WAPI_MAX =100, +// }RT_WAPI_FUNC_E; + + +typedef struct _RT_WAPI_BKID +{ + RT_LIST_ENTRY list; + u1Byte bkid[16]; +}RT_WAPI_BKID,*PRT_WAPI_BKID; + +typedef struct _RT_WAPI_KEY +{ + u1Byte dataKey[16]; + u1Byte micKey[16]; + u1Byte keyId; + BOOLEAN bSet; + BOOLEAN bTxEnable; + + //For recording the write-cam idx. + u1Byte CamIdx; +}RT_WAPI_KEY,*PRT_WAPI_KEY; + +typedef struct _RT_WAPI_RECEIVE +{ + RT_LIST_ENTRY list; + BOOLEAN bAuthenticator; + u1Byte recvBuff[1500]; + u2Byte recvBuffLength; + u1Byte destAddr[6]; +}RT_WAPI_RECEIVE,*PRT_WAPI_RECEIVE; + +typedef struct _RT_WAPI_OPTION +{ + RT_LIST_ENTRY list; + u1Byte option; + u1Byte macAddr[6]; +}RT_WAPI_OPTION,*PRT_WAPI_OPTION; + +typedef enum _RT_WAPI_AE_OPTION +{ + WAPI_AE_NONE=0, + WAPI_AE_RECV_WAI_PACKET=1, + WAPI_AE_UPDATE_BK=2, + WAPI_AE_UPDATE_USK=3, + WAPI_AE_UPDATE_MSK=4, + WAPI_AE_FIRST_AUTHENTICATOR=5, + WAPI_AE_DISCONNECT=6 +}RT_WAPI_AE_OPTION; + +typedef enum _RT_WAPI_ASUE_OPTION +{ + WAPI_ASUE_NONE=0, + WAPI_ASUE_RECV_WAI_PACKET=1, + WAPI_ASUE_UPDATE_BK=2, + WAPI_ASUE_UPDATE_USK=3, + WAPI_ASUE_DISCONNECT=4 +}RT_WAPI_ASUE_OPTION; + +typedef enum _RT_WAPI_PACKET_TYPE +{ + WAPI_NONE = 0, + WAPI_PREAUTHENTICATE=1, + WAPI_STAKEY_REQUEST=2, + WAPI_AUTHENTICATE_ACTIVE=3, + WAPI_ACCESS_AUTHENTICATE_REQUEST=4, + WAPI_ACCESS_AUTHENTICATE_RESPONSE=5, + WAPI_CERTIFICATE_AUTHENTICATE_REQUEST=6, + WAPI_CERTIFICATE_AUTHENTICATE_RESPONSE=7, + WAPI_USK_REQUEST=8, + WAPI_USK_RESPONSE=9, + WAPI_USK_CONFIRM=10, + WAPI_MSK_NOTIFICATION=11, + WAPI_MSK_RESPONSE=12 +}RT_WAPI_PACKET_TYPE; + +typedef struct _RT_WAPI_STA_INFO +{ + RT_LIST_ENTRY list; + u1Byte PeerMacAddr[6]; + RT_WAPI_KEY wapiUsk; + RT_WAPI_KEY wapiUskUpdate; + RT_WAPI_KEY wapiMsk; + RT_WAPI_KEY wapiMskUpdate; + u1Byte lastRxUnicastPN[16]; + u1Byte lastTxUnicastPN[16]; + u1Byte lastRxMulticastPN[16]; + u1Byte lastRxUnicastPNBEQueue[16]; + u1Byte lastRxUnicastPNBKQueue[16]; + u1Byte lastRxUnicastPNVIQueue[16]; + u1Byte lastRxUnicastPNVOQueue[16]; + BOOLEAN bSetkeyOk; + BOOLEAN bAuthenticateInProgress; + BOOLEAN bAuthenticatorInUpdata; + BOOLEAN bAESetkeyOk; +}RT_WAPI_STA_INFO,*PRT_WAPI_STA_INFO; + +//Added for HW wapi en/decryption +typedef struct _RT_WAPI_CAM_ENTRY{ + //RT_LIST_ENTRY list; + u1Byte IsUsed; + u1Byte entry_idx;//for cam entry + u1Byte keyidx; // 0 or 1,new or old key + u1Byte PeerMacAddr[6]; + u1Byte type; //should be 110,wapi +}RT_WAPI_CAM_ENTRY,*PRT_WAPI_CAM_ENTRY; + +typedef struct _RT_WAPI_T +{ +//WAPI IE + u1Byte assoReqWapiIE[256]; + u1Byte assoReqWapiIELength; + u1Byte assoRspWapiIE[256]; + u1Byte assoRspWapiIELength; + u1Byte sendbeaconWapiIE[256]; + u1Byte sendbeaconWapiIELength; +//BKID + RT_WAPI_BKID wapiBKID[WAPI_MAX_BKID_NUM]; + RT_LIST_ENTRY wapiBKIDIdleList; + RT_LIST_ENTRY wapiBKIDStoreList; +//Key for Tx Multicast/Broadcast + RT_WAPI_KEY wapiTxMsk; +// RT_WAPI_KEY wapiTxMskUpdate; + +//Option + RT_WAPI_OPTION wapiAEOption[WAPI_MAX_OPTION_NUM]; + RT_LIST_ENTRY wapiAEOptionIdleList; + RT_LIST_ENTRY wapiAEOptionUsedList; + RT_WAPI_OPTION wapiASUEOption[WAPI_MAX_OPTION_NUM]; + RT_LIST_ENTRY wapiASUEOptionIdleList; + RT_LIST_ENTRY wapiASUEOptionUsedList; +//Receive Packet + RT_WAPI_RECEIVE wapiRecvPacket[WAPI_MAX_RECEIVE_NUM]; + RT_LIST_ENTRY wapiRxIdleList; + RT_LIST_ENTRY wapiRxBusyList; + u1Byte wapiDestMacAddr[6]; + BOOLEAN bAuthenticator; +//sec related + u1Byte lastTxMulticastPN[16]; + RT_WAPI_STA_INFO wapiSta[WAPI_MAX_OPTION_NUM]; + RT_LIST_ENTRY wapiSTAIdleList; + RT_LIST_ENTRY wapiSTAUsedList; +// + BOOLEAN bWapiEnable; + BOOLEAN bUpdateUsk; + BOOLEAN bUpdateMsk; +//store WAPI IE + u1Byte wapiIE[256]; + u1Byte wapiIELength; + BOOLEAN bWapiNotSetEncMacHeader; + BOOLEAN bWapiPSK; + BOOLEAN bFirstAuthentiateInProgress; +//last sequece number for wai packet + u2Byte wapiSeqnumAndFragNum; + +//For HW wapi + RT_WAPI_CAM_ENTRY wapiCamEntry[WAPI_CAM_ENTRY_NUM]; + //RT_LIST_ENTRY wapiCamIdleList; + //RT_LIST_ENTRY wapiCamUsedList; + +// For WAPI IHV Support + u1Byte bIsWapiIHVSupport; + +}RT_WAPI_T,*PRT_WAPI_T; + + +typedef struct _WLAN_HEADER_WAPI_EXTENSION +{ + u1Byte KeyIdx; + u1Byte Reserved; + u1Byte PN[16]; + +} WLAN_HEADER_WAPI_EXTENSION, *PWLAN_HEADER_WAPI_EXTENSION; + +NDIS_STATUS +WAPI_EventQuerySetInformation( + IN PADAPTER pAdapter, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InputBufferLength, + IN ULONG OutputBufferLength, + IN ULONG MethodId, + OUT PULONG BytesWritten, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ); + +void +WAPI_OptionHandler( + PADAPTER Adapter, + pu1Byte DestAddr, + BOOLEAN bUpdateBK, + BOOLEAN bUpdateUSK, + BOOLEAN bUpdateMSK, + BOOLEAN bAERecvPacket, + BOOLEAN bASUERecvPacket, + BOOLEAN bDisconnect +); + +RT_STATUS +WAPI_SecFuncHandler( + IN UINT32 WapiFunc, + IN PVOID pWapiParam, + ... +); + +RT_STATUS +WAPI_OidHandler( + IN PADAPTER pAdapter, + IN u1Byte PlatformFlag, + IN u1Byte SetQuery, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesWrittenOrRead, + OUT PULONG BytesNeeded + ); + +u1Byte +WAPI_QuerySetVariable( + IN PADAPTER Adapter, + IN u1Byte QuerySet, + IN u1Byte VariableName, + IN u1Byte VariableParam + ); + +#else +#define WAPI_OptionHandler(Adapter, DestAddr, bUpdateBK, bUpdateUSK, bUpdateMSK, bAERecvPacket, bASUERecvPacket, bDisconnect) +#define WAPI_OidHandler(pAdapter,PlatformFlag,SetQuery,Oid,InformationBuffer,InformationBufferLength,BytesWrittenOrRead,BytesNeeded) NDIS_STATUS_NOT_RECOGNIZED +#define WAPI_EventQuerySetInformation(pAdapter,Oid,InformationBuffer,InputBufferLength,OutputBufferLength,MethodId,BytesWritten,BytesRead,BytesNeeded) NDIS_STATUS_INVALID_OID +#define WAPI_QuerySetVariable(pAdapter, QuerySet,VariableName,VariableParam) 0 + + +__inline RT_STATUS WAPI_SecFuncHandler(UINT32 WapiFunc, PVOID pWapiParam,...){ return RT_STATUS_NOT_SUPPORT;} + +#endif // #ifndef __INC_SUPPLICANT_H +#endif + |
