mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
Header AreaのHashチェックを実装し忘れていたため追加。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1476 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
a53bb9c947
commit
a17a7ba3dc
@ -357,6 +357,8 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
|
|||||||
NWMRetCode err;
|
NWMRetCode err;
|
||||||
NWMFirmDataParam *pFdParam = (NWMFirmDataParam *)NWM_PARAM_FWDATA_ADDRESS;
|
NWMFirmDataParam *pFdParam = (NWMFirmDataParam *)NWM_PARAM_FWDATA_ADDRESS;
|
||||||
NVRAMResult nvRes;
|
NVRAMResult nvRes;
|
||||||
|
u8 *pSecBuf = NULL;
|
||||||
|
u8 *pHdrBuf = NULL;
|
||||||
|
|
||||||
s_isFinished = FALSE;
|
s_isFinished = FALSE;
|
||||||
pNwmBuf = NULL;
|
pNwmBuf = NULL;
|
||||||
@ -404,19 +406,22 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
|
|||||||
OS_TPrintf("[Wlan Firm] Start InstallFirmware (HOT START)\n");
|
OS_TPrintf("[Wlan Firm] Start InstallFirmware (HOT START)\n");
|
||||||
NWMi_InitForLauncher(pNwmBuf, NWM_SYSTEM_BUF_SIZE, 3); /* 3 -> DMA no. */
|
NWMi_InitForLauncher(pNwmBuf, NWM_SYSTEM_BUF_SIZE, 3); /* 3 -> DMA no. */
|
||||||
err = NWMi_InstallFirmware(InstallFirmCallback, NULL, 0, FALSE);
|
err = NWMi_InstallFirmware(InstallFirmCallback, NULL, 0, FALSE);
|
||||||
|
|
||||||
} else { // COLD START
|
} else { // COLD START
|
||||||
s32 flen = 0;
|
s32 flen = 0;
|
||||||
char path[256];
|
char path[256];
|
||||||
u32 offset, length, hdrLen;
|
u32 fwOffset, fwLen, hdrLen;
|
||||||
u8 *pHash = NULL;
|
u8 *pHash = NULL;
|
||||||
u8 *pSecBuf = NULL;
|
|
||||||
u8 *pHdrBuf = NULL;
|
|
||||||
|
|
||||||
// Get Filepath
|
// Get Filepath
|
||||||
if (FALSE == GetFirmwareFilepath(path)) {
|
if (FALSE == GetFirmwareFilepath(path)) {
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------
|
||||||
|
Stage 1 -- Security Area の署名認証
|
||||||
|
------------------------------------ */
|
||||||
|
|
||||||
// Read Security area of WLAN firm
|
// Read Security area of WLAN firm
|
||||||
/* Allocate security area buffer from heap. */
|
/* Allocate security area buffer from heap. */
|
||||||
pSecBuf = SYSM_Alloc( NWM_FW_SECURITY_AREA_SIZE );
|
pSecBuf = SYSM_Alloc( NWM_FW_SECURITY_AREA_SIZE );
|
||||||
@ -431,8 +436,6 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
|
|||||||
if ( 0 >= flen )
|
if ( 0 >= flen )
|
||||||
{
|
{
|
||||||
OS_TPrintf("[Wlan Firm] Error: Couldn't read wlan firmware security area.\n");
|
OS_TPrintf("[Wlan Firm] Error: Couldn't read wlan firmware security area.\n");
|
||||||
SYSM_Free( pSecBuf );
|
|
||||||
pSecBuf = NULL;
|
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -441,17 +444,15 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
|
|||||||
{
|
{
|
||||||
OS_TPrintf("[Wlan Firm] Error: This Wlan Firmware is quite illegal!\n");
|
OS_TPrintf("[Wlan Firm] Error: This Wlan Firmware is quite illegal!\n");
|
||||||
OS_TPrintf("[Wlan Firm] It has never been installed.\n");
|
OS_TPrintf("[Wlan Firm] It has never been installed.\n");
|
||||||
SYSM_Free( pSecBuf );
|
|
||||||
pSecBuf = NULL;
|
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------
|
||||||
|
Stage 2 -- Header Area のHashチェック
|
||||||
|
------------------------------------ */
|
||||||
|
|
||||||
hdrLen = ((NWMFirmSecurityArea*)pSecBuf)->hdrLen;
|
hdrLen = ((NWMFirmSecurityArea*)pSecBuf)->hdrLen;
|
||||||
|
|
||||||
// Free Security area buffer
|
|
||||||
SYSM_Free( pSecBuf );
|
|
||||||
pSecBuf = NULL;
|
|
||||||
|
|
||||||
/* Allocate header area buffer from heap. */
|
/* Allocate header area buffer from heap. */
|
||||||
pHdrBuf = SYSM_Alloc( hdrLen );
|
pHdrBuf = SYSM_Alloc( hdrLen );
|
||||||
|
|
||||||
@ -466,43 +467,49 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
|
|||||||
if ( 0 >= flen )
|
if ( 0 >= flen )
|
||||||
{
|
{
|
||||||
OS_TPrintf("[Wlan Firm] Error: Couldn't read wlan firmware header.\n");
|
OS_TPrintf("[Wlan Firm] Error: Couldn't read wlan firmware header.\n");
|
||||||
// Free Header area buffer
|
|
||||||
SYSM_Free( pHdrBuf );
|
|
||||||
pHdrBuf = NULL;
|
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find corresponding FW image
|
pHash = (u8*)pSecBuf + SIGN_LENGTH;
|
||||||
offset = NWMi_GetFirmImageOffset(pHdrBuf, (u32)fwType);
|
|
||||||
length = NWMi_GetFirmImageLength(pHdrBuf, (u32)fwType);
|
OS_TPrintf("[Wlan Firm] Check hash of Header Area.\n");
|
||||||
|
if (FALSE == CheckHash((const u8*)pHash, (const u8*)pHdrBuf, hdrLen))
|
||||||
|
{
|
||||||
|
OS_TPrintf("[Wlan Firm] Error: Header Hash data is illegal.\n");
|
||||||
|
goto instfirm_error;
|
||||||
|
}
|
||||||
|
OS_TPrintf("[Wlan Firm] Header Area CheckHash ok.\n");
|
||||||
|
|
||||||
if (offset == 0 || length == 0) {
|
// Free Security area buffer
|
||||||
OS_TPrintf("[Wlan Firm] Error: Couldn't get Firmware image.\n");
|
SYSM_Free( pSecBuf );
|
||||||
// Free Header area buffer
|
pSecBuf = NULL;
|
||||||
SYSM_Free( pHdrBuf );
|
|
||||||
pHdrBuf = NULL;
|
/* ------------------------------------
|
||||||
|
Stage 3 -- FW image Area のHashチェック
|
||||||
|
------------------------------------ */
|
||||||
|
|
||||||
|
// Find corresponding FW image
|
||||||
|
fwOffset = NWMi_GetFirmImageOffset(pHdrBuf, (u32)fwType);
|
||||||
|
fwLen = NWMi_GetFirmImageLength(pHdrBuf, (u32)fwType);
|
||||||
|
|
||||||
|
if (fwOffset == 0 || fwLen == 0) {
|
||||||
|
OS_TPrintf("[Wlan Firm] Error: Couldn't get FW image.\n");
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate FW buffer from heap. */
|
/* Allocate FW buffer from heap. */
|
||||||
pFwBuffer = SYSM_Alloc( length );
|
pFwBuffer = SYSM_Alloc( fwLen );
|
||||||
if (!pFwBuffer) {
|
if (!pFwBuffer) {
|
||||||
OS_TWarning("[Wlan Firm] Error: Couldn't allocate memory for WlanFirmware.\n");
|
OS_TWarning("[Wlan Firm] Error: Couldn't allocate memory for FW image.\n");
|
||||||
// Free Header area buffer
|
|
||||||
SYSM_Free( pHdrBuf );
|
|
||||||
pHdrBuf = NULL;
|
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read FW image
|
// Read FW image
|
||||||
flen = ReadFirmwareBinary(path, offset, pFwBuffer, (s32)length);
|
flen = ReadFirmwareBinary(path, fwOffset, pFwBuffer, (s32)fwLen);
|
||||||
|
|
||||||
if ( 0 >= flen )
|
if ( 0 >= flen )
|
||||||
{
|
{
|
||||||
OS_TPrintf("[Wlan Firm] Error: Couldn't read wlan firmware.\n");
|
OS_TPrintf("[Wlan Firm] Error: Couldn't read wlan firmware.\n");
|
||||||
// Free Header area buffer
|
|
||||||
SYSM_Free( pHdrBuf );
|
|
||||||
pHdrBuf = NULL;
|
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -511,22 +518,16 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
|
|||||||
if (pHash == NULL)
|
if (pHash == NULL)
|
||||||
{
|
{
|
||||||
OS_TPrintf("[Wlan Firm] Error: Couldn't get hash of wlan firmware image.\n");
|
OS_TPrintf("[Wlan Firm] Error: Couldn't get hash of wlan firmware image.\n");
|
||||||
// Free Header area buffer
|
|
||||||
SYSM_Free( pHdrBuf );
|
|
||||||
pHdrBuf = NULL;
|
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
OS_TPrintf("[Wlan Firm] Check hash of firmware image.\n");
|
OS_TPrintf("[Wlan Firm] Check hash of FW image.\n");
|
||||||
if (FALSE == CheckHash((const u8*)pHash, (const u8*)pFwBuffer, length))
|
if (FALSE == CheckHash((const u8*)pHash, (const u8*)pFwBuffer, fwLen))
|
||||||
{
|
{
|
||||||
OS_TPrintf("[Wlan Firm] Error: Hash data is illegal.\n");
|
OS_TPrintf("[Wlan Firm] Error: FW image Hash data is illegal.\n");
|
||||||
// Free Header area buffer
|
|
||||||
SYSM_Free( pHdrBuf );
|
|
||||||
pHdrBuf = NULL;
|
|
||||||
goto instfirm_error;
|
goto instfirm_error;
|
||||||
}
|
}
|
||||||
OS_TPrintf("[Wlan Firm] CheckHash ok.\n");
|
OS_TPrintf("[Wlan Firm] FW image CheckHash ok.\n");
|
||||||
|
|
||||||
// Free Header area buffer
|
// Free Header area buffer
|
||||||
SYSM_Free( pHdrBuf );
|
SYSM_Free( pHdrBuf );
|
||||||
@ -547,6 +548,7 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
|
|||||||
|
|
||||||
OS_TPrintf("[Wlan Firm] Start InstallFirmware (COLD START)\n");
|
OS_TPrintf("[Wlan Firm] Start InstallFirmware (COLD START)\n");
|
||||||
err = NWMi_InstallFirmware(InstallFirmCallback, pFwBuffer, (u32)flen, TRUE);
|
err = NWMi_InstallFirmware(InstallFirmCallback, pFwBuffer, (u32)flen, TRUE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -557,16 +559,29 @@ BOOL InstallWlanFirmware( BOOL isHotStartWLFirm )
|
|||||||
|
|
||||||
/* エラー処理 */
|
/* エラー処理 */
|
||||||
instfirm_error:
|
instfirm_error:
|
||||||
|
// Free Security area buffer
|
||||||
|
if (pSecBuf)
|
||||||
|
{
|
||||||
|
SYSM_Free( pSecBuf );
|
||||||
|
pSecBuf = NULL;
|
||||||
|
}
|
||||||
|
// Free Header area buffer
|
||||||
|
if (pHdrBuf)
|
||||||
|
{
|
||||||
|
SYSM_Free( pHdrBuf );
|
||||||
|
pHdrBuf = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (pFwBuffer)
|
if (pFwBuffer)
|
||||||
{
|
{
|
||||||
SYSM_Free( pFwBuffer );
|
SYSM_Free( pFwBuffer );
|
||||||
pFwBuffer = 0;
|
pFwBuffer = NULL;
|
||||||
}
|
}
|
||||||
if (pNwmBuf)
|
if (pNwmBuf)
|
||||||
{
|
{
|
||||||
NWM_End();
|
NWM_End();
|
||||||
SYSM_Free( pNwmBuf );
|
SYSM_Free( pNwmBuf );
|
||||||
pNwmBuf = 0;
|
pNwmBuf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// インストール開始すらできなかった時は、FATALエラー
|
// インストール開始すらできなかった時は、FATALエラー
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user