From 547207b4a3d79f100ec522c3864d3f2882ebb150 Mon Sep 17 00:00:00 2001 From: Symphorien Gibol <symphorien.gibol@gmail.com> Date: Fri, 3 Jun 2016 11:28:19 +0200 Subject: [PATCH] pas par paquet de 7 octets --- tunmgr/base.py | 10 +++++----- tunmgr/gsm.py | 17 ++++------------- tunmgr/tunmgr.py | 6 ++++-- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/tunmgr/base.py b/tunmgr/base.py index 20f709d..542171b 100644 --- a/tunmgr/base.py +++ b/tunmgr/base.py @@ -12,18 +12,18 @@ def basefromN(repr, base): puissance*=base return n -def from7bytes(B): +def frombytes(B): n = 0 for i, b in enumerate(B): n|=b<<(8*i) return n -def to7bytes(n): - for i in range(7): +def tobytes(n, length): + for i in range(length): yield (n&(0xff<<(8*i)))>>(8*i) if __name__=="__main__": print(list(basetoN(12, 2))) print(basefromN(basetoN(12, 2), 2)) - print(from7bytes(b"abcdefg")) - print(bytes(to7bytes(from7bytes(b"abcdefg")))) + print(frombytes(b"abcdefg")) + print(bytes(tobytes(frombytes(b"abcdefg"), 7))) diff --git a/tunmgr/gsm.py b/tunmgr/gsm.py index 578a993..d3643c9 100644 --- a/tunmgr/gsm.py +++ b/tunmgr/gsm.py @@ -1,27 +1,18 @@ from base import * tableau = ['@','Δ',' ','0','¡','P','¿','p','£','_','!','1','A','Q','a','q','$','Φ','"','2','B','R','b','r','¥','Γ','#','3','C','S','c','s','è','Λ','¤','4','D','T','d','t','é','Ω','%','5','E','U','e','u','ù','Π','&','6','F','V','f','v','ì','Ψ','\'','7','G','W','g','w','ò','Σ','(','8','H','X','h','x','Ç','Θ',')','9','I','Y','i','y','\n','Ξ','*',':','J','Z','j','z','Ø','+',';','K','Ä','k','ä','ø','Æ',',','<','L','Ö','l','ö','\r','æ','-','=','M','Ñ','m','ñ','Å','ß','.','>','N','Ü','n','ü','å','É','/','?','O','§','o','à '] def convertIntToGSM(i): - return tableau[i-1 if i>27 else i] + return tableau[i] def convertGSMtoInt(char): for k in range(127): if (tableau[k] == char): - return k+1 if k>=27 else k + return k def gsmencode(B): - msg = convertIntToGSM(len(B)%7) - for i in range(0, len(B), 7): - septet = B[i: i+7] - msg += "".join(map(convertIntToGSM, basetoN(from7bytes(septet), 127))) - return msg + return "".join(map(convertIntToGSM, (list(basetoN(len(B), 127)) + [0, 0])[:2] + list(basetoN(frombytes(B), 127)))) def gsmdecode(B): - remainder = convertGSMtoInt(B[0]) - msg = b"" - for i in range(1, len(B), 8): - octet = map(convertGSMtoInt, B[i: i+8]) - msg += bytes(to7bytes(basefromN(octet, 127))) - return msg[:-((7-remainder)%7)] + return bytes(tobytes(basefromN(map(convertGSMtoInt, B[2:]), 127), basefromN(map(convertGSMtoInt,B[:2]), 127))) if __name__=="__main__": msg = b"coucou ! j'aime le monde !" diff --git a/tunmgr/tunmgr.py b/tunmgr/tunmgr.py index a8ead7a..4cd0249 100755 --- a/tunmgr/tunmgr.py +++ b/tunmgr/tunmgr.py @@ -5,10 +5,11 @@ import selectors import socket import sys import traceback +from math import log from gsm import * -SMS_SIZE = 140 # octets +SMS_SIZE = 160 # lettres GSM PEER = sys.argv[1] PORT = 51117 @@ -19,7 +20,8 @@ if len(sys.argv)>2: addrs = tuple(reversed(addrs)) tun.addr, tun.dstaddr = addrs tun.netmask = '255.255.255.0' -tun.mtu = SMS_SIZE - 4 - 1 - 7 # header tun et header gsmencode +tun.mtu = int((SMS_SIZE - 2)*log(127)/log(256)) - 4 # header tun et header gsmencode +print(tun.mtu) tun.up() -- GitLab