Rev445, Fix and test random fail in CryptMessage decrypt

This commit is contained in:
shortcutme 2020-02-18 15:28:14 +01:00
parent 8aa4e27938
commit 64e5e0c80e
No known key found for this signature in database
GPG Key ID: 5B63BAE6CB9613AE
3 changed files with 39 additions and 7 deletions

View File

@ -1,13 +1,13 @@
import hashlib import hashlib
import base64 import base64
import binascii import struct
import lib.pybitcointools as btctools import lib.pybitcointools as btctools
from util import ThreadPool
from Crypt import Crypt from Crypt import Crypt
ecc_cache = {} ecc_cache = {}
def eciesEncrypt(data, pubkey, ephemcurve=None, ciphername='aes-256-cbc'): def eciesEncrypt(data, pubkey, ephemcurve=None, ciphername='aes-256-cbc'):
from lib import pyelliptic from lib import pyelliptic
pubkey_openssl = toOpensslPublickey(base64.b64decode(pubkey)) pubkey_openssl = toOpensslPublickey(base64.b64decode(pubkey))
@ -32,7 +32,7 @@ def eciesDecryptMulti(encrypted_datas, privatekey):
try: try:
text = eciesDecrypt(encrypted_data, privatekey).decode("utf8") text = eciesDecrypt(encrypted_data, privatekey).decode("utf8")
texts.append(text) texts.append(text)
except: except Exception:
texts.append(None) texts.append(None)
return texts return texts
@ -41,9 +41,26 @@ def eciesDecrypt(encrypted_data, privatekey):
ecc_key = getEcc(privatekey) ecc_key = getEcc(privatekey)
return ecc_key.decrypt(base64.b64decode(encrypted_data)) return ecc_key.decrypt(base64.b64decode(encrypted_data))
def decodePubkey(pubkey):
i = 0
curve = struct.unpack('!H', pubkey[i:i + 2])[0]
i += 2
tmplen = struct.unpack('!H', pubkey[i:i + 2])[0]
i += 2
pubkey_x = pubkey[i:i + tmplen]
i += tmplen
tmplen = struct.unpack('!H', pubkey[i:i + 2])[0]
i += 2
pubkey_y = pubkey[i:i + tmplen]
i += tmplen
return curve, pubkey_x, pubkey_y, i
def split(encrypted): def split(encrypted):
iv = encrypted[0:16] iv = encrypted[0:16]
ciphertext = encrypted[16 + 70:-32] curve, pubkey_x, pubkey_y, i = decodePubkey(encrypted[16:])
ciphertext = encrypted[16 + i:-32]
return iv, ciphertext return iv, ciphertext

View File

@ -57,12 +57,12 @@ class TestCrypt:
assert decrypted != "hello" assert decrypted != "hello"
# Decrypt using correct privatekey # Decrypt using correct privatekey
decrypted = ui_websocket.testAction("EciesDecrypt", encrypted) decrypted = ui_websocket.testAction("EciesDecrypt", encrypted)
assert decrypted == "hello" assert decrypted == "hello"
# Decrypt incorrect text # Decrypt incorrect text
decrypted = ui_websocket.testAction("EciesDecrypt", "baad") decrypted = ui_websocket.testAction("EciesDecrypt", "baad")
assert decrypted == None assert decrypted is None
# Decrypt batch # Decrypt batch
decrypted = ui_websocket.testAction("EciesDecrypt", [encrypted, "baad", encrypted]) decrypted = ui_websocket.testAction("EciesDecrypt", [encrypted, "baad", encrypted])
@ -90,6 +90,21 @@ class TestCrypt:
ui_websocket.actionAesDecrypt(0, base64.b64encode(aes_iv), base64.b64encode(aes_encrypted), aes_key) ui_websocket.actionAesDecrypt(0, base64.b64encode(aes_iv), base64.b64encode(aes_encrypted), aes_key)
assert ui_websocket.ws.getResult() == "hello" assert ui_websocket.ws.getResult() == "hello"
def testEciesAesLongpubkey(self, ui_websocket):
privatekey = "5HwVS1bTFnveNk9EeGaRenWS1QFzLFb5kuncNbiY3RiHZrVR6ok"
ecies_encrypted, aes_key = ["lWiXfEikIjw1ac3J/RaY/gLKACALRUfksc9rXYRFyKDSaxhwcSFBYCgAdIyYlY294g/6VgAf/68PYBVMD3xKH1n7Zbo+ge8b4i/XTKmCZRJvy0eutMKWckYCMVcxgIYNa/ZL1BY1kvvH7omgzg1wBraoLfdbNmVtQgdAZ9XS8PwRy6OB2Q==", "Rvlf7zsMuBFHZIGHcbT1rb4If+YTmsWDv6kGwcvSeMM="]
# Decrypt using Ecies
ui_websocket.actionEciesDecrypt(0, ecies_encrypted, privatekey)
assert ui_websocket.ws.getResult() == "hello"
# Decrypt using AES
aes_iv, aes_encrypted = CryptMessage.split(base64.b64decode(ecies_encrypted))
ui_websocket.actionAesDecrypt(0, base64.b64encode(aes_iv), base64.b64encode(aes_encrypted), aes_key)
assert ui_websocket.ws.getResult() == "hello"
def testAes(self, ui_websocket): def testAes(self, ui_websocket):
ui_websocket.actionAesEncrypt(0, "hello") ui_websocket.actionAesEncrypt(0, "hello")
key, iv, encrypted = ui_websocket.ws.getResult() key, iv, encrypted = ui_websocket.ws.getResult()

View File

@ -13,7 +13,7 @@ class Config(object):
def __init__(self, argv): def __init__(self, argv):
self.version = "0.7.1" self.version = "0.7.1"
self.rev = 4411 self.rev = 4445
self.argv = argv self.argv = argv
self.action = None self.action = None
self.test_parser = None self.test_parser = None