
; Tiny Encryption Algorithm
; A public domain block cipher by David Wheeler and Roger Needham
; 80386 assembly implementation by Fauzan Mirza

; TEA uses a 128 bit key and operates on 64 bit data blocks

        .model  tiny
        .code
        .386

        org     100h
Start:
        mov     si,offset Key
        mov     di,offset Data
        call    Encrypt
        mov     si,offset Key
        mov     di,offset Data
        call    Decrypt
        ret

Key:
        db      "0000","0000","0000","0000"
Data:
        db      "0000","0000"

sum     equ     eax
y       equ     ebx
z       equ     ecx
delta   equ     edx
rounds  equ     di
t       equ     ebp
v0      equ     dword ptr [di]
v1      equ     dword ptr [di+4]
k0      equ     dword ptr [si]
k1      equ     dword ptr [si+4]
k2      equ     dword ptr [si+8]
k3      equ     dword ptr [si+12]

Encrypt:
        push    di
        mov     y,v0
        mov     z,v1
        xor     sum,sum
        mov     delta,9e3779b9h ; sqr(5)-1 * 2^31
        mov     rounds,32
ELoopR:
        add     sum,delta
        mov     t,z
        shl     t,4
        add     y,t
        mov     t,k0
        xor     t,z
        add     y,t
        mov     t,z
        shr     t,5
        xor     t,sum
        add     y,t
        add     y,k1
        ;
        mov     t,y
        shl     t,4
        add     z,t
        mov     t,k2
        xor     t,y
        add     z,t
        mov     t,y
        shr     t,5
        xor     t,sum
        add     z,t
        add     z,k3
        dec     rounds
        jnz     ELoopR

        pop     di
        mov     v0,y
        mov     v1,z
        ret


Decrypt:
        push    di
        mov     y,v0
        mov     z,v1
        mov     delta,9e3779b9h ; sqr(5)-1 * 2^31
        mov     sum,delta
        shl     sum,5
        mov     rounds,32
DLoopR:
        mov     t,y
        shl     t,4
        sub     z,t
        mov     t,k2
        xor     t,y
        sub     z,t
        mov     t,y
        shr     t,5
        xor     t,sum
        sub     z,t
        sub     z,k3
        ;
        mov     t,z
        shl     t,4
        sub     y,t
        mov     t,k0
        xor     t,z
        sub     y,t
        mov     t,z
        shr     t,5
        xor     t,sum
        sub     y,t
        sub     y,k1
        sub     sum,delta
        dec     rounds
        jnz     DLoopR

        pop     di
        mov     v0,y
        mov     v1,z
        ret

        end     Start

