LinuxでSoftCasは使用できるのか? ~Ubuntu 14.04 LTS編~

前回CentOS 7で使用できることを確認したので、今回はUbuntu 14.04 LTSで検証を行う。
検証を行う環境は以下。

  • OS:Ubuntu  Desktop 14.04 LTS
  • 録画チューナー:PT2(余ってた)
  • CPU:Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
  • メモリ:4GB

それでは行ってみよう。

1.最低限の設定を行う

IPアドレスやホスト名の設定を行っておく。
ここについては割愛。

設定後、apt-get updateを行っておく。

sudo apt-get update

2.LAMP環境のインストール

次に、LAMP環境のインストールを行う。
(正直、Softcasの検証だけなら箇所はあまり必要ではない。epgrecなどの導入時用に記述しているだけだ。)

sudo apt-get install -y apache2 mysql-server libapache2-mod-auth-mysql php5-mysql php5 libapache2-mod-php5 php5-mcrypt

3.b25&PT2ドライバ&recpt1のインストール

PT2のドライバをインストールするため、必要となるパッケージをインストールする。

sudo apt-get install -y libccid libpcsclite-dev libpcsclite1 pcsc-tools pcscd autoconf g++

パッケージインストール後、復号ツールであるb25をダウンロード、解凍してインストールする。

wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
unzip c44e16dbb0e2.zip
cd pt1-c44e16dbb0e2/arib25
make clean && make && make install

次に、PT2ドライバのインストールを行う。

cd
sudo su -
echo "blacklist earth-pt1" > /etc/modprobe.d/blacklist.conf
exit
wget http://hg.honeyplanet.jp/pt1/archive/tip.tar.bz2
tar -xvlf tip.tar.bz2
cd pt1-c8688d7d6382/driver/
make
sudo make install
sudo modprobe pt1_drv
sudo reboot

再起動後、Ubuntu 14.04 LTSでPT2を認識している事を確認する。

test@test-P5K-E:~$ lspci | grep Multi
04:02.0 Multimedia controller: Xilinx Corporation Device 222a (rev 01)
test@test-P5K-E:~$
test@test-P5K-E:~$ lsmod | grep pt1
pt1_drv 40802 0
test@test-P5K-E:~$
test@test-P5K-E:~$ ls -la /dev | grep pt1
crw-rw-rw- 1 root video 248, 0 12月 23 23:30 pt1video0
crw-rw-rw- 1 root video 248, 1 12月 23 23:30 pt1video1
crw-rw-rw- 1 root video 248, 2 12月 23 23:30 pt1video2
crw-rw-rw- 1 root video 248, 3 12月 23 23:30 pt1video3

次に、recpt1のインストールを行う。
以下のコマンドを実行する。

cd pt1-c8688d7d6382/recpt1/
sudo ./autogen.sh
sudo ./configure -enable-b25
make
sudo make install
sudo su
echo "/usr/local/lib" > /etc/ld.so.conf.d/recpt1.conf 
exit
sudo ldconfig

4.Softcasのインストール

さて、それではSoftcasのインストールを行ってみよう。
以下のコマンドで、softcasをダウンロード、解凍する。

wget http://www.wazoku.net/softcas.zip
unzip softcas.zip
cd softcas
wget -O winscard.cpp http://pastebin.com/download.php?i=5144Ah9g
wget -O Makefile http://pastebin.com/download.php?i=FQdSixkB

次に、ライブラリが変更されたため、winscard.cppの一部を書き換える必要がある。
以下のコマンドでソースの書き換えを行う。

sed -i "/LONG SCardGetStatusChange/s/LPSCARD_READERSTATE_A/LPSCARD_READERSTATE/g" winscard.cpp
sed -i "s/SCARD_IO_REQUEST g_rgSCardT1Pci;/const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, sizeof(SCARD_IO_REQUEST) };/g" winscard.cpp

上記対応で、winscard.cppは以下のようになる。

●winscard.cpp

//  Put the following files in the same folder:
//      Crypto.cpp, Crypto.h, Decoder-ECM.cpp, Decoder.h, Global.h
//      Keys.cpp, Keys.h, Keyset.cpp, Keyset.h
//  You should modify "Size" in Decoder-ECM.cpp l42 to "Size-3"

#include <string.h>
#include <PCSC/winscard.h>
#define htons htons_
#define ntohs ntohs_

#include "Global.h"
#include "Keys.h"
#include "Decoder.h"

