📄 des.lst
字号:
167 ;Check DES mode
006A ED 168 Mov A, R5 ;Acc := mode
006B 30E704 169 Jnb Acc.7,DesModeOk
006E 120000 F 170 Call GErrCrypt ;Error: wrong mode
0071 03 171 DB 003h
172
0072 B2E5 173 DesModeOk: Cpl Decode
0074 FD 174 Mov R5, A
0075 5430 175 Anl A, #030h ;Mask Decode and MAC-Bit
0077 7009 176 Jnz DesLgOk ;no len check when MAC or encrypt
0079 EF 177 Mov A, R7 ;Get ByteCount
007A 5407 178 Anl A, #007h ;James Bond
007C 6004 179 Jz DesLgOk
007E 120000 F 180 Call GErrCrypt ;Error: Length not multiple of 8
0081 08 181 DB 008h
182
0082 ED 183 DesLgOk: Mov A, R5 ;Acc := mode
0083 6440 184 Xrl A, #040h ;CBC-Decode
0085 54F0 185 Anl A, #0F0h
0087 7005 186 Jnz DesSave ;No CBC-Decode ?
187 ;CBC-Decode starts at end of data
0089 EE 188 Mov A, R6 ;Acc := addr (Block0)
008A 2F 189 Add A, R7 ;Acc := addr (BlockN) + 8
008B 24F8 190 Add A, #0F8h ;Acc := addr (BlockN)
A51 MACRO ASSEMBLER DES 09/11/2002 09:44:25 PAGE 4
008D FE 191 Mov R6, A ;R6 := addr (BlockN)
192
008E C082 193 DesSave: Push Dpl
0090 C083 194 Push Dph
195
196
197 ;********** Function DES **********
198
0092 7B08 199 DESAction: Mov R3, #8 ;Initial permutation IP of 8 bytes
0094 EA 200 Mov A, R2 ;Acc := addr (D0, C0)
0095 2B 201 Add A, R3 ;Acc := addr (Output0)
0096 F9 202 Mov R1, A ;R1 := addr (Output0)
0097 ED 203 Mov A, R5 ;Acc := Mode
0098 F5F0 204 Mov B, A ;B-Accu := Mode
009A 23 205 Rl A
009B 33 206 Rlc A ;Carry := R5.6
009C 82E7 207 Anl C, Acc.7 ;CBC-Encode => Carry = 1 !
009E 72E6 208 Orl C, Acc.6 ;BuildMac => Carry = 1 !
00A0 92F0 209 Mov 0F0h, C ;B.0 = 1 => ExOr InputData
210
211 ;get 8 bytes of data/add padding bytes
00A2 7A80 212 InitPerm: Mov R2, #080h ;Padding value
00A4 EF 213 Mov A, R7
00A5 6006 214 Jz Padding
00A7 1F 215 Dec R7 ;ByteCounter
00A8 EE 216 Mov A, R6 ;Acc := addr (InputI)
00A9 F8 217 Mov R0, A ;R0 := addr (InputI)
00AA E6 218 Mov A, @R0 ;Acc := InputI
00AB 8004 219 SJmp $+6
00AD CA 220 Padding: Xch A, R2 ;Acc := PaddingByte
00AE 20F404 221 Jb 0F4h, $+7 ;BuildMac ? => Skip Increment
00B1 0E 222 Inc R6 ;addr (I) += 1
223 ;add previous output if necessary
00B2 30F001 224 Jnb 0F0h, $+4
00B5 67 225 Xrl A, @R1 ;Acc ^= OutputI
00B6 7800 F 226 Mov R0, #BM0 ;R0 := addr (Work0), it contains Right0
00B8 7C08 227 Mov R4, #8 ;R4 := shift 8 bits
00BA DB02 228 Djnz R3, $+4
00BC 800A 229 SJmp InitEnd
230 ;permute byte into bitmap area
00BE 09 231 Inc R1 ;addr (O) += 1
00BF 33 232 Rlc A
00C0 C6 233 Xch A, @R0
00C1 33 234 Rlc A
00C2 C6 235 Xch A, @R0
00C3 08 236 Inc R0 ;addr (W) += 1
00C4 DCF9 237 Djnz R4, $-5
00C6 80DC 238 SJmp InitPerm+2
239 ;permute last byte
00C8 23 240 InitEnd: Rl A
00C9 23 241 Rl A
00CA 33 242 Rlc A
00CB C6 243 Xch A, @R0
00CC 23 244 Rl A
00CD 13 245 Rrc A
00CE C6 246 Xch A, @R0
00CF 08 247 Inc R0 ;addr (W) += 1
00D0 DCF8 248 Djnz R4, $-6
249
250 ;load permuted input in calculation area
00D2 A700 F 251 Mov @R1, BM1 ;R1 := addr (Left0)
00D4 19 252 Dec R1 ;R1 := addr (Left1)
00D5 A700 F 253 Mov @R1, BM3
00D7 19 254 Dec R1 ;R1 := addr (Left2)
00D8 A700 F 255 Mov @R1, BM5
00DA 19 256 Dec R1 ;R1 := addr (Left3)
A51 MACRO ASSEMBLER DES 09/11/2002 09:44:25 PAGE 5
00DB A700 F 257 Mov @R1, BM7
00DD 19 258 Dec R1 ;R1 := addr (Right0)
00DE A700 F 259 Mov @R1, BM0
00E0 19 260 Dec R1 ;R1 := addr (Right1)
00E1 A700 F 261 Mov @R1, BM2
00E3 19 262 Dec R1 ;R1 := addr (Right2)
00E4 A700 F 263 Mov @R1, BM4
00E6 19 264 Dec R1 ;R1 := addr (Right3)
00E7 A700 F 265 Mov @R1, BM6
266
267 ;16 rounds DES operation
00E9 E9 268 Mov A, R1 ;Acc := addr (Output0)
00EA 24F8 269 Add A, #0F8h ;Acc := addr (D0, C0)
00EC FA 270 Mov R2, A ;R2 := addr (D0, C0)
00ED 7B10 271 Mov R3, #16 ;RoundCounter
272
273
00EF 1B 274 OneRound: Dec R3 ;Decrement RoundCounter
00F0 EB 275 Mov A, R3 ;Acc := RoundCounter
00F1 75F007 276 Mov B, #7 ;DivideValue for Shift1Test
00F4 84 277 Div AB ;B-Accu := RoundCounter mod 7
00F5 ED 278 Mov A, R5 ;Acc := Parameter2 of APDU
00F6 5430 279 Anl A, #030h ;Acc5..4 := Decode~, BuildMac
00F8 601D 280 Jz RoundKey ;Decryption ?
281
00FA EA 282 Mov A, R2 ;Acc := addr (D0, C0)
00FB F8 283 Mov R0, A ;R0 := addr (D0, C0)
00FC E5F0 284 Mov A, B ;Acc := RoundCounter mod 7
00FE 24FF 285 Add A, #0FFh ;Carry := Acc != 0 => Shift2
0100 EB 286 Mov A, R3
0101 04 287 Inc A
0102 B0E4 288 Anl C, /Acc.4 ;Carry &= First Round ?
0104 9200 F 289 Mov BM0.7,C ;BM0.7 == 0 ? => Shift1
0106 E6 290 Mov A, @R0 ;Acc := D6, C6 << 2 = D0, C0
0107 7C06 291 EncShift2: Mov R4, #6 ;R4 := shift through 7 bytes
0109 F8 292 Mov R0, A ;R0 := D6, C6 << 2 = D0, C0
010A EA 293 Mov A, R2 ;Acc := addr (D0, C0)
010B 2C 294 Add A, R4 ;Acc := addr (D6, C6)
010C C8 295 Xch A, R0 ;Acc := D6, C6 << 2
010D 03 296 Rr A ;Acc := D6, C6 << 1
010E 03 297 Rr A ;Acc := D6, C6
010F C6 298 Xch A, @R0 ;ShiftDown one byte
0110 18 299 Dec R0 ;Address -= 1
0111 DCFC 300 Djnz R4, $-2
0113 1000F1 F 301 Jbc BM0.7,EncShift2 ;Shift twice ?
0116 F6 302 Mov @R0, A ;Store D0, C0
303
304
0117 305 RoundKey: ;Permutation 36 5 27 61 18 54 9 47 = D6, C6
306 ; 44 13 35 6 26 62 17 55 = D5, C5
307 ; 52 21 43 14 34 7 25 63 = D4, C4
308 ; 60 29 51 22 42 15 33 4 = D3, C3
309 ; 3 37 59 30 50 23 41 12 = D2, C2
310 ; 11 45 2 38 58 31 49 20 = D1, C1
311 ; 19 53 10 46 1 39 57 28 = D0, C0
312
0117 EA 313 Mov A, R2 ;RoundKey := PC_2 (D, C), 8*6 bit
0118 F8 314 Mov R0, A ;R0 := addr (C0)
0119 E6 315 Mov A, @R0 ;Acc := D0, C0
011A F500 F 316 Mov BM2, A ;Bit8
011C 33 317 Rlc A
011D F500 F 318 Mov BM0, A ;Bit1
011F 23 319 Rl A
0120 23 320 Rl A
0121 F500 F 321 Mov BM6, A ;Bit53
0123 33 322 Rlc A
A51 MACRO ASSEMBLER DES 09/11/2002 09:44:25 PAGE 6
0124 F500 F 323 Mov BM7, A ;Bit46
0126 9200 F 324 Mov BM6.0,C ;Bit39
0128 23 325 Rl A
0129 33 326 Rlc A
012A 9200 F 327 Mov BM7.7,C ;Bit32
012C 33 328 Rlc A
012D F500 F 329 Mov BM1, A ;Bit15
012F 08 330 Inc R0
0130 E6 331 Mov A, @R0 ;Acc := D1, C1
0131 33 332 Rlc A
0132 9200 F 333 Mov BM2.6,C ;Bit23
0134 23 334 Rl A
0135 23 335 Rl A
0136 33 336 Rlc A
0137 F500 F 337 Mov BM4, A ;Bit47
0139 F500 F 338 Mov BM5, A ;Bit33
013B 9200 F 339 Mov BM5.3,C ;Bit40
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -