grpc 0.13.1 → 0.14.1.pre1

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 (724) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +2098 -828
  3. data/include/grpc/byte_buffer.h +1 -1
  4. data/include/grpc/byte_buffer_reader.h +1 -20
  5. data/include/grpc/census.h +4 -4
  6. data/include/grpc/compression.h +6 -5
  7. data/include/grpc/grpc.h +31 -20
  8. data/include/grpc/grpc_security.h +17 -31
  9. data/include/grpc/grpc_security_constants.h +114 -0
  10. data/include/grpc/grpc_zookeeper.h +1 -1
  11. data/include/grpc/impl/codegen/alloc.h +1 -1
  12. data/include/grpc/impl/codegen/atm.h +1 -1
  13. data/include/grpc/impl/codegen/atm_gcc_atomic.h +1 -1
  14. data/include/grpc/impl/codegen/atm_gcc_sync.h +1 -1
  15. data/include/grpc/impl/codegen/atm_win32.h +1 -1
  16. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  17. data/{src/core/client_config/lb_policies/round_robin.h → include/grpc/impl/codegen/byte_buffer_reader.h} +19 -8
  18. data/include/grpc/impl/codegen/grpc_types.h +20 -3
  19. data/include/grpc/impl/codegen/log.h +9 -2
  20. data/include/grpc/impl/codegen/port_platform.h +102 -17
  21. data/include/grpc/impl/codegen/propagation_bits.h +3 -3
  22. data/include/grpc/impl/codegen/slice.h +3 -3
  23. data/include/grpc/impl/codegen/slice_buffer.h +3 -3
  24. data/include/grpc/impl/codegen/status.h +1 -1
  25. data/include/grpc/impl/codegen/sync_generic.h +1 -1
  26. data/include/grpc/impl/codegen/sync_posix.h +1 -1
  27. data/include/grpc/impl/codegen/sync_win32.h +1 -1
  28. data/include/grpc/impl/codegen/time.h +3 -3
  29. data/include/grpc/status.h +1 -1
  30. data/include/grpc/support/alloc.h +1 -1
  31. data/include/grpc/support/atm.h +1 -1
  32. data/include/grpc/support/atm_gcc_atomic.h +4 -4
  33. data/include/grpc/support/atm_gcc_sync.h +1 -1
  34. data/include/grpc/support/atm_win32.h +1 -1
  35. data/include/grpc/support/avl.h +1 -1
  36. data/include/grpc/support/cmdline.h +1 -1
  37. data/include/grpc/support/cpu.h +1 -1
  38. data/include/grpc/support/histogram.h +1 -1
  39. data/include/grpc/support/host_port.h +1 -1
  40. data/include/grpc/support/log.h +1 -1
  41. data/include/grpc/support/log_win32.h +1 -1
  42. data/include/grpc/support/port_platform.h +1 -1
  43. data/include/grpc/support/slice.h +1 -1
  44. data/include/grpc/support/slice_buffer.h +1 -1
  45. data/include/grpc/support/string_util.h +3 -1
  46. data/include/grpc/support/subprocess.h +2 -2
  47. data/include/grpc/support/sync.h +1 -1
  48. data/include/grpc/support/sync_generic.h +1 -1
  49. data/include/grpc/support/sync_posix.h +1 -1
  50. data/include/grpc/support/sync_win32.h +1 -1
  51. data/include/grpc/support/thd.h +1 -1
  52. data/include/grpc/support/time.h +1 -1
  53. data/include/grpc/support/tls.h +1 -1
  54. data/include/grpc/support/tls_gcc.h +45 -1
  55. data/include/grpc/support/tls_msvc.h +3 -3
  56. data/include/grpc/support/tls_pthread.h +1 -1
  57. data/include/grpc/support/useful.h +1 -1
  58. data/src/boringssl/err_data.c +258 -252
  59. data/src/core/{census → ext/census}/aggregation.h +3 -3
  60. data/src/core/{statistics → ext/census}/census_interface.h +3 -3
  61. data/src/core/{statistics → ext/census}/census_rpc_stats.h +4 -4
  62. data/src/core/{census → ext/census}/context.c +2 -2
  63. data/src/core/{census → ext/census}/grpc_context.c +2 -2
  64. data/src/core/{census → ext/census}/grpc_filter.c +30 -16
  65. data/src/core/{census → ext/census}/grpc_filter.h +4 -4
  66. data/src/core/ext/census/grpc_plugin.c +82 -0
  67. data/src/core/{census → ext/census}/initialize.c +1 -1
  68. data/src/core/{census → ext/census}/mlog.c +2 -2
  69. data/src/core/{census → ext/census}/mlog.h +4 -4
  70. data/src/core/{census → ext/census}/operation.c +0 -0
  71. data/src/core/{census → ext/census}/placeholders.c +0 -0
  72. data/src/core/{census → ext/census}/rpc_metric_id.h +3 -3
  73. data/src/core/{census → ext/census}/tracing.c +0 -0
  74. data/src/core/{surface → ext/client_config}/channel_connectivity.c +8 -21
  75. data/src/core/{channel → ext/client_config}/client_channel.c +80 -35
  76. data/src/core/{channel → ext/client_config}/client_channel.h +5 -5
  77. data/src/core/{client_config/subchannel_factory.c → ext/client_config/client_channel_factory.c} +14 -6
  78. data/src/core/ext/client_config/client_channel_factory.h +85 -0
  79. data/src/core/{client_config → ext/client_config}/client_config.c +4 -2
  80. data/src/core/{client_config → ext/client_config}/client_config.h +4 -4
  81. data/src/core/ext/client_config/client_config_plugin.c +95 -0
  82. data/src/core/{client_config → ext/client_config}/connector.c +2 -2
  83. data/src/core/{client_config → ext/client_config}/connector.h +7 -10
  84. data/src/core/{client_config → ext/client_config}/default_initial_connect_string.c +1 -1
  85. data/src/core/{client_config → ext/client_config}/initial_connect_string.c +1 -1
  86. data/src/core/{client_config → ext/client_config}/initial_connect_string.h +4 -4
  87. data/src/core/{client_config → ext/client_config}/lb_policy.c +12 -3
  88. data/src/core/{client_config → ext/client_config}/lb_policy.h +19 -6
  89. data/src/core/{client_config → ext/client_config}/lb_policy_factory.c +4 -3
  90. data/src/core/{client_config → ext/client_config}/lb_policy_factory.h +14 -9
  91. data/src/core/{client_config → ext/client_config}/lb_policy_registry.c +4 -9
  92. data/src/core/{client_config → ext/client_config}/lb_policy_registry.h +7 -6
  93. data/src/core/ext/client_config/parse_address.c +137 -0
  94. data/src/core/ext/client_config/parse_address.h +56 -0
  95. data/src/core/{client_config → ext/client_config}/resolver.c +1 -1
  96. data/src/core/{client_config → ext/client_config}/resolver.h +6 -6
  97. data/src/core/{client_config → ext/client_config}/resolver_factory.c +1 -1
  98. data/src/core/{client_config → ext/client_config}/resolver_factory.h +7 -7
  99. data/src/core/{client_config → ext/client_config}/resolver_registry.c +25 -11
  100. data/src/core/{client_config → ext/client_config}/resolver_registry.h +9 -5
  101. data/src/core/{client_config → ext/client_config}/subchannel.c +90 -126
  102. data/src/core/{client_config → ext/client_config}/subchannel.h +15 -15
  103. data/src/core/{channel → ext/client_config}/subchannel_call_holder.c +9 -8
  104. data/src/core/{channel → ext/client_config}/subchannel_call_holder.h +7 -7
  105. data/src/core/{client_config → ext/client_config}/subchannel_index.c +3 -2
  106. data/src/core/{client_config → ext/client_config}/subchannel_index.h +5 -5
  107. data/src/core/{client_config → ext/client_config}/uri_parser.c +69 -1
  108. data/src/core/{client_config → ext/client_config}/uri_parser.h +15 -3
  109. data/src/core/{client_config/lb_policies → ext/lb_policy/grpclb}/load_balancer_api.c +18 -9
  110. data/src/core/{client_config/lb_policies → ext/lb_policy/grpclb}/load_balancer_api.h +5 -5
  111. data/src/core/{proto → ext/lb_policy/grpclb/proto}/grpc/lb/v0/load_balancer.pb.c +1 -1
  112. data/src/core/{proto → ext/lb_policy/grpclb/proto}/grpc/lb/v0/load_balancer.pb.h +0 -0
  113. data/src/core/{client_config/lb_policies → ext/lb_policy/pick_first}/pick_first.c +95 -32
  114. data/src/core/{client_config/lb_policies → ext/lb_policy/round_robin}/round_robin.c +98 -34
  115. data/src/core/{client_config/resolvers → ext/resolver/dns/native}/dns_resolver.c +83 -39
  116. data/src/core/{client_config/resolvers → ext/resolver/sockaddr}/sockaddr_resolver.c +66 -169
  117. data/src/core/{transport/chttp2 → ext/transport/chttp2/alpn}/alpn.c +1 -1
  118. data/src/core/{transport/chttp2 → ext/transport/chttp2/alpn}/alpn.h +3 -3
  119. data/src/core/{surface → ext/transport/chttp2/client/insecure}/channel_create.c +65 -59
  120. data/src/core/{surface → ext/transport/chttp2/client/secure}/secure_channel_create.c +77 -69
  121. data/src/core/{surface → ext/transport/chttp2/server/insecure}/server_chttp2.c +8 -11
  122. data/src/core/{security → ext/transport/chttp2/server/secure}/server_secure_chttp2.c +14 -17
  123. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/bin_encoder.c +28 -74
  124. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/bin_encoder.h +5 -5
  125. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +46 -0
  126. data/src/core/{transport → ext/transport/chttp2/transport}/chttp2_transport.c +551 -310
  127. data/src/core/{transport → ext/transport/chttp2/transport}/chttp2_transport.h +5 -5
  128. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame.h +3 -3
  129. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_data.c +30 -14
  130. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_data.h +10 -7
  131. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_goaway.c +2 -2
  132. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_goaway.h +5 -5
  133. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_ping.c +2 -2
  134. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_ping.h +5 -5
  135. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_rst_stream.c +9 -5
  136. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_rst_stream.h +8 -6
  137. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_settings.c +6 -6
  138. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_settings.h +5 -5
  139. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_window_update.c +11 -5
  140. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_window_update.h +8 -6
  141. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_encoder.c +21 -12
  142. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_encoder.h +8 -6
  143. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_parser.c +42 -25
  144. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_parser.h +7 -7
  145. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_table.c +21 -11
  146. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_table.h +4 -4
  147. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/http2_errors.h +3 -3
  148. data/src/core/ext/transport/chttp2/transport/huffsyms.c +105 -0
  149. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/huffsyms.h +3 -3
  150. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/incoming_metadata.c +2 -2
  151. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/incoming_metadata.h +4 -4
  152. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/internal.h +81 -37
  153. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/parsing.c +54 -21
  154. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/status_conversion.c +1 -1
  155. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/status_conversion.h +4 -4
  156. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_lists.c +10 -2
  157. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_map.c +1 -1
  158. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_map.h +3 -3
  159. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/timeout_encoding.c +4 -4
  160. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/timeout_encoding.h +4 -4
  161. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/varint.c +1 -1
  162. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/varint.h +3 -3
  163. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/writing.c +30 -20
  164. data/src/core/{channel → lib/channel}/channel_args.c +3 -15
  165. data/src/core/{channel → lib/channel}/channel_args.h +11 -15
  166. data/src/core/{channel → lib/channel}/channel_stack.c +5 -3
  167. data/src/core/{channel → lib/channel}/channel_stack.h +13 -8
  168. data/src/core/lib/channel/channel_stack_builder.c +277 -0
  169. data/src/core/lib/channel/channel_stack_builder.h +161 -0
  170. data/src/core/{channel → lib/channel}/compress_filter.c +51 -16
  171. data/src/core/{channel → lib/channel}/compress_filter.h +6 -4
  172. data/src/core/{channel → lib/channel}/connected_channel.c +34 -24
  173. data/src/core/lib/channel/connected_channel.h +42 -0
  174. data/src/core/{channel → lib/channel}/context.h +3 -3
  175. data/src/core/{channel → lib/channel}/http_client_filter.c +24 -13
  176. data/src/core/{channel → lib/channel}/http_client_filter.h +4 -4
  177. data/src/core/{channel → lib/channel}/http_server_filter.c +39 -19
  178. data/src/core/{channel → lib/channel}/http_server_filter.h +4 -4
  179. data/src/core/{compression → lib/compression}/algorithm_metadata.h +4 -4
  180. data/src/core/{compression → lib/compression}/compression_algorithm.c +46 -9
  181. data/src/core/{compression → lib/compression}/message_compress.c +1 -1
  182. data/src/core/{compression → lib/compression}/message_compress.h +3 -3
  183. data/src/core/{debug → lib/debug}/trace.c +2 -2
  184. data/src/core/{debug → lib/debug}/trace.h +3 -3
  185. data/src/core/{httpcli → lib/http}/format_request.c +8 -8
  186. data/src/core/{httpcli → lib/http}/format_request.h +4 -4
  187. data/src/core/{httpcli → lib/http}/httpcli.c +24 -19
  188. data/src/core/{httpcli → lib/http}/httpcli.h +14 -33
  189. data/src/core/{httpcli → lib/http}/httpcli_security_connector.c +5 -5
  190. data/src/core/lib/http/parser.c +341 -0
  191. data/src/core/lib/http/parser.h +119 -0
  192. data/src/core/{iomgr → lib/iomgr}/closure.c +8 -2
  193. data/src/core/{iomgr → lib/iomgr}/closure.h +7 -4
  194. data/src/core/{iomgr → lib/iomgr}/endpoint.c +1 -1
  195. data/src/core/{iomgr → lib/iomgr}/endpoint.h +5 -5
  196. data/src/core/{iomgr → lib/iomgr}/endpoint_pair.h +4 -4
  197. data/src/core/{iomgr → lib/iomgr}/endpoint_pair_posix.c +8 -7
  198. data/src/core/{iomgr → lib/iomgr}/endpoint_pair_windows.c +4 -4
  199. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +1936 -0
  200. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.h +41 -0
  201. data/src/core/lib/iomgr/ev_posix.c +164 -0
  202. data/src/core/lib/iomgr/ev_posix.h +158 -0
  203. data/src/core/{iomgr → lib/iomgr}/exec_ctx.c +78 -3
  204. data/src/core/{iomgr → lib/iomgr}/exec_ctx.h +25 -10
  205. data/src/core/{iomgr → lib/iomgr}/executor.c +3 -3
  206. data/src/core/{iomgr → lib/iomgr}/executor.h +5 -5
  207. data/src/core/{iomgr → lib/iomgr}/iocp_windows.c +6 -6
  208. data/src/core/{iomgr → lib/iomgr}/iocp_windows.h +5 -5
  209. data/src/core/{iomgr → lib/iomgr}/iomgr.c +13 -10
  210. data/src/core/{iomgr → lib/iomgr}/iomgr.h +3 -3
  211. data/src/core/{iomgr → lib/iomgr}/iomgr_internal.h +5 -9
  212. data/src/core/{iomgr → lib/iomgr}/iomgr_posix.c +6 -6
  213. data/src/core/{iomgr → lib/iomgr}/iomgr_posix.h +4 -4
  214. data/src/core/{iomgr → lib/iomgr}/iomgr_windows.c +7 -4
  215. data/src/core/{iomgr → lib/iomgr}/pollset.h +11 -11
  216. data/src/core/{iomgr → lib/iomgr}/pollset_set.h +5 -5
  217. data/src/core/{iomgr → lib/iomgr}/pollset_set_windows.c +2 -2
  218. data/src/core/lib/iomgr/pollset_set_windows.h +39 -0
  219. data/src/core/{iomgr → lib/iomgr}/pollset_windows.c +7 -7
  220. data/src/core/{iomgr → lib/iomgr}/pollset_windows.h +8 -5
  221. data/src/core/{iomgr → lib/iomgr}/resolve_address.h +10 -9
  222. data/src/core/{iomgr → lib/iomgr}/resolve_address_posix.c +22 -22
  223. data/src/core/{iomgr → lib/iomgr}/resolve_address_windows.c +20 -12
  224. data/src/core/{iomgr → lib/iomgr}/sockaddr.h +5 -5
  225. data/src/core/{iomgr → lib/iomgr}/sockaddr_posix.h +5 -5
  226. data/src/core/{iomgr → lib/iomgr}/sockaddr_utils.c +9 -16
  227. data/src/core/{iomgr → lib/iomgr}/sockaddr_utils.h +4 -4
  228. data/src/core/{iomgr → lib/iomgr}/sockaddr_win32.h +6 -4
  229. data/src/core/{iomgr → lib/iomgr}/socket_utils_common_posix.c +29 -7
  230. data/src/core/{iomgr → lib/iomgr}/socket_utils_linux.c +2 -2
  231. data/src/core/{iomgr → lib/iomgr}/socket_utils_posix.c +1 -1
  232. data/src/core/{iomgr → lib/iomgr}/socket_utils_posix.h +14 -4
  233. data/src/core/{iomgr → lib/iomgr}/socket_windows.c +7 -5
  234. data/src/core/{iomgr → lib/iomgr}/socket_windows.h +6 -6
  235. data/src/core/{iomgr → lib/iomgr}/tcp_client.h +6 -6
  236. data/src/core/{iomgr → lib/iomgr}/tcp_client_posix.c +33 -18
  237. data/src/core/{iomgr → lib/iomgr}/tcp_client_windows.c +30 -20
  238. data/src/core/{iomgr → lib/iomgr}/tcp_posix.c +9 -10
  239. data/src/core/{iomgr → lib/iomgr}/tcp_posix.h +6 -6
  240. data/src/core/{iomgr → lib/iomgr}/tcp_server.h +6 -6
  241. data/src/core/{iomgr → lib/iomgr}/tcp_server_posix.c +24 -37
  242. data/src/core/{iomgr → lib/iomgr}/tcp_server_windows.c +8 -36
  243. data/src/core/{iomgr → lib/iomgr}/tcp_windows.c +27 -17
  244. data/src/core/{iomgr → lib/iomgr}/tcp_windows.h +5 -5
  245. data/src/core/{iomgr → lib/iomgr}/time_averaged_stats.c +1 -1
  246. data/src/core/{iomgr → lib/iomgr}/time_averaged_stats.h +3 -3
  247. data/src/core/{iomgr → lib/iomgr}/timer.c +31 -4
  248. data/src/core/{iomgr → lib/iomgr}/timer.h +6 -7
  249. data/src/core/{iomgr → lib/iomgr}/timer_heap.c +2 -2
  250. data/src/core/{iomgr → lib/iomgr}/timer_heap.h +4 -4
  251. data/src/core/{iomgr → lib/iomgr}/udp_server.c +13 -37
  252. data/src/core/{iomgr → lib/iomgr}/udp_server.h +11 -10
  253. data/src/core/lib/iomgr/unix_sockets_posix.c +89 -0
  254. data/src/core/{client_config/resolvers/sockaddr_resolver.h → lib/iomgr/unix_sockets_posix.h} +15 -11
  255. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +59 -0
  256. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_eventfd.c +2 -2
  257. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_nospecial.c +1 -1
  258. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_pipe.c +8 -3
  259. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_pipe.h +4 -4
  260. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_posix.c +2 -2
  261. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_posix.h +3 -3
  262. data/src/core/{iomgr → lib/iomgr}/workqueue.h +10 -10
  263. data/src/core/{iomgr → lib/iomgr}/workqueue_posix.c +5 -6
  264. data/src/core/{iomgr → lib/iomgr}/workqueue_posix.h +5 -5
  265. data/src/core/{iomgr → lib/iomgr}/workqueue_windows.c +1 -1
  266. data/src/core/{iomgr → lib/iomgr}/workqueue_windows.h +3 -3
  267. data/src/core/{json → lib/json}/json.c +1 -1
  268. data/src/core/{json → lib/json}/json.h +4 -4
  269. data/src/core/{json → lib/json}/json_common.h +3 -3
  270. data/src/core/{json → lib/json}/json_reader.c +16 -4
  271. data/src/core/{json → lib/json}/json_reader.h +4 -4
  272. data/src/core/{json → lib/json}/json_string.c +4 -4
  273. data/src/core/{json → lib/json}/json_writer.c +1 -1
  274. data/src/core/{json → lib/json}/json_writer.h +4 -4
  275. data/src/core/{profiling → lib/profiling}/basic_timers.c +3 -2
  276. data/src/core/{profiling → lib/profiling}/stap_timers.c +2 -2
  277. data/src/core/{profiling → lib/profiling}/timers.h +3 -3
  278. data/src/core/{security → lib/security}/auth_filters.h +4 -4
  279. data/src/core/{security → lib/security}/b64.c +2 -2
  280. data/src/core/{security → lib/security}/b64.h +4 -4
  281. data/src/core/{security → lib/security}/client_auth_filter.c +16 -16
  282. data/src/core/{security → lib/security}/credentials.c +42 -26
  283. data/src/core/{security → lib/security}/credentials.h +11 -10
  284. data/src/core/{security → lib/security}/credentials_metadata.c +1 -1
  285. data/src/core/{security → lib/security}/credentials_posix.c +3 -3
  286. data/src/core/{security → lib/security}/credentials_win32.c +3 -3
  287. data/src/core/{security → lib/security}/google_default_credentials.c +10 -9
  288. data/src/core/{security → lib/security}/handshake.c +4 -4
  289. data/src/core/{security → lib/security}/handshake.h +6 -6
  290. data/src/core/{security → lib/security}/json_token.c +4 -4
  291. data/src/core/{security → lib/security}/json_token.h +4 -4
  292. data/src/core/{security → lib/security}/jwt_verifier.c +14 -14
  293. data/src/core/{security → lib/security}/jwt_verifier.h +5 -5
  294. data/src/core/{security → lib/security}/secure_endpoint.c +9 -8
  295. data/src/core/{security → lib/security}/secure_endpoint.h +4 -4
  296. data/src/core/{security → lib/security}/security_connector.c +53 -21
  297. data/src/core/{security → lib/security}/security_connector.h +8 -8
  298. data/src/core/{security → lib/security}/security_context.c +5 -5
  299. data/src/core/{security → lib/security}/security_context.h +5 -5
  300. data/src/core/{security → lib/security}/server_auth_filter.c +9 -9
  301. data/src/core/{support → lib/support}/alloc.c +5 -3
  302. data/src/core/{support → lib/support}/avl.c +1 -1
  303. data/src/core/lib/support/backoff.c +76 -0
  304. data/src/core/lib/support/backoff.h +68 -0
  305. data/src/core/{support → lib/support}/block_annotate.h +3 -3
  306. data/src/core/{support → lib/support}/cmdline.c +1 -1
  307. data/src/core/{support → lib/support}/cpu_iphone.c +0 -0
  308. data/src/core/{support → lib/support}/cpu_linux.c +2 -2
  309. data/src/core/{support → lib/support}/cpu_posix.c +2 -2
  310. data/src/core/{support → lib/support}/cpu_windows.c +0 -0
  311. data/src/core/{support → lib/support}/env.h +3 -3
  312. data/src/core/{support → lib/support}/env_linux.c +3 -3
  313. data/src/core/{support → lib/support}/env_posix.c +2 -2
  314. data/src/core/{support → lib/support}/env_win32.c +27 -21
  315. data/src/core/{support → lib/support}/histogram.c +1 -1
  316. data/src/core/{support → lib/support}/host_port.c +1 -1
  317. data/src/core/{support → lib/support}/load_file.c +4 -4
  318. data/src/core/{support → lib/support}/load_file.h +4 -4
  319. data/src/core/{support → lib/support}/log.c +33 -0
  320. data/src/core/{support → lib/support}/log_android.c +2 -2
  321. data/src/core/{support → lib/support}/log_linux.c +6 -5
  322. data/src/core/{support → lib/support}/log_posix.c +3 -3
  323. data/src/core/{support → lib/support}/log_win32.c +8 -22
  324. data/src/core/{support → lib/support}/murmur_hash.c +1 -1
  325. data/src/core/{support → lib/support}/murmur_hash.h +3 -3
  326. data/src/core/{support → lib/support}/slice.c +0 -0
  327. data/src/core/{support → lib/support}/slice_buffer.c +0 -0
  328. data/src/core/{support → lib/support}/stack_lockfree.c +7 -7
  329. data/src/core/{support → lib/support}/stack_lockfree.h +3 -3
  330. data/src/core/{support → lib/support}/string.c +1 -1
  331. data/src/core/{support → lib/support}/string.h +4 -4
  332. data/src/core/{support → lib/support}/string_posix.c +1 -1
  333. data/src/core/{support/string_win32.c → lib/support/string_util_win32.c} +23 -38
  334. data/src/core/lib/support/string_win32.c +83 -0
  335. data/src/core/{support → lib/support}/string_win32.h +3 -3
  336. data/src/core/{support → lib/support}/subprocess_posix.c +3 -3
  337. data/src/core/{support → lib/support}/subprocess_windows.c +3 -3
  338. data/src/core/{support → lib/support}/sync.c +2 -2
  339. data/src/core/{support → lib/support}/sync_posix.c +3 -3
  340. data/src/core/{support → lib/support}/sync_win32.c +1 -1
  341. data/src/core/{support → lib/support}/thd.c +0 -0
  342. data/src/core/{support → lib/support}/thd_internal.h +3 -3
  343. data/src/core/{support → lib/support}/thd_posix.c +4 -3
  344. data/src/core/{support → lib/support}/thd_win32.c +1 -1
  345. data/src/core/{support → lib/support}/time.c +2 -2
  346. data/src/core/{support → lib/support}/time_posix.c +12 -6
  347. data/src/core/{support → lib/support}/time_precise.c +0 -0
  348. data/src/core/{support → lib/support}/time_precise.h +3 -3
  349. data/src/core/{support → lib/support}/time_win32.c +7 -7
  350. data/src/core/{support → lib/support}/tls_pthread.c +0 -0
  351. data/src/core/{support → lib/support}/tmpfile.h +4 -4
  352. data/src/core/lib/support/tmpfile_msys.c +73 -0
  353. data/src/core/{support → lib/support}/tmpfile_posix.c +5 -5
  354. data/src/core/{support → lib/support}/tmpfile_win32.c +5 -5
  355. data/src/core/{support → lib/support}/wrap_memcpy.c +0 -0
  356. data/src/core/{surface → lib/surface}/alarm.c +3 -3
  357. data/src/core/{surface → lib/surface}/api_trace.c +1 -1
  358. data/src/core/{surface → lib/surface}/api_trace.h +4 -4
  359. data/src/core/{surface → lib/surface}/byte_buffer.c +3 -3
  360. data/src/core/{surface → lib/surface}/byte_buffer_reader.c +3 -3
  361. data/src/core/{surface → lib/surface}/call.c +145 -73
  362. data/src/core/{surface → lib/surface}/call.h +14 -7
  363. data/src/core/{surface → lib/surface}/call_details.c +1 -1
  364. data/src/core/{surface → lib/surface}/call_log_batch.c +2 -2
  365. data/src/core/{surface → lib/surface}/call_test_only.h +3 -3
  366. data/src/core/{surface → lib/surface}/channel.c +33 -34
  367. data/src/core/{surface → lib/surface}/channel.h +9 -9
  368. data/src/core/lib/surface/channel_init.c +140 -0
  369. data/src/core/lib/surface/channel_init.h +87 -0
  370. data/src/core/{surface → lib/surface}/channel_ping.c +4 -4
  371. data/src/core/lib/surface/channel_stack_type.c +54 -0
  372. data/src/core/{httpcli/parser.h → lib/surface/channel_stack_type.h} +22 -28
  373. data/src/core/{surface → lib/surface}/completion_queue.c +15 -11
  374. data/src/core/{surface → lib/surface}/completion_queue.h +4 -4
  375. data/src/core/{surface → lib/surface}/event_string.c +2 -2
  376. data/src/core/{surface → lib/surface}/event_string.h +3 -3
  377. data/src/core/lib/surface/init.c +217 -0
  378. data/src/core/{surface → lib/surface}/init.h +4 -3
  379. data/src/core/lib/surface/init_secure.c +89 -0
  380. data/src/core/{surface → lib/surface}/lame_client.c +31 -19
  381. data/src/core/{iomgr/pollset_set_windows.h → lib/surface/lame_client.h} +7 -5
  382. data/src/core/{surface → lib/surface}/metadata_array.c +1 -1
  383. data/src/core/{surface → lib/surface}/server.c +208 -183
  384. data/src/core/{surface → lib/surface}/server.h +6 -11
  385. data/src/core/{surface → lib/surface}/surface_trace.h +5 -5
  386. data/src/core/{surface → lib/surface}/validate_metadata.c +1 -1
  387. data/src/core/{surface → lib/surface}/version.c +2 -2
  388. data/src/core/{transport → lib/transport}/byte_stream.c +1 -1
  389. data/src/core/{transport → lib/transport}/byte_stream.h +4 -4
  390. data/src/core/{transport → lib/transport}/connectivity_state.c +2 -2
  391. data/src/core/{transport → lib/transport}/connectivity_state.h +4 -4
  392. data/src/core/{transport → lib/transport}/metadata.c +71 -19
  393. data/src/core/{transport → lib/transport}/metadata.h +11 -4
  394. data/src/core/{transport → lib/transport}/metadata_batch.c +2 -2
  395. data/src/core/{transport → lib/transport}/metadata_batch.h +4 -4
  396. data/src/core/{transport → lib/transport}/static_metadata.c +100 -32
  397. data/src/core/{transport → lib/transport}/static_metadata.h +58 -58
  398. data/src/core/{transport → lib/transport}/transport.c +25 -5
  399. data/src/core/{transport → lib/transport}/transport.h +41 -16
  400. data/src/core/{transport → lib/transport}/transport_impl.h +8 -5
  401. data/src/core/{transport → lib/transport}/transport_op_string.c +2 -2
  402. data/src/core/{tsi → lib/tsi}/fake_transport_security.c +18 -14
  403. data/src/core/{tsi → lib/tsi}/fake_transport_security.h +4 -4
  404. data/src/core/{tsi → lib/tsi}/ssl_transport_security.c +173 -63
  405. data/src/core/{tsi → lib/tsi}/ssl_transport_security.h +24 -6
  406. data/src/core/{tsi → lib/tsi}/ssl_types.h +3 -3
  407. data/src/core/{tsi → lib/tsi}/transport_security.c +12 -28
  408. data/src/core/{tsi → lib/tsi}/transport_security.h +4 -4
  409. data/src/core/{tsi → lib/tsi}/transport_security_interface.h +12 -3
  410. data/src/core/plugin_registry/grpc_plugin_registry.c +66 -0
  411. data/src/ruby/ext/grpc/extconf.rb +14 -20
  412. data/src/ruby/ext/grpc/rb_byte_buffer.c +2 -3
  413. data/src/ruby/ext/grpc/rb_call.c +37 -4
  414. data/src/ruby/ext/grpc/rb_call_credentials.c +13 -3
  415. data/src/ruby/ext/grpc/rb_channel.c +2 -3
  416. data/src/ruby/ext/grpc/rb_channel_args.c +2 -3
  417. data/src/ruby/ext/grpc/rb_channel_credentials.c +31 -3
  418. data/src/ruby/ext/grpc/rb_completion_queue.c +2 -2
  419. data/src/ruby/ext/grpc/rb_event_thread.c +1 -1
  420. data/src/ruby/ext/grpc/rb_grpc.c +4 -2
  421. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +8 -0
  422. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +14 -2
  423. data/src/ruby/ext/grpc/rb_server.c +2 -3
  424. data/src/ruby/ext/grpc/rb_server_credentials.c +16 -13
  425. data/src/ruby/ext/grpc/rb_signal.c +70 -0
  426. data/src/ruby/ext/grpc/rb_signal.h +39 -0
  427. data/src/ruby/lib/grpc.rb +21 -13
  428. data/src/ruby/lib/grpc/core/time_consts.rb +2 -2
  429. data/src/ruby/lib/grpc/errors.rb +2 -2
  430. data/src/ruby/lib/grpc/generic/active_call.rb +10 -3
  431. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -2
  432. data/src/ruby/lib/grpc/generic/client_stub.rb +10 -7
  433. data/src/ruby/lib/grpc/generic/rpc_desc.rb +2 -2
  434. data/src/ruby/lib/grpc/generic/rpc_server.rb +21 -61
  435. data/src/ruby/lib/grpc/generic/service.rb +5 -15
  436. data/src/ruby/lib/grpc/grpc.rb +3 -3
  437. data/src/ruby/{bin/interop/interop_server.rb → lib/grpc/signals.rb} +39 -20
  438. data/src/ruby/lib/grpc/version.rb +2 -2
  439. data/src/ruby/pb/generate_proto_ruby.sh +9 -2
  440. data/src/ruby/pb/grpc/health/checker.rb +1 -1
  441. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services.rb +28 -0
  442. data/src/ruby/pb/grpc/testing/metrics.rb +28 -0
  443. data/src/ruby/pb/grpc/testing/metrics_services.rb +27 -0
  444. data/src/ruby/pb/test/client.rb +12 -23
  445. data/src/ruby/pb/test/server.rb +1 -1
  446. data/src/ruby/spec/client_server_spec.rb +1 -1
  447. data/src/ruby/spec/generic/client_stub_spec.rb +18 -17
  448. data/src/ruby/spec/generic/rpc_server_spec.rb +23 -7
  449. data/src/ruby/spec/generic/service_spec.rb +0 -69
  450. data/src/ruby/{bin/interop/interop_client.rb → spec/pb/duplicate/codegen_spec.rb} +41 -21
  451. data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
  452. data/third_party/boringssl/crypto/asn1/a_bitstr.c +184 -176
  453. data/third_party/boringssl/crypto/asn1/a_bool.c +42 -44
  454. data/third_party/boringssl/crypto/asn1/a_bytes.c +236 -245
  455. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +173 -192
  456. data/third_party/boringssl/crypto/asn1/a_dup.c +43 -35
  457. data/third_party/boringssl/crypto/asn1/a_enum.c +107 -109
  458. data/third_party/boringssl/crypto/asn1/a_gentm.c +180 -181
  459. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +73 -80
  460. data/third_party/boringssl/crypto/asn1/a_int.c +357 -353
  461. data/third_party/boringssl/crypto/asn1/a_mbstr.c +272 -253
  462. data/third_party/boringssl/crypto/asn1/a_object.c +293 -309
  463. data/third_party/boringssl/crypto/asn1/a_octet.c +13 -6
  464. data/third_party/boringssl/crypto/asn1/a_print.c +54 -52
  465. data/third_party/boringssl/crypto/asn1/a_strnid.c +179 -157
  466. data/third_party/boringssl/crypto/asn1/a_time.c +125 -129
  467. data/third_party/boringssl/crypto/asn1/a_type.c +79 -86
  468. data/third_party/boringssl/crypto/asn1/a_utctm.c +246 -255
  469. data/third_party/boringssl/crypto/asn1/a_utf8.c +159 -135
  470. data/third_party/boringssl/crypto/asn1/asn1_lib.c +361 -368
  471. data/third_party/boringssl/crypto/asn1/asn1_locl.h +11 -11
  472. data/third_party/boringssl/crypto/asn1/asn1_par.c +309 -351
  473. data/third_party/boringssl/crypto/asn1/asn_pack.c +30 -29
  474. data/third_party/boringssl/crypto/asn1/bio_asn1.c +375 -394
  475. data/third_party/boringssl/crypto/asn1/bio_ndef.c +146 -149
  476. data/third_party/boringssl/crypto/asn1/f_enum.c +128 -134
  477. data/third_party/boringssl/crypto/asn1/f_int.c +131 -139
  478. data/third_party/boringssl/crypto/asn1/f_string.c +125 -133
  479. data/third_party/boringssl/crypto/asn1/t_bitst.c +30 -29
  480. data/third_party/boringssl/crypto/asn1/t_pkey.c +45 -47
  481. data/third_party/boringssl/crypto/asn1/tasn_dec.c +1099 -1216
  482. data/third_party/boringssl/crypto/asn1/tasn_enc.c +556 -592
  483. data/third_party/boringssl/crypto/asn1/tasn_fre.c +175 -193
  484. data/third_party/boringssl/crypto/asn1/tasn_new.c +271 -288
  485. data/third_party/boringssl/crypto/asn1/tasn_prn.c +462 -508
  486. data/third_party/boringssl/crypto/asn1/tasn_typ.c +28 -21
  487. data/third_party/boringssl/crypto/asn1/x_bignum.c +62 -52
  488. data/third_party/boringssl/crypto/asn1/x_long.c +101 -86
  489. data/third_party/boringssl/crypto/bio/buffer.c +3 -3
  490. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +8 -68
  491. data/third_party/boringssl/crypto/bn/bn.c +1 -1
  492. data/third_party/boringssl/crypto/bn/bn_asn1.c +9 -22
  493. data/third_party/boringssl/crypto/bn/convert.c +9 -4
  494. data/third_party/boringssl/crypto/bn/div.c +0 -20
  495. data/third_party/boringssl/crypto/bn/exponentiation.c +22 -13
  496. data/third_party/boringssl/crypto/bn/generic.c +6 -242
  497. data/third_party/boringssl/crypto/bn/internal.h +9 -70
  498. data/third_party/boringssl/crypto/bn/montgomery.c +1 -2
  499. data/third_party/boringssl/crypto/bn/mul.c +6 -26
  500. data/third_party/boringssl/crypto/bn/rsaz_exp.c +21 -28
  501. data/third_party/boringssl/crypto/bytestring/asn1_compat.c +51 -0
  502. data/third_party/boringssl/crypto/bytestring/ber.c +128 -87
  503. data/third_party/boringssl/crypto/bytestring/cbb.c +37 -3
  504. data/third_party/boringssl/crypto/bytestring/internal.h +39 -10
  505. data/third_party/boringssl/crypto/chacha/chacha_vec.c +18 -13
  506. data/third_party/boringssl/crypto/cipher/e_aes.c +2 -2
  507. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +4 -9
  508. data/third_party/boringssl/crypto/cipher/tls_cbc.c +39 -10
  509. data/third_party/boringssl/crypto/conf/conf.c +9 -0
  510. data/third_party/boringssl/crypto/cpu-intel.c +1 -1
  511. data/third_party/boringssl/crypto/crypto.c +2 -0
  512. data/third_party/boringssl/crypto/curve25519/curve25519.c +125 -120
  513. data/third_party/boringssl/crypto/curve25519/internal.h +45 -0
  514. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +225 -0
  515. data/third_party/boringssl/crypto/dh/check.c +32 -10
  516. data/third_party/boringssl/crypto/dh/dh.c +1 -1
  517. data/third_party/boringssl/crypto/digest/md32_common.h +0 -60
  518. data/third_party/boringssl/crypto/dsa/dsa.c +47 -21
  519. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +249 -64
  520. data/third_party/boringssl/crypto/ec/ec.c +45 -31
  521. data/third_party/boringssl/crypto/ec/ec_asn1.c +315 -382
  522. data/third_party/boringssl/crypto/ec/ec_key.c +1 -4
  523. data/third_party/boringssl/crypto/ec/ec_montgomery.c +0 -9
  524. data/third_party/boringssl/crypto/ec/internal.h +1 -19
  525. data/third_party/boringssl/crypto/ec/oct.c +12 -0
  526. data/third_party/boringssl/crypto/ec/p224-64.c +4 -65
  527. data/third_party/boringssl/crypto/ec/p256-64.c +9 -71
  528. data/third_party/boringssl/crypto/ec/p256-x86_64-table.h +1 -6
  529. data/third_party/boringssl/crypto/ec/p256-x86_64.c +3 -13
  530. data/third_party/boringssl/crypto/ec/simple.c +0 -76
  531. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +1 -1
  532. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +10 -24
  533. data/third_party/boringssl/crypto/evp/evp.c +4 -3
  534. data/third_party/boringssl/crypto/evp/evp_asn1.c +101 -0
  535. data/third_party/boringssl/crypto/evp/evp_ctx.c +22 -51
  536. data/third_party/boringssl/crypto/evp/internal.h +28 -27
  537. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +78 -249
  538. data/third_party/boringssl/crypto/evp/p_ec.c +19 -66
  539. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +74 -231
  540. data/third_party/boringssl/crypto/evp/p_rsa.c +90 -13
  541. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +49 -48
  542. data/third_party/boringssl/crypto/internal.h +16 -1
  543. data/third_party/boringssl/crypto/mem.c +2 -2
  544. data/third_party/boringssl/crypto/modes/ctr.c +2 -1
  545. data/third_party/boringssl/crypto/modes/gcm.c +5 -3
  546. data/third_party/boringssl/crypto/obj/obj_dat.h +6 -3
  547. data/third_party/boringssl/crypto/pem/pem_all.c +83 -102
  548. data/third_party/boringssl/crypto/pem/pem_info.c +286 -309
  549. data/third_party/boringssl/crypto/pem/pem_lib.c +690 -710
  550. data/third_party/boringssl/crypto/pem/pem_oth.c +15 -16
  551. data/third_party/boringssl/crypto/pem/pem_pk8.c +132 -119
  552. data/third_party/boringssl/crypto/pem/pem_pkey.c +144 -220
  553. data/third_party/boringssl/crypto/pem/pem_x509.c +3 -3
  554. data/third_party/boringssl/crypto/pem/pem_xaux.c +5 -4
  555. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +54 -60
  556. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +3 -1
  557. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +48 -50
  558. data/third_party/boringssl/crypto/rand/rand.c +2 -0
  559. data/third_party/boringssl/crypto/rsa/blinding.c +8 -48
  560. data/third_party/boringssl/crypto/rsa/internal.h +1 -9
  561. data/third_party/boringssl/crypto/rsa/padding.c +73 -77
  562. data/third_party/boringssl/crypto/rsa/rsa.c +1 -1
  563. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +27 -46
  564. data/third_party/boringssl/crypto/rsa/rsa_impl.c +23 -34
  565. data/third_party/boringssl/crypto/test/scoped_types.h +3 -0
  566. data/third_party/boringssl/crypto/thread_win.c +15 -13
  567. data/third_party/boringssl/crypto/time_support.c +0 -6
  568. data/third_party/boringssl/crypto/x509/a_digest.c +26 -27
  569. data/third_party/boringssl/crypto/x509/a_sign.c +63 -64
  570. data/third_party/boringssl/crypto/x509/a_strex.c +482 -413
  571. data/third_party/boringssl/crypto/x509/a_verify.c +45 -51
  572. data/third_party/boringssl/crypto/x509/asn1_gen.c +715 -769
  573. data/third_party/boringssl/crypto/x509/by_dir.c +355 -393
  574. data/third_party/boringssl/crypto/x509/by_file.c +186 -206
  575. data/third_party/boringssl/crypto/x509/charmap.h +11 -11
  576. data/third_party/boringssl/crypto/x509/i2d_pr.c +21 -22
  577. data/third_party/boringssl/crypto/x509/t_crl.c +50 -51
  578. data/third_party/boringssl/crypto/x509/t_x509.c +414 -406
  579. data/third_party/boringssl/crypto/x509/t_x509a.c +44 -42
  580. data/third_party/boringssl/crypto/x509/vpm_int.h +13 -13
  581. data/third_party/boringssl/crypto/x509/x509_att.c +241 -219
  582. data/third_party/boringssl/crypto/x509/x509_cmp.c +343 -359
  583. data/third_party/boringssl/crypto/x509/x509_d2.c +36 -35
  584. data/third_party/boringssl/crypto/x509/x509_def.c +23 -13
  585. data/third_party/boringssl/crypto/x509/x509_ext.c +75 -75
  586. data/third_party/boringssl/crypto/x509/x509_lu.c +574 -612
  587. data/third_party/boringssl/crypto/x509/x509_obj.c +104 -115
  588. data/third_party/boringssl/crypto/x509/x509_r2x.c +40 -40
  589. data/third_party/boringssl/crypto/x509/x509_req.c +181 -174
  590. data/third_party/boringssl/crypto/x509/x509_set.c +71 -76
  591. data/third_party/boringssl/crypto/x509/x509_trs.c +193 -171
  592. data/third_party/boringssl/crypto/x509/x509_txt.c +135 -138
  593. data/third_party/boringssl/crypto/x509/x509_v3.c +174 -167
  594. data/third_party/boringssl/crypto/x509/x509_vfy.c +2079 -2130
  595. data/third_party/boringssl/crypto/x509/x509_vpm.c +486 -522
  596. data/third_party/boringssl/crypto/x509/x509cset.c +96 -99
  597. data/third_party/boringssl/crypto/x509/x509name.c +280 -275
  598. data/third_party/boringssl/crypto/x509/x509rset.c +15 -14
  599. data/third_party/boringssl/crypto/x509/x509spki.c +62 -60
  600. data/third_party/boringssl/crypto/x509/x509type.c +58 -60
  601. data/third_party/boringssl/crypto/x509/x_algor.c +70 -73
  602. data/third_party/boringssl/crypto/x509/x_all.c +282 -328
  603. data/third_party/boringssl/crypto/x509/x_attrib.c +36 -42
  604. data/third_party/boringssl/crypto/x509/x_crl.c +397 -418
  605. data/third_party/boringssl/crypto/x509/x_exten.c +5 -5
  606. data/third_party/boringssl/crypto/x509/x_info.c +30 -27
  607. data/third_party/boringssl/crypto/x509/x_name.c +387 -388
  608. data/third_party/boringssl/crypto/x509/x_pkey.c +32 -29
  609. data/third_party/boringssl/crypto/x509/x_pubkey.c +261 -280
  610. data/third_party/boringssl/crypto/x509/x_req.c +30 -33
  611. data/third_party/boringssl/crypto/x509/x_sig.c +2 -2
  612. data/third_party/boringssl/crypto/x509/x_spki.c +9 -7
  613. data/third_party/boringssl/crypto/x509/x_val.c +2 -2
  614. data/third_party/boringssl/crypto/x509/x_x509.c +120 -119
  615. data/third_party/boringssl/crypto/x509/x_x509a.c +99 -91
  616. data/third_party/boringssl/crypto/x509v3/ext_dat.h +57 -51
  617. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +199 -214
  618. data/third_party/boringssl/crypto/x509v3/pcy_data.c +57 -64
  619. data/third_party/boringssl/crypto/x509v3/pcy_int.h +95 -90
  620. data/third_party/boringssl/crypto/x509v3/pcy_lib.c +86 -87
  621. data/third_party/boringssl/crypto/x509v3/pcy_map.c +61 -64
  622. data/third_party/boringssl/crypto/x509v3/pcy_node.c +108 -117
  623. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +676 -724
  624. data/third_party/boringssl/crypto/x509v3/v3_akey.c +128 -136
  625. data/third_party/boringssl/crypto/x509v3/v3_akeya.c +7 -6
  626. data/third_party/boringssl/crypto/x509v3/v3_alt.c +499 -507
  627. data/third_party/boringssl/crypto/x509v3/v3_bcons.c +54 -47
  628. data/third_party/boringssl/crypto/x509v3/v3_bitst.c +67 -67
  629. data/third_party/boringssl/crypto/x509v3/v3_conf.c +330 -328
  630. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +354 -338
  631. data/third_party/boringssl/crypto/x509v3/v3_crld.c +441 -496
  632. data/third_party/boringssl/crypto/x509v3/v3_enum.c +35 -33
  633. data/third_party/boringssl/crypto/x509v3/v3_extku.c +66 -63
  634. data/third_party/boringssl/crypto/x509v3/v3_genn.c +157 -159
  635. data/third_party/boringssl/crypto/x509v3/v3_ia5.c +45 -43
  636. data/third_party/boringssl/crypto/x509v3/v3_info.c +124 -112
  637. data/third_party/boringssl/crypto/x509v3/v3_int.c +30 -26
  638. data/third_party/boringssl/crypto/x509v3/v3_lib.c +231 -204
  639. data/third_party/boringssl/crypto/x509v3/v3_ncons.c +353 -381
  640. data/third_party/boringssl/crypto/x509v3/v3_pci.c +252 -270
  641. data/third_party/boringssl/crypto/x509v3/v3_pcia.c +9 -8
  642. data/third_party/boringssl/crypto/x509v3/v3_pcons.c +58 -61
  643. data/third_party/boringssl/crypto/x509v3/v3_pku.c +35 -34
  644. data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +72 -74
  645. data/third_party/boringssl/crypto/x509v3/v3_prn.c +146 -121
  646. data/third_party/boringssl/crypto/x509v3/v3_purp.c +651 -582
  647. data/third_party/boringssl/crypto/x509v3/v3_skey.c +76 -72
  648. data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +139 -131
  649. data/third_party/boringssl/crypto/x509v3/v3_utl.c +1072 -1068
  650. data/third_party/boringssl/include/openssl/asn1.h +40 -38
  651. data/third_party/boringssl/include/openssl/base.h +10 -1
  652. data/third_party/boringssl/include/openssl/bio.h +10 -11
  653. data/third_party/boringssl/include/openssl/bn.h +12 -9
  654. data/third_party/boringssl/include/openssl/buf.h +1 -1
  655. data/third_party/boringssl/include/openssl/bytestring.h +29 -0
  656. data/third_party/boringssl/include/openssl/conf.h +25 -0
  657. data/third_party/boringssl/include/openssl/crypto.h +6 -1
  658. data/third_party/boringssl/include/openssl/curve25519.h +6 -3
  659. data/third_party/boringssl/include/openssl/dh.h +7 -3
  660. data/third_party/boringssl/include/openssl/dsa.h +108 -51
  661. data/third_party/boringssl/include/openssl/ec.h +46 -21
  662. data/third_party/boringssl/include/openssl/ec_key.h +78 -42
  663. data/third_party/boringssl/include/openssl/ecdsa.h +4 -4
  664. data/third_party/boringssl/include/openssl/err.h +3 -2
  665. data/third_party/boringssl/include/openssl/evp.h +120 -37
  666. data/third_party/boringssl/include/openssl/mem.h +4 -13
  667. data/third_party/boringssl/include/openssl/obj_mac.h +4 -0
  668. data/third_party/boringssl/include/openssl/pem.h +0 -9
  669. data/third_party/boringssl/include/openssl/pkcs8.h +6 -2
  670. data/third_party/boringssl/include/openssl/rand.h +3 -0
  671. data/third_party/boringssl/include/openssl/rsa.h +42 -42
  672. data/third_party/boringssl/include/openssl/ssl.h +115 -41
  673. data/third_party/boringssl/include/openssl/stack.h +0 -3
  674. data/third_party/boringssl/include/openssl/stack_macros.h +0 -256
  675. data/third_party/boringssl/include/openssl/tls1.h +1 -1
  676. data/third_party/boringssl/include/openssl/x509.h +0 -2
  677. data/third_party/boringssl/include/openssl/x509_vfy.h +5 -0
  678. data/third_party/boringssl/ssl/d1_both.c +102 -101
  679. data/third_party/boringssl/ssl/d1_clnt.c +145 -150
  680. data/third_party/boringssl/ssl/d1_lib.c +63 -62
  681. data/third_party/boringssl/ssl/d1_pkt.c +73 -71
  682. data/third_party/boringssl/ssl/d1_srvr.c +116 -125
  683. data/third_party/boringssl/ssl/dtls_record.c +3 -3
  684. data/third_party/boringssl/ssl/internal.h +210 -208
  685. data/third_party/boringssl/ssl/pqueue/pqueue.c +2 -2
  686. data/third_party/boringssl/ssl/s3_both.c +116 -130
  687. data/third_party/boringssl/ssl/s3_clnt.c +589 -740
  688. data/third_party/boringssl/ssl/s3_enc.c +52 -151
  689. data/third_party/boringssl/ssl/s3_lib.c +70 -76
  690. data/third_party/boringssl/ssl/s3_pkt.c +105 -144
  691. data/third_party/boringssl/ssl/s3_srvr.c +542 -806
  692. data/third_party/boringssl/ssl/ssl_aead_ctx.c +1 -1
  693. data/third_party/boringssl/ssl/ssl_cert.c +2 -2
  694. data/third_party/boringssl/ssl/ssl_cipher.c +7 -3
  695. data/third_party/boringssl/ssl/ssl_ecdh.c +374 -0
  696. data/third_party/boringssl/ssl/ssl_lib.c +260 -221
  697. data/third_party/boringssl/ssl/ssl_session.c +17 -17
  698. data/third_party/boringssl/ssl/t1_enc.c +128 -273
  699. data/third_party/boringssl/ssl/t1_lib.c +134 -258
  700. data/third_party/boringssl/ssl/test/test_config.h +2 -0
  701. data/third_party/boringssl/ssl/tls_record.c +52 -15
  702. metadata +385 -359
  703. data/src/core/channel/client_uchannel.c +0 -243
  704. data/src/core/channel/client_uchannel.h +0 -60
  705. data/src/core/channel/connected_channel.h +0 -51
  706. data/src/core/client_config/lb_policies/pick_first.h +0 -43
  707. data/src/core/client_config/resolvers/dns_resolver.h +0 -42
  708. data/src/core/client_config/subchannel_factory.h +0 -66
  709. data/src/core/httpcli/parser.c +0 -211
  710. data/src/core/iomgr/fd_posix.c +0 -451
  711. data/src/core/iomgr/fd_posix.h +0 -192
  712. data/src/core/iomgr/pollset_multipoller_with_epoll.c +0 -324
  713. data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +0 -234
  714. data/src/core/iomgr/pollset_posix.c +0 -633
  715. data/src/core/iomgr/pollset_posix.h +0 -153
  716. data/src/core/iomgr/pollset_set_posix.c +0 -202
  717. data/src/core/iomgr/pollset_set_posix.h +0 -45
  718. data/src/core/surface/init.c +0 -174
  719. data/src/core/surface/init_secure.c +0 -42
  720. data/src/core/surface/server_create.c +0 -48
  721. data/src/core/transport/chttp2/huffsyms.c +0 -297
  722. data/src/ruby/bin/grpc_ruby_interop_client +0 -33
  723. data/src/ruby/bin/grpc_ruby_interop_server +0 -33
  724. data/third_party/boringssl/crypto/dsa/internal.h +0 -78
