grpc 1.69.0 → 1.70.1

Sign up to get free protection for your applications and to get access to all the features.
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
  }