2013年10月16日水曜日

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

前回、CentOSにおいてSoftCasが使用可能であることを確認したが、Ubuntuではどうなるのか?という事で、Ubuntuで使用可否の検証、手順を記述することにした。

…といっても、CentOSと大して変わらないと思うけど。

検証機は、前回と同様に基板むき出しPCを使用(写真は前回記事に掲載)。

今回は、SoftCas設定開始前にpt2のドライバ等の設定を終わらせておくこととした。
ここここを参考に設定する。設定方法は参考先を見てもらいたい。


まずは、こちらからSoftCasをダウンロード。

で、Ubuntuに転送し、適当なフォルダにunzipで解凍。























一応、分からない人はいないと思うが補足。
この記事上で使用しているTeratermにはファイル転送機能(SCP)が存在しているため、今回はそれで転送している。

転送は、上部メニュー左上の「ファイル」から「SSH_SCP…」を開いて






















次のウィンドウの上部で転送するファイルを指定、「Send」を押すだけ。

















転送したファイルは、ログインしているユーザのホームディレクトリに設置される。



で、unzipしたフォルダ内に、前回と同様Linux用のファイル2個を設置。

winscard.cpp(Linux版のwinscard.cpp)

winscard.cppは置き換え、Makefileを設置。























なにやら、下記のようなエラーが発生。Cent OSでは何も起きなかったのに…

test@test-pt2:~/softcas$ make
g++  -g -fPIC -O2 -I /usr/include/PCSC  -c -o winscard.o winscard.cpp
winscard.cpp:96:66: エラー: ‘LPSCARD_READERSTATE_A’ has not been declared
winscard.cpp: 関数 ‘LONG SCardGetStatusChange(SCARDCONTEXT, DWORD, int, DWORD) ’ 内:
winscard.cpp:96:118: エラー: declaration of C function ‘LONG SCardGetStatusChange(SCARDCONTEXT, DWORD, int, DWORD)’ conflicts with
/usr/include/PCSC/winscard.h:64:16: エラー: previous declaration ‘LONG SCardGetStatusChange(SCARDCONTEXT, DWORD, LPSCARD_READERSTATE, DWORD)’ here
winscard.cpp: 大域スコープ:
winscard.cpp:99:18: エラー: conflicting declaration ‘SCARD_IO_REQUEST g_rgSCardT1Pci’
/usr/include/PCSC/pcsclite.h:67:47: エラー: ‘g_rgSCardT1Pci’ has a previous declaration as ‘const SCARD_IO_REQUEST g_rgSCardT1Pci’
make: *** [winscard.o] エラー 1
test@test-pt2:~/softcas$


どうやら、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_A rgReaderStates, DWORD cReaders){return SCARD_S_SUCCESS; }

SCARD_IO_REQUEST g_rgSCardT1Pci_;
//SCARD_IO_REQUEST g_rgSCardT1Pci;

}

修正箇所は、96行目、99行目をコメントアウトしただけ。これでmakeしてみる。





















うまくいった。この状態でlsコマンドを叩いてみると






















確かにlibpcsclite.so.1.0.0が作成されている。
これを、/lib/x86_64-linux-gnuに設置。Cent OSとは置き場所が違うようだ。





















では、実際にサンプルを出力するため以下のコマンドを実行。

 recpt1 --b25 --strip 22 120 test.ts

で、作成されたtest.tsを見れるかというと…

失敗

解像度が320×180となっており、VLC media playerでの再生ができない。Gom Playerでは再生自体はできるが、なんか再生速度がえらい遅い。
この事象は、スクランブル解除が出来ていない事が原因。つまり、SoftCasがうまく動いていないということになる。

/lib/x86_64-linux-gnu/libpcsclite.so.1
/usr/lib/x86_64-linux-gnu/libpcsclite.so

の2ファイルを作成したlibpcsclite.so.1.0.0に置き換えたり、/usr/libフォルダに新規作成した上でldconfigコマンドも実行したが、それでも改善せず。

リブートやシャットダウン後の起動でも確認を行ったが、どうもうまくいかない。


やり方がまずかったのか、それともUbuntuには対応していないのか不明だが、どうもCent OSほど簡単にはいかないようだ。

とりあえず、Cent OSでのやり方は確立出来たようなので、SoftCasをLinuxで使用するのであればCent OSをおすすめしたい。


それと、Ubuntuで成功した方がいたらやり方教えてください… m(_ _)m

0 件のコメント:

コメントを投稿