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