[libbluray-devel] Set aacs media key for bd+

anonymous git at videolan.org
Wed Dec 18 12:26:49 CET 2013


libbluray | branch: master | anonymous <anonymous at anonymous.org> | Wed Dec 18 13:18:41 2013 +0200| [7448382176cc9cf881cf7e23179534a6b9e48463] | committer: anonymous

Set aacs media key for bd+

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=7448382176cc9cf881cf7e23179534a6b9e48463
---

 src/file/libaacs.c     |   15 +++++++++++++++
 src/file/libaacs.h     |    1 +
 src/file/libbdplus.c   |    4 +++-
 src/file/libbdplus.h   |    2 +-
 src/libbluray/bluray.c |    4 +++-
 5 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/file/libaacs.c b/src/file/libaacs.c
index a5ec3d5..3dc36c9 100644
--- a/src/file/libaacs.c
+++ b/src/file/libaacs.c
@@ -42,6 +42,7 @@ struct bd_aacs {
     fptr_p_void    get_pmsn;
     fptr_p_void    get_device_binding_id;
     fptr_p_void    get_device_nonce;
+    fptr_p_void    get_media_key;
 };
 
 
@@ -126,6 +127,7 @@ BD_AACS *libaacs_load(void)
     *(void **)(&p->get_pmsn)     = dl_dlsym(p->h_libaacs, "aacs_get_pmsn");
     *(void **)(&p->get_device_binding_id) = dl_dlsym(p->h_libaacs, "aacs_get_device_binding_id");
     *(void **)(&p->get_device_nonce)      = dl_dlsym(p->h_libaacs, "aacs_get_device_nonce");
+    *(void **)(&p->get_media_key)         = dl_dlsym(p->h_libaacs, "aacs_get_mk");
 
     if (!p->decrypt_unit) {
         BD_DEBUG(DBG_BLURAY | DBG_CRIT, "libaacs dlsym failed! (%p)\n", p->h_libaacs);
@@ -249,6 +251,16 @@ static const uint8_t *_get_device_nonce(BD_AACS *p)
     return (const uint8_t*)p->get_device_nonce(p->aacs);
 }
 
+static const uint8_t *_get_media_key(BD_AACS *p)
+{
+    if (!p->get_media_key) {
+        BD_DEBUG(DBG_BLURAY | DBG_CRIT, "aacs_get_mk() dlsym failed!\n");
+        return NULL;
+    }
+
+    return (const uint8_t*)p->get_media_key(p->aacs);
+}
+
 uint32_t libaacs_get_mkbv(BD_AACS *p)
 {
     return p ? p->mkbv : 0;
@@ -276,6 +288,9 @@ BD_PRIVATE const uint8_t *libaacs_get_aacs_data(BD_AACS *p, int type)
 
         case BD_AACS_DEVICE_NONCE:
             return _get_device_nonce(p);
+
+        case BD_AACS_MEDIA_KEY:
+            return _get_media_key(p);
     }
 
     BD_DEBUG(DBG_BLURAY | DBG_CRIT, "get_aacs_data(): unknown query %d\n", type);
diff --git a/src/file/libaacs.h b/src/file/libaacs.h
index ca17184..90d480c 100644
--- a/src/file/libaacs.h
+++ b/src/file/libaacs.h
@@ -42,6 +42,7 @@ BD_PRIVATE uint32_t libaacs_get_mkbv(BD_AACS *p);
 #define BD_AACS_MEDIA_PMSN         3
 #define BD_AACS_DEVICE_BINDING_ID  4
 #define BD_AACS_DEVICE_NONCE       5
+#define BD_AACS_MEDIA_KEY          6
 
 BD_PRIVATE const uint8_t *libaacs_get_aacs_data(BD_AACS *p, int type);
 
diff --git a/src/file/libbdplus.c b/src/file/libbdplus.c
index dab219f..f0f1ec5 100644
--- a/src/file/libbdplus.c
+++ b/src/file/libbdplus.c
@@ -152,7 +152,7 @@ BD_BDPLUS *libbdplus_load(void)
     return p;
 }
 
-int libbdplus_init(BD_BDPLUS *p, const char *device_path, const uint8_t *vid)
+int libbdplus_init(BD_BDPLUS *p, const char *device_path, const uint8_t *vid, const uint8_t *mk)
 {
     fptr_p_void    bdplus_init;
 
@@ -171,6 +171,8 @@ int libbdplus_init(BD_BDPLUS *p, const char *device_path, const uint8_t *vid)
         return -1;
     }
 
+    DL_CALL(p->h_libbdplus, bdplus_set_mk, p->bdplus, mk);
+
     return 0;
 }
 
diff --git a/src/file/libbdplus.h b/src/file/libbdplus.h
index e8fe8e6..10e65b1 100644
--- a/src/file/libbdplus.h
+++ b/src/file/libbdplus.h
@@ -29,7 +29,7 @@ typedef struct bd_bdplus BD_BDPLUS;
 
 BD_PRIVATE int  libbdplus_required(const char *device_path);
 BD_PRIVATE BD_BDPLUS *libbdplus_load(void);
-BD_PRIVATE int  libbdplus_init(BD_BDPLUS *p, const char *device_path, const uint8_t *vid);
+BD_PRIVATE int  libbdplus_init(BD_BDPLUS *p, const char *device_path, const uint8_t *vid, const uint8_t *mk);
 BD_PRIVATE void libbdplus_unload(BD_BDPLUS **p);
 
 BD_PRIVATE int  libbdplus_get_gen(BD_BDPLUS *p);
diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c
index 3848e67..4f6d3a3 100644
--- a/src/libbluray/bluray.c
+++ b/src/libbluray/bluray.c
@@ -864,13 +864,14 @@ static int _libbdplus_init(BLURAY *bd)
     }
 
     const uint8_t *vid = libaacs_get_aacs_data(bd->libaacs, BD_AACS_MEDIA_VID);
+    const uint8_t *mk  = libaacs_get_aacs_data(bd->libaacs, BD_AACS_MEDIA_KEY);
     if (!vid) {
         BD_DEBUG(DBG_BLURAY | DBG_CRIT, "BD+ initialization failed (no AACS ?)\n");
         libaacs_unload(&bd->libaacs);
         return 0;
     }
 
-    if (libbdplus_init(bd->libbdplus, bd->device_path, vid)) {
+    if (libbdplus_init(bd->libbdplus, bd->device_path, vid, mk)) {
         BD_DEBUG(DBG_BLURAY | DBG_CRIT, "bdplus_init() failed\n");
 
         bd->disc_info.bdplus_handled = 0;
@@ -922,6 +923,7 @@ static int _meta_open(BLURAY *bd)
 
     return !!bd->meta;
 }
+
 /*
  * disc info
  */



More information about the libbluray-devel mailing list