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
@@ -64,17 +64,19 @@
64
64
  #if !defined(OPENSSL_NO_ASM) && (defined(OPENSSL_X86) || defined(OPENSSL_X86_64))
65
65
 
66
66
  #include <inttypes.h>
67
- #include <stdlib.h>
68
67
  #include <stdio.h>
68
+ #include <stdlib.h>
69
69
  #include <string.h>
70
70
 
71
71
  #if defined(OPENSSL_WINDOWS)
72
- #pragma warning(push, 3)
72
+ OPENSSL_MSVC_PRAGMA(warning(push, 3))
73
73
  #include <immintrin.h>
74
74
  #include <intrin.h>
75
- #pragma warning(pop)
75
+ OPENSSL_MSVC_PRAGMA(warning(pop))
76
76
  #endif
77
77
 
78
+ #include "internal.h"
79
+
78
80
 
79
81
  /* OPENSSL_cpuid runs the cpuid instruction. |leaf| is passed in as EAX and ECX
80
82
  * is set to zero. It writes EAX, EBX, ECX, and EDX to |*out_eax| through
@@ -1,4 +1,4 @@
1
- /* Copyright (c) 2015, Google Inc.
1
+ /* Copyright (c) 2016, Google Inc.
2
2
  *
3
3
  * Permission to use, copy, modify, and/or distribute this software for any
4
4
  * purpose with or without fee is hereby granted, provided that the above
@@ -12,17 +12,29 @@
12
12
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
13
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
14
 
15
- #ifndef OPENSSL_HEADER_SSL_TEST_SCOPED_TYPES_H
16
- #define OPENSSL_HEADER_SSL_TEST_SCOPED_TYPES_H
15
+ #include <openssl/cpu.h>
17
16
 
18
- #include <openssl/ssl.h>
17
+ #if defined(OPENSSL_PPC64LE)
19
18
 
20
- #include "../../crypto/test/scoped_types.h"
19
+ #include <sys/auxv.h>
21
20
 
21
+ #include "internal.h"
22
22
 
23
- using ScopedSSL = ScopedOpenSSLType<SSL, SSL_free>;
24
- using ScopedSSL_CTX = ScopedOpenSSLType<SSL_CTX, SSL_CTX_free>;
25
- using ScopedSSL_SESSION = ScopedOpenSSLType<SSL_SESSION, SSL_SESSION_free>;
26
23
 
24
+ #if !defined(PPC_FEATURE2_HAS_VCRYPTO)
25
+ /* PPC_FEATURE2_HAS_VCRYPTO was taken from section 4.1.2.3 of the “OpenPOWER
26
+ * ABI for Linux Supplement”. */
27
+ #define PPC_FEATURE2_HAS_VCRYPTO 0x02000000
28
+ #endif
27
29
 
28
- #endif // OPENSSL_HEADER_SSL_TEST_SCOPED_TYPES_H
30
+ static unsigned long g_ppc64le_hwcap2 = 0;
31
+
32
+ void OPENSSL_cpuid_setup(void) {
33
+ g_ppc64le_hwcap2 = getauxval(AT_HWCAP2);
34
+ }
35
+
36
+ int CRYPTO_is_PPC64LE_vcrypto_capable(void) {
37
+ return (g_ppc64le_hwcap2 & PPC_FEATURE2_HAS_VCRYPTO) != 0;
38
+ }
39
+
40
+ #endif /* OPENSSL_PPC64LE */
@@ -21,9 +21,11 @@
21
21
 
22
22
  #if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_STATIC_ARMCAP) && \
23
23
  (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \
24
- defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64))
25
- /* x86, x86_64 and the ARMs need to record the result of a cpuid call for the
26
- * asm to work correctly, unless compiled without asm code. */
24
+ defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) || \
25
+ defined(OPENSSL_PPC64LE))
26
+ /* x86, x86_64, the ARMs and ppc64le need to record the result of a
27
+ * cpuid/getauxval call for the asm to work correctly, unless compiled without
28
+ * asm code. */
27
29
  #define NEED_CPUID
28
30
 
29
31
  #else
@@ -63,7 +65,7 @@ uint32_t OPENSSL_ia32cap_P[4] = {0};
63
65
 
64
66
  uint32_t OPENSSL_armcap_P =
65
67
  #if defined(OPENSSL_STATIC_ARMCAP_NEON) || defined(__ARM_NEON__)
66
- ARMV7_NEON | ARMV7_NEON_FUNCTIONAL |
68
+ ARMV7_NEON |
67
69
  #endif
68
70
  #if defined(OPENSSL_STATIC_ARMCAP_AES)
69
71
  ARMV8_AES |
@@ -79,10 +81,8 @@ uint32_t OPENSSL_armcap_P =
79
81
  #endif
80
82
  0;
81
83
 
82
- #elif defined(__ARM_NEON__)
83
- uint32_t OPENSSL_armcap_P = ARMV7_NEON | ARMV7_NEON_FUNCTIONAL;
84
84
  #else
85
- uint32_t OPENSSL_armcap_P = ARMV7_NEON_FUNCTIONAL;
85
+ uint32_t OPENSSL_armcap_P = 0;
86
86
  #endif
87
87
 
88
88
  #endif
@@ -125,6 +125,22 @@ void CRYPTO_library_init(void) {
125
125
  #endif
126
126
  }
127
127
 
128
+ int CRYPTO_is_confidential_build(void) {
129
+ #if defined(BORINGSSL_CONFIDENTIAL)
130
+ return 1;
131
+ #else
132
+ return 0;
133
+ #endif
134
+ }
135
+
136
+ int CRYPTO_has_asm(void) {
137
+ #if defined(OPENSSL_NO_ASM)
138
+ return 0;
139
+ #else
140
+ return 1;
141
+ #endif
142
+ }
143
+
128
144
  const char *SSLeay_version(int unused) {
129
145
  return "BoringSSL";
130
146
  }
