# OMEMO

OMEMO (XEP-0384) ist eine Erweiterung des Extensible Messaging and Presence Protocol (XMPP) für Multi-Client-Ende-zu-Ende-Verschlüsselung und wurde von Andreas Straub entwickelt. OMEMO benutzt Olm, eine Implementierung des Signal-Protokolls, zum Schlüsselmanagement und um Nachrichten zwischen mehreren Clients zu synchronisieren, selbst wenn davon einige offline sind. Der Name „OMEMO“ ist ein rekursives Akronym für „OMEMO Multi-End Message and Object Encryption“. OMEMO basiert außerdem auf dem Personal Eventing Protocol (PEP, XEP-0163) und bietet Perfect Forward Secrecy sowie glaubhafte Abstreitbarkeit (eng. plausible deniability).

## Bedeutung

Die Bedeutung von OMEMO besteht in einer erheblichen Verbesserung gegenüber den bisherigen Verschlüsselungslösungen für Instant Messaging. So unterstützt die bis dato verbreitetste Verschlüsselungslösung Off-the-Record Messaging (OTR) zwar Forward Secrecy und glaubhafte Abstreitbarkeit, allerdings muss dafür der Kommunikationspartner stets online sein, damit ihn die Nachricht erreicht. Bei der Verschlüsselung mittels OpenPGP stellt sich das Problem umgekehrt dar: Es werden zwar Offline-Nachrichten, aber weder Forward Secrecy noch glaubhafte Abstreitbarkeit unterstützt. Olm und somit auch OMEMO hingegen unterstützen sowohl Forward Secrecy und glaubhafte Abstreitbarkeit als auch Offline-Nachrichten.
Außerdem wurde an den bisherigen Verschlüsselungslösungen für Instant Messaging kritisiert, dass ihre Integration in das zugrundeliegende Chatprotokoll fehlte. So gaben beispielsweise die Entwickler des offiziellen Messengers der Desktopumgebung Gnome (Empathy) die fehlende Integration als Grund an, das oft gewünschte Feature OTR nicht zu implementieren. Die Integration von OMEMO in das Chatprotokoll stellt auch insofern eine Verbesserung gegenüber OTR dar.

## Geschichte

Das Protokoll wurde 2015 von Andreas Straub als Google-Summer-of-Code-Projekt entwickelt und implementiert. Ziel des Projekts war es, ein Axolotl-basiertes Multi-Ende-zu-Multi-Ende-Verschlüsselungsschema in einem XMPP-basierten Instant Messaging Client für Android, Conversations, zu implementieren. Es wurde im Herbst 2015 bei Conversations eingeführt, bei der XMPP Standards Foundation (XSF) als XMPP Extension Protocol (XEP) vorgeschlagen und als XEP-0384 im Dezember 2016 als experimentelles XEP akzeptiert. Im Oktober 2015 verkündete das ChatSecure-Projekt, dass es seinen verschlüsselnden Instant Messenger auf dem Conversations-Kern aufbauen, und an OMEMO-Unterstützung für eine iOS-Version arbeiten will. Auch Gajim arbeitete an einer OMEMO Unterstützung und veröffentlichte eine erste experimentelle Version des OMEMO-Plugins am 26. Dezember 2015. Diese OMEMO-Unterstützung steht seit Januar 2017 offiziell zur Verfügung. Seit September 2016 nutzt die OMEMO-Spezifikation nicht mehr das Signal-Protokoll, sondern die eigens für das Matrix-Netzwerkprotokoll geschriebene Implementierung Olm. 2017 wurde Olm durch das SignalProtocol abgelöst. Mit der Implementierung von OMEMO in den Monal Client rückte im Januar 2020 das Problem von unterschiedlicher Initialisierungsvektoren in den Vordergrund und sorgte für Kompatibilitätsprobleme zwischen den verschiedenen OMEMO Implementierungen. Im März 2020 wurde mit der Version 0.4.0 des OMEMO XMPP Extension Protocol's der Initialisierungsvektor festgelegt und die XMPP-Clients wurden auf den neuen Initialisierungsvektor umgestellt.

## Client-Unterstützung

* c0nnect PRO (Android - Conversations Fork)
* ChatSecure (iOS)
* Conversations (Android)
* Converse (für Webbrowser)
* blabber.im, ehemals „Pix-Art Messenger“ (Android - Conversations Fork)
* Dino (Linux, OS X)
* Gajim mittels Plugin (BSD, Linux, Windows)
* Profanity mittels experimentellen Plugins (BSD, Linux, Windows)
* Pidgin und andere libpurple-Clients mittels Plugin
* Quicksy (Android - Conversations Spin-off mit Rufnummer als Identifier)
* Monal (iOS)
* aTalk (Android, inkl. Videoanruf-Funktion)
* UWPX (Windows)

## Server-Unterstützung

Server benötigen keine spezielle Unterstützung für OMEMO, weil dafür die Kontaktliste (roster, Teil des XMPP-Kerns) und XEP-0163 (PEP) ausreichen.

## Library-Unterstützung

* Smack bietet experimentellen Support über die beiden Module smack-omemo + smack-omemo-signal