stub files work, keyed hash works

This commit is contained in:
Christoph J. Scherr 2023-04-25 19:36:56 +02:00
parent 596010bb8e
commit d6f505e768
Signed by: PlexSheep
GPG Key ID: 25B4ACF7D88186CC
9 changed files with 37 additions and 9 deletions

View File

@ -9,9 +9,12 @@ Since this (auth) hash did not have a name before, I gave it the name 'authur1'
@source: https://git.cscherr.de/PlexSheep/python-dhbw/src/branch/master/src/authur1.py @source: https://git.cscherr.de/PlexSheep/python-dhbw/src/branch/master/src/authur1.py
""" """
import argparse import argparse
from sre_constants import IN_UNI_IGNORE import random
# FIXME make proper pyi Implementation for the rust part # FIXME make proper pyi Implementation for the rust part
# only used for bit rotation
# your editor might complain here, because it can only find a pyi file with type annotations.
# restassured, you just need to compile the rust part with maturin develop and you will be fine.
from plexcryptool import binary from plexcryptool import binary
# constants for authur1 # constants for authur1
@ -100,7 +103,7 @@ def test():
print("Q aka inner_authur1 passed the test") print("Q aka inner_authur1 passed the test")
ha = authur1(bytearray(0), True) ha = authur1(bytearray(0))
hb = authur1(bytearray(b'A')) hb = authur1(bytearray(b'A'))
hc = authur1(bytearray(b'AB')) hc = authur1(bytearray(b'AB'))
hd = authur1(bytearray(b'ABC')) hd = authur1(bytearray(b'ABC'))
@ -116,24 +119,51 @@ def test():
print("H aka authur1 passed the test") print("H aka authur1 passed the test")
print("All tests passed!") print("All tests passed!")
def keyed_hash(message: bytearray, key: bytearray) -> bytearray:
assert len(key) == 16, "key is not 16 Byte long: %s" % len(key)
input: bytearray = key + message
mic = authur1(input)
return mic
def main(): def main():
parser = argparse.ArgumentParser(prog="authur1 authentication hash", description='Implementation and attack for the custom authur1 hash') parser = argparse.ArgumentParser(prog="authur1 authentication hash", description='Implementation and attack for the custom authur1 hash. Don\'t actually use this hash!')
parser.add_argument('-i', '--hash', type=str, parser.add_argument('-i', '--hash', type=str,
help='an input that should be hashed') help='an input that should be hashed')
parser.add_argument('-k', '--key', type=str,
help='an key that should be used with auth mode')
parser.add_argument('-t', '--test', action="store_true", parser.add_argument('-t', '--test', action="store_true",
help='perform tests') help='perform tests')
parser.add_argument('-v', '--verbose', action="store_true", parser.add_argument('-v', '--verbose', action="store_true",
help='print many things') help='print many things')
parser.add_argument('-a', '--auth', action="store_true",
help='generate a message integrity code (mic), needs a value to be hashed. If no key is specified, a random key will be generated.')
args = parser.parse_args() args = parser.parse_args()
if args.hash: if args.test:
test()
exit()
elif args.auth and args.hash:
if args.key:
key = bytearray(args.key.encode())
if len(key) < 16:
print("Your key is not long enough and will be padded with random bytes.")
key.extend(random.randbytes(16 - len(key)))
elif len(key) > 16:
print("Your key is too long!")
exit()
else:
key = bytearray(random.randbytes(16))
my_bytes: bytearray = bytearray(str.encode(args.hash))
mic: bytearray = keyed_hash(my_bytes, key)
print("KEY (str): %s" % key.decode(errors="replace"))
print("KEY (hex): %s" % key.hex())
print("MIC: %s" % mic.hex())
exit()
elif args.hash:
my_bytes: bytearray = bytearray(str.encode(args.hash)) my_bytes: bytearray = bytearray(str.encode(args.hash))
hashed = authur1(my_bytes, args.verbose) hashed = authur1(my_bytes, args.verbose)
print("hash for \"%s\" is:\n%s" % (args.hash, hashed.hex())) print("hash for \"%s\" is:\n%s" % (args.hash, hashed.hex()))
exit() exit()
elif args.test:
test()
exit()
parser.print_help() parser.print_help()
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -3,4 +3,3 @@ Bindings for the plexcryptool rust library
plexcryptool.plexcryptool is direct access to the shared library, do not use it. plexcryptool.plexcryptool is direct access to the shared library, do not use it.
""" """
from .plexcryptool import *

View File

@ -14,4 +14,3 @@ classifiers = [
[tool.maturin] [tool.maturin]
features = ["pyo3/extension-module"] features = ["pyo3/extension-module"]
python-source = "src-py"