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
@@ -146,10 +146,10 @@ DECLARE_STACK_OF(X509V3_EXT_METHOD)
146
146
 
147
147
  typedef BIT_STRING_BITNAME ENUMERATED_NAMES;
148
148
 
149
- typedef struct BASIC_CONSTRAINTS_st {
149
+ struct BASIC_CONSTRAINTS_st {
150
150
  int ca;
151
151
  ASN1_INTEGER *pathlen;
152
- } BASIC_CONSTRAINTS;
152
+ };
153
153
 
154
154
 
155
155
  typedef struct PKEY_USAGE_PERIOD_st {
@@ -600,6 +600,7 @@ OPENSSL_EXPORT GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out,
600
600
  X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc);
601
601
  OPENSSL_EXPORT void X509V3_conf_free(CONF_VALUE *val);
602
602
 
603
+ OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, int ext_nid, char *value);
603
604
  OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, char *value);
604
605
  OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name, char *value);
605
606
  OPENSSL_EXPORT int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section, STACK_OF(X509_EXTENSION) **sk);
@@ -646,6 +647,7 @@ OPENSSL_EXPORT int X509V3_add_standard_extensions(void);
646
647
  OPENSSL_EXPORT STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line);
647
648
  OPENSSL_EXPORT void *X509V3_EXT_d2i(X509_EXTENSION *ext);
648
649
  OPENSSL_EXPORT void *X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, int *idx);
650
+ OPENSSL_EXPORT int X509V3_EXT_free(int nid, void *ext_data);
649
651
 
650
652
 
651
653
  OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc);
@@ -730,7 +732,26 @@ void ERR_load_X509V3_strings(void);
730
732
 
731
733
  #ifdef __cplusplus
732
734
  }
735
+
736
+ extern "C++" {
737
+
738
+ namespace bssl {
739
+
740
+ BORINGSSL_MAKE_STACK_DELETER(DIST_POINT, DIST_POINT_free)
741
+ BORINGSSL_MAKE_STACK_DELETER(GENERAL_NAME, GENERAL_NAME_free)
742
+ // A STACK_OF(POLICYINFO) is also known as a CERTIFICATEPOLICIES.
743
+ BORINGSSL_MAKE_STACK_DELETER(POLICYINFO, POLICYINFO_free)
744
+
745
+ BORINGSSL_MAKE_DELETER(AUTHORITY_KEYID, AUTHORITY_KEYID_free)
746
+ BORINGSSL_MAKE_DELETER(BASIC_CONSTRAINTS, BASIC_CONSTRAINTS_free)
747
+ BORINGSSL_MAKE_DELETER(DIST_POINT, DIST_POINT_free)
748
+ BORINGSSL_MAKE_DELETER(GENERAL_NAME, GENERAL_NAME_free)
749
+
750
+ } // namespace bssl
751
+
752
+ } /* extern C++ */
733
753
  #endif
754
+
734
755
  #define X509V3_R_BAD_IP_ADDRESS 100
735
756
  #define X509V3_R_BAD_OBJECT 101
736
757
  #define X509V3_R_BN_DEC2BN_ERROR 102
