grpc 1.0.1 → 1.1.2

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 (705) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3696 -867
  3. data/etc/roots.pem +39 -111
  4. data/include/grpc/byte_buffer.h +64 -1
  5. data/include/grpc/census.h +40 -96
  6. data/include/grpc/compression.h +2 -1
  7. data/include/grpc/grpc.h +42 -7
  8. data/include/grpc/grpc_posix.h +8 -5
  9. data/include/grpc/impl/codegen/atm.h +3 -0
  10. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  11. data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
  12. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  13. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
  14. data/include/grpc/impl/codegen/compression_types.h +1 -1
  15. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  16. data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
  17. data/include/grpc/impl/codegen/gpr_slice.h +84 -0
  18. data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
  19. data/include/grpc/impl/codegen/grpc_types.h +91 -9
  20. data/include/grpc/impl/codegen/port_platform.h +25 -92
  21. data/include/grpc/impl/codegen/slice.h +54 -97
  22. data/include/grpc/impl/codegen/sync.h +0 -253
  23. data/include/grpc/module.modulemap +0 -2
  24. data/include/grpc/slice.h +132 -0
  25. data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
  26. data/include/grpc/support/alloc.h +40 -1
  27. data/include/grpc/support/log.h +80 -1
  28. data/include/grpc/support/log_windows.h +2 -0
  29. data/include/grpc/support/string_util.h +1 -1
  30. data/include/grpc/support/sync.h +252 -0
  31. data/include/grpc/support/time.h +67 -1
  32. data/src/boringssl/err_data.c +639 -627
  33. data/src/core/ext/census/base_resources.c +71 -0
  34. data/src/core/ext/census/base_resources.h +39 -0
  35. data/src/core/ext/census/gen/census.pb.c +26 -29
  36. data/src/core/ext/census/gen/census.pb.h +68 -67
  37. data/src/core/ext/census/gen/trace_context.pb.c +81 -0
  38. data/src/core/ext/census/gen/trace_context.pb.h +99 -0
  39. data/src/core/ext/census/grpc_filter.c +22 -16
  40. data/src/core/ext/census/grpc_plugin.c +2 -1
  41. data/src/core/ext/census/initialize.c +16 -4
  42. data/src/core/ext/census/mlog.h +1 -1
  43. data/src/core/ext/census/placeholders.c +0 -45
  44. data/src/core/ext/census/resource.c +312 -0
  45. data/src/core/ext/census/resource.h +63 -0
  46. data/src/core/ext/census/trace_context.c +86 -0
  47. data/src/core/ext/census/trace_context.h +68 -0
  48. data/src/core/ext/census/tracing.c +8 -2
  49. data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
  50. data/src/core/ext/client_channel/client_channel.c +1218 -0
  51. data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
  52. data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
  53. data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
  54. data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
  55. data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
  56. data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
  57. data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
  58. data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
  59. data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
  60. data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
  61. data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
  62. data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
  63. data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
  64. data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
  65. data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
  66. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
  67. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
  68. data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
  69. data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
  70. data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
  71. data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
  72. data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
  73. data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
  74. data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
  75. data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
  76. data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
  77. data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
  78. data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
  79. data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
  80. data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
  81. data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
  82. data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
  83. data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
  84. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
  85. data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
  86. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
  87. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
  88. data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
  89. data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
  90. data/src/core/ext/load_reporting/load_reporting.c +7 -56
  91. data/src/core/ext/load_reporting/load_reporting.h +41 -28
  92. data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
  93. data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
  94. data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
  95. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
  96. data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
  98. data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
  100. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
  101. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
  105. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
  106. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
  107. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
  108. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
  109. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
  110. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
  111. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
  112. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
  114. data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
  128. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
  130. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
  132. data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
  134. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
  135. data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
  136. data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
  137. data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
  138. data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
  139. data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
  140. data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
  141. data/src/core/lib/channel/channel_args.c +70 -13
  142. data/src/core/lib/channel/channel_args.h +28 -2
  143. data/src/core/lib/channel/channel_stack.c +77 -28
  144. data/src/core/lib/channel/channel_stack.h +61 -23
  145. data/src/core/lib/channel/channel_stack_builder.c +33 -25
  146. data/src/core/lib/channel/channel_stack_builder.h +17 -8
  147. data/src/core/lib/channel/compress_filter.c +52 -36
  148. data/src/core/lib/channel/connected_channel.c +20 -12
  149. data/src/core/lib/channel/connected_channel.h +2 -1
  150. data/src/core/lib/channel/context.h +13 -1
  151. data/src/core/lib/channel/deadline_filter.c +344 -0
  152. data/src/core/lib/channel/deadline_filter.h +99 -0
  153. data/src/core/lib/channel/handshaker.c +240 -0
  154. data/src/core/lib/channel/handshaker.h +164 -0
  155. data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
  156. data/src/core/lib/channel/handshaker_factory.h +66 -0
  157. data/src/core/lib/channel/handshaker_registry.c +113 -0
  158. data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
  159. data/src/core/lib/channel/http_client_filter.c +248 -46
  160. data/src/core/lib/channel/http_client_filter.h +3 -0
  161. data/src/core/lib/channel/http_server_filter.c +136 -24
  162. data/src/core/lib/channel/message_size_filter.c +261 -0
  163. data/src/core/lib/channel/message_size_filter.h +39 -0
  164. data/src/core/lib/compression/message_compress.c +43 -37
  165. data/src/core/lib/compression/message_compress.h +7 -5
  166. data/src/core/lib/http/format_request.c +26 -11
  167. data/src/core/lib/http/format_request.h +7 -5
  168. data/src/core/lib/http/httpcli.c +45 -27
  169. data/src/core/lib/http/httpcli.h +4 -4
  170. data/src/core/lib/http/httpcli_security_connector.c +56 -46
  171. data/src/core/lib/http/parser.c +17 -14
  172. data/src/core/lib/http/parser.h +4 -2
  173. data/src/core/lib/iomgr/closure.c +49 -7
  174. data/src/core/lib/iomgr/closure.h +56 -14
  175. data/src/core/lib/iomgr/combiner.c +422 -0
  176. data/src/core/lib/iomgr/combiner.h +64 -0
  177. data/src/core/lib/iomgr/endpoint.c +8 -2
  178. data/src/core/lib/iomgr/endpoint.h +17 -7
  179. data/src/core/lib/iomgr/endpoint_pair.h +3 -2
  180. data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
  181. data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
  182. data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
  183. data/src/core/lib/iomgr/error.c +72 -6
  184. data/src/core/lib/iomgr/error.h +30 -3
  185. data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
  186. data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
  187. data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
  188. data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
  189. data/src/core/lib/iomgr/ev_posix.c +26 -5
  190. data/src/core/lib/iomgr/ev_posix.h +12 -1
  191. data/src/core/lib/iomgr/exec_ctx.c +27 -94
  192. data/src/core/lib/iomgr/exec_ctx.h +19 -22
  193. data/src/core/lib/iomgr/executor.c +29 -8
  194. data/src/core/lib/iomgr/executor.h +2 -4
  195. data/src/core/lib/iomgr/iocp_windows.c +3 -4
  196. data/src/core/lib/iomgr/iomgr.c +14 -10
  197. data/src/core/lib/iomgr/iomgr.h +6 -2
  198. data/src/core/lib/iomgr/iomgr_posix.c +2 -2
  199. data/src/core/lib/iomgr/iomgr_uv.c +49 -0
  200. data/src/core/lib/iomgr/iomgr_windows.c +2 -2
  201. data/src/core/lib/iomgr/load_file.c +3 -3
  202. data/src/core/lib/iomgr/load_file.h +2 -2
  203. data/src/core/lib/iomgr/network_status_tracker.c +1 -1
  204. data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
  205. data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
  206. data/src/core/lib/iomgr/pollset_uv.c +142 -0
  207. data/src/core/lib/iomgr/pollset_uv.h +42 -0
  208. data/src/core/lib/iomgr/pollset_windows.c +5 -6
  209. data/src/core/lib/iomgr/port.h +129 -0
  210. data/src/core/lib/iomgr/resolve_address.h +2 -1
  211. data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
  212. data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
  213. data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
  214. data/src/core/lib/iomgr/resource_quota.c +832 -0
  215. data/src/core/lib/iomgr/resource_quota.h +159 -0
  216. data/src/core/lib/iomgr/sockaddr.h +10 -2
  217. data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
  218. data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
  219. data/src/core/lib/iomgr/socket_mutator.c +98 -0
  220. data/src/core/lib/iomgr/socket_mutator.h +80 -0
  221. data/src/core/lib/iomgr/socket_utils.h +42 -0
  222. data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
  223. data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
  224. data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
  225. data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
  226. data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
  227. data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
  228. data/src/core/lib/iomgr/socket_windows.c +14 -6
  229. data/src/core/lib/iomgr/socket_windows.h +1 -0
  230. data/src/core/lib/iomgr/tcp_client.h +8 -2
  231. data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
  232. data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
  233. data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
  234. data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
  235. data/src/core/lib/iomgr/tcp_posix.c +135 -56
  236. data/src/core/lib/iomgr/tcp_posix.h +2 -2
  237. data/src/core/lib/iomgr/tcp_server.h +14 -6
  238. data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
  239. data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
  240. data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
  241. data/src/core/lib/iomgr/tcp_uv.c +367 -0
  242. data/src/core/lib/iomgr/tcp_uv.h +59 -0
  243. data/src/core/lib/iomgr/tcp_windows.c +65 -48
  244. data/src/core/lib/iomgr/tcp_windows.h +3 -1
  245. data/src/core/lib/iomgr/timer.h +21 -21
  246. data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
  247. data/src/core/lib/iomgr/timer_generic.h +49 -0
  248. data/src/core/lib/iomgr/timer_heap.c +6 -0
  249. data/src/core/lib/iomgr/timer_uv.c +99 -0
  250. data/src/core/lib/iomgr/timer_uv.h +47 -0
  251. data/src/core/lib/iomgr/udp_server.c +116 -98
  252. data/src/core/lib/iomgr/udp_server.h +5 -3
  253. data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
  254. data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
  256. data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
  257. data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
  258. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
  259. data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
  260. data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
  261. data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
  262. data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
  263. data/src/core/lib/iomgr/workqueue.h +12 -20
  264. data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
  265. data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
  266. data/src/core/lib/iomgr/workqueue_windows.c +9 -8
  267. data/src/core/lib/json/json.c +3 -3
  268. data/src/core/lib/json/json.h +11 -11
  269. data/src/core/lib/json/json_reader.c +9 -5
  270. data/src/core/lib/profiling/basic_timers.c +10 -1
  271. data/src/core/lib/profiling/timers.h +2 -0
  272. data/src/core/lib/security/context/security_context.c +13 -3
  273. data/src/core/lib/security/context/security_context.h +20 -0
  274. data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
  275. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  276. data/src/core/lib/security/credentials/credentials.c +48 -19
  277. data/src/core/lib/security/credentials/credentials.h +36 -19
  278. data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
  279. data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
  280. data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
  281. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
  282. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
  283. data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
  284. data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
  285. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  286. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
  287. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
  288. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
  289. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
  290. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
  291. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  292. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
  293. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
  294. data/src/core/lib/security/transport/client_auth_filter.c +33 -27
  295. data/src/core/lib/security/transport/secure_endpoint.c +93 -68
  296. data/src/core/lib/security/transport/secure_endpoint.h +2 -2
  297. data/src/core/lib/security/transport/security_connector.c +133 -168
  298. data/src/core/lib/security/transport/security_connector.h +31 -46
  299. data/src/core/lib/security/transport/security_handshaker.c +501 -0
  300. data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
  301. data/src/core/lib/security/transport/server_auth_filter.c +50 -38
  302. data/src/core/lib/security/util/b64.c +11 -8
  303. data/src/core/lib/security/util/b64.h +5 -4
  304. data/src/core/lib/slice/percent_encoding.c +182 -0
  305. data/src/core/lib/slice/percent_encoding.h +78 -0
  306. data/src/core/lib/{support → slice}/slice.c +81 -50
  307. data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
  308. data/src/core/lib/slice/slice_internal.h +49 -0
  309. data/src/core/lib/slice/slice_string_helpers.c +90 -0
  310. data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
  311. data/src/core/lib/support/backoff.c +24 -13
  312. data/src/core/lib/support/backoff.h +5 -2
  313. data/src/core/lib/support/env.h +0 -2
  314. data/src/core/lib/support/log.c +5 -4
  315. data/src/core/lib/support/log_linux.c +0 -1
  316. data/src/core/lib/support/log_posix.c +1 -1
  317. data/src/core/lib/support/mpscq.c +83 -0
  318. data/src/core/lib/support/mpscq.h +65 -0
  319. data/src/core/lib/support/string.c +58 -49
  320. data/src/core/lib/support/string.h +11 -8
  321. data/src/core/lib/support/subprocess_posix.c +5 -2
  322. data/src/core/lib/support/thd.c +1 -1
  323. data/src/core/lib/support/time.c +43 -79
  324. data/src/core/lib/support/time_posix.c +1 -1
  325. data/src/core/lib/support/tmpfile.h +0 -2
  326. data/src/core/lib/surface/alarm.c +4 -1
  327. data/src/core/lib/surface/byte_buffer.c +17 -11
  328. data/src/core/lib/surface/byte_buffer_reader.c +23 -15
  329. data/src/core/lib/surface/call.c +294 -276
  330. data/src/core/lib/surface/call.h +24 -9
  331. data/src/core/lib/surface/call_log_batch.c +5 -3
  332. data/src/core/lib/surface/channel.c +127 -111
  333. data/src/core/lib/surface/channel.h +14 -5
  334. data/src/core/lib/surface/channel_init.c +1 -1
  335. data/src/core/lib/surface/channel_init.h +10 -1
  336. data/src/core/lib/surface/channel_ping.c +7 -6
  337. data/src/core/lib/surface/completion_queue.c +154 -18
  338. data/src/core/lib/surface/completion_queue.h +5 -0
  339. data/src/core/lib/surface/init.c +40 -6
  340. data/src/core/lib/surface/init.h +1 -0
  341. data/src/core/lib/surface/init_secure.c +5 -2
  342. data/src/core/lib/surface/lame_client.c +28 -18
  343. data/src/core/lib/surface/server.c +134 -87
  344. data/src/core/lib/surface/server.h +8 -0
  345. data/src/core/lib/surface/validate_metadata.c +1 -1
  346. data/src/core/lib/surface/version.c +3 -1
  347. data/src/core/lib/transport/byte_stream.c +7 -4
  348. data/src/core/lib/transport/byte_stream.h +6 -10
  349. data/src/core/lib/transport/connectivity_state.c +21 -12
  350. data/src/core/lib/transport/connectivity_state.h +4 -1
  351. data/src/core/lib/transport/mdstr_hash_table.c +118 -0
  352. data/src/core/lib/transport/mdstr_hash_table.h +77 -0
  353. data/src/core/lib/transport/metadata.c +83 -60
  354. data/src/core/lib/transport/metadata.h +41 -23
  355. data/src/core/lib/transport/metadata_batch.c +17 -11
  356. data/src/core/lib/transport/metadata_batch.h +20 -6
  357. data/src/core/lib/transport/pid_controller.c +57 -0
  358. data/src/core/lib/transport/pid_controller.h +64 -0
  359. data/src/core/lib/transport/service_config.c +251 -0
  360. data/src/core/lib/transport/service_config.h +71 -0
  361. data/src/core/lib/transport/static_metadata.c +18 -16
  362. data/src/core/lib/transport/static_metadata.h +113 -107
  363. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
  364. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
  365. data/src/core/lib/transport/transport.c +84 -23
  366. data/src/core/lib/transport/transport.h +53 -8
  367. data/src/core/lib/transport/transport_impl.h +3 -0
  368. data/src/core/lib/transport/transport_op_string.c +92 -20
  369. data/src/core/lib/tsi/ssl_transport_security.c +3 -1
  370. data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
  371. data/src/ruby/ext/grpc/extconf.rb +0 -1
  372. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
  373. data/src/ruby/ext/grpc/rb_call.c +15 -5
  374. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  375. data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
  376. data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
  377. data/src/ruby/ext/grpc/rb_grpc.c +3 -1
  378. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
  379. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
  380. data/src/ruby/ext/grpc/rb_server.c +18 -12
  381. data/src/ruby/lib/grpc/errors.rb +154 -2
  382. data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
  383. data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
  384. data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
  385. data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
  386. data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
  387. data/src/ruby/lib/grpc/generic/service.rb +3 -2
  388. data/src/ruby/lib/grpc/version.rb +1 -1
  389. data/src/ruby/pb/grpc/health/checker.rb +3 -1
  390. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
  391. data/src/ruby/pb/test/client.rb +307 -7
  392. data/src/ruby/pb/test/server.rb +26 -1
  393. data/src/ruby/spec/compression_options_spec.rb +164 -0
  394. data/src/ruby/spec/error_sanity_spec.rb +64 -0
  395. data/src/ruby/spec/generic/active_call_spec.rb +290 -12
  396. data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
  397. data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
  398. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
  399. data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
  400. data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
  401. data/src/ruby/spec/spec_helper.rb +2 -0
  402. data/third_party/boringssl/crypto/aes/aes.c +12 -12
  403. data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
  404. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
  405. data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
  406. data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
  407. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  408. data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
  409. data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
  410. data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
  411. data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
  412. data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
  413. data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
  414. data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
  415. data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
  416. data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
  417. data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
  418. data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
  419. data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
  420. data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
  421. data/third_party/boringssl/crypto/base64/base64.c +249 -285
  422. data/third_party/boringssl/crypto/bio/bio.c +13 -23
  423. data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
  424. data/third_party/boringssl/crypto/bio/connect.c +12 -3
  425. data/third_party/boringssl/crypto/bio/fd.c +22 -15
  426. data/third_party/boringssl/crypto/bio/file.c +2 -38
  427. data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
  428. data/third_party/boringssl/crypto/bio/internal.h +3 -0
  429. data/third_party/boringssl/crypto/bio/pair.c +1 -1
  430. data/third_party/boringssl/crypto/bio/socket.c +10 -2
  431. data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
  432. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
  433. data/third_party/boringssl/crypto/bn/bn.c +38 -0
  434. data/third_party/boringssl/crypto/bn/cmp.c +25 -0
  435. data/third_party/boringssl/crypto/bn/convert.c +73 -76
  436. data/third_party/boringssl/crypto/bn/div.c +136 -70
  437. data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
  438. data/third_party/boringssl/crypto/bn/gcd.c +213 -296
  439. data/third_party/boringssl/crypto/bn/generic.c +0 -80
  440. data/third_party/boringssl/crypto/bn/internal.h +15 -3
  441. data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
  442. data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
  443. data/third_party/boringssl/crypto/bn/mul.c +2 -1
  444. data/third_party/boringssl/crypto/bn/prime.c +24 -8
  445. data/third_party/boringssl/crypto/bn/random.c +47 -33
  446. data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
  447. data/third_party/boringssl/crypto/buf/buf.c +25 -21
  448. data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
  449. data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
  450. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
  451. data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
  452. data/third_party/boringssl/crypto/cipher/aead.c +11 -22
  453. data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
  454. data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
  455. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
  456. data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
  457. data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
  458. data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
  459. data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
  460. data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
  461. data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
  462. data/third_party/boringssl/crypto/cipher/internal.h +8 -10
  463. data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
  464. data/third_party/boringssl/crypto/conf/conf.c +2 -1
  465. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
  466. data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
  467. data/third_party/boringssl/crypto/cpu-arm.c +0 -161
  468. data/third_party/boringssl/crypto/cpu-intel.c +5 -3
  469. data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
  470. data/third_party/boringssl/crypto/crypto.c +29 -7
  471. data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
  472. data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
  473. data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
  474. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
  475. data/third_party/boringssl/crypto/dh/check.c +22 -6
  476. data/third_party/boringssl/crypto/dh/dh.c +45 -21
  477. data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
  478. data/third_party/boringssl/crypto/dh/params.c +30 -78
  479. data/third_party/boringssl/crypto/digest/digest.c +3 -3
  480. data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
  481. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
  482. data/third_party/boringssl/crypto/ec/ec.c +84 -140
  483. data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
  484. data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
  485. data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
  486. data/third_party/boringssl/crypto/ec/internal.h +12 -36
  487. data/third_party/boringssl/crypto/ec/oct.c +11 -11
  488. data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
  489. data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
  490. data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
  491. data/third_party/boringssl/crypto/ec/simple.c +81 -201
  492. data/third_party/boringssl/crypto/ec/util-64.c +0 -74
  493. data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
  494. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
  495. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
  496. data/third_party/boringssl/crypto/engine/engine.c +1 -1
  497. data/third_party/boringssl/crypto/err/err.c +3 -3
  498. data/third_party/boringssl/crypto/evp/evp.c +14 -59
  499. data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
  500. data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
  501. data/third_party/boringssl/crypto/evp/internal.h +4 -46
  502. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
  503. data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
  504. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
  505. data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
  506. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
  507. data/third_party/boringssl/crypto/evp/print.c +520 -0
  508. data/third_party/boringssl/crypto/ex_data.c +4 -6
  509. data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
  510. data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
  511. data/third_party/boringssl/crypto/internal.h +57 -77
  512. data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
  513. data/third_party/boringssl/crypto/md4/md4.c +9 -0
  514. data/third_party/boringssl/crypto/mem.c +19 -19
  515. data/third_party/boringssl/crypto/modes/cfb.c +5 -6
  516. data/third_party/boringssl/crypto/modes/ctr.c +10 -18
  517. data/third_party/boringssl/crypto/modes/gcm.c +100 -66
  518. data/third_party/boringssl/crypto/modes/internal.h +15 -27
  519. data/third_party/boringssl/crypto/modes/ofb.c +9 -22
  520. data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
  521. data/third_party/boringssl/crypto/newhope/internal.h +71 -0
  522. data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
  523. data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
  524. data/third_party/boringssl/crypto/newhope/poly.c +183 -0
  525. data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
  526. data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
  527. data/third_party/boringssl/crypto/obj/obj.c +111 -135
  528. data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
  529. data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
  530. data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
  531. data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
  532. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
  533. data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
  534. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
  535. data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
  536. data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
  537. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
  538. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
  539. data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
  540. data/third_party/boringssl/crypto/rand/rand.c +4 -1
  541. data/third_party/boringssl/crypto/rand/urandom.c +5 -7
  542. data/third_party/boringssl/crypto/rand/windows.c +5 -8
  543. data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
  544. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  545. data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
  546. data/third_party/boringssl/crypto/rsa/internal.h +5 -13
  547. data/third_party/boringssl/crypto/rsa/padding.c +64 -63
  548. data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
  549. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
  550. data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
  551. data/third_party/boringssl/crypto/sha/sha256.c +2 -2
  552. data/third_party/boringssl/crypto/sha/sha512.c +7 -7
  553. data/third_party/boringssl/crypto/stack/stack.c +13 -22
  554. data/third_party/boringssl/crypto/thread.c +21 -12
  555. data/third_party/boringssl/crypto/thread_none.c +6 -2
  556. data/third_party/boringssl/crypto/thread_pthread.c +16 -7
  557. data/third_party/boringssl/crypto/thread_win.c +38 -85
  558. data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
  559. data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
  560. data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
  561. data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
  562. data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
  563. data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
  564. data/third_party/boringssl/crypto/x509/internal.h +66 -0
  565. data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
  566. data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
  567. data/third_party/boringssl/crypto/x509/x509.c +5 -0
  568. data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
  569. data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
  570. data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
  571. data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
  572. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  573. data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
  574. data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
  575. data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
  576. data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
  577. data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
  578. data/third_party/boringssl/crypto/x509/x_name.c +14 -17
  579. data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
  580. data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
  581. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
  582. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
  583. data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
  584. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
  585. data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
  586. data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
  587. data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
  588. data/third_party/boringssl/include/openssl/aead.h +72 -73
  589. data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
  590. data/third_party/boringssl/include/openssl/asn1.h +103 -235
  591. data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
  592. data/third_party/boringssl/include/openssl/asn1t.h +1 -11
  593. data/third_party/boringssl/include/openssl/base.h +145 -3
  594. data/third_party/boringssl/include/openssl/base64.h +20 -17
  595. data/third_party/boringssl/include/openssl/bio.h +59 -34
  596. data/third_party/boringssl/include/openssl/bn.h +118 -51
  597. data/third_party/boringssl/include/openssl/buf.h +15 -0
  598. data/third_party/boringssl/include/openssl/bytestring.h +52 -4
  599. data/third_party/boringssl/include/openssl/chacha.h +2 -2
  600. data/third_party/boringssl/include/openssl/cipher.h +18 -1
  601. data/third_party/boringssl/include/openssl/cmac.h +11 -0
  602. data/third_party/boringssl/include/openssl/conf.h +13 -2
  603. data/third_party/boringssl/include/openssl/cpu.h +20 -23
  604. data/third_party/boringssl/include/openssl/crypto.h +22 -1
  605. data/third_party/boringssl/include/openssl/curve25519.h +96 -4
  606. data/third_party/boringssl/include/openssl/dh.h +71 -16
  607. data/third_party/boringssl/include/openssl/digest.h +38 -11
  608. data/third_party/boringssl/include/openssl/dsa.h +40 -4
  609. data/third_party/boringssl/include/openssl/ec.h +44 -18
  610. data/third_party/boringssl/include/openssl/ec_key.h +27 -6
  611. data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
  612. data/third_party/boringssl/include/openssl/engine.h +11 -0
  613. data/third_party/boringssl/include/openssl/evp.h +52 -88
  614. data/third_party/boringssl/include/openssl/hkdf.h +24 -4
  615. data/third_party/boringssl/include/openssl/hmac.h +20 -6
  616. data/third_party/boringssl/include/openssl/md4.h +4 -0
  617. data/third_party/boringssl/include/openssl/mem.h +19 -0
  618. data/third_party/boringssl/include/openssl/newhope.h +158 -0
  619. data/third_party/boringssl/include/openssl/nid.h +4166 -0
  620. data/third_party/boringssl/include/openssl/obj.h +31 -3
  621. data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
  622. data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
  623. data/third_party/boringssl/include/openssl/pem.h +5 -0
  624. data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
  625. data/third_party/boringssl/include/openssl/rand.h +6 -0
  626. data/third_party/boringssl/include/openssl/rc4.h +6 -0
  627. data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
  628. data/third_party/boringssl/include/openssl/rsa.h +127 -65
  629. data/third_party/boringssl/include/openssl/sha.h +14 -10
  630. data/third_party/boringssl/include/openssl/ssl.h +561 -275
  631. data/third_party/boringssl/include/openssl/ssl3.h +18 -25
  632. data/third_party/boringssl/include/openssl/stack.h +2 -4
  633. data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
  634. data/third_party/boringssl/include/openssl/thread.h +31 -13
  635. data/third_party/boringssl/include/openssl/time_support.h +1 -0
  636. data/third_party/boringssl/include/openssl/tls1.h +37 -33
  637. data/third_party/boringssl/include/openssl/x509.h +69 -26
  638. data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
  639. data/third_party/boringssl/include/openssl/x509v3.h +23 -2
  640. data/third_party/boringssl/ssl/custom_extensions.c +3 -5
  641. data/third_party/boringssl/ssl/d1_both.c +463 -499
  642. data/third_party/boringssl/ssl/d1_lib.c +38 -109
  643. data/third_party/boringssl/ssl/d1_pkt.c +173 -334
  644. data/third_party/boringssl/ssl/d1_srtp.c +20 -18
  645. data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
  646. data/third_party/boringssl/ssl/dtls_record.c +27 -26
  647. data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
  648. data/third_party/boringssl/ssl/handshake_server.c +1932 -0
  649. data/third_party/boringssl/ssl/internal.h +712 -439
  650. data/third_party/boringssl/ssl/s3_both.c +445 -257
  651. data/third_party/boringssl/ssl/s3_enc.c +53 -36
  652. data/third_party/boringssl/ssl/s3_lib.c +23 -268
  653. data/third_party/boringssl/ssl/s3_pkt.c +168 -364
  654. data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
  655. data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
  656. data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
  657. data/third_party/boringssl/ssl/ssl_cert.c +324 -49
  658. data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
  659. data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
  660. data/third_party/boringssl/ssl/ssl_file.c +21 -68
  661. data/third_party/boringssl/ssl/ssl_lib.c +881 -510
  662. data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
  663. data/third_party/boringssl/ssl/ssl_session.c +324 -103
  664. data/third_party/boringssl/ssl/ssl_stat.c +6 -88
  665. data/third_party/boringssl/ssl/t1_enc.c +23 -39
  666. data/third_party/boringssl/ssl/t1_lib.c +1120 -622
  667. data/third_party/boringssl/ssl/tls13_both.c +440 -0
  668. data/third_party/boringssl/ssl/tls13_client.c +682 -0
  669. data/third_party/boringssl/ssl/tls13_enc.c +391 -0
  670. data/third_party/boringssl/ssl/tls13_server.c +672 -0
  671. data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
  672. data/third_party/boringssl/ssl/tls_record.c +159 -77
  673. data/third_party/nanopb/pb.h +60 -28
  674. data/third_party/nanopb/pb_decode.c +120 -92
  675. data/third_party/nanopb/pb_decode.h +3 -3
  676. data/third_party/nanopb/pb_encode.c +73 -67
  677. data/third_party/nanopb/pb_encode.h +4 -4
  678. metadata +155 -89
  679. data/include/grpc/impl/codegen/byte_buffer.h +0 -122
  680. data/include/grpc/impl/codegen/log.h +0 -118
  681. data/include/grpc/impl/codegen/time.h +0 -130
  682. data/src/core/ext/client_config/client_channel.c +0 -593
  683. data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
  684. data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
  685. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
  686. data/src/core/lib/iomgr/workqueue_posix.c +0 -151
  687. data/src/core/lib/security/transport/handshake.c +0 -368
  688. data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
  689. data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
  690. data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
  691. data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
  692. data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
  693. data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
  694. data/third_party/boringssl/crypto/directory.h +0 -66
  695. data/third_party/boringssl/crypto/directory_posix.c +0 -108
  696. data/third_party/boringssl/crypto/directory_win.c +0 -144
  697. data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
  698. data/third_party/boringssl/include/openssl/pqueue.h +0 -146
  699. data/third_party/boringssl/ssl/d1_clnt.c +0 -561
  700. data/third_party/boringssl/ssl/d1_srvr.c +0 -476
  701. data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
  702. data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
  703. data/third_party/boringssl/ssl/test/async_bio.h +0 -45
  704. data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
  705. data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -92,7 +92,18 @@ SSL_AEAD_CTX *SSL_AEAD_CTX_new(enum evp_aead_direction_t direction,
92
92
  if (cipher->algorithm_enc & (SSL_AES128GCM | SSL_AES256GCM)) {
93
93
  aead_ctx->variable_nonce_included_in_record = 1;
94
94
  }
95
+
96
+ /* The TLS 1.3 construction XORs the fixed nonce into the sequence number
97
+ * and omits the additional data. */
98
+ if (version >= TLS1_3_VERSION) {
99
+ aead_ctx->xor_fixed_nonce = 1;
100
+ aead_ctx->variable_nonce_len = 8;
101
+ aead_ctx->variable_nonce_included_in_record = 0;
102
+ aead_ctx->omit_ad = 1;
103
+ assert(fixed_iv_len >= aead_ctx->variable_nonce_len);
104
+ }
95
105
  } else {
106
+ assert(version < TLS1_3_VERSION);
96
107
  aead_ctx->variable_nonce_included_in_record = 1;
97
108
  aead_ctx->random_variable_nonce = 1;
98
109
  aead_ctx->omit_length_in_ad = 1;
@@ -111,6 +122,10 @@ void SSL_AEAD_CTX_free(SSL_AEAD_CTX *aead) {
111
122
  }
112
123
 
113
124
  size_t SSL_AEAD_CTX_explicit_nonce_len(SSL_AEAD_CTX *aead) {
125
+ #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
126
+ aead = NULL;
127
+ #endif
128
+
114
129
  if (aead != NULL && aead->variable_nonce_included_in_record) {
115
130
  return aead->variable_nonce_len;
116
131
  }
@@ -118,11 +133,15 @@ size_t SSL_AEAD_CTX_explicit_nonce_len(SSL_AEAD_CTX *aead) {
118
133
  }
119
134
 
120
135
  size_t SSL_AEAD_CTX_max_overhead(SSL_AEAD_CTX *aead) {
136
+ #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
137
+ aead = NULL;
138
+ #endif
139
+
121
140
  if (aead == NULL) {
122
141
  return 0;
123
142
  }
124
143
  return EVP_AEAD_max_overhead(aead->ctx.aead) +
125
- SSL_AEAD_CTX_explicit_nonce_len(aead);
144
+ SSL_AEAD_CTX_explicit_nonce_len(aead);
126
145
  }
127
146
 
128
147
  /* ssl_aead_ctx_get_ad writes the additional data for |aead| into |out| and
@@ -131,6 +150,10 @@ static size_t ssl_aead_ctx_get_ad(SSL_AEAD_CTX *aead, uint8_t out[13],
131
150
  uint8_t type, uint16_t wire_version,
132
151
  const uint8_t seqnum[8],
133
152
  size_t plaintext_len) {
153
+ if (aead->omit_ad) {
154
+ return 0;
155
+ }
156
+
134
157
  memcpy(out, seqnum, 8);
135
158
  size_t len = 8;
136
159
  out[len++] = type;
@@ -145,18 +168,16 @@ static size_t ssl_aead_ctx_get_ad(SSL_AEAD_CTX *aead, uint8_t out[13],
145
168
  return len;
146
169
  }
147
170
 
148
- int SSL_AEAD_CTX_open(SSL_AEAD_CTX *aead, uint8_t *out, size_t *out_len,
149
- size_t max_out, uint8_t type, uint16_t wire_version,
150
- const uint8_t seqnum[8], const uint8_t *in,
151
- size_t in_len) {
171
+ int SSL_AEAD_CTX_open(SSL_AEAD_CTX *aead, CBS *out, uint8_t type,
172
+ uint16_t wire_version, const uint8_t seqnum[8],
173
+ uint8_t *in, size_t in_len) {
174
+ #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
175
+ aead = NULL;
176
+ #endif
177
+
152
178
  if (aead == NULL) {
153
179
  /* Handle the initial NULL cipher. */
154
- if (in_len > max_out) {
155
- OPENSSL_PUT_ERROR(SSL, SSL_R_BUFFER_TOO_SMALL);
156
- return 0;
157
- }
158
- memmove(out, in, in_len);
159
- *out_len = in_len;
180
+ CBS_init(out, in, in_len);
160
181
  return 1;
161
182
  }
162
183
 
@@ -208,20 +229,29 @@ int SSL_AEAD_CTX_open(SSL_AEAD_CTX *aead, uint8_t *out, size_t *out_len,
208
229
  /* XOR the fixed nonce, if necessary. */
209
230
  if (aead->xor_fixed_nonce) {
210
231
  assert(nonce_len == aead->fixed_nonce_len);
211
- size_t i;
212
- for (i = 0; i < aead->fixed_nonce_len; i++) {
232
+ for (size_t i = 0; i < aead->fixed_nonce_len; i++) {
213
233
  nonce[i] ^= aead->fixed_nonce[i];
214
234
  }
215
235
  }
216
236
 
217
- return EVP_AEAD_CTX_open(&aead->ctx, out, out_len, max_out, nonce, nonce_len,
218
- in, in_len, ad, ad_len);
237
+ /* Decrypt in-place. */
238
+ size_t len;
239
+ if (!EVP_AEAD_CTX_open(&aead->ctx, in, &len, in_len, nonce, nonce_len,
240
+ in, in_len, ad, ad_len)) {
241
+ return 0;
242
+ }
243
+ CBS_init(out, in, len);
244
+ return 1;
219
245
  }
220
246
 
221
247
  int SSL_AEAD_CTX_seal(SSL_AEAD_CTX *aead, uint8_t *out, size_t *out_len,
222
248
  size_t max_out, uint8_t type, uint16_t wire_version,
223
249
  const uint8_t seqnum[8], const uint8_t *in,
224
250
  size_t in_len) {
251
+ #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
252
+ aead = NULL;
253
+ #endif
254
+
225
255
  if (aead == NULL) {
226
256
  /* Handle the initial NULL cipher. */
227
257
  if (in_len > max_out) {
@@ -285,8 +315,7 @@ int SSL_AEAD_CTX_seal(SSL_AEAD_CTX *aead, uint8_t *out, size_t *out_len,
285
315
  /* XOR the fixed nonce, if necessary. */
286
316
  if (aead->xor_fixed_nonce) {
287
317
  assert(nonce_len == aead->fixed_nonce_len);
288
- size_t i;
289
- for (i = 0; i < aead->fixed_nonce_len; i++) {
318
+ for (size_t i = 0; i < aead->fixed_nonce_len; i++) {
290
319
  nonce[i] ^= aead->fixed_nonce[i];
291
320
  }
292
321
  }
@@ -85,6 +85,7 @@
85
85
  #include <limits.h>
86
86
  #include <string.h>
87
87
 
88
+ #include <openssl/buf.h>
88
89
  #include <openssl/bytestring.h>
89
90
  #include <openssl/err.h>
90
91
  #include <openssl/mem.h>
@@ -120,6 +121,8 @@
120
121
  * extendedMasterSecret [17] BOOLEAN OPTIONAL,
121
122
  * keyExchangeInfo [18] INTEGER OPTIONAL,
122
123
  * certChain [19] SEQUENCE OF Certificate OPTIONAL,
124
+ * ticketFlags [20] INTEGER OPTIONAL,
125
+ * ticketAgeAdd [21] OCTET STRING OPTIONAL,
123
126
  * }
124
127
  *
125
128
  * Note: historically this serialization has included other optional
@@ -164,22 +167,10 @@ static const int kKeyExchangeInfoTag =
164
167
  CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 18;
165
168
  static const int kCertChainTag =
166
169
  CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 19;
167
-
168
- static int add_X509(CBB *cbb, X509 *x509) {
169
- int len = i2d_X509(x509, NULL);
170
- if (len < 0) {
171
- return 0;
172
- }
173
- uint8_t *buf;
174
- if (!CBB_add_space(cbb, &buf, len)) {
175
- OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
176
- return 0;
177
- }
178
- if (buf != NULL && i2d_X509(x509, &buf) < 0) {
179
- return 0;
180
- }
181
- return 1;
182
- }
170
+ static const int kTicketFlagsTag =
171
+ CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 20;
172
+ static const int kTicketAgeAddTag =
173
+ CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 21;
183
174
 
184
175
  static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, uint8_t **out_data,
185
176
  size_t *out_len, int for_ticket) {
@@ -229,7 +220,7 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, uint8_t **out_data,
229
220
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
230
221
  goto err;
231
222
  }
232
- if (!add_X509(&child, in->peer)) {
223
+ if (!ssl_add_cert_to_cbb(&child, in->peer)) {
233
224
  goto err;
234
225
  }
235
226
  }
@@ -349,14 +340,30 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, uint8_t **out_data,
349
340
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
350
341
  goto err;
351
342
  }
352
- size_t i;
353
- for (i = 0; i < sk_X509_num(in->cert_chain); i++) {
354
- if (!add_X509(&child, sk_X509_value(in->cert_chain, i))) {
343
+ for (size_t i = 0; i < sk_X509_num(in->cert_chain); i++) {
344
+ if (!ssl_add_cert_to_cbb(&child, sk_X509_value(in->cert_chain, i))) {
355
345
  goto err;
356
346
  }
357
347
  }
358
348
  }
359
349
 
350
+ if (in->ticket_flags > 0) {
351
+ if (!CBB_add_asn1(&session, &child, kTicketFlagsTag) ||
352
+ !CBB_add_asn1_uint64(&child, in->ticket_flags)) {
353
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
354
+ goto err;
355
+ }
356
+ }
357
+
358
+ if (in->ticket_age_add_valid) {
359
+ if (!CBB_add_asn1(&session, &child, kTicketAgeAddTag) ||
360
+ !CBB_add_asn1(&child, &child2, CBS_ASN1_OCTETSTRING) ||
361
+ !CBB_add_u32(&child2, in->ticket_age_add)) {
362
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
363
+ goto err;
364
+ }
365
+ }
366
+
360
367
  if (!CBB_finish(&cbb, out_data, out_len)) {
361
368
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
362
369
  goto err;
@@ -370,6 +377,22 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, uint8_t **out_data,
370
377
 
371
378
  int SSL_SESSION_to_bytes(const SSL_SESSION *in, uint8_t **out_data,
372
379
  size_t *out_len) {
380
+ if (in->not_resumable) {
381
+ /* If the caller has an unresumable session, e.g. if |SSL_get_session| were
382
+ * called on a TLS 1.3 or False Started connection, serialize with a
383
+ * placeholder value so it is not accidentally deserialized into a resumable
384
+ * one. */
385
+ static const char kNotResumableSession[] = "NOT RESUMABLE";
386
+
387
+ *out_len = strlen(kNotResumableSession);
388
+ *out_data = BUF_memdup(kNotResumableSession, *out_len);
389
+ if (*out_data == NULL) {
390
+ return 0;
391
+ }
392
+
393
+ return 1;
394
+ }
395
+
373
396
  return SSL_SESSION_to_bytes_full(in, out_data, out_len, 0);
374
397
  }
375
398
 
@@ -520,12 +543,6 @@ static SSL_SESSION *SSL_SESSION_parse(CBS *cbs) {
520
543
  OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SSL_SESSION);
521
544
  goto err;
522
545
  }
523
- /* Only support SSLv3/TLS and DTLS. */
524
- if ((ssl_version >> 8) != SSL3_VERSION_MAJOR &&
525
- (ssl_version >> 8) != (DTLS1_VERSION >> 8)) {
526
- OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_SSL_VERSION);
527
- goto err;
528
- }
529
546
  ret->ssl_version = ssl_version;
530
547
 
531
548
  CBS cipher;
@@ -668,6 +685,19 @@ static SSL_SESSION *SSL_SESSION_parse(CBS *cbs) {
668
685
  }
669
686
  }
670
687
 
688
+ CBS age_add;
689
+ int age_add_present;
690
+ if (!SSL_SESSION_parse_u32(&session, &ret->ticket_flags,
691
+ kTicketFlagsTag, 0) ||
692
+ !CBS_get_optional_asn1_octet_string(&session, &age_add, &age_add_present,
693
+ kTicketAgeAddTag) ||
694
+ (age_add_present &&
695
+ !CBS_get_u32(&age_add, &ret->ticket_age_add)) ||
696
+ CBS_len(&age_add) != 0) {
697
+ goto err;
698
+ }
699
+ ret->ticket_age_add_valid = age_add_present;
700
+
671
701
  if (CBS_len(&session) != 0) {
672
702
  OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SSL_SESSION);
673
703
  goto err;
@@ -85,7 +85,7 @@ static int setup_read_buffer(SSL *ssl) {
85
85
 
86
86
  size_t header_len = ssl_record_prefix_len(ssl);
87
87
  size_t cap = SSL3_RT_MAX_ENCRYPTED_LENGTH;
88
- if (SSL_IS_DTLS(ssl)) {
88
+ if (SSL_is_dtls(ssl)) {
89
89
  cap += DTLS1_RT_HEADER_LENGTH;
90
90
  } else {
91
91
  cap += SSL3_RT_HEADER_LENGTH;
@@ -113,12 +113,11 @@ static int dtls_read_buffer_next_packet(SSL *ssl) {
113
113
  }
114
114
 
115
115
  /* Read a single packet from |ssl->rbio|. |buf->cap| must fit in an int. */
116
- ssl->rwstate = SSL_READING;
117
116
  int ret = BIO_read(ssl->rbio, buf->buf + buf->offset, (int)buf->cap);
118
117
  if (ret <= 0) {
118
+ ssl->rwstate = SSL_READING;
119
119
  return ret;
120
120
  }
121
- ssl->rwstate = SSL_NOTHING;
122
121
  /* |BIO_read| was bound by |buf->cap|, so this cannot overflow. */
123
122
  buf->len = (uint16_t)ret;
124
123
  return 1;
@@ -136,13 +135,12 @@ static int tls_read_buffer_extend_to(SSL *ssl, size_t len) {
136
135
  while (buf->len < len) {
137
136
  /* The amount of data to read is bounded by |buf->cap|, which must fit in an
138
137
  * int. */
139
- ssl->rwstate = SSL_READING;
140
138
  int ret = BIO_read(ssl->rbio, buf->buf + buf->offset + buf->len,
141
139
  (int)(len - buf->len));
142
140
  if (ret <= 0) {
141
+ ssl->rwstate = SSL_READING;
143
142
  return ret;
144
143
  }
145
- ssl->rwstate = SSL_NOTHING;
146
144
  /* |BIO_read| was bound by |buf->cap - buf->len|, so this cannot
147
145
  * overflow. */
148
146
  buf->len += (uint16_t)ret;
@@ -164,10 +162,8 @@ int ssl_read_buffer_extend_to(SSL *ssl, size_t len) {
164
162
  return -1;
165
163
  }
166
164
 
167
- ERR_clear_system_error();
168
-
169
165
  int ret;
170
- if (SSL_IS_DTLS(ssl)) {
166
+ if (SSL_is_dtls(ssl)) {
171
167
  /* |len| is ignored for a datagram transport. */
172
168
  ret = dtls_read_buffer_next_packet(ssl);
173
169
  } else {
@@ -186,14 +182,13 @@ void ssl_read_buffer_consume(SSL *ssl, size_t len) {
186
182
  SSL3_BUFFER *buf = &ssl->s3->read_buffer;
187
183
 
188
184
  consume_buffer(buf, len);
189
- if (!SSL_IS_DTLS(ssl)) {
190
- /* The TLS stack never reads beyond the current record, so there will never
191
- * be unconsumed data. If read-ahead is ever reimplemented,
192
- * |ssl_read_buffer_discard| will require a |memcpy| to shift the excess
193
- * back to the front of the buffer, to ensure there is enough space for the
194
- * next record. */
195
- assert(buf->len == 0);
196
- }
185
+
186
+ /* The TLS stack never reads beyond the current record, so there will never be
187
+ * unconsumed data. If read-ahead is ever reimplemented,
188
+ * |ssl_read_buffer_discard| will require a |memcpy| to shift the excess back
189
+ * to the front of the buffer, to ensure there is enough space for the next
190
+ * record. */
191
+ assert(SSL_is_dtls(ssl) || len == 0 || buf->len == 0);
197
192
  }
198
193
 
199
194
  void ssl_read_buffer_discard(SSL *ssl) {
@@ -229,12 +224,12 @@ int ssl_write_buffer_init(SSL *ssl, uint8_t **out_ptr, size_t max_len) {
229
224
  return 0;
230
225
  }
231
226
 
232
- size_t header_len = ssl_seal_prefix_len(ssl);
227
+ size_t header_len = ssl_seal_align_prefix_len(ssl);
233
228
 
234
229
  /* TODO(davidben): This matches the original behavior in keeping the malloc
235
230
  * size consistent. Does this matter? |cap| could just be |max_len|. */
236
231
  size_t cap = SSL3_RT_MAX_PLAIN_LENGTH + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD;
237
- if (SSL_IS_DTLS(ssl)) {
232
+ if (SSL_is_dtls(ssl)) {
238
233
  cap += DTLS1_RT_HEADER_LENGTH;
239
234
  } else {
240
235
  cap += SSL3_RT_HEADER_LENGTH;
@@ -268,12 +263,11 @@ static int tls_write_buffer_flush(SSL *ssl) {
268
263
  SSL3_BUFFER *buf = &ssl->s3->write_buffer;
269
264
 
270
265
  while (buf->len > 0) {
271
- ssl->rwstate = SSL_WRITING;
272
266
  int ret = BIO_write(ssl->wbio, buf->buf + buf->offset, buf->len);
273
267
  if (ret <= 0) {
268
+ ssl->rwstate = SSL_WRITING;
274
269
  return ret;
275
270
  }
276
- ssl->rwstate = SSL_NOTHING;
277
271
  consume_buffer(buf, (size_t)ret);
278
272
  }
279
273
  ssl_write_buffer_clear(ssl);
@@ -286,16 +280,15 @@ static int dtls_write_buffer_flush(SSL *ssl) {
286
280
  return 1;
287
281
  }
288
282
 
289
- ssl->rwstate = SSL_WRITING;
290
283
  int ret = BIO_write(ssl->wbio, buf->buf + buf->offset, buf->len);
291
284
  if (ret <= 0) {
285
+ ssl->rwstate = SSL_WRITING;
292
286
  /* If the write failed, drop the write buffer anyway. Datagram transports
293
287
  * can't write half a packet, so the caller is expected to retry from the
294
288
  * top. */
295
289
  ssl_write_buffer_clear(ssl);
296
290
  return ret;
297
291
  }
298
- ssl->rwstate = SSL_NOTHING;
299
292
  ssl_write_buffer_clear(ssl);
300
293
  return 1;
301
294
  }
@@ -305,9 +298,8 @@ int ssl_write_buffer_flush(SSL *ssl) {
305
298
  OPENSSL_PUT_ERROR(SSL, SSL_R_BIO_NOT_SET);
306
299
  return -1;
307
300
  }
308
- ERR_clear_system_error();
309
301
 
310
- if (SSL_IS_DTLS(ssl)) {
302
+ if (SSL_is_dtls(ssl)) {
311
303
  return dtls_write_buffer_flush(ssl);
312
304
  } else {
313
305
  return tls_write_buffer_flush(ssl);
@@ -114,6 +114,7 @@
114
114
 
115
115
  #include <openssl/ssl.h>
116
116
 
117
+ #include <assert.h>
117
118
  #include <string.h>
118
119
 
119
120
  #include <openssl/bn.h>
@@ -122,10 +123,10 @@
122
123
  #include <openssl/dh.h>
123
124
  #include <openssl/err.h>
124
125
  #include <openssl/mem.h>
126
+ #include <openssl/sha.h>
125
127
  #include <openssl/x509.h>
126
128
  #include <openssl/x509v3.h>
127
129
 
128
- #include "../crypto/dh/internal.h"
129
130
  #include "../crypto/internal.h"
130
131
  #include "internal.h"
131
132
 
@@ -157,6 +158,26 @@ CERT *ssl_cert_dup(CERT *cert) {
157
158
  }
158
159
  memset(ret, 0, sizeof(CERT));
159
160
 
161
+ if (cert->x509 != NULL) {
162
+ X509_up_ref(cert->x509);
163
+ ret->x509 = cert->x509;
164
+ }
165
+
166
+ if (cert->privatekey != NULL) {
167
+ EVP_PKEY_up_ref(cert->privatekey);
168
+ ret->privatekey = cert->privatekey;
169
+ }
170
+
171
+ if (cert->chain) {
172
+ ret->chain = X509_chain_up_ref(cert->chain);
173
+ if (!ret->chain) {
174
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
175
+ goto err;
176
+ }
177
+ }
178
+
179
+ ret->key_method = cert->key_method;
180
+
160
181
  ret->mask_k = cert->mask_k;
161
182
  ret->mask_a = cert->mask_a;
162
183
 
@@ -169,25 +190,23 @@ CERT *ssl_cert_dup(CERT *cert) {
169
190
  }
170
191
  ret->dh_tmp_cb = cert->dh_tmp_cb;
171
192
 
172
- if (cert->x509 != NULL) {
173
- ret->x509 = X509_up_ref(cert->x509);
174
- }
175
-
176
- if (cert->privatekey != NULL) {
177
- ret->privatekey = EVP_PKEY_up_ref(cert->privatekey);
178
- }
179
-
180
- if (cert->chain) {
181
- ret->chain = X509_chain_up_ref(cert->chain);
182
- if (!ret->chain) {
183
- OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
193
+ if (cert->sigalgs != NULL) {
194
+ ret->sigalgs =
195
+ BUF_memdup(cert->sigalgs, cert->num_sigalgs * sizeof(cert->sigalgs[0]));
196
+ if (ret->sigalgs == NULL) {
184
197
  goto err;
185
198
  }
186
199
  }
200
+ ret->num_sigalgs = cert->num_sigalgs;
187
201
 
188
202
  ret->cert_cb = cert->cert_cb;
189
203
  ret->cert_cb_arg = cert->cert_cb_arg;
190
204
 
205
+ if (cert->verify_store != NULL) {
206
+ X509_STORE_up_ref(cert->verify_store);
207
+ ret->verify_store = cert->verify_store;
208
+ }
209
+
191
210
  return ret;
192
211
 
193
212
  err:
@@ -218,8 +237,8 @@ void ssl_cert_free(CERT *c) {
218
237
  DH_free(c->dh_tmp);
219
238
 
220
239
  ssl_cert_clear_certs(c);
221
- OPENSSL_free(c->peer_sigalgs);
222
- OPENSSL_free(c->digest_nids);
240
+ OPENSSL_free(c->sigalgs);
241
+ X509_STORE_free(c->verify_store);
223
242
 
224
243
  OPENSSL_free(c);
225
244
  }
@@ -274,15 +293,21 @@ void ssl_cert_set_cert_cb(CERT *c, int (*cb)(SSL *ssl, void *arg), void *arg) {
274
293
  c->cert_cb_arg = arg;
275
294
  }
276
295
 
277
- int ssl_verify_cert_chain(SSL *ssl, STACK_OF(X509) *cert_chain) {
296
+ int ssl_verify_cert_chain(SSL *ssl, long *out_verify_result,
297
+ STACK_OF(X509) *cert_chain) {
278
298
  if (cert_chain == NULL || sk_X509_num(cert_chain) == 0) {
279
299
  return 0;
280
300
  }
281
301
 
302
+ X509_STORE *verify_store = ssl->ctx->cert_store;
303
+ if (ssl->cert->verify_store != NULL) {
304
+ verify_store = ssl->cert->verify_store;
305
+ }
306
+
282
307
  X509 *leaf = sk_X509_value(cert_chain, 0);
283
308
  int ret = 0;
284
309
  X509_STORE_CTX ctx;
285
- if (!X509_STORE_CTX_init(&ctx, ssl->ctx->cert_store, leaf, cert_chain)) {
310
+ if (!X509_STORE_CTX_init(&ctx, verify_store, leaf, cert_chain)) {
286
311
  OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
287
312
  return 0;
288
313
  }
@@ -303,13 +328,24 @@ int ssl_verify_cert_chain(SSL *ssl, STACK_OF(X509) *cert_chain) {
303
328
  X509_STORE_CTX_set_verify_cb(&ctx, ssl->verify_callback);
304
329
  }
305
330
 
331
+ int verify_ret;
306
332
  if (ssl->ctx->app_verify_callback != NULL) {
307
- ret = ssl->ctx->app_verify_callback(&ctx, ssl->ctx->app_verify_arg);
333
+ verify_ret = ssl->ctx->app_verify_callback(&ctx, ssl->ctx->app_verify_arg);
308
334
  } else {
309
- ret = X509_verify_cert(&ctx);
335
+ verify_ret = X509_verify_cert(&ctx);
336
+ }
337
+
338
+ *out_verify_result = ctx.error;
339
+
340
+ /* If |SSL_VERIFY_NONE|, the error is non-fatal, but we keep the result. */
341
+ if (verify_ret <= 0 && ssl->verify_mode != SSL_VERIFY_NONE) {
342
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, ssl_verify_alarm_type(ctx.error));
343
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CERTIFICATE_VERIFY_FAILED);
344
+ goto err;
310
345
  }
311
346
 
312
- ssl->verify_result = ctx.error;
347
+ ERR_clear_error();
348
+ ret = 1;
313
349
 
314
350
  err:
315
351
  X509_STORE_CTX_cleanup(&ctx);
@@ -328,8 +364,7 @@ STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list) {
328
364
  return NULL;
329
365
  }
330
366
 
331
- size_t i;
332
- for (i = 0; i < sk_X509_NAME_num(list); i++) {
367
+ for (size_t i = 0; i < sk_X509_NAME_num(list); i++) {
333
368
  X509_NAME *name = X509_NAME_dup(sk_X509_NAME_value(list, i));
334
369
  if (name == NULL || !sk_X509_NAME_push(ret, name)) {
335
370
  X509_NAME_free(name);
@@ -403,51 +438,114 @@ int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x509) {
403
438
  return add_client_CA(&ctx->client_CA, x509);
404
439
  }
405
440
 
406
- /* Add a certificate to a BUF_MEM structure */
407
- static int ssl_add_cert_to_buf(BUF_MEM *buf, unsigned long *l, X509 *x) {
408
- int n;
409
- uint8_t *p;
441
+ int ssl_has_certificate(const SSL *ssl) {
442
+ return ssl->cert->x509 != NULL && ssl_has_private_key(ssl);
443
+ }
410
444
 
411
- n = i2d_X509(x, NULL);
412
- if (!BUF_MEM_grow_clean(buf, (int)(n + (*l) + 3))) {
413
- OPENSSL_PUT_ERROR(SSL, ERR_R_BUF_LIB);
414
- return 0;
445
+ STACK_OF(X509) *ssl_parse_cert_chain(SSL *ssl, uint8_t *out_alert,
446
+ uint8_t *out_leaf_sha256, CBS *cbs) {
447
+ STACK_OF(X509) *ret = sk_X509_new_null();
448
+ if (ret == NULL) {
449
+ *out_alert = SSL_AD_INTERNAL_ERROR;
450
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
451
+ return NULL;
452
+ }
453
+
454
+ X509 *x = NULL;
455
+ CBS certificate_list;
456
+ if (!CBS_get_u24_length_prefixed(cbs, &certificate_list)) {
457
+ *out_alert = SSL_AD_DECODE_ERROR;
458
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
459
+ goto err;
415
460
  }
416
- p = (uint8_t *)&(buf->data[*l]);
417
- l2n3(n, p);
418
- i2d_X509(x, &p);
419
- *l += n + 3;
420
461
 
462
+ while (CBS_len(&certificate_list) > 0) {
463
+ CBS certificate;
464
+ if (!CBS_get_u24_length_prefixed(&certificate_list, &certificate)) {
465
+ *out_alert = SSL_AD_DECODE_ERROR;
466
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_LENGTH_MISMATCH);
467
+ goto err;
468
+ }
469
+
470
+ /* Retain the hash of the leaf certificate if requested. */
471
+ if (sk_X509_num(ret) == 0 && out_leaf_sha256 != NULL) {
472
+ SHA256(CBS_data(&certificate), CBS_len(&certificate), out_leaf_sha256);
473
+ }
474
+
475
+ /* A u24 length cannot overflow a long. */
476
+ const uint8_t *data = CBS_data(&certificate);
477
+ x = d2i_X509(NULL, &data, (long)CBS_len(&certificate));
478
+ if (x == NULL || data != CBS_data(&certificate) + CBS_len(&certificate)) {
479
+ *out_alert = SSL_AD_DECODE_ERROR;
480
+ goto err;
481
+ }
482
+ if (!sk_X509_push(ret, x)) {
483
+ *out_alert = SSL_AD_INTERNAL_ERROR;
484
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
485
+ goto err;
486
+ }
487
+ x = NULL;
488
+ }
489
+
490
+ return ret;
491
+
492
+ err:
493
+ X509_free(x);
494
+ sk_X509_pop_free(ret, X509_free);
495
+ return NULL;
496
+ }
497
+
498
+ int ssl_add_cert_to_cbb(CBB *cbb, X509 *x509) {
499
+ int len = i2d_X509(x509, NULL);
500
+ if (len < 0) {
501
+ return 0;
502
+ }
503
+ uint8_t *buf;
504
+ if (!CBB_add_space(cbb, &buf, len)) {
505
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
506
+ return 0;
507
+ }
508
+ if (buf != NULL && i2d_X509(x509, &buf) < 0) {
509
+ return 0;
510
+ }
421
511
  return 1;
422
512
  }
423
513
 
424
- /* Add certificate chain to internal SSL BUF_MEM structure. */
425
- int ssl_add_cert_chain(SSL *ssl, unsigned long *l) {
426
- CERT *cert = ssl->cert;
427
- BUF_MEM *buf = ssl->init_buf;
428
- int no_chain = 0;
429
- size_t i;
514
+ static int ssl_add_cert_with_length(CBB *cbb, X509 *x509) {
515
+ CBB child;
516
+ return CBB_add_u24_length_prefixed(cbb, &child) &&
517
+ ssl_add_cert_to_cbb(&child, x509) &&
518
+ CBB_flush(cbb);
519
+ }
520
+
521
+ int ssl_add_cert_chain(SSL *ssl, CBB *cbb) {
522
+ if (!ssl_has_certificate(ssl)) {
523
+ return CBB_add_u24(cbb, 0);
524
+ }
430
525
 
526
+ CERT *cert = ssl->cert;
431
527
  X509 *x = cert->x509;
432
- STACK_OF(X509) *chain = cert->chain;
433
528
 
434
- if (x == NULL) {
435
- OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CERTIFICATE_SET);
529
+ CBB child;
530
+ if (!CBB_add_u24_length_prefixed(cbb, &child)) {
531
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
436
532
  return 0;
437
533
  }
438
534
 
535
+ int no_chain = 0;
536
+ STACK_OF(X509) *chain = cert->chain;
439
537
  if ((ssl->mode & SSL_MODE_NO_AUTO_CHAIN) || chain != NULL) {
440
538
  no_chain = 1;
441
539
  }
442
540
 
443
541
  if (no_chain) {
444
- if (!ssl_add_cert_to_buf(buf, l, x)) {
542
+ if (!ssl_add_cert_with_length(&child, x)) {
445
543
  return 0;
446
544
  }
447
545
 
448
- for (i = 0; i < sk_X509_num(chain); i++) {
546
+ for (size_t i = 0; i < sk_X509_num(chain); i++) {
449
547
  x = sk_X509_value(chain, i);
450
- if (!ssl_add_cert_to_buf(buf, l, x)) {
548
+ if (!ssl_add_cert_with_length(&child, x)) {
451
549
  return 0;
452
550
  }
453
551
  }
@@ -461,10 +559,10 @@ int ssl_add_cert_chain(SSL *ssl, unsigned long *l) {
461
559
  X509_verify_cert(&xs_ctx);
462
560
  /* Don't leave errors in the queue */
463
561
  ERR_clear_error();
464
- for (i = 0; i < sk_X509_num(xs_ctx.chain); i++) {
465
- x = sk_X509_value(xs_ctx.chain, i);
466
562
 
467
- if (!ssl_add_cert_to_buf(buf, l, x)) {
563
+ for (size_t i = 0; i < sk_X509_num(xs_ctx.chain); i++) {
564
+ x = sk_X509_value(xs_ctx.chain, i);
565
+ if (!ssl_add_cert_with_length(&child, x)) {
468
566
  X509_STORE_CTX_cleanup(&xs_ctx);
469
567
  return 0;
470
568
  }
@@ -472,9 +570,146 @@ int ssl_add_cert_chain(SSL *ssl, unsigned long *l) {
472
570
  X509_STORE_CTX_cleanup(&xs_ctx);
473
571
  }
474
572
 
573
+ return CBB_flush(cbb);
574
+ }
575
+
576
+ static int ca_dn_cmp(const X509_NAME **a, const X509_NAME **b) {
577
+ return X509_NAME_cmp(*a, *b);
578
+ }
579
+
580
+ STACK_OF(X509_NAME) *
581
+ ssl_parse_client_CA_list(SSL *ssl, uint8_t *out_alert, CBS *cbs) {
582
+ STACK_OF(X509_NAME) *ret = sk_X509_NAME_new(ca_dn_cmp);
583
+ X509_NAME *name = NULL;
584
+ if (ret == NULL) {
585
+ *out_alert = SSL_AD_INTERNAL_ERROR;
586
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
587
+ return NULL;
588
+ }
589
+
590
+ CBS child;
591
+ if (!CBS_get_u16_length_prefixed(cbs, &child)) {
592
+ *out_alert = SSL_AD_DECODE_ERROR;
593
+ OPENSSL_PUT_ERROR(SSL, SSL_R_LENGTH_MISMATCH);
594
+ goto err;
595
+ }
596
+
597
+ while (CBS_len(&child) > 0) {
598
+ CBS distinguished_name;
599
+ if (!CBS_get_u16_length_prefixed(&child, &distinguished_name)) {
600
+ *out_alert = SSL_AD_DECODE_ERROR;
601
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CA_DN_TOO_LONG);
602
+ goto err;
603
+ }
604
+
605
+ const uint8_t *ptr = CBS_data(&distinguished_name);
606
+ /* A u16 length cannot overflow a long. */
607
+ name = d2i_X509_NAME(NULL, &ptr, (long)CBS_len(&distinguished_name));
608
+ if (name == NULL ||
609
+ ptr != CBS_data(&distinguished_name) + CBS_len(&distinguished_name)) {
610
+ *out_alert = SSL_AD_DECODE_ERROR;
611
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
612
+ goto err;
613
+ }
614
+
615
+ if (!sk_X509_NAME_push(ret, name)) {
616
+ *out_alert = SSL_AD_INTERNAL_ERROR;
617
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
618
+ goto err;
619
+ }
620
+ name = NULL;
621
+ }
622
+
623
+ return ret;
624
+
625
+ err:
626
+ X509_NAME_free(name);
627
+ sk_X509_NAME_pop_free(ret, X509_NAME_free);
628
+ return NULL;
629
+ }
630
+
631
+ int ssl_add_client_CA_list(SSL *ssl, CBB *cbb) {
632
+ CBB child, name_cbb;
633
+ if (!CBB_add_u16_length_prefixed(cbb, &child)) {
634
+ return 0;
635
+ }
636
+
637
+ STACK_OF(X509_NAME) *sk = SSL_get_client_CA_list(ssl);
638
+ if (sk == NULL) {
639
+ return CBB_flush(cbb);
640
+ }
641
+
642
+ for (size_t i = 0; i < sk_X509_NAME_num(sk); i++) {
643
+ X509_NAME *name = sk_X509_NAME_value(sk, i);
644
+ int len = i2d_X509_NAME(name, NULL);
645
+ if (len < 0) {
646
+ return 0;
647
+ }
648
+ uint8_t *ptr;
649
+ if (!CBB_add_u16_length_prefixed(&child, &name_cbb) ||
650
+ !CBB_add_space(&name_cbb, &ptr, (size_t)len) ||
651
+ (len > 0 && i2d_X509_NAME(name, &ptr) < 0)) {
652
+ return 0;
653
+ }
654
+ }
655
+
656
+ return CBB_flush(cbb);
657
+ }
658
+
659
+ int ssl_do_client_cert_cb(SSL *ssl, int *out_should_retry) {
660
+ if (ssl_has_certificate(ssl) || ssl->ctx->client_cert_cb == NULL) {
661
+ return 1;
662
+ }
663
+
664
+ X509 *x509 = NULL;
665
+ EVP_PKEY *pkey = NULL;
666
+ int ret = ssl->ctx->client_cert_cb(ssl, &x509, &pkey);
667
+ if (ret < 0) {
668
+ *out_should_retry = 1;
669
+ return 0;
670
+ }
671
+
672
+ if (ret != 0) {
673
+ if (!SSL_use_certificate(ssl, x509) ||
674
+ !SSL_use_PrivateKey(ssl, pkey)) {
675
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
676
+ *out_should_retry = 0;
677
+ return 0;
678
+ }
679
+ }
680
+
681
+ X509_free(x509);
682
+ EVP_PKEY_free(pkey);
683
+ return 1;
684
+ }
685
+
686
+ static int set_cert_store(X509_STORE **store_ptr, X509_STORE *new_store, int take_ref) {
687
+ X509_STORE_free(*store_ptr);
688
+ *store_ptr = new_store;
689
+
690
+ if (new_store != NULL && take_ref) {
691
+ X509_STORE_up_ref(new_store);
692
+ }
693
+
475
694
  return 1;
476
695
  }
477
696
 
697
+ int SSL_CTX_set0_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
698
+ return set_cert_store(&ctx->cert->verify_store, store, 0);
699
+ }
700
+
701
+ int SSL_CTX_set1_verify_cert_store(SSL_CTX *ctx, X509_STORE *store) {
702
+ return set_cert_store(&ctx->cert->verify_store, store, 1);
703
+ }
704
+
705
+ int SSL_set0_verify_cert_store(SSL *ssl, X509_STORE *store) {
706
+ return set_cert_store(&ssl->cert->verify_store, store, 0);
707
+ }
708
+
709
+ int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store) {
710
+ return set_cert_store(&ssl->cert->verify_store, store, 1);
711
+ }
712
+
478
713
  int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
479
714
  return ssl_cert_set0_chain(ctx->cert, chain);
480
715
  }
@@ -537,3 +772,43 @@ int SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain) {
537
772
  *out_chain = ssl->cert->chain;
538
773
  return 1;
539
774
  }
775
+
776
+ int ssl_check_leaf_certificate(SSL *ssl, X509 *leaf) {
777
+ int ret = 0;
778
+ EVP_PKEY *pkey = X509_get_pubkey(leaf);
779
+ if (pkey == NULL) {
780
+ goto err;
781
+ }
782
+
783
+ /* Check the certificate's type matches the cipher. */
784
+ const SSL_CIPHER *cipher = ssl->s3->tmp.new_cipher;
785
+ int expected_type = ssl_cipher_get_key_type(cipher);
786
+ assert(expected_type != EVP_PKEY_NONE);
787
+ if (pkey->type != expected_type) {
788
+ OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CERTIFICATE_TYPE);
789
+ goto err;
790
+ }
791
+
792
+ if (cipher->algorithm_auth & SSL_aECDSA) {
793
+ /* TODO(davidben): This behavior is preserved from upstream. Should key
794
+ * usages be checked in other cases as well? */
795
+ /* This call populates the ex_flags field correctly */
796
+ X509_check_purpose(leaf, -1, 0);
797
+ if ((leaf->ex_flags & EXFLAG_KUSAGE) &&
798
+ !(leaf->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE)) {
799
+ OPENSSL_PUT_ERROR(SSL, SSL_R_ECC_CERT_NOT_FOR_SIGNING);
800
+ goto err;
801
+ }
802
+
803
+ if (!tls1_check_ec_cert(ssl, leaf)) {
804
+ OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECC_CERT);
805
+ goto err;
806
+ }
807
+ }
808
+
809
+ ret = 1;
810
+
811
+ err:
812
+ EVP_PKEY_free(pkey);
813
+ return ret;
814
+ }