This commit is contained in:
Miroojin Bakshi 2014-03-06 01:49:36 +05:30
commit f99b7585fc
43 changed files with 1108 additions and 589 deletions

View File

@ -10,7 +10,7 @@ before_install:
- export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools
# Install required Android components.
- echo "y" | android update sdk -a --filter build-tools-19.0.1,android-19,platform-tools,extra-android-support,extra-android-m2repository,android-17 --no-ui --force
- echo "y" | android update sdk -a --filter build-tools-19.0.3,android-19,platform-tools,extra-android-support,extra-android-m2repository,android-17 --no-ui --force
install: echo "Installation done"
script: gradle assemble -S -q

View File

@ -18,7 +18,7 @@ dependencies {
android {
compileSdkVersion 19
buildToolsVersion "19.0.1"
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 9

View File

@ -13,7 +13,7 @@ apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion '19.0.1'
buildToolsVersion '19.0.3'
// NOTE: We are using the old folder structure to also support Eclipse
sourceSets {

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="keychain-api-library" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="ant.properties" />
<!-- if sdk.dir was not set from one of the property file, then
get it from the ANDROID_HOME env var.
This must be done before we load project.properties since
the proguard config can use sdk.dir -->
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>
<!--
Import per project custom build rules if present at the root of the project.
This is the place to put custom intermediary targets such as:
-pre-build
-pre-compile
-post-compile (This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir})
-post-package
-post-build
-pre-clean
-->
<import file="custom_rules.xml" optional="true" />
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>

View File

@ -0,0 +1,20 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

View File

@ -38,24 +38,40 @@ public class OpenPgpSignatureResult implements Parcelable {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public boolean isSignatureOnly() {
return signatureOnly;
}
public void setSignatureOnly(boolean signatureOnly) {
this.signatureOnly = signatureOnly;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public long getKeyId() {
return keyId;
}
public void setKeyId(long keyId) {
this.keyId = keyId;
}
public OpenPgpSignatureResult() {
}
public OpenPgpSignatureResult(int signatureStatus, String signatureUserId,
boolean signatureOnly, long keyId) {
boolean signatureOnly, long keyId) {
this.status = signatureStatus;
this.signatureOnly = signatureOnly;
this.userId = signatureUserId;

View File

@ -18,7 +18,7 @@ dependencies {
android {
compileSdkVersion 19
buildToolsVersion "19.0.1"
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 9

View File

@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.sufficientlysecure.keychain"
android:installLocation="auto"
android:versionCode="23101"
android:versionName="2.3.1 beta1">
android:versionCode="23102"
android:versionName="2.3.1 beta2">
<!--
General remarks
@ -22,7 +22,8 @@
Remarks about the ugly android:pathPattern:
- We are matching all files with a specific file ending.
This is done in an ugly way because of Android limitations.
Read http://stackoverflow.com/questions/1733195/android-intent-filter-for-a-particular-file-extension and http://stackoverflow.com/questions/3400072/pathpattern-to-match-file-extension-does-not-work-if-a-period-exists-elsewhere-i/8599921
Read http://stackoverflow.com/questions/1733195/android-intent-filter-for-a-particular-file-extension
and http://stackoverflow.com/questions/3400072/pathpattern-to-match-file-extension-does-not-work-if-a-period-exists-elsewhere-i/8599921
for more information.
- Do _not_ set mimeType for gpg!
Cyanogenmod's file manager will only show Keychain for gpg files if no mimeType is set!
@ -276,7 +277,16 @@
<activity
android:name=".ui.PreferencesActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_preferences" />
android:label="@string/title_preferences" >
<intent-filter>
<action android:name="org.sufficientlysecure.keychain.ui.PREFS_GEN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="org.sufficientlysecure.keychain.ui.PREFS_ADV" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".ui.PreferencesKeyServerActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"

View File

@ -18,8 +18,8 @@
package org.sufficientlysecure.keychain.pgp;
import android.content.Context;
import android.os.Bundle;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.spongycastle.bcpg.ArmoredInputStream;
import org.spongycastle.bcpg.SignatureSubpacketTags;
import org.spongycastle.openpgp.PGPCompressedData;
@ -36,6 +36,7 @@ import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPPublicKeyEncryptedData;
import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.spongycastle.openpgp.PGPSignature;
import org.spongycastle.openpgp.PGPSignatureList;
import org.spongycastle.openpgp.PGPSignatureSubpacketVector;
@ -53,7 +54,7 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ProgressDialogUpdater;
@ -75,9 +76,10 @@ public class PgpDecryptVerify {
private InputData data;
private OutputStream outStream;
private ProgressDialogUpdater progress;
boolean assumeSymmetric;
String passphrase;
private ProgressDialogUpdater progressDialogUpdater;
private boolean assumeSymmetric;
private String passphrase;
private long enforcedKeyId;
private PgpDecryptVerify(Builder builder) {
// private Constructor can only be called from Builder
@ -85,9 +87,10 @@ public class PgpDecryptVerify {
this.data = builder.data;
this.outStream = builder.outStream;
this.progress = builder.progress;
this.progressDialogUpdater = builder.progressDialogUpdater;
this.assumeSymmetric = builder.assumeSymmetric;
this.passphrase = builder.passphrase;
this.enforcedKeyId = builder.enforcedKeyId;
}
public static class Builder {
@ -97,9 +100,10 @@ public class PgpDecryptVerify {
private OutputStream outStream;
// optional
private ProgressDialogUpdater progress = null;
private ProgressDialogUpdater progressDialogUpdater = null;
private boolean assumeSymmetric = false;
private String passphrase = "";
private long enforcedKeyId = 0;
public Builder(Context context, InputData data, OutputStream outStream) {
this.context = context;
@ -107,8 +111,8 @@ public class PgpDecryptVerify {
this.outStream = outStream;
}
public Builder progress(ProgressDialogUpdater progress) {
this.progress = progress;
public Builder progressDialogUpdater(ProgressDialogUpdater progressDialogUpdater) {
this.progressDialogUpdater = progressDialogUpdater;
return this;
}
@ -122,20 +126,32 @@ public class PgpDecryptVerify {
return this;
}
/**
* Allow this key id alone for decryption.
* This means only ciphertexts encrypted for this private key can be decrypted.
*
* @param enforcedKeyId
* @return
*/
public Builder enforcedKeyId(long enforcedKeyId) {
this.enforcedKeyId = enforcedKeyId;
return this;
}
public PgpDecryptVerify build() {
return new PgpDecryptVerify(this);
}
}
public void updateProgress(int message, int current, int total) {
if (progress != null) {
progress.setProgress(message, current, total);
if (progressDialogUpdater != null) {
progressDialogUpdater.setProgress(message, current, total);
}
}
public void updateProgress(int current, int total) {
if (progress != null) {
progress.setProgress(current, total);
if (progressDialogUpdater != null) {
progressDialogUpdater.setProgress(current, total);
}
}
@ -177,9 +193,8 @@ public class PgpDecryptVerify {
* @throws PGPException
* @throws SignatureException
*/
public Bundle execute()
public PgpDecryptVerifyResult execute()
throws IOException, PgpGeneralException, PGPException, SignatureException {
// automatically works with ascii armor input and binary
InputStream in = PGPUtil.getDecoderStream(data.getInputStream());
if (in instanceof ArmoredInputStream) {
@ -207,9 +222,9 @@ public class PgpDecryptVerify {
* @throws PGPException
* @throws SignatureException
*/
private Bundle decryptVerify(InputStream in)
private PgpDecryptVerifyResult decryptVerify(InputStream in)
throws IOException, PgpGeneralException, PGPException, SignatureException {
Bundle returnData = new Bundle();
PgpDecryptVerifyResult returnData = new PgpDecryptVerifyResult();
PGPObjectFactory pgpF = new PGPObjectFactory(in);
PGPEncryptedDataList enc;
@ -277,9 +292,40 @@ public class PgpDecryptVerify {
PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) obj;
secretKey = ProviderHelper.getPGPSecretKeyByKeyId(context, encData.getKeyID());
if (secretKey != null) {
// secret key exists in database
// allow only a specific key for decryption?
if (enforcedKeyId != 0) {
// TODO: improve this code! get master key directly!
PGPSecretKeyRing secretKeyRing = ProviderHelper.getPGPSecretKeyRingByKeyId(context, encData.getKeyID());
long masterKeyId = PgpKeyHelper.getMasterKey(secretKeyRing).getKeyID();
Log.d(Constants.TAG, "encData.getKeyID():" + encData.getKeyID());
Log.d(Constants.TAG, "enforcedKeyId: " + enforcedKeyId);
Log.d(Constants.TAG, "masterKeyId: " + masterKeyId);
if (enforcedKeyId != masterKeyId) {
throw new PgpGeneralException(context.getString(R.string.error_no_secret_key_found));
}
}
pbe = encData;
// if no passphrase was explicitly set try to get it from the cache service
if (passphrase == null) {
// returns "" if key has no passphrase
passphrase = PassphraseCacheService.getCachedPassphrase(context, encData.getKeyID());
// if passphrase was not cached, return here indicating that a passphrase is missing!
if (passphrase == null) {
returnData.setKeyPassphraseNeeded(true);
return returnData;
}
}
break;
}
}
}
@ -317,6 +363,7 @@ public class PgpDecryptVerify {
PGPObjectFactory plainFact = new PGPObjectFactory(clear);
Object dataChunk = plainFact.nextObject();
PGPOnePassSignature signature = null;
OpenPgpSignatureResult signatureResult = null;
PGPPublicKey signatureKey = null;
int signatureIndex = -1;
@ -334,7 +381,7 @@ public class PgpDecryptVerify {
if (dataChunk instanceof PGPOnePassSignatureList) {
updateProgress(R.string.progress_processing_signature, currentProgress, 100);
returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE, true);
signatureResult = new OpenPgpSignatureResult();
PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) dataChunk;
for (int i = 0; i < sigList.size(); ++i) {
signature = sigList.get(i);
@ -354,12 +401,12 @@ public class PgpDecryptVerify {
if (signKeyRing != null) {
userId = PgpKeyHelper.getMainUserId(PgpKeyHelper.getMasterKey(signKeyRing));
}
returnData.putString(KeychainIntentService.RESULT_SIGNATURE_USER_ID, userId);
signatureResult.setUserId(userId);
break;
}
}
returnData.putLong(KeychainIntentService.RESULT_SIGNATURE_KEY_ID, signatureKeyId);
signatureResult.setKeyId(signatureKeyId);
if (signature != null) {
JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider()
@ -367,7 +414,7 @@ public class PgpDecryptVerify {
signature.init(contentVerifierBuilderProvider, signatureKey);
} else {
returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE_UNKNOWN, true);
signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY);
}
dataChunk = plainFact.nextObject();
@ -405,8 +452,7 @@ public class PgpDecryptVerify {
try {
signature.update(buffer, 0, n);
} catch (SignatureException e) {
returnData
.putBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS, false);
signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR);
signature = null;
}
}
@ -430,17 +476,20 @@ public class PgpDecryptVerify {
PGPSignature messageSignature = signatureList.get(signatureIndex);
// these are not cleartext signatures!
returnData.putBoolean(KeychainIntentService.RESULT_CLEARTEXT_SIGNATURE_ONLY, false);
// TODO: what about binary signatures?
signatureResult.setSignatureOnly(false);
//Now check binding signatures
boolean keyBinding_isok = verifyKeyBinding(context, messageSignature, signatureKey);
boolean sig_isok = signature.verify(messageSignature);
boolean validKeyBinding = verifyKeyBinding(context, messageSignature, signatureKey);
boolean validSignature = signature.verify(messageSignature);
returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS, keyBinding_isok & sig_isok);
// TODO: implement CERTIFIED!
if (validKeyBinding & validSignature) {
signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED);
}
}
}
// TODO: test if this integrity really check works!
if (encryptedData.isIntegrityProtected()) {
updateProgress(R.string.progress_verifying_integrity, 95, 100);
@ -455,9 +504,12 @@ public class PgpDecryptVerify {
} else {
// no integrity check
Log.e(Constants.TAG, "Encrypted data was not integrity protected!");
// TODO: inform user?
}
updateProgress(R.string.progress_done, 100, 100);
returnData.setSignatureResult(signatureResult);
return returnData;
}
@ -474,11 +526,12 @@ public class PgpDecryptVerify {
* @throws PGPException
* @throws SignatureException
*/
private Bundle verifyCleartextSignature(ArmoredInputStream aIn)
private PgpDecryptVerifyResult verifyCleartextSignature(ArmoredInputStream aIn)
throws IOException, PgpGeneralException, PGPException, SignatureException {
Bundle returnData = new Bundle();
PgpDecryptVerifyResult returnData = new PgpDecryptVerifyResult();
OpenPgpSignatureResult signatureResult = new OpenPgpSignatureResult();
// cleartext signatures are never encrypted ;)
returnData.putBoolean(KeychainIntentService.RESULT_CLEARTEXT_SIGNATURE_ONLY, true);
signatureResult.setSignatureOnly(true);
ByteArrayOutputStream out = new ByteArrayOutputStream();
@ -504,8 +557,6 @@ public class PgpDecryptVerify {
byte[] clearText = out.toByteArray();
outStream.write(clearText);
returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE, true);
updateProgress(R.string.progress_processing_signature, 60, 100);
PGPObjectFactory pgpFact = new PGPObjectFactory(aIn);
@ -533,15 +584,15 @@ public class PgpDecryptVerify {
if (signKeyRing != null) {
userId = PgpKeyHelper.getMainUserId(PgpKeyHelper.getMasterKey(signKeyRing));
}
returnData.putString(KeychainIntentService.RESULT_SIGNATURE_USER_ID, userId);
signatureResult.setUserId(userId);
break;
}
}
returnData.putLong(KeychainIntentService.RESULT_SIGNATURE_KEY_ID, signatureKeyId);
signatureResult.setKeyId(signatureKeyId);
if (signature == null) {
returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE_UNKNOWN, true);
signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY);
updateProgress(R.string.progress_done, 100, 100);
return returnData;
}
@ -569,47 +620,52 @@ public class PgpDecryptVerify {
} while (lookAhead != -1);
}
boolean sig_isok = signature.verify();
//Now check binding signatures
boolean keyBinding_isok = verifyKeyBinding(context, signature, signatureKey);
boolean validKeyBinding = verifyKeyBinding(context, signature, signatureKey);
boolean validSignature = signature.verify();
returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS, sig_isok & keyBinding_isok);
if (validSignature & validKeyBinding) {
signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED);
}
// TODO: what about SIGNATURE_SUCCESS_CERTIFIED and SIGNATURE_ERROR????
updateProgress(R.string.progress_done, 100, 100);
returnData.setSignatureResult(signatureResult);
return returnData;
}
private static boolean verifyKeyBinding(Context context, PGPSignature signature, PGPPublicKey signatureKey) {
long signatureKeyId = signature.getKeyID();
boolean keyBinding_isok = false;
String userId = null;
boolean validKeyBinding = false;
PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByKeyId(context,
signatureKeyId);
PGPPublicKey mKey = null;
if (signKeyRing != null) {
mKey = PgpKeyHelper.getMasterKey(signKeyRing);
}
if (signature.getKeyID() != mKey.getKeyID()) {
keyBinding_isok = verifyKeyBinding(mKey, signatureKey);
validKeyBinding = verifyKeyBinding(mKey, signatureKey);
} else { //if the key used to make the signature was the master key, no need to check binding sigs
keyBinding_isok = true;
validKeyBinding = true;
}
return keyBinding_isok;
return validKeyBinding;
}
private static boolean verifyKeyBinding(PGPPublicKey masterPublicKey, PGPPublicKey signingPublicKey) {
boolean subkeyBinding_isok = false;
boolean tmp_subkeyBinding_isok = false;
boolean primkeyBinding_isok = false;
JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider()
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
boolean validSubkeyBinding = false;
boolean validTempSubkeyBinding = false;
boolean validPrimaryKeyBinding = false;
JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider =
new JcaPGPContentVerifierBuilderProvider()
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
Iterator<PGPSignature> itr = signingPublicKey.getSignatures();
subkeyBinding_isok = false;
tmp_subkeyBinding_isok = false;
primkeyBinding_isok = false;
while (itr.hasNext()) { //what does gpg do if the subkey binding is wrong?
//gpg has an invalid subkey binding error on key import I think, but doesn't shout
//about keys without subkey signing. Can't get it to import a slightly broken one
@ -619,32 +675,36 @@ public class PgpDecryptVerify {
//check and if ok, check primary key binding.
try {
sig.init(contentVerifierBuilderProvider, masterPublicKey);
tmp_subkeyBinding_isok = sig.verifyCertification(masterPublicKey, signingPublicKey);
validTempSubkeyBinding = sig.verifyCertification(masterPublicKey, signingPublicKey);
} catch (PGPException e) {
continue;
} catch (SignatureException e) {
continue;
}
if (tmp_subkeyBinding_isok)
subkeyBinding_isok = true;
if (tmp_subkeyBinding_isok) {
primkeyBinding_isok = verifyPrimaryBinding(sig.getUnhashedSubPackets(), masterPublicKey, signingPublicKey);
if (primkeyBinding_isok)
if (validTempSubkeyBinding)
validSubkeyBinding = true;
if (validTempSubkeyBinding) {
validPrimaryKeyBinding = verifyPrimaryKeyBinding(sig.getUnhashedSubPackets(),
masterPublicKey, signingPublicKey);
if (validPrimaryKeyBinding)
break;
primkeyBinding_isok = verifyPrimaryBinding(sig.getHashedSubPackets(), masterPublicKey, signingPublicKey);
if (primkeyBinding_isok)
validPrimaryKeyBinding = verifyPrimaryKeyBinding(sig.getHashedSubPackets(),
masterPublicKey, signingPublicKey);
if (validPrimaryKeyBinding)
break;
}
}
}
return (subkeyBinding_isok & primkeyBinding_isok);
return (validSubkeyBinding & validPrimaryKeyBinding);
}
private static boolean verifyPrimaryBinding(PGPSignatureSubpacketVector Pkts, PGPPublicKey masterPublicKey, PGPPublicKey signingPublicKey) {
boolean primkeyBinding_isok = false;
JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider()
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
private static boolean verifyPrimaryKeyBinding(PGPSignatureSubpacketVector Pkts,
PGPPublicKey masterPublicKey, PGPPublicKey signingPublicKey) {
boolean validPrimaryKeyBinding = false;
JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider =
new JcaPGPContentVerifierBuilderProvider()
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
PGPSignatureList eSigList;
if (Pkts.hasSubpacket(SignatureSubpacketTags.EMBEDDED_SIGNATURE)) {
@ -660,8 +720,8 @@ public class PgpDecryptVerify {
if (emSig.getSignatureType() == PGPSignature.PRIMARYKEY_BINDING) {
try {
emSig.init(contentVerifierBuilderProvider, signingPublicKey);
primkeyBinding_isok = emSig.verifyCertification(masterPublicKey, signingPublicKey);
if (primkeyBinding_isok)
validPrimaryKeyBinding = emSig.verifyCertification(masterPublicKey, signingPublicKey);
if (validPrimaryKeyBinding)
break;
} catch (PGPException e) {
continue;
@ -671,7 +731,8 @@ public class PgpDecryptVerify {
}
}
}
return primkeyBinding_isok;
return validPrimaryKeyBinding;
}
/**

View File

@ -0,0 +1,88 @@
/*
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.sufficientlysecure.keychain.pgp;
import android.os.Parcel;
import android.os.Parcelable;
import org.openintents.openpgp.OpenPgpSignatureResult;
public class PgpDecryptVerifyResult implements Parcelable {
boolean symmetricPassphraseNeeded;
boolean keyPassphraseNeeded;
OpenPgpSignatureResult signatureResult;
public boolean isSymmetricPassphraseNeeded() {
return symmetricPassphraseNeeded;
}
public void setSymmetricPassphraseNeeded(boolean symmetricPassphraseNeeded) {
this.symmetricPassphraseNeeded = symmetricPassphraseNeeded;
}
public boolean isKeyPassphraseNeeded() {
return keyPassphraseNeeded;
}
public void setKeyPassphraseNeeded(boolean keyPassphraseNeeded) {
this.keyPassphraseNeeded = keyPassphraseNeeded;
}
public OpenPgpSignatureResult getSignatureResult() {
return signatureResult;
}
public void setSignatureResult(OpenPgpSignatureResult signatureResult) {
this.signatureResult = signatureResult;
}
public PgpDecryptVerifyResult() {
}
public PgpDecryptVerifyResult(PgpDecryptVerifyResult b) {
this.symmetricPassphraseNeeded = b.symmetricPassphraseNeeded;
this.keyPassphraseNeeded = b.keyPassphraseNeeded;
this.signatureResult = b.signatureResult;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeByte((byte) (symmetricPassphraseNeeded ? 1 : 0));
dest.writeByte((byte) (keyPassphraseNeeded ? 1 : 0));
dest.writeParcelable(signatureResult, 0);
}
public static final Creator<PgpDecryptVerifyResult> CREATOR = new Creator<PgpDecryptVerifyResult>() {
public PgpDecryptVerifyResult createFromParcel(final Parcel source) {
PgpDecryptVerifyResult vr = new PgpDecryptVerifyResult();
vr.symmetricPassphraseNeeded = source.readByte() == 1;
vr.keyPassphraseNeeded = source.readByte() == 1;
vr.signatureResult = source.readParcelable(OpenPgpSignatureResult.class.getClassLoader());
return vr;
}
public PgpDecryptVerifyResult[] newArray(final int size) {
return new PgpDecryptVerifyResult[size];
}
};
}

View File

@ -44,6 +44,7 @@ import org.sufficientlysecure.keychain.helper.OtherHelper;
import org.sufficientlysecure.keychain.helper.Preferences;
import org.sufficientlysecure.keychain.pgp.PgpConversionHelper;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.pgp.PgpImportExport;
import org.sufficientlysecure.keychain.pgp.PgpKeyOperation;
@ -181,13 +182,7 @@ public class KeychainIntentService extends IntentService implements ProgressDial
// decrypt/verify
public static final String RESULT_DECRYPTED_STRING = "decrypted_message";
public static final String RESULT_DECRYPTED_BYTES = "decrypted_data";
public static final String RESULT_SIGNATURE = "signature";
public static final String RESULT_SIGNATURE_KEY_ID = "signature_key_id";
public static final String RESULT_SIGNATURE_USER_ID = "signature_user_id";
public static final String RESULT_CLEARTEXT_SIGNATURE_ONLY = "signature_only";
public static final String RESULT_SIGNATURE_SUCCESS = "signature_success";
public static final String RESULT_SIGNATURE_UNKNOWN = "signature_unknown";
public static final String RESULT_DECRYPT_VERIFY_RESULT = "signature";
// import
public static final String RESULT_IMPORT_ADDED = "added";
@ -206,7 +201,7 @@ public class KeychainIntentService extends IntentService implements ProgressDial
private boolean mIsCanceled;
public KeychainIntentService() {
super("ApgService");
super("KeychainIntentService");
}
@Override
@ -489,15 +484,17 @@ public class KeychainIntentService extends IntentService implements ProgressDial
// verifyText and decrypt returning additional resultData values for the
// verification of signatures
PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(this, inputData, outStream);
builder.progress(this);
builder.progressDialogUpdater(this);
builder.assumeSymmetric(assumeSymmetricEncryption)
.passphrase(PassphraseCacheService.getCachedPassphrase(this, secretKeyId));
resultData = builder.build().execute();
PgpDecryptVerifyResult decryptVerifyResult = builder.build().execute();
outStream.close();
resultData.putParcelable(RESULT_DECRYPT_VERIFY_RESULT, decryptVerifyResult);
/* Output */
switch (target) {
@ -867,10 +864,10 @@ public class KeychainIntentService extends IntentService implements ProgressDial
}
/**
* Set progress of ProgressDialog by sending message to handler on UI thread
* Set progressDialogUpdater of ProgressDialog by sending message to handler on UI thread
*/
public void setProgress(String message, int progress, int max) {
Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max="
Log.d(Constants.TAG, "Send message by setProgress with progressDialogUpdater=" + progress + ", max="
+ max);
Bundle data = new Bundle();

View File

@ -21,7 +21,6 @@ import android.app.PendingIntent;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
@ -33,9 +32,10 @@ import org.spongycastle.util.Arrays;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
import org.sufficientlysecure.keychain.pgp.PgpSignEncrypt;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
@ -284,97 +284,29 @@ public class OpenPgpService extends RemoteService {
Intent result = new Intent();
try {
// TODO:
// fix the mess: http://stackoverflow.com/questions/148130/how-do-i-peek-at-the-first-two-bytes-in-an-inputstream
// should we allow to decrypt everything under every key id or only the one set?
// TODO: instead of trying to get the passphrase before
// pause stream when passphrase is missing and then resume
// TODO: put this code into PgpDecryptVerify class
// TODO: This allows to decrypt messages with ALL secret keys, not only the one for the
// app, Fix this?
// String passphrase = null;
// if (!signedOnly) {
// // BEGIN Get key
// // TODO: this input stream is consumed after PgpMain.getDecryptionKeyId()... do it
// // better!
// InputStream inputStream2 = new ByteArrayInputStream(inputBytes);
//
// // TODO: duplicates functions from DecryptActivity!
// long secretKeyId;
// try {
// if (inputStream2.markSupported()) {
// // should probably set this to the max size of two
// // pgpF objects, if it even needs to be anything other
// // than 0.
// inputStream2.mark(200);
// }
// secretKeyId = PgpHelper.getDecryptionKeyId(this, inputStream2);
// if (secretKeyId == Id.key.none) {
// throw new PgpGeneralException(getString(R.string.error_no_secret_key_found));
// }
// } catch (NoAsymmetricEncryptionException e) {
// if (inputStream2.markSupported()) {
// inputStream2.reset();
// }
// secretKeyId = Id.key.symmetric;
// if (!PgpDecryptVerify.hasSymmetricEncryption(this, inputStream2)) {
// throw new PgpGeneralException(
// getString(R.string.error_no_known_encryption_found));
// }
// // we do not support symmetric decryption from the API!
// throw new Exception("Symmetric decryption is not supported!");
// }
//
// Log.d(Constants.TAG, "secretKeyId " + secretKeyId);
// NOTE: currently this only gets the passphrase for the key set for this client
String passphrase;
if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
} else {
passphrase = PassphraseCacheService.getCachedPassphrase(getContext(), appSettings.getKeyId());
}
if (passphrase == null) {
// get PendingIntent for passphrase input, add it to given params and return to client
Intent passphraseBundle = getPassphraseBundleIntent(data, appSettings.getKeyId());
return passphraseBundle;
}
String passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
long inputLength = is.available();
InputData inputData = new InputData(is, inputLength);
Bundle outputBundle;
PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(this, inputData, os);
builder.assumeSymmetric(false)
builder.assumeSymmetric(false) // no support for symmetric encryption
.enforcedKeyId(appSettings.getKeyId()) // allow only the private key for this app for decryption
.passphrase(passphrase);
// TODO: this also decrypts with other secret keys that have no passphrase!!!
outputBundle = builder.build().execute();
// TODO: currently does not support binary signed-only content
PgpDecryptVerifyResult decryptVerifyResult = builder.build().execute();
//TODO: instead of using all these wrapping use OpenPgpSignatureResult directly
// in DecryptVerify class and then in DecryptActivity
boolean signature = outputBundle.getBoolean(KeychainIntentService.RESULT_SIGNATURE, false);
if (signature) {
long signatureKeyId = outputBundle
.getLong(KeychainIntentService.RESULT_SIGNATURE_KEY_ID, 0);
String signatureUserId = outputBundle
.getString(KeychainIntentService.RESULT_SIGNATURE_USER_ID);
boolean signatureSuccess = outputBundle
.getBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS, false);
boolean signatureUnknown = outputBundle
.getBoolean(KeychainIntentService.RESULT_SIGNATURE_UNKNOWN, false);
boolean signatureOnly = outputBundle
.getBoolean(KeychainIntentService.RESULT_CLEARTEXT_SIGNATURE_ONLY, false);
int signatureStatus = OpenPgpSignatureResult.SIGNATURE_ERROR;
if (signatureSuccess) {
signatureStatus = OpenPgpSignatureResult.SIGNATURE_SUCCESS_CERTIFIED;
} else if (signatureUnknown) {
signatureStatus = OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY;
if (decryptVerifyResult.isKeyPassphraseNeeded()) {
// get PendingIntent for passphrase input, add it to given params and return to client
Intent passphraseBundle = getPassphraseBundleIntent(data, appSettings.getKeyId());
return passphraseBundle;
} else if (decryptVerifyResult.isSymmetricPassphraseNeeded()) {
throw new PgpGeneralException("Decryption of symmetric content not supported by API!");
}
OpenPgpSignatureResult signatureResult = decryptVerifyResult.getSignatureResult();
if (signatureResult != null) {
if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY) {
// If signature is unknown we return an additional PendingIntent
// to retrieve the missing key
// TODO!!!
@ -389,11 +321,9 @@ public class OpenPgpService extends RemoteService {
result.putExtra(OpenPgpApi.RESULT_INTENT, pi);
}
OpenPgpSignatureResult sigResult = new OpenPgpSignatureResult(signatureStatus,
signatureUserId, signatureOnly, signatureKeyId);
result.putExtra(OpenPgpApi.RESULT_SIGNATURE, sigResult);
result.putExtra(OpenPgpApi.RESULT_SIGNATURE, signatureResult);
}
} finally {
is.close();
os.close();

View File

@ -25,6 +25,7 @@ import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.regex.Matcher;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id;
@ -32,6 +33,7 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
import org.sufficientlysecure.keychain.helper.ActionBarHelper;
import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
@ -690,11 +692,15 @@ public class DecryptActivity extends DrawerActivity {
}
if (returnData.getBoolean(KeychainIntentService.RESULT_SIGNATURE)) {
String userId = returnData
.getString(KeychainIntentService.RESULT_SIGNATURE_USER_ID);
mSignatureKeyId = returnData
.getLong(KeychainIntentService.RESULT_SIGNATURE_KEY_ID);
PgpDecryptVerifyResult decryptVerifyResult =
returnData.getParcelable(KeychainIntentService.RESULT_DECRYPT_VERIFY_RESULT);
OpenPgpSignatureResult signatureResult = decryptVerifyResult.getSignatureResult();
if (signatureResult != null) {
String userId = signatureResult.getUserId();
mSignatureKeyId = signatureResult.getKeyId();
mUserIdRest.setText("id: "
+ PgpKeyHelper.convertKeyIdToHex(mSignatureKeyId));
if (userId == null) {
@ -707,19 +713,32 @@ public class DecryptActivity extends DrawerActivity {
}
mUserId.setText(userId);
if (returnData.getBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS)) {
mSignatureStatusImage.setImageResource(R.drawable.overlay_ok);
mLookupKey.setVisibility(View.GONE);
} else if (returnData
.getBoolean(KeychainIntentService.RESULT_SIGNATURE_UNKNOWN)) {
mSignatureStatusImage.setImageResource(R.drawable.overlay_error);
mLookupKey.setVisibility(View.VISIBLE);
AppMsg.makeText(DecryptActivity.this,
R.string.unknown_signature,
AppMsg.STYLE_ALERT).show();
} else {
mSignatureStatusImage.setImageResource(R.drawable.overlay_error);
mLookupKey.setVisibility(View.GONE);
switch (signatureResult.getStatus()) {
case OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED: {
mSignatureStatusImage.setImageResource(R.drawable.overlay_ok);
mLookupKey.setVisibility(View.GONE);
break;
}
// TODO!
// case OpenPgpSignatureResult.SIGNATURE_SUCCESS_CERTIFIED: {
// break;
// }
case OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY: {
mSignatureStatusImage.setImageResource(R.drawable.overlay_error);
mLookupKey.setVisibility(View.VISIBLE);
AppMsg.makeText(DecryptActivity.this,
R.string.unknown_signature,
AppMsg.STYLE_ALERT).show();
break;
}
default: {
mSignatureStatusImage.setImageResource(R.drawable.overlay_error);
mLookupKey.setVisibility(View.GONE);
break;
}
}
mSignatureLayout.setVisibility(View.VISIBLE);
}

View File

@ -24,24 +24,28 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.Preferences;
import org.sufficientlysecure.keychain.ui.widget.IntegerListPreference;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.support.v7.app.ActionBarActivity;
import java.util.List;
@SuppressLint("NewApi")
public class PreferencesActivity extends PreferenceActivity {
private IntegerListPreference mPassPhraseCacheTtl = null;
private IntegerListPreference mEncryptionAlgorithm = null;
private IntegerListPreference mHashAlgorithm = null;
private IntegerListPreference mMessageCompression = null;
private IntegerListPreference mFileCompression = null;
private CheckBoxPreference mAsciiArmour = null;
private CheckBoxPreference mForceV3Signatures = null;
public final static String ACTION_PREFS_GEN = "org.sufficientlysecure.keychain.ui.PREFS_GEN";
public final static String ACTION_PREFS_ADV = "org.sufficientlysecure.keychain.ui.PREFS_ADV";
private PreferenceScreen mKeyServerPreference = null;
private Preferences mPreferences;
private static Preferences mPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -53,9 +57,205 @@ public class PreferencesActivity extends PreferenceActivity {
// actionBar.setDisplayHomeAsUpEnabled(false);
// actionBar.setHomeButtonEnabled(false);
addPreferencesFromResource(R.xml.preferences);
//addPreferencesFromResource(R.xml.preferences);
String action = getIntent().getAction();
mPassPhraseCacheTtl = (IntegerListPreference) findPreference(Constants.pref.PASS_PHRASE_CACHE_TTL);
if (action != null && action.equals(ACTION_PREFS_GEN)) {
addPreferencesFromResource(R.xml.gen_preferences);
initializePassPassPhraceCacheTtl(
(IntegerListPreference) findPreference(Constants.pref.PASS_PHRASE_CACHE_TTL));
mKeyServerPreference = (PreferenceScreen) findPreference(Constants.pref.KEY_SERVERS);
String servers[] = mPreferences.getKeyServers();
mKeyServerPreference.setSummary(getResources().getQuantityString(R.plurals.n_key_servers,
servers.length, servers.length));
mKeyServerPreference
.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(PreferencesActivity.this,
PreferencesKeyServerActivity.class);
intent.putExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS,
mPreferences.getKeyServers());
startActivityForResult(intent, Id.request.key_server_preference);
return false;
}
});
} else if (action != null && action.equals(ACTION_PREFS_ADV)) {
addPreferencesFromResource(R.xml.adv_preferences);
initializeEncryptionAlgorithm(
(IntegerListPreference) findPreference(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM));
int[] valueIds = new int[] { Id.choice.compression.none, Id.choice.compression.zip,
Id.choice.compression.zlib, Id.choice.compression.bzip2, };
String[] entries = new String[] {
getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")",
"ZIP (" + getString(R.string.compression_fast) + ")",
"ZLIB (" + getString(R.string.compression_fast) + ")",
"BZIP2 (" + getString(R.string.compression_very_slow) + ")", };
String[] values = new String[valueIds.length];
for (int i = 0; i < values.length; ++i) {
values[i] = "" + valueIds[i];
}
initializeHashAlgorithm(
(IntegerListPreference) findPreference(Constants.pref.DEFAULT_HASH_ALGORITHM),
valueIds, entries, values);
initializeMessageCompression(
(IntegerListPreference) findPreference(Constants.pref.DEFAULT_MESSAGE_COMPRESSION),
valueIds, entries, values);
initializeFileCompression(
(IntegerListPreference) findPreference(Constants.pref.DEFAULT_FILE_COMPRESSION),
entries, values);
initializeAsciiArmour((CheckBoxPreference) findPreference(Constants.pref.DEFAULT_ASCII_ARMOUR));
initializeForceV3Signatures((CheckBoxPreference) findPreference(Constants.pref.FORCE_V3_SIGNATURES));
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
// Load the legacy preferences headers
addPreferencesFromResource(R.xml.preference_headers_legacy);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case Id.request.key_server_preference: {
if (resultCode == RESULT_CANCELED || data == null) {
return;
}
String servers[] = data
.getStringArrayExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS);
mPreferences.setKeyServers(servers);
mKeyServerPreference.setSummary(getResources().getQuantityString(
R.plurals.n_key_servers, servers.length, servers.length));
break;
}
default: {
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
}
/* Called only on Honeycomb and later */
@Override
public void onBuildHeaders(List<Header> target) {
super.onBuildHeaders(target);
loadHeadersFromResource(R.xml.preference_headers, target);
}
/** This fragment shows the general preferences in android 3.0+ */
public static class GeneralPrefsFragment extends PreferenceFragment {
private PreferenceScreen mKeyServerPreference = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.gen_preferences);
initializePassPassPhraceCacheTtl(
(IntegerListPreference) findPreference(Constants.pref.PASS_PHRASE_CACHE_TTL));
mKeyServerPreference = (PreferenceScreen) findPreference(Constants.pref.KEY_SERVERS);
String servers[] = mPreferences.getKeyServers();
mKeyServerPreference.setSummary(getResources().getQuantityString(R.plurals.n_key_servers,
servers.length, servers.length));
mKeyServerPreference
.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(getActivity(),
PreferencesKeyServerActivity.class);
intent.putExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS,
mPreferences.getKeyServers());
startActivityForResult(intent, Id.request.key_server_preference);
return false;
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case Id.request.key_server_preference: {
if (resultCode == RESULT_CANCELED || data == null) {
return;
}
String servers[] = data
.getStringArrayExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS);
mPreferences.setKeyServers(servers);
mKeyServerPreference.setSummary(getResources().getQuantityString(
R.plurals.n_key_servers, servers.length, servers.length));
break;
}
default: {
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
}
}
/** This fragment shows the advanced preferences in android 3.0+ */
public static class AdvancedPrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.adv_preferences);
initializeEncryptionAlgorithm(
(IntegerListPreference) findPreference(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM));
int[] valueIds = new int[] { Id.choice.compression.none, Id.choice.compression.zip,
Id.choice.compression.zlib, Id.choice.compression.bzip2, };
String[] entries = new String[] {
getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")",
"ZIP (" + getString(R.string.compression_fast) + ")",
"ZLIB (" + getString(R.string.compression_fast) + ")",
"BZIP2 (" + getString(R.string.compression_very_slow) + ")", };
String[] values = new String[valueIds.length];
for (int i = 0; i < values.length; ++i) {
values[i] = "" + valueIds[i];
}
initializeHashAlgorithm(
(IntegerListPreference) findPreference(Constants.pref.DEFAULT_HASH_ALGORITHM),
valueIds, entries, values);
initializeMessageCompression(
(IntegerListPreference) findPreference(Constants.pref.DEFAULT_MESSAGE_COMPRESSION),
valueIds, entries, values);
initializeFileCompression(
(IntegerListPreference) findPreference(Constants.pref.DEFAULT_FILE_COMPRESSION),
entries, values);
initializeAsciiArmour((CheckBoxPreference) findPreference(Constants.pref.DEFAULT_ASCII_ARMOUR));
initializeForceV3Signatures((CheckBoxPreference) findPreference(Constants.pref.FORCE_V3_SIGNATURES));
}
}
protected boolean isValidFragment (String fragmentName) {
return AdvancedPrefsFragment.class.getName().equals(fragmentName)
|| GeneralPrefsFragment.class.getName().equals(fragmentName)
|| super.isValidFragment(fragmentName);
}
private static void initializePassPassPhraceCacheTtl(final IntegerListPreference mPassPhraseCacheTtl) {
mPassPhraseCacheTtl.setValue("" + mPreferences.getPassPhraseCacheTtl());
mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry());
mPassPhraseCacheTtl
@ -67,8 +267,9 @@ public class PreferencesActivity extends PreferenceActivity {
return false;
}
});
}
mEncryptionAlgorithm = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM);
private static void initializeEncryptionAlgorithm(final IntegerListPreference mEncryptionAlgorithm) {
int valueIds[] = { PGPEncryptedData.AES_128, PGPEncryptedData.AES_192,
PGPEncryptedData.AES_256, PGPEncryptedData.BLOWFISH, PGPEncryptedData.TWOFISH,
PGPEncryptedData.CAST5, PGPEncryptedData.DES, PGPEncryptedData.TRIPLE_DES,
@ -93,8 +294,10 @@ public class PreferencesActivity extends PreferenceActivity {
return false;
}
});
}
mHashAlgorithm = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_HASH_ALGORITHM);
private static void initializeHashAlgorithm
(final IntegerListPreference mHashAlgorithm, int[] valueIds, String[] entries, String[] values) {
valueIds = new int[] { HashAlgorithmTags.MD5, HashAlgorithmTags.RIPEMD160,
HashAlgorithmTags.SHA1, HashAlgorithmTags.SHA224, HashAlgorithmTags.SHA256,
HashAlgorithmTags.SHA384, HashAlgorithmTags.SHA512, };
@ -116,19 +319,10 @@ public class PreferencesActivity extends PreferenceActivity {
return false;
}
});
}
mMessageCompression = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_MESSAGE_COMPRESSION);
valueIds = new int[] { Id.choice.compression.none, Id.choice.compression.zip,
Id.choice.compression.zlib, Id.choice.compression.bzip2, };
entries = new String[] {
getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")",
"ZIP (" + getString(R.string.compression_fast) + ")",
"ZLIB (" + getString(R.string.compression_fast) + ")",
"BZIP2 (" + getString(R.string.compression_very_slow) + ")", };
values = new String[valueIds.length];
for (int i = 0; i < values.length; ++i) {
values[i] = "" + valueIds[i];
}
private static void initializeMessageCompression
(final IntegerListPreference mMessageCompression, int[] valueIds, String[] entries, String[] values) {
mMessageCompression.setEntries(entries);
mMessageCompression.setEntryValues(values);
mMessageCompression.setValue("" + mPreferences.getDefaultMessageCompression());
@ -143,8 +337,10 @@ public class PreferencesActivity extends PreferenceActivity {
return false;
}
});
}
mFileCompression = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_FILE_COMPRESSION);
private static void initializeFileCompression
(final IntegerListPreference mFileCompression, String[] entries, String[] values) {
mFileCompression.setEntries(entries);
mFileCompression.setEntryValues(values);
mFileCompression.setValue("" + mPreferences.getDefaultFileCompression());
@ -157,8 +353,9 @@ public class PreferencesActivity extends PreferenceActivity {
return false;
}
});
}
mAsciiArmour = (CheckBoxPreference) findPreference(Constants.pref.DEFAULT_ASCII_ARMOUR);
private static void initializeAsciiArmour(final CheckBoxPreference mAsciiArmour) {
mAsciiArmour.setChecked(mPreferences.getDefaultAsciiArmour());
mAsciiArmour.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
@ -167,8 +364,9 @@ public class PreferencesActivity extends PreferenceActivity {
return false;
}
});
}
mForceV3Signatures = (CheckBoxPreference) findPreference(Constants.pref.FORCE_V3_SIGNATURES);
private static void initializeForceV3Signatures(final CheckBoxPreference mForceV3Signatures) {
mForceV3Signatures.setChecked(mPreferences.getForceV3Signatures());
mForceV3Signatures
.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@ -178,43 +376,5 @@ public class PreferencesActivity extends PreferenceActivity {
return false;
}
});
mKeyServerPreference = (PreferenceScreen) findPreference(Constants.pref.KEY_SERVERS);
String servers[] = mPreferences.getKeyServers();
mKeyServerPreference.setSummary(getResources().getQuantityString(R.plurals.n_key_servers,
servers.length, servers.length));
mKeyServerPreference
.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(PreferencesActivity.this,
PreferencesKeyServerActivity.class);
intent.putExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS,
mPreferences.getKeyServers());
startActivityForResult(intent, Id.request.key_server_preference);
return false;
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case Id.request.key_server_preference: {
if (resultCode == RESULT_CANCELED || data == null) {
return;
}
String servers[] = data
.getStringArrayExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS);
mPreferences.setKeyServers(servers);
mKeyServerPreference.setSummary(getResources().getQuantityString(
R.plurals.n_key_servers, servers.length, servers.length));
break;
}
default: {
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
}
}
}