@@ -1,5 +1,6 @@
1
1
  /* v3_utl.c */
2
- /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
2
+ /*
3
+ * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3
4
  * project.
4
5
  */
5
6
  /* ====================================================================
@@ -10,7 +11,7 @@
10
11
  * are met:
11
12
  *
12
13
  * 1. Redistributions of source code must retain the above copyright
13
- * notice, this list of conditions and the following disclaimer.
14
+ * notice, this list of conditions and the following disclaimer.
14
15
  *
15
16
  * 2. Redistributions in binary form must reproduce the above copyright
16
17
  * notice, this list of conditions and the following disclaimer in
@@ -57,7 +58,6 @@
57
58
  */
58
59
  /* X509 v3 extension utilities */
59
60
 
60
-
61
61
  #include <ctype.h>
62
62
  #include <stdio.h>
63
63
  #include <string.h>
@@ -72,10 +72,10 @@
72
72
 
73
73
  #include "../conf/internal.h"
74
74
 
75
-
76
75
  static char *strip_spaces(char *name);
77
76
  static int sk_strcmp(const OPENSSL_STRING *a, const OPENSSL_STRING *b);
78
- static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name, GENERAL_NAMES *gens);
77
+ static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name,
78
+ GENERAL_NAMES *gens);
79
79
  static void str_free(OPENSSL_STRING str);
