From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WebCore/crypto/keys/CryptoKeyAES.cpp | 67 +++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 9 deletions(-) (limited to 'Source/WebCore/crypto/keys/CryptoKeyAES.cpp') diff --git a/Source/WebCore/crypto/keys/CryptoKeyAES.cpp b/Source/WebCore/crypto/keys/CryptoKeyAES.cpp index c25bae626..43175641b 100644 --- a/Source/WebCore/crypto/keys/CryptoKeyAES.cpp +++ b/Source/WebCore/crypto/keys/CryptoKeyAES.cpp @@ -28,20 +28,33 @@ #if ENABLE(SUBTLE_CRYPTO) -#include "CryptoAlgorithmDescriptionBuilder.h" #include "CryptoAlgorithmRegistry.h" #include "CryptoKeyDataOctetSequence.h" +#include "JsonWebKey.h" +#include #include namespace WebCore { -CryptoKeyAES::CryptoKeyAES(CryptoAlgorithmIdentifier algorithm, const Vector& key, bool extractable, CryptoKeyUsage usage) +static inline bool lengthIsValid(size_t length) +{ + return (length == CryptoKeyAES::s_length128) || (length == CryptoKeyAES::s_length192) || (length == CryptoKeyAES::s_length256); +} + +CryptoKeyAES::CryptoKeyAES(CryptoAlgorithmIdentifier algorithm, const Vector& key, bool extractable, CryptoKeyUsageBitmap usage) : CryptoKey(algorithm, CryptoKeyType::Secret, extractable, usage) , m_key(key) { ASSERT(isValidAESAlgorithm(algorithm)); } +CryptoKeyAES::CryptoKeyAES(CryptoAlgorithmIdentifier algorithm, Vector&& key, bool extractable, CryptoKeyUsageBitmap usage) + : CryptoKey(algorithm, CryptoKeyType::Secret, extractable, usage) + , m_key(WTFMove(key)) +{ + ASSERT(isValidAESAlgorithm(algorithm)); +} + CryptoKeyAES::~CryptoKeyAES() { } @@ -56,23 +69,59 @@ bool CryptoKeyAES::isValidAESAlgorithm(CryptoAlgorithmIdentifier algorithm) || algorithm == CryptoAlgorithmIdentifier::AES_KW; } -PassRefPtr CryptoKeyAES::generate(CryptoAlgorithmIdentifier algorithm, size_t lengthBits, bool extractable, CryptoKeyUsage usages) +RefPtr CryptoKeyAES::generate(CryptoAlgorithmIdentifier algorithm, size_t lengthBits, bool extractable, CryptoKeyUsageBitmap usages) { - if (lengthBits % 8) + if (!lengthIsValid(lengthBits)) return nullptr; return adoptRef(new CryptoKeyAES(algorithm, randomData(lengthBits / 8), extractable, usages)); } -void CryptoKeyAES::buildAlgorithmDescription(CryptoAlgorithmDescriptionBuilder& builder) const +RefPtr CryptoKeyAES::importRaw(CryptoAlgorithmIdentifier algorithm, Vector&& keyData, bool extractable, CryptoKeyUsageBitmap usages) +{ + if (!lengthIsValid(keyData.size() * 8)) + return nullptr; + return adoptRef(new CryptoKeyAES(algorithm, WTFMove(keyData), extractable, usages)); +} + +RefPtr CryptoKeyAES::importJwk(CryptoAlgorithmIdentifier algorithm, JsonWebKey&& keyData, bool extractable, CryptoKeyUsageBitmap usages, CheckAlgCallback&& callback) +{ + if (keyData.kty != "oct") + return nullptr; + if (keyData.k.isNull()) + return nullptr; + Vector octetSequence; + if (!base64URLDecode(keyData.k, octetSequence)) + return nullptr; + if (!callback(octetSequence.size() * 8, keyData.alg)) + return nullptr; + if (usages && !keyData.use.isNull() && keyData.use != "enc") + return nullptr; + if (keyData.key_ops && ((keyData.usages & usages) != usages)) + return nullptr; + if (keyData.ext && !keyData.ext.value() && extractable) + return nullptr; + + return adoptRef(new CryptoKeyAES(algorithm, WTFMove(octetSequence), extractable, usages)); +} + +JsonWebKey CryptoKeyAES::exportJwk() const +{ + JsonWebKey result; + result.kty = "oct"; + result.k = base64URLEncode(m_key); + result.key_ops = usages(); + result.ext = extractable(); + return result; +} + +std::unique_ptr CryptoKeyAES::buildAlgorithm() const { - CryptoKey::buildAlgorithmDescription(builder); - builder.add("length", m_key.size() * 8); + return std::make_unique(CryptoAlgorithmRegistry::singleton().name(algorithmIdentifier()), m_key.size() * 8); } std::unique_ptr CryptoKeyAES::exportData() const { - ASSERT(extractable()); - return CryptoKeyDataOctetSequence::create(m_key); + return std::make_unique(m_key); } } // namespace WebCore -- cgit v1.2.1