Есть некая библиотека выполняющая в том числе и подсчёт SHA1-хеша файла, использует OpenSSL-0.9.8g.
Библиотека используется на плате с ARM-процессором, компилятор arm-fsl-linux-gnueabi-gcc (4.4.4_09.06.2010) 4.4.4
Проблема в том, что при подсчёте SHA1 приложение использующее эту библиотеку вываливается с Segmentation fault, проблемная функция EVP_DigestFinal_ex.
Для проверки функция была вынесена в тестовое приложение:
Код:
/*
* OpenSSL version 0.9.8g
*
* arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gcc \
* -Wall -Wextra -Werror -pedantic -Winit-self -Wformat-nonliteral \
* -Wformat-security -Wmissing-include-dirs -Wswitch-default -Wtrigraphs \
* -Wfloat-equal -Wundef -Wshadow -Wbad-function-cast -Wcast-qual \
* -Wcast-align -Wwrite-strings -Wlogical-op -Wsign-conversion -Wconversion \
* -Wstrict-overflow=5 \
* -O2 -std=c99 \
* -I$(OPENSSL_DIR)/include \
* -L$(OPENSSL_DIR) -lcrypto
*/
#include <stdio.h>
#include <unistd.h>
#include "openssl/evp.h"
#include "openssl/pem.h"
#include "openssl/sha.h"
int main(int argc, char *argv[])
{
EVP_MD_CTX mdctx;
const EVP_MD *md = NULL;
unsigned char *digest = NULL;
unsigned int digest_len = 0;
FILE *fd = NULL;
char *buf = NULL;
if (argc < 2) {
printf("Unknown file\n");
exit(-1);
}
fd = fopen(argv[1], "rb");
if (NULL == fd) {
printf("Failed open file %s\n", argv[1]);
exit(-1);
}
printf("File %s opened\n", argv[1]);
OpenSSL_add_all_digests();
md = EVP_get_digestbyname("SHA1");
if (NULL == md) {
printf("EVP_get_digestbyname failed\n");
exit(-1);
}
EVP_MD_CTX_init(&mdctx);
if (!EVP_DigestInit_ex(&mdctx, md, NULL)) {
printf("EVP_DigestInit_ex failed\n");
exit(-1);
}
printf("OpenSSL init\n");
while (!feof(fd)) {
size_t len = 0;
buf = malloc(1024);
if (NULL == buf) {
printf("buffer malloc failed\n");
exit(-1);
}
len = fread(buf, 1, 1024, fd);
if (!len) {
free(buf);
break;
}
if (!EVP_DigestUpdate(&mdctx, buf, len)) {
printf("EVP_DigestUpdate failed");
exit(-1);
}
free(buf);
}
printf("File %s read stop\n", argv[1]);
digest = malloc(EVP_MAX_MD_SIZE);
if (NULL == digest) {
printf("digest malloc failed\n");
exit(-1);
}
if (!EVP_DigestFinal_ex(&mdctx, digest, &digest_len)) {
printf("EVP_DigestFinal_ex failed\n");
exit(-1);
}
EVP_MD_CTX_cleanup(&mdctx);
fclose(fd);
printf("File %s hash %x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x\n",
argv[1], digest[0], digest[1], digest[2], digest[3], digest[4],
digest[5], digest[6], digest[7], digest[8], digest[9], digest[10],
digest[11], digest[12], digest[13], digest[14], digest[15],
digest[16], digest[17], digest[18], digest[19]);
return 0;
}Тест нормально работает:
Код: Выделить всё
./sha_test update_sha_nosign.bic
File update_sha_nosign.bic opened
OpenSSL init
File update_sha_nosign.bic read stop
File update_sha_nosign.bic hash 7d5c758edeaaa3d3b6ef6ea20be3a74d36e9315Вопрос - как диагностировать причину не работоспособности функции в составе библиотеки?
Спасибо.