80
80
  static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email);
81
81
 
@@ -87,1236 +87,1240 @@ static int ipv6_hex(unsigned char *out, const char *in, int inlen);
87
87
  /* Add a CONF_VALUE name value pair to stack */
88
88
 
89
89
  int X509V3_add_value(const char *name, const char *value,
90
- STACK_OF(CONF_VALUE) **extlist)
90
+ STACK_OF(CONF_VALUE) **extlist)
91
91
  {
92
- CONF_VALUE *vtmp = NULL;
93
- char *tname = NULL, *tvalue = NULL;
94
- if(name && !(tname = BUF_strdup(name))) goto err;
95
- if(value && !(tvalue = BUF_strdup(value))) goto err;
96
- if(!(vtmp = CONF_VALUE_new())) goto err;
97
- if(!*extlist && !(*extlist = sk_CONF_VALUE_new_null())) goto err;
98
- vtmp->section = NULL;
99
- vtmp->name = tname;
100
- vtmp->value = tvalue;
101
- if(!sk_CONF_VALUE_push(*extlist, vtmp)) goto err;
102
- return 1;
103
- err:
104
- OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
105
- if(vtmp) OPENSSL_free(vtmp);
106
- if(tname) OPENSSL_free(tname);
107
- if(tvalue) OPENSSL_free(tvalue);
108
- return 0;
92
+ CONF_VALUE *vtmp = NULL;
93
+ char *tname = NULL, *tvalue = NULL;
94
+ if (name && !(tname = BUF_strdup(name)))
95
+ goto err;
96
+ if (value && !(tvalue = BUF_strdup(value)))
97
+ goto err;
98
+ if (!(vtmp = CONF_VALUE_new()))
99
+ goto err;
100
+ if (!*extlist && !(*extlist = sk_CONF_VALUE_new_null()))
101
+ goto err;
102
+ vtmp->section = NULL;
103
+ vtmp->name = tname;
104
+ vtmp->value = tvalue;
105
+ if (!sk_CONF_VALUE_push(*extlist, vtmp))
106
+ goto err;
107
+ return 1;
108
+ err:
109
+ OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
110
+ if (vtmp)
111
+ OPENSSL_free(vtmp);
112
+ if (tname)
113
+ OPENSSL_free(tname);
114
+ if (tvalue)
115
+ OPENSSL_free(tvalue);
116
+ return 0;
109
117
  }
