aboutsummaryrefslogtreecommitdiffstats
path: root/moon-abe/cpabe-0.11/keygen.c
diff options
context:
space:
mode:
Diffstat (limited to 'moon-abe/cpabe-0.11/keygen.c')
-rw-r--r--moon-abe/cpabe-0.11/keygen.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/moon-abe/cpabe-0.11/keygen.c b/moon-abe/cpabe-0.11/keygen.c
new file mode 100644
index 00000000..eb26ad3e
--- /dev/null
+++ b/moon-abe/cpabe-0.11/keygen.c
@@ -0,0 +1,133 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <glib.h>
+#include <pbc.h>
+#include <pbc_random.h>
+
+#include "bswabe.h"
+#include "common.h"
+#include "policy_lang.h"
+
+char* usage =
+"Usage: cpabe-keygen [OPTION ...] PUB_KEY MASTER_KEY ATTR [ATTR ...]\n"
+"\n"
+"Generate a key with the listed attributes using public key PUB_KEY and\n"
+"master secret key MASTER_KEY. Output will be written to the file\n"
+"\"priv_key\" unless the -o option is specified.\n"
+"\n"
+"Attributes come in two forms: non-numerical and numerical. Non-numerical\n"
+"attributes are simply any string of letters, digits, and underscores\n"
+"beginning with a letter.\n"
+"\n"
+"Numerical attributes are specified as `attr = N', where N is a non-negative\n"
+"integer less than 2^64 and `attr' is another string. The whitespace around\n"
+"the `=' is optional. One may specify an explicit length of k bits for the\n"
+"integer by giving `attr = N#k'. Note that any comparisons in a policy given\n"
+"to cpabe-enc(1) must then specify the same number of bits, e.g.,\n"
+"`attr > 5#12'.\n"
+"\n"
+"The keywords `and', `or', and `of', are reserved for the policy language\n"
+"of cpabe-enc (1) and may not be used for either type of attribute.\n"
+"\n"
+"Mandatory arguments to long options are mandatory for short options too.\n\n"
+" -h, --help print this message\n\n"
+" -v, --version print version information\n\n"
+" -o, --output FILE write resulting key to FILE\n\n"
+" -d, --deterministic use deterministic \"random\" numbers\n"
+" (only for debugging)\n\n"
+"";
+
+/*
+ TODO ensure we don't give out the same attribute more than once (esp
+ as different numerical values)
+*/
+
+char* pub_file = 0;
+char* msk_file = 0;
+char** attrs = 0;
+
+char* out_file = "priv_key";
+
+gint
+comp_string( gconstpointer a, gconstpointer b)
+{
+ return strcmp(a, b);
+}
+
+void
+parse_args( int argc, char** argv )
+{
+ int i;
+ GSList* alist;
+ GSList* ap;
+ int n;
+
+ alist = 0;
+ for( i = 1; i < argc; i++ )
+ if( !strcmp(argv[i], "-h") || !strcmp(argv[i], "--help") )
+ {
+ printf("%s", usage);
+ exit(0);
+ }
+ else if( !strcmp(argv[i], "-v") || !strcmp(argv[i], "--version") )
+ {
+ printf(CPABE_VERSION, "-keygen");
+ exit(0);
+ }
+ else if( !strcmp(argv[i], "-o") || !strcmp(argv[i], "--output") )
+ {
+ if( ++i >= argc )
+ die(usage);
+ else
+ out_file = argv[i];
+ }
+ else if( !strcmp(argv[i], "-d") || !strcmp(argv[i], "--deterministic") )
+ {
+ pbc_random_set_deterministic(0);
+ }
+ else if( !pub_file )
+ {
+ pub_file = argv[i];
+ }
+ else if( !msk_file )
+ {
+ msk_file = argv[i];
+ }
+ else
+ {
+ parse_attribute(&alist, argv[i]);
+ }
+
+ if( !pub_file || !msk_file || !alist )
+ die(usage);
+
+ alist = g_slist_sort(alist, comp_string);
+ n = g_slist_length(alist);
+
+ attrs = malloc((n + 1) * sizeof(char*));
+
+ i = 0;
+ for( ap = alist; ap; ap = ap->next )
+ attrs[i++] = ap->data;
+ attrs[i] = 0;
+}
+
+int
+main( int argc, char** argv )
+{
+ bswabe_pub_t* pub;
+ bswabe_msk_t* msk;
+ bswabe_prv_t* prv;
+
+ parse_args(argc, argv);
+
+ pub = bswabe_pub_unserialize(suck_file(pub_file), 1);
+ msk = bswabe_msk_unserialize(pub, suck_file(msk_file), 1);
+
+ prv = bswabe_keygen(pub, msk, attrs);
+ spit_file(out_file, bswabe_prv_serialize(prv), 1);
+
+ return 0;
+}