2015-02-27 17:11:42 -08:00
|
|
|
# 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());
|
|
|
|
|
2015-03-05 10:50:49 -08:00
|
|
|
messageSender.sendMessage(new TextSecureAddress("+14159998888"),
|
|
|
|
TextSecureMessage.newBuilder()
|
|
|
|
.withBody("Hello, world!")
|
|
|
|
.build());
|
2015-02-27 17:11:42 -08:00
|
|
|
`````
|
|
|
|
|
|
|
|
## Sending media messages
|
|
|
|
|
|
|
|
`````
|
|
|
|
TextSecureMessageSender messageSender = new TextSecureMessageSender(URL, TRUST_STORE, USERNAME, PASSWORD,
|
|
|
|
localRecipientId, new MyAxolotlStore(),
|
|
|
|
Optional.absent());
|
|
|
|
|
|
|
|
File myAttachment = new File("/path/to/my.attachment");
|
|
|
|
FileInputStream attachmentStream = new FileInputStream(myAttachment);
|
2015-03-05 10:50:49 -08:00
|
|
|
TextSecureAttachment attachment = TextSecureAttachment.newStreamBuilder()
|
|
|
|
.withStream(attachmentStream)
|
|
|
|
.withContentType("image/png")
|
|
|
|
.withLength(myAttachment.size())
|
|
|
|
.build();
|
|
|
|
|
|
|
|
messageSender.sendMessage(new TextSecureAddress("+14159998888"),
|
|
|
|
TextSecureMessage.newBuilder()
|
|
|
|
.withBody("An attachment!")
|
|
|
|
.withAttachment(attachment)
|
|
|
|
.build());
|
2015-02-27 17:11:42 -08:00
|
|
|
|
|
|
|
`````
|
|
|
|
|
|
|
|
## 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);
|
2015-03-05 10:50:49 -08:00
|
|
|
TextSecureCipher cipher = new TextSecureCipher(new MyAxolotlStore());
|
2015-02-27 17:11:42 -08:00
|
|
|
TextSecureMessage message = cipher.decrypt(envelope);
|
|
|
|
|
|
|
|
System.out.println("Received message: " + message.getBody().get());
|
|
|
|
}
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
if (messagePipe != null)
|
|
|
|
messagePipe.close();
|
|
|
|
}
|
|
|
|
`````
|