Skip to content

Commit de0232a

Browse files
committed
Present HACL* as a static or shared library.
On WASI, extension modules based on HACL* require the HACL* library to be linked statically. On other platforms, it can be built dynamically.
1 parent d6ff1d0 commit de0232a

File tree

5 files changed

+416
-212
lines changed

5 files changed

+416
-212
lines changed

Makefile.pre.in

Lines changed: 79 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,9 @@ LIBEXPAT_A= Modules/expat/libexpat.a
230230

231231
# HACL* build configuration
232232
LIBHACL_CFLAGS=@LIBHACL_CFLAGS@
233-
LIBHACL_SIMD128_FLAGS=@LIBHACL_SIMD128_FLAGS@
234-
LIBHACL_SIMD256_FLAGS=@LIBHACL_SIMD256_FLAGS@
235-
LIBHACL_SIMD128_OBJS=@LIBHACL_SIMD128_OBJS@
236-
LIBHACL_SIMD256_OBJS=@LIBHACL_SIMD256_OBJS@
233+
LIBHACL_LDFLAGS=@LIBHACL_LDFLAGS@
234+
LIBHACL_BLAKE2_SIMD128_CFLAGS=@LIBHACL_SIMD128_FLAGS@ -DHACL_CAN_COMPILE_VEC128
235+
LIBHACL_BLAKE2_SIMD256_CFLAGS=@LIBHACL_SIMD256_FLAGS@ -DHACL_CAN_COMPILE_VEC256
237236

238237
# Module state, compiler flags and linker flags
239238
# Empty CFLAGS and LDFLAGS are omitted.
@@ -656,25 +655,40 @@ LIBEXPAT_HEADERS= \
656655

657656
##########################################################################
658657
# hashlib's HACL* library
658+
#
659+
# On WASI, static build is required.
660+
# On other platforms, a shared library is used.
659661

660662
LIBHACL_MD5_OBJS= \
661663
Modules/_hacl/Hacl_Hash_MD5.o
664+
LIBHACL_MD5_LIB_STATIC=Modules/_hacl/libHacl_Hash_MD5.a
665+
LIBHACL_MD5_LIB_SHARED=Modules/_hacl/libHacl_Hash_MD5$(SHLIB_SUFFIX)
662666

663667
LIBHACL_SHA1_OBJS= \
664668
Modules/_hacl/Hacl_Hash_SHA1.o
669+
LIBHACL_SHA1_LIB_STATIC=Modules/_hacl/libHacl_Hash_SHA1.a
670+
LIBHACL_SHA1_LIB_SHARED=Modules/_hacl/libHacl_Hash_SHA1$(SHLIB_SUFFIX)
665671

666672
LIBHACL_SHA2_OBJS= \
667673
Modules/_hacl/Hacl_Hash_SHA2.o
674+
LIBHACL_SHA2_LIB_STATIC=Modules/_hacl/libHacl_Hash_SHA2.a
675+
LIBHACL_SHA2_LIB_SHARED=Modules/_hacl/libHacl_Hash_SHA2$(SHLIB_SUFFIX)
668676

669677
LIBHACL_SHA3_OBJS= \
670678
Modules/_hacl/Hacl_Hash_SHA3.o
679+
LIBHACL_SHA3_LIB_STATIC=Modules/_hacl/libHacl_Hash_SHA3.a
680+
LIBHACL_SHA3_LIB_SHARED=Modules/_hacl/libHacl_Hash_SHA3$(SHLIB_SUFFIX)
671681

682+
LIBHACL_BLAKE2_SIMD128_OBJS=@LIBHACL_BLAKE2_SIMD128_OBJS@
683+
LIBHACL_BLAKE2_SIMD256_OBJS=@LIBHACL_BLAKE2_SIMD256_OBJS@
672684
LIBHACL_BLAKE2_OBJS= \
673685
Modules/_hacl/Hacl_Hash_Blake2s.o \
674686
Modules/_hacl/Hacl_Hash_Blake2b.o \
675687
Modules/_hacl/Lib_Memzero0.o \
676-
$(LIBHACL_SIMD128_OBJS) \
677-
$(LIBHACL_SIMD256_OBJS)
688+
$(LIBHACL_BLAKE2_SIMD128_OBJS) \
689+
$(LIBHACL_BLAKE2_SIMD256_OBJS)
690+
LIBHACL_BLAKE2_LIB_STATIC=Modules/_hacl/libHacl_Hash_BLAKE2.a
691+
LIBHACL_BLAKE2_LIB_SHARED=Modules/_hacl/libHacl_Hash_BLAKE2$(SHLIB_SUFFIX)
678692

