feat: IMPLEMENT THE DOUBLE RATCHET WITH X3DH
This commit is contained in:
parent
4e3e20f08c
commit
1a0f470ada
@ -113,9 +113,9 @@ class OmemoDoubleRatchet {
|
|||||||
|
|
||||||
cks = newCks;
|
cks = newCks;
|
||||||
final header = OMEMOMessage()
|
final header = OMEMOMessage()
|
||||||
..n = ns
|
..dhPub = await dhs.pk.getBytes()
|
||||||
..pn = pn
|
..pn = pn
|
||||||
..dhPub = await dhs.pk.getBytes();
|
..n = ns;
|
||||||
|
|
||||||
ns++;
|
ns++;
|
||||||
|
|
||||||
@ -127,8 +127,7 @@ class OmemoDoubleRatchet {
|
|||||||
|
|
||||||
Future<List<int>?> trySkippedMessageKeys(OMEMOMessage header, List<int> ciphertext) async {
|
Future<List<int>?> trySkippedMessageKeys(OMEMOMessage header, List<int> ciphertext) async {
|
||||||
final key = SkippedKey(
|
final key = SkippedKey(
|
||||||
// TODO(PapaTutuWawa): Is this correct
|
OmemoPublicKey.fromBytes(header.dhPub, KeyPairType.x25519),
|
||||||
OmemoPublicKey.fromBytes(header.dhPub, KeyPairType.ed25519),
|
|
||||||
header.n,
|
header.n,
|
||||||
);
|
);
|
||||||
if (mkSkipped.containsKey(key)) {
|
if (mkSkipped.containsKey(key)) {
|
||||||
@ -162,13 +161,13 @@ class OmemoDoubleRatchet {
|
|||||||
pn = header.n;
|
pn = header.n;
|
||||||
ns = 0;
|
ns = 0;
|
||||||
nr = 0;
|
nr = 0;
|
||||||
dhr = OmemoPublicKey.fromBytes(header.dhPub, KeyPairType.ed25519);
|
dhr = OmemoPublicKey.fromBytes(header.dhPub, KeyPairType.x25519);
|
||||||
|
|
||||||
final newRk = await kdfRk(rk, await dh(dhs, dhr!, 2));
|
final newRk = await kdfRk(rk, await dh(dhs, dhr!, 0));
|
||||||
rk = newRk;
|
rk = newRk;
|
||||||
ckr = newRk;
|
ckr = newRk;
|
||||||
dhs = await OmemoKeyPair.generateNewPair(KeyPairType.x25519);
|
dhs = await OmemoKeyPair.generateNewPair(KeyPairType.x25519);
|
||||||
final newNewRk = await kdfRk(rk, await dh(dhs, dhr!, 2));
|
final newNewRk = await kdfRk(rk, await dh(dhs, dhr!, 0));
|
||||||
rk = newNewRk;
|
rk = newNewRk;
|
||||||
cks = newNewRk;
|
cks = newNewRk;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
// ignore_for_file: avoid_print
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:cryptography/cryptography.dart';
|
import 'package:cryptography/cryptography.dart';
|
||||||
import 'package:omemo_dart/omemo_dart.dart';
|
import 'package:omemo_dart/omemo_dart.dart';
|
||||||
@ -33,7 +34,6 @@ void main() {
|
|||||||
expect(decrypted, plaintext);
|
expect(decrypted, plaintext);
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
|
||||||
test('Test the Double Ratchet', () async {
|
test('Test the Double Ratchet', () async {
|
||||||
// Generate keys
|
// Generate keys
|
||||||
final ikAlice = await OmemoKeyPair.generateNewPair(KeyPairType.ed25519);
|
final ikAlice = await OmemoKeyPair.generateNewPair(KeyPairType.ed25519);
|
||||||
@ -90,20 +90,35 @@ void main() {
|
|||||||
//expect(await alicesRatchet.dhr.getBytes(), await ikBob.pk.getBytes());
|
//expect(await alicesRatchet.dhr.getBytes(), await ikBob.pk.getBytes());
|
||||||
|
|
||||||
// Alice encrypts a message
|
// Alice encrypts a message
|
||||||
final aliceRatchetResult = await alicesRatchet.ratchetEncrypt(utf8.encode('Hello Bob'));
|
final aliceRatchetResult1 = await alicesRatchet.ratchetEncrypt(utf8.encode('Hello Bob'));
|
||||||
print('Alice sent the message');
|
print('Alice sent the message');
|
||||||
|
|
||||||
// Alice sends it to Bob
|
// Alice sends it to Bob
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
// Bob tries to decrypt it
|
// Bob tries to decrypt it
|
||||||
final bobRatchetResult = await bobsRatchet.ratchetDecrypt(
|
final bobRatchetResult1 = await bobsRatchet.ratchetDecrypt(
|
||||||
aliceRatchetResult.header,
|
aliceRatchetResult1.header,
|
||||||
aliceRatchetResult.ciphertext,
|
aliceRatchetResult1.ciphertext,
|
||||||
);
|
);
|
||||||
print('Bob decrypted the message');
|
print('Bob decrypted the message');
|
||||||
|
|
||||||
expect(utf8.encode('Hello Bob'), bobRatchetResult);
|
expect(utf8.encode('Hello Bob'), bobRatchetResult1);
|
||||||
|
|
||||||
|
// Bob sends a message to Alice
|
||||||
|
final bobRatchetResult2 = await bobsRatchet.ratchetEncrypt(utf8.encode('Hello Alice'));
|
||||||
|
print('Bob sent the message');
|
||||||
|
|
||||||
|
// Bobs sends it to Alice
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// Alice tries to decrypt it
|
||||||
|
final aliceRatchetResult2 = await alicesRatchet.ratchetDecrypt(
|
||||||
|
bobRatchetResult2.header,
|
||||||
|
bobRatchetResult2.ciphertext,
|
||||||
|
);
|
||||||
|
print('Alice decrypted the message');
|
||||||
|
|
||||||
|
expect(utf8.encode('Hello Alice'), aliceRatchetResult2);
|
||||||
});
|
});
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user