From cb68ce10227a4c5e5e869dcfc3e2b99540eff58f Mon Sep 17 00:00:00 2001 From: tsukumijima Date: Sun, 24 Oct 2021 22:11:02 +0900 Subject: [PATCH] =?UTF-8?q?ARIB=20STD-B1=20=E5=AF=BE=E5=BF=9C=E3=81=AE?= =?UTF-8?q?=E3=81=9F=E3=82=81=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92?= =?UTF-8?q?=E7=B5=B1=E5=90=88=20=E3=83=BBlibaribb25.patch=20(https://www.a?= =?UTF-8?q?xfc.net/u/3985543)=20=E3=83=BBarib-b1-stream-test=20(https://ww?= =?UTF-8?q?w.npmjs.com/package/arib-b1-stream-test)=20=E3=83=BBB1=5Fp2c9?= =?UTF-8?q?=20(=E3=82=B9=E3=82=AB=E3=83=91=E3=83=BCTS=E6=8A=9C=E3=81=8D?= =?UTF-8?q?=E3=83=84=E3=83=BC=E3=83=AB=E8=A9=B0=E3=82=81=E5=90=88=E3=82=8F?= =?UTF-8?q?=E3=81=9B=20(https://www44.zippyshare.com/v/yWcPHjsD/file.html)?= =?UTF-8?q?=20=E3=81=AB=E5=90=8C=E6=A2=B1)=20=E3=81=AE=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=82=92=E5=8F=82=E8=80=83=E3=81=AB=E3=80=81=E7=8F=BE?= =?UTF-8?q?=E8=A1=8C=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AB=E7=B5=B1?= =?UTF-8?q?=E5=90=88=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aribb25/arib_std_b25.c | 2 ++ aribb25/b_cas_card.c | 81 ++++++++++++++++++++++++++++++++++++++++++ aribb25/td.c | 15 ++++++++ 3 files changed, 98 insertions(+) diff --git a/aribb25/arib_std_b25.c b/aribb25/arib_std_b25.c index 4a0e5b3..73d44fb 100644 --- a/aribb25/arib_std_b25.c +++ b/aribb25/arib_std_b25.c @@ -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; diff --git a/aribb25/b_cas_card.c b/aribb25/b_cas_card.c index 94e65b2..b2446ce 100644 --- a/aribb25/b_cas_card.c +++ b/aribb25/b_cas_card.c @@ -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; } diff --git a/aribb25/td.c b/aribb25/td.c index 40350f8..9614029 100644 --- a/aribb25/td.c +++ b/aribb25/td.c @@ -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);