CryptoAlgorithmHKDF.cpp [plain text]
#include "config.h"
#include "CryptoAlgorithmHKDF.h"
#if ENABLE(WEB_CRYPTO)
#include "CryptoAlgorithmHkdfParams.h"
#include "CryptoKeyRaw.h"
#include <JavaScriptCore/JSCJSValueInlines.h>
#include <wtf/CrossThreadCopier.h>
namespace WebCore {
Ref<CryptoAlgorithm> CryptoAlgorithmHKDF::create()
{
return adoptRef(*new CryptoAlgorithmHKDF);
}
CryptoAlgorithmIdentifier CryptoAlgorithmHKDF::identifier() const
{
return s_identifier;
}
void CryptoAlgorithmHKDF::deriveBits(const CryptoAlgorithmParameters& parameters, Ref<CryptoKey>&& baseKey, size_t length, VectorCallback&& callback, ExceptionCallback&& exceptionCallback, ScriptExecutionContext& context, WorkQueue& workQueue)
{
if (!length || length % 8) {
exceptionCallback(OperationError);
return;
}
dispatchOperationInWorkQueue(workQueue, context, WTFMove(callback), WTFMove(exceptionCallback),
[parameters = crossThreadCopy(downcast<CryptoAlgorithmHkdfParams>(parameters)), baseKey = WTFMove(baseKey), length] {
return platformDeriveBits(parameters, downcast<CryptoKeyRaw>(baseKey.get()), length);
});
}
void CryptoAlgorithmHKDF::importKey(CryptoKeyFormat format, KeyData&& data, const CryptoAlgorithmParameters& parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyCallback&& callback, ExceptionCallback&& exceptionCallback)
{
if (format != CryptoKeyFormat::Raw) {
exceptionCallback(NotSupportedError);
return;
}
if (usages & (CryptoKeyUsageEncrypt | CryptoKeyUsageDecrypt | CryptoKeyUsageSign | CryptoKeyUsageVerify | CryptoKeyUsageWrapKey | CryptoKeyUsageUnwrapKey)) {
exceptionCallback(SyntaxError);
return;
}
if (extractable) {
exceptionCallback(SyntaxError);
return;
}
callback(CryptoKeyRaw::create(parameters.identifier, WTFMove(WTF::get<Vector<uint8_t>>(data)), usages));
}
ExceptionOr<size_t> CryptoAlgorithmHKDF::getKeyLength(const CryptoAlgorithmParameters&)
{
return 0;
}
}
#endif // ENABLE(WEB_CRYPTO)