diff --git a/include/haggis.h b/include/haggis.h index 4b1f602..761da60 100644 --- a/include/haggis.h +++ b/include/haggis.h @@ -116,7 +116,7 @@ typedef struct { } haggis_node; void haggis_node_deinit(haggis_node *node); -haggis_node* haggis_create_node(char *file, haggis_hardlink_list *list); +haggis_node* haggis_create_node(char *file, haggis_algorithm a, haggis_hardlink_list *list); int haggis_extract_node(FILE *stram, haggis_node *node); int haggis_load_node(FILE *stream, haggis_node *node); int haggis_store_node(FILE *stream, haggis_node *node); diff --git a/src/haggis.c b/src/haggis.c index e5aed3d..f504135 100644 --- a/src/haggis.c +++ b/src/haggis.c @@ -31,6 +31,7 @@ */ #include // PATH_MAX +#include #include // uint_t #if defined(__FreeBSD__) || defined(__DragonFly__) @@ -72,7 +73,7 @@ int haggis_check_header(FILE *stream) { return 1; if (memcmp(buf, header, 7)) return 2; - return 1; + return 0; } void haggis_device_init(dev_t rdev, haggis_device *dev) { @@ -158,6 +159,15 @@ int haggis_load_cksum(FILE *stream, haggis_checksum *cksum) { return 0; } +void init_md5(haggis_file *f) { + MD5_CTX ctx; + + f->cksum.tag = md5; + MD5Init(&ctx); + MD5Update(&ctx, f->data, (size_t)f->len.val); + MD5Final(f->cksum.sum.md5, &ctx); +} + int validate_md5(haggis_file *file) { MD5_CTX ctx; u8 digest[16]; @@ -171,6 +181,15 @@ int validate_md5(haggis_file *file) { } #if defined(__FreeBSD__) || defined(__DragonFly__) +void init_sha1(haggis_file *f) { + SHA1_CTX ctx; + + f->cksum.tag = sha1; + SHA1_Init(&ctx); + SHA1_Update(&ctx, f->data, (size_t)f->len.val); + SHA1_Final(f->cksum.sum.sha1, &ctx); +} + int validate_sha1(haggis_file *file) { SHA1_CTX ctx; u8 digest[20]; @@ -183,6 +202,15 @@ int validate_sha1(haggis_file *file) { return 0; } #elif defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__) +void init_sha1(haggis_file *f) { + SHA1_CTX ctx; + + f->cksum.tag = sha1; + SHA1_Init(&ctx); + SHA1_Update(&ctx, f->data, (size_t)f->len.val); + SHA1_Final(f->cksum.sum.sha1, &ctx); +} + int validate_sha1(haggis_file *file) { SHA1_CTX ctx; u8 digest[20]; @@ -197,6 +225,15 @@ int validate_sha1(haggis_file *file) { #endif /* if defined (__FreeBSD__) */ #if defined(__FreeBSD__) || defined(__DragonFly) || defined(__NetBSD__) +void init_sha256(haggis_file *f) { + SHA256_CTX ctx; + + f->cksum.tag = sha256; + SHA256_Init(&ctx); + SHA256_Update(&ctx, f->data, (size_t)f->len.val); + SHA256_Final(f->cksum.sum.sha256, &ctx); +} + int validate_sha256(haggis_file *file) { SHA256_CTX ctx; u8 digest[32]; @@ -209,6 +246,15 @@ int validate_sha256(haggis_file *file) { return 0; } #elif defined(__linux__) || defined(__OpenBSD__) +void init_sha256(haggis_file *f) { + SHA2_CTX ctx; + + f->cksum.tag = sha256; + SHA256_Init(&ctx); + SHA256_Update(&ctx, f->data, (size_t)f->len.val); + SHA256_Final(f->cksum.sum.sha256, &ctx); +} + int validate_sha256(haggis_file *file) { SHA2_CTX ctx; u8 digest[32]; @@ -222,6 +268,22 @@ int validate_sha256(haggis_file *file) { } #endif /* if defined (__FreeBSD__) */ +void haggis_init_cksum(haggis_file *f, haggis_algorithm a) { + switch (a) { + case md5: + init_md5(f); + break; + case sha1: + init_sha1(f); + break; + case sha256: + init_sha256(f); + break; + case skip: + break; + } +} + int haggis_validate_cksum(haggis_file *file) { switch (file->cksum.tag) { case md5: @@ -236,7 +298,7 @@ int haggis_validate_cksum(haggis_file *file) { return 0; } -int haggis_file_init(char *path, haggis_file *hf) { +int haggis_file_init(char *path, haggis_file *hf, haggis_algorithm a) { FILE *f; long len; @@ -260,6 +322,7 @@ int haggis_file_init(char *path, haggis_file *hf) { return 1; } fclose(f); + haggis_init_cksum(hf, a); return 0; } @@ -455,7 +518,7 @@ void haggis_node_deinit(haggis_node *node) { free(node); } -haggis_node* haggis_create_node(char *file, haggis_hardlink_list *list) { +haggis_node* haggis_create_node(char *file, haggis_algorithm a, haggis_hardlink_list *list) { struct stat *st = NULL; u16 mode; char *target; @@ -500,7 +563,7 @@ haggis_node* haggis_create_node(char *file, haggis_hardlink_list *list) { return node; } } - res = haggis_file_init(file, &node->filetype.f_type.file); + res = haggis_file_init(file, &node->filetype.f_type.file, a); if (res != 0) { haggis_node_deinit(node); return NULL; diff --git a/test/Makefile b/test/Makefile index 3ea394d..58a4f98 100644 --- a/test/Makefile +++ b/test/Makefile @@ -34,6 +34,8 @@ CFLAGS += -I../include LIBS += ../libhaggis.a LIBS += -lmd +tests += store_header +tests += check_header tests += store_device tests += load_device tests += store_md5 @@ -42,13 +44,15 @@ tests += store_sha1 tests += load_sha1 tests += store_sha256 tests += load_sha256 +tests += init_file_md5 +tests += init_file_sha1 total != echo $(tests) | wc -w | awk '{ print $$1 }' .PHONY: test test: $(tests) - @printf "\n\tRunning %i tests\n\n" $(total) + @echo -e "\n\t\e[0;33mRunning $(total) tests\e[0m\n" @idx=1 ; success=0 ; fail=0; for t in $(tests) ; \ - do printf "[%i/$(total)] \%-25s" $${idx} $${t} ; \ + do printf "[%02i/$(total)] \%-25s" $${idx} $${t} ; \ idx=$$(expr $${idx} + 1) ; \ ./$${t} ; \ if [ $$? -eq 0 ] ; \ diff --git a/test/check_header.c b/test/check_header.c new file mode 100644 index 0000000..53af19e --- /dev/null +++ b/test/check_header.c @@ -0,0 +1,13 @@ +#include "haggis_private.h" +#include + +int main() { + FILE *f; + int ret; + + f = fopen("output/header", "r"); + ret = haggis_check_header(f); + fclose(f); + return ret; +} + diff --git a/test/haggis_private.h b/test/haggis_private.h index f6aa430..03aff19 100644 --- a/test/haggis_private.h +++ b/test/haggis_private.h @@ -50,7 +50,7 @@ int validate_md5(haggis_file *file); int validate_sha1(haggis_file *file); int validate_sha256(haggis_file *file); int haggis_validate_cksum(haggis_file *file); -int haggis_file_init(char *path, haggis_file *hf); +int haggis_file_init(char *path, haggis_file *hf, haggis_algorithm a); int haggis_store_file(FILE *stream, haggis_file *file); int haggis_load_file(FILE *stream, haggis_file *f); void haggis_filename_init(char *target, haggis_filename *fname); diff --git a/test/init_file b/test/init_file new file mode 100755 index 0000000..2139d4b Binary files /dev/null and b/test/init_file differ diff --git a/test/init_file_md5.c b/test/init_file_md5.c new file mode 100644 index 0000000..2f7b273 --- /dev/null +++ b/test/init_file_md5.c @@ -0,0 +1,14 @@ +#include "haggis_private.h" +#include +#include +#include + +int main() { + haggis_file hf; + char *f = "check_header.c"; + const u8 buf[16] = { 127, 161, 170, 134, 33, 218, 100, 29, 250, 255, 15, 125, 109, 5, 216, 9 }; + + assert(haggis_file_init(f, &hf, md5) == 0); + assert(hf.cksum.tag == md5); + assert(memcmp(buf, hf.cksum.sum.md5, 16) == 0); +} diff --git a/test/init_file_sha1.c b/test/init_file_sha1.c new file mode 100644 index 0000000..fca9667 --- /dev/null +++ b/test/init_file_sha1.c @@ -0,0 +1,15 @@ +#include "haggis_private.h" +#include +#include +#include + +int main() { + haggis_file hf; + char *f = "check_header.c"; + const u8 buf[20] = { 175, 45, 7, 226, 140, 184, 187, 69, 59, 208, 246, 108, 187, 249, 63, 111, 56, 65, 1, 58 }; + + assert(haggis_file_init(f, &hf, sha1) == 0); + assert(hf.cksum.tag == sha1); + assert(memcmp(buf, hf.cksum.sum.sha1, 20) == 0); +} + diff --git a/test/store_header.c b/test/store_header.c new file mode 100644 index 0000000..580a8c1 --- /dev/null +++ b/test/store_header.c @@ -0,0 +1,13 @@ +#include "haggis_private.h" +#include + +int main() { + FILE *f; + int ret; + + f = fopen("output/header", "w"); + ret = haggis_store_header(f); + fclose(f); + return ret; +} +