@@ -139,4 +155,10 @@ int CRYPTO_malloc_init(void) {
139
155
 
140
156
  void ENGINE_load_builtin_engines(void) {}
141
157
 
158
+ int ENGINE_register_all_complete(void) {
159
+ return 1;
160
+ }
161
+
142
162
  void OPENSSL_load_builtin_modules(void) {}
163
+
164
+ int FIPS_mode(void) { return 0; }
@@ -31,11 +31,10 @@
31
31
  #include "internal.h"
32
32
 
33
33
 
34
- /* fe means field element. Here the field is \Z/(2^255-19). An element t,
35
- * entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77
36
- * t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on
37
- * context. */
38
- typedef int32_t fe[10];
34
+ static const int64_t kBottom25Bits = INT64_C(0x1ffffff);
35
+ static const int64_t kBottom26Bits = INT64_C(0x3ffffff);
36
+ static const int64_t kTop39Bits = INT64_C(0xfffffffffe000000);
37
+ static const int64_t kTop38Bits = INT64_C(0xfffffffffc000000);
39
38
 
40
39
  static uint64_t load_3(const uint8_t *in) {
41
40
  uint64_t result;
@@ -77,17 +76,17 @@ static void fe_frombytes(fe h, const uint8_t *s) {
77
76
  int64_t carry8;
78
77
  int64_t carry9;
79
78
 
80
- carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;
81
- carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;
82
- carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;
83
- carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;
84
- carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;
79
+ carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
80
+ carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
81
+ carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
82
+ carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
83
+ carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
85
84
 
86
- carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
87
- carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;
88
- carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
89
- carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;
90
- carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;
85
+ carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
86
+ carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
87
+ carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
88
+ carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
89
+ carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
91
90
 
92
91
  h[0] = h0;
93
92
  h[1] = h1;
@@ -135,16 +134,6 @@ static void fe_tobytes(uint8_t *s, const fe h) {
135
134
  int32_t h8 = h[8];
136
135
  int32_t h9 = h[9];
137
136
  int32_t q;
138
- int32_t carry0;
139
- int32_t carry1;
140
- int32_t carry2;
141
- int32_t carry3;
142
- int32_t carry4;
143
- int32_t carry5;
144
- int32_t carry6;
145
- int32_t carry7;
146
- int32_t carry8;
147
- int32_t carry9;
148
137
 
149
138
  q = (19 * h9 + (((int32_t) 1) << 24)) >> 25;
150
139
  q = (h0 + q) >> 26;
@@ -162,16 +151,16 @@ static void fe_tobytes(uint8_t *s, const fe h) {
162
151
  h0 += 19 * q;
163
152
  /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */
164
153
 
165
- carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26;
166
- carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25;
167
- carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26;
168
- carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25;
169
- carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26;
170
- carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25;
171
- carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26;
172
- carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25;
173
- carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26;
174
- carry9 = h9 >> 25; h9 -= carry9 << 25;
154
+ h1 += h0 >> 26; h0 &= kBottom26Bits;
155
+ h2 += h1 >> 25; h1 &= kBottom25Bits;
156
+ h3 += h2 >> 26; h2 &= kBottom26Bits;
157
+ h4 += h3 >> 25; h3 &= kBottom25Bits;
158
+ h5 += h4 >> 26; h4 &= kBottom26Bits;
159
+ h6 += h5 >> 25; h5 &= kBottom25Bits;
160
+ h7 += h6 >> 26; h6 &= kBottom26Bits;
161
+ h8 += h7 >> 25; h7 &= kBottom25Bits;
162
+ h9 += h8 >> 26; h8 &= kBottom26Bits;
163
+ h9 &= kBottom25Bits;
175
164
  /* h10 = carry9 */
176
165
 
177
166
  /* Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
@@ -182,32 +171,32 @@ static void fe_tobytes(uint8_t *s, const fe h) {
182
171
  s[0] = h0 >> 0;
183
172
  s[1] = h0 >> 8;
184
173
  s[2] = h0 >> 16;
185
- s[3] = (h0 >> 24) | (h1 << 2);
174
+ s[3] = (h0 >> 24) | ((uint32_t)(h1) << 2);
186
175
  s[4] = h1 >> 6;
187
176
  s[5] = h1 >> 14;
188
- s[6] = (h1 >> 22) | (h2 << 3);
177
+ s[6] = (h1 >> 22) | ((uint32_t)(h2) << 3);
189
178
  s[7] = h2 >> 5;
190
179
  s[8] = h2 >> 13;
191
- s[9] = (h2 >> 21) | (h3 << 5);
180
+ s[9] = (h2 >> 21) | ((uint32_t)(h3) << 5);
192
181
  s[10] = h3 >> 3;
193
182
  s[11] = h3 >> 11;
194
- s[12] = (h3 >> 19) | (h4 << 6);
183
+ s[12] = (h3 >> 19) | ((uint32_t)(h4) << 6);
195
184
  s[13] = h4 >> 2;
196
185
  s[14] = h4 >> 10;
197
186
  s[15] = h4 >> 18;
198
187
  s[16] = h5 >> 0;
199
188
  s[17] = h5 >> 8;
200
189
  s[18] = h5 >> 16;
201
- s[19] = (h5 >> 24) | (h6 << 1);
190
+ s[19] = (h5 >> 24) | ((uint32_t)(h6) << 1);
202
191
  s[20] = h6 >> 7;
203
192
  s[21] = h6 >> 15;
204
- s[22] = (h6 >> 23) | (h7 << 3);
193
+ s[22] = (h6 >> 23) | ((uint32_t)(h7) << 3);
205
194
  s[23] = h7 >> 5;
206
195
  s[24] = h7 >> 13;
207
- s[25] = (h7 >> 21) | (h8 << 4);
196
+ s[25] = (h7 >> 21) | ((uint32_t)(h8) << 4);
208
197
  s[26] = h8 >> 4;
209
198
  s[27] = h8 >> 12;
210
- s[28] = (h8 >> 20) | (h9 << 6);
199
+ s[28] = (h8 >> 20) | ((uint32_t)(h9) << 6);
211
200
  s[29] = h9 >> 2;
212
201
  s[30] = h9 >> 10;
213
202
  s[31] = h9 >> 18;
@@ -447,46 +436,46 @@ static void fe_mul(fe h, const fe f, const fe g) {
447
436
  * |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19))
448
437
  * i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 */
449
438
 
450
- carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
451
- carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
439
+ carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
440
+ carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
452
441
  /* |h0| <= 2^25 */
453
442
  /* |h4| <= 2^25 */
454
443
  /* |h1| <= 1.71*2^59 */
455
444
  /* |h5| <= 1.71*2^59 */
456
445
 
457
- carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;
458
- carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;
446
+ carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
447
+ carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
459
448
  /* |h1| <= 2^24; from now on fits into int32 */
460
449
  /* |h5| <= 2^24; from now on fits into int32 */
461
450
  /* |h2| <= 1.41*2^60 */
462
451
  /* |h6| <= 1.41*2^60 */
463
452
 
464
- carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;
465
- carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;
453
+ carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
454
+ carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
466
455
  /* |h2| <= 2^25; from now on fits into int32 unchanged */
467
456
  /* |h6| <= 2^25; from now on fits into int32 unchanged */
468
457
  /* |h3| <= 1.71*2^59 */
469
458
  /* |h7| <= 1.71*2^59 */
470
459
 
471
- carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;
472
- carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;
460
+ carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
461
+ carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
473
462
  /* |h3| <= 2^24; from now on fits into int32 unchanged */
474
463
  /* |h7| <= 2^24; from now on fits into int32 unchanged */
475
464
  /* |h4| <= 1.72*2^34 */
476
465
  /* |h8| <= 1.41*2^60 */
477
466
 
478
- carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
479
- carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;
467
+ carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
468
+ carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
480
469
  /* |h4| <= 2^25; from now on fits into int32 unchanged */
481
470
  /* |h8| <= 2^25; from now on fits into int32 unchanged */
482
471
  /* |h5| <= 1.01*2^24 */
483
472
  /* |h9| <= 1.71*2^59 */
484
473
 
485
- carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;
474
+ carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
486
475
  /* |h9| <= 2^24; from now on fits into int32 unchanged */
487
476
  /* |h0| <= 1.1*2^39 */
488
477
 
489
- carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
478
+ carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
490
479
  /* |h0| <= 2^25; from now on fits into int32 unchanged */
491
480
  /* |h1| <= 1.01*2^24 */
492
481
 
@@ -612,24 +601,24 @@ static void fe_sq(fe h, const fe f) {
612
601
  int64_t carry8;
613
602
  int64_t carry9;
614
603
 
615
- carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
616
- carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
604
+ carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
605
+ carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
617
606
 
618
- carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;
619
- carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;
607
+ carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
608
+ carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
620
609
 
621
- carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;
622
- carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;
610
+ carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
611
+ carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
623
612
 
624
- carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;
625
- carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;
613
+ carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
614
+ carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
626
615
 
627
- carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
628
- carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;
616
+ carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
617
+ carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
629
618
 
630
- carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;
619
+ carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
631
620
 
632
- carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
621
+ carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
633
622
 
634
623
  h[0] = h0;
635
624
  h[1] = h1;
@@ -880,24 +869,24 @@ static void fe_sq2(fe h, const fe f) {
880
869
  h8 += h8;
881
870
  h9 += h9;
882
871
 
883
- carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
884
- carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
872
+ carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
873
+ carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
885
874
 
886
- carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;
887
- carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;
875
+ carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
876
+ carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
888
877
 
889
- carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;
890
- carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;
878
+ carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
879
+ carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
891
880
 
892
- carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;
893
- carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;
881
+ carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
882
+ carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
894
883
 
895
- carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
896
- carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;
884
+ carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
885
+ carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
897
886
 
898
- carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;
887
+ carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
899
888
 
900
- carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
889
+ carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
901
890
 
902
891
  h[0] = h0;
903
892
  h[1] = h1;
@@ -974,52 +963,7 @@ static void fe_pow22523(fe out, const fe z) {
974
963
  fe_mul(out, t0, z);
975
964
  }
976
965
 
977
- /* ge means group element.
978
-
979
- * Here the group is the set of pairs (x,y) of field elements (see fe.h)
980
- * satisfying -x^2 + y^2 = 1 + d x^2y^2
981
- * where d = -121665/121666.
982
- *
983
- * Representations:
984
- * ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z
985
- * ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
986
- * ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T
987
- * ge_precomp (Duif): (y+x,y-x,2dxy) */
988
-
989
- typedef struct {
990
- fe X;
991
- fe Y;
992
- fe Z;
993
- } ge_p2;
994
-
995
- typedef struct {
996
- fe X;
997
- fe Y;
998
- fe Z;
999
- fe T;
1000
- } ge_p3;
1001
-
1002
- typedef struct {
1003
- fe X;
1004
- fe Y;
1005
- fe Z;
1006
- fe T;
1007
- } ge_p1p1;
1008
-
1009
- typedef struct {
1010
- fe yplusx;
1011
- fe yminusx;
1012
- fe xy2d;
1013
- } ge_precomp;
1014
-
1015
- typedef struct {
1016
- fe YplusX;
1017
- fe YminusX;
1018
- fe Z;
1019
- fe T2d;
1020
- } ge_cached;
1021
-
1022
- static void ge_tobytes(uint8_t *s, const ge_p2 *h) {
966
+ void x25519_ge_tobytes(uint8_t *s, const ge_p2 *h) {
1023
967
  fe recip;
1024
968
  fe x;
1025
969
  fe y;
@@ -1049,7 +993,7 @@ static const fe d = {-10913610, 13857413, -15372611, 6949391, 114729,
1049
993
  static const fe sqrtm1 = {-32595792, -7943725, 9377950, 3500415, 12389472,
1050
994
  -272473, -25146209, -2005654, 326686, 11406482};
1051
995
 
1052
- static int ge_frombytes_vartime(ge_p3 *h, const uint8_t *s) {
996
+ int x25519_ge_frombytes_vartime(ge_p3 *h, const uint8_t *s) {
1053
997
  fe u;
1054
998
  fe v;
1055
999
  fe v3;
@@ -1105,6 +1049,13 @@ static void ge_p3_0(ge_p3 *h) {
1105
1049
  fe_0(h->T);
1106
1050
  }
1107
1051
 
1052
+ static void ge_cached_0(ge_cached *h) {
1053
+ fe_1(h->YplusX);
1054
+ fe_1(h->YminusX);
1055
+ fe_1(h->Z);
1056
+ fe_0(h->T2d);
1057
+ }
1058
+
1108
1059
  static void ge_precomp_0(ge_precomp *h) {
1109
1060
  fe_1(h->yplusx);
1110
1061
  fe_1(h->yminusx);
@@ -1122,7 +1073,7 @@ static const fe d2 = {-21827239, -5839606, -30745221, 13898782, 229458,
1122
1073
  15978800, -12551817, -6495438, 29715968, 9444199};
1123
1074
 
1124
1075
  /* r = p */
1125
- static void ge_p3_to_cached(ge_cached *r, const ge_p3 *p) {
1076
+ void x25519_ge_p3_to_cached(ge_cached *r, const ge_p3 *p) {
1126
1077
  fe_add(r->YplusX, p->Y, p->X);
1127
1078
  fe_sub(r->YminusX, p->Y, p->X);
1128
1079
  fe_copy(r->Z, p->Z);
@@ -1130,20 +1081,27 @@ static void ge_p3_to_cached(ge_cached *r, const ge_p3 *p) {
1130
1081
  }
1131
1082
 
1132
1083
  /* r = p */
1133
- static void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) {
1084
+ void x25519_ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) {
1134
1085
  fe_mul(r->X, p->X, p->T);
1135
1086
  fe_mul(r->Y, p->Y, p->Z);
1136
1087
  fe_mul(r->Z, p->Z, p->T);
1137
1088
  }
1138
1089
 
1139
1090
  /* r = p */
1140
- static void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) {
1091
+ void x25519_ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) {
1141
1092
  fe_mul(r->X, p->X, p->T);
1142
1093
  fe_mul(r->Y, p->Y, p->Z);
1143
1094
  fe_mul(r->Z, p->Z, p->T);
1144
1095
  fe_mul(r->T, p->X, p->Y);
1145
1096
  }
1146
1097
 
1098
+ /* r = p */
1099
+ static void ge_p1p1_to_cached(ge_cached *r, const ge_p1p1 *p) {
1100
+ ge_p3 t;
1101
+ x25519_ge_p1p1_to_p3(&t, p);
1102
+ x25519_ge_p3_to_cached(r, &t);
1103
+ }
1104
+
1147
1105
  /* r = 2 * p */
1148
1106
  static void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) {
1149
1107
  fe t0;
@@ -1199,7 +1157,7 @@ static void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) {
1199
1157
  }
1200
1158
 
1201
1159
  /* r = p + q */
1202
- static void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
1160
+ void x25519_ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
1203
1161
  fe t0;
1204
1162
 
1205
1163
  fe_add(r->X, p->Y, p->X);
@@ -1216,7 +1174,7 @@ static void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
1216
1174
  }
1217
1175
 
1218
1176
  /* r = p - q */
1219
- static void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
1177
+ void x25519_ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
1220
1178
  fe t0;
1221
1179
 
1222
1180
  fe_add(r->X, p->Y, p->X);
@@ -1242,12 +1200,64 @@ static uint8_t equal(signed char b, signed char c) {
1242
1200
  return y;
1243
1201
  }
1244
1202
 
1245
- static void cmov(ge_precomp *t, ge_precomp *u, uint8_t b) {
1203
+ static void cmov(ge_precomp *t, const ge_precomp *u, uint8_t b) {
1246
1204
  fe_cmov(t->yplusx, u->yplusx, b);
1247
1205
  fe_cmov(t->yminusx, u->yminusx, b);
1248
1206
  fe_cmov(t->xy2d, u->xy2d, b);
1249
1207
  }
1250
1208
 
1209
+ void x25519_ge_scalarmult_small_precomp(
1210
+ ge_p3 *h, const uint8_t a[32], const uint8_t precomp_table[15 * 2 * 32]) {
1211
+ /* precomp_table is first expanded into matching |ge_precomp|
1212
+ * elements. */
1213
+ ge_precomp multiples[15];
1214
+
1215
+ unsigned i;
1216
+ for (i = 0; i < 15; i++) {
1217
+ const uint8_t *bytes = &precomp_table[i*(2 * 32)];
1218
+ fe x, y;
1219
+ fe_frombytes(x, bytes);
1220
+ fe_frombytes(y, bytes + 32);
1221
+
1222
+ ge_precomp *out = &multiples[i];
1223
+ fe_add(out->yplusx, y, x);
1224
+ fe_sub(out->yminusx, y, x);
1225
+ fe_mul(out->xy2d, x, y);
1226
+ fe_mul(out->xy2d, out->xy2d, d2);
1227
+ }
1228
+
1229
+ /* See the comment above |k25519SmallPrecomp| about the structure of the
1230
+ * precomputed elements. This loop does 64 additions and 64 doublings to
1231
+ * calculate the result. */
1232
+ ge_p3_0(h);
1233
+
1234
+ for (i = 63; i < 64; i--) {
1235
+ unsigned j;
1236
+ signed char index = 0;
1237
+
1238
+ for (j = 0; j < 4; j++) {
1239
+ const uint8_t bit = 1 & (a[(8 * j) + (i / 8)] >> (i & 7));
1240
+ index |= (bit << j);
1241
+ }
1242
+
1243
+ ge_precomp e;
1244
+ ge_precomp_0(&e);
1245
+
1246
+ for (j = 1; j < 16; j++) {
1247
+ cmov(&e, &multiples[j-1], equal(index, j));
1248
+ }
1249
+
1250
+ ge_cached cached;
1251
+ ge_p1p1 r;
1252
+ x25519_ge_p3_to_cached(&cached, h);
1253
+ x25519_ge_add(&r, h, &cached);
1254
+ x25519_ge_p1p1_to_p3(h, &r);
1255
+
1256
+ ge_madd(&r, h, &e);
1257
+ x25519_ge_p1p1_to_p3(h, &r);
1258
+ }
1259
+ }
1260
+
1251
1261
  #if defined(OPENSSL_SMALL)
1252
1262
 
1253
1263
  /* This block of code replaces the standard base-point table with a much smaller
@@ -1341,61 +1351,14 @@ static const uint8_t k25519SmallPrecomp[15 * 2 * 32] = {
1341
1351
  0x45, 0xc9, 0x8b, 0x17, 0x79, 0xe7, 0xc7, 0x90, 0x99, 0x3a, 0x18, 0x25,
1342
1352
  };
1343
1353
 
1344
- static void ge_scalarmult_base(ge_p3 *h, const uint8_t a[32]) {
1345
- /* k25519SmallPrecomp is first expanded into matching |ge_precomp|
1346
- * elements. */
1347
- ge_precomp multiples[15];
1348
-
1349
- unsigned i;
1350
- for (i = 0; i < 15; i++) {
1351
- const uint8_t *bytes = &k25519SmallPrecomp[i*(2 * 32)];
1352
- fe x, y;
1353
- fe_frombytes(x, bytes);
1354
- fe_frombytes(y, bytes + 32);
1355
-
1356
- ge_precomp *out = &multiples[i];
1357
- fe_add(out->yplusx, y, x);
1358
- fe_sub(out->yminusx, y, x);
1359
- fe_mul(out->xy2d, x, y);
1360
- fe_mul(out->xy2d, out->xy2d, d2);
1361
- }
1362
-
1363
- /* See the comment above |k25519SmallPrecomp| about the structure of the
1364
- * precomputed elements. This loop does 64 additions and 64 doublings to
1365
- * calculate the result. */
1366
- ge_p3_0(h);
1367
-
1368
- for (i = 63; i < 64; i--) {
1369
- unsigned j;
1370
- signed char index = 0;
1371
-
1372
- for (j = 0; j < 4; j++) {
1373
- const uint8_t bit = 1 & (a[(8 * j) + (i / 8)] >> (i & 7));
1374
- index |= (bit << j);
1375
- }
1376
-
1377
- ge_precomp e;
1378
- ge_precomp_0(&e);
1379
-
1380
- for (j = 1; j < 16; j++) {
1381
- cmov(&e, &multiples[j-1], equal(index, j));
1382
- }
1383
-
1384
- ge_cached cached;
1385
- ge_p1p1 r;
1386
- ge_p3_to_cached(&cached, h);
1387
- ge_add(&r, h, &cached);
1388
- ge_p1p1_to_p3(h, &r);
1389
-
1390
- ge_madd(&r, h, &e);
1391
- ge_p1p1_to_p3(h, &r);
1392
- }
1354
+ void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t a[32]) {
1355
+ x25519_ge_scalarmult_small_precomp(h, a, k25519SmallPrecomp);
1393
1356
  }
1394
1357
 
1395
1358
  #else
1396
1359
 
1397
1360
  /* k25519Precomp[i][j] = (j+1)*256^i*B */
1398
- static ge_precomp k25519Precomp[32][8] = {
1361
+ static const ge_precomp k25519Precomp[32][8] = {
1399
1362
  {
1400
1363
  {
1401
1364
  {25967493, -14356035, 29566456, 3660896, -12694345, 4014787,
@@ -3519,7 +3482,7 @@ static uint8_t negative(signed char b) {
3519
3482
  static void table_select(ge_precomp *t, int pos, signed char b) {
3520
3483
  ge_precomp minust;
3521
3484
  uint8_t bnegative = negative(b);
3522
- uint8_t babs = b - (((-bnegative) & b) << 1);
3485
+ uint8_t babs = b - ((uint8_t)((-bnegative) & b) << 1);
3523
3486
 
3524
3487
  ge_precomp_0(t);
3525
3488
  cmov(t, &k25519Precomp[pos][0], equal(babs, 1));
@@ -3542,7 +3505,7 @@ static void table_select(ge_precomp *t, int pos, signed char b) {
3542
3505
  *
3543
3506
  * Preconditions:
3544
3507
  * a[31] <= 127 */
3545
- static void ge_scalarmult_base(ge_p3 *h, const uint8_t *a) {
3508
+ void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t *a) {
3546
3509
  signed char e[64];
3547
3510
  signed char carry;
3548
3511
  ge_p1p1 r;
@@ -3571,27 +3534,88 @@ static void ge_scalarmult_base(ge_p3 *h, const uint8_t *a) {
3571
3534
  for (i = 1; i < 64; i += 2) {
3572
3535
  table_select(&t, i / 2, e[i]);
3573
3536
  ge_madd(&r, h, &t);
3574
- ge_p1p1_to_p3(h, &r);
3537
+ x25519_ge_p1p1_to_p3(h, &r);
3575
3538
  }
3576
3539
 
3577
3540
  ge_p3_dbl(&r, h);
3578
- ge_p1p1_to_p2(&s, &r);
3541
+ x25519_ge_p1p1_to_p2(&s, &r);
3579
3542
  ge_p2_dbl(&r, &s);
3580
- ge_p1p1_to_p2(&s, &r);
3543
+ x25519_ge_p1p1_to_p2(&s, &r);
3581
3544
  ge_p2_dbl(&r, &s);
3582
- ge_p1p1_to_p2(&s, &r);
3545
+ x25519_ge_p1p1_to_p2(&s, &r);
3583
3546
  ge_p2_dbl(&r, &s);
3584
- ge_p1p1_to_p3(h, &r);
3547
+ x25519_ge_p1p1_to_p3(h, &r);
3585
3548
 
3586
3549
  for (i = 0; i < 64; i += 2) {
3587
3550
  table_select(&t, i / 2, e[i]);
3588
3551
  ge_madd(&r, h, &t);
3589
- ge_p1p1_to_p3(h, &r);
3552
+ x25519_ge_p1p1_to_p3(h, &r);
3590
3553
  }
3591
3554
  }
3592
3555
 
3593
3556
  #endif
3594
3557
 
3558
+ static void cmov_cached(ge_cached *t, ge_cached *u, uint8_t b) {
3559
+ fe_cmov(t->YplusX, u->YplusX, b);
3560
+ fe_cmov(t->YminusX, u->YminusX, b);
3561
+ fe_cmov(t->Z, u->Z, b);
3562
+ fe_cmov(t->T2d, u->T2d, b);
3563
+ }
3564
+
3565
+ /* r = scalar * A.
3566
+ * where a = a[0]+256*a[1]+...+256^31 a[31]. */
3567
+ void x25519_ge_scalarmult(ge_p2 *r, const uint8_t *scalar, const ge_p3 *A) {
3568
+ ge_p2 Ai_p2[8];
3569
+ ge_cached Ai[16];
3570
+ ge_p1p1 t;
3571
+
3572
+ ge_cached_0(&Ai[0]);
3573
+ x25519_ge_p3_to_cached(&Ai[1], A);
3574
+ ge_p3_to_p2(&Ai_p2[1], A);
3575
+
3576
+ unsigned i;
3577
+ for (i = 2; i < 16; i += 2) {
3578
+ ge_p2_dbl(&t, &Ai_p2[i / 2]);
3579
+ ge_p1p1_to_cached(&Ai[i], &t);
3580
+ if (i < 8) {
3581
+ x25519_ge_p1p1_to_p2(&Ai_p2[i], &t);
3582
+ }
3583
+ x25519_ge_add(&t, A, &Ai[i]);
3584
+ ge_p1p1_to_cached(&Ai[i + 1], &t);
3585
+ if (i < 7) {
3586
+ x25519_ge_p1p1_to_p2(&Ai_p2[i + 1], &t);
3587
+ }
3588
+ }
3589
+
3590
+ ge_p2_0(r);
3591
+ ge_p3 u;
3592
+
3593
+ for (i = 0; i < 256; i += 4) {
3594
+ ge_p2_dbl(&t, r);
3595
+ x25519_ge_p1p1_to_p2(r, &t);
3596
+ ge_p2_dbl(&t, r);
3597
+ x25519_ge_p1p1_to_p2(r, &t);
3598
+ ge_p2_dbl(&t, r);
3599
+ x25519_ge_p1p1_to_p2(r, &t);
3600
+ ge_p2_dbl(&t, r);
3601
+ x25519_ge_p1p1_to_p3(&u, &t);
3602
+
3603
+ uint8_t index = scalar[31 - i/8];
3604
+ index >>= 4 - (i & 4);
3605
+ index &= 0xf;
3606
+
3607
+ unsigned j;
3608
+ ge_cached selected;
3609
+ ge_cached_0(&selected);
3610
+ for (j = 0; j < 16; j++) {
3611
+ cmov_cached(&selected, &Ai[j], equal(j, index));
3612
+ }
3613
+
3614
+ x25519_ge_add(&t, &u, &selected);
3615
+ x25519_ge_p1p1_to_p2(r, &t);
3616
+ }
3617
+ }
3618
+
3595
3619
  static void slide(signed char *r, const uint8_t *a) {
3596
3620
  int i;
3597
3621
  int b;
@@ -3626,7 +3650,7 @@ static void slide(signed char *r, const uint8_t *a) {
3626
3650
  }
3627
3651
  }
3628
3652
 
3629
- static ge_precomp Bi[8] = {
3653
+ static const ge_precomp Bi[8] = {
3630
3654
  {
3631
3655
  {25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626,
3632
3656
  -11754271, -6079156, 2047605},
@@ -3697,8 +3721,8 @@ static ge_precomp Bi[8] = {
3697
3721
  * where a = a[0]+256*a[1]+...+256^31 a[31].
3698
3722
  * and b = b[0]+256*b[1]+...+256^31 b[31].
3699
3723
  * B is the Ed25519 base point (x,4/5) with x positive. */
3700
- void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a,
3701
- const ge_p3 *A, const uint8_t *b) {
3724
+ static void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a,
3725
+ const ge_p3 *A, const uint8_t *b) {
3702
3726
  signed char aslide[256];
3703
3727
  signed char bslide[256];
3704
3728
  ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */
@@ -3710,30 +3734,30 @@ void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a,
3710
3734
  slide(aslide, a);
3711
3735
  slide(bslide, b);
3712
3736
 
3713
- ge_p3_to_cached(&Ai[0], A);
3737
+ x25519_ge_p3_to_cached(&Ai[0], A);
3714
3738
  ge_p3_dbl(&t, A);
3715
- ge_p1p1_to_p3(&A2, &t);
3716
- ge_add(&t, &A2, &Ai[0]);
3717
- ge_p1p1_to_p3(&u, &t);
3718
- ge_p3_to_cached(&Ai[1], &u);
3719
- ge_add(&t, &A2, &Ai[1]);
3720
- ge_p1p1_to_p3(&u, &t);
3721
- ge_p3_to_cached(&Ai[2], &u);
3722
- ge_add(&t, &A2, &Ai[2]);
3723
- ge_p1p1_to_p3(&u, &t);
3724
- ge_p3_to_cached(&Ai[3], &u);
3725
- ge_add(&t, &A2, &Ai[3]);
3726
- ge_p1p1_to_p3(&u, &t);
3727
- ge_p3_to_cached(&Ai[4], &u);
3728
- ge_add(&t, &A2, &Ai[4]);
3729
- ge_p1p1_to_p3(&u, &t);
3730
- ge_p3_to_cached(&Ai[5], &u);
3731
- ge_add(&t, &A2, &Ai[5]);
3732
- ge_p1p1_to_p3(&u, &t);
3733
- ge_p3_to_cached(&Ai[6], &u);
3734
- ge_add(&t, &A2, &Ai[6]);
3735
- ge_p1p1_to_p3(&u, &t);
3736
- ge_p3_to_cached(&Ai[7], &u);
3739
+ x25519_ge_p1p1_to_p3(&A2, &t);
3740
+ x25519_ge_add(&t, &A2, &Ai[0]);
3741
+ x25519_ge_p1p1_to_p3(&u, &t);
3742
+ x25519_ge_p3_to_cached(&Ai[1], &u);
3743
+ x25519_ge_add(&t, &A2, &Ai[1]);
3744
+ x25519_ge_p1p1_to_p3(&u, &t);
3745
+ x25519_ge_p3_to_cached(&Ai[2], &u);
3746
+ x25519_ge_add(&t, &A2, &Ai[2]);
3747
+ x25519_ge_p1p1_to_p3(&u, &t);
3748
+ x25519_ge_p3_to_cached(&Ai[3], &u);
3749
+ x25519_ge_add(&t, &A2, &Ai[3]);
3750
+ x25519_ge_p1p1_to_p3(&u, &t);
3751
+ x25519_ge_p3_to_cached(&Ai[4], &u);
3752
+ x25519_ge_add(&t, &A2, &Ai[4]);
3753
+ x25519_ge_p1p1_to_p3(&u, &t);
3754
+ x25519_ge_p3_to_cached(&Ai[5], &u);
3755
+ x25519_ge_add(&t, &A2, &Ai[5]);
3756
+ x25519_ge_p1p1_to_p3(&u, &t);
3757
+ x25519_ge_p3_to_cached(&Ai[6], &u);
3758
+ x25519_ge_add(&t, &A2, &Ai[6]);
3759
+ x25519_ge_p1p1_to_p3(&u, &t);
3760
+ x25519_ge_p3_to_cached(&Ai[7], &u);
3737
3761
 
3738
3762
  ge_p2_0(r);
3739
3763
 
@@ -3747,22 +3771,22 @@ void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a,
3747
3771
  ge_p2_dbl(&t, r);
3748
3772
 
3749
3773
  if (aslide[i] > 0) {
3750
- ge_p1p1_to_p3(&u, &t);
3751
- ge_add(&t, &u, &Ai[aslide[i] / 2]);
3774
+ x25519_ge_p1p1_to_p3(&u, &t);
3775
+ x25519_ge_add(&t, &u, &Ai[aslide[i] / 2]);
3752
3776
  } else if (aslide[i] < 0) {
3753
- ge_p1p1_to_p3(&u, &t);
3754
- ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
3777
+ x25519_ge_p1p1_to_p3(&u, &t);
3778
+ x25519_ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
3755
3779
  }
3756
3780
 
3757
3781
  if (bslide[i] > 0) {
3758
- ge_p1p1_to_p3(&u, &t);
3782
+ x25519_ge_p1p1_to_p3(&u, &t);
3759
3783
  ge_madd(&t, &u, &Bi[bslide[i] / 2]);
3760
3784
  } else if (bslide[i] < 0) {
3761
- ge_p1p1_to_p3(&u, &t);
3785
+ x25519_ge_p1p1_to_p3(&u, &t);
3762
3786
  ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]);
3763
3787
  }
3764
3788
 
3765
- ge_p1p1_to_p2(r, &t);
3789
+ x25519_ge_p1p1_to_p2(r, &t);
3766
3790
  }
3767
3791
  }
3768
3792
 
@@ -3776,7 +3800,7 @@ void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a,
3776
3800
  * s[0]+256*s[1]+...+256^31*s[31] = s mod l
3777
3801
  * where l = 2^252 + 27742317777372353535851937790883648493.
3778
3802
  * Overwrites s in place. */
3779
- static void sc_reduce(uint8_t *s) {
3803
+ void x25519_sc_reduce(uint8_t *s) {
3780
3804
  int64_t s0 = 2097151 & load_3(s);
3781
3805
  int64_t s1 = 2097151 & (load_4(s + 2) >> 5);
3782
3806
  int64_t s2 = 2097151 & (load_3(s + 5) >> 2);
@@ -4610,7 +4634,7 @@ void ED25519_keypair(uint8_t out_public_key[32], uint8_t out_private_key[64]) {
4610
4634
  az[31] |= 64;
4611
4635
 
4612
4636
  ge_p3 A;
4613
- ge_scalarmult_base(&A, az);
4637
+ x25519_ge_scalarmult_base(&A, az);
4614
4638
  ge_p3_tobytes(out_public_key, &A);
4615
4639
 
4616
4640
  memcpy(out_private_key, seed, 32);
@@ -4633,9 +4657,9 @@ int ED25519_sign(uint8_t *out_sig, const uint8_t *message, size_t message_len,
4633
4657
  uint8_t nonce[SHA512_DIGEST_LENGTH];
4634
4658
  SHA512_Final(nonce, &hash_ctx);
4635
4659
 
4636
- sc_reduce(nonce);
4660
+ x25519_sc_reduce(nonce);
4637
4661
  ge_p3 R;
4638
- ge_scalarmult_base(&R, nonce);
4662
+ x25519_ge_scalarmult_base(&R, nonce);
4639
4663
  ge_p3_tobytes(out_sig, &R);
4640
4664
 
4641
4665
  SHA512_Init(&hash_ctx);
@@ -4645,7 +4669,7 @@ int ED25519_sign(uint8_t *out_sig, const uint8_t *message, size_t message_len,
4645
4669
  uint8_t hram[SHA512_DIGEST_LENGTH];
4646
4670
  SHA512_Final(hram, &hash_ctx);
4647
4671
 
4648
- sc_reduce(hram);
4672
+ x25519_sc_reduce(hram);
4649
4673
  sc_muladd(out_sig + 32, hram, az, nonce);
4650
4674
 
4651
4675
  return 1;
@@ -4655,7 +4679,7 @@ int ED25519_verify(const uint8_t *message, size_t message_len,
4655
4679
  const uint8_t signature[64], const uint8_t public_key[32]) {
4656
4680
  ge_p3 A;
4657
4681
  if ((signature[63] & 224) != 0 ||
4658
- ge_frombytes_vartime(&A, public_key) != 0) {
4682
+ x25519_ge_frombytes_vartime(&A, public_key) != 0) {
4659
4683
  return 0;
4660
4684
  }
4661
4685
 
@@ -4677,13 +4701,13 @@ int ED25519_verify(const uint8_t *message, size_t message_len,
4677
4701
  uint8_t h[SHA512_DIGEST_LENGTH];
4678
4702
  SHA512_Final(h, &hash_ctx);
4679
4703
 
4680
- sc_reduce(h);
4704
+ x25519_sc_reduce(h);
4681
4705
 
4682
4706
  ge_p2 R;
4683
4707
  ge_double_scalarmult_vartime(&R, h, &A, scopy);
4684
4708
 
4685
4709
  uint8_t rcheck[32];
4686
- ge_tobytes(rcheck, &R);
4710
+ x25519_ge_tobytes(rcheck, &R);
4687
4711
 
4688
4712
  return CRYPTO_memcmp(rcheck, rcopy, sizeof(rcheck)) == 0;
4689
4713
  }
@@ -4753,17 +4777,17 @@ static void fe_mul121666(fe h, fe f) {
4753
4777
  int64_t carry8;
4754
4778
  int64_t carry9;
4755
4779
 
4756
- carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;
4757
- carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;
4758
- carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;
4759
- carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;
4760
- carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;
4780
+ carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
4781
+ carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
4782
+ carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
4783
+ carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
4784
+ carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
4761
4785
 
4762
- carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;
4763
- carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;
4764
- carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;
4765
- carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;
4766
- carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;
4786
+ carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
4787
+ carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
4788
+ carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
4789
+ carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
4790
+ carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
4767
4791
 
4768
4792
  h[0] = h0;
4769
4793
  h[1] = h1;
@@ -4845,6 +4869,24 @@ static void x25519_scalar_mult(uint8_t out[32], const uint8_t scalar[32],
4845
4869
 
4846
4870
  void X25519_keypair(uint8_t out_public_value[32], uint8_t out_private_key[32]) {
4847
4871
  RAND_bytes(out_private_key, 32);
4872
+
4873
+ /* All X25519 implementations should decode scalars correctly (see
4874
+ * https://tools.ietf.org/html/rfc7748#section-5). However, if an
4875
+ * implementation doesn't then it might interoperate with random keys a
4876
+ * fraction of the time because they'll, randomly, happen to be correctly
4877
+ * formed.
4878
+ *
4879
+ * Thus we do the opposite of the masking here to make sure that our private
4880
+ * keys are never correctly masked and so, hopefully, any incorrect
4881
+ * implementations are deterministically broken.
4882
+ *
4883
+ * This does not affect security because, although we're throwing away
4884
+ * entropy, a valid implementation of scalarmult should throw away the exact
4885
+ * same bits anyway. */
4886
+ out_private_key[0] |= 7;
4887
+ out_private_key[31] &= 63;
4888
+ out_private_key[31] |= 128;
4889
+
4848
4890
  X25519_public_from_private(out_public_value, out_private_key);
4849
4891
  }
4850
4892
 
@@ -4887,7 +4929,7 @@ void X25519_public_from_private(uint8_t out_public_value[32],
4887
4929
  e[31] |= 64;
4888
4930
 
4889
4931
  ge_p3 A;
4890
- ge_scalarmult_base(&A, e);
4932
+ x25519_ge_scalarmult_base(&A, e);
4891
4933
 
4892
4934
  /* We only need the u-coordinate of the curve25519 point. The map is
4893
4935
  * u=(y+1)/(1-y). Since y=Y/Z, this gives u=(Z+Y)/(Z-Y). */