Alternative key exchange by providing the public key in the URI

This commit is contained in:
Christian Basler 2017-04-16 22:38:11 +02:00
parent 55746743c4
commit 26fca259bc
2 changed files with 68 additions and 6 deletions

View File

@ -26,6 +26,7 @@ import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Base64;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -48,13 +49,18 @@ import com.mikepenz.google_material_typeface_library.GoogleMaterial;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import ch.dissem.apps.abit.service.Singleton; import ch.dissem.apps.abit.service.Singleton;
import ch.dissem.apps.abit.util.Drawables; import ch.dissem.apps.abit.util.Drawables;
import ch.dissem.bitmessage.entity.BitmessageAddress; import ch.dissem.bitmessage.entity.BitmessageAddress;
import ch.dissem.bitmessage.exception.ApplicationException;
import ch.dissem.bitmessage.wif.WifExporter; import ch.dissem.bitmessage.wif.WifExporter;
import static android.graphics.Color.BLACK; import static android.graphics.Color.BLACK;
import static android.graphics.Color.WHITE; import static android.graphics.Color.WHITE;
import static android.util.Base64.URL_SAFE;
/** /**
@ -269,6 +275,16 @@ public class AddressDetailFragment extends Fragment {
if (address.getAlias() != null) { if (address.getAlias() != null) {
link.append("?label=").append(address.getAlias()); link.append("?label=").append(address.getAlias());
} }
if (address.getPubkey() != null) {
link.append(address.getAlias() == null ? '?' : '&');
ByteArrayOutputStream pubkey = new ByteArrayOutputStream();
try {
address.getPubkey().writeUnencrypted(pubkey);
} catch (IOException e) {
throw new ApplicationException(e);
}
link.append("pubkey=").append(Base64.encodeToString(pubkey.toByteArray(), URL_SAFE));
}
BitMatrix result; BitMatrix result;
try { try {
result = new MultiFormatWriter().encode(link.toString(), result = new MultiFormatWriter().encode(link.toString(),

View File

@ -20,17 +20,32 @@ import android.app.Activity;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Switch; import android.widget.Switch;
import android.widget.TextView; import android.widget.TextView;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import ch.dissem.apps.abit.service.Singleton; import ch.dissem.apps.abit.service.Singleton;
import ch.dissem.bitmessage.BitmessageContext; import ch.dissem.bitmessage.BitmessageContext;
import ch.dissem.bitmessage.entity.BitmessageAddress; import ch.dissem.bitmessage.entity.BitmessageAddress;
import ch.dissem.bitmessage.entity.payload.Pubkey;
import ch.dissem.bitmessage.entity.payload.V2Pubkey;
import ch.dissem.bitmessage.entity.payload.V3Pubkey;
import ch.dissem.bitmessage.entity.payload.V4Pubkey;
import static android.util.Base64.URL_SAFE;
public class CreateAddressActivity extends AppCompatActivity { public class CreateAddressActivity extends AppCompatActivity {
private static final Pattern KEY_VALUE_PATTERN = Pattern.compile("^([a-zA-Z]+)=(.*)$");
private byte[] pubkeyBytes;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -48,12 +63,19 @@ public class CreateAddressActivity extends AppCompatActivity {
String addressText = getAddress(uri); String addressText = getAddress(uri);
String[] parameters = getParameters(uri); String[] parameters = getParameters(uri);
for (String parameter : parameters) { for (String parameter : parameters) {
String name = parameter.substring(0, 6).toLowerCase(); Matcher matcher = KEY_VALUE_PATTERN.matcher(parameter);
if (name.startsWith("label")) { String key = matcher.group(1).toLowerCase();
label.setText(parameter.substring(parameter.indexOf('=') + 1).trim()); String value = matcher.group(2);
} else if (name.startsWith("action")) { switch (key) {
parameter = parameter.toLowerCase(); case "label":
subscribe.setChecked(parameter.contains("subscribe")); label.setText(value.trim());
break;
case "action":
subscribe.setChecked(value.trim().equalsIgnoreCase("subscribe"));
break;
case "pubkey":
pubkeyBytes = Base64.decode(value, URL_SAFE);
break;
} }
} }
@ -83,6 +105,30 @@ public class CreateAddressActivity extends AppCompatActivity {
if (subscribe.isChecked()) { if (subscribe.isChecked()) {
bmc.addSubscribtion(bmAddress); bmc.addSubscribtion(bmAddress);
} }
if (pubkeyBytes != null) {
try {
final Pubkey pubkey;
InputStream pubkeyStream = new ByteArrayInputStream(pubkeyBytes);
long stream = bmAddress.getStream();
switch ((int) bmAddress.getVersion()) {
case 2:
pubkey = V2Pubkey.read(pubkeyStream, stream);
break;
case 3:
pubkey = V3Pubkey.read(pubkeyStream, stream);
break;
case 4:
pubkey = new V4Pubkey(V3Pubkey.read(pubkeyStream, stream));
break;
default:
pubkey = null;
}
if (pubkey != null) {
bmAddress.setPubkey(pubkey);
}
} catch (Exception ignore) {
}
}
setResult(Activity.RESULT_OK); setResult(Activity.RESULT_OK);
finish(); finish();