From 011762c4bdbb03627230194fb8933a2515413720 Mon Sep 17 00:00:00 2001 From: Mingshen Sun Date: Sun, 10 Jan 2021 15:01:21 -0800 Subject: [PATCH] Fix decryption issue when key without passphrase set --- passKit/Crypto/GopenPGPInterface.swift | 9 +- passKitTests/Crypto/CryptoFrameworkTest.swift | 10 +- passKitTests/Crypto/PGPAgentTest.swift | 1 + passKitTests/Testbase/TestPGPKeys.swift | 135 ++++++++++++++++++ 4 files changed, 153 insertions(+), 2 deletions(-) diff --git a/passKit/Crypto/GopenPGPInterface.swift b/passKit/Crypto/GopenPGPInterface.swift index 5dc9529..58fb65d 100644 --- a/passKit/Crypto/GopenPGPInterface.swift +++ b/passKit/Crypto/GopenPGPInterface.swift @@ -84,7 +84,14 @@ struct GopenPGPInterface: PGPInterface { } do { - let unlockedKey = try privateKey.unlock(passphrase.data(using: .utf8)) + var isLocked: ObjCBool = false + try privateKey.isLocked(&isLocked) + var unlockedKey: CryptoKey! + if isLocked.boolValue { + unlockedKey = try privateKey.unlock(passphrase.data(using: .utf8)) + } else { + unlockedKey = privateKey + } var error: NSError? guard let keyRing = CryptoNewKeyRing(unlockedKey, &error) else { diff --git a/passKitTests/Crypto/CryptoFrameworkTest.swift b/passKitTests/Crypto/CryptoFrameworkTest.swift index a12d6af..e260d3c 100644 --- a/passKitTests/Crypto/CryptoFrameworkTest.swift +++ b/passKitTests/Crypto/CryptoFrameworkTest.swift @@ -39,6 +39,7 @@ class CryptoFrameworkTest: XCTestCase { try [ RSA2048, RSA2048_SUB, + RSA3072_NO_PASSPHRASE, RSA4096, RSA4096_SUB, ED25519, @@ -55,7 +56,14 @@ class CryptoFrameworkTest: XCTestCase { XCTAssert(publicKey.getHexKeyID().hasSuffix(testKeyInfo.fingerprint)) XCTAssertNil(error) - let unlockedKey = try privateKey.unlock(testKeyInfo.passphrase.data(using: .utf8)) + var isLocked: ObjCBool = false + try privateKey.isLocked(&isLocked) + var unlockedKey: CryptoKey! + if isLocked.boolValue { + unlockedKey = try privateKey.unlock(testKeyInfo.passphrase.data(using: .utf8)) + } else { + unlockedKey = privateKey + } let encryptedMessage = try CryptoNewKeyRing(publicKey, &error)?.encrypt(plainMessage, privateKey: nil) let decryptedData = try CryptoNewKeyRing(unlockedKey, &error)?.decrypt(messageConverter(encryptedMessage!, &error), verifyKey: nil, verifyTime: 0) XCTAssertNil(error) diff --git a/passKitTests/Crypto/PGPAgentTest.swift b/passKitTests/Crypto/PGPAgentTest.swift index 3846b4c..5102773 100644 --- a/passKitTests/Crypto/PGPAgentTest.swift +++ b/passKitTests/Crypto/PGPAgentTest.swift @@ -64,6 +64,7 @@ class PGPAgentTest: XCTestCase { try [ RSA2048, RSA2048_SUB, + RSA3072_NO_PASSPHRASE, RSA4096, RSA4096_SUB, ED25519, diff --git a/passKitTests/Testbase/TestPGPKeys.swift b/passKitTests/Testbase/TestPGPKeys.swift index 7c09bdc..052b65a 100644 --- a/passKitTests/Testbase/TestPGPKeys.swift +++ b/passKitTests/Testbase/TestPGPKeys.swift @@ -45,6 +45,13 @@ let RSA2048_SUB = PGPTestSet( passphrase: "passforios" ) +let RSA3072_NO_PASSPHRASE = PGPTestSet( + publicKey: PGP_RSA3072_PUBLIC_KEY_NO_PASSPHRASE, + privateKey: PGP_RSA3072_PRIVATE_KEY_NO_PASSPHRASE, + fingerprint: "be0f9402", + passphrase: "" +) + let RSA4096 = PGPTestSet( publicKey: PGP_RSA4096_PUBLIC_KEY, privateKey: PGP_RSA4096_PRIVATE_KEY, @@ -242,6 +249,134 @@ XY0AlWAbvH1ytWboh+CgS493JfZbNRCXTWA/BDE= -----END PGP PRIVATE KEY BLOCK----- """ +let PGP_RSA3072_PUBLIC_KEY_NO_PASSPHRASE = """ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +dsDN96T3b3dNsR/uHBUhQKv54B58lQ== +=w+7J +-----END PGP PUBLIC KEY BLOCK----- +""" + +let PGP_RSA3072_PRIVATE_KEY_NO_PASSPHRASE = """ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lQVYBF/7glwBDADT/Dg/3qnxErfF5ecGPx2knW2EUuD/dPSKNyo3ln3p0MnUuo+L +KI7NpHxZjynyW8XPqhmW310KRo6oqtkr0AF1IdA2YFiGYrWAoNsY+JWWe0tKG5kX +RiAaPlW38lB0fVUIMo/rJcJIufTs6kI1vPuyjKUEz7EiWaCgxlJewDwyQaXGKR3r +WrA98i3VGnDe9/6zf9i3MF4mQFnOWhKPIJH5m5ywECcenEXf+KcHsomxQF7cMzS+ +Afn9eR9fQd+HrIXvyYSl3ZmQR3thMHoZmEE6sUq8S+wcLhQPFD/P3ZlfzuPRmlxk +qwv3hTFMp2Lo+nnIc7F6hhPYmaZGDXNwDtkjBRztyW+sxYQkp92WsTCnrIAgyl6X +nMRpuMlhToPUltF2+Msym/6MmuDAxgEIKkd2MMpLxwSdeWr/3TvGiMrOgvspQYX7 ++uAkrQhA5jfm2hKDhmyIMS1e6ns6yfVM1QxQszZFosUjOF1+RnykB3rNb3i3mtbF +CqDBcB4nFP7J4ekAEQEAAQAL/R1jkRwlugjD2rozJTlupE+Z9cDLyV672lqTyvoO +6/ZFAx5Hc7bMENQ+EsagfE/Eh7hCca7C2RV0x7q8M5neihKGSrqnK863E55kGUwC +dqFOBuzyG4zS+jNj401lE4tlhCrmm6Dy81b9f5EdlGqlKyigqrtv3IkRxPJVMb6U +xyOuiere8MNxfLqcfzHVVcL2aGzT83nI2QdTkj/IqVxcxxrEXKTkxbpO2bnIhsZL +QHSpox0YdPOctt78clbUp/FEKm14nwRfiIbs2kF7sKkrK8s+INs5gMjo73CFJJwD +Kd3aZukPANalkSma9pcttuin0n43TmDJb4ksqar/RgC86NbLGVE+0CkhokCkWEMQ +os9wkZEg3G9YmpUECNCKP4J5hZ5WWm03qYGdVU83JxkYU50Hq8xqPl/pkaxpx5kH +2OpMPsxalqa0imW/tF89IgizrE+sUVHeLcGEc0h3if73EUAESKvHl9J+16WGek02 +qGMbb3kN0OtaG22P+Zk8fYUnYwYA35KHBd/Yz9dCL7F6zWbVGuD1x9s9CgpeoNc/ +htNErLKtL9Il9xWR5Q4k4SjxsWTgFklVRJvt6VCNoMwYQfwRact0ZY6d+XqdBPfv +NSz7Gp9Bv2bQvPHagD2Y+rMKzDykBYq45CoZIRKi/7YR6gSoOXvS9eR0dPvkW5TC +oLeVI8C61ACELWgGF9GTHVqN5290jfhyYqFYr4QWIadryD/RUT9tfju5Kzo5CAno +A831A3/8mJ3I1D5Ox1V2pIsuOL77BgDyu3MqNeaM9cMLBNn1mYTGmPfsN4FyiVte +PwkXLi7lkLxxvrEuSPr8PrNv23UP5HD3hCwhe6vjb84FtQlNDOOncE6GQ1+FD9+N +AtJ659jGiwPn0Txaz0zNAGw8DQFoAgqL9U2KCe0V34NT+yB4T7mLEKLTHGGF3vlX +R7eFIfB30TbwNaW8BOsWoG0PB18OD+BwgVJdSe2SqNzFsVs3Nekcs9KLck859PZo +XH1hVTnVatrPgr1acTmSbyrn+4i8/WsGAMjxYuvGFVhrIlrbi2WwrEzsbcIw6dXN +Zm8amqCoiUknoOpxDwlNakiDDGwYwLMoeO+rvkKXIIjMvDnJKL7UlLn0WjPrOpvF +KM+iM1LuqG7NgR9JEzGyWj/+N4+xux442YRt3CQWFdJy/lNwzF0e23tkUbjgak41 +tAk3aynk+Pln+7iwsBpaUs++1U1FdjPxcMpmcB64YNUSDbeLyXvfhtp4uBuBiOxr +dgSh6iYHXtrLVBX3l1dIuS131HBF2hr7IungtCpwYXNzZm9yaW9zIDxkZXZlbG9w +ZXJAcGFzc2Zvcmlvcy5tc3N1bi5tZT6JAc4EEwEIADgWIQSzfNVmmgPw1Gc1oro1 ++6PQvg+UAgUCX/uCXAIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRA1+6PQ +vg+UAvcWC/4pXMnC8/J9eP7mp4znqNT8oFJbihYukxJ1kB4tfQBHzTTutg8y5F7G +7CuXxi7+U24r8rrS+oFR634g7GgQLCxSvcy6WB0vRLMybyrAGnrKCh5K4mEl+/Q8 +w2AdMHG67yEs5kLerLBNxS26tLpqwVX2Nh8JxCQkatM531HZNxoSMK/dsoaboSXY +sZpZHZGjXEPR/3YaAHugl0fpZufeFTjyGSe48FlzYycRBN6Pn4ImhMxUE21/uxJa +nQHHbp4eqxihkBEWwo4oDsVJ8aIFyd4b0FU0sqMX3u7Uf5BrPl4T9H62ftNaAZD0 +yveI1gIvjXfFlBQWXQ7EvoWRAJsHw99dacDG7SEL0vdTb69CPEVso2bAwwt1Y8TC +8SzovMAB3TWsxs+jUGxHoH9gSSoGMQ0iOS3DXB/4yRv+y9ESemTx2IrBPY8WLRg8 +x5zg5LL0GhePW3cGYfliMD+70hlRl7Hn+giEW+80L0luWAWilZvqO2sxyR3hKNkv +JhUZBXaduoydBVgEX/uCXAEMANbwAaC+1eV0ZUw6YlHHHWLMqExmYLnC0o41f/e+ +85tdYKHI20RlGdt/3Bcoa/xBuQBFElHJWX6r3Q0W0IXNQAmJTtagnn5hv1l+FD1F +zF3cXk7ZhKfW5ibelwjv+qfe/JJiAPuQKOElIG/RFt18KSut9n7XQQRwbKX3FWlz +N2D9jiIP0o8eNO9QBosVLtQXKepSCQtVJc0a22FxeJ2SfluavFxeesXolItyxidU +Bvs0pZ5Yu/BcvREd5Kf9srmJV4s5wvgWB6pQ/5U3Cf5VXgA/8dJG9mE5YN3/YZbw +TWLdADEweYTqPw/Sn+hLiYNDsITreSlgySFaov5QczrM+yFB/9mJWaPg+NNy9yET +PRYpu1EowPPLoizSELISoyaNun/o9nGazNPtsLILMXWGhA+MoX2HeUa0vC3QlVon +lXGc9lQeZdjALZIV8tBbkMSguFm38Lr1au2TGdTup7juZlo+Y+b0NEcT1NvtGRj1 +Cv8+wsa/K68ssuC3dSesy29giwARAQABAAv9END7V5/GrWqjaEjjG2HYPzwi6MNT +ywTeo2i1J+WFOsEeB9pmqV29napNxnQPqs9bkZVV3xdBTMNWiqkfzHAoE/btt6Ye +cGXmajKOk9KrsCZHLKUhF16daCofKABanJq6KRvI1uXLBP56ILV7s/18XSIBuJ/P +wvCm139S6gqtKQX9glW5lB/5ZUXeFTCllstvKJmdgoj5aagxxNhzZuSoxTMAjLuJ +oIVXZeencDlHSI0wbgikP6SJ2FZ95tTXEGQZ1AoO4SMoS1KY+A0gyZTitWEuI2wZ +3XYDTtQXDI9flmeVWvM1NCQQstK4E2lWePUtK01vUr68RVHas91oyQu/3ngbwEsH +EwYYjQkQnK4cQjqT2OjBSrneBDnc5OglhdzYGQuNPMKjURIJJ239TJbWKzBpxgSZ +khRJJDD3KuXugmNw3nblHMjAOHlRU9Fvb3ABhDDMZH7j4gRqNJBa/PGFkifGS6L1 +5Yg2J4Kxwut+TXOYP/S/lqVpa/O9KO3N6eDpBgDaNQgFije+TSZkz13vzMV0f4iY +3ZPdTDiofC6RhqBBCJeR5RJaaDhw05xzlJD3KkYpnp18NY8OAbLopqv1Wy1211u4 +6ro4RITS9AAXAOGJtsg62DebhhQbEMjZIInFMP2OINBnsc5C+6dVlPMWrB2JZWKZ +BsHLrRKjq2gqu8n1/7vLxBmoVEzmWk9/LCwQUHLJod0Bm6C8XV5hV3x9TzN3MLuL +tubSnHOZS6cmIcu+HgSnrkD40vnQC5++ptgPY8MGAPwqATWyKNFVo5XNNNiN0t9I +6QHH+10DtejOEhyh9iLlBXdAAxH6+1F2vkAyK9UVvU+pfbrlVBWwDyDQ9qdzAYD6 +eCv2zNnqgpLzXLQC+7JzmEVXMRM3A54UmkNjQws4V+XkSxGhS6r299as+h3XcSHY +nNu/OIHztJl+DanJb/Nw7j/FVkPzGrMYYxRWDJCYBNkJ5Ad44Bb7wYsti8bK4lIy +wXlbiBgrzmoOMnxcaPiW3AzK/fbhhUXV12yFGOkrmQYAq7VGkAjeqTAsWNHsts5R +WeOdPaetaqa2ZTQb8foj+0WIuSARIfDanlvWJ2NE+c2yHWftp7tblm8i//vgNH5D +MuwfzKOYyO+BWGaqBg9QUJ24mRaFTf7CKX30pRAK41eF1sSMJKNnMYrIQVM2+JY/ +cmRjDYE6yJCm5fXajvIaW7VsLQq8cMJXKFxEIOllrTsufvn8cYUczZ2Q2vcnAFK5 +1gXpL/QC824S6NYmWYCAGnb+C5EhkuEcgG4lDuWPrqO+4fOJAbYEGAEIACAWIQSz +fNVmmgPw1Gc1oro1+6PQvg+UAgUCX/uCXAIbDAAKCRA1+6PQvg+UAoZmC/4p+XIQ +eUTehpUktxvHhXT8ubtjGuYFOzbV4bABArIHD/vwRj1M2GEfSZoRsFjAMiVsMO0B +iLpn4So8Df/LLp6LWyLNrjjRXNUC0TBGHwDf2TXT7rNtfUzxJKnndvh0787v7Gb9 +zc8Y+TCqoQ//JRRzelq6TDUk34M6BlQQ08HCMi5tPcpYVp9uuJRseF4EygckLpx9 +QrY8/HUhvG82RlyefuSHYKodreVH0CvETz4MDoVF+74u5kK7hgqTMNusxNhuWdDP +8HBPgs9rI68BTBCh8fT5cnAKk9MnnLeHngxROkxmZ/JwSDnj3XZeQojolqje+mYn +Jq86abSn/YwBMu+7jBdVx1TmwFGmM4uSpXfB6dE04hJHdIEvt2wele3CmSdGgEqF +DIXXpDcu9tlHaQY/OSxRGukOmfoAXhz1kI2Wp/l0LNKAUyRlfTCEF67dv/vRiU7u +YHzWfGKfLaCyHJ6rWg4EwweOgvx88HbAzfek9293TbEf7hwVIUCr+eAefJU= +=/IMN +-----END PGP PRIVATE KEY BLOCK----- +""" + let PGP_RSA4096_PUBLIC_KEY = """ -----BEGIN PGP PUBLIC KEY BLOCK-----