1971 lines
55 KiB
Diff
1971 lines
55 KiB
Diff
diff -uprN netcat-openbsd-1.130.bk/arc4random.c netcat-openbsd-1.130/arc4random.c
|
|
--- netcat-openbsd-1.130.bk/arc4random.c 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/arc4random.c 2015-12-01 06:48:50.000000000 +0800
|
|
@@ -0,0 +1,212 @@
|
|
+/* $OpenBSD: arc4random.c,v 1.53 2015/09/10 18:53:50 bcook Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (c) 1996, David Mazieres <dm@uun.org>
|
|
+ * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
|
|
+ * Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
|
|
+ * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
|
|
+ * Copyright (c) 2015, Guillem Jover <guillem@hadrons.org>
|
|
+ *
|
|
+ * Permission to use, copy, modify, and distribute this software for any
|
|
+ * purpose with or without fee is hereby granted, provided that the above
|
|
+ * copyright notice and this permission notice appear in all copies.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * ChaCha based random number generator for OpenBSD.
|
|
+ */
|
|
+
|
|
+#include <fcntl.h>
|
|
+#include <limits.h>
|
|
+#include <signal.h>
|
|
+#include <stdint.h>
|
|
+#include <stdlib.h>
|
|
+#include <string.h>
|
|
+#include <unistd.h>
|
|
+#include <sys/types.h>
|
|
+#include <sys/time.h>
|
|
+
|
|
+#define KEYSTREAM_ONLY
|
|
+#include "chacha_private.h"
|
|
+
|
|
+#define minimum(a, b) ((a) < (b) ? (a) : (b))
|
|
+
|
|
+#if defined(__GNUC__) || defined(_MSC_VER)
|
|
+#define inline __inline
|
|
+#else /* __GNUC__ || _MSC_VER */
|
|
+#define inline
|
|
+#endif /* !__GNUC__ && !_MSC_VER */
|
|
+
|
|
+#define KEYSZ 32
|
|
+#define IVSZ 8
|
|
+#define BLOCKSZ 64
|
|
+#define RSBUFSZ (16*BLOCKSZ)
|
|
+
|
|
+/* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */
|
|
+static struct _rs {
|
|
+ size_t rs_have; /* valid bytes at end of rs_buf */
|
|
+ size_t rs_count; /* bytes till reseed */
|
|
+} *rs;
|
|
+
|
|
+/* Maybe be preserved in fork children, if _rs_allocate() decides. */
|
|
+static struct _rsx {
|
|
+ chacha_ctx rs_chacha; /* chacha context for random keystream */
|
|
+ u_char rs_buf[RSBUFSZ]; /* keystream blocks */
|
|
+} *rsx;
|
|
+
|
|
+static inline int _rs_allocate(struct _rs **, struct _rsx **);
|
|
+static inline void _rs_forkdetect(void);
|
|
+#include "arc4random.h"
|
|
+
|
|
+static inline void
|
|
+_rs_init(u_char *buf, size_t n)
|
|
+{
|
|
+ if (n < KEYSZ + IVSZ)
|
|
+ return;
|
|
+
|
|
+ if (rs == NULL) {
|
|
+ if (_rs_allocate(&rs, &rsx) == -1)
|
|
+ abort();
|
|
+ }
|
|
+
|
|
+ chacha_keysetup(&rsx->rs_chacha, buf, KEYSZ * 8, 0);
|
|
+ chacha_ivsetup(&rsx->rs_chacha, buf + KEYSZ);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+_rs_rekey(u_char *dat, size_t datlen)
|
|
+{
|
|
+#ifndef KEYSTREAM_ONLY
|
|
+ memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf));
|
|
+#endif
|
|
+ /* fill rs_buf with the keystream */
|
|
+ chacha_encrypt_bytes(&rsx->rs_chacha, rsx->rs_buf,
|
|
+ rsx->rs_buf, sizeof(rsx->rs_buf));
|
|
+ /* mix in optional user provided data */
|
|
+ if (dat) {
|
|
+ size_t i, m;
|
|
+
|
|
+ m = minimum(datlen, KEYSZ + IVSZ);
|
|
+ for (i = 0; i < m; i++)
|
|
+ rsx->rs_buf[i] ^= dat[i];
|
|
+ }
|
|
+ /* immediately reinit for backtracking resistance */
|
|
+ _rs_init(rsx->rs_buf, KEYSZ + IVSZ);
|
|
+ memset(rsx->rs_buf, 0, KEYSZ + IVSZ);
|
|
+ rs->rs_have = sizeof(rsx->rs_buf) - KEYSZ - IVSZ;
|
|
+}
|
|
+
|
|
+static void
|
|
+_rs_stir(void)
|
|
+{
|
|
+ u_char rnd[KEYSZ + IVSZ];
|
|
+
|
|
+ if (getentropy(rnd, sizeof rnd) == -1)
|
|
+ _getentropy_fail();
|
|
+
|
|
+ if (!rs)
|
|
+ _rs_init(rnd, sizeof(rnd));
|
|
+ else
|
|
+ _rs_rekey(rnd, sizeof(rnd));
|
|
+ explicit_bzero(rnd, sizeof(rnd)); /* discard source seed */
|
|
+
|
|
+ /* invalidate rs_buf */
|
|
+ rs->rs_have = 0;
|
|
+ memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf));
|
|
+
|
|
+ rs->rs_count = 1600000;
|
|
+}
|
|
+
|
|
+static inline void
|
|
+_rs_stir_if_needed(size_t len)
|
|
+{
|
|
+ _rs_forkdetect();
|
|
+ if (!rs || rs->rs_count <= len)
|
|
+ _rs_stir();
|
|
+ if (rs->rs_count <= len)
|
|
+ rs->rs_count = 0;
|
|
+ else
|
|
+ rs->rs_count -= len;
|
|
+}
|
|
+
|
|
+static inline void
|
|
+_rs_random_buf(void *_buf, size_t n)
|
|
+{
|
|
+ u_char *buf = (u_char *)_buf;
|
|
+ u_char *keystream;
|
|
+ size_t m;
|
|
+
|
|
+ _rs_stir_if_needed(n);
|
|
+ while (n > 0) {
|
|
+ if (rs->rs_have > 0) {
|
|
+ m = minimum(n, rs->rs_have);
|
|
+ keystream = rsx->rs_buf + sizeof(rsx->rs_buf)
|
|
+ - rs->rs_have;
|
|
+ memcpy(buf, keystream, m);
|
|
+ memset(keystream, 0, m);
|
|
+ buf += m;
|
|
+ n -= m;
|
|
+ rs->rs_have -= m;
|
|
+ }
|
|
+ if (rs->rs_have == 0)
|
|
+ _rs_rekey(NULL, 0);
|
|
+ }
|
|
+}
|
|
+
|
|
+static inline void
|
|
+_rs_random_u32(uint32_t *val)
|
|
+{
|
|
+ u_char *keystream;
|
|
+
|
|
+ _rs_stir_if_needed(sizeof(*val));
|
|
+ if (rs->rs_have < sizeof(*val))
|
|
+ _rs_rekey(NULL, 0);
|
|
+ keystream = rsx->rs_buf + sizeof(rsx->rs_buf) - rs->rs_have;
|
|
+ memcpy(val, keystream, sizeof(*val));
|
|
+ memset(keystream, 0, sizeof(*val));
|
|
+ rs->rs_have -= sizeof(*val);
|
|
+}
|
|
+
|
|
+void
|
|
+arc4random_stir(void)
|
|
+{
|
|
+ _ARC4_LOCK();
|
|
+ _rs_stir();
|
|
+ _ARC4_UNLOCK();
|
|
+}
|
|
+
|
|
+void
|
|
+arc4random_addrandom(u_char *dat, int datlen)
|
|
+{
|
|
+ _ARC4_LOCK();
|
|
+ _rs_stir_if_needed(datlen);
|
|
+ _rs_rekey(dat, datlen);
|
|
+ _ARC4_UNLOCK();
|
|
+}
|
|
+
|
|
+uint32_t
|
|
+arc4random(void)
|
|
+{
|
|
+ uint32_t val;
|
|
+
|
|
+ _ARC4_LOCK();
|
|
+ _rs_random_u32(&val);
|
|
+ _ARC4_UNLOCK();
|
|
+ return val;
|
|
+}
|
|
+
|
|
+void
|
|
+arc4random_buf(void *buf, size_t n)
|
|
+{
|
|
+ _ARC4_LOCK();
|
|
+ _rs_random_buf(buf, n);
|
|
+ _ARC4_UNLOCK();
|
|
+}
|
|
diff -uprN netcat-openbsd-1.130.bk/arc4random.h netcat-openbsd-1.130/arc4random.h
|
|
--- netcat-openbsd-1.130.bk/arc4random.h 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/arc4random.h 2017-04-13 23:40:06.758504400 +0800
|
|
@@ -0,0 +1,37 @@
|
|
+/*
|
|
+ * Copyright © 2015 Guillem Jover <guillem@hadrons.org>
|
|
+ *
|
|
+ * 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.
|
|
+ * 3. The name of the author may not be used to endorse or promote products
|
|
+ * derived from this software without specific prior written permission.
|
|
+ *
|
|
+ * THIS SOFTWARE IS PROVIDED ``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.
|
|
+ */
|
|
+
|
|
+#ifndef LIBBSD_ARC4RANDOM_H
|
|
+#define LIBBSD_ARC4RANDOM_H
|
|
+
|
|
+#include <sys/param.h>
|
|
+
|
|
+int
|
|
+getentropy(void *buf, size_t len);
|
|
+
|
|
+#include "arc4random_unix.h"
|
|
+
|
|
+#endif
|
|
diff -uprN netcat-openbsd-1.130.bk/arc4random_unix.h netcat-openbsd-1.130/arc4random_unix.h
|
|
--- netcat-openbsd-1.130.bk/arc4random_unix.h 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/arc4random_unix.h 2015-12-02 10:03:25.000000000 +0800
|
|
@@ -0,0 +1,92 @@
|
|
+/* $OpenBSD: arc4random_linux.h,v 1.8 2014/08/13 06:04:10 deraadt Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (c) 1996, David Mazieres <dm@uun.org>
|
|
+ * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
|
|
+ * Copyright (c) 2013, Markus Friedl <markus@openbsd.org>
|
|
+ * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
|
|
+ *
|
|
+ * Permission to use, copy, modify, and distribute this software for any
|
|
+ * purpose with or without fee is hereby granted, provided that the above
|
|
+ * copyright notice and this permission notice appear in all copies.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * Stub functions for portability.
|
|
+ */
|
|
+
|
|
+#include <sys/mman.h>
|
|
+
|
|
+#include <pthread.h>
|
|
+#include <signal.h>
|
|
+
|
|
+static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
|
|
+#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx)
|
|
+#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx)
|
|
+
|
|
+#ifdef __GLIBC__
|
|
+extern void *__dso_handle;
|
|
+extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *);
|
|
+#define _ARC4_ATFORK(f) __register_atfork(NULL, NULL, (f), __dso_handle)
|
|
+#else
|
|
+/*
|
|
+ * Unfortunately, pthread_atfork() is broken on FreeBSD (at least 9 and 10) if
|
|
+ * a program does not link to -lthr. Callbacks registered with pthread_atfork()
|
|
+ * appear to fail silently. So, it is not always possible to detect a PID
|
|
+ * wraparound.
|
|
+ */
|
|
+#define _ARC4_ATFORK(f) pthread_atfork(NULL, NULL, (f))
|
|
+#endif
|
|
+
|
|
+static inline void
|
|
+_getentropy_fail(void)
|
|
+{
|
|
+ raise(SIGKILL);
|
|
+}
|
|
+
|
|
+static volatile sig_atomic_t _rs_forked;
|
|
+
|
|
+static inline void
|
|
+_rs_forkhandler(void)
|
|
+{
|
|
+ _rs_forked = 1;
|
|
+}
|
|
+
|
|
+static inline void
|
|
+_rs_forkdetect(void)
|
|
+{
|
|
+ static pid_t _rs_pid = 0;
|
|
+ pid_t pid = getpid();
|
|
+
|
|
+ if (_rs_pid == 0 || _rs_pid != pid || _rs_forked) {
|
|
+ _rs_pid = pid;
|
|
+ _rs_forked = 0;
|
|
+ if (rs)
|
|
+ memset(rs, 0, sizeof(*rs));
|
|
+ }
|
|
+}
|
|
+
|
|
+static inline int
|
|
+_rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
|
|
+{
|
|
+ if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE,
|
|
+ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
|
|
+ return (-1);
|
|
+
|
|
+ if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE,
|
|
+ MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
|
|
+ munmap(*rsp, sizeof(**rsp));
|
|
+ return (-1);
|
|
+ }
|
|
+
|
|
+ _ARC4_ATFORK(_rs_forkhandler);
|
|
+ return (0);
|
|
+}
|
|
diff -uprN netcat-openbsd-1.130.bk/chacha_private.h netcat-openbsd-1.130/chacha_private.h
|
|
--- netcat-openbsd-1.130.bk/chacha_private.h 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/chacha_private.h 2015-12-01 06:48:50.000000000 +0800
|
|
@@ -0,0 +1,222 @@
|
|
+/*
|
|
+chacha-merged.c version 20080118
|
|
+D. J. Bernstein
|
|
+Public domain.
|
|
+*/
|
|
+
|
|
+/* $OpenBSD$ */
|
|
+
|
|
+typedef unsigned char u8;
|
|
+typedef unsigned int u32;
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ u32 input[16]; /* could be compressed */
|
|
+} chacha_ctx;
|
|
+
|
|
+#define U8C(v) (v##U)
|
|
+#define U32C(v) (v##U)
|
|
+
|
|
+#define U8V(v) ((u8)(v) & U8C(0xFF))
|
|
+#define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF))
|
|
+
|
|
+#define ROTL32(v, n) \
|
|
+ (U32V((v) << (n)) | ((v) >> (32 - (n))))
|
|
+
|
|
+#define U8TO32_LITTLE(p) \
|
|
+ (((u32)((p)[0]) ) | \
|
|
+ ((u32)((p)[1]) << 8) | \
|
|
+ ((u32)((p)[2]) << 16) | \
|
|
+ ((u32)((p)[3]) << 24))
|
|
+
|
|
+#define U32TO8_LITTLE(p, v) \
|
|
+ do { \
|
|
+ (p)[0] = U8V((v) ); \
|
|
+ (p)[1] = U8V((v) >> 8); \
|
|
+ (p)[2] = U8V((v) >> 16); \
|
|
+ (p)[3] = U8V((v) >> 24); \
|
|
+ } while (0)
|
|
+
|
|
+#define ROTATE(v,c) (ROTL32(v,c))
|
|
+#define XOR(v,w) ((v) ^ (w))
|
|
+#define PLUS(v,w) (U32V((v) + (w)))
|
|
+#define PLUSONE(v) (PLUS((v),1))
|
|
+
|
|
+#define QUARTERROUND(a,b,c,d) \
|
|
+ a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \
|
|
+ c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \
|
|
+ a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \
|
|
+ c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
|
|
+
|
|
+static const char sigma[16] = "expand 32-byte k";
|
|
+static const char tau[16] = "expand 16-byte k";
|
|
+
|
|
+static void
|
|
+chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits,u32 ivbits)
|
|
+{
|
|
+ const char *constants;
|
|
+
|
|
+ x->input[4] = U8TO32_LITTLE(k + 0);
|
|
+ x->input[5] = U8TO32_LITTLE(k + 4);
|
|
+ x->input[6] = U8TO32_LITTLE(k + 8);
|
|
+ x->input[7] = U8TO32_LITTLE(k + 12);
|
|
+ if (kbits == 256) { /* recommended */
|
|
+ k += 16;
|
|
+ constants = sigma;
|
|
+ } else { /* kbits == 128 */
|
|
+ constants = tau;
|
|
+ }
|
|
+ x->input[8] = U8TO32_LITTLE(k + 0);
|
|
+ x->input[9] = U8TO32_LITTLE(k + 4);
|
|
+ x->input[10] = U8TO32_LITTLE(k + 8);
|
|
+ x->input[11] = U8TO32_LITTLE(k + 12);
|
|
+ x->input[0] = U8TO32_LITTLE(constants + 0);
|
|
+ x->input[1] = U8TO32_LITTLE(constants + 4);
|
|
+ x->input[2] = U8TO32_LITTLE(constants + 8);
|
|
+ x->input[3] = U8TO32_LITTLE(constants + 12);
|
|
+}
|
|
+
|
|
+static void
|
|
+chacha_ivsetup(chacha_ctx *x,const u8 *iv)
|
|
+{
|
|
+ x->input[12] = 0;
|
|
+ x->input[13] = 0;
|
|
+ x->input[14] = U8TO32_LITTLE(iv + 0);
|
|
+ x->input[15] = U8TO32_LITTLE(iv + 4);
|
|
+}
|
|
+
|
|
+static void
|
|
+chacha_encrypt_bytes(chacha_ctx *x,const u8 *m,u8 *c,u32 bytes)
|
|
+{
|
|
+ u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;
|
|
+ u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
|
|
+ u8 *ctarget = NULL;
|
|
+ u8 tmp[64];
|
|
+ u_int i;
|
|
+
|
|
+ if (!bytes) return;
|
|
+
|
|
+ j0 = x->input[0];
|
|
+ j1 = x->input[1];
|
|
+ j2 = x->input[2];
|
|
+ j3 = x->input[3];
|
|
+ j4 = x->input[4];
|
|
+ j5 = x->input[5];
|
|
+ j6 = x->input[6];
|
|
+ j7 = x->input[7];
|
|
+ j8 = x->input[8];
|
|
+ j9 = x->input[9];
|
|
+ j10 = x->input[10];
|
|
+ j11 = x->input[11];
|
|
+ j12 = x->input[12];
|
|
+ j13 = x->input[13];
|
|
+ j14 = x->input[14];
|
|
+ j15 = x->input[15];
|
|
+
|
|
+ for (;;) {
|
|
+ if (bytes < 64) {
|
|
+ for (i = 0;i < bytes;++i) tmp[i] = m[i];
|
|
+ m = tmp;
|
|
+ ctarget = c;
|
|
+ c = tmp;
|
|
+ }
|
|
+ x0 = j0;
|
|
+ x1 = j1;
|
|
+ x2 = j2;
|
|
+ x3 = j3;
|
|
+ x4 = j4;
|
|
+ x5 = j5;
|
|
+ x6 = j6;
|
|
+ x7 = j7;
|
|
+ x8 = j8;
|
|
+ x9 = j9;
|
|
+ x10 = j10;
|
|
+ x11 = j11;
|
|
+ x12 = j12;
|
|
+ x13 = j13;
|
|
+ x14 = j14;
|
|
+ x15 = j15;
|
|
+ for (i = 20;i > 0;i -= 2) {
|
|
+ QUARTERROUND( x0, x4, x8,x12)
|
|
+ QUARTERROUND( x1, x5, x9,x13)
|
|
+ QUARTERROUND( x2, x6,x10,x14)
|
|
+ QUARTERROUND( x3, x7,x11,x15)
|
|
+ QUARTERROUND( x0, x5,x10,x15)
|
|
+ QUARTERROUND( x1, x6,x11,x12)
|
|
+ QUARTERROUND( x2, x7, x8,x13)
|
|
+ QUARTERROUND( x3, x4, x9,x14)
|
|
+ }
|
|
+ x0 = PLUS(x0,j0);
|
|
+ x1 = PLUS(x1,j1);
|
|
+ x2 = PLUS(x2,j2);
|
|
+ x3 = PLUS(x3,j3);
|
|
+ x4 = PLUS(x4,j4);
|
|
+ x5 = PLUS(x5,j5);
|
|
+ x6 = PLUS(x6,j6);
|
|
+ x7 = PLUS(x7,j7);
|
|
+ x8 = PLUS(x8,j8);
|
|
+ x9 = PLUS(x9,j9);
|
|
+ x10 = PLUS(x10,j10);
|
|
+ x11 = PLUS(x11,j11);
|
|
+ x12 = PLUS(x12,j12);
|
|
+ x13 = PLUS(x13,j13);
|
|
+ x14 = PLUS(x14,j14);
|
|
+ x15 = PLUS(x15,j15);
|
|
+
|
|
+#ifndef KEYSTREAM_ONLY
|
|
+ x0 = XOR(x0,U8TO32_LITTLE(m + 0));
|
|
+ x1 = XOR(x1,U8TO32_LITTLE(m + 4));
|
|
+ x2 = XOR(x2,U8TO32_LITTLE(m + 8));
|
|
+ x3 = XOR(x3,U8TO32_LITTLE(m + 12));
|
|
+ x4 = XOR(x4,U8TO32_LITTLE(m + 16));
|
|
+ x5 = XOR(x5,U8TO32_LITTLE(m + 20));
|
|
+ x6 = XOR(x6,U8TO32_LITTLE(m + 24));
|
|
+ x7 = XOR(x7,U8TO32_LITTLE(m + 28));
|
|
+ x8 = XOR(x8,U8TO32_LITTLE(m + 32));
|
|
+ x9 = XOR(x9,U8TO32_LITTLE(m + 36));
|
|
+ x10 = XOR(x10,U8TO32_LITTLE(m + 40));
|
|
+ x11 = XOR(x11,U8TO32_LITTLE(m + 44));
|
|
+ x12 = XOR(x12,U8TO32_LITTLE(m + 48));
|
|
+ x13 = XOR(x13,U8TO32_LITTLE(m + 52));
|
|
+ x14 = XOR(x14,U8TO32_LITTLE(m + 56));
|
|
+ x15 = XOR(x15,U8TO32_LITTLE(m + 60));
|
|
+#endif
|
|
+
|
|
+ j12 = PLUSONE(j12);
|
|
+ if (!j12) {
|
|
+ j13 = PLUSONE(j13);
|
|
+ /* stopping at 2^70 bytes per nonce is user's responsibility */
|
|
+ }
|
|
+
|
|
+ U32TO8_LITTLE(c + 0,x0);
|
|
+ U32TO8_LITTLE(c + 4,x1);
|
|
+ U32TO8_LITTLE(c + 8,x2);
|
|
+ U32TO8_LITTLE(c + 12,x3);
|
|
+ U32TO8_LITTLE(c + 16,x4);
|
|
+ U32TO8_LITTLE(c + 20,x5);
|
|
+ U32TO8_LITTLE(c + 24,x6);
|
|
+ U32TO8_LITTLE(c + 28,x7);
|
|
+ U32TO8_LITTLE(c + 32,x8);
|
|
+ U32TO8_LITTLE(c + 36,x9);
|
|
+ U32TO8_LITTLE(c + 40,x10);
|
|
+ U32TO8_LITTLE(c + 44,x11);
|
|
+ U32TO8_LITTLE(c + 48,x12);
|
|
+ U32TO8_LITTLE(c + 52,x13);
|
|
+ U32TO8_LITTLE(c + 56,x14);
|
|
+ U32TO8_LITTLE(c + 60,x15);
|
|
+
|
|
+ if (bytes <= 64) {
|
|
+ if (bytes < 64) {
|
|
+ for (i = 0;i < bytes;++i) ctarget[i] = c[i];
|
|
+ }
|
|
+ x->input[12] = j12;
|
|
+ x->input[13] = j13;
|
|
+ return;
|
|
+ }
|
|
+ bytes -= 64;
|
|
+ c += 64;
|
|
+#ifndef KEYSTREAM_ONLY
|
|
+ m += 64;
|
|
+#endif
|
|
+ }
|
|
+}
|
|
diff -uprN netcat-openbsd-1.130.bk/explicit_bzero.c netcat-openbsd-1.130/explicit_bzero.c
|
|
--- netcat-openbsd-1.130.bk/explicit_bzero.c 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/explicit_bzero.c 2015-09-25 10:10:03.000000000 +0800
|
|
@@ -0,0 +1,19 @@
|
|
+/* $OpenBSD: explicit_bzero.c,v 1.3 2014/06/21 02:34:26 matthew Exp $ */
|
|
+/*
|
|
+ * Public domain.
|
|
+ * Written by Matthew Dempsky.
|
|
+ */
|
|
+
|
|
+#include <string.h>
|
|
+
|
|
+__attribute__((weak)) void
|
|
+__explicit_bzero_hook(void *buf, size_t len)
|
|
+{
|
|
+}
|
|
+
|
|
+void
|
|
+explicit_bzero(void *buf, size_t len)
|
|
+{
|
|
+ memset(buf, 0, len);
|
|
+ __explicit_bzero_hook(buf, len);
|
|
+}
|
|
diff -uprN netcat-openbsd-1.130.bk/getentropy_hurd.c netcat-openbsd-1.130/getentropy_hurd.c
|
|
--- netcat-openbsd-1.130.bk/getentropy_hurd.c 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/getentropy_hurd.c 2016-03-27 18:21:36.000000000 +0800
|
|
@@ -0,0 +1,446 @@
|
|
+/* $OpenBSD: getentropy_linux.c,v 1.40 2015/08/25 17:26:43 deraadt Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
|
|
+ * Copyright (c) 2014 Bob Beck <beck@obtuse.com>
|
|
+ *
|
|
+ * Permission to use, copy, modify, and distribute this software for any
|
|
+ * purpose with or without fee is hereby granted, provided that the above
|
|
+ * copyright notice and this permission notice appear in all copies.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
+ *
|
|
+ * Emulation of getentropy(2) as documented at:
|
|
+ * http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man2/getentropy.2
|
|
+ */
|
|
+
|
|
+#define _POSIX_C_SOURCE 199309L
|
|
+#define _GNU_SOURCE 1
|
|
+#include <sys/types.h>
|
|
+#include <sys/param.h>
|
|
+#include <sys/ioctl.h>
|
|
+#include <sys/resource.h>
|
|
+#include <sys/syscall.h>
|
|
+#include <sys/statvfs.h>
|
|
+#include <sys/socket.h>
|
|
+#include <sys/mman.h>
|
|
+#include <sys/stat.h>
|
|
+#include <sys/time.h>
|
|
+#include <stdlib.h>
|
|
+#include <stdint.h>
|
|
+#include <stdio.h>
|
|
+#include <link.h>
|
|
+#include <termios.h>
|
|
+#include <fcntl.h>
|
|
+#include <signal.h>
|
|
+#include <string.h>
|
|
+#include <errno.h>
|
|
+#include <unistd.h>
|
|
+#include <time.h>
|
|
+
|
|
+#include "hash/sha512.h"
|
|
+
|
|
+#ifdef HAVE_GETAUXVAL
|
|
+#include <sys/auxv.h>
|
|
+#endif
|
|
+#include <sys/vfs.h>
|
|
+
|
|
+#define REPEAT 5
|
|
+#define min(a, b) (((a) < (b)) ? (a) : (b))
|
|
+
|
|
+#define HX(a, b) \
|
|
+ do { \
|
|
+ if ((a)) \
|
|
+ HD(errno); \
|
|
+ else \
|
|
+ HD(b); \
|
|
+ } while (0)
|
|
+
|
|
+#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
|
|
+#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
|
|
+#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
|
|
+
|
|
+int getentropy(void *buf, size_t len);
|
|
+
|
|
+static int gotdata(char *buf, size_t len);
|
|
+static int getentropy_urandom(void *buf, size_t len);
|
|
+static int getentropy_fallback(void *buf, size_t len);
|
|
+static int getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data);
|
|
+
|
|
+int
|
|
+getentropy(void *buf, size_t len)
|
|
+{
|
|
+ int ret = -1;
|
|
+
|
|
+ if (len > 256) {
|
|
+ errno = EIO;
|
|
+ return (-1);
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Try to get entropy with /dev/urandom
|
|
+ *
|
|
+ * This can fail if the process is inside a chroot or if file
|
|
+ * descriptors are exhausted.
|
|
+ */
|
|
+ ret = getentropy_urandom(buf, len);
|
|
+ if (ret != -1)
|
|
+ return (ret);
|
|
+
|
|
+ /*
|
|
+ * Entropy collection via /dev/urandom has failed.
|
|
+ *
|
|
+ * No other API exists for collecting entropy. See the large
|
|
+ * comment block above.
|
|
+ *
|
|
+ * We have very few options:
|
|
+ * - Even syslog_r is unsafe to call at this low level, so
|
|
+ * there is no way to alert the user or program.
|
|
+ * - Cannot call abort() because some systems have unsafe
|
|
+ * corefiles.
|
|
+ * - Could raise(SIGKILL) resulting in silent program termination.
|
|
+ * - Return EIO, to hint that arc4random's stir function
|
|
+ * should raise(SIGKILL)
|
|
+ * - Do the best under the circumstances....
|
|
+ *
|
|
+ * This code path exists to bring light to the issue that Hurd
|
|
+ * does not provide a failsafe API for entropy collection.
|
|
+ *
|
|
+ * We hope this demonstrates that Hurd should either get a
|
|
+ * sysctl ABI, or consider providing a new failsafe API which
|
|
+ * works in a chroot or when file descriptors are exhausted.
|
|
+ */
|
|
+#undef FAIL_INSTEAD_OF_TRYING_FALLBACK
|
|
+#ifdef FAIL_INSTEAD_OF_TRYING_FALLBACK
|
|
+ raise(SIGKILL);
|
|
+#endif
|
|
+ ret = getentropy_fallback(buf, len);
|
|
+ if (ret != -1)
|
|
+ return (ret);
|
|
+
|
|
+ errno = EIO;
|
|
+ return (ret);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Basic sanity checking; wish we could do better.
|
|
+ */
|
|
+static int
|
|
+gotdata(char *buf, size_t len)
|
|
+{
|
|
+ char any_set = 0;
|
|
+ size_t i;
|
|
+
|
|
+ for (i = 0; i < len; ++i)
|
|
+ any_set |= buf[i];
|
|
+ if (any_set == 0)
|
|
+ return (-1);
|
|
+ return (0);
|
|
+}
|
|
+
|
|
+static int
|
|
+getentropy_urandom(void *buf, size_t len)
|
|
+{
|
|
+ struct stat st;
|
|
+ size_t i;
|
|
+ int fd, flags;
|
|
+ int save_errno = errno;
|
|
+
|
|
+start:
|
|
+
|
|
+ flags = O_RDONLY;
|
|
+#ifdef O_NOFOLLOW
|
|
+ flags |= O_NOFOLLOW;
|
|
+#endif
|
|
+#ifdef O_CLOEXEC
|
|
+ flags |= O_CLOEXEC;
|
|
+#endif
|
|
+ fd = open("/dev/urandom", flags, 0);
|
|
+ if (fd == -1) {
|
|
+ if (errno == EINTR)
|
|
+ goto start;
|
|
+ goto nodevrandom;
|
|
+ }
|
|
+#ifndef O_CLOEXEC
|
|
+ fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
|
|
+#endif
|
|
+
|
|
+ /* Lightly verify that the device node looks sane */
|
|
+ if (fstat(fd, &st) == -1 || !S_ISCHR(st.st_mode)) {
|
|
+ close(fd);
|
|
+ goto nodevrandom;
|
|
+ }
|
|
+ for (i = 0; i < len; ) {
|
|
+ size_t wanted = len - i;
|
|
+ ssize_t ret = read(fd, (char *)buf + i, wanted);
|
|
+
|
|
+ if (ret == -1) {
|
|
+ if (errno == EAGAIN || errno == EINTR)
|
|
+ continue;
|
|
+ close(fd);
|
|
+ goto nodevrandom;
|
|
+ }
|
|
+ i += ret;
|
|
+ }
|
|
+ close(fd);
|
|
+ if (gotdata(buf, len) == 0) {
|
|
+ errno = save_errno;
|
|
+ return (0); /* satisfied */
|
|
+ }
|
|
+nodevrandom:
|
|
+ errno = EIO;
|
|
+ return (-1);
|
|
+}
|
|
+
|
|
+static const int cl[] = {
|
|
+ CLOCK_REALTIME,
|
|
+#ifdef CLOCK_MONOTONIC
|
|
+ CLOCK_MONOTONIC,
|
|
+#endif
|
|
+#ifdef CLOCK_MONOTONIC_RAW
|
|
+ CLOCK_MONOTONIC_RAW,
|
|
+#endif
|
|
+#ifdef CLOCK_TAI
|
|
+ CLOCK_TAI,
|
|
+#endif
|
|
+#ifdef CLOCK_VIRTUAL
|
|
+ CLOCK_VIRTUAL,
|
|
+#endif
|
|
+#ifdef CLOCK_UPTIME
|
|
+ CLOCK_UPTIME,
|
|
+#endif
|
|
+#ifdef CLOCK_PROCESS_CPUTIME_ID
|
|
+ CLOCK_PROCESS_CPUTIME_ID,
|
|
+#endif
|
|
+#ifdef CLOCK_THREAD_CPUTIME_ID
|
|
+ CLOCK_THREAD_CPUTIME_ID,
|
|
+#endif
|
|
+};
|
|
+
|
|
+static int
|
|
+getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data)
|
|
+{
|
|
+ SHA512_CTX *ctx = data;
|
|
+
|
|
+ SHA512_Update(ctx, &info->dlpi_addr, sizeof (info->dlpi_addr));
|
|
+ return (0);
|
|
+}
|
|
+
|
|
+static int
|
|
+getentropy_fallback(void *buf, size_t len)
|
|
+{
|
|
+ uint8_t results[SHA512_DIGEST_LENGTH];
|
|
+ int save_errno = errno, e, pgs = getpagesize(), faster = 0, repeat;
|
|
+ static int cnt;
|
|
+ struct timespec ts;
|
|
+ struct timeval tv;
|
|
+ struct rusage ru;
|
|
+ sigset_t sigset;
|
|
+ struct stat st;
|
|
+ SHA512_CTX ctx;
|
|
+ static pid_t lastpid;
|
|
+ pid_t pid;
|
|
+ size_t i, ii, m;
|
|
+ char *p;
|
|
+
|
|
+ pid = getpid();
|
|
+ if (lastpid == pid) {
|
|
+ faster = 1;
|
|
+ repeat = 2;
|
|
+ } else {
|
|
+ faster = 0;
|
|
+ lastpid = pid;
|
|
+ repeat = REPEAT;
|
|
+ }
|
|
+ for (i = 0; i < len; ) {
|
|
+ int j;
|
|
+ SHA512_Init(&ctx);
|
|
+ for (j = 0; j < repeat; j++) {
|
|
+ HX((e = gettimeofday(&tv, NULL)) == -1, tv);
|
|
+ if (e != -1) {
|
|
+ cnt += (int)tv.tv_sec;
|
|
+ cnt += (int)tv.tv_usec;
|
|
+ }
|
|
+
|
|
+ dl_iterate_phdr(getentropy_phdr, &ctx);
|
|
+
|
|
+ for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); ii++)
|
|
+ HX(clock_gettime(cl[ii], &ts) == -1, ts);
|
|
+
|
|
+ HX((pid = getpid()) == -1, pid);
|
|
+ HX((pid = getsid(pid)) == -1, pid);
|
|
+ HX((pid = getppid()) == -1, pid);
|
|
+ HX((pid = getpgid(0)) == -1, pid);
|
|
+ HX((e = getpriority(0, 0)) == -1, e);
|
|
+
|
|
+ if (!faster) {
|
|
+ ts.tv_sec = 0;
|
|
+ ts.tv_nsec = 1;
|
|
+ (void) nanosleep(&ts, NULL);
|
|
+ }
|
|
+
|
|
+ HX(sigpending(&sigset) == -1, sigset);
|
|
+ HX(sigprocmask(SIG_BLOCK, NULL, &sigset) == -1,
|
|
+ sigset);
|
|
+
|
|
+ HF(getentropy); /* an addr in this library */
|
|
+ HF(printf); /* an addr in libc */
|
|
+ p = (char *)&p;
|
|
+ HD(p); /* an addr on stack */
|
|
+ p = (char *)&errno;
|
|
+ HD(p); /* the addr of errno */
|
|
+
|
|
+ if (i == 0) {
|
|
+ struct sockaddr_storage ss;
|
|
+ struct statvfs stvfs;
|
|
+ struct termios tios;
|
|
+ struct statfs stfs;
|
|
+ socklen_t ssl;
|
|
+ off_t off;
|
|
+
|
|
+ /*
|
|
+ * Prime-sized mappings encourage fragmentation;
|
|
+ * thus exposing some address entropy.
|
|
+ */
|
|
+ struct mm {
|
|
+ size_t npg;
|
|
+ void *p;
|
|
+ } mm[] = {
|
|
+ { 17, MAP_FAILED }, { 3, MAP_FAILED },
|
|
+ { 11, MAP_FAILED }, { 2, MAP_FAILED },
|
|
+ { 5, MAP_FAILED }, { 3, MAP_FAILED },
|
|
+ { 7, MAP_FAILED }, { 1, MAP_FAILED },
|
|
+ { 57, MAP_FAILED }, { 3, MAP_FAILED },
|
|
+ { 131, MAP_FAILED }, { 1, MAP_FAILED },
|
|
+ };
|
|
+
|
|
+ for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
|
|
+ HX(mm[m].p = mmap(NULL,
|
|
+ mm[m].npg * pgs,
|
|
+ PROT_READ|PROT_WRITE,
|
|
+ MAP_PRIVATE|MAP_ANON, -1,
|
|
+ (off_t)0), mm[m].p);
|
|
+ if (mm[m].p != MAP_FAILED) {
|
|
+ size_t mo;
|
|
+
|
|
+ /* Touch some memory... */
|
|
+ p = mm[m].p;
|
|
+ mo = cnt %
|
|
+ (mm[m].npg * pgs - 1);
|
|
+ p[mo] = 1;
|
|
+ cnt += (int)((long)(mm[m].p)
|
|
+ / pgs);
|
|
+ }
|
|
+
|
|
+ /* Check cnts and times... */
|
|
+ for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]);
|
|
+ ii++) {
|
|
+ HX((e = clock_gettime(cl[ii],
|
|
+ &ts)) == -1, ts);
|
|
+ if (e != -1)
|
|
+ cnt += (int)ts.tv_nsec;
|
|
+ }
|
|
+
|
|
+ HX((e = getrusage(RUSAGE_SELF,
|
|
+ &ru)) == -1, ru);
|
|
+ if (e != -1) {
|
|
+ cnt += (int)ru.ru_utime.tv_sec;
|
|
+ cnt += (int)ru.ru_utime.tv_usec;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
|
|
+ if (mm[m].p != MAP_FAILED)
|
|
+ munmap(mm[m].p, mm[m].npg * pgs);
|
|
+ mm[m].p = MAP_FAILED;
|
|
+ }
|
|
+
|
|
+ HX(stat(".", &st) == -1, st);
|
|
+ HX(statvfs(".", &stvfs) == -1, stvfs);
|
|
+ HX(statfs(".", &stfs) == -1, stfs);
|
|
+
|
|
+ HX(stat("/", &st) == -1, st);
|
|
+ HX(statvfs("/", &stvfs) == -1, stvfs);
|
|
+ HX(statfs("/", &stfs) == -1, stfs);
|
|
+
|
|
+ HX((e = fstat(0, &st)) == -1, st);
|
|
+ if (e == -1) {
|
|
+ if (S_ISREG(st.st_mode) ||
|
|
+ S_ISFIFO(st.st_mode) ||
|
|
+ S_ISSOCK(st.st_mode)) {
|
|
+ HX(fstatvfs(0, &stvfs) == -1,
|
|
+ stvfs);
|
|
+ HX(fstatfs(0, &stfs) == -1,
|
|
+ stfs);
|
|
+ HX((off = lseek(0, (off_t)0,
|
|
+ SEEK_CUR)) < 0, off);
|
|
+ }
|
|
+ if (S_ISCHR(st.st_mode)) {
|
|
+ HX(tcgetattr(0, &tios) == -1,
|
|
+ tios);
|
|
+ } else if (S_ISSOCK(st.st_mode)) {
|
|
+ memset(&ss, 0, sizeof ss);
|
|
+ ssl = sizeof(ss);
|
|
+ HX(getpeername(0,
|
|
+ (void *)&ss, &ssl) == -1,
|
|
+ ss);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ HX((e = getrusage(RUSAGE_CHILDREN,
|
|
+ &ru)) == -1, ru);
|
|
+ if (e != -1) {
|
|
+ cnt += (int)ru.ru_utime.tv_sec;
|
|
+ cnt += (int)ru.ru_utime.tv_usec;
|
|
+ }
|
|
+ } else {
|
|
+ /* Subsequent hashes absorb previous result */
|
|
+ HD(results);
|
|
+ }
|
|
+
|
|
+ HX((e = gettimeofday(&tv, NULL)) == -1, tv);
|
|
+ if (e != -1) {
|
|
+ cnt += (int)tv.tv_sec;
|
|
+ cnt += (int)tv.tv_usec;
|
|
+ }
|
|
+
|
|
+ HD(cnt);
|
|
+ }
|
|
+#ifdef HAVE_GETAUXVAL
|
|
+#ifdef AT_RANDOM
|
|
+ /* Not as random as you think but we take what we are given */
|
|
+ p = (char *) getauxval(AT_RANDOM);
|
|
+ if (p)
|
|
+ HR(p, 16);
|
|
+#endif
|
|
+#ifdef AT_SYSINFO_EHDR
|
|
+ p = (char *) getauxval(AT_SYSINFO_EHDR);
|
|
+ if (p)
|
|
+ HR(p, pgs);
|
|
+#endif
|
|
+#ifdef AT_BASE
|
|
+ p = (char *) getauxval(AT_BASE);
|
|
+ if (p)
|
|
+ HD(p);
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+ SHA512_Final(results, &ctx);
|
|
+ memcpy((char *)buf + i, results, min(sizeof(results), len - i));
|
|
+ i += min(sizeof(results), len - i);
|
|
+ }
|
|
+ explicit_bzero(&ctx, sizeof ctx);
|
|
+ explicit_bzero(results, sizeof results);
|
|
+ if (gotdata(buf, len) == 0) {
|
|
+ errno = save_errno;
|
|
+ return (0); /* satisfied */
|
|
+ }
|
|
+ errno = EIO;
|
|
+ return (-1);
|
|
+}
|
|
diff -uprN netcat-openbsd-1.130.bk/hash/endian.h netcat-openbsd-1.130/hash/endian.h
|
|
--- netcat-openbsd-1.130.bk/hash/endian.h 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/hash/endian.h 2017-04-14 00:18:13.245102700 +0800
|
|
@@ -0,0 +1,158 @@
|
|
+/*
|
|
+ * Copyright © 2011 Guillem Jover <guillem@hadrons.org>
|
|
+ *
|
|
+ * Copyright © 2002 Thomas Moestl <tmm@FreeBSD.org>
|
|
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
+ */
|
|
+
|
|
+#ifndef LIBBSD_SYS_ENDIAN_H
|
|
+#define LIBBSD_SYS_ENDIAN_H
|
|
+
|
|
+#ifndef _BYTE_ORDER
|
|
+#define _BYTE_ORDER __BYTE_ORDER
|
|
+#endif
|
|
+
|
|
+#ifndef _LITTLE_ENDIAN
|
|
+#define _LITTLE_ENDIAN __LITTLE_ENDIAN
|
|
+#endif
|
|
+
|
|
+#ifndef _BIG_ENDIAN
|
|
+#define _BIG_ENDIAN __BIG_ENDIAN
|
|
+#endif
|
|
+
|
|
+#ifndef _PDP_ENDIAN
|
|
+#define _PDP_ENDIAN __PDP_ENDIAN
|
|
+#endif
|
|
+
|
|
+#include <stdint.h>
|
|
+
|
|
+/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
|
|
+
|
|
+static __inline uint16_t
|
|
+be16dec(const void *pp)
|
|
+{
|
|
+ uint8_t const *p = (uint8_t const *)pp;
|
|
+
|
|
+ return ((p[0] << 8) | p[1]);
|
|
+}
|
|
+
|
|
+static __inline uint32_t
|
|
+be32dec(const void *pp)
|
|
+{
|
|
+ uint8_t const *p = (uint8_t const *)pp;
|
|
+
|
|
+ return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
|
|
+}
|
|
+
|
|
+static __inline uint64_t
|
|
+be64dec(const void *pp)
|
|
+{
|
|
+ uint8_t const *p = (uint8_t const *)pp;
|
|
+
|
|
+ return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4));
|
|
+}
|
|
+
|
|
+static __inline uint16_t
|
|
+le16dec(const void *pp)
|
|
+{
|
|
+ uint8_t const *p = (uint8_t const *)pp;
|
|
+
|
|
+ return ((p[1] << 8) | p[0]);
|
|
+}
|
|
+
|
|
+static __inline uint32_t
|
|
+le32dec(const void *pp)
|
|
+{
|
|
+ uint8_t const *p = (uint8_t const *)pp;
|
|
+
|
|
+ return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]);
|
|
+}
|
|
+
|
|
+static __inline uint64_t
|
|
+le64dec(const void *pp)
|
|
+{
|
|
+ uint8_t const *p = (uint8_t const *)pp;
|
|
+
|
|
+ return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p));
|
|
+}
|
|
+
|
|
+static __inline void
|
|
+be16enc(void *pp, uint16_t u)
|
|
+{
|
|
+ uint8_t *p = (uint8_t *)pp;
|
|
+
|
|
+ p[0] = (u >> 8) & 0xff;
|
|
+ p[1] = u & 0xff;
|
|
+}
|
|
+
|
|
+static __inline void
|
|
+be32enc(void *pp, uint32_t u)
|
|
+{
|
|
+ uint8_t *p = (uint8_t *)pp;
|
|
+
|
|
+ p[0] = (u >> 24) & 0xff;
|
|
+ p[1] = (u >> 16) & 0xff;
|
|
+ p[2] = (u >> 8) & 0xff;
|
|
+ p[3] = u & 0xff;
|
|
+}
|
|
+
|
|
+static __inline void
|
|
+be64enc(void *pp, uint64_t u)
|
|
+{
|
|
+ uint8_t *p = (uint8_t *)pp;
|
|
+
|
|
+ be32enc(p, (uint32_t)(u >> 32));
|
|
+ be32enc(p + 4, (uint32_t)(u & 0xffffffffU));
|
|
+}
|
|
+
|
|
+static __inline void
|
|
+le16enc(void *pp, uint16_t u)
|
|
+{
|
|
+ uint8_t *p = (uint8_t *)pp;
|
|
+
|
|
+ p[0] = u & 0xff;
|
|
+ p[1] = (u >> 8) & 0xff;
|
|
+}
|
|
+
|
|
+static __inline void
|
|
+le32enc(void *pp, uint32_t u)
|
|
+{
|
|
+ uint8_t *p = (uint8_t *)pp;
|
|
+
|
|
+ p[0] = u & 0xff;
|
|
+ p[1] = (u >> 8) & 0xff;
|
|
+ p[2] = (u >> 16) & 0xff;
|
|
+ p[3] = (u >> 24) & 0xff;
|
|
+}
|
|
+
|
|
+static __inline void
|
|
+le64enc(void *pp, uint64_t u)
|
|
+{
|
|
+ uint8_t *p = (uint8_t *)pp;
|
|
+
|
|
+ le32enc(p, (uint32_t)(u & 0xffffffffU));
|
|
+ le32enc(p + 4, (uint32_t)(u >> 32));
|
|
+}
|
|
+
|
|
+#endif
|
|
diff -uprN netcat-openbsd-1.130.bk/hash/sha512.h netcat-openbsd-1.130/hash/sha512.h
|
|
--- netcat-openbsd-1.130.bk/hash/sha512.h 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/hash/sha512.h 2016-03-27 18:21:37.000000000 +0800
|
|
@@ -0,0 +1,53 @@
|
|
+/*-
|
|
+ * Copyright 2005 Colin Percival
|
|
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
|
+ *
|
|
+ * $FreeBSD$
|
|
+ */
|
|
+
|
|
+#ifndef _SHA512_H_
|
|
+#define _SHA512_H_
|
|
+
|
|
+#include <sys/types.h>
|
|
+
|
|
+#define SHA512_DIGEST_LENGTH 64
|
|
+
|
|
+typedef struct SHA512Context {
|
|
+ uint64_t state[8];
|
|
+ uint64_t count[2];
|
|
+ unsigned char buf[128];
|
|
+} SHA512_CTX;
|
|
+
|
|
+__BEGIN_DECLS
|
|
+
|
|
+void SHA512_Init(SHA512_CTX *);
|
|
+void SHA512_Update(SHA512_CTX *, const void *, size_t);
|
|
+void SHA512_Final(unsigned char [64], SHA512_CTX *);
|
|
+char *SHA512_End(SHA512_CTX *, char *);
|
|
+char *SHA512_File(const char *, char *);
|
|
+char *SHA512_FileChunk(const char *, char *, off_t, off_t);
|
|
+char *SHA512_Data(const void *, unsigned int, char *);
|
|
+__END_DECLS
|
|
+
|
|
+#endif /* !_SHA512_H_ */
|
|
diff -uprN netcat-openbsd-1.130.bk/hash/sha512c.c netcat-openbsd-1.130/hash/sha512c.c
|
|
--- netcat-openbsd-1.130.bk/hash/sha512c.c 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/hash/sha512c.c 2017-04-14 00:17:04.637401600 +0800
|
|
@@ -0,0 +1,319 @@
|
|
+/*-
|
|
+ * Copyright 2005 Colin Percival
|
|
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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 <sys/cdefs.h>
|
|
+
|
|
+#include "endian.h"
|
|
+#include <sys/types.h>
|
|
+
|
|
+#include <string.h>
|
|
+
|
|
+#include "sha512.h"
|
|
+
|
|
+#if BYTE_ORDER == BIG_ENDIAN
|
|
+
|
|
+/* Copy a vector of big-endian uint64_t into a vector of bytes */
|
|
+#define be64enc_vect(dst, src, len) \
|
|
+ memcpy((void *)dst, (const void *)src, (size_t)len)
|
|
+
|
|
+/* Copy a vector of bytes into a vector of big-endian uint64_t */
|
|
+#define be64dec_vect(dst, src, len) \
|
|
+ memcpy((void *)dst, (const void *)src, (size_t)len)
|
|
+
|
|
+#else /* BYTE_ORDER != BIG_ENDIAN */
|
|
+
|
|
+/*
|
|
+ * Encode a length len/4 vector of (uint64_t) into a length len vector of
|
|
+ * (unsigned char) in big-endian form. Assumes len is a multiple of 8.
|
|
+ */
|
|
+static void
|
|
+be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)
|
|
+{
|
|
+ size_t i;
|
|
+
|
|
+ for (i = 0; i < len / 8; i++)
|
|
+ be64enc(dst + i * 8, src[i]);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Decode a big-endian length len vector of (unsigned char) into a length
|
|
+ * len/4 vector of (uint64_t). Assumes len is a multiple of 8.
|
|
+ */
|
|
+static void
|
|
+be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)
|
|
+{
|
|
+ size_t i;
|
|
+
|
|
+ for (i = 0; i < len / 8; i++)
|
|
+ dst[i] = be64dec(src + i * 8);
|
|
+}
|
|
+
|
|
+#endif /* BYTE_ORDER != BIG_ENDIAN */
|
|
+
|
|
+/* Elementary functions used by SHA512 */
|
|
+#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
|
|
+#define Maj(x, y, z) ((x & (y | z)) | (y & z))
|
|
+#define SHR(x, n) (x >> n)
|
|
+#define ROTR(x, n) ((x >> n) | (x << (64 - n)))
|
|
+#define S0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
|
|
+#define S1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
|
|
+#define s0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
|
|
+#define s1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
|
|
+
|
|
+/* SHA512 round function */
|
|
+#define RND(a, b, c, d, e, f, g, h, k) \
|
|
+ t0 = h + S1(e) + Ch(e, f, g) + k; \
|
|
+ t1 = S0(a) + Maj(a, b, c); \
|
|
+ d += t0; \
|
|
+ h = t0 + t1;
|
|
+
|
|
+/* Adjusted round function for rotating state */
|
|
+#define RNDr(S, W, i, k) \
|
|
+ RND(S[(80 - i) % 8], S[(81 - i) % 8], \
|
|
+ S[(82 - i) % 8], S[(83 - i) % 8], \
|
|
+ S[(84 - i) % 8], S[(85 - i) % 8], \
|
|
+ S[(86 - i) % 8], S[(87 - i) % 8], \
|
|
+ W[i] + k)
|
|
+
|
|
+/*
|
|
+ * SHA512 block compression function. The 512-bit state is transformed via
|
|
+ * the 512-bit input block to produce a new state.
|
|
+ */
|
|
+static void
|
|
+SHA512_Transform(uint64_t * state, const unsigned char block[128])
|
|
+{
|
|
+ uint64_t W[80];
|
|
+ uint64_t S[8];
|
|
+ uint64_t t0, t1;
|
|
+ int i;
|
|
+
|
|
+ /* 1. Prepare message schedule W. */
|
|
+ be64dec_vect(W, block, 128);
|
|
+ for (i = 16; i < 80; i++)
|
|
+ W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
|
|
+
|
|
+ /* 2. Initialize working variables. */
|
|
+ memcpy(S, state, 64);
|
|
+
|
|
+ /* 3. Mix. */
|
|
+ RNDr(S, W, 0, 0x428a2f98d728ae22ULL);
|
|
+ RNDr(S, W, 1, 0x7137449123ef65cdULL);
|
|
+ RNDr(S, W, 2, 0xb5c0fbcfec4d3b2fULL);
|
|
+ RNDr(S, W, 3, 0xe9b5dba58189dbbcULL);
|
|
+ RNDr(S, W, 4, 0x3956c25bf348b538ULL);
|
|
+ RNDr(S, W, 5, 0x59f111f1b605d019ULL);
|
|
+ RNDr(S, W, 6, 0x923f82a4af194f9bULL);
|
|
+ RNDr(S, W, 7, 0xab1c5ed5da6d8118ULL);
|
|
+ RNDr(S, W, 8, 0xd807aa98a3030242ULL);
|
|
+ RNDr(S, W, 9, 0x12835b0145706fbeULL);
|
|
+ RNDr(S, W, 10, 0x243185be4ee4b28cULL);
|
|
+ RNDr(S, W, 11, 0x550c7dc3d5ffb4e2ULL);
|
|
+ RNDr(S, W, 12, 0x72be5d74f27b896fULL);
|
|
+ RNDr(S, W, 13, 0x80deb1fe3b1696b1ULL);
|
|
+ RNDr(S, W, 14, 0x9bdc06a725c71235ULL);
|
|
+ RNDr(S, W, 15, 0xc19bf174cf692694ULL);
|
|
+ RNDr(S, W, 16, 0xe49b69c19ef14ad2ULL);
|
|
+ RNDr(S, W, 17, 0xefbe4786384f25e3ULL);
|
|
+ RNDr(S, W, 18, 0x0fc19dc68b8cd5b5ULL);
|
|
+ RNDr(S, W, 19, 0x240ca1cc77ac9c65ULL);
|
|
+ RNDr(S, W, 20, 0x2de92c6f592b0275ULL);
|
|
+ RNDr(S, W, 21, 0x4a7484aa6ea6e483ULL);
|
|
+ RNDr(S, W, 22, 0x5cb0a9dcbd41fbd4ULL);
|
|
+ RNDr(S, W, 23, 0x76f988da831153b5ULL);
|
|
+ RNDr(S, W, 24, 0x983e5152ee66dfabULL);
|
|
+ RNDr(S, W, 25, 0xa831c66d2db43210ULL);
|
|
+ RNDr(S, W, 26, 0xb00327c898fb213fULL);
|
|
+ RNDr(S, W, 27, 0xbf597fc7beef0ee4ULL);
|
|
+ RNDr(S, W, 28, 0xc6e00bf33da88fc2ULL);
|
|
+ RNDr(S, W, 29, 0xd5a79147930aa725ULL);
|
|
+ RNDr(S, W, 30, 0x06ca6351e003826fULL);
|
|
+ RNDr(S, W, 31, 0x142929670a0e6e70ULL);
|
|
+ RNDr(S, W, 32, 0x27b70a8546d22ffcULL);
|
|
+ RNDr(S, W, 33, 0x2e1b21385c26c926ULL);
|
|
+ RNDr(S, W, 34, 0x4d2c6dfc5ac42aedULL);
|
|
+ RNDr(S, W, 35, 0x53380d139d95b3dfULL);
|
|
+ RNDr(S, W, 36, 0x650a73548baf63deULL);
|
|
+ RNDr(S, W, 37, 0x766a0abb3c77b2a8ULL);
|
|
+ RNDr(S, W, 38, 0x81c2c92e47edaee6ULL);
|
|
+ RNDr(S, W, 39, 0x92722c851482353bULL);
|
|
+ RNDr(S, W, 40, 0xa2bfe8a14cf10364ULL);
|
|
+ RNDr(S, W, 41, 0xa81a664bbc423001ULL);
|
|
+ RNDr(S, W, 42, 0xc24b8b70d0f89791ULL);
|
|
+ RNDr(S, W, 43, 0xc76c51a30654be30ULL);
|
|
+ RNDr(S, W, 44, 0xd192e819d6ef5218ULL);
|
|
+ RNDr(S, W, 45, 0xd69906245565a910ULL);
|
|
+ RNDr(S, W, 46, 0xf40e35855771202aULL);
|
|
+ RNDr(S, W, 47, 0x106aa07032bbd1b8ULL);
|
|
+ RNDr(S, W, 48, 0x19a4c116b8d2d0c8ULL);
|
|
+ RNDr(S, W, 49, 0x1e376c085141ab53ULL);
|
|
+ RNDr(S, W, 50, 0x2748774cdf8eeb99ULL);
|
|
+ RNDr(S, W, 51, 0x34b0bcb5e19b48a8ULL);
|
|
+ RNDr(S, W, 52, 0x391c0cb3c5c95a63ULL);
|
|
+ RNDr(S, W, 53, 0x4ed8aa4ae3418acbULL);
|
|
+ RNDr(S, W, 54, 0x5b9cca4f7763e373ULL);
|
|
+ RNDr(S, W, 55, 0x682e6ff3d6b2b8a3ULL);
|
|
+ RNDr(S, W, 56, 0x748f82ee5defb2fcULL);
|
|
+ RNDr(S, W, 57, 0x78a5636f43172f60ULL);
|
|
+ RNDr(S, W, 58, 0x84c87814a1f0ab72ULL);
|
|
+ RNDr(S, W, 59, 0x8cc702081a6439ecULL);
|
|
+ RNDr(S, W, 60, 0x90befffa23631e28ULL);
|
|
+ RNDr(S, W, 61, 0xa4506cebde82bde9ULL);
|
|
+ RNDr(S, W, 62, 0xbef9a3f7b2c67915ULL);
|
|
+ RNDr(S, W, 63, 0xc67178f2e372532bULL);
|
|
+ RNDr(S, W, 64, 0xca273eceea26619cULL);
|
|
+ RNDr(S, W, 65, 0xd186b8c721c0c207ULL);
|
|
+ RNDr(S, W, 66, 0xeada7dd6cde0eb1eULL);
|
|
+ RNDr(S, W, 67, 0xf57d4f7fee6ed178ULL);
|
|
+ RNDr(S, W, 68, 0x06f067aa72176fbaULL);
|
|
+ RNDr(S, W, 69, 0x0a637dc5a2c898a6ULL);
|
|
+ RNDr(S, W, 70, 0x113f9804bef90daeULL);
|
|
+ RNDr(S, W, 71, 0x1b710b35131c471bULL);
|
|
+ RNDr(S, W, 72, 0x28db77f523047d84ULL);
|
|
+ RNDr(S, W, 73, 0x32caab7b40c72493ULL);
|
|
+ RNDr(S, W, 74, 0x3c9ebe0a15c9bebcULL);
|
|
+ RNDr(S, W, 75, 0x431d67c49c100d4cULL);
|
|
+ RNDr(S, W, 76, 0x4cc5d4becb3e42b6ULL);
|
|
+ RNDr(S, W, 77, 0x597f299cfc657e2aULL);
|
|
+ RNDr(S, W, 78, 0x5fcb6fab3ad6faecULL);
|
|
+ RNDr(S, W, 79, 0x6c44198c4a475817ULL);
|
|
+
|
|
+ /* 4. Mix local working variables into global state */
|
|
+ for (i = 0; i < 8; i++)
|
|
+ state[i] += S[i];
|
|
+}
|
|
+
|
|
+static unsigned char PAD[128] = {
|
|
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
+};
|
|
+
|
|
+/* Add padding and terminating bit-count. */
|
|
+static void
|
|
+SHA512_Pad(SHA512_CTX * ctx)
|
|
+{
|
|
+ unsigned char len[16];
|
|
+ uint64_t r, plen;
|
|
+
|
|
+ /*
|
|
+ * Convert length to a vector of bytes -- we do this now rather
|
|
+ * than later because the length will change after we pad.
|
|
+ */
|
|
+ be64enc_vect(len, ctx->count, 16);
|
|
+
|
|
+ /* Add 1--128 bytes so that the resulting length is 112 mod 128 */
|
|
+ r = (ctx->count[1] >> 3) & 0x7f;
|
|
+ plen = (r < 112) ? (112 - r) : (240 - r);
|
|
+ SHA512_Update(ctx, PAD, (size_t)plen);
|
|
+
|
|
+ /* Add the terminating bit-count */
|
|
+ SHA512_Update(ctx, len, 16);
|
|
+}
|
|
+
|
|
+/* SHA-512 initialization. Begins a SHA-512 operation. */
|
|
+void
|
|
+SHA512_Init(SHA512_CTX * ctx)
|
|
+{
|
|
+
|
|
+ /* Zero bits processed so far */
|
|
+ ctx->count[0] = ctx->count[1] = 0;
|
|
+
|
|
+ /* Magic initialization constants */
|
|
+ ctx->state[0] = 0x6a09e667f3bcc908ULL;
|
|
+ ctx->state[1] = 0xbb67ae8584caa73bULL;
|
|
+ ctx->state[2] = 0x3c6ef372fe94f82bULL;
|
|
+ ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
|
|
+ ctx->state[4] = 0x510e527fade682d1ULL;
|
|
+ ctx->state[5] = 0x9b05688c2b3e6c1fULL;
|
|
+ ctx->state[6] = 0x1f83d9abfb41bd6bULL;
|
|
+ ctx->state[7] = 0x5be0cd19137e2179ULL;
|
|
+}
|
|
+
|
|
+/* Add bytes into the hash */
|
|
+void
|
|
+SHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)
|
|
+{
|
|
+ uint64_t bitlen[2];
|
|
+ uint64_t r;
|
|
+ const unsigned char *src = in;
|
|
+
|
|
+ /* Number of bytes left in the buffer from previous updates */
|
|
+ r = (ctx->count[1] >> 3) & 0x7f;
|
|
+
|
|
+ /* Convert the length into a number of bits */
|
|
+ bitlen[1] = ((uint64_t)len) << 3;
|
|
+ bitlen[0] = ((uint64_t)len) >> 61;
|
|
+
|
|
+ /* Update number of bits */
|
|
+ if ((ctx->count[1] += bitlen[1]) < bitlen[1])
|
|
+ ctx->count[0]++;
|
|
+ ctx->count[0] += bitlen[0];
|
|
+
|
|
+ /* Handle the case where we don't need to perform any transforms */
|
|
+ if (len < 128 - r) {
|
|
+ memcpy(&ctx->buf[r], src, len);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* Finish the current block */
|
|
+ memcpy(&ctx->buf[r], src, 128 - r);
|
|
+ SHA512_Transform(ctx->state, ctx->buf);
|
|
+ src += 128 - r;
|
|
+ len -= 128 - r;
|
|
+
|
|
+ /* Perform complete blocks */
|
|
+ while (len >= 128) {
|
|
+ SHA512_Transform(ctx->state, src);
|
|
+ src += 128;
|
|
+ len -= 128;
|
|
+ }
|
|
+
|
|
+ /* Copy left over data into buffer */
|
|
+ memcpy(ctx->buf, src, len);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * SHA-512 finalization. Pads the input data, exports the hash value,
|
|
+ * and clears the context state.
|
|
+ */
|
|
+void
|
|
+SHA512_Final(unsigned char digest[64], SHA512_CTX * ctx)
|
|
+{
|
|
+
|
|
+ /* Add padding */
|
|
+ SHA512_Pad(ctx);
|
|
+
|
|
+ /* Write the hash */
|
|
+ be64enc_vect(digest, ctx->state, 64);
|
|
+
|
|
+ /* Clear the context state */
|
|
+ memset((void *)ctx, 0, sizeof(*ctx));
|
|
+}
|
|
diff -uprN netcat-openbsd-1.130.bk/Makefile netcat-openbsd-1.130/Makefile
|
|
--- netcat-openbsd-1.130.bk/Makefile 2017-04-13 23:37:45.291164300 +0800
|
|
+++ netcat-openbsd-1.130/Makefile 2017-04-14 00:30:24.101146400 +0800
|
|
@@ -1,12 +1,12 @@
|
|
# $OpenBSD: Makefile,v 1.6 2001/09/02 18:45:41 jakob Exp $
|
|
|
|
PROG= nc
|
|
-SRCS= netcat.c atomicio.c socks.c
|
|
+SRCS= netcat.c atomicio.c socks.c arc4random.c readpassphrase.c getentropy_hurd.c explicit_bzero.c hash/sha512c.c
|
|
|
|
PKG_CONFIG ?= pkg-config
|
|
-LIBS= `$(PKG_CONFIG) --libs libbsd` -lresolv
|
|
+LIBS= -lresolv
|
|
OBJS= $(SRCS:.c=.o)
|
|
-CFLAGS= -g -O2
|
|
+CFLAGS= -g -O2 -I~/usr/include/machine
|
|
LDFLAGS= -Wl,--no-add-needed
|
|
|
|
all: nc
|
|
diff -uprN netcat-openbsd-1.130.bk/netcat.c netcat-openbsd-1.130/netcat.c
|
|
--- netcat-openbsd-1.130.bk/netcat.c 2017-04-13 23:37:45.463285600 +0800
|
|
+++ netcat-openbsd-1.130/netcat.c 2017-04-13 23:50:44.617258500 +0800
|
|
@@ -49,6 +49,8 @@
|
|
# define IPTOS_RELIABILITY 0x04
|
|
# define IPTOS_LOWCOST 0x02
|
|
# define IPTOS_MINCOST IPTOS_LOWCOST
|
|
+#else
|
|
+# define IPTOS_LOWCOST IPTOS_MINCOST
|
|
#endif /* IPTOS_LOWDELAY */
|
|
|
|
# ifndef IPTOS_DSCP_AF11
|
|
@@ -96,8 +98,7 @@
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
-#include <bsd/stdlib.h>
|
|
-#include <bsd/string.h>
|
|
+#include <sys/cdefs.h>
|
|
#include "atomicio.h"
|
|
|
|
#ifndef SUN_LEN
|
|
@@ -180,7 +181,11 @@ static int connect_with_timeout(int fd,
|
|
socklen_t salen, int ctimeout);
|
|
|
|
static void quit();
|
|
-
|
|
+long long
|
|
+strtonum(const char *numstr, long long minval, long long maxval,
|
|
+ const char **errstrp);
|
|
+size_t
|
|
+strlcpy(char *dst, const char *src, size_t siz);
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
@@ -1616,3 +1621,72 @@ static void quit()
|
|
{
|
|
exit(0);
|
|
}
|
|
+
|
|
+size_t
|
|
+strlcpy(char *dst, const char *src, size_t siz)
|
|
+{
|
|
+ char *d = dst;
|
|
+ const char *s = src;
|
|
+ size_t n = siz;
|
|
+
|
|
+ /* Copy as many bytes as will fit */
|
|
+ if (n != 0) {
|
|
+ while (--n != 0) {
|
|
+ if ((*d++ = *s++) == '\0')
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Not enough room in dst, add NUL and traverse rest of src */
|
|
+ if (n == 0) {
|
|
+ if (siz != 0)
|
|
+ *d = '\0'; /* NUL-terminate dst */
|
|
+ while (*s++)
|
|
+ ;
|
|
+ }
|
|
+
|
|
+ return(s - src - 1); /* count does not include NUL */
|
|
+}
|
|
+
|
|
+#define INVALID 1
|
|
+#define TOOSMALL 2
|
|
+#define TOOLARGE 3
|
|
+
|
|
+long long
|
|
+strtonum(const char *numstr, long long minval, long long maxval,
|
|
+ const char **errstrp)
|
|
+{
|
|
+ long long ll = 0;
|
|
+ char *ep;
|
|
+ int error = 0;
|
|
+ struct errval {
|
|
+ const char *errstr;
|
|
+ int err;
|
|
+ } ev[4] = {
|
|
+ { NULL, 0 },
|
|
+ { "invalid", EINVAL },
|
|
+ { "too small", ERANGE },
|
|
+ { "too large", ERANGE },
|
|
+ };
|
|
+
|
|
+ ev[0].err = errno;
|
|
+ errno = 0;
|
|
+ if (minval > maxval)
|
|
+ error = INVALID;
|
|
+ else {
|
|
+ ll = strtoll(numstr, &ep, 10);
|
|
+ if (errno == EINVAL || numstr == ep || *ep != '\0')
|
|
+ error = INVALID;
|
|
+ else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
|
|
+ error = TOOSMALL;
|
|
+ else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
|
|
+ error = TOOLARGE;
|
|
+ }
|
|
+ if (errstrp != NULL)
|
|
+ *errstrp = ev[error].errstr;
|
|
+ errno = ev[error].err;
|
|
+ if (error)
|
|
+ ll = 0;
|
|
+
|
|
+ return (ll);
|
|
+}
|
|
\ No newline at end of file
|
|
diff -uprN netcat-openbsd-1.130.bk/readpassphrase.c netcat-openbsd-1.130/readpassphrase.c
|
|
--- netcat-openbsd-1.130.bk/readpassphrase.c 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/readpassphrase.c 2017-04-13 23:54:33.289325900 +0800
|
|
@@ -0,0 +1,187 @@
|
|
+/* $OpenBSD: readpassphrase.c,v 1.20 2007/10/30 12:03:48 millert Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (c) 2000-2002, 2007 Todd C. Miller <Todd.Miller@courtesan.com>
|
|
+ *
|
|
+ * Permission to use, copy, modify, and distribute this software for any
|
|
+ * purpose with or without fee is hereby granted, provided that the above
|
|
+ * copyright notice and this permission notice appear in all copies.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
+ *
|
|
+ * Sponsored in part by the Defense Advanced Research Projects
|
|
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
|
|
+ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
|
|
+ */
|
|
+
|
|
+#include <ctype.h>
|
|
+#include <errno.h>
|
|
+#include <fcntl.h>
|
|
+#include <paths.h>
|
|
+#include <pwd.h>
|
|
+#include <signal.h>
|
|
+#include <string.h>
|
|
+#include <termios.h>
|
|
+#include <unistd.h>
|
|
+#include "readpassphrase.h"
|
|
+
|
|
+#ifndef TCSASOFT
|
|
+#define TCSASOFT 0
|
|
+#endif
|
|
+
|
|
+static volatile sig_atomic_t signo;
|
|
+
|
|
+static void handler(int);
|
|
+
|
|
+char *
|
|
+readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags)
|
|
+{
|
|
+ ssize_t nr;
|
|
+ int input, output, save_errno;
|
|
+ char ch, *p, *end;
|
|
+ struct termios term, oterm;
|
|
+ struct sigaction sa, savealrm, saveint, savehup, savequit, saveterm;
|
|
+ struct sigaction savetstp, savettin, savettou, savepipe;
|
|
+
|
|
+ /* I suppose we could alloc on demand in this case (XXX). */
|
|
+ if (bufsiz == 0) {
|
|
+ errno = EINVAL;
|
|
+ return(NULL);
|
|
+ }
|
|
+
|
|
+restart:
|
|
+ signo = 0;
|
|
+ nr = -1;
|
|
+ save_errno = 0;
|
|
+ /*
|
|
+ * Read and write to /dev/tty if available. If not, read from
|
|
+ * stdin and write to stderr unless a tty is required.
|
|
+ */
|
|
+ if ((flags & RPP_STDIN) ||
|
|
+ (input = output = open(_PATH_TTY, O_RDWR)) == -1) {
|
|
+ if (flags & RPP_REQUIRE_TTY) {
|
|
+ errno = ENOTTY;
|
|
+ return(NULL);
|
|
+ }
|
|
+ input = STDIN_FILENO;
|
|
+ output = STDERR_FILENO;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Catch signals that would otherwise cause the user to end
|
|
+ * up with echo turned off in the shell. Don't worry about
|
|
+ * things like SIGXCPU and SIGVTALRM for now.
|
|
+ */
|
|
+ sigemptyset(&sa.sa_mask);
|
|
+ sa.sa_flags = 0; /* don't restart system calls */
|
|
+ sa.sa_handler = handler;
|
|
+ (void)sigaction(SIGALRM, &sa, &savealrm);
|
|
+ (void)sigaction(SIGHUP, &sa, &savehup);
|
|
+ (void)sigaction(SIGINT, &sa, &saveint);
|
|
+ (void)sigaction(SIGPIPE, &sa, &savepipe);
|
|
+ (void)sigaction(SIGQUIT, &sa, &savequit);
|
|
+ (void)sigaction(SIGTERM, &sa, &saveterm);
|
|
+ (void)sigaction(SIGTSTP, &sa, &savetstp);
|
|
+ (void)sigaction(SIGTTIN, &sa, &savettin);
|
|
+ (void)sigaction(SIGTTOU, &sa, &savettou);
|
|
+
|
|
+ /* Turn off echo if possible. */
|
|
+ if (input != STDIN_FILENO && tcgetattr(input, &oterm) == 0) {
|
|
+ memcpy(&term, &oterm, sizeof(term));
|
|
+ if (!(flags & RPP_ECHO_ON))
|
|
+ term.c_lflag &= ~(ECHO | ECHONL);
|
|
+#ifdef VSTATUS
|
|
+ if (term.c_cc[VSTATUS] != _POSIX_VDISABLE)
|
|
+ term.c_cc[VSTATUS] = _POSIX_VDISABLE;
|
|
+#endif
|
|
+ (void)tcsetattr(input, TCSAFLUSH|TCSASOFT, &term);
|
|
+ } else {
|
|
+ memset(&term, 0, sizeof(term));
|
|
+ term.c_lflag |= ECHO;
|
|
+ memset(&oterm, 0, sizeof(oterm));
|
|
+ oterm.c_lflag |= ECHO;
|
|
+ }
|
|
+
|
|
+ /* No I/O if we are already backgrounded. */
|
|
+ if (signo != SIGTTOU && signo != SIGTTIN) {
|
|
+ if (!(flags & RPP_STDIN))
|
|
+ (void)write(output, prompt, strlen(prompt));
|
|
+ end = buf + bufsiz - 1;
|
|
+ p = buf;
|
|
+ while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r') {
|
|
+ if (p < end) {
|
|
+ if ((flags & RPP_SEVENBIT))
|
|
+ ch &= 0x7f;
|
|
+ if (isalpha(ch)) {
|
|
+ if ((flags & RPP_FORCELOWER))
|
|
+ ch = (char)tolower(ch);
|
|
+ if ((flags & RPP_FORCEUPPER))
|
|
+ ch = (char)toupper(ch);
|
|
+ }
|
|
+ *p++ = ch;
|
|
+ }
|
|
+ }
|
|
+ *p = '\0';
|
|
+ save_errno = errno;
|
|
+ if (!(term.c_lflag & ECHO))
|
|
+ (void)write(output, "\n", 1);
|
|
+ }
|
|
+
|
|
+ /* Restore old terminal settings and signals. */
|
|
+ if (memcmp(&term, &oterm, sizeof(term)) != 0) {
|
|
+ while (tcsetattr(input, TCSAFLUSH|TCSASOFT, &oterm) == -1 &&
|
|
+ errno == EINTR)
|
|
+ continue;
|
|
+ }
|
|
+ (void)sigaction(SIGALRM, &savealrm, NULL);
|
|
+ (void)sigaction(SIGHUP, &savehup, NULL);
|
|
+ (void)sigaction(SIGINT, &saveint, NULL);
|
|
+ (void)sigaction(SIGQUIT, &savequit, NULL);
|
|
+ (void)sigaction(SIGPIPE, &savepipe, NULL);
|
|
+ (void)sigaction(SIGTERM, &saveterm, NULL);
|
|
+ (void)sigaction(SIGTSTP, &savetstp, NULL);
|
|
+ (void)sigaction(SIGTTIN, &savettin, NULL);
|
|
+ (void)sigaction(SIGTTOU, &savettou, NULL);
|
|
+ if (input != STDIN_FILENO)
|
|
+ (void)close(input);
|
|
+
|
|
+ /*
|
|
+ * If we were interrupted by a signal, resend it to ourselves
|
|
+ * now that we have restored the signal handlers.
|
|
+ */
|
|
+ if (signo) {
|
|
+ kill(getpid(), signo);
|
|
+ switch (signo) {
|
|
+ case SIGTSTP:
|
|
+ case SIGTTIN:
|
|
+ case SIGTTOU:
|
|
+ goto restart;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (save_errno)
|
|
+ errno = save_errno;
|
|
+ return(nr == -1 ? NULL : buf);
|
|
+}
|
|
+
|
|
+#if 0
|
|
+char *
|
|
+getpass(const char *prompt)
|
|
+{
|
|
+ static char buf[_PASSWORD_LEN + 1];
|
|
+
|
|
+ return(readpassphrase(prompt, buf, sizeof(buf), RPP_ECHO_OFF));
|
|
+}
|
|
+#endif
|
|
+
|
|
+static void handler(int s)
|
|
+{
|
|
+
|
|
+ signo = s;
|
|
+}
|
|
diff -uprN netcat-openbsd-1.130.bk/readpassphrase.h netcat-openbsd-1.130/readpassphrase.h
|
|
--- netcat-openbsd-1.130.bk/readpassphrase.h 1970-01-01 08:00:00.000000000 +0800
|
|
+++ netcat-openbsd-1.130/readpassphrase.h 2011-07-06 02:58:44.000000000 +0800
|
|
@@ -0,0 +1,41 @@
|
|
+/* $OpenBSD: readpassphrase.h,v 1.4 2003/06/03 01:52:39 millert Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (c) 2000, 2002 Todd C. Miller <Todd.Miller@courtesan.com>
|
|
+ *
|
|
+ * Permission to use, copy, modify, and distribute this software for any
|
|
+ * purpose with or without fee is hereby granted, provided that the above
|
|
+ * copyright notice and this permission notice appear in all copies.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
+ *
|
|
+ * Sponsored in part by the Defense Advanced Research Projects
|
|
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
|
|
+ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
|
|
+ */
|
|
+
|
|
+#ifndef _READPASSPHRASE_H_
|
|
+#define _READPASSPHRASE_H_
|
|
+
|
|
+#define RPP_ECHO_OFF 0x00 /* Turn off echo (default). */
|
|
+#define RPP_ECHO_ON 0x01 /* Leave echo on. */
|
|
+#define RPP_REQUIRE_TTY 0x02 /* Fail if there is no tty. */
|
|
+#define RPP_FORCELOWER 0x04 /* Force input to lower case. */
|
|
+#define RPP_FORCEUPPER 0x08 /* Force input to upper case. */
|
|
+#define RPP_SEVENBIT 0x10 /* Strip the high bit from input. */
|
|
+#define RPP_STDIN 0x20 /* Read from stdin, not /dev/tty */
|
|
+
|
|
+#include <sys/cdefs.h>
|
|
+#include <sys/types.h>
|
|
+
|
|
+__BEGIN_DECLS
|
|
+char * readpassphrase(const char *, char *, size_t, int);
|
|
+__END_DECLS
|
|
+
|
|
+#endif /* !_READPASSPHRASE_H_ */
|
|
diff -uprN netcat-openbsd-1.130.bk/socks.c netcat-openbsd-1.130/socks.c
|
|
--- netcat-openbsd-1.130.bk/socks.c 2017-04-13 23:37:44.301963600 +0800
|
|
+++ netcat-openbsd-1.130/socks.c 2017-04-13 23:53:42.075212400 +0800
|
|
@@ -38,7 +38,7 @@
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <resolv.h>
|
|
-#include <bsd/readpassphrase.h>
|
|
+#include "readpassphrase.h"
|
|
#include "atomicio.h"
|
|
|
|
#define SOCKS_PORT "1080"
|