-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathutils.py
More file actions
executable file
·145 lines (109 loc) · 3.47 KB
/
utils.py
File metadata and controls
executable file
·145 lines (109 loc) · 3.47 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
from random import choice, seed, randint
from string import ascii_letters, digits
from hashlib import sha256
from math import floor, log2, log, ceil
from DataStructure import ADRS
def base_w(byte_string: bytes, w: int in {4, 16}, out_len):
in_ = 0
total_ = 0
bits_ = 0
base_w_ = []
for i in range(0, out_len):
if bits_ == 0:
total_ = byte_string[in_]
in_ += 1
bits_ += 8
bits_ -= log2(w)
base_w_.append((total_ >> int(bits_)) & (w - 1))
return base_w_
def generate_random_value(n):
alphabet = ascii_letters + digits
value = ''.join(choice(alphabet) for _ in range(n))
return value
def compute_needed_bytes(n):
if n == 0:
return 1
return int(log(n, 256)) + 1
def compute_lengths(n: int, w: int in {4, 16}):
len_1 = ceil(8 * n / log2(w))
len_2 = floor(log2(len_1 * (w - 1)) / log2(w)) + 1
len_all = len_1 + len_2
return len_1, len_2, len_all
def to_byte(value, bytes_count):
return value.to_bytes(bytes_count, byteorder='big')
def xor(one: bytearray, two: bytearray) -> bytearray:
return bytearray(a ^ b for (a, b) in zip(one, two))
def int_to_bytes(val, count):
byteVal = to_byte(val, count)
acc = bytearray()
for i in range(len(byteVal)):
if byteVal[i] < 16:
acc.extend(b'0')
curr = hex(byteVal[i])[2:]
acc.extend(curr.encode())
return acc
def F(KEY, M):
key_len = len(KEY)
toBytes = to_byte(0, 4)
help_ = sha256(toBytes + KEY + M).hexdigest()[:key_len]
out = bytearray()
out.extend(map(ord, help_))
return out
def chain(X, i, s, SEED, address, w):
if s == 0:
return X
if (i + s) > (w - 1):
return None
tmp = chain(X, i, s - 1, SEED, address, w)
address.setHashAddress((i + s - 1))
address.setKeyAndMask(0)
KEY = PRF(SEED, address)
address.setKeyAndMask(1)
BM = PRF(SEED, address)
tmp = F(KEY, xor(tmp, BM))
return tmp
def PRF(KEY: str, M: ADRS) -> bytearray:
toBytes = to_byte(3, 4)
key_len = len(KEY)
KEY2 = bytearray()
KEY2.extend(map(ord, KEY))
help_ = sha256(toBytes + KEY2 + M.keyAndMask).hexdigest()[:key_len*2]
out = bytearray()
out.extend(map(ord, help_))
return out
def H(KEY: bytearray, M: bytearray) -> bytearray:
key_len = len(KEY)
toBytes = to_byte(1, 4)
help_ = sha256(toBytes + KEY + M).hexdigest()[:key_len]
out = bytearray()
out.extend(map(ord, help_))
return out
def PRF_XMSS(KEY: str, M: bytearray, n: int) -> bytearray:
toBytes = to_byte(3, 4)
KEY2 = bytearray()
KEY2.extend(map(ord, KEY))
help_ = sha256(toBytes + KEY2 + M).hexdigest()[:n]
out = bytearray()
out.extend(map(ord, help_))
return out
def H_msg(KEY: bytearray, M: bytearray, n: int) -> bytearray:
toBytes = to_byte(2, 4)
help_ = sha256(toBytes + KEY + M).hexdigest()[:n]
out = bytearray()
out.extend(map(ord, help_))
return out
def RAND_HASH(left: bytearray, right: bytearray, SEED: str, adrs: ADRS):
adrs.setKeyAndMask(0)
KEY = PRF(SEED, adrs)
adrs.setKeyAndMask(1)
BM_0 = PRF(SEED, adrs)
adrs.setKeyAndMask(2)
BM_1 = PRF(SEED, adrs)
return H(KEY, xor(left, BM_0) + xor(right, BM_1))
def pseudorandom_function(SEED, n):
seed(SEED)
sk_element = list()
for i in range(n):
sign = randint(0, 255)
sk_element.append('{:02x}'.format(sign))
return bytearray(''.join(sk_element).encode(encoding='utf-8'))