From 5ff3043903456e4c626053bd918c9f61b84b100c Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 30 Aug 2014 17:00:58 +0200 Subject: canonicalize: add check for algorithm type closes #797 --- .../keychain/pgp/UncachedKeyRing.java | 34 ++++++++++++++++++++-- .../keychain/service/OperationResultParcel.java | 6 ++-- OpenKeychain/src/main/res/values-es/strings.xml | 4 +-- OpenKeychain/src/main/res/values-fr/strings.xml | 4 +-- OpenKeychain/src/main/res/values-it/strings.xml | 4 +-- OpenKeychain/src/main/res/values-ja/strings.xml | 4 +-- OpenKeychain/src/main/res/values-uk/strings.xml | 4 +-- OpenKeychain/src/main/res/values/strings.xml | 6 ++-- 8 files changed, 50 insertions(+), 16 deletions(-) (limited to 'OpenKeychain/src') 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 f00383e0f..9fcd21b4b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java @@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.pgp; import org.spongycastle.bcpg.ArmoredOutputStream; +import org.spongycastle.bcpg.PublicKeyAlgorithmTags; import org.spongycastle.bcpg.SignatureSubpacketTags; import org.spongycastle.bcpg.sig.KeyFlags; import org.spongycastle.openpgp.PGPKeyFlags; @@ -219,6 +220,19 @@ public class UncachedKeyRing { aos.close(); } + // An array of known algorithms. Note this must be numerically sorted for binarySearch() to work! + static final int[] KNOWN_ALGORITHMS = new int[] { + PublicKeyAlgorithmTags.RSA_GENERAL, // 1 + PublicKeyAlgorithmTags.RSA_ENCRYPT, // 2 + PublicKeyAlgorithmTags.RSA_SIGN, // 3 + PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT, // 16 + PublicKeyAlgorithmTags.DSA, // 17 + PublicKeyAlgorithmTags.ECDH, // 18 + PublicKeyAlgorithmTags.ECDSA, // 19 + PublicKeyAlgorithmTags.ELGAMAL_GENERAL, // 20 + // PublicKeyAlgorithmTags.DIFFIE_HELLMAN, // 21 + }; + /** "Canonicalizes" a public key, removing inconsistencies in the process. * * More specifically: @@ -250,7 +264,7 @@ public class UncachedKeyRing { // do not accept v3 keys if (getVersion() <= 3) { - log.add(LogLevel.ERROR, LogType.MSG_KC_V3_KEY, indent); + log.add(LogLevel.ERROR, LogType.MSG_KC_ERROR_V3, indent); return null; } @@ -262,6 +276,12 @@ public class UncachedKeyRing { PGPPublicKey masterKey = mRing.getPublicKey(); final long masterKeyId = masterKey.getKeyID(); + if (Arrays.binarySearch(KNOWN_ALGORITHMS, masterKey.getAlgorithm()) < 0) { + log.add(LogLevel.ERROR, LogType.MSG_KC_ERROR_MASTER_ALGO, indent, + Integer.toString(masterKey.getAlgorithm())); + return null; + } + { log.add(LogLevel.DEBUG, LogType.MSG_KC_MASTER, indent, PgpKeyHelper.convertKeyIdToHex(masterKey.getKeyID())); @@ -490,7 +510,7 @@ public class UncachedKeyRing { // If NO user ids remain, error out! if (!modified.getUserIDs().hasNext()) { - log.add(LogLevel.ERROR, LogType.MSG_KC_FATAL_NO_UID, indent); + log.add(LogLevel.ERROR, LogType.MSG_KC_ERROR_NO_UID, indent); return null; } @@ -513,6 +533,16 @@ public class UncachedKeyRing { log.add(LogLevel.DEBUG, LogType.MSG_KC_SUB, indent, PgpKeyHelper.convertKeyIdToHex(key.getKeyID())); indent += 1; + + if (Arrays.binarySearch(KNOWN_ALGORITHMS, key.getAlgorithm()) < 0) { + ring = removeSubKey(ring, key); + + log.add(LogLevel.ERROR, LogType.MSG_KC_SUB_UNKNOWN_ALGO, indent, + Integer.toString(key.getAlgorithm())); + indent -= 1; + continue; + } + // A subkey needs exactly one subkey binding certificate, and optionally one revocation // certificate. PGPPublicKey modified = key; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java index 142bf65cc..fe699224b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java @@ -287,10 +287,11 @@ public class OperationResultParcel implements Parcelable { MSG_IS_SUCCESS (R.string.msg_is_success), // keyring canonicalization - MSG_KC_V3_KEY (R.string.msg_kc_v3_key), MSG_KC_PUBLIC (R.string.msg_kc_public), MSG_KC_SECRET (R.string.msg_kc_secret), - MSG_KC_FATAL_NO_UID (R.string.msg_kc_fatal_no_uid), + MSG_KC_ERROR_V3 (R.string.msg_kc_error_v3), + MSG_KC_ERROR_NO_UID (R.string.msg_kc_error_no_uid), + MSG_KC_ERROR_MASTER_ALGO (R.string.msg_kc_error_master_algo), MSG_KC_MASTER (R.string.msg_kc_master), MSG_KC_REVOKE_BAD_ERR (R.string.msg_kc_revoke_bad_err), MSG_KC_REVOKE_BAD_LOCAL (R.string.msg_kc_revoke_bad_local), @@ -314,6 +315,7 @@ public class OperationResultParcel implements Parcelable { MSG_KC_SUB_REVOKE_BAD_ERR (R.string.msg_kc_sub_revoke_bad_err), MSG_KC_SUB_REVOKE_BAD (R.string.msg_kc_sub_revoke_bad), MSG_KC_SUB_REVOKE_DUP (R.string.msg_kc_sub_revoke_dup), + MSG_KC_SUB_UNKNOWN_ALGO (R.string.msg_kc_sub_unknown_algo), MSG_KC_SUCCESS_BAD (R.plurals.msg_kc_success_bad), MSG_KC_SUCCESS_BAD_AND_RED (R.string.msg_kc_success_bad_and_red), MSG_KC_SUCCESS_REDUNDANT (R.plurals.msg_kc_success_redundant), diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml index 16d60dc82..bd72a4fed 100644 --- a/OpenKeychain/src/main/res/values-es/strings.xml +++ b/OpenKeychain/src/main/res/values-es/strings.xml @@ -457,7 +457,7 @@ Aplicando operación de inserción por lote. Se intentó importar un juego de claves (keyring) secreto como público. Esto es un fallo, por favor ¡consigne un informe! - Esta clave es una clave OpenPGP versión 3 y por tanto insegura. No ha sido importada. + Esta clave es una clave OpenPGP versión 3 y por tanto insegura. No ha sido importada. No se borró ninguna clave antigua (¿crear una nueva?) Clave antigua borrada de la base de datos La operación falló debido a un error de codificación @@ -524,7 +524,7 @@ Canonicalizando juego de claves público %s Canonicalizando juego de claves secreto %s - Fallo en la canonicalización de juego de claves: El juego de claves no tiene identificaciones de usuario válidas + Fallo en la canonicalización de juego de claves: El juego de claves no tiene identificaciones de usuario válidas Procesando clave maestra Eliminando certificado defectuoso de revocación de juego de claves Eliminando certificado de revocación de juego de claves, con distintivo \"local\" diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index f383ac40b..3aa0f1f5d 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -457,7 +457,7 @@ Application de l\'opération d\'insertion par lot. Tentative d\'importer le trousseau secret comme public. Ceci est un bogue, veuillez remplir un rapport ! - Cette clef est une clef d\'OpenPGP version 3 et n\'est, par conséquent, pas sécuritaire. Elle n\'a pas été importée. + Cette clef est une clef d\'OpenPGP version 3 et n\'est, par conséquent, pas sécuritaire. Elle n\'a pas été importée. Aucune ancienne clef de supprimée (création d\'une nouvelle ?) L\'ancienne clef a été supprimée de la base de données Échec de l\'opération causé par une erreur d\'encodage @@ -524,7 +524,7 @@ Canonicalisation du trousseau public %s Canonicalisation du trousseau secret %s - La canonicalisation du trousseau a échoué : le trousseau n\'a pas d\'ID d\'utilisateur valides + La canonicalisation du trousseau a échoué : le trousseau n\'a pas d\'ID d\'utilisateur valides Traitement de la clef maîtresse Suppression du mauvais certificat de révocation du trousseau Suppression du certificat de révocation du trousseau ayant le drapeau « local » diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml index e4e08ca78..b8707ab70 100644 --- a/OpenKeychain/src/main/res/values-it/strings.xml +++ b/OpenKeychain/src/main/res/values-it/strings.xml @@ -457,7 +457,7 @@ Applicazione inserimento operazioni in batch. Ho cercato di importare portachiavi privato come pubblico. Questo è un bug, per cortesia inviateci un rapporto! - Questa chiave è una chiave OpenPGP versione 3 e quindi non sicura. Non è stata importata. + Questa chiave è una chiave OpenPGP versione 3 e quindi non sicura. Non è stata importata. Nessuna vecchia chiave cancellata (stai creando una nuova?) Cancellate vecchie chiavi dal database Operazione fallita a causa di un errore di codifica @@ -524,7 +524,7 @@ Canonicalizzazione portachiavi pubblico %s Canonicalizzazione portachiavi segreto %s - Canonicalizzazione portachiavi fallita: il portachiavi non ha ID utenti validi + Canonicalizzazione portachiavi fallita: il portachiavi non ha ID utenti validi Elaborazione chiave principale Rimozione di certificato di revoca del portachiavi corrotto Rimozione certificato di revoca del portachiavi con caratteristica \"locale\" diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index 36cbe64b5..41426cb9b 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -444,7 +444,7 @@ 連続挿入処理を適用する。 秘密鍵の鍵輪を公開鍵としてインポートを試行しました。これはバグで、ファイルをレポートしてください! - この鍵はOpenPGP v3形式の鍵で安全ではありません。そのためインポートできません。 + この鍵はOpenPGP v3形式の鍵で安全ではありません。そのためインポートできません。 削除された古い鍵はありません (新しく作りますか?) データベースから古い鍵を削除しました エンコードエラーにより操作が失敗しました @@ -509,7 +509,7 @@ 公開鍵の鍵輪 %s の正規化中 秘密鍵の鍵輪 %s の正規化中 - 鍵輪の正規化に失敗: 鍵輪が正しいユーザIDを含んでいませんでした + 鍵輪の正規化に失敗: 鍵輪が正しいユーザIDを含んでいませんでした 主鍵処理中 問題のある鍵輪の破棄証明を破棄中 鍵輪のローカルフラグ付き破棄証明を破棄中 diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml index f1533f4f2..b94749ee5 100644 --- a/OpenKeychain/src/main/res/values-uk/strings.xml +++ b/OpenKeychain/src/main/res/values-uk/strings.xml @@ -463,7 +463,7 @@ Застосовується пакетна операція вставки. Спробували імпортувати секретну в\'язку як публічну. Це вада. Будь ласка, відправте звіт! - Цей ключ зроблений OpenPGP версії 3, а тому небезпечний. Його не можна імпортувати. + Цей ключ зроблений OpenPGP версії 3, а тому небезпечний. Його не можна імпортувати. Нема вилученого старого ключа (створюється новий?) Вилучений старий ключ з бази даних Операція не вдалася через помилку кодування @@ -531,7 +531,7 @@ Канонізація публічної в\'язки %s Канонізація секретної в\'язки %s - Невдала канонізація в\'язки: в\'язка не має дійсних ІД користувача + Невдала канонізація в\'язки: в\'язка не має дійсних ІД користувача Обробляється основний ключ… Опрацьовується підключ %s Тип сертифікату невідомого ключа: %s diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index d31a08081..8eb452df6 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -520,7 +520,6 @@ Applying insert batch operation. Tried to import secret keyring as public. This is a bug, please file a report! - This key is an OpenPGP version 3 key and thus insecure. It has not been imported. No old key deleted (creating a new one?) Deleted old key from database Operation failed due to encoding error @@ -589,7 +588,9 @@ Canonicalizing public keyring %s Canonicalizing secret keyring %s - Keyring canonicalization failed: Keyring has no valid user ids + This is an OpenPGP version 3 key, which have been deprecated and are no longer supported! + Keyring has no valid user ids! + The master key uses an unknown (%s) algorithm! Processing master key Removing bad keyring revocation certificate Removing keyring revocation certificate with "local" flag @@ -613,6 +614,7 @@ Removing bad subkey revocation certificate Removing bad subkey revocation certificate Removing redundant subkey revocation certificate + Subkey uses an unknown algorithm, not importing… Keyring canonicalization successful, no changes Keyring canonicalization successful, removed one erroneous certificate -- cgit v1.2.3