Merge branch 'py3-internal' into zeronet-enhanced

This commit is contained in:
canewsin 2022-01-06 12:39:44 +05:30
commit b39a1a5f1b
5 changed files with 42 additions and 20 deletions

@ -1 +1 @@
Subproject commit 5c22d54984363d425d9f7b6aabbf1a871e7e60a1 Subproject commit 7bb1715ce030352ff46ddd43ad58b7ab90ef978b

View file

@ -4,14 +4,17 @@ import hashlib
def sign(data, privatekey): def sign(data, privatekey):
import rsa import rsa
from rsa import pkcs1 from rsa import pkcs1
from Crypt import CryptEd25519 from lib import Ed25519
## v3 = 88
## Onion Service V3
if len(privatekey) == 88: if len(privatekey) == 88:
prv_key = base64.b64decode(privatekey) prv_key = base64.b64decode(privatekey)
pub_key = CryptEd25519.publickey_unsafe(prv_key) pub_key = Ed25519.publickey_unsafe(prv_key)
sign = CryptEd25519.signature_unsafe(data, prv_key, pub_key) sign = Ed25519.signature_unsafe(data, prv_key, pub_key)
return sign return sign
## Onion Service V2
if "BEGIN RSA PRIVATE KEY" not in privatekey: if "BEGIN RSA PRIVATE KEY" not in privatekey:
privatekey = "-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----" % privatekey privatekey = "-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----" % privatekey
@ -22,44 +25,61 @@ def sign(data, privatekey):
def verify(data, publickey, sign): def verify(data, publickey, sign):
import rsa import rsa
from rsa import pkcs1 from rsa import pkcs1
from Crypt import CryptEd25519 from lib import Ed25519
## Onion Service V3
if len(publickey) == 32: if len(publickey) == 32:
try: try:
valid = CryptEd25519.checkvalid(sign, data, publickey) valid = Ed25519.checkvalid(sign, data, publickey)
valid = 'SHA-256' valid = 'SHA-256'
except Exception as err: except Exception as err:
print(err) print(err)
valid = False valid = False
return valid return valid
## Onion Service V2
pub = rsa.PublicKey.load_pkcs1(publickey, format="DER") pub = rsa.PublicKey.load_pkcs1(publickey, format="DER")
try: try:
valid = rsa.pkcs1.verify(data, sign, pub) valid = rsa.pkcs1.verify(data, sign, pub)
except pkcs1.VerificationError: except pkcs1.VerificationError:
valid = False valid = False
return valid return valid
def privatekeyToPublickey(privatekey): def privatekeyToPublickey(privatekey):
from Crypt import CryptEd25519
import rsa import rsa
from rsa import pkcs1 from rsa import pkcs1
from lib import Ed25519
## Onion Service V3
if len(privatekey) == 88: if len(privatekey) == 88:
prv_key = base64.b64decode(privatekey) prv_key = base64.b64decode(privatekey)
pub_key = CryptEd25519.publickey_unsafe(prv_key) pub_key = Ed25519.publickey_unsafe(prv_key)
return pub_key return pub_key
## Onion Service V2
if "BEGIN RSA PRIVATE KEY" not in privatekey: if "BEGIN RSA PRIVATE KEY" not in privatekey:
privatekey = "-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----" % privatekey privatekey = "-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----" % privatekey
priv = rsa.PrivateKey.load_pkcs1(privatekey) priv = rsa.PrivateKey.load_pkcs1(privatekey)
pub = rsa.PublicKey(priv.n, priv.e) pub = rsa.PublicKey(priv.n, priv.e)
return pub.save_pkcs1("DER") return pub.save_pkcs1("DER")
def publickeyToOnion(publickey): def publickeyToOnion(publickey):
from Crypt import CryptEd25519 from lib import Ed25519
## Onion Service V3
if len(publickey) == 32: if len(publickey) == 32:
addr = CryptEd25519.publickey_to_onionaddress(publickey)[:-6] addr = Ed25519.publickey_to_onionaddress(publickey)[:-6]
return addr return addr
## Onion Service V2
return base64.b32encode(hashlib.sha1(publickey).digest()[:10]).lower().decode("ascii") return base64.b32encode(hashlib.sha1(publickey).digest()[:10]).lower().decode("ascii")

View file

@ -4,7 +4,7 @@ import pytest
import mock import mock
from File import FileServer from File import FileServer
from Crypt import CryptRsa from Crypt import CryptTor
from Config import config from Config import config
@pytest.mark.usefixtures("resetSettings") @pytest.mark.usefixtures("resetSettings")
@ -34,17 +34,17 @@ class TestTor:
address = tor_manager.addOnion() address = tor_manager.addOnion()
# Sign # Sign
sign = CryptRsa.sign(b"hello", tor_manager.getPrivatekey(address)) sign = CryptTor.sign(b"hello", tor_manager.getPrivatekey(address))
assert len(sign) == 128 assert len(sign) == 128
# Verify # Verify
publickey = CryptRsa.privatekeyToPublickey(tor_manager.getPrivatekey(address)) publickey = CryptTor.privatekeyToPublickey(tor_manager.getPrivatekey(address))
assert len(publickey) == 140 assert len(publickey) == 140
assert CryptRsa.verify(b"hello", publickey, sign) assert CryptTor.verify(b"hello", publickey, sign)
assert not CryptRsa.verify(b"not hello", publickey, sign) assert not CryptTor.verify(b"not hello", publickey, sign)
# Pub to address # Pub to address
assert CryptRsa.publickeyToOnion(publickey) == address assert CryptTor.publickeyToOnion(publickey) == address
# Delete # Delete
tor_manager.delOnion(address) tor_manager.delOnion(address)

View file

@ -12,8 +12,10 @@ import atexit
import gevent import gevent
from Config import config from Config import config
from Crypt import CryptEd25519
from Crypt import CryptRsa from lib import Ed25519
from Crypt import CryptTor
from Site import SiteManager from Site import SiteManager
import socks import socks
from gevent.lock import RLock from gevent.lock import RLock
@ -272,7 +274,7 @@ class TorManager(object):
return self.privatekeys[address] return self.privatekeys[address]
def getPublickey(self, address): def getPublickey(self, address):
return CryptRsa.privatekeyToPublickey(self.privatekeys[address]) return CryptTor.privatekeyToPublickey(self.privatekeys[address])
def getOnion(self, site_address): def getOnion(self, site_address):
if not self.enabled: if not self.enabled: