diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/taler_crypto_lib.h | 54 | ||||
-rw-r--r-- | src/include/taler_pq_lib.h | 50 | ||||
-rw-r--r-- | src/pq/pq_query_helper.c | 199 |
3 files changed, 303 insertions, 0 deletions
diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h index eec8a9020..0b80ff071 100644 --- a/src/include/taler_crypto_lib.h +++ b/src/include/taler_crypto_lib.h @@ -5886,4 +5886,58 @@ TALER_denomination_group_get_key ( struct GNUNET_HashCode *key); +/** + * Token family public key. + */ +struct TALER_TokenFamilyPublicKey +{ + /** + * Type of the signature. + */ + struct GNUNET_CRYPTO_BlindSignPublicKey public_key; +}; + +/** + * Hash of a public key of a token family. + */ +struct TALER_TokenFamilyPublicKeyHash +{ + /** + * Hash of the token public key. + */ + struct GNUNET_HashCode hash; +}; + +/** + * Token family private key. + */ +struct TALER_TokenFamilyPrivateKey +{ + struct GNUNET_CRYPTO_BlindSignPrivateKey private_key; +}; + +/** + * Token public key. + */ +struct TALER_TokenPublicKey +{ + struct GNUNET_CRYPTO_EddsaPublicKey public_key; +}; + +/** + * Signature made using a token private key. + */ +struct TALER_TokenSignature +{ + struct GNUNET_CRYPTO_EddsaSignature signature; +}; + +/** + * Blind signature for a token (signed by merchant). + */ +struct TALER_TokenBlindSignature +{ + struct GNUNET_CRYPTO_BlindedSignature signature; +}; + #endif diff --git a/src/include/taler_pq_lib.h b/src/include/taler_pq_lib.h index d9c23e35d..a529b4302 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 GNUNET_HashCode * @@ -190,6 +192,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. @@ -311,6 +333,7 @@ TALER_PQ_result_spec_array_blinded_denom_sig ( size_t *num, struct TALER_BlindedDenominationSignature **denom_sigs); + /** * Array of blinded hashes of coin envelopes * @@ -327,6 +350,7 @@ TALER_PQ_result_spec_array_blinded_coin_hash ( size_t *num, struct TALER_BlindedCoinHashP **h_coin_evs); + /** * Array of hashes of denominations * @@ -343,6 +367,7 @@ TALER_PQ_result_spec_array_denom_hash ( size_t *num, struct TALER_DenominationHashP **denom_hs); + /** * Array of GNUNET_HashCode * @@ -378,6 +403,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 24bf054da..d8655db08 100644 --- a/src/pq/pq_query_helper.c +++ b/src/pq/pq_query_helper.c @@ -1220,4 +1220,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 */ |