📄 des.asm
字号:
;****************************************************************************
; void DES(char mode, char data *text,char xdata *key)
; R7, R5, R2,R3
; MOV R7,A
; MOV R5,#LOW text?12
; MOV R2,#HIGH key
; MOV R3,#LOW key
; LCALL _DES
;****************************************************************************
;extrn IData (CalcArea)
extrn Data (BM0)
extrn Data (BM1)
extrn Data (BM2)
extrn Data (BM3)
extrn Data (BM4)
extrn Data (BM5)
extrn Data (BM6)
extrn Data (BM7)
public _DES
;**** Definitions ****
Decode equ Acc.5 ;Decode-/Encode~-Flag
MAC equ Acc.4 ;MAC-Flag
DES_Proc segment code
?ID?XADES SEGMENT IDATA
R2MAC: ;Error messages
LenErr:
ModeErr:
rseg ?ID?XADES
CalcArea: DS 16
rseg DES_Proc
_DES:
Mov A, R7
Xch A, R5
Mov R7,#08h
Xch A, R1
;********** Function DES **********
;R0 O Pointer, general purpose, output = R1+R7 (BuildMac)
;R1 I/O Pointer to 8-byte input data, output = R2+8
;R2 Pointer to 8-byte working area for D-, C-Values
;R3 O RoundCounter, output = 8
;R4 Counter, general purpose
;R5 I, u Parameter P2 of APDU
; b7b6
; 0 0 ECB
; 0 1 CBC
; 1 x reserved
; b5
; 0 encrypt
; 1 decrypt
; b4
; 1 build MAC
;R6 InputPointer
;R7 I ByteCount
;B TestRegister for Shift1Test of D-, C-Values
;Dptr I u Pointer to 64/56-bit DES-Key in TLV-Format
;Carry O 0 = Normal Termination
;Abbreviations: I = Input, O = Output, u = unchanged
;Two Stack-Entries neccessary
;Key format: sequence of TLV records
; 1st record: key handling information
; 2nd record: DES key
; 3rd record: initial value (optional)
Mov A, R5 ;Mode
Jnb MAC,DES_
Jnb Decode,DES_
;separate MAC at the end of datafield
Mov A, R7 ;Acc := #(Data) + #(MAC)
Add A, #0F8h ;Acc -= #(MAC)
Mov R7, A ;R7 := true DataLength
DES_:
Mov DPH, R2
Mov DPL, R3
Mov R3, #8 ;D, C := PC_1 (DES-Key), 2*28 bit
;calculate key address (adrC = dptr+R2)
MOV R2, #00H
; Mov A, #1
; MovC A, @A+Dptr ;Acc := HeaderLength
; Add A, #4 ;Acc := addr (Key0)
; Mov R2, A ;R2 := KeyByteOffset
;address of 16 bytes calculation area
Mov A, #CalcArea ;Acc := addr
Xch A, R1 ;Acc := addr (Input0)
Mov R6, A ;R6 := addr (Input0)
;write permuted key to bitmap area
DesGetKey: Mov R0, #BM0 ;R0 := addr (C0)
Mov A, R2 ;Acc := KeyByteOffset
; MovC A, @A+Dptr ;Acc := ith byte of DES-Key
lcall GetKey
Inc R2
Mov R4, #7 ;R4 := shift bits 6..0, bit 7 not used
Rlc A
Xch A, @R0
Rlc A
Xch A, @R0
Inc R0
Djnz R4, $-5
Djnz R3, DesGetKey
Mov A, BM6 ;Acc := D0
Xch A, BM4 ;Acc := D2
Mov BM6, A ;Store D2 at correct location
;2nd permutation and copy to calculation area
Mov R0, #BM0 ;R0 := addr (C0)
Mov R3, #7 ;R3 := permutate 7 bytes
SetKeyNxt: Mov A, R3 ;Acc := addr (D6, C6) - R1 + 1
Mov R4, A ;R4 := ByteCounter
Mov A, @R0 ;Acc := next StandardPermutationByte
Inc R0
Rrc A
Xch A, @R1
Rrc A
Rrc A
Xch A, @R1
Inc R1
Djnz R4, $-6 ;R1 == addr (D6, C6) +1 ?
Mov R4, A ;Save Accu
Mov A, R1 ;Acc := addr (D6, C6) + 1
Add A, #0F9h ;Acc := addr (D0, C0)
Mov R1, A ;R1 := addr (D0, C0)
Clr C
Mov A, #8 ;Acc := all bits
SubB A, R3 ;Acc := remaining bits to shift
Xch A, R4 ;Acc := remaining bits
Rrc A
Xch A, @R1
Rrc A
Rrc A
Xch A, @R1
Inc R1
Djnz R4, $-6 ;More bits to shift ?
Djnz R3, SetKeyNxt ;All bytes permutated ?
CLR C
MOV R3,#08h
; Call VecExist ;initial value to copy?
;C = 1: yes
; = 0: no
;R3 = #8
;copy 0 or initial value to calculation area
Inc R2 ;R2 := addr (Vector0) - 1
Clr A
Jnc $+5
Inc R2
Mov A, R2 ;Acc := addr (VectorI)
MovC A, @A+Dptr ;Acc := VectorI
Inc R1 ;addr (O) += 1
Mov @R1, A
Djnz R3, $-7
Mov A, R1 ;Acc := addr (Output7)
Add A, #0F1h ;Acc := addr (D0, C0)
Mov R2, A ;R2 := addr (D0, C0)
;Check DES mode
Mov A, R5 ;Acc := mode
Jnb Acc.7,DesModeOk
Call GErrCrypt ;Error: wrong mode
DB 003h
DesModeOk: Cpl Decode
Mov R5, A
Anl A, #030h ;Mask Decode and MAC-Bit
Jnz DesLgOk ;no len check when MAC or encrypt
Mov A, R7 ;Get ByteCount
Anl A, #007h ;James Bond
Jz DesLgOk
Call GErrCrypt ;Error: Length not multiple of 8
DB 008h
DesLgOk: Mov A, R5 ;Acc := mode
Xrl A, #040h ;CBC-Decode
Anl A, #0F0h
Jnz DesSave ;No CBC-Decode ?
;CBC-Decode starts at end of data
Mov A, R6 ;Acc := addr (Block0)
Add A, R7 ;Acc := addr (BlockN) + 8
Add A, #0F8h ;Acc := addr (BlockN)
Mov R6, A ;R6 := addr (BlockN)
DesSave: Push Dpl
Push Dph
;********** Function DES **********
DESAction: Mov R3, #8 ;Initial permutation IP of 8 bytes
Mov A, R2 ;Acc := addr (D0, C0)
Add A, R3 ;Acc := addr (Output0)
Mov R1, A ;R1 := addr (Output0)
Mov A, R5 ;Acc := Mode
Mov B, A ;B-Accu := Mode
Rl A
Rlc A ;Carry := R5.6
Anl C, Acc.7 ;CBC-Encode => Carry = 1 !
Orl C, Acc.6 ;BuildMac => Carry = 1 !
Mov 0F0h, C ;B.0 = 1 => ExOr InputData
;get 8 bytes of data/add padding bytes
InitPerm: Mov R2, #080h ;Padding value
Mov A, R7
Jz Padding
Dec R7 ;ByteCounter
Mov A, R6 ;Acc := addr (InputI)
Mov R0, A ;R0 := addr (InputI)
Mov A, @R0 ;Acc := InputI
SJmp $+6
Padding: Xch A, R2 ;Acc := PaddingByte
Jb 0F4h, $+7 ;BuildMac ? => Skip Increment
Inc R6 ;addr (I) += 1
;add previous output if necessary
Jnb 0F0h, $+4
Xrl A, @R1 ;Acc ^= OutputI
Mov R0, #BM0 ;R0 := addr (Work0), it contains Right0
Mov R4, #8 ;R4 := shift 8 bits
Djnz R3, $+4
SJmp InitEnd
;permute byte into bitmap area
Inc R1 ;addr (O) += 1
Rlc A
Xch A, @R0
Rlc A
Xch A, @R0
Inc R0 ;addr (W) += 1
Djnz R4, $-5
SJmp InitPerm+2
;permute last byte
InitEnd: Rl A
Rl A
Rlc A
Xch A, @R0
Rl A
Rrc A
Xch A, @R0
Inc R0 ;addr (W) += 1
Djnz R4, $-6
;load permuted input in calculation area
Mov @R1, BM1 ;R1 := addr (Left0)
Dec R1 ;R1 := addr (Left1)
Mov @R1, BM3
Dec R1 ;R1 := addr (Left2)
Mov @R1, BM5
Dec R1 ;R1 := addr (Left3)
Mov @R1, BM7
Dec R1 ;R1 := addr (Right0)
Mov @R1, BM0
Dec R1 ;R1 := addr (Right1)
Mov @R1, BM2
Dec R1 ;R1 := addr (Right2)
Mov @R1, BM4
Dec R1 ;R1 := addr (Right3)
Mov @R1, BM6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -