diff options
| author | Mattias Andrée <maandree@operamail.com> | 2013-02-03 23:57:01 +0100 | 
|---|---|---|
| committer | Mattias Andrée <maandree@operamail.com> | 2013-02-03 23:57:01 +0100 | 
| commit | 45770d637f802d2921b3a03514eb9654c874db17 (patch) | |
| tree | d35f73013ae34e860ecebc295e46185e933618d0 | |
| parent | can absorb partial mesages (diff) | |
| download | sha3sum-45770d637f802d2921b3a03514eb9654c874db17.tar.gz sha3sum-45770d637f802d2921b3a03514eb9654c874db17.tar.bz2 sha3sum-45770d637f802d2921b3a03514eb9654c874db17.tar.xz | |
basic command line support
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
| -rwxr-xr-x | sha3sum.py | 144 | 
1 files changed, 130 insertions, 14 deletions
| @@ -24,6 +24,8 @@ import sys  class SHA3:      ''' +    SHA-3/Keccak hash algorithm implementation +          @author  Mattias Andrée (maandree@member.fsf.org)      ''' @@ -307,9 +309,11 @@ class SHA3:          rc = [0] * ((SHA3.n + 7) >> 3)          ptr = 0 -        # Absorbing phase          rr = SHA3.r >> 3 +        nn = SHA3.n >> 3          ww = SHA3.w >> 3 +         +        # Absorbing phase          msg_i =[0, 0, 0, 0, 0,                  0, 0, 0, 0, 0,                  0, 0, 0, 0, 0, @@ -322,15 +326,13 @@ class SHA3:              SHA3.keccakF(SHA3.S)          # Squeezing phase -        rr = SHA3.r >> 3 -        nn = SHA3.n >> 3          olen = SHA3.n          j = 0          while (olen > 0):              i = 0              while (i < 25) and (i < rr) and (j < nn):                  v = SHA3.S[i % 5][i // 5] -                for _ in range(8): +                for _ in range(ww):                      if (j < nn):                          rc[ptr] = v & 255                          ptr += 1 @@ -344,16 +346,111 @@ class SHA3:          return rc -output = 512 -total = 1600 -bitrate = total - output * 2 -MESSAGE = 'The quick brown fox jumps over the lazy dog.'.encode('UTF-8') - -SHA3.initalise(bitrate, total - bitrate, output) -SHA3.update(MESSAGE[:20]) -sys.stdout.buffer.write(bytes(SHA3.digest(MESSAGE[20:]))) -sys.stdout.buffer.flush() - +if __name__ == '__main__': +    cmd = sys.argv[0] +    args = sys.argv[1:] +    if '/' in cmd: +        cmd = cmd[cmd.rfind('/') + 1:] +    if cmd.endswith('.py'): +        cmd = cmd[:-3] +     +    o = 512           # --outputsize +    if   cmd == 'sha3-224sum':  o = 224 +    elif cmd == 'sha3-256sum':  o = 256 +    elif cmd == 'sha3-384sum':  o = 384 +    elif cmd == 'sha3-512sum':  o = 512 +    s = 1600          # --statesize +    r = s - (o << 1)  # --bitrate +    c = s - r         # --capacity +    w = s // 25       # --wordsize +    i = 1             # --iterations +    binary = False +     +    files = [] +    dashed = False +    linger = None +     +    for arg in args: +        if linger is not None: +            if linger[1] is None: +                linger[1] = arg +                arg = None +            if linger[0] in ('-r', '--bitrate'): +                r = linger[1] +                o = (s - r) >> 1 +            elif linger[0] in ('-c', '--capacity'): +                c = linger[1] +                r = s - c +            elif linger[0] in ('-w', '--wordsize'): +                w = linger[1] +                s = w * 25 +            elif linger[0] in ('-o', '--outputsize'): +                o = linger[1] +                r = s - (o << 1) +            elif linger[0] in ('-s', '--statesize'): +                s = linger[1] +                r = s - (o << 1) +            elif linger[0] in ('-i', '--iterations'): +                iterations = linger[1] +            else: +                sys.stderr.write(sys.argv[0] + ': unrecognised option: ' + linger) +                exit(1) +            linger = None +            if arg is None: +                continue +        if dashed: +            files.append(None if arg == '-' else arg) +        elif arg == '--': +            dashed = True +        elif arg.startswith('--'): +            if '=' in arg: +                linger = (arg[:arg.find('=')], arg[arg.find('=') + 1:]) +            else: +                if arg == '--binary': +                    binary = True +                else: +                    linger = (arg, None) +        elif arg.startswith('-'): +            if arg[1] == 'b': +                binary = True +                arg = arg[1:] +            if len(arg) > 1: +                linger = ('-' + arg, None) +            else: +                linger = ('-' + arg[0], arg[1:]) +        else: +            files.append(None if arg == '-' else arg) +     +    if len(files) == 0: +        files.append(None) +     +     +    stdin = None +    for filename in files: +        if (filename is None) and (stdin is not None): +            print(stdin) +            continue +        rc = '' +        with open('/dev/stdin' if filename is None else filename, 'rb') as file: +            message = file.read() +            SHA3.initalise(r, c, o) +            ##SHA3.update(msg) +            bs = bytes(SHA3.digest(message)) +            if binary: +                if filename is None: +                    stdin = bs +                sys.stdout.buffer.write(bs) +                sys.stdout.buffer.flush() +            else: +                for b in bs: +                    rc += "0123456789ABCDEF"[b >> 4] +                    rc += "0123456789ABCDEF"[b & 15] +                rc += ' ' + ('-' if filename is None else filename) + '\n' +                if filename is None: +                    stdin = rc +                sys.stdout.buffer.write(rc.encode('UTF-8')) +                sys.stdout.buffer.flush() +      # 0e ab 42 de  4c 3c eb 92  35 fc 91 ac  ff e7 46 b2  # 9c 29 a8 c3  66 b7 c6 0e  4e 67 c4 66  f3 6a 43 04  # c0 0f a9 ca  f9 d8 79 76  ba 46 9b cb  e0 67 13 b4 @@ -371,6 +468,7 @@ SHA-3/Keccak checksum calculator  USAGE:	sha3sum [option...] < FILE  	sha3sum [option...] file... +  OPTIONS:  	-r BITRATE  	--bitrate	The bitrate to use for SHA-3.		(default: 576) @@ -393,5 +491,23 @@ OPTIONS:  	-b  	--binary	Print the checksum in binary, rather than hexadecimal. + +COPYRIGHT: + +Copyright © 2013  Mattias Andrée (maandree@member.fsf.org) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +  ''' | 
