2026-08-30 15:55:13 +09:00
2026-08-30 15:55:13 +09:00
2026-08-27 20:32:35 +09:00
2026-08-21 12:34:28 +09:00
2026-08-17 18:32:40 +09:00
2026-08-17 18:32:40 +09:00
2026-08-17 18:32:40 +09:00
2026-08-17 18:32:40 +09:00
WIP
2026-08-22 18:45:28 +09:00
2026-08-17 18:32:40 +09:00

GajuMobile

The Android implementation of the Gajumaru client application (essentially GajuDesk-lite).

This app is primarily a signature device. Its purpose is not to be an all-in-one app for every possible Gajumaru feature. It is also not intended to integrate directly with every major app that is integrated with the Gajumaru.

Scope

GajuMobile covers the bare minimum features necessary to interact with the Gajumaru and, specifically, support functionality that can be expressed via GRIDS.

App-specific functionality (direct integration with a DEX or other type of exchange, interpretation of NFTs, transaction history tracking, etc.) are out of scope for GajuMobile.

Other applications can be linked to by GajuMobile via clickable URL components, and other applications can form Gajumaru transactions that GajuMobile can then be prompted to sign through GRIDS, whether over the LAN or WAN.

Project rules

To maintain the security posture of this project, every contributor must strictly adhere to these rules. "Industry standards" and "best practices" are generally regarded here as vectors for collective incompetence and unvetted dependency bloat. We write our own code.

Reasoning

It is impossible to tell from the code alone what is actually going to happen in the runtime, or even understand what is going to happen in the potentially limitless number of pre-compilation steps based on what files are even included in a given module, much less pin down a truly deterministic build profile if external dependencies are included. This is the primary reason for the "no foreign deps" rule.

1. No Foreign Dependencies

GajuMobile (whether on Android, iOS, or Pine) is not permitted to include any foreign dependencies. A "foreign" dependency is defined as any library originating from outside the Gajumaru project itself.

Since we cannot escape the platforms we target, we accept the baseline trust of the OS, its core UI toolkits, and primary languages (Jetpack Compose/Kotlin, SwiftUI/Swift). Any attempt to import external convenience libraries will be rejected. I don't like it, but my opinions are objectively correct, and this is the boundary of trust we accept because it is at least well-defined.

2. The Airlock Pattern & Memory Hygiene

Kotlin is a rats' nest of antisensical decisions and techniques. Kotlin is hipster junk food created by smart people for consumption by less smart people. It is a midwit's wet dream of "expressive" garbage, a language suffering an extreme case of featuritis that can't decide what paradigm it lives in, so it lives in them all while achieving none of them.

It is impossible to achieve memory hygiene in Kotlin. Therefore, all sensitive cryptographic operations -- key generation, signing, and mnemonic derivation -- must occur within AccountAirlock.java.

  • Secrets Isolation: Sensitive material may never exist as Kotlin String or ByteArray objects for longer than a single stack frame, and only when the user actually must interact with secrets directly, namely when viewing or entering their mnemonic.
  • Explicit Decontamination: All secret buffers must be explicitly zeroed using CryptoUtils.wipe() in a finally block before leaving scope. (See the gm-java project README.)
  • gm-java Primitives: Primitives providing functionality found in Hakuzaru/Erlang must be implemented in the self-contained gm-java project. This project is written to ensure that fragments of old object memory are not left scattered across the heap awaiting GC.

3. Forbidden Primitives

Do not use java.math.BigInteger for any key-related material (seeds, private keys, mnemonics). Use the Radix-2^25.5 field arithmetic implemented in gm-java. BigInteger is a leak-prone abstraction that has no place in security sensitive contexts.

4. Hardware-Enforced Security

As the security facilities required for a proper signature device did not exist prior to Android 14, that is the oldest version we support. We must exploit the strongest security facilities available:

  • Keystore Policy: The Master Key must use setUserAuthenticationRequired(true), delegating authorization to the system's secure lock.
  • Entropy: Use setRandomizedEncryptionRequired(true) to ensure the hardware module generates high-entropy IVs.
  • StrongBox: Use setIsStrongBoxBacked(true) with a graceful TEE fallback.

5. Explicit Imports

All import directives must be fully specified. import foo.bar.baz.* style wildcard imports are strictly forbidden. Wildcards hide intent, create ambiguity in the build, and are potentially dangerous in Kotlin.

Terms

Copyright (c) 2026 QPQ AG info@qpq.swiss. All rights reserved. Project: Gajumaru Core Java Libraries

This program is dual-licensed:

  1. Under the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version (AGPL-3.0-or-later). (See LICENSE file.)

  2. Under a commercial/proprietary license available directly from QPQ AG. If you wish to use this software outside the strict constraints of the AGPLv3 (e.g. within a closed-source or proprietary product), you must purchase a commercial license from QPQ AG.

Authors:

SPDX-License-Identifier: AGPL-3.0-or-later OR LicenseRef-QPQ-Commercial

S
Description
Gajumaru app for Android
Readme AGPL-3.0
12 MiB
Languages
Kotlin 86.2%
DM 8.3%
Java 2.3%
CMake 1.7%
C 1.5%