Facebook
From Round Stork, 2 Years ago, written in Plain Text.
This paste is a reply to B25Decoder.dll to B1 diff from Sweet Crane - go back
Embed
diff -u B25Decoder/BonProject/BcasCardReader.cpp B1Decoder/BonProject/BcasCardReader.cpp
--- B25Decoder/BonProject/BcasCardReader.cpp        Fri Sep 25 05:59:12 2009
+++ B1Decoder/BonProject/BcasCardReader.cpp        Mon Mar 30 17:49:33 2015
@@ -150,7 +150,7 @@
 
 const BYTE * CBcasCardReader::GetKsFromEcm(const BYTE *pEcmData, const DWORD dwEcmSize)
 {
-        static const BYTE abyEcmReceiveCmd[] = {0x90U, 0x34U, 0x00U, 0x00U};
+        static const BYTE abyEcmReceiveCmd[] = {0x80U, 0x34U, 0x00U, 0x00U};
 
         // 「ECM Receive Command」を処理する
         if(!m_hBcasCard){
@@ -179,19 +179,41 @@
         // コマンド送信
         if(!TransmitCommand(m_hBcasCard, SendData, sizeof(abyEcmReceiveCmd) + dwEcmSize + 2UL, RecvData, sizeof(RecvData), &dwRecvSize)){
                 ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus));
-                m_dwEcmError = EC_TRANSMIT_ERROR;
+                m_dwEcmError = EC_NO_ERROR;//EC_TRANSMIT_ERROR;
                 return NULL;
                 }
 
         // サイズチェック
-        if(dwRecvSize != 25UL){
+        if(dwRecvSize != 22UL){
                 ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus));
-                m_dwEcmError = EC_TRANSMIT_ERROR;
+                m_dwEcmError = EC_NO_ERROR;//EC_TRANSMIT_ERROR;
                 return NULL;
                 }
 
+        else {
         // レスポンス解析
-        ::CopyMemory(m_EcmStatus.KsData, &RecvData[6], sizeof(m_EcmStatus.KsData));
+                ::CopyMemory(m_EcmStatus.KsData, &RecvData[0], sizeof(m_EcmStatus.KsData));
+                m_dwEcmError = EC_NO_ERROR;
+                return m_EcmStatus.KsData;
+                }
+
+        //const static uint8_t ffff[16] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
+/*                memcpy(dst->scramble_key, prv->rbuf, 16);
+                switch ( load_be_uint16(prv->rbuf+18) ) {
+                case 0xc001 :
+                        dst->return_code = 0x0800 ;
+                        break ;
+                case 0xc000 :
+                        dst->return_code = 0xa901 ;
+                        break ;
+        // 他にどんなコードがあるか不明なのでとりあえずff..ffかどうかでチェック
+        default :
+                if ( !memcmp( dst->scramble_key, ffff, 16 ) ) {
+                        dst->return_code = 0xa902 ;
+                }
+                else {
+                        //dst->return_code = 0x0800 ;
+                }
 
         // リターンコード解析
         switch(((WORD)RecvData[4] << 8) | (WORD)RecvData[5]){
@@ -210,7 +232,7 @@
                 default :
                         m_dwEcmError = EC_NOT_CONTRACTED;
                         return NULL;
-                }
+                }*/
 }
 
 const DWORD CBcasCardReader::GetEcmError(void)
