|
|
1.1 ! root 1: ;------------------------------------------------------------------------- ! 2: ; idea68k.a ! 3: ; ! 4: ; 68000 Assembler version of idea cipher, direct translation from c code ! 5: ; from PGP. ! 6: ; ! 7: ; Author: Risto Paasivirta, [email protected]. ! 8: ; ! 9: ! 10: section text,code ! 11: ! 12: xdef _asm_mul,_asm_inv ! 13: xdef _asm_cipher_idea ! 14: ! 15: ; key schedule block ! 16: ! 17: ROUNDS equ 8 ! 18: ! 19: Z0 equ 0 ! 20: Z1 equ (ROUNDS+1)*2 ! 21: Z2 equ (ROUNDS+1)*4 ! 22: Z3 equ (ROUNDS+1)*6 ! 23: Z4 equ (ROUNDS+1)*8 ! 24: Z5 equ (ROUNDS+1)*10 ! 25: ! 26: ZSIZE equ (ROUNDS+1)*12 ! 27: ! 28: KSSIZE equ ZSIZE*2 ! 29: ! 30: ;------------------------------------------------------------------------- ! 31: ; ! 32: ; idmul da,db -- db = da * db mod 65537, d0 = scratch (da may be d0) ! 33: ; ! 34: ! 35: idmul macro ! 36: tst.w \2 ! 37: bne.b idmul1.\@ ! 38: ! 39: moveq #1,\2 ! 40: sub.w \1,\2 ! 41: bra.b idmul3.\@ ! 42: ! 43: idmul1.\@ tst.w \1 ! 44: bne.b idmul2.\@ ! 45: moveq #1,d0 ! 46: sub.w \2,d0 ! 47: move.w d0,\2 ! 48: bra.b idmul3.\@ ! 49: ! 50: idmul2.\@ mulu.w \1,\2 ! 51: move.l \2,d0 ! 52: swap d0 ! 53: sub.w d0,\2 ! 54: bcc.b idmul3.\@ ! 55: addq.w #1,\2 ! 56: idmul3.\@ ! 57: endm ! 58: ! 59: ;------------------------------------------------------------------------- ! 60: ; idea_cip (a0=inblock,a1=outblock,a2=keyshedule) (d0-d7/a3 scratch) ! 61: ; ! 62: ; ! 63: ; ! 64: ! 65: idea_cip movem.w (a0),d1-d4 ! 66: moveq #0,d7 ! 67: ! 68: idea_cip_loop lea 0(a2,d7.w),a3 ! 69: idmul (a3),d1 ! 70: idmul Z3(a3),d4 ! 71: add.w Z1(a3),d2 ! 72: add.w Z2(a3),d3 ! 73: move.w d1,d6 ! 74: eor.w d3,d6 ! 75: idmul Z4(a3),d6 ! 76: move.w d4,d5 ! 77: eor.w d2,d5 ! 78: add.w d6,d5 ! 79: idmul Z5(a3),d5 ! 80: add.w d5,d6 ! 81: eor.w d5,d1 ! 82: eor.w d6,d4 ! 83: eor.w d6,d2 ! 84: eor.w d5,d3 ! 85: exg d2,d3 ! 86: addq.w #2,d7 ! 87: cmp.w #ROUNDS*2,d7 ! 88: bcs idea_cip_loop ! 89: ! 90: lea 0(a2,d7.w),a3 ! 91: idmul (a3),d1 ! 92: idmul Z3(a3),d4 ! 93: add.w Z1(a3),d3 ! 94: add.w Z2(a3),d2 ! 95: exg d2,d3 ! 96: movem.w d1-d4,(a1) ! 97: rts ! 98: ! 99: ;------------------------------------------------------------------------- ! 100: ; _asm_cipher_idea(word16 *in,word16 *out,word16 *ks) ! 101: ; ! 102: ; ! 103: ; ! 104: ! 105: _asm_cipher_idea ! 106: movem.l a2-a3/d2-d7,-(sp) ! 107: movem.l 36(sp),a0-a2 ! 108: bsr idea_cip ! 109: movem.l (sp)+,a2-a3/d2-d7 ! 110: rts ! 111: ! 112: ;------------------------------------------------------------------------- ! 113: ; word16 _asm_mul(word16, word16); ! 114: ; ! 115: ; ! 116: ! 117: _asm_mul move.w 6(sp),d1 ! 118: idmul 10(sp),d1 ! 119: moveq #0,d0 ! 120: move.w d1,d0 ! 121: rts ! 122: ! 123: ;------------------------------------------------------------------------- ! 124: ; d0:16 = inv(d0) ! 125: ; ! 126: ! 127: _asm_inv move.w 6(sp),d0 ! 128: ! 129: inv cmp.w #2,d0 ; inv(0)=0,inv(1)=1 ! 130: bcs.b 1$ ! 131: ! 132: cmp.w #3,d0 ! 133: bcc.b 2$ ! 134: ! 135: move.w #32769,d0 ; inv(2) ! 136: 1$ rts ! 137: ! 138: 2$ movem.l d1-d7,-(sp) ! 139: move.l #$10001,d1 ; d1 = n1 ! 140: moveq #1,d2 ; d2 = b2 ! 141: moveq #0,d3 ; d3 = b1 ! 142: ! 143: inv_loop divu.w d0,d1 ! 144: move.l d1,d4 ! 145: swap d4 ; r = d4 ! 146: tst.w d4 ! 147: beq.b inv_done ! 148: ! 149: move.w d2,d5 ! 150: muls.w d1,d5 ! 151: exg d3,d2 ! 152: sub.l d5,d2 ! 153: moveq #0,d1 ! 154: move.w d0,d1 ! 155: move.w d4,d0 ! 156: bra.b inv_loop ! 157: ! 158: inv_done tst.l d2 ! 159: bpl.b 1$ ! 160: ! 161: move.l #$10001,d0 ! 162: add.l d2,d0 ! 163: bra.b 2$ ! 164: ! 165: 1$ move.l d2,d0 ! 166: ! 167: 2$ movem.l (sp)+,d1-d7 ! 168: rts ! 169: ! 170: ;------------------------------------------------------------------------- ! 171: ! 172: end ! 173:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.