New Makefile structure; added compatibility with Windows + Visual C + nmake.

This commit is contained in:
Thomas Pornin 2017-01-22 20:00:29 +01:00
parent 2f454aad57
commit 3f00688b9d
29 changed files with 2240 additions and 1069 deletions

748
Makefile
View file

@ -1,4 +1,4 @@
# Copyright (c) 2016 Thomas Pornin <pornin@bolet.org> # Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
# #
# Permission is hereby granted, free of charge, to any person obtaining # Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the # a copy of this software and associated documentation files (the
@ -20,732 +20,22 @@
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE. # SOFTWARE.
# ======================================================================
# The lines below are a horrible hack that nonetheless works. On a
# "make" utility compatible with Single Unix v4 (this includes GNU and
# BSD make), the '\' at the end of a command line counts as an escape
# for the newline character, so the next line is still a comment.
# However, Microsoft's nmake.exe (that comes with Visual Studio) does
# not interpret the final '\' that way in a comment. The end result is
# that when using nmake.exe, this will include "mk/Win.mk", whereas
# GNU/BSD make will include "mk/Unix.mk".
# \
!ifndef 0 # \
!include mk/NMake.mk # \
!else
.POSIX: .POSIX:
include mk/SingleUnix.mk
# ======================================================================== # \
# Configurable elements: C compiler and flags, linker flags, static !endif
# library archival command.
CC = gcc
CFLAGS = -W -Wall -Os -fPIC -I src -I inc
#CFLAGS = -W -Wall -g -fPIC -I src -I inc
LDFLAGS =
AR = ar -rcs
# Nothing is meant to be changed below this line.
# ========================================================================
HEADERS = inc/bearssl.h inc/bearssl_block.h inc/bearssl_ec.h inc/bearssl_hash.h inc/bearssl_hmac.h inc/bearssl_pem.h inc/bearssl_prf.h inc/bearssl_rand.h inc/bearssl_rsa.h inc/bearssl_ssl.h inc/bearssl_x509.h src/inner.h src/config.h
BUILD = build
BEARSSLLIB = libbearssl.a
BRSSL = brssl
TESTCRYPTO = testcrypto
TESTSPEED = testspeed
TESTX509 = testx509
TESTMATH = testmath
OBJCODEC = $(BUILD)/ccopy.o $(BUILD)/dec16be.o $(BUILD)/dec16le.o $(BUILD)/dec32be.o $(BUILD)/dec32le.o $(BUILD)/dec64be.o $(BUILD)/dec64le.o $(BUILD)/enc16be.o $(BUILD)/enc16le.o $(BUILD)/enc32be.o $(BUILD)/enc32le.o $(BUILD)/enc64be.o $(BUILD)/enc64le.o $(BUILD)/pemdec.o
OBJEC = $(BUILD)/ec_all_m15.o $(BUILD)/ec_all_m31.o $(BUILD)/ec_c25519_i15.o $(BUILD)/ec_c25519_i31.o $(BUILD)/ec_c25519_m15.o $(BUILD)/ec_c25519_m31.o $(BUILD)/ec_curve25519.o $(BUILD)/ec_p256_m15.o $(BUILD)/ec_p256_m31.o $(BUILD)/ec_prime_i15.o $(BUILD)/ec_prime_i31.o $(BUILD)/ec_secp256r1.o $(BUILD)/ec_secp384r1.o $(BUILD)/ec_secp521r1.o $(BUILD)/ecdsa_atr.o $(BUILD)/ecdsa_i15_bits.o $(BUILD)/ecdsa_i15_sign_asn1.o $(BUILD)/ecdsa_i15_sign_raw.o $(BUILD)/ecdsa_i15_vrfy_asn1.o $(BUILD)/ecdsa_i15_vrfy_raw.o $(BUILD)/ecdsa_i31_bits.o $(BUILD)/ecdsa_i31_sign_asn1.o $(BUILD)/ecdsa_i31_sign_raw.o $(BUILD)/ecdsa_i31_vrfy_asn1.o $(BUILD)/ecdsa_i31_vrfy_raw.o $(BUILD)/ecdsa_rta.o
# $(BUILD)/ec_prime_i31_secp256r1.o $(BUILD)/ec_prime_i31_secp384r1.o $(BUILD)/ec_prime_i31_secp521r1.o
OBJHASH = $(BUILD)/dig_oid.o $(BUILD)/dig_size.o $(BUILD)/ghash_ctmul.o $(BUILD)/ghash_ctmul32.o $(BUILD)/ghash_ctmul64.o $(BUILD)/md5.o $(BUILD)/md5sha1.o $(BUILD)/multihash.o $(BUILD)/sha1.o $(BUILD)/sha2big.o $(BUILD)/sha2small.o
OBJINT15 = $(BUILD)/i15_add.o $(BUILD)/i15_bitlen.o $(BUILD)/i15_decmod.o $(BUILD)/i15_decode.o $(BUILD)/i15_decred.o $(BUILD)/i15_encode.o $(BUILD)/i15_fmont.o $(BUILD)/i15_iszero.o $(BUILD)/i15_modpow.o $(BUILD)/i15_montmul.o $(BUILD)/i15_mulacc.o $(BUILD)/i15_muladd.o $(BUILD)/i15_ninv15.o $(BUILD)/i15_reduce.o $(BUILD)/i15_rshift.o $(BUILD)/i15_sub.o $(BUILD)/i15_tmont.o
OBJINT31 = $(BUILD)/i31_add.o $(BUILD)/i31_bitlen.o $(BUILD)/i31_decmod.o $(BUILD)/i31_decode.o $(BUILD)/i31_decred.o $(BUILD)/i31_encode.o $(BUILD)/i31_fmont.o $(BUILD)/i31_iszero.o $(BUILD)/i31_modpow.o $(BUILD)/i31_montmul.o $(BUILD)/i31_mulacc.o $(BUILD)/i31_muladd.o $(BUILD)/i31_ninv31.o $(BUILD)/i31_reduce.o $(BUILD)/i31_rshift.o $(BUILD)/i31_sub.o $(BUILD)/i31_tmont.o
OBJINT32 = $(BUILD)/i32_add.o $(BUILD)/i32_bitlen.o $(BUILD)/i32_decmod.o $(BUILD)/i32_decode.o $(BUILD)/i32_decred.o $(BUILD)/i32_div32.o $(BUILD)/i32_encode.o $(BUILD)/i32_fmont.o $(BUILD)/i32_iszero.o $(BUILD)/i32_modpow.o $(BUILD)/i32_montmul.o $(BUILD)/i32_mulacc.o $(BUILD)/i32_muladd.o $(BUILD)/i32_ninv32.o $(BUILD)/i32_reduce.o $(BUILD)/i32_sub.o $(BUILD)/i32_tmont.o
OBJMAC = $(BUILD)/hmac.o $(BUILD)/hmac_ct.o
OBJRAND = $(BUILD)/hmac_drbg.o
OBJRSA = $(BUILD)/rsa_i15_pkcs1_sign.o $(BUILD)/rsa_i15_pkcs1_vrfy.o $(BUILD)/rsa_i15_priv.o $(BUILD)/rsa_i15_pub.o $(BUILD)/rsa_i31_pkcs1_sign.o $(BUILD)/rsa_i31_pkcs1_vrfy.o $(BUILD)/rsa_i31_priv.o $(BUILD)/rsa_i31_pub.o $(BUILD)/rsa_i32_pkcs1_sign.o $(BUILD)/rsa_i32_pkcs1_vrfy.o $(BUILD)/rsa_i32_priv.o $(BUILD)/rsa_i32_pub.o $(BUILD)/rsa_pkcs1_sig_pad.o $(BUILD)/rsa_pkcs1_sig_unpad.o $(BUILD)/rsa_ssl_decrypt.o
OBJSSL = $(BUILD)/prf.o $(BUILD)/prf_md5sha1.o $(BUILD)/prf_sha256.o $(BUILD)/prf_sha384.o $(BUILD)/ssl_ccert_single_ec.o $(BUILD)/ssl_ccert_single_rsa.o $(BUILD)/ssl_client.o $(BUILD)/ssl_client_full.o $(BUILD)/ssl_engine.o $(BUILD)/ssl_hashes.o $(BUILD)/ssl_hs_client.o $(BUILD)/ssl_hs_server.o $(BUILD)/ssl_io.o $(BUILD)/ssl_lru.o $(BUILD)/ssl_rec_cbc.o $(BUILD)/ssl_rec_chapol.o $(BUILD)/ssl_rec_gcm.o $(BUILD)/ssl_server.o $(BUILD)/ssl_server_mine2c.o $(BUILD)/ssl_server_mine2g.o $(BUILD)/ssl_server_minf2c.o $(BUILD)/ssl_server_minf2g.o $(BUILD)/ssl_server_minr2g.o $(BUILD)/ssl_server_minu2g.o $(BUILD)/ssl_server_minv2g.o $(BUILD)/ssl_server_full_ec.o $(BUILD)/ssl_server_full_rsa.o $(BUILD)/ssl_scert_single_ec.o $(BUILD)/ssl_scert_single_rsa.o
OBJSYMCIPHER = $(BUILD)/aes_big_cbcdec.o $(BUILD)/aes_big_cbcenc.o $(BUILD)/aes_big_ctr.o $(BUILD)/aes_big_dec.o $(BUILD)/aes_big_enc.o $(BUILD)/aes_common.o $(BUILD)/aes_ct.o $(BUILD)/aes_ct64.o $(BUILD)/aes_ct64_cbcdec.o $(BUILD)/aes_ct64_cbcenc.o $(BUILD)/aes_ct64_ctr.o $(BUILD)/aes_ct64_dec.o $(BUILD)/aes_ct64_enc.o $(BUILD)/aes_ct_cbcdec.o $(BUILD)/aes_ct_cbcenc.o $(BUILD)/aes_ct_ctr.o $(BUILD)/aes_ct_dec.o $(BUILD)/aes_ct_enc.o $(BUILD)/aes_small_cbcdec.o $(BUILD)/aes_small_cbcenc.o $(BUILD)/aes_small_ctr.o $(BUILD)/aes_small_dec.o $(BUILD)/aes_small_enc.o $(BUILD)/chacha20_ct.o $(BUILD)/des_ct.o $(BUILD)/des_ct_cbcdec.o $(BUILD)/des_ct_cbcenc.o $(BUILD)/des_support.o $(BUILD)/des_tab.o $(BUILD)/des_tab_cbcdec.o $(BUILD)/des_tab_cbcenc.o $(BUILD)/poly1305_ctmul.o $(BUILD)/poly1305_ctmul32.o $(BUILD)/poly1305_i15.o
OBJX509 = $(BUILD)/skey_decoder.o $(BUILD)/x509_decoder.o $(BUILD)/x509_knownkey.o $(BUILD)/x509_minimal.o $(BUILD)/x509_minimal_full.o
OBJ = $(OBJCODEC) $(OBJEC) $(OBJHASH) $(OBJINT15) $(OBJINT31) $(OBJINT32) $(OBJMAC) $(OBJRAND) $(OBJRSA) $(OBJSSL) $(OBJSYMCIPHER) $(OBJX509)
OBJBRSSL = $(BUILD)/brssl.o $(BUILD)/certs.o $(BUILD)/chain.o $(BUILD)/client.o $(BUILD)/errors.o $(BUILD)/files.o $(BUILD)/keys.o $(BUILD)/names.o $(BUILD)/server.o $(BUILD)/skey.o $(BUILD)/sslio.o $(BUILD)/ta.o $(BUILD)/vector.o $(BUILD)/verify.o $(BUILD)/xmem.o
OBJTESTCRYPTO = $(BUILD)/test_crypto.o
OBJTESTSPEED = $(BUILD)/test_speed.o
OBJTESTX509 = $(BUILD)/test_x509.o
OBJTESTMATH = $(BUILD)/test_math.o
T0COMP = T0Comp.exe
T0SRC = T0/BlobWriter.cs T0/CPU.cs T0/CodeElement.cs T0/CodeElementJump.cs T0/CodeElementUInt.cs T0/CodeElementUIntExpr.cs T0/CodeElementUIntInt.cs T0/CodeElementUIntUInt.cs T0/ConstData.cs T0/Opcode.cs T0/OpcodeCall.cs T0/OpcodeConst.cs T0/OpcodeGetLocal.cs T0/OpcodeJump.cs T0/OpcodeJumpIf.cs T0/OpcodeJumpIfNot.cs T0/OpcodeJumpUncond.cs T0/OpcodePutLocal.cs T0/OpcodeRet.cs T0/SType.cs T0/T0Comp.cs T0/TPointerBase.cs T0/TPointerBlob.cs T0/TPointerExpr.cs T0/TPointerNull.cs T0/TPointerXT.cs T0/TValue.cs T0/Word.cs T0/WordBuilder.cs T0/WordData.cs T0/WordInterpreted.cs T0/WordNative.cs
T0KERN = T0/kern.t0
all: compile
compile: $(BEARSSLLIB) $(BRSSL) $(TESTCRYPTO) $(TESTSPEED) $(TESTX509)
$(BEARSSLLIB): $(BUILD) $(OBJ)
$(AR) $(BEARSSLLIB) $(OBJ)
$(BRSSL): $(BEARSSLLIB) $(OBJBRSSL)
$(CC) $(LDFLAGS) -o $(BRSSL) $(OBJBRSSL) $(BEARSSLLIB)
$(TESTCRYPTO): $(BEARSSLLIB) $(OBJTESTCRYPTO)
$(CC) $(LDFLAGS) -o $(TESTCRYPTO) $(OBJTESTCRYPTO) $(BEARSSLLIB)
$(TESTSPEED): $(BEARSSLLIB) $(OBJTESTSPEED)
$(CC) $(LDFLAGS) -o $(TESTSPEED) $(OBJTESTSPEED) $(BEARSSLLIB)
$(TESTX509): $(BEARSSLLIB) $(OBJTESTX509)
$(CC) $(LDFLAGS) -o $(TESTX509) $(OBJTESTX509) $(BEARSSLLIB)
$(TESTMATH): $(BEARSSLLIB) $(OBJTESTMATH)
$(CC) $(LDFLAGS) -o $(TESTMATH) $(OBJTESTMATH) $(BEARSSLLIB) -lgmp
$(BUILD):
-mkdir -p $(BUILD)
T0: $(T0COMP) T0Gen
T0Gen:
mono T0Comp.exe -o src/codec/pemdec -r br_pem_decoder src/codec/pemdec.t0
mono T0Comp.exe -o src/ssl/ssl_hs_client -r br_ssl_hs_client src/ssl/ssl_hs_common.t0 src/ssl/ssl_hs_client.t0
mono T0Comp.exe -o src/ssl/ssl_hs_server -r br_ssl_hs_server src/ssl/ssl_hs_common.t0 src/ssl/ssl_hs_server.t0
mono T0Comp.exe -o src/x509/skey_decoder -r br_skey_decoder src/x509/asn1.t0 src/x509/skey_decoder.t0
mono T0Comp.exe -o src/x509/x509_decoder -r br_x509_decoder src/x509/asn1.t0 src/x509/x509_decoder.t0
mono T0Comp.exe -o src/x509/x509_minimal -r br_x509_minimal src/x509/asn1.t0 src/x509/x509_minimal.t0
$(T0COMP): $(T0SRC) $(T0KERN)
./mkT0.sh
clean:
-rm -f $(OBJ) $(BEARSSLLIB) $(OBJSSL) $(BRSSL) $(OBJBRSSL) $(TESTCRYPTO) $(OBJTESTCRYPTO) $(TESTSPEED) $(OBJTESTSPEED) $(TESTX509) $(OBJTESTX509) $(TESTMATH) $(OBJTESTMATH)
$(BUILD)/ccopy.o: src/codec/ccopy.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ccopy.o src/codec/ccopy.c
$(BUILD)/dec16be.o: src/codec/dec16be.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/dec16be.o src/codec/dec16be.c
$(BUILD)/dec16le.o: src/codec/dec16le.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/dec16le.o src/codec/dec16le.c
$(BUILD)/dec32be.o: src/codec/dec32be.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/dec32be.o src/codec/dec32be.c
$(BUILD)/dec32le.o: src/codec/dec32le.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/dec32le.o src/codec/dec32le.c
$(BUILD)/dec64be.o: src/codec/dec64be.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/dec64be.o src/codec/dec64be.c
$(BUILD)/dec64le.o: src/codec/dec64le.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/dec64le.o src/codec/dec64le.c
$(BUILD)/enc16be.o: src/codec/enc16be.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/enc16be.o src/codec/enc16be.c
$(BUILD)/enc16le.o: src/codec/enc16le.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/enc16le.o src/codec/enc16le.c
$(BUILD)/enc32be.o: src/codec/enc32be.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/enc32be.o src/codec/enc32be.c
$(BUILD)/enc32le.o: src/codec/enc32le.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/enc32le.o src/codec/enc32le.c
$(BUILD)/enc64be.o: src/codec/enc64be.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/enc64be.o src/codec/enc64be.c
$(BUILD)/enc64le.o: src/codec/enc64le.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/enc64le.o src/codec/enc64le.c
$(BUILD)/pemdec.o: src/codec/pemdec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/pemdec.o src/codec/pemdec.c
$(BUILD)/ec_g_secp256r1.o: src/ec/ec_g_secp256r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_g_secp256r1.o src/ec/ec_g_secp256r1.c
$(BUILD)/ec_g_secp384r1.o: src/ec/ec_g_secp384r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_g_secp384r1.o src/ec/ec_g_secp384r1.c
$(BUILD)/ec_g_secp521r1.o: src/ec/ec_g_secp521r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_g_secp521r1.o src/ec/ec_g_secp521r1.c
$(BUILD)/ec_all_m15.o: src/ec/ec_all_m15.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_all_m15.o src/ec/ec_all_m15.c
$(BUILD)/ec_all_m31.o: src/ec/ec_all_m31.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_all_m31.o src/ec/ec_all_m31.c
$(BUILD)/ec_c25519_i15.o: src/ec/ec_c25519_i15.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_c25519_i15.o src/ec/ec_c25519_i15.c
$(BUILD)/ec_c25519_i31.o: src/ec/ec_c25519_i31.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_c25519_i31.o src/ec/ec_c25519_i31.c
$(BUILD)/ec_c25519_m15.o: src/ec/ec_c25519_m15.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_c25519_m15.o src/ec/ec_c25519_m15.c
$(BUILD)/ec_c25519_m31.o: src/ec/ec_c25519_m31.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_c25519_m31.o src/ec/ec_c25519_m31.c
$(BUILD)/ec_curve25519.o: src/ec/ec_curve25519.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_curve25519.o src/ec/ec_curve25519.c
$(BUILD)/ec_p256_m15.o: src/ec/ec_p256_m15.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_p256_m15.o src/ec/ec_p256_m15.c
$(BUILD)/ec_p256_m31.o: src/ec/ec_p256_m31.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_p256_m31.o src/ec/ec_p256_m31.c
$(BUILD)/ec_prime_i15.o: src/ec/ec_prime_i15.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_prime_i15.o src/ec/ec_prime_i15.c
$(BUILD)/ec_prime_i31.o: src/ec/ec_prime_i31.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_prime_i31.o src/ec/ec_prime_i31.c
$(BUILD)/ec_prime_i31_secp256r1.o: src/ec/ec_prime_i31_secp256r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_prime_i31_secp256r1.o src/ec/ec_prime_i31_secp256r1.c
$(BUILD)/ec_prime_i31_secp384r1.o: src/ec/ec_prime_i31_secp384r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_prime_i31_secp384r1.o src/ec/ec_prime_i31_secp384r1.c
$(BUILD)/ec_prime_i31_secp521r1.o: src/ec/ec_prime_i31_secp521r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_prime_i31_secp521r1.o src/ec/ec_prime_i31_secp521r1.c
$(BUILD)/ec_secp256r1.o: src/ec/ec_secp256r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_secp256r1.o src/ec/ec_secp256r1.c
$(BUILD)/ec_secp384r1.o: src/ec/ec_secp384r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_secp384r1.o src/ec/ec_secp384r1.c
$(BUILD)/ec_secp521r1.o: src/ec/ec_secp521r1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ec_secp521r1.o src/ec/ec_secp521r1.c
$(BUILD)/ecdsa_atr.o: src/ec/ecdsa_atr.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_atr.o src/ec/ecdsa_atr.c
$(BUILD)/ecdsa_i15_bits.o: src/ec/ecdsa_i15_bits.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i15_bits.o src/ec/ecdsa_i15_bits.c
$(BUILD)/ecdsa_i15_sign_asn1.o: src/ec/ecdsa_i15_sign_asn1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i15_sign_asn1.o src/ec/ecdsa_i15_sign_asn1.c
$(BUILD)/ecdsa_i15_sign_raw.o: src/ec/ecdsa_i15_sign_raw.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i15_sign_raw.o src/ec/ecdsa_i15_sign_raw.c
$(BUILD)/ecdsa_i15_vrfy_asn1.o: src/ec/ecdsa_i15_vrfy_asn1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i15_vrfy_asn1.o src/ec/ecdsa_i15_vrfy_asn1.c
$(BUILD)/ecdsa_i15_vrfy_raw.o: src/ec/ecdsa_i15_vrfy_raw.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i15_vrfy_raw.o src/ec/ecdsa_i15_vrfy_raw.c
$(BUILD)/ecdsa_i31_bits.o: src/ec/ecdsa_i31_bits.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i31_bits.o src/ec/ecdsa_i31_bits.c
$(BUILD)/ecdsa_i31_sign_asn1.o: src/ec/ecdsa_i31_sign_asn1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i31_sign_asn1.o src/ec/ecdsa_i31_sign_asn1.c
$(BUILD)/ecdsa_i31_sign_raw.o: src/ec/ecdsa_i31_sign_raw.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i31_sign_raw.o src/ec/ecdsa_i31_sign_raw.c
$(BUILD)/ecdsa_i31_vrfy_asn1.o: src/ec/ecdsa_i31_vrfy_asn1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i31_vrfy_asn1.o src/ec/ecdsa_i31_vrfy_asn1.c
$(BUILD)/ecdsa_i31_vrfy_raw.o: src/ec/ecdsa_i31_vrfy_raw.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_i31_vrfy_raw.o src/ec/ecdsa_i31_vrfy_raw.c
$(BUILD)/ecdsa_rta.o: src/ec/ecdsa_rta.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ecdsa_rta.o src/ec/ecdsa_rta.c
$(BUILD)/dig_oid.o: src/hash/dig_oid.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/dig_oid.o src/hash/dig_oid.c
$(BUILD)/dig_size.o: src/hash/dig_size.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/dig_size.o src/hash/dig_size.c
$(BUILD)/ghash_ctmul.o: src/hash/ghash_ctmul.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ghash_ctmul.o src/hash/ghash_ctmul.c
$(BUILD)/ghash_ctmul32.o: src/hash/ghash_ctmul32.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ghash_ctmul32.o src/hash/ghash_ctmul32.c
$(BUILD)/ghash_ctmul64.o: src/hash/ghash_ctmul64.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ghash_ctmul64.o src/hash/ghash_ctmul64.c
$(BUILD)/md5.o: src/hash/md5.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/md5.o src/hash/md5.c
$(BUILD)/md5sha1.o: src/hash/md5sha1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/md5sha1.o src/hash/md5sha1.c
$(BUILD)/multihash.o: src/hash/multihash.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/multihash.o src/hash/multihash.c
$(BUILD)/sha1.o: src/hash/sha1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/sha1.o src/hash/sha1.c
$(BUILD)/sha2big.o: src/hash/sha2big.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/sha2big.o src/hash/sha2big.c
$(BUILD)/sha2small.o: src/hash/sha2small.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/sha2small.o src/hash/sha2small.c
$(BUILD)/i15_add.o: src/int/i15_add.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_add.o src/int/i15_add.c
$(BUILD)/i15_bitlen.o: src/int/i15_bitlen.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_bitlen.o src/int/i15_bitlen.c
$(BUILD)/i15_decmod.o: src/int/i15_decmod.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_decmod.o src/int/i15_decmod.c
$(BUILD)/i15_decode.o: src/int/i15_decode.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_decode.o src/int/i15_decode.c
$(BUILD)/i15_decred.o: src/int/i15_decred.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_decred.o src/int/i15_decred.c
$(BUILD)/i15_encode.o: src/int/i15_encode.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_encode.o src/int/i15_encode.c
$(BUILD)/i15_fmont.o: src/int/i15_fmont.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_fmont.o src/int/i15_fmont.c
$(BUILD)/i15_iszero.o: src/int/i15_iszero.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_iszero.o src/int/i15_iszero.c
$(BUILD)/i15_modpow.o: src/int/i15_modpow.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_modpow.o src/int/i15_modpow.c
$(BUILD)/i15_montmul.o: src/int/i15_montmul.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_montmul.o src/int/i15_montmul.c
$(BUILD)/i15_mulacc.o: src/int/i15_mulacc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_mulacc.o src/int/i15_mulacc.c
$(BUILD)/i15_muladd.o: src/int/i15_muladd.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_muladd.o src/int/i15_muladd.c
$(BUILD)/i15_ninv15.o: src/int/i15_ninv15.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_ninv15.o src/int/i15_ninv15.c
$(BUILD)/i15_reduce.o: src/int/i15_reduce.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_reduce.o src/int/i15_reduce.c
$(BUILD)/i15_rshift.o: src/int/i15_rshift.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_rshift.o src/int/i15_rshift.c
$(BUILD)/i15_sub.o: src/int/i15_sub.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_sub.o src/int/i15_sub.c
$(BUILD)/i15_tmont.o: src/int/i15_tmont.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i15_tmont.o src/int/i15_tmont.c
$(BUILD)/i31_add.o: src/int/i31_add.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_add.o src/int/i31_add.c
$(BUILD)/i31_bitlen.o: src/int/i31_bitlen.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_bitlen.o src/int/i31_bitlen.c
$(BUILD)/i31_decmod.o: src/int/i31_decmod.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_decmod.o src/int/i31_decmod.c
$(BUILD)/i31_decode.o: src/int/i31_decode.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_decode.o src/int/i31_decode.c
$(BUILD)/i31_decred.o: src/int/i31_decred.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_decred.o src/int/i31_decred.c
$(BUILD)/i31_encode.o: src/int/i31_encode.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_encode.o src/int/i31_encode.c
$(BUILD)/i31_fmont.o: src/int/i31_fmont.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_fmont.o src/int/i31_fmont.c
$(BUILD)/i31_iszero.o: src/int/i31_iszero.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_iszero.o src/int/i31_iszero.c
$(BUILD)/i31_modpow.o: src/int/i31_modpow.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_modpow.o src/int/i31_modpow.c
$(BUILD)/i31_montmul.o: src/int/i31_montmul.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_montmul.o src/int/i31_montmul.c
$(BUILD)/i31_mulacc.o: src/int/i31_mulacc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_mulacc.o src/int/i31_mulacc.c
$(BUILD)/i31_muladd.o: src/int/i31_muladd.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_muladd.o src/int/i31_muladd.c
$(BUILD)/i31_ninv31.o: src/int/i31_ninv31.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_ninv31.o src/int/i31_ninv31.c
$(BUILD)/i31_reduce.o: src/int/i31_reduce.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_reduce.o src/int/i31_reduce.c
$(BUILD)/i31_rshift.o: src/int/i31_rshift.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_rshift.o src/int/i31_rshift.c
$(BUILD)/i31_sub.o: src/int/i31_sub.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_sub.o src/int/i31_sub.c
$(BUILD)/i31_tmont.o: src/int/i31_tmont.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i31_tmont.o src/int/i31_tmont.c
$(BUILD)/i32_add.o: src/int/i32_add.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_add.o src/int/i32_add.c
$(BUILD)/i32_bitlen.o: src/int/i32_bitlen.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_bitlen.o src/int/i32_bitlen.c
$(BUILD)/i32_decmod.o: src/int/i32_decmod.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_decmod.o src/int/i32_decmod.c
$(BUILD)/i32_decode.o: src/int/i32_decode.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_decode.o src/int/i32_decode.c
$(BUILD)/i32_decred.o: src/int/i32_decred.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_decred.o src/int/i32_decred.c
$(BUILD)/i32_div32.o: src/int/i32_div32.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_div32.o src/int/i32_div32.c
$(BUILD)/i32_encode.o: src/int/i32_encode.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_encode.o src/int/i32_encode.c
$(BUILD)/i32_fmont.o: src/int/i32_fmont.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_fmont.o src/int/i32_fmont.c
$(BUILD)/i32_iszero.o: src/int/i32_iszero.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_iszero.o src/int/i32_iszero.c
$(BUILD)/i32_modpow.o: src/int/i32_modpow.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_modpow.o src/int/i32_modpow.c
$(BUILD)/i32_montmul.o: src/int/i32_montmul.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_montmul.o src/int/i32_montmul.c
$(BUILD)/i32_mulacc.o: src/int/i32_mulacc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_mulacc.o src/int/i32_mulacc.c
$(BUILD)/i32_muladd.o: src/int/i32_muladd.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_muladd.o src/int/i32_muladd.c
$(BUILD)/i32_ninv32.o: src/int/i32_ninv32.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_ninv32.o src/int/i32_ninv32.c
$(BUILD)/i32_reduce.o: src/int/i32_reduce.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_reduce.o src/int/i32_reduce.c
$(BUILD)/i32_sub.o: src/int/i32_sub.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_sub.o src/int/i32_sub.c
$(BUILD)/i32_tmont.o: src/int/i32_tmont.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/i32_tmont.o src/int/i32_tmont.c
$(BUILD)/hmac.o: src/mac/hmac.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/hmac.o src/mac/hmac.c
$(BUILD)/hmac_ct.o: src/mac/hmac_ct.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/hmac_ct.o src/mac/hmac_ct.c
$(BUILD)/hmac_drbg.o: src/rand/hmac_drbg.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/hmac_drbg.o src/rand/hmac_drbg.c
$(BUILD)/rsa_i15_pkcs1_sign.o: src/rsa/rsa_i15_pkcs1_sign.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i15_pkcs1_sign.o src/rsa/rsa_i15_pkcs1_sign.c
$(BUILD)/rsa_i15_pkcs1_vrfy.o: src/rsa/rsa_i15_pkcs1_vrfy.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i15_pkcs1_vrfy.o src/rsa/rsa_i15_pkcs1_vrfy.c
$(BUILD)/rsa_i15_priv.o: src/rsa/rsa_i15_priv.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i15_priv.o src/rsa/rsa_i15_priv.c
$(BUILD)/rsa_i15_pub.o: src/rsa/rsa_i15_pub.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i15_pub.o src/rsa/rsa_i15_pub.c
$(BUILD)/rsa_i31_pkcs1_sign.o: src/rsa/rsa_i31_pkcs1_sign.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i31_pkcs1_sign.o src/rsa/rsa_i31_pkcs1_sign.c
$(BUILD)/rsa_i31_pkcs1_vrfy.o: src/rsa/rsa_i31_pkcs1_vrfy.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i31_pkcs1_vrfy.o src/rsa/rsa_i31_pkcs1_vrfy.c
$(BUILD)/rsa_i31_priv.o: src/rsa/rsa_i31_priv.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i31_priv.o src/rsa/rsa_i31_priv.c
$(BUILD)/rsa_i31_pub.o: src/rsa/rsa_i31_pub.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i31_pub.o src/rsa/rsa_i31_pub.c
$(BUILD)/rsa_i32_pkcs1_sign.o: src/rsa/rsa_i32_pkcs1_sign.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i32_pkcs1_sign.o src/rsa/rsa_i32_pkcs1_sign.c
$(BUILD)/rsa_i32_pkcs1_vrfy.o: src/rsa/rsa_i32_pkcs1_vrfy.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i32_pkcs1_vrfy.o src/rsa/rsa_i32_pkcs1_vrfy.c
$(BUILD)/rsa_i32_priv.o: src/rsa/rsa_i32_priv.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i32_priv.o src/rsa/rsa_i32_priv.c
$(BUILD)/rsa_i32_pub.o: src/rsa/rsa_i32_pub.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_i32_pub.o src/rsa/rsa_i32_pub.c
$(BUILD)/rsa_pkcs1_sig_pad.o: src/rsa/rsa_pkcs1_sig_pad.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_pkcs1_sig_pad.o src/rsa/rsa_pkcs1_sig_pad.c
$(BUILD)/rsa_pkcs1_sig_unpad.o: src/rsa/rsa_pkcs1_sig_unpad.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_pkcs1_sig_unpad.o src/rsa/rsa_pkcs1_sig_unpad.c
$(BUILD)/rsa_ssl_decrypt.o: src/rsa/rsa_ssl_decrypt.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/rsa_ssl_decrypt.o src/rsa/rsa_ssl_decrypt.c
$(BUILD)/prf.o: src/ssl/prf.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/prf.o src/ssl/prf.c
$(BUILD)/prf_md5sha1.o: src/ssl/prf_md5sha1.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/prf_md5sha1.o src/ssl/prf_md5sha1.c
$(BUILD)/prf_sha256.o: src/ssl/prf_sha256.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/prf_sha256.o src/ssl/prf_sha256.c
$(BUILD)/prf_sha384.o: src/ssl/prf_sha384.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/prf_sha384.o src/ssl/prf_sha384.c
$(BUILD)/ssl_ccert_single_ec.o: src/ssl/ssl_ccert_single_ec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_ccert_single_ec.o src/ssl/ssl_ccert_single_ec.c
$(BUILD)/ssl_ccert_single_rsa.o: src/ssl/ssl_ccert_single_rsa.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_ccert_single_rsa.o src/ssl/ssl_ccert_single_rsa.c
$(BUILD)/ssl_client.o: src/ssl/ssl_client.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_client.o src/ssl/ssl_client.c
$(BUILD)/ssl_client_full.o: src/ssl/ssl_client_full.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_client_full.o src/ssl/ssl_client_full.c
$(BUILD)/ssl_engine.o: src/ssl/ssl_engine.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_engine.o src/ssl/ssl_engine.c
$(BUILD)/ssl_hashes.o: src/ssl/ssl_hashes.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_hashes.o src/ssl/ssl_hashes.c
$(BUILD)/ssl_hs_client.o: src/ssl/ssl_hs_client.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_hs_client.o src/ssl/ssl_hs_client.c
$(BUILD)/ssl_hs_server.o: src/ssl/ssl_hs_server.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_hs_server.o src/ssl/ssl_hs_server.c
$(BUILD)/ssl_io.o: src/ssl/ssl_io.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_io.o src/ssl/ssl_io.c
$(BUILD)/ssl_lru.o: src/ssl/ssl_lru.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_lru.o src/ssl/ssl_lru.c
$(BUILD)/ssl_rec_cbc.o: src/ssl/ssl_rec_cbc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_rec_cbc.o src/ssl/ssl_rec_cbc.c
$(BUILD)/ssl_rec_chapol.o: src/ssl/ssl_rec_chapol.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_rec_chapol.o src/ssl/ssl_rec_chapol.c
$(BUILD)/ssl_rec_gcm.o: src/ssl/ssl_rec_gcm.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_rec_gcm.o src/ssl/ssl_rec_gcm.c
$(BUILD)/ssl_server.o: src/ssl/ssl_server.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server.o src/ssl/ssl_server.c
$(BUILD)/ssl_server_mine2c.o: src/ssl/ssl_server_mine2c.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_mine2c.o src/ssl/ssl_server_mine2c.c
$(BUILD)/ssl_server_mine2g.o: src/ssl/ssl_server_mine2g.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_mine2g.o src/ssl/ssl_server_mine2g.c
$(BUILD)/ssl_server_minf2c.o: src/ssl/ssl_server_minf2c.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_minf2c.o src/ssl/ssl_server_minf2c.c
$(BUILD)/ssl_server_minf2g.o: src/ssl/ssl_server_minf2g.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_minf2g.o src/ssl/ssl_server_minf2g.c
$(BUILD)/ssl_server_minr2g.o: src/ssl/ssl_server_minr2g.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_minr2g.o src/ssl/ssl_server_minr2g.c
$(BUILD)/ssl_server_minu2g.o: src/ssl/ssl_server_minu2g.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_minu2g.o src/ssl/ssl_server_minu2g.c
$(BUILD)/ssl_server_minv2g.o: src/ssl/ssl_server_minv2g.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_minv2g.o src/ssl/ssl_server_minv2g.c
$(BUILD)/ssl_server_full_ec.o: src/ssl/ssl_server_full_ec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_full_ec.o src/ssl/ssl_server_full_ec.c
$(BUILD)/ssl_server_full_rsa.o: src/ssl/ssl_server_full_rsa.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_server_full_rsa.o src/ssl/ssl_server_full_rsa.c
$(BUILD)/ssl_scert_single_ec.o: src/ssl/ssl_scert_single_ec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_scert_single_ec.o src/ssl/ssl_scert_single_ec.c
$(BUILD)/ssl_scert_single_rsa.o: src/ssl/ssl_scert_single_rsa.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ssl_scert_single_rsa.o src/ssl/ssl_scert_single_rsa.c
$(BUILD)/aes_big_cbcdec.o: src/symcipher/aes_big_cbcdec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_big_cbcdec.o src/symcipher/aes_big_cbcdec.c
$(BUILD)/aes_big_cbcenc.o: src/symcipher/aes_big_cbcenc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_big_cbcenc.o src/symcipher/aes_big_cbcenc.c
$(BUILD)/aes_big_ctr.o: src/symcipher/aes_big_ctr.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_big_ctr.o src/symcipher/aes_big_ctr.c
$(BUILD)/aes_big_dec.o: src/symcipher/aes_big_dec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_big_dec.o src/symcipher/aes_big_dec.c
$(BUILD)/aes_big_enc.o: src/symcipher/aes_big_enc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_big_enc.o src/symcipher/aes_big_enc.c
$(BUILD)/aes_common.o: src/symcipher/aes_common.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_common.o src/symcipher/aes_common.c
$(BUILD)/aes_ct.o: src/symcipher/aes_ct.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct.o src/symcipher/aes_ct.c
$(BUILD)/aes_ct64.o: src/symcipher/aes_ct64.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct64.o src/symcipher/aes_ct64.c
$(BUILD)/aes_ct64_cbcdec.o: src/symcipher/aes_ct64_cbcdec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct64_cbcdec.o src/symcipher/aes_ct64_cbcdec.c
$(BUILD)/aes_ct64_cbcenc.o: src/symcipher/aes_ct64_cbcenc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct64_cbcenc.o src/symcipher/aes_ct64_cbcenc.c
$(BUILD)/aes_ct64_ctr.o: src/symcipher/aes_ct64_ctr.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct64_ctr.o src/symcipher/aes_ct64_ctr.c
$(BUILD)/aes_ct64_dec.o: src/symcipher/aes_ct64_dec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct64_dec.o src/symcipher/aes_ct64_dec.c
$(BUILD)/aes_ct64_enc.o: src/symcipher/aes_ct64_enc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct64_enc.o src/symcipher/aes_ct64_enc.c
$(BUILD)/aes_ct_cbcdec.o: src/symcipher/aes_ct_cbcdec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct_cbcdec.o src/symcipher/aes_ct_cbcdec.c
$(BUILD)/aes_ct_cbcenc.o: src/symcipher/aes_ct_cbcenc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct_cbcenc.o src/symcipher/aes_ct_cbcenc.c
$(BUILD)/aes_ct_ctr.o: src/symcipher/aes_ct_ctr.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct_ctr.o src/symcipher/aes_ct_ctr.c
$(BUILD)/aes_ct_dec.o: src/symcipher/aes_ct_dec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct_dec.o src/symcipher/aes_ct_dec.c
$(BUILD)/aes_ct_enc.o: src/symcipher/aes_ct_enc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_ct_enc.o src/symcipher/aes_ct_enc.c
$(BUILD)/aes_small_cbcdec.o: src/symcipher/aes_small_cbcdec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_small_cbcdec.o src/symcipher/aes_small_cbcdec.c
$(BUILD)/aes_small_cbcenc.o: src/symcipher/aes_small_cbcenc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_small_cbcenc.o src/symcipher/aes_small_cbcenc.c
$(BUILD)/aes_small_ctr.o: src/symcipher/aes_small_ctr.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_small_ctr.o src/symcipher/aes_small_ctr.c
$(BUILD)/aes_small_dec.o: src/symcipher/aes_small_dec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_small_dec.o src/symcipher/aes_small_dec.c
$(BUILD)/aes_small_enc.o: src/symcipher/aes_small_enc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/aes_small_enc.o src/symcipher/aes_small_enc.c
$(BUILD)/chacha20_ct.o: src/symcipher/chacha20_ct.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/chacha20_ct.o src/symcipher/chacha20_ct.c
$(BUILD)/des_ct.o: src/symcipher/des_ct.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/des_ct.o src/symcipher/des_ct.c
$(BUILD)/des_ct_cbcdec.o: src/symcipher/des_ct_cbcdec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/des_ct_cbcdec.o src/symcipher/des_ct_cbcdec.c
$(BUILD)/des_ct_cbcenc.o: src/symcipher/des_ct_cbcenc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/des_ct_cbcenc.o src/symcipher/des_ct_cbcenc.c
$(BUILD)/des_support.o: src/symcipher/des_support.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/des_support.o src/symcipher/des_support.c
$(BUILD)/des_tab.o: src/symcipher/des_tab.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/des_tab.o src/symcipher/des_tab.c
$(BUILD)/des_tab_cbcdec.o: src/symcipher/des_tab_cbcdec.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/des_tab_cbcdec.o src/symcipher/des_tab_cbcdec.c
$(BUILD)/des_tab_cbcenc.o: src/symcipher/des_tab_cbcenc.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/des_tab_cbcenc.o src/symcipher/des_tab_cbcenc.c
$(BUILD)/poly1305_ctmul.o: src/symcipher/poly1305_ctmul.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/poly1305_ctmul.o src/symcipher/poly1305_ctmul.c
$(BUILD)/poly1305_ctmul32.o: src/symcipher/poly1305_ctmul32.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/poly1305_ctmul32.o src/symcipher/poly1305_ctmul32.c
$(BUILD)/poly1305_i15.o: src/symcipher/poly1305_i15.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/poly1305_i15.o src/symcipher/poly1305_i15.c
$(BUILD)/skey_decoder.o: src/x509/skey_decoder.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/skey_decoder.o src/x509/skey_decoder.c
$(BUILD)/x509_decoder.o: src/x509/x509_decoder.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/x509_decoder.o src/x509/x509_decoder.c
$(BUILD)/x509_knownkey.o: src/x509/x509_knownkey.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/x509_knownkey.o src/x509/x509_knownkey.c
$(BUILD)/x509_minimal.o: src/x509/x509_minimal.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/x509_minimal.o src/x509/x509_minimal.c
$(BUILD)/x509_minimal_full.o: src/x509/x509_minimal_full.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/x509_minimal_full.o src/x509/x509_minimal_full.c
$(BUILD)/test_crypto.o: test/test_crypto.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/test_crypto.o test/test_crypto.c
$(BUILD)/test_math.o: test/test_math.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/test_math.o test/test_math.c
$(BUILD)/test_speed.o: test/test_speed.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/test_speed.o test/test_speed.c
$(BUILD)/test_x509.o: test/test_x509.c $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/test_x509.o test/test_x509.c
$(BUILD)/brssl.o: tools/brssl.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/brssl.o tools/brssl.c
$(BUILD)/certs.o: tools/certs.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/certs.o tools/certs.c
$(BUILD)/chain.o: tools/chain.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/chain.o tools/chain.c
$(BUILD)/client.o: tools/client.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/client.o tools/client.c
$(BUILD)/errors.o: tools/errors.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/errors.o tools/errors.c
$(BUILD)/files.o: tools/files.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/files.o tools/files.c
$(BUILD)/keys.o: tools/keys.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/keys.o tools/keys.c
$(BUILD)/names.o: tools/names.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/names.o tools/names.c
$(BUILD)/server.o: tools/server.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/server.o tools/server.c
$(BUILD)/skey.o: tools/skey.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/skey.o tools/skey.c
$(BUILD)/sslio.o: tools/sslio.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/sslio.o tools/sslio.c
$(BUILD)/ta.o: tools/ta.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/ta.o tools/ta.c
$(BUILD)/vector.o: tools/vector.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/vector.o tools/vector.c
$(BUILD)/verify.o: tools/verify.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/verify.o tools/verify.c
$(BUILD)/xmem.o: tools/xmem.c tools/brssl.h $(HEADERS)
$(CC) $(CFLAGS) -c -o $(BUILD)/xmem.o tools/xmem.c

