+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ struct GNUNET_TIME_Absolute expiration_time)
+{
+ struct GNUNET_FS_Uri *uri;
+ struct GNUNET_CRYPTO_RsaPrivateKey *my_private_key;
+ struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded my_public_key;
+ char *keyfile;
+ struct LocUriAssembly ass;
+
+ if (baseUri->type != chk)
+ return NULL;
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_filename (cfg, "GNUNETD", "HOSTKEY",
+ &keyfile))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Lacking key configuration settings.\n"));
+ return NULL;
+ }
+ my_private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
+ if (my_private_key == NULL)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Could not access hostkey file `%s'.\n"), keyfile);
+ GNUNET_free (keyfile);
+ return NULL;
+ }
+ GNUNET_free (keyfile);
+ GNUNET_CRYPTO_rsa_key_get_public (my_private_key, &my_public_key);
+ ass.purpose.size = htonl (sizeof (struct LocUriAssembly));
+ ass.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_PEER_PLACEMENT);
+ ass.exptime = GNUNET_TIME_absolute_hton (expiration_time);
+ ass.fi = baseUri->data.chk;
+ ass.peer = my_public_key;
+ uri = GNUNET_malloc (sizeof (struct GNUNET_FS_Uri));
+ uri->type = loc;
+ uri->data.loc.fi = baseUri->data.chk;
+ uri->data.loc.expirationTime = expiration_time;
+ uri->data.loc.peer = my_public_key;
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CRYPTO_rsa_sign (my_private_key, &ass.purpose,
+ &uri->data.loc.contentSignature));
+ GNUNET_CRYPTO_rsa_key_free (my_private_key);
+ return uri;
+}
+
+
+/**
+ * Create an SKS URI from a namespace and an identifier.
+ *
+ * @param ns namespace
+ * @param id identifier
+ * @param emsg where to store an error message
+ * @return an FS URI for the given namespace and identifier
+ */
+struct GNUNET_FS_Uri *
+GNUNET_FS_uri_sks_create (struct GNUNET_FS_Namespace *ns, const char *id,
+ char **emsg)
+{
+ struct GNUNET_FS_Uri *ns_uri;
+ struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pk;
+
+ ns_uri = GNUNET_malloc (sizeof (struct GNUNET_FS_Uri));
+ ns_uri->type = sks;
+ GNUNET_CRYPTO_rsa_key_get_public (ns->key, &pk);
+ GNUNET_CRYPTO_hash (&pk, sizeof (pk), &ns_uri->data.sks.namespace);
+ ns_uri->data.sks.identifier = GNUNET_strdup (id);
+ return ns_uri;
+}
+
+
+/**
+ * Create an SKS URI from a namespace ID and an identifier.
+ *
+ * @param nsid namespace ID
+ * @param id identifier
+ * @return an FS URI for the given namespace and identifier
+ */
+struct GNUNET_FS_Uri *
+GNUNET_FS_uri_sks_create_from_nsid (GNUNET_HashCode * nsid, const char *id)
+{
+ struct GNUNET_FS_Uri *ns_uri;
+
+ ns_uri = GNUNET_malloc (sizeof (struct GNUNET_FS_Uri));
+ ns_uri->type = sks;
+ ns_uri->data.sks.namespace = *nsid;
+ ns_uri->data.sks.identifier = GNUNET_strdup (id);
+ return ns_uri;
+}
+
+
+/**
+ * Canonicalize a keyword.
+ *
+ * @param in input string (the keyword)
+ * @return canonicalized keyword
+ */
+static char *
+canonicalize_keyword (const char *in)
+{
+ char *ret;
+ char *wpos;
+ const char *rpos;
+
+ ret = GNUNET_strdup (in);
+ wpos = ret;
+ rpos = in;
+ while ('\0' != *rpos)
+ {
+ switch (tolower ((unsigned char) *rpos))
+ {
+ case 'a':
+ case 'e':
+ case 'i':
+ case 'o':
+ case 'u':
+ case ' ':
+ case '\t':
+ case '\n':
+ case '\r':
+ /* skip characters listed above */
+ break;
+ case 'b':
+ case 'c':
+ case 'd':
+ case 'f':
+ case 'g':
+ case 'h':
+ case 'j':
+ case 'k':
+ case 'l':
+ case 'm':
+ case 'n':
+ case 'p':
+ case 'r':
+ case 's':
+ case 't':
+ case 'v':
+ case 'w':
+ case 'x':
+ case 'y':
+ case 'z':
+ /* convert characters listed above to lower case */
+ *wpos = tolower ((unsigned char) *rpos);
+ wpos++;
+ break;
+ case '!':
+ case '.':
+ case '?':
+ case '-':
+ /* keep characters listed above without changes */
+ *wpos = *rpos;
+ wpos++;
+ break;
+ default:
+ if (isspace ((unsigned char) *rpos) || isdigit ((unsigned char) *rpos))
+ break;
+ /* replace characters listed above with '_' */
+ *wpos = '_';
+ wpos++;
+ break;
+ }
+ rpos++;
+ }
+ *wpos = '\0';
+ return ret;
+}