mldsa_gh 0.1.0

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 (128) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +88 -0
  4. data/ext/mldsa_gh_native/extconf.rb +14 -0
  5. data/ext/mldsa_gh_native/mldsa_gh_native.c +222 -0
  6. data/ext/mldsa_gh_native/mldsa_gh_native_all.c +24 -0
  7. data/ext/mldsa_gh_native/mldsa_gh_native_all.h +26 -0
  8. data/ext/mldsa_gh_native/vendor/mldsa-native/BUILDING.md +108 -0
  9. data/ext/mldsa_gh_native/vendor/mldsa-native/LICENSE +305 -0
  10. data/ext/mldsa_gh_native/vendor/mldsa-native/README.md +247 -0
  11. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/README.md +23 -0
  12. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/mldsa_native.c +803 -0
  13. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/mldsa_native.h +956 -0
  14. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/mldsa_native_asm.S +830 -0
  15. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/mldsa_native_config.h +855 -0
  16. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/cbmc.h +233 -0
  17. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/common.h +301 -0
  18. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/context.h +152 -0
  19. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/ct.c +21 -0
  20. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/ct.h +373 -0
  21. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/debug.c +75 -0
  22. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/debug.h +125 -0
  23. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/fips202.c +270 -0
  24. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/fips202.h +224 -0
  25. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/fips202x4.c +187 -0
  26. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/fips202x4.h +125 -0
  27. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/keccakf1600.c +510 -0
  28. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/keccakf1600.h +110 -0
  29. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/auto.h +85 -0
  30. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/src/fips202_native_aarch64.h +69 -0
  31. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/src/keccak_f1600_x1_scalar_aarch64_asm.S +378 -0
  32. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/src/keccak_f1600_x1_v84a_aarch64_asm.S +207 -0
  33. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/src/keccak_f1600_x2_v84a_aarch64_asm.S +262 -0
  34. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/src/keccak_f1600_x4_v8a_scalar_hybrid_aarch64_asm.S +1080 -0
  35. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/src/keccak_f1600_x4_v8a_v84a_scalar_hybrid_aarch64_asm.S +990 -0
  36. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/src/keccakf1600_round_constants.c +47 -0
  37. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/x1_scalar.h +27 -0
  38. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/x1_v84a.h +36 -0
  39. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/x2_v84a.h +40 -0
  40. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/x4_v8a_scalar.h +32 -0
  41. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/aarch64/x4_v8a_v84a_scalar.h +37 -0
  42. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/api.h +129 -0
  43. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/armv81m/README.md +10 -0
  44. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/armv81m/mve.h +67 -0
  45. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/armv81m/src/fips202_native_armv81m.h +37 -0
  46. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/armv81m/src/keccak_f1600_x4_mve.S +717 -0
  47. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/armv81m/src/keccak_f1600_x4_mve.c +42 -0
  48. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/armv81m/src/keccak_f1600_x4_state_extract_bytes_mve.S +334 -0
  49. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/armv81m/src/keccak_f1600_x4_state_xor_bytes_mve.S +355 -0
  50. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/armv81m/src/keccakf1600_round_constants.c +53 -0
  51. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/auto.h +35 -0
  52. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/x86_64/keccak_f1600_x4_avx2.h +34 -0
  53. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/x86_64/src/fips202_native_x86_64.h +45 -0
  54. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/x86_64/src/keccak_f1600_x4_avx2_asm.S +488 -0
  55. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/fips202/native/x86_64/src/keccakf1600_constants.c +52 -0
  56. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/meta.h +314 -0
  57. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/aarch64_zetas.c +248 -0
  58. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/arith_native_aarch64.h +367 -0
  59. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_intt_aarch64_asm.S +786 -0
  60. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_ntt_aarch64_asm.S +686 -0
  61. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_pointwise_montgomery_aarch64_asm.S +106 -0
  62. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_poly_caddq_aarch64_asm.S +69 -0
  63. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_poly_chknorm_aarch64_asm.S +76 -0
  64. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_poly_decompose_32_aarch64_asm.S +108 -0
  65. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_poly_decompose_88_aarch64_asm.S +108 -0
  66. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_poly_use_hint_32_aarch64_asm.S +125 -0
  67. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_poly_use_hint_88_aarch64_asm.S +133 -0
  68. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_polyvecl_pointwise_acc_montgomery_l4_aarch64_asm.S +157 -0
  69. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_polyvecl_pointwise_acc_montgomery_l5_aarch64_asm.S +173 -0
  70. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_polyvecl_pointwise_acc_montgomery_l7_aarch64_asm.S +205 -0
  71. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_polyz_unpack_17_aarch64_asm.S +103 -0
  72. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_polyz_unpack_19_aarch64_asm.S +100 -0
  73. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_rej_uniform_aarch64_asm.S +222 -0
  74. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_rej_uniform_eta2_aarch64_asm.S +170 -0
  75. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/mldsa_rej_uniform_eta4_aarch64_asm.S +163 -0
  76. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/polyz_unpack_table.c +52 -0
  77. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/rej_uniform_eta_table.c +547 -0
  78. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/aarch64/src/rej_uniform_table.c +63 -0
  79. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/api.h +617 -0
  80. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/meta.h +24 -0
  81. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/meta.h +323 -0
  82. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/arith_native_x86_64.h +330 -0
  83. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/consts.c +157 -0
  84. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/consts.h +27 -0
  85. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_intt_avx2_asm.S +2333 -0
  86. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_ntt_avx2_asm.S +2405 -0
  87. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_nttunpack_avx2_asm.S +254 -0
  88. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_pointwise_acc_l4_avx2_asm.S +173 -0
  89. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_pointwise_acc_l5_avx2_asm.S +189 -0
  90. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_pointwise_acc_l7_avx2_asm.S +221 -0
  91. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_pointwise_avx2_asm.S +158 -0
  92. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_poly_caddq_avx2_asm.S +199 -0
  93. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_poly_chknorm_avx2_asm.S +176 -0
  94. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_poly_decompose_32_avx2_asm.S +490 -0
  95. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_poly_decompose_88_avx2_asm.S +489 -0
  96. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_poly_use_hint_32_avx2_asm.S +123 -0
  97. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_poly_use_hint_88_avx2_asm.S +125 -0
  98. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_polyz_unpack_17_avx2_asm.S +355 -0
  99. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_polyz_unpack_19_avx2_asm.S +355 -0
  100. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_rej_uniform_avx2_asm.S +132 -0
  101. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_rej_uniform_eta2_avx2_asm.S +205 -0
  102. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/mldsa_rej_uniform_eta4_avx2_asm.S +176 -0
  103. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/native/x86_64/src/rej_uniform_table.c +161 -0
  104. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/packing.c +213 -0
  105. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/packing.h +277 -0
  106. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/params.h +153 -0
  107. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/poly.c +1066 -0
  108. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/poly.h +464 -0
  109. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/poly_kl.c +910 -0
  110. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/poly_kl.h +367 -0
  111. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/polyvec.c +509 -0
  112. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/polyvec.h +435 -0
  113. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/polyvec_lazy.c +311 -0
  114. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/polyvec_lazy.h +652 -0
  115. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/randombytes.h +26 -0
  116. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/reduce.h +144 -0
  117. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/rounding.h +265 -0
  118. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/sign.c +1720 -0
  119. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/sign.h +850 -0
  120. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/symmetric.h +68 -0
  121. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/sys.h +327 -0
  122. data/ext/mldsa_gh_native/vendor/mldsa-native/mldsa/src/zetas.inc +55 -0
  123. data/lib/mldsa/parameter_set.rb +82 -0
  124. data/lib/mldsa/signing_key.rb +147 -0
  125. data/lib/mldsa/verify_key.rb +72 -0
  126. data/lib/mldsa/version.rb +7 -0
  127. data/lib/mldsa_gh.rb +93 -0
  128. metadata +225 -0
