libaacs | branch: master | npzacs <npz...@gmail.com> | Mon Feb 15 13:45:11 2016 
+0200| [03cad03b1822969fc6ea298c1e6c6fa73df71c64] | committer: npzacs

split _calc_mk()

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

 src/libaacs/aacs.c |   71 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 41 insertions(+), 30 deletions(-)

diff --git a/src/libaacs/aacs.c b/src/libaacs/aacs.c
index 1afbe1d..bb631ba 100644
--- a/src/libaacs/aacs.c
+++ b/src/libaacs/aacs.c
@@ -285,7 +285,7 @@ static dk_list *_find_dk(dk_list *dkl, uint32_t 
*p_dev_key_v_mask, uint32_t uv,
     return dkl;
 }
 
-static int _calc_pk_mk(MKB *mkb, dk_list *dkl, uint8_t *mk)
+static int _calc_mk_dks(MKB *mkb, dk_list *dkl, uint8_t *mk)
 {
     /* calculate processing key and media key using device keys */
 
@@ -494,36 +494,15 @@ static MKB *_mkb_open(AACS *aacs)
  * Calculate media key using a set of processing keys
  */
 
-static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, dk_list *dkl)
+static int _calc_mk_pks(MKB *mkb, pk_list *pkl, uint8_t *mk)
 {
     int a, num_uvs = 0;
     size_t len;
-    MKB *mkb = NULL;
     const uint8_t *rec, *uvs, *mk_dv;
 
-    /* Skip if retrieved from config file */
-    if (memcmp(mk, empty_key, 16)) {
-        return AACS_SUCCESS;
-    }
-
-    BD_DEBUG(DBG_AACS, "Calculate media key...\n");
-
-    if ((mkb = _mkb_open(aacs))) {
-
-        aacs->mkb_version = mkb_version(mkb);
-        _update_rl(mkb);
-
-        /* try device keys first */
-        if (dkl && _calc_pk_mk(mkb, dkl, mk) == AACS_SUCCESS) {
-            memcpy(aacs->mk, mk, sizeof(aacs->mk));
-            mkb_close(mkb);
-            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;
         }
 
@@ -541,7 +520,6 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, 
dk_list *dkl)
         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;
         }
 
@@ -550,24 +528,57 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list 
*pkl, dk_list *dkl)
 
                 for (a = 0; a < num_uvs; a++) {
                     if (AACS_SUCCESS == _validate_pk(pkl->key, rec + a * 16, 
uvs + 1 + a * 5, mk_dv, mk)) {
-                        mkb_close(mkb);
 
                         char str[40];
                         BD_DEBUG(DBG_AACS, "Media key: %s\n", 
str_print_hex(str, mk, 16));
-                        memcpy(aacs->mk, mk, sizeof(aacs->mk));
                         return AACS_SUCCESS;
                     }
                 }
             }
 
-        mkb_close(mkb);
-
         BD_DEBUG(DBG_AACS | DBG_CRIT, "Error calculating media key. Missing 
right processing key ?\n");
         return AACS_ERROR_NO_PK;
+}
+
+/*
+ *
+ */
+
+static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, dk_list *dkl)
+{
+    MKB *mkb = NULL;
+    int result = AACS_ERROR_NO_PK;
+
+    /* Skip if retrieved from config file */
+    if (memcmp(mk, empty_key, 16)) {
+        return AACS_SUCCESS;
     }
 
-    BD_DEBUG(DBG_AACS | DBG_CRIT, "Error calculating media key - corrupted 
disc\n");
-    return AACS_ERROR_CORRUPTED_DISC;
+    BD_DEBUG(DBG_AACS, "Calculate media key...\n");
+
+    mkb = _mkb_open(aacs);
+    if (!mkb) {
+        BD_DEBUG(DBG_AACS | DBG_CRIT, "Error calculating media key - Failed 
opening MKB\n");
+        return AACS_ERROR_CORRUPTED_DISC;
+    }
+
+    aacs->mkb_version = mkb_version(mkb);
+    _update_rl(mkb);
+
+    /* try device keys first */
+    if (dkl) {
+        result = _calc_mk_dks(mkb, dkl, mk);
+    }
+    if (result != AACS_SUCCESS) {
+        result = _calc_mk_pks(mkb, pkl, mk);
+    }
+
+    if (result == AACS_SUCCESS) {
+        memcpy(aacs->mk, mk, sizeof(aacs->mk));
+    }
+
+    mkb_close(mkb);
+    return result;
 }
 
 /*

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

Reply via email to