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.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +174 -0
- data/Rakefile +57 -0
- data/THIRD_PARTY_NOTICES.md +53 -0
- data/ext/kpqc/aimer128f/extconf.rb +4 -0
- data/ext/kpqc/aimer128s/extconf.rb +4 -0
- data/ext/kpqc/aimer192f/extconf.rb +4 -0
- data/ext/kpqc/aimer192s/extconf.rb +4 -0
- data/ext/kpqc/aimer256f/extconf.rb +4 -0
- data/ext/kpqc/aimer256s/extconf.rb +4 -0
- data/ext/kpqc/extconf_helper.rb +93 -0
- data/ext/kpqc/haetae2/extconf.rb +4 -0
- data/ext/kpqc/haetae3/extconf.rb +4 -0
- data/ext/kpqc/haetae5/extconf.rb +4 -0
- data/ext/kpqc/module.c +195 -0
- data/ext/kpqc/ntruplus1152/extconf.rb +4 -0
- data/ext/kpqc/ntruplus768/extconf.rb +4 -0
- data/ext/kpqc/ntruplus864/extconf.rb +4 -0
- data/ext/kpqc/randombytes.c +107 -0
- data/ext/kpqc/smaugt128/extconf.rb +4 -0
- data/ext/kpqc/smaugt192/extconf.rb +4 -0
- data/ext/kpqc/smaugt256/extconf.rb +4 -0
- data/ext/kpqc/timer/extconf.rb +4 -0
- data/kpqc.gemspec +41 -0
- data/lib/kpqc/aimer.rb +38 -0
- data/lib/kpqc/api.rb +129 -0
- data/lib/kpqc/haetae.rb +25 -0
- data/lib/kpqc/ntruplus.rb +25 -0
- data/lib/kpqc/smaugt.rb +29 -0
- data/lib/kpqc/types.rb +103 -0
- data/lib/kpqc/version.rb +6 -0
- data/lib/kpqc.rb +33 -0
- data/test/algorithm_test.rb +111 -0
- data/test/api_test.rb +52 -0
- data/test/interop.mjs +34 -0
- data/test/interop_test.rb +82 -0
- data/test/kat/aimer128f.rsp +10 -0
- data/test/kat/aimer128s.rsp +10 -0
- data/test/kat/aimer192f.rsp +10 -0
- data/test/kat/aimer192s.rsp +10 -0
- data/test/kat/aimer256f.rsp +10 -0
- data/test/kat/aimer256s.rsp +10 -0
- data/test/kat/haetae2.rsp +10 -0
- data/test/kat/haetae3.rsp +10 -0
- data/test/kat/haetae5.rsp +10 -0
- data/test/kat/ntruplus1152.rsp +8 -0
- data/test/kat/ntruplus768.rsp +8 -0
- data/test/kat/ntruplus864.rsp +8 -0
- data/test/kat/smaugt128.rsp +8 -0
- data/test/kat/smaugt192.rsp +8 -0
- data/test/kat/smaugt256.rsp +8 -0
- data/test/kat/timer.rsp +8 -0
- data/test/kat_drbg.rb +155 -0
- data/test/kat_test.rb +99 -0
- data/test/test_helper.rb +21 -0
- data/vendor/AIMer/LICENSE +21 -0
- data/vendor/AIMer/aim2.c +163 -0
- data/vendor/AIMer/aim2.h +36 -0
- data/vendor/AIMer/aim2_constant.h +74 -0
- data/vendor/AIMer/api.h +42 -0
- data/vendor/AIMer/common/crypto_declassify.h +7 -0
- data/vendor/AIMer/common/fips202.c +878 -0
- data/vendor/AIMer/common/fips202.h +166 -0
- data/vendor/AIMer/common/rng.h +56 -0
- data/vendor/AIMer/field.h +43 -0
- data/vendor/AIMer/field128.c +454 -0
- data/vendor/AIMer/field192.c +485 -0
- data/vendor/AIMer/field256.c +564 -0
- data/vendor/AIMer/hash.c +50 -0
- data/vendor/AIMer/hash.h +37 -0
- data/vendor/AIMer/params/params-aimer-128f.h +34 -0
- data/vendor/AIMer/params/params-aimer-128s.h +34 -0
- data/vendor/AIMer/params/params-aimer-192f.h +34 -0
- data/vendor/AIMer/params/params-aimer-192s.h +34 -0
- data/vendor/AIMer/params/params-aimer-256f.h +34 -0
- data/vendor/AIMer/params/params-aimer-256s.h +34 -0
- data/vendor/AIMer/params.h +5 -0
- data/vendor/AIMer/sign.c +631 -0
- data/vendor/AIMer/sign.h +40 -0
- data/vendor/AIMer/tree.c +75 -0
- data/vendor/AIMer/tree.h +26 -0
- data/vendor/HAETAE/LICENSE +22 -0
- data/vendor/HAETAE/include/api.h +54 -0
- data/vendor/HAETAE/include/common.h +12 -0
- data/vendor/HAETAE/include/config.h +42 -0
- data/vendor/HAETAE/include/decompose.h +19 -0
- data/vendor/HAETAE/include/encoding.h +20 -0
- data/vendor/HAETAE/include/fft.h +26 -0
- data/vendor/HAETAE/include/fips202.h +40 -0
- data/vendor/HAETAE/include/fixpoint.h +125 -0
- data/vendor/HAETAE/include/ntt.h +16 -0
- data/vendor/HAETAE/include/packing.h +58 -0
- data/vendor/HAETAE/include/params.h +117 -0
- data/vendor/HAETAE/include/poly.h +65 -0
- data/vendor/HAETAE/include/polyfix.h +65 -0
- data/vendor/HAETAE/include/polymat.h +32 -0
- data/vendor/HAETAE/include/polyvec.h +131 -0
- data/vendor/HAETAE/include/randombytes.h +39 -0
- data/vendor/HAETAE/include/rans_byte.h +335 -0
- data/vendor/HAETAE/include/reduce.h +31 -0
- data/vendor/HAETAE/include/sampler.h +23 -0
- data/vendor/HAETAE/include/symmetric.h +52 -0
- data/vendor/HAETAE/src/decompose.c +73 -0
- data/vendor/HAETAE/src/encoding.c +700 -0
- data/vendor/HAETAE/src/fft.c +235 -0
- data/vendor/HAETAE/src/fips202.c +745 -0
- data/vendor/HAETAE/src/fixpoint.c +143 -0
- data/vendor/HAETAE/src/ntt.c +98 -0
- data/vendor/HAETAE/src/packing.c +595 -0
- data/vendor/HAETAE/src/poly.c +371 -0
- data/vendor/HAETAE/src/polyfix.c +298 -0
- data/vendor/HAETAE/src/polymat.c +82 -0
- data/vendor/HAETAE/src/polyvec.c +534 -0
- data/vendor/HAETAE/src/reduce.c +96 -0
- data/vendor/HAETAE/src/sampler.c +310 -0
- data/vendor/HAETAE/src/sign.c +558 -0
- data/vendor/HAETAE/src/symmetric-shake.c +50 -0
- data/vendor/NTRUplus/LICENSE +21 -0
- data/vendor/NTRUplus/NTRU+1152/api.h +24 -0
- data/vendor/NTRUplus/NTRU+1152/fips202/fips202.c +878 -0
- data/vendor/NTRUplus/NTRU+1152/fips202/fips202.h +166 -0
- data/vendor/NTRUplus/NTRU+1152/kem.c +286 -0
- data/vendor/NTRUplus/NTRU+1152/ntt.c +394 -0
- data/vendor/NTRUplus/NTRU+1152/ntt.h +16 -0
- data/vendor/NTRUplus/NTRU+1152/params.h +18 -0
- data/vendor/NTRUplus/NTRU+1152/poly.c +318 -0
- data/vendor/NTRUplus/NTRU+1152/poly.h +31 -0
- data/vendor/NTRUplus/NTRU+1152/randombytes.h +9 -0
- data/vendor/NTRUplus/NTRU+1152/symmetric.c +39 -0
- data/vendor/NTRUplus/NTRU+1152/symmetric.h +12 -0
- data/vendor/NTRUplus/NTRU+768/api.h +24 -0
- data/vendor/NTRUplus/NTRU+768/fips202/fips202.c +878 -0
- data/vendor/NTRUplus/NTRU+768/fips202/fips202.h +166 -0
- data/vendor/NTRUplus/NTRU+768/kem.c +286 -0
- data/vendor/NTRUplus/NTRU+768/ntt.c +379 -0
- data/vendor/NTRUplus/NTRU+768/ntt.h +16 -0
- data/vendor/NTRUplus/NTRU+768/params.h +18 -0
- data/vendor/NTRUplus/NTRU+768/poly.c +320 -0
- data/vendor/NTRUplus/NTRU+768/poly.h +31 -0
- data/vendor/NTRUplus/NTRU+768/randombytes.h +9 -0
- data/vendor/NTRUplus/NTRU+768/symmetric.c +39 -0
- data/vendor/NTRUplus/NTRU+768/symmetric.h +12 -0
- data/vendor/NTRUplus/NTRU+864/api.h +24 -0
- data/vendor/NTRUplus/NTRU+864/fips202/fips202.c +878 -0
- data/vendor/NTRUplus/NTRU+864/fips202/fips202.h +166 -0
- data/vendor/NTRUplus/NTRU+864/kem.c +286 -0
- data/vendor/NTRUplus/NTRU+864/ntt.c +383 -0
- data/vendor/NTRUplus/NTRU+864/ntt.h +16 -0
- data/vendor/NTRUplus/NTRU+864/params.h +18 -0
- data/vendor/NTRUplus/NTRU+864/poly.c +314 -0
- data/vendor/NTRUplus/NTRU+864/poly.h +31 -0
- data/vendor/NTRUplus/NTRU+864/randombytes.h +9 -0
- data/vendor/NTRUplus/NTRU+864/symmetric.c +39 -0
- data/vendor/NTRUplus/NTRU+864/symmetric.h +12 -0
- data/vendor/SMAUG-T/LICENSE +22 -0
- data/vendor/SMAUG-T/include/api.h +37 -0
- data/vendor/SMAUG-T/include/cbd.h +15 -0
- data/vendor/SMAUG-T/include/ciphertext.h +45 -0
- data/vendor/SMAUG-T/include/common.h +12 -0
- data/vendor/SMAUG-T/include/config.h +48 -0
- data/vendor/SMAUG-T/include/dg.h +28 -0
- data/vendor/SMAUG-T/include/fips202.h +41 -0
- data/vendor/SMAUG-T/include/hash.h +21 -0
- data/vendor/SMAUG-T/include/hwt.h +28 -0
- data/vendor/SMAUG-T/include/indcpa.h +33 -0
- data/vendor/SMAUG-T/include/key.h +34 -0
- data/vendor/SMAUG-T/include/pack.h +78 -0
- data/vendor/SMAUG-T/include/packring.h +50 -0
- data/vendor/SMAUG-T/include/params.h +84 -0
- data/vendor/SMAUG-T/include/poly.h +41 -0
- data/vendor/SMAUG-T/include/randombytes.h +11 -0
- data/vendor/SMAUG-T/include/toomcook.h +14 -0
- data/vendor/SMAUG-T/include/verify.h +16 -0
- data/vendor/SMAUG-T/src/cbd.c +159 -0
- data/vendor/SMAUG-T/src/ciphertext.c +95 -0
- data/vendor/SMAUG-T/src/dg.c +112 -0
- data/vendor/SMAUG-T/src/fips202.c +745 -0
- data/vendor/SMAUG-T/src/hash.c +15 -0
- data/vendor/SMAUG-T/src/hwt.c +121 -0
- data/vendor/SMAUG-T/src/indcpa.c +187 -0
- data/vendor/SMAUG-T/src/kem.c +194 -0
- data/vendor/SMAUG-T/src/key.c +102 -0
- data/vendor/SMAUG-T/src/pack.c +349 -0
- data/vendor/SMAUG-T/src/packring.c +503 -0
- data/vendor/SMAUG-T/src/poly.c +200 -0
- data/vendor/SMAUG-T/src/toomcook.c +256 -0
- data/vendor/SMAUG-T/src/verify.c +48 -0
- data/vendor/SOURCES.json +130 -0
- 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
|