2014-12-10 21:56:49 +00:00
# This Makefile is for Dropbear SSH Server and Client
# @configure_input@
# invocation:
2019-06-09 20:44:26 +00:00
# make PROGRAMS="dropbear dbclient scp" MULTI=1 SCPPROGRESS=1
2014-12-10 21:56:49 +00:00
#
2019-06-09 20:44:26 +00:00
# to make a multiple-program binary "dropbearmulti".
2014-12-10 21:56:49 +00:00
# This example will include dropbear, scp, dropbearkey, dropbearconvert, and
# dbclient functionality, and includes the progress-bar functionality in scp.
i f n d e f P R O G R A M S
PROGRAMS = dropbear dbclient dropbearkey dropbearconvert
e n d i f
STATIC_LTC = libtomcrypt/libtomcrypt.a
STATIC_LTM = libtommath/libtommath.a
LIBTOM_LIBS = @LIBTOM_LIBS@
i f e q ( @ B U N D L E D _ L I B T O M @ , 1 )
LIBTOM_DEPS = $( STATIC_LTC) $( STATIC_LTM)
2019-06-09 20:44:26 +00:00
LIBTOM_CLEAN = ltc-clean ltm-clean
2014-12-10 21:56:49 +00:00
CFLAGS += -I$( srcdir) /libtomcrypt/src/headers/
2019-06-09 20:44:26 +00:00
LIBTOM_LIBS = $( STATIC_LTC) $( STATIC_LTM)
2014-12-10 21:56:49 +00:00
e n d i f
2019-06-09 20:44:26 +00:00
OPTION_HEADERS = default_options_guard.h sysoptions.h
i f n e q ( $( wildcard localoptions .h ) , )
CFLAGS += -DLOCALOPTIONS_H_EXISTS
OPTION_HEADERS += localoptions.h
e n d i f
COMMONOBJS = dbutil.o buffer.o dbhelpers.o \
2014-12-10 21:56:49 +00:00
dss.o bignum.o \
signkey.o rsa.o dbrandom.o \
queue.o \
atomicio.o compat.o fake-rfc2553.o \
ltc_prng.o ecc.o ecdsa.o crypto_desc.o \
2020-12-28 21:40:37 +00:00
curve25519.o ed25519.o \
2019-06-09 20:44:26 +00:00
dbmalloc.o \
2020-12-28 21:40:37 +00:00
gensignkey.o gendss.o genrsa.o gened25519.o
2014-12-10 21:56:49 +00:00
SVROBJS = svr-kex.o svr-auth.o sshpty.o \
svr-authpasswd.o svr-authpubkey.o svr-authpubkeyoptions.o svr-session.o svr-service.o \
svr-chansession.o svr-runopts.o svr-agentfwd.o svr-main.o svr-x11fwd.o\
svr-tcpfwd.o svr-authpam.o
CLIOBJS = cli-main.o cli-auth.o cli-authpasswd.o cli-kex.o \
cli-session.o cli-runopts.o cli-chansession.o \
cli-authpubkey.o cli-tcpfwd.o cli-channel.o cli-authinteract.o \
2019-06-09 20:44:26 +00:00
cli-agentfwd.o
2014-12-10 21:56:49 +00:00
CLISVROBJS = common-session.o packet.o common-algo.o common-kex.o \
common-channel.o common-chansession.o termcodes.o loginrec.o \
2019-06-09 20:44:26 +00:00
tcp-accept.o listener.o process-packet.o dh_groups.o \
2020-12-28 21:40:37 +00:00
common-runopts.o circbuffer.o list.o netio.o chachapoly.o gcm.o
2014-12-10 21:56:49 +00:00
KEYOBJS = dropbearkey.o
CONVERTOBJS = dropbearconvert.o keyimport.o
SCPOBJS = scp.o progressmeter.o atomicio.o scpmisc.o compat.o
2019-06-09 20:44:26 +00:00
i f e q ( @ D R O P B E A R _ F U Z Z @ , 1 )
allobjs = $( COMMONOBJS) fuzz-common.o fuzz-wrapfd.o $( CLISVROBJS) $( CLIOBJS) $( SVROBJS) @CRYPTLIB@
allobjs:= $( subst svr-main.o, ,$( allobjs) )
allobjs:= $( subst cli-main.o, ,$( allobjs) )
dropbearobjs = $( allobjs) svr-main.o
dbclientobjs = $( allobjs) cli-main.o
dropbearkeyobjs = $( allobjs) $( KEYOBJS)
dropbearconvertobjs = $( allobjs) $( CONVERTOBJS)
# CXX only set when fuzzing
CXX = @CXX@
e l s e
dropbearobjs = $( COMMONOBJS) $( CLISVROBJS) $( SVROBJS)
dbclientobjs = $( COMMONOBJS) $( CLISVROBJS) $( CLIOBJS)
dropbearkeyobjs = $( COMMONOBJS) $( KEYOBJS)
dropbearconvertobjs = $( COMMONOBJS) $( CONVERTOBJS)
scpobjs = $( SCPOBJS)
e n d i f
2014-12-10 21:56:49 +00:00
2020-12-28 21:40:37 +00:00
i f e q ( @ D R O P B E A R _ P L U G I N @ , 1 )
# rdynamic makes all the global symbols of dropbear available to all the loaded shared libraries
# this allow a plugin to reuse existing crypto/utilities like base64_decode/base64_encode without
# the need to rewrite them.
PLUGIN_LIBS = -ldl -rdynamic
e l s e
PLUGIN_LIBS =
e n d i f
2014-12-10 21:56:49 +00:00
VPATH = @srcdir@
srcdir = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
datarootdir = @datarootdir@
bindir = @bindir@
sbindir = @sbindir@
mandir = @mandir@
2019-06-09 20:44:26 +00:00
.DELETE_ON_ERROR :
2014-12-10 21:56:49 +00:00
CC = @CC@
AR = @AR@
RANLIB = @RANLIB@
STRIP = @STRIP@
INSTALL = @INSTALL@
CPPFLAGS = @CPPFLAGS@
CFLAGS += -I. -I$( srcdir) $( CPPFLAGS) @CFLAGS@
LIBS += @LIBS@
LDFLAGS = @LDFLAGS@
EXEEXT = @EXEEXT@
2019-06-09 20:44:26 +00:00
STATIC = @STATIC@
2014-12-10 21:56:49 +00:00
# whether we're building client, server, or both for the common objects.
# evilness so we detect 'dropbear' by itself as a word
i f n e q ( , $( strip $ ( foreach prog , $ ( PROGRAMS ) , $ ( findstring ZdropbearZ , Z $ ( prog ) Z ) ) ) )
CFLAGS += -DDROPBEAR_SERVER
e n d i f
i f n e q ( , $( strip $ ( foreach prog , $ ( PROGRAMS ) , $ ( findstring ZdbclientZ , Z $ ( prog ) Z ) ) ) )
CFLAGS += -DDROPBEAR_CLIENT
e n d i f
# these are exported so that libtomcrypt's makefile will use them
export CC
export CFLAGS
export RANLIB AR STRIP
i f e q ( $( STATIC ) , 1 )
LDFLAGS += -static
e n d i f
i f e q ( $( MULTI ) , 1 )
2019-06-09 20:44:26 +00:00
TARGETS = dropbearmulti$( EXEEXT)
2014-12-10 21:56:49 +00:00
e l s e
TARGETS = $( PROGRAMS)
e n d i f
# for the scp progress meter. The -D doesn't affect anything else.
i f e q ( $( SCPPROGRESS ) , 1 )
CFLAGS += -DPROGRESS_METER
e n d i f
all : $( TARGETS )
2019-06-09 20:44:26 +00:00
# for simplicity assume all source depends on all headers
HEADERS = $( wildcard $( srcdir) /*.h *.h) $( OPTION_HEADERS)
%.o : %.c $( HEADERS )
$( CC) -c $( CFLAGS) $( CPPFLAGS) $< -o $@
default_options_guard.h : default_options .h
@echo Creating $@
@printf "/*\n > > > Do not edit this file (default_options_guard.h) < < <\nGenerated from " $^"\nLocal customisation goes in localoptions.h\n*/\n\n" > $@ .tmp
@$( srcdir) /ifndef_wrapper.sh < $^ >> $@ .tmp
@mv $@ .tmp $@
2014-12-10 21:56:49 +00:00
strip : $( TARGETS )
$( STRIP) $( addsuffix $( EXEEXT) , $( TARGETS) )
install : $( addprefix inst_ , $ ( TARGETS ) )
2019-06-09 20:44:26 +00:00
insmultidropbear : dropbearmulti $( EXEEXT )
2014-12-10 21:56:49 +00:00
$( INSTALL) -d $( DESTDIR) $( sbindir)
-rm -f $( DESTDIR) $( sbindir) /dropbear$( EXEEXT)
-ln -s $( bindir) /dropbearmulti$( EXEEXT) $( DESTDIR) $( sbindir) /dropbear$( EXEEXT)
$( INSTALL) -d $( DESTDIR) $( mandir) /man8
2019-06-09 20:44:26 +00:00
$( INSTALL) -m 644 $( srcdir) /dropbear.8 $( DESTDIR) $( mandir) /man8/dropbear.8
2014-12-10 21:56:49 +00:00
2019-06-09 20:44:26 +00:00
insmulti% : dropbearmulti $( EXEEXT )
2014-12-10 21:56:49 +00:00
$( INSTALL) -d $( DESTDIR) $( bindir)
-rm -f $( DESTDIR) $( bindir) /$* $( EXEEXT)
-ln -s $( bindir) /dropbearmulti$( EXEEXT) $( DESTDIR) $( bindir) /$* $( EXEEXT)
$( INSTALL) -d $( DESTDIR) $( mandir) /man1
2020-12-28 21:40:37 +00:00
if test -e $( srcdir) /$* .1; then $( INSTALL) -m 644 $( srcdir) /$* .1 $( DESTDIR) $( mandir) /man1/$* .1; fi
2014-12-10 21:56:49 +00:00
2019-06-09 20:44:26 +00:00
# dropbear should go in sbin, so it needs a separate rule
2014-12-10 21:56:49 +00:00
inst_dropbear : dropbear
$( INSTALL) -d $( DESTDIR) $( sbindir)
$( INSTALL) dropbear$( EXEEXT) $( DESTDIR) $( sbindir)
$( INSTALL) -d $( DESTDIR) $( mandir) /man8
2019-06-09 20:44:26 +00:00
$( INSTALL) -m 644 $( srcdir) /dropbear.8 $( DESTDIR) $( mandir) /man8/dropbear.8
2014-12-10 21:56:49 +00:00
inst_% : %
$( INSTALL) -d $( DESTDIR) $( bindir)
$( INSTALL) $* $( EXEEXT) $( DESTDIR) $( bindir)
$( INSTALL) -d $( DESTDIR) $( mandir) /man1
2020-12-28 21:40:37 +00:00
if test -e $( srcdir) /$* .1; then $( INSTALL) -m 644 $( srcdir) /$* .1 $( DESTDIR) $( mandir) /man1/$* .1; fi
2014-12-10 21:56:49 +00:00
inst_dropbearmulti : $( addprefix insmulti , $ ( PROGRAMS ) )
# for some reason the rule further down doesn't like $($@objs) as a prereq.
dropbear : $( dropbearobjs )
dbclient : $( dbclientobjs )
dropbearkey : $( dropbearkeyobjs )
dropbearconvert : $( dropbearconvertobjs )
dropbear : $( HEADERS ) $( LIBTOM_DEPS ) Makefile
2020-12-28 21:40:37 +00:00
$( CC) $( LDFLAGS) -o $@ $( EXEEXT) $( $@ objs) $( LIBTOM_LIBS) $( LIBS) @CRYPTLIB@ $( PLUGIN_LIBS)
2014-12-10 21:56:49 +00:00
dbclient : $( HEADERS ) $( LIBTOM_DEPS ) Makefile
$( CC) $( LDFLAGS) -o $@ $( EXEEXT) $( $@ objs) $( LIBTOM_LIBS) $( LIBS)
dropbearkey dropbearconvert : $( HEADERS ) $( LIBTOM_DEPS ) Makefile
2019-06-09 20:44:26 +00:00
$( CC) $( LDFLAGS) -o $@ $( EXEEXT) $( $@ objs) $( LIBTOM_LIBS) $( LIBS)
2014-12-10 21:56:49 +00:00
# scp doesn't use the libs so is special.
scp : $( SCPOBJS ) $( HEADERS ) Makefile
$( CC) $( LDFLAGS) -o $@ $( EXEEXT) $( SCPOBJS)
# multi-binary compilation.
MULTIOBJS =
i f e q ( $( MULTI ) , 1 )
MULTIOBJS = dbmulti.o $( sort $( foreach prog, $( PROGRAMS) , $( $( prog) objs) ) )
CFLAGS += $( addprefix -DDBMULTI_, $( PROGRAMS) ) -DDROPBEAR_MULTI
e n d i f
dropbearmulti$(EXEEXT) : $( HEADERS ) $( MULTIOBJS ) $( LIBTOM_DEPS ) Makefile
$( CC) $( LDFLAGS) -o $@ $( MULTIOBJS) $( LIBTOM_LIBS) $( LIBS) @CRYPTLIB@
multibinary : dropbearmulti $( EXEEXT )
multilink : multibinary $( addprefix link , $ ( PROGRAMS ) )
link% :
-rm -f $* $( EXEEXT)
-ln -s dropbearmulti$( EXEEXT) $* $( EXEEXT)
2019-06-09 20:44:26 +00:00
$(STATIC_LTC) : $( OPTION_HEADERS )
$( MAKE) -C libtomcrypt
2014-12-10 21:56:49 +00:00
2019-06-09 20:44:26 +00:00
$(STATIC_LTM) : $( OPTION_HEADERS )
$( MAKE) -C libtommath
2014-12-10 21:56:49 +00:00
2020-12-28 21:40:37 +00:00
.PHONY : clean sizes thisclean distclean tidy ltc -clean ltm -clean lint
2014-12-10 21:56:49 +00:00
ltc-clean :
2019-06-09 20:44:26 +00:00
$( MAKE) -C libtomcrypt clean
2014-12-10 21:56:49 +00:00
ltm-clean :
2019-06-09 20:44:26 +00:00
$( MAKE) -C libtommath clean
2014-12-10 21:56:49 +00:00
sizes : dropbear
objdump -t dropbear| grep ".text" | cut -d "." -f 2| sort -rn
2019-06-09 20:44:26 +00:00
clean : $( LIBTOM_CLEAN ) thisclean
2014-12-10 21:56:49 +00:00
thisclean :
2019-06-09 20:44:26 +00:00
-rm -f dropbear$( EXEEXT) dbclient$( EXEEXT) dropbearkey$( EXEEXT) \
dropbearconvert$( EXEEXT) scp$( EXEEXT) scp-progress$( EXEEXT) \
dropbearmulti$( EXEEXT) *.o *.da *.bb *.bbg *.prof
2014-12-10 21:56:49 +00:00
distclean : clean tidy
-rm -f config.h
-rm -f Makefile
2019-06-09 20:44:26 +00:00
-rm -f default_options_guard.h
2014-12-10 21:56:49 +00:00
tidy :
-rm -f *~ *.gcov */*~
2019-06-09 20:44:26 +00:00
2020-12-28 21:40:37 +00:00
lint :
cd $( srcdir) ; ./dropbear_lint.sh
2019-06-09 20:44:26 +00:00
## Fuzzing targets
# list of fuzz targets
2020-12-28 21:40:37 +00:00
FUZZ_TARGETS = fuzzer-preauth fuzzer-pubkey fuzzer-verify fuzzer-preauth_nomaths \
fuzzer-kexdh fuzzer-kexecdh fuzzer-kexcurve25519 fuzzer-client fuzzer-client_nomaths
2019-06-09 20:44:26 +00:00
FUZZER_OPTIONS = $( addsuffix .options, $( FUZZ_TARGETS) )
list-fuzz-targets :
@echo $( FUZZ_TARGETS)
# fuzzers that don't use libfuzzer, just a standalone harness that feeds inputs
fuzzstandalone : FUZZLIB =fuzz -harness .o
fuzzstandalone : fuzz -harness .o fuzz -targets
2020-12-28 21:40:37 +00:00
fuzz-harness.o : $( HEADERS ) $( LIBTOM_DEPS ) Makefile $( allobjs ) fuzz -common .o
2019-06-09 20:44:26 +00:00
# build all the fuzzers. This will require fail to link unless built with
# make fuzz-targets FUZZLIB=-lFuzzer.a
# or similar - the library provides main().
fuzz-targets : $( FUZZ_TARGETS ) $( FUZZER_OPTIONS )
2020-12-28 21:40:37 +00:00
fuzzer-preauth : fuzzer -preauth .o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
fuzzer-preauth_nomaths : fuzzer -preauth_nomaths .o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
fuzzer-pubkey : fuzzer -pubkey .o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
fuzzer-verify : fuzzer -verify .o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
2019-06-09 20:44:26 +00:00
2020-12-28 21:40:37 +00:00
fuzzer-kexdh : fuzzer -kexdh .o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
2019-06-09 20:44:26 +00:00
2020-12-28 21:40:37 +00:00
fuzzer-kexecdh : fuzzer -kexecdh .o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
2019-06-09 20:44:26 +00:00
2020-12-28 21:40:37 +00:00
fuzzer-kexcurve25519 : fuzzer -kexcurve 25519.o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
2019-06-09 20:44:26 +00:00
2020-12-28 21:40:37 +00:00
fuzzer-client : fuzzer -client .o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
2019-06-09 20:44:26 +00:00
2020-12-28 21:40:37 +00:00
fuzzer-client_nomaths : fuzzer -client_nomaths .o fuzz -harness .o
$( CXX) $( CXXFLAGS) $@ .o $( LDFLAGS) $( allobjs) -o $@ $( EXEEXT) $( LIBTOM_LIBS) $( LIBS) $( FUZZLIB) @CRYPTLIB@
2019-06-09 20:44:26 +00:00
fuzzer-%.options : Makefile
echo "[libfuzzer]" > $@
echo "max_len = 50000" >> $@
# run this to update hardcoded hostkeys for for fuzzing.
# hostkeys.c is checked in to hg.
fuzz-hostkeys :
dropbearkey -t rsa -f keyr
dropbearkey -t dss -f keyd
dropbearkey -t ecdsa -size 256 -f keye
2020-12-28 21:40:37 +00:00
dropbearkey -t ed25519 -f keyed25519
2019-06-09 20:44:26 +00:00
echo > hostkeys.c
/usr/bin/xxd -i -a keyr >> hostkeys.c
/usr/bin/xxd -i -a keye >> hostkeys.c
/usr/bin/xxd -i -a keyd >> hostkeys.c
2020-12-28 21:40:37 +00:00
/usr/bin/xxd -i -a keyed25519 >> hostkeys.c