diff options
author | Christian Blättler <blatc2@bfh.ch> | 2023-12-05 12:44:05 +0100 |
---|---|---|
committer | Christian Blättler <blatc2@bfh.ch> | 2023-12-05 12:44:05 +0100 |
commit | 9b27ee9c8d7d2bda08c795d9ae60cd2523bd8ffe (patch) | |
tree | 6e40832ca1ae520b6ae4cf4f7139694a778f0206 /src/pq/pq_query_helper.c | |
parent | 6500ab37f7b14f0a4d163e3325172171fb939390 (diff) | |
download | exchange-9b27ee9c8d7d2bda08c795d9ae60cd2523bd8ffe.tar.xz |
add query param functions for blind sign private and public keys
Diffstat (limited to 'src/pq/pq_query_helper.c')
-rw-r--r-- | src/pq/pq_query_helper.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/pq/pq_query_helper.c b/src/pq/pq_query_helper.c index f66844515..4764f7d1c 100644 --- a/src/pq/pq_query_helper.c +++ b/src/pq/pq_query_helper.c @@ -1191,4 +1191,203 @@ TALER_PQ_query_param_array_amount ( } +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param[out] param_values SQL data to set + * @param[out] param_lengths SQL length data to set + * @param[out] param_formats SQL format data to set + * @param param_length number of entries available in the @a param_values, @a param_lengths and @a param_formats arrays + * @param[out] scratch buffer for dynamic allocations (to be done via #GNUNET_malloc() + * @param scratch_length number of entries left in @a scratch + * @return -1 on error, number of offsets used in @a scratch otherwise + */ +static int +qconv_blind_sign_pub (void *cls, + const void *data, + size_t data_len, + void *param_values[], + int param_lengths[], + int param_formats[], + unsigned int param_length, + void *scratch[], + unsigned int scratch_length) +{ + const struct GNUNET_CRYPTO_BlindSignPublicKey *public_key = data; + size_t tlen; + size_t len; + uint32_t be; + char *buf; + void *tbuf; + + (void) cls; + (void) data_len; + GNUNET_assert (1 == param_length); + GNUNET_assert (scratch_length > 0); + GNUNET_break (NULL == cls); + be = htonl ((uint32_t) public_key->cipher); + switch (public_key->cipher) + { + case GNUNET_CRYPTO_BSA_RSA: + tlen = GNUNET_CRYPTO_rsa_public_key_encode ( + public_key->details.rsa_public_key, + &tbuf); + break; + case GNUNET_CRYPTO_BSA_CS: + tlen = sizeof (public_key->details.cs_public_key); + break; + default: + GNUNET_assert (0); + } + len = tlen + sizeof (be); + buf = GNUNET_malloc (len); + GNUNET_memcpy (buf, + &be, + sizeof (be)); + switch (public_key->cipher) + { + case GNUNET_CRYPTO_BSA_RSA: + GNUNET_memcpy (&buf[sizeof (be)], + tbuf, + tlen); + GNUNET_free (tbuf); + break; + case GNUNET_CRYPTO_BSA_CS: + GNUNET_memcpy (&buf[sizeof (be)], + &public_key->details.cs_public_key, + tlen); + break; + default: + GNUNET_assert (0); + } + + scratch[0] = buf; + param_values[0] = (void *) buf; + param_lengths[0] = len; + param_formats[0] = 1; + return 1; +} + +/** + * Generate query parameter for a blind sign public key of variable size. + * + * @param public_key pointer to the query parameter to pass + */ +struct GNUNET_PQ_QueryParam +TALER_PQ_query_param_blind_sign_pub ( + const struct GNUNET_CRYPTO_BlindSignPublicKey *public_key) +{ + struct GNUNET_PQ_QueryParam res = { + .conv = &qconv_blind_sign_pub, + .data = public_key, + .num_params = 1 + }; + + return res; +} + + +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param[out] param_values SQL data to set + * @param[out] param_lengths SQL length data to set + * @param[out] param_formats SQL format data to set + * @param param_length number of entries available in the @a param_values, @a param_lengths and @a param_formats arrays + * @param[out] scratch buffer for dynamic allocations (to be done via #GNUNET_malloc() + * @param scratch_length number of entries left in @a scratch + * @return -1 on error, number of offsets used in @a scratch otherwise + */ +static int +qconv_blind_sign_priv (void *cls, + const void *data, + size_t data_len, + void *param_values[], + int param_lengths[], + int param_formats[], + unsigned int param_length, + void *scratch[], + unsigned int scratch_length) +{ + const struct GNUNET_CRYPTO_BlindSignPrivateKey *private_key = data; + size_t tlen; + size_t len; + uint32_t be; + char *buf; + void *tbuf; + + (void) cls; + (void) data_len; + GNUNET_assert (1 == param_length); + GNUNET_assert (scratch_length > 0); + GNUNET_break (NULL == cls); + be = htonl ((uint32_t) private_key->cipher); + switch (private_key->cipher) + { + case GNUNET_CRYPTO_BSA_RSA: + tlen = GNUNET_CRYPTO_rsa_private_key_encode ( + private_key->details.rsa_private_key, + &tbuf); + break; + case GNUNET_CRYPTO_BSA_CS: + tlen = sizeof (private_key->details.cs_private_key); + break; + default: + GNUNET_assert (0); + } + len = tlen + sizeof (be); + buf = GNUNET_malloc (len); + GNUNET_memcpy (buf, + &be, + sizeof (be)); + switch (private_key->cipher) + { + case GNUNET_CRYPTO_BSA_RSA: + GNUNET_memcpy (&buf[sizeof (be)], + tbuf, + tlen); + GNUNET_free (tbuf); + break; + case GNUNET_CRYPTO_BSA_CS: + GNUNET_memcpy (&buf[sizeof (be)], + &private_key->details.cs_private_key, + tlen); + break; + default: + GNUNET_assert (0); + } + + scratch[0] = buf; + param_values[0] = (void *) buf; + param_lengths[0] = len; + param_formats[0] = 1; + return 1; +} + + +/** + * Generate query parameter for a blind sign private key of variable size. + * + * @param private_key pointer to the query parameter to pass + */ +struct GNUNET_PQ_QueryParam +TALER_PQ_query_param_blind_sign_priv ( + const struct GNUNET_CRYPTO_BlindSignPrivateKey *private_key) +{ + struct GNUNET_PQ_QueryParam res = { + .conv = &qconv_blind_sign_priv, + .data = private_key, + .num_params = 1 + }; + + return res; +} + + /* end of pq/pq_query_helper.c */ |