summaryrefslogtreecommitdiff
path: root/app-crypt/johntheripper-jumbo/johntheripper-jumbo-9999.ebuild
blob: f1d9d3663e20ae066c71605afdeb167ef242cd1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit autotools shell-completion toolchain-funcs pax-utils

DESCRIPTION="Fast password cracker, community enhanced version"
HOMEPAGE="http://www.openwall.com/john/"

if [[ ${PV} == "9999" ]] ; then
	EGIT_REPO_URI="https://github.com/openwall/john.git"
	EGIT_BRANCH="bleeding-jumbo"
	inherit git-r3
else
	HASH_COMMIT="b27f951a8e191210685c8421c90ca610cdd39dce"
	SRC_URI="https://github.com/openwall/john/archive/${HASH_COMMIT}.tar.gz -> ${P}.tar.gz"
	S="${WORKDIR}/john-${HASH_COMMIT}"
	KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ppc ~ppc64 ~sparc ~x86"
fi

LICENSE="GPL-2"
SLOT="0"

# First matching flag will be used
CPU_FEATURES_MAP=(
	cpu_flags_x86_avx512bw:avx512bw
	cpu_flags_x86_avx512f:avx512f
	cpu_flags_x86_avx2:avx2
	cpu_flags_x86_xop:xop
	cpu_flags_x86_avx:avx
	cpu_flags_x86_sse4_2:sse4.2
	cpu_flags_x86_sse4_1:sse4.1
	cpu_flags_x86_ssse3:ssse3
	cpu_flags_x86_sse2:sse2

	cpu_flags_ppc_altivec:altivec

	cpu_flags_arm_neon:neon
)

IUSE="custom-cflags kerberos mpi opencl openmp pcap test ${CPU_FEATURES_MAP[*]%:*}"

DEPEND="
	>=dev-libs/openssl-1.0.1:=
	virtual/libcrypt:=
	mpi? ( virtual/mpi )
	opencl? ( virtual/opencl )
	kerberos? ( virtual/krb5 )
	pcap? ( net-libs/libpcap )
	dev-libs/gmp:=
	virtual/zlib:=
	app-arch/bzip2
"
# Missing (unpackaged):
# - Digest::Haval256
# - Digest::x
# See bug #777369.
RDEPEND="
	${DEPEND}
	dev-perl/Compress-Raw-Lzma
	dev-perl/Digest-MD2
	dev-perl/Digest-SHA3
	dev-perl/Digest-GOST
	!app-crypt/johntheripper
"
RESTRICT="!test? ( test )"

pkg_pretend() {
	[[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp
}

pkg_setup() {
	[[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp
}

src_prepare() {
	default

	cd src || die
	eautoreconf

	sed -i 's#$prefix/share/john#/etc/john#' configure || die
}

get_enable_simd() {
	local i
	for i in "${CPU_FEATURES_MAP[@]}" ; do
		if use "${i%:*}"; then
			echo "--enable-simd=${i#*:}"
			break
		fi
	done
}

src_configure() {
	cd src || die

	econf \
		--enable-pkg-config \
		--disable-native-march \
		--disable-native-tests \
		--disable-rexgen \
		--with-openssl \
		--with-systemwide \
		$(use_enable mpi) \
		$(use_enable opencl) \
		$(use_enable openmp) \
		$(use_enable pcap) \
		$(get_enable_simd)
}

src_compile() {
	# Uses default LD=$(CC) but if the user's set LD, it'll call it
	# bug #729432.
	emake LD="$(tc-getCC)" -C src
}

src_test() {
	pax-mark -mr run/john

	# Replace system (/etc/john) includes with cwd-relative for tests
	# bug #960245.
	mkdir test || die
	cp -r run/*.conf run/rules test || die
	cd test || die
	local file
	for file in *.conf; do
		sed -E 's/^.include <(.+)>$/.include "\1"/g' -i "$file" || die
	done

	if use opencl; then
		# GPU tests fail in portage, so run cpu only tests
		# Reasons: kernels not in /etc/john/opencl (yet) and sandbox
		../run/john --config=john.conf --device=cpu --test=0 --verbosity=2 || die
	else
		# Weak tests
		../run/john --config=john.conf --test=0 --verbosity=2 || die
		# Strong tests
		#../run/john --config=john.conf --test=1 --verbosity=2 || die
	fi
}

src_install() {
	cd run || die

	# Executables
	dosbin john
	newsbin mailer john-mailer

	pax-mark -mr "${ED}/usr/sbin/john"

	local s
	# find . -maxdepth 1 -type l -lname 'john'
	for s in base64conv gpg2john rar2john unafs undrop unique unshadow zip2john
	do
		dosym john /usr/sbin/${s}
	done

	# find . -maxdepth 1 -type f -executable -name '*2john'
	for s in racf2john hccap2john uaf2john putty2john dmg2john wpapcap2john bitlocker2john keepass2john
	do
		dosbin ${s}
	done

	# Scripts
	exeinto /usr/share/john
	doexe ./*.pl ./*.py
	insinto /usr/share/john
	doins -r lib
	doins ./*.lua

	local s
	for s in *.pl *.py; do
		dosym "../share/john/${s}" "/usr/bin/${s}"
	done

	if use opencl; then
		insinto /etc/john
		doins -r opencl
	fi

	# Config files
	insinto /etc/john
	doins ./*.chr password.lst
	doins ./*.conf
	doins -r rules ztex

	# Completions
	newbashcomp john.bash_completion john
	bashcomp_alias john unique
	newzshcomp john.zsh_completion _john

	cd .. || die

	# Documentation
	rm -f doc/README doc/LICENSE || die
	dodoc -r README.md LICENSE doc/*
}