110
118
 
111
119
  int X509V3_add_value_uchar(const char *name, const unsigned char *value,
112
- STACK_OF(CONF_VALUE) **extlist)
113
- {
114
- return X509V3_add_value(name,(const char *)value,extlist);
115
- }
120
+ STACK_OF(CONF_VALUE) **extlist)
121
+ {
122
+ return X509V3_add_value(name, (const char *)value, extlist);
123
+ }
116
124
 
117
125
  /* Free function for STACK_OF(CONF_VALUE) */
118
126
 
119
127
  void X509V3_conf_free(CONF_VALUE *conf)
120
128
  {
121
- if(!conf) return;
122
- if(conf->name) OPENSSL_free(conf->name);
123
- if(conf->value) OPENSSL_free(conf->value);
124
- if(conf->section) OPENSSL_free(conf->section);
125
- OPENSSL_free(conf);
129
+ if (!conf)
130
+ return;
131
+ if (conf->name)
132
+ OPENSSL_free(conf->name);
133
+ if (conf->value)
134
+ OPENSSL_free(conf->value);
135
+ if (conf->section)
136
+ OPENSSL_free(conf->section);
137
+ OPENSSL_free(conf);
126
138
  }
127
139
 
128
140
  int X509V3_add_value_bool(const char *name, int asn1_bool,
129
- STACK_OF(CONF_VALUE) **extlist)
141
+ STACK_OF(CONF_VALUE) **extlist)
130
142
  {
131
- if(asn1_bool) return X509V3_add_value(name, "TRUE", extlist);
132
- return X509V3_add_value(name, "FALSE", extlist);
143
+ if (asn1_bool)
144
+ return X509V3_add_value(name, "TRUE", extlist);
145
+ return X509V3_add_value(name, "FALSE", extlist);
133
146
  }
134
147
 
135
148
  int X509V3_add_value_bool_nf(char *name, int asn1_bool,
136
- STACK_OF(CONF_VALUE) **extlist)
149
+ STACK_OF(CONF_VALUE) **extlist)
137
150
  {
138
- if(asn1_bool) return X509V3_add_value(name, "TRUE", extlist);
139
- return 1;
151
+ if (asn1_bool)
152
+ return X509V3_add_value(name, "TRUE", extlist);
153
+ return 1;
140
154
  }
141
155
 
142
-
143
156
  char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *method, ASN1_ENUMERATED *a)
144
157
  {
145
- BIGNUM *bntmp = NULL;
146
- char *strtmp = NULL;
147
- if(!a) return NULL;
148
- if(!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) ||
149
- !(strtmp = BN_bn2dec(bntmp)) )
150
- OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
151
- BN_free(bntmp);
152
- return strtmp;
158
+ BIGNUM *bntmp = NULL;
159
+ char *strtmp = NULL;
160
+ if (!a)
161
+ return NULL;
162
+ if (!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) ||
163
+ !(strtmp = BN_bn2dec(bntmp)))
164
+ OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
165
+ BN_free(bntmp);
166
+ return strtmp;
153
167
  }
154
168
 
155
169
  char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *method, ASN1_INTEGER *a)
156
170
  {
157
- BIGNUM *bntmp = NULL;
158
- char *strtmp = NULL;
159
- if(!a) return NULL;
160
- if(!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) ||
161
- !(strtmp = BN_bn2dec(bntmp)) )
162
- OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
163
- BN_free(bntmp);
164
- return strtmp;
171
+ BIGNUM *bntmp = NULL;
172
+ char *strtmp = NULL;
173
+ if (!a)
174
+ return NULL;
175
+ if (!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) ||
176
+ !(strtmp = BN_bn2dec(bntmp)))
177
+ OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
178
+ BN_free(bntmp);
179
+ return strtmp;
165
180
  }
166
181
 
167
182
  ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *method, char *value)
168
183
  {
169
- BIGNUM *bn = NULL;
170
- ASN1_INTEGER *aint;
171
- int isneg, ishex;
172
- int ret;
173
- if (!value) {
174
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
175
- return 0;
176
- }
177
- bn = BN_new();
178
- if (value[0] == '-') {
179
- value++;
180
- isneg = 1;
181
- } else isneg = 0;
182
-
183
- if (value[0] == '0' && ((value[1] == 'x') || (value[1] == 'X'))) {
184
- value += 2;
185
- ishex = 1;
186
- } else ishex = 0;
187
-
188
- if (ishex) ret = BN_hex2bn(&bn, value);
189
- else ret = BN_dec2bn(&bn, value);
190
-
191
- if (!ret || value[ret]) {
192
- BN_free(bn);
193
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_DEC2BN_ERROR);
194
- return 0;
195
- }
196
-
197
- if (isneg && BN_is_zero(bn)) isneg = 0;
198
-
199
- aint = BN_to_ASN1_INTEGER(bn, NULL);
200
- BN_free(bn);
201
- if (!aint) {
202
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
203
- return 0;
204
- }
205
- if (isneg) aint->type |= V_ASN1_NEG;
206
- return aint;
184
+ BIGNUM *bn = NULL;
185
+ ASN1_INTEGER *aint;
186
+ int isneg, ishex;
187
+ int ret;
188
+ if (!value) {
189
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
190
+ return 0;
191
+ }
192
+ bn = BN_new();
193
+ if (value[0] == '-') {
194
+ value++;
195
+ isneg = 1;
196
+ } else
197
+ isneg = 0;
198
+
199
+ if (value[0] == '0' && ((value[1] == 'x') || (value[1] == 'X'))) {
200
+ value += 2;
201
+ ishex = 1;
202
+ } else
203
+ ishex = 0;
204
+
205
+ if (ishex)
206
+ ret = BN_hex2bn(&bn, value);
207
+ else
208
+ ret = BN_dec2bn(&bn, value);
209
+
210
+ if (!ret || value[ret]) {
211
+ BN_free(bn);
212
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_DEC2BN_ERROR);
213
+ return 0;
214
+ }
215
+
216
+ if (isneg && BN_is_zero(bn))
217
+ isneg = 0;
218
+
219
+ aint = BN_to_ASN1_INTEGER(bn, NULL);
220
+ BN_free(bn);
221
+ if (!aint) {
222
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
223
+ return 0;
224
+ }
225
+ if (isneg)
226
+ aint->type |= V_ASN1_NEG;
227
+ return aint;
207
228
  }
208
229
 
209
230
  int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint,
210
- STACK_OF(CONF_VALUE) **extlist)
231
+ STACK_OF(CONF_VALUE) **extlist)
211
232
  {
212
- char *strtmp;
213
- int ret;
214
- if(!aint) return 1;
215
- if(!(strtmp = i2s_ASN1_INTEGER(NULL, aint))) return 0;
216
- ret = X509V3_add_value(name, strtmp, extlist);
217
- OPENSSL_free(strtmp);
218
- return ret;
233
+ char *strtmp;
234
+ int ret;
235
+ if (!aint)
236
+ return 1;
237
+ if (!(strtmp = i2s_ASN1_INTEGER(NULL, aint)))
238
+ return 0;
239
+ ret = X509V3_add_value(name, strtmp, extlist);
240
+ OPENSSL_free(strtmp);
241
+ return ret;
219
242
  }
220
243
 
221
244
  int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool)
222
245
  {
223
- char *btmp;
224
- if(!(btmp = value->value)) goto err;
225
- if(!strcmp(btmp, "TRUE") || !strcmp(btmp, "true")
226
- || !strcmp(btmp, "Y") || !strcmp(btmp, "y")
227
- || !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) {
228
- *asn1_bool = 0xff;
229
- return 1;
230
- } else if(!strcmp(btmp, "FALSE") || !strcmp(btmp, "false")
231
- || !strcmp(btmp, "N") || !strcmp(btmp, "n")
232
- || !strcmp(btmp, "NO") || !strcmp(btmp, "no")) {
233
- *asn1_bool = 0;
234
- return 1;
235
- }
236
- err:
237
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_BOOLEAN_STRING);
238
- X509V3_conf_err(value);
239
- return 0;
246
+ char *btmp;
247
+ if (!(btmp = value->value))
248
+ goto err;
249
+ if (!strcmp(btmp, "TRUE") || !strcmp(btmp, "true")
250
+ || !strcmp(btmp, "Y") || !strcmp(btmp, "y")
251
+ || !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) {
252
+ *asn1_bool = 0xff;
253
+ return 1;
254
+ } else if (!strcmp(btmp, "FALSE") || !strcmp(btmp, "false")
255
+ || !strcmp(btmp, "N") || !strcmp(btmp, "n")
256
+ || !strcmp(btmp, "NO") || !strcmp(btmp, "no")) {
257
+ *asn1_bool = 0;
258
+ return 1;
259
+ }
260
+ err:
261
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_BOOLEAN_STRING);
262
+ X509V3_conf_err(value);
263
+ return 0;
240
264
  }
241
265
 
242
266
  int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint)
243
267
  {
244
- ASN1_INTEGER *itmp;
245
- if(!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) {
246
- X509V3_conf_err(value);
247
- return 0;
248
- }
249
- *aint = itmp;
250
- return 1;
268
+ ASN1_INTEGER *itmp;
269
+ if (!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) {
270
+ X509V3_conf_err(value);
271
+ return 0;
272
+ }
273
+ *aint = itmp;
274
+ return 1;
251
275
  }
252
276
 
253
- #define HDR_NAME 1
254
- #define HDR_VALUE 2
277
+ #define HDR_NAME 1
278
+ #define HDR_VALUE 2
255
279
 
256
- /*#define DEBUG*/
280
+ /*
281
+ * #define DEBUG
282
+ */
257
283
 
258
284
  STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line)
