diff --git a/lib/src/omemo/encrypted_key.dart b/lib/src/omemo/encrypted_key.dart
index d1fc4f3..2e1e1eb 100644
--- a/lib/src/omemo/encrypted_key.dart
+++ b/lib/src/omemo/encrypted_key.dart
@@ -1,12 +1,23 @@
+import 'dart:convert';
+
 import 'package:meta/meta.dart';
 
 /// EncryptedKey is the intermediary format of a  element in the OMEMO message's
 ///  header.
 @immutable
 class EncryptedKey {
-  const EncryptedKey(this.jid, this.rid, this.value, this.kex);
-  final String jid;
+  const EncryptedKey(this.rid, this.value, this.kex);
+
+  /// The id of the device the key is encrypted for.
   final int rid;
+
+  /// The base64-encoded payload.
   final String value;
+
+  /// Flag indicating whether the payload is a OMEMOKeyExchange (true) or
+  /// an OMEMOAuthenticatedMessage (false).
   final bool kex;
+
+  /// The base64-decoded payload.
+  List get data => base64Decode(value);
 }
diff --git a/lib/src/omemo/omemo.dart b/lib/src/omemo/omemo.dart
index dff324f..34c226a 100644
--- a/lib/src/omemo/omemo.dart
+++ b/lib/src/omemo/omemo.dart
@@ -28,6 +28,7 @@ import 'package:omemo_dart/src/x3dh/x3dh.dart';
 import 'package:synchronized/synchronized.dart';
 
 extension AppendToListOrCreateExtension on Map> {
+  /// Create or append [value] to the list identified with key [key].
   void appendOrCreate(K key, V value) {
     if (containsKey(key)) {
       this[key]!.add(value);
@@ -38,6 +39,8 @@ extension AppendToListOrCreateExtension on Map> {
 }
 
 extension StringFromBase64Extension on String {
+  /// Base64-decode this string. Useful for doing `someString?.fromBase64()` instead
+  /// of `someString != null ? base64Decode(someString) : null`.
   List fromBase64() => base64Decode(this);
 }
 
@@ -255,7 +258,7 @@ class OmemoManager {
     var processAsKex = key.kex;
     if (key.kex && _ratchetMap.containsKey(ratchetKey)) {
       final ratchet = _ratchetMap[ratchetKey]!;
-      final kexMessage = OMEMOKeyExchange.fromBuffer(base64Decode(key.value));
+      final kexMessage = OMEMOKeyExchange.fromBuffer(key.data);
       final ratchetEk = await ratchet.kex.ek.getBytes();
       final sameEk = listsEqual(kexMessage.ek, ratchetEk);
 
@@ -270,7 +273,7 @@ class OmemoManager {
     // Process the message
     if (processAsKex) {
       _log.finest('Decoding message as OMEMOKeyExchange');
-      final kexMessage = OMEMOKeyExchange.fromBuffer(base64Decode(key.value));
+      final kexMessage = OMEMOKeyExchange.fromBuffer(key.data);
 
       // Find the correct SPK
       final device = await getDevice();
@@ -327,7 +330,7 @@ class OmemoManager {
       }
 
       final result = await _decryptAndVerifyHmac(
-        stanza.payload != null ? base64Decode(stanza.payload!) : null,
+        stanza.payload?.fromBase64(),
         keyAndHmac.get>(),
       );
       if (result.isType()) {
@@ -414,11 +417,9 @@ class OmemoManager {
         _log.finest(
           'Extracting OMEMOAuthenticatedMessage from OMEMOKeyExchange',
         );
-        authMessage =
-            OMEMOKeyExchange.fromBuffer(base64Decode(key.value)).message;
+        authMessage = OMEMOKeyExchange.fromBuffer(key.data).message;
       } else {
-        authMessage =
-            OMEMOAuthenticatedMessage.fromBuffer(base64Decode(key.value));
+        authMessage = OMEMOAuthenticatedMessage.fromBuffer(key.data);
       }
 
       final keyAndHmac = await ratchet.ratchetDecrypt(authMessage);
@@ -632,7 +633,6 @@ class OmemoManager {
           encryptedKeys.appendOrCreate(
             jid,
             EncryptedKey(
-              jid,
               device,
               base64Encode(kexMessage.writeToBuffer()),
               true,
@@ -652,7 +652,6 @@ class OmemoManager {
           encryptedKeys.appendOrCreate(
             jid,
             EncryptedKey(
-              jid,
               device,
               base64Encode(kexMessage.writeToBuffer()),
               true,
@@ -663,7 +662,6 @@ class OmemoManager {
           encryptedKeys.appendOrCreate(
             jid,
             EncryptedKey(
-              jid,
               device,
               base64Encode(authMessage.writeToBuffer()),
               false,