Encode prekey as full JSON rather than protobuf blobs.

1) Split prekey messages out into full JSON.

2) Add support for retrieving prekeys.
This commit is contained in:
Moxie Marlinspike
2013-08-18 14:35:23 -07:00
parent 499de2d2bf
commit edb89ee3e9
9 changed files with 181 additions and 541 deletions

View File

@@ -7,13 +7,13 @@ import org.whispersystems.textsecure.util.Util;
public class PreKeyPair {
private final MasterCipher masterCipher;
private final MasterCipher masterCipher;
private final ECPrivateKeyParameters privateKey;
private final ECPublicKeyParameters publicKey;
private final PreKeyPublic publicKey;
public PreKeyPair(MasterSecret masterSecret, AsymmetricCipherKeyPair keyPair) {
this.masterCipher = new MasterCipher(masterSecret);
this.publicKey = (ECPublicKeyParameters)keyPair.getPublic();
this.publicKey = new PreKeyPublic((ECPublicKeyParameters)keyPair.getPublic());
this.privateKey = (ECPrivateKeyParameters)keyPair.getPrivate();
}
@@ -25,16 +25,16 @@ public class PreKeyPair {
System.arraycopy(serialized, KeyUtil.POINT_SIZE, privateKeyBytes, 0, privateKeyBytes.length);
this.masterCipher = new MasterCipher(masterSecret);
this.publicKey = KeyUtil.decodePoint(serialized, 0);
this.publicKey = new PreKeyPublic(serialized, 0);
this.privateKey = masterCipher.decryptKey(privateKeyBytes);
}
public ECPublicKeyParameters getPublicKey() {
public PreKeyPublic getPublicKey() {
return publicKey;
}
public byte[] serialize() {
byte[] publicKeyBytes = KeyUtil.encodePoint(publicKey.getQ());
byte[] publicKeyBytes = publicKey.serialize();
byte[] privateKeyBytes = masterCipher.encryptKey(privateKey);
return Util.combine(publicKeyBytes, privateKeyBytes);

View File

@@ -0,0 +1,21 @@
package org.whispersystems.textsecure.crypto;
import org.spongycastle.crypto.params.ECPublicKeyParameters;
public class PreKeyPublic {
private final ECPublicKeyParameters publicKey;
public PreKeyPublic(ECPublicKeyParameters publicKey) {
this.publicKey = publicKey;
}
public PreKeyPublic(byte[] serialized, int offset) throws InvalidKeyException {
this.publicKey = KeyUtil.decodePoint(serialized, offset);
}
public byte[] serialize() {
return KeyUtil.encodePoint(publicKey.getQ());
}
}

View File

@@ -13,6 +13,8 @@ import org.whispersystems.textsecure.util.Base64;
import java.io.File;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
@@ -41,6 +43,8 @@ public class PreKeyUtil {
File directory = getPreKeysDirectory(context);
String[] keyRecordIds = directory.list();
Arrays.sort(keyRecordIds, new PreKeyRecordIdComparator());
for (String keyRecordId : keyRecordIds) {
try {
records.add(new PreKeyRecord(context, masterSecret, Long.parseLong(keyRecordId)));
@@ -94,4 +98,20 @@ public class PreKeyUtil {
return directory;
}
private static class PreKeyRecordIdComparator implements Comparator<String> {
@Override
public int compare(String lhs, String rhs) {
try {
long lhsLong = Long.parseLong(lhs);
long rhsLong = Long.parseLong(rhs);
if (lhsLong < rhsLong) return -1;
else if (lhsLong > rhsLong) return 1;
else return 0;
} catch (NumberFormatException e) {
return 0;
}
}
}
}