📄 cpyp.s
字号:
.nolist
#include "regdef.h"
#include "cpyp.h"
#include "user.h"
#include "ac3_mac.h"
#include "globalv.h"
.text
.list
.globl SUB_Drv_Auth
.globl SUB_Dec_Auth
.globl SUB_Key_Share
.globl SUB_Disc_Key
.globl SUB_Title_Key
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
; Module: SUB_Title_Key
;
; Initial version: KWEN 4/24/96
;
; Calling : SUB_Bus_Dec, SUB_DecDK
; Called by: exective
; Return: r26, dk_0(4 bytes, r20), dk_1(1 byte, r21)
; Param in: DK(LWdisckey, 5 bytes), TK(Drv_RD, 5 bytes)
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_Title_Key:
movw r0,LWdisckey0 // Disc key
movw LBpbyte0,r0
movb r0,LBdisckey4
movb LBpbyte4,r0
Lstart_TK:
dlw r0,Drv_RD // EncTK
dlb r2,Drv_RD+4
// movw r1,LWbuskey0
// movb r3,LBbuskey4
//#ifndef PLAYER
movb r4,LBDriver
tsti r4,0
beq skip_bus_key_load
dlw r1,BUS_KEY0
dlb r3,BUS_KEY4
xor r0,r1
xor r2,r3
skip_bus_key_load:
//#endif
movw LBekbyte0,r0
movb LBekbyte4,r2
movi r23, 1 ; in: LSW
jsr r27,SUB_DecDK //
movw LWtitlekey0,r20
dsw r20,Drv_RD
rswi r20,0x3c>>2
movb LBtitlekey4,r21
dsb r21,Drv_RD+4
rswi r21,0x38>>2
j r26 // return
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
; Module: SUB_Disc_Key
;
; Initial version: KWEN 4/23/96
;
; Calling : none
; Called by: exective
; Return: r26, dk_0(4 bytes, r20), dk_1(1 byte, r21)
; Param in: MA(5 bytes), MB(5 bytes)
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_Disc_Key:
movi r7,1 // execute twice for A and B
mupi r0,MA2 // MKiA
ori r0,MA0
movw LBpbyte0,r0
movi r0,MA4
movb LBpbyte4,r0
Lstart_DK:
dlw r0,ENC_KEYNUM // EncDK
dlb r2,ENC_KEYNUM4
//#ifdef PLAYER
movw LBekbyte0,r0
movb LBekbyte4,r2
//#else
movb r4,LBDriver
tsti r4,0
beq load_buskey
jsr r27,SUB_Bus_Dec
load_buskey:
//#endif
movi r23, 0 ; in: LSW
jsr r27,SUB_DecDK // 1'st
movw LWdka0,r20 // put it aside for compare later
movw LBpbyte0,r20 // DKA
movb LBdka4,r21
movb LBpbyte4,r21
dlw r0,REF_KEYNUM // EncDK
dlb r2,REF_KEYNUM4
//#ifdef PLAYER
movw LBekbyte0,r0
movb LBekbyte4,r2
//#else
movb r4,LBDriver
tsti r4,0
beq skip_buskey_again
jsr r27,SUB_Bus_Dec
skip_buskey_again:
//#endif
movi r23, 0 ; in: LSW
jsr r27,SUB_DecDK // 2'nd
movw r0,LWdka0
tst r0,r20 // check if DKA==DKA'
bne LcheckB
movb r0,LBdka4
tst r0,r21
bne LcheckB
dsw r20,Drv_RD
dsb r21,Drv_RD+4
movw LWdisckey0,r20
movb LBdisckey4,r21
movi r20,1
dsb r20,Drv_acc
j r26 // return
LcheckB:
tsti r7,0
beq Lfail_DK
movi r7,0
mupi r0,MB2 // MKiA
ori r0,MB0
movw LBpbyte0,r0
movi r0,MB4
movb LBpbyte4,r0
j Lstart_DK
Lfail_DK:
movi r20,0
dsb r20,Drv_acc
j r26 // return
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
; Module: SUB_Bus_Dec
;
; Initial version: KWEN 4/23/96
;
; Calling : none
; Called by: exective
; Return: r27, LBekbyte0(4 bytes, r1), LBekbyte4(1 byte, r3)
; Param in: r0(key num low, 4 bytes), r2(keynum high), buskey
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_Bus_Dec:
movi r6,0xff
// movw r1,LWbuskey0
// movb r3,LBbuskey4
dlw r1,BUS_KEY0
dlb r3,BUS_KEY4
and r5,r0,r6 // Enc[0]
xor r3,r5 // Enc[0]^BK[4]
movb LBekbyte4,r3
xor r1,r2 // Enc[4]^BK[0]
shl r6,8
and r5,r0,r6 // get Enc[1]
shl r5,16
xor r1,r5 // Enc[1]^BK[3]
shl r6,8
and r5,r0,r6
xor r1,r5 // Enc[2]^BK[2]
shl r6,8
and r5,r0,r6
shr r5,16
xor r1,r5 // Enc[3]^BK[1]
movw LBekbyte0,r1
j r27 // return
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;
;
; Module: SUB_DecDK
;
; Initial version:Jinshi Huang 4/23/96
;
; Calling : none
; Called by: exective
; Return: r27, dk_0(4 bytes, r20), dk_1(1 byte, r21)
; Param in: r23, LSW, edk(5 bytes), mk(5 bytes)
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_DecDK:
//------------------------------------------------------------
//input r25(byte count), r24(LBp_byte), r22(USW), r23(LSW)
//output AGRAdr3 (LBipbyte0-4)
movi r22, 0 ; in: USW
movi r24, LBp_byte ; in:
movi r25, 5 ; in: byte count
movi AGRAdr3, LBik_byte+4 ; out: starts from last byte
movi AGRSiz3, 0xffff ; linear
jsr r28, SUB_DK_Scheduler
jsr r28, SUB_IDK_Substitutor
j r27
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;
;
; Module: SUB_IDK_Substitutor
;
; Initial version:Jinshi Huang 4/7/96
;
; Calling : none
; Called by: exective
; Return: r28, dk_1, dk_0
; Param in: LBekbytes0-4, LBikbyte0-4
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_IDK_Substitutor: //(BYTE *ekBYTE *ik,BYTE *z)
// input LBekbyte0-4, LBikbyte0-4
// output dk_1, dk_0
//---------------- read in tables----------------------------
movi BlockSkip, 0
movi BlockSize, 31
movi DMASize, 31 ;read 32 words
movi r1, LBADec_Tab_word
movi r15, BADec_Tab
shr r15, 2 ;to word addr
loop 2, read_Dec_Tab ;total = 64 words = 256 bytes
mov LocalAddr, r1
dmarr r15
WaitDma
addi r15, 32
addi r1, 32
read_Dec_Tab:
movi r1, LBAInv_Tab_word
movi r15, BAInv_Tab
shr r15, 2 ;to word addr
loop 2, Lread_Inv_Tab ;total = 64 words = 256 bytes
mov LocalAddr, r1
dmarr r15
WaitDma
addi r15, 32
addi r1, 32
Lread_Inv_Tab:
//------------------------- first stage -----------------------
movi AGRSiz0, 0xffff //linear
movi AGRAdr0, LAx_byte //5 words
movi r0, LBek_byte
movi r1, LBik_byte
loop 5, stage_1_loop_a
movb r2, l0 //r2=ek[j]
addi r2, LBADec_Tab_byte
movb r3, l1 //r3=ik[j]
addi r3, LBAInv_Tab_byte
movb r4, l2 //r4=Dec_Tab[ek[j]]
movb r5, l3 //r5=Inv_Tab[ik[j]]
xor a0(1*4), r4, r5 //x[j]= ...
addi r0, 1 //inc byte pointers
addi r1, 1
stage_1_loop_a:
movi r0, LBek_byte+4
movi AGRSiz1, 0xffff //linear
movi AGRAdr1, LAy_byte+3*4 //5 words
movi AGRAdr0, LAx_byte+3*4
loop 4, stage_1_loop_b //y[3]..y[0]
movb r2, l0 //r2=ek[j+1]
mov r3, a0(-1*4) //x[j]
subi r0, 1 //dec byte pointer
xor a1(-1*4), r2, r3 //y[j]=x[j] ^ ek[j+1]
stage_1_loop_b:
movi AGRAdr1, LAy_byte+4*4
movi AGRAdr0, LAx_byte+4*4
xor r4, r2, r3 //y[0]
mov r3, a0(0) //x[4]
xor a1(0), r3, r4 //y[4]=x[4] ^ y[0]
//---------------------- 2nd stage-----------------------------
movi AGRAdr0, LAx_byte //5 words
movi AGRAdr1, LAy_byte
movi r1, LBik_byte
loop 5, stage_2_loop_a
mov r2, a1(1*4) //r2=y[j]
addi r2, LBADec_Tab_byte
movb r3, l1 //r3=ik[j]
addi r3, LBAInv_Tab_byte
movb r4, l2 //r4=Dec_Tab[y[j]]
movb r5, l3 //r5=Inv_Tab[ik[j]]
xor a0(1*4), r4, r5 //x[j]= ...
addi r1, 1 //inc byte pointers
stage_2_loop_a:
movi AGRAdr0, LAx_byte+4*4
nop
mov r21, a0(-1*4) //z[4]=x[4]
// dsb r21, dk_1 //to DRAM
movi AGRAdr1, LAy_byte+4*4
movi r20, 0
loop 4, stage_2_loop_b //z[3]..z[0]
mov r2, a1(-1*4) //r2=y[j+1]
shl r20, 8
xor r2, a0(-1*4) //y[j]=x[j] ^ y[j+1]
or r20, r2
stage_2_loop_b:
// dsw r20, dk_0 //to DRAM
j r28 //return
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;
;
; Module: Key_Share
;
; Initial version:Jinshi Huang 4/17/97
;
; Calling : SUB_Auth_Scheduler, SUB_Auth_Substitutor
; Called by:
; Return: r27, Bk
; Param in: CRD, acc, AuthKey
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_Key_Share:
//Key_Byte_Perm
movb r0, LBCRDbyte9
movb LBpcdbyte9, r0
movb r0, LBCRDbyte1
movb LBpcdbyte8, r0
movb r0, LBCRDbyte6
movb LBpcdbyte7, r0
movb r0, LBCRDbyte8
movb LBpcdbyte6, r0
movb r0, LBCRDbyte2
movb LBpcdbyte5, r0
movb r0, LBCRDbyte7
movb LBpcdbyte4, r0
movb r0, LBCRDbyte5
movb LBpcdbyte3, r0
movb r0, LBCRDbyte3
movb LBpcdbyte2, r0
movb r0, LBCRDbyte0
movb LBpcdbyte1, r0
movb r0, LBCRDbyte4
movb LBpcdbyte0, r0
//Key_Bit_Perm
movb r0, LBacc
xori r1, r0, 0x000c ;negate bits 3, 2
andi r2, r0, 0x0001
andi r3, r0, 0x0002
andi r4, r1, 0x0004
andi r5, r1, 0x0008
andi r6, r0, 0x0010
shl r10, r2, 3
shl r3, 1
shl r4, 2
shr r5, 2
shr r6, 4
or r10, r3
or r10, r4
or r10, r5
or r10, r6
movb LBpaccbyte0, r10
// generate eak
dlw r0, AuthKey
movw r1, LBpcdbyte5 ; get 7 6 5 4
shr r1, 8 ; align as x 7 6 5
movw r2, LBpcdbyte8 ; get 11 10 9 8
shl r2, 24 ; align as 8 x x x
or r1, r2 ; now 8 7 6 5
xor r0, r1
movw LBeakbyte0, r0 ;eak[31:0]
dlb r0, AuthKey+4
movb r1, LBpcdbyte9
xor r0, r1
movb LBeakbyte4, r0 ;eak[39:32]
// call main routines
movi r22, 1 ;input: USW
movi r23, 1 ;input: LSW
movi r24, LBeak_byte ;input: LBp_byte
movi r25, 30 ;input: byte count
movi AGRAdr3, LBiak_byte+29 ;output: start from last byte
jsr r28, SUB_Auth_Scheduler
movb r22, LBpaccbyte0 ;in: pacc
movi AGRAdr4, LBk_byte ;out: LBk_lo, _hi
jsr r28, SUB_Auth_Substitutor
dsw r12, Drv_RD ; lo
dsb r11, Drv_RD+4 ; hi
// movw LWbuskey0,r12
// movb LBbuskey4,r11
dsw r12,BUS_KEY0
dsb r11,BUS_KEY4
j r27 //return
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;
;
; Module: Dec_Auth
;
; Initial version:Jinshi Huang 4/14/97
;
; Calling : SUB_Auth_Scheduler, SUB_Auth_Substitutor
; Called by:
; Return: r27, RD
; Param in: Drv_CD, acc, AuthKey
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_Dec_Auth:
//Dec_Byte_Perm
//share same locations with Drv_Auth
movi DcacheBase,MEM_SEG
dlb r0, Drv_CD+2
movi AGRSiz0, 0xffff
movb LBpcdbyte9, r0
dlb r0, Drv_CD+0
movi AGRSiz1, 0xffff
movb LBpcdbyte8, r0
dlb r0, Drv_CD+4
movi AGRSiz2, 0xffff
movb LBpcdbyte7, r0
dlb r0, Drv_CD+7
movi AGRSiz3, 0xffff
movb LBpcdbyte6, r0
dlb r0, Drv_CD+5
movi StartAddrHigh,MEM_SEG
movb LBpcdbyte5, r0
dlb r0, Drv_CD+8
nop
movb LBpcdbyte4, r0
dlb r0, Drv_CD+3
nop
movb LBpcdbyte3, r0
dlb r0, Drv_CD+9
nop
movb LBpcdbyte2, r0
dlb r0, Drv_CD+1
nop
movb LBpcdbyte1, r0
dlb r0, Drv_CD+6
nop
movb LBpcdbyte0, r0
//Dec_Bit_Perm
movb r0, LBacc
xori r1, r0, 0x0011 ;negate bits 4, 0
andi r2, r1, 0x0001
andi r3, r0, 0x0002
andi r4, r0, 0x0004
andi r5, r0, 0x0008
andi r6, r1, 0x0010
shl r10, r2, 1
shl r3, 1
shr r4, 2
shl r5, 1
shr r6, 1
or r10, r3
or r10, r4
or r10, r5
or r10, r6
movb LBpaccbyte0, r10
// generate eak
dlw r0, AuthKey
movw r1, LBpcdbyte5 ; get 7 6 5 4
shr r1, 8 ; align as x 7 6 5
movw r2, LBpcdbyte8 ; get 11 10 9 8
shl r2, 24 ; align as 8 x x x
or r1, r2 ; now 8 7 6 5
xor r0, r1
movw LBeakbyte0, r0 ;eak[31:0]
dlb r0, AuthKey+4
movb r1, LBpcdbyte9
xor r0, r1
movb LBeakbyte4, r0 ;eak[39:32]
// call main routines
movi r22, 1 ;input: USW
movi r23, 1 ;input: LSW
movi r24, LBeak_byte ;input: LBp_byte
movi r25, 30 ;input: byte count
movi AGRAdr3, LBiak_byte+29 ;output: start from last byte
jsr r28, SUB_Auth_Scheduler
movb r22, LBpaccbyte0 ;in: pacc
movi AGRAdr4, LRD_byte ;out: LRD_lo, _hi
jsr r28, SUB_Auth_Substitutor
dsw r12, Drv_RD ; lo
dsb r11, Drv_RD+4 ; hi
shl r22,r12,8 // prepare for key sharing
movb r23,LBCRDbyte4
or r22,r23
movw LBCRDbyte4,r22
shr r22,r12,24
shl r11,8
or r22,r11
movh LBCRDbyte8,r22
j r27 //return
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;
;
; Module: Drv_Auth
;
; Initial version:Jinshi Huang 4/14/97
;
; Calling : SUB_Auth_Scheduler, SUB_Auth_Substitutor
; Called by:
; Return: r27, Drv_acc
; Param in: Drv_CD, Drv_RD, AuthKey
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_Drv_Auth:
//Drv_Byte_Perm
movi DcacheBase,MEM_SEG
dlb r0, Drv_CD+8
movi AGRSiz0, 0xffff
movb LBpcdbyte9, r0
dlb r0, Drv_CD+4
movi AGRSiz1, 0xffff
movb LBpcdbyte8, r0
dlb r0, Drv_CD+6
movi AGRSiz2, 0xffff
movb LBpcdbyte7, r0
dlb r0, Drv_CD+9
movi AGRSiz3, 0xffff
movb LBpcdbyte6, r0
dlb r0, Drv_CD+2
movi StartAddrHigh,MEM_SEG
movb LBpcdbyte5, r0
dlb r0, Drv_CD+5
nop
movb LBpcdbyte4, r0
dlb r0, Drv_CD+7
nop
movb LBpcdbyte3, r0
dlb r0, Drv_CD+0
nop
movb LBpcdbyte2, r0
dlb r0, Drv_CD+3
nop
movb LBpcdbyte1, r0
dlb r0, Drv_CD+1
nop
movb LBpcdbyte0, r0
// generate eak
dlw r0, AuthKey
movw r1, LBpcdbyte5 ; get 7 6 5 4
shr r1, 8 ; align as x 7 6 5
movw r2, LBpcdbyte8 ; get 11 10 9 8
shl r2, 24 ; align as 8 x x x
or r1, r2 ; now 8 7 6 5
xor r0, r1
movw LBeakbyte0, r0 ;eak[31:0]
dlb r0, AuthKey+4
movb r1, LBpcdbyte9
xor r0, r1
movb LBeakbyte4, r0 ;eak[39:32]
// call main routines
movi r22, 1 ;input: USW
movi r23, 1 ;input: LSW
movi r24, LBeak_byte ;input: LBp_byte
movi r25, 30 ;input: byte count
movi AGRAdr3, LBiak_byte+29 ;output: start from last byte
jsr r28, SUB_Auth_Scheduler
movi r25, 0 ; as loop counter
dlw r24, Drv_RD ; lo
dlb r23, Drv_RD+4 ; hi
start_Drv_Sub_loop:
mov r22, r25 ;in: count as pacc
movi AGRAdr4, LBDrv_RD_byte ;out: r12(LRD_lo), r11(LRD_hi)
jsr r28, SUB_Auth_Substitutor
tst r12, r24 ; compare lo
bne continue_search
tst r11, r23 ; compare hi
beq acc_found
continue_search:
addi r25, 1
tsti r25, 32
blt start_Drv_Sub_loop
movi r25,0 // not found
dsb r25, Drv_acc
j r27
acc_found:
movw LBCRDbyte0,r12
movb LBCRDbyte4,r11
movb LBacc,r25
movi r25,1
dsb r25, Drv_acc
j r27 //return
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;
;
; Module: SUB_DK_Scheduler
; SUB_Auth_Scheduler
;
; Initial version:Jinshi Huang 4/7/96
;
; Calling : none
; Called by: exective
; Return: r28, samples
; Param in: r24(LBpbyte), r22(USW), r23(LSW)
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
SUB_Auth_Scheduler:
SUB_DK_Scheduler: //(BYTE *p,BYTE *ip)
//input r25(byte count), r24(LBp_byte), r22(USW), r23(LSW)
//output AGRAdr3 (LBipbyte0-4)
// -------------------read input --------------------------
// movi r0, LBp_byte
mov r0, r24
addi r0, 3
nop
movb r10, l0 //p[3]
addi r0, 1
shl r10, 9
movb r9, l0 //p[4]
or r10, r9 //p[4] | p[3]<<9
subi r0, 2
ori r10, 0x100 // | 0x100. r10=u_lfsr
movb r11, l0 //p[2]
andi r12, r11, 0xf8
shl r12, 1 //(p[2] & 0xf8)<<1
andi r11, 0x7 //p[2]&0x7
or r12, r11
subi r0, 2
ori r12, 0x8 // | 0x8
movb r11, l0 //p[0]
addi r0, 1
shl r11, 17 //p[0]<<17
or r12, r11
movb r11, l0 //p[1]
shl r11, 9 //p[1]<<9
or r12, r11 //r12=l_lfsr
movi r13, 0 //r13=diff
//--------------------- byte4=r21(7:0)--------------------------
andi r6, r25, 0x0003 //left over bytes from full words
movi r21, 0 //init curbyte
loop r6, left_over_loop
loop 8, inner_loop_0 //byte 4
shr r15, r10, 16 //upper part
shr r16, r10, 2
xor r15, r16
andi r15, 0x01 //r15=upper out
shl r10, 1 //u_lfsr<<1
or r10, r15
xor r15, r22 //a=upper out ^ USW
shr r16, r12, 24 //lower part
shr r17, r12, 21
shr r18, r12, 20
shr r19, r12, 12
xor r16, r17
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -