summaryrefslogtreecommitdiffstats
path: root/kexgex.c
blob: b0c39c8cbcd5a1c09901a22b037c2033f8122cfb (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
/*
 * Copyright (c) 2000 Niels Provos.  All rights reserved.
 * Copyright (c) 2001 Markus Friedl.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "includes.h"
RCSID("$OpenBSD: kexgex.c,v 1.23 2003/02/16 17:09:57 markus Exp $");

#include <openssl/evp.h>

#include "buffer.h"
#include "bufaux.h"
#include "kex.h"
#include "ssh2.h"

u_char *
kexgex_hash(
    char *client_version_string,
    char *server_version_string,
    char *ckexinit, int ckexinitlen,
    char *skexinit, int skexinitlen,
    u_char *serverhostkeyblob, int sbloblen,
    int min, int wantbits, int max, BIGNUM *prime, BIGNUM *gen,
    BIGNUM *client_dh_pub,
    BIGNUM *server_dh_pub,
    BIGNUM *shared_secret)
{
	Buffer b;
	static u_char digest[EVP_MAX_MD_SIZE];
	const EVP_MD *evp_md = EVP_sha1();
	EVP_MD_CTX md;

	buffer_init(&b);
	buffer_put_cstring(&b, client_version_string);
	buffer_put_cstring(&b, server_version_string);

	/* kexinit messages: fake header: len+SSH2_MSG_KEXINIT */
	buffer_put_int(&b, ckexinitlen+1);
	buffer_put_char(&b, SSH2_MSG_KEXINIT);
	buffer_append(&b, ckexinit, ckexinitlen);
	buffer_put_int(&b, skexinitlen+1);
	buffer_put_char(&b, SSH2_MSG_KEXINIT);
	buffer_append(&b, skexinit, skexinitlen);

	buffer_put_string(&b, serverhostkeyblob, sbloblen);
	if (min == -1 || max == -1)
		buffer_put_int(&b, wantbits);
	else {
		buffer_put_int(&b, min);
		buffer_put_int(&b, wantbits);
		buffer_put_int(&b, max);
	}
	buffer_put_bignum2(&b, prime);
	buffer_put_bignum2(&b, gen);
	buffer_put_bignum2(&b, client_dh_pub);
	buffer_put_bignum2(&b, server_dh_pub);
	buffer_put_bignum2(&b, shared_secret);

#ifdef DEBUG_KEXDH
	buffer_dump(&b);
#endif
	EVP_DigestInit(&md, evp_md);
	EVP_DigestUpdate(&md, buffer_ptr(&b), buffer_len(&b));
	EVP_DigestFinal(&md, digest, NULL);

	buffer_free(&b);

#ifdef DEBUG_KEXDH
	dump_digest("hash", digest, EVP_MD_size(evp_md));
#endif
	return digest;
}
>="$(tput setab 1)" TPUT_BGGREEN="$(tput setab 2)" TPUT_BGYELLOW="$(tput setab 3)" TPUT_BGBLUE="$(tput setab 4)" TPUT_BGPURPLE="$(tput setab 5)" TPUT_BGCYAN="$(tput setab 6)" TPUT_BGWHITE="$(tput setab 7)" TPUT_BOLD="$(tput bold)" TPUT_DIM="$(tput dim)" TPUT_UNDERLINED="$(tput smul)" TPUT_BLINK="$(tput blink)" TPUT_INVERTED="$(tput rev)" TPUT_STANDOUT="$(tput smso)" TPUT_BELL="$(tput bel)" TPUT_CLEAR="$(tput clear)" fi fi return 0 } setup_terminal || echo >/dev/null progress() { echo >&2 " --- ${TPUT_DIM}${TPUT_BOLD}${*}${TPUT_RESET} --- " } run_ok() { printf >&2 "${TPUT_BGGREEN}${TPUT_WHITE}${TPUT_BOLD} OK ${TPUT_RESET} ${*} \n\n" } run_failed() { printf >&2 "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} FAILED ${TPUT_RESET} ${*} \n\n" } ESCAPED_PRINT_METHOD= printf "%q " test >/dev/null 2>&1 [ $? -eq 0 ] && ESCAPED_PRINT_METHOD="printfq" escaped_print() { if [ "${ESCAPED_PRINT_METHOD}" = "printfq" ] then printf "%q " "${@}" else printf "%s" "${*}" fi return 0 } run_logfile="/dev/null" run() { local user="${USER--}" dir="${PWD}" info info_console if [ "${UID}" = "0" ] then info="[root ${dir}]# " info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]# " else info="[${user} ${dir}]$ " info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]$ " fi printf >> "${run_logfile}" "${info}" escaped_print >> "${run_logfile}" "${@}" printf >> "${run_logfile}" " ... " printf >&2 "${info_console}${TPUT_BOLD}${TPUT_YELLOW}" escaped_print >&2 "${@}" printf >&2 "${TPUT_RESET}\n" "${@}" local ret=$? if [ ${ret} -ne 0 ] then run_failed printf >> "${run_logfile}" "FAILED with exit code ${ret}\n" else run_ok printf >> "${run_logfile}" "OK\n" fi return ${ret} } # --------------------------------------------------------------------------------------------------------------------- fatal() { printf >&2 "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} ABORTED ${TPUT_RESET} ${*} \n\n" exit 1 } # --------------------------------------------------------------------------------------------------------------------- if [ "$(uname -m)" != "x86_64" ] then fatal "Static binary versions of netdata are available only for 64bit Intel/AMD CPUs (x86_64), but yours is: $(uname -m)." fi if [ "$(uname -s)" != "Linux" ] then fatal "Static binary versions of netdata are available only for Linux, but this system is $(uname -s)" fi curl="$(which_cmd curl)" wget="$(which_cmd wget)" # --------------------------------------------------------------------------------------------------------------------- progress "Checking the latest version of static build..." BASE='https://raw.githubusercontent.com/firehol/binary-packages/master' LATEST= if [ ! -z "${curl}" -a -x "${curl}" ] then LATEST="$(run ${curl} "${BASE}/netdata-latest.gz.run")" elif [ ! -z "${wget}" -a -x "${wget}" ] then LATEST="$(run ${wget} -O - "${BASE}/netdata-latest.gz.run")" else fatal "curl or wget are needed for this script to work." fi if [ -z "${LATEST}" ] then fatal "Cannot find the latest static binary version of netdata." fi # --------------------------------------------------------------------------------------------------------------------- progress "Downloading static netdata binary: ${LATEST}" ret=1 if [ ! -z "${curl}" -a -x "${curl}" ] then run ${curl} "${BASE}/${LATEST}" >"/tmp/${LATEST}" ret=$? elif [ ! -z "${wget}" -a -x "${wget}" ] then run ${wget} -O "/tmp/${LATEST}" "${BASE}/${LATEST}" ret=$? else fatal "curl or wget are needed for this script to work." fi if [ ${ret} -ne 0 -o ! -s "/tmp/${LATEST}" ] then fatal "Failed to download the latest static binary version of netdata." fi # --------------------------------------------------------------------------------------------------------------------- opts= if [ "${1}" = "--dont-wait" -o "${1}" = "--non-interactive" ] then opts="--accept" fi progress "Installing netdata" sudo= [ "${UID}" != "0" ] && sudo="sudo" run ${sudo} sh "/tmp/${LATEST}" ${opts} if [ $? -eq 0 ] then rm "/tmp/${LATEST}" else echo >&2 "NOTE: did not remove: /tmp/${LATEST}" fi