changeset 184:6154b8e4ba94

Include some new algorithms: CRC
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 14 Jan 2025 11:26:38 +0100
parents 62436c255dc8
children f04d4b1c14b3
files cutils/util/__init__.py
diffstat 1 files changed, 58 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/cutils/util/__init__.py	Tue Jan 14 11:26:12 2025 +0100
+++ b/cutils/util/__init__.py	Tue Jan 14 11:26:38 2025 +0100
@@ -84,6 +84,17 @@
         return pyblake2.blake2s
 
 
+def get_crc(name):
+    """Get the factory for a CRC"""
+
+    from ..crcmod.predefined import PredefinedCrc
+
+    def _crc_type():
+        return PredefinedCrc(name)
+
+    return _crc_type
+
+
 def argv2algo(s):
     """Convert a command line algorithm specifier into a tuple with the
     type/factory of the digest and the algorithms tag for output purposes.
@@ -124,6 +135,35 @@
         return (get_blake2b_256(), "BLAKE2b-256")
     elif s == "md5":
         return (hashlib.md5, "MD5")
+    elif s in ("crc24", "crc-24",
+               "crc24-openpgp", "crc-24-openpgp"):
+        return (get_crc("crc-24"), "CRC-24")
+    elif s in ("crc32", "crc-32",
+               "crc32-pkzip", "crc-32-pkzip",
+               "crc32-iso", "crc-32-iso",
+               "crc32-iso-hdlc", "crc-32-iso-hdlc"):
+        return (get_crc("crc-32"), "CRC-32-ISO")
+    elif s in ("crc32-posix", "crc-32-posix",
+               "crc32-cksum", "crc-32-cksum",
+               "posix"):
+        return (get_crc("posix"), "CRC-32-POSIX")
+    elif s in ("crc64", "crc-64",
+               "crc64-iso", "crc-64-iso"):
+        return (get_crc("crc-64"), "CRC-64-ISO")
+    elif s in ("crc64-2", "crc-64-2",
+               "crc64-iso-2", "crc-64-iso-2",
+               "crc64-mcrc64", "crc-64-mcrc64"):
+        return (get_crc("crc-64-2"), "CRC-64-ISO-2")
+    elif s in ("crc64-ecma", "crc-64-ecma"):
+        return (get_crc("crc-64-ecma"), "CRC-64-ECMA")
+    elif s in ("crc64-xz", "crc-64-xz",
+               "crc64-go-ecma", "crc-64-go-ecma"):
+        return (get_crc("crc-64-xz"), "CRC-64-XZ")
+    elif s in ("crc64-go", "crc-64-go",
+               "crc64-go-iso", "crc-64-go-iso"):
+        return (get_crc("crc-64-go"), "CRC-64-GO-ISO")
+    elif s in ("crc64-redis", "crc-64-redis"):
+        return (get_crc("crc-64-redis"), "CRC-64-REDIS")    
     else:
         raise argparse.ArgumentTypeError(
             "`{}' is not a recognized algorithm".format(s))
@@ -166,6 +206,24 @@
         return get_blake2b_256()
     elif s == "MD5":
         return hashlib.md5
+    elif s == "CRC-24":
+        return get_crc("crc-24")
+    elif s == "CRC-32-ISO":
+        return get_crc("crc-32")
+    elif s == "CRC-32-POSIX":
+        return get_crc("posix")
+    elif s == "CRC-64-ISO":
+        return get_crc("crc-64")
+    elif s == "CRC-64-ISO-2":
+        return get_crc("crc-64-2")
+    elif s == "CRC-64-ECMA":
+        return get_crc("crc-64-ecma")
+    elif s == "CRC-64-XZ":
+        return get_crc("crc-64-xz")
+    elif s == "CRC-64-GO-ISO":
+        return get_crc("crc-64-go")
+    elif s == "CRC-64-REDIS":
+        return get_crc("crc-64-redis")    
     else:
         raise ValueError("unknown algorithm: {}".format(s))