aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2023-01-01 18:36:54 +0100
committerChristian Grothoff <christian@grothoff.org>2023-01-01 18:36:54 +0100
commit4f0d85935f5577b9fc6feea5603ac7a0fa210625 (patch)
tree286a8df6bfac8e482de2bf8b8d908107f9839e74
parentc5ad98da9812a05d078b6b017a545959ada96a3d (diff)
downloadexchange-4f0d85935f5577b9fc6feea5603ac7a0fa210625.tar.xz
-crypto for AML decision signatures
-rw-r--r--src/include/taler_crypto_lib.h53
-rw-r--r--src/util/Makefile.am1
-rw-r--r--src/util/aml_signatures.c127
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 */