WebKit Bugzilla
Attachment 343587 Details for
Bug 187033
: [GCrypt] Move definitions of GCryptUtilities helpers into a separate source file
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-187033-20180626083054.patch (text/plain), 16.32 KB, created by
Zan Dobersek
on 2018-06-25 23:30:55 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Zan Dobersek
Created:
2018-06-25 23:30:55 PDT
Size:
16.32 KB
patch
obsolete
>Subversion Revision: 233190 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index e7623c788adec1e7390dbb9fc19824c187ceae92..4753f63d7c51a71098a8b934ba734e6670a7718e 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,33 @@ >+2018-06-25 Zan Dobersek <zdobersek@igalia.com> >+ >+ [GCrypt] Move definitions of GCryptUtilities helpers into a separate source file >+ https://bugs.webkit.org/show_bug.cgi?id=187033 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Move the GCryptUtilities helpers that operate on libgcrypt values and >+ constants into a separate source file. This limits a bit the amount of >+ inlining the compiler might feel compelled to do, and the resulting >+ shared library is 8kB smaller in size. >+ >+ * crypto/gcrypt/GCryptUtilities.cpp: Copied from Source/WebCore/crypto/gcrypt/GCryptUtilities.h. >+ (WebCore::hmacAlgorithm): >+ (WebCore::digestAlgorithm): >+ (WebCore::hashCryptoDigestAlgorithm): >+ (WebCore::mpiLength): >+ (WebCore::mpiData): >+ (WebCore::mpiZeroPrefixedData): >+ (WebCore::mpiSignedData): >+ * crypto/gcrypt/GCryptUtilities.h: >+ (WebCore::hmacAlgorithm): Deleted. >+ (WebCore::digestAlgorithm): Deleted. >+ (WebCore::hashCryptoDigestAlgorithm): Deleted. >+ (WebCore::mpiLength): Deleted. >+ (WebCore::mpiData): Deleted. >+ (WebCore::mpiZeroPrefixedData): Deleted. >+ (WebCore::mpiSignedData): Deleted. >+ * platform/SourcesGCrypt.txt: >+ > 2018-06-25 Keith Rollin <krollin@apple.com> > > Adjust WEBCORE_EXPORT annotations for LTO >diff --git a/Source/WebCore/crypto/gcrypt/GCryptUtilities.cpp b/Source/WebCore/crypto/gcrypt/GCryptUtilities.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..092eef7da467ebc4f30ebcc5026d49900104e9a3 >--- /dev/null >+++ b/Source/WebCore/crypto/gcrypt/GCryptUtilities.cpp >@@ -0,0 +1,210 @@ >+/* >+ * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017 Metrological Group B.V. >+ * Copyright (C) 2017 Igalia S.L. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "GCryptUtilities.h" >+ >+namespace WebCore { >+ >+std::optional<const char*> hashAlgorithmName(CryptoAlgorithmIdentifier identifier) >+{ >+ switch (identifier) { >+ case CryptoAlgorithmIdentifier::SHA_1: >+ return "sha1"; >+ case CryptoAlgorithmIdentifier::SHA_224: >+ return "sha224"; >+ case CryptoAlgorithmIdentifier::SHA_256: >+ return "sha256"; >+ case CryptoAlgorithmIdentifier::SHA_384: >+ return "sha384"; >+ case CryptoAlgorithmIdentifier::SHA_512: >+ return "sha512"; >+ default: >+ return std::nullopt; >+ } >+} >+ >+std::optional<int> hmacAlgorithm(CryptoAlgorithmIdentifier identifier) >+{ >+ switch (identifier) { >+ case CryptoAlgorithmIdentifier::SHA_1: >+ return GCRY_MAC_HMAC_SHA1; >+ case CryptoAlgorithmIdentifier::SHA_224: >+ return GCRY_MAC_HMAC_SHA224; >+ case CryptoAlgorithmIdentifier::SHA_256: >+ return GCRY_MAC_HMAC_SHA256; >+ case CryptoAlgorithmIdentifier::SHA_384: >+ return GCRY_MAC_HMAC_SHA384; >+ case CryptoAlgorithmIdentifier::SHA_512: >+ return GCRY_MAC_HMAC_SHA512; >+ default: >+ return std::nullopt; >+ } >+} >+ >+std::optional<int> digestAlgorithm(CryptoAlgorithmIdentifier identifier) >+{ >+ switch (identifier) { >+ case CryptoAlgorithmIdentifier::SHA_1: >+ return GCRY_MD_SHA1; >+ case CryptoAlgorithmIdentifier::SHA_224: >+ return GCRY_MD_SHA224; >+ case CryptoAlgorithmIdentifier::SHA_256: >+ return GCRY_MD_SHA256; >+ case CryptoAlgorithmIdentifier::SHA_384: >+ return GCRY_MD_SHA384; >+ case CryptoAlgorithmIdentifier::SHA_512: >+ return GCRY_MD_SHA512; >+ default: >+ return std::nullopt; >+ } >+} >+ >+std::optional<PAL::CryptoDigest::Algorithm> hashCryptoDigestAlgorithm(CryptoAlgorithmIdentifier identifier) >+{ >+ switch (identifier) { >+ case CryptoAlgorithmIdentifier::SHA_1: >+ return PAL::CryptoDigest::Algorithm::SHA_1; >+ case CryptoAlgorithmIdentifier::SHA_224: >+ return PAL::CryptoDigest::Algorithm::SHA_224; >+ case CryptoAlgorithmIdentifier::SHA_256: >+ return PAL::CryptoDigest::Algorithm::SHA_256; >+ case CryptoAlgorithmIdentifier::SHA_384: >+ return PAL::CryptoDigest::Algorithm::SHA_384; >+ case CryptoAlgorithmIdentifier::SHA_512: >+ return PAL::CryptoDigest::Algorithm::SHA_512; >+ default: >+ return std::nullopt; >+ } >+} >+ >+std::optional<size_t> mpiLength(gcry_mpi_t paramMPI) >+{ >+ // Retrieve the MPI length for the unsigned format. >+ size_t dataLength = 0; >+ gcry_error_t error = gcry_mpi_print(GCRYMPI_FMT_USG, nullptr, 0, &dataLength, paramMPI); >+ if (error != GPG_ERR_NO_ERROR) { >+ PAL::GCrypt::logError(error); >+ return std::nullopt; >+ } >+ >+ return dataLength; >+} >+ >+std::optional<size_t> mpiLength(gcry_sexp_t paramSexp) >+{ >+ // Retrieve the MPI value stored in the s-expression: (name mpi-data) >+ PAL::GCrypt::Handle<gcry_mpi_t> paramMPI(gcry_sexp_nth_mpi(paramSexp, 1, GCRYMPI_FMT_USG)); >+ if (!paramMPI) >+ return std::nullopt; >+ >+ return mpiLength(paramMPI); >+} >+ >+std::optional<Vector<uint8_t>> mpiData(gcry_mpi_t paramMPI) >+{ >+ // Retrieve the MPI length. >+ auto length = mpiLength(paramMPI); >+ if (!length) >+ return std::nullopt; >+ >+ // Copy the MPI data into a properly-sized buffer. >+ Vector<uint8_t> output(*length); >+ gcry_error_t error = gcry_mpi_print(GCRYMPI_FMT_USG, output.data(), output.size(), nullptr, paramMPI); >+ if (error != GPG_ERR_NO_ERROR) { >+ PAL::GCrypt::logError(error); >+ return std::nullopt; >+ } >+ >+ return output; >+} >+ >+std::optional<Vector<uint8_t>> mpiZeroPrefixedData(gcry_mpi_t paramMPI, size_t targetLength) >+{ >+ // Retrieve the MPI length. Bail if the retrieved length is longer than target length. >+ auto length = mpiLength(paramMPI); >+ if (!length || *length > targetLength) >+ return std::nullopt; >+ >+ // Fill out the output buffer with zeros. Properly determine the zero prefix length, >+ // and copy the MPI data into memory area following the prefix (if any). >+ Vector<uint8_t> output(targetLength, 0); >+ size_t prefixLength = targetLength - *length; >+ gcry_error_t error = gcry_mpi_print(GCRYMPI_FMT_USG, output.data() + prefixLength, targetLength, nullptr, paramMPI); >+ if (error != GPG_ERR_NO_ERROR) { >+ PAL::GCrypt::logError(error); >+ return std::nullopt; >+ } >+ >+ return output; >+} >+ >+std::optional<Vector<uint8_t>> mpiData(gcry_sexp_t paramSexp) >+{ >+ // Retrieve the MPI value stored in the s-expression: (name mpi-data) >+ PAL::GCrypt::Handle<gcry_mpi_t> paramMPI(gcry_sexp_nth_mpi(paramSexp, 1, GCRYMPI_FMT_USG)); >+ if (!paramMPI) >+ return std::nullopt; >+ >+ return mpiData(paramMPI); >+} >+ >+std::optional<Vector<uint8_t>> mpiZeroPrefixedData(gcry_sexp_t paramSexp, size_t targetLength) >+{ >+ // Retrieve the MPI value stored in the s-expression: (name mpi-data) >+ PAL::GCrypt::Handle<gcry_mpi_t> paramMPI(gcry_sexp_nth_mpi(paramSexp, 1, GCRYMPI_FMT_USG)); >+ if (!paramMPI) >+ return std::nullopt; >+ >+ return mpiZeroPrefixedData(paramMPI, targetLength); >+} >+ >+std::optional<Vector<uint8_t>> mpiSignedData(gcry_mpi_t mpi) >+{ >+ auto data = mpiData(mpi); >+ if (!data) >+ return std::nullopt; >+ >+ if (data->at(0) & 0x80) >+ data->insert(0, 0x00); >+ >+ return data; >+} >+ >+std::optional<Vector<uint8_t>> mpiSignedData(gcry_sexp_t paramSexp) >+{ >+ auto data = mpiData(paramSexp); >+ if (!data) >+ return std::nullopt; >+ >+ if (data->at(0) & 0x80) >+ data->insert(0, 0x00); >+ >+ return data; >+} >+ >+} // namespace WebCore >diff --git a/Source/WebCore/crypto/gcrypt/GCryptUtilities.h b/Source/WebCore/crypto/gcrypt/GCryptUtilities.h >index d9a67c6d1ea2bbcfa817d99908fb4d0fe32dfb1d..f0a413456a94459958f9a7f02545344b5fb6c3e5 100644 >--- a/Source/WebCore/crypto/gcrypt/GCryptUtilities.h >+++ b/Source/WebCore/crypto/gcrypt/GCryptUtilities.h >@@ -67,181 +67,19 @@ static inline bool matches(const void* lhs, size_t size, const std::array<uint8_ > > } // namespace CryptoConstants > >-static inline std::optional<const char*> hashAlgorithmName(CryptoAlgorithmIdentifier identifier) >-{ >- switch (identifier) { >- case CryptoAlgorithmIdentifier::SHA_1: >- return "sha1"; >- case CryptoAlgorithmIdentifier::SHA_224: >- return "sha224"; >- case CryptoAlgorithmIdentifier::SHA_256: >- return "sha256"; >- case CryptoAlgorithmIdentifier::SHA_384: >- return "sha384"; >- case CryptoAlgorithmIdentifier::SHA_512: >- return "sha512"; >- default: >- return std::nullopt; >- } >-} >- >-static inline std::optional<int> hmacAlgorithm(CryptoAlgorithmIdentifier identifier) >-{ >- switch (identifier) { >- case CryptoAlgorithmIdentifier::SHA_1: >- return GCRY_MAC_HMAC_SHA1; >- case CryptoAlgorithmIdentifier::SHA_224: >- return GCRY_MAC_HMAC_SHA224; >- case CryptoAlgorithmIdentifier::SHA_256: >- return GCRY_MAC_HMAC_SHA256; >- case CryptoAlgorithmIdentifier::SHA_384: >- return GCRY_MAC_HMAC_SHA384; >- case CryptoAlgorithmIdentifier::SHA_512: >- return GCRY_MAC_HMAC_SHA512; >- default: >- return std::nullopt; >- } >-} >- >-static inline std::optional<int> digestAlgorithm(CryptoAlgorithmIdentifier identifier) >-{ >- switch (identifier) { >- case CryptoAlgorithmIdentifier::SHA_1: >- return GCRY_MD_SHA1; >- case CryptoAlgorithmIdentifier::SHA_224: >- return GCRY_MD_SHA224; >- case CryptoAlgorithmIdentifier::SHA_256: >- return GCRY_MD_SHA256; >- case CryptoAlgorithmIdentifier::SHA_384: >- return GCRY_MD_SHA384; >- case CryptoAlgorithmIdentifier::SHA_512: >- return GCRY_MD_SHA512; >- default: >- return std::nullopt; >- } >-} >- >-static inline std::optional<PAL::CryptoDigest::Algorithm> hashCryptoDigestAlgorithm(CryptoAlgorithmIdentifier identifier) >-{ >- switch (identifier) { >- case CryptoAlgorithmIdentifier::SHA_1: >- return PAL::CryptoDigest::Algorithm::SHA_1; >- case CryptoAlgorithmIdentifier::SHA_224: >- return PAL::CryptoDigest::Algorithm::SHA_224; >- case CryptoAlgorithmIdentifier::SHA_256: >- return PAL::CryptoDigest::Algorithm::SHA_256; >- case CryptoAlgorithmIdentifier::SHA_384: >- return PAL::CryptoDigest::Algorithm::SHA_384; >- case CryptoAlgorithmIdentifier::SHA_512: >- return PAL::CryptoDigest::Algorithm::SHA_512; >- default: >- return std::nullopt; >- } >-} >- >-static inline std::optional<size_t> mpiLength(gcry_mpi_t paramMPI) >-{ >- // Retrieve the MPI length for the unsigned format. >- size_t dataLength = 0; >- gcry_error_t error = gcry_mpi_print(GCRYMPI_FMT_USG, nullptr, 0, &dataLength, paramMPI); >- if (error != GPG_ERR_NO_ERROR) { >- PAL::GCrypt::logError(error); >- return std::nullopt; >- } >- >- return dataLength; >-} >- >-static inline std::optional<size_t> mpiLength(gcry_sexp_t paramSexp) >-{ >- // Retrieve the MPI value stored in the s-expression: (name mpi-data) >- PAL::GCrypt::Handle<gcry_mpi_t> paramMPI(gcry_sexp_nth_mpi(paramSexp, 1, GCRYMPI_FMT_USG)); >- if (!paramMPI) >- return std::nullopt; >- >- return mpiLength(paramMPI); >-} >- >-static inline std::optional<Vector<uint8_t>> mpiData(gcry_mpi_t paramMPI) >-{ >- // Retrieve the MPI length. >- auto length = mpiLength(paramMPI); >- if (!length) >- return std::nullopt; >- >- // Copy the MPI data into a properly-sized buffer. >- Vector<uint8_t> output(*length); >- gcry_error_t error = gcry_mpi_print(GCRYMPI_FMT_USG, output.data(), output.size(), nullptr, paramMPI); >- if (error != GPG_ERR_NO_ERROR) { >- PAL::GCrypt::logError(error); >- return std::nullopt; >- } >- >- return output; >-} >- >-static inline std::optional<Vector<uint8_t>> mpiZeroPrefixedData(gcry_mpi_t paramMPI, size_t targetLength) >-{ >- // Retrieve the MPI length. Bail if the retrieved length is longer than target length. >- auto length = mpiLength(paramMPI); >- if (!length || *length > targetLength) >- return std::nullopt; >- >- // Fill out the output buffer with zeros. Properly determine the zero prefix length, >- // and copy the MPI data into memory area following the prefix (if any). >- Vector<uint8_t> output(targetLength, 0); >- size_t prefixLength = targetLength - *length; >- gcry_error_t error = gcry_mpi_print(GCRYMPI_FMT_USG, output.data() + prefixLength, targetLength, nullptr, paramMPI); >- if (error != GPG_ERR_NO_ERROR) { >- PAL::GCrypt::logError(error); >- return std::nullopt; >- } >- >- return output; >-} >- >-static inline std::optional<Vector<uint8_t>> mpiData(gcry_sexp_t paramSexp) >-{ >- // Retrieve the MPI value stored in the s-expression: (name mpi-data) >- PAL::GCrypt::Handle<gcry_mpi_t> paramMPI(gcry_sexp_nth_mpi(paramSexp, 1, GCRYMPI_FMT_USG)); >- if (!paramMPI) >- return std::nullopt; >- >- return mpiData(paramMPI); >-} >- >-static inline std::optional<Vector<uint8_t>> mpiZeroPrefixedData(gcry_sexp_t paramSexp, size_t targetLength) >-{ >- // Retrieve the MPI value stored in the s-expression: (name mpi-data) >- PAL::GCrypt::Handle<gcry_mpi_t> paramMPI(gcry_sexp_nth_mpi(paramSexp, 1, GCRYMPI_FMT_USG)); >- if (!paramMPI) >- return std::nullopt; >- >- return mpiZeroPrefixedData(paramMPI, targetLength); >-} >- >-static inline std::optional<Vector<uint8_t>> mpiSignedData(gcry_mpi_t mpi) >-{ >- auto data = mpiData(mpi); >- if (!data) >- return std::nullopt; >- >- if (data->at(0) & 0x80) >- data->insert(0, 0x00); >- >- return data; >-} >- >-static inline std::optional<Vector<uint8_t>> mpiSignedData(gcry_sexp_t paramSexp) >-{ >- auto data = mpiData(paramSexp); >- if (!data) >- return std::nullopt; >- >- if (data->at(0) & 0x80) >- data->insert(0, 0x00); >- >- return data; >-} >+std::optional<const char*> hashAlgorithmName(CryptoAlgorithmIdentifier); >+ >+std::optional<int> hmacAlgorithm(CryptoAlgorithmIdentifier); >+std::optional<int> digestAlgorithm(CryptoAlgorithmIdentifier); >+std::optional<PAL::CryptoDigest::Algorithm> hashCryptoDigestAlgorithm(CryptoAlgorithmIdentifier); >+ >+std::optional<size_t> mpiLength(gcry_mpi_t); >+std::optional<size_t> mpiLength(gcry_sexp_t); >+std::optional<Vector<uint8_t>> mpiData(gcry_mpi_t); >+std::optional<Vector<uint8_t>> mpiZeroPrefixedData(gcry_mpi_t, size_t targetLength); >+std::optional<Vector<uint8_t>> mpiData(gcry_sexp_t); >+std::optional<Vector<uint8_t>> mpiZeroPrefixedData(gcry_sexp_t, size_t targetLength); >+std::optional<Vector<uint8_t>> mpiSignedData(gcry_mpi_t); >+std::optional<Vector<uint8_t>> mpiSignedData(gcry_sexp_t); > > } // namespace WebCore >diff --git a/Source/WebCore/platform/SourcesGCrypt.txt b/Source/WebCore/platform/SourcesGCrypt.txt >index 87fd2f4a4fff088f82ebb88b2c30069118cc9972..060572333b3d9bbee7ea0548e8e1984d8897836a 100644 >--- a/Source/WebCore/platform/SourcesGCrypt.txt >+++ b/Source/WebCore/platform/SourcesGCrypt.txt >@@ -38,4 +38,5 @@ crypto/gcrypt/CryptoAlgorithmRSA_PSSGCrypt.cpp > crypto/gcrypt/CryptoAlgorithmRegistryGCrypt.cpp > crypto/gcrypt/CryptoKeyECGCrypt.cpp > crypto/gcrypt/CryptoKeyRSAGCrypt.cpp >+crypto/gcrypt/GCryptUtilities.cpp > crypto/gcrypt/SerializedCryptoKeyWrapGCrypt.cpp
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 187033
: 343587 |
343624