287 lines
11 KiB
Plaintext
287 lines
11 KiB
Plaintext
/*! @file
|
|
|
|
@id $Id$
|
|
*/
|
|
// 1 2 3 4 5 6 7 8
|
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
|
|
|
/** @mainpage SafeChat
|
|
|
|
SafeChat runs on: https://safechat.ch
|
|
|
|
SafeChat is a chat program designed to protect your privacy. It's
|
|
open, cool, easy, open source and free.
|
|
|
|
See @ref features for more goodies, and @ref why for a rationale.
|
|
|
|
Implementation Details, see @ref security, @ref api, @ref
|
|
protocol, @ref database, @ref design */
|
|
|
|
/** @page features Features and Benefits
|
|
|
|
Best features of SafeChat:
|
|
|
|
-# extremely easy to use
|
|
-# zero installation
|
|
-# simple registration, within seconds
|
|
-# web 2.0 - works in any modern browser
|
|
-# user does not have to care about keys, security, encryption
|
|
-# Android App available (later also for other phones)
|
|
-# all cool features
|
|
-# full privacy:
|
|
-# pseudonym accounts, no phone number, no email, no private data required
|
|
-# still allows to identify yourself to your chat partners
|
|
-# all private data is stored on your computer
|
|
-# you decide who may see what
|
|
-# safechat.ch knows nothing about you
|
|
-# send images, videos and any other file attachments
|
|
-# make fotos on the handy and send them directly
|
|
-# build groups
|
|
-# no need to be online, receive messages on next login
|
|
-# or, when online, open a direct 1:1 connection line
|
|
-# direct audio and video chat
|
|
-# distributed user directory
|
|
-# chat to mail, mail to chat gateways
|
|
-# send chat invitation links to friends
|
|
-# absolutely secure
|
|
-# tap-proof
|
|
-# server can be untrusted
|
|
-# thin server, rich client
|
|
-# all encryption is done in the client
|
|
-# server only stores minimal data
|
|
-# no access to plain data, not even through server confiscation
|
|
-# double secured internet transport
|
|
-# messages are encrypted for the recipients only
|
|
-# server connection is SSL secured in addition
|
|
-# private data fully in the user's hand
|
|
-# password is stored in the user's brain only
|
|
-# private key is password encrypted
|
|
-# private key is stored in the user's local machine only
|
|
-# two factor security, access needs two tokens
|
|
-# the password in the user's brain
|
|
-# the private key in the user's browser storage
|
|
-# fully open source
|
|
-# security concept and implementatino can be reviewed */
|
|
|
|
/** @page why Why I Created SafeChat
|
|
|
|
The Swiss parliament has decided to increase the power of police
|
|
(BÜPF: Bundesgesetz zur Überwachung des Post- und
|
|
Fernmeldeverkehrs) and secret service (NDG:
|
|
Nachrichtendienstgesetz). This increases global enforced data
|
|
preservation without any suspicion. This even allows the police to
|
|
run a trojan in computers of suspicious persons.
|
|
|
|
That was the point, when I started to think about secure
|
|
communication that defeats these attacks against our
|
|
privacy. Noone should be able to read what's not for his eyes,
|
|
even if he controls the server. There should be no metadata,
|
|
i.e. no one should know, who is communicating to each other.
|
|
|
|
There are secure means of communication, i.e. Jabber/OTR and
|
|
PGP-Mail (but with unprotected metadata). But these are too
|
|
complicated for the avarage user. He has to take care about keys
|
|
and their distribution. In some chat programs, there is no offline
|
|
message store, so you can only send a message, if the receiver is
|
|
online. Some chat programs require to identify you, they ask your
|
|
phone number and some even steal your address book
|
|
(i.e. WhatsApp). Not here! Use any pseudonym. No special knowledge
|
|
needed. User is guided as much as possible, the interface is as
|
|
simple as possible. Data is only collected, if it is necessary.
|
|
|
|
So I present the safe chat program for dummies */
|
|
|
|
/** @page design Design
|
|
|
|
Safechat is designed to provide a safe chat program for
|
|
dummies. Everything is simple to use, everything is strong
|
|
enrcrypted, everything is open source. You can chat and you can
|
|
write encrypted e-mails from the same address. The GUI shall be
|
|
minimal and straight forward.
|
|
|
|
@section overview System Overview
|
|
|
|
@startuml{overview.png}
|
|
"user"
|
|
"user" as otheruser
|
|
[secret password]
|
|
[secret password] as otherpassword
|
|
user -up- [secret password]
|
|
otheruser -up- [otherpassword]
|
|
node "browser" {
|
|
folder "ecrypted local storage" {
|
|
[public key]
|
|
[private key]
|
|
[username]
|
|
[chat history]
|
|
}
|
|
}
|
|
node "browser" as otherbrowser {
|
|
folder "encrypted local storage" as otherstorage {
|
|
[public key] as otherpubkey
|
|
[private key] as otherprivkey
|
|
[username] as otherusername
|
|
[chat history] as otherhistory
|
|
}
|
|
}
|
|
cloud "internet" {
|
|
() WebRTC
|
|
node "safechat.ch" as safechatch {
|
|
() HTTPS
|
|
() WebSocket
|
|
[safechat]
|
|
folder "mailservice" {
|
|
[roundcube] -down- [DoveCot]
|
|
[DoveCot] -down- [postfix]
|
|
}
|
|
database "sql" {
|
|
}
|
|
[safechat] -up- HTTPS
|
|
[safechat] -up- WebSocket
|
|
[roundcube] -up- HTTPS
|
|
[safechat] -down- sql
|
|
}
|
|
node "safechat.biz" as safechatbiz {
|
|
() HTTPS as HTTPS2
|
|
() WebSocket as WebSocket2
|
|
[safechat] as safechat2
|
|
folder "mailservice" as mailservice2 {
|
|
[roundcube] as roundcube2
|
|
[DoveCot] as DoveCot2
|
|
[postfix] as postfix2
|
|
[roundcube2] -down- [DoveCot2]
|
|
[DoveCot2] -down- [postfix2]
|
|
}
|
|
database "sql" as sql2 {
|
|
}
|
|
[safechat2] -up- HTTPS2
|
|
[safechat2] -up- WebSocket2
|
|
[roundcube2] -up- HTTPS2
|
|
[safechat2] -down- sql2
|
|
}
|
|
node "keyserver" {
|
|
database "keys" {
|
|
folder "users / keys" {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
safechatch --right-- safechatbiz
|
|
browser --down-- HTTPS
|
|
otherbrowser --down-- HTTPS2
|
|
browser --down-- WebSocket
|
|
otherbrowser --down-- WebSocket2
|
|
browser --down-- WebRTC
|
|
otherbrowser --down-- WebRTC
|
|
user -- browser
|
|
otheruser - otherbrowser
|
|
@enduml
|
|
|
|
@section registration Registration of New User
|
|
|
|
@msc
|
|
|
|
user, browser, "safechat.ch", keyserver;
|
|
|
|
|||;
|
|
--- [label="load homepage"];
|
|
user => browser [label="load https://safechat.ch"];
|
|
browser => "safechat.ch" [label="GET /"];
|
|
"safechat.ch" >> browser [label="index.html"];
|
|
browser => "safechat.ch" [label="GET /safechat.js"];
|
|
"safechat.ch" >> browser [label="safechat.js"];
|
|
...;
|
|
browser -> browser [label="run safechat.js"];
|
|
--- [label="Create Account"];
|
|
browser => user [label="show create account"];
|
|
user >> browser [label="username, password"];
|
|
browser -> browser [label="create openpgp key pair"];
|
|
browser -> browser [label="locally store encrypted keys"];
|
|
browser -> keyserver [label="upload(pubkey)"];
|
|
browser -> browser [label="msg=encrypt(datetime)"];
|
|
browser -> "safechat.ch" [label="logon(username, pubkey, msg)"];
|
|
"safechat.ch" -> "safechat.ch" [label="datetime=decrypt(msg)"];
|
|
"safechat.ch" -> "safechat.ch" [label="verify datetime"];
|
|
"safechat.ch" -> keyserver [label="lookup(username)"];
|
|
"safechat.ch" -> browser [label="logon success"];
|
|
browser -> user [label="ready to chat"];
|
|
@endmsc */
|
|
|
|
/** @page security Password and Secrets Concept
|
|
|
|
<a href="https://www.eff.org/de/node/82654">SafeChat provides</a>:
|
|
- Encrypted in transit ✓
|
|
- Encrypted so the provider can't read it ✓
|
|
- You can verify contacts' identities ✓
|
|
- Past communications are secure if your key is stolen ✓
|
|
- Code is open to independent review ✓
|
|
- Security design is properly documented ✓
|
|
- Audit not yet done, we invite you to audit our code ✗
|
|
|
|
Neither the password nor the private key are sent to the
|
|
server. They remain under the user's control and in the user's
|
|
property. Only the user name and the public key are sent to the
|
|
server.
|
|
|
|
- The password is only kept in the browser's transient memory.
|
|
- The private key is kept in encrypted form in the browser's
|
|
persistent local storage.
|
|
- The public key is stored on server, so that other users can
|
|
lookup for a user's public key.
|
|
|
|
There are two secret security tokens: The password, that is in the
|
|
user's mind and the private key, which is in the user's device, in
|
|
the local storage of his browser. Messages can only be sent or
|
|
read with access to both security tokens. */
|
|
|
|
/** @page protocol SafeChat Protocol
|
|
|
|
@tableofcontents
|
|
|
|
@section newuser Create New User
|
|
|
|
If no credentials exist in the browser's local storage, the
|
|
browser asks the user for a user name and a password and creates a
|
|
private key that is encrypted with the password.
|
|
|
|
In the login(), the browser sends the user's name and public key
|
|
to the server. The server creates a new user, if the user does not
|
|
exist yet. Then the server returns, whether user name and public
|
|
key match to what he has in his table.
|
|
|
|
@msc
|
|
user, browser, server;
|
|
user -> browser [label="https://safechat.ch"];
|
|
browser -> server [label="index.html"];
|
|
browser <- server [label="safechat.js",URL="\ref safechat.js"];
|
|
user <- browser [label="register new user"];
|
|
user -> browser [label="username / password"];
|
|
browser -> browser [label="create openpgp-public/private keys"];
|
|
browser -> server [label="login.php(username, public-key)"];
|
|
server -> server [label="if user name does not exist:\nstore username/public-key"];
|
|
server -> browser [label="success"];
|
|
@endmsc */
|
|
|
|
/** @page api API Calls
|
|
|
|
Different users can be on different servers. Servers are connected
|
|
through @ref serverapi. The client browser first loads the
|
|
index.html file with HTTPS from server, which loads the javascript
|
|
code. From then on, everything happens through JSON over
|
|
WebSockets using @ref clientapi.
|
|
|
|
There are several APIs provided by safechat:
|
|
- @ref clientapi
|
|
- @ref serverapi
|
|
- Webmail with Roundcube
|
|
- SMTP using e.g. postfix
|
|
- IMAP using e.g. DoveCot */
|
|
|
|
/** @page clientapi Client - Server API Calls
|
|
|
|
@tableofcontents */
|
|
|
|
/** @page serverapi Server - Server API Calls
|
|
|
|
@tableofcontents */
|