@@ -32,8 +32,7 @@ void SSL_CUSTOM_EXTENSION_free(SSL_CUSTOM_EXTENSION *custom_extension) {
32
32
  static const SSL_CUSTOM_EXTENSION *custom_ext_find(
33
33
  STACK_OF(SSL_CUSTOM_EXTENSION) *stack,
34
34
  unsigned *out_index, uint16_t value) {
35
- size_t i;
36
- for (i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) {
35
+ for (size_t i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) {
37
36
  const SSL_CUSTOM_EXTENSION *ext = sk_SSL_CUSTOM_EXTENSION_value(stack, i);
38
37
  if (ext->value == value) {
39
38
  if (out_index != NULL) {
@@ -69,8 +68,7 @@ static int custom_ext_add_hello(SSL *ssl, CBB *extensions) {
69
68
  return 1;
70
69
  }
71
70
 
72
- size_t i;
73
- for (i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) {
71
+ for (size_t i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) {
74
72
  const SSL_CUSTOM_EXTENSION *ext = sk_SSL_CUSTOM_EXTENSION_value(stack, i);
75
73
 
76
74
  if (ssl->server &&
@@ -139,7 +137,7 @@ int custom_ext_parse_serverhello(SSL *ssl, int *out_alert, uint16_t value,
139
137
  !(ssl->s3->tmp.custom_extensions.sent & (1u << index))) {
140
138
  OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);
141
139
  ERR_add_error_dataf("extension: %u", (unsigned)value);
142
- *out_alert = SSL_AD_DECODE_ERROR;
140
+ *out_alert = SSL_AD_UNSUPPORTED_EXTENSION;
143
141
  return 0;
144
142
  }
145
143
 
@@ -115,14 +115,12 @@
115
115
 
116
116
  #include <assert.h>
117
117
  #include <limits.h>
118
- #include <stdio.h>
119
118
  #include <string.h>
120
119
 
121
120
  #include <openssl/buf.h>
122
121
  #include <openssl/err.h>
123
122
  #include <openssl/evp.h>
124
123
  #include <openssl/mem.h>
125
- #include <openssl/obj.h>
126
124
  #include <openssl/rand.h>
127
125
  #include <openssl/x509.h>
128
126
 
@@ -141,41 +139,63 @@ static const unsigned int kMinMTU = 256 - 28;
141
139
  * the underlying BIO supplies one. */
142
140
  static const unsigned int kDefaultMTU = 1500 - 28;
143
141
 
144
- /* kMaxHandshakeBuffer is the maximum number of handshake messages ahead of the
145
- * current one to buffer. */
146
- static const unsigned int kHandshakeBufferSize = 10;
147
142
 
148
- static hm_fragment *dtls1_hm_fragment_new(size_t frag_len, int reassembly) {
143
+ /* Receiving handshake messages. */
144
+
145
+ static void dtls1_hm_fragment_free(hm_fragment *frag) {
146
+ if (frag == NULL) {
147
+ return;
148
+ }
149
+ OPENSSL_free(frag->data);
150
+ OPENSSL_free(frag->reassembly);
151
+ OPENSSL_free(frag);
152
+ }
153
+
154
+ static hm_fragment *dtls1_hm_fragment_new(const struct hm_header_st *msg_hdr) {
149
155
  hm_fragment *frag = OPENSSL_malloc(sizeof(hm_fragment));
150
156
  if (frag == NULL) {
151
157
  OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
152
158
  return NULL;
153
159
  }
154
160
  memset(frag, 0, sizeof(hm_fragment));
161
+ frag->type = msg_hdr->type;
162
+ frag->seq = msg_hdr->seq;
163
+ frag->msg_len = msg_hdr->msg_len;
155
164
 
156
- /* If the handshake message is empty, |frag->fragment| and |frag->reassembly|
157
- * are NULL. */
158
- if (frag_len > 0) {
159
- frag->fragment = OPENSSL_malloc(frag_len);
160
- if (frag->fragment == NULL) {
161
- OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
165
+ /* Allocate space for the reassembled message and fill in the header. */
166
+ frag->data = OPENSSL_malloc(DTLS1_HM_HEADER_LENGTH + msg_hdr->msg_len);
167
+ if (frag->data == NULL) {
168
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
169
+ goto err;
170
+ }
171
+
172
+ CBB cbb;
173
+ if (!CBB_init_fixed(&cbb, frag->data, DTLS1_HM_HEADER_LENGTH) ||
174
+ !CBB_add_u8(&cbb, msg_hdr->type) ||
175
+ !CBB_add_u24(&cbb, msg_hdr->msg_len) ||
176
+ !CBB_add_u16(&cbb, msg_hdr->seq) ||
177
+ !CBB_add_u24(&cbb, 0 /* frag_off */) ||
178
+ !CBB_add_u24(&cbb, msg_hdr->msg_len) ||
179
+ !CBB_finish(&cbb, NULL, NULL)) {
180
+ CBB_cleanup(&cbb);
181
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
182
+ goto err;
183
+ }
184
+
185
+ /* If the handshake message is empty, |frag->reassembly| is NULL. */
186
+ if (msg_hdr->msg_len > 0) {
187
+ /* Initialize reassembly bitmask. */
188
+ if (msg_hdr->msg_len + 7 < msg_hdr->msg_len) {
189
+ OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
162
190
  goto err;
163
191
  }
164
-
165
- if (reassembly) {
166
- /* Initialize reassembly bitmask. */
167
- if (frag_len + 7 < frag_len) {
168
- OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
169
- goto err;
170
- }
171
- size_t bitmask_len = (frag_len + 7) / 8;
172
- frag->reassembly = OPENSSL_malloc(bitmask_len);
173
- if (frag->reassembly == NULL) {
174
- OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
175
- goto err;
176
- }
177
- memset(frag->reassembly, 0, bitmask_len);
192
+ size_t bitmask_len = (msg_hdr->msg_len + 7) / 8;
193
+ frag->reassembly = OPENSSL_malloc(bitmask_len);
194
+ if (frag->reassembly == NULL) {
195
+ OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
196
+ goto err;
178
197
  }
198
+ memset(frag->reassembly, 0, bitmask_len);
179
199
  }
180
200
 
181
201
  return frag;
@@ -185,22 +205,9 @@ err:
185
205
  return NULL;
186
206
  }
187
207
 
188
- void dtls1_hm_fragment_free(hm_fragment *frag) {
189
- if (frag == NULL) {
190
- return;
191
- }
192
- OPENSSL_free(frag->fragment);
193
- OPENSSL_free(frag->reassembly);
194
- OPENSSL_free(frag);
195
- }
196
-
197
- #if !defined(inline)
198
- #define inline __inline
199
- #endif
200
-
201
208
  /* bit_range returns a |uint8_t| with bits |start|, inclusive, to |end|,
202
209
  * exclusive, set. */
203
- static inline uint8_t bit_range(size_t start, size_t end) {
210
+ static uint8_t bit_range(size_t start, size_t end) {
204
211
  return (uint8_t)(~((1u << start) - 1) & ((1u << end) - 1));
205
212
  }
206
213
 
@@ -210,8 +217,7 @@ static inline uint8_t bit_range(size_t start, size_t end) {
210
217
  * and |frag->reassembly| must not be NULL. */
211
218
  static void dtls1_hm_fragment_mark(hm_fragment *frag, size_t start,
212
219
  size_t end) {
213
- size_t i;
214
- size_t msg_len = frag->msg_header.msg_len;
220
+ size_t msg_len = frag->msg_len;
215
221
 
216
222
  if (frag->reassembly == NULL || start > end || end > msg_len) {
217
223
  assert(0);
@@ -224,7 +230,7 @@ static void dtls1_hm_fragment_mark(hm_fragment *frag, size_t start,
224
230
  frag->reassembly[start >> 3] |= bit_range(start & 7, end & 7);
225
231
  } else {
226
232
  frag->reassembly[start >> 3] |= bit_range(start & 7, 8);
227
- for (i = (start >> 3) + 1; i < (end >> 3); i++) {
233
+ for (size_t i = (start >> 3) + 1; i < (end >> 3); i++) {
228
234
  frag->reassembly[i] = 0xff;
229
235
  }
230
236
  if ((end & 7) != 0) {
@@ -233,7 +239,7 @@ static void dtls1_hm_fragment_mark(hm_fragment *frag, size_t start,
233
239
  }
234
240
 
235
241
  /* Check if the fragment is complete. */
236
- for (i = 0; i < (msg_len >> 3); i++) {
242
+ for (size_t i = 0; i < (msg_len >> 3); i++) {
237
243
  if (frag->reassembly[i] != 0xff) {
238
244
  return;
239
245
  }
@@ -247,16 +253,270 @@ static void dtls1_hm_fragment_mark(hm_fragment *frag, size_t start,
247
253
  frag->reassembly = NULL;
248
254
  }
249
255
 
256
+ /* dtls1_is_current_message_complete returns one if the current handshake
257
+ * message is complete and zero otherwise. */
258
+ static int dtls1_is_current_message_complete(const SSL *ssl) {
259
+ hm_fragment *frag = ssl->d1->incoming_messages[ssl->d1->handshake_read_seq %
260
+ SSL_MAX_HANDSHAKE_FLIGHT];
261
+ return frag != NULL && frag->reassembly == NULL;
262
+ }
263
+
264
+ /* dtls1_get_incoming_message returns the incoming message corresponding to
265
+ * |msg_hdr|. If none exists, it creates a new one and inserts it in the
266
+ * queue. Otherwise, it checks |msg_hdr| is consistent with the existing one. It
267
+ * returns NULL on failure. The caller does not take ownership of the result. */
268
+ static hm_fragment *dtls1_get_incoming_message(
269
+ SSL *ssl, const struct hm_header_st *msg_hdr) {
270
+ if (msg_hdr->seq < ssl->d1->handshake_read_seq ||
271
+ msg_hdr->seq - ssl->d1->handshake_read_seq >= SSL_MAX_HANDSHAKE_FLIGHT) {
272
+ return NULL;
273
+ }
274
+
275
+ size_t idx = msg_hdr->seq % SSL_MAX_HANDSHAKE_FLIGHT;
276
+ hm_fragment *frag = ssl->d1->incoming_messages[idx];
277
+ if (frag != NULL) {
278
+ assert(frag->seq == msg_hdr->seq);
279
+ /* The new fragment must be compatible with the previous fragments from this
280
+ * message. */
281
+ if (frag->type != msg_hdr->type ||
282
+ frag->msg_len != msg_hdr->msg_len) {
283
+ OPENSSL_PUT_ERROR(SSL, SSL_R_FRAGMENT_MISMATCH);
284
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
285
+ return NULL;
286
+ }
287
+ return frag;
288
+ }
289
+
290
+ /* This is the first fragment from this message. */
291
+ frag = dtls1_hm_fragment_new(msg_hdr);
292
+ if (frag == NULL) {
293
+ return NULL;
294
+ }
295
+ ssl->d1->incoming_messages[idx] = frag;
296
+ return frag;
297
+ }
298
+
299
+ /* dtls1_process_handshake_record reads a handshake record and processes it. It
300
+ * returns one if the record was successfully processed and 0 or -1 on error. */
301
+ static int dtls1_process_handshake_record(SSL *ssl) {
302
+ SSL3_RECORD *rr = &ssl->s3->rrec;
303
+
304
+ start:
305
+ if (rr->length == 0) {
306
+ int ret = dtls1_get_record(ssl);
307
+ if (ret <= 0) {
308
+ return ret;
309
+ }
310
+ }
311
+
312
+ /* Cross-epoch records are discarded, but we may receive out-of-order
313
+ * application data between ChangeCipherSpec and Finished or a ChangeCipherSpec
314
+ * before the appropriate point in the handshake. Those must be silently
315
+ * discarded.
316
+ *
317
+ * However, only allow the out-of-order records in the correct epoch.
318
+ * Application data must come in the encrypted epoch, and ChangeCipherSpec in
319
+ * the unencrypted epoch (we never renegotiate). Other cases fall through and
320
+ * fail with a fatal error. */
321
+ if ((rr->type == SSL3_RT_APPLICATION_DATA &&
322
+ ssl->s3->aead_read_ctx != NULL) ||
323
+ (rr->type == SSL3_RT_CHANGE_CIPHER_SPEC &&
324
+ ssl->s3->aead_read_ctx == NULL)) {
325
+ rr->length = 0;
326
+ goto start;
327
+ }
328
+
329
+ if (rr->type != SSL3_RT_HANDSHAKE) {
330
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
331
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
332
+ return -1;
333
+ }
334
+
335
+ CBS cbs;
336
+ CBS_init(&cbs, rr->data, rr->length);
337
+
338
+ while (CBS_len(&cbs) > 0) {
339
+ /* Read a handshake fragment. */
340
+ struct hm_header_st msg_hdr;
341
+ CBS body;
342
+ if (!dtls1_parse_fragment(&cbs, &msg_hdr, &body)) {
343
+ OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_HANDSHAKE_RECORD);
344
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
345
+ return -1;
346
+ }
347
+
348
+ const size_t frag_off = msg_hdr.frag_off;
349
+ const size_t frag_len = msg_hdr.frag_len;
350
+ const size_t msg_len = msg_hdr.msg_len;
351
+ if (frag_off > msg_len || frag_off + frag_len < frag_off ||
352
+ frag_off + frag_len > msg_len ||
353
+ msg_len > ssl_max_handshake_message_len(ssl)) {
354
+ OPENSSL_PUT_ERROR(SSL, SSL_R_EXCESSIVE_MESSAGE_SIZE);
355
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
356
+ return -1;
357
+ }
358
+
359
+ /* The encrypted epoch in DTLS has only one handshake message. */
360
+ if (ssl->d1->r_epoch == 1 && msg_hdr.seq != ssl->d1->handshake_read_seq) {
361
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
362
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
363
+ return -1;
364
+ }
365
+
366
+ if (msg_hdr.seq < ssl->d1->handshake_read_seq ||
367
+ msg_hdr.seq >
368
+ (unsigned)ssl->d1->handshake_read_seq + SSL_MAX_HANDSHAKE_FLIGHT) {
369
+ /* Ignore fragments from the past, or ones too far in the future. */
370
+ continue;
371
+ }
372
+
373
+ hm_fragment *frag = dtls1_get_incoming_message(ssl, &msg_hdr);
374
+ if (frag == NULL) {
375
+ return -1;
376
+ }
377
+ assert(frag->msg_len == msg_len);
378
+
379
+ if (frag->reassembly == NULL) {
380
+ /* The message is already assembled. */
381
+ continue;
382
+ }
383
+ assert(msg_len > 0);
384
+
385
+ /* Copy the body into the fragment. */
386
+ memcpy(frag->data + DTLS1_HM_HEADER_LENGTH + frag_off, CBS_data(&body),
387
+ CBS_len(&body));
388
+ dtls1_hm_fragment_mark(frag, frag_off, frag_off + frag_len);
389
+ }
390
+
391
+ rr->length = 0;
392
+ ssl_read_buffer_discard(ssl);
393
+ return 1;
394
+ }
395
+
396
+ int dtls1_get_message(SSL *ssl, int msg_type,
397
+ enum ssl_hash_message_t hash_message) {
398
+ if (ssl->s3->tmp.reuse_message) {
399
+ /* A ssl_dont_hash_message call cannot be combined with reuse_message; the
400
+ * ssl_dont_hash_message would have to have been applied to the previous
401
+ * call. */
402
+ assert(hash_message == ssl_hash_message);
403
+ assert(ssl->init_msg != NULL);
404
+
405
+ ssl->s3->tmp.reuse_message = 0;
406
+ hash_message = ssl_dont_hash_message;
407
+ } else {
408
+ dtls1_release_current_message(ssl, 0 /* don't free buffer */);
409
+ }
410
+
411
+ /* Process handshake records until the current message is ready. */
412
+ while (!dtls1_is_current_message_complete(ssl)) {
413
+ int ret = dtls1_process_handshake_record(ssl);
414
+ if (ret <= 0) {
415
+ return ret;
416
+ }
417
+ }
418
+
419
+ hm_fragment *frag = ssl->d1->incoming_messages[ssl->d1->handshake_read_seq %
420
+ SSL_MAX_HANDSHAKE_FLIGHT];
421
+ assert(frag != NULL);
422
+ assert(frag->reassembly == NULL);
423
+ assert(ssl->d1->handshake_read_seq == frag->seq);
424
+
425
+ /* TODO(davidben): This function has a lot of implicit outputs. Simplify the
426
+ * |ssl_get_message| API. */
427
+ ssl->s3->tmp.message_type = frag->type;
428
+ ssl->init_msg = frag->data + DTLS1_HM_HEADER_LENGTH;
429
+ ssl->init_num = frag->msg_len;
430
+
431
+ if (msg_type >= 0 && ssl->s3->tmp.message_type != msg_type) {
432
+ ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
433
+ OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
434
+ return -1;
435
+ }
436
+ if (hash_message == ssl_hash_message && !dtls1_hash_current_message(ssl)) {
437
+ return -1;
438
+ }
439
+
440
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_HANDSHAKE, frag->data,
441
+ ssl->init_num + DTLS1_HM_HEADER_LENGTH);
442
+ return 1;
443
+ }
444
+
445
+ int dtls1_hash_current_message(SSL *ssl) {
446
+ assert(dtls1_is_current_message_complete(ssl));
447
+
448
+ hm_fragment *frag = ssl->d1->incoming_messages[ssl->d1->handshake_read_seq %
449
+ SSL_MAX_HANDSHAKE_FLIGHT];
450
+ return ssl3_update_handshake_hash(ssl, frag->data,
451
+ DTLS1_HM_HEADER_LENGTH + frag->msg_len);
452
+ }
453
+
454
+ void dtls1_release_current_message(SSL *ssl, int free_buffer) {
455
+ if (ssl->init_msg == NULL) {
456
+ return;
457
+ }
458
+
459
+ assert(dtls1_is_current_message_complete(ssl));
460
+ size_t index = ssl->d1->handshake_read_seq % SSL_MAX_HANDSHAKE_FLIGHT;
461
+ dtls1_hm_fragment_free(ssl->d1->incoming_messages[index]);
462
+ ssl->d1->incoming_messages[index] = NULL;
463
+ ssl->d1->handshake_read_seq++;
464
+
465
+ ssl->init_msg = NULL;
466
+ ssl->init_num = 0;
467
+ }
468
+
469
+ void dtls_clear_incoming_messages(SSL *ssl) {
470
+ for (size_t i = 0; i < SSL_MAX_HANDSHAKE_FLIGHT; i++) {
471
+ dtls1_hm_fragment_free(ssl->d1->incoming_messages[i]);
472
+ ssl->d1->incoming_messages[i] = NULL;
473
+ }
474
+ }
475
+
476
+ int dtls_has_incoming_messages(const SSL *ssl) {
477
+ size_t current = ssl->d1->handshake_read_seq % SSL_MAX_HANDSHAKE_FLIGHT;
478
+ for (size_t i = 0; i < SSL_MAX_HANDSHAKE_FLIGHT; i++) {
479
+ /* Skip the current message. */
480
+ if (ssl->init_msg != NULL && i == current) {
481
+ assert(dtls1_is_current_message_complete(ssl));
482
+ continue;
483
+ }
484
+ if (ssl->d1->incoming_messages[i] != NULL) {
485
+ return 1;
486
+ }
487
+ }
488
+ return 0;
489
+ }
490
+
491
+ int dtls1_parse_fragment(CBS *cbs, struct hm_header_st *out_hdr,
492
+ CBS *out_body) {
493
+ memset(out_hdr, 0x00, sizeof(struct hm_header_st));
494
+
495
+ if (!CBS_get_u8(cbs, &out_hdr->type) ||
496
+ !CBS_get_u24(cbs, &out_hdr->msg_len) ||
497
+ !CBS_get_u16(cbs, &out_hdr->seq) ||
498
+ !CBS_get_u24(cbs, &out_hdr->frag_off) ||
499
+ !CBS_get_u24(cbs, &out_hdr->frag_len) ||
500
+ !CBS_get_bytes(cbs, out_body, out_hdr->frag_len)) {
501
+ return 0;
502
+ }
503
+
504
+ return 1;
505
+ }
506
+
507
+
508
+ /* Sending handshake messages. */
509
+
250
510
  static void dtls1_update_mtu(SSL *ssl) {
251
511
  /* TODO(davidben): What is this code doing and do we need it? */
252
512
  if (ssl->d1->mtu < dtls1_min_mtu() &&
253
513
  !(SSL_get_options(ssl) & SSL_OP_NO_QUERY_MTU)) {
254
- long mtu = BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
514
+ long mtu = BIO_ctrl(ssl->wbio, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
255
515
  if (mtu >= 0 && mtu <= (1 << 30) && (unsigned)mtu >= dtls1_min_mtu()) {
256
516
  ssl->d1->mtu = (unsigned)mtu;
257
517
  } else {
258
518
  ssl->d1->mtu = kDefaultMTU;
259
- BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_SET_MTU, ssl->d1->mtu, NULL);
519
+ BIO_ctrl(ssl->wbio, BIO_CTRL_DGRAM_SET_MTU, ssl->d1->mtu, NULL);
260
520
  }
261
521
  }
262
522
 
@@ -276,7 +536,7 @@ static size_t dtls1_max_record_size(SSL *ssl) {
276
536
  }
277
537
  ret -= overhead;
278
538
 
279
- size_t pending = BIO_wpending(SSL_get_wbio(ssl));
539
+ size_t pending = BIO_wpending(ssl->wbio);
280
540
  if (ret <= pending) {
281
541
  return 0;
282
542
  }
@@ -292,32 +552,36 @@ static int dtls1_write_change_cipher_spec(SSL *ssl,
292
552
  /* During the handshake, wbio is buffered to pack messages together. Flush the
293
553
  * buffer if the ChangeCipherSpec would not fit in a packet. */
294
554
  if (dtls1_max_record_size(ssl) == 0) {
295
- ssl->rwstate = SSL_WRITING;
296
- int ret = BIO_flush(SSL_get_wbio(ssl));
555
+ int ret = BIO_flush(ssl->wbio);
297
556
  if (ret <= 0) {
557
+ ssl->rwstate = SSL_WRITING;
298
558
  return ret;
299
559
  }
300
- ssl->rwstate = SSL_NOTHING;
301
560
  }
302
561
 
303
562
  static const uint8_t kChangeCipherSpec[1] = {SSL3_MT_CCS};
304
563
  int ret =
305
- dtls1_write_bytes(ssl, SSL3_RT_CHANGE_CIPHER_SPEC, kChangeCipherSpec,
306
- sizeof(kChangeCipherSpec), use_epoch);
564
+ dtls1_write_record(ssl, SSL3_RT_CHANGE_CIPHER_SPEC, kChangeCipherSpec,
565
+ sizeof(kChangeCipherSpec), use_epoch);
307
566
  if (ret <= 0) {
308
567
  return ret;
309
568
  }
310
569
 
311
- if (ssl->msg_callback != NULL) {
312
- ssl->msg_callback(1 /* write */, ssl->version, SSL3_RT_CHANGE_CIPHER_SPEC,
313
- kChangeCipherSpec, sizeof(kChangeCipherSpec), ssl,
314
- ssl->msg_callback_arg);
315
- }
316
-
570
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_CHANGE_CIPHER_SPEC,
571
+ kChangeCipherSpec, sizeof(kChangeCipherSpec));
317
572
  return 1;
318
573
  }
319
574
 
320
- int dtls1_do_handshake_write(SSL *ssl, enum dtls1_use_epoch_t use_epoch) {
575
+ /* dtls1_do_handshake_write writes handshake message |in| using the given epoch,
576
+ * starting |offset| bytes into the message body. It returns one on success. On
577
+ * error, it returns <= 0 and sets |*out_offset| to the number of bytes of body
578
+ * that were successfully written. This may be used to retry the write
579
+ * later. |in| must be a reassembled handshake message with the full DTLS
580
+ * handshake header. */
581
+ static int dtls1_do_handshake_write(SSL *ssl, size_t *out_offset,
582
+ const uint8_t *in, size_t offset,
583
+ size_t len,
584
+ enum dtls1_use_epoch_t use_epoch) {
321
585
  dtls1_update_mtu(ssl);
322
586
 
323
587
  int ret = -1;
@@ -330,26 +594,33 @@ int dtls1_do_handshake_write(SSL *ssl, enum dtls1_use_epoch_t use_epoch) {
330
594
  goto err;
331
595
  }
332
596
 
333
- /* Consume the message header. Fragments will have different headers
334
- * prepended. */
335
- if (ssl->init_off == 0) {
336
- ssl->init_off += DTLS1_HM_HEADER_LENGTH;
337
- ssl->init_num -= DTLS1_HM_HEADER_LENGTH;
597
+ /* Although it may be sent as multiple fragments, a DTLS message must be sent
598
+ * serialized as a single fragment for purposes of |ssl_do_msg_callback| and
599
+ * the handshake hash. */
600
+ CBS cbs, body;
601
+ struct hm_header_st hdr;
602
+ CBS_init(&cbs, in, len);
603
+ if (!dtls1_parse_fragment(&cbs, &hdr, &body) ||
604
+ hdr.frag_off != 0 ||
605
+ hdr.frag_len != CBS_len(&body) ||
606
+ hdr.msg_len != CBS_len(&body) ||
607
+ !CBS_skip(&body, offset) ||
608
+ CBS_len(&cbs) != 0) {
609
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
610
+ goto err;
338
611
  }
339
- assert(ssl->init_off >= DTLS1_HM_HEADER_LENGTH);
340
612
 
341
613
  do {
342
614
  /* During the handshake, wbio is buffered to pack messages together. Flush
343
615
  * the buffer if there isn't enough room to make progress. */
344
616
  if (dtls1_max_record_size(ssl) < DTLS1_HM_HEADER_LENGTH + 1) {
345
- ssl->rwstate = SSL_WRITING;
346
- int flush_ret = BIO_flush(SSL_get_wbio(ssl));
617
+ int flush_ret = BIO_flush(ssl->wbio);
347
618
  if (flush_ret <= 0) {
619
+ ssl->rwstate = SSL_WRITING;
348
620
  ret = flush_ret;
349
621
  goto err;
350
622
  }
351
- ssl->rwstate = SSL_NOTHING;
352
- assert(BIO_wpending(SSL_get_wbio(ssl)) == 0);
623
+ assert(BIO_wpending(ssl->wbio) == 0);
353
624
  }
354
625
 
355
626
  size_t todo = dtls1_max_record_size(ssl);
@@ -361,521 +632,214 @@ int dtls1_do_handshake_write(SSL *ssl, enum dtls1_use_epoch_t use_epoch) {
361
632
  }
362
633
  todo -= DTLS1_HM_HEADER_LENGTH;
363
634
 
364
- if (todo > (size_t)ssl->init_num) {
365
- todo = ssl->init_num;
635
+ if (todo > CBS_len(&body)) {
636
+ todo = CBS_len(&body);
366
637
  }
367
638
  if (todo >= (1u << 24)) {
368
639
  todo = (1u << 24) - 1;
369
640
  }
370
641
 
371
- size_t len;
642
+ size_t buf_len;
372
643
  if (!CBB_init_fixed(&cbb, buf, ssl->d1->mtu) ||
373
- !CBB_add_u8(&cbb, ssl->d1->w_msg_hdr.type) ||
374
- !CBB_add_u24(&cbb, ssl->d1->w_msg_hdr.msg_len) ||
375
- !CBB_add_u16(&cbb, ssl->d1->w_msg_hdr.seq) ||
376
- !CBB_add_u24(&cbb, ssl->init_off - DTLS1_HM_HEADER_LENGTH) ||
644
+ !CBB_add_u8(&cbb, hdr.type) ||
645
+ !CBB_add_u24(&cbb, hdr.msg_len) ||
646
+ !CBB_add_u16(&cbb, hdr.seq) ||
647
+ !CBB_add_u24(&cbb, offset) ||
377
648
  !CBB_add_u24(&cbb, todo) ||
378
- !CBB_add_bytes(
379
- &cbb, (const uint8_t *)ssl->init_buf->data + ssl->init_off, todo) ||
380
- !CBB_finish(&cbb, NULL, &len)) {
649
+ !CBB_add_bytes(&cbb, CBS_data(&body), todo) ||
650
+ !CBB_finish(&cbb, NULL, &buf_len)) {
381
651
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
382
652
  goto err;
383
653
  }
384
654
 
385
- int write_ret = dtls1_write_bytes(ssl, SSL3_RT_HANDSHAKE, buf, len,
386
- use_epoch);
655
+ int write_ret =
656
+ dtls1_write_record(ssl, SSL3_RT_HANDSHAKE, buf, buf_len, use_epoch);
387
657
  if (write_ret <= 0) {
388
658
  ret = write_ret;
389
659
  goto err;
390
660
  }
391
- ssl->init_off += todo;
392
- ssl->init_num -= todo;
393
- } while (ssl->init_num > 0);
394
661
 
395
- if (ssl->msg_callback != NULL) {
396
- ssl->msg_callback(
397
- 1 /* write */, ssl->version, SSL3_RT_HANDSHAKE, ssl->init_buf->data,
398
- (size_t)(ssl->init_off + ssl->init_num), ssl, ssl->msg_callback_arg);
399
- }
662
+ if (!CBS_skip(&body, todo)) {
663
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
664
+ goto err;
665
+ }
666
+ offset += todo;
667
+ } while (CBS_len(&body) != 0);
400
668
 
401
- ssl->init_off = 0;
402
- ssl->init_num = 0;
669
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_HANDSHAKE, in, len);
403
670
 
404
671
  ret = 1;
405
672
 
406
673
  err:
674
+ *out_offset = offset;
407
675
  CBB_cleanup(&cbb);
408
676
  OPENSSL_free(buf);
409
677
  return ret;
410
678
  }
411
679
 
412
- /* dtls1_is_next_message_complete returns one if the next handshake message is
413
- * complete and zero otherwise. */
414
- static int dtls1_is_next_message_complete(SSL *ssl) {
415
- pitem *item = pqueue_peek(ssl->d1->buffered_messages);
416
- if (item == NULL) {
417
- return 0;
680
+ void dtls_clear_outgoing_messages(SSL *ssl) {
681
+ for (size_t i = 0; i < ssl->d1->outgoing_messages_len; i++) {
682
+ OPENSSL_free(ssl->d1->outgoing_messages[i].data);
683
+ ssl->d1->outgoing_messages[i].data = NULL;
418
684
  }
419
-
420
- hm_fragment *frag = (hm_fragment *)item->data;
421
- assert(ssl->d1->handshake_read_seq <= frag->msg_header.seq);
422
-
423
- return ssl->d1->handshake_read_seq == frag->msg_header.seq &&
424
- frag->reassembly == NULL;
685
+ ssl->d1->outgoing_messages_len = 0;
425
686
  }
426
687
 
427
- /* dtls1_discard_fragment_body discards a handshake fragment body of length
428
- * |frag_len|. It returns one on success and zero on error.
429
- *
430
- * TODO(davidben): This function will go away when ssl_read_bytes is gone from
431
- * the DTLS side. */
432
- static int dtls1_discard_fragment_body(SSL *ssl, size_t frag_len) {
433
- uint8_t discard[256];
434
- while (frag_len > 0) {
435
- size_t chunk = frag_len < sizeof(discard) ? frag_len : sizeof(discard);
436
- int ret = dtls1_read_bytes(ssl, SSL3_RT_HANDSHAKE, discard, chunk, 0);
437
- if (ret != (int) chunk) {
438
- return 0;
439
- }
440
- frag_len -= chunk;
688
+ /* dtls1_add_change_cipher_spec adds a ChangeCipherSpec to the current
689
+ * handshake flight. */
690
+ static int dtls1_add_change_cipher_spec(SSL *ssl) {
691
+ if (ssl->d1->outgoing_messages_len >= SSL_MAX_HANDSHAKE_FLIGHT) {
692
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
693
+ return 0;
441
694
  }
442
- return 1;
443
- }
444
695
 
445
- /* dtls1_get_buffered_message returns the buffered message corresponding to
446
- * |msg_hdr|. If none exists, it creates a new one and inserts it in the
447
- * queue. Otherwise, it checks |msg_hdr| is consistent with the existing one. It
448
- * returns NULL on failure. The caller does not take ownership of the result. */
449
- static hm_fragment *dtls1_get_buffered_message(
450
- SSL *ssl, const struct hm_header_st *msg_hdr) {
451
- uint8_t seq64be[8];
452
- memset(seq64be, 0, sizeof(seq64be));
453
- seq64be[6] = (uint8_t)(msg_hdr->seq >> 8);
454
- seq64be[7] = (uint8_t)msg_hdr->seq;
455
- pitem *item = pqueue_find(ssl->d1->buffered_messages, seq64be);
456
-
457
- hm_fragment *frag;
458
- if (item == NULL) {
459
- /* This is the first fragment from this message. */
460
- frag = dtls1_hm_fragment_new(msg_hdr->msg_len,
461
- 1 /* reassembly buffer needed */);
462
- if (frag == NULL) {
463
- return NULL;
464
- }
465
- memcpy(&frag->msg_header, msg_hdr, sizeof(*msg_hdr));
466
- item = pitem_new(seq64be, frag);
467
- if (item == NULL) {
468
- dtls1_hm_fragment_free(frag);
469
- return NULL;
470
- }
471
- item = pqueue_insert(ssl->d1->buffered_messages, item);
472
- /* |pqueue_insert| fails iff a duplicate item is inserted, but |item| cannot
473
- * be a duplicate. */
474
- assert(item != NULL);
475
- } else {
476
- frag = item->data;
477
- assert(frag->msg_header.seq == msg_hdr->seq);
478
- if (frag->msg_header.type != msg_hdr->type ||
479
- frag->msg_header.msg_len != msg_hdr->msg_len) {
480
- /* The new fragment must be compatible with the previous fragments from
481
- * this message. */
482
- OPENSSL_PUT_ERROR(SSL, SSL_R_FRAGMENT_MISMATCH);
483
- ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
484
- return NULL;
485
- }
486
- }
487
- return frag;
488
- }
696
+ DTLS_OUTGOING_MESSAGE *msg =
697
+ &ssl->d1->outgoing_messages[ssl->d1->outgoing_messages_len];
698
+ msg->data = NULL;
699
+ msg->len = 0;
700
+ msg->epoch = ssl->d1->w_epoch;
701
+ msg->is_ccs = 1;
489
702
 
490
- /* dtls1_max_handshake_message_len returns the maximum number of bytes
491
- * permitted in a DTLS handshake message for |ssl|. The minimum is 16KB, but may
492
- * be greater if the maximum certificate list size requires it. */
493
- static size_t dtls1_max_handshake_message_len(const SSL *ssl) {
494
- size_t max_len = DTLS1_HM_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH;
495
- if (max_len < ssl->max_cert_list) {
496
- return ssl->max_cert_list;
497
- }
498
- return max_len;
703
+ ssl->d1->outgoing_messages_len++;
704
+ return 1;
499
705
  }
500
706
 
501
- /* dtls1_process_fragment reads a handshake fragment and processes it. It
502
- * returns one if a fragment was successfully processed and 0 or -1 on error. */
503
- static int dtls1_process_fragment(SSL *ssl) {
504
- /* Read handshake message header. */
505
- uint8_t header[DTLS1_HM_HEADER_LENGTH];
506
- int ret = dtls1_read_bytes(ssl, SSL3_RT_HANDSHAKE, header,
507
- DTLS1_HM_HEADER_LENGTH, 0);
508
- if (ret <= 0) {
509
- return ret;
510
- }
511
- if (ret != DTLS1_HM_HEADER_LENGTH) {
512
- OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
513
- ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
514
- return -1;
515
- }
516
-
517
- /* Parse the message fragment header. */
518
- struct hm_header_st msg_hdr;
519
- dtls1_get_message_header(header, &msg_hdr);
520
-
521
- /* TODO(davidben): dtls1_read_bytes is the wrong abstraction for DTLS. There
522
- * should be no need to reach into |ssl->s3->rrec.length|. */
523
- const size_t frag_off = msg_hdr.frag_off;
524
- const size_t frag_len = msg_hdr.frag_len;
525
- const size_t msg_len = msg_hdr.msg_len;
526
- if (frag_off > msg_len || frag_off + frag_len < frag_off ||
527
- frag_off + frag_len > msg_len ||
528
- msg_len > dtls1_max_handshake_message_len(ssl) ||
529
- frag_len > ssl->s3->rrec.length) {
530
- OPENSSL_PUT_ERROR(SSL, SSL_R_EXCESSIVE_MESSAGE_SIZE);
531
- ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
532
- return -1;
533
- }
534
-
535
- if (msg_hdr.seq < ssl->d1->handshake_read_seq ||
536
- msg_hdr.seq > (unsigned)ssl->d1->handshake_read_seq +
537
- kHandshakeBufferSize) {
538
- /* Ignore fragments from the past, or ones too far in the future. */
539
- if (!dtls1_discard_fragment_body(ssl, frag_len)) {
540
- return -1;
541
- }
542
- return 1;
543
- }
544
-
545
- hm_fragment *frag = dtls1_get_buffered_message(ssl, &msg_hdr);
546
- if (frag == NULL) {
547
- return -1;
548
- }
549
- assert(frag->msg_header.msg_len == msg_len);
550
-
551
- if (frag->reassembly == NULL) {
552
- /* The message is already assembled. */
553
- if (!dtls1_discard_fragment_body(ssl, frag_len)) {
554
- return -1;
555
- }
556
- return 1;
557
- }
558
- assert(msg_len > 0);
559
-
560
- /* Read the body of the fragment. */
561
- ret = dtls1_read_bytes(ssl, SSL3_RT_HANDSHAKE, frag->fragment + frag_off,
562
- frag_len, 0);
563
- if (ret != (int) frag_len) {
707
+ static int dtls1_add_message(SSL *ssl, uint8_t *data, size_t len) {
708
+ if (ssl->d1->outgoing_messages_len >= SSL_MAX_HANDSHAKE_FLIGHT) {
564
709
  OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
565
- ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
566
- return -1;
710
+ OPENSSL_free(data);
711
+ return 0;
567
712
  }
568
- dtls1_hm_fragment_mark(frag, frag_off, frag_off + frag_len);
569
713
 
714
+ DTLS_OUTGOING_MESSAGE *msg =
715
+ &ssl->d1->outgoing_messages[ssl->d1->outgoing_messages_len];
716
+ msg->data = data;
717
+ msg->len = len;
718
+ msg->epoch = ssl->d1->w_epoch;
719
+ msg->is_ccs = 0;
720
+
721
+ ssl->d1->outgoing_messages_len++;
570
722
  return 1;
571
723
  }
572
724
 
573
- /* dtls1_get_message reads a handshake message of message type |msg_type| (any
574
- * if |msg_type| == -1), maximum acceptable body length |max|. Read an entire
575
- * handshake message. Handshake messages arrive in fragments. */
576
- long dtls1_get_message(SSL *ssl, int st1, int stn, int msg_type, long max,
577
- enum ssl_hash_message_t hash_message, int *ok) {
578
- pitem *item = NULL;
579
- hm_fragment *frag = NULL;
580
- int al;
581
-
582
- /* s3->tmp is used to store messages that are unexpected, caused
583
- * by the absence of an optional handshake message */
584
- if (ssl->s3->tmp.reuse_message) {
585
- /* A ssl_dont_hash_message call cannot be combined with reuse_message; the
586
- * ssl_dont_hash_message would have to have been applied to the previous
587
- * call. */
588
- assert(hash_message == ssl_hash_message);
589
- ssl->s3->tmp.reuse_message = 0;
590
- if (msg_type >= 0 && ssl->s3->tmp.message_type != msg_type) {
591
- al = SSL_AD_UNEXPECTED_MESSAGE;
592
- OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
593
- goto f_err;
594
- }
595
- *ok = 1;
596
- ssl->init_msg = (uint8_t *)ssl->init_buf->data + DTLS1_HM_HEADER_LENGTH;
597
- ssl->init_num = (int)ssl->s3->tmp.message_size;
598
- return ssl->init_num;
599
- }
600
-
601
- /* Process fragments until one is found. */
602
- while (!dtls1_is_next_message_complete(ssl)) {
603
- int ret = dtls1_process_fragment(ssl);
604
- if (ret <= 0) {
605
- *ok = 0;
606
- return ret;
607
- }
725
+ int dtls1_init_message(SSL *ssl, CBB *cbb, CBB *body, uint8_t type) {
726
+ /* Pick a modest size hint to save most of the |realloc| calls. */
727
+ if (!CBB_init(cbb, 64) ||
728
+ !CBB_add_u8(cbb, type) ||
729
+ !CBB_add_u24(cbb, 0 /* length (filled in later) */) ||
730
+ !CBB_add_u16(cbb, ssl->d1->handshake_write_seq) ||
731
+ !CBB_add_u24(cbb, 0 /* offset */) ||
732
+ !CBB_add_u24_length_prefixed(cbb, body)) {
733
+ return 0;
608
734
  }
609
735
 
610
- /* Read out the next complete handshake message. */
611
- item = pqueue_pop(ssl->d1->buffered_messages);
612
- assert(item != NULL);
613
- frag = (hm_fragment *)item->data;
614
- assert(ssl->d1->handshake_read_seq == frag->msg_header.seq);
615
- assert(frag->reassembly == NULL);
616
-
617
- if (frag->msg_header.msg_len > (size_t)max) {
618
- OPENSSL_PUT_ERROR(SSL, SSL_R_EXCESSIVE_MESSAGE_SIZE);
619
- goto err;
620
- }
736
+ return 1;
737
+ }
621
738
 
622
- /* Reconstruct the assembled message. */
739
+ int dtls1_finish_message(SSL *ssl, CBB *cbb) {
740
+ uint8_t *msg = NULL;
623
741
  size_t len;
624
- CBB cbb;
625
- CBB_zero(&cbb);
626
- if (!BUF_MEM_grow(ssl->init_buf, (size_t)frag->msg_header.msg_len +
627
- DTLS1_HM_HEADER_LENGTH) ||
628
- !CBB_init_fixed(&cbb, (uint8_t *)ssl->init_buf->data,
629
- ssl->init_buf->max) ||
630
- !CBB_add_u8(&cbb, frag->msg_header.type) ||
631
- !CBB_add_u24(&cbb, frag->msg_header.msg_len) ||
632
- !CBB_add_u16(&cbb, frag->msg_header.seq) ||
633
- !CBB_add_u24(&cbb, 0 /* frag_off */) ||
634
- !CBB_add_u24(&cbb, frag->msg_header.msg_len) ||
635
- !CBB_add_bytes(&cbb, frag->fragment, frag->msg_header.msg_len) ||
636
- !CBB_finish(&cbb, NULL, &len)) {
637
- CBB_cleanup(&cbb);
638
- OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
639
- goto err;
640
- }
641
- assert(len == (size_t)frag->msg_header.msg_len + DTLS1_HM_HEADER_LENGTH);
642
-
643
- ssl->d1->handshake_read_seq++;
644
-
645
- /* TODO(davidben): This function has a lot of implicit outputs. Simplify the
646
- * |ssl_get_message| API. */
647
- ssl->s3->tmp.message_type = frag->msg_header.type;
648
- ssl->s3->tmp.message_size = frag->msg_header.msg_len;
649
- ssl->init_msg = (uint8_t *)ssl->init_buf->data + DTLS1_HM_HEADER_LENGTH;
650
- ssl->init_num = frag->msg_header.msg_len;
651
-
652
- if (msg_type >= 0 && ssl->s3->tmp.message_type != msg_type) {
653
- al = SSL_AD_UNEXPECTED_MESSAGE;
654
- OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
655
- goto f_err;
656
- }
657
- if (hash_message == ssl_hash_message && !ssl3_hash_current_message(ssl)) {
658
- goto err;
659
- }
660
- if (ssl->msg_callback) {
661
- ssl->msg_callback(0, ssl->version, SSL3_RT_HANDSHAKE, ssl->init_buf->data,
662
- ssl->init_num + DTLS1_HM_HEADER_LENGTH, ssl,
663
- ssl->msg_callback_arg);
742
+ if (!CBB_finish(cbb, &msg, &len) ||
743
+ len > 0xffffffffu ||
744
+ len < DTLS1_HM_HEADER_LENGTH) {
745
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
746
+ OPENSSL_free(msg);
747
+ return 0;
664
748
  }
665
749
 
666
- pitem_free(item);
667
- dtls1_hm_fragment_free(frag);
750
+ /* Fix up the header. Copy the fragment length into the total message
751
+ * length. */
752
+ memcpy(msg + 1, msg + DTLS1_HM_HEADER_LENGTH - 3, 3);
668
753
 
669
- ssl->state = stn;
670
- *ok = 1;
671
- return ssl->init_num;
754
+ ssl3_update_handshake_hash(ssl, msg, len);
672
755
 
673
- f_err:
674
- ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
675
- err:
676
- pitem_free(item);
677
- dtls1_hm_fragment_free(frag);
678
- *ok = 0;
679
- return -1;
756
+ ssl->d1->handshake_write_seq++;
757
+ ssl->init_off = 0;
758
+ return dtls1_add_message(ssl, msg, len);
680
759
  }
681
760
 
682
- int dtls1_read_failed(SSL *ssl, int code) {
683
- if (code > 0) {
684
- assert(0);
685
- return 1;
686
- }
687
-
688
- if (!dtls1_is_timer_expired(ssl)) {
689
- /* not a timeout, none of our business, let higher layers handle this. In
690
- * fact, it's probably an error */
691
- return code;
761
+ int dtls1_write_message(SSL *ssl) {
762
+ if (ssl->d1->outgoing_messages_len == 0) {
763
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
764
+ return -1;
692
765
  }
693
766
 
694
- if (!SSL_in_init(ssl)) {
695
- /* done, no need to send a retransmit */
696
- BIO_set_flags(SSL_get_rbio(ssl), BIO_FLAGS_READ);
697
- return code;
767
+ const DTLS_OUTGOING_MESSAGE *msg =
768
+ &ssl->d1->outgoing_messages[ssl->d1->outgoing_messages_len - 1];
769
+ if (msg->is_ccs) {
770
+ OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
771
+ return -1;
698
772
  }
699
773
 
700
- return DTLSv1_handle_timeout(ssl);
701
- }
702
-
703
- static uint16_t dtls1_get_queue_priority(uint16_t seq, int is_ccs) {
704
- assert(seq * 2 >= seq);
705
-
706
- /* The index of the retransmission queue actually is the message sequence
707
- * number, since the queue only contains messages of a single handshake.
708
- * However, the ChangeCipherSpec has no message sequence number and so using
709
- * only the sequence will result in the CCS and Finished having the same
710
- * index. To prevent this, the sequence number is multiplied by 2. In case of
711
- * a CCS 1 is subtracted. This does not only differ CSS and Finished, it also
712
- * maintains the order of the index (important for priority queues) and fits
713
- * in the unsigned short variable. */
714
- return seq * 2 - is_ccs;
774
+ size_t offset = ssl->init_off;
775
+ int ret = dtls1_do_handshake_write(ssl, &offset, msg->data, offset, msg->len,
776
+ dtls1_use_current_epoch);
777
+ ssl->init_off = offset;
778
+ return ret;
715
779
  }
716
780
 
717
- static int dtls1_retransmit_message(SSL *ssl, hm_fragment *frag) {
781
+ static int dtls1_retransmit_message(SSL *ssl,
782
+ const DTLS_OUTGOING_MESSAGE *msg) {
718
783
  /* DTLS renegotiation is unsupported, so only epochs 0 (NULL cipher) and 1
719
784
  * (negotiated cipher) exist. */
720
785
  assert(ssl->d1->w_epoch == 0 || ssl->d1->w_epoch == 1);
721
- assert(frag->msg_header.epoch <= ssl->d1->w_epoch);
786
+ assert(msg->epoch <= ssl->d1->w_epoch);
722
787
  enum dtls1_use_epoch_t use_epoch = dtls1_use_current_epoch;
723
- if (ssl->d1->w_epoch == 1 && frag->msg_header.epoch == 0) {
788
+ if (ssl->d1->w_epoch == 1 && msg->epoch == 0) {
724
789
  use_epoch = dtls1_use_previous_epoch;
725
790
  }
726
791
 
727
792
  /* TODO(davidben): This cannot handle non-blocking writes. */
728
793
  int ret;
729
- if (frag->msg_header.is_ccs) {
794
+ if (msg->is_ccs) {
730
795
  ret = dtls1_write_change_cipher_spec(ssl, use_epoch);
731
796
  } else {
732
- /* Restore the message body.
733
- * TODO(davidben): Make this less stateful. */
734
- memcpy(ssl->init_buf->data, frag->fragment,
735
- frag->msg_header.msg_len + DTLS1_HM_HEADER_LENGTH);
736
- ssl->init_num = frag->msg_header.msg_len + DTLS1_HM_HEADER_LENGTH;
737
-
738
- dtls1_set_message_header(ssl, frag->msg_header.type,
739
- frag->msg_header.msg_len, frag->msg_header.seq,
740
- 0, frag->msg_header.frag_len);
741
- ret = dtls1_do_handshake_write(ssl, use_epoch);
797
+ size_t offset = 0;
798
+ ret = dtls1_do_handshake_write(ssl, &offset, msg->data, offset, msg->len,
799
+ use_epoch);
742
800
  }
743
801
 
744
- /* TODO(davidben): Check return value? */
745
- (void)BIO_flush(SSL_get_wbio(ssl));
746
802
  return ret;
747
803
  }
748
804
 
805
+ int dtls1_retransmit_outgoing_messages(SSL *ssl) {
806
+ /* Ensure we are packing handshake messages. */
807
+ const int was_buffered = ssl_is_wbio_buffered(ssl);
808
+ assert(was_buffered == SSL_in_init(ssl));
809
+ if (!was_buffered && !ssl_init_wbio_buffer(ssl)) {
810
+ return -1;
811
+ }
812
+ assert(ssl_is_wbio_buffered(ssl));
749
813
 
750
- int dtls1_retransmit_buffered_messages(SSL *ssl) {
751
- pqueue sent = ssl->d1->sent_messages;
752
- piterator iter = pqueue_iterator(sent);
753
- pitem *item;
754
-
755
- for (item = pqueue_next(&iter); item != NULL; item = pqueue_next(&iter)) {
756
- hm_fragment *frag = (hm_fragment *)item->data;
757
- if (dtls1_retransmit_message(ssl, frag) <= 0) {
758
- return -1;
814
+ int ret = -1;
815
+ for (size_t i = 0; i < ssl->d1->outgoing_messages_len; i++) {
816
+ if (dtls1_retransmit_message(ssl, &ssl->d1->outgoing_messages[i]) <= 0) {
817
+ goto err;
759
818
  }
760
819
  }
761
820
 
762
- return 1;
763
- }
764
-
765
- /* dtls1_buffer_change_cipher_spec adds a ChangeCipherSpec to the current
766
- * handshake flight, ordered just before the handshake message numbered
767
- * |seq|. */
768
- static int dtls1_buffer_change_cipher_spec(SSL *ssl, uint16_t seq) {
769
- hm_fragment *frag = dtls1_hm_fragment_new(0 /* frag_len */,
770
- 0 /* no reassembly */);
771
- if (frag == NULL) {
772
- return 0;
821
+ ret = BIO_flush(ssl->wbio);
822
+ if (ret <= 0) {
823
+ ssl->rwstate = SSL_WRITING;
824
+ goto err;
773
825
  }
774
- frag->msg_header.is_ccs = 1;
775
- frag->msg_header.epoch = ssl->d1->w_epoch;
776
826
 
777
- uint16_t priority = dtls1_get_queue_priority(seq, 1 /* is_ccs */);
778
- uint8_t seq64be[8];
779
- memset(seq64be, 0, sizeof(seq64be));
780
- seq64be[6] = (uint8_t)(priority >> 8);
781
- seq64be[7] = (uint8_t)priority;
782
-
783
- pitem *item = pitem_new(seq64be, frag);
784
- if (item == NULL) {
785
- dtls1_hm_fragment_free(frag);
786
- return 0;
827
+ err:
828
+ if (!was_buffered) {
829
+ ssl_free_wbio_buffer(ssl);
787
830
  }
788
-
789
- pqueue_insert(ssl->d1->sent_messages, item);
790
- return 1;
831
+ return ret;
791
832
  }
792
833
 
793
- int dtls1_buffer_message(SSL *ssl) {
794
- /* this function is called immediately after a message has
795
- * been serialized */
796
- assert(ssl->init_off == 0);
797
-
798
- hm_fragment *frag = dtls1_hm_fragment_new(ssl->init_num, 0);
799
- if (!frag) {
800
- return 0;
801
- }
802
-
803
- memcpy(frag->fragment, ssl->init_buf->data, ssl->init_num);
804
-
805
- assert(ssl->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH ==
806
- (unsigned int)ssl->init_num);
807
-
808
- frag->msg_header.msg_len = ssl->d1->w_msg_hdr.msg_len;
809
- frag->msg_header.seq = ssl->d1->w_msg_hdr.seq;
810
- frag->msg_header.type = ssl->d1->w_msg_hdr.type;
811
- frag->msg_header.frag_off = 0;
812
- frag->msg_header.frag_len = ssl->d1->w_msg_hdr.msg_len;
813
- frag->msg_header.is_ccs = 0;
814
- frag->msg_header.epoch = ssl->d1->w_epoch;
815
-
816
- uint16_t priority = dtls1_get_queue_priority(frag->msg_header.seq,
817
- 0 /* handshake */);
818
- uint8_t seq64be[8];
819
- memset(seq64be, 0, sizeof(seq64be));
820
- seq64be[6] = (uint8_t)(priority >> 8);
821
- seq64be[7] = (uint8_t)priority;
822
-
823
- pitem *item = pitem_new(seq64be, frag);
824
- if (item == NULL) {
825
- dtls1_hm_fragment_free(frag);
826
- return 0;
834
+ int dtls1_send_change_cipher_spec(SSL *ssl) {
835
+ int ret = dtls1_write_change_cipher_spec(ssl, dtls1_use_current_epoch);
836
+ if (ret <= 0) {
837
+ return ret;
827
838
  }
828
-
829
- pqueue_insert(ssl->d1->sent_messages, item);
839
+ dtls1_add_change_cipher_spec(ssl);
830
840
  return 1;
831
841
  }
832
842
 
833
- int dtls1_send_change_cipher_spec(SSL *ssl, int a, int b) {
834
- if (ssl->state == a) {
835
- /* Buffer the message to handle retransmits. */
836
- ssl->d1->handshake_write_seq = ssl->d1->next_handshake_write_seq;
837
- dtls1_buffer_change_cipher_spec(ssl, ssl->d1->handshake_write_seq);
838
- ssl->state = b;
839
- }
840
-
841
- return dtls1_write_change_cipher_spec(ssl, dtls1_use_current_epoch);
842
- }
843
-
844
- /* call this function when the buffered messages are no longer needed */
845
- void dtls1_clear_record_buffer(SSL *ssl) {
846
- pitem *item;
847
-
848
- for (item = pqueue_pop(ssl->d1->sent_messages); item != NULL;
849
- item = pqueue_pop(ssl->d1->sent_messages)) {
850
- dtls1_hm_fragment_free((hm_fragment *)item->data);
851
- pitem_free(item);
852
- }
853
- }
854
-
855
- /* don't actually do the writing, wait till the MTU has been retrieved */
856
- void dtls1_set_message_header(SSL *ssl, uint8_t mt, unsigned long len,
857
- unsigned short seq_num, unsigned long frag_off,
858
- unsigned long frag_len) {
859
- struct hm_header_st *msg_hdr = &ssl->d1->w_msg_hdr;
860
-
861
- msg_hdr->type = mt;
862
- msg_hdr->msg_len = len;
863
- msg_hdr->seq = seq_num;
864
- msg_hdr->frag_off = frag_off;
865
- msg_hdr->frag_len = frag_len;
866
- }
867
-
868
843
  unsigned int dtls1_min_mtu(void) {
869
844
  return kMinMTU;
870
845
  }
871
-
872
- void dtls1_get_message_header(uint8_t *data,
873
- struct hm_header_st *msg_hdr) {
874
- memset(msg_hdr, 0x00, sizeof(struct hm_header_st));
875
- msg_hdr->type = *(data++);
876
- n2l3(data, msg_hdr->msg_len);
877
-
878
- n2s(data, msg_hdr->seq);
879
- n2l3(data, msg_hdr->frag_off);
880
- n2l3(data, msg_hdr->frag_len);
881
- }