summaryrefslogtreecommitdiff
path: root/p11-kit
diff options
context:
space:
mode:
authorDaiki Ueno <dueno@redhat.com>2016-12-26 09:33:44 +0900
committerDaiki Ueno <ueno@gnu.org>2017-02-17 10:25:55 +0100
commit426b693aa7fe2e9750abf8cb39f28251a4b54668 (patch)
treea3f0a3e170138ad8e33b0b7375fe06b1a088fd28 /p11-kit
parent4bac7e0e95712a4c7bfd03471c973f491ad81df4 (diff)
remote, server: Recognize PKCS#11 URI
Diffstat (limited to 'p11-kit')
-rw-r--r--p11-kit/remote.c77
1 files changed, 69 insertions, 8 deletions
diff --git a/p11-kit/remote.c b/p11-kit/remote.c
index 7717277..eaff134 100644
--- a/p11-kit/remote.c
+++ b/p11-kit/remote.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 Red Hat Inc.
+ * Copyright (C) 2014,2016 Red Hat Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -36,6 +36,7 @@
#include "compat.h"
#include "debug.h"
+#include "iter.h"
#include "message.h"
#include "p11-kit.h"
#include "remote.h"
@@ -48,11 +49,73 @@
#include <string.h>
#include <unistd.h>
+static int
+serve_module_from_uri (const char *uri_string)
+{
+ CK_FUNCTION_LIST **modules;
+ CK_FUNCTION_LIST *module;
+ P11KitIter *iter = NULL;
+ P11KitUri *uri;
+ CK_TOKEN_INFO *token;
+ int ret = 1;
+ CK_RV rv;
+
+ modules = p11_kit_modules_load_and_initialize (0);
+ if (modules == NULL)
+ return 1;
+
+ uri = p11_kit_uri_new ();
+ if (uri == NULL)
+ goto out;
+ ret = p11_kit_uri_parse (uri_string, P11_KIT_URI_FOR_TOKEN, uri);
+ if (ret != P11_KIT_URI_OK) {
+ p11_kit_uri_free (uri);
+ goto out;
+ }
+
+ iter = p11_kit_iter_new (uri, P11_KIT_ITER_WANT_TOKENS);
+ p11_kit_uri_free (uri);
+ if (iter == NULL)
+ goto out;
+
+ p11_kit_iter_begin (iter, modules);
+ rv = p11_kit_iter_next (iter);
+ if (rv != CKR_OK)
+ goto out;
+
+ module = p11_kit_iter_get_module (iter);
+ token = p11_kit_iter_get_token (iter);
+ p11_kit_modules_finalize (modules);
+
+ ret = p11_kit_remote_serve_token (module, token, 0, 1);
+
+ out:
+ p11_kit_iter_free (iter);
+ p11_kit_modules_release (modules);
+
+ return ret;
+}
+
+static int
+serve_module_from_file (const char *file)
+{
+ CK_FUNCTION_LIST *module;
+ int ret;
+
+ module = p11_kit_module_load (file, 0);
+ if (module == NULL)
+ return 1;
+
+ ret = p11_kit_remote_serve_module (module, 0, 1);
+ p11_kit_module_release (module);
+
+ return ret;
+}
+
int
main (int argc,
char *argv[])
{
- CK_FUNCTION_LIST *module;
int opt;
int ret;
@@ -100,12 +163,10 @@ main (int argc,
return 2;
}
- module = p11_kit_module_load (argv[0], 0);
- if (module == NULL)
- return 1;
-
- ret = p11_kit_remote_serve_module (module, 0, 1);
- p11_kit_module_release (module);
+ if (strncmp (argv[0], "pkcs11:", 7) == 0)
+ ret = serve_module_from_uri (argv[0]);
+ else
+ ret = serve_module_from_file (argv[0]);
return ret;
}