home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Stars of Shareware: Programmierung
/
SOURCE.mdf
/
programm
/
msdos
/
c
/
pgp23asr
/
pgpsrc23
/
idea68k.s
< prev
next >
Wrap
Text File
|
1993-05-09
|
3KB
|
174 lines
;-------------------------------------------------------------------------
; idea68k.a
;
; 68000 Assembler version of idea cipher, direct translation from c code
; from PGP.
;
; Author: Risto Paasivirta, paasivir@jyu.fi.
;
section text,code
xdef _asm_mul,_asm_inv
xdef _asm_cipher_idea
; key schedule block
ROUNDS equ 8
Z0 equ 0
Z1 equ (ROUNDS+1)*2
Z2 equ (ROUNDS+1)*4
Z3 equ (ROUNDS+1)*6
Z4 equ (ROUNDS+1)*8
Z5 equ (ROUNDS+1)*10
ZSIZE equ (ROUNDS+1)*12
KSSIZE equ ZSIZE*2
;-------------------------------------------------------------------------
;
; idmul da,db -- db = da * db mod 65537, d0 = scratch (da may be d0)
;
idmul macro
tst.w \2
bne.b idmul1.\@
moveq #1,\2
sub.w \1,\2
bra.b idmul3.\@
idmul1.\@ tst.w \1
bne.b idmul2.\@
moveq #1,d0
sub.w \2,d0
move.w d0,\2
bra.b idmul3.\@
idmul2.\@ mulu.w \1,\2
move.l \2,d0
swap d0
sub.w d0,\2
bcc.b idmul3.\@
addq.w #1,\2
idmul3.\@
endm
;-------------------------------------------------------------------------
; idea_cip (a0=inblock,a1=outblock,a2=keyshedule) (d0-d7/a3 scratch)
;
;
;
idea_cip movem.w (a0),d1-d4
moveq #0,d7
idea_cip_loop lea 0(a2,d7.w),a3
idmul (a3),d1
idmul Z3(a3),d4
add.w Z1(a3),d2
add.w Z2(a3),d3
move.w d1,d6
eor.w d3,d6
idmul Z4(a3),d6
move.w d4,d5
eor.w d2,d5
add.w d6,d5
idmul Z5(a3),d5
add.w d5,d6
eor.w d5,d1
eor.w d6,d4
eor.w d6,d2
eor.w d5,d3
exg d2,d3
addq.w #2,d7
cmp.w #ROUNDS*2,d7
bcs idea_cip_loop
lea 0(a2,d7.w),a3
idmul (a3),d1
idmul Z3(a3),d4
add.w Z1(a3),d3
add.w Z2(a3),d2
exg d2,d3
movem.w d1-d4,(a1)
rts
;-------------------------------------------------------------------------
; _asm_cipher_idea(word16 *in,word16 *out,word16 *ks)
;
;
;
_asm_cipher_idea
movem.l a2-a3/d2-d7,-(sp)
movem.l 36(sp),a0-a2
bsr idea_cip
movem.l (sp)+,a2-a3/d2-d7
rts
;-------------------------------------------------------------------------
; word16 _asm_mul(word16, word16);
;
;
_asm_mul move.w 6(sp),d1
idmul 10(sp),d1
moveq #0,d0
move.w d1,d0
rts
;-------------------------------------------------------------------------
; d0:16 = inv(d0)
;
_asm_inv move.w 6(sp),d0
inv cmp.w #2,d0 ; inv(0)=0,inv(1)=1
bcs.b 1$
cmp.w #3,d0
bcc.b 2$
move.w #32769,d0 ; inv(2)
1$ rts
2$ movem.l d1-d7,-(sp)
move.l #$10001,d1 ; d1 = n1
moveq #1,d2 ; d2 = b2
moveq #0,d3 ; d3 = b1
inv_loop divu.w d0,d1
move.l d1,d4
swap d4 ; r = d4
tst.w d4
beq.b inv_done
move.w d2,d5
muls.w d1,d5
exg d3,d2
sub.l d5,d2
moveq #0,d1
move.w d0,d1
move.w d4,d0
bra.b inv_loop
inv_done tst.l d2
bpl.b 1$
move.l #$10001,d0
add.l d2,d0
bra.b 2$
1$ move.l d2,d0
2$ movem.l (sp)+,d1-d7
rts
;-------------------------------------------------------------------------
end