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,503 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #include "packring.h"
4
+ #include "poly.h"
5
+
6
+ #include <string.h>
7
+
8
+ #if SMAUGT_LOG_P_PRIME == 3
9
+ /*************************************************
10
+ * Name: pack_R2_3
11
+ *
12
+ * Description: Transform to bytes array from polynomial in Rp' where p' = 2^3
13
+ * Use 3 bits to encode each coefficient in [0, 2^3).
14
+ *
15
+ * Arguments: - uint8_t bytes[SMAUGT_CTPOLY2_BYTES]: pointer to output bytes
16
+ * - const poly *data: pointer to input polynomial in Rp'
17
+ **************************************************/
18
+ void pack_R2_3(uint8_t bytes[SMAUGT_CTPOLY2_BYTES], const poly *data) {
19
+ memset(bytes, 0, sizeof(uint8_t) * SMAUGT_CTPOLY2_BYTES);
20
+ size_t bytes_idx = 0;
21
+ size_t i;
22
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
23
+ uint32_t packed = 0;
24
+ for (i = 0; i < 8; ++i) {
25
+
26
+ packed |=
27
+ ((uint32_t)(data->coeffs[data_idx + i] & 0x0007) << (3 * i));
28
+ }
29
+
30
+ bytes[bytes_idx++] = (uint8_t)(packed & 0x000000ff);
31
+ bytes[bytes_idx++] = (uint8_t)((packed >> 8) & 0x000000ff);
32
+ bytes[bytes_idx++] = (uint8_t)((packed >> 16) & 0x000000ff);
33
+ }
34
+ }
35
+
36
+ /*************************************************
37
+ * Name: unpack_R2_3
38
+ *
39
+ * Description: Transform to polynomial in Rp' from bytes array, where p' = 2^3
40
+ * Use 3 bits to decode each coefficient in [0, 2^3).
41
+ *
42
+ * Arguments: - poly *data: pointer to output polynomial in Rp'
43
+ * - const uint8_t bytes[SMAUGT_CTPOLY2_BYTES]: pointer to input
44
+ * bytes
45
+ **************************************************/
46
+ void unpack_R2_3(poly *data, const uint8_t bytes[SMAUGT_CTPOLY2_BYTES]) {
47
+ memset(data, 0, sizeof(int16_t) * SMAUGT_N);
48
+ size_t bytes_idx = 0;
49
+ size_t i;
50
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
51
+ uint32_t packed = 0;
52
+ packed = packed | ((uint32_t)bytes[bytes_idx++] & 0x000000ff);
53
+ packed = packed | (((uint32_t)bytes[bytes_idx++] << 8) & 0x0000ff00);
54
+ packed = packed | (((uint32_t)bytes[bytes_idx++] << 16) & 0x00ff0000);
55
+
56
+ for (i = 0; i < 8; i++) {
57
+ data->coeffs[data_idx + i] =
58
+ (int16_t)((packed >> (3 * i)) & 0x00000007);
59
+ }
60
+ }
61
+ }
62
+ #elif SMAUGT_LOG_P_PRIME == 4
63
+ /*************************************************
64
+ * Name: pack_R2_4
65
+ *
66
+ * Description: Transform to bytes array from polynomial in Rp' where p' = 2^4
67
+ * Use 4 bits to encode each coefficient in [0, 2^4).
68
+ *
69
+ * Arguments: - uint8_t bytes[SMAUGT_CTPOLY2_BYTES]: pointer to output bytes
70
+ * - const poly *data: pointer to input polynomial in Rp'
71
+ **************************************************/
72
+ void pack_R2_4(uint8_t bytes[SMAUGT_CTPOLY2_BYTES], const poly *data) {
73
+ memset(bytes, 0, sizeof(uint8_t) * SMAUGT_CTPOLY2_BYTES);
74
+ size_t bytes_idx = 0;
75
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 2) {
76
+ bytes[bytes_idx] = (uint8_t)(data->coeffs[data_idx] & 0x000f);
77
+ bytes[bytes_idx++] |=
78
+ (uint8_t)((data->coeffs[data_idx + 1] & 0x000f) << 4);
79
+ }
80
+ }
81
+
82
+ /*************************************************
83
+ * Name: unpack_R2_4
84
+ *
85
+ * Description: Transform to polynomial in Rp' from bytes array, where p' = 2^4
86
+ * Use 4 bits to decode each coefficient in [0, 2^4).
87
+ *
88
+ * Arguments: - poly *data: pointer to output polynomial in Rp'
89
+ * - const uint8_t bytes[SMAUGT_CTPOLY2_BYTES]: pointer to input
90
+ * bytes
91
+ **************************************************/
92
+ void unpack_R2_4(poly *data, const uint8_t bytes[SMAUGT_CTPOLY2_BYTES]) {
93
+ memset(data, 0, sizeof(int16_t) * SMAUGT_N);
94
+ size_t bytes_idx = 0;
95
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 2) {
96
+ data->coeffs[data_idx] = (int16_t)(bytes[bytes_idx] & 0x000f);
97
+ data->coeffs[data_idx + 1] =
98
+ (int16_t)((bytes[bytes_idx++] >> 4) & 0x000f);
99
+ }
100
+ }
101
+ #elif SMAUGT_LOG_P_PRIME == 5
102
+ /*************************************************
103
+ * Name: pack_R2_5
104
+ *
105
+ * Description: Transform to bytes array from polynomial in Rp' where p' = 2^5
106
+ * Use 5 bits to encode each coefficient in [0, 2^5).
107
+ *
108
+ * Arguments: - uint8_t bytes[SMAUGT_CTPOLY2_BYTES]: pointer to output bytes
109
+ * - const poly *data: pointer to input polynomial in Rp'
110
+ **************************************************/
111
+ void pack_R2_5(uint8_t bytes[SMAUGT_CTPOLY2_BYTES], const poly *data) {
112
+ memset(bytes, 0, sizeof(uint8_t) * SMAUGT_CTPOLY2_BYTES);
113
+ size_t bytes_idx = 0;
114
+ size_t i;
115
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
116
+ uint64_t packed = 0;
117
+
118
+ for (i = 0; i < 8; ++i) {
119
+ packed |=
120
+ ((uint64_t)(data->coeffs[data_idx + i] & 0x001f) << (5 * i));
121
+ }
122
+
123
+ bytes[bytes_idx++] = (uint8_t)(packed & 0x00000000000000ff);
124
+ bytes[bytes_idx++] = (uint8_t)((packed >> 8) & 0x00000000000000ff);
125
+ bytes[bytes_idx++] = (uint8_t)((packed >> 16) & 0x00000000000000ff);
126
+ bytes[bytes_idx++] = (uint8_t)((packed >> 24) & 0x00000000000000ff);
127
+ bytes[bytes_idx++] = (uint8_t)((packed >> 32) & 0x00000000000000ff);
128
+ }
129
+ }
130
+
131
+ /*************************************************
132
+ * Name: unpack_R2_5
133
+ *
134
+ * Description: Transform to polynomial in Rp' from bytes array, where p' = 2^5
135
+ * Use 5 bits to decode each coefficient in [0, 2^5).
136
+ *
137
+ * Arguments: - poly *data: pointer to output polynomial in Rp'
138
+ * - const uint8_t bytes[SMAUGT_CTPOLY2_BYTES]: pointer to input
139
+ * bytes
140
+ **************************************************/
141
+ void unpack_R2_5(poly *data, const uint8_t bytes[SMAUGT_CTPOLY2_BYTES]) {
142
+ memset(data, 0, sizeof(int16_t) * SMAUGT_N);
143
+ size_t bytes_idx = 0;
144
+ size_t i;
145
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
146
+ uint64_t packed = 0;
147
+ packed = packed | ((uint64_t)bytes[bytes_idx++] & 0x00000000000000ff);
148
+ packed =
149
+ packed | (((uint64_t)bytes[bytes_idx++] << 8) & 0x000000000000ff00);
150
+ packed = packed |
151
+ (((uint64_t)bytes[bytes_idx++] << 16) & 0x0000000000ff0000);
152
+ packed = packed |
153
+ (((uint64_t)bytes[bytes_idx++] << 24) & 0x00000000ff000000);
154
+ packed = packed |
155
+ (((uint64_t)bytes[bytes_idx++] << 32) & 0x000000ff00000000);
156
+
157
+ for (i = 0; i < 8; i++) {
158
+ data->coeffs[data_idx + i] =
159
+ (int16_t)((packed >> (5 * i)) & 0x000000000000001f);
160
+ }
161
+ }
162
+ }
163
+ #elif SMAUGT_LOG_P_PRIME == 7
164
+ /*************************************************
165
+ * Name: pack_R2_7
166
+ *
167
+ * Description: Transform to bytes array from polynomial in Rp' where p' = 2^7
168
+ * Use 7 bits to encode each coefficient in [0, 2^7).
169
+ *
170
+ * Arguments: - uint8_t bytes[SMAUGT_CTPOLY2_BYTES]: pointer to output bytes
171
+ * - const poly *data: pointer to input polynomial in Rp'
172
+ **************************************************/
173
+ void pack_R2_7(uint8_t bytes[SMAUGT_CTPOLY2_BYTES], const poly *data) {
174
+ memset(bytes, 0, sizeof(uint8_t) * SMAUGT_CTPOLY2_BYTES);
175
+ size_t bytes_idx = 0;
176
+ size_t i;
177
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
178
+ uint64_t packed = 0;
179
+ for (i = 0; i < 8; ++i) {
180
+ packed |=
181
+ ((uint64_t)(data->coeffs[data_idx + i] & 0x007f) << (7 * i));
182
+ }
183
+
184
+ bytes[bytes_idx++] = (uint8_t)(packed & 0x00000000000000ff);
185
+ bytes[bytes_idx++] = (uint8_t)((packed >> 8) & 0x00000000000000ff);
186
+ bytes[bytes_idx++] = (uint8_t)((packed >> 16) & 0x00000000000000ff);
187
+ bytes[bytes_idx++] = (uint8_t)((packed >> 24) & 0x00000000000000ff);
188
+ bytes[bytes_idx++] = (uint8_t)((packed >> 32) & 0x00000000000000ff);
189
+ bytes[bytes_idx++] = (uint8_t)((packed >> 40) & 0x00000000000000ff);
190
+ bytes[bytes_idx++] = (uint8_t)((packed >> 48) & 0x00000000000000ff);
191
+ }
192
+ }
193
+
194
+ /*************************************************
195
+ * Name: unpack_R2_7
196
+ *
197
+ * Description: Transform to polynomial in Rp' from bytes array, where p' = 2^7
198
+ * Use 7 bits to decode each coefficient in [0, 2^7).
199
+ *
200
+ * Arguments: - poly *data: pointer to output polynomial in Rp'
201
+ * - const bytes[SMAUGT_CTPOLY2_BYTES]: pointer to input bytes
202
+ **************************************************/
203
+ void unpack_R2_7(poly *data, const uint8_t bytes[SMAUGT_CTPOLY2_BYTES]) {
204
+ memset(data, 0, sizeof(int16_t) * SMAUGT_N);
205
+ size_t bytes_idx = 0;
206
+ size_t i;
207
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
208
+ uint64_t packed = 0;
209
+ packed = packed | ((uint64_t)bytes[bytes_idx++] & 0x00000000000000ff);
210
+ packed =
211
+ packed | (((uint64_t)bytes[bytes_idx++] << 8) & 0x000000000000ff00);
212
+ packed = packed |
213
+ (((uint64_t)bytes[bytes_idx++] << 16) & 0x0000000000ff0000);
214
+ packed = packed |
215
+ (((uint64_t)bytes[bytes_idx++] << 24) & 0x00000000ff000000);
216
+ packed = packed |
217
+ (((uint64_t)bytes[bytes_idx++] << 32) & 0x000000ff00000000);
218
+ packed = packed |
219
+ (((uint64_t)bytes[bytes_idx++] << 40) & 0x0000ff0000000000);
220
+ packed = packed |
221
+ (((uint64_t)bytes[bytes_idx++] << 48) & 0x00ff000000000000);
222
+
223
+ for (i = 0; i < 8; i++) {
224
+ data->coeffs[data_idx + i] =
225
+ (int16_t)((packed >> (7 * i)) & 0x000000000000007f);
226
+ }
227
+ }
228
+ }
229
+ #endif
230
+
231
+ #if SMAUGT_LOG_P == 8
232
+ /*************************************************
233
+ * Name: pack_R2_8
234
+ *
235
+ * Description: Transform to bytes array from polynomial in Rp where p = 2^8
236
+ * Use 8 bits to encode each coefficient in [0, 2^8).
237
+ *
238
+ * Arguments: - uint8_t bytes[SMAUGT_CTPOLY1_BYTES]: pointer to output bytes
239
+ * - const poly *data: pointer to input polynomial in Rp
240
+ **************************************************/
241
+ void pack_R2_8(uint8_t bytes[SMAUGT_CTPOLY1_BYTES], const poly *data) {
242
+ memset(bytes, 0, sizeof(uint8_t) * SMAUGT_CTPOLY1_BYTES);
243
+ size_t i;
244
+ for (i = 0; i < SMAUGT_N; ++i)
245
+ bytes[i] = (uint8_t)(data->coeffs[i] & 0x00ff);
246
+ }
247
+
248
+ /*************************************************
249
+ * Name: unpack_R2_8
250
+ *
251
+ * Description: Transform to polynomial in Rp from bytes array, where p = 2^8
252
+ * Use 8 bits to decode each coefficient in [0, 2^8).
253
+ *
254
+ * Arguments: - poly *data: pointer to output polynomial in Rp
255
+ * - const uint8_t bytes[SMAUGT_CTPOLY1_BYTES]: pointer to input
256
+ * bytes
257
+ **************************************************/
258
+ void unpack_R2_8(poly *data, const uint8_t bytes[SMAUGT_CTPOLY1_BYTES]) {
259
+ memset(data, 0, sizeof(int16_t) * SMAUGT_N);
260
+ size_t i;
261
+ for (i = 0; i < SMAUGT_N; ++i)
262
+ data->coeffs[i] = (int16_t)(bytes[i] & 0xff);
263
+ }
264
+ #elif SMAUGT_LOG_P == 9
265
+ /*************************************************
266
+ * Name: pack_R2_9
267
+ *
268
+ * Description: Transform to bytes array from polynomial in Rp where p = 2^9
269
+ * Use 9 bits to encode each coefficient in [0, 2^9).
270
+ *
271
+ * Arguments: - uint8_t bytes[SMAUGT_CTPOLY1_BYTES]: pointer to output bytes
272
+ * - const poly *data: pointer to input polynomial in Rp
273
+ **************************************************/
274
+ void pack_R2_9(uint8_t bytes[SMAUGT_CTPOLY1_BYTES], const poly *data) {
275
+ memset(bytes, 0, sizeof(uint8_t) * SMAUGT_CTPOLY1_BYTES);
276
+ size_t bytes_idx = 0;
277
+ size_t i;
278
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
279
+ uint64_t packed = 0;
280
+ uint8_t packed2 = 0;
281
+ for (i = 0; i < 7; ++i) {
282
+ packed |=
283
+ ((uint64_t)(data->coeffs[data_idx + i] & 0x01ff) << (9 * i));
284
+ }
285
+ packed |= (uint64_t)(data->coeffs[data_idx + 7] & 0x0001) << 63;
286
+ packed2 = (uint8_t)(data->coeffs[data_idx + 7] >> 1);
287
+
288
+ bytes[bytes_idx++] = (uint8_t)(packed & 0x00000000000000ff);
289
+ bytes[bytes_idx++] = (uint8_t)((packed >> 8) & 0x00000000000000ff);
290
+ bytes[bytes_idx++] = (uint8_t)((packed >> 16) & 0x00000000000000ff);
291
+ bytes[bytes_idx++] = (uint8_t)((packed >> 24) & 0x00000000000000ff);
292
+ bytes[bytes_idx++] = (uint8_t)((packed >> 32) & 0x00000000000000ff);
293
+ bytes[bytes_idx++] = (uint8_t)((packed >> 40) & 0x00000000000000ff);
294
+ bytes[bytes_idx++] = (uint8_t)((packed >> 48) & 0x00000000000000ff);
295
+ bytes[bytes_idx++] = (uint8_t)((packed >> 56) & 0x00000000000000ff);
296
+ bytes[bytes_idx++] = (uint8_t)(packed2 & 0xff);
297
+ }
298
+ }
299
+
300
+ /*************************************************
301
+ * Name: unpack_R2_9
302
+ *
303
+ * Description: Transform to polynomial in Rp from bytes array, where p = 2^9
304
+ * Use 9 bits to decode each coefficient in [0, 2^9).
305
+ *
306
+ * Arguments: - poly *data: pointer to output polynomial in Rp
307
+ * - const uint8_t bytes[SMAUGT_CTPOLY1_BYTES]: pointer to input
308
+ * bytes
309
+ **************************************************/
310
+ void unpack_R2_9(poly *data, const uint8_t bytes[SMAUGT_CTPOLY1_BYTES]) {
311
+ memset(data, 0, sizeof(int16_t) * SMAUGT_N);
312
+ size_t bytes_idx = 0;
313
+ size_t i;
314
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
315
+ uint64_t packed = 0;
316
+ uint8_t packed2 = 0;
317
+ packed = packed | ((uint64_t)bytes[bytes_idx++] & 0x00000000000000ff);
318
+ packed =
319
+ packed | (((uint64_t)bytes[bytes_idx++] << 8) & 0x000000000000ff00);
320
+ packed = packed |
321
+ (((uint64_t)bytes[bytes_idx++] << 16) & 0x0000000000ff0000);
322
+ packed = packed |
323
+ (((uint64_t)bytes[bytes_idx++] << 24) & 0x00000000ff000000);
324
+ packed = packed |
325
+ (((uint64_t)bytes[bytes_idx++] << 32) & 0x000000ff00000000);
326
+ packed = packed |
327
+ (((uint64_t)bytes[bytes_idx++] << 40) & 0x0000ff0000000000);
328
+ packed = packed |
329
+ (((uint64_t)bytes[bytes_idx++] << 48) & 0x00ff000000000000);
330
+ packed = packed |
331
+ (((uint64_t)bytes[bytes_idx++] << 56) & 0xff00000000000000);
332
+ packed2 = bytes[bytes_idx++];
333
+
334
+ for (i = 0; i < 7; i++) {
335
+ data->coeffs[data_idx + i] =
336
+ (int16_t)((packed >> (9 * i)) & 0x00000000000001ff);
337
+ }
338
+ data->coeffs[data_idx + 7] = (int16_t)(packed >> 63) & 0x0001;
339
+ data->coeffs[data_idx + 7] |= ((int16_t)packed2 << 1 & 0x01fe);
340
+ }
341
+ }
342
+ #endif
343
+
344
+ #if SMAUGT_LOG_Q == 10
345
+ /*************************************************
346
+ * Name: pack_R2_10
347
+ *
348
+ * Description: Transform to bytes array from polynomial in Rq where q = 2^10
349
+ * Use 10 bits to encode each coefficient in [0, 2^10).
350
+ *
351
+ * Arguments: - uint8_t bytes[SMAUGT_PKPOLY_BYTES]: pointer to output bytes
352
+ * - const poly *data: pointer to input polynomial in Rq
353
+ **************************************************/
354
+ void pack_R2_10(uint8_t bytes[SMAUGT_PKPOLY_BYTES], const poly *data) {
355
+ memset(bytes, 0, sizeof(uint8_t) * SMAUGT_PKPOLY_BYTES);
356
+ size_t bytes_idx = 0;
357
+ size_t i;
358
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 4) {
359
+ uint64_t packed = 0;
360
+ for (i = 0; i < 4; ++i) {
361
+ packed |= ((uint64_t)((data->coeffs[data_idx + i] >> 6) & 0x03ff)
362
+ << (10 * i));
363
+ }
364
+
365
+ bytes[bytes_idx++] = (uint8_t)(packed & 0x00000000000000ff);
366
+ bytes[bytes_idx++] = (uint8_t)((packed >> 8) & 0x00000000000000ff);
367
+ bytes[bytes_idx++] = (uint8_t)((packed >> 16) & 0x00000000000000ff);
368
+ bytes[bytes_idx++] = (uint8_t)((packed >> 24) & 0x00000000000000ff);
369
+ bytes[bytes_idx++] = (uint8_t)((packed >> 32) & 0x00000000000000ff);
370
+ }
371
+ }
372
+
373
+ /*************************************************
374
+ * Name: unpack_R2_10
375
+ *
376
+ * Description: Transform to polynomial in Rq from bytes array, where q = 2^10
377
+ * Use 10 bits to decode each coefficient in [0, 2^10).
378
+ *
379
+ * Arguments: - poly *data: pointer to output polynomial in Rq
380
+ * - const uint8_t bytes[SMAUGT_PKPOLY_BYTES]: pointer to input
381
+ * bytes
382
+ **************************************************/
383
+ void unpack_R2_10(poly *data, const uint8_t bytes[SMAUGT_PKPOLY_BYTES]) {
384
+ memset(data, 0, sizeof(int16_t) * SMAUGT_N);
385
+ size_t bytes_idx = 0;
386
+ size_t i;
387
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 4) {
388
+ uint64_t packed = 0;
389
+ packed = packed | ((uint64_t)bytes[bytes_idx++] & 0x00000000000000ff);
390
+ packed =
391
+ packed | (((uint64_t)bytes[bytes_idx++] << 8) & 0x000000000000ff00);
392
+ packed = packed |
393
+ (((uint64_t)bytes[bytes_idx++] << 16) & 0x0000000000ff0000);
394
+ packed = packed |
395
+ (((uint64_t)bytes[bytes_idx++] << 24) & 0x00000000ff000000);
396
+ packed = packed |
397
+ (((uint64_t)bytes[bytes_idx++] << 32) & 0x000000ff00000000);
398
+
399
+ for (i = 0; i < 4; i++) {
400
+ data->coeffs[data_idx + i] =
401
+ (int16_t)(((packed >> (10 * i)) & 0x00000000000003ff) << 6);
402
+ }
403
+ }
404
+ }
405
+ #elif SMAUGT_LOG_Q == 11
406
+ /*************************************************
407
+ * Name: pack_R2_11
408
+ *
409
+ * Description: Transform to bytes array from polynomial in Rq where q = 2^11
410
+ * Use 11 bits to encode each coefficient in [0, 2^11).
411
+ *
412
+ * Arguments: - uint8_t bytes[SMAUGT_PKPOLY_BYTES]: pointer to output bytes
413
+ * - const poly *data: pointer to input polynomial in Rq
414
+ **************************************************/
415
+ void pack_R2_11(uint8_t bytes[SMAUGT_PKPOLY_BYTES], const poly *data) {
416
+ memset(bytes, 0, sizeof(uint8_t) * SMAUGT_PKPOLY_BYTES);
417
+ size_t bytes_idx = 0;
418
+ size_t i;
419
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
420
+ uint64_t packed = 0;
421
+ uint32_t packed2 = 0;
422
+
423
+ for (i = 0; i < 5; ++i) {
424
+ packed |= ((uint64_t)((data->coeffs[data_idx + i] >> 5) & 0x07ff)
425
+ << (11 * i));
426
+ }
427
+ packed |= (uint64_t)((data->coeffs[data_idx + 5] >> 5) & 0x0001) << 55;
428
+
429
+ packed2 = (uint32_t)((data->coeffs[data_idx + 5] >> 6) & 0x03ff);
430
+ for (i = 0; i < 2; ++i) {
431
+ packed2 |=
432
+ ((uint64_t)((data->coeffs[data_idx + 6 + i] >> 5) & 0x07ff)
433
+ << (10 + 11 * i));
434
+ }
435
+
436
+ bytes[bytes_idx++] = (uint8_t)(packed & 0x00000000000000ff);
437
+ bytes[bytes_idx++] = (uint8_t)((packed >> 8) & 0x00000000000000ff);
438
+ bytes[bytes_idx++] = (uint8_t)((packed >> 16) & 0x00000000000000ff);
439
+ bytes[bytes_idx++] = (uint8_t)((packed >> 24) & 0x00000000000000ff);
440
+ bytes[bytes_idx++] = (uint8_t)((packed >> 32) & 0x00000000000000ff);
441
+ bytes[bytes_idx++] = (uint8_t)((packed >> 40) & 0x00000000000000ff);
442
+ bytes[bytes_idx++] = (uint8_t)((packed >> 48) & 0x00000000000000ff);
443
+
444
+ bytes[bytes_idx++] = (uint8_t)(packed2 & 0x000000ff);
445
+ bytes[bytes_idx++] = (uint8_t)((packed2 >> 8) & 0x000000ff);
446
+ bytes[bytes_idx++] = (uint8_t)((packed2 >> 16) & 0x000000ff);
447
+ bytes[bytes_idx++] = (uint8_t)((packed2 >> 24) & 0x000000ff);
448
+ }
449
+ }
450
+
451
+ /*************************************************
452
+ * Name: unpack_R2_11
453
+ *
454
+ * Description: Transform to polynomial in Rq from bytes array, where q = 2^11
455
+ * Use 11 bits to decode each coefficient in [0, 2^11).
456
+ *
457
+ * Arguments: - poly *data: pointer to output polynomial in Rq
458
+ * - const uint8_t bytes[SMAUGT_PKPOLY_BYTES]: pointer to input
459
+ * bytes
460
+ **************************************************/
461
+ void unpack_R2_11(poly *data, const uint8_t bytes[SMAUGT_PKPOLY_BYTES]) {
462
+ memset(data, 0, sizeof(int16_t) * SMAUGT_N);
463
+ size_t bytes_idx = 0;
464
+ size_t i;
465
+ for (size_t data_idx = 0; data_idx < SMAUGT_N; data_idx += 8) {
466
+ uint64_t packed = 0;
467
+ uint32_t packed2 = 0;
468
+ packed = packed | ((uint64_t)bytes[bytes_idx++] & 0x00000000000000ff);
469
+ packed =
470
+ packed | (((uint64_t)bytes[bytes_idx++] << 8) & 0x000000000000ff00);
471
+ packed = packed |
472
+ (((uint64_t)bytes[bytes_idx++] << 16) & 0x0000000000ff0000);
473
+ packed = packed |
474
+ (((uint64_t)bytes[bytes_idx++] << 24) & 0x00000000ff000000);
475
+ packed = packed |
476
+ (((uint64_t)bytes[bytes_idx++] << 32) & 0x000000ff00000000);
477
+ packed = packed |
478
+ (((uint64_t)bytes[bytes_idx++] << 40) & 0x0000ff0000000000);
479
+ packed = packed |
480
+ (((uint64_t)bytes[bytes_idx++] << 48) & 0x00ff000000000000);
481
+
482
+ packed2 = packed2 | ((uint64_t)bytes[bytes_idx++] & 0x00000000000000ff);
483
+ packed2 = packed2 |
484
+ (((uint64_t)bytes[bytes_idx++] << 8) & 0x000000000000ff00);
485
+ packed2 = packed2 |
486
+ (((uint64_t)bytes[bytes_idx++] << 16) & 0x0000000000ff0000);
487
+ packed2 = packed2 |
488
+ (((uint64_t)bytes[bytes_idx++] << 24) & 0x00000000ff000000);
489
+
490
+ for (i = 0; i < 5; i++) {
491
+ data->coeffs[data_idx + i] =
492
+ (int16_t)(((packed >> (11 * i)) & 0x00000000000007ff) << 5);
493
+ }
494
+ data->coeffs[data_idx + 5] = (int16_t)(((packed >> 55) & 0x0001) << 5);
495
+
496
+ data->coeffs[data_idx + 5] |= (int16_t)((packed2 & 0x03ff) << 6);
497
+ for (i = 0; i < 2; i++) {
498
+ data->coeffs[data_idx + 6 + i] =
499
+ (int16_t)(((packed2 >> (10 + 11 * i)) & 0x000007ff) << 5);
500
+ }
501
+ }
502
+ }
503
+ #endif