[GCrypt] Fix PK verification for ECDSA
authorzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 3 Jun 2017 10:27:13 +0000 (10:27 +0000)
committerzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 3 Jun 2017 10:27:13 +0000 (10:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172857

Reviewed by Michael Catanzaro.

No new tests -- covered by existing tests.

* crypto/gcrypt/CryptoAlgorithmECDSAGCrypt.cpp:
(WebCore::gcryptVerify): Return `true` if the verification succeeded or `false`
in any other case, avoiding spilling information about the exact cause of
verification failure.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@217753 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/crypto/gcrypt/CryptoAlgorithmECDSAGCrypt.cpp

index 0da741b..e7d8000 100644 (file)
@@ -1,3 +1,17 @@
+2017-06-03  Zan Dobersek  <zdobersek@igalia.com>
+
+        [GCrypt] Fix PK verification for ECDSA
+        https://bugs.webkit.org/show_bug.cgi?id=172857
+
+        Reviewed by Michael Catanzaro.
+
+        No new tests -- covered by existing tests.
+
+        * crypto/gcrypt/CryptoAlgorithmECDSAGCrypt.cpp:
+        (WebCore::gcryptVerify): Return `true` if the verification succeeded or `false`
+        in any other case, avoiding spilling information about the exact cause of
+        verification failure.
+
 2017-06-02  Zalan Bujtas  <zalan@apple.com>
 
         Cleanup FrameView::autoSizeIfEnabled.
index c611d94..dc8ce9b 100644 (file)
@@ -222,15 +222,11 @@ static std::optional<bool> gcryptVerify(gcry_sexp_t keySexp, const Vector<uint8_
         }
     }
 
-    // Perform the PK verification. We report success if there's no error returned, failure
-    // if the returned error is GPG_ERR_BAD_SIGNATURE, or an OperationError otherwise.
+    // Perform the PK verification. We report success if there's no error returned, or
+    // a failure in any other case. OperationError should not be returned at this point,
+    // avoiding spilling information about the exact cause of verification failure.
     error = gcry_pk_verify(signatureSexp, dataSexp, keySexp);
-    if (error != GPG_ERR_NO_ERROR && gcry_err_code(error) != GPG_ERR_BAD_SIGNATURE) {
-        PAL::GCrypt::logError(error);
-        return std::nullopt;
-    }
-
-    return error == GPG_ERR_NO_ERROR;
+    return { error == GPG_ERR_NO_ERROR };
 }
 
 void CryptoAlgorithmECDSA::platformSign(std::unique_ptr<CryptoAlgorithmParameters>&& parameters, Ref<CryptoKey>&& key, Vector<uint8_t>&& data, VectorCallback&& callback, ExceptionCallback&& exceptionCallback, ScriptExecutionContext& context, WorkQueue& workQueue)