kpqc 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 (191) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +21 -0
  4. data/README.md +174 -0
  5. data/Rakefile +57 -0
  6. data/THIRD_PARTY_NOTICES.md +53 -0
  7. data/ext/kpqc/aimer128f/extconf.rb +4 -0
  8. data/ext/kpqc/aimer128s/extconf.rb +4 -0
  9. data/ext/kpqc/aimer192f/extconf.rb +4 -0
  10. data/ext/kpqc/aimer192s/extconf.rb +4 -0
  11. data/ext/kpqc/aimer256f/extconf.rb +4 -0
  12. data/ext/kpqc/aimer256s/extconf.rb +4 -0
  13. data/ext/kpqc/extconf_helper.rb +93 -0
  14. data/ext/kpqc/haetae2/extconf.rb +4 -0
  15. data/ext/kpqc/haetae3/extconf.rb +4 -0
  16. data/ext/kpqc/haetae5/extconf.rb +4 -0
  17. data/ext/kpqc/module.c +195 -0
  18. data/ext/kpqc/ntruplus1152/extconf.rb +4 -0
  19. data/ext/kpqc/ntruplus768/extconf.rb +4 -0
  20. data/ext/kpqc/ntruplus864/extconf.rb +4 -0
  21. data/ext/kpqc/randombytes.c +107 -0
  22. data/ext/kpqc/smaugt128/extconf.rb +4 -0
  23. data/ext/kpqc/smaugt192/extconf.rb +4 -0
  24. data/ext/kpqc/smaugt256/extconf.rb +4 -0
  25. data/ext/kpqc/timer/extconf.rb +4 -0
  26. data/kpqc.gemspec +41 -0
  27. data/lib/kpqc/aimer.rb +38 -0
  28. data/lib/kpqc/api.rb +129 -0
  29. data/lib/kpqc/haetae.rb +25 -0
  30. data/lib/kpqc/ntruplus.rb +25 -0
  31. data/lib/kpqc/smaugt.rb +29 -0
  32. data/lib/kpqc/types.rb +103 -0
  33. data/lib/kpqc/version.rb +6 -0
  34. data/lib/kpqc.rb +33 -0
  35. data/test/algorithm_test.rb +111 -0
  36. data/test/api_test.rb +52 -0
  37. data/test/interop.mjs +34 -0
  38. data/test/interop_test.rb +82 -0
  39. data/test/kat/aimer128f.rsp +10 -0
  40. data/test/kat/aimer128s.rsp +10 -0
  41. data/test/kat/aimer192f.rsp +10 -0
  42. data/test/kat/aimer192s.rsp +10 -0
  43. data/test/kat/aimer256f.rsp +10 -0
  44. data/test/kat/aimer256s.rsp +10 -0
  45. data/test/kat/haetae2.rsp +10 -0
  46. data/test/kat/haetae3.rsp +10 -0
  47. data/test/kat/haetae5.rsp +10 -0
  48. data/test/kat/ntruplus1152.rsp +8 -0
  49. data/test/kat/ntruplus768.rsp +8 -0
  50. data/test/kat/ntruplus864.rsp +8 -0
  51. data/test/kat/smaugt128.rsp +8 -0
  52. data/test/kat/smaugt192.rsp +8 -0
  53. data/test/kat/smaugt256.rsp +8 -0
  54. data/test/kat/timer.rsp +8 -0
  55. data/test/kat_drbg.rb +155 -0
  56. data/test/kat_test.rb +99 -0
  57. data/test/test_helper.rb +21 -0
  58. data/vendor/AIMer/LICENSE +21 -0
  59. data/vendor/AIMer/aim2.c +163 -0
  60. data/vendor/AIMer/aim2.h +36 -0
  61. data/vendor/AIMer/aim2_constant.h +74 -0
  62. data/vendor/AIMer/api.h +42 -0
  63. data/vendor/AIMer/common/crypto_declassify.h +7 -0
  64. data/vendor/AIMer/common/fips202.c +878 -0
  65. data/vendor/AIMer/common/fips202.h +166 -0
  66. data/vendor/AIMer/common/rng.h +56 -0
  67. data/vendor/AIMer/field.h +43 -0
  68. data/vendor/AIMer/field128.c +454 -0
  69. data/vendor/AIMer/field192.c +485 -0
  70. data/vendor/AIMer/field256.c +564 -0
  71. data/vendor/AIMer/hash.c +50 -0
  72. data/vendor/AIMer/hash.h +37 -0
  73. data/vendor/AIMer/params/params-aimer-128f.h +34 -0
  74. data/vendor/AIMer/params/params-aimer-128s.h +34 -0
  75. data/vendor/AIMer/params/params-aimer-192f.h +34 -0
  76. data/vendor/AIMer/params/params-aimer-192s.h +34 -0
  77. data/vendor/AIMer/params/params-aimer-256f.h +34 -0
  78. data/vendor/AIMer/params/params-aimer-256s.h +34 -0
  79. data/vendor/AIMer/params.h +5 -0
  80. data/vendor/AIMer/sign.c +631 -0
  81. data/vendor/AIMer/sign.h +40 -0
  82. data/vendor/AIMer/tree.c +75 -0
  83. data/vendor/AIMer/tree.h +26 -0
  84. data/vendor/HAETAE/LICENSE +22 -0
  85. data/vendor/HAETAE/include/api.h +54 -0
  86. data/vendor/HAETAE/include/common.h +12 -0
  87. data/vendor/HAETAE/include/config.h +42 -0
  88. data/vendor/HAETAE/include/decompose.h +19 -0
  89. data/vendor/HAETAE/include/encoding.h +20 -0
  90. data/vendor/HAETAE/include/fft.h +26 -0
  91. data/vendor/HAETAE/include/fips202.h +40 -0
  92. data/vendor/HAETAE/include/fixpoint.h +125 -0
  93. data/vendor/HAETAE/include/ntt.h +16 -0
  94. data/vendor/HAETAE/include/packing.h +58 -0
  95. data/vendor/HAETAE/include/params.h +117 -0
  96. data/vendor/HAETAE/include/poly.h +65 -0
  97. data/vendor/HAETAE/include/polyfix.h +65 -0
  98. data/vendor/HAETAE/include/polymat.h +32 -0
  99. data/vendor/HAETAE/include/polyvec.h +131 -0
  100. data/vendor/HAETAE/include/randombytes.h +39 -0
  101. data/vendor/HAETAE/include/rans_byte.h +335 -0
  102. data/vendor/HAETAE/include/reduce.h +31 -0
  103. data/vendor/HAETAE/include/sampler.h +23 -0
  104. data/vendor/HAETAE/include/symmetric.h +52 -0
  105. data/vendor/HAETAE/src/decompose.c +73 -0
  106. data/vendor/HAETAE/src/encoding.c +700 -0
  107. data/vendor/HAETAE/src/fft.c +235 -0
  108. data/vendor/HAETAE/src/fips202.c +745 -0
  109. data/vendor/HAETAE/src/fixpoint.c +143 -0
  110. data/vendor/HAETAE/src/ntt.c +98 -0
  111. data/vendor/HAETAE/src/packing.c +595 -0
  112. data/vendor/HAETAE/src/poly.c +371 -0
  113. data/vendor/HAETAE/src/polyfix.c +298 -0
  114. data/vendor/HAETAE/src/polymat.c +82 -0
  115. data/vendor/HAETAE/src/polyvec.c +534 -0
  116. data/vendor/HAETAE/src/reduce.c +96 -0
  117. data/vendor/HAETAE/src/sampler.c +310 -0
  118. data/vendor/HAETAE/src/sign.c +558 -0
  119. data/vendor/HAETAE/src/symmetric-shake.c +50 -0
  120. data/vendor/NTRUplus/LICENSE +21 -0
  121. data/vendor/NTRUplus/NTRU+1152/api.h +24 -0
  122. data/vendor/NTRUplus/NTRU+1152/fips202/fips202.c +878 -0
  123. data/vendor/NTRUplus/NTRU+1152/fips202/fips202.h +166 -0
  124. data/vendor/NTRUplus/NTRU+1152/kem.c +286 -0
  125. data/vendor/NTRUplus/NTRU+1152/ntt.c +394 -0
  126. data/vendor/NTRUplus/NTRU+1152/ntt.h +16 -0
  127. data/vendor/NTRUplus/NTRU+1152/params.h +18 -0
  128. data/vendor/NTRUplus/NTRU+1152/poly.c +318 -0
  129. data/vendor/NTRUplus/NTRU+1152/poly.h +31 -0
  130. data/vendor/NTRUplus/NTRU+1152/randombytes.h +9 -0
  131. data/vendor/NTRUplus/NTRU+1152/symmetric.c +39 -0
  132. data/vendor/NTRUplus/NTRU+1152/symmetric.h +12 -0
  133. data/vendor/NTRUplus/NTRU+768/api.h +24 -0
  134. data/vendor/NTRUplus/NTRU+768/fips202/fips202.c +878 -0
  135. data/vendor/NTRUplus/NTRU+768/fips202/fips202.h +166 -0
  136. data/vendor/NTRUplus/NTRU+768/kem.c +286 -0
  137. data/vendor/NTRUplus/NTRU+768/ntt.c +379 -0
  138. data/vendor/NTRUplus/NTRU+768/ntt.h +16 -0
  139. data/vendor/NTRUplus/NTRU+768/params.h +18 -0
  140. data/vendor/NTRUplus/NTRU+768/poly.c +320 -0
  141. data/vendor/NTRUplus/NTRU+768/poly.h +31 -0
  142. data/vendor/NTRUplus/NTRU+768/randombytes.h +9 -0
  143. data/vendor/NTRUplus/NTRU+768/symmetric.c +39 -0
  144. data/vendor/NTRUplus/NTRU+768/symmetric.h +12 -0
  145. data/vendor/NTRUplus/NTRU+864/api.h +24 -0
  146. data/vendor/NTRUplus/NTRU+864/fips202/fips202.c +878 -0
  147. data/vendor/NTRUplus/NTRU+864/fips202/fips202.h +166 -0
  148. data/vendor/NTRUplus/NTRU+864/kem.c +286 -0
  149. data/vendor/NTRUplus/NTRU+864/ntt.c +383 -0
  150. data/vendor/NTRUplus/NTRU+864/ntt.h +16 -0
  151. data/vendor/NTRUplus/NTRU+864/params.h +18 -0
  152. data/vendor/NTRUplus/NTRU+864/poly.c +314 -0
  153. data/vendor/NTRUplus/NTRU+864/poly.h +31 -0
  154. data/vendor/NTRUplus/NTRU+864/randombytes.h +9 -0
  155. data/vendor/NTRUplus/NTRU+864/symmetric.c +39 -0
  156. data/vendor/NTRUplus/NTRU+864/symmetric.h +12 -0
  157. data/vendor/SMAUG-T/LICENSE +22 -0
  158. data/vendor/SMAUG-T/include/api.h +37 -0
  159. data/vendor/SMAUG-T/include/cbd.h +15 -0
  160. data/vendor/SMAUG-T/include/ciphertext.h +45 -0
  161. data/vendor/SMAUG-T/include/common.h +12 -0
  162. data/vendor/SMAUG-T/include/config.h +48 -0
  163. data/vendor/SMAUG-T/include/dg.h +28 -0
  164. data/vendor/SMAUG-T/include/fips202.h +41 -0
  165. data/vendor/SMAUG-T/include/hash.h +21 -0
  166. data/vendor/SMAUG-T/include/hwt.h +28 -0
  167. data/vendor/SMAUG-T/include/indcpa.h +33 -0
  168. data/vendor/SMAUG-T/include/key.h +34 -0
  169. data/vendor/SMAUG-T/include/pack.h +78 -0
  170. data/vendor/SMAUG-T/include/packring.h +50 -0
  171. data/vendor/SMAUG-T/include/params.h +84 -0
  172. data/vendor/SMAUG-T/include/poly.h +41 -0
  173. data/vendor/SMAUG-T/include/randombytes.h +11 -0
  174. data/vendor/SMAUG-T/include/toomcook.h +14 -0
  175. data/vendor/SMAUG-T/include/verify.h +16 -0
  176. data/vendor/SMAUG-T/src/cbd.c +159 -0
  177. data/vendor/SMAUG-T/src/ciphertext.c +95 -0
  178. data/vendor/SMAUG-T/src/dg.c +112 -0
  179. data/vendor/SMAUG-T/src/fips202.c +745 -0
  180. data/vendor/SMAUG-T/src/hash.c +15 -0
  181. data/vendor/SMAUG-T/src/hwt.c +121 -0
  182. data/vendor/SMAUG-T/src/indcpa.c +187 -0
  183. data/vendor/SMAUG-T/src/kem.c +194 -0
  184. data/vendor/SMAUG-T/src/key.c +102 -0
  185. data/vendor/SMAUG-T/src/pack.c +349 -0
  186. data/vendor/SMAUG-T/src/packring.c +503 -0
  187. data/vendor/SMAUG-T/src/poly.c +200 -0
  188. data/vendor/SMAUG-T/src/toomcook.c +256 -0
  189. data/vendor/SMAUG-T/src/verify.c +48 -0
  190. data/vendor/SOURCES.json +130 -0
  191. metadata +280 -0
