diff options
author | Christian Grothoff <christian@grothoff.org> | 2023-01-01 18:36:54 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2023-01-01 18:36:54 +0100 |
commit | 4f0d85935f5577b9fc6feea5603ac7a0fa210625 (patch) | |
tree | 286a8df6bfac8e482de2bf8b8d908107f9839e74 /src | |
parent | c5ad98da9812a05d078b6b017a545959ada96a3d (diff) | |
download | exchange-4f0d85935f5577b9fc6feea5603ac7a0fa210625.tar.xz |
-crypto for AML decision signatures
Diffstat (limited to 'src')
-rw-r--r-- | src/include/taler_crypto_lib.h | 53 | ||||
-rw-r--r-- | src/util/Makefile.am | 1 | ||||
-rw-r--r-- | src/util/aml_signatures.c | 127 |
3 files changed, 181 insertions, 0 deletions
diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h index ca80c6cca..35a6bd6da 100644 --- a/src/include/taler_crypto_lib.h +++ b/src/include/taler_crypto_lib.h @@ -2354,6 +2354,58 @@ TALER_CRYPTO_contract_decrypt_for_deposit ( size_t econtract_size); +/* **************** AML officer signatures **************** */ + + +/** + * Sign AML decision. + * + * @param justification human-readable justification + * @param decision_time when was the decision made + * @param new_threshold at what monthly amount threshold + * should a revision be triggered + * @param h_payto payto URI hash of the account the + * decision is about + * @param new_state updated AML state + * @param officer_priv private key of AML officer + * @param[out] officer_sig where to write the signature + */ +void +TALER_officer_aml_decision_sign ( + const char *justification, + struct GNUNET_TIME_Timestamp decision_time, + const struct TALER_Amount *new_threshold, + const struct TALER_PaytoHashP *h_payto, + enum TALER_AmlDecisionState new_state, + const struct TALER_AmlOfficerPrivateKeyP *officer_priv, + struct TALER_AmlOfficerSignatureP *officer_sig); + + +/** + * Verify AML decision. + * + * @param justification human-readable justification + * @param decision_time when was the decision made + * @param new_threshold at what monthly amount threshold + * should a revision be triggered + * @param h_payto payto URI hash of the account the + * decision is about + * @param new_state updated AML state + * @param officer_pub public key of AML officer + * @param officer_sig signature to verify + * @return #GNUNET_OK if the signature is valid + */ +enum GNUNET_GenericReturnValue +TALER_officer_aml_decision_verify ( + const char *justification, + struct GNUNET_TIME_Timestamp decision_time, + const struct TALER_Amount *new_threshold, + const struct TALER_PaytoHashP *h_payto, + enum TALER_AmlDecisionState new_state, + const struct TALER_AmlOfficerPublicKeyP *officer_pub, + const struct TALER_AmlOfficerSignatureP *officer_sig); + + /* **************** Helper-based RSA operations **************** */ /** @@ -2522,6 +2574,7 @@ void TALER_CRYPTO_helper_rsa_disconnect ( struct TALER_CRYPTO_RsaDenominationHelper *dh); + /* **************** Helper-based CS operations **************** */ /** diff --git a/src/util/Makefile.am b/src/util/Makefile.am index acafdae57..656da7c49 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -77,6 +77,7 @@ lib_LTLIBRARIES = \ libtalerutil_la_SOURCES = \ age_restriction.c \ amount.c \ + aml_signatures.c \ auditor_signatures.c \ config.c \ crypto.c \ diff --git a/src/util/aml_signatures.c b/src/util/aml_signatures.c new file mode 100644 index 000000000..7d5d30473 --- /dev/null +++ b/src/util/aml_signatures.c @@ -0,0 +1,127 @@ +/* + This file is part of TALER + Copyright (C) 2023 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> +*/ +/** + * @file aml_signatures.c + * @brief Utility functions for AML officers + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_util.h" +#include "taler_signatures.h" + + +GNUNET_NETWORK_STRUCT_BEGIN + +/** + * @brief Format used to generate the signature on a request to deposit + * a coin into the account of a merchant. + */ +struct TALER_AmlDecisionPS +{ + /** + * Purpose must be #TALER_SIGNATURE_AML_DECISION. + * Used for an EdDSA signature with the `struct TALER_AmlOfficerPublicKeyP`. + */ + struct GNUNET_CRYPTO_EccSignaturePurpose purpose; + + /** + * Hash over the justification text. + */ + struct GNUNET_HashCode h_justification GNUNET_PACKED; + + /** + * Time when this decision was made. + */ + struct GNUNET_TIME_TimestampNBO decision_time; + + /** + * New threshold for triggering possibly a new AML process. + */ + struct TALER_AmountNBO new_threshold; + + /** + * Hash of the account identifier to which the decision applies. + */ + struct TALER_PaytoHashP h_payto GNUNET_PACKED; + + /** + * What is the new AML status? + */ + uint32_t new_state GNUNET_PACKED; + +}; + +GNUNET_NETWORK_STRUCT_END + +void +TALER_officer_aml_decision_sign ( + const char *justification, + struct GNUNET_TIME_Timestamp decision_time, + const struct TALER_Amount *new_threshold, + const struct TALER_PaytoHashP *h_payto, + enum TALER_AmlDecisionState new_state, + const struct TALER_AmlOfficerPrivateKeyP *officer_priv, + struct TALER_AmlOfficerSignatureP *officer_sig) +{ + struct TALER_AmlDecisionPS ad = { + .purpose.purpose = htonl (TALER_SIGNATURE_AML_DECISION), + .purpose.size = htonl (sizeof (ad)), + .h_payto = *h_payto, + .new_state = htonl ((uint32_t) new_state) + }; + + GNUNET_CRYPTO_hash (justification, + strlen (justification), + &ad.h_justification); + TALER_amount_hton (&ad.new_threshold, + new_threshold); + GNUNET_CRYPTO_eddsa_sign (&officer_priv->eddsa_priv, + &ad, + &officer_sig->eddsa_signature); +} + + +enum GNUNET_GenericReturnValue +TALER_officer_aml_decision_verify ( + const char *justification, + struct GNUNET_TIME_Timestamp decision_time, + const struct TALER_Amount *new_threshold, + const struct TALER_PaytoHashP *h_payto, + enum TALER_AmlDecisionState new_state, + const struct TALER_AmlOfficerPublicKeyP *officer_pub, + const struct TALER_AmlOfficerSignatureP *officer_sig) +{ + struct TALER_AmlDecisionPS ad = { + .purpose.purpose = htonl (TALER_SIGNATURE_AML_DECISION), + .purpose.size = htonl (sizeof (ad)), + .h_payto = *h_payto, + .new_state = htonl ((uint32_t) new_state) + }; + + GNUNET_CRYPTO_hash (justification, + strlen (justification), + &ad.h_justification); + TALER_amount_hton (&ad.new_threshold, + new_threshold); + return GNUNET_CRYPTO_eddsa_verify ( + TALER_SIGNATURE_AML_DECISION, + &ad, + &officer_sig->eddsa_signature, + &officer_pub->eddsa_pub); +} + + +/* end of aml_signatures.c */ |