sgx.py 0.11.dev0__tar.gz → 0.12.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sgx.py
3
- Version: 0.11.dev0
3
+ Version: 0.12.dev0
4
4
  Summary: SGX
5
5
  Home-page: http://github.com/skalenetwork/sgx.py
6
6
  Author: SKALE Labs
@@ -47,9 +47,13 @@ pip install -e .[dev]
47
47
 
48
48
  Create a `.env` file in source directory, like the following:
49
49
  ```bash
50
+ # SGXWallet listening point (1026 uses https w/ certificates)
50
51
  SERVER=https://127.0.0.1:1026
52
+ # path where you want tests to store the auto-generated certificates
51
53
  CERT_PATH=.
54
+ # private key for the funded test account used by transaction tests
52
55
  ETH_PRIVATE_KEY=
56
+ # Ethereum JSON-RPC endpoint used by transaction tests
53
57
  GETH=
54
58
  ```
55
59
  You may alter the fields as needed.
@@ -20,7 +20,7 @@ extras_require['dev'] = extras_require['linter'] + extras_require['dev']
20
20
 
21
21
  setup(
22
22
  name='sgx.py',
23
- version='0.11dev0',
23
+ version='0.12dev0',
24
24
  description='SGX',
25
25
  url='http://github.com/skalenetwork/sgx.py',
26
26
  author='SKALE Labs',
@@ -123,6 +123,11 @@ class SgxClient:
123
123
  def generate_dkg_poly(self, poly_name):
124
124
  return self.sgx_rpc_server.generate_dkg_poly(poly_name, self.t)
125
125
 
126
+ def generate_dkg_poly_v3(self, poly_name, previous_bls_private_key_name):
127
+ return self.sgx_rpc_server.generate_dkg_poly_v3(
128
+ poly_name, previous_bls_private_key_name, self.t
129
+ )
130
+
126
131
  def get_verification_vector(self, poly_name):
127
132
  return self.sgx_rpc_server.get_verification_vector(poly_name, self.n, self.t)
128
133
 
@@ -164,6 +169,13 @@ class SgxClient:
164
169
  poly_name, bls_key_name, eth_key_name, secret_shares, self.n, self.t
165
170
  )
166
171
 
172
+ def create_bls_private_key_v3(
173
+ self, poly_name, bls_key_name, eth_key_name, secret_contributions
174
+ ):
175
+ return self.sgx_rpc_server.create_bls_private_key_v3(
176
+ poly_name, bls_key_name, eth_key_name, secret_contributions, self.n, self.t
177
+ )
178
+
167
179
  def get_bls_public_key(self, bls_key_name):
168
180
  return self.sgx_rpc_server.get_bls_public_key(bls_key_name)
169
181
 
@@ -83,6 +83,19 @@ class SgxRPCHandler:
83
83
  else:
84
84
  return DkgPolyStatus.FAIL
85
85
 
86
+ def generate_dkg_poly_v3(self, poly_name, previous_bls_private_key_name, t):
87
+ if self.is_poly_exist(poly_name):
88
+ return DkgPolyStatus.PREEXISTING
89
+ params = dict()
90
+ params['polyName'] = poly_name
91
+ params['previousBLSPrivateKeyName'] = previous_bls_private_key_name
92
+ params['t'] = t
93
+ response = self.__send_request("generateDKGPoly", params)
94
+ if response['result']['status'] == 0:
95
+ return DkgPolyStatus.NEW_GENERATED
96
+ else:
97
+ return DkgPolyStatus.FAIL
98
+
86
99
  def get_verification_vector(self, poly_name, n, t):
87
100
  params = dict()
88
101
  params['polyName'] = poly_name
@@ -166,6 +179,20 @@ class SgxRPCHandler:
166
179
  response = self.__send_request("createBLSPrivateKeyV2", params)
167
180
  return response['result']['status'] == 0
168
181
 
