From 6f027fc13099f870e359aaf295f5e4051801c321 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 2 Apr 2022 17:25:04 +0200 Subject: add additinal signature --- src/include/taler_crypto_lib.h | 37 +++++++++++++++++++ src/include/taler_signatures.h | 4 +++ src/util/wallet_signatures.c | 81 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+) diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h index 6b554dfb1..5f425341e 100644 --- a/src/include/taler_crypto_lib.h +++ b/src/include/taler_crypto_lib.h @@ -2726,6 +2726,43 @@ TALER_wallet_purse_create_verify ( const struct TALER_PurseContractSignatureP *purse_sig); +/** + * Sign a request to upload an encrypted contract. + * + * @param econtract encrypted contract + * @param econtract_size number of bytes in @a econtract + * @param contract_pub public key for the DH-encryption + * @param purse_priv key identifying the purse + * @param[out] purse_sig resulting signature + */ +void +TALER_wallet_econtract_upload_sign ( + const void *econtract, + size_t econtract_size, + const struct TALER_ContractDiffiePublicP *contract_pub, + const struct TALER_PurseContractPrivateKeyP *purse_priv, + struct TALER_PurseContractSignatureP *purse_sig); + + +/** + * Verify a signature over encrypted contract. + * + * @param econtract encrypted contract + * @param econtract_size number of bytes in @a econtract + * @param contract_pub public key for the DH-encryption + * @param purse_pub purse’s public key + * @param purse_sig the signature made with purpose #TALER_SIGNATURE_WALLET_PURSE_CREATE + * @return #GNUNET_OK if the signature is valid + */ +enum GNUNET_GenericReturnValue +TALER_wallet_econtract_upload_verify ( + const void *econtract, + size_t econtract_size, + const struct TALER_ContractDiffiePublicP *contract_pub, + const struct TALER_PurseContractPublicKeyP *purse_pub, + const struct TALER_PurseContractSignatureP *purse_sig); + + /** * Sign a request to inquire about a purse's status. * diff --git a/src/include/taler_signatures.h b/src/include/taler_signatures.h index 70c917b67..d3e70a9e7 100644 --- a/src/include/taler_signatures.h +++ b/src/include/taler_signatures.h @@ -316,6 +316,10 @@ */ #define TALER_SIGNATURE_WALLET_RESERVE_CLOSE 1215 +/** + * Associates encrypted contract with a purse. + */ +#define TALER_SIGNATURE_WALLET_PURSE_ECONTRACT 1216 /******************************/ /* Security module signatures */ diff --git a/src/util/wallet_signatures.c b/src/util/wallet_signatures.c index 756856d2a..4b2ddb6cd 100644 --- a/src/util/wallet_signatures.c +++ b/src/util/wallet_signatures.c @@ -1177,4 +1177,85 @@ TALER_wallet_account_close_verify ( } +/** + * Message signed by purse to associate an encrypted contract. + */ +struct TALER_PurseContractPS +{ + + /** + * Purpose is #TALER_SIGNATURE_WALLET_PURSE_ECONTRACT + */ + struct GNUNET_CRYPTO_EccSignaturePurpose purpose; + + /** + * Hash over the encrypted contract. + */ + struct GNUNET_HashCode h_econtract; + + /** + * Public key to decrypt the contract. + */ + struct TALER_ContractDiffiePublicP contract_pub; +}; + + +void +TALER_wallet_econtract_upload_sign ( + const void *econtract, + size_t econtract_size, + const struct TALER_ContractDiffiePublicP *contract_pub, + const struct TALER_PurseContractPrivateKeyP *purse_priv, + struct TALER_PurseContractSignatureP *purse_sig) +{ + struct TALER_PurseContractPS pc = { + .purpose.size = htonl (sizeof (pc)), + .purpose.purpose = htonl (TALER_SIGNATURE_WALLET_PURSE_ECONTRACT), + .contract_pub = *contract_pub + }; + + GNUNET_CRYPTO_hash (econtract, + econtract_size, + &pc.h_econtract); + GNUNET_assert (GNUNET_OK == + GNUNET_CRYPTO_eddsa_sign_ (&purse_priv->eddsa_priv, + &pc.purpose, + &purse_sig->eddsa_signature)); +} + + +/** + * Verify a signature over encrypted contract. + * + * @param econtract encrypted contract + * @param econtract_size number of bytes in @a econtract + * @param contract_pub public key for the DH-encryption + * @param purse_pub purse’s public key + * @param purse_sig the signature made with purpose #TALER_SIGNATURE_WALLET_PURSE_CREATE + * @return #GNUNET_OK if the signature is valid + */ +enum GNUNET_GenericReturnValue +TALER_wallet_econtract_upload_verify ( + const void *econtract, + size_t econtract_size, + const struct TALER_ContractDiffiePublicP *contract_pub, + const struct TALER_PurseContractPublicKeyP *purse_pub, + const struct TALER_PurseContractSignatureP *purse_sig) +{ + struct TALER_PurseContractPS pc = { + .purpose.size = htonl (sizeof (pc)), + .purpose.purpose = htonl (TALER_SIGNATURE_WALLET_PURSE_ECONTRACT), + .contract_pub = *contract_pub + }; + + GNUNET_CRYPTO_hash (econtract, + econtract_size, + &pc.h_econtract); + return GNUNET_CRYPTO_eddsa_verify_ (TALER_SIGNATURE_WALLET_RESERVE_CLOSE, + &pc.purpose, + &purse_sig->eddsa_signature, + &purse_pub->eddsa_pub); +} + + /* end of wallet_signatures.c */ -- cgit v1.2.3