MixinNetwork / libsignal_protocol_dart

Signal Protocol library for Dart/Flutter
https://pub.dev/packages/libsignal_protocol_dart
GNU General Public License v3.0
159 stars 42 forks source link

InvalidKeyException - Invalid signature on device key! on processPreKeyBundle #35

Closed siman302 closed 3 years ago

siman302 commented 3 years ago

when FIRST TIME I send a message for encryption, its return a encrypted message. but SECOND TIME it throw an error "Invalid signature on device key!"

MyCode:

>   InMemoryPreKeyStore preKeyStore;
>   InMemorySignedPreKeyStore signedPreKeyStore;
>   InMemoryIdentityKeyStore identityStore;
>   generateData(identityKeyPair, registerationId, preKeys) {
>     signedPreKeyStore = InMemorySignedPreKeyStore();
>     preKeyStore = InMemoryPreKeyStore();
>     SignedPreKeyRecord signedPreKey =
>         KeyHelper.generateSignedPreKey(identityKeyPair, 0);
>     identityStore = InMemoryIdentityKeyStore(identityKeyPair, registerationId);
>     for (var p in preKeys) {
>       preKeyStore.storePreKey(p.id, p);
>     }
>     signedPreKeyStore.storeSignedPreKey(signedPreKey.id, signedPreKey);
>   }
> 
>   Uint8List encryption(String text, UserModel conv, id) {
>     InMemorySessionStore sessionStore = InMemorySessionStore();
>     SignalProtocolAddress bobAddress = SignalProtocolAddress(conv.name, 1);
>     UserModel me = Get.find<DataService>().user;
>     List list = reConversion(
>       me.identityKeyPair,
>       me.preKeys,
>       me.signedPreKeyRecord,
>       conv.identityPublicKeyPair,
>       conv.preKeysIdPublicKeyPair,
>       conv.signedPreKeyPublicPair,
>     );
> 
>     generateData(
>       list[0],
>       me.registerationId,
>       list[1],
>     );
>     SessionBuilder sessionBuilder = SessionBuilder(sessionStore, preKeyStore,
>         signedPreKeyStore, identityStore, bobAddress);
> 
>     PreKeyBundle retrievedPreKey = PreKeyBundle(
>       conv.registerationId,
>       1,
>       conv.preKeysId,
>       list[4],
>       conv.signedPreKeyId,
>       list[5],
>       conv.signedPreKeySignature,
>       list[3],
>     );
> 
>     sessionBuilder.processPreKeyBundle(retrievedPreKey);
> 
>     Get.find<DataService>()
>             .converstation
>             .firstWhere((CoversationModel element) => element.id == id)
>             .sessionCipher =
>         SessionCipher(sessionStore, preKeyStore, signedPreKeyStore,
>             identityStore, bobAddress);
> 
>     CiphertextMessage ciphertext = Get.find<DataService>()
>         .converstation
>         .firstWhere((CoversationModel element) => element.id == id)
>         .sessionCipher
>         .encrypt(Uint8List.fromList(utf8.encode(text)));
> 
>     sessionStore.deleteSession(bobAddress);
>     return ciphertext.serialize();
>   }
> 

That chunk of code throw an exception in file 'SessionBuilder.dart'


>   if (preKey.getSignedPreKey() != null &&
>         !Curve.verifySignature(
>             preKey.getIdentityKey().publicKey,
>             preKey.getSignedPreKey().serialize(),
>             preKey.getSignedPreKeySignature())) {
>       throw InvalidKeyException('Invalid signature on device key!');
>     }
crossle commented 3 years ago

Why you > sessionStore.deleteSession(bobAddress); ?

woinbo commented 3 years ago

@siman302 can you please share your project code. I just want to have a look at how to implement this library.