# -*- coding: UTF-8 -*-
""" 

version modifiée de xtea_ini pour coller � la version C fournie par InES

""" 
import struct

def myEncode(key , data , endian="<"):
    
    chaine_crypte = ""
    
    for n in range(0 , len(data)-4 , 8):
        chaine_crypte += xtea_encrypt(key, data[ n:n + 8 ] , endian=endian ) 
        
    return chaine_crypte

def myDecode(key , data , endian="<"):
    
    chaine_decrypte = ""
        
    for n in range(0 , len(data)-4 , 8):
        chaine_decrypte += xtea_decrypt(key, data[ n:n + 8 ] , endian=endian ) 
        
    return chaine_decrypte

def xtea_encrypt(key, block, n=16, endian="!"):
    """
        Encrypt 64 bit data block using XTEA block cypher
        * key = 32 bit (4 char) 
        * block = 64 bit (8 char)
        * n = rounds (default 16)
        * endian = byte order (see 'struct' doc - default big/network) 
        <    little-endian
        > & ! big endian
        
    """
    v0, v1 = struct.unpack(endian + "2L", block)
    _sum, delta, mask = 0L, 0x9e3779b9L, 0xffffffffL
    for _ in range(n):
        v0 = (v0 + (((v1 << 4 ^ v1 >> 5) + v1) ^ (_sum + key[_sum & 3]))) & mask
        _sum = (_sum + delta) & mask        
        v1 = (v1 + (((v0 << 4 ^ v0 >> 5) + v0) ^ (_sum + key[_sum >> 11 & 3]))) & mask
    return struct.pack(endian + "2L", v0, v1)

def xtea_decrypt(key, block, n=16, endian="!"):
    """
        Decrypt 64 bit data block using XTEA block cypher
        * key = 32 bit (4 char) 
        * block = 64 bit (8 char)
        * n = rounds (default 16)
        * endian = byte order (see 'struct' doc - default big/network) 
    """
    v0, v1 = struct.unpack(endian + "2L", block)
    delta, mask = 0x9e3779b9L, 0xffffffffL
    _sum = (delta * n) & mask
    for _ in range(n):
        v1 = (v1 - (((v0 << 4 ^ v0 >> 5) + v0) ^ (_sum + key[_sum >> 11 & 3]))) & mask
        _sum = (_sum - delta) & mask
        v0 = (v0 - (((v1 << 4 ^ v1 >> 5) + v1) ^ (_sum + key[_sum & 3]))) & mask
    return struct.pack(endian + "2L", v0, v1)

if __name__ == "__main__":
    import doctest
    doctest.testmod()
