jschanck / ntru Goto Github PK
View Code? Open in Web Editor NEWImplementations of the NIST post-quantum cryptography process finalist NTRU.
Home Page: https://ntru.org
License: Creative Commons Zero v1.0 Universal
Implementations of the NIST post-quantum cryptography process finalist NTRU.
Home Page: https://ntru.org
License: Creative Commons Zero v1.0 Universal
Fails to compile on Mac and Linux (CentOS 8 and Ubuntu 18.04.02):
$ cd ref-hrss701
$ make
gcc -O3 -fomit-frame-pointer -march=native -fPIC -fPIE -pie -Wall -Wextra -Wpedantic -DCRYPTO_NAMESPACE\(s\)=##s -o test/test_polymul cmov.c fips202.c kem.c owcpa.c pack3.c packq.c poly.c poly_lift.c poly_mod.c poly_r2_inv.c poly_rq_mul.c poly_s3_inv.c sample.c sample_iid.c randombytes.c test/test_polymul.c
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
In file included from kem.c:1:
api.h:11:28: error: ‘CRYPTO_NAMESPACE’ declared as function returning a function
#define crypto_kem_keypair CRYPTO_NAMESPACE(keypair)
^~~~~~~~~~~~~~~~
api.h:12:5: note: in expansion of macro ‘crypto_kem_keypair’
int crypto_kem_keypair(unsigned char *pk, unsigned char *sk);
^~~~~~~~~~~~~~~~~~
api.h:12:1: warning: parameter names (without types) in function declaration
int crypto_kem_keypair(unsigned char *pk, unsigned char *sk);
^~~
api.h:14:24: error: ‘CRYPTO_NAMESPACE’ declared as function returning a function
#define crypto_kem_enc CRYPTO_NAMESPACE(enc)
^~~~~~~~~~~~~~~~
api.h:15:5: note: in expansion of macro ‘crypto_kem_enc’
int crypto_kem_enc(unsigned char *c, unsigned char *k, const unsigned char *pk);
^~~~~~~~~~~~~~
api.h:15:1: warning: parameter names (without types) in function declaration
int crypto_kem_enc(unsigned char *c, unsigned char *k, const unsigned char *pk);
^~~
api.h:17:24: error: ‘CRYPTO_NAMESPACE’ declared as function returning a function
#define crypto_kem_dec CRYPTO_NAMESPACE(dec)
^~~~~~~~~~~~~~~~
api.h:18:5: note: in expansion of macro ‘crypto_kem_dec’
int crypto_kem_dec(unsigned char *k, const unsigned char *c, const unsigned char *sk);
^~~~~~~~~~~~~~
api.h:18:1: warning: parameter names (without types) in function declaration
int crypto_kem_dec(unsigned char *k, const unsigned char *c, const unsigned char *sk);
^~~
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
<command-line>: error: '##' cannot appear at either end of a macro expansion
make: *** [Makefile:45: test/test_polymul] Error 1
The above happens with all the compilers I have - current Apple Clang, Clang-10, GCC-10, and on both Mac and Linux platforms.
With avx2-hrss701
it's even merrier - missing source file verify.c
:
$ cd avx2-hrss701/
$ make
make: *** No rule to make target `verify.c', needed by `test/test_polymul'. Stop.
The version of cp
command on Mac does not take -l
flag. My way of remedying this was installing coreutils
package from Macports, and changing the script to use gcp
instead of cp
, like
( cd ${WORKDIR}/ref-${PARAM}/
- cp -l api.h cmov.h owcpa.h params.h poly.h sample.h ${DIRNAME}/ntru${PARAM}/clean/
- cp -l cmov.c kem.c owcpa.c pack3.c packq.c poly.c poly_lift.c poly_mod.c poly_r2_inv.c poly_rq_mul.c poly_s3_inv.c sample.c sample_iid.c ${DIRNAME}/ntru${PARAM}/clean/ )
+ gcp -l api.h cmov.h owcpa.h params.h poly.h sample.h ${DIRNAME}/ntru${PARAM}/clean/
+ gcp -l cmov.c kem.c owcpa.c pack3.c packq.c poly.c poly_lift.c poly_mod.c poly_r2_inv.c poly_rq_mul.c poly_s3_inv.c sample.c sample_iid.c ${DIRNAME}/ntru${PARAM}/clean/ )
( cd ${WORKDIR}/avx2-${PARAM}/
While I'm not suggesting that the script is changed - perhaps it would make sense to add a platform README, or mention these things in the main README?
On CentOS-8 there's no unifdef
(and no astyle
, but the last one can be installed via sudo yum install astyle
easily enough):
. . . . .
NTRU_NAMESPACE=PQCLEAN_NTRUHPS4096821_AVX2_ python3 asmgen/poly_s3_inv.py 820 | sed 's/4294967295/-1/g' > poly_s3_inv.c
./package_pqclean.sh: line 199: unifdef: command not found
./package_pqclean.sh: line 200: unifdef: command not found
./package_pqclean.sh: line 201: unifdef: command not found
./package_pqclean.sh: line 202: unifdef: command not found
./package_pqclean.sh: line 203: unifdef: command not found
./package_pqclean.sh: line 234: astyle: command not found
Interestingly, macOS does come with unifdef
.
Also, if the directory already exists - there's an error message:
$ ./package_pqclean.sh
/Users/ur20980/src/ntru
Error; directory already exists; delete first.
IMHO, it would be far better if the error message would tell the user what directory it means:
diff --git a/package_pqclean.sh b/package_pqclean.sh
index 87064b7..31d210e 100755
--- a/package_pqclean.sh
+++ b/package_pqclean.sh
@@ -8,7 +8,7 @@ echo $WORKDIR
DIRNAME=${WORKDIR}/crypto_kem
if [ -e "$DIRNAME" ]; then
- echo "Error; directory already exists; delete first."
+ echo "Error; directory \"${DIRNAME}\" already exists; delete first."
exit -1
fi
The current code contains comparison of unsigned long
to int
(signed aaginst unsigned). Compilers don't like it, and issue warnings. Here's a proposed fix (since buffer_pos
is unlikely to be negative):
diff --git a/ref-common/rng.h b/ref-common/rng.h
index 577e263..1ae2154 100644
--- a/ref-common/rng.h
+++ b/ref-common/rng.h
@@ -17,7 +17,7 @@
typedef struct {
unsigned char buffer[16];
- int buffer_pos;
+ unsigned long buffer_pos;
unsigned long length_remaining;
unsigned char key[32];
unsigned char ctr[16];
Perhaps there are other places in the code where indices are defined as int
? If so, could I suggest changing them to unsigned long
or size_t
?
Output of "clang -O3" branches on the "done" flag in ref-common/poly_r2_inv.c.
Affects these calls:
Line 84 in 5cce297
Line 85 in 5cce297
Line 87 in 5cce297
Line 88 in 5cce297
This was caught using Moritz Neikes' TIMECOP (as incorporated into SUPERCOP 20200820).
Not clear that there is a security issue here, but it is easily fixed by re-implementing poly_r2_inv.c along the lines of b1185f2 (i.e. supercop/crypto_core/invhrss701/simpler).
3.5 GHz Dual-Core Intel Core i7, macOS Catalina 10.15.6, Xcode-11.6, GCC-10, current master
Fails to compile on a 64-bit-only OS:
. . . . .
poly_rq_mul.s:3:8: error: invalid alignment value
.align 32
^
poly_rq_mul.s:225:1: error: unknown directive
.hidden poly_Rq_mul
^
poly_r2_mul.s:2:17: error: unexpected token in '.section' directive
.section .rodata
^
poly_r2_mul.s:3:8: error: invalid alignment value
.align 32
^
poly_r2_mul.s:107:1: error: unknown directive
.hidden poly_R2_mul
^
poly_rq_to_s3.s:2:17: error: unexpected token in '.section' directive
.section .rodata
. . . . .
Complete build log: avx2-build.txt
Hi,
So I have NEON implementation of NTRU, the work mostly spent on polynomial multiplication. Here are the benchmark results:
NTRU M1 REF | ref HPS509 | ref HPS677 | ref HRSS701 | ref HPS821 |
---|---|---|---|---|
crypto_kem_keypair | 3,501,828 | 6,219,493 | 6,578,665 | 9,056,209 |
crypto_kem_enc | 103,059 | 182,986 | 152,390 | 244,308 |
crypto_kem_dec | 231,254 | 429,798 | 439,859 | 583,865 |
poly_Rq_mul | 70,576 | 134,764 | 133,792 | 185,126 |
poly_S3_mul | 72,711 | 137,327 | 136,482 | 188,243 |
sample_fixed_type | 27,808 | 42,299 | 3,422 | 53,976 |
poly_lift | 115 | 176 | 12,193 | 165 |
poly_Rq_to_S3 | 2,209 | 2,836 | 2,936 | 3,504 |
poly_Rq_sum_zero_tobytes | 449 | 600 | 620 | 159 |
poly_Rq_sum_zero_frombytes | 1,189 | 1,567 | 1,797 | 1,119 |
poly_S3_tobytes | 328 | 433 | 447 | 523 |
poly_S3_frombytes | 2,299 | 2,978 | 3,086 | 3,653 |
NTRU M1 NEON | neon HPS509 | neon HPS677 | neon HRSS701 | neon HPS821 |
---|---|---|---|---|
crypto_kem_keypair | 2,684,977 | 4,715,457 | 5,032,358 | 6,993,689 |
crypto_kem_enc | 39,158 | 60,198 | 23,145 | 75,630 |
crypto_kem_dec | 33,024 | 53,708 | 60,644 | 69,213 |
poly_Rq_mul | 7,347 | 11,595 | 15,689 | 17,241 |
poly_S3_mul | 7,509 | 11,876 | 15,660 | 17,432 |
sample_fixed_type | 27,853 | 42,254 | 3,425 | 54,036 |
poly_lift | 65 | 89 | 1,074 | 105 |
poly_Rq_to_S3 | 279 | 383 | 383 | 452 |
poly_Rq_sum_zero_tobytes | 449 | 600 | 620 | 159 |
poly_Rq_sum_zero_frombytes | 1,189 | 1,566 | 1,797 | 1,119 |
poly_S3_tobytes | 329 | 435 | 447 | 523 |
poly_S3_frombytes | 360 | 501 | 509 | 597 |
Edit: The unit is clock cycles.
I think the number speaks for itself.
Do you want me to pull this implementation to NTRU code base ?
If so, please let me know what to do.
Hi!
What is the maximum length of encapsulate key (plain text) ?
Motive: I need use the kem with a aes ctr mode. Beyond the key itself (256bits),
the decryption part need the IV(nonce) used to encryption to be sended with the key. the IV has
length of 128bits. I'm targeting ref-hps4096821.
Thanks!
Best whishes,
Dani.
Something about _pext_u64()
:
cc -O3 -fomit-frame-pointer -march=native -fPIC -fPIE -pie -Wall -Wextra -Wpedantic -DCRYPTO_NAMESPACE\(s\)=ntru_##s -mssse3 -msse4 -mavx2 -o test/test_polymul cmov.c crypto_sort_int32.c fips202.c kem.c owcpa.c pack3.c packq.c poly.c poly_lift.c poly_r2_inv.c poly_s3_inv.c sample.c sample_iid.c randombytes.c square_1_509_patience.s square_3_509_patience.s square_6_509_patience.s square_15_509_shufbytes.s square_30_509_shufbytes.s square_63_509_shufbytes.s square_126_509_shufbytes.s square_252_509_shufbytes.s poly_rq_mul.s poly_r2_mul.s poly_rq_to_s3.s vec32_sample_iid.s poly_mod_3_Phi_n.s poly_mod_q_Phi_n.s test/test_polymul.c cpucycles.c
In file included from /usr/lib/gcc/x86_64-redhat-linux/8/include/immintrin.h:95,
from poly_r2_inv.c:1:
poly_r2_inv.c: In function ‘ntru_poly_R2_tobytes’:
/usr/lib/gcc/x86_64-redhat-linux/8/include/bmi2intrin.h:76:1: error: inlining failed in call to always_inline ‘_pext_u64’: target specific option mismatch
_pext_u64 (unsigned long long __X, unsigned long long __Y)
^~~~~~~~~
poly_r2_inv.c:23:15: note: called from here
out[i] |= _pext_u64(coeff_pointer[2*i+1], 0x1000100010001) << 4;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-redhat-linux/8/include/immintrin.h:95,
from poly_r2_inv.c:1:
/usr/lib/gcc/x86_64-redhat-linux/8/include/bmi2intrin.h:76:1: error: inlining failed in call to always_inline ‘_pext_u64’: target specific option mismatch
_pext_u64 (unsigned long long __X, unsigned long long __Y)
^~~~~~~~~
poly_r2_inv.c:22:14: note: called from here
out[i] = _pext_u64(coeff_pointer[2*i], 0x1000100010001);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-redhat-linux/8/include/immintrin.h:95,
from poly_r2_inv.c:1:
/usr/lib/gcc/x86_64-redhat-linux/8/include/bmi2intrin.h:76:1: error: inlining failed in call to always_inline ‘_pext_u64’: target specific option mismatch
_pext_u64 (unsigned long long __X, unsigned long long __Y)
^~~~~~~~~
poly_r2_inv.c:26:13: note: called from here
out[i] |= _pext_u64(coeff_pointer[2*63+1], 0x1) << 4;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-redhat-linux/8/include/immintrin.h:95,
from poly_r2_inv.c:1:
/usr/lib/gcc/x86_64-redhat-linux/8/include/bmi2intrin.h:76:1: error: inlining failed in call to always_inline ‘_pext_u64’: target specific option mismatch
_pext_u64 (unsigned long long __X, unsigned long long __Y)
^~~~~~~~~
poly_r2_inv.c:25:12: note: called from here
out[i] = _pext_u64(coeff_pointer[2*63], 0x1000100010001);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make: *** [Makefile:88: test/test_polymul] Error 1
make: Leaving directory '/home/ur20980/src/ntru/avx2-hps2048509'
Also, currently the only way to pass extra CFLAGS is manually editing the Makefiles. It would be nice if there was a clean mechanism to pass them, e.g., through an env var.
A bit of digging shows that pext_u64
requires bmi2
CPU support - I'm not sure it's a part of AVX2. Are you certain you want to depend on bmi2
support? If you are, perhaps it's worth documenting somewhere?
This is what it does on Mac to all the sed
-edited files (e.g., file api.h
):
#ifndef PQCLEAN_NTRU]]]]701_[]]2_API_H
#define PQCLEAN_NTRU]]]]701_[]]2_API_H
#include <stdint.h>
#define PQCLEAN_NTRU]]]]701_[]]2_CRYPTO_SECRETKEYBYTES 1450
#define PQCLEAN_NTRU]]]]701_[]]2_CRYPTO_PUBLICKEYBYTES 1138
#define PQCLEAN_NTRU]]]]701_[]]2_CRYPTO_CIPHERTEXTBYTES 1138
#define PQCLEAN_NTRU]]]]701_[]]2_CRYPTO_BYTES 32
This is what fixes the problem:
diff --git a/package_pqclean.sh b/package_pqclean.sh
index 2967141..c35c4b1 100755
--- a/package_pqclean.sh
+++ b/package_pqclean.sh
@@ -16,7 +16,7 @@ for PARAM in hrss701 hps2048509 hps2048677 hps4096821; do
mkdir -p ${DIRNAME}/ntru${PARAM}/avx2
mkdir -p ${DIRNAME}/ntru${PARAM}/clean
- export NTRU_NAMESPACE=$(echo PQCLEAN_NTRU${PARAM}_AVX2_ | tr [:lower:] [:upper:])
+ export NTRU_NAMESPACE=$(echo "PQCLEAN_NTRU${PARAM}_AVX2_" | tr [:lower:] [:upper:])
( cd ${WORKDIR}/avx2-${PARAM} && make -B asm )
( cd ${WORKDIR}/ref-${PARAM}/
@@ -218,5 +218,5 # Manual namespacing
# Manual namespacing
for PARAM in hrss701 hps2048509 hps2048677 hps4096821; do
for IMPL in clean avx2; do
( cd ${DIRNAME}/ntru${PARAM}/${IMPL}
- NTRU_NAMESPACE=$(echo PQCLEAN_NTRU${PARAM}_${IMPL}_ | tr [:lower:] [:upper])
+ NTRU_NAMESPACE=$(echo "PQCLEAN_NTRU${PARAM}_${IMPL}_" | tr [:lower:] [:upper:])
for X in $(grep CRYPTO_NAMESPACE *.{c,h} | cut -f2 -d' ' | sort -u); do
Could you please apply this fix?
Fix below (tested):
diff --git a/package_pqclean.sh b/package_pqclean.sh
index 2aa1300..6d46a55 100755
--- a/package_pqclean.sh
+++ b/package_pqclean.sh
@@ -16,7 +16,7 @@ for PARAM in hrss701 hps2048509 hps2048677 hps4096821; do
mkdir -p ${DIRNAME}/ntru${PARAM}/avx2
mkdir -p ${DIRNAME}/ntru${PARAM}/clean
- export NTRU_NAMESPACE=PQCLEAN_NTRU${PARAM^^}_AVX2_
+ export NTRU_NAMESPACE=PQCLEAN_NTRU${PARAM}_AVX2_
( cd ${WORKDIR}/avx2-${PARAM} && make -B asm )
( cd ${WORKDIR}/ref-${PARAM}/
In commit 951a12a NTRU_SAMPLE_IID_BYTES
changes from NTRU-1
to PAD32(NTRU_N-1)
. This has the result that NTRU_SAMPLE_FG_BYTES
and NTRU_SAMPLE_RM_BYTES
become longer which in turn leads to randombytes
retrieving more random bytes. As a result the polynomials are different which means the generated KATs no longer correspond to the KATs in the NIST submission.
Reverting this change makes it produce correct KATs again although the vectorized sample_iid
is likely to be incorrect then (I haven't tested this).
In all the Makefiles, there's a missing dependency test: all
that would force building the executables the test
target would run. Here's a fix for one, but I think all the makefiles need such treatment:
diff --git a/avx2-hrss701/Makefile b/avx2-hrss701/Makefile
index 70edbe8..9aa831c 100644
--- a/avx2-hrss701/Makefile
+++ b/avx2-hrss701/Makefile
@@ -113,7 +113,7 @@ PQCgenKAT_kem: $(SRC_KAT) $(HDR_KAT) $(OBJS)
# Useful for the .s files;
.DELETE_ON_ERROR:
-test:
+test: all
./test/test_polymul
./test/test_ntru
./test/test_pack
Compiling liboqs with gcc-11 complains about mismatched array sizes in the declaration of poly_S3_tobytes
and poly_S3_frombytes
in poly.h versus the instantiation in pack3.c:
The declaration in poly.h uses:
void poly_S3_tobytes(unsigned char msg[NTRU_PACK_TRINARY_BYTES], const poly *a);
void poly_S3_frombytes(poly *r, const unsigned char msg[NTRU_PACK_TRINARY_BYTES]);
but the instantiation in pack3.c uses:
void poly_S3_tobytes(unsigned char msg[NTRU_OWCPA_MSGBYTES], const poly *a) {...}
void poly_S3_frombytes(poly *r, const unsigned char msg[NTRU_OWCPA_MSGBYTES]) {...}
I think the solution is just to change pack3.c to use NTRU_PACK_TRINARY_BYTES
. At least that seems to fix the compilation error.
Hi!
How to use PKE ? I need an example.
Really Thanks for the lib and care.
[]'s Dani.
$ make test -C avx2-hrss701
clang -O3 -fomit-frame-pointer -march=native -fPIC -fPIE -pie -Wall -Wextra -Wpedantic -DCRYPTO_NAMESPACE\(s\)=ntru##s -o test/test_polymul fips202.c kem.c owcpa.c pack3.c packq.c poly.c poly_r2_inv.c sample.c sample_iid.c cmov.c randombytes.c square_1_701_patience.s square_3_701_patience.s square_6_701_patience.s square_12_701_shufbytes.s square_15_701_shufbytes.s square_27_701_shufbytes.s square_42_701_shufbytes.s square_84_701_shufbytes.s square_168_701_shufbytes.s square_336_701_shufbytes.s poly_rq_mul.s poly_r2_mul.s poly_rq_to_s3.s vec32_sample_iid.s poly_mod_3_Phi_n.s poly_mod_q_Phi_n.s poly_s3_to_rq.s poly_s3_inv.s poly_rq_mul_x_minus_1.s test/test_polymul.c cpucycles.c
clang: warning: argument unused during compilation: '-pie' [-Wunused-command-line-argument]
poly_s3_to_rq.s:3116:1: error: unsupported symbol modifier in branch relocation
call ntrupoly_Rq_mul_x_minus_1@plt
^
cpucycles.c:6:3: warning: extension used [-Wlanguage-extension-token]
asm volatile(".byte 15;.byte 49;shlq $32,%%rdx;orq %%rdx,%%rax"
^
1 warning generated.
cc -O3 -fomit-frame-pointer -march=native -fPIC -fPIE -pie -Wall -Wextra -Wpedantic -DCRYPTO_NAMESPACE\(s\)=ntru_##s -o test/decap cmov.c crypto_sort_int32.c fips202.c kem.c owcpa.c pack3.c packq.c poly.c poly_lift.c poly_mod.c poly_r2_inv.c poly_rq_mul.c poly_s3_inv.c sample.c sample_iid.c randombytes.c test/decap.c cmov.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/cmov.c | ^ crypto_sort_int32.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/crypto_sort_int32.c | ^ fips202.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/fips202.c | ^ kem.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/kem.c | ^ owcpa.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/owcpa.c | ^ pack3.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/pack3.c | ^ packq.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/pack2048.c | ^ poly.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/poly.c | ^ poly_lift.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/poly_lift.c | ^ poly_mod.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/poly_mod.c | ^ poly_r2_inv.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/poly_r2_inv.c | ^ poly_rq_mul.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/poly_rq_mul_toom4_k2x2.c | ^ poly_s3_inv.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/poly_s3_inv.c | ^ sample.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/sample.c | ^ sample_iid.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/sample_iid.c | ^ randombytes.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../ref-common/randombytes.c | ^ test/decap.c:1:1: error: expected identifier or ‘(’ before ‘.’ token 1 | ../../test/decap.c | ^ make: *** [Makefile:67: test/decap] Error 1
I get this error each time I run "make" command
any help please
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.