libaacs | branch: master | npzacs <npz...@gmail.com> | Thu Jan 14 12:45:52 2016 
+0200| [1c0adecf97fa3778be79a4221256c7635eb67fac] | committer: npzacs

Check for missing MKB records

> http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=1c0adecf97fa3778be79a4221256c7635eb67fac
---

 src/libaacs/aacs.c |   33 ++++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)

diff --git a/src/libaacs/aacs.c b/src/libaacs/aacs.c
index 7241960..21e1c9e 100644
--- a/src/libaacs/aacs.c
+++ b/src/libaacs/aacs.c
@@ -180,14 +180,14 @@ static void _update_rl(MKB *mkb)
     if (!cache_get("drl", &cache_version, NULL, NULL, 0) || cache_version < 
version) {
         const uint8_t *version_rec = mkb_type_and_version_record(mkb);
         const uint8_t *drl_rec     = mkb_drive_revokation_entries(mkb, 
&rl_len);
-        if (drl_rec && rl_len > 8) {
+        if (drl_rec && version_rec && rl_len > 8) {
             _save_rl("drl", version, version_rec, drl_rec, rl_len);
         }
     }
     if (!cache_get("hrl", &cache_version, NULL, NULL, 0) || cache_version < 
version) {
         const uint8_t *version_rec = mkb_type_and_version_record(mkb);
         const uint8_t *hrl_rec     = mkb_host_revokation_entries(mkb, &rl_len);
-        if (hrl_rec && rl_len > 8) {
+        if (hrl_rec && version_rec && rl_len > 8) {
             _save_rl("hrl", version, version_rec, hrl_rec, rl_len);
         }
     }
@@ -276,7 +276,7 @@ static int _calc_pk_mk(MKB *mkb, dk_list *dkl, uint8_t *mk)
 {
     /* calculate processing key and media key using device keys */
 
-    const uint8_t *uvs, *cvalues;
+    const uint8_t *uvs, *cvalues, *mk_dv;
     unsigned num_uvs;
     size_t len;
     char str[128];
@@ -285,6 +285,14 @@ static int _calc_pk_mk(MKB *mkb, dk_list *dkl, uint8_t *mk)
 
     uvs     = mkb_subdiff_records(mkb, &len);
     cvalues = mkb_cvalues(mkb, &len);
+    mk_dv   = mkb_mk_dv(mkb);
+
+    if (!uvs || !cvalues || !mk_dv) {
+        BD_DEBUG(DBG_AACS | DBG_CRIT, "Missing MKB records (uvs %p, cvalues 
%p, mk_dv %p)\n",
+                 (const void*)uvs, (const void*)cvalues, (const void*)mk_dv);
+        return AACS_ERROR_CORRUPTED_DISC;
+    }
+
     num_uvs = len / 5;
 
     if (num_uvs < 1) {
@@ -365,7 +373,7 @@ static int _calc_pk_mk(MKB *mkb, dk_list *dkl, uint8_t *mk)
         if ( _validate_pk(pk,
                           cvalues + uvs_idx * 16,
                           uvs + 1 + uvs_idx * 5,
-                          mkb_mk_dv(mkb),
+                          mk_dv,
                           mk)
              == AACS_SUCCESS) {
 
@@ -465,7 +473,7 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, 
dk_list *dkl)
     int a, num_uvs = 0;
     size_t len;
     MKB *mkb = NULL;
-    const uint8_t *rec, *uvs;
+    const uint8_t *rec, *uvs, *mk_dv;
 
     /* Skip if retrieved from config file */
     if (memcmp(mk, empty_key, 16)) {
@@ -486,6 +494,13 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, 
dk_list *dkl)
             return AACS_SUCCESS;
         }
 
+        mk_dv = mkb_mk_dv(mkb);
+        if (!mk_dv) {
+            BD_DEBUG(DBG_AACS | DBG_CRIT, "Missing MKB DV record\n");
+            mkb_close(mkb);
+            return AACS_ERROR_CORRUPTED_DISC;
+        }
+
         BD_DEBUG(DBG_AACS, "Get UVS...\n");
         uvs = mkb_subdiff_records(mkb, &len);
         rec = uvs;
@@ -498,13 +513,17 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list 
*pkl, dk_list *dkl)
 
         BD_DEBUG(DBG_AACS, "Get cvalues...\n");
         rec = mkb_cvalues(mkb, &len);
+        if (!rec) {
+            BD_DEBUG(DBG_AACS | DBG_CRIT, "Missing MKB CVALUES record\n");
+            mkb_close(mkb);
+            return AACS_ERROR_CORRUPTED_DISC;
+        }
 
         for (; pkl; pkl = pkl->next) {
                 BD_DEBUG(DBG_AACS, "Trying processing key...\n");
 
                 for (a = 0; a < num_uvs; a++) {
-                    if (AACS_SUCCESS == _validate_pk(pkl->key, rec + a * 16, 
uvs + 1 + a * 5,
-                      mkb_mk_dv(mkb), mk)) {
+                    if (AACS_SUCCESS == _validate_pk(pkl->key, rec + a * 16, 
uvs + 1 + a * 5, mk_dv, mk)) {
                         mkb_close(mkb);
 
                         char str[40];

_______________________________________________
libaacs-devel mailing list
libaacs-devel@videolan.org
https://mailman.videolan.org/listinfo/libaacs-devel

Reply via email to