commit 5f7654d5ba3524e039d18792e2a00a4df63c0a0a
parent 2dcc36867561729c7b8bad2ead694ab0931d5cfe
Author: Bohdan Potuzhnyi <bohdan.potuzhnyi@gmail.com>
Date: Wed, 8 Oct 2025 10:07:11 +0200
[donau-verificator] sha512 to sha256
Diffstat:
5 files changed, 15 insertions(+), 45 deletions(-)
diff --git a/donau-verificator/README.md b/donau-verificator/README.md
@@ -6,7 +6,7 @@ The app verifies the donation statement made by a Donau.
2. For test purposes, a string of a valid donation statement is already hard coded.
3. With the defined URI scheme following command can be used (developer mode must be enabled for `donau+http` URIs):
```bash
-adb shell am start -a android.intent.action.VIEW -d "donau://example.com/megacharity/1234/2024/7560001010000/1234?total=EUR:15&sig=ED25519:SAAM5BA1F9H4VT6T78CFC3X63HAMY2TXB597XBVZ0EMXEZ90QPJ3000BXDBJ3ECHGB8AEX9FFQ5BAXVSF6X6NXM98PY353F2R99PP1R&pub=E24CDJHGSPZG20ZSSTMTBREGCCP495WKETQYCYA9C93EPMZN4FEG"
+adb shell am start -a android.intent.action.VIEW -d "donau://example.com/megacharity/1234/2025/7560001010000/1234?total=EUR:15&sig=ED25519:H9PM3BW3P8MEKB34GZ0G1F7JSNVX7B8AHXRFFMS37QZM7TXZ5MWPXTEDZZGN1QRB1AFPKNCFXJB39NJHP3BAFGCZSCXHEYPHA1YJY28&pub=K641W1CZM7DRSV184M8CPM3Z8MZRBYYJMNYMJK70FTYJHBPX21J0"
```
## Future Work
The public key should be requested directly from the Donau over HTTPS,
@@ -23,4 +23,4 @@ Mac OS, Linux:
Windows:
- gradlew.bat
-0
-\ No newline at end of file
+0
diff --git a/donau-verificator/src/main/cpp/verification.cpp b/donau-verificator/src/main/cpp/verification.cpp
@@ -23,6 +23,7 @@
// needed for libsodium
#include <sodium/crypto_sign.h>
+#include <sodium/crypto_hash_sha256.h>
/**
* Maximum legal 'value' for an amount, based on IEEE double (for JavaScript compatibility).
@@ -379,19 +380,11 @@ TALER_string_to_amount_nbo (const char *str,
}
/**
- * @brief A 512-bit hashcode. These are the default length for GNUnet, using SHA-512.
- */
-struct GNUNET_HashCode
-{
- uint32_t bits[512 / 8 / sizeof(uint32_t)]; /* = 16 */
-};
-
-/**
* Donor's hashed and salted unique donation identifier.
*/
struct DONAU_HashDonorTaxId
{
- unsigned char hash[512/8];
+ unsigned char hash[256 / 8];
};
@@ -585,18 +578,18 @@ Java_net_taler_donauverificator_Results_ed25519_1verify(
struct DONAU_DonauSignatureP sig;
struct DONAU_HashDonorTaxId h_donor_tax_id;
- crypto_hash_sha512_state state;
- crypto_hash_sha512_init(&state);
+ crypto_hash_sha256_state state;
+ crypto_hash_sha256_init(&state);
unsigned int tax_length;
for (tax_length = 0; tax_id[tax_length]!= '\0'; ++tax_length);
unsigned int salt_length;
for (salt_length = 0; salt[salt_length]!= '\0'; ++salt_length);
- crypto_hash_sha512_update(&state, tax_id, tax_length);
- crypto_hash_sha512_update(&state, salt, salt_length);
+ crypto_hash_sha256_update(&state, tax_id, tax_length);
+ crypto_hash_sha256_update(&state, salt, salt_length);
- crypto_hash_sha512_final(&state, h_donor_tax_id.hash);
+ crypto_hash_sha256_final(&state, h_donor_tax_id.hash);
struct DONAU_DonationStatementConfirmationPS confirm = {
.purpose.purpose = htonl (1500),
@@ -630,4 +623,4 @@ Java_net_taler_donauverificator_Results_ed25519_1verify(
const unsigned char *eddsa_pub = (const unsigned char*) &pub.eddsa_pub.q_y;
//verify function from libsodium (also used by GNUNET)
return crypto_sign_verify_detached (s, m, mlen, eddsa_pub);
-}
-\ No newline at end of file
+}
diff --git a/donau-verificator/src/main/java/net/taler/donauverificator/MainActivity.java b/donau-verificator/src/main/java/net/taler/donauverificator/MainActivity.java
@@ -43,7 +43,7 @@ import net.taler.donauverificator.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private static final String DEBUG_DONATION_STATEMENT =
- "donau://example.com/megacharity/1234/2024/7560001010000/1234?total=EUR:15&sig=ED25519:SAAM5BA1F9H4VT6T78CFC3X63HAMY2TXB597XBVZ0EMXEZ90QPJ3000BXDBJ3ECHGB8AEX9FFQ5BAXVSF6X6NXM98PY353F2R99PP1R&pub=E24CDJHGSPZG20ZSSTMTBREGCCP495WKETQYCYA9C93EPMZN4FEG";
+ "donau://example.com/megacharity/1234/2025/7560001010000/1234?total=EUR:15&sig=ED25519:H9PM3BW3P8MEKB34GZ0G1F7JSNVX7B8AHXRFFMS37QZM7TXZ5MWPXTEDZZGN1QRB1AFPKNCFXJB39NJHP3BAFGCZSCXHEYPHA1YJY28&pub=K641W1CZM7DRSV184M8CPM3Z8MZRBYYJMNYMJK70FTYJHBPX21J0";
private int PERMISSIONS_REQUEST_CAMERA = 0;
private ActivityMainBinding binding;
private CodeScanner mCodeScanner;
diff --git a/donau-verificator/src/main/java/net/taler/donauverificator/Results.java b/donau-verificator/src/main/java/net/taler/donauverificator/Results.java
@@ -503,9 +503,9 @@ public class Results extends AppCompatActivity {
DonauNetworkClient client = getNetworkClient();
int donationYear = parseYearOrDefault(year);
DonationStatement statement = client.fetchDonationStatement(donationYear, donorHash);
- String statementTotal = statement.getTotal();
- String statementSignature = statement.getSignature();
- String statementPublicKey = statement.getPublicKey();
+ String statementTotal = statement.total();
+ String statementSignature = statement.signature();
+ String statementPublicKey = statement.publicKey();
if (isEmpty(statementTotal) || isEmpty(statementSignature) || isEmpty(statementPublicKey)) {
Log.e(TAG, "Donation statement response missing required fields");
return SignatureStatus.DONATION_STATEMENT_INVALID;
diff --git a/donau-verificator/src/main/java/net/taler/donauverificator/network/DonauNetworkClient.java b/donau-verificator/src/main/java/net/taler/donauverificator/network/DonauNetworkClient.java
@@ -208,28 +208,7 @@ public final class DonauNetworkClient {
return trimmed.isEmpty() ? null : trimmed;
}
- public static final class DonationStatement {
- private final String total;
- private final String signature;
- private final String publicKey;
-
- public DonationStatement(String total, String signature, String publicKey) {
- this.total = total;
- this.signature = signature;
- this.publicKey = publicKey;
- }
-
- public String getTotal() {
- return total;
- }
-
- public String getSignature() {
- return signature;
- }
-
- public String getPublicKey() {
- return publicKey;
- }
+ public record DonationStatement(String total, String signature, String publicKey) {
}
public static final class HttpStatusException extends IOException {