grpc 1.28.0 → 1.30.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +7694 -11190
- data/include/grpc/grpc.h +2 -2
- data/include/grpc/grpc_security.h +30 -9
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/grpc_types.h +19 -21
- data/include/grpc/impl/codegen/port_platform.h +6 -2
- data/include/grpc/module.modulemap +24 -39
- data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
- data/src/core/ext/filters/client_channel/client_channel.cc +212 -241
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_proxy.cc +17 -10
- data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
- data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +240 -301
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
- data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -2
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
- data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
- data/src/core/ext/filters/client_channel/resolver.cc +5 -8
- data/src/core/ext/filters/client_channel/resolver.h +12 -14
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +73 -59
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +16 -20
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +184 -133
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +40 -43
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +32 -5
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
- data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +16 -16
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +20 -31
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -3
- data/src/core/ext/filters/client_channel/server_address.cc +6 -9
- data/src/core/ext/filters/client_channel/server_address.h +6 -12
- data/src/core/ext/filters/client_channel/service_config.cc +104 -144
- data/src/core/ext/filters/client_channel/service_config.h +28 -98
- data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
- data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
- data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
- data/src/core/ext/filters/client_channel/subchannel.h +35 -11
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +348 -221
- data/src/core/ext/filters/client_channel/xds/xds_api.h +37 -37
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +44 -49
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
- data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
- data/src/core/ext/filters/client_channel/xds/xds_client.cc +532 -339
- data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +31 -19
- data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
- data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
- data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +7 -10
- data/src/core/ext/filters/message_size/message_size_filter.h +4 -4
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +23 -22
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
- data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +15 -8
- data/src/core/ext/transport/inproc/inproc_transport.cc +19 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -875
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +21 -8
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +43 -7
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +47 -26
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +115 -65
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +28 -13
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +88 -6
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +16 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +63 -41
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +173 -77
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +90 -30
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
- data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +36 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
- data/src/core/ext/upb-generated/validate/validate.upb.h +69 -63
- data/src/core/lib/channel/channel_args.cc +15 -14
- data/src/core/lib/channel/channel_args.h +3 -1
- data/src/core/lib/channel/channel_stack.h +20 -13
- data/src/core/lib/channel/channelz.cc +5 -6
- data/src/core/lib/channel/channelz.h +3 -2
- data/src/core/lib/channel/channelz_registry.cc +5 -3
- data/src/core/lib/channel/connected_channel.cc +7 -5
- data/src/core/lib/channel/context.h +1 -1
- data/src/core/lib/channel/handshaker.cc +11 -13
- data/src/core/lib/channel/handshaker.h +4 -2
- data/src/core/lib/channel/handshaker_registry.cc +5 -17
- data/src/core/lib/channel/status_util.cc +2 -3
- data/src/core/lib/compression/message_compress.cc +5 -1
- data/src/core/lib/debug/stats.cc +21 -27
- data/src/core/lib/debug/stats.h +3 -1
- data/src/core/lib/gpr/spinlock.h +2 -3
- data/src/core/lib/gpr/string.cc +2 -26
- data/src/core/lib/gpr/string.h +0 -16
- data/src/core/lib/gpr/sync_abseil.cc +2 -0
- data/src/core/lib/gpr/time.cc +4 -0
- data/src/core/lib/gpr/time_posix.cc +1 -1
- data/src/core/lib/gprpp/atomic.h +6 -6
- data/src/core/lib/gprpp/fork.cc +1 -1
- data/src/core/lib/gprpp/host_port.cc +29 -35
- data/src/core/lib/gprpp/host_port.h +14 -17
- data/src/core/lib/gprpp/map.h +5 -11
- data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
- data/src/core/lib/http/format_request.cc +46 -65
- data/src/core/lib/http/httpcli.cc +2 -3
- data/src/core/lib/http/httpcli.h +2 -3
- data/src/core/lib/http/httpcli_security_connector.cc +5 -5
- data/src/core/lib/http/parser.h +2 -3
- data/src/core/lib/iomgr/buffer_list.h +22 -21
- data/src/core/lib/iomgr/call_combiner.h +3 -2
- data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
- data/src/core/lib/iomgr/closure.h +2 -3
- data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
- data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
- data/src/core/lib/iomgr/endpoint_pair.h +2 -3
- data/src/core/lib/iomgr/error.cc +6 -9
- data/src/core/lib/iomgr/error.h +0 -1
- data/src/core/lib/iomgr/ev_apple.cc +356 -0
- data/src/core/lib/iomgr/ev_apple.h +43 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
- data/src/core/lib/iomgr/ev_epollex_linux.cc +2 -3
- data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
- data/src/core/lib/iomgr/ev_posix.cc +2 -3
- data/src/core/lib/iomgr/exec_ctx.h +14 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
- data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
- data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
- data/src/core/lib/iomgr/port.h +1 -0
- data/src/core/lib/iomgr/python_util.h +46 -0
- data/src/core/lib/iomgr/resolve_address.h +4 -6
- data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
- data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
- data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
- data/src/core/lib/iomgr/resource_quota.cc +4 -6
- data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
- data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
- data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
- data/src/core/lib/iomgr/socket_mutator.h +2 -3
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -26
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
- data/src/core/lib/iomgr/tcp_client_posix.cc +8 -5
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_custom.cc +2 -3
- data/src/core/lib/iomgr/tcp_server_custom.cc +5 -9
- data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
- data/src/core/lib/iomgr/tcp_uv.cc +3 -2
- data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
- data/src/core/lib/iomgr/timer_generic.cc +2 -3
- data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
- data/src/core/lib/iomgr/timer_heap.h +2 -3
- data/src/core/lib/iomgr/udp_server.cc +9 -14
- data/src/core/lib/json/json.h +3 -2
- data/src/core/lib/json/json_reader.cc +5 -5
- data/src/core/lib/json/json_writer.cc +13 -12
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
- data/src/core/lib/security/credentials/credentials.cc +0 -84
- data/src/core/lib/security/credentials/credentials.h +8 -59
- data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +3 -8
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
- data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +55 -27
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +13 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +38 -11
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -7
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -25
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
- data/src/core/lib/security/security_connector/ssl_utils.cc +59 -12
- data/src/core/lib/security/security_connector/ssl_utils.h +12 -10
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +77 -51
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
- data/src/core/lib/security/transport/auth_filters.h +0 -5
- data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
- data/src/core/lib/slice/slice_intern.cc +2 -3
- data/src/core/lib/slice/slice_internal.h +14 -0
- data/src/core/lib/slice/slice_utils.h +9 -0
- data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
- data/src/core/lib/surface/call.cc +2 -3
- data/src/core/lib/surface/call_log_batch.cc +50 -58
- data/src/core/lib/surface/channel.cc +53 -31
- data/src/core/lib/surface/channel.h +35 -4
- data/src/core/lib/surface/channel_ping.cc +2 -3
- data/src/core/lib/surface/completion_queue.cc +33 -33
- data/src/core/lib/surface/event_string.cc +18 -25
- data/src/core/lib/surface/event_string.h +3 -1
- data/src/core/lib/surface/init_secure.cc +1 -4
- data/src/core/lib/surface/server.cc +570 -369
- data/src/core/lib/surface/server.h +32 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/byte_stream.h +7 -2
- data/src/core/lib/transport/connectivity_state.cc +7 -6
- data/src/core/lib/transport/connectivity_state.h +5 -3
- data/src/core/lib/transport/metadata.cc +3 -3
- data/src/core/lib/transport/metadata_batch.h +2 -3
- data/src/core/lib/transport/static_metadata.h +1 -1
- data/src/core/lib/transport/status_conversion.cc +6 -14
- data/src/core/lib/transport/transport.cc +2 -3
- data/src/core/lib/transport/transport.h +3 -2
- data/src/core/lib/transport/transport_op_string.cc +61 -102
- data/src/core/lib/uri/uri_parser.h +2 -3
- data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
- data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
- data/src/core/tsi/fake_transport_security.cc +10 -15
- data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
- data/src/core/tsi/ssl_transport_security.cc +52 -39
- data/src/core/tsi/ssl_transport_security.h +8 -8
- data/src/core/tsi/ssl_types.h +0 -2
- data/src/core/tsi/transport_security.h +6 -9
- data/src/core/tsi/transport_security_grpc.h +2 -3
- data/src/core/tsi/transport_security_interface.h +3 -3
- data/src/ruby/ext/grpc/rb_call.c +9 -1
- data/src/ruby/ext/grpc/rb_call_credentials.c +3 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/errors.rb +103 -42
- data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
- data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
- data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
- data/src/ruby/lib/grpc/generic/service.rb +5 -4
- data/src/ruby/lib/grpc/structs.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +5 -3
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
- data/src/ruby/spec/debug_message_spec.rb +134 -0
- data/src/ruby/spec/generic/service_spec.rb +2 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
- data/src/ruby/spec/support/services.rb +10 -4
- data/src/ruby/spec/testdata/ca.pem +18 -13
- data/src/ruby/spec/testdata/client.key +26 -14
- data/src/ruby/spec/testdata/client.pem +18 -12
- data/src/ruby/spec/testdata/server1.key +26 -14
- data/src/ruby/spec/testdata/server1.pem +20 -14
- data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
- data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
- data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
- data/third_party/abseil-cpp/absl/time/clock.h +74 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
- data/third_party/abseil-cpp/absl/time/format.cc +153 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
- data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
- data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
- data/third_party/abseil-cpp/absl/time/time.cc +499 -0
- data/third_party/abseil-cpp/absl/time/time.h +1584 -0
- data/third_party/boringssl-with-bazel/err_data.c +329 -297
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
- data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
- data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
- data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
- data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +14 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +432 -160
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -14
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +80 -99
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -12
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +172 -77
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +5 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
- data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
- data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
- data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +14 -3
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +28 -20
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +12 -4
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +64 -47
- data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
- data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +6 -1
- data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +64 -5
- data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +6 -2
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -27
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +50 -20
- data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
- metadata +115 -39
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
- data/src/core/lib/gprpp/string_view.h +0 -60
- data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
@@ -292,10 +292,6 @@ void EC_KEY_set_conv_form(EC_KEY *key, point_conversion_form_t cform) {
|
|
292
292
|
}
|
293
293
|
|
294
294
|
int EC_KEY_check_key(const EC_KEY *eckey) {
|
295
|
-
int ok = 0;
|
296
|
-
BN_CTX *ctx = NULL;
|
297
|
-
EC_POINT *point = NULL;
|
298
|
-
|
299
295
|
if (!eckey || !eckey->group || !eckey->pub_key) {
|
300
296
|
OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER);
|
301
297
|
return 0;
|
@@ -303,41 +299,31 @@ int EC_KEY_check_key(const EC_KEY *eckey) {
|
|
303
299
|
|
304
300
|
if (EC_POINT_is_at_infinity(eckey->group, eckey->pub_key)) {
|
305
301
|
OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
|
306
|
-
|
307
|
-
}
|
308
|
-
|
309
|
-
ctx = BN_CTX_new();
|
310
|
-
|
311
|
-
if (ctx == NULL) {
|
312
|
-
goto err;
|
302
|
+
return 0;
|
313
303
|
}
|
314
304
|
|
315
|
-
//
|
316
|
-
if (!EC_POINT_is_on_curve(eckey->group, eckey->pub_key,
|
305
|
+
// Test whether the public key is on the elliptic curve.
|
306
|
+
if (!EC_POINT_is_on_curve(eckey->group, eckey->pub_key, NULL)) {
|
317
307
|
OPENSSL_PUT_ERROR(EC, EC_R_POINT_IS_NOT_ON_CURVE);
|
318
|
-
|
308
|
+
return 0;
|
319
309
|
}
|
320
|
-
|
321
|
-
//
|
310
|
+
|
311
|
+
// Check the public and private keys match.
|
322
312
|
if (eckey->priv_key != NULL) {
|
323
|
-
point
|
324
|
-
if (point
|
325
|
-
!ec_point_mul_scalar_base(eckey->group, &point->raw,
|
313
|
+
EC_RAW_POINT point;
|
314
|
+
if (!ec_point_mul_scalar_base(eckey->group, &point,
|
326
315
|
&eckey->priv_key->scalar)) {
|
327
316
|
OPENSSL_PUT_ERROR(EC, ERR_R_EC_LIB);
|
328
|
-
|
317
|
+
return 0;
|
329
318
|
}
|
330
|
-
if (
|
319
|
+
if (!ec_GFp_simple_points_equal(eckey->group, &point,
|
320
|
+
&eckey->pub_key->raw)) {
|
331
321
|
OPENSSL_PUT_ERROR(EC, EC_R_INVALID_PRIVATE_KEY);
|
332
|
-
|
322
|
+
return 0;
|
333
323
|
}
|
334
324
|
}
|
335
|
-
ok = 1;
|
336
325
|
|
337
|
-
|
338
|
-
BN_CTX_free(ctx);
|
339
|
-
EC_POINT_free(point);
|
340
|
-
return ok;
|
326
|
+
return 1;
|
341
327
|
}
|
342
328
|
|
343
329
|
int EC_KEY_check_fips(const EC_KEY *key) {
|
@@ -92,35 +92,20 @@ void ec_GFp_mont_group_finish(EC_GROUP *group) {
|
|
92
92
|
|
93
93
|
int ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p,
|
94
94
|
const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) {
|
95
|
-
BN_CTX *new_ctx = NULL;
|
96
|
-
int ret = 0;
|
97
|
-
|
98
95
|
BN_MONT_CTX_free(group->mont);
|
99
|
-
group->mont = NULL;
|
100
|
-
|
101
|
-
if (ctx == NULL) {
|
102
|
-
ctx = new_ctx = BN_CTX_new();
|
103
|
-
if (ctx == NULL) {
|
104
|
-
return 0;
|
105
|
-
}
|
106
|
-
}
|
107
|
-
|
108
96
|
group->mont = BN_MONT_CTX_new_for_modulus(p, ctx);
|
109
97
|
if (group->mont == NULL) {
|
110
98
|
OPENSSL_PUT_ERROR(EC, ERR_R_BN_LIB);
|
111
|
-
|
99
|
+
return 0;
|
112
100
|
}
|
113
101
|
|
114
|
-
|
115
|
-
|
116
|
-
if (!ret) {
|
102
|
+
if (!ec_GFp_simple_group_set_curve(group, p, a, b, ctx)) {
|
117
103
|
BN_MONT_CTX_free(group->mont);
|
118
104
|
group->mont = NULL;
|
105
|
+
return 0;
|
119
106
|
}
|
120
107
|
|
121
|
-
|
122
|
-
BN_CTX_free(new_ctx);
|
123
|
-
return ret;
|
108
|
+
return 1;
|
124
109
|
}
|
125
110
|
|
126
111
|
static void ec_GFp_mont_felem_to_montgomery(const EC_GROUP *group,
|
@@ -132,14 +117,14 @@ static void ec_GFp_mont_felem_to_montgomery(const EC_GROUP *group,
|
|
132
117
|
static void ec_GFp_mont_felem_from_montgomery(const EC_GROUP *group,
|
133
118
|
EC_FELEM *out,
|
134
119
|
const EC_FELEM *in) {
|
135
|
-
bn_from_montgomery_small(out->words,
|
136
|
-
group->mont);
|
120
|
+
bn_from_montgomery_small(out->words, group->field.width, in->words,
|
121
|
+
group->field.width, group->mont);
|
137
122
|
}
|
138
123
|
|
139
|
-
static void
|
140
|
-
|
141
|
-
|
142
|
-
|
124
|
+
static void ec_GFp_mont_felem_inv0(const EC_GROUP *group, EC_FELEM *out,
|
125
|
+
const EC_FELEM *a) {
|
126
|
+
bn_mod_inverse0_prime_mont_small(out->words, a->words, group->field.width,
|
127
|
+
group->mont);
|
143
128
|
}
|
144
129
|
|
145
130
|
void ec_GFp_mont_felem_mul(const EC_GROUP *group, EC_FELEM *r,
|
@@ -154,30 +139,39 @@ void ec_GFp_mont_felem_sqr(const EC_GROUP *group, EC_FELEM *r,
|
|
154
139
|
group->mont);
|
155
140
|
}
|
156
141
|
|
157
|
-
|
158
|
-
const
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
142
|
+
void ec_GFp_mont_felem_to_bytes(const EC_GROUP *group, uint8_t *out,
|
143
|
+
size_t *out_len, const EC_FELEM *in) {
|
144
|
+
EC_FELEM tmp;
|
145
|
+
ec_GFp_mont_felem_from_montgomery(group, &tmp, in);
|
146
|
+
ec_GFp_simple_felem_to_bytes(group, out, out_len, &tmp);
|
147
|
+
}
|
163
148
|
|
164
|
-
|
149
|
+
int ec_GFp_mont_felem_from_bytes(const EC_GROUP *group, EC_FELEM *out,
|
150
|
+
const uint8_t *in, size_t len) {
|
151
|
+
if (!ec_GFp_simple_felem_from_bytes(group, out, in, len)) {
|
165
152
|
return 0;
|
166
153
|
}
|
154
|
+
|
167
155
|
ec_GFp_mont_felem_to_montgomery(group, out, out);
|
168
156
|
return 1;
|
169
157
|
}
|
170
158
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
159
|
+
static void ec_GFp_mont_felem_reduce(const EC_GROUP *group, EC_FELEM *out,
|
160
|
+
const BN_ULONG *words, size_t num) {
|
161
|
+
// Convert "from" Montgomery form so the value is reduced mod p.
|
162
|
+
bn_from_montgomery_small(out->words, group->field.width, words, num,
|
163
|
+
group->mont);
|
164
|
+
// Convert "to" Montgomery form to remove the R^-1 factor added.
|
165
|
+
ec_GFp_mont_felem_to_montgomery(group, out, out);
|
166
|
+
// Convert to Montgomery form to match this implementation's representation.
|
167
|
+
ec_GFp_mont_felem_to_montgomery(group, out, out);
|
168
|
+
}
|
177
169
|
|
178
|
-
|
179
|
-
|
180
|
-
|
170
|
+
static void ec_GFp_mont_felem_exp(const EC_GROUP *group, EC_FELEM *out,
|
171
|
+
const EC_FELEM *a, const BN_ULONG *exp,
|
172
|
+
size_t num_exp) {
|
173
|
+
bn_mod_exp_mont_small(out->words, a->words, group->field.width, exp, num_exp,
|
174
|
+
group->mont);
|
181
175
|
}
|
182
176
|
|
183
177
|
static int ec_GFp_mont_point_get_affine_coordinates(const EC_GROUP *group,
|
@@ -188,18 +182,12 @@ static int ec_GFp_mont_point_get_affine_coordinates(const EC_GROUP *group,
|
|
188
182
|
return 0;
|
189
183
|
}
|
190
184
|
|
191
|
-
// Transform
|
192
|
-
|
185
|
+
// Transform (X, Y, Z) into (x, y) := (X/Z^2, Y/Z^3). Note the check above
|
186
|
+
// ensures |point->Z| is non-zero, so the inverse always exists.
|
193
187
|
EC_FELEM z1, z2;
|
194
|
-
|
188
|
+
ec_GFp_mont_felem_inv0(group, &z2, &point->Z);
|
195
189
|
ec_GFp_mont_felem_sqr(group, &z1, &z2);
|
196
190
|
|
197
|
-
// Instead of using |ec_GFp_mont_felem_from_montgomery| to convert the |x|
|
198
|
-
// coordinate and then calling |ec_GFp_mont_felem_from_montgomery| again to
|
199
|
-
// convert the |y| coordinate below, convert the common factor |z1| once now,
|
200
|
-
// saving one reduction.
|
201
|
-
ec_GFp_mont_felem_from_montgomery(group, &z1, &z1);
|
202
|
-
|
203
191
|
if (x != NULL) {
|
204
192
|
ec_GFp_mont_felem_mul(group, x, &point->X, &z1);
|
205
193
|
}
|
@@ -212,6 +200,52 @@ static int ec_GFp_mont_point_get_affine_coordinates(const EC_GROUP *group,
|
|
212
200
|
return 1;
|
213
201
|
}
|
214
202
|
|
203
|
+
static int ec_GFp_mont_jacobian_to_affine_batch(const EC_GROUP *group,
|
204
|
+
EC_AFFINE *out,
|
205
|
+
const EC_RAW_POINT *in,
|
206
|
+
size_t num) {
|
207
|
+
if (num == 0) {
|
208
|
+
return 1;
|
209
|
+
}
|
210
|
+
|
211
|
+
// Compute prefix products of all Zs. Use |out[i].X| as scratch space
|
212
|
+
// to store these values.
|
213
|
+
out[0].X = in[0].Z;
|
214
|
+
for (size_t i = 1; i < num; i++) {
|
215
|
+
ec_GFp_mont_felem_mul(group, &out[i].X, &out[i - 1].X, &in[i].Z);
|
216
|
+
}
|
217
|
+
|
218
|
+
// Some input was infinity iff the product of all Zs is zero.
|
219
|
+
if (ec_felem_non_zero_mask(group, &out[num - 1].X) == 0) {
|
220
|
+
OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY);
|
221
|
+
return 0;
|
222
|
+
}
|
223
|
+
|
224
|
+
// Invert the product of all Zs.
|
225
|
+
EC_FELEM zinvprod;
|
226
|
+
ec_GFp_mont_felem_inv0(group, &zinvprod, &out[num - 1].X);
|
227
|
+
for (size_t i = num - 1; i < num; i--) {
|
228
|
+
// Our loop invariant is that |zinvprod| is Z0^-1 * Z1^-1 * ... * Zi^-1.
|
229
|
+
// Recover Zi^-1 by multiplying by the previous product.
|
230
|
+
EC_FELEM zinv, zinv2;
|
231
|
+
if (i == 0) {
|
232
|
+
zinv = zinvprod;
|
233
|
+
} else {
|
234
|
+
ec_GFp_mont_felem_mul(group, &zinv, &zinvprod, &out[i - 1].X);
|
235
|
+
// Maintain the loop invariant for the next iteration.
|
236
|
+
ec_GFp_mont_felem_mul(group, &zinvprod, &zinvprod, &in[i].Z);
|
237
|
+
}
|
238
|
+
|
239
|
+
// Compute affine coordinates: x = X * Z^-2 and y = Y * Z^-3.
|
240
|
+
ec_GFp_mont_felem_sqr(group, &zinv2, &zinv);
|
241
|
+
ec_GFp_mont_felem_mul(group, &out[i].X, &in[i].X, &zinv2);
|
242
|
+
ec_GFp_mont_felem_mul(group, &out[i].Y, &in[i].Y, &zinv2);
|
243
|
+
ec_GFp_mont_felem_mul(group, &out[i].Y, &out[i].Y, &zinv);
|
244
|
+
}
|
245
|
+
|
246
|
+
return 1;
|
247
|
+
}
|
248
|
+
|
215
249
|
void ec_GFp_mont_add(const EC_GROUP *group, EC_RAW_POINT *out,
|
216
250
|
const EC_RAW_POINT *a, const EC_RAW_POINT *b) {
|
217
251
|
if (a == b) {
|
@@ -468,16 +502,23 @@ DEFINE_METHOD_FUNCTION(EC_METHOD, EC_GFp_mont_method) {
|
|
468
502
|
out->group_finish = ec_GFp_mont_group_finish;
|
469
503
|
out->group_set_curve = ec_GFp_mont_group_set_curve;
|
470
504
|
out->point_get_affine_coordinates = ec_GFp_mont_point_get_affine_coordinates;
|
505
|
+
out->jacobian_to_affine_batch = ec_GFp_mont_jacobian_to_affine_batch;
|
471
506
|
out->add = ec_GFp_mont_add;
|
472
507
|
out->dbl = ec_GFp_mont_dbl;
|
473
508
|
out->mul = ec_GFp_mont_mul;
|
474
509
|
out->mul_base = ec_GFp_mont_mul_base;
|
475
|
-
out->
|
510
|
+
out->mul_batch = ec_GFp_mont_mul_batch;
|
511
|
+
out->mul_public_batch = ec_GFp_mont_mul_public_batch;
|
512
|
+
out->init_precomp = ec_GFp_mont_init_precomp;
|
513
|
+
out->mul_precomp = ec_GFp_mont_mul_precomp;
|
476
514
|
out->felem_mul = ec_GFp_mont_felem_mul;
|
477
515
|
out->felem_sqr = ec_GFp_mont_felem_sqr;
|
478
|
-
out->
|
479
|
-
out->
|
480
|
-
out->
|
481
|
-
out->
|
516
|
+
out->felem_to_bytes = ec_GFp_mont_felem_to_bytes;
|
517
|
+
out->felem_from_bytes = ec_GFp_mont_felem_from_bytes;
|
518
|
+
out->felem_reduce = ec_GFp_mont_felem_reduce;
|
519
|
+
out->felem_exp = ec_GFp_mont_felem_exp;
|
520
|
+
out->scalar_inv0_montgomery = ec_simple_scalar_inv0_montgomery;
|
521
|
+
out->scalar_to_montgomery_inv_vartime =
|
522
|
+
ec_simple_scalar_to_montgomery_inv_vartime;
|
482
523
|
out->cmp_x_coordinate = ec_GFp_mont_cmp_x_coordinate;
|
483
524
|
}
|
@@ -14,6 +14,7 @@
|
|
14
14
|
|
15
15
|
#include <openssl/ec.h>
|
16
16
|
#include <openssl/err.h>
|
17
|
+
#include <openssl/mem.h>
|
17
18
|
|
18
19
|
#include <assert.h>
|
19
20
|
|
@@ -23,15 +24,34 @@
|
|
23
24
|
|
24
25
|
|
25
26
|
int ec_bignum_to_felem(const EC_GROUP *group, EC_FELEM *out, const BIGNUM *in) {
|
26
|
-
|
27
|
+
uint8_t bytes[EC_MAX_BYTES];
|
28
|
+
size_t len = BN_num_bytes(&group->field);
|
29
|
+
assert(sizeof(bytes) >= len);
|
30
|
+
if (BN_is_negative(in) ||
|
31
|
+
BN_cmp(in, &group->field) >= 0 ||
|
32
|
+
!BN_bn2bin_padded(bytes, len, in)) {
|
27
33
|
OPENSSL_PUT_ERROR(EC, EC_R_COORDINATES_OUT_OF_RANGE);
|
28
34
|
return 0;
|
29
35
|
}
|
30
|
-
|
36
|
+
|
37
|
+
return ec_felem_from_bytes(group, out, bytes, len);
|
31
38
|
}
|
32
39
|
|
33
40
|
int ec_felem_to_bignum(const EC_GROUP *group, BIGNUM *out, const EC_FELEM *in) {
|
34
|
-
|
41
|
+
uint8_t bytes[EC_MAX_BYTES];
|
42
|
+
size_t len;
|
43
|
+
ec_felem_to_bytes(group, bytes, &len, in);
|
44
|
+
return BN_bin2bn(bytes, len, out) != NULL;
|
45
|
+
}
|
46
|
+
|
47
|
+
void ec_felem_to_bytes(const EC_GROUP *group, uint8_t *out, size_t *out_len,
|
48
|
+
const EC_FELEM *in) {
|
49
|
+
group->meth->felem_to_bytes(group, out, out_len, in);
|
50
|
+
}
|
51
|
+
|
52
|
+
int ec_felem_from_bytes(const EC_GROUP *group, EC_FELEM *out, const uint8_t *in,
|
53
|
+
size_t len) {
|
54
|
+
return group->meth->felem_from_bytes(group, out, in, len);
|
35
55
|
}
|
36
56
|
|
37
57
|
void ec_felem_neg(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a) {
|
@@ -75,8 +95,6 @@ void ec_felem_select(const EC_GROUP *group, EC_FELEM *out, BN_ULONG mask,
|
|
75
95
|
|
76
96
|
int ec_felem_equal(const EC_GROUP *group, const EC_FELEM *a,
|
77
97
|
const EC_FELEM *b) {
|
78
|
-
|
79
|
-
|
80
|
-
return OPENSSL_memcmp(a->words, b->words,
|
81
|
-
group->field.width * sizeof(BN_ULONG)) == 0;
|
98
|
+
return CRYPTO_memcmp(a->words, b->words,
|
99
|
+
group->field.width * sizeof(BN_ULONG)) == 0;
|
82
100
|
}
|
@@ -71,8 +71,8 @@
|
|
71
71
|
#include <openssl/base.h>
|
72
72
|
|
73
73
|
#include <openssl/bn.h>
|
74
|
+
#include <openssl/ec.h>
|
74
75
|
#include <openssl/ex_data.h>
|
75
|
-
#include <openssl/thread.h>
|
76
76
|
#include <openssl/type_check.h>
|
77
77
|
|
78
78
|
#include "../bn/internal.h"
|
@@ -82,6 +82,9 @@ extern "C" {
|
|
82
82
|
#endif
|
83
83
|
|
84
84
|
|
85
|
+
// EC internals.
|
86
|
+
|
87
|
+
|
85
88
|
// Cap the size of all field elements and scalars, including custom curves, to
|
86
89
|
// 66 bytes, large enough to fit secp521r1 and brainpoolP512r1, which appear to
|
87
90
|
// be the largest fields anyone plausibly uses.
|
@@ -91,6 +94,9 @@ extern "C" {
|
|
91
94
|
OPENSSL_STATIC_ASSERT(EC_MAX_WORDS <= BN_SMALL_MAX_WORDS,
|
92
95
|
"bn_*_small functions not usable");
|
93
96
|
|
97
|
+
|
98
|
+
// Scalars.
|
99
|
+
|
94
100
|
// An EC_SCALAR is an integer fully reduced modulo the order. Only the first
|
95
101
|
// |order->width| words are used. An |EC_SCALAR| is specific to an |EC_GROUP|
|
96
102
|
// and must not be mixed between groups.
|
@@ -100,6 +106,88 @@ typedef union {
|
|
100
106
|
BN_ULONG words[EC_MAX_WORDS];
|
101
107
|
} EC_SCALAR;
|
102
108
|
|
109
|
+
// ec_bignum_to_scalar converts |in| to an |EC_SCALAR| and writes it to
|
110
|
+
// |*out|. It returns one on success and zero if |in| is out of range.
|
111
|
+
OPENSSL_EXPORT int ec_bignum_to_scalar(const EC_GROUP *group, EC_SCALAR *out,
|
112
|
+
const BIGNUM *in);
|
113
|
+
|
114
|
+
// ec_scalar_to_bytes serializes |in| as a big-endian bytestring to |out| and
|
115
|
+
// sets |*out_len| to the number of bytes written. The number of bytes written
|
116
|
+
// is |BN_num_bytes(&group->order)|, which is at most |EC_MAX_BYTES|.
|
117
|
+
OPENSSL_EXPORT void ec_scalar_to_bytes(const EC_GROUP *group, uint8_t *out,
|
118
|
+
size_t *out_len, const EC_SCALAR *in);
|
119
|
+
|
120
|
+
// ec_scalar_from_bytes deserializes |in| and stores the resulting scalar over
|
121
|
+
// group |group| to |out|. It returns one on success and zero if |in| is
|
122
|
+
// invalid.
|
123
|
+
int ec_scalar_from_bytes(const EC_GROUP *group, EC_SCALAR *out,
|
124
|
+
const uint8_t *in, size_t len);
|
125
|
+
|
126
|
+
// ec_scalar_reduce sets |out| to |words|, reduced modulo the group order.
|
127
|
+
// |words| must be less than order^2. |num| must be at most twice the width of
|
128
|
+
// group order. This function treats |words| as secret.
|
129
|
+
void ec_scalar_reduce(const EC_GROUP *group, EC_SCALAR *out,
|
130
|
+
const BN_ULONG *words, size_t num);
|
131
|
+
|
132
|
+
// ec_random_nonzero_scalar sets |out| to a uniformly selected random value from
|
133
|
+
// 1 to |group->order| - 1. It returns one on success and zero on error.
|
134
|
+
int ec_random_nonzero_scalar(const EC_GROUP *group, EC_SCALAR *out,
|
135
|
+
const uint8_t additional_data[32]);
|
136
|
+
|
137
|
+
// ec_scalar_equal_vartime returns one if |a| and |b| are equal and zero
|
138
|
+
// otherwise. Both values are treated as public.
|
139
|
+
int ec_scalar_equal_vartime(const EC_GROUP *group, const EC_SCALAR *a,
|
140
|
+
const EC_SCALAR *b);
|
141
|
+
|
142
|
+
// ec_scalar_is_zero returns one if |a| is zero and zero otherwise.
|
143
|
+
int ec_scalar_is_zero(const EC_GROUP *group, const EC_SCALAR *a);
|
144
|
+
|
145
|
+
// ec_scalar_add sets |r| to |a| + |b|.
|
146
|
+
void ec_scalar_add(const EC_GROUP *group, EC_SCALAR *r, const EC_SCALAR *a,
|
147
|
+
const EC_SCALAR *b);
|
148
|
+
|
149
|
+
// ec_scalar_sub sets |r| to |a| - |b|.
|
150
|
+
void ec_scalar_sub(const EC_GROUP *group, EC_SCALAR *r, const EC_SCALAR *a,
|
151
|
+
const EC_SCALAR *b);
|
152
|
+
|
153
|
+
// ec_scalar_neg sets |r| to -|a|.
|
154
|
+
void ec_scalar_neg(const EC_GROUP *group, EC_SCALAR *r, const EC_SCALAR *a);
|
155
|
+
|
156
|
+
// ec_scalar_to_montgomery sets |r| to |a| in Montgomery form.
|
157
|
+
void ec_scalar_to_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
158
|
+
const EC_SCALAR *a);
|
159
|
+
|
160
|
+
// ec_scalar_to_montgomery sets |r| to |a| converted from Montgomery form.
|
161
|
+
void ec_scalar_from_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
162
|
+
const EC_SCALAR *a);
|
163
|
+
|
164
|
+
// ec_scalar_mul_montgomery sets |r| to |a| * |b| where inputs and outputs are
|
165
|
+
// in Montgomery form.
|
166
|
+
void ec_scalar_mul_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
167
|
+
const EC_SCALAR *a, const EC_SCALAR *b);
|
168
|
+
|
169
|
+
// ec_scalar_inv0_montgomery sets |r| to |a|^-1 where inputs and outputs are in
|
170
|
+
// Montgomery form. If |a| is zero, |r| is set to zero.
|
171
|
+
void ec_scalar_inv0_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
172
|
+
const EC_SCALAR *a);
|
173
|
+
|
174
|
+
// ec_scalar_to_montgomery_inv_vartime sets |r| to |a|^-1 R. That is, it takes
|
175
|
+
// in |a| not in Montgomery form and computes the inverse in Montgomery form. It
|
176
|
+
// returns one on success and zero if |a| has no inverse. This function assumes
|
177
|
+
// |a| is public and may leak information about it via timing.
|
178
|
+
//
|
179
|
+
// Note this is not the same operation as |ec_scalar_inv0_montgomery|.
|
180
|
+
int ec_scalar_to_montgomery_inv_vartime(const EC_GROUP *group, EC_SCALAR *r,
|
181
|
+
const EC_SCALAR *a);
|
182
|
+
|
183
|
+
// ec_scalar_select, in constant time, sets |out| to |a| if |mask| is all ones
|
184
|
+
// and |b| if |mask| is all zeros.
|
185
|
+
void ec_scalar_select(const EC_GROUP *group, EC_SCALAR *out, BN_ULONG mask,
|
186
|
+
const EC_SCALAR *a, const EC_SCALAR *b);
|
187
|
+
|
188
|
+
|
189
|
+
// Field elements.
|
190
|
+
|
103
191
|
// An EC_FELEM represents a field element. Only the first |field->width| words
|
104
192
|
// are used. An |EC_FELEM| is specific to an |EC_GROUP| and must not be mixed
|
105
193
|
// between groups. Additionally, the representation (whether or not elements are
|
@@ -110,15 +198,268 @@ typedef union {
|
|
110
198
|
BN_ULONG words[EC_MAX_WORDS];
|
111
199
|
} EC_FELEM;
|
112
200
|
|
113
|
-
//
|
114
|
-
//
|
115
|
-
|
201
|
+
// ec_bignum_to_felem converts |in| to an |EC_FELEM|. It returns one on success
|
202
|
+
// and zero if |in| is out of range.
|
203
|
+
int ec_bignum_to_felem(const EC_GROUP *group, EC_FELEM *out, const BIGNUM *in);
|
204
|
+
|
205
|
+
// ec_felem_to_bignum converts |in| to a |BIGNUM|. It returns one on success and
|
206
|
+
// zero on allocation failure.
|
207
|
+
int ec_felem_to_bignum(const EC_GROUP *group, BIGNUM *out, const EC_FELEM *in);
|
208
|
+
|
209
|
+
// ec_felem_to_bytes serializes |in| as a big-endian bytestring to |out| and
|
210
|
+
// sets |*out_len| to the number of bytes written. The number of bytes written
|
211
|
+
// is |BN_num_bytes(&group->order)|, which is at most |EC_MAX_BYTES|.
|
212
|
+
void ec_felem_to_bytes(const EC_GROUP *group, uint8_t *out, size_t *out_len,
|
213
|
+
const EC_FELEM *in);
|
214
|
+
|
215
|
+
// ec_felem_from_bytes deserializes |in| and stores the resulting field element
|
216
|
+
// to |out|. It returns one on success and zero if |in| is invalid.
|
217
|
+
int ec_felem_from_bytes(const EC_GROUP *group, EC_FELEM *out, const uint8_t *in,
|
218
|
+
size_t len);
|
219
|
+
|
220
|
+
// ec_felem_neg sets |out| to -|a|.
|
221
|
+
void ec_felem_neg(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a);
|
222
|
+
|
223
|
+
// ec_felem_add sets |out| to |a| + |b|.
|
224
|
+
void ec_felem_add(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a,
|
225
|
+
const EC_FELEM *b);
|
226
|
+
|
227
|
+
// ec_felem_add sets |out| to |a| - |b|.
|
228
|
+
void ec_felem_sub(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a,
|
229
|
+
const EC_FELEM *b);
|
230
|
+
|
231
|
+
// ec_felem_non_zero_mask returns all ones if |a| is non-zero and all zeros
|
232
|
+
// otherwise.
|
233
|
+
BN_ULONG ec_felem_non_zero_mask(const EC_GROUP *group, const EC_FELEM *a);
|
234
|
+
|
235
|
+
// ec_felem_select, in constant time, sets |out| to |a| if |mask| is all ones
|
236
|
+
// and |b| if |mask| is all zeros.
|
237
|
+
void ec_felem_select(const EC_GROUP *group, EC_FELEM *out, BN_ULONG mask,
|
238
|
+
const EC_FELEM *a, const EC_FELEM *b);
|
239
|
+
|
240
|
+
// ec_felem_equal returns one if |a| and |b| are equal and zero otherwise.
|
241
|
+
int ec_felem_equal(const EC_GROUP *group, const EC_FELEM *a, const EC_FELEM *b);
|
242
|
+
|
243
|
+
|
244
|
+
// Points.
|
245
|
+
//
|
246
|
+
// Points may represented in affine coordinates as |EC_AFFINE| or Jacobian
|
247
|
+
// coordinates as |EC_RAW_POINT|. Affine coordinates directly represent a
|
248
|
+
// point on the curve, but point addition over affine coordinates requires
|
249
|
+
// costly field inversions, so arithmetic is done in Jacobian coordinates.
|
250
|
+
// Converting from affine to Jacobian is cheap, while converting from Jacobian
|
251
|
+
// to affine costs a field inversion. (Jacobian coordinates amortize the field
|
252
|
+
// inversions needed in a sequence of point operations.)
|
253
|
+
//
|
254
|
+
// TODO(davidben): Rename |EC_RAW_POINT| to |EC_JACOBIAN|.
|
255
|
+
|
256
|
+
// An EC_RAW_POINT represents an elliptic curve point in Jacobian coordinates.
|
257
|
+
// Unlike |EC_POINT|, it is a plain struct which can be stack-allocated and
|
258
|
+
// needs no cleanup. It is specific to an |EC_GROUP| and must not be mixed
|
259
|
+
// between groups.
|
116
260
|
typedef struct {
|
117
|
-
EC_FELEM X, Y, Z;
|
118
261
|
// X, Y, and Z are Jacobian projective coordinates. They represent
|
119
262
|
// (X/Z^2, Y/Z^3) if Z != 0 and the point at infinity otherwise.
|
263
|
+
EC_FELEM X, Y, Z;
|
120
264
|
} EC_RAW_POINT;
|
121
265
|
|
266
|
+
// An EC_AFFINE represents an elliptic curve point in affine coordinates.
|
267
|
+
// coordinates. Note the point at infinity cannot be represented in affine
|
268
|
+
// coordinates.
|
269
|
+
typedef struct {
|
270
|
+
EC_FELEM X, Y;
|
271
|
+
} EC_AFFINE;
|
272
|
+
|
273
|
+
// ec_affine_to_jacobian converts |p| to Jacobian form and writes the result to
|
274
|
+
// |*out|. This operation is very cheap and only costs a few copies.
|
275
|
+
void ec_affine_to_jacobian(const EC_GROUP *group, EC_RAW_POINT *out,
|
276
|
+
const EC_AFFINE *p);
|
277
|
+
|
278
|
+
// ec_jacobian_to_affine converts |p| to affine form and writes the result to
|
279
|
+
// |*out|. It returns one on success and zero if |p| was the point at infinity.
|
280
|
+
// This operation performs a field inversion and should only be done once per
|
281
|
+
// point.
|
282
|
+
//
|
283
|
+
// If only extracting the x-coordinate, use |ec_get_x_coordinate_*| which is
|
284
|
+
// slightly faster.
|
285
|
+
int ec_jacobian_to_affine(const EC_GROUP *group, EC_AFFINE *out,
|
286
|
+
const EC_RAW_POINT *p);
|
287
|
+
|
288
|
+
// ec_jacobian_to_affine_batch converts |num| points in |in| from Jacobian
|
289
|
+
// coordinates to affine coordinates and writes the results to |out|. It returns
|
290
|
+
// one on success and zero if any of the input points were infinity.
|
291
|
+
//
|
292
|
+
// This function is not implemented for all curves. Add implementations as
|
293
|
+
// needed.
|
294
|
+
int ec_jacobian_to_affine_batch(const EC_GROUP *group, EC_AFFINE *out,
|
295
|
+
const EC_RAW_POINT *in, size_t num);
|
296
|
+
|
297
|
+
// ec_point_set_affine_coordinates sets |out|'s to a point with affine
|
298
|
+
// coordinates |x| and |y|. It returns one if the point is on the curve and
|
299
|
+
// zero otherwise. If the point is not on the curve, the value of |out| is
|
300
|
+
// undefined.
|
301
|
+
int ec_point_set_affine_coordinates(const EC_GROUP *group, EC_AFFINE *out,
|
302
|
+
const EC_FELEM *x, const EC_FELEM *y);
|
303
|
+
|
304
|
+
// ec_point_mul_scalar sets |r| to |p| * |scalar|. Both inputs are considered
|
305
|
+
// secret.
|
306
|
+
int ec_point_mul_scalar(const EC_GROUP *group, EC_RAW_POINT *r,
|
307
|
+
const EC_RAW_POINT *p, const EC_SCALAR *scalar);
|
308
|
+
|
309
|
+
// ec_point_mul_scalar_base sets |r| to generator * |scalar|. |scalar| is
|
310
|
+
// treated as secret.
|
311
|
+
int ec_point_mul_scalar_base(const EC_GROUP *group, EC_RAW_POINT *r,
|
312
|
+
const EC_SCALAR *scalar);
|
313
|
+
|
314
|
+
// ec_point_mul_scalar_batch sets |r| to |p0| * |scalar0| + |p1| * |scalar1| +
|
315
|
+
// |p2| * |scalar2|. |p2| may be NULL to skip that term.
|
316
|
+
//
|
317
|
+
// The inputs are treated as secret, however, this function leaks information
|
318
|
+
// about whether intermediate computations add a point to itself. Callers must
|
319
|
+
// ensure that discrete logs between |p0|, |p1|, and |p2| are uniformly
|
320
|
+
// distributed and independent of the scalars, which should be uniformly
|
321
|
+
// selected and not under the attackers control. This ensures the doubling case
|
322
|
+
// will occur with negligible probability.
|
323
|
+
//
|
324
|
+
// This function is not implemented for all curves. Add implementations as
|
325
|
+
// needed.
|
326
|
+
//
|
327
|
+
// TODO(davidben): This function does not use base point tables. For now, it is
|
328
|
+
// only used with the generic |EC_GFp_mont_method| implementation which has
|
329
|
+
// none. If generalizing to tuned curves, this may be useful. However, we still
|
330
|
+
// must double up to the least efficient input, so precomputed tables can only
|
331
|
+
// save table setup and allow a wider window size.
|
332
|
+
int ec_point_mul_scalar_batch(const EC_GROUP *group, EC_RAW_POINT *r,
|
333
|
+
const EC_RAW_POINT *p0, const EC_SCALAR *scalar0,
|
334
|
+
const EC_RAW_POINT *p1, const EC_SCALAR *scalar1,
|
335
|
+
const EC_RAW_POINT *p2, const EC_SCALAR *scalar2);
|
336
|
+
|
337
|
+
#define EC_MONT_PRECOMP_COMB_SIZE 5
|
338
|
+
|
339
|
+
// An |EC_PRECOMP| stores precomputed information about a point, to optimize
|
340
|
+
// repeated multiplications involving it. It is a union so different
|
341
|
+
// |EC_METHOD|s can store different information in it.
|
342
|
+
typedef union {
|
343
|
+
EC_AFFINE comb[(1 << EC_MONT_PRECOMP_COMB_SIZE) - 1];
|
344
|
+
} EC_PRECOMP;
|
345
|
+
|
346
|
+
// ec_init_precomp precomputes multiples of |p| and writes the result to |out|.
|
347
|
+
// It returns one on success and zero on error. The resulting table may be used
|
348
|
+
// with |ec_point_mul_scalar_precomp|. This function will fail if |p| is the
|
349
|
+
// point at infinity.
|
350
|
+
//
|
351
|
+
// This function is not implemented for all curves. Add implementations as
|
352
|
+
// needed.
|
353
|
+
int ec_init_precomp(const EC_GROUP *group, EC_PRECOMP *out,
|
354
|
+
const EC_RAW_POINT *p);
|
355
|
+
|
356
|
+
// ec_point_mul_scalar_precomp sets |r| to |p0| * |scalar0| + |p1| * |scalar1| +
|
357
|
+
// |p2| * |scalar2|. |p1| or |p2| may be NULL to skip the corresponding term.
|
358
|
+
// The points are represented as |EC_PRECOMP| and must be initialized with
|
359
|
+
// |ec_init_precomp|. This function runs faster than |ec_point_mul_scalar_batch|
|
360
|
+
// but requires setup work per input point, so it is only appropriate for points
|
361
|
+
// which are used frequently.
|
362
|
+
//
|
363
|
+
// The inputs are treated as secret, however, this function leaks information
|
364
|
+
// about whether intermediate computations add a point to itself. Callers must
|
365
|
+
// ensure that discrete logs between |p0|, |p1|, and |p2| are uniformly
|
366
|
+
// distributed and independent of the scalars, which should be uniformly
|
367
|
+
// selected and not under the attackers control. This ensures the doubling case
|
368
|
+
// will occur with negligible probability.
|
369
|
+
//
|
370
|
+
// This function is not implemented for all curves. Add implementations as
|
371
|
+
// needed.
|
372
|
+
//
|
373
|
+
// TODO(davidben): This function does not use base point tables. For now, it is
|
374
|
+
// only used with the generic |EC_GFp_mont_method| implementation which has
|
375
|
+
// none. If generalizing to tuned curves, we should add a parameter for the base
|
376
|
+
// point and arrange for the generic implementation to have base point tables
|
377
|
+
// available.
|
378
|
+
int ec_point_mul_scalar_precomp(const EC_GROUP *group, EC_RAW_POINT *r,
|
379
|
+
const EC_PRECOMP *p0, const EC_SCALAR *scalar0,
|
380
|
+
const EC_PRECOMP *p1, const EC_SCALAR *scalar1,
|
381
|
+
const EC_PRECOMP *p2, const EC_SCALAR *scalar2);
|
382
|
+
|
383
|
+
// ec_point_mul_scalar_public sets |r| to
|
384
|
+
// generator * |g_scalar| + |p| * |p_scalar|. It assumes that the inputs are
|
385
|
+
// public so there is no concern about leaking their values through timing.
|
386
|
+
OPENSSL_EXPORT int ec_point_mul_scalar_public(const EC_GROUP *group,
|
387
|
+
EC_RAW_POINT *r,
|
388
|
+
const EC_SCALAR *g_scalar,
|
389
|
+
const EC_RAW_POINT *p,
|
390
|
+
const EC_SCALAR *p_scalar);
|
391
|
+
|
392
|
+
// ec_point_mul_scalar_public_batch sets |r| to the sum of generator *
|
393
|
+
// |g_scalar| and |points[i]| * |scalars[i]| where |points| and |scalars| have
|
394
|
+
// |num| elements. It assumes that the inputs are public so there is no concern
|
395
|
+
// about leaking their values through timing. |g_scalar| may be NULL to skip
|
396
|
+
// that term.
|
397
|
+
//
|
398
|
+
// This function is not implemented for all curves. Add implementations as
|
399
|
+
// needed.
|
400
|
+
int ec_point_mul_scalar_public_batch(const EC_GROUP *group, EC_RAW_POINT *r,
|
401
|
+
const EC_SCALAR *g_scalar,
|
402
|
+
const EC_RAW_POINT *points,
|
403
|
+
const EC_SCALAR *scalars, size_t num);
|
404
|
+
|
405
|
+
// ec_point_select, in constant time, sets |out| to |a| if |mask| is all ones
|
406
|
+
// and |b| if |mask| is all zeros.
|
407
|
+
void ec_point_select(const EC_GROUP *group, EC_RAW_POINT *out, BN_ULONG mask,
|
408
|
+
const EC_RAW_POINT *a, const EC_RAW_POINT *b);
|
409
|
+
|
410
|
+
// ec_affine_select behaves like |ec_point_select| but acts on affine points.
|
411
|
+
void ec_affine_select(const EC_GROUP *group, EC_AFFINE *out, BN_ULONG mask,
|
412
|
+
const EC_AFFINE *a, const EC_AFFINE *b);
|
413
|
+
|
414
|
+
// ec_precomp_select behaves like |ec_point_select| but acts on |EC_PRECOMP|.
|
415
|
+
void ec_precomp_select(const EC_GROUP *group, EC_PRECOMP *out, BN_ULONG mask,
|
416
|
+
const EC_PRECOMP *a, const EC_PRECOMP *b);
|
417
|
+
|
418
|
+
// ec_cmp_x_coordinate compares the x (affine) coordinate of |p|, mod the group
|
419
|
+
// order, with |r|. It returns one if the values match and zero if |p| is the
|
420
|
+
// point at infinity of the values do not match.
|
421
|
+
int ec_cmp_x_coordinate(const EC_GROUP *group, const EC_RAW_POINT *p,
|
422
|
+
const EC_SCALAR *r);
|
423
|
+
|
424
|
+
// ec_get_x_coordinate_as_scalar sets |*out| to |p|'s x-coordinate, modulo
|
425
|
+
// |group->order|. It returns one on success and zero if |p| is the point at
|
426
|
+
// infinity.
|
427
|
+
int ec_get_x_coordinate_as_scalar(const EC_GROUP *group, EC_SCALAR *out,
|
428
|
+
const EC_RAW_POINT *p);
|
429
|
+
|
430
|
+
// ec_get_x_coordinate_as_bytes writes |p|'s affine x-coordinate to |out|, which
|
431
|
+
// must have at must |max_out| bytes. It sets |*out_len| to the number of bytes
|
432
|
+
// written. The value is written big-endian and zero-padded to the size of the
|
433
|
+
// field. This function returns one on success and zero on failure.
|
434
|
+
int ec_get_x_coordinate_as_bytes(const EC_GROUP *group, uint8_t *out,
|
435
|
+
size_t *out_len, size_t max_out,
|
436
|
+
const EC_RAW_POINT *p);
|
437
|
+
|
438
|
+
// ec_point_to_bytes behaves like |EC_POINT_point2oct| but takes an
|
439
|
+
// |EC_AFFINE|.
|
440
|
+
size_t ec_point_to_bytes(const EC_GROUP *group, const EC_AFFINE *point,
|
441
|
+
point_conversion_form_t form, uint8_t *buf,
|
442
|
+
size_t len);
|
443
|
+
|
444
|
+
// ec_point_from_uncompressed parses |in| as a point in uncompressed form and
|
445
|
+
// sets the result to |out|. It returns one on success and zero if the input was
|
446
|
+
// invalid.
|
447
|
+
int ec_point_from_uncompressed(const EC_GROUP *group, EC_AFFINE *out,
|
448
|
+
const uint8_t *in, size_t len);
|
449
|
+
|
450
|
+
// ec_set_to_safe_point sets |out| to an arbitrary point on |group|, either the
|
451
|
+
// generator or the point at infinity. This is used to guard against callers of
|
452
|
+
// external APIs not checking the return value.
|
453
|
+
void ec_set_to_safe_point(const EC_GROUP *group, EC_RAW_POINT *out);
|
454
|
+
|
455
|
+
// ec_affine_jacobian_equal returns one if |a| and |b| represent the same point
|
456
|
+
// and zero otherwise. It treats both inputs as secret.
|
457
|
+
int ec_affine_jacobian_equal(const EC_GROUP *group, const EC_AFFINE *a,
|
458
|
+
const EC_RAW_POINT *b);
|
459
|
+
|
460
|
+
|
461
|
+
// Implementation details.
|
462
|
+
|
122
463
|
struct ec_method_st {
|
123
464
|
int (*group_init)(EC_GROUP *);
|
124
465
|
void (*group_finish)(EC_GROUP *);
|
@@ -128,12 +469,13 @@ struct ec_method_st {
|
|
128
469
|
// point_get_affine_coordinates sets |*x| and |*y| to the affine coordinates
|
129
470
|
// of |p|. Either |x| or |y| may be NULL to omit it. It returns one on success
|
130
471
|
// and zero if |p| is the point at infinity.
|
131
|
-
//
|
132
|
-
// Note: unlike |EC_FELEM|s used as intermediate values internal to the
|
133
|
-
// |EC_METHOD|, |*x| and |*y| are not encoded in Montgomery form.
|
134
472
|
int (*point_get_affine_coordinates)(const EC_GROUP *, const EC_RAW_POINT *p,
|
135
473
|
EC_FELEM *x, EC_FELEM *y);
|
136
474
|
|
475
|
+
// jacobian_to_affine_batch implements |ec_jacobian_to_affine_batch|.
|
476
|
+
int (*jacobian_to_affine_batch)(const EC_GROUP *group, EC_AFFINE *out,
|
477
|
+
const EC_RAW_POINT *in, size_t num);
|
478
|
+
|
137
479
|
// add sets |r| to |a| + |b|.
|
138
480
|
void (*add)(const EC_GROUP *group, EC_RAW_POINT *r, const EC_RAW_POINT *a,
|
139
481
|
const EC_RAW_POINT *b);
|
@@ -146,12 +488,32 @@ struct ec_method_st {
|
|
146
488
|
// mul_base sets |r| to |scalar|*generator.
|
147
489
|
void (*mul_base)(const EC_GROUP *group, EC_RAW_POINT *r,
|
148
490
|
const EC_SCALAR *scalar);
|
491
|
+
// mul_batch implements |ec_mul_scalar_batch|.
|
492
|
+
void (*mul_batch)(const EC_GROUP *group, EC_RAW_POINT *r,
|
493
|
+
const EC_RAW_POINT *p0, const EC_SCALAR *scalar0,
|
494
|
+
const EC_RAW_POINT *p1, const EC_SCALAR *scalar1,
|
495
|
+
const EC_RAW_POINT *p2, const EC_SCALAR *scalar2);
|
149
496
|
// mul_public sets |r| to |g_scalar|*generator + |p_scalar|*|p|. It assumes
|
150
497
|
// that the inputs are public so there is no concern about leaking their
|
151
498
|
// values through timing.
|
499
|
+
//
|
500
|
+
// This function may be omitted if |mul_public_batch| is provided.
|
152
501
|
void (*mul_public)(const EC_GROUP *group, EC_RAW_POINT *r,
|
153
502
|
const EC_SCALAR *g_scalar, const EC_RAW_POINT *p,
|
154
503
|
const EC_SCALAR *p_scalar);
|
504
|
+
// mul_public_batch implements |ec_point_mul_scalar_public_batch|.
|
505
|
+
int (*mul_public_batch)(const EC_GROUP *group, EC_RAW_POINT *r,
|
506
|
+
const EC_SCALAR *g_scalar, const EC_RAW_POINT *points,
|
507
|
+
const EC_SCALAR *scalars, size_t num);
|
508
|
+
|
509
|
+
// init_precomp implements |ec_init_precomp|.
|
510
|
+
int (*init_precomp)(const EC_GROUP *group, EC_PRECOMP *out,
|
511
|
+
const EC_RAW_POINT *p);
|
512
|
+
// mul_precomp implements |ec_point_mul_scalar_precomp|.
|
513
|
+
void (*mul_precomp)(const EC_GROUP *group, EC_RAW_POINT *r,
|
514
|
+
const EC_PRECOMP *p0, const EC_SCALAR *scalar0,
|
515
|
+
const EC_PRECOMP *p1, const EC_SCALAR *scalar1,
|
516
|
+
const EC_PRECOMP *p2, const EC_SCALAR *scalar2);
|
155
517
|
|
156
518
|
// felem_mul and felem_sqr implement multiplication and squaring,
|
157
519
|
// respectively, so that the generic |EC_POINT_add| and |EC_POINT_dbl|
|
@@ -168,21 +530,36 @@ struct ec_method_st {
|
|
168
530
|
const EC_FELEM *b);
|
169
531
|
void (*felem_sqr)(const EC_GROUP *, EC_FELEM *r, const EC_FELEM *a);
|
170
532
|
|
171
|
-
|
172
|
-
const BIGNUM *in);
|
173
|
-
int (*felem_to_bignum)(const EC_GROUP *group, BIGNUM *out,
|
533
|
+
void (*felem_to_bytes)(const EC_GROUP *group, uint8_t *out, size_t *out_len,
|
174
534
|
const EC_FELEM *in);
|
535
|
+
int (*felem_from_bytes)(const EC_GROUP *group, EC_FELEM *out,
|
536
|
+
const uint8_t *in, size_t len);
|
537
|
+
|
538
|
+
// felem_reduce sets |out| to |words|, reduced modulo the field size, p.
|
539
|
+
// |words| must be less than p^2. |num| must be at most twice the width of p.
|
540
|
+
// This function treats |words| as secret.
|
541
|
+
//
|
542
|
+
// This function is only used in hash-to-curve and may be omitted in curves
|
543
|
+
// that do not support it.
|
544
|
+
void (*felem_reduce)(const EC_GROUP *group, EC_FELEM *out,
|
545
|
+
const BN_ULONG *words, size_t num);
|
175
546
|
|
176
|
-
//
|
177
|
-
//
|
178
|
-
|
179
|
-
|
547
|
+
// felem_exp sets |out| to |a|^|exp|. It treats |a| is secret but |exp| as
|
548
|
+
// public.
|
549
|
+
//
|
550
|
+
// This function is used in hash-to-curve and may be NULL in curves not used
|
551
|
+
// with hash-to-curve.
|
552
|
+
void (*felem_exp)(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a,
|
553
|
+
const BN_ULONG *exp, size_t num_exp);
|
554
|
+
|
555
|
+
// scalar_inv0_montgomery implements |ec_scalar_inv0_montgomery|.
|
556
|
+
void (*scalar_inv0_montgomery)(const EC_GROUP *group, EC_SCALAR *out,
|
557
|
+
const EC_SCALAR *in);
|
180
558
|
|
181
|
-
//
|
182
|
-
// |
|
183
|
-
|
184
|
-
|
185
|
-
const EC_SCALAR *in);
|
559
|
+
// scalar_to_montgomery_inv_vartime implements
|
560
|
+
// |ec_scalar_to_montgomery_inv_vartime|.
|
561
|
+
int (*scalar_to_montgomery_inv_vartime)(const EC_GROUP *group, EC_SCALAR *out,
|
562
|
+
const EC_SCALAR *in);
|
186
563
|
|
187
564
|
// cmp_x_coordinate compares the x (affine) coordinate of |p|, mod the group
|
188
565
|
// order, with |r|. It returns one if the values match and zero if |p| is the
|
@@ -197,7 +574,8 @@ struct ec_group_st {
|
|
197
574
|
const EC_METHOD *meth;
|
198
575
|
|
199
576
|
// Unlike all other |EC_POINT|s, |generator| does not own |generator->group|
|
200
|
-
// to avoid a reference cycle.
|
577
|
+
// to avoid a reference cycle. Additionally, Z is guaranteed to be one, so X
|
578
|
+
// and Y are suitable for use as an |EC_AFFINE|.
|
201
579
|
EC_POINT *generator;
|
202
580
|
BIGNUM order;
|
203
581
|
|
@@ -247,133 +625,20 @@ struct ec_point_st {
|
|
247
625
|
|
248
626
|
EC_GROUP *ec_group_new(const EC_METHOD *meth);
|
249
627
|
|
250
|
-
// ec_bignum_to_felem converts |in| to an |EC_FELEM|. It returns one on success
|
251
|
-
// and zero if |in| is out of range.
|
252
|
-
int ec_bignum_to_felem(const EC_GROUP *group, EC_FELEM *out, const BIGNUM *in);
|
253
|
-
|
254
|
-
// ec_felem_to_bignum converts |in| to a |BIGNUM|. It returns one on success and
|
255
|
-
// zero on allocation failure.
|
256
|
-
int ec_felem_to_bignum(const EC_GROUP *group, BIGNUM *out, const EC_FELEM *in);
|
257
|
-
|
258
|
-
// ec_felem_neg sets |out| to -|a|.
|
259
|
-
void ec_felem_neg(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a);
|
260
|
-
|
261
|
-
// ec_felem_add sets |out| to |a| + |b|.
|
262
|
-
void ec_felem_add(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a,
|
263
|
-
const EC_FELEM *b);
|
264
|
-
|
265
|
-
// ec_felem_add sets |out| to |a| - |b|.
|
266
|
-
void ec_felem_sub(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a,
|
267
|
-
const EC_FELEM *b);
|
268
|
-
|
269
|
-
// ec_felem_non_zero_mask returns all ones if |a| is non-zero and all zeros
|
270
|
-
// otherwise.
|
271
|
-
BN_ULONG ec_felem_non_zero_mask(const EC_GROUP *group, const EC_FELEM *a);
|
272
|
-
|
273
|
-
// ec_felem_select, in constant time, sets |out| to |a| if |mask| is all ones
|
274
|
-
// and |b| if |mask| is all zeros.
|
275
|
-
void ec_felem_select(const EC_GROUP *group, EC_FELEM *out, BN_ULONG mask,
|
276
|
-
const EC_FELEM *a, const EC_FELEM *b);
|
277
|
-
|
278
|
-
// ec_felem_equal returns one if |a| and |b| are equal and zero otherwise. It
|
279
|
-
// treats |a| and |b| as public and does *not* run in constant time.
|
280
|
-
int ec_felem_equal(const EC_GROUP *group, const EC_FELEM *a, const EC_FELEM *b);
|
281
|
-
|
282
|
-
// ec_bignum_to_scalar converts |in| to an |EC_SCALAR| and writes it to
|
283
|
-
// |*out|. It returns one on success and zero if |in| is out of range.
|
284
|
-
OPENSSL_EXPORT int ec_bignum_to_scalar(const EC_GROUP *group, EC_SCALAR *out,
|
285
|
-
const BIGNUM *in);
|
286
|
-
|
287
|
-
// ec_random_nonzero_scalar sets |out| to a uniformly selected random value from
|
288
|
-
// 1 to |group->order| - 1. It returns one on success and zero on error.
|
289
|
-
int ec_random_nonzero_scalar(const EC_GROUP *group, EC_SCALAR *out,
|
290
|
-
const uint8_t additional_data[32]);
|
291
|
-
|
292
|
-
// ec_scalar_equal_vartime returns one if |a| and |b| are equal and zero
|
293
|
-
// otherwise. Both values are treated as public.
|
294
|
-
int ec_scalar_equal_vartime(const EC_GROUP *group, const EC_SCALAR *a,
|
295
|
-
const EC_SCALAR *b);
|
296
|
-
|
297
|
-
// ec_scalar_is_zero returns one if |a| is zero and zero otherwise.
|
298
|
-
int ec_scalar_is_zero(const EC_GROUP *group, const EC_SCALAR *a);
|
299
|
-
|
300
|
-
// ec_scalar_add sets |r| to |a| + |b|.
|
301
|
-
void ec_scalar_add(const EC_GROUP *group, EC_SCALAR *r, const EC_SCALAR *a,
|
302
|
-
const EC_SCALAR *b);
|
303
|
-
|
304
|
-
// ec_scalar_to_montgomery sets |r| to |a| in Montgomery form.
|
305
|
-
void ec_scalar_to_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
306
|
-
const EC_SCALAR *a);
|
307
|
-
|
308
|
-
// ec_scalar_to_montgomery sets |r| to |a| converted from Montgomery form.
|
309
|
-
void ec_scalar_from_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
310
|
-
const EC_SCALAR *a);
|
311
|
-
|
312
|
-
// ec_scalar_mul_montgomery sets |r| to |a| * |b| where inputs and outputs are
|
313
|
-
// in Montgomery form.
|
314
|
-
void ec_scalar_mul_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
315
|
-
const EC_SCALAR *a, const EC_SCALAR *b);
|
316
|
-
|
317
|
-
// ec_scalar_mul_montgomery sets |r| to |a|^-1 where inputs and outputs are in
|
318
|
-
// Montgomery form.
|
319
|
-
void ec_scalar_inv_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
320
|
-
const EC_SCALAR *a);
|
321
|
-
|
322
|
-
// ec_scalar_inv_montgomery_vartime performs the same actions as
|
323
|
-
// |ec_scalar_inv_montgomery|, but in variable time.
|
324
|
-
int ec_scalar_inv_montgomery_vartime(const EC_GROUP *group, EC_SCALAR *r,
|
325
|
-
const EC_SCALAR *a);
|
326
|
-
|
327
|
-
// ec_point_mul_scalar sets |r| to |p| * |scalar|. Both inputs are considered
|
328
|
-
// secret.
|
329
|
-
int ec_point_mul_scalar(const EC_GROUP *group, EC_RAW_POINT *r,
|
330
|
-
const EC_RAW_POINT *p, const EC_SCALAR *scalar);
|
331
|
-
|
332
|
-
// ec_point_mul_scalar_base sets |r| to generator * |scalar|. |scalar| is
|
333
|
-
// treated as secret.
|
334
|
-
int ec_point_mul_scalar_base(const EC_GROUP *group, EC_RAW_POINT *r,
|
335
|
-
const EC_SCALAR *scalar);
|
336
|
-
|
337
|
-
// ec_point_mul_scalar_public performs the same computation as
|
338
|
-
// ec_point_mul_scalar. It further assumes that the inputs are public so
|
339
|
-
// there is no concern about leaking their values through timing.
|
340
|
-
OPENSSL_EXPORT int ec_point_mul_scalar_public(const EC_GROUP *group,
|
341
|
-
EC_RAW_POINT *r,
|
342
|
-
const EC_SCALAR *g_scalar,
|
343
|
-
const EC_RAW_POINT *p,
|
344
|
-
const EC_SCALAR *p_scalar);
|
345
|
-
|
346
|
-
// ec_cmp_x_coordinate compares the x (affine) coordinate of |p|, mod the group
|
347
|
-
// order, with |r|. It returns one if the values match and zero if |p| is the
|
348
|
-
// point at infinity of the values do not match.
|
349
|
-
int ec_cmp_x_coordinate(const EC_GROUP *group, const EC_RAW_POINT *p,
|
350
|
-
const EC_SCALAR *r);
|
351
|
-
|
352
|
-
// ec_get_x_coordinate_as_scalar sets |*out| to |p|'s x-coordinate, modulo
|
353
|
-
// |group->order|. It returns one on success and zero if |p| is the point at
|
354
|
-
// infinity.
|
355
|
-
int ec_get_x_coordinate_as_scalar(const EC_GROUP *group, EC_SCALAR *out,
|
356
|
-
const EC_RAW_POINT *p);
|
357
|
-
|
358
|
-
// ec_point_get_affine_coordinate_bytes writes |p|'s affine coordinates to
|
359
|
-
// |out_x| and |out_y|, each of which must have at must |max_out| bytes. It sets
|
360
|
-
// |*out_len| to the number of bytes written in each buffer. Coordinates are
|
361
|
-
// written big-endian and zero-padded to the size of the field.
|
362
|
-
//
|
363
|
-
// Either of |out_x| or |out_y| may be NULL to omit that coordinate. This
|
364
|
-
// function returns one on success and zero on failure.
|
365
|
-
int ec_point_get_affine_coordinate_bytes(const EC_GROUP *group, uint8_t *out_x,
|
366
|
-
uint8_t *out_y, size_t *out_len,
|
367
|
-
size_t max_out, const EC_RAW_POINT *p);
|
368
|
-
|
369
|
-
// ec_field_element_to_scalar reduces |r| modulo |group->order|. |r| must
|
370
|
-
// previously have been reduced modulo |group->field|.
|
371
|
-
int ec_field_element_to_scalar(const EC_GROUP *group, BIGNUM *r);
|
372
|
-
|
373
628
|
void ec_GFp_mont_mul(const EC_GROUP *group, EC_RAW_POINT *r,
|
374
629
|
const EC_RAW_POINT *p, const EC_SCALAR *scalar);
|
375
630
|
void ec_GFp_mont_mul_base(const EC_GROUP *group, EC_RAW_POINT *r,
|
376
631
|
const EC_SCALAR *scalar);
|
632
|
+
void ec_GFp_mont_mul_batch(const EC_GROUP *group, EC_RAW_POINT *r,
|
633
|
+
const EC_RAW_POINT *p0, const EC_SCALAR *scalar0,
|
634
|
+
const EC_RAW_POINT *p1, const EC_SCALAR *scalar1,
|
635
|
+
const EC_RAW_POINT *p2, const EC_SCALAR *scalar2);
|
636
|
+
int ec_GFp_mont_init_precomp(const EC_GROUP *group, EC_PRECOMP *out,
|
637
|
+
const EC_RAW_POINT *p);
|
638
|
+
void ec_GFp_mont_mul_precomp(const EC_GROUP *group, EC_RAW_POINT *r,
|
639
|
+
const EC_PRECOMP *p0, const EC_SCALAR *scalar0,
|
640
|
+
const EC_PRECOMP *p1, const EC_SCALAR *scalar1,
|
641
|
+
const EC_PRECOMP *p2, const EC_SCALAR *scalar2);
|
377
642
|
|
378
643
|
// ec_compute_wNAF writes the modified width-(w+1) Non-Adjacent Form (wNAF) of
|
379
644
|
// |scalar| to |out|. |out| must have room for |bits| + 1 elements, each of
|
@@ -386,9 +651,10 @@ void ec_GFp_mont_mul_base(const EC_GROUP *group, EC_RAW_POINT *r,
|
|
386
651
|
void ec_compute_wNAF(const EC_GROUP *group, int8_t *out,
|
387
652
|
const EC_SCALAR *scalar, size_t bits, int w);
|
388
653
|
|
389
|
-
|
390
|
-
|
391
|
-
|
654
|
+
int ec_GFp_mont_mul_public_batch(const EC_GROUP *group, EC_RAW_POINT *r,
|
655
|
+
const EC_SCALAR *g_scalar,
|
656
|
+
const EC_RAW_POINT *points,
|
657
|
+
const EC_SCALAR *scalars, size_t num);
|
392
658
|
|
393
659
|
// method functions in simple.c
|
394
660
|
int ec_GFp_simple_group_init(EC_GROUP *);
|
@@ -400,26 +666,29 @@ int ec_GFp_simple_group_get_curve(const EC_GROUP *, BIGNUM *p, BIGNUM *a,
|
|
400
666
|
void ec_GFp_simple_point_init(EC_RAW_POINT *);
|
401
667
|
void ec_GFp_simple_point_copy(EC_RAW_POINT *, const EC_RAW_POINT *);
|
402
668
|
void ec_GFp_simple_point_set_to_infinity(const EC_GROUP *, EC_RAW_POINT *);
|
403
|
-
int ec_GFp_simple_point_set_affine_coordinates(const EC_GROUP *, EC_RAW_POINT *,
|
404
|
-
const BIGNUM *x,
|
405
|
-
const BIGNUM *y);
|
406
669
|
void ec_GFp_mont_add(const EC_GROUP *, EC_RAW_POINT *r, const EC_RAW_POINT *a,
|
407
670
|
const EC_RAW_POINT *b);
|
408
671
|
void ec_GFp_mont_dbl(const EC_GROUP *, EC_RAW_POINT *r, const EC_RAW_POINT *a);
|
409
672
|
void ec_GFp_simple_invert(const EC_GROUP *, EC_RAW_POINT *);
|
410
673
|
int ec_GFp_simple_is_at_infinity(const EC_GROUP *, const EC_RAW_POINT *);
|
411
674
|
int ec_GFp_simple_is_on_curve(const EC_GROUP *, const EC_RAW_POINT *);
|
412
|
-
int
|
413
|
-
|
414
|
-
void
|
415
|
-
|
675
|
+
int ec_GFp_simple_points_equal(const EC_GROUP *, const EC_RAW_POINT *a,
|
676
|
+
const EC_RAW_POINT *b);
|
677
|
+
void ec_simple_scalar_inv0_montgomery(const EC_GROUP *group, EC_SCALAR *r,
|
678
|
+
const EC_SCALAR *a);
|
416
679
|
|
417
|
-
int
|
418
|
-
|
680
|
+
int ec_simple_scalar_to_montgomery_inv_vartime(const EC_GROUP *group,
|
681
|
+
EC_SCALAR *r,
|
682
|
+
const EC_SCALAR *a);
|
419
683
|
|
420
684
|
int ec_GFp_simple_cmp_x_coordinate(const EC_GROUP *group, const EC_RAW_POINT *p,
|
421
685
|
const EC_SCALAR *r);
|
422
686
|
|
687
|
+
void ec_GFp_simple_felem_to_bytes(const EC_GROUP *group, uint8_t *out,
|
688
|
+
size_t *out_len, const EC_FELEM *in);
|
689
|
+
int ec_GFp_simple_felem_from_bytes(const EC_GROUP *group, EC_FELEM *out,
|
690
|
+
const uint8_t *in, size_t len);
|
691
|
+
|
423
692
|
// method functions in montgomery.c
|
424
693
|
int ec_GFp_mont_group_init(EC_GROUP *);
|
425
694
|
int ec_GFp_mont_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a,
|
@@ -429,10 +698,10 @@ void ec_GFp_mont_felem_mul(const EC_GROUP *, EC_FELEM *r, const EC_FELEM *a,
|
|
429
698
|
const EC_FELEM *b);
|
430
699
|
void ec_GFp_mont_felem_sqr(const EC_GROUP *, EC_FELEM *r, const EC_FELEM *a);
|
431
700
|
|
432
|
-
|
433
|
-
const
|
434
|
-
int
|
435
|
-
|
701
|
+
void ec_GFp_mont_felem_to_bytes(const EC_GROUP *group, uint8_t *out,
|
702
|
+
size_t *out_len, const EC_FELEM *in);
|
703
|
+
int ec_GFp_mont_felem_from_bytes(const EC_GROUP *group, EC_FELEM *out,
|
704
|
+
const uint8_t *in, size_t len);
|
436
705
|
|
437
706
|
void ec_GFp_nistp_recode_scalar_bits(uint8_t *sign, uint8_t *digit, uint8_t in);
|
438
707
|
|
@@ -453,6 +722,9 @@ typedef struct {
|
|
453
722
|
struct ec_key_st {
|
454
723
|
EC_GROUP *group;
|
455
724
|
|
725
|
+
// Ideally |pub_key| would be an |EC_AFFINE| so serializing it does not pay an
|
726
|
+
// inversion each time, but the |EC_KEY_get0_public_key| API implies public
|
727
|
+
// keys are stored in an |EC_POINT|-compatible form.
|
456
728
|
EC_POINT *pub_key;
|
457
729
|
EC_WRAPPED_SCALAR *priv_key;
|
458
730
|
|