diff options
author | Dominik <dominik@dominikschuermann.de> | 2012-09-11 15:27:32 +0200 |
---|---|---|
committer | Dominik <dominik@dominikschuermann.de> | 2012-09-11 15:27:32 +0200 |
commit | be49597882a8170ed6244c0f20c375cd525a883d (patch) | |
tree | 0cfc11e3047acb9da61011eefcaebcb8ef791989 /org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java | |
parent | 534cbec7c59446743d0f005b953913e35b5d7a9d (diff) | |
download | open-keychain-be49597882a8170ed6244c0f20c375cd525a883d.tar.gz open-keychain-be49597882a8170ed6244c0f20c375cd525a883d.tar.bz2 open-keychain-be49597882a8170ed6244c0f20c375cd525a883d.zip |
fixes, refactoring
Diffstat (limited to 'org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java')
-rw-r--r-- | org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java b/org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java index 960baea72..2fd63bda1 100644 --- a/org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java +++ b/org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java @@ -51,6 +51,7 @@ import org.spongycastle.openpgp.PGPSignature; import org.spongycastle.openpgp.PGPSignatureGenerator; import org.spongycastle.openpgp.PGPSignatureList; import org.spongycastle.openpgp.PGPSignatureSubpacketGenerator; +import org.spongycastle.openpgp.PGPSignatureSubpacketVector; import org.spongycastle.openpgp.PGPUtil; import org.spongycastle.openpgp.PGPV3SignatureGenerator; import org.spongycastle.openpgp.operator.PBEDataDecryptorFactory; @@ -88,7 +89,6 @@ import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; -import android.app.Activity; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; @@ -750,6 +750,7 @@ public class PGPMain { throw new GeneralException(context.getString(R.string.error_externalStorageNotReady)); } ArmoredOutputStream out = new ArmoredOutputStream(outStream); + out.setHeader("Version", getFullVersion(context)); int numKeys = 0; for (int i = 0; i < keyRingIds.size(); ++i) { @@ -771,7 +772,7 @@ public class PGPMain { ++numKeys; } out.close(); - returnData.putInt("exported", numKeys); + returnData.putInt(ApgService.RESULT_EXPORT, numKeys); if (progress != null) progress.setProgress(R.string.progress_done, 100, 100); @@ -1048,22 +1049,26 @@ public class PGPMain { PGPPrivateKey signaturePrivateKey = null; if (signatureKeyId == 0) { + armorOut.close(); throw new GeneralException(context.getString(R.string.error_noSignatureKey)); } signingKeyRing = getSecretKeyRing(signatureKeyId); signingKey = PGPHelper.getSigningKey(signatureKeyId); if (signingKey == null) { + armorOut.close(); throw new GeneralException(context.getString(R.string.error_signatureFailed)); } if (signaturePassPhrase == null) { + armorOut.close(); throw new GeneralException(context.getString(R.string.error_noSignaturePassPhrase)); } PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( BOUNCY_CASTLE_PROVIDER_NAME).build(signaturePassPhrase.toCharArray()); signaturePrivateKey = signingKey.extractPrivateKey(keyDecryptor); if (signaturePrivateKey == null) { + armorOut.close(); throw new GeneralException(context.getString(R.string.error_couldNotExtractPrivateKey)); } if (progress != null) @@ -1147,8 +1152,10 @@ public class PGPMain { throws GeneralException, PGPException, IOException, NoSuchAlgorithmException, SignatureException { - ArmoredOutputStream armorOut = null; OutputStream out = null; + + // Ascii Armor (Base64) + ArmoredOutputStream armorOut = null; if (armored) { armorOut = new ArmoredOutputStream(outStream); armorOut.setHeader("Version", getFullVersion(context)); @@ -1174,6 +1181,7 @@ public class PGPMain { if (signaturePassPhrase == null) { throw new GeneralException(context.getString(R.string.error_noSignaturePassPhrase)); } + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( BOUNCY_CASTLE_PROVIDER_NAME).build(signaturePassPhrase.toCharArray()); signaturePrivateKey = signingKey.extractPrivateKey(keyDecryptor); @@ -1202,7 +1210,6 @@ public class PGPMain { if (forceV3Signature) { signatureV3Generator = new PGPV3SignatureGenerator(contentSignerBuilder); signatureV3Generator.init(type, signaturePrivateKey); - } else { signatureGenerator = new PGPSignatureGenerator(contentSignerBuilder); signatureGenerator.init(type, signaturePrivateKey); @@ -1261,6 +1268,51 @@ public class PGPMain { progress.setProgress(R.string.progress_done, 100, 100); } + public static PGPPublicKeyRing signKey(Context context, long masterKeyId, long pubKeyId) + throws GeneralException, NoSuchAlgorithmException, NoSuchProviderException, + PGPException, SignatureException { + String signaturePassPhrase = PGPMain.getCachedPassPhrase(masterKeyId); + if (signaturePassPhrase == null || signaturePassPhrase.length() <= 0) { + throw new GeneralException("Unable to obtain passphrase"); + } else { + PGPPublicKeyRing pubring = PGPMain.getPublicKeyRing(pubKeyId); + + PGPSecretKey signingKey = PGPHelper.getSigningKey(masterKeyId); + if (signingKey == null) { + throw new GeneralException(context.getString(R.string.error_signatureFailed)); + } + + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( + BOUNCY_CASTLE_PROVIDER_NAME).build(signaturePassPhrase.toCharArray()); + PGPPrivateKey signaturePrivateKey = signingKey.extractPrivateKey(keyDecryptor); + if (signaturePrivateKey == null) { + throw new GeneralException( + context.getString(R.string.error_couldNotExtractPrivateKey)); + } + + // TODO: SHA256 fixed? + JcaPGPContentSignerBuilder contentSignerBuilder = new JcaPGPContentSignerBuilder( + signingKey.getPublicKey().getAlgorithm(), PGPUtil.SHA256) + .setProvider(BOUNCY_CASTLE_PROVIDER_NAME); + + PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator( + contentSignerBuilder); + + signatureGenerator.init(PGPSignature.DIRECT_KEY, signaturePrivateKey); + + PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator(); + + PGPSignatureSubpacketVector packetVector = spGen.generate(); + signatureGenerator.setHashedSubpackets(packetVector); + + PGPPublicKey signedKey = PGPPublicKey.addCertification(pubring.getPublicKey(pubKeyId), + signatureGenerator.generate()); + pubring = PGPPublicKeyRing.insertPublicKey(pubring, signedKey); + + return pubring; + } + } + public static long getDecryptionKeyId(Context context, InputStream inputStream) throws GeneralException, NoAsymmetricEncryptionException, IOException { InputStream in = PGPUtil.getDecoderStream(inputStream); |