<pre style='margin:0'>
Ryan Schmidt (ryandesign) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/f98d581b931e4244156d04e4c6dcb9a7e1068ba8">https://github.com/macports/macports-ports/commit/f98d581b931e4244156d04e4c6dcb9a7e1068ba8</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new f98d581b931 libaacs: update to 0.10.0 & add upstream patch
</span>f98d581b931 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit f98d581b931e4244156d04e4c6dcb9a7e1068ba8
</span>Author: i0ntempest <szf1234@me.com>
AuthorDate: Tue Jul 7 21:27:02 2020 -0400

<span style='display:block; white-space:pre;color:#404040;'>    libaacs: update to 0.10.0 & add upstream patch
</span>---
 multimedia/libaacs/Portfile                     |  13 +-
 multimedia/libaacs/files/patch-error-check.diff | 425 ++++++++++++++++++++++++
 2 files changed, 431 insertions(+), 7 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/multimedia/libaacs/Portfile b/multimedia/libaacs/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 38becb67d7b..5e276be7817 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/multimedia/libaacs/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/multimedia/libaacs/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3,9 +3,7 @@
</span> PortSystem          1.0
 
 name                libaacs
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version             0.9.0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# 0.10.0 causes segfault when mpv plays bluray, so maybe wait for another version
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://code.videolan.org/videolan/libaacs/-/issues/6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version             0.10.0
</span> revision            0
 categories          multimedia
 license             LGPL-2.1
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -29,12 +27,13 @@ depends_lib         port:libgcrypt \
</span>                     port:libgpg-error \
                     port:libiconv
                     
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums           rmd160  f96e4c6aa3c06c79bf8e023a5c02a8dead407259 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  47e0bdc9c9f0f6146ed7b4cc78ed1527a04a537012cf540cf5211e06a248bace \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    316323
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           rmd160  a90aef4304b0182b8394b7b911879ced7d4cf846 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  93f6b19ef71e6f73e77bd7535946c09c45330e9b42e832a63a1d6b042f6b12fe \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    319890
</span> 
 # https://trac.macports.org/ticket/60782
