-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathkeygen.py
More file actions
181 lines (140 loc) · 5.65 KB
/
keygen.py
File metadata and controls
181 lines (140 loc) · 5.65 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import os
import sys
from base64 import b64encode
from base64 import b64decode
import json
import urllib.parse
from Crypto.Hash import SHA256
from Crypto.Random import get_random_bytes
from nacl.signing import SigningKey, VerifyKey
from nacl.public import PrivateKey, PublicKey
from nacl.encoding import Base64Encoder
import validators
import lxml.etree as etree
import uuid
import NessKeys.Prng as prng
from framework.Container import Container
from NessKeys.exceptions.KeyIndexException import KeyIndexException
class Keygen:
def __is_integer(self, n):
try:
int(n)
except ValueError:
return False
else:
return True
def __manual(self):
print("*** PrivateNess KEY GENERATOR")
print("### DESCRIPTION:")
print(" Generates ciphers for NESS service nodes and NESS service node clients")
print(" Works on ed25519 for keypairs")
print(" Adjustable entropy when generating private keys")
print("### USAGE:")
print("#### Generate user")
print(" user <username> <Keypair count> \"coma,separated,tags\" <Entropy level>")
print(" Example: $ python keygen.py user user1 10 \"Hello,World\" 5")
print("#### Generate node")
print(" node <Node name or URL> <Tariff> master-user-name \"coma,separated,tags\" <Entropy level>")
print(" Example: $ python keygen.py node http://my-node.net 111 master \"Hello,World\" 5")
print("#### Change user's keypair")
print(" change <User Key File> <new keypair index>")
print(" Example: $ python keygen.py change user.key.json 2")
print("#### Generate Faucet Key")
print(" faucet <Faucet URL> <Entropy level>")
print(" Example: $ python keygen.py faucet http://www.faucet.net 5")
print("#### Generate seed")
print(" seed <length> <Entropy level>")
print(" Example: $ python keygen.py seed 32 5")
print("#### Show this manual")
print(" $ python keygen.py help")
print(" $ python keygen.py -h")
def process(self):
if len(sys.argv) == 6 and sys.argv[1].lower() == 'user':
username = sys.argv[2]
if self.__is_integer(sys.argv[3]):
keypair_count = int(sys.argv[3])
else:
print("<Keypair count> must be integer")
return False
tags = sys.argv[4]
if self.__is_integer(sys.argv[5]):
entropy = int(sys.argv[5])
if entropy < 1:
entropy = 1
else:
print("<Entropy level> must be integer")
return False
manager = Container.KeyManager()
return manager.createUserKey(username, keypair_count, tags, entropy)
elif len(sys.argv) == 7 and sys.argv[1].lower() == 'node':
url = sys.argv[2]
if self.__is_integer(sys.argv[3]):
tariff = int(sys.argv[3])
else:
print("<Tariff> must be integer")
return False
master_user = sys.argv[4]
tags = sys.argv[5]
if self.__is_integer(sys.argv[6]):
entropy = int(sys.argv[6])
if entropy < 1:
entropy = 1
else:
print("<Entropy level> must be integer")
return False
manager = Container.KeyManager()
return manager.createNodeKey(url, tariff, master_user, tags, entropy)
elif len(sys.argv) == 4 and sys.argv[1].lower() == 'faucet':
url = sys.argv[2]
if self.__is_integer(sys.argv[3]):
entropy = int(sys.argv[3])
if entropy < 1:
entropy = 1
else:
print("<Entropy level> must be integer")
return False
manager = Container.KeyManager()
return manager.createFaucetkey(url, entropy)
elif len(sys.argv) == 4 and sys.argv[1].lower() == 'change':
key_filename = sys.argv[2]
if self.__is_integer(sys.argv[3]):
key_index = int(sys.argv[3])
else:
print("<new keypair index> must be integer")
return False
manager = Container.KeyManager()
try:
manager.changeUserKeypair(key_filename, key_index)
except KeyIndexException as e:
print("Index %i out of range (from 0 to %i)" % (e.index, e.max))
return False
return True
elif len(sys.argv) == 4 and sys.argv[1].lower() == 'seed':
if self.__is_integer(sys.argv[2]):
length = int(sys.argv[2])
if length < 16:
length = 16
else:
print("<length> must be integer")
return False
if self.__is_integer(sys.argv[3]):
entropy = int(sys.argv[3])
if entropy < 1:
entropy = 1
else:
print("<Entropy level> must be integer")
return False
generator = prng.UhePrng()
for i in range (1, entropy):
rand = ''
with open('/dev/random', 'rb') as file:
rand = b64encode(file.read(1024)).decode('utf-8')
file.close()
generator.add_entropy(rand, str(uuid.getnode()))
print('+', end = " ", flush = True)
print("")
print (generator.string(length))
else:
self.__manual()
keygen = Keygen()
keygen.process()