Blame gcr/frob-certificate-request.c

Packit Service f02b19
/*
Packit Service f02b19
 * gnome-keyring
Packit Service f02b19
 *
Packit Service f02b19
 * Copyright (C) 2010 Collabora Ltd.
Packit Service f02b19
 *
Packit Service f02b19
 * This program is free software; you can redistribute it and/or modify
Packit Service f02b19
 * it under the terms of the GNU Lesser General Public License as
Packit Service f02b19
 * published by the Free Software Foundation; either version 2.1 of
Packit Service f02b19
 * the License, or (at your option) any later version.
Packit Service f02b19
 *
Packit Service f02b19
 * This program is distributed in the hope that it will be useful, but
Packit Service f02b19
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service f02b19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service f02b19
 * Lesser General Public License for more details.
Packit Service f02b19
 *
Packit Service f02b19
 * You should have received a copy of the GNU Lesser General Public
Packit Service f02b19
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service f02b19
 *
Packit Service f02b19
 * Author: Stef Walter <stefw@collabora.co.uk>
Packit Service f02b19
 */
Packit Service f02b19
Packit Service f02b19
#include "config.h"
Packit Service f02b19
Packit Service f02b19
#include "console-interaction.h"
Packit Service f02b19
Packit Service f02b19
#include "gcr/gcr-base.h"
Packit Service f02b19
Packit Service f02b19
#include "egg/egg-armor.h"
Packit Service f02b19
Packit Service f02b19
#include <unistd.h>
Packit Service f02b19
#include <string.h>
Packit Service f02b19
#include <errno.h>
Packit Service f02b19
Packit Service f02b19
const gchar *cn_name = NULL;
Packit Service f02b19
Packit Service f02b19
static GckObject *
Packit Service f02b19
load_key_for_uri (const gchar *uri)
Packit Service f02b19
{
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GTlsInteraction *interaction;
Packit Service f02b19
	GckEnumerator *enumerator;
Packit Service f02b19
	GList *modules;
Packit Service f02b19
	GckObject *key;
Packit Service f02b19
Packit Service f02b19
	gcr_pkcs11_initialize (NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
Packit Service f02b19
	modules = gcr_pkcs11_get_modules ();
Packit Service f02b19
	enumerator = gck_modules_enumerate_uri (modules, uri, GCK_SESSION_LOGIN_USER |
Packit Service f02b19
	                                        GCK_SESSION_READ_ONLY, &error);
Packit Service f02b19
	gck_list_unref_free (modules);
Packit Service f02b19
Packit Service f02b19
	interaction = console_interaction_new ();
Packit Service f02b19
	gck_enumerator_set_interaction (enumerator, interaction);
Packit Service f02b19
	g_object_unref (interaction);
Packit Service f02b19
Packit Service f02b19
	key = gck_enumerator_next (enumerator, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
	g_object_unref (enumerator);
Packit Service f02b19
Packit Service f02b19
	return key;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_request (const gchar *uri)
Packit Service f02b19
{
Packit Service f02b19
	GcrCertificateRequest *req;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckObject *key;
Packit Service f02b19
	guchar *data;
Packit Service f02b19
	gsize n_data;
Packit Service f02b19
Packit Service f02b19
	key = load_key_for_uri (uri);
Packit Service f02b19
	if (key == NULL)
Packit Service f02b19
		g_error ("couldn't find key for uri: %s", uri);
Packit Service f02b19
Packit Service f02b19
	if (!gcr_certificate_request_capable (key, NULL, &error)) {
Packit Service f02b19
		if (error != NULL)
Packit Service f02b19
			g_error ("error checking key capabilities: %s", error->message);
Packit Service f02b19
		g_clear_error (&error);
Packit Service f02b19
		g_printerr ("frob-certificate-request: key doesn't have right capabilities");
Packit Service f02b19
		g_object_unref (key);
Packit Service f02b19
		return;
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	req = gcr_certificate_request_prepare (GCR_CERTIFICATE_REQUEST_PKCS10, key);
Packit Service f02b19
	g_object_unref (key);
Packit Service f02b19
Packit Service f02b19
	gcr_certificate_request_set_cn (req, cn_name);
Packit Service f02b19
	gcr_certificate_request_complete (req, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
Packit Service f02b19
	data = gcr_certificate_request_encode (req, TRUE, &n_data);
Packit Service f02b19
Packit Service f02b19
	if (write (1, data, n_data) < 0)
Packit Service f02b19
		g_error ("failed to write: %s", g_strerror (errno));
Packit Service f02b19
	g_free (data);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
int
Packit Service f02b19
main(int argc, char *argv[])
Packit Service f02b19
{
Packit Service f02b19
	g_set_prgname ("frob-certificate-request");
Packit Service f02b19
Packit Service f02b19
	if (argc <= 1)
Packit Service f02b19
		g_printerr ("frob-certificate-request: specify pkcs11: url of key");
Packit Service f02b19
Packit Service f02b19
	if (cn_name == NULL)
Packit Service f02b19
		cn_name = g_strdup ("name.example.com");
Packit Service f02b19
Packit Service f02b19
	test_request (argv[1]);
Packit Service f02b19
	return 0;
Packit Service f02b19
}