in src/bun.js/bindings/webcrypto/CryptoAlgorithmRSA_PSS.cpp [105:181]
void CryptoAlgorithmRSA_PSS::importKey(CryptoKeyFormat format, KeyData&& data, const CryptoAlgorithmParameters& parameters, bool extractable, CryptoKeyUsageBitmap usages, KeyCallback&& callback, ExceptionCallback&& exceptionCallback)
{
using namespace CryptoAlgorithmRSA_PSSInternal;
const auto& rsaParameters = downcast<CryptoAlgorithmRsaHashedImportParams>(parameters);
RefPtr<CryptoKeyRSA> result;
switch (format) {
case CryptoKeyFormat::Jwk: {
JsonWebKey key = WTFMove(std::get<JsonWebKey>(data));
if (usages && ((!key.d.isNull() && (usages ^ CryptoKeyUsageSign)) || (key.d.isNull() && (usages ^ CryptoKeyUsageVerify)))) {
exceptionCallback(SyntaxError);
return;
}
if (usages && !key.use.isNull() && key.use != "sig"_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 ^ CryptoKeyUsageVerify)) {
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 ^ CryptoKeyUsageSign)) {
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);
}