def main():
    server_address = ('localhost', 9999)  # authentication server address
    ss_id = '1efeggrvv'  # id of service server
    ss_address = ('localhost', 5000)  # address of service server
    tgt_path = 'tgt'
    data_path = 'data.json'

    login = input('login: '******'password: '******'utf-8')
    # create key from hash of password
    m = hashlib.sha256()
    m.update(password)
    key_c = DesKey(m.digest()[:8])

    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
        is_authenticated = is_auth(data_path, tgt_path)
        # Loop while we are not authorized
        while True:
            # skip authentication if we already have tgt
            if is_authenticated:
                with open('data.json') as f1, open('tgt', 'rb') as f2:
                    data = json.load(f1)
                    tgt = f2.read()
            else:
                # AS_REQ
                as_req(sock, server_address, login, key_c)
                # AS_REP
                data, tgt = as_rep(sock, key_c, tgt_path, data_path)

            key_c_tgs, tgs_address, p1 = data
            # key_c_tgs is a string key
            key_c_tgs = DesKey(key_c_tgs.encode('utf-8'))
            # tgs_address is a list (need a tuple)
            tgs_address = tuple(tgs_address)
        # TGS_REQ
            tgs_req(sock, tgs_address, login, ss_id, tgt, key_c_tgs)
        # TGS_REP
            tgs_rep_data = tgs_rep(sock, key_c_tgs)
            if tgs_rep_data:
                break
            else:
                is_authenticated = False

        data_tgs, st = tgs_rep_data
        key_c_ss, ss, p2 = data_tgs
        # key_c_ss is a string key
        key_c_ss = DesKey(key_c_ss.encode('utf-8'))
    # SS_REQ
        t4 = int(dt.datetime.utcnow().timestamp())
        ss_req(sock, ss_address, login, t4, st, key_c_ss)
    # SS_REP
        t_c1 = sock.recv(1024)
        t_c1 = int(key_c_ss.decrypt(t_c1))
        if t_c1 - t4 == 1:
            print('Success authorization :)')
        else:
            print('Server is not authorized!')
 def handle(self):
     data = self.request[0].strip()
     socket = self.request[1]
     print("{} wrote:".format(self.client_address[0]))
     print(data)
     if data == b'TGS_REQ':
         tgt = socket.recv(1024)
         ss = socket.recv(1024).decode('utf-8')
         aut1 = socket.recv(1024)
         if ss not in services:
             socket.sendto(b'Error: invalid ss_id', self.client_address)
             return
         tgt = K_TGS.decrypt(tgt)
         c1, key_c_tgs, p1, t_kdc = json.loads(tgt)
         key_c_tgs = DesKey(key_c_tgs.encode('utf-8'))
         aut1 = key_c_tgs.decrypt(aut1)
         aut1 = json.loads(aut1)
         c2, t_c = aut1
         t_c = dt.datetime.fromtimestamp(t_c)
         t_kdc = dt.datetime.fromtimestamp(t_kdc)
         delta = (t_c - t_kdc).total_seconds()
         print(c1, c2, delta, p1)
         # TGS_REP
         if c1 == c2 and delta / 3600 < p1:
             key_c_ss = ''.join(
                 secrets.choice(string.ascii_letters + string.digits)
                 for _ in range(8))
             p2 = 10  # hours
             data_c_tgs = json.dumps([key_c_ss, ss, p2]).encode('utf-8')
             data_c_tgs = key_c_tgs.encrypt(data_c_tgs)
             socket.sendto(data_c_tgs, self.client_address)
             t3 = int(dt.datetime.utcnow().timestamp())
             tgs = json.dumps([c1, ss, t3, p2, key_c_ss]).encode('utf-8')
             tgs = K_SS.encrypt(tgs)
             socket.sendto(tgs, self.client_address)
         else:
             socket.sendto(b'Error: Unauthorized', self.client_address)