3
3
from p2p_python .serializer import dumps
4
4
from p2p_python .tool .traffic import Traffic
5
5
from p2p_python .tool .utils import AESCipher
6
- from nem_ed25519_rust import generate_keypair , encrypt , decrypt
6
+ from ecdsa .keys import SigningKey , VerifyingKey
7
+ from ecdsa .curves import NIST256p
7
8
from threading import Thread , current_thread , RLock , Event
8
9
from typing import Optional , List
9
10
from logging import getLogger
10
11
from binascii import a2b_hex
11
12
from time import time , sleep
12
13
from queue import Queue
13
14
from io import BytesIO
15
+ from hashlib import sha256
14
16
import selectors
15
17
import json
16
18
import random
@@ -154,17 +156,16 @@ def create_connection(self, host, port):
154
156
raise PeerToPeerError ('timeout on public key receive' )
155
157
except json .JSONDecodeError :
156
158
raise PeerToPeerError ('json decode error on public key receive' )
157
- other_pk = msg ['public-key' ]
158
- other_pub = a2b_hex (other_pk )
159
159
# 4. send public key
160
- send = json .dumps ({'public-key' : my_pub . hex () }).encode ()
160
+ send = json .dumps ({'public-key' : my_pub }).encode ()
161
161
sock .sendall (send )
162
162
self .traffic .put_traffic_up (send )
163
163
# 5. Get AES key and header and decrypt
164
164
try :
165
165
receive = sock .recv (self .buffsize )
166
166
self .traffic .put_traffic_down (receive )
167
- dec = decrypt (my_sec , other_pub , receive )
167
+ key = generate_shared_key (my_sec , msg ['public-key' ])
168
+ dec = AESCipher .decrypt (key , receive )
168
169
data = json .loads (dec .decode ())
169
170
except socket .timeout :
170
171
raise PeerToPeerError ('timeout on AES key and header receive' )
@@ -298,7 +299,7 @@ def initial_connection_check(self, sock, host_port):
298
299
raise ConnectionAbortedError ('Same origin connection.' )
299
300
# 4. send my public key
300
301
my_sec , my_pub = generate_keypair ()
301
- send = json .dumps ({'public-key' : my_pub . hex () }).encode ()
302
+ send = json .dumps ({'public-key' : my_pub }).encode ()
302
303
sock .sendall (send )
303
304
self .traffic .put_traffic_up (send )
304
305
# 5. receive public key
@@ -312,13 +313,13 @@ def initial_connection_check(self, sock, host_port):
312
313
raise PeerToPeerError ('timeout on public key receive' )
313
314
except json .JSONDecodeError :
314
315
raise PeerToPeerError ('json decode error on public key receive' )
315
- other_pub = a2b_hex (data ['public-key' ])
316
316
# 6. encrypt and send AES key and header
317
317
send = json .dumps ({
318
318
'aes-key' : new_user .aeskey ,
319
319
'header' : self .get_server_header (),
320
320
})
321
- encrypted = encrypt (my_sec , other_pub , send .encode ())
321
+ key = generate_shared_key (my_sec , data ['public-key' ])
322
+ encrypted = AESCipher .encrypt (key , send .encode ())
322
323
sock .send (encrypted )
323
324
self .traffic .put_traffic_up (encrypted )
324
325
# 7. receive accept signal
@@ -514,6 +515,22 @@ def host_port2user(self, host_port) -> Optional[User]:
514
515
return None
515
516
516
517
518
+ """ECDH functions
519
+ """
520
+
521
+
522
+ def generate_shared_key (sk , vk_str ) -> bytes :
523
+ vk = VerifyingKey .from_string (a2b_hex (vk_str ), NIST256p )
524
+ point = sk .privkey .secret_multiplier * vk .pubkey .point
525
+ return sha256 (point .x ().to_bytes (32 , 'big' )).digest ()
526
+
527
+
528
+ def generate_keypair () -> (SigningKey , str ):
529
+ sk = SigningKey .generate (NIST256p )
530
+ vk = sk .get_verifying_key ()
531
+ return sk , vk .to_string ().hex ()
532
+
533
+
517
534
"""socket connection functions
518
535
"""
519
536
0 commit comments