diff options
| author | Eli Collins <elic@assurancetechnologies.com> | 2011-04-05 15:54:44 -0400 |
|---|---|---|
| committer | Eli Collins <elic@assurancetechnologies.com> | 2011-04-05 15:54:44 -0400 |
| commit | a4fce8f8e87530ae2b1de581a7e490176003e8a2 (patch) | |
| tree | 3963cfe91620ae2eea1223295a36ba39400f7871 /passlib/utils | |
| parent | 10eac15bd886d8b143380bfe5461e9a404d5264b (diff) | |
| download | passlib-a4fce8f8e87530ae2b1de581a7e490176003e8a2.tar.gz | |
add some helpers to parse common modular-crypt-format variants
Diffstat (limited to 'passlib/utils')
| -rw-r--r-- | passlib/utils/handlers.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/passlib/utils/handlers.py b/passlib/utils/handlers.py index c81426c..4ca4096 100644 --- a/passlib/utils/handlers.py +++ b/passlib/utils/handlers.py @@ -45,6 +45,46 @@ UC_HEX_CHARS = "0123456789ABCDEF" LC_HEX_CHARS = "0123456789abcdef" #========================================================= +#parsing helpers +#========================================================= +def parse_mc2(hash, prefix, name="<unnamed>", sep="$"): + "parse hash using 2-part modular crypt format" + #eg: MD5-Crypt: $1$salt[$checksum] + if not hash: + raise ValueError("no hash specified") + if isinstance(hash, unicode): + hash = hash.encode("ascii") + if not hash.startswith(prefix): + raise ValueError("not a valid %s hash (wrong prefix)" % (name,)) + parts = hash[len(prefix):].split(sep) + if len(parts) == 2: + salt, chk = parts + return salt, chk or None + elif len(parts) == 1: + return parts[0], None + else: + raise ValueError("not a valid %s hash (malformed)" % (name,)) + +def parse_mc3(hash, prefix, name="<unnamed>", sep="$"): + "parse hash using 3-part modular crypt format" + #eg: SHA1-Crypt: $sha1$rounds$salt[$checksum] + if not hash: + raise ValueError("no hash specified") + if isinstance(hash, unicode): + hash = hash.encode("ascii") + if not hash.startswith(prefix): + raise ValueError("not a valid %s hash" % (name,)) + parts = hash[len(prefix):].split(sep) + if len(parts) == 3: + rounds, salt, chk = parts + return rounds, salt, chk or None + elif len(parts) == 2: + rounds, salt = parts + return rounds, salt, None + else: + raise ValueError("not a valid %s hash" % (name,)) + +#========================================================= #base handler #========================================================= class SimpleHandler(object): |
