String JSCryptoKeySerializationJWK::serialize(ExecState* exec, const CryptoKey& key) { std::unique_ptr<CryptoKeyData> keyData = key.exportData(); if (!keyData) { // This generally shouldn't happen as long as all key types implement exportData(), but as underlying libraries return errors, there may be some rare failure conditions. throwTypeError(exec, "Couldn't export key material"); return String(); } JSObject* result = constructEmptyObject(exec); addJWKAlgorithmToJSON(exec, result, key); if (exec->hadException()) return String(); addBoolToJSON(exec, result, "extractable", key.extractable()); addJWKUseToJSON(exec, result, key.usagesBitmap()); if (exec->hadException()) return String(); if (isCryptoKeyDataOctetSequence(*keyData)) buildJSONForOctetSequence(exec, toCryptoKeyDataOctetSequence(*keyData).octetSequence(), result); else if (isCryptoKeyDataRSAComponents(*keyData)) buildJSONForRSAComponents(exec, toCryptoKeyDataRSAComponents(*keyData), result); else { throwTypeError(exec, "Key doesn't support exportKey"); return String(); } if (exec->hadException()) return String(); return JSONStringify(exec, result, 4); }
void CryptoAlgorithmRSA_OAEP::importKey(const CryptoAlgorithmParameters& parameters, const CryptoKeyData& keyData, bool extractable, CryptoKeyUsage usage, KeyCallback callback, VoidCallback failureCallback, ExceptionCode&) { const CryptoAlgorithmRsaKeyParamsWithHash& rsaKeyParameters = toCryptoAlgorithmRsaKeyParamsWithHash(parameters); const CryptoKeyDataRSAComponents& rsaComponents = toCryptoKeyDataRSAComponents(keyData); RefPtr<CryptoKeyRSA> result = CryptoKeyRSA::create(CryptoAlgorithmIdentifier::RSA_OAEP, rsaComponents, extractable, usage); if (!result) { failureCallback(); return; } if (rsaKeyParameters.hasHash) result->restrictToHash(rsaKeyParameters.hash); callback(*result); }