tigerbeetle 0.0.36 → 0.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/ext/tb_client/extconf.rb +13 -13
  4. data/ext/tb_client/tigerbeetle/LICENSE +177 -0
  5. data/ext/tb_client/tigerbeetle/build.zig +2327 -0
  6. data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
  7. data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
  8. data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
  9. data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
  10. data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
  11. data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
  12. data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
  13. data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
  14. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1092 -0
  15. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
  16. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
  17. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
  18. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
  19. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
  20. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
  21. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
  22. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
  23. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
  24. data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
  25. data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
  26. data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
  27. data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
  28. data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
  29. data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
  30. data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
  31. data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
  32. data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
  33. data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
  34. data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
  35. data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
  36. data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
  37. data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
  38. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
  39. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
  40. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
  41. data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
  42. data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
  43. data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
  44. data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
  45. data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
  46. data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
  47. data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
  48. data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
  49. data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
  50. data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
  51. data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
  52. data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
  53. data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
  54. data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
  55. data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
  56. data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
  57. data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
  58. data/ext/tb_client/tigerbeetle/src/direction.zig +120 -0
  59. data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
  60. data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
  61. data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
  62. data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
  63. data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
  64. data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
  65. data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
  66. data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
  67. data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
  68. data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
  69. data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
  70. data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
  71. data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
  72. data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
  73. data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
  74. data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
  75. data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
  76. data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
  77. data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
  78. data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
  79. data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
  80. data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
  81. data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
  82. data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
  83. data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
  84. data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
  85. data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
  86. data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
  87. data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
  88. data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
  89. data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
  90. data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
  91. data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
  92. data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
  93. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
  94. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
  95. data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
  96. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
  97. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
  98. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
  99. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
  100. data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
  101. data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
  102. data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
  103. data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
  104. data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
  105. data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +359 -0
  106. data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
  107. data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
  108. data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +962 -0
  109. data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
  110. data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
  111. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
  112. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
  113. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
  114. data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
  115. data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
  116. data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
  117. data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +90 -0
  118. data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
  119. data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
  120. data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
  121. data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +534 -0
  122. data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
  123. data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
  124. data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
  125. data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
  126. data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
  127. data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
  128. data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
  129. data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
  130. data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
  131. data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
  132. data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
  133. data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
  134. data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
  135. data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
  136. data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
  137. data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
  138. data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
  139. data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
  140. data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
  141. data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
  142. data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
  143. data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
  144. data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
  145. data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
  146. data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
  147. data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
  148. data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
  149. data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
  150. data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
  151. data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
  152. data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
  153. data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
  154. data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
  155. data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
  156. data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
  157. data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
  158. data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
  159. data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
  160. data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
  161. data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
  162. data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
  163. data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
  164. data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
  165. data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
  166. data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
  167. data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
  168. data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
  169. data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
  170. data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
  171. data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
  172. data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
  173. data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
  174. data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
  175. data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
  176. data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
  177. data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
  178. data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
  179. data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
  180. data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
  181. data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
  182. data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
  183. data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
  184. data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
  185. data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
  186. data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
  187. data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
  188. data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
  189. data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
  190. data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
  191. data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
  192. data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
  193. data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
  194. data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
  195. data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
  196. data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
  197. data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
  198. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
  199. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
  200. data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
  201. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
  202. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
  203. data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
  204. data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
  205. data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
  206. data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
  207. data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
  208. data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
  209. data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
  210. data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
  211. data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
  212. data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
  213. data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
  214. data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
  215. data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
  216. data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
  217. data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
  218. data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
  219. data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
  220. data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
  221. data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
  222. data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
  223. data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
  224. data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
  225. data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
  226. data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
  227. data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
  228. data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
  229. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
  230. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
  231. data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
  232. data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
  233. data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
  234. data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
  235. data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2928 -0
  236. data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
  237. data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
  238. data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
  239. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
  240. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
  241. data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
  242. data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
  243. data/lib/tb_client/shared_lib.rb +12 -5
  244. data/lib/tigerbeetle/platforms.rb +9 -0
  245. data/lib/tigerbeetle/version.rb +2 -2
  246. data/tigerbeetle.gemspec +22 -5
  247. metadata +242 -3
  248. data/ext/tb_client/pkg.tar.gz +0 -0