259
285
  {
260
- char *p, *q, c;
261
- char *ntmp, *vtmp;
262
- STACK_OF(CONF_VALUE) *values = NULL;
263
- char *linebuf;
264
- int state;
265
- /* We are going to modify the line so copy it first */
266
- linebuf = BUF_strdup(line);
267
- if (linebuf == NULL)
268
- {
269
- OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
270
- goto err;
271
- }
272
- state = HDR_NAME;
273
- ntmp = NULL;
274
- /* Go through all characters */
275
- for(p = linebuf, q = linebuf; (c = *p) && (c!='\r') && (c!='\n'); p++) {
276
-
277
- switch(state) {
278
- case HDR_NAME:
279
- if(c == ':') {
280
- state = HDR_VALUE;
281
- *p = 0;
282
- ntmp = strip_spaces(q);
283
- if(!ntmp) {
284
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
285
- goto err;
286
- }
287
- q = p + 1;
288
- } else if(c == ',') {
289
- *p = 0;
290
- ntmp = strip_spaces(q);
291
- q = p + 1;
286
+ char *p, *q, c;
287
+ char *ntmp, *vtmp;
288
+ STACK_OF(CONF_VALUE) *values = NULL;
289
+ char *linebuf;
290
+ int state;
291
+ /* We are going to modify the line so copy it first */
292
+ linebuf = BUF_strdup(line);
293
+ if (linebuf == NULL) {
294
+ OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
295
+ goto err;
296
+ }
297
+ state = HDR_NAME;
298
+ ntmp = NULL;
299
+ /* Go through all characters */
300
+ for (p = linebuf, q = linebuf; (c = *p) && (c != '\r') && (c != '\n');
301
+ p++) {
302
+
303
+ switch (state) {
304
+ case HDR_NAME:
305
+ if (c == ':') {
306
+ state = HDR_VALUE;
307
+ *p = 0;
308
+ ntmp = strip_spaces(q);
309
+ if (!ntmp) {
310
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
311
+ goto err;
312
+ }
313
+ q = p + 1;
314
+ } else if (c == ',') {
315
+ *p = 0;
316
+ ntmp = strip_spaces(q);
317
+ q = p + 1;
292
318
  #if 0
293
- printf("%s\n", ntmp);
319
+ printf("%s\n", ntmp);
294
320
  #endif
295
- if(!ntmp) {
296
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
297
- goto err;
298
- }
299
- X509V3_add_value(ntmp, NULL, &values);
300
- }
301
- break ;
302
-
303
- case HDR_VALUE:
304
- if(c == ',') {
305
- state = HDR_NAME;
306
- *p = 0;
307
- vtmp = strip_spaces(q);
321
+ if (!ntmp) {
322
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
323
+ goto err;
324
+ }
325
+ X509V3_add_value(ntmp, NULL, &values);
326
+ }
327
+ break;
328
+
329
+ case HDR_VALUE:
330
+ if (c == ',') {
331
+ state = HDR_NAME;
332
+ *p = 0;
333
+ vtmp = strip_spaces(q);
308
334
  #if 0
309
- printf("%s\n", ntmp);
335
+ printf("%s\n", ntmp);
310
336
  #endif
311
- if(!vtmp) {
312
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
313
- goto err;
314
- }
315
- X509V3_add_value(ntmp, vtmp, &values);
316
- ntmp = NULL;
317
- q = p + 1;
318
- }
319
-
320
- }
321
- }
322
-
323
- if(state == HDR_VALUE) {
324
- vtmp = strip_spaces(q);
337
+ if (!vtmp) {
338
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
339
+ goto err;
340
+ }
341
+ X509V3_add_value(ntmp, vtmp, &values);
342
+ ntmp = NULL;
343
+ q = p + 1;
344
+ }
345
+
346
+ }
347
+ }
348
+
349
+ if (state == HDR_VALUE) {
350
+ vtmp = strip_spaces(q);
325
351
  #if 0
326
- printf("%s=%s\n", ntmp, vtmp);
352
+ printf("%s=%s\n", ntmp, vtmp);
327
353
  #endif
328
- if(!vtmp) {
329
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
330
- goto err;
331
- }
332
- X509V3_add_value(ntmp, vtmp, &values);
333
- } else {
334
- ntmp = strip_spaces(q);
354
+ if (!vtmp) {
355
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_VALUE);
356
+ goto err;
357
+ }
358
+ X509V3_add_value(ntmp, vtmp, &values);
359
+ } else {
360
+ ntmp = strip_spaces(q);
335
361
  #if 0
336
- printf("%s\n", ntmp);
362
+ printf("%s\n", ntmp);
337
363
  #endif
338
- if(!ntmp) {
339
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
340
- goto err;
341
- }
342
- X509V3_add_value(ntmp, NULL, &values);
343
- }
344
- OPENSSL_free(linebuf);
345
- return values;
346
-
347
- err:
348
- OPENSSL_free(linebuf);
349
- sk_CONF_VALUE_pop_free(values, X509V3_conf_free);
350
- return NULL;
364
+ if (!ntmp) {
365
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_NAME);
366
+ goto err;
367
+ }
368
+ X509V3_add_value(ntmp, NULL, &values);
369
+ }
370
+ OPENSSL_free(linebuf);
371
+ return values;
372
+
373
+ err:
374
+ OPENSSL_free(linebuf);
375
+ sk_CONF_VALUE_pop_free(values, X509V3_conf_free);
376
+ return NULL;
351
377
 
352
378
  }
353
379
 
354
380
  /* Delete leading and trailing spaces from a string */
355
381
  static char *strip_spaces(char *name)
356
382
  {
357
- char *p, *q;
358
- /* Skip over leading spaces */
359
- p = name;
360
- while(*p && isspace((unsigned char)*p)) p++;
361
- if(!*p) return NULL;
362
- q = p + strlen(p) - 1;
363
- while((q != p) && isspace((unsigned char)*q)) q--;
364
- if(p != q) q[1] = 0;
365
- if(!*p) return NULL;
366
- return p;
383
+ char *p, *q;
384
+ /* Skip over leading spaces */
385
+ p = name;
386
+ while (*p && isspace((unsigned char)*p))
387
+ p++;
388
+ if (!*p)
389
+ return NULL;
390
+ q = p + strlen(p) - 1;
391
+ while ((q != p) && isspace((unsigned char)*q))
392
+ q--;
393
+ if (p != q)
394
+ q[1] = 0;
395
+ if (!*p)
396
+ return NULL;
397
+ return p;
367
398
  }
368
399
 
369
400
  /* hex string utilities */
370
401
 
371
- /* Given a buffer of length 'len' return a OPENSSL_malloc'ed string with its
372
- * hex representation
373
- * @@@ (Contents of buffer are always kept in ASCII, also on EBCDIC machines)
402
+ /*
403
+ * Given a buffer of length 'len' return a OPENSSL_malloc'ed string with its
404
+ * hex representation @@@ (Contents of buffer are always kept in ASCII, also
405
+ * on EBCDIC machines)
374
406
  */
375
407
 
376
408
  char *hex_to_string(const unsigned char *buffer, long len)
377
409
  {
378
- char *tmp, *q;
379
- const unsigned char *p;
380
- int i;
381
- static const char hexdig[] = "0123456789ABCDEF";
382
- if(!buffer || !len) return NULL;
383
- if(!(tmp = OPENSSL_malloc(len * 3 + 1))) {
384
- OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
385
- return NULL;
386
- }
387
- q = tmp;
388
- for(i = 0, p = buffer; i < len; i++,p++) {
389
- *q++ = hexdig[(*p >> 4) & 0xf];
390
- *q++ = hexdig[*p & 0xf];
391
- *q++ = ':';
392
- }
393
- q[-1] = 0;
394
-
395
- return tmp;
410
+ char *tmp, *q;
411
+ const unsigned char *p;
412
+ int i;
413
+ static const char hexdig[] = "0123456789ABCDEF";
414
+ if (!buffer || !len)
415
+ return NULL;
416
+ if (!(tmp = OPENSSL_malloc(len * 3 + 1))) {
417
+ OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
418
+ return NULL;
419
+ }
420
+ q = tmp;
421
+ for (i = 0, p = buffer; i < len; i++, p++) {
422
+ *q++ = hexdig[(*p >> 4) & 0xf];
423
+ *q++ = hexdig[*p & 0xf];
424
+ *q++ = ':';
425
+ }
426
+ q[-1] = 0;
427
+
428
+ return tmp;
396
429
  }
397
430
 
398
- /* Give a string of hex digits convert to
399
- * a buffer
431
+ /*
432
+ * Give a string of hex digits convert to a buffer
400
433
  */
401
434
 
402
435
  unsigned char *string_to_hex(const char *str, long *len)
403
436
  {
404
- unsigned char *hexbuf, *q;
405
- unsigned char ch, cl, *p;
406
- if(!str) {
407
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
408
- return NULL;
409
- }
410
- if(!(hexbuf = OPENSSL_malloc(strlen(str) >> 1))) goto err;
411
- for(p = (unsigned char *)str, q = hexbuf; *p;) {
412
- ch = *p++;
413
- if(ch == ':') continue;
414
- cl = *p++;
415
- if(!cl) {
416
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_ODD_NUMBER_OF_DIGITS);
417
- OPENSSL_free(hexbuf);
418
- return NULL;
419
- }
420
- if(isupper(ch)) ch = tolower(ch);
421
- if(isupper(cl)) cl = tolower(cl);
422
-
423
- if((ch >= '0') && (ch <= '9')) ch -= '0';
424
- else if ((ch >= 'a') && (ch <= 'f')) ch -= 'a' - 10;
425
- else goto badhex;
426
-
427
- if((cl >= '0') && (cl <= '9')) cl -= '0';
428
- else if ((cl >= 'a') && (cl <= 'f')) cl -= 'a' - 10;
429
- else goto badhex;
430
-
431
- *q++ = (ch << 4) | cl;
432
- }
433
-
434
- if(len) *len = q - hexbuf;
435
-
436
- return hexbuf;
437
-
438
- err:
439
- if(hexbuf) OPENSSL_free(hexbuf);
440
- OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
441
- return NULL;
442
-
443
- badhex:
444
- OPENSSL_free(hexbuf);
445
- OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT);
446
- return NULL;
437
+ unsigned char *hexbuf, *q;
438
+ unsigned char ch, cl, *p;
439
+ if (!str) {
440
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT);
441
+ return NULL;
442
+ }
443
+ if (!(hexbuf = OPENSSL_malloc(strlen(str) >> 1)))
444
+ goto err;
445
+ for (p = (unsigned char *)str, q = hexbuf; *p;) {
446
+ ch = *p++;
447
+ if (ch == ':')
448
+ continue;
449
+ cl = *p++;
450
+ if (!cl) {
451
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_ODD_NUMBER_OF_DIGITS);
452
+ OPENSSL_free(hexbuf);
453
+ return NULL;
454
+ }
455
+ if (isupper(ch))
456
+ ch = tolower(ch);
457
+ if (isupper(cl))
458
+ cl = tolower(cl);
459
+
460
+ if ((ch >= '0') && (ch <= '9'))
461
+ ch -= '0';
462
+ else if ((ch >= 'a') && (ch <= 'f'))
463
+ ch -= 'a' - 10;
464
+ else
465
+ goto badhex;
466
+
467
+ if ((cl >= '0') && (cl <= '9'))
468
+ cl -= '0';
469
+ else if ((cl >= 'a') && (cl <= 'f'))
470
+ cl -= 'a' - 10;
471
+ else
472
+ goto badhex;
473
+
474
+ *q++ = (ch << 4) | cl;
475
+ }
476
+
477
+ if (len)
478
+ *len = q - hexbuf;
479
+
480
+ return hexbuf;
481
+
482
+ err:
483
+ if (hexbuf)
484
+ OPENSSL_free(hexbuf);
485
+ OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
486
+ return NULL;
487
+
488
+ badhex:
489
+ OPENSSL_free(hexbuf);
490
+ OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT);
491
+ return NULL;
447
492
 
448
493
  }
449
494
 
450
- /* V2I name comparison function: returns zero if 'name' matches
451
- * cmp or cmp.*
495
+ /*
496
+ * V2I name comparison function: returns zero if 'name' matches cmp or cmp.*
452
497
  */
453
498
 
454
499
  int name_cmp(const char *name, const char *cmp)
455
500
  {
456
- int len, ret;
457
- char c;
458
- len = strlen(cmp);
459
- if((ret = strncmp(name, cmp, len))) return ret;
460
- c = name[len];
461
- if(!c || (c=='.')) return 0;
462
- return 1;
501
+ int len, ret;
502
+ char c;
503
+ len = strlen(cmp);
504
+ if ((ret = strncmp(name, cmp, len)))
505
+ return ret;
506
+ c = name[len];
507
+ if (!c || (c == '.'))
508
+ return 0;
509
+ return 1;
463
510
  }
464
511
 
465
512
  static int sk_strcmp(const OPENSSL_STRING *a, const OPENSSL_STRING *b)
466
513
  {
467
- return strcmp(*a, *b);
514
+ return strcmp(*a, *b);
468
515
  }
469
516
 
470
517
  STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x)
471
518
  {
472
- GENERAL_NAMES *gens;
473
- STACK_OF(OPENSSL_STRING) *ret;
519
+ GENERAL_NAMES *gens;
520
+ STACK_OF(OPENSSL_STRING) *ret;
474
521
 
475
- gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
476
- ret = get_email(X509_get_subject_name(x), gens);
477
- sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
478
- return ret;
522
+ gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
523
+ ret = get_email(X509_get_subject_name(x), gens);
524
+ sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
525
+ return ret;
479
526
  }
480
527
 
481
528
  STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x)
482
529
  {
483
- AUTHORITY_INFO_ACCESS *info;
484
- STACK_OF(OPENSSL_STRING) *ret = NULL;
485
- size_t i;
486
-
487
- info = X509_get_ext_d2i(x, NID_info_access, NULL, NULL);
488
- if (!info)
489
- return NULL;
490
- for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++)
491
- {
492
- ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
493
- if (OBJ_obj2nid(ad->method) == NID_ad_OCSP)
494
- {
495
- if (ad->location->type == GEN_URI)
496
- {
497
- if (!append_ia5(&ret, ad->location->d.uniformResourceIdentifier))
498
- break;
499
- }
500
- }
501
- }
502
- AUTHORITY_INFO_ACCESS_free(info);
503
- return ret;
530
+ AUTHORITY_INFO_ACCESS *info;
531
+ STACK_OF(OPENSSL_STRING) *ret = NULL;
532
+ size_t i;
533
+
534
+ info = X509_get_ext_d2i(x, NID_info_access, NULL, NULL);
535
+ if (!info)
536
+ return NULL;
537
+ for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++) {
538
+ ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
539
+ if (OBJ_obj2nid(ad->method) == NID_ad_OCSP) {
540
+ if (ad->location->type == GEN_URI) {
541
+ if (!append_ia5
542
+ (&ret, ad->location->d.uniformResourceIdentifier))
543
+ break;
544
+ }
545
+ }
546
+ }
547
+ AUTHORITY_INFO_ACCESS_free(info);
548
+ return ret;
504
549
  }
505
550
 
506
551
  STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x)
507
552
  {
508
- GENERAL_NAMES *gens;
509
- STACK_OF(X509_EXTENSION) *exts;
510
- STACK_OF(OPENSSL_STRING) *ret;
511
-
512
- exts = X509_REQ_get_extensions(x);
513
- gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
514
- ret = get_email(X509_REQ_get_subject_name(x), gens);
515
- sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
516
- sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
517
- return ret;
553
+ GENERAL_NAMES *gens;
554
+ STACK_OF(X509_EXTENSION) *exts;
555
+ STACK_OF(OPENSSL_STRING) *ret;
556
+
557
+ exts = X509_REQ_get_extensions(x);
558
+ gens = X509V3_get_d2i(exts, NID_subject_alt_name, NULL, NULL);
559
+ ret = get_email(X509_REQ_get_subject_name(x), gens);
560
+ sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
561
+ sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
562
+ return ret;
518
563
  }
519
564
 
520
-
521
- static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name, GENERAL_NAMES *gens)
565
+ static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name,
566
+ GENERAL_NAMES *gens)
522
567
  {
523
- STACK_OF(OPENSSL_STRING) *ret = NULL;
524
- X509_NAME_ENTRY *ne;
525
- ASN1_IA5STRING *email;
526
- GENERAL_NAME *gen;
527
- int i;
528
- size_t j;
529
- /* Now add any email address(es) to STACK */
530
- i = -1;
531
- /* First supplied X509_NAME */
532
- while((i = X509_NAME_get_index_by_NID(name,
533
- NID_pkcs9_emailAddress, i)) >= 0) {
534
- ne = X509_NAME_get_entry(name, i);
535
- email = X509_NAME_ENTRY_get_data(ne);
536
- if(!append_ia5(&ret, email)) return NULL;
537
- }
538
- for(j = 0; j < sk_GENERAL_NAME_num(gens); j++)
539
- {
540
- gen = sk_GENERAL_NAME_value(gens, j);
541
- if(gen->type != GEN_EMAIL) continue;
542
- if(!append_ia5(&ret, gen->d.ia5)) return NULL;
543
- }
544
- return ret;
568
+ STACK_OF(OPENSSL_STRING) *ret = NULL;
569
+ X509_NAME_ENTRY *ne;
570
+ ASN1_IA5STRING *email;
571
+ GENERAL_NAME *gen;
572
+ int i;
573
+ size_t j;
574
+ /* Now add any email address(es) to STACK */
575
+ i = -1;
576
+ /* First supplied X509_NAME */
577
+ while ((i = X509_NAME_get_index_by_NID(name,
578
+ NID_pkcs9_emailAddress, i)) >= 0) {
579
+ ne = X509_NAME_get_entry(name, i);
580
+ email = X509_NAME_ENTRY_get_data(ne);
581
+ if (!append_ia5(&ret, email))
582
+ return NULL;
583
+ }
584
+ for (j = 0; j < sk_GENERAL_NAME_num(gens); j++) {
585
+ gen = sk_GENERAL_NAME_value(gens, j);
586
+ if (gen->type != GEN_EMAIL)
587
+ continue;
588
+ if (!append_ia5(&ret, gen->d.ia5))
589
+ return NULL;
590
+ }
591
+ return ret;
545
592
  }
546
593
 
547
594
  static void str_free(OPENSSL_STRING str)
548
595
  {
549
- OPENSSL_free(str);
596
+ OPENSSL_free(str);
550
597
  }
551
598
 
552
599
  static int append_ia5(STACK_OF(OPENSSL_STRING) **sk, ASN1_IA5STRING *email)
