Petri Hintukainen pushed to branch master at VideoLAN / libaacs
Commits: 4339a1af by John Doe at 2020-06-21T00:38:21+03:00 Cache READ DATA KEY for bus encryption This enables playback of Bus Encryption Enabled discs even without a valid Host Certificate when cached RDK is available for current drive/disc combination. One cached RDK will only work for one drive/disc combination. - - - - - 1 changed file: - src/libaacs/aacs.c Changes: ===================================== src/libaacs/aacs.c ===================================== @@ -81,6 +81,7 @@ struct aacs { int bee; /* bus encryption enabled flag in content certificate */ int bec; /* bus encryption capable flag in drive certificate */ uint8_t read_data_key[16]; + uint8_t drive_cert_hash[20]; /* content certificate */ CONTENT_CERT *cc; @@ -668,10 +669,33 @@ static int _read_vid(AACS *aacs, cert_list *hcl) static int _read_read_data_key(AACS *aacs, cert_list *hcl) { - int error_code = _mmc_read_auth(aacs, hcl, MMC_READ_DATA_KEYS, aacs->read_data_key, NULL); + int error_code; + char *cache_path = NULL; + char str[41]; + + cache_path = str_printf("rdk" DIR_SEP "%s", str_print_hex(str, aacs->drive_cert_hash, 20)); + + error_code =_mmc_read_auth(aacs, hcl, MMC_READ_DATA_KEYS, aacs->read_data_key, NULL); + if (error_code == AACS_SUCCESS) { + /* cache read data key */ + if (!aacs->no_cache) { + keycache_save(cache_path, aacs->disc_id, aacs->read_data_key, 16); + } + + } else { + /* get cached read data key */ + if (!aacs->no_cache && keycache_find(cache_path, aacs->disc_id, aacs->read_data_key, 16)) { + BD_DEBUG(DBG_AACS, "Using cached READ DATA KEY\n"); + error_code = AACS_SUCCESS; + } + } + + X_FREE(cache_path); + if (error_code != AACS_SUCCESS) { BD_DEBUG(DBG_AACS, "Error reading data keys!\n"); } + return error_code; } @@ -1023,7 +1047,7 @@ static int _get_bus_encryption_enabled(AACS *aacs) return 0; } -static int _get_bus_encryption_capable(const char *path) +static int _get_bus_encryption_capable(AACS *aacs, const char *path) { MMC* mmc = NULL; uint8_t drive_cert[92]; @@ -1034,9 +1058,11 @@ static int _get_bus_encryption_capable(const char *path) } if (mmc_read_drive_cert(mmc, drive_cert) == MMC_SUCCESS) { + crypto_aacs_title_hash(drive_cert, 92, aacs->drive_cert_hash); bec = drive_cert[1] & 1; BD_DEBUG(DBG_AACS, "Bus Encryption Capable flag in drive certificate: %d\n", bec); } else { + memset(aacs->drive_cert_hash, 0, sizeof(aacs->drive_cert_hash)); BD_DEBUG(DBG_AACS | DBG_CRIT, "Unable to read drive certificate\n"); } @@ -1223,7 +1249,7 @@ int aacs_open_device(AACS *aacs, const char *path, const char *configfile_path) aacs->cc = _read_cc_any(aacs); aacs->bee = _get_bus_encryption_enabled(aacs); - aacs->bec = _get_bus_encryption_capable(path); + aacs->bec = _get_bus_encryption_capable(aacs, path); if (error_code == AACS_SUCCESS && aacs->bee && aacs->bec) { View it on GitLab: https://code.videolan.org/videolan/libaacs/-/commit/4339a1af0bf03d3e2a476c614f591d04299c529a -- View it on GitLab: https://code.videolan.org/videolan/libaacs/-/commit/4339a1af0bf03d3e2a476c614f591d04299c529a You're receiving this email because of your account on code.videolan.org.
_______________________________________________ libaacs-devel mailing list libaacs-devel@videolan.org https://mailman.videolan.org/listinfo/libaacs-devel