View File

@ -34,6 +34,7 @@ import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
@ -58,6 +59,7 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener {
Spinner mUsage;
TextView mCreationDate;
BootstrapButton mExpiryDateButton;
GregorianCalendar mCreatedDate;
GregorianCalendar mExpiryDate;
private int mDatePickerResultCount = 0;
@ -133,10 +135,21 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener {
}
}
});
// setCalendarViewShown() is supported from API 11 onwards.
if (android.os.Build.VERSION.SDK_INT >= 11)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB)
// Hide calendarView in tablets because of the unix warparound bug.
dialog.getDatePicker().setCalendarViewShown(false);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
if ( dialog != null && mCreatedDate != null ) {
dialog.getDatePicker().setMinDate(mCreatedDate.getTime().getTime()+ DateUtils.DAY_IN_MILLIS);
} else {
//When created date isn't available
dialog.getDatePicker().setMinDate(date.getTime().getTime()+ DateUtils.DAY_IN_MILLIS);
}
}
dialog.show();
}
});
@ -213,7 +226,7 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener {
GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTime(PgpKeyHelper.getCreationDate(key));
mCreationDate.setText(DateFormat.getDateInstance().format(cal.getTime()));
setCreatedDate(cal);
cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
Date expiryDate = PgpKeyHelper.getExpiryDate(key);
if (expiryDate == null) {
@ -243,6 +256,15 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener {
mEditorListener = listener;
}
private void setCreatedDate(GregorianCalendar date) {
mCreatedDate = date;
if (date == null) {
mCreationDate.setText(getContext().getString(R.string.none));
} else {
mCreationDate.setText(DateFormat.getDateInstance().format(date.getTime()));
}
}
private void setExpiryDate(GregorianCalendar date) {
mExpiryDate = date;
if (date == null) {

View File

@ -1,6 +1,8 @@
/*
* Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
* Copyright (C) 2011 Thialfihar <thi@thialfihar.org>
* Copyright (C) 2011 Senecaso
*
*
* 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

View File

@ -1,6 +1,8 @@
/*
* Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
* Copyright (C) 2011 Thialfihar <thi@thialfihar.org>
* Copyright (C) 2011 Senecaso
*
*
* 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
@ -16,14 +18,8 @@
package org.sufficientlysecure.keychain.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
public abstract class KeyServer {

View File

@ -2,7 +2,7 @@
<head></head>
<body>
<p><a href="http://www.openkeychain.org">http://www.openkeychain.org</a></p>
<p><a href="http://www.openkeychain.org">OpenKeychain</a> is an OpenPGP implementation for Android.</p>
<p><a href="http://www.openkeychain.org">OpenKeychain</a> ist eine OpenPGP implementation für Android.</p>
<p>Lizenz: GPLv3+</p>
<h2>Entwickler OpenKeychain</h2>

View File

@ -86,7 +86,7 @@
</ul>
<h2>1.0.2</h2>
<ul>
<li>filterable key lists</li>
<li>Filterbare Schlüsselliste</li>
<li>smarter pre-selection of encryption keys</li>
<li>new Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers</li>
<li>fixes and additional features (key preselection) for K-9 Mail, new beta build available</li>

View File

@ -15,7 +15,7 @@
<string name="title_key_server_preference">Schlüsselserver</string>
<string name="title_change_pass_phrase">Passwort ändern</string>
<string name="title_set_passphrase">Passwort setzen</string>
<string name="title_send_email">E-Mail senden...</string>
<string name="title_send_email">E-Mail senden</string>
<string name="title_encrypt_to_file">In eine Datei verschlüsseln</string>
<string name="title_decrypt_to_file">In eine Datei entschlüsseln</string>
<string name="title_import_keys">Schlüssel importieren</string>
@ -163,7 +163,7 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
<string name="filemanager_title_open">Öffnen...</string>
<string name="filemanager_title_open">Öffnen</string>
<string name="warning">Warnung</string>
<string name="error">Fehler</string>
<string name="error_message">Fehler: %s</string>
@ -266,46 +266,47 @@
<string name="error_expiry_must_come_after_creation">Ablaufdatum muss später sein als das Erstellungsdatum</string>
<string name="error_can_not_delete_contact">Sie können diesen Kontakt nicht löschen, denn es ist ihr eigener.</string>
<string name="error_can_not_delete_contacts">Sie können folgende Kontakte nicht löschen, denn sie gehören Ihnen selbst:\n%s</string>
<string name="error_keyserver_query">Keyserveranfrage fehlgeschlagen</string>
<plurals name="error_can_not_delete_info">
<item quantity="one">Bitte lösche ihn unter \'Meine Schlüssel\'!</item>
<item quantity="other">Bitte lösche sie unter \'Meine Schlüssel\'!</item>
</plurals>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">fertig.</string>
<string name="progress_saving">speichern...</string>
<string name="progress_importing">importieren...</string>
<string name="progress_exporting">exportieren...</string>
<string name="progress_generating">erstelle Schlüssel, dies kann bis zu 3 Minuten dauern...</string>
<string name="progress_building_key">erstelle Schlüssel...</string>
<string name="progress_preparing_master_key">Hauptschlüssel wird vorbereitet...</string>
<string name="progress_certifying_master_key">Hauptschlüssel wird beglaubigt...</string>
<string name="progress_building_master_key">erstelle Hauptring...</string>
<string name="progress_adding_sub_keys">füge Unterschlüssel hinzu...</string>
<string name="progress_saving_key_ring">Schlüssel wird gespeichert...</string>
<string name="progress_saving">speichern</string>
<string name="progress_importing">importieren</string>
<string name="progress_exporting">exportieren</string>
<string name="progress_generating">erstelle Schlüssel, dies kann bis zu 3 Minuten dauern</string>
<string name="progress_building_key">erstelle Schlüssel</string>
<string name="progress_preparing_master_key">Hauptschlüssel wird vorbereitet</string>
<string name="progress_certifying_master_key">Hauptschlüssel wird beglaubigt</string>
<string name="progress_building_master_key">erstelle Hauptring</string>
<string name="progress_adding_sub_keys">füge Unterschlüssel hinzu</string>
<string name="progress_saving_key_ring">Schlüssel wird gespeichert</string>
<plurals name="progress_exporting_key">
<item quantity="one">Schlüssel wird exportiert…</item>
<item quantity="other">Schlüssel werden exportiert…</item>
</plurals>
<string name="progress_extracting_signature_key">extrahiere Signaturschlüssel...</string>
<string name="progress_extracting_key">extrahiere Schlüssel...</string>
<string name="progress_preparing_streams">Datenstrom wird vorbereitet...</string>
<string name="progress_encrypting">Daten werden verschlüsselt...</string>
<string name="progress_decrypting">Daten werden entschlüsselt...</string>
<string name="progress_preparing_signature">Signatur wird vorbereitet...</string>
<string name="progress_generating_signature">Signatur wird erstellt...</string>
<string name="progress_processing_signature">Signatur wird verarbeitet...</string>
<string name="progress_verifying_signature">Signatur wird verifiziert...</string>
<string name="progress_signing">signiere...</string>
<string name="progress_reading_data">Daten werden gelesen...</string>
<string name="progress_finding_key">Schlüssel wird gesucht...</string>
<string name="progress_decompressing_data">Daten werden entpackt...</string>
<string name="progress_verifying_integrity">Integrität wird überprüft...</string>
<string name="progress_deleting_securely">\'%s\' wird sicher gelöscht...</string>
<string name="progress_querying">Anfrage wird gestellt...</string>
<string name="progress_extracting_signature_key">extrahiere Signaturschlüssel</string>
<string name="progress_extracting_key">extrahiere Schlüssel</string>
<string name="progress_preparing_streams">Datenstrom wird vorbereitet</string>
<string name="progress_encrypting">Daten werden verschlüsselt</string>
<string name="progress_decrypting">Daten werden entschlüsselt</string>
<string name="progress_preparing_signature">Signatur wird vorbereitet</string>
<string name="progress_generating_signature">Signatur wird erstellt</string>
<string name="progress_processing_signature">Signatur wird verarbeitet</string>
<string name="progress_verifying_signature">Signatur wird verifiziert</string>
<string name="progress_signing">signiere</string>
<string name="progress_reading_data">Daten werden gelesen</string>
<string name="progress_finding_key">Schlüssel wird gesucht</string>
<string name="progress_decompressing_data">Daten werden entpackt</string>
<string name="progress_verifying_integrity">Integrität wird überprüft</string>
<string name="progress_deleting_securely">\'%s\' wird sicher gelöscht</string>
<string name="progress_querying">Anfrage wird gestellt</string>
<!--action strings-->
<string name="hint_public_keys">Öffentliche Schlüssel suchen</string>
<string name="hint_secret_keys">Private Schlüssel suchen</string>
<string name="action_share_key_with">Teile Schlüssel über...</string>
<string name="action_share_key_with">Teile Schlüssel über</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_1024">1024</string>
@ -337,10 +338,6 @@
<string name="import_nfc_help_button">Hilfe</string>
<string name="import_clipboard_button">Füge den Schlüssel aus der Zwischenablage ein</string>
<!--Intent labels-->
<string name="intent_decrypt_file">OpenKeychain: Datei entschlüsseln</string>
<string name="intent_import_key">OpenKeychain: Schlüssel importieren</string>
<string name="intent_send_encrypt">OpenKeychain: Verschlüsseln</string>
<string name="intent_send_decrypt">OpenKeychain: Entschlüsseln</string>
<!--Remote API-->
<string name="api_no_apps">Keine registrierten Anwendungen vorhanden!\n\nAnwendungen von Dritten können Zugriff auf OpenKeychain erbitten. Nachdem Zugriff gewährt wurde, werden diese hier aufgelistet.</string>
<string name="api_settings_show_advanced">Erweiterte Einstellungen anzeigen</string>

View File

@ -12,7 +12,7 @@
<string name="title_api_registered_apps">Aplicaciones registradas</string>
<string name="title_change_pass_phrase">Cambiar contraseña</string>
<string name="title_set_passphrase">Establecer contraseña</string>
<string name="title_send_email">Enviar correo electrónico...</string>
<string name="title_send_email">Enviar correo electrónico</string>
<string name="title_encrypt_to_file">Cifrar a archivo</string>
<string name="title_decrypt_to_file">Descifrar a archivo</string>
<string name="title_import_keys">Importar claves</string>

View File

@ -15,7 +15,7 @@
<string name="title_key_server_preference">Prioridad del servidor de claves</string>
<string name="title_change_pass_phrase">Cambiar la frase de contraseña</string>
<string name="title_set_passphrase">Establecer frase de contraseña</string>
<string name="title_send_email">Enviar email...</string>
<string name="title_send_email">Enviar email</string>
<string name="title_encrypt_to_file">Cifrar hacia archivo</string>
<string name="title_decrypt_to_file">Descifrar hacia archivo</string>
<string name="title_import_keys">Importar claves</string>
@ -61,7 +61,7 @@
<string name="btn_next">Siguiente</string>
<string name="btn_back">Volver</string>
<string name="btn_clipboard">Portapapeles</string>
<string name="btn_share">Compartir con...</string>
<string name="btn_share">Compartir con</string>
<string name="btn_lookup_key">Buscar clave</string>
<!--menu-->
<string name="menu_preferences">Ajustes</string>
@ -80,10 +80,10 @@
<string name="menu_update_key">Actualizar desde servidor de claves</string>
<string name="menu_export_key_to_server">Cargar al servidor de claves</string>
<string name="menu_share">Compartir</string>
<string name="menu_share_title_fingerprint">Compartir la huella digital...</string>
<string name="menu_share_title">Compartir la clave completa...</string>
<string name="menu_share_default_fingerprint">con...</string>
<string name="menu_share_default">con...</string>
<string name="menu_share_title_fingerprint">Compartir la huella digital</string>
<string name="menu_share_title">Compartir la clave completa</string>
<string name="menu_share_default_fingerprint">con</string>
<string name="menu_share_default">con</string>
<string name="menu_share_qr_code">con código QR</string>
<string name="menu_share_qr_code_fingerprint">con código QR</string>
<string name="menu_share_nfc">con NFC</string>
@ -91,7 +91,7 @@
<string name="menu_sign_key"> Clave de firma</string>
<string name="menu_beam_preferences">Ajustes de Beam</string>
<string name="menu_key_edit_cancel">Cancelar</string>
<string name="menu_encrypt_to">Cifrar hacia...</string>
<string name="menu_encrypt_to">Cifrar hacia</string>
<!--label-->
<string name="label_sign">Firmar</string>
<string name="label_message">Mensaje</string>
@ -163,7 +163,7 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
<string name="filemanager_title_open">Abrir...</string>
<string name="filemanager_title_open">Abrir</string>
<string name="warning">Advertencia</string>
<string name="error">Error</string>
<string name="error_message">Error: %s</string>
@ -266,46 +266,49 @@
<string name="error_expiry_must_come_after_creation">la fecha de caducidad debe ser posterior a la fecha de creación</string>
<string name="error_can_not_delete_contact">no puedes eliminar este contacto porque eres tú mismo.</string>
<string name="error_can_not_delete_contacts">no puedes eliminar los siguientes contactos porque son tú mismo:\n%s</string>
<string name="error_keyserver_insufficient_query">Consulta al servidor insuficiente</string>
<string name="error_keyserver_query">La consulta al servidor de claves ha fallado</string>
<string name="error_keyserver_too_many_responses">Demasiadas respuestas</string>
<plurals name="error_can_not_delete_info">
<item quantity="one">Por favor, bórralo desde la pantalla \'Mis claves\'!</item>
<item quantity="other">Por favor, bórralos desde la pantalla \'Mis claves\'!</item>
</plurals>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">hecho.</string>
<string name="progress_saving">guardando...</string>
<string name="progress_importing">importando...</string>
<string name="progress_exporting">exportando...</string>
<string name="progress_generating">generando la clave, esto puede tardar más de 3 minutos...</string>
<string name="progress_building_key">construyendo la clave...</string>
<string name="progress_preparing_master_key">preparando la clave maestra...</string>
<string name="progress_certifying_master_key">certificando la clave maestra...</string>
<string name="progress_building_master_key">construyendo el anillo maestro...</string>
<string name="progress_adding_sub_keys">añadiendo las subclaves...</string>
<string name="progress_saving_key_ring">guardando claves...</string>
<string name="progress_saving">guardando</string>
<string name="progress_importing">importando</string>
<string name="progress_exporting">exportando</string>
<string name="progress_generating">generando la clave, esto puede tardar más de 3 minutos</string>
<string name="progress_building_key">construyendo la clave</string>
<string name="progress_preparing_master_key">preparando la clave maestra</string>
<string name="progress_certifying_master_key">certificando la clave maestra</string>
<string name="progress_building_master_key">construyendo el anillo maestro</string>
<string name="progress_adding_sub_keys">añadiendo las subclaves</string>
<string name="progress_saving_key_ring">guardando claves</string>
<plurals name="progress_exporting_key">
<item quantity="one">exportando clave...</item>
<item quantity="other">exportando claves...</item>
<item quantity="one">exportando clave</item>
<item quantity="other">exportando claves</item>
</plurals>
<string name="progress_extracting_signature_key">extrayendo la clave de firma...</string>
<string name="progress_extracting_key">extrayendo la clave...</string>
<string name="progress_preparing_streams">preparando las transmisiones...</string>
<string name="progress_encrypting">cifrando los datos...</string>
<string name="progress_decrypting">descifrando los datos...</string>
<string name="progress_preparing_signature">preparando la firma...</string>
<string name="progress_generating_signature">generando la firma...</string>
<string name="progress_processing_signature">procesando la firma...</string>
<string name="progress_verifying_signature">verificando la firma...</string>
<string name="progress_signing">firmando...</string>
<string name="progress_reading_data">leyendo los datos...</string>
<string name="progress_finding_key">localizando la clave...</string>
<string name="progress_decompressing_data">descomprimiendo los datos...</string>
<string name="progress_verifying_integrity">verificando la integridad...</string>
<string name="progress_extracting_signature_key">extrayendo la clave de firma</string>
<string name="progress_extracting_key">extrayendo la clave</string>
<string name="progress_preparing_streams">preparando las transmisiones</string>
<string name="progress_encrypting">cifrando los datos</string>
<string name="progress_decrypting">descifrando los datos</string>
<string name="progress_preparing_signature">preparando la firma</string>
<string name="progress_generating_signature">generando la firma</string>
<string name="progress_processing_signature">procesando la firma</string>
<string name="progress_verifying_signature">verificando la firma</string>
<string name="progress_signing">firmando</string>
<string name="progress_reading_data">leyendo los datos</string>
<string name="progress_finding_key">localizando la clave</string>
<string name="progress_decompressing_data">descomprimiendo los datos</string>
<string name="progress_verifying_integrity">verificando la integridad</string>
<string name="progress_deleting_securely">borrando \'%s\' de forma segura…</string>
<string name="progress_querying">consultando...</string>
<string name="progress_querying">consultando</string>
<!--action strings-->
<string name="hint_public_keys">Buscar claves públicas</string>
<string name="hint_secret_keys">Buscar claves secretas</string>
<string name="action_share_key_with">Compartir la clave con...</string>
<string name="action_share_key_with">Compartir la clave con</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_1024">1024</string>
@ -337,10 +340,10 @@
<string name="import_nfc_help_button">Ayuda</string>
<string name="import_clipboard_button">Tomar la clave desde el portapapeles</string>
<!--Intent labels-->
<string name="intent_decrypt_file">OpenKeychain: Descifrar archivo</string>
<string name="intent_import_key">OpenKeychain: Importar clave</string>
<string name="intent_send_encrypt">OpenKeychain: Cifrar</string>
<string name="intent_send_decrypt">OpenKeychain: Descifrar</string>
<string name="intent_decrypt_file">Descifrar archivo con OpenKeychain</string>
<string name="intent_import_key">Importar clave con OpenKeychain</string>
<string name="intent_send_encrypt">Cifrar con OpenKeychain</string>
<string name="intent_send_decrypt">Descifrar con OpenKeychain</string>
<!--Remote API-->
<string name="api_no_apps">¡No hay aplicaciones registradas!\n\nLas aplicaciones de terceros pueden pedir permiso de acceso a OpenKeychain. Después de obtener acceso, serán enumeradas aquí.</string>
<string name="api_settings_show_advanced">Mostrar la configuración avanzada</string>
@ -371,7 +374,7 @@
<item quantity="one">1 clave seleccionada.</item>
<item quantity="other">%d claves seleccionadas.</item>
</plurals>
<string name="key_list_empty_text1">Aún no hay claves disponibles...</string>
<string name="key_list_empty_text1">Aún no hay claves disponibles</string>
<string name="key_list_empty_text2">Puedes empezar por</string>
<string name="key_list_empty_text3">o</string>
<string name="key_list_empty_button_create">crear tu propia clave</string>

View File

@ -15,7 +15,7 @@
<string name="title_key_server_preference">Préférences du serveur de clefs</string>
<string name="title_change_pass_phrase">Changer la phrase de passe</string>
<string name="title_set_passphrase">Définir la phrase de passe</string>
<string name="title_send_email">Envoyer un courriel...</string>
<string name="title_send_email">Envoyer un courriel</string>
<string name="title_encrypt_to_file">Chiffrer vers un fichier</string>
<string name="title_decrypt_to_file">Déchiffrer vers un fichier</string>
<string name="title_import_keys">importer des clefs</string>
@ -61,7 +61,7 @@
<string name="btn_next">Suivant</string>
<string name="btn_back">Retour</string>
<string name="btn_clipboard">Presse-papiers</string>
<string name="btn_share">Partager avec...</string>
<string name="btn_share">Partager avec</string>
<string name="btn_lookup_key">Rechercher la clef</string>
<!--menu-->
<string name="menu_preferences">Paramètres</string>
@ -80,10 +80,10 @@
<string name="menu_update_key">Mettre à jour depuis le serveur de clefs</string>
<string name="menu_export_key_to_server">Téléverser vers le serveur de clefs</string>
<string name="menu_share">Partager</string>
<string name="menu_share_title_fingerprint">Partager l\'empreinte...</string>
<string name="menu_share_title">Partager la clef entière...</string>
<string name="menu_share_default_fingerprint">avec...</string>
<string name="menu_share_default">avec...</string>
<string name="menu_share_title_fingerprint">Partager l\'empreinte</string>
<string name="menu_share_title">Partager la clef entière</string>
<string name="menu_share_default_fingerprint">avec</string>
<string name="menu_share_default">avec</string>
<string name="menu_share_qr_code">par un code QR</string>
<string name="menu_share_qr_code_fingerprint">par un code QR</string>
<string name="menu_share_nfc">par la NFC</string>
@ -91,7 +91,7 @@
<string name="menu_sign_key">Signer la clef</string>
<string name="menu_beam_preferences">Paramètres Beam</string>
<string name="menu_key_edit_cancel">Annuler</string>
<string name="menu_encrypt_to">Chiffrer vers...</string>
<string name="menu_encrypt_to">Chiffrer vers</string>
<!--label-->
<string name="label_sign">Signer</string>
<string name="label_message">Message</string>
@ -163,7 +163,7 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
<string name="filemanager_title_open">Ouvrir...</string>
<string name="filemanager_title_open">Ouvrir</string>
<string name="warning">Avertissement</string>
<string name="error">Erreur</string>
<string name="error_message">Erreur : %s</string>
@ -275,40 +275,40 @@
</plurals>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">fait.</string>
<string name="progress_saving">sauvegarde...</string>
<string name="progress_importing">importation...</string>
<string name="progress_exporting">exportation...</string>
<string name="progress_generating">génération de la clef, ceci peut prendre jusqu\'à 3 minutes...</string>
<string name="progress_building_key">assemblage de la clef...</string>
<string name="progress_preparing_master_key">préparation de la clef maîtresse...</string>
<string name="progress_certifying_master_key">certification de la clef maîtresse...</string>
<string name="progress_building_master_key">assemblage du trousseau maître...</string>
<string name="progress_adding_sub_keys">ajout des sous-clefs...</string>
<string name="progress_saving_key_ring">sauvegarde de la clef...</string>
<string name="progress_saving">sauvegarde</string>
<string name="progress_importing">importation</string>
<string name="progress_exporting">exportation</string>
<string name="progress_generating">génération de la clef, ceci peut prendre jusqu\'à 3 minutes</string>
<string name="progress_building_key">assemblage de la clef</string>
<string name="progress_preparing_master_key">préparation de la clef maîtresse</string>
<string name="progress_certifying_master_key">certification de la clef maîtresse</string>
<string name="progress_building_master_key">assemblage du trousseau maître</string>
<string name="progress_adding_sub_keys">ajout des sous-clefs</string>
<string name="progress_saving_key_ring">sauvegarde de la clef</string>
<plurals name="progress_exporting_key">
<item quantity="one">exportation de la clef...</item>
<item quantity="other">exportation des clefs...</item>
<item quantity="one">exportation de la clef</item>
<item quantity="other">exportation des clefs</item>
</plurals>
<string name="progress_extracting_signature_key">extraction de la clef de signature...</string>
<string name="progress_extracting_key">extraction de la clef...</string>
<string name="progress_preparing_streams">préparation des flux...</string>
<string name="progress_encrypting">chiffrement des données...</string>
<string name="progress_decrypting">déchiffrement des données...</string>
<string name="progress_preparing_signature">préparation de la signature...</string>
<string name="progress_generating_signature">génération de la signature...</string>
<string name="progress_processing_signature">traitement de la signature...</string>
<string name="progress_verifying_signature">vérification de la signature...</string>
<string name="progress_signing">signature...</string>
<string name="progress_reading_data">lecture des données...</string>
<string name="progress_finding_key">recherche de la clef...</string>
<string name="progress_decompressing_data">décompression des données...</string>
<string name="progress_verifying_integrity">vérification de l\'intégrité...</string>
<string name="progress_deleting_securely">suppression sûre de « %s »...</string>
<string name="progress_querying">interrogation...</string>
<string name="progress_extracting_signature_key">extraction de la clef de signature</string>
<string name="progress_extracting_key">extraction de la clef</string>
<string name="progress_preparing_streams">préparation des flux</string>
<string name="progress_encrypting">chiffrement des données</string>
<string name="progress_decrypting">déchiffrement des données</string>
<string name="progress_preparing_signature">préparation de la signature</string>
<string name="progress_generating_signature">génération de la signature</string>
<string name="progress_processing_signature">traitement de la signature</string>
<string name="progress_verifying_signature">vérification de la signature</string>
<string name="progress_signing">signature</string>
<string name="progress_reading_data">lecture des données</string>
<string name="progress_finding_key">recherche de la clef</string>
<string name="progress_decompressing_data">décompression des données</string>
<string name="progress_verifying_integrity">vérification de l\'intégrité</string>
<string name="progress_deleting_securely">suppression sûre de « %s »</string>
<string name="progress_querying">interrogation</string>
<!--action strings-->
<string name="hint_public_keys">Rechercher des clefs publiques</string>
<string name="hint_secret_keys">Rechercher des clefs secrètes</string>
<string name="action_share_key_with">Partager la clef avec...</string>
<string name="action_share_key_with">Partager la clef avec</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_1024">1024</string>
@ -340,10 +340,10 @@
<string name="import_nfc_help_button">Aide</string>
<string name="import_clipboard_button">Obtenir la clef depuis le presse-papiers</string>
<!--Intent labels-->
<string name="intent_decrypt_file">OpenKeychain : déchiffrer le ficher</string>
<string name="intent_import_key">OpenKeychain : importer la clef</string>
<string name="intent_send_encrypt">OpenKeychain : chiffrer</string>
<string name="intent_send_decrypt">OpenKeychain : déchiffrer</string>
<string name="intent_decrypt_file">Déchiffrer le fichier avec OpenKeychain</string>
<string name="intent_import_key">Importer la clef avec OpenKeychain</string>
<string name="intent_send_encrypt">Chiffrer avec OpenKeychain</string>
<string name="intent_send_decrypt">Déchiffrer avec OpenKeychain</string>
<!--Remote API-->
<string name="api_no_apps">Aucune application enregistrée !\n\nLes applications tierces peuvent demander l\'accès à OpenKeychain. Après avoir autorisé l\'accès, elles seront listées ici.</string>
<string name="api_settings_show_advanced">Afficher les paramètres avancés</string>
@ -374,7 +374,7 @@
<item quantity="one">1 clef choisie</item>
<item quantity="other">%d clefs choisies</item>
</plurals>
<string name="key_list_empty_text1">Aucune clef encore disponible...</string>
<string name="key_list_empty_text1">Aucune clef encore disponible</string>
<string name="key_list_empty_text2">Vous pouvez commencer par</string>
<string name="key_list_empty_text3">ou</string>
<string name="key_list_empty_button_create">créer votre propre clef</string>

View File

@ -15,7 +15,7 @@
<string name="title_key_server_preference">Preferenze Server delle Chiavi</string>
<string name="title_change_pass_phrase">Cambia Frase di Accesso</string>
<string name="title_set_passphrase">Imposta Frase di Accesso</string>
<string name="title_send_email">Invia Mail...</string>
<string name="title_send_email">Invia Mail</string>
<string name="title_encrypt_to_file">Codifica File</string>
<string name="title_decrypt_to_file">Decodifica File</string>
<string name="title_import_keys">Importa Chiavi</string>
@ -61,7 +61,7 @@
<string name="btn_next">Prossimo</string>
<string name="btn_back">Precedente</string>
<string name="btn_clipboard">Appunti</string>
<string name="btn_share">Condividi con...</string>
<string name="btn_share">Condividi con</string>
<string name="btn_lookup_key">Chiave di ricerca</string>
<!--menu-->
<string name="menu_preferences">Impostazioni</string>
@ -80,10 +80,10 @@
<string name="menu_update_key">Aggiorna dal server delle chiavi</string>
<string name="menu_export_key_to_server">Carica chiave nel server</string>
<string name="menu_share">Condividi</string>
<string name="menu_share_title_fingerprint">Condivi impronta...</string>
<string name="menu_share_title">Condividi intera chiave...</string>
<string name="menu_share_title_fingerprint">Condivi impronta</string>
<string name="menu_share_title">Condividi intera chiave</string>
<string name="menu_share_default_fingerprint">con..</string>
<string name="menu_share_default">con...</string>
<string name="menu_share_default">con</string>
<string name="menu_share_qr_code">con Codice QR</string>
<string name="menu_share_qr_code_fingerprint">con Codice QR</string>
<string name="menu_share_nfc">con NFC</string>
@ -91,7 +91,7 @@
<string name="menu_sign_key">Firma chiave</string>
<string name="menu_beam_preferences">Impostazioni Beam</string>
<string name="menu_key_edit_cancel">Annulla</string>
<string name="menu_encrypt_to">Codifica su...</string>
<string name="menu_encrypt_to">Codifica su</string>
<!--label-->
<string name="label_sign">Firma</string>
<string name="label_message">Messaggio</string>
@ -163,7 +163,7 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
<string name="filemanager_title_open">Apri...</string>
<string name="filemanager_title_open">Apri</string>
<string name="warning">Attenzione</string>
<string name="error">Errore</string>
<string name="error_message">Errore: %s</string>
@ -275,40 +275,40 @@
</plurals>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">fatto.</string>
<string name="progress_saving">salvataggio...</string>
<string name="progress_importing">importazione...</string>
<string name="progress_exporting">esportazione...</string>
<string name="progress_generating">generazione chiave, richiede fino a 3 minuti...</string>
<string name="progress_building_key">fabbricazione chiave...</string>
<string name="progress_preparing_master_key">preparazione chiave principale...</string>
<string name="progress_certifying_master_key">certificazione chiave principale...</string>
<string name="progress_building_master_key">fabbricazione portachiavi principale...</string>
<string name="progress_adding_sub_keys">aggiunta sottochiavi...</string>
<string name="progress_saving_key_ring">salvataggio chiavi...</string>
<string name="progress_saving">salvataggio</string>
<string name="progress_importing">importazione</string>
<string name="progress_exporting">esportazione</string>
<string name="progress_generating">generazione chiave, richiede fino a 3 minuti</string>
<string name="progress_building_key">fabbricazione chiave</string>
<string name="progress_preparing_master_key">preparazione chiave principale</string>
<string name="progress_certifying_master_key">certificazione chiave principale</string>
<string name="progress_building_master_key">fabbricazione portachiavi principale</string>
<string name="progress_adding_sub_keys">aggiunta sottochiavi</string>
<string name="progress_saving_key_ring">salvataggio chiavi</string>
<plurals name="progress_exporting_key">
<item quantity="one">esportazione chiave...</item>
<item quantity="other">esportazione chiavi...</item>
<item quantity="one">esportazione chiave</item>
<item quantity="other">esportazione chiavi</item>
</plurals>
<string name="progress_extracting_signature_key">estrazione chiavi di firma...</string>
<string name="progress_extracting_key">estrazione chiave...</string>
<string name="progress_preparing_streams">preparazione flussi...</string>
<string name="progress_encrypting">codifica dati...</string>
<string name="progress_decrypting">decodifica dati...</string>
<string name="progress_preparing_signature">preparazione firma...</string>
<string name="progress_generating_signature">generazione firma...</string>
<string name="progress_processing_signature">elaborazione firma...</string>
<string name="progress_verifying_signature">verifica firma...</string>
<string name="progress_signing">firma...</string>
<string name="progress_reading_data">lettura dati...</string>
<string name="progress_finding_key">ricerca chiave...</string>
<string name="progress_decompressing_data">decompressione dati...</string>
<string name="progress_verifying_integrity">verifica integrita\'...</string>
<string name="progress_deleting_securely">eliminazione sicura di \'%s\'...</string>
<string name="progress_querying">interrogazione...</string>
<string name="progress_extracting_signature_key">estrazione chiavi di firma</string>
<string name="progress_extracting_key">estrazione chiave</string>
<string name="progress_preparing_streams">preparazione flussi</string>
<string name="progress_encrypting">codifica dati</string>
<string name="progress_decrypting">decodifica dati</string>
<string name="progress_preparing_signature">preparazione firma</string>
<string name="progress_generating_signature">generazione firma</string>
<string name="progress_processing_signature">elaborazione firma</string>
<string name="progress_verifying_signature">verifica firma</string>
<string name="progress_signing">firma</string>
<string name="progress_reading_data">lettura dati</string>
<string name="progress_finding_key">ricerca chiave</string>
<string name="progress_decompressing_data">decompressione dati</string>
<string name="progress_verifying_integrity">verifica integrita\'</string>
<string name="progress_deleting_securely">eliminazione sicura di \'%s\'</string>
<string name="progress_querying">interrogazione</string>
<!--action strings-->
<string name="hint_public_keys">Ricerca Chiavi Pubbliche</string>
<string name="hint_secret_keys">Cerca Chiave Privata</string>
<string name="action_share_key_with">Condividi chiave con...</string>
<string name="action_share_key_with">Condividi chiave con</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_1024">1024</string>
@ -340,10 +340,10 @@
<string name="import_nfc_help_button">Aiuto</string>
<string name="import_clipboard_button">Ottieni chiave dagli appunti</string>
<!--Intent labels-->
<string name="intent_decrypt_file">OpenKeyChain: Decodifica File</string>
<string name="intent_import_key">OpenKeyChain: Importa Chiave</string>
<string name="intent_send_encrypt">OpenKeychain: Codifica</string>
<string name="intent_send_decrypt">OpenKeychain: Decodifica</string>
<string name="intent_decrypt_file">Decodifica File con OpenKeychain</string>
<string name="intent_import_key">Importa Chiave con OpenKeychain</string>
<string name="intent_send_encrypt">Codifica con OpenKeychain</string>
<string name="intent_send_decrypt">Decodifica con OpenKeychain</string>
<!--Remote API-->
<string name="api_no_apps">Nessuna app registrata!\n\nApp di terza parti possono richiedere accesso a OpenKeychain. Dopo aver concesso l\'accesso, saranno elencate qui.</string>
<string name="api_settings_show_advanced">Mostra impostazioni avanzate</string>
@ -374,7 +374,7 @@
<item quantity="one">1 chiave selezionata.</item>
<item quantity="other">%d chiavi selezionate.</item>
</plurals>
<string name="key_list_empty_text1">Nessuna chiave disponibile...</string>
<string name="key_list_empty_text1">Nessuna chiave disponibile</string>
<string name="key_list_empty_text2">Puoi iniziare da</string>
<string name="key_list_empty_text3">o</string>
<string name="key_list_empty_button_create">creazione della tua chiave</string>

View File

@ -15,7 +15,7 @@
<string name="title_key_server_preference">鍵サーバ設定</string>
<string name="title_change_pass_phrase">パスフレーズの変更</string>
<string name="title_set_passphrase">パスフレーズの設定</string>
<string name="title_send_email">メールの送信...</string>
<string name="title_send_email">メールの送信</string>
<string name="title_encrypt_to_file">暗号化してファイルに</string>
<string name="title_decrypt_to_file">復号化してファイルに</string>
<string name="title_import_keys">鍵のインポート</string>
@ -61,7 +61,7 @@
<string name="btn_next"></string>
<string name="btn_back">戻る</string>
<string name="btn_clipboard">クリップボード</string>
<string name="btn_share">共有...</string>
<string name="btn_share">共有</string>
<string name="btn_lookup_key">鍵検出</string>
<!--menu-->
<string name="menu_preferences">設定</string>
@ -80,10 +80,10 @@
<string name="menu_update_key">鍵サーバからの更新</string>
<string name="menu_export_key_to_server">鍵サーバへのアップロード</string>
<string name="menu_share">共有</string>
<string name="menu_share_title_fingerprint">指紋の共有...</string>
<string name="menu_share_title">すべての鍵の共有...</string>
<string name="menu_share_default_fingerprint">...(指紋)</string>
<string name="menu_share_default">...(鍵)</string>
<string name="menu_share_title_fingerprint">指紋の共有</string>
<string name="menu_share_title">すべての鍵の共有</string>
<string name="menu_share_default_fingerprint">(指紋)</string>
<string name="menu_share_default">(鍵)</string>
<string name="menu_share_qr_code">QRコードで共有(鍵)</string>
<string name="menu_share_qr_code_fingerprint">QRコードで共有(指紋)</string>
<string name="menu_share_nfc">NFCで共有</string>
@ -91,7 +91,7 @@
<string name="menu_sign_key">鍵を署名</string>
<string name="menu_beam_preferences">Beamの設定</string>
<string name="menu_key_edit_cancel">キャンセル</string>
<string name="menu_encrypt_to">暗号化...</string>
<string name="menu_encrypt_to">暗号化</string>
<!--label-->
<string name="label_sign">署名</string>
<string name="label_message">メッセージ</string>
@ -161,7 +161,7 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
<string name="filemanager_title_open">開く...</string>
<string name="filemanager_title_open">開く</string>
<string name="warning">注意</string>
<string name="error">エラー</string>
<string name="error_message">エラー: %s</string>
@ -266,39 +266,39 @@
</plurals>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">完了。</string>
<string name="progress_saving">保存...</string>
<string name="progress_importing">インポート...</string>
<string name="progress_exporting">エクスポート...</string>
<string name="progress_generating">鍵の生成、3分ほどかかります...</string>
<string name="progress_building_key">鍵の構築中...</string>
<string name="progress_preparing_master_key">主鍵の準備中...</string>
<string name="progress_certifying_master_key">主鍵の検証中...</string>
<string name="progress_building_master_key">主鍵輪の構築中...</string>
<string name="progress_adding_sub_keys">副鍵の追加中...</string>
<string name="progress_saving_key_ring">鍵の保存...</string>
<string name="progress_saving">保存</string>
<string name="progress_importing">インポート</string>
<string name="progress_exporting">エクスポート</string>
<string name="progress_generating">鍵の生成、3分ほどかかります</string>
<string name="progress_building_key">鍵の構築中</string>
<string name="progress_preparing_master_key">主鍵の準備中</string>
<string name="progress_certifying_master_key">主鍵の検証中</string>
<string name="progress_building_master_key">主鍵輪の構築中</string>
<string name="progress_adding_sub_keys">副鍵の追加中</string>
<string name="progress_saving_key_ring">鍵の保存</string>
<plurals name="progress_exporting_key">
<item quantity="other">鍵のエクスポート...</item>
<item quantity="other">鍵のエクスポート</item>
</plurals>
<string name="progress_extracting_signature_key">署名鍵の取り出し中...</string>
<string name="progress_extracting_key">鍵の取り出し中...</string>
<string name="progress_preparing_streams">ストリームの準備中...</string>
<string name="progress_encrypting">データの暗号化中...</string>
<string name="progress_decrypting">データの復号化中...</string>
<string name="progress_preparing_signature">署名の準備中...</string>
<string name="progress_generating_signature">署名の生成中...</string>
<string name="progress_processing_signature">署名処理中...</string>
<string name="progress_verifying_signature">署名の検証中...</string>
<string name="progress_signing">署名中...</string>
<string name="progress_reading_data">データ読み込み中...</string>
<string name="progress_finding_key">鍵検索中...</string>
<string name="progress_decompressing_data">データの展開中...</string>
<string name="progress_verifying_integrity">完全性の検証中...</string>
<string name="progress_extracting_signature_key">署名鍵の取り出し中</string>
<string name="progress_extracting_key">鍵の取り出し中</string>
<string name="progress_preparing_streams">ストリームの準備中</string>
<string name="progress_encrypting">データの暗号化中</string>
<string name="progress_decrypting">データの復号化中</string>
<string name="progress_preparing_signature">署名の準備中</string>
<string name="progress_generating_signature">署名の生成中</string>
<string name="progress_processing_signature">署名処理中</string>
<string name="progress_verifying_signature">署名の検証中</string>
<string name="progress_signing">署名中</string>
<string name="progress_reading_data">データ読み込み中</string>
<string name="progress_finding_key">鍵検索中</string>
<string name="progress_decompressing_data">データの展開中</string>
<string name="progress_verifying_integrity">完全性の検証中</string>
<string name="progress_deleting_securely">\'%s\' を完全に削除中…</string>
<string name="progress_querying">要求中...</string>
<string name="progress_querying">要求中</string>
<!--action strings-->
<string name="hint_public_keys">公開鍵の検索</string>
<string name="hint_secret_keys">秘密鍵の検索</string>
<string name="action_share_key_with">鍵の共有...</string>
<string name="action_share_key_with">鍵の共有</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_1024">1024</string>
@ -329,10 +329,10 @@
<string name="import_nfc_help_button">ヘルプ</string>
<string name="import_clipboard_button">クリップボードから鍵を取得</string>
<!--Intent labels-->
<string name="intent_decrypt_file">OpenKeychain: ファイル復号化</string>
<string name="intent_import_key">OpenKeychain: 鍵のインポート</string>
<string name="intent_send_encrypt">OpenKeychain: 暗号化</string>
<string name="intent_send_decrypt">OpenKeychain: 復号化</string>
<string name="intent_decrypt_file">OpenKeychainでファイルを復号化</string>
<string name="intent_import_key">OpenKeychainに鍵をインポート</string>
<string name="intent_send_encrypt">OpenKeychain暗号化</string>
<string name="intent_send_decrypt">OpenKeychain復号化</string>
<!--Remote API-->
<string name="api_no_apps">登録されていないアプリケーション!\n\nサードパーティアプリケーションはOpenKeychainにアクセスを要求できます。アクセスを与えた後、それらはここにリストされます。</string>
<string name="api_settings_show_advanced">拡張設定を表示</string>
@ -362,7 +362,7 @@
<plurals name="key_list_selected_keys">
<item quantity="other">%d の鍵を選択。</item>
</plurals>
<string name="key_list_empty_text1">すでにその鍵は存在しません...</string>
<string name="key_list_empty_text1">すでにその鍵は存在しません</string>
<string name="key_list_empty_text2">で始める</string>
<string name="key_list_empty_text3">もしくは</string>
<string name="key_list_empty_button_create">あなた所有の鍵を作る</string>

View File

@ -12,7 +12,7 @@
<string name="title_api_registered_apps">Geregistreerde apps</string>
<string name="title_change_pass_phrase">Wachtwoord wijzigen</string>
<string name="title_set_passphrase">Wachtwoord instellen</string>
<string name="title_send_email">E-mail verzenden...</string>
<string name="title_send_email">E-mail verzenden</string>
<string name="title_encrypt_to_file">Versleutelen naar bestand</string>
<string name="title_decrypt_to_file">Ontsleutelen naar bestand</string>
<string name="title_import_keys">Sleutels importeren</string>
@ -109,7 +109,7 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
<string name="filemanager_title_open">Openen...</string>
<string name="filemanager_title_open">Openen</string>
<string name="warning">Waarschuwing</string>
<string name="error">Fout</string>
<string name="error_message">Fout: %s</string>
@ -172,34 +172,34 @@
<string name="error_nothing_import">Niets te importeren</string>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">gereed.</string>
<string name="progress_saving">opslaan...</string>
<string name="progress_importing">importeren...</string>
<string name="progress_exporting">exporteren...</string>
<string name="progress_building_key">sleutel maken...</string>
<string name="progress_preparing_master_key">hoofdsleutel voorbereiden...</string>
<string name="progress_certifying_master_key">hoofdsleutel certificeren...</string>
<string name="progress_building_master_key">hoofdsleutelbos maken...</string>
<string name="progress_adding_sub_keys">sub-sleutels toevoegen...</string>
<string name="progress_extracting_signature_key">ondertekeningssleutel uitpakken...</string>
<string name="progress_extracting_key">sleutel uitpakken...</string>
<string name="progress_preparing_streams">streams voorbereiden...</string>
<string name="progress_encrypting">gegevens versleutelen...</string>
<string name="progress_decrypting">gegevens ontsleutelen...</string>
<string name="progress_preparing_signature">handtekening voorbereiden...</string>
<string name="progress_generating_signature">handtekening genereren...</string>
<string name="progress_processing_signature">handtekening verwerken...</string>
<string name="progress_verifying_signature">handtekening verifiëren...</string>
<string name="progress_signing">ondertekenen...</string>
<string name="progress_reading_data">gegevens lezen...</string>
<string name="progress_finding_key">sleutel opzoeken...</string>
<string name="progress_decompressing_data">gegevens decomprimeren...</string>
<string name="progress_verifying_integrity">integriteit verifiëren...</string>
<string name="progress_deleting_securely">\'%s\' veilig verwijderen...</string>
<string name="progress_querying">opvragen...</string>
<string name="progress_saving">opslaan</string>
<string name="progress_importing">importeren</string>
<string name="progress_exporting">exporteren</string>
<string name="progress_building_key">sleutel maken</string>
<string name="progress_preparing_master_key">hoofdsleutel voorbereiden</string>
<string name="progress_certifying_master_key">hoofdsleutel certificeren</string>
<string name="progress_building_master_key">hoofdsleutelbos maken</string>
<string name="progress_adding_sub_keys">sub-sleutels toevoegen</string>
<string name="progress_extracting_signature_key">ondertekeningssleutel uitpakken</string>
<string name="progress_extracting_key">sleutel uitpakken</string>
<string name="progress_preparing_streams">streams voorbereiden</string>
<string name="progress_encrypting">gegevens versleutelen</string>
<string name="progress_decrypting">gegevens ontsleutelen</string>
<string name="progress_preparing_signature">handtekening voorbereiden</string>
<string name="progress_generating_signature">handtekening genereren</string>
<string name="progress_processing_signature">handtekening verwerken</string>
<string name="progress_verifying_signature">handtekening verifiëren</string>
<string name="progress_signing">ondertekenen</string>
<string name="progress_reading_data">gegevens lezen</string>
<string name="progress_finding_key">sleutel opzoeken</string>
<string name="progress_decompressing_data">gegevens decomprimeren</string>
<string name="progress_verifying_integrity">integriteit verifiëren</string>
<string name="progress_deleting_securely">\'%s\' veilig verwijderen</string>
<string name="progress_querying">opvragen</string>
<!--action strings-->
<string name="hint_public_keys">Publieke sleutels zoeken</string>
<string name="hint_secret_keys">Privésleutels zoeken</string>
<string name="action_share_key_with">Sleutel delen met...</string>
<string name="action_share_key_with">Sleutel delen met</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_1024">1024</string>

View File

@ -15,7 +15,7 @@
<string name="title_key_server_preference">Настройки сервера ключей</string>
<string name="title_change_pass_phrase">Изменить пароль</string>
<string name="title_set_passphrase">Задать пароль</string>
<string name="title_send_email">Отправить...</string>
<string name="title_send_email">Отправить</string>
<string name="title_encrypt_to_file">Зашифровать в файл</string>
<string name="title_decrypt_to_file">Расшифровать в файл</string>
<string name="title_import_keys">Импорт ключей</string>
@ -61,7 +61,7 @@
<string name="btn_next">Далее</string>
<string name="btn_back">Назад</string>
<string name="btn_clipboard">Буфер обмена</string>
<string name="btn_share">Поделиться...</string>
<string name="btn_share">Поделиться</string>
<string name="btn_lookup_key">Найти ключ</string>
<!--menu-->
<string name="menu_preferences">Настройки</string>
@ -79,9 +79,9 @@
<string name="menu_key_server">Импорт с сервера ключей</string>
<string name="menu_update_key">Обновить с сервера ключей</string>
<string name="menu_export_key_to_server">Загрузить на сервер ключей</string>
<string name="menu_share">Отправить...</string>
<string name="menu_share_title_fingerprint">Отправить отпечаток...</string>
<string name="menu_share_title">Отправить ключ...</string>
<string name="menu_share">Отправить</string>
<string name="menu_share_title_fingerprint">Отправить отпечаток</string>
<string name="menu_share_title">Отправить ключ</string>
<string name="menu_share_default_fingerprint">Отправить</string>
<string name="menu_share_default">Отправить</string>
<string name="menu_share_qr_code">QR код</string>
@ -91,7 +91,7 @@
<string name="menu_sign_key">Подписать ключ</string>
<string name="menu_beam_preferences">Настройки Beam</string>
<string name="menu_key_edit_cancel">Отмена</string>
<string name="menu_encrypt_to">Зашифровать....</string>
<string name="menu_encrypt_to">Зашифровать.</string>
<!--label-->
<string name="label_sign">Подписать</string>
<string name="label_message">Сообщение</string>
@ -115,7 +115,7 @@
<string name="label_key_servers">Серверы ключей</string>
<string name="label_key_id">ID ключа</string>
<string name="label_creation">Создан</string>
<string name="label_expiry">Годен до...</string>
<string name="label_expiry">Годен до</string>
<string name="label_usage">Применение</string>
<string name="label_key_size">Размер ключа</string>
<string name="label_main_user_id">Основной ID пользователя</string>
@ -165,7 +165,7 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
<string name="filemanager_title_open">Открыть...</string>
<string name="filemanager_title_open">Открыть</string>
<string name="warning">Внимание</string>
<string name="error">Ошибка</string>
<string name="error_message">Ошибка: %s</string>
@ -284,41 +284,41 @@
</plurals>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">готово.</string>
<string name="progress_saving">сохранение...</string>
<string name="progress_importing">импорт...</string>
<string name="progress_exporting">экспорт...</string>
<string name="progress_generating">создание ключа. это может занять до 3 минут...</string>
<string name="progress_building_key">создание ключа...</string>
<string name="progress_preparing_master_key">подготовка основного ключа...</string>
<string name="progress_certifying_master_key">сертификация основного ключа...</string>
<string name="progress_building_master_key">создание основной связки...</string>
<string name="progress_adding_sub_keys">добавление доп. ключей...</string>
<string name="progress_saving_key_ring">сохранение ключа...</string>
<string name="progress_saving">сохранение</string>
<string name="progress_importing">импорт</string>
<string name="progress_exporting">экспорт</string>
<string name="progress_generating">создание ключа. это может занять до 3 минут</string>
<string name="progress_building_key">создание ключа</string>
<string name="progress_preparing_master_key">подготовка основного ключа</string>
<string name="progress_certifying_master_key">сертификация основного ключа</string>
<string name="progress_building_master_key">создание основной связки</string>
<string name="progress_adding_sub_keys">добавление доп. ключей</string>
<string name="progress_saving_key_ring">сохранение ключа</string>
<plurals name="progress_exporting_key">
<item quantity="one">экспорт ключа...</item>
<item quantity="few">экспорт ключей...</item>
<item quantity="other">экспорт ключей...</item>
<item quantity="one">экспорт ключа</item>
<item quantity="few">экспорт ключей</item>
<item quantity="other">экспорт ключей</item>
</plurals>
<string name="progress_extracting_signature_key">извлечение подписи ключа...</string>
<string name="progress_extracting_key">извлечение ключа...</string>
<string name="progress_preparing_streams">подготовка к передаче...</string>
<string name="progress_encrypting">шифрование данных...</string>
<string name="progress_decrypting">расшифровка данных...</string>
<string name="progress_preparing_signature">подготовка подписи...</string>
<string name="progress_generating_signature">формирование подписи...</string>
<string name="progress_processing_signature">обработка подписи...</string>
<string name="progress_verifying_signature">проверка подписи...</string>
<string name="progress_signing">подписание...</string>
<string name="progress_reading_data">чтение данных...</string>
<string name="progress_finding_key">поиск ключа...</string>
<string name="progress_decompressing_data">распаковка данных...</string>
<string name="progress_verifying_integrity">проверка целостности...</string>
<string name="progress_deleting_securely">безопасное удаление \'%s\'...</string>
<string name="progress_querying">запрос...</string>
<string name="progress_extracting_signature_key">извлечение подписи ключа</string>
<string name="progress_extracting_key">извлечение ключа</string>
<string name="progress_preparing_streams">подготовка к передаче</string>
<string name="progress_encrypting">шифрование данных</string>
<string name="progress_decrypting">расшифровка данных</string>
<string name="progress_preparing_signature">подготовка подписи</string>
<string name="progress_generating_signature">формирование подписи</string>
<string name="progress_processing_signature">обработка подписи</string>
<string name="progress_verifying_signature">проверка подписи</string>
<string name="progress_signing">подписание</string>
<string name="progress_reading_data">чтение данных</string>
<string name="progress_finding_key">поиск ключа</string>
<string name="progress_decompressing_data">распаковка данных</string>
<string name="progress_verifying_integrity">проверка целостности</string>
<string name="progress_deleting_securely">безопасное удаление \'%s\'</string>
<string name="progress_querying">запрос</string>
<!--action strings-->
<string name="hint_public_keys">Найти публичные ключи</string>
<string name="hint_secret_keys">Найти секретные ключи</string>
<string name="action_share_key_with">Отправить...</string>
<string name="action_share_key_with">Отправить</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_1024">1024</string>
@ -386,7 +386,7 @@
<item quantity="few">%d ключей выбрано.</item>
<item quantity="other">%d ключей выбрано.</item>
</plurals>
<string name="key_list_empty_text1">У вас пока нет ключей...</string>
<string name="key_list_empty_text1">У вас пока нет ключей</string>
<string name="key_list_empty_text2">Но Вы можете</string>
<string name="key_list_empty_text3">или</string>
<string name="key_list_empty_button_create">создать свой ключ</string>

View File

@ -76,7 +76,7 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
<string name="filemanager_title_open">...</string>
<string name="filemanager_title_open"></string>
<string name="warning">Uyarı</string>
<string name="error">Hata</string>
<string name="error_message">Hata: %s</string>
@ -96,17 +96,17 @@
<string name="error_corrupt_data">bozuk veri</string>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">bitti.</string>
<string name="progress_saving">kaydediliyor...</string>
<string name="progress_importing">alıyor...</string>
<string name="progress_exporting">veriyor...</string>
<string name="progress_building_key">anahtar oluşturuluyor...</string>
<string name="progress_preparing_signature">imza hazırlanıyor...</string>
<string name="progress_generating_signature">imza oluşturuluyor...</string>
<string name="progress_processing_signature">imza işleniyor...</string>
<string name="progress_verifying_signature">imza doğrulanıyor...</string>
<string name="progress_signing">imzalanıyor...</string>
<string name="progress_reading_data">veri okunuyor...</string>
<string name="progress_finding_key">anahtar bulunuyor...</string>
<string name="progress_saving">kaydediliyor</string>
<string name="progress_importing">alıyor</string>
<string name="progress_exporting">veriyor</string>
<string name="progress_building_key">anahtar oluşturuluyor</string>
<string name="progress_preparing_signature">imza hazırlanıyor</string>
<string name="progress_generating_signature">imza oluşturuluyor</string>
<string name="progress_processing_signature">imza işleniyor</string>
<string name="progress_verifying_signature">imza doğrulanıyor</string>
<string name="progress_signing">imzalanıyor</string>
<string name="progress_reading_data">veri okunuyor</string>
<string name="progress_finding_key">anahtar bulunuyor</string>
<!--action strings-->
<!--key bit length selections-->
<string name="key_size_512">512</string>

View File

@ -351,10 +351,10 @@
<string name="import_nfc_help_button">Довідка</string>
<string name="import_clipboard_button">Отримати ключ з буфера обміну</string>
<!--Intent labels-->
<string name="intent_decrypt_file">OpenPGP: розшифрувати файл</string>
<string name="intent_import_key">OpenPGP: імпортувати ключ</string>
<string name="intent_send_encrypt">OpenPGP: зашифрувати</string>
<string name="intent_send_decrypt">OpenPGP: розшифрувати</string>
<string name="intent_decrypt_file">Розшифрувати файл з OpenKeychain</string>
<string name="intent_import_key">Імпортувати ключ з OpenKeychain</string>
<string name="intent_send_encrypt">Зашифрувати з OpenKeychain</string>
<string name="intent_send_decrypt">Розшифрувати з OpenKeychain</string>
<!--Remote API-->
<string name="api_no_apps">Нема зареєстрованих програм!\n\nСтороні програми можуть вимагати доступ до OpenPGP Keychain. Після надання доступу вони будуть наведені тут.</string>
<string name="api_settings_show_advanced">Показати додаткові налаштування</string>

View File

@ -24,7 +24,7 @@
<string name="menu_copy_to_clipboard">复制到剪贴板</string>
<string name="menu_sign_key">签署密钥</string>
<string name="menu_key_edit_cancel">取消</string>
<string name="menu_encrypt_to">加密到...</string>
<string name="menu_encrypt_to">加密到</string>
<!--label-->
<string name="label_sign">签署</string>
<string name="label_message">讯息</string>
@ -64,7 +64,7 @@
<string name="choice_4hours">4小时</string>
<string name="choice_8hours">8小时</string>
<string name="choice_forever">永远</string>
<string name="filemanager_title_open">打开...</string>
<string name="filemanager_title_open">打开</string>
<string name="warning">警告</string>
<string name="error">错误</string>
<!--sentences-->
@ -106,13 +106,13 @@
<string name="error_wrong_passphrase">错误的密语</string>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">完成。</string>
<string name="progress_saving">保存...</string>
<string name="progress_importing">导入中...</string>
<string name="progress_exporting">导出中...</string>
<string name="progress_saving">保存</string>
<string name="progress_importing">导入中</string>
<string name="progress_exporting">导出中</string>
<string name="progress_building_key">建立密钥</string>
<string name="progress_preparing_master_key">正在准备主密钥</string>
<string name="progress_verifying_signature">正在验证签名...</string>
<string name="progress_signing">正在签名...</string>
<string name="progress_verifying_signature">正在验证签名</string>
<string name="progress_signing">正在签名</string>
<string name="progress_reading_data">正在读取数据</string>
<string name="progress_finding_key">正在查找密钥</string>
<string name="progress_querying">正在查询</string>

View File

@ -15,21 +15,7 @@
limitations under the License.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="@string/section_general" >
<org.sufficientlysecure.keychain.ui.widget.IntegerListPreference
android:entries="@array/pass_phrase_cache_ttl_entries"
android:entryValues="@array/pass_phrase_cache_ttl_values"
android:key="passPhraseCacheTtl"
android:persistent="false"
android:title="@string/label_passphrase_cache_ttl" />
<PreferenceScreen
android:key="keyServers"
android:persistent="false"
android:title="@string/label_key_servers" />
</PreferenceCategory>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/section_defaults" >
<org.sufficientlysecure.keychain.ui.widget.IntegerListPreference
android:key="defaultEncryptionAlgorithm"
@ -59,5 +45,4 @@
android:persistent="false"
android:title="@string/label_force_v3_signature" />
</PreferenceCategory>
</PreferenceScreen>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
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.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/section_general" >
<org.sufficientlysecure.keychain.ui.widget.IntegerListPreference
android:entries="@array/pass_phrase_cache_ttl_entries"
android:entryValues="@array/pass_phrase_cache_ttl_values"
android:key="passPhraseCacheTtl"
android:persistent="false"
android:title="@string/label_passphrase_cache_ttl" />
<PreferenceScreen
android:key="keyServers"
android:persistent="false"
android:title="@string/label_key_servers" />
</PreferenceCategory>
</PreferenceScreen>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
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.
-->
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="org.sufficientlysecure.keychain.ui.PreferencesActivity$GeneralPrefsFragment"
android:title="@string/section_general" />
<header
android:fragment="org.sufficientlysecure.keychain.ui.PreferencesActivity$AdvancedPrefsFragment"
android:title="@string/section_advanced" />
</preference-headers>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
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.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
android:title="@string/section_general" >
<intent
android:action="org.sufficientlysecure.keychain.ui.PREFS_GEN" />
</Preference>
<Preference
android:title="@string/section_advanced" >
<intent
android:action="org.sufficientlysecure.keychain.ui.PREFS_ADV" />
</Preference>
</PreferenceScreen>

View File

@ -32,9 +32,9 @@ Development mailinglist at http://groups.google.com/d/forum/openpgp-keychain-dev
1. Have Android SDK "tools", "platform-tools", and "build-tools" directories in your PATH (http://developer.android.com/sdk/index.html)
2. Open the Android SDK Manager (shell command: ``android``).
Expand the Tools directory and select "Android SDK Build-tools" newest version.
Expand the Tools directory and select "Android SDK Build-tools (Version 19.0.3)".
Expand the Extras directory and install "Android Support Repository"
Select everything for the newest SDK
Select everything for the newest SDK (API-Level 19)
3. Export ANDROID_HOME pointing to your Android SDK
4. Execute ``./gradlew build``
5. You can install the app with ``adb install -r OpenPGP-Keychain/build/apk/OpenPGP-Keychain-debug-unaligned.apk``

View File

@ -2,7 +2,7 @@ apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion '19.0.1'
buildToolsVersion '19.0.3'
defaultConfig {
minSdkVersion 4

View File

@ -2,10 +2,10 @@ apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion "19.0.1"
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 7
targetSdkVersion 17
targetSdkVersion 19
}
sourceSets {
main {

View File

@ -2,8 +2,8 @@ apply plugin: 'android-library'
android {
compileSdkVersion 17
buildToolsVersion '19.0.1'
compileSdkVersion 19
buildToolsVersion '19.0.3'
sourceSets {
main {

View File

@ -11,5 +11,5 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-17
target=android-19
android.library=true

View File

@ -2,7 +2,7 @@ apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion '19.0.1'
buildToolsVersion '19.0.3'
sourceSets {
main {

View File

@ -0,0 +1,35 @@
// please leave this here, so this library builds on its own
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.8.3'
}
}
apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion '19.0.3'
// NOTE: We are using the old folder structure to also support Eclipse
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
// Do not abort build if lint finds errors
lintOptions {
abortOnError false
}
}

View File

@ -2,7 +2,7 @@ apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion '19.0.1'
buildToolsVersion '19.0.3'
sourceSets {
main {

View File

@ -2,7 +2,7 @@ apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion '19.0.1'
buildToolsVersion '19.0.3'
sourceSets {
main {