22 !jwk.
kid.has_value() || !jwk.
e.has_value() || jwk.
e->empty() ||
23 !jwk.
n.has_value() || jwk.
n->empty())
28 std::vector<uint8_t> der;
37 return pubkey->public_key_der();
39 catch (
const std::invalid_argument& exc)
41 throw std::logic_error(
42 fmt::format(
"Failed to construct RSA public key: {}", exc.what()));
50 !jwk.
kid.has_value() || !jwk.
x.has_value() || jwk.
x->empty() ||
51 !jwk.
y.has_value() || jwk.
y->empty() || !jwk.
crv.has_value())
65 return pubkey->public_key_der();
67 catch (
const std::invalid_argument& exc)
69 throw std::logic_error(
70 fmt::format(
"Failed to construct EC public key: {}", exc.what()));
77 if (!jwk.
kid.has_value() || !jwk.
x5c.has_value() || jwk.
x5c->empty())
82 const auto& kid = *jwk.
kid;
83 const auto& der_base64 = (*jwk.
x5c)[0];
89 catch (
const std::invalid_argument& e)
91 throw std::logic_error(
92 fmt::format(
"Could not parse x5c of key id {}: {}", kid, e.what()));
97 return verifier->public_key_der();
99 catch (std::invalid_argument& exc)
101 throw std::logic_error(fmt::format(
102 "JWKS kid {} has an invalid X.509 certificate: {}", kid, exc.what()));
109 if (!jwk.
kid.has_value())
111 throw std::logic_error(
"Missing kid for JWT signing key");
113 const auto& kid = *jwk.
kid;
130 throw std::logic_error(
131 fmt::format(
"JWKS kid {} has neither RSA/EC public key or x5c", kid));
137 static bool check_issuer_constraint(
138 const std::string& issuer,
const std::string& constraint)
147 if (constraint_domain.empty())
159 if (issuer_domain != constraint_domain)
161 const auto pattern =
"." + constraint_domain;
162 return issuer_domain.ends_with(pattern);
168 static void remove_jwt_public_signing_keys(
172 Tables::JWT_PUBLIC_SIGNING_KEYS_METADATA);
174 keys->foreach([&issuer, &keys](
const auto& k,
const auto& v) {
175 auto it = find_if(v.begin(), v.end(), [&](
const auto& metadata) {
176 return metadata.issuer == issuer;
181 std::vector<OpenIDJWKMetadata> updated(v.begin(), it);
182 updated.insert(updated.end(), ++it, v.end());
184 if (!updated.empty())
186 keys->put(k, updated);
197 static bool set_jwt_public_signing_keys(
199 const std::string& log_prefix,
201 const JwtIssuerMetadata& ,
202 const JsonWebKeySet& jwks)
205 Tables::JWT_PUBLIC_SIGNING_KEYS_METADATA);
207 if (jwks.keys.empty())
212 std::map<std::string, ECPublicKey> new_keys;
213 std::map<std::string, JwtIssuer> issuer_constraints;
217 for (
const auto& jwk : jwks.keys)
219 if (!jwk.kid.has_value())
221 throw std::logic_error(
"Missing kid for JWT signing key");
224 const auto& kid = *jwk.kid;
229 if (!check_issuer_constraint(issuer, *jwk.issuer))
231 throw std::logic_error(fmt::format(
232 "JWKS kid {} with issuer constraint {} fails validation "
240 issuer_constraints.emplace(kid, *jwk.issuer);
243 new_keys.emplace(kid, key_der);
246 catch (
const std::exception& exc)
252 if (new_keys.empty())
254 LOG_FAIL_FMT(
"{}: no keys left after applying filter", log_prefix);
258 std::set<std::string> existing_kids;
259 keys->foreach([&existing_kids, &issuer](
const auto& k,
const auto& v) {
260 if (find_if(v.begin(), v.end(), [&](
const auto& metadata) {
261 return metadata.issuer == issuer;
264 existing_kids.insert(k);
270 for (
auto& [kid, der] : new_keys)
272 OpenIDJWKMetadata value{
273 .public_key = der, .issuer = issuer, .constraint = std::nullopt};
274 value.public_key = der;
276 const auto it = issuer_constraints.find(kid);
277 if (it != issuer_constraints.end())
279 value.constraint = it->second;
282 if (existing_kids.contains(kid))
284 const auto& keys_for_kid = keys->get(kid);
286 keys_for_kid.has_value() &&
288 keys_for_kid->begin(),
290 [&value](
const auto& metadata) {
291 return metadata.public_key == value.public_key &&
292 metadata.issuer == value.issuer &&
293 metadata.constraint == value.constraint;
294 }) != keys_for_kid->end())
302 "Save JWT key kid={} issuer={}, constraint={}",
307 auto existing_keys = keys->get(kid);
310 const auto prev = find_if(
311 existing_keys->begin(),
312 existing_keys->end(),
313 [&](
const auto& issuer_with_constraint) {
314 return issuer_with_constraint.issuer == issuer;
317 if (prev != existing_keys->end())
323 existing_keys->push_back(std::move(value));
325 keys->put(kid, *existing_keys);
329 keys->put(kid, std::vector<OpenIDJWKMetadata>{value});
333 for (
const auto& kid : existing_kids)
335 if (!new_keys.contains(kid))
337 auto updated = keys->get(kid);
338 if (!updated.has_value())
346 [&](
const auto& metadata) { return metadata.issuer == issuer; }),
349 if (updated->empty())
355 keys->put(kid, *updated);
M::Handle * rw(M &m)
Definition tx.h:211
#define LOG_DEBUG_FMT
Definition internal_logger.h:14
#define LOG_FAIL_FMT
Definition internal_logger.h:16
VerifierUniquePtr make_unique_verifier(const std::vector< uint8_t > &cert)
Definition verifier.cpp:13
std::vector< uint8_t > raw_from_b64(const std::string_view &b64_string)
Definition base64.cpp:12
RSAPublicKeyPtr make_rsa_public_key(const uint8_t *data, size_t size)
Definition rsa_public_key.cpp:283
ECPublicKeyPtr make_ec_public_key(const Pem &pem)
Definition ec_public_key.cpp:331
Definition jwt_management.h:17
std::vector< uint8_t > try_parse_raw_rsa(const ccf::crypto::JsonWebKeyData &jwk)
Definition jwt_management.h:18
std::vector< uint8_t > try_parse_raw_ec(const ccf::crypto::JsonWebKeyData &jwk)
Definition jwt_management.h:46
std::vector< uint8_t > try_parse_jwk(const ccf::crypto::JsonWebKeyData &jwk)
Definition jwt_management.h:106
std::vector< uint8_t > try_parse_x5c(const ccf::crypto::JsonWebKeyData &jwk)
Definition jwt_management.h:74
Definition app_interface.h:14
std::vector< uint8_t > Cert
Definition jwt.h:37
ServiceMap< JwtKeyId, std::vector< OpenIDJWKMetadata > > JwtPublicSigningKeysMetadata
Definition jwt.h:51
URL parse_url_full(const std::string &url)
Definition http_parser.h:151
std::optional< std::string > n
Definition jwk.h:54
std::optional< std::string > x
Definition jwk.h:56
std::optional< std::vector< std::string > > x5c
Definition jwk.h:53
std::optional< JsonWebKeyECCurve > crv
Definition jwk.h:58
std::optional< std::string > kid
Definition jwk.h:52
std::optional< std::string > e
Definition jwk.h:55
std::optional< std::string > y
Definition jwk.h:57
std::string x
Definition jwk.h:120
JsonWebKeyECCurve crv
Definition jwk.h:119
std::string y
Definition jwk.h:121
std::string e
Definition jwk.h:140
std::string n
Definition jwk.h:139
std::optional< std::string > kid
Definition jwk.h:28
JsonWebKeyType kty
Definition jwk.h:27
std::string host
Definition http_parser.h:144