Changeset View
Changeset View
Standalone View
Standalone View
share/rpcauth/rpcauth.py
Show All 12 Lines | |||||
def generate_salt(size): | def generate_salt(size): | ||||
"""Create size byte hex salt""" | """Create size byte hex salt""" | ||||
return hexlify(urandom(size)).decode() | return hexlify(urandom(size)).decode() | ||||
def generate_password(): | def generate_password(): | ||||
"""Create 32 byte b64 password""" | """Create 32 byte b64 password""" | ||||
return urlsafe_b64encode(urandom(32)).decode('utf-8') | return urlsafe_b64encode(urandom(32)).decode("utf-8") | ||||
def password_to_hmac(salt, password): | def password_to_hmac(salt, password): | ||||
m = hmac.new(bytearray(salt, 'utf-8'), | m = hmac.new(bytearray(salt, "utf-8"), bytearray(password, "utf-8"), "SHA256") | ||||
bytearray(password, 'utf-8'), 'SHA256') | |||||
return m.hexdigest() | return m.hexdigest() | ||||
def main(): | def main(): | ||||
parser = ArgumentParser( | parser = ArgumentParser(description="Create login credentials for a JSON-RPC user") | ||||
description='Create login credentials for a JSON-RPC user') | parser.add_argument("username", help="the username for authentication") | ||||
parser.add_argument('username', help='the username for authentication') | |||||
parser.add_argument( | parser.add_argument( | ||||
'password', help='leave empty to generate a random password or specify "-" to prompt for password', nargs='?') | "password", | ||||
help=( | |||||
'leave empty to generate a random password or specify "-" to prompt for' | |||||
" password" | |||||
), | |||||
nargs="?", | |||||
) | |||||
args = parser.parse_args() | args = parser.parse_args() | ||||
if not args.password: | if not args.password: | ||||
args.password = generate_password() | args.password = generate_password() | ||||
elif args.password == '-': | elif args.password == "-": | ||||
args.password = getpass() | args.password = getpass() | ||||
# Create 16 byte hex salt | # Create 16 byte hex salt | ||||
salt = generate_salt(16) | salt = generate_salt(16) | ||||
password_hmac = password_to_hmac(salt, args.password) | password_hmac = password_to_hmac(salt, args.password) | ||||
print('String to be appended to bitcoin.conf:') | print("String to be appended to bitcoin.conf:") | ||||
print(f'rpcauth={args.username}:{salt}${password_hmac}') | print(f"rpcauth={args.username}:{salt}${password_hmac}") | ||||
print(f'Your password:\n{args.password}') | print(f"Your password:\n{args.password}") | ||||
if __name__ == '__main__': | if __name__ == "__main__": | ||||
main() | main() |