Демо прога
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Alexandr 04 января 2004 г. 01:33
В ответ на: Кто знает алгоритм кодировки KeeLoq (то что в HCS200) отправлено Alexandr 04 января 2004 г. 01:19

;-------------------------------------------------------------------------
; MICROCHIP KEELOQ DECODER
;-------------------------------------------------------------------------
PROCESSOR PIC12F629
RADIX DEC
include
__CONFIG _XT_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF

ERRORLEVEL 0,-302,-305


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

HOP1 EQU 33H ; 32 BIT HOPCODE REGISTER
HOP2 EQU 32H
HOP3 EQU 31H
HOP4 EQU 30H

MASK EQU 40H

CNT0 EQU 41H
CNT1 EQU 42H
TMP5 EQU 43H


ORG 00H

;-------------------------------------------------------------------------
;
; 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

MOVLW 33H
MOVWF KEY1

MOVLW 5EH
MOVWF KEY2

MOVLW 0F3H
MOVWF KEY3

MOVLW 0BBH
MOVWF KEY4

MOVLW 15H
MOVWF KEY5

MOVLW 0CCH
MOVWF KEY6

MOVLW 2AH
MOVWF KEY7

; КОДЕР HCS200 ИЗ ЗНАЧЕНИЯ 200404A1 ДЕЛАЕТ 45A181BD
; 200404A2 ДЕЛАЕТ 89ECB3AD
; 200404A3 ДЕЛАЕТ 51B39D58
; КОДИРОЮЩИЙ КЛЮЧ ЗАГРУЖЕН В РЕГИСТРЫ 20-27,
;
; ЧТО НЕОБХОДИМО ИЗМЕНИТЬ В БЛОКЕ DECRYPT ЧТОБЫ ОН ИЗ 200404A1 (ЗАГУЖЕННОГ НИЖЕ)
; ПОЛУЧИТЬ 45A181BD В РЕГ 30-33


MOVLW 0A1H ;ЗАГРУЖЕНО ЗНАЧЕНИЕ MSB 200404A1 LSB ИЗ НЕГО ДОЛЖНО ПОЛУЧИТЬСЯ 45A181BD
MOVWF HOP1 ;ЕСЛИ ЗАГРУЗИТЬ ЗНАЧЕНИЕ 45A181BD ПОЛУЧИТСЯ 200404A1
MOVLW 04H
MOVWF HOP2
MOVLW 04H
MOVWF HOP3
MOVLW 20H
MOVWF HOP4

CALL DECRYPT


GOTO $-1


;-------------------------------------------------------------------------
; 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

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
SKPNZ ; 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


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

BTFSS HOP2,0 ; SHIFT MASK ANOTHER 2X IF BIT 1 SET
GOTO $+3
RLF MASK
RLF MASK

BTFSC HOP1,0 ; SHIFT MASK ANOTHER 1X IF BIT 0 SET
RLF MASK

; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0

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
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

MOVLW 074H ; BITS 4:3 WERE 01
GOTO TABLE_END ; END OF LOOKUP

MOVLW 05CH ; BITS 4:3 WERE 10
GOTO TABLE_END ; END OF LOOKUP

MOVLW 03AH ; BITS 4:3 WERE 11

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 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 ; LEFT ROTATE MASK TO GET BIT 7 INTO CARRY

RLF HOP1 ; SHIFT IN THE NEW BIT
RLF HOP2
RLF HOP3
RLF HOP4

ROTATE_KEY
CLRC ; CLEAR CARRY
BTFSC KEY7,7 ; SET CARRY IF LEFTMOST BIT SET
SETC ; SET CARRY IF LEFTMOST BIT SET

RLF KEY0 ; LEFT-ROTATE THE 64-BIT KEY
RLF KEY1
RLF KEY2
RLF KEY3
RLF KEY4
RLF KEY5
RLF KEY6
RLF KEY7

DECFSZ CNT0 ; INNER LOOP 48 TIMES
GOTO DECRYPT_INNER ; INNER LOOP 48 TIMES

DECFSZ CNT1 ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)
GOTO DECRYPT_OUTER ; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)

RETLW 0 ; RETURN
;-------------------------------------------------------------------


END

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru