static gboolean derive_key (GcrSecretExchange *self, GKeyFile *input) { GcrSecretExchangeClass *klass; gboolean ret; guchar *peer; gsize n_peer; klass = GCR_SECRET_EXCHANGE_GET_CLASS (self); g_return_val_if_fail (klass->derive_transport_key, FALSE); g_debug ("deriving shared transport key"); peer = key_file_get_base64 (input, GCR_SECRET_EXCHANGE_PROTOCOL_1, "public", &n_peer); if (peer == NULL) { g_message ("secret-exchange: invalid or missing 'public' argument"); return FALSE; } ret = (klass->derive_transport_key) (self, peer, n_peer); self->pv->derived = ret; g_free (peer); return ret; }
static gboolean perform_decrypt (GcrSecretExchange *self, GKeyFile *input, guchar **secret, gsize *n_secret) { GcrSecretExchangeClass *klass; gpointer iv, value; guchar *result; gsize n_result, n_iv, n_value; gboolean ret; klass = GCR_SECRET_EXCHANGE_GET_CLASS (self); g_return_val_if_fail (klass->decrypt_transport_data, FALSE); iv = key_file_get_base64 (input, GCR_SECRET_EXCHANGE_PROTOCOL_1, "iv", &n_iv); value = key_file_get_base64 (input, GCR_SECRET_EXCHANGE_PROTOCOL_1, "secret", &n_value); if (value == NULL) { g_message ("secret-exchange: invalid or missing value"); g_free (iv); return FALSE; } ret = (klass->decrypt_transport_data) (self, egg_secure_realloc, value, n_value, iv, n_iv, &result, &n_result); g_free (value); g_free (iv); if (!ret) return FALSE; /* Reallocate a null terminator */ if (result) { result = egg_secure_realloc (result, n_result + 1); result[n_result] = 0; } *secret = result; *n_secret = n_result; return TRUE; }