libbluray | branch: master | npzacs <npz...@gmail.com> | Tue Mar 29 13:31:07 2016 +0300| [aba38316a036cf9828332bc928ceafffdb69a977] | committer: npzacs
aacs: support retrieving content certificate information > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=aba38316a036cf9828332bc928ceafffdb69a977 --- src/libbluray/bdj/java/org/videolan/Libbluray.java | 3 +++ src/libbluray/bdj/native/org_videolan_Libbluray.c | 15 ++++++++++++-- src/libbluray/disc/aacs.c | 21 ++++++++++++++++++++ src/libbluray/disc/aacs.h | 2 ++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/libbluray/bdj/java/org/videolan/Libbluray.java b/src/libbluray/bdj/java/org/videolan/Libbluray.java index d74edc4..2ab68a4 100644 --- a/src/libbluray/bdj/java/org/videolan/Libbluray.java +++ b/src/libbluray/bdj/java/org/videolan/Libbluray.java @@ -658,6 +658,9 @@ public class Libbluray { public static final int AACS_MEDIA_PMSN = 3; public static final int AACS_DEVICE_BINDING_ID = 4; public static final int AACS_DEVICE_NONCE = 5; + public static final int AACS_MEDIA_KEY = 6; + public static final int AACS_CONTENT_CERT_ID = 7; + public static final int AACS_BDJ_ROOT_CERT_HASH= 8; private static native byte[] getAacsDataN(long np, int type); private static native TitleInfo[] getTitleInfosN(long np); diff --git a/src/libbluray/bdj/native/org_videolan_Libbluray.c b/src/libbluray/bdj/native/org_videolan_Libbluray.c index c940ec5..980ebf5 100644 --- a/src/libbluray/bdj/native/org_videolan_Libbluray.c +++ b/src/libbluray/bdj/native/org_videolan_Libbluray.c @@ -193,14 +193,25 @@ JNIEXPORT jbyteArray JNICALL Java_org_videolan_Libbluray_getAacsDataN { BLURAY* bd = (BLURAY*)(intptr_t)np; const uint8_t *data = bd_get_aacs_data(bd, type); + size_t data_size = 16; BD_DEBUG(DBG_JNI, "getAacsDataN(%d) -> %p\n", (int)type, (const void *)data); if (!data) { return NULL; } - jbyteArray array = (*env)->NewByteArray(env, 16); - (*env)->SetByteArrayRegion(env, array, 0, 16, (const jbyte *)data); + if (type == 1/*BD_AACS_DISC_ID*/) { + data_size = 20; + } + if (type == 7/*BD_AACS_CONTENT_CERT_ID*/) { + data_size = 6; + } + if (type == 8/*BD_AACS_BDJ_ROOT_CERT_HASH*/) { + data_size = 20; + } + + jbyteArray array = (*env)->NewByteArray(env, data_size); + (*env)->SetByteArrayRegion(env, array, 0, data_size, (const jbyte *)data); return array; } diff --git a/src/libbluray/disc/aacs.c b/src/libbluray/disc/aacs.c index 13860cd..cf44f06 100644 --- a/src/libbluray/disc/aacs.c +++ b/src/libbluray/disc/aacs.c @@ -340,6 +340,19 @@ int libaacs_get_bec_enabled(BD_AACS *p) return get_bec(p->aacs) == 3; } +static const uint8_t *_get_data(BD_AACS *p, const char *func) +{ + fptr_p_void fp; + + *(void **)(&fp) = dl_dlsym(p->h_libaacs, func); + if (!fp) { + BD_DEBUG(DBG_BLURAY | DBG_CRIT, "%s() dlsym failed!\n", func); + return NULL; + } + + return (const uint8_t*)fp(p->aacs); +} + static const char *_type2str(int type) { switch (type) { @@ -349,6 +362,8 @@ static const char *_type2str(int type) case BD_AACS_DEVICE_BINDING_ID: return "DEVICE_BINDING_ID"; case BD_AACS_DEVICE_NONCE: return "DEVICE_NONCE"; case BD_AACS_MEDIA_KEY: return "MEDIA_KEY"; + case BD_AACS_CONTENT_CERT_ID: return "CONTENT_CERT_ID"; + case BD_AACS_BDJ_ROOT_CERT_HASH: return "BDJ_ROOT_CERT_HASH"; default: return "???"; } } @@ -378,6 +393,12 @@ BD_PRIVATE const uint8_t *libaacs_get_aacs_data(BD_AACS *p, int type) case BD_AACS_MEDIA_KEY: return _get_media_key(p); + + case BD_AACS_CONTENT_CERT_ID: + return _get_data(p, "aacs_get_content_cert_id"); + + case BD_AACS_BDJ_ROOT_CERT_HASH: + return _get_data(p, "aacs_get_bdj_root_cert_hash"); } BD_DEBUG(DBG_BLURAY | DBG_CRIT, "get_aacs_data(): unknown query %d\n", type); diff --git a/src/libbluray/disc/aacs.h b/src/libbluray/disc/aacs.h index 7380a5c..58dd6c6 100644 --- a/src/libbluray/disc/aacs.h +++ b/src/libbluray/disc/aacs.h @@ -47,6 +47,8 @@ BD_PRIVATE int libaacs_get_bec_enabled(BD_AACS *p); #define BD_AACS_DEVICE_BINDING_ID 4 #define BD_AACS_DEVICE_NONCE 5 #define BD_AACS_MEDIA_KEY 6 +#define BD_AACS_CONTENT_CERT_ID 7 +#define BD_AACS_BDJ_ROOT_CERT_HASH 8 BD_PRIVATE const uint8_t *libaacs_get_aacs_data(BD_AACS *p, int type); _______________________________________________ libbluray-devel mailing list libbluray-devel@videolan.org https://mailman.videolan.org/listinfo/libbluray-devel