#define CHAR    char

extern"C"{

void __attribute__ ((constructor)) SCardVCasInit(void) {
    BCAS::Keys::RegisterAll();
}

LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
{
        *phContext=(SCARDCONTEXT)0x35313239;
        return SCARD_S_SUCCESS;
}

LONG SCardListReaders(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders)
{
    CHAR r[]="@OishiiSlurper\0";
    if(mszReaders)memcpy(mszReaders,r,sizeof r);
    *pcchReaders=sizeof r/sizeof r[0];
    return SCARD_S_SUCCESS;
}

LONG SCardConnect(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
{
    *phCard=(SCARDHANDLE)0x35313239;
    *pdwActiveProtocol=SCARD_PROTOCOL_T1;
    return SCARD_S_SUCCESS;
}

LONG SCardTransmit(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength)
{
    switch(pbSendBuffer[1])
    {
    case 0x30:{
        BYTE r[]={
            0x00,0x39,0x00,0x00,0x21,0x00,0x00,0x05, 0xc0,0xff,0xee,0xc0,0xff,0xee,0x01,0x50,
            0x36,0x31,0x04,0x66,0x4b,0x17,0xea,0x5c, 0x32,0xdf,0x9c,0xf5,0xc4,0xc3,0x6c,0x1b,
            0xec,0x99,0x39,0x21,0x68,0x9d,0x4b,0xb7, 0xb7,0x4e,0x40,0x84,0x0d,0x2e,0x7d,0x98,
            0xfe,0x27,0x19,0x99,0x19,0x69,0x09,0x11, 0x01,0x02,0x01,0x90,0x00};
        memcpy(pbRecvBuffer,r,sizeof r);
        *pcbRecvLength=sizeof r;
        break;}
    case 0x32:{
        BYTE r[]={
            0x00,0x0f,0x00,0x00,0x21,0x00,0x01,0x54, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
            0x00,0x90,0x00};
        memcpy(pbRecvBuffer,r,sizeof r);
        *pcbRecvLength=sizeof r;
        break;}
    case 0x34:{
        BYTE r[]={
            0x00,0x15,0x00,0x00,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
            0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x90, 0x00};
        BCAS::Decoder::DecodeECM(pbSendBuffer+5,pbSendBuffer[4],r+6,NULL);
        memcpy(pbRecvBuffer,r,sizeof r);
        *pcbRecvLength=sizeof r;
        break;}
    case 0x80:{
        BYTE r[]={
                0x00,0x10,0x00,0x00,0xA1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00};
        memcpy(pbRecvBuffer,r,sizeof r);
        *pcbRecvLength=sizeof r;
        break;}
    default:{
        BYTE r[]={
            0x00,0x04,0x00,0x00,0xa1,0xfe,0x90,0x00};
        memcpy(pbRecvBuffer,r,sizeof r);
        *pcbRecvLength=sizeof r;
        break;}
    }
    return SCARD_S_SUCCESS;
}

LONG SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition){return SCARD_S_SUCCESS;}

LONG SCardFreeMemory(SCARDCONTEXT,LPCVOID){return SCARD_S_SUCCESS;}

LONG SCardReleaseContext(SCARDCONTEXT){return SCARD_S_SUCCESS;}

LONG SCardGetStatusChange(SCARDCONTEXT hContext, DWORD dwTimeout,LPSCARD_READERSTATE rgReaderStates, DWORD cReaders){return SCARD_S_SUCCESS; }

SCARD_IO_REQUEST g_rgSCardT1Pci_;
const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, sizeof(SCARD_IO_REQUEST) };

}

ソース書き換え後、makeを行う。

make

make後、「libpcsclite.so.1.0.0」というファイルが作成されているので、これを既存の、ファイルと置き換える。
元のファイルについては、以下のコマンドで場所を確認する。

$ find /lib/ -name libpcsclite.so.1.0.0
/lib/x86_64-linux-gnu/libpcsclite.so.1.0.0

上記コマンドでファイルの場所は分かったので、置き換えを行う。

sudo cp libpcsclite.so.1.0.0 /lib/x86_64-linux-gnu/

これで、Softcasを利用する準備が整った。

5.テストの実施

実際に利用出来るか、以下のコマンドでテストする。

recpt1 --strip -b25 27 10 test.ts

テストの結果、無事に再生することが出来た。
これでUbuntuとCentOS、どちらのOSでも利用できるようになった。