/*
This file is part of GNUnet
Copyright (C) 2020 GNUnet e.V.
GNUnet is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
* @file escrow/plugin_escrow_anastasis.c
* @brief escrow-plugin-anastasis escrow plugin for escrow of the key using Anastasis
*
* @author Johannes Späth
*/
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_escrow_plugin.h"
#include "escrow_plugin_helper.h"
#include
/**
* Identity handle
*/
static struct GNUNET_IDENTITY_Handle *identity_handle;
/**
* Handle for the plugin instance
*/
struct ESCROW_PluginHandle ph;
/**
* Start the Anastasis escrow of the key
*
* @param h the handle for the escrow component
* @param ego the identity ego containing the private key
* @param userSecret the user secret (e.g. for derivation of escrow identities)
* @param cb the function called upon completion
* @param op_id unique ID of the respective ESCROW_Operation
*
* @return plugin operation wrapper
*/
struct ESCROW_PluginOperationWrapper *
start_anastasis_key_escrow (struct GNUNET_ESCROW_Handle *h,
struct GNUNET_IDENTITY_Ego *ego,
const char *userSecret,
GNUNET_SCHEDULER_TaskCallback cb,
uint32_t op_id)
{
struct ESCROW_Plugin_AnchorContinuationWrapper *w;
w = GNUNET_new (struct ESCROW_Plugin_AnchorContinuationWrapper);
w->h = h;
w->op_id = op_id;
// TODO: implement
w->anchor = NULL;
w->emsg = _ ("Anastasis escrow is not yet implemented!\n");
GNUNET_SCHEDULER_add_now (cb, w);
return NULL;
}
/**
* Verify the Anastasis escrow of the key
*
* @param h the handle for the escrow component
* @param ego the identity ego containing the private key
* @param anchor the escrow anchor needed to restore the key
* @param cb the function called upon completion
* @param op_id unique ID of the respective ESCROW_Operation
*
* @return plugin operation wrapper
*/
struct ESCROW_PluginOperationWrapper *
verify_anastasis_key_escrow (struct GNUNET_ESCROW_Handle *h,
struct GNUNET_IDENTITY_Ego *ego,
struct GNUNET_ESCROW_Anchor *anchor,
GNUNET_SCHEDULER_TaskCallback cb,
uint32_t op_id)
{
struct ESCROW_Plugin_VerifyContinuationWrapper *w;
w = GNUNET_new (struct ESCROW_Plugin_VerifyContinuationWrapper);
w->h = h;
w->op_id = op_id;
// TODO: implement
w->verificationResult = GNUNET_ESCROW_INVALID;
w->emsg = _ ("Anastasis escrow is not yet implemented!\n");
GNUNET_SCHEDULER_add_now (cb, w);
return NULL;
}
/**
* Restore the key from Anastasis escrow
*
* @param h the handle for the escrow component
* @param anchor the escrow anchor needed to restore the key
* @param cb the function called upon completion
* @param op_id unique ID of the respective ESCROW_Operation
*
* @return plugin operation wrapper
*/
struct ESCROW_PluginOperationWrapper *
restore_anastasis_key_escrow (struct GNUNET_ESCROW_Handle *h,
struct GNUNET_ESCROW_Anchor *anchor,
GNUNET_SCHEDULER_TaskCallback cb,
uint32_t op_id)
{
struct ESCROW_Plugin_EgoContinuationWrapper *w;
w = GNUNET_new (struct ESCROW_Plugin_EgoContinuationWrapper);
w->h = h;
w->op_id = op_id;
// TODO: implement
w->ego = NULL;
w->emsg = _ ("Anastasis escrow is not yet implemented!\n");
GNUNET_SCHEDULER_add_now (cb, w);
return NULL;
}
/**
* Get the status of a Anastasis escrow
*
* @param h the handle for the escrow component
* @param ego the identity ego of which the status has to be obtained
*
* @return the status of the escrow packed into a GNUNET_ESCROW_Status struct
*/
struct GNUNET_ESCROW_Status *
anastasis_get_status (struct GNUNET_ESCROW_Handle *h,
struct GNUNET_IDENTITY_Ego *ego)
{
return ESCROW_get_escrow_status (h, ego);
}
/**
* Cancel an Anastasis plugin operation.
*
* @param plugin_op_wrap the plugin operation wrapper containing the operation
*/
void
cancel_anastasis_operation (struct ESCROW_PluginOperationWrapper *plugin_op_wrap)
{
// TODO: implement
return;
}
/**
* IdentityInitContinuation for the Anastasis plugin
*/
void
anastasis_cont_init ()
{
return;
}
/**
* Entry point for the plugin.
*
* @param cls Config info
*
* @return the exported block API
*/
void *
libgnunet_plugin_escrow_anastasis_init (void *cls)
{
struct GNUNET_ESCROW_KeyPluginFunctions *api;
struct GNUNET_CONFIGURATION_Handle *cfg = cls;
api = GNUNET_new (struct GNUNET_ESCROW_KeyPluginFunctions);
api->start_key_escrow = &start_anastasis_key_escrow;
api->verify_key_escrow = &verify_anastasis_key_escrow;
api->restore_key = &restore_anastasis_key_escrow;
api->get_status = &anastasis_get_status;
api->cancel_plugin_operation = &cancel_anastasis_operation;
ph.state = ESCROW_PLUGIN_STATE_INIT;
ph.id_init_cont = &anastasis_cont_init;
identity_handle = GNUNET_IDENTITY_connect (cfg,
&ESCROW_list_ego,
&ph);
return api;
}
/**
* Exit point from the plugin.
*
* @param cls the return value from #libgnunet_plugin_block_test_init()
*
* @return NULL
*/
void *
libgnunet_plugin_escrow_anastasis_done (void *cls)
{
struct GNUNET_RECLAIM_EscrowKeyPluginFunctions *api = cls;
GNUNET_free (api);
GNUNET_IDENTITY_disconnect (identity_handle);
ESCROW_cleanup_ego_list (&ph);
return NULL;
}
/* end of plugin_escrow_anastasis.c */