/* 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_gns.c * @brief escrow-plugin-gns escrow plugin for the escrow of the key * using GNS and escrow identities * * @author Johannes Späth */ #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_escrow_plugin.h" #include "escrow_plugin_helper.h" #include #include #define GNUNET_ESCROW_GNS_NumberOfShares 6 #define GNUNET_ESCROW_GNS_ShareThreshold 3 /** * Identity handle */ static struct GNUNET_IDENTITY_Handle *identity_handle; /** * Handle for the plugin instance */ struct ESCROW_PluginHandle ph; /** * Start the GNS escrow of the key * * @param h the handle for the escrow component * @param ego the identity ego containing the private key * @param cb the function called upon completion * * @return plugin operation wrapper */ struct ESCROW_PluginOperationWrapper * start_gns_key_escrow (struct GNUNET_ESCROW_Handle *h, const struct GNUNET_IDENTITY_Ego *ego, GNUNET_SCHEDULER_TaskCallback cb) { const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk; sss_Keyshare keyshares; struct GNUNET_ESCROW_Anchor *anchor; int anchorDataSize; struct GNUNET_ESCROW_Plugin_AnchorContinuationWrapper *w; w = GNUNET_new (struct GNUNET_ESCROW_Plugin_AnchorContinuationWrapper); w->h = h; if (NULL == ego) { w->escrowAnchor = NULL; GNUNET_SCHEDULER_add_now (cb, w); return NULL; // TODO! } pk = GNUNET_IDENTITY_ego_get_private_key (ego); // split the private key (SSS) sss_create_keyshares(&keyshares, pk->d, GNUNET_ESCROW_GNS_NumberOfShares, GNUNET_ESCROW_GNS_ShareThreshold); // create the escrow identities // distribute the shares to the identities // TODO: implement anchorDataSize = 0; // TODO! anchor = GNUNET_malloc (sizeof (struct GNUNET_ESCROW_Anchor) + anchorDataSize); w->escrowAnchor = anchor; GNUNET_SCHEDULER_add_now (cb, w); return NULL; // TODO! } /** * Renew the GNS escrow of the key * * @param op the escrow operation * @param escrowAnchor the the escrow anchor returned by the start method */ void renew_gns_key_escrow (struct GNUNET_ESCROW_Operation *op, struct GNUNET_ESCROW_Anchor *escrowAnchor) { // TODO: implement op->cb_renew (NULL); } /** * Verify the GNS escrow of the key * * @param h the handle for the escrow component * @param ego the identity ego containing the private key * @param escrowAnchor the escrow anchor needed to restore the key * @param cb the function called upon completion * * @return plugin operation wrapper */ struct ESCROW_PluginOperationWrapper * verify_gns_key_escrow (struct GNUNET_ESCROW_Handle *h, const struct GNUNET_IDENTITY_Ego *ego, struct GNUNET_ESCROW_Anchor *escrowAnchor, GNUNET_SCHEDULER_TaskCallback cb) { struct GNUNET_ESCROW_Plugin_VerifyContinuationWrapper *w; w = GNUNET_new (struct GNUNET_ESCROW_Plugin_VerifyContinuationWrapper); w->h = h; // TODO: implement w->verificationResult = GNUNET_ESCROW_INVALID; GNUNET_SCHEDULER_add_now (cb, w); return NULL; } /** * Restore the key from GNS escrow * * @param h the handle for the escrow component * @param escrowAnchor the escrow anchor needed to restore the key * @param egoName the name of the ego to restore * @param cb the function called upon completion * * @return plugin operation wrapper */ struct ESCROW_PluginOperationWrapper * restore_gns_key_escrow (struct GNUNET_ESCROW_Handle *h, struct GNUNET_ESCROW_Anchor *escrowAnchor, char *egoName, GNUNET_SCHEDULER_TaskCallback cb) { struct GNUNET_ESCROW_Plugin_EgoContinuationWrapper *w; w = GNUNET_new (struct GNUNET_ESCROW_Plugin_EgoContinuationWrapper); w->h = h; // TODO: implement w->ego = NULL; GNUNET_SCHEDULER_add_now (cb, w); return NULL; } /** * Deserialize an escrow anchor string into a GNUNET_ESCROW_Anchor struct * * @param anchorString the encoded escrow anchor string * * @return the deserialized data packed into a GNUNET_ESCROW_Anchor struct */ struct GNUNET_ESCROW_Anchor * gns_anchor_string_to_data (struct GNUNET_ESCROW_Handle *h, char *anchorString) { struct GNUNET_ESCROW_Anchor *anchor; uint32_t data_size; data_size = strlen (anchorString) + 1; anchor = GNUNET_malloc (sizeof (struct GNUNET_ESCROW_Anchor) + data_size); anchor->size = data_size; // TODO: deserialize? GNUNET_memcpy (&anchor[1], anchorString, data_size); return anchor; } /** * Serialize an escrow anchor struct into a string * * @param h the handle for the escrow component * @param escrowAnchor the escrow anchor struct * * @return the encoded escrow anchor string */ char * gns_anchor_data_to_string (struct GNUNET_ESCROW_Handle *h, struct GNUNET_ESCROW_Anchor *escrowAnchor) { // TODO: implement return NULL; } /** * Cancel a GNS plugin operation. * * @param plugin_op_wrap the plugin operation wrapper containing the operation */ void cancel_gns_operation (struct ESCROW_PluginOperationWrapper *plugin_op_wrap) { // TODO: implement return; } /** * IdentityInitContinuation for the GNS plugin */ void gns_cont_init () { return; } /** * Entry point for the plugin. * * @param cls Config info * * @return the exported block API */ void * libgnunet_plugin_escrow_gns_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_gns_key_escrow; api->renew_key_escrow = &renew_gns_key_escrow; api->verify_key_escrow = &verify_gns_key_escrow; api->restore_key = &restore_gns_key_escrow; api->anchor_string_to_data = &gns_anchor_string_to_data; api->cancel_plugin_operation = &cancel_gns_operation; ph.id_init_cont = &gns_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_gns_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_gns.c */