CryptoAlgorithmPBKDF2Mac.cpp [plain text]
#include "config.h"
#include "CryptoAlgorithmPBKDF2.h"
#if ENABLE(SUBTLE_CRYPTO)
#include "CryptoAlgorithmPbkdf2Params.h"
#include "CryptoKeyRaw.h"
#include "ExceptionCode.h"
#include "ScriptExecutionContext.h"
#include <CommonCrypto/CommonKeyDerivation.h>
namespace WebCore {
static CCPseudoRandomAlgorithm commonCryptoHMACAlgorithm(CryptoAlgorithmIdentifier hashFunction)
{
switch (hashFunction) {
case CryptoAlgorithmIdentifier::SHA_1:
return kCCPRFHmacAlgSHA1;
case CryptoAlgorithmIdentifier::SHA_224:
return kCCPRFHmacAlgSHA224;
case CryptoAlgorithmIdentifier::SHA_256:
return kCCPRFHmacAlgSHA256;
case CryptoAlgorithmIdentifier::SHA_384:
return kCCPRFHmacAlgSHA384;
case CryptoAlgorithmIdentifier::SHA_512:
return kCCPRFHmacAlgSHA512;
default:
ASSERT_NOT_REACHED();
return 0;
}
}
void CryptoAlgorithmPBKDF2::platformDeriveBits(std::unique_ptr<CryptoAlgorithmParameters>&& parameters, Ref<CryptoKey>&& baseKey, size_t length, VectorCallback&& callback, ExceptionCallback&& exceptionCallback, ScriptExecutionContext& context, WorkQueue& workQueue)
{
context.ref();
workQueue.dispatch([parameters = WTFMove(parameters), baseKey = WTFMove(baseKey), length, callback = WTFMove(callback), exceptionCallback = WTFMove(exceptionCallback), &context]() mutable {
auto& pbkdf2Parameters = downcast<CryptoAlgorithmPbkdf2Params>(*parameters);
auto& rawKey = downcast<CryptoKeyRaw>(baseKey.get());
Vector<uint8_t> result(length / 8);
if (CCKeyDerivationPBKDF(kCCPBKDF2, reinterpret_cast<const char *>(rawKey.key().data()), rawKey.key().size(), pbkdf2Parameters.saltVector().data(), pbkdf2Parameters.saltVector().size(), commonCryptoHMACAlgorithm(pbkdf2Parameters.hashIdentifier), pbkdf2Parameters.iterations, result.data(), length / 8)) {
context.postTask([exceptionCallback = WTFMove(exceptionCallback), callback = WTFMove(callback)](ScriptExecutionContext& context) {
exceptionCallback(OperationError);
context.deref();
});
return;
}
context.postTask([callback = WTFMove(callback), result = WTFMove(result), exceptionCallback = WTFMove(exceptionCallback)](ScriptExecutionContext& context) {
callback(result);
context.deref();
});
});
}
}
#endif // ENABLE(SUBTLE_CRYPTO)