-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathcss.fs
107 lines (92 loc) · 3.44 KB
/
css.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
\ CSS bindings: use libcss
dos also forth
library libcss libcss.so
legacy off
libcss CSSAuthDisk int int (int) CSSAuthDisk ( fd *key_disk -- r )
libcss CSSAuthTitle int int int (int) CSSAuthTitle ( fd *key_title lba -- r )
libcss CSSGetASF int (int) CSSGetASF ( fd -- r )
libcss CSSDecryptTitleKey int int (int) CSSDecryptTitleKey ( *key_title *key_disk -- r )
libcss CSSDescramble int int (void) CSSDescramble ( *sec *key -- )
\ pack start, header, etc.
base c@ base @ = [IF] \ little endian
$BA010000 Constant pack-start
$BB010000 Constant system-header
$00010000 Constant pes-mark
$00FFFFFF Constant pes-mask
[ELSE]
$000001BA Constant pack-start
$000001BB Constant stystem-header
$00000100 Constant pes-mark
$FFFFFF00 Constant pes-mask
[THEN]
\ Buffers
Create disk_key $800 allot
Create title_key 5 allot
: fill-buffer ( buf-addr u1 file u2 -- ) r/o open-file throw
dup >r read-file r> close-file throw throw drop ;
: >disk_key s" /dev/dvd" r/o open-file throw >r
r@ filehandle @ disk_key CSSAuthDisk drop
r> close-file throw ;
\ disk_key $800 s" disk-key" fill-buffer ;
: >title_key title_key 5 s" title-key" fill-buffer ;
\ un_css
Create sector_buf $800 allot
0 Value fd
0 Value fd-video
0 Value fd-audio
Variable track
Variable do-audio do-audio on
Variable do-video do-video on
: cssfill ( -- $800 ) sector_buf $800 fd read-file throw ;
: pes ( -- addr ) sector_buf #13 + count 7 and + ;
: peslen ( addr -- addr len ) 4+ c@+ c@+ -rot swap 8 << + ;
: hdrlen ( addr -- len ) 2+ c@ 3 + ; macro
: pestype ( addr -- type ) dup @ pes-mask and pes-mark =
IF 3+ c@ ELSE drop -1 THEN ;
: video? ( type -- flag ) $F0 and $E0 = do-video @ and ; macro
: audio? ( type -- flag ) $BD = do-audio @ and ; macro
: skip-sys-hdr ( addr -- addr' )
dup @ system-header = IF peslen + THEN ;
: write-video ( addr u -- ) fd-video write-file throw ;
: write-audio ( addr u -- ) fd-audio write-file throw ;
: descramble ( -- ) sector_buf title_key CSSDescramble ;
: cssdump ( -- )
pes skip-sys-hdr
dup pestype >r peslen over hdrlen /string
r@ video? IF descramble write-video
ELSE
r@ audio? IF
over c@ track @ $80 or =
IF 4 /string descramble write-audio
ELSE 2drop THEN
ELSE 2drop THEN THEN
rdrop ;
: un-css ( -- )
BEGIN cssfill $800 = WHILE sector_buf @ pack-start =
IF cssdump THEN pause
REPEAT ;
: out
do-video @ IF s" /tmp/video" w/o open-file throw to fd-video THEN
do-audio @ IF s" /tmp/audio" w/o open-file throw to fd-audio THEN ;
: vts1 s" /misc/cd/video_ts/vts_01_1.vob" r/o open-file throw to fd ;
: vts2 s" /misc/cd/video_ts/vts_01_2.vob" r/o open-file throw to fd ;
: vts3 s" /misc/cd/video_ts/vts_01_3.vob" r/o open-file throw to fd ;
: vts4 s" /misc/cd/video_ts/vts_01_4.vob" r/o open-file throw to fd ;
: vts5 s" /misc/cd/video_ts/vts_01_5.vob" r/o open-file throw to fd ;
: vts6 s" /misc/cd/video_ts/vts_01_6.vob" r/o open-file throw to fd ;
: vts7 s" /misc/cd/video_ts/vts_01_7.vob" r/o open-file throw to fd ;
: vts8 s" /misc/cd/video_ts/vts_01_8.vob" r/o open-file throw to fd ;
: vts9 s" /misc/cd/video_ts/vts_01_9.vob" r/o open-file throw to fd ;
: css-cat
>disk_key >title_key
title_key disk_key CSSDecryptTitleKey 0< abort" Decrypting title"
out
vts1 un-css
vts2 un-css
vts3 un-css
vts4 un-css
vts5 un-css
vts6 un-css
vts7 un-css
vts8 un-css
vts9 un-css ;