33 std::array<unsigned char, kPkceVerifierBytes> random_bytes{};
34 if (RAND_bytes(random_bytes.data(),
35 static_cast<int>(random_bytes.size())) != 1) {
36 return core::unexpected(
38 "failed to generate PKCE code_verifier random bytes",
40 std::string(AuthErrorCategory)});
44 challenge.code_verifier =
45 base64url_encode_bytes(random_bytes.data(), random_bytes.size());
46 challenge.method = PkceCodeChallengeMethod::kS256;
49 if (!hashed.has_value()) {
50 return core::unexpected(hashed.error());
52 challenge.code_challenge = std::move(*hashed);
58 if (challenge.method != PkceCodeChallengeMethod::kS256) {
61 "unsupported PKCE code_challenge_method; only S256 is supported",
63 std::string(AuthErrorCategory)});
67 if (!expected.has_value()) {
68 return core::unexpected(expected.error());
71 return *expected == challenge.code_challenge;