[gnome-keyring] ui: Use GcrSecretExchange for passing passwords to/from prompt



commit 08454bb7d33f08fe38468025d92287734e8fd8a6
Author: Stef Walter <stefw collabora co uk>
Date:   Sat Oct 1 13:07:38 2011 +0200

    ui: Use GcrSecretExchange for passing passwords to/from prompt
    
     * And integrate this with our credential stuff inside of the
       dbus secret service prompts
     * Fix a bug in GcrSecretService if key already derived, and data
       is received.

 daemon/dbus/Makefile.am             |    4 +-
 daemon/dbus/gkd-secret-exchange.c   |  237 ++++++++++++++++++++++++++++
 daemon/dbus/gkd-secret-exchange.h   |   50 ++++++
 daemon/dbus/gkd-secret-prompt.c     |  120 +++------------
 daemon/dbus/gkd-secret-prompt.h     |    2 -
 daemon/dbus/gkd-secret-secret.c     |   14 ++
 daemon/dbus/gkd-secret-secret.h     |    6 +
 daemon/dbus/gkd-secret-types.h      |    1 +
 egg/Makefile.am                     |    2 +-
 gcr/gcr-secret-exchange.c           |   10 +-
 pkcs11/wrap-layer/tests/Makefile.am |    1 +
 ui/Makefile.am                      |    8 +-
 ui/gku-prompt-tool.c                |  108 +++----------
 ui/gku-prompt-util.c                |  224 --------------------------
 ui/gku-prompt-util.h                |   49 ------
 ui/gku-prompt.c                     |  298 +++++++++++------------------------
 ui/gku-prompt.h                     |   18 +--
 ui/tests/Makefile.am                |   26 ---
 ui/tests/test-util.c                |  166 -------------------
 19 files changed, 457 insertions(+), 887 deletions(-)
---
diff --git a/daemon/dbus/Makefile.am b/daemon/dbus/Makefile.am
index 3f1dc8c..20180d3 100644
--- a/daemon/dbus/Makefile.am
+++ b/daemon/dbus/Makefile.am
@@ -6,7 +6,8 @@ INCLUDES = \
 	$(DAEMON_CFLAGS) \
 	$(GOBJECT_CFLAGS) \
 	$(GLIB_CFLAGS) \
-	-DGCK_API_SUBJECT_TO_CHANGE
+	-DGCK_API_SUBJECT_TO_CHANGE \
+	-DGCR_API_SUBJECT_TO_CHANGE
 
 noinst_LTLIBRARIES = libgkd-dbus.la
 
@@ -21,6 +22,7 @@ libgkd_dbus_la_SOURCES = \
 	gkd-secret-create.c gkd-secret-create.h \
 	gkd-secret-dispatch.c gkd-secret-dispatch.h \
 	gkd-secret-error.c gkd-secret-error.h \
+	gkd-secret-exchange.c gkd-secret-exchange.h \
 	gkd-secret-introspect.c gkd-secret-introspect.h \
 	gkd-secret-lock.c gkd-secret-lock.h \
 	gkd-secret-objects.c gkd-secret-objects.h \
diff --git a/daemon/dbus/gkd-secret-exchange.c b/daemon/dbus/gkd-secret-exchange.c
new file mode 100644
index 0000000..7469dd6
--- /dev/null
+++ b/daemon/dbus/gkd-secret-exchange.c
@@ -0,0 +1,237 @@
+/*
+ * gnome-keyring
+ *
+ * Copyright (C) 2011 Collabora Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Author: Stef Walter <stefw collabora co uk>
+ */
+
+#include "config.h"
+
+#include "gkd-secret-exchange.h"
+#include "gkd-secret-secret.h"
+#include "gkd-secret-service.h"
+#include "gkd-secret-session.h"
+
+#include "gcr/gcr-secret-exchange.h"
+
+#include <glib/gi18n.h>
+
+#include <string.h>
+
+enum {
+	PROP_0,
+	PROP_CALLER,
+	PROP_SERVICE,
+};
+
+struct _GkdSecretExchange {
+	GcrSecretExchange parent;
+	gchar *caller;
+	GkdSecretService *service;
+	GkdSecretSession *session;
+	GkdSecretSecret *last_secret;
+};
+
+struct _GkdSecretExchangeClass {
+	GcrSecretExchangeClass parent_class;
+};
+
+G_DEFINE_TYPE (GkdSecretExchange, gkd_secret_exchange, GCR_TYPE_SECRET_EXCHANGE);
+
+static void
+gkd_secret_exchange_init (GkdSecretExchange *self)
+{
+
+}
+
+static void
+gkd_secret_exchange_set_property (GObject *obj,
+                                  guint prop_id,
+                                  const GValue *value,
+                                  GParamSpec *pspec)
+{
+	GkdSecretExchange *self = GKD_SECRET_EXCHANGE (obj);
+
+	switch (prop_id) {
+	case PROP_CALLER:
+		g_return_if_fail (!self->caller);
+		self->caller = g_value_dup_string (value);
+		break;
+	case PROP_SERVICE:
+		g_return_if_fail (!self->service);
+		self->service = g_value_get_object (value);
+		g_return_if_fail (self->service);
+		g_object_add_weak_pointer (G_OBJECT (self->service),
+		                           (gpointer*)&(self->service));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+gkd_secret_exchange_get_property (GObject *obj,
+                                  guint prop_id,
+                                  GValue *value,
+                                  GParamSpec *pspec)
+{
+	GkdSecretExchange *self = GKD_SECRET_EXCHANGE (obj);
+
+	switch (prop_id) {
+	case PROP_CALLER:
+		g_value_set_string (value, self->caller);
+		break;
+	case PROP_SERVICE:
+		g_value_set_object (value, self->service);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+gkd_secret_exchange_finalize (GObject *obj)
+{
+	GkdSecretExchange *self = GKD_SECRET_EXCHANGE (obj);
+
+	if (self->service) {
+		g_object_remove_weak_pointer (G_OBJECT (self->service),
+		                              (gpointer*)&(self->service));
+		self->service = NULL;
+	}
+
+	g_clear_object (&self->session);
+	gkd_secret_secret_free (self->last_secret);
+	g_free (self->caller);
+
+	G_OBJECT_CLASS (gkd_secret_exchange_parent_class)->finalize (obj);
+}
+
+static gboolean
+gkd_secret_exchange_generate_exchange_key (GcrSecretExchange *exchange,
+                                           const gchar *scheme,
+                                           guchar **public_key,
+                                           gsize *n_public_key)
+{
+	GkdSecretExchange *self = GKD_SECRET_EXCHANGE (exchange);
+
+	g_return_val_if_fail (self->service != NULL, FALSE);
+
+	g_clear_object (&self->session);
+	self->session = gkd_secret_session_new (self->service, self->caller);
+	*public_key = gkd_secret_session_begin (self->session,
+	                                        "ietf-ike-grp-modp-1536",
+	                                        n_public_key);
+	return (*public_key != NULL) ? TRUE : FALSE;
+}
+
+static gboolean
+gkd_secret_exchange_derive_transport_key (GcrSecretExchange *exchange,
+                                          const guchar *peer,
+                                          gsize n_peer)
+{
+	GkdSecretExchange *self = GKD_SECRET_EXCHANGE (exchange);
+
+	return gkd_secret_session_complete (self->session, peer, n_peer);
+}
+
+static gboolean
+gkd_secret_exchange_encrypt_transport_data (GcrSecretExchange *exchange,
+                                            GckAllocator allocator,
+                                            const guchar *plain_text,
+                                            gsize n_plain_text,
+                                            guchar **parameter,
+                                            gsize *n_parameter,
+                                            guchar **cipher_text,
+                                            gsize *n_cipher_text)
+{
+	g_warning ("Not implemented: a GkdSecretExchange was used to encrypt a secret");
+	return FALSE;
+}
+
+static gboolean
+gkd_secret_exchange_decrypt_transport_data (GcrSecretExchange *exchange,
+                                            GckAllocator allocator,
+                                            const guchar *cipher_text,
+                                            gsize n_cipher_text,
+                                            const guchar *parameter,
+                                            gsize n_parameter,
+                                            guchar **plain_text,
+                                            gsize *n_plain_text)
+{
+	GkdSecretExchange *self = GKD_SECRET_EXCHANGE (exchange);
+
+	gkd_secret_secret_free (self->last_secret);
+
+	self->last_secret = gkd_secret_secret_new (self->session,
+	                                           parameter, n_parameter,
+	                                           cipher_text, n_cipher_text);
+
+	*plain_text = NULL;
+	*n_plain_text = 0;
+	return TRUE;
+}
+
+static void
+gkd_secret_exchange_class_init (GkdSecretExchangeClass *klass)
+{
+	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+	GcrSecretExchangeClass *exchange_class = GCR_SECRET_EXCHANGE_CLASS (klass);
+
+	gobject_class->finalize = gkd_secret_exchange_finalize;
+	gobject_class->get_property = gkd_secret_exchange_get_property;
+	gobject_class->set_property = gkd_secret_exchange_set_property;
+
+	exchange_class->generate_exchange_key = gkd_secret_exchange_generate_exchange_key;
+	exchange_class->derive_transport_key = gkd_secret_exchange_derive_transport_key;
+	exchange_class->encrypt_transport_data = gkd_secret_exchange_encrypt_transport_data;
+	exchange_class->decrypt_transport_data = gkd_secret_exchange_decrypt_transport_data;
+
+	g_object_class_install_property (gobject_class, PROP_CALLER,
+		g_param_spec_string ("caller", "Caller", "DBus caller name",
+		                     NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY ));
+
+	g_object_class_install_property (gobject_class, PROP_SERVICE,
+		g_param_spec_object ("service", "Service", "Service which owns this session",
+		                     GKD_SECRET_TYPE_SERVICE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+}
+
+GkdSecretExchange *
+gkd_secret_exchange_new (GkdSecretService *service,
+                         const gchar *caller)
+{
+	return g_object_new (GKD_TYPE_SECRET_EXCHANGE,
+	                     "service", service,
+	                     "caller", caller,
+	                     NULL);
+}
+
+GkdSecretSecret *
+gkd_secret_exchange_take_last_secret (GkdSecretExchange *self)
+{
+	GkdSecretSecret *secret;
+
+	g_return_val_if_fail (GKD_IS_SECRET_EXCHANGE (self), NULL);
+
+	secret = self->last_secret;
+	self->last_secret = NULL;
+	return secret;
+}
diff --git a/daemon/dbus/gkd-secret-exchange.h b/daemon/dbus/gkd-secret-exchange.h
new file mode 100644
index 0000000..f8ed12c
--- /dev/null
+++ b/daemon/dbus/gkd-secret-exchange.h
@@ -0,0 +1,50 @@
+/*
+ * gnome-keyring
+ *
+ * Copyright (C) 2011 Collabora Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Author: Stef Walter <stefw collabora co uk>
+ */
+
+#ifndef __GKD_SECRET_EXCHANGE_H__
+#define __GKD_SECRET_EXCHANGE_H__
+
+#include <glib-object.h>
+
+#include "gkd-secret-prompt.h"
+#include "gkd-secret-types.h"
+
+#include "gck/gck.h"
+
+#define GKD_TYPE_SECRET_EXCHANGE               (gkd_secret_exchange_get_type ())
+#define GKD_SECRET_EXCHANGE(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), GKD_TYPE_SECRET_EXCHANGE, GkdSecretExchange))
+#define GKD_SECRET_EXCHANGE_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), GKD_TYPE_SECRET_EXCHANGE, GkdSecretExchangeClass))
+#define GKD_IS_SECRET_EXCHANGE(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GKD_TYPE_SECRET_EXCHANGE))
+#define GKD_IS_SECRET_EXCHANGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE ((klass), GKD_TYPE_SECRET_EXCHANGE))
+#define GKD_SECRET_EXCHANGE_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), GKD_TYPE_SECRET_EXCHANGE, GkdSecretExchangeClass))
+
+typedef struct _GkdSecretExchangeClass GkdSecretExchangeClass;
+
+GType               gkd_secret_exchange_get_type              (void) G_GNUC_CONST;
+
+GkdSecretExchange * gkd_secret_exchange_new                   (GkdSecretService *service,
+                                                               const gchar *caller);
+
+GkdSecretSecret *   gkd_secret_exchange_take_last_secret      (GkdSecretExchange *self);
+
+#endif /* __GKD_SECRET_EXCHANGE_H__ */
diff --git a/daemon/dbus/gkd-secret-prompt.c b/daemon/dbus/gkd-secret-prompt.c
index c1edd4d..9d8f277 100644
--- a/daemon/dbus/gkd-secret-prompt.c
+++ b/daemon/dbus/gkd-secret-prompt.c
@@ -23,6 +23,7 @@
 
 #include "gkd-dbus-util.h"
 #include "gkd-secret-dispatch.h"
+#include "gkd-secret-exchange.h"
 #include "gkd-secret-introspect.h"
 #include "gkd-secret-service.h"
 #include "gkd-secret-prompt.h"
@@ -45,14 +46,11 @@ enum {
 	PROP_SERVICE
 };
 
-#define PROMPT_IKE_GROUP  "ietf-ike-grp-modp-1536"
-
 struct _GkdSecretPromptPrivate {
 	gchar *object_path;
 	GkdSecretService *service;
-	GkdSecretSession *session;
+	GkdSecretExchange *exchange;
 	gboolean prompted;
-	gboolean negotiated;
 	gboolean completed;
 	gchar *caller;
 	gchar *window_id;
@@ -69,63 +67,6 @@ static guint unique_prompt_number = 0;
  * INTERNAL
  */
 
-static void
-setup_transport_params (GkdSecretPrompt *self)
-{
-	GkuPrompt *prompt = GKU_PROMPT (self);
-	gsize n_public, n_prime, n_base;
-	gconstpointer prime, base;
-	gpointer public;
-
-	if (self->pv->session)
-		g_object_unref (self->pv->session);
-	self->pv->session = gkd_secret_session_new (self->pv->service, self->pv->caller);
-
-	public = gkd_secret_session_begin (self->pv->session, PROMPT_IKE_GROUP, &n_public);
-	g_return_if_fail (public);
-	self->pv->negotiated = FALSE;
-
-	gku_prompt_set_transport_param (prompt, "public", public, n_public);
-	g_free (public);
-
-	/* Setup transport crypto */
-	if (!egg_dh_default_params_raw (PROMPT_IKE_GROUP, &prime, &n_prime, &base, &n_base))
-		g_return_if_reached ();
-
-	gku_prompt_set_transport_param (prompt, "prime", prime, n_prime);
-	gku_prompt_set_transport_param (prompt, "base", base, n_base);
-}
-
-static gboolean
-complete_transport_params (GkdSecretPrompt *self)
-{
-	GkuPrompt *prompt = GKU_PROMPT (self);
-	gboolean result;
-	gsize n_peer;
-	gpointer peer;
-
-	if (self->pv->negotiated)
-		return TRUE;
-
-	g_return_val_if_fail (self->pv->session, FALSE);
-
-	peer = gku_prompt_get_transport_param (prompt, "public", &n_peer);
-	if (peer == NULL) {
-		g_warning ("prompt did not return a public dh key");
-		return FALSE;
-	}
-
-	result = gkd_secret_session_complete (self->pv->session, peer, n_peer);
-	g_free (peer);
-
-	if (result)
-		self->pv->negotiated = TRUE;
-	else
-		g_warning ("negotiation of transport crypto with prompt failed");
-
-	return result;
-}
-
 static GkuPrompt*
 on_prompt_attention (gpointer user_data)
 {
@@ -138,7 +79,6 @@ on_prompt_attention (gpointer user_data)
 	if (self->pv->completed)
 		return NULL;
 
-	setup_transport_params (self);
 	return g_object_ref (self);
 }
 
@@ -237,10 +177,8 @@ gkd_secret_prompt_responded (GkuPrompt *base)
 	GKD_SECRET_PROMPT_GET_CLASS (self)->prompt_ready (self);
 
 	/* Not yet done, will display again */
-	if (!self->pv->completed) {
-		setup_transport_params (self);
+	if (!self->pv->completed)
 		return TRUE;
-	}
 
 	return FALSE;
 }
@@ -291,19 +229,23 @@ gkd_secret_prompt_real_dispatch_message (GkdSecretDispatch *base, DBusMessage *m
 }
 
 
-static GObject*
-gkd_secret_prompt_constructor (GType type, guint n_props, GObjectConstructParam *props)
+static void
+gkd_secret_prompt_constructed (GObject *obj)
 {
-	GkdSecretPrompt *self = GKD_SECRET_PROMPT (G_OBJECT_CLASS (gkd_secret_prompt_parent_class)->constructor(type, n_props, props));
+	GkdSecretPrompt *self = GKD_SECRET_PROMPT (obj);
 
-	g_return_val_if_fail (self, NULL);
-	g_return_val_if_fail (self->pv->caller, NULL);
-	g_return_val_if_fail (self->pv->service, NULL);
+	G_OBJECT_CLASS (gkd_secret_prompt_parent_class)->constructed (obj);
+
+	g_return_if_fail (self->pv->caller);
+	g_return_if_fail (self->pv->service);
 
 	/* Setup the path for the object */
 	self->pv->object_path = g_strdup_printf (SECRET_PROMPT_PREFIX "/p%d", ++unique_prompt_number);
 
-	return G_OBJECT (self);
+	self->pv->exchange = gkd_secret_exchange_new (self->pv->service, self->pv->caller);
+
+	/* Set the exchange for the prompt */
+	g_object_set (self, "exchange", self->pv->exchange, NULL);
 }
 
 static void
@@ -326,9 +268,7 @@ gkd_secret_prompt_dispose (GObject *obj)
 		self->pv->service = NULL;
 	}
 
-	if (self->pv->session)
-		g_object_unref (self->pv->session);
-	self->pv->session = NULL;
+	g_clear_object (&self->pv->exchange);
 
 	G_OBJECT_CLASS (gkd_secret_prompt_parent_class)->dispose (obj);
 }
@@ -340,7 +280,6 @@ gkd_secret_prompt_finalize (GObject *obj)
 
 	g_assert (!self->pv->object_path);
 	g_assert (!self->pv->service);
-	g_assert (!self->pv->session);
 
 	g_free (self->pv->caller);
 	self->pv->caller = NULL;
@@ -400,7 +339,7 @@ gkd_secret_prompt_class_init (GkdSecretPromptClass *klass)
 	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 	GkuPromptClass *prompt_class = GKU_PROMPT_CLASS (klass);
 
-	gobject_class->constructor = gkd_secret_prompt_constructor;
+	gobject_class->constructed = gkd_secret_prompt_constructed;
 	gobject_class->dispose = gkd_secret_prompt_dispose;
 	gobject_class->finalize = gkd_secret_prompt_finalize;
 	gobject_class->set_property = gkd_secret_prompt_set_property;
@@ -492,14 +431,6 @@ gkd_secret_prompt_dismiss (GkdSecretPrompt *self)
 	emit_completed (self, TRUE);
 }
 
-GkdSecretSession*
-gkd_secret_prompt_get_session (GkdSecretPrompt *self)
-{
-	g_return_val_if_fail (GKD_SECRET_IS_PROMPT (self), NULL);
-	g_return_val_if_fail (self->pv->service, NULL);
-	return self->pv->session;
-}
-
 GckObject*
 gkd_secret_prompt_lookup_collection (GkdSecretPrompt *self, const gchar *path)
 {
@@ -512,23 +443,14 @@ gkd_secret_prompt_lookup_collection (GkdSecretPrompt *self, const gchar *path)
 	return gkd_secret_objects_lookup_collection (objects, self->pv->caller, path);
 }
 
-GkdSecretSecret*
+GkdSecretSecret *
 gkd_secret_prompt_get_secret (GkdSecretPrompt *self, const gchar *password_type)
 {
-	gpointer parameter, value;
-	gsize n_parameter, n_value;
-
 	g_return_val_if_fail (GKD_SECRET_IS_PROMPT (self), NULL);
 
-	if (!complete_transport_params (self))
-		return NULL;
-
-	if (!gku_prompt_get_transport_password (GKU_PROMPT (self), password_type,
-	                                        &parameter, &n_parameter,
-	                                        &value, &n_value))
-		return NULL;
+	/* Ignore the result of this, since GkdSecretExchange doesn't decrypt */
+	gku_prompt_get_password (GKU_PROMPT (self), password_type);
 
-	return gkd_secret_secret_new_take_memory (self->pv->session,
-	                                          parameter, n_parameter,
-	                                          value, n_value);
+	/* ... instead it stashes away the raw cipher text, and makes it available here */
+	return gkd_secret_exchange_take_last_secret (self->pv->exchange);
 }
diff --git a/daemon/dbus/gkd-secret-prompt.h b/daemon/dbus/gkd-secret-prompt.h
index 4423be2..a177ad9 100644
--- a/daemon/dbus/gkd-secret-prompt.h
+++ b/daemon/dbus/gkd-secret-prompt.h
@@ -67,8 +67,6 @@ GkdSecretService*   gkd_secret_prompt_get_service             (GkdSecretPrompt *
 
 GkdSecretObjects*   gkd_secret_prompt_get_objects             (GkdSecretPrompt *self);
 
-GkdSecretSession*   gkd_secret_prompt_get_session             (GkdSecretPrompt *self);
-
 GkdSecretSecret*    gkd_secret_prompt_get_secret              (GkdSecretPrompt *self,
                                                                const gchar *password_type);
 
diff --git a/daemon/dbus/gkd-secret-secret.c b/daemon/dbus/gkd-secret-secret.c
index 9cc44b7..fcaa7c3 100644
--- a/daemon/dbus/gkd-secret-secret.c
+++ b/daemon/dbus/gkd-secret-secret.c
@@ -32,6 +32,20 @@
 
 #include <string.h>
 
+GkdSecretSecret *
+gkd_secret_secret_new (GkdSecretSession *session,
+                       gconstpointer parameter,
+                       gsize n_parameter,
+                       gconstpointer value,
+                       gsize n_value)
+{
+	return gkd_secret_secret_new_take_memory (session,
+	                                          g_memdup (parameter, n_parameter),
+	                                          n_parameter,
+	                                          g_memdup (value, n_value),
+	                                          n_value);
+}
+
 static void
 destroy_with_owned_memory (gpointer data)
 {
diff --git a/daemon/dbus/gkd-secret-secret.h b/daemon/dbus/gkd-secret-secret.h
index c6047bc..69732ce 100644
--- a/daemon/dbus/gkd-secret-secret.h
+++ b/daemon/dbus/gkd-secret-secret.h
@@ -40,6 +40,12 @@ struct _GkdSecretSecret {
 	gpointer destroy_data;
 };
 
+GkdSecretSecret *      gkd_secret_secret_new                      (GkdSecretSession *session,
+                                                                   gconstpointer parameter,
+                                                                   gsize n_parameter,
+                                                                   gconstpointer value,
+                                                                   gsize n_value);
+
 GkdSecretSecret*       gkd_secret_secret_new_take_memory          (GkdSecretSession *session,
                                                                    gpointer parameter,
                                                                    gsize n_parameter,
diff --git a/daemon/dbus/gkd-secret-types.h b/daemon/dbus/gkd-secret-types.h
index 176c92f..3ba7598 100644
--- a/daemon/dbus/gkd-secret-types.h
+++ b/daemon/dbus/gkd-secret-types.h
@@ -49,6 +49,7 @@ typedef struct _GkdSecretCollection GkdSecretCollection;
 typedef struct _GkdSecretChange GkdSecretChange;
 typedef struct _GkdSecretCreate GkdSecretCreate;
 typedef struct _GkdSecretDispatch GkdSecretDispatch;
+typedef struct _GkdSecretExchange GkdSecretExchange;
 typedef struct _GkdSecretIndex GkdSecretIndex;
 typedef struct _GkdSecretItem GkdSecretItem;
 typedef struct _GkdSecretObjects GkdSecretObjects;
diff --git a/egg/Makefile.am b/egg/Makefile.am
index feda9b2..344be24 100644
--- a/egg/Makefile.am
+++ b/egg/Makefile.am
@@ -15,7 +15,7 @@ BUILT_SOURCES = \
 	asn1-def-pk.c asn1-def-pkix.c
 
 INCLUDES = \
-	-I$(top_srcdir) 
+	-I$(top_srcdir) \
 	-I$(top_builddir) 
 
 libegg_la_CFLAGS = \
diff --git a/gcr/gcr-secret-exchange.c b/gcr/gcr-secret-exchange.c
index 6f6d5c6..5f99def 100644
--- a/gcr/gcr-secret-exchange.c
+++ b/gcr/gcr-secret-exchange.c
@@ -296,8 +296,8 @@ gcr_secret_exchange_begin (GcrSecretExchange *self)
 }
 
 static gboolean
-calculate_key (GcrSecretExchange *self,
-               GKeyFile *input)
+derive_key (GcrSecretExchange *self,
+            GKeyFile *input)
 {
 	GcrSecretExchangeClass *klass;
 	gboolean ret;
@@ -408,8 +408,10 @@ gcr_secret_exchange_receive (GcrSecretExchange *self,
 		self->pv->generated = TRUE;
 	}
 
-	if (!calculate_key (self, input))
-		return FALSE;
+	if (!self->pv->derived) {
+		if (!derive_key (self, input))
+			return FALSE;
+	}
 
 	ret = TRUE;
 
diff --git a/pkcs11/wrap-layer/tests/Makefile.am b/pkcs11/wrap-layer/tests/Makefile.am
index 9597ffd..c9fa406 100644
--- a/pkcs11/wrap-layer/tests/Makefile.am
+++ b/pkcs11/wrap-layer/tests/Makefile.am
@@ -12,6 +12,7 @@ LDADD = \
 	libgkm-mock-secret-store.a \
 	$(top_builddir)/pkcs11/gkm/libgkm.la \
 	$(top_builddir)/ui/libgku-prompt-testable.la \
+	$(top_builddir)/gcr/libgcr-base- GCR_MAJOR@.la \
 	$(top_builddir)/egg/libegg.la \
 	$(GLIB_LIBS)
 
diff --git a/ui/Makefile.am b/ui/Makefile.am
index f6a89c4..941791c 100644
--- a/ui/Makefile.am
+++ b/ui/Makefile.am
@@ -4,6 +4,7 @@ SUBDIRS = . tests
 INCLUDES= \
 	-DGNOMELOCALEDIR=\""$(datadir)/locale"\" \
 	-DPROMPTEXEC=\""$(libexecdir)/gnome-keyring-prompt- GCR_MAJOR@"\" \
+	-DGCR_API_SUBJECT_TO_CHANGE \
 	-I$(top_srcdir) \
 	-I$(top_builddir) \
 	$(GOBJECT_CFLAGS) \
@@ -28,10 +29,10 @@ BUILT_SOURCES = \
 
 libgku_prompt_la_SOURCES = \
 	gku-prompt.c gku-prompt.h \
-	gku-prompt-util.c gku-prompt-util.h \
 	$(BUILT_SOURCES)
 
 libgku_prompt_la_LIBADD = \
+	$(top_builddir)/gcr/libgcr-base- GCR_MAJOR@.la \
 	$(GLIB_LIBS) \
 	$(GOBJECT_LIBS)
 
@@ -57,12 +58,11 @@ libexec_PROGRAMS= \
 	gnome-keyring-prompt- GCR_MAJOR@
 
 gnome_keyring_prompt_ GCR_MAJOR@_SOURCES = \
-	gku-prompt-tool.c \
-	gku-prompt-util.c gku-prompt-util.h
+	gku-prompt-tool.c
 
 gnome_keyring_prompt_ GCR_MAJOR@_LDADD = \
-	$(top_builddir)/egg/libegg-prompt.la \
 	$(top_builddir)/egg/libegg-entry-buffer.la \
+	$(top_builddir)/egg/libegg-prompt.la \
 	$(top_builddir)/gcr/libgcr- GCR_MAJOR@.la \
 	$(top_builddir)/gck/libgck- GCK_MAJOR@.la \
 	$(LIBGCRYPT_LIBS) \
diff --git a/ui/gku-prompt-tool.c b/ui/gku-prompt-tool.c
index e8bf93a..8e619df 100644
--- a/ui/gku-prompt-tool.c
+++ b/ui/gku-prompt-tool.c
@@ -22,8 +22,6 @@
 
 #include "config.h"
 
-#include "gku-prompt-util.h"
-
 #include "egg/egg-dh.h"
 #include "egg/egg-entry-buffer.h"
 #include "egg/egg-error.h"
@@ -34,8 +32,6 @@
 
 #include "gcr/gcr.h"
 
-#include <gcrypt.h>
-
 #include <glib/gi18n.h>
 
 #include <gdk/gdk.h>
@@ -56,8 +52,7 @@ static GdkDevice *grabbed_device = NULL;
 static gulong grab_broken_id = 0;
 
 /* An encryption key for returning passwords */
-static gpointer the_key = NULL;
-static gsize n_the_key = 0;
+static GcrSecretExchange *the_exchange = NULL;
 
 #define LOG_ERRORS 1
 #define GRAB_KEYBOARD 1
@@ -682,59 +677,6 @@ validate_dialog (GtkBuilder *builder, GtkDialog *dialog, gint response)
 }
 
 /**
-* Negotiates crypto between the calling programm and the prompt
-*
-* Reads data from the transport section of input_data and sends the public key back
-* in the transport section of the output_data.
-*
-* Returns TRUE on success
-**/
-static gboolean
-negotiate_transport_crypto (void)
-{
-	gcry_mpi_t base, prime, peer;
-	gcry_mpi_t key, pub, priv;
-	gboolean ret = FALSE;
-	gpointer ikm;
-	gsize n_ikm;
-
-	g_assert (!the_key);
-	base = prime = peer = NULL;
-	key = pub = priv = NULL;
-
-	/* The DH stuff coming in from our caller */
-	if (gku_prompt_util_decode_mpi (input_data, "transport", "prime", &prime) &&
-	    gku_prompt_util_decode_mpi (input_data, "transport", "base", &base) &&
-	    gku_prompt_util_decode_mpi (input_data, "transport", "public", &peer)) {
-
-		/* Generate our own public/priv, and then a key, send it back */
-		if (egg_dh_gen_pair (prime, base, 0, &pub, &priv)) {
-
-			gku_prompt_util_encode_mpi (output_data, "transport", "public", pub);
-
-			/* Build up a key we can use */
-			ikm = egg_dh_gen_secret (peer, priv, prime, &n_ikm);
-			if (ikm != NULL) {
-				n_the_key = 16;
-				the_key = egg_secure_alloc (n_the_key);
-				if (!egg_hkdf_perform ("sha256", ikm, n_ikm, NULL, 0, NULL, 0, the_key, n_the_key))
-					g_return_val_if_reached (FALSE);
-				ret = TRUE;
-			}
-		}
-	}
-
-	gcry_mpi_release (base);
-	gcry_mpi_release (prime);
-	gcry_mpi_release (peer);
-	gcry_mpi_release (key);
-	gcry_mpi_release (pub);
-	gcry_mpi_release (priv);
-
-	return ret;
-}
-
-/**
 * builder: The GTKBuilder
 * password_type: password type description
 *
@@ -746,9 +688,6 @@ static void
 gather_password (GtkBuilder *builder, const gchar *password_type)
 {
 	GtkEntry *entry;
-	gchar iv[16];
-	gpointer data;
-	gsize n_data;
 	gchar *name;
 	const gchar *text;
 	gchar *value;
@@ -764,27 +703,30 @@ gather_password (GtkBuilder *builder, const gchar *password_type)
 	/* A non-encrypted password: just send the value back */
 	if (!g_key_file_has_group (input_data, "transport")) {
 		text = gtk_entry_get_text (entry);
-		value = egg_hex_encode ((const guchar*)text, strlen (text));
-		g_key_file_set_string (output_data, password_type, "parameter", "");
-		g_key_file_set_string (output_data, password_type, "value", value);
-		g_free (value);
+		g_key_file_set_boolean (output_data, password_type, "encrypted", FALSE);
+		g_key_file_set_string (output_data, password_type, "value", text);
 		return;
 	}
 
-	if (!the_key && !negotiate_transport_crypto ()) {
-		g_warning ("couldn't negotiate transport crypto for password");
-		return;
-	}
+	if (the_exchange == NULL) {
+		GcrSecretExchange *exchange = gcr_secret_exchange_new (NULL);
 
-	gcry_create_nonce (iv, sizeof (iv));
-	data = gku_prompt_util_encrypt_text (the_key, n_the_key, iv, sizeof (iv),
-	                                     gtk_entry_get_text (entry), &n_data);
-	g_return_if_fail (data);
+		value = g_key_file_get_string (input_data, "transport", "exchange", NULL);
+		if (!value || !gcr_secret_exchange_receive (exchange, value)) {
+			g_warning ("couldn't negotiate transport crypto for password");
+			g_object_unref (exchange);
+			g_free (value);
+			return;
+		}
 
-	gku_prompt_util_encode_hex (output_data, password_type, "parameter", iv, sizeof (iv));
-	gku_prompt_util_encode_hex (output_data, password_type, "value", data, n_data);
+		g_free (value);
+		the_exchange = exchange;
+	}
 
-	g_free (data);
+	g_key_file_set_boolean (output_data, password_type, "encrypted", TRUE);
+	value = gcr_secret_exchange_send (the_exchange, gtk_entry_get_text (entry), -1);
+	g_key_file_set_string (output_data, password_type, "value", value);
+	g_free (value);
 }
 
 /**
@@ -1214,8 +1156,6 @@ main (int argc, char *argv[])
 
 	prepare_logging ();
 
-	egg_libgcrypt_initialize ();
-
 	input_data = g_key_file_new ();
 	output_data = g_key_file_new ();
 
@@ -1246,14 +1186,6 @@ main (int argc, char *argv[])
 
 	run_dialog ();
 
-	/* Cleanup after any key */
-	if (the_key) {
-		egg_secure_clear (the_key, n_the_key);
-		egg_secure_free (the_key);
-		the_key = NULL;
-		n_the_key = 0;
-	}
-
 	g_key_file_free (input_data);
 	data = g_key_file_to_data (output_data, &length, &err);
 	g_key_file_free (output_data);
@@ -1262,6 +1194,8 @@ main (int argc, char *argv[])
 		fatal ("couldn't format auth dialog response: %s", egg_error_message (err));
 
 	write_all_output (data, length);
+
+	g_clear_object (&the_exchange);
 	g_free (data);
 
 	return 0;
diff --git a/ui/gku-prompt.c b/ui/gku-prompt.c
index dc1a610..b654fe9 100644
--- a/ui/gku-prompt.c
+++ b/ui/gku-prompt.c
@@ -23,7 +23,6 @@
 
 #include "gku-prompt.h"
 #include "gku-prompt-marshal.h"
-#include "gku-prompt-util.h"
 
 #include "egg/egg-cleanup.h"
 #include "egg/egg-dh.h"
@@ -34,7 +33,7 @@
 #include "egg/egg-secure-memory.h"
 #include "egg/egg-spawn.h"
 
-#include "gcr/gcr-unlock-options.h"
+#include "gcr/gcr-base.h"
 
 #include "pkcs11/pkcs11i.h"
 
@@ -43,11 +42,16 @@
 #include <sys/wait.h>
 
 #ifdef _DEBUG
-#define DEBUG_PROMPT 0
+#define DEBUG_PROMPT 1
 #define DEBUG_STDERR 0
 #endif
 
 enum {
+	PROP_0,
+	PROP_EXCHANGE
+};
+
+enum {
 	RESPONDED,
 	COMPLETED,
 	LAST_SIGNAL
@@ -55,13 +59,6 @@ enum {
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
-typedef struct _TransportCrypto {
-	gcry_mpi_t private;
-	gcry_mpi_t prime;
-	gpointer key;
-	gsize n_key;
-} TransportCrypto;
-
 struct _GkuPromptPrivate {
 	GKeyFile *input;
 	GKeyFile *output;
@@ -70,7 +67,7 @@ struct _GkuPromptPrivate {
 	gboolean failure;
 
 	/* Transport crypto */
-	TransportCrypto *transport;
+	GcrSecretExchange *exchange;
 
 	/* Information about child */
 	GPid pid;
@@ -302,76 +299,15 @@ on_child_exited (GPid pid, gint status, gpointer user_data)
 static void
 prepare_transport_crypto (GkuPrompt *self)
 {
-	TransportCrypto *transport;
-	gcry_mpi_t pub, base;
-
-	if (!g_key_file_has_group (self->pv->input, "transport")) {
-		g_assert (!self->pv->transport);
-		transport = g_slice_new0 (TransportCrypto);
-
-		/* Figure out our prime, base, public and secret bits */
-		if (!egg_dh_default_params ("ietf-ike-grp-modp-1536", &transport->prime, &base) ||
-		    !egg_dh_gen_pair (transport->prime, base, 0, &pub, &transport->private))
-			g_return_if_reached ();
-
-		/* Send over the prime, base, and public bits */
-		gku_prompt_util_encode_mpi (self->pv->input, "transport", "prime", transport->prime);
-		gku_prompt_util_encode_mpi (self->pv->input, "transport", "base", base);
-		gku_prompt_util_encode_mpi (self->pv->input, "transport", "public", pub);
-
-		gcry_mpi_release (base);
-		gcry_mpi_release (pub);
-
-		self->pv->transport = transport;
-	}
-
-	if (self->pv->transport) {
-		egg_secure_free (self->pv->transport->key);
-		self->pv->transport->key = NULL;
-		self->pv->transport->n_key = 0;
-	}
-}
-
-static gconstpointer
-calculate_transport_key (GkuPrompt *self, gsize *n_key)
-{
-	gcry_mpi_t peer;
-	gpointer ikm, key;
-	gsize n_ikm;
-
-	g_assert (self->pv->output);
-	g_assert (n_key);
-
-	if (!self->pv->transport) {
-		g_warning ("GkuPrompt did not negotiate crypto, but its caller is now asking"
-		           " it to do the decryption. This is an error in gnome-keyring");
-		return NULL;
-	}
-
-	if (!self->pv->transport->key) {
-		if (!gku_prompt_util_decode_mpi (self->pv->output, "transport", "public", &peer))
-			return NULL;
-
-		ikm = egg_dh_gen_secret (peer, self->pv->transport->private,
-		                         self->pv->transport->prime, &n_ikm);
-
-		gcry_mpi_release (peer);
+	gchar *request;
 
-		if (!ikm)
-			return NULL;
-
-		key = egg_secure_alloc (16);
-		if (!egg_hkdf_perform ("sha256", ikm, n_ikm, NULL, 0, NULL, 0, key, 16))
-			g_return_val_if_reached (NULL);
-
-		egg_secure_free (ikm);
-		egg_secure_free (self->pv->transport->key);
-		self->pv->transport->key = key;
-		self->pv->transport->n_key = 16;
+	if (!g_key_file_has_group (self->pv->input, "exchange")) {
+		if (self->pv->exchange == NULL)
+			self->pv->exchange = gcr_secret_exchange_new (NULL);
+		request = gcr_secret_exchange_begin (self->pv->exchange);
+		g_key_file_set_string (self->pv->input, "transport", "exchange", request);
+		g_free (request);
 	}
-
-	*n_key = self->pv->transport->n_key;
-	return self->pv->transport->key;
 }
 
 static gboolean
@@ -501,8 +437,6 @@ display_dummy_prompt (GkuPrompt *self, const gchar *response)
 static void
 clear_prompt_data (GkuPrompt *self)
 {
-	TransportCrypto *transport;
-
 	if (self->pv->input)
 		g_key_file_free (self->pv->input);
 	self->pv->input = NULL;
@@ -530,20 +464,6 @@ clear_prompt_data (GkuPrompt *self)
 	if (self->pv->io_tag)
 		g_source_remove (self->pv->io_tag);
 	self->pv->io_tag = 0;
-
-	if (self->pv->transport) {
-		transport = self->pv->transport;
-		if (transport->prime)
-			gcry_mpi_release (transport->prime);
-		if (transport->private)
-			gcry_mpi_release (transport->private);
-		if (transport->key) {
-			egg_secure_clear (transport->key, transport->n_key);
-			egg_secure_free (transport->key);
-		}
-		g_slice_free (TransportCrypto, transport);
-		self->pv->transport = NULL;
-	}
 }
 
 /* -----------------------------------------------------------------------------
@@ -563,16 +483,15 @@ gku_prompt_real_completed (GkuPrompt *self)
 	/* Nothing to do */
 }
 
-static GObject*
-gku_prompt_constructor (GType type, guint n_props, GObjectConstructParam *props)
+static void
+gku_prompt_constructed (GObject *obj)
 {
-	GkuPrompt *self = GKU_PROMPT (G_OBJECT_CLASS (gku_prompt_parent_class)->constructor(type, n_props, props));
-	g_return_val_if_fail (self, NULL);
+	GkuPrompt *self = GKU_PROMPT (obj);
+
+	G_OBJECT_CLASS (gku_prompt_parent_class)->constructed (obj);
 
 	if (!self->pv->executable)
 		self->pv->executable = g_strdup (PROMPTEXEC);
-
-	return G_OBJECT (self);
 }
 
 static void
@@ -583,6 +502,43 @@ gku_prompt_init (GkuPrompt *self)
 }
 
 static void
+gku_prompt_set_property (GObject *obj,
+                         guint prop_id,
+                         const GValue *value,
+                         GParamSpec *pspec)
+{
+	GkuPrompt *self = GKU_PROMPT (obj);
+
+	switch (prop_id) {
+	case PROP_EXCHANGE:
+		g_return_if_fail (self->pv->exchange == NULL);
+		self->pv->exchange = g_value_dup_object (value);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+gku_prompt_get_property (GObject *obj,
+                         guint prop_id,
+                         GValue *value,
+                         GParamSpec *pspec)
+{
+	GkuPrompt *self = GKU_PROMPT (obj);
+
+	switch (prop_id) {
+	case PROP_EXCHANGE:
+		g_value_set_object (value, self->pv->exchange);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
+		break;
+	}
+}
+
+static void
 gku_prompt_dispose (GObject *obj)
 {
 	GkuPrompt *self = GKU_PROMPT (obj);
@@ -590,6 +546,8 @@ gku_prompt_dispose (GObject *obj)
 	kill_process (self);
 	clear_prompt_data (self);
 
+	g_clear_object (&self->pv->exchange);
+
 	G_OBJECT_CLASS (gku_prompt_parent_class)->dispose (obj);
 }
 
@@ -605,7 +563,7 @@ gku_prompt_finalize (GObject *obj)
 	g_assert (!self->pv->out_data);
 	g_assert (!self->pv->err_data);
 	g_assert (!self->pv->io_tag);
-	g_assert (!self->pv->transport);
+	g_assert (!self->pv->exchange);
 
 	g_free (self->pv->executable);
 	self->pv->executable = NULL;
@@ -618,7 +576,9 @@ gku_prompt_class_init (GkuPromptClass *klass)
 {
 	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 
-	gobject_class->constructor = gku_prompt_constructor;
+	gobject_class->constructed = gku_prompt_constructed;
+	gobject_class->get_property = gku_prompt_get_property;
+	gobject_class->set_property = gku_prompt_set_property;
 	gobject_class->dispose = gku_prompt_dispose;
 	gobject_class->finalize = gku_prompt_finalize;
 
@@ -627,6 +587,10 @@ gku_prompt_class_init (GkuPromptClass *klass)
 
 	g_type_class_add_private (klass, sizeof (GkuPromptPrivate));
 
+	g_object_class_install_property (gobject_class, PROP_EXCHANGE,
+	           g_param_spec_object ("exchange", "Exchange", "Secret Exchange",
+	                                GCR_TYPE_SECRET_EXCHANGE, G_PARAM_READWRITE));
+
 	signals[COMPLETED] = g_signal_new ("completed", GKU_TYPE_PROMPT,
 	                                   G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GkuPromptClass, completed),
 	                                   NULL, NULL, g_cclosure_marshal_VOID__VOID,
@@ -735,41 +699,31 @@ gku_prompt_get_response (GkuPrompt *self)
 	return ret;
 }
 
-gchar*
-gku_prompt_get_password (GkuPrompt *self, const gchar *password_type)
+gchar *
+gku_prompt_get_password (GkuPrompt *self,
+                         const gchar *password_type)
 {
-	gchar *result;
-	gpointer data;
-	gsize n_data;
-	gconstpointer key;
-	gsize n_key;
-	gpointer parameter;
-	gsize n_parameter;
+	gchar *received;
+	gboolean receive_success;
 
 	g_return_val_if_fail (GKU_IS_PROMPT (self), NULL);
 
-	if (!gku_prompt_get_transport_password (self, password_type,
-	                                        &parameter, &n_parameter,
-	                                        &data, &n_data))
+	received = g_key_file_get_string (self->pv->output, password_type, "value", NULL);
+	if (received == NULL)
 		return NULL;
 
-	/* Parse the encryption params and figure out a key */
-	if (n_parameter) {
-		key = calculate_transport_key (self, &n_key);
-		g_return_val_if_fail (key, NULL);
-		result = gku_prompt_util_decrypt_text (key, n_key,
-		                                       parameter, n_parameter,
-		                                       data, n_data);
+	/* Not encrypted */
+	if (!g_key_file_get_boolean (self->pv->output, password_type, "encrypted", NULL))
+		return received;
 
-	/* A non-encrypted password */
-	} else {
-		result = egg_secure_alloc (n_data + 1);
-		memcpy (result, data, n_data);
-	}
+	g_return_val_if_fail (self->pv->exchange, NULL);
+	receive_success = gcr_secret_exchange_receive (self->pv->exchange, received);
+	g_free (received);
 
-	g_free (parameter);
-	g_free (data);
-	return result;
+	if (!receive_success)
+		return NULL;
+
+	return egg_secure_strdup (gcr_secret_exchange_get_secret (self->pv->exchange, NULL));
 }
 
 gboolean
@@ -837,65 +791,6 @@ gku_prompt_reset (GkuPrompt *self, gboolean hard)
 	self->pv->input = input;
 }
 
-
-void
-gku_prompt_set_transport_param (GkuPrompt *self, const gchar *name,
-                                gconstpointer value, gsize n_value)
-{
-	g_return_if_fail (GKU_IS_PROMPT (self));
-	g_return_if_fail (self->pv->input);
-	g_return_if_fail (name);
-	gku_prompt_util_encode_hex (self->pv->input, "transport", name, value, n_value);
-}
-
-gpointer
-gku_prompt_get_transport_param (GkuPrompt *self, const gchar *name, gsize *n_value)
-{
-	g_return_val_if_fail (GKU_IS_PROMPT (self), NULL);
-	g_return_val_if_fail (name, NULL);
-	g_return_val_if_fail (n_value, NULL);
-
-	if (self->pv->failure)
-		return NULL;
-
-	g_return_val_if_fail (self->pv->output, NULL);
-	return gku_prompt_util_decode_hex (self->pv->output, "transport", name, n_value);
-
-}
-
-gboolean
-gku_prompt_get_transport_password (GkuPrompt *self, const gchar *password_type,
-                                   gpointer *parameter, gsize *n_parameter,
-                                   gpointer *value, gsize *n_value)
-{
-	if (!password_type)
-		password_type = "password";
-
-	g_return_val_if_fail (parameter, FALSE);
-	g_return_val_if_fail (n_parameter, FALSE);
-	g_return_val_if_fail (value, FALSE);
-	g_return_val_if_fail (n_value, FALSE);
-
-	if (self->pv->failure)
-		return FALSE;
-
-	g_return_val_if_fail (self->pv->output, FALSE);
-
-	/* Parse out an IV */
-	*parameter = gku_prompt_util_decode_hex (self->pv->output, password_type,
-	                                         "parameter", n_parameter);
-	if (*parameter == NULL)
-		*n_parameter = 0;
-
-	/* Parse out the password */
-	*value = gku_prompt_util_decode_hex (self->pv->output, password_type,
-	                                     "value", n_value);
-	if (*value == NULL)
-		*n_value = 0;
-
-	return TRUE;
-}
-
 const gchar*
 gku_prompt_get_unlock_choice (GkuPrompt *self)
 {
@@ -1256,42 +1151,31 @@ gku_prompt_dummy_queue_response (const gchar *response)
 void
 gku_prompt_dummy_queue_ok_password (const gchar *password)
 {
-	const static gchar *RESPONSE = "[password]\nparameter=\nvalue=%s\n[prompt]\nresponse=ok\n";
-	gchar *value;
+	const static gchar *RESPONSE = "[password]\nencrypted=FALSE\nvalue=%s\n[prompt]\nresponse=ok\n";
 
 	g_return_if_fail (password);
-	value = egg_hex_encode ((const guchar*)password, strlen (password));
-	queue_dummy_response (g_strdup_printf (RESPONSE, value));
-	g_free (value);
+	queue_dummy_response (g_strdup_printf (RESPONSE, password));
 }
 
 void
 gku_prompt_dummy_queue_ok_passwords (const gchar *original, const gchar *password)
 {
-	const static gchar *RESPONSE = "[password]\nparameter=\nvalue=%s\n"
-	                               "[original]\nparameter=\nvalue=%s\n"
+	const static gchar *RESPONSE = "[password]\nencrypted=FALSE\nvalue=%s\n"
+	                               "[original]\nencrypted=FALSE\nvalue=%s\n"
 	                               "[prompt]\nresponse=ok\n";
-	gchar *value, *ovalue;
 
 	g_return_if_fail (password);
-	value = egg_hex_encode ((const guchar*)password, strlen (password));
-	ovalue = egg_hex_encode ((const guchar*)original, strlen (original));
-	queue_dummy_response (g_strdup_printf (RESPONSE, value, ovalue));
-	g_free (value);
-	g_free (ovalue);
+	queue_dummy_response (g_strdup_printf (RESPONSE, password, original));
 }
 
 void
 gku_prompt_dummy_queue_auto_password (const gchar *password)
 {
-	const static gchar *RESPONSE = "[password]\nparameter=\nvalue=%s\n[prompt]\nresponse=ok\n"
+	const static gchar *RESPONSE = "[password]\nencrypted=FALSE\nvalue=%s\n[prompt]\nresponse=ok\n"
 	                               "[unlock-options]\nchoice=always\n";
-	gchar *value;
 
 	g_return_if_fail (password);
-	value = egg_hex_encode ((const guchar*)password, strlen (password));
-	queue_dummy_response (g_strdup_printf (RESPONSE, value));
-	g_free (value);
+	queue_dummy_response (g_strdup_printf (RESPONSE, password));
 }
 
 void
diff --git a/ui/gku-prompt.h b/ui/gku-prompt.h
index 6090999..f56b796 100644
--- a/ui/gku-prompt.h
+++ b/ui/gku-prompt.h
@@ -91,25 +91,9 @@ gboolean            gku_prompt_has_response           (GkuPrompt *prompt);
 
 gint                gku_prompt_get_response           (GkuPrompt *prompt);
 
-gchar*              gku_prompt_get_password           (GkuPrompt *prompt,
+gchar *             gku_prompt_get_password           (GkuPrompt *prompt,
                                                        const gchar *password_type);
 
-gpointer            gku_prompt_get_transport_param    (GkuPrompt *prompt,
-                                                       const gchar *name,
-                                                       gsize *n_value);
-
-void                gku_prompt_set_transport_param    (GkuPrompt *prompt,
-                                                       const gchar *name,
-                                                       gconstpointer value,
-                                                       gsize n_value);
-
-gboolean            gku_prompt_get_transport_password (GkuPrompt *self,
-                                                       const gchar *password_type,
-                                                       gpointer *parameter,
-                                                       gsize *n_parameter,
-                                                       gpointer *value,
-                                                       gsize *n_value);
-
 const gchar*        gku_prompt_get_unlock_choice      (GkuPrompt *self);
 
 void                gku_prompt_set_unlock_choice      (GkuPrompt *self,
diff --git a/ui/tests/Makefile.am b/ui/tests/Makefile.am
index d5b4481..5423fe8 100644
--- a/ui/tests/Makefile.am
+++ b/ui/tests/Makefile.am
@@ -1,29 +1,3 @@
 
-INCLUDES = \
-	-I$(top_builddir) \
-	-I$(top_srcdir) \
-	-DSRCDIR="\"@abs_srcdir \"" \
-	$(GLIB_CFLAGS) \
-	$(LIBGCRYPT_CFLAGS)
-
-LDADD = \
-	$(top_builddir)/ui/libgku-prompt-testable.la \
-	$(top_builddir)/egg/libegg.la \
-	$(GLIB_LIBS) \
-	$(GOBJECT_LIBS) \
-	$(LIBGCRYPT_LIBS)
-
-TEST_PROGS = \
-	test-util
-
-check_PROGRAMS = $(TEST_PROGS)
-
-test: $(TEST_PROGS) $(CHECK_PROGS)
-	gtester --verbose -m $(TEST_MODE) --g-fatal-warnings $(TEST_PROGS)
-
-check-local: test
-
-all-local: $(check_PROGRAMS)
-
 EXTRA_DIST = \
 	files



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]