ExceptionOr<int> CSSStyleSheet::addRule(const String& selector, const String& style, std::optional<unsigned> index) { StringBuilder text; text.append(selector); text.appendLiteral(" { "); text.append(style); if (!style.isEmpty()) text.append(' '); text.append('}'); auto insertRuleResult = insertRule(text.toString(), index.value_or(length())); if (insertRuleResult.hasException()) return insertRuleResult.releaseException(); // As per Microsoft documentation, always return -1. return -1; }
RefPtr<CryptoKeyRSA> CryptoKeyRSA::importJwk(CryptoAlgorithmIdentifier algorithm, std::optional<CryptoAlgorithmIdentifier> hash, JsonWebKey&& keyData, bool extractable, CryptoKeyUsageBitmap usages) { if (keyData.kty != "RSA") return nullptr; if (keyData.usages && ((keyData.usages & usages) != usages)) return nullptr; if (keyData.ext && !keyData.ext.value() && extractable) return nullptr; if (!keyData.n || !keyData.e) return nullptr; Vector<uint8_t> modulus; if (!WTF::base64URLDecode(keyData.n.value(), modulus)) return nullptr; // Per RFC 7518 Section 6.3.1.1: https://tools.ietf.org/html/rfc7518#section-6.3.1.1 if (!modulus[0]) modulus.remove(0); Vector<uint8_t> exponent; if (!WTF::base64URLDecode(keyData.e.value(), exponent)) return nullptr; if (!keyData.d) { // import public key auto publicKeyComponents = CryptoKeyDataRSAComponents::createPublic(WTFMove(modulus), WTFMove(exponent)); // Notice: CryptoAlgorithmIdentifier::SHA_1 is just a placeholder. It should not have any effect if hash is std::nullopt. return CryptoKeyRSA::create(algorithm, hash.value_or(CryptoAlgorithmIdentifier::SHA_1), !!hash, *publicKeyComponents, extractable, usages); } // import private key Vector<uint8_t> privateExponent; if (!WTF::base64URLDecode(keyData.d.value(), privateExponent)) return nullptr; if (!keyData.p && !keyData.q && !keyData.dp && !keyData.dp && !keyData.qi) { auto privateKeyComponents = CryptoKeyDataRSAComponents::createPrivate(WTFMove(modulus), WTFMove(exponent), WTFMove(privateExponent)); // Notice: CryptoAlgorithmIdentifier::SHA_1 is just a placeholder. It should not have any effect if hash is std::nullopt. return CryptoKeyRSA::create(algorithm, hash.value_or(CryptoAlgorithmIdentifier::SHA_1), !!hash, *privateKeyComponents, extractable, usages); } if (!keyData.p || !keyData.q || !keyData.dp || !keyData.dq || !keyData.qi) return nullptr; CryptoKeyDataRSAComponents::PrimeInfo firstPrimeInfo; CryptoKeyDataRSAComponents::PrimeInfo secondPrimeInfo; if (!WTF::base64URLDecode(keyData.p.value(), firstPrimeInfo.primeFactor)) return nullptr; if (!WTF::base64URLDecode(keyData.dp.value(), firstPrimeInfo.factorCRTExponent)) return nullptr; if (!WTF::base64URLDecode(keyData.q.value(), secondPrimeInfo.primeFactor)) return nullptr; if (!WTF::base64URLDecode(keyData.dq.value(), secondPrimeInfo.factorCRTExponent)) return nullptr; if (!WTF::base64URLDecode(keyData.qi.value(), secondPrimeInfo.factorCRTCoefficient)) return nullptr; if (!keyData.oth) { auto privateKeyComponents = CryptoKeyDataRSAComponents::createPrivateWithAdditionalData(WTFMove(modulus), WTFMove(exponent), WTFMove(privateExponent), WTFMove(firstPrimeInfo), WTFMove(secondPrimeInfo), { }); // Notice: CryptoAlgorithmIdentifier::SHA_1 is just a placeholder. It should not have any effect if hash is std::nullopt. return CryptoKeyRSA::create(algorithm, hash.value_or(CryptoAlgorithmIdentifier::SHA_1), !!hash, *privateKeyComponents, extractable, usages); } Vector<CryptoKeyDataRSAComponents::PrimeInfo> otherPrimeInfos; for (auto value : keyData.oth.value()) { CryptoKeyDataRSAComponents::PrimeInfo info; if (!WTF::base64URLDecode(value.r, info.primeFactor)) return nullptr; if (!WTF::base64URLDecode(value.d, info.factorCRTExponent)) return nullptr; if (!WTF::base64URLDecode(value.t, info.factorCRTCoefficient)) return nullptr; otherPrimeInfos.append(info); } auto privateKeyComponents = CryptoKeyDataRSAComponents::createPrivateWithAdditionalData(WTFMove(modulus), WTFMove(exponent), WTFMove(privateExponent), WTFMove(firstPrimeInfo), WTFMove(secondPrimeInfo), WTFMove(otherPrimeInfos)); // Notice: CryptoAlgorithmIdentifier::SHA_1 is just a placeholder. It should not have any effect if hash is std::nullopt. return CryptoKeyRSA::create(algorithm, hash.value_or(CryptoAlgorithmIdentifier::SHA_1), !!hash, *privateKeyComponents, extractable, usages); }