xref: /rk3399_ARM-atf/tools/cert_create/src/sha.c (revision 9bc52d330fccb0e4df22006630350a42457d3306)
16f971622SJuan Castillo /*
2*9bc52d33SJuan Pablo Conde  * Copyright (c) 2015-2022, ARM Limited and Contributors. All rights reserved.
36f971622SJuan Castillo  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
56f971622SJuan Castillo  */
66f971622SJuan Castillo 
72a4b4b71SIsla Mitchell #include <stdio.h>
86f971622SJuan Castillo #include "debug.h"
92972247cSQixiang Xu #include "key.h"
10*9bc52d33SJuan Pablo Conde #include <openssl/evp.h>
11*9bc52d33SJuan Pablo Conde #include <openssl/obj_mac.h>
126f971622SJuan Castillo 
136f971622SJuan Castillo #define BUFFER_SIZE	256
146f971622SJuan Castillo 
15*9bc52d33SJuan Pablo Conde static int get_algorithm_nid(int hash_alg)
16*9bc52d33SJuan Pablo Conde {
17*9bc52d33SJuan Pablo Conde 	int nids[] = {NID_sha256, NID_sha384, NID_sha512};
18*9bc52d33SJuan Pablo Conde 	if (hash_alg < 0 || hash_alg >= sizeof(nids) / sizeof(*nids)) {
19*9bc52d33SJuan Pablo Conde 		return NID_undef;
20*9bc52d33SJuan Pablo Conde 	}
21*9bc52d33SJuan Pablo Conde 	return nids[hash_alg];
22*9bc52d33SJuan Pablo Conde }
23*9bc52d33SJuan Pablo Conde 
242972247cSQixiang Xu int sha_file(int md_alg, const char *filename, unsigned char *md)
256f971622SJuan Castillo {
266f971622SJuan Castillo 	FILE *inFile;
27*9bc52d33SJuan Pablo Conde 	EVP_MD_CTX *mdctx;
28*9bc52d33SJuan Pablo Conde 	const EVP_MD *md_type;
296f971622SJuan Castillo 	int bytes;
30*9bc52d33SJuan Pablo Conde 	int alg_nid;
31*9bc52d33SJuan Pablo Conde 	unsigned int total_bytes;
326f971622SJuan Castillo 	unsigned char data[BUFFER_SIZE];
336f971622SJuan Castillo 
346f971622SJuan Castillo 	if ((filename == NULL) || (md == NULL)) {
35*9bc52d33SJuan Pablo Conde 		ERROR("%s(): NULL argument\n", __func__);
366f971622SJuan Castillo 		return 0;
376f971622SJuan Castillo 	}
386f971622SJuan Castillo 
396f971622SJuan Castillo 	inFile = fopen(filename, "rb");
406f971622SJuan Castillo 	if (inFile == NULL) {
416f971622SJuan Castillo 		ERROR("Cannot read %s\n", filename);
426f971622SJuan Castillo 		return 0;
436f971622SJuan Castillo 	}
446f971622SJuan Castillo 
45*9bc52d33SJuan Pablo Conde 	mdctx = EVP_MD_CTX_new();
46*9bc52d33SJuan Pablo Conde 	if (mdctx == NULL) {
47*9bc52d33SJuan Pablo Conde 		fclose(inFile);
48*9bc52d33SJuan Pablo Conde 		ERROR("%s(): Could not create EVP MD context\n", __func__);
49*9bc52d33SJuan Pablo Conde 		return 0;
502972247cSQixiang Xu 	}
516f971622SJuan Castillo 
52*9bc52d33SJuan Pablo Conde 	alg_nid = get_algorithm_nid(md_alg);
53*9bc52d33SJuan Pablo Conde 	if (alg_nid == NID_undef) {
54*9bc52d33SJuan Pablo Conde 		ERROR("%s(): Invalid hash algorithm\n", __func__);
55*9bc52d33SJuan Pablo Conde 		goto err;
566f971622SJuan Castillo 	}
57*9bc52d33SJuan Pablo Conde 
58*9bc52d33SJuan Pablo Conde 	md_type = EVP_get_digestbynid(alg_nid);
59*9bc52d33SJuan Pablo Conde 	if (EVP_DigestInit_ex(mdctx, md_type, NULL) == 0) {
60*9bc52d33SJuan Pablo Conde 		ERROR("%s(): Could not initialize EVP MD digest\n", __func__);
61*9bc52d33SJuan Pablo Conde 		goto err;
62*9bc52d33SJuan Pablo Conde 	}
63*9bc52d33SJuan Pablo Conde 
64*9bc52d33SJuan Pablo Conde 	while ((bytes = fread(data, 1, BUFFER_SIZE, inFile)) != 0) {
65*9bc52d33SJuan Pablo Conde 		EVP_DigestUpdate(mdctx, data, bytes);
66*9bc52d33SJuan Pablo Conde 	}
67*9bc52d33SJuan Pablo Conde 	EVP_DigestFinal_ex(mdctx, md, &total_bytes);
68*9bc52d33SJuan Pablo Conde 
69*9bc52d33SJuan Pablo Conde 	fclose(inFile);
70*9bc52d33SJuan Pablo Conde 	EVP_MD_CTX_free(mdctx);
71*9bc52d33SJuan Pablo Conde 	return 1;
72*9bc52d33SJuan Pablo Conde 
73*9bc52d33SJuan Pablo Conde err:
74*9bc52d33SJuan Pablo Conde 	fclose(inFile);
75*9bc52d33SJuan Pablo Conde 	EVP_MD_CTX_free(mdctx);
76*9bc52d33SJuan Pablo Conde 	return 0;
77*9bc52d33SJuan Pablo Conde }
78*9bc52d33SJuan Pablo Conde 
79