Skip to content

Commit 6be7d14

Browse files
committed
Properly generate salt in rpcauth.py, update tests
Previously, when iterating over bytes of the generated salt to construct a hex string, only one character would be outputted when the byte is less than 0x10. Meaning that for a 16 byte salt, the hex string might be less than 32 characters and collisions would occur.
1 parent 3573997 commit 6be7d14

File tree

2 files changed

+9
-12
lines changed

2 files changed

+9
-12
lines changed

share/rpcauth/rpcauth.py

+6-9
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,13 @@
55

66
import sys
77
import os
8-
from random import SystemRandom
98
import base64
9+
from binascii import hexlify
1010
import hmac
1111

12-
def generate_salt():
13-
# This uses os.urandom() underneath
14-
cryptogen = SystemRandom()
15-
16-
# Create 16 byte hex salt
17-
salt_sequence = [cryptogen.randrange(256) for _ in range(16)]
18-
return ''.join([format(r, 'x') for r in salt_sequence])
12+
def generate_salt(size):
13+
"""Create size byte hex salt"""
14+
return hexlify(os.urandom(size)).decode()
1915

2016
def generate_password():
2117
"""Create 32 byte b64 password"""
@@ -32,7 +28,8 @@ def main():
3228

3329
username = sys.argv[1]
3430

35-
salt = generate_salt()
31+
# Create 16 byte hex salt
32+
salt = generate_salt(16)
3633
if len(sys.argv) > 2:
3734
password = sys.argv[2]
3835
else:

test/util/rpcauth-test.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ def setUp(self):
2424
self.rpcauth = importlib.import_module('rpcauth')
2525

2626
def test_generate_salt(self):
27-
self.assertLessEqual(len(self.rpcauth.generate_salt()), 32)
28-
self.assertGreaterEqual(len(self.rpcauth.generate_salt()), 16)
27+
for i in range(16, 32 + 1):
28+
self.assertEqual(len(self.rpcauth.generate_salt(i)), i * 2)
2929

3030
def test_generate_password(self):
3131
password = self.rpcauth.generate_password()
@@ -34,7 +34,7 @@ def test_generate_password(self):
3434
self.assertEqual(expected_password, password)
3535

3636
def test_check_password_hmac(self):
37-
salt = self.rpcauth.generate_salt()
37+
salt = self.rpcauth.generate_salt(16)
3838
password = self.rpcauth.generate_password()
3939
password_hmac = self.rpcauth.password_to_hmac(salt, password)
4040

0 commit comments

Comments
 (0)