CAS Framework CAS

เฟรมเวิร์ก Media Conditional Access Systems (Media CAS) จัดเตรียม API มาตรฐานเพื่อเปิดใช้งานบริการ Conditional Access (CA) บนฮาร์ดแวร์ทีวีดิจิทัลหลายประเภท รวมถึงเคเบิลดิจิทัล ดาวเทียม ระบบภาคพื้นดิน และระบบ IPTV ผลงานกรอบกับ กรอบการป้อนข้อมูล Android TV และ Android กรอบทีวีจูนเนอร์ ให้ Java API ที่เรียกจากบริการทีวีป้อน (TIS) app

วัตถุประสงค์หลักของ Media CAS มีดังนี้

  • จัดเตรียม Java API สาธารณะและเฟรมเวิร์กปลั๊กอินดั้งเดิมที่นักพัฒนาและ OEM บุคคลที่สามสามารถใช้เพื่อสนับสนุน CAS สำหรับการออกอากาศทีวีใน Android
  • จัดเตรียมกรอบงาน CAS ภายใน Android ที่อนุญาตให้ ATV OEM ทำงานร่วมกับผู้จำหน่าย CAS หลายรายในลักษณะที่สอดคล้องกัน
  • รองรับผู้จำหน่าย CAS บุคคลที่สามหลายรายโดยใช้ปลั๊กอินดั้งเดิม ปลั๊กอิน CAS อาจใช้โปรโตคอลเครือข่ายเฉพาะผู้จำหน่าย รูปแบบข้อความการจัดการการให้สิทธิ์ (EMM)/ข้อความควบคุมการให้สิทธิ์ (ECM) และตัวถอดรหัส
  • รองรับการรักษาความปลอดภัยฮาร์ดแวร์ เช่น บันไดหลัก
  • รองรับสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) เช่น TrustZone

การกำหนดค่าที่รองรับ

การกำหนดค่าฮาร์ดแวร์จูนเนอร์

หากฮาร์ดแวร์เป็นผู้รับผิดชอบสำหรับ MPEG demultiplexing กระแสการขนส่งและการถอดรหัส, กรอบจูนเนอร์ ให้การเข้าถึงข้อมูลตามเงื่อนไขเฉพาะโปรแกรม (PSI) ข้อมูลไปยังแอพพลิเคมอกในการสั่งซื้อเพื่อติดต่อกับฮาร์ดแวร์ที่ใช้เครื่องรับโทรทัศน์

ข้อมูล PSI การเข้าถึงแบบมีเงื่อนไขประกอบด้วย CA descriptors, ECM และ EMM โครงสร้างเหล่านี้ทำให้ปลั๊กอิน CAS สามารถรับคีย์ที่จำเป็นในการถอดรหัสสตรีมเนื้อหา

ไดอะแกรมของการกำหนดค่า Tuner ฮาร์ดแวร์

รูปที่กำหนดค่าจูนเนอร์ 1. ฮาร์ดแวร์

การกำหนดค่าฮาร์ดแวร์อาจมีเลเยอร์ TEE เช่น TrustZone ซึ่งแสดงไว้ในรูปที่ 1 หากไม่มีเลเยอร์ TEE ปลั๊กอินไคลเอ็นต์ CAS สามารถสื่อสารกับบริการแลดเดอร์คีย์ฮาร์ดแวร์ที่แพลตฟอร์มจัดหาให้ เนื่องจากอินเทอร์เฟซเหล่านี้มีการเปลี่ยนแปลงเฉพาะผู้จำหน่าย Media CAS จึงไม่สร้างมาตรฐาน

การกำหนดค่าซอฟต์แวร์

ก่อน Android 11 เฟรมเวิร์ก Media CAS ยังคงสามารถใช้ในการประมวลผลเนื้อหาที่ใช้ซอฟต์แวร์ เช่น IPTV จาก IP multicast/unicast แอป TIS มีหน้าที่ในการสร้างอินสแตนซ์และจัดเตรียมวัตถุ Media CAS Java อย่างเหมาะสม

แอปอาจใช้ MediaExtractor หรือตัวแยกวิเคราะห์ MPEG2-TS อื่นๆ เพื่อดึงข้อมูล PSI ที่เกี่ยวข้องกับ CA เช่น CA descriptors, ECM และ EMM หากแอปใช้เฟรมเวิร์ก MediaExtractor แอปสามารถมอบหมายการจัดการเซสชัน CAS เช่น การเปิดเซสชันและการประมวลผล EMM/ECM ให้กับเฟรมเวิร์ก MediaExtractor จากนั้น MediaExtractor จะกำหนดค่าเซสชัน CAS โดยใช้ Native API โดยตรง

