| 415 | |
| 416 | template <class Value> |
| 417 | Optional<PublicOrPrivateKey> parseKey(const Value& key, StringRef kty, int keyIndex) { |
| 418 | if (kty == "EC"_sr) { |
| 419 | DECLARE_JWK_REQUIRED_STRING_MEMBER(key, alg); |
| 420 | if (alg != "ES256"_sr) { |
| 421 | JWK_PARSE_ERROR("Unsupported EC algorithm").detail("Algorithm", alg.toString()); |
| 422 | return {}; |
| 423 | } |
| 424 | DECLARE_JWK_REQUIRED_STRING_MEMBER(key, crv); |
| 425 | if (crv != "P-256"_sr) { |
| 426 | JWK_PARSE_ERROR("Unsupported EC curve").detail("Curve", crv.toString()); |
| 427 | return {}; |
| 428 | } |
| 429 | DECLARE_JWK_REQUIRED_STRING_MEMBER(key, x); |
| 430 | DECLARE_JWK_REQUIRED_STRING_MEMBER(key, y); |
| 431 | DECLARE_JWK_OPTIONAL_STRING_MEMBER(key, d); |
| 432 | return parseEcP256Key(x, y, d, keyIndex); |
| 433 | } else if (kty == "RSA"_sr) { |
| 434 | DECLARE_JWK_REQUIRED_STRING_MEMBER(key, alg); |
| 435 | if (alg != "RS256"_sr) { |
| 436 | JWK_PARSE_ERROR("Unsupported RSA algorithm").detail("Algorithm", alg.toString()); |
| 437 | return {}; |
| 438 | } |
| 439 | DECLARE_JWK_REQUIRED_STRING_MEMBER(key, n); |
| 440 | DECLARE_JWK_REQUIRED_STRING_MEMBER(key, e); |
| 441 | DECLARE_JWK_OPTIONAL_STRING_MEMBER(key, d); |
| 442 | DECLARE_JWK_OPTIONAL_STRING_MEMBER(key, p); |
| 443 | DECLARE_JWK_OPTIONAL_STRING_MEMBER(key, q); |
| 444 | DECLARE_JWK_OPTIONAL_STRING_MEMBER(key, dp); |
| 445 | DECLARE_JWK_OPTIONAL_STRING_MEMBER(key, dq); |
| 446 | DECLARE_JWK_OPTIONAL_STRING_MEMBER(key, qi); |
| 447 | auto privKeyArgs = 0; |
| 448 | privKeyArgs += d.present(); |
| 449 | privKeyArgs += p.present(); |
| 450 | privKeyArgs += q.present(); |
| 451 | privKeyArgs += dp.present(); |
| 452 | privKeyArgs += dq.present(); |
| 453 | privKeyArgs += qi.present(); |
| 454 | if (privKeyArgs == 0 || privKeyArgs == 6) { |
| 455 | return parseRsaKey(n, e, d, p, q, dp, dq, qi, keyIndex); |
| 456 | } else { |
| 457 | JWK_PARSE_ERROR("Private key arguments partially exist").detail("NumMissingArgs", 6 - privKeyArgs); |
| 458 | return {}; |
| 459 | } |
| 460 | } else { |
| 461 | JWK_PARSE_ERROR("Unsupported key type").detail("KeyType", kty.toString()); |
| 462 | return {}; |
| 463 | } |
| 464 | } |
| 465 | |
| 466 | bool encodeEcKey(rapidjson::Writer<rapidjson::StringBuffer>& writer, |
| 467 | StringRef keyName, |
no test coverage detected