ARIB STD-B1 対応のためのコードを統合

・libaribb25.patch (https://www.axfc.net/u/3985543)
・arib-b1-stream-test (https://www.npmjs.com/package/arib-b1-stream-test)
・B1_p2c9 (スカパーTS抜きツール詰め合わせ (https://www44.zippyshare.com/v/yWcPHjsD/file.html) に同梱)
のコードを参考に、現行のコードに統合した
This commit is contained in:
tsukumijima 2021-10-24 22:11:02 +09:00
parent b6a8c856ce
commit cb68ce1022
3 changed files with 98 additions and 0 deletions

View File

@ -551,10 +551,12 @@ static int set_b_cas_card_arib_std_b25(void *std_b25, B_CAS_CARD *bcas)
return ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS;
}
prv->ca_system_id = is.ca_system_id;
#ifndef ENABLE_ARIB_STD_B1
n = prv->bcas->get_id(prv->bcas, &(prv->casid));
if(n < 0){
return ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS;
}
#endif
}
return 0;

View File

@ -47,11 +47,21 @@ typedef struct {
constant values
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
static const uint8_t INITIAL_SETTING_CONDITIONS_CMD[] = {
#ifdef ENABLE_ARIB_STD_B1
// CLA・INSを修正
0x80, 0x5e, 0x00, 0x00, 0x00,
#else
0x90, 0x30, 0x00, 0x00, 0x00,
#endif
};
static const uint8_t CARD_ID_INFORMATION_ACQUIRE_CMD[] = {
#ifdef ENABLE_ARIB_STD_B1
// CLA・INSを修正
0x80, 0x5e, 0x00, 0x00, 0x00,
#else
0x90, 0x32, 0x00, 0x00, 0x00,
#endif
};
static const uint8_t POWER_ON_CONTROL_INFORMATION_REQUEST_CMD[] = {
@ -59,11 +69,21 @@ static const uint8_t POWER_ON_CONTROL_INFORMATION_REQUEST_CMD[] = {
};
static const uint8_t ECM_RECEIVE_CMD_HEADER[] = {
#ifdef ENABLE_ARIB_STD_B1
// CLAを修正
0x80, 0x34, 0x00, 0x00,
#else
0x90, 0x34, 0x00, 0x00,
#endif
};
static const uint8_t EMM_RECEIVE_CMD_HEADER[] = {
#ifdef ENABLE_ARIB_STD_B1
// CLAを修正
0x80, 0x36, 0x00, 0x00,
#else
0x90, 0x36, 0x00, 0x00,
#endif
};
#define B_CAS_BUFFER_MAX (4*1024)
@ -283,6 +303,11 @@ static int get_id_b_cas_card(void *bcas, B_CAS_ID *dst)
static int get_pwr_on_ctrl_b_cas_card(void *bcas, B_CAS_PWR_ON_CTRL_INFO *dst)
{
#ifdef ENABLE_ARIB_STD_B1
// 通電制御情報取得は未サポート
return B_CAS_CARD_ERROR_INVALID_PARAMETER;
#endif
long ret;
unsigned long slen;
@ -376,7 +401,11 @@ static int proc_ecm_b_cas_card(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src,
retry_count = 0;
ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, NULL, prv->rbuf, &rlen);
#ifdef ENABLE_ARIB_STD_B1
while( ((ret != SCARD_S_SUCCESS) || (rlen < 22)) && (retry_count < 2) ){
#else
while( ((ret != SCARD_S_SUCCESS) || (rlen < 25)) && (retry_count < 2) ){
#endif
retry_count += 1;
// if(!connect_card(prv, prv->reader)){
// continue;
@ -387,18 +416,53 @@ static int proc_ecm_b_cas_card(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src,
ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, NULL, prv->rbuf, &rlen);
}
#ifdef ENABLE_ARIB_STD_B1
// 結果の判定方法を変更
if( (ret != SCARD_S_SUCCESS) ){
#else
if( (ret != SCARD_S_SUCCESS) || (rlen < 25) ){
#endif
return B_CAS_CARD_ERROR_TRANSMIT_FAILED;
}
#ifdef ENABLE_ARIB_STD_B1
if(rlen < 22){
dst->return_code = 0xa103;
}else{
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;
}
break;
}
}
#else
memcpy(dst->scramble_key, prv->rbuf+6, 16);
dst->return_code = load_be_uint16(prv->rbuf+4);
#endif
return 0;
}
static int proc_emm_b_cas_card(void *bcas, uint8_t *src, int len)
{
#ifdef ENABLE_ARIB_STD_B1
// EMM 処理は未サポート
return B_CAS_CARD_ERROR_INVALID_PARAMETER;
#endif
int retry_count;
long ret;
@ -595,22 +659,39 @@ static int connect_card(B_CAS_CARD_PRIVATE_DATA *prv, LPCTSTR reader_name)
return 0;
}
#ifdef ENABLE_ARIB_STD_B1
if(rlen < 46){
#else
if(rlen < 57){
#endif
return 0;
}
p = prv->rbuf;
n = load_be_uint16(p+4);
#ifdef ENABLE_ARIB_STD_B1
if(n != 0x9000){ // return code missmatch
return 0;
}
#else
if(n != 0x2100){ // return code missmatch
return 0;
}
#endif
#ifdef ENABLE_ARIB_STD_B1
memcpy(prv->stat.system_key, p+8, 32);
memcpy(prv->stat.init_cbc, p+8, 8);
prv->stat.ca_system_id = load_be_uint16(p);
prv->stat.card_status = 0;
#else
memcpy(prv->stat.system_key, p+16, 32);
memcpy(prv->stat.init_cbc, p+48, 8);
prv->stat.bcas_card_id = load_be_uint48(p+8);
prv->stat.card_status = load_be_uint16(p+2);
prv->stat.ca_system_id = load_be_uint16(p+6);
#endif
return 1;
}

View File

@ -89,19 +89,27 @@ int _tmain(int argc, TCHAR **argv)
static void show_usage()
{
#ifdef ENABLE_ARIB_STD_B1
_ftprintf(stderr, _T("b1 - ARIB STD-B1 test program version %s\n"), _T(VERSION_STRING));
_ftprintf(stderr, _T("usage: b1 [options] src.m2t dst.m2t [more pair ..]\n"));
#else
_ftprintf(stderr, _T("b25 - ARIB STD-B25 test program version %s\n"), _T(VERSION_STRING));
_ftprintf(stderr, _T("usage: b25 [options] src.m2t dst.m2t [more pair ..]\n"));
#endif
_ftprintf(stderr, _T("options:\n"));
_ftprintf(stderr, _T(" -r round (integer, default=4)\n"));
_ftprintf(stderr, _T(" -s strip\n"));
_ftprintf(stderr, _T(" 0: keep null(padding) stream (default)\n"));
_ftprintf(stderr, _T(" 1: strip null stream\n"));
// EMM・通電制御情報は未サポート
#ifndef ENABLE_ARIB_STD_B1
_ftprintf(stderr, _T(" -m EMM\n"));
_ftprintf(stderr, _T(" 0: ignore EMM (default)\n"));
_ftprintf(stderr, _T(" 1: send EMM to B-CAS card\n"));
_ftprintf(stderr, _T(" -p power_on_control_info\n"));
_ftprintf(stderr, _T(" 0: do nothing additionally\n"));
_ftprintf(stderr, _T(" 1: show B-CAS EMM receiving request (default)\n"));
#endif
_ftprintf(stderr, _T(" -v verbose\n"));
_ftprintf(stderr, _T(" 0: silent\n"));
_ftprintf(stderr, _T(" 1: show processing status (default)\n"));
@ -123,7 +131,11 @@ static int parse_arg(OPTION *dst, int argc, TCHAR **argv)
dst->round = 4;
dst->strip = 0;
dst->emm = 0;
#ifdef ENABLE_ARIB_STD_B1
dst->power_ctrl = 0;
#else
dst->power_ctrl = 1;
#endif
dst->verbose = 1;
dst->simd_instruction = 3;
dst->benchmark = 0;
@ -133,6 +145,8 @@ static int parse_arg(OPTION *dst, int argc, TCHAR **argv)
break;
}
switch(argv[i][1]){
// EMM・通電制御情報は未サポート
#ifndef ENABLE_ARIB_STD_B1
case 'm':
if(argv[i][2]){
dst->emm = _ttoi(argv[i]+2);
@ -149,6 +163,7 @@ static int parse_arg(OPTION *dst, int argc, TCHAR **argv)
i += 1;
}
break;
#endif
case 'r':
if(argv[i][2]){
dst->round = _ttoi(argv[i]+2);