มิเช่นนั้น แอปจะรับผิดชอบในการดึงข้อมูล PSI ที่เกี่ยวข้องกับ CA และกำหนดค่าเซสชัน CAS โดยใช้ Media CAS Java API (เช่น เมื่อแอปใช้ตัวแยกวิเคราะห์ MPEG2-TS ของตัวเอง)

ไดอะแกรมของการกำหนดค่าจูนเนอร์

รูปที่ 2 IPTV ป้อนข้อมูล CAS และการกำหนดค่า descrambler ใช้ MediaExtractor กรอบ

ในสถานการณ์จำลองซอฟต์แวร์แยก ตัวแยกต้องมีซอฟต์แวร์หรือออบเจ็กต์ descrambler ที่ใช้ฮาร์ดแวร์สำหรับแทร็กที่มีสัญญาณรบกวนแต่ละแทร็ก โดยไม่คำนึงว่าแทร็กจะเรียกใช้ตัวถอดรหัสที่ปลอดภัยหรือไม่ ทั้งนี้เนื่องมาจากสิ่งต่อไปนี้

  • หากแทร็กไม่ต้องการการถอดรหัสที่ปลอดภัย ตัวแยกจะถอดรหัสหน่วยการเข้าถึงเพื่อล้างบัฟเฟอร์และแยกตัวอย่างราวกับว่ามาจากสตรีมที่ชัดเจน วิธีนี้ MediaCodec ไม่จำเป็นต้องมีส่วนร่วมในถอดรหัส
  • หากแทร็กต้องการการถอดรหัสที่ปลอดภัย ตัวแยกอาจยังต้องการตัวถอดรหัส สิ่งนี้เกิดขึ้นเมื่อสตรีมการขนส่งถูกรบกวนที่ระดับแพ็กเก็ตการขนส่ง โดยที่ส่วนหัวแพ็กเก็ตข้อมูลเบื้องต้น (PES) ถูกรบกวน ตัวแยกข้อมูลจำเป็นต้องเข้าถึงส่วนหัว PES เพื่อดาวน์สตรีมข้อมูลบางอย่าง (เช่น การประทับเวลาของการนำเสนอ)

    ตัวแยกสัญญาณจะไม่ใช้ตัวแยกสัญญาณหากสตรีมการขนส่งมีช่วงชิงที่ระดับแพ็กเก็ต PES โดยที่ส่วนหัว PES จะถูกปล่อยว่างไว้ อย่างไรก็ตาม ไม่สามารถยืนยันได้ว่าจะเกิดช่วงชิงเมื่อใดจนกว่าแพ็คเก็ตที่มีสัญญาณรบกวนจะมาถึงจริง เพื่อความง่าย สมมติว่ามีการใช้ตัวถอดรหัสหากแทร็กถูกกำหนดให้มีการรบกวนโดยยึดตามตารางการแมปโปรแกรม (PMT)

ข้อจำกัดของการกำหนดค่าซอฟต์แวร์

เมื่อแทร็กต้องการการถอดรหัสที่ปลอดภัย ตัวถอดรหัสจะต้องระมัดระวังเมื่อปล่อยให้การดำเนินการถอดรหัสเข้าสู่บัฟเฟอร์ที่ชัดเจน เนื่องจากจำเป็นต้องมีการถอดรหัสเสียงที่ไม่ปลอดภัย หากการถอดรหัสวิดีโอต้องใช้ตัวถอดรหัสที่ปลอดภัย ก็ควรแยกสัญญาณเสียงในเซสชันอื่นจากเสียง ECM สำหรับเซสชันต้องส่งสัญญาณไปยังปลั๊กอินว่าจำเป็นต้องมีตัวถอดรหัสที่ปลอดภัย

อีกทางหนึ่ง ปลั๊กอินต้องสามารถผูกคีย์กับนโยบายความปลอดภัยได้อย่างน่าเชื่อถือ มิฉะนั้น แอปสามารถรับเฟรมวิดีโอได้อย่างง่ายดายด้วยตัวถอดรหัสเสียง

