blob: 4f35506882207c0488887629681aa9fb4b5041b8 [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 * 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
Nicolas "Pixel" Noble1ff52d52015-03-01 05:24:36 +010034#ifndef GRPC_GRPC_SECURITY_H
35#define GRPC_GRPC_SECURITY_H
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080036
Nicolas "Pixel" Noble1ed15e22015-06-09 02:24:35 +020037#include <grpc/grpc.h>
Deepak Lukosedba4c5f2016-03-25 12:54:25 -070038#include <grpc/grpc_security_constants.h>
Nicolas "Pixel" Noble1ed15e22015-06-09 02:24:35 +020039#include <grpc/status.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080040
nnoble0c475f02014-12-05 15:37:39 -080041#ifdef __cplusplus
42extern "C" {
43#endif
44
Alexander Polcynd809a152017-05-03 14:49:41 -070045/** --- Authentication Context. --- */
Julien Boeufea44bba2015-11-18 15:56:01 -080046
Julien Boeufea44bba2015-11-18 15:56:01 -080047typedef struct grpc_auth_context grpc_auth_context;
48
49typedef struct grpc_auth_property_iterator {
50 const grpc_auth_context *ctx;
51 size_t index;
52 const char *name;
53} grpc_auth_property_iterator;
54
Alexander Polcynd809a152017-05-03 14:49:41 -070055/** value, if not NULL, is guaranteed to be NULL terminated. */
Julien Boeufea44bba2015-11-18 15:56:01 -080056typedef struct grpc_auth_property {
57 char *name;
58 char *value;
59 size_t value_length;
60} grpc_auth_property;
61
Alexander Polcynd809a152017-05-03 14:49:41 -070062/** Returns NULL when the iterator is at the end. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +010063GRPCAPI const grpc_auth_property *grpc_auth_property_iterator_next(
Julien Boeufea44bba2015-11-18 15:56:01 -080064 grpc_auth_property_iterator *it);
65
Alexander Polcynd809a152017-05-03 14:49:41 -070066/** Iterates over the auth context. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +010067GRPCAPI grpc_auth_property_iterator
Craig Tillerd6546c92016-01-29 07:59:35 -080068grpc_auth_context_property_iterator(const grpc_auth_context *ctx);
Julien Boeufea44bba2015-11-18 15:56:01 -080069
Alexander Polcynd809a152017-05-03 14:49:41 -070070/** Gets the peer identity. Returns an empty iterator (first _next will return
Julien Boeufea44bba2015-11-18 15:56:01 -080071 NULL) if the peer is not authenticated. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +010072GRPCAPI grpc_auth_property_iterator
Craig Tillerd6546c92016-01-29 07:59:35 -080073grpc_auth_context_peer_identity(const grpc_auth_context *ctx);
Julien Boeufea44bba2015-11-18 15:56:01 -080074
Alexander Polcynd809a152017-05-03 14:49:41 -070075/** Finds a property in the context. May return an empty iterator (first _next
Julien Boeufea44bba2015-11-18 15:56:01 -080076 will return NULL) if no property with this name was found in the context. */
Craig Tillerf40df232016-03-25 13:38:14 -070077GRPCAPI grpc_auth_property_iterator grpc_auth_context_find_properties_by_name(
78 const grpc_auth_context *ctx, const char *name);
Julien Boeufea44bba2015-11-18 15:56:01 -080079
Alexander Polcynd809a152017-05-03 14:49:41 -070080/** Gets the name of the property that indicates the peer identity. Will return
Julien Boeufea44bba2015-11-18 15:56:01 -080081 NULL if the peer is not authenticated. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +010082GRPCAPI const char *grpc_auth_context_peer_identity_property_name(
Julien Boeufea44bba2015-11-18 15:56:01 -080083 const grpc_auth_context *ctx);
84
Alexander Polcynd809a152017-05-03 14:49:41 -070085/** Returns 1 if the peer is authenticated, 0 otherwise. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +010086GRPCAPI int grpc_auth_context_peer_is_authenticated(
Craig Tillerd6546c92016-01-29 07:59:35 -080087 const grpc_auth_context *ctx);
Julien Boeufea44bba2015-11-18 15:56:01 -080088
Alexander Polcynd809a152017-05-03 14:49:41 -070089/** Gets the auth context from the call. Caller needs to call
Julien Boeufea44bba2015-11-18 15:56:01 -080090 grpc_auth_context_release on the returned context. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +010091GRPCAPI grpc_auth_context *grpc_call_auth_context(grpc_call *call);
Julien Boeufea44bba2015-11-18 15:56:01 -080092
Alexander Polcynd809a152017-05-03 14:49:41 -070093/** Releases the auth context returned from grpc_call_auth_context. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +010094GRPCAPI void grpc_auth_context_release(grpc_auth_context *context);
Julien Boeufea44bba2015-11-18 15:56:01 -080095
Alexander Polcynd809a152017-05-03 14:49:41 -070096/** --
Julien Boeufea44bba2015-11-18 15:56:01 -080097 The following auth context methods should only be called by a server metadata
98 processor to set properties extracted from auth metadata.
99 -- */
100
Alexander Polcynd809a152017-05-03 14:49:41 -0700101/** Add a property. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100102GRPCAPI void grpc_auth_context_add_property(grpc_auth_context *ctx,
103 const char *name, const char *value,
104 size_t value_length);
Julien Boeufea44bba2015-11-18 15:56:01 -0800105
Alexander Polcynd809a152017-05-03 14:49:41 -0700106/** Add a C string property. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100107GRPCAPI void grpc_auth_context_add_cstring_property(grpc_auth_context *ctx,
108 const char *name,
109 const char *value);
Julien Boeufea44bba2015-11-18 15:56:01 -0800110
Alexander Polcynd809a152017-05-03 14:49:41 -0700111/** Sets the property name. Returns 1 if successful or 0 in case of failure
Julien Boeufea44bba2015-11-18 15:56:01 -0800112 (which means that no property with this name exists). */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100113GRPCAPI int grpc_auth_context_set_peer_identity_property_name(
Craig Tillerd6546c92016-01-29 07:59:35 -0800114 grpc_auth_context *ctx, const char *name);
Julien Boeufea44bba2015-11-18 15:56:01 -0800115
Alexander Polcynd809a152017-05-03 14:49:41 -0700116/** --- grpc_channel_credentials object. ---
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800117
Julien Boeufacd835f2015-10-09 15:20:57 -0700118 A channel credentials object represents a way to authenticate a client on a
119 channel. */
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800120
Julien Boeufacd835f2015-10-09 15:20:57 -0700121typedef struct grpc_channel_credentials grpc_channel_credentials;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800122
Alexander Polcynd809a152017-05-03 14:49:41 -0700123/** Releases a channel credentials object.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800124 The creator of the credentials object is responsible for its release. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100125GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials *creds);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800126
Alexander Polcynd809a152017-05-03 14:49:41 -0700127/** Creates default credentials to connect to a google gRPC service.
Julien Boeufc66f2a82015-02-23 13:00:36 -0800128 WARNING: Do NOT use this credentials to connect to a non-google service as
129 this could result in an oauth2 token leak. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100130GRPCAPI grpc_channel_credentials *grpc_google_default_credentials_create(void);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800131
Alexander Polcynd809a152017-05-03 14:49:41 -0700132/** Callback for getting the SSL roots override from the application.
Julien Boeufaaebf7a2016-01-28 17:04:42 -0800133 In case of success, *pem_roots_certs must be set to a NULL terminated string
134 containing the list of PEM encoded root certificates. The ownership is passed
135 to the core and freed (laster by the core) with gpr_free.
136 If this function fails and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is
137 set to a valid path, it will override the roots specified this func */
138typedef grpc_ssl_roots_override_result (*grpc_ssl_roots_override_callback)(
139 char **pem_root_certs);
140
Alexander Polcynd809a152017-05-03 14:49:41 -0700141/** Setup a callback to override the default TLS/SSL roots.
Julien Boeuf373debd2016-01-27 15:41:12 -0800142 This function is not thread-safe and must be called at initialization time
143 before any ssl credentials are created to have the desired side effect.
Julien Boeufaaebf7a2016-01-28 17:04:42 -0800144 If GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is set to a valid path, the
145 callback will not be called. */
Nicolas "Pixel" Noble63976602016-02-17 23:43:55 +0100146GRPCAPI void grpc_set_ssl_roots_override_callback(
147 grpc_ssl_roots_override_callback cb);
Julien Boeuf373debd2016-01-27 15:41:12 -0800148
Alexander Polcynd809a152017-05-03 14:49:41 -0700149/** Object that holds a private key / certificate chain pair in PEM format. */
Julien Boeuf8fbcc432015-01-15 16:44:13 -0800150typedef struct {
Alexander Polcynd809a152017-05-03 14:49:41 -0700151 /** private_key is the NULL-terminated string containing the PEM encoding of
Julien Boeuf8fbcc432015-01-15 16:44:13 -0800152 the client's private key. */
153 const char *private_key;
154
Alexander Polcynd809a152017-05-03 14:49:41 -0700155 /** cert_chain is the NULL-terminated string containing the PEM encoding of
Julien Boeuf68ad53e2015-01-20 22:37:03 -0800156 the client's certificate chain. */
Julien Boeuf8fbcc432015-01-15 16:44:13 -0800157 const char *cert_chain;
158} grpc_ssl_pem_key_cert_pair;
159
Alexander Polcynd809a152017-05-03 14:49:41 -0700160/** Creates an SSL credentials object.
Julien Boeufb71ef652017-04-12 21:44:49 -0700161 - pem_root_certs is the NULL-terminated string containing the PEM encoding
Julien Boeuf3e001792015-02-20 15:02:36 -0800162 of the server root certificates. If this parameter is NULL, the
163 implementation will first try to dereference the file pointed by the
164 GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable, and if that fails,
Julien Boeufa50da472016-01-27 16:23:41 -0800165 try to get the roots set by grpc_override_ssl_default_roots. Eventually,
166 if all these fail, it will try to get the roots from a well-known place on
167 disk (in the grpc install directory).
Julien Boeuf8fbcc432015-01-15 16:44:13 -0800168 - pem_key_cert_pair is a pointer on the object containing client's private
169 key and certificate chain. This parameter can be NULL if the client does
Julien Boeuf5029b302015-07-21 23:02:16 -0700170 not have such a key/cert pair. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100171GRPCAPI grpc_channel_credentials *grpc_ssl_credentials_create(
Julien Boeuf8b78c282015-08-14 13:39:19 -0700172 const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pair,
173 void *reserved);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800174
Alexander Polcynd809a152017-05-03 14:49:41 -0700175/** --- grpc_call_credentials object.
Julien Boeufacd835f2015-10-09 15:20:57 -0700176
177 A call credentials object represents a way to authenticate on a particular
178 call. These credentials can be composed with a channel credentials object
179 so that they are sent with every call on this channel. */
180
181typedef struct grpc_call_credentials grpc_call_credentials;
182
Alexander Polcynd809a152017-05-03 14:49:41 -0700183/** Releases a call credentials object.
Julien Boeuf441176d2015-10-09 21:14:07 -0700184 The creator of the credentials object is responsible for its release. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100185GRPCAPI void grpc_call_credentials_release(grpc_call_credentials *creds);
Julien Boeuf441176d2015-10-09 21:14:07 -0700186
Alexander Polcynd809a152017-05-03 14:49:41 -0700187/** Creates a composite channel credentials object. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100188GRPCAPI grpc_channel_credentials *grpc_composite_channel_credentials_create(
Julien Boeufacd835f2015-10-09 15:20:57 -0700189 grpc_channel_credentials *channel_creds, grpc_call_credentials *call_creds,
190 void *reserved);
191
Alexander Polcynd809a152017-05-03 14:49:41 -0700192/** Creates a composite call credentials object. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100193GRPCAPI grpc_call_credentials *grpc_composite_call_credentials_create(
Julien Boeufacd835f2015-10-09 15:20:57 -0700194 grpc_call_credentials *creds1, grpc_call_credentials *creds2,
195 void *reserved);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800196
Alexander Polcynd809a152017-05-03 14:49:41 -0700197/** Creates a compute engine credentials object for connecting to Google.
Julien Boeufc66f2a82015-02-23 13:00:36 -0800198 WARNING: Do NOT use this credentials to connect to a non-google service as
199 this could result in an oauth2 token leak. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100200GRPCAPI grpc_call_credentials *grpc_google_compute_engine_credentials_create(
Julien Boeufacd835f2015-10-09 15:20:57 -0700201 void *reserved);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800202
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100203GRPCAPI gpr_timespec grpc_max_auth_token_lifetime();
jboeufbefd2652014-12-12 15:39:47 -0800204
Alexander Polcynd809a152017-05-03 14:49:41 -0700205/** Creates a JWT credentials object. May return NULL if the input is invalid.
Julien Boeuff47a5cb2015-02-18 12:24:08 -0800206 - json_key is the JSON key string containing the client's private key.
207 - token_lifetime is the lifetime of each Json Web Token (JWT) created with
208 this credentials. It should not exceed grpc_max_auth_token_lifetime or
209 will be cropped to this value. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100210GRPCAPI grpc_call_credentials *
Craig Tillerd6546c92016-01-29 07:59:35 -0800211grpc_service_account_jwt_access_credentials_create(const char *json_key,
212 gpr_timespec token_lifetime,
213 void *reserved);
Julien Boeuff47a5cb2015-02-18 12:24:08 -0800214
Alexander Polcynd809a152017-05-03 14:49:41 -0700215/** Creates an Oauth2 Refresh Token credentials object for connecting to Google.
Julien Boeuf510a9202015-08-25 21:51:07 -0700216 May return NULL if the input is invalid.
Julien Boeuf9835cf02015-03-09 16:56:44 -0700217 WARNING: Do NOT use this credentials to connect to a non-google service as
218 this could result in an oauth2 token leak.
219 - json_refresh_token is the JSON string containing the refresh token itself
220 along with a client_id and client_secret. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100221GRPCAPI grpc_call_credentials *grpc_google_refresh_token_credentials_create(
Julien Boeuf8b78c282015-08-14 13:39:19 -0700222 const char *json_refresh_token, void *reserved);
Julien Boeuf9835cf02015-03-09 16:56:44 -0700223
Alexander Polcynd809a152017-05-03 14:49:41 -0700224/** Creates an Oauth2 Access Token credentials with an access token that was
Julien Boeuf2805be12015-07-01 02:47:18 -0700225 aquired by an out of band mechanism. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100226GRPCAPI grpc_call_credentials *grpc_access_token_credentials_create(
Julien Boeufacd835f2015-10-09 15:20:57 -0700227 const char *access_token, void *reserved);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800228
Alexander Polcynd809a152017-05-03 14:49:41 -0700229/** Creates an IAM credentials object for connecting to Google. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100230GRPCAPI grpc_call_credentials *grpc_google_iam_credentials_create(
Julien Boeuf510a9202015-08-25 21:51:07 -0700231 const char *authorization_token, const char *authority_selector,
232 void *reserved);
nnoble0c475f02014-12-05 15:37:39 -0800233
Alexander Polcynd809a152017-05-03 14:49:41 -0700234/** Callback function to be called by the metadata credentials plugin
Julien Boeuf97f80fa2015-09-15 16:17:31 -0700235 implementation when the metadata is ready.
236 - user_data is the opaque pointer that was passed in the get_metadata method
237 of the grpc_metadata_credentials_plugin (see below).
238 - creds_md is an array of credentials metadata produced by the plugin. It
239 may be set to NULL in case of an error.
240 - num_creds_md is the number of items in the creds_md array.
241 - status must be GRPC_STATUS_OK in case of success or another specific error
242 code otherwise.
243 - error_details contains details about the error if any. In case of success
244 it should be NULL and will be otherwise ignored. */
Julien Boeuf8b5bb272015-08-31 13:25:21 -0700245typedef void (*grpc_credentials_plugin_metadata_cb)(
246 void *user_data, const grpc_metadata *creds_md, size_t num_creds_md,
247 grpc_status_code status, const char *error_details);
248
Alexander Polcynd809a152017-05-03 14:49:41 -0700249/** Context that can be used by metadata credentials plugin in order to create
Julien Boeufea44bba2015-11-18 15:56:01 -0800250 auth related metadata. */
251typedef struct {
Alexander Polcynd809a152017-05-03 14:49:41 -0700252 /** The fully qualifed service url. */
Julien Boeufea44bba2015-11-18 15:56:01 -0800253 const char *service_url;
254
Alexander Polcynd809a152017-05-03 14:49:41 -0700255 /** The method name of the RPC being called (not fully qualified).
Julien Boeufeb029c92015-11-25 13:47:56 -0800256 The fully qualified method name can be built from the service_url:
257 full_qualified_method_name = ctx->service_url + '/' + ctx->method_name. */
Julien Boeufea44bba2015-11-18 15:56:01 -0800258 const char *method_name;
259
Alexander Polcynd809a152017-05-03 14:49:41 -0700260 /** The auth_context of the channel which gives the server's identity. */
Julien Boeufea44bba2015-11-18 15:56:01 -0800261 const grpc_auth_context *channel_auth_context;
262
Alexander Polcynd809a152017-05-03 14:49:41 -0700263 /** Reserved for future use. */
Julien Boeufea44bba2015-11-18 15:56:01 -0800264 void *reserved;
265} grpc_auth_metadata_context;
266
Alexander Polcynd809a152017-05-03 14:49:41 -0700267/** grpc_metadata_credentials plugin is an API user provided structure used to
Julien Boeuf97f80fa2015-09-15 16:17:31 -0700268 create grpc_credentials objects that can be set on a channel (composed) or
269 a call. See grpc_credentials_metadata_create_from_plugin below.
270 The grpc client stack will call the get_metadata method of the plugin for
271 every call in scope for the credentials created from it. */
Julien Boeuf8b5bb272015-08-31 13:25:21 -0700272typedef struct {
Alexander Polcynd809a152017-05-03 14:49:41 -0700273 /** The implementation of this method has to be non-blocking.
Julien Boeufea44bba2015-11-18 15:56:01 -0800274 - context is the information that can be used by the plugin to create auth
275 metadata.
Julien Boeuf8b5bb272015-08-31 13:25:21 -0700276 - cb is the callback that needs to be called when the metadata is ready.
277 - user_data needs to be passed as the first parameter of the callback. */
Julien Boeufea44bba2015-11-18 15:56:01 -0800278 void (*get_metadata)(void *state, grpc_auth_metadata_context context,
Julien Boeuf8b5bb272015-08-31 13:25:21 -0700279 grpc_credentials_plugin_metadata_cb cb, void *user_data);
280
Alexander Polcynd809a152017-05-03 14:49:41 -0700281 /** Destroys the plugin state. */
Julien Boeuf8b5bb272015-08-31 13:25:21 -0700282 void (*destroy)(void *state);
283
Alexander Polcynd809a152017-05-03 14:49:41 -0700284 /** State that will be set as the first parameter of the methods above. */
Julien Boeuf8b5bb272015-08-31 13:25:21 -0700285 void *state;
Julien Boeufcaf99352015-11-19 22:00:30 -0800286
Alexander Polcynd809a152017-05-03 14:49:41 -0700287 /** Type of credentials that this plugin is implementing. */
Julien Boeufcaf99352015-11-19 22:00:30 -0800288 const char *type;
Julien Boeuf8b5bb272015-08-31 13:25:21 -0700289} grpc_metadata_credentials_plugin;
290
Alexander Polcynd809a152017-05-03 14:49:41 -0700291/** Creates a credentials object from a plugin. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100292GRPCAPI grpc_call_credentials *grpc_metadata_credentials_create_from_plugin(
Julien Boeuf8b5bb272015-08-31 13:25:21 -0700293 grpc_metadata_credentials_plugin plugin, void *reserved);
294
Alexander Polcynd809a152017-05-03 14:49:41 -0700295/** --- Secure channel creation. --- */
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800296
Alexander Polcynd809a152017-05-03 14:49:41 -0700297/** Creates a secure channel using the passed-in credentials. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100298GRPCAPI grpc_channel *grpc_secure_channel_create(
Craig Tillerd6546c92016-01-29 07:59:35 -0800299 grpc_channel_credentials *creds, const char *target,
300 const grpc_channel_args *args, void *reserved);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800301
Alexander Polcynd809a152017-05-03 14:49:41 -0700302/** --- grpc_server_credentials object. ---
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800303
304 A server credentials object represents a way to authenticate a server. */
305
306typedef struct grpc_server_credentials grpc_server_credentials;
307
Alexander Polcynd809a152017-05-03 14:49:41 -0700308/** Releases a server_credentials object.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800309 The creator of the server_credentials object is responsible for its release.
310 */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100311GRPCAPI void grpc_server_credentials_release(grpc_server_credentials *creds);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800312
Alexander Polcynd809a152017-05-03 14:49:41 -0700313/** Deprecated in favor of grpc_ssl_server_credentials_create_ex.
Deepak Lukosedba4c5f2016-03-25 12:54:25 -0700314 Creates an SSL server_credentials object.
Julien Boeuf8fbcc432015-01-15 16:44:13 -0800315 - pem_roots_cert is the NULL-terminated string containing the PEM encoding of
316 the client root certificates. This parameter may be NULL if the server does
317 not want the client to be authenticated with SSL.
318 - pem_key_cert_pairs is an array private key / certificate chains of the
319 server. This parameter cannot be NULL.
320 - num_key_cert_pairs indicates the number of items in the private_key_files
Julien Boeuf5029b302015-07-21 23:02:16 -0700321 and cert_chain_files parameters. It should be at least 1.
322 - force_client_auth, if set to non-zero will force the client to authenticate
323 with an SSL cert. Note that this option is ignored if pem_root_certs is
324 NULL. */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100325GRPCAPI grpc_server_credentials *grpc_ssl_server_credentials_create(
Julien Boeuf8fbcc432015-01-15 16:44:13 -0800326 const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs,
Julien Boeuf8b78c282015-08-14 13:39:19 -0700327 size_t num_key_cert_pairs, int force_client_auth, void *reserved);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800328
Alexander Polcynd809a152017-05-03 14:49:41 -0700329/** Same as grpc_ssl_server_credentials_create method except uses
Deepak Lukosedba4c5f2016-03-25 12:54:25 -0700330 grpc_ssl_client_certificate_request_type enum to support more ways to
331 authenticate client cerificates.*/
332GRPCAPI grpc_server_credentials *grpc_ssl_server_credentials_create_ex(
333 const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs,
334 size_t num_key_cert_pairs,
335 grpc_ssl_client_certificate_request_type client_certificate_request,
336 void *reserved);
337
Alexander Polcynd809a152017-05-03 14:49:41 -0700338/** --- Server-side secure ports. --- */
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800339
Alexander Polcynd809a152017-05-03 14:49:41 -0700340/** Add a HTTP2 over an encrypted link over tcp listener.
Craig Tillerd251ab92015-02-17 17:22:14 -0800341 Returns bound port number on success, 0 on failure.
342 REQUIRES: server not started */
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100343GRPCAPI int grpc_server_add_secure_http2_port(grpc_server *server,
344 const char *addr,
345 grpc_server_credentials *creds);
Craig Tillerd251ab92015-02-17 17:22:14 -0800346
Alexander Polcynd809a152017-05-03 14:49:41 -0700347/** --- Call specific credentials. --- */
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700348
Alexander Polcynd809a152017-05-03 14:49:41 -0700349/** Sets a credentials to a call. Can only be called on the client side before
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700350 grpc_call_start_batch. */
Craig Tillerf40df232016-03-25 13:38:14 -0700351GRPCAPI grpc_call_error grpc_call_set_credentials(grpc_call *call,
352 grpc_call_credentials *creds);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700353
Alexander Polcynd809a152017-05-03 14:49:41 -0700354/** --- Auth Metadata Processing --- */
Julien Boeufea456fc2015-07-07 15:23:30 -0700355
Alexander Polcynd809a152017-05-03 14:49:41 -0700356/** Callback function that is called when the metadata processing is done.
Julien Boeufee3dbb02015-08-19 22:17:03 -0700357 - Consumed metadata will be removed from the set of metadata available on the
358 call. consumed_md may be NULL if no metadata has been consumed.
359 - Response metadata will be set on the response. response_md may be NULL.
360 - status is GRPC_STATUS_OK for success or a specific status for an error.
361 Common error status for auth metadata processing is either
362 GRPC_STATUS_UNAUTHENTICATED in case of an authentication failure or
363 GRPC_STATUS PERMISSION_DENIED in case of an authorization failure.
364 - error_details gives details about the error. May be NULL. */
Julien Boeufea456fc2015-07-07 15:23:30 -0700365typedef void (*grpc_process_auth_metadata_done_cb)(
366 void *user_data, const grpc_metadata *consumed_md, size_t num_consumed_md,
Julien Boeufee3dbb02015-08-19 22:17:03 -0700367 const grpc_metadata *response_md, size_t num_response_md,
368 grpc_status_code status, const char *error_details);
Julien Boeufea456fc2015-07-07 15:23:30 -0700369
Alexander Polcynd809a152017-05-03 14:49:41 -0700370/** Pluggable server-side metadata processor object. */
Julien Boeufa87d6c22015-07-17 15:51:46 -0700371typedef struct {
Alexander Polcynd809a152017-05-03 14:49:41 -0700372 /** The context object is read/write: it contains the properties of the
Julien Boeuf77a7b872015-08-05 20:11:02 -0700373 channel peer and it is the job of the process function to augment it with
Julien Boeufbf25bb02015-08-14 12:36:11 -0700374 properties derived from the passed-in metadata.
375 The lifetime of these objects is guaranteed until cb is invoked. */
Julien Boeuf77a7b872015-08-05 20:11:02 -0700376 void (*process)(void *state, grpc_auth_context *context,
Julien Boeufbf25bb02015-08-14 12:36:11 -0700377 const grpc_metadata *md, size_t num_md,
Julien Boeuf77a7b872015-08-05 20:11:02 -0700378 grpc_process_auth_metadata_done_cb cb, void *user_data);
Julien Boeuf0c711ad2015-08-28 14:10:58 -0700379 void (*destroy)(void *state);
Julien Boeufa87d6c22015-07-17 15:51:46 -0700380 void *state;
381} grpc_auth_metadata_processor;
Julien Boeufea456fc2015-07-07 15:23:30 -0700382
Nicolas "Pixel" Noblecd41a0b2016-02-08 22:53:14 +0100383GRPCAPI void grpc_server_credentials_set_auth_metadata_processor(
Julien Boeuf6bdc9b42015-07-19 21:56:02 -0700384 grpc_server_credentials *creds, grpc_auth_metadata_processor processor);
Julien Boeufea456fc2015-07-07 15:23:30 -0700385
nnoble0c475f02014-12-05 15:37:39 -0800386#ifdef __cplusplus
387}
388#endif
389
Craig Tiller9a576332015-06-17 10:21:49 -0700390#endif /* GRPC_GRPC_SECURITY_H */