implement secmod cs derive R
This commit is contained in:
parent
d1fd3a485b
commit
875a8b397e
@ -565,6 +565,100 @@ handle_revoke_request (struct TES_Client *client,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle @a client request @a sr to create signature. Create the
|
||||||
|
* signature using the respective key and return the result to
|
||||||
|
* the client.
|
||||||
|
*
|
||||||
|
* @param client the client making the request
|
||||||
|
* @param sr the request details
|
||||||
|
* @return #GNUNET_OK on success
|
||||||
|
*/
|
||||||
|
static enum GNUNET_GenericReturnValue
|
||||||
|
handle_r_derive_request (struct TES_Client *client,
|
||||||
|
const struct TALER_CRYPTO_CsRDeriveRequest *rdr)
|
||||||
|
{
|
||||||
|
struct DenominationKey *dk;
|
||||||
|
struct TALER_DenominationCsPrivateR r_priv;
|
||||||
|
struct TALER_DenominationCsPublicR r_pub;
|
||||||
|
struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get ();
|
||||||
|
|
||||||
|
GNUNET_assert (0 == pthread_mutex_lock (&keys_lock));
|
||||||
|
dk = GNUNET_CONTAINER_multihashmap_get (keys,
|
||||||
|
&rdr->h_cs.hash);
|
||||||
|
if (NULL == dk)
|
||||||
|
{
|
||||||
|
struct TALER_CRYPTO_RDeriveFailure rdf = {
|
||||||
|
.header.size = htons (sizeof (rdr)),
|
||||||
|
.header.type = htons (TALER_HELPER_CS_MT_RES_RDERIVE_FAILURE),
|
||||||
|
.ec = htonl (TALER_EC_EXCHANGE_GENERIC_DENOMINATION_KEY_UNKNOWN)
|
||||||
|
};
|
||||||
|
|
||||||
|
GNUNET_assert (0 == pthread_mutex_unlock (&keys_lock));
|
||||||
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||||
|
"R Derive request failed, denomination key %s unknown\n",
|
||||||
|
GNUNET_h2s (&rdr->h_cs.hash));
|
||||||
|
return TES_transmit (client->csock,
|
||||||
|
&rdf.header);
|
||||||
|
}
|
||||||
|
if (GNUNET_TIME_absolute_is_future (dk->anchor.abs_time))
|
||||||
|
{
|
||||||
|
/* it is too early */
|
||||||
|
struct TALER_CRYPTO_RDeriveFailure rdf = {
|
||||||
|
.header.size = htons (sizeof (rdr)),
|
||||||
|
.header.type = htons (TALER_HELPER_CS_MT_RES_RDERIVE_FAILURE),
|
||||||
|
.ec = htonl (TALER_EC_EXCHANGE_DENOMINATION_HELPER_TOO_EARLY)
|
||||||
|
};
|
||||||
|
|
||||||
|
GNUNET_assert (0 == pthread_mutex_unlock (&keys_lock));
|
||||||
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||||
|
"R Derive request failed, denomination key %s is not yet valid\n",
|
||||||
|
GNUNET_h2s (&rdr->h_cs.hash));
|
||||||
|
return TES_transmit (client->csock,
|
||||||
|
&rdf.header);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: print nonce too?
|
||||||
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||||
|
"Received request to derive R with key %s\n",
|
||||||
|
GNUNET_h2s (&rdr->h_cs.hash));
|
||||||
|
GNUNET_assert (dk->rc < UINT_MAX);
|
||||||
|
dk->rc++;
|
||||||
|
GNUNET_assert (0 == pthread_mutex_unlock (&keys_lock));
|
||||||
|
GNUNET_CRYPTO_cs_r_derive (&rdr->nonce.nonce,
|
||||||
|
&dk->denom_priv,
|
||||||
|
r_priv.r);
|
||||||
|
GNUNET_CRYPTO_cs_r_get_public (&r_priv.r[0], &r_pub.r_pub[0]);
|
||||||
|
GNUNET_CRYPTO_cs_r_get_public (&r_priv.r[1], &r_pub.r_pub[1]);
|
||||||
|
GNUNET_assert (0 == pthread_mutex_lock (&keys_lock));
|
||||||
|
GNUNET_assert (dk->rc > 0);
|
||||||
|
dk->rc--;
|
||||||
|
GNUNET_assert (0 == pthread_mutex_unlock (&keys_lock));
|
||||||
|
|
||||||
|
{
|
||||||
|
struct TALER_CRYPTO_RDeriveResponse rdr;
|
||||||
|
enum GNUNET_GenericReturnValue ret;
|
||||||
|
|
||||||
|
rdr.header.size = htons (sizeof (struct TALER_CRYPTO_RDeriveResponse));
|
||||||
|
rdr.header.type = htons (TALER_HELPER_CS_MT_RES_RDERIVE);
|
||||||
|
rdr.r_pub = r_pub;
|
||||||
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||||
|
"Sending CS Derived R after %s\n",
|
||||||
|
GNUNET_TIME_relative2s (
|
||||||
|
GNUNET_TIME_absolute_get_duration (now),
|
||||||
|
GNUNET_YES));
|
||||||
|
ret = TES_transmit (client->csock,
|
||||||
|
&rdr.header);
|
||||||
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||||
|
"Sent CS Derived R after %s\n",
|
||||||
|
GNUNET_TIME_relative2s (
|
||||||
|
GNUNET_TIME_absolute_get_duration (now),
|
||||||
|
GNUNET_YES));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle @a hdr message received from @a client.
|
* Handle @a hdr message received from @a client.
|
||||||
*
|
*
|
||||||
@ -598,6 +692,15 @@ cs_work_dispatch (struct TES_Client *client,
|
|||||||
return handle_revoke_request (
|
return handle_revoke_request (
|
||||||
client,
|
client,
|
||||||
(const struct TALER_CRYPTO_CsRevokeRequest *) hdr);
|
(const struct TALER_CRYPTO_CsRevokeRequest *) hdr);
|
||||||
|
case TALER_HELPER_CS_MT_RES_RDERIVE:
|
||||||
|
if (msize != sizeof (struct TALER_CRYPTO_CsRDeriveRequest))
|
||||||
|
{
|
||||||
|
GNUNET_break_op (0);
|
||||||
|
return GNUNET_SYSERR;
|
||||||
|
}
|
||||||
|
return handle_r_derive_request (client,
|
||||||
|
(const struct
|
||||||
|
TALER_CRYPTO_CsRDeriveRequest *) hdr);
|
||||||
default:
|
default:
|
||||||
GNUNET_break_op (0);
|
GNUNET_break_op (0);
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
|
@ -156,7 +156,10 @@ struct TALER_CRYPTO_CsRDeriveRequest
|
|||||||
*/
|
*/
|
||||||
struct TALER_CsPubHashP h_cs;
|
struct TALER_CsPubHashP h_cs;
|
||||||
|
|
||||||
/* followed by Withdraw nonce to derive R */
|
/**
|
||||||
|
* Withdraw nonce to derive R from
|
||||||
|
*/
|
||||||
|
struct TALER_WithdrawNonce nonce;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -215,7 +218,10 @@ struct TALER_CRYPTO_RDeriveResponse
|
|||||||
*/
|
*/
|
||||||
uint32_t reserved;
|
uint32_t reserved;
|
||||||
|
|
||||||
/* followed by derived R */
|
/**
|
||||||
|
* derived R
|
||||||
|
*/
|
||||||
|
struct TALER_DenominationCsPublicR r_pub;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user