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

前回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

20141223_000001

 

次に、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
Sponsored Links

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でも利用できるようになった。

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>