553
600
  {
554
- char *emtmp;
555
- /* First some sanity checks */
556
- if(email->type != V_ASN1_IA5STRING) return 1;
557
- if(!email->data || !email->length) return 1;
558
- if(!*sk) *sk = sk_OPENSSL_STRING_new(sk_strcmp);
559
- if(!*sk) return 0;
560
- /* Don't add duplicates */
561
- if(sk_OPENSSL_STRING_find(*sk, NULL, (char *)email->data)) return 1;
562
- emtmp = BUF_strdup((char *)email->data);
563
- if(!emtmp || !sk_OPENSSL_STRING_push(*sk, emtmp)) {
564
- X509_email_free(*sk);
565
- *sk = NULL;
566
- return 0;
567
- }
568
- return 1;
601
+ char *emtmp;
602
+ /* First some sanity checks */
603
+ if (email->type != V_ASN1_IA5STRING)
604
+ return 1;
605
+ if (!email->data || !email->length)
606
+ return 1;
607
+ if (!*sk)
608
+ *sk = sk_OPENSSL_STRING_new(sk_strcmp);
609
+ if (!*sk)
610
+ return 0;
611
+ /* Don't add duplicates */
612
+ if (sk_OPENSSL_STRING_find(*sk, NULL, (char *)email->data))
613
+ return 1;
614
+ emtmp = BUF_strdup((char *)email->data);
615
+ if (!emtmp || !sk_OPENSSL_STRING_push(*sk, emtmp)) {
616
+ X509_email_free(*sk);
617
+ *sk = NULL;
618
+ return 0;
619
+ }
620
+ return 1;
569
621
  }
570
622
 
571
623
  void X509_email_free(STACK_OF(OPENSSL_STRING) *sk)
572
624
  {
573
- sk_OPENSSL_STRING_pop_free(sk, str_free);
625
+ sk_OPENSSL_STRING_pop_free(sk, str_free);
574
626
  }
575
627
 
576
- typedef int (*equal_fn)(const unsigned char *pattern, size_t pattern_len,
577
- const unsigned char *subject, size_t subject_len,
578
- unsigned int flags);
628
+ typedef int (*equal_fn) (const unsigned char *pattern, size_t pattern_len,
629
+ const unsigned char *subject, size_t subject_len,
630
+ unsigned int flags);
579
631
 
580
632
  /* Skip pattern prefix to match "wildcard" subject */
581
633
  static void skip_prefix(const unsigned char **p, size_t *plen,
582
- const unsigned char *subject, size_t subject_len,
583
- unsigned int flags)
584
- {
585
- const unsigned char *pattern = *p;
586
- size_t pattern_len = *plen;
587
-
588
- /*
589
- * If subject starts with a leading '.' followed by more octets, and
590
- * pattern is longer, compare just an equal-length suffix with the
591
- * full subject (starting at the '.'), provided the prefix contains
592
- * no NULs.
593
- */
594
- if ((flags & _X509_CHECK_FLAG_DOT_SUBDOMAINS) == 0)
595
- return;
596
-
597
- while (pattern_len > subject_len && *pattern)
598
- {
599
- if ((flags & X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS) &&
600
- *pattern == '.')
601
- break;
602
- ++pattern;
603
- --pattern_len;
604
- }
605
-
606
- /* Skip if entire prefix acceptable */
607
- if (pattern_len == subject_len)
608
- {
609
- *p = pattern;
610
- *plen = pattern_len;
611
- }
612
- }
634
+ const unsigned char *subject, size_t subject_len,
635
+ unsigned int flags)
636
+ {
637
+ const unsigned char *pattern = *p;
638
+ size_t pattern_len = *plen;
639
+
640
+ /*
641
+ * If subject starts with a leading '.' followed by more octets, and
642
+ * pattern is longer, compare just an equal-length suffix with the
643
+ * full subject (starting at the '.'), provided the prefix contains
644
+ * no NULs.
645
+ */
646
+ if ((flags & _X509_CHECK_FLAG_DOT_SUBDOMAINS) == 0)
647
+ return;
648
+
649
+ while (pattern_len > subject_len && *pattern) {
650
+ if ((flags & X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS) &&
651
+ *pattern == '.')
652
+ break;
653
+ ++pattern;
654
+ --pattern_len;
655
+ }
656
+
657
+ /* Skip if entire prefix acceptable */
658
+ if (pattern_len == subject_len) {
659
+ *p = pattern;
660
+ *plen = pattern_len;
661
+ }
662
+ }
613
663
 
614
664
  /* Compare while ASCII ignoring case. */
615
665
  static int equal_nocase(const unsigned char *pattern, size_t pattern_len,
616
- const unsigned char *subject, size_t subject_len,
617
- unsigned int flags)
618
- {
619
- skip_prefix(&pattern, &pattern_len, subject, subject_len, flags);
620
- if (pattern_len != subject_len)
621
- return 0;
622
- while (pattern_len)
623
- {
624
- unsigned char l = *pattern;
625
- unsigned char r = *subject;
626
- /* The pattern must not contain NUL characters. */
627
- if (l == 0)
628
- return 0;
629
- if (l != r)
630
- {
631
- if ('A' <= l && l <= 'Z')
632
- l = (l - 'A') + 'a';
633
- if ('A' <= r && r <= 'Z')
634
- r = (r - 'A') + 'a';
635
- if (l != r)
636
- return 0;
637
- }
638
- ++pattern;
639
- ++subject;
640
- --pattern_len;
641
- }
642
- return 1;
643
- }
666
+ const unsigned char *subject, size_t subject_len,
667
+ unsigned int flags)
668
+ {
669
+ skip_prefix(&pattern, &pattern_len, subject, subject_len, flags);
670
+ if (pattern_len != subject_len)
671
+ return 0;
672
+ while (pattern_len) {
673
+ unsigned char l = *pattern;
674
+ unsigned char r = *subject;
675
+ /* The pattern must not contain NUL characters. */
676
+ if (l == 0)
677
+ return 0;
678
+ if (l != r) {
679
+ if ('A' <= l && l <= 'Z')
680
+ l = (l - 'A') + 'a';
681
+ if ('A' <= r && r <= 'Z')
682
+ r = (r - 'A') + 'a';
683
+ if (l != r)
684
+ return 0;
685
+ }
686
+ ++pattern;
687
+ ++subject;
688
+ --pattern_len;
689
+ }
690
+ return 1;
691
+ }
644
692
 
645
693
  /* Compare using memcmp. */
646
694
  static int equal_case(const unsigned char *pattern, size_t pattern_len,
647
- const unsigned char *subject, size_t subject_len,
648
- unsigned int flags)
695
+ const unsigned char *subject, size_t subject_len,
696
+ unsigned int flags)
649
697
  {
650
- skip_prefix(&pattern, &pattern_len, subject, subject_len, flags);
651
- if (pattern_len != subject_len)
652
- return 0;
653
- return !memcmp(pattern, subject, pattern_len);
698
+ skip_prefix(&pattern, &pattern_len, subject, subject_len, flags);
699
+ if (pattern_len != subject_len)
700
+ return 0;
701
+ return !memcmp(pattern, subject, pattern_len);
654
702
  }
655
703
 
656
- /* RFC 5280, section 7.5, requires that only the domain is compared in
657
- a case-insensitive manner. */
704
+ /*
705
+ * RFC 5280, section 7.5, requires that only the domain is compared in a
706
+ * case-insensitive manner.
707
+ */
658
708
  static int equal_email(const unsigned char *a, size_t a_len,
659
- const unsigned char *b, size_t b_len,
660
- unsigned int unused_flags)
661
- {
662
- size_t i = a_len;
663
- if (a_len != b_len)
664
- return 0;
665
- /* We search backwards for the '@' character, so that we do
666
- not have to deal with quoted local-parts. The domain part
667
- is compared in a case-insensitive manner. */
668
- while (i > 0)
669
- {
670
- --i;
671
- if (a[i] == '@' || b[i] == '@')
672
- {
673
- if (!equal_nocase(a + i, a_len - i,
674
- b + i, a_len - i, 0))
675
- return 0;
676
- break;
677
- }
678
- }
679
- if (i == 0)
680
- i = a_len;
681
- return equal_case(a, i, b, i, 0);
682
- }
683
-
684
- /* Compare the prefix and suffix with the subject, and check that the
685
- characters in-between are valid. */
709
+ const unsigned char *b, size_t b_len,
710
+ unsigned int unused_flags)
711
+ {
712
+ size_t i = a_len;
713
+ if (a_len != b_len)
714
+ return 0;
715
+ /*
716
+ * We search backwards for the '@' character, so that we do not have to
717
+ * deal with quoted local-parts. The domain part is compared in a
718
+ * case-insensitive manner.
719
+ */
720
+ while (i > 0) {
721
+ --i;
722
+ if (a[i] == '@' || b[i] == '@') {
723
+ if (!equal_nocase(a + i, a_len - i, b + i, a_len - i, 0))
724
+ return 0;
725
+ break;
726
+ }
727
+ }
728
+ if (i == 0)
729
+ i = a_len;
730
+ return equal_case(a, i, b, i, 0);
731
+ }
732
+
733
+ /*
734
+ * Compare the prefix and suffix with the subject, and check that the
735
+ * characters in-between are valid.
736
+ */
686
737
  static int wildcard_match(const unsigned char *prefix, size_t prefix_len,
687
- const unsigned char *suffix, size_t suffix_len,
688
- const unsigned char *subject, size_t subject_len,
689
- unsigned int flags)
690
- {
691
- const unsigned char *wildcard_start;
692
- const unsigned char *wildcard_end;
693
- const unsigned char *p;
694
- int allow_multi = 0;
695
- int allow_idna = 0;
696
-
697
- if (subject_len < prefix_len + suffix_len)
698
- return 0;
699
- if (!equal_nocase(prefix, prefix_len, subject, prefix_len, flags))
700
- return 0;
701
- wildcard_start = subject + prefix_len;
702
- wildcard_end = subject + (subject_len - suffix_len);
703
- if (!equal_nocase(wildcard_end, suffix_len, suffix, suffix_len, flags))
704
- return 0;
705
- /*
706
- * If the wildcard makes up the entire first label, it must match at
707
- * least one character.
708
- */
709
- if (prefix_len == 0 && *suffix == '.')
710
- {
711
- if (wildcard_start == wildcard_end)
712
- return 0;
713
- allow_idna = 1;
714
- if (flags & X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS)
715
- allow_multi = 1;
716
- }
717
- /* IDNA labels cannot match partial wildcards */
718
- if (!allow_idna &&
719
- subject_len >= 4 && OPENSSL_strncasecmp((char *)subject, "xn--", 4) == 0)
720
- return 0;
721
- /* The wildcard may match a literal '*' */
722
- if (wildcard_end == wildcard_start + 1 && *wildcard_start == '*')
723
- return 1;
724
- /*
725
- * Check that the part matched by the wildcard contains only
726
- * permitted characters and only matches a single label unless
727
- * allow_multi is set.
728
- */
729
- for (p = wildcard_start; p != wildcard_end; ++p)
730
- if (!(('0' <= *p && *p <= '9') ||
731
- ('A' <= *p && *p <= 'Z') ||
732
- ('a' <= *p && *p <= 'z') ||
733
- *p == '-' || (allow_multi && *p == '.')))
734
- return 0;
735
- return 1;
736
- }
737
-
738
- #define LABEL_START (1 << 0)
739
- #define LABEL_END (1 << 1)
740
- #define LABEL_HYPHEN (1 << 2)
741
- #define LABEL_IDNA (1 << 3)
738
+ const unsigned char *suffix, size_t suffix_len,
739
+ const unsigned char *subject, size_t subject_len,
740
+ unsigned int flags)
741
+ {
742
+ const unsigned char *wildcard_start;
743
+ const unsigned char *wildcard_end;
744
+ const unsigned char *p;
745
+ int allow_multi = 0;
746
+ int allow_idna = 0;
747
+
748
+ if (subject_len < prefix_len + suffix_len)
749
+ return 0;
750
+ if (!equal_nocase(prefix, prefix_len, subject, prefix_len, flags))
751
+ return 0;
752
+ wildcard_start = subject + prefix_len;
753
+ wildcard_end = subject + (subject_len - suffix_len);
754
+ if (!equal_nocase(wildcard_end, suffix_len, suffix, suffix_len, flags))
755
+ return 0;
756
+ /*
757
+ * If the wildcard makes up the entire first label, it must match at
758
+ * least one character.
759
+ */
760
+ if (prefix_len == 0 && *suffix == '.') {
761
+ if (wildcard_start == wildcard_end)
762
+ return 0;
763
+ allow_idna = 1;
764
+ if (flags & X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS)
765
+ allow_multi = 1;
766
+ }
767
+ /* IDNA labels cannot match partial wildcards */
768
+ if (!allow_idna &&
769
+ subject_len >= 4
770
+ && OPENSSL_strncasecmp((char *)subject, "xn--", 4) == 0)
771
+ return 0;
772
+ /* The wildcard may match a literal '*' */
773
+ if (wildcard_end == wildcard_start + 1 && *wildcard_start == '*')
774
+ return 1;
775
+ /*
776
+ * Check that the part matched by the wildcard contains only
777
+ * permitted characters and only matches a single label unless
778
+ * allow_multi is set.
779
+ */
780
+ for (p = wildcard_start; p != wildcard_end; ++p)
781
+ if (!(('0' <= *p && *p <= '9') ||
782
+ ('A' <= *p && *p <= 'Z') ||
783
+ ('a' <= *p && *p <= 'z') ||
784
+ *p == '-' || (allow_multi && *p == '.')))
785
+ return 0;
786
+ return 1;
787
+ }
788
+
789
+ #define LABEL_START (1 << 0)
790
+ #define LABEL_END (1 << 1)
791
+ #define LABEL_HYPHEN (1 << 2)
792
+ #define LABEL_IDNA (1 << 3)
742
793
 
743
794
  static const unsigned char *valid_star(const unsigned char *p, size_t len,
744
- unsigned int flags)
745
- {
746
- const unsigned char *star = 0;
747
- size_t i;
748
- int state = LABEL_START;
749
- int dots = 0;
750
- for (i = 0; i < len; ++i)
751
- {
752
- /*
753
- * Locate first and only legal wildcard, either at the start
754
- * or end of a non-IDNA first and not final label.
755
- */
756
- if (p[i] == '*')
757
- {
758
- int atstart = (state & LABEL_START);
759
- int atend = (i == len - 1 || p[i+1] == '.');
760
- /*
761
- * At most one wildcard per pattern.
762
- * No wildcards in IDNA labels.
763
- * No wildcards after the first label.
764
- */
765
- if (star != NULL || (state & LABEL_IDNA) != 0 || dots)
766
- return NULL;
767
- /* Only full-label '*.example.com' wildcards? */
768
- if ((flags & X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS)
769
- && (!atstart || !atend))
770
- return NULL;
771
- /* No 'foo*bar' wildcards */
772
- if (!atstart && !atend)
773
- return NULL;
774
- star = &p[i];
775
- state &= ~LABEL_START;
776
- }
777
- else if ((state & LABEL_START) != 0)
778
- {
779
- /*
780
- * At the start of a label, skip any "xn--" and
781
- * remain in the LABEL_START state, but set the
782
- * IDNA label state
783
- */
784
- if ((state & LABEL_IDNA) == 0 && len - i >= 4
785
- && OPENSSL_strncasecmp((char *)&p[i], "xn--", 4) == 0)
786
- {
787
- i += 3;
788
- state |= LABEL_IDNA;
789
- continue;
790
- }
791
- /* Labels must start with a letter or digit */
792
- state &= ~LABEL_START;
793
- if (('a' <= p[i] && p[i] <= 'z')
794
- || ('A' <= p[i] && p[i] <= 'Z')
795
- || ('0' <= p[i] && p[i] <= '9'))
796
- continue;
797
- return NULL;
798
- }
799
- else if (('a' <= p[i] && p[i] <= 'z')
800
- || ('A' <= p[i] && p[i] <= 'Z')
801
- || ('0' <= p[i] && p[i] <= '9'))
802
- {
803
- state &= LABEL_IDNA;
804
- continue;
805
- }
806
- else if (p[i] == '.')
807
- {
808
- if (state & (LABEL_HYPHEN | LABEL_START))
809
- return NULL;
810
- state = LABEL_START;
811
- ++dots;
812
- }
813
- else if (p[i] == '-')
814
- {
815
- if (state & LABEL_HYPHEN)
816
- return NULL;
817
- state |= LABEL_HYPHEN;
818
- }
819
- else
820
- return NULL;
821
- }
822
-
823
- /*
824
- * The final label must not end in a hyphen or ".", and
825
- * there must be at least two dots after the star.
826
- */
827
- if ((state & (LABEL_START | LABEL_HYPHEN)) != 0
828
- || dots < 2)
829
- return NULL;
830
- return star;
831
- }
795
+ unsigned int flags)
796
+ {
797
+ const unsigned char *star = 0;
798
+ size_t i;
799
+ int state = LABEL_START;
800
+ int dots = 0;
801
+ for (i = 0; i < len; ++i) {
802
+ /*
803
+ * Locate first and only legal wildcard, either at the start
804
+ * or end of a non-IDNA first and not final label.
805
+ */
806
+ if (p[i] == '*') {
807
+ int atstart = (state & LABEL_START);
808
+ int atend = (i == len - 1 || p[i + 1] == '.');
809
+ /*
810
+ * At most one wildcard per pattern.
811
+ * No wildcards in IDNA labels.
812
+ * No wildcards after the first label.
813
+ */
814
+ if (star != NULL || (state & LABEL_IDNA) != 0 || dots)
815
+ return NULL;
816
+ /* Only full-label '*.example.com' wildcards? */
817
+ if ((flags & X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS)
818
+ && (!atstart || !atend))
819
+ return NULL;
820
+ /* No 'foo*bar' wildcards */
821
+ if (!atstart && !atend)
822
+ return NULL;
823
+ star = &p[i];
824
+ state &= ~LABEL_START;
825
+ } else if ((state & LABEL_START) != 0) {
826
+ /*
827
+ * At the start of a label, skip any "xn--" and
828
+ * remain in the LABEL_START state, but set the
829
+ * IDNA label state
830
+ */
831
+ if ((state & LABEL_IDNA) == 0 && len - i >= 4
832
+ && OPENSSL_strncasecmp((char *)&p[i], "xn--", 4) == 0) {
833
+ i += 3;
834
+ state |= LABEL_IDNA;
835
+ continue;
836
+ }
837
+ /* Labels must start with a letter or digit */
838
+ state &= ~LABEL_START;
839
+ if (('a' <= p[i] && p[i] <= 'z')
840
+ || ('A' <= p[i] && p[i] <= 'Z')
841
+ || ('0' <= p[i] && p[i] <= '9'))
842
+ continue;
843
+ return NULL;
844
+ } else if (('a' <= p[i] && p[i] <= 'z')
845
+ || ('A' <= p[i] && p[i] <= 'Z')
846
+ || ('0' <= p[i] && p[i] <= '9')) {
847
+ state &= LABEL_IDNA;
848
+ continue;
849
+ } else if (p[i] == '.') {
850
+ if (state & (LABEL_HYPHEN | LABEL_START))
851
+ return NULL;
852
+ state = LABEL_START;
853
+ ++dots;
854
+ } else if (p[i] == '-') {
855
+ if (state & LABEL_HYPHEN)
856
+ return NULL;
857
+ state |= LABEL_HYPHEN;
858
+ } else
859
+ return NULL;
860
+ }
861
+
862
+ /*
863
+ * The final label must not end in a hyphen or ".", and
864
+ * there must be at least two dots after the star.
865
+ */
866
+ if ((state & (LABEL_START | LABEL_HYPHEN)) != 0 || dots < 2)
867
+ return NULL;
868
+ return star;
869
+ }
832
870
 
