diff options
Diffstat (limited to 'src/c/liberasurecode/test/utils/chksum/test_alg_sig.c')
-rw-r--r-- | src/c/liberasurecode/test/utils/chksum/test_alg_sig.c | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/src/c/liberasurecode/test/utils/chksum/test_alg_sig.c b/src/c/liberasurecode/test/utils/chksum/test_alg_sig.c new file mode 100644 index 0000000..09c9111 --- /dev/null +++ b/src/c/liberasurecode/test/utils/chksum/test_alg_sig.c @@ -0,0 +1,263 @@ +/* * Copyright (c) 2013, Kevin Greenan (kmgreen2@gmail.com) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY + * THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "alg_sig.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <time.h> + +// Max is 8 bytes right now (64-bits) +#define MAX_SIG_LEN 8 + +void fill_random_buffer(char *buf, int size) +{ + int i; + + for (i=0; i < size; i++) { + buf[i] = (char)(rand() % 256); + } +} + +void compute_parity(char **data, char* parity, int num_data, int size) +{ + int i, j; + + bzero(parity, size); + + for (i=0; i < num_data; i++) { + for (j=0; j < size; j++) { + parity[j] ^= data[i][j]; + } + } +} + +int check_parity_of_sigs(char **sigs, int num_data, int size) +{ + int i, j; + int ret = 0; + char *parity_sig = (char*)malloc(MAX_SIG_LEN); + + bzero(parity_sig, MAX_SIG_LEN); + + for (i=0; i < num_data; i++) { + for (j=0; j < MAX_SIG_LEN; j++) { + parity_sig[j] ^= sigs[i][j]; + } + } + + if (memcmp(parity_sig, sigs[num_data], MAX_SIG_LEN) != 0) { + fprintf(stderr, "Signatures do not match:\n"); + for (i=0; i < MAX_SIG_LEN; i++) { + fprintf(stderr, "parity_sig[%d] = 0x%x, sigs[%d][%d] = 0x%x\n", i, parity_sig[i], num_data, i, sigs[num_data][i]); + } + ret = 1; + } + + free(parity_sig); + + return ret; +} + +static int basic_xor_test_8_32() +{ + int blocksize = 65536; + int num_data = 12; + char **data; + char *parity; + char **sigs; + int i; + int ret = 0; + + alg_sig_t* sig_handle = init_alg_sig(32, 8); + if (NULL == sig_handle) { + goto out; + } + data = (char**)malloc(sizeof(char*) * num_data); + sigs = (char**)malloc(sizeof(char*) * (num_data + 1)); + for (i=0; i < num_data; i++) { + data[i] = (char*)malloc(sizeof(char)*blocksize); + fill_random_buffer(data[i], blocksize); + sigs[i] = (char*)malloc(MAX_SIG_LEN); + + } + parity = (char*)malloc(sizeof(char)*blocksize); + sigs[i] = (char*)malloc(MAX_SIG_LEN); + + compute_parity(data, parity, num_data, blocksize); + + for (i=0; i < num_data; i++) { + bzero(sigs[i], MAX_SIG_LEN); + compute_alg_sig(sig_handle, data[i], blocksize, sigs[i]); + } + bzero(sigs[i], MAX_SIG_LEN); + compute_alg_sig(sig_handle, parity, blocksize, sigs[i]); + + ret = check_parity_of_sigs(sigs, num_data, blocksize); + + for (i=0; i < num_data; i++) { + free(data[i]); + free(sigs[i]); + } + + free(parity); + free(sigs[num_data]); + free(sigs); + free(data); + destroy_alg_sig(sig_handle); + +out: + return ret; +} + +static int basic_xor_test_16_64() +{ + int blocksize = 65536; + int num_data = 12; + char **data; + char *parity; + char **sigs; + int i; + int ret = 0; + + alg_sig_t* sig_handle = init_alg_sig(64, 16); + if (NULL == sig_handle) { + goto out; + } + + data = (char**)malloc(sizeof(char*) * num_data); + sigs = (char**)malloc(sizeof(char*) * (num_data + 1)); + for (i=0; i < num_data; i++) { + data[i] = (char*)malloc(sizeof(char)*blocksize); + fill_random_buffer(data[i], blocksize); + sigs[i] = (char*)malloc(MAX_SIG_LEN); + } + parity = (char*)malloc(sizeof(char)*blocksize); + sigs[i] = (char*)malloc(MAX_SIG_LEN); + + compute_parity(data, parity, num_data, blocksize); + + for (i=0; i < num_data; i++) { + bzero(sigs[i], MAX_SIG_LEN); + compute_alg_sig(sig_handle, data[i], blocksize, sigs[i]); + } + bzero(sigs[i], MAX_SIG_LEN); + compute_alg_sig(sig_handle, parity, blocksize, sigs[i]); + + ret = check_parity_of_sigs(sigs, num_data, blocksize); + + for (i=0; i < num_data; i++) { + free(data[i]); + free(sigs[i]); + } + + free(parity); + free(sigs[num_data]); + free(sigs); + free(data); + destroy_alg_sig(sig_handle); + +out: + return ret; +} + +static int basic_xor_test_16_32() +{ + int blocksize = 65536; + int num_data = 12; + char **data; + char *parity; + char **sigs; + int i; + int ret = 0; + + alg_sig_t* sig_handle = init_alg_sig(32, 16); + if (NULL == sig_handle) { + goto out; + } + data = (char**)malloc(sizeof(char*) * num_data); + sigs = (char**)malloc(sizeof(char*) * (num_data + 1)); + for (i=0; i < num_data; i++) { + data[i] = (char*)malloc(sizeof(char)*blocksize); + fill_random_buffer(data[i], blocksize); + sigs[i] = (char*)malloc(MAX_SIG_LEN); + + } + parity = (char*)malloc(sizeof(char)*blocksize); + sigs[i] = (char*)malloc(MAX_SIG_LEN); + + compute_parity(data, parity, num_data, blocksize); + + for (i=0; i < num_data; i++) { + bzero(sigs[i], MAX_SIG_LEN); + compute_alg_sig(sig_handle, data[i], blocksize, sigs[i]); + } + bzero(sigs[i], MAX_SIG_LEN); + compute_alg_sig(sig_handle, parity, blocksize, sigs[i]); + + ret = check_parity_of_sigs(sigs, num_data, blocksize); + + for (i=0; i < num_data; i++) { + free(data[i]); + free(sigs[i]); + } + + free(parity); + free(sigs[num_data]); + free(sigs); + free(data); + destroy_alg_sig(sig_handle); + +out: + return ret; +} + +int main(int argc, char**argv) +{ + int ret; + int num_failed = 0; + + srand(time(NULL)); + + ret = basic_xor_test_16_32(); + if (ret) { + fprintf(stderr, "basic_xor_test_16_32 has failed!\n"); + num_failed++; + } + ret = basic_xor_test_16_64(); + if (ret) { + fprintf(stderr, "basic_xor_test_16_64 has failed!\n"); + num_failed++; + } + ret = basic_xor_test_8_32(); + if (ret) { + fprintf(stderr, "basic_xor_test_8_32 has failed!\n"); + num_failed++; + } + + if (num_failed == 0) { + fprintf(stderr, "Tests pass!!!\n"); + } + return num_failed; +} |