#include <stdlib.h>
#include <stdio.h>
#include <include/ecctk-prototype.h>
#include <include/ecctk-ecc.h>
#define MAX_SECRET 5
s2byte secret_sharing()
{
s2byte ret = -1,
i,
j;
s1byte *share_file[MAX_SECRET] = {"share1_file", "share2_file", "share3_file", "share4_file", "share5_file"};
u1byte secret[] = "This is my Secret to share";
u1byte *result_secret = NULL;
u2byte result_secret_size;
u2byte nb_generated_secret = MAX_SECRET,
nb_necessary_secret = MAX_SECRET-2;
SHARING_CTX **ctx = NULL;
ctx = CreateSecretSharingCtx(secret, sizeof(secret), nb_necessary_secret, nb_generated_secret);
if (ctx == NULL)
{
fprintf(stderr, "Create secret failed\n\n");
return EXIT_FAILURE;
}
for (i = 0; i < nb_generated_secret; i++)
{
ret = WriteFileSharingCtx(share_file[i], ctx[i]);
if (ret != ECCTK_ECC_NO_ERROR)
{
fprintf(stderr, "Write sharing secret (Error : %d)\n", ret);
goto create_end;
}
SharingCtxFree(ctx[i]);
ctx[i] = NULL;
}
SharingPtFree(ctx);
ctx = NULL;
ctx = SharingPtInit(nb_necessary_secret);
if (ctx == NULL)
{
fprintf(stderr, "Create pointer context failed\n");
goto val_end;
}
for (i = 0, j = 0; i < nb_necessary_secret; i++, j+=2)
{
ctx[i] = ReadFileSharingCtx(share_file[j]);
if (ctx[i] == NULL)
{
fprintf(stderr, "Read sharing secret on %s failed\n", share_file[j]);
goto val_end;
}
}
result_secret = ResolveSecretSharingCtx(ctx, &result_secret_size);
if (result_secret == NULL)
{
fprintf(stderr, "Error during compute the secret\n");
goto val_end;
}
fprintf(stdout, "Secret (%d) : '%s'\n", result_secret_size, result_secret);
for (i = 0; i < nb_necessary_secret; i++)
SharingCtxFree(ctx[i]);
SharingPtFree(ctx);
free(result_secret);
return EXIT_SUCCESS;
create_end:
if (ctx != NULL)
{
for (i = 0; i < nb_generated_secret; i++)
SharingCtxFree(ctx[i]);
SharingPtFree(ctx);
}
return EXIT_FAILURE;
val_end:
if (ctx != NULL)
{
for (i = 0; i < nb_necessary_secret; i++)
SharingCtxFree(ctx[i]);
SharingPtFree(ctx);
}
if (result_secret != NULL)
free(result_secret);
return EXIT_FAILURE;
}