Secretary

Apps/secrets
Login

Apps/secrets

Secretary Secrets (Android)

Android-Client des Passwort-/Schlüssel-Tresors auf dem secretary-server (CalDAV). Jeder Eintrag ist eine .ics-Datei (VJOURNAL) in einer Gruppen-Collection unter dem neuen top-level secrets/-Root; Gruppen sind Collections. Maßgeblich ist die SRS in secretary-contract/secrets/SRS.md (1.0.0, DRAFT).

What it does

Changelog

Every released version: Apps/secrets/changelog

Screenshots

Screenshots are on their way - see the Apps section of the wiki.

Verzeichnisstruktur

secretary-secrets-android/
├── build.gradle.kts              # Root-Build
├── settings.gradle.kts
├── gradle.properties
├── CONTEXT.md
├── gradle/wrapper/
└── app/
    ├── build.gradle.kts
    ├── proguard-rules.pro
    └── src/
        ├── main/
        │   ├── AndroidManifest.xml
        │   └── java/org/beowulf/secretary/secrets/
        │       ├── data/
        │       │   ├── SecretsCipher.kt    # ss1:-Envelope (AES-256-GCM)
        │       │   ├── SecretAttachment.kt # Anhänge (sha256, inline/extern)
        │       │   ├── SecretEntry.kt      # kanonisches Eintragsmodell (Felder)
        │       │   ├── SecretGroup.kt      # Gruppenmodell + group.ics-Codec
        │       │   ├── SecretMeta.kt       # Meta-/CustomIcons-/DeletedObjects
        │       │   ├── RecoveryKey.kt      # recovery-key.json (scrypt-Wrap, FR-S-204)
        │       │   ├── DeviceKeyWrap.kt    # dk1:-Device-Wrap + device-key.json (FR-S-202)
        │       │   ├── DeviceKeyStore.kt   # Android-Keystore MK-Wrap (CLI-SEC-01)
        │       │   ├── VaultKeyState.kt    # MK nur im RAM, Lock wischt (FR-S-203)
        │       │   ├── SecretVault.kt      # In-Memory-Tresor (CRUD, §6.2)
        │       │   ├── SecretVJournal.kt   # VJOURNAL-Codec (X-SECRETS-FIELD)
        │       │   ├── SecretHistory.kt    # History-Blob (kanonisches JSON, ss1:)
        │       │   ├── SecretMerge.kt      # Drei-Wege-Merge (Feld-/Tag-/History)
        │       │   ├── SecretWire.kt       # secrets/-Pfadmodell + Klassifikation (§3.3)
        │       │   ├── SecretOfflineStore.kt # Offline-Cache + Pending-Queue (org.json)
        │       │   ├── SecretsRemote.kt    # SecretsRemote + CaldavSecretsRemote
        │       │   ├── SecretsRepository.kt # DAV-Konto (AccountResolver, /secrets/)
        │       │   ├── SecretSync.kt       # Pull/Push/Full-Sync über CalDAV
        │       │   ├── SyncRetry.kt # Backoff auf transiente Fehler (FR-S-230)
        │       │   └── SecretSearch.kt     # Suche über entsiegelte Felder (M3)
        │       └── kdbx/
        │           ├── KdbxIo.kt           # LE-Primitives, Reader/Writer
        │           ├── KdbxUuid.kt         # UUID-Klasse
        │           ├── KdbxKeys.kt         # Composite/Keys, AES-KDF, Argon2d/id, HMAC
        │           ├── KdbxKeyFile.kt      # KeePass-Keyfile (Xml v1/v2, Bin/Hex/Hash, FR-K-09)
        │           ├── KdbxOuterHeader.kt  # Signatur, Version, Felder, End-of-Header
        │           ├── KdbxVariantDictionary.kt # VariantMap v0x0100 (FR-K-06)
        │           ├── KdbxCipherKit.kt    # AES-256-CBC/ChaCha20, gzip, inner Stream
        │           ├── KdbxHmacBlocks.kt   # HMAC-Block-Stream (FR-K-07)
        │           ├── KdbxInnerHeader.kt  # Stream-ID/Key, Binär-Pool
        │           ├── KdbxXml.kt          # KDBX-XML-Leser/-Schreiber
