merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

test_merchant_kyc_order.c (4370B)


      1 /*
      2    This file is part of TALER
      3    Copyright (C) 2026 Taler Systems SA
      4 
      5    TALER is free software; you can redistribute it and/or modify it under the
      6    terms of the GNU General Public License as published by the Free Software
      7    Foundation; either version 3, or (at your option) any later version.
      8 
      9    TALER is distributed in the hope that it will be useful, but WITHOUT ANY
     10    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11    A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
     12 
     13    You should have received a copy of the GNU General Public License along with
     14    TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
     15  */
     16 /**
     17  * @file backend/test_merchant_kyc_order.c
     18  * @brief Test deterministic ordering of KYC response data
     19  */
     20 #include "platform.h"
     21 #include <gnunet/gnunet_util_lib.h>
     22 #include <taler/taler_json_lib.h>
     23 #include "taler-merchant-httpd_kyc-order.h"
     24 
     25 
     26 /**
     27  * Check one entry in a sorted KYC response.
     28  *
     29  * @param data KYC response array
     30  * @param index index to check
     31  * @param h_wire expected account hash
     32  * @param exchange_url expected exchange URL
     33  */
     34 static void
     35 check_entry (const json_t *data,
     36              size_t index,
     37              const char *h_wire,
     38              const char *exchange_url)
     39 {
     40   const json_t *entry = json_array_get (data,
     41                                          index);
     42 
     43   GNUNET_assert (0 ==
     44                  strcmp (h_wire,
     45                          json_string_value (
     46                            json_object_get (entry,
     47                                             "h_wire"))));
     48   GNUNET_assert (0 ==
     49                  strcmp (exchange_url,
     50                          json_string_value (
     51                            json_object_get (entry,
     52                                             "exchange_url"))));
     53 }
     54 
     55 
     56 int
     57 main (int argc,
     58       char *const argv[])
     59 {
     60   json_t *first;
     61   json_t *second;
     62   char *first_canonical;
     63   char *second_canonical;
     64   struct GNUNET_ShortHashCode first_etag;
     65   struct GNUNET_ShortHashCode second_etag;
     66 
     67   (void) argc;
     68   (void) argv;
     69   first = json_pack (
     70     "[{s:s,s:s},{s:s,s:s},{s:s,s:s}]",
     71     "h_wire", "BBBB",
     72     "exchange_url", "https://b.example/",
     73     "h_wire", "AAAA",
     74     "exchange_url", "https://z.example/",
     75     "h_wire", "AAAA",
     76     "exchange_url", "https://a.example/");
     77   second = json_pack (
     78     "[{s:s,s:s},{s:s,s:s},{s:s,s:s}]",
     79     "h_wire", "AAAA",
     80     "exchange_url", "https://a.example/",
     81     "h_wire", "BBBB",
     82     "exchange_url", "https://b.example/",
     83     "h_wire", "AAAA",
     84     "exchange_url", "https://z.example/");
     85   GNUNET_assert (NULL != first);
     86   GNUNET_assert (NULL != second);
     87 
     88   TMH_kyc_data_sort (first);
     89   TMH_kyc_data_sort (second);
     90   check_entry (first,
     91                0,
     92                "AAAA",
     93                "https://a.example/");
     94   check_entry (first,
     95                1,
     96                "AAAA",
     97                "https://z.example/");
     98   check_entry (first,
     99                2,
    100                "BBBB",
    101                "https://b.example/");
    102   GNUNET_assert (json_equal (first,
    103                              second));
    104   first_canonical = TALER_JSON_canonicalize (first);
    105   second_canonical = TALER_JSON_canonicalize (second);
    106   GNUNET_assert (0 ==
    107                  strcmp (first_canonical,
    108                          second_canonical));
    109   GNUNET_assert (GNUNET_YES ==
    110                  GNUNET_CRYPTO_hkdf_gnunet (&first_etag,
    111                                             sizeof (first_etag),
    112                                             "KYC-SALT",
    113                                             strlen ("KYC-SALT"),
    114                                             first_canonical,
    115                                             strlen (first_canonical)));
    116   GNUNET_assert (GNUNET_YES ==
    117                  GNUNET_CRYPTO_hkdf_gnunet (&second_etag,
    118                                             sizeof (second_etag),
    119                                             "KYC-SALT",
    120                                             strlen ("KYC-SALT"),
    121                                             second_canonical,
    122                                             strlen (second_canonical)));
    123   GNUNET_assert (0 ==
    124                  GNUNET_memcmp (&first_etag,
    125                                 &second_etag));
    126 
    127   GNUNET_free (first_canonical);
    128   GNUNET_free (second_canonical);
    129   json_decref (first);
    130   json_decref (second);
    131   return 0;
    132 }