| author | Matthew Wild
<mwild1@gmail.com> 2025-04-18 14:10:21 UTC |
| committer | Matthew Wild
<mwild1@gmail.com> 2025-04-18 14:10:21 UTC |
| parent | 28d0a0c36e6faa89f492763b130cb82fc3ee26dd |
| 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>; }