Petri Hintukainen pushed to branch master at VideoLAN / libaacs
Commits:
2604f460 by npzacs at 2021-04-24T16:24:12+03:00
Factorize common code
- - - - -
ab5cea75 by npzacs at 2021-04-24T16:24:22+03:00
Move gcrypt code to crypto.c helper
- - - - -
414d47a5 by Petri Hintukainen at 2021-04-24T16:24:24+03:00
Remove tabs
- - - - -
00494733 by npzacs at 2021-04-24T16:24:27+03:00
Remove unused code
- - - - -
d6baeea3 by npzacs at 2021-04-24T16:24:30+03:00
Factorize duplicated code
- - - - -
6 changed files:
- src/examples/aacs_info.c
- src/file/keydbcfg-lexer.l
- src/libaacs/aacs.c
- src/libaacs/crypto.c
- src/libaacs/crypto.h
- src/libaacs/mkb.c
Changes:
=====================================
src/examples/aacs_info.c
=====================================
@@ -68,7 +68,7 @@ int main (int argc, char **argv)
if (argc < 2) {
fprintf(stderr, "Usage: aacs_info <path-to-disc-root>
[<path-to-config-file>]\n");
- exit(EXIT_FAILURE);
+ exit(EXIT_FAILURE);
}
aacs_get_version(&major, &minor, µ);
@@ -76,7 +76,7 @@ int main (int argc, char **argv)
aacs = aacs_init();
if (!aacs) {
- exit(EXIT_FAILURE);
+ exit(EXIT_FAILURE);
}
error_code = aacs_open_device(aacs, argv[1], argc > 2 ? argv[2] : NULL);
=====================================
src/file/keydbcfg-lexer.l
=====================================
@@ -32,9 +32,6 @@
int isatty(int i) { return 0; }
-#if 0
-static char *trim_string(const char *string);
-#endif
%}
/* Options to generate reentrant lexer that's POSIX lex compatible. The
* bison-bridge option is also set since bison forces the use of a parameter
@@ -91,7 +88,6 @@ BAD_ENTRY ([^\n])
{WHITESPACE} {}
<TITLE_STATE>{DISC_TITLE} {
- //yylval->string = trim_string(yytext);
yylval->string = yytext;
BEGIN INITIAL;
return DISC_TITLE;
@@ -143,21 +139,3 @@ BAD_ENTRY ([^\n])
{COMMENT} {}
{BAD_ENTRY} { return BAD_ENTRY; }
%%
-#if 0
-/* Function used to trim leading and trailing space from a string */
-static char *trim_string(const char *string)
-{
- int start = 0;
- int end = strlen(string);
- while (string[start] == ' ' || string[start] == '\t')
- start++;
- while (string[end] == '\0' || string[end] == ' ' || string[end] == '\t')
- end--;
- int size = end - start + 1;
-
- char *new_string = (char*)malloc(size + 1);
- strncpy(new_string, string + start, size);
- new_string[size] = '\0';
- return new_string;
-}
-#endif
\ No newline at end of file
=====================================
src/libaacs/aacs.c
=====================================
@@ -42,10 +42,6 @@
#include <inttypes.h>
#include <string.h>
#include <stdio.h>
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-#include <gcrypt.h>
#define SECTOR_LEN 2048 /* bus encryption block size */
@@ -94,8 +90,6 @@ struct aacs {
static const uint8_t empty_key[20] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00 };
-static const uint8_t aacs_iv[16] = { 0x0b, 0xa0, 0xf8, 0xdd, 0xfe, 0xa6,
0x1f, 0xb3,
- 0xd8, 0xdf, 0x9f, 0x56, 0x6a, 0x05,
0x0f, 0x78 };
/*
* Validate processing key using media key verification data
@@ -1163,7 +1157,6 @@ static int _decrypt_unit(AACS *aacs, uint8_t *out_buf,
const uint8_t *in_buf, ui
{
/* inbuf == NULL means in-place decryption */
- gcry_cipher_hd_t gcry_h;
int a;
uint8_t key[16];
@@ -1171,24 +1164,17 @@ static int _decrypt_unit(AACS *aacs, uint8_t *out_buf,
const uint8_t *in_buf, ui
memcpy(out_buf, in_buf, 16); /* first 16 bytes are plain */
}
- gcry_cipher_open(&gcry_h, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_ECB, 0);
- gcry_cipher_setkey(gcry_h, aacs->uk->uk[curr_uk].key, 16);
- gcry_cipher_encrypt(gcry_h, key, 16, out_buf, 16); /* here out_buf is
plain data fron in_buf */
- gcry_cipher_close(gcry_h);
+ crypto_aes128e(aacs->uk->uk[curr_uk].key, out_buf, key);
for (a = 0; a < 16; a++) {
key[a] ^= out_buf[a]; /* here out_buf is plain data fron in_buf */
}
- gcry_cipher_open(&gcry_h, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC, 0);
- gcry_cipher_setkey(gcry_h, key, 16);
- gcry_cipher_setiv(gcry_h, aacs_iv, 16);
if (BD_UNLIKELY(in_buf != NULL)) {
- gcry_cipher_decrypt(gcry_h, out_buf + 16, ALIGNED_UNIT_LEN - 16,
in_buf + 16, ALIGNED_UNIT_LEN - 16);
+ crypto_aacs_decrypt(key, out_buf + 16, ALIGNED_UNIT_LEN - 16, in_buf +
16, ALIGNED_UNIT_LEN - 16);
} else {
- gcry_cipher_decrypt(gcry_h, out_buf + 16, ALIGNED_UNIT_LEN - 16, NULL,
0);
+ crypto_aacs_decrypt(key, out_buf + 16, ALIGNED_UNIT_LEN - 16, NULL, 0);
}
- gcry_cipher_close(gcry_h);
if (_verify_ts(out_buf)) {
return 1;
@@ -1197,17 +1183,6 @@ static int _decrypt_unit(AACS *aacs, uint8_t *out_buf,
const uint8_t *in_buf, ui
return 0;
}
-static void _decrypt_bus(AACS *aacs, uint8_t *buf)
-{
- gcry_cipher_hd_t gcry_h;
-
- gcry_cipher_open(&gcry_h, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC, 0);
- gcry_cipher_setkey(gcry_h, aacs->read_data_key, 16);
- gcry_cipher_setiv(gcry_h, aacs_iv, 16);
- gcry_cipher_decrypt(gcry_h, buf + 16, SECTOR_LEN - 16, NULL, 0);
- gcry_cipher_close(gcry_h);
-}
-
/*
* libaacs API
*/
@@ -1365,7 +1340,8 @@ static void _decrypt_unit_bus(AACS *aacs, uint8_t *buf)
if (aacs->bee && aacs->bec) {
unsigned int i;
for (i = 0; i < ALIGNED_UNIT_LEN; i += SECTOR_LEN) {
- _decrypt_bus(aacs, buf + i);
+ //_decrypt_bus(aacs, buf + i);
+ crypto_aacs_decrypt(aacs->read_data_key, buf + i + 16, SECTOR_LEN
- 16, NULL, 0);
}
}
}
=====================================
src/libaacs/crypto.c
=====================================
@@ -143,6 +143,16 @@ int crypto_init()
return crypto_init_check;
}
+void crypto_aes128e(const uint8_t *key, const uint8_t *data, uint8_t *dst)
+{
+ gcry_cipher_hd_t gcry_h;
+
+ gcry_cipher_open(&gcry_h, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_ECB, 0);
+ gcry_cipher_setkey(gcry_h, key, 16);
+ gcry_cipher_encrypt(gcry_h, dst, 16, data, 16);
+ gcry_cipher_close(gcry_h);
+}
+
void crypto_aes128d(const uint8_t *key, const uint8_t *data, uint8_t *dst)
{
gcry_cipher_hd_t gcry_h;
@@ -228,6 +238,26 @@ void crypto_aes_cmac_16(const unsigned char *data, const
unsigned char *aes_key,
gcry_cipher_close(gcry_h);
}
+/*
+ *
+ */
+
+void crypto_aacs_decrypt(const uint8_t *key, uint8_t *out, size_t out_size,
const uint8_t *in, size_t in_size)
+{
+ static const uint8_t aacs_iv[16] = { 0x0b, 0xa0, 0xf8, 0xdd, 0xfe, 0xa6,
0x1f, 0xb3,
+ 0xd8, 0xdf, 0x9f, 0x56, 0x6a, 0x05,
0x0f, 0x78 };
+ gcry_cipher_hd_t gcry_h;
+
+ gcry_cipher_open(&gcry_h, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC, 0);
+ gcry_cipher_setkey(gcry_h, key, 16);
+ gcry_cipher_setiv(gcry_h, aacs_iv, 16);
+ gcry_cipher_decrypt(gcry_h, out, out_size, in, in_size);
+ gcry_cipher_close(gcry_h);
+}
+
+/*
+ *
+ */
#if defined(HAVE_STRERROR_R) && defined(HAVE_LIBGPG_ERROR)
#define LOG_GCRY_ERROR(msg, func, err) \
=====================================
src/libaacs/crypto.h
=====================================
@@ -26,11 +26,14 @@
#include <stdint.h>
BD_PRIVATE int crypto_init(void);
+BD_PRIVATE void crypto_aes128e(const uint8_t *key, const uint8_t *data,
uint8_t *dst);
BD_PRIVATE void crypto_aes128d(const uint8_t *key, const uint8_t *data,
uint8_t *dst);
BD_PRIVATE void crypto_aesg3(const uint8_t *D, uint8_t *lsubk, uint8_t* rsubk,
uint8_t *pk); // returns left, centre, right
keys
BD_PRIVATE void crypto_aes_cmac_16(const unsigned char *data, const unsigned
char *aes_key, unsigned char *cmac);
+BD_PRIVATE void crypto_aacs_decrypt(const uint8_t *key, uint8_t *out, size_t
out_size, const uint8_t *in, size_t in_size);
+
BD_PRIVATE void crypto_aacs_sign(const uint8_t *cert, const uint8_t *priv_key,
uint8_t *signature,
const uint8_t *nonce, const uint8_t *point);
=====================================
src/libaacs/mkb.c
=====================================
@@ -122,6 +122,21 @@ size_t mkb_data_size(MKB *mkb)
return pos;
}
+static const uint8_t *_simple_record(MKB *mkb, uint8_t type, size_t *len)
+{
+ const uint8_t *rec = _record(mkb, type, len);
+
+ if (*len < 4) {
+ return NULL;
+ }
+ if (rec) {
+ rec += 4;
+ *len -= 4;
+ }
+
+ return rec;
+}
+
uint32_t mkb_type(MKB *mkb)
{
@@ -157,65 +172,24 @@ const uint8_t *mkb_type_and_version_record(MKB *mkb)
return rec;
}
-
const uint8_t *mkb_host_revokation_entries(MKB *mkb, size_t *len)
{
- const uint8_t *rec = _record(mkb, 0x21, len);
-
- if (*len < 4) {
- return NULL;
- }
- if (rec) {
- rec += 4;
- *len -= 4;
- }
-
- return rec;
+ return _simple_record(mkb, 0x21, len);
}
const uint8_t *mkb_drive_revokation_entries(MKB *mkb, size_t *len)
{
- const uint8_t *rec = _record(mkb, 0x20, len);
-
- if (*len < 4) {
- return NULL;
- }
- if (rec) {
- rec += 4;
- *len -= 4;
- }
-
- return rec;
+ return _simple_record(mkb, 0x20, len);
}
const uint8_t *mkb_subdiff_records(MKB *mkb, size_t *len)
{
- const uint8_t *rec = _record(mkb, 0x04, len);
-
- if (*len < 4) {
- return NULL;
- }
- if (rec) {
- rec += 4;
- *len -= 4;
- }
-
- return rec;
+ return _simple_record(mkb, 0x04, len);
}
const uint8_t *mkb_cvalues(MKB *mkb, size_t *len)
{
- const uint8_t *rec = _record(mkb, 0x05, len);
-
- if (*len < 4) {
- return NULL;
- }
- if (rec) {
- rec += 4;
- *len -= 4;
- }
-
- return rec;
+ return _simple_record(mkb, 0x05, len);
}
const uint8_t *mkb_mk_dv(MKB *mkb)
@@ -237,33 +211,18 @@ const uint8_t *mkb_mk_dv(MKB *mkb)
break;
}
- rec = _record(mkb, dv_record, &len);
+ rec = _simple_record(mkb, dv_record, &len);
- if (len < 20) {
+ if (len < 16) {
return NULL;
}
- if (rec) {
- rec += 4;
- }
-
return rec;
}
const uint8_t *mkb_signature(MKB *mkb, size_t *len)
{
- const uint8_t *rec = _record(mkb, 0x02, len);
-
- if (*len < 4) {
- return NULL;
- }
- if (rec) {
- rec += 4;
- *len -= 4;
- }
-
- return rec;
-
+ return _simple_record(mkb, 0x02, len);
}
static int _cert_is_revoked(const uint8_t *rl, size_t rl_size, const uint8_t
*cert_id_bin)
View it on GitLab:
https://code.videolan.org/videolan/libaacs/-/compare/b9d3bfcdf240b19a9fc6212dec7a9b6c50b5fb8d...d6baeea38cacb385ca525da53d8a30dde0eafefd
--
View it on GitLab:
https://code.videolan.org/videolan/libaacs/-/compare/b9d3bfcdf240b19a9fc6212dec7a9b6c50b5fb8d...d6baeea38cacb385ca525da53d8a30dde0eafefd
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