Petri Hintukainen pushed to branch master at VideoLAN / libaacs
Commits:
0a13b930 by npzacs at 2021-05-04T17:46:29+03:00
Remove double logging
- - - - -
d962a0dc by npzacs at 2021-05-04T17:49:57+03:00
Check crypto_aacs_sign() result
- - - - -
53e37d59 by npzacs at 2021-05-04T18:00:03+03:00
Query drive bus encryption capability only when needed
Faster start with MacOS:
- saves one mount/unmount when disc does not use bus encryption.
=> lot faster startup when disc keys are already cached.
- - - - -
4 changed files:
- src/libaacs/aacs.c
- src/libaacs/crypto.c
- src/libaacs/crypto.h
- src/libaacs/mmc.c
Changes:
=====================================
src/libaacs/aacs.c
=====================================
@@ -75,7 +75,7 @@ struct aacs {
/* bus encryption */
int bee; /* bus encryption enabled flag in content
certificate */
- int bec; /* bus encryption capable flag in drive certificate
*/
+ int bec; /* bus encryption capable flag in drive certificate.
-1 = unread. */
uint8_t read_data_key[16];
uint8_t drive_cert_hash[20];
@@ -1317,6 +1317,8 @@ int aacs_open_device(AACS *aacs, const char *path, const
char *configfile_path)
aacs->path = path ? str_dup(path) : NULL;
aacs->cc = _read_cc_any(aacs);
+ aacs->bee = _get_bus_encryption_enabled(aacs);
+ aacs->bec = -1;
error_code = _calc_title_hash(aacs);
if (error_code != AACS_SUCCESS) {
@@ -1331,18 +1333,20 @@ int aacs_open_device(AACS *aacs, const char *path,
const char *configfile_path)
BD_DEBUG(DBG_AACS, "Failed to initialize AACS!\n");
}
- aacs->bee = _get_bus_encryption_enabled(aacs);
- aacs->bec = _get_bus_encryption_capable(aacs, path);
-
- if (error_code == AACS_SUCCESS && aacs->bee && aacs->bec) {
+ if (error_code == AACS_SUCCESS && aacs->bee) {
if (!cf) {
return AACS_ERROR_NO_CONFIG;
}
+ if (aacs->bec < 0) {
+ aacs->bec = _get_bus_encryption_capable(aacs, path);
+ }
+ if (aacs->bec > 0) {
error_code = _read_read_data_key(aacs, cf->host_cert_list);
if (error_code != AACS_SUCCESS) {
BD_DEBUG(DBG_AACS | DBG_CRIT, "Unable to initialize bus encryption
required by drive and disc\n");
+ }
}
}
@@ -1374,7 +1378,7 @@ void aacs_close(AACS *aacs)
static void _decrypt_unit_bus(AACS *aacs, uint8_t *buf)
{
- if (aacs->bee && aacs->bec) {
+ if (aacs->bee && aacs->bec > 0) {
unsigned int i;
int crypto_err;
for (i = 0; i < ALIGNED_UNIT_LEN; i += SECTOR_LEN) {
@@ -1636,6 +1640,9 @@ void aacs_free_rl(AACS_RL_ENTRY **rl)
uint32_t aacs_get_bus_encryption(AACS *aacs)
{
+ if (aacs->bec < 0) {
+ aacs->bec = _get_bus_encryption_capable(aacs, aacs->path);
+ }
return (aacs->bee * AACS_BUS_ENCRYPTION_ENABLED) |
(aacs->bec * AACS_BUS_ENCRYPTION_CAPABLE);
}
=====================================
src/libaacs/crypto.c
=====================================
@@ -429,7 +429,6 @@ static gcry_error_t _aacs_sexp_key(gcry_sexp_t *p_sexp_key,
);
if (!strfmt) {
- BD_DEBUG(DBG_AACS | DBG_CRIT, "out of memory\n");
err = GPG_ERR_ENOMEM;
goto error;
}
@@ -558,8 +557,8 @@ error:
*
*/
-void crypto_aacs_sign(const uint8_t *cert, const uint8_t *priv_key, uint8_t
*signature,
- const uint8_t *nonce, const uint8_t *point)
+int crypto_aacs_sign(const uint8_t *cert, const uint8_t *priv_key, uint8_t
*signature,
+ const uint8_t *nonce, const uint8_t *point)
{
gcry_sexp_t sexp_key = NULL, sexp_data = NULL, sexp_sig = NULL, sexp_r =
NULL, sexp_s = NULL;
gcry_mpi_t mpi_r = NULL, mpi_s = NULL;
@@ -628,6 +627,8 @@ void crypto_aacs_sign(const uint8_t *cert, const uint8_t
*priv_key, uint8_t *sig
gcry_sexp_release(sexp_s);
gcry_mpi_release(mpi_r);
gcry_mpi_release(mpi_s);
+
+ return err;
}
static int _aacs_verify(const uint8_t *signature, enum gcry_md_algos hash_type,
=====================================
src/libaacs/crypto.h
=====================================
@@ -41,9 +41,9 @@ BD_PRIVATE int crypto_aes_cmac_16(const unsigned char *data,
const unsigned cha
BD_PRIVATE int crypto_aacs_decrypt(const uint8_t *key, uint8_t *out, size_t
out_size, const uint8_t *in, size_t in_size) BD_USED;
-BD_PRIVATE void crypto_aacs_sign(const uint8_t *cert, const uint8_t *priv_key,
+BD_PRIVATE int crypto_aacs_sign(const uint8_t *cert, const uint8_t *priv_key,
uint8_t *signature,
- const uint8_t *nonce, const uint8_t *point);
+ const uint8_t *nonce, const uint8_t *point)
BD_USED;
BD_PRIVATE void crypto_aacs_title_hash(const uint8_t *ukf, uint64_t len,
uint8_t *hash);
BD_PRIVATE int crypto_aacs_verify(const uint8_t *cert, const uint8_t
*signature, const uint8_t *data, uint32_t len) BD_USED;
=====================================
src/libaacs/mmc.c
=====================================
@@ -446,6 +446,7 @@ static int _mmc_aacs_auth(MMC *mmc, uint8_t agid, const
uint8_t *host_priv_key,
{
uint8_t hks[40], dn[20], dkp[40], dks[40];
char str[512];
+ int crypto_error;
memset(hks, 0, sizeof(hks));
@@ -504,8 +505,11 @@ static int _mmc_aacs_auth(MMC *mmc, uint8_t agid, const
uint8_t *host_priv_key,
}
// sign
- crypto_aacs_sign(host_cert, host_priv_key, hks, dn,
- mmc->host_key_point);
+ crypto_error = crypto_aacs_sign(host_cert, host_priv_key, hks, dn,
mmc->host_key_point);
+ if (crypto_error) {
+ LOG_CRYPTO_ERROR(DBG_MMC, "Signing failed", crypto_error);
+ return MMC_ERROR;
+ }
// verify own signature
if (!_verify_signature(host_cert, hks, dn, mmc->host_key_point)) {
View it on GitLab:
https://code.videolan.org/videolan/libaacs/-/compare/92857350477c35882d9ad12ea3e0903ad2aac77d...53e37d597fb15a2d3a7cb9a90056d84caf685195
--
View it on GitLab:
https://code.videolan.org/videolan/libaacs/-/compare/92857350477c35882d9ad12ea3e0903ad2aac77d...53e37d597fb15a2d3a7cb9a90056d84caf685195
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