Browse Source

Rework key API to allow reusing of keypairs.

tags/0.9.0
Vsevolod Stakhov 9 years ago
parent
commit
ddc00caeab
2 changed files with 32 additions and 17 deletions
  1. 21
    12
      src/libutil/http.c
  2. 11
    5
      src/libutil/http.h

+ 21
- 12
src/libutil/http.c View File

@@ -1540,31 +1540,40 @@ rspamd_http_router_free (struct rspamd_http_connection_router *router)
}
}

gboolean
rspamd_http_connection_set_key (struct rspamd_http_connection *conn,
gchar *key, gsize keylen)
gpointer
rspamd_http_connection_make_key (gchar *key, gsize keylen)
{
guchar *decoded;
gsize decoded_len;
struct rspamd_http_connection_private *priv = conn->priv;
struct rspamd_http_keypair *kp;

decoded = rspamd_decode_base32 (key, keylen, &decoded_len);

if (decoded != NULL) {
if (decoded_len == crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES) {
priv->local_key = g_slice_alloc (sizeof (*priv->local_key));
memcpy (priv->local_key->sk, decoded, crypto_box_SECRETKEYBYTES);
memcpy (priv->local_key->pk, decoded + crypto_box_SECRETKEYBYTES,
kp = g_slice_alloc (sizeof (*kp));
memcpy (kp->sk, decoded, crypto_box_SECRETKEYBYTES);
memcpy (kp->pk, decoded + crypto_box_SECRETKEYBYTES,
crypto_box_PUBLICKEYBYTES);
crypto_box_beforenm (priv->local_key->beforenm, priv->local_key->pk,
priv->local_key->sk);
blake2b (priv->local_key->id, priv->local_key->pk, NULL,
sizeof (priv->local_key->id), sizeof (priv->local_key->pk), 0);
crypto_box_beforenm (kp->beforenm, kp->pk,
kp->sk);
blake2b (kp->id, kp->pk, NULL, sizeof (kp->id), sizeof (kp->pk), 0);

return TRUE;
return (gpointer)kp;
}
g_free (decoded);
}

return FALSE;
}

void
rspamd_http_connection_set_key (struct rspamd_http_connection *conn,
gpointer key)
{
struct rspamd_http_connection_private *priv = conn->priv;
struct rspamd_http_keypair *kp = (struct rspamd_http_keypair *)key;

g_assert (key != NULL);
priv->local_key = kp;
}

+ 11
- 5
src/libutil/http.h View File

@@ -148,14 +148,20 @@ struct rspamd_http_connection * rspamd_http_connection_new (
enum rspamd_http_connection_type type);

/**
* Load the encryption keypair for this connection
* @param conn connection structure
* Load the encryption keypair
* @param key base32 encoded privkey and pubkey (in that order)
* @param keylen length of base32 string
* @return TRUE if a key has been loaded successfully
* @return opaque pointer pr NULL in case of error
*/
gpointer rspamd_http_connection_make_key (gchar *key, gsize keylen);

/**
* Set key pointed by an opaque pointer
* @param conn connection structure
* @param key opaque key structure
*/
gboolean rspamd_http_connection_set_key (struct rspamd_http_connection *conn,
gchar *key, gsize keylen);
void rspamd_http_connection_set_key (struct rspamd_http_connection *conn,
gpointer key);

/**
* Handle a request using socket fd and user data ud

Loading…
Cancel
Save