แม้ว่าเซสชันนั้นจะต้องใช้ตัวถอดรหัสที่ปลอดภัย แต่ก็อาจถูกขอให้ส่งออกข้อมูลจำนวนเล็กน้อยเพื่อล้างบัฟเฟอร์โดยตัวแยกเพื่อประมวลผลส่วนหัว PES เพื่อป้องกันไม่ให้แอปที่เป็นอันตรายสร้างปลั๊กอินส่งคืนหน่วยการเข้าถึงทั้งหมด ปลั๊กอินจำเป็นต้องแยกวิเคราะห์เพย์โหลดการขนส่งเพื่อให้แน่ใจว่าเพย์โหลดเริ่มต้นด้วยส่วนหัว PES ของประเภทสตรีมที่เหมาะสม มิฉะนั้น ปลั๊กอินควรปฏิเสธคำขอ

ลำดับการปรับแต่ง CA

เมื่อปรับช่องสัญญาณใหม่ โมดูล TIS จะลงทะเบียนเพื่อรับ CA descriptors, ECM และ EMM จากเฟรมเวิร์ก PSI Tuner ตัวอธิบาย CA ประกอบด้วยรหัสระบบ CA ซึ่งระบุผู้จำหน่าย CA เฉพาะและข้อมูลเฉพาะของผู้ขายอื่นๆ มอก. สอบถาม Media CAS เพื่อตรวจสอบว่ามีปลั๊กอิน CAS ที่สามารถจัดการกับตัวอธิบาย CA ได้หรือไม่

ไดอะแกรมของการปรับเนื้อหา CAS

เนื้อหารูปที่ 3 การปรับแต่ง CAS

หาก ID ระบบ CA ได้รับการสนับสนุน อินสแตนซ์ของ Media CAS จะถูกสร้างขึ้นและข้อมูลส่วนตัวของผู้จัดจำหน่ายจากตัวอธิบาย CA จะถูกจัดเตรียมให้กับปลั๊กอิน จากนั้น เซสชันใหม่จะเปิดขึ้นใน Media CAS เพื่อจัดการสตรีมเสียงและวิดีโอ เซสชันที่เพิ่งเปิดใหม่จะได้รับ ECM และ EMM สำหรับปลั๊กอิน

ตัวอย่างการไหลของปลั๊กอิน CAS

TIS ส่ง ECM ไปยังปลั๊กอิน CAS โดยใช้ Media CAS API ECM มีคำควบคุมที่เข้ารหัส ซึ่งจำเป็นต้องถอดรหัสโดยใช้ข้อมูลจาก EMM ปลั๊กอิน CAS กำหนดวิธีการที่จะได้รับ EMM สำหรับเนื้อหาบนพื้นฐานของข้อมูลผู้ขายที่เฉพาะเจาะจงในการอธิบาย CA ซึ่งเป็นผู้ให้บริการที่ setPrivateData() วิธีการ

EMM อาจจัดส่งเป็นแบนด์ในสตรีมเนื้อหาหรือนอกแบนด์โดยใช้คำขอเครือข่ายที่เริ่มต้นโดยปลั๊กอิน CA มอกใช้ processEMM() วิธีการในการส่งมอบใด ๆ ในวง Emms ปลั๊กอินแคลิฟอร์เนีย

หากจำเป็นต้องขอเครือข่ายเพื่อรับ EMM ปลั๊กอิน CA จะรับผิดชอบในการทำธุรกรรมเครือข่ายกับเซิร์ฟเวอร์ใบอนุญาต

ไดอะแกรมของตัวอย่าง CAS

รูปที่ 4 ตัวอย่าง CAS ปลั๊กอินสำหรับ EMM และการประมวลผล ECM

เมื่อได้รับ EMM ปลั๊กอิน CA จะแยกวิเคราะห์เพื่อรับคีย์ที่เข้ารหัสเพื่อถอดรหัสคำควบคุม คีย์ EMM ที่เข้ารหัสและคำควบคุมที่เข้ารหัสอาจถูกโหลดเข้าในบันไดหลักหรือสภาพแวดล้อมที่เชื่อถือได้เพื่อทำการถอดรหัสคำควบคุมและถอดรหัสสตรีมเนื้อหาในภายหลัง

สื่อ CAS Java API

