grpc 1.69.0 → 1.70.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +251 -249
  3. data/include/grpc/support/atm.h +0 -13
  4. data/src/core/call/request_buffer.cc +224 -0
  5. data/src/core/call/request_buffer.h +192 -0
  6. data/src/core/client_channel/client_channel.cc +2 -3
  7. data/src/core/client_channel/client_channel_args.h +21 -0
  8. data/src/core/client_channel/client_channel_filter.h +1 -3
  9. data/src/core/client_channel/retry_interceptor.cc +406 -0
  10. data/src/core/client_channel/retry_interceptor.h +157 -0
  11. data/src/core/client_channel/retry_service_config.h +13 -0
  12. data/src/core/client_channel/retry_throttle.cc +33 -18
  13. data/src/core/client_channel/retry_throttle.h +3 -3
  14. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +596 -94
  15. data/src/core/ext/transport/chttp2/server/chttp2_server.h +189 -13
  16. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +1 -0
  17. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -3
  18. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +40 -1
  19. data/src/core/ext/upb-gen/envoy/admin/v3/config_dump_shared.upb.h +3 -1
  20. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +66 -36
  21. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +19 -17
  22. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb.h +116 -0
  23. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb_minitable.c +31 -5
  24. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb_minitable.h +2 -0
  25. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +67 -6
  26. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +12 -8
  27. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_cmsg_headers.upb.h +151 -0
  28. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_cmsg_headers.upb_minitable.c +60 -0
  29. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_cmsg_headers.upb_minitable.h +32 -0
  30. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb.h +228 -21
  31. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb_minitable.c +65 -17
  32. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb_minitable.h +6 -0
  33. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb.h +7 -106
  34. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb_minitable.c +7 -28
  35. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb_minitable.h +0 -2
  36. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +85 -0
  37. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +25 -3
  38. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +2 -1
  39. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +152 -0
  40. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +40 -10
  41. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.h +2 -0
  42. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +135 -4
  43. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +41 -9
  44. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.h +2 -0
  45. data/src/core/ext/upb-gen/envoy/config/trace/v3/trace.upb.h +0 -2
  46. data/src/core/ext/upb-gen/envoy/config/trace/v3/trace.upb_minitable.c +0 -1
  47. data/src/core/ext/upb-gen/envoy/config/trace/v3/trace.upb_minitable.h +0 -1
  48. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +16 -0
  49. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +3 -2
  50. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +60 -0
  51. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +13 -2
  52. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.upb.h +0 -1
  53. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.upb_minitable.c +0 -1
  54. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +102 -24
  55. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb_minitable.c +28 -19
  56. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb.h +251 -18
  57. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb_minitable.c +41 -16
  58. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb_minitable.h +2 -0
  59. data/src/core/ext/upb-gen/envoy/service/status/v3/csds.upb.h +2 -1
  60. data/src/core/ext/upbdefs-gen/envoy/admin/v3/config_dump_shared.upbdefs.c +11 -10
  61. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +418 -413
  62. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +161 -153
  63. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.h +5 -0
  64. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +267 -261
  65. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_cmsg_headers.upbdefs.c +46 -0
  66. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_cmsg_headers.upbdefs.h +33 -0
  67. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_option.upbdefs.c +29 -19
  68. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_option.upbdefs.h +15 -0
  69. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener_components.upbdefs.c +58 -65
  70. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener_components.upbdefs.h +0 -5
  71. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +73 -63
  72. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +49 -48
  73. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +117 -100
  74. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  75. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +905 -897
  76. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  77. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/trace.upbdefs.c +15 -18
  78. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +460 -457
  79. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.upbdefs.c +16 -19
  80. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +95 -95
  81. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +202 -191
  82. data/src/core/ext/upbdefs-gen/envoy/service/discovery/v3/discovery.upbdefs.c +148 -135
  83. data/src/core/ext/upbdefs-gen/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  84. data/src/core/ext/upbdefs-gen/envoy/service/status/v3/csds.upbdefs.c +23 -22
  85. data/src/core/filter/filter_args.h +112 -0
  86. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +1 -1
  87. data/src/core/lib/channel/promise_based_filter.h +5 -79
  88. data/src/core/lib/debug/trace_flags.cc +2 -0
  89. data/src/core/lib/debug/trace_flags.h +1 -0
  90. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +14 -0
  91. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +7 -2
  92. data/src/core/lib/event_engine/posix_engine/posix_engine.h +0 -2
  93. data/src/core/lib/event_engine/windows/windows_engine.cc +1 -0
  94. data/src/core/lib/experiments/experiments.cc +90 -39
  95. data/src/core/lib/experiments/experiments.h +43 -24
  96. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -1
  97. data/src/core/lib/promise/activity.cc +2 -0
  98. data/src/core/lib/promise/activity.h +29 -8
  99. data/src/core/lib/promise/map.h +42 -0
  100. data/src/core/lib/promise/party.cc +36 -1
  101. data/src/core/lib/promise/party.h +13 -5
  102. data/src/core/lib/promise/sleep.h +1 -0
  103. data/src/core/lib/promise/status_flag.h +10 -0
  104. data/src/core/lib/resource_quota/arena.h +8 -0
  105. data/src/core/lib/resource_quota/connection_quota.h +4 -0
  106. data/src/core/lib/surface/call_utils.h +2 -0
  107. data/src/core/lib/surface/client_call.cc +43 -35
  108. data/src/core/lib/surface/client_call.h +5 -0
  109. data/src/core/lib/surface/event_string.cc +7 -1
  110. data/src/core/lib/surface/init_internally.h +13 -2
  111. data/src/core/lib/surface/server_call.cc +100 -85
  112. data/src/core/lib/surface/version.cc +2 -2
  113. data/src/core/lib/transport/call_filters.cc +10 -4
  114. data/src/core/lib/transport/call_filters.h +8 -0
  115. data/src/core/lib/transport/call_spine.cc +36 -71
  116. data/src/core/lib/transport/call_spine.h +131 -7
  117. data/src/core/lib/transport/call_state.h +132 -39
  118. data/src/core/lib/transport/interception_chain.cc +8 -0
  119. data/src/core/lib/transport/interception_chain.h +9 -0
  120. data/src/core/load_balancing/endpoint_list.cc +10 -0
  121. data/src/core/load_balancing/endpoint_list.h +13 -6
  122. data/src/core/load_balancing/lb_policy.h +0 -8
  123. data/src/core/load_balancing/pick_first/pick_first.cc +89 -56
  124. data/src/core/load_balancing/ring_hash/ring_hash.cc +158 -70
  125. data/src/core/load_balancing/ring_hash/ring_hash.h +4 -11
  126. data/src/core/load_balancing/round_robin/round_robin.cc +9 -14
  127. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +12 -15
  128. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +4 -4
  129. data/src/core/resolver/xds/xds_dependency_manager.cc +139 -135
  130. data/src/core/resolver/xds/xds_dependency_manager.h +24 -18
  131. data/src/core/resolver/xds/xds_resolver.cc +28 -47
  132. data/src/core/server/server.cc +290 -24
  133. data/src/core/server/server.h +199 -61
  134. data/src/core/server/xds_server_config_fetcher.cc +78 -142
  135. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  136. data/src/core/util/backoff.cc +15 -4
  137. data/src/core/util/http_client/httpcli.cc +66 -18
  138. data/src/core/util/http_client/httpcli.h +14 -4
  139. data/src/core/util/matchers.h +5 -10
  140. data/src/core/util/ref_counted.h +1 -0
  141. data/src/core/util/ref_counted_ptr.h +1 -1
  142. data/src/core/util/useful.h +9 -11
  143. data/src/core/xds/grpc/xds_endpoint_parser.cc +54 -23
  144. data/src/core/xds/grpc/xds_metadata.h +8 -0
  145. data/src/core/xds/xds_client/xds_api.cc +0 -223
  146. data/src/core/xds/xds_client/xds_api.h +1 -133
  147. data/src/core/xds/xds_client/xds_client.cc +599 -466
  148. data/src/core/xds/xds_client/xds_client.h +107 -26
  149. data/src/core/xds/xds_client/xds_resource_type_impl.h +10 -5
  150. data/src/ruby/ext/grpc/extconf.rb +1 -0
  151. data/src/ruby/lib/grpc/version.rb +1 -1
  152. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_bitstr.c → a_bitstr.cc} +3 -2
  153. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_d2i_fp.c → a_d2i_fp.cc} +1 -1
  154. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_dup.c → a_dup.cc} +1 -1
  155. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_i2d_fp.c → a_i2d_fp.cc} +1 -1
  156. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_int.c → a_int.cc} +2 -1
  157. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_mbstr.c → a_mbstr.cc} +9 -7
  158. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_object.c → a_object.cc} +1 -1
  159. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_strnid.c → a_strnid.cc} +7 -4
  160. data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_type.c → a_type.cc} +4 -4
  161. data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_lib.c → asn1_lib.cc} +4 -4
  162. data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn_pack.c → asn_pack.cc} +2 -2
  163. data/third_party/boringssl-with-bazel/src/crypto/asn1/{posix_time.c → posix_time.cc} +2 -2
  164. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_dec.c → tasn_dec.cc} +4 -3
  165. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_enc.c → tasn_enc.cc} +9 -6
  166. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_fre.c → tasn_fre.cc} +14 -20
  167. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_new.c → tasn_new.cc} +7 -6
  168. data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_utl.c → tasn_utl.cc} +13 -10
  169. data/third_party/boringssl-with-bazel/src/crypto/base64/{base64.c → base64.cc} +9 -12
  170. data/third_party/boringssl-with-bazel/src/crypto/bcm_support.h +7 -1
  171. data/third_party/boringssl-with-bazel/src/crypto/bio/{bio.c → bio.cc} +32 -58
  172. data/third_party/boringssl-with-bazel/src/crypto/bio/{bio_mem.c → bio_mem.cc} +8 -7
  173. data/third_party/boringssl-with-bazel/src/crypto/bio/{connect.c → connect.cc} +24 -16
  174. data/third_party/boringssl-with-bazel/src/crypto/bio/{file.c → file.cc} +3 -3
  175. data/third_party/boringssl-with-bazel/src/crypto/bio/{pair.c → pair.cc} +22 -20
  176. data/third_party/boringssl-with-bazel/src/crypto/bio/{printf.c → printf.cc} +2 -2
  177. data/third_party/boringssl-with-bazel/src/crypto/bio/{socket_helper.c → socket_helper.cc} +1 -1
  178. data/third_party/boringssl-with-bazel/src/crypto/blake2/{blake2.c → blake2.cc} +2 -2
  179. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/{bn_asn1.c → bn_asn1.cc} +1 -1
  180. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/{convert.c → convert.cc} +21 -21
  181. data/third_party/boringssl-with-bazel/src/crypto/buf/{buf.c → buf.cc} +6 -3
  182. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{asn1_compat.c → asn1_compat.cc} +1 -1
  183. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{ber.c → ber.cc} +1 -1
  184. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{cbb.c → cbb.cc} +33 -49
  185. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{cbs.c → cbs.cc} +20 -27
  186. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +1 -1
  187. data/third_party/boringssl-with-bazel/src/crypto/bytestring/{unicode.c → unicode.cc} +1 -1
  188. data/third_party/boringssl-with-bazel/src/crypto/chacha/{chacha.c → chacha.cc} +1 -1
  189. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +1 -1
  190. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_aesctrhmac.c → e_aesctrhmac.cc} +1 -1
  191. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_aesgcmsiv.c → e_aesgcmsiv.cc} +23 -26
  192. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_chacha20poly1305.c → e_chacha20poly1305.cc} +1 -8
  193. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_des.c → e_des.cc} +61 -49
  194. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_null.c → e_null.cc} +12 -9
  195. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_rc2.c → e_rc2.cc} +23 -19
  196. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_rc4.c → e_rc4.cc} +10 -8
  197. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{e_tls.c → e_tls.cc} +2 -1
  198. data/third_party/boringssl-with-bazel/src/crypto/conf/{conf.c → conf.cc} +17 -14
  199. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +1 -1
  200. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_apple.c → cpu_aarch64_apple.cc} +2 -2
  201. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_fuchsia.c → cpu_aarch64_fuchsia.cc} +2 -2
  202. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_linux.c → cpu_aarch64_linux.cc} +2 -2
  203. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_openbsd.c → cpu_aarch64_openbsd.cc} +4 -4
  204. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_sysreg.c → cpu_aarch64_sysreg.cc} +3 -2
  205. data/third_party/boringssl-with-bazel/src/crypto/{cpu_aarch64_win.c → cpu_aarch64_win.cc} +2 -2
  206. data/third_party/boringssl-with-bazel/src/crypto/{cpu_arm_freebsd.c → cpu_arm_freebsd.cc} +3 -3
  207. data/third_party/boringssl-with-bazel/src/crypto/{cpu_arm_linux.c → cpu_arm_linux.cc} +5 -5
  208. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.h +1 -1
  209. data/third_party/boringssl-with-bazel/src/crypto/{cpu_intel.c → cpu_intel.cc} +47 -32
  210. data/third_party/boringssl-with-bazel/src/crypto/{crypto.c → crypto.cc} +6 -11
  211. data/third_party/boringssl-with-bazel/src/crypto/curve25519/{curve25519.c → curve25519.cc} +28 -31
  212. data/third_party/boringssl-with-bazel/src/crypto/curve25519/{curve25519_64_adx.c → curve25519_64_adx.cc} +1 -1
  213. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +1 -1
  214. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -1
  215. data/third_party/boringssl-with-bazel/src/crypto/curve25519/{spake25519.c → spake25519.cc} +20 -16
  216. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/{dh_asn1.c → dh_asn1.cc} +2 -2
  217. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/{digest_extra.c → digest_extra.cc} +113 -31
  218. data/third_party/boringssl-with-bazel/src/crypto/dsa/{dsa.c → dsa.cc} +153 -154
  219. data/third_party/boringssl-with-bazel/src/crypto/dsa/{dsa_asn1.c → dsa_asn1.cc} +2 -2
  220. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +1 -3
  221. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/{ec_asn1.c → ec_asn1.cc} +35 -0
  222. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/{ec_derive.c → ec_derive.cc} +1 -1
  223. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/{hash_to_curve.c → hash_to_curve.cc} +66 -64
  224. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +1 -1
  225. data/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/{ecdsa_asn1.c → ecdsa_asn1.cc} +15 -25
  226. data/third_party/boringssl-with-bazel/src/crypto/engine/{engine.c → engine.cc} +12 -8
  227. data/third_party/boringssl-with-bazel/src/crypto/err/{err.c → err.cc} +24 -27
  228. data/third_party/boringssl-with-bazel/src/crypto/err/internal.h +1 -1
  229. data/third_party/boringssl-with-bazel/src/crypto/evp/{evp.c → evp.cc} +8 -9
  230. data/third_party/boringssl-with-bazel/src/crypto/evp/{evp_ctx.c → evp_ctx.cc} +7 -8
  231. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_dh.c → p_dh.cc} +23 -14
  232. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_dh_asn1.c → p_dh_asn1.cc} +38 -21
  233. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_dsa_asn1.c → p_dsa_asn1.cc} +19 -24
  234. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_ec.c → p_ec.cc} +20 -23
  235. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_ec_asn1.c → p_ec_asn1.cc} +20 -20
  236. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_ed25519.c → p_ed25519.cc} +22 -19
  237. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_ed25519_asn1.c → p_ed25519_asn1.cc} +14 -13
  238. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_hkdf.c → p_hkdf.cc} +18 -14
  239. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_rsa.c → p_rsa.cc} +38 -37
  240. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_rsa_asn1.c → p_rsa_asn1.cc} +16 -18
  241. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_x25519.c → p_x25519.cc} +22 -19
  242. data/third_party/boringssl-with-bazel/src/crypto/evp/{p_x25519_asn1.c → p_x25519_asn1.cc} +18 -17
  243. data/third_party/boringssl-with-bazel/src/crypto/evp/{pbkdf.c → pbkdf.cc} +2 -2
  244. data/third_party/boringssl-with-bazel/src/crypto/evp/{print.c → print.cc} +4 -5
  245. data/third_party/boringssl-with-bazel/src/crypto/evp/{scrypt.c → scrypt.cc} +7 -5
  246. data/third_party/boringssl-with-bazel/src/crypto/{ex_data.c → ex_data.cc} +3 -4
  247. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/{aes_nohw.c.inc → aes_nohw.cc.inc} +1 -1
  248. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +1 -5
  249. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/{key_wrap.c.inc → key_wrap.cc.inc} +1 -1
  250. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/{bcm.c → bcm.cc} +96 -101
  251. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm_interface.h +165 -12
  252. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{add.c.inc → add.cc.inc} +1 -0
  253. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/asm/{x86_64-gcc.c.inc → x86_64-gcc.cc.inc} +4 -4
  254. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{bn.c.inc → bn.cc.inc} +12 -24
  255. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{ctx.c.inc → ctx.cc.inc} +5 -7
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{div.c.inc → div.cc.inc} +29 -38
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{div_extra.c.inc → div_extra.cc.inc} +1 -1
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{exponentiation.c.inc → exponentiation.cc.inc} +22 -22
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{gcd.c.inc → gcd.cc.inc} +3 -6
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{gcd_extra.c.inc → gcd_extra.cc.inc} +33 -25
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{montgomery.c.inc → montgomery.cc.inc} +10 -17
  262. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{mul.c.inc → mul.cc.inc} +11 -15
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{prime.c.inc → prime.cc.inc} +31 -34
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{shift.c.inc → shift.cc.inc} +3 -4
  265. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/{aead.c.inc → aead.cc.inc} +18 -10
  266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/{cipher.c.inc → cipher.cc.inc} +6 -9
  267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/{e_aes.c.inc → e_aes.cc.inc} +46 -54
  268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cmac/{cmac.c.inc → cmac.cc.inc} +6 -6
  269. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h +14 -10
  270. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/{dh.c.inc → dh.cc.inc} +15 -19
  271. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +1 -3
  272. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/{digest.c.inc → digest.cc.inc} +17 -13
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/{digests.c.inc → digests.cc.inc} +29 -113
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digestsign/{digestsign.c.inc → digestsign.cc.inc} +3 -3
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/builtin_curves.h +1 -1
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{ec.c.inc → ec.cc.inc} +10 -15
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{ec_key.c.inc → ec_key.cc.inc} +12 -14
  278. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{felem.c.inc → felem.cc.inc} +1 -1
  279. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{oct.c.inc → oct.cc.inc} +5 -6
  280. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p224-64.c.inc → p224-64.cc.inc} +1 -1
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz-table.h +1 -1
  282. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256-nistz.c.inc → p256-nistz.cc.inc} +15 -13
  283. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{p256.c.inc → p256.cc.inc} +1 -1
  284. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
  285. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{scalar.c.inc → scalar.cc.inc} +1 -1
  286. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{simple_mul.c.inc → simple_mul.cc.inc} +1 -1
  287. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{util.c.inc → util.cc.inc} +1 -1
  288. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{wnaf.c.inc → wnaf.cc.inc} +24 -15
  289. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/{ecdh.c.inc → ecdh.cc.inc} +14 -5
  290. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/{ecdsa.c.inc → ecdsa.cc.inc} +6 -7
  291. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +1 -1
  292. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/{fips_shared_support.c → fips_shared_support.cc} +2 -3
  293. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hkdf/{hkdf.c.inc → hkdf.cc.inc} +1 -1
  294. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/{hmac.c.inc → hmac.cc.inc} +3 -2
  295. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{gcm.c.inc → gcm.cc.inc} +69 -21
  296. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{gcm_nohw.c.inc → gcm_nohw.cc.inc} +1 -1
  297. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +53 -33
  298. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{polyval.c.inc → polyval.cc.inc} +2 -3
  299. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/{ctrdrbg.c.inc → ctrdrbg.cc.inc} +5 -4
  300. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +1 -1
  301. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/{rand.c.inc → rand.cc.inc} +20 -18
  302. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/{blinding.c.inc → blinding.cc.inc} +5 -4
  303. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/{padding.c.inc → padding.cc.inc} +21 -21
  304. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/{rsa.c.inc → rsa.cc.inc} +77 -73
  305. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/{rsa_impl.c.inc → rsa_impl.cc.inc} +50 -53
  306. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/{fips.c.inc → fips.cc.inc} +14 -6
  307. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/{self_check.c.inc → self_check.cc.inc} +56 -52
  308. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/{service_indicator.c.inc → service_indicator.cc.inc} +10 -11
  309. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +2 -4
  310. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/{sha1.c.inc → sha1.cc.inc} +26 -33
  311. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/{sha256.c.inc → sha256.cc.inc} +37 -55
  312. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/{sha512.c.inc → sha512.cc.inc} +48 -76
  313. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +1 -1
  314. data/third_party/boringssl-with-bazel/src/crypto/hpke/{hpke.c → hpke.cc} +7 -4
  315. data/third_party/boringssl-with-bazel/src/crypto/hrss/{hrss.c → hrss.cc} +53 -110
  316. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +1 -1
  317. data/third_party/boringssl-with-bazel/src/crypto/internal.h +191 -248
  318. data/third_party/boringssl-with-bazel/src/crypto/keccak/internal.h +1 -1
  319. data/third_party/boringssl-with-bazel/src/crypto/keccak/{keccak.c → keccak.cc} +1 -1
  320. data/third_party/boringssl-with-bazel/src/crypto/kyber/internal.h +1 -1
  321. data/third_party/boringssl-with-bazel/src/crypto/kyber/{kyber.c → kyber.cc} +1 -1
  322. data/third_party/boringssl-with-bazel/src/crypto/lhash/{lhash.c → lhash.cc} +8 -7
  323. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/md4/md4.c.inc → md4/md4.cc} +8 -12
  324. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/md5 → md5}/internal.h +1 -1
  325. data/third_party/boringssl-with-bazel/src/crypto/{fipsmodule/md5/md5.c.inc → md5/md5.cc} +4 -3
  326. data/third_party/boringssl-with-bazel/src/crypto/{mem.c → mem.cc} +34 -22
  327. data/third_party/boringssl-with-bazel/src/crypto/mldsa/internal.h +4 -1
  328. data/third_party/boringssl-with-bazel/src/crypto/mldsa/{mldsa.c → mldsa.cc} +646 -543
  329. data/third_party/boringssl-with-bazel/src/crypto/mlkem/internal.h +1 -1
  330. data/third_party/boringssl-with-bazel/src/crypto/mlkem/mlkem.cc +8 -8
  331. data/third_party/boringssl-with-bazel/src/crypto/obj/{obj.c → obj.cc} +27 -30
  332. data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_info.c → pem_info.cc} +2 -2
  333. data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_lib.c → pem_lib.cc} +3 -4
  334. data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_oth.c → pem_oth.cc} +1 -1
  335. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +1 -1
  336. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/{pkcs7.c → pkcs7.cc} +5 -5
  337. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/{pkcs7_x509.c → pkcs7_x509.cc} +26 -25
  338. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +2 -2
  339. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/{p5_pbev2.c → p5_pbev2.cc} +2 -2
  340. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/{pkcs8.c → pkcs8.cc} +159 -158
  341. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/{pkcs8_x509.c → pkcs8_x509.cc} +90 -97
  342. data/third_party/boringssl-with-bazel/src/crypto/poly1305/internal.h +1 -1
  343. data/third_party/boringssl-with-bazel/src/crypto/poly1305/{poly1305.c → poly1305.cc} +3 -3
  344. data/third_party/boringssl-with-bazel/src/crypto/poly1305/{poly1305_arm.c → poly1305_arm.cc} +4 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/poly1305/{poly1305_vec.c → poly1305_vec.cc} +14 -11
  346. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pool/{pool.c → pool.cc} +12 -11
  348. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{deterministic.c → deterministic.cc} +2 -2
  349. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{fork_detect.c → fork_detect.cc} +11 -12
  350. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{forkunsafe.c → forkunsafe.cc} +2 -2
  351. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{getentropy.c → getentropy.cc} +1 -1
  352. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getrandom_fillin.h +1 -1
  353. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{ios.c → ios.cc} +1 -1
  354. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{passive.c → passive.cc} +22 -18
  355. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{rand_extra.c → rand_extra.cc} +1 -1
  356. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/sysrand_internal.h +1 -1
  357. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{trusty.c → trusty.cc} +1 -1
  358. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{urandom.c → urandom.cc} +7 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{windows.c → windows.cc} +1 -1
  360. data/third_party/boringssl-with-bazel/src/crypto/{refcount.c → refcount.cc} +1 -1
  361. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/{rsa_asn1.c → rsa_asn1.cc} +2 -2
  362. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/{rsa_crypt.c → rsa_crypt.cc} +81 -78
  363. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_extra.cc +17 -0
  364. data/third_party/boringssl-with-bazel/src/crypto/sha/sha1.cc +52 -0
  365. data/third_party/boringssl-with-bazel/src/crypto/sha/sha256.cc +87 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/sha/sha512.cc +104 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/siphash/{siphash.c → siphash.cc} +1 -1
  368. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/address.h +123 -0
  369. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.cc +169 -0
  370. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.h +58 -0
  371. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/internal.h +63 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.cc +161 -0
  373. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.h +70 -0
  374. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/params.h +83 -0
  375. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/slhdsa.cc +307 -0
  376. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.cc +173 -0
  377. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.h +85 -0
  378. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.cc +171 -0
  379. data/third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.h +50 -0
  380. data/third_party/boringssl-with-bazel/src/crypto/stack/{stack.c → stack.cc} +10 -6
  381. data/third_party/boringssl-with-bazel/src/crypto/{thread_none.c → thread_none.cc} +1 -1
  382. data/third_party/boringssl-with-bazel/src/crypto/{thread_pthread.c → thread_pthread.cc} +9 -8
  383. data/third_party/boringssl-with-bazel/src/crypto/{thread_win.c → thread_win.cc} +21 -17
  384. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +1 -1
  385. data/third_party/boringssl-with-bazel/src/crypto/trust_token/{pmbtoken.c → pmbtoken.cc} +146 -158
  386. data/third_party/boringssl-with-bazel/src/crypto/trust_token/{trust_token.c → trust_token.cc} +19 -21
  387. data/third_party/boringssl-with-bazel/src/crypto/trust_token/{voprf.c → voprf.cc} +165 -169
  388. data/third_party/boringssl-with-bazel/src/crypto/x509/{a_digest.c → a_digest.cc} +1 -1
  389. data/third_party/boringssl-with-bazel/src/crypto/x509/{a_sign.c → a_sign.cc} +37 -34
  390. data/third_party/boringssl-with-bazel/src/crypto/x509/{a_verify.c → a_verify.cc} +1 -1
  391. data/third_party/boringssl-with-bazel/src/crypto/x509/{algorithm.c → algorithm.cc} +1 -1
  392. data/third_party/boringssl-with-bazel/src/crypto/x509/{asn1_gen.c → asn1_gen.cc} +5 -6
  393. data/third_party/boringssl-with-bazel/src/crypto/x509/{by_dir.c → by_dir.cc} +7 -6
  394. data/third_party/boringssl-with-bazel/src/crypto/x509/{policy.c → policy.cc} +188 -178
  395. data/third_party/boringssl-with-bazel/src/crypto/x509/{rsa_pss.c → rsa_pss.cc} +48 -44
  396. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_akey.c → v3_akey.cc} +4 -2
  397. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_alt.c → v3_alt.cc} +5 -5
  398. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_bcons.c → v3_bcons.cc} +3 -1
  399. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_bitst.c → v3_bitst.cc} +6 -3
  400. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_conf.c → v3_conf.cc} +5 -5
  401. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_cpols.c → v3_cpols.cc} +47 -41
  402. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_crld.c → v3_crld.cc} +3 -2
  403. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_enum.c → v3_enum.cc} +5 -2
  404. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_extku.c → v3_extku.cc} +3 -1
  405. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_genn.c → v3_genn.cc} +7 -7
  406. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_ia5.c → v3_ia5.cc} +3 -2
  407. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_info.c → v3_info.cc} +4 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_int.c → v3_int.cc} +3 -1
  409. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_lib.c → v3_lib.cc} +9 -6
  410. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_ncons.c → v3_ncons.cc} +3 -3
  411. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_ocsp.c → v3_ocsp.cc} +4 -1
  412. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_pcons.c → v3_pcons.cc} +3 -3
  413. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_pmaps.c → v3_pmaps.cc} +3 -3
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_prn.c → v3_prn.cc} +2 -1
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_purp.c → v3_purp.cc} +16 -8
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_skey.c → v3_skey.cc} +6 -3
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_utl.c → v3_utl.cc} +15 -10
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_att.c → x509_att.cc} +3 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_lu.c → x509_lu.cc} +6 -5
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_v3.c → x509_v3.cc} +2 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_vfy.c → x509_vfy.cc} +216 -212
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_vpm.c → x509_vpm.cc} +55 -13
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/{x509spki.c → x509spki.cc} +3 -3
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_all.c → x_all.cc} +10 -6
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_crl.c → x_crl.cc} +6 -6
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_name.c → x_name.cc} +39 -32
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_pubkey.c → x_pubkey.cc} +4 -2
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_x509.c → x_x509.cc} +48 -44
  429. data/third_party/boringssl-with-bazel/src/crypto/x509/{x_x509a.c → x_x509a.cc} +4 -2
  430. data/third_party/boringssl-with-bazel/src/gen/crypto/{err_data.c → err_data.cc} +359 -358
  431. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +1 -1
  432. data/third_party/boringssl-with-bazel/src/include/openssl/asm_base.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/include/openssl/asn1_mac.h +1 -1
  434. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +237 -275
  435. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +12 -5
  436. data/third_party/boringssl-with-bazel/src/include/openssl/bcm_public.h +82 -0
  437. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -1
  438. data/third_party/boringssl-with-bazel/src/include/openssl/buffer.h +1 -1
  439. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +1 -1
  440. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +1 -1
  441. data/third_party/boringssl-with-bazel/src/include/openssl/cmac.h +1 -1
  442. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +1 -1
  443. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +13 -2
  444. data/third_party/boringssl-with-bazel/src/include/openssl/ctrdrbg.h +1 -1
  445. data/third_party/boringssl-with-bazel/src/include/openssl/curve25519.h +1 -1
  446. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -0
  447. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +6 -1
  448. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +4 -0
  449. data/third_party/boringssl-with-bazel/src/include/openssl/dtls1.h +1 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/e_os2.h +1 -1
  451. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +17 -1
  452. data/third_party/boringssl-with-bazel/src/include/openssl/engine.h +1 -1
  453. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -1
  454. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/kyber.h +1 -1
  455. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +1 -1
  456. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  457. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +1 -1
  458. data/third_party/boringssl-with-bazel/src/include/openssl/is_boringssl.h +1 -1
  459. data/third_party/boringssl-with-bazel/src/include/openssl/kdf.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/include/openssl/mldsa.h +8 -8
  461. data/third_party/boringssl-with-bazel/src/include/openssl/mlkem.h +1 -1
  462. data/third_party/boringssl-with-bazel/src/include/openssl/obj_mac.h +1 -1
  463. data/third_party/boringssl-with-bazel/src/include/openssl/objects.h +1 -1
  464. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +1 -1
  465. data/third_party/boringssl-with-bazel/src/include/openssl/opensslv.h +1 -1
  466. data/third_party/boringssl-with-bazel/src/include/openssl/ossl_typ.h +1 -1
  467. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs12.h +1 -1
  468. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +1 -1
  469. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +2 -2
  470. data/third_party/boringssl-with-bazel/src/include/openssl/poly1305.h +1 -1
  471. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +1 -1
  472. data/third_party/boringssl-with-bazel/src/include/openssl/posix_time.h +1 -1
  473. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +1 -1
  474. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +10 -5
  475. data/third_party/boringssl-with-bazel/src/include/openssl/safestack.h +1 -1
  476. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +2 -40
  477. data/third_party/boringssl-with-bazel/src/include/openssl/siphash.h +1 -1
  478. data/third_party/boringssl-with-bazel/src/include/openssl/slhdsa.h +133 -0
  479. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +6 -1
  480. data/third_party/boringssl-with-bazel/src/include/openssl/srtp.h +1 -1
  481. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +160 -116
  482. data/third_party/boringssl-with-bazel/src/include/openssl/ssl3.h +1 -0
  483. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +1 -1
  484. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +2 -2
  485. data/third_party/boringssl-with-bazel/src/include/openssl/time.h +1 -1
  486. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -1
  487. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -1
  488. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -1
  489. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3_errors.h +2 -2
  490. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +2 -6
  491. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +667 -322
  492. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +116 -119
  493. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +163 -21
  494. data/third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc +4 -12
  495. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +94 -49
  496. data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +296 -198
  497. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +23 -14
  498. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +363 -343
  499. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +48 -58
  500. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +44 -36
  501. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +145 -159
  502. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +65 -58
  503. data/third_party/boringssl-with-bazel/src/ssl/internal.h +910 -356
  504. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +29 -41
  505. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +13 -11
  506. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +2 -2
  507. data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +90 -183
  508. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +38 -64
  509. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +1 -1
  510. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +103 -44
  511. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +210 -220
  512. data/third_party/boringssl-with-bazel/src/ssl/ssl_credential.cc +70 -12
  513. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +20 -17
  514. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +146 -169
  515. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +15 -16
  516. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +79 -95
  517. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +3 -9
  518. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +91 -16
  519. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +30 -16
  520. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +51 -56
  521. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +22 -25
  522. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +43 -27
  523. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +63 -59
  524. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +204 -121
  525. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +86 -59
  526. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +51 -62
  527. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +37 -25
  528. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +6 -0
  529. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +6 -0
  530. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h +4 -1
  531. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1 -1
  532. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +3 -0
  533. metadata +339 -339
  534. data/src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb.h +0 -426
  535. data/src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb_minitable.c +0 -87
  536. data/src/core/ext/upb-gen/envoy/config/trace/v3/opencensus.upb_minitable.h +0 -32
  537. data/src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb.h +0 -408
  538. data/src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb_minitable.c +0 -124
  539. data/src/core/ext/upb-gen/opencensus/proto/trace/v1/trace_config.upb_minitable.h +0 -38
  540. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opencensus.upbdefs.c +0 -108
  541. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opencensus.upbdefs.h +0 -33
  542. data/src/core/ext/upbdefs-gen/opencensus/proto/trace/v1/trace_config.upbdefs.c +0 -67
  543. data/src/core/ext/upbdefs-gen/opencensus/proto/trace/v1/trace_config.upbdefs.h +0 -48
  544. data/src/core/util/atm.cc +0 -34
  545. data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +0 -1539
  546. data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +0 -58
  547. data/third_party/boringssl-with-bazel/src/crypto/spx/address.c +0 -101
  548. data/third_party/boringssl-with-bazel/src/crypto/spx/address.h +0 -50
  549. data/third_party/boringssl-with-bazel/src/crypto/spx/fors.c +0 -133
  550. data/third_party/boringssl-with-bazel/src/crypto/spx/fors.h +0 -54
  551. data/third_party/boringssl-with-bazel/src/crypto/spx/merkle.c +0 -150
  552. data/third_party/boringssl-with-bazel/src/crypto/spx/merkle.h +0 -61
  553. data/third_party/boringssl-with-bazel/src/crypto/spx/params.h +0 -71
  554. data/third_party/boringssl-with-bazel/src/crypto/spx/spx.c +0 -140
  555. data/third_party/boringssl-with-bazel/src/crypto/spx/spx_util.c +0 -53
  556. data/third_party/boringssl-with-bazel/src/crypto/spx/spx_util.h +0 -44
  557. data/third_party/boringssl-with-bazel/src/crypto/spx/thash.c +0 -136
  558. data/third_party/boringssl-with-bazel/src/crypto/spx/thash.h +0 -70
  559. data/third_party/boringssl-with-bazel/src/crypto/spx/wots.c +0 -135
  560. data/third_party/boringssl-with-bazel/src/crypto/spx/wots.h +0 -45
  561. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +0 -129
  562. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/spx.h +0 -90
  563. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_bool.c → a_bool.cc} +0 -0
  564. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_gentm.c → a_gentm.cc} +0 -0
  565. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_octet.c → a_octet.cc} +0 -0
  566. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_strex.c → a_strex.cc} +0 -0
  567. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_time.c → a_time.cc} +0 -0
  568. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{a_utctm.c → a_utctm.cc} +0 -0
  569. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_par.c → asn1_par.cc} +0 -0
  570. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{f_int.c → f_int.cc} +0 -0
  571. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{f_string.c → f_string.cc} +0 -0
  572. /data/third_party/boringssl-with-bazel/src/crypto/asn1/{tasn_typ.c → tasn_typ.cc} +0 -0
  573. /data/third_party/boringssl-with-bazel/src/crypto/bio/{errno.c → errno.cc} +0 -0
  574. /data/third_party/boringssl-with-bazel/src/crypto/bio/{fd.c → fd.cc} +0 -0
  575. /data/third_party/boringssl-with-bazel/src/crypto/bio/{hexdump.c → hexdump.cc} +0 -0
  576. /data/third_party/boringssl-with-bazel/src/crypto/bio/{socket.c → socket.cc} +0 -0
  577. /data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{cipher_extra.c → cipher_extra.cc} +0 -0
  578. /data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{derive_key.c → derive_key.cc} +0 -0
  579. /data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/{tls_cbc.c → tls_cbc.cc} +0 -0
  580. /data/third_party/boringssl-with-bazel/src/crypto/des/{des.c → des.cc} +0 -0
  581. /data/third_party/boringssl-with-bazel/src/crypto/dh_extra/{params.c → params.cc} +0 -0
  582. /data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/{ecdh_extra.c → ecdh_extra.cc} +0 -0
  583. /data/third_party/boringssl-with-bazel/src/crypto/evp/{evp_asn1.c → evp_asn1.cc} +0 -0
  584. /data/third_party/boringssl-with-bazel/src/crypto/evp/{sign.c → sign.cc} +0 -0
  585. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/{aes.c.inc → aes.cc.inc} +0 -0
  586. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/{mode_wrappers.c.inc → mode_wrappers.cc.inc} +0 -0
  587. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{bytes.c.inc → bytes.cc.inc} +0 -0
  588. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{cmp.c.inc → cmp.cc.inc} +0 -0
  589. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{generic.c.inc → generic.cc.inc} +0 -0
  590. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{jacobi.c.inc → jacobi.cc.inc} +0 -0
  591. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{montgomery_inv.c.inc → montgomery_inv.cc.inc} +0 -0
  592. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{random.c.inc → random.cc.inc} +0 -0
  593. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{rsaz_exp.c.inc → rsaz_exp.cc.inc} +0 -0
  594. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/{sqrt.c.inc → sqrt.cc.inc} +0 -0
  595. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/{e_aesccm.c.inc → e_aesccm.cc.inc} +0 -0
  596. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/{check.c.inc → check.cc.inc} +0 -0
  597. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{ec_montgomery.c.inc → ec_montgomery.cc.inc} +0 -0
  598. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/{simple.c.inc → simple.cc.inc} +0 -0
  599. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{cbc.c.inc → cbc.cc.inc} +0 -0
  600. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{cfb.c.inc → cfb.cc.inc} +0 -0
  601. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{ctr.c.inc → ctr.cc.inc} +0 -0
  602. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/{ofb.c.inc → ofb.cc.inc} +0 -0
  603. /data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/{kdf.c.inc → kdf.cc.inc} +0 -0
  604. /data/third_party/boringssl-with-bazel/src/crypto/obj/{obj_xref.c → obj_xref.cc} +0 -0
  605. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_all.c → pem_all.cc} +0 -0
  606. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_pk8.c → pem_pk8.cc} +0 -0
  607. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_pkey.c → pem_pkey.cc} +0 -0
  608. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_x509.c → pem_x509.cc} +0 -0
  609. /data/third_party/boringssl-with-bazel/src/crypto/pem/{pem_xaux.c → pem_xaux.cc} +0 -0
  610. /data/third_party/boringssl-with-bazel/src/crypto/rc4/{rc4.c → rc4.cc} +0 -0
  611. /data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/{rsa_print.c → rsa_print.cc} +0 -0
  612. /data/third_party/boringssl-with-bazel/src/crypto/{thread.c → thread.cc} +0 -0
  613. /data/third_party/boringssl-with-bazel/src/crypto/x509/{by_file.c → by_file.cc} +0 -0
  614. /data/third_party/boringssl-with-bazel/src/crypto/x509/{i2d_pr.c → i2d_pr.cc} +0 -0
  615. /data/third_party/boringssl-with-bazel/src/crypto/x509/{name_print.c → name_print.cc} +0 -0
  616. /data/third_party/boringssl-with-bazel/src/crypto/x509/{t_crl.c → t_crl.cc} +0 -0
  617. /data/third_party/boringssl-with-bazel/src/crypto/x509/{t_req.c → t_req.cc} +0 -0
  618. /data/third_party/boringssl-with-bazel/src/crypto/x509/{t_x509.c → t_x509.cc} +0 -0
  619. /data/third_party/boringssl-with-bazel/src/crypto/x509/{t_x509a.c → t_x509a.cc} +0 -0
  620. /data/third_party/boringssl-with-bazel/src/crypto/x509/{v3_akeya.c → v3_akeya.cc} +0 -0
  621. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509.c → x509.cc} +0 -0
  622. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_cmp.c → x509_cmp.cc} +0 -0
  623. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_d2.c → x509_d2.cc} +0 -0
  624. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_def.c → x509_def.cc} +0 -0
  625. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_ext.c → x509_ext.cc} +0 -0
  626. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_obj.c → x509_obj.cc} +0 -0
  627. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_req.c → x509_req.cc} +0 -0
  628. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_set.c → x509_set.cc} +0 -0
  629. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_trs.c → x509_trs.cc} +0 -0
  630. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509_txt.c → x509_txt.cc} +0 -0
  631. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509cset.c → x509cset.cc} +0 -0
  632. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509name.c → x509name.cc} +0 -0
  633. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x509rset.c → x509rset.cc} +0 -0
  634. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_algor.c → x_algor.cc} +0 -0
  635. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_attrib.c → x_attrib.cc} +0 -0
  636. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_exten.c → x_exten.cc} +0 -0
  637. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_req.c → x_req.cc} +0 -0
  638. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_sig.c → x_sig.cc} +0 -0
  639. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_spki.c → x_spki.cc} +0 -0
  640. /data/third_party/boringssl-with-bazel/src/crypto/x509/{x_val.c → x_val.cc} +0 -0
