|
| 1 | +# -*- coding: UTF-8 -*- |
| 2 | +"""Case Codecs - string hashing. |
| 3 | +
|
| 4 | +These are codecs for hashing strings, for use with other codecs in encoding chains. |
| 5 | +
|
| 6 | +These codecs: |
| 7 | +- transform strings from str to str |
| 8 | +- transform strings from bytes to bytes |
| 9 | +- transform file content from str to bytes (write) |
| 10 | +""" |
| 11 | +import hashlib |
| 12 | + |
| 13 | +from ..__common__ import add, b, PY3 |
| 14 | + |
| 15 | + |
| 16 | +# Python2/3-compatible hash functions |
| 17 | +add("md5", lambda s, error="strict": (hashlib.md5(b(s)).hexdigest(), len(s)), guess=None) |
| 18 | +add("sha1", lambda s, error="strict": (hashlib.sha1(b(s)).hexdigest(), len(s)), guess=None) |
| 19 | +add("sha224", lambda s, error="strict": (hashlib.sha224(b(s)).hexdigest(), len(s)), guess=None) |
| 20 | +add("sha256", lambda s, error="strict": (hashlib.sha256(b(s)).hexdigest(), len(s)), guess=None) |
| 21 | +add("sha384", lambda s, error="strict": (hashlib.sha384(b(s)).hexdigest(), len(s)), guess=None) |
| 22 | +add("sha512", lambda s, error="strict": (hashlib.sha512(b(s)).hexdigest(), len(s)), guess=None) |
| 23 | + |
| 24 | + |
| 25 | +# Python3 only |
| 26 | +if PY3: |
| 27 | + def blake_hash(c): |
| 28 | + def _hash_transform(l): |
| 29 | + l = (l or "64").lstrip("_-") |
| 30 | + def _encode(data, error="strict"): |
| 31 | + return getattr(hashlib, "blake2%s" % c)(b(data), digest_size=int(l)).hexdigest(), len(data) |
| 32 | + return _encode |
| 33 | + return _hash_transform |
| 34 | + |
| 35 | + add("blake2b", blake_hash("b"), pattern=r"^blake2b(|[-_](?:[1-9]|[1-5]\d|6[0-4]))$", guess=None) |
| 36 | + add("blake2s", blake_hash("s"), pattern=r"^blake2s(|[-_](?:[1-9]|[1-2]\d|3[0-2]))$", guess=None) |
| 37 | + |
| 38 | + def shake_hash(i): |
| 39 | + def _hash_transform(l): |
| 40 | + l = (l or str(i)).lstrip("_-") |
| 41 | + def _encode(data, error="strict"): |
| 42 | + return getattr(hashlib, "shake_%d" % i)(b(data)).hexdigest(int(l)), len(data) |
| 43 | + return _encode |
| 44 | + return _hash_transform |
| 45 | + |
| 46 | + add("shake_128", shake_hash(128), pattern=r"^shake[-_]?128(|[-_][1-9]\d*)$", guess=None) |
| 47 | + add("shake_256", shake_hash(256), pattern=r"^shake[-_]?256(|[-_][1-9]\d*)$", guess=None) |
| 48 | + |
| 49 | + add("sha3_224", lambda s, error="strict": (hashlib.sha3_224(b(s)).hexdigest(), len(s)), pattern=r"^sha3[-_]224$", |
| 50 | + guess=None) |
| 51 | + add("sha3_256", lambda s, error="strict": (hashlib.sha3_256(b(s)).hexdigest(), len(s)), pattern=r"^sha3[-_]256$", |
| 52 | + guess=None) |
| 53 | + add("sha3_384", lambda s, error="strict": (hashlib.sha3_384(b(s)).hexdigest(), len(s)), pattern=r"^sha3[-_]384$", |
| 54 | + guess=None) |
| 55 | + add("sha3_512", lambda s, error="strict": (hashlib.sha3_512(b(s)).hexdigest(), len(s)), pattern=r"^sha3[-_]512$", |
| 56 | + guess=None) |
| 57 | + |
0 commit comments