[bTSstream-devel] [Git][videolan/bitstream][master] 4 commits: biss: fix help and validate EMM with table_id > 0x81
Christophe Massiot
gitlab at videolan.org
Fri Jan 18 12:20:09 CET 2019
Christophe Massiot pushed to branch master at VideoLAN / bitstream
Commits:
7aeaceb4 by Rafaël Carré at 2019-01-16T16:46:59Z
biss: fix help and validate EMM with table_id > 0x81
- - - - -
7d2966f6 by Rafaël Carré at 2019-01-16T16:46:59Z
biss: add ecm
- - - - -
895be9b6 by Christophe Massiot at 2019-01-18T11:19:22Z
Merge branch 'biss' of https://github.com/funman/bitstream into funman-biss
- - - - -
3a106823 by Christophe Massiot at 2019-01-18T11:20:00Z
Merge branch 'funman-biss'
- - - - -
1 changed file:
- ebu/biss.h
Changes:
=====================================
ebu/biss.h
=====================================
@@ -43,9 +43,10 @@ extern "C"
#endif
/*****************************************************************************
- * Conditional Access Table
+ * Entitlement Management Message Table
*****************************************************************************/
#define BISSCA_EMM_TABLE_ID 0x81
+#define BISSCA_EMM_TABLE_ID_LAST 0x8f
#define BISSCA_EMM_HEADER_SIZE PSI_HEADER_SIZE_SYNTAX1
#define BISSCA_EMM_CIPHER_RSA_2048_OAEP 0
@@ -188,7 +189,8 @@ static inline bool bissca_emm_validate(const uint8_t *p_emm)
if (!psi_get_syntax(p_emm) || psi_get_section(p_emm)
|| psi_get_lastsection(p_emm)
- || psi_get_tableid(p_emm) != BISSCA_EMM_TABLE_ID)
+ || psi_get_tableid(p_emm) < BISSCA_EMM_TABLE_ID
+ || psi_get_tableid(p_emm) > BISSCA_EMM_TABLE_ID_LAST)
return false;
if (i_section_size < BISSCA_EMM_HEADER_SIZE + 6
@@ -218,6 +220,164 @@ static inline bool bissca_emm_table_validate(uint8_t **pp_sections)
return true;
}
+/*****************************************************************************
+ * Entitlement Control Message Table
+ *****************************************************************************/
+
+#define BISSCA_ECM_TABLE_ID 0x80
+#define BISSCA_ECM_HEADER_SIZE PSI_HEADER_SIZE_SYNTAX1
+
+#define BISSCA_ECM_CIPHER_AES_128_CBC 0
+
+static inline void bissca_ecm_init(uint8_t *p_ecm, uint16_t esid)
+{
+ psi_init(p_ecm, true);
+ psi_set_tableid(p_ecm, BISSCA_ECM_TABLE_ID);
+ p_ecm[1] &= ~0x40;
+ psi_set_tableidext(p_ecm, esid);
+ psi_set_section(p_ecm, 0);
+ psi_set_lastsection(p_ecm, 0);
+ p_ecm[BISSCA_ECM_HEADER_SIZE+2] = 0x0f;
+ p_ecm[BISSCA_ECM_HEADER_SIZE+3] = 0xf0;
+}
+
+static inline void bissca_ecm_set_onid(uint8_t *p_ecm, uint16_t onid)
+{
+ bissca_emm_set_onid(p_ecm, onid);
+}
+
+static inline uint16_t bissca_ecm_get_onid(const uint8_t *p_ecm)
+{
+ return bissca_emm_get_onid(p_ecm);
+}
+
+static inline void bissca_ecm_set_cipher_type(uint8_t *p_ecm, uint8_t cipher_type)
+{
+ p_ecm[BISSCA_EMM_HEADER_SIZE+2] &= ~(7 << 5);
+ p_ecm[BISSCA_EMM_HEADER_SIZE+2] |= (cipher_type & 7) << 5;
+}
+
+static inline uint8_t bissca_ecm_get_cipher_type(const uint8_t *p_ecm)
+{
+ return p_ecm[BISSCA_EMM_HEADER_SIZE+2] >> 5;
+}
+
+static inline uint16_t bissca_ecm_get_desclength(const uint8_t *p_ecm)
+{
+ return ((p_ecm[BISSCA_ECM_HEADER_SIZE + 2] & 0xf) << 8) |
+ p_ecm[BISSCA_ECM_HEADER_SIZE + 3];
+}
+
+static inline void bissca_ecm_set_desclength(uint8_t *p_ecm, uint16_t i_desc_len)
+{
+ p_ecm[BISSCA_ECM_HEADER_SIZE + 2] &= 0xf0;
+ p_ecm[BISSCA_ECM_HEADER_SIZE + 2] |= (i_desc_len << 8) & 0xf;
+ p_ecm[BISSCA_ECM_HEADER_SIZE + 3] = i_desc_len & 0xff;
+}
+
+static inline uint8_t *bissca_ecm_get_descl(uint8_t *p_ecm)
+{
+ return p_ecm + BISSCA_ECM_HEADER_SIZE + 4;
+}
+
+static inline const uint8_t *bissca_ecm_get_descl_const(const uint8_t *p_ecm)
+{
+ return p_ecm + BISSCA_ECM_HEADER_SIZE + 4;
+}
+
+static inline void bissca_ecm_set_session_key_parity(uint8_t *p_ecm, bool odd)
+{
+ uint16_t desc_len = bissca_ecm_get_desclength(p_ecm);
+ p_ecm[BISSCA_ECM_HEADER_SIZE + 4 + desc_len] = (!!odd << 7) | 0x7f;
+}
+
+static inline bool bissca_ecm_get_session_key_parity(const uint8_t *p_ecm)
+{
+ uint16_t desc_len = bissca_ecm_get_desclength(p_ecm);
+ return p_ecm[BISSCA_ECM_HEADER_SIZE + 4 + desc_len] & 0x80;
+}
+
+static inline void bissca_ecm_set_iv(uint8_t *p_ecm, const uint8_t iv[16])
+{
+ uint16_t desc_len = bissca_ecm_get_desclength(p_ecm);
+ uint8_t *p_iv = &p_ecm[BISSCA_ECM_HEADER_SIZE + 4 + desc_len + 1];
+ memcpy(p_iv, iv, 16);
+}
+
+static inline void bissca_ecm_get_iv(const uint8_t *p_ecm, uint8_t iv[16])
+{
+ uint16_t desc_len = bissca_ecm_get_desclength(p_ecm);
+ uint8_t *p_iv = &p_ecm[BISSCA_ECM_HEADER_SIZE + 4 + desc_len + 1];
+ memcpy(iv, p_iv, 16);
+}
+
+static inline void bissca_ecm_set_even_word(uint8_t *p_ecm, const uint8_t even[16])
+{
+ uint16_t desc_len = bissca_ecm_get_desclength(p_ecm);
+ uint8_t *p_even = &p_ecm[BISSCA_ECM_HEADER_SIZE + 4 + desc_len + 1 + 16];
+ memcpy(p_even, even, 16);
+}
+
+static inline void bissca_ecm_get_even_word(const uint8_t *p_ecm, uint8_t even[16])
+{
+ uint16_t desc_len = bissca_ecm_get_desclength(p_ecm);
+ uint8_t *p_even = &p_ecm[BISSCA_ECM_HEADER_SIZE + 4 + desc_len + 1 + 16];
+ memcpy(even, p_even, 16);
+}
+
+static inline void bissca_ecm_set_odd_word(uint8_t *p_ecm, const uint8_t odd[16])
+{
+ uint16_t desc_len = bissca_ecm_get_desclength(p_ecm);
+ uint8_t *p_odd = &p_ecm[BISSCA_ECM_HEADER_SIZE + 4 + desc_len + 1 + 32];
+ memcpy(p_odd, odd, 16);
+}
+
+static inline void bissca_ecm_get_odd_word(const uint8_t *p_ecm, uint8_t odd[16])
+{
+ uint16_t desc_len = bissca_ecm_get_desclength(p_ecm);
+ uint8_t *p_odd = &p_ecm[BISSCA_ECM_HEADER_SIZE + 4 + desc_len + 1 + 32];
+ memcpy(odd, p_odd, 16);
+}
+
+static inline bool bissca_ecm_validate(const uint8_t *p_ecm)
+{
+ uint16_t i_section_size = psi_get_length(p_ecm) + PSI_HEADER_SIZE
+ - PSI_CRC_SIZE;
+
+ if (!psi_get_syntax(p_ecm) || psi_get_section(p_ecm)
+ || psi_get_lastsection(p_ecm)
+ || psi_get_tableid(p_ecm) != BISSCA_ECM_TABLE_ID)
+ return false;
+
+ if (i_section_size < BISSCA_ECM_HEADER_SIZE + 6
+ || i_section_size < BISSCA_ECM_HEADER_SIZE + 6 + bissca_ecm_get_desclength(p_ecm))
+ return false;
+
+ if (bissca_ecm_get_cipher_type(p_ecm) == BISSCA_ECM_CIPHER_AES_128_CBC
+ && i_section_size < BISSCA_ECM_HEADER_SIZE + 6 + bissca_ecm_get_desclength(p_ecm) + 49)
+ return false;
+
+ if (!descl_validate(bissca_ecm_get_descl_const(p_ecm), bissca_ecm_get_desclength(p_ecm)))
+ return false;
+
+ return true;
+}
+
+static inline bool bissca_ecm_table_validate(uint8_t **pp_sections)
+{
+ uint8_t i_last_section = psi_table_get_lastsection(pp_sections);
+ uint8_t i;
+
+ for (i = 0; i <= i_last_section; i++) {
+ uint8_t *p_section = psi_table_get_section(pp_sections, i);
+
+ if (!psi_check_crc(p_section))
+ return false;
+ }
+
+ return true;
+}
+
#ifdef __cplusplus
}
#endif
View it on GitLab: https://code.videolan.org/videolan/bitstream/compare/5dcd90ab9a47726dfc9a674d85aac9053083d925...3a1068230b8e965c0f1e4921e5c06db7941a2351
--
View it on GitLab: https://code.videolan.org/videolan/bitstream/compare/5dcd90ab9a47726dfc9a674d85aac9053083d925...3a1068230b8e965c0f1e4921e5c06db7941a2351
You're receiving this email because of your account on code.videolan.org.
More information about the biTStream-devel
mailing list