|
;------------------------------------------------------------------------- ERRORLEVEL 0,-302,-305 HOP1 EQU 33H ; 32 BIT HOPCODE REGISTER MASK EQU 40H CNT0 EQU 41H ORG 00H ;------------------------------------------------------------------------- MOVLW 33H MOVLW 5EH MOVLW 0F3H MOVLW 0BBH MOVLW 15H MOVLW 0CCH MOVLW 2AH ; КОДЕР HCS200 ИЗ ЗНАЧЕНИЯ 200404A1 ДЕЛАЕТ 45A181BD ; CALL ROT_R_KEY CALL DECRYPT DECRYPT_OUTER DECRYPT_INNER ; THE LOOKUP TABLE IS COMPRESSED INTO IN 4 BYTES TO SAVE SPACE ROTATE BTFSS HOP2,0 ; SHIFT MASK ANOTHER 2X IF BIT 1 SET BTFSC HOP1,0 ; SHIFT MASK ANOTHER 1X IF BIT 0 SET ; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0 MOVLW 0 ; TABLE INDEX = 0 MOVLW 074H ; BITS 4:3 WERE 01 MOVLW 05CH ; BITS 4:3 WERE 10 MOVLW 03AH ; BITS 4:3 WERE 11 XORWF HOP2,W ; ONLY INTERESTED IN BIT HOP2,7 MOVWF MASK ; STORE W TEMPORARILY (WE NEED BIT 7) ROTATE_CSR ROTATE_KEY DECFSZ CNT0 ; INNER LOOP 48 TIMES DECFSZ CNT1 ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY) RETLW 0 ; RETURN ROT_R_KEY RRF KEY7 RETLW 0 ROT_L_KEY RLF KEY0 RETLW 0 ROT_L_CSR RETLW 0 ROT_R_CSR RETLW 0 ENCR RETLW 0 CHEC
E-mail:
info@telesys.ru
; MICROCHIP KEELOQ DECODER
;-------------------------------------------------------------------------
PROCESSOR PIC12F629
RADIX DEC
include
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF
KEY0 EQU 20H ; 64BIT SHFT REGISTER WITH DECRYPTION KEY
KEY1 EQU 21H
KEY2 EQU 22H
KEY3 EQU 23H
KEY4 EQU 24H
KEY5 EQU 25H
KEY6 EQU 26H
KEY7 EQU 27H
HOP2 EQU 32H
HOP3 EQU 31H
HOP4 EQU 30H
CNT1 EQU 42H
TMP5 EQU 43H
TMP1 EQU 44H
;
; FUNCTION : RESET ()
;
; DESCRIPTION : PROGRAM RESET ROUTINE
;
;-------------------------------------------------------------------------
RESET
MOVLW 00000111B ; SETUP TIMER0 PRESCALER
;|||||||+----
;||||||+----- PSA
;|||||+------
;||||+------- K TMR0
;|||+--------
;||+---------
;|+----------
;+----------- RESIST ON
BSF STATUS,RP0
MOVWF OPTION_REG
BCF STATUS,RP0
;
MAIN
MOVLW 34H
MOVWF KEY0
MOVWF KEY1
MOVWF KEY2
MOVWF KEY3
MOVWF KEY4
MOVWF KEY5
MOVWF KEY6
MOVWF KEY7
; 200404A2 ДЕЛАЕТ 89ECB3AD
; 200404A3 ДЕЛАЕТ 51B39D58
; КОДИРОЮЩИЙ КЛЮЧ ЗАГРУЖЕН В РЕГИСТРЫ LSB 20-27 MSB,
;
; ЧТО НЕОБХОДИМО ИЗМЕНИТЬ В БЛОКЕ DECRYPT ЧТОБЫ ОН ИЗ 200404A1 (ЗАГУЖЕННОГ НИЖЕ)
; ПОЛУЧИТЬ 45A181BD В РЕГ 30-33
CALL ENCR
CLRWDT
GOTO $-2
;-------------------------------------------------------------------------
; FUNCTION : DECRYPT ()
;
; DESCRIPTION : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
;
;
;-------------------------------------------------------------------------
DECRYPT
MOVLW 11+1 ; OUTER LOOP 11+1 TIMES
MOVWF CNT1 ; OUTER LOOP 11+1 TIMES
MOVLW 48 ; INNER LOOP 48 TIMES
MOVWF CNT0 ; INNER LOOP 48 TIMES
CLRWDT ; RESET WATCHDOG TIMER
MOVFW CNT1 ; LAST 48 LOOPS RESTORE THE KEY
XORLW 1 ; LAST 48 LOOPS RESTORE THE KEY
SKPNZ ; LAST 48 LOOPS RESTORE THE KEY
GOTO ROTATE_KEY ; LAST 48 LOOPS RESTORE THE KEY
; 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
CLRC ; CLEAR CARRY (FOR THE LEFT SHIFT)
MOVLW 1 ; INITIALISE MASK = 1
BTFSC HOP3,3 ; SHIFT MASK 4X IF BIT 2 SET
MOVLW 10000B ; SHIFT MASK 4X IF BIT 2 SET
MOVWF MASK ; INITIALISE MASK = 1
GOTO $+3
RLF MASK
RLF MASK
RLF MASK
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
CLRF PCLATH
ADDWF PCL ; ADD THE INDEX TO THE PROGRAM COUNTER
; [ MUST BE IN LOWER HALF OF PAGE ]
TABLECLRF
MOVLW 02EH ; BITS 4:3 WERE 00
GOTO TABLE_END ; END OF LOOKUP
GOTO TABLE_END ; END OF LOOKUP
GOTO TABLE_END ; END OF LOOKUP
TABLE_END
ANDWF MASK ; ISOLATE THE CORRECT BIT
MOVLW 0 ; COPY THE BIT TO BIT 7
SKPZ ; COPY THE BIT TO BIT 7
MOVLW 10000000B ; COPY THE BIT TO BIT 7
XORWF HOP4,W ; ONLY INTERESTED IN BIT HOP4,7
XORWF KEY1,W ; ONLY INTERESTED IN BIT KEYREG1,7
RLF MASK ; LEFT ROTATE MASK TO GET BIT 7 INTO CARRY
CALL ROT_L_CSR
CALL ROT_L_KEY
GOTO DECRYPT_INNER ; INNER LOOP 48 TIMES
GOTO DECRYPT_OUTER ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)
;-------------------------------------------------------------------
RAVNO
CLRWDT
GOTO $-1
CLRC
BTFSC KEY0,0
SETC
RRF KEY6
RRF KEY5
RRF KEY4
RRF KEY3
RRF KEY2
RRF KEY1
RRF KEY0
CLRC
BTFSC KEY7,7
SETC
RLF KEY1
RLF KEY2
RLF KEY3
RLF KEY4
RLF KEY5
RLF KEY6
RLF KEY7
RLF HOP1 ; SHIFT IN THE NEW BIT
RLF HOP2
RLF HOP3
RLF HOP4
RRF HOP4
RRF HOP3
RRF HOP2
RRF HOP1
DECR
MOVLW 0BDH ;ЗАГРУЖЕНО ЗНАЧЕНИЕ MSB 200404A1 LSB ИЗ НЕГО ДОЛЖНО ПОЛУЧИТЬСЯ 45A181BD
MOVWF HOP1 ;ЕСЛИ ЗАГРУЗИТЬ ЗНАЧЕНИЕ 45A181BD ПОЛУЧИТСЯ 200404A1
MOVLW 081H
MOVWF HOP2
MOVLW 0A1H
MOVWF HOP3
MOVLW 045H
MOVWF HOP4
RETLW 0
MOVLW 0A1H ;ЗАГРУЖЕНО ЗНАЧЕНИЕ MSB 200404A1 LSB ИЗ НЕГО ДОЛЖНО ПОЛУЧИТЬСЯ 45A181BD
MOVWF HOP1 ;ЕСЛИ ЗАГРУЗИТЬ ЗНАЧЕНИЕ 45A181BD ПОЛУЧИТСЯ 200404A1
MOVLW 004H
MOVWF HOP2
MOVLW 004H
MOVWF HOP3
MOVLW 020H
MOVWF HOP4
MOVLW 0BDH
XORWF HOP1,W
SKPZ
GOTO ROTATE_KEY
MOVLW 081H
XORWF HOP2,W
SKPZ
GOTO ROTATE_KEY
MOVLW 0A1H
XORWF HOP3,W
SKPZ
GOTO ROTATE_KEY
MOVLW 045H
XORWF HOP4,W
SKPZ
GOTO ROTATE_KEY
GOTO RAVNO
END
Ответы