From b844cc770285209c3172fe8a5b68f46e8ed27f18 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 10 Sep 2021 15:41:17 +0200 Subject: [PATCH] wip --- .../slsDetectorServer/include/common.h | 6 +-- .../slsDetectorServer/src/common.c | 40 ++++++++++++++++++- .../src/programFpgaBlackfin.c | 2 +- .../src/slsDetectorServer_funcs.c | 2 +- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/slsDetectorServers/slsDetectorServer/include/common.h b/slsDetectorServers/slsDetectorServer/include/common.h index 28e351e07..1909f0667 100644 --- a/slsDetectorServers/slsDetectorServer/include/common.h +++ b/slsDetectorServers/slsDetectorServer/include/common.h @@ -35,7 +35,7 @@ int getModuleIdInFile(int *ret, char *mess, char *fileName); int setModuleIdInFile(char *mess, int arg, char *fileName); int verifyChecksumFromBuffer(char *mess, char *clientChecksum, char *buffer, ssize_t bytes); -// fsize is specified only if it is less than intended size (drive) -int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname, - ssize_t fsize); +int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname); +int verifyChecksumFromFlash(char *mess, char *clientChecksum, char *fname, + ssize_t fsize); int verifyChecksum(char *mess, char *clientChecksum, MD5_CTX *c); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index 837da7aea..cdc9a11f9 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -196,7 +196,45 @@ int verifyChecksumFromBuffer(char *mess, char *clientChecksum, char *buffer, return verifyChecksum(mess, clientChecksum, &c); } -int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname, ssize_t fsize) { +int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname) { + LOG(logINFO, ("\tVerifying Checksum...\n")); + + FILE *fp = fopen(fname, "r"); + if (fp == NULL) { + sprintf(mess, "Unable to open %s in read mode to get checksum\n", + fname); + LOG(logERROR, (mess)); + return FAIL; + } + + MD5_CTX c; + if (!MD5_Init(&c)) { + fclose(fp); + strcpy(mess, "Unable to calculate checksum (MD5_Init)\n"); + LOG(logERROR, (mess)); + return FAIL; + } + const int readUnitSize = 128; + char buf[readUnitSize]; + ssize_t bytes = fread(buf, 1, readUnitSize, fp); + ssize_t totalBytesRead = bytes; + while (bytes > 0) { + if (!MD5_Update(&c, buf, bytes)) { + fclose(fp); + strcpy(mess, "Unable to calculate checksum (MD5_Update)\n"); + LOG(logERROR, (mess)); + return FAIL; + } + bytes = fread(buf, 1, readUnitSize, fp); + totalBytesRead += bytes; + } + LOG(logINFO, ("\tRead %lu bytes to calculate checksum\n", totalBytesRead)); + fclose(fp); + return verifyChecksum(mess, clientChecksum, &c); +} + +int verifyChecksumFromFlash(char *mess, char *clientChecksum, char *fname, + ssize_t fsize) { LOG(logINFO, ("\tVerifying Checksum...\n")); FILE *fp = fopen(fname, "r"); diff --git a/slsDetectorServers/slsDetectorServer/src/programFpgaBlackfin.c b/slsDetectorServers/slsDetectorServer/src/programFpgaBlackfin.c index 4a329beb4..20c3e366b 100644 --- a/slsDetectorServers/slsDetectorServer/src/programFpgaBlackfin.c +++ b/slsDetectorServers/slsDetectorServer/src/programFpgaBlackfin.c @@ -131,7 +131,7 @@ int copyToFlash(ssize_t fsize, char *clientChecksum, char *mess) { return FAIL; } - if (verifyChecksumFromFile(mess, clientChecksum, flashDriveName, fsize) == + if (verifyChecksumFromFlash(mess, clientChecksum, flashDriveName, fsize) == FAIL) { return FAIL; } diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 991566747..13ebfb71c 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -3796,7 +3796,7 @@ int program_fpga(int file_des) { // checksum of copied program if (ret == OK) { ret = - verifyChecksumFromFile(mess, checksum, TEMP_PROG_FILE_NAME, 0); + verifyChecksumFromFile(mess, checksum, TEMP_PROG_FILE_NAME); } Server_SendResult(file_des, INT32, NULL, 0); if (ret == FAIL) {