libaacs | branch: master | npzacs <npz...@gmail.com> | Tue Dec 17 18:44:28 2013 +0200| [f0ba1f9c21f10d6e58ddcef859fb20c741d6c46a] | committer: npzacs
Added aacs_get_mk() > http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=f0ba1f9c21f10d6e58ddcef859fb20c741d6c46a --- ChangeLog | 3 ++- src/libaacs/aacs.c | 23 +++++++++++++++++++++++ src/libaacs/aacs.h | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 0b7bd67..5c2a9ad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ -2013-12-11: Version 0.7.0 +2013-12-18: Version 0.7.0 - Add aacs_get_device_binding_id() and aacs_get_device_nonce(). + - Add aacs_get_mk(). - Add support for bus encryption. - Add support for device keys. - Add support for internal keys. diff --git a/src/libaacs/aacs.c b/src/libaacs/aacs.c index 5e443b5..e733d10 100644 --- a/src/libaacs/aacs.c +++ b/src/libaacs/aacs.c @@ -54,6 +54,8 @@ struct aacs { uint8_t vid[16]; /* PMSN is cached for BD-J */ uint8_t pmsn[16]; + /* Media key is cached for BD+ */ + uint8_t mk[16]; /* unit key for each CPS unit */ uint32_t num_uks; @@ -364,6 +366,7 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, dk_list *dkl) /* 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; } @@ -391,6 +394,7 @@ static int _calc_mk(AACS *aacs, uint8_t *mk, pk_list *pkl, dk_list *dkl) char str[40]; DEBUG(DBG_AACS, "Media key: %s\n", print_hex(str, mk, 16)); + memcpy(aacs->mk, mk, sizeof(aacs->mk)); return AACS_SUCCESS; } } @@ -1139,6 +1143,25 @@ const uint8_t *aacs_get_disc_id(AACS *aacs) return aacs->disc_id; } +const uint8_t *aacs_get_mk(AACS *aacs) +{ + if (!memcmp(aacs->mk, empty_key, 16)) { + config_file *cf = keydbcfg_config_load(NULL); + if (cf) { + _calc_mk(aacs, aacs->mk, cf->pkl, cf->dkl); + + keydbcfg_config_file_close(cf); + } + + if (!memcmp(aacs->mk, empty_key, 16)) { + DEBUG(DBG_AACS | DBG_CRIT, "aacs_get_mk() failed\n"); + return NULL; + } + } + + return aacs->mk; +} + const uint8_t *aacs_get_vid(AACS *aacs) { if (!memcmp(aacs->vid, empty_key, 16)) { diff --git a/src/libaacs/aacs.h b/src/libaacs/aacs.h index 8ab49f6..fe64bc8 100644 --- a/src/libaacs/aacs.h +++ b/src/libaacs/aacs.h @@ -1,6 +1,7 @@ /* * This file is part of libaacs * Copyright (C) 2009-2010 Obliter0n + * Copyright (C) 2009-2013 npzacz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -52,6 +53,7 @@ AACS_PUBLIC int aacs_get_mkb_version(AACS *aacs); AACS_PUBLIC const uint8_t *aacs_get_disc_id(AACS *aacs); AACS_PUBLIC const uint8_t *aacs_get_vid(AACS *aacs); /* may fail even if disc can be decrypted */ AACS_PUBLIC const uint8_t *aacs_get_pmsn(AACS *aacs); /* may fail even if disc can be decrypted */ +AACS_PUBLIC const uint8_t *aacs_get_mk(AACS *aacs); /* may fail even if disc can be decrypted */ /* AACS Online */ AACS_PUBLIC const uint8_t *aacs_get_device_binding_id(AACS *aacs); _______________________________________________ libaacs-devel mailing list libaacs-devel@videolan.org https://mailman.videolan.org/listinfo/libaacs-devel