@@ -0,0 +1,28 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_HWT_H
4
+ #define SMAUGT_HWT_H
5
+
6
+ #include "params.h"
7
+
8
+ #include <stdint.h>
9
+
10
+ // https://github.com/dgazzoni/NTRU-sampling/blob/main/jupyter/NTRU-sampling.ipynb
11
+ // Use enough seed size 308
12
+ #define SMAUGT_HWTSEEDBYTES ((16 * 308) / 8)
13
+
14
+ // Hamming weight of coefficient vector s
15
+ #if SMAUGT_MODE == SMAUGT_MODE1
16
+ #define SMAUGT_HS 70
17
+ #elif SMAUGT_MODE == SMAUGT_MODE3
18
+ #define SMAUGT_HS 88
19
+ #elif SMAUGT_MODE == SMAUGT_MODE5
20
+ #define SMAUGT_HS 87
21
+ #elif SMAUGT_MODE == SMAUGT_MODET
22
+ #define SMAUGT_HS 70
23
+ #endif
24
+
25
+ #define hwt SMAUGT_NAMESPACE(hwt)
26
+ int hwt(int16_t *res, const uint8_t *seed);
27
+
28
+ #endif /* !SMAUGT_HWT_H */
@@ -0,0 +1,33 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_INDCPA_H
4
+ #define SMAUGT_INDCPA_H
5
+
6
+ #include "params.h"
7
+ #include "poly.h"
8
+
9
+ #include <stdint.h>
10
+
11
+ #define SMAUGT_DEC_ADD 0x4000 // 2^(15 - SMAUGT_LOG_T)
12
+
13
+ #define expand_r SMAUGT_NAMESPACE(expand_r)
14
+ #define indcpa_keypair SMAUGT_NAMESPACE(indcpa_keypair)
15
+ #define indcpa_enc SMAUGT_NAMESPACE(indcpa_enc)
16
+ #define indcpa_dec SMAUGT_NAMESPACE(indcpa_dec)
17
+
18
+ void expand_r(polyvec *r, const uint8_t *seed);
19
+
20
+ void indcpa_keypair(uint8_t pk[SMAUGT_PUBLICKEY_BYTES],
21
+ uint8_t sk[SMAUGT_PKE_SECRETKEY_BYTES],
22
+ const uint8_t seed[SMAUGT_CRYPTO_BYTES]);
23
+
24
+ void indcpa_enc(uint8_t ctxt[SMAUGT_CIPHERTEXT_BYTES],
25
+ const uint8_t pk[SMAUGT_PUBLICKEY_BYTES],
26
+ const uint8_t mu[SMAUGT_MSG_BYTES],
27
+ const uint8_t seed[SMAUGT_DELTA_BYTES]);
28
+
29
+ void indcpa_dec(uint8_t mu[SMAUGT_MSG_BYTES],
30
+ const uint8_t sk[SMAUGT_PKE_SECRETKEY_BYTES],
31
+ const uint8_t ctxt[SMAUGT_CIPHERTEXT_BYTES]);
32
+
33
+ #endif /* !SMAUGT_INDCPA_H */
@@ -0,0 +1,34 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_KEY_H
4
+ #define SMAUGT_KEY_H
5
+
6
+ #include "poly.h"
7
+
8
+ #include <stdint.h>
9
+
10
+ typedef polyvec secret_key;
11
+
12
+ typedef struct PublicKey {
13
+ uint8_t seed[SMAUGT_PKSEED_BYTES];
14
+ polyvec A[SMAUGT_K];
15
+ polyvec b;
16
+ } public_key;
17
+
18
+ #define expand_A SMAUGT_NAMESPACE(expand_A)
19
+ #define expand_b SMAUGT_NAMESPACE(expand_b)
20
+ #define expand_s SMAUGT_NAMESPACE(expand_s)
21
+ #define gen_pub_key SMAUGT_NAMESPACE(gen_pub_key)
22
+
23
+ void expand_A(polyvec A[SMAUGT_K],
24
+ const unsigned char seed[SMAUGT_PKSEED_BYTES]);
25
+
26
+ void expand_b(polyvec *b, const polyvec A[SMAUGT_K], const polyvec *s,
27
+ const uint8_t e_seed[SMAUGT_CRYPTO_BYTES]);
28
+
29
+ void expand_s(secret_key *sk, const uint8_t seed[SMAUGT_CRYPTO_BYTES]);
30
+
31
+ void gen_pub_key(public_key *pk, const secret_key *sk,
32
+ const uint8_t err_seed[SMAUGT_CRYPTO_BYTES]);
33
+
34
+ #endif /* !SMAUGT_KEY_H */
@@ -0,0 +1,78 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_PACK_H
4
+ #define SMAUGT_PACK_H
5
+
6
+ #include "ciphertext.h"
7
+ #include "key.h"
8
+ #include "params.h"
9
+ #include "poly.h"
10
+
11
+ #include <stdint.h>
12
+
13
+ #define pack_enck SMAUGT_NAMESPACE(pack_enck)
14
+ #define unpack_enck SMAUGT_NAMESPACE(unpack_enck)
15
+
16
+ #define pack_deck SMAUGT_NAMESPACE(pack_deck)
17
+ #define unpack_deck SMAUGT_NAMESPACE(unpack_deck)
18
+
19
+ #define pack_s_poly SMAUGT_NAMESPACE(pack_s_poly)
20
+ #define unpack_s_poly SMAUGT_NAMESPACE(unpack_s_poly)
21
+
22
+ #define pack_ct SMAUGT_NAMESPACE(pack_ct)
23
+ #define unpack_ct SMAUGT_NAMESPACE(unpack_ct)
24
+
25
+ #define pack_ring SMAUGT_NAMESPACE(pack_ring)
26
+ #define unpack_ring SMAUGT_NAMESPACE(unpack_ring)
27
+
28
+ #define pack_ring_p SMAUGT_NAMESPACE(pack_ring_p)
29
+ #define unpack_ring_p SMAUGT_NAMESPACE(unpack_ring_p)
30
+
31
+ #define pack_ring_p_prime SMAUGT_NAMESPACE(pack_ring_p_prime)
32
+ #define unpack_ring_p_prime SMAUGT_NAMESPACE(unpack_ring_p_prime)
33
+
34
+ #define pack_ring_vec SMAUGT_NAMESPACE(pack_ring_vec)
35
+ #define unpack_ring_vec SMAUGT_NAMESPACE(unpack_ring_vec)
36
+
37
+ #define pack_ring_p_vec SMAUGT_NAMESPACE(pack_ring_p_vec)
38
+ #define unpack_ring_p_vec SMAUGT_NAMESPACE(unpack_ring_p_vec)
39
+
40
+ #define pack_ring_mat SMAUGT_NAMESPACE(pack_ring_mat)
41
+ #define unpack_ring_mat SMAUGT_NAMESPACE(unpack_ring_mat)
42
+
43
+ void pack_enck(uint8_t *output, const public_key *pk);
44
+ void unpack_enck(public_key *pk, const uint8_t *input);
45
+
46
+ void pack_deck(uint8_t *output, const secret_key *sk);
47
+ void unpack_deck(secret_key *sk, const uint8_t *input);
48
+
49
+ void pack_s_poly(uint8_t *bytes, const poly *data);
50
+ void unpack_s_poly(poly *data, const uint8_t *bytes);
51
+
52
+ void pack_ct(uint8_t *output, const ciphertext *ctxt);
53
+ void unpack_ct(ciphertext *ctxt, const uint8_t *input);
54
+
55
+ void pack_ring(uint8_t bytes[SMAUGT_PKPOLY_BYTES], const poly *data);
56
+ void unpack_ring(poly *data, const uint8_t bytes[SMAUGT_PKPOLY_BYTES]);
57
+
58
+ void pack_ring_p(uint8_t bytes[SMAUGT_CTPOLY1_BYTES], const poly *data);
59
+ void unpack_ring_p(poly *data, const uint8_t bytes[SMAUGT_CTPOLY1_BYTES]);
60
+
61
+ void pack_ring_p_prime(uint8_t bytes[SMAUGT_CTPOLY2_BYTES], const poly *data);
62
+ void unpack_ring_p_prime(poly *data, const uint8_t bytes[SMAUGT_CTPOLY2_BYTES]);
63
+
64
+ void pack_ring_vec(uint8_t bytes[SMAUGT_PKPOLYVEC_BYTES], const polyvec *data);
65
+ void unpack_ring_vec(polyvec *data,
66
+ const uint8_t bytes[SMAUGT_PKPOLYVEC_BYTES]);
67
+
68
+ void pack_ring_p_vec(uint8_t bytes[SMAUGT_CTPOLYVEC_BYTES],
69
+ const polyvec *data);
70
+ void unpack_ring_p_vec(polyvec *data,
71
+ const uint8_t bytes[SMAUGT_CTPOLYVEC_BYTES]);
72
+
73
+ void pack_ring_mat(uint8_t bytes[SMAUGT_PKPOLYMAT_BYTES],
74
+ const polyvec data[SMAUGT_K]);
75
+ void unpack_ring_mat(polyvec data[SMAUGT_K],
76
+ const uint8_t bytes[SMAUGT_PKPOLYMAT_BYTES]);
77
+
78
+ #endif /* !SMAUGT_PACK_H */
@@ -0,0 +1,50 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_PACK_RING_H
4
+ #define SMAUGT_PACK_RING_H
5
+
6
+ #include "params.h"
7
+ #include "poly.h"
8
+
9
+ #include <stdint.h>
10
+
11
+ #define _CONCAT(a, b) a##b
12
+ #define CONCAT(a, b) _CONCAT(a, b)
13
+
14
+ #define PACK_RING(q) CONCAT(pack_R2_, q)
15
+ #define UNPACK_RING(q) CONCAT(unpack_R2_, q)
16
+
17
+ #define pack_R2_3 SMAUGT_NAMESPACE(pack_R2_3)
18
+ #define unpack_R2_3 SMAUGT_NAMESPACE(unpack_R2_3)
19
+
20
+ #define pack_R2_4 SMAUGT_NAMESPACE(pack_R2_4)
21
+ #define unpack_R2_4 SMAUGT_NAMESPACE(unpack_R2_4)
22
+
23
+ #define pack_R2_5 SMAUGT_NAMESPACE(pack_R2_5)
24
+ #define unpack_R2_5 SMAUGT_NAMESPACE(unpack_R2_5)
25
+
26
+ #define pack_R2_7 SMAUGT_NAMESPACE(pack_R2_7)
27
+ #define unpack_R2_7 SMAUGT_NAMESPACE(unpack_R2_7)
28
+
29
+ #define pack_R2_8 SMAUGT_NAMESPACE(pack_R2_8)
30
+ #define unpack_R2_8 SMAUGT_NAMESPACE(unpack_R2_8)
31
+
32
+ #define pack_R2_9 SMAUGT_NAMESPACE(pack_R2_9)
33
+ #define unpack_R2_9 SMAUGT_NAMESPACE(unpack_R2_9)
34
+
35
+ #define pack_R2_10 SMAUGT_NAMESPACE(pack_R2_10)
36
+ #define unpack_R2_10 SMAUGT_NAMESPACE(unpack_R2_10)
37
+
38
+ #define pack_R2_11 SMAUGT_NAMESPACE(pack_R2_11)
39
+ #define unpack_R2_11 SMAUGT_NAMESPACE(unpack_R2_11)
40
+
41
+ void PACK_RING(SMAUGT_LOG_Q)(uint8_t *bytes, const poly *data);
42
+ void UNPACK_RING(SMAUGT_LOG_Q)(poly *data, const uint8_t *bytes);
43
+
44
+ void PACK_RING(SMAUGT_LOG_P)(uint8_t *bytes, const poly *data);
45
+ void UNPACK_RING(SMAUGT_LOG_P)(poly *data, const uint8_t *bytes);
46
+
47
+ void PACK_RING(SMAUGT_LOG_P_PRIME)(uint8_t *bytes, const poly *data);
48
+ void UNPACK_RING(SMAUGT_LOG_P_PRIME)(poly *data, const uint8_t *bytes);
49
+
50
+ #endif /* !SMAUGT_PACK_RING_H */
@@ -0,0 +1,84 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_PARAMS_H
4
+ #define SMAUGT_PARAMS_H
5
+
6
+ #include "config.h"
7
+
8
+ #define SMAUGT_MODE SMAUGT_CONFIG_MODE
9
+ #define SMAUGT_NAMESPACE(s) \
10
+ SMAUGT_CONCAT(SMAUGT_CONFIG_NAMESPACE_PREFIX_MODE, s)
11
+ #define SMAUGT_CRYPTO_ALGNAME \
12
+ SMAUGT_STR(SMAUGT_CONCAT(smaugt_, SMAUGT_CONFIG_MODE_STRING))
13
+
14
+ #define SMAUGT_N 256 // LWE dim and LWR dim
15
+ #define SMAUGT_DELTA_BYTES (SMAUGT_N / 8) // 32
16
+ #define SMAUGT_T_BYTES (SMAUGT_N / 8) // 32
17
+ #define SMAUGT_LOG_T 1 // plaintext modulus
18
+
19
+ #if SMAUGT_MODE == SMAUGT_MODE1
20
+ #define SMAUGT_K 2 // rank of the module, in (2, 3, 4)
21
+ #define SMAUGT_LOG_Q 10 // public key modulus
22
+ #define SMAUGT_LOG_P 8 // ciphertext modulus
23
+ #define SMAUGT_LOG_P_PRIME 5 // ciphertext2 modulus
24
+ #define SMAUGT_CBDSEED_BYTES ((3 * SMAUGT_N) / 8)
25
+ #define SMAUGT_MSG_BYTES SMAUGT_DELTA_BYTES
26
+ #elif SMAUGT_MODE == SMAUGT_MODE3
27
+ #define SMAUGT_K 3 // rank of the module, in (2, 3, 4)
28
+ #define SMAUGT_LOG_Q 11 // public key modulus
29
+ #define SMAUGT_LOG_P 9 // ciphertext modulus
30
+ #define SMAUGT_LOG_P_PRIME 4 // ciphertext2 modulus
31
+ #define SMAUGT_CBDSEED_BYTES ((2 * SMAUGT_N) / 8)
32
+ #define SMAUGT_MSG_BYTES SMAUGT_DELTA_BYTES
33
+ #elif SMAUGT_MODE == SMAUGT_MODE5
34
+ #define SMAUGT_K 4 // rank of the module, in (2, 3, 4)
35
+ #define SMAUGT_LOG_Q 11 // public key modulus
36
+ #define SMAUGT_LOG_P 9 // ciphertext modulus
37
+ #define SMAUGT_LOG_P_PRIME 7 // ciphertext2 modulus
38
+ #define SMAUGT_CBDSEED_BYTES ((4 * SMAUGT_N) / 8)
39
+ #define SMAUGT_MSG_BYTES SMAUGT_DELTA_BYTES
40
+ #elif SMAUGT_MODE == SMAUGT_MODET
41
+ #define SMAUGT_K 2 // rank of the module, in (2, 3, 4)
42
+ #define SMAUGT_LOG_Q 10 // public key modulus
43
+ #define SMAUGT_LOG_P 8 // ciphertext modulus
44
+ #define SMAUGT_LOG_P_PRIME 3 // ciphertext2 modulus
45
+ #define SMAUGT_CBDSEED_BYTES ((3 * SMAUGT_N) / 8)
46
+ #define SMAUGT_MSG_BYTES 16 // for D2
47
+ #endif
48
+
49
+ #define SMAUGT_MODULUS_16_LOG_Q \
50
+ (16 - SMAUGT_LOG_Q) // modulus (16 - SMAUGT_LOG_Q)
51
+ #define SMAUGT_MODULUS_16_LOG_P \
52
+ (16 - SMAUGT_LOG_P) // modulus (16 - SMAUGT_LOG_P)
53
+ #define SMAUGT_MODULUS_16_LOG_P_PRIME \
54
+ (16 - SMAUGT_LOG_P_PRIME) // modulus (16 - SMAUGT_LOG_P_PRIME)
55
+ #define SMAUGT_MODULUS_16_LOG_T \
56
+ (16 - SMAUGT_LOG_T) // modulus (16 - SMAUGT_LOG_T)
57
+
58
+ // Size of keys and ciphertext
59
+ #define SMAUGT_SHARED_SECRETE_BYTES (32) // 32
60
+ #define SMAUGT_CRYPTO_BYTES SMAUGT_SHARED_SECRETE_BYTES // 32
61
+ #define SMAUGT_CTPOLY1_BYTES (SMAUGT_LOG_P * SMAUGT_N / 8) // element in R_p
62
+ #define SMAUGT_CTPOLY2_BYTES \
63
+ (SMAUGT_LOG_P_PRIME * SMAUGT_N / 8) // element in R_p'
64
+ #define SMAUGT_SKPOLY_BYTES (SMAUGT_N / 4) // 64
65
+ #define SMAUGT_SKPOLYVEC_BYTES \
66
+ (SMAUGT_SKPOLY_BYTES * SMAUGT_K) // vector of secret polynomials
67
+ #define SMAUGT_CTPOLYVEC_BYTES \
68
+ (SMAUGT_CTPOLY1_BYTES * SMAUGT_K) // vector with element in R_p
69
+ #define SMAUGT_CIPHERTEXT_BYTES \
70
+ (SMAUGT_CTPOLYVEC_BYTES + SMAUGT_CTPOLY2_BYTES) // (vector c21, c22)
71
+ #define SMAUGT_PKSEED_BYTES (32) // seed for a(x) 32
72
+ #define SMAUGT_PKPOLY_BYTES ((SMAUGT_LOG_Q * SMAUGT_N) / 8) // b(x)
73
+ #define SMAUGT_PKPOLYVEC_BYTES \
74
+ (SMAUGT_PKPOLY_BYTES * SMAUGT_K) // vector with element in R_q
75
+ #define SMAUGT_PKPOLYMAT_BYTES \
76
+ (SMAUGT_PKPOLYVEC_BYTES * SMAUGT_K) // matrix with element in R_q
77
+ #define SMAUGT_PUBLICKEY_BYTES \
78
+ (SMAUGT_PKSEED_BYTES + SMAUGT_PKPOLYVEC_BYTES) // (A seed, b(x) vector)
79
+ #define SMAUGT_PKE_SECRETKEY_BYTES (SMAUGT_SKPOLYVEC_BYTES) // s(x) vector
80
+ #define SMAUGT_KEM_SECRETKEY_BYTES \
81
+ (SMAUGT_PKE_SECRETKEY_BYTES + SMAUGT_T_BYTES + \
82
+ SMAUGT_PUBLICKEY_BYTES) // s(x) vector, t, pk
83
+
84
+ #endif /* !SMAUGT_PARAMS_H */
@@ -0,0 +1,41 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_POLY_H
4
+ #define SMAUGT_POLY_H
5
+
6
+ #include "params.h"
7
+
8
+ #include <stddef.h>
9
+ #include <stdint.h>
10
+
11
+ #if SMAUGT_MODE == SMAUGT_MODET
12
+ #define SMAUGT_MODULUS_SCALED_Q_HALF 32767 // for D2, Q/2 = 2^15 - 1
13
+ #endif
14
+
15
+ typedef struct {
16
+ int16_t coeffs[SMAUGT_N];
17
+ } poly;
18
+
19
+ typedef struct {
20
+ poly vec[SMAUGT_K];
21
+ } polyvec;
22
+
23
+ #define vec_vec_mult_add SMAUGT_NAMESPACE(vec_vec_mult_add)
24
+ #define matrix_vec_mult_add SMAUGT_NAMESPACE(matrix_vec_mult_add)
25
+ #define matrix_vec_mult_sub SMAUGT_NAMESPACE(matrix_vec_mult_sub)
26
+
27
+ void vec_vec_mult_add(poly *r, const polyvec *a, const polyvec *b, uint8_t mod);
28
+ void matrix_vec_mult_add(polyvec *r, const polyvec a[SMAUGT_K],
29
+ const polyvec *b);
30
+ void matrix_vec_mult_sub(polyvec *r, const polyvec a[SMAUGT_K],
31
+ const polyvec *b);
32
+
33
+ #if SMAUGT_MODE == SMAUGT_MODET
34
+ #define d2_ecd SMAUGT_NAMESPACE(d2_ecd)
35
+ #define d2_dcd SMAUGT_NAMESPACE(d2_dcd)
36
+
37
+ void d2_ecd(poly *r, const uint8_t msg[SMAUGT_MSG_BYTES]);
38
+ void d2_dcd(uint8_t msg[SMAUGT_MSG_BYTES], const poly *x);
39
+ #endif
40
+
41
+ #endif /* !SMAUGT_POLY_H */
@@ -0,0 +1,11 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_RANDOMBYTES_H
4
+ #define SMAUGT_RANDOMBYTES_H
5
+
6
+ #include <stddef.h>
7
+ #include <stdint.h>
8
+
9
+ int randombytes(uint8_t *x, size_t xlen);
10
+
11
+ #endif /* !SMAUGT_RANDOMBYTES_H */
@@ -0,0 +1,14 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_TOOMCOOK_H
4
+ #define SMAUGT_TOOMCOOK_H
5
+
6
+ #include "params.h"
7
+
8
+ #include <stdint.h>
9
+
10
+ #define poly_mul_acc SMAUGT_NAMESPACE(poly_mul_acc)
11
+ void poly_mul_acc(const int16_t a[SMAUGT_N], const int16_t b[SMAUGT_N],
12
+ int16_t res[SMAUGT_N]);
13
+
14
+ #endif /* !SMAUGT_TOOMCOOK_H */
@@ -0,0 +1,16 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #ifndef SMAUGT_VERIFY_H
4
+ #define SMAUGT_VERIFY_H
5
+
6
+ #include "params.h"
7
+
8
+ #include <stddef.h>
9
+ #include <stdint.h>
10
+
11
+ #define verify SMAUGT_NAMESPACE(verify)
12
+ int verify(const uint8_t *a, const uint8_t *b, size_t len);
13
+ #define cmov SMAUGT_NAMESPACE(cmov)
14
+ void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b);
15
+
16
+ #endif /* !SMAUGT_VERIFY_H */
@@ -0,0 +1,159 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #include "cbd.h"
4
+
5
+ #if SMAUGT_MODE == SMAUGT_MODE1 || SMAUGT_MODE == SMAUGT_MODET
6
+ #define load24_littleendian SMAUGT_NAMESPACE(load24_littleendian)
7
+ static uint32_t load24_littleendian(const uint8_t x[3]) {
8
+ uint32_t r;
9
+ r = (uint32_t)x[0];
10
+ r |= (uint32_t)x[1] << 8;
11
+ r |= (uint32_t)x[2] << 16;
12
+ return r;
13
+ }
14
+
15
+ /*************************************************
16
+ * Name: sp_cbd1
17
+ *
18
+ * Description: Given an array of uniformly random bytes, compute
19
+ * polynomial with coefficients distributed according to
20
+ * a modified centered binomial distribution with parameter eta=2
21
+ * (p(0)=3/4, p(1)=p(-1)=1/8)
22
+ *
23
+ * Arguments: - poly *r: pointer to output polynomial
24
+ * - const uint8_t buf[SMAUGT_CBDSEED_BYTES]: pointer to input byte
25
+ * array
26
+ *
27
+ * Specification: Implements Algorithm 7, spCBD1.
28
+ **************************************************/
29
+ #define sp_cbd1 SMAUGT_NAMESPACE(sp_cbd1)
30
+ static void sp_cbd1(poly *r, const uint8_t buf[SMAUGT_CBDSEED_BYTES]) {
31
+ unsigned int i, j;
32
+ uint32_t t, d, s;
33
+ int16_t a;
34
+
35
+ for (i = 0; i < SMAUGT_N / 8; i++) {
36
+ t = load24_littleendian(buf + 3 * i);
37
+ d = t & 0x00249249;
38
+ d &= (t >> 1) & 0x00249249;
39
+ s = (t >> 2) & 0x00249249;
40
+
41
+ for (j = 0; j < 8; j++) {
42
+ a = (d >> (3 * j)) & 0x1;
43
+ r->coeffs[8 * i + j] =
44
+ a * (((((s >> (3 * j)) & 0x1) - 1) ^ -2) | 1);
45
+ }
46
+ }
47
+ }
48
+ #endif
49
+
50
+ #if SMAUGT_MODE == SMAUGT_MODE3 || SMAUGT_MODE == SMAUGT_MODE5
51
+ /*************************************************
52
+ * Name: load32_littleendian
53
+ *
54
+ * Description: load 4 bytes into a 32-bit integer
55
+ * in little-endian order
56
+ *
57
+ * Arguments: - const uint8_t x[4]: pointer to input byte array
58
+ *
59
+ * Return: 32-bit unsigned integer loaded from x
60
+ **************************************************/
61
+ #define load32_littleendian SMAUGT_NAMESPACE(load32_littleendian)
62
+ static uint32_t load32_littleendian(const uint8_t x[4]) {
63
+ uint32_t r;
64
+ r = (uint32_t)x[0];
65
+ r |= (uint32_t)x[1] << 8;
66
+ r |= (uint32_t)x[2] << 16;
67
+ r |= (uint32_t)x[3] << 24;
68
+ return r;
69
+ }
70
+ #endif
71
+
72
+ #if SMAUGT_MODE == SMAUGT_MODE3
73
+ /*************************************************
74
+ * Name: cbd
75
+ *
76
+ * Description: Given an array of uniformly random bytes, compute
77
+ * polynomial with coefficients distributed according to
78
+ * a centered binomial distribution with parameter eta=1
79
+ *
80
+ * Arguments: - poly *r: pointer to output polynomial
81
+ * - const uint8_t buf[SMAUGT_CBDSEED_BYTES]: pointer to input byte
82
+ * array
83
+ *
84
+ * Specification: Implements Algorithm 9, CBD.
85
+ **************************************************/
86
+ #define cbd SMAUGT_NAMESPACE(cbd)
87
+ static void cbd(poly *r, const uint8_t buf[SMAUGT_CBDSEED_BYTES]) {
88
+ unsigned int i, j;
89
+ uint32_t t;
90
+ int16_t a, b;
91
+
92
+ for (i = 0; i < SMAUGT_N / 16; i++) {
93
+ t = load32_littleendian(buf + 4 * i);
94
+
95
+ for (j = 0; j < 16; j++) {
96
+ a = (t >> (2 * j + 0)) & 0x01;
97
+ b = (t >> (2 * j + 1)) & 0x01;
98
+ r->coeffs[16 * i + j] = a - b;
99
+ }
100
+ }
101
+ }
102
+ #endif
103
+ #if SMAUGT_MODE == SMAUGT_MODE5
104
+ /*************************************************
105
+ * Name: sp_cbd2
106
+ *
107
+ * Description: Given an array of uniformly random bytes, compute
108
+ * polynomial with coefficients distributed according to
109
+ * a modified centered binomial distribution with parameter eta=2
110
+ * (p(0)=5/8, p(1)=p(-1)=3/16)
111
+ *
112
+ * Arguments: - poly *r: pointer to output polynomial
113
+ * - const uint8_t buf[SMAUGT_CBDSEED_BYTES]: pointer to input byte
114
+ * array
115
+ *
116
+ * Specification: Implements Algorithm 8, spCBD2.
117
+ **************************************************/
118
+ #define sp_cbd2 SMAUGT_NAMESPACE(sp_cbd2)
119
+ static void sp_cbd2(poly *r, const uint8_t buf[SMAUGT_CBDSEED_BYTES]) {
120
+ unsigned int i, j;
121
+ uint32_t t, s, d;
122
+ int16_t a;
123
+
124
+ for (i = 0; i < SMAUGT_N / 8; i++) {
125
+ t = load32_littleendian(buf + 4 * i);
126
+ d = t & 0x11111111;
127
+ d |= (t >> 1) & 0x11111111;
128
+ d &= (t >> 2) & 0x11111111;
129
+ s = (t >> 3) & 0x11111111;
130
+ for (j = 0; j < 8; j++) {
131
+ a = (d >> (4 * j)) & 0x1;
132
+ r->coeffs[8 * i + j] =
133
+ a * (((((s >> (4 * j)) & 0x1) - 1) ^ -2) | 1);
134
+ }
135
+ }
136
+ }
137
+ #endif
138
+
139
+ /*************************************************
140
+ * Name: sp_cbd
141
+ *
142
+ * Description: Given an array of uniformly random bytes, compute
143
+ * polynomial with coefficients
144
+ *
145
+ * Arguments: - poly *r: pointer to output polynomial
146
+ * - const uint8_t buf[SMAUGT_CBDSEED_BYTES]: pointer to input byte
147
+ * array
148
+ *
149
+ * Specification: Implements Algorithm 6, spCBD.
150
+ **************************************************/
151
+ void sp_cbd(poly *r, const uint8_t buf[SMAUGT_CBDSEED_BYTES]) {
152
+ #if SMAUGT_MODE == SMAUGT_MODE1 || SMAUGT_MODE == SMAUGT_MODET
153
+ sp_cbd1(r, buf);
154
+ #elif SMAUGT_MODE == SMAUGT_MODE3
155
+ cbd(r, buf);
156
+ #elif SMAUGT_MODE == SMAUGT_MODE5
157
+ sp_cbd2(r, buf);
158
+ #endif
159
+ }
@@ -0,0 +1,95 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #include "ciphertext.h"
4
+
5
+ /*************************************************
6
+ * Name: round1
7
+ *
8
+ * Description: rounding q to p
9
+ *
10
+ * Arguments: - polyvec *a: pointer to inout vector a. This should be
11
+ * already initialized.
12
+ *
13
+ * Specification: Implements Algorithm 12, Round1.
14
+ **************************************************/
15
+ #define round1 SMAUGT_NAMESPACE(round1)
16
+ static inline void round1(polyvec *a) {
17
+ unsigned int i, j;
18
+ for (i = 0; i < SMAUGT_K; ++i) {
19
+ for (j = 0; j < SMAUGT_N; ++j) {
20
+ a->vec[i].coeffs[j] =
21
+ ((a->vec[i].coeffs[j] + SMAUGT_RD_ADD) & SMAUGT_RD_AND) >>
22
+ SMAUGT_MODULUS_16_LOG_P;
23
+ }
24
+ }
25
+ }
26
+
27
+ /*************************************************
28
+ * Name: computeC1
29
+ *
30
+ * Description: Compute the first ciphertext c1 = round(p/q * (A * r))
31
+ *
32
+ * Arguments: - polyvec *c1: pointer to output vector c1. The c1 should be
33
+ * already initialized
34
+ * - const polyvec A[SMAUGT_K]: pointer to input matrix of public A
35
+ * - const polyvec *r: pointer to input vector of ephemeral key r
36
+ **************************************************/
37
+ void computeC1(polyvec *c1, const polyvec A[SMAUGT_K], const polyvec *r) {
38
+ // c1 = A * r
39
+ matrix_vec_mult_add(c1, A, r);
40
+
41
+ // Rounding q to p
42
+ round1(c1);
43
+ }
44
+
45
+ /*************************************************
46
+ * Name: round2
47
+ *
48
+ * Description: rounding q to p'
49
+ *
50
+ * Arguments: - poly *a: pointer to an input/output vector a. This should be
51
+ * already initialized.
52
+ *
53
+ * Specification: Implements Algorithm 13, Round2.
54
+ **************************************************/
55
+ #define round2 SMAUGT_NAMESPACE(round2)
56
+ static inline void round2(poly *a) {
57
+ unsigned int i;
58
+ for (i = 0; i < SMAUGT_N; ++i) {
59
+ a->coeffs[i] = ((a->coeffs[i] + SMAUGT_RD_ADD2) & SMAUGT_RD_AND2) >>
60
+ SMAUGT_MODULUS_16_LOG_P_PRIME;
61
+ }
62
+ }
63
+ /*************************************************
64
+ * Name: computeC2
65
+ *
66
+ * Description: Compute the secode ciphertext c2 = round(p/q * (b^T * r) + msg)
67
+ *
68
+ * Arguments: - poly *c2: pointer to ouptput poly c2. The c2 should be
69
+ * already initialized
70
+ * - const uint8_t delta[SMAUGT_MSG_BYTES]: pointer to input
71
+ * message delta
72
+ * - const polyvec *b: pointer to input vector of public b
73
+ * - const polyvec *r: pointer to input vector of ephemeral key r
74
+ **************************************************/
75
+ void computeC2(poly *c2, const uint8_t delta[SMAUGT_MSG_BYTES],
76
+ const polyvec *b, const polyvec *r) {
77
+ #if SMAUGT_MODE == SMAUGT_MODET
78
+ // c2 = q/2 * delta
79
+ d2_ecd(c2, delta); // EDIT TiMER
80
+ #else
81
+ unsigned int i, j;
82
+ // c2 = q/2 * delta
83
+ for (i = 0; i < SMAUGT_MSG_BYTES; ++i) {
84
+ for (j = 0; j < sizeof(uint8_t) * 8; ++j) {
85
+ c2->coeffs[8 * i + j] =
86
+ (uint16_t)((delta[i] >> j) << SMAUGT_MODULUS_16_LOG_T);
87
+ }
88
+ }
89
+ #endif
90
+ // c2 = q/2 * delta + (b * r)
91
+ vec_vec_mult_add(c2, b, r, SMAUGT_MODULUS_16_LOG_Q);
92
+
93
+ // Rounding q to p'
94
+ round2(c2);
95
+ }