Alternative key exchange by providing the public key in the URI
This commit is contained in:
parent
55746743c4
commit
26fca259bc
@ -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(),
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user