blob: e039970c6714159451b20306c0a8474960031b46 [file] [log] [blame]
Julien Boeuffeca1bf2015-06-22 16:46:20 +02001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2015 gRPC authors.
Julien Boeuffeca1bf2015-06-22 16:46:20 +02004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * 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
Julien Boeuffeca1bf2015-06-22 16:46:20 +02008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Julien Boeuffeca1bf2015-06-22 16:46:20 +020010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * 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.
Julien Boeuffeca1bf2015-06-22 16:46:20 +020016 *
17 */
18
19#include <stdio.h>
20#include <string.h>
21
Julien Boeuffeca1bf2015-06-22 16:46:20 +020022#include <grpc/grpc.h>
23#include <grpc/grpc_security.h>
Craig Tiller28b72422016-10-26 21:15:29 -070024#include <grpc/slice.h>
Julien Boeuffeca1bf2015-06-22 16:46:20 +020025#include <grpc/support/alloc.h>
26#include <grpc/support/cmdline.h>
27#include <grpc/support/log.h>
Julien Boeuffeca1bf2015-06-22 16:46:20 +020028#include <grpc/support/sync.h>
29
Julien Boeuf8ca294e2016-05-02 14:56:30 -070030#include "src/core/lib/security/credentials/jwt/jwt_verifier.h"
Craig Tiller69b093b2016-02-25 19:04:07 -080031
Craig Tillera82950e2015-09-22 12:33:20 -070032typedef struct {
Craig Tillerbaa14a92017-11-03 09:09:36 -070033 grpc_pollset* pollset;
34 gpr_mu* mu;
Julien Boeuffeca1bf2015-06-22 16:46:20 +020035 int is_done;
36 int success;
37} synchronizer;
38
Craig Tillerbaa14a92017-11-03 09:09:36 -070039static void print_usage_and_exit(gpr_cmdline* cl, const char* argv0) {
40 char* usage = gpr_cmdline_usage_string(cl, argv0);
Craig Tillera82950e2015-09-22 12:33:20 -070041 fprintf(stderr, "%s", usage);
42 gpr_free(usage);
43 gpr_cmdline_destroy(cl);
44 exit(1);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020045}
46
Yash Tibrewal8cf14702017-12-06 09:47:54 -080047static void on_jwt_verification_done(void* user_data,
Craig Tillera82950e2015-09-22 12:33:20 -070048 grpc_jwt_verifier_status status,
Craig Tillerbaa14a92017-11-03 09:09:36 -070049 grpc_jwt_claims* claims) {
Yash Tibrewal40422d52017-11-06 14:39:17 -080050 synchronizer* sync = static_cast<synchronizer*>(user_data);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020051
52 sync->success = (status == GRPC_JWT_VERIFIER_OK);
Craig Tillera82950e2015-09-22 12:33:20 -070053 if (sync->success) {
Craig Tillerbaa14a92017-11-03 09:09:36 -070054 char* claims_str;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080055 GPR_ASSERT(claims != nullptr);
Craig Tillera82950e2015-09-22 12:33:20 -070056 claims_str =
Craig Tillerbaa14a92017-11-03 09:09:36 -070057 grpc_json_dump_to_string((grpc_json*)grpc_jwt_claims_json(claims), 2);
Craig Tillera82950e2015-09-22 12:33:20 -070058 printf("Claims: \n\n%s\n", claims_str);
59 gpr_free(claims_str);
Yash Tibrewal8cf14702017-12-06 09:47:54 -080060 grpc_jwt_claims_destroy(claims);
Craig Tillera82950e2015-09-22 12:33:20 -070061 } else {
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080062 GPR_ASSERT(claims == nullptr);
Craig Tillera82950e2015-09-22 12:33:20 -070063 fprintf(stderr, "Verification failed with error %s\n",
64 grpc_jwt_verifier_status_to_string(status));
65 }
Julien Boeuffeca1bf2015-06-22 16:46:20 +020066
Craig Tiller69b093b2016-02-25 19:04:07 -080067 gpr_mu_lock(sync->mu);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020068 sync->is_done = 1;
Yash Tibrewal8cf14702017-12-06 09:47:54 -080069 GRPC_LOG_IF_ERROR("pollset_kick", grpc_pollset_kick(sync->pollset, nullptr));
Craig Tiller69b093b2016-02-25 19:04:07 -080070 gpr_mu_unlock(sync->mu);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020071}
72
Craig Tillerbaa14a92017-11-03 09:09:36 -070073int main(int argc, char** argv) {
Julien Boeuffeca1bf2015-06-22 16:46:20 +020074 synchronizer sync;
Craig Tillerbaa14a92017-11-03 09:09:36 -070075 grpc_jwt_verifier* verifier;
76 gpr_cmdline* cl;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080077 const char* jwt = nullptr;
78 const char* aud = nullptr;
Yash Tibrewal8cf14702017-12-06 09:47:54 -080079 grpc_core::ExecCtx exec_ctx;
Julien Boeuffeca1bf2015-06-22 16:46:20 +020080
Julien Boeuf964d7bb2016-11-17 16:59:48 -080081 grpc_init();
Craig Tillera82950e2015-09-22 12:33:20 -070082 cl = gpr_cmdline_create("JWT verifier tool");
83 gpr_cmdline_add_string(cl, "jwt", "JSON web token to verify", &jwt);
84 gpr_cmdline_add_string(cl, "aud", "Audience for the JWT", &aud);
85 gpr_cmdline_parse(cl, argc, argv);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080086 if (jwt == nullptr || aud == nullptr) {
Craig Tillera82950e2015-09-22 12:33:20 -070087 print_usage_and_exit(cl, argv[0]);
88 }
Julien Boeuffeca1bf2015-06-22 16:46:20 +020089
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080090 verifier = grpc_jwt_verifier_create(nullptr, 0);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020091
Craig Tillera82950e2015-09-22 12:33:20 -070092 grpc_init();
Julien Boeuffeca1bf2015-06-22 16:46:20 +020093
Yash Tibrewal40422d52017-11-06 14:39:17 -080094 sync.pollset = static_cast<grpc_pollset*>(gpr_zalloc(grpc_pollset_size()));
Craig Tiller69b093b2016-02-25 19:04:07 -080095 grpc_pollset_init(sync.pollset, &sync.mu);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020096 sync.is_done = 0;
97
Yash Tibrewal8cf14702017-12-06 09:47:54 -080098 grpc_jwt_verifier_verify(verifier, sync.pollset, jwt, aud,
Craig Tillera82950e2015-09-22 12:33:20 -070099 on_jwt_verification_done, &sync);
Julien Boeuffeca1bf2015-06-22 16:46:20 +0200100
Craig Tiller69b093b2016-02-25 19:04:07 -0800101 gpr_mu_lock(sync.mu);
Craig Tillera82950e2015-09-22 12:33:20 -0700102 while (!sync.is_done) {
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800103 grpc_pollset_worker* worker = nullptr;
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800104 if (!GRPC_LOG_IF_ERROR(
105 "pollset_work",
106 grpc_pollset_work(sync.pollset, &worker, GRPC_MILLIS_INF_FUTURE)))
Craig Tiller1aee5362016-05-07 11:26:50 -0700107 sync.is_done = true;
Craig Tiller69b093b2016-02-25 19:04:07 -0800108 gpr_mu_unlock(sync.mu);
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800109 grpc_core::ExecCtx::Get()->Flush();
Craig Tiller69b093b2016-02-25 19:04:07 -0800110 gpr_mu_lock(sync.mu);
Craig Tillera82950e2015-09-22 12:33:20 -0700111 }
Craig Tiller69b093b2016-02-25 19:04:07 -0800112 gpr_mu_unlock(sync.mu);
113
114 gpr_free(sync.pollset);
Julien Boeuffeca1bf2015-06-22 16:46:20 +0200115
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800116 grpc_jwt_verifier_destroy(verifier);
117
Craig Tillera82950e2015-09-22 12:33:20 -0700118 gpr_cmdline_destroy(cl);
Julien Boeuf964d7bb2016-11-17 16:59:48 -0800119 grpc_shutdown();
Julien Boeuffeca1bf2015-06-22 16:46:20 +0200120 return !sync.success;
121}