grpc 0.14.1 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (277) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1398 -817
  3. data/include/grpc/compression.h +2 -1
  4. data/include/grpc/grpc.h +10 -1
  5. data/include/grpc/grpc_cronet.h +51 -0
  6. data/include/grpc/grpc_posix.h +70 -0
  7. data/include/grpc/impl/codegen/atm.h +2 -2
  8. data/include/grpc/impl/codegen/{atm_win32.h → atm_windows.h} +3 -3
  9. data/include/grpc/impl/codegen/compression_types.h +39 -5
  10. data/include/grpc/impl/codegen/connectivity_state.h +1 -1
  11. data/include/grpc/impl/codegen/grpc_types.h +10 -0
  12. data/include/grpc/impl/codegen/log.h +2 -1
  13. data/include/grpc/impl/codegen/port_platform.h +30 -12
  14. data/include/grpc/impl/codegen/slice_buffer.h +2 -3
  15. data/include/grpc/impl/codegen/sync.h +2 -2
  16. data/include/grpc/impl/codegen/{sync_win32.h → sync_windows.h} +3 -3
  17. data/include/grpc/support/{sync_win32.h → atm_windows.h} +4 -4
  18. data/include/grpc/support/avl.h +5 -0
  19. data/include/grpc/support/{log_win32.h → log_windows.h} +3 -3
  20. data/include/grpc/support/string_util.h +2 -1
  21. data/include/grpc/support/{atm_win32.h → sync_windows.h} +4 -4
  22. data/src/core/ext/census/gen/census.pb.c +179 -0
  23. data/src/core/ext/census/gen/census.pb.h +294 -0
  24. data/src/core/ext/census/grpc_filter.c +11 -7
  25. data/src/core/ext/client_config/channel_connectivity.c +28 -14
  26. data/src/core/ext/client_config/client_channel.c +77 -53
  27. data/src/core/ext/client_config/connector.h +1 -1
  28. data/src/core/ext/client_config/lb_policy.c +9 -6
  29. data/src/core/ext/client_config/lb_policy.h +9 -5
  30. data/src/core/ext/client_config/subchannel.c +58 -39
  31. data/src/core/ext/client_config/subchannel.h +3 -2
  32. data/src/core/ext/client_config/subchannel_call_holder.c +34 -19
  33. data/src/core/ext/client_config/subchannel_call_holder.h +2 -1
  34. data/src/core/ext/client_config/subchannel_index.c +20 -9
  35. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +7 -7
  36. data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +5 -5
  37. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/{v0 → v1}/load_balancer.pb.c +29 -30
  38. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +178 -0
  39. data/src/core/ext/lb_policy/pick_first/pick_first.c +65 -45
  40. data/src/core/ext/lb_policy/round_robin/round_robin.c +84 -43
  41. data/src/core/ext/load_reporting/load_reporting.c +133 -0
  42. data/src/core/ext/load_reporting/load_reporting.h +75 -0
  43. data/src/core/ext/load_reporting/load_reporting_filter.c +151 -0
  44. data/src/core/ext/load_reporting/load_reporting_filter.h +41 -0
  45. data/src/core/ext/resolver/dns/native/dns_resolver.c +22 -8
  46. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +2 -2
  47. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +4 -4
  48. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +95 -0
  49. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +14 -18
  50. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +49 -24
  51. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +82 -0
  52. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +104 -60
  53. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +232 -0
  54. data/src/{ruby/ext/grpc/rb_signal.c → core/ext/transport/chttp2/transport/bin_decoder.h} +27 -31
  55. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +481 -260
  56. data/src/core/ext/transport/chttp2/transport/frame.h +1 -7
  57. data/src/core/ext/transport/chttp2/transport/frame_data.c +44 -27
  58. data/src/core/ext/transport/chttp2/transport/frame_data.h +6 -5
  59. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +23 -17
  60. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -2
  61. data/src/core/ext/transport/chttp2/transport/frame_ping.c +12 -7
  62. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -3
  63. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +25 -12
  64. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -2
  65. data/src/core/ext/transport/chttp2/transport/frame_settings.c +23 -21
  66. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -2
  67. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +17 -9
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -2
  69. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +365 -287
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -6
  71. data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -20
  72. data/src/core/ext/transport/chttp2/transport/hpack_table.h +5 -4
  73. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +1 -0
  74. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -0
  75. data/src/core/ext/transport/chttp2/transport/internal.h +34 -32
  76. data/src/core/ext/transport/chttp2/transport/parsing.c +296 -212
  77. data/src/core/ext/transport/chttp2/transport/writing.c +12 -9
  78. data/src/core/lib/channel/channel_args.c +26 -12
  79. data/src/core/lib/channel/channel_args.h +1 -1
  80. data/src/core/lib/channel/channel_stack.c +12 -8
  81. data/src/core/lib/channel/channel_stack.h +27 -11
  82. data/src/core/lib/channel/channel_stack_builder.c +2 -2
  83. data/src/core/lib/channel/compress_filter.c +26 -31
  84. data/src/core/lib/channel/compress_filter.h +4 -4
  85. data/src/core/lib/channel/connected_channel.c +7 -5
  86. data/src/core/lib/channel/http_client_filter.c +34 -8
  87. data/src/core/lib/channel/http_client_filter.h +1 -1
  88. data/src/core/lib/channel/http_server_filter.c +21 -12
  89. data/src/core/lib/compression/{compression_algorithm.c → compression.c} +22 -21
  90. data/src/core/lib/http/httpcli.c +81 -59
  91. data/src/core/lib/http/httpcli.h +11 -15
  92. data/src/core/lib/http/httpcli_security_connector.c +5 -3
  93. data/src/core/lib/http/parser.c +127 -118
  94. data/src/core/lib/http/parser.h +11 -6
  95. data/src/core/lib/iomgr/closure.c +20 -16
  96. data/src/core/lib/iomgr/closure.h +19 -15
  97. data/src/core/lib/iomgr/endpoint.h +1 -1
  98. data/src/core/lib/iomgr/endpoint_pair_posix.c +2 -2
  99. data/src/core/lib/iomgr/error.c +535 -0
  100. data/src/core/lib/iomgr/error.h +192 -0
  101. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +190 -83
  102. data/src/core/lib/iomgr/ev_poll_posix.c +1267 -0
  103. data/src/{ruby/ext/grpc/rb_signal.h → core/lib/iomgr/ev_poll_posix.h} +7 -5
  104. data/src/core/lib/iomgr/ev_posix.c +104 -14
  105. data/src/core/lib/iomgr/ev_posix.h +17 -7
  106. data/src/core/lib/iomgr/exec_ctx.c +25 -7
  107. data/src/core/lib/iomgr/exec_ctx.h +27 -8
  108. data/src/core/lib/iomgr/executor.c +2 -2
  109. data/src/core/lib/iomgr/executor.h +1 -1
  110. data/src/core/lib/iomgr/iocp_windows.c +2 -41
  111. data/src/core/lib/iomgr/iocp_windows.h +0 -8
  112. data/src/core/lib/iomgr/iomgr.c +5 -4
  113. data/src/core/lib/iomgr/iomgr_posix.c +5 -1
  114. data/src/core/lib/iomgr/iomgr_windows.c +1 -1
  115. data/src/core/lib/{support → iomgr}/load_file.c +15 -17
  116. data/src/core/lib/{support → iomgr}/load_file.h +8 -7
  117. data/src/core/lib/iomgr/polling_entity.c +104 -0
  118. data/src/core/lib/iomgr/polling_entity.h +81 -0
  119. data/src/core/lib/iomgr/pollset.h +6 -5
  120. data/src/core/lib/iomgr/pollset_set_windows.c +4 -1
  121. data/src/core/lib/iomgr/pollset_windows.c +10 -6
  122. data/src/core/lib/iomgr/resolve_address.h +5 -9
  123. data/src/core/lib/iomgr/resolve_address_posix.c +55 -38
  124. data/src/core/lib/iomgr/resolve_address_windows.c +51 -37
  125. data/src/core/lib/iomgr/sockaddr.h +2 -2
  126. data/src/core/lib/iomgr/{sockaddr_win32.h → sockaddr_windows.h} +3 -3
  127. data/src/core/lib/iomgr/socket_utils_common_posix.c +92 -45
  128. data/src/core/lib/iomgr/socket_utils_posix.h +19 -12
  129. data/src/core/lib/iomgr/socket_windows.c +61 -2
  130. data/src/core/lib/iomgr/socket_windows.h +13 -0
  131. data/src/core/lib/iomgr/tcp_client_posix.c +54 -39
  132. data/src/core/lib/iomgr/tcp_client_windows.c +34 -34
  133. data/src/core/lib/iomgr/tcp_posix.c +43 -39
  134. data/src/core/lib/iomgr/tcp_server.h +5 -3
  135. data/src/core/lib/iomgr/tcp_server_posix.c +103 -64
  136. data/src/core/lib/iomgr/tcp_server_windows.c +114 -101
  137. data/src/core/lib/iomgr/tcp_windows.c +45 -50
  138. data/src/core/lib/iomgr/tcp_windows.h +1 -1
  139. data/src/core/lib/iomgr/timer.c +26 -13
  140. data/src/core/lib/iomgr/udp_server.c +28 -4
  141. data/src/core/lib/iomgr/udp_server.h +5 -1
  142. data/src/core/lib/iomgr/unix_sockets_posix.c +8 -7
  143. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -1
  144. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -2
  145. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +15 -5
  146. data/src/core/lib/iomgr/wakeup_fd_pipe.c +13 -9
  147. data/src/core/lib/iomgr/wakeup_fd_posix.c +6 -6
  148. data/src/core/lib/iomgr/wakeup_fd_posix.h +9 -6
  149. data/src/core/lib/iomgr/workqueue.h +5 -4
  150. data/src/core/lib/iomgr/workqueue_posix.c +40 -26
  151. data/src/core/lib/iomgr/workqueue_windows.c +2 -2
  152. data/src/core/lib/profiling/basic_timers.c +2 -2
  153. data/src/core/lib/security/{security_context.c → context/security_context.c} +1 -1
  154. data/src/core/lib/security/{security_context.h → context/security_context.h} +4 -4
  155. data/src/core/lib/security/credentials/composite/composite_credentials.c +263 -0
  156. data/src/core/lib/security/credentials/composite/composite_credentials.h +72 -0
  157. data/src/core/lib/security/credentials/credentials.c +233 -0
  158. data/src/core/lib/security/{credentials.h → credentials/credentials.h} +19 -157
  159. data/src/core/lib/security/{credentials_metadata.c → credentials/credentials_metadata.c} +1 -1
  160. data/src/core/lib/security/credentials/fake/fake_credentials.c +139 -0
  161. data/src/core/lib/security/credentials/fake/fake_credentials.h +56 -0
  162. data/src/core/lib/security/{credentials_posix.c → credentials/google_default/credentials_posix.c} +1 -1
  163. data/src/core/lib/security/{credentials_win32.c → credentials/google_default/credentials_windows.c} +3 -3
  164. data/src/core/lib/security/{google_default_credentials.c → credentials/google_default/google_default_credentials.c} +93 -35
  165. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +46 -0
  166. data/src/core/lib/security/credentials/iam/iam_credentials.c +85 -0
  167. data/src/core/lib/security/credentials/iam/iam_credentials.h +44 -0
  168. data/src/core/lib/security/{json_token.c → credentials/jwt/json_token.c} +10 -101
  169. data/src/core/lib/security/{json_token.h → credentials/jwt/json_token.h} +3 -33
  170. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +160 -0
  171. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +62 -0
  172. data/src/core/lib/security/{jwt_verifier.c → credentials/jwt/jwt_verifier.c} +35 -15
  173. data/src/core/lib/security/{jwt_verifier.h → credentials/jwt/jwt_verifier.h} +3 -3
  174. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +433 -0
  175. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +109 -0
  176. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +129 -0
  177. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +45 -0
  178. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +240 -0
  179. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +48 -0
  180. data/src/core/lib/security/{auth_filters.h → transport/auth_filters.h} +3 -3
  181. data/src/core/lib/security/{client_auth_filter.c → transport/client_auth_filter.c} +27 -20
  182. data/src/core/lib/security/{handshake.c → transport/handshake.c} +77 -45
  183. data/src/core/lib/security/{handshake.h → transport/handshake.h} +9 -11
  184. data/src/core/lib/security/{secure_endpoint.c → transport/secure_endpoint.c} +19 -12
  185. data/src/core/lib/security/{secure_endpoint.h → transport/secure_endpoint.h} +3 -3
  186. data/src/core/lib/security/{security_connector.c → transport/security_connector.c} +26 -17
  187. data/src/core/lib/security/{security_connector.h → transport/security_connector.h} +8 -8
  188. data/src/core/lib/security/{server_auth_filter.c → transport/server_auth_filter.c} +24 -16
  189. data/src/core/lib/security/transport/tsi_error.c +40 -0
  190. data/src/core/lib/security/transport/tsi_error.h +42 -0
  191. data/src/core/lib/security/{b64.c → util/b64.c} +1 -1
  192. data/src/core/lib/security/{b64.h → util/b64.h} +3 -3
  193. data/src/core/lib/security/util/json_util.c +61 -0
  194. data/src/core/lib/security/util/json_util.h +55 -0
  195. data/src/core/lib/support/avl.c +11 -0
  196. data/src/core/lib/support/cpu_windows.c +2 -2
  197. data/src/core/lib/support/{env_win32.c → env_windows.c} +3 -3
  198. data/src/core/lib/support/log.c +3 -1
  199. data/src/core/lib/support/log_linux.c +2 -2
  200. data/src/core/lib/support/{log_win32.c → log_windows.c} +4 -4
  201. data/src/core/lib/support/murmur_hash.c +3 -5
  202. data/src/core/lib/support/string.c +10 -0
  203. data/src/core/lib/support/string.h +4 -0
  204. data/src/core/lib/support/{string_util_win32.c → string_util_windows.c} +3 -3
  205. data/src/core/lib/support/{string_win32.c → string_windows.c} +2 -2
  206. data/src/core/lib/support/{string_win32.h → string_windows.h} +5 -5
  207. data/src/core/lib/support/subprocess_windows.c +1 -1
  208. data/src/core/lib/support/{sync_win32.c → sync_windows.c} +2 -2
  209. data/src/core/lib/support/{thd_win32.c → thd_windows.c} +2 -2
  210. data/src/core/lib/support/{time_win32.c → time_windows.c} +2 -2
  211. data/src/core/lib/support/tmpfile_msys.c +1 -1
  212. data/src/core/lib/support/{tmpfile_win32.c → tmpfile_windows.c} +3 -3
  213. data/src/core/lib/surface/alarm.c +2 -2
  214. data/src/core/lib/surface/byte_buffer_reader.c +13 -6
  215. data/src/core/lib/surface/call.c +323 -123
  216. data/src/core/lib/surface/call.h +2 -0
  217. data/src/core/lib/surface/call_log_batch.c +1 -1
  218. data/src/core/lib/surface/channel.c +64 -15
  219. data/src/core/lib/surface/channel.h +9 -0
  220. data/src/core/lib/surface/channel_ping.c +3 -3
  221. data/src/core/lib/surface/completion_queue.c +75 -19
  222. data/src/core/lib/surface/completion_queue.h +7 -2
  223. data/src/core/lib/surface/init.c +2 -1
  224. data/src/core/lib/surface/init_secure.c +4 -4
  225. data/src/core/lib/surface/lame_client.c +12 -8
  226. data/src/core/lib/surface/server.c +213 -120
  227. data/src/core/lib/surface/server.h +1 -0
  228. data/src/core/lib/surface/version.c +1 -1
  229. data/src/core/lib/transport/connectivity_state.c +40 -18
  230. data/src/core/lib/transport/connectivity_state.h +4 -1
  231. data/src/core/lib/transport/metadata.c +23 -23
  232. data/src/core/lib/transport/metadata.h +4 -0
  233. data/src/core/lib/transport/metadata_batch.c +9 -0
  234. data/src/core/lib/transport/metadata_batch.h +3 -0
  235. data/src/core/lib/transport/static_metadata.c +6 -5
  236. data/src/core/lib/transport/static_metadata.h +64 -60
  237. data/src/core/lib/transport/transport.c +24 -12
  238. data/src/core/lib/transport/transport.h +6 -5
  239. data/src/core/lib/transport/transport_impl.h +4 -0
  240. data/src/core/lib/transport/transport_op_string.c +2 -2
  241. data/src/core/plugin_registry/grpc_plugin_registry.c +4 -0
  242. data/src/ruby/bin/math_services.rb +41 -2
  243. data/src/ruby/ext/grpc/rb_call.c +42 -40
  244. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  245. data/src/ruby/ext/grpc/rb_completion_queue.c +59 -6
  246. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -1
  247. data/src/ruby/ext/grpc/rb_grpc.c +1 -3
  248. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -2
  249. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +21 -5
  250. data/src/ruby/ext/grpc/rb_loader.c +1 -1
  251. data/src/ruby/ext/grpc/rb_server.c +5 -3
  252. data/src/ruby/lib/grpc.rb +0 -3
  253. data/src/ruby/lib/grpc/errors.rb +3 -2
  254. data/src/ruby/lib/grpc/generic/active_call.rb +32 -42
  255. data/src/ruby/lib/grpc/generic/bidi_call.rb +20 -0
  256. data/src/ruby/lib/grpc/generic/client_stub.rb +31 -54
  257. data/src/ruby/lib/grpc/generic/rpc_desc.rb +4 -4
  258. data/src/ruby/lib/grpc/generic/rpc_server.rb +12 -23
  259. data/src/ruby/lib/grpc/generic/service.rb +8 -8
  260. data/src/ruby/lib/grpc/version.rb +1 -1
  261. data/src/ruby/pb/grpc/health/v1/health_services.rb +30 -2
  262. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services.rb +34 -4
  263. data/src/ruby/pb/grpc/testing/metrics_services.rb +39 -2
  264. data/src/ruby/pb/src/proto/grpc/testing/empty.rb +15 -0
  265. data/src/ruby/pb/src/proto/grpc/testing/messages.rb +84 -0
  266. data/src/ruby/pb/src/proto/grpc/testing/test.rb +14 -0
  267. data/src/ruby/pb/src/proto/grpc/testing/test_services.rb +110 -0
  268. data/src/ruby/pb/test/client.rb +5 -2
  269. data/src/ruby/spec/generic/active_call_spec.rb +3 -2
  270. data/src/ruby/spec/generic/client_stub_spec.rb +27 -24
  271. data/src/ruby/spec/generic/rpc_desc_spec.rb +11 -11
  272. data/src/ruby/spec/generic/rpc_server_spec.rb +42 -61
  273. data/src/ruby/spec/pb/health/checker_spec.rb +3 -5
  274. metadata +86 -48
  275. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h +0 -182
  276. data/src/core/lib/security/credentials.c +0 -1296
  277. data/src/ruby/lib/grpc/signals.rb +0 -69
