jwt_verifier_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
21 #include <string.h>
22 
23 #include <grpc/grpc.h>
24 #include <grpc/slice.h>
25 #include <grpc/support/alloc.h>
26 #include <grpc/support/log.h>
28 
31 #include "src/core/lib/slice/b64.h"
33 
34 using grpc_core::Json;
35 
36 /* This JSON key was generated with the GCE console and revoked immediately.
37  The identifiers have been changed as well.
38  Maximum size for a string literal is 509 chars in C89, yay! */
39 static const char json_key_str_part1[] =
40  "{ \"private_key\": \"-----BEGIN PRIVATE KEY-----"
41  "\\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOEvJsnoHnyHkXcp\\n7mJE"
42  "qg"
43  "WGjiw71NfXByguekSKho65FxaGbsnSM9SMQAqVk7Q2rG+I0OpsT0LrWQtZ\\nyjSeg/"
44  "rWBQvS4hle4LfijkP3J5BG+"
45  "IXDMP8RfziNRQsenAXDNPkY4kJCvKux2xdD\\nOnVF6N7dL3nTYZg+"
46  "uQrNsMTz9UxVAgMBAAECgYEAzbLewe1xe9vy+2GoSsfib+28\\nDZgSE6Bu/"
47  "zuFoPrRc6qL9p2SsnV7txrunTyJkkOnPLND9ABAXybRTlcVKP/sGgza\\n/"
48  "8HpCqFYM9V8f34SBWfD4fRFT+n/"
49  "73cfRUtGXdXpseva2lh8RilIQfPhNZAncenU\\ngqXjDvpkypEusgXAykECQQD+";
50 static const char json_key_str_part2[] =
51  "53XxNVnxBHsYb+AYEfklR96yVi8HywjVHP34+OQZ\\nCslxoHQM8s+"
52  "dBnjfScLu22JqkPv04xyxmt0QAKm9+vTdAkEA4ib7YvEAn2jXzcCI\\nEkoy2L/"
53  "XydR1GCHoacdfdAwiL2npOdnbvi4ZmdYRPY1LSTO058tQHKVXV7NLeCa3\\nAARh2QJBAMKeDA"
54  "G"
55  "W303SQv2cZTdbeaLKJbB5drz3eo3j7dDKjrTD9JupixFbzcGw\\n8FZi5c8idxiwC36kbAL6Hz"
56  "A"
57  "ZoX+ofI0CQE6KCzPJTtYNqyShgKAZdJ8hwOcvCZtf\\n6z8RJm0+"
58  "6YBd38lfh5j8mZd7aHFf6I17j5AQY7oPEc47TjJj/"
59  "5nZ68ECQQDvYuI3\\nLyK5fS8g0SYbmPOL9TlcHDOqwG0mrX9qpg5DC2fniXNSrrZ64GTDKdzZ"
60  "Y"
61  "Ap6LI9W\\nIqv4vr6y38N79TTC\\n-----END PRIVATE KEY-----\\n\", ";
63  "\"private_key_id\": \"e6b5137873db8d2ef81e06a47289e6434ec8a165\", "
64  "\"client_email\": "
65  "\"777-abaslkan11hlb6nmim3bpspl31ud@developer.gserviceaccount."
66  "com\", \"client_id\": "
67  "\"777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent."
68  "com\", \"type\": \"service_account\" }";
69 /* Trick our JWT library into issuing a JWT with iss=accounts.google.com. */
70 static const char json_key_str_part3_for_url_issuer[] =
71  "\"private_key_id\": \"e6b5137873db8d2ef81e06a47289e6434ec8a165\", "
72  "\"client_email\": \"accounts.google.com\", "
73  "\"client_id\": "
74  "\"777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent."
75  "com\", \"type\": \"service_account\" }";
77  "\"private_key_id\": \"e6b5137873db8d2ef81e06a47289e6434ec8a165\", "
78  "\"client_email\": "
79  "\"foo@bar.com\", \"client_id\": "
80  "\"777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent."
81  "com\", \"type\": \"service_account\" }";
82 
84  "bar.com", "keys.bar.com/jwk"};
85 
86 static const char expected_user_data[] = "user data";
87 
88 static const char good_jwk_set[] =
89  "{"
90  " \"keys\": ["
91  " {"
92  " \"kty\": \"RSA\","
93  " \"alg\": \"RS256\","
94  " \"use\": \"sig\","
95  " \"kid\": \"e6b5137873db8d2ef81e06a47289e6434ec8a165\","
96  " \"n\": "
97  "\"4S8myegefIeRdynuYkSqBYaOLDvU19cHKC56RIqGjrkXFoZuydIz1IxACpWTtDasb4jQ6mxP"
98  "QutZC1nKNJ6D-tYFC9LiGV7gt-KOQ_cnkEb4hcMw_xF_OI1FCx6cBcM0-"
99  "RjiQkK8q7HbF0M6dUXo3t0vedNhmD65Cs2wxPP1TFU=\","
100  " \"e\": \"AQAB\""
101  " }"
102  " ]"
103  "}";
104 
106 
107 static const char good_google_email_keys_part1[] =
108  "{\"e6b5137873db8d2ef81e06a47289e6434ec8a165\": \"-----BEGIN "
109  "CERTIFICATE-----"
110  "\\nMIICATCCAWoCCQDEywLhxvHjnDANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB\\nVTET"
111  "MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\\ncyBQdHkgTHR"
112  "kMB4XDTE1MDYyOTA4Mzk1MFoXDTI1MDYyNjA4Mzk1MFowRTELMAkG\\nA1UEBhMCQVUxEzARBg"
113  "NVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\\nIFdpZGdpdHMgUHR5IEx0ZDCBn"
114  "zANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4S8m\\nyegefIeRdynuYkSqBYaOLDvU19cHKC56"
115  "RIqGjrkXFoZuydIz1IxACpWTtDasb4jQ\\n6mxPQutZC1nKNJ6D+tYFC9LiGV7gt+KOQ/";
116 
117 static const char good_google_email_keys_part2[] =
118  "cnkEb4hcMw/xF/OI1FCx6cBcM0+"
119  "Rji\\nQkK8q7HbF0M6dUXo3t0vedNhmD65Cs2wxPP1TFUCAwEAATANBgkqhkiG9w0BAQsF\\nA"
120  "AOBgQBfu69FkPmBknbKNFgurPz78kbs3VNN+k/"
121  "PUgO5DHKskJmgK2TbtvX2VMpx\\nkftmHGzgzMzUlOtigCaGMgHWjfqjpP9uuDbahXrZBJzB8c"
122  "Oq7MrQF8r17qVvo3Ue\\nPjTKQMAsU8uxTEMmeuz9L6yExs0rfd6bPOrQkAoVfFfiYB3/"
123  "pA==\\n-----END CERTIFICATE-----\\n\"}";
124 
125 static const char expected_audience[] = "https://foo.com";
126 
127 static const char good_openid_config[] =
128  "{"
129  " \"issuer\": \"https://accounts.google.com\","
130  " \"authorization_endpoint\": "
131  "\"https://accounts.google.com/o/oauth2/v2/auth\","
132  " \"token_endpoint\": \"https://oauth2.googleapis.com/token\","
133  " \"userinfo_endpoint\": \"https://www.googleapis.com/oauth2/v3/userinfo\","
134  " \"revocation_endpoint\": \"https://oauth2.googleapis.com/revoke\","
135  " \"jwks_uri\": \"https://www.googleapis.com/oauth2/v3/certs\""
136  "}";
137 
138 static const char expired_claims[] =
139  "{ \"aud\": \"https://foo.com\","
140  " \"iss\": \"blah.foo.com\","
141  " \"sub\": \"juju@blah.foo.com\","
142  " \"jti\": \"jwtuniqueid\","
143  " \"iat\": 100," /* Way back in the past... */
144  " \"exp\": 120,"
145  " \"nbf\": 60,"
146  " \"foo\": \"bar\"}";
147 
148 static const char claims_without_time_constraint[] =
149  "{ \"aud\": \"https://foo.com\","
150  " \"iss\": \"blah.foo.com\","
151  " \"sub\": \"juju@blah.foo.com\","
152  " \"jti\": \"jwtuniqueid\","
153  " \"foo\": \"bar\"}";
154 
155 static const char claims_with_bad_subject[] =
156  "{ \"aud\": \"https://foo.com\","
157  " \"iss\": \"evil@blah.foo.com\","
158  " \"sub\": \"juju@blah.foo.com\","
159  " \"jti\": \"jwtuniqueid\","
160  " \"foo\": \"bar\"}";
161 
162 static const char invalid_claims[] =
163  "{ \"aud\": \"https://foo.com\","
164  " \"iss\": 46," /* Issuer cannot be a number. */
165  " \"sub\": \"juju@blah.foo.com\","
166  " \"jti\": \"jwtuniqueid\","
167  " \"foo\": \"bar\"}";
168 
169 typedef struct {
171  const char* expected_issuer;
172  const char* expected_subject;
174 
175 static void test_jwt_issuer_email_domain(void) {
176  const char* d = grpc_jwt_issuer_email_domain("https://foo.com");
177  GPR_ASSERT(d == nullptr);
178  d = grpc_jwt_issuer_email_domain("foo.com");
179  GPR_ASSERT(d == nullptr);
181  GPR_ASSERT(d == nullptr);
183  GPR_ASSERT(d == nullptr);
184  d = grpc_jwt_issuer_email_domain("bar@foo");
185  GPR_ASSERT(strcmp(d, "foo") == 0);
186  d = grpc_jwt_issuer_email_domain("bar@foo.com");
187  GPR_ASSERT(strcmp(d, "foo.com") == 0);
188  d = grpc_jwt_issuer_email_domain("bar@blah.foo.com");
189  GPR_ASSERT(strcmp(d, "foo.com") == 0);
190  d = grpc_jwt_issuer_email_domain("bar.blah@blah.foo.com");
191  GPR_ASSERT(strcmp(d, "foo.com") == 0);
192  d = grpc_jwt_issuer_email_domain("bar.blah@baz.blah.foo.com");
193  GPR_ASSERT(strcmp(d, "foo.com") == 0);
194 
195  /* This is not a very good parser but make sure we do not crash on these weird
196  inputs. */
198  GPR_ASSERT(strcmp(d, "foo") == 0);
199  d = grpc_jwt_issuer_email_domain("bar@.");
200  GPR_ASSERT(d != nullptr);
201  d = grpc_jwt_issuer_email_domain("bar@..");
202  GPR_ASSERT(d != nullptr);
203  d = grpc_jwt_issuer_email_domain("bar@...");
204  GPR_ASSERT(d != nullptr);
205 }
206 
207 static void test_claims_success(void) {
208  grpc_jwt_claims* claims;
211  if (!GRPC_ERROR_IS_NONE(error)) {
212  gpr_log(GPR_ERROR, "JSON parse error: %s",
214  }
216  GPR_ASSERT(json.type() == Json::Type::OBJECT);
218  claims = grpc_jwt_claims_from_json(json);
219  GPR_ASSERT(claims != nullptr);
220  GPR_ASSERT(*grpc_jwt_claims_json(claims) == json);
221  GPR_ASSERT(strcmp(grpc_jwt_claims_audience(claims), "https://foo.com") == 0);
222  GPR_ASSERT(strcmp(grpc_jwt_claims_issuer(claims), "blah.foo.com") == 0);
223  GPR_ASSERT(strcmp(grpc_jwt_claims_subject(claims), "juju@blah.foo.com") == 0);
224  GPR_ASSERT(strcmp(grpc_jwt_claims_id(claims), "jwtuniqueid") == 0);
225  GPR_ASSERT(grpc_jwt_claims_check(claims, "https://foo.com") ==
227  grpc_jwt_claims_destroy(claims);
228 }
229 
230 static void test_expired_claims_failure(void) {
231  grpc_jwt_claims* claims;
234  if (!GRPC_ERROR_IS_NONE(error)) {
235  gpr_log(GPR_ERROR, "JSON parse error: %s",
237  }
239  GPR_ASSERT(json.type() == Json::Type::OBJECT);
240  gpr_timespec exp_iat = {100, 0, GPR_CLOCK_REALTIME};
241  gpr_timespec exp_exp = {120, 0, GPR_CLOCK_REALTIME};
242  gpr_timespec exp_nbf = {60, 0, GPR_CLOCK_REALTIME};
244  claims = grpc_jwt_claims_from_json(json);
245  GPR_ASSERT(claims != nullptr);
246  GPR_ASSERT(*grpc_jwt_claims_json(claims) == json);
247  GPR_ASSERT(strcmp(grpc_jwt_claims_audience(claims), "https://foo.com") == 0);
248  GPR_ASSERT(strcmp(grpc_jwt_claims_issuer(claims), "blah.foo.com") == 0);
249  GPR_ASSERT(strcmp(grpc_jwt_claims_subject(claims), "juju@blah.foo.com") == 0);
250  GPR_ASSERT(strcmp(grpc_jwt_claims_id(claims), "jwtuniqueid") == 0);
251  GPR_ASSERT(gpr_time_cmp(grpc_jwt_claims_issued_at(claims), exp_iat) == 0);
252  GPR_ASSERT(gpr_time_cmp(grpc_jwt_claims_expires_at(claims), exp_exp) == 0);
253  GPR_ASSERT(gpr_time_cmp(grpc_jwt_claims_not_before(claims), exp_nbf) == 0);
254 
255  GPR_ASSERT(grpc_jwt_claims_check(claims, "https://foo.com") ==
257  grpc_jwt_claims_destroy(claims);
258 }
259 
260 static void test_invalid_claims_failure(void) {
263  if (!GRPC_ERROR_IS_NONE(error)) {
264  gpr_log(GPR_ERROR, "JSON parse error: %s",
266  }
268  GPR_ASSERT(json.type() == Json::Type::OBJECT);
270  GPR_ASSERT(grpc_jwt_claims_from_json(json) == nullptr);
271 }
272 
274  grpc_jwt_claims* claims;
277  if (!GRPC_ERROR_IS_NONE(error)) {
278  gpr_log(GPR_ERROR, "JSON parse error: %s",
280  }
282  GPR_ASSERT(json.type() == Json::Type::OBJECT);
284  claims = grpc_jwt_claims_from_json(json);
285  GPR_ASSERT(claims != nullptr);
286  GPR_ASSERT(grpc_jwt_claims_check(claims, "https://bar.com") ==
288  grpc_jwt_claims_destroy(claims);
289 }
290 
292  grpc_jwt_claims* claims;
295  if (!GRPC_ERROR_IS_NONE(error)) {
296  gpr_log(GPR_ERROR, "JSON parse error: %s",
298  }
300  GPR_ASSERT(json.type() == Json::Type::OBJECT);
302  claims = grpc_jwt_claims_from_json(json);
303  GPR_ASSERT(claims != nullptr);
304  GPR_ASSERT(grpc_jwt_claims_check(claims, "https://foo.com") ==
306  grpc_jwt_claims_destroy(claims);
307 }
308 
309 static char* json_key_str(const char* last_part) {
310  size_t result_len = strlen(json_key_str_part1) + strlen(json_key_str_part2) +
311  strlen(last_part);
312  char* result = static_cast<char*>(gpr_malloc(result_len + 1));
313  char* current = result;
314  strcpy(result, json_key_str_part1);
315  current += strlen(json_key_str_part1);
316  strcpy(current, json_key_str_part2);
317  current += strlen(json_key_str_part2);
318  strcpy(current, last_part);
319  return result;
320 }
321 
322 static char* good_google_email_keys(void) {
323  size_t result_len = strlen(good_google_email_keys_part1) +
325  char* result = static_cast<char*>(gpr_malloc(result_len + 1));
326  char* current = result;
328  current += strlen(good_google_email_keys_part1);
329  strcpy(current, good_google_email_keys_part2);
330  return result;
331 }
332 
333 static grpc_http_response http_response(int status, char* body) {
335  response = {};
336  response.status = status;
337  response.body = body;
338  response.body_length = strlen(body);
339  return response;
340 }
341 
343  const grpc_http_request* /*request*/, const char* /*host*/,
344  const char* /*path*/, const char* /*body_bytes*/, size_t /*body_size*/,
345  grpc_core::Timestamp /*deadline*/, grpc_closure* /*on_done*/,
346  grpc_http_response* /*response*/) {
347  GPR_ASSERT("HTTP POST should not be called" == nullptr);
348  return 1;
349 }
350 
352  const grpc_http_request* /*request*/, const char* /*host*/,
353  const char* /*path*/, const char* /*body_bytes*/, size_t /*body_size*/,
354  grpc_core::Timestamp /*deadline*/, grpc_closure* /*on_done*/,
355  grpc_http_response* /*response*/) {
356  GPR_ASSERT("HTTP PUT should not be called" == nullptr);
357  return 1;
358 }
359 
361  const grpc_http_request* /*request*/, const char* host, const char* path,
362  grpc_core::Timestamp /*deadline*/, grpc_closure* on_done,
365  GPR_ASSERT(strcmp(host, "www.googleapis.com") == 0);
366  GPR_ASSERT(strcmp(path,
367  "/robot/v1/metadata/x509/"
368  "777-abaslkan11hlb6nmim3bpspl31ud@developer."
369  "gserviceaccount.com") == 0);
371  return 1;
372 }
373 
374 static void on_verification_success(void* user_data,
376  grpc_jwt_claims* claims) {
378  GPR_ASSERT(claims != nullptr);
379  GPR_ASSERT(user_data == (void*)expected_user_data);
381  grpc_jwt_claims_destroy(claims);
382 }
383 
387  char* jwt = nullptr;
390  gpr_free(key_str);
396  nullptr);
398  GPR_ASSERT(jwt != nullptr);
401  const_cast<char*>(expected_user_data));
404  gpr_free(jwt);
405  grpc_core::HttpRequest::SetOverride(nullptr, nullptr, nullptr);
406 }
407 
409  const grpc_http_request* /*request*/, const char* host, const char* path,
410  grpc_core::Timestamp /*deadline*/, grpc_closure* on_done,
413  GPR_ASSERT(strcmp(host, "keys.bar.com") == 0);
414  GPR_ASSERT(strcmp(path, "/jwk/foo@bar.com") == 0);
416  return 1;
417 }
418 
422  char* jwt = nullptr;
425  gpr_free(key_str);
431  nullptr);
433  GPR_ASSERT(jwt != nullptr);
436  const_cast<char*>(expected_user_data));
439  gpr_free(jwt);
440  grpc_core::HttpRequest::SetOverride(nullptr, nullptr, nullptr);
441 }
442 
443 static int httpcli_get_jwk_set(const grpc_http_request* /*request*/,
444  const char* host, const char* path,
445  grpc_core::Timestamp /*deadline*/,
446  grpc_closure* on_done,
449  GPR_ASSERT(strcmp(host, "www.googleapis.com") == 0);
450  GPR_ASSERT(strcmp(path, "/oauth2/v3/certs") == 0);
452  return 1;
453 }
454 
455 static int httpcli_get_openid_config(const grpc_http_request* /*request*/,
456  const char* host, const char* path,
457  grpc_core::Timestamp /*deadline*/,
458  grpc_closure* on_done,
461  GPR_ASSERT(strcmp(host, "accounts.google.com") == 0);
467  return 1;
468 }
469 
473  char* jwt = nullptr;
476  gpr_free(key_str);
482  nullptr);
484  GPR_ASSERT(jwt != nullptr);
487  const_cast<char*>(expected_user_data));
490  gpr_free(jwt);
491  grpc_core::HttpRequest::SetOverride(nullptr, nullptr, nullptr);
492 }
493 
494 static void on_verification_key_retrieval_error(void* user_data,
496  grpc_jwt_claims* claims) {
498  GPR_ASSERT(claims == nullptr);
499  GPR_ASSERT(user_data == (void*)expected_user_data);
500 }
501 
502 static int httpcli_get_bad_json(const grpc_http_request* /* request */,
503  const char* /*host*/, const char* /*path*/,
504  grpc_core::Timestamp /*deadline*/,
505  grpc_closure* on_done,
507  *response = http_response(200, gpr_strdup("{\"bad\": \"stuff\"}"));
509  return 1;
510 }
511 
515  char* jwt = nullptr;
518  gpr_free(key_str);
524  nullptr);
526  GPR_ASSERT(jwt != nullptr);
529  const_cast<char*>(expected_user_data));
532  gpr_free(jwt);
533  grpc_core::HttpRequest::SetOverride(nullptr, nullptr, nullptr);
534 }
535 
539  char* jwt = nullptr;
542  gpr_free(key_str);
548  nullptr);
550  GPR_ASSERT(jwt != nullptr);
553  const_cast<char*>(expected_user_data));
556  gpr_free(jwt);
557  grpc_core::HttpRequest::SetOverride(nullptr, nullptr, nullptr);
558 }
559 
560 static void corrupt_jwt_sig(char* jwt) {
561  grpc_slice sig;
562  char* bad_b64_sig;
563  uint8_t* sig_bytes;
564  char* last_dot = strrchr(jwt, '.');
565  GPR_ASSERT(last_dot != nullptr);
566  {
568  sig = grpc_base64_decode(last_dot + 1, 1);
569  }
571  sig_bytes = GRPC_SLICE_START_PTR(sig);
572  (*sig_bytes)++; /* Corrupt first byte. */
573  bad_b64_sig = grpc_base64_encode(GRPC_SLICE_START_PTR(sig),
574  GRPC_SLICE_LENGTH(sig), 1, 0);
575  memcpy(last_dot + 1, bad_b64_sig, strlen(bad_b64_sig));
576  gpr_free(bad_b64_sig);
577  grpc_slice_unref(sig);
578 }
579 
580 static void on_verification_bad_signature(void* user_data,
582  grpc_jwt_claims* claims) {
584  GPR_ASSERT(claims == nullptr);
585  GPR_ASSERT(user_data == (void*)expected_user_data);
586 }
587 
591  char* jwt = nullptr;
594  gpr_free(key_str);
600  nullptr);
602  corrupt_jwt_sig(jwt);
603  GPR_ASSERT(jwt != nullptr);
606  const_cast<char*>(expected_user_data));
607  gpr_free(jwt);
610  grpc_core::HttpRequest::SetOverride(nullptr, nullptr, nullptr);
611 }
612 
614  const grpc_http_request* /*request*/, const char* /*host*/,
615  const char* /*path*/, grpc_core::Timestamp /*deadline*/,
616  grpc_closure* /*on_done*/, grpc_http_response* /*response*/) {
617  GPR_ASSERT(0);
618  return 1;
619 }
620 
621 static void on_verification_bad_format(void* user_data,
623  grpc_jwt_claims* claims) {
625  GPR_ASSERT(claims == nullptr);
626  GPR_ASSERT(user_data == (void*)expected_user_data);
627 }
628 
629 static void test_jwt_verifier_bad_format(void) {
637  const_cast<char*>(expected_user_data));
640  grpc_core::HttpRequest::SetOverride(nullptr, nullptr, nullptr);
641 }
642 
643 /* find verification key: bad jks, cannot find key in jks */
644 /* bad signature custom provided email*/
645 /* bad key */
646 
647 int main(int argc, char** argv) {
648  grpc::testing::TestEnvironment env(&argc, argv);
649  grpc_init();
663  grpc_shutdown();
664  return 0;
665 }
grpc_jwt_claims_issuer
const char * grpc_jwt_claims_issuer(const grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:234
test_jwt_issuer_email_domain
static void test_jwt_issuer_email_domain(void)
Definition: jwt_verifier_test.cc:175
GPR_TIMESPAN
@ GPR_TIMESPAN
Definition: gpr_types.h:45
grpc_slice_unref
GPRAPI void grpc_slice_unref(grpc_slice s)
Definition: slice_api.cc:32
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE
@ GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE
Definition: jwt_verifier.h:47
on_verification_success
static void on_verification_success(void *user_data, grpc_jwt_verifier_status status, grpc_jwt_claims *claims)
Definition: jwt_verifier_test.cc:374
json_key_str_part3_for_url_issuer
static const char json_key_str_part3_for_url_issuer[]
Definition: jwt_verifier_test.cc:70
cleanup.Json
Json
Definition: cleanup.py:49
httpcli_put_should_not_be_called
static int httpcli_put_should_not_be_called(const grpc_http_request *, const char *, const char *, const char *, size_t, grpc_core::Timestamp, grpc_closure *, grpc_http_response *)
Definition: jwt_verifier_test.cc:351
json_key_str_part1
static const char json_key_str_part1[]
Definition: jwt_verifier_test.cc:39
grpc_jwt_verifier_verify
void grpc_jwt_verifier_verify(grpc_jwt_verifier *verifier, grpc_pollset *pollset, const char *jwt, const char *audience, grpc_jwt_verification_done_cb cb, void *user_data)
Definition: jwt_verifier.cc:880
test_expired_claims_failure
static void test_expired_claims_failure(void)
Definition: jwt_verifier_test.cc:230
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
httpcli_get_bad_json
static int httpcli_get_bad_json(const grpc_http_request *, const char *, const char *, grpc_core::Timestamp, grpc_closure *on_done, grpc_http_response *response)
Definition: jwt_verifier_test.cc:502
grpc_core::Json::type
Type type() const
Definition: src/core/lib/json/json.h:174
GRPC_JWT_VERIFIER_OK
@ GRPC_JWT_VERIFIER_OK
Definition: jwt_verifier.h:42
generate.env
env
Definition: generate.py:37
GRPC_JWT_VERIFIER_BAD_SIGNATURE
@ GRPC_JWT_VERIFIER_BAD_SIGNATURE
Definition: jwt_verifier.h:43
slice.h
string.h
expired_claims
static const char expired_claims[]
Definition: jwt_verifier_test.cc:138
grpc_core::Timestamp
Definition: src/core/lib/gprpp/time.h:62
grpc_jwt_encode_and_sign
char * grpc_jwt_encode_and_sign(const grpc_auth_json_key *json_key, const char *audience, gpr_timespec token_lifetime, const char *scope)
Definition: json_token.cc:266
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
error
grpc_error_handle error
Definition: retry_filter.cc:499
test_bad_subject_claims_failure
static void test_bad_subject_claims_failure(void)
Definition: jwt_verifier_test.cc:291
GRPC_JWT_VERIFIER_BAD_SUBJECT
@ GRPC_JWT_VERIFIER_BAD_SUBJECT
Definition: jwt_verifier.h:48
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
grpc_jwt_claims_expires_at
gpr_timespec grpc_jwt_claims_expires_at(const grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:254
status
absl::Status status
Definition: rls.cc:251
grpc_jwt_claims_subject
const char * grpc_jwt_claims_subject(const grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:229
json_token.h
check_documentation.path
path
Definition: check_documentation.py:57
verifier_test_config::expected_issuer
const char * expected_issuer
Definition: jwt_verifier_test.cc:171
on_verification_bad_format
static void on_verification_bad_format(void *user_data, grpc_jwt_verifier_status status, grpc_jwt_claims *claims)
Definition: jwt_verifier_test.cc:621
grpc_auth_json_key_destruct
void grpc_auth_json_key_destruct(grpc_auth_json_key *json_key)
Definition: json_token.cc:134
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
verifier
static void verifier(grpc_server *server, grpc_completion_queue *cq, void *)
Definition: badreq.cc:31
grpc_jwt_claims_id
const char * grpc_jwt_claims_id(const grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:239
grpc_jwt_claims_destroy
void grpc_jwt_claims_destroy(grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:219
good_google_email_keys_part2
static const char good_google_email_keys_part2[]
Definition: jwt_verifier_test.cc:117
expected_user_data
static const char expected_user_data[]
Definition: jwt_verifier_test.cc:86
expected_lifetime
static gpr_timespec expected_lifetime
Definition: jwt_verifier_test.cc:105
grpc_auth_json_key_create_from_string
grpc_auth_json_key grpc_auth_json_key_create_from_string(const char *json_string)
Definition: json_token.cc:126
good_google_email_keys
static char * good_google_email_keys(void)
Definition: jwt_verifier_test.cc:322
grpc_jwt_issuer_email_domain
const char * grpc_jwt_issuer_email_domain(const char *issuer)
Definition: jwt_verifier.cc:779
grpc_core::HttpRequest::SetOverride
static void SetOverride(grpc_httpcli_get_override get, grpc_httpcli_post_override post, grpc_httpcli_put_override put)
Definition: httpcli.cc:143
httpcli_get_custom_keys_for_email
static int httpcli_get_custom_keys_for_email(const grpc_http_request *, const char *host, const char *path, grpc_core::Timestamp, grpc_closure *on_done, grpc_http_response *response)
Definition: jwt_verifier_test.cc:408
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
string_util.h
on_verification_key_retrieval_error
static void on_verification_key_retrieval_error(void *user_data, grpc_jwt_verifier_status status, grpc_jwt_claims *claims)
Definition: jwt_verifier_test.cc:494
grpc_http_response
Definition: src/core/lib/http/parser.h:85
grpc_jwt_verifier_status
grpc_jwt_verifier_status
Definition: jwt_verifier.h:41
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
jwt_verifier.h
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_auth_json_key_is_valid
int grpc_auth_json_key_is_valid(const grpc_auth_json_key *json_key)
Definition: json_token.cc:66
gpr_time_cmp
GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b)
Definition: src/core/lib/gpr/time.cc:30
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
Json
JSON (JavaScript Object Notation).
Definition: third_party/bloaty/third_party/protobuf/conformance/third_party/jsoncpp/json.h:227
grpc_core::ExecCtx::Flush
bool Flush()
Definition: exec_ctx.cc:69
GRPC_SLICE_IS_EMPTY
#define GRPC_SLICE_IS_EMPTY(slice)
Definition: include/grpc/impl/codegen/slice.h:112
grpc_base64_decode
grpc_slice grpc_base64_decode(const char *b64, int url_safe)
Definition: b64.cc:126
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
httpcli_get_jwk_set
static int httpcli_get_jwk_set(const grpc_http_request *, const char *host, const char *path, grpc_core::Timestamp, grpc_closure *on_done, grpc_http_response *response)
Definition: jwt_verifier_test.cc:443
on_verification_bad_signature
static void on_verification_bad_signature(void *user_data, grpc_jwt_verifier_status status, grpc_jwt_claims *claims)
Definition: jwt_verifier_test.cc:580
httpcli.h
GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR
@ GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR
Definition: jwt_verifier.h:46
grpc.h
grpc_jwt_claims_json
const Json * grpc_jwt_claims_json(const grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:224
verifier_test_config::expected_subject
const char * expected_subject
Definition: jwt_verifier_test.cc:172
test_jwt_verifier_url_issuer_bad_config
static void test_jwt_verifier_url_issuer_bad_config(void)
Definition: jwt_verifier_test.cc:512
custom_mapping
static grpc_jwt_verifier_email_domain_key_url_mapping custom_mapping
Definition: jwt_verifier_test.cc:83
grpc_jwt_claims_not_before
gpr_timespec grpc_jwt_claims_not_before(const grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:259
GRPC_SLICE_START_PTR
#define GRPC_SLICE_START_PTR(slice)
Definition: include/grpc/impl/codegen/slice.h:101
b64.h
httpcli_get_openid_config
static int httpcli_get_openid_config(const grpc_http_request *, const char *host, const char *path, grpc_core::Timestamp, grpc_closure *on_done, grpc_http_response *response)
Definition: jwt_verifier_test.cc:455
invalid_claims
static const char invalid_claims[]
Definition: jwt_verifier_test.cc:162
grpc_jwt_claims_audience
const char * grpc_jwt_claims_audience(const grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:244
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
main
int main(int argc, char **argv)
Definition: jwt_verifier_test.cc:647
absl::flags_internal::Parse
bool Parse(FlagOpFn op, absl::string_view text, void *dst, std::string *error)
Definition: abseil-cpp/absl/flags/internal/flag.h:125
json_key_str_part3_for_custom_email_issuer
static const char json_key_str_part3_for_custom_email_issuer[]
Definition: jwt_verifier_test.cc:76
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
httpcli_get_should_not_be_called
static int httpcli_get_should_not_be_called(const grpc_http_request *, const char *, const char *, grpc_core::Timestamp, grpc_closure *, grpc_http_response *)
Definition: jwt_verifier_test.cc:613
d
static const fe d
Definition: curve25519_tables.h:19
grpc_core::ExecCtx
Definition: exec_ctx.h:97
httpcli_get_google_keys_for_email
static int httpcli_get_google_keys_for_email(const grpc_http_request *, const char *host, const char *path, grpc_core::Timestamp, grpc_closure *on_done, grpc_http_response *response)
Definition: jwt_verifier_test.cc:360
grpc_base64_encode
char * grpc_base64_encode(const void *vdata, size_t data_size, int url_safe, int multiline)
Definition: b64.cc:59
GRPC_OPENID_CONFIG_URL_SUFFIX
#define GRPC_OPENID_CONFIG_URL_SUFFIX
Definition: jwt_verifier.h:34
key_str
static char * key_str(grpc_error_strs which)
Definition: error.cc:796
GRPC_JWT_VERIFIER_BAD_FORMAT
@ GRPC_JWT_VERIFIER_BAD_FORMAT
Definition: jwt_verifier.h:44
good_jwk_set
static const char good_jwk_set[]
Definition: jwt_verifier_test.cc:88
GRPC_SLICE_LENGTH
#define GRPC_SLICE_LENGTH(slice)
Definition: include/grpc/impl/codegen/slice.h:104
verifier_test_config
Definition: jwt_verifier_test.cc:169
test_config.h
claims_with_bad_subject
static const char claims_with_bad_subject[]
Definition: jwt_verifier_test.cc:155
key
const char * key
Definition: hpack_parser_table.cc:164
grpc_jwt_verifier_email_domain_key_url_mapping
Definition: jwt_verifier.h:76
good_google_email_keys_part1
static const char good_google_email_keys_part1[]
Definition: jwt_verifier_test.cc:107
json_key_str
static char * json_key_str(const char *last_part)
Definition: jwt_verifier_test.cc:309
grpc_jwt_claims_from_json
grpc_jwt_claims * grpc_jwt_claims_from_json(Json json)
Definition: jwt_verifier.cc:264
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
test_jwt_verifier_bad_format
static void test_jwt_verifier_bad_format(void)
Definition: jwt_verifier_test.cc:629
grpc_jwt_verifier_create
grpc_jwt_verifier * grpc_jwt_verifier_create(const grpc_jwt_verifier_email_domain_key_url_mapping *mappings, size_t num_mappings)
Definition: jwt_verifier.cc:925
test_jwt_verifier_custom_email_issuer_success
static void test_jwt_verifier_custom_email_issuer_success(void)
Definition: jwt_verifier_test.cc:419
test_jwt_verifier_google_email_issuer_success
static void test_jwt_verifier_google_email_issuer_success(void)
Definition: jwt_verifier_test.cc:384
alloc.h
asyncio_get_stats.response
response
Definition: asyncio_get_stats.py:28
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
test_bad_audience_claims_failure
static void test_bad_audience_claims_failure(void)
Definition: jwt_verifier_test.cc:273
corrupt_jwt_sig
static void corrupt_jwt_sig(char *jwt)
Definition: jwt_verifier_test.cc:560
http_response
static grpc_http_response http_response(int status, char *body)
Definition: jwt_verifier_test.cc:333
grpc_jwt_verifier
Definition: jwt_verifier.cc:422
grpc_core::ExecCtx::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: exec_ctx.cc:98
expected_audience
static const char expected_audience[]
Definition: jwt_verifier_test.cc:125
json_key_str_part2
static const char json_key_str_part2[]
Definition: jwt_verifier_test.cc:50
grpc_jwt_claims_check
grpc_jwt_verifier_status grpc_jwt_claims_check(const grpc_jwt_claims *claims, const char *audience)
Definition: jwt_verifier.cc:309
gpr_strdup
GPRAPI char * gpr_strdup(const char *src)
Definition: string.cc:39
grpc_jwt_claims
Definition: jwt_verifier.cc:206
httpcli_post_should_not_be_called
static int httpcli_post_should_not_be_called(const grpc_http_request *, const char *, const char *, const char *, size_t, grpc_core::Timestamp, grpc_closure *, grpc_http_response *)
Definition: jwt_verifier_test.cc:342
test_invalid_claims_failure
static void test_invalid_claims_failure(void)
Definition: jwt_verifier_test.cc:260
verifier_test_config::expected_status
grpc_jwt_verifier_status expected_status
Definition: jwt_verifier_test.cc:170
grpc_jwt_claims_issued_at
gpr_timespec grpc_jwt_claims_issued_at(const grpc_jwt_claims *claims)
Definition: jwt_verifier.cc:249
grpc_jwt_verifier_destroy
void grpc_jwt_verifier_destroy(grpc_jwt_verifier *v)
Definition: jwt_verifier.cc:947
test_jwt_verifier_bad_json_key
static void test_jwt_verifier_bad_json_key(void)
Definition: jwt_verifier_test.cc:536
gpr_timespec
Definition: gpr_types.h:50
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_error
Definition: error_internal.h:42
GPR_CLOCK_REALTIME
@ GPR_CLOCK_REALTIME
Definition: gpr_types.h:39
good_openid_config
static const char good_openid_config[]
Definition: jwt_verifier_test.cc:127
test_jwt_verifier_url_issuer_success
static void test_jwt_verifier_url_issuer_success(void)
Definition: jwt_verifier_test.cc:470
claims_without_time_constraint
static const char claims_without_time_constraint[]
Definition: jwt_verifier_test.cc:148
grpc_closure
Definition: closure.h:56
test_jwt_verifier_bad_signature
static void test_jwt_verifier_bad_signature(void)
Definition: jwt_verifier_test.cc:588
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
GRPC_JWT_VERIFIER_BAD_AUDIENCE
@ GRPC_JWT_VERIFIER_BAD_AUDIENCE
Definition: jwt_verifier.h:45
grpc_core::ExecCtx::Get
static ExecCtx * Get()
Definition: exec_ctx.h:205
json_key_str_part3_for_google_email_issuer
static const char json_key_str_part3_for_google_email_issuer[]
Definition: jwt_verifier_test.cc:62
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
grpc_http_request
Definition: src/core/lib/http/parser.h:69
grpc_auth_json_key
Definition: json_token.h:36
test_claims_success
static void test_claims_success(void)
Definition: jwt_verifier_test.cc:207


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:14