|
???? 摘要:PIC单片机滚动码的解码程序
#include
;
global DECRYPT
global KEY0,KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7
global CSR0,CSR1,CSR2,CSR3,CSR4,CSR5,CSR6,CSR7,CSR8
;
#define? HOP1 CSR0??? ; ﹚竡 HOP1"4 单 CSR1"4
#define? HOP2 CSR1
#define? HOP3 CSR2
#define? HOP4 CSR3
#define? MAX_CODE_LENGTH .72
#define? CODE_LENGTH .66
;
UDATA_SHR???? ; Difine CSR0:CSR7 ON Share memory
CSR0? res 1????? ; Hopping Code 钡Μ纗既竟 (LSB)
CSR1? res 1
CSR2? res 1
CSR3? res 1
CSR4? res 1
CSR5? res 1
CSR6? res 1
CSR7? res 1
CSR8? res 1????? ; Hopping Code 钡Μ纗既竟 (MSB)
;
Encrypt_Data UDATA 0x20
KEY0? res 1????? ; 64-bit 秆盞じン戈 (LSB)
KEY1? res 1
KEY2? res 1
KEY3? res 1
KEY4? res 1
KEY5? res 1
KEY6? res 1
KEY7? res 1
;
UDATA
CNT0? res 1
CNT1? res 1
HOP_LENGTH res 1
MASK? res 1
KEELOQ_temp res 1
;
;
KEELOQ_CODE CODE
;
;*****************************************************
;**** Rotate CSRs regiSTer right 1 bit
;*****************************************************
ROT_CSRs
RRF? CSR8,F
RRF???? CSR7,F
RRF???? CSR6,F
RRF???? CSR5,F
RRF???? CSR4,F
RRF???? CSR3,F
RRF???? CSR2,F
RRF???? CSR1,F
RRF???? CSR0,F
return
;
;
;
;
;****************************************************************
;
; FUNCTION????? : DECRYPT ()
;
; DESCRIPTION?? : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
;
;****************************************************************
DECRYPT
BANKSEL CNT1
MOVLW?? (.11+1)???????? ; OUTER LOOP 11+1 TIMES
MOVWF?? CNT1?????????? ; OUTER LOOP 11+1 TIMES
DECRYPT_OUTER
MOVLW?? .48???????????? ; INNER LOOP 48 TIMES
MOVWF?? CNT0?????????? ; INNER LOOP 48 TIMES
DECRYPT_INNER
CLRWDT???? ; RESET WATCHDOG TIMER
MOVFW?? CNT1?? ; LAST 48 LOOPS RESTORE THE KEY
XORLW?? .1????????????? ; LAST 48 LOOPS RESTORE THE KEY
btfsc STATUS,Z??????? ; LAST 48 LOOPS RESTORE THE KEY
GOTO??? ROTATE_KEY????? ; LAST 48 LOOPS RESTORE THE KEY
; THE LOOKUP TABLE IS COMPRESSED INTO IN 4 BYTES TO SAVE SPACE
; USE THE 3 LOW INDEX BITS TO MAKE UP AN 8-BIT BIT MASK
; USE THE 2 HIGH INDEX BITS TO LOOK UP THE VALUE IN THE TABLE
; USE THE BIT MASK TO ISOLATE THE CORRECT BIT IN THE BYTE
; PART OF THE REASON FOR THIS SCHEME IS BECAUSE NORMAL TABLE
; LOOKUP REQUIRES AN ADDITIONAL STACK LEVEL
bcf STATUS,C???????? ; CLEAR CARRY (FOR THE LEFT SHIFT)
MOVLW?? .1????????????? ; INITIALISE MASK = 1
BTFSC?? HOP3,3??????? ; SHIFT MASK 4X IF BIT 2 SET
MOVLW?? B'00010000'???? ; SHIFT MASK 4X IF BIT 2 SET
MOVWF?? MASK??????????? ; INITIALISE MASK = 1
BTFSS?? HOP2,0??????? ; SHIFT MASK ANOTHER 2X IF BIT 1 SET
GOTO??? $+3
RLF???? MASK,F
RLF???? MASK,F
BTFSC?? HOP1,0??????? ; SHIFT MASK ANOTHER 1X IF BIT 0 SET
RLF???? MASK,F
; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0
MOVlw HIGH TABLE
MOVwf PCLATH
MOVlw LOW TABLE
MOVwf KEELOQ_Temp
MOVLW?? 0?????????????? ; TABLE INDEX = 0
BTFSC?? HOP4,1
IORLW?? .2????????????? ; IF BIT 3 SET ADD 2 TO THE TABLE INDEX
BTFSC?? HOP4,6
IORLW?? .4????????????? ; IF BIT 4 SET ADD 4 TO THE TABLE INDEX
addwf KEELOQ_Temp,W
btfsc STATUS,C
incf PCLATH,F
MOVwf PCL??????????? ; ADD THE INDEX TO THE PROGRAM COUNTER
;? [ MUST BE IN LOWER HALF OF PAGE ]
TABLE
MOVLW?? 0x2E??????????? ; BITS 4:3 WERE 00
GOTO??? TABLE_END?????? ; END OF LOOKUP
MOVLW?? 0x74??????????? ; BITS 4:3 WERE 01
GOTO??? TABLE_END?????? ; END OF LOOKUP
MOVLW?? 0x5C??????????? ; BITS 4:3 WERE 10
GOTO??? TABLE_END?????? ; END OF LOOKUP
MOVLW?? 0x3A??????????? ; BITS 4:3 WERE 11
TABLE_END
ANDWF?? MASK,1????????? ; ISOLATE THE CORRECT BIT
MOVLW?? 0?????????????? ; COPY THE BIT TO BIT 7
btfss STATUS,Z??????? ; COPY THE BIT TO BIT 7
MOVLW?? B'10000000'???? ; COPY THE BIT TO BIT 7
XORWF?? HOP2,W????? ; ONLY INTERESTED IN BIT HOP2,7
XORWF?? HOP4,W????? ; ONLY INTERESTED IN BIT HOP4,7
XORWF?? KEY1,W?? ; ONLY INTERESTED IN BIT KEYREG1,7
MOVWF?? MASK??????????? ; STORE W TEMPORARILY (WE NEED BIT 7)
RLF???? MASK,F????????? ; LEFT ROTATE MASK TO GET BIT 7 INTO CARRY
RLF???? HOP1,F????????? ; SHIFT IN THE NEW BIT
RLF???? HOP2,F
RLF???? HOP3,F
RLF???? HOP4,F
ROTATE_KEY
bcf STATUS,C?? ; CLEAR CARRY
BTFSC?? KEY7,7??????? ; SET CARRY IF LEFTMOST BIT SET
bsf STATUS,C???????? ; SET CARRY IF LEFTMOST BIT SET
RLF???? KEY0,F????????? ; LEFT-ROTATE THE 64-BIT KEY
RLF???? KEY1,F
RLF???? KEY2,F
RLF???? KEY3,F
RLF???? KEY4,F
RLF???? KEY5,F
RLF???? KEY6,F
RLF???? KEY7,F
DECFSZ? CNT0,F????????? ; INNER LOOP 48 TIMES
GOTO??? DECRYPT_INNER?? ; INNER LOOP 48 TIMES
DECFSZ? CNT1,F????????? ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)
GOTO??? DECRYPT_OUTER?? ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)
RETLW?? 0?????????????? ; RETURN
?
|
|