mirror of
https://github.com/oxen-io/session-android.git
synced 2025-12-31 04:36:10 +00:00
7431302b6b85a4489aab0a1f28f0b2a8f77aca48
libtextsecure-java
A Java library for communicating via TextSecure.
Implementing the Axolotl interfaces
The axolotl encryption protocol is a stateful protocol, so libtextsecure users
need to implement the storage interface AxolotlStore, which handles load/store
of your key and session information to durable media.
Creating keys
IdentityKeyPair identityKey = KeyHelper.generateIdentityKeyPair();
List<PreKeyRecord> oneTimePreKeys = KeyHelper.generatePreKeys(100);
PreKeyRecord lastResortKey = KeyHelper.generateLastResortKey();
SignedPreKeyRecord signedPreKeyRecord = KeyHelper.generateSignedPreKey(identityKey, signedPreKeyId);
The above are then stored locally so that they're available for load via the AxolotlStore.
Registering
At install time, clients need to register with the TextSecure server.
private final String URL = "https://my.textsecure.server.com";
private final TrustStore TRUST_STORE = new MyTrustStoreImpl();
private final String USERNAME = "+14151231234";
private final String PASSWORD = generateRandomPassword();
TextSecureAccountManager accountManager = new TextSecureAccountManager(URL, TRUST_STORE,
USERNAME, PASSWORD);
accountManager.requestSmsVerificationCode();
accountManager.verifyAccount(receivedSmsVerificationCode, generateRandomSignalingKey(),
false, generateRandomInstallId());
accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID)));
accountManager.setPreKeys(identityKey.getPublic(), lastResortKey, signedPreKey, oneTimePreKeys);
Sending text messages
TextSecureMessageSender messageSender = new TextSecureMessageSender(URL, TRUST_STORE, USERNAME, PASSWORD,
localRecipientId, new MyAxolotlStore(),
Optional.absent());
long recipientId = getRecipientIdFor("+14159998888");
TextSecureAddress destination = new TextSecureAddress(recipientId, "+14159998888", null);
TextSecureMessage message = new TextSecureMessage(System.currentTimeMillis(), "Hello, world!");
messageSender.sendMessage(destination, message);
Sending media messages
TextSecureMessageSender messageSender = new TextSecureMessageSender(URL, TRUST_STORE, USERNAME, PASSWORD,
localRecipientId, new MyAxolotlStore(),
Optional.absent());
long recipientId = getRecipientIdFor("+14159998888");
TextSecureAddress destination = new TextSecureAddress(recipientId, "+14159998888", null);
File myAttachment = new File("/path/to/my.attachment");
FileInputStream attachmentStream = new FileInputStream(myAttachment);
TextSecureAttachment attachment = new TextSecureAttachmentStream(attachmentStream, "image/png", myAttachment.size());
TextSecureMessage message = new TextSecureMessage(System.currentTimeMillis(), attachment, "Hello, world!");
messageSender.sendMessage(destination, message);
Receiving messages
TextSecureMessageReceiver messageReceiver = new TextSecureMessageReceiver(URL, TRUST_STORE, USERNAME, PASSWORD, mySignalingKey);
TextSecureMessagePipe messagePipe;
try {
messagePipe = messageReciever.createMessagePipe();
while (listeningForMessages) {
TextSecureEnvelope envelope = messagePipe.read(timeout, timeoutTimeUnit);
TextSecureCipher cipher = new TextSecureCipher(new MyAxolotlStore(),
getRecipientIdFor(envelope.getSource()),
envelope.getSourceDevice());
TextSecureMessage message = cipher.decrypt(envelope);
System.out.println("Received message: " + message.getBody().get());
}
} finally {
if (messagePipe != null)
messagePipe.close();
}
Description
Languages
Kotlin
55.7%
Java
42.4%
C++
1.7%