diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/taler_crypto_lib.h | 37 | ||||
| -rw-r--r-- | src/include/taler_signatures.h | 4 | ||||
| -rw-r--r-- | src/util/wallet_signatures.c | 81 | 
3 files changed, 122 insertions, 0 deletions
| diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h index 6b554dfb..5f425341 100644 --- a/src/include/taler_crypto_lib.h +++ b/src/include/taler_crypto_lib.h @@ -2727,6 +2727,43 @@ TALER_wallet_purse_create_verify (  /** + * 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.   *   * @param purse_priv key identifying the purse diff --git a/src/include/taler_signatures.h b/src/include/taler_signatures.h index 70c917b6..d3e70a9e 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 756856d2..4b2ddb6c 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 */ | 
