Smoke
Complexity is beautiful.
Smoked with love by textbrowser.
Welcome to Smoke!
Smoke is a completed open source communications project. The purpose of Smoke is to introduce and investigate the Echo protocol on mobile technologies.
Some of the characteristics of Smoke are summarized below.
- Aliases. Preserve your contacts.
- Almost zero-dependency software.
- Application lock.
- Argon2id and PBKDF2 key-derivation functions.
- Automatic, oscillatory public-key exchange protocol, via SipHash.
- BSD 3-clause license.
- Completed.
- Content is recorded via authenticated encryption.
- Decentralized. TCP, and UDP multicast and unicast.
- Does not require Internet connectivity.
- Does not require registration. Telephone numbers are not required.
- Encrypted communications.
- Eventful tasks. Limited polling.
- F-Droid.
- Fiasco forward secrecy.
- Future-proof software.
- Introduces Cryptographic Discovery. Cryptographic Discovery is a practical protocol which creates coordinated data paths.
- Juggling Juggernaut Protocol!
- Manufactured tool tips!
- McEliece Fujisaka and Pointcheval.
- Message structures do not explicitly expose contents. Header-less protocols! Some messages do include type information.
- Mobile servers via SmokeStack.
- Obfuscation of resident secret keys.
- Optional foreground services.
- Optional silence over the wires.
- Original implementation of SipHash.
- Ozone destinations: private and public repositories.
- Post offices for messages of the past.
- Private servers.
- Public and private public-key servers.
- Rainbow digital signature scheme.
- Reliable distribution of archived messages.
- Reliable distribution of deliverable text messages.
- SPHINCS digital signature scheme.
- SSL/TLS through SmokeStack.
- Semi-compatible with Spot-On via Fire.
- Share files with TCP utilities such as Netcat.
- SipHash-128.
- Smoke and mirrors.
- Software congestion control.
- Software manual included.
- Steam, reliable file sharing. TCP over the Echo!
- Steamrolling, or, real-time broadcasting of inbound Steams to fellow participants.
- Super McEliece: m = 13, t = 118.
Release Notes
2024.06.25
- GitHub ticket #48. The oid variable in Fire::deleteFire() may not be defined and referencing a tarnished variable will terminate Smoke.
2024.01.05
- Cancel the future.
- Minimum SDK of 25.
- Partially-blocked socket reads.
- Permanent darkness.
2023.12.25
- Removed Makefile targets as they are difficult to support:
launch-emulator-1, launch-emulator-2, load-apk-release, release.
- Removed import statements.
- Removed redundant conversions.
- Replaced StringBuilder with String in some instances.
- String comparisons and equalsIgnoreCase().
2023.05.10
- Android API 28. Older devices may not be functional.
- BouncyCastle's Rainbow implementation in version 1.73 is new. Legacy Rainbow is compromised and deprecated. A new implementation will not be included.
- Current documentation.
- Final APK release. Future releases will be source-only. Future-future releases may include APKs.
- Free server has been discontinued.
- McEliece is not functional in BouncyCastle version 1.72 and newer. A new implementation is required. This will not be addressed.
- New Rainbow parameters. Previous parameters cannot be tolerated.
2023.04.05
- Corrected state of Purge Fiasco Keys context menu item in Member activity.
2023.03.30
- Forceful termination of TCP sockets on severe errors.
2023.03.15
- Emergency initialization of singletons, if possible.
2023.03.11
- New Steams will be initially unlocked.
- Toggle Lock Status context-menu item in Steam activity.
2023.03.10
- Steam is now functional on Android 10 and 13. Do not interpret an integer as a Base64.
2023.01.10
- Corrected state of Delete Fiasco Keys context menu item.
2023.01.07
- Corrected error text.
- Do not disable generate widgets during generation functions. Progress widgets are sufficient.
- Enable Participants context-menu items if data are available: Delete Fiasco Keys, Delete Public Keys.
- Reverted to Bouncy Castle 1.71 as key generation fails in 1.72.
2023.01.05
- Bouncy Castle 1.72.
- Happy New Year!
- Retain Selection State in Member activity. Session only.
2022.11.15
- Bouncy Castle 1.71.
- Optional message-read responses.
- Steam unlocking.
2022.05.28
- Documentation.
- Larger touch areas.
- New public server.
2022.04.10
- A neighbor removed from Settings will be deleted in a separate task.
- Avoid accessing encrypted database content if not authenticated: publishing keys, publishing status, retrieving messages.
- Corrected RSA key size for Steam: 3072, not 3096.
- New parameters for Rainbow. Please read https://eprint.iacr.org/2022/214.
- Proper termination of Smoke service.
- Terminate connections on TLS handshake errors.
2021.12.25
- Enable SO_LINGER on TCP sockets.
- Fewer Context objects.
- Monospace fonts.
2021.12.17
- Bouncy Castle 1.70.
- Notify Member Chat of new Steams.
2021.10.05
- Concurrent collections.
- Introduced new database table index for Member Chat.
- Lock safety.
- Rainbow digital signature scheme.
- Release Ringtone resources.
- Sphincs digital signature scheme.
- Steam locking, or, prevent the replacement of completed transfers.
- Write identities in silent mode.
2021.07.25
- Allow removal of Fiasco keys from Member activity.
- Concurrent collections.
- Decreased lock regions.
- Limit execSQL(): cannot be delete / insert / select / update.
- Resume All Steams context-menu option.
- Silence over the wires. Optional.
- Steam percents.
- Wrap switches.
2021.07.07
- Avoid extending received Steam names.
- Bouncy Castle 1.69.
- Improved SQLite selection of deliverable messages.
- JuggerLi, or, the Juggernaut protocol via xor(public keys).
- Prevent duplicate offset acknowledgments in Steam.
- Steamrolling, or, sharing complete and incomplete Steams.
2021.03.20
- Ignore duplicate calling keys.
- Message details in Member Chat activity.
- Tulip server discontinued.
2021.02.27
- Corrected raw SQLite queries.
- Decreased awaitTermination() values. Method may stall Smoke.
- ETags for bypassing congestion.
- Reliable distribution of deliverable text messages. Requires reinstall as new database fields have been introduced.
- Replaced checkboxes with switches.
- Tool tips.
- Warn if the time server cannot be queried.
2021.02.10
- Fewer locks.
- Improved process termination.
- New server tulip-ipv4.tilaa.cloud.
2021.01.30
- Retain Fire messages.
- Weak references.
2021.01.20
- Corrected reset of local authentication key.
- Obfuscate local authentication and encryption keys.
- Prepare Steam key container properly.
2021.01.10
- Avoid creating tasks for completed Steams.
- Free Steam resources.
- Sort sub-title IP address.
2020.12.25
- Bouncy Castle 1.68.
- Corrected comparisons of byte arrays.
- Disable context menus if public keys are not available.
- Estimate the number of physical cores for Argon2id. Smoke must be reinstalled.
- Future-proofing Smoke.
- Guard String.indexOf().
- Hide ephemeral key types for Other Steam destinations.
2020.12.15
- Future-proofing cryptographic primitives.
- New Steam database field. Please reinstall Smoke.
- Permanent RSA keys are now 4096 bits.
- Steam keys: McEliece, RSA.
- Super McEliece (m = 13, t = 118).
2020.11.15
- Bouncy Castle 1.67.
- Disable Chat:Send if there is at least one selected participant without a session key pair.
- Efficient ArrayList::remove(). Remove from the end of the array.
- Full, reliable, Steam! File sharing.
- Improved TLS handshake-completed state.
- Issue Settings::prepareListeners() shortly after the Settings activity has been instantiated.
- Monitor connection activity; decreased polling.
- Notify the user of incorrect device time via https://worldtimeapi.org/api/timezone/Etc/UTC.txt. Optional.
- Prepare initial private keys during a public-key exchange.
- Provide message-read responses to SmokeStack instances.
- Random identities need not be recorded to databases.
- Removed SecureRandom.getInstance("SHA1PRNG").
- Removed verbose threads and replaced with events.
- Request Ozone messages shortly after a TCP connection has been established or a TLS session has been established.
- SipHash-128.
- Write local identity immediately upon completion of TLS handshake.
2020.04.07
- Artificial random-access Steam files.
- New Scripts directory.
- Retain Steam rates.
2020.04.05
- Clear Smokescreen password.
- Static variables.
2020.04.04
- Bouncy Castle 1.65!
- Denote Juggernaut protocol failures and successes.
- Kernel broadcast receiver for immediate delivery of internal instructions.
- McEliece Pointcheval conversion. Smoke must be reinstalled!
- Non-TLS devices.
- Partial Steam.
- Passthrough devices.
- Smokescreen, or, application lock.
2020.01.01
- Happy New Year!
- New Argon2id parameters.
2019.12.30
- Argon2id key-derivation function.
2019.12.10
- Corrected the private server authentication protocol.
2019.11.25
- Bouncy Castle version 1.64.
- Corrected primary key in participants table. Please remove Smoke.
- Corrected widget states during initialization.
2019.09.30
- Bouncy Castle version 1.63.
- Exit option. May be incomplete on some devices.
- Guard socket buffers.
- New icons.
- Save attachments to Downloads (Internal Storage -> Download).
- Settings -> View Details functional on Android 9.
2019.04.14
- JuggerKnot.
- Properly create strings from bytes. Ozones and participants must be redefined.
2019.04.04
- Allow removal of participant public keys.
- Close Java streams.
- Default socket buffer sizes.
- Juggernaut Protocol.
- Minor Fire layout changes.
- Release resources on onPause(), onStop().
- Removed deepCopy().
- Smoke Alias. Change your credentials while preserving your relationships.
2019.03.03
- Allow removal of specific messages in MemberChat.
- Decreased maximum buffer size from 32 MiB to 8 MiB.
- Prefer delete() over setLength(0) on buffers.
- Recycle bitmaps.
2019.02.25
- Bouncy Castle version 1.61.
- Material icons.
- Optional foreground service.
2019.02.02
- Array lengths may not be negative.
- Automatic removal of incorrect network data. Smoke and SmokeStack.
- Corrected conditional in UdpMulticastNeighbor::send(). SmokeStack.
- Disable Nagle's algorithm.
- Energy and iterations.
- Optional initialization of Ozone during neighbor definition.
- Orderly shutdown of schedules.
- Pause schedules, notify if necessary.
- Replaced Spongy Castle with Bouncy Castle. Please replace existing listeners. SmokeStack.
- SNAP!
- Smaller lock regions.
- SmokeStack confirmation for identity sharing of personal identity.
- StringBuilder over StringBuffer if possible.
2018.10.10
- Compute SHA-512 display digest of PEM(certificate).
- Inspect length in String::substring().
- New server (tulip-ipv4.tilaa.cloud).
2018.09.01
- Allow resending of messages.
- Deleting Fiasco keys lacked proper confirmation.
- Denote messages which have been read by the recipient.
- Denote messages which have been sent.
- Depict Smoke failures.
- Lock SipHash::hmac().
- New participants_messages database fields. Requires new installation.
2018.08.19
- Allow generation of only PK material in Settings.
- Allow new participant names via context menus; Settings::Participants.
- Automatically set the Ozone to the Smoke ID on new installations.
- Blocking socket reads.
- Bouncy Castle at version 1.60.
- Calling via ephemeral McEliece; MemberChat only.
- Clear internal messaging log on Chat::Clear.
- Corrected faulty widget listeners in Fire.
- Corrected slight time differences between time stamps in messages destined for SmokeStacks and messages destined for participants.
- Increased key-publishing period from 15 seconds to 45 seconds. Also removed self-publishing.
- Material Design-compliant color selections.
- McEliece parameters m = 12, t = 68. Compatibility with m = 11, t = 50 is preserved.
- Messages in MemberChat will not be duplicated in the Chat activity.
- New Fiasco Keys column in Settings::Participants.
- New chat-message format. Incompatible with previous releases.
- Pause threads when possible.
- Periodically request Ozone messages.
- Private servers through SmokeStack.
- Removed the superfluous name field from the participants database table.
- Replaced complex if-statements with switch statements.
- Several member variables in the Neighbor class were defined as static. Corrected.
- Share capabilities and identities shortly after the SSL/TLS handshake has completed on TCP sockets.
- Shared keys without signatures are now accepted and properly depicted in Settings.
- Sign encryption and signature public keys as pairs.
- Singular member pages. Single image attachments included.
- Uniquely-persistent Fire identities.
- Viewing of member details now available via Settings::Participants context menu.
2018.04.04
- LocalBroadcastManager instances.
- Single ID per Fire.
2018.03.20
- Congestion-control improvements.
- Corrected nested locks (isNetworkConnected()).
- Insert-or-throw SQLite database queries.
- The ProgressDialog class has been deprecated. ProgressBars have now been added.
- The replace method may not be available in a hash table; put().
2018.03.03
- Attempt socket connections regardless of WiFi availability. Insight.
- Automatically import rosemary-ipv4.tilaa.cloud:4710 on new installations.
- Corrected local echo behavior.
- Echo Fire, if possible!
- Fire Digest Key and Salt fields may not be empty. Corrected.
- Host translation must be performed before every socket connection attempt.
- Large-area congestion-control mutex.
- Partition messages over UDP links into 576-byte datagrams.
- Provide the HMAC algorithm during identity distribution.
- The Call widget should only be enabled if a network is present.
- Wonderful documentation.
2018.02.10
- Allow empty Fire participant names.
- Allow purging of neighbor queues.
- Automatic, oscillatory EPKS.
- Avoid non-essential operations if network channels are not available.
- Depict corrupted database entries.
- Enabled Nagle's algorithm.
- Introduced McEliece-Fujisaka via Bouncy Castle. Cross-communications supported.
- Minimum password length set to one character.
- New Fire key generation. Destination tags are required for SmokeStack.
- Participant name changes should be reflected in the Chat activity.
- Trim Channel, Digest Key, and Salt values on Fire.
2018.01.05
- Fire, or, group communications. Compatible with Spot-On.
- Increased lane widths to 8 MiB.
2017.08.19
- Set a non-zero SO_TIMEOUT as some devices do not unblock socket reads after sockets are closed.
2017.07.20
- AndroidManifest.xml was missing WakeLock permissions.
- Do not attempt to send duplicate data.
- Do not specify timeouts in socket reads as separate threads are responsible for socket reads.
- Removed all Thread.sleep() instances.
- Replaced StringBuilder Neighbor member with StringBuffer. StringBuffer is thread-safe.
- Signed release.
- WiFi lock.
2017.07.16
- Less activity on disconnected neighbors.
2017.07.09
- Detect existing key pairs in writeParticipant().
- Smaller database transaction areas.
2017.07.07
- Do not automatically purge the temporary identity for offline message retrieval unless some inactive period has elapsed.
- Issue SQLiteDatabase.update() whenever a participant is added. This will allow for replacing of participant names without removal of existing data.
- SmokeStack as a private public key repository.
2017.07.04