Mercurial > pt1.mumumu
changeset 74:b6607f6e2851
good citizens never use gray code. wise people never watch TV.
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sat, 28 Nov 2009 00:12:05 +0900 |
parents | c44e16dbb0e2 |
children | 1d1d616cde98 |
files | arib25/Makefile arib25/arib_std_b25.sln arib25/arib_std_b25.vcproj arib25/readme.txt arib25/src/Makefile arib25/src/arib_std_b25.c arib25/src/arib_std_b25.h arib25/src/arib_std_b25_error_code.h arib25/src/b_cas_card.c arib25/src/b_cas_card.h arib25/src/b_cas_card_error_code.h arib25/src/makefile.win arib25/src/multi2.c arib25/src/multi2.h arib25/src/multi2_error_code.h arib25/src/portable.h arib25/src/td.c arib25/src/ts_common_types.h arib25/src/ts_section_parser.c arib25/src/ts_section_parser.h arib25/src/ts_section_parser_error_code.h b25_docs/libccid_Info.plist b25_docs/readme.txt b25_docs/smartcard_list.txt recpt1/Makefile recpt1/Makefile.in recpt1/autogen.sh recpt1/configure.ac recpt1/decoder.c recpt1/decoder.h recpt1/recpt1.c |
diffstat | 31 files changed, 196 insertions(+), 8478 deletions(-) [+] |
line wrap: on
line diff
--- a/arib25/Makefile Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -all: - cd src; make all - -clean: - cd src; make clean - -install: - cd src; make install
--- a/arib25/arib_std_b25.sln Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "arib_std_b25", "arib_std_b25.vcproj", "{6E77C1AC-A31A-49B9-9A52-9FE1E03B8FEC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6E77C1AC-A31A-49B9-9A52-9FE1E03B8FEC}.Debug|Win32.ActiveCfg = Debug|Win32 - {6E77C1AC-A31A-49B9-9A52-9FE1E03B8FEC}.Debug|Win32.Build.0 = Debug|Win32 - {6E77C1AC-A31A-49B9-9A52-9FE1E03B8FEC}.Release|Win32.ActiveCfg = Release|Win32 - {6E77C1AC-A31A-49B9-9A52-9FE1E03B8FEC}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal
--- a/arib25/arib_std_b25.vcproj Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,259 +0,0 @@ -<?xml version="1.0" encoding="shift_jis"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="8.00" - Name="arib_std_b25" - ProjectGUID="{6E77C1AC-A31A-49B9-9A52-9FE1E03B8FEC}" - RootNamespace="arib_std_b25" - Keyword="Win32Proj" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - UseUnicodeResponseFiles="false" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - UsePrecompiledHeader="0" - WarningLevel="3" - Detect64BitPortabilityProblems="false" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="winscard.lib" - OutputFile="$(OutDir)\b25.exe" - LinkIncremental="2" - GenerateDebugInformation="true" - SubSystem="1" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCWebDeploymentTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" - CharacterSet="2" - WholeProgramOptimization="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - UseUnicodeResponseFiles="false" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" - RuntimeLibrary="0" - UsePrecompiledHeader="0" - WarningLevel="3" - Detect64BitPortabilityProblems="false" - DebugInformationFormat="3" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="winscard.lib" - OutputFile="$(OutDir)\b25.exe" - LinkIncremental="1" - GenerateDebugInformation="true" - SubSystem="1" - OptimizeReferences="2" - EnableCOMDATFolding="2" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCWebDeploymentTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="ƒ\[ƒX ƒtƒ@ƒCƒ‹" - Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" - UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" - > - <File - RelativePath=".\src\arib_std_b25.c" - > - </File> - <File - RelativePath=".\src\b_cas_card.c" - > - </File> - <File - RelativePath=".\src\multi2.c" - > - </File> - <File - RelativePath=".\src\td.c" - > - </File> - <File - RelativePath=".\src\ts_section_parser.c" - > - </File> - </Filter> - <Filter - Name="ƒwƒbƒ_[ ƒtƒ@ƒCƒ‹" - Filter="h;hpp;hxx;hm;inl;inc;xsd" - UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" - > - <File - RelativePath=".\src\arib_std_b25.h" - > - </File> - <File - RelativePath=".\src\arib_std_b25_error_code.h" - > - </File> - <File - RelativePath=".\src\b_cas_card.h" - > - </File> - <File - RelativePath=".\src\b_cas_card_error_code.h" - > - </File> - <File - RelativePath=".\src\multi2.h" - > - </File> - <File - RelativePath=".\src\multi2_error_code.h" - > - </File> - <File - RelativePath=".\src\portable.h" - > - </File> - <File - RelativePath=".\src\ts_common_types.h" - > - </File> - <File - RelativePath=".\src\ts_section_parser.h" - > - </File> - <File - RelativePath=".\src\ts_section_parser_error_code.h" - > - </File> - </Filter> - <Filter - Name="ƒŠƒ\[ƒX ƒtƒ@ƒCƒ‹" - Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" - UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" - > - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject>
--- a/arib25/readme.txt Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,363 +0,0 @@ -y–¼Ìz - -@ARIB STD-B25 Žd—lŠm”FƒeƒXƒgƒvƒƒOƒ‰ƒ€ƒ\[ƒXƒR[ƒh - -yƒo[ƒWƒ‡ƒ“z - -@0.2.3 - -yìŽÒz - -@–Î–Ø ˜a—m (MOGI, Kazuhiro) -@kazhiro@marumo.ne.jp - -yˆêŽŸ”z•zŒ³z - -@http://www.marumo.ne.jp/db2008_c.htm#30 - -@‚ ‚é‚¢‚Í - -@http://www.marumo.ne.jp/junk/arib_std_b25-0.2.3.lzh - -y–Ú“Iz - -@ARIB STD-B25 ‚ÌŽd—l‚ð—‰ð‚·‚éˆ×‚ÌAŽQl—p‚ÌŽÀ‘•‚Æ‚µ‚ÄŒöŠJ - -y”wŒiz - -@2011 ”N 7 ŒŽ‚Ì’nãƒAƒiƒƒO•ú‘—’â”g‚ðT‚¦A—õ‰¿‚È’nãƒfƒWƒ^ƒ‹•ú‘— -@ŽóM‹@‚̔̔„‚ª‘Ò‚½‚ê‚Ä‚¢‚é - -@‚µ‚©‚µAARIB ‚Ì•W€•¶‘‚Í‚í‚´‚Æ”»‚è‚É‚‚‘‚¢‚ÄŠJ””ï‚ð‚©‚³‚Ü‚¹ -@‚悤‚Æ‚µ‚Ä‚¢‚é‚Æ‚µ‚©Žv‚¦‚È‚¢‚قǂɈӖ¡•s–¾—Ä‚È‹Lq‚É‚È‚Á‚Ä‚¨‚è -@‚±‚̂܂܂ł͒ቿŠiŽóM‹@‚ÌŠJ”‚È‚Ç•s‰Â”\‚ÉŽv‚¦‚é - -@‚»‚±‚ÅAŽ©•ª‚È‚è‚É ARIB •W€•¶‘‚ð“Ç‚ÝA—‰ð‚µ‚½”͈͂ðƒ\[ƒX -@ƒR[ƒh‚ÌŒ`‚É‚Ü‚Æ‚ß‚ÄŒöŠJ‚·‚邱‚Æ‚É‚µ‚½ - -@‚±‚̃R[ƒh‚ªˆÀ‰¿‚ÈŽóM‹@‚ÌŠJ”‚̈ꕂƂȂ邱‚Æ‚ðŠú‘Ò‚·‚é - -@‚È‚¨A‚ ‚‚Ü‚Å‚àŽd—l—‰ð‚ð–Ú“I‚Æ‚µ‚½‚à‚Ì‚Å‚ ‚邽‚ßAƒrƒ‹ƒhÏ‚Ý -@ƒoƒCƒiƒŠƒtƒ@ƒCƒ‹‚Í”z•z‚µ‚È‚¢ - -yŽÀ‘•‚µ‚½”͈Íz - -@CA ƒVƒXƒeƒ€ (B-CAS ƒJ[ƒhŠÖ˜A) ‚ð’†S‚É ECM(table_id=0x82) ‚̈—‚Æ -@ƒXƒgƒŠ[ƒ€ˆÃ†‚Ì•œ†ˆ—AEMM(table_id=0x84) ‚̈—‚Ü‚Å‚ðŽÀ‘•‚µ‚½ - -@EMM ƒƒbƒZ[ƒW (table_id=0x85) ŠÖ˜A‚Í–¢ŽÀ‘•‚Æ‚È‚Á‚Ä‚¢‚é - -yƒvƒƒOƒ‰ƒ€‚Ì“®ìŠÂ‹«z - -@ISO 7816 ‘Ήž‚Ì IC ƒJ[ƒhƒŠ[ƒ_‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ꂽ Windows PC ‚ð -@‘z’è“®ìŠÂ‹«‚Æ‚·‚é - -@ISO 7816 ‘ΉžƒXƒ}[ƒgƒJ[ƒhƒŠ[ƒ_[‚͈ê”Ê‚É -@uZŠîƒJ[ƒh‘Ήž IC ƒJ[ƒhƒŠ[ƒ_vue-Tax ‘Ήž IC ƒJ[ƒhƒŠ[ƒ_v -@‚È‚Ç‚Æ‚µ‚Ä 4000 ‰~’ö“x‚Ŕ̔„‚³‚ê‚Ä‚¢‚é‚à‚Ì‚ª—˜—p‰Â”\‚Å‚ ‚é - -@“ú—§ƒ}ƒNƒZƒ‹»‚Ì HX-520UJJ ‚ųí‚É“®ì‚·‚邱‚Æ‚ðŠm”F‚µ‚Ä‚¢‚é - -yƒ\[ƒXƒR[ƒh‚̃‰ƒCƒZƒ“ƒX‚ɂ‚¢‚Äz - -@Eƒ\[ƒXƒR[ƒh‚ð—˜—p‚µ‚½‚±‚Æ‚É‚æ‚Á‚ÄA“Á‹–ã‚̃gƒ‰ƒuƒ‹‚ª”¶‚µ‚Ä‚à -@@–Î–Ø ˜a—m‚ÍÓ”C‚𕉂í‚È‚¢ -@Eƒ\[ƒXƒR[ƒh‚ð—˜—p‚µ‚½‚±‚Æ‚É‚æ‚Á‚ÄAƒvƒƒOƒ‰ƒ€‚É–â‘肪”¶‚µ‚Ä‚à -@@–Î–Ø ˜a—m‚ÍÓ”C‚𕉂í‚È‚¢ - -@ã‹L 2 ðŒ‚É“¯ˆÓ‚µ‚Ä쬂³‚ꂽ“ñŽŸ“I’˜ì•¨‚ɑ΂µ‚ÄA–Î–Ø ˜a—m‚Í -@Œ´’˜ìŽÒ‚É—^‚¦‚ç‚ê‚锌 —˜‚ðsŽg‚µ‚È‚¢ - -yƒvƒƒOƒ‰ƒ€‚Ì\¬z - -@Earib_std_b25.h/c - -@@ARIB STD-B25 ‹Lڂ̈—‚ðs‚¤‚½‚߂̃‚ƒWƒ…[ƒ‹ -@@MPEG-2 TS ‚Ì•ª—£ACA ƒVƒXƒeƒ€ (B-CAS ƒJ[ƒh) ‹@”\‚̌ĂÑo‚µA -@@MULTI2 •œ†‹@”\‚̌ĂÑo‚µ“™‚ð’S“–‚·‚é - -@Ets_section_parser.h/c - -@@MPEG-2 TS ‚̃ZƒNƒVƒ‡ƒ“Œ`Ž®ƒf[ƒ^‚Ì•ªŠ„ˆ—‚ð’S“–‚·‚é - -@Eb_cas_card.h/c - -@@CA ƒVƒXƒeƒ€ (B-CAS ƒJ[ƒh) ‚̃Šƒ\[ƒXŠÇ—‚¨‚æ‚Ñ’¼Ú‚̧Œä‚ð -@@’S“–‚·‚é - -@Emulti2.h/c - -@@MULTI2 ˆÃ†‚Ì•„†‰»‚Æ•œ†‚ð’S“–‚·‚é - -@Etd.c - -@@ƒeƒXƒgƒhƒ‰ƒCƒo -@@PAT/PMT/ECM ‚ðŠÜ‚Þ MPEG-2 TS ƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚ÝA•œ†Œã‚Ì -@@MPEG-2 TS ƒtƒ@ƒCƒ‹‚ðo—Í‚·‚é - -@@ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“‚Å MULTI2 ˆÃ†‚̃‰ƒEƒ“ƒh”‚ðŽw’è‰Â”\ -@@ƒ‰ƒEƒ“ƒh”‚ðŽw’肵‚È‚¢ê‡‚̉Šú’l‚Í 4 - -@@‚±‚̃‰ƒEƒ“ƒh” 4 ‚Í MULTI2 —pŒê‚Å‚Í 32 ‚É‘Š“–‚·‚é - -@@ARIB STD-B25 ‚Å‚Í MULTI2 ‚̃‰ƒEƒ“ƒh”‚Í”ñŒöŠJƒpƒ‰ƒ[ƒ^‚¾‚ª -@@‘“–‚½‚è‚ÅŽÀۂ̃‰ƒEƒ“ƒh”‚Í„’è‰Â”\‚Å‚ ‚é - -yˆ—‚Ì—¬‚êz - -@E‹N“®Žž - -@@1 ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚Í B_CAS_CARD ƒ‚ƒWƒ…[ƒ‹‚̃Cƒ“ƒXƒ^ƒ“ƒX‚ð -@@@쬂µAB_CAS_CARD ƒ‚ƒWƒ…[ƒ‹‚ÉA‰Šú‰»‚ðˆË—Š‚·‚é - -@@1.a B_CAS_CARD ƒ‚ƒWƒ…[ƒ‹‚Í WIN32 API ‚̃Xƒ}[ƒgƒJ[ƒhŠÖ˜A -@@@@API ‚ðŒÄ‚Ño‚µACA ƒVƒXƒeƒ€‚ÉÚ‘±‚·‚é -@@1.b B_CAS_CARD ƒ‚ƒWƒ…[ƒ‹‚Í ARIB STD-B25 ‹LÚ‚Ìu‰ŠúðŒ -@@@@Ý’èƒRƒ}ƒ“ƒh‚ð CA ƒVƒXƒeƒ€‚É”s‚µAƒVƒXƒeƒ€Œ® (64 byte) -@@@@‰Šú CBC ó‘Ô (8 byte) ‚ðŽó‚¯Žæ‚é - -@@2 ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚Í ARIB_STD_B25 ƒ‚ƒWƒ…[ƒ‹‚̃Cƒ“ƒXƒ^ƒ“ƒX‚ð -@@@쬂µAB_CAS_CARD ƒ‚ƒWƒ…[ƒ‹‚ð ARIB_STD_B25 ƒ‚ƒWƒ…[ƒ‹‚É -@@@“o˜^‚·‚é - -@Eƒf[ƒ^ˆ—Žž - -@@1 ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚Í ARIB_STD_B25 ƒ‚ƒWƒ…[ƒ‹‚ɇŽŸƒf[ƒ^‚ð -@@@’ñ‹Ÿ‚µAARIB_STD_B25 ƒ‚ƒWƒ…[ƒ‹‚©‚爗Š®—¹ƒf[ƒ^‚ðŽó‚¯ -@@@Žæ‚Á‚ătƒ@ƒCƒ‹‚Éo—Í‚µ‚Ä‚¢‚ - -@@EARIB_STD_B25 ƒ‚ƒWƒ…[ƒ‹“à - -@@@1 TS ƒpƒPƒbƒg‚̃†ƒjƒbƒgƒTƒCƒY (188/192/204 ‚È‚Ç‚ªˆê”Ê“I) ‚ª -@@@@“Á’肳‚ê‚Ä‚¢‚È‚¢ê‡ 8K ‚Ü‚Å“ü—̓f[ƒ^‚ðƒoƒbƒtƒ@‚µ‚Ä‚©‚çA -@@@@ƒ†ƒjƒbƒgƒTƒCƒY‚ð“Á’è‚·‚é -@@@@ƒ†ƒjƒbƒgƒTƒCƒY‚ª“Á’è‚Å‚«‚È‚©‚Á‚½ê‡‚ÍAƒGƒ‰[I—¹‚·‚é - -@@@2 PAT ‚ª”Œ©‚³‚ê‚Ä‚¢‚È‚¢ê‡APAT ‚ª”Œ©‚Å‚«‚é‚Ü‚Å“ü—Í -@@@@ƒf[ƒ^‚ðƒoƒbƒtƒ@‚µ‘±‚¯‚é -@@@@PAT ‚ª”Œ©‚Å‚«‚¸‚Ƀoƒbƒtƒ@ƒTƒCƒY‚ª 16M ‚𒴉߂µ‚½ê‡ -@@@@ƒGƒ‰[I—¹‚·‚é -@@@@PAT ‚ª”Œ©‚Å‚«‚½ê‡AƒvƒƒOƒ‰ƒ€”z—ñ‚ð쬂µ PID ƒ}ƒbƒv -@@@@”z—ñ‚É“o˜^‚·‚é - -@@@3 PAT ‚É“o˜^‚³‚ê‚Ä‚¢‚½ PMT ‚·‚ׂĂª”Œ©‚³‚ê‚é‚©A‚Ç‚ê‚© -@@@@‚Ð‚Æ‚Â‚Ì PMT ‚Å 2 ŒÂ–ڂ̃ZƒNƒVƒ‡ƒ“‚ª“ž’…‚·‚é‚Ü‚Å“ü—Í -@@@@ƒf[ƒ^‚ðƒoƒbƒtƒ@‚µ‘±‚¯‚é -@@@@ã‹LðŒ‚ð–ž‚½‚³‚¸‚Ƀoƒbƒtƒ@ƒTƒCƒY‚ª 32M ‚𒴉߂µ‚½ê‡ -@@@@ƒGƒ‰[I—¹‚·‚é -@@@@PMT ‚ª“ž’…‚·‚é–ˆ‚É ECM ‚Ì—L–³‚ðŠm”F‚µAECM ‚ª‘¶Ý‚·‚é -@@@@ꇂ̓fƒNƒŠƒvƒ^‚ð쬂µ‚ăvƒƒOƒ‰ƒ€‚ÉŠ‘®‚·‚éƒXƒgƒŠ[ƒ€ -@@@@‚Æ PID ƒ}ƒbƒvã‚ÅŠÖ˜A•t‚¯‚é - -@@@4 PMT ‚É“o˜^‚³‚ê‚Ä‚¢‚½ ECM ‚·‚ׂĂª”Œ©‚³‚ê‚é‚©A‚Ç‚ê‚© -@@@@‚Ð‚Æ‚Â‚Ì ECM ‚Å 2 ŒÂ–ڂ̃ZƒNƒVƒ‡ƒ“‚ª“ž’…‚·‚é‚Ü‚Å“ü—Í -@@@@ƒf[ƒ^‚ðƒoƒbƒtƒ@‚µ‘±‚¯‚é -@@@@ã‹LðŒ‚ð–ž‚½‚³‚¸‚Ƀoƒbƒtƒ@ƒTƒCƒY‚ª 32M ‚𒴉߂µ‚½ê‡ -@@@@ƒGƒ‰[I—¹‚·‚é -@@@@Še ECM ‚ɑ΂µ‚ÄAʼn‚̃ZƒNƒVƒ‡ƒ“ƒf[ƒ^‚ª“ž’…‚µ‚½Žž“_‚Å -@@@@MULTI2 ƒ‚ƒWƒ…[ƒ‹‚̃Cƒ“ƒXƒ^ƒ“ƒX‚ðƒfƒNƒŠƒvƒ^ã‚É쬂·‚é -@@@@ECM ƒZƒNƒVƒ‡ƒ“ƒf[ƒ^‚Í B_CAS_CARD ƒ‚ƒWƒ…[ƒ‹‚É’ñ‹Ÿ‚µ‚Ä -@@@@ƒXƒNƒ‰ƒ“ƒuƒ‹Œ®‚ðŽó‚¯Žæ‚èAMULTI2 ƒ‚ƒWƒ…[ƒ‹‚ɃVƒXƒeƒ€Œ®A -@@@@‰Šú CBC ó‘ÔAƒXƒNƒ‰ƒ“ƒuƒ‹Œ®‚ð“n‚µAMULTI2 •œ†‚Ì€”õ‚ð -@@@@s‚¤ - -@@@5.a ˆÃ†‰»‚³‚ê‚Ä‚¢‚é TS ƒpƒPƒbƒg‚Å‚ ‚ê‚ÎAPID ‚©‚ç‘Ήž -@@@@@ECM ƒXƒgƒŠ[ƒ€‚ð“Á’肵AƒfƒNƒŠƒvƒ^‚Ì MULTI2 ƒ‚ƒWƒ…[ -@@@@@ƒ‹‚É•œ†‚³‚¹‚Äo—̓oƒbƒtƒ@‚ÉÏ‚Þ -@@@@ -@@@5.b ˆÃ†‰»‚³‚ê‚Ä‚¢‚È‚¢ TS ƒpƒPƒbƒg‚Å‚ ‚ê‚ÎA‚»‚Ì‚Ü‚Üo—Í -@@@@@ƒoƒbƒtƒ@‚ÉÏ‚Þ - -@@@5.c CAT ‚ðŒŸo‚µ‚½ê‡AEMM ‚Ì PID ‚ðŽæ“¾‚µ‚Ä EMM ‚̈— -@@@@@€”õ‚ðs‚¤ - -@@@5.d EMM ‚ðŽó‚¯Žæ‚Á‚½ê‡AB-CAS ƒJ[ƒh ID ‚Æ”äŠr‚µAŽ©•ª -@@@@@ˆ¶‚Ä‚Ì EMM ‚Å‚ ‚ê‚Î B-CAS ƒJ[ƒh‚Ɉø‚«“n‚µ‚Ĉ—‚³‚¹‚é -@@@@@# EMM ˆ—ƒIƒvƒVƒ‡ƒ“‚ªŽw’肳‚ê‚Ä‚¢‚éê‡ - -@@@6 ECM ‚ªXV‚³‚ꂽê‡AB_CAS_CARD ƒ‚ƒWƒ…[ƒ‹‚Ɉ—‚ð -@@@@ˆË—Š‚µAo—Í‚³‚ꂽƒXƒNƒ‰ƒ“ƒuƒ‹Œ®‚ð MULTI2 ƒ‚ƒWƒ…[ƒ‹‚É -@@@@“o˜^‚·‚é - -@@@7 PMT ‚ªXV‚³‚ꂽê‡AECM PID ‚ª•Ï‰»‚µ‚Ä‚¢‚ê‚ÎV‚½‚É -@@@@ƒfƒNƒŠƒvƒ^‚ð쬂µ‚Ä 4 ‚É–ß‚é - -@@@8 PAT ‚ªXV‚³‚ꂽê‡AƒvƒƒOƒ‰ƒ€”z—ñ‚ð”jŠü‚µ‚Ä -@@@@3 ‚É–ß‚é - -@EI—¹Žž - -@@1 Šeƒ‚ƒWƒ…[ƒ‹‚ªŠm•Û‚µ‚½ƒŠƒ\[ƒX‚ð‰ð•ú‚·‚é - -yXV—š—ðz - -@E2009, 4/19 - ver. 0.2.4 - -@@I’[ƒpƒPƒbƒg‚ª–ì—ǃpƒPƒbƒg (PMT ‚É‹LÚ‚³‚ê‚Ä‚¢‚È‚¢ PID ‚Ì -@@ƒpƒPƒbƒg) ‚¾‚Á‚½ê‡‚ÉAECM ‚ª 1 ‚‚¾‚¯‚Å‚à•œ†‚ªs‚í‚ê‚È‚¢ -@@ƒoƒO‚ðC³ - -@@transport_error_indicator ‚ª—§‚Á‚Ä‚¢‚éꇂ̓pƒPƒbƒgˆ—‚ð -@@s‚킸A‚»‚Ì‚Ü‚Ü‘f’Ê‚µ‚·‚é‚悤‚É•ÏX - -@@http://www.marumo.ne.jp/db2009_4.htm#19 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.2.4.lzh - -@E2008, 12/30 - ver. 0.2.3 - -@@CA_descriptor ‚̉ðŽß‚ðs‚¤Û‚É CA_system_id ‚ª B-CAS ƒJ[ƒh -@@‚©‚çŽæ“¾‚µ‚½‚à‚̂ƈê’v‚·‚é‚©Šm”F‚ðs‚¤‚悤‚É•ÏX - -@@http://www.marumo.ne.jp/db2008_c.htm#30 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.2.3.lzh - -@E2008, 11/10 - ver. 0.2.2 - -@@C³ƒ†ƒŠƒEƒX“ú‚©‚ç”NŒŽ“ú‚Ö‚Ì•ÏŠ·ˆ—‚ð‚æ‚賊m‚È‚à‚Ì‚Ö•ÏX - -@@TS ƒpƒPƒbƒgƒTƒCƒY‚Ì“Á’è•û–@‚ð•ÏX - -@@http://www.marumo.ne.jp/db2008_b.htm#10 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.2.2.lzh - -@E2008, 4/9 - ver. 0.2.1 - -@@PAT XVŽž‚É•œ†˜R‚ꂪ”¶‚µ‚Ä‚¢‚½ƒoƒO‚ðC³ -@@(ver. 0.2.0 ‚ł̃Gƒ“ƒoƒO) - -@@–ì—Ç PID (PMT ‚É‹LÚ‚³‚ê‚Ä‚¢‚È‚¢ƒXƒgƒŠ[ƒ€) ‚ª‘¶Ý‚µ‚½ê‡ -@@TS “à‚Ì ECM ‚ª‚ЂƂ‚¾‚¯‚È‚ç‚ÎA‚»‚Ì ECM ‚Å•œ†‚·‚éŒ`‚É•ÏX - -@@EMM ‚Ì B-CAS ƒJ[ƒh‚Ö‚Ì‘—M‚ðƒIƒvƒVƒ‡ƒ“‚Å‘I‘ð‰Â”\‚É•ÏX (-m) -@@i’»ó‹µ‚Ì•\Ž¦‚ðƒIƒvƒVƒ‡ƒ“‚Å‘I‘ð‰Â”\‚É•ÏX (-v) -@@’Ê“d§Œäî•ñ (EMMŽóM—p) ‚ð•\Ž¦‚·‚éƒIƒvƒVƒ‡ƒ“‚ð’ljÁ (-p) - -@@http://www.marumo.ne.jp/db2008_4.htm#9 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.2.1.lzh - -@E2008, 4/6 - ver. 0.2.0 - -@@EMM ‘Ήž -@@—˜—p’†‚Ì B-CAS ƒJ[ƒh ID Œü‚¯‚Ì EMM ‚ðŒŸo‚µ‚½ê‡AEMM ‚ð -@@B-CAS ƒJ[ƒh‚É“n‚·ˆ—‚ð’ljÁ - -@@ECM ˆ—‚ÌÛ‚É–¢Œ_–ñ‰ž“š‚ª•Ô‚³‚ꂽê‡Aˆ—•‰‰×ŒyŒ¸‚̈×A -@@ˆÈ~A‚»‚Ì PID ‚Ì ECM ‚ð B-CAS ƒJ[ƒh‚ň—‚µ‚È‚¢‚悤‚É•Ï -@@X (EMM ‚ðˆ—‚µ‚½ê‡‚ÍÄ‚Ñ ECM ‚ðˆ—‚·‚é‚悤‚É–ß‚·) - -@@i’»‚ð nn.nn% ‚Ì‘Ž®‚Å•W€ƒGƒ‰[o—Í‚É•\Ž¦‚·‚é‚悤‚É•ÏX -@@ -@@http://www.marumo.ne.jp/db2008_4.htm#6 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.2.0.lzh - -@E2008, 3/31 - ver. 0.1.9 - -@@MULTI2 ƒ‚ƒWƒ…[ƒ‹‚̃Cƒ“ƒXƒ^ƒ“ƒX‚ª–¢ì»‚Ì󋵂ÅAMULTI2 ‚Ì -@@‹@”\‚ðŒÄ‚Ño‚µ‚Ä—áŠO‚𔶂³‚¹‚邱‚Æ‚ª‚ ‚Á‚½ƒoƒO‚ðC³ - -@@# ƒpƒbƒ`‚ð’ñ‹Ÿ‚µ‚Ä‚‚ꂽ•û‚ÉŠ´ŽÓ - -@@http://www.marumo.ne.jp/db2008_3.htm#31 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.9.lzh - -@E2008, 3/24 - ver. 0.1.8 - -@@-s ƒIƒvƒVƒ‡ƒ“ (NULL ƒpƒPƒbƒg‚Ìíœ) ‚ð’ljÁ -@@-s 1 ‚Å NULL ƒpƒPƒbƒg‚ðo—̓tƒ@ƒCƒ‹‚É‚Í•Û‘¶‚µ‚È‚‚È‚é -@@ƒfƒtƒHƒ‹ƒg‚Í -s 0 ‚Ì NULL ƒpƒPƒbƒg•ÛŽ - -@@http://www.marumo.ne.jp/db2008_3.htm#24 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.8.lzh - -@E2008, 3/17 - ver. 0.1.7 - -@@arib_std_b25.h ‚Éuextern "C" {v‚ð•Â‚¶‚éƒR[ƒh‚ª‚È‚©‚Á‚½–â‘è -@@(C++ ƒR[ƒh‚©‚ç—˜—p‚·‚éꇂɃRƒ“ƒpƒCƒ‹ƒGƒ‰[‚𔶂³‚¹‚é) ‚ð -@@C³ - -@@TS ƒpƒPƒbƒg‚Ì’†“r‚ŃXƒgƒŠ[ƒ€‚ªØ‚è‘Ö‚í‚éƒP[ƒX‚Å–â‘肪”¶‚µ -@@‚É‚‚‚È‚é‚悤‚ÉAarib_std_b25.c “à‚̃R[ƒh‚ðC³ - -@@http://www.marumo.ne.jp/db2008_3.htm#17 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.7.lzh - -@E2008, 3/16 - ver. 0.1.6 - -@@PMT XV‚ÌÛAECM ŠÖ˜A‚Ì󋵂ª•ÏX (ƒXƒNƒ‰ƒ“ƒuƒ‹ - ƒmƒ“ƒXƒN -@@ƒ‰ƒ“ƒuƒ‹‚ÌØ‚è‘Ö‚¦‚âAECM PID ‚Ì•ÏX“™) ‚ªs‚í‚ê‚Ä‚àA‚»‚ꂪ -@@”½‰f‚³‚ê‚Ä‚¢‚È‚©‚Á‚½–â‘è‚ðC³ - -@@http://www.marumo.ne.jp/db2008_3.htm#16 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.6.lzh - -@E2008, 2/14 - -@@readme.txt (‚±‚̃tƒ@ƒCƒ‹) ‚ðC³ -@@ƒ\[ƒXƒR[ƒh‚̃‰ƒCƒZƒ“ƒX‚ɂ‚¢‚Ä‚Ì‹Lq‚ð’ljÁ - -@E2008, 2/12 - ver. 0.1.5 - -@@PMT ‚ÌXV‚É”º‚¢A‚ǂ̃vƒƒOƒ‰ƒ€‚É‚àŠ‘®‚µ‚È‚‚È‚Á‚½ PID (ƒXƒg -@@ƒŠ[ƒ€) ‚ŃpƒPƒbƒg‚ª‘—M‚³‚ꑱ‚¯‚½ê‡A‚»‚̃pƒPƒbƒg‚Ì•œ†‚ª -@@‚Å‚«‚È‚‚È‚Á‚Ä‚¢‚½–â‘è‚ðC³ - -@@http://www.marumo.ne.jp/db2008_2.htm#12 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.5.lzh - -@E2008, 2/2 - ver. 0.1.4 - -@@ver. 0.1.3 ‚Å‚Ì PMT ˆ—•û–@•ÏX‚É–â‘肪‚ ‚èAPMT ‚ªXV‚³‚ꂽ -@@ê‡A‚»‚êˆÈ~‚ųí‚Ȉ—‚ªs‚¦‚È‚‚È‚Á‚Ä‚¢‚½ƒoƒO‚ðC³ - -@@B-CAS ƒJ[ƒh‚Æ‚Ì’ÊM‚ŃGƒ‰[‚ª”¶‚µ‚½ê‡‚̃Šƒgƒ‰ƒCˆ—‚ª‹@”\ -@@‚µ‚Ä‚¢‚È‚©‚Á‚½ƒoƒO‚ðC³ - -@@http://www.marumo.ne.jp/db2008_2.htm#2 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.4.lzh - -@E2008, 2/1 - ver. 0.1.3 - -@@—L—¿•ú‘—“™‚Å–¢Œ_–ñó‘Ô‚Ì B-CAS ƒJ[ƒh‚ðŽg‚Á‚½Û‚ÉAŒ®‚ªŽæ“¾‚Å -@@‚«‚Ä‚¢‚È‚¢‚É‚à‚©‚©‚í‚炸AŠÔˆá‚Á‚½Œ®‚Å•œ†‚ð‚µ‚Ä‚¢‚½–â‘è‚ɑΈ - -@@Œ®‚ªŽæ“¾‚Å‚«‚È‚©‚Á‚½ ECM ‚ÉŠÖ˜A•t‚¯‚ç‚ꂽƒXƒgƒŠ[ƒ€‚Å‚Í•œ†‚ð -@@s‚킸AƒXƒNƒ‰ƒ“ƒuƒ‹ƒtƒ‰ƒO‚ðŽc‚µ‚½‚Ü‚Ü“ü—Í‚ð‘f’Ê‚µ‚·‚éŒ`‚É•ÏX -@@Œ®‚ªŽæ“¾‚Å‚«‚È‚¢ ECM ‚ª‘¶Ý‚·‚éê‡AI—¹Žž‚Ƀ`ƒƒƒlƒ‹”Ô†‚Æ -@@B-CAS ƒJ[ƒh‚©‚çŽæ“¾‚Å‚«‚½ƒGƒ‰[”Ô†‚ðŒxƒƒbƒZ[ƒW‚Æ‚µ‚Ä•\Ž¦ -@@‚·‚éŒ`‚É•ÏX - -@@ˆÃ†‰»‚³‚ê‚Ä‚¢‚È‚¢ƒvƒƒOƒ‰ƒ€‚Å—áŠO‚𔶂³‚¹‚Ä‚¢‚½ƒoƒO‚ðC³ - -@@http://www.marumo.ne.jp/db2008_2.htm#1 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.3.lzh - -@E2008, 1/11 - ver. 0.1.2 - -@@ƒfƒWƒ^ƒ‹ BS •ú‘—“™‚ÅAPAT ‚É“o˜^‚³‚ê‚Ä‚¢‚é‚Ì‚ÉAƒXƒgƒŠ[ƒ€“à‚Å -@@PMT ‚ªˆêØoŒ»‚µ‚È‚¢‚±‚Æ‚ª‚ ‚éꇂɑΉž - -@@PMT “à‚Ì‹LqŽq—̈æ 2 ‚É CA_descriptor ‚ª‘¶Ý‚·‚éꇂɑΉž‚·‚é -@@‚½‚ß arib_std_b25.c “à•”‚ł̈—\‘¢‚ð•ÏX - -@@•ÊƒvƒƒOƒ‰ƒ€‚Æ“¯ŽžŽÀs‚·‚邽‚߂ɃXƒ}[ƒgƒJ[ƒh‚Ì”r‘¼§ŒäŽw’è‚ð -@@•ÏX - -@@http://www.marumo.ne.jp/db2008_1.htm#11 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.2.lzh - -@E2008, 1/7 - ver. 0.1.1 - -@@ƒZƒNƒVƒ‡ƒ“ (PAT/PMT/ECM “™) ‚ª•¡”‚Ì TS ƒpƒPƒbƒg‚É•ªŠ„‚³‚ê‚Ä‚¢‚é -@@ꇂÉA³í‚Ɉ—‚Å‚«‚È‚©‚Á‚½‚èA—áŠO‚ð”¶‚ð‚³‚¹‚邱‚Æ‚ª‚ ‚é -@@ƒoƒO‚ðC³ - -@@http://www.marumo.ne.jp/db2008_1.htm#7 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.1.lzh - -@E2007, 11/25 - ver. 0.1.0 - -@@ŒöŠJ - -@@http://www.marumo.ne.jp/db2007_b.htm#25 –”‚Í -@@http://www.marumo.ne.jp/junk/arib_std_b25-0.1.0.lzh -
--- a/arib25/src/Makefile Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -PREFIX = /usr/local -MAJOR = 0 -MINOR = 2 -REVISION = 4 -VER = $(MAJOR).$(MINOR).$(REVISION) - -DEST_HEADER = $(PREFIX)/include/arib25 - -CC = gcc -PCSC_CFLAGS ?= `pkg-config libpcsclite --cflags` -CPPFLAGS = -Wall $(PCSC_CFLAGS) -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -CFLAGS = -O2 -g -fPIC - -PCSC_LIBS ?= `pkg-config libpcsclite --libs` -LIBS = $(PCSC_LIBS) -lm -LDFLAGS ?= - -OBJS = arib_std_b25.o b_cas_card.o multi2.o ts_section_parser.o -HEADERS = arib_std_b25.h b_cas_card.h portable.h -TARGET_APP = b25 -TARGET_LIB = libarib25.so -TARGETS = $(TARGET_APP) $(TARGET_LIB) -DEPEND = Makefile.dep -SONAME = $(TARGET_LIB).$(MAJOR) - -all: $(TARGETS) - -clean: - rm -f $(OBJS) td.o $(TARGETS) $(DEPEND) - -$(TARGET_APP): $(OBJS) td.o - $(CC) $(LDFLAGS) -o $(TARGET_APP) $(OBJS) td.o $(LIBS) - -$(TARGET_LIB): $(OBJS) - $(CC) $(LDFLAGS) -shared -o $(TARGET_LIB) $(OBJS) $(LIBS) -Wl,-soname,$(SONAME) - -$(DEPEND): - $(CC) -MM $(OBJS:.o=.c) $(CPPFLAGS) > $@ - -install: $(TARGET) install-headers - install -m755 b25 $(PREFIX)/bin - install -m755 $(TARGET_LIB) $(PREFIX)/lib/$(TARGET_LIB).$(VER) - ln -sf $(PREFIX)/lib/$(TARGET_LIB).$(VER) $(PREFIX)/lib/$(TARGET_LIB).$(MAJOR) - ln -sf $(PREFIX)/lib/$(TARGET_LIB).$(MAJOR) $(PREFIX)/lib/$(TARGET_LIB) - ldconfig - -install-headers: - mkdir -p $(DEST_HEADER) - install -m644 $(HEADERS) $(DEST_HEADER) - --include $(DEPEND)
--- a/arib25/src/arib_std_b25.c Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2589 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -#include "arib_std_b25.h" -#include "arib_std_b25_error_code.h" -#include "multi2.h" -#include "ts_common_types.h" -#include "ts_section_parser.h" - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - inner structures - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -typedef struct { - int32_t pid; - int32_t type; - void *prev; - void *next; -} TS_STREAM_ELEM; - -typedef struct { - TS_STREAM_ELEM *head; - TS_STREAM_ELEM *tail; - int32_t count; -} TS_STREAM_LIST; - -typedef struct { - - uint8_t *pool; - uint8_t *head; - uint8_t *tail; - int32_t max; - -} TS_WORK_BUFFER; - -typedef struct { - - int32_t phase; - - int32_t program_number; - - int32_t pmt_pid; - TS_SECTION_PARSER *pmt; - - int32_t pcr_pid; - - TS_STREAM_LIST streams; - TS_STREAM_LIST old_strm; - -} TS_PROGRAM; - -typedef struct { - - int32_t ref; - int32_t phase; - - int32_t locked; - - int32_t ecm_pid; - TS_SECTION_PARSER *ecm; - - MULTI2 *m2; - - int32_t unpurchased; - int32_t last_error; - - void *prev; - void *next; - -} DECRYPTOR_ELEM; - -typedef struct { - DECRYPTOR_ELEM *head; - DECRYPTOR_ELEM *tail; - int32_t count; -} DECRYPTOR_LIST; - -typedef struct { - uint32_t ref; - uint32_t type; - int64_t normal_packet; - int64_t undecrypted; - void *target; -} PID_MAP; - -typedef struct { - - int32_t multi2_round; - int32_t strip; - int32_t emm_proc_on; - - int32_t unit_size; - - int32_t sbuf_offset; - - TS_SECTION_PARSER *pat; - TS_SECTION_PARSER *cat; - - TS_STREAM_LIST strm_pool; - - int32_t p_count; - TS_PROGRAM *program; - - DECRYPTOR_LIST decrypt; - - PID_MAP map[0x2000]; - - B_CAS_CARD *bcas; - B_CAS_ID casid; - int32_t ca_system_id; - - int32_t emm_pid; - TS_SECTION_PARSER *emm; - - TS_WORK_BUFFER sbuf; - TS_WORK_BUFFER dbuf; - -} ARIB_STD_B25_PRIVATE_DATA; - -typedef struct { - int64_t card_id; - int32_t associated_information_length; - int32_t protocol_number; - int32_t broadcaster_group_id; - int32_t update_number; - int32_t expiration_date; -} EMM_FIXED_PART; - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - constant values - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -enum TS_STREAM_TYPE { - TS_STREAM_TYPE_11172_2_VIDEO = 0x01, - TS_STREAM_TYPE_13818_2_VIDEO = 0x02, - TS_STREAM_TYPE_11172_3_AUDIO = 0x03, - TS_STREAM_TYPE_13818_3_AUDIO = 0x04, - TS_STREAM_TYPE_13818_1_PRIVATE_SECTIONS = 0x05, - TS_STREAM_TYPE_13818_1_PES_PRIVATE_DATA = 0x06, - TS_STREAM_TYPE_13522_MHEG = 0x07, - TS_STREAM_TYPE_13818_1_DSM_CC = 0x08, - TS_STREAM_TYPE_H_222_1 = 0x09, - TS_STREAM_TYPE_13818_6_TYPE_A = 0x0a, - TS_STREAM_TYPE_13818_6_TYPE_B = 0x0b, - TS_STREAM_TYPE_13818_6_TYPE_C = 0x0c, - TS_STREAM_TYPE_13818_6_TYPE_D = 0x0d, - TS_STREAM_TYPE_13818_1_AUX = 0x0e, - TS_STREAM_TYPE_13818_7_AUDIO_ADTS = 0x0f, - TS_STREAM_TYPE_14496_2_VISUAL = 0x10, - TS_STREAM_TYPE_14496_3_AUDIO_LATM = 0x11, - TS_STREAM_TYPE_14496_1_PES_SL_PACKET = 0x12, - TS_STREAM_TYPE_14496_1_SECTIONS_SL_PACKET = 0x13, - TS_STREAM_TYPE_13818_6_SYNC_DWLOAD_PROTCOL = 0x14, -}; - -enum TS_SECTION_ID { - TS_SECTION_ID_PROGRAM_ASSOCIATION = 0x00, - TS_SECTION_ID_CONDITIONAL_ACCESS = 0x01, - TS_SECTION_ID_PROGRAM_MAP = 0x02, - TS_SECTION_ID_DESCRIPTION = 0x03, - TS_SECTION_ID_14496_SCENE_DESCRIPTION = 0x04, - TS_SECTION_ID_14496_OBJECT_DESCRIPTION = 0x05, - - /* ARIB STD-B10 stuff */ - TS_SECTION_ID_DSM_CC_HEAD = 0x3a, - TS_SECTION_ID_DSM_CC_TAIL = 0x3f, - TS_SECTION_ID_NIT_ACTUAL = 0x40, - TS_SECTION_ID_NIT_OTHER = 0x41, - TS_SECTION_ID_SDT_ACTUAL = 0x42, - TS_SECTION_ID_SDT_OTHER = 0x46, - TS_SECTION_ID_BAT = 0x4a, - TS_SECTION_ID_EIT_ACTUAL_CURRENT = 0x4e, - TS_SECTION_ID_EIT_OTHER_CURRENT = 0x4f, - TS_SECTION_ID_EIT_ACTUAL_SCHEDULE_HEAD = 0x50, - TS_SECTION_ID_EIT_ACTUAL_SCHEDULE_TAIL = 0x5f, - TS_SECTION_ID_EIT_OTHER_SCHEDULE_HEAD = 0x60, - TS_SECTION_ID_EIT_OTHER_SCHEDULE_TAIL = 0x6f, - TS_SECTION_ID_TDT = 0x70, - TS_SECTION_ID_RST = 0x71, - TS_SECTION_ID_ST = 0x72, - TS_SECTION_ID_TOT = 0x73, - TS_SECTION_ID_AIT = 0x74, - TS_SECTION_ID_DIT = 0x7e, - TS_SECTION_ID_SIT = 0x7f, - TS_SECTION_ID_ECM_S = 0x82, - TS_SECTION_ID_ECM = 0x83, - TS_SECTION_ID_EMM_S = 0x84, - TS_SECTION_ID_EMM_MESSAGE = 0x85, - TS_SECTION_ID_DCT = 0xc0, - TS_SECTION_ID_DLT = 0xc1, - TS_SECTION_ID_PCAT = 0xc2, - TS_SECTION_ID_SDTT = 0xc3, - TS_SECTION_ID_BIT = 0xc4, - TS_SECTION_ID_NBIT_BODY = 0xc5, - TS_SECTION_ID_NBIT_REFERENCE = 0xc6, - TS_SECTION_ID_LDT = 0xc7, - TS_SECTION_ID_CDT = 0xc8, - TS_SECTION_ID_LIT = 0xd0, - TS_SECTION_ID_ERT = 0xd1, - TS_SECTION_ID_ITT = 0xd2, -}; - -enum TS_DESCRIPTOR_TAG { - TS_DESCRIPTOR_TAG_VIDEO_STREAM = 0x02, - TS_DESCRIPTOR_TAG_AUDIO_STREAM = 0x03, - TS_DESCRIPTOR_TAG_HIERARCHY = 0x04, - TS_DESCRIPTOR_TAG_REGISTRATION = 0x05, - TS_DESCRIPTOR_TAG_DATA_STREAM_ALIGNMENT = 0x06, - TS_DESCRIPTOR_TAG_TARGET_BACKGROUND_GRID = 0x07, - TS_DESCRIPTOR_TAG_VIDEO_WINDOW = 0x08, - TS_DESCRIPTOR_TAG_CA = 0x09, - TS_DESCRIPTOR_TAG_ISO_639_LANGUAGE = 0x0a, - TS_DESCRIPTOR_TAG_SYSTEM_CLOCK = 0x0b, - TS_DESCRIPTOR_TAG_MULTIPLEX_BUF_UTILIZ = 0x0c, - TS_DESCRIPTOR_TAG_COPYRIGHT = 0x0d, - TS_DESCRIPTOR_TAG_MAXIMUM_BITRATE = 0x0e, - TS_DESCRIPTOR_TAG_PRIVATE_DATA_INDICATOR = 0x0f, - TS_DESCRIPTOR_TAG_SMOOTHING_BUFFER = 0x10, - TS_DESCRIPTOR_TAG_STD = 0x11, - TS_DESCRIPTOR_TAG_IBP = 0x12, - TS_DESCRIPTOR_TAG_MPEG4_VIDEO = 0x1b, - TS_DESCRIPTOR_TAG_MPEG4_AUDIO = 0x1c, - TS_DESCRIPTOR_TAG_IOD = 0x1d, - TS_DESCRIPTOR_TAG_SL = 0x1e, - TS_DESCRIPTOR_TAG_FMC = 0x1f, - TS_DESCRIPTOR_TAG_EXTERNAL_ES_ID = 0x20, - TS_DESCRIPTOR_TAG_MUXCODE = 0x21, - TS_DESCRIPTOR_TAG_FMX_BUFFER_SIZE = 0x22, - TS_DESCRIPTOR_TAG_MULTIPLEX_BUFFER = 0x23, - TS_DESCRIPTOR_TAG_AVC_VIDEO = 0x28, - TS_DESCRIPTOR_TAG_AVC_TIMING_HRD = 0x2a, - - /* ARIB STD-B10 stuff */ - TS_DESCRIPTOR_TAG_NETWORK_NAME = 0x40, - TS_DESCRIPTOR_TAG_SERVICE_LIST = 0x41, - TS_DESCRIPTOR_TAG_STUFFING = 0x42, - TS_DESCRIPTOR_TAG_SATELLITE_DELIVERY_SYS = 0x43, - TS_DESCRIPTOR_TAG_CABLE_DISTRIBUTION = 0x44, - TS_DESCRIPTOR_TAG_BOUNQUET_NAME = 0x47, - TS_DESCRIPTOR_TAG_SERVICE = 0x48, - TS_DESCRIPTOR_TAG_COUNTRY_AVAILABILITY = 0x49, - TS_DESCRIPTOR_TAG_LINKAGE = 0x4a, - TS_DESCRIPTOR_TAG_NVOD_REFERENCE = 0x4b, - TS_DESCRIPTOR_TAG_TIME_SHIFTED_SERVICE = 0x4c, - TS_DESCRIPTOR_TAG_SHORT_EVENT = 0x4d, - TS_DESCRIPTOR_TAG_EXTENDED_EVENT = 0x4e, - TS_DESCRIPTOR_TAG_TIME_SHIFTED_EVENT = 0x4f, - TS_DESCRIPTOR_TAG_COMPONENT = 0x50, - TS_DESCRIPTOR_TAG_MOSAIC = 0x51, - TS_DESCRIPTOR_TAG_STREAM_IDENTIFIER = 0x52, - TS_DESCRIPTOR_TAG_CA_IDENTIFIER = 0x53, - TS_DESCRIPTOR_TAG_CONTENT = 0x54, - TS_DESCRIPTOR_TAG_PARENTAL_RATING = 0x55, - TS_DESCRIPTOR_TAG_LOCAL_TIME_OFFSET = 0x58, - TS_DESCRIPTOR_TAG_PARTIAL_TRANSPORT_STREAM = 0x63, - TS_DESCRIPTOR_TAG_HIERARCHICAL_TRANSMISSION = 0xc0, - TS_DESCRIPTOR_TAG_DIGITAL_COPY_CONTROL = 0xc1, - TS_DESCRIPTOR_TAG_NETWORK_IDENTIFICATION = 0xc2, - TS_DESCRIPTOR_TAG_PARTIAL_TRANSPORT_TIME = 0xc3, - TS_DESCRIPTOR_TAG_AUDIO_COMPONENT = 0xc4, - TS_DESCRIPTOR_TAG_HYPERLINK = 0xc5, - TS_DESCRIPTOR_TAG_TARGET_REGION = 0xc6, - TS_DESCRIPTOR_TAG_DATA_COTENT = 0xc7, - TS_DESCRIPTOR_TAG_VIDEO_DECODE_CONTROL = 0xc8, - TS_DESCRIPTOR_TAG_DOWNLOAD_CONTENT = 0xc9, - TS_DESCRIPTOR_TAG_CA_EMM_TS = 0xca, - TS_DESCRIPTOR_TAG_CA_CONTRACT_INFORMATION = 0xcb, - TS_DESCRIPTOR_TAG_CA_SERVICE = 0xcc, - TS_DESCRIPTOR_TAG_TS_INFORMATION = 0xcd, - TS_DESCRIPTOR_TAG_EXTENDED_BROADCASTER = 0xce, - TS_DESCRIPTOR_TAG_LOGO_TRANSMISSION = 0xcf, - TS_DESCRIPTOR_TAG_BASIC_LOCAL_EVENT = 0xd0, - TS_DESCRIPTOR_TAG_REFERENCE = 0xd1, - TS_DESCRIPTOR_TAG_NODE_RELATION = 0xd2, - TS_DESCRIPTOR_TAG_SHORT_NODE_INFORMATION = 0xd3, - TS_DESCRIPTOR_TAG_STC_REFERENCE = 0xd4, - TS_DESCRIPTOR_TAG_SERIES = 0xd5, - TS_DESCRIPTOR_TAG_EVENT_GROUP = 0xd6, - TS_DESCRIPTOR_TAG_SI_PARAMETER = 0xd7, - TS_DESCRIPTOR_TAG_BROADCASTER_NAME = 0xd8, - TS_DESCRIPTOR_TAG_COMPONENT_GROUP = 0xd9, - TS_DESCRIPTOR_TAG_SI_PRIME_TS = 0xda, - TS_DESCRIPTOR_TAG_BOARD_INFORMATION = 0xdb, - TS_DESCRIPTOR_TAG_LDT_LINKAGE = 0xdc, - TS_DESCRIPTOR_TAG_CONNECTED_TRANSMISSION = 0xdd, - TS_DESCRIPTOR_TAG_CONTENT_AVAILABILITY = 0xde, - TS_DESCRIPTOR_TAG_VALUE_EXTENSION = 0xdf, - TS_DESCRIPTOR_TAG_SERVICE_GROUP = 0xe0, - TS_DESCRIPTOR_TAG_CARUSEL_COMPOSITE = 0xf7, - TS_DESCRIPTOR_TAG_CONDITIONAL_PLAYBACK = 0xf8, - TS_DESCRIPTOR_TAG_CABLE_TS_DIVISSION = 0xf9, - TS_DESCRIPTOR_TAG_TERRESTRIAL_DELIVERY_SYS = 0xfa, - TS_DESCRIPTOR_TAG_PARTIAL_RECEPTION = 0xfb, - TS_DESCRIPTOR_TAG_EMERGENCY_INFOMATION = 0xfc, - TS_DESCRIPTOR_TAG_DATA_COMPONENT = 0xfd, - TS_DESCRIPTOR_TAG_SYSTEM_MANAGEMENT = 0xfe, -}; - -enum PID_MAP_TYPE { - PID_MAP_TYPE_UNKNOWN = 0x0000, - PID_MAP_TYPE_PAT = 0x0100, - PID_MAP_TYPE_PMT = 0x0200, - PID_MAP_TYPE_NIT = 0x0300, - PID_MAP_TYPE_PCR = 0x0400, - PID_MAP_TYPE_ECM = 0x0500, - PID_MAP_TYPE_EMM = 0x0600, - PID_MAP_TYPE_EIT = 0x0700, - PID_MAP_TYPE_CAT = 0x0800, - PID_MAP_TYPE_OTHER = 0xff00, -}; - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function prottypes (interface method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static void release_arib_std_b25(void *std_b25); -static int set_multi2_round_arib_std_b25(void *std_b25, int32_t round); -static int set_strip_arib_std_b25(void *std_b25, int32_t strip); -static int set_emm_proc_arib_std_b25(void *std_b25, int32_t on); -static int set_b_cas_card_arib_std_b25(void *std_b25, B_CAS_CARD *bcas); -static int reset_arib_std_b25(void *std_b25); -static int flush_arib_std_b25(void *std_b25); -static int put_arib_std_b25(void *std_b25, ARIB_STD_B25_BUFFER *buf); -static int get_arib_std_b25(void *std_b25, ARIB_STD_B25_BUFFER *buf); -static int get_program_count_arib_std_b25(void *std_b25); -static int get_program_info_arib_std_b25(void *std_b25, ARIB_STD_B25_PROGRAM_INFO *info, int idx); - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - global function implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -ARIB_STD_B25 *create_arib_std_b25() -{ - int n; - - ARIB_STD_B25 *r; - ARIB_STD_B25_PRIVATE_DATA *prv; - - n = sizeof(ARIB_STD_B25_PRIVATE_DATA); - n += sizeof(ARIB_STD_B25); - - prv = (ARIB_STD_B25_PRIVATE_DATA *)calloc(1, n); - if(prv == NULL){ - return NULL; - } - - prv->multi2_round = 4; - - r = (ARIB_STD_B25 *)(prv+1); - r->private_data = prv; - - r->release = release_arib_std_b25; - r->set_multi2_round = set_multi2_round_arib_std_b25; - r->set_strip = set_strip_arib_std_b25; - r->set_emm_proc = set_emm_proc_arib_std_b25; - r->set_b_cas_card = set_b_cas_card_arib_std_b25; - r->reset = reset_arib_std_b25; - r->flush = flush_arib_std_b25; - r->put = put_arib_std_b25; - r->get = get_arib_std_b25; - r->get_program_count = get_program_count_arib_std_b25; - r->get_program_info = get_program_info_arib_std_b25; - - return r; -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function prottypes (private method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static ARIB_STD_B25_PRIVATE_DATA *private_data(void *std_b25); -static void teardown(ARIB_STD_B25_PRIVATE_DATA *prv); -static int select_unit_size(ARIB_STD_B25_PRIVATE_DATA *prv); -static int find_pat(ARIB_STD_B25_PRIVATE_DATA *prv); -static int proc_pat(ARIB_STD_B25_PRIVATE_DATA *prv); -static int check_pmt_complete(ARIB_STD_B25_PRIVATE_DATA *prv); -static int find_pmt(ARIB_STD_B25_PRIVATE_DATA *prv); -static int proc_pmt(ARIB_STD_B25_PRIVATE_DATA *prv, TS_PROGRAM *pgrm); -static int32_t find_ca_descriptor_pid(uint8_t *head, uint8_t *tail, int32_t ca_system_id); -static int32_t add_ecm_stream(ARIB_STD_B25_PRIVATE_DATA *prv, TS_STREAM_LIST *list, int32_t ecm_pid); -static int check_ecm_complete(ARIB_STD_B25_PRIVATE_DATA *prv); -static int find_ecm(ARIB_STD_B25_PRIVATE_DATA *prv); -static int proc_ecm(DECRYPTOR_ELEM *dec, B_CAS_CARD *bcas, int32_t multi2_round); -static int proc_arib_std_b25(ARIB_STD_B25_PRIVATE_DATA *prv); - -static int proc_cat(ARIB_STD_B25_PRIVATE_DATA *prv); -static int proc_emm(ARIB_STD_B25_PRIVATE_DATA *prv); - -static void release_program(ARIB_STD_B25_PRIVATE_DATA *prv, TS_PROGRAM *pgrm); - -static void unref_stream(ARIB_STD_B25_PRIVATE_DATA *prv, int32_t pid); - -static DECRYPTOR_ELEM *set_decryptor(ARIB_STD_B25_PRIVATE_DATA *prv, int32_t pid); -static void remove_decryptor(ARIB_STD_B25_PRIVATE_DATA *prv, DECRYPTOR_ELEM *dec); -static DECRYPTOR_ELEM *select_active_decryptor(DECRYPTOR_ELEM *a, DECRYPTOR_ELEM *b, int32_t pid); -static void bind_stream_decryptor(ARIB_STD_B25_PRIVATE_DATA *prv, int32_t pid, DECRYPTOR_ELEM *dec); -static void unlock_all_decryptor(ARIB_STD_B25_PRIVATE_DATA *prv); - -static TS_STREAM_ELEM *get_stream_list_head(TS_STREAM_LIST *list); -static TS_STREAM_ELEM *find_stream_list_elem(TS_STREAM_LIST *list, int32_t pid); -static TS_STREAM_ELEM *create_stream_elem(int32_t pid, int32_t type); -static void put_stream_list_tail(TS_STREAM_LIST *list, TS_STREAM_ELEM *elem); -static void clear_stream_list(TS_STREAM_LIST *list); - -static int reserve_work_buffer(TS_WORK_BUFFER *buf, int32_t size); -static int append_work_buffer(TS_WORK_BUFFER *buf, uint8_t *data, int32_t size); -static void reset_work_buffer(TS_WORK_BUFFER *buf); -static void release_work_buffer(TS_WORK_BUFFER *buf); - -static void extract_ts_header(TS_HEADER *dst, uint8_t *src); -static void extract_emm_fixed_part(EMM_FIXED_PART *dst, uint8_t *src); - -static uint8_t *resync(uint8_t *head, uint8_t *tail, int32_t unit); -static uint8_t *resync_force(uint8_t *head, uint8_t *tail, int32_t unit); - -/* static uint32_t crc32(uint8_t *head, uint8_t *tail); */ - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - interface method implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static void release_arib_std_b25(void *std_b25) -{ - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if(prv == NULL){ - return; - } - - teardown(prv); - free(prv); -} - -static int set_multi2_round_arib_std_b25(void *std_b25, int32_t round) -{ - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if(prv == NULL){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - prv->multi2_round = round; - - return 0; -} - -static int set_strip_arib_std_b25(void *std_b25, int32_t strip) -{ - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if(prv == NULL){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - prv->strip = strip; - - return 0; -} - -static int set_emm_proc_arib_std_b25(void *std_b25, int32_t on) -{ - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if(prv == NULL){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - prv->emm_proc_on = on; - - return 0; -} - -static int set_b_cas_card_arib_std_b25(void *std_b25, B_CAS_CARD *bcas) -{ - int n; - B_CAS_INIT_STATUS is; - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if(prv == NULL){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - prv->bcas = bcas; - if(prv->bcas != NULL){ - n = prv->bcas->get_init_status(bcas, &is); - if(n < 0){ - return ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS; - } - prv->ca_system_id = is.ca_system_id; - n = prv->bcas->get_id(prv->bcas, &(prv->casid)); - if(n < 0){ - return ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS; - } - } - - return 0; -} - -static int reset_arib_std_b25(void *std_b25) -{ - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if(prv == NULL){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - teardown(prv); - - return 0; -} - -static int flush_arib_std_b25(void *std_b25) -{ - int r; - int m,n; - - int32_t crypt; - int32_t unit; - int32_t pid; - - uint8_t *p; - uint8_t *curr; - uint8_t *tail; - - TS_HEADER hdr; - DECRYPTOR_ELEM *dec; - TS_PROGRAM *pgrm; - - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if(prv == NULL){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - if(prv->unit_size < 188){ - r = select_unit_size(prv); - if(r < 0){ - return r; - } - } - - r = proc_arib_std_b25(prv); - if(r < 0){ - return r; - } - - unit = prv->unit_size; - curr = prv->sbuf.head; - tail = prv->sbuf.tail; - - m = prv->dbuf.tail - prv->dbuf.head; - n = tail - curr; - if(!reserve_work_buffer(&(prv->dbuf), m+n)){ - return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - } - - r = 0; - - while( (curr+188) <= tail ){ - - if(curr[0] != 0x47){ - p = resync_force(curr, tail, unit); - if(p == NULL){ - goto LAST; - } - curr = p; - } - - extract_ts_header(&hdr, curr); - crypt = hdr.transport_scrambling_control; - pid = hdr.pid; - - if(hdr.transport_error_indicator != 0){ - /* bit error - append output buffer without parsing */ - if(!append_work_buffer(&(prv->dbuf), curr, 188)){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - goto NEXT; - } - - if( (pid == 0x1fff) && (prv->strip) ){ - goto NEXT; - } - - p = curr+4; - if(hdr.adaptation_field_control & 0x02){ - p += (p[0]+1); - } - n = 188 - (p-curr); - if( (n < 1) && ((n < 0) || (hdr.adaptation_field_control & 0x01)) ){ - /* broken packet */ - curr += 1; - continue; - } - - if( (crypt != 0) && - (hdr.adaptation_field_control & 0x01) ){ - - if(prv->map[pid].type == PID_MAP_TYPE_OTHER){ - dec = (DECRYPTOR_ELEM *)(prv->map[pid].target); - }else if( (prv->map[pid].type == 0) && - (prv->decrypt.count == 1) ){ - dec = prv->decrypt.head; - }else{ - dec = NULL; - } - - if( (dec != NULL) && (dec->m2 != NULL) ){ - m = dec->m2->decrypt(dec->m2, crypt, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_DECRYPT_FAILURE; - goto LAST; - } - curr[3] &= 0x3f; - prv->map[pid].normal_packet += 1; - }else{ - prv->map[pid].undecrypted += 1; - } - }else{ - prv->map[pid].normal_packet += 1; - } - - if(!append_work_buffer(&(prv->dbuf), curr, 188)){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - - if(prv->map[pid].type == PID_MAP_TYPE_ECM){ - dec = (DECRYPTOR_ELEM *)(prv->map[pid].target); - if( (dec == NULL) || (dec->ecm == NULL) ){ - /* this code will never execute */ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - goto LAST; - } - m = dec->ecm->put(dec->ecm, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - goto LAST; - } - m = dec->ecm->get_count(dec->ecm); - if(m < 0){ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_ecm(dec, prv->bcas, prv->multi2_round); - if(r < 0){ - goto LAST; - } - }else if(prv->map[pid].type == PID_MAP_TYPE_PMT){ - pgrm = (TS_PROGRAM *)(prv->map[pid].target); - if( (pgrm == NULL) || (pgrm->pmt == NULL) ){ - /* this code will never execute */ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - goto LAST; - } - m = pgrm->pmt->put(pgrm->pmt, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - goto LAST; - } - m = pgrm->pmt->get_count(pgrm->pmt); - if(m < 0){ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_pmt(prv, pgrm); - if(r < 0){ - goto LAST; - } - }else if(prv->map[pid].type == PID_MAP_TYPE_EMM){ - if( prv->emm_proc_on == 0){ - goto NEXT; - } - if( prv->emm == NULL ){ - prv->emm = create_ts_section_parser(); - if(prv->emm == NULL){ - r = ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE; - goto LAST; - } - } - m = prv->emm->put(prv->emm, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE; - goto LAST; - } - m = prv->emm->get_count(prv->emm); - if(m < 0){ - r = ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_emm(prv); - if(r < 0){ - goto LAST; - } - }else if(pid == 0x0001){ - if( prv->cat == NULL ){ - prv->cat = create_ts_section_parser(); - if(prv->cat == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - } - m = prv->cat->put(prv->cat, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE; - goto LAST; - } - m = prv->cat->get_count(prv->cat); - if(m < 0){ - r = ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_cat(prv); - if(r < 0){ - goto LAST; - } - }else if(pid == 0x0000){ - if( prv->pat == NULL ){ - prv->pat = create_ts_section_parser(); - if(prv->pat == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - } - m = prv->pat->put(prv->pat, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE; - goto LAST; - } - m = prv->pat->get_count(prv->pat); - if(m < 0){ - r = ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_pat(prv); - if(r < 0){ - goto LAST; - } - } - - NEXT: - curr += unit; - } - -LAST: - - m = curr - prv->sbuf.head; - n = tail - curr; - if( (n < 1024) || (m > (prv->sbuf.max/2) ) ){ - p = prv->sbuf.pool; - memcpy(p, curr, n); - prv->sbuf.head = p; - prv->sbuf.tail = p+n; - }else{ - prv->sbuf.head = curr; - } - - return r; -} - -static int put_arib_std_b25(void *std_b25, ARIB_STD_B25_BUFFER *buf) -{ - int32_t n; - - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if( (prv == NULL) || (buf == NULL) ){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - if(!append_work_buffer(&(prv->sbuf), buf->data, buf->size)){ - return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - } - - if(prv->unit_size < 188){ - n = select_unit_size(prv); - if(n < 0){ - return n; - } - if(prv->unit_size < 188){ - /* need more data */ - return 0; - } - } - - if(prv->p_count < 1){ - n = find_pat(prv); - if(n < 0){ - return n; - } - if(prv->p_count < 1){ - if(prv->sbuf_offset < (16*1024*1024)){ - /* need more data */ - return 0; - }else{ - /* exceed sbuf limit */ - return ARIB_STD_B25_ERROR_NO_PAT_IN_HEAD_16M; - } - } - prv->sbuf_offset = 0; - } - - if(!check_pmt_complete(prv)){ - n = find_pmt(prv); - if(n < 0){ - return n; - } - if(!check_pmt_complete(prv)){ - if(prv->sbuf_offset < (32*1024*1024)){ - /* need more data */ - return 0; - }else{ - /* exceed sbuf limit */ - return ARIB_STD_B25_ERROR_NO_PMT_IN_HEAD_32M; - } - } - prv->sbuf_offset = 0; - } - - if(!check_ecm_complete(prv)){ - n = find_ecm(prv); - if(n < 0){ - return n; - } - if(!check_ecm_complete(prv)){ - if(prv->sbuf_offset < (32*1024*1024)){ - /* need more data */ - return 0; - }else{ - /* exceed sbuf limit */ - return ARIB_STD_B25_ERROR_NO_ECM_IN_HEAD_32M; - } - } - prv->sbuf_offset = 0; - } - - return proc_arib_std_b25(prv); -} - -static int get_arib_std_b25(void *std_b25, ARIB_STD_B25_BUFFER *buf) -{ - ARIB_STD_B25_PRIVATE_DATA *prv; - prv = private_data(std_b25); - if( (prv == NULL) || (buf == NULL) ){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - buf->data = prv->dbuf.head; - buf->size = prv->dbuf.tail - prv->dbuf.head; - - reset_work_buffer(&(prv->dbuf)); - - return 0; -} - -static int get_program_count_arib_std_b25(void *std_b25) -{ - ARIB_STD_B25_PRIVATE_DATA *prv; - - prv = private_data(std_b25); - if(prv == NULL){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - return prv->p_count; -} - -static int get_program_info_arib_std_b25(void *std_b25, ARIB_STD_B25_PROGRAM_INFO *info, int idx) -{ - ARIB_STD_B25_PRIVATE_DATA *prv; - - TS_PROGRAM *pgrm; - - TS_STREAM_ELEM *strm; - DECRYPTOR_ELEM *dec; - - int32_t pid; - - prv = private_data(std_b25); - if( (prv == NULL) || (info == NULL) || (idx < 0) || (idx >= prv->p_count) ){ - return ARIB_STD_B25_ERROR_INVALID_PARAM; - } - - pgrm = prv->program + idx; - - memset(info, 0, sizeof(ARIB_STD_B25_PROGRAM_INFO)); - - info->program_number = pgrm->program_number; - - pid = pgrm->pmt_pid; - info->total_packet_count += prv->map[pid].normal_packet; - info->total_packet_count += prv->map[pid].undecrypted; - info->undecrypted_packet_count += prv->map[pid].undecrypted; - - pid = pgrm->pcr_pid; - if( (pid != 0) && (pid != 0x1fff) ){ - info->total_packet_count += prv->map[pid].normal_packet; - info->total_packet_count += prv->map[pid].undecrypted; - info->undecrypted_packet_count += prv->map[pid].undecrypted; - } - - strm = pgrm->streams.head; - while(strm != NULL){ - pid = strm->pid; - if(prv->map[pid].type == PID_MAP_TYPE_ECM){ - dec = (DECRYPTOR_ELEM *)(prv->map[pid].target); - info->ecm_unpurchased_count += dec->unpurchased; - info->last_ecm_error_code = dec->last_error; - } - info->total_packet_count += prv->map[pid].normal_packet; - info->total_packet_count += prv->map[pid].undecrypted; - info->undecrypted_packet_count += prv->map[pid].undecrypted; - strm = (TS_STREAM_ELEM *)(strm->next); - } - - return 0; -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - private method implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static ARIB_STD_B25_PRIVATE_DATA *private_data(void *std_b25) -{ - ARIB_STD_B25 *p; - ARIB_STD_B25_PRIVATE_DATA *r; - - p = (ARIB_STD_B25 *)std_b25; - if(p == NULL){ - return NULL; - } - - r = (ARIB_STD_B25_PRIVATE_DATA *)p->private_data; - if( ((void *)(r+1)) != ((void *)p) ){ - return NULL; - } - - return r; -} - -static void teardown(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int i; - - prv->unit_size = 0; - prv->sbuf_offset = 0; - - if(prv->pat != NULL){ - prv->pat->release(prv->pat); - prv->pat = NULL; - } - if(prv->cat != NULL){ - prv->cat->release(prv->cat); - prv->cat = NULL; - } - - if(prv->program != NULL){ - for(i=0;i<prv->p_count;i++){ - release_program(prv, prv->program+i); - } - free(prv->program); - prv->program = NULL; - } - prv->p_count = 0; - - clear_stream_list(&(prv->strm_pool)); - - while(prv->decrypt.head != NULL){ - remove_decryptor(prv, prv->decrypt.head); - } - - memset(prv->map, 0, sizeof(prv->map)); - - prv->emm_pid = 0; - if(prv->emm != NULL){ - prv->emm->release(prv->emm); - prv->emm = NULL; - } - - release_work_buffer(&(prv->sbuf)); - release_work_buffer(&(prv->dbuf)); -} - -static int select_unit_size(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int i; - int m,n,w; - int count[320-188]; - - unsigned char *head; - unsigned char *buf; - unsigned char *tail; - - head = prv->sbuf.head; - tail = prv->sbuf.tail; - - buf = head; - memset(count, 0, sizeof(count)); - - // 1st step, count up 0x47 interval - while( (buf+188) < tail ){ - if(buf[0] != 0x47){ - buf += 1; - continue; - } - m = 320; - if( buf+m > tail ){ - m = tail-buf; - } - for(i=188;i<m;i++){ - if(buf[i] == 0x47){ - count[i-188] += 1; - } - } - buf += 1; - } - - // 2nd step, select maximum appeared interval - m = 0; - n = 0; - for(i=188;i<320;i++){ - if(m < count[i-188]){ - m = count[i-188]; - n = i; - } - } - - // 3rd step, verify unit_size - w = m*n; - if( (m < 8) || ((w+3*n) < (tail-head)) ){ - return ARIB_STD_B25_ERROR_NON_TS_INPUT_STREAM; - } - - prv->unit_size = n; - - return 0; -} - -static int find_pat(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int r; - int n,size; - - int32_t unit; - - uint8_t *p; - uint8_t *curr; - uint8_t *tail; - - TS_HEADER hdr; - - r = 0; - unit = prv->unit_size; - curr = prv->sbuf.head + prv->sbuf_offset; - tail = prv->sbuf.tail; - - while( (curr+unit) < tail ){ - if( (curr[0] != 0x47) || (curr[unit] != 0x47) ){ - p = resync(curr, tail, unit); - if(p == NULL){ - goto LAST; - } - curr = p; - } - extract_ts_header(&hdr, curr); - if(hdr.pid == 0x0000){ - - p = curr+4; - if(hdr.adaptation_field_control & 0x02){ - p += (p[0]+1); - } - size = 188 - (p-curr); - if(size < 1){ - goto NEXT; - } - - if(prv->pat == NULL){ - prv->pat = create_ts_section_parser(); - if(prv->pat == NULL){ - return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - } - } - - n = prv->pat->put(prv->pat, &hdr, p, size); - if(n < 0){ - r = ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE; - curr += unit; - goto LAST; - } - n = prv->pat->get_count(prv->pat); - if(n < 0){ - r = ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE; - curr += unit; - goto LAST; - } - if(n > 0){ - curr += unit; - goto LAST; - } - } - NEXT: - curr += unit; - } - -LAST: - prv->sbuf_offset = curr - prv->sbuf.head; - - if( (prv->pat != NULL) && (prv->pat->get_count(prv->pat) > 0) ){ - r = proc_pat(prv); - } - - return r; -} - -static int proc_pat(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int r; - int i,n; - int len; - int count; - - int32_t program_number; - int32_t pid; - - uint8_t *head; - uint8_t *tail; - - TS_PROGRAM *work; - TS_SECTION sect; - - r = 0; - memset(§, 0, sizeof(sect)); - - n = prv->pat->get(prv->pat, §); - if(n < 0){ - r = ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE; - goto LAST; - } - - if(sect.hdr.table_id != TS_SECTION_ID_PROGRAM_ASSOCIATION){ - r = ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH; - goto LAST; - } - - len = (sect.tail - sect.data) - 4; - - count = len / 4; - work = (TS_PROGRAM *)calloc(count, sizeof(TS_PROGRAM)); - if(work == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - - if(prv->program != NULL){ - for(i=0;i<prv->p_count;i++){ - release_program(prv, prv->program+i); - } - free(prv->program); - prv->program = NULL; - } - prv->p_count = 0; - memset(&(prv->map), 0, sizeof(prv->map)); - - head = sect.data; - tail = sect.tail-4; - - i = 0; - while( (head+4) <= tail ){ - program_number = ((head[0] << 8) | head[1]); - pid = ((head[2] << 8) | head[3]) & 0x1fff; - if(program_number != 0){ - work[i].program_number = program_number; - work[i].pmt_pid = pid; - work[i].pmt = create_ts_section_parser(); - if(work[i].pmt == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - break; - } - prv->map[pid].type = PID_MAP_TYPE_PMT; - prv->map[pid].target = work+i; - i += 1; - } - head += 4; - } - - prv->program = work; - prv->p_count = i; - - prv->map[0x0000].ref = 1; - prv->map[0x0000].type = PID_MAP_TYPE_PAT; - prv->map[0x0000].target = NULL; - -LAST: - if(sect.raw != NULL){ - n = prv->pat->ret(prv->pat, §); - if( (n < 0) && (r == 0) ){ - r = ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE; - } - } - - return r; -} - -static int check_pmt_complete(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int i,n; - int num[3]; - - memset(num, 0, sizeof(num)); - - for(i=0;i<prv->p_count;i++){ - n = prv->program[i].phase; - if(n < 0){ - n = 0; - }else if(n > 2){ - n = 2; - } - num[n] += 1; - } - - if(num[2] > 0){ - return 1; - } - - if(num[0] > 0){ - return 0; - } - - return 1; -} - -static int find_pmt(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int r; - int n,size; - - int32_t unit; - - uint8_t *p; - uint8_t *curr; - uint8_t *tail; - - TS_HEADER hdr; - TS_PROGRAM *pgrm; - - r = 0; - unit = prv->unit_size; - curr = prv->sbuf.head + prv->sbuf_offset; - tail = prv->sbuf.tail; - - while( (curr+unit) < tail ){ - - if( (curr[0] != 0x47) || (curr[unit] != 0x47) ){ - p = resync(curr, tail, unit); - if(p == NULL){ - goto LAST; - } - curr = p; - } - - extract_ts_header(&hdr, curr); - - if(prv->map[hdr.pid].type != PID_MAP_TYPE_PMT){ - goto NEXT; - } - pgrm = (TS_PROGRAM *)(prv->map[hdr.pid].target); - if(pgrm == NULL){ - goto NEXT; - } - - if(pgrm->phase == 0){ - - p = curr + 4; - if(hdr.adaptation_field_control & 0x02){ - p += (p[0]+1); - } - size = 188 - (p-curr); - if(size < 1){ - goto NEXT; - } - - if(pgrm->pmt == NULL){ - /* this code will never execute */ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - curr += unit; - goto LAST; - } - - n = pgrm->pmt->put(pgrm->pmt, &hdr, p, size); - if(n < 0){ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - curr += unit; - goto LAST; - } - n = pgrm->pmt->get_count(pgrm->pmt); - if(n < 0){ - r =ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - curr += unit; - goto LAST; - } - if(n == 0){ - goto NEXT; - } - r = proc_pmt(prv, pgrm); - if(r < 0){ - curr += unit; - goto LAST; - } - if(r > 0){ - /* broken or unexpected section data */ - goto NEXT; - } - pgrm->phase = 1; - if(check_pmt_complete(prv)){ - curr += unit; - goto LAST; - } - }else{ - pgrm->phase = 2; - curr += unit; - goto LAST; - } - - NEXT: - curr += unit; - } - -LAST: - prv->sbuf_offset = curr - prv->sbuf.head; - - return r; -} - -static int proc_pmt(ARIB_STD_B25_PRIVATE_DATA *prv, TS_PROGRAM *pgrm) -{ - int r; - - int n; - int length; - - uint8_t *head; - uint8_t *tail; - - int32_t ecm_pid; - int32_t pid; - int32_t type; - - TS_SECTION sect; - - DECRYPTOR_ELEM *dec[2]; - DECRYPTOR_ELEM *dw; - - TS_STREAM_ELEM *strm; - - r = 0; - dec[0] = NULL; - memset(§, 0, sizeof(sect)); - - n = pgrm->pmt->get(pgrm->pmt, §); - if(n < 0){ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - goto LAST; - } - if(sect.hdr.table_id != TS_SECTION_ID_PROGRAM_MAP){ - r = ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH; - goto LAST; - } - - head = sect.data; - tail = sect.tail-4; - - pgrm->pcr_pid = ((head[0] << 8) | head[1]) & 0x1fff; - length = ((head[2] << 8) | head[3]) & 0x0fff; - head += 4; - if(head+length > tail){ - r = ARIB_STD_B25_WARN_BROKEN_TS_SECTION; - goto LAST; - } - - /* find major ecm_pid and regist decryptor */ - ecm_pid = find_ca_descriptor_pid(head, head+length, prv->ca_system_id); - if( (ecm_pid != 0) && (ecm_pid != 0x1fff) ){ - dec[0] = set_decryptor(prv, ecm_pid); - if(dec[0] == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - dec[0]->ref += 1; - } - head += length; - - /* unref old stream entries */ - while( (strm = get_stream_list_head(&(pgrm->old_strm))) != NULL ){ - unref_stream(prv, strm->pid); - memset(strm, 0, sizeof(TS_STREAM_ELEM)); - put_stream_list_tail(&(prv->strm_pool), strm); - } - - /* save current streams */ - memcpy(&(pgrm->old_strm), &(pgrm->streams), sizeof(TS_STREAM_LIST)); - memset(&(pgrm->streams), 0, sizeof(TS_STREAM_LIST)); - - /* add current stream entries */ - if( (ecm_pid != 0) && (ecm_pid != 0x1fff) ){ - if(!add_ecm_stream(prv, &(pgrm->streams), ecm_pid)){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - } - - while( head+4 < tail ){ - - type = head[0]; - pid = ((head[1] << 8) | head[2]) & 0x1fff; - length = ((head[3] << 8) | head[4]) & 0x0fff; - head += 5; - ecm_pid = find_ca_descriptor_pid(head, head+length, prv->ca_system_id); - head += length; - - if( (ecm_pid != 0) && (ecm_pid != 0x1fff) ){ - dec[1] = set_decryptor(prv, ecm_pid); - if(dec[1] == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - if(!add_ecm_stream(prv, &(pgrm->streams), ecm_pid)){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - }else{ - dec[1] = NULL; - } - - strm = get_stream_list_head(&(prv->strm_pool)); - if( strm == NULL ){ - strm = create_stream_elem(pid, type); - if(strm == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - }else{ - strm->pid = pid; - strm->type = type; - } - - prv->map[pid].type = PID_MAP_TYPE_OTHER; - prv->map[pid].ref += 1; - - dw = select_active_decryptor(dec[0], dec[1], ecm_pid); - bind_stream_decryptor(prv, pid, dw); - - put_stream_list_tail(&(pgrm->streams), strm); - } - -LAST: - if( dec[0] != NULL ){ - dec[0]->ref -= 1; - if( dec[0]->ref < 1 ){ - remove_decryptor(prv, dec[0]); - dec[0] = NULL; - } - } - - if(sect.raw != NULL){ - n = pgrm->pmt->ret(pgrm->pmt, §); - if( (n < 0) && (r == 0) ){ - return ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - } - } - - return 0; -} - -static int32_t find_ca_descriptor_pid(uint8_t *head, uint8_t *tail, int32_t ca_system_id) -{ - uint32_t ca_pid; - uint32_t ca_sys_id; - - uint32_t tag; - uint32_t len; - - while(head+1 < tail){ - tag = head[0]; - len = head[1]; - head += 2; - if( (tag == 0x09) && /* CA_descriptor */ - (len >= 4) && - (head+len <= tail) ){ - ca_sys_id = ((head[0] << 8) | head[1]); - ca_pid = ((head[2] << 8) | head[3]) & 0x1fff; - if(ca_sys_id == ca_system_id){ - return ca_pid; - } - } - head += len; - } - - return 0; -} - -static int add_ecm_stream(ARIB_STD_B25_PRIVATE_DATA *prv, TS_STREAM_LIST *list, int32_t ecm_pid) -{ - TS_STREAM_ELEM *strm; - - strm = find_stream_list_elem(list, ecm_pid); - if(strm != NULL){ - // ECM is already registered - return 1; - } - - strm = get_stream_list_head(&(prv->strm_pool)); - if(strm == NULL){ - strm = create_stream_elem(ecm_pid, PID_MAP_TYPE_ECM); - if(strm == NULL){ - return 0; - } - }else{ - strm->pid = ecm_pid; - strm->type = PID_MAP_TYPE_ECM; - } - - put_stream_list_tail(list, strm); - prv->map[ecm_pid].ref += 1; - - return 1; -} - -static int check_ecm_complete(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int n,num[3]; - DECRYPTOR_ELEM *e; - - memset(num, 0, sizeof(num)); - - e = prv->decrypt.head; - while( e != NULL ){ - n = e->phase; - if(n < 0){ - n = 0; - }else if(n > 2){ - n = 2; - } - num[n] += 1; - e = (DECRYPTOR_ELEM *)(e->next); - } - - if(num[2] > 0){ - return 1; - } - - if(num[0] > 0){ - return 0; - } - - return 1; -} - -static int find_ecm(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int r; - int n,size; - - int32_t unit; - - uint8_t *p; - uint8_t *curr; - uint8_t *tail; - - TS_HEADER hdr; - DECRYPTOR_ELEM *dec; - - r = 0; - unit = prv->unit_size; - curr = prv->sbuf.head + prv->sbuf_offset; - tail = prv->sbuf.tail; - - while( (curr+unit) < tail ){ - if( (curr[0] != 0x47) || (curr[unit] != 0x47) ){ - p = resync(curr, tail, unit); - if(p == NULL){ - goto LAST; - } - curr = p; - } - extract_ts_header(&hdr, curr); - if(prv->map[hdr.pid].type != PID_MAP_TYPE_ECM){ - goto NEXT; - } - dec = (DECRYPTOR_ELEM *)(prv->map[hdr.pid].target); - if(dec == NULL){ - goto NEXT; - } - - if(dec->phase == 0){ - - p = curr + 4; - if(hdr.adaptation_field_control & 0x02){ - p += (p[0]+1); - } - size = 188 - (p-curr); - if(size < 1){ - goto NEXT; - } - - if(dec->ecm == NULL){ - /* this code will never execute */ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - curr += unit; - goto LAST; - } - - n = dec->ecm->put(dec->ecm, &hdr, p, size); - if(n < 0){ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - curr += unit; - goto LAST; - } - n = dec->ecm->get_count(dec->ecm); - if(n < 0){ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - curr += unit; - goto LAST; - } - if(n == 0){ - goto NEXT; - } - - r = proc_ecm(dec, prv->bcas, prv->multi2_round); - if(r < 0){ - curr += unit; - goto LAST; - } - if( (r > 0) && (r != ARIB_STD_B25_WARN_UNPURCHASED_ECM) ){ - /* broken or unexpected section data */ - goto NEXT; - } - - dec->phase = 1; - if(check_ecm_complete(prv)){ - curr += unit; - goto LAST; - } - - }else{ - dec->phase = 2; - curr += unit; - goto LAST; - } - - NEXT: - curr += unit; - } - -LAST: - prv->sbuf_offset = curr - prv->sbuf.head; - - return r; -} - -static int proc_ecm(DECRYPTOR_ELEM *dec, B_CAS_CARD *bcas, int32_t multi2_round) -{ - int r,n; - int length; - - uint8_t *p; - - B_CAS_INIT_STATUS is; - B_CAS_ECM_RESULT res; - - TS_SECTION sect; - - r = 0; - memset(§, 0, sizeof(sect)); - - if(bcas == NULL){ - r = ARIB_STD_B25_ERROR_EMPTY_B_CAS_CARD; - goto LAST; - } - - n = dec->ecm->get(dec->ecm, §); - if(n < 0){ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - goto LAST; - } - if(sect.hdr.table_id != TS_SECTION_ID_ECM_S){ - r = ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH; - goto LAST; - } - - if(dec->locked){ - /* previous ECM has returned unpurchased - skip this pid for B-CAS card load reduction */ - dec->unpurchased += 1; - r = ARIB_STD_B25_WARN_UNPURCHASED_ECM; - goto LAST; - } - - length = (sect.tail - sect.data) - 4; - p = sect.data; - - r = bcas->proc_ecm(bcas, &res, p, length); - if(r < 0){ - if(dec->m2 != NULL){ - dec->m2->clear_scramble_key(dec->m2); - } - r = ARIB_STD_B25_ERROR_ECM_PROC_FAILURE; - goto LAST; - } - - if( (res.return_code != 0x0800) && - (res.return_code != 0x0400) && - (res.return_code != 0x0200) ){ - /* return_code is not equal "purchased" */ - if(dec->m2 != NULL){ - dec->m2->release(dec->m2); - dec->m2 = NULL; - } - dec->unpurchased += 1; - dec->last_error = res.return_code; - dec->locked += 1; - r = ARIB_STD_B25_WARN_UNPURCHASED_ECM; - goto LAST; - } - - if(dec->m2 == NULL){ - dec->m2 = create_multi2(); - if(dec->m2 == NULL){ - return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - } - r = bcas->get_init_status(bcas, &is); - if(r < 0){ - return ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS; - } - dec->m2->set_system_key(dec->m2, is.system_key); - dec->m2->set_init_cbc(dec->m2, is.init_cbc); - dec->m2->set_round(dec->m2, multi2_round); - } - - dec->m2->set_scramble_key(dec->m2, res.scramble_key); - -LAST: - if(sect.raw != NULL){ - n = dec->ecm->ret(dec->ecm, §); - if( (n < 0) && (r == 0) ){ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - } - } - - return r; -} - -static int proc_arib_std_b25(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int r; - int m,n; - - int32_t crypt; - int32_t unit; - int32_t pid; - - uint8_t *p; - uint8_t *curr; - uint8_t *tail; - - TS_HEADER hdr; - DECRYPTOR_ELEM *dec; - TS_PROGRAM *pgrm; - - unit = prv->unit_size; - curr = prv->sbuf.head; - tail = prv->sbuf.tail; - - m = prv->dbuf.tail - prv->dbuf.head; - n = tail - curr; - if(!reserve_work_buffer(&(prv->dbuf), m+n)){ - return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - } - - r = 0; - - while( (curr+unit) < tail ){ - - if( (curr[0] != 0x47) || (curr[unit] != 0x47) ){ - p = resync(curr, tail, unit); - if(p == NULL){ - goto LAST; - } - curr = p; - } - - extract_ts_header(&hdr, curr); - crypt = hdr.transport_scrambling_control; - pid = hdr.pid; - - if(hdr.transport_error_indicator != 0){ - /* bit error - append output buffer without parsing */ - if(!append_work_buffer(&(prv->dbuf), curr, 188)){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - goto NEXT; - } - - if( (pid == 0x1fff) && (prv->strip) ){ - /* strip null(padding) stream */ - goto NEXT; - } - - p = curr+4; - if(hdr.adaptation_field_control & 0x02){ - p += (p[0]+1); - } - n = 188 - (p-curr); - if( (n < 1) && ((n < 0) || (hdr.adaptation_field_control & 0x01)) ){ - /* broken packet */ - curr += 1; - continue; - } - - if( (crypt != 0) && - (hdr.adaptation_field_control & 0x01) ){ - - if(prv->map[pid].type == PID_MAP_TYPE_OTHER){ - dec = (DECRYPTOR_ELEM *)(prv->map[pid].target); - }else if( (prv->map[pid].type == 0) && - (prv->decrypt.count == 1) ){ - dec = prv->decrypt.head; - }else{ - dec = NULL; - } - - if( (dec != NULL) && (dec->m2 != NULL) ){ - m = dec->m2->decrypt(dec->m2, crypt, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_DECRYPT_FAILURE; - goto LAST; - } - curr[3] &= 0x3f; - prv->map[pid].normal_packet += 1; - }else{ - prv->map[pid].undecrypted += 1; - } - }else{ - prv->map[pid].normal_packet += 1; - } - - if(!append_work_buffer(&(prv->dbuf), curr, 188)){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - - if(prv->map[pid].type == PID_MAP_TYPE_ECM){ - dec = (DECRYPTOR_ELEM *)(prv->map[pid].target); - if( (dec == NULL) || (dec->ecm == NULL) ){ - /* this code will never execute */ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - goto LAST; - } - m = dec->ecm->put(dec->ecm, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - goto LAST; - } - m = dec->ecm->get_count(dec->ecm); - if(m < 0){ - r = ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_ecm(dec, prv->bcas, prv->multi2_round); - if(r < 0){ - goto LAST; - } - }else if(prv->map[pid].type == PID_MAP_TYPE_PMT){ - pgrm = (TS_PROGRAM *)(prv->map[pid].target); - if( (pgrm == NULL) || (pgrm->pmt == NULL) ){ - /* this code will never execute */ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - goto LAST; - } - m = pgrm->pmt->put(pgrm->pmt, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - goto LAST; - } - m = pgrm->pmt->get_count(pgrm->pmt); - if(m < 0){ - r = ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_pmt(prv, pgrm); - if(r < 0){ - goto LAST; - } - }else if(prv->map[pid].type == PID_MAP_TYPE_EMM){ - if( prv->emm_proc_on == 0){ - goto NEXT; - } - if( prv->emm == NULL ){ - prv->emm = create_ts_section_parser(); - if(prv->emm == NULL){ - r = ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE; - goto LAST; - } - } - m = prv->emm->put(prv->emm, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE; - goto LAST; - } - m = prv->emm->get_count(prv->emm); - if(m < 0){ - r = ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_emm(prv); - if(r < 0){ - goto LAST; - } - }else if(pid == 0x0001){ - if( prv->cat == NULL ){ - prv->cat = create_ts_section_parser(); - if(prv->cat == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - } - m = prv->cat->put(prv->cat, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE; - goto LAST; - } - m = prv->cat->get_count(prv->cat); - if(m < 0){ - r = ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_cat(prv); - if(r < 0){ - goto LAST; - } - }else if(pid == 0x0000){ - if( prv->pat == NULL ){ - prv->pat = create_ts_section_parser(); - if(prv->pat == NULL){ - r = ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY; - goto LAST; - } - } - m = prv->pat->put(prv->pat, &hdr, p, n); - if(m < 0){ - r = ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE; - goto LAST; - } - m = prv->pat->get_count(prv->pat); - if(m < 0){ - r = ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE; - goto LAST; - } - if(m == 0){ - goto NEXT; - } - r = proc_pat(prv); - goto LAST; - } - - NEXT: - curr += unit; - } - -LAST: - m = curr - prv->sbuf.head; - n = tail - curr; - if( (n < 1024) || (m > (prv->sbuf.max/2) ) ){ - p = prv->sbuf.pool; - memcpy(p, curr, n); - prv->sbuf.head = p; - prv->sbuf.tail = p+n; - }else{ - prv->sbuf.head = curr; - } - - return r; -} - -static int proc_cat(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int r; - int n; - int emm_pid; - - TS_SECTION sect; - - r = 0; - memset(§, 0, sizeof(sect)); - - n = prv->cat->get(prv->cat, §); - if(n < 0){ - r = ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE; - goto LAST; - } - - if(sect.hdr.table_id != TS_SECTION_ID_CONDITIONAL_ACCESS){ - r = ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH; - goto LAST; - } - - emm_pid = find_ca_descriptor_pid(sect.data, sect.tail-4, prv->ca_system_id); - if( (emm_pid != 0x0000) && (emm_pid != 0x1fff) ){ - if( (prv->map[emm_pid].target != NULL) && - (prv->map[emm_pid].type == PID_MAP_TYPE_OTHER) ){ - DECRYPTOR_ELEM *dec; - dec = (DECRYPTOR_ELEM *)(prv->map[emm_pid].target); - dec->ref -= 1; - if(dec->ref < 1){ - remove_decryptor(prv, dec); - } - } - prv->emm_pid = emm_pid; - prv->map[emm_pid].ref = 1; - prv->map[emm_pid].type = PID_MAP_TYPE_EMM; - prv->map[emm_pid].target = NULL; - } - - prv->map[0x0001].ref = 1; - prv->map[0x0001].type = PID_MAP_TYPE_CAT; - prv->map[0x0001].target = NULL; - -LAST: - - if(sect.raw != NULL){ - n = prv->cat->ret(prv->cat, §); - if( (n < 0) && (r == 0) ){ - r = ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE; - } - } - - return r; -} - -static int proc_emm(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - int r; - int i,j,n; - - int len; - - uint8_t *head; - uint8_t *tail; - - TS_SECTION sect; - EMM_FIXED_PART emm_hdr; - - r = 0; - memset(§, 0, sizeof(sect)); - - if(prv->bcas == NULL){ - r = ARIB_STD_B25_ERROR_EMPTY_B_CAS_CARD; - goto LAST; - } - - while( (n = prv->emm->get_count(prv->emm)) > 0 ){ - - n = prv->emm->get(prv->emm, §); - if(n < 0){ - r = ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE; - goto LAST; - } - - if(sect.hdr.table_id == TS_SECTION_ID_EMM_MESSAGE){ - /* EMM_MESSAGE is not supported */ - goto NEXT; - }else if(sect.hdr.table_id != TS_SECTION_ID_EMM_S){ - r = ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH; - goto LAST; - } - - head = sect.data; - tail = sect.tail - 4; - - i = 0; - while( (head+13) <= tail ){ - - extract_emm_fixed_part(&emm_hdr, head); - len = emm_hdr.associated_information_length+7; - if( (head+len) > tail ){ - /* broken EMM element */ - goto NEXT; - } - - for(j=0;j<prv->casid.count;j++){ - if(prv->casid.data[j] == emm_hdr.card_id){ - n = prv->bcas->proc_emm(prv->bcas, head, len); - if(n < 0){ - r = ARIB_STD_B25_ERROR_EMM_PROC_FAILURE; - goto LAST; - } - unlock_all_decryptor(prv); - } - } - - head += len; - } - - NEXT: - if(sect.raw != NULL){ - n = prv->emm->ret(prv->emm, §); - if( (n < 0) && (r == 0) ){ - r = ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE; - goto LAST; - } - memset(§, 0, sizeof(sect)); - } - } - -LAST: - if(sect.raw != NULL){ - n = prv->emm->ret(prv->emm, §); - if( (n < 0) && (r == 0) ){ - r = ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE; - } - } - - return r; -} - -static void release_program(ARIB_STD_B25_PRIVATE_DATA *prv, TS_PROGRAM *pgrm) -{ - int32_t pid; - TS_STREAM_ELEM *strm; - - pid = pgrm->pmt_pid; - - if(pgrm->pmt != NULL){ - pgrm->pmt->release(pgrm->pmt); - pgrm->pmt = NULL; - } - - while( (strm = get_stream_list_head(&(pgrm->old_strm))) != NULL ){ - unref_stream(prv, strm->pid); - memset(strm, 0, sizeof(TS_STREAM_ELEM)); - put_stream_list_tail(&(prv->strm_pool), strm); - } - - while( (strm = get_stream_list_head(&(pgrm->streams))) != NULL ){ - unref_stream(prv, strm->pid); - memset(strm, 0, sizeof(TS_STREAM_ELEM)); - put_stream_list_tail(&(prv->strm_pool), strm); - } - - prv->map[pid].type = PID_MAP_TYPE_UNKNOWN; - prv->map[pid].ref = 0; - prv->map[pid].target = NULL; -} - -static void unref_stream(ARIB_STD_B25_PRIVATE_DATA *prv, int32_t pid) -{ - DECRYPTOR_ELEM *dec; - - prv->map[pid].ref -= 1; - if( prv->map[pid].ref < 1 ){ - if( (prv->map[pid].target != NULL) && - (prv->map[pid].type == PID_MAP_TYPE_OTHER) ){ - dec = (DECRYPTOR_ELEM *)(prv->map[pid].target); - dec->ref -= 1; - if(dec->ref < 1){ - remove_decryptor(prv, dec); - } - } - prv->map[pid].type = PID_MAP_TYPE_UNKNOWN; - prv->map[pid].ref = 0; - prv->map[pid].target = NULL; - } -} - -static DECRYPTOR_ELEM *set_decryptor(ARIB_STD_B25_PRIVATE_DATA *prv, int32_t pid) -{ - DECRYPTOR_ELEM *r; - - r = NULL; - if(prv->map[pid].type == PID_MAP_TYPE_ECM){ - r = (DECRYPTOR_ELEM *)(prv->map[pid].target); - if(r != NULL){ - return r; - } - } - r = (DECRYPTOR_ELEM *)calloc(1, sizeof(DECRYPTOR_ELEM)); - if(r == NULL){ - return NULL; - } - r->ecm_pid = pid; - r->ecm = create_ts_section_parser(); - if(r->ecm == NULL){ - free(r); - return NULL; - } - - if(prv->decrypt.tail != NULL){ - r->prev = prv->decrypt.tail; - r->next = NULL; - prv->decrypt.tail->next = r; - prv->decrypt.tail = r; - prv->decrypt.count += 1; - }else{ - r->prev = NULL; - r->next = NULL; - prv->decrypt.head = r; - prv->decrypt.tail = r; - prv->decrypt.count = 1; - } - - if( (prv->map[pid].type == PID_MAP_TYPE_OTHER) && - (prv->map[pid].target != NULL) ){ - DECRYPTOR_ELEM *dec; - dec = (DECRYPTOR_ELEM *)(prv->map[pid].target); - dec->ref -= 1; - if(dec->ref < 1){ - remove_decryptor(prv, dec); - } - } - - prv->map[pid].type = PID_MAP_TYPE_ECM; - prv->map[pid].target = r; - - return r; -} - -static void remove_decryptor(ARIB_STD_B25_PRIVATE_DATA *prv, DECRYPTOR_ELEM *dec) -{ - int32_t pid; - - DECRYPTOR_ELEM *prev; - DECRYPTOR_ELEM *next; - - pid = dec->ecm_pid; - if( (prv->map[pid].type == PID_MAP_TYPE_ECM) && - (prv->map[pid].target == ((void *)dec)) ){ - prv->map[pid].type = PID_MAP_TYPE_UNKNOWN; - prv->map[pid].target = NULL; - } - - prev = (DECRYPTOR_ELEM *)(dec->prev); - next = (DECRYPTOR_ELEM *)(dec->next); - if(prev != NULL){ - prev->next = next; - }else{ - prv->decrypt.head = next; - } - if(next != NULL){ - next->prev = prev; - }else{ - prv->decrypt.tail = prev; - } - prv->decrypt.count -= 1; - - if(dec->ecm != NULL){ - dec->ecm->release(dec->ecm); - dec->ecm = NULL; - } - - if(dec->m2 != NULL){ - dec->m2->release(dec->m2); - dec->m2 = NULL; - } - - free(dec); -} - -static DECRYPTOR_ELEM *select_active_decryptor(DECRYPTOR_ELEM *a, DECRYPTOR_ELEM *b, int32_t pid) -{ - if( b != NULL ){ - return b; - } - if( pid == 0x1fff ){ - return NULL; - } - return a; -} - -static void bind_stream_decryptor(ARIB_STD_B25_PRIVATE_DATA *prv, int32_t pid, DECRYPTOR_ELEM *dec) -{ - DECRYPTOR_ELEM *old; - - old = (DECRYPTOR_ELEM *)(prv->map[pid].target); - if(old == dec){ - /* already binded - do nothing */ - return; - } - - if(old != NULL){ - old->ref -= 1; - if(old->ref == 0){ - remove_decryptor(prv, old); - } - prv->map[pid].target = NULL; - } - - if(dec != NULL){ - prv->map[pid].target = dec; - dec->ref += 1; - } -} - -static void unlock_all_decryptor(ARIB_STD_B25_PRIVATE_DATA *prv) -{ - DECRYPTOR_ELEM *e; - - e = prv->decrypt.head; - while(e != NULL){ - e->locked = 0; - e = (DECRYPTOR_ELEM *)(e->next); - } -} - -static TS_STREAM_ELEM *get_stream_list_head(TS_STREAM_LIST *list) -{ - TS_STREAM_ELEM *r; - - r = list->head; - if(r == NULL){ - return NULL; - } - - list->head = (TS_STREAM_ELEM *)(r->next); - if(list->head == NULL){ - list->tail = NULL; - list->count = 0; - }else{ - list->head->prev = NULL; - list->count -= 1; - } - - r->prev = NULL; - r->next = NULL; - - return r; -} - -static TS_STREAM_ELEM *find_stream_list_elem(TS_STREAM_LIST *list, int32_t pid) -{ - TS_STREAM_ELEM *r; - - r = list->head; - while(r != NULL){ - if(r->pid == pid){ - break; - } - r = (TS_STREAM_ELEM *)(r->next); - } - - return r; -} - -static TS_STREAM_ELEM *create_stream_elem(int32_t pid, int32_t type) -{ - TS_STREAM_ELEM *r; - - r = (TS_STREAM_ELEM *)calloc(1, sizeof(TS_STREAM_ELEM)); - if(r == NULL){ - return NULL; - } - - r->pid = pid; - r->type = type; - - return r; -} - -static void put_stream_list_tail(TS_STREAM_LIST *list, TS_STREAM_ELEM *elem) -{ - if(list->tail != NULL){ - elem->prev = list->tail; - elem->next = NULL; - list->tail->next = elem; - list->tail = elem; - list->count += 1; - }else{ - elem->prev = NULL; - elem->next = NULL; - list->head = elem; - list->tail = elem; - list->count = 1; - } -} - -static void clear_stream_list(TS_STREAM_LIST *list) -{ - TS_STREAM_ELEM *p,*n; - - p = list->head; - while(p != NULL){ - n = (TS_STREAM_ELEM *)(p->next); - free(p); - p = n; - } - - list->head = NULL; - list->tail = NULL; - list->count = 0; -} - -static int reserve_work_buffer(TS_WORK_BUFFER *buf, int32_t size) -{ - int m,n; - uint8_t *p; - - if(buf->max >= size){ - return 1; - } - - if(buf->max < 512){ - n = 512; - }else{ - n = buf->max * 2; - } - - while(n < size){ - n += n; - } - - p = (uint8_t *)malloc(n); - if(p == NULL){ - return 0; - } - - m = 0; - if(buf->pool != NULL){ - m = buf->tail - buf->head; - if(m > 0){ - memcpy(p, buf->head, m); - } - free(buf->pool); - buf->pool = NULL; - } - - buf->pool = p; - buf->head = p; - buf->tail = p+m; - buf->max = n; - - return 1; -} - -static int append_work_buffer(TS_WORK_BUFFER *buf, uint8_t *data, int32_t size) -{ - int m; - - if(size < 1){ - /* ignore - do nothing */ - return 1; - } - - m = buf->tail - buf->pool; - - if( (m+size) > buf->max ){ - if(!reserve_work_buffer(buf, m+size)){ - return 0; - } - } - - memcpy(buf->tail, data, size); - buf->tail += size; - - return 1; -} - -static void reset_work_buffer(TS_WORK_BUFFER *buf) -{ - buf->head = buf->pool; - buf->tail = buf->pool; -} - -static void release_work_buffer(TS_WORK_BUFFER *buf) -{ - if(buf->pool != NULL){ - free(buf->pool); - } - buf->pool = NULL; - buf->head = NULL; - buf->tail = NULL; - buf->max = 0; -} - -static void extract_ts_header(TS_HEADER *dst, uint8_t *src) -{ - dst->sync = src[0]; - dst->transport_error_indicator = (src[1] >> 7) & 0x01; - dst->payload_unit_start_indicator = (src[1] >> 6) & 0x01; - dst->transport_priority = (src[1] >> 5) & 0x01; - dst->pid = ((src[1] & 0x1f) << 8) | src[2]; - dst->transport_scrambling_control = (src[3] >> 6) & 0x03; - dst->adaptation_field_control = (src[3] >> 4) & 0x03; - dst->continuity_counter = src[3] & 0x0f; -} - -static void extract_emm_fixed_part(EMM_FIXED_PART *dst, uint8_t *src) -{ - int i; - - dst->card_id = 0; - for(i=0;i<6;i++){ - dst->card_id = (dst->card_id << 8) | src[i]; - } - - dst->associated_information_length = src[ 6]; - dst->protocol_number = src[ 7]; - dst->broadcaster_group_id = src[ 8]; - dst->update_number = (src[ 9]<<8)|src[10]; - dst->expiration_date = (src[11]<<8)|src[12]; -} - -static uint8_t *resync(uint8_t *head, uint8_t *tail, int32_t unit_size) -{ - int i; - unsigned char *buf; - - buf = head; - tail -= unit_size * 8; - while( buf <= tail ){ - if(buf[0] == 0x47){ - for(i=1;i<8;i++){ - if(buf[unit_size*i] != 0x47){ - break; - } - } - if(i == 8){ - return buf; - } - } - buf += 1; - } - - return NULL; -} - -static uint8_t *resync_force(uint8_t *head, uint8_t *tail, int32_t unit_size) -{ - int i,n; - unsigned char *buf; - - buf = head; - while( buf <= (tail-188) ){ - if(buf[0] == 0x47){ - n = (tail - buf) / unit_size; - if(n == 0){ - return buf; - } - for(i=1;i<n;i++){ - if(buf[unit_size*i] != 0x47){ - break; - } - } - if(i == n){ - return buf; - } - } - buf += 1; - } - - return NULL; -}
--- a/arib25/src/arib_std_b25.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -#ifndef ARIB_STD_B25_H -#define ARIB_STD_B25_H - -#include "portable.h" -#include "b_cas_card.h" - -typedef struct { - uint8_t *data; - int32_t size; -} ARIB_STD_B25_BUFFER; - -typedef struct { - - int32_t program_number; /* channel */ - - int32_t ecm_unpurchased_count; - int32_t last_ecm_error_code; - - int32_t padding; - - int64_t total_packet_count; - int64_t undecrypted_packet_count; - -} ARIB_STD_B25_PROGRAM_INFO; - -typedef struct { - - void *private_data; - - void (* release)(void *std_b25); - - int (* set_multi2_round)(void *std_b25, int32_t round); - int (* set_strip)(void *std_b25, int32_t strip); - int (* set_emm_proc)(void *std_b25, int32_t on); - - int (* set_b_cas_card)(void *std_b25, B_CAS_CARD *bcas); - - int (* reset)(void *std_b25); - int (* flush)(void *std_b25); - - int (* put)(void *std_b25, ARIB_STD_B25_BUFFER *buf); - int (* get)(void *std_b25, ARIB_STD_B25_BUFFER *buf); - - int (* get_program_count)(void *std_b25); - int (* get_program_info)(void *std_b25, ARIB_STD_B25_PROGRAM_INFO *info, int32_t idx); - -} ARIB_STD_B25; - -#ifdef __cplusplus -extern "C" { -#endif - -extern ARIB_STD_B25 *create_arib_std_b25(); - -#ifdef __cplusplus -} -#endif - -#endif /* ARIB_STD_B25_H */ -
--- a/arib25/src/arib_std_b25_error_code.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -#ifndef ARIB_STD_B25_ERROR_CODE_H -#define ARIB_STD_B25_ERROR_CODE_H - -#define ARIB_STD_B25_ERROR_INVALID_PARAM -1 -#define ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY -2 -#define ARIB_STD_B25_ERROR_NON_TS_INPUT_STREAM -3 -#define ARIB_STD_B25_ERROR_NO_PAT_IN_HEAD_16M -4 -#define ARIB_STD_B25_ERROR_NO_PMT_IN_HEAD_32M -5 -#define ARIB_STD_B25_ERROR_NO_ECM_IN_HEAD_32M -6 -#define ARIB_STD_B25_ERROR_EMPTY_B_CAS_CARD -7 -#define ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS -8 -#define ARIB_STD_B25_ERROR_ECM_PROC_FAILURE -9 -#define ARIB_STD_B25_ERROR_DECRYPT_FAILURE -10 -#define ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE -11 -#define ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE -12 -#define ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE -13 -#define ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE -14 -#define ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE -15 -#define ARIB_STD_B25_ERROR_EMM_PROC_FAILURE -16 - -#define ARIB_STD_B25_WARN_UNPURCHASED_ECM 1 -#define ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH 2 -#define ARIB_STD_B25_WARN_BROKEN_TS_SECTION 3 - -#endif /* ARIB_STD_B25_ERROR_CODE_H */
--- a/arib25/src/b_cas_card.c Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,749 +0,0 @@ -#include "b_cas_card.h" -#include "b_cas_card_error_code.h" - -#include <stdlib.h> -#include <string.h> - -#include <math.h> - -#if defined(WIN32) - #include <windows.h> -#endif -#include <winscard.h> - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - inner structures - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -typedef struct { - - SCARDCONTEXT mng; - SCARDHANDLE card; - - uint8_t *pool; - char *reader; - - uint8_t *sbuf; - uint8_t *rbuf; - - B_CAS_INIT_STATUS stat; - - B_CAS_ID id; - int32_t id_max; - - B_CAS_PWR_ON_CTRL_INFO pwc; - int32_t pwc_max; - -} B_CAS_CARD_PRIVATE_DATA; - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - constant values - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static const uint8_t INITIAL_SETTING_CONDITIONS_CMD[] = { - 0x90, 0x30, 0x00, 0x00, 0x00, -}; - -static const uint8_t CARD_ID_INFORMATION_ACQUIRE_CMD[] = { - 0x90, 0x32, 0x00, 0x00, 0x00, -}; - -static const uint8_t POWER_ON_CONTROL_INFORMATION_REQUEST_CMD[] = { - 0x90, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, -}; - -static const uint8_t ECM_RECEIVE_CMD_HEADER[] = { - 0x90, 0x34, 0x00, 0x00, -}; - -static const uint8_t EMM_RECEIVE_CMD_HEADER[] = { - 0x90, 0x36, 0x00, 0x00, -}; - -#define B_CAS_BUFFER_MAX (4*1024) - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function prottypes (interface method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static void release_b_cas_card(void *bcas); -static int init_b_cas_card(void *bcas); -static int get_init_status_b_cas_card(void *bcas, B_CAS_INIT_STATUS *stat); -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); -static int proc_ecm_b_cas_card(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src, int len); -static int proc_emm_b_cas_card(void *bcas, uint8_t *src, int len); - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - global function implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -B_CAS_CARD *create_b_cas_card() -{ - int n; - - B_CAS_CARD *r; - B_CAS_CARD_PRIVATE_DATA *prv; - - n = sizeof(B_CAS_CARD) + sizeof(B_CAS_CARD_PRIVATE_DATA); - prv = (B_CAS_CARD_PRIVATE_DATA *)calloc(1, n); - if(prv == NULL){ - return NULL; - } - - r = (B_CAS_CARD *)(prv+1); - - r->private_data = prv; - - r->release = release_b_cas_card; - r->init = init_b_cas_card; - r->get_init_status = get_init_status_b_cas_card; - r->get_id = get_id_b_cas_card; - r->get_pwr_on_ctrl = get_pwr_on_ctrl_b_cas_card; - r->proc_ecm = proc_ecm_b_cas_card; - r->proc_emm = proc_emm_b_cas_card; - - return r; -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function prottypes (private method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static B_CAS_CARD_PRIVATE_DATA *private_data(void *bcas); -static void teardown(B_CAS_CARD_PRIVATE_DATA *prv); -static int change_id_max(B_CAS_CARD_PRIVATE_DATA *prv, int max); -static int change_pwc_max(B_CAS_CARD_PRIVATE_DATA *prv, int max); -static int connect_card(B_CAS_CARD_PRIVATE_DATA *prv, const char *reader_name); -static void extract_power_on_ctrl_response(B_CAS_PWR_ON_CTRL *dst, uint8_t *src); -static void extract_mjd(int *yy, int *mm, int *dd, int mjd); -static int setup_ecm_receive_command(uint8_t *dst, uint8_t *src, int len); -static int setup_emm_receive_command(uint8_t *dst, uint8_t *src, int len); -static int32_t load_be_uint16(uint8_t *p); -static int64_t load_be_uint48(uint8_t *p); - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - interface method implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static void release_b_cas_card(void *bcas) -{ - B_CAS_CARD_PRIVATE_DATA *prv; - - prv = private_data(bcas); - if(prv == NULL){ - /* do nothing */ - return; - } - - teardown(prv); - free(prv); -} - -static int init_b_cas_card(void *bcas) -{ - int m; - LONG ret; - DWORD len; - - B_CAS_CARD_PRIVATE_DATA *prv; - - prv = private_data(bcas); - if(prv == NULL){ - return B_CAS_CARD_ERROR_INVALID_PARAMETER; - } - - teardown(prv); - - ret = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &(prv->mng)); - if(ret != SCARD_S_SUCCESS){ - return B_CAS_CARD_ERROR_NO_SMART_CARD_READER; - } - - ret = SCardListReaders(prv->mng, NULL, NULL, &len); - if(ret != SCARD_S_SUCCESS){ - return B_CAS_CARD_ERROR_NO_SMART_CARD_READER; - } - len += 256; - - m = len + (2*B_CAS_BUFFER_MAX) + (sizeof(int64_t)*16) + (sizeof(B_CAS_PWR_ON_CTRL)*16); - prv->pool = (uint8_t *)malloc(m); - if(prv->pool == NULL){ - return B_CAS_CARD_ERROR_NO_ENOUGH_MEMORY; - } - - prv->reader = (char *)(prv->pool); - prv->sbuf = prv->pool + len; - prv->rbuf = prv->sbuf + B_CAS_BUFFER_MAX; - prv->id.data = (int64_t *)(prv->rbuf + B_CAS_BUFFER_MAX); - prv->id_max = 16; - prv->pwc.data = (B_CAS_PWR_ON_CTRL *)(prv->id.data + prv->id_max); - prv->pwc_max = 16; - - ret = SCardListReaders(prv->mng, NULL, prv->reader, &len); - if(ret != SCARD_S_SUCCESS){ - return B_CAS_CARD_ERROR_NO_SMART_CARD_READER; - } - - while( prv->reader[0] != 0 ){ - if(connect_card(prv, prv->reader)){ - break; - } - prv->reader += (strlen(prv->reader) + 1); - } - - if(prv->card == 0){ - return B_CAS_CARD_ERROR_ALL_READERS_CONNECTION_FAILED; - } - - return 0; -} - -static int get_init_status_b_cas_card(void *bcas, B_CAS_INIT_STATUS *stat) -{ - B_CAS_CARD_PRIVATE_DATA *prv; - - prv = private_data(bcas); - if( (prv == NULL) || (stat == NULL) ){ - return B_CAS_CARD_ERROR_INVALID_PARAMETER; - } - - if(prv->card == 0){ - return B_CAS_CARD_ERROR_NOT_INITIALIZED; - } - - memcpy(stat, &(prv->stat), sizeof(B_CAS_INIT_STATUS)); - - return 0; -} - -static int get_id_b_cas_card(void *bcas, B_CAS_ID *dst) -{ - LONG ret; - - DWORD slen; - DWORD rlen; - - int i,num; - - uint8_t *p; - uint8_t *tail; - - B_CAS_CARD_PRIVATE_DATA *prv; - SCARD_IO_REQUEST sir; - - prv = private_data(bcas); - if( (prv == NULL) || (dst == NULL) ){ - return B_CAS_CARD_ERROR_INVALID_PARAMETER; - } - - if(prv->card == 0){ - return B_CAS_CARD_ERROR_NOT_INITIALIZED; - } - - slen = sizeof(CARD_ID_INFORMATION_ACQUIRE_CMD); - memcpy(prv->sbuf, CARD_ID_INFORMATION_ACQUIRE_CMD, slen); - memcpy(&sir, SCARD_PCI_T1, sizeof(sir)); - rlen = B_CAS_BUFFER_MAX; - - ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, &sir, prv->rbuf, &rlen); - if( (ret != SCARD_S_SUCCESS) || (rlen < 19) ){ - return B_CAS_CARD_ERROR_TRANSMIT_FAILED; - } - - p = prv->rbuf + 6; - tail = prv->rbuf + rlen; - if( p+1 > tail ){ - return B_CAS_CARD_ERROR_TRANSMIT_FAILED; - } - - num = p[0]; - if(num > prv->id_max){ - if(change_id_max(prv, num+4) < 0){ - return B_CAS_CARD_ERROR_NO_ENOUGH_MEMORY; - } - } - - p += 1; - for(i=0;i<num;i++){ - if( p+10 > tail ){ - return B_CAS_CARD_ERROR_TRANSMIT_FAILED; - } - - { - int maker_id; - int version; - int check_code; - - maker_id = p[0]; - version = p[1]; - prv->id.data[i] = load_be_uint48(p+2); - check_code = load_be_uint16(p+8); - } - - p += 10; - } - - prv->id.count = num; - - memcpy(dst, &(prv->id), sizeof(B_CAS_ID)); - - return 0; -} - -static int get_pwr_on_ctrl_b_cas_card(void *bcas, B_CAS_PWR_ON_CTRL_INFO *dst) -{ - LONG ret; - - DWORD slen; - DWORD rlen; - - int i,num,code; - - B_CAS_CARD_PRIVATE_DATA *prv; - SCARD_IO_REQUEST sir; - - memset(dst, 0, sizeof(B_CAS_PWR_ON_CTRL_INFO)); - - prv = private_data(bcas); - if( (prv == NULL) || (dst == NULL) ){ - return B_CAS_CARD_ERROR_INVALID_PARAMETER; - } - - if(prv->card == 0){ - return B_CAS_CARD_ERROR_NOT_INITIALIZED; - } - - slen = sizeof(POWER_ON_CONTROL_INFORMATION_REQUEST_CMD); - memcpy(prv->sbuf, POWER_ON_CONTROL_INFORMATION_REQUEST_CMD, slen); - prv->sbuf[5] = 0; - memcpy(&sir, SCARD_PCI_T1, sizeof(sir)); - rlen = B_CAS_BUFFER_MAX; - - ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, &sir, prv->rbuf, &rlen); - if( (ret != SCARD_S_SUCCESS) || (rlen < 18) || (prv->rbuf[6] != 0) ){ - return B_CAS_CARD_ERROR_TRANSMIT_FAILED; - } - - code = load_be_uint16(prv->rbuf+4); - if(code == 0xa101){ - /* no data */ - return 0; - }else if(code != 0x2100){ - return B_CAS_CARD_ERROR_TRANSMIT_FAILED; - } - - num = (prv->rbuf[7] + 1); - if(prv->pwc_max < num){ - if(change_pwc_max(prv, num+4) < 0){ - return B_CAS_CARD_ERROR_NO_ENOUGH_MEMORY; - } - } - - extract_power_on_ctrl_response(prv->pwc.data+0, prv->rbuf); - - for(i=1;i<num;i++){ - prv->sbuf[5] = i; - rlen = B_CAS_BUFFER_MAX; - - ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, &sir, prv->rbuf, &rlen); - if( (ret != SCARD_S_SUCCESS) || (rlen < 18) || (prv->rbuf[6] != i) ){ - return B_CAS_CARD_ERROR_TRANSMIT_FAILED; - } - - extract_power_on_ctrl_response(prv->pwc.data+i, prv->rbuf); - } - - prv->pwc.count = num; - - memcpy(dst, &(prv->pwc), sizeof(B_CAS_PWR_ON_CTRL_INFO)); - - return 0; -} - -static int proc_ecm_b_cas_card(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src, int len) -{ - int retry_count; - - LONG ret; - DWORD slen; - DWORD rlen; - - B_CAS_CARD_PRIVATE_DATA *prv; - - SCARD_IO_REQUEST sir; - - prv = private_data(bcas); - if( (prv == NULL) || - (dst == NULL) || - (src == NULL) || - (len < 1) ){ - return B_CAS_CARD_ERROR_INVALID_PARAMETER; - } - - if(prv->card == 0){ - return B_CAS_CARD_ERROR_NOT_INITIALIZED; - } - - slen = setup_ecm_receive_command(prv->sbuf, src, len); - memcpy(&sir, SCARD_PCI_T1, sizeof(sir)); - rlen = B_CAS_BUFFER_MAX; - - retry_count = 0; - ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, &sir, prv->rbuf, &rlen); - while( ((ret != SCARD_S_SUCCESS) || (rlen < 25)) && (retry_count < 10) ){ - retry_count += 1; - if(!connect_card(prv, prv->reader)){ - continue; - } - slen = setup_ecm_receive_command(prv->sbuf, src, len); - memcpy(&sir, SCARD_PCI_T1, sizeof(sir)); - rlen = B_CAS_BUFFER_MAX; - - ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, &sir, prv->rbuf, &rlen); - } - - if( (ret != SCARD_S_SUCCESS) || (rlen < 25) ){ - return B_CAS_CARD_ERROR_TRANSMIT_FAILED; - } - - memcpy(dst->scramble_key, prv->rbuf+6, 16); - dst->return_code = load_be_uint16(prv->rbuf+4); - - return 0; -} - -static int proc_emm_b_cas_card(void *bcas, uint8_t *src, int len) -{ - int retry_count; - - LONG ret; - DWORD slen; - DWORD rlen; - - B_CAS_CARD_PRIVATE_DATA *prv; - - SCARD_IO_REQUEST sir; - - prv = private_data(bcas); - if( (prv == NULL) || - (src == NULL) || - (len < 1) ){ - return B_CAS_CARD_ERROR_INVALID_PARAMETER; - } - - if(prv->card == 0){ - return B_CAS_CARD_ERROR_NOT_INITIALIZED; - } - - slen = setup_emm_receive_command(prv->sbuf, src, len); - memcpy(&sir, SCARD_PCI_T1, sizeof(sir)); - rlen = B_CAS_BUFFER_MAX; - - retry_count = 0; - ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, &sir, prv->rbuf, &rlen); - while( ((ret != SCARD_S_SUCCESS) || (rlen < 6)) && (retry_count < 2) ){ - retry_count += 1; - if(!connect_card(prv, prv->reader)){ - continue; - } - slen = setup_emm_receive_command(prv->sbuf, src, len); - memcpy(&sir, SCARD_PCI_T1, sizeof(sir)); - rlen = B_CAS_BUFFER_MAX; - - ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, slen, &sir, prv->rbuf, &rlen); - } - - if( (ret != SCARD_S_SUCCESS) || (rlen < 6) ){ - return B_CAS_CARD_ERROR_TRANSMIT_FAILED; - } - - return 0; -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - private method implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static B_CAS_CARD_PRIVATE_DATA *private_data(void *bcas) -{ - B_CAS_CARD_PRIVATE_DATA *r; - B_CAS_CARD *p; - - p = (B_CAS_CARD *)bcas; - if(p == NULL){ - return NULL; - } - - r = (B_CAS_CARD_PRIVATE_DATA *)(p->private_data); - if( ((void *)(r+1)) != ((void *)p) ){ - return NULL; - } - - return r; -} - -static void teardown(B_CAS_CARD_PRIVATE_DATA *prv) -{ - if(prv->card != 0){ - SCardDisconnect(prv->card, SCARD_LEAVE_CARD); - prv->card = 0; - } - - if(prv->mng != 0){ - SCardReleaseContext(prv->mng); - prv->mng = 0; - } - - if(prv->pool != NULL){ - free(prv->pool); - prv->pool = NULL; - } - - prv->reader = NULL; - prv->sbuf = NULL; - prv->rbuf = NULL; - prv->id.data = NULL; - prv->id_max = 0; -} - -static int change_id_max(B_CAS_CARD_PRIVATE_DATA *prv, int max) -{ - int m; - int reader_size; - int pwctrl_size; - - uint8_t *p; - uint8_t *old_reader; - uint8_t *old_pwctrl; - - reader_size = prv->sbuf - prv->pool; - pwctrl_size = prv->pwc.count * sizeof(B_CAS_PWR_ON_CTRL); - - m = reader_size; - m += (2*B_CAS_BUFFER_MAX); - m += (max*sizeof(int64_t)); - m += (prv->pwc_max*sizeof(B_CAS_PWR_ON_CTRL)); - p = (uint8_t *)malloc(m); - if(p == NULL){ - return B_CAS_CARD_ERROR_NO_ENOUGH_MEMORY; - } - - old_reader = (uint8_t *)(prv->reader); - old_pwctrl = (uint8_t *)(prv->pwc.data); - - prv->reader = (char *)p; - prv->sbuf = prv->pool + reader_size; - prv->rbuf = prv->sbuf + B_CAS_BUFFER_MAX; - prv->id.data = (int64_t *)(prv->rbuf + B_CAS_BUFFER_MAX); - prv->id_max = max; - prv->pwc.data = (B_CAS_PWR_ON_CTRL *)(prv->id.data + prv->id_max); - - memcpy(prv->reader, old_reader, reader_size); - memcpy(prv->pwc.data, old_pwctrl, pwctrl_size); - - free(prv->pool); - prv->pool = p; - - return 0; -} - -static int change_pwc_max(B_CAS_CARD_PRIVATE_DATA *prv, int max) -{ - int m; - int reader_size; - int cardid_size; - - uint8_t *p; - uint8_t *old_reader; - uint8_t *old_cardid; - - reader_size = prv->sbuf - prv->pool; - cardid_size = prv->id.count * sizeof(int64_t); - - m = reader_size; - m += (2*B_CAS_BUFFER_MAX); - m += (prv->id_max*sizeof(int64_t)); - m += (max*sizeof(B_CAS_PWR_ON_CTRL)); - p = (uint8_t *)malloc(m); - if(p == NULL){ - return B_CAS_CARD_ERROR_NO_ENOUGH_MEMORY; - } - - old_reader = (uint8_t *)(prv->reader); - old_cardid = (uint8_t *)(prv->id.data); - - prv->reader = (char *)p; - prv->sbuf = prv->pool + reader_size; - prv->rbuf = prv->sbuf + B_CAS_BUFFER_MAX; - prv->id.data = (int64_t *)(prv->rbuf + B_CAS_BUFFER_MAX); - prv->pwc.data = (B_CAS_PWR_ON_CTRL *)(prv->id.data + prv->id_max); - prv->pwc_max = max; - - memcpy(prv->reader, old_reader, reader_size); - memcpy(prv->id.data, old_cardid, cardid_size); - - free(prv->pool); - prv->pool = p; - - return 0; -} - -static int connect_card(B_CAS_CARD_PRIVATE_DATA *prv, const char *reader_name) -{ - int m,n; - - LONG ret; - DWORD rlen,protocol; - - uint8_t *p; - - SCARD_IO_REQUEST sir; - - if(prv->card != 0){ - SCardDisconnect(prv->card, SCARD_RESET_CARD); - prv->card = 0; - } - - ret = SCardConnect(prv->mng, reader_name, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, &(prv->card), &protocol); - if(ret != SCARD_S_SUCCESS){ - return 0; - } - - m = sizeof(INITIAL_SETTING_CONDITIONS_CMD); - memcpy(prv->sbuf, INITIAL_SETTING_CONDITIONS_CMD, m); - memcpy(&sir, SCARD_PCI_T1, sizeof(sir)); - rlen = B_CAS_BUFFER_MAX; - ret = SCardTransmit(prv->card, SCARD_PCI_T1, prv->sbuf, m, &sir, prv->rbuf, &rlen); - if(ret != SCARD_S_SUCCESS){ - return 0; - } - - if(rlen < 57){ - return 0; - } - - p = prv->rbuf; - - n = load_be_uint16(p+4); - if(n != 0x2100){ // return code missmatch - return 0; - } - - 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); - - return 1; -} - -static void extract_power_on_ctrl_response(B_CAS_PWR_ON_CTRL *dst, uint8_t *src) -{ - int referrence; - int start; - int limit; - - - dst->broadcaster_group_id = src[8]; - referrence = (src[9]<<8)|src[10]; - start = referrence - src[11]; - limit = start + (src[12]-1); - - extract_mjd(&(dst->s_yy), &(dst->s_mm), &(dst->s_dd), start); - extract_mjd(&(dst->l_yy), &(dst->l_mm), &(dst->l_dd), limit); - - dst->hold_time = src[13]; - dst->network_id = (src[14]<<8)|src[15]; - dst->transport_id = (src[16]<<8)|src[17]; - -} - -static void extract_mjd(int *yy, int *mm, int *dd, int mjd) -{ - int a1,m1; - int a2,m2; - int a3,m3; - int a4,m4; - int mw; - int dw; - int yw; - - mjd -= 51604; // 2000,3/1 - if(mjd < 0){ - mjd += 0x10000; - } - - a1 = mjd / 146097; - m1 = mjd % 146097; - a2 = m1 / 36524; - m2 = m1 - (a2 * 36524); - a3 = m2 / 1461; - m3 = m2 - (a3 * 1461); - a4 = m3 / 365; - if(a4 > 3){ - a4 = 3; - } - m4 = m3 - (a4 * 365); - - mw = (1071*m4+450) >> 15; - dw = m4 - ((979*mw+16) >> 5); - - yw = a1*400 + a2*100 + a3*4 + a4 + 2000; - mw += 3; - if(mw > 12){ - mw -= 12; - yw += 1; - } - dw += 1; - - *yy = yw; - *mm = mw; - *dd = dw; -} - -static int setup_ecm_receive_command(uint8_t *dst, uint8_t *src, int len) -{ - int r; - - r = sizeof(ECM_RECEIVE_CMD_HEADER); - memcpy(dst+0, ECM_RECEIVE_CMD_HEADER, r); - dst[r] = (uint8_t)(len & 0xff); - r += 1; - memcpy(dst+r, src, len); - r += len; - dst[r] = 0; - r += 1; - - return r; -} - -static int setup_emm_receive_command(uint8_t *dst, uint8_t *src, int len) -{ - int r; - - r = sizeof(EMM_RECEIVE_CMD_HEADER); - memcpy(dst+0, EMM_RECEIVE_CMD_HEADER, r); - dst[r] = (uint8_t)(len & 0xff); - r += 1; - memcpy(dst+r, src, len); - r += len; - dst[r] = 0; - r += 1; - - return r; -} - -static int32_t load_be_uint16(uint8_t *p) -{ - return ((p[0]<<8)|p[1]); -} - -static int64_t load_be_uint48(uint8_t *p) -{ - int i; - int64_t r; - - r = p[0]; - for(i=1;i<6;i++){ - r <<= 8; - r |= p[i]; - } - - return r; -} -
--- a/arib25/src/b_cas_card.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -#ifndef B_CAS_CARD_H -#define B_CAS_CARD_H - -#include "portable.h" - -typedef struct { - uint8_t system_key[32]; - uint8_t init_cbc[8]; - int64_t bcas_card_id; - int32_t card_status; - int32_t ca_system_id; -} B_CAS_INIT_STATUS; - -typedef struct { - int64_t *data; - int32_t count; -} B_CAS_ID; - -typedef struct { - - int32_t s_yy; /* start date : year */ - int32_t s_mm; /* start date : month */ - int32_t s_dd; /* start date : day */ - - int32_t l_yy; /* limit date : year */ - int32_t l_mm; /* limit date : month */ - int32_t l_dd; /* limit date : day */ - - int32_t hold_time; /* in hour unit */ - - int32_t broadcaster_group_id; - - int32_t network_id; - int32_t transport_id; - -} B_CAS_PWR_ON_CTRL; - -typedef struct { - B_CAS_PWR_ON_CTRL *data; - int32_t count; -} B_CAS_PWR_ON_CTRL_INFO; - -typedef struct { - uint8_t scramble_key[16]; - uint32_t return_code; -} B_CAS_ECM_RESULT; - -typedef struct { - - void *private_data; - - void (* release)(void *bcas); - - int (* init)(void *bcas); - - int (* get_init_status)(void *bcas, B_CAS_INIT_STATUS *stat); - int (* get_id)(void *bcas, B_CAS_ID *dst); - int (* get_pwr_on_ctrl)(void *bcas, B_CAS_PWR_ON_CTRL_INFO *dst); - - int (* proc_ecm)(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src, int len); - int (* proc_emm)(void *bcas, uint8_t *src, int len); - -} B_CAS_CARD; - -#ifdef __cplusplus -extern "C" { -#endif - -extern B_CAS_CARD *create_b_cas_card(); - -#ifdef __cplusplus -} -#endif - -#endif /* B_CAS_CARD_H */
--- a/arib25/src/b_cas_card_error_code.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -#ifndef B_CAS_CARD_ERROR_CODE_H -#define B_CAS_CARD_ERROR_CODE_H - -#define B_CAS_CARD_ERROR_INVALID_PARAMETER -1 -#define B_CAS_CARD_ERROR_NOT_INITIALIZED -2 -#define B_CAS_CARD_ERROR_NO_SMART_CARD_READER -3 -#define B_CAS_CARD_ERROR_ALL_READERS_CONNECTION_FAILED -4 -#define B_CAS_CARD_ERROR_NO_ENOUGH_MEMORY -5 -#define B_CAS_CARD_ERROR_TRANSMIT_FAILED -6 - -#endif /* B_CAS_CARD_ERROR_CODE_H */
--- a/arib25/src/makefile.win Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -CC = cl -CFLAG = /c /MT /W4 /O2 -LINK = link -LFLAG = /nologo -LIBS = winscard.lib - -ALL: b25.exe - -arib_std_b25.obj: arib_std_b25.c arib_std_b25.h portable.h b_cas_card.h arib_std_b25_error_code.h multi2.h ts_section_parser.h ts_common_types.h - $(CC) $(CFLAG) arib_std_b25.c - -b_cas_card.obj: b_cas_card.c b_cas_card.h portable.h b_cas_card_error_code.h - $(CC) $(CFLAG) b_cas_card.c - -multi2.obj: multi2.c multi2.h portable.h multi2_error_code.h - $(CC) $(CFLAG) multi2.c - -td.obj: td.c arib_std_b25.h portable.h b_cas_card.h - $(CC) $(CFLAG) td.c - -ts_section_parser.obj: ts_section_parser.c ts_section_parser.h ts_common_types.h portable.h ts_section_parser_error_code.h - $(CC) $(CFLAG) ts_section_parser.c - -OBJ = arib_std_b25.obj b_cas_card.obj multi2.obj td.obj ts_section_parser.obj - -b25.exe: $(OBJ) - $(LINK) $(LFLAG) $(LIBS) /OUT:b25.exe $(OBJ) - -clean: - DEL *.obj - DEL *.exe - -
--- a/arib25/src/multi2.c Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,527 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -#include "multi2.h" -#include "multi2_error_code.h" - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - inline functions - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static __inline uint8_t *load_be_uint32(uint32_t *dst, uint8_t *src) -{ - *dst = ((src[0]<<24)|(src[1]<<16)|(src[2]<<8)|src[3]); - return src+4; -} - -static __inline uint8_t *save_be_uint32(uint8_t *dst, uint32_t src) -{ - dst[0] = (uint8_t)((src>>24) & 0xff); - dst[1] = (uint8_t)((src>>16) & 0xff); - dst[2] = (uint8_t)((src>> 8) & 0xff); - dst[3] = (uint8_t)( src & 0xff); - return dst+4; -} - -static __inline uint32_t left_rotate_uint32(uint32_t val, uint32_t count) -{ - return ((val << count) | (val >> (32-count))); -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - inner structures - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -typedef struct { - uint32_t key[8]; -} CORE_PARAM; - -typedef struct { - uint32_t l; - uint32_t r; -} CORE_DATA; - -typedef struct { - - int32_t ref_count; - - CORE_DATA cbc_init; - - CORE_PARAM sys; - CORE_DATA scr[2]; /* 0: odd, 1: even */ - CORE_PARAM wrk[2]; /* 0: odd, 1: even */ - - uint32_t round; - uint32_t state; - -} MULTI2_PRIVATE_DATA; - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - constant values - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -#define MULTI2_STATE_CBC_INIT_SET (0x0001) -#define MULTI2_STATE_SYSTEM_KEY_SET (0x0002) -#define MULTI2_STATE_SCRAMBLE_KEY_SET (0x0004) - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function prottypes (interface method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static void release_multi2(void *m2); -static int add_ref_multi2(void *m2); -static int set_round_multi2(void *m2, int32_t val); -static int set_system_key_multi2(void *m2, uint8_t *val); -static int set_init_cbc_multi2(void *m2, uint8_t *val); -static int set_scramble_key_multi2(void *m2, uint8_t *val); -static int clear_scramble_key_multi2(void *m2); -static int encrypt_multi2(void *m2, int32_t type, uint8_t *buf, int32_t size); -static int decrypt_multi2(void *m2, int32_t type, uint8_t *buf, int32_t size); - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - global function implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -MULTI2 *create_multi2() -{ - int n; - - MULTI2 *r; - MULTI2_PRIVATE_DATA *prv; - - n = sizeof(MULTI2_PRIVATE_DATA); - n += sizeof(MULTI2); - - prv = (MULTI2_PRIVATE_DATA *)calloc(1, n); - if(prv == NULL){ - return NULL; - } - - r = (MULTI2 *)(prv+1); - r->private_data = prv; - - prv->ref_count = 1; - prv->round = 4; - - r->release = release_multi2; - r->add_ref = add_ref_multi2; - r->set_round = set_round_multi2; - r->set_system_key = set_system_key_multi2; - r->set_init_cbc = set_init_cbc_multi2; - r->set_scramble_key = set_scramble_key_multi2; - r->clear_scramble_key = clear_scramble_key_multi2; - r->encrypt = encrypt_multi2; - r->decrypt = decrypt_multi2; - - return r; -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function prottypes (private method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static MULTI2_PRIVATE_DATA *private_data(void *m2); - -static void core_schedule(CORE_PARAM *work, CORE_PARAM *skey, CORE_DATA *dkey); - -static void core_encrypt(CORE_DATA *dst, CORE_DATA *src, CORE_PARAM *w, int32_t round); -static void core_decrypt(CORE_DATA *dst, CORE_DATA *src, CORE_PARAM *w, int32_t round); - -static void core_pi1(CORE_DATA *dst, CORE_DATA *src); -static void core_pi2(CORE_DATA *dst, CORE_DATA *src, uint32_t a); -static void core_pi3(CORE_DATA *dst, CORE_DATA *src, uint32_t a, uint32_t b); -static void core_pi4(CORE_DATA *dst, CORE_DATA *src, uint32_t a); - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - interface method implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static void release_multi2(void *m2) -{ - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if(prv == NULL){ - /* do nothing */ - return; - } - - prv->ref_count -= 1; - if(prv->ref_count == 0){ - free(prv); - } -} - -static int add_ref_multi2(void *m2) -{ - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if(prv == NULL){ - return MULTI2_ERROR_INVALID_PARAMETER; - } - - prv->ref_count += 1; - - return 0; -} - -static int set_round_multi2(void *m2, int32_t val) -{ - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if(prv == NULL){ - /* do nothing */ - return MULTI2_ERROR_INVALID_PARAMETER; - } - - prv->round = val; - - return 0; -} - -static int set_system_key_multi2(void *m2, uint8_t *val) -{ - int i; - uint8_t *p; - - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if( (prv == NULL) || (val == NULL) ){ - return MULTI2_ERROR_INVALID_PARAMETER; - } - - p = val; - for(i=0;i<8;i++){ - p = load_be_uint32(prv->sys.key+i, p); - } - - prv->state |= MULTI2_STATE_SYSTEM_KEY_SET; - - return 0; -} - -static int set_init_cbc_multi2(void *m2, uint8_t *val) -{ - uint8_t *p; - - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if( (prv == NULL) || (val == NULL) ){ - return MULTI2_ERROR_INVALID_PARAMETER; - } - - p = val; - - p = load_be_uint32(&(prv->cbc_init.l), p); - p = load_be_uint32(&(prv->cbc_init.r), p); - - prv->state |= MULTI2_STATE_CBC_INIT_SET; - - return 0; -} - -static int set_scramble_key_multi2(void *m2, uint8_t *val) -{ - uint8_t *p; - - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if( (prv == NULL) || (val == NULL) ){ - return MULTI2_ERROR_INVALID_PARAMETER; - } - - p = val; - - p = load_be_uint32(&(prv->scr[0].l), p); - p = load_be_uint32(&(prv->scr[0].r), p); - p = load_be_uint32(&(prv->scr[1].l), p); - p = load_be_uint32(&(prv->scr[1].r), p); - - core_schedule(prv->wrk+0, &(prv->sys), prv->scr+0); - core_schedule(prv->wrk+1, &(prv->sys), prv->scr+1); - - prv->state |= MULTI2_STATE_SCRAMBLE_KEY_SET; - - return 0; -} - -static int clear_scramble_key_multi2(void *m2) -{ - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if(prv == NULL){ - return MULTI2_ERROR_INVALID_PARAMETER; - } - - memset(prv->scr, 0, sizeof(prv->scr)); - memset(prv->wrk, 0, sizeof(prv->wrk)); - - prv->state &= (~MULTI2_STATE_SCRAMBLE_KEY_SET); - - return 0; -} - -static int encrypt_multi2(void *m2, int32_t type, uint8_t *buf, int32_t size) -{ - CORE_DATA src,dst; - CORE_PARAM *prm; - - uint8_t *p; - - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if( (prv == NULL) || (buf == NULL) || (size < 1) ){ - return MULTI2_ERROR_INVALID_PARAMETER; - } - - if(prv->state != (MULTI2_STATE_CBC_INIT_SET|MULTI2_STATE_SYSTEM_KEY_SET|MULTI2_STATE_SCRAMBLE_KEY_SET)){ - if( (prv->state & MULTI2_STATE_CBC_INIT_SET) == 0 ){ - return MULTI2_ERROR_UNSET_CBC_INIT; - } - if( (prv->state & MULTI2_STATE_SYSTEM_KEY_SET) == 0 ){ - return MULTI2_ERROR_UNSET_SYSTEM_KEY; - } - if( (prv->state & MULTI2_STATE_SCRAMBLE_KEY_SET) == 0 ){ - return MULTI2_ERROR_UNSET_SCRAMBLE_KEY; - } - } - - if(type == 0x02){ - prm = prv->wrk+1; - }else{ - prm = prv->wrk+0; - } - - dst.l = prv->cbc_init.l; - dst.r = prv->cbc_init.r; - - p = buf; - while(size >= 8){ - load_be_uint32(&(src.l), p+0); - load_be_uint32(&(src.r), p+4); - src.l = src.l ^ dst.l; - src.r = src.r ^ dst.r; - core_encrypt(&dst, &src, prm, prv->round); - p = save_be_uint32(p, dst.l); - p = save_be_uint32(p, dst.r); - size -= 8; - } - - if(size > 0){ - int i; - uint8_t tmp[8]; - - src.l = dst.l; - src.r = dst.r; - core_encrypt(&dst, &src, prm, prv->round); - save_be_uint32(tmp+0, dst.l); - save_be_uint32(tmp+4, dst.r); - - for(i=0;i<size;i++){ - p[i] = (uint8_t)(p[i] ^ tmp[i]); - } - } - - return 0; -} - -static int decrypt_multi2(void *m2, int32_t type, uint8_t *buf, int32_t size) -{ - CORE_DATA src,dst,cbc; - CORE_PARAM *prm; - - uint8_t *p; - - MULTI2_PRIVATE_DATA *prv; - - prv = private_data(m2); - if( (prv == NULL) || (buf == NULL) || (size < 1) ){ - return MULTI2_ERROR_INVALID_PARAMETER; - } - - if(prv->state != (MULTI2_STATE_CBC_INIT_SET|MULTI2_STATE_SYSTEM_KEY_SET|MULTI2_STATE_SCRAMBLE_KEY_SET)){ - if( (prv->state & MULTI2_STATE_CBC_INIT_SET) == 0 ){ - return MULTI2_ERROR_UNSET_CBC_INIT; - } - if( (prv->state & MULTI2_STATE_SYSTEM_KEY_SET) == 0 ){ - return MULTI2_ERROR_UNSET_SYSTEM_KEY; - } - if( (prv->state & MULTI2_STATE_SCRAMBLE_KEY_SET) == 0 ){ - return MULTI2_ERROR_UNSET_SCRAMBLE_KEY; - } - } - - if(type == 0x02){ - prm = prv->wrk+1; - }else{ - prm = prv->wrk+0; - } - - cbc.l = prv->cbc_init.l; - cbc.r = prv->cbc_init.r; - - p = buf; - while(size >= 8){ - load_be_uint32(&(src.l), p+0); - load_be_uint32(&(src.r), p+4); - core_decrypt(&dst, &src, prm, prv->round); - dst.l = dst.l ^ cbc.l; - dst.r = dst.r ^ cbc.r; - cbc.l = src.l; - cbc.r = src.r; - p = save_be_uint32(p, dst.l); - p = save_be_uint32(p, dst.r); - size -= 8; - } - - if(size > 0){ - int i; - uint8_t tmp[8]; - - core_encrypt(&dst, &cbc, prm, prv->round); - save_be_uint32(tmp+0, dst.l); - save_be_uint32(tmp+4, dst.r); - - for(i=0;i<size;i++){ - p[i] = (uint8_t)(p[i] ^ tmp[i]); - } - } - - return 0; -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - private method implementation - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static MULTI2_PRIVATE_DATA *private_data(void *m2) -{ - MULTI2_PRIVATE_DATA *r; - MULTI2 *p; - - p = (MULTI2 *)m2; - if(p == NULL){ - return NULL; - } - - r = (MULTI2_PRIVATE_DATA *)(p->private_data); - if( ((void *)(r+1)) != ((void *)p) ){ - return NULL; - } - - return r; -} - -static void core_schedule(CORE_PARAM *work, CORE_PARAM *skey, CORE_DATA *dkey) -{ - CORE_DATA b1,b2,b3,b4,b5,b6,b7,b8,b9; - - core_pi1(&b1, dkey); - - core_pi2(&b2, &b1, skey->key[0]); - work->key[0] = b2.l; - - core_pi3(&b3, &b2, skey->key[1], skey->key[2]); - work->key[1] = b3.r; - - core_pi4(&b4, &b3, skey->key[3]); - work->key[2] = b4.l; - - core_pi1(&b5, &b4); - work->key[3] = b5.r; - - core_pi2(&b6, &b5, skey->key[4]); - work->key[4] = b6.l; - - core_pi3(&b7, &b6, skey->key[5], skey->key[6]); - work->key[5] = b7.r; - - core_pi4(&b8, &b7, skey->key[7]); - work->key[6] = b8.l; - - core_pi1(&b9, &b8); - work->key[7] = b9.r; -} - -static void core_encrypt(CORE_DATA *dst, CORE_DATA *src, CORE_PARAM *w, int32_t round) -{ - int32_t i; - - CORE_DATA tmp; - - dst->l = src->l; - dst->r = src->r; - for(i=0;i<round;i++){ - core_pi1(&tmp, dst); - core_pi2( dst, &tmp, w->key[0]); - core_pi3(&tmp, dst, w->key[1], w->key[2]); - core_pi4( dst, &tmp, w->key[3]); - core_pi1(&tmp, dst); - core_pi2( dst, &tmp, w->key[4]); - core_pi3(&tmp, dst, w->key[5], w->key[6]); - core_pi4( dst, &tmp, w->key[7]); - } -} - -static void core_decrypt(CORE_DATA *dst, CORE_DATA *src, CORE_PARAM *w, int32_t round) -{ - int32_t i; - - CORE_DATA tmp; - - dst->l = src->l; - dst->r = src->r; - for(i=0;i<round;i++){ - core_pi4(&tmp, dst, w->key[7]); - core_pi3( dst, &tmp, w->key[5], w->key[6]); - core_pi2(&tmp, dst, w->key[4]); - core_pi1( dst, &tmp); - core_pi4(&tmp, dst, w->key[3]); - core_pi3( dst, &tmp, w->key[1], w->key[2]); - core_pi2(&tmp, dst, w->key[0]); - core_pi1( dst, &tmp); - } -} - -static void core_pi1(CORE_DATA *dst, CORE_DATA *src) -{ - dst->l = src->l; - dst->r = src->r ^ src->l; -} - -static void core_pi2(CORE_DATA *dst, CORE_DATA *src, uint32_t a) -{ - uint32_t t0,t1,t2; - - t0 = src->r + a; - t1 = left_rotate_uint32(t0, 1) + t0 - 1; - t2 = left_rotate_uint32(t1, 4) ^ t1; - - dst->l = src->l ^ t2; - dst->r = src->r; -} - -static void core_pi3(CORE_DATA *dst, CORE_DATA *src, uint32_t a, uint32_t b) -{ - uint32_t t0,t1,t2,t3,t4,t5; - - t0 = src->l + a; - t1 = left_rotate_uint32(t0, 2) + t0 + 1; - t2 = left_rotate_uint32(t1, 8) ^ t1; - t3 = t2 + b; - t4 = left_rotate_uint32(t3, 1) - t3; - t5 = left_rotate_uint32(t4, 16) ^ (t4 | src->l); - - dst->l = src->l; - dst->r = src->r ^ t5; -} - -static void core_pi4(CORE_DATA *dst, CORE_DATA *src, uint32_t a) -{ - uint32_t t0,t1; - - t0 = src->r + a; - t1 = left_rotate_uint32(t0, 2) + t0 + 1; - - dst->l = src->l ^ t1; - dst->r = src->r; -}
--- a/arib25/src/multi2.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -#ifndef MULTI2_H -#define MULTI2_H - -#include "portable.h" - -typedef struct { - - void *private_data; - - void (* release)(void *m2); - int (* add_ref)(void *m2); - - int (* set_round)(void *m2, int32_t val); - - int (* set_system_key)(void *m2, uint8_t *val); - int (* set_init_cbc)(void *m2, uint8_t *val); - int (* set_scramble_key)(void *m2, uint8_t *val); - int (* clear_scramble_key)(void *m2); - - int (* encrypt)(void *m2, int32_t type, uint8_t *buf, int32_t size); - int (* decrypt)(void *m2, int32_t type, uint8_t *buf, int32_t size); - -} MULTI2; - -#ifdef __cplusplus -extern "C" { -#endif - -extern MULTI2 *create_multi2(); - -#ifdef __cplusplus -} -#endif - -#endif /* MULTI2_H */
--- a/arib25/src/multi2_error_code.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -#ifndef MULTI2_ERROR_CODE_H -#define MULTI2_ERROR_CODE_H - -#define MULTI2_ERROR_INVALID_PARAMETER -1 -#define MULTI2_ERROR_UNSET_SYSTEM_KEY -2 -#define MULTI2_ERROR_UNSET_CBC_INIT -3 -#define MULTI2_ERROR_UNSET_SCRAMBLE_KEY -4 - -#endif /* MULTI2_ERROR_CODE_H */
--- a/arib25/src/portable.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -#ifndef PORTABLE_H -#define PORTABLE_H - -#if (defined(WIN32) && MSC_VER < 1300) - -typedef unsigned char uint8_t; -typedef signed char int8_t; -typedef unsigned short uint16_t; -typedef signed short int16_t; -typedef unsigned int uint32_t; -typedef signed int int32_t; -typedef unsigned __int64 uint64_t; -typedef signed __int64 int64_t; - -#else - -#include <inttypes.h> - -#endif - -#if !defined(WIN32) - #define _open open - #define _close close - #define _read read - #define _write write - #define _lseeki64 lseek - #define _telli64(fd) (lseek(fd,0,SEEK_CUR)) - #define _O_BINARY (0) - #define _O_RDONLY (O_RDONLY) - #define _O_WRONLY (O_WRONLY) - #define _O_SEQUENTIAL (0) - #define _O_CREAT (O_CREAT) - #define _O_TRUNC (O_TRUNC) - #define _S_IREAD (S_IRUSR|S_IRGRP|S_IROTH) - #define _S_IWRITE (S_IWUSR|S_IWGRP|S_IWOTH) -#endif - -#endif /* PORTABLE_H */
--- a/arib25/src/td.c Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,381 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include <fcntl.h> -#include <sys/stat.h> -#include <sys/types.h> - -#if defined(WIN32) - #include <io.h> - #include <windows.h> - #include <crtdbg.h> -#else - #define __STDC_FORMAT_MACROS - #include <inttypes.h> - #include <unistd.h> -#endif - -#include "arib_std_b25.h" -#include "b_cas_card.h" - -typedef struct { - int32_t round; - int32_t strip; - int32_t emm; - int32_t verbose; - int32_t power_ctrl; -} OPTION; - -static void show_usage(); -static int parse_arg(OPTION *dst, int argc, char **argv); -static void test_arib_std_b25(const char *src, const char *dst, OPTION *opt); -static void show_bcas_power_on_control_info(B_CAS_CARD *bcas); - -int main(int argc, char **argv) -{ - int n; - OPTION opt; - - #if defined(WIN32) - _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE ); - _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT ); - _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE ); - _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT ); - _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE ); - _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT ); - _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_DELAY_FREE_MEM_DF|_CRTDBG_CHECK_ALWAYS_DF|_CRTDBG_LEAK_CHECK_DF); - #endif - - n = parse_arg(&opt, argc, argv); - if(n+2 > argc){ - show_usage(); - exit(EXIT_FAILURE); - } - - test_arib_std_b25(argv[n+0], argv[n+1], &opt); - - #if defined(WIN32) - _CrtDumpMemoryLeaks(); - #endif - - return EXIT_SUCCESS; -} - -static void show_usage() -{ - fprintf(stderr, "b25 - ARIB STD-B25 test program ver. 0.2.4 (2009, 4/18)\n"); - fprintf(stderr, "usage: b25 [options] src.m2t dst.m2t\n"); - fprintf(stderr, "options:\n"); - fprintf(stderr, " -r round (integer, default=4)\n"); - fprintf(stderr, " -s strip\n"); - fprintf(stderr, " 0: keep null(padding) stream (default)\n"); - fprintf(stderr, " 1: strip null stream\n"); - fprintf(stderr, " -m EMM\n"); - fprintf(stderr, " 0: ignore EMM (default)\n"); - fprintf(stderr, " 1: send EMM to B-CAS card\n"); - fprintf(stderr, " -p power_on_control_info\n"); - fprintf(stderr, " 0: do nothing additionaly\n"); - fprintf(stderr, " 1: show B-CAS EMM receiving request (default)\n"); - fprintf(stderr, " -v verbose\n"); - fprintf(stderr, " 0: silent\n"); - fprintf(stderr, " 1: show processing status (default)\n"); - fprintf(stderr, "\n"); -} - -static int parse_arg(OPTION *dst, int argc, char **argv) -{ - int i; - - dst->round = 4; - dst->strip = 0; - dst->emm = 0; - dst->power_ctrl = 1; - dst->verbose = 1; - - for(i=1;i<argc;i++){ - if(argv[i][0] != '-'){ - break; - } - switch(argv[i][1]){ - case 'm': - if(argv[i][2]){ - dst->emm = atoi(argv[i]+2); - }else{ - dst->emm = atoi(argv[i+1]); - i += 1; - } - break; - case 'p': - if(argv[i][2]){ - dst->power_ctrl = atoi(argv[i]+2); - }else{ - dst->power_ctrl = atoi(argv[i+1]); - i += 1; - } - break; - case 'r': - if(argv[i][2]){ - dst->round = atoi(argv[i]+2); - }else{ - dst->round = atoi(argv[i+1]); - i += 1; - } - break; - case 's': - if(argv[i][2]){ - dst->strip = atoi(argv[i]+2); - }else{ - dst->strip = atoi(argv[i+1]); - i += 1; - } - break; - case 'v': - if(argv[i][2]){ - dst->verbose = atoi(argv[i]+2); - }else{ - dst->verbose = atoi(argv[i+1]); - i += 1; - } - break; - default: - fprintf(stderr, "error - unknown option '-%c'\n", argv[i][1]); - return argc; - } - } - - return i; -} - -static void test_arib_std_b25(const char *src, const char *dst, OPTION *opt) -{ - int code,i,n,m; - int sfd,dfd; - - int64_t total; - int64_t offset; - - ARIB_STD_B25 *b25; - B_CAS_CARD *bcas; - - ARIB_STD_B25_PROGRAM_INFO pgrm; - - uint8_t data[8*1024]; - - ARIB_STD_B25_BUFFER sbuf; - ARIB_STD_B25_BUFFER dbuf; - - sfd = -1; - dfd = -1; - b25 = NULL; - bcas = NULL; - - sfd = _open(src, _O_BINARY|_O_RDONLY|_O_SEQUENTIAL); - if(sfd < 0){ - fprintf(stderr, "error - failed on _open(%s) [src]\n", src); - goto LAST; - } - - _lseeki64(sfd, 0, SEEK_END); - total = _telli64(sfd); - _lseeki64(sfd, 0, SEEK_SET); - - b25 = create_arib_std_b25(); - if(b25 == NULL){ - fprintf(stderr, "error - failed on create_arib_std_b25()\n"); - goto LAST; - } - - code = b25->set_multi2_round(b25, opt->round); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::set_multi2_round() : code=%d\n", code); - goto LAST; - } - - code = b25->set_strip(b25, opt->strip); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::set_strip() : code=%d\n", code); - goto LAST; - } - - code = b25->set_emm_proc(b25, opt->emm); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::set_emm_proc() : code=%d\n", code); - goto LAST; - } - - bcas = create_b_cas_card(); - if(bcas == NULL){ - fprintf(stderr, "error - failed on create_b_cas_card()\n"); - goto LAST; - } - - code = bcas->init(bcas); - if(code < 0){ - fprintf(stderr, "error - failed on B_CAS_CARD::init() : code=%d\n", code); - goto LAST; - } - - code = b25->set_b_cas_card(b25, bcas); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::set_b_cas_card() : code=%d\n", code); - goto LAST; - } - - dfd = _open(dst, _O_BINARY|_O_WRONLY|_O_SEQUENTIAL|_O_CREAT|_O_TRUNC, _S_IREAD|_S_IWRITE); - if(dfd < 0){ - fprintf(stderr, "error - failed on _open(%s) [dst]\n", dst); - goto LAST; - } - - offset = 0; - while( (n = _read(sfd, data, sizeof(data))) > 0 ){ - sbuf.data = data; - sbuf.size = n; - - code = b25->put(b25, &sbuf); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::put() : code=%d\n", code); - goto LAST; - } - - code = b25->get(b25, &dbuf); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::get() : code=%d\n", code); - goto LAST; - } - - if(dbuf.size > 0){ - n = _write(dfd, dbuf.data, dbuf.size); - if(n != dbuf.size){ - fprintf(stderr, "error failed on _write(%d)\n", dbuf.size); - goto LAST; - } - } - - offset += sbuf.size; - if(opt->verbose != 0){ - m = (int)(10000*offset/total); - fprintf(stderr, "\rprocessing: %2d.%02d%% ", m/100, m%100); - } - } - - code = b25->flush(b25); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::flush() : code=%d\n", code); - goto LAST; - } - - code = b25->get(b25, &dbuf); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::get() : code=%d\n", code); - goto LAST; - } - - if(dbuf.size > 0){ - n = _write(dfd, dbuf.data, dbuf.size); - if(n != dbuf.size){ - fprintf(stderr, "error - failed on _write(%d)\n", dbuf.size); - goto LAST; - } - } - - if(opt->verbose != 0){ - fprintf(stderr, "\rprocessing: finish \n"); - fflush(stderr); - fflush(stdout); - } - - n = b25->get_program_count(b25); - if(n < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::get_program_count() : code=%d\n", code); - goto LAST; - } - for(i=0;i<n;i++){ - code = b25->get_program_info(b25, &pgrm, i); - if(code < 0){ - fprintf(stderr, "error - failed on ARIB_STD_B25::get_program_info(%d) : code=%d\n", i, code); - goto LAST; - } - if(pgrm.ecm_unpurchased_count > 0){ - fprintf(stderr, "warning - unpurchased ECM is detected\n"); - fprintf(stderr, " channel: %d\n", pgrm.program_number); - fprintf(stderr, " unpurchased ECM count: %d\n", pgrm.ecm_unpurchased_count); - fprintf(stderr, " last ECM error code: %04x\n", pgrm.last_ecm_error_code); - #if defined(WIN32) - fprintf(stderr, " undecrypted TS packet: %d\n", pgrm.undecrypted_packet_count); - fprintf(stderr, " total TS packet: %d\n", pgrm.total_packet_count); - #else - fprintf(stderr, " undecrypted TS packet: %"PRId64"\n", pgrm.undecrypted_packet_count); - fprintf(stderr, " total TS packet: %"PRId64"\n", pgrm.total_packet_count); - #endif - } - } - - if(opt->power_ctrl != 0){ - show_bcas_power_on_control_info(bcas); - } - -LAST: - - if(sfd >= 0){ - _close(sfd); - sfd = -1; - } - - if(dfd >= 0){ - _close(dfd); - dfd = -1; - } - - if(b25 != NULL){ - b25->release(b25); - b25 = NULL; - } - - if(bcas != NULL){ - bcas->release(bcas); - bcas = NULL; - } -} - -static void show_bcas_power_on_control_info(B_CAS_CARD *bcas) -{ - int code; - int i,w; - B_CAS_PWR_ON_CTRL_INFO pwc; - - code = bcas->get_pwr_on_ctrl(bcas, &pwc); - if(code < 0){ - fprintf(stderr, "error - failed on B_CAS_CARD::get_pwr_on_ctrl() : code=%d\n", code); - return; - } - - if(pwc.count == 0){ - fprintf(stdout, "no EMM receiving request\n"); - return; - } - - fprintf(stdout, "total %d EMM receiving request\n", pwc.count); - for(i=0;i<pwc.count;i++){ - fprintf(stdout, "+ [%d] : tune ", i); - switch(pwc.data[i].network_id){ - case 4: - w = pwc.data[i].transport_id; - fprintf(stdout, "BS-%d/TS-%d ", ((w >> 4) & 0x1f), (w & 7)); - break; - case 6: - case 7: - w = pwc.data[i].transport_id; - fprintf(stdout, "ND-%d/TS-%d ", ((w >> 4) & 0x1f), (w & 7)); - break; - default: - fprintf(stdout, "unknown(b:0x%02x,n:0x%04x,t:0x%04x) ", pwc.data[i].broadcaster_group_id, pwc.data[i].network_id, pwc.data[i].transport_id); - break; - } - fprintf(stdout, "between %04d %02d/%02d ", pwc.data[i].s_yy, pwc.data[i].s_mm, pwc.data[i].s_dd); - fprintf(stdout, "to %04d %02d/%02d ", pwc.data[i].l_yy, pwc.data[i].l_mm, pwc.data[i].l_dd); - fprintf(stdout, "least %d hours\n", pwc.data[i].hold_time); - } -} -
--- a/arib25/src/ts_common_types.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -#ifndef TS_COMMON_TYPES_H -#define TS_COMMON_TYPES_H - -#include "portable.h" - -typedef struct { - int32_t sync; /* 0- 7 : 8 bits */ - int32_t transport_error_indicator; /* 8- 8 : 1 bit */ - int32_t payload_unit_start_indicator; /* 9- 9 : 1 bit */ - int32_t transport_priority; /* 10-10 : 1 bits */ - int32_t pid; /* 11-23 : 13 bits */ - int32_t transport_scrambling_control; /* 24-25 : 2 bits */ - int32_t adaptation_field_control; /* 26-27 : 2 bits */ - int32_t continuity_counter; /* 28-31 : 4 bits */ -} TS_HEADER; - -typedef struct { - int32_t table_id; /* 0- 7 : 8 bits */ - int32_t section_syntax_indicator; /* 8- 8 : 1 bit */ - int32_t private_indicator; /* 9- 9 : 1 bit */ - int32_t section_length; /* 12-23 : 12 bits */ - int32_t table_id_extension; /* 24-39 : 16 bits */ - int32_t version_number; /* 42-46 : 5 bits */ - int32_t current_next_indicator; /* 47-57 : 1 bit */ - int32_t section_number; /* 48-55 : 8 bits */ - int32_t last_section_number; /* 56-63 : 8 bits */ -} TS_SECTION_HEADER; - -typedef struct { - TS_SECTION_HEADER hdr; - uint8_t *raw; - uint8_t *data; - uint8_t *tail; -} TS_SECTION; - -#endif /* TS_COMMON_TYPES_H */
--- a/arib25/src/ts_section_parser.c Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,802 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -#include "ts_section_parser.h" -#include "ts_section_parser_error_code.h" - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - inner structures - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -typedef struct { - void *prev; - void *next; - TS_SECTION sect; - int32_t ref; -} TS_SECTION_ELEM; - -typedef struct { - TS_SECTION_ELEM *head; - TS_SECTION_ELEM *tail; - int32_t count; -} TS_SECTION_LIST; - -typedef struct { - - int32_t pid; - - TS_SECTION_ELEM *work; - TS_SECTION_ELEM *last; - - TS_SECTION_LIST pool; - TS_SECTION_LIST buff; - - TS_SECTION_PARSER_STAT stat; - -} TS_SECTION_PARSER_PRIVATE_DATA; - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - constant values - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -#define MAX_RAW_SECTION_SIZE 4100 - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function prottypes (interface method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static void release_ts_section_parser(void *parser); -static int reset_ts_section_parser(void *parser); -static int put_ts_section_parser(void *parser, TS_HEADER *hdr, uint8_t *data, int size); -static int get_ts_section_parser(void *parser, TS_SECTION *sect); -static int ret_ts_section_parser(void *parser, TS_SECTION *sect); -static int get_count_ts_section_parser(void *parser); -static int get_stat_ts_section_parser(void *parser, TS_SECTION_PARSER_STAT *stat); - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - global function implementation (factory method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -TS_SECTION_PARSER *create_ts_section_parser() -{ - TS_SECTION_PARSER *r; - TS_SECTION_PARSER_PRIVATE_DATA *prv; - - int n; - - n = sizeof(TS_SECTION_PARSER_PRIVATE_DATA); - n += sizeof(TS_SECTION_PARSER); - - prv = (TS_SECTION_PARSER_PRIVATE_DATA *)calloc(1, n); - if(prv == NULL){ - /* failed on malloc() - no enough memory */ - return NULL; - } - - prv->pid = -1; - - r = (TS_SECTION_PARSER *)(prv+1); - r->private_data = prv; - - r->release = release_ts_section_parser; - r->reset = reset_ts_section_parser; - - r->put = put_ts_section_parser; - r->get = get_ts_section_parser; - r->ret = ret_ts_section_parser; - - r->get_count = get_count_ts_section_parser; - - r->get_stat = get_stat_ts_section_parser; - - return r; -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function prottypes (private method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static TS_SECTION_PARSER_PRIVATE_DATA *private_data(void *parser); -static void teardown(TS_SECTION_PARSER_PRIVATE_DATA *prv); - -static int put_exclude_section_start(TS_SECTION_PARSER_PRIVATE_DATA *prv, uint8_t *data, int size); -static int put_include_section_start(TS_SECTION_PARSER_PRIVATE_DATA *prv, uint8_t *data, int size); - -static void reset_section(TS_SECTION *sect); -static void append_section_data(TS_SECTION *sect, uint8_t *data, int size); -static int check_section_complete(TS_SECTION *sect); - -static int compare_elem_section(TS_SECTION_ELEM *a, TS_SECTION_ELEM *b); - -static void cancel_elem_empty(TS_SECTION_PARSER_PRIVATE_DATA *prv, TS_SECTION_ELEM *elem); -static void cancel_elem_error(TS_SECTION_PARSER_PRIVATE_DATA *prv, TS_SECTION_ELEM *elem); -static void cancel_elem_same(TS_SECTION_PARSER_PRIVATE_DATA *prv, TS_SECTION_ELEM *elem); -static void commit_elem_updated(TS_SECTION_PARSER_PRIVATE_DATA *prv, TS_SECTION_ELEM *elem); - -static TS_SECTION_ELEM *query_work_elem(TS_SECTION_PARSER_PRIVATE_DATA *prv); - -static void extract_ts_section_header(TS_SECTION *sect); - -static TS_SECTION_ELEM *create_ts_section_elem(); -static TS_SECTION_ELEM *get_ts_section_list_head(TS_SECTION_LIST *list); -static void put_ts_section_list_tail(TS_SECTION_LIST *list, TS_SECTION_ELEM *elem); -static void unlink_ts_section_list(TS_SECTION_LIST *list, TS_SECTION_ELEM *elem); -static void clear_ts_section_list(TS_SECTION_LIST *list); - -static uint32_t crc32(uint8_t *head, uint8_t *tail); - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function implementation (interface method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static void release_ts_section_parser(void *parser) -{ - TS_SECTION_PARSER_PRIVATE_DATA *prv; - - prv = private_data(parser); - if(prv == NULL){ - return; - } - - teardown(prv); - - memset(parser, 0, sizeof(TS_SECTION_PARSER)); - free(prv); -} - -static int reset_ts_section_parser(void *parser) -{ - TS_SECTION_PARSER_PRIVATE_DATA *prv; - - prv = private_data(parser); - if(prv == NULL){ - return TS_SECTION_PARSER_ERROR_INVALID_PARAM; - } - - teardown(prv); - - return 0; -} - -static int put_ts_section_parser(void *parser, TS_HEADER *hdr, uint8_t *data, int size) -{ - TS_SECTION_PARSER_PRIVATE_DATA *prv; - - prv = private_data(parser); - if( (prv == NULL) || (hdr == NULL) || (data == NULL) || (size < 1) ){ - return TS_SECTION_PARSER_ERROR_INVALID_PARAM; - } - - if( (prv->pid >= 0) && (prv->pid != hdr->pid) ){ - return TS_SECTION_PARSER_ERROR_INVALID_TS_PID; - } - - prv->pid = hdr->pid; - - if(hdr->payload_unit_start_indicator == 0){ - /* exclude section start */ - return put_exclude_section_start(prv, data, size); - }else{ - /* include section start */ - return put_include_section_start(prv, data, size); - } -} - -static int get_ts_section_parser(void *parser, TS_SECTION *sect) -{ - TS_SECTION_PARSER_PRIVATE_DATA *prv; - TS_SECTION_ELEM *w; - - prv = private_data(parser); - if( (prv == NULL) || (sect == NULL) ){ - return TS_SECTION_PARSER_ERROR_INVALID_PARAM; - } - - w = get_ts_section_list_head(&(prv->buff)); - if(w == NULL){ - memset(sect, 0, sizeof(TS_SECTION)); - return TS_SECTION_PARSER_ERROR_NO_SECTION_DATA; - } - - memcpy(sect, &(w->sect), sizeof(TS_SECTION)); - put_ts_section_list_tail(&(prv->pool), w); - - return 0; -} - -static int ret_ts_section_parser(void *parser, TS_SECTION *sect) -{ - TS_SECTION_PARSER_PRIVATE_DATA *prv; - TS_SECTION_ELEM *w; - - prv = private_data(parser); - if( (prv == NULL) || (sect == NULL) ){ - return TS_SECTION_PARSER_ERROR_INVALID_PARAM; - } - - w = prv->pool.tail; - while(w != NULL){ - if(w->sect.data == sect->data){ - break; - } - w = (TS_SECTION_ELEM *)(w->prev); - } - - if( (w != NULL) && (w->ref > 0) ){ - w->ref -= 1; - } - - return 0; -} - -static int get_count_ts_section_parser(void *parser) -{ - TS_SECTION_PARSER_PRIVATE_DATA *prv; - - prv = private_data(parser); - if(prv == NULL){ - return TS_SECTION_PARSER_ERROR_INVALID_PARAM; - } - - return prv->buff.count; -} - -static int get_stat_ts_section_parser(void *parser, TS_SECTION_PARSER_STAT *stat) -{ - TS_SECTION_PARSER_PRIVATE_DATA *prv; - - prv = private_data(parser); - if( (prv == NULL) || (stat == NULL) ){ - return TS_SECTION_PARSER_ERROR_INVALID_PARAM; - } - - memcpy(stat, &(prv->stat), sizeof(TS_SECTION_PARSER_STAT)); - - return 0; -} - -/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - function implementation (private method) - ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -static TS_SECTION_PARSER_PRIVATE_DATA *private_data(void *parser) -{ - TS_SECTION_PARSER_PRIVATE_DATA *r; - TS_SECTION_PARSER *p; - - p = (TS_SECTION_PARSER *)parser; - if(p == NULL){ - return NULL; - } - - r = (TS_SECTION_PARSER_PRIVATE_DATA *)(p->private_data); - if( ((void *)(r+1)) != parser ){ - return NULL; - } - - return r; -} - -static void teardown(TS_SECTION_PARSER_PRIVATE_DATA *prv) -{ - prv->pid = -1; - - if(prv->work != NULL){ - free(prv->work); - prv->work = NULL; - } - - prv->last = NULL; - - clear_ts_section_list(&(prv->pool)); - clear_ts_section_list(&(prv->buff)); - - memset(&(prv->stat), 0, sizeof(TS_SECTION_PARSER_STAT)); -} - -static int put_exclude_section_start(TS_SECTION_PARSER_PRIVATE_DATA *prv, uint8_t *data, int size) -{ - TS_SECTION_ELEM *w; - - w = prv->work; - if( (w == NULL) || (w->sect.raw == w->sect.tail) ){ - /* no previous data */ - return 0; - } - - append_section_data(&(w->sect), data, size); - if(check_section_complete(&(w->sect)) == 0){ - /* need more data */ - return 0; - } - - prv->work = NULL; - - if( (w->sect.hdr.section_syntax_indicator != 0) && - (crc32(w->sect.raw, w->sect.tail) != 0) ){ - cancel_elem_error(prv, w); - return TS_SECTION_PARSER_WARN_CRC_MISSMATCH; - } - - if(compare_elem_section(w, prv->last) == 0){ - /* same section data */ - cancel_elem_same(prv, w); - return 0; - } - - commit_elem_updated(prv, w); - return 0; -} - -static int put_include_section_start(TS_SECTION_PARSER_PRIVATE_DATA *prv, uint8_t *data, int size) -{ - TS_SECTION_ELEM *w; - - int pointer_field; - - uint8_t *p; - uint8_t *tail; - - int r; - int length; - - p = data; - tail = p + size; - - r = 0; - - pointer_field = p[0]; - p += 1; - - if( (p+pointer_field) >= tail ){ - /* input data is probably broken */ - w = prv->work; - prv->work = NULL; - if(w != NULL) { - if(w->sect.raw != w->sect.tail){ - cancel_elem_error(prv, w); - return TS_SECTION_PARSER_WARN_LENGTH_MISSMATCH; - } - cancel_elem_empty(prv, w); - } - return 0; - } - - if(pointer_field > 0){ - r = put_exclude_section_start(prv, p, pointer_field); - if(r < 0){ - return r; - } - p += pointer_field; - } - - w = prv->work; - prv->work = NULL; - - if(w != NULL){ - if(w->sect.raw != w->sect.tail){ - cancel_elem_error(prv, w); - r = TS_SECTION_PARSER_WARN_LENGTH_MISSMATCH; - }else{ - cancel_elem_empty(prv, w); - } - w = NULL; - } - - do { - - w = query_work_elem(prv); - if(w == NULL){ - return TS_SECTION_PARSER_ERROR_NO_ENOUGH_MEMORY; - } - - append_section_data(&(w->sect), p, tail-p); - if(check_section_complete(&(w->sect)) == 0){ - /* need more data */ - prv->work = w; - return 0; - } - length = (w->sect.tail - w->sect.raw); - - if( (w->sect.hdr.section_syntax_indicator != 0) && - (crc32(w->sect.raw, w->sect.tail) != 0) ){ - cancel_elem_error(prv, w); - r = TS_SECTION_PARSER_WARN_CRC_MISSMATCH; - }else if(compare_elem_section(w, prv->last) == 0){ - cancel_elem_same(prv, w); - }else{ - commit_elem_updated(prv, w); - } - - p += length; - - } while ( (p < tail) && (p[0] != 0xff) ); - - return r; -} - -static void reset_section(TS_SECTION *sect) -{ - memset(&(sect->hdr), 0, sizeof(TS_SECTION_HEADER)); - sect->tail = sect->raw; - sect->data = NULL; -} - -static void append_section_data(TS_SECTION *sect, uint8_t *data, int size) -{ - int m,n; - - m = sect->tail - sect->raw; - n = MAX_RAW_SECTION_SIZE - m; - - if(size < n){ - n = size; - } - memcpy(sect->tail, data, n); - sect->tail += n; - m += n; - - if(sect->data == NULL){ - extract_ts_section_header(sect); - } - - if(sect->data == NULL){ - /* need more data */ - return; - } - - n = sect->hdr.section_length + 3; - if(m > n){ - sect->tail = sect->raw + n; - } - - return; -} - -static int check_section_complete(TS_SECTION *sect) -{ - int m,n; - - if(sect->data == NULL){ - return 0; - } - - m = sect->tail - sect->raw; - n = sect->hdr.section_length + 3; - - if(n > m){ - return 0; - } - - return 1; -} - -static int compare_elem_section(TS_SECTION_ELEM *a, TS_SECTION_ELEM *b) -{ - int m,n; - - if( (a == NULL) || (b == NULL) ){ - return 1; - } - - m = a->sect.tail - a->sect.raw; - n = b->sect.tail - b->sect.raw; - if( m != n ){ - return 1; - } - - if(memcmp(a->sect.raw, b->sect.raw, m) != 0){ - return 1; - } - - return 0; -} - -static void cancel_elem_empty(TS_SECTION_PARSER_PRIVATE_DATA *prv, TS_SECTION_ELEM *elem) -{ - reset_section(&(elem->sect)); - elem->ref = 0; - put_ts_section_list_tail(&(prv->pool), elem); -} - -static void cancel_elem_error(TS_SECTION_PARSER_PRIVATE_DATA *prv, TS_SECTION_ELEM *elem) -{ - reset_section(&(elem->sect)); - elem->ref = 0; - put_ts_section_list_tail(&(prv->pool), elem); - prv->stat.total += 1; - prv->stat.error += 1; -} - -static void cancel_elem_same(TS_SECTION_PARSER_PRIVATE_DATA *prv, TS_SECTION_ELEM *elem) -{ - reset_section(&(elem->sect)); - elem->ref = 0; - put_ts_section_list_tail(&(prv->pool), elem); - prv->stat.total +=1; -} - -static void commit_elem_updated(TS_SECTION_PARSER_PRIVATE_DATA *prv, TS_SECTION_ELEM *elem) -{ - if( (prv->last != NULL) && (prv->last->ref > 0) ){ - prv->last->ref -= 1; - } - - elem->ref = 2; - prv->last = elem; - put_ts_section_list_tail(&(prv->buff), elem); - prv->stat.total += 1; - prv->stat.unique += 1; -} - -static TS_SECTION_ELEM *query_work_elem(TS_SECTION_PARSER_PRIVATE_DATA *prv) -{ - TS_SECTION_ELEM *r; - - r = prv->pool.head; - while(r != NULL){ - if(r->ref < 1){ - break; - } - r = (TS_SECTION_ELEM *)(r->next); - } - - if(r != NULL){ - unlink_ts_section_list(&(prv->pool), r); - reset_section(&(r->sect)); - r->ref = 0; - return r; - } - - return create_ts_section_elem(); -} - -static void extract_ts_section_header(TS_SECTION *sect) -{ - int size; - uint8_t *p; - - sect->data = NULL; - - size = sect->tail - sect->raw; - if(size < 3){ - /* need more data */ - return; - } - - p = sect->raw; - - sect->hdr.table_id = p[0]; - sect->hdr.section_syntax_indicator = (p[1] >> 7) & 0x01; - sect->hdr.private_indicator = (p[1] >> 6) & 0x01; - sect->hdr.section_length =((p[1] << 8) | p[2]) & 0x0fff; - - if(sect->hdr.section_syntax_indicator == 0){ - /* short format section header */ - sect->data = p+3; - return; - } - - /* long format section header */ - - if(size < 8){ - /* need more data */ - return; - } - - sect->hdr.table_id_extension =((p[3] << 8) | p[4]); - sect->hdr.version_number = (p[5] >> 1) & 0x1f; - sect->hdr.current_next_indicator = p[5] & 0x01; - sect->hdr.section_number = p[6]; - sect->hdr.last_section_number = p[7]; - - sect->data = p+8; - - return; -} - -static TS_SECTION_ELEM *create_ts_section_elem() -{ - TS_SECTION_ELEM *r; - int n; - - n = sizeof(TS_SECTION_ELEM) + MAX_RAW_SECTION_SIZE; - r = (TS_SECTION_ELEM *)calloc(1, n); - if(r == NULL){ - /* failed on malloc() */ - return NULL; - } - - r->sect.raw = (uint8_t *)(r+1); - r->sect.tail = r->sect.raw; - - return r; -} - -static TS_SECTION_ELEM *get_ts_section_list_head(TS_SECTION_LIST *list) -{ - TS_SECTION_ELEM *r; - - if(list == NULL){/* invalid param */ - return NULL; - } - - r = list->head; - if(r == NULL){ - return NULL; - } - - list->head = (TS_SECTION_ELEM *)(r->next); - if(list->head != NULL){ - list->head->prev = NULL; - list->count -= 1; - }else{ - list->tail = NULL; - list->count = 0; - } - - r->next = NULL; - - return r; -} - -static void put_ts_section_list_tail(TS_SECTION_LIST *list, TS_SECTION_ELEM *elem) -{ - if( (list == NULL) || (elem == NULL) ){ - /* invalid param */ - return; - } - - if(list->tail != NULL){ - elem->prev = list->tail; - elem->next = NULL; - list->tail->next = elem; - list->tail = elem; - list->count += 1; - }else{ - elem->prev = NULL; - elem->next = NULL; - list->head = elem; - list->tail = elem; - list->count = 1; - } -} - -static void unlink_ts_section_list(TS_SECTION_LIST *list, TS_SECTION_ELEM *elem) -{ - TS_SECTION_ELEM *prev; - TS_SECTION_ELEM *next; - - if( (list == NULL) || (elem == NULL) ){ - /* invalid param */ - return; - } - - prev = (TS_SECTION_ELEM *)(elem->prev); - next = (TS_SECTION_ELEM *)(elem->next); - - if(prev != NULL){ - prev->next = next; - }else{ - list->head = next; - } - if(next != NULL){ - next->prev = prev; - }else{ - list->tail = prev; - } - list->count -= 1; -} - -static void clear_ts_section_list(TS_SECTION_LIST *list) -{ - TS_SECTION_ELEM *e; - TS_SECTION_ELEM *n; - - if(list == NULL){ /* invalid param */ - return; - } - - e = list->head; - while(e != NULL){ - n = (TS_SECTION_ELEM *)(e->next); - free(e); - e = n; - } - - list->head = NULL; - list->tail = NULL; - list->count = 0; -} - -static uint32_t crc32(uint8_t *head, uint8_t *tail) -{ - uint32_t crc; - uint8_t *p; - - static const uint32_t table[256] = { - 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, - 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, - 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, - 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, - - 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, - 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75, - 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, - 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD, - - 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039, - 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, - 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81, - 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D, - - 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, - 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95, - 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, - 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, - - 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE, - 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072, - 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, - 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA, - - 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE, - 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02, - 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066, - 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA, - - 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, - 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692, - 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6, - 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A, - - 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E, - 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2, - 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, - 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A, - - 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637, - 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, - 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, - 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53, - - 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, - 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B, - 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF, - 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, - - 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, - 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B, - 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, - 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3, - - 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, - 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, - 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F, - 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3, - - 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, - 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C, - 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8, - 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24, - - 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30, - 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC, - 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, - 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654, - - 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0, - 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C, - 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18, - 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4, - - 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, - 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C, - 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, - 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4, - }; - - crc = 0xffffffff; - - p = head; - while(p < tail){ - crc = (crc << 8) ^ table[ ((crc >> 24) ^ p[0]) & 0xff ]; - p += 1; - } - - return crc; -} -
--- a/arib25/src/ts_section_parser.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -#ifndef TS_SECTION_PARSER_H -#define TS_SECTION_PARSER_H - -#include "ts_common_types.h" - -typedef struct { - int64_t total; /* total received section count */ - int64_t unique; /* unique section count */ - int64_t error; /* crc and other error section count */ -} TS_SECTION_PARSER_STAT; - -typedef struct { - - void *private_data; - - void (* release)(void *parser); - - int (* reset)(void *parser); - - int (* put)(void *parser, TS_HEADER *hdr, uint8_t *data, int size); - int (* get)(void *parser, TS_SECTION *sect); - int (* ret)(void *parser, TS_SECTION *sect); - - int (* get_count)(void *parser); - - int (* get_stat)(void *parser, TS_SECTION_PARSER_STAT *stat); - -} TS_SECTION_PARSER; - -#ifdef __cplusplus -extern "C" { -#endif - -extern TS_SECTION_PARSER *create_ts_section_parser(); - -#ifdef __cplusplus -} -#endif - -#endif /* TS_SECTION_PARSER_H */
--- a/arib25/src/ts_section_parser_error_code.h Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -#ifndef TS_SECTION_PARSER_ERROR_CODE_H -#define TS_SECTION_PARESR_ERROR_CODE_H - -#define TS_SECTION_PARSER_ERROR_INVALID_PARAM -1 -#define TS_SECTION_PARSER_ERROR_NO_ENOUGH_MEMORY -2 -#define TS_SECTION_PARSER_ERROR_INVALID_TS_PID -3 -#define TS_SECTION_PARSER_ERROR_NO_SECTION_DATA -4 - -#define TS_SECTION_PARSER_WARN_CRC_MISSMATCH 1 -#define TS_SECTION_PARSER_WARN_LENGTH_MISSMATCH 2 - -#endif /* TS_SECTION_PARSER_ERROR_CODE_H */
--- a/b25_docs/libccid_Info.plist Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,368 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>CFBundleDevelopmentRegion</key> - <string>English</string> - <key>CFBundleInfoDictionaryVersion</key> - <string>6.0</string> - <key>CFBundlePackageType</key> - <string>BNDL</string> - <key>CFBundleSignature</key> - <string>????</string> - <key>CFBundleVersion</key> - <string>0.0.1d1</string> - <key>ifdCapabilities</key> - <string>0x00000001</string> - - <!-- Possible values for ifdCapabilities bits - 1: IFD_GENERATE_HOTPLUG - plugging the reader calls pcscd \-\-hotplug - - Default value is 0x00000001 - --> - - <key>ifdProtocolSupport</key> - <string>0x00000001</string> - <key>ifdVersionNumber</key> - <string>0x00000001</string> - - <key>ifdLogLevel</key> - <string>0x0003</string> - - <!-- Possible values for ifdLogLevel - 1: CRITICAL important error messages - 2: INFO informative messages like what reader was detected - 4: COMM a dump of all the bytes exchanged between the host and - the reader - 8: PERIODIC periodic info when pcscd test if a card is present - (every 1/10 of a second) - - The final value is a OR of these values - - Default value: 3 (CRITICAL + INFO) - --> - - <key>ifdDriverOptions</key> - <string>0x0000</string> - - <!-- Possible values for ifdDriverOptions - 1: DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED - the CCID Exchange command is allowed. You can use it through - SCardControl(hCard, IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE, ...) - - 2: DRIVER_OPTION_GEMPC_TWIN_KEY_APDU - If set the GemPC Twin and GemPC Key readers with be configured - so that the T=1 TPDU protocol is done by the firmware instead of - the driver. - This switches the reader in APDU mode and also in EMV mode so - may not work with non EMV cards. - - 4: DRIVER_OPTION_USE_BOGUS_FIRMWARE - Some reader firmwares have bugs. By default the driver refuses - to work with such firmware versions. If your reader is rejected - because of the firmware (log message: "Firmware (x.y) is - bogus!") you can: - - upgrade your reader firmware (not all readers can do that) - or - - get another reader with a new/bugfree firmware - or - - activate this option but you will have problems depending on - the bug - - 8: DRIVER_OPTION_RESET_ON_CLOSE - This option may be required on Linux 2.4 so that the - device reset if sequencial (bSeq) counter and can be - reused if pcscd restart. Otherwise the reader needs to - be unplugged/replugged. - - bits 4 & 5: (values 0, 16, 32, 48) - 0: power on the card at 5V (default value) - 16: power on the card at 3V and then, it 3V fails use 5V - 32: power on the card at 1.8V, then 3V and then 5V - 48: let the reader decide - - Default value: 0 - --> - - <key>CFBundleExecutable</key> - <string>libccid.so.1.3.1</string> - - <key>ifdManufacturerString</key> - <string>Ludovic Rousseau (ludovic.rousseau@free.fr)</string> - - <key>ifdProductString</key> - <string>Generic CCID driver v1.3.1</string> - - <key>ifdVendorID</key> - <array> - <string>0x08E6</string> - <string>0x08E6</string> - <string>0x08E6</string> - <string>0x08E6</string> - <string>0x08E6</string> - <string>0x08E6</string> - <string>0x08E6</string> - <string>0x08E6</string> - <string>0x08E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x04E6</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x076B</string> - <string>0x0783</string> - <string>0x0783</string> - <string>0x0783</string> - <string>0x0783</string> - <string>0x0783</string> - <string>0x0783</string> - <string>0x09C3</string> - <string>0x09C3</string> - <string>0x047B</string> - <string>0x413c</string> - <string>0x413c</string> - <string>0x046a</string> - <string>0x046a</string> - <string>0x046a</string> - <string>0x046a</string> - <string>0x072f</string> - <string>0x0b97</string> - <string>0x0b97</string> - <string>0x0D46</string> - <string>0x0D46</string> - <string>0x0d46</string> - <string>0x0d46</string> - <string>0x0d46</string> - <string>0x0d46</string> - <string>0x073D</string> - <string>0x073D</string> - <string>0x073D</string> - <string>0x073D</string> - <string>0x073D</string> - <string>0x0DC3</string> - <string>0x0DC3</string> - <string>0x09BE</string> - <string>0x0416</string> - <string>0x03F0</string> - <string>0x03F0</string> - <string>0x0B81</string> - <string>0x058F</string> - <string>0x058F</string> - <string>0x15E1</string> - <string>0x0BF8</string> - <string>0x0BF8</string> - <string>0x0DF6</string> - <string>0x0973</string> - <string>0x0471</string> - <string>0x04B9</string> - <string>0x1059</string> - <string>0x1059</string> - <string>0x17EF</string> - <string>0x19E7</string> - <string>0x09C3</string> - <string>0x0783</string> - <string>0x0C4B</string> - </array> - - <key>ifdProductID</key> - <array> - <string>0x3437</string> - <string>0x3438</string> - <string>0x4433</string> - <string>0x3478</string> - <string>0x3479</string> - <string>0x3480</string> - <string>0x34EC</string> - <string>0xACE0</string> - <string>0x1359</string> - <string>0x5111</string> - <string>0x5113</string> - <string>0x5115</string> - <string>0x5116</string> - <string>0x5117</string> - <string>0x5119</string> - <string>0x511A</string> - <string>0x511C</string> - <string>0x511D</string> - <string>0x5120</string> - <string>0x5121</string> - <string>0xE001</string> - <string>0x5410</string> - <string>0xE003</string> - <string>0x1021</string> - <string>0x3021</string> - <string>0x3621</string> - <string>0x3821</string> - <string>0x4321</string> - <string>0x5121</string> - <string>0x5125</string> - <string>0x5321</string> - <string>0x6622</string> - <string>0xA022</string> - <string>0x0006</string> - <string>0x0007</string> - <string>0x0008</string> - <string>0x0009</string> - <string>0x0010</string> - <string>0x9002</string> - <string>0x0013</string> - <string>0x0014</string> - <string>0x020B</string> - <string>0x2100</string> - <string>0X2101</string> - <string>0x0005</string> - <string>0x0010</string> - <string>0x002D</string> - <string>0x003E</string> - <string>0x90cc</string> - <string>0x7762</string> - <string>0x7772</string> - <string>0x3001</string> - <string>0x3002</string> - <string>0x3003</string> - <string>0x3010</string> - <string>0x4000</string> - <string>0x4001</string> - <string>0x0B00</string> - <string>0x0C00</string> - <string>0x0C01</string> - <string>0x0007</string> - <string>0x0008</string> - <string>0x1004</string> - <string>0x1102</string> - <string>0x0002</string> - <string>0x3815</string> - <string>0x1024</string> - <string>0x0824</string> - <string>0x0200</string> - <string>0x9520</string> - <string>0x9522</string> - <string>0x2007</string> - <string>0x1005</string> - <string>0x1006</string> - <string>0x800A</string> - <string>0x0003</string> - <string>0x040F</string> - <string>0x1400</string> - <string>0x000C</string> - <string>0x000D</string> - <string>0x1003</string> - <string>0x0002</string> - <string>0x0008</string> - <string>0x0003</string> - <string>0x0300</string> - </array> - - <key>ifdFriendlyName</key> - <array> - <string>Gemplus GemPC Twin</string> - <string>Gemplus GemPC Key</string> - <string>Gemplus GemPC433 SL</string> - <string>Gemplus GemPC Pinpad</string> - <string>Gemplus GemCore POS Pro</string> - <string>Gemplus GemCore SIM Pro</string> - <string>Gemplus GemPC Express</string> - <string>Verisign Secure Token</string> - <string>VeriSign Secure Storage Token</string> - <string>SCM SCR 331-DI</string> - <string>SCM SCR 333</string> - <string>SCM SCR 335</string> - <string>SCM SCR 3310</string> - <string>SCM SCR 3320</string> - <string>SCM SCR 3340 ExpressCard54</string> - <string>SCM SCR 3310 NTTCom</string> - <string>Axalto Reflex USB v3</string> - <string>SCM SCR 3311</string> - <string>SCM SCR 331-DI NTTCom</string> - <string>SCM SDI 010</string> - <string>SCM SCR 331</string> - <string>SCM SCR 355</string> - <string>SCM SPR 532</string> - <string>OmniKey CardMan 1021</string> - <string>OmniKey CardMan 3121</string> - <string>OmniKey CardMan 3621</string> - <string>OmniKey CardMan 3821</string> - <string>OmniKey CardMan 4321</string> - <string>OmniKey CardMan 5121</string> - <string>OmniKey CardMan 5125</string> - <string>OmniKey CardMan 5321</string> - <string>OmniKey CardMan 6121</string> - <string>Teo by Xiring</string> - <string>C3PO LTC31</string> - <string>C3PO TLTC2USB</string> - <string>C3PO LTC32 USBv2 with keyboard support</string> - <string>C3PO KBR36</string> - <string>C3PO LTC32</string> - <string>C3PO TLTC2USB</string> - <string>ActivCard USB Reader 3.0</string> - <string>Activkey Sim</string> - <string>Silitek SK-3105</string> - <string>Dell keyboard SK-3106</string> - <string>Dell smart card reader keyboard</string> - <string>Cherry XX33</string> - <string>Cherry XX44</string> - <string>Cherry ST1044U</string> - <string>Cherry SmartTerminal ST-2XXX</string> - <string>ACS ACR 38U-CCID</string> - <string>O2 Micro Oz776</string> - <string>O2 Micro Oz776</string> - <string>KOBIL KAAN Base</string> - <string>KOBIL KAAN Advanced</string> - <string>KOBIL KAAN SIM III</string> - <string>KOBIL EMV CAP - SecOVID Reader III</string> - <string>KOBIL mIDentity</string> - <string>KOBIL mIDentity</string> - <string>Eutron Digipass 860</string> - <string>Eutron SIM Pocket Combo</string> - <string>Eutron Smart Pocket</string> - <string>Eutron CryptoIdentity</string> - <string>Eutron CryptoIdentity</string> - <string>Athena ASE IIIe</string> - <string>Athena ASEDrive IIIe KB</string> - <string>SmartEpad</string> - <string>Winbond</string> - <string>HP USB Smart Card Keyboard</string> - <string>HP USB Smartcard Reader</string> - <string>id3 CL1356D</string> - <string>Alcor Micro AU9520</string> - <string>Alcor Micro AU9522</string> - <string>RSA SecurID</string> - <string>Fujitsu Siemens SmartCard Keyboard USB 2A</string> - <string>Fujitsu Siemens SmartCard USB 2A</string> - <string>Sitecom USB simcard reader MD-010</string> - <string>SchlumbergerSema Cyberflex Access</string> - <string>Philips JCOP41V221</string> - <string>SafeNet IKey4000</string> - <string>G&D CardToken 350</string> - <string>G&D CardToken 550</string> - <string>Lenovo Integrated Smart Card Reader</string> - <string>Charismathics token</string> - <string>ActivCard USB Reader 2.0</string> - <string>C3PO LTC31</string> - <string>Reiner-SCT cyberJack pinpad(a)</string> - </array> - - <key>Copyright</key> - <string>This driver is protected by terms of the GNU Lesser General Public License version 2.1, or (at your option) any later version.</string> - -</dict> -</plist>
--- a/b25_docs/readme.txt Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -b25.exe ver.0.2.1 ‚ÌLinux‘Ήž”Å‚Å‚·B -arib25ƒfƒBƒŒƒNƒgƒŠ‚Åmake‚Æ‘Å‚Ä‚Îarib25/src/b25‚Ƀrƒ‹ƒh‚³‚ê‚Ü‚·B -Žg—pƒ‰ƒCƒuƒ‰ƒŠ‚ÍPCSC-Lite(http://pcsclite.alioth.debian.org/)‚ÅAƒJ[ƒhƒŠ[ƒ_‚ªŽg—p‰Â”\‚Èó‘Ô‚É‚È‚Á‚Ä‚¢‚邱‚Æ‚ª•K—v‚Å‚·B -Windows‚Å‚Í“S”‚ÌHX-520UJJ‚ÍLinux‚Å‚ÍŽg—p‚Å‚«‚È‚¢‚Ì‚Å’ˆÓ‚ª•K—v‚Å‚·B -NTTCom‚ÌSCR3310-NTTCom‹y‚Ñathena-scs.hs.shopserve.jp/SHOP/RW001.html‚Å“®ì•ñ‚ª‚ ‚è‚Ü‚·B -B-CASƒJ[ƒh‚Ì•\— ‚É’ˆÓ‚µ‚ĉº‚³‚¢Bƒ`ƒbƒv‚ª‚ ‚é–Ê‚ªã‚Å‚·B -‰Šú”Å‚Ì”’–}“à‘ ‚̃J[ƒhƒŠ[ƒ_‚ðŽg—p‚·‚éꇂÍAPCSC-Lite‚̃y[ƒW‚É‚ ‚éCCID driver‚ðŽg—p‚µA -/etc/libccid_Info.plist“à‚Ì -==== - <key>ifdVendorID</key> - <array> - <string>0xXXXX</string> - —ª - </array> - - <key>ifdProductID</key> - <array> - <string>0xXXXX</string> - —ª - </array> - - <key>ifdFriendlyName</key> - <array> - <string>XXXXXXXXXXXXXXXXXX</string> - —ª - </array> -==== -‚ð‚±‚Ìzip“à‚É‚ ‚铯–¼‚̃tƒ@ƒCƒ‹‚Ì“¯‚¶•”•ª‚Æ“ü‚ê‘Ö‚¦‚ĉº‚³‚¢B -¦‚±‚̃tƒ@ƒCƒ‹ˆÊ’u‚ÍDebianˆË‘¶‚©‚à‚µ‚ê‚Ü‚¹‚ñB - Gentoo‚Å‚Í/usr/lib/readers/usb/ifd-ccid.bundle/Contents/Info.plist‚É‚ ‚Á‚½‚Æ‚¢‚¤•ñ‚ª‚ ‚è‚Ü‚µ‚½B -•–}‹y‚ÑÅ‹ß‚Ì”’–}‚ł̓J[ƒhƒŠ[ƒ_‚ª•Ï‚í‚Á‚Ä‚¢‚éˆ×A/etc/libccid_Info.plist‚Ì•ÏX‚Í•s—v‚Å‚·B - -smartcard_list.txt‚ÍPCSC-Lite‚ÉŠÜ‚Ü‚ê‚épcsc_scan—p‚Å‚·B -PCSC-Lite‚̃tƒ@ƒCƒ‹‚Æ’u‚«Š·‚¦‚é‚ÆB-CAS‚ªB-CAS‚Æ‚µ‚Ä”FŽ¯‚³‚ê‚Ü‚·B - -PCSC-Lite‚ÌAPI‚ªWindowsƒXƒ}[ƒgƒJ[ƒhƒAƒNƒZƒX—pAPI‚ƌ݊·‚Å‚ ‚Á‚½ˆ×A -‚Ù‚ÚLinux‚ŃRƒ“ƒpƒCƒ‹ƒGƒ‰[‚É‚È‚é•”•ª‚̑Έ‚Ì‚Ý‚Å‚·B -ver.0.2.0‚æ‚è32bitŠÂ‹«‚Å2Gbyteƒtƒ@ƒCƒ‹‚Ì–â‘肪‚È‚‚È‚Á‚½‚Í‚¸‚Å‚·B64bitŠÂ‹«‚Å‚Í2GbyteˆÈã‚̃tƒ@ƒCƒ‹‚ðˆ—o—ˆ‚邱‚Æ‚ðŠm”F‚µ‚Ä‚¢‚Ü‚·B - -PCSC-Lite‚ÉŠÜ‚Ü‚ê‚éDWORD“™‚Ì’è‹`‚Í”ñ32bitŠÂ‹«‚Ìꇂɖâ‘肪‚ ‚è‚Ü‚·‚ªAŠÖŒW‚È‚“®‚«‚Ü‚µ‚½B - -•ÏX“_: -ver.0.1.2‚ɑ΂·‚éƒpƒbƒ`‚Åopen‚̈ø”‚ðí‚Á‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½‰ÓŠ‚ðŒ³‚É–ß‚µ‚Ü‚µ‚½B -ver.0.1.5‚Åo—̓tƒ@ƒCƒ‹‚̃p[ƒ~ƒbƒVƒ‡ƒ“‚ª“K“–‚·‚¬‚½‚̂𒼂µ‚Ü‚µ‚½Bumask‚É]‚¤‚悤‚É‚È‚Á‚Ä‚¢‚é‚Í‚¸‚Å‚·B -ver.0.2.0‚ÅA32bitLinuxã‚Å2GByteˆÈã‚̃tƒ@ƒCƒ‹‚ªˆ—‚Å‚«‚È‚¢ƒoƒO‚ðC³‚µ‚½‚Í‚¸‚Å‚·B - -extrecd‚ðŽg—p‚µ‚Ä‚¢‚é•û‚Ö‚Ì’ˆÓ“_: -b25‚̌ĂÑo‚µŽž‚É-p 0 -v 0ƒIƒvƒVƒ‡ƒ“‚ð•t‚¯‚é•K—v‚ª‚ ‚è‚Ü‚·(b25‚©‚牽‚©o—Í‚ª‚ ‚ê‚΃Gƒ‰[‚Æ‚Ý‚È‚µ‚Ä‚¢‚éˆ×)BˆÈ‰º‚ÌC³‚ðs‚È‚Á‚ĉº‚³‚¢B -430s–Ú -my @b25_cmd = (@b25_prefix, $path_b25, $target_encts, $target_ts); -« -my @b25_cmd = (@b25_prefix, $path_b25, "-p", "0", "-v", "0", $target_encts, $target_ts); - -ƒ‰ƒCƒZƒ“ƒX: -‚±‚̃\[ƒX‚Í‚Ü‚é‚àŽì¬‚Ìb25‚Ù‚Ú‚»‚Ì‚Ü‚Ü‚È‚Ì‚ÅA‚Ü‚é‚àŽ‚Ì”»’f‚É]‚¢‚Ü‚·B -‚æ‚Á‚Äarib25/readme.txt‚É‚ ‚éƒIƒŠƒWƒiƒ‹b25‚É“Y•t‚³‚ê‚Ä‚¢‚éreadme.txt‚É‘‚¢‚Ä‚ ‚éA ->@Eƒ\[ƒXƒR[ƒh‚ð—˜—p‚µ‚½‚±‚Æ‚É‚æ‚Á‚ÄA“Á‹–ã‚̃gƒ‰ƒuƒ‹‚ª”¶‚µ‚Ä‚à ->@@–Î–Ø ˜a—m‚ÍÓ”C‚𕉂í‚È‚¢ ->@Eƒ\[ƒXƒR[ƒh‚ð—˜—p‚µ‚½‚±‚Æ‚É‚æ‚Á‚ÄAƒvƒƒOƒ‰ƒ€‚É–â‘肪”¶‚µ‚Ä‚à ->@@–Î–Ø ˜a—m‚ÍÓ”C‚𕉂í‚È‚¢ -> ->@ã‹L 2 ðŒ‚É“¯ˆÓ‚µ‚Ä쬂³‚ꂽ“ñŽŸ“I’˜ì•¨‚ɑ΂µ‚ÄA–Î–Ø ˜a—m‚Í ->@Œ´’˜ìŽÒ‚É—^‚¦‚ç‚ê‚锌 —˜‚ðsŽg‚µ‚È‚¢ -‚ª“K—p‚³‚ê‚Ü‚·B - -‚»‚Ì‘¼: -‚±‚̃vƒƒOƒ‰ƒ€‚ÍAS-IS‚Å’ñ‹Ÿ‚³‚ê‚Ü‚·B‚È‚É‚©–â‘肪‹N‚±‚Á‚Ä‚àÓ”C‚ÍŽ‚Ä‚Ü‚¹‚ñB - -“®ìŠm”FŠÂ‹«: - Debian GNU/Linux lenny(testing) - Linux 2.6.22.6 SMP PREEMPT x86_64 - -ŸN/E9PqspSk
--- a/b25_docs/smartcard_list.txt Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1874 +0,0 @@ -# -# smartcard_list.txt -# Copyright (C) 2002-2006 Ludovic Rousseau -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -# 02111-1307 USA - -# -# This list contains a match between an ATR and a card type -# The list is sorted for edition purposes -# -# You can get the latest version of this file from: -# http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt -# -# $Id: smartcard_list.txt,v 1.290 2007-10-30 21:12:54 rousseau Exp $ -# - -# syntax: -# ATR in regular expression form -# \t descriptive text -# \t descriptive text -# \t descriptive text -# empty line - -3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 - B-CAS - -3B 02 14 50 - Schlumberger Multiflex 3k - -3B 02 53 01 - Gemplus GemClub Memo - -3B 04 41 11 77 81 - Sample Mifare DESFire contactless smartcard from Phillips - -3B 04 41 11 77 B1 - IBM JCOP 30 contactless - -3B 04 49 32 43 2E - German Health Insurance Card - "LogCard" from concept2.com (a indoor rower manufacturer) - I2C card - -3B 04 92 23 10 91 - Siemens SLE 4432/42 card - -3B 04 A2 13 10 91 - PM2P Chipkarte SLE 4442, Code FFFFFF - Bahn BKK (Deutsche Bahn AG - Insurance Company) - -3B 05 68 01 01 02 05 - Certinomis card (electronic certificates) - -3B 06 A2 13 10 91 90 00 - C3P2K SAMPLE CARD (C3PO, S.L) - -3B 09 41 04 11 DD 82 2F 00 00 88 - 1k contactless Mifare - -3B 0A 20 62 0C 01 4F 53 45 99 14 AA - GSM-SIM BEN (1800MHz) - -3B 0F 80 6A 16 32 46 49 53 45 53 8C E0 FF 07 90 00 - GSM-SIM Sonera (from 1998) - -3B 0F FF C1 B5 CC 72 CA 00 00 ?? - Mifare Std 1K - -3B 15 13 80 53 41 52 03 - Eutron CryptoIdentity (ATMEL AT903232C - 6464C Cryptographic - processors, 64KB EEPROM, RSA 2048) - -3B 15 94 C3 02 08 16 01 - GSM-SIM EMT (Estonia) - -3B 16 94 71 01 01 00 27 00 - Cingular GSM SIM Card - -3B 16 94 71 01 01 05 02 00 - GSM SIM Bouygues Telecom - -3B 16 94 81 10 06 01 81 2F - Schlumberger Cyberflex Access Augmented Crypto - -3B 16 94 81 10 06 01 81 3F - Schlumberger Cyberflex Access Crypto - -3B 16 96 41 73 74 72 69 64 - Gemalto .NET v2.0 - -3B 17 13 9C 12 02 01 01 07 40 - Schlumberger Cyberflex Access Developer 32k - -3B 17 94 18 01 01 02 01 41 49 - white SFR SIM card - -3B 17 94 18 02 01 25 01 41 93 - AT&T Wireless GSM SIM Card - -3B 17 94 89 01 02 01 02 41 87 - Vodafone/Omnitel 16K GSM SIM - -3B 19 14 55 90 01 01 01 00 05 08 B0 - Schlumberger Multiflex 8k - -3B 19 14 55 90 01 02 01 00 05 04 B0 - Schlumberger Multiflex 4k - -3B 19 14 59 01 01 0F 01 00 05 08 B0 - Schlumberger Multiflex 8k - -3B 19 94 31 02 05 10 45 98 01 02 4E - GSM-SIM EMT (Estonia) - -3B 1F 11 00 67 42 41 46 49 53 45 53 52 66 FF 81 90 00 - Finnish student id card - -3B 1F 11 00 67 80 42 46 49 53 45 10 52 66 FF 81 90 00 - Nokia branded SC (Setec) - -3B 1F 11 00 6A 01 38 46 49 53 45 10 8C 02 FF 07 90 00 - GSM-SIM Saunalahti (from 2004) - Finnish cell phone operator "Sonera" SIM card (from 2002) - -3B 1F 11 00 6A 31 36 46 49 53 45 13 8C 02 FF 07 90 00 - GSM-SIM card - Telenor Mobil - http://www.telenor.com/ - -3B 1F 11 80 6A 16 32 46 49 53 45 15 8C E6 FF 07 90 00 - GSM SIM card - Tele2 Estonia - http://www.tele2.ee - -3B 1F 11 80 6A 32 37 46 49 53 45 12 8C 00 FF 07 90 00 - Setec Test card, SetCOS 3.7.2, rel 1.3 - -3B 1F 11 80 6A 32 37 46 49 53 45 12 8C 02 FF 07 90 00 - GSM-SIM DNA Finland (from 2001) - -3B 1F 11 80 6A 80 34 46 49 53 45 53 94 36 FF 07 90 00 - SetCOS 3.4.0c - RSA SecurID 3100 - -3B 1F 94 00 6A 01 38 46 49 53 45 10 8C 02 FF 07 90 00 - GSM-SIM Saunalahti (from 2004) - -3B 1F 94 80 6A 16 32 46 49 53 45 15 8C E6 FF 07 90 00 - GSM-SIM Sonera (from 2002) - -3B 23 00 00 36 41 81 - Schlumberger Payflex 4k SAM - -3B 23 00 35 11 80 - Schlumberger Payflex 1k User - -3B 23 00 35 11 81 - Schlumberger Payflex 1k SAM - -3B 23 00 35 13 80 - Schlumberger Cyberflex Access Campus - -3B 23 00 35 13 FF - Schlumberger MicroPayflex - -3B 23 00 35 41 80 - PayflexHID (idenfitied by Sun Ray Services) - -3B 24 00 .. .. .. 45 - Conax - -3B 24 00 30 42 30 30 - ComHem Digital-TV smartcard (Sweden) - -3B 24 00 80 72 94 43 - MPCOS-3DES 64K \ EMV Filter (Gemplus) - -3B 26 00 00 26 40 00 90 00 - Schlumberger, purse? - -3B 26 00 11 04 5C 03 90 00 - Caixa Abierta (Barcelona, Spain) Cash/Visa Electron - -3B 26 00 11 06 23 03 90 00 - Tarjeta de la Seguridad Social (Spanish Social Insurance Card) - -3B 27 00 80 65 A2 .. 01 01 37 - Gemplus GemSAFE Smart Card (4K) - -3B 27 00 80 65 A2 00 01 01 37 - Gemplus GemSAFE Card CSP v1.0 - -3B 27 00 80 65 A2 02 02 82 37 - Gemplus GPK2000s - -3B 27 00 80 65 A2 02 03 82 37 - Gemplus GPK2000sp - -3B 27 00 80 65 A2 04 01 01 37 - Gemplus GPK4000s - -3B 27 00 80 65 A2 05 01 01 37 - Gemplus GPK4000sp - -3B 27 00 80 65 A2 06 01 01 37 - GPK 4000, RSA 512 bits Sign, Unwrap 40 bits - -3B 27 00 80 65 A2 0C 01 01 37 - Gemplus GPK4000 - -3B 27 00 80 65 A2 8C 3B 27 00 - GPK 4000, RSA 1024 bits Sign, Unwrap 256 bits - -3B 29 00 24 93 01 00 00 00 00 01 A9 - Telephone chipcard for the Vienna University of Technology - http://nic.tuwien.ac.at/telefonie/chipkarte/ - -3B 29 00 80 72 A4 45 64 00 00 D0 15 - Moeda Electronica Bradesco (Gemplus MPCOS?) (Brasilia) - -3B 29 00 80 72 A4 45 64 00 FF 00 10 - MPCOS-3DES 8K (Gemplus) - MBNA Europe Platinum Plus Mastercard - MasterCard Card - Worldcard - Yapıkredi / Turkey - -3B 2A 00 80 65 A0 58 04 01 62 72 D6 43 - Gemplus GemCombiXplore MPCOS Pro - -3B 2A 00 80 65 A2 01 00 00 00 72 D6 41 - MPCOS_EMV_1B - -3B 2A 00 80 65 A2 01 00 00 00 72 D6 43 - MPCOS_EMV_4B - -3B 2A 00 80 65 A2 01 .. .. .. 72 D6 41 - Gemplus MPCOS EMV 1 Byte sectors - -3B 2A 00 80 65 A2 01 02 01 31 72 D6 43 - MPCOS-EMV 64K Functional Sample - -3B 2A 00 80 65 A2 01 .. .. .. 72 D6 43 - Gemplus MPCOS EMV 4 Byte sectors - -3B 2F 00 80 69 10 80 00 01 A1 0A 01 01 59 83 0E 90 00 - Belgium Dexia (Axion) Bank Card - Proton/Bancontact Mister Cash/Maestro - -3B 32 15 00 06 80 - Schlumberger Multiflex 8k - -3B 32 15 00 06 95 - Schlumberger Multiflex 8k DES - -3B 37 11 00 46 4C 4F 4D 41 90 00 - SLE 4428 - -3B 3B .. 00 80 6. A[F,E] 03 0[C,D] .. .. 83 .. 90 00 - GemXplore Xpresso V3 - -3B 3B 11 00 80 65 AF 03 0C 01 6F 83 0F 90 00 - Gemplus GemX{plore,presso} V3-B1 - -3B 3B 11 00 80 69 AF 03 0C 01 6F 83 0[0,1] 90 00 - GemXplore'Xpresso V3 64K - -3B 3B 94 00 4F 34 10 20 01 04 C0 33 33 90 00 - SIM card from the italian operator WIND - -3B 3B 94 00 67 37 10 00 00 39 60 33 33 90 00 - Avea GSM / Turkey - -3B 3B 94 00 80 65 AF 03 0D 01 74 83 0F 90 00 - Gemplus GemXplore Xpresso V3 B1P - Mobistar SIM - Belgium (Gemplus) - -3B 3C 94 00 4B 31 25 A2 10 13 14 47 83 83 90 00 - GSM SFR - -3B 3C 94 00 4C 31 25 A7 20 1B 00 15 83 83 90 00 - GSM-SIM (900MHz) card of the carrier vodafone for their cellular - network (phase 2+ with 3V) - -3B 3D 94 00 01 0F 00 36 00 00 86 60 18 04 00 01 07 - Vodafone GSM / Turkey - -3B 3F 11 00 6F AF 65 03 12 01 80 73 32 21 1B 83 0F 90 00 - GSM SIM card Orange J2RE postpaid - -3B 3F 94 00 80 65 AF 03 12 01 79 73 32 21 1B 83 0F 90 00 - UK O2 GSM SIM (2G Online Prepay Maldives) - -3F 3F 94 00 80 69 AF 03 07 01 59 00 00 0A 0E 83 3E 9F 16 - Finnish SIM card from "Radiolinja" now "Elisa" - -3B 3F 94 00 80 69 AF 03 07 06 67 00 00 0A 0E 83 3E 9F 16 - SFR SIM card (red Gemplus Répertoire) - -3B 3F 94 00 80 69 AF 03 07 06 67 09 97 0A 0E 83 3E 9F 16 - BASE SIM - Belgium (Gemplus) - -3B 3F 94 00 80 69 AF 03 0F 02 80 FF FF 06 0E 83 3E 9F 16 - GSM-SIM Telefonica Movistar, prepaid (Spain) - -3B 3F 95 00 80 65 AF 03 12 01 6F 73 32 21 1B 83 00 90 00 - Gemplus GemXpresso PRO 64 PK SIM - -3B 3F 95 00 80 65 AF 03 14 01 8A 73 32 21 1B 83 0F 90 00 - SIM Vodafone 64k - -3F 96 18 80 01 80 51 00 61 10 30 9F - Atmel/Athena T0 Inverse Convention PC/SC Compliance Test Card No. 2 - -3B 3F 95 00 80 69 AF 03 0F 02 80 FF FF 06 0E 83 3E 9F 16 - AT&T Wireless GSM SIM Card - -3B 57 18 02 93 02 01 01 01 90 00 - Easyflex FastOS 2.0 / Schlumberger - -3B 63 00 00 36 41 80 - Schlumberger Payflex 4k User - -3B 64 00 00 80 62 0. 51 - Setec SetCOS 5.1.0 EMV - -3B 64 00 FF 80 62 02 A2 - VISA credit card (Nordea bank) - -3B 64 .. FF 80 62 .. A2 - JCOP20 - -3B 65 00 00 29 05 01 02 01 - ActivCard (Schlumberger) CyberFlex 64K V1 SM 2.1 - -3B 65 00 00 58 01 01 00 80 - RBS Advanta Platinum Reserve Master Card - -3B 65 00 00 9C 02 02 07 02 - US Department of Defense, TEST Common Access Card (CAC) - Schlumberger Cyberflex Access #2 - Axalto Cyberflex Access 32K V2 - -3B 65 00 00 9C 1[0,1] 01 01 03 - Schlumberger Cyberflex Palmera - -3B 66 00 00 00 9C 11 01 01 03 - Axalto Cyberflex Access 32K V4 SM 1.3 - -3B 66 00 00 00 9C 11 01 03 01 - Axalto Cyberflex Access 64K V1 Bio SM 3.1 - -3B 66 00 00 31 4B 01 01 00 80 - VISA credit card (Skandiabanken) - -3B 66 00 FF 4A 43 4F 50 33 30 - JCOP30 "OP-DI 16k VISA v2 (JCOP30) ORGA" - -3B 66 00 FF 4A 43 4F 50 30 33 - IBM JCOP 30 - -3B 67 00 00 00 00 00 00 00 90 00 - Axa Bank (Belgium) Mastercard Gold / Axa Bank Belgium - MisterCash & Proton card - VISA Card (emitted by Bank Card Company - Belgium) - -3B 67 00 00 00 00 20 00 00 90 00 - BankID card from Sparebank1 - -3B 67 00 00 00 31 80 71 86 90 00 - Swiss ZKB-Bancomat-Card - -3B 67 00 00 29 20 00 6F 78 90 00 - Postbank Chippas (chipknip) Netherlands - -3B 67 00 00 2D 20 36 00 78 90 00 - Swedish cashcard, http://www.ida.liu.se/~TDDB31/Cashcard.pdf - Bank Card (ING - Belgium) - -3B 67 00 00 7D 20 40 34 3B 90 00 - Nordea Visa Sweden - -3B 67 00 00 85 20 36 30 78 90 00 - Belgium Fortis Bank - Belgium Keytrade Bank - Belgium Post Bank - -3B 67 00 00 9C 10 01 01 03 FF 07 - Schlumberger Cyberflex Palmera Protect - -3B 67 00 00 A5 20 40 10 1F 90 00 - Swedish eLegitimation (eID) from Nordea Bank http://www.elegitimation.se/ - -3B 67 25 00 2A 20 00 4[0,5] 68 90 00 - Swedish cashcard (proton) - -3B 67 25 00 62 24 33 03 .. - Bull TB1000 ? (SAM for ATM in Luxemburg) - -3B 68 00 00 56 53 44 43 4C 43 31 30 - VISA (Estonian), made by www.trueb.ch - -3B 68 00 00 80 66 A2 06 02 01 32 0E - Gemplus GemClub 1K - -3B 68 00 00 9D 08 01 02 01 56 49 53 - Visa Card - bonus - DenizBank / Turkey - -3B 68 00 00 9D 08 01 03 01 4F 54 53 - MasterCard Card - bonus - Garanti Bank / Turkey - -3B 68 00 00 9D 08 01 03 01 56 49 53 - MasterCard Card - bonus - Garanti Bank / Turkey - MasterCard Card - bonus plus (paypass) - Garanti Bank / Turkey - -3B 68 00 00 9D 08 01 05 01 56 49 53 - MasterCard Card - CartaSi (Italian Credit Card) - -3B 68 00 00 A1 02 02 01 01 56 49 53 - UK NatWest Business MasterCard - UK Barclaycard VISA - UK NatWest Platinum MasterCard - Visa Card - DenizBank / Turkey - -3B 69 00 00 24 94 01 02 01 00 01 01 A9 - Chipcard from SUN to be used in SunRay's - 370-4328-01 (31091) - -3B 69 00 00 24 94 01 03 01 00 01 00 A9 - Schlumberger MicroPayflex S card - -3B 69 00 00 4A 43 4F 50 33 31 56 32 32 - Visa Europe Sample Card / Axalto - -3B 69 00 00 50 01 01 04 01 00 01 01 A9 - Sample card given to all attendees of the CTST 2004 SmartCard Conference - -3B 69 00 FF 53 6D 40 72 74 43 61 66 65 - G&D (Giesecke&Devrient) Sm@rtCafé - -3B 6A 00 00 80 31 C0 A1 02 03 01 32 81 16 - Lloyds TSB Visa Credit/Debit Card - -3B 6A 00 00 80 65 A2 01 01 01 3D 72 D6 43 - GemSafe Xpresso 16k - -3B 6A 00 00 80 66 A1 09 02 01 63 0E 90 00 - Danish Visa/Dankort - UK MBNA MasterCard - Visa Card - Worldcard - YapıKredi / Turkey - -3B 6B 00 00 00 31 80 64 2D A0 02 0C 8C 61 27 - SmartEMV prototype - -3B 6B 00 00 00 31 80 64 43 B0 02 00 8C 61 27 - Bull Odyssey 1.2 (Javacard 2.0) - -3B 6B 00 00 80 65 A1 09 03 01 97 83 0E 90 00 - Visa Card - Worldcard - YapıKredi / Turkey - -3B 6B 00 00 80 65 B0 83 01 01 74 83 00 90 00 - GemXpresso Pro R3 with 64K EEPROM - -3B 6B 00 00 80 65 B0 83 01 03 74 83 00 90 00 - Gemplus GemXpresso PRO 64K R3 v1 - -3B 6B 00 00 80 65 B0 83 01 04 74 83 00 90 00 - Gemplus GXP3 64V2N - U.S. Department of Defense Common Access Card (DoD CAC) - -3B 6B 00 FF 33 00 00 09 FA 10 00 80 01 FF FF - Atmel 6464C PRO 64K - -3B 6B .. FF 80 62 .. A2 56 46 69 6E 45 49 44 - JCOP20 v2.x - -3B 6C 00 00 10 10 10 30 00 00 00 00 00 00 00 00 - Datacard Group Aptura Development Card V1.1b - -3B 6D 00 00 00 31 C0 71 D6 64 11 22 33 01 83 90 00 - UK Barclaycard VISA - UK Halifax Platinum VISA - -3B 6D 00 00 00 31 C0 71 D6 64 34 C7 01 00 84 90 00 - DeLaRue ProlifIC - -3B 6D 00 00 00 31 C0 71 D6 64 34 C7 02 00 84 90 00 - Cybelys card (Thalys fidelity card) - -3B 6D 00 00 00 31 C0 71 D6 64 38 D0 02 00 84 90 00 - EMV Visa Electron (Oberthur) - -3B 6D 00 00 00 31 C0 71 D6 64 38 D0 03 00 84 90 00 - HSBC Visa/MasterCard credit card - Barclay Card MasterCard - -3B 6D 00 00 00 31 C0 71 D6 64 4E D8 01 01 84 90 00 - UK Capital One Platinum MasterCard - -3B 6D 00 00 00 31 C0 71 D6 64 58 D7 01 00 84 90 00 - UK Nationwide Bank Visa Delta - UK First Direct Maestro - UK Halifax Platinum Visa - -3B 6D 00 00 80 31 80 65 B0 06 01 01 77 83 00 90 00 - GemXpresso Lite: with EMV application - -3B 6D 00 00 80 31 80 65 B0 43 01 00 77 83 00 90 00 - Gemplus GemXpresso Lite - -3B 6D 00 00 80 31 80 65 B0 83 01 02 90 83 00 90 00 - DeutscheBank Identification card - -3B 6D 00 FF 00 31 80 71 8E 64 48 D5 02 00 82 90 00 - Blue for Business, American Express@Business - -3B 6E 00 00 00 31 80 71 86 65 01 64 02 22 32 80 90 00 - MasterCard Card - bonus plus (paypass) - Garanti Bank / Turkey - -3B 6E 00 00 00 31 80 71 86 65 01 64 02 22 32 83 90 00 - MasterCard Card - bonus YKM - Garanti Bank / Turkey - -3B 6E 00 00 00 31 80 71 86 65 01 67 02 A0 0A 83 90 00 - Australian ANZ First Visa Card from the ANZ - (Australia and New Zealand) Bank - -3B 6E 00 00 00 31 80 71 86 65 47 44 23 01 02 83 90 00 - Nat West Master Card - -3B 6E 00 00 00 31 80 71 86 65 47 44 24 01 81 83 90 00 - MasterCard Card - Maximum - IS Bank / Turkey - Visa Card - Axess - Akbank / Turkey - -3B 6E 00 00 00 31 C0 71 86 65 01 64 02 22 33 83 90 00 - UK NatWest ServiceCard 100 Maestro - Visa Card - bonus - Garanti Bank / Turkey - -3B 6E 00 00 00 31 C0 71 86 65 01 78 01 27 34 83 90 00 - UK NatWest ServiceCard 100 Maestro - Visa Card - Gold - CARDFINANS / Turkey - -3B 6E 00 00 00 31 C0 71 C6 65 01 B0 01 03 37 83 90 00 - UK NatWest Business MasterCard - -3B 6E 00 00 00 31 C0 71 D6 65 7D E4 01 10 A0 83 90 00 - VISA card, issued by the ANWB, the Dutch national Automobile club - Visa Card - Maximum - Oyak Bank / Turkey - -3B 6E 00 00 00 31 C0 71 D6 65 7D E4 01 11 A0 83 90 00 - UK CapitalOne Platinum Mastercard - -3B 6E 00 00 00 31 C0 71 D6 65 A3 03 01 80 00 83 90 00 - UK First Direct (HSBC) Maestro / Cirrus - -3B 6E 00 00 00 62 .. 43 57 41 56 41 4E 54 10 81 90 00 - Setec SetCOS 4.3.0 - -3B 6E 00 00 00 62 00 00 57 41 56 41 4E 54 10 81 90 00 - Setec SetCOS 5.1.0 EMV + AVANT - -3B 6E 00 00 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 - Estonian Identity Card (EstEID v1.5 multos) - -3B 6E 00 00 80 31 80 65 B0 03 01 01 5E 83 00 00 90 00 - FirstUSA Visa - -3B 6E 00 00 80 31 80 65 B0 03 02 01 5E 83 00 00 90 00 - Gemplus GemXpresso 211is - -3B 6E 00 FF 00 62 00 00 57 41 56 41 4E 54 10 81 90 00 - debit card (Visa Electron) issued by Nordea bank - -3B 6E 00 FF 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 - Estonian Identity Card (EstEID v1.0 warm) - -3B 6F 00 00 00 67 2. 43 46 49 53 45 12 52 66 FF 81 90 00 - Setec SetCOS 4.3.2 - -3B 6F 00 00 80 31 C0 52 00 83 64 02 19 08 32 83 83 90 00 - Bancomer Mexican Bank - -3B 6F 00 00 80 31 C0 52 16 B9 64 05 66 80 32 83 83 90 00 - Banorte Mexican Bank - -3B 6F 00 00 80 31 E0 5B 4E 4F 4B 00 00 00 00 00 00 02 00 - Norsk-Tipping (Buypass) Monodex card - -3B 6F 00 00 80 31 E0 6B 04 06 03 04 40 55 55 55 55 55 55 - Blue American Express Card - -3B 6F 00 00 80 31 E0 6B 04 06 05 02 17 55 55 55 55 55 55 - Marx Software Security - Cryptoken M2048, MULTOS, Infineon SLE66CX, 64kByte - http://www.marx.com/en/ - -3B 6F 00 00 80 31 E0 6B 04 20 05 02 30 55 55 55 55 55 55 - Buypass card for Norsk Tipping (http://norsk-tipping.no) - -3B 6F 00 00 80 31 E0 6B 84 06 03 04 31 55 55 55 55 55 55 - Multos Developer Sample - -3B 6F 00 00 80 31 E0 6B 84 06 0E 02 02 55 55 55 55 55 55 - Multos Developer Sample - -3B 6F 00 00 80 31 E0 6B 84 20 05 02 39 55 55 55 55 55 55 - Multos 14D (2-0-10) 64K Developer Card - -3B 6F 00 00 80 31 E0 6B 84 20 05 02 42 55 55 55 55 55 55 - Multos 14Dc(6-0-13) 64K Dual-Interface Developer Card - -3B 6F 00 00 80 5A .. 0[1-5] .. .. .. .. .. .. .. .. 82 90 00 - Card supporting a Calypso application Rev 1 - Typically: French "Navigo" transport card - -3B 6F 00 00 80 66 45 46 01 38 18 03 53 02 31 10 82 90 00 - Fábrica Nacional de Moneda y Timbre FNMT WG10 - http://www.fnmt.es/es/html/tage/fichaTarjeta/fp1_ta_01.asp - -3B 6F 00 FF 52 53 41 53 65 63 75 72 49 44 28 52 29 31 30 - RSA SecurID SID800 token - -3B 6F 00 FF 53 46 53 45 2D 43 58 33 32 32 2D 56 18 02 02 - Giesecke & Devrient SmartCafe Expert 2.0 - -3B 75 12 00 00 29 05 01 04 01 - CAC Cryptographic Service Provider - Axalto Cyberflex Access 64K V1 SM 4.1 - -3B 75 13 00 00 9C 02 02 01 02 - Cyberflex Access 32k v2 - -3B 75 94 00 00 62 02 02 0[1-3] 01 - Schlumberger Cyberflex 32K e-gate - -3B 76 11 00 00 00 9C 11 01 02 02 - Schlumberger Cyberflex Access 32K - -3B 76 11 00 00 00 9C 11 01 02 03 - RSA SecureID 5100 - -3B 76 12 00 00 00 9C 11 01 03 03 - Precise BioMatch (TM) JavaCard (Schlumberger) - www.precisebiometrics.com - -3B 76 98 00 00 00 9C 11 01 01 02 - CyberFlex Access 32 - -3B 7A 11 00 02 48 4F 53 54 06 03 19 02 90 00 - Swedish bankcard with Mastercard from ICA-banken - -3B 7A 13 00 00 00 09 A5 05 01 00 B7 01 A6 01 - "cleyris" authentication card. monpass.santé from Mutuelle Générale - -3B 7A 94 00 00 80 65 A2 01 01 01 3D 72 D6 43 - Gemplus GemXpresso Pro R3 E32 PK - -3B 7B .. 00 00 80 62 0. 51 56 46 69 6E 45 49 44 - Setec SetCOS 5.1.0 - -3B 7B 18 00 00 00 31 C0 64 77 E3 03 00 82 90 00 - Oberthur Cosmopolic 64K v5.2 D - -3B 7B 94 00 00 80 62 11 51 56 46 69 6E 45 49 44 - Finnish Electronic ID card (fineid card www.fineid.fi) - -3B 7B 94 00 00 80 65 B0 83 01 0[1,3] 74 83 00 90 00 - Gemplus GemXpresso Pro R3 (E64 PK) - -3B 7B 95 00 00 80 65 B0 83 01 04 74 83 00 90 00 - Gemplus GemXpresso Pro 64K R3 FIPS v2 - -3B 7D 11 00 00 00 31 80 71 8E 64 52 D9 01 00 82 90 00 - Oberthur Galactic V2 - -3B 7D 11 00 00 00 31 80 71 8E 64 77 E3 01 00 82 90 00 - Oberthur Cosmo 64k RSA v5 - -3B 7D 11 00 00 00 31 80 71 8E 64 77 E3 02 00 82 90 00 - Oberthur 64k v5/2.2.0 - -3B 7D 11 00 00 00 31 80 71 8E 64 86 D6 01 00 81 90 00 - DOD-CAC - -3B 7D 18 00 00 00 31 80 71 8E 64 77 E3 01 00 82 90 00 - Oberthur 64k v4/2.1.1 - -3B 7D 94 00 00 80 31 80 65 B0 83 01 02 90 83 00 90 00 - Gem e-Seal - (GemSafeXpresso 16k R3.2?) - -3B 7D 94 00 00 80 31 80 65 B0 83 01 01 90 83 00 90 00 - GemSafeXpresso 16k R3.2 - -3B 7D 94 00 00 80 31 80 65 B0 83 02 04 7E 83 00 90 00 - GXP Pro R3.2 64K, GemSafe applet MPCOS v1.11 - -3B 7D 96 00 00 80 31 80 65 B0 83 11 40 AC 83 00 90 00 - GemXpresso R4 64k - -3B 7D 96 00 00 80 31 80 65 B0 83 11 C0 A9 83 00 90 00 - Gemplus X-Presso Pro 64k - -3B 7E 11 00 00 00 6A 11 63 54 08 30 24 01 .. .. 21 90 01 - Sagem Windows for smart cards - -3B 7F 11 00 00 00 6A 43 45 52 45 53 02 2C 34 02 00 03 90 00 - FNMT-CERES ST (Fábrica Nacional de Moneda y Timbre) - -3B 7F 11 00 00 80 31 C0 52 21 57 64 02 18 19 53 83 83 90 00 - banking card (www.caixacatalunya.com) - student id of Universitat Autonoma de Barcelona - -3B 7E 13 00 00 00 6A 11 63 54 05 48 .. .. .. 01 22 90 00 - Sagem Windows for smart cards - -3B 7F 13 00 FF 45 43 4F 53 76 31 31 30 28 63 29 50 46 42 4D - ECOS-Card [Experimental Card Operating System V.1.1] by Philipp Maier - http://www.runningserver.com/?page=runningserver.content.download.ecos - -3B 7F 11 00 00 00 31 C0 53 CA C4 01 64 52 D9 04 00 82 90 00 - DoD CAC, Oberthur CosmopolIC 32K V4 - -3B 7F 18 00 00 00 31 C0 73 9E 01 0B 64 52 D9 03 00 82 90 00 - Oberthur Galactic V3 (32k) - -3B 7F 18 00 00 00 31 C0 73 9E 01 0B 64 52 D9 04 00 82 90 00 - Oberthur CosmopolIC 32K v4 Fast ATR - Oberthur Authentic - -3B 7F 18 00 00 00 31 C0 73 9E 01 0B 64 52 D9 05 00 82 90 00 - Oberthur 32k BIO - -3B 7F 38 00 00 00 6A 43 45 52 45 53 02 2C 34 02 02 03 90 00 - WG10 - -3B 7F 38 00 00 00 6A 44 4E 49 65 20 02 4C 34 01 13 03 90 00 - DNI electronico (Spanish electronic ID card) - http://www.dnielectronico.es - -3B 81 1F 00 CC 52 - eToken R2 2242 - -3B 81 80 01 80 80 - Mifare DESFire - -3B 82 00 55 22 - GSM-SIM TELE2 Smart (Estonia, prepaid) - -3B 82 81 31 76 43 C0 02 C5 - CardOS/M2 V2.01(SLE44CxxS) - -3B 82 81 31 76 43 C1 03 C5 - i.ti (ticket card for Collogne/Bonn) - CardOS M2 Combi V2.02 (SLE44R42S) - -3B 83 00 12 10 96 - GSM-SIM T-Mobil D1 (900MHz) - -3B 85 00 12 02 01 00 96 - GSM-SIM Victorvox D1 (900MHz) - -3B 85 00 87 25 01 38 02 - GSM-SIM Viag Interkom E2 Loop GSM (1800MHz) - -3B 85 00 87 25 01 39 00 - GSM-SIM Telfort (Netherlands) 900 MHz - -3B 85 40 20 68 01 01 .. .. - Schlumberger Cryptoflex 8k - -3B 85 40 20 68 01 01 03 05 - Schlumberger Cryptoflex Key Generation - -3B 85 40 20 68 01 01 05 01 - Schlumberger Cryptoflex 8k - -3B 86 40 20 68 01 01 02 04 AC - Activcard Gold, SchlumbergerSema Cryptoflex 8k - -3B 85 40 FF 63 01 01 03 01 - Axalto Cryptoflex 16K - -3B 85 40 FE 68 01 01 02 04 - Axalto CryptoFlex 8K - -3B 86 80 01 4A 43 4F 50 33 30 12 - Mifare ProX T=CL - -3B 86 80 01 4A 43 4F 50 33 31 13 - JCOP BIO 31 Contactless Card - -3B 87 81 31 40 43 4D 46 43 20 31 33 31 6F - Telekom Paycard - -3B 88 81 31 20 55 00 57 69 6E 43 61 72 64 29 - SmartCard for Windows 1.0 - -3B 89 00 91 26 91 06 00 01 22 01 00 - BT Cellnet SIM - -3B 8B 80 01 00 64 04 11 01 01 31 80 00 90 00 5A - German Passport (issued Nov 2006) - United Kingdom e-Passport - -3B 89 40 14 47 47 32 36 4D 35 32 38 30 - GSM-SIM e-plus (1800MHz) - -3B 89 80 01 00 64 04 15 01 02 00 90 00 EE - German Passport (issued Apr 2007) - -3B 89 80 01 4A 43 4F 50 34 31 56 32 32 4D - New Zealand e-Passport - -3B 89 80 01 4D 54 43 4F 53 73 01 02 01 3F - Contactless MTCOS - http://www.masktech.de/ - -3B 89 80 01 53 50 4B 32 35 44 49 90 00 DA - SPK 2.5 D1 - -3B 8A 80 01 00 64 05 5C 02 03 31 80 90 00 16 - T-System Contactless Netkey Card - -3B 8A 80 01 00 64 05 76 02 03 31 80 90 00 3C - T-System Contactless TCOS Min - -3B 8A 00 91 01 00 16 00 01 16 01 00 96 - GSM-SIM T-Mobil D1 (900MHz) - -3B 8A 00 91 01 00 16 00 01 20 01 00 96 - GSM-SIM T-D1 prepaid (Xtra) - -3B 8A 00 91 01 00 16 00 01 20 02 00 96 - GSM-SIM (900MHz) card of the carrier t-mobile for their cellular - network (phase 2+ with 3V) - -3B 8A 00 91 91 00 17 00 01 07 03 00 96 - T-Mobile prepaid 2G SIM - -3B 8E 80 01 80 31 80 66 40 90 89 12 08 02 83 01 90 00 0B - ISO 14443B Type T = CL Infineon Card - -3B 8E 80 01 80 91 91 31 C0 64 77 E3 03 00 83 82 90 00 1C - Belgian Passport - -3B 8F 01 80 25 A0 00 00 00 56 57 44 4B 34 30 30 06 00 B7 - SafeNet IKey4000 - -3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A - Philips MIFARE Standard (1 Kbytes EEPROM) - http://www.nxp.com/products/identification/mifare/classic/ - RFID - ISO 14443 Type A - Transport for London Oyster - -3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 02 00 00 00 00 69 - Mifare card with 4k EEPROM - -3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68 - Contactless Mifare Ultralight - -3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B 00 00 00 00 00 00 63 - RFID - ISO 15693 - EM Microelectronic-Marin SA - -3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B 00 12 00 00 00 00 71 - RFID - ISO 15693 - Texas Instrument - -3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 1C 00 00 00 00 7E - RFID - HID iCLASS 16K CL - -3B 8F 80 01 80 4F 0C A0 00 00 03 06 0B 00 14 00 00 00 00 77 - Philips ICode - RFID - ISO 15693 - Philips Semiconductors - -3B 90 95 80 1F C3 59 - Dai Nippon Printing Co., DNP Standard-J T3.1 - -3B 95 15 40 .. 68 01 02 .. .. - Schlumberger CryptoFlex 8k v2 - -3B 95 18 40 FF 62 01 02 01 04 - Schlumberger Cryptoflex 32K e-gate - -3B 95 18 40 FF 62 04 01 01 05 - Schlumberger CryptoFlex 32Ko V1 - -3B 95 18 40 FF 64 02 01 01 02 - Schlumberger CryptoFlex 32Ko - -3B 95 94 40 FF 63 01 01 02 01 - Schlumberger Cryptoflex 16Ko - -3B 95 95 40 FF AE 01 01 02 03 - Axalto Cyberflex Access 64K v2a SM 2.3 - -3B 95 95 40 FF AE 01 03 00 00 - Axalto - Cyberflex 64K - -3B 95 95 40 FF D0 00 1A 01 01 - Cyberflex Access 64k (v3) - -3B 98 13 40 0A A5 03 01 01 01 AD 13 11 - Belgium Electronic ID card - -3B 98 94 40 0A A5 03 01 01 01 AD 13 10 - Belgium Electronic ID card - -3B 99 94 00 91 08 91 06 00 01 06 06 00 - GSM-SIM Orange-UK (1800) - -3B 9A 94 00 91 01 00 17 00 01 23 10 00 96 - GSM-SIM Victorvox D1 (900MHz) - -3B 9A 94 00 91 01 00 17 00 01 23 11 00 96 - GSM-SIM Card T-D1 (900MHz) - -3B 99 94 00 91 99 93 12 00 01 16 02 00 - ORGA test systems - GSM Phase 2+ Test SIM - -3B 9A 96 00 92 03 49 93 16 00 01 21 01 00 - GSM-SIM card of the Austrian provider Yesss! (http://www.yesss.at) - -3B 9B 95 80 1F 47 80 31 A0 73 BE 21 00 53 34 99 05 D0 - GSM-SIM EMT "Diil", prepaid (Estonia) - -3B 9C 13 11 81 64 72 65 61 6D 63 72 79 70 74 00 04 08 - XPlusTV & INXCT Access Card-9 (FIRECrypt) - -3B 9D 11 40 23 00 68 10 11 4D 69 6F 43 4F 53 00 90 00 - MioCOS 1.0 - -3B 9D 94 40 23 00 68 20 01 4D 69 6F 43 4F 53 00 90 00 - Miotec (http://www.miotec.fi) smartcard running Miocos 2.0 on an Atmel AT90SC646 - -3B 9E 95 80 1F C3 80 31 A0 73 BE 21 13 67 29 02 01 04 04 CD 39 - Hutchison/3 3G USIM - J+ SWIM WIB UMTS SIM Test card - http://www.exceldata.es/microprocess/j%2Bswinwibusim.html - -3B 9D 95 80 1F C3 80 31 E0 52 4B 54 62 11 03 73 FE 21 1B 8F - KT WiBro UICC (2.3 GHz mobile WiMAX in South Korea) - -3B 9F 21 0E 49 52 44 45 54 4F 20 41 43 53 20 56 34 2E 31 9D - Foxtel paytv decoder in Australia acs 4.1 Irdeto2 - -3B 9F .. 80 1F C3 00 68 1. 44 05 01 46 49 53 45 31 C8 .. 90 00 .. - Setec SetCOS 4.4.1 - -3B 9F 94 40 1E 00 67 11 43 46 49 53 45 10 52 66 FF 81 90 00 - Setec / FINEID - SETEC Instant EID - -3B 9F 94 40 1E 00 67 16 43 46 49 53 45 10 52 66 FF 81 90 00 - RSA SecurID 3100 or Utimaco Safeware Smartcard - SetCOS 4.3.1 Revision Unknown - -3B 9F 94 40 1E 00 67 .. 43 46 49 53 45 10 52 66 FF 81 90 00 - SLE66CX160S running SETCOS 4.3.1 Revision A - -3B 9F 94 80 1F C3 00 68 10 44 05 01 46 49 53 45 31 C8 07 90 00 18 - SetCOS 4.3.0 32K RSA - Instant EID IP2 - SETEC SetCard 32K PKI Evaluated SetCOS 4.4.1a2 - -3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B 63 E2 09 A9 83 0F 90 00 8D - GSM-SIM EMT (Estonia, WPKI eID support) - -3B 9F 95 80 1F C3 80 31 E0 73 FE 21 1B B3 E2 01 74 83 0F 90 00 88 - Gemplus GemXplore 3G USIM - -3B 9F 95 80 1F C7 80 31 E0 73 FE 21 1B 63 E2 04 A5 83 0F 90 00 88 - Cingular "64Ksmartchip" GSM SIM - -3B 9F 96 80 1F C3 00 68 10 44 05 01 46 49 53 45 31 C8 07 90 00 1A - SETEC SetCard 32K PKI Evaluated SetCOS 4.4.1 - -3B 9F 96 80 1F C3 80 31 E0 73 FE 21 1B B3 E2 02 7E 83 0F 90 00 82 - Vodafone SIM Card (D2, 1800Mhz, Germany, Twincard, possibly others too?), manufactured by Gemplus (See stamp on the chip) - -3B A7 00 40 .. 80 65 A2 08 .. .. .. - Gemplus GemSAFE Smart Card (8K) - -3B A7 00 40 14 80 65 A2 14 01 01 37 - Gemplus GPK4000sdo - -3B A7 00 40 18 80 65 A2 08 01 01 52 - Gemplus GPK8000 - GemSAFE Smart Card (8K) - -3B A7 00 40 18 80 65 A2 09 01 01 52 - Gemplus GPK16000 - -3B A7 00 40 18 80 65 A2 09 01 02 52 - Gemplus GPK16000 - -3B A7 00 40 18 80 65 A2 09 01 03 52 - Gemplus GemSAFE std (GPK16000?) - -3B A8 00 81 71 46 5D 00 54 43 4F 53 31 2E 32 00 65 - Telesec TCOS 1.2 - -3B A8 00 81 71 46 5D 00 54 43 4F 53 31 2E 32 4B 2E - CeloCom Card with TCOS 1.2 - -3B AA 00 40 14 47 47 32 47 54 35 53 34 38 30 - GSM-SIM Libertel (900MHz) - -3B AA 00 40 80 53 4F 80 53 45 03 04 11 AA A3 - "open platform" ATMEGA "new Generation" - http://www.masterixweb-italy.com/new/images/articoli/atmega.jpg - -3B AB 00 81 31 40 45 80 31 C0 65 08 06 80 00 00 00 00 84 - Reloadable Visa Cash card (Schlumberger), Bank of America - -3B AD 00 40 FF 80 31 80 65 B0 05 01 01 5E 83 00 90 00 - Dallas Semiconductor iButton - JIB - -3B B0 11 00 81 31 90 73 F2 - SamOS 2.7 - -3B B2 11 00 10 80 00 01 - Atmel memory card AT88SC0104C - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B2 11 00 10 80 00 02 - Atmel memory card AT88SC0204C (Atmel memory card) - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B2 11 00 10 80 00 04 - Atmel memory card AT88SC0404C - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B2 11 00 10 80 00 08 - Atmel memory card AT88SC0808C - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B2 11 00 10 80 00 16 - Atmel memory card AT88SC1616C - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B3 11 00 00 00 00 32 - Atmel memory card AT88SC3216C - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B3 11 00 00 00 00 64 - Atmel memory card AT88SC6416C - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B3 11 00 00 00 01 28 - Atmel memory card AT88SC12816C - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B3 11 00 00 00 02 56 - Atmel memory card AT88SC25616C - http://www.atmel.com/dyn/resources/prod_documents/doc5210.pdf - -3B B2 11 00 10 80 00 08 - Smart VR Card - GD Burti - -3B B7 11 00 81 31 90 43 A5 .. .. .. .. .. .. .. - Siemens CardOS/M V1.4 (SLE44C80S) - -3B B7 11 00 81 31 90 53 B5 .. .. .. .. .. .. .. - CardOS EM/V1.4 (SLE44CR80S) - -3B B7 18 00 81 31 FE 65 53 50 4B 32 34 90 00 5A - Giesecke & Devrient Starcos 2.4 - -3B B7 18 00 C0 3E 31 FE 65 53 50 4B 32 34 90 00 25 - G&D STARCOS SPK 2.4 - -3B B7 94 00 81 31 FE 65 53 50 4B 32 32 90 00 D0 - Giesecke & Devrient STARCOS SPK2.2 - -3B B7 94 00 81 31 FE 65 53 50 4B 32 33 90 00 D1 - Giesecke & Devrient Starcos 2.3 - Deutsche Bank WebSign (RSA-Card) - G&D StarSign Token - -3B B8 13 00 81 31 20 5D 00 57 69 6E 43 61 72 64 02 - SmartCard for Windows 1.1 - -3B B9 94 00 40 14 47 47 33 4E 48 38 36 34 30 - GSM-SIM card of the Austrian mobile phone provider One, http://www.one.at - Proximus SIM - Belgium (SetCOS?) - -3B BA 11 00 81 31 FE 4D 55 45 4B 41 45 20 56 31 2E 30 AE - AKİS v1.0 - -3B BA 13 00 81 31 86 5D 00 64 05 0A 02 01 31 80 90 00 8B - Telesec TCOS 2 (SLE44) - TCOS 2.0 (on CR80S) - Cryptokarte with RSA-Controller, T=1 Protocol - -3B BA 14 00 81 31 86 5D 00 64 05 14 02 02 31 80 90 00 91 - TCOS 2.0 (on CX160S) - Telesec TCOS 2 (SLE66) - -3B BA 94 00 40 14 - GG3RS732S0 ? - -3B BA 94 00 40 14 47 47 33 52 53 37 31 36 53 30 - GSM-SIM Viag Interkom E2 Loop (1800MHz) - GSM-SIM card of the Austrian A1, http://www.a1.net/privat/home - -3B BA 96 00 81 31 86 5D 00 64 05 60 02 03 31 80 90 00 66 - Telesec TCOS 2 (SLE66P) - TCOS 2.0 (on CX320P) - TeleSec Netkey Card - -3B BA 96 00 81 31 86 5D 00 64 05 7B 02 03 31 80 90 00 7D - TeleSec NetKey Card - Deutsche Post card (tcos) - -3B BC 94 00 40 14 47 47 33 48 33 35 58 53 32 30 30 30 - GSM-SIM Era-PL - T-Mobile GSM SIM Card - -3B BC 94 00 40 14 47 47 33 48 33 35 58 56 32 30 30 30 - GSM SIM CARD 32K, Vodafone - -3B BC 94 00 40 14 47 47 33 49 35 43 41 43 31 30 30 30 - Siemens SIM card - -3B BC 94 00 40 14 47 47 33 53 30 35 31 53 31 30 31 30 - GSM SIM (Tele2, Estonia) - -3B BE 11 00 00 41 01 38 00 00 00 00 00 00 00 00 01 90 00 - ACS (Advanced Card System) ACOS-1 - -3B BE 11 00 00 41 01 38 00 00 00 00 00 00 00 00 02 90 00 - ACS (Advanced Card System) ACOS-1 8K - -3B BE 11 00 00 41 01 38 01 00 03 00 00 00 00 00 02 90 00 - ACOS2 test card from ACS reading off a ACR38U - -3B BF 11 00 81 31 FE 45 45 50 41 00 00 00 00 21 00 93 42 00 00 00 00 01 - Austrian BankCard (Old Version - ca. 2004) - -3B BF 11 00 81 31 FE 45 45 50 41 00 00 00 00 26 24 68 30 00 00 00 00 AB - Austrian BankCard (Maestro + Quick) (New Version, since 02/2005, - with Digital-Signature etc.) - -3B BF 11 00 81 31 FE 45 45 50 41 00 00 00 00 28 93 66 23 00 00 03 E8 E4 - Austrian Maestro BankCard +Quick Buergerkarte - -3B BF 11 00 81 31 .. 45 45 50 41 00 00 00 00 .. .. .. .. 00 00 .. .. .. - Austrian Quick E-purse - -3B BE 18 00 00 41 05 .. 00 00 00 00 00 00 00 00 00 90 00 - Advanced Card Systems (ACS) ACOS5 Cryptographic Smart Card - -3B BE 18 00 00 41 05 10 00 00 00 00 00 00 00 00 00 90 00 - ACS ACOS5 "ACOS5-32-G" http://www.acs.com.hk/acos5.asp - -3B BD 18 00 81 31 FE 45 80 51 02 67 04 14 B1 01 01 02 00 81 05 3D - Austrian "e-Card" (=Health Card), BRANDNEW (since 06/2005) - special Version of Starcos 3.1 - -3B BF 11 00 C0 10 31 FE 44 53 4D 40 52 54 20 43 41 46 45 20 31 2E 31 43 C1 - Giesecke&Devrient SmartCafe 1.1 - -3B BF 18 00 80 31 70 35 53 54 41 52 43 4F 53 20 53 32 31 20 43 90 00 9B - Giesecke & Devrient STARCOS S2.1 - -3B BF 18 00 81 31 70 55 53 54 41 52 43 4F 53 20 53 32 31 20 43 90 00 FA - Giesecke & Devrient STARCOS S2.1 - -3B BF 18 00 C0 20 31 70 52 53 54 41 52 43 4F 53 20 53 32 31 20 43 90 00 9C - Giesecke & Devrient SPK 2.1 C - -3B BF 94 00 81 31 FE 65 45 4C 55 20 41 75 73 74 72 69 61 20 31 2E 32 38 - A-Trust: trust-sign (Old Version, ca. 2002) for Digital Signature etc. - A-Trust: a-sign-premium (ca. 2004) "Bürgerkarte" ("Citizen-Card") - for Identifikation, Digital Signature etc. - ("should be" Starcos 2.3) - -3B BF 94 00 81 31 FE 65 45 4C 55 20 41 75 73 74 72 69 61 20 31 2E 32 38 - -3B BF 96 00 81 31 FE 5D 00 64 .. .. .. .. 31 C0 73 F7 01 D0 00 90 00 .. - TCOS 3.0 / NetKey 3.0 - -3B D0 A8 FF 81 F1 FB 24 00 1F C3 F4 - Philips DESFire SAM - -3B D5 95 04 00 AE 01 02 01 01 - Axalto Cyberflex Access 64K v2b SM 1.1 - -3B D6 18 00 80 B1 80 6D 1F 03 80 51 00 61 10 30 9E - Atmel/Athena T0 PC/SC Compliance Test Card No. 1 - -3B D6 18 00 81 B1 80 7D 1F 03 80 51 00 61 10 30 8F - ASECard Crypto, http://www.athena-scs.com/product.asp?pid=8 - -3B DB 11 FF 50 00 FF 00 00 00 00 00 00 00 07 92 16 03 - NEC V-WAY64 v2.1 - -3B DB 96 00 80 1F 03 00 31 C0 64 77 E3 03 00 82 90 00 C1 - CAC (Common Access Card) - -3B DB 96 00 81 B1 FE 45 1F 03 80 F9 A0 00 00 03 08 00 00 10 00 18 - Oberthur CS PIV End Point v1.08 FIPS201 Certified - -3B DE 18 FF 81 F1 FB 34 00 1F 07 44 45 53 46 69 72 65 53 41 4D 56 31 2E 30 D2 - Mifare Desfire SAM Module - -3B DE 18 FF C0 80 B1 FE 45 1F 03 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 2B - Estonian Identity Card (EstEID v1.0 2006 cold) - -3B DF 18 00 81 31 FE 67 00 5C 49 43 4D D4 91 47 D2 76 00 00 38 33 00 58 - Infineon SICRYPT Card Module D4 PC/SC Compliance Test Card - -3B E0 00 00 81 31 20 40 30 - SmarTEC - -3B E2 00 00 40 20 49 .. - Schlumberger Cryptoflex 4k - -3B E2 00 00 40 20 49 05 - Schlumberger Cryptoflex DES - -3B E2 00 00 40 20 49 06 - Schlumberger Cryptoflex - -3B E2 00 00 40 20 49 07 - Schlumberger Cryptoflex Key Generation - -3B E2 00 FF C1 10 31 FE 55 C8 02 9C - Aladdin eToken PRO (USB token) - Siemens CardOS M4.0 - -3B E3 00 FF 91 81 71 26 44 00 01 13 20 2D - Metrebus Card - (used in Rome to store personal information and Atac subscription. - Atac is the public transport company of the city of Rome.) - http://www.atac.roma.it/smart/smart.asp?A=2&S=22&PR=4&LNG=2 - -3B E6 00 FF 81 31 FE 45 4A 43 4F 50 30 33 07 - IBM JCOP 30/16 - -3B E6 00 FF 81 31 FE 45 4A 43 4F 50 31 30 05 - IBM JCOP 10/16 - -3B E6 00 FF 81 31 FE 45 4A 43 4F 50 32 30 06 - IBM JCOP 20/16 - IBM JCOP20 with MIFARE - or Datakey Smart Card Model 330J - (http://www.datakey.com/products/smart_cards/products_sc_330j.shtml) - -3B E6 00 FF 81 31 FE 45 4A 43 4F 50 32 31 07 - IBM JCOP ID21 - -3B E6 00 FF 81 31 FE 45 4A 43 4F 50 33 30 07 - Mifare ProX T=1 - -3B E6 00 FF 81 31 FE 45 4A 43 4F 50 33 31 06 - IBM JCOP 30/31bio (contact interface) - -3B E7 00 00 91 81 31 FE 41 01 10 30 01 00 90 80 49 - "FirmenTicket" from the "Rheinbahn" for the "VRR" - its a ticket corporates can buy for their employees. so its called - "FirmenTicket". "Rheinbahn" is the local service operator for the - mass traffic in and around duesseldorf/germany. "VRR" is traffic - network spanning over at least a big part of north rhine westphalia - (Verkehrsverbund Rhein-Ruhr) - (http://www.vrr.de/de/tickets_und_tarife/vielfahrer/firmenticket/index.php) - -3B E9 00 00 81 21 45 45 4D 56 5F 41 54 52 20 06 6C - VISA card, issued by HVB Bank Czech Republic (http://www.hvb.cz) - -3B E9 00 00 81 21 45 56 49 53 5F 49 4E 46 20 06 78 - VISA card, issued by the Austrian "Raiffeisen" bank (http://www.raiffeisen.at/ - Visa Card - Maximum - Oyak Bank / Turkey - -3B E9 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 32 32 A7 - IBM JCOP v2.2 41 - -3B E9 00 FF C1 10 31 FE 55 C8 01 20 50 4E 34 30 31 32 AD - Siemens CardOS/M 3.0 (SLE66CX160S) - -3B EA 00 FF 81 31 20 75 00 64 05 14 01 02 31 00 90 00 27 - GCOS-MDK - -3B EA 00 FF 81 31 FE 45 54 55 42 2D 43 4B 01 03 01 00 7B - Technische Universität Berlin - Campus Karte - Maybe Sm@rtCafé Expert 2.0 (Giesecke & Devrient) - or GemXpresso 211 PK (Gemplus) - Includes a Mifare-Chip (1 KB - Memory-Chip) - -3B EB 00 00 81 31 42 45 4E 4C 43 68 53 43 4B 30 34 30 31 2B - Dutch University accesscard & Electronic purse & telphone card - -3B EB 00 00 81 31 42 45 4E 4C 43 68 69 70 70 65 72 30 31 0A - Dutch Post (Chipper) - -3B EC 00 FF 81 31 FE 45 A0 00 00 00 56 33 33 30 4A 33 06 00 A1 - Datakey model 330J card, www.datakey.com - http://www.hmk.de/downloads/datakey/Model_330J_Smart_Card.pdf - Model 330J JavaCard v2.1.1 - Global Platform v2.0.1 specifications. - JCCOS operating system applet (Java-based Cryptographic Card - Operating System) - -3B EF 00 00 40 14 80 25 43 45 52 45 53 57 01 16 01 01 03 90 00 - Electronic Identification Card from the FNMT, the Spanish Official - Certification Authority (Fábrica Nacional de Moneda y Timbre) - FNMT-Ceres Siemens Infineon SLE 19 - -3B EF 00 00 40 14 80 25 43 45 52 45 53 57 05 60 01 02 03 90 00 - FNMT-Ceres Siemens Infineon SLE 20 - Fábrica Nacional de Moneda y Timbre - -3B EF 00 00 81 31 20 49 00 5C 50 43 54 10 27 F8 D2 76 00 00 38 33 00 4D - Infineon Technologies PC/SC Compliance Test Card V1.0 - -3B EF 00 00 81 31 FC 45 80 31 80 65 11 01 13 00 01 53 41 43 45 81 04 21 - Slovenska sporitelna (SLSP) Bank card, Maestro Card with chip - -3B EF 00 FF 81 31 20 45 42 61 73 69 63 43 61 72 64 20 5A 43 32 2E 33 BD - ZeitControl BasicCard Enhanced 2.3 - -3B EF 00 FF 81 31 20 45 42 61 73 69 63 43 61 72 64 20 5A 43 33 2E 33 BC - Electronic Purse (Elton Senegal) - -3B EF 00 FF 81 31 50 45 65 63 0D 24 20 02 80 00 05 08 33 56 10 01 02 43 - German ec card - -3B EF 00 FF 81 31 20 75 42 61 73 69 63 43 61 72 64 20 5A 43 33 2E 33 8C - ZeitControl BasicCard Enhanced 3.3 - -3B EF 00 FF 81 31 20 75 42 61 73 69 63 43 61 72 64 20 5A 43 33 2E 37 88 - ZeitControl BasicCard Enhanced 3.7 - -3B EF 00 FF 81 31 20 75 42 61 73 69 63 43 61 72 64 20 5A 43 33 2E 39 86 - ZeitControl BasicCard Enhanced 3.9 - -3B EF 00 FF 81 31 42 45 .* 38 - UNI-Card - -3B EF 00 FF 81 31 42 45 65 63 03 02 03 02 80 00 22 40 48 95 96 00 20 28 - Scard Sparkasse Detmold, Deutschland BLZ 47650130 - -3B EF 00 FF 81 31 50 45 42 61 73 69 63 43 61 72 64 20 5A 43 31 2E 31 CC - ZeitControl BasicCard Compact 1.1 - -3B EF 00 FF 81 31 50 45 65 63 .. .. .. .. .. .. .. .. .. .. .. .. .. .. - GeldKarte v2 (Germany) - -3B EF 00 FF 81 31 50 45 65 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - Geldkarte v2 - -3B EF 00 FF 81 31 50 45 65 63 08 0B 40 02 80 00 08 15 20 03 36 04 00 7E - old banking card (electronic-card / Maestro / Geldkarte) of the - Stadt-Sparkasse Duesseldorf (like the above, but old - around 2002). - -3B EF 00 FF 81 31 52 45 4D 46 43 20 49 42 4D 20 34 30 48 39 36 30 31 FB - IBM MFC 3.5 file system smart card - (Card from the book "Smart Card Application Development Using Java") - -3B EF 00 FF 81 31 60 45 65 63 04 02 11 00 00 00 00 00 A5 32 A5 01 11 B6 - GledKarte - Siemens M3-Module with a Motorola SC-28. - G&D (Giesecke&Devrient) Geldkarten-OS mit der Version 11 - -3B EF 00 FF 81 31 60 45 65 63 06 03 14 02 50 00 06 51 08 11 5E 01 41 90 - Geldkarte from Deutsche Bank, Thomson-Chip - -3B EF 00 FF 81 31 66 45 49 42 4D 20 4D 46 43 34 30 30 32 30 38 33 31 A1 - IBM MFC 4.1 file system smart card - Card from the book "Smart Card Application Development Using Java" - authors: Uwe Hansmann, Martin. S. Nicklous, Thomas Schäck, Achim Schneider, Frank Seliger - -3B EF 00 FF 81 31 66 45 65 63 20 20 49 42 4D 20 33 2E 31 20 20 20 20 - IBM eCash - -3B EF 00 FF 81 31 66 45 65 63 20 20 49 42 4D 20 33 2E 31 20 20 20 20 CF - IBM eCash - -3B EF 00 FF 81 31 86 45 49 42 4D 20 4D 46 43 34 30 30 30 30 38 33 31 43 - ComCard MFC 4.1 - -3B EF 00 FF 81 31 FE 45 65 63 11 04 01 02 80 00 0F 27 40 00 03 01 00 E1 - Postbank Geldkarte - -3B EF 00 FF 81 31 FE 45 65 63 11 04 01 02 80 00 0F 46 20 04 23 01 00 C4 - Postbank ec/Maestro (Germany) - -3B EF 00 FF 81 31 FE 45 80 31 C0 6B 49 42 4D 20 4A 65 74 5A 20 4D 32 39 - UBS Internet Card (IBM JetZ M2) - -3B F2 18 00 02 C1 0A 31 FE 55 C8 07 76 - Siemens CardOS V4.3 - -3B F2 18 00 02 C1 0A 31 FE 58 C8 08 74 - Siemens CardOS V4.3B - -3B F2 18 00 02 C1 0A 31 FE 58 C8 09 75 - Siemens CardOS V4.2B - -3B F2 18 00 FF C1 0A 31 FE 55 C8 06 8A - Siemens CardOS M 4.2 (SLE66CX642P) - -3B F2 98 00 FF C1 10 31 FE 55 C8 03 15 - Siemens CardOS M 4.01 (SLE66CX320P) - -3B F2 98 00 FF C1 10 31 FE 55 C8 04 12 - CardOS M4.01a (SLE66CX322P) - -3B F4 18 00 02 C1 0A 31 FE 58 56 34 63 76 C5 - Eutron CryptoIdentity (reader + card token) - -3B F4 18 00 FF 81 31 80 55 00 31 80 00 C7 - Identity card of Italian Republic - -3B F4 98 00 FF C1 10 31 FE 55 4D 34 63 76 B4 - Eutron Digipass 860 (reader + card token) - -3B F5 91 00 FF 91 81 71 FE 40 00 41 00 00 00 00 05 - Contactless Mifare Ultralight - -3B F5 91 00 FF 91 81 71 FE 40 00 41 08 00 00 00 0D - Contactless Mifare - -3B F5 91 00 FF 91 81 71 FE 40 00 41 18 00 00 00 1D - Contactless Mifare 4k - -3B F5 91 00 FF 91 81 71 FE 40 00 41 88 00 00 00 8D - Contactless Mifare 1k or 4k - -3B F6 18 00 FF 81 31 FE 45 4A 43 4F 50 32 30 0E - IBM JCOP20 - -3B F6 18 00 FF 81 31 FE 45 4A 43 4F 50 33 30 0F - Philips P8RF5016 running IBM JCOP 30 (contact interface) - -3B F6 18 00 FF 81 31 FE 45 4A 43 4F 50 33 31 0E - IBM JCOP BIO31 - IBM JCOP BIO31 Java card - -3B F7 11 00 01 40 96 54 30 04 0E 6C B6 D6 90 00 - PIC16F876-04/SP (PICCard2) or - PIC16F84A-04/P + 24LC16B (PICCard1) or - Canal + Canal Digital Spain year 2000/2001 or - PIC Silver Card 2 (PIC16F876/7 + 24C64) - -3B F7 11 00 01 40 96 58 42 14 0E 6C B6 D6 - UK on digital (terrestrial digital TV card) - -3B F7 11 00 01 40 96 70 70 07 0E 6C B6 D6 90 00 - M-II (a.k.a. M-2, a.k.a. Platinum Card), AT90SC6464C based - KnotCard II - TitaniumElite - -3B F7 11 00 01 40 96 70 70 17 0E 6C B6 D6 - Canal Satellite card (VERSION 7.1 SYSTEM / SECA2) - -3B F7 91 00 FF 91 81 71 FE 40 00 41 20 00 11 77 81 80 40 - Contactless Mifare DESFire - -3B F8 18 00 00 81 31 FE 45 00 73 C8 40 13 00 90 00 93 - Giesecke & Devrient Sm@rtCafé Expert 3.0 - -3B F9 94 00 00 81 31 FE 65 46 54 20 56 31 30 30 90 00 83 - ePass 2000 - -3B FA 11 00 02 40 60 43 C6 02 F8 03 03 00 00 90 00 - DeLaRue DX(?) - -3B FA 13 00 00 81 31 FE 45 4A 43 4F 50 34 31 56 - JCOP41 V221 - -3B FA 13 00 FF 81 31 80 45 00 31 C1 73 C0 01 00 00 90 00 B1 - OpenPGP - -3B FA 94 00 00 81 31 20 43 80 65 A2 01 01 01 3D 72 D6 43 21 - GemXpresso Pro R3 32PK (MPCOS, T=1) - -3B FA 98 00 FF C1 10 31 FE 55 C8 03 53 41 47 5F 50 4B 49 32 77 - Siemens corporate ID card (access to the building / rooms etc, - stores PKI private keys/certificates) - -3B FA 98 00 FF C1 10 31 FE 55 C8 04 53 41 47 5F 50 4B 49 32 70 - Siemens Belgium Corporate Card - -3B FB 13 00 FF 81 31 80 75 5A 43 36 2E 35 20 52 45 56 20 43 64 - ZeitControl BasicCard 6.5, multiapplication with 30 kByte EEPROM - -3B FB 13 00 FF 81 31 80 75 5A 43 35 2E 35 20 52 45 56 20 47 63 - ZeitControl BasicCard 5.5 - -3B FB 13 00 FF C0 80 31 80 75 5A 43 35 2E 34 20 52 45 56 20 41 A5 - ZeitControl BasicCard Professional 5.4 Revision A - -3B FB 96 00 00 80 31 FE 45 00 31 C0 64 77 E3 02 00 82 90 00 76 - Oberthur ID-One Cosmo - -3B FB 98 00 FF C1 10 31 FE 55 00 64 05 20 47 03 31 80 00 90 00 F3 - Gemplus GemGate 32K - distributed by Postecert (www.postecert.it) to legally sign documents - -3B FC 98 00 FF C1 10 31 FE 55 C8 03 49 6E 66 6F 63 61 6D 65 72 65 28 - New Card Infocamere (Italy) series 1402... - http://www.card.infocamere.it/ - Siemens Informatica - Siemens M4.01a - chip Infineon SLE66CX322P (CC EAL5) - Memory EEPROM: 32KB - Operating system CARDOS - Max numero dei tentativi PIN: 3 - Pin: da 5 a 8 digit - Unblocked by tool CARDOS API 2.2 - -3B FD 18 00 00 80 31 FE 45 00 31 80 71 8E 64 52 D9 04 00 81 90 00 5B - Oberthur Card Systems, authentIC - -3B FD 94 00 00 81 31 20 43 80 31 80 65 B0 83 02 04 7E 83 00 90 00 B6 - GXPPRo-R3.x STD PTS T=1 - -3B FD 94 00 00 81 31 60 65 80 31 C0 69 4D 54 43 4F 53 73 01 01 11 E0 - MTCOS Light, http://www.masktech.de/products/mtcoslight/index.html - -3B FE 91 00 FF 91 81 71 FE 40 00 41 28 00 01 80 81 00 73 C8 40 00 00 90 00 4D - Philips SmartMX chip (IBMs JCOP OS) - -3B FE 94 00 FF 80 B1 FA 45 1F 03 45 73 74 45 49 44 20 76 65 72 20 31 2E 30 43 - Estonian Identity Card (EstEID v1.0 cold) - -3B FF 11 00 00 81 31 FE 4D 80 25 A0 00 00 00 56 57 44 4B 33 33 30 06 00 D0 - Datakey 32K PKI Smart Card Model 330 - (http://www.datakey.com/products/smart_cards/products_sc_330.shtml) - -3B FF 11 00 00 81 71 40 42 00 00 21 01 31 42 52 00 0[0,5] 63 .. .. .. .. 90 00.* - Smart Card "The Smart Way to Login" - Used on Acer TravelMate to secure boot - -3B FF 11 00 02 40 64 80 69 A2 07 01 03 57 00 00 FF 00 83 00 90 00 - Gemplus GemXpresso - -3B FF 13 00 00 81 31 FE 4D 80 25 A0 00 00 00 56 57 44 4B 33 33 30 06 00 D2 - Datakey DCOS model 330 (DKCCOS 6.0 token) - -3B FF 13 00 FF 80 31 FE 45 53 46 53 45 2D 43 58 33 32 32 2D 56 18 02 08 76 - SmartCafe Expert Java - -3B FF 13 00 FF 80 31 FE 45 53 46 53 45 2D 43 58 33 32 32 2D 56 18 03 08 77 - Giesecke & Devrient SmartCafe Expert 32K v2.0 #2 - -3B FF 13 00 FF 81 31 FE 45 65 63 11 04 50 02 80 00 08 39 00 04 02 05 02 E9 - German "Geldkarte" supplied by the Deutsche Bank in Karlsruhe, - Baden-Württemberg, Germany. - -3B FF 13 00 FF 81 31 FE 45 65 63 11 04 50 02 80 00 08 54 00 04 23 05 02 A5 - Maestrocard/Geldkarte (Stadtsparkasse Haltern, Germany) - -3B FF 13 00 FF 81 31 FE 5D 80 25 A0 00 00 00 56 57 44 4B 33 32 30 05 00 3F - Datakey DCOS model 320 - -3B FF 18 00 00 81 31 FE 45 00 6B 04 05 01 00 01 11 01 43 4E 53 10 31 80 69 - Sanitary Card of "Friuli Venezia Giulia" region (Italian Republic) - Carta Nazionale dei Servizi (Italia) http://cartaservizi.regione.fvg.it/ - -3B FF 18 00 FF 80 31 FE 45 53 46 53 45 2D 43 58 33 32 32 2D 56 18 03 08 7C - Giesecke & Devrient Sm@rtCafé Expert 2.0 - -3B FF 18 00 FF 80 31 FE 45 53 6D 40 72 74 43 61 66 65 45 78 70 65 72 74 65 - Giesecke & Devrient SmartCafe 32K v1 - -3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 00 26 00 04 10 09 - Maestrocard/Geldkarte (Postbank, Germany) - -3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 01 55 00 04 10 7B - Volksbank VR-BankCard (GeldKarte) - -3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 07 88 00 04 10 A0 - HBCI-Karte (Berliner Sparkasse, Germany) - -3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 05 29 00 04 10 03 - Geldkarte/HBCI(DDV-1) (Stadtsparkasse Vorpommern, Germany) - -3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 13 82 00 04 10 BE - Bremer Karte ("Geldkarte und BSAG-Kundenkarte in einem.") - http://www.bsag.de/4911.php - -3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 14 06 00 04 10 3D - Geldkarte/HBCI(DDV-1) (Staedtische Sparkasse Offenbach, Germany) - -3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 50 00 10 90 55 70 00 04 10 0A - EC-Card from DKB (Deutsche Kreditbank AG) - -3B FF 18 00 FF 81 31 3C 45 65 63 0D 02 31 02 80 00 12 24 30 00 20 04 10 59 - Geldkarte (Germany) - -3B FF 18 00 FF 81 31 50 45 65 63 .. .. .. .. .. .. .. .. .. .. .. .. .. .. - GeldKarte v3 (Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 0D 08 65 07 64 00 0D 91 04 90 00 06 16 0E - German Railway's (Deutsche Bahn AG) "Konzernausweis" - -3B FF 18 00 FF 81 31 FE 45 65 63 0D 04 50 02 80 00 08 90 09 70 00 05 00 2A - Landesbank baden-Württemberg Geldkarte - -3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 05 28 00 0D 90 81 06 00 06 15 58 - Geldkarte/HBCI (Frankfurter Sparkasse, Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D 90 58 45 00 06 15 8C - Stadtsparkasse München electronic cash card / Geldkarte - -3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D 90 73 07 00 06 15 E5 - Sparkasse Acchen HBCI Geld Karte - -3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D 90 74 32 00 06 15 D7 - German HBCI-Banking Card with 'Geldkarte' from the bank "Sparkasse Marburg-Biedenkopf" - -3B FF 18 00 FF 81 31 FE 45 65 63 0D 07 63 07 64 00 0D 90 92 61 00 06 15 62 - Geldkarte (Frankfurter Sparkasse, Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 03 50 02 80 00 08 27 70 02 06 05 01 8A - old banking card (electronic-card / Maestro / Geldkarte) of the - "Volksbank Gelderland eG" (around 2003) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 05 40 02 50 00 10 55 10 03 03 05 00 43 - belongs to a banking card (electronic-card / Maestro / Geldkarte). - the bank calls it "VR-BankCard". the banks name is "Volksbank - Gelderland eG" and is part of the "Volksbanken und Raiffeisenbanken" - (http://www.vb-gelderland.de/html/5/2394/rubrik/1282.html) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 05 50 03 10 05 00 43 - HBCI-Karte (Bordesholmer Sparkasse, Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 19 10 04 20 05 00 28 - Stadtsparkasse München HBCI card / Geldkarte - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 25 60 05 12 05 00 57 - Geldkarte/HBCI(DDV-1) (Stadtsparkasse Vorpommern, Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 27 30 02 16 05 00 06 - GeldKarte from Sparkasse bank - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 27 80 03 25 05 00 84 - Volksbank VR-BankCard (GeldKarte) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 40 02 50 00 10 28 50 01 11 05 00 6D - HBCI Bancing Card of Sparkasse Pforzheim - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 06 60 03 04 06 13 87 - Geldkarte (Volksbank Offenburg, Germany) - -3B FF 18 00 FF 81 31 .. 45 65 63 .. .. .. .. .. .. .. .. .. .. .. .. .. .. - Geldkarte (generic ATR) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 20 90 03 09 06 13 5C - Geldkarte [ec, Maestro] (1822 direkt Frankfurter Sparkasse, Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 43 50 01 17 06 13 E3 - EC-Card of Sparkasse Pforzheim Calw - -3B FF 18 00 FF 81 31 FE 45 65 63 11 06 62 02 80 00 11 16 50 05 17 06 13 B2 - FinTS (BBBank Karlsruhe, Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 08 43 02 50 00 10 46 50 01 08 05 30 27 - HBCI-Karte (Sparkasse Altmark-West, Salzwedel, Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 11 08 66 02 80 00 11 40 50 03 18 06 20 D4 - banking card (electronic-card / Maestro / Geldkarte). the bank+calls - it "S-Card" or "Sparkassen-Card". the banks name is "Stadtsparkasse - Duesseldorf" and is part of the "Sparkassen-Finanzgruppe" (a finance - group, network of local banks). - -3B FF 18 00 FF 81 31 FE 45 65 63 11 08 66 02 80 00 11 56 00 03 18 06 20 92 - Geldkarte [ec, Maestro] (Sparkasse Langen-Seligenstadt, Germany) - -3B FF 18 00 FF 81 31 FE 45 65 63 1A 01 41 02 50 00 10 52 09 05 67 05 10 21 - Maestro/Geldkarte (BBBank Karlsruhe, Germany) - -3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 02 00 01 01 01 43 4E 53 10 31 80 9F - Carta Nazionale dei Servizi - InfoCamere - -3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 02 00 01 11 01 43 4E 53 10 31 80 8F - Carta Regionale dei Servizi - Regione Lombardia - -3B FF 18 00 FF 81 31 FE 55 00 6B 02 09 02 00 01 11 01 43 4E 53 11 31 80 8E - Infocamere CNS - -3B FF 18 00 FF C1 0A 31 FE 55 00 6B 05 08 C8 05 01 11 01 43 4E 53 10 31 80 0C - Carta Regionale dei Servizi - Regione Lombardia - -3B FF 32 00 00 10 80 80 31 E0 5B 47 42 50 00 00 00 00 00 00 02 55 - UK NatWest BT PayToView Mondex - -3B FF 94 00 00 40 0A 80 31 00 73 12 21 13 57 4A 33 0E 02 32 41 00 - Turkcell SIMPlus64 / Turkey - -3B FF 94 00 FF 80 B1 FE 45 1F 03 00 68 D2 76 00 00 28 FF 05 1E 31 80 00 90 00 23 - D-Trust Signature Card (www.d-trust.net): - - Citizencard of the People of Ulm in Germany (Bürgerkarte) - - Qualified Electronic Signature Card (Qualifizierte Signaturkarte) - -3B FF 94 00 FF C0 0A 1F 43 80 31 E0 73 36 21 13 57 4A 43 49 1C 31 30 32 1C - Giesecke & Devrient - UniverSIM Pegasus - -3B FF 95 00 FF 40 0A 80 31 00 73 1A 21 13 57 4A 50 48 60 31 41 47 - Vodafone 64 KB SIM with Javacard - -3B FF 95 00 FF 40 0A 80 31 E8 73 F6 21 13 67 4A 47 48 60 31 42 00 - Giesecke & Devrient STARSIM - -3B FF 96 00 FF C0 0A 1F 43 80 31 E0 73 36 21 13 57 4A 43 49 1C 31 30 32 1E - Giesecke & Devrient - UniverSIM Pegasus - -3B FF 95 00 FF C0 0A 1F 43 80 31 E0 73 F6 21 13 57 4A 33 48 61 32 41 47 D6 - GSM SIM (issued by e-plus, Germany) - -3F 05 DC 20 FC 00 01 - DigiCash Facility Card - -3F 28 00 00 11 14 00 03 68 90 00 - SIMEMU - a DIY GSM SIM card - http://simemu.cjb.net/ - -3F 2D 00 27 A0 51 82 7D 00 00 00 52 00 0C 90 00 - Porta Moedas Multibanco (Portugeese electronic purse) - -3F 2F 00 80 59 AF 02 01 01 30 00 00 0A 0E 83 06 9F 12 - Gemplus GemXplore - -3F 2F 00 80 59 AF 02 01 02 30 00 0C 0A 0E 83 1E 9F 16 - GSM-SIM (900MHz) card of the carrier "Mannesmann Mobilfunk" for - their network "D2-Privat" - now known as Vodafone Mobilfunk - (http://www.vodafone.de/). - -3F 2F 00 80 69 AE 02 02 01 36 00 00 0A 0E 83 3E 9F 16 - GSM-SIM e-plus (1800MHz) - -3F 2F 00 80 69 AF 02 04 01 36 00 02 0A 0E 83 3E 9F 16 - GSM-SIM D2 CallYa (900MHz) - -3F 2F 00 80 69 AF 03 07 03 52 00 00 0A 0E 83 3E 9F 16 - GemXplore 98 V1 16K - -3F 2F 00 80 69 AF 03 07 03 52 00 0D 0A 0E 83 3E 9F 16 - GSM-SIM Debitel D2 (900MHz) - -3F 2F 00 80 69 AF 03 07 03 5A 00 15 0A 0E 83 3E 9F 16 - Virgin Mobile SIM (Gemplus) - -3F 67 25 00 21 20 00 0F 78 90 00 - Bank Nederlandse Gemeenten, BNG Data Services - -3F 65 25 .. .. 04 6C 90 .0 - Carte Bancaire (French banking card) - -3F 65 25 00 2[2,C] 09 [F,6]9 90 00 - Sesam Vitale (French health card) - -3F 65 25 00 2B 09 62 90 00 - Coinamatic SmartyCity smartcard - -3F 65 25 00 2B 09 EB 90 00 - Bull Scot 5 - -3F 65 25 00 52 09 6A 90 00 - French carte Vitale - -3F 65 25 08 22 04 68 90 00 - France Telecom card (ex Pastel card) - -3F 65 25 08 33 04 20 90 00 - D-Trust card - -3F 65 35 10 02 04 6C 90 00 - Postcard (Switzerland) - -3F 65 35 64 02 04 6C 90 40 - Postcard (Switzerland) - -3F 67 25 00 26 14 00 20 68 90 00 - Pay-TV card from Casema Cable Television, Netherland - -3F 67 25 00 2A 20 00 0F 68 90 00 - Carte Grand Voyageur (SNCF: French train company) - -3F 67 25 00 2A 20 00 40 68 9F 00 - Swiss Cash card - -3F 67 25 00 2A 20 00 4[0,1] 68 90 00 - Dutch ChipKnip, Proton - (chip Bull CC 60 V1, Bull CC 60 V2 or Bull CC 1000) - -3F 67 25 04 21 20 00 07 68 90 00 - Philips TB100 (C-MOS chip) - -3F 67 2F 04 11 20 00 00 68 90 00 - BULL HN ITALIA 06/92 - 100.000 - 64MP - La Sapienza - Universita' di Roma - -3F 69 00 00 24 AF 01 70 01 01 FF 90 00 - French GSM SIM card (900MHz) - -3F 6C 00 00 24 A0 30 00 FF 00 00 01 00 04 90 00 - Gemplus MCOS 16K DES Sample Card - -3F 6C 00 00 25 A0 30 89 76 00 00 04 01 0C 90 00 - MCOS 24k EEPROM - -3F 6C 00 00 3C A0 30 9E 61 00 00 01 00 04 90 00 - Gemplus - British Gas - Gascard - -3F 6C 00 00 3C A0 30 A7 58 00 00 01 01 8C 90 00 - Rendezvous Series 7 (D2-Mac satellite TV card) - -3F 6D 00 00 80 31 80 65 B0 05 01 02 5E 83 00 90 00 - Gemplus GemXpresso 211PK or 211PK-IS - -3F 6D 00 00 80 31 80 65 B0 05 01 02 5E 92 00 90 00 - Gemplus GemXpresso 32K - -3F 77 18 25 00 29 14 00 62 68 90 00 - Viaccess card - -3F 78 12 25 01 40 B0 03 4A 50 20 48 55 - DSS/DTV H - -3F 7E 11 25 05 40 B0 08 00 00 4D 59 00 00 00 53 4B 0B 07 - BSkyB Series 11 (DSS satellite TV card) - -3F 7F 11 25 05 40 B0 0F 69 FF 4D 59 00 00 00 53 4B 0C 06 00 - Sky Series 12 (DSS satellite TV card) - -3F 7E 11 25 09 40 B0 01 00 00 4D 59 00 00 03 53 4B 0A 01 - Sky Series 10 (DSS satellite TV card) - -3F 7E 11 25 05 40 B0 08 00 00 4D 59 00 00 00 53 4B 0B 08 - Sky Series 11 (DSS satellite TV card) - -3F 7F 13 25 03 33 B0 06 69 FF 4A 50 D0 00 00 53 59 00 00 00 - Sky 2005/6 (DSS satellite TV card) - -3F 7F 13 25 03 38 B0 04 FF FF 4A 50 00 00 29 48 55 .. .. .. - DSS/DTV HU - -3F 7F 13 25 03 40 B0 0B 69 4C 4A 50 C0 00 00 53 59 00 00 00 - Sky Digital (DSS satellite TV card) - -3F 78 13 25 03 40 B0 20 FF FF 4A 50 00 - DSS/DTV P4 - -3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 30 20 52 65 76 41 32 30 48 - DSS/DISH ROM10 - -3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 30 20 52 65 76 41 32 31 49 - PayTV card for DishNetwork Sat receiver http://www.dishnetwork.com/ - -3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 31 20 52 65 76 42 - NTL digial TV card (Nagravision) - -3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 31 20 52 65 76 42 30 36 4E - Telewest Broadband (Nagravision) - -3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 31 20 52 65 76 42 30 42 3A - NagraVision card for StarHub Digital Cable DVB-C Singapore - -3F FF 95 00 FF 91 81 71 A0 47 00 44 4E 41 53 50 30 31 31 20 52 65 76 42 30 44 3C - NagraVision card for Virgin Media in the UK - -3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 31 30 20 52 65 76 41 30 31 14 - TVA Digital - Nagra Vision ID TV-01 - -3F FF 95 00 FF 91 81 71 FE 47 00 44 4E 41 53 50 31 31 30 20 52 65 76 41 43 33 65 - Brazilian NET Digital (Cable TV provider) - Nagra Vision "NASP110 RevA01" - -# do not delete
--- a/recpt1/Makefile Wed Nov 18 13:12:44 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -TARGET = recpt1 -RELEASE_VERSION = '1.0.0' - -PREFIX = /usr/local -CC = gcc -CPPFLAGS = -I../driver -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DB25 -CFLAGS = -O2 -g -pthread - -PCSC_LIBS = `pkg-config libpcsclite --libs` -B25_LIBS = -larib25 -LIBS = $(PCSC_LIBS) $(B25_LIBS) -lm -lpthread -LDFLAGS = - -OBJS = recpt1.o decoder.o mkpath.o -DEPEND = .deps - -all: $(TARGET) - -clean: - rm -f $(OBJS) $(TARGET) $(DEPEND) version.h - -$(TARGET): $(OBJS) - $(CC) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS) - -$(DEPEND): version.h - $(CC) -MM $(OBJS:.o=.c) $(CPPFLAGS) > $@ - -version.h: - revh=`hg parents --template 'const char *version = "r{rev}:{node|short} ({date|isodate})";\n' 2>/dev/null`; \ - if [ -n "$$revh" ] ; then \ - echo "$$revh" > $@; \ - else \ - echo "const char *version = \"$(RELEASE_VERSION)\";" > $@; \ - fi - -install: $(TARGET) - install -m 755 $(TARGET) $(PREFIX)/bin - --include .deps
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recpt1/Makefile.in Sat Nov 28 00:12:05 2009 +0900 @@ -0,0 +1,48 @@ +DESTDIR = +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +CC = @CC@ +INSTALL = @INSTALL@ + +TARGET = recpt1 +RELEASE_VERSION = '1.0.0' + +CPPFLAGS = -I../driver -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +CFLAGS = -O2 -g -pthread + +LIBS = @LIBS@ +LDFLAGS = + +OBJS = recpt1.o decoder.o mkpath.o +DEPEND = .deps + +all: $(TARGET) + +clean: + rm -f $(OBJS) $(TARGET) $(DEPEND) version.h + +distclean: clean + rm -f Makefile config.h config.log config.status + +maintainer-clean: distclean + rm -fr configure config.h.in aclocal.m4 autom4te.cache *~ + +$(TARGET): $(OBJS) + $(CC) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS) + +$(DEPEND): version.h + $(CC) -MM $(OBJS:.o=.c) $(CPPFLAGS) > $@ + +version.h: + revh=`hg parents --template 'const char *version = "r{rev}:{node|short} ({date|isodate})";\n' 2>/dev/null`; \ + if [ -n "$$revh" ] ; then \ + echo "$$revh" > $@; \ + else \ + echo "const char *version = \"$(RELEASE_VERSION)\";" > $@; \ + fi + +install: $(TARGET) + $(INSTALL) -m 755 $(TARGET) $(DESTDIR)$(bindir) + +-include .deps
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recpt1/autogen.sh Sat Nov 28 00:12:05 2009 +0900 @@ -0,0 +1,59 @@ +#!/bin/sh + +[ -f configure.ac ] || { + echo "autogen.sh: run this command only at the top of a recpt1 source tree." + exit 1 +} + +DIE=0 + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile recpt1." + echo "Get ftp://ftp.gnu.org/pub/gnu/autoconf/autoconf-2.62.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOCONF=yes +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have automake installed to compile recpt1." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.10.1.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOMAKE=yes +} + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.10.1.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +# if no autoconf, don't bother testing for autoheader +test -n "$NO_AUTOCONF" || (autoheader --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`autoheader'. The version of \`autoheader'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/autoconf/autoconf-2.62.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +echo "Generating configure script and Makefiles for recpt1." + +echo "Running aclocal ..." +aclocal -I . +echo "Running autoconf ..." +autoconf +echo "Running autoheader ..." +autoheader
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recpt1/configure.ac Sat Nov 28 00:12:05 2009 +0900 @@ -0,0 +1,24 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) +AC_INIT(recpt1, 1.0.0, yaz@honeyplanet.jp) +AC_CONFIG_SRCDIR([recpt1.c]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL + +# Checks for b25 support. +AC_ARG_ENABLE(b25, + [AC_HELP_STRING([--enable-b25],[enable b25 support])], + [AC_CHECK_LIB([arib25], [create_arib_std_b25], , [AC_MSG_WARN(libarb25 is not available.)], [-lpcsclite])] +) + +# Checks for libraries. +AC_CHECK_LIB([m], [log10]) +AC_CHECK_LIB([pthread], [pthread_kill]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT
--- a/recpt1/decoder.c Wed Nov 18 13:12:44 2009 +0900 +++ b/recpt1/decoder.c Sat Nov 28 00:12:05 2009 +0900 @@ -3,6 +3,8 @@ #include "decoder.h" +#ifdef HAVE_LIBARIB25 + decoder * b25_startup(decoder_options *opt) { @@ -108,3 +110,32 @@ return code; } + +#else + +/* functions */ +decoder *b25_startup(decoder_options *opt) +{ + return NULL; +} + +int b25_shutdown(decoder *dec) +{ + return 0; +} + +int b25_decode(decoder *dec, + ARIB_STD_B25_BUFFER *sbuf, + ARIB_STD_B25_BUFFER *dbuf) +{ + return 0; +} + +int b25_finish(decoder *dec, + ARIB_STD_B25_BUFFER *sbuf, + ARIB_STD_B25_BUFFER *dbuf) +{ + return 0; +} + +#endif
--- a/recpt1/decoder.h Wed Nov 18 13:12:44 2009 +0900 +++ b/recpt1/decoder.h Sat Nov 28 00:12:05 2009 +0900 @@ -1,6 +1,10 @@ #ifndef _DECODER_H_ #define _DECODER_H_ +#include "config.h" + +#ifdef HAVE_LIBARIB25 + #include <arib25/arib_std_b25.h> #include <arib25/b_cas_card.h> @@ -15,6 +19,25 @@ int emm; } decoder_options; +#else + +typedef struct { + int size; + void *data; +} ARIB_STD_B25_BUFFER; + +typedef struct decoder { + void *dummy; +} decoder; + +typedef struct decoder_options { + int round; + int strip; + int emm; +} decoder_options; + +#endif + /* prototypes */ decoder *b25_startup(decoder_options *opt); int b25_shutdown(decoder *dec); @@ -25,4 +48,5 @@ ARIB_STD_B25_BUFFER *sbuf, ARIB_STD_B25_BUFFER *dbuf); + #endif
--- a/recpt1/recpt1.c Wed Nov 18 13:12:44 2009 +0900 +++ b/recpt1/recpt1.c Sat Nov 28 00:12:05 2009 +0900 @@ -22,8 +22,9 @@ #include <sys/ioctl.h> #include "pt1_ioctl.h" +#include "config.h" +#include "decoder.h" #include "recpt1.h" -#include "decoder.h" #include "version.h" #include "mkpath.h" @@ -311,7 +312,11 @@ void show_usage(char *cmd) { +#ifdef HAVE_LIBARIB25 fprintf(stderr, "Usage: \n%s [--b25 [--round N] [--strip] [--EMM]] [--udp [--addr hostname --port portnumber]] [--device devicefile] channel rectime destfile\n", cmd); +#else + fprintf(stderr, "Usage: \n%s [--strip] [--EMM]] [--udp [--addr hostname --port portnumber]] [--device devicefile] channel rectime destfile\n", cmd); +#endif fprintf(stderr, "\n"); fprintf(stderr, "Remarks:\n"); fprintf(stderr, "if rectime is '-', records indefinitely.\n"); @@ -322,10 +327,12 @@ show_options(void) { fprintf(stderr, "Options:\n"); +#ifdef HAVE_LIBARIB25 fprintf(stderr, "--b25: Decrypt using BCAS card\n"); fprintf(stderr, " --round N: Specify round number\n"); fprintf(stderr, " --strip: Strip null stream\n"); fprintf(stderr, " --EMM: Instruct EMM operation\n"); +#endif fprintf(stderr, "--udp: Turn on udp broadcasting\n"); fprintf(stderr, " --addr hostname: Hostname or address to connect\n"); fprintf(stderr, " --port portnumber: Port number to connect\n"); @@ -546,8 +553,10 @@ int result; int option_index; struct option long_options[] = { +#ifdef HAVE_LIBARIB25 { "b25", 0, NULL, 'b'}, { "B25", 0, NULL, 'b'}, +#endif { "round", 1, NULL, 'r'}, { "strip", 0, NULL, 's'}, { "emm", 0, NULL, 'm'},