@@ -0,0 +1,367 @@
1
+ /*
2
+ * Copyright (c) The mlkem-native project authors
3
+ * Copyright (c) The mldsa-native project authors
4
+ * SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
5
+ */
6
+
7
+ #ifndef MLD_NATIVE_AARCH64_SRC_ARITH_NATIVE_AARCH64_H
8
+ #define MLD_NATIVE_AARCH64_SRC_ARITH_NATIVE_AARCH64_H
9
+
10
+ #include "../../../cbmc.h"
11
+ #include "../../../common.h"
12
+
13
+ #define mld_aarch64_ntt_zetas_layer123456 \
14
+ MLD_NAMESPACE(aarch64_ntt_zetas_layer123456)
15
+ #define mld_aarch64_ntt_zetas_layer78 MLD_NAMESPACE(aarch64_ntt_zetas_layer78)
16
+
17
+ #define mld_aarch64_intt_zetas_layer78 MLD_NAMESPACE(aarch64_intt_zetas_layer78)
18
+ #define mld_aarch64_intt_zetas_layer123456 \
19
+ MLD_NAMESPACE(aarch64_intt_zetas_layer123456)
20
+
21
+ MLD_INTERNAL_DATA_DECLARATION const int32_t
22
+ mld_aarch64_ntt_zetas_layer123456[144];
23
+ MLD_INTERNAL_DATA_DECLARATION const int32_t mld_aarch64_ntt_zetas_layer78[384];
24
+
25
+ MLD_INTERNAL_DATA_DECLARATION const int32_t mld_aarch64_intt_zetas_layer78[384];
26
+ MLD_INTERNAL_DATA_DECLARATION const int32_t
27
+ mld_aarch64_intt_zetas_layer123456[160];
28
+
29
+ #define mld_rej_uniform_table MLD_NAMESPACE(rej_uniform_table)
30
+ MLD_INTERNAL_DATA_DECLARATION const uint8_t mld_rej_uniform_table[256];
31
+ #if !defined(MLD_CONFIG_NO_KEYPAIR_API)
32
+ #define mld_rej_uniform_eta_table MLD_NAMESPACE(rej_uniform_eta_table)
33
+ MLD_INTERNAL_DATA_DECLARATION const uint8_t mld_rej_uniform_eta_table[4096];
34
+ #endif
35
+
36
+ #if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)
37
+ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44
38
+ #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices)
39
+ MLD_INTERNAL_DATA_DECLARATION const uint8_t mld_polyz_unpack_17_indices[64];
40
+ #endif
41
+ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \
42
+ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)
43
+ #define mld_polyz_unpack_19_indices MLD_NAMESPACE(polyz_unpack_19_indices)
44
+ MLD_INTERNAL_DATA_DECLARATION const uint8_t mld_polyz_unpack_19_indices[64];
45
+ #endif
46
+ #endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */
47
+
48
+
49
+ /*
50
+ * Sampling 256 coefficients mod 15 using rejection sampling from 4 bits.
51
+ * Expected number of required bytes: (256 * (16/15))/2 = 136.5 bytes.
52
+ * We sample 1 block (=136 bytes) of SHAKE256_RATE output initially.
53
+ * Sampling 2 blocks initially results in slightly worse performance.
54
+ */
55
+ #define MLD_AARCH64_REJ_UNIFORM_ETA2_BUFLEN (1 * 136)
56
+ /*
57
+ * Sampling 256 coefficients mod 9 using rejection sampling from 4 bits.
58
+ * Expected number of required bytes: (256 * (16/9))/2 = 227.5 bytes.
59
+ * We sample 2 blocks (=272 bytes) of SHAKE256_RATE output initially.
60
+ */
61
+ #define MLD_AARCH64_REJ_UNIFORM_ETA4_BUFLEN (2 * 136)
62
+
63
+ #define mld_ntt_aarch64_asm MLD_NAMESPACE(ntt_aarch64_asm)
64
+ void mld_ntt_aarch64_asm(int32_t r[MLDSA_N], const int32_t zetas_l123456[144],
65
+ const int32_t zetas_l78[384])
66
+ /* This must be kept in sync with the HOL-Light specification
67
+ * in proofs/hol_light/aarch64/proofs/mldsa_ntt_aarch64_asm.ml */
68
+ __contract__(
69
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
70
+ /* check-magic: 8380417 == MLDSA_Q */
71
+ requires(array_abs_bound(r, 0, MLDSA_N, 8380417))
72
+ requires(zetas_l123456 == mld_aarch64_ntt_zetas_layer123456)
73
+ requires(zetas_l78 == mld_aarch64_ntt_zetas_layer78)
74
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
75
+ /* check-magic: off */
76
+ ensures(array_abs_bound(r, 0, MLDSA_N, 75423753))
77
+ /* check-magic: on */
78
+ );
79
+
80
+ #define mld_intt_aarch64_asm MLD_NAMESPACE(intt_aarch64_asm)
81
+ void mld_intt_aarch64_asm(int32_t r[MLDSA_N], const int32_t zetas_l78[384],
82
+ const int32_t zetas_l123456[160])
83
+ /* This must be kept in sync with the HOL-Light specification
84
+ * in proofs/hol_light/aarch64/proofs/mldsa_intt_aarch64_asm.ml */
85
+ __contract__(
86
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
87
+ requires(array_abs_bound(r, 0, MLDSA_N, 8380417))
88
+ requires(zetas_l78 == mld_aarch64_intt_zetas_layer78)
89
+ requires(zetas_l123456 == mld_aarch64_intt_zetas_layer123456)
90
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
91
+ /* check-magic: off */
92
+ ensures(array_abs_bound(r, 0, MLDSA_N, 8380417))
93
+ /* check-magic: on */
94
+ );
95
+
96
+ #define mld_rej_uniform_aarch64_asm MLD_NAMESPACE(rej_uniform_aarch64_asm)
97
+ MLD_MUST_CHECK_RETURN_VALUE
98
+ uint64_t mld_rej_uniform_aarch64_asm(int32_t r[MLDSA_N], const uint8_t *buf,
99
+ unsigned buflen, const uint8_t table[256])
100
+ /* This must be kept in sync with the HOL-Light specification
101
+ * in proofs/hol_light/aarch64/proofs/mldsa_rej_uniform_aarch64_asm.ml. */
102
+ __contract__(
103
+ requires(buflen % 24 == 0)
104
+ requires(memory_no_alias(buf, buflen))
105
+ requires(table == mld_rej_uniform_table)
106
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
107
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
108
+ ensures(return_value <= MLDSA_N)
109
+ ensures(array_bound(r, 0, (unsigned) return_value, 0, MLDSA_Q))
110
+ );
111
+
112
+ #if !defined(MLD_CONFIG_NO_KEYPAIR_API)
113
+ #define mld_rej_uniform_eta2_aarch64_asm \
114
+ MLD_NAMESPACE(rej_uniform_eta2_aarch64_asm)
115
+ MLD_MUST_CHECK_RETURN_VALUE
116
+ uint64_t mld_rej_uniform_eta2_aarch64_asm(int32_t r[MLDSA_N],
117
+ const uint8_t *buf, unsigned buflen,
118
+ const uint8_t table[4096])
119
+ /* This must be kept in sync with the HOL-Light specification
120
+ * in proofs/hol_light/aarch64/proofs/mldsa_rej_uniform_eta2_aarch64_asm.ml */
121
+ __contract__(
122
+ requires(buflen % 8 == 0)
123
+ requires(buflen >= 8)
124
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
125
+ requires(memory_no_alias(buf, buflen))
126
+ requires(table == mld_rej_uniform_eta_table)
127
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
128
+ ensures(return_value <= MLDSA_N)
129
+ /* check-magic: 3 == 2 + 1 (asm is eta=2-specific) */
130
+ ensures(array_abs_bound(r, 0, return_value, 3))
131
+ );
132
+
133
+ #define mld_rej_uniform_eta4_aarch64_asm \
134
+ MLD_NAMESPACE(rej_uniform_eta4_aarch64_asm)
135
+ MLD_MUST_CHECK_RETURN_VALUE
136
+ uint64_t mld_rej_uniform_eta4_aarch64_asm(int32_t r[MLDSA_N],
137
+ const uint8_t *buf, unsigned buflen,
138
+ const uint8_t table[4096])
139
+ /* This must be kept in sync with the HOL-Light specification
140
+ * in proofs/hol_light/aarch64/proofs/mldsa_rej_uniform_eta4_aarch64_asm.ml */
141
+ __contract__(
142
+ requires(buflen % 8 == 0)
143
+ requires(buflen >= 8)
144
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
145
+ requires(memory_no_alias(buf, buflen))
146
+ requires(table == mld_rej_uniform_eta_table)
147
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
148
+ ensures(return_value <= MLDSA_N)
149
+ /* check-magic: 5 == 4 + 1 (asm is eta=4-specific) */
150
+ ensures(array_abs_bound(r, 0, return_value, 5))
151
+ );
152
+ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */
153
+
154
+ #if !defined(MLD_CONFIG_NO_SIGN_API)
155
+ #define mld_poly_decompose_32_aarch64_asm \
156
+ MLD_NAMESPACE(poly_decompose_32_aarch64_asm)
157
+ void mld_poly_decompose_32_aarch64_asm(int32_t a1[MLDSA_N], int32_t a0[MLDSA_N])
158
+ /* This must be kept in sync with the HOL-Light specification
159
+ * in proofs/hol_light/aarch64/proofs/mldsa_poly_decompose_32_aarch64_asm.ml */
160
+ __contract__(
161
+ requires(memory_no_alias(a1, sizeof(int32_t) * MLDSA_N))
162
+ requires(memory_no_alias(a0, sizeof(int32_t) * MLDSA_N))
163
+ requires(array_bound(a0, 0, MLDSA_N, 0, MLDSA_Q))
164
+ assigns(memory_slice(a1, sizeof(int32_t) * MLDSA_N))
165
+ assigns(memory_slice(a0, sizeof(int32_t) * MLDSA_N))
166
+ /* check-magic: 16 == (MLDSA_Q - 1) / (2 * ((MLDSA_Q - 1) / 32)) */
167
+ ensures(array_bound(a1, 0, MLDSA_N, 0, 16))
168
+ /* check-magic: 261889 == (MLDSA_Q - 1) / 32 + 1 */
169
+ ensures(array_abs_bound(a0, 0, MLDSA_N, 261889))
170
+ );
171
+
172
+ #define mld_poly_decompose_88_aarch64_asm \
173
+ MLD_NAMESPACE(poly_decompose_88_aarch64_asm)
174
+ void mld_poly_decompose_88_aarch64_asm(int32_t a1[MLDSA_N], int32_t a0[MLDSA_N])
175
+ /* This must be kept in sync with the HOL-Light specification
176
+ * in proofs/hol_light/aarch64/proofs/mldsa_poly_decompose_88_aarch64_asm.ml */
177
+ __contract__(
178
+ requires(memory_no_alias(a1, sizeof(int32_t) * MLDSA_N))
179
+ requires(memory_no_alias(a0, sizeof(int32_t) * MLDSA_N))
180
+ requires(array_bound(a0, 0, MLDSA_N, 0, MLDSA_Q))
181
+ assigns(memory_slice(a1, sizeof(int32_t) * MLDSA_N))
182
+ assigns(memory_slice(a0, sizeof(int32_t) * MLDSA_N))
183
+ /* check-magic: 44 == (MLDSA_Q - 1) / (2 * ((MLDSA_Q - 1) / 88)) */
184
+ ensures(array_bound(a1, 0, MLDSA_N, 0, 44))
185
+ /* check-magic: 95233 == (MLDSA_Q - 1) / 88 + 1 */
186
+ ensures(array_abs_bound(a0, 0, MLDSA_N, 95233))
187
+ );
188
+ #endif /* !MLD_CONFIG_NO_SIGN_API */
189
+
190
+ #define mld_poly_caddq_aarch64_asm MLD_NAMESPACE(poly_caddq_aarch64_asm)
191
+ void mld_poly_caddq_aarch64_asm(int32_t a[MLDSA_N])
192
+ /* This must be kept in sync with the HOL-Light specification
193
+ * in proofs/hol_light/aarch64/proofs/mldsa_poly_caddq_aarch64_asm.ml */
194
+ __contract__(
195
+ requires(memory_no_alias(a, sizeof(int32_t) * MLDSA_N))
196
+ requires(array_abs_bound(a, 0, MLDSA_N, MLDSA_Q))
197
+ assigns(memory_slice(a, sizeof(int32_t) * MLDSA_N))
198
+ ensures(array_bound(a, 0, MLDSA_N, 0, MLDSA_Q))
199
+ );
200
+
201
+ #if !defined(MLD_CONFIG_NO_VERIFY_API)
202
+ #define mld_poly_use_hint_32_aarch64_asm \
203
+ MLD_NAMESPACE(poly_use_hint_32_aarch64_asm)
204
+ void mld_poly_use_hint_32_aarch64_asm(int32_t a[MLDSA_N],
205
+ const int32_t h[MLDSA_N])
206
+ /* This must be kept in sync with the HOL-Light specification
207
+ * in proofs/hol_light/aarch64/proofs/mldsa_poly_use_hint_32_aarch64_asm.ml */
208
+ __contract__(
209
+ requires(memory_no_alias(a, sizeof(int32_t) * MLDSA_N))
210
+ requires(memory_no_alias(h, sizeof(int32_t) * MLDSA_N))
211
+ requires(array_bound(a, 0, MLDSA_N, 0, MLDSA_Q))
212
+ requires(array_bound(h, 0, MLDSA_N, 0, 2))
213
+ assigns(memory_slice(a, sizeof(int32_t) * MLDSA_N))
214
+ ensures(array_bound(a, 0, MLDSA_N, 0, 16))
215
+ );
216
+
217
+ #define mld_poly_use_hint_88_aarch64_asm \
218
+ MLD_NAMESPACE(poly_use_hint_88_aarch64_asm)
219
+ void mld_poly_use_hint_88_aarch64_asm(int32_t a[MLDSA_N],
220
+ const int32_t h[MLDSA_N])
221
+ /* This must be kept in sync with the HOL-Light specification
222
+ * in proofs/hol_light/aarch64/proofs/mldsa_poly_use_hint_88_aarch64_asm.ml */
223
+ __contract__(
224
+ requires(memory_no_alias(a, sizeof(int32_t) * MLDSA_N))
225
+ requires(memory_no_alias(h, sizeof(int32_t) * MLDSA_N))
226
+ requires(array_bound(a, 0, MLDSA_N, 0, MLDSA_Q))
227
+ requires(array_bound(h, 0, MLDSA_N, 0, 2))
228
+ assigns(memory_slice(a, sizeof(int32_t) * MLDSA_N))
229
+ ensures(array_bound(a, 0, MLDSA_N, 0, 44))
230
+ );
231
+ #endif /* !MLD_CONFIG_NO_VERIFY_API */
232
+
233
+ #define mld_poly_chknorm_aarch64_asm MLD_NAMESPACE(poly_chknorm_aarch64_asm)
234
+ MLD_MUST_CHECK_RETURN_VALUE
235
+ int mld_poly_chknorm_aarch64_asm(const int32_t a[MLDSA_N], int32_t B)
236
+ /* This must be kept in sync with the HOL-Light specification
237
+ * in proofs/hol_light/aarch64/proofs/mldsa_poly_chknorm_aarch64_asm.ml */
238
+ __contract__(
239
+ requires(memory_no_alias(a, sizeof(int32_t) * MLDSA_N))
240
+ /* HOL Light precondition: abs(ival(x i)) < 2^31, i.e., a[i] != INT32_MIN */
241
+ requires(forall(k0, 0, MLDSA_N, a[k0] > INT32_MIN))
242
+ ensures(return_value == 0 || return_value == 1)
243
+ ensures((return_value == 0) == array_abs_bound(a, 0, MLDSA_N, B))
244
+ );
245
+
246
+ #if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)
247
+ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44
248
+ #define mld_polyz_unpack_17_aarch64_asm \
249
+ MLD_NAMESPACE(polyz_unpack_17_aarch64_asm)
250
+ void mld_polyz_unpack_17_aarch64_asm(int32_t r[MLDSA_N], const uint8_t buf[576],
251
+ const uint8_t indices[64])
252
+ /* This must be kept in sync with the HOL-Light specification
253
+ * in proofs/hol_light/aarch64/proofs/mldsa_polyz_unpack_17_aarch64_asm.ml */
254
+ __contract__(
255
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
256
+ requires(memory_no_alias(buf, 576))
257
+ requires(indices == mld_polyz_unpack_17_indices)
258
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
259
+ ensures(array_bound(r, 0, MLDSA_N, -((1 << 17) - 1), (1 << 17) + 1))
260
+ );
261
+ #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \
262
+ */
263
+
264
+ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \
265
+ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)
266
+ #define mld_polyz_unpack_19_aarch64_asm \
267
+ MLD_NAMESPACE(polyz_unpack_19_aarch64_asm)
268
+ void mld_polyz_unpack_19_aarch64_asm(int32_t r[MLDSA_N], const uint8_t buf[640],
269
+ const uint8_t indices[64])
270
+ /* This must be kept in sync with the HOL-Light specification
271
+ * in proofs/hol_light/aarch64/proofs/mldsa_polyz_unpack_19_aarch64_asm.ml */
272
+ __contract__(
273
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
274
+ requires(memory_no_alias(buf, 640))
275
+ requires(indices == mld_polyz_unpack_19_indices)
276
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
277
+ ensures(array_bound(r, 0, MLDSA_N, -((1 << 19) - 1), (1 << 19) + 1))
278
+ );
279
+ #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \
280
+ || MLD_CONFIG_PARAMETER_SET == 87 */
281
+ #endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */
282
+
283
+ #if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) || \
284
+ defined(MLD_CONFIG_REDUCE_RAM) || defined(MLD_UNIT_TEST)
285
+ #define mld_poly_pointwise_montgomery_aarch64_asm \
286
+ MLD_NAMESPACE(poly_pointwise_montgomery_aarch64_asm)
287
+ void mld_poly_pointwise_montgomery_aarch64_asm(int32_t a[MLDSA_N],
288
+ const int32_t b[MLDSA_N])
289
+ /* This must be kept in sync with the HOL-Light specification
290
+ * in proofs/hol_light/aarch64/proofs/mldsa_pointwise_montgomery_aarch64_asm.ml
291
+ */
292
+ __contract__(
293
+ requires(memory_no_alias(a, sizeof(int32_t) * MLDSA_N))
294
+ requires(memory_no_alias(b, sizeof(int32_t) * MLDSA_N))
295
+ /* Input bound MLD_NTT_BOUND = 9 * MLD_FQMUL_BOUND, the guaranteed bound of
296
+ * any forward NTT implementation. Hardcoded here to keep this header free
297
+ * of poly.h. */
298
+ /* check-magic: 94279698 == 9 * ((5 * MLDSA_Q + 3) / 4) */
299
+ requires(array_abs_bound(a, 0, MLDSA_N, 94279698))
300
+ requires(array_abs_bound(b, 0, MLDSA_N, 94279698))
301
+ assigns(memory_slice(a, sizeof(int32_t) * MLDSA_N))
302
+ ensures(array_abs_bound(a, 0, MLDSA_N, 8380417))
303
+ );
304
+ #endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API || \
305
+ MLD_CONFIG_REDUCE_RAM || MLD_UNIT_TEST */
306
+
307
+ #define mld_polyvecl_pointwise_acc_montgomery_l4_aarch64_asm \
308
+ MLD_NAMESPACE(polyvecl_pointwise_acc_montgomery_l4_aarch64_asm)
309
+ void mld_polyvecl_pointwise_acc_montgomery_l4_aarch64_asm(
310
+ int32_t r[MLDSA_N], const int32_t a[4][MLDSA_N],
311
+ const int32_t b[4][MLDSA_N])
312
+ /* This must be kept in sync with the HOL-Light specification
313
+ * in
314
+ * proofs/hol_light/aarch64/proofs/mldsa_polyvecl_pointwise_acc_montgomery_l4_aarch64_asm.ml
315
+ */
316
+ __contract__(
317
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
318
+ requires(memory_no_alias(a, sizeof(int32_t) * 4 * MLDSA_N))
319
+ requires(memory_no_alias(b, sizeof(int32_t) * 4 * MLDSA_N))
320
+ requires(forall(l0, 0, 4, array_abs_bound(a[l0], 0, MLDSA_N, 8380417)))
321
+ /* check-magic: 94279698 == 9 * ((5 * MLDSA_Q + 3) / 4) */
322
+ requires(forall(l1, 0, 4, array_abs_bound(b[l1], 0, MLDSA_N, 94279698)))
323
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
324
+ ensures(array_abs_bound(r, 0, MLDSA_N, 8380417))
325
+ );
326
+
327
+ #define mld_polyvecl_pointwise_acc_montgomery_l5_aarch64_asm \
328
+ MLD_NAMESPACE(polyvecl_pointwise_acc_montgomery_l5_aarch64_asm)
329
+ void mld_polyvecl_pointwise_acc_montgomery_l5_aarch64_asm(
330
+ int32_t r[MLDSA_N], const int32_t a[5][MLDSA_N],
331
+ const int32_t b[5][MLDSA_N])
332
+ /* This must be kept in sync with the HOL-Light specification
333
+ * in
334
+ * proofs/hol_light/aarch64/proofs/mldsa_polyvecl_pointwise_acc_montgomery_l5_aarch64_asm.ml
335
+ */
336
+ __contract__(
337
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
338
+ requires(memory_no_alias(a, sizeof(int32_t) * 5 * MLDSA_N))
339
+ requires(memory_no_alias(b, sizeof(int32_t) * 5 * MLDSA_N))
340
+ requires(forall(l0, 0, 5, array_abs_bound(a[l0], 0, MLDSA_N, 8380417)))
341
+ /* check-magic: 94279698 == 9 * ((5 * MLDSA_Q + 3) / 4) */
342
+ requires(forall(l1, 0, 5, array_abs_bound(b[l1], 0, MLDSA_N, 94279698)))
343
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
344
+ ensures(array_abs_bound(r, 0, MLDSA_N, 8380417))
345
+ );
346
+
347
+ #define mld_polyvecl_pointwise_acc_montgomery_l7_aarch64_asm \
348
+ MLD_NAMESPACE(polyvecl_pointwise_acc_montgomery_l7_aarch64_asm)
349
+ void mld_polyvecl_pointwise_acc_montgomery_l7_aarch64_asm(
350
+ int32_t r[MLDSA_N], const int32_t a[7][MLDSA_N],
351
+ const int32_t b[7][MLDSA_N])
352
+ /* This must be kept in sync with the HOL-Light specification
353
+ * in
354
+ * proofs/hol_light/aarch64/proofs/mldsa_polyvecl_pointwise_acc_montgomery_l7_aarch64_asm.ml
355
+ */
356
+ __contract__(
357
+ requires(memory_no_alias(r, sizeof(int32_t) * MLDSA_N))
358
+ requires(memory_no_alias(a, sizeof(int32_t) * 7 * MLDSA_N))
359
+ requires(memory_no_alias(b, sizeof(int32_t) * 7 * MLDSA_N))
360
+ requires(forall(l0, 0, 7, array_abs_bound(a[l0], 0, MLDSA_N, 8380417)))
361
+ /* check-magic: 94279698 == 9 * ((5 * MLDSA_Q + 3) / 4) */
362
+ requires(forall(l1, 0, 7, array_abs_bound(b[l1], 0, MLDSA_N, 94279698)))
363
+ assigns(memory_slice(r, sizeof(int32_t) * MLDSA_N))
364
+ ensures(array_abs_bound(r, 0, MLDSA_N, 8380417))
365
+ );
366
+
367
+ #endif /* !MLD_NATIVE_AARCH64_SRC_ARITH_NATIVE_AARCH64_H */