int AF_split(char *src, char *dst, size_t blocksize, unsigned int blocknumbers, const char *hash) { unsigned int i; char *bufblock; int r = -EINVAL; const EVP_MD *hash_id; OpenSSL_add_all_digests(); if (!(hash_id = EVP_get_digestbyname(hash))) return -EINVAL; if((bufblock = calloc(blocksize, 1)) == NULL) return -ENOMEM; /* process everything except the last block */ for(i=0; i<blocknumbers-1; i++) { r = getRandom(dst+(blocksize*i),blocksize); if(r < 0) goto out; XORblock(dst+(blocksize*i),bufblock,bufblock,blocksize); if(diffuse(bufblock, bufblock, blocksize, hash_id)) goto out; } /* the last block is computed */ XORblock(src,bufblock,dst+(i*blocksize),blocksize); r = 0; out: free(bufblock); return r; }
int AF_merge(char *src, char *dst, size_t blocksize, unsigned int blocknumbers, const char *hash) { unsigned int i; char *bufblock; int r = -EINVAL; const EVP_MD *hash_id; OpenSSL_add_all_digests(); if (!(hash_id = EVP_get_digestbyname(hash))) return -EINVAL; if((bufblock = calloc(blocksize, 1)) == NULL) return -ENOMEM; memset(bufblock,0,blocksize); for(i=0; i<blocknumbers-1; i++) { XORblock(src+(blocksize*i),bufblock,bufblock,blocksize); if(diffuse(bufblock, bufblock, blocksize, hash_id)) goto out; } XORblock(src + blocksize * i, bufblock, dst, blocksize); r = 0; out: free(bufblock); return 0; }
int AF_split(char *src, char *dst, size_t blocksize, unsigned int blocknumbers, const char *hash) { unsigned int i; char *bufblock; int r = -EINVAL; if((bufblock = calloc(blocksize, 1)) == NULL) return -ENOMEM; /* process everything except the last block */ for(i=0; i<blocknumbers-1; i++) { r = crypt_random_get(NULL, dst+(blocksize*i), blocksize, CRYPT_RND_NORMAL); if(r < 0) goto out; XORblock(dst+(blocksize*i),bufblock,bufblock,blocksize); if(diffuse(bufblock, bufblock, blocksize, hash)) goto out; } /* the last block is computed */ XORblock(src,bufblock,dst+(i*blocksize),blocksize); r = 0; out: free(bufblock); return r; }
int AF_merge(char *src, char *dst, size_t blocksize, unsigned int blocknumbers, const char *hash) { unsigned int i; char *bufblock; int r = -EINVAL; if((bufblock = calloc(blocksize, 1)) == NULL) return -ENOMEM; memset(bufblock,0,blocksize); for(i=0; i<blocknumbers-1; i++) { XORblock(src+(blocksize*i),bufblock,bufblock,blocksize); if(diffuse(bufblock, bufblock, blocksize, hash)) goto out; } XORblock(src + blocksize * i, bufblock, dst, blocksize); r = 0; out: free(bufblock); return r; }