@@ -1,4 +1,4 @@
1
- /* Copyright (c) 2024, Google LLC
1
+ /* Copyright 2024 The BoringSSL Authors
2
2
  *
3
3
  * Permission to use, copy, modify, and/or distribute this software for any
4
4
  * purpose with or without fee is hereby granted, provided that the above
@@ -14,6 +14,8 @@
14
14
 
15
15
  #include <openssl/mldsa.h>
16
16
 
17
+ #include <memory>
18
+
17
19
  #include <assert.h>
18
20
  #include <stdlib.h>
19
21
 
@@ -25,49 +27,121 @@
25
27
  #include "../keccak/internal.h"
26
28
  #include "./internal.h"
27
29
 
28
- #define DEGREE 256
29
- #define K 6
30
- #define L 5
31
- #define ETA 4
32
- #define TAU 49
33
- #define BETA 196
34
- #define OMEGA 55
35
-
36
- #define RHO_BYTES 32
37
- #define SIGMA_BYTES 64
38
- #define K_BYTES 32
39
- #define TR_BYTES 64
40
- #define MU_BYTES 64
41
- #define RHO_PRIME_BYTES 64
42
- #define LAMBDA_BITS 192
43
- #define LAMBDA_BYTES (LAMBDA_BITS / 8)
30
+ namespace {
31
+
32
+ constexpr int kDegree = 256;
33
+ constexpr int kRhoBytes = 32;
34
+ constexpr int kSigmaBytes = 64;
35
+ constexpr int kKBytes = 32;
36
+ constexpr int kTrBytes = 64;
37
+ constexpr int kMuBytes = 64;
38
+ constexpr int kRhoPrimeBytes = 64;
44
39
 
45
40
  // 2^23 - 2^13 + 1
46
- static const uint32_t kPrime = 8380417;
41
+ constexpr uint32_t kPrime = 8380417;
47
42
  // Inverse of -kPrime modulo 2^32
48
- static const uint32_t kPrimeNegInverse = 4236238847;
49
- static const int kDroppedBits = 13;
50
- static const uint32_t kHalfPrime = (8380417 - 1) / 2;
51
- static const uint32_t kGamma1 = 1 << 19;
52
- static const uint32_t kGamma2 = (8380417 - 1) / 32;
43
+ constexpr uint32_t kPrimeNegInverse = 4236238847;
44
+ constexpr int kDroppedBits = 13;
45
+ constexpr uint32_t kHalfPrime = (kPrime - 1) / 2;
46
+ constexpr uint32_t kGamma2 = (kPrime - 1) / 32;
53
47
  // 256^-1 mod kPrime, in Montgomery form.
54
- static const uint32_t kInverseDegreeMontgomery = 41978;
48
+ constexpr uint32_t kInverseDegreeMontgomery = 41978;
49
+
50
+ // Constants that vary depending on ML-DSA size.
51
+ //
52
+ // These are implemented as templates which take the K parameter to distinguish
53
+ // the ML-DSA sizes. (At the time of writing, `if constexpr` was not available.)
54
+ //
55
+ // TODO(crbug.com/42290600): Switch this to `if constexpr` when C++17 is
56
+ // available.
57
+
58
+ template <int K>
59
+ constexpr size_t public_key_bytes();
60
+
61
+ template <>
62
+ constexpr size_t public_key_bytes<6>() {
63
+ return MLDSA65_PUBLIC_KEY_BYTES;
64
+ }
65
+
66
+ template <int K>
67
+ constexpr size_t signature_bytes();
68
+
69
+ template <>
70
+ constexpr size_t signature_bytes<6>() {
71
+ return MLDSA65_SIGNATURE_BYTES;
72
+ }
73
+
74
+ template <int K>
75
+ constexpr int tau();
76
+
77
+ template <>
78
+ constexpr int tau<6>() {
79
+ return 49;
80
+ }
81
+
82
+ template <int K>
83
+ constexpr int lambda_bytes();
84
+
85
+ template <>
86
+ constexpr int lambda_bytes<6>() {
87
+ return 192 / 8;
88
+ }
89
+
90
+ template <int K>
91
+ constexpr int gamma1();
92
+
93
+ template <>
94
+ constexpr int gamma1<6>() {
95
+ return 1 << 19;
96
+ }
97
+
98
+ template <int K>
99
+ constexpr int beta();
100
+
101
+ template <>
102
+ constexpr int beta<6>() {
103
+ return 196;
104
+ }
105
+
106
+ template <int K>
107
+ constexpr int omega();
108
+
109
+ template <>
110
+ constexpr int omega<6>() {
111
+ return 55;
112
+ }
113
+
114
+ template <int K>
115
+ constexpr int eta();
116
+
117
+ template <>
118
+ constexpr int eta<6>() {
119
+ return 4;
120
+ }
121
+
122
+ template <int K>
123
+ constexpr int plus_minus_eta_bitlen();
124
+
125
+ template <>
126
+ constexpr int plus_minus_eta_bitlen<6>() {
127
+ return 4;
128
+ }
129
+
130
+ // Fundamental types.
55
131
 
56
132
  typedef struct scalar {
57
- uint32_t c[DEGREE];
133
+ uint32_t c[kDegree];
58
134
  } scalar;
59
135
 
60
- typedef struct vectork {
136
+ template <int K>
137
+ struct vector {
61
138
  scalar v[K];
62
- } vectork;
63
-
64
- typedef struct vectorl {
65
- scalar v[L];
66
- } vectorl;
139
+ };
67
140
 
68
- typedef struct matrix {
141
+ template <int K, int L>
142
+ struct matrix {
69
143
  scalar v[K][L];
70
- } matrix;
144
+ };
71
145
 
72
146
  /* Arithmetic */
