xref: /aosp_15_r20/external/arm-trusted-firmware/tools/cert_create/src/sha.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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