@@ -221,7 +243,7 @@
 
 const bool CBcasCardReader::SendEmmSection(const BYTE *pEmmData, const DWORD dwEmmSize)
 {
-        static const BYTE abyEmmReceiveCmd[] = {0x90U, 0x36U, 0x00U, 0x00U};
+        static const BYTE abyEmmReceiveCmd[] = {0x80U, 0x36U, 0x00U, 0x00U};
 
         // 「EMM Receive Command」を処理する
         if(!m_hBcasCard)return false;
@@ -249,7 +271,7 @@
         
         // リターンコード解析
         switch(((WORD)RecvData[4] << 8) | (WORD)RecvData[5]){
-                case 0x2100U :        // 正常終了
+                case 0x9000U :        // 正常終了
                         return true;
 
                 case 0xA102U :        // 非運用(運用外プロトコル番号)
@@ -281,7 +303,7 @@
         if(dwRecvSize != 20UL)return 0U;                
 
         // リターンコード解析
-        if((((WORD)RecvData[4] << 8) | (WORD)RecvData[5]) != 0x2100U)return 0U;
+        if((((WORD)RecvData[4] << 8) | (WORD)RecvData[5]) != 0x9000U)return 0U;
 
         // レスポンス解析
         const WORD wInfoNum = (WORD)RecvData[7] + 1U;
@@ -300,7 +322,7 @@
                 if(dwRecvSize != 20UL)return 0U;                
 
                 // リターンコード解析
-                if((((WORD)RecvData[4] << 8) | (WORD)RecvData[5]) != 0x2100U)return 0U;
+                if((((WORD)RecvData[4] << 8) | (WORD)RecvData[5]) != 0x9000U)return 0U;
                 
                 // レスポンス解析
                 TsTime.ClearTime();
@@ -387,7 +409,7 @@
 
 const bool CBcasCardReader::InitialSetting(const SCARDHANDLE hBcasCard)
 {
-        static const BYTE abyInitSettingCmd[] = {0x90U, 0x30U, 0x00U, 0x00U, 0x00U};
+        static const BYTE abyInitSettingCmd[] = {0x80U, 0x5EU, 0x00U, 0x00U, 0x00U};
 
         // 「Initial Setting Conditions Command」を処理する
         if(!hBcasCard)return false;
@@ -401,12 +423,12 @@
         if(!TransmitCommand(hBcasCard, abyInitSettingCmd, sizeof(abyInitSettingCmd), RecvData, sizeof(RecvData), &dwRecvSize))return false;
 
         // 受信サイズチェック
-        if(dwRecvSize < 57UL)return false;                
+        if(dwRecvSize < 46UL)return false;                //dw
 
         // レスポンス解析
-        ::CopyMemory(m_BcasCardInfo.BcasCardID, &RecvData[8],   6UL);        // +8        Card ID
-        ::CopyMemory(m_BcasCardInfo.SystemKey,  &RecvData[16], 32UL);        // +16        Descrambling system key
-        ::CopyMemory(m_BcasCardInfo.InitialCbc, &RecvData[48],  8UL);        // +48        Descrambler CBC initial value
+        ::CopyMemory(m_BcasCardInfo.BcasCardID, &RecvData[2],   6UL);        // +2        Card ID
+        ::CopyMemory(m_BcasCardInfo.SystemKey,  &RecvData[8], 32UL);        // +8        Descrambling system key
+        ::CopyMemory(m_BcasCardInfo.InitialCbc, &RecvData[8],  8UL);        // +8        Descrambler CBC initial value
 
         // ECMステータス初期化
         ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus));
diff -u B25Decoder/BonProject/TsDescrambler.cpp B1Decoder/BonProject/TsDescrambler.cpp
--- B25Decoder/BonProject/TsDescrambler.cpp        Sat Feb 14 22:11:26 2009
+++ B1Decoder/BonProject/TsDescrambler.cpp        Mon Mar 30 17:48:16 2015
@@ -317,6 +317,7 @@
 
         const WORD wEmmPID = pCaMethodDesc->GetCaPID();
         if(wEmmPID >= TS_INVALID_PID)return;
+        if(wEmmPID == 0x0000)return;
 
         // EMMプロセッサをPIDマップに追加
         m_TsInputMap.MapPid(wEmmPID, dynamic_cast(CEmmProcessor::CreateInstance(dynamic_cast(this))));
@@ -329,7 +330,30 @@
         if(!pDescBlock)return;
         
         const ICaMethodDesc * const pCaMethodDesc = dynamic_cast(pDescBlock->GetDescByTag(ICaMethodDesc::DESC_TAG));
-        if(!pCaMethodDesc)return;
+        if(!pCaMethodDesc)
+        {
+                //696: If no CA Pids are found in the PMT also check ES for CA Pids!
+                for (DWORD dwPos = 0UL, dwCount = 0UL; dwPos < pPmtTable->GetEsNum(); dwPos++){
+                        const ICaMethodDesc * const ESpCaMethodDesc = dynamic_cast(pPmtTable->GetEsDesc(dwPos)->GetDescByTag(ICaMethodDesc::DESC_TAG));
+                        if (ESpCaMethodDesc)
+                        {
+                                const WORD wEcmPID = ESpCaMethodDesc->GetCaPID();
+                                if (wEcmPID < TS_INVALID_PID)
+                                {
+                                        // 既存のECMプロセッサを確認
+                                        if (!m_TsInputMap.GetMapTarget(wEcmPID)){
+                                                // ECMプロセッサをPIDマップに追加
+                                                m_TsInputMap.MapPid(wEcmPID, dynamic_cast(CEcmProcessor::CreateInstance(dynamic_cast(this))));
+                                        }
+                                        // ESプロセッサをPIDマップに追加
+                                        if (!m_TsOutputMap.GetMapTarget(pPmtTable->GetEsPID(dwPos))){
+                                                m_TsOutputMap.MapPid(pPmtTable->GetEsPID(dwPos), dynamic_cast(CEsProcessor::CreateInstance(m_TsInputMap.GetMapTarget(wEcmPID))));
+                                        }
+                                }
+                        }
+                }
+                return;
+        }
 
         const WORD wEcmPID = pCaMethodDesc->GetCaPID();
         if(wEcmPID >= TS_INVALID_PID)return;