@@ -0,0 +1,436 @@
1
+ //! Vendored from Zig's 0.13.0 standard library to maintain hash stability.
2
+ //! Source: https://github.com/ziglang/zig/blob/0.13.0/lib/std/crypto/aegis.zig
3
+
4
+ const std = @import("std");
5
+ const crypto = std.crypto;
6
+ const mem = std.mem;
7
+ const assert = std.debug.assert;
8
+ const AesBlock = crypto.core.aes.Block;
9
+ const AuthenticationError = crypto.errors.AuthenticationError;
10
+
11
+ /// AEGIS-128L with a 128-bit authentication tag.
12
+ const Aegis128L = Aegis128LGenericType(128);
13
+
14
+ /// AEGIS-128L with a 256-bit authentication tag.
15
+ const Aegis128L_256 = Aegis128LGenericType(256);
16
+
17
+ const State128L = struct {
18
+ blocks: [8]AesBlock,
19
+
20
+ fn init(key: [16]u8, nonce: [16]u8) State128L {
21
+ const c1 = AesBlock.fromBytes(&[16]u8{
22
+ 0xdb, 0x3d, 0x18, 0x55, 0x6d, 0xc2, 0x2f, 0xf1,
23
+ 0x20, 0x11, 0x31, 0x42, 0x73, 0xb5, 0x28, 0xdd,
24
+ });
25
+ const c2 = AesBlock.fromBytes(&[16]u8{
26
+ 0x0, 0x1, 0x01, 0x02, 0x03, 0x05, 0x08, 0x0d,
27
+ 0x15, 0x22, 0x37, 0x59, 0x90, 0xe9, 0x79, 0x62,
28
+ });
29
+ const key_block = AesBlock.fromBytes(&key);
30
+ const nonce_block = AesBlock.fromBytes(&nonce);
31
+ const blocks = [8]AesBlock{
32
+ key_block.xorBlocks(nonce_block),
33
+ c1,
34
+ c2,
35
+ c1,
36
+ key_block.xorBlocks(nonce_block),
37
+ key_block.xorBlocks(c2),
38
+ key_block.xorBlocks(c1),
39
+ key_block.xorBlocks(c2),
40
+ };
41
+ var state = State128L{ .blocks = blocks };
42
+ var i: usize = 0;
43
+ while (i < 10) : (i += 1) {
44
+ state.update(nonce_block, key_block);
45
+ }
46
+ return state;
47
+ }
48
+
49
+ inline fn update(state: *State128L, d1: AesBlock, d2: AesBlock) void {
50
+ comptime assert(state.blocks.len == 8);
51
+
52
+ // Hoist lanes; this keeps the blocks in registers (see #3201).
53
+ var blocks: [8]AesBlock = state.blocks;
54
+ const tmp = blocks[7];
55
+
56
+ inline for ([_]usize{ 7, 6, 5, 4, 3, 2, 1 }) |i| {
57
+ blocks[i] = blocks[i - 1].encrypt(blocks[i]);
58
+ }
59
+
60
+ blocks[0] = tmp.encrypt(blocks[0]);
61
+ blocks[0] = blocks[0].xorBlocks(d1);
62
+ blocks[4] = blocks[4].xorBlocks(d2);
63
+
64
+ // Single spill at the end.
65
+ state.blocks = blocks;
66
+ }
67
+
68
+ fn absorb(state: *State128L, src: *const [32]u8) void {
69
+ const msg0 = AesBlock.fromBytes(src[0..16]);
70
+ const msg1 = AesBlock.fromBytes(src[16..32]);
71
+ state.update(msg0, msg1);
72
+ }
73
+
74
+ fn enc(state: *State128L, dst: *[32]u8, src: *const [32]u8) void {
75
+ const blocks = &state.blocks;
76
+ const msg0 = AesBlock.fromBytes(src[0..16]);
77
+ const msg1 = AesBlock.fromBytes(src[16..32]);
78
+ var tmp0 = msg0.xorBlocks(blocks[6]).xorBlocks(blocks[1]);
79
+ var tmp1 = msg1.xorBlocks(blocks[2]).xorBlocks(blocks[5]);
80
+ tmp0 = tmp0.xorBlocks(blocks[2].andBlocks(blocks[3]));
81
+ tmp1 = tmp1.xorBlocks(blocks[6].andBlocks(blocks[7]));
82
+ dst[0..16].* = tmp0.toBytes();
83
+ dst[16..32].* = tmp1.toBytes();
84
+ state.update(msg0, msg1);
85
+ }
86
+
87
+ fn dec(state: *State128L, dst: *[32]u8, src: *const [32]u8) void {
88
+ const blocks = &state.blocks;
89
+ var msg0 = AesBlock.fromBytes(src[0..16]).xorBlocks(blocks[6]).xorBlocks(blocks[1]);
90
+ var msg1 = AesBlock.fromBytes(src[16..32]).xorBlocks(blocks[2]).xorBlocks(blocks[5]);
91
+ msg0 = msg0.xorBlocks(blocks[2].andBlocks(blocks[3]));
92
+ msg1 = msg1.xorBlocks(blocks[6].andBlocks(blocks[7]));
93
+ dst[0..16].* = msg0.toBytes();
94
+ dst[16..32].* = msg1.toBytes();
95
+ state.update(msg0, msg1);
96
+ }
97
+
98
+ fn mac(state: *State128L, comptime tag_bits: u9, adlen: usize, mlen: usize) [tag_bits / 8]u8 {
99
+ const blocks = &state.blocks;
100
+ var sizes: [16]u8 = undefined;
101
+ mem.writeInt(u64, sizes[0..8], @as(u64, adlen) * 8, .little);
102
+ mem.writeInt(u64, sizes[8..16], @as(u64, mlen) * 8, .little);
103
+ const tmp = AesBlock.fromBytes(&sizes).xorBlocks(blocks[2]);
104
+ var i: usize = 0;
105
+ while (i < 7) : (i += 1) {
106
+ state.update(tmp, tmp);
107
+ }
108
+ return switch (tag_bits) {
109
+ 128 => blocks[0].xorBlocks(blocks[1]).xorBlocks(blocks[2]).xorBlocks(blocks[3])
110
+ .xorBlocks(blocks[4]).xorBlocks(blocks[5]).xorBlocks(blocks[6]).toBytes(),
111
+ 256 => tag: {
112
+ const t1 = blocks[0].xorBlocks(blocks[1]).xorBlocks(blocks[2]).xorBlocks(blocks[3]);
113
+ const t2 = blocks[4].xorBlocks(blocks[5]).xorBlocks(blocks[6]).xorBlocks(blocks[7]);
114
+ break :tag t1.toBytes() ++ t2.toBytes();
115
+ },
116
+ else => unreachable,
117
+ };
118
+ }
119
+ };
120
+
121
+ /// The `Aegis128LMac` message authentication function outputs 256 bit tags.
122
+ /// In addition to being extremely fast, its large state, non-linearity
123
+ /// and non-invertibility provides the following properties:
124
+ /// - 128 bit security, stronger than GHash/Polyval/Poly1305.
125
+ /// - Recovering the secret key from the state would require ~2^128 attempts,
126
+ /// which is infeasible for any practical adversary.
127
+ /// - It has a large security margin against internal collisions.
128
+ pub const Aegis128LMac = AegisMacType(Aegis128L_256);
129
+
130
+ /// Aegis128L MAC with a 128-bit output.
131
+ /// A MAC with a 128-bit output is not safe unless the number of messages
132
+ /// authenticated with the same key remains small.
133
+ /// After 2^48 messages, the probability of a collision is already ~ 2^-33.
134
+ /// If unsure, use the Aegis128LMac type, that has a 256 bit output.
135
+ pub const Aegis128LMac_128 = AegisMacType(Aegis128L);
136
+
137
+ fn Aegis128LGenericType(comptime tag_bits: u9) type {
138
+ comptime assert(tag_bits == 128 or tag_bits == 256); // tag must be 128 or 256 bits
139
+
140
+ return struct {
141
+ pub const tag_length = tag_bits / 8;
142
+ pub const nonce_length = 16;
143
+ pub const key_length = 16;
144
+ pub const block_length = 32;
145
+
146
+ const State = State128L;
147
+
148
+ /// c: ciphertext: output buffer should be of size m.len
149
+ /// tag: authentication tag: output MAC
150
+ /// m: message
151
+ /// ad: Associated Data
152
+ /// npub: public nonce
153
+ /// k: private key
154
+ pub fn encrypt(
155
+ c: []u8,
156
+ tag: *[tag_length]u8,
157
+ m: []const u8,
158
+ ad: []const u8,
159
+ npub: [nonce_length]u8,
160
+ key: [key_length]u8,
161
+ ) void {
162
+ assert(c.len == m.len);
163
+ var state = State128L.init(key, npub);
164
+ var src: [32]u8 align(16) = undefined;
165
+ var dst: [32]u8 align(16) = undefined;
166
+ var i: usize = 0;
167
+ while (i + 32 <= ad.len) : (i += 32) {
168
+ state.absorb(ad[i..][0..32]);
169
+ }
170
+ if (ad.len % 32 != 0) {
171
+ @memset(src[0..], 0);
172
+ @memcpy(src[0 .. ad.len % 32], ad[i..][0 .. ad.len % 32]);
173
+ state.absorb(&src);
174
+ }
175
+ i = 0;
176
+ while (i + 32 <= m.len) : (i += 32) {
177
+ state.enc(c[i..][0..32], m[i..][0..32]);
178
+ }
179
+ if (m.len % 32 != 0) {
180
+ @memset(src[0..], 0);
181
+ @memcpy(src[0 .. m.len % 32], m[i..][0 .. m.len % 32]);
182
+ state.enc(&dst, &src);
183
+ @memcpy(c[i..][0 .. m.len % 32], dst[0 .. m.len % 32]);
184
+ }
185
+ tag.* = state.mac(tag_bits, ad.len, m.len);
186
+ }
187
+
188
+ /// `m`: Message
189
+ /// `c`: Ciphertext
190
+ /// `tag`: Authentication tag
191
+ /// `ad`: Associated data
192
+ /// `npub`: Public nonce
193
+ /// `k`: Private key
194
+ /// Asserts `c.len == m.len`.
195
+ ///
196
+ /// Contents of `m` are undefined if an error is returned.
197
+ pub fn decrypt(
198
+ m: []u8,
199
+ c: []const u8,
200
+ tag: [tag_length]u8,
201
+ ad: []const u8,
202
+ npub: [nonce_length]u8,
203
+ key: [key_length]u8,
204
+ ) AuthenticationError!void {
205
+ assert(c.len == m.len);
206
+ var state = State128L.init(key, npub);
207
+ var src: [32]u8 align(16) = undefined;
208
+ var dst: [32]u8 align(16) = undefined;
209
+ var i: usize = 0;
210
+ while (i + 32 <= ad.len) : (i += 32) {
211
+ state.absorb(ad[i..][0..32]);
212
+ }
213
+ if (ad.len % 32 != 0) {
214
+ @memset(src[0..], 0);
215
+ @memcpy(src[0 .. ad.len % 32], ad[i..][0 .. ad.len % 32]);
216
+ state.absorb(&src);
217
+ }
218
+ i = 0;
219
+ while (i + 32 <= m.len) : (i += 32) {
220
+ state.dec(m[i..][0..32], c[i..][0..32]);
221
+ }
222
+ if (m.len % 32 != 0) {
223
+ @memset(src[0..], 0);
224
+ @memcpy(src[0 .. m.len % 32], c[i..][0 .. m.len % 32]);
225
+ state.dec(&dst, &src);
226
+ @memcpy(m[i..][0 .. m.len % 32], dst[0 .. m.len % 32]);
227
+ @memset(dst[0 .. m.len % 32], 0);
228
+ const blocks = &state.blocks;
229
+ blocks[0] = blocks[0].xorBlocks(AesBlock.fromBytes(dst[0..16]));
230
+ blocks[4] = blocks[4].xorBlocks(AesBlock.fromBytes(dst[16..32]));
231
+ }
232
+ var computed_tag = state.mac(tag_bits, ad.len, m.len);
233
+ const verify = crypto.utils.timingSafeEql([tag_length]u8, computed_tag, tag);
234
+ if (!verify) {
235
+ crypto.utils.secureZero(u8, &computed_tag);
236
+ @memset(m, undefined);
237
+ return error.AuthenticationFailed;
238
+ }
239
+ }
240
+ };
241
+ }
242
+
243
+ fn AegisMacType(comptime T: type) type {
244
+ return struct {
245
+ const AegisMac = @This();
246
+
247
+ pub const mac_length = T.tag_length;
248
+ pub const key_length = T.key_length;
249
+ pub const block_length = T.block_length;
250
+
251
+ state: T.State,
252
+ buf: [block_length]u8 = undefined,
253
+ off: usize = 0,
254
+ msg_len: usize = 0,
255
+
256
+ /// Initialize a state for the MAC function
257
+ pub fn init(key: *const [key_length]u8) AegisMac {
258
+ const nonce = [_]u8{0} ** T.nonce_length;
259
+ return AegisMac{
260
+ .state = T.State.init(key.*, nonce),
261
+ };
262
+ }
263
+
264
+ /// Add data to the state
265
+ pub fn update(self: *AegisMac, b: []const u8) void {
266
+ self.msg_len += b.len;
267
+
268
+ const len_partial = @min(b.len, block_length - self.off);
269
+ @memcpy(self.buf[self.off..][0..len_partial], b[0..len_partial]);
270
+ self.off += len_partial;
271
+ if (self.off < block_length) {
272
+ return;
273
+ }
274
+ self.state.absorb(&self.buf);
275
+
276
+ var i = len_partial;
277
+ self.off = 0;
278
+ while (i + block_length <= b.len) : (i += block_length) {
279
+ self.state.absorb(b[i..][0..block_length]);
280
+ }
281
+ if (i != b.len) {
282
+ self.off = b.len - i;
283
+ @memcpy(self.buf[0..self.off], b[i..]);
284
+ }
285
+ }
286
+
287
+ /// Return an authentication tag for the current state
288
+ pub fn final(self: *AegisMac, out: *[mac_length]u8) void {
289
+ if (self.off > 0) {
290
+ var pad = [_]u8{0} ** block_length;
291
+ @memcpy(pad[0..self.off], self.buf[0..self.off]);
292
+ self.state.absorb(&pad);
293
+ }
294
+ out.* = self.state.mac(T.tag_length * 8, self.msg_len, 0);
295
+ }
296
+
297
+ /// Return an authentication tag for a message and a key
298
+ pub fn create(out: *[mac_length]u8, msg: []const u8, key: *const [key_length]u8) void {
299
+ var ctx = AegisMac.init(key);
300
+ ctx.update(msg);
301
+ ctx.final(out);
302
+ }
303
+
304
+ pub const Error = error{};
305
+ pub const Writer = std.io.Writer(*AegisMac, Error, write);
306
+
307
+ fn write(self: *AegisMac, bytes: []const u8) Error!usize {
308
+ self.update(bytes);
309
+ return bytes.len;
310
+ }
311
+
312
+ pub fn writer(self: *AegisMac) Writer {
313
+ return .{ .context = self };
314
+ }
315
+ };
316
+ }
317
+
318
+ const testing = std.testing;
319
+ const fmt = std.fmt;
320
+
321
+ test "Aegis128L test vector 1" {
322
+ const key: [Aegis128L.key_length]u8 = [_]u8{ 0x10, 0x01 } ++ [_]u8{0x00} ** 14;
323
+ const nonce: [Aegis128L.nonce_length]u8 = [_]u8{ 0x10, 0x00, 0x02 } ++ [_]u8{0x00} ** 13;
324
+ const ad = [8]u8{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
325
+ const m = [32]u8{
326
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
327
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
328
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
329
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
330
+ };
331
+ var c: [m.len]u8 = undefined;
332
+ var m2: [m.len]u8 = undefined;
333
+ var tag: [Aegis128L.tag_length]u8 = undefined;
334
+
335
+ Aegis128L.encrypt(&c, &tag, &m, &ad, nonce, key);
336
+ try Aegis128L.decrypt(&m2, &c, tag, &ad, nonce, key);
337
+ try testing.expectEqualSlices(u8, &m, &m2);
338
+
339
+ try assertEqual("79d94593d8c2119d7e8fd9b8fc77845c5c077a05b2528b6ac54b563aed8efe84", &c);
340
+ try assertEqual("cc6f3372f6aa1bb82388d695c3962d9a", &tag);
341
+
342
+ c[0] +%= 1;
343
+ try testing.expectError(
344
+ error.AuthenticationFailed,
345
+ Aegis128L.decrypt(&m2, &c, tag, &ad, nonce, key),
346
+ );
347
+ c[0] -%= 1;
348
+ tag[0] +%= 1;
349
+ try testing.expectError(
350
+ error.AuthenticationFailed,
351
+ Aegis128L.decrypt(&m2, &c, tag, &ad, nonce, key),
352
+ );
353
+ }
354
+
355
+ test "Aegis128L test vector 2" {
356
+ const key: [Aegis128L.key_length]u8 = [_]u8{0x00} ** 16;
357
+ const nonce: [Aegis128L.nonce_length]u8 = [_]u8{0x00} ** 16;
358
+ const ad = [_]u8{};
359
+ const m = [_]u8{0x00} ** 16;
360
+ var c: [m.len]u8 = undefined;
361
+ var m2: [m.len]u8 = undefined;
362
+ var tag: [Aegis128L.tag_length]u8 = undefined;
363
+
364
+ Aegis128L.encrypt(&c, &tag, &m, &ad, nonce, key);
365
+ try Aegis128L.decrypt(&m2, &c, tag, &ad, nonce, key);
366
+ try testing.expectEqualSlices(u8, &m, &m2);
367
+
368
+ try assertEqual("41de9000a7b5e40e2d68bb64d99ebb19", &c);
369
+ try assertEqual("f4d997cc9b94227ada4fe4165422b1c8", &tag);
370
+ }
371
+
372
+ test "Aegis128L test vector 3" {
373
+ const key: [Aegis128L.key_length]u8 = [_]u8{0x00} ** 16;
374
+ const nonce: [Aegis128L.nonce_length]u8 = [_]u8{0x00} ** 16;
375
+ const ad = [_]u8{};
376
+ const m = [_]u8{};
377
+ var c: [m.len]u8 = undefined;
378
+ var m2: [m.len]u8 = undefined;
379
+ var tag: [Aegis128L.tag_length]u8 = undefined;
380
+
381
+ Aegis128L.encrypt(&c, &tag, &m, &ad, nonce, key);
382
+ try Aegis128L.decrypt(&m2, &c, tag, &ad, nonce, key);
383
+ try testing.expectEqualSlices(u8, &m, &m2);
384
+
385
+ try assertEqual("83cc600dc4e3e7e62d4055826174f149", &tag);
386
+ }
387
+
388
+ test "Aegis MAC" {
389
+ const key = [_]u8{0x00} ** Aegis128LMac.key_length;
390
+ var msg: [64]u8 = undefined;
391
+ for (&msg, 0..) |*m, i| {
392
+ m.* = @as(u8, @truncate(i));
393
+ }
394
+ const st_init = Aegis128LMac.init(&key);
395
+ var st = st_init;
396
+ var tag: [Aegis128LMac.mac_length]u8 = undefined;
397
+
398
+ st.update(msg[0..32]);
399
+ st.update(msg[32..]);
400
+ st.final(&tag);
401
+ try assertEqual("f8840849602738d81037cbaa0f584ea95759e2ac60263ce77346bcdc79fe4319", &tag);
402
+
403
+ st = st_init;
404
+ st.update(msg[0..31]);
405
+ st.update(msg[31..]);
406
+ st.final(&tag);
407
+ try assertEqual("f8840849602738d81037cbaa0f584ea95759e2ac60263ce77346bcdc79fe4319", &tag);
408
+
409
+ st = st_init;
410
+ st.update(msg[0..14]);
411
+ st.update(msg[14..30]);
412
+ st.update(msg[30..]);
413
+ st.final(&tag);
414
+ try assertEqual("f8840849602738d81037cbaa0f584ea95759e2ac60263ce77346bcdc79fe4319", &tag);
415
+
416
+ var empty: [0]u8 = undefined;
417
+ const nonce = [_]u8{0x00} ** Aegis128L_256.nonce_length;
418
+ Aegis128L_256.encrypt(&empty, &tag, &empty, &msg, nonce, key);
419
+ try assertEqual("f8840849602738d81037cbaa0f584ea95759e2ac60263ce77346bcdc79fe4319", &tag);
420
+
421
+ // An update whose size is not a multiple of the block size
422
+ st = st_init;
423
+ st.update(msg[0..33]);
424
+ st.final(&tag);
425
+ try assertEqual("c7cf649a844c1a6676cf6d91b1658e0aee54a4da330b0a8d3bc7ea4067551d1b", &tag);
426
+ }
427
+
428
+ // Assert `expected` == hex(`input`) where `input` is a bytestring
429
+ fn assertEqual(comptime expected_hex: [:0]const u8, input: []const u8) !void {
430
+ var expected_bytes: [expected_hex.len / 2]u8 = undefined;
431
+ for (&expected_bytes, 0..) |*r, i| {
432
+ r.* = fmt.parseInt(u8, expected_hex[2 * i .. 2 * i + 2], 16) catch unreachable;
433
+ }
434
+
435
+ try testing.expectEqualSlices(u8, &expected_bytes, input);
436
+ }
@@ -0,0 +1,48 @@
1
+ const std = @import("std");
2
+ const windows = std.os.windows;
3
+
4
+ pub extern "kernel32" fn GetSystemTimePreciseAsFileTime(
5
+ lpFileTime: *windows.FILETIME,
6
+ ) callconv(.winapi) void;
7
+
8
+ pub extern "kernel32" fn GetCommandLineW() callconv(.winapi) windows.LPWSTR;
9
+
10
+ pub extern "kernel32" fn GetProcessTimes(
11
+ in_hProcess: windows.HANDLE,
12
+ out_lpCreationTime: *windows.FILETIME,
13
+ out_lpExitTime: *windows.FILETIME,
14
+ out_lpKernelTime: *windows.FILETIME,
15
+ out_lpUserTime: *windows.FILETIME,
16
+ ) callconv(.winapi) windows.BOOL;
17
+
18
+ pub extern "kernel32" fn SetProcessWorkingSetSize(
19
+ hProcess: windows.HANDLE,
20
+ dwMinimumWorkingSetSize: windows.SIZE_T,
21
+ dwMaximumWorkingSetSize: windows.SIZE_T,
22
+ ) callconv(.winapi) windows.BOOL;
23
+
24
+ pub extern "kernel32" fn GetProcessWorkingSetSize(
25
+ hProcess: windows.HANDLE,
26
+ lpMinimumWorkingSetSize: *windows.SIZE_T,
27
+ lpMaximumWorkingSetSize: *windows.SIZE_T,
28
+ ) callconv(.winapi) windows.BOOL;
29
+
30
+ pub const LOCKFILE_EXCLUSIVE_LOCK = 0x2;
31
+ pub const LOCKFILE_FAIL_IMMEDIATELY = 0x1;
32
+ pub extern "kernel32" fn LockFileEx(
33
+ hFile: windows.HANDLE,
34
+ dwFlags: windows.DWORD,
35
+ dwReserved: windows.DWORD,
36
+ nNumberOfBytesToLockLow: windows.DWORD,
37
+ nNumberOfBytesToLockHigh: windows.DWORD,
38
+ lpOverlapped: ?*windows.OVERLAPPED,
39
+ ) callconv(.winapi) windows.BOOL;
40
+
41
+ pub extern "kernel32" fn SetEndOfFile(
42
+ hFile: windows.HANDLE,
43
+ ) callconv(.winapi) windows.BOOL;
44
+
45
+ pub extern "kernel32" fn ConnectNamedPipe(
46
+ hNamedPipe: windows.HANDLE,
47
+ lpOverlapped: ?*windows.OVERLAPPED,
48
+ ) callconv(.winapi) windows.BOOL;