Media CAS Java API มีวิธีการดังต่อไปนี้

  • แสดงรายการปลั๊กอิน CA ทั้งหมดที่มีอยู่บนอุปกรณ์

    class MediaCas.PluginDescriptor {
      public String getName();
      public int getSystemId();
    }
    static PluginDescriptor[] enumeratePlugins();
    
  • สร้างอินสแตนซ์ Media CAS สำหรับระบบ CA ที่ระบุ ซึ่งหมายความว่ากรอบงาน Media CAS สามารถจัดการระบบ CAS หลายระบบพร้อมกันได้

    MediaCas(int CA_system_id);
    MediaCas(@NonNull Context context, int casSystemId,
             @Nullable String tvInputServiceSessionId,
             @PriorityHintUseCaseType int priorityHint);
    
  • ลงทะเบียนตัวฟังเหตุการณ์และอนุญาตให้แอประบุตัวจัดการที่มีการใช้ลูปเดอร์

    interface MediaCas.EventListener {
      void onEvent(MediaCas, int event, int arg, byte[] data);
      void onSessionEvent(@NonNull MediaCas mediaCas, @NonNull Session session, int event, int arg, @Nullable byte[] data);
      void onPluginStatusUpdate(@NonNull MediaCas mediaCas, @PluginStatus int status, int arg);
      void onResourceLost(@NonNull MediaCas mediaCas);
    }
    void setEventListener(MediaCas.EventListener listener, Handler handler);
    
  • ส่งข้อมูลส่วนตัวสำหรับระบบ CA ข้อมูลส่วนตัวอาจมาจากตัวอธิบาย CA ตารางการเข้าถึงแบบมีเงื่อนไข หรือจากแหล่งที่มาของแบนด์ สิ่งนี้ไม่เกี่ยวข้องกับเซสชันใดโดยเฉพาะ

    void setPrivateData(@NonNull byte[] data);
    
  • ประมวลผลแพ็กเก็ต EMM

    void processEmm(@NonNull byte[] data, int offset, int length);
    
  • ส่งเหตุการณ์ไปยังระบบ CA รูปแบบของเหตุการณ์มีความเฉพาะเจาะจงกับแบบแผนและแบบทึบกับเฟรมเวิร์ก

    void sendEvent(int event, int arg, @Nullable byte[] data);
    
  • เริ่มต้นการดำเนินการเตรียมใช้งานประเภทที่ระบุสำหรับระบบ CA เมื่ออุปกรณ์สมัครใช้บริการเพย์ทีวีเป็นครั้งแรก อุปกรณ์จะต้องได้รับการจัดเตรียมไปยังเซิร์ฟเวอร์ CAS ก่อน จัดเตรียมชุดพารามิเตอร์ที่เกี่ยวข้องกับอุปกรณ์สำหรับการจัดเตรียม

    void provision(String provisionString);
    
  • เรียกรีเฟรชการให้สิทธิ์ เมื่อผู้ใช้สมัครรับข้อมูลจากช่องใหม่ (เช่น โดยการตอบสนองต่อโฆษณาหรือโดยการเพิ่มช่องในคู่มือโปรแกรมอิเล็กทรอนิกส์ (EPG)) แอปควรจะสามารถบอกลูกค้า CA ให้รีเฟรชคีย์การให้สิทธิ์ได้

    void refreshEntitlements(int refreshType);
    
  • ปิดวัตถุ Media CAS

    void close();
    
  • เปิดเซสชั่น

    Session openSession();
    Session openSession(@SessionUsage int sessionUsage, @ScramblingMode int scramblingMode);
    
  • ปิดเซสชันที่เปิดไว้ก่อนหน้านี้

    void Session#close();
    
  • ระบุข้อมูลส่วนตัวของ CA จากตัวอธิบาย CA ใน PMT ซึ่งอาจมาจากข้อมูลโปรแกรมหรือส่วนข้อมูล ES ไปจนถึงเซสชัน CAS

    void Session#setPrivateData(@NonNull byte[] sessionId, @NonNull byte[] data);
    
  • ประมวลผลแพ็กเก็ต ECM สำหรับเซสชัน

    void Session#processEcm(@NonNull byte[] data, int offset, int length);
    
  • รับ ID เซสชัน

    byte[] Session#getSessionId();
    
  • ส่งเหตุการณ์เซสชันไปยังระบบ CA รูปแบบของเหตุการณ์มีความเฉพาะเจาะจงกับโครงร่างและไม่ชัดกับกรอบงาน

    void Session#sendSessionEvent(int event, int arg, @Nullable byte[] data);