Complete System Documentation (Desktop Server + Mobile App)
| Item | Value |
|---|---|
| App Name | OpenDrop |
| Version | 1.0.0 |
| Platforms | iOS, Android, macOS, Windows, Linux |
| Uses Encryption | Yes |
| Proprietary Encryption | No |
| Exemption Claimed | EAR 740.17(b)(1) - Mass Market |
| Component | Encryption Type | Standard | Implementation |
|---|---|---|---|
| File contents (end-to-end) | ChaCha20-Poly1305 (AEAD), 256-bit key | IETF RFC 8439 | pyca/cryptography, Apple CryptoKit, Android BoringSSL, PointyCastle |
| Content-key derivation | HKDF-SHA256 | IETF RFC 5869 | pyca/cryptography, PointyCastle |
| Account-secret derivation | PBKDF2-HMAC-SHA256 (100k iterations) | IETF RFC 2898 | Python hashlib, Dart crypto |
| Request authentication | HMAC-SHA256 | IETF RFC 2104 | Platform crypto libraries |
| Network Communication | TLS 1.2/1.3 | IETF RFC 8446 | Platform SSL/TLS |
| Authentication | OAuth 2.0 | IETF RFC 6749 | Firebase Auth, Google Sign-In |
| ID Tokens | JWT | IETF RFC 7519 | Firebase ID Tokens |
| In-App Purchases | TLS | Platform Standard | RevenueCat SDK |
| Cloud Sync | HTTPS | IETF RFC 2818 | Cloudflare Workers |
| Cross-network relay | WebSocket over TLS 1.2/1.3 | IETF RFC 6455, RFC 8446 | OpenDrop WebSocket relay (Fly.io / Oracle Cloud) |
Library: firebase_auth (Flutter)
Purpose: User authentication and session management
Encryption: TLS 1.2/1.3 (platform-provided)
Standards: OAuth 2.0 (RFC 6749), JWT (RFC 7519)
Usage in Code:
auth_service.dart: Firebase Auth for user sign-inLibrary: google_sign_in (Flutter)
Purpose: OAuth 2.0 authentication with Google
Encryption: TLS via platform SDK
Standards: OAuth 2.0 (RFC 6749, RFC 6750)
Usage in Code:
auth_service.dart: GoogleSignIn class for OAuth flowLibrary: purchases_flutter
Purpose: Subscription management and purchase verification
Encryption: TLS 1.2/1.3 (SDK-provided)
Standards: HTTPS, platform billing APIs
Usage in Code:
subscription_service.dart: Subscription status checkingmain.dart: SDK initializationconfig.dart: API key configurationLibrary: dio (Dart)
Purpose: API calls to OpenDrop desktop server
Encryption: TLS via platform SSL/TLS stack
Standards: HTTPS (RFC 2818)
Usage in Code:
api_service.dart: All server communicationfile_uploader.dart: Chunked file uploadsLibrary: mobile_scanner
Purpose: Scan QR codes for connection setup
Encryption: None (camera input only)
Note: QR scanning itself does not use encryption. The scanned data (connection URL and secret) is transmitted over HTTPS.
Library: cryptography / cryptography_flutter (Apple CryptoKit on iOS, Android BoringSSL), PointyCastle fallback
Purpose: End-to-end encryption of file contents on every transfer path (LAN, peer-to-peer, relay, BLE)
Encryption: ChaCha20-Poly1305 IETF AEAD (256-bit key); HKDF-SHA256 key derivation; HMAC-SHA256 request signing
Standards: ChaCha20-Poly1305 (RFC 8439), HKDF (RFC 5869), HMAC (RFC 2104)
Usage in Code:
crypto_utils.dart, e2ee_wire.dart: AEAD encrypt/decrypt, content-key derivation, request signing| File | Component | Encryption Used |
|---|---|---|
main.dart |
Firebase init, RevenueCat init | TLS (platform) |
auth_service.dart |
Firebase Auth, Google Sign-In | OAuth 2.0, TLS |
subscription_service.dart |
RevenueCat purchases | TLS (SDK) |
api_service.dart |
Server API calls | HTTPS/TLS |
file_uploader.dart |
File upload | ChaCha20-Poly1305 (E2EE) over TLS |
crypto_utils.dart, e2ee_wire.dart |
End-to-end file encryption | ChaCha20-Poly1305, HKDF-SHA256, HMAC-SHA256 |
firebase_options.dart |
Firebase config | N/A (config only) |
qr_scan_page.dart |
QR scanning | None |
Library: requests (Python)
Purpose: Sync data to Cloudflare Worker
Encryption: TLS 1.2/1.3 via OS SSL stack
Standards: HTTPS (RFC 2818)
Usage in Code:
cloud_sync.py: sync_to_cloud(), _heartbeat_loop()Library: google-auth-oauthlib
Purpose: Google Sign-In for desktop
Encryption: TLS via requests library
Standards: OAuth 2.0 (RFC 6749, RFC 6750)
Usage in Code:
auth.py: Credential management and token refreshComponent: Self-hosted WebSocket relay (Fly.io primary for Pro, Oracle Cloud for free tier and Pro failover)
Purpose: Forwards end-to-end-encrypted bytes between devices on different networks
Encryption: WebSocket over TLS 1.2/1.3 (transport); ChaCha20-Poly1305 IETF AEAD (payload, E2EE)
Standards: WebSocket (RFC 6455), TLS 1.2/1.3 (RFC 8446), ChaCha20-Poly1305 (RFC 8439)
Usage in Code:
relay_client.py: outbound WebSocket relay session (replaced the former tunnel.py cloudflared transport), with automatic Fly.io→Oracle Cloud failoverLibrary: cryptography (pyca / OpenSSL backend)
Purpose: End-to-end encryption of file contents on every transfer path (LAN, peer-to-peer, relay)
Encryption: ChaCha20-Poly1305 IETF AEAD (256-bit key); HKDF-SHA256 key derivation; PBKDF2-HMAC-SHA256 account-secret derivation; HMAC-SHA256 request signing
Standards: ChaCha20-Poly1305 (RFC 8439), HKDF (RFC 5869), PBKDF2 (RFC 2898), HMAC (RFC 2104)
Usage in Code:
crypto/aead.py, crypto/wire.py: AEAD encrypt/decrypt and framed streamingserver/validation.py: HMAC-SHA256 request signing (5-minute timestamp window)Implementation: Server-generated tokens
Purpose: Authenticated session continuity
Transmission: HTTPS headers
Usage in Code:
middleware.py: Session validationhealth.py: Session creation| File | Component | Encryption Used |
|---|---|---|
cloud_sync.py |
Worker sync, heartbeat | HTTPS/TLS |
relay_client.py |
OpenDrop WebSocket relay (E2EE payload) | ChaCha20-Poly1305 over TLS 1.2/1.3 |
middleware.py |
Session validation | None (token comparison) |
health.py |
Session creation | None (token generation) |
paths.py |
Token file storage | None (plaintext JSON) |
| SDK | Provider | Encryption | Documentation |
|---|---|---|---|
| Firebase | TLS 1.2+ | Firebase Security | |
| RevenueCat | RevenueCat | TLS 1.2+ | RevenueCat Security |
| Google Sign-In | OAuth 2.0/TLS | Google Identity | |
| Cloudflare | Cloudflare | TLS 1.2/1.3 | Cloudflare Security |
| Dio | pub.dev | Platform TLS | Uses system certificates |
All third-party SDKs use standard encryption provided by their respective platforms and comply with international encryption standards.
Q1: Does your app use encryption?
Yes
Q2: Does your app qualify for any exemptions provided in Category 5, Part 2 of the EAR?
Yes - Mass market exemption under EAR 740.17(b)(1)
Q3: Does your app implement any proprietary or non-standard cryptographic algorithms?
No - All encryption uses industry-standard algorithms: ChaCha20-Poly1305 (RFC 8439), HKDF-SHA256 (RFC 5869), HMAC-SHA256 (RFC 2104), PBKDF2-HMAC-SHA256 (RFC 2898), RSA-2048/SHA-256, and TLS 1.2/1.3
Q4: Does your app only use encryption provided by the operating system?
No - The app uses additional standard third-party libraries, but all implement standard algorithms
Q5: Is your app available without restriction?
Yes - Available to general public
Q6: Is the encryption user-configurable?
No - Users cannot modify encryption settings
Q7: Is your app designed for government use?
No - Consumer file sharing application
| Requirement | Status | Evidence |
|---|---|---|
| Uses standard encryption | ✅ Met | TLS, OAuth 2.0, JWT only |
| Available to general public | ✅ Met | App Store / Play Store distribution |
| No government-specific features | ✅ Met | General file sharing utility |
| Encryption not user-modifiable | ✅ Met | No encryption settings exposed |
| Not for military/intelligence | ✅ Met | Consumer application |
| Mass market distribution | ✅ Met | Available worldwide |
When submitting your app to App Store Connect, you will be asked about export compliance. Use these answers:
"Does your app use encryption?"
Select: Yes
"Does your app qualify for any of the exemptions provided in Category 5, Part 2 of the U.S. Export Administration Regulations?"
Select: Yes
"Does your app contain, use, or access third-party encryption?"
Select: Yes
"Does your app implement or use cryptography that is proprietary or not accepted as standard by international standard bodies (IEEE, IETF, ITU, etc.)?"
Select: No
"Is your app going to be available on the French App Store?"
Select: Yes (app qualifies for all territories)
If required, use BIS classification:
OpenDrop version 1.0.0 uses encryption exclusively for:
- End-to-end encryption of file contents via ChaCha20-Poly1305 IETF AEAD (RFC 8439) with HKDF-SHA256-derived keys (RFC 5869)
- Secure network communication via HTTPS using standard TLS 1.2/1.3 protocols
- User authentication via OAuth 2.0 (Google Sign-In) and Firebase Authentication
- In-app purchase verification via RevenueCat SDK using platform billing APIs
- Secure transport via WebSocket over standard TLS to our own relay infrastructure
- Request authentication via HMAC-SHA256 signing (RFC 2104)
- JWT token handling for session management using standard RFC 7519 format
No proprietary encryption algorithms are implemented. All cryptographic functionality is provided by:
- Standard open-source crypto libraries (pyca/cryptography with OpenSSL, Apple CryptoKit, Android BoringSSL, PointyCastle)
- Apple's Security framework and App Transport Security
- Firebase SDK (Google)
- RevenueCat SDK
- Platform-provided TLS/SSL implementations
This application qualifies for the mass market encryption exemption under U.S. Export Administration Regulations section 740.17(b)(1).
OpenDrop uses encryption for secure data transmission only. All encryption is provided by:
- Android platform TLS/SSL
- Firebase Authentication SDK
- RevenueCat Purchases SDK
- Standard HTTPS for API communication
No custom or proprietary encryption algorithms are used.
┌─────────────────────────────────────────────────────────────────┐ │ OPENDROP SYSTEM │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────┐ HTTPS/TLS ┌────────────┐ │ │ │ Mobile App │◄──────────────────────────►│ Firebase │ │ │ │ (Flutter) │ OAuth 2.0 │ Auth │ │ │ └────────┬────────┘ └────────────┘ │ │ │ │ │ │ HTTPS/TLS │ │ │ │ │ ▼ │ │ ┌─────────────────┐ HTTPS/TLS ┌────────────┐ │ │ │ RevenueCat │◄──────────────────────────►│ Store │ │ │ │ SDK │ │ APIs │ │ │ └─────────────────┘ └────────────┘ │ │ │ │ ┌─────────────────┐ WebSocket over TLS ┌────────────┐ │ │ │ Desktop Server │◄──────────────────────────►│ OpenDrop │ │ │ │ (Python) │ (relay, E2EE) │ Relay │ │ │ └────────┬────────┘ └────────────┘ │ │ │ │ │ │ HTTPS/TLS │ │ ▼ │ │ ┌─────────────────┐ ┌────────────┐ │ │ │ Cloudflare │◄──────────────────────────►│ Mobile │ │ │ │ Worker │ HTTPS/TLS │ App │ │ │ └─────────────────┘ └────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ ENCRYPTION STANDARDS │ │ │ │ • ChaCha20-Poly1305 E2EE (IETF RFC 8439) │ │ │ │ • HKDF-SHA256 (IETF RFC 5869) │ │ │ │ • HMAC-SHA256 (IETF RFC 2104) │ │ │ │ • TLS 1.2/1.3 (IETF RFC 8446) │ │ │ │ • OAuth 2.0 (IETF RFC 6749) │ │ │ │ • JWT (IETF RFC 7519) │ │ │ │ • HTTPS (IETF RFC 2818) │ │ │ │ • WebSocket (RFC 6455) │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ All connections use standard encryption - NO proprietary algorithms
| Field | Value |
|---|---|
| Document Version | 2.1 |
| Created | January 2026 |
| App Version | 1.0.0 |
| Author | NFDGames |
| Covers | Desktop Server + Mobile App |
| File | Encryption Relevance |
|---|---|
main.dart | Firebase & RevenueCat initialization |
auth_service.dart | OAuth 2.0 flows, Firebase Auth |
subscription_service.dart | RevenueCat purchase verification |
api_service.dart | HTTPS API communication |
file_uploader.dart | HTTPS file transfer |
config.dart | API keys (no encryption code) |
firebase_options.dart | Firebase config (no encryption code) |
qr_scan_page.dart | No encryption |
connection_status.dart | No encryption (enum only) |
main_screen.dart | No encryption (UI only) |
open_drop_app.dart | No encryption (UI only) |
files_tab.dart | Uses ApiService (HTTPS) |
upload_tab.dart | Uses ApiService (HTTPS) |
shared_folders_tab.dart | Uses ApiService (HTTPS) |
recently_deleted_screen.dart | Uses ApiService (HTTPS) |
auth_screen.dart | Uses AuthService (OAuth) |
file_action_menu.dart | No encryption (UI only) |
| File | Encryption Relevance |
|---|---|
cloud_sync.py | HTTPS requests |
relay_client.py | OpenDrop WebSocket relay (E2EE over TLS) |
auth.py | OAuth 2.0 token management |
middleware.py | Session token validation |
health.py | Session token creation |
app.py | No encryption (routing) |
config.py | No encryption (config) |
paths.py | No encryption (file paths) |
files.py | No encryption (file ops) |
folders.py | No encryption (folder ops) |
trash.py | No encryption (trash ops) |
settings.py | No encryption (settings) |
utils.py | No encryption (utilities) |
validation.py | No encryption (validation) |
gui_app.py | No encryption (UI) |
gui_styles.py | No encryption (UI) |
updater.py | HTTPS for update checks |
Before submission, verify: