summaryrefslogtreecommitdiffstats
path: root/dvdauth.c
diff options
context:
space:
mode:
authorlgb <lgb@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-04-17 22:04:44 +0000
committerlgb <lgb@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-04-17 22:04:44 +0000
commit247b44e482927b578d26fd0b75b89ef8fc383ec2 (patch)
treecc979d90c402ddb2b2a90c0b9a2ef35a599767c7 /dvdauth.c
parente35f1762a1d34472259cb3e9d62d4b426e1d1211 (diff)
downloadmpv-247b44e482927b578d26fd0b75b89ef8fc383ec2.tar.bz2
mpv-247b44e482927b578d26fd0b75b89ef8fc383ec2.tar.xz
preliminary DVD support using libcss
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@493 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'dvdauth.c')
-rw-r--r--dvdauth.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/dvdauth.c b/dvdauth.c
new file mode 100644
index 0000000000..da6832c58a
--- /dev/null
+++ b/dvdauth.c
@@ -0,0 +1,106 @@
+/* (C)2001 by LGB (Gabor Lenart), based on example programs in libcss
+ Some TODO: root privilegies really needed?? */
+
+/* don't do anything with this source if css support was not requested */
+#include "config.h"
+#ifdef HAVE_LIBCSS
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <linux/cdrom.h>
+// FIXME #include <string.h> conflicts with #include <linux/fs.h> (below)
+//#include <string.h> // FIXME this conflicts with #include <linux/fs.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+
+#include <css.h>
+
+#include "dvdauth.h"
+
+char *dvd_device=NULL;
+unsigned char key_disc[2048];
+unsigned char key_title[5];
+
+
+#include <linux/fs.h>
+
+#ifndef FIBMAP
+#define FIBMAP 1
+#endif
+
+
+static int path_to_lba ( int fd )
+{
+ int lba = 0;
+ if (ioctl(fd, FIBMAP, &lba) < 0) {
+ perror ("ioctl FIBMAP");
+ fprintf(stderr,"Hint: run mplayer as root!\n");
+// close(fd);
+ return -1;
+ }
+ return lba;
+}
+
+
+
+static void reset_agids ( int fd )
+{
+ dvd_authinfo ai;
+ int i;
+ for (i = 0; i < 4; i++) {
+ memset(&ai, 0, sizeof(ai));
+ ai.type = DVD_INVALIDATE_AGID;
+ ai.lsa.agid = i;
+ ioctl(fd, DVD_AUTH, &ai);
+ }
+}
+
+
+
+int dvd_auth ( char *dev , int fd )
+{
+ int devfd; /* FD of DVD device */
+ int lba;
+
+// printf("DVD: auth fd=%d on %s.\n",fd,dev);
+
+ if ((devfd=open(dev,O_RDONLY))<0) {
+ fprintf(stderr,"DVD: cannot open DVD device \"%s\".\n",dev);
+ return 1;
+ }
+
+ /* reset AGIDs */
+ reset_agids(devfd);
+
+ /* authenticate disc */
+ if (CSSAuthDisc(devfd,key_disc)) {
+ fprintf(stderr,"DVD: CSSAuthDisc() failed.\n");
+ return 1;
+ }
+
+ /* authenticate title */
+ lba=path_to_lba(fd);
+ if (lba==-1) {
+ fprintf(stderr,"DVD: path_to_lba() failed.\n");
+ return 1;
+ }
+ if (CSSAuthTitle(devfd,key_title,lba)) {
+ fprintf(stderr,"DVD: CSSAuthTitle() failed.\n");
+ return 1;
+ }
+
+ /* decrypting title */
+ if (CSSDecryptTitleKey (key_title, key_disc) < 0) {
+ fprintf(stderr,"DVD: CSSDecryptTitleKey() failed.\n");
+ return 1;
+ }
+
+ close(devfd);
+ return 0;
+}
+
+
+#endif