ScriptPromise SubtleCrypto::importKey(ScriptState* scriptState, const String& rawFormat, const Dictionary& keyData, const Dictionary& rawAlgorithm, bool extractable, const Vector<String>& rawKeyUsages) { RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(scriptState); ScriptPromise promise = result->promise(); if (!canAccessWebCrypto(scriptState, result.get())) return promise; blink::WebCryptoKeyFormat format; if (!Key::parseFormat(rawFormat, format, result.get())) return promise; blink::WebCryptoKeyUsageMask keyUsages; if (!Key::parseUsageMask(rawKeyUsages, keyUsages, result.get())) return promise; if (format != blink::WebCryptoKeyFormatJwk) { result->completeWithError(blink::WebCryptoErrorTypeData, "Key data must be a buffer for non-JWK formats"); return promise; } blink::WebCryptoAlgorithm algorithm; if (!parseAlgorithm(rawAlgorithm, blink::WebCryptoOperationImportKey, algorithm, result.get())) return promise; CString jsonUtf8; if (!copyJwkDictionaryToJson(keyData, jsonUtf8, result.get())) return promise; blink::Platform::current()->crypto()->importKey(format, reinterpret_cast<const unsigned char*>(jsonUtf8.data()), jsonUtf8.length(), algorithm, extractable, keyUsages, result->result()); return promise; }
ScriptPromise SubtleCrypto::importKey(ScriptState* scriptState, const String& rawFormat, const ArrayBufferOrArrayBufferViewOrDictionary& keyData, const AlgorithmIdentifier& rawAlgorithm, bool extractable, const Vector<String>& rawKeyUsages) { RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scriptState); ScriptPromise promise = result->promise(); if (!canAccessWebCrypto(scriptState, result.get())) return promise; WebCryptoKeyFormat format; if (!CryptoKey::parseFormat(rawFormat, format, result.get())) return promise; if (keyData.isDictionary()) { if (format != WebCryptoKeyFormatJwk) { result->completeWithError(WebCryptoErrorTypeData, "Key data must be a buffer for non-JWK formats"); return promise; } } else if (format == WebCryptoKeyFormatJwk) { result->completeWithError(WebCryptoErrorTypeData, "Key data must be an object for JWK import"); return promise; } WebCryptoKeyUsageMask keyUsages; if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result.get())) return promise; WebCryptoAlgorithm algorithm; if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationImportKey, algorithm, result.get())) return promise; const unsigned char* ptr = nullptr; unsigned len = 0; CString jsonUtf8; if (keyData.isArrayBuffer()) { ptr = static_cast<const unsigned char*>(keyData.getAsArrayBuffer()->data()); len = keyData.getAsArrayBuffer()->byteLength(); } else if (keyData.isArrayBufferView()) { ptr = static_cast<const unsigned char*>(keyData.getAsArrayBufferView()->baseAddress()); len = keyData.getAsArrayBufferView()->byteLength(); } else if (keyData.isDictionary()) { if (!copyJwkDictionaryToJson(keyData.getAsDictionary(), jsonUtf8, result.get())) return promise; ptr = reinterpret_cast<const unsigned char*>(jsonUtf8.data()); len = jsonUtf8.length(); } histogramAlgorithm(scriptState->executionContext(), algorithm); Platform::current()->crypto()->importKey(format, ptr, len, algorithm, extractable, keyUsages, result->result()); return promise; }