📄 des.asm
字号:
;16 rounds DES operation
Mov A, R1 ;Acc := addr (Output0)
Add A, #0F8h ;Acc := addr (D0, C0)
Mov R2, A ;R2 := addr (D0, C0)
Mov R3, #16 ;RoundCounter
OneRound: Dec R3 ;Decrement RoundCounter
Mov A, R3 ;Acc := RoundCounter
Mov B, #7 ;DivideValue for Shift1Test
Div AB ;B-Accu := RoundCounter mod 7
Mov A, R5 ;Acc := Parameter2 of APDU
Anl A, #030h ;Acc5..4 := Decode~, BuildMac
Jz RoundKey ;Decryption ?
Mov A, R2 ;Acc := addr (D0, C0)
Mov R0, A ;R0 := addr (D0, C0)
Mov A, B ;Acc := RoundCounter mod 7
Add A, #0FFh ;Carry := Acc != 0 => Shift2
Mov A, R3
Inc A
Anl C, /Acc.4 ;Carry &= First Round ?
Mov BM0.7,C ;BM0.7 == 0 ? => Shift1
Mov A, @R0 ;Acc := D6, C6 << 2 = D0, C0
EncShift2: Mov R4, #6 ;R4 := shift through 7 bytes
Mov R0, A ;R0 := D6, C6 << 2 = D0, C0
Mov A, R2 ;Acc := addr (D0, C0)
Add A, R4 ;Acc := addr (D6, C6)
Xch A, R0 ;Acc := D6, C6 << 2
Rr A ;Acc := D6, C6 << 1
Rr A ;Acc := D6, C6
Xch A, @R0 ;ShiftDown one byte
Dec R0 ;Address -= 1
Djnz R4, $-2
Jbc BM0.7,EncShift2 ;Shift twice ?
Mov @R0, A ;Store D0, C0
RoundKey: ;Permutation 36 5 27 61 18 54 9 47 = D6, C6
; 44 13 35 6 26 62 17 55 = D5, C5
; 52 21 43 14 34 7 25 63 = D4, C4
; 60 29 51 22 42 15 33 4 = D3, C3
; 3 37 59 30 50 23 41 12 = D2, C2
; 11 45 2 38 58 31 49 20 = D1, C1
; 19 53 10 46 1 39 57 28 = D0, C0
Mov A, R2 ;RoundKey := PC_2 (D, C), 8*6 bit
Mov R0, A ;R0 := addr (C0)
Mov A, @R0 ;Acc := D0, C0
Mov BM2, A ;Bit8
Rlc A
Mov BM0, A ;Bit1
Rl A
Rl A
Mov BM6, A ;Bit53
Rlc A
Mov BM7, A ;Bit46
Mov BM6.0,C ;Bit39
Rl A
Rlc A
Mov BM7.7,C ;Bit32
Rlc A
Mov BM1, A ;Bit15
Inc R0
Mov A, @R0 ;Acc := D1, C1
Rlc A
Mov BM2.6,C ;Bit23
Rl A
Rl A
Rlc A
Mov BM4, A ;Bit47
Mov BM5, A ;Bit33
Mov BM5.3,C ;Bit40
Rlc A
Mov BM3, A ;Bit16
Rl A
Rlc A
Mov BM3.7,C ;Bit2
Inc R0
Mov A, @R0 ;Acc := D2, C2
Rlc A
Mov BM0.1,C ;Bit24
Rlc A
Mov BM5.7,C ;Bit48
Rlc A
Mov BM0.7,C ;Bit17
Rlc A
Mov BM4.6,C ;Bit41
Rlc A
Mov BM1.7,C ;Bit10
Rlc A
Mov BM6.2,C ;Bit34
Rlc A
Mov BM1.2,C ;Bit3
Rlc A
Mov BM4.3,C ;Bit55
Inc R0
Mov A, @R0 ;Acc := D3, C3
Rl A
Rlc A
Mov BM6.7,C ;Bit49
Rl A
Rlc A
Mov BM7.3,C ;Bit42
Rlc A
Mov BM0.0,C ;Bit11
Rl A
Rlc A
Mov BM2.1,C ;Bit4
Rlc A
Mov BM6.1,C ;Bit56
Inc R0
Mov A, @R0 ;Acc := D4, C4
Rlc A
Mov BM2.2,C ;Bit26
Rlc A
Mov BM7.4,C ;Bit50
Rlc A
Mov BM2.7,C ;Bit19
Rl A
Rlc A
Mov BM2.0,C ;Bit12
Rlc A
Mov BM7.5,C ;Bit36
Rlc A
Mov BM0.3,C ;Bit5
Rlc A
Mov BM7.6,C ;Bit29
Inc R0
Mov A, @R0 ;Acc := D5, C5
Rlc A
Mov BM3.4,C ;Bit27
Rlc A
Mov BM5.4,C ;Bit51
Rlc A
Mov BM3.5,C ;Bit20
Rlc A
Mov BM6.6,C ;Bit44
Rlc A
Mov BM3.6,C ;Bit13
Rlc A
Mov BM4.1,C ;Bit37
Rlc A
Mov BM1.5,C ;Bit6
Rlc A
Mov BM5.2,C ;Bit30
Inc R0
Mov A, @R0 ;Acc := D6, C6
Rlc A
Mov BM1.3,C ;Bit28
Rlc A
Mov BM4.7,C ;Bit52
Rlc A
Mov BM1.6,C ;Bit21
Rlc A
Mov BM5.5,C ;Bit45
Rlc A
Mov BM0.6,C ;Bit14
Rl A
Rlc A
Mov BM3.3,C ;Bit7
Rlc A
Mov BM4.0,C ;Bit31
Mov A, R5 ;Acc := Parameter2 of APDU
Anl A, #030h ;Acc5..4 := Decode~, BuildMac
Jnz InitExpand
Mov A, R2 ;Acc := addr (D0, C0)
Mov R0, A ;R0 := addr (D0, C0)
Mov A, B ;Acc := RoundCounter mod 7
Dec A
Add A, #0FFh ;Carry := Acc != 0 => Shift2
Mov A, R3
Jnz DecShift2-1 ;Last Round ?
Clr C ;Carry == 0 => Shift1
Mov A, @R0 ;Acc := D0, C0
DecShift2: Mov R4, #6 ;R4 := shift through 7 bytes
Inc R0 ;Address += 1
Xch A, @R0 ;ShiftUp one byte
Djnz R4, $-2
Mov R0, A ;R0 := D0, C0 >> 2 = D6, C6
Mov A, R2 ;Acc := addr (D0, C0)
Xch A, R0 ;Acc := D0, C0 >> 2
Rl A ;Acc := D0, C0 >> 1
Rl A ;Acc := D0, C0
Jbc PSW.7,DecShift2 ;Shift twice ?
Mov @R0, A ;Store D0, C0
InitExpand: Mov R0, #BM0 ;R0 := addr (first SBoxValue)
Mov R4, #4 ;Half number of SBoxes
Mov Dptr,#SBoxes ;Dptr := addr (SBoxes)
Mov A, @R1 ;Acc := Right3
Inc R1
Inc R1
Inc R1 ;R1 := addr (Right0)
ExpXorSBox: XchD A, @R1 ;Acc3..0 := RightI, 4 bits
Xch A, @R0 ;Acc := RoundKey, bits 7, 6, 3..0
Xrl A, @R0 ;Acc := SBoxIndex, bits 7, 6, 3..0
Swap A ;Acc7..2 := SBoxIndex, 6 bits
Anl A, #0FCh ;Mask SBoxIndex
MovC A, @A+Dptr ;Acc := SBoxValue, LowNibble valid
Xch A, @R0 ;Acc3..0 := RightI, 4 bits
Inc R0
XchD A, @R1 ;Rebuild RightI
Mov A, @R1 ;Acc7..0 := RightI
Xrl A, @R0 ;Acc7..2 := SBoxIndex, 6bits
Anl A, #0FCh ;Mask SBoxIndex
MovC A, @A+Dptr ;Acc := SBoxValue, HighNibble valid
Mov @R0, A
Inc R0
Mov A, @R1 ;Acc7..0 := RightI
Dec R1
Inc Dptr
Djnz R4, ExpXorSBox
Mov A, R3 ;Acc := RoundCounter
Jnb Acc.0,$+7 ;Odd Round ?
Mov A, R1 ;Acc := addr (Right3) -1
Add A, #8 ;Address += 8
Mov R1, A ;R1 := addr (Left0)
Mov C, BM1.6 ;P(B)1 := B7, Right := P(B) ExOr Left
Rrc A
Mov C, BM4.3 ;P(B)2 := B20
Rrc A
Mov C, BM5.4 ;P(B)3 := B21
Rrc A
Mov C, BM7.4 ;P(B)4 := B29
Rrc A
Mov C, BM2.3 ;P(B)5 := B12
Rrc A
Mov C, BM6.3 ;P(B)6 := B28
Rrc A
Mov C, BM4.0 ;P(B)7 := B17
Rrc A
Mov C, BM0.0 ;P(B)8 := B1
Rrc A
Xrl A, @R1 ;Acc := new Right0
Mov @R1, A ;Left0 := new Right0
Mov C, BM3.6 ;P(B)9 := B15
Rrc A
Mov C, BM5.6 ;P(B)10 := B23
Rrc A
Mov C, BM6.1 ;P(B)11 := B26
Rrc A
Mov C, BM1.4 ;P(B)12 := B5
Rrc A
Mov C, BM4.1 ;P(B)13 := B18
Rrc A
Mov C, BM7.6 ;P(B)14 := B31
Rrc A
Mov C, BM2.1 ;P(B)15 := B10
Rrc A
Mov C, BM0.1 ;P(B)16 := B2
Rrc A
Dec R1
Xrl A, @R1 ;Acc := new Right1
Mov @R1, A ;Left1 := new Right1
Mov C, BM1.7 ;P(B)17 := B8
Rrc A
Mov C, BM5.7 ;P(B)18 := B24
Rrc A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -