From f0383c92942287433ee06f314b50593a13663077 Mon Sep 17 00:00:00 2001 From: Stanislav N Mikhailov Date: Mon, 9 Mar 2026 18:35:43 +0300 Subject: [PATCH] Initial SHA256 test harness --- .gitignore | 5 ++ CMakeLists.txt | 24 +++++++++ build/Debug/sha-256.dll | Bin 0 -> 22528 bytes build/Debug/sha256_client.exe | Bin 0 -> 57856 bytes dll/sha-256.dll | Bin 0 -> 22528 bytes dll/sha-256.lib | Bin 0 -> 2198 bytes include/sha.h | 48 +++++++++++++++++ src/main.c | 95 ++++++++++++++++++++++++++++++++++ 8 files changed, 172 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 build/Debug/sha-256.dll create mode 100644 build/Debug/sha256_client.exe create mode 100644 dll/sha-256.dll create mode 100644 dll/sha-256.lib create mode 100644 include/sha.h create mode 100644 src/main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bbf35a --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +build/* +!build/Debug/ +build/Debug/* +!build/Debug/*.exe +!build/Debug/*.dll diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bb8a657 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.20) +project(sha256_client_c LANGUAGES C) + +if(NOT WIN32) + message(FATAL_ERROR "This sample is intended for Win64 (DLL import).") +endif() + +add_executable(sha256_client + src/main.c +) + +target_include_directories(sha256_client PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +target_link_libraries(sha256_client PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/dll/sha-256.lib +) + +add_custom_command(TARGET sha256_client POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/dll/sha-256.dll + $/sha-256.dll +) diff --git a/build/Debug/sha-256.dll b/build/Debug/sha-256.dll new file mode 100644 index 0000000000000000000000000000000000000000..a4863bc0e7ef195fd312c72e414ba7c1284af555 GIT binary patch literal 22528 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 +#include + +#ifdef _WIN32 + #ifdef SHA256_EXPORTS + #define SHA256_API __declspec(dllexport) + #else + #define SHA256_API __declspec(dllimport) + #endif +#else + #define SHA256_API +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef uint32_t sha256_digest_t[8]; + +SHA256_API int TestHello(void); + +/* + * Returns NULL (0) on success according to assembly comments. + * data_addr - pointer to current data chunk. + * full_size - total message/file size in bytes. + * current_size - current chunk size in bytes. + * digest - 32-byte state/result buffer (8 x uint32_t). + * is_last_chunk - 1 if this is the last chunk, otherwise 0. + */ +SHA256_API void *Sha256( + const void *data_addr, + uint64_t full_size, + uint64_t current_size, + sha256_digest_t digest, + uint64_t is_last_chunk +); + +/* Initializes digest and internal K constants. */ +SHA256_API void Sha256Init(sha256_digest_t digest); + +#ifdef __cplusplus +} +#endif + +#endif /* SHA256_SHA_H */ diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..d116190 --- /dev/null +++ b/src/main.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include + +#include "sha.h" + +static void print_digest_words(const sha256_digest_t digest) { + for (int i = 0; i < 8; ++i) { + printf("%08x", digest[i]); + } + putchar('\n'); +} + +int main(void) { + char path[4096] = {0}; + sha256_digest_t digest = {0}; + + if (fgets(path, (int)sizeof(path), stdin) == NULL) { + fprintf(stderr, "Failed to read file path from stdin\n"); + return 1; + } + + path[strcspn(path, "\r\n")] = '\0'; + if (path[0] == '\0') { + fprintf(stderr, "Empty file path\n"); + return 1; + } + + FILE *fp = fopen(path, "rb"); + if (fp == NULL) { + fprintf(stderr, "Failed to open file: %s\n", path); + return 1; + } + + if (_fseeki64(fp, 0, SEEK_END) != 0) { + fprintf(stderr, "Failed to seek file end: %s\n", path); + fclose(fp); + return 1; + } + + const long long file_size_ll = _ftelli64(fp); + if (file_size_ll < 0) { + fprintf(stderr, "Failed to get file size: %s\n", path); + fclose(fp); + return 1; + } + + if (_fseeki64(fp, 0, SEEK_SET) != 0) { + fprintf(stderr, "Failed to seek file start: %s\n", path); + fclose(fp); + return 1; + } + + const uint64_t full_size = (uint64_t)file_size_ll; + size_t alloc_size = (size_t)full_size; + if ((uint64_t)alloc_size != full_size) { + fprintf(stderr, "File is too large for this client: %s\n", path); + fclose(fp); + return 1; + } + if (alloc_size == 0) { + alloc_size = 1; + } + + unsigned char *data = (unsigned char *)malloc(alloc_size); + if (data == NULL) { + fprintf(stderr, "Out of memory while reading: %s\n", path); + fclose(fp); + return 1; + } + + if (full_size > 0) { + const size_t read_size = fread(data, 1, (size_t)full_size, fp); + if (read_size != (size_t)full_size) { + fprintf(stderr, "Failed to read file: %s\n", path); + free(data); + fclose(fp); + return 1; + } + } + fclose(fp); + + void *rc = Sha256(data, full_size, full_size, digest, 1); + free(data); + if (rc != 0) { + fprintf(stderr, "Sha256 failed, rc=%p\n", rc); + return 1; + } + + printf("Digest (library word order): "); + print_digest_words(digest); + + return 0; +}