Petri Hintukainen pushed to branch master at VideoLAN / libaacs
Commits:
9927a98a by npzacs at 2021-05-05T17:11:22+03:00
Return error code from crypto_aacs_verify_aacsla()
- - - - -
1812614a by npzacs at 2021-05-05T17:14:02+03:00
Return error code from crypto_aacs_verify_aacscc()
- - - - -
3 changed files:
- src/libaacs/aacs.c
- src/libaacs/content_cert.c
- src/libaacs/crypto.c
Changes:
=====================================
src/libaacs/aacs.c
=====================================
@@ -136,6 +136,8 @@ static int _validate_pk(const uint8_t *pk,
static int _rl_verify_signature(const uint8_t *rl, size_t size)
{
+ int crypto_err;
+
if (size < 40) {
BD_DEBUG(DBG_AACS, "too small revocation list\n");
return 0;
@@ -153,7 +155,13 @@ static int _rl_verify_signature(const uint8_t *rl, size_t
size)
return 0;
}
- return crypto_aacs_verify_aacsla(rl + len, rl, len);
+ crypto_err = crypto_aacs_verify_aacsla(rl + len, rl, len);
+ if (crypto_err) {
+ LOG_CRYPTO_ERROR(DBG_AACS, "revocation list signature verification
failed", crypto_err);
+ return 0;
+ }
+
+ return 1;
}
static void _save_rl(const char *name, uint32_t version, const uint8_t
*version_rec,
@@ -173,9 +181,7 @@ static void _save_rl(const char *name, uint32_t version,
const uint8_t *version_
if (data) {
memcpy(data, version_rec, 12);
memcpy(data + 12, rl_rec, rl_len);
- if (!_rl_verify_signature(data, rl_len + 12)) {
- BD_DEBUG(DBG_AACS | DBG_CRIT, "invalid %s signature, not using
it\n", name);
- } else {
+ if (_rl_verify_signature(data, rl_len + 12)) {
cache_save(name, version, data, rl_len + 12);
}
X_FREE(data);
=====================================
src/libaacs/content_cert.c
=====================================
@@ -72,6 +72,7 @@ CONTENT_CERT *cc_parse(const void *data, size_t len)
size_t num_digest = MKINT_BE16(p + 12);
size_t cert_data_len = 26 + length_format_specific + num_digest*8;
+ int crypto_error;
if (len < cert_data_len + signature_size) {
BD_DEBUG(DBG_AACS | DBG_CRIT, "Invalid content certificate (length %zu
< %zu)\n",
@@ -81,8 +82,9 @@ CONTENT_CERT *cc_parse(const void *data, size_t len)
/* check signature */
- if (!crypto_aacs_verify_aacscc(p + cert_data_len, p, cert_data_len)) {
- BD_DEBUG(DBG_AACS | DBG_CRIT, "Invalid content certificate
signature\n");
+ crypto_error = crypto_aacs_verify_aacscc(p + cert_data_len, p,
cert_data_len);
+ if (crypto_error) {
+ LOG_CRYPTO_ERROR(DBG_AACS, "content certificate signature verification
failed", crypto_error);
return NULL;
}
=====================================
src/libaacs/crypto.c
=====================================
@@ -652,8 +652,8 @@ static int _aacs_verify(const uint8_t *signature, enum
gcry_md_algos hash_type,
key_len = 32;
break;
default:
- BD_ASSERT_UNREACHABLE ("invalid signature size");
- return 0;
+ BD_ASSERT_UNREACHABLE ("invalid signature algorithm");
+ return GPG_ERR_UNSUPPORTED_ALGORITHM;
}
GCRY_VERIFY("_aacs_sexp_key",
@@ -681,14 +681,14 @@ int crypto_aacs_verify(const uint8_t *cert, const uint8_t
*signature, const uint
return _aacs_verify(signature, GCRY_MD_SHA1, cert + 12, cert + 32, data,
len);
}
-int crypto_aacs_verify_aacsla(const uint8_t *signature, const uint8_t *data,
uint32_t len)
+int crypto_aacs_verify_aacsla(const uint8_t *signature, const uint8_t *data,
uint32_t len)
{
static const uint8_t aacs_la_pubkey_x[] = {0x63, 0xC2, 0x1D, 0xFF, 0xB2,
0xB2, 0x79, 0x8A, 0x13, 0xB5,
0x8D, 0x61, 0x16, 0x6C, 0x4E,
0x4A, 0xAC, 0x8A, 0x07, 0x72 };
static const uint8_t aacs_la_pubkey_y[] = {0x13, 0x7E, 0xC6, 0x38, 0x81,
0x8F, 0xD9, 0x8F, 0xA4, 0xC3,
0x0B, 0x99, 0x67, 0x28, 0xBF,
0x4B, 0x91, 0x7F, 0x6A, 0x27 };
- return !_aacs_verify(signature, GCRY_MD_SHA1, aacs_la_pubkey_x,
aacs_la_pubkey_y, data, len);
+ return _aacs_verify(signature, GCRY_MD_SHA1, aacs_la_pubkey_x,
aacs_la_pubkey_y, data, len);
}
int crypto_aacs_verify_aacscc(const uint8_t *signature, const uint8_t *data,
uint32_t len)
@@ -703,15 +703,14 @@ int crypto_aacs_verify_aacscc(const uint8_t *signature,
const uint8_t *data, ui
0x54, 0x5E, 0xCC, 0x27, 0x1E,
0xE4, 0x6C, 0x4A, 0xEF, 0x81, 0xD9, 0x16, 0x9B, 0xF8, 0x41, 0x72 };
switch (data[0]) {
case 0x00: /* AACS 1 */
- return !_aacs_verify(signature, GCRY_MD_SHA1, aacs_cc_pubkey_x,
aacs_cc_pubkey_y, data, len);
+ return _aacs_verify(signature, GCRY_MD_SHA1, aacs_cc_pubkey_x,
aacs_cc_pubkey_y, data, len);
case 0x10: /* AACS 2 */
- return !_aacs_verify(signature, GCRY_MD_SHA256, aacs2_cc_pubkey_x,
aacs2_cc_pubkey_y, data, len);
+ return _aacs_verify(signature, GCRY_MD_SHA256, aacs2_cc_pubkey_x,
aacs2_cc_pubkey_y, data, len);
default:
- BD_DEBUG(DBG_AACS | DBG_CRIT, "Unknown content certificate type
0x%02x\n", data[0]);
break;
}
- return 0;
+ return GPG_ERR_UNSUPPORTED_CERT;
}
static int _aacs_verify_cert(const uint8_t *cert)
@@ -722,7 +721,7 @@ static int _aacs_verify_cert(const uint8_t *cert)
return 0;
}
- 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)
View it on GitLab:
https://code.videolan.org/videolan/libaacs/-/compare/b9f592658d4faba846e2051c9ab37e6986f4bc74...1812614a53fc6971cdf55e8da68232b329fef877
--
View it on GitLab:
https://code.videolan.org/videolan/libaacs/-/compare/b9f592658d4faba846e2051c9ab37e6986f4bc74...1812614a53fc6971cdf55e8da68232b329fef877
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