From 6b89b146b1cdfa703f70f7bf819000fd6e88505d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 18 Sep 2015 14:49:03 +0100 Subject: Fix build instruction --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6eac8fe3..d6c417c01 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Expand the Tools directory and select "Android SDK Build-tools (Version 21.1.2)" Expand the Extras directory and install "Android Support Repository" Select everything for the newest SDK Platform, API 22, and also API 21 5. Export ANDROID_HOME pointing to your Android SDK -6. Execute ``./gradlew build`` +6. Execute ``./ gradlew assembleDebug`` 7. You can install the app with ``adb install -r OpenKeychain/build/outputs/apk/OpenKeychain-debug-unaligned.apk`` ### Run Tests -- cgit v1.2.3 From 448140c276400f83a3c54766f7cc71e087bf6d11 Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 18 Sep 2015 16:11:37 +0200 Subject: Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d6c417c01..e06366571 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Expand the Tools directory and select "Android SDK Build-tools (Version 21.1.2)" Expand the Extras directory and install "Android Support Repository" Select everything for the newest SDK Platform, API 22, and also API 21 5. Export ANDROID_HOME pointing to your Android SDK -6. Execute ``./ gradlew assembleDebug`` +6. Execute ``./gradlew assembleDebug`` 7. You can install the app with ``adb install -r OpenKeychain/build/outputs/apk/OpenKeychain-debug-unaligned.apk`` ### Run Tests -- cgit v1.2.3 From f253c9e2062f89b6feed0ff30a3ffac98a50374f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Fri, 18 Sep 2015 22:51:13 +0200 Subject: Fix DECRYPT_DATA intent --- OpenKeychain/src/main/AndroidManifest.xml | 4 +--- .../main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml index c966d688a..e80faff58 100644 --- a/OpenKeychain/src/main/AndroidManifest.xml +++ b/OpenKeychain/src/main/AndroidManifest.xml @@ -263,9 +263,7 @@ - - - + diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java index 5eb9963f5..4e9a6f17d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java @@ -168,7 +168,7 @@ public class DecryptActivity extends BaseActivity { return; } - uris.add(intent.getData()); + uris.add(uri); } } -- cgit v1.2.3 From e7185bd1b80b2ccf87b8ec534d04a410fa5037a1 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 19 Sep 2015 15:25:18 +0200 Subject: fix fallback for non-mime data --- .../keychain/operations/InputDataOperation.java | 41 ++++++++++++---------- .../operations/results/OperationResult.java | 2 +- OpenKeychain/src/main/res/values/strings.xml | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java index d9e48af8a..0bc4c1ecc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java @@ -309,25 +309,32 @@ public class InputDataOperation extends BaseOperation { log.add(LogType.MSG_DATA_MIME, 1); - // open current uri for input - InputStream in = mContext.getContentResolver().openInputStream(currentInputUri); - parser.parse(in); + try { - if (mSignedDataUri != null) { + // open current uri for input + InputStream in = mContext.getContentResolver().openInputStream(currentInputUri); + parser.parse(in); - if (decryptResult != null) { - decryptResult.setSignatureResult(mSignedDataResult.getSignatureResult()); - } else { - decryptResult = mSignedDataResult; - } + if (mSignedDataUri != null) { - // the actual content is the signed data now (and will be passed verbatim, if parsing fails) - currentInputUri = mSignedDataUri; - in = mContext.getContentResolver().openInputStream(currentInputUri); - // reset signed data result, to indicate to the parser that it is in the inner part - mSignedDataResult = null; - parser.parse(in); + if (decryptResult != null) { + decryptResult.setSignatureResult(mSignedDataResult.getSignatureResult()); + } else { + decryptResult = mSignedDataResult; + } + // the actual content is the signed data now (and will be passed verbatim, if parsing fails) + currentInputUri = mSignedDataUri; + in = mContext.getContentResolver().openInputStream(currentInputUri); + // reset signed data result, to indicate to the parser that it is in the inner part + mSignedDataResult = null; + parser.parse(in); + + } + } catch (MimeException e) { + // a mime error likely means that this wasn't mime data, after all + e.printStackTrace(); + log.add(LogType.MSG_DATA_MIME_BAD, 2); } // if we found data, return success @@ -363,10 +370,6 @@ public class InputDataOperation extends BaseOperation { e.printStackTrace(); log.add(LogType.MSG_DATA_ERROR_IO, 2); return new InputDataResult(InputDataResult.RESULT_ERROR, log); - } catch (MimeException e) { - e.printStackTrace(); - log.add(LogType.MSG_DATA_MIME_ERROR, 2); - return new InputDataResult(InputDataResult.RESULT_ERROR, log); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java index b1dcc9202..a03658808 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java @@ -837,7 +837,7 @@ public abstract class OperationResult implements Parcelable { MSG_DATA_DETACHED_NESTED(LogLevel.WARN, R.string.msg_data_detached_nested), MSG_DATA_DETACHED_TRAILING (LogLevel.WARN, R.string.msg_data_detached_trailing), MSG_DATA_DETACHED_UNSUPPORTED (LogLevel.WARN, R.string.msg_data_detached_unsupported), - MSG_DATA_MIME_ERROR (LogLevel.ERROR, R.string.msg_data_mime_error), + MSG_DATA_MIME_BAD(LogLevel.INFO, R.string.msg_data_mime_bad), MSG_DATA_MIME_FILENAME (LogLevel.DEBUG, R.string.msg_data_mime_filename), MSG_DATA_MIME_LENGTH (LogLevel.DEBUG, R.string.msg_data_mime_length), MSG_DATA_MIME (LogLevel.DEBUG, R.string.msg_data_mime), diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index f12be176e..62083cbb4 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -1366,7 +1366,7 @@ "Unsupported type of detached signature!" "Error reading input data!" "Error processing OpenPGP data!" - "Error parsing MIME data!" + "Could not parse as MIME data" "Filename: '%s'" "Content-Length: %s" "Parsing MIME data structure" -- cgit v1.2.3 From 5330a91fef160b7d1bc4bae997997416ee01922c Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 19 Sep 2015 15:25:40 +0200 Subject: skip mime parsing if we already know the content type isn't suitable --- .../keychain/operations/InputDataOperation.java | 23 +++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java index 0bc4c1ecc..9170dc139 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java @@ -86,6 +86,11 @@ public class InputDataOperation extends BaseOperation { DecryptVerifyResult decryptResult = null; PgpDecryptVerifyInputParcel decryptInput = input.getDecryptInput(); + + if (!input.getMimeDecode() && decryptInput == null) { + throw new AssertionError("no decryption or mime decoding, this is probably a bug"); + } + if (decryptInput != null) { log.add(LogType.MSG_DATA_OPENPGP, 1); @@ -113,12 +118,20 @@ public class InputDataOperation extends BaseOperation { currentInputUri = input.getInputUri(); } - // If we aren't supposed to attempt mime decode, we are done here - if (!input.getMimeDecode()) { - - if (decryptInput == null) { - throw new AssertionError("no decryption or mime decoding, this is probably a bug"); + // don't even attempt if we know the data isn't suitable for mime content + boolean skipMimeParsing = false; + if (decryptResult != null && decryptResult.getDecryptionMetadata() != null) { + String contentType = decryptResult.getDecryptionMetadata().getMimeType(); + if (contentType != null + && !contentType.startsWith("multipart/") + && !contentType.startsWith("text/") + && !contentType.startsWith("application/")) { + skipMimeParsing = true; } + } + + // If we aren't supposed to attempt mime decode after decryption, we are done here + if (skipMimeParsing || !input.getMimeDecode()) { log.add(LogType.MSG_DATA_SKIP_MIME, 1); -- cgit v1.2.3 From 35eee40d70ca5d29bdedfb7a2fc1ca688f42dca3 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 19 Sep 2015 15:45:00 +0200 Subject: inform storage provider of uri content-type for decrypted output --- .../sufficientlysecure/keychain/operations/InputDataOperation.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java index 9170dc139..7ec57cb2d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java @@ -114,6 +114,12 @@ public class InputDataOperation extends BaseOperation { return new InputDataResult(InputDataResult.RESULT_ERROR, log); } + // inform the storage provider about the mime type for this uri + if (decryptResult.getDecryptionMetadata() != null) { + TemporaryStorageProvider.setMimeType(mContext, currentInputUri, + decryptResult.getDecryptionMetadata().getMimeType()); + } + } else { currentInputUri = input.getInputUri(); } -- cgit v1.2.3 From 4c1d48bd951cbc302bdb2821bdfd501405f3abe0 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 19 Sep 2015 15:45:20 +0200 Subject: use intent icon as fallback if we get no thumbnail --- .../org/sufficientlysecure/keychain/ui/DecryptListFragment.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java index dcba595e9..a72277052 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java @@ -376,10 +376,12 @@ public class DecryptListFragment // noinspection deprecation, this should be called from Context, but not available in minSdk icon = getResources().getDrawable(R.drawable.ic_chat_black_24dp); } else if (ClipDescription.compareMimeTypes(type, "image/*")) { - int px = FormattingUtils.dpToPx(context, 48); + int px = FormattingUtils.dpToPx(context, 32); Bitmap bitmap = FileHelper.getThumbnail(context, outputUri, new Point(px, px)); icon = new BitmapDrawable(context.getResources(), bitmap); - } else { + } + + if (icon == null) { final Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(outputUri, type); -- cgit v1.2.3 From 0b181743a3d6b1423e112b17a400b5ac4ac09bcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Sun, 20 Sep 2015 22:42:50 +0200 Subject: Keyservers: Dont follow redirects, pin pgp.mit.edu, check for pinned cert on add (OKC-01-018) --- .../assets/hkps.pool.sks-keyservers.net.CA.cer | 32 +++++++++ OpenKeychain/src/main/assets/pgp.mit.edu.cer | 33 +++++++++ .../src/main/assets/sks-keyservers.netCA.cer | 32 --------- .../keychain/KeychainApplication.java | 5 +- .../keychain/keyimport/HkpKeyserver.java | 6 +- .../keychain/ui/SettingsKeyserverFragment.java | 22 +----- .../ui/dialog/AddEditKeyserverDialogFragment.java | 80 +++++++++++++++++---- .../keychain/util/TlsHelper.java | 82 +++++++--------------- .../src/main/res/layout/add_keyserver_dialog.xml | 36 +++++++--- OpenKeychain/src/main/res/values-cs/strings.xml | 4 +- OpenKeychain/src/main/res/values-de/strings.xml | 6 +- OpenKeychain/src/main/res/values-es/strings.xml | 6 +- OpenKeychain/src/main/res/values-eu/strings.xml | 6 +- OpenKeychain/src/main/res/values-fa/strings.xml | 2 +- OpenKeychain/src/main/res/values-fr/strings.xml | 6 +- OpenKeychain/src/main/res/values-it/strings.xml | 2 +- OpenKeychain/src/main/res/values-ja/strings.xml | 6 +- OpenKeychain/src/main/res/values-nl/strings.xml | 6 +- OpenKeychain/src/main/res/values-ru/strings.xml | 6 +- OpenKeychain/src/main/res/values-sr/strings.xml | 6 +- OpenKeychain/src/main/res/values-sv/strings.xml | 6 +- .../src/main/res/values-zh-rTW/strings.xml | 6 +- OpenKeychain/src/main/res/values/strings.xml | 10 +-- 23 files changed, 232 insertions(+), 174 deletions(-) create mode 100644 OpenKeychain/src/main/assets/hkps.pool.sks-keyservers.net.CA.cer create mode 100644 OpenKeychain/src/main/assets/pgp.mit.edu.cer delete mode 100644 OpenKeychain/src/main/assets/sks-keyservers.netCA.cer diff --git a/OpenKeychain/src/main/assets/hkps.pool.sks-keyservers.net.CA.cer b/OpenKeychain/src/main/assets/hkps.pool.sks-keyservers.net.CA.cer new file mode 100644 index 000000000..24a2ad2e8 --- /dev/null +++ b/OpenKeychain/src/main/assets/hkps.pool.sks-keyservers.net.CA.cer @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFizCCA3OgAwIBAgIJAK9zyLTPn4CPMA0GCSqGSIb3DQEBBQUAMFwxCzAJBgNV +BAYTAk5PMQ0wCwYDVQQIDARPc2xvMR4wHAYDVQQKDBVza3Mta2V5c2VydmVycy5u +ZXQgQ0ExHjAcBgNVBAMMFXNrcy1rZXlzZXJ2ZXJzLm5ldCBDQTAeFw0xMjEwMDkw +MDMzMzdaFw0yMjEwMDcwMDMzMzdaMFwxCzAJBgNVBAYTAk5PMQ0wCwYDVQQIDARP +c2xvMR4wHAYDVQQKDBVza3Mta2V5c2VydmVycy5uZXQgQ0ExHjAcBgNVBAMMFXNr +cy1rZXlzZXJ2ZXJzLm5ldCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBANdsWy4PXWNUCkS3L//nrd0GqN3dVwoBGZ6w94Tw2jPDPifegwxQozFXkG6I +6A4TK1CJLXPvfz0UP0aBYyPmTNadDinaB9T4jIwd4rnxl+59GiEmqkN3IfPsv5Jj +MkKUmJnvOT0DEVlEaO1UZIwx5WpfprB3mR81/qm4XkAgmYrmgnLXd/pJDAMk7y1F +45b5zWofiD5l677lplcIPRbFhpJ6kDTODXh/XEdtF71EAeaOdEGOvyGDmCO0GWqS +FDkMMPTlieLA/0rgFTcz4xwUYj/cD5e0ZBuSkYsYFAU3hd1cGfBue0cPZaQH2HYx +Qk4zXD8S3F4690fRhr+tki5gyG6JDR67aKp3BIGLqm7f45WkX1hYp+YXywmEziM4 +aSbGYhx8hoFGfq9UcfPEvp2aoc8u5sdqjDslhyUzM1v3m3ZGbhwEOnVjljY6JJLx +MxagxnZZSAY424ZZ3t71E/Mn27dm2w+xFRuoy8JEjv1d+BT3eChM5KaNwrj0IO/y +u8kFIgWYA1vZ/15qMT+tyJTfyrNVV/7Df7TNeWyNqjJ5rBmt0M6NpHG7CrUSkBy9 +p8JhimgjP5r0FlEkgg+lyD+V79H98gQfVgP3pbJICz0SpBQf2F/2tyS4rLm+49rP +fcOajiXEuyhpcmzgusAj/1FjrtlynH1r9mnNaX4e+rLWzvU5AgMBAAGjUDBOMB0G +A1UdDgQWBBTkwyoJFGfYTVISTpM8E+igjdq28zAfBgNVHSMEGDAWgBTkwyoJFGfY +TVISTpM8E+igjdq28zAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4ICAQAR +OXnYwu3g1ZjHyley3fZI5aLPsaE17cOImVTehC8DcIphm2HOMR/hYTTL+V0G4P+u +gH+6xeRLKSHMHZTtSBIa6GDL03434y9CBuwGvAFCMU2GV8w92/Z7apkAhdLToZA/ +X/iWP2jeaVJhxgEcH8uPrnSlqoPBcKC9PrgUzQYfSZJkLmB+3jEa3HKruy1abJP5 +gAdQvwvcPpvYRnIzUc9fZODsVmlHVFBCl2dlu/iHh2h4GmL4Da2rRkUMlbVTdioB +UYIvMycdOkpH5wJftzw7cpjsudGas0PARDXCFfGyKhwBRFY7Xp7lbjtU5Rz0Gc04 +lPrhDf0pFE98Aw4jJRpFeWMjpXUEaG1cq7D641RpgcMfPFvOHY47rvDTS7XJOaUT +BwRjmDt896s6vMDcaG/uXJbQjuzmmx3W2Idyh3s5SI0GTHb0IwMKYb4eBUIpQOnB +cE77VnCYqKvN1NVYAqhWjXbY7XasZvszCRcOG+W3FqNaHOK/n/0ueb0uijdLan+U +f4p1bjbAox8eAOQS/8a3bzkJzdyBNUKGx1BIK2IBL9bn/HravSDOiNRSnZ/R3l9G +ZauX0tu7IIDlRCILXSyeazu0aj/vdT3YFQXPcvt5Fkf5wiNTo53f72/jYEJd6qph +WrpoKqrwGwTpRUCMhYIUt65hsTxCiJJ5nKe39h46sg== +-----END CERTIFICATE----- diff --git a/OpenKeychain/src/main/assets/pgp.mit.edu.cer b/OpenKeychain/src/main/assets/pgp.mit.edu.cer new file mode 100644 index 000000000..7249b3611 --- /dev/null +++ b/OpenKeychain/src/main/assets/pgp.mit.edu.cer @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFpzCCBI+gAwIBAgIQSCQjuTbnogvWCWWHeCDMbzANBgkqhkiG9w0BAQsFADB2 +MQswCQYDVQQGEwJVUzELMAkGA1UECBMCTUkxEjAQBgNVBAcTCUFubiBBcmJvcjES +MBAGA1UEChMJSW50ZXJuZXQyMREwDwYDVQQLEwhJbkNvbW1vbjEfMB0GA1UEAxMW +SW5Db21tb24gUlNBIFNlcnZlciBDQTAeFw0xNDEwMDkwMDAwMDBaFw0xNzEwMDgy +MzU5NTlaMIHlMQswCQYDVQQGEwJVUzEOMAwGA1UEERMFMDIxMzkxCzAJBgNVBAgT +Ak1hMRIwEAYDVQQHEwlDYW1icmlkZ2UxHTAbBgNVBAkTFDc3IE1hc3NhY2h1c2V0 +dHMgQXZlMS4wLAYDVQQKEyVNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNo +bm9sb2d5MSowKAYDVQQLFCFJbmZvcm1hdGlvbiBTZXJ2aWNlcyAmIFRlY2hub2xv +Z3kxFDASBgNVBAsTC1BsYXRpbnVtU1NMMRQwEgYDVQQDEwtwZ3AubWl0LmVkdTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOXCQWXwK1O/saHfUEJjeE6w +VvTMe8xgl5qmkU+9U2TS6HdyVItD9fHZ3sAwVHo7mYtLGXp0S8F2hiiyLgQeQo84 +F/owinPaPU8c+2Ogw464HbROmjU7Vc/iHQklA0kR+lZsFwZuWd+nYjmPrNfm87Ik +k9Wenco7wwFUquoJ8XZW1RVTr9WRWWlyNKwPnil5aBUGtbG6CP1+IFN75xfJYjz5 +g+JcLHYsKyb6JhPYxT42ZdgTPKVRJNuIpyOMXMIPB/qFgUyU+2T/g7vxoa3THllq +vkp/ds5lpDe+uu6H9mbtMYvX5w9TBqt7YPegWcTUhGERnytXxeNpncYkzGMMUN0C +AwEAAaOCAb8wggG7MB8GA1UdIwQYMBaAFB4Fo3ePbJbiW4dLprSGrHEADOc4MB0G +A1UdDgQWBBRISoMA6cVQE5089wT6LFO4aiNnzTAOBgNVHQ8BAf8EBAMCBaAwDAYD +VR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwZwYDVR0g +BGAwXjBSBgwrBgEEAa4jAQQDAQEwQjBABggrBgEFBQcCARY0aHR0cHM6Ly93d3cu +aW5jb21tb24ub3JnL2NlcnQvcmVwb3NpdG9yeS9jcHNfc3NsLnBkZjAIBgZngQwB +AgIwRAYDVR0fBD0wOzA5oDegNYYzaHR0cDovL2NybC5pbmNvbW1vbi1yc2Eub3Jn +L0luQ29tbW9uUlNBU2VydmVyQ0EuY3JsMHUGCCsGAQUFBwEBBGkwZzA+BggrBgEF +BQcwAoYyaHR0cDovL2NydC51c2VydHJ1c3QuY29tL0luQ29tbW9uUlNBU2VydmVy +Q0FfMi5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w +FgYDVR0RBA8wDYILcGdwLm1pdC5lZHUwDQYJKoZIhvcNAQELBQADggEBAHbQqv2o +LrRD8rMzaHvPHVa92gfi6bpEsiRsVw3kpH4D4k+PL9LWkgtgTWpM+MvskiUvS9ay +FbWdXiy/peOj421fwnL/re9gmWs1g7FtUrDgIpz2T2jonPqbnIJPMHxI+ICWZMYH +V/dO844geRKAiGs/UZbG4Uf1Jo0PxtPtD5puaUk4l9Va8WHU2OLq0kzS9K+iu/sx +z0XG+fAMneyiXm5jtfjYE2W8/h61RhZulSUmYBkiMLzKr5eqe2VIkMqyTfyZ5zms +1LZ1GWaouMsTBN1+2TXssQ71L1tIZg/lXJVlfVRkwOIV5Mp3ohxLSBZT8qNSef1v +mFNa+DGU1sdl6m4= +-----END CERTIFICATE----- diff --git a/OpenKeychain/src/main/assets/sks-keyservers.netCA.cer b/OpenKeychain/src/main/assets/sks-keyservers.netCA.cer deleted file mode 100644 index 24a2ad2e8..000000000 --- a/OpenKeychain/src/main/assets/sks-keyservers.netCA.cer +++ /dev/null @@ -1,32 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFizCCA3OgAwIBAgIJAK9zyLTPn4CPMA0GCSqGSIb3DQEBBQUAMFwxCzAJBgNV -BAYTAk5PMQ0wCwYDVQQIDARPc2xvMR4wHAYDVQQKDBVza3Mta2V5c2VydmVycy5u -ZXQgQ0ExHjAcBgNVBAMMFXNrcy1rZXlzZXJ2ZXJzLm5ldCBDQTAeFw0xMjEwMDkw -MDMzMzdaFw0yMjEwMDcwMDMzMzdaMFwxCzAJBgNVBAYTAk5PMQ0wCwYDVQQIDARP -c2xvMR4wHAYDVQQKDBVza3Mta2V5c2VydmVycy5uZXQgQ0ExHjAcBgNVBAMMFXNr -cy1rZXlzZXJ2ZXJzLm5ldCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBANdsWy4PXWNUCkS3L//nrd0GqN3dVwoBGZ6w94Tw2jPDPifegwxQozFXkG6I -6A4TK1CJLXPvfz0UP0aBYyPmTNadDinaB9T4jIwd4rnxl+59GiEmqkN3IfPsv5Jj -MkKUmJnvOT0DEVlEaO1UZIwx5WpfprB3mR81/qm4XkAgmYrmgnLXd/pJDAMk7y1F -45b5zWofiD5l677lplcIPRbFhpJ6kDTODXh/XEdtF71EAeaOdEGOvyGDmCO0GWqS -FDkMMPTlieLA/0rgFTcz4xwUYj/cD5e0ZBuSkYsYFAU3hd1cGfBue0cPZaQH2HYx -Qk4zXD8S3F4690fRhr+tki5gyG6JDR67aKp3BIGLqm7f45WkX1hYp+YXywmEziM4 -aSbGYhx8hoFGfq9UcfPEvp2aoc8u5sdqjDslhyUzM1v3m3ZGbhwEOnVjljY6JJLx -MxagxnZZSAY424ZZ3t71E/Mn27dm2w+xFRuoy8JEjv1d+BT3eChM5KaNwrj0IO/y -u8kFIgWYA1vZ/15qMT+tyJTfyrNVV/7Df7TNeWyNqjJ5rBmt0M6NpHG7CrUSkBy9 -p8JhimgjP5r0FlEkgg+lyD+V79H98gQfVgP3pbJICz0SpBQf2F/2tyS4rLm+49rP -fcOajiXEuyhpcmzgusAj/1FjrtlynH1r9mnNaX4e+rLWzvU5AgMBAAGjUDBOMB0G -A1UdDgQWBBTkwyoJFGfYTVISTpM8E+igjdq28zAfBgNVHSMEGDAWgBTkwyoJFGfY -TVISTpM8E+igjdq28zAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4ICAQAR -OXnYwu3g1ZjHyley3fZI5aLPsaE17cOImVTehC8DcIphm2HOMR/hYTTL+V0G4P+u -gH+6xeRLKSHMHZTtSBIa6GDL03434y9CBuwGvAFCMU2GV8w92/Z7apkAhdLToZA/ -X/iWP2jeaVJhxgEcH8uPrnSlqoPBcKC9PrgUzQYfSZJkLmB+3jEa3HKruy1abJP5 -gAdQvwvcPpvYRnIzUc9fZODsVmlHVFBCl2dlu/iHh2h4GmL4Da2rRkUMlbVTdioB -UYIvMycdOkpH5wJftzw7cpjsudGas0PARDXCFfGyKhwBRFY7Xp7lbjtU5Rz0Gc04 -lPrhDf0pFE98Aw4jJRpFeWMjpXUEaG1cq7D641RpgcMfPFvOHY47rvDTS7XJOaUT -BwRjmDt896s6vMDcaG/uXJbQjuzmmx3W2Idyh3s5SI0GTHb0IwMKYb4eBUIpQOnB -cE77VnCYqKvN1NVYAqhWjXbY7XasZvszCRcOG+W3FqNaHOK/n/0ueb0uijdLan+U -f4p1bjbAox8eAOQS/8a3bzkJzdyBNUKGx1BIK2IBL9bn/HravSDOiNRSnZ/R3l9G -ZauX0tu7IIDlRCILXSyeazu0aj/vdT3YFQXPcvt5Fkf5wiNTo53f72/jYEJd6qph -WrpoKqrwGwTpRUCMhYIUt65hsTxCiJJ5nKe39h46sg== ------END CERTIFICATE----- diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 311ef2d3b..45d81749a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -91,14 +91,15 @@ public class KeychainApplication extends Application { } brandGlowEffect(getApplicationContext(), - FormattingUtils.getColorFromAttr(getApplicationContext(), R.attr.colorPrimary)); + FormattingUtils.getColorFromAttr(getApplicationContext(), R.attr.colorPrimary)); setupAccountAsNeeded(this); // Update keyserver list as needed Preferences.getPreferences(this).upgradePreferences(this); - TlsHelper.addStaticCA("pool.sks-keyservers.net", getAssets(), "sks-keyservers.netCA.cer"); + TlsHelper.addPinnedCertificate("hkps.pool.sks-keyservers.net", getAssets(), "hkps.pool.sks-keyservers.net.CA.cer"); + TlsHelper.addPinnedCertificate("pgp.mit.edu", getAssets(), "pgp.mit.edu.cer"); TemporaryStorageProvider.cleanUp(this); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java index 558b8ce7d..5683decdf 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java @@ -204,11 +204,15 @@ public class HkpKeyserver extends Keyserver { OkHttpClient client = new OkHttpClient(); try { - TlsHelper.pinCertificateIfNecessary(client, url); + TlsHelper.usePinnedCertificateIfAvailable(client, url); } catch (TlsHelper.TlsHelperException e) { Log.w(Constants.TAG, e); } + // don't follow any redirects + client.setFollowRedirects(false); + client.setFollowSslRedirects(false); + if (proxy != null) { client.setProxy(proxy); client.setConnectTimeout(30000, TimeUnit.MILLISECONDS); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java index d8edbe4f8..5a8ab36bc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java @@ -155,7 +155,7 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC data.getBoolean(AddEditKeyserverDialogFragment.MESSAGE_VERIFIED); if (verified) { Notify.create(getActivity(), - R.string.add_keyserver_verified, Notify.Style.OK).show(); + R.string.add_keyserver_connection_verified, Notify.Style.OK).show(); } else { Notify.create(getActivity(), R.string.add_keyserver_without_verification, @@ -177,26 +177,6 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC } break; } - case AddEditKeyserverDialogFragment.MESSAGE_VERIFICATION_FAILED: { - AddEditKeyserverDialogFragment.FailureReason failureReason = - (AddEditKeyserverDialogFragment.FailureReason) data.getSerializable( - AddEditKeyserverDialogFragment.MESSAGE_FAILURE_REASON); - switch (failureReason) { - case CONNECTION_FAILED: { - Notify.create(getActivity(), - R.string.add_keyserver_connection_failed, - Notify.Style.ERROR).show(); - break; - } - case INVALID_URL: { - Notify.create(getActivity(), - R.string.add_keyserver_invalid_url, - Notify.Style.ERROR).show(); - break; - } - } - break; - } } } }; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java index 47bc7dfda..3d96f3c6d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java @@ -24,6 +24,7 @@ import java.net.URI; import java.net.URISyntaxException; import android.app.Activity; +import android.support.design.widget.TextInputLayout; import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; @@ -44,6 +45,7 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.CheckBox; +import android.widget.CompoundButton; import android.widget.EditText; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; @@ -54,6 +56,7 @@ import com.squareup.okhttp.Request; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.keyimport.HkpKeyserver; +import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.TlsHelper; @@ -68,11 +71,9 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On private static final String ARG_KEYSERVER = "arg_keyserver"; public static final int MESSAGE_OKAY = 1; - public static final int MESSAGE_VERIFICATION_FAILED = 2; public static final String MESSAGE_KEYSERVER = "new_keyserver"; public static final String MESSAGE_VERIFIED = "verified"; - public static final String MESSAGE_FAILURE_REASON = "failure_reason"; public static final String MESSAGE_KEYSERVER_DELETED = "keyserver_deleted"; public static final String MESSAGE_DIALOG_ACTION = "message_dialog_action"; public static final String MESSAGE_EDIT_POSITION = "keyserver_edited_position"; @@ -82,7 +83,9 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On private int mPosition; private EditText mKeyserverEditText; + private TextInputLayout mKeyserverEditTextLayout; private CheckBox mVerifyKeyserverCheckBox; + private CheckBox mOnlyTrustedKeyserverCheckBox; public enum DialogAction { ADD, @@ -91,7 +94,8 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On public enum FailureReason { INVALID_URL, - CONNECTION_FAILED + CONNECTION_FAILED, + NO_PINNED_CERTIFICATE } public static AddEditKeyserverDialogFragment newInstance(Messenger messenger, @@ -126,7 +130,15 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On alert.setView(view); mKeyserverEditText = (EditText) view.findViewById(R.id.keyserver_url_edit_text); - mVerifyKeyserverCheckBox = (CheckBox) view.findViewById(R.id.verify_keyserver_checkbox); + mKeyserverEditTextLayout = (TextInputLayout) view.findViewById(R.id.keyserver_url_edit_text_layout); + mVerifyKeyserverCheckBox = (CheckBox) view.findViewById(R.id.verify_connection_checkbox); + mOnlyTrustedKeyserverCheckBox = (CheckBox) view.findViewById(R.id.only_trusted_keyserver_checkbox); + mVerifyKeyserverCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + mOnlyTrustedKeyserverCheckBox.setEnabled(isChecked); + } + }); switch (mDialogAction) { case ADD: { @@ -212,6 +224,8 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On positiveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + mKeyserverEditTextLayout.setErrorEnabled(false); + // behaviour same for edit and add final String keyserverUrl = mKeyserverEditText.getText().toString(); if (mVerifyKeyserverCheckBox.isChecked()) { @@ -220,13 +234,20 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On OrbotHelper.DialogActions dialogActions = new OrbotHelper.DialogActions() { @Override public void onOrbotStarted() { - verifyConnection(keyserverUrl, - proxyPrefs.parcelableProxy.getProxy()); + verifyConnection( + keyserverUrl, + proxyPrefs.parcelableProxy.getProxy(), + mOnlyTrustedKeyserverCheckBox.isChecked() + ); } @Override public void onNeutralButton() { - verifyConnection(keyserverUrl, null); + verifyConnection( + keyserverUrl, + null, + mOnlyTrustedKeyserverCheckBox.isChecked() + ); } @Override @@ -236,7 +257,11 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On }; if (OrbotHelper.putOrbotInRequiredState(dialogActions, getActivity())) { - verifyConnection(keyserverUrl, proxyPrefs.parcelableProxy.getProxy()); + verifyConnection( + keyserverUrl, + proxyPrefs.parcelableProxy.getProxy(), + mOnlyTrustedKeyserverCheckBox.isChecked() + ); } } else { dismiss(); @@ -272,14 +297,28 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On sendMessageToHandler(MESSAGE_OKAY, data); } - public void verificationFailed(FailureReason reason) { - Bundle data = new Bundle(); - data.putSerializable(MESSAGE_FAILURE_REASON, reason); + public void verificationFailed(FailureReason failureReason) { + switch (failureReason) { + case CONNECTION_FAILED: { + mKeyserverEditTextLayout.setError( + getString(R.string.add_keyserver_connection_failed)); + break; + } + case INVALID_URL: { + mKeyserverEditTextLayout.setError( + getString(R.string.add_keyserver_invalid_url)); + break; + } + case NO_PINNED_CERTIFICATE: { + mKeyserverEditTextLayout.setError( + getString(R.string.add_keyserver_keyserver_not_trusted)); + break; + } + } - sendMessageToHandler(MESSAGE_VERIFICATION_FAILED, data); } - public void verifyConnection(String keyserver, final Proxy proxy) { + public void verifyConnection(String keyserver, final Proxy proxy, final boolean onlyTrustedKeyserver) { new AsyncTask() { ProgressDialog mProgressDialog; @@ -288,7 +327,7 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On @Override protected void onPreExecute() { mProgressDialog = new ProgressDialog(getActivity()); - mProgressDialog.setMessage(getString(R.string.progress_verifying_keyserver_url)); + mProgressDialog.setMessage(getString(R.string.progress_verifying_keyserver_connection)); mProgressDialog.setCancelable(false); mProgressDialog.show(); } @@ -316,7 +355,18 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On Log.d("Converted URL", newKeyserver.toString()); OkHttpClient client = HkpKeyserver.getClient(newKeyserver.toURL(), proxy); - TlsHelper.pinCertificateIfNecessary(client, newKeyserver.toURL()); + + // don't follow any redirects + client.setFollowRedirects(false); + client.setFollowSslRedirects(false); + + if (onlyTrustedKeyserver + && !TlsHelper.usePinnedCertificateIfAvailable(client, newKeyserver.toURL())) { + Log.w(Constants.TAG, "No pinned certificate for this host in OpenKeychain's assets."); + reason = FailureReason.NO_PINNED_CERTIFICATE; + return reason; + } + client.newCall(new Request.Builder().url(newKeyserver.toURL()).build()).execute(); } catch (TlsHelper.TlsHelperException e) { reason = FailureReason.CONNECTION_FAILED; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java index d1d1ada2a..1492abdeb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013-2014 Dominik Schürmann + * Copyright (C) 2013-2015 Dominik Schürmann * * 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 @@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.util; import android.content.res.AssetManager; import com.squareup.okhttp.OkHttpClient; + import org.sufficientlysecure.keychain.Constants; import java.io.ByteArrayInputStream; @@ -37,7 +38,6 @@ import java.security.cert.CertificateFactory; import java.util.HashMap; import java.util.Map; -import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; @@ -49,15 +49,14 @@ public class TlsHelper { } } - private static Map sStaticCA = new HashMap<>(); - - public static void addStaticCA(String domain, byte[] certificate) { - sStaticCA.put(domain, certificate); - } + private static Map sPinnedCertificates = new HashMap<>(); - public static void addStaticCA(String domain, AssetManager assetManager, String name) { + /** + * Add certificate from assets to pinned certificate map. + */ + public static void addPinnedCertificate(String host, AssetManager assetManager, String cerFilename) { try { - InputStream is = assetManager.open(name); + InputStream is = assetManager.open(cerFilename); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int reads = is.read(); @@ -68,27 +67,36 @@ public class TlsHelper { is.close(); - addStaticCA(domain, baos.toByteArray()); + sPinnedCertificates.put(host, baos.toByteArray()); } catch (IOException e) { Log.w(Constants.TAG, e); } } - public static void pinCertificateIfNecessary(OkHttpClient client, URL url) throws TlsHelperException, IOException { + /** + * Use pinned certificate for OkHttpClient if we have one. + * + * @return true, if certificate is available, false if not + * @throws TlsHelperException + * @throws IOException + */ + public static boolean usePinnedCertificateIfAvailable(OkHttpClient client, URL url) throws TlsHelperException, IOException { if (url.getProtocol().equals("https")) { - for (String domain : sStaticCA.keySet()) { - if (url.getHost().endsWith(domain)) { - pinCertificate(sStaticCA.get(domain), client); + // use certificate PIN from assets if we have one + for (String host : sPinnedCertificates.keySet()) { + if (url.getHost().endsWith(host)) { + pinCertificate(sPinnedCertificates.get(host), client); + return true; } } } + return false; } /** * Modifies the client to accept only requests with a given certificate. Applies to all URLs requested by the * client. * Therefore a client that is pinned this way should be used to only make requests to URLs with passed certificate. - * TODO: Refactor - More like SSH StrictHostKeyChecking than pinning? * * @param certificate certificate to pin * @param client OkHttpClient to enforce pinning on @@ -97,8 +105,10 @@ public class TlsHelper { */ private static void pinCertificate(byte[] certificate, OkHttpClient client) throws TlsHelperException, IOException { - // We don't use OkHttp's CertificatePinner since it depends on a TrustManager to verify it too. Refer to - // note at end of description: http://square.github.io/okhttp/javadoc/com/squareup/okhttp/CertificatePinner.html + // We don't use OkHttp's CertificatePinner since it can not be used to pin self-signed + // certificate if such certificate is not accepted by TrustManager. + // (Refer to note at end of description: + // http://square.github.io/okhttp/javadoc/com/squareup/okhttp/CertificatePinner.html ) // Creating our own TrustManager that trusts only our certificate eliminates the need for certificate pinning try { // Load CA @@ -126,42 +136,4 @@ public class TlsHelper { } } - /** - * Opens a Connection that will only accept certificates signed with a specific CA and skips common name check. - * This is required for some distributed Keyserver networks like sks-keyservers.net - * - * @param certificate The X.509 certificate used to sign the servers certificate - * @param url Connection target - */ - public static HttpsURLConnection openCAConnection(byte[] certificate, URL url) - throws TlsHelperException, IOException { - try { - // Load CA - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - Certificate ca = cf.generateCertificate(new ByteArrayInputStream(certificate)); - - // Create a KeyStore containing our trusted CAs - String keyStoreType = KeyStore.getDefaultType(); - KeyStore keyStore = KeyStore.getInstance(keyStoreType); - keyStore.load(null, null); - keyStore.setCertificateEntry("ca", ca); - - // Create a TrustManager that trusts the CAs in our KeyStore - String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); - TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); - tmf.init(keyStore); - - // Create an SSLContext that uses our TrustManager - SSLContext context = SSLContext.getInstance("TLS"); - context.init(null, tmf.getTrustManagers(), null); - - // Tell the URLConnection to use a SocketFactory from our SSLContext - HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); - urlConnection.setSSLSocketFactory(context.getSocketFactory()); - - return urlConnection; - } catch (CertificateException | KeyManagementException | KeyStoreException | NoSuchAlgorithmException e) { - throw new TlsHelperException(e); - } - } } diff --git a/OpenKeychain/src/main/res/layout/add_keyserver_dialog.xml b/OpenKeychain/src/main/res/layout/add_keyserver_dialog.xml index 78e9247ea..b83681537 100644 --- a/OpenKeychain/src/main/res/layout/add_keyserver_dialog.xml +++ b/OpenKeychain/src/main/res/layout/add_keyserver_dialog.xml @@ -9,21 +9,37 @@ android:paddingRight="24dp" android:paddingTop="16dp"> - + android:layout_marginBottom="8dp"> + + + + + + + + android:checked="true" + android:text="@string/label_only_trusted_keyserver" /> \ No newline at end of file diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml index 6b6bc956b..79a5a276c 100644 --- a/OpenKeychain/src/main/res/values-cs/strings.xml +++ b/OpenKeychain/src/main/res/values-cs/strings.xml @@ -135,7 +135,7 @@ Zapnout kompresi Zašifrovat jména souborů Skrýt příjemce - Ověřit keyserver + Ověřit keyserver Zadejte URL keyserveru OpenPGP keyserver Vyhledat klíče na vybraném OpenPGP keyserveru (protokol HKP) @@ -496,7 +496,7 @@ <žádný> Přidat keyserver - Keyserver ověřen! + Keyserver ověřen! Keyserver přidán bez verifikace. Neplatná URL! Nepodařilo se připojit ke key severu. Prosím ověřte URL a vaše připojení k internetu. diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml index 291ebf238..0e4a43c6f 100644 --- a/OpenKeychain/src/main/res/values-de/strings.xml +++ b/OpenKeychain/src/main/res/values-de/strings.xml @@ -155,7 +155,7 @@ Komprimierung aktivieren Dateinamen verschlüsseln Empfänger verbergen - Schlüsselserver verifizieren + Schlüsselserver verifizieren Schlüsselserver-URL eingeben Schlüsselserver löschen Design @@ -386,7 +386,7 @@ Lösche Schlüssel… Zusammenführung: Sichere in den Zwischenspeicher... Zusammenführung: Reimportiere... - Schlüsselserver wird verifiziert… + Schlüsselserver wird verifiziert… Orbot wird gestartet… Via Name, E-Mail suchen... @@ -691,7 +691,7 @@ Schlüsselserver hinzufügen Schlüsselserver bearbeiten - Schlüsselserver verifiziert! + Schlüsselserver verifiziert! Schlüsselserver ohne Verifikation hinzugefügt. Ungültige URL! Verbindung zum Schlüsselserver fehlgeschlagen. Bitte überprüfe die URL und deine Internetverbindung. diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml index 043918c64..a6849c542 100644 --- a/OpenKeychain/src/main/res/values-es/strings.xml +++ b/OpenKeychain/src/main/res/values-es/strings.xml @@ -155,7 +155,7 @@ Habilitar compresión Cifrar nombres de ficheros Ocultar receptores - Verificar servidor de claves + Verificar servidor de claves Introduzca URL de servidor de claves Borrar servidor de claves Tema decorativo @@ -386,7 +386,7 @@ borrando claves... consolidación: guardando en caché... consolidación: reimportando - verificando servidor de claves... + verificando servidor de claves... Iniciando Orbot... Buscar mediante Nombre, Correo electrónico... @@ -691,7 +691,7 @@ Añadir servidor de claves Editar servidor de claves - ¡Servidor de claves verificado! + ¡Servidor de claves verificado! Servidor de claves añadido sin verificación ¡URL no válida! Fallo al conectar al servidor de claves. Por favor, compuebe la URL y su conexión a Internet. diff --git a/OpenKeychain/src/main/res/values-eu/strings.xml b/OpenKeychain/src/main/res/values-eu/strings.xml index de4fb68d6..f57297498 100644 --- a/OpenKeychain/src/main/res/values-eu/strings.xml +++ b/OpenKeychain/src/main/res/values-eu/strings.xml @@ -154,7 +154,7 @@ Gaitu konpresioa Enkriptatu agirizenak Ezkutatu jasotzaileak - Egiaztatu giltza-zerbitzaria + Egiaztatu giltza-zerbitzaria Sartu giltza-zerbitzariaren URL-a Ezabatu giltza-zerbitzaria Azalgaia @@ -376,7 +376,7 @@ giltzak ezabatzen... sendotu: katxean gordetzen... sendotu: berrinportatzen... - giltza-zerbitzaria egiaztatzen... + giltza-zerbitzaria egiaztatzen... Orbot Abiarazten... Bilatu Izena, Post@... bidez @@ -675,7 +675,7 @@ Gehitu giltza-zerbitzaria Editatu giltza-zerbitzaria - Giltza-zerbitzaria egiaztatuta! + Giltza-zerbitzaria egiaztatuta! Giltza-zerbitzaria gehituta egiaztapen gabe. URL baliogabea! Hutsegitea giltza-zerbitzariarekin elkartzerakoan. Mesedez egiaztatu URL-a eta zure internet elkarketa. diff --git a/OpenKeychain/src/main/res/values-fa/strings.xml b/OpenKeychain/src/main/res/values-fa/strings.xml index 86d8ab5cd..790d5e90c 100644 --- a/OpenKeychain/src/main/res/values-fa/strings.xml +++ b/OpenKeychain/src/main/res/values-fa/strings.xml @@ -146,7 +146,7 @@ فشرده‌کردن رمزگذاری اسمِ فایل‌ها مخفی‌کردن گیرنده‌ها - بررسی سرورِ کلیدها + بررسی سرورِ کلیدها آدرس URL سرورِ کلید را وارد کنید حذف سرورهای کلید قالب diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index 4a6c2bbfe..b5e5f3d53 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -155,7 +155,7 @@ Activer la compression Chiffrer les nom de fichier Cacher les destinataires - Vérifier le serveur de clefs + Vérifier le serveur de clefs Saisir l\'URL du serveur de clefs Supprimer le serveur de clefs Thème @@ -386,7 +386,7 @@ suppression des clefs... consolider : enregistrement dans le cache... consolider : réimportation... - vérification du serveur de clefs... + vérification du serveur de clefs... Démarrage d\'Orbot... Chercher par nom, adresse courriel... @@ -691,7 +691,7 @@ Ajouter un serveur de clefs Modifier le serveur de clefs - Le serveur de clefs a été vérifié ! + Le serveur de clefs a été vérifié ! Le serveur de clefs a été ajouté sans vérification. URL invalide ! Échec de connexion au serveur de clefs. Veuillez vérifier l\'URL et votre connexion Internet. diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml index 9f58dc3ba..5b87c6ced 100644 --- a/OpenKeychain/src/main/res/values-it/strings.xml +++ b/OpenKeychain/src/main/res/values-it/strings.xml @@ -149,7 +149,7 @@ Abilitare compressione Codifica nome dei file Nascondi destinatari - Verificare server chiavi + Verificare server chiavi Inserisci URL server chiavi Cancella server chiavi Server chiavi OpenPGP diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index 6f735b35b..789a35e75 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -155,7 +155,7 @@ 圧縮を有効 暗号化するファイル名 受信者を隠す - 鍵サーバを検証 + 鍵サーバを検証 鍵サーバのURLを入力 鍵サーバの削除 テーマ @@ -382,7 +382,7 @@ 鍵の削除中... 統合: キャッシュへ保存… 統合: 再インポート中… - 鍵サーバの検証... + 鍵サーバの検証... Orbotを始める... 名前、Email...で検索 @@ -674,7 +674,7 @@ 鍵サーバを追加 鍵サーバの編集 - 鍵サーバを検証しました! + 鍵サーバを検証しました! 鍵サーバを検証なしで追加した。 無効なURLです! 鍵サーバへの接続し失敗。URLとあなたのインターネット接続をチェックしてください。 diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml index 1a02fdc07..812376026 100644 --- a/OpenKeychain/src/main/res/values-nl/strings.xml +++ b/OpenKeychain/src/main/res/values-nl/strings.xml @@ -151,7 +151,7 @@ Compressie aanzetten Versleutel bestandsnamen Verberg ontvangers - Sleutelserver verifiëren + Sleutelserver verifiëren Voer sleutelserver-URL in Sleutelserver verwijderen Thema @@ -366,7 +366,7 @@ bezig met verwijderen van sleutels… consolidatie: bezig met opslaan naar cache… consolidatie: bezig met opnieuw importeren… - bezig met verifiëren van sleutelserver… + bezig met verifiëren van sleutelserver… Zoeken via naam, e-mail, ... @@ -648,7 +648,7 @@ Sleutelserver toevoegen Sleutelserver bewerken - Sleutelserver geverifieerd! + Sleutelserver geverifieerd! Sleutelserver toegevoegd zonder verificatie. Ongeldige URL! Kon niet verbinden met sleutelserver. Controleer de URL en je internetverbinding. diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml index 55a5afa5e..6b73d367c 100644 --- a/OpenKeychain/src/main/res/values-ru/strings.xml +++ b/OpenKeychain/src/main/res/values-ru/strings.xml @@ -152,7 +152,7 @@ Использовать сжатие Шифровать имена файлов Скрыть получателей - Подтвердить сервер ключей + Подтвердить сервер ключей Введите адрес сервера ключей Удалить сервер ключей Тема @@ -364,7 +364,7 @@ удаление ключей... объединение: сохранение в кэш... объединение: реимпорт... - подтверждение сервера ключей... + подтверждение сервера ключей... Искать через Имя, Email... @@ -568,7 +568,7 @@ <нет> Добавить сервер ключей - Сервер ключей подтверждён! + Сервер ключей подтверждён! Сервер ключей добавлен без подтверждения. Неправильный адрес! diff --git a/OpenKeychain/src/main/res/values-sr/strings.xml b/OpenKeychain/src/main/res/values-sr/strings.xml index 5c6d03950..ed7bce5f7 100644 --- a/OpenKeychain/src/main/res/values-sr/strings.xml +++ b/OpenKeychain/src/main/res/values-sr/strings.xml @@ -155,7 +155,7 @@ Омогући компресију Шифруј имена фајлова Сакриј примаоце - Овери сервер кључева + Овери сервер кључева Унесите УРЛ сервера кључева Обриши сервер кључева Тема @@ -390,7 +390,7 @@ бришем кључеве… учвршћивање: уписујем у кеш… учвршћивање: поново увозим… - оверавам сервер кључева… + оверавам сервер кључева… Покрећем Орбот… Тражи преко имена, е-адресе… @@ -709,7 +709,7 @@ Додај сервер кључева Промени сервер кључева - Сервер кључева оверен! + Сервер кључева оверен! Сервер кључева додат без оверивања. Неисправан УРЛ! Неуспех повезивања са сервером кључева. Проверите УРЛ и вашу везу са интернетом. diff --git a/OpenKeychain/src/main/res/values-sv/strings.xml b/OpenKeychain/src/main/res/values-sv/strings.xml index 1ccac9199..4a0a9d083 100644 --- a/OpenKeychain/src/main/res/values-sv/strings.xml +++ b/OpenKeychain/src/main/res/values-sv/strings.xml @@ -135,7 +135,7 @@ Aktivera kompression Kryptera filnamn Dölj mottagare - Verifiera nyckelserver + Verifiera nyckelserver Ange nyckelserver-URL OpenPGP nyckelservrar Sök nycklar på valda OpenPGP nyckelservrar (HKP-protokollet) @@ -313,7 +313,7 @@ raderar nycklar… konsolidera: sparar till cache… konsolidera: återimporterar… - verifierar nyckelserver... + verifierar nyckelserver... Söker via Namn, E-post... @@ -565,7 +565,7 @@ <ingen> Lägg till nyckelserver - Nyckelserver verifierad! + Nyckelserver verifierad! Nyckelserver tillagd utan verifiering. Ogiltig URL! Misslyckades med att ansluta till nyckelserver. Kontrollera URL:en och din internetanslutning. diff --git a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml index 74d1cd781..87144422d 100644 --- a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml +++ b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml @@ -149,7 +149,7 @@ 啓用壓縮 加密檔名 隱藏收件人 - 驗證金鑰伺服器 + 驗證金鑰伺服器 輸入金鑰伺服器網址 刪除金鑰伺服器 主題 @@ -362,7 +362,7 @@ 正在驗證完整性… 正在安全地刪除 \'%s\'... 正在刪除金鑰… - 正在驗證金鑰伺服器... + 正在驗證金鑰伺服器... 正在啟動Orbot... 使用姓名,電子郵件尋找... @@ -625,7 +625,7 @@ 新增金鑰伺服器 編輯金鑰伺服器 - 已驗證金鑰伺服器! + 已驗證金鑰伺服器! 已新增金鑰伺服器但並未進行驗證。 URL無效! 連線到金鑰伺服器失敗。請確認金鑰伺服器網址及網路連線。 diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 62083cbb4..c83b598ed 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -172,8 +172,9 @@ "Encrypt filenames" "Hide recipients" - "Verify keyserver" - "Enter keyserver URL" + "Test connection" + "Only trusted keyserver" + "URL" "Delete keyserver" "Theme" @@ -445,7 +446,7 @@ "consolidate: saving to cache…" "consolidate: reimporting…" - "verifying keyserver…" + "verifying connection…" "Starting Orbot…" @@ -778,9 +779,10 @@ "Add keyserver" "Edit keyserver" - "Keyserver verified!" + "Connection verified!" "Keyserver added without verification." "Invalid URL!" + "Keyserver is not one of the trusted ones (no pinned certificate available)!" "Failed to connect to keyserver. Please check the URL and your Internet connection." "%s deleted" "Cannot delete last keyserver. At least one is required!" -- cgit v1.2.3 From d8f664bd179e76c2b9eb9fda4ffc3254a1ded067 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 21 Sep 2015 11:49:03 +0200 Subject: mime: don't do mime parsing if the encrypted data has a filename --- .../keychain/operations/InputDataOperation.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java index 7ec57cb2d..7ec33874f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/InputDataOperation.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import android.content.Context; import android.net.Uri; import android.support.annotation.NonNull; +import android.text.TextUtils; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; @@ -124,14 +125,17 @@ public class InputDataOperation extends BaseOperation { currentInputUri = input.getInputUri(); } - // don't even attempt if we know the data isn't suitable for mime content + // don't even attempt if we know the data isn't suitable for mime content, or if we have a filename boolean skipMimeParsing = false; if (decryptResult != null && decryptResult.getDecryptionMetadata() != null) { - String contentType = decryptResult.getDecryptionMetadata().getMimeType(); - if (contentType != null - && !contentType.startsWith("multipart/") - && !contentType.startsWith("text/") - && !contentType.startsWith("application/")) { + OpenPgpMetadata metadata = decryptResult.getDecryptionMetadata(); + String fileName = metadata.getFilename(); + String contentType = metadata.getMimeType(); + if (!TextUtils.isEmpty(fileName) + || contentType != null + && !contentType.startsWith("multipart/") + && !contentType.startsWith("text/") + && !contentType.startsWith("application/")) { skipMimeParsing = true; } } -- cgit v1.2.3 From ad2c8867e67e71f8b3d88db93911a7e37ed4bf69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 21 Sep 2015 12:49:02 +0200 Subject: Use more modular Keybase lib with OkHttp wrapper --- OpenKeychain/build.gradle | 38 ++++++----- .../keychain/keyimport/KeybaseKeyserver.java | 11 +++- .../operations/KeybaseVerificationOperation.java | 35 ++++++---- .../keychain/ui/ViewKeyKeybaseFragment.java | 6 +- .../keychain/util/FilterCursorWrapper.java | 17 +++++ .../keychain/util/OkHttpKeybaseClient.java | 74 ++++++++++++++++++++++ extern/KeybaseLib | 2 +- 7 files changed, 149 insertions(+), 34 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/OkHttpKeybaseClient.java diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 9d29d0a98..9d6735676 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -57,7 +57,8 @@ dependencies { compile 'com.mikepenz.iconics:meteocons-typeface:1.1.1@aar' compile 'com.mikepenz.iconics:community-material-typeface:1.0.0@aar' compile 'com.nispok:snackbar:2.11.0' - compile 'com.squareup.okhttp:okhttp:2.4.0' + compile 'com.squareup.okhttp:okhttp:2.5.0' + compile 'com.squareup.okhttp:okhttp-urlconnection:2.5.0' compile 'org.apache.james:apache-mime4j-core:0.7.2' compile 'org.apache.james:apache-mime4j-dom:0.7.2' compile 'org.thoughtcrime.ssl.pinning:AndroidPinning:1.0.0' @@ -91,31 +92,38 @@ dependencyVerification { 'com.jpardogo.materialtabstrip:library:c6ef812fba4f74be7dc4a905faa4c2908cba261a94c13d4f96d5e67e4aad4aaa', 'com.getbase:floatingactionbutton:052aa2a94e49e5dccc97cb99f2add87e8698b84859f0e3ac181100c0bc7640ca', 'org.commonjava.googlecode.markdown4j:markdown4j:e952e825d29e1317d96f79f346bfb6786c7c5eef50bd26e54a80823704b62e13', + 'org.ocpsoft.prettytime:prettytime:a6bc2641b3ab7873df604b77b6680c75b86d98e78afefb367940972f925591b5', 'com.splitwise:tokenautocomplete:20bee71cc59b3828eb000b684d46ddf738efd56b8fee453a509cd16fda42c8cb', 'se.emilsjolander:stickylistheaders:8c05981ec5725be33f7cee5e68c13f3db49cd5c75f1aaeb04024920b1ef96ad4', + 'com.mikepenz:materialdrawer:70c3efb3842461db41df6a918ea93969a7da21e63c092be838b153e5a47a17bf', 'org.sufficientlysecure:html-textview:1d3bed31ef837437154de8d2362a0e6b0e59b6c3535d87ee48c2fab12c84f9bb', + 'com.mikepenz.iconics:octicons-typeface:67ed7d456a9ce5f5307b85f955797bfb3dd674e2f6defb31c6b8bbe2ede290be', 'com.mikepenz:iconics:c1a02203d8e0d638959463c00af3ab9096e0a7c1ad5928762eb10ef5ce8a63cd', - 'com.mikepenz:materialdrawer:70c3efb3842461db41df6a918ea93969a7da21e63c092be838b153e5a47a17bf', + 'com.mikepenz.iconics:community-material-typeface:f1c5afee5f0f10d66beb3ed0df977246a02a9c46de4e05d7c0264bcde53b6b7f', 'com.mikepenz.iconics:meteocons-typeface:39a8a9e70cd8287cdb119af57a672a41dd09240dba6697f5a0dbda1ccc33298b', - 'com.mikepenz.iconics:octicons-typeface:67ed7d456a9ce5f5307b85f955797bfb3dd674e2f6defb31c6b8bbe2ede290be', + 'com.squareup.okhttp:okhttp:1cc716e29539adcda677949508162796daffedb4794cbf947a6f65e696f0381c', 'com.nispok:snackbar:46b5eb9d630d329e13c2ce00ee9fb115ffb66c23c72cff32ee97eedd76824c6f', - 'com.mikepenz.iconics:community-material-typeface:f1c5afee5f0f10d66beb3ed0df977246a02a9c46de4e05d7c0264bcde53b6b7f', - 'com.squareup.okhttp:okhttp:bc0da7ac1f5441619faa2082811938acf7df97e4a8e08f0e043ff4937414d5ad', -// 'OpenKeychain.extern.openkeychain-api-lib:openkeychain-intents:111d7d53b9e920ad3405f8f3eb0ab7bd3aee66d577442452754b83c7c1c1d49a', -// 'OpenKeychain.extern.openpgp-api-lib:openpgp-api:544b7b2e20955556b83d1b72763543aa789836ebc1e77b332ed7cd83ef765c4a', -// 'com.madgag.spongycastle:core:97276487be598747ba78c063c90cea7fc3c7ad9bc7aeba03c0b9c98692052b8a', -// 'com.madgag.spongycastle:pkix:979aa4b2aaef94866e0f97b05b1922244eaf8b650f3691a3c44760ff0a41562b', -// 'com.madgag.spongycastle:pg:da319de706d946f178140959c74aec126f7803f1104dbad89bb1f55a53f6e1a9', -// 'OpenKeychain.extern:minidns:8274d50124d9584e95df0c5da7798269ac9caf0eab560df929c2c658ca624037', -// 'com.madgag.spongycastle:prov:902a484219bbf4e395a1c32da65b2453133e195bcc92336dc8c33b7c58edcd60', + 'org.apache.james:apache-mime4j-core:4d7434c68f94b81a253c12f28e6bbb4d6239c361d6086a46e22e594bb43ac660', + 'com.squareup.okhttp:okhttp-urlconnection:79ec6f4e79e683105e87fe83278a531c693e538d30e3b9237000ce7c94fcb2cf', + 'org.thoughtcrime.ssl.pinning:AndroidPinning:afa1d74e699257fa75cb109ff29bac50726ef269c6e306bdeffe8223cee06ef4', + 'org.apache.james:apache-mime4j-dom:7e6b06ee164a1c21b7e477249ea0b74a18fddce44764e5764085f58dd8c34633', +// 'OpenKeychain.extern.openpgp-api-lib:openpgp-api:a3f8b2ed40aaf12169e2a4e1f25e3764aa5ccb430683e1e7ca7867471eaf2bba', + 'com.cocosw:bottomsheet:871f5f4d6c10936569caf3528271efd77594a67aa5511765c96d7096c9b05f96', +// 'OpenKeychain.extern.spongycastle:core:6006a83fa427f4e5c8c93458176ab5e3b54d8dba7942171cb76cb134fc574c58', +// 'OpenKeychain.extern.openkeychain-api-lib:openkeychain-intents:8582442aa26e13c5a4bdf3588a22cb94b2fa5de6c79b84244fb575aa401fc330', +// 'OpenKeychain.extern.spongycastle:pg:0fd64a60311c5557f230bec9b2b162c9e6e690ccc83ac6b5af6a8d616309da98', +// 'OpenKeychain.extern.spongycastle:pkix:2348474aa27cb0461a368191d4d8fe7479a212b6365b177da131f4efa4c57f24', +// 'OpenKeychain.extern.spongycastle:prov:85c9ed6e24c5c7e5f7ff7c22d367bb553d020693350bd1c75555e6895311bb69', +// 'OpenKeychain.extern.safeslinger-exchange:safeslinger-exchange:274b71f8a1c383fb506342fd0f614b4a0cdb25517b5b2a1dfef9a4a2575477ed', 'com.android.support:support-annotations:beac5cae60bdb597df9af9c916f785c2f71f8c8ae4be9a32d4298dea85496a42', -// 'OpenKeychain.extern.KeybaseLib:Lib:d52e7888cea6de9e077501bb533270b2a86b52cb8af49e5f44ee8c4bb19ea017', -// 'OpenKeychain.extern.safeslinger-exchange:safeslinger-exchange:76e5da6b4f5f8835b12649e17569f0d0d8d89552815a61383c128545632689d1', - 'com.squareup.okio:okio:b53c1760864e1c39b5275d9023e2a6fbe8f3189e6e67b4c87877b8ec8f92e05a', + 'OpenKeychain.extern:minidns:25e351fa4145e2a9b0a76658c48619b307f71432db7492e9e8a6b34aa2e9bdcf', +// 'OpenKeychain.extern.KeybaseLib:Lib:79c78c1054b58200028211e21f2c89012dc4a1eafdb00cc99a5ce1f61ad16937', + 'com.squareup.okio:okio:114bdc1f47338a68bcbc95abf2f5cdc72beeec91812f2fcd7b521c1937876266', ] } + android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java index c2865410e..486d658f6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java @@ -19,12 +19,13 @@ package org.sufficientlysecure.keychain.keyimport; import com.textuality.keybase.lib.KeybaseException; import com.textuality.keybase.lib.Match; -import com.textuality.keybase.lib.Search; +import com.textuality.keybase.lib.KeybaseQuery; import com.textuality.keybase.lib.User; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.OkHttpKeybaseClient; import java.net.Proxy; import java.util.ArrayList; @@ -49,7 +50,9 @@ public class KeybaseKeyserver extends Keyserver { mQuery = query; try { - Iterable matches = Search.search(query, proxy); + KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); + keybaseQuery.setProxy(proxy); + Iterable matches = keybaseQuery.search(query); for (Match match : matches) { results.add(makeEntry(match)); } @@ -101,7 +104,9 @@ public class KeybaseKeyserver extends Keyserver { @Override public String get(String id, Proxy proxy) throws QueryFailedException { try { - return User.keyForUsername(id, proxy); + KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); + keybaseQuery.setProxy(proxy); + return User.keyForUsername(keybaseQuery, id); } catch (KeybaseException e) { throw new QueryFailedException(e.getMessage()); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java index 8f1abde83..aaff0a07c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/KeybaseVerificationOperation.java @@ -20,39 +20,43 @@ package org.sufficientlysecure.keychain.operations; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.net.Proxy; -import java.util.ArrayList; -import java.util.List; - import android.content.Context; import android.support.annotation.NonNull; +import com.textuality.keybase.lib.KeybaseQuery; import com.textuality.keybase.lib.Proof; import com.textuality.keybase.lib.prover.Prover; -import de.measite.minidns.Client; -import de.measite.minidns.DNSMessage; -import de.measite.minidns.Question; -import de.measite.minidns.Record; -import de.measite.minidns.record.Data; -import de.measite.minidns.record.TXT; + import org.json.JSONObject; import org.spongycastle.openpgp.PGPUtil; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.operations.results.KeybaseVerificationResult; import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyOperation; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyInputParcel; +import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyOperation; import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.KeybaseVerificationParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; +import org.sufficientlysecure.keychain.util.OkHttpKeybaseClient; import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.orbot.OrbotHelper; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.net.Proxy; +import java.util.ArrayList; +import java.util.List; + +import de.measite.minidns.Client; +import de.measite.minidns.DNSMessage; +import de.measite.minidns.Question; +import de.measite.minidns.Record; +import de.measite.minidns.record.Data; +import de.measite.minidns.record.TXT; + public class KeybaseVerificationOperation extends BaseOperation { public KeybaseVerificationOperation(Context context, ProviderHelper providerHelper, @@ -83,6 +87,9 @@ public class KeybaseVerificationOperation extends BaseOperation proofList = new ArrayList(); final Hashtable> proofs = new Hashtable>(); try { - User keybaseUser = User.findByFingerprint(fingerprint, mParcelableProxy.getProxy()); + KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); + keybaseQuery.setProxy(mParcelableProxy.getProxy()); + User keybaseUser = User.findByFingerprint(keybaseQuery, fingerprint); for (Proof proof : keybaseUser.getProofs()) { Integer proofType = proof.getType(); appendIfOK(proofs, proofType, proof); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FilterCursorWrapper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FilterCursorWrapper.java index ab73f59b8..d06f2ab65 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FilterCursorWrapper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FilterCursorWrapper.java @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2015 Dominik Schürmann + * + * 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 . + */ + package org.sufficientlysecure.keychain.util; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/OkHttpKeybaseClient.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/OkHttpKeybaseClient.java new file mode 100644 index 000000000..7c1d9f291 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/OkHttpKeybaseClient.java @@ -0,0 +1,74 @@ +package org.sufficientlysecure.keychain.util; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.OkUrlFactory; +/* + * Copyright (C) 2015 Dominik Schürmann + * + * 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 . + */ + +import com.textuality.keybase.lib.KeybaseUrlConnectionClient; + +import java.io.IOException; +import java.net.Proxy; +import java.net.URL; +import java.net.URLConnection; +import java.util.concurrent.TimeUnit; + +/** + * Wrapper for Keybase Lib + */ +public class OkHttpKeybaseClient implements KeybaseUrlConnectionClient { + + private final OkUrlFactory factory; + private final OkUrlFactory proxyFactory; + + private static OkUrlFactory generateUrlFactory() { + OkHttpClient client = new OkHttpClient(); + client.setConnectTimeout(5000, TimeUnit.MILLISECONDS); + client.setReadTimeout(25000, TimeUnit.MILLISECONDS); + return new OkUrlFactory(client); + } + + private static OkUrlFactory generateProxyUrlFactory() { + OkHttpClient client = new OkHttpClient(); + client.setConnectTimeout(30000, TimeUnit.MILLISECONDS); + client.setReadTimeout(40000, TimeUnit.MILLISECONDS); + return new OkUrlFactory(client); + } + + public OkHttpKeybaseClient() { + factory = generateUrlFactory(); + proxyFactory = generateProxyUrlFactory(); + } + + @Override + public URLConnection openConnection(URL url) throws IOException { + return openConnection(url, null); + } + + @Override + public URLConnection openConnection(URL url, Proxy proxy) throws IOException { + URLConnection conn; + if (proxy != null) { + proxyFactory.client().setProxy(proxy); + conn = proxyFactory.open(url); + } else { + conn = factory.open(url); + } + return conn; + } + +} \ No newline at end of file diff --git a/extern/KeybaseLib b/extern/KeybaseLib index 0b0a60533..9d67c3e20 160000 --- a/extern/KeybaseLib +++ b/extern/KeybaseLib @@ -1 +1 @@ -Subproject commit 0b0a60533c5f76b60e43895f3a0342bb0be68539 +Subproject commit 9d67c3e2081bea972a16690f1bc74b76b5f25ca5 -- cgit v1.2.3 From 9ee61dc0dfa5990126b7fb79c5373beb83a8b040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 21 Sep 2015 14:05:44 +0200 Subject: Pin keybase certificate --- OpenKeychain/src/main/assets/keybase.io.CA.cer | 25 ++++++++++++ .../keychain/KeychainApplication.java | 6 +++ .../keychain/util/OkHttpKeybaseClient.java | 45 ++++++++++++---------- extern/KeybaseLib | 2 +- 4 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 OpenKeychain/src/main/assets/keybase.io.CA.cer diff --git a/OpenKeychain/src/main/assets/keybase.io.CA.cer b/OpenKeychain/src/main/assets/keybase.io.CA.cer new file mode 100644 index 000000000..65ded9b1c --- /dev/null +++ b/OpenKeychain/src/main/assets/keybase.io.CA.cer @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg +U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv +VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp +SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS +1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ +DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM +QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp +YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7 +qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD +VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig +JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF +BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF +MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry +dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs +rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp +fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B +kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH +uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O +ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh +gP8L8mJMcCaY +-----END CERTIFICATE----- diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 45d81749a..56dd9a4cb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -100,6 +100,12 @@ public class KeychainApplication extends Application { TlsHelper.addPinnedCertificate("hkps.pool.sks-keyservers.net", getAssets(), "hkps.pool.sks-keyservers.net.CA.cer"); TlsHelper.addPinnedCertificate("pgp.mit.edu", getAssets(), "pgp.mit.edu.cer"); + // NOTE: + // keybase.io.CA.cer only holds the CA issuing the actual keybase.io certificate, but this + // is better than no pinning! + // We are not using https://github.com/keybase/node-client/blob/master/src/ca.iced + // because it is only valid for api.keybase.io (https://github.com/keybase/keybase-issues/issues/964) + TlsHelper.addPinnedCertificate("keybase.io", getAssets(), "keybase.io.CA.cer"); TemporaryStorageProvider.cleanUp(this); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/OkHttpKeybaseClient.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/OkHttpKeybaseClient.java index 7c1d9f291..32a5406e0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/OkHttpKeybaseClient.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/OkHttpKeybaseClient.java @@ -1,7 +1,3 @@ -package org.sufficientlysecure.keychain.util; - -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.OkUrlFactory; /* * Copyright (C) 2015 Dominik Schürmann * @@ -19,8 +15,14 @@ import com.squareup.okhttp.OkUrlFactory; * along with this program. If not, see . */ +package org.sufficientlysecure.keychain.util; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.OkUrlFactory; import com.textuality.keybase.lib.KeybaseUrlConnectionClient; +import org.sufficientlysecure.keychain.Constants; + import java.io.IOException; import java.net.Proxy; import java.net.URL; @@ -33,25 +35,14 @@ import java.util.concurrent.TimeUnit; public class OkHttpKeybaseClient implements KeybaseUrlConnectionClient { private final OkUrlFactory factory; - private final OkUrlFactory proxyFactory; private static OkUrlFactory generateUrlFactory() { OkHttpClient client = new OkHttpClient(); - client.setConnectTimeout(5000, TimeUnit.MILLISECONDS); - client.setReadTimeout(25000, TimeUnit.MILLISECONDS); - return new OkUrlFactory(client); - } - - private static OkUrlFactory generateProxyUrlFactory() { - OkHttpClient client = new OkHttpClient(); - client.setConnectTimeout(30000, TimeUnit.MILLISECONDS); - client.setReadTimeout(40000, TimeUnit.MILLISECONDS); return new OkUrlFactory(client); } public OkHttpKeybaseClient() { factory = generateUrlFactory(); - proxyFactory = generateProxyUrlFactory(); } @Override @@ -61,14 +52,28 @@ public class OkHttpKeybaseClient implements KeybaseUrlConnectionClient { @Override public URLConnection openConnection(URL url, Proxy proxy) throws IOException { - URLConnection conn; if (proxy != null) { - proxyFactory.client().setProxy(proxy); - conn = proxyFactory.open(url); + factory.client().setProxy(proxy); + factory.client().setConnectTimeout(30000, TimeUnit.MILLISECONDS); + factory.client().setReadTimeout(40000, TimeUnit.MILLISECONDS); } else { - conn = factory.open(url); + factory.client().setConnectTimeout(5000, TimeUnit.MILLISECONDS); + factory.client().setReadTimeout(25000, TimeUnit.MILLISECONDS); } - return conn; + + factory.client().setFollowSslRedirects(false); + + // forced the usage of keybase.io pinned certificate + try { + if (!TlsHelper.usePinnedCertificateIfAvailable(factory.client(), url)) { + throw new IOException("no pinned certificate found for URL!"); + } + } catch (TlsHelper.TlsHelperException e) { + Log.e(Constants.TAG, "TlsHelper failed", e); + throw new IOException("TlsHelper failed"); + } + + return factory.open(url); } } \ No newline at end of file diff --git a/extern/KeybaseLib b/extern/KeybaseLib index 9d67c3e20..b605413a9 160000 --- a/extern/KeybaseLib +++ b/extern/KeybaseLib @@ -1 +1 @@ -Subproject commit 9d67c3e2081bea972a16690f1bc74b76b5f25ca5 +Subproject commit b605413a96ffa59e4d1ea142344d074e14702403 -- cgit v1.2.3 From 7d9e44afd7f15b4a7db442a430cb6f570ac2a510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 21 Sep 2015 14:11:00 +0200 Subject: Fix deps verification --- OpenKeychain/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 9d6735676..39681fd05 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -116,7 +116,7 @@ dependencyVerification { // 'OpenKeychain.extern.spongycastle:prov:85c9ed6e24c5c7e5f7ff7c22d367bb553d020693350bd1c75555e6895311bb69', // 'OpenKeychain.extern.safeslinger-exchange:safeslinger-exchange:274b71f8a1c383fb506342fd0f614b4a0cdb25517b5b2a1dfef9a4a2575477ed', 'com.android.support:support-annotations:beac5cae60bdb597df9af9c916f785c2f71f8c8ae4be9a32d4298dea85496a42', - 'OpenKeychain.extern:minidns:25e351fa4145e2a9b0a76658c48619b307f71432db7492e9e8a6b34aa2e9bdcf', +// 'OpenKeychain.extern:minidns:25e351fa4145e2a9b0a76658c48619b307f71432db7492e9e8a6b34aa2e9bdcf', // 'OpenKeychain.extern.KeybaseLib:Lib:79c78c1054b58200028211e21f2c89012dc4a1eafdb00cc99a5ce1f61ad16937', 'com.squareup.okio:okio:114bdc1f47338a68bcbc95abf2f5cdc72beeec91812f2fcd7b521c1937876266', ] -- cgit v1.2.3 From 3a9709a35d3cf5cd2e93e49b75745226fd59ae2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Mon, 21 Sep 2015 16:49:23 +0200 Subject: Use api.keybase.io --- OpenKeychain/src/main/assets/api.keybase.io.CA.cer | 38 ++++++++++++++++++++++ OpenKeychain/src/main/assets/keybase.io.CA.cer | 25 -------------- .../keychain/KeychainApplication.java | 7 +--- extern/KeybaseLib | 2 +- 4 files changed, 40 insertions(+), 32 deletions(-) create mode 100644 OpenKeychain/src/main/assets/api.keybase.io.CA.cer delete mode 100644 OpenKeychain/src/main/assets/keybase.io.CA.cer diff --git a/OpenKeychain/src/main/assets/api.keybase.io.CA.cer b/OpenKeychain/src/main/assets/api.keybase.io.CA.cer new file mode 100644 index 000000000..c7da715c4 --- /dev/null +++ b/OpenKeychain/src/main/assets/api.keybase.io.CA.cer @@ -0,0 +1,38 @@ +-----BEGIN CERTIFICATE----- +MIIGmzCCBIOgAwIBAgIJAPzhpcIBaOeNMA0GCSqGSIb3DQEBBQUAMIGPMQswCQYD +VQQGEwJVUzELMAkGA1UECBMCTlkxETAPBgNVBAcTCE5ldyBZb3JrMRQwEgYDVQQK +EwtLZXliYXNlIExMQzEXMBUGA1UECxMOQ2VydCBBdXRob3JpdHkxEzARBgNVBAMT +CmtleWJhc2UuaW8xHDAaBgkqhkiG9w0BCQEWDWNhQGtleWJhc2UuaW8wHhcNMTQw +MTAyMTY0MjMzWhcNMjMxMjMxMTY0MjMzWjCBjzELMAkGA1UEBhMCVVMxCzAJBgNV +BAgTAk5ZMREwDwYDVQQHEwhOZXcgWW9yazEUMBIGA1UEChMLS2V5YmFzZSBMTEMx +FzAVBgNVBAsTDkNlcnQgQXV0aG9yaXR5MRMwEQYDVQQDEwprZXliYXNlLmlvMRww +GgYJKoZIhvcNAQkBFg1jYUBrZXliYXNlLmlvMIICIjANBgkqhkiG9w0BAQEFAAOC +Ag8AMIICCgKCAgEA3sLA6ZG8uOvmlFvFLVIOURmcQrZyMFKbVu9/TeDiemls3w3/ +JzVTduD+7KiUi9R7QcCW/V1ZpReTfunm7rfACiJ1fpIkjSQrgsvKDLghIzxIS5FM +I8utet5p6QtuJhaAwmmXn8xX05FvqWNbrcXRdpL4goFdigPsFK2xhTUiWatLMste +oShI7+zmrgkx75LeLMD0bL2uOf87JjOzbY8x2sUIZLGwPoATyG8WS38ey6KkJxRj +AhG3p+OTYEjYSrsAtQA6ImbeDpfSHKOB8HF3nVp//Eb4HEiEsWwBRbQXvAWh3DYL +GukFW0wiO0HVCoWY+bHL/Mqa0NdRGOlLsbL4Z4pLrhqKgSDU8umX9YuNRRaB0P5n +TkzyU6axHqzq990Gep/I62bjsBdYYp+DjSPK43mXRrfWJl2NTcl8xKAyfsOW+9hQ +9vwK0tpSicNxfYuUZs0BhfjSZ/Tc6Z1ERdgUYRiXTtohl+SRA2IgZMloHCllVMNj +EjXhguvHgLAOrcuyhVBupiUQGUHQvkMsr1Uz8VPNDFOJedwucRU2AaR881bknnSb +ds9+zNLsvUFV+BK7Qdnt/WkFpYL78rGwY47msi9Ooddx6fPyeg3qkJGM6cwn/boy +w9lQeleYDq8kyJdixIAxtAskNzRPJ4nDu2izTfByQoM8epwAWboc/gNFObMCAwEA +AaOB9zCB9DAdBgNVHQ4EFgQURqpATOw1gVVrzlqqFKbkfaKXvwowgcQGA1UdIwSB +vDCBuYAURqpATOw1gVVrzlqqFKbkfaKXvwqhgZWkgZIwgY8xCzAJBgNVBAYTAlVT +MQswCQYDVQQIEwJOWTERMA8GA1UEBxMITmV3IFlvcmsxFDASBgNVBAoTC0tleWJh +c2UgTExDMRcwFQYDVQQLEw5DZXJ0IEF1dGhvcml0eTETMBEGA1UEAxMKa2V5YmFz +ZS5pbzEcMBoGCSqGSIb3DQEJARYNY2FAa2V5YmFzZS5pb4IJAPzhpcIBaOeNMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggIBAA3Z5FIhulYghMuHdcHYTYWc +7xT5WD4hXQ0WALZs4p5Y+b2Af54o6v1wUE1Au97FORq5CsFXX/kGl/JzzTimeucn +YJwGuXMpilrlHCBAL5/lSQjA7qbYIolQ3SB9ON+LYuF1jKB9k8SqNp7qzucxT3tO +b8ZMDEPNsseC7NE2uwNtcW3yrTh6WZnSqg/jwswiWjHYDdG7U8FjMYlRol3wPux2 +PizGbSgiR+ztI2OthxtxNWMrT9XKxNQTpcxOXnLuhiSwqH8PoY17ecP8VPpaa0K6 +zym0zSkbroqydazaxcXRk3eSlc02Ktk7HzRzuqQQXhRMkxVnHbFHgGsz03L533pm +mlIEgBMggZkHwNvs1LR7f3v2McdKulDH7Mv8yyfguuQ5Jxxt7RJhUuqSudbEhoaM +6jAJwBkMFxsV2YnyFEd3eZ/qBYPf7TYHhyzmHW6WkSypGqSnXd4gYpJ8o7LxSf4F +inLjxRD+H9Xn1UVXWLM0gaBB7zZcXd2zjMpRsWgezf5IR5vyakJsc7fxzgor3Qeq +Ri6LvdEkhhFVl5rHMQBwNOPngySrq8cs/ikTLTfQVTYXXA4Ba1YyiMOlfaR1LhKw +If1AkUV0tfCTNRZ01EotKSK77+o+k214n+BAu+7mO+9B5Kb7lMFQcuWCHXKYB2Md +cT7Yh09F0QpFUd0ymEfv +-----END CERTIFICATE----- diff --git a/OpenKeychain/src/main/assets/keybase.io.CA.cer b/OpenKeychain/src/main/assets/keybase.io.CA.cer deleted file mode 100644 index 65ded9b1c..000000000 --- a/OpenKeychain/src/main/assets/keybase.io.CA.cer +++ /dev/null @@ -1,25 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg -U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv -VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp -SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS -1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ -DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM -QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp -YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7 -qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD -VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig -JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF -BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF -MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry -dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs -rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp -fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B -kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH -uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O -ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh -gP8L8mJMcCaY ------END CERTIFICATE----- diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 56dd9a4cb..ebd48b9a5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -100,12 +100,7 @@ public class KeychainApplication extends Application { TlsHelper.addPinnedCertificate("hkps.pool.sks-keyservers.net", getAssets(), "hkps.pool.sks-keyservers.net.CA.cer"); TlsHelper.addPinnedCertificate("pgp.mit.edu", getAssets(), "pgp.mit.edu.cer"); - // NOTE: - // keybase.io.CA.cer only holds the CA issuing the actual keybase.io certificate, but this - // is better than no pinning! - // We are not using https://github.com/keybase/node-client/blob/master/src/ca.iced - // because it is only valid for api.keybase.io (https://github.com/keybase/keybase-issues/issues/964) - TlsHelper.addPinnedCertificate("keybase.io", getAssets(), "keybase.io.CA.cer"); + TlsHelper.addPinnedCertificate("api.keybase.io", getAssets(), "api.keybase.io.CA.cer"); TemporaryStorageProvider.cleanUp(this); diff --git a/extern/KeybaseLib b/extern/KeybaseLib index b605413a9..b89648f50 160000 --- a/extern/KeybaseLib +++ b/extern/KeybaseLib @@ -1 +1 @@ -Subproject commit b605413a96ffa59e4d1ea142344d074e14702403 +Subproject commit b89648f50011445df59fa02f16a0691857aea681 -- cgit v1.2.3 From fd80d48f5085032839aa5ddabe32eb4e7c06a1c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 24 Sep 2015 14:11:20 +0200 Subject: phrase confirmation --- OpenKeychain/src/main/assets/word_confirm_list.txt | 12032 ------------------- .../keychain/experimental/BitInputStream.java | 125 + .../keychain/experimental/SentenceConfirm.java | 206 + .../keychain/experimental/WordConfirm.java | 127 + .../keychain/ui/CertifyFingerprintFragment.java | 15 +- .../keychain/ui/util/ExperimentalWordConfirm.java | 126 - .../src/main/res/raw/fp_sentence_adjectives | 128 + OpenKeychain/src/main/res/raw/fp_sentence_adverbs | 64 + OpenKeychain/src/main/res/raw/fp_sentence_articles | 8 + OpenKeychain/src/main/res/raw/fp_sentence_nouns | 512 + .../src/main/res/raw/fp_sentence_prepositions | 32 + OpenKeychain/src/main/res/raw/fp_sentence_verbs_i | 128 + OpenKeychain/src/main/res/raw/fp_sentence_verbs_t | 128 + OpenKeychain/src/main/res/raw/fp_word_list | 12032 +++++++++++++++++++ OpenKeychain/src/main/res/values/strings.xml | 10 +- 15 files changed, 13507 insertions(+), 12166 deletions(-) delete mode 100644 OpenKeychain/src/main/assets/word_confirm_list.txt create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/BitInputStream.java create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/SentenceConfirm.java create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/WordConfirm.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ExperimentalWordConfirm.java create mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_adjectives create mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_adverbs create mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_articles create mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_nouns create mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_prepositions create mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_verbs_i create mode 100644 OpenKeychain/src/main/res/raw/fp_sentence_verbs_t create mode 100644 OpenKeychain/src/main/res/raw/fp_word_list diff --git a/OpenKeychain/src/main/assets/word_confirm_list.txt b/OpenKeychain/src/main/assets/word_confirm_list.txt deleted file mode 100644 index 080c7ce81..000000000 --- a/OpenKeychain/src/main/assets/word_confirm_list.txt +++ /dev/null @@ -1,12032 +0,0 @@ -you -the -a -and -that -what -this -for -your -have -don -are -not -was -can -know -with -all -but -here -there -they -get -just -like -come -right -she -him -out -now -one -about -how -want -got -her -will -well -see -good -let -yes -think -who -why -yeah -did -from -his -when -going -man -take -where -time -them -back -look -would -say -were -been -then -had -tell -some -our -okay -too -down -could -hey -never -way -very -more -really -has -make -over -please -only -love -give -little -need -people -off -two -said -sorry -thank -sir -should -mean -any -much -sure -even -doing -must -these -thing -help -god -day -first -won -life -again -away -stop -wait -night -find -into -work -still -put -home -call -before -better -their -other -talk -after -maybe -great -than -those -always -long -money -old -leave -keep -new -told -things -name -last -father -around -years -does -hello -ever -place -big -nice -feel -girl -stay -thanks -made -mother -listen -three -may -guy -hear -coming -world -enough -left -fine -every -house -course -done -boy -wrong -bad -which -woman -lot -kind -wanted -guys -came -ask -son -today -show -own -care -mind -try -being -same -car -might -dad -miss -else -many -men -friend -baby -next -move -huh -live -hold -real -saw -went -seen -room -best -found -wife -job -once -such -matter -head -most -heard -alone -ready -haven -happy -days -run -play -door -bring -mom -myself -open -yet -trying -knew -whole -meet -excuse -family -used -while -use -start -took -pretty -gone -called -idea -since -watch -turn -hope -year -guess -end -sit -hard -says -hand -bit -school -both -worry -minute -true -face -soon -lost -forget -bye -young -five -killed -heart -few -wants -later -eat -drink -ago -shut -pay -police -each -water -anyone -dear -also -shall -looks -saying -until -crazy -late -phone -eyes -easy -sleep -mine -afraid -doctor -nobody -four -under -second -music -change -far -hands -kids -knows -hit -case -its -gave -read -times -speak -anyway -stand -part -wish -word -having -cut -stuff -comes -war -number -happen -hurry -quite -rest -close -check -inside -hurt -half -moment -girls -makes -lady -women -asked -set -boys -taking -story -town -chance -child -yours -lord -point -deal -sister -goes -party -week -walk -means -honey -dog -shot -high -bed -game -person -body -break -free -making -side -fun -almost -buy -least -truth -six -along -met -city -behind -send -though -hours -blood -light -stupid -gets -funny -ahead -answer -full -line -front -hate -white -poor -hot -order -reason -king -tried -seems -either -couple -trust -months -alive -hour -pick -able -save -clear -office -john -become -book -living -food -daddy -cool -dance -red -news -lose -cold -touch -power -scared -boss -fact -dinner -jack -master -uncle -small -quiet -write -taken -ten -luck -sent -cannot -air -earth -glad -law -till -needs -dream -street -drive -hair -sort -others -bet -lives -follow -whoa -fast -sweet -sound -catch -words -human -safe -hang -beat -rather -top -plan -seem -known -coffee -ladies -wow -lucky -win -past -calm -pull -lie -sign -return -fall -team -longer -kiss -asking -tired -feet -learn -drop -quick -wake -marry -train -throw -loved -road -sounds -land -felt -step -eye -piece -weeks -secret -sense -takes -pass -voice -clean -looked -wonder -song -fault -state -seven -born -less -film -ride -joe -class -act -none -given -fool -early -worth -ones -future -strong -army -mouth -moving -george -frank -sing -sun -chief -worked -horse -report -sell -turned -dark -peace -month -movie -lovely -boat -blue -seeing -hotel -eight -york -ship -rock -sam -age -christ -murder -finish -letter -court -works -swear -expect -bill -giving -near -worse -busy -pain -kept -ball -floor -laughs -wear -sea -fly -count -gold -forgot -radio -french -caught -short -soul -figure -paid -simple -bag -tom -fish -date -rich -paul -broke -miles -during -ring -choice -bank -david -relax -except -attack -join -table -across -mary -paper -star -dude -stick -meant -round -honor -fair -hungry -middle -thinks -buddy -lying -unless -spend -major -charge -needed -deep -hide -handle -bought -key -cry -trip -lead -window -enjoy -system -sake -fell -cover -ran -church -carry -tea -smart -force -teach -paris -box -holy -often -plane -dress -lunch -smell -third -ground -crying -talked -ice -tough -heaven -proud -laugh -sad -sighs -lived -art -harry -mark -single -dare -group -record -wind -cops -fix -club -upon -mike -mess -quit -entire -wine -normal -visit -offer -public -missed -prison -smoke -agree -saved -river -broken -madam -weird -green -arms -evil -south -bob -wall -bar -judge -orders -seat -bear -wrote -queen -slow -cause -dreams -loves -cop -liked -north -glass -accept -cross -scene -double -share -honest -moon -joke -beer -space -jump -whose -jail -area -tree -foot -test -cat -dying -within -ought -brain -nine -peter -field -bother -bus -lots -doubt -camera -became -german -books -gives -shoes -truck -ben -kick -card -cash -push -moved -likes -calls -cute -max -park -store -grow -owe -aunt -reach -guard -spent -summer -rules -duty -island -johnny -eating -smile -silly -san -folks -knock -pardon -crowd -henry -beg -stuck -action -upset -begin -prove -feels -grand -using -guns -legs -nose -rid -mum -list -sky -shop -arm -escape -mommy -gas -low -jimmy -self -hat -ray -bell -price -cell -rain -warm -west -passed -board -london -nor -lawyer -lay -closed -gift -favor -tony -jim -empty -prince -papa -suit -press -asleep -type -grab -spirit -arrest -papers -band -indeed -pop -played -dogs -agent -above -wild -nick -race -mrs -spot -fellow -whom -leg -awful -killer -fit -aye -beauty -twenty -bird -named -lock -blame -heavy -choose -allow -twice -magic -waste -plenty -raise -flying -notice -gasps -doc -decide -taste -flight -picked -billy -fresh -cost -nature -hero -james -places -planet -search -battle -steal -lights -neck -mate -hardly -sold -study -famous -simply -keys -memory -names -worst -throat -guilty -ways -shame -stone -bottle -states -mister -pray -bunch -camp -starts -seemed -form -stars -stage -animal -roll -east -faster -locked -van -final -apart -match -admit -tight -engine -build -treat -sight -closer -huge -beach -bigger -keeps -stole -united -among -hall -danger -itself -cup -milk -fired -pants -built -lies -cousin -steve -main -cook -meat -ill -angel -risk -plans -tape -taught -sword -extra -corner -beyond -hiding -belong -sarah -wash -drugs -cars -skin -large -leaves -driver -health -ugly -helped -note -bridge -martin -rose -pig -acting -horses -level -nuts -sunday -track -plays -anna -heads -walked -strike -rule -turns -common -madame -grunts -roger -losing -weil -speed -tells -due -serve -teeth -began -lee -shirt -rings -robert -spoke -size -feed -held -bobby -coach -dry -pack -ideas -grace -prefer -bottom -movies -view -breath -ticket -energy -code -hurts -cheers -remain -pal -usual -groans -showed -weapon -brown -center -coat -ours -copy -market -jerry -noise -birds -fill -advice -rome -cream -ghost -exist -oil -jake -tie -leader -draw -loud -lift -nearly -post -travel -surely -bread -cards -older -heat -games -crew -cake -bucks -pity -brave -chair -gotten -bless -wet -priest -shows -thy -agreed -truly -gate -nurse -paying -slowly -thou -local -style -soft -spring -grown -pieces -dig -shake -settle -maria -ends -larry -lonely -garden -stayed -enter -weak -fate -split -flat -proof -jane -loose -gang -trial -speaks -afford -snow -bright -trees -friday -guest -ears -santa -career -threw -color -bodies -mayor -manage -victim -finger -opened -roof -file -lake -plus -sees -spare -farm -rent -repeat -sugar -alarm -winter -insane -base -total -stops -thief -hill -fancy -stolen -female -tongue -sooner -liar -target -joy -mail -client -easier -cheap -brings -pulled -doors -credit -lines -harm -castle -male -birth -spread -storm -arthur -paint -slept -lover -hoping -bath -cares -taxi -trade -lately -video -weight -thomas -lied -square -tears -march -block -thee -eggs -onto -forest -europe -pool -tiny -jean -super -walter -nights -pete -signal -signed -rat -mercy -yellow -dan -desk -shower -simon -scare -regret -remind -swim -merry -pocket -path -ended -speech -aware -drinks -pair -ocean -waited -page -andy -runs -rise -fake -amen -ate -pure -bullet -photo -social -genius -desert -forced -player -grave -map -staff -vote -headed -easily -monkey -rough -create -scott -wise -harder -guests -sudden -silver -higher -fought -pounds -fixed -add -lower -desire -bro -failed -monday -louis -badly -below -clock -member -piano -lesson -kate -gods -rush -lips -unit -tall -safety -fred -adam -season -points -thirty -odd -wood -clever -royal -parts -artist -suffer -dawn -rights -grew -union -nation -theory -mood -filled -soup -model -hung -period -opens -ear -golden -hearts -cheese -plant -proper -shape -ruin -legal -faces -ruined -issue -refuse -per -bride -awake -cow -load -forces -smith -based -grant -woods -scream -freak -temple -decent -hidden -joking -arrive -sin -jacket -invite -boring -bang -wolf -mirror -lucy -dies -alice -walls -annie -saint -avoid -bike -carl -sat -talent -fifty -chest -buying -tear -jobs -guards -image -indian -finds -brian -trap -burned -eve -shock -iron -wide -marie -hunt -poison -flower -anne -bones -matt -dollar -rooms -owner -brains -glory -cab -riding -meal -freeze -damned -candy -shots -raised -tower -stood -bravo -dust -alan -warn -toast -virgin -bags -appear -caused -pride -switch -pilot -damage -helen -led -loving -rice -knees -coast -songs -babies -duke -silent -tour -sons -daniel -fourth -actor -victor -armed -moves -palace -troops -rate -writer -hired -junior -phil -amount -false -affair -rob -susan -falls -tied -bull -fallen -saving -snake -loss -mighty -youth -smells -lab -border -kicked -cast -drove -rescue -sharp -zero -borrow -humans -eric -flesh -row -jason -modern -score -pills -gee -studio -fail -tip -defend -eaten -steps -cases -climb -role -event -egg -joey -effect -seek -chase -wave -houses -blows -rocks -stairs -rope -dragon -bow -winner -barely -aboard -hated -mass -grade -leo -aside -bone -wire -ted -yard -button -jews -plate -dump -tail -bored -salt -metal -talks -sand -joseph -films -fruit -gosh -claim -goal -penny -clears -shadow -firm -powers -rachel -prime -punch -wishes -non -steady -tiger -giant -edge -woke -chuck -loser -assume -behave -direct -jones -blew -pen -chose -wheel -drag -sexual -maid -county -chick -remove -jenny -nope -spell -terms -focus -stock -valley -duck -chosen -likely -wound -object -sale -spoken -buck -mummy -tank -pie -notes -shout -guts -bound -scary -hop -value -slip -result -amy -los -photos -shine -mostly -rare -hitler -witch -served -texas -jury -intend -wings -albert -kinds -com -pink -cruel -bury -doll -terry -facts -range -brand -shy -kong -screen -rabbit -apple -swing -prize -marks -deeply -laws -wing -mile -coward -site -thus -closes -june -mixed -earn -hong -rude -begins -linda -kitty -curse -chain -cure -spy -noble -juice -source -circle -plain -sue -ann -twelve -rotten -lad -thrown -minds -grass -kelly -kissed -squad -jungle -bond -effort -series -expert -filthy -belt -edward -lets -thin -berlin -commit -boots -punk -stands -cheer -sheep -guitar -access -ships -bust -flag -panic -pizza -morgan -deny -sally -ali -bush -asks -deck -tokyo -term -hunter -former -tim -insist -estate -martha -assure -hates -navy -debt -fever -luke -joined -reward -karen -ease -fetch -garage -jumped -signs -shoe -threat -zone -solve -title -policy -ages -crown -leads -lion -hire -guide -bay -demand -trash -tone -vision -supper -voices -hip -route -lack -port -cats -dozen -dirt -helps -media -bruce -puts -exact -secure -stays -april -lousy -deaf -caesar -rip -fox -urgent -maggie -russia -tricks -mask -gather -warned -betty -highly -useful -tires -forty -gentle -suits -carter -jesse -solid -wipe -launch -emily -hank -sweat -steel -tests -alert -fifth -script -lend -costs -toward -aim -latest -tune -agency -sacred -empire -events -vice -argue -rick -vegas -mental -loaded -anger -clark -breaks -sonny -museum -tax -miller -flash -pushed -data -dean -lily -gray -brad -sports -pierre -senior -roman -reckon -singer -cap -stones -firing -handed -beside -walks -daily -fully -clue -wilson -souls -kills -banks -circus -shift -clouds -closet -hits -forth -jackie -prayer -loan -fools -fields -trace -civil -orange -wayne -carol -nerve -outfit -degree -flies -andrew -bills -cheat -idiots -chat -ending -noon -cabin -detail -hug -planes -ghosts -hills -alien -pigs -mix -hail -supply -struck -bat -files -cents -sides -opera -bug -jokes -angels -design -ken -pour -cave -gear -dating -beaten -herr -legend -nephew -belly -dancer -thick -ignore -fuel -pat -cried -lane -ellen -bowl -butter -bombs -francs -net -wasted -defeat -bars -bells -toy -sport -wallet -trunk -homes -wore -coke -ouch -obey -fort -norman -trail -league -shore -task -doug -wins -rats -motion -blast -mouse -merely -lads -busted -anti -monk -wives -agents -seats -inform -waves -gary -moscow -accent -beings -attend -shown -josh -robin -tunnel -drew -recall -drank -greek -poetry -swell -knight -earl -units -chill -harold -mars -holes -jay -rifle -bishop -beth -robbed -hoped -fond -rocky -unique -goods -pound -louise -crush -nancy -golf -fence -woo -patrol -sire -resist -stan -cloud -habit -pays -blown -von -lovers -novel -august -wagon -packed -widow -boo -siren -ruth -exit -beef -exists -tracks -bud -actors -nail -ugh -skip -july -passes -crisis -sins -washed -sink -sail -dough -baron -pet -wicked -flow -halt -aid -charm -cattle -owns -worker -hood -nerves -jam -purse -smooth -divine -seal -hopes -chop -heroes -equal -virus -sec -gates -powder -mickey -mud -wrap -sang -beeps -begun -couch -flew -jacob -skills -arts -lewis -tries -print -pole -ward -theme -fans -soap -string -farmer -kung -gain -poem -issues -inch -greg -teddy -burns -polish -beats -chef -frozen -pro -yell -waters -device -davis -bend -basic -slap -earned -cowboy -boston -wee -praise -cable -moral -permit -behalf -messed -plants -knee -holds -clown -shouts -placed -worthy -cinema -cage -finest -waiter -junk -strip -guilt -buzz -kit -deputy -granny -hers -shark -eagle -poet -oscar -cliff -boats -tyler -counts -parker -holmes -softly -snap -sets -nina -bail -beard -hut -yen -tale -heck -chip -crimes -steven -bitter -juan -uses -hid -eleven -scoffs -mount -dealer -limit -liquor -sauce -miami -odds -combat -baker -corn -images -cries -yards -shed -insult -pitch -beans -salad -corpse -gym -lazy -nearby -landed -roses -goat -foul -beep -meters -yells -acts -frame -cancel -link -pin -daisy -absurd -slaves -hammer -admire -tastes -benny -motor -boxes -gifts -ace -loyal -cities -blonde -punish -clan -native -cells -dumped -skull -stroke -fights -pearl -avenue -tooth -timing -rocket -grief -brush -sucker -chicks -alley -dennis -judy -brief -robot -angle -ail -mobile -drives -sends -pope -status -profit -wounds -actual -nut -tent -host -barn -stress -broad -chips -sack -cooper -stink -oxygen -raped -ranch -whip -coughs -labor -relief -soviet -wars -oliver -blade -upper -sings -scale -alike -drown -spoil -salary -jazz -harris -palm -fleet -pump -unable -clinic -sailor -horror -eats -clay -forms -stinks -dame -jet -polite -deeper -dishes -blah -drama -minor -editor -wheels -roads -ford -sandy -humble -throne -backup -shave -sore -driven -pit -socks -bunny -delay -colors -sneak -sung -rub -tap -walker -vodka -diet -wisdom -ripped -holly -statue -louder -tracy -grows -gently -manner -recent -groups -spin -ralph -lamb -humor -pages -anyhow -pale -pile -grey -sid -jan -khan -chaos -soda -fits -claims -jersey -apply -kisses -skinny -torn -cotton -kings -champ -burnt -spider -twins -gloves -bears -dutch -misery -facing -sales -pan -drawn -joan -remote -exam -phones -cows -allen -brandy -cherry -diego -maya -bid -donna -toys -bee -plot -cared -parade -crane -advise -patch -dna -envy -option -hush -casino -shell -nicely -drill -twist -temper -min -steak -ham -blocks -sorrow -rear -coin -janet -ashes -clicks -format -drops -safely -wealth -jess -medal -coffin -que -goose -gloria -appeal -pill -sub -towel -slide -ups -tragic -claus -fires -leon -faced -core -motel -worn -romeo -global -rhythm -nest -soccer -fried -betray -terror -stable -liver -solar -wreck -howdy -wears -dull -checks -dish -rap -basis -unlike -kindly -fog -sticks -bugs -zoo -pulse -lamp -taxes -abroad -dates -burden -oath -award -marine -felix -tools -rusty -irish -cooked -rising -rubber -hunger -scenes -faint -cellar -troy -item -niece -sarge -badge -frog -smash -shove -sunny -toes -sixth -reveal -tennis -mob -gene -proved -poker -nails -ram -symbol -pork -inner -makeup -fanny -bits -soil -vain -sum -hatred -kenny -scout -boot -album -buddha -senses -tender -plates -lap -deadly -tanks -entry -puppy -watson -warren -shared -tin -philip -warden -inches -rosa -fuss -stiff -folk -cent -asses -cart -liz -scotch -tend -pistol -del -cookie -flip -bucket -booze -inn -math -tons -acted -bets -bare -vast -crawl -ruby -forbid -owned -sis -basket -rank -branch -active -depend -eyed -chi -lit -gum -barrel -drum -sheets -connie -stare -potato -causes -needle -darn -heal -wished -muscle -cuts -rage -raid -leak -blank -breast -flame -feast -sorts -unfair -areas -chap -porter -tense -tire -marked -fooled -neat -nelson -duties -impact -ideal -diary -steam -text -rumors -limits -bait -fist -carpet -dining -safer -toe -teams -burst -bore -fame -lean -review -rounds -bureau -foster -jewels -horns -sobs -trains -dime -pre -raw -cursed -lick -donkey -method -sits -bump -worm -silk -hooked -rod -upside -sealed -alpha -comedy -dong -prints -retire -lands -tattoo -weed -worlds -donald -sample -column -suite -skirt -bingo -hears -skies -sheet -denied -apples -korea -alfred -ladder -booth -ding -plague -phase -sunset -mason -trucks -snakes -toss -fridge -unto -pops -danced -racing -brick -region -growls -gal -picnic -clerk -rio -mall -sleepy -psycho -mere -yang -scar -sober -sweep -handy -root -budget -shirts -cigar -whale -height -log -wolves -drawer -creep -spite -rot -graham -drums -boxing -harbor -las -tomb -repair -fund -writes -stuart -collar -lemon -villa -affect -brakes -purple -tapes -tube -solved -murphy -radar -error -coal -cease -mortal -cannon -tag -demons -winds -shield -fears -turner -motive -sleeps -locker -laying -fairly -oldest -deaths -rode -breeze -korean -seated -click -sylvia -heels -adults -subway -pigeon -swore -fee -minus -deed -thumb -dizzy -blues -grip -dale -prom -pepper -skill -ballet -beds -candle -slight -vital -plug -elder -flames -types -homer -groom -reply -hon -fur -sixty -melody -pillow -outer -stream -clubs -bald -loses -beware -diana -quote -hath -spots -sirens -dreamt -era -copies -fry -tub -ana -sector -chess -nanny -dummy -belief -added -wizard -lance -rang -tables -aliens -booked -walt -bench -whores -owes -stab -cathy -dial -mill -edgar -creepy -irene -doubts -acid -lungs -vera -chorus -author -visual -adore -arrow -barks -helmet -random -deer -larger -ling -tribe -deals -blond -parent -tide -gig -bold -sakes -seed -severe -nap -hatch -twin -fixing -moans -lip -prices -gossip -cruise -triple -hawk -hockey -chains -parked -debts -meets -lame -maniac -brat -wang -greedy -bacon -bleed -tarzan -dug -galaxy -chased -depth -rumor -mid -ape -pencil -lions -flood -jolly -cargo -hats -beam -banana -vault -cheek -jill -phoned -turtle -ginger -rely -beers -coma -corps -elvis -formed -cured -bloom -narrow -serial -heir -cough -aha -greet -gamble -organ -losers -react -judges -sandra -levels -backs -rolls -naive -starve -income -bean -heroin -custom -wiped -easter -pirate -bass -strict -slice -ties -harsh -roast -marc -moses -slim -lobby -liquid -rivers -solo -bounce -bonus -regard -tore -madrid -length -bent -tested -chapel -meals -cloth -dice -yea -cape -lung -ton -tales -breed -tango -herd -parole -web -deeds -tool -coins -nun -kansas -den -ditch -shares -hector -venice -pub -chew -razor -hawaii -noah -whisky -comic -dallas -minded -slams -scares -brass -mines -doomed -sworn -sharks -autumn -logan -swords -swine -pace -bloke -wooden -vessel -harper -bon -drain -pond -debbie -butler -wade -bin -shrink -fled -dam -carlo -alibi -cafe -chow -smoked -models -reads -stores -rum -kent -theirs -glove -violin -behold -mon -roots -hanged -rebel -rains -rented -diane -hugo -fatal -gut -bark -menu -orphan -honks -luxury -ahem -fare -worms -rascal -formal -mouths -hah -risky -salute -nicer -peggy -riot -risks -racket -tasty -theft -swamp -yankee -voyage -saddle -serves -lawn -potter -shoots -ritual -sucked -offers -brutal -float -rarely -oven -hay -sidney -petty -waking -morris -modest -grain -injury -lester -swiss -sells -nazis -votes -debate -milan -draft -mice -savage -arabic -ransom -knives -repay -sydney -spill -wit -leaf -arnold -seas -medium -dock -proves -loudly -crow -choir -belle -tech -thats -tick -ski -ruins -weigh -rico -prey -venus -online -covers -bubble -echo -dried -wells -bandit -stove -rex -dot -flee -values -wax -mae -ducks -eager -funds -scent -hangs -scheme -romans -meter -samuel -growth -tricky -wrist -helena -franz -reed -amber -marina -asylum -creek -kneel -ash -mule -fold -kirk -nurses -noises -locate -shaw -senate -thrill -chairs -cycle -poems -jose -volume -spray -smiles -seeds -cakes -owners -sole -learnt -bully -gypsy -rays -mini -pilots -tips -phrase -rosie -begged -keen -static -spoon -vienna -disco -cane -virtue -kicks -loads -via -dated -tan -ming -mature -sofa -stir -joyce -pine -joker -fries -armor -wander -peanut -scores -picks -mafia -olive -madman -floors -awhile -logic -manual -rolled -mates -ink -voted -snack -pledge -crook -laser -bands -hamlet -races -rebels -aged -endure -mia -shade -stamp -lasted -buster -beasts -batman -brake -occur -dolly -delta -orbit -pulls -fork -campus -rig -dances -dodge -allies -hooray -hereby -wig -alas -joel -dealt -misses -maker -hobby -tails -spies -oui -devils -andre -feared -clues -pals -nickel -auto -towns -notion -flush -straw -sigh -stunt -veins -buys -maiden -whack -bonnie -kidnap -owl -rally -seize -canyon -lords -barber -abe -weep -spying -esther -shorts -wakes -phony -cans -jeep -burger -haul -myth -duel -sour -spike -throws -stall -rug -adams -robe -roars -ninety -gladly -pierce -asia -ego -tissue -ranger -sherry -karate -dudes -choke -sheila -vow -cue -allows -queens -bees -curly -shiny -camel -prior -melt -jewel -freaks -bonds -evans -anchor -zip -morgue -hotels -ruled -pose -exams -carbon -shops -pony -assist -altar -graves -jun -untie -thud -ensure -mainly -ashore -doris -jar -resign -accuse -prayed -violet -butch -copper -camps -scan -awaits -freely -offend -dip -owed -ants -hint -wired -pooh -fade -ankle -knocks -rides -stew -trips -urge -ping -attic -jaw -sweets -boil -darwin -dolls -porch -noisy -cant -eighty -sync -origin -mutual -visits -pastor -tease -dagger -caring -stereo -sniffs -rack -gown -issued -stark -hairy -proven -grades -leap -posted -items -divide -engage -plead -sting -lifted -kathy -dared -waits -baba -clumsy -wages -ropes -denver -apollo -cord -rifles -fails -diving -habits -lust -troop -puzzle -lined -ferry -filed -woody -luther -heel -jeanne -bolt -bra -label -drake -cups -tomato -shorty -colony -dove -filth -dings -tuck -ghetto -submit -torch -val -avenge -bounty -pipes -virgil -puppet -locks -mole -wires -lively -resort -waltz -joshua -dante -pursue -strain -hudson -sought -gained -recipe -austin -iris -tucker -glue -annual -jelly -hunch -mug -amazed -ridge -sissy -atomic -hence -invent -cheque -thread -erase -salmon -boxer -patty -sofia -buzzer -saints -hike -scarf -globe -usa -swan -palmer -tops -ally -comb -pains -eighth -breach -canal -rogers -runner -messy -subtle -wheat -adopt -peach -shrimp -ribs -fierce -rises -seoul -popped -fuse -banker -quest -spark -warmth -expose -shelf -peak -shaft -rupees -rash -blamed -jeans -glow -crab -jammed -sip -roar -beggar -cope -pinch -organs -hips -shaped -towers -towels -clip -pad -ninth -hugh -meg -phoebe -favors -carson -lodge -delhi -cheeks -rue -hack -feds -lasts -yacht -greed -goals -spends -hen -shook -des -masks -yuan -nailed -rider -bumped -mamma -paulo -stern -agenda -resume -armies -tasted -drift -thirst -treats -vulgar -waist -creeps -grasp -monte -heroic -slam -smiled -onions -sultan -extend -marcel -baked -tigers -shack -gaze -eden -chart -tidy -monks -codes -lyrics -rushed -hum -est -fax -shoo -vacuum -notify -bribe -mock -plea -flint -frost -clap -trauma -stoned -parrot -dozens -stray -axe -freed -calvin -refer -herb -shells -pinky -crop -paths -garlic -kin -veil -robber -whew -cracks -gasp -setup -kilos -wont -bosses -sew -fisher -reform -dearly -junkie -sock -courts -spared -intact -agony -scored -stack -oak -ohio -stain -fran -pier -liking -loosen -comet -obtain -piggy -roller -flown -refuge -traces -rag -vile -scouts -scram -reduce -eugene -exotic -dusty -peel -swept -heap -shines -pasta -versus -surf -grease -backed -clowns -shovel -cooler -fades -ambush -superb -hollow -pawn -jingle -slit -byron -moose -zeus -knots -buenos -topic -hustle -mute -metro -dash -peek -waving -etc -burial -cuban -ammo -quid -gag -smokes -keeper -factor -equals -spear -await -views -shin -sleeve -bunk -glen -arabs -naval -losses -boogie -julius -hose -millie -bushes -vanish -slower -lire -flour -miriam -bitten -pearls -scars -womb -treaty -stamps -finals -weary -stalin -lent -unite -tong -poles -spine -lucia -sadly -masses -zombie -wan -bliss -isaac -saloon -verse -reign -purely -biting -elaine -cozy -token -archer -elite -tray -steer -craft -flock -ripe -tubes -horace -coop -ant -trophy -ruler -brute -hog -lease -squeal -boiled -potion -grapes -tuna -dwarf -lounge -robots -invest -franco -rogue -taller -ranks -fluid -asian -mayday -spice -poster -liable -rail -thai -giants -hart -timer -sunk -shelly -toxic -lethal -info -alaska -nuns -adjust -parlor -sticky -prague -lang -hides -sane -rainy -dose -kidney -whoops -gutter -legacy -bake -bites -absent -lid -bricks -whites -unlock -poke -panel -gap -condom -traps -visa -tailor -linked -reject -maps -ark -buzzes -flute -diner -shaved -acres -rival -agrees -puff -banner -dixie -fees -jumps -bats -sights -daring -listed -blink -cigars -sway -vest -healed -sketch -soaked -claw -pupil -chico -casual -knot -stud -salon -fabric -skate -sheer -racist -onion -heave -enters -ale -amelia -finch -exile -spells -extent -fatty -glance -vet -flows -assets -calf -thugs -whales -realm -kitten -slick -poppy -edith -elders -filmed -medals -buyer -strap -bundle -saves -toad -cement -seduce -stroll -utter -classy -scrap -apache -hardy -yield -runway -reich -lump -limo -tow -cognac -warmer -frogs -unity -lone -whitey -define -dine -amigo -grudge -cobb -sewer -pairs -punks -newton -nicest -vase -hebrew -parish -vows -marble -savior -raft -monroe -hogan -angus -holler -preach -tab -depths -framed -arrows -mint -brace -broom -arena -splash -intent -ernest -scoop -abused -woe -ivy -noses -fright -repent -nixon -petrol -velvet -steals -fuller -gulf -probe -aisle -select -lens -pupils -legion -plaza -puerto -coats -grim -vanity -void -idle -fang -nay -psst -colt -pickup -sol -loop -lizard -skiing -sorted -layer -poured -fury -shrine -thorn -costa -trials -cola -naples -medic -motto -mal -nasa -grid -hairs -belts -shuts -sewing -stakes -goats -snaps -swap -blacks -curve -sinner -retard -videos -tenth -yummy -elbow -bombay -charts -golly -doe -pets -newly -scrub -rhyme -carrot -gangs -wagner -beck -audio -flavor -judith -morons -cradle -ruling -sniper -judas -milton -gerald -thrust -bunker -mode -slack -males -novels -coup -funky -cult -aspect -pesos -burton -wage -bluff -gifted -karma -boards -hunted -disk -willis -sloppy -wrath -rapid -buses -urban -turk -storms -riddle -mild -beau -moss -jerks -draws -judged -pause -milady -bathe -bombed -warsaw -abort -willow -seized -dexter -merci -tickle -flags -scam -chili -swat -bomber -flora -thug -tempo -decade -grove -ideals -crows -sparks -shalt -yelled -signor -jonah -blouse -numb -quack -greeks -arise -havana -richer -piglet -fruits -dares -thine -bates -ethics -alter -crowds -lotus -shakes -wager -bulls -doggy -fishy -curfew -geneva -vague -slug -ironic -lure -summon -hiring -butts -cosmic -turf -flirt -semi -hound -sahib -pint -wretch -seldom -loot -mozart -partly -claws -wool -woof -clive -thighs -doth -sites -trout -packs -noted -hotter -caviar -eldest -banned -jasper -norma -dim -mills -chilly -fuzzy -hurrah -gibson -beaver -turks -convoy -birdie -sniff -cain -dent -merlin -yale -mutt -med -bleep -resent -lace -calmly -freaky -memo -lowest -ribbon -pod -midst -wagons -dome -tackle -reef -midget -marker -relate -chalk -hayes -swift -charms -esteem -pike -weasel -dental -opium -critic -unload -heidi -ache -polo -tossed -cutter -chiefs -insect -regime -flank -barge -oxford -crank -streak -lex -gong -basil -crabs -samba -aiming -gale -fiddle -limp -marian -risked -fiance -holden -shaggy -hitch -aires -moi -invade -wits -stitch -cuckoo -coco -pow -expand -tipped -osaka -peas -rags -peep -amazon -shifts -gospel -voting -mare -finn -parks -bun -infant -curry -crops -buckle -trim -plum -marsh -mop -scope -idol -cuffs -paddy -sailed -cobra -macho -sinned -forged -sails -toll -chaps -mining -rehab -merit -flea -dandy -traded -kyoto -reader -fists -crooks -rates -bind -reborn -grind -stinky -thesis -haste -crib -stocks -blades -damp -hating -munich -amuse -warp -sly -gloomy -atom -anders -awards -spa -mixing -undo -thumbs -rookie -sweaty -marge -blunt -grill -verify -haired -chimes -crews -pasha -canvas -recite -weighs -geek -mist -wales -padre -stated -brooks -wesley -purity -reno -weekly -survey -bender -feeds -polar -athens -allied -valid -ronald -jock -truce -tribes -alma -tumor -madly -spooky -riches -liars -erased -para -pas -oceans -nova -bums -hag -sonar -gandhi -trusts -funk -lining -motors -fills -tummy -stash -tel -patron -hump -kite -irony -carved -tutor -tanner -traced -crowns -detect -pots -locals -perish -cloak -hast -baths -chops -spicy -caves -wed -plains -cam -pong -crude -consul -exits -bronx -juicy -morals -valve -melted -bash -zoom -farms -slips -halls -dicks -gamma -roles -mccoy -employ -cooks -arch -ole -bangs -scrape -solemn -blend -ounce -typing -toto -mein -raven -update -stool -shades -necks -lime -honors -boar -teller -grams -hare -pact -immune -sawyer -sponge -genes -heed -yank -bio -truman -yoga -apes -pins -bryan -caller -saturn -joints -cuff -adding -beta -trench -bakery -newest -wink -depart -disc -bah -fuhrer -panda -kettle -tsar -leash -gadget -abbey -dub -hull -verge -haunt -ban -gravy -buns -openly -prank -asthma -annoy -martyr -doggie -sicily -poets -knox -peg -tart -nod -helm -pest -upbeat -crate -warner -dwight -pinned -posts -icy -babes -occupy -styles -rover -squash -seals -morale -beacon -prep -cairo -czech -rests -alarms -poorly -mend -essay -pies -paws -hums -ethel -denial -bikes -rib -mao -snorts -cereal -rene -tonic -depot -eater -pip -milky -hasty -rattle -greta -pea -debris -wedded -coral -snacks -tens -fewer -ida -berry -eagles -castro -tavern -stench -syrup -donor -elf -falcon -firmly -reel -harlem -erin -yonder -shaken -summit -guru -suited -whilst -smelly -remark -loans -stages -maine -boost -spits -remedy -jockey -errand -kilo -maids -oppose -slot -bred -nevada -foods -dwell -stored -roam -laurel -hunk -hyde -viva -freud -vent -posse -occurs -squire -serge -tex -chump -hallo -morton -crappy -tying -chores -rodeo -pickle -packet -noel -tenant -echoes -paddle -stains -hoover -marx -sod -tapped -wrists -jap -amos -revs -tee -nearer -limb -laden -eddy -fading -rental -doodle -trek -seeks -defy -groove -steed -gents -creaks -jets -demo -piper -bamboo -dye -tuned -paw -moons -tyrant -tunes -guided -adapt -cork -cosmos -revoir -sermon -lisbon -kat -poetic -patsy -dread -hooks -menace -fasten -rosy -bulb -clutch -reg -raises -raging -ceo -quiz -miners -links -parted -utmost -utah -squirt -loaf -lam -lava -outlaw -donate -voodoo -lists -learns -reds -argued -beads -foam -goody -decree -hazard -uptown -batch -bosom -hicks -bases -dowry -meteor -flare -strung -adds -weirdo -saul -raja -corny -anthem -batter -aimed -groan -squid -moms -cadet -revolt -chum -greasy -meow -mat -tar -islam -raving -sow -lays -bugle -maxim -howl -herbs -cutie -aces -garcia -cetera -limbs -adolf -weaker -lice -boiler -peters -dorm -mourn -screws -docks -regain -cocoa -valet -shapes -goofy -excess -wimp -felony -siege -comics -cheeky -soy -iced -chubby -prop -muddy -reagan -taped -slate -shogun -impose -sank -rudder -sized -steep -hash -windy -grabs -froze -slash -arctic -chic -spades -crunch -stared -canned -hopper -tad -dames -nero -jinx -domain -noodle -stuffy -yin -angles -email -frau -skates -rigged -grunt -epic -choked -veer -hurray -swings -harmed -caress -convey -nobel -whoop -fling -abbot -darker -faking -sneaky -manor -puss -caps -danish -mace -daft -multi -jumbo -scales -stance -blush -touchy -apiece -banged -grub -asset -skirts -mutiny -enjoys -casper -radius -nerd -thigh -masked -copied -nosy -crust -colder -sleigh -joanne -skins -wiser -moor -flop -serum -geisha -bronze -zen -jude -fiery -undone -norm -snuck -carve -pluck -jab -par -loco -matrix -facial -legged -bled -seller -tame -pry -inmate -ridden -snitch -sands -tung -rouge -alias -abide -skunk -yahoo -relay -blaze -rained -ere -foe -coca -mosque -sap -eerie -chant -cod -bing -salty -dirk -mart -bowls -tribal -spade -awaken -flyer -dane -recess -drip -lira -dew -riots -soak -heated -tempt -stein -marcia -oregon -spears -brag -poking -teen -orion -fiend -abyss -pumps -moan -coyote -jumper -clam -broker -jaws -tread -rust -subs -unreal -witty -buffet -loony -lunar -vacant -riders -shores -litter -ramp -pup -fin -cinch -rye -lenin -gunner -mold -gays -risen -lamps -sierra -humbly -slob -slay -ripper -whim -dryer -zipper -vocal -ankles -lama -rep -elect -spaces -faded -armour -vicar -grape -sacks -wrench -squeak -rhodes -xavier -elves -jared -dense -sioux -adored -cub -genie -arc -manly -bikini -veal -cohen -palms -weaver -mink -nag -turbo -vermin -diesel -mutant -meadow -moody -geese -emerge -ultra -loft -squat -shoved -harp -okey -bumper -ahoy -adios -trunks -dairy -weave -wilt -awe -cello -jug -pits -amused -inc -flick -swam -rites -wider -flats -pros -titles -builds -moo -flap -tiring -voters -groovy -yelps -barb -sphere -ingrid -lassie -beams -baking -psych -slain -downs -lakes -hindi -hassle -hale -omen -hindu -laptop -runt -shady -grin -uneasy -forge -linen -plato -hacked -sinful -howls -bout -braces -uncles -curb -hub -lawful -dusk -nile -hippie -wails -viking -slope -cubs -aurora -bounds -omega -muffin -mules -cables -stem -diaper -baton -clocks -licked -camels -plasma -routes -farce -ludwig -pools -fags -gauge -sensed -lever -ferris -layers -brink -canoe -beetle -filter -canary -senile -mails -antony -tally -radios -snappy -mann -pluto -germs -thump -blares -rim -rested -steaks -deuce -snowy -sully -lacks -maple -cube -pep -outs -unpack -eel -geezer -crisp -faults -dost -patent -sect -grande -spank -jumpy -pumped -tends -dakota -debut -titus -rows -layout -cling -weeds -trifle -oblige -wilder -ration -dots -pens -taps -knob -eta -scold -sizes -wright -nets -jacks -digs -rake -import -brew -manu -sham -laps -woken -goon -posing -hazel -grumpy -paints -chunk -atoms -skulls -minnie -ese -hoax -gals -tents -ivory -ogre -quits -shah -fluffy -duffy -astray -dos -barren -crates -filing -lark -herald -slimy -ares -horrid -edited -cramp -sued -brats -govern -detour -shush -logs -vine -paso -carver -tinker -fowler -zurich -trans -zebra -mating -aerial -muck -notre -hawks -attach -sauna -safest -douche -gem -rubles -viper -stingy -scalp -devote -rhymes -fidel -cloudy -asap -aging -redeem -chute -mambo -nato -inhale -pastry -widows -unions -ezra -fusion -budge -sitter -gavel -ave -revive -scroll -bruise -joys -deacon -bonnet -cone -fossil -dublin -tug -wench -shaky -tram -plunge -wail -tucked -hacker -retain -homey -deb -fleas -iraqi -disney -edges -fret -notch -mayo -wept -bridal -mentor -parcel -cages -mush -polls -zodiac -liras -krauts -prizes -scarce -gears -beak -lifts -uphold -errors -folly -export -uno -taco -casket -grieve -lest -titan -bumps -biggie -bop -kimono -banjo -bows -toot -griff -clone -merger -broads -lass -napkin -sen -gao -tibet -noose -blinds -fender -finale -hymn -flaw -afar -warmed -mashed -slides -adieu -pagan -joyful -heist -bowie -paste -bummer -sirs -trance -famine -tablet -clause -pascal -maze -clarke -stale -cactus -folded -tours -din -domino -troupe -pronto -amulet -attila -olives -decay -morse -vouch -tiles -itchy -pedal -quarry -thor -grail -puck -goons -mailed -artery -props -needy -haw -rated -calmed -toots -intern -thuds -pushes -vivid -fishes -ounces -eiffel -ufo -longed -brow -bach -hooper -moth -tags -dads -labs -magnet -aching -riggs -insert -tones -buyers -aft -digest -legit -furry -defect -bumpy -sprung -leaks -climax -henrik -slater -tasks -ledge -cliffs -fours -dona -acute -crater -ordeal -giddy -marvel -wiping -suing -portal -lesser -vein -athena -heater -feeble -racial -gunnar -cawing -joins -rumble -barker -crummy -fabian -basin -hiking -finer -corky -rating -edit -aloud -tao -futile -derby -bearer -lotion -cove -hilary -lefty -whines -deploy -rubbed -cutest -laddie -venom -picky -una -snot -sneeze -bailed -crotch -aunts -arabia -capone -troll -opener -robes -verbal -overdo -emery -rubble -blanks -lenses -module -clash -sash -goof -spur -frames -blokes -rom -hounds -walkie -dung -mellow -buff -condo -valium -yogurt -cuddle -bypass -evolve -sanity -isle -labels -unseen -obeyed -verses -sage -mast -snob -ref -kosher -kisser -posh -comply -span -nutty -scoot -muller -mort -snuff -sled -extras -input -teeny -decoy -irons -timber -devour -dart -growl -aches -thorns -creed -elbows -vista -chewed -sums -marrow -voila -rite -frying -taj -jog -wiggle -tat -mecca -saucer -booing -apron -index -gabby -reset -spoilt -salsa -fudge -fences -kaiser -trot -salami -meows -pear -drying -spoils -softer -mar -floats -knack -surge -spoons -ulcer -trader -vie -jive -tofu -pecker -buffy -orchid -piles -differ -craven -pricks -hutch -staged -lambs -cons -glued -yanks -tack -hangar -neighs -mortar -oyster -shred -gram -saliva -texts -wand -cot -renew -assign -coo -acre -fay -lair -boxers -lyon -aloha -aide -onward -fitted -sliced -slogan -gallon -paces -decker -user -rugby -plank -gogh -drunks -sling -margin -raids -chord -knit -munch -myrtle -mater -salaam -delete -drone -spinal -matron -hansen -badger -greens -mantle -viola -hoist -ore -makers -thirds -kip -chug -admits -deceit -rinse -ell -stoop -slowed -comfy -lei -hisses -gender -gore -johns -adores -dire -aryan -hens -smug -haines -versa -duct -pillar -buds -swede -ins -tucson -civic -diver -bowman -oddly -speedy -iowa -hark -omaha -manure -ballad -trend -stump -refund -gorge -guides -axis -mystic -baboon -hoot -snail -faked -giggle -vale -ceased -pug -crumbs -snails -hoop -strive -unjust -mugs -offs -bolts -fiber -leaked -brawl -brook -excite -saigon -gator -homage -wholly -stomp -balboa -truths -sparky -cosmo -dumps -cheats -cupid -brig -dada -emmy -puddle -cleans -pulp -hosts -wisely -sacked -rivals -nicked -amends -expel -bribed -hugged -rave -humane -curls -muse -earns -guild -sinks -bey -taro -clamp -covert -manson -spat -gall -decks -ponies -wills -crave -helper -stung -sturdy -tights -crest -cooing -washes -absorb -tuning -holder -marsha -lowly -poe -omelet -ensign -ether -welsh -melts -polka -buggy -furs -solely -postal -grazie -curves -digger -flyers -poodle -phoney -havoc -inland -tahiti -smear -wildly -loathe -lumber -wiener -albums -spook -messes -valued -crazed -pads -stride -scot -spouse -louse -macy -gunman -pepsi -detain -render -shaman -morbid -raided -whine -demise -darned -barbed -writ -mugged -morrow -sewers -reload -neon -garret -elmer -basics -lain -saxon -dunk -safari -pager -reflex -sonic -zones -reaper -unfit -boils -notary -stormy -stag -wines -darts -kelvin -bugged -aviv -curl -accord -fig -shawl -trump -caste -gravel -popeye -mil -arson -bodily -miner -talker -peril -regent -meddle -lagoon -stings -abc -fink -rails -flaws -midday -leone -widely -dues -sordid -galley -barley -shalom -moist -champs -feat -reeves -herbal -denies -intro -joyous -jest -hun -rabble -hades -tuxedo -bribes -hulk -hostel -borne -alps -snoop -encore -upsets -hogs -quota -carton -dell -wiring -lima -burma -vortex -posed -edison -huddle -flares -mascot -garde -fluids -sedan -peer -inject -petals -reap -hugs -plow -newark -hermit -forum -saga -bulk -lacked -dodger -cavity -bogus -apt -rugged -slag -rhino -cosy -ducky -exhale -hind -fumes -payday -snarls -cecil -smoker -server -vowed -donuts -mango -floods -boyle -slum -satin -jackal -clink -grants -icon -dicky -hedge -hooves -attain -shabby -cures -spiral -clover -swears -wacky -misty -lug -tilt -unkind -rocker -dreary -gurney -rigid -exiled -boon -oasis -jacked -speeds -castor -loaned -broth -rah -ozone -rubin -bathed -frown -curses -snore -blames -trails -jell -peeled -penal -leech -mow -chimp -saudi -speck -array -foxy -slices -locket -inter -poorer -cider -smokey -shiva -triad -floss -vinci -divert -poll -orient -frenzy -airs -enlist -wham -waved -rods -holdup -cranky -hinges -swung -aids -ratio -gains -nosed -plots -clips -latter -divers -sweeps -wad -carts -nobles -unwell -timid -shun -hybrid -foxes -fern -gases -tumble -unfold -bowen -ante -tanker -tacky -sesame -peers -bursts -corral -pouch -serene -untrue -pushy -linger -sluts -frail -calves -nectar -boast -franks -cutler -surfer -ports -roofs -coy -lilies -hick -clams -malice -yawns -penn -latch -magnum -jaguar -chino -vulcan -stares -scraps -spun -whiff -spree -basque -amaze -gaius -rican -levi -rand -parson -rewind -yogi -afro -yak -delays -fulfil -goblin -aura -owning -beirut -bog -watts -spices -tailed -hearty -rabies -relic -forks -shocks -slugs -mingle -gloom -rung -herds -plugs -tactic -badges -sassy -chords -levy -bids -cubes -slows -pizzas -glide -tic -amigos -combo -oracle -sided -gen -specs -qui -timed -logo -rowing -mag -pilar -bogey -tile -healer -fatter -barred -quaint -haze -vents -pans -costly -mirage -refill -cheesy -wedge -rotate -odor -tarts -curt -rocked -mound -pious -gala -whoosh -twig -sahara -utopia -hornet -ethnic -zed -patio -jars -manic -fussy -outrun -wary -detest -naming -stout -friar -quebec -micro -goner -anew -bowels -czar -tov -cartel -taxis -imply -zulu -cluck -wasp -plano -enable -rook -spins -pinkie -hubby -dialed -carnal -judo -clans -alms -dreamy -barrow -midway -sox -hoods -crock -soften -drapes -elk -gobble -dears -hither -snort -micah -plumb -scorn -moods -gras -blasts -mammal -temp -entity -flaps -blur -sentry -dearie -merge -shreds -zap -gant -stunts -toil -owls -slab -talkie -twitch -jester -lineup -bono -edgy -gigs -wraps -vendor -tout -plaque -slums -rural -keg -gaul -cyborg -flakes -seaman -fungus -sheik -sewed -yap -thaw -pap -lemons -chills -gaming -potent -oars -bleak -heath -hearse -spurs -mayhem -dazzle -tabs -piled -strand -weaken -muzzle -typed -lorry -thrive -ballot -rink -nil -lured -rhode -hoops -sleazy -faucet -dharma -stork -irs -starry -picket -possum -gehrig -reggae -hula -tombs -doves -begs -petit -riff -mutton -gags -hive -chunks -wreath -bazaar -psyche -dipped -solace -oxen -vested -malt -disarm -rhea -meek -mormon -cedar -gent -unborn -bestow -plight -cadets -stat -urn -porky -gemma -donut -retail -peking -brunch -honky -refers -thrash -banish -sensor -flair -overly -assess -drool -icebox -holed -jiffy -output -frosty -carp -kroner -racism -clang -folder -helium -stalk -lanes -duo -lash -mooing -ragged -fangs -sera -wigs -brood -dukes -pantry -whirl -purge -bleach -snores -shiver -alba -winged -brooch -dyed -bulbs -quill -racer -dinars -merits -maggot -washer -plump -reopen -coded -fluke -molten -peaks -payoff -doses -strips -minors -pours -teens -pimps -shone -timers -dory -blazes -comma -slaps -toledo -nausea -elijah -venue -rushes -hauled -rents -wring -louvre -twain -maddox -rosary -chime -lumps -infect -tux -mead -hitter -harass -grad -reins -namely -lodged -slayer -clerks -crypt -trough -calms -shrewd -grains -dover -trades -neatly -vogue -occult -hombre -berg -bern -bends -volts -vines -spleen -ashton -sao -soar -unrest -ravine -skis -gazing -relish -arcade -stalls -prune -muster -pence -genre -maitre -amidst -tidal -pox -fished -cashed -tvs -gill -heals -canton -prima -cooled -bonny -wraith -kappa -oslo -gauls -gowns -canon -digits -straws -awoke -prone -urged -lax -lard -halo -lush -usher -tagged -arouse -skid -pilate -wick -dud -dimes -lupin -roper -beeper -saber -quo -hiss -salem -squads -walnut -fats -keats -idaho -casing -rooted -cretin -ample -persia -caliph -envoy -eskimo -gage -stokes -biker -tori -bleeds -cooped -viable -gulls -oats -tides -pooch -torah -goalie -coil -gulps -arose -albany -swells -lyons -loch -yippee -perch -bookie -avatar -lazar -urges -felon -awol -eaters -gigolo -wrongs -uproar -ruckus -ami -fakes -heirs -nerds -mazel -taping -owing -paced -strife -aroma -grocer -relics -ringer -mccall -bras -cougar -frigid -towed -spilt -firms -quail -slopes -majors -gums -opal -newt -sodium -loner -jailed -thames -jig -myths -rips -chit -sari -suitor -corpus -rubies -raf -leper -yearn -seine -boa -bali -mesa -deli -juno -mets -swarm -poses -edible -tramps -feud -outing -foggy -mash -gems -colon -nix -salts -elope -hindus -dwarfs -seeker -bene -weir -trojan -rapper -nab -locke -fringe -aims -manila -casts -bidder -fins -sewn -conned -kahn -evils -nappy -tulip -hyena -buick -hunts -pups -gulp -flashy -fuzz -parry -conn -atone -nigh -mite -abode -hyper -nugget -leaned -hors -renoir -paging -bison -jerky -diva -cicero -oaks -pollen -lyra -wipes -hock -suns -fates -glare -ado -lashes -rulers -cramps -emir -heresy -brides -quince -envied -outlet -lumpy -horde -chimps -tended -flier -mats -rodent -stow -inning -bolted -bogart -germ -hap -weber -enigma -rev -tory -honda -hectic -hopped -swiped -coarse -swamps -soothe -fluff -sprout -disks -neural -swims -puffs -splits -snows -viewed -pints -flask -hanky -warms -mane -ruddy -puffy -mala -dumber -dunes -straps -wither -crafty -slop -scab -faulty -queers -atlas -moors -buoy -pebble -valves -panels -gaulle -vacate -pun -chaser -deluxe -breeds -puny -gallop -canopy -vive -orb -pres -baa -geiger -gusto -rumba -graces -vector -tolls -ware -weeps -strut -turnip -siam -swoop -dept -stacks -perks -rabid -audit -candid -glum -ussr -dole -burner -sequel -borg -largo -clank -uterus -users -sulfur -exceed -walrus -mixer -simmer -bongo -dow -gel -dahlia -spawn -gentry -pranks -foil -whips -mangy -piazza -ticks -ploy -beagle -welch -scuba -tenor -chokes -tingle -turin -bowed -sac -melons -cuss -grover -liege -fronts -oaf -spikes -oft -liner -crumb -rica -upward -cycles -impure -hurl -craps -shucks -peachy -berth -drains -birch -kebab -limbo -skater -odin -jag -danube -rut -quotes -yarn -ratted -wharf -cabs -sumo -pointy -eels -sever -hex -chaste -dosage -pubic -vices -soles -hoof -kinder -twos -quoted -hairdo -jihad -kiev -banzai -duly -snout -yon -prays -lag -abner -hippo -yorker -fiesta -rowdy -burps -pusher -auld -deemed -swipe -jigsaw -chirps -draper -stun -dei -taffy -flowed -blower -plough -thrice -avail -isaiah -afloat -trait -fated -crick -algae -hijack -indies -bayou -hippy -fetish -herpes -chases -afghan -moths -homing -lapse -clergy -itches -embark -puking -minion -trusty -daffy -cabins -staked -fiasco -gills -amour -fouled -cords -oval -arises -unsure -funded -soho -soiled -squawk -fickle -repaid -iceman -bony -twit -jams -redo -python -hanks -snag -unholy -cuter -cubans -mower -crispy -pang -fester -iodine -hints -hussy -thong -hem -plait -desks -poked -chrome -leaps -grange -glitch -mercer -gunned -duet -bashed -glands -drags -podium -coney -prying -nos -haunts -elm -catchy -juices -sci -alamo -fetus -lucid -fixes -canine -armada -medina -liters -whims -cram -deduct -mumble -manned -novice -sewage -tinkle -torso -bowler -briar -flake -rejoin -snug -dual -piling -clot -cocked -moat -yam -hermes -brit -theta -serbs -murmur -trolls -huts -mould -scans -rift -reefs -croak -mont -attire -spout -fuses -mantis -dries -finder -vary -drills -beards -rummy -waffle -tangle -prompt -funnel -tubby -cantor -threes -aggie -moped -embryo -bowel -fend -screwy -traits -invoke -morn -hooch -boxed -winch -camper -ankara -baht -fined -hooky -looker -odessa -misled -shamed -naught -dune -reside -tau -camped -ceases -flunk -amid -crept -rhine -sphinx -fiver -fives -sulk -staten -snotty -crutch -gothic -vans -graze -paved -relive -caper -nests -proofs -madden -chants -keaton -shroud -raced -bran -rad -bijou -marek -bores -ascend -shrunk -unwise -tulips -chopin -aspire -actin -bails -mousse -quint -valor -purest -themes -dopey -hobson -sixes -topped -smelt -damsel -metals -gemini -blitz -tamed -pears -rustle -snowed -indoor -pail -typhus -mit -turban -boldly -nibble -foes -beige -aiding -reacts -whence -mime -clangs -grit -abrupt -sheikh -sickly -verb -fibers -barf -purify -willed -blurry -zeros -stub -cipher -weakly -youths -genoa -gaps -quart -umpire -lingo -adrift -nitwit -sadist -flung -chefs -quake -creak -vita -flawed -mach -equity -wards -oily -fie -raisin -bough -privy -batty -defied -gaping -coping -roster -mans -devout -viewer -koran -bagged -corned -braid -sodas -replay -wart -bossy -visas -paine -medics -sexist -tuba -logged -chisel -pigsty -prix -anglo -smudge -pseudo -ferret -nebula -feisty -riled -jolt -latino -chests -slang -ion -laces -vial -hasten -sax -alto -mags -aspen -bagel -lotto -nabbed -reeks -spied -hover -alleys -brands -tycoon -cad -harlot -mended -baggy -stripe -tact -siding -stank -toxins -duce -medusa -tenure -pegged -uglier -pliers -smithy -fathom -evade -dismal -bubbly -bowing -hype -chunky -piracy -swans -celery -cob -tacos -gland -silky -dashed -mania -fluent -slew -druid -frisk -bead -lobe -loins -fryer -beret -unsafe -annoys -ponder -shes -armory -caged -pines -barman -ironed -taft -otter -amuses -crease -sutra -retro -lasers -bikers -toke -ufos -faust -folds -untied -climbs -creams -gunmen -tripe -hiccup -induce -barter -bronco -warped -stems -pods -brazen -cleric -cubic -cortex -fleece -reigns -cavern -bonded -lout -mushy -soot -binds -raffle -primal -lawman -nylon -digit -quench -lofty -sloth -java -tipsy -halves -ignite -blanc -flips -aloft -cones -tulsa -yeti -groin -ranked -linden -vaults -dodo -hymns -bale -cabot -brando -measly -creamy -ledger -rugs -cokes -bummed -selves -tweet -mocked -ardent -juror -laced -unpaid -fad -snip -teased -eject -gutted -fines -burp -aqua -trendy -prowl -giver -bitchy -jails -graft -lyric -wasps -marino -vegan -synced -zion -vitals -sender -cuddly -prof -dined -mildly -plated -kennel -gopher -nev -uncool -elixir -pleas -mimics -juggle -eros -takers -taipei -phi -mendel -almond -sweats -tarot -sparta -zeta -gull -keel -slid -mumbo -swedes -solves -pocus -snare -smacks -loon -rec -socket -unison -calmer -sonata -teapot -smarty -witted -figs -vixen -dorado -seams -claps -condor -vibes -luau -sneaks -pining -clair -corset -sable -alpine -plums -repel -obi -cools -grips -rotted -nursed -suede -famed -gassed -volga -beryl -pooped -twists -curled -titans -lament -dieter -sic -filly -toddy -rots -phobia -varied -klan -intake -uss -viral -fruity -wrecks -braver -drones -taker -hires -flex -suburb -moro -wanton -ditto -shay -sup -hyenas -woes -hue -joss -maxi -movers -puked -glee -wisest -strays -miser -axes -corona -combed -hocus -dill -bilge -coals -fiscal -moles -aria -ruff -dinky -bona -zing -jurors -hanger -insure -fliers -bugler -rouse -chore -ruse -dainty -canaan -urging -ganges -bwana -wield -dab -lockup -pacing -pus -flak -putt -robs -blooms -dubbed -vat -ripple -drowns -pant -levine -pelvis -fresno -mined -lurch -rein -upload -jokers -spaced -dangle -rapids -licks -yawn -yip -fares -warts -bengal -fiends -bossa -cynic -sears -taurus -sunup -ducats -sodom -paged -avant -stirs -eights -mumps -brahms -bower -vipers -hazy -femme -trois -unwind -twerp -donors -sui -kicker -essays -teal -grammy -jagger -agile -cordon -vigil -sores -amiss -waxed -rogues -sawed -moping -eureka -mishap -sledge -canals -swab -camden -tanned -tartar -fir -napalm -blip -fora -diem -nines -icing -doings -uphill -devoid -tho -girdle -smoky -lowers -operas -dingo -sevens -yeast -kaput -twigs -fiat -wag -savor -savvy -navel -exert -biased -hoe -char -mullet -mayan -tiara -rubs -yeller -guise -untold -pari -sheds -teas -ninny -brewer -exempt -babble -rusted -prissy -rapes -oink -swami -duds -lewd -plural -fray -eloped -oar -trays -quilt -frock -enmity -newer -nosey -guppy -prose -nudge -grubby -polio -topics -salted -begone -nasal -verde -modify -liter -gout -width -remake -imam -idols -gourd -bland -vocals -virgo -hydra -bleeps -minh -beaut -wastes -musket -astern -boars -bustle -dramas -cravat -braids -dozed -grouch -expire -bosun -armpit -fawn -albino -stooge -ulcers -petal -coupon -def -arty -bouncy -humid -loops -jus -ails -madmen -orgies -frisky -mosaic -hep -hefty -regal -amazes -sickle -sri -petite -gleam -emblem -ablaze -rube -sown -relied -longs -footed -libel -pounce -jailer -sugars -crosby -grovel -aught -perm -huns -clad -uranus -lager -wallop -quiver -mince -dilly -blot -packer -robust -racine -palate -alumni -gook -injure -kale -poised -greets -dawned -censor -revere -mongol -ducked -bros -kites -lister -durham -clones -priors -buffer -meaner -puffed -bard -garter -dally -putty -banal -facade -pimple -fisk -menus -argo -gizmo -mays -quark -dazed -knave -evenly -picker -res -frolic -sexes -dimwit -ticker -hickey -reek -bins -dolce -quad -splat -clout -browns -douse -wallow -shafts -taint -yoke -hordes -fodder -stiffs -benign -hedges -byes -curved -comets -cloned -dusted -piety -exodus -presto -ornery -sadder -scamp -zeal -hinder -afoot -scurvy -fide -toxin -ghouls -caw -sachs -cappy -toying -revise -stats -choosy -swig -typist -drafts -alibis -boned -tunic -yanked -shifty -reels -enzyme -cocoon -narc -sexier -vinyl -acne -vapor -carte -refuel -niche -stair -pauper -deem -grits -docked -deport -burrow -cooker -acorn -confer -marlin -hushed -sicker -compel -coated -craze -timely -jerked -malls -hoses -goethe -stead -faro -lunacy -unruly -tier -fowl -heaps -olden -shaker -henna -scots -orbits -salads -squish -kafka -expo -shriek -nieces -briefs -devise -watery -grate -rigor -duped -chirp -undies -pitied -rajah -proxy -voter -gable -dives -dials -kits -hops -brogan -papaya -lahore -silo -sundae -cong -faxed -terra -deux -padded -glows -faker -anvil -gar -curing -waive -sprint -subdue -jugs -ailing -priced -goto -curie -soggy -cranes -runny -hanoi -cheery -trashy -balm -deity -celtic -befall -lepers -unites -wobbly -arches -flabby -bibles -binge -grazed -enema -brutes -mardi -rages -census -relies -vests -gab -bias -drowsy -crawls -toads -bois -mounts -dotty -suntan -roost -starch -spiked -slots -shimmy -mew -tampa -kiosk -flops -finely -odious -col -spills -getup -suites -bulge -triads -deduce -dipper -capped -lupus -nobis -prod -fuels -deejay -iraqis -amish -arming -shiv -sunken -radish -shears -fused -strait -abuses -godson -lastly -manchu -huff -garner -toupee -lilac -tokens -lute -gloss -saucy -aline -hobbit -perky -mortem -oils -bunks -unused -axle -muted -roamed -mixes -llama -talon -kelp -tees -septic -flicks -exec -hearth -cur -atop -assert -mora -braves -pew -aloof -pester -doubly -hater -gander -borneo -tins -coupe -spruce -gauze -aztec -studs -booker -hailed -rarest -galore -filet -soir -manger -perk -pores -andes -isis -sawing -fumble -whiter -gully -tiptoe -dias -purses -klutz -mowing -jiggle -lube -antics -pellet -lavish -forte -asher -caved -optic -concur -heifer -sprang -woven -jour -twirl -crusty -mints -wicket -sorely -kook -loaves -jocks -hernia -cliche -mire -floppy -fib -sandal -daze -harpo -nifty -probes -fable -tiff -clanks -bitsy -obeys -pelt -blob -lope -magma -mitt -serb -dunce -pawned -madder -hives -alight -humbug -crafts -creole -vis -dinghy -acorns -ethic -smog -discs -prude -shank -amp -slump -gnome -suave -kimchi -latent -gazed -homely -eulogy -warmly -moll -somber -grimm -leaky -meats -rustic -bile -conga -chatty -idling -glazed -kraft -slurps -lends -cosa -leapt -avert -tract -ode -danes -clasp -scenic -stony -booths -diddle -pips -bowers -spud -ebony -bodied -covet -gung -rector -mono -rims -hilly -baltic -housed -lackey -seamen -rani -waxing -garbo -tripod -liven -brawn -minx -toffee -infamy -hemp -jigger -dotted -enroll -hatter -carina -tehran -gaff -doped -spooks -graph -ranges -gipsy -moines -widen -cited -hoots -ouija -decor -furies -cater -combs -balkan -tweed -murky -uppity -nighty -crete -tremor -tarp -grotto -dwells -gilded -phooey -pianos -raps -peddle -gust -haggle -swish -zephyr -fixer -brim -weld -flanks -hilt -cite -vane -loafer -crass -evens -resin -grouse -queasy -oxide -yuppie -downed -titled -stills -prized -trends -pout -defies -roving -leans -pearly -pane -peaked -fresco -soaps -breezy -leach -roe -rigs -moos -annex -evict -fonda -welded -mod -ani -leased -unplug -motels -uneven -walled -corp -racers -goings -mitts -pedals -edged -fife -supple -honeys -stowed -labors -fueled -masons -kern -ooze -mimic -guile -clothe -handel -stoker -drivel -pippin -colds -copped -plume -mapped -woolly -towing -spar -innate -busts -clinks -farrow -golfer -syrian -sheen -satire -pisces -drover -because -nothing -thought -believe -another -through -someone -morning -talking -looking -getting -without -already -brother -tonight -friends -problem -waiting -minutes -married -against -working -exactly -husband -trouble -captain -anymore -country -between -brought -welcome -started -anybody -outside -perhaps -playing -telling -leaving -promise -evening -himself -darling -feeling -serious -running -company -special -careful -goodbye -perfect -million -happens -parents -alright -general -control -suppose -strange -picture -forgive -calling -changed -explain -meeting -finally -clothes -officer -present -kidding -imagine -forever -charlie -decided -mistake -station -wedding -worried -message -america -instead -certain -hundred -english -history -michael -quickly -sitting -colonel -missing -service -respect -stopped -besides -forward -killing -neither -whether -teacher -protect -machine -amazing -totally -private -realize -singing -village -wearing -walking -dollars -seconds -staying -driving -college -arrived -nervous -contact -writing -majesty -further -flowers -written -partner -address -learned -mission -kitchen -chicken -holding -allowed -however -putting -usually -destroy -animals -herself -dancing -reading -soldier -dressed -support -mention -charles -grandma -screams -freedom -chinese -breathe -command -patient -figured -weapons -england -stories -sheriff -keeping -richard -natural -witness -correct -earlier -weekend -account -hanging -deserve -ringing -example -grandpa -several -monster -silence -prepare -justice -letters -knowing -society -russian -willing -student -jealous -weather -opinion -suicide -biggest -noticed -helping -nowhere -meaning -somehow -towards -streets -manager -suspect -dropped -excited -whoever -sweetie -science -discuss -spanish -medical -pleased -invited -purpose -survive -ordered -hearing -pretend -numbers -suggest -ashamed -turning -falling -release -fortune -fingers -matters -subject -selling -stomach -british -opening -reality -funeral -airport -program -defense -project -checked -covered -clearly -created -tickets -burning -glasses -foreign -courage -yelling -depends -warning -belongs -success -reasons -italian -journey -century -ancient -factory -sending -records -william -changes -heading -letting -bedroom -finding -revenge -divorce -someday -useless -awesome -miracle -smoking -deliver -victory -planned -showing -growing -reached -doctors -request -passing -younger -becomes -chicago -members -obvious -workers -touched -regular -details -emperor -destiny -enemies -sisters -thunder -watched -central -traffic -process -carried -beating -percent -license -offered -holiday -theater -germans -whistle -answers -receive -uniform -screwed -escaped -hunting -disease -mystery -beloved -comrade -section -fishing -senator -healthy -curious -staring -kingdom -quarter -secrets -barking -concern -beeping -picking -windows -managed -passion -panting -engaged -wounded -treated -johnson -surface -remains -closing -moments -popular -reports -chances -dealing -pulling -unusual -blowing -charges -advance -cooking -collect -winning -wasting -capable -confess -settled -results -illegal -leading -appears -knocked -gasping -victims -garbage -federal -council -jackson -tuesday -express -blessed -bullets -billion -wanting -degrees -parties -trained -robbery -servant -foolish -unknown -trapped -unhappy -crossed -culture -failure -hitting -library -sobbing -greater -cutting -quality -alcohol -rolling -nuclear -proceed -vehicle -fashion -setting -arrange -gunshot -violent -quietly -refused -fifteen -hurting -capital -channel -parking -chasing -anytime -angeles -diamond -torture -actress -comfort -article -attempt -kissing -despite -scratch -entered -concert -spirits -surgery -indians -pushing -whiskey -selfish -similar -drawing -provide -barbara -patrick -affairs -heavens -current -enjoyed -traitor -frankly -stanley -distant -accused -plastic -landing -dreamed -marshal -trusted -western -stephen -begging -vincent -package -balance -citizen -cameras -routine -perform -eternal -awfully -figures -liberty -painful -smiling -admiral -clients -warrant -ability -thieves -players -cleaned -thirsty -bitches -disturb -trigger -reminds -stretch -average -worries -charity -francis -species -moaning -lessons -tragedy -antonio -martial -contest -highway -vampire -network -chatter -systems -highest -related -classes -studied -bottles -manners -laundry -beneath -schools -exhales -fighter -smaller -swallow -removed -painted -sounded -madness -raymond -slipped -effects -prevent -warrior -injured -shelter -chamber -produce -costume -succeed -propose -complex -murders -raining -granted -benefit -replace -therapy -fantasy -charged -cleared -custody -mothers -version -counter -jumping -prayers -florida -rubbish -romance -anxious -naughty -product -actions -testing -lawyers -assault -anthony -kicking -squeeze -crystal -hostage -fellows -extreme -october -luggage -shaking -cheated -pockets -abandon -washing -offense -confirm -digging -typical -shining -returns -african -heavily -praying -academy -matthew -humming -honking -attacks -capture -battery -buzzing -messing -classic -musical -matches -lincoln -dignity -massive -shocked -respond -comment -studies -laughed -mexican -leaders -feeding -shortly -happily -chapter -mankind -breasts -serving -grabbed -measure -illness -arguing -retired -demands -artists -blanket -loyalty -fooling -samurai -perfume -banging -bargain -payment -dragged -russell -drowned -bernard -pattern -pacific -conduct -goddess -engines -stepped -visited -lighter -apology -session -supreme -masters -shadows -fathers -arrives -arrival -wailing -butcher -houston -happier -joining -protest -retreat -operate -various -gravity -leather -nations -embassy -instant -penalty -packing -giggles -honored -halfway -closely -testify -amongst -achieve -buffalo -approve -islands -deposit -strikes -visitor -dessert -awkward -scandal -grounds -causing -concept -wrapped -explode -cookies -killers -surgeon -raising -privacy -sharing -economy -existed -largest -dearest -stabbed -content -gabriel -require -profile -reverse -declare -defence -planets -connect -options -eastern -embrace -shirley -passage -buddies -develop -intense -lecture -counsel -limited -painter -recover -observe -examine -muffled -persons -candles -reserve -monkeys -roaring -episode -leonard -worship -gunfire -dresses -choices -massage -twisted -curtain -helpful -kennedy -spotted -damaged -dorothy -heather -spoiled -phoenix -follows -emotion -exposed -bearing -dentist -seventh -january -excuses -ceiling -improve -magical -monitor -lunatic -genuine -desires -jewelry -crashed -farmers -skipper -stuffed -obliged -collins -include -amusing -sailing -elected -poverty -muscles -objects -regards -bicycle -despair -trailer -impress -strings -priests -crowded -smarter -britain -methods -shotgun -display -planted -blocked -douglas -howling -gallery -endless -smashed -handled -bandits -crushed -pervert -cracked -nearest -orleans -customs -formula -filming -physics -sweater -sighing -seeking -circles -adopted -verdict -efforts -charley -guessed -tobacco -elegant -cabinet -closest -missile -noodles -located -sucking -maximum -sausage -furious -minimum -signing -element -buttons -watches -tension -bothers -compare -welfare -devoted -assumed -fiction -carries -harvest -harmony -speaker -pirates -arizona -absence -vicious -decides -cocaine -gesture -amateur -whisper -cousins -claimed -cleaner -savings -wealthy -pointed -sixteen -bombing -stadium -marines -counted -divided -footage -seattle -luckily -lottery -honesty -roberts -whining -assured -touches -balcony -lesbian -filling -primary -samples -mansion -stewart -precise -harvard -resting -platoon -pension -triumph -experts -sadness -conquer -quicker -relaxed -snoring -signals -cavalry -logical -haunted -possess -psychic -regrets -presume -knights -focused -wonders -shooter -fragile -sources -sincere -legally -compete -prophet -balloon -receipt -climate -consent -autopsy -haircut -reaches -hunters -peasant -rainbow -colored -treason -refuses -hostile -threats -blaring -pouring -couples -screech -needing -feather -pursuit -turkish -scaring -satisfy -swedish -detroit -marilyn -shuttle -drivers -cottage -applied -warming -seventy -holland -heights -corpses -ruining -ireland -tourist -drunken -rabbits -quarrel -writers -hardest -opposed -convict -circuit -chopper -corrupt -journal -travels -ticking -bizarre -anxiety -gilbert -storage -fulfill -farther -expense -jupiter -genetic -convent -rescued -battles -contain -trading -springs -profits -railway -hallway -villain -advised -despise -fainted -delayed -attract -judging -catches -foreman -betting -bowling -explore -tricked -trumpet -skipped -dracula -cowards -aspirin -fascist -rooster -targets -harriet -baggage -rushing -pudding -spencer -melissa -reduced -wishing -restore -smelled -echoing -hissing -tearing -delight -choking -crooked -freaked -essence -handful -madison -eleanor -failing -cheaper -offices -robbing -empress -phantom -unlucky -shorter -hearted -griffin -execute -pumpkin -fastest -duchess -variety -cricket -dealers -climbed -feature -robbers -whipped -sinking -sunrise -auction -pressed -abraham -finance -flowing -blaming -equally -dancers -bedtime -utterly -horizon -crucial -gregory -behaved -greatly -corners -clayton -boiling -gardens -grenade -ignored -publish -bathing -involve -initial -brigade -reunion -forcing -peanuts -whereas -beatles -radical -madonna -chewing -maestro -listens -antique -visible -edition -healing -terrace -organic -mirrors -herbert -torment -creates -fitting -bananas -tiffany -cunning -bubbles -visions -decades -printed -offence -deepest -resolve -backing -needles -solomon -blossom -muslims -jasmine -lightly -deceive -camping -caution -mustard -justify -hideous -volcano -barrier -marquis -coroner -martini -popcorn -relieve -niggers -casting -lobster -insects -witches -seasons -atlanta -venture -yankees -showers -bathtub -talents -slapped -teaches -montana -pitched -jackass -risking -stripes -crosses -carrier -nursing -dislike -popping -longing -richest -exhibit -evolved -lookout -bridges -starved -gorilla -longest -winners -spilled -sailors -chuckle -borders -sundays -chopped -housing -pigeons -inquiry -tougher -olympic -expects -peoples -forests -punched -shallow -torpedo -natives -shields -tapping -blooded -teasing -chester -grocery -blasted -rapidly -rockets -teenage -nursery -lambert -confuse -dismiss -onboard -gestapo -bourbon -shouted -referee -wrecked -liberal -trainer -cabbage -plumber -slavery -digital -puppies -beliefs -weeping -undress -audible -scholar -admired -tactics -females -compass -tractor -neutral -orphans -cruelty -gambler -busting -suzanne -pyramid -blanche -shaving -janitor -tequila -reflect -biology -chimney -skating -flights -pharaoh -orderly -consult -loading -savages -devices -sponsor -pitiful -decency -kenneth -tribute -airline -founded -outcome -sinners -inherit -pajamas -predict -dolores -israeli -suckers -ecstasy -messiah -toilets -disgust -rocking -freezer -cherish -krishna -brothel -shrieks -dragons -pleases -glimpse -tracked -hottest -annoyed -lighten -tunnels -sparrow -lifting -tempted -banquet -flooded -impulse -mutters -scooter -vatican -unarmed -symbols -cowboys -editing -bombers -inmates -insists -portion -inhales -signora -posters -burglar -secured -coconut -tremble -fiancee -recruit -creator -forgets -militia -affects -simpler -rotting -provoke -heating -condoms -surfing -leopard -elderly -handing -guarded -ketchup -spiders -banking -rebuild -payroll -avoided -drummer -flatter -picasso -peaches -pumping -princes -fairies -invaded -studios -tongues -hamburg -quantum -promote -scenery -frances -idiotic -cracker -mercury -tighter -bouquet -oneself -locking -leaning -bidding -legends -caravan -bruises -hostess -decline -courses -singers -praised -advisor -shutter -athlete -crashes -ripping -suffers -octopus -amounts -rangers -damages -inspire -beaches -denying -rejoice -walling -melting -baghdad -winters -mineral -condemn -modesty -daytime -bandage -remorse -drawers -webster -unaware -penguin -cartoon -cannons -handles -shampoo -swollen -monthly -secrecy -revving -jackpot -biscuit -summers -designs -resumes -licking -forrest -warfare -easiest -squeaks -statues -postman -glowing -diapers -tripped -dynasty -bankers -dolphin -roughly -throats -vanilla -critics -snapped -rubbing -gypsies -bravery -immense -proudly -repairs -bottoms -runaway -carrots -bugging -prefers -squeals -freeway -proving -dangers -wheeler -cashier -cynical -edwards -babylon -uptight -motives -prisons -flipped -shipped -funding -blinded -steward -pauline -lawsuit -columns -faculty -chooses -convert -mermaid -dreamer -immoral -context -memphis -freight -escapes -pennies -oysters -sensors -skilled -readers -barrels -chained -dungeon -punches -altered -descent -dumping -suburbs -console -stained -excused -oranges -aspects -mixture -viewers -zombies -lucifer -fireman -timothy -partial -insults -alabama -sundown -virgins -lucille -kidneys -amnesia -forming -gaining -tighten -protein -scarlet -upright -exploit -doorway -veteran -pickles -extinct -courier -beggars -gallant -dispose -tightly -bangkok -donovan -ratings -drugged -farming -titanic -obscene -heroine -crawled -briefly -sorrows -extract -boredom -earning -plaster -markets -outrage -tattoos -panther -marries -breaker -powered -serpent -redhead -matched -leaking -stunned -culprit -mounted -lasting -desired -seduced -getaway -coolest -mocking -chaplin -schultz -anguish -lacking -pistols -siberia -alarmed -royalty -lantern -pitcher -analyze -chronic -indiana -combine -inspect -remarks -wrestle -snowing -slowing -rations -sabbath -gallons -temples -weighed -heavier -marbles -notices -doubled -eclipse -sighted -caliber -patriot -whacked -armored -parting -johnnie -dresser -overall -insight -hookers -mailbox -clearer -dispute -fanfare -toronto -educate -vessels -errands -shelley -refined -charmed -fearful -payback -cologne -sleeves -conceal -acquire -ashtray -trivial -refugee -doorman -thanked -breaths -islamic -alleged -arrests -admirer -darkest -commune -martian -stables -tolling -tyranny -chemist -ominous -leisure -lettuce -tuition -valiant -replied -jackets -gallows -flaming -diploma -trooper -canteen -indoors -skinner -indulge -sanders -descend -spreads -belgian -fleeing -pianist -periods -anarchy -awarded -surname -outfits -chateau -charter -hideout -appoint -chiming -qualify -cabaret -zealand -patrols -placing -sustain -sweeter -burgers -reveals -standby -peacock -pending -severed -mumbles -reactor -ribbons -obscure -terrain -tenants -scrooge -dialing -dinners -vintage -furnace -abigail -prairie -capsule -rightly -sublime -captive -rituals -handbag -prevail -amnesty -takeoff -twinkle -scatter -emerged -reviews -neglect -carmine -harness -soviets -antenna -sharply -anatomy -burying -swimmer -neptune -seizure -starter -founder -expired -beseech -vaccine -liaison -nagging -radiant -sliding -ghastly -accepts -shuffle -emerald -solving -freshen -turtles -doubted -fertile -pinched -arsenal -malaria -clarify -firstly -hugging -settles -transit -herring -baptist -bladder -pioneer -virtues -endured -scanner -rumbles -cruiser -orlando -marched -berries -hooting -winding -strokes -credits -intrude -invites -catcher -buckets -rewrite -origins -defined -rattles -cooling -vinegar -drought -overdue -pierced -earthly -skinned -blazing -seminar -gagging -prefect -thinner -manages -install -ranking -lullaby -insured -vitamin -dynamic -jerking -appeals -salvage -pageant -hustler -permits -persian -roasted -mustang -horrors -garland -soaking -newborn -drained -firemen -pilgrim -vermont -vulture -willard -analyst -runners -lowered -hotshot -seniors -trinity -uranium -stalker -stirred -batting -forgave -mildred -slammed -consume -merrily -forfeit -orchard -careers -pursued -isolate -bullied -capitol -dilemma -crusade -aroused -disobey -cursing -faggots -intends -bruised -grammar -bailiff -collier -roaming -fencing -incense -envious -lazarus -imitate -hygiene -dictate -hopeful -worldly -squares -regions -evident -drafted -earring -outlaws -renting -cockpit -cheetah -peeping -penance -bending -flashes -suspend -bounced -sandals -fleming -katrina -clarity -adapted -premier -sparkle -puzzles -fearing -coaster -dickens -boarded -rascals -genesis -wichita -revenue -fascism -sleeper -smuggle -olympus -centers -cackles -applies -meadows -doubles -applaud -mortals -chariot -squawks -passive -invalid -shelves -shoving -virtual -crowned -glamour -goliath -spelled -refrain -wyoming -rapping -serbian -peppers -squared -emptied -sneezes -tablets -carolyn -harding -pencils -whitney -tribune -guineas -drastic -ongoing -dashing -junkies -bravely -jogging -coffins -puppets -morally -grilled -slander -reacted -negroes -mammals -dialect -bravest -pillows -itching -hatchet -stashed -manhood -plugged -summons -removal -schemes -vaguely -prosper -quieter -imposed -wildest -thermal -inhuman -helmets -platter -donated -rewards -goodman -coffees -doggone -kittens -tangled -outline -repeats -atheist -gibbons -tickles -cushion -flushed -streams -giraffe -refresh -addicts -bermuda -posture -confide -cheater -spinach -implore -wilhelm -tornado -cardiac -raphael -fatigue -mitzvah -lending -minding -violate -slumber -gateway -murmurs -pompous -lurking -insides -faraway -snipers -voyager -riviera -puberty -tossing -bologna -manning -turmoil -hopping -costing -stating -weights -suffice -chaotic -stylish -sulking -jukebox -drifted -brownie -tracker -pancake -rounded -inquire -clatter -guiding -craving -cheerio -apaches -sterile -bygones -factors -alimony -ethical -legions -snowman -booking -waiters -trashed -stumble -seafood -strauss -printer -hawking -sensual -uncover -hitched -largely -lengths -builder -scripts -lunches -koreans -raiders -finnish -charade -singles -toaster -screens -enhance -lizards -marital -unclear -enforce -widower -museums -peeking -trolley -bottled -drinker -waffles -tedious -okinawa -pasture -masseur -hobbies -camelot -valleys -cyclops -rooftop -graphic -closure -workout -hauling -iceberg -deprive -freeman -viewing -carving -jamming -seaside -bellies -greeted -frantic -shifted -tasting -quoting -emerson -ulysses -threads -blacked -crucify -exhaust -endings -grizzly -ditched -stamped -fanatic -sinatra -authors -recital -leagues -presses -steamed -compose -orchids -hateful -hippies -cyanide -fancies -riddles -nickels -typhoon -dioxide -outdoor -hacking -redneck -heathen -sneaked -mockery -baloney -crumble -earnest -catfish -deserts -colleen -perjury -pickled -awaited -praises -pesetas -notions -bedside -scalpel -glasgow -methane -hooking -scoring -thicker -cornell -booster -implant -unicorn -carpets -harmful -poisons -devised -refusal -hillary -brushed -phrases -patches -fetched -siamese -carcass -torches -gourmet -kiddies -niagara -florist -mailman -plainly -gangway -urgency -bergman -cleanse -bumping -shatter -coaches -behaves -seaweed -sticker -phoning -sellers -coppers -goodies -novelty -glacier -swiftly -odyssey -rebuilt -docking -anomaly -eyeball -commend -hamster -wronged -baptism -dumbest -brushes -buggers -pledged -outpost -compact -unheard -galahad -eyelids -pretext -upgrade -cuisine -mammoth -burrows -cholera -catalog -ironing -memoirs -stealth -staging -slipper -syringe -touring -marking -bedford -estates -entrust -renewed -prudent -hurried -aladdin -upwards -varsity -stacked -fancied -festive -maggots -bulldog -napkins -tailing -seagull -paradox -berserk -funnier -binding -castles -boulder -bonfire -clemens -elusive -pegasus -psyched -flushes -cupcake -upstate -smacked -hiccups -stamina -guitars -cluster -copying -blindly -adviser -crimson -frontal -granite -striped -butters -premium -cramped -branded -bonding -lasagna -crazier -jacuzzi -reclaim -proverb -mistook -seasick -martyrs -machete -habitat -freshly -voltage -goggles -maniacs -rebound -measles -whatnot -bristol -pinball -wizards -thyself -traders -dodgers -casinos -editors -signore -hayward -booming -forgery -eminent -playful -glitter -minimal -bullies -motions -matador -unified -relying -sarcasm -forbids -baskets -recipes -deleted -tainted -patrons -spooked -lodging -futures -oatmeal -nirvana -quixote -maidens -brewing -pandora -belches -saddest -sprayed -stutter -heretic -pillars -everest -trainee -meowing -density -algebra -blurred -thereby -pottery -rebirth -wartime -leeches -consort -coupons -texture -surplus -parsons -knuckle -bayonet -slashed -stature -hoodlum -cocking -soprano -robbins -bearded -coastal -presley -ghostly -rejects -garment -nonstop -galileo -weakest -implies -wrinkle -bloated -arabian -clipped -dwarves -unleash -caramel -hangman -induced -milking -evasive -bellows -outlook -morales -puzzled -summary -barging -nearing -coyotes -undergo -sorting -forsake -hatched -blondes -vikings -dreaded -briefed -jehovah -wrongly -hancock -demonic -cleaver -marches -avenged -dubious -milkman -janeiro -stifler -mandate -breakup -gambled -fossils -plucked -windsor -kibbutz -hosting -meanest -chipped -sharpen -fridays -goblins -thinker -tsunami -disrupt -derrick -plunder -abdomen -bashful -lovable -plunged -abusive -pleaded -memento -heroism -devious -turkeys -persist -evicted -residue -midwife -tropics -yawning -overrun -midwest -startle -strayed -scolded -seating -monarch -slender -faraday -cobbler -whitman -orgasms -tissues -buzzard -candies -nightly -statute -violets -scraped -sweetly -peabody -concede -linking -fullest -tourism -silicon -uncanny -outcast -stormed -cheques -mongrel -sensing -sedated -cossack -hormone -posting -billing -tracing -rooting -algiers -setback -volumes -raccoon -beastly -ugliest -keepers -bribery -inquest -fallout -fussing -wallets -reptile -midgets -galilee -lowlife -augusta -caveman -weaving -tibetan -borough -mutants -plateau -custard -looting -crowbar -archers -insulin -addison -grazing -updated -tolstoy -scourge -smitten -squeaky -abiding -swaying -allergy -heinous -dummies -dodging -fitness -piccolo -scarred -norfolk -sweeney -collide -patched -pendant -banners -nephews -fiddler -foresee -latrine -closets -bangles -pebbles -blender -neutron -nucleus -artwork -flutter -donkeys -suction -bullock -chilled -steamer -genghis -rosebud -malachi -abusing -raisins -arsenic -dipping -leaping -symptom -violins -packets -crybaby -jingles -spartan -archive -alerted -utility -outward -floated -daisies -newport -listing -thrills -recount -commits -freezes -stalled -mileage -default -planner -babysit -baptize -brewery -mouthed -tidings -warhead -bunnies -scrawny -heiress -calcium -holster -charger -charmer -shorten -sprouts -tiniest -larceny -bouncer -swindle -onwards -quartet -turnout -railing -plotted -chilean -ostrich -scrolls -smeared -burgess -markers -trotter -soaring -sandman -gadgets -tickled -palaces -hammers -pimples -muffins -striker -swapped -learner -orpheus -nemesis -defiant -sorcery -yapping -checkup -regroup -optical -labeled -roaches -inflict -enabled -cleanup -firearm -folding -endowed -escorts -suzette -shaping -sardine -parched -deficit -resides -revived -bazooka -preview -dormant -winslow -sipping -eyebrow -dossier -godless -monsoon -discard -wildcat -kindest -greased -mondays -waldorf -sectors -rethink -sermons -rapture -excites -grinder -clement -curator -appetit -cuckold -bailing -decreed -replies -flunked -plagued -watered -carnage -rigging -emerges -daggers -segment -limping -guesses -shivers -exclude -collars -ballast -tending -forbade -trapeze -defects -confine -revered -swamped -seville -extends -sharper -twelfth -cheered -diverse -caterer -literal -electra -vibrant -strains -flashed -tallest -defying -circled -richter -topside -scented -absolve -cutters -whoring -secular -betrays -smashes -wanders -saffron -elastic -gunning -bigfoot -yelping -faintly -peeling -zapping -saddled -apostle -frisbee -banning -shrinks -harshly -erratic -anything -remember -happened -yourself -together -tomorrow -business -everyone -somebody -actually -children -thinking -probably -whatever -daughter -supposed -question -possible -straight -laughing -hospital -american -speaking -finished -terrible -birthday -pleasure -building -watching -chuckles -anywhere -surprise -problems -thousand -accident -security -marriage -fighting -standing -personal -position -promised -continue -sergeant -sleeping -bullshit -evidence -suddenly -starting -pictures -brothers -upstairs -involved -drinking -shouting -shooting -decision -princess -language -interest -director -innocent -military -computer -soldiers -complete -feelings -bathroom -nonsense -pregnant -strength -greatest -consider -favorite -japanese -mountain -national -practice -pressure -horrible -minister -although -cheering -monsieur -possibly -handsome -prepared -saturday -arrested -powerful -medicine -breaking -murdered -bringing -believed -laughter -training -whenever -students -criminal -received -distance -followed -returned -universe -contract -expected -thoughts -murderer -grunting -property -planning -goodness -audience -research -realized -bastards -painting -football -wherever -officers -vacation -governor -original -carrying -honestly -exciting -romantic -midnight -millions -charming -stranger -recently -familiar -memories -prisoner -violence -sometime -precious -changing -confused -grateful -official -applause -families -knocking -ordinary -creature -treasure -friendly -highness -positive -darkness -groaning -terrific -shopping -attorney -presence -terribly -bleeding -attacked -stronger -becoming -stealing -hundreds -magazine -checking -dreaming -reporter -physical -politics -throwing -gorgeous -elevator -sentence -attitude -shoulder -material -cleaning -exchange -separate -progress -properly -swimming -champion -directly -movement -thursday -counting -solution -mistakes -pleasant -district -patients -schedule -negative -studying -pathetic -accepted -entirely -religion -released -location -paradise -learning -stopping -narrator -convince -approach -spending -teaching -arranged -farewell -opposite -disaster -mistress -struggle -presents -entrance -customer -campaign -patience -ceremony -starving -citizens -baseball -incident -suffered -services -generous -neighbor -delivery -lifetime -transfer -behavior -instance -passport -producer -exercise -believes -touching -betrayed -basement -downtown -partners -diamonds -growling -division -sandwich -margaret -reported -coughing -adjusted -everyday -marrying -chairman -messages -normally -mistaken -reverend -enjoying -cheating -machines -identity -describe -worrying -wondered -complain -answered -invented -visiting -designed -occasion -survived -electric -comrades -jonathan -splendid -standard -valuable -russians -homework -informed -industry -offering -punished -fabulous -discover -headache -dramatic -reaction -suitcase -stubborn -divorced -engineer -whispers -deserves -doorbell -appeared -absolute -captured -peaceful -listened -superior -contrary -imagined -argument -operator -williams -identify -quarters -election -specific -catholic -troubles -dressing -elephant -freezing -teachers -gambling -enormous -humanity -judgment -potatoes -directed -southern -response -festival -sunshine -visitors -promises -nowadays -corporal -slightly -occurred -meantime -faithful -crossing -dropping -maintain -stations -cemetery -servants -supplies -increase -hopeless -rumbling -delicate -almighty -compared -virginia -activity -entering -bothered -accounts -talented -gathered -blessing -giggling -december -catching -kindness -hercules -gunshots -monsters -previous -superman -republic -emotions -homicide -november -survival -boarding -airplane -necklace -lawrence -belonged -countess -european -produced -glorious -searched -required -chanting -borrowed -weakness -attached -deserved -daylight -recorded -sticking -suspects -meetings -announce -grandson -register -congress -intended -chickens -anderson -carriage -arriving -proposal -dreadful -railroad -treating -internal -northern -disgrace -eternity -critical -telegram -constant -marshall -chemical -brooklyn -holidays -floating -defeated -provided -obsessed -poisoned -whistles -somewhat -advanced -tracking -aircraft -annoying -creating -scotland -victoria -executed -freaking -strategy -creative -audition -offended -relative -strictly -dialogue -appetite -ministry -function -ultimate -nicholas -concerns -covering -dynamite -homeless -creation -graduate -fighters -insisted -employee -document -whirring -sequence -helpless -facility -screwing -envelope -miracles -elements -warriors -requires -climbing -napoleon -conflict -expenses -clicking -trousers -entitled -assigned -hostages -shepherd -vanished -clothing -sympathy -overcome -guardian -sensible -tortured -educated -remained -forgiven -illusion -benjamin -portrait -regiment -infected -husbands -declared -relieved -respects -civilian -admitted -invasion -threaten -sickness -crashing -platform -economic -ignorant -veronica -paranoid -designer -instinct -analysis -umbrella -occupied -vampires -priority -addition -stinking -disguise -revealed -inspired -reaching -harmless -salesman -pounding -assassin -withdraw -frighten -preacher -mitchell -replaced -gangster -collapse -imperial -spinning -ambition -controls -franklin -gracious -alliance -marching -atlantic -broadway -february -crawling -concrete -florence -musician -heavenly -contacts -thompson -einstein -waitress -chirping -subjects -bachelor -persuade -roommate -explains -deserted -jealousy -uniforms -adorable -tolerate -whimpers -drowning -arrogant -secretly -traveled -cracking -corridor -reminded -majority -lipstick -handling -products -rattling -affected -cocktail -shanghai -included -troubled -feathers -forehead -intimate -lighting -deceased -magician -opponent -clearing -tourists -password -rejected -creaking -hesitate -curtains -thrilled -abortion -immortal -capacity -multiple -pointing -approval -courtesy -peculiar -robinson -quitting -restless -fourteen -reliable -eighteen -suitable -clarence -preserve -thirteen -homeland -guessing -campbell -symptoms -cheerful -accurate -barracks -recovery -fletcher -childish -assembly -fountain -youngest -scissors -wretched -assuming -measures -missiles -proposed -approved -landlord -isolated -cultural -shocking -domestic -peasants -switched -happiest -inviting -benefits -stepping -strongly -costumes -achieved -insulted -squadron -mortgage -sniffing -sneaking -merciful -egyptian -theories -projects -disagree -billions -chambers -nickname -reserved -wardrobe -mechanic -unlikely -artistic -vehicles -expelled -dragging -dispatch -evacuate -retarded -indicate -bracelet -sunlight -examined -carnival -fortress -sweating -prettier -canadian -pentagon -mentally -relation -interior -weekends -backyard -disorder -disposal -merchant -articles -infinite -definite -distress -promoted -traitors -allergic -calendar -cardinal -guidance -barbecue -villages -selected -insanity -memorial -province -injuries -discount -terminal -purchase -tomatoes -hamilton -overtime -ordering -deceived -swinging -souvenir -starring -branches -behaving -blocking -shipment -gasoline -destined -canceled -drawings -mourning -generals -patricia -sexually -opinions -deadline -notebook -speeches -requests -escaping -contempt -pressing -careless -hometown -software -carolina -mattress -slipping -improved -gardener -magnetic -charging -italians -lonesome -pancakes -thankful -nuisance -whooping -accusing -altitude -purposes -ruthless -striking -exploded -features -choosing -diseases -reckless -earrings -distract -discreet -squirrel -slippers -scenario -profound -solitary -colorado -protocol -screamed -programs -rehearse -equipped -chatting -allowing -channels -avoiding -strangle -blackout -trusting -lemonade -betrayal -mustache -overseas -teenager -postcard -workshop -shipping -stressed -compound -restored -comments -cupboard -precinct -sounding -sweetest -breeding -patterns -infantry -recorder -combined -survivor -leonardo -coverage -includes -launched -flirting -devotion -summoned -peterson -hardware -incoming -stunning -muhammad -mumbling -phillips -grounded -semester -blankets -premises -bankrupt -treasury -skeleton -unstable -acquired -prophecy -currency -overhead -reindeer -morphine -sniffles -invested -garrison -rational -petition -commands -crippled -attended -suggests -mcdonald -morrison -sabotage -employed -speakers -morality -attempts -cheyenne -cadillac -fugitive -payments -refugees -michigan -resolved -exposure -feminine -repeated -cautious -addicted -smelling -fearless -breathes -relevant -slippery -parallel -weddings -rosemary -churches -smashing -awaiting -smallest -observed -spitting -practise -historic -nineteen -frontier -commence -activate -biscuits -juvenile -confront -triangle -eminence -syndrome -tropical -baroness -columbus -figuring -solitude -numerous -greeting -thorough -evenings -drifting -estimate -holiness -dripping -bluffing -snarling -clapping -resigned -apparent -sidewalk -resident -likewise -godzilla -chandler -oklahoma -mainland -panicked -columbia -monument -guarding -hydrogen -detailed -wandered -protects -mosquito -claiming -refusing -freshman -surround -shortcut -managing -olympics -referred -shameful -employer -whinnies -dolphins -comedian -stitches -dinosaur -stripper -rewarded -extended -antidote -cowardly -operated -disabled -intercom -academic -demanded -missions -violated -abducted -epidemic -stripped -ignition -mornings -istanbul -steering -backpack -crackers -briefing -repaired -balloons -specimen -speeding -gigantic -kentucky -printing -imbecile -assemble -involves -measured -rustling -shutting -secondly -retrieve -sinister -smartest -anyplace -provides -ignoring -contents -postpone -pussycat -punching -werewolf -moreover -stalking -grabbing -sherlock -settling -receiver -benedict -pharmacy -dedicate -sausages -richards -sessions -twilight -grenades -defended -babbling -brighter -publicly -cannabis -revolver -severely -bulletin -literary -backward -reminder -montreal -galaxies -adoption -vitamins -confined -richmond -gertrude -stanford -bouncing -airborne -toughest -composed -category -obtained -eyebrows -prospect -cultures -sweeping -airlines -departed -hangover -initials -traveler -composer -relaxing -theodore -missouri -consumed -salvador -commerce -plumbing -clanging -stirring -scottish -policies -donation -finishes -disciple -mischief -brussels -feedback -intruder -scorpion -amateurs -cleaners -doorstep -urgently -garfield -athletic -detected -sardines -tactical -metaphor -premiere -inclined -spelling -obstacle -equation -heritage -packages -snatched -medieval -brunette -unlocked -informer -mattered -regional -bacteria -conclude -matching -bursting -smoothly -bandages -database -noticing -sneakers -banished -hormones -agencies -portland -existing -sporting -cromwell -destroys -deciding -stumbled -humility -stalling -tempting -notified -goldfish -inferior -swearing -landlady -symphony -watchman -villains -comeback -starters -stranded -something -beautiful -everybody -important -different -sometimes -gentlemen -wonderful -somewhere -president -yesterday -certainly -christmas -questions -continues -attention -happening -afternoon -dangerous -situation -professor -difficult -screaming -beginning -apartment -seriously -listening -boyfriend -ourselves -otherwise -breakfast -necessary -detective -excellent -surprised -following -obviously -forgotten -gentleman -wondering -commander -according -emergency -inspector -happiness -apologize -operation -recognize -perfectly -character -telephone -introduce -fantastic -destroyed -condition -expecting -thousands -concerned -brilliant -cigarette -secretary -expensive -breathing -political -mountains -carefully -americans -therefore -christian -champagne -suffering -knowledge -insurance -assistant -interview -celebrate -chocolate -community -mentioned -committed -direction -statement -naturally -disappear -including -chuckling -newspaper -delicious -prisoners -sacrifice -subtitles -advantage -extremely -available -hollywood -basically -desperate -education -challenge -equipment -authority -committee -ambulance -convinced -elizabeth -miserable -customers -treatment -guarantee -nightmare -surrender diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/BitInputStream.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/BitInputStream.java new file mode 100644 index 000000000..b6ec7234e --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/BitInputStream.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) Andreas Jakl + * + * 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 . + */ + +package org.sufficientlysecure.keychain.experimental; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +/** + * The BitInputStream allows reading individual bits from a + * general Java InputStream. + * Like the various Stream-classes from Java, the BitInputStream + * has to be created based on another Input stream. It provides + * a function to read the next bit from the sream, as well as to read multiple + * bits at once and write the resulting data into an integer value. + *

+ * source: http://developer.nokia.com/Community/Wiki/Bit_Input/Output_Stream_utility_classes_for_efficient_data_transfer + */ +public class BitInputStream { + /** + * The Java InputStream this class is working on. + */ + private InputStream iIs; + + /** + * The buffer containing the currently processed + * byte of the input stream. + */ + private int iBuffer; + + /** + * Next bit of the current byte value that the user will + * get. If it's 8, the next bit will be read from the + * next byte of the InputStream. + */ + private int iNextBit = 8; + + /** + * Create a new bit input stream based on an existing Java InputStream. + * + * @param aIs the input stream this class should read the bits from. + */ + public BitInputStream(InputStream aIs) { + iIs = aIs; + } + + /** + * Read a specified number of bits and return them combined as + * an integer value. The bits are written to the integer + * starting at the highest bit ( << aNumberOfBits ), going down + * to the lowest bit ( << 0 ) + * + * @param aNumberOfBits defines how many bits to read from the stream. + * @return integer value containing the bits read from the stream. + * @throws IOException + */ + synchronized public int readBits(final int aNumberOfBits) + throws IOException { + int value = 0; + for (int i = aNumberOfBits - 1; i >= 0; i--) { + value |= (readBit() << i); + } + return value; + } + + synchronized public int available() { + try { + return (8 - iNextBit) + iIs.available() * 8; // bytestream to bitstream available + } catch (Exception e) { + return 0; + } + } + + /** + * Read the next bit from the stream. + * + * @return 0 if the bit is 0, 1 if the bit is 1. + * @throws IOException + */ + synchronized public int readBit() throws IOException { + if (iIs == null) + throw new IOException("Already closed"); + + if (iNextBit == 8) { + iBuffer = iIs.read(); + + if (iBuffer == -1) + throw new EOFException(); + + iNextBit = 0; + } + + int bit = iBuffer & (1 << iNextBit); + iNextBit++; + + bit = (bit == 0) ? 0 : 1; + + return bit; + } + + /** + * Close the underlying input stream. + * + * @throws IOException + */ + public void close() throws IOException { + iIs.close(); + iIs = null; + } +} \ No newline at end of file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/SentenceConfirm.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/SentenceConfirm.java new file mode 100644 index 000000000..ead70b8f6 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/SentenceConfirm.java @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2015 Dominik Schürmann + * Copyright (C) 2014 Jake McGinty (Open Whisper Systems) + * + * 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 . + */ + +package org.sufficientlysecure.keychain.experimental; + +import android.content.Context; + +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.util.Log; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +/** + * From https://github.com/mcginty/TextSecure/tree/mnemonic-poem + */ +public class SentenceConfirm { + Context context; + List n, vi, vt, adj, adv, p, art; + + public SentenceConfirm(Context context) { + this.context = context; + try { + n = readFile(R.raw.fp_sentence_nouns); + vi = readFile(R.raw.fp_sentence_verbs_i); + vt = readFile(R.raw.fp_sentence_verbs_t); + adj = readFile(R.raw.fp_sentence_adjectives); + adv = readFile(R.raw.fp_sentence_adverbs); + p = readFile(R.raw.fp_sentence_prepositions); + art = readFile(R.raw.fp_sentence_articles); + } catch (IOException e) { + Log.e(Constants.TAG, "Reading sentence files failed", e); + } + } + + List readFile(int resId) throws IOException { + if (context.getApplicationContext() == null) { + throw new AssertionError("app context can't be null"); + } + + BufferedReader in = new BufferedReader(new InputStreamReader( + context.getApplicationContext() + .getResources() + .openRawResource(resId))); + List words = new ArrayList<>(); + String word = in.readLine(); + while (word != null) { + words.add(word); + word = in.readLine(); + } + in.close(); + return words; + } + + public String fromBytes(final byte[] bytes, int desiredBytes) throws IOException { + BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes)); + EntropyString fingerprint = new EntropyString(); + + while (fingerprint.getBits() < (desiredBytes * 8)) { + if (!fingerprint.isEmpty()) { + fingerprint.append("\n\n"); + } + try { + fingerprint.append(getSentence(bin)); + } catch (IOException e) { + Log.e(Constants.TAG, "IOException when creating the sentence"); + throw e; + } + } + return fingerprint.toString(); + } + + /** + * Grab a word for a list of them using the necessary bits to choose from a BitInputStream + * + * @param words the list of words to select from + * @param bin the bit input stream to encode from + * @return A Pair of the word and the number of bits consumed from the stream + */ + private EntropyString getWord(List words, BitInputStream bin) throws IOException { + final int neededBits = log(words.size(), 2); + Log.d(Constants.TAG, "need " + neededBits + " bits of entropy"); + int bits = bin.readBits(neededBits); + Log.d(Constants.TAG, "got word " + words.get(bits) + " with " + neededBits + " bits of entropy"); + return new EntropyString(words.get(bits), neededBits); + } + + private EntropyString getNounPhrase(BitInputStream bits) throws IOException { + final EntropyString phrase = new EntropyString(); + phrase.append(getWord(art, bits)).append(" "); + if (bits.readBit() != 0) { + phrase.append(getWord(adj, bits)).append(" "); + } + phrase.incBits(); + + phrase.append(getWord(n, bits)); + Log.d(Constants.TAG, "got phrase " + phrase + " with " + phrase.getBits() + " bits of entropy"); + return phrase; + } + + EntropyString getSentence(BitInputStream bits) throws IOException { + final EntropyString sentence = new EntropyString(); + sentence.append(getNounPhrase(bits)); // Subject + if (bits.readBit() != 0) { + sentence.append(" ").append(getWord(vt, bits)); // Transitive verb + sentence.append(" ").append(getNounPhrase(bits)); // Object of transitive verb + } else { + sentence.append(" ").append(getWord(vi, bits)); // Intransitive verb + } + sentence.incBits(); + + if (bits.readBit() != 0) { + sentence.append(" ").append(getWord(adv, bits)); // Adverb + } + + sentence.incBits(); + if (bits.readBit() != 0) { + sentence.append(" ").append(getWord(p, bits)); // Preposition + sentence.append(" ").append(getNounPhrase(bits)); // Object of preposition + } + sentence.incBits(); + Log.d(Constants.TAG, "got sentence " + sentence + " with " + sentence.getBits() + " bits of entropy"); + + // uppercase first character, end with dot (without increasing the bits) + sentence.getBuilder().replace(0, 1, + Character.toString(Character.toUpperCase(sentence.getBuilder().charAt(0)))); + sentence.getBuilder().append("."); + + return sentence; + } + + public static class EntropyString { + private StringBuilder builder; + private int bits; + + public EntropyString(String phrase, int bits) { + this.builder = new StringBuilder(phrase); + this.bits = bits; + } + + public EntropyString() { + this("", 0); + } + + public StringBuilder getBuilder() { + return builder; + } + + public boolean isEmpty() { + return builder.length() == 0; + } + + public EntropyString append(EntropyString phrase) { + builder.append(phrase); + bits += phrase.getBits(); + return this; + } + + public EntropyString append(String string) { + builder.append(string); + return this; + } + + public int getBits() { + return bits; + } + + public void setBits(int bits) { + this.bits = bits; + } + + public void incBits() { + bits += 1; + } + + @Override + public String toString() { + return builder.toString(); + } + } + + private static int log(int x, int base) { + return (int) (Math.log(x) / Math.log(base)); + } + +} \ No newline at end of file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/WordConfirm.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/WordConfirm.java new file mode 100644 index 000000000..daf63ea9e --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/experimental/WordConfirm.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2015 Dominik Schürmann + * + * 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 . + */ + +package org.sufficientlysecure.keychain.experimental; + +import android.content.Context; + +import org.spongycastle.util.Arrays; +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.util.Log; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.BitSet; + +public class WordConfirm { + + public static String getWords(Context context, byte[] fingerprintBlob) { + ArrayList words = new ArrayList<>(); + + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader( + context.getResources().openRawResource(R.raw.fp_word_list), + "UTF-8" + )); + + String line = reader.readLine(); + while (line != null) { + words.add(line); + + line = reader.readLine(); + } + } catch (IOException e) { + throw new RuntimeException("IOException", e); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException ignored) { + } + } + } + + String fingerprint = ""; + + // NOTE: 160 bit SHA-1 truncated to 156 bit + byte[] fingerprintBlobTruncated = Arrays.copyOfRange(fingerprintBlob, 0, 156 / 8); + + // TODO: implement key stretching to minimize fp length? + + // BitSet bits = BitSet.valueOf(fingerprintBlob); // min API 19 and little endian! + BitSet bits = bitSetToByteArray(fingerprintBlobTruncated); + Log.d(Constants.TAG, "bits: " + bits.toString()); + + final int CHUNK_SIZE = 13; + final int LAST_CHUNK_INDEX = fingerprintBlobTruncated.length * 8 / CHUNK_SIZE; // 12 + Log.d(Constants.TAG, "LAST_CHUNK_INDEX: " + LAST_CHUNK_INDEX); + + int from = 0; + int to = CHUNK_SIZE; + for (int i = 0; i < (LAST_CHUNK_INDEX + 1); i++) { + Log.d(Constants.TAG, "from: " + from + " to: " + to); + + BitSet setIndex = bits.get(from, to); + int wordIndex = (int) bitSetToLong(setIndex); + // int wordIndex = (int) setIndex.toLongArray()[0]; // min API 19 + + fingerprint += words.get(wordIndex); + + if (i != LAST_CHUNK_INDEX) { + // line break every 3 words + if (to % (CHUNK_SIZE * 3) == 0) { + fingerprint += "\n"; + } else { + fingerprint += " "; + } + } + + from = to; + to += CHUNK_SIZE; + } + + return fingerprint; + } + + /** + * Returns a BitSet containing the values in bytes. + * BIG ENDIAN! + */ + private static BitSet bitSetToByteArray(byte[] bytes) { + int arrayLength = bytes.length * 8; + BitSet bits = new BitSet(); + + for (int i = 0; i < arrayLength; i++) { + if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) { + bits.set(i); + } + } + return bits; + } + + private static long bitSetToLong(BitSet bits) { + long value = 0L; + for (int i = 0; i < bits.length(); ++i) { + value += bits.get(i) ? (1L << i) : 0L; + } + return value; + } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java index 552fa34c0..d9bc08268 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java @@ -33,12 +33,14 @@ import android.widget.TextView; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; +import org.sufficientlysecure.keychain.experimental.SentenceConfirm; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.ui.util.ExperimentalWordConfirm; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.util.Log; +import java.io.IOException; + public class CertifyFingerprintFragment extends LoaderFragment implements LoaderManager.LoaderCallbacks { @@ -180,9 +182,16 @@ public class CertifyFingerprintFragment extends LoaderFragment implements } private void displayWordConfirm(byte[] fingerprintBlob) { - String fingerprint = ExperimentalWordConfirm.getWords(getActivity(), fingerprintBlob); +// String fingerprint = ExperimentalWordConfirm.getWords(getActivity(), fingerprintBlob); + + String fingerprint; + try { + fingerprint = new SentenceConfirm(getActivity()).fromBytes(fingerprintBlob, 16); + } catch (IOException ioe) { + fingerprint = "-"; + } - mFingerprint.setTextSize(24); + mFingerprint.setTextSize(18); mFingerprint.setTypeface(Typeface.DEFAULT, Typeface.BOLD); mFingerprint.setText(fingerprint); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ExperimentalWordConfirm.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ExperimentalWordConfirm.java deleted file mode 100644 index 43ccac24f..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ExperimentalWordConfirm.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2015 Dominik Schürmann - * - * 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 . - */ - -package org.sufficientlysecure.keychain.ui.util; - -import android.content.Context; - -import org.spongycastle.util.Arrays; -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.util.Log; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.BitSet; - -public class ExperimentalWordConfirm { - - public static String getWords(Context context, byte[] fingerprintBlob) { - ArrayList words = new ArrayList<>(); - - BufferedReader reader = null; - try { - reader = new BufferedReader(new InputStreamReader( - context.getAssets().open("word_confirm_list.txt"), - "UTF-8" - )); - - String line = reader.readLine(); - while (line != null) { - words.add(line); - - line = reader.readLine(); - } - } catch (IOException e) { - throw new RuntimeException("IOException", e); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException ignored) { - } - } - } - - String fingerprint = ""; - - // NOTE: 160 bit SHA-1 truncated to 156 bit - byte[] fingerprintBlobTruncated = Arrays.copyOfRange(fingerprintBlob, 0, 156 / 8); - - // TODO: implement key stretching to minimize fp length? - - // BitSet bits = BitSet.valueOf(fingerprintBlob); // min API 19 and little endian! - BitSet bits = bitSetToByteArray(fingerprintBlobTruncated); - Log.d(Constants.TAG, "bits: " + bits.toString()); - - final int CHUNK_SIZE = 13; - final int LAST_CHUNK_INDEX = fingerprintBlobTruncated.length * 8 / CHUNK_SIZE; // 12 - Log.d(Constants.TAG, "LAST_CHUNK_INDEX: " + LAST_CHUNK_INDEX); - - int from = 0; - int to = CHUNK_SIZE; - for (int i = 0; i < (LAST_CHUNK_INDEX + 1); i++) { - Log.d(Constants.TAG, "from: " + from + " to: " + to); - - BitSet setIndex = bits.get(from, to); - int wordIndex = (int) bitSetToLong(setIndex); - // int wordIndex = (int) setIndex.toLongArray()[0]; // min API 19 - - fingerprint += words.get(wordIndex); - - if (i != LAST_CHUNK_INDEX) { - // line break every 3 words - if (to % (CHUNK_SIZE * 3) == 0) { - fingerprint += "\n"; - } else { - fingerprint += " "; - } - } - - from = to; - to += CHUNK_SIZE; - } - - return fingerprint; - } - - /** - * Returns a BitSet containing the values in bytes. - * BIG ENDIAN! - */ - private static BitSet bitSetToByteArray(byte[] bytes) { - int arrayLength = bytes.length * 8; - BitSet bits = new BitSet(); - - for (int i = 0; i < arrayLength; i++) { - if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) { - bits.set(i); - } - } - return bits; - } - - private static long bitSetToLong(BitSet bits) { - long value = 0L; - for (int i = 0; i < bits.length(); ++i) { - value += bits.get(i) ? (1L << i) : 0L; - } - return value; - } -} diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_adjectives b/OpenKeychain/src/main/res/raw/fp_sentence_adjectives new file mode 100644 index 000000000..cf8fa4674 --- /dev/null +++ b/OpenKeychain/src/main/res/raw/fp_sentence_adjectives @@ -0,0 +1,128 @@ +able +angry +bad +bent +bitter +black +blue +boiling +bright +broken +brown +certain +cheap +clean +clear +cold +common +complex +cruel +dark +dead +dear +deep +dirty +dry +early +elastic +equal +false +fat +feeble +female +fertile +first +fixed +flat +foolish +free +full +future +general +good +great +green +grey +hanging +happy +hard +healthy +high +hollow +kind +last +late +lazy +left +like +living +long +loose +loud +low +male +married +medical +mixed +narrow +natural +new +normal +old +open +past +poor +present +pretty +private +public +quick +quiet +ready +rare +red +regular +right +rough +round +sad +safe +same +second +secret +serious +sharp +short +shut +sick +simple +slow +small +smooth +soft +solid +sour +special +sticky +stiff +strange +strong +sudden +sweet +tall +thick +thin +tight +tired +true +unknown +violent +waiting +warm +wet +white +wide +wise +wrong +yellow +young diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_adverbs b/OpenKeychain/src/main/res/raw/fp_sentence_adverbs new file mode 100644 index 000000000..1d6002387 --- /dev/null +++ b/OpenKeychain/src/main/res/raw/fp_sentence_adverbs @@ -0,0 +1,64 @@ +ably +angrily +badly +bitterly +brightly +brokenly +cheaply +clearly +coldly +commonly +cruelly +darkly +dearly +deeply +drily +equally +falsely +feebly +fixedly +flatly +freely +fully +greatly +happily +hardly +kindly +lately +lazily +loosely +loudly +narrowly +newly +normally +openly +poorly +prettily +publicly +quickly +quietly +readily +rarely +roughly +sadly +safely +secretly +sharply +simply +slowly +smoothly +softly +solidly +sourly +stiffly +strongly +suddenly +sweetly +thickly +thinly +tightly +tiredly +truly +warmly +widely +wisely diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_articles b/OpenKeychain/src/main/res/raw/fp_sentence_articles new file mode 100644 index 000000000..0604b3d07 --- /dev/null +++ b/OpenKeychain/src/main/res/raw/fp_sentence_articles @@ -0,0 +1,8 @@ +her +his +my +our +that +the +this +your diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_nouns b/OpenKeychain/src/main/res/raw/fp_sentence_nouns new file mode 100644 index 000000000..ed4099c31 --- /dev/null +++ b/OpenKeychain/src/main/res/raw/fp_sentence_nouns @@ -0,0 +1,512 @@ +account +air +amount +angle +animal +answer +ant +apple +arch +arm +army +attack +attempt +baby +back +bag +ball +band +base +basin +basket +bath +bed +bee +belief +bell +berry +bird +birth +bite +blade +blood +blow +board +boat +body +bone +book +boot +bottle +box +boy +brain +brake +branch +bread +breath +brick +bridge +brother +brush +bucket +bulb +burn +butter +button +cake +camera +canvas +car +card +cat +cause +chain +chalk +chance +change +cheese +chest +chin +church +circle +clock +cloth +cloud +coal +coat +collar +colour +comb +comfort +company +control +cook +copper +copy +cord +cork +cotton +cough +country +cover +cow +crack +credit +crime +crush +cry +cup +current +curtain +curve +cushion +damage +danger +day +debt +degree +design +desire +detail +disease +disgust +dog +door +doubt +drain +drawer +dress +drink +drop +dust +ear +earth +edge +effect +egg +end +engine +error +event +example +expert +eye +face +fact +fall +family +farm +father +fear +feather +feeling +fiction +field +fight +finger +fire +fish +flag +flame +flight +floor +flower +fly +fold +food +foot +force +fork +form +fowl +frame +friend +front +fruit +garden +girl +glass +glove +goat +gold +grain +grass +grip +group +growth +guide +gun +hair +hammer +hand +harbour +harmony +hat +hate +head +heart +heat +history +hole +hook +hope +horn +horse +hour +house +humour +ice +idea +impulse +ink +insect +iron +island +jelly +jewel +join +journey +judge +jump +kettle +key +kick +kiss +knee +knife +knot +land +laugh +law +lead +leaf +leather +leg +letter +level +library +lift +light +limit +line +linen +lip +liquid +list +lock +look +loss +love +machine +man +manager +map +mark +market +mass +match +meal +measure +meat +meeting +memory +metal +middle +milk +mind +mine +minute +mist +money +monkey +month +moon +morning +mother +motion +mouth +move +muscle +music +nail +name +nation +neck +need +needle +nerve +net +news +night +noise +nose +note +number +nut +offer +office +oil +opinion +orange +order +oven +owner +page +pain +paint +paper +parcel +part +paste +payment +peace +pen +pencil +person +picture +pig +pin +pipe +place +plane +plant +plate +play +plough +pocket +point +poison +polish +porter +pot +potato +powder +power +price +print +prison +process +produce +profit +prose +protest +pull +pump +purpose +push +quality +rail +rain +range +rat +rate +ray +reason +receipt +record +regret +request +respect +rest +reward +rhythm +rice +ring +river +road +rod +roll +roof +room +root +rub +rule +run +sail +salt +sand +scale +school +science +screw +sea +seat +seed +self +sense +servant +sex +shade +shake +shame +sheep +shelf +ship +shirt +shock +shoe +side +sign +silk +silver +sister +size +skin +skirt +sky +sleep +slip +slope +smash +smell +smile +smoke +snake +sneeze +snow +soap +society +sock +son +song +sort +sound +soup +space +spade +sponge +spoon +spring +square +stage +stamp +star +start +station +steam +steel +stem +step +stick +stitch +stomach +stone +stop +store +story +street +stretch +sugar +summer +sun +support +swim +system +table +tail +talk +taste +tax +test +theory +thing +thought +thread +throat +thumb +thunder +ticket +time +tin +toe +tongue +tooth +top +touch +town +trade +train +tray +tree +trick +trouble +turn +twist +unit +value +verse +vessel +view +voice +walk +wall +war +wash +waste +watch +water +wave +wax +way +weather +week +weight +wheel +whip +whistle +wind +window +wine +wing +winter +wire +woman +wood +wool +word +work +worm +wound +writing +year diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_prepositions b/OpenKeychain/src/main/res/raw/fp_sentence_prepositions new file mode 100644 index 000000000..fb8206636 --- /dev/null +++ b/OpenKeychain/src/main/res/raw/fp_sentence_prepositions @@ -0,0 +1,32 @@ +above +across +after +against +along +among +around +at +before +behind +below +beneath +beside +between +beyond +by +from +in +inside +into +near +on +outside +over +past +round +through +to +towards +under +upon +with diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_verbs_i b/OpenKeychain/src/main/res/raw/fp_sentence_verbs_i new file mode 100644 index 000000000..57602bf17 --- /dev/null +++ b/OpenKeychain/src/main/res/raw/fp_sentence_verbs_i @@ -0,0 +1,128 @@ +agrees +allows +answers +arrives +asks +is +becomes +begins +believes +brings +burns +buys +calls +changes +chooses +cleans +closes +comes +compares +continues +cooks +costs +counts +cries +cuts +dances +decides +describes +destroys +dies +does +drinks +drives +eats +ends +explains +falls +feels +fights +fills +finds +finishes +forgets +forgives +gets +gives +goes +grows +hates +has +hears +helps +hides +holds +hurts +improves +jumps +keeps +kills +knows +laughs +learns +leaves +lets +lies +listens +lives +looks +loses +loves +makes +meets +moves +needs +occurs +offers +opens +pays +plays +prefers +prepares +presses +promises +pulls +pushes +puts +reads +receives +remembers +repeats +rests +returns +runs +sees +sells +sends +shouts +shows +sings +sits +sleeps +smiles +speaks +starts +stays +stops +studies +suggests +supports +takes +talks +teaches +tells +thinks +throws +touches +travels +treats +tries +turns +uses +visits +walks +wants +washes +wins +works +writes diff --git a/OpenKeychain/src/main/res/raw/fp_sentence_verbs_t b/OpenKeychain/src/main/res/raw/fp_sentence_verbs_t new file mode 100644 index 000000000..36078bc78 --- /dev/null +++ b/OpenKeychain/src/main/res/raw/fp_sentence_verbs_t @@ -0,0 +1,128 @@ +agrees with +allows +answers +arrives at +asks +is +becomes +begins +believes +brings +burns +buys +calls +changes +chooses +cleans +closes +comes to +compares +continues +cooks +costs +counts +cries for +cuts +dances with +decides on +describes +destroys +dies for +does +drinks +drives +eats +ends +explains +falls on +feels +fights +fills +finds +finishes +forgets +forgives +gets +gives +goes to +grows +hates +has +hears +helps +hides +holds +hurts +improves +jumps over +keeps +kills +knows +laughs at +learns +leaves +lets +lies to +listens to +lives with +looks at +loses +loves +makes +meets +moves +needs +occurs to +offers +opens +pays +plays +prefers +prepares +presses +promises +pulls +pushes +puts +reads +receives +remembers +repeats +rests by +returns +runs to +sees +sells +sends +shouts at +shows +sings to +sits by +sleeps by +smiles at +speaks to +starts +stays with +stops +studies +suggests +supports +takes +talks to +teaches +tells +thinks of +throws +touches +travels to +treats +tries +turns +uses +visits +walks to +wants +washes +wins +works for +writes to diff --git a/OpenKeychain/src/main/res/raw/fp_word_list b/OpenKeychain/src/main/res/raw/fp_word_list new file mode 100644 index 000000000..080c7ce81 --- /dev/null +++ b/OpenKeychain/src/main/res/raw/fp_word_list @@ -0,0 +1,12032 @@ +you +the +a +and +that +what +this +for +your +have +don +are +not +was +can +know +with +all +but +here +there +they +get +just +like +come +right +she +him +out +now +one +about +how +want +got +her +will +well +see +good +let +yes +think +who +why +yeah +did +from +his +when +going +man +take +where +time +them +back +look +would +say +were +been +then +had +tell +some +our +okay +too +down +could +hey +never +way +very +more +really +has +make +over +please +only +love +give +little +need +people +off +two +said +sorry +thank +sir +should +mean +any +much +sure +even +doing +must +these +thing +help +god +day +first +won +life +again +away +stop +wait +night +find +into +work +still +put +home +call +before +better +their +other +talk +after +maybe +great +than +those +always +long +money +old +leave +keep +new +told +things +name +last +father +around +years +does +hello +ever +place +big +nice +feel +girl +stay +thanks +made +mother +listen +three +may +guy +hear +coming +world +enough +left +fine +every +house +course +done +boy +wrong +bad +which +woman +lot +kind +wanted +guys +came +ask +son +today +show +own +care +mind +try +being +same +car +might +dad +miss +else +many +men +friend +baby +next +move +huh +live +hold +real +saw +went +seen +room +best +found +wife +job +once +such +matter +head +most +heard +alone +ready +haven +happy +days +run +play +door +bring +mom +myself +open +yet +trying +knew +whole +meet +excuse +family +used +while +use +start +took +pretty +gone +called +idea +since +watch +turn +hope +year +guess +end +sit +hard +says +hand +bit +school +both +worry +minute +true +face +soon +lost +forget +bye +young +five +killed +heart +few +wants +later +eat +drink +ago +shut +pay +police +each +water +anyone +dear +also +shall +looks +saying +until +crazy +late +phone +eyes +easy +sleep +mine +afraid +doctor +nobody +four +under +second +music +change +far +hands +kids +knows +hit +case +its +gave +read +times +speak +anyway +stand +part +wish +word +having +cut +stuff +comes +war +number +happen +hurry +quite +rest +close +check +inside +hurt +half +moment +girls +makes +lady +women +asked +set +boys +taking +story +town +chance +child +yours +lord +point +deal +sister +goes +party +week +walk +means +honey +dog +shot +high +bed +game +person +body +break +free +making +side +fun +almost +buy +least +truth +six +along +met +city +behind +send +though +hours +blood +light +stupid +gets +funny +ahead +answer +full +line +front +hate +white +poor +hot +order +reason +king +tried +seems +either +couple +trust +months +alive +hour +pick +able +save +clear +office +john +become +book +living +food +daddy +cool +dance +red +news +lose +cold +touch +power +scared +boss +fact +dinner +jack +master +uncle +small +quiet +write +taken +ten +luck +sent +cannot +air +earth +glad +law +till +needs +dream +street +drive +hair +sort +others +bet +lives +follow +whoa +fast +sweet +sound +catch +words +human +safe +hang +beat +rather +top +plan +seem +known +coffee +ladies +wow +lucky +win +past +calm +pull +lie +sign +return +fall +team +longer +kiss +asking +tired +feet +learn +drop +quick +wake +marry +train +throw +loved +road +sounds +land +felt +step +eye +piece +weeks +secret +sense +takes +pass +voice +clean +looked +wonder +song +fault +state +seven +born +less +film +ride +joe +class +act +none +given +fool +early +worth +ones +future +strong +army +mouth +moving +george +frank +sing +sun +chief +worked +horse +report +sell +turned +dark +peace +month +movie +lovely +boat +blue +seeing +hotel +eight +york +ship +rock +sam +age +christ +murder +finish +letter +court +works +swear +expect +bill +giving +near +worse +busy +pain +kept +ball +floor +laughs +wear +sea +fly +count +gold +forgot +radio +french +caught +short +soul +figure +paid +simple +bag +tom +fish +date +rich +paul +broke +miles +during +ring +choice +bank +david +relax +except +attack +join +table +across +mary +paper +star +dude +stick +meant +round +honor +fair +hungry +middle +thinks +buddy +lying +unless +spend +major +charge +needed +deep +hide +handle +bought +key +cry +trip +lead +window +enjoy +system +sake +fell +cover +ran +church +carry +tea +smart +force +teach +paris +box +holy +often +plane +dress +lunch +smell +third +ground +crying +talked +ice +tough +heaven +proud +laugh +sad +sighs +lived +art +harry +mark +single +dare +group +record +wind +cops +fix +club +upon +mike +mess +quit +entire +wine +normal +visit +offer +public +missed +prison +smoke +agree +saved +river +broken +madam +weird +green +arms +evil +south +bob +wall +bar +judge +orders +seat +bear +wrote +queen +slow +cause +dreams +loves +cop +liked +north +glass +accept +cross +scene +double +share +honest +moon +joke +beer +space +jump +whose +jail +area +tree +foot +test +cat +dying +within +ought +brain +nine +peter +field +bother +bus +lots +doubt +camera +became +german +books +gives +shoes +truck +ben +kick +card +cash +push +moved +likes +calls +cute +max +park +store +grow +owe +aunt +reach +guard +spent +summer +rules +duty +island +johnny +eating +smile +silly +san +folks +knock +pardon +crowd +henry +beg +stuck +action +upset +begin +prove +feels +grand +using +guns +legs +nose +rid +mum +list +sky +shop +arm +escape +mommy +gas +low +jimmy +self +hat +ray +bell +price +cell +rain +warm +west +passed +board +london +nor +lawyer +lay +closed +gift +favor +tony +jim +empty +prince +papa +suit +press +asleep +type +grab +spirit +arrest +papers +band +indeed +pop +played +dogs +agent +above +wild +nick +race +mrs +spot +fellow +whom +leg +awful +killer +fit +aye +beauty +twenty +bird +named +lock +blame +heavy +choose +allow +twice +magic +waste +plenty +raise +flying +notice +gasps +doc +decide +taste +flight +picked +billy +fresh +cost +nature +hero +james +places +planet +search +battle +steal +lights +neck +mate +hardly +sold +study +famous +simply +keys +memory +names +worst +throat +guilty +ways +shame +stone +bottle +states +mister +pray +bunch +camp +starts +seemed +form +stars +stage +animal +roll +east +faster +locked +van +final +apart +match +admit +tight +engine +build +treat +sight +closer +huge +beach +bigger +keeps +stole +united +among +hall +danger +itself +cup +milk +fired +pants +built +lies +cousin +steve +main +cook +meat +ill +angel +risk +plans +tape +taught +sword +extra +corner +beyond +hiding +belong +sarah +wash +drugs +cars +skin +large +leaves +driver +health +ugly +helped +note +bridge +martin +rose +pig +acting +horses +level +nuts +sunday +track +plays +anna +heads +walked +strike +rule +turns +common +madame +grunts +roger +losing +weil +speed +tells +due +serve +teeth +began +lee +shirt +rings +robert +spoke +size +feed +held +bobby +coach +dry +pack +ideas +grace +prefer +bottom +movies +view +breath +ticket +energy +code +hurts +cheers +remain +pal +usual +groans +showed +weapon +brown +center +coat +ours +copy +market +jerry +noise +birds +fill +advice +rome +cream +ghost +exist +oil +jake +tie +leader +draw +loud +lift +nearly +post +travel +surely +bread +cards +older +heat +games +crew +cake +bucks +pity +brave +chair +gotten +bless +wet +priest +shows +thy +agreed +truly +gate +nurse +paying +slowly +thou +local +style +soft +spring +grown +pieces +dig +shake +settle +maria +ends +larry +lonely +garden +stayed +enter +weak +fate +split +flat +proof +jane +loose +gang +trial +speaks +afford +snow +bright +trees +friday +guest +ears +santa +career +threw +color +bodies +mayor +manage +victim +finger +opened +roof +file +lake +plus +sees +spare +farm +rent +repeat +sugar +alarm +winter +insane +base +total +stops +thief +hill +fancy +stolen +female +tongue +sooner +liar +target +joy +mail +client +easier +cheap +brings +pulled +doors +credit +lines +harm +castle +male +birth +spread +storm +arthur +paint +slept +lover +hoping +bath +cares +taxi +trade +lately +video +weight +thomas +lied +square +tears +march +block +thee +eggs +onto +forest +europe +pool +tiny +jean +super +walter +nights +pete +signal +signed +rat +mercy +yellow +dan +desk +shower +simon +scare +regret +remind +swim +merry +pocket +path +ended +speech +aware +drinks +pair +ocean +waited +page +andy +runs +rise +fake +amen +ate +pure +bullet +photo +social +genius +desert +forced +player +grave +map +staff +vote +headed +easily +monkey +rough +create +scott +wise +harder +guests +sudden +silver +higher +fought +pounds +fixed +add +lower +desire +bro +failed +monday +louis +badly +below +clock +member +piano +lesson +kate +gods +rush +lips +unit +tall +safety +fred +adam +season +points +thirty +odd +wood +clever +royal +parts +artist +suffer +dawn +rights +grew +union +nation +theory +mood +filled +soup +model +hung +period +opens +ear +golden +hearts +cheese +plant +proper +shape +ruin +legal +faces +ruined +issue +refuse +per +bride +awake +cow +load +forces +smith +based +grant +woods +scream +freak +temple +decent +hidden +joking +arrive +sin +jacket +invite +boring +bang +wolf +mirror +lucy +dies +alice +walls +annie +saint +avoid +bike +carl +sat +talent +fifty +chest +buying +tear +jobs +guards +image +indian +finds +brian +trap +burned +eve +shock +iron +wide +marie +hunt +poison +flower +anne +bones +matt +dollar +rooms +owner +brains +glory +cab +riding +meal +freeze +damned +candy +shots +raised +tower +stood +bravo +dust +alan +warn +toast +virgin +bags +appear +caused +pride +switch +pilot +damage +helen +led +loving +rice +knees +coast +songs +babies +duke +silent +tour +sons +daniel +fourth +actor +victor +armed +moves +palace +troops +rate +writer +hired +junior +phil +amount +false +affair +rob +susan +falls +tied +bull +fallen +saving +snake +loss +mighty +youth +smells +lab +border +kicked +cast +drove +rescue +sharp +zero +borrow +humans +eric +flesh +row +jason +modern +score +pills +gee +studio +fail +tip +defend +eaten +steps +cases +climb +role +event +egg +joey +effect +seek +chase +wave +houses +blows +rocks +stairs +rope +dragon +bow +winner +barely +aboard +hated +mass +grade +leo +aside +bone +wire +ted +yard +button +jews +plate +dump +tail +bored +salt +metal +talks +sand +joseph +films +fruit +gosh +claim +goal +penny +clears +shadow +firm +powers +rachel +prime +punch +wishes +non +steady +tiger +giant +edge +woke +chuck +loser +assume +behave +direct +jones +blew +pen +chose +wheel +drag +sexual +maid +county +chick +remove +jenny +nope +spell +terms +focus +stock +valley +duck +chosen +likely +wound +object +sale +spoken +buck +mummy +tank +pie +notes +shout +guts +bound +scary +hop +value +slip +result +amy +los +photos +shine +mostly +rare +hitler +witch +served +texas +jury +intend +wings +albert +kinds +com +pink +cruel +bury +doll +terry +facts +range +brand +shy +kong +screen +rabbit +apple +swing +prize +marks +deeply +laws +wing +mile +coward +site +thus +closes +june +mixed +earn +hong +rude +begins +linda +kitty +curse +chain +cure +spy +noble +juice +source +circle +plain +sue +ann +twelve +rotten +lad +thrown +minds +grass +kelly +kissed +squad +jungle +bond +effort +series +expert +filthy +belt +edward +lets +thin +berlin +commit +boots +punk +stands +cheer +sheep +guitar +access +ships +bust +flag +panic +pizza +morgan +deny +sally +ali +bush +asks +deck +tokyo +term +hunter +former +tim +insist +estate +martha +assure +hates +navy +debt +fever +luke +joined +reward +karen +ease +fetch +garage +jumped +signs +shoe +threat +zone +solve +title +policy +ages +crown +leads +lion +hire +guide +bay +demand +trash +tone +vision +supper +voices +hip +route +lack +port +cats +dozen +dirt +helps +media +bruce +puts +exact +secure +stays +april +lousy +deaf +caesar +rip +fox +urgent +maggie +russia +tricks +mask +gather +warned +betty +highly +useful +tires +forty +gentle +suits +carter +jesse +solid +wipe +launch +emily +hank +sweat +steel +tests +alert +fifth +script +lend +costs +toward +aim +latest +tune +agency +sacred +empire +events +vice +argue +rick +vegas +mental +loaded +anger +clark +breaks +sonny +museum +tax +miller +flash +pushed +data +dean +lily +gray +brad +sports +pierre +senior +roman +reckon +singer +cap +stones +firing +handed +beside +walks +daily +fully +clue +wilson +souls +kills +banks +circus +shift +clouds +closet +hits +forth +jackie +prayer +loan +fools +fields +trace +civil +orange +wayne +carol +nerve +outfit +degree +flies +andrew +bills +cheat +idiots +chat +ending +noon +cabin +detail +hug +planes +ghosts +hills +alien +pigs +mix +hail +supply +struck +bat +files +cents +sides +opera +bug +jokes +angels +design +ken +pour +cave +gear +dating +beaten +herr +legend +nephew +belly +dancer +thick +ignore +fuel +pat +cried +lane +ellen +bowl +butter +bombs +francs +net +wasted +defeat +bars +bells +toy +sport +wallet +trunk +homes +wore +coke +ouch +obey +fort +norman +trail +league +shore +task +doug +wins +rats +motion +blast +mouse +merely +lads +busted +anti +monk +wives +agents +seats +inform +waves +gary +moscow +accent +beings +attend +shown +josh +robin +tunnel +drew +recall +drank +greek +poetry +swell +knight +earl +units +chill +harold +mars +holes +jay +rifle +bishop +beth +robbed +hoped +fond +rocky +unique +goods +pound +louise +crush +nancy +golf +fence +woo +patrol +sire +resist +stan +cloud +habit +pays +blown +von +lovers +novel +august +wagon +packed +widow +boo +siren +ruth +exit +beef +exists +tracks +bud +actors +nail +ugh +skip +july +passes +crisis +sins +washed +sink +sail +dough +baron +pet +wicked +flow +halt +aid +charm +cattle +owns +worker +hood +nerves +jam +purse +smooth +divine +seal +hopes +chop +heroes +equal +virus +sec +gates +powder +mickey +mud +wrap +sang +beeps +begun +couch +flew +jacob +skills +arts +lewis +tries +print +pole +ward +theme +fans +soap +string +farmer +kung +gain +poem +issues +inch +greg +teddy +burns +polish +beats +chef +frozen +pro +yell +waters +device +davis +bend +basic +slap +earned +cowboy +boston +wee +praise +cable +moral +permit +behalf +messed +plants +knee +holds +clown +shouts +placed +worthy +cinema +cage +finest +waiter +junk +strip +guilt +buzz +kit +deputy +granny +hers +shark +eagle +poet +oscar +cliff +boats +tyler +counts +parker +holmes +softly +snap +sets +nina +bail +beard +hut +yen +tale +heck +chip +crimes +steven +bitter +juan +uses +hid +eleven +scoffs +mount +dealer +limit +liquor +sauce +miami +odds +combat +baker +corn +images +cries +yards +shed +insult +pitch +beans +salad +corpse +gym +lazy +nearby +landed +roses +goat +foul +beep +meters +yells +acts +frame +cancel +link +pin +daisy +absurd +slaves +hammer +admire +tastes +benny +motor +boxes +gifts +ace +loyal +cities +blonde +punish +clan +native +cells +dumped +skull +stroke +fights +pearl +avenue +tooth +timing +rocket +grief +brush +sucker +chicks +alley +dennis +judy +brief +robot +angle +ail +mobile +drives +sends +pope +status +profit +wounds +actual +nut +tent +host +barn +stress +broad +chips +sack +cooper +stink +oxygen +raped +ranch +whip +coughs +labor +relief +soviet +wars +oliver +blade +upper +sings +scale +alike +drown +spoil +salary +jazz +harris +palm +fleet +pump +unable +clinic +sailor +horror +eats +clay +forms +stinks +dame +jet +polite +deeper +dishes +blah +drama +minor +editor +wheels +roads +ford +sandy +humble +throne +backup +shave +sore +driven +pit +socks +bunny +delay +colors +sneak +sung +rub +tap +walker +vodka +diet +wisdom +ripped +holly +statue +louder +tracy +grows +gently +manner +recent +groups +spin +ralph +lamb +humor +pages +anyhow +pale +pile +grey +sid +jan +khan +chaos +soda +fits +claims +jersey +apply +kisses +skinny +torn +cotton +kings +champ +burnt +spider +twins +gloves +bears +dutch +misery +facing +sales +pan +drawn +joan +remote +exam +phones +cows +allen +brandy +cherry +diego +maya +bid +donna +toys +bee +plot +cared +parade +crane +advise +patch +dna +envy +option +hush +casino +shell +nicely +drill +twist +temper +min +steak +ham +blocks +sorrow +rear +coin +janet +ashes +clicks +format +drops +safely +wealth +jess +medal +coffin +que +goose +gloria +appeal +pill +sub +towel +slide +ups +tragic +claus +fires +leon +faced +core +motel +worn +romeo +global +rhythm +nest +soccer +fried +betray +terror +stable +liver +solar +wreck +howdy +wears +dull +checks +dish +rap +basis +unlike +kindly +fog +sticks +bugs +zoo +pulse +lamp +taxes +abroad +dates +burden +oath +award +marine +felix +tools +rusty +irish +cooked +rising +rubber +hunger +scenes +faint +cellar +troy +item +niece +sarge +badge +frog +smash +shove +sunny +toes +sixth +reveal +tennis +mob +gene +proved +poker +nails +ram +symbol +pork +inner +makeup +fanny +bits +soil +vain +sum +hatred +kenny +scout +boot +album +buddha +senses +tender +plates +lap +deadly +tanks +entry +puppy +watson +warren +shared +tin +philip +warden +inches +rosa +fuss +stiff +folk +cent +asses +cart +liz +scotch +tend +pistol +del +cookie +flip +bucket +booze +inn +math +tons +acted +bets +bare +vast +crawl +ruby +forbid +owned +sis +basket +rank +branch +active +depend +eyed +chi +lit +gum +barrel +drum +sheets +connie +stare +potato +causes +needle +darn +heal +wished +muscle +cuts +rage +raid +leak +blank +breast +flame +feast +sorts +unfair +areas +chap +porter +tense +tire +marked +fooled +neat +nelson +duties +impact +ideal +diary +steam +text +rumors +limits +bait +fist +carpet +dining +safer +toe +teams +burst +bore +fame +lean +review +rounds +bureau +foster +jewels +horns +sobs +trains +dime +pre +raw +cursed +lick +donkey +method +sits +bump +worm +silk +hooked +rod +upside +sealed +alpha +comedy +dong +prints +retire +lands +tattoo +weed +worlds +donald +sample +column +suite +skirt +bingo +hears +skies +sheet +denied +apples +korea +alfred +ladder +booth +ding +plague +phase +sunset +mason +trucks +snakes +toss +fridge +unto +pops +danced +racing +brick +region +growls +gal +picnic +clerk +rio +mall +sleepy +psycho +mere +yang +scar +sober +sweep +handy +root +budget +shirts +cigar +whale +height +log +wolves +drawer +creep +spite +rot +graham +drums +boxing +harbor +las +tomb +repair +fund +writes +stuart +collar +lemon +villa +affect +brakes +purple +tapes +tube +solved +murphy +radar +error +coal +cease +mortal +cannon +tag +demons +winds +shield +fears +turner +motive +sleeps +locker +laying +fairly +oldest +deaths +rode +breeze +korean +seated +click +sylvia +heels +adults +subway +pigeon +swore +fee +minus +deed +thumb +dizzy +blues +grip +dale +prom +pepper +skill +ballet +beds +candle +slight +vital +plug +elder +flames +types +homer +groom +reply +hon +fur +sixty +melody +pillow +outer +stream +clubs +bald +loses +beware +diana +quote +hath +spots +sirens +dreamt +era +copies +fry +tub +ana +sector +chess +nanny +dummy +belief +added +wizard +lance +rang +tables +aliens +booked +walt +bench +whores +owes +stab +cathy +dial +mill +edgar +creepy +irene +doubts +acid +lungs +vera +chorus +author +visual +adore +arrow +barks +helmet +random +deer +larger +ling +tribe +deals +blond +parent +tide +gig +bold +sakes +seed +severe +nap +hatch +twin +fixing +moans +lip +prices +gossip +cruise +triple +hawk +hockey +chains +parked +debts +meets +lame +maniac +brat +wang +greedy +bacon +bleed +tarzan +dug +galaxy +chased +depth +rumor +mid +ape +pencil +lions +flood +jolly +cargo +hats +beam +banana +vault +cheek +jill +phoned +turtle +ginger +rely +beers +coma +corps +elvis +formed +cured +bloom +narrow +serial +heir +cough +aha +greet +gamble +organ +losers +react +judges +sandra +levels +backs +rolls +naive +starve +income +bean +heroin +custom +wiped +easter +pirate +bass +strict +slice +ties +harsh +roast +marc +moses +slim +lobby +liquid +rivers +solo +bounce +bonus +regard +tore +madrid +length +bent +tested +chapel +meals +cloth +dice +yea +cape +lung +ton +tales +breed +tango +herd +parole +web +deeds +tool +coins +nun +kansas +den +ditch +shares +hector +venice +pub +chew +razor +hawaii +noah +whisky +comic +dallas +minded +slams +scares +brass +mines +doomed +sworn +sharks +autumn +logan +swords +swine +pace +bloke +wooden +vessel +harper +bon +drain +pond +debbie +butler +wade +bin +shrink +fled +dam +carlo +alibi +cafe +chow +smoked +models +reads +stores +rum +kent +theirs +glove +violin +behold +mon +roots +hanged +rebel +rains +rented +diane +hugo +fatal +gut +bark +menu +orphan +honks +luxury +ahem +fare +worms +rascal +formal +mouths +hah +risky +salute +nicer +peggy +riot +risks +racket +tasty +theft +swamp +yankee +voyage +saddle +serves +lawn +potter +shoots +ritual +sucked +offers +brutal +float +rarely +oven +hay +sidney +petty +waking +morris +modest +grain +injury +lester +swiss +sells +nazis +votes +debate +milan +draft +mice +savage +arabic +ransom +knives +repay +sydney +spill +wit +leaf +arnold +seas +medium +dock +proves +loudly +crow +choir +belle +tech +thats +tick +ski +ruins +weigh +rico +prey +venus +online +covers +bubble +echo +dried +wells +bandit +stove +rex +dot +flee +values +wax +mae +ducks +eager +funds +scent +hangs +scheme +romans +meter +samuel +growth +tricky +wrist +helena +franz +reed +amber +marina +asylum +creek +kneel +ash +mule +fold +kirk +nurses +noises +locate +shaw +senate +thrill +chairs +cycle +poems +jose +volume +spray +smiles +seeds +cakes +owners +sole +learnt +bully +gypsy +rays +mini +pilots +tips +phrase +rosie +begged +keen +static +spoon +vienna +disco +cane +virtue +kicks +loads +via +dated +tan +ming +mature +sofa +stir +joyce +pine +joker +fries +armor +wander +peanut +scores +picks +mafia +olive +madman +floors +awhile +logic +manual +rolled +mates +ink +voted +snack +pledge +crook +laser +bands +hamlet +races +rebels +aged +endure +mia +shade +stamp +lasted +buster +beasts +batman +brake +occur +dolly +delta +orbit +pulls +fork +campus +rig +dances +dodge +allies +hooray +hereby +wig +alas +joel +dealt +misses +maker +hobby +tails +spies +oui +devils +andre +feared +clues +pals +nickel +auto +towns +notion +flush +straw +sigh +stunt +veins +buys +maiden +whack +bonnie +kidnap +owl +rally +seize +canyon +lords +barber +abe +weep +spying +esther +shorts +wakes +phony +cans +jeep +burger +haul +myth +duel +sour +spike +throws +stall +rug +adams +robe +roars +ninety +gladly +pierce +asia +ego +tissue +ranger +sherry +karate +dudes +choke +sheila +vow +cue +allows +queens +bees +curly +shiny +camel +prior +melt +jewel +freaks +bonds +evans +anchor +zip +morgue +hotels +ruled +pose +exams +carbon +shops +pony +assist +altar +graves +jun +untie +thud +ensure +mainly +ashore +doris +jar +resign +accuse +prayed +violet +butch +copper +camps +scan +awaits +freely +offend +dip +owed +ants +hint +wired +pooh +fade +ankle +knocks +rides +stew +trips +urge +ping +attic +jaw +sweets +boil +darwin +dolls +porch +noisy +cant +eighty +sync +origin +mutual +visits +pastor +tease +dagger +caring +stereo +sniffs +rack +gown +issued +stark +hairy +proven +grades +leap +posted +items +divide +engage +plead +sting +lifted +kathy +dared +waits +baba +clumsy +wages +ropes +denver +apollo +cord +rifles +fails +diving +habits +lust +troop +puzzle +lined +ferry +filed +woody +luther +heel +jeanne +bolt +bra +label +drake +cups +tomato +shorty +colony +dove +filth +dings +tuck +ghetto +submit +torch +val +avenge +bounty +pipes +virgil +puppet +locks +mole +wires +lively +resort +waltz +joshua +dante +pursue +strain +hudson +sought +gained +recipe +austin +iris +tucker +glue +annual +jelly +hunch +mug +amazed +ridge +sissy +atomic +hence +invent +cheque +thread +erase +salmon +boxer +patty +sofia +buzzer +saints +hike +scarf +globe +usa +swan +palmer +tops +ally +comb +pains +eighth +breach +canal +rogers +runner +messy +subtle +wheat +adopt +peach +shrimp +ribs +fierce +rises +seoul +popped +fuse +banker +quest +spark +warmth +expose +shelf +peak +shaft +rupees +rash +blamed +jeans +glow +crab +jammed +sip +roar +beggar +cope +pinch +organs +hips +shaped +towers +towels +clip +pad +ninth +hugh +meg +phoebe +favors +carson +lodge +delhi +cheeks +rue +hack +feds +lasts +yacht +greed +goals +spends +hen +shook +des +masks +yuan +nailed +rider +bumped +mamma +paulo +stern +agenda +resume +armies +tasted +drift +thirst +treats +vulgar +waist +creeps +grasp +monte +heroic +slam +smiled +onions +sultan +extend +marcel +baked +tigers +shack +gaze +eden +chart +tidy +monks +codes +lyrics +rushed +hum +est +fax +shoo +vacuum +notify +bribe +mock +plea +flint +frost +clap +trauma +stoned +parrot +dozens +stray +axe +freed +calvin +refer +herb +shells +pinky +crop +paths +garlic +kin +veil +robber +whew +cracks +gasp +setup +kilos +wont +bosses +sew +fisher +reform +dearly +junkie +sock +courts +spared +intact +agony +scored +stack +oak +ohio +stain +fran +pier +liking +loosen +comet +obtain +piggy +roller +flown +refuge +traces +rag +vile +scouts +scram +reduce +eugene +exotic +dusty +peel +swept +heap +shines +pasta +versus +surf +grease +backed +clowns +shovel +cooler +fades +ambush +superb +hollow +pawn +jingle +slit +byron +moose +zeus +knots +buenos +topic +hustle +mute +metro +dash +peek +waving +etc +burial +cuban +ammo +quid +gag +smokes +keeper +factor +equals +spear +await +views +shin +sleeve +bunk +glen +arabs +naval +losses +boogie +julius +hose +millie +bushes +vanish +slower +lire +flour +miriam +bitten +pearls +scars +womb +treaty +stamps +finals +weary +stalin +lent +unite +tong +poles +spine +lucia +sadly +masses +zombie +wan +bliss +isaac +saloon +verse +reign +purely +biting +elaine +cozy +token +archer +elite +tray +steer +craft +flock +ripe +tubes +horace +coop +ant +trophy +ruler +brute +hog +lease +squeal +boiled +potion +grapes +tuna +dwarf +lounge +robots +invest +franco +rogue +taller +ranks +fluid +asian +mayday +spice +poster +liable +rail +thai +giants +hart +timer +sunk +shelly +toxic +lethal +info +alaska +nuns +adjust +parlor +sticky +prague +lang +hides +sane +rainy +dose +kidney +whoops +gutter +legacy +bake +bites +absent +lid +bricks +whites +unlock +poke +panel +gap +condom +traps +visa +tailor +linked +reject +maps +ark +buzzes +flute +diner +shaved +acres +rival +agrees +puff +banner +dixie +fees +jumps +bats +sights +daring +listed +blink +cigars +sway +vest +healed +sketch +soaked +claw +pupil +chico +casual +knot +stud +salon +fabric +skate +sheer +racist +onion +heave +enters +ale +amelia +finch +exile +spells +extent +fatty +glance +vet +flows +assets +calf +thugs +whales +realm +kitten +slick +poppy +edith +elders +filmed +medals +buyer +strap +bundle +saves +toad +cement +seduce +stroll +utter +classy +scrap +apache +hardy +yield +runway +reich +lump +limo +tow +cognac +warmer +frogs +unity +lone +whitey +define +dine +amigo +grudge +cobb +sewer +pairs +punks +newton +nicest +vase +hebrew +parish +vows +marble +savior +raft +monroe +hogan +angus +holler +preach +tab +depths +framed +arrows +mint +brace +broom +arena +splash +intent +ernest +scoop +abused +woe +ivy +noses +fright +repent +nixon +petrol +velvet +steals +fuller +gulf +probe +aisle +select +lens +pupils +legion +plaza +puerto +coats +grim +vanity +void +idle +fang +nay +psst +colt +pickup +sol +loop +lizard +skiing +sorted +layer +poured +fury +shrine +thorn +costa +trials +cola +naples +medic +motto +mal +nasa +grid +hairs +belts +shuts +sewing +stakes +goats +snaps +swap +blacks +curve +sinner +retard +videos +tenth +yummy +elbow +bombay +charts +golly +doe +pets +newly +scrub +rhyme +carrot +gangs +wagner +beck +audio +flavor +judith +morons +cradle +ruling +sniper +judas +milton +gerald +thrust +bunker +mode +slack +males +novels +coup +funky +cult +aspect +pesos +burton +wage +bluff +gifted +karma +boards +hunted +disk +willis +sloppy +wrath +rapid +buses +urban +turk +storms +riddle +mild +beau +moss +jerks +draws +judged +pause +milady +bathe +bombed +warsaw +abort +willow +seized +dexter +merci +tickle +flags +scam +chili +swat +bomber +flora +thug +tempo +decade +grove +ideals +crows +sparks +shalt +yelled +signor +jonah +blouse +numb +quack +greeks +arise +havana +richer +piglet +fruits +dares +thine +bates +ethics +alter +crowds +lotus +shakes +wager +bulls +doggy +fishy +curfew +geneva +vague +slug +ironic +lure +summon +hiring +butts +cosmic +turf +flirt +semi +hound +sahib +pint +wretch +seldom +loot +mozart +partly +claws +wool +woof +clive +thighs +doth +sites +trout +packs +noted +hotter +caviar +eldest +banned +jasper +norma +dim +mills +chilly +fuzzy +hurrah +gibson +beaver +turks +convoy +birdie +sniff +cain +dent +merlin +yale +mutt +med +bleep +resent +lace +calmly +freaky +memo +lowest +ribbon +pod +midst +wagons +dome +tackle +reef +midget +marker +relate +chalk +hayes +swift +charms +esteem +pike +weasel +dental +opium +critic +unload +heidi +ache +polo +tossed +cutter +chiefs +insect +regime +flank +barge +oxford +crank +streak +lex +gong +basil +crabs +samba +aiming +gale +fiddle +limp +marian +risked +fiance +holden +shaggy +hitch +aires +moi +invade +wits +stitch +cuckoo +coco +pow +expand +tipped +osaka +peas +rags +peep +amazon +shifts +gospel +voting +mare +finn +parks +bun +infant +curry +crops +buckle +trim +plum +marsh +mop +scope +idol +cuffs +paddy +sailed +cobra +macho +sinned +forged +sails +toll +chaps +mining +rehab +merit +flea +dandy +traded +kyoto +reader +fists +crooks +rates +bind +reborn +grind +stinky +thesis +haste +crib +stocks +blades +damp +hating +munich +amuse +warp +sly +gloomy +atom +anders +awards +spa +mixing +undo +thumbs +rookie +sweaty +marge +blunt +grill +verify +haired +chimes +crews +pasha +canvas +recite +weighs +geek +mist +wales +padre +stated +brooks +wesley +purity +reno +weekly +survey +bender +feeds +polar +athens +allied +valid +ronald +jock +truce +tribes +alma +tumor +madly +spooky +riches +liars +erased +para +pas +oceans +nova +bums +hag +sonar +gandhi +trusts +funk +lining +motors +fills +tummy +stash +tel +patron +hump +kite +irony +carved +tutor +tanner +traced +crowns +detect +pots +locals +perish +cloak +hast +baths +chops +spicy +caves +wed +plains +cam +pong +crude +consul +exits +bronx +juicy +morals +valve +melted +bash +zoom +farms +slips +halls +dicks +gamma +roles +mccoy +employ +cooks +arch +ole +bangs +scrape +solemn +blend +ounce +typing +toto +mein +raven +update +stool +shades +necks +lime +honors +boar +teller +grams +hare +pact +immune +sawyer +sponge +genes +heed +yank +bio +truman +yoga +apes +pins +bryan +caller +saturn +joints +cuff +adding +beta +trench +bakery +newest +wink +depart +disc +bah +fuhrer +panda +kettle +tsar +leash +gadget +abbey +dub +hull +verge +haunt +ban +gravy +buns +openly +prank +asthma +annoy +martyr +doggie +sicily +poets +knox +peg +tart +nod +helm +pest +upbeat +crate +warner +dwight +pinned +posts +icy +babes +occupy +styles +rover +squash +seals +morale +beacon +prep +cairo +czech +rests +alarms +poorly +mend +essay +pies +paws +hums +ethel +denial +bikes +rib +mao +snorts +cereal +rene +tonic +depot +eater +pip +milky +hasty +rattle +greta +pea +debris +wedded +coral +snacks +tens +fewer +ida +berry +eagles +castro +tavern +stench +syrup +donor +elf +falcon +firmly +reel +harlem +erin +yonder +shaken +summit +guru +suited +whilst +smelly +remark +loans +stages +maine +boost +spits +remedy +jockey +errand +kilo +maids +oppose +slot +bred +nevada +foods +dwell +stored +roam +laurel +hunk +hyde +viva +freud +vent +posse +occurs +squire +serge +tex +chump +hallo +morton +crappy +tying +chores +rodeo +pickle +packet +noel +tenant +echoes +paddle +stains +hoover +marx +sod +tapped +wrists +jap +amos +revs +tee +nearer +limb +laden +eddy +fading +rental +doodle +trek +seeks +defy +groove +steed +gents +creaks +jets +demo +piper +bamboo +dye +tuned +paw +moons +tyrant +tunes +guided +adapt +cork +cosmos +revoir +sermon +lisbon +kat +poetic +patsy +dread +hooks +menace +fasten +rosy +bulb +clutch +reg +raises +raging +ceo +quiz +miners +links +parted +utmost +utah +squirt +loaf +lam +lava +outlaw +donate +voodoo +lists +learns +reds +argued +beads +foam +goody +decree +hazard +uptown +batch +bosom +hicks +bases +dowry +meteor +flare +strung +adds +weirdo +saul +raja +corny +anthem +batter +aimed +groan +squid +moms +cadet +revolt +chum +greasy +meow +mat +tar +islam +raving +sow +lays +bugle +maxim +howl +herbs +cutie +aces +garcia +cetera +limbs +adolf +weaker +lice +boiler +peters +dorm +mourn +screws +docks +regain +cocoa +valet +shapes +goofy +excess +wimp +felony +siege +comics +cheeky +soy +iced +chubby +prop +muddy +reagan +taped +slate +shogun +impose +sank +rudder +sized +steep +hash +windy +grabs +froze +slash +arctic +chic +spades +crunch +stared +canned +hopper +tad +dames +nero +jinx +domain +noodle +stuffy +yin +angles +email +frau +skates +rigged +grunt +epic +choked +veer +hurray +swings +harmed +caress +convey +nobel +whoop +fling +abbot +darker +faking +sneaky +manor +puss +caps +danish +mace +daft +multi +jumbo +scales +stance +blush +touchy +apiece +banged +grub +asset +skirts +mutiny +enjoys +casper +radius +nerd +thigh +masked +copied +nosy +crust +colder +sleigh +joanne +skins +wiser +moor +flop +serum +geisha +bronze +zen +jude +fiery +undone +norm +snuck +carve +pluck +jab +par +loco +matrix +facial +legged +bled +seller +tame +pry +inmate +ridden +snitch +sands +tung +rouge +alias +abide +skunk +yahoo +relay +blaze +rained +ere +foe +coca +mosque +sap +eerie +chant +cod +bing +salty +dirk +mart +bowls +tribal +spade +awaken +flyer +dane +recess +drip +lira +dew +riots +soak +heated +tempt +stein +marcia +oregon +spears +brag +poking +teen +orion +fiend +abyss +pumps +moan +coyote +jumper +clam +broker +jaws +tread +rust +subs +unreal +witty +buffet +loony +lunar +vacant +riders +shores +litter +ramp +pup +fin +cinch +rye +lenin +gunner +mold +gays +risen +lamps +sierra +humbly +slob +slay +ripper +whim +dryer +zipper +vocal +ankles +lama +rep +elect +spaces +faded +armour +vicar +grape +sacks +wrench +squeak +rhodes +xavier +elves +jared +dense +sioux +adored +cub +genie +arc +manly +bikini +veal +cohen +palms +weaver +mink +nag +turbo +vermin +diesel +mutant +meadow +moody +geese +emerge +ultra +loft +squat +shoved +harp +okey +bumper +ahoy +adios +trunks +dairy +weave +wilt +awe +cello +jug +pits +amused +inc +flick +swam +rites +wider +flats +pros +titles +builds +moo +flap +tiring +voters +groovy +yelps +barb +sphere +ingrid +lassie +beams +baking +psych +slain +downs +lakes +hindi +hassle +hale +omen +hindu +laptop +runt +shady +grin +uneasy +forge +linen +plato +hacked +sinful +howls +bout +braces +uncles +curb +hub +lawful +dusk +nile +hippie +wails +viking +slope +cubs +aurora +bounds +omega +muffin +mules +cables +stem +diaper +baton +clocks +licked +camels +plasma +routes +farce +ludwig +pools +fags +gauge +sensed +lever +ferris +layers +brink +canoe +beetle +filter +canary +senile +mails +antony +tally +radios +snappy +mann +pluto +germs +thump +blares +rim +rested +steaks +deuce +snowy +sully +lacks +maple +cube +pep +outs +unpack +eel +geezer +crisp +faults +dost +patent +sect +grande +spank +jumpy +pumped +tends +dakota +debut +titus +rows +layout +cling +weeds +trifle +oblige +wilder +ration +dots +pens +taps +knob +eta +scold +sizes +wright +nets +jacks +digs +rake +import +brew +manu +sham +laps +woken +goon +posing +hazel +grumpy +paints +chunk +atoms +skulls +minnie +ese +hoax +gals +tents +ivory +ogre +quits +shah +fluffy +duffy +astray +dos +barren +crates +filing +lark +herald +slimy +ares +horrid +edited +cramp +sued +brats +govern +detour +shush +logs +vine +paso +carver +tinker +fowler +zurich +trans +zebra +mating +aerial +muck +notre +hawks +attach +sauna +safest +douche +gem +rubles +viper +stingy +scalp +devote +rhymes +fidel +cloudy +asap +aging +redeem +chute +mambo +nato +inhale +pastry +widows +unions +ezra +fusion +budge +sitter +gavel +ave +revive +scroll +bruise +joys +deacon +bonnet +cone +fossil +dublin +tug +wench +shaky +tram +plunge +wail +tucked +hacker +retain +homey +deb +fleas +iraqi +disney +edges +fret +notch +mayo +wept +bridal +mentor +parcel +cages +mush +polls +zodiac +liras +krauts +prizes +scarce +gears +beak +lifts +uphold +errors +folly +export +uno +taco +casket +grieve +lest +titan +bumps +biggie +bop +kimono +banjo +bows +toot +griff +clone +merger +broads +lass +napkin +sen +gao +tibet +noose +blinds +fender +finale +hymn +flaw +afar +warmed +mashed +slides +adieu +pagan +joyful +heist +bowie +paste +bummer +sirs +trance +famine +tablet +clause +pascal +maze +clarke +stale +cactus +folded +tours +din +domino +troupe +pronto +amulet +attila +olives +decay +morse +vouch +tiles +itchy +pedal +quarry +thor +grail +puck +goons +mailed +artery +props +needy +haw +rated +calmed +toots +intern +thuds +pushes +vivid +fishes +ounces +eiffel +ufo +longed +brow +bach +hooper +moth +tags +dads +labs +magnet +aching +riggs +insert +tones +buyers +aft +digest +legit +furry +defect +bumpy +sprung +leaks +climax +henrik +slater +tasks +ledge +cliffs +fours +dona +acute +crater +ordeal +giddy +marvel +wiping +suing +portal +lesser +vein +athena +heater +feeble +racial +gunnar +cawing +joins +rumble +barker +crummy +fabian +basin +hiking +finer +corky +rating +edit +aloud +tao +futile +derby +bearer +lotion +cove +hilary +lefty +whines +deploy +rubbed +cutest +laddie +venom +picky +una +snot +sneeze +bailed +crotch +aunts +arabia +capone +troll +opener +robes +verbal +overdo +emery +rubble +blanks +lenses +module +clash +sash +goof +spur +frames +blokes +rom +hounds +walkie +dung +mellow +buff +condo +valium +yogurt +cuddle +bypass +evolve +sanity +isle +labels +unseen +obeyed +verses +sage +mast +snob +ref +kosher +kisser +posh +comply +span +nutty +scoot +muller +mort +snuff +sled +extras +input +teeny +decoy +irons +timber +devour +dart +growl +aches +thorns +creed +elbows +vista +chewed +sums +marrow +voila +rite +frying +taj +jog +wiggle +tat +mecca +saucer +booing +apron +index +gabby +reset +spoilt +salsa +fudge +fences +kaiser +trot +salami +meows +pear +drying +spoils +softer +mar +floats +knack +surge +spoons +ulcer +trader +vie +jive +tofu +pecker +buffy +orchid +piles +differ +craven +pricks +hutch +staged +lambs +cons +glued +yanks +tack +hangar +neighs +mortar +oyster +shred +gram +saliva +texts +wand +cot +renew +assign +coo +acre +fay +lair +boxers +lyon +aloha +aide +onward +fitted +sliced +slogan +gallon +paces +decker +user +rugby +plank +gogh +drunks +sling +margin +raids +chord +knit +munch +myrtle +mater +salaam +delete +drone +spinal +matron +hansen +badger +greens +mantle +viola +hoist +ore +makers +thirds +kip +chug +admits +deceit +rinse +ell +stoop +slowed +comfy +lei +hisses +gender +gore +johns +adores +dire +aryan +hens +smug +haines +versa +duct +pillar +buds +swede +ins +tucson +civic +diver +bowman +oddly +speedy +iowa +hark +omaha +manure +ballad +trend +stump +refund +gorge +guides +axis +mystic +baboon +hoot +snail +faked +giggle +vale +ceased +pug +crumbs +snails +hoop +strive +unjust +mugs +offs +bolts +fiber +leaked +brawl +brook +excite +saigon +gator +homage +wholly +stomp +balboa +truths +sparky +cosmo +dumps +cheats +cupid +brig +dada +emmy +puddle +cleans +pulp +hosts +wisely +sacked +rivals +nicked +amends +expel +bribed +hugged +rave +humane +curls +muse +earns +guild +sinks +bey +taro +clamp +covert +manson +spat +gall +decks +ponies +wills +crave +helper +stung +sturdy +tights +crest +cooing +washes +absorb +tuning +holder +marsha +lowly +poe +omelet +ensign +ether +welsh +melts +polka +buggy +furs +solely +postal +grazie +curves +digger +flyers +poodle +phoney +havoc +inland +tahiti +smear +wildly +loathe +lumber +wiener +albums +spook +messes +valued +crazed +pads +stride +scot +spouse +louse +macy +gunman +pepsi +detain +render +shaman +morbid +raided +whine +demise +darned +barbed +writ +mugged +morrow +sewers +reload +neon +garret +elmer +basics +lain +saxon +dunk +safari +pager +reflex +sonic +zones +reaper +unfit +boils +notary +stormy +stag +wines +darts +kelvin +bugged +aviv +curl +accord +fig +shawl +trump +caste +gravel +popeye +mil +arson +bodily +miner +talker +peril +regent +meddle +lagoon +stings +abc +fink +rails +flaws +midday +leone +widely +dues +sordid +galley +barley +shalom +moist +champs +feat +reeves +herbal +denies +intro +joyous +jest +hun +rabble +hades +tuxedo +bribes +hulk +hostel +borne +alps +snoop +encore +upsets +hogs +quota +carton +dell +wiring +lima +burma +vortex +posed +edison +huddle +flares +mascot +garde +fluids +sedan +peer +inject +petals +reap +hugs +plow +newark +hermit +forum +saga +bulk +lacked +dodger +cavity +bogus +apt +rugged +slag +rhino +cosy +ducky +exhale +hind +fumes +payday +snarls +cecil +smoker +server +vowed +donuts +mango +floods +boyle +slum +satin +jackal +clink +grants +icon +dicky +hedge +hooves +attain +shabby +cures +spiral +clover +swears +wacky +misty +lug +tilt +unkind +rocker +dreary +gurney +rigid +exiled +boon +oasis +jacked +speeds +castor +loaned +broth +rah +ozone +rubin +bathed +frown +curses +snore +blames +trails +jell +peeled +penal +leech +mow +chimp +saudi +speck +array +foxy +slices +locket +inter +poorer +cider +smokey +shiva +triad +floss +vinci +divert +poll +orient +frenzy +airs +enlist +wham +waved +rods +holdup +cranky +hinges +swung +aids +ratio +gains +nosed +plots +clips +latter +divers +sweeps +wad +carts +nobles +unwell +timid +shun +hybrid +foxes +fern +gases +tumble +unfold +bowen +ante +tanker +tacky +sesame +peers +bursts +corral +pouch +serene +untrue +pushy +linger +sluts +frail +calves +nectar +boast +franks +cutler +surfer +ports +roofs +coy +lilies +hick +clams +malice +yawns +penn +latch +magnum +jaguar +chino +vulcan +stares +scraps +spun +whiff +spree +basque +amaze +gaius +rican +levi +rand +parson +rewind +yogi +afro +yak +delays +fulfil +goblin +aura +owning +beirut +bog +watts +spices +tailed +hearty +rabies +relic +forks +shocks +slugs +mingle +gloom +rung +herds +plugs +tactic +badges +sassy +chords +levy +bids +cubes +slows +pizzas +glide +tic +amigos +combo +oracle +sided +gen +specs +qui +timed +logo +rowing +mag +pilar +bogey +tile +healer +fatter +barred +quaint +haze +vents +pans +costly +mirage +refill +cheesy +wedge +rotate +odor +tarts +curt +rocked +mound +pious +gala +whoosh +twig +sahara +utopia +hornet +ethnic +zed +patio +jars +manic +fussy +outrun +wary +detest +naming +stout +friar +quebec +micro +goner +anew +bowels +czar +tov +cartel +taxis +imply +zulu +cluck +wasp +plano +enable +rook +spins +pinkie +hubby +dialed +carnal +judo +clans +alms +dreamy +barrow +midway +sox +hoods +crock +soften +drapes +elk +gobble +dears +hither +snort +micah +plumb +scorn +moods +gras +blasts +mammal +temp +entity +flaps +blur +sentry +dearie +merge +shreds +zap +gant +stunts +toil +owls +slab +talkie +twitch +jester +lineup +bono +edgy +gigs +wraps +vendor +tout +plaque +slums +rural +keg +gaul +cyborg +flakes +seaman +fungus +sheik +sewed +yap +thaw +pap +lemons +chills +gaming +potent +oars +bleak +heath +hearse +spurs +mayhem +dazzle +tabs +piled +strand +weaken +muzzle +typed +lorry +thrive +ballot +rink +nil +lured +rhode +hoops +sleazy +faucet +dharma +stork +irs +starry +picket +possum +gehrig +reggae +hula +tombs +doves +begs +petit +riff +mutton +gags +hive +chunks +wreath +bazaar +psyche +dipped +solace +oxen +vested +malt +disarm +rhea +meek +mormon +cedar +gent +unborn +bestow +plight +cadets +stat +urn +porky +gemma +donut +retail +peking +brunch +honky +refers +thrash +banish +sensor +flair +overly +assess +drool +icebox +holed +jiffy +output +frosty +carp +kroner +racism +clang +folder +helium +stalk +lanes +duo +lash +mooing +ragged +fangs +sera +wigs +brood +dukes +pantry +whirl +purge +bleach +snores +shiver +alba +winged +brooch +dyed +bulbs +quill +racer +dinars +merits +maggot +washer +plump +reopen +coded +fluke +molten +peaks +payoff +doses +strips +minors +pours +teens +pimps +shone +timers +dory +blazes +comma +slaps +toledo +nausea +elijah +venue +rushes +hauled +rents +wring +louvre +twain +maddox +rosary +chime +lumps +infect +tux +mead +hitter +harass +grad +reins +namely +lodged +slayer +clerks +crypt +trough +calms +shrewd +grains +dover +trades +neatly +vogue +occult +hombre +berg +bern +bends +volts +vines +spleen +ashton +sao +soar +unrest +ravine +skis +gazing +relish +arcade +stalls +prune +muster +pence +genre +maitre +amidst +tidal +pox +fished +cashed +tvs +gill +heals +canton +prima +cooled +bonny +wraith +kappa +oslo +gauls +gowns +canon +digits +straws +awoke +prone +urged +lax +lard +halo +lush +usher +tagged +arouse +skid +pilate +wick +dud +dimes +lupin +roper +beeper +saber +quo +hiss +salem +squads +walnut +fats +keats +idaho +casing +rooted +cretin +ample +persia +caliph +envoy +eskimo +gage +stokes +biker +tori +bleeds +cooped +viable +gulls +oats +tides +pooch +torah +goalie +coil +gulps +arose +albany +swells +lyons +loch +yippee +perch +bookie +avatar +lazar +urges +felon +awol +eaters +gigolo +wrongs +uproar +ruckus +ami +fakes +heirs +nerds +mazel +taping +owing +paced +strife +aroma +grocer +relics +ringer +mccall +bras +cougar +frigid +towed +spilt +firms +quail +slopes +majors +gums +opal +newt +sodium +loner +jailed +thames +jig +myths +rips +chit +sari +suitor +corpus +rubies +raf +leper +yearn +seine +boa +bali +mesa +deli +juno +mets +swarm +poses +edible +tramps +feud +outing +foggy +mash +gems +colon +nix +salts +elope +hindus +dwarfs +seeker +bene +weir +trojan +rapper +nab +locke +fringe +aims +manila +casts +bidder +fins +sewn +conned +kahn +evils +nappy +tulip +hyena +buick +hunts +pups +gulp +flashy +fuzz +parry +conn +atone +nigh +mite +abode +hyper +nugget +leaned +hors +renoir +paging +bison +jerky +diva +cicero +oaks +pollen +lyra +wipes +hock +suns +fates +glare +ado +lashes +rulers +cramps +emir +heresy +brides +quince +envied +outlet +lumpy +horde +chimps +tended +flier +mats +rodent +stow +inning +bolted +bogart +germ +hap +weber +enigma +rev +tory +honda +hectic +hopped +swiped +coarse +swamps +soothe +fluff +sprout +disks +neural +swims +puffs +splits +snows +viewed +pints +flask +hanky +warms +mane +ruddy +puffy +mala +dumber +dunes +straps +wither +crafty +slop +scab +faulty +queers +atlas +moors +buoy +pebble +valves +panels +gaulle +vacate +pun +chaser +deluxe +breeds +puny +gallop +canopy +vive +orb +pres +baa +geiger +gusto +rumba +graces +vector +tolls +ware +weeps +strut +turnip +siam +swoop +dept +stacks +perks +rabid +audit +candid +glum +ussr +dole +burner +sequel +borg +largo +clank +uterus +users +sulfur +exceed +walrus +mixer +simmer +bongo +dow +gel +dahlia +spawn +gentry +pranks +foil +whips +mangy +piazza +ticks +ploy +beagle +welch +scuba +tenor +chokes +tingle +turin +bowed +sac +melons +cuss +grover +liege +fronts +oaf +spikes +oft +liner +crumb +rica +upward +cycles +impure +hurl +craps +shucks +peachy +berth +drains +birch +kebab +limbo +skater +odin +jag +danube +rut +quotes +yarn +ratted +wharf +cabs +sumo +pointy +eels +sever +hex +chaste +dosage +pubic +vices +soles +hoof +kinder +twos +quoted +hairdo +jihad +kiev +banzai +duly +snout +yon +prays +lag +abner +hippo +yorker +fiesta +rowdy +burps +pusher +auld +deemed +swipe +jigsaw +chirps +draper +stun +dei +taffy +flowed +blower +plough +thrice +avail +isaiah +afloat +trait +fated +crick +algae +hijack +indies +bayou +hippy +fetish +herpes +chases +afghan +moths +homing +lapse +clergy +itches +embark +puking +minion +trusty +daffy +cabins +staked +fiasco +gills +amour +fouled +cords +oval +arises +unsure +funded +soho +soiled +squawk +fickle +repaid +iceman +bony +twit +jams +redo +python +hanks +snag +unholy +cuter +cubans +mower +crispy +pang +fester +iodine +hints +hussy +thong +hem +plait +desks +poked +chrome +leaps +grange +glitch +mercer +gunned +duet +bashed +glands +drags +podium +coney +prying +nos +haunts +elm +catchy +juices +sci +alamo +fetus +lucid +fixes +canine +armada +medina +liters +whims +cram +deduct +mumble +manned +novice +sewage +tinkle +torso +bowler +briar +flake +rejoin +snug +dual +piling +clot +cocked +moat +yam +hermes +brit +theta +serbs +murmur +trolls +huts +mould +scans +rift +reefs +croak +mont +attire +spout +fuses +mantis +dries +finder +vary +drills +beards +rummy +waffle +tangle +prompt +funnel +tubby +cantor +threes +aggie +moped +embryo +bowel +fend +screwy +traits +invoke +morn +hooch +boxed +winch +camper +ankara +baht +fined +hooky +looker +odessa +misled +shamed +naught +dune +reside +tau +camped +ceases +flunk +amid +crept +rhine +sphinx +fiver +fives +sulk +staten +snotty +crutch +gothic +vans +graze +paved +relive +caper +nests +proofs +madden +chants +keaton +shroud +raced +bran +rad +bijou +marek +bores +ascend +shrunk +unwise +tulips +chopin +aspire +actin +bails +mousse +quint +valor +purest +themes +dopey +hobson +sixes +topped +smelt +damsel +metals +gemini +blitz +tamed +pears +rustle +snowed +indoor +pail +typhus +mit +turban +boldly +nibble +foes +beige +aiding +reacts +whence +mime +clangs +grit +abrupt +sheikh +sickly +verb +fibers +barf +purify +willed +blurry +zeros +stub +cipher +weakly +youths +genoa +gaps +quart +umpire +lingo +adrift +nitwit +sadist +flung +chefs +quake +creak +vita +flawed +mach +equity +wards +oily +fie +raisin +bough +privy +batty +defied +gaping +coping +roster +mans +devout +viewer +koran +bagged +corned +braid +sodas +replay +wart +bossy +visas +paine +medics +sexist +tuba +logged +chisel +pigsty +prix +anglo +smudge +pseudo +ferret +nebula +feisty +riled +jolt +latino +chests +slang +ion +laces +vial +hasten +sax +alto +mags +aspen +bagel +lotto +nabbed +reeks +spied +hover +alleys +brands +tycoon +cad +harlot +mended +baggy +stripe +tact +siding +stank +toxins +duce +medusa +tenure +pegged +uglier +pliers +smithy +fathom +evade +dismal +bubbly +bowing +hype +chunky +piracy +swans +celery +cob +tacos +gland +silky +dashed +mania +fluent +slew +druid +frisk +bead +lobe +loins +fryer +beret +unsafe +annoys +ponder +shes +armory +caged +pines +barman +ironed +taft +otter +amuses +crease +sutra +retro +lasers +bikers +toke +ufos +faust +folds +untied +climbs +creams +gunmen +tripe +hiccup +induce +barter +bronco +warped +stems +pods +brazen +cleric +cubic +cortex +fleece +reigns +cavern +bonded +lout +mushy +soot +binds +raffle +primal +lawman +nylon +digit +quench +lofty +sloth +java +tipsy +halves +ignite +blanc +flips +aloft +cones +tulsa +yeti +groin +ranked +linden +vaults +dodo +hymns +bale +cabot +brando +measly +creamy +ledger +rugs +cokes +bummed +selves +tweet +mocked +ardent +juror +laced +unpaid +fad +snip +teased +eject +gutted +fines +burp +aqua +trendy +prowl +giver +bitchy +jails +graft +lyric +wasps +marino +vegan +synced +zion +vitals +sender +cuddly +prof +dined +mildly +plated +kennel +gopher +nev +uncool +elixir +pleas +mimics +juggle +eros +takers +taipei +phi +mendel +almond +sweats +tarot +sparta +zeta +gull +keel +slid +mumbo +swedes +solves +pocus +snare +smacks +loon +rec +socket +unison +calmer +sonata +teapot +smarty +witted +figs +vixen +dorado +seams +claps +condor +vibes +luau +sneaks +pining +clair +corset +sable +alpine +plums +repel +obi +cools +grips +rotted +nursed +suede +famed +gassed +volga +beryl +pooped +twists +curled +titans +lament +dieter +sic +filly +toddy +rots +phobia +varied +klan +intake +uss +viral +fruity +wrecks +braver +drones +taker +hires +flex +suburb +moro +wanton +ditto +shay +sup +hyenas +woes +hue +joss +maxi +movers +puked +glee +wisest +strays +miser +axes +corona +combed +hocus +dill +bilge +coals +fiscal +moles +aria +ruff +dinky +bona +zing +jurors +hanger +insure +fliers +bugler +rouse +chore +ruse +dainty +canaan +urging +ganges +bwana +wield +dab +lockup +pacing +pus +flak +putt +robs +blooms +dubbed +vat +ripple +drowns +pant +levine +pelvis +fresno +mined +lurch +rein +upload +jokers +spaced +dangle +rapids +licks +yawn +yip +fares +warts +bengal +fiends +bossa +cynic +sears +taurus +sunup +ducats +sodom +paged +avant +stirs +eights +mumps +brahms +bower +vipers +hazy +femme +trois +unwind +twerp +donors +sui +kicker +essays +teal +grammy +jagger +agile +cordon +vigil +sores +amiss +waxed +rogues +sawed +moping +eureka +mishap +sledge +canals +swab +camden +tanned +tartar +fir +napalm +blip +fora +diem +nines +icing +doings +uphill +devoid +tho +girdle +smoky +lowers +operas +dingo +sevens +yeast +kaput +twigs +fiat +wag +savor +savvy +navel +exert +biased +hoe +char +mullet +mayan +tiara +rubs +yeller +guise +untold +pari +sheds +teas +ninny +brewer +exempt +babble +rusted +prissy +rapes +oink +swami +duds +lewd +plural +fray +eloped +oar +trays +quilt +frock +enmity +newer +nosey +guppy +prose +nudge +grubby +polio +topics +salted +begone +nasal +verde +modify +liter +gout +width +remake +imam +idols +gourd +bland +vocals +virgo +hydra +bleeps +minh +beaut +wastes +musket +astern +boars +bustle +dramas +cravat +braids +dozed +grouch +expire +bosun +armpit +fawn +albino +stooge +ulcers +petal +coupon +def +arty +bouncy +humid +loops +jus +ails +madmen +orgies +frisky +mosaic +hep +hefty +regal +amazes +sickle +sri +petite +gleam +emblem +ablaze +rube +sown +relied +longs +footed +libel +pounce +jailer +sugars +crosby +grovel +aught +perm +huns +clad +uranus +lager +wallop +quiver +mince +dilly +blot +packer +robust +racine +palate +alumni +gook +injure +kale +poised +greets +dawned +censor +revere +mongol +ducked +bros +kites +lister +durham +clones +priors +buffer +meaner +puffed +bard +garter +dally +putty +banal +facade +pimple +fisk +menus +argo +gizmo +mays +quark +dazed +knave +evenly +picker +res +frolic +sexes +dimwit +ticker +hickey +reek +bins +dolce +quad +splat +clout +browns +douse +wallow +shafts +taint +yoke +hordes +fodder +stiffs +benign +hedges +byes +curved +comets +cloned +dusted +piety +exodus +presto +ornery +sadder +scamp +zeal +hinder +afoot +scurvy +fide +toxin +ghouls +caw +sachs +cappy +toying +revise +stats +choosy +swig +typist +drafts +alibis +boned +tunic +yanked +shifty +reels +enzyme +cocoon +narc +sexier +vinyl +acne +vapor +carte +refuel +niche +stair +pauper +deem +grits +docked +deport +burrow +cooker +acorn +confer +marlin +hushed +sicker +compel +coated +craze +timely +jerked +malls +hoses +goethe +stead +faro +lunacy +unruly +tier +fowl +heaps +olden +shaker +henna +scots +orbits +salads +squish +kafka +expo +shriek +nieces +briefs +devise +watery +grate +rigor +duped +chirp +undies +pitied +rajah +proxy +voter +gable +dives +dials +kits +hops +brogan +papaya +lahore +silo +sundae +cong +faxed +terra +deux +padded +glows +faker +anvil +gar +curing +waive +sprint +subdue +jugs +ailing +priced +goto +curie +soggy +cranes +runny +hanoi +cheery +trashy +balm +deity +celtic +befall +lepers +unites +wobbly +arches +flabby +bibles +binge +grazed +enema +brutes +mardi +rages +census +relies +vests +gab +bias +drowsy +crawls +toads +bois +mounts +dotty +suntan +roost +starch +spiked +slots +shimmy +mew +tampa +kiosk +flops +finely +odious +col +spills +getup +suites +bulge +triads +deduce +dipper +capped +lupus +nobis +prod +fuels +deejay +iraqis +amish +arming +shiv +sunken +radish +shears +fused +strait +abuses +godson +lastly +manchu +huff +garner +toupee +lilac +tokens +lute +gloss +saucy +aline +hobbit +perky +mortem +oils +bunks +unused +axle +muted +roamed +mixes +llama +talon +kelp +tees +septic +flicks +exec +hearth +cur +atop +assert +mora +braves +pew +aloof +pester +doubly +hater +gander +borneo +tins +coupe +spruce +gauze +aztec +studs +booker +hailed +rarest +galore +filet +soir +manger +perk +pores +andes +isis +sawing +fumble +whiter +gully +tiptoe +dias +purses +klutz +mowing +jiggle +lube +antics +pellet +lavish +forte +asher +caved +optic +concur +heifer +sprang +woven +jour +twirl +crusty +mints +wicket +sorely +kook +loaves +jocks +hernia +cliche +mire +floppy +fib +sandal +daze +harpo +nifty +probes +fable +tiff +clanks +bitsy +obeys +pelt +blob +lope +magma +mitt +serb +dunce +pawned +madder +hives +alight +humbug +crafts +creole +vis +dinghy +acorns +ethic +smog +discs +prude +shank +amp +slump +gnome +suave +kimchi +latent +gazed +homely +eulogy +warmly +moll +somber +grimm +leaky +meats +rustic +bile +conga +chatty +idling +glazed +kraft +slurps +lends +cosa +leapt +avert +tract +ode +danes +clasp +scenic +stony +booths +diddle +pips +bowers +spud +ebony +bodied +covet +gung +rector +mono +rims +hilly +baltic +housed +lackey +seamen +rani +waxing +garbo +tripod +liven +brawn +minx +toffee +infamy +hemp +jigger +dotted +enroll +hatter +carina +tehran +gaff +doped +spooks +graph +ranges +gipsy +moines +widen +cited +hoots +ouija +decor +furies +cater +combs +balkan +tweed +murky +uppity +nighty +crete +tremor +tarp +grotto +dwells +gilded +phooey +pianos +raps +peddle +gust +haggle +swish +zephyr +fixer +brim +weld +flanks +hilt +cite +vane +loafer +crass +evens +resin +grouse +queasy +oxide +yuppie +downed +titled +stills +prized +trends +pout +defies +roving +leans +pearly +pane +peaked +fresco +soaps +breezy +leach +roe +rigs +moos +annex +evict +fonda +welded +mod +ani +leased +unplug +motels +uneven +walled +corp +racers +goings +mitts +pedals +edged +fife +supple +honeys +stowed +labors +fueled +masons +kern +ooze +mimic +guile +clothe +handel +stoker +drivel +pippin +colds +copped +plume +mapped +woolly +towing +spar +innate +busts +clinks +farrow +golfer +syrian +sheen +satire +pisces +drover +because +nothing +thought +believe +another +through +someone +morning +talking +looking +getting +without +already +brother +tonight +friends +problem +waiting +minutes +married +against +working +exactly +husband +trouble +captain +anymore +country +between +brought +welcome +started +anybody +outside +perhaps +playing +telling +leaving +promise +evening +himself +darling +feeling +serious +running +company +special +careful +goodbye +perfect +million +happens +parents +alright +general +control +suppose +strange +picture +forgive +calling +changed +explain +meeting +finally +clothes +officer +present +kidding +imagine +forever +charlie +decided +mistake +station +wedding +worried +message +america +instead +certain +hundred +english +history +michael +quickly +sitting +colonel +missing +service +respect +stopped +besides +forward +killing +neither +whether +teacher +protect +machine +amazing +totally +private +realize +singing +village +wearing +walking +dollars +seconds +staying +driving +college +arrived +nervous +contact +writing +majesty +further +flowers +written +partner +address +learned +mission +kitchen +chicken +holding +allowed +however +putting +usually +destroy +animals +herself +dancing +reading +soldier +dressed +support +mention +charles +grandma +screams +freedom +chinese +breathe +command +patient +figured +weapons +england +stories +sheriff +keeping +richard +natural +witness +correct +earlier +weekend +account +hanging +deserve +ringing +example +grandpa +several +monster +silence +prepare +justice +letters +knowing +society +russian +willing +student +jealous +weather +opinion +suicide +biggest +noticed +helping +nowhere +meaning +somehow +towards +streets +manager +suspect +dropped +excited +whoever +sweetie +science +discuss +spanish +medical +pleased +invited +purpose +survive +ordered +hearing +pretend +numbers +suggest +ashamed +turning +falling +release +fortune +fingers +matters +subject +selling +stomach +british +opening +reality +funeral +airport +program +defense +project +checked +covered +clearly +created +tickets +burning +glasses +foreign +courage +yelling +depends +warning +belongs +success +reasons +italian +journey +century +ancient +factory +sending +records +william +changes +heading +letting +bedroom +finding +revenge +divorce +someday +useless +awesome +miracle +smoking +deliver +victory +planned +showing +growing +reached +doctors +request +passing +younger +becomes +chicago +members +obvious +workers +touched +regular +details +emperor +destiny +enemies +sisters +thunder +watched +central +traffic +process +carried +beating +percent +license +offered +holiday +theater +germans +whistle +answers +receive +uniform +screwed +escaped +hunting +disease +mystery +beloved +comrade +section +fishing +senator +healthy +curious +staring +kingdom +quarter +secrets +barking +concern +beeping +picking +windows +managed +passion +panting +engaged +wounded +treated +johnson +surface +remains +closing +moments +popular +reports +chances +dealing +pulling +unusual +blowing +charges +advance +cooking +collect +winning +wasting +capable +confess +settled +results +illegal +leading +appears +knocked +gasping +victims +garbage +federal +council +jackson +tuesday +express +blessed +bullets +billion +wanting +degrees +parties +trained +robbery +servant +foolish +unknown +trapped +unhappy +crossed +culture +failure +hitting +library +sobbing +greater +cutting +quality +alcohol +rolling +nuclear +proceed +vehicle +fashion +setting +arrange +gunshot +violent +quietly +refused +fifteen +hurting +capital +channel +parking +chasing +anytime +angeles +diamond +torture +actress +comfort +article +attempt +kissing +despite +scratch +entered +concert +spirits +surgery +indians +pushing +whiskey +selfish +similar +drawing +provide +barbara +patrick +affairs +heavens +current +enjoyed +traitor +frankly +stanley +distant +accused +plastic +landing +dreamed +marshal +trusted +western +stephen +begging +vincent +package +balance +citizen +cameras +routine +perform +eternal +awfully +figures +liberty +painful +smiling +admiral +clients +warrant +ability +thieves +players +cleaned +thirsty +bitches +disturb +trigger +reminds +stretch +average +worries +charity +francis +species +moaning +lessons +tragedy +antonio +martial +contest +highway +vampire +network +chatter +systems +highest +related +classes +studied +bottles +manners +laundry +beneath +schools +exhales +fighter +smaller +swallow +removed +painted +sounded +madness +raymond +slipped +effects +prevent +warrior +injured +shelter +chamber +produce +costume +succeed +propose +complex +murders +raining +granted +benefit +replace +therapy +fantasy +charged +cleared +custody +mothers +version +counter +jumping +prayers +florida +rubbish +romance +anxious +naughty +product +actions +testing +lawyers +assault +anthony +kicking +squeeze +crystal +hostage +fellows +extreme +october +luggage +shaking +cheated +pockets +abandon +washing +offense +confirm +digging +typical +shining +returns +african +heavily +praying +academy +matthew +humming +honking +attacks +capture +battery +buzzing +messing +classic +musical +matches +lincoln +dignity +massive +shocked +respond +comment +studies +laughed +mexican +leaders +feeding +shortly +happily +chapter +mankind +breasts +serving +grabbed +measure +illness +arguing +retired +demands +artists +blanket +loyalty +fooling +samurai +perfume +banging +bargain +payment +dragged +russell +drowned +bernard +pattern +pacific +conduct +goddess +engines +stepped +visited +lighter +apology +session +supreme +masters +shadows +fathers +arrives +arrival +wailing +butcher +houston +happier +joining +protest +retreat +operate +various +gravity +leather +nations +embassy +instant +penalty +packing +giggles +honored +halfway +closely +testify +amongst +achieve +buffalo +approve +islands +deposit +strikes +visitor +dessert +awkward +scandal +grounds +causing +concept +wrapped +explode +cookies +killers +surgeon +raising +privacy +sharing +economy +existed +largest +dearest +stabbed +content +gabriel +require +profile +reverse +declare +defence +planets +connect +options +eastern +embrace +shirley +passage +buddies +develop +intense +lecture +counsel +limited +painter +recover +observe +examine +muffled +persons +candles +reserve +monkeys +roaring +episode +leonard +worship +gunfire +dresses +choices +massage +twisted +curtain +helpful +kennedy +spotted +damaged +dorothy +heather +spoiled +phoenix +follows +emotion +exposed +bearing +dentist +seventh +january +excuses +ceiling +improve +magical +monitor +lunatic +genuine +desires +jewelry +crashed +farmers +skipper +stuffed +obliged +collins +include +amusing +sailing +elected +poverty +muscles +objects +regards +bicycle +despair +trailer +impress +strings +priests +crowded +smarter +britain +methods +shotgun +display +planted +blocked +douglas +howling +gallery +endless +smashed +handled +bandits +crushed +pervert +cracked +nearest +orleans +customs +formula +filming +physics +sweater +sighing +seeking +circles +adopted +verdict +efforts +charley +guessed +tobacco +elegant +cabinet +closest +missile +noodles +located +sucking +maximum +sausage +furious +minimum +signing +element +buttons +watches +tension +bothers +compare +welfare +devoted +assumed +fiction +carries +harvest +harmony +speaker +pirates +arizona +absence +vicious +decides +cocaine +gesture +amateur +whisper +cousins +claimed +cleaner +savings +wealthy +pointed +sixteen +bombing +stadium +marines +counted +divided +footage +seattle +luckily +lottery +honesty +roberts +whining +assured +touches +balcony +lesbian +filling +primary +samples +mansion +stewart +precise +harvard +resting +platoon +pension +triumph +experts +sadness +conquer +quicker +relaxed +snoring +signals +cavalry +logical +haunted +possess +psychic +regrets +presume +knights +focused +wonders +shooter +fragile +sources +sincere +legally +compete +prophet +balloon +receipt +climate +consent +autopsy +haircut +reaches +hunters +peasant +rainbow +colored +treason +refuses +hostile +threats +blaring +pouring +couples +screech +needing +feather +pursuit +turkish +scaring +satisfy +swedish +detroit +marilyn +shuttle +drivers +cottage +applied +warming +seventy +holland +heights +corpses +ruining +ireland +tourist +drunken +rabbits +quarrel +writers +hardest +opposed +convict +circuit +chopper +corrupt +journal +travels +ticking +bizarre +anxiety +gilbert +storage +fulfill +farther +expense +jupiter +genetic +convent +rescued +battles +contain +trading +springs +profits +railway +hallway +villain +advised +despise +fainted +delayed +attract +judging +catches +foreman +betting +bowling +explore +tricked +trumpet +skipped +dracula +cowards +aspirin +fascist +rooster +targets +harriet +baggage +rushing +pudding +spencer +melissa +reduced +wishing +restore +smelled +echoing +hissing +tearing +delight +choking +crooked +freaked +essence +handful +madison +eleanor +failing +cheaper +offices +robbing +empress +phantom +unlucky +shorter +hearted +griffin +execute +pumpkin +fastest +duchess +variety +cricket +dealers +climbed +feature +robbers +whipped +sinking +sunrise +auction +pressed +abraham +finance +flowing +blaming +equally +dancers +bedtime +utterly +horizon +crucial +gregory +behaved +greatly +corners +clayton +boiling +gardens +grenade +ignored +publish +bathing +involve +initial +brigade +reunion +forcing +peanuts +whereas +beatles +radical +madonna +chewing +maestro +listens +antique +visible +edition +healing +terrace +organic +mirrors +herbert +torment +creates +fitting +bananas +tiffany +cunning +bubbles +visions +decades +printed +offence +deepest +resolve +backing +needles +solomon +blossom +muslims +jasmine +lightly +deceive +camping +caution +mustard +justify +hideous +volcano +barrier +marquis +coroner +martini +popcorn +relieve +niggers +casting +lobster +insects +witches +seasons +atlanta +venture +yankees +showers +bathtub +talents +slapped +teaches +montana +pitched +jackass +risking +stripes +crosses +carrier +nursing +dislike +popping +longing +richest +exhibit +evolved +lookout +bridges +starved +gorilla +longest +winners +spilled +sailors +chuckle +borders +sundays +chopped +housing +pigeons +inquiry +tougher +olympic +expects +peoples +forests +punched +shallow +torpedo +natives +shields +tapping +blooded +teasing +chester +grocery +blasted +rapidly +rockets +teenage +nursery +lambert +confuse +dismiss +onboard +gestapo +bourbon +shouted +referee +wrecked +liberal +trainer +cabbage +plumber +slavery +digital +puppies +beliefs +weeping +undress +audible +scholar +admired +tactics +females +compass +tractor +neutral +orphans +cruelty +gambler +busting +suzanne +pyramid +blanche +shaving +janitor +tequila +reflect +biology +chimney +skating +flights +pharaoh +orderly +consult +loading +savages +devices +sponsor +pitiful +decency +kenneth +tribute +airline +founded +outcome +sinners +inherit +pajamas +predict +dolores +israeli +suckers +ecstasy +messiah +toilets +disgust +rocking +freezer +cherish +krishna +brothel +shrieks +dragons +pleases +glimpse +tracked +hottest +annoyed +lighten +tunnels +sparrow +lifting +tempted +banquet +flooded +impulse +mutters +scooter +vatican +unarmed +symbols +cowboys +editing +bombers +inmates +insists +portion +inhales +signora +posters +burglar +secured +coconut +tremble +fiancee +recruit +creator +forgets +militia +affects +simpler +rotting +provoke +heating +condoms +surfing +leopard +elderly +handing +guarded +ketchup +spiders +banking +rebuild +payroll +avoided +drummer +flatter +picasso +peaches +pumping +princes +fairies +invaded +studios +tongues +hamburg +quantum +promote +scenery +frances +idiotic +cracker +mercury +tighter +bouquet +oneself +locking +leaning +bidding +legends +caravan +bruises +hostess +decline +courses +singers +praised +advisor +shutter +athlete +crashes +ripping +suffers +octopus +amounts +rangers +damages +inspire +beaches +denying +rejoice +walling +melting +baghdad +winters +mineral +condemn +modesty +daytime +bandage +remorse +drawers +webster +unaware +penguin +cartoon +cannons +handles +shampoo +swollen +monthly +secrecy +revving +jackpot +biscuit +summers +designs +resumes +licking +forrest +warfare +easiest +squeaks +statues +postman +glowing +diapers +tripped +dynasty +bankers +dolphin +roughly +throats +vanilla +critics +snapped +rubbing +gypsies +bravery +immense +proudly +repairs +bottoms +runaway +carrots +bugging +prefers +squeals +freeway +proving +dangers +wheeler +cashier +cynical +edwards +babylon +uptight +motives +prisons +flipped +shipped +funding +blinded +steward +pauline +lawsuit +columns +faculty +chooses +convert +mermaid +dreamer +immoral +context +memphis +freight +escapes +pennies +oysters +sensors +skilled +readers +barrels +chained +dungeon +punches +altered +descent +dumping +suburbs +console +stained +excused +oranges +aspects +mixture +viewers +zombies +lucifer +fireman +timothy +partial +insults +alabama +sundown +virgins +lucille +kidneys +amnesia +forming +gaining +tighten +protein +scarlet +upright +exploit +doorway +veteran +pickles +extinct +courier +beggars +gallant +dispose +tightly +bangkok +donovan +ratings +drugged +farming +titanic +obscene +heroine +crawled +briefly +sorrows +extract +boredom +earning +plaster +markets +outrage +tattoos +panther +marries +breaker +powered +serpent +redhead +matched +leaking +stunned +culprit +mounted +lasting +desired +seduced +getaway +coolest +mocking +chaplin +schultz +anguish +lacking +pistols +siberia +alarmed +royalty +lantern +pitcher +analyze +chronic +indiana +combine +inspect +remarks +wrestle +snowing +slowing +rations +sabbath +gallons +temples +weighed +heavier +marbles +notices +doubled +eclipse +sighted +caliber +patriot +whacked +armored +parting +johnnie +dresser +overall +insight +hookers +mailbox +clearer +dispute +fanfare +toronto +educate +vessels +errands +shelley +refined +charmed +fearful +payback +cologne +sleeves +conceal +acquire +ashtray +trivial +refugee +doorman +thanked +breaths +islamic +alleged +arrests +admirer +darkest +commune +martian +stables +tolling +tyranny +chemist +ominous +leisure +lettuce +tuition +valiant +replied +jackets +gallows +flaming +diploma +trooper +canteen +indoors +skinner +indulge +sanders +descend +spreads +belgian +fleeing +pianist +periods +anarchy +awarded +surname +outfits +chateau +charter +hideout +appoint +chiming +qualify +cabaret +zealand +patrols +placing +sustain +sweeter +burgers +reveals +standby +peacock +pending +severed +mumbles +reactor +ribbons +obscure +terrain +tenants +scrooge +dialing +dinners +vintage +furnace +abigail +prairie +capsule +rightly +sublime +captive +rituals +handbag +prevail +amnesty +takeoff +twinkle +scatter +emerged +reviews +neglect +carmine +harness +soviets +antenna +sharply +anatomy +burying +swimmer +neptune +seizure +starter +founder +expired +beseech +vaccine +liaison +nagging +radiant +sliding +ghastly +accepts +shuffle +emerald +solving +freshen +turtles +doubted +fertile +pinched +arsenal +malaria +clarify +firstly +hugging +settles +transit +herring +baptist +bladder +pioneer +virtues +endured +scanner +rumbles +cruiser +orlando +marched +berries +hooting +winding +strokes +credits +intrude +invites +catcher +buckets +rewrite +origins +defined +rattles +cooling +vinegar +drought +overdue +pierced +earthly +skinned +blazing +seminar +gagging +prefect +thinner +manages +install +ranking +lullaby +insured +vitamin +dynamic +jerking +appeals +salvage +pageant +hustler +permits +persian +roasted +mustang +horrors +garland +soaking +newborn +drained +firemen +pilgrim +vermont +vulture +willard +analyst +runners +lowered +hotshot +seniors +trinity +uranium +stalker +stirred +batting +forgave +mildred +slammed +consume +merrily +forfeit +orchard +careers +pursued +isolate +bullied +capitol +dilemma +crusade +aroused +disobey +cursing +faggots +intends +bruised +grammar +bailiff +collier +roaming +fencing +incense +envious +lazarus +imitate +hygiene +dictate +hopeful +worldly +squares +regions +evident +drafted +earring +outlaws +renting +cockpit +cheetah +peeping +penance +bending +flashes +suspend +bounced +sandals +fleming +katrina +clarity +adapted +premier +sparkle +puzzles +fearing +coaster +dickens +boarded +rascals +genesis +wichita +revenue +fascism +sleeper +smuggle +olympus +centers +cackles +applies +meadows +doubles +applaud +mortals +chariot +squawks +passive +invalid +shelves +shoving +virtual +crowned +glamour +goliath +spelled +refrain +wyoming +rapping +serbian +peppers +squared +emptied +sneezes +tablets +carolyn +harding +pencils +whitney +tribune +guineas +drastic +ongoing +dashing +junkies +bravely +jogging +coffins +puppets +morally +grilled +slander +reacted +negroes +mammals +dialect +bravest +pillows +itching +hatchet +stashed +manhood +plugged +summons +removal +schemes +vaguely +prosper +quieter +imposed +wildest +thermal +inhuman +helmets +platter +donated +rewards +goodman +coffees +doggone +kittens +tangled +outline +repeats +atheist +gibbons +tickles +cushion +flushed +streams +giraffe +refresh +addicts +bermuda +posture +confide +cheater +spinach +implore +wilhelm +tornado +cardiac +raphael +fatigue +mitzvah +lending +minding +violate +slumber +gateway +murmurs +pompous +lurking +insides +faraway +snipers +voyager +riviera +puberty +tossing +bologna +manning +turmoil +hopping +costing +stating +weights +suffice +chaotic +stylish +sulking +jukebox +drifted +brownie +tracker +pancake +rounded +inquire +clatter +guiding +craving +cheerio +apaches +sterile +bygones +factors +alimony +ethical +legions +snowman +booking +waiters +trashed +stumble +seafood +strauss +printer +hawking +sensual +uncover +hitched +largely +lengths +builder +scripts +lunches +koreans +raiders +finnish +charade +singles +toaster +screens +enhance +lizards +marital +unclear +enforce +widower +museums +peeking +trolley +bottled +drinker +waffles +tedious +okinawa +pasture +masseur +hobbies +camelot +valleys +cyclops +rooftop +graphic +closure +workout +hauling +iceberg +deprive +freeman +viewing +carving +jamming +seaside +bellies +greeted +frantic +shifted +tasting +quoting +emerson +ulysses +threads +blacked +crucify +exhaust +endings +grizzly +ditched +stamped +fanatic +sinatra +authors +recital +leagues +presses +steamed +compose +orchids +hateful +hippies +cyanide +fancies +riddles +nickels +typhoon +dioxide +outdoor +hacking +redneck +heathen +sneaked +mockery +baloney +crumble +earnest +catfish +deserts +colleen +perjury +pickled +awaited +praises +pesetas +notions +bedside +scalpel +glasgow +methane +hooking +scoring +thicker +cornell +booster +implant +unicorn +carpets +harmful +poisons +devised +refusal +hillary +brushed +phrases +patches +fetched +siamese +carcass +torches +gourmet +kiddies +niagara +florist +mailman +plainly +gangway +urgency +bergman +cleanse +bumping +shatter +coaches +behaves +seaweed +sticker +phoning +sellers +coppers +goodies +novelty +glacier +swiftly +odyssey +rebuilt +docking +anomaly +eyeball +commend +hamster +wronged +baptism +dumbest +brushes +buggers +pledged +outpost +compact +unheard +galahad +eyelids +pretext +upgrade +cuisine +mammoth +burrows +cholera +catalog +ironing +memoirs +stealth +staging +slipper +syringe +touring +marking +bedford +estates +entrust +renewed +prudent +hurried +aladdin +upwards +varsity +stacked +fancied +festive +maggots +bulldog +napkins +tailing +seagull +paradox +berserk +funnier +binding +castles +boulder +bonfire +clemens +elusive +pegasus +psyched +flushes +cupcake +upstate +smacked +hiccups +stamina +guitars +cluster +copying +blindly +adviser +crimson +frontal +granite +striped +butters +premium +cramped +branded +bonding +lasagna +crazier +jacuzzi +reclaim +proverb +mistook +seasick +martyrs +machete +habitat +freshly +voltage +goggles +maniacs +rebound +measles +whatnot +bristol +pinball +wizards +thyself +traders +dodgers +casinos +editors +signore +hayward +booming +forgery +eminent +playful +glitter +minimal +bullies +motions +matador +unified +relying +sarcasm +forbids +baskets +recipes +deleted +tainted +patrons +spooked +lodging +futures +oatmeal +nirvana +quixote +maidens +brewing +pandora +belches +saddest +sprayed +stutter +heretic +pillars +everest +trainee +meowing +density +algebra +blurred +thereby +pottery +rebirth +wartime +leeches +consort +coupons +texture +surplus +parsons +knuckle +bayonet +slashed +stature +hoodlum +cocking +soprano +robbins +bearded +coastal +presley +ghostly +rejects +garment +nonstop +galileo +weakest +implies +wrinkle +bloated +arabian +clipped +dwarves +unleash +caramel +hangman +induced +milking +evasive +bellows +outlook +morales +puzzled +summary +barging +nearing +coyotes +undergo +sorting +forsake +hatched +blondes +vikings +dreaded +briefed +jehovah +wrongly +hancock +demonic +cleaver +marches +avenged +dubious +milkman +janeiro +stifler +mandate +breakup +gambled +fossils +plucked +windsor +kibbutz +hosting +meanest +chipped +sharpen +fridays +goblins +thinker +tsunami +disrupt +derrick +plunder +abdomen +bashful +lovable +plunged +abusive +pleaded +memento +heroism +devious +turkeys +persist +evicted +residue +midwife +tropics +yawning +overrun +midwest +startle +strayed +scolded +seating +monarch +slender +faraday +cobbler +whitman +orgasms +tissues +buzzard +candies +nightly +statute +violets +scraped +sweetly +peabody +concede +linking +fullest +tourism +silicon +uncanny +outcast +stormed +cheques +mongrel +sensing +sedated +cossack +hormone +posting +billing +tracing +rooting +algiers +setback +volumes +raccoon +beastly +ugliest +keepers +bribery +inquest +fallout +fussing +wallets +reptile +midgets +galilee +lowlife +augusta +caveman +weaving +tibetan +borough +mutants +plateau +custard +looting +crowbar +archers +insulin +addison +grazing +updated +tolstoy +scourge +smitten +squeaky +abiding +swaying +allergy +heinous +dummies +dodging +fitness +piccolo +scarred +norfolk +sweeney +collide +patched +pendant +banners +nephews +fiddler +foresee +latrine +closets +bangles +pebbles +blender +neutron +nucleus +artwork +flutter +donkeys +suction +bullock +chilled +steamer +genghis +rosebud +malachi +abusing +raisins +arsenic +dipping +leaping +symptom +violins +packets +crybaby +jingles +spartan +archive +alerted +utility +outward +floated +daisies +newport +listing +thrills +recount +commits +freezes +stalled +mileage +default +planner +babysit +baptize +brewery +mouthed +tidings +warhead +bunnies +scrawny +heiress +calcium +holster +charger +charmer +shorten +sprouts +tiniest +larceny +bouncer +swindle +onwards +quartet +turnout +railing +plotted +chilean +ostrich +scrolls +smeared +burgess +markers +trotter +soaring +sandman +gadgets +tickled +palaces +hammers +pimples +muffins +striker +swapped +learner +orpheus +nemesis +defiant +sorcery +yapping +checkup +regroup +optical +labeled +roaches +inflict +enabled +cleanup +firearm +folding +endowed +escorts +suzette +shaping +sardine +parched +deficit +resides +revived +bazooka +preview +dormant +winslow +sipping +eyebrow +dossier +godless +monsoon +discard +wildcat +kindest +greased +mondays +waldorf +sectors +rethink +sermons +rapture +excites +grinder +clement +curator +appetit +cuckold +bailing +decreed +replies +flunked +plagued +watered +carnage +rigging +emerges +daggers +segment +limping +guesses +shivers +exclude +collars +ballast +tending +forbade +trapeze +defects +confine +revered +swamped +seville +extends +sharper +twelfth +cheered +diverse +caterer +literal +electra +vibrant +strains +flashed +tallest +defying +circled +richter +topside +scented +absolve +cutters +whoring +secular +betrays +smashes +wanders +saffron +elastic +gunning +bigfoot +yelping +faintly +peeling +zapping +saddled +apostle +frisbee +banning +shrinks +harshly +erratic +anything +remember +happened +yourself +together +tomorrow +business +everyone +somebody +actually +children +thinking +probably +whatever +daughter +supposed +question +possible +straight +laughing +hospital +american +speaking +finished +terrible +birthday +pleasure +building +watching +chuckles +anywhere +surprise +problems +thousand +accident +security +marriage +fighting +standing +personal +position +promised +continue +sergeant +sleeping +bullshit +evidence +suddenly +starting +pictures +brothers +upstairs +involved +drinking +shouting +shooting +decision +princess +language +interest +director +innocent +military +computer +soldiers +complete +feelings +bathroom +nonsense +pregnant +strength +greatest +consider +favorite +japanese +mountain +national +practice +pressure +horrible +minister +although +cheering +monsieur +possibly +handsome +prepared +saturday +arrested +powerful +medicine +breaking +murdered +bringing +believed +laughter +training +whenever +students +criminal +received +distance +followed +returned +universe +contract +expected +thoughts +murderer +grunting +property +planning +goodness +audience +research +realized +bastards +painting +football +wherever +officers +vacation +governor +original +carrying +honestly +exciting +romantic +midnight +millions +charming +stranger +recently +familiar +memories +prisoner +violence +sometime +precious +changing +confused +grateful +official +applause +families +knocking +ordinary +creature +treasure +friendly +highness +positive +darkness +groaning +terrific +shopping +attorney +presence +terribly +bleeding +attacked +stronger +becoming +stealing +hundreds +magazine +checking +dreaming +reporter +physical +politics +throwing +gorgeous +elevator +sentence +attitude +shoulder +material +cleaning +exchange +separate +progress +properly +swimming +champion +directly +movement +thursday +counting +solution +mistakes +pleasant +district +patients +schedule +negative +studying +pathetic +accepted +entirely +religion +released +location +paradise +learning +stopping +narrator +convince +approach +spending +teaching +arranged +farewell +opposite +disaster +mistress +struggle +presents +entrance +customer +campaign +patience +ceremony +starving +citizens +baseball +incident +suffered +services +generous +neighbor +delivery +lifetime +transfer +behavior +instance +passport +producer +exercise +believes +touching +betrayed +basement +downtown +partners +diamonds +growling +division +sandwich +margaret +reported +coughing +adjusted +everyday +marrying +chairman +messages +normally +mistaken +reverend +enjoying +cheating +machines +identity +describe +worrying +wondered +complain +answered +invented +visiting +designed +occasion +survived +electric +comrades +jonathan +splendid +standard +valuable +russians +homework +informed +industry +offering +punished +fabulous +discover +headache +dramatic +reaction +suitcase +stubborn +divorced +engineer +whispers +deserves +doorbell +appeared +absolute +captured +peaceful +listened +superior +contrary +imagined +argument +operator +williams +identify +quarters +election +specific +catholic +troubles +dressing +elephant +freezing +teachers +gambling +enormous +humanity +judgment +potatoes +directed +southern +response +festival +sunshine +visitors +promises +nowadays +corporal +slightly +occurred +meantime +faithful +crossing +dropping +maintain +stations +cemetery +servants +supplies +increase +hopeless +rumbling +delicate +almighty +compared +virginia +activity +entering +bothered +accounts +talented +gathered +blessing +giggling +december +catching +kindness +hercules +gunshots +monsters +previous +superman +republic +emotions +homicide +november +survival +boarding +airplane +necklace +lawrence +belonged +countess +european +produced +glorious +searched +required +chanting +borrowed +weakness +attached +deserved +daylight +recorded +sticking +suspects +meetings +announce +grandson +register +congress +intended +chickens +anderson +carriage +arriving +proposal +dreadful +railroad +treating +internal +northern +disgrace +eternity +critical +telegram +constant +marshall +chemical +brooklyn +holidays +floating +defeated +provided +obsessed +poisoned +whistles +somewhat +advanced +tracking +aircraft +annoying +creating +scotland +victoria +executed +freaking +strategy +creative +audition +offended +relative +strictly +dialogue +appetite +ministry +function +ultimate +nicholas +concerns +covering +dynamite +homeless +creation +graduate +fighters +insisted +employee +document +whirring +sequence +helpless +facility +screwing +envelope +miracles +elements +warriors +requires +climbing +napoleon +conflict +expenses +clicking +trousers +entitled +assigned +hostages +shepherd +vanished +clothing +sympathy +overcome +guardian +sensible +tortured +educated +remained +forgiven +illusion +benjamin +portrait +regiment +infected +husbands +declared +relieved +respects +civilian +admitted +invasion +threaten +sickness +crashing +platform +economic +ignorant +veronica +paranoid +designer +instinct +analysis +umbrella +occupied +vampires +priority +addition +stinking +disguise +revealed +inspired +reaching +harmless +salesman +pounding +assassin +withdraw +frighten +preacher +mitchell +replaced +gangster +collapse +imperial +spinning +ambition +controls +franklin +gracious +alliance +marching +atlantic +broadway +february +crawling +concrete +florence +musician +heavenly +contacts +thompson +einstein +waitress +chirping +subjects +bachelor +persuade +roommate +explains +deserted +jealousy +uniforms +adorable +tolerate +whimpers +drowning +arrogant +secretly +traveled +cracking +corridor +reminded +majority +lipstick +handling +products +rattling +affected +cocktail +shanghai +included +troubled +feathers +forehead +intimate +lighting +deceased +magician +opponent +clearing +tourists +password +rejected +creaking +hesitate +curtains +thrilled +abortion +immortal +capacity +multiple +pointing +approval +courtesy +peculiar +robinson +quitting +restless +fourteen +reliable +eighteen +suitable +clarence +preserve +thirteen +homeland +guessing +campbell +symptoms +cheerful +accurate +barracks +recovery +fletcher +childish +assembly +fountain +youngest +scissors +wretched +assuming +measures +missiles +proposed +approved +landlord +isolated +cultural +shocking +domestic +peasants +switched +happiest +inviting +benefits +stepping +strongly +costumes +achieved +insulted +squadron +mortgage +sniffing +sneaking +merciful +egyptian +theories +projects +disagree +billions +chambers +nickname +reserved +wardrobe +mechanic +unlikely +artistic +vehicles +expelled +dragging +dispatch +evacuate +retarded +indicate +bracelet +sunlight +examined +carnival +fortress +sweating +prettier +canadian +pentagon +mentally +relation +interior +weekends +backyard +disorder +disposal +merchant +articles +infinite +definite +distress +promoted +traitors +allergic +calendar +cardinal +guidance +barbecue +villages +selected +insanity +memorial +province +injuries +discount +terminal +purchase +tomatoes +hamilton +overtime +ordering +deceived +swinging +souvenir +starring +branches +behaving +blocking +shipment +gasoline +destined +canceled +drawings +mourning +generals +patricia +sexually +opinions +deadline +notebook +speeches +requests +escaping +contempt +pressing +careless +hometown +software +carolina +mattress +slipping +improved +gardener +magnetic +charging +italians +lonesome +pancakes +thankful +nuisance +whooping +accusing +altitude +purposes +ruthless +striking +exploded +features +choosing +diseases +reckless +earrings +distract +discreet +squirrel +slippers +scenario +profound +solitary +colorado +protocol +screamed +programs +rehearse +equipped +chatting +allowing +channels +avoiding +strangle +blackout +trusting +lemonade +betrayal +mustache +overseas +teenager +postcard +workshop +shipping +stressed +compound +restored +comments +cupboard +precinct +sounding +sweetest +breeding +patterns +infantry +recorder +combined +survivor +leonardo +coverage +includes +launched +flirting +devotion +summoned +peterson +hardware +incoming +stunning +muhammad +mumbling +phillips +grounded +semester +blankets +premises +bankrupt +treasury +skeleton +unstable +acquired +prophecy +currency +overhead +reindeer +morphine +sniffles +invested +garrison +rational +petition +commands +crippled +attended +suggests +mcdonald +morrison +sabotage +employed +speakers +morality +attempts +cheyenne +cadillac +fugitive +payments +refugees +michigan +resolved +exposure +feminine +repeated +cautious +addicted +smelling +fearless +breathes +relevant +slippery +parallel +weddings +rosemary +churches +smashing +awaiting +smallest +observed +spitting +practise +historic +nineteen +frontier +commence +activate +biscuits +juvenile +confront +triangle +eminence +syndrome +tropical +baroness +columbus +figuring +solitude +numerous +greeting +thorough +evenings +drifting +estimate +holiness +dripping +bluffing +snarling +clapping +resigned +apparent +sidewalk +resident +likewise +godzilla +chandler +oklahoma +mainland +panicked +columbia +monument +guarding +hydrogen +detailed +wandered +protects +mosquito +claiming +refusing +freshman +surround +shortcut +managing +olympics +referred +shameful +employer +whinnies +dolphins +comedian +stitches +dinosaur +stripper +rewarded +extended +antidote +cowardly +operated +disabled +intercom +academic +demanded +missions +violated +abducted +epidemic +stripped +ignition +mornings +istanbul +steering +backpack +crackers +briefing +repaired +balloons +specimen +speeding +gigantic +kentucky +printing +imbecile +assemble +involves +measured +rustling +shutting +secondly +retrieve +sinister +smartest +anyplace +provides +ignoring +contents +postpone +pussycat +punching +werewolf +moreover +stalking +grabbing +sherlock +settling +receiver +benedict +pharmacy +dedicate +sausages +richards +sessions +twilight +grenades +defended +babbling +brighter +publicly +cannabis +revolver +severely +bulletin +literary +backward +reminder +montreal +galaxies +adoption +vitamins +confined +richmond +gertrude +stanford +bouncing +airborne +toughest +composed +category +obtained +eyebrows +prospect +cultures +sweeping +airlines +departed +hangover +initials +traveler +composer +relaxing +theodore +missouri +consumed +salvador +commerce +plumbing +clanging +stirring +scottish +policies +donation +finishes +disciple +mischief +brussels +feedback +intruder +scorpion +amateurs +cleaners +doorstep +urgently +garfield +athletic +detected +sardines +tactical +metaphor +premiere +inclined +spelling +obstacle +equation +heritage +packages +snatched +medieval +brunette +unlocked +informer +mattered +regional +bacteria +conclude +matching +bursting +smoothly +bandages +database +noticing +sneakers +banished +hormones +agencies +portland +existing +sporting +cromwell +destroys +deciding +stumbled +humility +stalling +tempting +notified +goldfish +inferior +swearing +landlady +symphony +watchman +villains +comeback +starters +stranded +something +beautiful +everybody +important +different +sometimes +gentlemen +wonderful +somewhere +president +yesterday +certainly +christmas +questions +continues +attention +happening +afternoon +dangerous +situation +professor +difficult +screaming +beginning +apartment +seriously +listening +boyfriend +ourselves +otherwise +breakfast +necessary +detective +excellent +surprised +following +obviously +forgotten +gentleman +wondering +commander +according +emergency +inspector +happiness +apologize +operation +recognize +perfectly +character +telephone +introduce +fantastic +destroyed +condition +expecting +thousands +concerned +brilliant +cigarette +secretary +expensive +breathing +political +mountains +carefully +americans +therefore +christian +champagne +suffering +knowledge +insurance +assistant +interview +celebrate +chocolate +community +mentioned +committed +direction +statement +naturally +disappear +including +chuckling +newspaper +delicious +prisoners +sacrifice +subtitles +advantage +extremely +available +hollywood +basically +desperate +education +challenge +equipment +authority +committee +ambulance +convinced +elizabeth +miserable +customers +treatment +guarantee +nightmare +surrender diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index c83b598ed..2870f4d5c 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -115,7 +115,7 @@ "Update all keys" "Extended information" "Confirm via fingerprint" - "Confirm via words" + "Confirm via phrases" "Share Log" "Add" @@ -195,8 +195,8 @@ "Warning" "These features are not yet finished or results of user experience/security research. Thus, don't rely on their security and please don't report issues you encounter!" - "Word Confirm" - "Confirm keys with words instead of hexadecimal fingerprints" + "Phrase Confirmation" + "Confirm keys with phrases instead of hexadecimal fingerprints" "Linked Identities" "Link keys to Twitter, GitHub, websites or DNS (similar to keybase.io but decentralized)" "Keybase.io Proofs" @@ -1447,8 +1447,8 @@ "Only validated self-certificates and validated certificates created with your keys are displayed here." "Identities for " "The keys you are importing contain “identities”: names and email addresses. Select exactly those for confirmation which match what you expected." - "Compare the displayed fingerprint, character by character, with the one displayed on your partners device." - "Compare the displayed fingerprint, word by word, with the one displayed on your partners device." + "Compare the fingerprint, character by character, with the one displayed on your partners device." + "Compare the phrases with the ones displayed on your partners device." "Do the fingerprints match?" "Revocation Reason" "Type" -- cgit v1.2.3 From 74281d6203d6cc99b01cb8005042c22e2e9bae03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 24 Sep 2015 18:30:14 +0200 Subject: Confirm design --- Graphics/get-material-icons.sh | 1 + .../keychain/ui/CertifyFingerprintFragment.java | 27 +-- .../main/res/drawable-hdpi/ic_check_black_24dp.png | Bin 0 -> 169 bytes .../main/res/drawable-mdpi/ic_check_black_24dp.png | Bin 0 -> 128 bytes .../res/drawable-xhdpi/ic_check_black_24dp.png | Bin 0 -> 188 bytes .../res/drawable-xxhdpi/ic_check_black_24dp.png | Bin 0 -> 254 bytes .../res/drawable-xxxhdpi/ic_check_black_24dp.png | Bin 0 -> 277 bytes .../res/layout/certify_fingerprint_fragment.xml | 214 ++++++++------------- OpenKeychain/src/main/res/menu/key_view.xml | 2 +- OpenKeychain/src/main/res/values/strings.xml | 8 +- 10 files changed, 106 insertions(+), 146 deletions(-) create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/ic_check_black_24dp.png create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/ic_check_black_24dp.png create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/ic_check_black_24dp.png create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/ic_check_black_24dp.png create mode 100644 OpenKeychain/src/main/res/drawable-xxxhdpi/ic_check_black_24dp.png diff --git a/Graphics/get-material-icons.sh b/Graphics/get-material-icons.sh index b6a2515c9..999680751 100755 --- a/Graphics/get-material-icons.sh +++ b/Graphics/get-material-icons.sh @@ -4,6 +4,7 @@ python copy OpenKeychain action white search 24 python copy OpenKeychain navigation white arrow_back 24 python copy OpenKeychain navigation white close 24 python copy OpenKeychain navigation white check 24 +python copy OpenKeychain navigation black check 24 python copy OpenKeychain navigation black expand_less 24 python copy OpenKeychain navigation black expand_more 24 python copy OpenKeychain navigation white refresh 24 diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java index d9bc08268..2409523bc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java @@ -48,24 +48,26 @@ public class CertifyFingerprintFragment extends LoaderFragment implements static final int REQUEST_CERTIFY = 1; public static final String ARG_DATA_URI = "uri"; - public static final String ARG_ENABLE_WORD_CONFIRM = "enable_word_confirm"; + public static final String ARG_ENABLE_PHRASES_CONFIRM = "enable_word_confirm"; + private TextView mActionYes; private TextView mFingerprint; private TextView mIntro; + private TextView mHeader; private static final int LOADER_ID_UNIFIED = 0; private Uri mDataUri; - private boolean mEnableWordConfirm; + private boolean mEnablePhrasesConfirm; /** * Creates new instance of this fragment */ - public static CertifyFingerprintFragment newInstance(Uri dataUri, boolean enableWordConfirm) { + public static CertifyFingerprintFragment newInstance(Uri dataUri, boolean enablePhrasesConfirm) { CertifyFingerprintFragment frag = new CertifyFingerprintFragment(); Bundle args = new Bundle(); args.putParcelable(ARG_DATA_URI, dataUri); - args.putBoolean(ARG_ENABLE_WORD_CONFIRM, enableWordConfirm); + args.putBoolean(ARG_ENABLE_PHRASES_CONFIRM, enablePhrasesConfirm); frag.setArguments(args); @@ -77,11 +79,12 @@ public class CertifyFingerprintFragment extends LoaderFragment implements View root = super.onCreateView(inflater, superContainer, savedInstanceState); View view = inflater.inflate(R.layout.certify_fingerprint_fragment, getContainer()); - View actionNo = view.findViewById(R.id.certify_fingerprint_button_no); - View actionYes = view.findViewById(R.id.certify_fingerprint_button_yes); + TextView actionNo = (TextView) view.findViewById(R.id.certify_fingerprint_button_no); + mActionYes = (TextView) view.findViewById(R.id.certify_fingerprint_button_yes); mFingerprint = (TextView) view.findViewById(R.id.certify_fingerprint_fingerprint); mIntro = (TextView) view.findViewById(R.id.certify_fingerprint_intro); + mHeader = (TextView) view.findViewById(R.id.certify_fingerprint_fingerprint_header); actionNo.setOnClickListener(new View.OnClickListener() { @Override @@ -89,7 +92,7 @@ public class CertifyFingerprintFragment extends LoaderFragment implements getActivity().finish(); } }); - actionYes.setOnClickListener(new View.OnClickListener() { + mActionYes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { certify(mDataUri); @@ -109,10 +112,12 @@ public class CertifyFingerprintFragment extends LoaderFragment implements getActivity().finish(); return; } - mEnableWordConfirm = getArguments().getBoolean(ARG_ENABLE_WORD_CONFIRM); + mEnablePhrasesConfirm = getArguments().getBoolean(ARG_ENABLE_PHRASES_CONFIRM); - if (mEnableWordConfirm) { - mIntro.setText(R.string.certify_fingerprint_text_words); + if (mEnablePhrasesConfirm) { + mIntro.setText(R.string.certify_fingerprint_text_phrases); + mHeader.setText(R.string.section_phrases); + mActionYes.setText(R.string.btn_match_phrases); } loadData(dataUri); @@ -162,7 +167,7 @@ public class CertifyFingerprintFragment extends LoaderFragment implements if (data.moveToFirst()) { byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT); - if (mEnableWordConfirm) { + if (mEnablePhrasesConfirm) { displayWordConfirm(fingerprintBlob); } else { displayHexConfirm(fingerprintBlob); diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_check_black_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_check_black_24dp.png new file mode 100644 index 000000000..e802d90ae Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-hdpi/ic_check_black_24dp.png differ diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_check_black_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_check_black_24dp.png new file mode 100644 index 000000000..1c14c9c44 Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-mdpi/ic_check_black_24dp.png differ diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_check_black_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_check_black_24dp.png new file mode 100644 index 000000000..64a4944f7 Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xhdpi/ic_check_black_24dp.png differ diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_check_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_check_black_24dp.png new file mode 100644 index 000000000..b26a2c05e Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_check_black_24dp.png differ diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_check_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_check_black_24dp.png new file mode 100644 index 000000000..2f6d6386d Binary files /dev/null and b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_check_black_24dp.png differ diff --git a/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml b/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml index 239cdcc95..7e2f78531 100644 --- a/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml +++ b/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml @@ -1,155 +1,107 @@ - - + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> - + + + android:layout_gravity="top" + app:cardBackgroundColor="?attr/colorCardViewBackground" + app:cardCornerRadius="4dp" + app:cardElevation="8dp" + app:cardUseCompatPadding="true"> - + android:orientation="vertical"> - + - - - - - - - - - - + android:gravity="center_vertical" + android:paddingBottom="24dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:paddingTop="16dp" + android:textSize="18sp" + android:typeface="monospace" /> + + - + + + + - + - - + - - - - - - - - - - + diff --git a/OpenKeychain/src/main/res/menu/key_view.xml b/OpenKeychain/src/main/res/menu/key_view.xml index 14ea099f4..1bda1463a 100644 --- a/OpenKeychain/src/main/res/menu/key_view.xml +++ b/OpenKeychain/src/main/res/menu/key_view.xml @@ -41,7 +41,7 @@ android:id="@+id/menu_key_view_certify_fingerprint_word" app:showAsAction="never" android:visible="false" - android:title="@string/menu_certify_fingerprint_word" /> + android:title="@string/menu_certify_fingerprint_phrases" /> "Key" "Keyserver" "Fingerprint" + "Phrases" "Encrypt" "Decrypt / Verify" "Current expiry" @@ -83,6 +84,7 @@ "Back" "No" "Fingerprints match" + "Phrases match" "Encrypt/sign and share text" "Encrypt/sign and copy text" "View certification key" @@ -99,6 +101,7 @@ "Add" "Save as default" "Saved!" + "Doesn't match" "Settings" @@ -115,7 +118,7 @@ "Update all keys" "Extended information" "Confirm via fingerprint" - "Confirm via phrases" + "Confirm via phrases" "Share Log" "Add" @@ -1448,8 +1451,7 @@ "Identities for " "The keys you are importing contain “identities”: names and email addresses. Select exactly those for confirmation which match what you expected." "Compare the fingerprint, character by character, with the one displayed on your partners device." - "Compare the phrases with the ones displayed on your partners device." - "Do the fingerprints match?" + "Compare the phrases with the ones displayed on your partners device." "Revocation Reason" "Type" "Key not found!" -- cgit v1.2.3 From 688c5f545bf632ab1d1eb749d6daf076d95ee760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 24 Sep 2015 18:40:04 +0200 Subject: Fix genitiv in strings --- OpenKeychain/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index cd72c916a..ac8ac3682 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -1450,8 +1450,8 @@ "Only validated self-certificates and validated certificates created with your keys are displayed here." "Identities for " "The keys you are importing contain “identities”: names and email addresses. Select exactly those for confirmation which match what you expected." - "Compare the fingerprint, character by character, with the one displayed on your partners device." - "Compare the phrases with the ones displayed on your partners device." + "Compare the fingerprint, character by character, with the one displayed on your partner’s device." + "Compare these phrases with the ones displayed on your partner’s device." "Revocation Reason" "Type" "Key not found!" -- cgit v1.2.3 From f924e7d40cbfd9ebaa78b5f00edf3d486e595678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 24 Sep 2015 19:03:33 +0200 Subject: Fix some illegal state exceptions --- .../keychain/ui/ViewKeyKeybaseFragment.java | 29 ++++++++++++++++++---- .../keychain/util/NfcHelper.java | 4 +++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeybaseFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeybaseFragment.java index 5951702c4..11c032517 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeybaseFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeybaseFragment.java @@ -226,8 +226,9 @@ public class ViewKeyKeybaseFragment extends LoaderFragment implements } } - // look for evidence from keybase in the background, make tabular version of result - // + /** + * look for evidence from keybase in the background, make tabular version of result + */ private class DescribeKey extends AsyncTask { ParcelableProxy mParcelableProxy; @@ -270,7 +271,12 @@ public class ViewKeyKeybaseFragment extends LoaderFragment implements } catch (KeybaseException ignored) { } - return new ResultPage(getString(R.string.key_trust_results_prefix), proofList); + String prefix = ""; + if (isAdded()) { + prefix = getString(R.string.key_trust_results_prefix); + } + + return new ResultPage(prefix, proofList); } private SpannableStringBuilder formatSpannableString(SpannableStringBuilder proofLinks, String proofType) { @@ -295,7 +301,10 @@ public class ViewKeyKeybaseFragment extends LoaderFragment implements if (haveProofFor(proof.getType())) { ssb.append("\u00a0["); startAt = ssb.length(); - String verify = getString(R.string.keybase_verify); + String verify = ""; + if (isAdded()) { + verify = getString(R.string.keybase_verify); + } ssb.append(verify); ClickableSpan clicker = new ClickableSpan() { @Override @@ -312,6 +321,11 @@ public class ViewKeyKeybaseFragment extends LoaderFragment implements @Override protected void onPostExecute(ResultPage result) { super.onPostExecute(result); + // stop if fragment is no longer added to an activity + if(!isAdded()) { + return; + } + if (result.mProofs.isEmpty()) { result.mHeader = getActivity().getString(R.string.key_trust_no_cloud_evidence); } @@ -360,7 +374,12 @@ public class ViewKeyKeybaseFragment extends LoaderFragment implements default: stringIndex = R.string.keybase_narrative_unknown; } - return getActivity().getString(stringIndex); + + if (isAdded()) { + return getString(stringIndex); + } else { + return ""; + } } private void appendIfOK(Hashtable> table, Integer proofType, Proof proof) throws KeybaseException { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/NfcHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/NfcHelper.java index 2b47fd623..1040e683b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/NfcHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/NfcHelper.java @@ -141,6 +141,10 @@ public class NfcHelper { } protected void onPostExecute(Void unused) { + if (mActivity.isFinishing()) { + return; + } + // Register callback to set NDEF message mNfcAdapter.setNdefPushMessageCallback(mNdefCallback, mActivity); -- cgit v1.2.3 From 63f1b84914778b8bd11d65bbc261c550a60b2c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 24 Sep 2015 22:57:11 +0200 Subject: Remove save support for Android < 4.4 (OKC-01-014) --- .../keychain/ui/DecryptListFragment.java | 4 +- .../keychain/ui/EncryptFilesFragment.java | 11 + .../keychain/ui/ViewKeyAdvShareFragment.java | 8 +- .../keychain/ui/dialog/FileDialogFragment.java | 234 --------------------- .../linked/LinkedIdCreateHttpsStep2Fragment.java | 1 + .../keychain/util/ExportHelper.java | 15 +- .../keychain/util/FileHelper.java | 65 +----- .../src/main/res/menu-v19/decrypt_bottom_sheet.xml | 19 ++ .../src/main/res/menu/decrypt_bottom_sheet.xml | 15 +- OpenKeychain/src/main/res/values/strings.xml | 1 + 10 files changed, 54 insertions(+), 319 deletions(-) delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java create mode 100644 OpenKeychain/src/main/res/menu-v19/decrypt_bottom_sheet.xml diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java index a72277052..efb1df66b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java @@ -257,7 +257,6 @@ public class DecryptListFragment } OpenPgpMetadata metadata = result.mMetadata.get(index); - Uri saveUri = Uri.fromFile(activity.getExternalFilesDir(metadata.getMimeType())); mCurrentSaveFileUri = result.getOutputUris().get(index); String filename = metadata.getFilename(); @@ -266,7 +265,7 @@ public class DecryptListFragment filename = "decrypted" + (ext != null ? "."+ext : ""); } - FileHelper.saveDocument(this, filename, saveUri, metadata.getMimeType(), + FileHelper.saveDocument(this, filename, null, metadata.getMimeType(), R.string.title_decrypt_to_file, R.string.specify_file_to_decrypt_to, REQUEST_CODE_OUTPUT); } @@ -447,6 +446,7 @@ public class DecryptListFragment displayWithViewIntent(result, index, true, true); break; case R.id.decrypt_save: + // only inside the menu xml for Android >= 4.4 saveFileDialog(result, index); break; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index 8572a5712..71d555cc8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -308,6 +308,17 @@ public class EncryptFilesFragment return true; } + @Override + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + + // Show save only on Android >= 4.4 (Document Provider) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + MenuItem save = menu.findItem(R.id.encrypt_save); + save.setVisible(false); + } + } + public void toggleUseArmor(MenuItem item, final boolean useArmor) { mUseArmor = useArmor; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java index 4a46896bc..6331aa384 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java @@ -107,7 +107,7 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements View vFingerprintShareButton = view.findViewById(R.id.view_key_action_fingerprint_share); View vFingerprintClipboardButton = view.findViewById(R.id.view_key_action_fingerprint_clipboard); View vKeyShareButton = view.findViewById(R.id.view_key_action_key_share); - View vKeySafeButton = view.findViewById(R.id.view_key_action_key_export); + View vKeySaveButton = view.findViewById(R.id.view_key_action_key_export); View vKeyNfcButton = view.findViewById(R.id.view_key_action_key_nfc); View vKeyClipboardButton = view.findViewById(R.id.view_key_action_key_clipboard); ImageButton vKeySafeSlingerButton = (ImageButton) view.findViewById(R.id.view_key_action_key_safeslinger); @@ -133,7 +133,11 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements share(false, false); } }); - vKeySafeButton.setOnClickListener(new View.OnClickListener() { + // Show save only on Android >= 4.4 (Document Provider) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + vKeySaveButton.setVisibility(View.GONE); + } + vKeySaveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { exportToFile(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java deleted file mode 100644 index 84774ae5e..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (C) 2012-2014 Dominik Schürmann - * - * 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 . - */ - -package org.sufficientlysecure.keychain.ui.dialog; - -import android.app.Activity; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Message; -import android.os.Messenger; -import android.os.RemoteException; -import android.support.v4.app.DialogFragment; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.TextView; - -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.ui.util.Notify; -import org.sufficientlysecure.keychain.util.FileHelper; -import org.sufficientlysecure.keychain.util.Log; - -import java.io.File; - -/** - * This is a file chooser dialog no longer used with KitKat - */ -public class FileDialogFragment extends DialogFragment { - private static final String ARG_MESSENGER = "messenger"; - private static final String ARG_TITLE = "title"; - private static final String ARG_MESSAGE = "message"; - private static final String ARG_DEFAULT_FILE = "default_file"; - private static final String ARG_CHECKBOX_TEXT = "checkbox_text"; - - public static final int MESSAGE_OKAY = 1; - - public static final String MESSAGE_DATA_FILE = "file"; - public static final String MESSAGE_DATA_CHECKED = "checked"; - - private Messenger mMessenger; - - private EditText mFilename; - private ImageButton mBrowse; - private CheckBox mCheckBox; - private TextView mMessageTextView; - - private File mFile; - - private static final int REQUEST_CODE = 0x00007004; - - /** - * Creates new instance of this file dialog fragment - */ - public static FileDialogFragment newInstance(Messenger messenger, String title, String message, - File defaultFile, String checkboxText) { - FileDialogFragment frag = new FileDialogFragment(); - Bundle args = new Bundle(); - args.putParcelable(ARG_MESSENGER, messenger); - - args.putString(ARG_TITLE, title); - args.putString(ARG_MESSAGE, message); - args.putString(ARG_DEFAULT_FILE, defaultFile.getAbsolutePath()); - args.putString(ARG_CHECKBOX_TEXT, checkboxText); - - frag.setArguments(args); - - return frag; - } - - /** - * Creates dialog - */ - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final Activity activity = getActivity(); - - mMessenger = getArguments().getParcelable(ARG_MESSENGER); - - String title = getArguments().getString(ARG_TITLE); - String message = getArguments().getString(ARG_MESSAGE); - mFile = new File(getArguments().getString(ARG_DEFAULT_FILE)); - if (!mFile.isAbsolute()) { - // We use OK dir by default - mFile = new File(Constants.Path.APP_DIR.getAbsolutePath(), mFile.getName()); - } - String checkboxText = getArguments().getString(ARG_CHECKBOX_TEXT); - - LayoutInflater inflater = (LayoutInflater) activity - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity); - alert.setTitle(title); - - View view = inflater.inflate(R.layout.file_dialog, null); - - mMessageTextView = (TextView) view.findViewById(R.id.message); - mMessageTextView.setText(message); - - mFilename = (EditText) view.findViewById(R.id.input); - mFilename.setText(mFile.getName()); - mBrowse = (ImageButton) view.findViewById(R.id.btn_browse); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - mBrowse.setVisibility(View.GONE); - } else { - mBrowse.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - // only .asc or .gpg files - // setting it to text/plain prevents Cynaogenmod's file manager from selecting asc - // or gpg types! - FileHelper.saveDocumentKitKat( - FileDialogFragment.this, "*/*", mFile.getName(), REQUEST_CODE); - } - }); - } - - mCheckBox = (CheckBox) view.findViewById(R.id.checkbox); - if (checkboxText == null) { - mCheckBox.setEnabled(false); - mCheckBox.setVisibility(View.GONE); - } else { - mCheckBox.setEnabled(true); - mCheckBox.setVisibility(View.VISIBLE); - mCheckBox.setText(checkboxText); - mCheckBox.setChecked(true); - } - - alert.setView(view); - - alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int id) { - dismiss(); - - String currentFilename = mFilename.getText().toString(); - if (currentFilename == null || currentFilename.isEmpty()) { - // No file is like pressing cancel, UI: maybe disable positive button in this case? - return; - } - - if (mFile == null || currentFilename.startsWith("/")) { - mFile = new File(currentFilename); - } else if (!mFile.getName().equals(currentFilename)) { - // We update our File object if user changed name! - mFile = new File(mFile.getParentFile(), currentFilename); - } - - boolean checked = mCheckBox.isEnabled() && mCheckBox.isChecked(); - - // return resulting data back to activity - Bundle data = new Bundle(); - data.putString(MESSAGE_DATA_FILE, mFile.getAbsolutePath()); - data.putBoolean(MESSAGE_DATA_CHECKED, checked); - - sendMessageToHandler(MESSAGE_OKAY, data); - } - }); - - alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int id) { - dismiss(); - } - }); - return alert.show(); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode & 0xFFFF) { - case REQUEST_CODE: { - if (resultCode == Activity.RESULT_OK && data != null) { - File file = new File(data.getData().getPath()); - if (file.getParentFile().exists()) { - mFile = file; - mFilename.setText(mFile.getName()); - } else { - Notify.create(getActivity(), R.string.no_file_selected, Notify.Style.ERROR).show(); - } - } - - break; - } - - default: - super.onActivityResult(requestCode, resultCode, data); - - break; - } - } - - /** - * Send message back to handler which is initialized in a activity - * - * @param what Message integer you want to send - */ - private void sendMessageToHandler(Integer what, Bundle data) { - Message msg = Message.obtain(); - msg.what = what; - if (data != null) { - msg.setData(data); - } - - try { - mMessenger.send(msg); - } catch (RemoteException e) { - Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); - } catch (NullPointerException e) { - Log.w(Constants.TAG, "Messenger is null!", e); - } - } -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateHttpsStep2Fragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateHttpsStep2Fragment.java index 22a201ba3..1065bf1ce 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateHttpsStep2Fragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateHttpsStep2Fragment.java @@ -134,6 +134,7 @@ public class LinkedIdCreateHttpsStep2Fragment extends LinkedIdCreateFinalFragmen String targetName = "pgpkey.txt"; + // TODO: not supported on Android < 4.4 FileHelper.saveDocument(this, targetName, Uri.fromFile(new File(Constants.Path.APP_DIR, targetName)), "text/plain", R.string.title_decrypt_to_file, R.string.specify_file_to_decrypt_to, diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java index 45dc33906..f2ce456f6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java @@ -69,13 +69,14 @@ public class ExportHelper : R.string.specify_backup_dest_single); } - FileHelper.saveDocumentDialog(new FileHelper.FileDialogCallback() { - @Override - public void onFileSelected(File file, boolean checked) { - mExportFile = file; - exportKeys(masterKeyId == null ? null : new long[] { masterKeyId }, exportSecret); - } - }, mActivity.getSupportFragmentManager(), title, message, exportFile, null); + // TODO: for valodim +// FileHelper.saveDocumentDialog(new FileHelper.FileDialogCallback() { +// @Override +// public void onFileSelected(File file, boolean checked) { +// mExportFile = file; +// exportKeys(masterKeyId == null ? null : new long[] { masterKeyId }, exportSecret); +// } +// }, mActivity.getSupportFragmentManager(), title, message, exportFile, null); } // TODO: If ExportHelper requires pending data (see CryptoOPerationHelper), activities using diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java index 9fb362412..09ea67f42 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java @@ -18,7 +18,6 @@ package org.sufficientlysecure.keychain.util; import android.annotation.TargetApi; -import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Context; @@ -30,20 +29,13 @@ import android.net.Uri; import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Environment; -import android.os.Handler; -import android.os.Message; -import android.os.Messenger; import android.provider.DocumentsContract; import android.provider.OpenableColumns; import android.support.annotation.StringRes; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; import android.widget.Toast; -import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround; -import org.sufficientlysecure.keychain.ui.dialog.FileDialogFragment; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -97,37 +89,12 @@ public class FileHelper { public static void saveDocument(Fragment fragment, String targetName, Uri inputUri, String mimeType, @StringRes int title, @StringRes int message, int requestCode) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - saveDocumentDialog(fragment, targetName, inputUri, title, message, requestCode); + throw new RuntimeException("saveDocument does not support Android < 4.4!"); } else { saveDocumentKitKat(fragment, mimeType, targetName, requestCode); } } - public static void saveDocumentDialog(final Fragment fragment, String targetName, Uri inputUri, - @StringRes int title, @StringRes int message, final int requestCode) { - - saveDocumentDialog(fragment, targetName, inputUri, title, message, new FileDialogCallback() { - // is this a good idea? seems hacky... - @Override - public void onFileSelected(File file, boolean checked) { - Intent intent = new Intent(); - intent.setData(Uri.fromFile(file)); - fragment.onActivityResult(requestCode, Activity.RESULT_OK, intent); - } - }); - } - - public static void saveDocumentDialog(final Fragment fragment, String targetName, Uri inputUri, - @StringRes int title, @StringRes int message, FileDialogCallback callback) { - - File file = inputUri == null ? null : new File(inputUri.getPath()); - File parentDir = file != null && file.exists() ? file.getParentFile() : Constants.Path.APP_DIR; - File targetFile = new File(parentDir, targetName); - saveDocumentDialog(callback, fragment.getActivity().getSupportFragmentManager(), - fragment.getString(title), fragment.getString(message), targetFile, null); - - } - /** Opens the preferred installed file manager on Android and shows a toast * if no manager is installed. */ private static void openDocumentPreKitKat( @@ -172,36 +139,6 @@ public class FileHelper { fragment.startActivityForResult(intent, requestCode); } - public static void saveDocumentDialog( - final FileDialogCallback callback, final FragmentManager fragmentManager, - final String title, final String message, final File defaultFile, - final String checkMsg) { - // Message is received after file is selected - Handler returnHandler = new Handler() { - @Override - public void handleMessage(Message message) { - if (message.what == FileDialogFragment.MESSAGE_OKAY) { - callback.onFileSelected( - new File(message.getData().getString(FileDialogFragment.MESSAGE_DATA_FILE)), - message.getData().getBoolean(FileDialogFragment.MESSAGE_DATA_CHECKED)); - } - } - }; - - // Create a new Messenger for the communication back - final Messenger messenger = new Messenger(returnHandler); - - DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() { - @Override - public void run() { - FileDialogFragment fileDialog = FileDialogFragment.newInstance(messenger, title, message, - defaultFile, checkMsg); - - fileDialog.show(fragmentManager, "fileDialog"); - } - }); - } - public static String getFilename(Context context, Uri uri) { String filename = null; try { diff --git a/OpenKeychain/src/main/res/menu-v19/decrypt_bottom_sheet.xml b/OpenKeychain/src/main/res/menu-v19/decrypt_bottom_sheet.xml new file mode 100644 index 000000000..868bd605f --- /dev/null +++ b/OpenKeychain/src/main/res/menu-v19/decrypt_bottom_sheet.xml @@ -0,0 +1,19 @@ + +

+ + + + + + + + diff --git a/OpenKeychain/src/main/res/menu/decrypt_bottom_sheet.xml b/OpenKeychain/src/main/res/menu/decrypt_bottom_sheet.xml index 11b79bd5f..f3550278a 100644 --- a/OpenKeychain/src/main/res/menu/decrypt_bottom_sheet.xml +++ b/OpenKeychain/src/main/res/menu/decrypt_bottom_sheet.xml @@ -3,17 +3,12 @@ + android:icon="@drawable/ic_apps_black_24dp" + android:title="@string/btn_open_with" /> + android:icon="@drawable/ic_share_black_24dp" + android:title="@string/btn_share_decrypted_text" /> - - - + \ No newline at end of file diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index ac8ac3682..53483c390 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -91,6 +91,7 @@ "Create key" "Add file(s)" "Share" + "Open with…" "Copy decrypted text" "Read from clipboard" "Select input file" -- cgit v1.2.3 From 756ee28fb0bfb63f1d013d6b82bedc13c811b32f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 24 Sep 2015 23:15:19 +0200 Subject: Cleanup FileHelper --- .../keychain/ui/DecryptListFragment.java | 4 ++-- .../keychain/ui/EncryptFilesFragment.java | 5 ++--- .../ui/linked/LinkedIdCreateHttpsStep2Fragment.java | 6 ++---- .../keychain/util/FileHelper.java | 21 ++++++++++----------- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java index efb1df66b..a0650f8b1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java @@ -265,8 +265,8 @@ public class DecryptListFragment filename = "decrypted" + (ext != null ? "."+ext : ""); } - FileHelper.saveDocument(this, filename, null, metadata.getMimeType(), - R.string.title_decrypt_to_file, R.string.specify_file_to_decrypt_to, REQUEST_CODE_OUTPUT); + FileHelper.saveDocument(this, filename, metadata.getMimeType(), + REQUEST_CODE_OUTPUT); } private void saveFile(Uri saveUri) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index 71d555cc8..58476fc57 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -224,9 +224,8 @@ public class EncryptFilesFragment String targetName = (mEncryptFilenames ? "1" : FileHelper.getFilename(getActivity(), model.inputUri)) + (mUseArmor ? Constants.FILE_EXTENSION_ASC : Constants.FILE_EXTENSION_PGP_MAIN); - Uri inputUri = model.inputUri; - FileHelper.saveDocument(this, targetName, inputUri, - R.string.title_encrypt_to_file, R.string.specify_file_to_encrypt_to, REQUEST_CODE_OUTPUT); + FileHelper.saveDocument(this, targetName, + REQUEST_CODE_OUTPUT); } public void addFile(Intent data) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateHttpsStep2Fragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateHttpsStep2Fragment.java index 1065bf1ce..44323543f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateHttpsStep2Fragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateHttpsStep2Fragment.java @@ -27,7 +27,6 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.EditText; -import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.linked.resources.GenericHttpsResource; @@ -35,7 +34,6 @@ import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.FileHelper; -import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.net.URI; @@ -136,8 +134,8 @@ public class LinkedIdCreateHttpsStep2Fragment extends LinkedIdCreateFinalFragmen // TODO: not supported on Android < 4.4 FileHelper.saveDocument(this, - targetName, Uri.fromFile(new File(Constants.Path.APP_DIR, targetName)), - "text/plain", R.string.title_decrypt_to_file, R.string.specify_file_to_decrypt_to, + targetName, + "text/plain", REQUEST_CODE_OUTPUT); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java index 09ea67f42..fea3e65b6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileHelper.java @@ -74,24 +74,23 @@ import java.text.DecimalFormat; public class FileHelper { public static void openDocument(Fragment fragment, Uri last, String mimeType, boolean multiple, int requestCode) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - openDocumentPreKitKat(fragment, last, mimeType, multiple, requestCode); - } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { openDocumentKitKat(fragment, mimeType, multiple, requestCode); + } else { + openDocumentPreKitKat(fragment, last, mimeType, multiple, requestCode); } } - public static void saveDocument(Fragment fragment, String targetName, Uri inputUri, - @StringRes int title, @StringRes int message, int requestCode) { - saveDocument(fragment, targetName, inputUri, "*/*", title, message, requestCode); + public static void saveDocument(Fragment fragment, String targetName, int requestCode) { + saveDocument(fragment, targetName, "*/*", requestCode); } - public static void saveDocument(Fragment fragment, String targetName, Uri inputUri, String mimeType, - @StringRes int title, @StringRes int message, int requestCode) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - throw new RuntimeException("saveDocument does not support Android < 4.4!"); - } else { + public static void saveDocument(Fragment fragment, String targetName, String mimeType, + int requestCode) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { saveDocumentKitKat(fragment, mimeType, targetName, requestCode); + } else { + throw new RuntimeException("saveDocument does not support Android < 4.4!"); } } -- cgit v1.2.3 From 21b83d8fa483eb3d911e7475663a7cb36e4170a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 24 Sep 2015 23:32:51 +0200 Subject: Reject filenames with slashes completly --- .../keychain/pgp/PgpDecryptVerifyOperation.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java index 007f686e8..36b4f5e1e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyOperation.java @@ -52,13 +52,13 @@ import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants.key; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.BaseOperation; +import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; +import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; +import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; -import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; @@ -512,8 +512,9 @@ public class PgpDecryptVerifyOperation extends BaseOperation Date: Fri, 25 Sep 2015 00:01:24 +0200 Subject: Prevent database downgrade (OKC-01-012) --- .../keychain/provider/KeychainDatabase.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java index d7fb738fc..0f90f8141 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java @@ -54,7 +54,7 @@ import java.io.IOException; */ public class KeychainDatabase extends SQLiteOpenHelper { private static final String DATABASE_NAME = "openkeychain.db"; - private static final int DATABASE_VERSION = 12; + private static final int DATABASE_VERSION = 13; static Boolean apgHack = false; private Context mContext; @@ -296,6 +296,8 @@ public class KeychainDatabase extends SQLiteOpenHelper { // the api_accounts fix and the new update keys table return; } + case 13: + // do nothing here, just consolidate } @@ -306,6 +308,13 @@ public class KeychainDatabase extends SQLiteOpenHelper { mContext.getApplicationContext().startActivity(consolidateIntent); } + @Override + public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // NOTE: downgrading the database is explicitly not allowed to prevent + // someone from exploiting old bugs to export the database + throw new RuntimeException("Downgrading the database is not allowed!"); + } + /** This method tries to import data from a provided database. * * The sole assumptions made on this db are that there is a key_rings table -- cgit v1.2.3 From b10b14d9bc737edc56af0eec3a14bed5ebf3ea39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Fri, 25 Sep 2015 01:02:21 +0200 Subject: Check that the encrypt input uris are not linked to our own internal storage (OKC-01-010) --- .../keychain/ui/EncryptFilesFragment.java | 29 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java index 58476fc57..0e357cfcd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java @@ -18,6 +18,7 @@ package org.sufficientlysecure.keychain.ui; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Date; @@ -451,9 +452,29 @@ public class EncryptFilesFragment } - // prepares mOutputUris, either directly and returns false, or indirectly - // which returns true and will call cryptoOperation after mOutputUris has - // been set at a later point. + /** + * Checks that the input uris are not linked to our own internal storage. + * This prevents the encryption of our own database (-> export of whole database) + */ + private void securityCheckInternalStorage() { + for (FilesAdapter.ViewModel model : mFilesAdapter.mDataset) { + File fileInput = new File(model.inputUri.getPath()); + try { + // the canonical path of the file must not start with /data/data/org.sufficientlysecure.keychain/ + if (fileInput.getCanonicalPath().startsWith(getActivity().getApplicationInfo().dataDir)) { + throw new RuntimeException("Encrypting OpenKeychain's private files is not allowed!"); + } + } catch (IOException e) { + Log.e(Constants.TAG, "Getting canonical path failed!", e); + } + } + } + + /** + * Prepares mOutputUris, either directly and returns false, or indirectly + * which returns true and will call cryptoOperation after mOutputUris has + * been set at a later point. + */ private boolean prepareOutputStreams() { switch (mAfterEncryptAction) { @@ -529,6 +550,8 @@ public class EncryptFilesFragment } + securityCheckInternalStorage(); + return actionsParcel; } -- cgit v1.2.3 From 29e9b2fa1eb5cfcd1539027e54025120d5af6a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Fri, 25 Sep 2015 01:38:43 +0200 Subject: Dont import more than 100 User IDs (OKC-01-002) --- .../keychain/operations/results/OperationResult.java | 1 + .../java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java | 8 ++++++-- OpenKeychain/src/main/res/values/strings.xml | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java index a03658808..65816e5f2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java @@ -474,6 +474,7 @@ public abstract class OperationResult implements Parcelable { MSG_KC_UID_BAD (LogLevel.WARN, R.string.msg_kc_uid_bad), MSG_KC_UID_CERT_DUP (LogLevel.DEBUG, R.string.msg_kc_uid_cert_dup), MSG_KC_UID_DUP (LogLevel.DEBUG, R.string.msg_kc_uid_dup), + MSG_KC_UID_TOO_MANY (LogLevel.DEBUG, R.string.msg_kc_uid_too_many), MSG_KC_UID_FOREIGN (LogLevel.DEBUG, R.string.msg_kc_uid_foreign), MSG_KC_UID_NO_CERT (LogLevel.DEBUG, R.string.msg_kc_uid_no_cert), MSG_KC_UID_REVOKE_DUP (LogLevel.DEBUG, R.string.msg_kc_uid_revoke_dup), diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java index ca98882d8..87e7ec461 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java @@ -457,11 +457,15 @@ public class UncachedKeyRing implements Serializable { // check for duplicate user ids if (processedUserIds.contains(userId)) { - log.add(LogType.MSG_KC_UID_DUP, - indent, userId); + log.add(LogType.MSG_KC_UID_DUP, indent, userId); // strip out the first found user id with this name modified = PGPPublicKey.removeCertification(modified, rawUserId); } + if (processedUserIds.size() > 100) { + log.add(LogType.MSG_KC_UID_TOO_MANY, indent, userId); + // strip out the user id + modified = PGPPublicKey.removeCertification(modified, rawUserId); + } processedUserIds.add(userId); PGPSignature selfCert = null; diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 53483c390..b0e0f5734 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -995,6 +995,7 @@ "No valid self-certificate found for user ID '%s', removing from ring" "Removing invalid user ID '%s'" "Removing duplicate user ID '%s'. The keyring contained two of them. This may result in missing certificates!" + "Removing user ID '%s'. More than 100 User IDs are not imported!" "User ID does not verify as UTF-8!" "Processing user attribute of type JPEG" "Processing user attribute of unknown type" -- cgit v1.2.3 From 3df9bea4554c0edddce57aa6a2e32cfe5250ed72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Fri, 25 Sep 2015 02:22:23 +0200 Subject: Harden parsing of keyserver results (OKC-01-003) --- .../keychain/keyimport/CloudSearch.java | 2 +- .../keychain/keyimport/HkpKeyserver.java | 67 ++++++++++++++-------- .../keychain/keyimport/Keyserver.java | 6 +- .../keychain/util/EmailKeyHelper.java | 3 +- 4 files changed, 48 insertions(+), 30 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java index d91dd28bc..4e68e76c5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java @@ -77,7 +77,7 @@ public class CloudSearch { // kill threads that haven't returned yet thread.interrupt(); } - } catch (InterruptedException e) { + } catch (InterruptedException ignored) { } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java index 5683decdf..7473705f3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java @@ -23,6 +23,7 @@ import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; + import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.pgp.PgpHelper; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; @@ -196,9 +197,9 @@ public class HkpKeyserver extends Keyserver { /** * returns a client with pinned certificate if necessary * - * @param url url to be queried by client + * @param url url to be queried by client * @param proxy proxy to be used by client - * @return client with a pinned certificate if necesary + * @return client with a pinned certificate if necessary */ public static OkHttpClient getClient(URL url, Proxy proxy) throws IOException { OkHttpClient client = new OkHttpClient(); @@ -232,7 +233,7 @@ public class HkpKeyserver extends Keyserver { OkHttpClient client = getClient(url, proxy); Response response = client.newCall(new Request.Builder().url(url).build()).execute(); - String responseBody = response.body().string();// contains body both in case of success or failure + String responseBody = response.body().string(); // contains body both in case of success or failure if (response.isSuccessful()) { return responseBody; @@ -242,17 +243,12 @@ public class HkpKeyserver extends Keyserver { } catch (IOException e) { Log.e(Constants.TAG, "IOException at HkpKeyserver", e); throw new QueryFailedException("Keyserver '" + mHost + "' is unavailable. Check your Internet connection!" + - proxy == null?"":" Using proxy " + proxy); + (proxy == null ? "" : " Using proxy " + proxy)); } } /** * Results are sorted by creation date of key! - * - * @param query - * @return - * @throws QueryFailedException - * @throws QueryNeedsRepairException */ @Override public ArrayList search(String query, Proxy proxy) throws QueryFailedException, @@ -303,30 +299,46 @@ public class HkpKeyserver extends Keyserver { entry.setQuery(query); entry.addOrigin(getUrlPrefix() + mHost + ":" + mPort); - int bitSize = Integer.parseInt(matcher.group(3)); - entry.setBitStrength(bitSize); - int algorithmId = Integer.decode(matcher.group(2)); - entry.setAlgorithm(KeyFormattingUtils.getAlgorithmInfo(algorithmId, bitSize, null)); - // group 1 contains the full fingerprint (v4) or the long key id if available // see https://bitbucket.org/skskeyserver/sks-keyserver/pull-request/12/fixes-for-machine-readable-indexes/diff String fingerprintOrKeyId = matcher.group(1).toLowerCase(Locale.ENGLISH); - if (fingerprintOrKeyId.length() > 16) { + if (fingerprintOrKeyId.length() == 40) { entry.setFingerprintHex(fingerprintOrKeyId); entry.setKeyIdHex("0x" + fingerprintOrKeyId.substring(fingerprintOrKeyId.length() - 16, fingerprintOrKeyId.length())); - } else { + } else if (fingerprintOrKeyId.length() == 16) { // set key id only entry.setKeyIdHex("0x" + fingerprintOrKeyId); + } else { + Log.e(Constants.TAG, "Wrong length for fingerprint/long key id."); + // skip this key + continue; } - final long creationDate = Long.parseLong(matcher.group(4)); - final GregorianCalendar tmpGreg = new GregorianCalendar(TimeZone.getTimeZone("UTC")); - tmpGreg.setTimeInMillis(creationDate * 1000); - entry.setDate(tmpGreg.getTime()); + try { + int bitSize = Integer.parseInt(matcher.group(3)); + entry.setBitStrength(bitSize); + int algorithmId = Integer.decode(matcher.group(2)); + entry.setAlgorithm(KeyFormattingUtils.getAlgorithmInfo(algorithmId, bitSize, null)); + + final long creationDate = Long.parseLong(matcher.group(4)); + final GregorianCalendar tmpGreg = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + tmpGreg.setTimeInMillis(creationDate * 1000); + entry.setDate(tmpGreg.getTime()); + } catch (NumberFormatException e) { + Log.e(Constants.TAG, "Conversation for bit size, algorithm, or creation date failed.", e); + // skip this key + continue; + } - entry.setRevoked(matcher.group(6).contains("r")); - entry.setExpired(matcher.group(6).contains("e")); + try { + entry.setRevoked(matcher.group(6).contains("r")); + entry.setExpired(matcher.group(6).contains("e")); + } catch (NullPointerException e) { + Log.e(Constants.TAG, "Check for revocation or expiry failed.", e); + // skip this key + continue; + } ArrayList userIds = new ArrayList<>(); final String uidLines = matcher.group(7); @@ -344,6 +356,10 @@ public class HkpKeyserver extends Keyserver { tmp = URLDecoder.decode(tmp, "UTF8"); } catch (UnsupportedEncodingException ignored) { // will never happen, because "UTF8" is supported + } catch (IllegalArgumentException e) { + Log.e(Constants.TAG, "User ID encoding broken", e); + // skip this user id + continue; } } userIds.add(tmp); @@ -367,11 +383,14 @@ public class HkpKeyserver extends Keyserver { Log.d(Constants.TAG, "Failed to get key at HkpKeyserver", httpError); throw new QueryFailedException("not found"); } + if (data == null) { + throw new QueryFailedException("data is null"); + } Matcher matcher = PgpHelper.PGP_PUBLIC_KEY.matcher(data); if (matcher.find()) { return matcher.group(1); } - return null; + throw new QueryFailedException("data is null"); } @Override @@ -422,7 +441,7 @@ public class HkpKeyserver extends Keyserver { * Tries to find a server responsible for a given domain * * @return A responsible Keyserver or null if not found. - * TODO: PHILIP Add proxy functionality + * TODO: Add proxy functionality */ public static HkpKeyserver resolve(String domain) { try { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/Keyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/Keyserver.java index 640b39f44..15e0d94e9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/Keyserver.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/Keyserver.java @@ -62,15 +62,15 @@ public abstract class Keyserver { * query too short _or_ too many responses */ public static class QueryTooShortOrTooManyResponsesException extends QueryNeedsRepairException { - private static final long serialVersionUID = 2703768928624654514L; + private static final long serialVersionUID = 2703768928624654518L; } public static class AddKeyException extends Exception { private static final long serialVersionUID = -507574859137295530L; } - public abstract List search(String query, Proxy proxy) throws QueryFailedException, - QueryNeedsRepairException; + public abstract List search(String query, Proxy proxy) + throws QueryFailedException, QueryNeedsRepairException; public abstract String get(String keyIdHex, Proxy proxy) throws QueryFailedException; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java index d7491ab26..9a6d33260 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java @@ -103,8 +103,7 @@ public class EmailKeyHelper { } } } - } catch (Keyserver.QueryFailedException ignored) { - } catch (Keyserver.QueryNeedsRepairException ignored) { + } catch (Keyserver.CloudSearchFailureException ignored) { } return new ArrayList<>(keys); } -- cgit v1.2.3