git » sdk » commit cee80f9

SignalProtocol: Add interface description of libsignal

author Matthew Wild
2025-04-18 14:10:21 UTC
committer Matthew Wild
2025-04-18 14:10:21 UTC
parent 28d0a0c36e6faa89f492763b130cb82fc3ee26dd

SignalProtocol: Add interface description of libsignal

snikket/SignalProtocol.hx +64 -11

diff --git a/snikket/SignalProtocol.hx b/snikket/SignalProtocol.hx
index ea2305e..3ecea69 100644
--- a/snikket/SignalProtocol.hx
+++ b/snikket/SignalProtocol.hx
@@ -4,7 +4,7 @@ import haxe.io.BytesData;
 
 using thenshim.Promise;
 
-// Types and methods used/provided by libsignal
+// A description for of the types and methods used and provided by libsignal
 
 @:expose
 typedef IdentityPublicKey = BytesData;
@@ -41,6 +41,56 @@ typedef SignedPreKey = {
 	var signature: BytesData;
 }
 
+typedef SignedPublicPreKey = {
+	var keyId: Int;
+	var publicKey: BytesData;
+	var signature: BytesData;
+}
+
+typedef SignalCipherText = {
+	// '1' for session key, '3' for prekey
+	var type: Int;
+	var body: String;
+}
+
+@:structInit
+class SignalPublicPreKeyInfo {
+	final keyId: Int;
+	final publicKey: BytesData;
+}
+
+@:structInit
+class SignalDeviceInfo {
+	final registrationId: Int;
+	final identityKey: IdentityPublicKey;
+	final signedPreKey: SignedPublicPreKey;
+	final preKey: SignalPublicPreKeyInfo;
+}
+
+@:native("libsignal.SignalProtocolAddress")
+extern class SignalProtocolAddress {
+	public function new(name:String, deviceId:Int);
+	public function getName():String;
+	public function getDeviceId():Int;
+	public function toString():String;
+	public function equals():Bool;
+	static public function fromString(str:String):SignalProtocolAddress;
+}
+
+@:native("libsignal.SessionBuilder")
+extern class SessionBuilder {
+	public function new(store:SignalProtocolStore, address:SignalProtocolAddress);
+	public function processPreKey(device:SignalDeviceInfo):Promise<Any>;
+}
+
+@:native("libsignal.SessionCipher")
+extern class SessionCipher {
+	public function new(store:SignalProtocolStore, address:SignalProtocolAddress);
+	public function decryptPreKeyWhisperMessage(ciphertext:BytesData):Promise<BytesData>;
+	public function decryptWhisperMessage(ciphertext:BytesData):Promise<BytesData>;
+	public function encrypt(plaintext:BytesData):Promise<SignalCipherText>;
+}
+
 // Not sure what the fields are for this one
 typedef SignalSession = Dynamic;
 
@@ -53,22 +103,25 @@ extern class KeyHelper {
 }
 
 abstract class SignalProtocolStore {
-	static final Direction = {
+	public final Direction = {
 		SENDING: 1,
 		RECEIVING: 2,
 	};
 	// Return our identity keypair
-	abstract public function getIdentityKeyPair():IdentityKeyPair;
+	// Note: There is no corresponding function in this interface to
+	// store our identity keypair (this is out of scope for libsignal,
+	// the application will store it directly with the persistence API)
+	abstract public function getIdentityKeyPair():Promise<IdentityKeyPair>;
 
 	// Return our "device id"
-	abstract public function getLocalRegistrationId():Int;
+	abstract public function getLocalRegistrationId():Promise<Int>;
 
 	// Return a boolean indicating whether we trust this identity
 	abstract public function isTrustedIdentity(identifier: String, identityKey: IdentityPublicKey, _direction: Int):Promise<Bool>;
 
-	abstract public function loadIdentityKey(identifier: String):Promise<IdentityPublicKey>;
+	abstract public function loadIdentityKey(identifier: SignalProtocolAddress):Promise<IdentityPublicKey>;
 
-	abstract public function saveIdentity(identifier: String, identityKey:IdentityPublicKey):Promise<Bool>;
+	abstract public function saveIdentity(identifier: SignalProtocolAddress, identityKey:IdentityPublicKey):Promise<Bool>;
 
 	abstract public function loadPreKey(keyId:Int):Promise<PreKeyPair>;
 
@@ -76,17 +129,17 @@ abstract class SignalProtocolStore {
 
 	abstract public function removePreKey(keyId:Int):Promise<Bool>;
 
-	abstract public function loadSignedPreKey(keyId:Int):Promise<SignedPreKey>;
+	abstract public function loadSignedPreKey(keyId:Int):Promise<PreKeyPair>;
 
 	abstract public function storeSignedPreKey(keyId:Int, keyPair:SignedPreKey):Promise<Bool>;
 
 	abstract public function removeSignedPreKey(keyId:Int):Promise<Bool>;
 
-	abstract public function loadSession(identifier:String):Promise<SignalSession>;
+	abstract public function loadSession(identifier:SignalProtocolAddress):Promise<SignalSession>;
 
-	abstract public function storeSession(identifier:String, session:SignalSession):Promise<Bool>;
+	abstract public function storeSession(identifier:SignalProtocolAddress, session:SignalSession):Promise<Bool>;
 
-	abstract public function removeSession(identifier:String):Promise<Bool>;
+	abstract public function removeSession(identifier:SignalProtocolAddress):Promise<Bool>;
 
-	abstract public function removeAllSessions(identifier:String):Promise<Bool>;
+	abstract public function removeAllSessions(identifier:SignalProtocolAddress):Promise<Bool>;
 }