style: Formattiing issues
This commit is contained in:
		
							parent
							
								
									3783ec6f13
								
							
						
					
					
						commit
						3376929c24
					
				| @ -7,7 +7,10 @@ import 'package:omemo_dart/src/keys.dart'; | ||||
| /// is the identity key. This is needed since the identity key pair/public key is | ||||
| /// an Ed25519 key, but we need them as X25519 keys for DH. | ||||
| Future<List<int>> omemoDH( | ||||
|     OmemoKeyPair kp, OmemoPublicKey pk, int identityKey,) async { | ||||
|   OmemoKeyPair kp, | ||||
|   OmemoPublicKey pk, | ||||
|   int identityKey, | ||||
| ) async { | ||||
|   var ckp = kp; | ||||
|   var cpk = pk; | ||||
| 
 | ||||
| @ -62,13 +65,19 @@ Future<HkdfKeyResult> deriveEncryptionKeys(List<int> input, String info) async { | ||||
|   final bytes = await result.extractBytes(); | ||||
| 
 | ||||
|   return HkdfKeyResult( | ||||
|       bytes.sublist(0, 32), bytes.sublist(32, 64), bytes.sublist(64, 80),); | ||||
|     bytes.sublist(0, 32), | ||||
|     bytes.sublist(32, 64), | ||||
|     bytes.sublist(64, 80), | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| /// A small helper function to make AES-256-CBC easier. Encrypt [plaintext] using [key] as | ||||
| /// the encryption key and [iv] as the IV. Returns the ciphertext. | ||||
| Future<List<int>> aes256CbcEncrypt( | ||||
|     List<int> plaintext, List<int> key, List<int> iv,) async { | ||||
|   List<int> plaintext, | ||||
|   List<int> key, | ||||
|   List<int> iv, | ||||
| ) async { | ||||
|   final algorithm = AesCbc.with256bits( | ||||
|     macAlgorithm: MacAlgorithm.empty, | ||||
|   ); | ||||
| @ -84,7 +93,10 @@ Future<List<int>> aes256CbcEncrypt( | ||||
| /// A small helper function to make AES-256-CBC easier. Decrypt [ciphertext] using [key] as | ||||
| /// the encryption key and [iv] as the IV. Returns the ciphertext. | ||||
| Future<List<int>> aes256CbcDecrypt( | ||||
|     List<int> ciphertext, List<int> key, List<int> iv,) async { | ||||
|   List<int> ciphertext, | ||||
|   List<int> key, | ||||
|   List<int> iv, | ||||
| ) async { | ||||
|   final algorithm = AesCbc.with256bits( | ||||
|     macAlgorithm: MacAlgorithm.empty, | ||||
|   ); | ||||
|  | ||||
| @ -10,8 +10,12 @@ const encryptHkdfInfoString = 'OMEMO Message Key Material'; | ||||
| /// Signals ENCRYPT function as specified by OMEMO 0.8.3. | ||||
| /// Encrypt [plaintext] using the message key [mk], given associated_data [associatedData] | ||||
| /// and the AD output from the X3DH [sessionAd]. | ||||
| Future<List<int>> encrypt(List<int> mk, List<int> plaintext, | ||||
|     List<int> associatedData, List<int> sessionAd,) async { | ||||
| Future<List<int>> encrypt( | ||||
|   List<int> mk, | ||||
|   List<int> plaintext, | ||||
|   List<int> associatedData, | ||||
|   List<int> sessionAd, | ||||
| ) async { | ||||
|   // Generate encryption, authentication key and IV | ||||
|   final keys = await deriveEncryptionKeys(mk, encryptHkdfInfoString); | ||||
|   final ciphertext = | ||||
| @ -32,8 +36,12 @@ Future<List<int>> encrypt(List<int> mk, List<int> plaintext, | ||||
| /// Signals DECRYPT function as specified by OMEMO 0.8.3. | ||||
| /// Decrypt [ciphertext] with the message key [mk], given the associated_data [associatedData] | ||||
| /// and the AD output from the X3DH. | ||||
| Future<List<int>> decrypt(List<int> mk, List<int> ciphertext, | ||||
|     List<int> associatedData, List<int> sessionAd,) async { | ||||
| Future<List<int>> decrypt( | ||||
|   List<int> mk, | ||||
|   List<int> ciphertext, | ||||
|   List<int> associatedData, | ||||
|   List<int> sessionAd, | ||||
| ) async { | ||||
|   // Generate encryption, authentication key and IV | ||||
|   final keys = await deriveEncryptionKeys(mk, encryptHkdfInfoString); | ||||
| 
 | ||||
|  | ||||
| @ -179,8 +179,13 @@ class OmemoDoubleRatchet { | ||||
|   /// Create an OMEMO session using the Signed Pre Key [spk], the shared secret [sk] that | ||||
|   /// was obtained using a X3DH and the associated data [ad] that was also obtained through | ||||
|   /// a X3DH. [ik] refers to Bob's (the receiver's) IK public key. | ||||
|   static Future<OmemoDoubleRatchet> initiateNewSession(OmemoPublicKey spk, | ||||
|       OmemoPublicKey ik, List<int> sk, List<int> ad, int timestamp,) async { | ||||
|   static Future<OmemoDoubleRatchet> initiateNewSession( | ||||
|     OmemoPublicKey spk, | ||||
|     OmemoPublicKey ik, | ||||
|     List<int> sk, | ||||
|     List<int> ad, | ||||
|     int timestamp, | ||||
|   ) async { | ||||
|     final dhs = await OmemoKeyPair.generateNewPair(KeyPairType.x25519); | ||||
|     final dhr = spk; | ||||
|     final rk = await kdfRk(sk, await omemoDH(dhs, dhr, 0)); | ||||
| @ -208,8 +213,13 @@ class OmemoDoubleRatchet { | ||||
|   /// Pre Key keypair [spk], the shared secret [sk] that was obtained through a X3DH and | ||||
|   /// the associated data [ad] that was also obtained through a X3DH. [ik] refers to | ||||
|   /// Alice's (the initiator's) IK public key. | ||||
|   static Future<OmemoDoubleRatchet> acceptNewSession(OmemoKeyPair spk, | ||||
|       OmemoPublicKey ik, List<int> sk, List<int> ad, int kexTimestamp,) async { | ||||
|   static Future<OmemoDoubleRatchet> acceptNewSession( | ||||
|     OmemoKeyPair spk, | ||||
|     OmemoPublicKey ik, | ||||
|     List<int> sk, | ||||
|     List<int> ad, | ||||
|     int kexTimestamp, | ||||
|   ) async { | ||||
|     return OmemoDoubleRatchet( | ||||
|       spk, | ||||
|       null, | ||||
| @ -264,7 +274,9 @@ class OmemoDoubleRatchet { | ||||
|   } | ||||
| 
 | ||||
|   Future<List<int>?> _trySkippedMessageKeys( | ||||
|       OmemoMessage header, List<int> ciphertext,) async { | ||||
|     OmemoMessage header, | ||||
|     List<int> ciphertext, | ||||
|   ) async { | ||||
|     final key = SkippedKey( | ||||
|       OmemoPublicKey.fromBytes(header.dhPub!, KeyPairType.x25519), | ||||
|       header.n!, | ||||
| @ -273,8 +285,12 @@ class OmemoDoubleRatchet { | ||||
|       final mk = mkSkipped[key]!; | ||||
|       mkSkipped.remove(key); | ||||
| 
 | ||||
|       return decrypt(mk, ciphertext, | ||||
|           concat([sessionAd, header.writeToBuffer()]), sessionAd,); | ||||
|       return decrypt( | ||||
|         mk, | ||||
|         ciphertext, | ||||
|         concat([sessionAd, header.writeToBuffer()]), | ||||
|         sessionAd, | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     return null; | ||||
| @ -326,8 +342,12 @@ class OmemoDoubleRatchet { | ||||
| 
 | ||||
|     return RatchetStep( | ||||
|       header, | ||||
|       await encrypt(mk, plaintext, concat([sessionAd, header.writeToBuffer()]), | ||||
|           sessionAd,), | ||||
|       await encrypt( | ||||
|         mk, | ||||
|         plaintext, | ||||
|         concat([sessionAd, header.writeToBuffer()]), | ||||
|         sessionAd, | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
| @ -336,7 +356,9 @@ class OmemoDoubleRatchet { | ||||
|   /// | ||||
|   /// Throws an SkippingTooManyMessagesException if too many messages were to be skipped. | ||||
|   Future<List<int>> ratchetDecrypt( | ||||
|       OmemoMessage header, List<int> ciphertext,) async { | ||||
|     OmemoMessage header, | ||||
|     List<int> ciphertext, | ||||
|   ) async { | ||||
|     // Check if we skipped too many messages | ||||
|     final plaintext = await _trySkippedMessageKeys(header, ciphertext); | ||||
|     if (plaintext != null) { | ||||
| @ -359,7 +381,11 @@ class OmemoDoubleRatchet { | ||||
|     nr++; | ||||
| 
 | ||||
|     return decrypt( | ||||
|         mk, ciphertext, concat([sessionAd, header.writeToBuffer()]), sessionAd,); | ||||
|       mk, | ||||
|       ciphertext, | ||||
|       concat([sessionAd, header.writeToBuffer()]), | ||||
|       sessionAd, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   OmemoDoubleRatchet clone() { | ||||
|  | ||||
| @ -44,7 +44,10 @@ int generateRandom32BitNumber() { | ||||
| } | ||||
| 
 | ||||
| OmemoPublicKey? decodeKeyIfNotNull( | ||||
|     Map<String, dynamic> map, String key, KeyPairType type,) { | ||||
|   Map<String, dynamic> map, | ||||
|   String key, | ||||
|   KeyPairType type, | ||||
| ) { | ||||
|   if (map[key] == null) return null; | ||||
| 
 | ||||
|   return OmemoPublicKey.fromBytes( | ||||
|  | ||||
| @ -31,8 +31,10 @@ class OmemoPublicKey { | ||||
|   Future<String> asBase64() async => base64Encode(_pubkey.bytes); | ||||
| 
 | ||||
|   Future<OmemoPublicKey> toCurve25519() async { | ||||
|     assert(type == KeyPairType.ed25519, | ||||
|         'Cannot convert non-Ed25519 public key to X25519',); | ||||
|     assert( | ||||
|       type == KeyPairType.ed25519, | ||||
|       'Cannot convert non-Ed25519 public key to X25519', | ||||
|     ); | ||||
| 
 | ||||
|     final pkc = Uint8List(publicKeyLength); | ||||
|     TweetNaClExt.crypto_sign_ed25519_pk_to_x25519_pk( | ||||
| @ -41,7 +43,8 @@ class OmemoPublicKey { | ||||
|     ); | ||||
| 
 | ||||
|     return OmemoPublicKey( | ||||
|         SimplePublicKey(List<int>.from(pkc), type: KeyPairType.x25519),); | ||||
|       SimplePublicKey(List<int>.from(pkc), type: KeyPairType.x25519), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   SimplePublicKey asPublicKey() => _pubkey; | ||||
| @ -64,8 +67,10 @@ class OmemoPrivateKey { | ||||
|   Future<List<int>> getBytes() async => _privkey; | ||||
| 
 | ||||
|   Future<OmemoPrivateKey> toCurve25519() async { | ||||
|     assert(type == KeyPairType.ed25519, | ||||
|         'Cannot convert non-Ed25519 private key to X25519',); | ||||
|     assert( | ||||
|       type == KeyPairType.ed25519, | ||||
|       'Cannot convert non-Ed25519 private key to X25519', | ||||
|     ); | ||||
| 
 | ||||
|     final skc = Uint8List(privateKeyLength); | ||||
|     TweetNaClExt.crypto_sign_ed25519_sk_to_x25519_sk( | ||||
| @ -93,7 +98,10 @@ class OmemoKeyPair { | ||||
|   /// Create an OmemoKeyPair just from a [type] and the bytes of the private and public | ||||
|   /// key. | ||||
|   factory OmemoKeyPair.fromBytes( | ||||
|       List<int> publicKey, List<int> privateKey, KeyPairType type,) { | ||||
|     List<int> publicKey, | ||||
|     List<int> privateKey, | ||||
|     KeyPairType type, | ||||
|   ) { | ||||
|     return OmemoKeyPair( | ||||
|       OmemoPublicKey.fromBytes( | ||||
|         publicKey, | ||||
| @ -110,8 +118,10 @@ class OmemoKeyPair { | ||||
|   /// Generate a completely new random OmemoKeyPair of type [type]. [type] must be either | ||||
|   /// KeyPairType.ed25519 or KeyPairType.x25519. | ||||
|   static Future<OmemoKeyPair> generateNewPair(KeyPairType type) async { | ||||
|     assert(type == KeyPairType.ed25519 || type == KeyPairType.x25519, | ||||
|         'Keypair must be either Ed25519 or X25519',); | ||||
|     assert( | ||||
|       type == KeyPairType.ed25519 || type == KeyPairType.x25519, | ||||
|       'Keypair must be either Ed25519 or X25519', | ||||
|     ); | ||||
| 
 | ||||
|     SimpleKeyPair kp; | ||||
|     if (type == KeyPairType.ed25519) { | ||||
| @ -140,8 +150,10 @@ class OmemoKeyPair { | ||||
| 
 | ||||
|   /// Return the bytes that comprise the public key. | ||||
|   Future<OmemoKeyPair> toCurve25519() async { | ||||
|     assert(type == KeyPairType.ed25519, | ||||
|         'Cannot convert non-Ed25519 keypair to X25519',); | ||||
|     assert( | ||||
|       type == KeyPairType.ed25519, | ||||
|       'Cannot convert non-Ed25519 keypair to X25519', | ||||
|     ); | ||||
| 
 | ||||
|     return OmemoKeyPair( | ||||
|       await pk.toCurve25519(), | ||||
|  | ||||
| @ -93,8 +93,10 @@ class OmemoDevice { | ||||
|   } | ||||
| 
 | ||||
|   /// Generate a completely new device, i.e. cryptographic identity. | ||||
|   static Future<OmemoDevice> generateNewDevice(String jid, | ||||
|       {int opkAmount = 100,}) async { | ||||
|   static Future<OmemoDevice> generateNewDevice( | ||||
|     String jid, { | ||||
|     int opkAmount = 100, | ||||
|   }) async { | ||||
|     final id = generateRandom32BitNumber(); | ||||
|     final ik = await OmemoKeyPair.generateNewPair(KeyPairType.ed25519); | ||||
|     final spk = await OmemoKeyPair.generateNewPair(KeyPairType.x25519); | ||||
|  | ||||
| @ -5,8 +5,12 @@ import 'package:omemo_dart/src/omemo/ratchet_map_key.dart'; | ||||
| 
 | ||||
| @immutable | ||||
| class EncryptionResult { | ||||
|   const EncryptionResult(this.ciphertext, this.encryptedKeys, | ||||
|       this.deviceEncryptionErrors, this.jidEncryptionErrors,); | ||||
|   const EncryptionResult( | ||||
|     this.ciphertext, | ||||
|     this.encryptedKeys, | ||||
|     this.deviceEncryptionErrors, | ||||
|     this.jidEncryptionErrors, | ||||
|   ); | ||||
| 
 | ||||
|   /// The actual message that was encrypted. | ||||
|   final List<int>? ciphertext; | ||||
|  | ||||
| @ -6,7 +6,12 @@ abstract class OmemoEvent {} | ||||
| /// Triggered when a ratchet has been modified | ||||
| class RatchetModifiedEvent extends OmemoEvent { | ||||
|   RatchetModifiedEvent( | ||||
|       this.jid, this.deviceId, this.ratchet, this.added, this.replaced,); | ||||
|     this.jid, | ||||
|     this.deviceId, | ||||
|     this.ratchet, | ||||
|     this.added, | ||||
|     this.replaced, | ||||
|   ); | ||||
|   final String jid; | ||||
|   final int deviceId; | ||||
|   final OmemoDoubleRatchet ratchet; | ||||
|  | ||||
| @ -33,8 +33,10 @@ class _InternalDecryptionResult { | ||||
|     this.ratchetCreated, | ||||
|     this.ratchetReplaced, | ||||
|     this.payload, | ||||
|   ) : assert(!ratchetCreated || !ratchetReplaced, | ||||
|             'Ratchet must be either replaced or created',); | ||||
|   ) : assert( | ||||
|           !ratchetCreated || !ratchetReplaced, | ||||
|           'Ratchet must be either replaced or created', | ||||
|         ); | ||||
|   final bool ratchetCreated; | ||||
|   final bool ratchetReplaced; | ||||
|   final String? payload; | ||||
| @ -132,7 +134,9 @@ class OmemoManager { | ||||
|   } | ||||
| 
 | ||||
|   Future<String?> _decryptAndVerifyHmac( | ||||
|       List<int>? ciphertext, List<int> keyAndHmac,) async { | ||||
|     List<int>? ciphertext, | ||||
|     List<int> keyAndHmac, | ||||
|   ) async { | ||||
|     // Empty OMEMO messages should just have the key decrypted and/or session set up. | ||||
|     if (ciphertext == null) { | ||||
|       return null; | ||||
| @ -149,7 +153,10 @@ class OmemoManager { | ||||
| 
 | ||||
|     return utf8.decode( | ||||
|       await aes256CbcDecrypt( | ||||
|           ciphertext, derivedKeys.encryptionKey, derivedKeys.iv,), | ||||
|         ciphertext, | ||||
|         derivedKeys.encryptionKey, | ||||
|         derivedKeys.iv, | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
| @ -185,7 +192,10 @@ class OmemoManager { | ||||
|   /// from the key exchange [kex]. In case [kex] contains an unknown Signed Prekey | ||||
|   /// identifier an UnknownSignedPrekeyException will be thrown. | ||||
|   Future<OmemoDoubleRatchet> _addSessionFromKeyExchange( | ||||
|       String jid, int deviceId, OmemoKeyExchange kex,) async { | ||||
|     String jid, | ||||
|     int deviceId, | ||||
|     OmemoKeyExchange kex, | ||||
|   ) async { | ||||
|     // Pick the correct SPK | ||||
|     final device = await getDevice(); | ||||
|     OmemoKeyPair spk; | ||||
| @ -225,7 +235,10 @@ class OmemoManager { | ||||
|   /// [deviceId] from the bundle [bundle]. | ||||
|   @visibleForTesting | ||||
|   Future<OmemoKeyExchange> addSessionFromBundle( | ||||
|       String jid, int deviceId, OmemoBundle bundle,) async { | ||||
|     String jid, | ||||
|     int deviceId, | ||||
|     OmemoBundle bundle, | ||||
|   ) async { | ||||
|     final device = await getDevice(); | ||||
|     final kexResult = await x3dhFromBundle( | ||||
|       bundle, | ||||
| @ -255,7 +268,8 @@ class OmemoManager { | ||||
|   /// NOTE: Must be called from within the ratchet critical section | ||||
|   void _restoreRatchet(RatchetMapKey mapKey, OmemoDoubleRatchet oldRatchet) { | ||||
|     _log.finest( | ||||
|         'Restoring ratchet ${mapKey.jid}:${mapKey.deviceId} to ${oldRatchet.nr}',); | ||||
|       'Restoring ratchet ${mapKey.jid}:${mapKey.deviceId} to ${oldRatchet.nr}', | ||||
|     ); | ||||
|     _ratchetMap[mapKey] = oldRatchet; | ||||
| 
 | ||||
|     // Commit the ratchet | ||||
| @ -283,11 +297,12 @@ class OmemoManager { | ||||
|   /// will return null as there is no message to be decrypted. This, however, is used | ||||
|   /// to set up sessions or advance the ratchets. | ||||
|   Future<_InternalDecryptionResult> _decryptMessage( | ||||
|       List<int>? ciphertext, | ||||
|       String senderJid, | ||||
|       int senderDeviceId, | ||||
|       List<EncryptedKey> keys, | ||||
|       int timestamp,) async { | ||||
|     List<int>? ciphertext, | ||||
|     String senderJid, | ||||
|     int senderDeviceId, | ||||
|     List<EncryptedKey> keys, | ||||
|     int timestamp, | ||||
|   ) async { | ||||
|     // Try to find a session we can decrypt with. | ||||
|     var device = await getDevice(); | ||||
|     final rawKey = keys.firstWhereOrNull((key) => key.rid == device.id); | ||||
| @ -312,7 +327,8 @@ class OmemoManager { | ||||
|       // Guard against old key exchanges | ||||
|       if (oldRatchet != null) { | ||||
|         _log.finest( | ||||
|             'KEX for existent ratchet ${ratchetKey.toJsonKey()}. ${oldRatchet.kexTimestamp} > $timestamp: ${oldRatchet.kexTimestamp > timestamp}',); | ||||
|           'KEX for existent ratchet ${ratchetKey.toJsonKey()}. ${oldRatchet.kexTimestamp} > $timestamp: ${oldRatchet.kexTimestamp > timestamp}', | ||||
|         ); | ||||
|         if (oldRatchet.kexTimestamp > timestamp) { | ||||
|           throw InvalidKeyExchangeException(); | ||||
|         } | ||||
| @ -461,7 +477,9 @@ class OmemoManager { | ||||
|   /// the result will be null as well. | ||||
|   /// NOTE: Must be called within the ratchet critical section | ||||
|   Future<EncryptionResult> _encryptToJids( | ||||
|       List<String> jids, String? plaintext,) async { | ||||
|     List<String> jids, | ||||
|     String? plaintext, | ||||
|   ) async { | ||||
|     final encryptedKeys = List<EncryptedKey>.empty(growable: true); | ||||
| 
 | ||||
|     var ciphertext = const <int>[]; | ||||
| @ -564,7 +582,8 @@ class OmemoManager { | ||||
|           } else { | ||||
|             // The ratchet is not acked but we don't have the old key exchange | ||||
|             _log.warning( | ||||
|                 'Ratchet for $jid:$deviceId is not acked but the kex attribute is null',); | ||||
|               'Ratchet for $jid:$deviceId is not acked but the kex attribute is null', | ||||
|             ); | ||||
|             encryptedKeys.add( | ||||
|               EncryptedKey( | ||||
|                 jid, | ||||
| @ -632,7 +651,9 @@ class OmemoManager { | ||||
|     // Check if the ratchet is acked | ||||
|     final ratchet = getRatchet(ratchetKey); | ||||
|     assert( | ||||
|         ratchet != null, 'We decrypted the message, so the ratchet must exist',); | ||||
|       ratchet != null, | ||||
|       'We decrypted the message, so the ratchet must exist', | ||||
|     ); | ||||
| 
 | ||||
|     if (ratchet!.acknowledged) { | ||||
|       // Ratchet is acknowledged | ||||
| @ -704,8 +725,11 @@ class OmemoManager { | ||||
|   } | ||||
| 
 | ||||
|   /// Mark the ratchet for device [deviceId] from [jid] as acked. | ||||
|   Future<void> ratchetAcknowledged(String jid, int deviceId, | ||||
|       {bool enterCriticalSection = true,}) async { | ||||
|   Future<void> ratchetAcknowledged( | ||||
|     String jid, | ||||
|     int deviceId, { | ||||
|     bool enterCriticalSection = true, | ||||
|   }) async { | ||||
|     if (enterCriticalSection) await _enterRatchetCriticalSection(jid); | ||||
| 
 | ||||
|     final key = RatchetMapKey(jid, deviceId); | ||||
| @ -717,7 +741,8 @@ class OmemoManager { | ||||
|           .add(RatchetModifiedEvent(jid, deviceId, ratchet, false, false)); | ||||
|     } else { | ||||
|       _log.severe( | ||||
|           'Attempted to acknowledge ratchet ${key.toJsonKey()}, even though it does not exist',); | ||||
|         'Attempted to acknowledge ratchet ${key.toJsonKey()}, even though it does not exist', | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     if (enterCriticalSection) await _leaveRatchetCriticalSection(jid); | ||||
| @ -788,8 +813,10 @@ class OmemoManager { | ||||
|     _eventStreamController.add(DeviceListModifiedEvent(_deviceList)); | ||||
|   } | ||||
| 
 | ||||
|   void initialize(Map<RatchetMapKey, OmemoDoubleRatchet> ratchetMap, | ||||
|       Map<String, List<int>> deviceList,) { | ||||
|   void initialize( | ||||
|     Map<RatchetMapKey, OmemoDoubleRatchet> ratchetMap, | ||||
|     Map<String, List<int>> deviceList, | ||||
|   ) { | ||||
|     _deviceList = deviceList; | ||||
|     _ratchetMap = ratchetMap; | ||||
|   } | ||||
|  | ||||
| @ -147,7 +147,10 @@ abstract class BlindTrustBeforeVerificationTrustManager extends TrustManager { | ||||
| 
 | ||||
|   /// Sets the trust of [jid]'s device with identifier [deviceId] to [state]. | ||||
|   Future<void> setDeviceTrust( | ||||
|       String jid, int deviceId, BTBVTrustState state,) async { | ||||
|     String jid, | ||||
|     int deviceId, | ||||
|     BTBVTrustState state, | ||||
|   ) async { | ||||
|     await _lock.synchronized(() async { | ||||
|       trustCache[RatchetMapKey(jid, deviceId)] = state; | ||||
| 
 | ||||
| @ -205,7 +208,8 @@ abstract class BlindTrustBeforeVerificationTrustManager extends TrustManager { | ||||
|   /// From a serialized version of a BTBV trust manager, extract the trust cache. | ||||
|   /// NOTE: This is needed as Dart cannot just cast a List<dynamic> to List<int> and so on. | ||||
|   static Map<RatchetMapKey, BTBVTrustState> trustCacheFromJson( | ||||
|       Map<String, dynamic> json,) { | ||||
|     Map<String, dynamic> json, | ||||
|   ) { | ||||
|     return (json['trust']! as Map<String, dynamic>) | ||||
|         .map<RatchetMapKey, BTBVTrustState>( | ||||
|       (key, value) => MapEntry( | ||||
| @ -218,7 +222,8 @@ abstract class BlindTrustBeforeVerificationTrustManager extends TrustManager { | ||||
|   /// From a serialized version of a BTBV trust manager, extract the enable cache. | ||||
|   /// NOTE: This is needed as Dart cannot just cast a List<dynamic> to List<int> and so on. | ||||
|   static Map<RatchetMapKey, bool> enableCacheFromJson( | ||||
|       Map<String, dynamic> json,) { | ||||
|     Map<String, dynamic> json, | ||||
|   ) { | ||||
|     return (json['enable']! as Map<String, dynamic>).map<RatchetMapKey, bool>( | ||||
|       (key, value) => MapEntry( | ||||
|         RatchetMapKey.fromJsonKey(key), | ||||
|  | ||||
| @ -37,7 +37,9 @@ class X3DHBobResult { | ||||
| /// a Ed25519 keypair. | ||||
| Future<List<int>> sig(OmemoKeyPair keyPair, List<int> message) async { | ||||
|   assert( | ||||
|       keyPair.type == KeyPairType.ed25519, 'Signature keypair must be Ed25519',); | ||||
|     keyPair.type == KeyPairType.ed25519, | ||||
|     'Signature keypair must be Ed25519', | ||||
|   ); | ||||
|   final signature = await Ed25519().sign( | ||||
|     message, | ||||
|     keyPair: await keyPair.asKeyPair(), | ||||
| @ -69,7 +71,9 @@ Future<List<int>> kdf(List<int> km) async { | ||||
| /// Alice builds a session with Bob using his bundle [bundle] and Alice's identity key | ||||
| /// pair [ik]. | ||||
| Future<X3DHAliceResult> x3dhFromBundle( | ||||
|     OmemoBundle bundle, OmemoKeyPair ik,) async { | ||||
|   OmemoBundle bundle, | ||||
|   OmemoKeyPair ik, | ||||
| ) async { | ||||
|   // Check the signature first | ||||
|   final signatureValue = await Ed25519().verify( | ||||
|     await bundle.spk.getBytes(), | ||||
| @ -107,8 +111,12 @@ Future<X3DHAliceResult> x3dhFromBundle( | ||||
| 
 | ||||
| /// Bob builds the X3DH shared secret from the inital message [msg], the SPK [spk], the | ||||
| /// OPK [opk] that was selected by Alice and our IK [ik]. Returns the shared secret. | ||||
| Future<X3DHBobResult> x3dhFromInitialMessage(X3DHMessage msg, OmemoKeyPair spk, | ||||
|     OmemoKeyPair opk, OmemoKeyPair ik,) async { | ||||
| Future<X3DHBobResult> x3dhFromInitialMessage( | ||||
|   X3DHMessage msg, | ||||
|   OmemoKeyPair spk, | ||||
|   OmemoKeyPair opk, | ||||
|   OmemoKeyPair ik, | ||||
| ) async { | ||||
|   final dh1 = await omemoDH(spk, msg.ik, 2); | ||||
|   final dh2 = await omemoDH(ik, msg.ek, 1); | ||||
|   final dh3 = await omemoDH(spk, msg.ek, 0); | ||||
|  | ||||
| @ -813,9 +813,10 @@ void main() { | ||||
| 
 | ||||
|     expect(aliceResult.isSuccess(1), false); | ||||
|     expect( | ||||
|         aliceResult.jidEncryptionErrors[bobJid] | ||||
|             is NoKeyMaterialAvailableException, | ||||
|         true,); | ||||
|       aliceResult.jidEncryptionErrors[bobJid] | ||||
|           is NoKeyMaterialAvailableException, | ||||
|       true, | ||||
|     ); | ||||
|   }); | ||||
| 
 | ||||
|   test('Test sending a message two two JIDs with failed lookups', () async { | ||||
| @ -866,9 +867,10 @@ void main() { | ||||
| 
 | ||||
|     expect(aliceResult.isSuccess(2), true); | ||||
|     expect( | ||||
|         aliceResult.jidEncryptionErrors[cocoJid] | ||||
|             is NoKeyMaterialAvailableException, | ||||
|         true,); | ||||
|       aliceResult.jidEncryptionErrors[cocoJid] | ||||
|           is NoKeyMaterialAvailableException, | ||||
|       true, | ||||
|     ); | ||||
| 
 | ||||
|     // Bob decrypts it | ||||
|     final bobResult = await bobManager.onIncomingStanza( | ||||
|  | ||||
| @ -73,8 +73,11 @@ void main() { | ||||
|       await x3dhFromBundle(bundleBob, ikAlice); | ||||
|     } catch (e) { | ||||
|       exception = true; | ||||
|       expect(e is InvalidSignatureException, true, | ||||
|           reason: 'Expected InvalidSignatureException, but got $e',); | ||||
|       expect( | ||||
|         e is InvalidSignatureException, | ||||
|         true, | ||||
|         reason: 'Expected InvalidSignatureException, but got $e', | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     expect(exception, true, reason: 'Expected test failure'); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user