NAME: TEA
CREATOR: David Wheeler, Roger Needham
PB AUTHOR: Torsten Rienow, Michael Ritter
DESCRIPTION: A Feistel cipher which uses operations from mixed (orthogonal) algebraic groups, encrypting 64 bits at a time using a 128-bit key. Although not considered secure, it is one of the fastest and most efficient cryptographic algorithms in existence.
NOTES: The code below is Torsten Rienow's PB and PB-ASM ports. Click here for Michael Ritter's MMX version.
SOURCE: http://www.powerbasic.com/support/forums/Forum7/HTML/001327.html
Viewing source from tea.bas   4652 bytes   Last modified Wed, 20 September 2006

'TEA.BAS
#Compile Exe
#Register None

Function encipherASM(ByVal v As Dword Ptr, ByVal w As Dword Ptr, ByVal k As Dword Ptr, ByVal nLoops As Long) As Dword
    Dim y           As Dword
    Dim z           As Dword
    y       = @v[0]
    z       = @v[1]
    !MOV EDI, nLoops
    !MOV EDX, k
    !MOV EAX, z
    !MOV ESI, 0
    eLoop:
        !MOV EBX, EAX
        !SHL EAX, 4
        !SHR EBX, 5
        !XOR EAX, EBX
        !ADD EAX, z
        !MOV ECX, ESI
        !AND ECX, 3
        !MOV ECX, [EDX + ECX * 4]
        !ADD ECX, ESI
        !XOR EAX, ECX
        !ADD EAX, y
        !MOV y, EAX
        !ADD ESI, &H9E3779B9???
        !MOV EBX, EAX
        !SHL EAX, 4
        !SHR EBX, 5
        !XOR EAX, EBX
        !ADD EAX, y
        !MOV ECX, ESI
        !SHR ECX, 11
        !AND ECX, 3
        !MOV ECX, [EDX + ECX * 4]
        !ADD ECX, ESI
        !XOR EAX, ECX
        !ADD EAX, z
        !MOV z, EAX
        !DEC EDI
    !JNZ eLoop
    @w[0]   = y
    @w[1]   = z
End Function

Sub decipherASM(ByVal v As Dword Ptr, ByVal w As Dword Ptr, ByVal k As Dword Ptr, ByVal nLoops As Long)
    Dim y           As Dword
    Dim z           As Dword
    y       = @v[0]
    z       = @v[1]
    !MOV EDI, nLoops
    !MOV EAX, &H9E3779B9???
    !MUL EDI
    !MOV ESI, EAX
    !MOV EDX, k
    !MOV EBX, y
    eLoop:
        !MOV EAX, EBX
        !SHL EAX, 4
        !SHR EBX, 5
        !XOR EAX, EBX
        !ADD EAX, y
        !MOV ECX, ESI
        !SHR ECX, 11
        !AND ECX, 3
        !MOV ECX, [EDX + ECX * 4]
        !ADD ECX, ESI
        !XOR EAX, ECX
        !MOV EBX, z
        !SUB EBX, EAX
        !MOV z, EBX
        !SUB ESI, &H9E3779B9???
        !MOV EAX, EBX
        !SHL EAX, 4
        !SHR EBX, 5
        !XOR EAX, EBX
        !ADD EAX, z
        !MOV ECX, ESI
        !AND ECX, 3
        !MOV ECX, [EDX + ECX * 4]
        !ADD ECX, ESI
        !XOR EAX, ECX
        !MOV EBX, y
        !SUB EBX, EAX
        !MOV y, EBX
        !DEC EDI
    !JNZ eLoop
    @w[0]   = y
    @w[1]   = z
End Sub

Function encipher(ByVal v As Dword Ptr, ByVal w As Dword Ptr, ByVal k As Dword Ptr, ByVal nLoops As Long) As Dword
    Register y      As Dword
    Register z      As Dword
    Register sum    As Dword
    Register n      As Dword
    Dim ts1         As Dword
    Dim ts2         As Dword
    Dim ts3         As Dword
    y       = @v[0]
    z       = @v[1]
    sum     = 0
    n       = nLoops
    While n > 0
        ts1 = z
        Shift Left ts1, 4
        ts2 = z
        Shift Right ts2, 5
        y   = y + ((ts1 Xor ts2) + z Xor sum + @k[sum And 3])
        sum = sum + &H9E3779B9???
        ts1 = y
        Shift Left ts1, 4
        ts2 = y
        Shift Right ts2, 5
        ts3 = sum
        Shift Right ts3, 11
        z   = z + ((ts1 Xor ts2) + y Xor sum + @k[ts3 And 3])
        n   = n - 1
    Wend
    @w[0]   = y
    @w[1]   = z
End Function

Sub decipher(ByVal v As Dword Ptr, ByVal w As Dword Ptr, ByVal k As Dword Ptr, ByVal nLoops As Long)
    Register y      As Dword
    Register z      As Dword
    Register sum    As Dword
    Register n      As Dword
    Dim Delta       As Dword
    Dim ts1         As Dword
    Dim ts2         As Dword
    Dim ts3         As Dword
    Delta   = &H9E3779B9???
    y       = @v[0]
    z       = @v[1]
    n       = nLoops
    sum     = n * delta
    While n > 0
        ts1 = y
        Shift Left ts1, 4
        ts2 = y
        Shift Right ts2, 5
        ts3 = sum
        Shift Right ts3, 11
        z   = z - ((ts1 Xor ts2) + y Xor sum + @k[ts3 And 3])
        sum = sum - delta
        ts1 = z
        Shift Left ts1, 4
        ts2 = z
        Shift Right ts2, 5
        y   = y - ((ts1 Xor ts2) + z Xor sum + @k[sum And 3])
        n   = n - 1
    Wend
    @w[0]   = y
    @w[1]   = z
End Sub 

Function PbMain
    Dim v           As String * 8
    Dim w           As String * 8
    Dim k           As String * 16
    k       = Chr$(0,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6)
    'Test Power Basic Version
    v       = "TEA TEST"
    Call encipher(ByVal VarPtr(v), ByVal VarPtr(w), ByVal VarPtr(k), 32)
    v       = w
    Call decipher(ByVal VarPtr(v), ByVal VarPtr(w), ByVal VarPtr(k), 32)
    MsgBox w , 0, "Powerbasic Language"
    'Test Inline Asm Version
    v       = "TEA TEST"
    Call encipherASM(ByVal VarPtr(v), ByVal VarPtr(w), ByVal VarPtr(k), 32)
    v       = w
    Call decipherASM(ByVal VarPtr(v), ByVal VarPtr(w), ByVal VarPtr(k), 32)
    MsgBox w , 0, "Inline Assembler" 
End Function

Back to The Archives