// // Copyright � 2003..2012 : Henk van Kampen // // This file is part of pBlazASM. // // pBlazASM is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // pBlazASM is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with pBlazASM. If not, see . // ; encode and decode functions implementing the TEA cypher ; input in s0/s1/s2/s3 ; output in s0/s1/s2/s3 ; key :> 12 34 56 78 k0 EQU $12 k1 EQU $34 k2 EQU $56 k3 EQU $78 k4 EQU $87 k5 EQU $65 k6 EQU $43 k7 EQU $21 CALL encode CALL decode RET encode: LOAD s4, 0 ; sum = 0 ; LOAD s5, 32 ; n = 32 ; loop encode1: SUB s5, 1 ; n -- > 0 ( actually: -- n >= 0 ) RET C ADD s4, $9E ; sum += delta LOAD s8, s1 ; z LOAD sA, k0 LOAD sB, k1 CALL round ADD s0, s7 ; y += ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]) LOAD s8, s0 ; y LOAD sA, k2 LOAD sB, k3 CALL round ADD s1, s7 ; x += ((y<<4)+k[2]) ^ (y+sum) ^ ((y>>5)+k[3]) LOAD s8, s3 ; x LOAD sA, k4 LOAD sB, k5 CALL round ADD s2, s7 ; w += ((x<<4)+k[0]) ^ (x+sum) ^ ((x>>5)+k[1]) LOAD s8, s2 ; w LOAD sA, k6 LOAD sB, k7 CALL round ADD s3, s7 ; z += ((w<<4)+k[2]) ^ (w+sum) ^ ((w>>5)+k[3]) JUMP encode1 decode: LOAD s4, $C0 ; sum = delta << 5 ; LOAD s5, 32 ; n = 32 ; loop decode1: SUB s5, 1 ; n -- > 0 ( actually: -- n >= 0 ) RET C LOAD s8, s2 ; y LOAD sA, k6 LOAD sB, k7 CALL round SUB s3, s7 ; z += ((y<<4)+k[2]) ^ (y+sum) ^ ((y>>5)+k[3]) LOAD s8, s3 ; z LOAD sA, k4 LOAD sB, k5 CALL round SUB s2, s7 ; y += ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]) LOAD s8, s0 ; y LOAD sA, k2 LOAD sB, k3 CALL round SUB s1, s7 ; z += ((y<<4)+k[2]) ^ (y+sum) ^ ((y>>5)+k[3]) LOAD s8, s1 ; z LOAD sA, k0 LOAD sB, k1 CALL round SUB s0, s7 ; y += ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]) SUB s4, $9E ; sum -= delta JUMP decode1 round: LOAD s7, s8 ; z SL0 s7 SL0 s7 SL0 s7 SL0 s7 ; z<<4 ADD s7, sA ; ((z<<4)+k[0]) LOAD s6, s8 ; z SR0 s6 SR0 s6 SR0 s6 SR0 s6 SR0 s6 ; z>>5 ADD s6, sB ; ((z>>5)+k[1]) XOR s7, s6 ; ((z<<4)+k[0]) ^ ((z>>5)+k[1]) LOAD s6, s8 ; z ADD s6, s4 ; z+sum XOR s7, s6 ; s7 :> ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]) RET