aboutsummaryrefslogtreecommitdiffstats
path: root/org_apg/src/org/thialfihar/android/apg/service
diff options
context:
space:
mode:
authorDominik <dominik@dominikschuermann.de>2012-09-10 19:57:39 +0200
committerDominik <dominik@dominikschuermann.de>2012-09-10 19:57:39 +0200
commit72fb3ef3cc894e9849b8b84bfd76148489e558d8 (patch)
tree3a3aa955a66d8cf57177f715f4b73c07685b2ffc /org_apg/src/org/thialfihar/android/apg/service
parent68301ee9183fbad9becf4cff0f8266d62a4f10e1 (diff)
downloadopen-keychain-72fb3ef3cc894e9849b8b84bfd76148489e558d8.tar.gz
open-keychain-72fb3ef3cc894e9849b8b84bfd76148489e558d8.tar.bz2
open-keychain-72fb3ef3cc894e9849b8b84bfd76148489e558d8.zip
started working on signing
Diffstat (limited to 'org_apg/src/org/thialfihar/android/apg/service')
-rw-r--r--org_apg/src/org/thialfihar/android/apg/service/ApgService.java80
-rw-r--r--org_apg/src/org/thialfihar/android/apg/service/ApgServiceHandler.java109
2 files changed, 189 insertions, 0 deletions
diff --git a/org_apg/src/org/thialfihar/android/apg/service/ApgService.java b/org_apg/src/org/thialfihar/android/apg/service/ApgService.java
index 279277ae6..8a2022825 100644
--- a/org_apg/src/org/thialfihar/android/apg/service/ApgService.java
+++ b/org_apg/src/org/thialfihar/android/apg/service/ApgService.java
@@ -28,10 +28,18 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Vector;
+import org.spongycastle.jce.provider.BouncyCastleProvider;
import org.spongycastle.openpgp.PGPKeyRing;
+import org.spongycastle.openpgp.PGPPrivateKey;
+import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing;
+import org.spongycastle.openpgp.PGPSignature;
+import org.spongycastle.openpgp.PGPSignatureGenerator;
+import org.spongycastle.openpgp.PGPSignatureSubpacketGenerator;
+import org.spongycastle.openpgp.PGPSignatureSubpacketVector;
+import org.spongycastle.openpgp.PGPUtil;
import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R;
@@ -55,6 +63,9 @@ import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
+import android.widget.CheckBox;
+import android.widget.Spinner;
+
import org.thialfihar.android.apg.util.Log;
/**
@@ -138,6 +149,10 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
public static final String QUERY_KEY_STRING = "queryKeyString";
public static final String QUERY_KEY_ID = "queryKeyId";
+ // sign key
+ public static final String SIGN_KEY_MASTER_KEY_ID = "signKeyMasterKeyId";
+ public static final String SIGN_KEY_PUB_KEY_ID = "signKeyPubKeyId";
+
/* possible EXTRA_ACTIONs */
public static final int ACTION_ENCRYPT_SIGN = 10;
@@ -155,6 +170,8 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
public static final int ACTION_UPLOAD_KEY = 60;
public static final int ACTION_QUERY_KEY = 61;
+ public static final int ACTION_SIGN_KEY = 70;
+
/* possible data keys as result send over messenger */
// keys
public static final String RESULT_NEW_KEY = "newKey";
@@ -784,6 +801,69 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
break;
+ case ACTION_SIGN_KEY:
+ try {
+
+ /* Input */
+
+ long masterKeyId = data.getInt(SIGN_KEY_MASTER_KEY_ID);
+ long pubKeyId = data.getInt(SIGN_KEY_PUB_KEY_ID);
+
+ /* Operation */
+
+ String passphrase = PGPMain.getCachedPassPhrase(masterKeyId);
+ if (passphrase == null || passphrase.length() <= 0) {
+ sendErrorToHandler(new GeneralException("Unable to obtain passphrase"));
+ } else {
+ PGPPublicKeyRing pubring = PGPMain.getPublicKeyRing(pubKeyId);
+
+ /*
+ * sign the incoming key
+ */
+ PGPSecretKey secretKey = PGPMain.getSecretKey(masterKeyId);
+ PGPPrivateKey signingKey = secretKey.extractPrivateKey(
+ passphrase.toCharArray(), BouncyCastleProvider.PROVIDER_NAME);
+ PGPSignatureGenerator sGen = new PGPSignatureGenerator(secretKey.getPublicKey()
+ .getAlgorithm(), PGPUtil.SHA256, BouncyCastleProvider.PROVIDER_NAME);
+ sGen.initSign(PGPSignature.DIRECT_KEY, signingKey);
+
+ PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator();
+
+ PGPSignatureSubpacketVector packetVector = spGen.generate();
+ sGen.setHashedSubpackets(packetVector);
+
+ PGPPublicKey signedKey = PGPPublicKey.addCertification(
+ pubring.getPublicKey(pubKeyId), sGen.generate());
+ pubring = PGPPublicKeyRing.insertPublicKey(pubring, signedKey);
+
+ // check if we need to send the key to the server or not
+ // CheckBox sendKey = (CheckBox) findViewById(R.id.sendKey);
+ // if (sendKey.isChecked()) {
+ // Spinner keyServer = (Spinner) findViewById(R.id.keyServer);
+ // HkpKeyServer server = new HkpKeyServer((String) keyServer.getSelectedItem());
+ //
+ // /*
+ // * upload the newly signed key to the key server
+ // */
+ //
+ // PGPMain.uploadKeyRingToServer(server, pubring);
+ // }
+
+ // store the signed key in our local cache
+ int retval = PGPMain.storeKeyRingInCache(pubring);
+ if (retval != Id.return_value.ok && retval != Id.return_value.updated) {
+ sendErrorToHandler(new GeneralException(
+ "Failed to store signed key in local cache"));
+ }
+ }
+
+ sendMessageToHandler(ApgServiceHandler.MESSAGE_OKAY);
+ } catch (Exception e) {
+ sendErrorToHandler(e);
+ }
+
+ break;
+
default:
break;
}
diff --git a/org_apg/src/org/thialfihar/android/apg/service/ApgServiceHandler.java b/org_apg/src/org/thialfihar/android/apg/service/ApgServiceHandler.java
new file mode 100644
index 000000000..91b7d4451
--- /dev/null
+++ b/org_apg/src/org/thialfihar/android/apg/service/ApgServiceHandler.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.thialfihar.android.apg.service;
+
+import org.thialfihar.android.apg.R;
+import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.app.FragmentActivity;
+import android.widget.Toast;
+
+public class ApgServiceHandler extends Handler {
+
+ // possible messages send from this service to handler on ui
+ public static final int MESSAGE_OKAY = 1;
+ public static final int MESSAGE_EXCEPTION = 2;
+ public static final int MESSAGE_UPDATE_PROGRESS = 3;
+
+ // possible data keys for messages
+ public static final String DATA_ERROR = "error";
+ public static final String DATA_PROGRESS = "progress";
+ public static final String DATA_PROGRESS_MAX = "max";
+ public static final String DATA_MESSAGE = "message";
+ public static final String DATA_MESSAGE_ID = "message_id";
+
+ Activity mActivity;
+ ProgressDialogFragment mProgressDialogFragment;
+
+ public ApgServiceHandler(Activity activity) {
+ this.mActivity = activity;
+ }
+
+ public ApgServiceHandler(Activity activity, ProgressDialogFragment progressDialogFragment) {
+ this.mActivity = activity;
+ this.mProgressDialogFragment = progressDialogFragment;
+ }
+
+ public ApgServiceHandler(Activity activity, int progressDialogMessageId, int progressDialogStyle) {
+ this.mActivity = activity;
+ this.mProgressDialogFragment = ProgressDialogFragment.newInstance(progressDialogMessageId,
+ progressDialogStyle);
+ }
+
+ public void showProgressDialog(FragmentActivity activity) {
+ mProgressDialogFragment.show(activity.getSupportFragmentManager(), "progressDialog");
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ Bundle data = message.getData();
+
+ switch (message.arg1) {
+ case MESSAGE_OKAY:
+ mProgressDialogFragment.dismiss();
+
+ break;
+
+ case MESSAGE_EXCEPTION:
+ mProgressDialogFragment.dismiss();
+
+ // show error from service
+ if (data.containsKey(DATA_ERROR)) {
+ Toast.makeText(mActivity,
+ mActivity.getString(R.string.errorMessage, data.getString(DATA_ERROR)),
+ Toast.LENGTH_SHORT).show();
+ }
+
+ break;
+
+ case MESSAGE_UPDATE_PROGRESS:
+ if (data.containsKey(DATA_PROGRESS) && data.containsKey(DATA_PROGRESS_MAX)) {
+
+ // update progress from service
+ if (data.containsKey(DATA_MESSAGE)) {
+ mProgressDialogFragment.setProgress(data.getString(DATA_MESSAGE),
+ data.getInt(DATA_PROGRESS), data.getInt(DATA_PROGRESS_MAX));
+ } else if (data.containsKey(DATA_MESSAGE_ID)) {
+ mProgressDialogFragment.setProgress(data.getInt(DATA_MESSAGE_ID),
+ data.getInt(DATA_PROGRESS), data.getInt(DATA_PROGRESS_MAX));
+ } else {
+ mProgressDialogFragment.setProgress(data.getInt(DATA_PROGRESS),
+ data.getInt(DATA_PROGRESS_MAX));
+ }
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ }
+}