833
871
  /* Compare using wildcards. */
834
872
  static int equal_wildcard(const unsigned char *pattern, size_t pattern_len,
835
- const unsigned char *subject, size_t subject_len,
836
- unsigned int flags)
837
- {
838
- const unsigned char *star = NULL;
839
-
840
- /*
841
- * Subject names starting with '.' can only match a wildcard pattern
842
- * via a subject sub-domain pattern suffix match.
843
- */
844
- if (!(subject_len > 1 && subject[0] == '.'))
845
- star = valid_star(pattern, pattern_len, flags);
846
- if (star == NULL)
847
- return equal_nocase(pattern, pattern_len,
848
- subject, subject_len, flags);
849
- return wildcard_match(pattern, star - pattern,
850
- star + 1, (pattern + pattern_len) - star - 1,
851
- subject, subject_len, flags);
852
- }
853
-
854
- /* Compare an ASN1_STRING to a supplied string. If they match
855
- * return 1. If cmp_type > 0 only compare if string matches the
856
- * type, otherwise convert it to UTF8.
873
+ const unsigned char *subject, size_t subject_len,
874
+ unsigned int flags)
875
+ {
876
+ const unsigned char *star = NULL;
877
+
878
+ /*
879
+ * Subject names starting with '.' can only match a wildcard pattern
880
+ * via a subject sub-domain pattern suffix match.
881
+ */
882
+ if (!(subject_len > 1 && subject[0] == '.'))
883
+ star = valid_star(pattern, pattern_len, flags);
884
+ if (star == NULL)
885
+ return equal_nocase(pattern, pattern_len,
886
+ subject, subject_len, flags);
887
+ return wildcard_match(pattern, star - pattern,
888
+ star + 1, (pattern + pattern_len) - star - 1,
889
+ subject, subject_len, flags);
890
+ }
891
+
892
+ /*
893
+ * Compare an ASN1_STRING to a supplied string. If they match return 1. If
894
+ * cmp_type > 0 only compare if string matches the type, otherwise convert it
895
+ * to UTF8.
857
896
  */
858
897
 
859
898
  static int do_check_string(ASN1_STRING *a, int cmp_type, equal_fn equal,
860
- unsigned int flags, const char *b, size_t blen,
861
- char **peername)
862
- {
863
- int rv = 0;
864
-
865
- if (!a->data || !a->length)
866
- return 0;
867
- if (cmp_type > 0)
868
- {
869
- if (cmp_type != a->type)
870
- return 0;
871
- if (cmp_type == V_ASN1_IA5STRING)
872
- rv = equal(a->data, a->length,
873
- (unsigned char *)b, blen, flags);
874
- else if (a->length == (int)blen && !memcmp(a->data, b, blen))
875
- rv = 1;
876
- if (rv > 0 && peername)
877
- *peername = BUF_strndup((char *)a->data, a->length);
878
- }
879
- else
880
- {
881
- int astrlen;
882
- unsigned char *astr;
883
- astrlen = ASN1_STRING_to_UTF8(&astr, a);
884
- if (astrlen < 0)
885
- return -1;
886
- rv = equal(astr, astrlen, (unsigned char *)b, blen, flags);
887
- if (rv > 0 && peername)
888
- *peername = BUF_strndup((char *)astr, astrlen);
889
- OPENSSL_free(astr);
890
- }
891
- return rv;
892
- }
899
+ unsigned int flags, const char *b, size_t blen,
900
+ char **peername)
901
+ {
902
+ int rv = 0;
903
+
904
+ if (!a->data || !a->length)
905
+ return 0;
906
+ if (cmp_type > 0) {
907
+ if (cmp_type != a->type)
908
+ return 0;
909
+ if (cmp_type == V_ASN1_IA5STRING)
910
+ rv = equal(a->data, a->length, (unsigned char *)b, blen, flags);
911
+ else if (a->length == (int)blen && !memcmp(a->data, b, blen))
912
+ rv = 1;
913
+ if (rv > 0 && peername)
914
+ *peername = BUF_strndup((char *)a->data, a->length);
915
+ } else {
916
+ int astrlen;
917
+ unsigned char *astr;
918
+ astrlen = ASN1_STRING_to_UTF8(&astr, a);
919
+ if (astrlen < 0)
920
+ return -1;
921
+ rv = equal(astr, astrlen, (unsigned char *)b, blen, flags);
922
+ if (rv > 0 && peername)
923
+ *peername = BUF_strndup((char *)astr, astrlen);
924
+ OPENSSL_free(astr);
925
+ }
926
+ return rv;
927
+ }
893
928
 
894
929
  static int do_x509_check(X509 *x, const char *chk, size_t chklen,
895
- unsigned int flags, int check_type,
896
- char **peername)
897
- {
898
- GENERAL_NAMES *gens = NULL;
899
- X509_NAME *name = NULL;
900
- size_t i;
901
- int j;
902
- int cnid = NID_undef;
903
- int alt_type;
904
- int san_present = 0;
905
- int rv = 0;
906
- equal_fn equal;
907
-
908
- /* See below, this flag is internal-only */
909
- flags &= ~_X509_CHECK_FLAG_DOT_SUBDOMAINS;
910
- if (check_type == GEN_EMAIL)
911
- {
912
- cnid = NID_pkcs9_emailAddress;
913
- alt_type = V_ASN1_IA5STRING;
914
- equal = equal_email;
915
- }
916
- else if (check_type == GEN_DNS)
917
- {
918
- cnid = NID_commonName;
919
- /* Implicit client-side DNS sub-domain pattern */
920
- if (chklen > 1 && chk[0] == '.')
921
- flags |= _X509_CHECK_FLAG_DOT_SUBDOMAINS;
922
- alt_type = V_ASN1_IA5STRING;
923
- if (flags & X509_CHECK_FLAG_NO_WILDCARDS)
924
- equal = equal_nocase;
925
- else
926
- equal = equal_wildcard;
927
- }
928
- else
929
- {
930
- alt_type = V_ASN1_OCTET_STRING;
931
- equal = equal_case;
932
- }
933
-
934
- gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
935
- if (gens)
936
- {
937
- for (i = 0; i < sk_GENERAL_NAME_num(gens); i++)
938
- {
939
- GENERAL_NAME *gen;
940
- ASN1_STRING *cstr;
941
- gen = sk_GENERAL_NAME_value(gens, i);
942
- if (gen->type != check_type)
943
- continue;
944
- san_present = 1;
945
- if (check_type == GEN_EMAIL)
946
- cstr = gen->d.rfc822Name;
947
- else if (check_type == GEN_DNS)
948
- cstr = gen->d.dNSName;
949
- else
950
- cstr = gen->d.iPAddress;
951
- /* Positive on success, negative on error! */
952
- if ((rv = do_check_string(cstr, alt_type, equal, flags,
953
- chk, chklen, peername)) != 0)
954
- break;
955
- }
956
- GENERAL_NAMES_free(gens);
957
- if (rv != 0)
958
- return rv;
959
- if (cnid == NID_undef
960
- || (san_present
961
- && !(flags & X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT)))
962
- return 0;
963
- }
964
-
965
- /* We're done if CN-ID is not pertinent */
966
- if (cnid == NID_undef)
967
- return 0;
968
-
969
- j = -1;
970
- name = X509_get_subject_name(x);
971
- while((j = X509_NAME_get_index_by_NID(name, cnid, j)) >= 0)
972
- {
973
- X509_NAME_ENTRY *ne;
974
- ASN1_STRING *str;
975
- ne = X509_NAME_get_entry(name, j);
976
- str = X509_NAME_ENTRY_get_data(ne);
977
- /* Positive on success, negative on error! */
978
- if ((rv = do_check_string(str, -1, equal, flags,
979
- chk, chklen, peername)) != 0)
980
- return rv;
981
- }
982
- return 0;
983
- }
930
+ unsigned int flags, int check_type, char **peername)
931
+ {
932
+ GENERAL_NAMES *gens = NULL;
933
+ X509_NAME *name = NULL;
934
+ size_t i;
935
+ int j;
936
+ int cnid = NID_undef;
937
+ int alt_type;
938
+ int san_present = 0;
939
+ int rv = 0;
940
+ equal_fn equal;
941
+
942
+ /* See below, this flag is internal-only */
943
+ flags &= ~_X509_CHECK_FLAG_DOT_SUBDOMAINS;
944
+ if (check_type == GEN_EMAIL) {
945
+ cnid = NID_pkcs9_emailAddress;
946
+ alt_type = V_ASN1_IA5STRING;
947
+ equal = equal_email;
948
+ } else if (check_type == GEN_DNS) {
949
+ cnid = NID_commonName;
950
+ /* Implicit client-side DNS sub-domain pattern */
951
+ if (chklen > 1 && chk[0] == '.')
952
+ flags |= _X509_CHECK_FLAG_DOT_SUBDOMAINS;
953
+ alt_type = V_ASN1_IA5STRING;
954
+ if (flags & X509_CHECK_FLAG_NO_WILDCARDS)
955
+ equal = equal_nocase;
956
+ else
957
+ equal = equal_wildcard;
958
+ } else {
959
+ alt_type = V_ASN1_OCTET_STRING;
960
+ equal = equal_case;
961
+ }
962
+
963
+ gens = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
964
+ if (gens) {
965
+ for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
966
+ GENERAL_NAME *gen;
967
+ ASN1_STRING *cstr;
968
+ gen = sk_GENERAL_NAME_value(gens, i);
969
+ if (gen->type != check_type)
970
+ continue;
971
+ san_present = 1;
972
+ if (check_type == GEN_EMAIL)
973
+ cstr = gen->d.rfc822Name;
974
+ else if (check_type == GEN_DNS)
975
+ cstr = gen->d.dNSName;
976
+ else
977
+ cstr = gen->d.iPAddress;
978
+ /* Positive on success, negative on error! */
979
+ if ((rv = do_check_string(cstr, alt_type, equal, flags,
980
+ chk, chklen, peername)) != 0)
981
+ break;
982
+ }
983
+ GENERAL_NAMES_free(gens);
984
+ if (rv != 0)
985
+ return rv;
986
+ if (cnid == NID_undef
987
+ || (san_present
988
+ && !(flags & X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT)))
989
+ return 0;
990
+ }
991
+
992
+ /* We're done if CN-ID is not pertinent */
993
+ if (cnid == NID_undef)
994
+ return 0;
995
+
996
+ j = -1;
997
+ name = X509_get_subject_name(x);
998
+ while ((j = X509_NAME_get_index_by_NID(name, cnid, j)) >= 0) {
999
+ X509_NAME_ENTRY *ne;
1000
+ ASN1_STRING *str;
1001
+ ne = X509_NAME_get_entry(name, j);
1002
+ str = X509_NAME_ENTRY_get_data(ne);
1003
+ /* Positive on success, negative on error! */
1004
+ if ((rv = do_check_string(str, -1, equal, flags,
1005
+ chk, chklen, peername)) != 0)
1006
+ return rv;
1007
+ }
1008
+ return 0;
1009
+ }
984
1010
 
985
1011
  int X509_check_host(X509 *x, const char *chk, size_t chklen,
986
- unsigned int flags, char **peername)
987
- {
988
- if (chk == NULL)
989
- return -2;
990
- if (memchr(chk, '\0', chklen))
991
- return -2;
992
- return do_x509_check(x, chk, chklen, flags, GEN_DNS, peername);
993
- }
1012
+ unsigned int flags, char **peername)
1013
+ {
1014
+ if (chk == NULL)
1015
+ return -2;
1016
+ if (memchr(chk, '\0', chklen))
1017
+ return -2;
1018
+ return do_x509_check(x, chk, chklen, flags, GEN_DNS, peername);
1019
+ }
994
1020
 
995
1021
  int X509_check_email(X509 *x, const char *chk, size_t chklen,
996
- unsigned int flags)
997
- {
998
- if (chk == NULL)
999
- return -2;
1000
- if (memchr(chk, '\0', chklen))
1001
- return -2;
1002
- return do_x509_check(x, chk, chklen, flags, GEN_EMAIL, NULL);
1003
- }
1022
+ unsigned int flags)
1023
+ {
1024
+ if (chk == NULL)
1025
+ return -2;
1026
+ if (memchr(chk, '\0', chklen))
1027
+ return -2;
1028
+ return do_x509_check(x, chk, chklen, flags, GEN_EMAIL, NULL);
1029
+ }
1004
1030
 
1005
1031
  int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen,
1006
- unsigned int flags)
1007
- {
1008
- if (chk == NULL)
1009
- return -2;
1010
- return do_x509_check(x, (char *)chk, chklen, flags, GEN_IPADD, NULL);
1011
- }
1032
+ unsigned int flags)
1033
+ {
1034
+ if (chk == NULL)
1035
+ return -2;
1036
+ return do_x509_check(x, (char *)chk, chklen, flags, GEN_IPADD, NULL);
1037
+ }
1012
1038
 
1013
1039
  int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags)
1014
- {
1015
- unsigned char ipout[16];
1016
- size_t iplen;
1017
-
1018
- if (ipasc == NULL)
1019
- return -2;
1020
- iplen = (size_t) a2i_ipadd(ipout, ipasc);
1021
- if (iplen == 0)
1022
- return -2;
1023
- return do_x509_check(x, (char *)ipout, iplen, flags, GEN_IPADD, NULL);
1024
- }
1025
-
1026
- /* Convert IP addresses both IPv4 and IPv6 into an
1027
- * OCTET STRING compatible with RFC3280.
1040
+ {
1041
+ unsigned char ipout[16];
1042
+ size_t iplen;
1043
+
1044
+ if (ipasc == NULL)
1045
+ return -2;
1046
+ iplen = (size_t)a2i_ipadd(ipout, ipasc);
1047
+ if (iplen == 0)
1048
+ return -2;
1049
+ return do_x509_check(x, (char *)ipout, iplen, flags, GEN_IPADD, NULL);
1050
+ }
1051
+
1052
+ /*
1053
+ * Convert IP addresses both IPv4 and IPv6 into an OCTET STRING compatible
1054
+ * with RFC3280.
1028
1055
  */
1029
1056
 
1030
1057
  ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc)
1031
- {
1032
- unsigned char ipout[16];
1033
- ASN1_OCTET_STRING *ret;
1034
- int iplen;
1058
+ {
1059
+ unsigned char ipout[16];
1060
+ ASN1_OCTET_STRING *ret;
1061
+ int iplen;
1035
1062
 
1036
- /* If string contains a ':' assume IPv6 */
1063
+ /* If string contains a ':' assume IPv6 */
1037
1064
 
1038
- iplen = a2i_ipadd(ipout, ipasc);
1065
+ iplen = a2i_ipadd(ipout, ipasc);
1039
1066
 
1040
- if (!iplen)
1041
- return NULL;
1067
+ if (!iplen)
1068
+ return NULL;
1042
1069
 
1043
- ret = ASN1_OCTET_STRING_new();
1044
- if (!ret)
1045
- return NULL;
1046
- if (!ASN1_OCTET_STRING_set(ret, ipout, iplen))
1047
- {
1048
- ASN1_OCTET_STRING_free(ret);
1049
- return NULL;
1050
- }
1051
- return ret;
1052
- }
1070
+ ret = ASN1_OCTET_STRING_new();
1071
+ if (!ret)
1072
+ return NULL;
1073
+ if (!ASN1_OCTET_STRING_set(ret, ipout, iplen)) {
1074
+ ASN1_OCTET_STRING_free(ret);
1075
+ return NULL;
1076
+ }
1077
+ return ret;
1078
+ }
1053
1079
 
1054
1080
  ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc)
