blob: 747508f6f62ff028aada21e997ff37affa5f5be3 [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>
Julien Boeuffeca1bf2015-06-22 16:46:20 +020026#include <grpc/support/log.h>
Julien Boeuffeca1bf2015-06-22 16:46:20 +020027#include <grpc/support/sync.h>
28
Julien Boeuf8ca294e2016-05-02 14:56:30 -070029#include "src/core/lib/security/credentials/jwt/jwt_verifier.h"
Vijay Pai8a99fdb2018-01-25 15:38:20 -080030#include "test/core/util/cmdline.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);
Jan Tattermusch148700a2018-01-12 09:18:21 +010042 fflush(stderr);
Craig Tillera82950e2015-09-22 12:33:20 -070043 gpr_free(usage);
44 gpr_cmdline_destroy(cl);
45 exit(1);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020046}
47
Yash Tibrewal8cf14702017-12-06 09:47:54 -080048static void on_jwt_verification_done(void* user_data,
Craig Tillera82950e2015-09-22 12:33:20 -070049 grpc_jwt_verifier_status status,
Craig Tillerbaa14a92017-11-03 09:09:36 -070050 grpc_jwt_claims* claims) {
Yash Tibrewal40422d52017-11-06 14:39:17 -080051 synchronizer* sync = static_cast<synchronizer*>(user_data);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020052
53 sync->success = (status == GRPC_JWT_VERIFIER_OK);
Craig Tillera82950e2015-09-22 12:33:20 -070054 if (sync->success) {
Craig Tillerbaa14a92017-11-03 09:09:36 -070055 char* claims_str;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080056 GPR_ASSERT(claims != nullptr);
Craig Tillera82950e2015-09-22 12:33:20 -070057 claims_str =
Craig Tillerbaa14a92017-11-03 09:09:36 -070058 grpc_json_dump_to_string((grpc_json*)grpc_jwt_claims_json(claims), 2);
Craig Tillera82950e2015-09-22 12:33:20 -070059 printf("Claims: \n\n%s\n", claims_str);
60 gpr_free(claims_str);
Yash Tibrewal8cf14702017-12-06 09:47:54 -080061 grpc_jwt_claims_destroy(claims);
Craig Tillera82950e2015-09-22 12:33:20 -070062 } else {
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080063 GPR_ASSERT(claims == nullptr);
Craig Tillera82950e2015-09-22 12:33:20 -070064 fprintf(stderr, "Verification failed with error %s\n",
65 grpc_jwt_verifier_status_to_string(status));
Jan Tattermusch148700a2018-01-12 09:18:21 +010066 fflush(stderr);
Craig Tillera82950e2015-09-22 12:33:20 -070067 }
Julien Boeuffeca1bf2015-06-22 16:46:20 +020068
Craig Tiller69b093b2016-02-25 19:04:07 -080069 gpr_mu_lock(sync->mu);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020070 sync->is_done = 1;
Yash Tibrewal8cf14702017-12-06 09:47:54 -080071 GRPC_LOG_IF_ERROR("pollset_kick", grpc_pollset_kick(sync->pollset, nullptr));
Craig Tiller69b093b2016-02-25 19:04:07 -080072 gpr_mu_unlock(sync->mu);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020073}
74
Craig Tillerbaa14a92017-11-03 09:09:36 -070075int main(int argc, char** argv) {
Julien Boeuffeca1bf2015-06-22 16:46:20 +020076 synchronizer sync;
Craig Tillerbaa14a92017-11-03 09:09:36 -070077 grpc_jwt_verifier* verifier;
78 gpr_cmdline* cl;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080079 const char* jwt = nullptr;
80 const char* aud = nullptr;
Yash Tibrewal8cf14702017-12-06 09:47:54 -080081 grpc_core::ExecCtx exec_ctx;
Julien Boeuffeca1bf2015-06-22 16:46:20 +020082
Julien Boeuf964d7bb2016-11-17 16:59:48 -080083 grpc_init();
Craig Tillera82950e2015-09-22 12:33:20 -070084 cl = gpr_cmdline_create("JWT verifier tool");
85 gpr_cmdline_add_string(cl, "jwt", "JSON web token to verify", &jwt);
86 gpr_cmdline_add_string(cl, "aud", "Audience for the JWT", &aud);
87 gpr_cmdline_parse(cl, argc, argv);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080088 if (jwt == nullptr || aud == nullptr) {
Craig Tillera82950e2015-09-22 12:33:20 -070089 print_usage_and_exit(cl, argv[0]);
90 }
Julien Boeuffeca1bf2015-06-22 16:46:20 +020091
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080092 verifier = grpc_jwt_verifier_create(nullptr, 0);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020093
Craig Tillera82950e2015-09-22 12:33:20 -070094 grpc_init();
Julien Boeuffeca1bf2015-06-22 16:46:20 +020095
Yash Tibrewal40422d52017-11-06 14:39:17 -080096 sync.pollset = static_cast<grpc_pollset*>(gpr_zalloc(grpc_pollset_size()));
Craig Tiller69b093b2016-02-25 19:04:07 -080097 grpc_pollset_init(sync.pollset, &sync.mu);
Julien Boeuffeca1bf2015-06-22 16:46:20 +020098 sync.is_done = 0;
99
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800100 grpc_jwt_verifier_verify(verifier, sync.pollset, jwt, aud,
Craig Tillera82950e2015-09-22 12:33:20 -0700101 on_jwt_verification_done, &sync);
Julien Boeuffeca1bf2015-06-22 16:46:20 +0200102
Craig Tiller69b093b2016-02-25 19:04:07 -0800103 gpr_mu_lock(sync.mu);
Craig Tillera82950e2015-09-22 12:33:20 -0700104 while (!sync.is_done) {
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800105 grpc_pollset_worker* worker = nullptr;
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800106 if (!GRPC_LOG_IF_ERROR(
107 "pollset_work",
108 grpc_pollset_work(sync.pollset, &worker, GRPC_MILLIS_INF_FUTURE)))
Craig Tiller1aee5362016-05-07 11:26:50 -0700109 sync.is_done = true;
Craig Tiller69b093b2016-02-25 19:04:07 -0800110 gpr_mu_unlock(sync.mu);
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800111 grpc_core::ExecCtx::Get()->Flush();
Craig Tiller69b093b2016-02-25 19:04:07 -0800112 gpr_mu_lock(sync.mu);
Craig Tillera82950e2015-09-22 12:33:20 -0700113 }
Craig Tiller69b093b2016-02-25 19:04:07 -0800114 gpr_mu_unlock(sync.mu);
115
116 gpr_free(sync.pollset);
Julien Boeuffeca1bf2015-06-22 16:46:20 +0200117
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800118 grpc_jwt_verifier_destroy(verifier);
119
Craig Tillera82950e2015-09-22 12:33:20 -0700120 gpr_cmdline_destroy(cl);
Julien Boeuf964d7bb2016-11-17 16:59:48 -0800121 grpc_shutdown();
Julien Boeuffeca1bf2015-06-22 16:46:20 +0200122 return !sync.success;
123}