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 CryptoAlgorithmAES_KW::importKey(const CryptoAlgorithmParameters&, const CryptoKeyData& keyData, bool extractable, CryptoKeyUsage usage, KeyCallback callback, VoidCallback, ExceptionCode& ec) { if (keyData.format() != CryptoKeyData::Format::OctetSequence) { ec = NOT_SUPPORTED_ERR; return; } const CryptoKeyDataOctetSequence& keyDataOctetSequence = toCryptoKeyDataOctetSequence(keyData); RefPtr<CryptoKeyAES> result = CryptoKeyAES::create(CryptoAlgorithmIdentifier::AES_KW, keyDataOctetSequence.octetSequence(), extractable, usage); callback(*result); }