182
+ def create_bls_private_key_v3(self, poly_name, bls_key_name, eth_key_name, secret_contributions, n, t):
183
+ params = dict()
184
+ # polyName is optional in V3 - new nodes joining the network do not pass it
185
+ if poly_name:
186
+ params['polyName'] = poly_name
187
+
188
+ params['blsKeyName'] = bls_key_name
189
+ params['ethKeyName'] = eth_key_name
190
+ params['secretContributions'] = secret_contributions
191
+ params['n'] = n
192
+ params['t'] = t
193
+ response = self.__send_request("createBLSPrivateKeyV3", params)
194
+ return response['result']['status'] == 0
195
+
169
196
  def get_bls_public_key(self, bls_key_name):
170
197
  params = dict()
171
198
  params["blsKeyName"] = bls_key_name
@@ -130,6 +130,19 @@ class SgxZmq:
130
130
  else:
131
131
  return DkgPolyStatus.FAIL
132
132
 
133
+ def generate_dkg_poly_v3(self, poly_name, previous_bls_private_key_name):
134
+ if self.is_poly_exists(poly_name):
135
+ return DkgPolyStatus.PREEXISTING
136
+ params = dict()
137
+ params['polyName'] = poly_name
138
+ params['previousBLSPrivateKeyName'] = previous_bls_private_key_name
139
+ params['t'] = self.t
140
+ response = self.__send_request('generateDKGPoly', params)
141
+ if response['status'] == 0:
142
+ return DkgPolyStatus.NEW_GENERATED
143
+ else:
144
+ return DkgPolyStatus.FAIL
145
+
133
146
  def get_verification_vector(self, poly_name):
134
147
  params = dict()
135
148
  params['polyName'] = poly_name
@@ -181,6 +194,22 @@ class SgxZmq:
181
194
  response = self.__send_request('createBLSPrivateKey', params)
182
195
  return response['status'] == 0
183
196
 
197
+ def create_bls_private_key_v3(
198
+ self, poly_name, bls_key_name, eth_key_name, secret_contributions
199
+ ):
200
+ params = dict()
201
+ # polyName is optional in V3 - new nodes joining the network do not pass it
202
+ if poly_name:
203
+ params['polyName'] = poly_name
204
+
205
+ params['blsKeyName'] = bls_key_name
206
+ params['ethKeyName'] = eth_key_name
207
+ params['secretContributions'] = secret_contributions
208
+ params['n'] = self.n
209
+ params['t'] = self.t
210
+ response = self.__send_request('createBLSPrivateKeyV3', params)
211
+ return response['status'] == 0
212
+
184
213
  def get_bls_public_key(self, bls_key_name):
185
214
  params = dict()
186
215
  params['blsKeyName'] = bls_key_name
@@ -322,6 +351,7 @@ class SgxZmq:
322
351
  self.method_to_type['getServerVersion'] = 'getServerVersionReq'
323
352
  self.method_to_type['dkgVerification'] = 'dkgVerificationReq'
324
353
  self.method_to_type['createBLSPrivateKey'] = 'createBLSPrivateReq'
354
+ self.method_to_type['createBLSPrivateKeyV3'] = 'createBLSPrivateV3Req'
325
355
  self.method_to_type['getBLSPublicKeyShare'] = 'getBLSPublicReq'
326
356
  self.method_to_type['complaintResponse'] = 'complaintResponseReq'
327
357
  self.method_to_type['importBLSKeyShare'] = 'importBLSReq'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sgx.py
3
- Version: 0.11.dev0
3
+ Version: 0.12.dev0
4
4
  Summary: SGX
5
5
  Home-page: http://github.com/skalenetwork/sgx.py
6
6
  Author: SKALE Labs
@@ -12,6 +12,13 @@ import hashlib
12
12
 
13
13
  load_dotenv()
14
14
 
15
+ DKG_TEST_SLEEP_SECONDS = float(os.getenv('DKG_TEST_SLEEP_SECONDS', '0.1'))
16
+
17
+
18
+ def dkg_sleep():
19
+ if DKG_TEST_SLEEP_SECONDS > 0:
20
+ sleep(DKG_TEST_SLEEP_SECONDS)
21
+
15
22
 
