static gboolean gcr_secret_exchange_default_generate_exchange_key (GcrSecretExchange *exchange, const gchar *scheme, guchar **public_key, gsize *n_public_key) { GcrSecretExchangeDefault *data = exchange->pv->default_exchange; if (data == NULL) { data = g_new0 (GcrSecretExchangeDefault, 1); if (!egg_dh_default_params (EXCHANGE_1_IKE_NAME, &data->prime, &data->base)) g_return_val_if_reached (FALSE); exchange->pv->default_exchange = data; exchange->pv->destroy_exchange = gcr_secret_exchange_default_free; } gcry_mpi_release (data->priv); data->priv = NULL; gcry_mpi_release (data->pub); data->pub = NULL; egg_secure_free (data->key); data->key = NULL; if (!egg_dh_gen_pair (data->prime, data->base, 0, &data->pub, &data->priv)) g_return_val_if_reached (FALSE); *public_key = mpi_to_data (data->pub, n_public_key); return *public_key != NULL; }
static GVariant * request_open_session_aes (SecretSession *session) { gcry_error_t gcry; gcry_mpi_t base; unsigned char *buffer; size_t n_buffer; GVariant *argument; g_assert (session->prime == NULL); g_assert (session->privat == NULL); g_assert (session->publi == NULL); egg_libgcrypt_initialize (); /* Initialize our local parameters and values */ if (!egg_dh_default_params ("ietf-ike-grp-modp-1024", &session->prime, &base)) g_return_val_if_reached (NULL); #if 0 g_printerr ("\n lib prime: "); gcry_mpi_dump (session->prime); g_printerr ("\n lib base: "); gcry_mpi_dump (base); g_printerr ("\n"); #endif if (!egg_dh_gen_pair (session->prime, base, 0, &session->publi, &session->privat)) g_return_val_if_reached (NULL); gcry_mpi_release (base); gcry = gcry_mpi_aprint (GCRYMPI_FMT_USG, &buffer, &n_buffer, session->publi); g_return_val_if_fail (gcry == 0, NULL); argument = g_variant_new_from_data (G_VARIANT_TYPE ("ay"), buffer, n_buffer, TRUE, gcry_free, buffer); return g_variant_new ("(sv)", ALGORITHMS_AES, argument); }