-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHelpers.py
More file actions
71 lines (57 loc) · 2.13 KB
/
Helpers.py
File metadata and controls
71 lines (57 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import hashlib
def gen_key(key, size):
f_repeats = size // len(key)
remainder = size - f_repeats * len(key)
return key[-remainder - 1 : -1] + key * f_repeats
def NumToLongBytes(num):
num_bytes = [0] * 8
for i in range(7, -1, -1):
num_bytes[i] = num % 256
num //= 256
return num_bytes
def LongBytesToNum(bytes_arr):
num = 0
for i in range(8):
num += num * 256 + bytes_arr[i]
return num
def MakeSenderPacket(buffer, sequence, file_id):
buffer = list(buffer)
buffer.insert(0, 0)
sequence_bytes = NumToLongBytes(sequence)
file_id_bytes = NumToLongBytes(file_id)
return sequence_bytes + file_id_bytes + buffer
def FileToSenderPackets(filepath, file_id, secret_key):
packets = []
sequence = 0
with open(filepath, "rb") as file_handler:
buffer = file_handler.read(463)
while buffer:
packet = MakeSenderPacket(buffer, sequence, file_id)
packets.append(packet)
sequence += 1
buffer = file_handler.read(463)
packets[-1][16] = 1
packets = [bytes(packet) for packet in packets]
hmac_key = hashlib.sha256(secret_key).digest()
for i in range(len(packets)):
key = gen_key(hmac_key, len(packets[i]) + 32)
packets[i] += hmac_key
packets[i] = bytes([a ^ b for a, b in zip(packets[i], key)])
return packets
def Unpack(packet, secret_key):
hmac_key = hashlib.sha256(secret_key).digest()
key = gen_key(hmac_key, len(packet))
packet = bytes([a ^ b for a, b in zip(packet, key)])
sequence = LongBytesToNum(packet[:8])
file_id = LongBytesToNum(packet[8:16])
trailer = int(packet[16])
data = packet[17:-32]
return {"Sequence": sequence, "FileID": file_id, "Trailer": trailer, "Data": data, "HashedKey": packet[-32:]}
def MakeReceiverPacket(sequence, file_id):
sequence_bytes = NumToLongBytes(sequence)
file_id_bytes = NumToLongBytes(file_id)
return bytes(sequence_bytes + file_id_bytes)
def Unpack_ack(packet):
sequence = LongBytesToNum(packet[:8])
file_id = LongBytesToNum(packet[8:16])
return {"Sequence": sequence, "FileID": file_id}