679693
LIBHACL_HMAC_OBJS= \
680694
Modules/_hacl/Hacl_HMAC.o \
@@ -684,6 +698,8 @@ LIBHACL_HMAC_OBJS= \
684698
$(LIBHACL_SHA2_OBJS) \
685699
$(LIBHACL_SHA3_OBJS) \
686700
$(LIBHACL_BLAKE2_OBJS)
701+
LIBHACL_HMAC_LIB_STATIC=Modules/_hacl/libHacl_HMAC.a
702+
LIBHACL_HMAC_LIB_SHARED=Modules/_hacl/libHacl_HMAC$(SHLIB_SUFFIX)
687703

688704
LIBHACL_HEADERS= \
689705
Modules/_hacl/include/krml/FStar_UInt128_Verified.h \
@@ -1456,57 +1472,91 @@ $(LIBEXPAT_A): $(LIBEXPAT_OBJS)
14561472
$(AR) $(ARFLAGS) $@ $(LIBEXPAT_OBJS)
14571473

14581474
##########################################################################
1459-
# Build HACL* static libraries for hashlib and HACL* HMAC.
1475+
# HACL* library build
14601476
#
14611477
# The HACL* modules are dynamically compiled and linked with the
14621478
# corresponding CPython built-in modules on demand, depending on
14631479
# whether the module is built or not.
14641480
#
14651481
# In particular, the HACL* objects are also dependencies of the
1466-
# corresponding C extension modules and are indicated by defining
1467-
# the MODULE_<NAME>_LIBDEPS variable.
1482+
# corresponding C extension modules but makesetup must NOT create
1483+
# a rule for them.
1484+
#
1485+
# For WASI, static linking is needed and HACL* is statically linked instead.
14681486