@@ -0,0 +1,109 @@
1
+ /*
2
+ *
3
+ * Copyright 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_CORE_LIB_SECURITY_CREDENTIALS_OAUTH2_OAUTH2_CREDENTIALS_H
35
+ #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_OAUTH2_OAUTH2_CREDENTIALS_H
36
+
37
+ #include "src/core/lib/json/json.h"
38
+ #include "src/core/lib/security/credentials/credentials.h"
39
+
40
+ // auth_refresh_token parsing.
41
+ typedef struct {
42
+ const char *type;
43
+ char *client_id;
44
+ char *client_secret;
45
+ char *refresh_token;
46
+ } grpc_auth_refresh_token;
47
+
48
+ /// Returns 1 if the object is valid, 0 otherwise.
49
+ int grpc_auth_refresh_token_is_valid(
50
+ const grpc_auth_refresh_token *refresh_token);
51
+
52
+ /// Creates a refresh token object from string. Returns an invalid object if a
53
+ /// parsing error has been encountered.
54
+ grpc_auth_refresh_token grpc_auth_refresh_token_create_from_string(
55
+ const char *json_string);
56
+
57
+ /// Creates a refresh token object from parsed json. Returns an invalid object
58
+ /// if a parsing error has been encountered.
59
+ grpc_auth_refresh_token grpc_auth_refresh_token_create_from_json(
60
+ const grpc_json *json);
61
+
62
+ /// Destructs the object.
63
+ void grpc_auth_refresh_token_destruct(grpc_auth_refresh_token *refresh_token);
64
+
65
+ // -- Oauth2 Token Fetcher credentials --
66
+ //
67
+ // This object is a base for credentials that need to acquire an oauth2 token
68
+ // from an http service.
69
+
70
+ typedef void (*grpc_fetch_oauth2_func)(grpc_exec_ctx *exec_ctx,
71
+ grpc_credentials_metadata_request *req,
72
+ grpc_httpcli_context *http_context,
73
+ grpc_polling_entity *pollent,
74
+ grpc_iomgr_cb_func cb,
75
+ gpr_timespec deadline);
76
+ typedef struct {
77
+ grpc_call_credentials base;
78
+ gpr_mu mu;
79
+ grpc_credentials_md_store *access_token_md;
80
+ gpr_timespec token_expiration;
81
+ grpc_httpcli_context httpcli_context;
82
+ grpc_fetch_oauth2_func fetch_func;
83
+ } grpc_oauth2_token_fetcher_credentials;
84
+
85
+ // Google refresh token credentials.
86
+ typedef struct {
87
+ grpc_oauth2_token_fetcher_credentials base;
88
+ grpc_auth_refresh_token refresh_token;
89
+ } grpc_google_refresh_token_credentials;
90
+
91
+ // Access token credentials.
92
+ typedef struct {
93
+ grpc_call_credentials base;
94
+ grpc_credentials_md_store *access_token_md;
95
+ } grpc_access_token_credentials;
96
+
97
+ // Private constructor for refresh token credentials from an already parsed
98
+ // refresh token. Takes ownership of the refresh token.
99
+ grpc_call_credentials *
100
+ grpc_refresh_token_credentials_create_from_auth_refresh_token(
101
+ grpc_auth_refresh_token token);
102
+
103
+ // Exposed for testing only.
104
+ grpc_credentials_status
105
+ grpc_oauth2_token_fetcher_credentials_parse_server_response(
106
+ const struct grpc_http_response *response,
107
+ grpc_credentials_md_store **token_md, gpr_timespec *token_lifetime);
108
+
109
+ #endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_OAUTH2_OAUTH2_CREDENTIALS_H */
@@ -0,0 +1,129 @@
1
+ /*
2
+ *
3
+ * Copyright 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
+ #include "src/core/lib/security/credentials/plugin/plugin_credentials.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include "src/core/lib/surface/api_trace.h"
39
+
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+ #include <grpc/support/string_util.h>
43
+ #include <grpc/support/sync.h>
44
+
45
+ typedef struct {
46
+ void *user_data;
47
+ grpc_credentials_metadata_cb cb;
48
+ } grpc_metadata_plugin_request;
49
+
50
+ static void plugin_destruct(grpc_call_credentials *creds) {
51
+ grpc_plugin_credentials *c = (grpc_plugin_credentials *)creds;
52
+ if (c->plugin.state != NULL && c->plugin.destroy != NULL) {
53
+ c->plugin.destroy(c->plugin.state);
54
+ }
55
+ }
56
+
57
+ static void plugin_md_request_metadata_ready(void *request,
58
+ const grpc_metadata *md,
59
+ size_t num_md,
60
+ grpc_status_code status,
61
+ const char *error_details) {
62
+ /* called from application code */
63
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
64
+ grpc_metadata_plugin_request *r = (grpc_metadata_plugin_request *)request;
65
+ if (status != GRPC_STATUS_OK) {
66
+ if (error_details != NULL) {
67
+ gpr_log(GPR_ERROR, "Getting metadata from plugin failed with error: %s",
68
+ error_details);
69
+ }
70
+ r->cb(&exec_ctx, r->user_data, NULL, 0, GRPC_CREDENTIALS_ERROR);
71
+ } else {
72
+ size_t i;
73
+ grpc_credentials_md *md_array = NULL;
74
+ if (num_md > 0) {
75
+ md_array = gpr_malloc(num_md * sizeof(grpc_credentials_md));
76
+ for (i = 0; i < num_md; i++) {
77
+ md_array[i].key = gpr_slice_from_copied_string(md[i].key);
78
+ md_array[i].value =
79
+ gpr_slice_from_copied_buffer(md[i].value, md[i].value_length);
80
+ }
81
+ }
82
+ r->cb(&exec_ctx, r->user_data, md_array, num_md, GRPC_CREDENTIALS_OK);
83
+ if (md_array != NULL) {
84
+ for (i = 0; i < num_md; i++) {
85
+ gpr_slice_unref(md_array[i].key);
86
+ gpr_slice_unref(md_array[i].value);
87
+ }
88
+ gpr_free(md_array);
89
+ }
90
+ }
91
+ gpr_free(r);
92
+ grpc_exec_ctx_finish(&exec_ctx);
93
+ }
94
+
95
+ static void plugin_get_request_metadata(grpc_exec_ctx *exec_ctx,
96
+ grpc_call_credentials *creds,
97
+ grpc_polling_entity *pollent,
98
+ grpc_auth_metadata_context context,
99
+ grpc_credentials_metadata_cb cb,
100
+ void *user_data) {
101
+ grpc_plugin_credentials *c = (grpc_plugin_credentials *)creds;
102
+ if (c->plugin.get_metadata != NULL) {
103
+ grpc_metadata_plugin_request *request = gpr_malloc(sizeof(*request));
104
+ memset(request, 0, sizeof(*request));
105
+ request->user_data = user_data;
106
+ request->cb = cb;
107
+ c->plugin.get_metadata(c->plugin.state, context,
108
+ plugin_md_request_metadata_ready, request);
109
+ } else {
110
+ cb(exec_ctx, user_data, NULL, 0, GRPC_CREDENTIALS_OK);
111
+ }
112
+ }
113
+
114
+ static grpc_call_credentials_vtable plugin_vtable = {
115
+ plugin_destruct, plugin_get_request_metadata};
116
+
117
+ grpc_call_credentials *grpc_metadata_credentials_create_from_plugin(
118
+ grpc_metadata_credentials_plugin plugin, void *reserved) {
119
+ grpc_plugin_credentials *c = gpr_malloc(sizeof(*c));
120
+ GRPC_API_TRACE("grpc_metadata_credentials_create_from_plugin(reserved=%p)", 1,
121
+ (reserved));
122
+ GPR_ASSERT(reserved == NULL);
123
+ memset(c, 0, sizeof(*c));
124
+ c->base.type = plugin.type;
125
+ c->base.vtable = &plugin_vtable;
126
+ gpr_ref_init(&c->base.refcount, 1);
127
+ c->plugin = plugin;
128
+ return &c->base;
129
+ }
@@ -0,0 +1,45 @@
1
+ /*
2
+ *
3
+ * Copyright 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_CORE_LIB_SECURITY_CREDENTIALS_PLUGIN_PLUGIN_CREDENTIALS_H
35
+ #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_PLUGIN_PLUGIN_CREDENTIALS_H
36
+
37
+ #include "src/core/lib/security/credentials/credentials.h"
38
+
39
+ typedef struct {
40
+ grpc_call_credentials base;
41
+ grpc_metadata_credentials_plugin plugin;
42
+ grpc_credentials_md_store *plugin_md;
43
+ } grpc_plugin_credentials;
44
+
45
+ #endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_PLUGIN_PLUGIN_CREDENTIALS_H */
@@ -0,0 +1,240 @@
1
+ /*
2
+ *
3
+ * Copyright 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
+ #include "src/core/lib/security/credentials/ssl/ssl_credentials.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include "src/core/lib/channel/channel_args.h"
39
+ #include "src/core/lib/channel/http_client_filter.h"
40
+ #include "src/core/lib/surface/api_trace.h"
41
+
42
+ #include <grpc/support/alloc.h>
43
+ #include <grpc/support/log.h>
44
+
45
+ //
46
+ // Utils
47
+ //
48
+
49
+ static void ssl_copy_key_material(const char *input, unsigned char **output,
50
+ size_t *output_size) {
51
+ *output_size = strlen(input);
52
+ *output = gpr_malloc(*output_size);
53
+ memcpy(*output, input, *output_size);
54
+ }
55
+
56
+ //
57
+ // SSL Channel Credentials.
58
+ //
59
+
60
+ static void ssl_destruct(grpc_channel_credentials *creds) {
61
+ grpc_ssl_credentials *c = (grpc_ssl_credentials *)creds;
62
+ if (c->config.pem_root_certs != NULL) gpr_free(c->config.pem_root_certs);
63
+ if (c->config.pem_private_key != NULL) gpr_free(c->config.pem_private_key);
64
+ if (c->config.pem_cert_chain != NULL) gpr_free(c->config.pem_cert_chain);
65
+ }
66
+
67
+ static grpc_security_status ssl_create_security_connector(
68
+ grpc_channel_credentials *creds, grpc_call_credentials *call_creds,
69
+ const char *target, const grpc_channel_args *args,
70
+ grpc_channel_security_connector **sc, grpc_channel_args **new_args) {
71
+ grpc_ssl_credentials *c = (grpc_ssl_credentials *)creds;
72
+ grpc_security_status status = GRPC_SECURITY_OK;
73
+ size_t i = 0;
74
+ const char *overridden_target_name = NULL;
75
+ grpc_arg new_arg;
76
+
77
+ for (i = 0; args && i < args->num_args; i++) {
78
+ grpc_arg *arg = &args->args[i];
79
+ if (strcmp(arg->key, GRPC_SSL_TARGET_NAME_OVERRIDE_ARG) == 0 &&
80
+ arg->type == GRPC_ARG_STRING) {
81
+ overridden_target_name = arg->value.string;
82
+ break;
83
+ }
84
+ }
85
+ status = grpc_ssl_channel_security_connector_create(
86
+ call_creds, &c->config, target, overridden_target_name, sc);
87
+ if (status != GRPC_SECURITY_OK) {
88
+ return status;
89
+ }
90
+ new_arg.type = GRPC_ARG_STRING;
91
+ new_arg.key = GRPC_ARG_HTTP2_SCHEME;
92
+ new_arg.value.string = "https";
93
+ *new_args = grpc_channel_args_copy_and_add(args, &new_arg, 1);
94
+ return status;
95
+ }
96
+
97
+ static grpc_channel_credentials_vtable ssl_vtable = {
98
+ ssl_destruct, ssl_create_security_connector};
99
+
100
+ static void ssl_build_config(const char *pem_root_certs,
101
+ grpc_ssl_pem_key_cert_pair *pem_key_cert_pair,
102
+ grpc_ssl_config *config) {
103
+ if (pem_root_certs != NULL) {
104
+ ssl_copy_key_material(pem_root_certs, &config->pem_root_certs,
105
+ &config->pem_root_certs_size);
106
+ }
107
+ if (pem_key_cert_pair != NULL) {
108
+ GPR_ASSERT(pem_key_cert_pair->private_key != NULL);
109
+ GPR_ASSERT(pem_key_cert_pair->cert_chain != NULL);
110
+ ssl_copy_key_material(pem_key_cert_pair->private_key,
111
+ &config->pem_private_key,
112
+ &config->pem_private_key_size);
113
+ ssl_copy_key_material(pem_key_cert_pair->cert_chain,
114
+ &config->pem_cert_chain,
115
+ &config->pem_cert_chain_size);
116
+ }
117
+ }
118
+
119
+ grpc_channel_credentials *grpc_ssl_credentials_create(
120
+ const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pair,
121
+ void *reserved) {
122
+ grpc_ssl_credentials *c = gpr_malloc(sizeof(grpc_ssl_credentials));
123
+ GRPC_API_TRACE(
124
+ "grpc_ssl_credentials_create(pem_root_certs=%s, "
125
+ "pem_key_cert_pair=%p, "
126
+ "reserved=%p)",
127
+ 3, (pem_root_certs, pem_key_cert_pair, reserved));
128
+ GPR_ASSERT(reserved == NULL);
129
+ memset(c, 0, sizeof(grpc_ssl_credentials));
130
+ c->base.type = GRPC_CHANNEL_CREDENTIALS_TYPE_SSL;
131
+ c->base.vtable = &ssl_vtable;
132
+ gpr_ref_init(&c->base.refcount, 1);
133
+ ssl_build_config(pem_root_certs, pem_key_cert_pair, &c->config);
134
+ return &c->base;
135
+ }
136
+
137
+ //
138
+ // SSL Server Credentials.
139
+ //
140
+
141
+ static void ssl_server_destruct(grpc_server_credentials *creds) {
142
+ grpc_ssl_server_credentials *c = (grpc_ssl_server_credentials *)creds;
143
+ size_t i;
144
+ for (i = 0; i < c->config.num_key_cert_pairs; i++) {
145
+ if (c->config.pem_private_keys[i] != NULL) {
146
+ gpr_free(c->config.pem_private_keys[i]);
147
+ }
148
+ if (c->config.pem_cert_chains[i] != NULL) {
149
+ gpr_free(c->config.pem_cert_chains[i]);
150
+ }
151
+ }
152
+ if (c->config.pem_private_keys != NULL) gpr_free(c->config.pem_private_keys);
153
+ if (c->config.pem_private_keys_sizes != NULL) {
154
+ gpr_free(c->config.pem_private_keys_sizes);
155
+ }
156
+ if (c->config.pem_cert_chains != NULL) gpr_free(c->config.pem_cert_chains);
157
+ if (c->config.pem_cert_chains_sizes != NULL) {
158
+ gpr_free(c->config.pem_cert_chains_sizes);
159
+ }
160
+ if (c->config.pem_root_certs != NULL) gpr_free(c->config.pem_root_certs);
161
+ }
162
+
163
+ static grpc_security_status ssl_server_create_security_connector(
164
+ grpc_server_credentials *creds, grpc_server_security_connector **sc) {
165
+ grpc_ssl_server_credentials *c = (grpc_ssl_server_credentials *)creds;
166
+ return grpc_ssl_server_security_connector_create(&c->config, sc);
167
+ }
168
+
169
+ static grpc_server_credentials_vtable ssl_server_vtable = {
170
+ ssl_server_destruct, ssl_server_create_security_connector};
171
+
172
+ static void ssl_build_server_config(
173
+ const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs,
174
+ size_t num_key_cert_pairs,
175
+ grpc_ssl_client_certificate_request_type client_certificate_request,
176
+ grpc_ssl_server_config *config) {
177
+ size_t i;
178
+ config->client_certificate_request = client_certificate_request;
179
+ if (pem_root_certs != NULL) {
180
+ ssl_copy_key_material(pem_root_certs, &config->pem_root_certs,
181
+ &config->pem_root_certs_size);
182
+ }
183
+ if (num_key_cert_pairs > 0) {
184
+ GPR_ASSERT(pem_key_cert_pairs != NULL);
185
+ config->pem_private_keys =
186
+ gpr_malloc(num_key_cert_pairs * sizeof(unsigned char *));
187
+ config->pem_cert_chains =
188
+ gpr_malloc(num_key_cert_pairs * sizeof(unsigned char *));
189
+ config->pem_private_keys_sizes =
190
+ gpr_malloc(num_key_cert_pairs * sizeof(size_t));
191
+ config->pem_cert_chains_sizes =
192
+ gpr_malloc(num_key_cert_pairs * sizeof(size_t));
193
+ }
194
+ config->num_key_cert_pairs = num_key_cert_pairs;
195
+ for (i = 0; i < num_key_cert_pairs; i++) {
196
+ GPR_ASSERT(pem_key_cert_pairs[i].private_key != NULL);
197
+ GPR_ASSERT(pem_key_cert_pairs[i].cert_chain != NULL);
198
+ ssl_copy_key_material(pem_key_cert_pairs[i].private_key,
199
+ &config->pem_private_keys[i],
200
+ &config->pem_private_keys_sizes[i]);
201
+ ssl_copy_key_material(pem_key_cert_pairs[i].cert_chain,
202
+ &config->pem_cert_chains[i],
203
+ &config->pem_cert_chains_sizes[i]);
204
+ }
205
+ }
206
+
207
+ grpc_server_credentials *grpc_ssl_server_credentials_create(
208
+ const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs,
209
+ size_t num_key_cert_pairs, int force_client_auth, void *reserved) {
210
+ return grpc_ssl_server_credentials_create_ex(
211
+ pem_root_certs, pem_key_cert_pairs, num_key_cert_pairs,
212
+ force_client_auth
213
+ ? GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
214
+ : GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
215
+ reserved);
216
+ }
217
+
218
+ grpc_server_credentials *grpc_ssl_server_credentials_create_ex(
219
+ const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs,
220
+ size_t num_key_cert_pairs,
221
+ grpc_ssl_client_certificate_request_type client_certificate_request,
222
+ void *reserved) {
223
+ grpc_ssl_server_credentials *c =
224
+ gpr_malloc(sizeof(grpc_ssl_server_credentials));
225
+ GRPC_API_TRACE(
226
+ "grpc_ssl_server_credentials_create_ex("
227
+ "pem_root_certs=%s, pem_key_cert_pairs=%p, num_key_cert_pairs=%lu, "
228
+ "client_certificate_request=%d, reserved=%p)",
229
+ 5, (pem_root_certs, pem_key_cert_pairs, (unsigned long)num_key_cert_pairs,
230
+ client_certificate_request, reserved));
231
+ GPR_ASSERT(reserved == NULL);
232
+ memset(c, 0, sizeof(grpc_ssl_server_credentials));
233
+ c->base.type = GRPC_CHANNEL_CREDENTIALS_TYPE_SSL;
234
+ gpr_ref_init(&c->base.refcount, 1);
235
+ c->base.vtable = &ssl_server_vtable;
236
+ ssl_build_server_config(pem_root_certs, pem_key_cert_pairs,
237
+ num_key_cert_pairs, client_certificate_request,
238
+ &c->config);
239
+ return &c->base;
240
+ }