shakesum.c 2.62 KB
Newer Older
1 2
/**
 * @cond internal
3
 * @file decaf_shakesum.c
4 5 6 7 8 9 10 11 12 13
 * @copyright
 *   Copyright (c) 2015 Cryptography Research, Inc.  \n
 *   Released under the MIT License.  See LICENSE.txt for license information.
 * @author Mike Hamburg
 * @brief SHA3 utility, to be combined with test vectors eventually...
 */

#include <stdio.h>
#include <unistd.h>
#include <string.h>
14
#include <decaf/shake.h>
Michael Hamburg's avatar
Michael Hamburg committed
15
#include <decaf/sha512.h>
16

Michael Hamburg's avatar
Michael Hamburg committed
17
static void usage() {
18 19
    fprintf(
        stderr,
20
        "decaf_shakesum [shake256|shake128|sha3-224|sha3-384|sha3-512|sha512] < infile > outfile\n"
21 22 23
    );
}

24 25 26
int main(int argc, char **argv) {
    (void)argc; (void)argv;

27 28
    decaf_keccak_sponge_t sponge;
    decaf_sha512_ctx_t decaf_sha512;
29 30 31
    unsigned char buf[1024];
    
    unsigned int outlen = 512;
32
    decaf_shake256_gen_init(sponge);
Michael Hamburg's avatar
Michael Hamburg committed
33 34
    
    int use_sha512 = 0;
35 36 37 38 39

    /* Sloppy.  Real utility would parse --algo, --size ... */
    if (argc > 1) {
        if (!strcmp(argv[1], "shake256") || !strcmp(argv[1], "SHAKE256")) {
            outlen = 512;
40
            decaf_shake256_gen_init(sponge);
41 42
        } else if (!strcmp(argv[1], "shake128") || !strcmp(argv[1], "SHAKE128")) {
            outlen = 512;
43
            decaf_shake128_gen_init(sponge);
44 45
        } else if (!strcmp(argv[1], "sha3-224") || !strcmp(argv[1], "SHA3-224")) {
            outlen = 224/8;
46
            decaf_sha3_224_gen_init(sponge);
47 48
        } else if (!strcmp(argv[1], "sha3-256") || !strcmp(argv[1], "SHA3-256")) {
            outlen = 256/8;
49
            decaf_sha3_256_gen_init(sponge);
50 51
        } else if (!strcmp(argv[1], "sha3-384") || !strcmp(argv[1], "SHA3-384")) {
            outlen = 384/8;
52
            decaf_sha3_384_gen_init(sponge);
53 54
        } else if (!strcmp(argv[1], "sha3-512") || !strcmp(argv[1], "SHA3-512")) {
            outlen = 512/8;
55
            decaf_sha3_512_gen_init(sponge);
Michael Hamburg's avatar
Michael Hamburg committed
56 57 58
        } else if (!strcmp(argv[1], "sha512") || !strcmp(argv[1], "SHA512")) {
            outlen = 512/8;
            use_sha512 = 1;
59
            decaf_sha512_init(decaf_sha512);
60 61 62
        } else {
            usage();
            return 2;
63 64 65 66 67 68
        }
    }

    ssize_t red;
    do {
        red = read(0, buf, sizeof(buf));
Michael Hamburg's avatar
Michael Hamburg committed
69
        if (red>0) {
70 71
            if (use_sha512) decaf_sha512_update(decaf_sha512,buf,red);
            else decaf_sha3_update(sponge,buf,red);
Michael Hamburg's avatar
Michael Hamburg committed
72
        }
73 74
    } while (red>0);

Michael Hamburg's avatar
Michael Hamburg committed
75
    if (use_sha512) {
76 77
        decaf_sha512_final(decaf_sha512,buf,outlen);
        decaf_sha512_destroy(decaf_sha512);
Michael Hamburg's avatar
Michael Hamburg committed
78
    } else {
79
        decaf_sha3_output(sponge,buf,outlen);
80
        decaf_sha3_destroy(sponge);
Michael Hamburg's avatar
Michael Hamburg committed
81
    }
82 83 84 85 86 87 88 89
    unsigned i;
    for (i=0; i<outlen; i++) {
        printf("%02x", buf[i]);
    }
    printf("\n");

    return 0;
}