mirror of
https://github.com/oxen-io/session-android.git
synced 2025-10-27 14:30:42 +00:00
3399d0feb33272e5bf33726e04602dda44f645a7
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%