16
23
  def bxor(b1, b2):
17
24
  parts = []
@@ -36,6 +43,162 @@ def convert_g2_point_to_hex(data):
36
43
  return data_hexed
37
44
 
38
45
 
46
+ def get_sgx_client(n, t, with_zmq=False):
47
+ if not with_zmq:
48
+ return SgxClient(os.environ['SERVER'], path_to_cert=os.environ.get('CERT_PATH'), n=n, t=t)
49
+ return SgxClient(
50
+ os.environ['SERVER'], path_to_cert=os.environ.get('CERT_PATH'), n=n, t=t, zmq=True
51
+ ).zmq
52
+
53
+
54
+ def get_poly_name(node_id, dkg_id):
55
+ return (
56
+ "POLY:SCHAIN_ID:"
57
+ f"{str(0)}"
58
+ ":NODE_ID:"
59
+ f"{str(node_id)}"
60
+ ":DKG_ID:"
61
+ f"{str(dkg_id)}"
62
+ )
63
+
64
+
65
+ def get_bls_key_name(node_id, dkg_id):
66
+ return (
67
+ "BLS_KEY:SCHAIN_ID:"
68
+ f"{str(0)}"
69
+ ":NODE_ID:"
70
+ f"{str(node_id)}"
71
+ ":DKG_ID:"
72
+ f"{str(dkg_id)}"
73
+ )
74
+
75
+
76
+ def hex_verification_vectors(verification_vectors):
77
+ hexed_vv = []
78
+ for vv in verification_vectors:
79
+ cur_hexed = ""
80
+ for elem in vv:
81
+ cur_hexed += convert_g2_point_to_hex(elem)
82
+ hexed_vv.append(cur_hexed)
83
+ return hexed_vv
84
+
85
+
86
+ def assert_bls_signature(sgx, bls_key_name):
87
+ message = secrets.token_hex(32)
88
+ signature_share = sgx.bls_sign(bls_key_name, message)
89
+ splitted_signature = signature_share.split(':')
90
+ assert len(splitted_signature) == 4
91
+
92
+ assert len(splitted_signature[0]) > 0
93
+ assert len(splitted_signature[0]) < 78
94
+
95
+ assert len(splitted_signature[1]) > 0
96
+ assert len(splitted_signature[1]) < 78
97
+
98
+ assert len(splitted_signature[2]) > 0
99
+ assert len(splitted_signature[2]) < 78
100
+
101
+ assert int(splitted_signature[3]) < 1000
102
+
103
+
104
+ def assert_new_dkg_poly(response, node_id):
105
+ if response.name == 'FAIL':
106
+ raise TypeError("failed generate dkg poly for " + str(node_id))
107
+ assert response.name == 'NEW_GENERATED'
108
+
109
+
110
+ def perform_dkg_v3(t=3, n=4, with_zmq=False):
111
+ initial_dkg = perform_dkg(t, n, with_0x=True, with_v2=not with_zmq, with_zmq=with_zmq)
112
+ sgx = initial_dkg['sgx']
113
+
114
+ active_node_ids = [0, 1, 2]
115
+ joining_node_id = 3
116
+ new_node_key = sgx.generate_key()
117
+
118
+ public_keys = [
119
+ initial_dkg['public_keys'][0],
120
+ initial_dkg['public_keys'][1],
121
+ initial_dkg['public_keys'][2],
122
+ new_node_key.public_key,
123
+ ]
124
+ key_names = [
125
+ initial_dkg['key_names'][0],
126
+ initial_dkg['key_names'][1],
127
+ initial_dkg['key_names'][2],
128
+ new_node_key.name,
129
+ ]
130
+ dkg_sleep()
131
+
132
+ random_dkg_id = random.randint(0, 10**50)
133
+
134
+ active_poly_names = []
135
+ for node_id in active_node_ids:
136
+ poly_name = get_poly_name(node_id, random_dkg_id)
137
+ response = sgx.generate_dkg_poly_v3(poly_name, initial_dkg['bls_key_names'][node_id])
138
+ assert_new_dkg_poly(response, node_id)
139
+ active_poly_names.append(poly_name)
140
+ dkg_sleep()
141
+
142
+ verification_vectors = []
143
+ for poly_name in active_poly_names:
144
+ verification_vectors.append(sgx.get_verification_vector(poly_name))
145
+ dkg_sleep()
146
+
147
+ hexed_vv = hex_verification_vectors(verification_vectors)
148
+
149
+ secret_key_contributions = []
150
+ for poly_name in active_poly_names:
151
+ if with_zmq:
152
+ secret_key_contributions.append(sgx.get_secret_key_contribution(poly_name, public_keys))
153
+ else:
154
+ secret_key_contributions.append(
155
+ sgx.get_secret_key_contribution_v2(poly_name, public_keys)
156
+ )
157
+ dkg_sleep()
158
+
159
+ for i in range(n):
160
+ for j in range(len(active_node_ids)):
161
+ if with_zmq:
162
+ assert sgx.verify_secret_share(
163
+ hexed_vv[j],
164
+ key_names[i],
165
+ secret_key_contributions[j][192*i:192*(i + 1)],
166
+ i,
167
+ )
168
+ else:
169
+ assert sgx.verify_secret_share_v2(
170
+ hexed_vv[j],
171
+ key_names[i],
172
+ secret_key_contributions[j][192*i:192*(i + 1)],
173
+ i,
174
+ )
175
+ dkg_sleep()
176
+
177
+ for i in range(n):
178
+ poly_name = active_poly_names[i] if i in active_node_ids else None
179
+ if i == joining_node_id:
180
+ assert poly_name is None
181
+ bls_key_name = get_bls_key_name(i, random_dkg_id)
182
+ assert sgx.create_bls_private_key_v3(
183
+ poly_name,
184
+ bls_key_name,
185
+ key_names[i],
186
+ [
187
+ {
188
+ 'contributorIndex': active_node_ids[j],
189
+ 'secretShare': secret_key_contributions[j][192*i:192*(i + 1)],
190
+ }
191
+ for j in range(len(active_node_ids))
192
+ ],
193
+ )
194
+
195
+ public_key = sgx.get_bls_public_key(bls_key_name)
196
+ assert len(public_key) == 4
197
+ assert all(len(point) > 0 for point in public_key)
198
+ assert_bls_signature(sgx, bls_key_name)
199
+ dkg_sleep()
200
+
201
+
39
202
  def perform_complaint(sgx, t, poly_name, public_key, corrupted_secret_key_contribution):
