1//
2//  digest_calc.c
3//  Digest calculation command for SecurityTool
4//
5//  Created by John Kelley on 4/27/11.
6//  Copyright 2011 Apple, Inc. All rights reserved.
7//
8
9#include "builtin_commands.h"
10
11#include <stdlib.h>
12#include <strings.h>
13
14#include <SecurityTool/readline.h>
15
16#include <corecrypto/ccsha1.h>
17#include <corecrypto/ccsha2.h>
18
19extern int command_digest(int argc, char * const *argv)
20{
21    int result = 1;
22    uint8_t *data = NULL;
23    size_t data_len;
24    const struct ccdigest_info *di;
25    unsigned char *digest = NULL;
26    unsigned long i,j;
27
28    if (argc < 3)
29        return 2; /* Return 2 triggers usage message. */
30
31    if (strcasecmp("sha1", argv[1]) == 0)
32    {
33        //printf("Calculating sha1\n");
34        di = ccsha1_di();
35    }
36    else if (strcasecmp("sha256", argv[1]) == 0)
37    {
38        //printf("Calculating sha256\n");
39        di = ccsha256_di();
40    }
41    else if (strcasecmp("sha512", argv[1]) == 0)
42    {
43        //printf("Calculating sha256\n");
44        di = ccsha512_di();
45    }
46    else
47        return 2; /* Return 2 triggers usage message. */
48
49    digest = malloc(di->output_size);
50    if (!digest)
51        goto exit;
52
53    for (i = 2; i < (unsigned int)argc; ++i)
54    {
55        printf("%s(%s)= ", argv[1], argv[i]);
56        if (read_file( argv[i], &data, &data_len) != 0 || !data)
57        {
58            printf("error reading file\n");
59            continue;
60        }
61        ccdigest(di, data_len, data, digest);
62
63        for (j = 0; j < di->output_size; j++)
64            printf("%02x", digest[j]);
65        printf("\n");
66        free(data);
67        data = NULL;
68    }
69    result = 0;
70
71exit:
72    if(data)
73        free(data);
74    if (digest)
75        free(digest);
76
77    return result;
78}
79