View file

@ -1,3 +1,8 @@
# Documentation
The most up-to-date documentation is supposed to be available on the
[BearSSL Web site](https://www.bearssl.org/).
# Disclaimer # Disclaimer
BearSSL is for now considered alpha-level software. This means that it BearSSL is for now considered alpha-level software. This means that it
@ -27,61 +32,81 @@ The usage license is explicited in the `LICENSE.txt` file. This is the
# Installation # Installation
As of version 0.1, BearSSL is a simple static library. Most of the Right now, BearSSL is a simple library, along with a few test and debug
process is rather manual and old-style, and there is no installer (this command-line tools. There is no installer yet. The library _can_ be
will be added in a later version, in particular when all the man pages compiled as a shared library on some systems, but since the binary API
for BearSSL functions are written). is not fully stabilised, this is not a very good idea to do that right
now.
1. Have a look at the top of the `Makefile`. There you can configure the To compile the code, just type `make`. This will try to use sane
command names and flags for invoking the C compiler, linker, and "default" values. On a Windows system with Visual Studio, run a console
static library archiver. with the environment initialised for a specific version of the C compiler,
and type `nmake`.
2. There are a few configurable switches in `src/config.h`. These switches To override the default settings, create a custom configuration file in
relate to compile-time options, e.g. support of a system-provided the `conf` directory, and invoke `make` (or `nmake`) with an explicit
random source. On usual platforms (e.g. Linux or OS X), auto-detection `CONF=` parameter. For instance, to use the provided `samd20.mk`
should work, but you can always override things with `config.h`. configuration file (that targets cross-compilation for an Atmel board
that features a Cortex-M0+ CPU), type:
3. Type `make`. This should produce the static library (`libbearssl.a`), make CONF=samd20
the test executables (`testcrypto`, `testspeed` and `testx509`), and
the command-line debug tool (`brssl`). You might want to run the tests:
- `testcrypto all` runs the cryptographic tests (test vectors on all The `conf/samd20.mk` file includes the `Unix.mk` file and then overrides
implemented cryptogaphic functions). It can be slow. some of the parameters, including the destination directory. Any custom
configuration can be made the same way.
- `testspeed all` runs a number of performance benchmarks, there again Some compile-time options can be set through macros, either on the
on cryptographic functions. It gives a taste of how things go on the compiler command-line, or in the `src/config.h` file. See the comments
current platform. in that file. Some settings are autodetected but they can still be
explicitly overridden.
- `testx509` runs X.509 validation tests. The test certificates are When compilation is done, the library (static and DLL, when appropriate)
all in `test/x509/`. and the command-line tools can be found in the designated build
directory (by default named `build`). The public headers (to be used
by applications linked against BearSSL) are in the `inc/` directory.
4. The `brssl` command-line tool is a stand-alone binary. It can exercise To run the tests:
some of the functionalities of BearSSL, in particular running a test
SSL client or server. It is not meant for production purposes (e.g.
the SSL client has a mode where it disregards the inability to validate
the server's certificate, which is inherently unsafe, but convenient
for debug).
5. Using the library means writing some application code that invokes it, - `testcrypto all` runs the cryptographic tests (test vectors on all
and linking with the static library. The header files are all in the implemented cryptogaphic functions). It can be slow. You can also
`inc` directory; copy them wherever makes sense (e.g. in the run a selection of the tests by providing their names (run
`/usr/local/include` directory). The library itself (`libbearssl.a`) `testcrypto` without any parameter to see the available names).
is what you link against.
Alternatively, you may want to copy the source files directly into - `testspeed all` runs a number of performance benchmarks, there again
your own application code. This will make integrating ulterior versions on cryptographic functions. It gives a taste of how things go on the
of BearSSL more difficult. If you still want to go down that road, current platform. As for `testcrypto`, specific named benchmarks can
then simply copy all the `*.h` and `*.c` files from the `src` and `inc` be executed.
directories into your application source code. In the BearSSL source
archive, the source files are segregated into various sub-directories,
but this is for my convenience only. There is no technical requirement
for that, and all files can be dumped together in a simple directory.
Dependencies are simple and systematic: - `testx509` runs X.509 validation tests. The test certificates are
all in `test/x509/`.
- Each `*.c` file includes `inner.h` The `brssl` command-line tool produced in the build directory is a
- `inner.h` includes `config.h` and `bearssl.h` stand-alone binary. It can exercise some of the functionalities of
- `bearssl.h` includes the other `bearssl_*.h` BearSSL, in particular running a test SSL client or server. It is not
meant for production purposes (e.g. the SSL client has a mode where it
disregards the inability to validate the server's certificate, which is
inherently unsafe, but convenient for debug).
**Using the library** means writing some application code that invokes
it, and linking with the static library. The header files are all in the
`inc` directory; copy them wherever makes sense (e.g. in the
`/usr/local/include` directory). The library itself (`libbearssl.a`) is
what you link against.
Alternatively, you may want to copy the source files directly into your
own application code. This will make integrating ulterior versions of
BearSSL more difficult. If you still want to go down that road, then
simply copy all the `*.h` and `*.c` files from the `src` and `inc`
directories into your application source code. In the BearSSL source
archive, the source files are segregated into various sub-directories,
but this is for my convenience only. There is no technical requirement
for that, and all files can be dumped together in a simple directory.
Dependencies are simple and systematic:
- Each `*.c` file includes `inner.h`
- `inner.h` includes `config.h` and `bearssl.h`
- `bearssl.h` includes the other `bearssl_*.h`
# Versioning # Versioning
@ -108,62 +133,3 @@ I follow this simple version numbering scheme:
it can be expected that `1.3` will contain some extra functions when it can be expected that `1.3` will contain some extra functions when
compared to `1.2`. The next version level (the `z` part) is for compared to `1.2`. The next version level (the `z` part) is for
bugfixes that do not add any functionality. bugfixes that do not add any functionality.
# API Usage
Right now there is little documentation. The following principles are
maintained:
- All public symbols (global functions and data elements, macros) have
a name that starts with `br_` or `BR_`.
- The header files (the `bearssl_*.h` in the `inc` directory) contain
for now the most complete documentation (as comments).
- Context structures are allocated by the caller. BearSSL does not
contain any single `malloc()` call; this means that there is no
"freeing up" call to be done. When you don't need some BearSSL
functionality, just cease to call it, and that's it.
- BearSSL contains no modifiable static data. It is thus thread-safe
and reentrant, _for distinct contexts_. Accessing the same context
structure from distinct threads, though, is a recipe for disaster.
- The main SSL I/O API is organised as a state machine. A running
SSL engine (client or server) has four I/O ports:
- It can receive bytes from the transport medium ("record data").
- It can send bytes to the transport medium.
- It can receive application data, to be sent to the peer through
the SSL tunnel.
- It can produce application data, built from the records sent by
the peer.
BearSSL never performs I/O by itself; it expects the caller to
provide or retrieve the data. Each port consists in a pair of
functions: one yields the pointer to the buffer from which data
can be read or to which data can be written, and the maximum
size for such an operation; the other function is used to
inform the engine about how many bytes were actually read or
written.
For instance, if the `br_ssl_engine_sendrec_buf()` function returns a
non-NULL pointer, then this means that there are bytes to be sent to
the transport medium. When the caller has indeed sent some or all of
these bytes, it informs the engine with
`br_ssl_engine_sendrec_ack()`.
This state-machine API means that the engine never blocks. Each
invocation may trigger computations, but will always return as
promptly as the CPU power allows. All the I/O waiting is supposed to
be done on the outside. This structure allows managing several
concurrent SSL engines, along with other I/O tasks, with a single
mono-threaded loop using `select()` or `poll()`. It also makes it
easier to integrate BearSSL with various transport mechanisms (e.g.
messages in the EAP-TLS authentication framework).
- Nevertheless, there are situations where simple blocking calls _can_
be used, and are convenient. For these situations, use the
`br_sslio_context` wrapper. Then do blocking reads and writes with
`br_sslio_read()` and similar functions. The sample client code
in `samples/client_basic.c` shows how such things are done.

View file

@ -251,6 +251,12 @@ public class T0Comp {
*/ */
List<string> extraCode; List<string> extraCode;
/*
* 'extraCodeDefer' is for C code that is to be added in the C
* output _after_ the data and code blocks.
*/
List<string> extraCodeDefer;
/* /*
* 'dataBlock' is the data block in which constant data bytes * 'dataBlock' is the data block in which constant data bytes
* are accumulated. * are accumulated.
@ -287,6 +293,7 @@ public class T0Comp {
StringComparer.Ordinal); StringComparer.Ordinal);
compiling = false; compiling = false;
extraCode = new List<string>(); extraCode = new List<string>();
extraCodeDefer = new List<string>();
enableFlowAnalysis = true; enableFlowAnalysis = true;
/* /*
@ -348,6 +355,15 @@ public class T0Comp {
extraCode.Add(ParseCCode()); extraCode.Add(ParseCCode());
}); });
/*
* postamble
* Parses a C code snippet, then adds it to the generated
* output after the data and code blocks.
*/
AddNative("postamble", false, SType.BLANK, cpu => {
extraCodeDefer.Add(ParseCCode());
});
/* /*
* make-CX * make-CX
* Expects two integers and a string, and makes a * Expects two integers and a string, and makes a
@ -1729,7 +1745,7 @@ t0_parse7E_signed(const unsigned char **p)
#define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
#define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
static const uint8_t t0_datablock[]; /* static const unsigned char t0_datablock[]; */
"); ");
/* /*
@ -1757,7 +1773,8 @@ static const uint8_t t0_datablock[];
BlobWriter bw; BlobWriter bw;
tw.WriteLine(); tw.WriteLine();
tw.Write("static const uint8_t t0_datablock[] = {"); tw.Write("static const unsigned char"
+ " t0_datablock[] = {");
bw = new BlobWriter(tw, 78, 1); bw = new BlobWriter(tw, 78, 1);
bw.Append((byte)0); bw.Append((byte)0);
foreach (ConstData cd in blocks.Values) { foreach (ConstData cd in blocks.Values) {
@ -1767,7 +1784,8 @@ static const uint8_t t0_datablock[];
tw.WriteLine("};"); tw.WriteLine("};");
tw.WriteLine(); tw.WriteLine();
tw.Write("static const uint8_t t0_codeblock[] = {"); tw.Write("static const unsigned char"
+ " t0_codeblock[] = {");
bw = new BlobWriter(tw, 78, 1); bw = new BlobWriter(tw, 78, 1);
foreach (CodeElement ce in gcode) { foreach (CodeElement ce in gcode) {
ce.Encode(bw, oneByteCode); ce.Encode(bw, oneByteCode);
@ -1952,6 +1970,17 @@ t0_exit:
((t0_context *)t0ctx)->rp = rp; ((t0_context *)t0ctx)->rp = rp;
((t0_context *)t0ctx)->ip = ip; ((t0_context *)t0ctx)->ip = ip;
}"); }");
/*
* Add the "postamblr" elements here. These are
* elements that may need access to the data
* block or code block, so they must occur after
* their definition.
*/
foreach (string pp in extraCodeDefer) {
tw.WriteLine();
tw.WriteLine("{0}", pp);
}
} }
int codeLen = 0; int codeLen = 0;

