Petri Hintukainen pushed to branch master at VideoLAN / libaacs
Commits:
c42a4f49 by npzacs at 2021-05-05T18:17:54+03:00
Return error code from crypto_aacs_verify_host_cert()
- - - - -
3f006c7a by npzacs at 2021-05-17T17:04:28+03:00
Return error code from crypto_aacs_verify_drive_cert()
- - - - -
3 changed files:
- src/libaacs/aacs.c
- src/libaacs/crypto.c
- src/libaacs/mmc.c
Changes:
=====================================
src/libaacs/aacs.c
=====================================
@@ -691,8 +691,11 @@ static int _mmc_read_auth(AACS *aacs, cert_list *hcl, int
type, uint8_t *p1, uin
for (; hcl ; hcl = hcl->next) {
char tmp_str[2*92+1];
+ int crypto_error;
- if (!crypto_aacs_verify_host_cert(hcl->host_cert)) {
+ crypto_error = crypto_aacs_verify_host_cert(hcl->host_cert);
+ if (crypto_error) {
+ LOG_CRYPTO_ERROR(DBG_AACS, "host certificate signature
verification failed", crypto_error);
BD_DEBUG(DBG_AACS, "Not using invalid host certificate %s.\n",
str_print_hex(tmp_str, hcl->host_cert, 92));
continue;
=====================================
src/libaacs/crypto.c
=====================================
@@ -715,13 +715,12 @@ int crypto_aacs_verify_aacscc(const uint8_t *signature,
const uint8_t *data, ui
static int _aacs_verify_cert(const uint8_t *cert)
{
+ /* check length byte */
if (MKINT_BE16(cert+2) != 0x5c) {
- BD_DEBUG(DBG_AACS, "Certificate length is invalid (0x%04x), expected
0x005c\n",
- MKINT_BE16(cert+2));
- return 0;
+ return GPG_ERR_UNSUPPORTED_CERT;
}
- return !crypto_aacs_verify_aacsla(cert + 52, cert, 52);
+ return crypto_aacs_verify_aacsla(cert + 52, cert, 52);
}
int crypto_aacs_verify_host_cert(const uint8_t *cert)
@@ -731,19 +730,13 @@ int crypto_aacs_verify_host_cert(const uint8_t *cert)
break;
case 0x12:
// XXX checking the signature would cause buffer overread (certificate
is truncated in config file)
- BD_DEBUG(DBG_AACS | DBG_CRIT, "AACS 2.0 host certificate not
supported\n");
- return 0;
+ /* BD_DEBUG(DBG_AACS | DBG_CRIT, "AACS 2.0 host certificate not
supported\n"); */
+ return GPG_ERR_UNSUPPORTED_CERT;
default:
- BD_DEBUG(DBG_AACS, "Host certificate type is invalid (0x%02x)\n",
cert[0]);
- return 0;
+ return GPG_ERR_UNSUPPORTED_CERT;
}
- if (!_aacs_verify_cert(cert)) {
- BD_DEBUG(DBG_AACS, "Host certificate signature is invalid\n");
- return 0;
- }
-
- return 1;
+ return _aacs_verify_cert(cert);
}
int crypto_aacs_verify_drive_cert(const uint8_t *cert)
@@ -752,20 +745,14 @@ int crypto_aacs_verify_drive_cert(const uint8_t *cert)
case 0x01:
break;
case 0x11:
- BD_DEBUG(DBG_AACS | DBG_CRIT, "WARNING: Drive is using AACS 2.0
certificate\n");
+ /* BD_DEBUG(DBG_AACS | DBG_CRIT, "WARNING: Drive is using AACS 2.0
certificate\n"); */
// XXX checking the signature would cause buffer overread (certificate
is truncated at MMC layer)
- return 0;
+ return GPG_ERR_UNSUPPORTED_CERT;
default:
- BD_DEBUG(DBG_AACS, "Drive certificate type is invalid (0x%02x)\n",
cert[0]);
- return 0;
- }
-
- if (!_aacs_verify_cert(cert)) {
- BD_DEBUG(DBG_AACS, "Drive certificate signature is invalid\n");
- return 0;
+ return GPG_ERR_UNSUPPORTED_CERT;
}
- return 1;
+ return _aacs_verify_cert(cert);
}
void crypto_aacs_title_hash(const uint8_t *ukf, uint64_t len, uint8_t *hash)
=====================================
src/libaacs/mmc.c
=====================================
@@ -487,9 +487,15 @@ static int _mmc_aacs_auth(MMC *mmc, uint8_t agid, const
uint8_t *host_priv_key,
BD_DEBUG(DBG_MMC, "Drive nonce : %s\n", str_print_hex(str, dn,
20));
}
+ if (mmc->drive_cert[0] == 0x11) {
+ BD_DEBUG(DBG_AACS | DBG_CRIT, "WARNING: Drive is using AACS 2.0
certificate\n");
+ return MMC_ERROR;
+ }
+
// verify drive certificate
- if (!crypto_aacs_verify_drive_cert(mmc->drive_cert)) {
- BD_DEBUG(DBG_MMC | DBG_CRIT, "Drive certificate is invalid\n");
+ crypto_error = crypto_aacs_verify_drive_cert(mmc->drive_cert);
+ if (crypto_error) {
+ LOG_CRYPTO_ERROR(DBG_MMC, "drive certificate signature verification
failed", crypto_error);
return MMC_ERROR;
}
@@ -702,6 +708,7 @@ int mmc_read_auth(MMC *mmc, const uint8_t *host_priv_key,
const uint8_t *host_ce
int mmc_read_drive_cert(MMC *mmc, uint8_t *drive_cert)
{
uint8_t buf[116];
+ int crypto_error;
if (mmc->drive_cert[0] == 0x01) {
memcpy(drive_cert, mmc->drive_cert, 92);
@@ -719,8 +726,9 @@ int mmc_read_drive_cert(MMC *mmc, uint8_t *drive_cert)
return MMC_ERROR;
}
- if (!crypto_aacs_verify_drive_cert(buf + 4)) {
- BD_DEBUG(DBG_MMC | DBG_CRIT, "Drive certificate is invalid\n");
+ crypto_error = crypto_aacs_verify_drive_cert(buf + 4);
+ if (crypto_error) {
+ LOG_CRYPTO_ERROR(DBG_MMC, "drive certificate signature verification
failed", crypto_error);
return MMC_ERROR;
}
View it on GitLab:
https://code.videolan.org/videolan/libaacs/-/compare/1812614a53fc6971cdf55e8da68232b329fef877...3f006c7add1e0cad2d10a8539fd035998f89d326
--
View it on GitLab:
https://code.videolan.org/videolan/libaacs/-/compare/1812614a53fc6971cdf55e8da68232b329fef877...3f006c7add1e0cad2d10a8539fd035998f89d326
You're receiving this email because of your account on code.videolan.org.
_______________________________________________
libaacs-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/libaacs-devel