14691487
Modules/_hacl/Lib_Memzero0.o: $(srcdir)/Modules/_hacl/Lib_Memzero0.c $(LIBHACL_HEADERS)
14701488
$(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Lib_Memzero0.c
14711489

1472-
MODULE__MD5_LIBDEPS=$(LIBHACL_MD5_OBJS)
14731490
Modules/_hacl/Hacl_Hash_MD5.o: $(srcdir)/Modules/_hacl/Hacl_Hash_MD5.c $(LIBHACL_MD5_HEADERS)
14741491
$(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_MD5.c
1492+
$(LIBHACL_MD5_LIB_STATIC): $(LIBHACL_MD5_OBJS)
1493+
-rm -f $@
1494+
$(AR) $(ARFLAGS) $@ $(LIBHACL_MD5_OBJS)
1495+
$(LIBHACL_MD5_LIB_SHARED): $(LIBHACL_MD5_OBJS)
1496+
-rm -f $@
1497+
$(LDSHARED) $(LIBHACL_LDFLAGS) $(LIBHACL_MD5_OBJS) -o $@
14751498

1476-
MODULE__SHA1_LIBDEPS=$(LIBHACL_SHA1_OBJS)
14771499
Modules/_hacl/Hacl_Hash_SHA1.o: $(srcdir)/Modules/_hacl/Hacl_Hash_SHA1.c $(LIBHACL_SHA1_HEADERS)
14781500
$(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_SHA1.c
1501+
$(LIBHACL_SHA1_LIB_STATIC): $(LIBHACL_SHA1_OBJS)
1502+
-rm -f $@
1503+
$(AR) $(ARFLAGS) $@ $(LIBHACL_SHA1_OBJS)
1504+
$(LIBHACL_SHA1_LIB_SHARED): $(LIBHACL_SHA1_OBJS)
1505+
-rm -f $@
1506+
$(LDSHARED) $(LIBHACL_LDFLAGS) $(LIBHACL_SHA1_OBJS) -o $@
14791507

1480-
MODULE__SHA2_LIBDEPS=$(LIBHACL_SHA2_OBJS)
14811508
Modules/_hacl/Hacl_Hash_SHA2.o: $(srcdir)/Modules/_hacl/Hacl_Hash_SHA2.c $(LIBHACL_SHA2_HEADERS)
14821509
$(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_SHA2.c
1510+
$(LIBHACL_SHA2_LIB_STATIC): $(LIBHACL_SHA2_OBJS)
1511+
-rm -f $@
1512+
$(AR) $(ARFLAGS) $@ $(LIBHACL_SHA2_OBJS)
1513+
$(LIBHACL_SHA2_LIB_SHARED): $(LIBHACL_SHA2_OBJS)
1514+
-rm -f $@
1515+
$(LDSHARED) $(LIBHACL_LDFLAGS) $(LIBHACL_SHA2_OBJS) -o $@
14831516

1484-
MODULE__SHA3_LIBDEPS=$(LIBHACL_SHA3_OBJS)
14851517
Modules/_hacl/Hacl_Hash_SHA3.o: $(srcdir)/Modules/_hacl/Hacl_Hash_SHA3.c $(LIBHACL_SHA3_HEADERS)
14861518
$(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_SHA3.c
1519+
$(LIBHACL_SHA3_LIB_STATIC): $(LIBHACL_SHA3_OBJS)
1520+
-rm -f $@
1521+
$(AR) $(ARFLAGS) $@ $(LIBHACL_SHA3_OBJS)
1522+
$(LIBHACL_SHA3_LIB_SHARED): $(LIBHACL_SHA3_OBJS)
1523+
-rm -f $@
1524+
$(LDSHARED) $(LIBHACL_LDFLAGS) $(LIBHACL_SHA3_OBJS) -o $@
14871525

1488-
MODULE__BLAKE2_LIBDEPS=$(LIBHACL_BLAKE2_OBJS)
14891526
Modules/_hacl/Hacl_Hash_Blake2s.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s.c $(LIBHACL_BLAKE2_HEADERS)
14901527
$(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s.c
14911528
Modules/_hacl/Hacl_Hash_Blake2b.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b.c $(LIBHACL_BLAKE2_HEADERS)
14921529
$(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b.c
14931530
Modules/_hacl/Hacl_Hash_Blake2s_Simd128.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c $(LIBHACL_BLAKE2_HEADERS)
1494-
$(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_SIMD128_FLAGS) -DHACL_CAN_COMPILE_VEC128 -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c
1531+
$(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_BLAKE2_SIMD128_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c
14951532
Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.c $(LIBHACL_BLAKE2_HEADERS)
1496-
$(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_SIMD128_FLAGS) -DHACL_CAN_COMPILE_VEC128 -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.c
1533+
$(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_BLAKE2_SIMD128_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.c
14971534
Modules/_hacl/Hacl_Hash_Blake2b_Simd256.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c $(LIBHACL_BLAKE2_HEADERS)
1498-
$(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_SIMD256_FLAGS) -DHACL_CAN_COMPILE_VEC256 -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c
1535+
$(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_BLAKE2_SIMD256_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c
14991536
Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.c $(LIBHACL_BLAKE2_HEADERS)
1500-
$(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_SIMD256_FLAGS) -DHACL_CAN_COMPILE_VEC256 -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.c
1537+
$(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_BLAKE2_SIMD256_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.c
15011538

1502-
# Other cryptographic primitives
1539+
$(LIBHACL_BLAKE2_LIB_STATIC): $(LIBHACL_BLAKE2_OBJS)
1540+
-rm -f $@
1541+
$(AR) $(ARFLAGS) $@ $(LIBHACL_BLAKE2_OBJS)
1542+
$(LIBHACL_BLAKE2_LIB_SHARED): $(LIBHACL_BLAKE2_OBJS)
1543+
-rm -f $@
1544+
$(LDSHARED) $(LIBHACL_LDFLAGS) $(LIBHACL_BLAKE2_OBJS) -o $@
1545+
1546+
# Other HACL* cryptographic primitives
15031547

1504-
MODULE__HMAC_LIBDEPS=$(LIBHACL_HMAC_OBJS)
15051548
Modules/_hacl/Hacl_HMAC.o: $(srcdir)/Modules/_hacl/Hacl_HMAC.c $(LIBHACL_HMAC_HEADERS)
15061549
$(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_HMAC.c
15071550
Modules/_hacl/Hacl_Streaming_HMAC.o: $(srcdir)/Modules/_hacl/Hacl_Streaming_HMAC.c $(LIBHACL_HMAC_HEADERS)
15081551
$(CC) -Wno-unused-variable -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Streaming_HMAC.c
1552+
$(LIBHACL_HMAC_LIB_STATIC): $(LIBHACL_HMAC_OBJS)
1553+
-rm -f $@
1554+
$(AR) $(ARFLAGS) $@ $(LIBHACL_HMAC_OBJS)
1555+
$(LIBHACL_HMAC_LIB_SHARED): $(LIBHACL_HMAC_OBJS)
1556+
-rm -f $@
1557+
$(LDSHARED) $(LIBHACL_LDFLAGS) $(LIBHACL_HMAC_OBJS) -o $@
15091558

1559+
##########################################################################
15101560
# create relative links from build/lib.platform/egg.so to Modules/egg.so
15111561
# pybuilddir.txt is created too late. We cannot use it in Makefile
15121562
# targets. ln --relative is not portable.
@@ -3280,12 +3330,21 @@ MODULE__DECIMAL_DEPS=$(srcdir)/Modules/_decimal/docstrings.h @LIBMPDEC_INTERNAL@
32803330
MODULE__ELEMENTTREE_DEPS=$(srcdir)/Modules/pyexpat.c @LIBEXPAT_INTERNAL@
32813331
MODULE__HASHLIB_DEPS=$(srcdir)/Modules/hashlib.h
32823332
MODULE__IO_DEPS=$(srcdir)/Modules/_io/_iomodule.h
3333+
3334+
# HACL*-based cryptographic primitives
32833335
MODULE__MD5_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_MD5_HEADERS)
3336+
MODULE__MD5_LDEPS=$(LIBHACL_MD5_LIB_@LIBHACL_LDEPS_LIBTYPE@)
32843337
MODULE__SHA1_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_SHA1_HEADERS)
3338+
MODULE__SHA1_LDEPS=$(LIBHACL_SHA1_LIB_@LIBHACL_LDEPS_LIBTYPE@)
32853339
MODULE__SHA2_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_SHA2_HEADERS)
3340+
MODULE__SHA2_LDEPS=$(LIBHACL_SHA2_LIB_@LIBHACL_LDEPS_LIBTYPE@)
32863341
MODULE__SHA3_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_SHA3_HEADERS)
3342+
MODULE__SHA3_LDEPS=$(LIBHACL_SHA3_LIB_@LIBHACL_LDEPS_LIBTYPE@)
32873343
MODULE__BLAKE2_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_BLAKE2_HEADERS)
3344+
MODULE__BLAKE2_LDEPS=$(LIBHACL_BLAKE2_LIB_@LIBHACL_LDEPS_LIBTYPE@)
32883345
MODULE__HMAC_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_HMAC_HEADERS)
3346+
MODULE__HMAC_LDEPS=$(LIBHACL_HMAC_LIB_@LIBHACL_LDEPS_LIBTYPE@)
3347+
32893348
MODULE__SOCKET_DEPS=$(srcdir)/Modules/socketmodule.h $(srcdir)/Modules/addrinfo.h $(srcdir)/Modules/getaddrinfo.c $(srcdir)/Modules/getnameinfo.c
32903349
MODULE__SSL_DEPS=$(srcdir)/Modules/_ssl.h $(srcdir)/Modules/_ssl/cert.c $(srcdir)/Modules/_ssl/debughelpers.c $(srcdir)/Modules/_ssl/misc.c $(srcdir)/Modules/_ssl_data_111.h $(srcdir)/Modules/_ssl_data_300.h $(srcdir)/Modules/socketmodule.h
32913350
MODULE__TESTCAPI_DEPS=$(srcdir)/Modules/_testcapi/parts.h $(srcdir)/Modules/_testcapi/util.h

Modules/Setup.stdlib.in

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
# generated by PY_STDLIB_MOD macro.
1717
# * All source files automatically depend on $(PYTHON_HEADERS) and
1818
# $(MODULE_{NAME}_DEPS).
19+
# * ${NAME}$(EXT_SUFFIX) rules automatically depend on $(MODULE_{NAME}_LDEPS),
20+
# thus $(MODULE_{NAME}_LDEPS) must only contain Makefile rule names. To pass
21+
# specific values to the linker, use $(MODULE_{NAME}_LDFLAGS) instead.
1922
#
2023
# See Modules/Setup and Modules/makesetup
2124
#
@@ -78,17 +81,22 @@
7881

7982
############################################################################
8083
# HACL*-based Cryptographic Primitives
84+
#
85+
# Since the compilation of the built-in cryptographic modules depends
86+
# on whether we are building on WASI or not, rules will be explicitly
87+
# written. In the future, it should be preferrable to be able to setup
88+
# the relevant bits here instead of in Makefile.pre.in or configure.ac.
8189

8290
# Hash functions can be disabled with --without-builtin-hashlib-hashes.
83-
@MODULE__MD5_TRUE@_md5 md5module.c -I$(srcdir)/Modules/_hacl/include $(MODULE__MD5_LIBDEPS)
84-
@MODULE__SHA1_TRUE@_sha1 sha1module.c -I$(srcdir)/Modules/_hacl/include $(MODULE__SHA1_LIBDEPS)
85-
@MODULE__SHA2_TRUE@_sha2 sha2module.c -I$(srcdir)/Modules/_hacl/include $(MODULE__SHA2_LIBDEPS)
86-
@MODULE__SHA3_TRUE@_sha3 sha3module.c -I$(srcdir)/Modules/_hacl/include $(MODULE__SHA3_LIBDEPS)
87-
@MODULE__BLAKE2_TRUE@_blake2 blake2module.c -I$(srcdir)/Modules/_hacl/include $(MODULE__BLAKE2_LIBDEPS)
91+
@MODULE__MD5_TRUE@_md5 md5module.c
92+
@MODULE__SHA1_TRUE@_sha1 sha1module.c
93+
@MODULE__SHA2_TRUE@_sha2 sha2module.c
94+
@MODULE__SHA3_TRUE@_sha3 sha3module.c
95+
@MODULE__BLAKE2_TRUE@_blake2 blake2module.c
8896

8997
# Since HMAC is always supported, the HACL* implementation modules must
9098
# be built unconditionally.
91-
@MODULE__HMAC_TRUE@_hmac hmacmodule.c -I$(srcdir)/Modules/_hacl/include $(MODULE__HMAC_LIBDEPS)
99+
@MODULE__HMAC_TRUE@_hmac hmacmodule.c
92100

93101
############################################################################
94102
# XML and text

Modules/makesetup

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,6 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
178178
\$\(*_CFLAGS\)) cpps="$cpps $arg";;
179179
\$\(*_INCLUDES\)) cpps="$cpps $arg";;
180180
\$\(*_LIBS\)) libs="$libs $arg";;
181-
\$\(*_LIBDEPS\)) libs="$libs $arg";;
182181
\$\(*_LDFLAGS\)) libs="$libs $arg";;
183182
\$\(*_RPATH\)) libs="$libs $arg";;
184183
\$*) libs="$libs $arg"
@@ -276,7 +275,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
276275
BUILT_SHARED="$BUILT_SHARED $mod"
277276
;;
278277
esac
279-
rule="$file: $objs \$(MODULE_${mods_upper}_LIBDEPS)"
278+
rule="$file: $objs \$(MODULE_${mods_upper}_LDEPS)"
280279
rule="$rule; \$(BLDSHARED) $objs $libs \$(LIBPYTHON) -o $file"
281280
echo "$rule" >>$rulesf
282281
done

0 commit comments

Comments
 (0)