in src/bun.js/bindings/webcrypto/CryptoAlgorithmRSA_OAEP.cpp [105:193]
void CryptoAlgorithmRSA_OAEP::importKey(CryptoKeyFormat format, KeyData&& data, const CryptoAlgorithmParameters& parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyCallback&& callback, ExceptionCallback&& exceptionCallback)
{
using namespace CryptoAlgorithmRSA_OAEPInternal;
const auto& rsaParameters = downcast<CryptoAlgorithmRsaHashedImportParams>(parameters);
RefPtr<CryptoKeyRSA> result;
switch (format) {
case CryptoKeyFormat::Jwk: {
JsonWebKey key = WTFMove(std::get<JsonWebKey>(data));
bool isUsagesAllowed = false;
if (!key.d.isNull()) {
isUsagesAllowed = isUsagesAllowed || !(usages ^ CryptoKeyUsageDecrypt);
isUsagesAllowed = isUsagesAllowed || !(usages ^ CryptoKeyUsageUnwrapKey);
isUsagesAllowed = isUsagesAllowed || !(usages ^ (CryptoKeyUsageDecrypt | CryptoKeyUsageUnwrapKey));
} else {
isUsagesAllowed = isUsagesAllowed || !(usages ^ CryptoKeyUsageEncrypt);
isUsagesAllowed = isUsagesAllowed || !(usages ^ CryptoKeyUsageWrapKey);
isUsagesAllowed = isUsagesAllowed || !(usages ^ (CryptoKeyUsageEncrypt | CryptoKeyUsageWrapKey));
}
isUsagesAllowed = isUsagesAllowed || !usages;
if (!isUsagesAllowed) {
exceptionCallback(SyntaxError);
return;
}
if (usages && !key.use.isNull() && key.use != "enc"_s) {
exceptionCallback(DataError);
return;
}
bool isMatched = false;
switch (rsaParameters.hashIdentifier) {
case CryptoAlgorithmIdentifier::SHA_1:
isMatched = key.alg.isNull() || key.alg == ALG1;
break;
case CryptoAlgorithmIdentifier::SHA_224:
isMatched = key.alg.isNull() || key.alg == ALG224;
break;
case CryptoAlgorithmIdentifier::SHA_256:
isMatched = key.alg.isNull() || key.alg == ALG256;
break;
case CryptoAlgorithmIdentifier::SHA_384:
isMatched = key.alg.isNull() || key.alg == ALG384;
break;
case CryptoAlgorithmIdentifier::SHA_512:
isMatched = key.alg.isNull() || key.alg == ALG512;
break;
default:
break;
}
if (!isMatched) {
exceptionCallback(DataError);
return;
}
result = CryptoKeyRSA::importJwk(rsaParameters.identifier, rsaParameters.hashIdentifier, WTFMove(key), extractable, usages);
break;
}
case CryptoKeyFormat::Spki: {
if (usages && (usages ^ CryptoKeyUsageEncrypt) && (usages ^ CryptoKeyUsageWrapKey) && (usages ^ (CryptoKeyUsageEncrypt | CryptoKeyUsageWrapKey))) {
exceptionCallback(SyntaxError);
return;
}
// FIXME: <webkit.org/b/165436>
result = CryptoKeyRSA::importSpki(rsaParameters.identifier, rsaParameters.hashIdentifier, WTFMove(std::get<Vector<uint8_t>>(data)), extractable, usages);
break;
}
case CryptoKeyFormat::Pkcs8: {
if (usages && (usages ^ CryptoKeyUsageDecrypt) && (usages ^ CryptoKeyUsageUnwrapKey) && (usages ^ (CryptoKeyUsageDecrypt | CryptoKeyUsageUnwrapKey))) {
exceptionCallback(SyntaxError);
return;
}
// FIXME: <webkit.org/b/165436>
result = CryptoKeyRSA::importPkcs8(parameters.identifier, rsaParameters.hashIdentifier, WTFMove(std::get<Vector<uint8_t>>(data)), extractable, usages);
break;
}
default:
exceptionCallback(NotSupportedError);
return;
}
if (!result) {
exceptionCallback(DataError);
return;
}
callback(*result);
}