--- /dev/null
+//
+// digest_calc.c
+// Digest calculation command for SecurityTool
+//
+// Created by John Kelley on 4/27/11.
+// Copyright 2011 Apple, Inc. All rights reserved.
+//
+
+#include "builtin_commands.h"
+
+#include <stdlib.h>
+#include <strings.h>
+
+#include <SecurityTool/readline.h>
+
+#include <corecrypto/ccsha1.h>
+#include <corecrypto/ccsha2.h>
+
+extern int command_digest(int argc, char * const *argv)
+{
+ int result = 1;
+ uint8_t *data = NULL;
+ size_t data_len;
+ const struct ccdigest_info *di;
+ unsigned char *digest = NULL;
+ unsigned long i,j;
+
+ if (argc < 3)
+ return 2; /* Return 2 triggers usage message. */
+
+ if (strcasecmp("sha1", argv[1]) == 0)
+ {
+ //printf("Calculating sha1\n");
+ di = ccsha1_di();
+ }
+ else if (strcasecmp("sha256", argv[1]) == 0)
+ {
+ //printf("Calculating sha256\n");
+ di = ccsha256_di();
+ }
+ else if (strcasecmp("sha512", argv[1]) == 0)
+ {
+ //printf("Calculating sha256\n");
+ di = ccsha512_di();
+ }
+ else
+ return 2; /* Return 2 triggers usage message. */
+
+ digest = malloc(di->output_size);
+ if (!digest)
+ goto exit;
+
+ for (i = 2; i < (unsigned int)argc; ++i)
+ {
+ printf("%s(%s)= ", argv[1], argv[i]);
+ if (read_file( argv[i], &data, &data_len) != 0 || !data)
+ {
+ printf("error reading file\n");
+ continue;
+ }
+ ccdigest(di, data_len, data, digest);
+
+ for (j = 0; j < di->output_size; j++)
+ printf("%02x", digest[j]);
+ printf("\n");
+ free(data);
+ data = NULL;
+ }
+ result = 0;
+
+exit:
+ if(data)
+ free(data);
+ if (digest)
+ free(digest);
+
+ return result;
+}