Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: third_party/grpc/src/core/security/credentials.h

Issue 1932353002: Initial checkin of gRPC to third_party/ Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 *
3 * Copyright 2015-2016, Google Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
34 #ifndef GRPC_INTERNAL_CORE_SECURITY_CREDENTIALS_H
35 #define GRPC_INTERNAL_CORE_SECURITY_CREDENTIALS_H
36
37 #include "src/core/transport/metadata_batch.h"
38 #include <grpc/grpc.h>
39 #include <grpc/grpc_security.h>
40 #include <grpc/support/sync.h>
41
42 #include "src/core/httpcli/httpcli.h"
43 #include "src/core/security/json_token.h"
44 #include "src/core/security/security_connector.h"
45
46 struct grpc_httpcli_response;
47
48 /* --- Constants. --- */
49
50 typedef enum {
51 GRPC_CREDENTIALS_OK = 0,
52 GRPC_CREDENTIALS_ERROR
53 } grpc_credentials_status;
54
55 #define GRPC_FAKE_TRANSPORT_SECURITY_TYPE "fake"
56
57 #define GRPC_CHANNEL_CREDENTIALS_TYPE_SSL "Ssl"
58 #define GRPC_CHANNEL_CREDENTIALS_TYPE_FAKE_TRANSPORT_SECURITY \
59 "FakeTransportSecurity"
60
61 #define GRPC_CALL_CREDENTIALS_TYPE_OAUTH2 "Oauth2"
62 #define GRPC_CALL_CREDENTIALS_TYPE_JWT "Jwt"
63 #define GRPC_CALL_CREDENTIALS_TYPE_IAM "Iam"
64 #define GRPC_CALL_CREDENTIALS_TYPE_COMPOSITE "Composite"
65
66 #define GRPC_AUTHORIZATION_METADATA_KEY "authorization"
67 #define GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY \
68 "x-goog-iam-authorization-token"
69 #define GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY "x-goog-iam-authority-selector"
70
71 #define GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY "gcloud"
72 #define GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE \
73 "application_default_credentials.json"
74
75 #define GRPC_SECURE_TOKEN_REFRESH_THRESHOLD_SECS 60
76
77 #define GRPC_COMPUTE_ENGINE_METADATA_HOST "metadata"
78 #define GRPC_COMPUTE_ENGINE_METADATA_TOKEN_PATH \
79 "/computeMetadata/v1/instance/service-accounts/default/token"
80
81 #define GRPC_GOOGLE_OAUTH2_SERVICE_HOST "www.googleapis.com"
82 #define GRPC_GOOGLE_OAUTH2_SERVICE_TOKEN_PATH "/oauth2/v3/token"
83
84 #define GRPC_SERVICE_ACCOUNT_POST_BODY_PREFIX \
85 "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&" \
86 "assertion="
87
88 #define GRPC_REFRESH_TOKEN_POST_BODY_FORMAT_STRING \
89 "client_id=%s&client_secret=%s&refresh_token=%s&grant_type=refresh_token"
90
91 /* --- Google utils --- */
92
93 /* It is the caller's responsibility to gpr_free the result if not NULL. */
94 char *grpc_get_well_known_google_credentials_file_path(void);
95
96 /* Implementation function for the different platforms. */
97 char *grpc_get_well_known_google_credentials_file_path_impl(void);
98
99 /* Override for testing only. Not thread-safe */
100 typedef char *(*grpc_well_known_credentials_path_getter)(void);
101 void grpc_override_well_known_credentials_path_getter(
102 grpc_well_known_credentials_path_getter getter);
103
104 /* --- grpc_channel_credentials. --- */
105
106 typedef struct {
107 void (*destruct)(grpc_channel_credentials *c);
108
109 grpc_security_status (*create_security_connector)(
110 grpc_channel_credentials *c, grpc_call_credentials *call_creds,
111 const char *target, const grpc_channel_args *args,
112 grpc_channel_security_connector **sc, grpc_channel_args **new_args);
113 } grpc_channel_credentials_vtable;
114
115 struct grpc_channel_credentials {
116 const grpc_channel_credentials_vtable *vtable;
117 const char *type;
118 gpr_refcount refcount;
119 };
120
121 grpc_channel_credentials *grpc_channel_credentials_ref(
122 grpc_channel_credentials *creds);
123 void grpc_channel_credentials_unref(grpc_channel_credentials *creds);
124
125 /* Creates a security connector for the channel. May also create new channel
126 args for the channel to be used in place of the passed in const args if
127 returned non NULL. In that case the caller is responsible for destroying
128 new_args after channel creation. */
129 grpc_security_status grpc_channel_credentials_create_security_connector(
130 grpc_channel_credentials *creds, const char *target,
131 const grpc_channel_args *args, grpc_channel_security_connector **sc,
132 grpc_channel_args **new_args);
133
134 /* --- grpc_credentials_md. --- */
135
136 typedef struct {
137 gpr_slice key;
138 gpr_slice value;
139 } grpc_credentials_md;
140
141 typedef struct {
142 grpc_credentials_md *entries;
143 size_t num_entries;
144 size_t allocated;
145 gpr_refcount refcount;
146 } grpc_credentials_md_store;
147
148 grpc_credentials_md_store *grpc_credentials_md_store_create(
149 size_t initial_capacity);
150
151 /* Will ref key and value. */
152 void grpc_credentials_md_store_add(grpc_credentials_md_store *store,
153 gpr_slice key, gpr_slice value);
154 void grpc_credentials_md_store_add_cstrings(grpc_credentials_md_store *store,
155 const char *key, const char *value);
156 grpc_credentials_md_store *grpc_credentials_md_store_ref(
157 grpc_credentials_md_store *store);
158 void grpc_credentials_md_store_unref(grpc_credentials_md_store *store);
159
160 /* --- grpc_call_credentials. --- */
161
162 typedef void (*grpc_credentials_metadata_cb)(grpc_exec_ctx *exec_ctx,
163 void *user_data,
164 grpc_credentials_md *md_elems,
165 size_t num_md,
166 grpc_credentials_status status);
167
168 typedef struct {
169 void (*destruct)(grpc_call_credentials *c);
170 void (*get_request_metadata)(grpc_exec_ctx *exec_ctx,
171 grpc_call_credentials *c, grpc_pollset *pollset,
172 grpc_auth_metadata_context context,
173 grpc_credentials_metadata_cb cb,
174 void *user_data);
175 } grpc_call_credentials_vtable;
176
177 struct grpc_call_credentials {
178 const grpc_call_credentials_vtable *vtable;
179 const char *type;
180 gpr_refcount refcount;
181 };
182
183 grpc_call_credentials *grpc_call_credentials_ref(grpc_call_credentials *creds);
184 void grpc_call_credentials_unref(grpc_call_credentials *creds);
185 void grpc_call_credentials_get_request_metadata(
186 grpc_exec_ctx *exec_ctx, grpc_call_credentials *creds,
187 grpc_pollset *pollset, grpc_auth_metadata_context context,
188 grpc_credentials_metadata_cb cb, void *user_data);
189
190 typedef struct {
191 grpc_call_credentials **creds_array;
192 size_t num_creds;
193 } grpc_call_credentials_array;
194
195 const grpc_call_credentials_array *
196 grpc_composite_call_credentials_get_credentials(
197 grpc_call_credentials *composite_creds);
198
199 /* Returns creds if creds is of the specified type or the inner creds of the
200 specified type (if found), if the creds is of type COMPOSITE.
201 If composite_creds is not NULL, *composite_creds will point to creds if of
202 type COMPOSITE in case of success. */
203 grpc_call_credentials *grpc_credentials_contains_type(
204 grpc_call_credentials *creds, const char *type,
205 grpc_call_credentials **composite_creds);
206
207 /* Exposed for testing only. */
208 grpc_credentials_status
209 grpc_oauth2_token_fetcher_credentials_parse_server_response(
210 const struct grpc_httpcli_response *response,
211 grpc_credentials_md_store **token_md, gpr_timespec *token_lifetime);
212
213 void grpc_flush_cached_google_default_credentials(void);
214
215 /* Metadata-only credentials with the specified key and value where
216 asynchronicity can be simulated for testing. */
217 grpc_call_credentials *grpc_md_only_test_credentials_create(
218 const char *md_key, const char *md_value, int is_async);
219
220 /* Private constructor for jwt credentials from an already parsed json key.
221 Takes ownership of the key. */
222 grpc_call_credentials *
223 grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
224 grpc_auth_json_key key, gpr_timespec token_lifetime);
225
226 /* Private constructor for refresh token credentials from an already parsed
227 refresh token. Takes ownership of the refresh token. */
228 grpc_call_credentials *
229 grpc_refresh_token_credentials_create_from_auth_refresh_token(
230 grpc_auth_refresh_token token);
231
232 /* --- grpc_server_credentials. --- */
233
234 typedef struct {
235 void (*destruct)(grpc_server_credentials *c);
236 grpc_security_status (*create_security_connector)(
237 grpc_server_credentials *c, grpc_server_security_connector **sc);
238 } grpc_server_credentials_vtable;
239
240 struct grpc_server_credentials {
241 const grpc_server_credentials_vtable *vtable;
242 const char *type;
243 gpr_refcount refcount;
244 grpc_auth_metadata_processor processor;
245 };
246
247 grpc_security_status grpc_server_credentials_create_security_connector(
248 grpc_server_credentials *creds, grpc_server_security_connector **sc);
249
250 grpc_server_credentials *grpc_server_credentials_ref(
251 grpc_server_credentials *creds);
252
253 void grpc_server_credentials_unref(grpc_server_credentials *creds);
254
255 #define GRPC_SERVER_CREDENTIALS_ARG "grpc.server_credentials"
256
257 grpc_arg grpc_server_credentials_to_arg(grpc_server_credentials *c);
258 grpc_server_credentials *grpc_server_credentials_from_arg(const grpc_arg *arg);
259 grpc_server_credentials *grpc_find_server_credentials_in_args(
260 const grpc_channel_args *args);
261
262 /* -- Fake transport security credentials. -- */
263
264 /* Creates a fake transport security credentials object for testing. */
265 grpc_channel_credentials *grpc_fake_transport_security_credentials_create(void);
266 /* Creates a fake server transport security credentials object for testing. */
267 grpc_server_credentials *grpc_fake_transport_security_server_credentials_create(
268 void);
269
270 /* -- Ssl credentials. -- */
271
272 typedef struct {
273 grpc_channel_credentials base;
274 grpc_ssl_config config;
275 } grpc_ssl_credentials;
276
277 typedef struct {
278 grpc_server_credentials base;
279 grpc_ssl_server_config config;
280 } grpc_ssl_server_credentials;
281
282 /* -- Channel composite credentials. -- */
283
284 typedef struct {
285 grpc_channel_credentials base;
286 grpc_channel_credentials *inner_creds;
287 grpc_call_credentials *call_creds;
288 } grpc_composite_channel_credentials;
289
290 /* -- Jwt credentials -- */
291
292 typedef struct {
293 grpc_call_credentials base;
294
295 /* Have a simple cache for now with just 1 entry. We could have a map based on
296 the service_url for a more sophisticated one. */
297 gpr_mu cache_mu;
298 struct {
299 grpc_credentials_md_store *jwt_md;
300 char *service_url;
301 gpr_timespec jwt_expiration;
302 } cached;
303
304 grpc_auth_json_key key;
305 gpr_timespec jwt_lifetime;
306 } grpc_service_account_jwt_access_credentials;
307
308 /* -- Oauth2TokenFetcher credentials --
309
310 This object is a base for credentials that need to acquire an oauth2 token
311 from an http service. */
312
313 typedef struct grpc_credentials_metadata_request
314 grpc_credentials_metadata_request;
315
316 typedef void (*grpc_fetch_oauth2_func)(grpc_exec_ctx *exec_ctx,
317 grpc_credentials_metadata_request *req,
318 grpc_httpcli_context *http_context,
319 grpc_pollset *pollset,
320 grpc_httpcli_response_cb response_cb,
321 gpr_timespec deadline);
322
323 typedef struct {
324 grpc_call_credentials base;
325 gpr_mu mu;
326 grpc_credentials_md_store *access_token_md;
327 gpr_timespec token_expiration;
328 grpc_httpcli_context httpcli_context;
329 grpc_fetch_oauth2_func fetch_func;
330 } grpc_oauth2_token_fetcher_credentials;
331
332 /* -- GoogleRefreshToken credentials. -- */
333
334 typedef struct {
335 grpc_oauth2_token_fetcher_credentials base;
336 grpc_auth_refresh_token refresh_token;
337 } grpc_google_refresh_token_credentials;
338
339 /* -- Oauth2 Access Token credentials. -- */
340
341 typedef struct {
342 grpc_call_credentials base;
343 grpc_credentials_md_store *access_token_md;
344 } grpc_access_token_credentials;
345
346 /* -- Metadata-only Test credentials. -- */
347
348 typedef struct {
349 grpc_call_credentials base;
350 grpc_credentials_md_store *md_store;
351 int is_async;
352 } grpc_md_only_test_credentials;
353
354 /* -- GoogleIAM credentials. -- */
355
356 typedef struct {
357 grpc_call_credentials base;
358 grpc_credentials_md_store *iam_md;
359 } grpc_google_iam_credentials;
360
361 /* -- Composite credentials. -- */
362
363 typedef struct {
364 grpc_call_credentials base;
365 grpc_call_credentials_array inner;
366 } grpc_composite_call_credentials;
367
368 /* -- Plugin credentials. -- */
369
370 typedef struct {
371 grpc_call_credentials base;
372 grpc_metadata_credentials_plugin plugin;
373 grpc_credentials_md_store *plugin_md;
374 } grpc_plugin_credentials;
375
376 #endif /* GRPC_INTERNAL_CORE_SECURITY_CREDENTIALS_H */
OLDNEW
« no previous file with comments | « third_party/grpc/src/core/security/client_auth_filter.c ('k') | third_party/grpc/src/core/security/credentials.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698