1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park *
4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park */
6*54fd6939SJiyong Park
7*54fd6939SJiyong Park #include <openssl/sha.h>
8*54fd6939SJiyong Park #include <stdio.h>
9*54fd6939SJiyong Park #include "debug.h"
10*54fd6939SJiyong Park #include "key.h"
11*54fd6939SJiyong Park
12*54fd6939SJiyong Park #define BUFFER_SIZE 256
13*54fd6939SJiyong Park
sha_file(int md_alg,const char * filename,unsigned char * md)14*54fd6939SJiyong Park int sha_file(int md_alg, const char *filename, unsigned char *md)
15*54fd6939SJiyong Park {
16*54fd6939SJiyong Park FILE *inFile;
17*54fd6939SJiyong Park SHA256_CTX shaContext;
18*54fd6939SJiyong Park SHA512_CTX sha512Context;
19*54fd6939SJiyong Park int bytes;
20*54fd6939SJiyong Park unsigned char data[BUFFER_SIZE];
21*54fd6939SJiyong Park
22*54fd6939SJiyong Park if ((filename == NULL) || (md == NULL)) {
23*54fd6939SJiyong Park ERROR("%s(): NULL argument\n", __FUNCTION__);
24*54fd6939SJiyong Park return 0;
25*54fd6939SJiyong Park }
26*54fd6939SJiyong Park
27*54fd6939SJiyong Park inFile = fopen(filename, "rb");
28*54fd6939SJiyong Park if (inFile == NULL) {
29*54fd6939SJiyong Park ERROR("Cannot read %s\n", filename);
30*54fd6939SJiyong Park return 0;
31*54fd6939SJiyong Park }
32*54fd6939SJiyong Park
33*54fd6939SJiyong Park if (md_alg == HASH_ALG_SHA384) {
34*54fd6939SJiyong Park SHA384_Init(&sha512Context);
35*54fd6939SJiyong Park while ((bytes = fread(data, 1, BUFFER_SIZE, inFile)) != 0) {
36*54fd6939SJiyong Park SHA384_Update(&sha512Context, data, bytes);
37*54fd6939SJiyong Park }
38*54fd6939SJiyong Park SHA384_Final(md, &sha512Context);
39*54fd6939SJiyong Park } else if (md_alg == HASH_ALG_SHA512) {
40*54fd6939SJiyong Park SHA512_Init(&sha512Context);
41*54fd6939SJiyong Park while ((bytes = fread(data, 1, BUFFER_SIZE, inFile)) != 0) {
42*54fd6939SJiyong Park SHA512_Update(&sha512Context, data, bytes);
43*54fd6939SJiyong Park }
44*54fd6939SJiyong Park SHA512_Final(md, &sha512Context);
45*54fd6939SJiyong Park } else {
46*54fd6939SJiyong Park SHA256_Init(&shaContext);
47*54fd6939SJiyong Park while ((bytes = fread(data, 1, BUFFER_SIZE, inFile)) != 0) {
48*54fd6939SJiyong Park SHA256_Update(&shaContext, data, bytes);
49*54fd6939SJiyong Park }
50*54fd6939SJiyong Park SHA256_Final(md, &shaContext);
51*54fd6939SJiyong Park }
52*54fd6939SJiyong Park
53*54fd6939SJiyong Park fclose(inFile);
54*54fd6939SJiyong Park return 1;
55*54fd6939SJiyong Park }
56