1055
- {
1056
- ASN1_OCTET_STRING *ret = NULL;
1057
- unsigned char ipout[32];
1058
- char *iptmp = NULL, *p;
1059
- int iplen1, iplen2;
1060
- p = strchr(ipasc,'/');
1061
- if (!p)
1062
- return NULL;
1063
- iptmp = BUF_strdup(ipasc);
1064
- if (!iptmp)
1065
- return NULL;
1066
- p = iptmp + (p - ipasc);
1067
- *p++ = 0;
1068
-
1069
- iplen1 = a2i_ipadd(ipout, iptmp);
1070
-
1071
- if (!iplen1)
1072
- goto err;
1073
-
1074
- iplen2 = a2i_ipadd(ipout + iplen1, p);
1075
-
1076
- OPENSSL_free(iptmp);
1077
- iptmp = NULL;
1078
-
1079
- if (!iplen2 || (iplen1 != iplen2))
1080
- goto err;
1081
-
1082
- ret = ASN1_OCTET_STRING_new();
1083
- if (!ret)
1084
- goto err;
1085
- if (!ASN1_OCTET_STRING_set(ret, ipout, iplen1 + iplen2))
1086
- goto err;
1087
-
1088
- return ret;
1089
-
1090
- err:
1091
- if (iptmp)
1092
- OPENSSL_free(iptmp);
1093
- if (ret)
1094
- ASN1_OCTET_STRING_free(ret);
1095
- return NULL;
1096
- }
1097
-
1081
+ {
1082
+ ASN1_OCTET_STRING *ret = NULL;
1083
+ unsigned char ipout[32];
1084
+ char *iptmp = NULL, *p;
1085
+ int iplen1, iplen2;
1086
+ p = strchr(ipasc, '/');
1087
+ if (!p)
1088
+ return NULL;
1089
+ iptmp = BUF_strdup(ipasc);
1090
+ if (!iptmp)
1091
+ return NULL;
1092
+ p = iptmp + (p - ipasc);
1093
+ *p++ = 0;
1094
+
1095
+ iplen1 = a2i_ipadd(ipout, iptmp);
1096
+
1097
+ if (!iplen1)
1098
+ goto err;
1099
+
1100
+ iplen2 = a2i_ipadd(ipout + iplen1, p);
1101
+
1102
+ OPENSSL_free(iptmp);
1103
+ iptmp = NULL;
1104
+
1105
+ if (!iplen2 || (iplen1 != iplen2))
1106
+ goto err;
1107
+
1108
+ ret = ASN1_OCTET_STRING_new();
1109
+ if (!ret)
1110
+ goto err;
1111
+ if (!ASN1_OCTET_STRING_set(ret, ipout, iplen1 + iplen2))
1112
+ goto err;
1113
+
1114
+ return ret;
1115
+
1116
+ err:
1117
+ if (iptmp)
1118
+ OPENSSL_free(iptmp);
1119
+ if (ret)
1120
+ ASN1_OCTET_STRING_free(ret);
1121
+ return NULL;
1122
+ }
1098
1123
 
1099
1124
  int a2i_ipadd(unsigned char *ipout, const char *ipasc)
1100
- {
1101
- /* If string contains a ':' assume IPv6 */
1102
-
1103
- if (strchr(ipasc, ':'))
1104
- {
1105
- if (!ipv6_from_asc(ipout, ipasc))
1106
- return 0;
1107
- return 16;
1108
- }
1109
- else
1110
- {
1111
- if (!ipv4_from_asc(ipout, ipasc))
1112
- return 0;
1113
- return 4;
1114
- }
1115
- }
1125
+ {
1126
+ /* If string contains a ':' assume IPv6 */
1127
+
1128
+ if (strchr(ipasc, ':')) {
1129
+ if (!ipv6_from_asc(ipout, ipasc))
1130
+ return 0;
1131
+ return 16;
1132
+ } else {
1133
+ if (!ipv4_from_asc(ipout, ipasc))
1134
+ return 0;
1135
+ return 4;
1136
+ }
1137
+ }
1116
1138
 
1117
1139
  static int ipv4_from_asc(unsigned char *v4, const char *in)
1118
- {
1119
- int a0, a1, a2, a3;
1120
- if (sscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != 4)
1121
- return 0;
1122
- if ((a0 < 0) || (a0 > 255) || (a1 < 0) || (a1 > 255)
1123
- || (a2 < 0) || (a2 > 255) || (a3 < 0) || (a3 > 255))
1124
- return 0;
1125
- v4[0] = a0;
1126
- v4[1] = a1;
1127
- v4[2] = a2;
1128
- v4[3] = a3;
1129
- return 1;
1130
- }
1140
+ {
1141
+ int a0, a1, a2, a3;
1142
+ if (sscanf(in, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) != 4)
1143
+ return 0;
1144
+ if ((a0 < 0) || (a0 > 255) || (a1 < 0) || (a1 > 255)
1145
+ || (a2 < 0) || (a2 > 255) || (a3 < 0) || (a3 > 255))
1146
+ return 0;
1147
+ v4[0] = a0;
1148
+ v4[1] = a1;
1149
+ v4[2] = a2;
1150
+ v4[3] = a3;
1151
+ return 1;
1152
+ }
1131
1153
 
1132
1154
  typedef struct {
1133
- /* Temporary store for IPV6 output */
1134
- unsigned char tmp[16];
1135
- /* Total number of bytes in tmp */
1136
- int total;
1137
- /* The position of a zero (corresponding to '::') */
1138
- int zero_pos;
1139
- /* Number of zeroes */
1140
- int zero_cnt;
1141
- } IPV6_STAT;
1142
-
1155
+ /* Temporary store for IPV6 output */
1156
+ unsigned char tmp[16];
1157
+ /* Total number of bytes in tmp */
1158
+ int total;
1159
+ /* The position of a zero (corresponding to '::') */
1160
+ int zero_pos;
1161
+ /* Number of zeroes */
1162
+ int zero_cnt;
1163
+ } IPV6_STAT;
1143
1164
 
1144
1165
  static int ipv6_from_asc(unsigned char *v6, const char *in)
1145
- {
1146
- IPV6_STAT v6stat;
1147
- v6stat.total = 0;
1148
- v6stat.zero_pos = -1;
1149
- v6stat.zero_cnt = 0;
1150
- /* Treat the IPv6 representation as a list of values
1151
- * separated by ':'. The presence of a '::' will parse
1152
- * as one, two or three zero length elements.
1153
- */
1154
- if (!CONF_parse_list(in, ':', 0, ipv6_cb, &v6stat))
1155
- return 0;
1156
-
1157
- /* Now for some sanity checks */
1158
-
1159
- if (v6stat.zero_pos == -1)
1160
- {
1161
- /* If no '::' must have exactly 16 bytes */
1162
- if (v6stat.total != 16)
1163
- return 0;
1164
- }
1165
- else
1166
- {
1167
- /* If '::' must have less than 16 bytes */
1168
- if (v6stat.total == 16)
1169
- return 0;
1170
- /* More than three zeroes is an error */
1171
- if (v6stat.zero_cnt > 3)
1172
- return 0;
1173
- /* Can only have three zeroes if nothing else present */
1174
- else if (v6stat.zero_cnt == 3)
1175
- {
1176
- if (v6stat.total > 0)
1177
- return 0;
1178
- }
1179
- /* Can only have two zeroes if at start or end */
1180
- else if (v6stat.zero_cnt == 2)
1181
- {
1182
- if ((v6stat.zero_pos != 0)
1183
- && (v6stat.zero_pos != v6stat.total))
1184
- return 0;
1185
- }
1186
- else
1187
- /* Can only have one zero if *not* start or end */
1188
- {
1189
- if ((v6stat.zero_pos == 0)
1190
- || (v6stat.zero_pos == v6stat.total))
1191
- return 0;
1192
- }
1193
- }
1194
-
1195
- /* Format result */
1196
-
1197
- if (v6stat.zero_pos >= 0)
1198
- {
1199
- /* Copy initial part */
1200
- memcpy(v6, v6stat.tmp, v6stat.zero_pos);
1201
- /* Zero middle */
1202
- memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
1203
- /* Copy final part */
1204
- if (v6stat.total != v6stat.zero_pos)
1205
- memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
1206
- v6stat.tmp + v6stat.zero_pos,
1207
- v6stat.total - v6stat.zero_pos);
1208
- }
1209
- else
1210
- memcpy(v6, v6stat.tmp, 16);
1211
-
1212
- return 1;
1213
- }
1166
+ {
1167
+ IPV6_STAT v6stat;
1168
+ v6stat.total = 0;
1169
+ v6stat.zero_pos = -1;
1170
+ v6stat.zero_cnt = 0;
1171
+ /*
1172
+ * Treat the IPv6 representation as a list of values separated by ':'.
1173
+ * The presence of a '::' will parse as one, two or three zero length
1174
+ * elements.
1175
+ */
1176
+ if (!CONF_parse_list(in, ':', 0, ipv6_cb, &v6stat))
1177
+ return 0;
1178
+
1179
+ /* Now for some sanity checks */
1180
+
1181
+ if (v6stat.zero_pos == -1) {
1182
+ /* If no '::' must have exactly 16 bytes */
1183
+ if (v6stat.total != 16)
1184
+ return 0;
1185
+ } else {
1186
+ /* If '::' must have less than 16 bytes */
1187
+ if (v6stat.total == 16)
1188
+ return 0;
1189
+ /* More than three zeroes is an error */
1190
+ if (v6stat.zero_cnt > 3)
1191
+ return 0;
1192
+ /* Can only have three zeroes if nothing else present */
1193
+ else if (v6stat.zero_cnt == 3) {
1194
+ if (v6stat.total > 0)
1195
+ return 0;
1196
+ }
1197
+ /* Can only have two zeroes if at start or end */
1198
+ else if (v6stat.zero_cnt == 2) {
1199
+ if ((v6stat.zero_pos != 0)
1200
+ && (v6stat.zero_pos != v6stat.total))
1201
+ return 0;
1202
+ } else
1203
+ /* Can only have one zero if *not* start or end */
1204
+ {
1205
+ if ((v6stat.zero_pos == 0)
1206
+ || (v6stat.zero_pos == v6stat.total))
1207
+ return 0;
1208
+ }
1209
+ }
1210
+
1211
+ /* Format result */
1212
+
1213
+ if (v6stat.zero_pos >= 0) {
1214
+ /* Copy initial part */
1215
+ memcpy(v6, v6stat.tmp, v6stat.zero_pos);
1216
+ /* Zero middle */
1217
+ memset(v6 + v6stat.zero_pos, 0, 16 - v6stat.total);
1218
+ /* Copy final part */
1219
+ if (v6stat.total != v6stat.zero_pos)
1220
+ memcpy(v6 + v6stat.zero_pos + 16 - v6stat.total,
1221
+ v6stat.tmp + v6stat.zero_pos,
1222
+ v6stat.total - v6stat.zero_pos);
1223
+ } else
1224
+ memcpy(v6, v6stat.tmp, 16);
1225
+
1226
+ return 1;
1227
+ }
1214
1228
 
1215
1229
  static int ipv6_cb(const char *elem, int len, void *usr)
1216
- {
1217
- IPV6_STAT *s = usr;
1218
- /* Error if 16 bytes written */
1219
- if (s->total == 16)
1220
- return 0;
1221
- if (len == 0)
1222
- {
1223
- /* Zero length element, corresponds to '::' */
1224
- if (s->zero_pos == -1)
1225
- s->zero_pos = s->total;
1226
- /* If we've already got a :: its an error */
1227
- else if (s->zero_pos != s->total)
1228
- return 0;
1229
- s->zero_cnt++;
1230
- }
1231
- else
1232
- {
1233
- /* If more than 4 characters could be final a.b.c.d form */
1234
- if (len > 4)
1235
- {
1236
- /* Need at least 4 bytes left */
1237
- if (s->total > 12)
1238
- return 0;
1239
- /* Must be end of string */
1240
- if (elem[len])
1241
- return 0;
1242
- if (!ipv4_from_asc(s->tmp + s->total, elem))
1243
- return 0;
1244
- s->total += 4;
1245
- }
1246
- else
1247
- {
1248
- if (!ipv6_hex(s->tmp + s->total, elem, len))
1249
- return 0;
1250
- s->total += 2;
1251
- }
1252
- }
1253
- return 1;
1254
- }
1255
-
1256
- /* Convert a string of up to 4 hex digits into the corresponding
1257
- * IPv6 form.
1230
+ {
1231
+ IPV6_STAT *s = usr;
1232
+ /* Error if 16 bytes written */
1233
+ if (s->total == 16)
1234
+ return 0;
1235
+ if (len == 0) {
1236
+ /* Zero length element, corresponds to '::' */
1237
+ if (s->zero_pos == -1)
1238
+ s->zero_pos = s->total;
1239
+ /* If we've already got a :: its an error */
1240
+ else if (s->zero_pos != s->total)
1241
+ return 0;
1242
+ s->zero_cnt++;
1243
+ } else {
1244
+ /* If more than 4 characters could be final a.b.c.d form */
1245
+ if (len > 4) {
1246
+ /* Need at least 4 bytes left */
1247
+ if (s->total > 12)
1248
+ return 0;
1249
+ /* Must be end of string */
1250
+ if (elem[len])
1251
+ return 0;
1252
+ if (!ipv4_from_asc(s->tmp + s->total, elem))
1253
+ return 0;
1254
+ s->total += 4;
1255
+ } else {
1256
+ if (!ipv6_hex(s->tmp + s->total, elem, len))
1257
+ return 0;
1258
+ s->total += 2;
1259
+ }
1260
+ }
1261
+ return 1;
1262
+ }
1263
+
1264
+ /*
1265
+ * Convert a string of up to 4 hex digits into the corresponding IPv6 form.
1258
1266
  */
1259
1267
 
1260
1268
  static int ipv6_hex(unsigned char *out, const char *in, int inlen)
1261
- {
1262
- unsigned char c;
1263
- unsigned int num = 0;
1264
- if (inlen > 4)
1265
- return 0;
1266
- while(inlen--)
1267
- {
1268
- c = *in++;
1269
- num <<= 4;
1270
- if ((c >= '0') && (c <= '9'))
1271
- num |= c - '0';
1272
- else if ((c >= 'A') && (c <= 'F'))
1273
- num |= c - 'A' + 10;
1274
- else if ((c >= 'a') && (c <= 'f'))
1275
- num |= c - 'a' + 10;
1276
- else
1277
- return 0;
1278
- }
1279
- out[0] = num >> 8;
1280
- out[1] = num & 0xff;
1281
- return 1;
1282
- }
1283
-
1284
-
1285
- int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE)*dn_sk,
1286
- unsigned long chtype)
1287
- {
1288
- CONF_VALUE *v;
1289
- int mval;
1290
- size_t i;
1291
- char *p, *type;
1292
- if (!nm)
1293
- return 0;
1294
-
1295
- for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++)
1296
- {
1297
- v=sk_CONF_VALUE_value(dn_sk,i);
1298
- type=v->name;
1299
- /* Skip past any leading X. X: X, etc to allow for
1300
- * multiple instances
1301
- */
1302
- for(p = type; *p ; p++)
1303
- if ((*p == ':') || (*p == ',') || (*p == '.'))
1304
- {
1305
- p++;
1306
- if(*p) type = p;
1307
- break;
1308
- }
1309
- if (*type == '+')
1310
- {
1311
- mval = -1;
1312
- type++;
1313
- }
1314
- else
1315
- mval = 0;
1316
- if (!X509_NAME_add_entry_by_txt(nm,type, chtype,
1317
- (unsigned char *) v->value,-1,-1,mval))
1318
- return 0;
1319
-
1320
- }
1321
- return 1;
1322
- }
1269
+ {
1270
+ unsigned char c;
1271
+ unsigned int num = 0;
1272
+ if (inlen > 4)
1273
+ return 0;
1274
+ while (inlen--) {
1275
+ c = *in++;
1276
+ num <<= 4;
1277
+ if ((c >= '0') && (c <= '9'))
1278
+ num |= c - '0';
1279
+ else if ((c >= 'A') && (c <= 'F'))
1280
+ num |= c - 'A' + 10;
1281
+ else if ((c >= 'a') && (c <= 'f'))
1282
+ num |= c - 'a' + 10;
1283
+ else
1284
+ return 0;
1285
+ }
1286
+ out[0] = num >> 8;
1287
+ out[1] = num & 0xff;
1288
+ return 1;
1289
+ }
1290
+
1291
+ int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF (CONF_VALUE) * dn_sk,
1292
+ unsigned long chtype)
1293
+ {
1294
+ CONF_VALUE *v;
1295
+ int mval;
1296
+ size_t i;
1297
+ char *p, *type;
1298
+ if (!nm)
1299
+ return 0;
1300
+
1301
+ for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++) {
1302
+ v = sk_CONF_VALUE_value(dn_sk, i);
1303
+ type = v->name;
1304
+ /*
1305
+ * Skip past any leading X. X: X, etc to allow for multiple instances
1306
+ */
1307
+ for (p = type; *p; p++)
1308
+ if ((*p == ':') || (*p == ',') || (*p == '.')) {
1309
+ p++;
1310
+ if (*p)
1311
+ type = p;
1312
+ break;
1313
+ }
1314
+ if (*type == '+') {
1315
+ mval = -1;
1316
+ type++;
1317
+ } else
1318
+ mval = 0;
1319
+ if (!X509_NAME_add_entry_by_txt(nm, type, chtype,
1320
+ (unsigned char *)v->value, -1, -1,
1321
+ mval))
1322
+ return 0;
1323
+
1324
+ }
1325
+ return 1;
1326
+ }