📄 des.lst
字号:
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/18/2002 08:53:03 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
222
00B1 0E 223 Inc R6 ;addr (I) += 1
224 ;add previous output if necessary
00B2 30F001 225 Jnb 0F0h, $+4
00B5 67 226 Xrl A, @R1 ;Acc ^= OutputI
00B6 7800 F 227 Mov R0, #BM0 ;R0 := addr (Work0), it contains Right0
00B8 7C08 228 Mov R4, #8 ;R4 := shift 8 bits
00BA DB02 229 Djnz R3, $+4
00BC 800A 230 SJmp InitEnd
231 ;permute byte into bitmap area
00BE 09 232 Inc R1 ;addr (O) += 1
00BF 33 233 Rlc A
00C0 C6 234 Xch A, @R0
00C1 33 235 Rlc A
00C2 C6 236 Xch A, @R0
00C3 08 237 Inc R0 ;addr (W) += 1
00C4 DCF9 238 Djnz R4, $-5
00C6 80DC 239 SJmp InitPerm+2
240 ;permute last byte
00C8 23 241 InitEnd: Rl A
00C9 23 242 Rl A
00CA 33 243 Rlc A
00CB C6 244 Xch A, @R0
00CC 23 245 Rl A
00CD 13 246 Rrc A
00CE C6 247 Xch A, @R0
00CF 08 248 Inc R0 ;addr (W) += 1
00D0 DCF8 249 Djnz R4, $-6
250
251 ;load permuted input in calculation area
00D2 A700 F 252 Mov @R1, BM1 ;R1 := addr (Left0)
00D4 19 253 Dec R1 ;R1 := addr (Left1)
00D5 A700 F 254 Mov @R1, BM3
00D7 19 255 Dec R1 ;R1 := addr (Left2)
00D8 A700 F 256 Mov @R1, BM5
A51 MACRO ASSEMBLER DES 09/18/2002 08:53:03 PAGE 5
00DA 19 257 Dec R1 ;R1 := addr (Left3)
00DB A700 F 258 Mov @R1, BM7
00DD 19 259 Dec R1 ;R1 := addr (Right0)
00DE A700 F 260 Mov @R1, BM0
00E0 19 261 Dec R1 ;R1 := addr (Right1)
00E1 A700 F 262 Mov @R1, BM2
00E3 19 263 Dec R1 ;R1 := addr (Right2)
00E4 A700 F 264 Mov @R1, BM4
00E6 19 265 Dec R1 ;R1 := addr (Right3)
00E7 A700 F 266 Mov @R1, BM6
267
268 ;16 rounds DES operation
00E9 E9 269 Mov A, R1 ;Acc := addr (Output0)
00EA 24F8 270 Add A, #0F8h ;Acc := addr (D0, C0)
00EC FA 271 Mov R2, A ;R2 := addr (D0, C0)
00ED 7B10 272 Mov R3, #16 ;RoundCounter
273
274
00EF 1B 275 OneRound: Dec R3 ;Decrement RoundCounter
00F0 EB 276 Mov A, R3 ;Acc := RoundCounter
00F1 75F007 277 Mov B, #7 ;DivideValue for Shift1Test
00F4 84 278 Div AB ;B-Accu := RoundCounter mod 7
00F5 ED 279 Mov A, R5 ;Acc := Parameter2 of APDU
00F6 5430 280 Anl A, #030h ;Acc5..4 := Decode~, BuildMac
00F8 601D 281 Jz RoundKey ;Decryption ?
282
00FA EA 283 Mov A, R2 ;Acc := addr (D0, C0)
00FB F8 284 Mov R0, A ;R0 := addr (D0, C0)
00FC E5F0 285 Mov A, B ;Acc := RoundCounter mod 7
00FE 24FF 286 Add A, #0FFh ;Carry := Acc != 0 => Shift2
0100 EB 287 Mov A, R3
0101 04 288 Inc A
0102 B0E4 289 Anl C, /Acc.4 ;Carry &= First Round ?
0104 9200 F 290 Mov BM0.7,C ;BM0.7 == 0 ? => Shift1
0106 E6 291 Mov A, @R0 ;Acc := D6, C6 << 2 = D0, C0
0107 7C06 292 EncShift2: Mov R4, #6 ;R4 := shift through 7 bytes
0109 F8 293 Mov R0, A ;R0 := D6, C6 << 2 = D0, C0
010A EA 294 Mov A, R2 ;Acc := addr (D0, C0)
010B 2C 295 Add A, R4 ;Acc := addr (D6, C6)
010C C8 296 Xch A, R0 ;Acc := D6, C6 << 2
010D 03 297 Rr A ;Acc := D6, C6 << 1
010E 03 298 Rr A ;Acc := D6, C6
010F C6 299 Xch A, @R0 ;ShiftDown one byte
0110 18 300 Dec R0 ;Address -= 1
0111 DCFC 301 Djnz R4, $-2
0113 1000F1 F 302 Jbc BM0.7,EncShift2 ;Shift twice ?
0116 F6 303 Mov @R0, A ;Store D0, C0
304
305
0117 306 RoundKey: ;Permutation 36 5 27 61 18 54 9 47 = D6, C6
307 ; 44 13 35 6 26 62 17 55 = D5, C5
308 ; 52 21 43 14 34 7 25 63 = D4, C4
309 ; 60 29 51 22 42 15 33 4 = D3, C3
310 ; 3 37 59 30 50 23 41 12 = D2, C2
311 ; 11 45 2 38 58 31 49 20 = D1, C1
312 ; 19 53 10 46 1 39 57 28 = D0, C0
313
0117 EA 314 Mov A, R2 ;RoundKey := PC_2 (D, C), 8*6 bit
0118 F8 315 Mov R0, A ;R0 := addr (C0)
0119 E6 316 Mov A, @R0 ;Acc := D0, C0
011A F500 F 317 Mov BM2, A ;Bit8
011C 33 318 Rlc A
011D F500 F 319 Mov BM0, A ;Bit1
011F 23 320 Rl A
0120 23 321 Rl A
0121 F500 F 322 Mov BM6, A ;Bit53
A51 MACRO ASSEMBLER DES 09/18/2002 08:53:03 PAGE 6
0123 33 323 Rlc A
0124 F500 F 324 Mov BM7, A ;Bit46
0126 9200 F 325 Mov BM6.0,C ;Bit39
0128 23 326 Rl A
0129 33 327 Rlc A
012A 9200 F 328 Mov BM7.7,C ;Bit32
012C 33 329 Rlc A
012D F500 F 330 Mov BM1, A ;Bit15
012F 08 331 Inc R0
0130 E6 332 Mov A, @R0 ;Acc := D1, C1
0131 33 333 Rlc A
0132 9200 F 334 Mov BM2.6,C ;Bit23
0134 23 335 Rl A
0135 23 336 Rl A
0136 33 337 Rlc A
0137 F500 F 338 Mov BM4, A ;Bit47
0139 F500 F 339 Mov BM5, A ;Bit33
013B 9200 F 340 Mov BM5.3,C ;Bit40
013D 33 341 Rlc A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -