Skip to content

Commit 799237c

Browse files
g1itchLee Miller
authored andcommitted
Don't use BMConfigParser in highlevelcrypto, instead use digestAlg kwarg,
both in .sign() and .verify(), extend TestHighlevelcrypto.test_signatures().
1 parent fd3567b commit 799237c

File tree

3 files changed

+46
-34
lines changed

3 files changed

+46
-34
lines changed

src/class_singleWorker.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class singleWorker(StoppableThread):
5050

5151
def __init__(self):
5252
super(singleWorker, self).__init__(name="singleWorker")
53+
self.digestAlg = config.safeGet(
54+
'bitmessagesettings', 'digestalg', 'sha256')
5355
proofofwork.init()
5456

5557
def stopThread(self):
@@ -368,7 +370,8 @@ def sendOutOrStoreMyV3Pubkey(self, adressHash):
368370
payload += encodeVarint(config.getint(
369371
myAddress, 'payloadlengthextrabytes'))
370372

371-
signature = highlevelcrypto.sign(payload, privSigningKeyHex)
373+
signature = highlevelcrypto.sign(
374+
payload, privSigningKeyHex, self.digestAlg)
372375
payload += encodeVarint(len(signature))
373376
payload += signature
374377

@@ -455,8 +458,7 @@ def sendOutOrStoreMyV4Pubkey(self, myAddress):
455458
).digest()).digest()
456459
payload += doubleHashOfAddressData[32:] # the tag
457460
signature = highlevelcrypto.sign(
458-
payload + dataToEncrypt, privSigningKeyHex
459-
)
461+
payload + dataToEncrypt, privSigningKeyHex, self.digestAlg)
460462
dataToEncrypt += encodeVarint(len(signature))
461463
dataToEncrypt += signature
462464

@@ -641,7 +643,7 @@ def sendBroadcast(self):
641643
dataToSign = payload + dataToEncrypt
642644

643645
signature = highlevelcrypto.sign(
644-
dataToSign, privSigningKeyHex)
646+
dataToSign, privSigningKeyHex, self.digestAlg)
645647
dataToEncrypt += encodeVarint(len(signature))
646648
dataToEncrypt += signature
647649

@@ -1223,7 +1225,8 @@ def sendMsg(self):
12231225
payload += fullAckPayload
12241226
dataToSign = pack('>Q', embeddedTime) + '\x00\x00\x00\x02' + \
12251227
encodeVarint(1) + encodeVarint(toStreamNumber) + payload
1226-
signature = highlevelcrypto.sign(dataToSign, privSigningKeyHex)
1228+
signature = highlevelcrypto.sign(
1229+
dataToSign, privSigningKeyHex, self.digestAlg)
12271230
payload += encodeVarint(len(signature))
12281231
payload += signature
12291232

src/highlevelcrypto.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from pyelliptic import OpenSSL
1414
from pyelliptic import arithmetic as a
1515

16-
from bmconfigparser import config
1716

1817
__all__ = ['encrypt', 'makeCryptor', 'pointMult', 'privToPub', 'sign', 'verify']
1918

@@ -64,43 +63,44 @@ def decryptFast(msg, cryptor):
6463
return cryptor.decrypt(msg)
6564

6665

67-
def sign(msg, hexPrivkey):
66+
def _choose_digest_alg(name):
6867
"""
69-
Signs with hex private key using SHA1 or SHA256 depending on
70-
"digestalg" setting
68+
Choose openssl digest constant by name raises ValueError if not appropriate
7169
"""
72-
digestAlg = config.safeGet(
73-
'bitmessagesettings', 'digestalg', 'sha256')
74-
if digestAlg == "sha1":
70+
if name not in ("sha1", "sha256"):
71+
raise ValueError("Unknown digest algorithm %s" % name)
72+
return (
7573
# SHA1, this will eventually be deprecated
76-
return makeCryptor(hexPrivkey).sign(
77-
msg, digest_alg=OpenSSL.digest_ecdsa_sha1)
78-
elif digestAlg == "sha256":
79-
# SHA256. Eventually this will become the default
80-
return makeCryptor(hexPrivkey).sign(msg, digest_alg=OpenSSL.EVP_sha256)
81-
else:
82-
raise ValueError("Unknown digest algorithm %s" % digestAlg)
74+
OpenSSL.digest_ecdsa_sha1 if name == "sha1" else OpenSSL.EVP_sha256)
75+
8376

77+
def sign(msg, hexPrivkey, digestAlg="sha256"):
78+
"""
79+
Signs with hex private key using SHA1 or SHA256 depending on
80+
*digestAlg* keyword.
81+
"""
82+
return makeCryptor(hexPrivkey).sign(
83+
msg, digest_alg=_choose_digest_alg(digestAlg))
8484

85-
def verify(msg, sig, hexPubkey):
85+
86+
def verify(msg, sig, hexPubkey, digestAlg=None):
8687
"""Verifies with hex public key using SHA1 or SHA256"""
8788
# As mentioned above, we must upgrade gracefully to use SHA256. So
8889
# let us check the signature using both SHA1 and SHA256 and if one
8990
# of them passes then we will be satisfied. Eventually this can
9091
# be simplified and we'll only check with SHA256.
91-
try:
92+
if digestAlg is None:
9293
# old SHA1 algorithm.
93-
sigVerifyPassed = makePubCryptor(hexPubkey).verify(
94-
sig, msg, digest_alg=OpenSSL.digest_ecdsa_sha1)
95-
except:
96-
sigVerifyPassed = False
97-
if sigVerifyPassed:
98-
# The signature check passed using SHA1
99-
return True
100-
# The signature check using SHA1 failed. Let us try it with SHA256.
94+
sigVerifyPassed = verify(msg, sig, hexPubkey, "sha1")
95+
if sigVerifyPassed:
96+
# The signature check passed using SHA1
97+
return True
98+
# The signature check using SHA1 failed. Let us try it with SHA256.
99+
return verify(msg, sig, hexPubkey, "sha256")
100+
101101
try:
102102
return makePubCryptor(hexPubkey).verify(
103-
sig, msg, digest_alg=OpenSSL.EVP_sha256)
103+
sig, msg, digest_alg=_choose_digest_alg(digestAlg))
104104
except:
105105
return False
106106

src/tests/test_crypto.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,21 @@ def test_signatures(self):
7070
"""Verify sample signatures and newly generated ones"""
7171
pubkey_hex = hexlify(sample_pubsigningkey)
7272
# pregenerated signatures
73+
self.assertTrue(highlevelcrypto.verify(
74+
sample_msg, sample_sig, pubkey_hex, "sha256"))
75+
self.assertFalse(highlevelcrypto.verify(
76+
sample_msg, sample_sig, pubkey_hex, "sha1"))
77+
self.assertTrue(highlevelcrypto.verify(
78+
sample_msg, sample_sig_sha1, pubkey_hex, "sha1"))
79+
self.assertTrue(highlevelcrypto.verify(
80+
sample_msg, sample_sig_sha1, pubkey_hex))
81+
# new signatures
82+
sig256 = highlevelcrypto.sign(sample_msg, sample_privsigningkey)
83+
sig1 = highlevelcrypto.sign(sample_msg, sample_privsigningkey, "sha1")
7384
self.assertTrue(
74-
highlevelcrypto.verify(sample_msg, sample_sig, pubkey_hex))
85+
highlevelcrypto.verify(sample_msg, sig256, pubkey_hex))
7586
self.assertTrue(
76-
highlevelcrypto.verify(sample_msg, sample_sig_sha1, pubkey_hex))
77-
# new signature
78-
sig1 = highlevelcrypto.sign(sample_msg, sample_privsigningkey)
87+
highlevelcrypto.verify(sample_msg, sig256, pubkey_hex, "sha256"))
7988
self.assertTrue(
8089
highlevelcrypto.verify(sample_msg, sig1, pubkey_hex))
8190

0 commit comments

Comments
 (0)