git » sdk » omemo » tree

[omemo] / snikket / SignalProtocol.hx

package snikket;

import haxe.io.BytesData;

using thenshim.Promise;

// A description for of the types and methods used and provided by libsignal

@:expose
typedef IdentityPublicKey = BytesData;

@:expose
typedef IdentityKeyPair = {
	var privKey: BytesData;
	var pubKey: BytesData;
}

@:expose
typedef PublicPreKey = {
	var keyId: Int;
	// Base64 representation of the public key
	var pubKey: String;
}

@:expose
typedef PreKeyPair = {
	var privKey: BytesData;
	var pubKey: BytesData;
}

@:expose
typedef PreKey = {
	var keyId: Int;
	var keyPair: PreKeyPair;
}

@:expose
typedef SignedPreKey = {
	var keyId: Int;
	var keyPair: PreKeyPair;
	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;

@:native("libsignal.KeyHelper")
extern class KeyHelper {
	static function generateRegistrationId():Int;
	static function generatePreKey(keyId: Int):Promise<PreKey>;
	static function generateIdentityKeyPair():Promise<IdentityKeyPair>;
	static function generateSignedPreKey(identityKeyPair: IdentityKeyPair, keyId: Int):Promise<SignedPreKey>;
}

abstract class SignalProtocolStore {
	public final Direction = {
		SENDING: 1,
		RECEIVING: 2,
	};
	// Return our identity keypair
	// 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():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: SignalProtocolAddress):Promise<IdentityPublicKey>;

	abstract public function saveIdentity(identifier: SignalProtocolAddress, identityKey:IdentityPublicKey):Promise<Bool>;

	abstract public function loadPreKey(keyId:Int):Promise<PreKeyPair>;

	abstract public function storePreKey(keyId:Int, keyPair:PreKeyPair):Promise<Bool>;

	abstract public function removePreKey(keyId:Int):Promise<Bool>;

	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:SignalProtocolAddress):Promise<SignalSession>;

	abstract public function storeSession(identifier:SignalProtocolAddress, session:SignalSession):Promise<Bool>;

	abstract public function removeSession(identifier:SignalProtocolAddress):Promise<Bool>;

	abstract public function removeAllSessions(identifier:SignalProtocolAddress):Promise<Bool>;
}