│           ├── KdbxModel.kt        # K0-K1-Objektmodell (Gruppen/Entries)
│           ├── KdbxMapping.kt      # KDBX ⇔ Tresor-Brücke (Import/Export, §4.6/4.7)
│           ├── KdbxContainer.kt    # open/save (FR-K-01..12, FR-K-31)
        │           ├── KdbxIds.kt          # Cipher-/KDF-UUIDs, KdbxKdfConfig
        │           ├── KdbxTime.kt         # KDBX4-Datum (Base64-Int64)
        │           └── KdbxErrors.kt       # Corrupt/Integrity/Unsupported
        │       └── app/
        │           ├── MainActivity.kt        # Compose-Host
        │           ├── VaultViewModel.kt      # MK-Lebenszyklus + Import/Export/Offline
        │           └── ui/SecretsApp.kt       # Material3: Home/Import/Export (SAF)
        │           └── ui/Browse.kt           # Durchsuchen + Eintrag-Edit
        └── test/
            └── java/org/beowulf/secretary/secrets/
                └── data/
│                   ├── SecretsCipherTest.kt
                    ├── RecoveryKeyTest.kt
                    ├── RecoveryKeySetupTest.kt  # Recovery-Wiring + scrypt-Parameter
                    ├── SecretAttachmentTest.kt
                    ├── SecretGroupTest.kt
                    ├── SecretMetaTest.kt
                    ├── SecretVaultTest.kt
                    ├── SecretVJournalTest.kt
                    ├── SecretHistoryTest.kt
                    ├── SecretMergeTest.kt
                    ├── DeviceKeyCipherTest.kt
                    ├── DeviceKeyWrapTest.kt
                    ├── DeviceKeyStoreKeystoreTest.kt # Keystore-Fallback (M1-Audit v54)
                    ├── KdbxMalformedInputTest.kt # Import-Robustheit (M4 v55)
                    ├── CrashReporterRetentionTest.kt # Absturzreport-Deckel (M5 v56)
                    ├── DeviceKeyEnvelopeTest.kt
                    ├── VaultKeyStateTest.kt
                    ├── SecretWireTest.kt
                    ├── SecretOfflineStoreTest.kt
                    ├── SecretSyncTest.kt
                    ├── SyncRetryTest.kt    # Backoff/Statusklassifikation
                    └── SecretSearchTest.kt  # Suche/Ranking/Snippet (M3)
                └── kdbx/
                    ├── KdbxPrimitivesTest.kt   # VariantMap/Zeit/UUID
                    ├── KdbxKeysTest.kt         # Key-Ableitung inkl. Vektoren
                    ├── KdbxKeyFileTest.kt      # Keyfiles gg. KeePassXC-Vektoren
                    ├── KdbxCryptoTest.kt       # Argon2d/id-Vektoren (RFC 9106)
                    ├── KdbxCipherKitTest.kt    # Cipher/gzip/inner Stream
                    ├── KdbxHmacBlocksTest.kt   # Block-Stream-Integrität
                    ├── KdbxContainerTest.kt    # open/save-Roundtrips (alle KDFs)
                    ├── KeePassXCOpenTest.kt    # echte KeePassXC-Datei öffnen
                    ├── KeePassXCOpenKeePassXCInteropTest.kt # save -> keepassxc-cli (FR-K-30)
                    ├── KdbxMappingTest.kt       # Import/Export-Brücke (FR-K-60..75/90)
                    └── KdbxMappingMergeTest.kt   # Import-Merge in Tresor (FR-K-63/67/76)

Befehle

Voraussetzungen: JDK 21, Android-SDK (Platform 37, Build-Tools 34) und Gradle 9.x. Im Repository liegt bewusst kein Gradle-Wrapper -- entweder Android Studio nutzen (bringt sein Gradle mit) oder Gradle 9 selbst installieren; die Beispiele unten rufen deshalb gradle direkt.

export ANDROID_HOME="$HOME/Android/Sdk"   # bzw. sdk.dir=... in local.properties

gradle :secrets:assembleDebug         # Debug-APK
gradle :secrets:testDebugUnitTest     # JVM-Tests
gradle :secrets:compileDebugKotlin    # Kompilierbarkeit

Konzepte