From 4f0d85935f5577b9fc6feea5603ac7a0fa210625 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 1 Jan 2023 18:36:54 +0100 Subject: -crypto for AML decision signatures --- src/include/taler_crypto_lib.h | 53 +++++++++++++++++ src/util/Makefile.am | 1 + src/util/aml_signatures.c | 127 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 src/util/aml_signatures.c 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 +*/ +/** + * @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 */ -- cgit v1.2.3