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,112 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
#include "dg.h"
|
|
4
|
+
#include "fips202.h"
|
|
5
|
+
|
|
6
|
+
#include <string.h>
|
|
7
|
+
|
|
8
|
+
/*************************************************
|
|
9
|
+
* Name: load64_littleendian
|
|
10
|
+
*
|
|
11
|
+
* Description: load 8 bytes into a 64-bit integer
|
|
12
|
+
* in little-endian order
|
|
13
|
+
*
|
|
14
|
+
* Arguments: - uint64_t *out: pointer to output int64_t array
|
|
15
|
+
* - size_t outlen: output length (should be a multiple of 10)
|
|
16
|
+
* - const uint8_t *in: pointer to input byte array
|
|
17
|
+
**************************************************/
|
|
18
|
+
#define load64_littleendian SMAUGT_NAMESPACE(load64_littleendian)
|
|
19
|
+
static void load64_littleendian(uint64_t *out, size_t outlen,
|
|
20
|
+
const uint8_t *in) {
|
|
21
|
+
unsigned int i, j, pos = 0;
|
|
22
|
+
for (i = 0; i < outlen / 10; ++i) {
|
|
23
|
+
for (j = 0; j < 10; j++) {
|
|
24
|
+
out[10 * i + j] = ((uint64_t)(in[pos + j])) |
|
|
25
|
+
((uint64_t)(in[pos + 10 + j]) << 8) |
|
|
26
|
+
((uint64_t)(in[pos + 20 + j]) << 16) |
|
|
27
|
+
((uint64_t)(in[pos + 30 + j]) << 24) |
|
|
28
|
+
((uint64_t)(in[pos + 40 + j]) << 32) |
|
|
29
|
+
((uint64_t)(in[pos + 50 + j]) << 40) |
|
|
30
|
+
((uint64_t)(in[pos + 60 + j]) << 48) |
|
|
31
|
+
((uint64_t)(in[pos + 70 + j]) << 56);
|
|
32
|
+
}
|
|
33
|
+
pos += 80;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// referenced
|
|
38
|
+
// A. Karmakar, S. S. Roy, O. Reparaz, F. Vercauteren and I.
|
|
39
|
+
// Verbauwhede, "Constant-Time Discrete Gaussian Sampling," in IEEE Transactions
|
|
40
|
+
// on Computers, vol. 67, no. 11, pp. 1561-1571, 1 Nov. 2018,
|
|
41
|
+
// doi: 10.1109/TC.2018.2814587.
|
|
42
|
+
|
|
43
|
+
// for python metacode that generates this code, please refer to notion page
|
|
44
|
+
// https://www.notion.so/Constant-Time-Discrete-Gaussian-Sampling-25cc46cdf40549eabd4923d01d8ce259
|
|
45
|
+
|
|
46
|
+
/*************************************************
|
|
47
|
+
* Name: d_gaussian_poly
|
|
48
|
+
*
|
|
49
|
+
* Description: Sample a discrete Gaussian noise e and add the noise e to the
|
|
50
|
+
* output vector op
|
|
51
|
+
*
|
|
52
|
+
* Arguments: - poly *op: pointer to output vector op
|
|
53
|
+
* - const uint8_t *seed: pointer to input seed (of length
|
|
54
|
+
* SMAUGT_CRYPTO_BYTES+1)
|
|
55
|
+
*
|
|
56
|
+
* Specification: Implements Algorithm 11, dGaussianPoly.
|
|
57
|
+
**************************************************/
|
|
58
|
+
int d_gaussian_poly(poly *op, const uint8_t *seed) {
|
|
59
|
+
unsigned int i = 0, j = 0, k = 0;
|
|
60
|
+
uint64_t seed_temp[SMAUGT_DG_SMAUGT_SEED_LEN] = {0};
|
|
61
|
+
uint8_t buf[SMAUGT_DG_SMAUGT_SEED_LEN * 8] = {0};
|
|
62
|
+
uint64_t s[SMAUGT_DG_SMAUGT_SLEN] = {0};
|
|
63
|
+
uint64_t *x = NULL;
|
|
64
|
+
|
|
65
|
+
shake256(buf, SMAUGT_DG_SMAUGT_SEED_LEN * 8, seed, SMAUGT_CRYPTO_BYTES + 1);
|
|
66
|
+
load64_littleendian(seed_temp, SMAUGT_DG_SMAUGT_SEED_LEN, buf);
|
|
67
|
+
|
|
68
|
+
for (i = 0; i < SMAUGT_N; i += 64) {
|
|
69
|
+
x = seed_temp + j;
|
|
70
|
+
s[0] = (x[0] & x[1] & x[2] & x[3] & x[4] & x[5] & x[7] & ~x[8]) |
|
|
71
|
+
(x[0] & x[3] & x[4] & x[5] & x[6] & x[8]) |
|
|
72
|
+
(x[1] & x[3] & x[4] & x[5] & x[6] & x[8]) |
|
|
73
|
+
(x[2] & x[3] & x[4] & x[5] & x[6] & x[8]) |
|
|
74
|
+
(~x[2] & ~x[3] & ~x[6] & x[8]) | (~x[1] & ~x[3] & ~x[6] & x[8]) |
|
|
75
|
+
(x[6] & x[7] & ~x[8]) | (~x[5] & ~x[6] & x[8]) |
|
|
76
|
+
(~x[4] & ~x[6] & x[8]) | (~x[7] & x[8]);
|
|
77
|
+
s[1] = (x[1] & x[2] & x[4] & x[5] & x[7] & x[8]) |
|
|
78
|
+
(x[3] & x[4] & x[5] & x[7] & x[8]) | (x[6] & x[7] & x[8]);
|
|
79
|
+
for (k = 0; k < 64; ++k) {
|
|
80
|
+
op->coeffs[i + k] =
|
|
81
|
+
((s[0] >> k) & 0x01) | (((s[1] >> k) & 0x01) << 1);
|
|
82
|
+
uint16_t sign = (x[9] >> k) & 0x01;
|
|
83
|
+
op->coeffs[i + k] = (((-sign) ^ op->coeffs[i + k]) + sign)
|
|
84
|
+
<< SMAUGT_MODULUS_16_LOG_Q;
|
|
85
|
+
}
|
|
86
|
+
j += SMAUGT_DG_RAND_BITS;
|
|
87
|
+
}
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/*************************************************
|
|
92
|
+
* Name: d_gaussian
|
|
93
|
+
*
|
|
94
|
+
* Description: Given an array of seed bytes, compute
|
|
95
|
+
* polynomial with coefficients sampled from a discrete gaussian
|
|
96
|
+
* distribution
|
|
97
|
+
*
|
|
98
|
+
* Arguments: - polyvec *op: pointer to output polynomial vector
|
|
99
|
+
* - const uint8_t seed[SMAUGT_CRYPTO_BYTES]: pointer to input byte
|
|
100
|
+
* array
|
|
101
|
+
*
|
|
102
|
+
* Specification: Implements Algorithm 10, dGaussian.
|
|
103
|
+
**************************************************/
|
|
104
|
+
void d_gaussian(polyvec *op, const uint8_t seed[SMAUGT_CRYPTO_BYTES]) {
|
|
105
|
+
unsigned int i;
|
|
106
|
+
uint8_t extseed[SMAUGT_CRYPTO_BYTES + 1] = {0};
|
|
107
|
+
memcpy(extseed, seed, SMAUGT_CRYPTO_BYTES);
|
|
108
|
+
for (i = 0; i < SMAUGT_K; ++i) {
|
|
109
|
+
extseed[SMAUGT_CRYPTO_BYTES] = SMAUGT_K * i;
|
|
110
|
+
d_gaussian_poly(&(op->vec[i]), extseed);
|
|
111
|
+
}
|
|
112
|
+
}
|