Binary file not shown.

69
conf/Unix.mk Normal file
View file

@ -0,0 +1,69 @@
# Configuration for a native build on a generic Unix-like system.
# Build directory.
BUILD = build
# Extension for executable files.
E =
# Extension for object files.
O = .o
# Prefix for library file name.
LP = lib
# Extension for library file name.
L = .a
# Prefix for DLL file name.
DP = lib
# Extension for DLL file name.
D = .so
# Output file names can be overridden directly. By default, they are
# assembled using the prefix/extension macros defined above.
# BEARSSLLIB = libbearssl.a
# BEARSSLDLL = libbearssl.so
# BRSSL = brssl
# TESTCRYPTO = testcrypto
# TESTSPEED = testspeed
# TESTX509 = testx509
# File deletion tool.
RM = rm -f
# Directory creation tool.
MKDIR = mkdir -p
# C compiler and flags.
CC = gcc
CFLAGS = -W -Wall -Os -fPIC
CCOUT = -c -o
# Static library building tool.
AR = ar
ARFLAGS = -rcs
AROUT =
# DLL building tool.
LDDLL = gcc
LDDLLFLAGS = -shared
LDDLLOUT = -o
# Static linker.
LD = gcc
LDFLAGS =
LDOUT = -o
# C# compiler; we assume usage of Mono.
MKT0COMP = mk$PmkT0.sh
RUNT0COMP = mono T0Comp.exe
# Set the values to 'no' to disable building of the corresponding element
# by default. Building can still be invoked with an explicit target call
# (e.g. 'make dll' to force build the DLL).
#STATICLIB = no
#DLL = no
#TOOLS = no
#TESTS = no

70
conf/Win.mk Normal file
View file

@ -0,0 +1,70 @@
# Configuration for a native build on a Windows system with Visual Studio.
# Build directory.
BUILD = build
# Extension for executable files.
E = .exe
# Extension for object files.
O = .obj
# Prefix for static library file name.
LP =
# Extension for static library file name. We add an 's' so that the
# name is distinct from the 'import library' generated along with the DLL.
L = s.lib
# Prefix for DLL file name.
DP =
# Extension for DLL file name.
D = .dll
# Output file names can be overridden directly. By default, they are
# assembled using the prefix/extension macros defined above.
# BEARSSLLIB = bearssls.lib
# BEARSSLDLL = bearssl.dll
# BRSSL = brssl.exe
# TESTCRYPTO = testcrypto.exe
# TESTSPEED = testspeed.exe
# TESTX509 = testx509.exe
# File deletion tool.
RM = del /Q
# Directory creation tool.
MKDIR = mkdir
# C compiler and flags.
CC = cl
CFLAGS = -nologo -W2 -O2
CCOUT = -c -Fo
# Static library building tool.
AR = lib
ARFLAGS = -nologo
AROUT = -out:
# DLL building tool.
LDDLL = cl
LDDLLFLAGS = -nologo -LD -MT
LDDLLOUT = -Fe
# Static linker.
LD = cl
LDFLAGS = -nologo
LDOUT = -Fe
# C# compiler.
MKT0COMP = mk$PmkT0.cmd
RUNT0COMP = T0Comp.exe
# Set the values to 'no' to disable building of the corresponding element
# by default. Building can still be invoked with an explicit target call
# (e.g. 'make dll' to force build the DLL).
#STATICLIB = no
#DLL = no
#TOOLS = no
#TESTS = no

20
conf/samd20.mk Normal file
View file

@ -0,0 +1,20 @@
# Example configuration file for compiling for an Atmel SAM D20 Xplained
# Pro evaluation kit, on a Unix-like system, with a GNU toolchain.
# We are on a Unix system so we assume a Single Unix compatible 'make'
# utility, and Unix defaults.
include conf/Unix.mk
# We override the build directory.
BUILD = samd20
# C compiler, linker, and static library builder.
CC = arm-none-eabi-gcc
CFLAGS = -W -Wall -Os -mthumb -ffunction-sections -fdata-sections -mcpu=cortex-m0plus
LD = arm-none-eabi-gcc
AR = arm-none-eabi-ar
# We compile only the static library.
DLL = no
TOOLS = no
TESTS = no

View file