40
203
  response = sgx.complaint_response(poly_name, 1)
41
204
  share, dh_key = response.share, response.dh_key
@@ -59,14 +222,10 @@ def perform_complaint(sgx, t, poly_name, public_key, corrupted_secret_key_contri
59
222
 
60
223
 
61
224
  def perform_dkg(t, n, with_0x=True, with_v2=True, with_complaint=False, with_zmq=False):
62
- sgx = None
63
- if not with_zmq:
64
- sgx = SgxClient(os.environ['SERVER'], path_to_cert=os.environ.get('CERT_PATH'), n=n, t=t)
65
- else:
66
- sgx = SgxClient(os.environ['SERVER'], path_to_cert=os.environ.get('CERT_PATH'),
67
- n=n, t=t, zmq=True).zmq
225
+ sgx = get_sgx_client(n, t, with_zmq=with_zmq)
68
226
 
69
227
  public_keys = []
228
+ generated_public_keys = []
70
229
  key_name = []
71
230
 
72
231
  random_dkg_id = random.randint(0, 10**50)
@@ -77,55 +236,27 @@ def perform_dkg(t, n, with_0x=True, with_v2=True, with_complaint=False, with_zmq
77
236
  public_keys.append(generated_key.public_key)
78
237
  else:
79
238
  public_keys.append(generated_key.public_key[2:])
239
+ generated_public_keys.append(generated_key.public_key)
80
240
  key_name.append(generated_key.name)
81
- sleep(1)
241
+ dkg_sleep()
82
242
 
83
243
  for i in range(n):
84
- poly_name = (
85
- "POLY:SCHAIN_ID:"
86
- f"{str(0)}"
87
- ":NODE_ID:"
88
- f"{str(i)}"
89
- ":DKG_ID:"
90
- f"{str(random_dkg_id)}"
91
- )
92
- from sgx.sgx_rpc_handler import DkgPolyStatus
244
+ poly_name = get_poly_name(i, random_dkg_id)
93
245
  response = sgx.generate_dkg_poly(poly_name)
94
- if response == DkgPolyStatus.FAIL:
95
- raise TypeError("failed generate dkg poly for " + str(i))
96
- sleep(5)
246
+ assert_new_dkg_poly(response, i)
247
+ dkg_sleep()
97
248
 
98
249
  verification_vector = []
99
250
  for i in range(n):
100
- poly_name = (
101
- "POLY:SCHAIN_ID:"
102
- f"{str(0)}"
103
- ":NODE_ID:"
104
- f"{str(i)}"
105
- ":DKG_ID:"
106
- f"{str(random_dkg_id)}"
107
- )
251
+ poly_name = get_poly_name(i, random_dkg_id)
108
252
  verification_vector.append(sgx.get_verification_vector(poly_name))
109
- sleep(5)
253
+ dkg_sleep()
110
254
 
111
- hexed_vv = []
112
-
113
- for vv in verification_vector:
114
- cur_hexed = ""
115
- for elem in vv:
116
- cur_hexed += convert_g2_point_to_hex(elem)
117
- hexed_vv.append(cur_hexed)
255
+ hexed_vv = hex_verification_vectors(verification_vector)
118
256
 
119
257
  secret_key_contribution = []
120
258
  for i in range(n):
121
- poly_name = (
122
- "POLY:SCHAIN_ID:"
123
- f"{str(0)}"
124
- ":NODE_ID:"
125
- f"{str(i)}"
126
- ":DKG_ID:"
127
- f"{str(random_dkg_id)}"
128
- )
259
+ poly_name = get_poly_name(i, random_dkg_id)
129
260
 
130
261
  if with_v2:
131
262
  secret_key_contribution.append(
@@ -134,7 +265,7 @@ def perform_dkg(t, n, with_0x=True, with_v2=True, with_complaint=False, with_zmq
134
265
  print("KEYS", public_keys)
135
266
  secret_key_contribution.append(
136
267
  sgx.get_secret_key_contribution(poly_name, public_keys))
137
- sleep(5)
268
+ dkg_sleep()
138
269
 
139
270
  if not with_complaint:
140
271
  for i in range(n):
@@ -145,34 +276,21 @@ def perform_dkg(t, n, with_0x=True, with_v2=True, with_complaint=False, with_zmq
145
276
  key_name[i],
146
277
  secret_key_contribution[j][192*i:192*(i + 1)], i):
147
278
  raise ValueError(f'{i} failed to verify {j}')
148
- sleep(5)
279
+ dkg_sleep()
149
280
  else:
150
281
  if not sgx.verify_secret_share(
151
282
  hexed_vv[j],
152
283
  key_name[i],
153
284
  secret_key_contribution[j][192*i:192*(i + 1)], i):
154
285
  raise ValueError(f'{i} failed to verify {j}')
155
- sleep(5)
286
+ dkg_sleep()
156
287
 
157
- public_keys = sgx.calculate_all_bls_public_keys(hexed_vv)
288
+ calculated_bls_public_keys = sgx.calculate_all_bls_public_keys(hexed_vv)
289
+ bls_key_names = []
158
290
 
159
291
  for i in range(n):
160
- poly_name = (
161
- "POLY:SCHAIN_ID:"
162
- f"{str(0)}"
163
- ":NODE_ID:"
164
- f"{str(i)}"
165
- ":DKG_ID:"
166
- f"{str(random_dkg_id)}"
167
- )
168
- bls_key_name = (
169
- "BLS_KEY:SCHAIN_ID:"
170
- f"{str(0)}"
171
- ":NODE_ID:"
172
- f"{str(i)}"
173
- ":DKG_ID:"
174
- f"{str(random_dkg_id)}"
175
- )
292
+ poly_name = get_poly_name(i, random_dkg_id)
293
+ bls_key_name = get_bls_key_name(i, random_dkg_id)
176
294
 
177
295
  if with_v2:
178
296
  sgx.create_bls_private_key_v2(
@@ -186,29 +304,21 @@ def perform_dkg(t, n, with_0x=True, with_v2=True, with_complaint=False, with_zmq
186
304
  bls_key_name,
187
305
  key_name[i],
188
306
  "".join(secret_key_contribution[j][192*i:192*(i + 1)] for j in range(n)))
307
+ bls_key_names.append(bls_key_name)
189
308
 
190
309
  public_key = sgx.get_bls_public_key(bls_key_name)
191
310
 
192
- assert ":".join(public_key) == public_keys[i]
311
+ assert ":".join(public_key) == calculated_bls_public_keys[i]
193
312
 
194
- message = secrets.token_hex(32)
313
+ assert_bls_signature(sgx, bls_key_name)
314
+ dkg_sleep()
195
315
 
196
- signature_share = sgx.bls_sign(bls_key_name, message)
197
- splitted_signature = signature_share.split(':')
198
- assert len(splitted_signature) == 4
199
-
200
- assert len(splitted_signature[0]) > 0
201
- assert len(splitted_signature[0]) < 78
202
-
203
- assert len(splitted_signature[1]) > 0
204
- assert len(splitted_signature[1]) < 78
205
-
206
- assert len(splitted_signature[2]) > 0
207
- assert len(splitted_signature[2]) < 78
208
-
209
- assert int(splitted_signature[3]) < 1000
210
-
211
- sleep(5)
316
+ return {
317
+ 'sgx': sgx,
318
+ 'public_keys': generated_public_keys,
319
+ 'key_names': key_name,
320
+ 'bls_key_names': bls_key_names,
321
+ }
212
322
  else:
213
323
  corrupted_secret_key_contribution = secret_key_contribution[0]
214
324
  secret_key_contribution[0] = secret_key_contribution[1]
@@ -237,16 +347,9 @@ def perform_dkg(t, n, with_0x=True, with_v2=True, with_complaint=False, with_zmq
237
347
  hexed_vv[j],
238
348
  key_name[i],
239
349
  secret_key_contribution[j][192*i:192*(i + 1)], i)
240
- sleep(5)
350
+ dkg_sleep()
241
351
 
242
- poly_name = (
243
- "POLY:SCHAIN_ID:"
244
- f"{str(0)}"
245
- ":NODE_ID:"
246
- f"{str(0)}"
247
- ":DKG_ID:"
248
- f"{str(random_dkg_id)}"
249
- )
352
+ poly_name = get_poly_name(0, random_dkg_id)
250
353
  perform_complaint(
251
354
  sgx,
252
355
  t,
@@ -409,6 +512,12 @@ def test_dkg_zmq():
409
512
  print("TEST DKG WITH ZMQ PASSED")
410
513
 
411
514
 
515
+ def test_dkg_v3():
516
+ perform_dkg_v3(3, 4)
517
+ perform_dkg_v3(3, 4, with_zmq=True)
518
+ print("TEST DKG V3 PASSED")
519
+
520
+
412
521
  def test_dkg_complaint():
413
522
  perform_dkg(2, 2, with_complaint=True)
414
523
  perform_dkg(2, 2, with_v2=False, with_complaint=True, with_zmq=True)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes