492
|
1 /* (C)2001 by LGB (Gabor Lenart), based on example programs in libcss
|
|
2 Some TODO: root privilegies really needed?? */
|
|
3
|
|
4 /* don't do anything with this source if css support was not requested */
|
|
5 #include "config.h"
|
|
6 #ifdef HAVE_LIBCSS
|
|
7
|
|
8 #include <stdio.h>
|
|
9 #include <stdlib.h>
|
|
10 #include <linux/cdrom.h>
|
|
11 // FIXME #include <string.h> conflicts with #include <linux/fs.h> (below)
|
|
12 //#include <string.h> // FIXME this conflicts with #include <linux/fs.h>
|
|
13 #include <unistd.h>
|
|
14 #include <fcntl.h>
|
|
15 #include <sys/types.h>
|
|
16 #include <sys/ioctl.h>
|
|
17 #include <sys/stat.h>
|
|
18
|
|
19 #include <css.h>
|
|
20
|
|
21 #include "dvdauth.h"
|
|
22
|
|
23 char *dvd_device=NULL;
|
|
24 unsigned char key_disc[2048];
|
|
25 unsigned char key_title[5];
|
|
26
|
|
27
|
|
28 #include <linux/fs.h>
|
|
29
|
|
30 #ifndef FIBMAP
|
|
31 #define FIBMAP 1
|
|
32 #endif
|
|
33
|
|
34
|
|
35 static int path_to_lba ( int fd )
|
|
36 {
|
|
37 int lba = 0;
|
|
38 if (ioctl(fd, FIBMAP, &lba) < 0) {
|
|
39 perror ("ioctl FIBMAP");
|
|
40 fprintf(stderr,"Hint: run mplayer as root!\n");
|
|
41 // close(fd);
|
|
42 return -1;
|
|
43 }
|
|
44 return lba;
|
|
45 }
|
|
46
|
|
47
|
|
48
|
|
49 static void reset_agids ( int fd )
|
|
50 {
|
|
51 dvd_authinfo ai;
|
|
52 int i;
|
|
53 for (i = 0; i < 4; i++) {
|
|
54 memset(&ai, 0, sizeof(ai));
|
|
55 ai.type = DVD_INVALIDATE_AGID;
|
|
56 ai.lsa.agid = i;
|
|
57 ioctl(fd, DVD_AUTH, &ai);
|
|
58 }
|
|
59 }
|
|
60
|
|
61
|
|
62
|
|
63 int dvd_auth ( char *dev , int fd )
|
|
64 {
|
|
65 int devfd; /* FD of DVD device */
|
|
66 int lba;
|
|
67
|
|
68 // printf("DVD: auth fd=%d on %s.\n",fd,dev);
|
|
69
|
|
70 if ((devfd=open(dev,O_RDONLY))<0) {
|
|
71 fprintf(stderr,"DVD: cannot open DVD device \"%s\".\n",dev);
|
|
72 return 1;
|
|
73 }
|
|
74
|
|
75 /* reset AGIDs */
|
|
76 reset_agids(devfd);
|
|
77
|
|
78 /* authenticate disc */
|
|
79 if (CSSAuthDisc(devfd,key_disc)) {
|
|
80 fprintf(stderr,"DVD: CSSAuthDisc() failed.\n");
|
|
81 return 1;
|
|
82 }
|
|
83
|
|
84 /* authenticate title */
|
|
85 lba=path_to_lba(fd);
|
|
86 if (lba==-1) {
|
|
87 fprintf(stderr,"DVD: path_to_lba() failed.\n");
|
|
88 return 1;
|
|
89 }
|
|
90 if (CSSAuthTitle(devfd,key_title,lba)) {
|
|
91 fprintf(stderr,"DVD: CSSAuthTitle() failed.\n");
|
|
92 return 1;
|
|
93 }
|
|
94
|
|
95 /* decrypting title */
|
|
96 if (CSSDecryptTitleKey (key_title, key_disc) < 0) {
|
|
97 fprintf(stderr,"DVD: CSSDecryptTitleKey() failed.\n");
|
|
98 return 1;
|
|
99 }
|
|
100
|
|
101 close(devfd);
|
|
102 return 0;
|
|
103 }
|
|
104
|
|
105
|
|
106 #endif
|