@ -1000,10 +1000,10 @@ uint32_t br_aes_ct64_ctr_run(const br_aes_ct64_ctr_keys *ctx,
*/ */
typedef union { typedef union {
const br_block_cbcenc_class *vtable; const br_block_cbcenc_class *vtable;
br_aes_big_cbcenc_keys big; br_aes_big_cbcenc_keys c_big;
br_aes_small_cbcenc_keys small; br_aes_small_cbcenc_keys c_small;
br_aes_ct_cbcenc_keys ct; br_aes_ct_cbcenc_keys c_ct;
br_aes_ct64_cbcenc_keys ct64; br_aes_ct64_cbcenc_keys c_ct64;
} br_aes_gen_cbcenc_keys; } br_aes_gen_cbcenc_keys;
/** /**
@ -1012,10 +1012,10 @@ typedef union {
*/ */
typedef union { typedef union {
const br_block_cbcdec_class *vtable; const br_block_cbcdec_class *vtable;
br_aes_big_cbcdec_keys big; br_aes_big_cbcdec_keys c_big;
br_aes_small_cbcdec_keys small; br_aes_small_cbcdec_keys c_small;
br_aes_ct_cbcdec_keys ct; br_aes_ct_cbcdec_keys c_ct;
br_aes_ct64_cbcdec_keys ct64; br_aes_ct64_cbcdec_keys c_ct64;
} br_aes_gen_cbcdec_keys; } br_aes_gen_cbcdec_keys;
/** /**
@ -1024,10 +1024,10 @@ typedef union {
*/ */
typedef union { typedef union {
const br_block_ctr_class *vtable; const br_block_ctr_class *vtable;
br_aes_big_ctr_keys big; br_aes_big_ctr_keys c_big;
br_aes_small_ctr_keys small; br_aes_small_ctr_keys c_small;
br_aes_ct_ctr_keys ct; br_aes_ct_ctr_keys c_ct;
br_aes_ct64_ctr_keys ct64; br_aes_ct64_ctr_keys c_ct64;
} br_aes_gen_ctr_keys; } br_aes_gen_ctr_keys;
/* /*
@ -1235,8 +1235,8 @@ typedef union {
*/ */
typedef union { typedef union {
const br_block_cbcdec_class *vtable; const br_block_cbcdec_class *vtable;
br_des_tab_cbcdec_keys tab; br_des_tab_cbcdec_keys c_tab;
br_des_ct_cbcdec_keys ct; br_des_ct_cbcdec_keys c_ct;
} br_des_gen_cbcdec_keys; } br_des_gen_cbcdec_keys;
/** /**

41
mk/Defaults.mk Normal file
View file

@ -0,0 +1,41 @@
# Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# ======================================================================
# This file sets variables with generic default values, which can be
# overridden in the selected configuration file.
BUILD = build
OBJDIR = $(BUILD)$Pobj
BEARSSLLIB = $(BUILD)$P$(LP)bearssl$L
BEARSSLDLL = $(BUILD)$P$(DP)bearssl$D
BRSSL = $(BUILD)$Pbrssl$E
TESTCRYPTO = $(BUILD)$Ptestcrypto$E
TESTSPEED = $(BUILD)$Ptestspeed$E
TESTX509 = $(BUILD)$Ptestx509$E
INCFLAGS = -Isrc -Iinc
T0COMP = T0Comp.exe
STATICLIB = lib
DLL = dll
TOOLS = tools
TESTS = tests

38
mk/NMake.mk Normal file
View file

@ -0,0 +1,38 @@
# Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# ======================================================================
# This file sets variables for use with NMake.exe, as distributed with
# Visual Studio.
# Load generic defaults.
!include mk/Defaults.mk
# Default configuration is 'Win' (native build with Visual Studio).
CONF = Win
# Path separator.
P = ^\
!include conf/$(CONF).mk
!include mk/Rules.mk

678
mk/Rules.mk Normal file
View file

@ -0,0 +1,678 @@
# Automatically generated rules. Use 'mkrules.sh' to modify/regenerate.
OBJ = $(OBJDIR)$Pccopy$O $(OBJDIR)$Pdec16be$O $(OBJDIR)$Pdec16le$O $(OBJDIR)$Pdec32be$O $(OBJDIR)$Pdec32le$O $(OBJDIR)$Pdec64be$O $(OBJDIR)$Pdec64le$O $(OBJDIR)$Penc16be$O $(OBJDIR)$Penc16le$O $(OBJDIR)$Penc32be$O $(OBJDIR)$Penc32le$O $(OBJDIR)$Penc64be$O $(OBJDIR)$Penc64le$O $(OBJDIR)$Ppemdec$O $(OBJDIR)$Pec_all_m15$O $(OBJDIR)$Pec_all_m31$O $(OBJDIR)$Pec_c25519_i15$O $(OBJDIR)$Pec_c25519_i31$O $(OBJDIR)$Pec_c25519_m15$O $(OBJDIR)$Pec_c25519_m31$O $(OBJDIR)$Pec_curve25519$O $(OBJDIR)$Pec_p256_m15$O $(OBJDIR)$Pec_p256_m31$O $(OBJDIR)$Pec_prime_i15$O $(OBJDIR)$Pec_prime_i31$O $(OBJDIR)$Pec_secp256r1$O $(OBJDIR)$Pec_secp384r1$O $(OBJDIR)$Pec_secp521r1$O $(OBJDIR)$Pecdsa_atr$O $(OBJDIR)$Pecdsa_i15_bits$O $(OBJDIR)$Pecdsa_i15_sign_asn1$O $(OBJDIR)$Pecdsa_i15_sign_raw$O $(OBJDIR)$Pecdsa_i15_vrfy_asn1$O $(OBJDIR)$Pecdsa_i15_vrfy_raw$O $(OBJDIR)$Pecdsa_i31_bits$O $(OBJDIR)$Pecdsa_i31_sign_asn1$O $(OBJDIR)$Pecdsa_i31_sign_raw$O $(OBJDIR)$Pecdsa_i31_vrfy_asn1$O $(OBJDIR)$Pecdsa_i31_vrfy_raw$O $(OBJDIR)$Pecdsa_rta$O $(OBJDIR)$Pdig_oid$O $(OBJDIR)$Pdig_size$O $(OBJDIR)$Pghash_ctmul$O $(OBJDIR)$Pghash_ctmul32$O $(OBJDIR)$Pghash_ctmul64$O $(OBJDIR)$Pmd5$O $(OBJDIR)$Pmd5sha1$O $(OBJDIR)$Pmultihash$O $(OBJDIR)$Psha1$O $(OBJDIR)$Psha2big$O $(OBJDIR)$Psha2small$O $(OBJDIR)$Pi15_add$O $(OBJDIR)$Pi15_bitlen$O $(OBJDIR)$Pi15_decmod$O $(OBJDIR)$Pi15_decode$O $(OBJDIR)$Pi15_decred$O $(OBJDIR)$Pi15_encode$O $(OBJDIR)$Pi15_fmont$O $(OBJDIR)$Pi15_iszero$O $(OBJDIR)$Pi15_modpow$O $(OBJDIR)$Pi15_montmul$O $(OBJDIR)$Pi15_mulacc$O $(OBJDIR)$Pi15_muladd$O $(OBJDIR)$Pi15_ninv15$O $(OBJDIR)$Pi15_reduce$O $(OBJDIR)$Pi15_rshift$O $(OBJDIR)$Pi15_sub$O $(OBJDIR)$Pi15_tmont$O $(OBJDIR)$Pi31_add$O $(OBJDIR)$Pi31_bitlen$O $(OBJDIR)$Pi31_decmod$O $(OBJDIR)$Pi31_decode$O $(OBJDIR)$Pi31_decred$O $(OBJDIR)$Pi31_encode$O $(OBJDIR)$Pi31_fmont$O $(OBJDIR)$Pi31_iszero$O $(OBJDIR)$Pi31_modpow$O $(OBJDIR)$Pi31_montmul$O $(OBJDIR)$Pi31_mulacc$O $(OBJDIR)$Pi31_muladd$O $(OBJDIR)$Pi31_ninv31$O $(OBJDIR)$Pi31_reduce$O $(OBJDIR)$Pi31_rshift$O $(OBJDIR)$Pi31_sub$O $(OBJDIR)$Pi31_tmont$O $(OBJDIR)$Pi32_add$O $(OBJDIR)$Pi32_bitlen$O $(OBJDIR)$Pi32_decmod$O $(OBJDIR)$Pi32_decode$O $(OBJDIR)$Pi32_decred$O $(OBJDIR)$Pi32_div32$O $(OBJDIR)$Pi32_encode$O $(OBJDIR)$Pi32_fmont$O $(OBJDIR)$Pi32_iszero$O $(OBJDIR)$Pi32_modpow$O $(OBJDIR)$Pi32_montmul$O $(OBJDIR)$Pi32_mulacc$O $(OBJDIR)$Pi32_muladd$O $(OBJDIR)$Pi32_ninv32$O $(OBJDIR)$Pi32_reduce$O $(OBJDIR)$Pi32_sub$O $(OBJDIR)$Pi32_tmont$O $(OBJDIR)$Phmac$O $(OBJDIR)$Phmac_ct$O $(OBJDIR)$Phmac_drbg$O $(OBJDIR)$Prsa_i15_pkcs1_sign$O $(OBJDIR)$Prsa_i15_pkcs1_vrfy$O $(OBJDIR)$Prsa_i15_priv$O $(OBJDIR)$Prsa_i15_pub$O $(OBJDIR)$Prsa_i31_pkcs1_sign$O $(OBJDIR)$Prsa_i31_pkcs1_vrfy$O $(OBJDIR)$Prsa_i31_priv$O $(OBJDIR)$Prsa_i31_pub$O $(OBJDIR)$Prsa_i32_pkcs1_sign$O $(OBJDIR)$Prsa_i32_pkcs1_vrfy$O $(OBJDIR)$Prsa_i32_priv$O $(OBJDIR)$Prsa_i32_pub$O $(OBJDIR)$Prsa_pkcs1_sig_pad$O $(OBJDIR)$Prsa_pkcs1_sig_unpad$O $(OBJDIR)$Prsa_ssl_decrypt$O $(OBJDIR)$Pprf$O $(OBJDIR)$Pprf_md5sha1$O $(OBJDIR)$Pprf_sha256$O $(OBJDIR)$Pprf_sha384$O $(OBJDIR)$Pssl_ccert_single_ec$O $(OBJDIR)$Pssl_ccert_single_rsa$O $(OBJDIR)$Pssl_client$O $(OBJDIR)$Pssl_client_full$O $(OBJDIR)$Pssl_engine$O $(OBJDIR)$Pssl_hashes$O $(OBJDIR)$Pssl_hs_client$O $(OBJDIR)$Pssl_hs_server$O $(OBJDIR)$Pssl_io$O $(OBJDIR)$Pssl_lru$O $(OBJDIR)$Pssl_rec_cbc$O $(OBJDIR)$Pssl_rec_chapol$O $(OBJDIR)$Pssl_rec_gcm$O $(OBJDIR)$Pssl_scert_single_ec$O $(OBJDIR)$Pssl_scert_single_rsa$O $(OBJDIR)$Pssl_server$O $(OBJDIR)$Pssl_server_full_ec$O $(OBJDIR)$Pssl_server_full_rsa$O $(OBJDIR)$Pssl_server_mine2c$O $(OBJDIR)$Pssl_server_mine2g$O $(OBJDIR)$Pssl_server_minf2c$O $(OBJDIR)$Pssl_server_minf2g$O $(OBJDIR)$Pssl_server_minr2g$O $(OBJDIR)$Pssl_server_minu2g$O $(OBJDIR)$Pssl_server_minv2g$O $(OBJDIR)$Paes_big_cbcdec$O $(OBJDIR)$Paes_big_cbcenc$O $(OBJDIR)$Paes_big_ctr$O $(OBJDIR)$Paes_big_dec$O $(OBJDIR)$Paes_big_enc$O $(OBJDIR)$Paes_common$O $(OBJDIR)$Paes_ct$O $(OBJDIR)$Paes_ct64$O $(OBJDIR)$Paes_ct64_cbcdec$O $(OBJDIR)$Paes_ct64_cbcenc$O $(OBJDIR)$Paes_ct64_ctr$O $(OBJDIR)$Paes_ct64_dec$O $(OBJDIR)$Paes_ct64_enc$O $(OBJDIR)$Paes_ct_cbcdec$O $(OBJDIR)$Paes_ct_cbcenc$O $(OBJDIR)$Paes_ct_ctr$O $(OBJDIR)$Paes_ct_dec$O $(OBJDIR)$Paes_ct_enc$O $(OBJDIR)$Paes_small_cbcdec$O $(OBJDIR)$Paes_small_cbcenc$O $(OBJDIR)$Paes_small_ctr$O $(OBJDIR)$Paes_small_dec$O $(OBJDIR)$Paes_small_enc$O $(OBJDIR)$Pchacha20_ct$O $(OBJDIR)$Pdes_ct$O $(OBJDIR)$Pdes_ct_cbcdec$O $(OBJDIR)$Pdes_ct_cbcenc$O $(OBJDIR)$Pdes_support$O $(OBJDIR)$Pdes_tab$O $(OBJDIR)$Pdes_tab_cbcdec$O $(OBJDIR)$Pdes_tab_cbcenc$O $(OBJDIR)$Ppoly1305_ctmul$O $(OBJDIR)$Ppoly1305_ctmul32$O $(OBJDIR)$Ppoly1305_i15$O $(OBJDIR)$Pskey_decoder$O $(OBJDIR)$Px509_decoder$O $(OBJDIR)$Px509_knownkey$O $(OBJDIR)$Px509_minimal$O $(OBJDIR)$Px509_minimal_full$O
OBJBRSSL = $(OBJDIR)$Pbrssl$O $(OBJDIR)$Pcerts$O $(OBJDIR)$Pchain$O $(OBJDIR)$Pclient$O $(OBJDIR)$Perrors$O $(OBJDIR)$Pfiles$O $(OBJDIR)$Pkeys$O $(OBJDIR)$Pnames$O $(OBJDIR)$Pserver$O $(OBJDIR)$Pskey$O $(OBJDIR)$Psslio$O $(OBJDIR)$Pta$O $(OBJDIR)$Pvector$O $(OBJDIR)$Pverify$O $(OBJDIR)$Pxmem$O
OBJTESTCRYPTO = $(OBJDIR)$Ptest_crypto$O
OBJTESTSPEED = $(OBJDIR)$Ptest_speed$O
OBJTESTX509 = $(OBJDIR)$Ptest_x509$O
HEADERSPUB = inc$Pbearssl.h inc$Pbearssl_block.h inc$Pbearssl_ec.h inc$Pbearssl_hash.h inc$Pbearssl_hmac.h inc$Pbearssl_pem.h inc$Pbearssl_prf.h inc$Pbearssl_rand.h inc$Pbearssl_rsa.h inc$Pbearssl_ssl.h inc$Pbearssl_x509.h
HEADERSPRIV = $(HEADERSPUB) src$Pconfig.h src$Pinner.h
HEADERSTOOLS = $(HEADERSPUB) tools$Pbrssl.h
T0SRC = T0$PBlobWriter.cs T0$PCPU.cs T0$PCodeElement.cs T0$PCodeElementJump.cs T0$PCodeElementUInt.cs T0$PCodeElementUIntExpr.cs T0$PCodeElementUIntInt.cs T0$PCodeElementUIntUInt.cs T0$PConstData.cs T0$POpcode.cs T0$POpcodeCall.cs T0$POpcodeConst.cs T0$POpcodeGetLocal.cs T0$POpcodeJump.cs T0$POpcodeJumpIf.cs T0$POpcodeJumpIfNot.cs T0$POpcodeJumpUncond.cs T0$POpcodePutLocal.cs T0$POpcodeRet.cs T0$PSType.cs T0$PT0Comp.cs T0$PTPointerBase.cs T0$PTPointerBlob.cs T0$PTPointerExpr.cs T0$PTPointerNull.cs T0$PTPointerXT.cs T0$PTValue.cs T0$PWord.cs T0$PWordBuilder.cs T0$PWordData.cs T0$PWordInterpreted.cs T0$PWordNative.cs
T0KERN =
all: $(STATICLIB) $(DLL) $(TOOLS) $(TESTS)
no:
lib: $(BEARSSLLIB)
dll: $(BEARSSLDLL)
tools: $(BRSSL)
tests: $(TESTCRYPTO) $(TESTSPEED) $(TESTX509)
T0: $(T0COMP)
$(RUNT0COMP) -o src$Pcodec$Ppemdec -r br_pem_decoder src$Pcodec$Ppemdec.t0
$(RUNT0COMP) -o src$Pssl$Pssl_hs_client -r br_ssl_hs_client src$Pssl$Pssl_hs_common.t0 src$Pssl$Pssl_hs_client.t0
$(RUNT0COMP) -o src$Pssl$Pssl_hs_server -r br_ssl_hs_server src$Pssl$Pssl_hs_common.t0 src$Pssl$Pssl_hs_server.t0
$(RUNT0COMP) -o src$Px509$Pskey_decoder -r br_skey_decoder src$Px509$Pasn1.t0 src$Px509$Pskey_decoder.t0
$(RUNT0COMP) -o src$Px509$Px509_decoder -r br_x509_decoder src$Px509$Pasn1.t0 src$Px509$Px509_decoder.t0
$(RUNT0COMP) -o src$Px509$Px509_minimal -r br_x509_minimal src$Px509$Pasn1.t0 src$Px509$Px509_minimal.t0
$(T0COMP): $(T0SRC) $(T0KERN)
$(MKT0COMP)
clean:
-$(RM) $(OBJDIR)$P*$O
-$(RM) $(BEARSSLLIB) $(BEARSSLDLL) $(BRSSL) $(TESTCRYPTO) $(TESTSPEED) $(TESTX509)
$(OBJDIR):
-$(MKDIR) $(OBJDIR)
$(BEARSSLLIB): $(OBJDIR) $(OBJ)
$(AR) $(ARFLAGS) $(AROUT)$(BEARSSLLIB) $(OBJ)
$(BEARSSLDLL): $(OBJDIR) $(OBJ)
$(LDDLL) $(LDDLLFLAGS) $(LDDLLOUT)$(BEARSSLDLL) $(OBJ)
$(BRSSL): $(BEARSSLLIB) $(OBJBRSSL)
$(LD) $(LDFLAGS) $(LDOUT)$(BRSSL) $(OBJBRSSL) $(BEARSSLLIB)
$(TESTCRYPTO): $(BEARSSLLIB) $(OBJTESTCRYPTO)
$(LD) $(LDFLAGS) $(LDOUT)$(TESTCRYPTO) $(OBJTESTCRYPTO) $(BEARSSLLIB)
$(TESTSPEED): $(BEARSSLLIB) $(OBJTESTSPEED)
$(LD) $(LDFLAGS) $(LDOUT)$(TESTSPEED) $(OBJTESTSPEED) $(BEARSSLLIB)
$(TESTX509): $(BEARSSLLIB) $(OBJTESTX509)
$(LD) $(LDFLAGS) $(LDOUT)$(TESTX509) $(OBJTESTX509) $(BEARSSLLIB)
$(OBJDIR)$Pccopy$O: src$Pcodec$Pccopy.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pccopy$O src$Pcodec$Pccopy.c
$(OBJDIR)$Pdec16be$O: src$Pcodec$Pdec16be.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdec16be$O src$Pcodec$Pdec16be.c
$(OBJDIR)$Pdec16le$O: src$Pcodec$Pdec16le.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdec16le$O src$Pcodec$Pdec16le.c
$(OBJDIR)$Pdec32be$O: src$Pcodec$Pdec32be.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdec32be$O src$Pcodec$Pdec32be.c
$(OBJDIR)$Pdec32le$O: src$Pcodec$Pdec32le.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdec32le$O src$Pcodec$Pdec32le.c
$(OBJDIR)$Pdec64be$O: src$Pcodec$Pdec64be.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdec64be$O src$Pcodec$Pdec64be.c
$(OBJDIR)$Pdec64le$O: src$Pcodec$Pdec64le.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdec64le$O src$Pcodec$Pdec64le.c
$(OBJDIR)$Penc16be$O: src$Pcodec$Penc16be.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Penc16be$O src$Pcodec$Penc16be.c
$(OBJDIR)$Penc16le$O: src$Pcodec$Penc16le.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Penc16le$O src$Pcodec$Penc16le.c
$(OBJDIR)$Penc32be$O: src$Pcodec$Penc32be.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Penc32be$O src$Pcodec$Penc32be.c
$(OBJDIR)$Penc32le$O: src$Pcodec$Penc32le.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Penc32le$O src$Pcodec$Penc32le.c
$(OBJDIR)$Penc64be$O: src$Pcodec$Penc64be.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Penc64be$O src$Pcodec$Penc64be.c
$(OBJDIR)$Penc64le$O: src$Pcodec$Penc64le.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Penc64le$O src$Pcodec$Penc64le.c
$(OBJDIR)$Ppemdec$O: src$Pcodec$Ppemdec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Ppemdec$O src$Pcodec$Ppemdec.c
$(OBJDIR)$Pec_all_m15$O: src$Pec$Pec_all_m15.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_all_m15$O src$Pec$Pec_all_m15.c
$(OBJDIR)$Pec_all_m31$O: src$Pec$Pec_all_m31.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_all_m31$O src$Pec$Pec_all_m31.c
$(OBJDIR)$Pec_c25519_i15$O: src$Pec$Pec_c25519_i15.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_c25519_i15$O src$Pec$Pec_c25519_i15.c
$(OBJDIR)$Pec_c25519_i31$O: src$Pec$Pec_c25519_i31.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_c25519_i31$O src$Pec$Pec_c25519_i31.c
$(OBJDIR)$Pec_c25519_m15$O: src$Pec$Pec_c25519_m15.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_c25519_m15$O src$Pec$Pec_c25519_m15.c
$(OBJDIR)$Pec_c25519_m31$O: src$Pec$Pec_c25519_m31.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_c25519_m31$O src$Pec$Pec_c25519_m31.c
$(OBJDIR)$Pec_curve25519$O: src$Pec$Pec_curve25519.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_curve25519$O src$Pec$Pec_curve25519.c
$(OBJDIR)$Pec_p256_m15$O: src$Pec$Pec_p256_m15.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_p256_m15$O src$Pec$Pec_p256_m15.c
$(OBJDIR)$Pec_p256_m31$O: src$Pec$Pec_p256_m31.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_p256_m31$O src$Pec$Pec_p256_m31.c
$(OBJDIR)$Pec_prime_i15$O: src$Pec$Pec_prime_i15.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_prime_i15$O src$Pec$Pec_prime_i15.c
$(OBJDIR)$Pec_prime_i31$O: src$Pec$Pec_prime_i31.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_prime_i31$O src$Pec$Pec_prime_i31.c
$(OBJDIR)$Pec_secp256r1$O: src$Pec$Pec_secp256r1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_secp256r1$O src$Pec$Pec_secp256r1.c
$(OBJDIR)$Pec_secp384r1$O: src$Pec$Pec_secp384r1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_secp384r1$O src$Pec$Pec_secp384r1.c
$(OBJDIR)$Pec_secp521r1$O: src$Pec$Pec_secp521r1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pec_secp521r1$O src$Pec$Pec_secp521r1.c
$(OBJDIR)$Pecdsa_atr$O: src$Pec$Pecdsa_atr.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_atr$O src$Pec$Pecdsa_atr.c
$(OBJDIR)$Pecdsa_i15_bits$O: src$Pec$Pecdsa_i15_bits.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i15_bits$O src$Pec$Pecdsa_i15_bits.c
$(OBJDIR)$Pecdsa_i15_sign_asn1$O: src$Pec$Pecdsa_i15_sign_asn1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i15_sign_asn1$O src$Pec$Pecdsa_i15_sign_asn1.c
$(OBJDIR)$Pecdsa_i15_sign_raw$O: src$Pec$Pecdsa_i15_sign_raw.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i15_sign_raw$O src$Pec$Pecdsa_i15_sign_raw.c
$(OBJDIR)$Pecdsa_i15_vrfy_asn1$O: src$Pec$Pecdsa_i15_vrfy_asn1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i15_vrfy_asn1$O src$Pec$Pecdsa_i15_vrfy_asn1.c
$(OBJDIR)$Pecdsa_i15_vrfy_raw$O: src$Pec$Pecdsa_i15_vrfy_raw.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i15_vrfy_raw$O src$Pec$Pecdsa_i15_vrfy_raw.c
$(OBJDIR)$Pecdsa_i31_bits$O: src$Pec$Pecdsa_i31_bits.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i31_bits$O src$Pec$Pecdsa_i31_bits.c
$(OBJDIR)$Pecdsa_i31_sign_asn1$O: src$Pec$Pecdsa_i31_sign_asn1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i31_sign_asn1$O src$Pec$Pecdsa_i31_sign_asn1.c
$(OBJDIR)$Pecdsa_i31_sign_raw$O: src$Pec$Pecdsa_i31_sign_raw.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i31_sign_raw$O src$Pec$Pecdsa_i31_sign_raw.c
$(OBJDIR)$Pecdsa_i31_vrfy_asn1$O: src$Pec$Pecdsa_i31_vrfy_asn1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i31_vrfy_asn1$O src$Pec$Pecdsa_i31_vrfy_asn1.c
$(OBJDIR)$Pecdsa_i31_vrfy_raw$O: src$Pec$Pecdsa_i31_vrfy_raw.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_i31_vrfy_raw$O src$Pec$Pecdsa_i31_vrfy_raw.c
$(OBJDIR)$Pecdsa_rta$O: src$Pec$Pecdsa_rta.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pecdsa_rta$O src$Pec$Pecdsa_rta.c
$(OBJDIR)$Pdig_oid$O: src$Phash$Pdig_oid.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdig_oid$O src$Phash$Pdig_oid.c
$(OBJDIR)$Pdig_size$O: src$Phash$Pdig_size.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdig_size$O src$Phash$Pdig_size.c
$(OBJDIR)$Pghash_ctmul$O: src$Phash$Pghash_ctmul.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pghash_ctmul$O src$Phash$Pghash_ctmul.c
$(OBJDIR)$Pghash_ctmul32$O: src$Phash$Pghash_ctmul32.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pghash_ctmul32$O src$Phash$Pghash_ctmul32.c
$(OBJDIR)$Pghash_ctmul64$O: src$Phash$Pghash_ctmul64.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pghash_ctmul64$O src$Phash$Pghash_ctmul64.c
$(OBJDIR)$Pmd5$O: src$Phash$Pmd5.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pmd5$O src$Phash$Pmd5.c
$(OBJDIR)$Pmd5sha1$O: src$Phash$Pmd5sha1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pmd5sha1$O src$Phash$Pmd5sha1.c
$(OBJDIR)$Pmultihash$O: src$Phash$Pmultihash.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pmultihash$O src$Phash$Pmultihash.c
$(OBJDIR)$Psha1$O: src$Phash$Psha1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Psha1$O src$Phash$Psha1.c
$(OBJDIR)$Psha2big$O: src$Phash$Psha2big.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Psha2big$O src$Phash$Psha2big.c
$(OBJDIR)$Psha2small$O: src$Phash$Psha2small.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Psha2small$O src$Phash$Psha2small.c
$(OBJDIR)$Pi15_add$O: src$Pint$Pi15_add.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_add$O src$Pint$Pi15_add.c
$(OBJDIR)$Pi15_bitlen$O: src$Pint$Pi15_bitlen.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_bitlen$O src$Pint$Pi15_bitlen.c
$(OBJDIR)$Pi15_decmod$O: src$Pint$Pi15_decmod.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_decmod$O src$Pint$Pi15_decmod.c
$(OBJDIR)$Pi15_decode$O: src$Pint$Pi15_decode.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_decode$O src$Pint$Pi15_decode.c
$(OBJDIR)$Pi15_decred$O: src$Pint$Pi15_decred.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_decred$O src$Pint$Pi15_decred.c
$(OBJDIR)$Pi15_encode$O: src$Pint$Pi15_encode.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_encode$O src$Pint$Pi15_encode.c
$(OBJDIR)$Pi15_fmont$O: src$Pint$Pi15_fmont.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_fmont$O src$Pint$Pi15_fmont.c
$(OBJDIR)$Pi15_iszero$O: src$Pint$Pi15_iszero.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_iszero$O src$Pint$Pi15_iszero.c
$(OBJDIR)$Pi15_modpow$O: src$Pint$Pi15_modpow.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_modpow$O src$Pint$Pi15_modpow.c
$(OBJDIR)$Pi15_montmul$O: src$Pint$Pi15_montmul.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_montmul$O src$Pint$Pi15_montmul.c
$(OBJDIR)$Pi15_mulacc$O: src$Pint$Pi15_mulacc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_mulacc$O src$Pint$Pi15_mulacc.c
$(OBJDIR)$Pi15_muladd$O: src$Pint$Pi15_muladd.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_muladd$O src$Pint$Pi15_muladd.c
$(OBJDIR)$Pi15_ninv15$O: src$Pint$Pi15_ninv15.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_ninv15$O src$Pint$Pi15_ninv15.c
$(OBJDIR)$Pi15_reduce$O: src$Pint$Pi15_reduce.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_reduce$O src$Pint$Pi15_reduce.c
$(OBJDIR)$Pi15_rshift$O: src$Pint$Pi15_rshift.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_rshift$O src$Pint$Pi15_rshift.c
$(OBJDIR)$Pi15_sub$O: src$Pint$Pi15_sub.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_sub$O src$Pint$Pi15_sub.c
$(OBJDIR)$Pi15_tmont$O: src$Pint$Pi15_tmont.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi15_tmont$O src$Pint$Pi15_tmont.c
$(OBJDIR)$Pi31_add$O: src$Pint$Pi31_add.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_add$O src$Pint$Pi31_add.c
$(OBJDIR)$Pi31_bitlen$O: src$Pint$Pi31_bitlen.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_bitlen$O src$Pint$Pi31_bitlen.c
$(OBJDIR)$Pi31_decmod$O: src$Pint$Pi31_decmod.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_decmod$O src$Pint$Pi31_decmod.c
$(OBJDIR)$Pi31_decode$O: src$Pint$Pi31_decode.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_decode$O src$Pint$Pi31_decode.c
$(OBJDIR)$Pi31_decred$O: src$Pint$Pi31_decred.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_decred$O src$Pint$Pi31_decred.c
$(OBJDIR)$Pi31_encode$O: src$Pint$Pi31_encode.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_encode$O src$Pint$Pi31_encode.c
$(OBJDIR)$Pi31_fmont$O: src$Pint$Pi31_fmont.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_fmont$O src$Pint$Pi31_fmont.c
$(OBJDIR)$Pi31_iszero$O: src$Pint$Pi31_iszero.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_iszero$O src$Pint$Pi31_iszero.c
$(OBJDIR)$Pi31_modpow$O: src$Pint$Pi31_modpow.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_modpow$O src$Pint$Pi31_modpow.c
$(OBJDIR)$Pi31_montmul$O: src$Pint$Pi31_montmul.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_montmul$O src$Pint$Pi31_montmul.c
$(OBJDIR)$Pi31_mulacc$O: src$Pint$Pi31_mulacc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_mulacc$O src$Pint$Pi31_mulacc.c
$(OBJDIR)$Pi31_muladd$O: src$Pint$Pi31_muladd.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_muladd$O src$Pint$Pi31_muladd.c
$(OBJDIR)$Pi31_ninv31$O: src$Pint$Pi31_ninv31.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_ninv31$O src$Pint$Pi31_ninv31.c
$(OBJDIR)$Pi31_reduce$O: src$Pint$Pi31_reduce.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_reduce$O src$Pint$Pi31_reduce.c
$(OBJDIR)$Pi31_rshift$O: src$Pint$Pi31_rshift.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_rshift$O src$Pint$Pi31_rshift.c
$(OBJDIR)$Pi31_sub$O: src$Pint$Pi31_sub.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_sub$O src$Pint$Pi31_sub.c
$(OBJDIR)$Pi31_tmont$O: src$Pint$Pi31_tmont.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi31_tmont$O src$Pint$Pi31_tmont.c
$(OBJDIR)$Pi32_add$O: src$Pint$Pi32_add.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_add$O src$Pint$Pi32_add.c
$(OBJDIR)$Pi32_bitlen$O: src$Pint$Pi32_bitlen.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_bitlen$O src$Pint$Pi32_bitlen.c
$(OBJDIR)$Pi32_decmod$O: src$Pint$Pi32_decmod.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_decmod$O src$Pint$Pi32_decmod.c
$(OBJDIR)$Pi32_decode$O: src$Pint$Pi32_decode.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_decode$O src$Pint$Pi32_decode.c
$(OBJDIR)$Pi32_decred$O: src$Pint$Pi32_decred.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_decred$O src$Pint$Pi32_decred.c
$(OBJDIR)$Pi32_div32$O: src$Pint$Pi32_div32.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_div32$O src$Pint$Pi32_div32.c
$(OBJDIR)$Pi32_encode$O: src$Pint$Pi32_encode.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_encode$O src$Pint$Pi32_encode.c
$(OBJDIR)$Pi32_fmont$O: src$Pint$Pi32_fmont.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_fmont$O src$Pint$Pi32_fmont.c
$(OBJDIR)$Pi32_iszero$O: src$Pint$Pi32_iszero.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_iszero$O src$Pint$Pi32_iszero.c
$(OBJDIR)$Pi32_modpow$O: src$Pint$Pi32_modpow.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_modpow$O src$Pint$Pi32_modpow.c
$(OBJDIR)$Pi32_montmul$O: src$Pint$Pi32_montmul.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_montmul$O src$Pint$Pi32_montmul.c
$(OBJDIR)$Pi32_mulacc$O: src$Pint$Pi32_mulacc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_mulacc$O src$Pint$Pi32_mulacc.c
$(OBJDIR)$Pi32_muladd$O: src$Pint$Pi32_muladd.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_muladd$O src$Pint$Pi32_muladd.c
$(OBJDIR)$Pi32_ninv32$O: src$Pint$Pi32_ninv32.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_ninv32$O src$Pint$Pi32_ninv32.c
$(OBJDIR)$Pi32_reduce$O: src$Pint$Pi32_reduce.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_reduce$O src$Pint$Pi32_reduce.c
$(OBJDIR)$Pi32_sub$O: src$Pint$Pi32_sub.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_sub$O src$Pint$Pi32_sub.c
$(OBJDIR)$Pi32_tmont$O: src$Pint$Pi32_tmont.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pi32_tmont$O src$Pint$Pi32_tmont.c
$(OBJDIR)$Phmac$O: src$Pmac$Phmac.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Phmac$O src$Pmac$Phmac.c
$(OBJDIR)$Phmac_ct$O: src$Pmac$Phmac_ct.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Phmac_ct$O src$Pmac$Phmac_ct.c
$(OBJDIR)$Phmac_drbg$O: src$Prand$Phmac_drbg.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Phmac_drbg$O src$Prand$Phmac_drbg.c
$(OBJDIR)$Prsa_i15_pkcs1_sign$O: src$Prsa$Prsa_i15_pkcs1_sign.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i15_pkcs1_sign$O src$Prsa$Prsa_i15_pkcs1_sign.c
$(OBJDIR)$Prsa_i15_pkcs1_vrfy$O: src$Prsa$Prsa_i15_pkcs1_vrfy.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i15_pkcs1_vrfy$O src$Prsa$Prsa_i15_pkcs1_vrfy.c
$(OBJDIR)$Prsa_i15_priv$O: src$Prsa$Prsa_i15_priv.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i15_priv$O src$Prsa$Prsa_i15_priv.c
$(OBJDIR)$Prsa_i15_pub$O: src$Prsa$Prsa_i15_pub.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i15_pub$O src$Prsa$Prsa_i15_pub.c
$(OBJDIR)$Prsa_i31_pkcs1_sign$O: src$Prsa$Prsa_i31_pkcs1_sign.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i31_pkcs1_sign$O src$Prsa$Prsa_i31_pkcs1_sign.c
$(OBJDIR)$Prsa_i31_pkcs1_vrfy$O: src$Prsa$Prsa_i31_pkcs1_vrfy.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i31_pkcs1_vrfy$O src$Prsa$Prsa_i31_pkcs1_vrfy.c
$(OBJDIR)$Prsa_i31_priv$O: src$Prsa$Prsa_i31_priv.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i31_priv$O src$Prsa$Prsa_i31_priv.c
$(OBJDIR)$Prsa_i31_pub$O: src$Prsa$Prsa_i31_pub.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i31_pub$O src$Prsa$Prsa_i31_pub.c
$(OBJDIR)$Prsa_i32_pkcs1_sign$O: src$Prsa$Prsa_i32_pkcs1_sign.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i32_pkcs1_sign$O src$Prsa$Prsa_i32_pkcs1_sign.c
$(OBJDIR)$Prsa_i32_pkcs1_vrfy$O: src$Prsa$Prsa_i32_pkcs1_vrfy.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i32_pkcs1_vrfy$O src$Prsa$Prsa_i32_pkcs1_vrfy.c
$(OBJDIR)$Prsa_i32_priv$O: src$Prsa$Prsa_i32_priv.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i32_priv$O src$Prsa$Prsa_i32_priv.c
$(OBJDIR)$Prsa_i32_pub$O: src$Prsa$Prsa_i32_pub.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_i32_pub$O src$Prsa$Prsa_i32_pub.c
$(OBJDIR)$Prsa_pkcs1_sig_pad$O: src$Prsa$Prsa_pkcs1_sig_pad.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_pkcs1_sig_pad$O src$Prsa$Prsa_pkcs1_sig_pad.c
$(OBJDIR)$Prsa_pkcs1_sig_unpad$O: src$Prsa$Prsa_pkcs1_sig_unpad.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_pkcs1_sig_unpad$O src$Prsa$Prsa_pkcs1_sig_unpad.c
$(OBJDIR)$Prsa_ssl_decrypt$O: src$Prsa$Prsa_ssl_decrypt.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Prsa_ssl_decrypt$O src$Prsa$Prsa_ssl_decrypt.c
$(OBJDIR)$Pprf$O: src$Pssl$Pprf.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pprf$O src$Pssl$Pprf.c
$(OBJDIR)$Pprf_md5sha1$O: src$Pssl$Pprf_md5sha1.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pprf_md5sha1$O src$Pssl$Pprf_md5sha1.c
$(OBJDIR)$Pprf_sha256$O: src$Pssl$Pprf_sha256.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pprf_sha256$O src$Pssl$Pprf_sha256.c
$(OBJDIR)$Pprf_sha384$O: src$Pssl$Pprf_sha384.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pprf_sha384$O src$Pssl$Pprf_sha384.c
$(OBJDIR)$Pssl_ccert_single_ec$O: src$Pssl$Pssl_ccert_single_ec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_ccert_single_ec$O src$Pssl$Pssl_ccert_single_ec.c
$(OBJDIR)$Pssl_ccert_single_rsa$O: src$Pssl$Pssl_ccert_single_rsa.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_ccert_single_rsa$O src$Pssl$Pssl_ccert_single_rsa.c
$(OBJDIR)$Pssl_client$O: src$Pssl$Pssl_client.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_client$O src$Pssl$Pssl_client.c
$(OBJDIR)$Pssl_client_full$O: src$Pssl$Pssl_client_full.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_client_full$O src$Pssl$Pssl_client_full.c
$(OBJDIR)$Pssl_engine$O: src$Pssl$Pssl_engine.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_engine$O src$Pssl$Pssl_engine.c
$(OBJDIR)$Pssl_hashes$O: src$Pssl$Pssl_hashes.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_hashes$O src$Pssl$Pssl_hashes.c
$(OBJDIR)$Pssl_hs_client$O: src$Pssl$Pssl_hs_client.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_hs_client$O src$Pssl$Pssl_hs_client.c
$(OBJDIR)$Pssl_hs_server$O: src$Pssl$Pssl_hs_server.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_hs_server$O src$Pssl$Pssl_hs_server.c
$(OBJDIR)$Pssl_io$O: src$Pssl$Pssl_io.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_io$O src$Pssl$Pssl_io.c
$(OBJDIR)$Pssl_lru$O: src$Pssl$Pssl_lru.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_lru$O src$Pssl$Pssl_lru.c
$(OBJDIR)$Pssl_rec_cbc$O: src$Pssl$Pssl_rec_cbc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_rec_cbc$O src$Pssl$Pssl_rec_cbc.c
$(OBJDIR)$Pssl_rec_chapol$O: src$Pssl$Pssl_rec_chapol.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_rec_chapol$O src$Pssl$Pssl_rec_chapol.c
$(OBJDIR)$Pssl_rec_gcm$O: src$Pssl$Pssl_rec_gcm.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_rec_gcm$O src$Pssl$Pssl_rec_gcm.c
$(OBJDIR)$Pssl_scert_single_ec$O: src$Pssl$Pssl_scert_single_ec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_scert_single_ec$O src$Pssl$Pssl_scert_single_ec.c
$(OBJDIR)$Pssl_scert_single_rsa$O: src$Pssl$Pssl_scert_single_rsa.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_scert_single_rsa$O src$Pssl$Pssl_scert_single_rsa.c
$(OBJDIR)$Pssl_server$O: src$Pssl$Pssl_server.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server$O src$Pssl$Pssl_server.c
$(OBJDIR)$Pssl_server_full_ec$O: src$Pssl$Pssl_server_full_ec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_full_ec$O src$Pssl$Pssl_server_full_ec.c
$(OBJDIR)$Pssl_server_full_rsa$O: src$Pssl$Pssl_server_full_rsa.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_full_rsa$O src$Pssl$Pssl_server_full_rsa.c
$(OBJDIR)$Pssl_server_mine2c$O: src$Pssl$Pssl_server_mine2c.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_mine2c$O src$Pssl$Pssl_server_mine2c.c
$(OBJDIR)$Pssl_server_mine2g$O: src$Pssl$Pssl_server_mine2g.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_mine2g$O src$Pssl$Pssl_server_mine2g.c
$(OBJDIR)$Pssl_server_minf2c$O: src$Pssl$Pssl_server_minf2c.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_minf2c$O src$Pssl$Pssl_server_minf2c.c
$(OBJDIR)$Pssl_server_minf2g$O: src$Pssl$Pssl_server_minf2g.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_minf2g$O src$Pssl$Pssl_server_minf2g.c
$(OBJDIR)$Pssl_server_minr2g$O: src$Pssl$Pssl_server_minr2g.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_minr2g$O src$Pssl$Pssl_server_minr2g.c
$(OBJDIR)$Pssl_server_minu2g$O: src$Pssl$Pssl_server_minu2g.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_minu2g$O src$Pssl$Pssl_server_minu2g.c
$(OBJDIR)$Pssl_server_minv2g$O: src$Pssl$Pssl_server_minv2g.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pssl_server_minv2g$O src$Pssl$Pssl_server_minv2g.c
$(OBJDIR)$Paes_big_cbcdec$O: src$Psymcipher$Paes_big_cbcdec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_big_cbcdec$O src$Psymcipher$Paes_big_cbcdec.c
$(OBJDIR)$Paes_big_cbcenc$O: src$Psymcipher$Paes_big_cbcenc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_big_cbcenc$O src$Psymcipher$Paes_big_cbcenc.c
$(OBJDIR)$Paes_big_ctr$O: src$Psymcipher$Paes_big_ctr.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_big_ctr$O src$Psymcipher$Paes_big_ctr.c
$(OBJDIR)$Paes_big_dec$O: src$Psymcipher$Paes_big_dec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_big_dec$O src$Psymcipher$Paes_big_dec.c
$(OBJDIR)$Paes_big_enc$O: src$Psymcipher$Paes_big_enc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_big_enc$O src$Psymcipher$Paes_big_enc.c
$(OBJDIR)$Paes_common$O: src$Psymcipher$Paes_common.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_common$O src$Psymcipher$Paes_common.c
$(OBJDIR)$Paes_ct$O: src$Psymcipher$Paes_ct.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct$O src$Psymcipher$Paes_ct.c
$(OBJDIR)$Paes_ct64$O: src$Psymcipher$Paes_ct64.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct64$O src$Psymcipher$Paes_ct64.c
$(OBJDIR)$Paes_ct64_cbcdec$O: src$Psymcipher$Paes_ct64_cbcdec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct64_cbcdec$O src$Psymcipher$Paes_ct64_cbcdec.c
$(OBJDIR)$Paes_ct64_cbcenc$O: src$Psymcipher$Paes_ct64_cbcenc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct64_cbcenc$O src$Psymcipher$Paes_ct64_cbcenc.c
$(OBJDIR)$Paes_ct64_ctr$O: src$Psymcipher$Paes_ct64_ctr.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct64_ctr$O src$Psymcipher$Paes_ct64_ctr.c
$(OBJDIR)$Paes_ct64_dec$O: src$Psymcipher$Paes_ct64_dec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct64_dec$O src$Psymcipher$Paes_ct64_dec.c
$(OBJDIR)$Paes_ct64_enc$O: src$Psymcipher$Paes_ct64_enc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct64_enc$O src$Psymcipher$Paes_ct64_enc.c
$(OBJDIR)$Paes_ct_cbcdec$O: src$Psymcipher$Paes_ct_cbcdec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct_cbcdec$O src$Psymcipher$Paes_ct_cbcdec.c
$(OBJDIR)$Paes_ct_cbcenc$O: src$Psymcipher$Paes_ct_cbcenc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct_cbcenc$O src$Psymcipher$Paes_ct_cbcenc.c
$(OBJDIR)$Paes_ct_ctr$O: src$Psymcipher$Paes_ct_ctr.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct_ctr$O src$Psymcipher$Paes_ct_ctr.c
$(OBJDIR)$Paes_ct_dec$O: src$Psymcipher$Paes_ct_dec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct_dec$O src$Psymcipher$Paes_ct_dec.c
$(OBJDIR)$Paes_ct_enc$O: src$Psymcipher$Paes_ct_enc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_ct_enc$O src$Psymcipher$Paes_ct_enc.c
$(OBJDIR)$Paes_small_cbcdec$O: src$Psymcipher$Paes_small_cbcdec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_small_cbcdec$O src$Psymcipher$Paes_small_cbcdec.c
$(OBJDIR)$Paes_small_cbcenc$O: src$Psymcipher$Paes_small_cbcenc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_small_cbcenc$O src$Psymcipher$Paes_small_cbcenc.c
$(OBJDIR)$Paes_small_ctr$O: src$Psymcipher$Paes_small_ctr.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_small_ctr$O src$Psymcipher$Paes_small_ctr.c
$(OBJDIR)$Paes_small_dec$O: src$Psymcipher$Paes_small_dec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_small_dec$O src$Psymcipher$Paes_small_dec.c
$(OBJDIR)$Paes_small_enc$O: src$Psymcipher$Paes_small_enc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Paes_small_enc$O src$Psymcipher$Paes_small_enc.c
$(OBJDIR)$Pchacha20_ct$O: src$Psymcipher$Pchacha20_ct.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pchacha20_ct$O src$Psymcipher$Pchacha20_ct.c
$(OBJDIR)$Pdes_ct$O: src$Psymcipher$Pdes_ct.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdes_ct$O src$Psymcipher$Pdes_ct.c
$(OBJDIR)$Pdes_ct_cbcdec$O: src$Psymcipher$Pdes_ct_cbcdec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdes_ct_cbcdec$O src$Psymcipher$Pdes_ct_cbcdec.c
$(OBJDIR)$Pdes_ct_cbcenc$O: src$Psymcipher$Pdes_ct_cbcenc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdes_ct_cbcenc$O src$Psymcipher$Pdes_ct_cbcenc.c
$(OBJDIR)$Pdes_support$O: src$Psymcipher$Pdes_support.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdes_support$O src$Psymcipher$Pdes_support.c
$(OBJDIR)$Pdes_tab$O: src$Psymcipher$Pdes_tab.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdes_tab$O src$Psymcipher$Pdes_tab.c
$(OBJDIR)$Pdes_tab_cbcdec$O: src$Psymcipher$Pdes_tab_cbcdec.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdes_tab_cbcdec$O src$Psymcipher$Pdes_tab_cbcdec.c
$(OBJDIR)$Pdes_tab_cbcenc$O: src$Psymcipher$Pdes_tab_cbcenc.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pdes_tab_cbcenc$O src$Psymcipher$Pdes_tab_cbcenc.c
$(OBJDIR)$Ppoly1305_ctmul$O: src$Psymcipher$Ppoly1305_ctmul.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Ppoly1305_ctmul$O src$Psymcipher$Ppoly1305_ctmul.c
$(OBJDIR)$Ppoly1305_ctmul32$O: src$Psymcipher$Ppoly1305_ctmul32.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Ppoly1305_ctmul32$O src$Psymcipher$Ppoly1305_ctmul32.c
$(OBJDIR)$Ppoly1305_i15$O: src$Psymcipher$Ppoly1305_i15.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Ppoly1305_i15$O src$Psymcipher$Ppoly1305_i15.c
$(OBJDIR)$Pskey_decoder$O: src$Px509$Pskey_decoder.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pskey_decoder$O src$Px509$Pskey_decoder.c
$(OBJDIR)$Px509_decoder$O: src$Px509$Px509_decoder.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Px509_decoder$O src$Px509$Px509_decoder.c
$(OBJDIR)$Px509_knownkey$O: src$Px509$Px509_knownkey.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Px509_knownkey$O src$Px509$Px509_knownkey.c
$(OBJDIR)$Px509_minimal$O: src$Px509$Px509_minimal.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Px509_minimal$O src$Px509$Px509_minimal.c
$(OBJDIR)$Px509_minimal_full$O: src$Px509$Px509_minimal_full.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Px509_minimal_full$O src$Px509$Px509_minimal_full.c
$(OBJDIR)$Pbrssl$O: tools$Pbrssl.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pbrssl$O tools$Pbrssl.c
$(OBJDIR)$Pcerts$O: tools$Pcerts.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pcerts$O tools$Pcerts.c
$(OBJDIR)$Pchain$O: tools$Pchain.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pchain$O tools$Pchain.c
$(OBJDIR)$Pclient$O: tools$Pclient.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pclient$O tools$Pclient.c
$(OBJDIR)$Perrors$O: tools$Perrors.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Perrors$O tools$Perrors.c
$(OBJDIR)$Pfiles$O: tools$Pfiles.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pfiles$O tools$Pfiles.c
$(OBJDIR)$Pkeys$O: tools$Pkeys.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pkeys$O tools$Pkeys.c
$(OBJDIR)$Pnames$O: tools$Pnames.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pnames$O tools$Pnames.c
$(OBJDIR)$Pserver$O: tools$Pserver.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pserver$O tools$Pserver.c
$(OBJDIR)$Pskey$O: tools$Pskey.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pskey$O tools$Pskey.c
$(OBJDIR)$Psslio$O: tools$Psslio.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Psslio$O tools$Psslio.c
$(OBJDIR)$Pta$O: tools$Pta.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pta$O tools$Pta.c
$(OBJDIR)$Pvector$O: tools$Pvector.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pvector$O tools$Pvector.c
$(OBJDIR)$Pverify$O: tools$Pverify.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pverify$O tools$Pverify.c
$(OBJDIR)$Pxmem$O: tools$Pxmem.c $(HEADERSTOOLS)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Pxmem$O tools$Pxmem.c
$(OBJDIR)$Ptest_crypto$O: test$Ptest_crypto.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Ptest_crypto$O test$Ptest_crypto.c
$(OBJDIR)$Ptest_speed$O: test$Ptest_speed.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$Ptest_speed$O test$Ptest_speed.c
$(OBJDIR)$Ptest_x509$O: test$Ptest_x509.c $(HEADERSPRIV)
$(CC) $(CFLAGS) $(INCFLAGS) -DSRCDIRNAME=".." $(CCOUT)$(OBJDIR)$Ptest_x509$O test$Ptest_x509.c

38
mk/SingleUnix.mk Normal file
View file

@ -0,0 +1,38 @@
# Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# ======================================================================
# This file sets variables for use with a SingleUnix-compatible 'make'
# utility.
# Load generic default.
include mk/Defaults.mk
# Path separator.
P = /
# Default configuration is 'Unix' (native build on a Unix-like system).
CONF = Unix
include conf/$(CONF).mk
include mk/Rules.mk

32
mk/mkT0.cmd Normal file
View file

@ -0,0 +1,32 @@
@echo off
rem =====================================================================
rem This script uses the command-line C# compiler csc.exe, which is
rem provided with the .NET framework. We need framework 3.5 or later
rem (some of the code uses features not available in the language version
rem implemented in the compiler provided with framework 2.0.50727).
rem =====================================================================
if exist "%SystemRoot%\Microsoft.NET\Framework\v3.5\csc.exe" (
set CSC="%SystemRoot%\Microsoft.NET\Framework\v3.5\csc.exe"
goto do_compile
)
if exist "%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\csc.exe" (
set CSC="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\csc.exe"
goto do_compile
)
if exist "%SystemRoot%\Microsoft.NET\Framework64\v3.5\csc.exe" (
set CSC="%SystemRoot%\Microsoft.NET\Framework64\v3.5\csc.exe"
goto do_compile
)
if exist "%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\csc.exe" (
set CSC="%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\csc.exe"
goto do_compile
)
echo C# compiler not found
exit 1
:do_compile
%CSC% /nologo /out:T0Comp.exe /main:T0Comp /res:T0\kern.t0,t0-kernel T0\*.cs
if %errorlevel% neq 0 exit /b %errorlevel%

View file

458
mk/mkrules.sh Executable file
View file

@ -0,0 +1,458 @@
#! /bin/sh
# ========================================================================
#
# Copyright (c) 2017 Thomas Pornin <pornin@bolet.org>
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# ========================================================================
#
# This script is used to generate the 'Rules.mk' file from the list
# of source file included below. If the list changes (e.g. to add a
# new source file), then add it here and rerun this script.
#
# ========================================================================
# Solaris compatibility: switch to a more POSIX-compliant /bin/sh.
if [ -z "$BR_SCRIPT_LOOP" ] ; then
BR_SCRIPT_LOOP=yes
export BR_SCRIPT_LOOP
if [ -x /usr/xpg6/bin/sh ] ; then
exec /usr/xpg6/bin/sh "$0" "$@"
fi
if [ -x /usr/xpg4/bin/sh ] ; then
exec /usr/xpg4/bin/sh "$0" "$@"
fi
fi
# Exit on first error.
set -e
# Source files. Please keep in alphabetical order.
coresrc=" \
src/codec/ccopy.c \
src/codec/dec16be.c \
src/codec/dec16le.c \
src/codec/dec32be.c \
src/codec/dec32le.c \
src/codec/dec64be.c \
src/codec/dec64le.c \
src/codec/enc16be.c \
src/codec/enc16le.c \
src/codec/enc32be.c \
src/codec/enc32le.c \
src/codec/enc64be.c \
src/codec/enc64le.c \
src/codec/pemdec.c \
src/ec/ec_all_m15.c \
src/ec/ec_all_m31.c \
src/ec/ec_c25519_i15.c \
src/ec/ec_c25519_i31.c \
src/ec/ec_c25519_m15.c \
src/ec/ec_c25519_m31.c \
src/ec/ec_curve25519.c \
src/ec/ec_p256_m15.c \
src/ec/ec_p256_m31.c \
src/ec/ec_prime_i15.c \
src/ec/ec_prime_i31.c \
src/ec/ec_secp256r1.c \
src/ec/ec_secp384r1.c \
src/ec/ec_secp521r1.c \
src/ec/ecdsa_atr.c \
src/ec/ecdsa_i15_bits.c \
src/ec/ecdsa_i15_sign_asn1.c \
src/ec/ecdsa_i15_sign_raw.c \
src/ec/ecdsa_i15_vrfy_asn1.c \
src/ec/ecdsa_i15_vrfy_raw.c \
src/ec/ecdsa_i31_bits.c \
src/ec/ecdsa_i31_sign_asn1.c \
src/ec/ecdsa_i31_sign_raw.c \
src/ec/ecdsa_i31_vrfy_asn1.c \
src/ec/ecdsa_i31_vrfy_raw.c \
src/ec/ecdsa_rta.c \
src/hash/dig_oid.c \
src/hash/dig_size.c \
src/hash/ghash_ctmul.c \
src/hash/ghash_ctmul32.c \
src/hash/ghash_ctmul64.c \
src/hash/md5.c \
src/hash/md5sha1.c \
src/hash/multihash.c \
src/hash/sha1.c \
src/hash/sha2big.c \
src/hash/sha2small.c \
src/int/i15_add.c \
src/int/i15_bitlen.c \
src/int/i15_decmod.c \
src/int/i15_decode.c \
src/int/i15_decred.c \
src/int/i15_encode.c \
src/int/i15_fmont.c \
src/int/i15_iszero.c \
src/int/i15_modpow.c \
src/int/i15_montmul.c \
src/int/i15_mulacc.c \
src/int/i15_muladd.c \
src/int/i15_ninv15.c \
src/int/i15_reduce.c \
src/int/i15_rshift.c \
src/int/i15_sub.c \
src/int/i15_tmont.c \
src/int/i31_add.c \
src/int/i31_bitlen.c \
src/int/i31_decmod.c \
src/int/i31_decode.c \
src/int/i31_decred.c \
src/int/i31_encode.c \
src/int/i31_fmont.c \
src/int/i31_iszero.c \
src/int/i31_modpow.c \
src/int/i31_montmul.c \
src/int/i31_mulacc.c \
src/int/i31_muladd.c \
src/int/i31_ninv31.c \
src/int/i31_reduce.c \
src/int/i31_rshift.c \
src/int/i31_sub.c \
src/int/i31_tmont.c \
src/int/i32_add.c \
src/int/i32_bitlen.c \
src/int/i32_decmod.c \
src/int/i32_decode.c \
src/int/i32_decred.c \
src/int/i32_div32.c \
src/int/i32_encode.c \
src/int/i32_fmont.c \
src/int/i32_iszero.c \
src/int/i32_modpow.c \
src/int/i32_montmul.c \
src/int/i32_mulacc.c \
src/int/i32_muladd.c \
src/int/i32_ninv32.c \
src/int/i32_reduce.c \
src/int/i32_sub.c \
src/int/i32_tmont.c \
src/mac/hmac.c \
src/mac/hmac_ct.c \
src/rand/hmac_drbg.c \
src/rsa/rsa_i15_pkcs1_sign.c \
src/rsa/rsa_i15_pkcs1_vrfy.c \
src/rsa/rsa_i15_priv.c \
src/rsa/rsa_i15_pub.c \
src/rsa/rsa_i31_pkcs1_sign.c \
src/rsa/rsa_i31_pkcs1_vrfy.c \
src/rsa/rsa_i31_priv.c \
src/rsa/rsa_i31_pub.c \
src/rsa/rsa_i32_pkcs1_sign.c \
src/rsa/rsa_i32_pkcs1_vrfy.c \
src/rsa/rsa_i32_priv.c \
src/rsa/rsa_i32_pub.c \
src/rsa/rsa_pkcs1_sig_pad.c \
src/rsa/rsa_pkcs1_sig_unpad.c \
src/rsa/rsa_ssl_decrypt.c \
src/ssl/prf.c \
src/ssl/prf_md5sha1.c \
src/ssl/prf_sha256.c \
src/ssl/prf_sha384.c \
src/ssl/ssl_ccert_single_ec.c \
src/ssl/ssl_ccert_single_rsa.c \
src/ssl/ssl_client.c \
src/ssl/ssl_client_full.c \
src/ssl/ssl_engine.c \
src/ssl/ssl_hashes.c \
src/ssl/ssl_hs_client.c \
src/ssl/ssl_hs_server.c \
src/ssl/ssl_io.c \
src/ssl/ssl_lru.c \
src/ssl/ssl_rec_cbc.c \
src/ssl/ssl_rec_chapol.c \
src/ssl/ssl_rec_gcm.c \
src/ssl/ssl_scert_single_ec.c \
src/ssl/ssl_scert_single_rsa.c \
src/ssl/ssl_server.c \
src/ssl/ssl_server_full_ec.c \
src/ssl/ssl_server_full_rsa.c \
src/ssl/ssl_server_mine2c.c \
src/ssl/ssl_server_mine2g.c \
src/ssl/ssl_server_minf2c.c \
src/ssl/ssl_server_minf2g.c \
src/ssl/ssl_server_minr2g.c \
src/ssl/ssl_server_minu2g.c \
src/ssl/ssl_server_minv2g.c \
src/symcipher/aes_big_cbcdec.c \
src/symcipher/aes_big_cbcenc.c \
src/symcipher/aes_big_ctr.c \
src/symcipher/aes_big_dec.c \
src/symcipher/aes_big_enc.c \
src/symcipher/aes_common.c \
src/symcipher/aes_ct.c \
src/symcipher/aes_ct64.c \
src/symcipher/aes_ct64_cbcdec.c \
src/symcipher/aes_ct64_cbcenc.c \
src/symcipher/aes_ct64_ctr.c \
src/symcipher/aes_ct64_dec.c \
src/symcipher/aes_ct64_enc.c \
src/symcipher/aes_ct_cbcdec.c \
src/symcipher/aes_ct_cbcenc.c \
src/symcipher/aes_ct_ctr.c \
src/symcipher/aes_ct_dec.c \
src/symcipher/aes_ct_enc.c \
src/symcipher/aes_small_cbcdec.c \
src/symcipher/aes_small_cbcenc.c \
src/symcipher/aes_small_ctr.c \
src/symcipher/aes_small_dec.c \
src/symcipher/aes_small_enc.c \
src/symcipher/chacha20_ct.c \
src/symcipher/des_ct.c \
src/symcipher/des_ct_cbcdec.c \
src/symcipher/des_ct_cbcenc.c \
src/symcipher/des_support.c \
src/symcipher/des_tab.c \
src/symcipher/des_tab_cbcdec.c \
src/symcipher/des_tab_cbcenc.c \
src/symcipher/poly1305_ctmul.c \
src/symcipher/poly1305_ctmul32.c \
src/symcipher/poly1305_i15.c \
src/x509/skey_decoder.c \
src/x509/x509_decoder.c \
src/x509/x509_knownkey.c \
src/x509/x509_minimal.c \
src/x509/x509_minimal_full.c"
# Source files for the 'brssl' command-line tool.
toolssrc=" \
tools/brssl.c \
tools/certs.c \
tools/chain.c \
tools/client.c \
tools/errors.c \
tools/files.c \
tools/keys.c \
tools/names.c \
tools/server.c \
tools/skey.c \
tools/sslio.c \
tools/ta.c \
tools/vector.c \
tools/verify.c \
tools/xmem.c"
# Source files the the 'testcrypto' command-line tool.
testcryptosrc=" \
test/test_crypto.c"
# Source files the the 'testspeed' command-line tool.
testspeedsrc=" \
test/test_speed.c"
# Source files the the 'testx509' command-line tool.
testx509src=" \
test/test_x509.c"
# Public header files.
headerspub=" \
inc/bearssl.h \
inc/bearssl_block.h \
inc/bearssl_ec.h \
inc/bearssl_hash.h \
inc/bearssl_hmac.h \
inc/bearssl_pem.h \
inc/bearssl_prf.h \
inc/bearssl_rand.h \
inc/bearssl_rsa.h \
inc/bearssl_ssl.h \
inc/bearssl_x509.h"
# Private header files.
headerspriv=" \
src/config.h \
src/inner.h"
# Header files for the 'brssl' command-line tool.
headerstools=" \
tools/brssl.h"
# T0 compiler source code.
t0compsrc=" \
T0/BlobWriter.cs \
T0/CPU.cs \
T0/CodeElement.cs \
T0/CodeElementJump.cs \
T0/CodeElementUInt.cs \
T0/CodeElementUIntExpr.cs \
T0/CodeElementUIntInt.cs \
T0/CodeElementUIntUInt.cs \
T0/ConstData.cs \
T0/Opcode.cs \
T0/OpcodeCall.cs \
T0/OpcodeConst.cs \
T0/OpcodeGetLocal.cs \
T0/OpcodeJump.cs \
T0/OpcodeJumpIf.cs \
T0/OpcodeJumpIfNot.cs \
T0/OpcodeJumpUncond.cs \
T0/OpcodePutLocal.cs \
T0/OpcodeRet.cs \
T0/SType.cs \
T0/T0Comp.cs \
T0/TPointerBase.cs \
T0/TPointerBlob.cs \
T0/TPointerExpr.cs \
T0/TPointerNull.cs \
T0/TPointerXT.cs \
T0/TValue.cs \
T0/Word.cs \
T0/WordBuilder.cs \
T0/WordData.cs \
T0/WordInterpreted.cs \
T0/WordNative.cs"
t0compkern=" \
T0/kern.t0"
# Function to turn slashes into $P (macro for path separator).
escsep() {
printf '%s' "$1" | sed 's/\//$P/g'
}
# Create rules file.
rm -f Rules.mk
cat > Rules.mk <<EOF
# Automatically generated rules. Use 'mkrules.sh' to modify/regenerate.
EOF
(printf "\nOBJ ="
for f in $coresrc ; do
printf ' $(OBJDIR)$P%s' "$(basename "$f" .c)\$O"
done
printf "\nOBJBRSSL ="
for f in $toolssrc ; do
printf ' $(OBJDIR)$P%s' "$(basename "$f" .c)\$O"
done
printf "\nOBJTESTCRYPTO ="
for f in $testcryptosrc ; do
printf ' $(OBJDIR)$P%s' "$(basename "$f" .c)\$O"
done
printf "\nOBJTESTSPEED ="
for f in $testspeedsrc ; do
printf ' $(OBJDIR)$P%s' "$(basename "$f" .c)\$O"
done
printf "\nOBJTESTX509 ="
for f in $testx509src ; do
printf ' $(OBJDIR)$P%s' "$(basename "$f" .c)\$O"
done
printf "\nHEADERSPUB ="
for f in $headerspub ; do
printf " %s" "$(escsep "$f")"
done
printf "\nHEADERSPRIV = %s" '$(HEADERSPUB)'
for f in $headerspriv ; do
printf " %s" "$(escsep "$f")"
done
printf "\nHEADERSTOOLS = %s" '$(HEADERSPUB)'
for f in $headerstools ; do
printf " %s" "$(escsep "$f")"
done
printf "\nT0SRC ="
for f in $t0compsrc ; do
printf " %s" "$(escsep "$f")"
done
printf "\nT0KERN ="
for f in $t0kernsrc ; do
printf " %s" "$(escsep "$f")"
done
printf "\n") >> Rules.mk
cat >> Rules.mk <<EOF
all: \$(STATICLIB) \$(DLL) \$(TOOLS) \$(TESTS)
no:
lib: \$(BEARSSLLIB)
dll: \$(BEARSSLDLL)
tools: \$(BRSSL)
tests: \$(TESTCRYPTO) \$(TESTSPEED) \$(TESTX509)
T0: \$(T0COMP)
\$(RUNT0COMP) -o src\$Pcodec\$Ppemdec -r br_pem_decoder src\$Pcodec\$Ppemdec.t0
\$(RUNT0COMP) -o src\$Pssl\$Pssl_hs_client -r br_ssl_hs_client src\$Pssl\$Pssl_hs_common.t0 src\$Pssl\$Pssl_hs_client.t0
\$(RUNT0COMP) -o src\$Pssl\$Pssl_hs_server -r br_ssl_hs_server src\$Pssl\$Pssl_hs_common.t0 src\$Pssl\$Pssl_hs_server.t0
\$(RUNT0COMP) -o src\$Px509\$Pskey_decoder -r br_skey_decoder src\$Px509\$Pasn1.t0 src\$Px509\$Pskey_decoder.t0
\$(RUNT0COMP) -o src\$Px509\$Px509_decoder -r br_x509_decoder src\$Px509\$Pasn1.t0 src\$Px509\$Px509_decoder.t0
\$(RUNT0COMP) -o src\$Px509\$Px509_minimal -r br_x509_minimal src\$Px509\$Pasn1.t0 src\$Px509\$Px509_minimal.t0
\$(T0COMP): \$(T0SRC) \$(T0KERN)
\$(MKT0COMP)
clean:
-\$(RM) \$(OBJDIR)\$P*\$O
-\$(RM) \$(BEARSSLLIB) \$(BEARSSLDLL) \$(BRSSL) \$(TESTCRYPTO) \$(TESTSPEED) \$(TESTX509)
\$(OBJDIR):
-\$(MKDIR) \$(OBJDIR)
\$(BEARSSLLIB): \$(OBJDIR) \$(OBJ)
\$(AR) \$(ARFLAGS) \$(AROUT)\$(BEARSSLLIB) \$(OBJ)
\$(BEARSSLDLL): \$(OBJDIR) \$(OBJ)
\$(LDDLL) \$(LDDLLFLAGS) \$(LDDLLOUT)\$(BEARSSLDLL) \$(OBJ)
\$(BRSSL): \$(BEARSSLLIB) \$(OBJBRSSL)
\$(LD) \$(LDFLAGS) \$(LDOUT)\$(BRSSL) \$(OBJBRSSL) \$(BEARSSLLIB)
\$(TESTCRYPTO): \$(BEARSSLLIB) \$(OBJTESTCRYPTO)
\$(LD) \$(LDFLAGS) \$(LDOUT)\$(TESTCRYPTO) \$(OBJTESTCRYPTO) \$(BEARSSLLIB)
\$(TESTSPEED): \$(BEARSSLLIB) \$(OBJTESTSPEED)
\$(LD) \$(LDFLAGS) \$(LDOUT)\$(TESTSPEED) \$(OBJTESTSPEED) \$(BEARSSLLIB)
\$(TESTX509): \$(BEARSSLLIB) \$(OBJTESTX509)
\$(LD) \$(LDFLAGS) \$(LDOUT)\$(TESTX509) \$(OBJTESTX509) \$(BEARSSLLIB)
EOF
(for f in $coresrc ; do
b="$(basename "$f" .c)\$O"
g="$(escsep "$f")"
printf '\n$(OBJDIR)$P%s: %s $(HEADERSPRIV)\n\t$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$P%s %s\n' "$b" "$g" "$b" "$g"
done
for f in $toolssrc ; do
b="$(basename "$f" .c)\$O"
g="$(escsep "$f")"
printf '\n$(OBJDIR)$P%s: %s $(HEADERSTOOLS)\n\t$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$P%s %s\n' "$b" "$g" "$b" "$g"
done
for f in $testcryptosrc $testspeedsrc ; do
b="$(basename "$f" .c)\$O"
g="$(escsep "$f")"
printf '\n$(OBJDIR)$P%s: %s $(HEADERSPRIV)\n\t$(CC) $(CFLAGS) $(INCFLAGS) $(CCOUT)$(OBJDIR)$P%s %s\n' "$b" "$g" "$b" "$g"
done
for f in $testx509src ; do
b="$(basename "$f" .c)\$O"
g="$(escsep "$f")"
printf '\n$(OBJDIR)$P%s: %s $(HEADERSPRIV)\n\t$(CC) $(CFLAGS) $(INCFLAGS) -DSRCDIRNAME=".." $(CCOUT)$(OBJDIR)$P%s %s\n' "$b" "$g" "$b" "$g"
done) >> Rules.mk

View file

@ -58,7 +58,7 @@ t0_parse7E_signed(const unsigned char **p)
#define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
#define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
static const uint8_t t0_datablock[]; /* static const unsigned char t0_datablock[]; */
void br_pem_decoder_init_main(void *t0ctx); void br_pem_decoder_init_main(void *t0ctx);
@ -109,12 +109,12 @@ br_pem_decoder_event(br_pem_decoder_context *ctx)
static const uint8_t t0_datablock[] = { static const unsigned char t0_datablock[] = {
0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20,
0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x00 0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x00
}; };
static const uint8_t t0_codeblock[] = { static const unsigned char t0_codeblock[] = {
0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01,
0x01, 0x08, 0x00, 0x00, 0x13, 0x13, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0x00, 0x13, 0x13, 0x00, 0x00, 0x01,
T0_INT2(offsetof(br_pem_decoder_context, event)), 0x00, 0x00, 0x01, T0_INT2(offsetof(br_pem_decoder_context, event)), 0x00, 0x00, 0x01,

View file

@ -31,6 +31,15 @@
#include "config.h" #include "config.h"
#include "bearssl.h" #include "bearssl.h"
/*
* On MSVC, disable the warning about applying unary minus on an
* unsigned type: it is standard, we do it all the time, and for
* good reasons.
*/
#if _MSC_VER
#pragma warning( disable : 4146 )
#endif
/* /*
* Maximum size for a RSA modulus (in bits). Allocated stack buffers * Maximum size for a RSA modulus (in bits). Allocated stack buffers
* depend on that size, so this value should be kept small. Currently, * depend on that size, so this value should be kept small. Currently,
@ -300,7 +309,7 @@ static inline void
br_multihash_copyimpl(br_multihash_context *dst, br_multihash_copyimpl(br_multihash_context *dst,
const br_multihash_context *src) const br_multihash_context *src)
{ {
memcpy(dst->impl, src->impl, sizeof src->impl); memcpy((void *)dst->impl, src->impl, sizeof src->impl);
} }
/* ==================================================================== */ /* ==================================================================== */

View file

@ -58,7 +58,7 @@ t0_parse7E_signed(const unsigned char **p)
#define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
#define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
static const uint8_t t0_datablock[]; /* static const unsigned char t0_datablock[]; */
void br_ssl_hs_client_init_main(void *t0ctx); void br_ssl_hs_client_init_main(void *t0ctx);
@ -416,7 +416,7 @@ make_client_sign(br_ssl_client_context *ctx)
static const uint8_t t0_datablock[] = { static const unsigned char t0_datablock[] = {
0x00, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x2F, 0x01, 0x24, 0x00, 0x35, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x2F, 0x01, 0x24, 0x00, 0x35, 0x02,
0x24, 0x00, 0x3C, 0x01, 0x44, 0x00, 0x3D, 0x02, 0x44, 0x00, 0x9C, 0x03, 0x24, 0x00, 0x3C, 0x01, 0x44, 0x00, 0x3D, 0x02, 0x44, 0x00, 0x9C, 0x03,
0x04, 0x00, 0x9D, 0x04, 0x05, 0xC0, 0x03, 0x40, 0x24, 0xC0, 0x04, 0x41, 0x04, 0x00, 0x9D, 0x04, 0x05, 0xC0, 0x03, 0x40, 0x24, 0xC0, 0x04, 0x41,
@ -432,7 +432,7 @@ static const uint8_t t0_datablock[] = {
0x04, 0xCC, 0xA9, 0x25, 0x04, 0x00, 0x00 0x04, 0xCC, 0xA9, 0x25, 0x04, 0x00, 0x00
}; };
static const uint8_t t0_codeblock[] = { static const unsigned char t0_codeblock[] = {
0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x00, 0x01,
0x00, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x01, 0x08,
0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00,

View file

@ -58,7 +58,7 @@ t0_parse7E_signed(const unsigned char **p)
#define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
#define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
static const uint8_t t0_datablock[]; /* static const unsigned char t0_datablock[]; */
void br_ssl_hs_server_init_main(void *t0ctx); void br_ssl_hs_server_init_main(void *t0ctx);
@ -445,7 +445,7 @@ verify_CV_sig(br_ssl_server_context *ctx, size_t sig_len)
static const uint8_t t0_datablock[] = { static const unsigned char t0_datablock[] = {
0x00, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x2F, 0x01, 0x24, 0x00, 0x35, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x2F, 0x01, 0x24, 0x00, 0x35, 0x02,
0x24, 0x00, 0x3C, 0x01, 0x44, 0x00, 0x3D, 0x02, 0x44, 0x00, 0x9C, 0x03, 0x24, 0x00, 0x3C, 0x01, 0x44, 0x00, 0x3D, 0x02, 0x44, 0x00, 0x9C, 0x03,
0x04, 0x00, 0x9D, 0x04, 0x05, 0xC0, 0x03, 0x40, 0x24, 0xC0, 0x04, 0x41, 0x04, 0x00, 0x9D, 0x04, 0x05, 0xC0, 0x03, 0x40, 0x24, 0xC0, 0x04, 0x41,
@ -461,7 +461,7 @@ static const uint8_t t0_datablock[] = {
0x04, 0xCC, 0xA9, 0x25, 0x04, 0x00, 0x00 0x04, 0xCC, 0xA9, 0x25, 0x04, 0x00, 0x00
}; };
static const uint8_t t0_codeblock[] = { static const unsigned char t0_codeblock[] = {
0x00, 0x01, 0x00, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x01,
0x00, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x01, 0x08,
0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00,

View file

@ -58,7 +58,7 @@ t0_parse7E_signed(const unsigned char **p)
#define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
#define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
static const uint8_t t0_datablock[]; /* static const unsigned char t0_datablock[]; */
void br_skey_decoder_init_main(void *t0ctx); void br_skey_decoder_init_main(void *t0ctx);
@ -101,14 +101,14 @@ br_skey_decoder_push(br_skey_decoder_context *ctx,
static const uint8_t t0_datablock[] = { static const unsigned char t0_datablock[] = {
0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x07, 0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x07,
0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x08, 0x2A, 0x86, 0x48, 0xCE,
0x3D, 0x03, 0x01, 0x07, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x05, 0x2B, 0x3D, 0x03, 0x01, 0x07, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x05, 0x2B,
0x81, 0x04, 0x00, 0x23 0x81, 0x04, 0x00, 0x23
}; };
static const uint8_t t0_codeblock[] = { static const unsigned char t0_codeblock[] = {
0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0x00, 0x13, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01, 0x01, 0x08, 0x00, 0x00, 0x13,
0x13, 0x00, 0x00, 0x01, T0_INT1(BR_ERR_X509_BAD_TAG_CLASS), 0x00, 0x00, 0x13, 0x00, 0x00, 0x01, T0_INT1(BR_ERR_X509_BAD_TAG_CLASS), 0x00, 0x00,
0x01, T0_INT1(BR_ERR_X509_BAD_TAG_VALUE), 0x00, 0x00, 0x01, 0x01, T0_INT1(BR_ERR_X509_BAD_TAG_VALUE), 0x00, 0x00, 0x01,

View file

@ -58,7 +58,7 @@ t0_parse7E_signed(const unsigned char **p)
#define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
#define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
static const uint8_t t0_datablock[]; /* static const unsigned char t0_datablock[]; */
void br_x509_decoder_init_main(void *t0ctx); void br_x509_decoder_init_main(void *t0ctx);
@ -110,7 +110,7 @@ br_x509_decoder_push(br_x509_decoder_context *ctx,
static const uint8_t t0_datablock[] = { static const unsigned char t0_datablock[] = {
0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x09, 0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x09, 0x2A, 0x86, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x09, 0x2A, 0x86,
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0E, 0x09, 0x2A, 0x86, 0x48, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0E, 0x09, 0x2A, 0x86, 0x48, 0x86,
@ -129,7 +129,7 @@ static const uint8_t t0_datablock[] = {
0x29, 0xFF, 0x03, 0x55, 0x1D, 0x13 0x29, 0xFF, 0x03, 0x55, 0x1D, 0x13
}; };
static const uint8_t t0_codeblock[] = { static const unsigned char t0_codeblock[] = {
0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x01,
0x01, 0x09, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x1A, 0x1A, 0x00, 0x01, 0x09, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x1A, 0x1A, 0x00,
0x00, 0x01, T0_INT1(BR_ERR_X509_BAD_BOOLEAN), 0x00, 0x00, 0x01, 0x00, 0x01, T0_INT1(BR_ERR_X509_BAD_BOOLEAN), 0x00, 0x00, 0x01,

View file

@ -58,7 +58,7 @@ t0_parse7E_signed(const unsigned char **p)
#define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
#define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
static const uint8_t t0_datablock[]; /* static const unsigned char t0_datablock[]; */
void br_x509_minimal_init_main(void *t0ctx); void br_x509_minimal_init_main(void *t0ctx);
@ -392,55 +392,6 @@ eqbigint(const unsigned char *b1, size_t len1,
return memcmp(b1, b2, len1) == 0; return memcmp(b1, b2, len1) == 0;
} }
/*
* Verify the signature on the certificate with the provided public key.
* This function checks the public key type with regards to the expected
* type. Returned value is either 0 on success, or a non-zero error code.
*/
static int
verify_signature(br_x509_minimal_context *ctx, const br_x509_pkey *pk)
{
int kt;
kt = ctx->cert_signer_key_type;
if ((pk->key_type & 0x0F) != kt) {
return BR_ERR_X509_WRONG_KEY_TYPE;
}
switch (kt) {
unsigned char tmp[64];
case BR_KEYTYPE_RSA:
if (ctx->irsa == 0) {
return BR_ERR_X509_UNSUPPORTED;
}
if (!ctx->irsa(ctx->cert_sig, ctx->cert_sig_len,
&t0_datablock[ctx->cert_sig_hash_oid],
ctx->cert_sig_hash_len, &pk->key.rsa, tmp))
{
return BR_ERR_X509_BAD_SIGNATURE;
}
if (memcmp(ctx->tbs_hash, tmp, ctx->cert_sig_hash_len) != 0) {
return BR_ERR_X509_BAD_SIGNATURE;
}
return 0;
case BR_KEYTYPE_EC:
if (ctx->iecdsa == 0) {
return BR_ERR_X509_UNSUPPORTED;
}
if (!ctx->iecdsa(ctx->iec, ctx->tbs_hash,
ctx->cert_sig_hash_len, &pk->key.ec,
ctx->cert_sig, ctx->cert_sig_len))
{
return BR_ERR_X509_BAD_SIGNATURE;
}
return 0;
default:
return BR_ERR_X509_UNSUPPORTED;
}
}
/* /*
* Compare two strings for equality, in a case-insensitive way. This * Compare two strings for equality, in a case-insensitive way. This
* function handles casing only for ASCII letters. * function handles casing only for ASCII letters.
@ -470,9 +421,12 @@ eqnocase(const void *s1, const void *s2, size_t len)
return 1; return 1;
} }
static int verify_signature(br_x509_minimal_context *ctx,
const br_x509_pkey *pk);
static const uint8_t t0_datablock[] = {
static const unsigned char t0_datablock[] = {
0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x09, 0x00, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x09, 0x2A, 0x86, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x09, 0x2A, 0x86,
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0E, 0x09, 0x2A, 0x86, 0x48, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0E, 0x09, 0x2A, 0x86, 0x48, 0x86,
@ -499,7 +453,7 @@ static const uint8_t t0_datablock[] = {
0x01, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0B 0x01, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0B
}; };
static const uint8_t t0_codeblock[] = { static const unsigned char t0_codeblock[] = {
0x00, 0x01, 0x00, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01,
0x00, 0x11, 0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x01, 0x01, 0x09, 0x00, 0x00, 0x01, 0x01, 0x0A,
0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x01,
@ -1704,3 +1658,56 @@ t0_exit:
((t0_context *)t0ctx)->rp = rp; ((t0_context *)t0ctx)->rp = rp;
((t0_context *)t0ctx)->ip = ip; ((t0_context *)t0ctx)->ip = ip;
} }
/*
* Verify the signature on the certificate with the provided public key.
* This function checks the public key type with regards to the expected
* type. Returned value is either 0 on success, or a non-zero error code.
*/
static int
verify_signature(br_x509_minimal_context *ctx, const br_x509_pkey *pk)
{
int kt;
kt = ctx->cert_signer_key_type;
if ((pk->key_type & 0x0F) != kt) {
return BR_ERR_X509_WRONG_KEY_TYPE;
}
switch (kt) {
unsigned char tmp[64];
case BR_KEYTYPE_RSA:
if (ctx->irsa == 0) {
return BR_ERR_X509_UNSUPPORTED;
}
if (!ctx->irsa(ctx->cert_sig, ctx->cert_sig_len,
&t0_datablock[ctx->cert_sig_hash_oid],
ctx->cert_sig_hash_len, &pk->key.rsa, tmp))
{
return BR_ERR_X509_BAD_SIGNATURE;
}
if (memcmp(ctx->tbs_hash, tmp, ctx->cert_sig_hash_len) != 0) {
return BR_ERR_X509_BAD_SIGNATURE;
}
return 0;
case BR_KEYTYPE_EC:
if (ctx->iecdsa == 0) {
return BR_ERR_X509_UNSUPPORTED;
}
if (!ctx->iecdsa(ctx->iec, ctx->tbs_hash,
ctx->cert_sig_hash_len, &pk->key.ec,
ctx->cert_sig, ctx->cert_sig_len))
{
return BR_ERR_X509_BAD_SIGNATURE;
}
return 0;
default:
return BR_ERR_X509_UNSUPPORTED;
}
}

View file

@ -341,6 +341,42 @@ eqbigint(const unsigned char *b1, size_t len1,
return memcmp(b1, b2, len1) == 0; return memcmp(b1, b2, len1) == 0;
} }
/*
* Compare two strings for equality, in a case-insensitive way. This
* function handles casing only for ASCII letters.
*/
static int
eqnocase(const void *s1, const void *s2, size_t len)
{
const unsigned char *buf1, *buf2;
buf1 = s1;
buf2 = s2;
while (len -- > 0) {
int x1, x2;
x1 = *buf1 ++;
x2 = *buf2 ++;
if (x1 >= 'A' && x1 <= 'Z') {
x1 += 'a' - 'A';
}
if (x2 >= 'A' && x2 <= 'Z') {
x2 += 'a' - 'A';
}
if (x1 != x2) {
return 0;
}
}
return 1;
}
static int verify_signature(br_x509_minimal_context *ctx,
const br_x509_pkey *pk);
}
postamble {
/* /*
* Verify the signature on the certificate with the provided public key. * Verify the signature on the certificate with the provided public key.
* This function checks the public key type with regards to the expected * This function checks the public key type with regards to the expected
@ -390,35 +426,6 @@ verify_signature(br_x509_minimal_context *ctx, const br_x509_pkey *pk)
} }
} }
/*
* Compare two strings for equality, in a case-insensitive way. This
* function handles casing only for ASCII letters.
*/
static int
eqnocase(const void *s1, const void *s2, size_t len)
{
const unsigned char *buf1, *buf2;
buf1 = s1;
buf2 = s2;
while (len -- > 0) {
int x1, x2;
x1 = *buf1 ++;
x2 = *buf2 ++;
if (x1 >= 'A' && x1 <= 'Z') {
x1 += 'a' - 'A';
}
if (x2 >= 'A' && x2 <= 'Z') {
x2 += 'a' - 'A';
}
if (x1 != x2) {
return 0;
}
}
return 1;
}
} }
cc: read8-low ( -- x ) { cc: read8-low ( -- x ) {

View file

@ -27,6 +27,12 @@
#include <string.h> #include <string.h>
#include <stdint.h> #include <stdint.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
#include "bearssl.h" #include "bearssl.h"
#define STR(x) STR_(x) #define STR(x) STR_(x)
@ -1976,10 +1982,59 @@ test_name_extraction(void)
} }
int int
main(void) main(int argc, const char *argv[])
{ {
size_t u; size_t u;
#ifdef SRCDIRNAME
/*
* We want to change the current directory to that of the
* executable, so that test files are reliably located. We
* do that only if SRCDIRNAME is defined (old Makefile would
* not do that).
*/
if (argc >= 1) {
const char *arg, *c;
arg = argv[0];
for (c = arg + strlen(arg);; c --) {
int sep, r;
#ifdef _WIN32
sep = (*c == '/') || (*c == '\\');
#else
sep = (*c == '/');
#endif
if (sep) {
size_t len;
char *dn;
len = 1 + (c - arg);
dn = xmalloc(len + 1);
memcpy(dn, arg, len);
dn[len] = 0;
#ifdef _WIN32
r = _chdir(dn);
#else
r = chdir(dn);
#endif
if (r != 0) {
fprintf(stderr, "warning: could not"
" set directory to '%s'\n", dn);
}
xfree(dn);
break;
}
if (c == arg) {
break;
}
}
}
#else
(void)argc;
(void)argv;
#endif
process_conf_file(CONFFILE); process_conf_file(CONFFILE);
max_dp_usage = 0; max_dp_usage = 0;

View file

@ -28,8 +28,16 @@
#include <stdint.h> #include <stdint.h>
#include <errno.h> #include <errno.h>
/*
* Network stuff on Windows requires some specific code.
*/
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
#endif
#include "brssl.h" #include "brssl.h"
#include "bearssl.h"
static void static void
usage(void) usage(void)
@ -53,6 +61,18 @@ main(int argc, char *argv[])
usage(); usage();
return EXIT_FAILURE; return EXIT_FAILURE;
} }
#ifdef _WIN32
{
WSADATA wd;
int r;
r = WSAStartup(MAKEWORD(2, 2), &wd);
if (r != 0) {
fprintf(stderr, "WARNING: network initialisation"
" failed (WSAStartup() returned %d)\n", r);
}
}
#endif
cmd = argv[1]; cmd = argv[1];
if (eqstr(cmd, "client")) { if (eqstr(cmd, "client")) {
if (do_client(argc - 2, argv + 2) < 0) { if (do_client(argc - 2, argv + 2) < 0) {

View file

@ -475,13 +475,17 @@ const char *find_error_name(int err, const char **comment);
* Run a SSL engine, with a socket connected to the peer, and using * Run a SSL engine, with a socket connected to the peer, and using
* stdin/stdout to exchange application data. * stdin/stdout to exchange application data.
* *
* To help with Win32 compatibility, the socket descriptor is provided
* as an "unsigned long" value.
*
* Returned value: * Returned value:
* 0 SSL connection closed successfully * 0 SSL connection closed successfully
* x > 0 SSL error "x" * x > 0 SSL error "x"
* -1 early socket close * -1 early socket close
* -2 stdout was closed, or something failed badly * -2 stdout was closed, or something failed badly
*/ */
int run_ssl_engine(br_ssl_engine_context *eng, int fd, unsigned flags); int run_ssl_engine(br_ssl_engine_context *eng,
unsigned long fd, unsigned flags);
#define RUN_ENGINE_VERBOSE 0x0001 /* enable verbose messages */ #define RUN_ENGINE_VERBOSE 0x0001 /* enable verbose messages */
#define RUN_ENGINE_TRACE 0x0002 /* hex dump of records */ #define RUN_ENGINE_TRACE 0x0002 /* hex dump of records */

View file

@ -29,6 +29,10 @@
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netdb.h> #include <netdb.h>
@ -37,14 +41,17 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#define SOCKET int
#define INVALID_SOCKET (-1)
#endif
#include "brssl.h" #include "brssl.h"
#include "bearssl.h"
static int static int
host_connect(const char *host, const char *port, int verbose) host_connect(const char *host, const char *port, int verbose)
{ {
struct addrinfo hints, *si, *p; struct addrinfo hints, *si, *p;
int fd; SOCKET fd;
int err; int err;
memset(&hints, 0, sizeof hints); memset(&hints, 0, sizeof hints);
@ -54,9 +61,9 @@ host_connect(const char *host, const char *port, int verbose)
if (err != 0) { if (err != 0) {
fprintf(stderr, "ERROR: getaddrinfo(): %s\n", fprintf(stderr, "ERROR: getaddrinfo(): %s\n",
gai_strerror(err)); gai_strerror(err));
return -1; return INVALID_SOCKET;
} }
fd = -1; fd = INVALID_SOCKET;
for (p = si; p != NULL; p = p->ai_next) { for (p = si; p != NULL; p = p->ai_next) {
if (verbose) { if (verbose) {
struct sockaddr *sa; struct sockaddr *sa;
@ -84,17 +91,21 @@ host_connect(const char *host, const char *port, int verbose)
fprintf(stderr, "connecting to: %s\n", tmp); fprintf(stderr, "connecting to: %s\n", tmp);
} }
fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol); fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if (fd < 0) { if (fd == INVALID_SOCKET) {
if (verbose) { if (verbose) {
perror("socket()"); perror("socket()");
} }
continue; continue;
} }
if (connect(fd, p->ai_addr, p->ai_addrlen) < 0) { if (connect(fd, p->ai_addr, p->ai_addrlen) == INVALID_SOCKET) {
if (verbose) { if (verbose) {
perror("connect()"); perror("connect()");
} }
#ifdef _WIN32
closesocket(fd);
#else
close(fd); close(fd);
#endif
continue; continue;
} }
break; break;
@ -102,7 +113,7 @@ host_connect(const char *host, const char *port, int verbose)
if (p == NULL) { if (p == NULL) {
freeaddrinfo(si); freeaddrinfo(si);
fprintf(stderr, "ERROR: failed to connect\n"); fprintf(stderr, "ERROR: failed to connect\n");
return -1; return INVALID_SOCKET;
} }
freeaddrinfo(si); freeaddrinfo(si);
if (verbose) { if (verbose) {
@ -111,9 +122,18 @@ host_connect(const char *host, const char *port, int verbose)
/* /*
* We make the socket non-blocking, since we are going to use * We make the socket non-blocking, since we are going to use
* poll() to organise I/O. * poll() or select() to organise I/O.
*/ */
#ifdef _WIN32
{
u_long arg;
arg = 1;
ioctlsocket(fd, FIONBIO, &arg);
}
#else
fcntl(fd, F_SETFL, O_NONBLOCK); fcntl(fd, F_SETFL, O_NONBLOCK);
#endif
return fd; return fd;
} }
@ -494,7 +514,7 @@ do_client(int argc, char *argv[])
const char *sni; const char *sni;
anchor_list anchors = VEC_INIT; anchor_list anchors = VEC_INIT;
unsigned vmin, vmax; unsigned vmin, vmax;
VECTOR(const char *) alpn_names = VEC_INIT; VECTOR(char *) alpn_names = VEC_INIT;
cipher_suite *suites; cipher_suite *suites;
size_t num_suites; size_t num_suites;
uint16_t *suite_ids; uint16_t *suite_ids;
@ -514,7 +534,7 @@ do_client(int argc, char *argv[])
size_t minhello_len; size_t minhello_len;
int fallback; int fallback;
uint32_t flags; uint32_t flags;
int fd; SOCKET fd;
retcode = 0; retcode = 0;
verbose = 1; verbose = 1;
@ -539,7 +559,7 @@ do_client(int argc, char *argv[])
minhello_len = (size_t)-1; minhello_len = (size_t)-1;
fallback = 0; fallback = 0;
flags = 0; flags = 0;
fd = -1; fd = INVALID_SOCKET;
for (i = 0; i < argc; i ++) { for (i = 0; i < argc; i ++) {
const char *arg; const char *arg;
@ -1031,7 +1051,8 @@ do_client(int argc, char *argv[])
br_ssl_engine_set_all_flags(&cc.eng, flags); br_ssl_engine_set_all_flags(&cc.eng, flags);
if (VEC_LEN(alpn_names) != 0) { if (VEC_LEN(alpn_names) != 0) {
br_ssl_engine_set_protocol_names(&cc.eng, br_ssl_engine_set_protocol_names(&cc.eng,
&VEC_ELT(alpn_names, 0), VEC_LEN(alpn_names)); (const char **)&VEC_ELT(alpn_names, 0),
VEC_LEN(alpn_names));
} }
if (chain != NULL) { if (chain != NULL) {
@ -1055,15 +1076,17 @@ do_client(int argc, char *argv[])
br_ssl_client_reset(&cc, sni, 0); br_ssl_client_reset(&cc, sni, 0);
/* /*
* We need to avoid SIGPIPE. * On Unix systems, we need to avoid SIGPIPE.
*/ */
#ifndef _WIN32
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
#endif
/* /*
* Connect to the peer. * Connect to the peer.
*/ */
fd = host_connect(host, port, verbose); fd = host_connect(host, port, verbose);
if (fd < 0) { if (fd == INVALID_SOCKET) {
goto client_exit_error; goto client_exit_error;
} }
@ -1092,8 +1115,12 @@ client_exit:
free_certificates(chain, chain_len); free_certificates(chain, chain_len);
free_private_key(sk); free_private_key(sk);
xfree(iobuf); xfree(iobuf);
if (fd >= 0) { if (fd != INVALID_SOCKET) {
#ifdef _WIN32
closesocket(fd);
#else
close(fd); close(fd);
#endif
} }
return retcode; return retcode;

View file

@ -29,6 +29,10 @@
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netdb.h> #include <netdb.h>
@ -37,14 +41,18 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include "brssl.h" #define SOCKET int
#include "bearssl.h" #define INVALID_SOCKET (-1)
#define SOCKADDR_STORAGE struct sockaddr_storage
#endif
static int #include "brssl.h"
static SOCKET
host_bind(const char *host, const char *port, int verbose) host_bind(const char *host, const char *port, int verbose)
{ {
struct addrinfo hints, *si, *p; struct addrinfo hints, *si, *p;
int fd; SOCKET fd;
int err; int err;
memset(&hints, 0, sizeof hints); memset(&hints, 0, sizeof hints);
@ -54,9 +62,9 @@ host_bind(const char *host, const char *port, int verbose)
if (err != 0) { if (err != 0) {
fprintf(stderr, "ERROR: getaddrinfo(): %s\n", fprintf(stderr, "ERROR: getaddrinfo(): %s\n",
gai_strerror(err)); gai_strerror(err));
return -1; return INVALID_SOCKET;
} }
fd = -1; fd = INVALID_SOCKET;
for (p = si; p != NULL; p = p->ai_next) { for (p = si; p != NULL; p = p->ai_next) {
struct sockaddr *sa; struct sockaddr *sa;
struct sockaddr_in sa4; struct sockaddr_in sa4;
@ -102,21 +110,27 @@ host_bind(const char *host, const char *port, int verbose)
fprintf(stderr, "binding to: %s\n", tmp); fprintf(stderr, "binding to: %s\n", tmp);
} }
fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol); fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if (fd < 0) { if (fd == INVALID_SOCKET) {
if (verbose) { if (verbose) {
perror("socket()"); perror("socket()");
} }
continue; continue;
} }
opt = 1; opt = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt); setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
(void *)&opt, sizeof opt);
opt = 0; opt = 0;
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof opt); setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
(void *)&opt, sizeof opt);
if (bind(fd, sa, sa_len) < 0) { if (bind(fd, sa, sa_len) < 0) {
if (verbose) { if (verbose) {
perror("bind()"); perror("bind()");
} }
#ifdef _WIN32
closesocket(fd);
#else
close(fd); close(fd);
#endif
continue; continue;
} }
break; break;
@ -124,15 +138,19 @@ host_bind(const char *host, const char *port, int verbose)
if (p == NULL) { if (p == NULL) {
freeaddrinfo(si); freeaddrinfo(si);
fprintf(stderr, "ERROR: failed to bind\n"); fprintf(stderr, "ERROR: failed to bind\n");
return -1; return INVALID_SOCKET;
} }
freeaddrinfo(si); freeaddrinfo(si);
if (listen(fd, 5) < 0) { if (listen(fd, 5) < 0) {
if (verbose) { if (verbose) {
perror("listen()"); perror("listen()");
} }
#ifdef _WIN32
closesocket(fd);
#else
close(fd); close(fd);
return -1; #endif
return INVALID_SOCKET;
} }
if (verbose) { if (verbose) {
fprintf(stderr, "bound.\n"); fprintf(stderr, "bound.\n");
@ -140,27 +158,27 @@ host_bind(const char *host, const char *port, int verbose)
return fd; return fd;
} }
static int static SOCKET
accept_client(int server_fd, int verbose) accept_client(SOCKET server_fd, int verbose)
{ {
int fd; int fd;
struct sockaddr sa; SOCKADDR_STORAGE sa;
socklen_t sa_len; socklen_t sa_len;
sa_len = sizeof sa; sa_len = sizeof sa;
fd = accept(server_fd, &sa, &sa_len); fd = accept(server_fd, (struct sockaddr *)&sa, &sa_len);
if (fd < 0) { if (fd == INVALID_SOCKET) {
if (verbose) { if (verbose) {
perror("accept()"); perror("accept()");
} }
return -1; return INVALID_SOCKET;
} }
if (verbose) { if (verbose) {
char tmp[INET6_ADDRSTRLEN + 50]; char tmp[INET6_ADDRSTRLEN + 50];
const char *name; const char *name;
name = NULL; name = NULL;
switch (sa.sa_family) { switch (((struct sockaddr *)&sa)->sa_family) {
case AF_INET: case AF_INET:
name = inet_ntop(AF_INET, name = inet_ntop(AF_INET,
&((struct sockaddr_in *)&sa)->sin_addr, &((struct sockaddr_in *)&sa)->sin_addr,
@ -173,8 +191,8 @@ accept_client(int server_fd, int verbose)
break; break;
} }
if (name == NULL) { if (name == NULL) {
sprintf(tmp, "<unknown: %lu>", sprintf(tmp, "<unknown: %lu>", (unsigned long)
(unsigned long)sa.sa_family); ((struct sockaddr *)&sa)->sa_family);
name = tmp; name = tmp;
} }
fprintf(stderr, "accepting connection from: %s\n", name); fprintf(stderr, "accepting connection from: %s\n", name);
@ -182,9 +200,18 @@ accept_client(int server_fd, int verbose)
/* /*
* We make the socket non-blocking, since we are going to use * We make the socket non-blocking, since we are going to use
* poll() to organise I/O. * poll() or select() to organise I/O.
*/ */
#ifdef _WIN32
{
u_long arg;
arg = 1;
ioctlsocket(fd, FIONBIO, &arg);
}
#else
fcntl(fd, F_SETFL, O_NONBLOCK); fcntl(fd, F_SETFL, O_NONBLOCK);
#endif
return fd; return fd;
} }
@ -606,7 +633,7 @@ do_server(int argc, char *argv[])
int cert_signer_algo; int cert_signer_algo;
private_key *sk; private_key *sk;
anchor_list anchors = VEC_INIT; anchor_list anchors = VEC_INIT;
VECTOR(const char *) alpn_names = VEC_INIT; VECTOR(char *) alpn_names = VEC_INIT;
br_x509_minimal_context xc; br_x509_minimal_context xc;
const br_hash_class *dnhash; const br_hash_class *dnhash;
size_t u; size_t u;
@ -616,7 +643,7 @@ do_server(int argc, char *argv[])
unsigned char *iobuf, *cache; unsigned char *iobuf, *cache;
size_t iobuf_len, cache_len; size_t iobuf_len, cache_len;
uint32_t flags; uint32_t flags;
int server_fd, fd; SOCKET server_fd, fd;
retcode = 0; retcode = 0;
verbose = 1; verbose = 1;
@ -639,8 +666,8 @@ do_server(int argc, char *argv[])
cache = NULL; cache = NULL;
cache_len = (size_t)-1; cache_len = (size_t)-1;
flags = 0; flags = 0;
server_fd = -1; server_fd = INVALID_SOCKET;
fd = -1; fd = INVALID_SOCKET;
for (i = 0; i < argc; i ++) { for (i = 0; i < argc; i ++) {
const char *arg; const char *arg;
@ -1089,7 +1116,8 @@ do_server(int argc, char *argv[])
if (VEC_LEN(alpn_names) != 0) { if (VEC_LEN(alpn_names) != 0) {
br_ssl_engine_set_protocol_names(&cc.eng, br_ssl_engine_set_protocol_names(&cc.eng,
&VEC_ELT(alpn_names, 0), VEC_LEN(alpn_names)); (const char **)&VEC_ELT(alpn_names, 0),
VEC_LEN(alpn_names));
} }
/* /*
@ -1139,15 +1167,17 @@ do_server(int argc, char *argv[])
br_ssl_engine_set_buffer(&cc.eng, iobuf, iobuf_len, bidi); br_ssl_engine_set_buffer(&cc.eng, iobuf, iobuf_len, bidi);
/* /*
* We need to ignore SIGPIPE. * On Unix systems, we need to ignore SIGPIPE.
*/ */
#ifndef _WIN32
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
#endif
/* /*
* Open the server socket. * Open the server socket.
*/ */
server_fd = host_bind(bind_name, port, verbose); server_fd = host_bind(bind_name, port, verbose);
if (server_fd < 0) { if (server_fd == INVALID_SOCKET) {
goto server_exit_error; goto server_exit_error;
} }
@ -1162,15 +1192,19 @@ do_server(int argc, char *argv[])
int x; int x;
fd = accept_client(server_fd, verbose); fd = accept_client(server_fd, verbose);
if (fd < 0) { if (fd == INVALID_SOCKET) {
goto server_exit_error; goto server_exit_error;
} }
br_ssl_server_reset(&cc); br_ssl_server_reset(&cc);
x = run_ssl_engine(&cc.eng, fd, x = run_ssl_engine(&cc.eng, fd,
(verbose ? RUN_ENGINE_VERBOSE : 0) (verbose ? RUN_ENGINE_VERBOSE : 0)
| (trace ? RUN_ENGINE_TRACE : 0)); | (trace ? RUN_ENGINE_TRACE : 0));
#ifdef _WIN32
closesocket(fd);
#else
close(fd); close(fd);
fd = -1; #endif
fd = INVALID_SOCKET;
if (x < -1) { if (x < -1) {
goto server_exit_error; goto server_exit_error;
} }
@ -1188,8 +1222,12 @@ server_exit:
VEC_CLEAREXT(alpn_names, &free_alpn); VEC_CLEAREXT(alpn_names, &free_alpn);
xfree(iobuf); xfree(iobuf);
xfree(cache); xfree(cache);
if (fd >= 0) { if (fd != INVALID_SOCKET) {
#ifdef _WIN32
closesocket(fd);
#else
close(fd); close(fd);
#endif
} }
return retcode; return retcode;

View file

@ -28,6 +28,10 @@
#include <stdint.h> #include <stdint.h>
#include <errno.h> #include <errno.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netdb.h> #include <netdb.h>
@ -37,8 +41,11 @@
#include <fcntl.h> #include <fcntl.h>
#include <poll.h> #include <poll.h>
#define SOCKET int
#define INVALID_SOCKET (-1)
#endif
#include "brssl.h" #include "brssl.h"
#include "bearssl.h"
static void static void
dump_blob(const char *name, const void *data, size_t len) dump_blob(const char *name, const void *data, size_t len)
@ -134,25 +141,173 @@ run_command(br_ssl_engine_context *cc, unsigned char *buf, size_t len)
} }
} }
#ifdef _WIN32
typedef struct {
unsigned char buf[1024];
size_t ptr, len;
} in_buffer;
static int
in_return_bytes(in_buffer *bb, unsigned char *buf, size_t len)
{
if (bb->ptr < bb->len) {
size_t clen;
if (buf == NULL) {
return 1;
}
clen = bb->len - bb->ptr;
if (clen > len) {
clen = len;
}
memcpy(buf, bb->buf + bb->ptr, clen);
bb->ptr += clen;
if (bb->ptr == bb->len) {
bb->ptr = bb->len = 0;
}
return (int)clen;
}
return 0;
}
/*
* A buffered version of in_read(), using a buffer to return only
* full lines when feasible.
*/
static int
in_read_buffered(HANDLE h_in, in_buffer *bb, unsigned char *buf, size_t len)
{
int n;
if (len == 0) {
return 0;
}
n = in_return_bytes(bb, buf, len);
if (n != 0) {
return n;
}
for (;;) {
INPUT_RECORD inrec;
DWORD v;
if (!PeekConsoleInput(h_in, &inrec, 1, &v)) {
fprintf(stderr, "ERROR: PeekConsoleInput()"
" failed with 0x%08lX\n",
(unsigned long)GetLastError());
return -1;
}
if (v == 0) {
return 0;
}
if (!ReadConsoleInput(h_in, &inrec, 1, &v)) {
fprintf(stderr, "ERROR: ReadConsoleInput()"
" failed with 0x%08lX\n",
(unsigned long)GetLastError());
return -1;
}
if (v == 0) {
return 0;
}
if (inrec.EventType == KEY_EVENT
&& inrec.Event.KeyEvent.bKeyDown)
{
int c;
c = inrec.Event.KeyEvent.uChar.AsciiChar;
if (c == '\n' || c == '\r' || c == '\t'
|| (c >= 32 && c != 127))
{
if (c == '\r') {
c = '\n';
}
bb->buf[bb->ptr ++] = (unsigned char)c;
printf("%c", c);
fflush(stdout);
bb->len = bb->ptr;
if (bb->len == sizeof bb->buf || c == '\n') {
bb->ptr = 0;
return in_return_bytes(bb, buf, len);
}
}
}
}
}
static int
in_avail_buffered(HANDLE h_in, in_buffer *bb)
{
return in_read_buffered(h_in, bb, NULL, 1);
}
#endif
/* see brssl.h */ /* see brssl.h */
int int
run_ssl_engine(br_ssl_engine_context *cc, int fd, unsigned flags) run_ssl_engine(br_ssl_engine_context *cc, unsigned long fd, unsigned flags)
{ {
int hsdetails; int hsdetails;
int retcode; int retcode;
int verbose; int verbose;
int trace; int trace;
#ifdef _WIN32
WSAEVENT fd_event;
int can_send, can_recv;
HANDLE h_in, h_out;
in_buffer bb;
#endif
hsdetails = 0; hsdetails = 0;
retcode = 0; retcode = 0;
verbose = (flags & RUN_ENGINE_VERBOSE) != 0; verbose = (flags & RUN_ENGINE_VERBOSE) != 0;
trace = (flags & RUN_ENGINE_TRACE) != 0; trace = (flags & RUN_ENGINE_TRACE) != 0;
#ifdef _WIN32
fd_event = WSA_INVALID_EVENT;
can_send = 0;
can_recv = 0;
bb.ptr = bb.len = 0;
#endif
/*
* On Unix systems, we need to follow three descriptors:
* standard input (0), standard output (1), and the socket
* itself (for both read and write). This is done with a poll()
* call.
*
* On Windows systems, we use WSAEventSelect() to associate
* an event handle with the network activity, and we use
* WaitForMultipleObjectsEx() on that handle and the standard
* input handle, when appropriate. Standard output is assumed
* to be always writeable, and standard input to be the console;
* this does not work well (or at all) with redirections (to
* pipes or files) but it should be enough for a debug tool
* (TODO: make something that handles redirections as well).
*/
#ifdef _WIN32
fd_event = WSACreateEvent();
if (fd_event == WSA_INVALID_EVENT) {
fprintf(stderr, "ERROR: WSACreateEvent() failed with %d\n",
WSAGetLastError());
retcode = -2;
goto engine_exit;
}
WSAEventSelect(fd, fd_event, FD_READ | FD_WRITE | FD_CLOSE);
h_in = GetStdHandle(STD_INPUT_HANDLE);
h_out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleMode(h_in, ENABLE_ECHO_INPUT
| ENABLE_LINE_INPUT
| ENABLE_PROCESSED_INPUT
| ENABLE_PROCESSED_OUTPUT
| ENABLE_WRAP_AT_EOL_OUTPUT);
#else
/* /*
* Make sure that stdin and stdout are non-blocking. * Make sure that stdin and stdout are non-blocking.
*/ */
fcntl(0, F_SETFL, O_NONBLOCK); fcntl(0, F_SETFL, O_NONBLOCK);
fcntl(1, F_SETFL, O_NONBLOCK); fcntl(1, F_SETFL, O_NONBLOCK);
#endif
/* /*
* Perform the loop. * Perform the loop.
@ -160,9 +315,15 @@ run_ssl_engine(br_ssl_engine_context *cc, int fd, unsigned flags)
for (;;) { for (;;) {
unsigned st; unsigned st;
int sendrec, recvrec, sendapp, recvapp; int sendrec, recvrec, sendapp, recvapp;
#ifdef _WIN32
HANDLE pfd[2];
DWORD wt;
#else
struct pollfd pfd[3]; struct pollfd pfd[3];
int n; int n;
#endif
size_t u, k_fd, k_in, k_out; size_t u, k_fd, k_in, k_out;
int sendrec_ok, recvrec_ok, sendapp_ok, recvapp_ok;
/* /*
* Get current engine state. * Get current engine state.
@ -257,11 +418,74 @@ run_ssl_engine(br_ssl_engine_context *cc, int fd, unsigned flags)
hsdetails = 1; hsdetails = 1;
} }
k_fd = 0; k_fd = (size_t)-1;
k_in = 0; k_in = (size_t)-1;
k_out = 0; k_out = (size_t)-1;
u = 0; u = 0;
#ifdef _WIN32
/*
* If we recorded that we can send or receive data, and we
* want to do exactly that, then we don't wait; we just do
* it.
*/
recvapp_ok = 0;
sendrec_ok = 0;
recvrec_ok = 0;
sendapp_ok = 0;
if (sendrec && can_send) {
sendrec_ok = 1;
} else if (recvrec && can_recv) {
recvrec_ok = 1;
} else if (recvapp) {
recvapp_ok = 1;
} else if (sendapp && in_avail_buffered(h_in, &bb)) {
sendapp_ok = 1;
} else {
/*
* If we cannot do I/O right away, then we must
* wait for some event, and try again.
*/
pfd[u] = (HANDLE)fd_event;
k_fd = u;
u ++;
if (sendapp) {
pfd[u] = h_in;
k_in = u;
u ++;
}
wt = WaitForMultipleObjectsEx(u, pfd,
FALSE, INFINITE, FALSE);
if (wt == WAIT_FAILED) {
fprintf(stderr, "ERROR:"
" WaitForMultipleObjectsEx()"
" failed with 0x%08lX",
(unsigned long)GetLastError());
retcode = -2;
goto engine_exit;
}
if (wt == k_fd) {
WSANETWORKEVENTS e;
if (WSAEnumNetworkEvents(fd, fd_event, &e)) {
fprintf(stderr, "ERROR:"
" WSAEnumNetworkEvents()"
" failed with %d\n",
WSAGetLastError());
retcode = -2;
goto engine_exit;
}
if (e.lNetworkEvents & (FD_WRITE | FD_CLOSE)) {
can_send = 1;
}
if (e.lNetworkEvents & (FD_READ | FD_CLOSE)) {
can_recv = 1;
}
}
continue;
}
#else
if (sendrec || recvrec) { if (sendrec || recvrec) {
pfd[u].fd = fd; pfd[u].fd = fd;
pfd[u].revents = 0; pfd[u].revents = 0;
@ -313,96 +537,142 @@ run_ssl_engine(br_ssl_engine_context *cc, int fd, unsigned flags)
} }
} }
recvapp_ok = recvapp && (pfd[k_out].revents & POLLOUT) != 0;
sendrec_ok = sendrec && (pfd[k_fd].revents & POLLOUT) != 0;
recvrec_ok = recvrec && (pfd[k_fd].revents & POLLIN) != 0;
sendapp_ok = sendapp && (pfd[k_in].revents & POLLIN) != 0;
#endif
/* /*
* We give preference to outgoing data, on stdout and on * We give preference to outgoing data, on stdout and on
* the socket. * the socket.
*/ */
if (recvapp) { if (recvapp_ok) {
if (pfd[k_out].revents & POLLOUT) { unsigned char *buf;
unsigned char *buf; size_t len;
size_t len; #ifdef _WIN32
ssize_t wlen; DWORD wlen;
#else
ssize_t wlen;
#endif
buf = br_ssl_engine_recvapp_buf(cc, &len); buf = br_ssl_engine_recvapp_buf(cc, &len);
wlen = write(1, buf, len); #ifdef _WIN32
if (wlen <= 0) { if (!WriteFile(h_out, buf, len, &wlen, NULL)) {
if (verbose) { if (verbose) {
fprintf(stderr, fprintf(stderr, "stdout closed...\n");
"stdout closed...\n");
}
retcode = -2;
goto engine_exit;
} }
br_ssl_engine_recvapp_ack(cc, wlen); retcode = -2;
continue; goto engine_exit;
} }
#else
wlen = write(1, buf, len);
if (wlen <= 0) {
if (verbose) {
fprintf(stderr, "stdout closed...\n");
}
retcode = -2;
goto engine_exit;
}
#endif
br_ssl_engine_recvapp_ack(cc, wlen);
continue;
} }
if (sendrec) { if (sendrec_ok) {
if (pfd[k_fd].revents & POLLOUT) { unsigned char *buf;
unsigned char *buf; size_t len;
size_t len; int wlen;
ssize_t wlen;
buf = br_ssl_engine_sendrec_buf(cc, &len); buf = br_ssl_engine_sendrec_buf(cc, &len);
wlen = write(fd, buf, len); wlen = send(fd, buf, len, 0);
if (wlen <= 0) { if (wlen <= 0) {
if (verbose) { #ifdef _WIN32
fprintf(stderr, int err;
"socket closed...\n");
} err = WSAGetLastError();
retcode = -1; if (err == EWOULDBLOCK
goto engine_exit; || err == WSAEWOULDBLOCK)
{
can_send = 0;
continue;
} }
if (trace) { #else
dump_blob("Outgoing bytes", buf, wlen); if (errno == EINTR || errno == EWOULDBLOCK) {
continue;
} }
br_ssl_engine_sendrec_ack(cc, wlen); #endif
continue; if (verbose) {
fprintf(stderr, "socket closed...\n");
}
retcode = -1;
goto engine_exit;
} }
if (trace) {
dump_blob("Outgoing bytes", buf, wlen);
}
br_ssl_engine_sendrec_ack(cc, wlen);
continue;
} }
if (recvrec) { if (recvrec_ok) {
if (pfd[k_fd].revents & POLLIN) { unsigned char *buf;
unsigned char *buf; size_t len;
size_t len; int rlen;
ssize_t rlen;
buf = br_ssl_engine_recvrec_buf(cc, &len); buf = br_ssl_engine_recvrec_buf(cc, &len);
rlen = read(fd, buf, len); rlen = recv(fd, buf, len, 0);
if (rlen <= 0) { if (rlen <= 0) {
if (verbose) { #ifdef _WIN32
fprintf(stderr, int err;
"socket closed...\n");
} err = WSAGetLastError();
retcode = -1; if (err == EWOULDBLOCK
goto engine_exit; || err == WSAEWOULDBLOCK)
{
can_recv = 0;
continue;
} }
if (trace) { #else
dump_blob("Incoming bytes", buf, rlen); if (errno == EINTR || errno == EWOULDBLOCK) {
continue;
} }
br_ssl_engine_recvrec_ack(cc, rlen); #endif
continue; if (verbose) {
fprintf(stderr, "socket closed...\n");
}
retcode = -1;
goto engine_exit;
} }
if (trace) {
dump_blob("Incoming bytes", buf, rlen);
}
br_ssl_engine_recvrec_ack(cc, rlen);
continue;
} }
if (sendapp) { if (sendapp_ok) {
if (pfd[k_in].revents & POLLIN) { unsigned char *buf;
unsigned char *buf; size_t len;
size_t len; #ifdef _WIN32
ssize_t rlen; int rlen;
#else
ssize_t rlen;
#endif
buf = br_ssl_engine_sendapp_buf(cc, &len); buf = br_ssl_engine_sendapp_buf(cc, &len);
rlen = read(0, buf, len); #ifdef _WIN32
if (rlen <= 0) { rlen = in_read_buffered(h_in, &bb, buf, len);
if (verbose) { #else
fprintf(stderr, rlen = read(0, buf, len);
"stdin closed...\n"); #endif
} if (rlen <= 0) {
br_ssl_engine_close(cc); if (verbose) {
} else if (!run_command(cc, buf, rlen)) { fprintf(stderr, "stdin closed...\n");
br_ssl_engine_sendapp_ack(cc, rlen);
} }
br_ssl_engine_flush(cc, 0); br_ssl_engine_close(cc);
continue; } else if (!run_command(cc, buf, rlen)) {
br_ssl_engine_sendapp_ack(cc, rlen);
} }
br_ssl_engine_flush(cc, 0);
continue;
} }
/* We should never reach that point. */ /* We should never reach that point. */
@ -415,5 +685,10 @@ run_ssl_engine(br_ssl_engine_context *cc, int fd, unsigned flags)
* Release allocated structures. * Release allocated structures.
*/ */
engine_exit: engine_exit:
#ifdef _WIN32
if (fd_event != WSA_INVALID_EVENT) {
WSACloseEvent(fd_event);
}
#endif
return retcode; return retcode;
} }