use of co.krypt.krypton.pairing.Pairing in project krypton-android by kryptco.
the class Silo method pair.
public Pairing pair(Pairing pairing) throws CryptoException, TransportException {
synchronized (pairingsLock) {
Pairing oldPairing = activePairingsByUUID.get(pairing.uuid);
if (oldPairing != null) {
Log.w(TAG, "already paired with " + pairing.workstationName);
return oldPairing;
}
byte[] wrappedKey = pairing.wrapKey();
NetworkMessage wrappedKeyMessage = new NetworkMessage(NetworkMessage.Header.WRAPPED_PUBLIC_KEY, wrappedKey);
send(pairing, wrappedKeyMessage);
pairingStorage.pair(pairing);
activePairingsByUUID.put(pairing.uuid, pairing);
pollers.put(pairing, new SQSPoller(context, pairing));
if (bluetoothTransport != null) {
bluetoothTransport.add(pairing);
bluetoothTransport.send(pairing, wrappedKeyMessage);
}
}
return pairing;
}
use of co.krypt.krypton.pairing.Pairing in project krypton-android by kryptco.
the class Silo method onMessageJob.
private void onMessageJob(UUID pairingUUID, byte[] incoming, String communicationMedium) {
try {
NetworkMessage message = NetworkMessage.parse(incoming);
Pairing pairing;
synchronized (pairingsLock) {
pairing = activePairingsByUUID.get(pairingUUID);
}
if (pairing == null) {
Log.e(TAG, "not valid pairing: " + pairingUUID);
return;
}
switch(message.header) {
case CIPHERTEXT:
byte[] json = pairing.unseal(message.message);
Request request = JSON.fromJson(json, Request.class);
handle(pairing, request, communicationMedium);
break;
case WRAPPED_KEY:
break;
case WRAPPED_PUBLIC_KEY:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
use of co.krypt.krypton.pairing.Pairing in project krypton-android by kryptco.
the class Policy method onAction.
public static void onAction(final Context context, final String requestID, final String action) {
Log.i(TAG, action + " requestID " + requestID);
final Pair<Pairing, Request> pairingAndRequest;
// Lock manually to prevent deadlock from Silo
synchronized (Policy.class) {
pairingAndRequest = pendingRequestCache.remove(requestID);
}
if (pairingAndRequest == null) {
Log.e(TAG, "requestID " + requestID + " not pending");
return;
}
Silo silo = Silo.shared(context);
OpenDatabaseHelper db = silo.pairings().dbHelper;
Notifications.clearRequest(context, pairingAndRequest.second);
switch(action) {
case APPROVE_ONCE:
try {
silo.respondToRequest(pairingAndRequest.first, pairingAndRequest.second, true);
new Analytics(context).postEvent(pairingAndRequest.second.analyticsCategory(), "background approve", "once", null, false);
} catch (Exception e) {
e.printStackTrace();
}
break;
case APPROVE_ALL_TEMPORARILY:
try {
pairingAndRequest.second.body.visit(new RequestBody.Visitor<Void, Unrecoverable>() {
@Override
public Void visit(MeRequest meRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(SignRequest signRequest) throws Unrecoverable {
try {
Approval.approveSSHAnyHost(db, pairingAndRequest.first.uuid);
} catch (IOException | SQLException e) {
throw new Unrecoverable(e);
}
return null;
}
@Override
public Void visit(GitSignRequest gitSignRequest) throws Unrecoverable {
gitSignRequest.body.visit(new GitSignRequestBody.Visitor<Void, Unrecoverable>() {
@Override
public Void visit(CommitInfo commit) throws Unrecoverable {
try {
Approval.approveGitCommitSignatures(db, pairingAndRequest.first.uuid);
} catch (IOException | SQLException e) {
throw new Unrecoverable(e);
}
return null;
}
@Override
public Void visit(TagInfo tag) throws Unrecoverable {
try {
Approval.approveGitTagSignatures(db, pairingAndRequest.first.uuid);
} catch (IOException | SQLException e) {
throw new Unrecoverable(e);
}
return null;
}
});
return null;
}
@Override
public Void visit(UnpairRequest unpairRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(HostsRequest hostsRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(ReadTeamRequest readTeamRequest) throws Unrecoverable {
try {
Approval.approveReadTeamData(db, pairingAndRequest.first.uuid);
} catch (IOException | SQLException e) {
throw new Unrecoverable(e);
}
return null;
}
@Override
public Void visit(LogDecryptionRequest logDecryptionRequest) throws Unrecoverable {
try {
Approval.approveReadTeamData(db, pairingAndRequest.first.uuid);
} catch (IOException | SQLException e) {
throw new Unrecoverable(e);
}
return null;
}
@Override
public Void visit(TeamOperationRequest teamOperationRequest) throws Unrecoverable {
return null;
}
});
silo.respondToRequest(pairingAndRequest.first, pairingAndRequest.second, true);
new Analytics(context).postEvent(pairingAndRequest.second.analyticsCategory(), "background approve", "time", (int) temporaryApprovalSeconds(context, pairingAndRequest.second), false);
} catch (Exception e) {
e.printStackTrace();
}
break;
case APPROVE_THIS_TEMPORARILY:
try {
pairingAndRequest.second.body.visit(new RequestBody.Visitor<Void, Unrecoverable>() {
@Override
public Void visit(MeRequest meRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(SignRequest signRequest) throws Unrecoverable {
String user = signRequest.user();
if (signRequest.hostNameVerified && signRequest.hostAuth.hostNames.length > 0) {
try {
Approval.approveSSHUserHost(db, pairingAndRequest.first.uuid, user, signRequest.hostAuth.hostNames[0]);
} catch (IOException | SQLException e) {
throw new Unrecoverable(e);
}
}
return null;
}
@Override
public Void visit(GitSignRequest gitSignRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(UnpairRequest unpairRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(HostsRequest hostsRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(ReadTeamRequest readTeamRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(LogDecryptionRequest logDecryptionRequest) throws Unrecoverable {
return null;
}
@Override
public Void visit(TeamOperationRequest teamOperationRequest) throws Unrecoverable {
return null;
}
});
silo.respondToRequest(pairingAndRequest.first, pairingAndRequest.second, true);
new Analytics(context).postEvent(pairingAndRequest.second.analyticsCategory(), "background approve this", "time", (int) temporaryApprovalSeconds(context, pairingAndRequest.second), false);
} catch (Exception e) {
e.printStackTrace();
}
case REJECT:
try {
silo.respondToRequest(pairingAndRequest.first, pairingAndRequest.second, false);
new Analytics(context).postEvent(pairingAndRequest.second.analyticsCategory(), "background reject", null, null, false);
} catch (Unrecoverable e) {
e.printStackTrace();
}
break;
}
}
use of co.krypt.krypton.pairing.Pairing in project krypton-android by kryptco.
the class OnboardingActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_onboarding);
new Analytics(getApplicationContext()).postEvent("onboard", "start", null, null, false);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
OnboardingProgress progress = new OnboardingProgress(getApplicationContext());
GenerateFragment generateFragment;
EnterEmailFragment enterEmailFragment;
FirstPairFragment firstPairFragment;
TestSSHFragment testSSHFragment;
switch(progress.currentStage()) {
case NONE:
generateFragment = new GenerateFragment();
fragmentTransaction.add(R.id.activity_onboarding, generateFragment).commit();
break;
case GENERATE:
generateFragment = new GenerateFragment();
fragmentTransaction.add(R.id.activity_onboarding, generateFragment).commit();
break;
case GENERATING:
// generation must have failed, start from beginning
generateFragment = new GenerateFragment();
fragmentTransaction.add(R.id.activity_onboarding, generateFragment).commit();
break;
case ENTER_EMAIL:
enterEmailFragment = new EnterEmailFragment();
fragmentTransaction.add(R.id.activity_onboarding, enterEmailFragment).commit();
break;
case FIRST_PAIR:
firstPairFragment = new FirstPairFragment();
fragmentTransaction.add(R.id.activity_onboarding, firstPairFragment).commit();
break;
case TEST_SSH:
Iterator<Pairing> pairings = Silo.shared(getApplicationContext()).pairings().loadAll().iterator();
if (pairings.hasNext()) {
testSSHFragment = TestSSHFragment.newInstance(pairings.next().workstationName);
fragmentTransaction.add(R.id.activity_onboarding, testSSHFragment).commit();
} else {
// revert to FirstPair stage
firstPairFragment = new FirstPairFragment();
fragmentTransaction.add(R.id.activity_onboarding, firstPairFragment).commit();
}
break;
}
if (getIntent() != null) {
onNewIntent(getIntent());
}
}
use of co.krypt.krypton.pairing.Pairing in project krypton-android by kryptco.
the class SealInstrumentedTest method sealTamper_fails.
@Test(expected = CryptoException.class)
public void sealTamper_fails() throws Exception {
byte[] pubKey = new byte[Sodium.crypto_box_publickeybytes()];
byte[] privKey = new byte[Sodium.crypto_box_secretkeybytes()];
assertTrue(0 == Sodium.crypto_box_seed_keypair(pubKey, privKey, SecureRandom.getSeed(Sodium.crypto_box_seedbytes())));
Pairing pairing = Pairing.generate(pubKey, "workstation");
byte[] message = SecureRandom.getSeed(37);
byte[] ciphertext = pairing.seal(message);
ciphertext[17] ^= 0xff;
byte[] unsealed = pairing.unseal(ciphertext);
}
Aggregations