/* * gnome-keyring * * Copyright (C) 2010 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, see . * * Author: Stef Walter */ #include "config.h" #include "console-interaction.h" #include "gcr/gcr.h" #include "egg/egg-armor.h" #include #include #include const gchar *cn_name = NULL; static GckObject * load_key_for_uri (const gchar *uri) { GError *error = NULL; GTlsInteraction *interaction; GckEnumerator *enumerator; GList *modules; GckObject *key; gcr_pkcs11_initialize (NULL, &error); g_assert_no_error (error); modules = gcr_pkcs11_get_modules (); enumerator = gck_modules_enumerate_uri (modules, uri, GCK_SESSION_LOGIN_USER | GCK_SESSION_READ_ONLY, &error); g_clear_list (&modules, g_object_unref); interaction = console_interaction_new (); gck_enumerator_set_interaction (enumerator, interaction); g_object_unref (interaction); key = gck_enumerator_next (enumerator, NULL, &error); g_assert_no_error (error); g_object_unref (enumerator); return key; } static void test_request (const gchar *uri) { GcrCertificateRequest *req; GError *error = NULL; GckObject *key; guchar *data; gsize n_data; key = load_key_for_uri (uri); if (key == NULL) g_error ("couldn't find key for uri: %s", uri); if (!gcr_certificate_request_capable (key, NULL, &error)) { if (error != NULL) g_error ("error checking key capabilities: %s", error->message); g_clear_error (&error); g_printerr ("frob-certificate-request: key doesn't have right capabilities"); g_object_unref (key); return; } req = gcr_certificate_request_prepare (GCR_CERTIFICATE_REQUEST_PKCS10, key); g_object_unref (key); gcr_certificate_request_set_cn (req, cn_name); gcr_certificate_request_complete (req, NULL, &error); g_assert_no_error (error); data = gcr_certificate_request_encode (req, TRUE, &n_data); if (write (1, data, n_data) < 0) g_error ("failed to write: %s", g_strerror (errno)); g_free (data); } int main(int argc, char *argv[]) { g_set_prgname ("frob-certificate-request"); if (argc <= 1) g_printerr ("frob-certificate-request: specify pkcs11: url of key"); if (cn_name == NULL) cn_name = g_strdup ("name.example.com"); test_request (argv[1]); return 0; }