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,277 @@
1
+ /*
2
+ * Copyright (c) The mldsa-native project authors
3
+ * SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
4
+ */
5
+
6
+ /* References
7
+ * ==========
8
+ *
9
+ * - [FIPS204]
10
+ * FIPS 204 Module-Lattice-Based Digital Signature Standard
11
+ * National Institute of Standards and Technology
12
+ * https://csrc.nist.gov/pubs/fips/204/final
13
+ */
14
+
15
+ #ifndef MLD_PACKING_H
16
+ #define MLD_PACKING_H
17
+
18
+ #include "polyvec.h"
19
+ #include "polyvec_lazy.h"
20
+
21
+ #if !defined(MLD_CONFIG_NO_KEYPAIR_API)
22
+ #define mld_pack_sk_s1 MLD_NAMESPACE_KL(pack_sk_s1)
23
+ /**
24
+ * Bit-pack the s1 component into the secret key.
25
+ *
26
+ * @spec{Partially implements @[FIPS204, Algorithm 24, skEncode] (s1
27
+ * component).}
28
+ *
29
+ * @param[out] sk Output byte array.
30
+ * @param[in] s1 Pointer to vector s1.
31
+ */
32
+ MLD_INTERNAL_API
33
+ void mld_pack_sk_s1(uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES],
34
+ const mld_polyvecl *s1)
35
+ __contract__(
36
+ requires(memory_no_alias(sk, MLDSA_CRYPTO_SECRETKEYBYTES))
37
+ requires(memory_no_alias(s1, sizeof(mld_polyvecl)))
38
+ requires(forall(k1, 0, MLDSA_L,
39
+ array_abs_bound(s1->vec[k1].coeffs, 0, MLDSA_N, MLDSA_ETA + 1)))
40
+ assigns(memory_slice(sk, MLDSA_CRYPTO_SECRETKEYBYTES))
41
+ );
42
+
43
+ #define mld_pack_sk_rho_key_tr_s2 MLD_NAMESPACE_KL(pack_sk_rho_key_tr_s2)
44
+ /**
45
+ * Bit-pack rho, key, tr, s2 into the secret key.
46
+ *
47
+ * s1 must already be packed via mld_pack_sk_s1, and t0 via
48
+ * mld_compute_pack_t0_t1.
49
+ *
50
+ * @spec{Partially implements @[FIPS204, Algorithm 24, skEncode] (rho, key, tr,
51
+ * s2 components).}
52
+ *
53
+ * @param[out] sk Output byte array.
54
+ * @param[in] rho Byte array containing rho.
55
+ * @param[in] tr Byte array containing tr.
56
+ * @param[in] key Byte array containing key.
57
+ * @param[in] s2 Pointer to vector s2.
58
+ */
59
+ MLD_INTERNAL_API
60
+ void mld_pack_sk_rho_key_tr_s2(uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES],
61
+ const uint8_t rho[MLDSA_SEEDBYTES],
62
+ const uint8_t tr[MLDSA_TRBYTES],
63
+ const uint8_t key[MLDSA_SEEDBYTES],
64
+ const mld_polyveck *s2)
65
+ __contract__(
66
+ requires(memory_no_alias(sk, MLDSA_CRYPTO_SECRETKEYBYTES))
67
+ requires(memory_no_alias(rho, MLDSA_SEEDBYTES))
68
+ requires(memory_no_alias(tr, MLDSA_TRBYTES))
69
+ requires(memory_no_alias(key, MLDSA_SEEDBYTES))
70
+ requires(memory_no_alias(s2, sizeof(mld_polyveck)))
71
+ requires(forall(k2, 0, MLDSA_K,
72
+ array_abs_bound(s2->vec[k2].coeffs, 0, MLDSA_N, MLDSA_ETA + 1)))
73
+ assigns(memory_slice(sk, MLDSA_CRYPTO_SECRETKEYBYTES))
74
+ );
75
+ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */
76
+
77
+
78
+ #if !defined(MLD_CONFIG_NO_SIGN_API)
79
+ #define mld_pack_sig_c MLD_NAMESPACE_KL(pack_sig_c)
80
+ /**
81
+ * Bit-pack challenge c into sig = (c, z, h).
82
+ *
83
+ * @spec{Partially implements @[FIPS204, Algorithm 26, sigEncode] (c
84
+ * component).}
85
+ *
86
+ * @param[out] sig Output byte array.
87
+ * @param[in] c Pointer to challenge hash.
88
+ */
89
+ MLD_INTERNAL_API
90
+ void mld_pack_sig_c(uint8_t sig[MLDSA_CRYPTO_BYTES],
91
+ const uint8_t c[MLDSA_CTILDEBYTES])
92
+ __contract__(
93
+ requires(memory_no_alias(sig, MLDSA_CRYPTO_BYTES))
94
+ requires(memory_no_alias(c, MLDSA_CTILDEBYTES))
95
+ assigns(memory_slice(sig, MLDSA_CRYPTO_BYTES))
96
+ );
97
+
98
+ #define mld_pack_sig_h MLD_NAMESPACE_KL(pack_sig_h)
99
+ /**
100
+ * Compute hints from (w0, w1) and pack them into the hint section of sig.
101
+ *
102
+ * @spec{Combines the hint computation @[FIPS204, Algorithm 39, MakeHint] with
103
+ * the packing @[FIPS204, Algorithm 20, HintBitPack] (the h component of
104
+ * @[FIPS204, Algorithm 26, sigEncode]): it computes the hint vector h from
105
+ * (w0, w1) and packs it, rather than receiving a ready-made h as HintBitPack
106
+ * does. The hints are computed via mld_make_hint (rounding.h), a specialized
107
+ * MakeHint valid only for the values arising during signing; see the block
108
+ * comment in mld_attempt_signature_generation (sign.c).}
109
+ *
110
+ * @param[in,out] sig Byte array containing signature.
111
+ * @param[in] w0 Pointer to low part of input vector.
112
+ * @param[in] w1 Pointer to high part of input vector.
113
+ *
114
+ * @retval 0 Success.
115
+ * @retval MLD_ERR_FAIL The total number of hints exceeds MLDSA_OMEGA. In this
116
+ * case the hint section of sig is left in a
117
+ * partially-written state and the caller must reject the
118
+ * signature.
119
+ */
120
+ MLD_INTERNAL_API
121
+ MLD_MUST_CHECK_RETURN_VALUE
122
+ int mld_pack_sig_h(uint8_t sig[MLDSA_CRYPTO_BYTES], const mld_polyveck *w0,
123
+ const mld_polyveck *w1)
124
+ __contract__(
125
+ requires(memory_no_alias(sig, MLDSA_CRYPTO_BYTES))
126
+ requires(memory_no_alias(w0, sizeof(mld_polyveck)))
127
+ requires(memory_no_alias(w1, sizeof(mld_polyveck)))
128
+ assigns(memory_slice(sig + MLDSA_SIG_H_OFFSET, MLDSA_POLYVECH_PACKEDBYTES))
129
+ ensures(return_value == 0 || return_value == MLD_ERR_FAIL)
130
+ );
131
+
132
+ #define mld_pack_sig_z MLD_NAMESPACE_KL(pack_sig_z)
133
+ /**
134
+ * Bit-pack single polynomial of z component of sig = (c, z, h).
135
+ *
136
+ * The c and h components are packed separately using mld_pack_sig_c and
137
+ * mld_pack_sig_h.
138
+ *
139
+ * @spec{Partially implements @[FIPS204, Algorithm 26, sigEncode] (one
140
+ * polynomial of the z component).}
141
+ *
142
+ * @param[in,out] sig Output byte array.
143
+ * @param[in] zi Pointer to a single polynomial in z.
144
+ * @param i Index of zi in vector z.
145
+ */
146
+ MLD_INTERNAL_API
147
+ void mld_pack_sig_z(uint8_t sig[MLDSA_CRYPTO_BYTES], const mld_poly *zi,
148
+ unsigned i)
149
+ __contract__(
150
+ requires(memory_no_alias(sig, MLDSA_CRYPTO_BYTES))
151
+ requires(memory_no_alias(zi, sizeof(mld_poly)))
152
+ requires(i < MLDSA_L)
153
+ requires(array_bound(zi->coeffs, 0, MLDSA_N, -(MLDSA_GAMMA1 - 1), MLDSA_GAMMA1 + 1))
154
+ assigns(memory_slice(sig, MLDSA_CRYPTO_BYTES))
155
+ );
156
+ #endif /* !MLD_CONFIG_NO_SIGN_API */
157
+
158
+ #if !defined(MLD_CONFIG_NO_VERIFY_API)
159
+ #define mld_unpack_pk_t1 MLD_NAMESPACE_KL(unpack_pk_t1)
160
+ /**
161
+ * Unpack a single polynomial of the t1 component of a public key
162
+ * pk = (rho, t1).
163
+ *
164
+ * @spec{Partially implements @[FIPS204, Algorithm 23, pkDecode] (one polynomial
165
+ * of t1).}
166
+ *
167
+ * @param[out] t1 Pointer to output polynomial t1[i].
168
+ * @param[in] pk Byte array containing bit-packed pk.
169
+ * @param i Row index, must be < MLDSA_K.
170
+ */
171
+ MLD_INTERNAL_API
172
+ void mld_unpack_pk_t1(mld_poly *t1,
173
+ const uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES],
174
+ unsigned int i)
175
+ __contract__(
176
+ requires(memory_no_alias(pk, MLDSA_CRYPTO_PUBLICKEYBYTES))
177
+ requires(memory_no_alias(t1, sizeof(mld_poly)))
178
+ requires(i < MLDSA_K)
179
+ assigns(memory_slice(t1, sizeof(mld_poly)))
180
+ ensures(array_bound(t1->coeffs, 0, MLDSA_N, 0, 1 << 10))
181
+ );
182
+ #endif /* !MLD_CONFIG_NO_VERIFY_API */
183
+
184
+ #if !defined(MLD_CONFIG_NO_SIGN_API)
185
+ #define mld_unpack_sk MLD_NAMESPACE_KL(unpack_sk)
186
+ /**
187
+ * Unpack secret key sk = (rho, tr, key, t0, s1, s2).
188
+ *
189
+ * NOTE: In REDUCE_RAM mode, s1/s2/t0 borrow from sk rather than copying.
190
+ *
191
+ * @spec{Implements @[FIPS204, Algorithm 25, skDecode].}
192
+ *
193
+ * @param[out] rho Output byte array for rho.
194
+ * @param[out] tr Output byte array for tr.
195
+ * @param[out] key Output byte array for key.
196
+ * @param[out] t0 Pointer to output vector t0.
197
+ * @param[out] s1 Pointer to output vector s1.
198
+ * @param[out] s2 Pointer to output vector s2.
199
+ * @param[in] sk Byte array containing bit-packed sk.
200
+ */
201
+ MLD_INTERNAL_API
202
+ void mld_unpack_sk(uint8_t rho[MLDSA_SEEDBYTES], uint8_t tr[MLDSA_TRBYTES],
203
+ uint8_t key[MLDSA_SEEDBYTES], mld_sk_t0hat *t0,
204
+ mld_sk_s1hat *s1, mld_sk_s2hat *s2,
205
+ const uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES])
206
+ __contract__(
207
+ requires(memory_no_alias(rho, MLDSA_SEEDBYTES))
208
+ requires(memory_no_alias(tr, MLDSA_TRBYTES))
209
+ requires(memory_no_alias(key, MLDSA_SEEDBYTES))
210
+ requires(memory_no_alias(t0, sizeof(mld_sk_t0hat)))
211
+ requires(memory_no_alias(s1, sizeof(mld_sk_s1hat)))
212
+ requires(memory_no_alias(s2, sizeof(mld_sk_s2hat)))
213
+ requires(memory_no_alias(sk, MLDSA_CRYPTO_SECRETKEYBYTES))
214
+ assigns(memory_slice(rho, MLDSA_SEEDBYTES))
215
+ assigns(memory_slice(tr, MLDSA_TRBYTES))
216
+ assigns(memory_slice(key, MLDSA_SEEDBYTES))
217
+ assigns(memory_slice(t0, sizeof(mld_sk_t0hat)))
218
+ assigns(memory_slice(s1, sizeof(mld_sk_s1hat)))
219
+ assigns(memory_slice(s2, sizeof(mld_sk_s2hat)))
220
+ MLD_IF_NOT_REDUCE_RAM(
221
+ ensures(forall(k0, 0, MLDSA_K,
222
+ array_abs_bound(t0->vec.vec[k0].coeffs, 0, MLDSA_N, MLD_NTT_BOUND)))
223
+ ensures(forall(k1, 0, MLDSA_L,
224
+ array_abs_bound(s1->vec.vec[k1].coeffs, 0, MLDSA_N, MLD_NTT_BOUND)))
225
+ ensures(forall(k2, 0, MLDSA_K,
226
+ array_abs_bound(s2->vec.vec[k2].coeffs, 0, MLDSA_N, MLD_NTT_BOUND)))
227
+ )
228
+ MLD_IF_REDUCE_RAM(
229
+ ensures(s1->packed == old(sk) + MLDSA_SK_S1_OFFSET)
230
+ ensures(s2->packed == old(sk) + MLDSA_SK_S2_OFFSET)
231
+ ensures(t0->packed == old(sk) + MLDSA_SK_T0_OFFSET)
232
+ )
233
+ );
234
+ #endif /* !MLD_CONFIG_NO_SIGN_API */
235
+
236
+ #if !defined(MLD_CONFIG_NO_VERIFY_API)
237
+ #define mld_sig_unpack_hints MLD_NAMESPACE_KL(sig_unpack_hints)
238
+ /**
239
+ * Decode and validate a single row of the hint vector h from a signature
240
+ * buffer.
241
+ *
242
+ * The hint encoding is shared across all rows (a count array followed by a
243
+ * single index list), so this function performs the validation relevant to
244
+ * row i:
245
+ * - the i'th hint count is non-decreasing and bounded by MLDSA_OMEGA;
246
+ * - the indices for row i are strictly ascending;
247
+ * - on i == MLDSA_K - 1, the trailing index slots are zero.
248
+ *
249
+ * Callers must invoke this for every i in [0, 1, .., MLDSA_K - 1]; if any
250
+ * call returns MLD_ERR_FAIL the encoding is malformed and the signature must
251
+ * be rejected.
252
+ *
253
+ * @spec{Implements @[FIPS204, Algorithm 21, HintBitUnpack] (one row; part of
254
+ * @[FIPS204, Algorithm 27, sigDecode]).}
255
+ *
256
+ * @param[out] h Pointer to output polynomial h[i].
257
+ * @param[in] sig Signature buffer.
258
+ * @param i Row index, must be < MLDSA_K.
259
+ *
260
+ * @retval 0 Hints were decoded successfully.
261
+ * @retval MLD_ERR_FAIL Hints are malformed.
262
+ */
263
+ MLD_INTERNAL_API
264
+ MLD_MUST_CHECK_RETURN_VALUE
265
+ int mld_sig_unpack_hints(mld_poly *h, const uint8_t sig[MLDSA_CRYPTO_BYTES],
266
+ unsigned int i)
267
+ __contract__(
268
+ requires(memory_no_alias(sig, MLDSA_CRYPTO_BYTES))
269
+ requires(memory_no_alias(h, sizeof(mld_poly)))
270
+ requires(i < MLDSA_K)
271
+ assigns(memory_slice(h, sizeof(mld_poly)))
272
+ ensures(return_value == 0 || return_value == MLD_ERR_FAIL)
273
+ ensures(return_value == 0 ==> array_bound(h->coeffs, 0, MLDSA_N, 0, 2))
274
+ );
275
+ #endif /* !MLD_CONFIG_NO_VERIFY_API */
276
+
277
+ #endif /* !MLD_PACKING_H */
@@ -0,0 +1,153 @@
1
+ /*
2
+ * Copyright (c) The mldsa-native project authors
3
+ * SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
4
+ */
5
+ #ifndef MLD_PARAMS_H
6
+ #define MLD_PARAMS_H
7
+
8
+ #define MLDSA_SEEDBYTES 32
9
+ #define MLDSA_CRHBYTES 64
10
+ #define MLDSA_TRBYTES 64
11
+ #define MLDSA_RNDBYTES 32
12
+ #define MLDSA_N 256
13
+ #define MLDSA_Q 8380417
14
+ #define MLDSA_Q_HALF ((MLDSA_Q + 1) / 2)
15
+ #define MLDSA_D 13
16
+
17
+ #define MLDSA_GAMMA2_88 ((MLDSA_Q - 1) / 88)
18
+ #define MLDSA_GAMMA2_32 ((MLDSA_Q - 1) / 32)
19
+ #define MLDSA_POLYW1_PACKEDBYTES_88 192
20
+ #define MLDSA_POLYW1_PACKEDBYTES_32 128
21
+
22
+ #if MLD_CONFIG_PARAMETER_SET == 44
23
+
24
+ #define MLDSA_K 4
25
+ #define MLDSA_L 4
26
+ #define MLDSA_ETA 2
27
+ #define MLDSA_TAU 39
28
+ #define MLDSA_BETA 78
29
+ #define MLDSA_GAMMA1 ((int32_t)1 << 17)
30
+ #define MLDSA_GAMMA2 MLDSA_GAMMA2_88
31
+ #define MLDSA_OMEGA 80
32
+ #define MLDSA_CTILDEBYTES 32
33
+ #define MLDSA_POLYZ_PACKEDBYTES 576
34
+ #define MLDSA_POLYW1_PACKEDBYTES MLDSA_POLYW1_PACKEDBYTES_88
35
+ #define MLDSA_POLYETA_PACKEDBYTES 96
36
+
37
+ #elif MLD_CONFIG_PARAMETER_SET == 65
38
+
39
+ #define MLDSA_K 6
40
+ #define MLDSA_L 5
41
+ #define MLDSA_ETA 4
42
+ #define MLDSA_TAU 49
43
+ #define MLDSA_BETA 196
44
+ #define MLDSA_GAMMA1 ((int32_t)1 << 19)
45
+ #define MLDSA_GAMMA2 MLDSA_GAMMA2_32
46
+ #define MLDSA_OMEGA 55
47
+ #define MLDSA_CTILDEBYTES 48
48
+ #define MLDSA_POLYZ_PACKEDBYTES 640
49
+ #define MLDSA_POLYW1_PACKEDBYTES MLDSA_POLYW1_PACKEDBYTES_32
50
+ #define MLDSA_POLYETA_PACKEDBYTES 128
51
+
52
+ #elif MLD_CONFIG_PARAMETER_SET == 87
53
+
54
+ #define MLDSA_K 8
55
+ #define MLDSA_L 7
56
+ #define MLDSA_ETA 2
57
+ #define MLDSA_TAU 60
58
+ #define MLDSA_BETA 120
59
+ #define MLDSA_GAMMA1 ((int32_t)1 << 19)
60
+ #define MLDSA_GAMMA2 MLDSA_GAMMA2_32
61
+ #define MLDSA_OMEGA 75
62
+ #define MLDSA_CTILDEBYTES 64
63
+ #define MLDSA_POLYZ_PACKEDBYTES 640
64
+ #define MLDSA_POLYW1_PACKEDBYTES MLDSA_POLYW1_PACKEDBYTES_32
65
+ #define MLDSA_POLYETA_PACKEDBYTES 96
66
+
67
+ #endif /* MLD_CONFIG_PARAMETER_SET == 87 */
68
+
69
+ #define MLDSA_POLYT1_PACKEDBYTES 320
70
+ #define MLDSA_POLYT0_PACKEDBYTES 416
71
+ #define MLDSA_POLYVECH_PACKEDBYTES (MLDSA_OMEGA + MLDSA_K)
72
+
73
+ /* Sampling y from counter kappa uses nonces kappa, ..., kappa+L-1, which fit in
74
+ * uint16_t iff kappa <= UINT16_MAX - MLDSA_L. With kappa = attempt*MLDSA_L this
75
+ * bounds the number of signing attempts by MLD_MAX_KAPPA / MLDSA_L; see
76
+ * MLD_MAX_SIGNING_ATTEMPTS in sign.c. */
77
+ #define MLD_MAX_KAPPA (UINT16_MAX - MLDSA_L)
78
+
79
+ /* Layout of the packed public key pk[MLDSA_CRYPTO_PUBLICKEYBYTES] = (rho, t1):
80
+ *
81
+ * +-------------+--------------------------+
82
+ * | rho | t1 |
83
+ * +-------------+--------------------------+
84
+ * | SEEDBYTES | K * POLYT1_PACKEDBYTES |
85
+ * +-------------+--------------------------+
86
+ */
87
+ #define MLDSA_PK_RHO_OFFSET 0
88
+ #define MLDSA_PK_RHO_BYTES MLDSA_SEEDBYTES
89
+
90
+ #define MLDSA_PK_T1_OFFSET (MLDSA_PK_RHO_OFFSET + MLDSA_PK_RHO_BYTES)
91
+ #define MLDSA_PK_T1_BYTES (MLDSA_K * MLDSA_POLYT1_PACKEDBYTES)
92
+
93
+ #define MLDSA_PK_END (MLDSA_PK_T1_OFFSET + MLDSA_PK_T1_BYTES)
94
+
95
+ #define MLDSA_CRYPTO_PUBLICKEYBYTES MLDSA_PK_END
96
+
97
+ /* Layout of the packed secret key
98
+ * sk[MLDSA_CRYPTO_SECRETKEYBYTES] = (rho, key, tr, s1, s2, t0):
99
+ *
100
+ * +-----------+-----------+-----------+-----------+-----------+-----------+
101
+ * | rho | key | tr | s1 | s2 | t0 |
102
+ * +-----------+-----------+-----------+-----------+-----------+-----------+
103
+ * | SEEDBYTES | SEEDBYTES | TRBYTES | L * | K * | K * |
104
+ * | | | | POLYETA_ | POLYETA_ | POLYT0_ |
105
+ * | | | | PACKED- | PACKED- | PACKED- |
106
+ * | | | | BYTES | BYTES | BYTES |
107
+ * +-----------+-----------+-----------+-----------+-----------+-----------+
108
+ */
109
+ #define MLDSA_SK_RHO_OFFSET 0
110
+ #define MLDSA_SK_RHO_BYTES MLDSA_SEEDBYTES
111
+
112
+ #define MLDSA_SK_KEY_OFFSET (MLDSA_SK_RHO_OFFSET + MLDSA_SK_RHO_BYTES)
113
+ #define MLDSA_SK_KEY_BYTES MLDSA_SEEDBYTES
114
+
115
+ #define MLDSA_SK_TR_OFFSET (MLDSA_SK_KEY_OFFSET + MLDSA_SK_KEY_BYTES)
116
+ #define MLDSA_SK_TR_BYTES MLDSA_TRBYTES
117
+
118
+ #define MLDSA_SK_S1_OFFSET (MLDSA_SK_TR_OFFSET + MLDSA_SK_TR_BYTES)
119
+ #define MLDSA_SK_S1_BYTES (MLDSA_L * MLDSA_POLYETA_PACKEDBYTES)
120
+
121
+ #define MLDSA_SK_S2_OFFSET (MLDSA_SK_S1_OFFSET + MLDSA_SK_S1_BYTES)
122
+ #define MLDSA_SK_S2_BYTES (MLDSA_K * MLDSA_POLYETA_PACKEDBYTES)
123
+
124
+ #define MLDSA_SK_T0_OFFSET (MLDSA_SK_S2_OFFSET + MLDSA_SK_S2_BYTES)
125
+ #define MLDSA_SK_T0_BYTES (MLDSA_K * MLDSA_POLYT0_PACKEDBYTES)
126
+
127
+ #define MLDSA_SK_END (MLDSA_SK_T0_OFFSET + MLDSA_SK_T0_BYTES)
128
+
129
+ #define MLDSA_CRYPTO_SECRETKEYBYTES MLDSA_SK_END
130
+
131
+ /* Layout of the packed signature sig[MLDSA_CRYPTO_BYTES] = (c, z, h):
132
+ *
133
+ * +----------------+-------------------+----------------------+
134
+ * | c (challenge) | z | h (hints) |
135
+ * +----------------+-------------------+----------------------+
136
+ * | CTILDEBYTES | L * | POLYVECH_PACKEDBYTES |
137
+ * | | POLYZ_PACKEDBYTES | (= OMEGA + K) |
138
+ * +----------------+-------------------+----------------------+
139
+ */
140
+ #define MLDSA_SIG_C_OFFSET 0
141
+ #define MLDSA_SIG_C_BYTES MLDSA_CTILDEBYTES
142
+
143
+ #define MLDSA_SIG_Z_OFFSET (MLDSA_SIG_C_OFFSET + MLDSA_SIG_C_BYTES)
144
+ #define MLDSA_SIG_Z_BYTES (MLDSA_L * MLDSA_POLYZ_PACKEDBYTES)
145
+
146
+ #define MLDSA_SIG_H_OFFSET (MLDSA_SIG_Z_OFFSET + MLDSA_SIG_Z_BYTES)
147
+ #define MLDSA_SIG_H_BYTES MLDSA_POLYVECH_PACKEDBYTES
148
+
149
+ #define MLDSA_SIG_END (MLDSA_SIG_H_OFFSET + MLDSA_SIG_H_BYTES)
150
+
151
+ #define MLDSA_CRYPTO_BYTES MLDSA_SIG_END
152
+
153
+ #endif /* !MLD_PARAMS_H */