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
@@ -0,0 +1,440 @@
1
+ /* Copyright (c) 2016, Google Inc.
2
+ *
3
+ * Permission to use, copy, modify, and/or distribute this software for any
4
+ * purpose with or without fee is hereby granted, provided that the above
5
+ * copyright notice and this permission notice appear in all copies.
6
+ *
7
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
+
15
+ #include <openssl/ssl.h>
16
+
17
+ #include <assert.h>
18
+ #include <string.h>
19
+
20
+ #include <openssl/bytestring.h>
21
+ #include <openssl/err.h>
22
+ #include <openssl/hkdf.h>
23
+ #include <openssl/mem.h>
24
+ #include <openssl/stack.h>
25
+ #include <openssl/x509.h>
26
+ #include <openssl/x509v3.h>
27
+
28
+ #include "internal.h"
29
+
30
+
31
+ /* kMaxKeyUpdates is the number of consecutive KeyUpdates that will be
32
+ * processed. Without this limit an attacker could force unbounded processing
33
+ * without being able to return application data. */
34
+ static const uint8_t kMaxKeyUpdates = 32;
35
+
36
+ int tls13_handshake(SSL *ssl) {
37
+ SSL_HANDSHAKE *hs = ssl->s3->hs;
38
+
39
+ for (;;) {
40
+ /* Resolve the operation the handshake was waiting on. */
41
+ switch (hs->wait) {
42
+ case ssl_hs_error:
43
+ OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
44
+ return -1;
45
+
46
+ case ssl_hs_flush:
47
+ case ssl_hs_flush_and_read_message: {
48
+ int ret = BIO_flush(ssl->wbio);
49
+ if (ret <= 0) {
50
+ ssl->rwstate = SSL_WRITING;
51
+ return ret;
52
+ }
53
+ if (hs->wait != ssl_hs_flush_and_read_message) {
54
+ break;
55
+ }
56
+ ssl->method->expect_flight(ssl);
57
+ hs->wait = ssl_hs_read_message;
58
+ /* Fall-through. */
59
+ }
60
+
61
+ case ssl_hs_read_message: {
62
+ int ret = ssl->method->ssl_get_message(ssl, -1, ssl_dont_hash_message);
63
+ if (ret <= 0) {
64
+ return ret;
65
+ }
66
+ break;
67
+ }
68
+
69
+ case ssl_hs_write_message: {
70
+ int ret = ssl->method->write_message(ssl);
71
+ if (ret <= 0) {
72
+ return ret;
73
+ }
74
+ break;
75
+ }
76
+
77
+ case ssl_hs_x509_lookup:
78
+ ssl->rwstate = SSL_X509_LOOKUP;
79
+ hs->wait = ssl_hs_ok;
80
+ return -1;
81
+
82
+ case ssl_hs_private_key_operation:
83
+ ssl->rwstate = SSL_PRIVATE_KEY_OPERATION;
84
+ hs->wait = ssl_hs_ok;
85
+ return -1;
86
+
87
+ case ssl_hs_ok:
88
+ break;
89
+ }
90
+
91
+ /* Run the state machine again. */
92
+ hs->wait = hs->do_handshake(ssl);
93
+ if (hs->wait == ssl_hs_error) {
94
+ /* Don't loop around to avoid a stray |SSL_R_SSL_HANDSHAKE_FAILURE| the
95
+ * first time around. */
96
+ return -1;
97
+ }
98
+ if (hs->wait == ssl_hs_ok) {
99
+ /* The handshake has completed. */
100
+ return 1;
101
+ }
102
+
103
+ /* Otherwise, loop to the beginning and resolve what was blocking the
104
+ * handshake. */
105
+ }
106
+ }
107
+
108
+ static int tls13_get_cert_verify_signature_input(SSL *ssl, uint8_t **out,
109
+ size_t *out_len, int server) {
110
+ CBB cbb;
111
+ if (!CBB_init(&cbb, 64 + 33 + 1 + 2 * EVP_MAX_MD_SIZE)) {
112
+ goto err;
113
+ }
114
+
115
+ for (size_t i = 0; i < 64; i++) {
116
+ if (!CBB_add_u8(&cbb, 0x20)) {
117
+ goto err;
118
+ }
119
+ }
120
+
121
+ if (server) {
122
+ /* Include the NUL byte. */
123
+ static const char kContext[] = "TLS 1.3, server CertificateVerify";
124
+ if (!CBB_add_bytes(&cbb, (const uint8_t *)kContext, sizeof(kContext))) {
125
+ goto err;
126
+ }
127
+ } else {
128
+ static const char kContext[] = "TLS 1.3, client CertificateVerify";
129
+ if (!CBB_add_bytes(&cbb, (const uint8_t *)kContext, sizeof(kContext))) {
130
+ goto err;
131
+ }
132
+ }
133
+
134
+ uint8_t context_hashes[2 * EVP_MAX_MD_SIZE];
135
+ size_t context_hashes_len;
136
+ if (!tls13_get_context_hashes(ssl, context_hashes, &context_hashes_len) ||
137
+ !CBB_add_bytes(&cbb, context_hashes, context_hashes_len) ||
138
+ !CBB_finish(&cbb, out, out_len)) {
139
+ goto err;
140
+ }
141
+
142
+ return 1;
143
+
144
+ err:
145
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
146
+ CBB_cleanup(&cbb);
147
+ return 0;
148
+ }
149
+
150
+ int tls13_process_certificate(SSL *ssl, int allow_anonymous) {
151
+ CBS cbs, context;
152
+ CBS_init(&cbs, ssl->init_msg, ssl->init_num);
153
+ if (!CBS_get_u8_length_prefixed(&cbs, &context) ||
154
+ CBS_len(&context) != 0) {
155
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
156
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
157
+ return 0;
158
+ }
159
+
160
+ const int retain_sha256 =
161
+ ssl->server && ssl->ctx->retain_only_sha256_of_client_certs;
162
+ int ret = 0;
163
+ uint8_t alert;
164
+ STACK_OF(X509) *chain = ssl_parse_cert_chain(
165
+ ssl, &alert, retain_sha256 ? ssl->s3->new_session->peer_sha256 : NULL,
166
+ &cbs);
167
+ if (chain == NULL) {
168
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
169
+ goto err;
170
+ }
171
+
172
+ if (CBS_len(&cbs) != 0) {
173
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
174
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
175
+ goto err;
176
+ }
177
+
178
+ if (sk_X509_num(chain) == 0) {
179
+ if (!allow_anonymous) {
180
+ OPENSSL_PUT_ERROR(SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
181
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
182
+ goto err;
183
+ }
184
+
185
+ /* OpenSSL returns X509_V_OK when no certificates are requested. This is
186
+ * classed by them as a bug, but it's assumed by at least NGINX. */
187
+ ssl->s3->new_session->verify_result = X509_V_OK;
188
+
189
+ /* No certificate, so nothing more to do. */
190
+ ret = 1;
191
+ goto err;
192
+ }
193
+
194
+ ssl->s3->new_session->peer_sha256_valid = retain_sha256;
195
+
196
+ if (!ssl_verify_cert_chain(ssl, &ssl->s3->new_session->verify_result,
197
+ chain)) {
198
+ goto err;
199
+ }
200
+
201
+ X509_free(ssl->s3->new_session->peer);
202
+ X509 *leaf = sk_X509_value(chain, 0);
203
+ X509_up_ref(leaf);
204
+ ssl->s3->new_session->peer = leaf;
205
+
206
+ sk_X509_pop_free(ssl->s3->new_session->cert_chain, X509_free);
207
+ ssl->s3->new_session->cert_chain = chain;
208
+ chain = NULL;
209
+
210
+ ret = 1;
211
+
212
+ err:
213
+ sk_X509_pop_free(chain, X509_free);
214
+ return ret;
215
+ }
216
+
217
+ int tls13_process_certificate_verify(SSL *ssl) {
218
+ int ret = 0;
219
+ X509 *peer = ssl->s3->new_session->peer;
220
+ EVP_PKEY *pkey = NULL;
221
+ uint8_t *msg = NULL;
222
+ size_t msg_len;
223
+
224
+ /* Filter out unsupported certificate types. */
225
+ pkey = X509_get_pubkey(peer);
226
+ if (pkey == NULL) {
227
+ goto err;
228
+ }
229
+
230
+ CBS cbs, signature;
231
+ uint16_t signature_algorithm;
232
+ CBS_init(&cbs, ssl->init_msg, ssl->init_num);
233
+ if (!CBS_get_u16(&cbs, &signature_algorithm) ||
234
+ !CBS_get_u16_length_prefixed(&cbs, &signature) ||
235
+ CBS_len(&cbs) != 0) {
236
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
237
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
238
+ goto err;
239
+ }
240
+
241
+ int al;
242
+ if (!tls12_check_peer_sigalg(ssl, &al, signature_algorithm)) {
243
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
244
+ goto err;
245
+ }
246
+ ssl->s3->tmp.peer_signature_algorithm = signature_algorithm;
247
+
248
+ if (!tls13_get_cert_verify_signature_input(ssl, &msg, &msg_len,
249
+ !ssl->server)) {
250
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
251
+ goto err;
252
+ }
253
+
254
+ int sig_ok =
255
+ ssl_public_key_verify(ssl, CBS_data(&signature), CBS_len(&signature),
256
+ signature_algorithm, pkey, msg, msg_len);
257
+ #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
258
+ sig_ok = 1;
259
+ ERR_clear_error();
260
+ #endif
261
+ if (!sig_ok) {
262
+ OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_SIGNATURE);
263
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
264
+ goto err;
265
+ }
266
+
267
+ ret = 1;
268
+
269
+ err:
270
+ EVP_PKEY_free(pkey);
271
+ OPENSSL_free(msg);
272
+ return ret;
273
+ }
274
+
275
+ int tls13_check_message_type(SSL *ssl, int type) {
276
+ if (ssl->s3->tmp.message_type != type) {
277
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
278
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
279
+ ERR_add_error_dataf("got type %d, wanted type %d",
280
+ ssl->s3->tmp.message_type, type);
281
+ return 0;
282
+ }
283
+
284
+ return 1;
285
+ }
286
+
287
+ int tls13_process_finished(SSL *ssl) {
288
+ uint8_t verify_data[EVP_MAX_MD_SIZE];
289
+ size_t verify_data_len;
290
+ if (!tls13_finished_mac(ssl, verify_data, &verify_data_len, !ssl->server)) {
291
+ return 0;
292
+ }
293
+
294
+ int finished_ok =
295
+ ssl->init_num == verify_data_len &&
296
+ CRYPTO_memcmp(verify_data, ssl->init_msg, verify_data_len) == 0;
297
+ #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
298
+ finished_ok = 1;
299
+ #endif
300
+ if (!finished_ok) {
301
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECRYPT_ERROR);
302
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
303
+ return 0;
304
+ }
305
+
306
+ return 1;
307
+ }
308
+
309
+ int tls13_prepare_certificate(SSL *ssl) {
310
+ CBB cbb, body;
311
+ if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_CERTIFICATE) ||
312
+ /* The request context is always empty in the handshake. */
313
+ !CBB_add_u8(&body, 0) ||
314
+ !ssl_add_cert_chain(ssl, &body) ||
315
+ !ssl->method->finish_message(ssl, &cbb)) {
316
+ CBB_cleanup(&cbb);
317
+ return 0;
318
+ }
319
+
320
+ return 1;
321
+ }
322
+
323
+ enum ssl_private_key_result_t tls13_prepare_certificate_verify(
324
+ SSL *ssl, int is_first_run) {
325
+ enum ssl_private_key_result_t ret = ssl_private_key_failure;
326
+ uint8_t *msg = NULL;
327
+ size_t msg_len;
328
+ CBB cbb, body;
329
+ CBB_zero(&cbb);
330
+
331
+ uint16_t signature_algorithm;
332
+ if (!tls1_choose_signature_algorithm(ssl, &signature_algorithm)) {
333
+ goto err;
334
+ }
335
+ if (!ssl->method->init_message(ssl, &cbb, &body,
336
+ SSL3_MT_CERTIFICATE_VERIFY) ||
337
+ !CBB_add_u16(&body, signature_algorithm)) {
338
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
339
+ goto err;
340
+ }
341
+
342
+ /* Sign the digest. */
343
+ CBB child;
344
+ const size_t max_sig_len = ssl_private_key_max_signature_len(ssl);
345
+ uint8_t *sig;
346
+ size_t sig_len;
347
+ if (!CBB_add_u16_length_prefixed(&body, &child) ||
348
+ !CBB_reserve(&child, &sig, max_sig_len)) {
349
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
350
+ goto err;
351
+ }
352
+
353
+ enum ssl_private_key_result_t sign_result;
354
+ if (is_first_run) {
355
+ if (!tls13_get_cert_verify_signature_input(ssl, &msg, &msg_len,
356
+ ssl->server)) {
357
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
358
+ goto err;
359
+ }
360
+ sign_result = ssl_private_key_sign(ssl, sig, &sig_len, max_sig_len,
361
+ signature_algorithm, msg, msg_len);
362
+ } else {
363
+ sign_result = ssl_private_key_complete(ssl, sig, &sig_len, max_sig_len);
364
+ }
365
+
366
+ if (sign_result != ssl_private_key_success) {
367
+ ret = sign_result;
368
+ goto err;
369
+ }
370
+
371
+ if (!CBB_did_write(&child, sig_len) ||
372
+ !ssl->method->finish_message(ssl, &cbb)) {
373
+ goto err;
374
+ }
375
+
376
+ ret = ssl_private_key_success;
377
+
378
+ err:
379
+ CBB_cleanup(&cbb);
380
+ OPENSSL_free(msg);
381
+ return ret;
382
+ }
383
+
384
+ int tls13_prepare_finished(SSL *ssl) {
385
+ size_t verify_data_len;
386
+ uint8_t verify_data[EVP_MAX_MD_SIZE];
387
+
388
+ if (!tls13_finished_mac(ssl, verify_data, &verify_data_len, ssl->server)) {
389
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
390
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DIGEST_CHECK_FAILED);
391
+ return 0;
392
+ }
393
+
394
+ CBB cbb, body;
395
+ if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_FINISHED) ||
396
+ !CBB_add_bytes(&body, verify_data, verify_data_len) ||
397
+ !ssl->method->finish_message(ssl, &cbb)) {
398
+ CBB_cleanup(&cbb);
399
+ return 0;
400
+ }
401
+
402
+ return 1;
403
+ }
404
+
405
+ static int tls13_receive_key_update(SSL *ssl) {
406
+ if (ssl->init_num != 0) {
407
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
408
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
409
+ return 0;
410
+ }
411
+
412
+ // TODO(svaldez): Send KeyUpdate.
413
+ return tls13_rotate_traffic_key(ssl, evp_aead_open);
414
+ }
415
+
416
+ int tls13_post_handshake(SSL *ssl) {
417
+ if (ssl->s3->tmp.message_type == SSL3_MT_KEY_UPDATE) {
418
+ ssl->s3->key_update_count++;
419
+ if (ssl->s3->key_update_count > kMaxKeyUpdates) {
420
+ OPENSSL_PUT_ERROR(SSL, SSL_R_TOO_MANY_KEY_UPDATES);
421
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
422
+ return 0;
423
+ }
424
+
425
+ return tls13_receive_key_update(ssl);
426
+ }
427
+
428
+ ssl->s3->key_update_count = 0;
429
+
430
+ if (ssl->s3->tmp.message_type == SSL3_MT_NEW_SESSION_TICKET &&
431
+ !ssl->server) {
432
+ return tls13_process_new_session_ticket(ssl);
433
+ }
434
+
435
+ // TODO(svaldez): Handle post-handshake authentication.
436
+
437
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
438
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
439
+ return 0;
440
+ }
@@ -0,0 +1,682 @@
1
+ /* Copyright (c) 2016, Google Inc.
2
+ *
3
+ * Permission to use, copy, modify, and/or distribute this software for any
4
+ * purpose with or without fee is hereby granted, provided that the above
5
+ * copyright notice and this permission notice appear in all copies.
6
+ *
7
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
+
15
+ #include <openssl/ssl.h>
16
+
17
+ #include <assert.h>
18
+ #include <string.h>
19
+
20
+ #include <openssl/bytestring.h>
21
+ #include <openssl/digest.h>
22
+ #include <openssl/err.h>
23
+ #include <openssl/mem.h>
24
+ #include <openssl/stack.h>
25
+ #include <openssl/x509.h>
26
+
27
+ #include "internal.h"
28
+
29
+
30
+ enum client_hs_state_t {
31
+ state_process_hello_retry_request = 0,
32
+ state_send_second_client_hello,
33
+ state_flush_second_client_hello,
34
+ state_process_server_hello,
35
+ state_process_encrypted_extensions,
36
+ state_process_certificate_request,
37
+ state_process_server_certificate,
38
+ state_process_server_certificate_verify,
39
+ state_process_server_finished,
40
+ state_certificate_callback,
41
+ state_send_client_certificate,
42
+ state_send_client_certificate_verify,
43
+ state_complete_client_certificate_verify,
44
+ state_send_client_finished,
45
+ state_flush,
46
+ state_done,
47
+ };
48
+
49
+ static enum ssl_hs_wait_t do_process_hello_retry_request(SSL *ssl,
50
+ SSL_HANDSHAKE *hs) {
51
+ if (ssl->s3->tmp.message_type != SSL3_MT_HELLO_RETRY_REQUEST) {
52
+ hs->state = state_process_server_hello;
53
+ return ssl_hs_ok;
54
+ }
55
+
56
+ CBS cbs, extensions;
57
+ uint16_t server_wire_version, cipher_suite, group_id;
58
+ CBS_init(&cbs, ssl->init_msg, ssl->init_num);
59
+ if (!CBS_get_u16(&cbs, &server_wire_version) ||
60
+ !CBS_get_u16(&cbs, &cipher_suite) ||
61
+ !CBS_get_u16(&cbs, &group_id) ||
62
+ /* We do not currently parse any HelloRetryRequest extensions. */
63
+ !CBS_get_u16_length_prefixed(&cbs, &extensions) ||
64
+ CBS_len(&cbs) != 0) {
65
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
66
+ return ssl_hs_error;
67
+ }
68
+
69
+ /* TODO(svaldez): Don't do early_data on HelloRetryRequest. */
70
+
71
+ const uint16_t *groups;
72
+ size_t groups_len;
73
+ tls1_get_grouplist(ssl, 0 /* local groups */, &groups, &groups_len);
74
+ int found = 0;
75
+ for (size_t i = 0; i < groups_len; i++) {
76
+ if (groups[i] == group_id) {
77
+ found = 1;
78
+ break;
79
+ }
80
+ }
81
+
82
+ if (!found) {
83
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
84
+ OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
85
+ return ssl_hs_error;
86
+ }
87
+
88
+ /* Check that the HelloRetryRequest does not request the key share that was
89
+ * provided in the initial ClientHello. */
90
+ if (SSL_ECDH_CTX_get_id(&ssl->s3->hs->ecdh_ctx) == group_id) {
91
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
92
+ OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CURVE);
93
+ return ssl_hs_error;
94
+ }
95
+
96
+ SSL_ECDH_CTX_cleanup(&ssl->s3->hs->ecdh_ctx);
97
+ ssl->s3->hs->retry_group = group_id;
98
+
99
+ hs->state = state_send_second_client_hello;
100
+ return ssl_hs_ok;
101
+ }
102
+
103
+ static enum ssl_hs_wait_t do_send_second_client_hello(SSL *ssl,
104
+ SSL_HANDSHAKE *hs) {
105
+ CBB cbb, body;
106
+ if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_CLIENT_HELLO) ||
107
+ !ssl_add_client_hello_body(ssl, &body) ||
108
+ !ssl->method->finish_message(ssl, &cbb)) {
109
+ CBB_cleanup(&cbb);
110
+ return ssl_hs_error;
111
+ }
112
+
113
+ hs->state = state_flush_second_client_hello;
114
+ return ssl_hs_write_message;
115
+ }
116
+
117
+ static enum ssl_hs_wait_t do_flush_second_client_hello(SSL *ssl,
118
+ SSL_HANDSHAKE *hs) {
119
+ hs->state = state_process_server_hello;
120
+ return ssl_hs_flush_and_read_message;
121
+ }
122
+
123
+ static enum ssl_hs_wait_t do_process_server_hello(SSL *ssl, SSL_HANDSHAKE *hs) {
124
+ if (!tls13_check_message_type(ssl, SSL3_MT_SERVER_HELLO)) {
125
+ return ssl_hs_error;
126
+ }
127
+
128
+ CBS cbs, server_random, extensions;
129
+ uint16_t server_wire_version;
130
+ uint16_t cipher_suite;
131
+ CBS_init(&cbs, ssl->init_msg, ssl->init_num);
132
+ if (!CBS_get_u16(&cbs, &server_wire_version) ||
133
+ !CBS_get_bytes(&cbs, &server_random, SSL3_RANDOM_SIZE) ||
134
+ !CBS_get_u16(&cbs, &cipher_suite) ||
135
+ !CBS_get_u16_length_prefixed(&cbs, &extensions) ||
136
+ CBS_len(&cbs) != 0) {
137
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
138
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
139
+ return ssl_hs_error;
140
+ }
141
+
142
+ if (server_wire_version != ssl->version) {
143
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
144
+ OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_VERSION_NUMBER);
145
+ return ssl_hs_error;
146
+ }
147
+
148
+ /* Parse out the extensions. */
149
+ int have_key_share = 0, have_pre_shared_key = 0;
150
+ CBS key_share, pre_shared_key;
151
+ while (CBS_len(&extensions) != 0) {
152
+ uint16_t type;
153
+ CBS extension;
154
+ if (!CBS_get_u16(&extensions, &type) ||
155
+ !CBS_get_u16_length_prefixed(&extensions, &extension)) {
156
+ OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
157
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
158
+ return ssl_hs_error;
159
+ }
160
+
161
+ switch (type) {
162
+ case TLSEXT_TYPE_key_share:
163
+ if (have_key_share) {
164
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DUPLICATE_EXTENSION);
165
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
166
+ return ssl_hs_error;
167
+ }
168
+ key_share = extension;
169
+ have_key_share = 1;
170
+ break;
171
+ case TLSEXT_TYPE_pre_shared_key:
172
+ if (have_pre_shared_key) {
173
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DUPLICATE_EXTENSION);
174
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
175
+ return ssl_hs_error;
176
+ }
177
+ pre_shared_key = extension;
178
+ have_pre_shared_key = 1;
179
+ break;
180
+ default:
181
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
182
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNSUPPORTED_EXTENSION);
183
+ return ssl_hs_error;
184
+ }
185
+ }
186
+
187
+ assert(ssl->s3->have_version);
188
+ memcpy(ssl->s3->server_random, CBS_data(&server_random), SSL3_RANDOM_SIZE);
189
+
190
+ uint8_t alert = SSL_AD_DECODE_ERROR;
191
+ if (have_pre_shared_key) {
192
+ if (ssl->session == NULL) {
193
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
194
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNSUPPORTED_EXTENSION);
195
+ return ssl_hs_error;
196
+ }
197
+
198
+ if (!ssl_ext_pre_shared_key_parse_serverhello(ssl, &alert,
199
+ &pre_shared_key)) {
200
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
201
+ return ssl_hs_error;
202
+ }
203
+
204
+ if (ssl->session->ssl_version != ssl->version) {
205
+ OPENSSL_PUT_ERROR(SSL, SSL_R_OLD_SESSION_VERSION_NOT_RETURNED);
206
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
207
+ return ssl_hs_error;
208
+ }
209
+
210
+ if (!ssl_session_is_context_valid(ssl, ssl->session)) {
211
+ /* This is actually a client application bug. */
212
+ OPENSSL_PUT_ERROR(SSL,
213
+ SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
214
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
215
+ return ssl_hs_error;
216
+ }
217
+
218
+ ssl->s3->session_reused = 1;
219
+ /* Only authentication information carries over in TLS 1.3. */
220
+ ssl->s3->new_session =
221
+ SSL_SESSION_dup(ssl->session, SSL_SESSION_DUP_AUTH_ONLY);
222
+ if (ssl->s3->new_session == NULL) {
223
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
224
+ return ssl_hs_error;
225
+ }
226
+ ssl_set_session(ssl, NULL);
227
+ } else {
228
+ if (!ssl_get_new_session(ssl, 0)) {
229
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
230
+ return ssl_hs_error;
231
+ }
232
+ }
233
+
234
+ const SSL_CIPHER *cipher = SSL_get_cipher_by_value(cipher_suite);
235
+ if (cipher == NULL) {
236
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CIPHER_RETURNED);
237
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
238
+ return ssl_hs_error;
239
+ }
240
+
241
+ if (!ssl->s3->session_reused) {
242
+ /* Check if the cipher is disabled. */
243
+ if ((cipher->algorithm_mkey & ssl->cert->mask_k) ||
244
+ (cipher->algorithm_auth & ssl->cert->mask_a) ||
245
+ SSL_CIPHER_get_min_version(cipher) > ssl3_protocol_version(ssl) ||
246
+ SSL_CIPHER_get_max_version(cipher) < ssl3_protocol_version(ssl) ||
247
+ !sk_SSL_CIPHER_find(ssl_get_ciphers_by_id(ssl), NULL, cipher)) {
248
+ OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
249
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
250
+ return ssl_hs_error;
251
+ }
252
+ } else {
253
+ uint16_t resumption_cipher;
254
+ if (!ssl_cipher_get_ecdhe_psk_cipher(ssl->s3->new_session->cipher,
255
+ &resumption_cipher) ||
256
+ resumption_cipher != ssl_cipher_get_value(cipher)) {
257
+ OPENSSL_PUT_ERROR(SSL, SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED);
258
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
259
+ return ssl_hs_error;
260
+ }
261
+ }
262
+
263
+ ssl->s3->new_session->cipher = cipher;
264
+ ssl->s3->tmp.new_cipher = cipher;
265
+
266
+ /* The PRF hash is now known. Set up the key schedule. */
267
+ static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
268
+ size_t resumption_ctx_len =
269
+ EVP_MD_size(ssl_get_handshake_digest(ssl_get_algorithm_prf(ssl)));
270
+ if (ssl->s3->session_reused) {
271
+ uint8_t resumption_ctx[EVP_MAX_MD_SIZE];
272
+ if (!tls13_resumption_context(ssl, resumption_ctx, resumption_ctx_len,
273
+ ssl->s3->new_session) ||
274
+ !tls13_init_key_schedule(ssl, resumption_ctx, resumption_ctx_len)) {
275
+ return ssl_hs_error;
276
+ }
277
+ } else if (!tls13_init_key_schedule(ssl, kZeroes, resumption_ctx_len)) {
278
+ return ssl_hs_error;
279
+ }
280
+
281
+ /* Resolve PSK and incorporate it into the secret. */
282
+ if (cipher->algorithm_auth == SSL_aPSK) {
283
+ if (!ssl->s3->session_reused) {
284
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
285
+ return ssl_hs_error;
286
+ }
287
+
288
+ uint8_t resumption_psk[EVP_MAX_MD_SIZE];
289
+ if (!tls13_resumption_psk(ssl, resumption_psk, hs->hash_len,
290
+ ssl->s3->new_session) ||
291
+ !tls13_advance_key_schedule(ssl, resumption_psk, hs->hash_len)) {
292
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
293
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
294
+ return ssl_hs_error;
295
+ }
296
+ } else if (!tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len)) {
297
+ return ssl_hs_error;
298
+ }
299
+
300
+ /* Resolve ECDHE and incorporate it into the secret. */
301
+ if (cipher->algorithm_mkey == SSL_kECDHE) {
302
+ if (!have_key_share) {
303
+ OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_KEY_SHARE);
304
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
305
+ return ssl_hs_error;
306
+ }
307
+
308
+ uint8_t *dhe_secret;
309
+ size_t dhe_secret_len;
310
+ if (!ssl_ext_key_share_parse_serverhello(ssl, &dhe_secret, &dhe_secret_len,
311
+ &alert, &key_share)) {
312
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
313
+ return ssl_hs_error;
314
+ }
315
+
316
+ int ok = tls13_advance_key_schedule(ssl, dhe_secret, dhe_secret_len);
317
+ OPENSSL_free(dhe_secret);
318
+ if (!ok) {
319
+ return ssl_hs_error;
320
+ }
321
+ } else {
322
+ if (have_key_share) {
323
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
324
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNSUPPORTED_EXTENSION);
325
+ return ssl_hs_error;
326
+ }
327
+ if (!tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len)) {
328
+ return ssl_hs_error;
329
+ }
330
+ }
331
+
332
+ /* If there was no HelloRetryRequest, the version negotiation logic has
333
+ * already hashed the message. */
334
+ if (ssl->s3->hs->retry_group != 0 &&
335
+ !ssl->method->hash_current_message(ssl)) {
336
+ return ssl_hs_error;
337
+ }
338
+
339
+ if (!tls13_set_handshake_traffic(ssl)) {
340
+ return ssl_hs_error;
341
+ }
342
+
343
+ hs->state = state_process_encrypted_extensions;
344
+ return ssl_hs_read_message;
345
+ }
346
+
347
+ static enum ssl_hs_wait_t do_process_encrypted_extensions(SSL *ssl,
348
+ SSL_HANDSHAKE *hs) {
349
+ if (!tls13_check_message_type(ssl, SSL3_MT_ENCRYPTED_EXTENSIONS)) {
350
+ return ssl_hs_error;
351
+ }
352
+
353
+ CBS cbs;
354
+ CBS_init(&cbs, ssl->init_msg, ssl->init_num);
355
+ if (!ssl_parse_serverhello_tlsext(ssl, &cbs)) {
356
+ OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
357
+ return ssl_hs_error;
358
+ }
359
+ if (CBS_len(&cbs) != 0) {
360
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
361
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
362
+ return ssl_hs_error;
363
+ }
364
+
365
+ if (!ssl->method->hash_current_message(ssl)) {
366
+ return ssl_hs_error;
367
+ }
368
+
369
+ hs->state = state_process_certificate_request;
370
+ return ssl_hs_read_message;
371
+ }
372
+
373
+ static enum ssl_hs_wait_t do_process_certificate_request(SSL *ssl,
374
+ SSL_HANDSHAKE *hs) {
375
+ ssl->s3->tmp.cert_request = 0;
376
+
377
+ /* CertificateRequest may only be sent in certificate-based ciphers. */
378
+ if (!ssl_cipher_uses_certificate_auth(ssl->s3->tmp.new_cipher)) {
379
+ hs->state = state_process_server_finished;
380
+ return ssl_hs_ok;
381
+ }
382
+
383
+ /* CertificateRequest is optional. */
384
+ if (ssl->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST) {
385
+ hs->state = state_process_server_certificate;
386
+ return ssl_hs_ok;
387
+ }
388
+
389
+ CBS cbs, context, supported_signature_algorithms;
390
+ CBS_init(&cbs, ssl->init_msg, ssl->init_num);
391
+ if (!CBS_get_u8_length_prefixed(&cbs, &context) ||
392
+ /* The request context is always empty during the handshake. */
393
+ CBS_len(&context) != 0 ||
394
+ !CBS_get_u16_length_prefixed(&cbs, &supported_signature_algorithms) ||
395
+ CBS_len(&supported_signature_algorithms) == 0 ||
396
+ !tls1_parse_peer_sigalgs(ssl, &supported_signature_algorithms)) {
397
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
398
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
399
+ return ssl_hs_error;
400
+ }
401
+
402
+ uint8_t alert;
403
+ STACK_OF(X509_NAME) *ca_sk = ssl_parse_client_CA_list(ssl, &alert, &cbs);
404
+ if (ca_sk == NULL) {
405
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
406
+ return ssl_hs_error;
407
+ }
408
+
409
+ /* Ignore extensions. */
410
+ CBS extensions;
411
+ if (!CBS_get_u16_length_prefixed(&cbs, &extensions) ||
412
+ CBS_len(&cbs) != 0) {
413
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
414
+ sk_X509_NAME_pop_free(ca_sk, X509_NAME_free);
415
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
416
+ return ssl_hs_error;
417
+ }
418
+
419
+ ssl->s3->tmp.cert_request = 1;
420
+ sk_X509_NAME_pop_free(ssl->s3->tmp.ca_names, X509_NAME_free);
421
+ ssl->s3->tmp.ca_names = ca_sk;
422
+
423
+ if (!ssl->method->hash_current_message(ssl)) {
424
+ return ssl_hs_error;
425
+ }
426
+
427
+ hs->state = state_process_server_certificate;
428
+ return ssl_hs_read_message;
429
+ }
430
+
431
+ static enum ssl_hs_wait_t do_process_server_certificate(SSL *ssl,
432
+ SSL_HANDSHAKE *hs) {
433
+ if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE) ||
434
+ !tls13_process_certificate(ssl, 0 /* certificate required */) ||
435
+ !ssl->method->hash_current_message(ssl)) {
436
+ return ssl_hs_error;
437
+ }
438
+
439
+ /* Check the certificate matches the cipher suite.
440
+ *
441
+ * TODO(davidben): Remove this check when switching to the new TLS 1.3 cipher
442
+ * suite negotiation. */
443
+ if (!ssl_check_leaf_certificate(ssl, ssl->s3->new_session->peer)) {
444
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
445
+ return ssl_hs_error;
446
+ }
447
+
448
+ hs->state = state_process_server_certificate_verify;
449
+ return ssl_hs_read_message;
450
+ }
451
+
452
+ static enum ssl_hs_wait_t do_process_server_certificate_verify(
453
+ SSL *ssl, SSL_HANDSHAKE *hs) {
454
+ if (!tls13_check_message_type(ssl, SSL3_MT_CERTIFICATE_VERIFY) ||
455
+ !tls13_process_certificate_verify(ssl) ||
456
+ !ssl->method->hash_current_message(ssl)) {
457
+ return 0;
458
+ }
459
+
460
+ hs->state = state_process_server_finished;
461
+ return ssl_hs_read_message;
462
+ }
463
+
464
+ static enum ssl_hs_wait_t do_process_server_finished(SSL *ssl,
465
+ SSL_HANDSHAKE *hs) {
466
+ static const uint8_t kZeroes[EVP_MAX_MD_SIZE] = {0};
467
+
468
+ if (!tls13_check_message_type(ssl, SSL3_MT_FINISHED) ||
469
+ !tls13_process_finished(ssl) ||
470
+ !ssl->method->hash_current_message(ssl) ||
471
+ /* Update the secret to the master secret and derive traffic keys. */
472
+ !tls13_advance_key_schedule(ssl, kZeroes, hs->hash_len) ||
473
+ !tls13_derive_traffic_secret_0(ssl)) {
474
+ return ssl_hs_error;
475
+ }
476
+
477
+ ssl->method->received_flight(ssl);
478
+ hs->state = state_certificate_callback;
479
+ return ssl_hs_ok;
480
+ }
481
+
482
+ static enum ssl_hs_wait_t do_certificate_callback(SSL *ssl, SSL_HANDSHAKE *hs) {
483
+ /* The peer didn't request a certificate. */
484
+ if (!ssl->s3->tmp.cert_request) {
485
+ hs->state = state_send_client_finished;
486
+ return ssl_hs_ok;
487
+ }
488
+
489
+ /* Call cert_cb to update the certificate. */
490
+ if (ssl->cert->cert_cb != NULL) {
491
+ int rv = ssl->cert->cert_cb(ssl, ssl->cert->cert_cb_arg);
492
+ if (rv == 0) {
493
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
494
+ OPENSSL_PUT_ERROR(SSL, SSL_R_CERT_CB_ERROR);
495
+ return ssl_hs_error;
496
+ }
497
+ if (rv < 0) {
498
+ hs->state = state_certificate_callback;
499
+ return ssl_hs_x509_lookup;
500
+ }
501
+ }
502
+
503
+ hs->state = state_send_client_certificate;
504
+ return ssl_hs_ok;
505
+ }
506
+
507
+ static enum ssl_hs_wait_t do_send_client_certificate(SSL *ssl,
508
+ SSL_HANDSHAKE *hs) {
509
+ /* Call client_cert_cb to update the certificate. */
510
+ int should_retry;
511
+ if (!ssl_do_client_cert_cb(ssl, &should_retry)) {
512
+ if (should_retry) {
513
+ hs->state = state_send_client_certificate;
514
+ return ssl_hs_x509_lookup;
515
+ }
516
+ return ssl_hs_error;
517
+ }
518
+
519
+ if (!tls13_prepare_certificate(ssl)) {
520
+ return ssl_hs_error;
521
+ }
522
+
523
+ hs->state = state_send_client_certificate_verify;
524
+ return ssl_hs_write_message;
525
+ }
526
+
527
+ static enum ssl_hs_wait_t do_send_client_certificate_verify(SSL *ssl,
528
+ SSL_HANDSHAKE *hs,
529
+ int is_first_run) {
530
+ /* Don't send CertificateVerify if there is no certificate. */
531
+ if (!ssl_has_certificate(ssl)) {
532
+ hs->state = state_send_client_finished;
533
+ return ssl_hs_ok;
534
+ }
535
+
536
+ switch (tls13_prepare_certificate_verify(ssl, is_first_run)) {
537
+ case ssl_private_key_success:
538
+ hs->state = state_send_client_finished;
539
+ return ssl_hs_write_message;
540
+
541
+ case ssl_private_key_retry:
542
+ hs->state = state_complete_client_certificate_verify;
543
+ return ssl_hs_private_key_operation;
544
+
545
+ case ssl_private_key_failure:
546
+ return ssl_hs_error;
547
+ }
548
+
549
+ assert(0);
550
+ return ssl_hs_error;
551
+ }
552
+
553
+ static enum ssl_hs_wait_t do_send_client_finished(SSL *ssl, SSL_HANDSHAKE *hs) {
554
+ if (!tls13_prepare_finished(ssl)) {
555
+ return ssl_hs_error;
556
+ }
557
+
558
+ hs->state = state_flush;
559
+ return ssl_hs_write_message;
560
+ }
561
+
562
+ static enum ssl_hs_wait_t do_flush(SSL *ssl, SSL_HANDSHAKE *hs) {
563
+ if (!tls13_set_traffic_key(ssl, type_data, evp_aead_open,
564
+ hs->traffic_secret_0, hs->hash_len) ||
565
+ !tls13_set_traffic_key(ssl, type_data, evp_aead_seal,
566
+ hs->traffic_secret_0, hs->hash_len) ||
567
+ !tls13_finalize_keys(ssl)) {
568
+ return ssl_hs_error;
569
+ }
570
+
571
+ hs->state = state_done;
572
+ return ssl_hs_flush;
573
+ }
574
+
575
+ enum ssl_hs_wait_t tls13_client_handshake(SSL *ssl) {
576
+ SSL_HANDSHAKE *hs = ssl->s3->hs;
577
+
578
+ while (hs->state != state_done) {
579
+ enum ssl_hs_wait_t ret = ssl_hs_error;
580
+ enum client_hs_state_t state = hs->state;
581
+ switch (state) {
582
+ case state_process_hello_retry_request:
583
+ ret = do_process_hello_retry_request(ssl, hs);
584
+ break;
585
+ case state_send_second_client_hello:
586
+ ret = do_send_second_client_hello(ssl, hs);
587
+ break;
588
+ case state_flush_second_client_hello:
589
+ ret = do_flush_second_client_hello(ssl, hs);
590
+ break;
591
+ case state_process_server_hello:
592
+ ret = do_process_server_hello(ssl, hs);
593
+ break;
594
+ case state_process_encrypted_extensions:
595
+ ret = do_process_encrypted_extensions(ssl, hs);
596
+ break;
597
+ case state_process_certificate_request:
598
+ ret = do_process_certificate_request(ssl, hs);
599
+ break;
600
+ case state_process_server_certificate:
601
+ ret = do_process_server_certificate(ssl, hs);
602
+ break;
603
+ case state_process_server_certificate_verify:
604
+ ret = do_process_server_certificate_verify(ssl, hs);
605
+ break;
606
+ case state_process_server_finished:
607
+ ret = do_process_server_finished(ssl, hs);
608
+ break;
609
+ case state_certificate_callback:
610
+ ret = do_certificate_callback(ssl, hs);
611
+ break;
612
+ case state_send_client_certificate:
613
+ ret = do_send_client_certificate(ssl, hs);
614
+ break;
615
+ case state_send_client_certificate_verify:
616
+ ret = do_send_client_certificate_verify(ssl, hs, 1 /* first run */);
617
+ break;
618
+ case state_complete_client_certificate_verify:
619
+ ret = do_send_client_certificate_verify(ssl, hs, 0 /* complete */);
620
+ break;
621
+ case state_send_client_finished:
622
+ ret = do_send_client_finished(ssl, hs);
623
+ break;
624
+ case state_flush:
625
+ ret = do_flush(ssl, hs);
626
+ break;
627
+ case state_done:
628
+ ret = ssl_hs_ok;
629
+ break;
630
+ }
631
+
632
+ if (ret != ssl_hs_ok) {
633
+ return ret;
634
+ }
635
+ }
636
+
637
+ return ssl_hs_ok;
638
+ }
639
+
640
+ int tls13_process_new_session_ticket(SSL *ssl) {
641
+ SSL_SESSION *session =
642
+ SSL_SESSION_dup(ssl->s3->established_session,
643
+ SSL_SESSION_INCLUDE_NONAUTH);
644
+ if (session == NULL) {
645
+ return 0;
646
+ }
647
+
648
+ CBS cbs, extensions, ticket;
649
+ CBS_init(&cbs, ssl->init_msg, ssl->init_num);
650
+ if (!CBS_get_u32(&cbs, &session->tlsext_tick_lifetime_hint) ||
651
+ !CBS_get_u32(&cbs, &session->ticket_flags) ||
652
+ !CBS_get_u32(&cbs, &session->ticket_age_add) ||
653
+ !CBS_get_u16_length_prefixed(&cbs, &extensions) ||
654
+ !CBS_get_u16_length_prefixed(&cbs, &ticket) ||
655
+ !CBS_stow(&ticket, &session->tlsext_tick, &session->tlsext_ticklen) ||
656
+ CBS_len(&cbs) != 0) {
657
+ SSL_SESSION_free(session);
658
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
659
+ OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
660
+ return 0;
661
+ }
662
+
663
+ session->ticket_age_add_valid = 1;
664
+ session->not_resumable = 0;
665
+
666
+ if (ssl->ctx->new_session_cb != NULL &&
667
+ ssl->ctx->new_session_cb(ssl, session)) {
668
+ /* |new_session_cb|'s return value signals that it took ownership. */
669
+ return 1;
670
+ }
671
+
672
+ SSL_SESSION_free(session);
673
+ return 1;
674
+ }
675
+
676
+ void ssl_clear_tls13_state(SSL *ssl) {
677
+ SSL_ECDH_CTX_cleanup(&ssl->s3->hs->ecdh_ctx);
678
+
679
+ OPENSSL_free(ssl->s3->hs->key_share_bytes);
680
+ ssl->s3->hs->key_share_bytes = NULL;
681
+ ssl->s3->hs->key_share_bytes_len = 0;
682
+ }