diff options
author | Norbert Preining <norbert@preining.info> | 2020-10-12 03:04:00 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-10-12 03:04:00 +0000 |
commit | 0ce40abb18ec02ec6fd6bcc5f21612c88daa7578 (patch) | |
tree | 416289fe1448873fd8ca33051f50ad85bffa8aaa /support/dktools/dk-pwgen.c | |
parent | fdb18507cd80dc17f5a5256153d34668b4f4e61c (diff) |
CTAN sync 202010120303
Diffstat (limited to 'support/dktools/dk-pwgen.c')
-rw-r--r-- | support/dktools/dk-pwgen.c | 2181 |
1 files changed, 0 insertions, 2181 deletions
diff --git a/support/dktools/dk-pwgen.c b/support/dktools/dk-pwgen.c deleted file mode 100644 index 83b025d2c9..0000000000 --- a/support/dktools/dk-pwgen.c +++ /dev/null @@ -1,2181 +0,0 @@ -/* -Copyright (C) 2015-2020, Dirk Krause -SPDX-License-Identifier: BSD-3-Clause -*/ - -/* - WARNING: This file was generated by the dkct program (see - http://dktools.sourceforge.net/ for details). - Changes you make here will be lost if dkct is run again! - You should modify the original source and run dkct on it. - Original source: dk-pwgen.ctr -*/ - -/** @file dk-pwgen.c The dk-pwgen module. -*/ - - -#line 10 "dk-pwgen.ctr" - - -#include "dk4conf.h" - -#if DK4_ON_WINDOWS -/** Allow use of the getenv() function. */ -#define _CRT_SECURE_NO_WARNINGS 1 -#endif - -#if DK4_ON_WINDOWS -#ifndef WINDOWS_H_INCLUDED -#include <windows.h> -#define WINDOWS_H_INCLUDED 1 -#endif -#ifndef WINCRYPT_H_INCLUDED -#include <wincrypt.h> -#define WINCRYPT_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_UNISTD_H -#ifndef UNISTD_H_INCLUDED -#include <unistd.h> -#define UNISTD_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_SYS_TYPES_H -#ifndef SYS_TYPES_H_INCLUDED -#include <sys/types.h> -#define SYS_TYPES_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_SIGNAL_H -#ifndef SIGNAL_H_INCLUDED -#include <signal.h> -#define SIGNAL_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_PROCESS_H -#ifndef PROCESS_H_INCLUDED -#include <process.h> -#define PROCESS_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_IO_H -#ifndef IO_H_INCLUDED -#include <io.h> -#define IO_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_FCNTL_H -#ifndef FCNTL_H_INCLUDED -#include <fcntl.h> -#define FCNTL_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_OPENSSL_RAND_H -#ifndef OPENSSL_RAND_H_INCLUDED -#include <openssl/rand.h> -#define OPENSSL_RAND_H_INCLUDED 1 -#endif -#endif - -#include "dk4types.h" -#include "dk4const.h" -#include "dk4mem.h" -#include "dk4mema.h" -#include "dk4memrs.h" -#include "dk4strd.h" -#include "dk4app.h" -#include "dk4aopt.h" -#include "dk4fput.h" -#include "dk4vers.h" -#include "dk4maiddsz.h" -#include "dk4maasz.h" -#include "dk4mpl.h" -#include "dk4svbufa.h" -#include "dk4unused.h" - -#ifndef DK4WMAIN_H_INCLUDED -#include "dk4wmain.h" -#endif - - - - -#line 101 "dk-pwgen.ctr" - - - -/** Output mode. -*/ -enum { - /** Create normal user password. - */ - DK_PWGEN_MODE_NORMAL = 0 , - - /** Create hard password. - */ - DK_PWGEN_MODE_HARD , - - /** Create binary data. - */ - DK_PWGEN_MODE_BINARY , - - /** Create hexadecimal key, use - lower case a to f. - */ - DK_PWGEN_MODE_HEX_LOWER , - - /** Create hexadecimal key, use - upper case A to F. - */ - DK_PWGEN_MODE_HEX_UPPER , - - /** Create numeric PIN. - */ - DK_PWGEN_MODE_PIN -}; - - -/** Constant texts used by program, not localized. -*/ -static const dkChar * const dk_pwgen_kwnl[] = { -/* 0 */ -dkT("dktools"), - -/* 1 */ -dkT("dk-pwgen.txt"), - -/* 2 */ -dkT("dk-pwgen.str"), - -/* 3 */ -dkT("0123456789abcdef"), - -/* 4 */ -dkT("0123456789ABCDEF"), - -/* 5 */ -dkT("0123456789"), - -/* 6 */ -dkT("-_.:,;<>|#'+*~@^!\"$%&/()=?`{[]}"), - -/* 7 */ -dkT("rand.egd.name"), - -/* 8 */ -dkT("verbose"), - -NULL - - -#line 171 "dk-pwgen.ctr" -}; - - - -static const dkChar * const dk_pwgen_help_text[] = { -dkT(""), -dkT("Generate passwords, PINs and hexadecimal keys"), -dkT(""), -dkT("dk-pwgen [<options>]"), -dkT(""), -dkT("Options:"), -dkT("-h\t\t--hard\t\t\tCreate hard password instead of normal."), -dkT("-b\t\t--binary\t\tCreate binary random data"), -dkT("\t\t\t\t\t(not on Windows)."), -dkT("-p\t\t--pin\t\t\tCreate PIN number."), -dkT("-x\t\t--hex\t\t\tCreate hexadecimal key, use `a'...`f'."), -dkT("-X\t\t--Hex\t\t\tCreate hexadecimal key, use `A'...`F'."), -dkT("-l <range>\t--length=<range>\tLength, i.e. ``8-10''."), -dkT("-u <range>\t--upper-case=<range>\tNumber of uppercase chars in passwords."), -dkT("-d <range>\t--digits=<range>\tNumber of digits in passwords."), -dkT("-s <range>\t--special=<range>\tNumber of special chars in passwords."), -dkT("-n\t\t--no-newline\t\tSuppress newline after output."), -dkT("\t\t--verbose\t\tShow error message on SIGPIPE."), -dkT(""), -dkT("\t\t--help\t\t\tShow this short help text."), -dkT("\t\t--manual\t\t*** SHOW FULL MANUAL. ***"), -dkT("\t\t--version\t\tShow version information."), -dkT("\t\t--license\t\tShow license information."), -dkT(""), -dkT("http://sourceforge.net/p/dktools/wiki/dk-pwgen/"), -dkT(""), -NULL - - -#line 204 "dk-pwgen.ctr" -}; - - - -static const dkChar * const dk_pwgen_license_text[] = { -dkT("This software uses code from the following projects, either directly or as"), -dkT("a library:"), -dkT(""), -dkT("dktools\t\tDirk Krause's tools and libraries."), -dkT("\t\tSee http://sourceforge.net/p/dktools/wiki/Home"), -dkT("\t\tfor more information."), -#if DK4_HAVE_ZLIB_H -dkT(""), -dkT("zlib\t\tData compression library."), -dkT("\t\tSee http://www.zlib.net/ for more information."), -#endif -#if DK4_HAVE_BZLIB_H -dkT(""), -dkT("bzip2\t\tData compression program and library."), -dkT("\t\tSee http://www.bzip.org/ for more information."), -#endif -#if DK4_HAVE_OPENSSL_RAND_H -dkT(""), -dkT("OpenSSL\t\tCryptographic toolkit, used to build file checksums here."), -dkT("\t\tSee http://www.openssl.org/ for more information."), -dkT(""), -dkT("This product includes software developed by the OpenSSL Project for use in"), -dkT("the OpenSSL Toolkit (http://www.openssl.org/)."), -dkT("This product includes cryptographic software written by"), -dkT("Eric Young (eay@cryptsoft.com)."), -dkT("This product includes software written by Tim Hudson (tjh@cryptsoft.com)."), -#endif -dkT(""), -dkT("All the licenses below apply to the program."), -dkT("Licenses for used libraries are shown as found on my Scientific Linux 6.x"), -dkT("computer in the /usr/share/doc directory on 2015-04-01. Check the project"), -dkT("homepages of the used libraries for additional information and/or updated"), -dkT("license terms."), -dkT(""), -dkT(""), -dkT("DK tools and libraries license"), -dkT("=============================="), -dkT("Copyright (c) 2015-2016, Dirk Krause"), -dkT("All rights reserved."), -dkT(""), -dkT("Redistribution and use in source and binary forms, with or without"), -dkT("modification, are permitted provided that the following conditions are met:"), -dkT(""), -dkT("1. Redistributions of source code must retain the above copyright notice,"), -dkT(" this list of conditions and the following disclaimer."), -dkT("2. Redistributions in binary form must reproduce the above copyright"), -dkT(" notice, this list of conditions and the following disclaimer in the"), -dkT(" documentation and/or other materials provided with the distribution."), -dkT("3. Neither the name of the copyright holder nor the names of its"), -dkT(" contributors may be used to endorse or promote products derived from"), -dkT(" this software without specific prior written permission."), -dkT(""), -dkT("THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS"), -dkT("``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT"), -dkT("LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR"), -dkT("A PARTICULAR PURPOSE ARE DISCLAIMED."), -dkT("IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY"), -dkT("DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES"), -dkT("(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR"), -dkT("SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER"), -dkT("CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"), -dkT("LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"), -dkT("OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"), -dkT("SUCH DAMAGE."), -#if DK4_HAVE_ZLIB_H -dkT(""), -dkT(""), -dkT("Zlib license"), -dkT("============"), -dkT("(C) 1995-2004 Jean-loup Gailly and Mark Adler"), -dkT(""), -dkT("This software is provided 'as-is', without any express or implied"), -dkT("warranty. In no event will the authors be held liable for any damages"), -dkT("arising from the use of this software."), -dkT(""), -dkT("Permission is granted to anyone to use this software for any purpose,"), -dkT("including commercial applications, and to alter it and redistribute it"), -dkT("freely, subject to the following restrictions:"), -dkT(""), -dkT("1. The origin of this software must not be misrepresented; you must not"), -dkT(" claim that you wrote the original software. If you use this software"), -dkT(" in a product, an acknowledgment in the product documentation would be"), -dkT(" appreciated but is not required."), -dkT("2. Altered source versions must be plainly marked as such, and must not be"), -dkT(" misrepresented as being the original software."), -dkT("3. This notice may not be removed or altered from any source distribution."), -dkT(""), -dkT("Jean-loup Gailly Mark Adler"), -dkT("jloup@gzip.org madler@alumni.caltech.edu"), -#endif -#if DK4_HAVE_BZLIB_H -dkT(""), -dkT(""), -dkT("Bzip2 and libbzip2 library license"), -dkT("=================================="), -dkT("This program, \"bzip2\", the associated library \"libbzip2\", and all"), -dkT("documentation, are copyright (C) 1996-2007 Julian R Seward. All"), -dkT("rights reserved."), -dkT(""), -dkT("Redistribution and use in source and binary forms, with or without"), -dkT("modification, are permitted provided that the following conditions"), -dkT("are met:"), -dkT(""), -dkT("1. Redistributions of source code must retain the above copyright"), -dkT(" notice, this list of conditions and the following disclaimer."), -dkT(""), -dkT("2. The origin of this software must not be misrepresented; you must "), -dkT(" not claim that you wrote the original software. If you use this "), -dkT(" software in a product, an acknowledgment in the product "), -dkT(" documentation would be appreciated but is not required."), -dkT(""), -dkT("3. Altered source versions must be plainly marked as such, and must"), -dkT(" not be misrepresented as being the original software."), -dkT(""), -dkT("4. The name of the author may not be used to endorse or promote "), -dkT(" products derived from this software without specific prior written "), -dkT(" permission."), -dkT(""), -dkT("THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS"), -dkT("OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED"), -dkT("WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"), -dkT("ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY"), -dkT("DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"), -dkT("DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE"), -dkT("GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"), -dkT("INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,"), -dkT("WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING"), -dkT("NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS"), -dkT("SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."), -dkT(""), -dkT("Julian Seward, jseward@bzip.org"), -dkT("bzip2/libbzip2 version 1.0.5 of 10 December 2007"), -#endif -#if DK4_HAVE_OPENSSL_RAND_H -dkT(""), -dkT(""), -dkT("OpenSSL license"), -dkT("==============="), -dkT(""), -dkT("LICENSE ISSUES"), -dkT("--------------"), -dkT(""), -dkT("The OpenSSL toolkit stays under a dual license, i.e. both the conditions of"), -dkT("the OpenSSL License and the original SSLeay license apply to the toolkit."), -dkT("See below for the actual license texts. Actually both licenses are BSD-style"), -dkT("Open Source licenses. In case of any license issues related to OpenSSL"), -dkT("please contact openssl-core@openssl.org."), -dkT(""), -dkT("OpenSSL License"), -dkT("---------------"), -dkT(""), -dkT("Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved."), -dkT(""), -dkT("Redistribution and use in source and binary forms, with or without"), -dkT("modification, are permitted provided that the following conditions"), -dkT("are met:"), -dkT(""), -dkT("1. Redistributions of source code must retain the above copyright"), -dkT(" notice, this list of conditions and the following disclaimer. "), -dkT(""), -dkT("2. Redistributions in binary form must reproduce the above copyright"), -dkT(" notice, this list of conditions and the following disclaimer in"), -dkT(" the documentation and/or other materials provided with the"), -dkT(" distribution."), -dkT(""), -dkT("3. All advertising materials mentioning features or use of this"), -dkT(" software must display the following acknowledgment:"), -dkT(" \"This product includes software developed by the OpenSSL Project"), -dkT(" for use in the OpenSSL Toolkit. (http://www.openssl.org/)\""), -dkT(""), -dkT("4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to"), -dkT(" endorse or promote products derived from this software without"), -dkT(" prior written permission. For written permission, please contact"), -dkT(" openssl-core@openssl.org."), -dkT(""), -dkT("5. Products derived from this software may not be called \"OpenSSL\""), -dkT(" nor may \"OpenSSL\" appear in their names without prior written"), -dkT(" permission of the OpenSSL Project."), -dkT(""), -dkT("6. Redistributions of any form whatsoever must retain the following"), -dkT(" acknowledgment:"), -dkT(" \"This product includes software developed by the OpenSSL Project"), -dkT(" for use in the OpenSSL Toolkit (http://www.openssl.org/)\""), -dkT(""), -dkT("THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY"), -dkT("EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"), -dkT("IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR"), -dkT("PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR"), -dkT("ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,"), -dkT("SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT"), -dkT("NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;"), -dkT("LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"), -dkT("HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,"), -dkT("STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)"), -dkT("ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED"), -dkT("OF THE POSSIBILITY OF SUCH DAMAGE."), -dkT(""), -dkT("This product includes cryptographic software written by Eric Young"), -dkT("(eay@cryptsoft.com). This product includes software written by Tim"), -dkT("Hudson (tjh@cryptsoft.com)."), -dkT(""), -dkT(""), -dkT("Original SSLeay License"), -dkT("-----------------------"), -dkT(""), -dkT("Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)"), -dkT("All rights reserved."), -dkT(""), -dkT("This package is an SSL implementation written"), -dkT("by Eric Young (eay@cryptsoft.com)."), -dkT("The implementation was written so as to conform with Netscapes SSL."), -dkT(""), -dkT("This library is free for commercial and non-commercial use as long as"), -dkT("the following conditions are aheared to. The following conditions"), -dkT("apply to all code found in this distribution, be it the RC4, RSA,"), -dkT("lhash, DES, etc., code; not just the SSL code. The SSL documentation"), -dkT("included with this distribution is covered by the same copyright terms"), -dkT("except that the holder is Tim Hudson (tjh@cryptsoft.com)."), -dkT(""), -dkT("Copyright remains Eric Young's, and as such any Copyright notices in"), -dkT("the code are not to be removed."), -dkT("If this package is used in a product, Eric Young should be given attribution"), -dkT("as the author of the parts of the library used."), -dkT("This can be in the form of a textual message at program startup or"), -dkT("in documentation (online or textual) provided with the package."), -dkT(""), -dkT("Redistribution and use in source and binary forms, with or without"), -dkT("modification, are permitted provided that the following conditions"), -dkT("are met:"), -dkT("1. Redistributions of source code must retain the copyright"), -dkT(" notice, this list of conditions and the following disclaimer."), -dkT("2. Redistributions in binary form must reproduce the above copyright"), -dkT(" notice, this list of conditions and the following disclaimer in the"), -dkT(" documentation and/or other materials provided with the distribution."), -dkT("3. All advertising materials mentioning features or use of this software"), -dkT(" must display the following acknowledgement:"), -dkT(" \"This product includes cryptographic software written by"), -dkT(" Eric Young (eay@cryptsoft.com)\""), -dkT(" The word 'cryptographic' can be left out if the rouines from the library"), -dkT(" being used are not cryptographic related :-)."), -dkT("4. If you include any Windows specific code (or a derivative thereof) from "), -dkT(" the apps directory (application code) you must include an acknowledgement:"), -dkT(" \"This product includes software written by Tim Hudson (tjh@cryptsoft.com)\""), -dkT(""), -dkT("THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND"), -dkT("ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"), -dkT("IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"), -dkT("ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE"), -dkT("FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"), -dkT("DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS"), -dkT("OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"), -dkT("HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"), -dkT("LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"), -dkT("OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"), -dkT("SUCH DAMAGE."), -dkT(""), -dkT("The licence and distribution terms for any publically available version or"), -dkT("derivative of this code cannot be changed. i.e. this code cannot simply be"), -dkT("copied and put under another distribution licence"), -dkT("[including the GNU Public Licence.]"), -dkT(""), -#endif -dkT(""), -NULL - - -#line 474 "dk-pwgen.ctr" -}; - - - -static const dkChar * const dk_pwgen_kw_def[] = { -/* 0 */ -dkT("OpenSSL PRNG not available!"), - -/* 1 */ -dkT("Failed to set up signal handlers!"), - -/* 2 */ -dkT("Failed to restore signal handlers!"), - -/* 3 */ -dkT("Numeric overflow while reading a size number!"), - -/* 4 */ -dkT("Not a size specification: \""), - -/* 5 */ -dkT("\"!"), - -/* 6 */ -dkT("Failed to retrieve size from text: \""), - -/* 7 */ -dkT("\"!"), - -/* 8 */ -dkT("Options -h, -x, -X, and -p are mutually exclusive!"), - -/* 9 */ -dkT("Option -u ignored for this output type!"), - -/* 10 */ -dkT("Option -d ignored for this output type!"), - -/* 11 */ -dkT("Option -s ignored for this output type!"), - -/* 12 */ -dkT("Conflicting ranges for -l and -u/-d/-s!"), - -/* 13 */ -dkT("Numeric overflow in password length calculation!"), - -/* 14 */ -dkT("Failed to obtain random data from cryptographic context!"), - -/* 15 */ -dkT("Failed to acquire cryptographic context!"), - -/* 16 */ -dkT("Failed to open /dev/random and /dev/urandom devices!"), - -/* 17 */ -dkT("Failed to obtain random data!"), - -/* 18 */ -dkT("Failed to seed OpenSSL PRNG!"), - -/* 19 */ -dkT("Aborted by SIGTERM signal!"), - -/* 20 */ -dkT("Aborted by SIGINT signal!"), - -/* 21 */ -dkT("Aborted by SIGPIPE signal!"), - -/* 22 */ -dkT("Write attempt to standard output failed!"), - -/* 23 */ -dkT("Seeding PRNG using OpenSSL builtin functions."), - -/* 24 */ -dkT("Seeding PRNG from EGD socket."), - -/* 25 */ -dkT("Seeding PRNG from Windows cryptographic context."), - -/* 26 */ -dkT("Seeding PRNG from screen contents."), - -/* 27 */ -dkT("Seeding PRNG from /dev/random or /dev/urandom device."), - -/* 28 */ -dkT("Seeding PRNG from EGD socket specified by preference."), - -/* 29 */ -dkT("Options -b, -h, -x, -X, and -p are mutually exclusive!"), - -/* 30 */ -dkT("Failed to reset used memory!"), - -/* 31 */ -dkT("The -b option is not supported on Windows!"), - -NULL - - -#line 591 "dk-pwgen.ctr" -}; - - - -/** Options understood by program. -*/ -static const dk4_option_specification_t dk_pwgen_options[] = { - { dkT('h'), dkT("hard"), DK4_OPT_ARG_NONE }, - { dkT('b'), dkT("binary"), DK4_OPT_ARG_NONE }, - { dkT('x'), dkT("hex"), DK4_OPT_ARG_NONE }, - { dkT('X'), dkT("Hex"), DK4_OPT_ARG_NONE }, - { dkT('p'), dkT("pin"), DK4_OPT_ARG_NONE }, - { dkT('l'), dkT("length"), DK4_OPT_ARG_STRING }, - { dkT('u'), dkT("upper-case"), DK4_OPT_ARG_STRING }, - { dkT('d'), dkT("digits"), DK4_OPT_ARG_STRING }, - { dkT('s'), dkT("special"), DK4_OPT_ARG_STRING }, - { dkT('n'), dkT("no-newline"), DK4_OPT_ARG_NONE }, - { dkT('\0'), dkT("verbose"), DK4_OPT_ARG_NONE } -}; - - - -#ifndef BUFSIZ -#define BUFSIZ 8192 -#endif - - -/** Use an explicitly specified buffer for stdout operations - so we can securely reset the memory before exiting. -*/ -static char stdout_buffer[BUFSIZ]; - - - -/** Use an explicitly specified buffer when reading seed file - so we can securely reset the memory before exiting. -*/ -#if (!(DK4_ON_WINDOWS)) -static char seed_file_buf[BUFSIZ]; -#endif - - - -/** Localized version if available, otherwise default texts. -*/ -static const dkChar * const *dk_pwgen_msg = dk_pwgen_kw_def; - - - -/** Application structure. -*/ -static dk4_app_t *app = NULL; - - - -/** Number of elements in dk_pwgen_msg array. -*/ -static size_t dk_pwgen_sz_msg = -sizeof(dk_pwgen_kw_def)/sizeof(DK4_PCDKCHAR) - 1; - - -/** Number of elements in dk_pwgen_options array. -*/ -static const size_t dk_pwgen_sz_options = -sizeof(dk_pwgen_options)/sizeof(dk4_option_specification_t); - - - -/** Minimum output length. -*/ -static size_t length_min = 8; - - - -/** Maximum output length. -*/ -static size_t length_max = 10; - - - -/** Output length to produce. -*/ -static size_t length = 8; - - - -/** Minimum number of upper case characters. -*/ -static size_t upper_min = 1; - - - -/** Maximum number of upper case characters. -*/ -static size_t upper_max = 2; - - - -/** Number of upper case characters to produce. -*/ -static size_t upper = 1; - - - -/** Minimum number of digits. -*/ -static size_t digit_min = 1; - - - -/** Maximum number of digits. -*/ -static size_t digit_max = 2; - - - -/** Number of digits to produce. -*/ -static size_t digits = 1; - - - -/** Minimum number of special characters. -*/ -static size_t special_min = 1; - - - -/** Maximum number of special characters. -*/ -static size_t special_max = 2; - - - -/** Number of special characters to produce. -*/ -static size_t specials = 1; - - - -/** Flag: Errors occured while writing to stdout. -*/ -static int output_error = 0; - - - -/** Flag: Verbose output (report SIGPIPE). -*/ -static int verbose = 1; - - - -/** Exit status code. -*/ -static int exval = EXIT_FAILURE; - - - -/** Output type to produce. -*/ -static int output_type = DK_PWGEN_MODE_NORMAL; - - - -#if DK4_HAVE_OPENSSL_RAND_H - - - -#ifdef SIGPIPE -/** Indicator: SIGPIPE signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_pipe = 0; -#endif - -/** Indicator: SIGINT signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_int = 0; - -/** Indicator: SIGTERM signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_term = 0; - - - -/** Pass a volatile pointer to an atomic integer. - This function is necessary as some compilers mis-optimize - direct access to volatile variables (at least if you believe - one of the coding standards). - @param ptr Address of atomic integer variable. - @return The unmodified pointer. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t * -sig_pass_pointer(DK4_VOLATILE dk4_sig_atomic_t *ptr) -{ - return ptr; -} - - - -#ifdef SIGPIPE -/** Handler for SIGPIPE signal. - @param signo Signal number (always SIGPIPE, ignored). -*/ -static -void -sig_handler_pipe(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_pipe) = 1; -} -#endif - -/** Handler for SIGINT signal. - @param signo Signal number (always SIGINT, ignored). -*/ -static -void -sig_handler_int(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_int) = 1; -} - -/** Handler for SIGTERM signal. - @param signo Signal number (always SIGTERM, ignored). -*/ -static -void -sig_handler_term(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_term) = 1; -} - -/** Read value from volatile atomic type. - This function is necessary as some compilers mis-optimize - direct access to volatile variables (at least if you believe - one of the coding standards). - @param ap Pointer to volatile atomic variable. - @return Contents of the variable. -*/ -static -dk4_sig_atomic_t -sig_read_atomic(DK4_VOLATILE dk4_sig_atomic_t *ap) -{ - return (*ap); -} - -/** Check whether we can continue or if a signal was received. - @param check_pipe Flag: Check for occured SIGPIPE signal too. - @return 1 if the program can continue, 0 if a signal was received. -*/ -static -int -sig_can_continue( -#ifdef SIGPIPE -int check_pipe -#else -int DK4_ARG_UNUSED(check_pipe) -#endif -) -{ - int back = 1; -#ifndef SIGPIPE - DK4_UNUSED_ARG(check_pipe) -#else - if (0 != check_pipe) { - if (0 != sig_read_atomic(&sig_had_pipe)) { back = 0; } - } -#endif - if (0 != sig_read_atomic(&sig_had_int )) { back = 0; } - if (0 != sig_read_atomic(&sig_had_term)) { back = 0; } - return back; -} - - - -/** Check whether we can continue. - @return 1 for yes, 0 for no. -*/ -static -int -dk_pwgen_can_continue(void) -{ - int back = 1; - if (0 == sig_can_continue(1)) { - back = 0; - } - return back; -} - - - -/** Read range from text to size_t variables. - @param minptr Address of minimum variable. - @param maxptr Address of maximum variable. - @param buf Buffer containing the text. - @return 1 on success, 0 on error. -*/ -static -int -dk_pwgen_opt_range(size_t *minptr, size_t *maxptr, dkChar option) -{ - dkChar buf[32*sizeof(dk4_um_t)]; - dk4_er_t er; - const dkChar *endptr; - dkChar *p1 = NULL; - size_t val; - int res; - int rdf = 0; - int back = 0; - int passno = 0; - - -#line 912 "dk-pwgen.ctr" - dk4error_init(&er); - if (0 != dk4app_opt_is_set_long(app, dk_pwgen_kwnl[8], NULL)) { - verbose = 1; - } - if (0 != dk4app_opt_is_set_short(app, option, NULL)) { - res = dk4app_opt_get_string_short( - buf, DK4_SIZEOF(buf,dkChar), app, option, NULL - ); - if (0 != res) { - -#line 921 "dk-pwgen.ctr" - p1 = dk4str_chr(buf, dkT('-')); - if (NULL != p1) { - -#line 923 "dk-pwgen.ctr" - *(p1++) = dkT('\0'); - p1 = dk4str_start(p1, NULL); - } else { - -#line 926 "dk-pwgen.ctr" - } - val = 0; - endptr = NULL; - if (0 != dk4ma_input_dk_dec_size_t(&val, buf, &endptr, 1, &er)) { - *minptr = val; - *maxptr = val; - back = 1; - if (NULL != p1) { - -#line 934 "dk-pwgen.ctr" - passno = 1; - back = 0; - val = 0; - endptr = NULL; - if (0 != dk4ma_input_dk_dec_size_t(&val, p1, &endptr, 1, &er)) { - *maxptr = val; - back = 1; - if (*maxptr < *minptr) { - val = *maxptr; - *maxptr = *minptr; - *minptr = val; - } - } else { - -#line 947 "dk-pwgen.ctr" - /* ERROR: Failed to read size */ - rdf = 1; - } - } - } else { - -#line 952 "dk-pwgen.ctr" - /* ERROR: Failed to read size */ - rdf = 1; - } - } else { - -#line 956 "dk-pwgen.ctr" - /* ERROR: Failed to obtain option argument, probably bug */ - } - } else { - -#line 959 "dk-pwgen.ctr" - back = 1; - } - if ((0 == back) && (0 != rdf)) { - switch (er.ec) { - case DK4_E_MATH_OVERFLOW : { - -#line 964 "dk-pwgen.ctr" - /* ERROR: Numeric overflow while reading number */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 3); - } break; - case DK4_E_SYNTAX : { - -#line 968 "dk-pwgen.ctr" - /* ERROR: Not a size specification */ - dk4app_log_3( - app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 4, 5, - ((0 == passno) ? buf : p1) - ); - } break; - default: { - -#line 975 "dk-pwgen.ctr" - /* ERROR: Failed to read size */ - dk4app_log_3( - app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 6, 7, - ((0 == passno) ? buf : p1) - ); - } break; - } - } - -#line 983 "dk-pwgen.ctr" - return back; -} - - - -/** Process command line options. - @return 1 on success, 0 on error (invalid option combination). -*/ -static -int -dk_pwgen_check_options(void) -{ - dk4_er_t er; - size_t val; - int back = 0; - - -#line 999 "dk-pwgen.ctr" - - if (0 != dk4app_opt_is_set_short(app, dkT('b'), NULL)) { - output_type = DK_PWGEN_MODE_BINARY; - if ( - (0 != dk4app_opt_is_set_short(app, dkT('h'), NULL)) - || (0 != dk4app_opt_is_set_short(app, dkT('x'), NULL)) - || (0 != dk4app_opt_is_set_short(app, dkT('X'), NULL)) - || (0 != dk4app_opt_is_set_short(app, dkT('p'), NULL)) - ) - { - /* ERROR: Options -b, -h, -x, -X and -p are mutually exclusive! */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 29); - goto finished; - } - else - { - back = 1; - } - } else { - if (0 != dk4app_opt_is_set_short(app, dkT('h'), NULL)) { - output_type = DK_PWGEN_MODE_HARD; - if ( - (0 != dk4app_opt_is_set_short(app, dkT('x'), NULL)) - || (0 != dk4app_opt_is_set_short(app, dkT('X'), NULL)) - || (0 != dk4app_opt_is_set_short(app, dkT('p'), NULL)) - ) - { - /* ERROR: Options -h, -x, -X and -p are mutually exclusive! */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 8); - goto finished; - } - else - { - back = 1; - } - } else { - if (0 != dk4app_opt_is_set_short(app, dkT('x'), NULL)) { - output_type = DK_PWGEN_MODE_HEX_LOWER; - if ( - (0 != dk4app_opt_is_set_short(app, dkT('X'), NULL)) - || (0 != dk4app_opt_is_set_short(app, dkT('p'), NULL)) - ) - { - /* ERROR: Options -h, -x, -X and -p are mutually exclusive! */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 8); - goto finished; - } - else - { - back = 1; - } - } else { - if (0 != dk4app_opt_is_set_short(app, dkT('X'), NULL)) { - output_type = DK_PWGEN_MODE_HEX_UPPER; - if (0 != dk4app_opt_is_set_short(app, dkT('p'), NULL)) { - /* ERROR: Options -h, -x, -X and -p are mutually exclusive! */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 8); - goto finished; - } else { - back = 1; - } - } else { - if (0 != dk4app_opt_is_set_short(app, dkT('p'), NULL)) { - output_type = DK_PWGEN_MODE_PIN; - } - back = 1; - } - } - } - } - if (1 == back) { - if (0 == dk_pwgen_opt_range(&length_min, &length_max, dkT('l'))) { - back = 0; - } - if (1 == back) { - switch (output_type) { - case DK_PWGEN_MODE_HARD : - case DK_PWGEN_MODE_HEX_LOWER : - case DK_PWGEN_MODE_HEX_UPPER : - case DK_PWGEN_MODE_PIN : - { - if (0 != dk4app_opt_is_set_short(app, dkT('u'), NULL)) { - /* WARNING: Option ignored */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 9); - } - if (0 != dk4app_opt_is_set_short(app, dkT('d'), NULL)) { - /* WARNING: Option ignored */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 10); - } - if (0 != dk4app_opt_is_set_short(app, dkT('s'), NULL)) { - /* WARNING: Option ignored */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 11); - } - } break; - default : { - if (0 != dk_pwgen_opt_range(&upper_min, &upper_max, dkT('u'))) { - if (0 != dk_pwgen_opt_range(&digit_min, &digit_max, dkT('d'))) { - if (0 != dk_pwgen_opt_range(&special_min, &special_max, dkT('s'))) - { - dk4error_init(&er); - val = dk4ma_size_t_add(upper_max, digit_max, &er); - val = dk4ma_size_t_add(val, special_max, &er); - if (DK4_E_NONE == er.ec) { - if (val > length_min) { - back = 0; - /* ERROR: Illegal range combination */ - dk4app_log_1( - app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 12 - ); - } - } else { - /* ERROR: Numeric overflow in size calculation */ - dk4app_log_1( - app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 13 - ); - } - } else { - back = 0; - } - } else { - back = 0; - } - } else { - back = 0; - } - } break; - } - } - } - finished: - - -#line 1130 "dk-pwgen.ctr" - return back; -} - - - -/** Seed PRNG. - @return 1 on success, 0 on error (not enough seed data). -*/ -static -int -dk_pwgen_seed_prng(void) -{ -#if DK4_CHAR_SIZE == 1 -#if DK4_HAVE_RAND_EGD && DK4_HAVE_STRUCT_SOCKADDR_UN - dkChar snb[DK4_MAX_PATH]; -#endif -#endif - char buffer[64]; -#if DK4_HAVE_RAND_EGD && DK4_HAVE_STRUCT_SOCKADDR_UN - char *envptr; -#endif -#if DK4_ON_WINDOWS - HCRYPTPROV hcp; - BOOL res; -#else - FILE *fipo; - size_t rdb; -#endif - int cc; - int rounds = 0; - int back = 0; -#if (!(DK4_ON_WINDOWS)) - int svbres = 0; -#endif - - -#line 1165 "dk-pwgen.ctr" - - /* Let OpenSSL library functions try to initialize. - */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_DEBUG, 23); - if (1 == RAND_status()) { - back = 1; - goto finished; - } - -#if DK4_HAVE_RAND_EGD && DK4_HAVE_STRUCT_SOCKADDR_UN - /* Attempt EGD socket if specified in environment. - */ - envptr = getenv("EGDSOCKET"); - if (NULL != envptr) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_DEBUG, 24); - if (0 < RAND_egd(envptr)) { - if (1 == RAND_status()) { - back = 1; - goto finished; - } - } - } - - /* Attempt EGD socket defined by preference. - The RAND_egd() function accepts char, not dkChar. - */ -#if DK4_CHAR_SIZE == 1 - if (0 != dk4app_pref_get(snb,DK4_SIZEOF(snb,dkChar),app,dk_pwgen_kwnl[7],0)) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_DEBUG, 28); - if (0 < RAND_egd(snb)) { - if (1 == RAND_status()) { - back = 1; - goto finished; - } - } - } -#endif -#endif - - /* Use platform specific mechanisms if available. - */ -#if DK4_ON_WINDOWS - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_DEBUG, 25); - res = CryptAcquireContext( - &hcp, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT - ); - if (res) { - cc = 1; - do { - if (0 != dk_pwgen_can_continue()) { - res = CryptGenRandom(hcp, (DWORD)sizeof(buffer), (BYTE *)buffer); - if (res) { - RAND_seed(buffer, sizeof(buffer)); - if (1 == RAND_status()) { - cc = 0; - back = 1; - } else { - rounds++; - } - } else { - cc = -1; - /* ERROR: Failed to obtain random bytes from crypto context */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 14); - } - } else { - cc = -1; - } - } while ((1 == cc) && (128 > rounds)); - CryptReleaseContext(hcp, (DWORD)0UL); - dk4mem_reset_secure(buffer, sizeof(buffer), NULL); - if (0 == back) { - if (0 != dk_pwgen_can_continue()) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_DEBUG, 25); - RAND_screen(); - if (1 == RAND_status()) { - back = 1; - } - } - } - } else { - /* ERROR: Failed to acquire crypto context */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 15); - } -#else - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_DEBUG, 27); - fipo = fopen("/dev/random", "rb"); - if (NULL == fipo) { - fipo = fopen("/dev/urandom", "rb"); - } - if (NULL != fipo) { - dk4mem_reset(seed_file_buf, sizeof(seed_file_buf), NULL); - svbres = dk4setvbuf( - fipo, DK4_FILE_FULL_BUFFERING, seed_file_buf, sizeof(seed_file_buf), NULL - ); - if (0 != svbres) { - cc = 1; - do { - if (0 != dk_pwgen_can_continue()) { - rdb = fread(buffer, 1, sizeof(buffer), fipo); - if (0 < rdb) { - RAND_seed(buffer, rdb); - if (1 == RAND_status()) { - cc = 0; - back = 1; - } else { - rounds++; - } - } else { - cc = -1; - } - } else { - cc = -1; - } - } while ((1 == cc) && (128 > rounds)); - } else { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 16); - } - fclose(fipo); - dk4mem_reset_secure(seed_file_buf, sizeof(seed_file_buf), NULL); - dk4mem_reset_secure(buffer, sizeof(buffer), NULL); - } else { - /* ERROR: Failed to open both /dev/random and /dev/urandom */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 16); - } -#endif - - finished: - - -#line 1293 "dk-pwgen.ctr" - return back; -} - - - -/** Find a random number in a given range. - @param dptr Address of destination variable. - @param min Minimum value. - @param max Maximum value. - @return 1 on success, 0 on error. -*/ -static -int -dk_pwgen_value_in_range(size_t *dptr, size_t min, size_t max) -{ - size_t width; - size_t rval; - int back = 0; - - -#line 1312 "dk-pwgen.ctr" - if (max > min) { - width = max - min; - if (0 != (width + 1)) { width++ ; } - if (0 < RAND_bytes((unsigned char *)(&rval), (int)sizeof(rval))) { - - -#line 1317 "dk-pwgen.ctr" - *dptr = min + (rval % width); - back = 1; - } else { - /* ERROR: Failed to obtain random bytes */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 17); - } - } else { - *dptr = min; - back = 1; - } - - -#line 1328 "dk-pwgen.ctr" - return back; -} - - - -/** Create hexadecimal key and write to standard output. - @param upper Flag: Use upper case `a' to `f'. -*/ -static -void -dk_pwgen_output_hex(int upper) -{ - unsigned char buf[8]; /* Buffer for 8 random bytes */ - size_t i; /* Index of current output character */ - size_t bi; /* Index in buffer 0 to 7 */ - size_t j; /* Index in hexademical digits string */ - int cc; /* Flag: Can continue 1=yes,0=no,-1=abort */ - dkChar dc; /* Current character to write */ - - -#line 1347 "dk-pwgen.ctr" - cc = 1; - i = 0; - bi = 0; - do { - if (0 != dk_pwgen_can_continue()) { - if (i < length) { - - - - if (0 == (i % 16)) { - bi = 0; - if (0 < RAND_bytes(buf, (int)sizeof(buf))) { - cc = 1; - } else { - cc = -1; - exval = EXIT_FAILURE; - /* ERROR: Random */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 17); - } - } - if (1 == cc) { - j = (size_t)(buf[bi / 2]); - j = 0x00FFU & j; - if (0 == (i % 2)) { - j = j >> 4; - } - j &= 0x000FU; - dc = (dk_pwgen_kwnl[(0 != upper) ? 4 : 3])[j]; - if (0 == dk4fputc(dc, stdout, NULL)) { output_error = 1; cc = -1; } - } - i++; bi++; - } else { - cc = 0; - } - } else { - cc = -1; - } - } while (1 == cc); - if (0 == dk4mem_reset_secure(buf, sizeof(buf), NULL)) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } - dc = dkT('\0'); j = 0; - if ((0 != j) || (dkT('\0') != dc)) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } - - -#line 1395 "dk-pwgen.ctr" -} - - - -/** Create hard password and write to standard output. -*/ -static -void -dk_pwgen_output_hard(void) -{ - dk4_um_t val; - size_t i; - int cc; - dkChar dc; - - i = 0; cc = 1; - do { - if (0 != dk_pwgen_can_continue()) { - if (i < length) { - if (0 < RAND_bytes((unsigned char *)(&val), (int)sizeof(dk4_um_t))) { - dc = (dkChar)33 + (dkChar)(val % (dk4_um_t)90U); - if (0 == dk4fputc(dc, stdout, NULL)) { - output_error = 1; - cc = -1; - } - } else { - cc = -1; - exval = EXIT_FAILURE; - /* ERROR: Random */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 17); - } - i++; - } else { - cc = 0; - } - } else { - cc = -1; - } - } while (1 == cc); - val = (dk4_um_t)0UL; dc = dkT('\0'); - if ((val != (dk4_um_t)0UL) || (dc != dkT('\0'))) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } -} - - - -/** Create binary password and write to standard output. -*/ -static -void -dk_pwgen_output_binary(void) -{ -#if !DK4_ON_WINDOWS - char buf[256]; - size_t i; - size_t remaining; - size_t wrb; - int cc; -#endif - -#if DK4_ON_WINDOWS - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 31); - exval = EXIT_FAILURE; -#else - remaining = length; - cc = 1; - do { - if (0 != dk_pwgen_can_continue()) { - i = sizeof(buf); - if (remaining < i) { i = remaining; } - if (0 == i) { - cc = 0; - } else { - if (0 < RAND_bytes((unsigned char *)buf, (int)i)) { - wrb = fwrite(buf, 1, i, stdout); - if (i == wrb) { - if (i >= remaining) { - cc = 0; - } else { - remaining = remaining - i; - } - } else { - cc = -1; - exval = EXIT_FAILURE; - output_error = 1; - } - } else { - cc = -1; - exval = EXIT_FAILURE; - /* ERROR: Random */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 17); - } - } - } else { - cc = -1; - } - } while ((1 == cc) && (0 < remaining)); - if (0 != fflush(stdout)) { - exval = EXIT_FAILURE; - output_error = 1; - } - if (0 == dk4mem_reset_secure(buf, sizeof(buf), NULL)) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } -#endif -} - - -/** Create numeric PIN and write to standard output. -*/ -static -void -dk_pwgen_output_pin(void) -{ - dk4_um_t val; - size_t i; - int cc; - dkChar dc; - - i = 0; cc = 1; - do { - if (0 != dk_pwgen_can_continue()) { - if (i < length) { - if (0 < RAND_bytes((unsigned char *)(&val), (int)sizeof(dk4_um_t))) { - dc = dkT('0') + (dkChar)(val % (dk4_um_t)10U); - if (0 == dk4fputc(dc, stdout, NULL)) { - output_error = 1; - cc = -1; - } - } else { - cc = -1; - exval = EXIT_FAILURE; - /* ERROR: Random */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 17); - } - i++; - } else { - cc = 0; - } - } else { - cc = -1; - } - } while (1 == cc); - dc = dkT('\0'); - if (dc != dkT('\0')) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } -} - - - -/** Create normal password and write to standard output. -*/ -static -void -dk_pwgen_output_normal(void) -{ - char *ti = NULL; /* Cells */ - dk4_um_t val; /* Value */ - size_t avail; /* Number of unused cells */ - size_t curel; /* Current element within group */ - size_t ind_to_set; /* Index of unused cell to set */ - size_t i; /* Traverse all cells */ - size_t max; /* Number of elements within pass */ - size_t speclen; /* Length of string containing special */ - int passno; /* Current pass */ - int cc; /* Flag: No error yet, can continue */ - int res; /* Operation result */ - dkChar dc; /* Character to write */ - char ic; /* Indicator character */ - - ti = dk4mem_new_app(char,length,app); - if (NULL != ti) { - -#line 1572 "dk-pwgen.ctr" - DK4_MEMRES(ti, length); - cc = 1; - if (0 == dk_pwgen_value_in_range(&upper, upper_min, upper_max)) { - cc = 0; - } - if (0 == dk_pwgen_value_in_range(&digits, digit_min, digit_max)) { - cc = 0; - } - if (0 == dk_pwgen_value_in_range(&specials, special_min, special_max)) { - cc = 0; - } - if (1 == cc) { - passno = 0; - avail = length; - while (3 > passno) { - -#line 1587 "dk-pwgen.ctr" - switch (passno) { - case 2 : { - max = specials; - ic = 's'; - } break; - case 1 : { - max = digits; - ic = 'd'; - } break; - default : { - max = upper; - ic = 'u'; - } break; - } - curel = 0; - while (curel < max) { - - -#line 1604 "dk-pwgen.ctr" - if (0 != dk_pwgen_can_continue()) { - res = RAND_bytes( - (unsigned char *)(&ind_to_set), (int)sizeof(size_t) - ); - if (0 < res) { - if (0 < avail) { - ind_to_set = ind_to_set % avail; - - -#line 1612 "dk-pwgen.ctr" - res = 0; - i = 0; - while (i < length) { - - -#line 1616 "dk-pwgen.ctr" - if ('\0' == ti[i]) { - if (0 == ind_to_set) { - - -#line 1619 "dk-pwgen.ctr" - res = 1; - ti[i] = ic; - i = length - 1; - avail--; - } else { - ind_to_set--; - } - } else { - -#line 1627 "dk-pwgen.ctr" - } - i++; - } - curel++; - if (0 == res) { - -#line 1632 "dk-pwgen.ctr" - /* No free cell found */ - curel = max; passno = 3; cc = 0; - dk4app_log_1( - app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 12 - ); - } - } else { - /* No more cells available */ - curel = max; passno = 3; cc = 0; - dk4app_log_1( - app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 12 - ); - } - } else { - /* ERROR: Random data */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 17); - curel = max; passno = 3; cc = 0; - } - } else { - curel = max; passno = 3; cc = 0; - } - } - passno++; - if (0 == dk_pwgen_can_continue()) { passno = 3; } - } - if ((1 == cc) && (0 != dk_pwgen_can_continue())) { - -#line 1658 "dk-pwgen.ctr" - i = 0; - speclen = dk4str_len(dk_pwgen_kwnl[6]); - - -#line 1661 "dk-pwgen.ctr" - while (i < length) { - - -#line 1663 "dk-pwgen.ctr" - if (0 != dk_pwgen_can_continue()) { - res = RAND_bytes( - (unsigned char *)(&val), (int)sizeof(dk4_um_t) - ); - if (0 < res) { - - -#line 1669 "dk-pwgen.ctr" - switch (ti[i]) { - case 's': { - val = val % (dk4_um_t)speclen; - - -#line 1673 "dk-pwgen.ctr" - dc = (dk_pwgen_kwnl[6])[(size_t)val]; - } break; - case 'd': { - val = val % (dk4_um_t)10UL; - dc = dkT('0') + (dkChar)val; - } break; - case 'u': { - val = val % (dk4_um_t)26UL; - dc = dkT('A') + (dkChar)val; - } break; - default: { - val = val % (dk4_um_t)26UL; - dc = dkT('a') + (dkChar)val; - } break; - } - if (0 == dk4fputc(dc, stdout, NULL)) { - output_error = 1; - } - i++; - } else { - i = length; - exval = EXIT_FAILURE; - /* ERROR: Random */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 17); - } - } else { - i = length; - } - } - } else { - exval = EXIT_FAILURE; - } - } else { - exval = EXIT_FAILURE; - /* Failed to obtain random */ - } - if (0 == dk4mem_reset_secure(ti, length, NULL)) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } - dk4mem_free(ti); - dc = dkT('\0'); - if (dc != dkT('\0')) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } - } else { - -#line 1720 "dk-pwgen.ctr" - exval = EXIT_FAILURE; - /* ERROR: Memory, already reported */ - } -} - - - -/** Create password, PIN or key and write to output. -*/ -static -void -dk_pwgen_produce_output(void) -{ - - -#line 1734 "dk-pwgen.ctr" - if (0 != dk_pwgen_value_in_range(&length, length_min, length_max)) { - exval = EXIT_SUCCESS; - switch (output_type) { - case DK_PWGEN_MODE_BINARY : { - -#line 1738 "dk-pwgen.ctr" - dk_pwgen_output_binary(); - } break; - case DK_PWGEN_MODE_HARD : { - -#line 1741 "dk-pwgen.ctr" - dk_pwgen_output_hard(); - } break; - case DK_PWGEN_MODE_HEX_LOWER : { - -#line 1744 "dk-pwgen.ctr" - dk_pwgen_output_hex(0); - } break; - case DK_PWGEN_MODE_HEX_UPPER : { - -#line 1747 "dk-pwgen.ctr" - dk_pwgen_output_hex(1); - } break; - case DK_PWGEN_MODE_PIN : { - -#line 1750 "dk-pwgen.ctr" - dk_pwgen_output_pin(); - } break; - default : { - -#line 1753 "dk-pwgen.ctr" - dk_pwgen_output_normal(); - } break; - } - if (0 == dk4app_opt_is_set_short(app, dkT('n'), NULL)) { - if (DK_PWGEN_MODE_BINARY != output_type) { - if (0 == dk4fputc(dkT('\n'), stdout, NULL)) { - output_error = 1; - } - } - } - } - - -#line 1765 "dk-pwgen.ctr" -} - - - -/** Run normally with signal handlers installed. -*/ -static -void -dk_pwgen_normal_run(void) -{ - - -#line 1776 "dk-pwgen.ctr" - if (0 < dk_pwgen_check_options()) { - if (0 < dk_pwgen_seed_prng()) { - dk_pwgen_produce_output(); - } else { - /* ERROR: Failed to seed PRNG */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 18); - } - RAND_cleanup(); - } - - -#line 1786 "dk-pwgen.ctr" -} - - - - -#if DK4_HAVE_SIGACTION -/** Set signal handlers and run. -*/ -static -void -dk_pwgen_run_with_signal_handlers(void) -{ -#ifdef SIGPIPE - struct sigaction opipe; -#endif - struct sigaction oint; -#ifdef SIGPIPE - struct sigaction npipe; -#endif - struct sigaction nint; - struct sigaction oterm; - struct sigaction nterm; - int success = 0; - -#ifdef SIGPIPE - /* Set up signal handling for SIGPIPE. - */ - DK4_MEMRES(&npipe, sizeof(npipe)); - npipe.sa_handler = sig_handler_pipe; - npipe.sa_flags = 0; - if (0 != sigemptyset(&npipe.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGPIPE */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto finished; - } - if (0 != sigaddset(&npipe.sa_mask, SIGPIPE)) { - /* ERROR: Failed to set up masked signal set for SIGPIPE */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto finished; - } - if (0 != sigaction(SIGPIPE, &npipe, &opipe)) { - /* ERROR: Failed to set up signal handler for SIGPIPE */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto finished; - } -#endif - - /* Set up signal handling for SIGINT. - */ - DK4_MEMRES(&nint, sizeof(nint)); - nint.sa_handler = sig_handler_int; - nint.sa_flags = 0; - if (0 != sigemptyset(&nint.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGINT */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto restore_old_pipe; - } - if (0 != sigaddset(&nint.sa_mask, SIGINT)) { - /* ERROR: Failed to set up masked signal set for SIGINT */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto restore_old_pipe; - } - if (0 != sigaction(SIGINT, &nint, &oint)) { - /* ERROR: Failed to set up signal handler for SIGINT */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto restore_old_pipe; - } - - /* Set up signal handling for SIGTERM - */ - DK4_MEMRES(&nterm, sizeof(nterm)); - nterm.sa_handler = sig_handler_term; - nterm.sa_flags = 0; - if (0 != sigemptyset(&nterm.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGTERM */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto restore_old_int; - } - if (0 != sigaddset(&nterm.sa_mask, SIGTERM)) { - /* ERROR: Failed to set up masked signal set for SIGTERM */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto restore_old_int; - } - if (0 != sigaction(SIGTERM, &nterm, &oterm)) { - /* ERROR: Failed to set up signal handler for SIGTERM */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 1); - goto restore_old_int; - } - - success = 1; - dk_pwgen_normal_run(); - - /* Restore signal handling for SIGTERM. - */ - if (0 != sigaction(SIGTERM, &oterm, NULL)) { - /* ERROR: Failed to restore old SIGTERM settings */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 2); - success = 0; - } - - /* Restore signal handling for SIGINT. - */ - restore_old_int: - if (0 != sigaction(SIGINT, &oint, NULL)) { - /* ERROR: Failed to restore old SIGPIPE settings */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 2); - success = 0; - } - -#ifdef SIGPIPE - /* Restore signal handling for SIGPIPE. - */ - restore_old_pipe: - if (0 != sigaction(SIGPIPE, &opipe, NULL)) { - /* ERROR: Failed to restore old SIGPIPE settings */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 2); - success = 0; - } -#endif - - /* Set exit status code if error occured. - */ - finished: - if (0 == success) { exval = EXIT_FAILURE; } -} -#else -#if DK4_HAVE_SIGSET -/** Set signal handlers and run. -*/ -static -void -dk_pwgen_run_with_signal_handlers(void) -{ -#ifdef SIGPIPE - dk4_sig_handler_t *oldpipe = NULL; -#endif - dk4_sig_handler_t *oldint = NULL; - dk4_sig_handler_t *oldterm = NULL; - -#ifdef SIGPIPE - oldpipe = sigset(SIGPIPE, sig_handler_pipe); -#endif - oldint = sigset(SIGINT, sig_handler_int); - oldterm = sigset(SIGTERM, sig_handler_term); - dk_pwgen_normal_run(); - sigset(SIGTERM, oldterm); - sigset(SIGINT, oldint); -#ifdef SIGPIPE - sigset(SIGPIPE, oldpipe); -#endif -} -#else -#if DK4_HAVE_SIGNAL -/** Set signal handlers and run. -*/ -static -void -dk_pwgen_run_with_signal_handlers(void) -{ -#ifdef SIGPIPE - dk4_sig_handler_t *oldpipe = NULL; -#endif - dk4_sig_handler_t *oldint = NULL; - dk4_sig_handler_t *oldterm = NULL; - -#ifdef SIGPIPE - oldpipe = signal(SIGPIPE, sig_handler_pipe); -#endif - oldint = signal(SIGINT, sig_handler_int); - oldterm = signal(SIGTERM, sig_handler_term); - dk_pwgen_normal_run(); - signal(SIGTERM, oldterm); - signal(SIGINT, oldint); -#ifdef SIGPIPE - signal(SIGPIPE, oldpipe); -#endif -} -#else -/** Set signal handlers and run. -*/ -static -void -dk_pwgen_run_with_signal_handlers(void) -{ - dk_pwgen_normal_run(); -} -#endif -#endif -#endif - -#endif -/* if DK4_HAVE_OPENSSL_RAND_H */ - - - -/** Main function. - @param argc Number of command line arguments. - @param argv Command line arguments array. - @return 0 on success, all other values indicate errors. -*/ -#if DK4_CHAR_SIZE > 1 -int wmain(int argc, wchar_t *argv[]) -#else -int main(int argc, char *argv[]) -#endif -{ - int shp; - int pbso; /* Flag: Private buffer used for stdout */ - - pbso = dk4setvbuf( - stdout, DK4_FILE_LINE_BUFFERING, stdout_buffer, sizeof(stdout_buffer), NULL - ); - - -#line 1999 "dk-pwgen.ctr" - - -#line 2000 "dk-pwgen.ctr" - dk4fput_initialize_stdout(); - dk4fput_initialize_stderr(); - app = dk4app_open_cmd( - argc, argv, dk_pwgen_options, dk_pwgen_sz_options, - dk_pwgen_kwnl[0], DKT_VERSION_DK, - dk_pwgen_kwnl[1], dk_pwgen_help_text, dk_pwgen_license_text - ); - if (NULL != app) { - dk_pwgen_sz_msg = dk4app_string_table_size(dk_pwgen_kw_def); - dk_pwgen_msg = dk4app_string_table(app,dk_pwgen_kwnl[2],dk_pwgen_kw_def); - if (0 != dk4app_can_run_normally(app)) { -#if DK4_HAVE_OPENSSL_RAND_H - /* - Run. - */ - dk_pwgen_run_with_signal_handlers(); - /* - Report signals and output errors, if any. - */ - if (0 != sig_read_atomic(&sig_had_term)) { - /* ERROR: SIGTERM signal received */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 19); - exval = EXIT_FAILURE; - } - if (0 != sig_read_atomic(&sig_had_int )) { - /* ERROR: SIGINT signal received */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 20); - exval = EXIT_FAILURE; - } -#ifdef SIGPIPE - if (0 != sig_read_atomic(&sig_had_pipe)) { - /* ERROR: SIGPIPE signal received */ - if (0 != verbose) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 21); - } - exval = EXIT_FAILURE; - shp = 1; - } else { - shp = 0; - } -#else - shp = 0; -#endif - if ((0 == shp) && (0 != output_error)) { - /* ERROR: Failed to write to stdout */ - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 22); - exval = EXIT_FAILURE; - } -#else - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 0); -#endif - if (0 == pbso) { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } else { -#ifdef BUFSIZ - fflush(stdout); - if (0 == dk4mem_reset_secure(stdout_buffer,sizeof(stdout_buffer),NULL)) - { - dk4app_log_1(app, dk_pwgen_msg, dk_pwgen_sz_msg, DK4_LL_ERROR, 30); - exval = EXIT_FAILURE; - } -#endif - } - } else { - if (0 != dk4app_help_version_license(app)) { - exval = EXIT_SUCCESS; - } - } - dk4app_close(app); - } else { - } - fflush(stdout); - fflush(stderr); - dk4fput_cleanup_stderr(); - dk4fput_cleanup_stdout(); - - -#line 2077 "dk-pwgen.ctr" - - -#line 2078 "dk-pwgen.ctr" - exit(exval); return exval; -} - |