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 | |
parent | 6500ab37f7b14f0a4d163e3325172171fb939390 (diff) | |
download | exchange-9b27ee9c8d7d2bda08c795d9ae60cd2523bd8ffe.tar.gz exchange-9b27ee9c8d7d2bda08c795d9ae60cd2523bd8ffe.tar.bz2 exchange-9b27ee9c8d7d2bda08c795d9ae60cd2523bd8ffe.zip |
add query param functions for blind sign private and public keys
-rw-r--r-- | src/include/taler_pq_lib.h | 50 | ||||
-rw-r--r-- | src/pq/pq_query_helper.c | 199 |
2 files changed, 249 insertions, 0 deletions
diff --git a/src/include/taler_pq_lib.h b/src/include/taler_pq_lib.h index 86d458e05..06e7d53ed 100644 --- a/src/include/taler_pq_lib.h +++ b/src/include/taler_pq_lib.h @@ -149,6 +149,7 @@ TALER_PQ_query_param_array_blinded_denom_sig ( struct GNUNET_PQ_Context *db ); + /** * Generate query parameter for an array of blinded hashes of coin envelopes * @@ -162,6 +163,7 @@ TALER_PQ_query_param_array_blinded_coin_hash ( const struct TALER_BlindedCoinHashP *coin_evs, struct GNUNET_PQ_Context *db); + /** * Generate query parameter for an array of mounts * @@ -177,6 +179,26 @@ TALER_PQ_query_param_array_amount ( /** + * 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); + + +/** + * 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); + + +/** * Currency amount expected, from a record-field of (DB) * taler_amount_with_currency type. The currency must be stored in the * database when using this function. @@ -298,6 +320,7 @@ TALER_PQ_result_spec_array_blinded_denom_sig ( size_t *num, struct TALER_BlindedDenominationSignature **denom_sigs); + /** * Array of blinded hashes of coin envelopes * @@ -314,6 +337,7 @@ TALER_PQ_result_spec_array_blinded_coin_hash ( size_t *num, struct TALER_BlindedCoinHashP **h_coin_evs); + /** * Array of hashes of denominations * @@ -330,6 +354,7 @@ TALER_PQ_result_spec_array_denom_hash ( size_t *num, struct TALER_DenominationHashP **denom_hs); + /** * Array of amounts * @@ -349,6 +374,31 @@ TALER_PQ_result_spec_array_amount ( struct TALER_Amount **amounts); +/** + * Blind sign public key expected. + * + * @param name name of the field in the table + * @param[out] public_key where to store the denomination signature + * @return array entry for the result specification to use + */ +struct GNUNET_PQ_ResultSpec +TALER_PQ_result_spec_blind_sign_pub ( + const char *name, + struct GNUNET_CRYPTO_BlindSignPublicKey *public_key); + + +/** + * Blind sign private key expected. + * + * @param name name of the field in the table + * @param[out] private_key where to store the denomination signature + * @return array entry for the result specification to use + */ +struct GNUNET_PQ_ResultSpec +TALER_PQ_result_spec_blind_sign_priv ( + const char *name, + struct GNUNET_CRYPTO_BlindSignPrivateKey *private_key); + #endif /* TALER_PQ_LIB_H_ */ /* end of include/taler_pq_lib.h */ 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 */ |