OLD | NEW |
(Empty) | |
| 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 * Use of this source code is governed by a BSD-style license that can be |
| 3 * found in the LICENSE file. |
| 4 * |
| 5 * Utility functions for message digest functions. |
| 6 */ |
| 7 |
| 8 #include "digest_utility.h" |
| 9 #include "sha.h" |
| 10 |
| 11 #include <fcntl.h> |
| 12 #include <unistd.h> |
| 13 #include <stdio.h> |
| 14 #include <stdlib.h> |
| 15 #include <string.h> |
| 16 #include <sys/types.h> |
| 17 #include <sys/stat.h> |
| 18 |
| 19 uint8_t* SHA1_file(char* input_file) { |
| 20 int input_fd, len; |
| 21 uint8_t data[ SHA1_BLOCK_SIZE], *digest = NULL, *p = NULL; |
| 22 SHA1_CTX ctx; |
| 23 if( (input_fd = open(input_file, O_RDONLY)) == -1 ) { |
| 24 fprintf(stderr, "Couldn't open input file.\n"); |
| 25 return NULL; |
| 26 } |
| 27 SHA1_init(&ctx); |
| 28 while ( (len = read(input_fd, data, SHA1_BLOCK_SIZE)) == |
| 29 SHA1_BLOCK_SIZE) |
| 30 SHA1_update(&ctx, data, len); |
| 31 if (len != -1) |
| 32 SHA1_update(&ctx, data, len); |
| 33 p = SHA1_final(&ctx); |
| 34 close(input_fd); |
| 35 digest = (uint8_t*) malloc(SHA1_DIGEST_SIZE); |
| 36 if (!digest) |
| 37 return NULL; |
| 38 memcpy(digest, p, SHA1_DIGEST_SIZE); |
| 39 return digest; |
| 40 } |
| 41 |
| 42 uint8_t* SHA256_file(char* input_file) { |
| 43 int input_fd, len; |
| 44 uint8_t data[ SHA256_BLOCK_SIZE], *digest = NULL, *p = NULL; |
| 45 SHA256_CTX ctx; |
| 46 if( (input_fd = open(input_file, O_RDONLY)) == -1 ) { |
| 47 fprintf(stderr, "Couldn't open input file.\n"); |
| 48 return NULL; |
| 49 } |
| 50 SHA256_init(&ctx); |
| 51 while ( (len = read(input_fd, data, SHA256_BLOCK_SIZE)) == |
| 52 SHA256_BLOCK_SIZE) |
| 53 SHA256_update(&ctx, data, len); |
| 54 if (len != -1) |
| 55 SHA256_update(&ctx, data, len); |
| 56 p = SHA256_final(&ctx); |
| 57 close(input_fd); |
| 58 digest = (uint8_t*) malloc(SHA256_DIGEST_SIZE); |
| 59 if (!digest) |
| 60 return NULL; |
| 61 memcpy(digest, p, SHA256_DIGEST_SIZE); |
| 62 return digest; |
| 63 } |
| 64 |
| 65 uint8_t* SHA512_file(char* input_file) { |
| 66 int input_fd, len; |
| 67 uint8_t data[ SHA512_BLOCK_SIZE], *digest = NULL, *p = NULL; |
| 68 SHA512_CTX ctx; |
| 69 if( (input_fd = open(input_file, O_RDONLY)) == -1 ) { |
| 70 fprintf(stderr, "Couldn't open input file.\n"); |
| 71 return NULL; |
| 72 } |
| 73 SHA512_init(&ctx); |
| 74 while ( (len = read(input_fd, data, SHA512_BLOCK_SIZE)) == |
| 75 SHA512_BLOCK_SIZE) |
| 76 SHA512_update(&ctx, data, len); |
| 77 if (len != -1) |
| 78 SHA512_update(&ctx, data, len); |
| 79 p = SHA512_final(&ctx); |
| 80 close(input_fd); |
| 81 digest = (uint8_t*) malloc(SHA512_DIGEST_SIZE); |
| 82 if (!digest) |
| 83 return NULL; |
| 84 memcpy(digest, p, SHA512_DIGEST_SIZE); |
| 85 return digest; |
| 86 } |
| 87 |
| 88 uint8_t* calculate_digest(char *input_file, int algorithm) { |
| 89 typedef uint8_t* (*Hash_file_ptr) (char*); |
| 90 Hash_file_ptr hash_file[] = { |
| 91 SHA1_file, /* RSA 1024 */ |
| 92 SHA256_file, |
| 93 SHA512_file, |
| 94 SHA1_file, /* RSA 2048 */ |
| 95 SHA256_file, |
| 96 SHA512_file, |
| 97 SHA1_file, /* RSA 4096 */ |
| 98 SHA256_file, |
| 99 SHA512_file, |
| 100 SHA1_file, /* RSA 8192 */ |
| 101 SHA256_file, |
| 102 SHA512_file, |
| 103 }; |
| 104 return hash_file[algorithm](input_file); |
| 105 } |
OLD | NEW |