<span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles          Makefile.in.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Patch from upstream to fix segfault (https://code.videolan.org/videolan/libaacs/-/issues/6)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles          Makefile.in.diff patch-error-check.diff
</span> 
 configure.perl      ${prefix}/bin/perl5
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/multimedia/libaacs/files/patch-error-check.diff b/multimedia/libaacs/files/patch-error-check.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..384df216ca5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/multimedia/libaacs/files/patch-error-check.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,425 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git Makefile.am Makefile.am
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1531246..67f0a26 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- Makefile.am
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ Makefile.am
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5,7 +5,8 @@ EXTRA_DIST=bootstrap COPYING KEYDB.cfg README.txt ChangeLog
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SET_FEATURES = @SET_FEATURES@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ SET_INCLUDES = -I$(top_srcdir)/src -I$(top_builddir)/src/libaacs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-AM_CFLAGS = -std=c99 $(SET_FEATURES) $(SET_INCLUDES) $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++AM_CFLAGS = -std=c99 $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++AM_CPPFLAGS = $(SET_FEATURES) $(SET_INCLUDES)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ AM_YFLAGS = -d -p libaacs_yy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lib_LTLIBRARIES = libaacs.la
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -96,7 +97,7 @@ noinst_PROGRAMS = parser_test
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bin_PROGRAMS = aacs_info
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ parser_test_SOURCES = \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  src/examples/parser_test.c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  src/devtools/parser_test.c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   src/file/keydbcfg-parser.y \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   src/file/keydbcfg-lexer.l \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   src/util/strutl.c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/examples/parser_test.c src/devtools/parser_test.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+similarity index 100%
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+rename from src/examples/parser_test.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+rename to src/devtools/parser_test.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/file/mmc_device_darwin.c src/file/mmc_device_darwin.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7a3372a..afb0389 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/file/mmc_device_darwin.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/file/mmc_device_darwin.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -371,13 +371,13 @@ static DADissenterRef iokit_mount_approval_cb(DADiskRef disk, void *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int iokit_da_init(MMCDEV *mmc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     mmc->session = DASessionCreate(kCFAllocatorDefault);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (NULL == mmc->session) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        BD_DEBUG(DBG_MMC, "Could not create a disc arbitration session\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        BD_DEBUG(DBG_MMC | DBG_CRIT, "Could not create a disc arbitration session\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     mmc->disk = DADiskCreateFromBSDName(kCFAllocatorDefault, mmc->session, mmc->bsd_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (NULL == mmc->disk) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        BD_DEBUG(DBG_MMC, "Could not create a disc arbitration disc for the device\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        BD_DEBUG(DBG_MMC | DBG_CRIT, "Could not create a disc arbitration disc for the device\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         CFRelease(mmc->session);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         mmc->session = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -429,14 +429,14 @@ static int mmc_open_iokit(const char *path, MMCDEV *mmc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* get the bsd name associated with this mount */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     rc = get_mounted_device_from_path(mmc, path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (0 != rc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        BD_DEBUG(DBG_MMC, "Could not locate mounted device associated with %s\n", path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        BD_DEBUG(DBG_MMC | DBG_CRIT, "Could not locate mounted device associated with %s\n", path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return rc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* find a matching io service (IOBDServices) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     rc = iokit_find_service_matching(mmc, &service);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (0 != rc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        BD_DEBUG(DBG_MMC, "Could not find matching IOBDServices mounted @ %s\n", path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        BD_DEBUG(DBG_MMC | DBG_CRIT, "Could not find matching IOBDServices mounted @ %s\n", path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return rc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -446,6 +446,10 @@ static int mmc_open_iokit(const char *path, MMCDEV *mmc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* done with the ioservice. release it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     (void) IOObjectRelease(service);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (0 != rc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return rc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Init DiskArbitration */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     rc = iokit_da_init(mmc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (0 != rc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -463,7 +467,7 @@ static int mmc_open_iokit(const char *path, MMCDEV *mmc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* finally, obtain exclusive access */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     rc = (*mmc->taskInterface)->ObtainExclusiveAccess(mmc->taskInterface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (kIOReturnSuccess != rc) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        BD_DEBUG(DBG_MMC, "Failed to obtain exclusive access. rc = %x\n", rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        BD_DEBUG(DBG_MMC | DBG_CRIT, "Failed to obtain exclusive access. rc = %x\n", rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -533,6 +537,12 @@ void device_close(MMCDEV **pp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             IODestroyPlugInInterface(mmc->plugInInterface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!mmc->sync_sem) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            /* open failed before iokit_da_init() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            X_FREE(*pp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         /* Wait for disc to re-appear for 20 seconds.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          * This timeout was figured out by experimentation with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          * a USB BD drive which sometimes can take really long to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/libaacs/aacs.c src/libaacs/aacs.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 10c8553..ab7671c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/libaacs/aacs.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/libaacs/aacs.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -81,6 +81,7 @@ struct aacs {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int       bee;        /* bus encryption enabled flag in content certificate */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int       bec;        /* bus encryption capable flag in drive certificate */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uint8_t   read_data_key[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uint8_t   drive_cert_hash[20];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* content certificate */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CONTENT_CERT *cc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -561,6 +562,12 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, dk_list *dkl)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return AACS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* get cached mk */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!aacs->no_cache && keycache_find("mk", aacs->disc_id, mk, 16)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        BD_DEBUG(DBG_AACS, "Using cached MK\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return AACS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     BD_DEBUG(DBG_AACS, "Calculate media key...\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     mkb = _mkb_open(aacs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -585,6 +592,12 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, dk_list *dkl)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (result == AACS_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         memcpy(aacs->mk, mk, sizeof(aacs->mk));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* cache mk */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!aacs->no_cache) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (memcmp(aacs->disc_id, empty_key, sizeof(aacs->disc_id))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                keycache_save("mk", aacs->disc_id, mk, 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     mkb_close(mkb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -668,10 +681,33 @@ static int _read_vid(AACS *aacs, cert_list *hcl)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int _read_read_data_key(AACS *aacs, cert_list *hcl)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int error_code = _mmc_read_auth(aacs, hcl, MMC_READ_DATA_KEYS, aacs->read_data_key, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int error_code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char *cache_path = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char str[41];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cache_path = str_printf("rdk" DIR_SEP "%s", str_print_hex(str, aacs->drive_cert_hash, 20));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    error_code =_mmc_read_auth(aacs, hcl, MMC_READ_DATA_KEYS, aacs->read_data_key, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (error_code == AACS_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* cache read data key */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!aacs->no_cache) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            keycache_save(cache_path, aacs->disc_id, aacs->read_data_key, 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* get cached read data key */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!aacs->no_cache && keycache_find(cache_path, aacs->disc_id, aacs->read_data_key, 16)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            BD_DEBUG(DBG_AACS, "Using cached READ DATA KEY\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            error_code = AACS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    X_FREE(cache_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (error_code != AACS_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         BD_DEBUG(DBG_AACS, "Error reading data keys!\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return error_code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -764,6 +800,7 @@ static void _find_config_entry(AACS *aacs, title_entry_list *ce,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (ce->entry.mek) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         hexstring_to_hex_array(mk, 16, ce->entry.mek);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        memcpy(aacs->mk, mk, 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         BD_DEBUG(DBG_AACS, "Found media key for %s: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                  str_print_hex(str2, ce->entry.discid, 20), str_print_hex(str, mk, 16));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -957,10 +994,11 @@ static int _calc_title_hash(AACS *aacs)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     size_t   size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     char     str[48];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int      result = AACS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int      aacs2 = aacs->cc ? aacs->cc->aacs2 : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     size = _read_file(aacs, "AACS" DIR_SEP "Unit_Key_RO.inf", &data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (size > 2048) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        aacs->uk = uk_parse(data, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        aacs->uk = uk_parse(data, size, aacs2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* failed, try backup */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -968,7 +1006,7 @@ static int _calc_title_hash(AACS *aacs)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         X_FREE(data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         size = _read_file(aacs, "AACS" DIR_SEP "DUPLICATE" DIR_SEP "Unit_Key_RO.inf", &data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (size > 2048) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            aacs->uk = uk_parse(data, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            aacs->uk = uk_parse(data, size, aacs2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1022,7 +1060,7 @@ static int _get_bus_encryption_enabled(AACS *aacs)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static int _get_bus_encryption_capable(const char *path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int _get_bus_encryption_capable(AACS *aacs, const char *path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     MMC* mmc = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uint8_t drive_cert[92];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1033,9 +1071,11 @@ static int _get_bus_encryption_capable(const char *path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (mmc_read_drive_cert(mmc, drive_cert) == MMC_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        crypto_aacs_title_hash(drive_cert, 92, aacs->drive_cert_hash);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         bec = drive_cert[1] & 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         BD_DEBUG(DBG_AACS, "Bus Encryption Capable flag in drive certificate: %d\n", bec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        memset(aacs->drive_cert_hash, 0, sizeof(aacs->drive_cert_hash));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         BD_DEBUG(DBG_AACS | DBG_CRIT, "Unable to read drive certificate\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1206,6 +1246,8 @@ int aacs_open_device(AACS *aacs, const char *path, const char *configfile_path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     aacs->path = path ? str_dup(path) : NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    aacs->cc = _read_cc_any(aacs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     error_code = _calc_title_hash(aacs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (error_code != AACS_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return error_code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1219,10 +1261,8 @@ int aacs_open_device(AACS *aacs, const char *path, const char *configfile_path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         BD_DEBUG(DBG_AACS, "Failed to initialize AACS!\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    aacs->cc = _read_cc_any(aacs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     aacs->bee = _get_bus_encryption_enabled(aacs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    aacs->bec = _get_bus_encryption_capable(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    aacs->bec = _get_bus_encryption_capable(aacs, path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (error_code == AACS_SUCCESS && aacs->bee && aacs->bec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/libaacs/mkb.c src/libaacs/mkb.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2342497..9bf0730 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/libaacs/mkb.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/libaacs/mkb.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -77,6 +77,7 @@ MKB *mkb_init(uint8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     mkb->buf  = data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     BD_DEBUG(DBG_MKB, "MKB size: %u\n", (unsigned)mkb->size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    BD_DEBUG(DBG_MKB, "MKB type: 0x%x\n", mkb_type(mkb));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     BD_DEBUG(DBG_MKB, "MKB version: %d\n", mkb_version(mkb));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return mkb;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -110,7 +111,7 @@ size_t mkb_data_size(MKB *mkb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-uint8_t mkb_type(MKB *mkb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++uint32_t mkb_type(MKB *mkb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const uint8_t *rec = mkb_type_and_version_record(mkb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -207,12 +208,29 @@ const uint8_t *mkb_cvalues(MKB *mkb, size_t *len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const uint8_t *mkb_mk_dv(MKB *mkb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const uint8_t *rec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uint8_t dv_record;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     size_t len;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    const uint8_t *rec = _record(mkb, 0x81, &len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    switch (mkb_type(mkb)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        case MKB_20_CATEGORY_C:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        case MKB_21_CATEGORY_C:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            dv_record = 0x86;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        case MKB_TYPE_3:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        case MKB_TYPE_4:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        case MKB_TYPE_10_CLASS_II:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            dv_record = 0x81;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    rec = _record(mkb, dv_record, &len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (len < 20) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (rec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         rec += 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/libaacs/mkb.h src/libaacs/mkb.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6691211..f817470 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/libaacs/mkb.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/libaacs/mkb.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -29,6 +29,12 @@ typedef struct mkb MKB;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct aacs_file_s;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define MKB_TYPE_3           0x00031003
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define MKB_TYPE_4           0x00041003
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define MKB_TYPE_10_CLASS_II 0x000A1003
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define MKB_20_CATEGORY_C    0x48141003
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define MKB_21_CATEGORY_C    0x48151003
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BD_PRIVATE MKB *mkb_init(uint8_t *data, size_t len); // init MKB from data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BD_PRIVATE void mkb_close(MKB *mkb);           // free MKB
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -36,7 +42,7 @@ BD_PRIVATE const uint8_t *mkb_data(MKB *mkb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BD_PRIVATE size_t mkb_data_size(MKB *mkb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // returns type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-BD_PRIVATE uint8_t mkb_type(MKB *mkb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++BD_PRIVATE uint32_t mkb_type(MKB *mkb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // returns version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BD_PRIVATE uint32_t mkb_version(MKB *mkb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // returns type and version record (required to verify signatures)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/libaacs/unit_key.c src/libaacs/unit_key.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index dc4382f..afb412c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/libaacs/unit_key.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/libaacs/unit_key.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -143,8 +143,9 @@ static int _assign_titles(AACS_UK *uk, const uint8_t *p, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static int _parse_uks(AACS_UK *uk, const uint8_t *p, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int _parse_uks(AACS_UK *uk, const uint8_t *p, size_t size, int aacs2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const uint8_t empty_key[16] = {0};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uint32_t uk_pos;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     unsigned int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -173,6 +174,17 @@ static int _parse_uks(AACS_UK *uk, const uint8_t *p, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (aacs2 && uk->num_uk > 1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* do some sanity checks ... */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!memcmp(empty_key, p + 48 + 48 + 16, 16)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            BD_DEBUG(DBG_UK | DBG_CRIT, "AACS2 unit key not found from expected location ?\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            aacs2 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        } else if (size < uk_pos + 64 * uk->num_uk + 16) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            BD_DEBUG(DBG_UK | DBG_CRIT, "Unexpected EOF (AACS2 unit key data truncated)\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* alloc storage for keys */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uk->enc_uk = calloc(uk->num_uk, sizeof(AACS_UK));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -181,19 +193,29 @@ static int _parse_uks(AACS_UK *uk, const uint8_t *p, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    BD_DEBUG(DBG_UK, "%d CPS unit keys\n", uk->num_uk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    BD_DEBUG(DBG_UK, "%d CPS unit keys (AACS%d)\n", uk->num_uk, aacs2 ? 2 : 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* get encrypted keys */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for (i = 0; i < uk->num_uk; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         uk_pos += 48;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         memcpy(uk->enc_uk[i].key, p + uk_pos, 16);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!memcmp(empty_key, uk->enc_uk[i].key, 16)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            BD_DEBUG(DBG_UK | DBG_CRIT, "WARNING: Unit key %d is empty!\n", i+1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* XXX there seems to be nothing in this file that could be used to detect this ... */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (aacs2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            /* skip unknown */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            uk_pos += 16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static int _parse(AACS_UK *uk, const uint8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int _parse(AACS_UK *uk, const uint8_t *data, size_t len, int aacs2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -201,7 +223,7 @@ static int _parse(AACS_UK *uk, const uint8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    result = _parse_uks(uk, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    result = _parse_uks(uk, data, len, aacs2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* not fatal, just speeds up things ... */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _assign_titles(uk, data, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -209,7 +231,7 @@ static int _parse(AACS_UK *uk, const uint8_t *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-AACS_UK *uk_parse(const void *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++AACS_UK *uk_parse(const void *data, size_t len, int aacs2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     AACS_UK *uk = calloc(1, sizeof(*uk));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -217,7 +239,7 @@ AACS_UK *uk_parse(const void *data, size_t len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (_parse(uk, data, len) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (_parse(uk, data, len, aacs2) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         BD_DEBUG(DBG_UK | DBG_CRIT, "Corrupt unit key file (AACS/Unit_Key_RO.inf)\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         X_FREE(uk);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/libaacs/unit_key.h src/libaacs/unit_key.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7797e2e..b722837 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/libaacs/unit_key.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/libaacs/unit_key.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -50,7 +50,7 @@ struct aacs_uk {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uint16_t  *title_cps_unit;  /* map title to CPS unit (key index) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-BD_PRIVATE AACS_UK *uk_parse(const void *data, size_t len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++BD_PRIVATE AACS_UK *uk_parse(const void *data, size_t len, int aacs2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BD_PRIVATE void     uk_free(AACS_UK **);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif /* AACS_UK_H_ */
</span></pre><pre style='margin:0'>

</pre>