aboutsummaryrefslogtreecommitdiffstats
path: root/src/eu/siacs/conversations/crypto/OtrEngine.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/eu/siacs/conversations/crypto/OtrEngine.java')
-rw-r--r--src/eu/siacs/conversations/crypto/OtrEngine.java83
1 files changed, 44 insertions, 39 deletions
diff --git a/src/eu/siacs/conversations/crypto/OtrEngine.java b/src/eu/siacs/conversations/crypto/OtrEngine.java
index 7960aa2b..5dfd6fd6 100644
--- a/src/eu/siacs/conversations/crypto/OtrEngine.java
+++ b/src/eu/siacs/conversations/crypto/OtrEngine.java
@@ -14,11 +14,13 @@ import java.security.spec.InvalidKeySpecException;
import org.json.JSONException;
import org.json.JSONObject;
-import android.content.Context;
import android.util.Log;
+import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
-import eu.siacs.conversations.persistance.DatabaseBackend;
+import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
import net.java.otr4j.OtrEngineHost;
@@ -27,35 +29,36 @@ import net.java.otr4j.OtrPolicy;
import net.java.otr4j.OtrPolicyImpl;
import net.java.otr4j.session.InstanceTag;
import net.java.otr4j.session.SessionID;
+import net.java.otr4j.session.SessionImpl;
+import net.java.otr4j.session.SessionStatus;
public class OtrEngine implements OtrEngineHost {
-
- private static final String LOGTAG = "xmppService";
-
+
private Account account;
private OtrPolicy otrPolicy;
private KeyPair keyPair;
- private Context context;
+ private XmppConnectionService mXmppConnectionService;
- public OtrEngine(Context context, Account account) {
+ public OtrEngine(XmppConnectionService service, Account account) {
this.account = account;
this.otrPolicy = new OtrPolicyImpl();
this.otrPolicy.setAllowV1(false);
this.otrPolicy.setAllowV2(true);
this.otrPolicy.setAllowV3(true);
this.keyPair = loadKey(account.getKeys());
+ this.mXmppConnectionService = service;
}
-
+
private KeyPair loadKey(JSONObject keys) {
if (keys == null) {
return null;
}
try {
- BigInteger x = new BigInteger(keys.getString("otr_x"),16);
- BigInteger y = new BigInteger(keys.getString("otr_y"),16);
- BigInteger p = new BigInteger(keys.getString("otr_p"),16);
- BigInteger q = new BigInteger(keys.getString("otr_q"),16);
- BigInteger g = new BigInteger(keys.getString("otr_g"),16);
+ BigInteger x = new BigInteger(keys.getString("otr_x"), 16);
+ BigInteger y = new BigInteger(keys.getString("otr_y"), 16);
+ BigInteger p = new BigInteger(keys.getString("otr_p"), 16);
+ BigInteger q = new BigInteger(keys.getString("otr_q"), 16);
+ BigInteger g = new BigInteger(keys.getString("otr_g"), 16);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
DSAPublicKeySpec pubKeySpec = new DSAPublicKeySpec(y, p, q, g);
DSAPrivateKeySpec privateKeySpec = new DSAPrivateKeySpec(x, p, q, g);
@@ -70,26 +73,28 @@ public class OtrEngine implements OtrEngineHost {
return null;
}
}
-
+
private void saveKey() {
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
KeyFactory keyFactory;
try {
keyFactory = KeyFactory.getInstance("DSA");
- DSAPrivateKeySpec privateKeySpec = keyFactory.getKeySpec(privateKey, DSAPrivateKeySpec.class);
- DSAPublicKeySpec publicKeySpec = keyFactory.getKeySpec(publicKey, DSAPublicKeySpec.class);
- this.account.setKey("otr_x",privateKeySpec.getX().toString(16));
- this.account.setKey("otr_g",privateKeySpec.getG().toString(16));
- this.account.setKey("otr_p",privateKeySpec.getP().toString(16));
- this.account.setKey("otr_q",privateKeySpec.getQ().toString(16));
- this.account.setKey("otr_y",publicKeySpec.getY().toString(16));
+ DSAPrivateKeySpec privateKeySpec = keyFactory.getKeySpec(
+ privateKey, DSAPrivateKeySpec.class);
+ DSAPublicKeySpec publicKeySpec = keyFactory.getKeySpec(publicKey,
+ DSAPublicKeySpec.class);
+ this.account.setKey("otr_x", privateKeySpec.getX().toString(16));
+ this.account.setKey("otr_g", privateKeySpec.getG().toString(16));
+ this.account.setKey("otr_p", privateKeySpec.getP().toString(16));
+ this.account.setKey("otr_q", privateKeySpec.getQ().toString(16));
+ this.account.setKey("otr_y", publicKeySpec.getY().toString(16));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
-
+
}
@Override
@@ -101,14 +106,12 @@ public class OtrEngine implements OtrEngineHost {
@Override
public void finishedSessionMessage(SessionID arg0, String arg1)
throws OtrException {
- // TODO Auto-generated method stub
}
@Override
public String getFallbackMessage(SessionID arg0) {
- // TODO Auto-generated method stub
- return null;
+ return "I would like to start a private (OTR encrypted) conversation but your client doesn’t seem to support that";
}
@Override
@@ -123,18 +126,19 @@ public class OtrEngine implements OtrEngineHost {
}
return this.keyPair.getPublic();
}
-
+
@Override
public KeyPair getLocalKeyPair(SessionID arg0) throws OtrException {
- if (this.keyPair==null) {
+ if (this.keyPair == null) {
KeyPairGenerator kg;
try {
- kg = KeyPairGenerator.getInstance("DSA");
- this.keyPair = kg.genKeyPair();
- this.saveKey();
- DatabaseBackend.getInstance(context).updateAccount(account);
+ kg = KeyPairGenerator.getInstance("DSA");
+ this.keyPair = kg.genKeyPair();
+ this.saveKey();
+ mXmppConnectionService.databaseBackend.updateAccount(account);
} catch (NoSuchAlgorithmException e) {
- Log.d(LOGTAG,"error generating key pair "+e.getMessage());
+ Log.d(Config.LOGTAG,
+ "error generating key pair " + e.getMessage());
}
}
return this.keyPair;
@@ -152,25 +156,26 @@ public class OtrEngine implements OtrEngineHost {
}
@Override
- public void injectMessage(SessionID session, String body) throws OtrException {
+ public void injectMessage(SessionID session, String body)
+ throws OtrException {
MessagePacket packet = new MessagePacket();
packet.setFrom(account.getFullJid());
if (session.getUserID().isEmpty()) {
packet.setTo(session.getAccountID());
} else {
- packet.setTo(session.getAccountID()+"/"+session.getUserID());
+ packet.setTo(session.getAccountID() + "/" + session.getUserID());
}
packet.setBody(body);
- packet.addChild("private","urn:xmpp:carbons:2");
- packet.addChild("no-copy","urn:xmpp:hints");
+ packet.addChild("private", "urn:xmpp:carbons:2");
+ packet.addChild("no-copy", "urn:xmpp:hints");
packet.setType(MessagePacket.TYPE_CHAT);
account.getXmppConnection().sendMessagePacket(packet);
}
@Override
- public void messageFromAnotherInstanceReceived(SessionID arg0) {
- // TODO Auto-generated method stub
-
+ public void messageFromAnotherInstanceReceived(SessionID id) {
+ Log.d(Config.LOGTAG,
+ "unreadable message received from " + id.getAccountID());
}
@Override