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,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,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
|
+
}
|