libaacs | branch: master | npzacs <[email protected]> | Fri May 4 10:44:06 2012 +0300| [8c95f8a54b7d51c38c3b2a5701f8cffbd6ea00e0] | committer: npzacs
Update cached drive revocation list when mkb is opened > http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=8c95f8a54b7d51c38c3b2a5701f8cffbd6ea00e0 --- src/libaacs/aacs.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 41 insertions(+), 0 deletions(-) diff --git a/src/libaacs/aacs.c b/src/libaacs/aacs.c index 3e8ba58..c8de583 100644 --- a/src/libaacs/aacs.c +++ b/src/libaacs/aacs.c @@ -103,6 +103,46 @@ static int _validate_pk(const uint8_t *pk, return AACS_ERROR_NO_PK; } +static int _rl_verify_signature(const uint8_t *rl, size_t size) +{ + int entries = MKINT_BE32(rl + 12 + 8); + size_t len = 12 + 12 + 8 * entries; /* type_and_version_rec=12, rl_header=12, rl=entries*8 */ + + if (len + 40 > size) { + DEBUG(DBG_AACS, "revocation list size mismatch\n"); + return 0; + } + + return crypto_aacs_verify_aacsla(rl + len, rl, len); +} + +static void _update_drl(MKB *mkb) +{ + uint32_t version = mkb_version(mkb); + uint32_t cache_version; + + if (!cache_get("drl", &cache_version, NULL, NULL) || cache_version < version) { + size_t drl_len; + const uint8_t *drl_rec = mkb_drive_revokation_entries(mkb, &drl_len); + const uint8_t *v_rec = mkb_type_and_version_record(mkb); + + if (drl_rec && v_rec) { + drl_rec -= 4; + drl_len += 4; + + uint8_t *data = malloc(12 + drl_len); + memcpy(data, v_rec, 12); + memcpy(data + 12, drl_rec, drl_len); + if (!_rl_verify_signature(data, drl_len + 12)) { + DEBUG(DBG_AACS | DBG_CRIT, "invalid drive revocation list signature, not using it\n"); + } else { + cache_save("drl", version, data, drl_len + 12); + } + X_FREE(data); + } + } +} + static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl) { int a, num_uvs = 0; @@ -120,6 +160,7 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl) if ((mkb = mkb_open(aacs->path))) { DEBUG(DBG_AACS, "Get UVS...\n"); + _update_drl(mkb); aacs->mkb_version = mkb_version(mkb); uvs = mkb_subdiff_records(mkb, &len); rec = uvs; _______________________________________________ libaacs-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libaacs-devel
