diff options
Diffstat (limited to 'lib/file_hash/init.nom')
| -rw-r--r-- | lib/file_hash/init.nom | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/file_hash/init.nom b/lib/file_hash/init.nom new file mode 100644 index 0000000..7b428cd --- /dev/null +++ b/lib/file_hash/init.nom @@ -0,0 +1,60 @@ +#!/usr/bin/env nomsu -V6.14 +# + This file defines some actions for hashing files and looking up files by hash. + +use "filesystem" +use "base64" + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +lua> "local \$use_sha1, \$hashlib = pcall(require, 'openssl.digest')" +test: + assume (hash "hello world") == (hash "hello world") + if ((hash "hello world") == (hash "goodbye")): + fail (" + Hash collision: + (hash "hello world") = \(hash "hello world") + (hash "goodbye") = \(hash "goodbye") + ") + + assume + ( + hash (" + This is a really long string meant to stress test the hashing function and + ensure that it's not overflowing with long inputs. + ") + ) != "inf" + + if ((hash "\000") == (hash "\000\000\000\000\000")): + fail "Incorrect hashing of null strings" + + if $use_sha1: + assume ((hash "hello world") == "Kq5sNclPz7QV2+lfQIuc6R7oRu0=") + +if $use_sha1: + externally (hash $) means: + $hash = (=lua "\$hashlib.new('sha1'):final(\$)") + return (base64 $hash) +..else: + # TODO: remove warning? + say (" + \027[31;1mWARNING: OpenSSL module not found. Defaulting to a non-cryptographically secure \ + ..hash function.\027[0m + ") + + externally (hash $) means: + $bytes = ($, bytes) + $hash = ($bytes.1 << 7) + for $i in 2 to (size of $bytes): + $hash = ((1000003 * $hash) ~ $bytes.$i) + $hash = ($hash ~ (size of $bytes)) + return "\$hash" + +externally (file with hash $hash) means: + for $filename in (files for "."): + $contents = (read file $filename) + $file_hash = (hash $contents) + if ($file_hash == $hash): + return $filename + +(hash of file $filename) parses as (hash (read file $filename)) |
