libaacs | branch: master | npzacs <npz...@gmail.com> | Tue Oct 15 09:38:51 2013 +0300| [07e540c962b0dc090c3417e4c01ca6d4f5fe762c] | committer: npzacs
Improved error logging when drive and certificate are incompatible > http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=07e540c962b0dc090c3417e4c01ca6d4f5fe762c --- src/libaacs/aacs.c | 16 +++++++++++++++- src/libaacs/mmc.c | 16 +++++++++++++++- src/libaacs/mmc.h | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/libaacs/aacs.c b/src/libaacs/aacs.c index 004333e..55d270e 100644 --- a/src/libaacs/aacs.c +++ b/src/libaacs/aacs.c @@ -288,6 +288,7 @@ static int _read_vid(AACS *aacs, cert_list *hcl) int error_code = AACS_ERROR_NO_CERT; MKB *hrl_mkb = _get_hrl_mkb(mmc); + const uint8_t *drive_cert = mmc_get_drive_cert(mmc); for (;hcl && hcl->host_priv_key && hcl->host_cert; hcl = hcl->next) { @@ -302,13 +303,19 @@ static int _read_vid(AACS *aacs, cert_list *hcl) continue; } - if (mkb_host_cert_is_revoked(hrl_mkb, cert + 4)) { + if (mkb_host_cert_is_revoked(hrl_mkb, cert + 4) > 0) { DEBUG(DBG_AACS | DBG_CRIT, "Host certificate %s has been revoked.\n", print_hex(tmp_str, cert + 4, 6)); error_code = AACS_ERROR_CERT_REVOKED; //continue; } + if (drive_cert && (drive_cert[1] & 0x01) && !(cert[1] & 0x01)) { + DEBUG(DBG_AACS, "Certificate (id 0x%s) does not support bus encryption\n", + print_hex(tmp_str, cert + 4, 6)); + //continue; + } + DEBUG(DBG_AACS, "Trying host certificate (id 0x%s)...\n", print_hex(tmp_str, cert + 4, 6)); @@ -392,6 +399,7 @@ static int _read_pmsn(AACS *aacs, cert_list *hcl) } int error_code = AACS_ERROR_NO_CERT; + const uint8_t *drive_cert = mmc_get_drive_cert(mmc); for (;hcl && hcl->host_priv_key && hcl->host_cert; hcl = hcl->next) { @@ -406,6 +414,12 @@ static int _read_pmsn(AACS *aacs, cert_list *hcl) continue; } + if (drive_cert && (drive_cert[1] & 0x01) && !(cert[1] & 0x01)) { + DEBUG(DBG_AACS, "Certificate (id 0x%s) does not support bus encryption\n", + print_hex(tmp_str, cert + 4, 6)); + //continue; + } + DEBUG(DBG_AACS, "Trying host certificate (id 0x%s)...\n", print_hex(tmp_str, cert + 4, 6)); diff --git a/src/libaacs/mmc.c b/src/libaacs/mmc.c index c091d42..ce62d41 100644 --- a/src/libaacs/mmc.c +++ b/src/libaacs/mmc.c @@ -1040,7 +1040,13 @@ static int _mmc_aacs_auth(MMC *mmc, uint8_t agid, const uint8_t *host_priv_key, // send host cert + nonce if (!_mmc_send_host_cert(mmc, agid, mmc->host_nonce, host_cert)) { - DEBUG(DBG_MMC | DBG_CRIT, "Host key / Certificate has been revoked by your drive ?\n"); + + if ((mmc->drive_cert[1] & 0x01) && !(host_cert[1] & 0x01)) { + DEBUG(DBG_MMC | DBG_CRIT, "Certificate (id 0x%s) can not be used with bus encryption capable drive\n", + print_hex(str, host_cert + 4, 6)); + } else { + DEBUG(DBG_MMC | DBG_CRIT, "Host key / Certificate has been revoked by your drive ?\n"); + } return MMC_ERROR_CERT_REVOKED; } @@ -1280,6 +1286,14 @@ int mmc_read_drive_cert(MMC *mmc, uint8_t *drive_cert) return MMC_SUCCESS; } +const uint8_t *mmc_get_drive_cert(MMC *mmc) +{ + if (mmc->drive_cert[0] == 0x01) { + return mmc->drive_cert; + } + return NULL; +} + uint8_t *mmc_read_mkb(MMC *mmc, int address, int *size) { uint8_t agid = 0; diff --git a/src/libaacs/mmc.h b/src/libaacs/mmc.h index 73fb022..0355408 100644 --- a/src/libaacs/mmc.h +++ b/src/libaacs/mmc.h @@ -40,6 +40,7 @@ AACS_PRIVATE int mmc_read_pmsn(MMC *mmc, const uint8_t *host_priv_key, const ui AACS_PRIVATE int mmc_read_data_keys(MMC *mmc, const uint8_t *host_priv_key, const uint8_t *host_cert, uint8_t *read_data_key, uint8_t *write_data_key); AACS_PRIVATE int mmc_read_drive_cert(MMC *mmc, uint8_t *drive_cert); +AACS_PRIVATE const uint8_t *mmc_get_drive_cert(MMC *mmc); /* read partial MKB */ AACS_PRIVATE uint8_t *mmc_read_mkb(MMC *mmc, int address, int *size); _______________________________________________ libaacs-devel mailing list libaacs-devel@videolan.org https://mailman.videolan.org/listinfo/libaacs-devel