Add last resort key and signaling key.

This commit is contained in:
Moxie Marlinspike
2013-08-28 15:35:30 -07:00
parent 45e380a5bb
commit 68ec0a3727
10 changed files with 110 additions and 30 deletions

View File

@@ -432,14 +432,16 @@ public class RegistrationProgressActivity extends SherlockActivity {
private final String e164number;
private final String password;
private final String signalingKey;
private final Context context;
private ProgressDialog progressDialog;
public VerifyClickListener(String e164number, String password) {
this.e164number = e164number;
this.password = password;
this.context = RegistrationProgressActivity.this;
this.e164number = e164number;
this.password = password;
this.signalingKey = Util.getSecret(52);
this.context = RegistrationProgressActivity.this;
}
@Override
@@ -473,6 +475,7 @@ public class RegistrationProgressActivity extends SherlockActivity {
intent.setAction(RegistrationService.VOICE_REGISTER_ACTION);
intent.putExtra("e164number", e164number);
intent.putExtra("password", password);
intent.putExtra("signaling_key", signalingKey);
intent.putExtra("master_secret", masterSecret);
startService(intent);
break;
@@ -495,7 +498,7 @@ public class RegistrationProgressActivity extends SherlockActivity {
protected Integer doInBackground(Void... params) {
try {
PushServiceSocket socket = new PushServiceSocket(context, e164number, password);
socket.verifyAccount(code);
socket.verifyAccount(code, signalingKey);
return SUCCESS;
} catch (RateLimitException e) {
Log.w("RegistrationProgressActivity", e);
@@ -521,9 +524,9 @@ public class RegistrationProgressActivity extends SherlockActivity {
private final Context context;
public CallClickListener(String e164number) {
this.e164number = e164number;
this.password = Util.getSecret(18);
this.context = RegistrationProgressActivity.this;
this.e164number = e164number;
this.password = Util.getSecret(18);
this.context = RegistrationProgressActivity.this;
}
@Override

View File

@@ -153,6 +153,7 @@ public class RegistrationService extends Service {
public void run() {
if (PreKeyUtil.getPreKeys(RegistrationService.this, masterSecret).size() < PreKeyUtil.BATCH_SIZE) {
PreKeyUtil.generatePreKeys(RegistrationService.this, masterSecret);
PreKeyUtil.generateLastResortKey(RegistrationService.this, masterSecret);
}
synchronized (GENERATING_PREKEYS_SEMAPHOR) {
@@ -188,6 +189,7 @@ public class RegistrationService extends Service {
String number = intent.getStringExtra("e164number");
String password = intent.getStringExtra("password" );
String signalingKey = intent.getStringExtra("signaling_key");
MasterSecret masterSecret = intent.getParcelableExtra("master_secret");
try {
@@ -198,7 +200,7 @@ public class RegistrationService extends Service {
handleCommonRegistration(masterSecret, socket, number);
markAsVerified(number, password);
markAsVerified(number, password, signalingKey);
setState(new RegistrationState(RegistrationState.STATE_COMPLETE, number));
broadcastComplete(true);
@@ -226,7 +228,9 @@ public class RegistrationService extends Service {
MasterSecret masterSecret = intent.getParcelableExtra("master_secret");
try {
String password = Util.getSecret(18);
String password = Util.getSecret(18);
String signalingKey = Util.getSecret(52);
initializeChallengeListener();
initializeGcmRegistrationListener();
initializePreKeyGenerator(masterSecret);
@@ -237,10 +241,10 @@ public class RegistrationService extends Service {
setState(new RegistrationState(RegistrationState.STATE_VERIFYING, number));
String challenge = waitForChallenge();
socket.verifyAccount(challenge);
socket.verifyAccount(challenge, signalingKey);
handleCommonRegistration(masterSecret, socket, number);
markAsVerified(number, password);
markAsVerified(number, password, signalingKey);
setState(new RegistrationState(RegistrationState.STATE_COMPLETE, number));
broadcastComplete(true);
@@ -272,7 +276,8 @@ public class RegistrationService extends Service {
setState(new RegistrationState(RegistrationState.STATE_GENERATING_KEYS, number));
IdentityKey identityKey = IdentityKeyUtil.getIdentityKey(this);
List<PreKeyRecord> records = waitForPreKeys(masterSecret);
socket.registerPreKeys(identityKey, records);
PreKeyRecord lastResort = PreKeyUtil.generateLastResortKey(this, masterSecret);
socket.registerPreKeys(identityKey, lastResort, records);
setState(new RegistrationState(RegistrationState.STATE_GCM_REGISTERING, number));
GCMRegistrar.register(this, GcmIntentService.GCM_SENDER_ID);
@@ -280,7 +285,10 @@ public class RegistrationService extends Service {
socket.registerGcmId(gcmRegistrationId);
Pair<DirectoryDescriptor, File> directory = socket.retrieveDirectory();
NumberFilter.getInstance(this).update(directory.first, directory.second);
if (directory != null) {
NumberFilter.getInstance(this).update(directory.first, directory.second);
}
}
private synchronized String waitForChallenge() throws AccountVerificationTimeoutException {
@@ -347,11 +355,12 @@ public class RegistrationService extends Service {
}
}
private void markAsVerified(String number, String password) {
private void markAsVerified(String number, String password, String signalingKey) {
TextSecurePreferences.setVerifying(this, false);
TextSecurePreferences.setPushRegistered(this, true);
TextSecurePreferences.setLocalNumber(this, number);
TextSecurePreferences.setPushServerPassword(this, password);
TextSecurePreferences.setSignalingKey(this, signalingKey);
}
private void setState(RegistrationState state) {
@@ -432,9 +441,9 @@ public class RegistrationService extends Service {
}
public RegistrationState(int state, String number, String password) {
this.state = state;
this.number = number;
this.password = password;
this.state = state;
this.number = number;
this.password = password;
}
}
}

View File

@@ -4,9 +4,6 @@ import android.content.Context;
import android.preference.PreferenceManager;
import android.util.Log;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.RoutingActivity;
public class TextSecurePreferences {
public static final String IDENTITY_PREF = "pref_choose_identity";
@@ -40,6 +37,7 @@ public class TextSecurePreferences {
private static final String REGISTERED_GCM_PREF = "pref_gcm_registered";
private static final String GCM_PASSWORD_PREF = "pref_gcm_password";
private static final String PROMPTED_PUSH_REGISTRATION_PREF = "pref_prompted_push_registration";
private static final String SIGNALING_KEY_PREF = "pref_signaling_key";
public static String getLocalNumber(Context context) {
return getStringPreference(context, LOCAL_NUMBER_PREF, "No Stored Number");
@@ -57,6 +55,10 @@ public class TextSecurePreferences {
setStringPreference(context, GCM_PASSWORD_PREF, password);
}
public static void setSignalingKey(Context context, String signalingKey) {
setStringPreference(context, SIGNALING_KEY_PREF, signalingKey);
}
public static boolean isEnterImeKeyEnabled(Context context) {
return getBooleanPreference(context, ENTER_PRESENT_PREF, false);
}