]> git.saurik.com Git - apple/security.git/blobdiff - sec/SecurityTool/digest_calc.c
Security-55471.tar.gz
[apple/security.git] / sec / SecurityTool / digest_calc.c
diff --git a/sec/SecurityTool/digest_calc.c b/sec/SecurityTool/digest_calc.c
new file mode 100644 (file)
index 0000000..85710a3
--- /dev/null
@@ -0,0 +1,78 @@
+//
+//  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;
+}