summaryrefslogtreecommitdiff
path: root/cleopatre/devkit/mt7601udrv/common/cmm_info.c
diff options
context:
space:
mode:
Diffstat (limited to 'cleopatre/devkit/mt7601udrv/common/cmm_info.c')
-rw-r--r--cleopatre/devkit/mt7601udrv/common/cmm_info.c238
1 files changed, 237 insertions, 1 deletions
diff --git a/cleopatre/devkit/mt7601udrv/common/cmm_info.c b/cleopatre/devkit/mt7601udrv/common/cmm_info.c
index 4d69674a66..439c178855 100644
--- a/cleopatre/devkit/mt7601udrv/common/cmm_info.c
+++ b/cleopatre/devkit/mt7601udrv/common/cmm_info.c
@@ -25,7 +25,14 @@
#include "rt_config.h"
-
+#ifdef P1905_AP_AUTO_CONFIGURED
+extern UINT8 WPS_DH_G_VALUE[1];
+extern UINT8 WPS_DH_P_VALUE[192];
+extern int WscDeriveKey (
+ unsigned char *kdk, unsigned int kdk_len,
+ unsigned char *prsnlString, unsigned int str_len,
+ unsigned char *key, unsigned int keyBits );
+#endif
/*
==========================================================================
@@ -6149,3 +6156,232 @@ INT RTMPShowCfgValue(
return Status;
}
+#ifdef P1905_AP_AUTO_CONFIGURED
+VOID Get_DH_Pub_Key(
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq)
+{
+ DH_TABLE *pDHTab = NULL;
+ UINT pub_key_len = 0;
+ INT status;
+
+ os_alloc_mem(NULL, (UCHAR **)&pDHTab, sizeof(DH_TABLE));
+ if (pDHTab == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
+ return;
+ }
+
+ status = copy_from_user(pDHTab, wrq->u.data.pointer, wrq->u.data.length);
+ if(status)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Copy from user error!!!\n", __FUNCTION__));
+ os_free_mem(NULL, pDHTab);
+ return;
+ }
+
+ pub_key_len = sizeof(pDHTab->pub_key);
+ RT_DH_PublicKey_Generate(
+ WPS_DH_G_VALUE, sizeof(WPS_DH_G_VALUE),
+ WPS_DH_P_VALUE, sizeof(WPS_DH_P_VALUE),
+ pDHTab->priv_key, sizeof(pDHTab->priv_key),
+ pDHTab->pub_key, &pub_key_len);
+
+ wrq->u.data.length = sizeof(DH_TABLE);
+ if (copy_to_user(wrq->u.data.pointer, pDHTab, wrq->u.data.length))
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
+ }
+
+ os_free_mem(NULL, pDHTab);
+}
+
+VOID Get_DH_Secu_Key(
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq)
+{
+ DH_TABLE *pDHTab = NULL;
+ INT status;
+ UINT dh_len;
+
+ os_alloc_mem(NULL, (UCHAR **)&pDHTab, sizeof(DH_TABLE));
+ if (pDHTab == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
+ return;
+ }
+
+ status = copy_from_user(pDHTab, wrq->u.data.pointer, wrq->u.data.length);
+ if(status)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Copy from user error!!!\n", __FUNCTION__));
+ os_free_mem(NULL, pDHTab);
+ return;
+ }
+
+ dh_len = sizeof(pDHTab->secu_key);
+ RT_DH_SecretKey_Generate(
+ pDHTab->pub_key, sizeof(pDHTab->pub_key),
+ WPS_DH_P_VALUE, sizeof(WPS_DH_P_VALUE),
+ pDHTab->priv_key, sizeof(pDHTab->priv_key),
+ pDHTab->secu_key, &dh_len);
+
+ wrq->u.data.length = sizeof(DH_TABLE);
+ if (copy_to_user(wrq->u.data.pointer, pDHTab, wrq->u.data.length))
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
+ }
+
+ os_free_mem(NULL, pDHTab);
+}
+
+VOID Get_Auth_Keywrap_Key(
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq)
+{
+ KDK_KDF_TABLE *pTab = NULL;
+ INT status;
+ UCHAR DHKey[32] = {0};
+ UCHAR KdkInput[38] = {0};
+ UCHAR KDK[32] = {0};
+ UCHAR KdfKey[80] = {0};
+ unsigned char personlization_str[]=\
+ "Wi-Fi Easy and Secure Key Derivation";
+
+ os_alloc_mem(NULL, (UCHAR **)&pTab, sizeof(KDK_KDF_TABLE));
+ if (pTab == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
+ return;
+ }
+ status = copy_from_user(pTab, wrq->u.data.pointer, wrq->u.data.length);
+ if(status)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Copy from user error!!!\n", __FUNCTION__));
+ os_free_mem(NULL, pTab);
+ return;
+ }
+
+ RT_SHA256(pTab->DH_Secu_Key, 192, DHKey);
+
+ NdisMoveMemory(&KdkInput[0], pTab->E_Nonce, 16);
+ NdisMoveMemory(&KdkInput[16], pTab->E_Mac_Addr, 6);
+ NdisMoveMemory(&KdkInput[22], pTab->R_Nonce, 16);
+
+ RT_HMAC_SHA256(DHKey, 32, KdkInput, 38, KDK, SHA256_DIGEST_SIZE);
+ WscDeriveKey(KDK, 32, personlization_str, (sizeof(personlization_str) - 1), KdfKey, 640);
+
+ NdisMoveMemory(pTab->AuthKey, &KdfKey[0], 32);
+ NdisMoveMemory(pTab->KeyWrapKey, &KdfKey[32], 16);
+ NdisMoveMemory(pTab->Emsk, &KdfKey[48], 32);
+
+ wrq->u.data.length = sizeof(KDK_KDF_TABLE);
+ if (copy_to_user(wrq->u.data.pointer, pTab, wrq->u.data.length))
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
+ }
+
+ os_free_mem(NULL, pTab);
+}
+
+VOID Get_KWA_Value(
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq)
+{
+ KWA_TABLE *pKwaTab = NULL;
+ INT status;
+ UCHAR Buf[32];
+
+ os_alloc_mem(NULL, (UCHAR **)&pKwaTab, sizeof(KWA_TABLE));
+ if (pKwaTab == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
+ return;
+ }
+
+ status = copy_from_user(pKwaTab, wrq->u.data.pointer, wrq->u.data.length);
+ if(status)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Copy from user error!!!\n", __FUNCTION__));
+ os_free_mem(NULL, pKwaTab);
+ return;
+ }
+
+ RT_HMAC_SHA256(pKwaTab->AuthKey, 32, pKwaTab->EncrptData, pKwaTab->EncrptDataLen,
+ Buf, SHA256_DIGEST_SIZE);
+
+ NdisMoveMemory(pKwaTab->KWA, Buf, 8);
+ wrq->u.data.length = sizeof(KWA_TABLE);
+
+ if (copy_to_user(wrq->u.data.pointer, pKwaTab, wrq->u.data.length))
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
+ }
+
+ os_free_mem(NULL, pKwaTab);
+}
+
+VOID Get_AES_Encrypt_Value(
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq)
+{
+ AES_TABLE *pAesEnc = NULL;
+ INT status;
+
+ os_alloc_mem(NULL, (UCHAR **)&pAesEnc, sizeof(AES_TABLE));
+ if (pAesEnc == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
+ return;
+ }
+
+ status = copy_from_user(pAesEnc, wrq->u.data.pointer, wrq->u.data.length);
+ if(status)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Copy from user error!!!\n", __FUNCTION__));
+ os_free_mem(NULL, pAesEnc);
+ return;
+ }
+
+ AES_CBC_Encrypt(pAesEnc->PlainText, pAesEnc->PlainTextLen, pAesEnc->KeyWrapKey,
+ sizeof(pAesEnc->KeyWrapKey), pAesEnc->IV, 16, (UINT8 *) pAesEnc->CipherText,
+ &(pAesEnc->CipherTextLen));
+
+ wrq->u.data.length = sizeof(AES_TABLE);
+ if (copy_to_user(wrq->u.data.pointer, pAesEnc, wrq->u.data.length))
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
+ }
+
+ os_free_mem(NULL, pAesEnc);
+}
+
+VOID Get_AES_Decrypt_Value(
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq)
+{
+ AES_TABLE *pAesDec = NULL;
+ INT status;
+
+ os_alloc_mem(NULL, (UCHAR **)&pAesDec, sizeof(AES_TABLE));
+ if (pAesDec == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
+ return;
+ }
+
+ status = copy_from_user(pAesDec, wrq->u.data.pointer, wrq->u.data.length);
+ if(status)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Copy from user error!!!\n", __FUNCTION__));
+ os_free_mem(NULL, pAesDec);
+ return;
+ }
+
+ AES_CBC_Decrypt(pAesDec->CipherText, pAesDec->CipherTextLen, pAesDec->KeyWrapKey,
+ sizeof(pAesDec->KeyWrapKey), pAesDec->IV, 16, (UINT8 *) pAesDec->PlainText,
+ (UINT *) &(pAesDec->PlainTextLen));
+
+ wrq->u.data.length = sizeof(AES_TABLE);
+ if (copy_to_user(wrq->u.data.pointer, pAesDec, wrq->u.data.length))
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
+ }
+
+ os_free_mem(NULL, pAesDec);
+}
+#endif \ No newline at end of file