73
147
 
@@ -173,13 +247,13 @@ static uint32_t mod_sub(uint32_t a, uint32_t b) {
173
247
  }
174
248
 
175
249
  static void scalar_add(scalar *out, const scalar *lhs, const scalar *rhs) {
176
- for (int i = 0; i < DEGREE; i++) {
250
+ for (int i = 0; i < kDegree; i++) {
177
251
  out->c[i] = reduce_once(lhs->c[i] + rhs->c[i]);
178
252
  }
179
253
  }
180
254
 
181
255
  static void scalar_sub(scalar *out, const scalar *lhs, const scalar *rhs) {
182
- for (int i = 0; i < DEGREE; i++) {
256
+ for (int i = 0; i < kDegree; i++) {
183
257
  out->c[i] = mod_sub(lhs->c[i], rhs->c[i]);
184
258
  }
185
259
  }
@@ -195,7 +269,7 @@ static uint32_t reduce_montgomery(uint64_t x) {
195
269
 
196
270
  // Multiply two scalars in the number theoretically transformed state.
197
271
  static void scalar_mult(scalar *out, const scalar *lhs, const scalar *rhs) {
198
- for (int i = 0; i < DEGREE; i++) {
272
+ for (int i = 0; i < kDegree; i++) {
199
273
  out->c[i] = reduce_montgomery((uint64_t)lhs->c[i] * (uint64_t)rhs->c[i]);
200
274
  }
201
275
  }
@@ -206,8 +280,8 @@ static void scalar_mult(scalar *out, const scalar *lhs, const scalar *rhs) {
206
280
  static void scalar_ntt(scalar *s) {
207
281
  // Step: 1, 2, 4, 8, ..., 128
208
282
  // Offset: 128, 64, 32, 16, ..., 1
209
- int offset = DEGREE;
210
- for (int step = 1; step < DEGREE; step <<= 1) {
283
+ int offset = kDegree;
284
+ for (int step = 1; step < kDegree; step <<= 1) {
211
285
  offset >>= 1;
212
286
  int k = 0;
213
287
  for (int i = 0; i < step; i++) {
@@ -234,8 +308,8 @@ static void scalar_ntt(scalar *s) {
234
308
  static void scalar_inverse_ntt(scalar *s) {
235
309
  // Step: 128, 64, 32, 16, ..., 1
236
310
  // Offset: 1, 2, 4, 8, ..., 128
237
- int step = DEGREE;
238
- for (int offset = 1; offset < DEGREE; offset <<= 1) {
311
+ int step = kDegree;
312
+ for (int offset = 1; offset < kDegree; offset <<= 1) {
239
313
  step >>= 1;
240
314
  int k = 0;
241
315
  for (int i = 0; i < step; i++) {
@@ -258,72 +332,59 @@ static void scalar_inverse_ntt(scalar *s) {
258
332
  k += 2 * offset;
259
333
  }
260
334
  }
261
- for (int i = 0; i < DEGREE; i++) {
335
+ for (int i = 0; i < kDegree; i++) {
262
336
  s->c[i] = reduce_montgomery((uint64_t)s->c[i] *
263
337
  (uint64_t)kInverseDegreeMontgomery);
264
338
  }
265
339
  }
266
340
 
267
- static void vectork_zero(vectork *out) { OPENSSL_memset(out, 0, sizeof(*out)); }
341
+ template <int X>
342
+ static void vector_zero(vector<X> *out) {
343
+ OPENSSL_memset(out, 0, sizeof(*out));
344
+ }
268
345
 
269
- static void vectork_add(vectork *out, const vectork *lhs, const vectork *rhs) {
270
- for (int i = 0; i < K; i++) {
346
+ template <int X>
347
+ static void vector_add(vector<X> *out, const vector<X> *lhs,
348
+ const vector<X> *rhs) {
349
+ for (int i = 0; i < X; i++) {
271
350
  scalar_add(&out->v[i], &lhs->v[i], &rhs->v[i]);
272
351
  }
273
352
  }
274
353
 
275
- static void vectork_sub(vectork *out, const vectork *lhs, const vectork *rhs) {
276
- for (int i = 0; i < K; i++) {
354
+ template <int X>
355
+ static void vector_sub(vector<X> *out, const vector<X> *lhs,
356
+ const vector<X> *rhs) {
357
+ for (int i = 0; i < X; i++) {
277
358
  scalar_sub(&out->v[i], &lhs->v[i], &rhs->v[i]);
278
359
  }
279
360
  }
280
361
 
281
- static void vectork_mult_scalar(vectork *out, const vectork *lhs,
282
- const scalar *rhs) {
283
- for (int i = 0; i < K; i++) {
362
+ template <int X>
363
+ static void vector_mult_scalar(vector<X> *out, const vector<X> *lhs,
364
+ const scalar *rhs) {
365
+ for (int i = 0; i < X; i++) {
284
366
  scalar_mult(&out->v[i], &lhs->v[i], rhs);
285
367
  }
286
368
  }
287
369
 
288
- static void vectork_ntt(vectork *a) {
289
- for (int i = 0; i < K; i++) {
370
+ template <int X>
371
+ static void vector_ntt(vector<X> *a) {
372
+ for (int i = 0; i < X; i++) {
290
373
  scalar_ntt(&a->v[i]);
291
374
  }
292
375
  }
293
376
 
294
- static void vectork_inverse_ntt(vectork *a) {
295
- for (int i = 0; i < K; i++) {
377
+ template <int X>
378
+ static void vector_inverse_ntt(vector<X> *a) {
379
+ for (int i = 0; i < X; i++) {
296
380
  scalar_inverse_ntt(&a->v[i]);
297
381
  }
298
382
  }
299
383
 
300
- static void vectorl_add(vectorl *out, const vectorl *lhs, const vectorl *rhs) {
301
- for (int i = 0; i < L; i++) {
302
- scalar_add(&out->v[i], &lhs->v[i], &rhs->v[i]);
303
- }
304
- }
305
-
306
- static void vectorl_mult_scalar(vectorl *out, const vectorl *lhs,
307
- const scalar *rhs) {
308
- for (int i = 0; i < L; i++) {
309
- scalar_mult(&out->v[i], &lhs->v[i], rhs);
310
- }
311
- }
312
-
313
- static void vectorl_ntt(vectorl *a) {
314
- for (int i = 0; i < L; i++) {
315
- scalar_ntt(&a->v[i]);
316
- }
317
- }
318
-
319
- static void vectorl_inverse_ntt(vectorl *a) {
320
- for (int i = 0; i < L; i++) {
321
- scalar_inverse_ntt(&a->v[i]);
322
- }
323
- }
324
-
325
- static void matrix_mult(vectork *out, const matrix *m, const vectorl *a) {
326
- vectork_zero(out);
384
+ template <int K, int L>
385
+ static void matrix_mult(vector<K> *out, const matrix<K, L> *m,
386
+ const vector<L> *a) {
387
+ vector_zero(out);
327
388
  for (int i = 0; i < K; i++) {
328
389
  for (int j = 0; j < L; j++) {
329
390
  scalar product;
@@ -435,38 +496,38 @@ static uint32_t use_hint_vartime(uint32_t h, uint32_t r) {
435
496
  }
436
497
 
437
498
  static void scalar_power2_round(scalar *s1, scalar *s0, const scalar *s) {
438
- for (int i = 0; i < DEGREE; i++) {
499
+ for (int i = 0; i < kDegree; i++) {
439
500
  power2_round(&s1->c[i], &s0->c[i], s->c[i]);
440
501
  }
441
502
  }
442
503
 
443
504
  static void scalar_scale_power2_round(scalar *out, const scalar *in) {
444
- for (int i = 0; i < DEGREE; i++) {
505
+ for (int i = 0; i < kDegree; i++) {
445
506
  scale_power2_round(&out->c[i], in->c[i]);
446
507
  }
447
508
  }
448
509
 
449
510
  static void scalar_high_bits(scalar *out, const scalar *in) {
450
- for (int i = 0; i < DEGREE; i++) {
511
+ for (int i = 0; i < kDegree; i++) {
451
512
  out->c[i] = high_bits(in->c[i]);
452
513
  }
453
514
  }
454
515
 
455
516
  static void scalar_low_bits(scalar *out, const scalar *in) {
456
- for (int i = 0; i < DEGREE; i++) {
517
+ for (int i = 0; i < kDegree; i++) {
457
518
  out->c[i] = low_bits(in->c[i]);
458
519
  }
459
520
  }
460
521
 
461
522
  static void scalar_max(uint32_t *max, const scalar *s) {
462
- for (int i = 0; i < DEGREE; i++) {
523
+ for (int i = 0; i < kDegree; i++) {
463
524
  uint32_t abs = abs_mod_prime(s->c[i]);
464
525
  *max = maximum(*max, abs);
465
526
  }
466
527
  }
467
528
 
468
529
  static void scalar_max_signed(uint32_t *max, const scalar *s) {
469
- for (int i = 0; i < DEGREE; i++) {
530
+ for (int i = 0; i < kDegree; i++) {
470
531
  uint32_t abs = abs_signed(s->c[i]);
471
532
  *max = maximum(*max, abs);
472
533
  }
@@ -474,98 +535,100 @@ static void scalar_max_signed(uint32_t *max, const scalar *s) {
474
535
 
475
536
  static void scalar_make_hint(scalar *out, const scalar *ct0, const scalar *cs2,
476
537
  const scalar *w) {
477
- for (int i = 0; i < DEGREE; i++) {
538
+ for (int i = 0; i < kDegree; i++) {
478
539
  out->c[i] = make_hint(ct0->c[i], cs2->c[i], w->c[i]);
479
540
  }
480
541
  }
481
542
 
482
543
  static void scalar_use_hint_vartime(scalar *out, const scalar *h,
483
544
  const scalar *r) {
484
- for (int i = 0; i < DEGREE; i++) {
545
+ for (int i = 0; i < kDegree; i++) {
485
546
  out->c[i] = use_hint_vartime(h->c[i], r->c[i]);
486
547
  }
487
548
  }
488
549
 
489
- static void vectork_power2_round(vectork *t1, vectork *t0, const vectork *t) {
490
- for (int i = 0; i < K; i++) {
550
+ template <int X>
551
+ static void vector_power2_round(vector<X> *t1, vector<X> *t0,
552
+ const vector<X> *t) {
553
+ for (int i = 0; i < X; i++) {
491
554
  scalar_power2_round(&t1->v[i], &t0->v[i], &t->v[i]);
492
555
  }
493
556
  }
494
557
 
495
- static void vectork_scale_power2_round(vectork *out, const vectork *in) {
496
- for (int i = 0; i < K; i++) {
558
+ template <int X>
559
+ static void vector_scale_power2_round(vector<X> *out, const vector<X> *in) {
560
+ for (int i = 0; i < X; i++) {
497
561
  scalar_scale_power2_round(&out->v[i], &in->v[i]);
498
562
  }
499
563
  }
500
564
 
501
- static void vectork_high_bits(vectork *out, const vectork *in) {
502
- for (int i = 0; i < K; i++) {
565
+ template <int X>
566
+ static void vector_high_bits(vector<X> *out, const vector<X> *in) {
567
+ for (int i = 0; i < X; i++) {
503
568
  scalar_high_bits(&out->v[i], &in->v[i]);
504
569
  }
505
570
  }
506
571
 
507
- static void vectork_low_bits(vectork *out, const vectork *in) {
508
- for (int i = 0; i < K; i++) {
572
+ template <int X>
573
+ static void vector_low_bits(vector<X> *out, const vector<X> *in) {
574
+ for (int i = 0; i < X; i++) {
509
575
  scalar_low_bits(&out->v[i], &in->v[i]);
510
576
  }
511
577
  }
512
578
 
513
- static uint32_t vectork_max(const vectork *a) {
579
+ template <int X>
580
+ static uint32_t vector_max(const vector<X> *a) {
514
581
  uint32_t max = 0;
515
- for (int i = 0; i < K; i++) {
582
+ for (int i = 0; i < X; i++) {
516
583
  scalar_max(&max, &a->v[i]);
517
584
  }
518
585
  return max;
519
586
  }
520
587
 
521
- static uint32_t vectork_max_signed(const vectork *a) {
588
+ template <int X>
589
+ static uint32_t vector_max_signed(const vector<X> *a) {
522
590
  uint32_t max = 0;
523
- for (int i = 0; i < K; i++) {
591
+ for (int i = 0; i < X; i++) {
524
592
  scalar_max_signed(&max, &a->v[i]);
525
593
  }
526
594
  return max;
527
595
  }
528
596
 
529
597
  // The input vector contains only zeroes and ones.
530
- static size_t vectork_count_ones(const vectork *a) {
598
+ template <int X>
599
+ static size_t vector_count_ones(const vector<X> *a) {
531
600
  size_t count = 0;
532
- for (int i = 0; i < K; i++) {
533
- for (int j = 0; j < DEGREE; j++) {
601
+ for (int i = 0; i < X; i++) {
602
+ for (int j = 0; j < kDegree; j++) {
534
603
  count += a->v[i].c[j];
535
604
  }
536
605
  }
537
606
  return count;
538
607
  }
539
608
 
540
- static void vectork_make_hint(vectork *out, const vectork *ct0,
541
- const vectork *cs2, const vectork *w) {
542
- for (int i = 0; i < K; i++) {
609
+ template <int X>
610
+ static void vector_make_hint(vector<X> *out, const vector<X> *ct0,
611
+ const vector<X> *cs2, const vector<X> *w) {
612
+ for (int i = 0; i < X; i++) {
543
613
  scalar_make_hint(&out->v[i], &ct0->v[i], &cs2->v[i], &w->v[i]);
544
614
  }
545
615
  }
546
616
 
547
- static void vectork_use_hint_vartime(vectork *out, const vectork *h,
548
- const vectork *r) {
549
- for (int i = 0; i < K; i++) {
617
+ template <int X>
618
+ static void vector_use_hint_vartime(vector<X> *out, const vector<X> *h,
619
+ const vector<X> *r) {
620
+ for (int i = 0; i < X; i++) {
550
621
  scalar_use_hint_vartime(&out->v[i], &h->v[i], &r->v[i]);
551
622
  }
552
623
  }
553
624
 
554
- static uint32_t vectorl_max(const vectorl *a) {
555
- uint32_t max = 0;
556
- for (int i = 0; i < L; i++) {
557
- scalar_max(&max, &a->v[i]);
558
- }
559
- return max;
560
- }
561
-
562
625
  /* Bit packing */
563
626
 
564
627
  // FIPS 204, Algorithm 16 (`SimpleBitPack`). Specialized to bitlen(b) = 4.
565
628
  static void scalar_encode_4(uint8_t out[128], const scalar *s) {
566
629
  // Every two elements lands on a byte boundary.
567
- static_assert(DEGREE % 2 == 0, "DEGREE must be a multiple of 2");
568
- for (int i = 0; i < DEGREE / 2; i++) {
630
+ static_assert(kDegree % 2 == 0, "kDegree must be a multiple of 2");
631
+ for (int i = 0; i < kDegree / 2; i++) {
569
632
  uint32_t a = s->c[2 * i];
570
633
  uint32_t b = s->c[2 * i + 1];
571
634
  declassify_assert(a < 16);
@@ -577,8 +640,8 @@ static void scalar_encode_4(uint8_t out[128], const scalar *s) {
577
640
  // FIPS 204, Algorithm 16 (`SimpleBitPack`). Specialized to bitlen(b) = 10.
578
641
  static void scalar_encode_10(uint8_t out[320], const scalar *s) {
579
642
  // Every four elements lands on a byte boundary.
580
- static_assert(DEGREE % 4 == 0, "DEGREE must be a multiple of 4");
581
- for (int i = 0; i < DEGREE / 4; i++) {
643
+ static_assert(kDegree % 4 == 0, "kDegree must be a multiple of 4");
644
+ for (int i = 0; i < kDegree / 4; i++) {
582
645
  uint32_t a = s->c[4 * i];
583
646
  uint32_t b = s->c[4 * i + 1];
584
647
  uint32_t c = s->c[4 * i + 2];
@@ -595,14 +658,13 @@ static void scalar_encode_10(uint8_t out[320], const scalar *s) {
595
658
  }
596
659
  }
597
660
 
598
- // FIPS 204, Algorithm 17 (`BitPack`). Specialized to bitlen(b) = 4 and b =
599
- // 2^19.
600
- static void scalar_encode_signed_4_eta(uint8_t out[128], const scalar *s) {
661
+ // FIPS 204, Algorithm 17 (`BitPack`). Specialized to bitlen(b) = 4 and b = 4.
662
+ static void scalar_encode_signed_4_4(uint8_t out[128], const scalar *s) {
601
663
  // Every two elements lands on a byte boundary.
602
- static_assert(DEGREE % 2 == 0, "DEGREE must be a multiple of 2");
603
- for (int i = 0; i < DEGREE / 2; i++) {
604
- uint32_t a = mod_sub(ETA, s->c[2 * i]);
605
- uint32_t b = mod_sub(ETA, s->c[2 * i + 1]);
664
+ static_assert(kDegree % 2 == 0, "kDegree must be a multiple of 2");
665
+ for (int i = 0; i < kDegree / 2; i++) {
666
+ uint32_t a = mod_sub(4, s->c[2 * i]);
667
+ uint32_t b = mod_sub(4, s->c[2 * i + 1]);
606
668
  declassify_assert(a < 16);
607
669
  declassify_assert(b < 16);
608
670
  out[i] = a | (b << 4);
@@ -614,8 +676,8 @@ static void scalar_encode_signed_4_eta(uint8_t out[128], const scalar *s) {
614
676
  static void scalar_encode_signed_13_12(uint8_t out[416], const scalar *s) {
615
677
  static const uint32_t kMax = 1u << 12;
616
678
  // Every two elements lands on a byte boundary.
617
- static_assert(DEGREE % 8 == 0, "DEGREE must be a multiple of 8");
618
- for (int i = 0; i < DEGREE / 8; i++) {
679
+ static_assert(kDegree % 8 == 0, "kDegree must be a multiple of 8");
680
+ for (int i = 0; i < kDegree / 8; i++) {
619
681
  uint32_t a = mod_sub(kMax, s->c[8 * i]);
620
682
  uint32_t b = mod_sub(kMax, s->c[8 * i + 1]);
621
683
  uint32_t c = mod_sub(kMax, s->c[8 * i + 2]);
@@ -654,8 +716,8 @@ static void scalar_encode_signed_13_12(uint8_t out[416], const scalar *s) {
654
716
  static void scalar_encode_signed_20_19(uint8_t out[640], const scalar *s) {
655
717
  static const uint32_t kMax = 1u << 19;
656
718
  // Every two elements lands on a byte boundary.
657
- static_assert(DEGREE % 4 == 0, "DEGREE must be a multiple of 4");
658
- for (int i = 0; i < DEGREE / 4; i++) {
719
+ static_assert(kDegree % 4 == 0, "kDegree must be a multiple of 4");
720
+ for (int i = 0; i < kDegree / 4; i++) {
659
721
  uint32_t a = mod_sub(kMax, s->c[4 * i]);
660
722
  uint32_t b = mod_sub(kMax, s->c[4 * i + 1]);
661
723
  uint32_t c = mod_sub(kMax, s->c[4 * i + 2]);
@@ -679,8 +741,8 @@ static void scalar_encode_signed_20_19(uint8_t out[640], const scalar *s) {
679
741
  static void scalar_encode_signed(uint8_t *out, const scalar *s, int bits,
680
742
  uint32_t max) {
681
743
  if (bits == 4) {
682
- assert(max == ETA);
683
- scalar_encode_signed_4_eta(out, s);
744
+ assert(max == 4);
745
+ scalar_encode_signed_4_4(out, s);
684
746
  } else if (bits == 20) {
685
747
  assert(max == 1u << 19);
686
748
  scalar_encode_signed_20_19(out, s);
@@ -694,8 +756,8 @@ static void scalar_encode_signed(uint8_t *out, const scalar *s, int bits,
694
756
  // FIPS 204, Algorithm 18 (`SimpleBitUnpack`). Specialized for bitlen(b) == 10.
695
757
  static void scalar_decode_10(scalar *out, const uint8_t in[320]) {
696
758
  uint32_t v;
697
- static_assert(DEGREE % 4 == 0, "DEGREE must be a multiple of 4");
698
- for (int i = 0; i < DEGREE / 4; i++) {
759
+ static_assert(kDegree % 4 == 0, "kDegree must be a multiple of 4");
760
+ for (int i = 0; i < kDegree / 4; i++) {
699
761
  OPENSSL_memcpy(&v, &in[5 * i], sizeof(v));
700
762
  out->c[4 * i] = v & 0x3ff;
701
763
  out->c[4 * i + 1] = (v >> 10) & 0x3ff;
@@ -705,13 +767,12 @@ static void scalar_decode_10(scalar *out, const uint8_t in[320]) {
705
767
  }
706
768
 
707
769
  // FIPS 204, Algorithm 19 (`BitUnpack`). Specialized to bitlen(a+b) = 4 and b =
708
- // eta.
709
- static int scalar_decode_signed_4_eta(scalar *out, const uint8_t in[128]) {
770
+ // 4.
771
+ static int scalar_decode_signed_4_4(scalar *out, const uint8_t in[128]) {
710
772
  uint32_t v;
711
- static_assert(DEGREE % 8 == 0, "DEGREE must be a multiple of 8");
712
- for (int i = 0; i < DEGREE / 8; i++) {
773
+ static_assert(kDegree % 8 == 0, "kDegree must be a multiple of 8");
774
+ for (int i = 0; i < kDegree / 8; i++) {
713
775
  OPENSSL_memcpy(&v, &in[4 * i], sizeof(v));
714
- static_assert(ETA == 4, "ETA must be 4");
715
776
  // None of the nibbles may be >= 9. So if the MSB of any nibble is set, none
716
777
  // of the other bits may be set. First, select all the MSBs.
717
778
  const uint32_t msbs = v & 0x88888888u;
@@ -723,14 +784,14 @@ static int scalar_decode_signed_4_eta(scalar *out, const uint8_t in[128]) {
723
784
  return 0;
724
785
  }
725
786
 
726
- out->c[i * 8] = mod_sub(ETA, v & 15);
727
- out->c[i * 8 + 1] = mod_sub(ETA, (v >> 4) & 15);
728
- out->c[i * 8 + 2] = mod_sub(ETA, (v >> 8) & 15);
729
- out->c[i * 8 + 3] = mod_sub(ETA, (v >> 12) & 15);
730
- out->c[i * 8 + 4] = mod_sub(ETA, (v >> 16) & 15);
731
- out->c[i * 8 + 5] = mod_sub(ETA, (v >> 20) & 15);
732
- out->c[i * 8 + 6] = mod_sub(ETA, (v >> 24) & 15);
733
- out->c[i * 8 + 7] = mod_sub(ETA, v >> 28);
787
+ out->c[i * 8] = mod_sub(4, v & 15);
788
+ out->c[i * 8 + 1] = mod_sub(4, (v >> 4) & 15);
789
+ out->c[i * 8 + 2] = mod_sub(4, (v >> 8) & 15);
790
+ out->c[i * 8 + 3] = mod_sub(4, (v >> 12) & 15);
791
+ out->c[i * 8 + 4] = mod_sub(4, (v >> 16) & 15);
792
+ out->c[i * 8 + 5] = mod_sub(4, (v >> 20) & 15);
793
+ out->c[i * 8 + 6] = mod_sub(4, (v >> 24) & 15);
794
+ out->c[i * 8 + 7] = mod_sub(4, v >> 28);
734
795
  }
735
796
  return 1;
736
797
  }
@@ -744,8 +805,8 @@ static void scalar_decode_signed_13_12(scalar *out, const uint8_t in[416]) {
744
805
 
745
806
  uint32_t a, b, c;
746
807
  uint8_t d;
747
- static_assert(DEGREE % 8 == 0, "DEGREE must be a multiple of 8");
748
- for (int i = 0; i < DEGREE / 8; i++) {
808
+ static_assert(kDegree % 8 == 0, "kDegree must be a multiple of 8");
809
+ for (int i = 0; i < kDegree / 8; i++) {
749
810
  OPENSSL_memcpy(&a, &in[13 * i], sizeof(a));
750
811
  OPENSSL_memcpy(&b, &in[13 * i + 4], sizeof(b));
751
812
  OPENSSL_memcpy(&c, &in[13 * i + 8], sizeof(c));
@@ -772,8 +833,8 @@ static void scalar_decode_signed_20_19(scalar *out, const uint8_t in[640]) {
772
833
 
773
834
  uint32_t a, b;
774
835
  uint16_t c;
775
- static_assert(DEGREE % 4 == 0, "DEGREE must be a multiple of 4");
776
- for (int i = 0; i < DEGREE / 4; i++) {
836
+ static_assert(kDegree % 4 == 0, "kDegree must be a multiple of 4");
837
+ for (int i = 0; i < kDegree / 4; i++) {
777
838
  OPENSSL_memcpy(&a, &in[10 * i], sizeof(a));
778
839
  OPENSSL_memcpy(&b, &in[10 * i + 4], sizeof(b));
779
840
  OPENSSL_memcpy(&c, &in[10 * i + 8], sizeof(c));
@@ -791,8 +852,8 @@ static void scalar_decode_signed_20_19(scalar *out, const uint8_t in[640]) {
791
852
  static int scalar_decode_signed(scalar *out, const uint8_t *in, int bits,
792
853
  uint32_t max) {
793
854
  if (bits == 4) {
794
- assert(max == ETA);
795
- return scalar_decode_signed_4_eta(out, in);
855
+ assert(max == 4);
856
+ return scalar_decode_signed_4_4(out, in);
796
857
  } else if (bits == 13) {
797
858
  assert(max == (1u << 12));
798
859
  scalar_decode_signed_13_12(out, in);
@@ -813,19 +874,19 @@ static int scalar_decode_signed(scalar *out, const uint8_t *in, int bits,
813
874
  // Rejection samples a Keccak stream to get uniformly distributed elements. This
814
875
  // is used for matrix expansion and only operates on public inputs.
815
876
  static void scalar_from_keccak_vartime(
816
- scalar *out, const uint8_t derived_seed[RHO_BYTES + 2]) {
877
+ scalar *out, const uint8_t derived_seed[kRhoBytes + 2]) {
817
878
  struct BORINGSSL_keccak_st keccak_ctx;
818
879
  BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake128);
819
- BORINGSSL_keccak_absorb(&keccak_ctx, derived_seed, RHO_BYTES + 2);
880
+ BORINGSSL_keccak_absorb(&keccak_ctx, derived_seed, kRhoBytes + 2);
820
881
  assert(keccak_ctx.squeeze_offset == 0);
821
882
  assert(keccak_ctx.rate_bytes == 168);
822
883
  static_assert(168 % 3 == 0, "block and coefficient boundaries do not align");
823
884
 
824
885
  int done = 0;
825
- while (done < DEGREE) {
886
+ while (done < kDegree) {
826
887
  uint8_t block[168];
827
888
  BORINGSSL_keccak_squeeze(&keccak_ctx, block, sizeof(block));
828
- for (size_t i = 0; i < sizeof(block) && done < DEGREE; i += 3) {
889
+ for (size_t i = 0; i < sizeof(block) && done < kDegree; i += 3) {
829
890
  // FIPS 204, Algorithm 14 (`CoeffFromThreeBytes`).
830
891
  uint32_t value = (uint32_t)block[i] | ((uint32_t)block[i + 1] << 8) |
831
892
  (((uint32_t)block[i + 2] & 0x7f) << 16);
@@ -836,22 +897,33 @@ static void scalar_from_keccak_vartime(
836
897
  }
837
898
  }
838
899
 
839
- // FIPS 204, Algorithm 31 (`RejBoundedPoly`).
840
- static void scalar_uniform_eta_4(scalar *out,
841
- const uint8_t derived_seed[SIGMA_BYTES + 2]) {
842
- static_assert(ETA == 4, "This implementation is specialized for ETA == 4");
900
+ template <int ETA>
901
+ static bool coefficient_from_nibble(uint32_t nibble, uint32_t *result);
843
902
 
903
+ template <>
904
+ bool coefficient_from_nibble<4>(uint32_t nibble, uint32_t *result) {
905
+ if (constant_time_declassify_int(nibble < 9)) {
906
+ *result = mod_sub(4, nibble);
907
+ return true;
908
+ }
909
+ return false;
910
+ }
911
+
912
+ // FIPS 204, Algorithm 31 (`RejBoundedPoly`).
913
+ template <int ETA>
914
+ static void scalar_uniform(scalar *out,
915
+ const uint8_t derived_seed[kSigmaBytes + 2]) {
844
916
  struct BORINGSSL_keccak_st keccak_ctx;
845
917
  BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256);
846
- BORINGSSL_keccak_absorb(&keccak_ctx, derived_seed, SIGMA_BYTES + 2);
918
+ BORINGSSL_keccak_absorb(&keccak_ctx, derived_seed, kSigmaBytes + 2);
847
919
  assert(keccak_ctx.squeeze_offset == 0);
848
920
  assert(keccak_ctx.rate_bytes == 136);
849
921
 
850
922
  int done = 0;
851
- while (done < DEGREE) {
923
+ while (done < kDegree) {
852
924
  uint8_t block[136];
853
925
  BORINGSSL_keccak_squeeze(&keccak_ctx, block, sizeof(block));
854
- for (size_t i = 0; i < sizeof(block) && done < DEGREE; ++i) {
926
+ for (size_t i = 0; i < sizeof(block) && done < kDegree; ++i) {
855
927
  uint32_t t0 = block[i] & 0x0F;
856
928
  uint32_t t1 = block[i] >> 4;
857
929
  // FIPS 204, Algorithm 15 (`CoefFromHalfByte`). Although both the input
@@ -859,21 +931,22 @@ static void scalar_uniform_eta_4(scalar *out,
859
931
  // Individual bytes of the SHAKE-256 stream are (indistiguishable from)
860
932
  // independent of each other and the original seed, so leaking information
861
933
  // about the rejected bytes does not reveal the input or output.
862
- if (constant_time_declassify_int(t0 < 9)) {
863
- out->c[done++] = mod_sub(ETA, t0);
934
+ uint32_t v;
935
+ if (coefficient_from_nibble<ETA>(t0, &v)) {
936
+ out->c[done++] = v;
864
937
  }
865
- if (done < DEGREE && constant_time_declassify_int(t1 < 9)) {
866
- out->c[done++] = mod_sub(ETA, t1);
938
+ if (done < kDegree && coefficient_from_nibble<ETA>(t1, &v)) {
939
+ out->c[done++] = v;
867
940
  }
868
941
  }
869
942
  }
870
943
  }
871
944
 
872
945
  // FIPS 204, Algorithm 34 (`ExpandMask`), but just a single step.
873
- static void scalar_sample_mask(
874
- scalar *out, const uint8_t derived_seed[RHO_PRIME_BYTES + 2]) {
946
+ static void scalar_sample_mask(scalar *out,
947
+ const uint8_t derived_seed[kRhoPrimeBytes + 2]) {
875
948
  uint8_t buf[640];
876
- BORINGSSL_keccak(buf, sizeof(buf), derived_seed, RHO_PRIME_BYTES + 2,
949
+ BORINGSSL_keccak(buf, sizeof(buf), derived_seed, kRhoPrimeBytes + 2,
877
950
  boringssl_shake256);
878
951
 
879
952
  scalar_decode_signed_20_19(out, buf);
@@ -881,9 +954,7 @@ static void scalar_sample_mask(
881
954
 
882
955
  // FIPS 204, Algorithm 29 (`SampleInBall`).
883
956
  static void scalar_sample_in_ball_vartime(scalar *out, const uint8_t *seed,
884
- int len) {
885
- assert(len == 2 * LAMBDA_BYTES);
886
-
957
+ int len, int tau) {
887
958
  struct BORINGSSL_keccak_st keccak_ctx;
888
959
  BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256);
889
960
  BORINGSSL_keccak_absorb(&keccak_ctx, seed, len);
@@ -902,7 +973,7 @@ static void scalar_sample_in_ball_vartime(scalar *out, const uint8_t *seed,
902
973
  CONSTTIME_DECLASSIFY(block + offset, sizeof(block) - offset);
903
974
 
904
975
  OPENSSL_memset(out, 0, sizeof(*out));
905
- for (size_t i = DEGREE - TAU; i < DEGREE; i++) {
976
+ for (size_t i = kDegree - tau; i < kDegree; i++) {
906
977
  size_t byte;
907
978
  for (;;) {
908
979
  if (offset == 136) {
@@ -925,54 +996,57 @@ static void scalar_sample_in_ball_vartime(scalar *out, const uint8_t *seed,
925
996
  }
926
997
 
927
998
  // FIPS 204, Algorithm 32 (`ExpandA`).
928
- static void matrix_expand(matrix *out, const uint8_t rho[RHO_BYTES]) {
999
+ template <int K, int L>
1000
+ static void matrix_expand(matrix<K, L> *out, const uint8_t rho[kRhoBytes]) {
929
1001
  static_assert(K <= 0x100, "K must fit in 8 bits");
930
1002
  static_assert(L <= 0x100, "L must fit in 8 bits");
931
1003
 
932
- uint8_t derived_seed[RHO_BYTES + 2];
933
- OPENSSL_memcpy(derived_seed, rho, RHO_BYTES);
1004
+ uint8_t derived_seed[kRhoBytes + 2];
1005
+ OPENSSL_memcpy(derived_seed, rho, kRhoBytes);
934
1006
  for (int i = 0; i < K; i++) {
935
1007
  for (int j = 0; j < L; j++) {
936
- derived_seed[RHO_BYTES + 1] = (uint8_t)i;
937
- derived_seed[RHO_BYTES] = (uint8_t)j;
1008
+ derived_seed[kRhoBytes + 1] = (uint8_t)i;
1009
+ derived_seed[kRhoBytes] = (uint8_t)j;
938
1010
  scalar_from_keccak_vartime(&out->v[i][j], derived_seed);
939
1011
  }
940
1012
  }
941
1013
  }
942
1014
 
943
1015
  // FIPS 204, Algorithm 33 (`ExpandS`).
944
- static void vector_expand_short(vectorl *s1, vectork *s2,
945
- const uint8_t sigma[SIGMA_BYTES]) {
1016
+ template <int K, int L>
1017
+ static void vector_expand_short(vector<L> *s1, vector<K> *s2,
1018
+ const uint8_t sigma[kSigmaBytes]) {
946
1019
  static_assert(K <= 0x100, "K must fit in 8 bits");
947
1020
  static_assert(L <= 0x100, "L must fit in 8 bits");
948
1021
  static_assert(K + L <= 0x100, "K+L must fit in 8 bits");
949
1022
 
950
- uint8_t derived_seed[SIGMA_BYTES + 2];
951
- OPENSSL_memcpy(derived_seed, sigma, SIGMA_BYTES);
952
- derived_seed[SIGMA_BYTES] = 0;
953
- derived_seed[SIGMA_BYTES + 1] = 0;
1023
+ uint8_t derived_seed[kSigmaBytes + 2];
1024
+ OPENSSL_memcpy(derived_seed, sigma, kSigmaBytes);
1025
+ derived_seed[kSigmaBytes] = 0;
1026
+ derived_seed[kSigmaBytes + 1] = 0;
954
1027
  for (int i = 0; i < L; i++) {
955
- scalar_uniform_eta_4(&s1->v[i], derived_seed);
956
- ++derived_seed[SIGMA_BYTES];
1028
+ scalar_uniform<eta<K>()>(&s1->v[i], derived_seed);
1029
+ ++derived_seed[kSigmaBytes];
957
1030
  }
958
1031
  for (int i = 0; i < K; i++) {
959
- scalar_uniform_eta_4(&s2->v[i], derived_seed);
960
- ++derived_seed[SIGMA_BYTES];
1032
+ scalar_uniform<eta<K>()>(&s2->v[i], derived_seed);
1033
+ ++derived_seed[kSigmaBytes];
961
1034
  }
962
1035
  }
963
1036
 
964
1037
  // FIPS 204, Algorithm 34 (`ExpandMask`).
965
- static void vectorl_expand_mask(vectorl *out,
966
- const uint8_t seed[RHO_PRIME_BYTES],
967
- size_t kappa) {
1038
+ template <int L>
1039
+ static void vector_expand_mask(vector<L> *out,
1040
+ const uint8_t seed[kRhoPrimeBytes],
1041
+ size_t kappa) {
968
1042
  assert(kappa + L <= 0x10000);
969
1043
 
970
- uint8_t derived_seed[RHO_PRIME_BYTES + 2];
971
- OPENSSL_memcpy(derived_seed, seed, RHO_PRIME_BYTES);
1044
+ uint8_t derived_seed[kRhoPrimeBytes + 2];
1045
+ OPENSSL_memcpy(derived_seed, seed, kRhoPrimeBytes);
972
1046
  for (int i = 0; i < L; i++) {
973
1047
  size_t index = kappa + i;
974
- derived_seed[RHO_PRIME_BYTES] = index & 0xFF;
975
- derived_seed[RHO_PRIME_BYTES + 1] = (index >> 8) & 0xFF;
1048
+ derived_seed[kRhoPrimeBytes] = index & 0xFF;
1049
+ derived_seed[kRhoPrimeBytes + 1] = (index >> 8) & 0xFF;
976
1050
  scalar_sample_mask(&out->v[i], derived_seed);
977
1051
  }
978
1052
  }
@@ -981,63 +1055,49 @@ static void vectorl_expand_mask(vectorl *out,
981
1055
 
982
1056
  // FIPS 204, Algorithm 16 (`SimpleBitPack`).
983
1057
  //
984
- // Encodes an entire vector into 32*K*|bits| bytes. Note that since 256 (DEGREE)
985
- // is divisible by 8, the individual vector entries will always fill a whole
986
- // number of bytes, so we do not need to worry about bit packing here.
987
- static void vectork_encode(uint8_t *out, const vectork *a, int bits) {
1058
+ // Encodes an entire vector into 32*K*|bits| bytes. Note that since 256
1059
+ // (kDegree) is divisible by 8, the individual vector entries will always fill a
1060
+ // whole number of bytes, so we do not need to worry about bit packing here.
1061
+ template <int K>
1062
+ static void vector_encode(uint8_t *out, const vector<K> *a, int bits) {
988
1063
  if (bits == 4) {
989
1064
  for (int i = 0; i < K; i++) {
990
- scalar_encode_4(out + i * bits * DEGREE / 8, &a->v[i]);
1065
+ scalar_encode_4(out + i * bits * kDegree / 8, &a->v[i]);
991
1066
  }
992
1067
  } else {
993
1068
  assert(bits == 10);
994
1069
  for (int i = 0; i < K; i++) {
995
- scalar_encode_10(out + i * bits * DEGREE / 8, &a->v[i]);
1070
+ scalar_encode_10(out + i * bits * kDegree / 8, &a->v[i]);
996
1071
  }
997
1072
  }
998
1073
  }
999
1074
 
1000
1075
  // FIPS 204, Algorithm 18 (`SimpleBitUnpack`).
1001
- static void vectork_decode_10(vectork *out, const uint8_t *in) {
1002
- for (int i = 0; i < K; i++) {
1003
- scalar_decode_10(&out->v[i], in + i * 10 * DEGREE / 8);
1004
- }
1005
- }
1006
-
1007
- static void vectork_encode_signed(uint8_t *out, const vectork *a, int bits,
1008
- uint32_t max) {
1076
+ template <int K>
1077
+ static void vector_decode_10(vector<K> *out, const uint8_t *in) {
1009
1078
  for (int i = 0; i < K; i++) {
1010
- scalar_encode_signed(out + i * bits * DEGREE / 8, &a->v[i], bits, max);
1079
+ scalar_decode_10(&out->v[i], in + i * 10 * kDegree / 8);
1011
1080
  }
1012
1081
  }
1013
1082
 
1014
- static int vectork_decode_signed(vectork *out, const uint8_t *in, int bits,
1015
- uint32_t max) {
1016
- for (int i = 0; i < K; i++) {
1017
- if (!scalar_decode_signed(&out->v[i], in + i * bits * DEGREE / 8, bits,
1018
- max)) {
1019
- return 0;
1020
- }
1021
- }
1022
- return 1;
1023
- }
1024
-
1025
1083
  // FIPS 204, Algorithm 17 (`BitPack`).
1026
1084
  //
1027
- // Encodes an entire vector into 32*L*|bits| bytes. Note that since 256 (DEGREE)
1028
- // is divisible by 8, the individual vector entries will always fill a whole
1029
- // number of bytes, so we do not need to worry about bit packing here.
1030
- static void vectorl_encode_signed(uint8_t *out, const vectorl *a, int bits,
1031
- uint32_t max) {
1032
- for (int i = 0; i < L; i++) {
1033
- scalar_encode_signed(out + i * bits * DEGREE / 8, &a->v[i], bits, max);
1085
+ // Encodes an entire vector into 32*L*|bits| bytes. Note that since 256
1086
+ // (kDegree) is divisible by 8, the individual vector entries will always fill a
1087
+ // whole number of bytes, so we do not need to worry about bit packing here.
1088
+ template <int X>
1089
+ static void vector_encode_signed(uint8_t *out, const vector<X> *a, int bits,
1090
+ uint32_t max) {
1091
+ for (int i = 0; i < X; i++) {
1092
+ scalar_encode_signed(out + i * bits * kDegree / 8, &a->v[i], bits, max);
1034
1093
  }
1035
1094
  }
1036
1095
 
1037
- static int vectorl_decode_signed(vectorl *out, const uint8_t *in, int bits,
1038
- uint32_t max) {
1039
- for (int i = 0; i < L; i++) {
1040
- if (!scalar_decode_signed(&out->v[i], in + i * bits * DEGREE / 8, bits,
1096
+ template <int X>
1097
+ static int vector_decode_signed(vector<X> *out, const uint8_t *in, int bits,
1098
+ uint32_t max) {
1099
+ for (int i = 0; i < X; i++) {
1100
+ if (!scalar_decode_signed(&out->v[i], in + i * bits * kDegree / 8, bits,
1041
1101
  max)) {
1042
1102
  return 0;
1043
1103
  }
@@ -1046,33 +1106,36 @@ static int vectorl_decode_signed(vectorl *out, const uint8_t *in, int bits,
1046
1106
  }
1047
1107
 
1048
1108
  // FIPS 204, Algorithm 28 (`w1Encode`).
1049
- static void w1_encode(uint8_t out[128 * K], const vectork *w1) {
1050
- vectork_encode(out, w1, 4);
1109
+ template <int K>
1110
+ static void w1_encode(uint8_t out[128 * K], const vector<K> *w1) {
1111
+ vector_encode(out, w1, 4);
1051
1112
  }
1052
1113
 
1053
1114
  // FIPS 204, Algorithm 20 (`HintBitPack`).
1054
- static void hint_bit_pack(uint8_t out[OMEGA + K], const vectork *h) {
1055
- OPENSSL_memset(out, 0, OMEGA + K);
1115
+ template <int K>
1116
+ static void hint_bit_pack(uint8_t out[omega<K>() + K], const vector<K> *h) {
1117
+ OPENSSL_memset(out, 0, omega<K>() + K);
1056
1118
  int index = 0;
1057
1119
  for (int i = 0; i < K; i++) {
1058
- for (int j = 0; j < DEGREE; j++) {
1120
+ for (int j = 0; j < kDegree; j++) {
1059
1121
  if (h->v[i].c[j]) {
1060
- // h must have at most OMEGA non-zero coefficients.
1061
- BSSL_CHECK(index < OMEGA);
1122
+ // h must have at most omega<K>() non-zero coefficients.
1123
+ BSSL_CHECK(index < omega<K>());
1062
1124
  out[index++] = j;
1063
1125
  }
1064
1126
  }
1065
- out[OMEGA + i] = index;
1127
+ out[omega<K>() + i] = index;
1066
1128
  }
1067
1129
  }
1068
1130
 
1069
1131
  // FIPS 204, Algorithm 21 (`HintBitUnpack`).
1070
- static int hint_bit_unpack(vectork *h, const uint8_t in[OMEGA + K]) {
1071
- vectork_zero(h);
1132
+ template <int K>
1133
+ static int hint_bit_unpack(vector<K> *h, const uint8_t in[omega<K>() + K]) {
1134
+ vector_zero(h);
1072
1135
  int index = 0;
1073
1136
  for (int i = 0; i < K; i++) {
1074
- const int limit = in[OMEGA + i];
1075
- if (limit < index || limit > OMEGA) {
1137
+ const int limit = in[omega<K>() + i];
1138
+ if (limit < index || limit > omega<K>()) {
1076
1139
  return 0;
1077
1140
  }
1078
1141
 
@@ -1083,12 +1146,12 @@ static int hint_bit_unpack(vectork *h, const uint8_t in[OMEGA + K]) {
1083
1146
  return 0;
1084
1147
  }
1085
1148
  last = byte;
1086
- static_assert(DEGREE == 256,
1087
- "DEGREE must be 256 for this write to be in bounds");
1149
+ static_assert(kDegree == 256,
1150
+ "kDegree must be 256 for this write to be in bounds");
1088
1151
  h->v[i].c[byte] = 1;
1089
1152
  }
1090
1153
  }
1091
- for (; index < OMEGA; index++) {
1154
+ for (; index < omega<K>(); index++) {
1092
1155
  if (in[index] != 0) {
1093
1156
  return 0;
1094
1157
  }
@@ -1096,30 +1159,34 @@ static int hint_bit_unpack(vectork *h, const uint8_t in[OMEGA + K]) {
1096
1159
  return 1;
1097
1160
  }
1098
1161
 
1162
+ template <int K>
1099
1163
  struct public_key {
1100
- uint8_t rho[RHO_BYTES];
1101
- vectork t1;
1164
+ uint8_t rho[kRhoBytes];
1165
+ vector<K> t1;
1102
1166
  // Pre-cached value(s).
1103
- uint8_t public_key_hash[TR_BYTES];
1167
+ uint8_t public_key_hash[kTrBytes];
1104
1168
  };
1105
1169
 
1170
+ template <int K, int L>
1106
1171
  struct private_key {
1107
- uint8_t rho[RHO_BYTES];
1108
- uint8_t k[K_BYTES];
1109
- uint8_t public_key_hash[TR_BYTES];
1110
- vectorl s1;
1111
- vectork s2;
1112
- vectork t0;
1172
+ uint8_t rho[kRhoBytes];
1173
+ uint8_t k[kKBytes];
1174
+ uint8_t public_key_hash[kTrBytes];
1175
+ vector<L> s1;
1176
+ vector<K> s2;
1177
+ vector<K> t0;
1113
1178
  };
1114
1179
 
1180
+ template <int K, int L>
1115
1181
  struct signature {
1116
- uint8_t c_tilde[2 * LAMBDA_BYTES];
1117
- vectorl z;
1118
- vectork h;
1182
+ uint8_t c_tilde[2 * lambda_bytes<K>()];
1183
+ vector<L> z;
1184
+ vector<K> h;
1119
1185
  };
1120
1186
 
1121
1187
  // FIPS 204, Algorithm 22 (`pkEncode`).
1122
- static int mldsa_marshal_public_key(CBB *out, const struct public_key *pub) {
1188
+ template <int K>
1189
+ static int mldsa_marshal_public_key(CBB *out, const struct public_key<K> *pub) {
1123
1190
  if (!CBB_add_bytes(out, pub->rho, sizeof(pub->rho))) {
1124
1191
  return 0;
1125
1192
  }
@@ -1128,28 +1195,37 @@ static int mldsa_marshal_public_key(CBB *out, const struct public_key *pub) {
1128
1195
  if (!CBB_add_space(out, &vectork_output, 320 * K)) {
1129
1196
  return 0;
1130
1197
  }
1131
- vectork_encode(vectork_output, &pub->t1, 10);
1198
+ vector_encode(vectork_output, &pub->t1, 10);
1132
1199
 
1133
1200
  return 1;
1134
1201
  }
1135
1202
 
1136
1203
  // FIPS 204, Algorithm 23 (`pkDecode`).
1137
- static int mldsa_parse_public_key(struct public_key *pub, CBS *in) {
1204
+ template <int K>
1205
+ static int mldsa_parse_public_key(struct public_key<K> *pub, CBS *in) {
1206
+ const CBS orig_in = *in;
1207
+
1138
1208
  if (!CBS_copy_bytes(in, pub->rho, sizeof(pub->rho))) {
1139
1209
  return 0;
1140
1210
  }
1141
1211
 
1142
1212
  CBS t1_bytes;
1143
- if (!CBS_get_bytes(in, &t1_bytes, 320 * K)) {
1213
+ if (!CBS_get_bytes(in, &t1_bytes, 320 * K) || CBS_len(in) != 0) {
1144
1214
  return 0;
1145
1215
  }
1146
- vectork_decode_10(&pub->t1, CBS_data(&t1_bytes));
1216
+ vector_decode_10(&pub->t1, CBS_data(&t1_bytes));
1217
+
1218
+ // Compute pre-cached values.
1219
+ BORINGSSL_keccak(pub->public_key_hash, sizeof(pub->public_key_hash),
1220
+ CBS_data(&orig_in), CBS_len(&orig_in), boringssl_shake256);
1147
1221
 
1148
1222
  return 1;
1149
1223
  }
1150
1224
 
1151
1225
  // FIPS 204, Algorithm 24 (`skEncode`).
1152
- static int mldsa_marshal_private_key(CBB *out, const struct private_key *priv) {
1226
+ template <int K, int L>
1227
+ static int mldsa_marshal_private_key(CBB *out,
1228
+ const struct private_key<K, L> *priv) {
1153
1229
  if (!CBB_add_bytes(out, priv->rho, sizeof(priv->rho)) ||
1154
1230
  !CBB_add_bytes(out, priv->k, sizeof(priv->k)) ||
1155
1231
  !CBB_add_bytes(out, priv->public_key_hash,
@@ -1157,42 +1233,52 @@ static int mldsa_marshal_private_key(CBB *out, const struct private_key *priv) {
1157
1233
  return 0;
1158
1234
  }
1159
1235
 
1236
+ constexpr size_t scalar_bytes =
1237
+ (kDegree * plus_minus_eta_bitlen<K>() + 7) / 8;
1160
1238
  uint8_t *vectorl_output;
1161
- if (!CBB_add_space(out, &vectorl_output, 128 * L)) {
1239
+ if (!CBB_add_space(out, &vectorl_output, scalar_bytes * L)) {
1162
1240
  return 0;
1163
1241
  }
1164
- vectorl_encode_signed(vectorl_output, &priv->s1, 4, ETA);
1242
+ vector_encode_signed(vectorl_output, &priv->s1, plus_minus_eta_bitlen<K>(),
1243
+ eta<K>());
1165
1244
 
1166
- uint8_t *vectork_output;
1167
- if (!CBB_add_space(out, &vectork_output, 128 * K)) {
1245
+ uint8_t *s2_output;
1246
+ if (!CBB_add_space(out, &s2_output, scalar_bytes * K)) {
1168
1247
  return 0;
1169
1248
  }
1170
- vectork_encode_signed(vectork_output, &priv->s2, 4, ETA);
1249
+ vector_encode_signed(s2_output, &priv->s2, plus_minus_eta_bitlen<K>(),
1250
+ eta<K>());
1171
1251
 
1172
- if (!CBB_add_space(out, &vectork_output, 416 * K)) {
1252
+ uint8_t *t0_output;
1253
+ if (!CBB_add_space(out, &t0_output, 416 * K)) {
1173
1254
  return 0;
1174
1255
  }
1175
- vectork_encode_signed(vectork_output, &priv->t0, 13, 1 << 12);
1256
+ vector_encode_signed(t0_output, &priv->t0, 13, 1 << 12);
1176
1257
 
1177
1258
  return 1;
1178
1259
  }
1179
1260
 
1180
1261
  // FIPS 204, Algorithm 25 (`skDecode`).
1181
- static int mldsa_parse_private_key(struct private_key *priv, CBS *in) {
1262
+ template <int K, int L>
1263
+ static int mldsa_parse_private_key(struct private_key<K, L> *priv, CBS *in) {
1182
1264
  CBS s1_bytes;
1183
1265
  CBS s2_bytes;
1184
1266
  CBS t0_bytes;
1267
+ constexpr size_t scalar_bytes =
1268
+ (kDegree * plus_minus_eta_bitlen<K>() + 7) / 8;
1185
1269
  if (!CBS_copy_bytes(in, priv->rho, sizeof(priv->rho)) ||
1186
1270
  !CBS_copy_bytes(in, priv->k, sizeof(priv->k)) ||
1187
1271
  !CBS_copy_bytes(in, priv->public_key_hash,
1188
1272
  sizeof(priv->public_key_hash)) ||
1189
- !CBS_get_bytes(in, &s1_bytes, 128 * L) ||
1190
- !vectorl_decode_signed(&priv->s1, CBS_data(&s1_bytes), 4, ETA) ||
1191
- !CBS_get_bytes(in, &s2_bytes, 128 * K) ||
1192
- !vectork_decode_signed(&priv->s2, CBS_data(&s2_bytes), 4, ETA) ||
1273
+ !CBS_get_bytes(in, &s1_bytes, scalar_bytes * L) ||
1274
+ !vector_decode_signed(&priv->s1, CBS_data(&s1_bytes),
1275
+ plus_minus_eta_bitlen<K>(), eta<K>()) ||
1276
+ !CBS_get_bytes(in, &s2_bytes, scalar_bytes * K) ||
1277
+ !vector_decode_signed(&priv->s2, CBS_data(&s2_bytes),
1278
+ plus_minus_eta_bitlen<K>(), eta<K>()) ||
1193
1279
  !CBS_get_bytes(in, &t0_bytes, 416 * K) ||
1194
1280
  // Note: Decoding 13 bits into (-2^12, 2^12] cannot fail.
1195
- !vectork_decode_signed(&priv->t0, CBS_data(&t0_bytes), 13, 1 << 12)) {
1281
+ !vector_decode_signed(&priv->t0, CBS_data(&t0_bytes), 13, 1 << 12)) {
1196
1282
  return 0;
1197
1283
  }
1198
1284
 
@@ -1200,7 +1286,9 @@ static int mldsa_parse_private_key(struct private_key *priv, CBS *in) {
1200
1286
  }
1201
1287
 
1202
1288
  // FIPS 204, Algorithm 26 (`sigEncode`).
1203
- static int mldsa_marshal_signature(CBB *out, const struct signature *sign) {
1289
+ template <int K, int L>
1290
+ static int mldsa_marshal_signature(CBB *out,
1291
+ const struct signature<K, L> *sign) {
1204
1292
  if (!CBB_add_bytes(out, sign->c_tilde, sizeof(sign->c_tilde))) {
1205
1293
  return 0;
1206
1294
  }
@@ -1209,10 +1297,10 @@ static int mldsa_marshal_signature(CBB *out, const struct signature *sign) {
1209
1297
  if (!CBB_add_space(out, &vectorl_output, 640 * L)) {
1210
1298
  return 0;
1211
1299
  }
1212
- vectorl_encode_signed(vectorl_output, &sign->z, 20, 1 << 19);
1300
+ vector_encode_signed(vectorl_output, &sign->z, 20, 1 << 19);
1213
1301
 
1214
1302
  uint8_t *hint_output;
1215
- if (!CBB_add_space(out, &hint_output, OMEGA + K)) {
1303
+ if (!CBB_add_space(out, &hint_output, omega<K>() + K)) {
1216
1304
  return 0;
1217
1305
  }
1218
1306
  hint_bit_pack(hint_output, &sign->h);
@@ -1221,14 +1309,15 @@ static int mldsa_marshal_signature(CBB *out, const struct signature *sign) {
1221
1309
  }
1222
1310
 
1223
1311
  // FIPS 204, Algorithm 27 (`sigDecode`).
1224
- static int mldsa_parse_signature(struct signature *sign, CBS *in) {
1312
+ template <int K, int L>
1313
+ static int mldsa_parse_signature(struct signature<K, L> *sign, CBS *in) {
1225
1314
  CBS z_bytes;
1226
1315
  CBS hint_bytes;
1227
1316
  if (!CBS_copy_bytes(in, sign->c_tilde, sizeof(sign->c_tilde)) ||
1228
1317
  !CBS_get_bytes(in, &z_bytes, 640 * L) ||
1229
1318
  // Note: Decoding 20 bits into (-2^19, 2^19] cannot fail.
1230
- !vectorl_decode_signed(&sign->z, CBS_data(&z_bytes), 20, 1 << 19) ||
1231
- !CBS_get_bytes(in, &hint_bytes, OMEGA + K) ||
1319
+ !vector_decode_signed(&sign->z, CBS_data(&z_bytes), 20, 1 << 19) ||
1320
+ !CBS_get_bytes(in, &hint_bytes, omega<K>() + K) ||
1232
1321
  !hint_bit_unpack(&sign->h, CBS_data(&hint_bytes))) {
1233
1322
  return 0;
1234
1323
  };
@@ -1236,86 +1325,44 @@ static int mldsa_parse_signature(struct signature *sign, CBS *in) {
1236
1325
  return 1;
1237
1326
  }
1238
1327
 
1239
- static struct private_key *private_key_from_external(
1240
- const struct MLDSA65_private_key *external) {
1241
- static_assert(
1242
- sizeof(struct MLDSA65_private_key) == sizeof(struct private_key),
1243
- "Kyber private key size incorrect");
1244
- static_assert(
1245
- alignof(struct MLDSA65_private_key) == alignof(struct private_key),
1246
- "Kyber private key align incorrect");
1247
- return (struct private_key *)external;
1248
- }
1249
-
1250
- static struct public_key *public_key_from_external(
1251
- const struct MLDSA65_public_key *external) {
1252
- static_assert(sizeof(struct MLDSA65_public_key) == sizeof(struct public_key),
1253
- "mldsa public key size incorrect");
1254
- static_assert(
1255
- alignof(struct MLDSA65_public_key) == alignof(struct public_key),
1256
- "mldsa public key align incorrect");
1257
- return (struct public_key *)external;
1258
- }
1259
-
1260
- /* API */
1261
-
1262
- // Calls |MLDSA_generate_key_external_entropy| with random bytes from
1263
- // |RAND_bytes|. Returns 1 on success and 0 on failure.
1264
- int MLDSA65_generate_key(
1265
- uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES],
1266
- uint8_t out_seed[MLDSA_SEED_BYTES],
1267
- struct MLDSA65_private_key *out_private_key) {
1268
- RAND_bytes(out_seed, MLDSA_SEED_BYTES);
1269
- return MLDSA65_generate_key_external_entropy(out_encoded_public_key,
1270
- out_private_key, out_seed);
1271
- }
1272
-
1273
- int MLDSA65_private_key_from_seed(struct MLDSA65_private_key *out_private_key,
1274
- const uint8_t *seed, size_t seed_len) {
1275
- if (seed_len != MLDSA_SEED_BYTES) {
1276
- return 0;
1277
- }
1278
- uint8_t public_key[MLDSA65_PUBLIC_KEY_BYTES];
1279
- return MLDSA65_generate_key_external_entropy(public_key, out_private_key,
1280
- seed);
1281
- }
1328
+ template <typename T>
1329
+ struct DeleterFree {
1330
+ void operator()(T *ptr) { OPENSSL_free(ptr); }
1331
+ };
1282
1332
 
1283
1333
  // FIPS 204, Algorithm 6 (`ML-DSA.KeyGen_internal`). Returns 1 on success and 0
1284
1334
  // on failure.
1285
- int MLDSA65_generate_key_external_entropy(
1286
- uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES],
1287
- struct MLDSA65_private_key *out_private_key,
1288
- const uint8_t entropy[MLDSA_SEED_BYTES]) {
1289
- int ret = 0;
1290
-
1335
+ template <int K, int L>
1336
+ static int mldsa_generate_key_external_entropy(
1337
+ uint8_t out_encoded_public_key[public_key_bytes<K>()],
1338
+ struct private_key<K, L> *priv, const uint8_t entropy[MLDSA_SEED_BYTES]) {
1291
1339
  // Intermediate values, allocated on the heap to allow use when there is a
1292
1340
  // limited amount of stack.
1293
1341
  struct values_st {
1294
- struct public_key pub;
1295
- matrix a_ntt;
1296
- vectorl s1_ntt;
1297
- vectork t;
1342
+ struct public_key<K> pub;
1343
+ matrix<K, L> a_ntt;
1344
+ vector<L> s1_ntt;
1345
+ vector<K> t;
1298
1346
  };
1299
- struct values_st *values = OPENSSL_malloc(sizeof(*values));
1347
+ std::unique_ptr<values_st, DeleterFree<values_st>> values(
1348
+ reinterpret_cast<struct values_st *>(OPENSSL_malloc(sizeof(values_st))));
1300
1349
  if (values == NULL) {
1301
- goto err;
1350
+ return 0;
1302
1351
  }
1303
1352
 
1304
- struct private_key *priv = private_key_from_external(out_private_key);
1305
-
1306
1353
  uint8_t augmented_entropy[MLDSA_SEED_BYTES + 2];
1307
1354
  OPENSSL_memcpy(augmented_entropy, entropy, MLDSA_SEED_BYTES);
1308
1355
  // The k and l parameters are appended to the seed.
1309
1356
  augmented_entropy[MLDSA_SEED_BYTES] = K;
1310
1357
  augmented_entropy[MLDSA_SEED_BYTES + 1] = L;
1311
- uint8_t expanded_seed[RHO_BYTES + SIGMA_BYTES + K_BYTES];
1358
+ uint8_t expanded_seed[kRhoBytes + kSigmaBytes + kKBytes];
1312
1359
  BORINGSSL_keccak(expanded_seed, sizeof(expanded_seed), augmented_entropy,
1313
1360
  sizeof(augmented_entropy), boringssl_shake256);
1314
1361
  const uint8_t *const rho = expanded_seed;
1315
- const uint8_t *const sigma = expanded_seed + RHO_BYTES;
1316
- const uint8_t *const k = expanded_seed + RHO_BYTES + SIGMA_BYTES;
1362
+ const uint8_t *const sigma = expanded_seed + kRhoBytes;
1363
+ const uint8_t *const k = expanded_seed + kRhoBytes + kSigmaBytes;
1317
1364
  // rho is public.
1318
- CONSTTIME_DECLASSIFY(rho, RHO_BYTES);
1365
+ CONSTTIME_DECLASSIFY(rho, kRhoBytes);
1319
1366
  OPENSSL_memcpy(values->pub.rho, rho, sizeof(values->pub.rho));
1320
1367
  OPENSSL_memcpy(priv->rho, rho, sizeof(priv->rho));
1321
1368
  OPENSSL_memcpy(priv->k, k, sizeof(priv->k));
@@ -1324,52 +1371,47 @@ int MLDSA65_generate_key_external_entropy(
1324
1371
  vector_expand_short(&priv->s1, &priv->s2, sigma);
1325
1372
 
1326
1373
  OPENSSL_memcpy(&values->s1_ntt, &priv->s1, sizeof(values->s1_ntt));
1327
- vectorl_ntt(&values->s1_ntt);
1374
+ vector_ntt(&values->s1_ntt);
1328
1375
 
1329
1376
  matrix_mult(&values->t, &values->a_ntt, &values->s1_ntt);
1330
- vectork_inverse_ntt(&values->t);
1331
- vectork_add(&values->t, &values->t, &priv->s2);
1377
+ vector_inverse_ntt(&values->t);
1378
+ vector_add(&values->t, &values->t, &priv->s2);
1332
1379
 
1333
- vectork_power2_round(&values->pub.t1, &priv->t0, &values->t);
1380
+ vector_power2_round(&values->pub.t1, &priv->t0, &values->t);
1334
1381
  // t1 is public.
1335
1382
  CONSTTIME_DECLASSIFY(&values->pub.t1, sizeof(values->pub.t1));
1336
1383
 
1337
1384
  CBB cbb;
1338
- CBB_init_fixed(&cbb, out_encoded_public_key, MLDSA65_PUBLIC_KEY_BYTES);
1385
+ CBB_init_fixed(&cbb, out_encoded_public_key, public_key_bytes<K>());
1339
1386
  if (!mldsa_marshal_public_key(&cbb, &values->pub)) {
1340
- goto err;
1387
+ return 0;
1341
1388
  }
1342
- assert(CBB_len(&cbb) == MLDSA65_PUBLIC_KEY_BYTES);
1389
+ assert(CBB_len(&cbb) == public_key_bytes<K>());
1343
1390
 
1344
1391
  BORINGSSL_keccak(priv->public_key_hash, sizeof(priv->public_key_hash),
1345
- out_encoded_public_key, MLDSA65_PUBLIC_KEY_BYTES,
1392
+ out_encoded_public_key, public_key_bytes<K>(),
1346
1393
  boringssl_shake256);
1347
1394
 
1348
- ret = 1;
1349
- err:
1350
- OPENSSL_free(values);
1351
- return ret;
1395
+ return 1;
1352
1396
  }
1353
1397
 
1354
- int MLDSA65_public_from_private(struct MLDSA65_public_key *out_public_key,
1355
- const struct MLDSA65_private_key *private_key) {
1356
- int ret = 0;
1357
-
1398
+ template <int K, int L>
1399
+ static int mldsa_public_from_private(struct public_key<K> *pub,
1400
+ const struct private_key<K, L> *priv) {
1358
1401
  // Intermediate values, allocated on the heap to allow use when there is a
1359
1402
  // limited amount of stack.
1360
1403
  struct values_st {
1361
- matrix a_ntt;
1362
- vectorl s1_ntt;
1363
- vectork t;
1364
- vectork t0;
1404
+ matrix<K, L> a_ntt;
1405
+ vector<L> s1_ntt;
1406
+ vector<K> t;
1407
+ vector<K> t0;
1365
1408
  };
1366
- struct values_st *values = OPENSSL_malloc(sizeof(*values));
1409
+ std::unique_ptr<values_st, DeleterFree<values_st>> values(
1410
+ reinterpret_cast<struct values_st *>(OPENSSL_malloc(sizeof(values_st))));
1367
1411
  if (values == NULL) {
1368
- goto err;
1412
+ return 0;
1369
1413
  }
1370
1414
 
1371
- const struct private_key *priv = private_key_from_external(private_key);
1372
- struct public_key *pub = public_key_from_external(out_public_key);
1373
1415
 
1374
1416
  OPENSSL_memcpy(pub->rho, priv->rho, sizeof(pub->rho));
1375
1417
  OPENSSL_memcpy(pub->public_key_hash, priv->public_key_hash,
@@ -1378,32 +1420,26 @@ int MLDSA65_public_from_private(struct MLDSA65_public_key *out_public_key,
1378
1420
  matrix_expand(&values->a_ntt, priv->rho);
1379
1421
 
1380
1422
  OPENSSL_memcpy(&values->s1_ntt, &priv->s1, sizeof(values->s1_ntt));
1381
- vectorl_ntt(&values->s1_ntt);
1423
+ vector_ntt(&values->s1_ntt);
1382
1424
 
1383
1425
  matrix_mult(&values->t, &values->a_ntt, &values->s1_ntt);
1384
- vectork_inverse_ntt(&values->t);
1385
- vectork_add(&values->t, &values->t, &priv->s2);
1386
-
1387
- vectork_power2_round(&pub->t1, &values->t0, &values->t);
1426
+ vector_inverse_ntt(&values->t);
1427
+ vector_add(&values->t, &values->t, &priv->s2);
1388
1428
 
1389
- ret = 1;
1390
- err:
1391
- OPENSSL_free(values);
1392
- return ret;
1429
+ vector_power2_round(&pub->t1, &values->t0, &values->t);
1430
+ return 1;
1393
1431
  }
1394
1432
 
1395
- // FIPS 204, Algorithm 7 (`ML-DSA.Sign_internal`). Returns 1 on success and 0 on
1396
- // failure.
1397
- int MLDSA65_sign_internal(
1398
- uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES],
1399
- const struct MLDSA65_private_key *private_key, const uint8_t *msg,
1400
- size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len,
1433
+ // FIPS 204, Algorithm 7 (`ML-DSA.Sign_internal`). Returns 1 on success and 0
1434
+ // on failure.
1435
+ template <int K, int L>
1436
+ static int mldsa_sign_internal(
1437
+ uint8_t out_encoded_signature[signature_bytes<K>()],
1438
+ const struct private_key<K, L> *priv, const uint8_t *msg, size_t msg_len,
1439
+ const uint8_t *context_prefix, size_t context_prefix_len,
1401
1440
  const uint8_t *context, size_t context_len,
1402
1441
  const uint8_t randomizer[MLDSA_SIGNATURE_RANDOMIZER_BYTES]) {
1403
- int ret = 0;
1404
- const struct private_key *priv = private_key_from_external(private_key);
1405
-
1406
- uint8_t mu[MU_BYTES];
1442
+ uint8_t mu[kMuBytes];
1407
1443
  struct BORINGSSL_keccak_st keccak_ctx;
1408
1444
  BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256);
1409
1445
  BORINGSSL_keccak_absorb(&keccak_ctx, priv->public_key_hash,
@@ -1411,82 +1447,83 @@ int MLDSA65_sign_internal(
1411
1447
  BORINGSSL_keccak_absorb(&keccak_ctx, context_prefix, context_prefix_len);
1412
1448
  BORINGSSL_keccak_absorb(&keccak_ctx, context, context_len);
1413
1449
  BORINGSSL_keccak_absorb(&keccak_ctx, msg, msg_len);
1414
- BORINGSSL_keccak_squeeze(&keccak_ctx, mu, MU_BYTES);
1450
+ BORINGSSL_keccak_squeeze(&keccak_ctx, mu, kMuBytes);
1415
1451
 
1416
- uint8_t rho_prime[RHO_PRIME_BYTES];
1452
+ uint8_t rho_prime[kRhoPrimeBytes];
1417
1453
  BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256);
1418
1454
  BORINGSSL_keccak_absorb(&keccak_ctx, priv->k, sizeof(priv->k));
1419
1455
  BORINGSSL_keccak_absorb(&keccak_ctx, randomizer,
1420
1456
  MLDSA_SIGNATURE_RANDOMIZER_BYTES);
1421
- BORINGSSL_keccak_absorb(&keccak_ctx, mu, MU_BYTES);
1422
- BORINGSSL_keccak_squeeze(&keccak_ctx, rho_prime, RHO_PRIME_BYTES);
1457
+ BORINGSSL_keccak_absorb(&keccak_ctx, mu, kMuBytes);
1458
+ BORINGSSL_keccak_squeeze(&keccak_ctx, rho_prime, kRhoPrimeBytes);
1423
1459
 
1424
1460
  // Intermediate values, allocated on the heap to allow use when there is a
1425
1461
  // limited amount of stack.
1426
1462
  struct values_st {
1427
- struct signature sign;
1428
- vectorl s1_ntt;
1429
- vectork s2_ntt;
1430
- vectork t0_ntt;
1431
- matrix a_ntt;
1432
- vectorl y;
1433
- vectork w;
1434
- vectork w1;
1435
- vectorl cs1;
1436
- vectork cs2;
1463
+ struct signature<K, L> sign;
1464
+ vector<L> s1_ntt;
1465
+ vector<K> s2_ntt;
1466
+ vector<K> t0_ntt;
1467
+ matrix<K, L> a_ntt;
1468
+ vector<L> y;
1469
+ vector<K> w;
1470
+ vector<K> w1;
1471
+ vector<L> cs1;
1472
+ vector<K> cs2;
1437
1473
  };
1438
- struct values_st *values = OPENSSL_malloc(sizeof(*values));
1474
+ std::unique_ptr<values_st, DeleterFree<values_st>> values(
1475
+ reinterpret_cast<struct values_st *>(OPENSSL_malloc(sizeof(values_st))));
1439
1476
  if (values == NULL) {
1440
- goto err;
1477
+ return 0;
1441
1478
  }
1442
1479
  OPENSSL_memcpy(&values->s1_ntt, &priv->s1, sizeof(values->s1_ntt));
1443
- vectorl_ntt(&values->s1_ntt);
1480
+ vector_ntt(&values->s1_ntt);
1444
1481
 
1445
1482
  OPENSSL_memcpy(&values->s2_ntt, &priv->s2, sizeof(values->s2_ntt));
1446
- vectork_ntt(&values->s2_ntt);
1483
+ vector_ntt(&values->s2_ntt);
1447
1484
 
1448
1485
  OPENSSL_memcpy(&values->t0_ntt, &priv->t0, sizeof(values->t0_ntt));
1449
- vectork_ntt(&values->t0_ntt);
1486
+ vector_ntt(&values->t0_ntt);
1450
1487
 
1451
1488
  matrix_expand(&values->a_ntt, priv->rho);
1452
1489
 
1453
- // kappa must not exceed 2**16/L = 13107. But the probability of it exceeding
1454
- // even 1000 iterations is vanishingly small.
1490
+ // kappa must not exceed 2**16/L = 13107. But the probability of it
1491
+ // exceeding even 1000 iterations is vanishingly small.
1455
1492
  for (size_t kappa = 0;; kappa += L) {
1456
- vectorl_expand_mask(&values->y, rho_prime, kappa);
1493
+ vector_expand_mask(&values->y, rho_prime, kappa);
1457
1494
 
1458
- vectorl *y_ntt = &values->cs1;
1495
+ vector<L> *y_ntt = &values->cs1;
1459
1496
  OPENSSL_memcpy(y_ntt, &values->y, sizeof(*y_ntt));
1460
- vectorl_ntt(y_ntt);
1497
+ vector_ntt(y_ntt);
1461
1498
 
1462
1499
  matrix_mult(&values->w, &values->a_ntt, y_ntt);
1463
- vectork_inverse_ntt(&values->w);
1500
+ vector_inverse_ntt(&values->w);
1464
1501
 
1465
- vectork_high_bits(&values->w1, &values->w);
1502
+ vector_high_bits(&values->w1, &values->w);
1466
1503
  uint8_t w1_encoded[128 * K];
1467
1504
  w1_encode(w1_encoded, &values->w1);
1468
1505
 
1469
1506
  BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256);
1470
- BORINGSSL_keccak_absorb(&keccak_ctx, mu, MU_BYTES);
1507
+ BORINGSSL_keccak_absorb(&keccak_ctx, mu, kMuBytes);
1471
1508
  BORINGSSL_keccak_absorb(&keccak_ctx, w1_encoded, 128 * K);
1472
1509
  BORINGSSL_keccak_squeeze(&keccak_ctx, values->sign.c_tilde,
1473
- 2 * LAMBDA_BYTES);
1510
+ 2 * lambda_bytes<K>());
1474
1511
 
1475
1512
  scalar c_ntt;
1476
1513
  scalar_sample_in_ball_vartime(&c_ntt, values->sign.c_tilde,
1477
- sizeof(values->sign.c_tilde));
1514
+ sizeof(values->sign.c_tilde), tau<K>());
1478
1515
  scalar_ntt(&c_ntt);
1479
1516
 
1480
- vectorl_mult_scalar(&values->cs1, &values->s1_ntt, &c_ntt);
1481
- vectorl_inverse_ntt(&values->cs1);
1482
- vectork_mult_scalar(&values->cs2, &values->s2_ntt, &c_ntt);
1483
- vectork_inverse_ntt(&values->cs2);
1517
+ vector_mult_scalar(&values->cs1, &values->s1_ntt, &c_ntt);
1518
+ vector_inverse_ntt(&values->cs1);
1519
+ vector_mult_scalar(&values->cs2, &values->s2_ntt, &c_ntt);
1520
+ vector_inverse_ntt(&values->cs2);
1484
1521
 
1485
- vectorl_add(&values->sign.z, &values->y, &values->cs1);
1522
+ vector_add(&values->sign.z, &values->y, &values->cs1);
1486
1523
 
1487
- vectork *r0 = &values->w1;
1488
- vectork_sub(r0, &values->w, &values->cs2);
1489
- vectork_low_bits(r0, r0);
1524
+ vector<K> *r0 = &values->w1;
1525
+ vector_sub(r0, &values->w, &values->cs2);
1526
+ vector_low_bits(r0, r0);
1490
1527
 
1491
1528
  // Leaking the fact that a signature was rejected is fine as the next
1492
1529
  // attempt at a signature will be (indistinguishable from) independent of
@@ -1494,27 +1531,27 @@ int MLDSA65_sign_internal(
1494
1531
  // branches rejected the signature. Section 5.5 of
1495
1532
  // https://pq-crystals.org/dilithium/data/dilithium-specification-round3.pdf
1496
1533
  // describes this leak as OK. Note we leak less than what is described by
1497
- // the paper; we do not reveal which coefficient violated the bound, and we
1498
- // hide which of the |z_max| or |r0_max| bound failed. See also
1534
+ // the paper; we do not reveal which coefficient violated the bound, and
1535
+ // we hide which of the |z_max| or |r0_max| bound failed. See also
1499
1536
  // https://boringssl-review.googlesource.com/c/boringssl/+/67747/comment/2bbab0fa_d241d35a/
1500
- uint32_t z_max = vectorl_max(&values->sign.z);
1501
- uint32_t r0_max = vectork_max_signed(r0);
1537
+ uint32_t z_max = vector_max(&values->sign.z);
1538
+ uint32_t r0_max = vector_max_signed(r0);
1502
1539
  if (constant_time_declassify_w(
1503
- constant_time_ge_w(z_max, kGamma1 - BETA) |
1504
- constant_time_ge_w(r0_max, kGamma2 - BETA))) {
1540
+ constant_time_ge_w(z_max, gamma1<K>() - beta<K>()) |
1541
+ constant_time_ge_w(r0_max, kGamma2 - beta<K>()))) {
1505
1542
  continue;
1506
1543
  }
1507
1544
 
1508
- vectork *ct0 = &values->w1;
1509
- vectork_mult_scalar(ct0, &values->t0_ntt, &c_ntt);
1510
- vectork_inverse_ntt(ct0);
1511
- vectork_make_hint(&values->sign.h, ct0, &values->cs2, &values->w);
1545
+ vector<K> *ct0 = &values->w1;
1546
+ vector_mult_scalar(ct0, &values->t0_ntt, &c_ntt);
1547
+ vector_inverse_ntt(ct0);
1548
+ vector_make_hint(&values->sign.h, ct0, &values->cs2, &values->w);
1512
1549
 
1513
1550
  // See above.
1514
- uint32_t ct0_max = vectork_max(ct0);
1515
- size_t h_ones = vectork_count_ones(&values->sign.h);
1551
+ uint32_t ct0_max = vector_max(ct0);
1552
+ size_t h_ones = vector_count_ones(&values->sign.h);
1516
1553
  if (constant_time_declassify_w(constant_time_ge_w(ct0_max, kGamma2) |
1517
- constant_time_lt_w(OMEGA, h_ones))) {
1554
+ constant_time_lt_w(omega<K>(), h_ones))) {
1518
1555
  continue;
1519
1556
  }
1520
1557
 
@@ -1524,88 +1561,47 @@ int MLDSA65_sign_internal(
1524
1561
  CONSTTIME_DECLASSIFY(&values->sign.h, sizeof(values->sign.h));
1525
1562
 
1526
1563
  CBB cbb;
1527
- CBB_init_fixed(&cbb, out_encoded_signature, MLDSA65_SIGNATURE_BYTES);
1564
+ CBB_init_fixed(&cbb, out_encoded_signature, signature_bytes<K>());
1528
1565
  if (!mldsa_marshal_signature(&cbb, &values->sign)) {
1529
- goto err;
1566
+ return 0;
1530
1567
  }
1531
1568
 
1532
- BSSL_CHECK(CBB_len(&cbb) == MLDSA65_SIGNATURE_BYTES);
1533
- ret = 1;
1534
- break;
1535
- }
1536
-
1537
- err:
1538
- OPENSSL_free(values);
1539
- return ret;
1540
- }
1541
-
1542
- // mldsa signature in randomized mode, filling the random bytes with
1543
- // |RAND_bytes|. Returns 1 on success and 0 on failure.
1544
- int MLDSA65_sign(uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES],
1545
- const struct MLDSA65_private_key *private_key,
1546
- const uint8_t *msg, size_t msg_len, const uint8_t *context,
1547
- size_t context_len) {
1548
- if (context_len > 255) {
1549
- return 0;
1550
- }
1551
-
1552
- uint8_t randomizer[MLDSA_SIGNATURE_RANDOMIZER_BYTES];
1553
- RAND_bytes(randomizer, sizeof(randomizer));
1554
-
1555
- const uint8_t context_prefix[2] = {0, context_len};
1556
- return MLDSA65_sign_internal(out_encoded_signature, private_key, msg, msg_len,
1557
- context_prefix, sizeof(context_prefix), context,
1558
- context_len, randomizer);
1559
- }
1560
-
1561
- // FIPS 204, Algorithm 3 (`ML-DSA.Verify`).
1562
- int MLDSA65_verify(const struct MLDSA65_public_key *public_key,
1563
- const uint8_t *signature, size_t signature_len,
1564
- const uint8_t *msg, size_t msg_len, const uint8_t *context,
1565
- size_t context_len) {
1566
- if (context_len > 255 || signature_len != MLDSA65_SIGNATURE_BYTES) {
1567
- return 0;
1569
+ BSSL_CHECK(CBB_len(&cbb) == signature_bytes<K>());
1570
+ return 1;
1568
1571
  }
1569
-
1570
- const uint8_t context_prefix[2] = {0, context_len};
1571
- return MLDSA65_verify_internal(public_key, signature, msg, msg_len,
1572
- context_prefix, sizeof(context_prefix),
1573
- context, context_len);
1574
1572
  }
1575
1573
 
1576
1574
  // FIPS 204, Algorithm 8 (`ML-DSA.Verify_internal`).
1577
- int MLDSA65_verify_internal(
1578
- const struct MLDSA65_public_key *public_key,
1579
- const uint8_t encoded_signature[MLDSA65_SIGNATURE_BYTES],
1580
- const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix,
1581
- size_t context_prefix_len, const uint8_t *context, size_t context_len) {
1582
- int ret = 0;
1583
-
1575
+ template <int K, int L>
1576
+ static int mldsa_verify_internal(
1577
+ const struct public_key<K> *pub,
1578
+ const uint8_t encoded_signature[signature_bytes<K>()], const uint8_t *msg,
1579
+ size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len,
1580
+ const uint8_t *context, size_t context_len) {
1584
1581
  // Intermediate values, allocated on the heap to allow use when there is a
1585
1582
  // limited amount of stack.
1586
1583
  struct values_st {
1587
- struct signature sign;
1588
- matrix a_ntt;
1589
- vectorl z_ntt;
1590
- vectork az_ntt;
1591
- vectork ct1_ntt;
1584
+ struct signature<K, L> sign;
1585
+ matrix<K, L> a_ntt;
1586
+ vector<L> z_ntt;
1587
+ vector<K> az_ntt;
1588
+ vector<K> ct1_ntt;
1592
1589
  };
1593
- struct values_st *values = OPENSSL_malloc(sizeof(*values));
1590
+ std::unique_ptr<values_st, DeleterFree<values_st>> values(
1591
+ reinterpret_cast<struct values_st *>(OPENSSL_malloc(sizeof(values_st))));
1594
1592
  if (values == NULL) {
1595
- goto err;
1593
+ return 0;
1596
1594
  }
1597
1595
 
1598
- const struct public_key *pub = public_key_from_external(public_key);
1599
-
1600
1596
  CBS cbs;
1601
- CBS_init(&cbs, encoded_signature, MLDSA65_SIGNATURE_BYTES);
1597
+ CBS_init(&cbs, encoded_signature, signature_bytes<K>());
1602
1598
  if (!mldsa_parse_signature(&values->sign, &cbs)) {
1603
- goto err;
1599
+ return 0;
1604
1600
  }
1605
1601
 
1606
1602
  matrix_expand(&values->a_ntt, pub->rho);
1607
1603
 
1608
- uint8_t mu[MU_BYTES];
1604
+ uint8_t mu[kMuBytes];
1609
1605
  struct BORINGSSL_keccak_st keccak_ctx;
1610
1606
  BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256);
1611
1607
  BORINGSSL_keccak_absorb(&keccak_ctx, pub->public_key_hash,
@@ -1613,75 +1609,182 @@ int MLDSA65_verify_internal(
1613
1609
  BORINGSSL_keccak_absorb(&keccak_ctx, context_prefix, context_prefix_len);
1614
1610
  BORINGSSL_keccak_absorb(&keccak_ctx, context, context_len);
1615
1611
  BORINGSSL_keccak_absorb(&keccak_ctx, msg, msg_len);
1616
- BORINGSSL_keccak_squeeze(&keccak_ctx, mu, MU_BYTES);
1612
+ BORINGSSL_keccak_squeeze(&keccak_ctx, mu, kMuBytes);
1617
1613
 
1618
1614
  scalar c_ntt;
1619
1615
  scalar_sample_in_ball_vartime(&c_ntt, values->sign.c_tilde,
1620
- sizeof(values->sign.c_tilde));
1616
+ sizeof(values->sign.c_tilde), tau<K>());
1621
1617
  scalar_ntt(&c_ntt);
1622
1618
 
1623
1619
  OPENSSL_memcpy(&values->z_ntt, &values->sign.z, sizeof(values->z_ntt));
1624
- vectorl_ntt(&values->z_ntt);
1620
+ vector_ntt(&values->z_ntt);
1625
1621
 
1626
1622
  matrix_mult(&values->az_ntt, &values->a_ntt, &values->z_ntt);
1627
1623
 
1628
- vectork_scale_power2_round(&values->ct1_ntt, &pub->t1);
1629
- vectork_ntt(&values->ct1_ntt);
1624
+ vector_scale_power2_round(&values->ct1_ntt, &pub->t1);
1625
+ vector_ntt(&values->ct1_ntt);
1630
1626
 
1631
- vectork_mult_scalar(&values->ct1_ntt, &values->ct1_ntt, &c_ntt);
1627
+ vector_mult_scalar(&values->ct1_ntt, &values->ct1_ntt, &c_ntt);
1632
1628
 
1633
- vectork *const w1 = &values->az_ntt;
1634
- vectork_sub(w1, &values->az_ntt, &values->ct1_ntt);
1635
- vectork_inverse_ntt(w1);
1629
+ vector<K> *const w1 = &values->az_ntt;
1630
+ vector_sub(w1, &values->az_ntt, &values->ct1_ntt);
1631
+ vector_inverse_ntt(w1);
1636
1632
 
1637
- vectork_use_hint_vartime(w1, &values->sign.h, w1);
1633
+ vector_use_hint_vartime(w1, &values->sign.h, w1);
1638
1634
  uint8_t w1_encoded[128 * K];
1639
1635
  w1_encode(w1_encoded, w1);
1640
1636
 
1641
- uint8_t c_tilde[2 * LAMBDA_BYTES];
1637
+ uint8_t c_tilde[2 * lambda_bytes<K>()];
1642
1638
  BORINGSSL_keccak_init(&keccak_ctx, boringssl_shake256);
1643
- BORINGSSL_keccak_absorb(&keccak_ctx, mu, MU_BYTES);
1639
+ BORINGSSL_keccak_absorb(&keccak_ctx, mu, kMuBytes);
1644
1640
  BORINGSSL_keccak_absorb(&keccak_ctx, w1_encoded, 128 * K);
1645
- BORINGSSL_keccak_squeeze(&keccak_ctx, c_tilde, 2 * LAMBDA_BYTES);
1646
-
1647
- uint32_t z_max = vectorl_max(&values->sign.z);
1648
- if (z_max < kGamma1 - BETA &&
1649
- OPENSSL_memcmp(c_tilde, values->sign.c_tilde, 2 * LAMBDA_BYTES) == 0) {
1650
- ret = 1;
1651
- }
1641
+ BORINGSSL_keccak_squeeze(&keccak_ctx, c_tilde, 2 * lambda_bytes<K>());
1652
1642
 
1653
- err:
1654
- OPENSSL_free(values);
1655
- return ret;
1643
+ uint32_t z_max = vector_max(&values->sign.z);
1644
+ return z_max < static_cast<uint32_t>(gamma1<K>() - beta<K>()) &&
1645
+ OPENSSL_memcmp(c_tilde, values->sign.c_tilde, 2 * lambda_bytes<K>()) ==
1646
+ 0;
1656
1647
  }
1657
1648
 
1658
- /* Serialization of keys. */
1649
+ } // namespace
1659
1650
 
1660
- int MLDSA65_marshal_public_key(CBB *out,
1661
- const struct MLDSA65_public_key *public_key) {
1662
- return mldsa_marshal_public_key(out, public_key_from_external(public_key));
1651
+ // ML-DSA-65 specific wrappers.
1652
+
1653
+ static struct private_key<6, 5> *mldsa65_private_key_from_external(
1654
+ const struct MLDSA65_private_key *external) {
1655
+ static_assert(sizeof(struct MLDSA65_private_key) ==
1656
+ sizeof(struct private_key<6, 5>),
1657
+ "MLDSA65 private key size incorrect");
1658
+ static_assert(alignof(struct MLDSA65_private_key) ==
1659
+ alignof(struct private_key<6, 5>),
1660
+ "MLDSA65 private key align incorrect");
1661
+ return (struct private_key<6, 5> *)external;
1662
+ }
1663
+
1664
+ static struct public_key<6> *
1665
+ mldsa65_public_key_from_external(const struct MLDSA65_public_key *external) {
1666
+ static_assert(sizeof(struct MLDSA65_public_key) ==
1667
+ sizeof(struct public_key<6>),
1668
+ "MLDSA65 public key size incorrect");
1669
+ static_assert(alignof(struct MLDSA65_public_key) ==
1670
+ alignof(struct public_key<6>),
1671
+ "MLDSA65 public key align incorrect");
1672
+ return (struct public_key<6> *)external;
1663
1673
  }
1664
1674
 
1665
1675
  int MLDSA65_parse_public_key(struct MLDSA65_public_key *public_key, CBS *in) {
1666
- struct public_key *pub = public_key_from_external(public_key);
1667
- CBS orig_in = *in;
1668
- if (!mldsa_parse_public_key(pub, in) || CBS_len(in) != 0) {
1669
- return 0;
1670
- }
1671
-
1672
- // Compute pre-cached values.
1673
- BORINGSSL_keccak(pub->public_key_hash, sizeof(pub->public_key_hash),
1674
- CBS_data(&orig_in), CBS_len(&orig_in), boringssl_shake256);
1675
- return 1;
1676
+ return mldsa_parse_public_key(mldsa65_public_key_from_external(public_key),
1677
+ in);
1676
1678
  }
1677
1679
 
1678
1680
  int MLDSA65_marshal_private_key(CBB *out,
1679
1681
  const struct MLDSA65_private_key *private_key) {
1680
- return mldsa_marshal_private_key(out, private_key_from_external(private_key));
1682
+ return mldsa_marshal_private_key(
1683
+ out, mldsa65_private_key_from_external(private_key));
1681
1684
  }
1682
1685
 
1683
1686
  int MLDSA65_parse_private_key(struct MLDSA65_private_key *private_key,
1684
1687
  CBS *in) {
1685
- struct private_key *priv = private_key_from_external(private_key);
1686
- return mldsa_parse_private_key(priv, in) && CBS_len(in) == 0;
1688
+ return mldsa_parse_private_key(mldsa65_private_key_from_external(private_key),
1689
+ in) &&
1690
+ CBS_len(in) == 0;
1691
+ }
1692
+
1693
+ // Calls |MLDSA_generate_key_external_entropy| with random bytes from
1694
+ // |RAND_bytes|. Returns 1 on success and 0 on failure.
1695
+ int MLDSA65_generate_key(
1696
+ uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES],
1697
+ uint8_t out_seed[MLDSA_SEED_BYTES],
1698
+ struct MLDSA65_private_key *out_private_key) {
1699
+ RAND_bytes(out_seed, MLDSA_SEED_BYTES);
1700
+ return MLDSA65_generate_key_external_entropy(out_encoded_public_key,
1701
+ out_private_key, out_seed);
1702
+ }
1703
+
1704
+ int MLDSA65_private_key_from_seed(struct MLDSA65_private_key *out_private_key,
1705
+ const uint8_t *seed, size_t seed_len) {
1706
+ if (seed_len != MLDSA_SEED_BYTES) {
1707
+ return 0;
1708
+ }
1709
+ uint8_t public_key[MLDSA65_PUBLIC_KEY_BYTES];
1710
+ return MLDSA65_generate_key_external_entropy(public_key, out_private_key,
1711
+ seed);
1712
+ }
1713
+
1714
+ int MLDSA65_generate_key_external_entropy(
1715
+ uint8_t out_encoded_public_key[MLDSA65_PUBLIC_KEY_BYTES],
1716
+ struct MLDSA65_private_key *out_private_key,
1717
+ const uint8_t entropy[MLDSA_SEED_BYTES]) {
1718
+ return mldsa_generate_key_external_entropy(
1719
+ out_encoded_public_key,
1720
+ mldsa65_private_key_from_external(out_private_key), entropy);
1721
+ }
1722
+
1723
+ int MLDSA65_public_from_private(struct MLDSA65_public_key *out_public_key,
1724
+ const struct MLDSA65_private_key *private_key) {
1725
+ return mldsa_public_from_private(
1726
+ mldsa65_public_key_from_external(out_public_key),
1727
+ mldsa65_private_key_from_external(private_key));
1728
+ }
1729
+
1730
+ int MLDSA65_sign_internal(
1731
+ uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES],
1732
+ const struct MLDSA65_private_key *private_key, const uint8_t *msg,
1733
+ size_t msg_len, const uint8_t *context_prefix, size_t context_prefix_len,
1734
+ const uint8_t *context, size_t context_len,
1735
+ const uint8_t randomizer[MLDSA_SIGNATURE_RANDOMIZER_BYTES]) {
1736
+ return mldsa_sign_internal(out_encoded_signature,
1737
+ mldsa65_private_key_from_external(private_key),
1738
+ msg, msg_len, context_prefix, context_prefix_len,
1739
+ context, context_len, randomizer);
1740
+ }
1741
+
1742
+ // ML-DSA signature in randomized mode, filling the random bytes with
1743
+ // |RAND_bytes|. Returns 1 on success and 0 on failure.
1744
+ int MLDSA65_sign(uint8_t out_encoded_signature[MLDSA65_SIGNATURE_BYTES],
1745
+ const struct MLDSA65_private_key *private_key,
1746
+ const uint8_t *msg, size_t msg_len, const uint8_t *context,
1747
+ size_t context_len) {
1748
+ if (context_len > 255) {
1749
+ return 0;
1750
+ }
1751
+
1752
+ uint8_t randomizer[MLDSA_SIGNATURE_RANDOMIZER_BYTES];
1753
+ RAND_bytes(randomizer, sizeof(randomizer));
1754
+
1755
+ const uint8_t context_prefix[2] = {0, static_cast<uint8_t>(context_len)};
1756
+ return MLDSA65_sign_internal(out_encoded_signature, private_key, msg, msg_len,
1757
+ context_prefix, sizeof(context_prefix), context,
1758
+ context_len, randomizer);
1759
+ }
1760
+
1761
+ // FIPS 204, Algorithm 3 (`ML-DSA.Verify`).
1762
+ int MLDSA65_verify(const struct MLDSA65_public_key *public_key,
1763
+ const uint8_t *signature, size_t signature_len,
1764
+ const uint8_t *msg, size_t msg_len, const uint8_t *context,
1765
+ size_t context_len) {
1766
+ if (context_len > 255 || signature_len != MLDSA65_SIGNATURE_BYTES) {
1767
+ return 0;
1768
+ }
1769
+
1770
+ const uint8_t context_prefix[2] = {0, static_cast<uint8_t>(context_len)};
1771
+ return MLDSA65_verify_internal(public_key, signature, msg, msg_len,
1772
+ context_prefix, sizeof(context_prefix),
1773
+ context, context_len);
1774
+ }
1775
+
1776
+ int MLDSA65_verify_internal(
1777
+ const struct MLDSA65_public_key *public_key,
1778
+ const uint8_t encoded_signature[MLDSA65_SIGNATURE_BYTES],
1779
+ const uint8_t *msg, size_t msg_len, const uint8_t *context_prefix,
1780
+ size_t context_prefix_len, const uint8_t *context, size_t context_len) {
1781
+ return mldsa_verify_internal<6, 5>(
1782
+ mldsa65_public_key_from_external(public_key), encoded_signature, msg,
1783
+ msg_len, context_prefix, context_prefix_len, context, context_len);
1784
+ }
1785
+
1786
+ int MLDSA65_marshal_public_key(CBB *out,
1787
+ const struct MLDSA65_public_key *public_key) {
1788
+ return mldsa_marshal_public_key(out,
1789
+ mldsa65_public_key_from_external(public_key));
1687
1790
  }