2011-02-04 12:57:53 +01:00
|
|
|
/* gpgsm.c - GnuPG for S/MIME
|
2020-12-04 11:51:48 +01:00
|
|
|
* Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
|
|
|
* Copyright (C) 2001-2019 Werner Koch
|
|
|
|
* Copyright (C) 2015-2020 g10 Code GmbH
|
2003-08-05 17:11:04 +00:00
|
|
|
*
|
|
|
|
* This file is part of GnuPG.
|
|
|
|
*
|
|
|
|
* GnuPG is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
2007-07-04 19:49:40 +00:00
|
|
|
* the Free Software Foundation; either version 3 of the License, or
|
2003-08-05 17:11:04 +00:00
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* GnuPG is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
2016-11-05 12:02:19 +01:00
|
|
|
* along with this program; if not, see <https://www.gnu.org/licenses/>.
|
2020-12-04 11:51:48 +01:00
|
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
2003-08-05 17:11:04 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
2020-02-10 16:37:34 +01:00
|
|
|
#define INCLUDED_BY_MAIN_MODULE 1
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
#include "gpgsm.h"
|
|
|
|
#include <gcrypt.h>
|
|
|
|
#include <assuan.h> /* malloc hooks */
|
|
|
|
|
2016-03-07 18:09:41 +01:00
|
|
|
#include "passphrase.h"
|
|
|
|
#include "../common/shareddefs.h"
|
2003-08-05 17:11:04 +00:00
|
|
|
#include "../kbx/keybox.h" /* malloc hooks */
|
2017-03-07 20:21:23 +09:00
|
|
|
#include "../common/i18n.h"
|
2003-08-05 17:11:04 +00:00
|
|
|
#include "keydb.h"
|
2017-03-07 20:21:23 +09:00
|
|
|
#include "../common/sysutils.h"
|
|
|
|
#include "../common/gc-opt-flags.h"
|
|
|
|
#include "../common/asshelp.h"
|
2012-02-06 20:50:47 +01:00
|
|
|
#include "../common/init.h"
|
2017-06-07 11:50:54 +02:00
|
|
|
#include "../common/compliance.h"
|
2021-02-24 08:38:13 +01:00
|
|
|
#include "minip12.h"
|
2012-02-06 20:50:47 +01:00
|
|
|
|
2004-12-22 17:55:28 +00:00
|
|
|
|
|
|
|
#ifndef O_BINARY
|
|
|
|
#define O_BINARY 0
|
|
|
|
#endif
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
enum cmd_and_opt_values {
|
|
|
|
aNull = 0,
|
|
|
|
oArmor = 'a',
|
|
|
|
aDetachedSign = 'b',
|
|
|
|
aSym = 'c',
|
|
|
|
aDecrypt = 'd',
|
|
|
|
aEncr = 'e',
|
2003-12-16 16:31:16 +00:00
|
|
|
aListKeys = 'k',
|
|
|
|
aListSecretKeys = 'K',
|
2003-08-05 17:11:04 +00:00
|
|
|
oDryRun = 'n',
|
|
|
|
oOutput = 'o',
|
|
|
|
oQuiet = 'q',
|
|
|
|
oRecipient = 'r',
|
|
|
|
aSign = 's',
|
|
|
|
oUser = 'u',
|
|
|
|
oVerbose = 'v',
|
|
|
|
oBatch = 500,
|
|
|
|
aClearsign,
|
|
|
|
aKeygen,
|
|
|
|
aSignEncr,
|
|
|
|
aDeleteKey,
|
|
|
|
aImport,
|
|
|
|
aVerify,
|
|
|
|
aListExternalKeys,
|
2006-09-13 15:57:30 +00:00
|
|
|
aListChain,
|
2003-08-05 17:11:04 +00:00
|
|
|
aSendKeys,
|
|
|
|
aRecvKeys,
|
|
|
|
aExport,
|
2004-02-19 16:26:32 +00:00
|
|
|
aExportSecretKeyP12,
|
2014-06-03 18:57:33 +02:00
|
|
|
aExportSecretKeyP8,
|
|
|
|
aExportSecretKeyRaw,
|
2011-02-04 12:57:53 +01:00
|
|
|
aServer,
|
2003-08-05 17:11:04 +00:00
|
|
|
aLearnCard,
|
|
|
|
aCallDirmngr,
|
|
|
|
aCallProtectTool,
|
|
|
|
aPasswd,
|
2004-02-18 17:00:21 +00:00
|
|
|
aGPGConfList,
|
2006-10-23 14:02:13 +00:00
|
|
|
aGPGConfTest,
|
2004-04-22 13:03:44 +00:00
|
|
|
aDumpKeys,
|
2006-09-13 15:57:30 +00:00
|
|
|
aDumpChain,
|
2004-04-22 13:03:44 +00:00
|
|
|
aDumpSecretKeys,
|
|
|
|
aDumpExternalKeys,
|
2004-04-28 08:59:34 +00:00
|
|
|
aKeydbClearSomeCertFlags,
|
2008-11-13 12:37:45 +00:00
|
|
|
aFingerprint,
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
oOptions,
|
|
|
|
oDebug,
|
2004-02-18 17:00:21 +00:00
|
|
|
oDebugLevel,
|
2003-08-05 17:11:04 +00:00
|
|
|
oDebugAll,
|
2005-07-21 18:29:13 +00:00
|
|
|
oDebugNone,
|
2003-08-05 17:11:04 +00:00
|
|
|
oDebugWait,
|
2004-05-11 09:54:52 +00:00
|
|
|
oDebugAllowCoreDump,
|
2003-08-05 17:11:04 +00:00
|
|
|
oDebugNoChainValidation,
|
2004-02-20 13:46:21 +00:00
|
|
|
oDebugIgnoreExpiration,
|
2003-08-05 17:11:04 +00:00
|
|
|
oLogFile,
|
2005-07-21 18:29:13 +00:00
|
|
|
oNoLogFile,
|
2007-11-19 16:03:50 +00:00
|
|
|
oAuditLog,
|
2009-12-02 18:33:59 +00:00
|
|
|
oHtmlAuditLog,
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
oEnableSpecialFilenames,
|
|
|
|
|
|
|
|
oAgentProgram,
|
|
|
|
oDisplay,
|
|
|
|
oTTYname,
|
|
|
|
oTTYtype,
|
|
|
|
oLCctype,
|
|
|
|
oLCmessages,
|
2007-11-19 16:03:50 +00:00
|
|
|
oXauthority,
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2004-11-23 17:09:51 +00:00
|
|
|
oPreferSystemDirmngr,
|
2003-08-05 17:11:04 +00:00
|
|
|
oDirmngrProgram,
|
2008-02-19 10:33:35 +00:00
|
|
|
oDisableDirmngr,
|
2004-02-13 12:40:23 +00:00
|
|
|
oProtectToolProgram,
|
2003-08-05 17:11:04 +00:00
|
|
|
oFakedSystemTime,
|
|
|
|
|
2016-03-07 18:09:41 +01:00
|
|
|
oPassphraseFD,
|
|
|
|
oPinentryMode,
|
2018-03-23 09:06:20 +01:00
|
|
|
oRequestOrigin,
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
oAssumeArmor,
|
|
|
|
oAssumeBase64,
|
|
|
|
oAssumeBinary,
|
|
|
|
|
|
|
|
oBase64,
|
|
|
|
oNoArmor,
|
2007-03-20 10:00:55 +00:00
|
|
|
oP12Charset,
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2016-11-15 13:13:14 +01:00
|
|
|
oCompliance,
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
oDisableCRLChecks,
|
|
|
|
oEnableCRLChecks,
|
2005-04-21 09:33:07 +00:00
|
|
|
oDisableTrustedCertCRLCheck,
|
|
|
|
oEnableTrustedCertCRLCheck,
|
2004-04-07 17:59:18 +00:00
|
|
|
oForceCRLRefresh,
|
2020-03-27 21:11:25 +01:00
|
|
|
oEnableIssuerBasedCRLCheck,
|
2004-04-07 17:59:18 +00:00
|
|
|
|
2003-12-01 10:54:30 +00:00
|
|
|
oDisableOCSP,
|
|
|
|
oEnableOCSP,
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
oIncludeCerts,
|
|
|
|
oPolicyFile,
|
|
|
|
oDisablePolicyChecks,
|
|
|
|
oEnablePolicyChecks,
|
|
|
|
oAutoIssuerKeyRetrieve,
|
2021-11-18 20:44:14 +01:00
|
|
|
oMinRSALength,
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
oWithFingerprint,
|
2004-02-17 15:05:04 +00:00
|
|
|
oWithMD5Fingerprint,
|
2010-10-08 11:11:08 +00:00
|
|
|
oWithKeygrip,
|
2014-06-03 21:35:59 +02:00
|
|
|
oWithSecret,
|
2003-08-05 17:11:04 +00:00
|
|
|
oAnswerYes,
|
|
|
|
oAnswerNo,
|
|
|
|
oKeyring,
|
|
|
|
oDefaultKey,
|
|
|
|
oDefRecipient,
|
|
|
|
oDefRecipientSelf,
|
|
|
|
oNoDefRecipient,
|
|
|
|
oStatusFD,
|
|
|
|
oCipherAlgo,
|
|
|
|
oDigestAlgo,
|
2007-12-13 15:45:40 +00:00
|
|
|
oExtraDigestAlgo,
|
2003-08-05 17:11:04 +00:00
|
|
|
oNoVerbose,
|
|
|
|
oNoSecmemWarn,
|
|
|
|
oNoDefKeyring,
|
|
|
|
oNoGreeting,
|
|
|
|
oNoTTY,
|
|
|
|
oNoOptions,
|
|
|
|
oNoBatch,
|
|
|
|
oHomedir,
|
|
|
|
oWithColons,
|
|
|
|
oWithKeyData,
|
2004-02-17 15:05:04 +00:00
|
|
|
oWithValidation,
|
2004-08-06 16:14:10 +00:00
|
|
|
oWithEphemeralKeys,
|
2003-08-05 17:11:04 +00:00
|
|
|
oSkipVerify,
|
2007-08-10 16:52:05 +00:00
|
|
|
oValidationModel,
|
2003-08-05 17:11:04 +00:00
|
|
|
oKeyServer,
|
2022-01-27 15:07:02 +01:00
|
|
|
oKeyServer_deprecated,
|
2003-08-05 17:11:04 +00:00
|
|
|
oEncryptTo,
|
|
|
|
oNoEncryptTo,
|
|
|
|
oLoggerFD,
|
|
|
|
oDisableCipherAlgo,
|
|
|
|
oDisablePubkeyAlgo,
|
|
|
|
oIgnoreTimeConflict,
|
|
|
|
oNoRandomSeedFile,
|
2009-12-10 13:00:30 +00:00
|
|
|
oNoCommonCertsImport,
|
2014-11-28 09:44:19 +01:00
|
|
|
oIgnoreCertExtension,
|
2022-02-03 14:14:14 +01:00
|
|
|
oIgnoreCertWithOID,
|
2022-03-08 19:06:30 +01:00
|
|
|
oRequireCompliance,
|
2022-06-13 17:46:40 +02:00
|
|
|
oCompatibilityFlags,
|
2014-11-28 09:44:19 +01:00
|
|
|
oNoAutostart
|
2003-08-05 17:11:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static ARGPARSE_OPTS opts[] = {
|
|
|
|
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_group (300, N_("@Commands:\n ")),
|
|
|
|
|
|
|
|
ARGPARSE_c (aSign, "sign", N_("make a signature")),
|
2013-04-18 14:40:43 +02:00
|
|
|
/*ARGPARSE_c (aClearsign, "clearsign", N_("make a clear text signature") ),*/
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_c (aDetachedSign, "detach-sign", N_("make a detached signature")),
|
|
|
|
ARGPARSE_c (aEncr, "encrypt", N_("encrypt data")),
|
2013-04-18 14:40:43 +02:00
|
|
|
/*ARGPARSE_c (aSym, "symmetric", N_("encryption only with symmetric cipher")),*/
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_c (aDecrypt, "decrypt", N_("decrypt data (default)")),
|
|
|
|
ARGPARSE_c (aVerify, "verify", N_("verify a signature")),
|
|
|
|
ARGPARSE_c (aListKeys, "list-keys", N_("list keys")),
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_c (aListExternalKeys, "list-external-keys",
|
2008-11-13 12:37:45 +00:00
|
|
|
N_("list external keys")),
|
|
|
|
ARGPARSE_c (aListSecretKeys, "list-secret-keys", N_("list secret keys")),
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_c (aListChain, "list-chain", N_("list certificate chain")),
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_c (aFingerprint, "fingerprint", N_("list keys and fingerprints")),
|
2016-11-14 16:59:23 +01:00
|
|
|
ARGPARSE_c (aKeygen, "generate-key", N_("generate a new key pair")),
|
|
|
|
ARGPARSE_c (aKeygen, "gen-key", "@"),
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_c (aDeleteKey, "delete-keys",
|
2008-11-13 12:37:45 +00:00
|
|
|
N_("remove keys from the public keyring")),
|
2016-06-14 09:06:44 +02:00
|
|
|
/*ARGPARSE_c (aSendKeys, "send-keys", N_("export keys to a keyserver")),*/
|
|
|
|
/*ARGPARSE_c (aRecvKeys, "recv-keys", N_("import keys from a keyserver")),*/
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_c (aImport, "import", N_("import certificates")),
|
|
|
|
ARGPARSE_c (aExport, "export", N_("export certificates")),
|
2014-06-03 18:57:33 +02:00
|
|
|
|
|
|
|
/* We use -raw and not -p1 for pkcs#1 secret key export so that it
|
2015-11-16 12:41:46 +01:00
|
|
|
won't accidentally be used in case -p12 was intended. */
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_c (aExportSecretKeyP12, "export-secret-key-p12", "@"),
|
2014-06-03 18:57:33 +02:00
|
|
|
ARGPARSE_c (aExportSecretKeyP8, "export-secret-key-p8", "@"),
|
|
|
|
ARGPARSE_c (aExportSecretKeyRaw, "export-secret-key-raw", "@"),
|
|
|
|
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_c (aLearnCard, "learn-card", N_("register a smartcard")),
|
|
|
|
ARGPARSE_c (aServer, "server", N_("run in server mode")),
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_c (aCallDirmngr, "call-dirmngr",
|
2008-11-13 12:37:45 +00:00
|
|
|
N_("pass a command to the dirmngr")),
|
|
|
|
ARGPARSE_c (aCallProtectTool, "call-protect-tool",
|
|
|
|
N_("invoke gpg-protect-tool")),
|
2016-12-13 17:49:47 +01:00
|
|
|
ARGPARSE_c (aPasswd, "change-passphrase", N_("change a passphrase")),
|
|
|
|
ARGPARSE_c (aPasswd, "passwd", "@"),
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_c (aGPGConfList, "gpgconf-list", "@"),
|
|
|
|
ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@"),
|
|
|
|
|
|
|
|
ARGPARSE_c (aDumpKeys, "dump-cert", "@"),
|
|
|
|
ARGPARSE_c (aDumpKeys, "dump-keys", "@"),
|
|
|
|
ARGPARSE_c (aDumpChain, "dump-chain", "@"),
|
|
|
|
ARGPARSE_c (aDumpExternalKeys, "dump-external-keys", "@"),
|
|
|
|
ARGPARSE_c (aDumpSecretKeys, "dump-secret-keys", "@"),
|
|
|
|
ARGPARSE_c (aKeydbClearSomeCertFlags, "keydb-clear-some-cert-flags", "@"),
|
|
|
|
|
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_header ("Monitor", N_("Options controlling the diagnostic output")),
|
2008-11-13 12:37:45 +00:00
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
|
|
|
|
ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
|
|
|
|
ARGPARSE_s_n (oQuiet, "quiet", N_("be somewhat more quiet")),
|
|
|
|
ARGPARSE_s_n (oNoTTY, "no-tty", N_("don't use the terminal at all")),
|
|
|
|
ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
|
|
|
|
ARGPARSE_s_s (oDebug, "debug", "@"),
|
|
|
|
ARGPARSE_s_s (oDebugLevel, "debug-level",
|
|
|
|
N_("|LEVEL|set the debugging level to LEVEL")),
|
|
|
|
ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
|
|
|
|
ARGPARSE_s_n (oDebugNone, "debug-none", "@"),
|
|
|
|
ARGPARSE_s_i (oDebugWait, "debug-wait", "@"),
|
|
|
|
ARGPARSE_s_n (oDebugAllowCoreDump, "debug-allow-core-dump", "@"),
|
|
|
|
ARGPARSE_s_n (oDebugNoChainValidation, "debug-no-chain-validation", "@"),
|
|
|
|
ARGPARSE_s_n (oDebugIgnoreExpiration, "debug-ignore-expiration", "@"),
|
|
|
|
ARGPARSE_s_s (oLogFile, "log-file",
|
|
|
|
N_("|FILE|write server mode logs to FILE")),
|
|
|
|
ARGPARSE_s_n (oNoLogFile, "no-log-file", "@"),
|
|
|
|
ARGPARSE_s_i (oLoggerFD, "logger-fd", "@"),
|
|
|
|
ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
|
2016-03-07 18:09:41 +01:00
|
|
|
|
2008-11-13 12:37:45 +00:00
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_header ("Configuration",
|
|
|
|
N_("Options controlling the configuration")),
|
2008-11-13 12:37:45 +00:00
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_s (oHomedir, "homedir", "@"),
|
|
|
|
ARGPARSE_s_s (oFakedSystemTime, "faked-system-time", "@"),
|
2010-08-16 11:03:43 +00:00
|
|
|
ARGPARSE_s_n (oPreferSystemDirmngr,"prefer-system-dirmngr", "@"),
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_s_s (oValidationModel, "validation-model", "@"),
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_s_i (oIncludeCerts, "include-certs",
|
2008-11-13 12:37:45 +00:00
|
|
|
N_("|N|number of certificates to include") ),
|
|
|
|
ARGPARSE_s_s (oPolicyFile, "policy-file",
|
|
|
|
N_("|FILE|take policy information from FILE")),
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_s (oCompliance, "compliance", "@"),
|
2022-03-08 19:06:30 +01:00
|
|
|
ARGPARSE_p_u (oMinRSALength, "min-rsa-length", "@"),
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_n (oNoCommonCertsImport, "no-common-certs-import", "@"),
|
|
|
|
ARGPARSE_s_s (oIgnoreCertExtension, "ignore-cert-extension", "@"),
|
2022-02-03 14:14:14 +01:00
|
|
|
ARGPARSE_s_s (oIgnoreCertWithOID, "ignore-cert-with-oid", "@"),
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
|
|
|
|
ARGPARSE_s_s (oAgentProgram, "agent-program", "@"),
|
|
|
|
ARGPARSE_s_s (oDirmngrProgram, "dirmngr-program", "@"),
|
|
|
|
ARGPARSE_s_s (oProtectToolProgram, "protect-tool-program", "@"),
|
2008-11-13 12:37:45 +00:00
|
|
|
|
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_header ("Input", N_("Options controlling the input")),
|
2008-11-13 12:37:45 +00:00
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_n (oAssumeArmor, "assume-armor",
|
|
|
|
N_("assume input is in PEM format")),
|
|
|
|
ARGPARSE_s_n (oAssumeBase64, "assume-base64",
|
|
|
|
N_("assume input is in base-64 format")),
|
|
|
|
ARGPARSE_s_n (oAssumeBinary, "assume-binary",
|
|
|
|
N_("assume input is in binary format")),
|
2008-11-13 12:37:45 +00:00
|
|
|
|
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_header ("Output", N_("Options controlling the output")),
|
|
|
|
|
|
|
|
ARGPARSE_s_n (oArmor, "armor", N_("create ascii armored output")),
|
|
|
|
ARGPARSE_s_n (oArmor, "armour", "@"),
|
|
|
|
ARGPARSE_s_n (oNoArmor, "no-armor", "@"),
|
|
|
|
ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
|
|
|
|
ARGPARSE_s_n (oBase64, "base64", N_("create base-64 encoded output")),
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
|
|
|
|
|
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_header (NULL, N_("Options to specify keys")),
|
2008-11-13 12:37:45 +00:00
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_s (oRecipient, "recipient", N_("|USER-ID|encrypt for USER-ID")),
|
|
|
|
ARGPARSE_s_s (oUser, "local-user",
|
|
|
|
N_("|USER-ID|use USER-ID to sign or decrypt")),
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_s_s (oDefaultKey, "default-key",
|
|
|
|
N_("|USER-ID|use USER-ID as default secret key")),
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_s (oEncryptTo, "encrypt-to",
|
|
|
|
N_("|NAME|encrypt to user ID NAME as well")),
|
|
|
|
ARGPARSE_s_n (oNoEncryptTo, "no-encrypt-to", "@"),
|
2008-11-13 12:37:45 +00:00
|
|
|
/* Not yet used: */
|
|
|
|
/* ARGPARSE_s_s (oDefRecipient, "default-recipient", */
|
|
|
|
/* N_("|NAME|use NAME as default recipient")), */
|
|
|
|
/* ARGPARSE_s_n (oDefRecipientSelf, "default-recipient-self", */
|
|
|
|
/* N_("use the default key as default recipient")), */
|
|
|
|
/* ARGPARSE_s_n (oNoDefRecipient, "no-default-recipient", "@"), */
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_s (oKeyring, "keyring",
|
|
|
|
N_("|FILE|add keyring to the list of keyrings")),
|
|
|
|
ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
|
2022-01-27 15:07:02 +01:00
|
|
|
ARGPARSE_s_s (oKeyServer_deprecated, "ldapserver", "@"),
|
2021-06-09 10:34:14 +02:00
|
|
|
ARGPARSE_s_s (oKeyServer, "keyserver", "@"),
|
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_header ("ImportExport",
|
|
|
|
N_("Options controlling key import and export")),
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_n (oDisableDirmngr, "disable-dirmngr",
|
|
|
|
N_("disable all access to the dirmngr")),
|
|
|
|
ARGPARSE_s_n (oAutoIssuerKeyRetrieve, "auto-issuer-key-retrieve",
|
|
|
|
N_("fetch missing issuer certificates")),
|
|
|
|
ARGPARSE_s_s (oP12Charset, "p12-charset",
|
|
|
|
N_("|NAME|use encoding NAME for PKCS#12 passphrases")),
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_header ("Keylist", N_("Options controlling key listings")),
|
2008-11-13 12:37:45 +00:00
|
|
|
|
|
|
|
ARGPARSE_s_n (oWithColons, "with-colons", "@"),
|
|
|
|
ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
|
|
|
|
ARGPARSE_s_n (oWithValidation, "with-validation", "@"),
|
|
|
|
ARGPARSE_s_n (oWithMD5Fingerprint, "with-md5-fingerprint", "@"),
|
|
|
|
ARGPARSE_s_n (oWithEphemeralKeys, "with-ephemeral-keys", "@"),
|
|
|
|
ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
|
|
|
|
ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
|
2010-10-08 11:11:08 +00:00
|
|
|
ARGPARSE_s_n (oWithKeygrip, "with-keygrip", "@"),
|
2014-06-03 21:35:59 +02:00
|
|
|
ARGPARSE_s_n (oWithSecret, "with-secret", "@"),
|
2020-03-06 15:17:53 +01:00
|
|
|
|
|
|
|
ARGPARSE_header ("Security", N_("Options controlling the security")),
|
|
|
|
|
|
|
|
ARGPARSE_s_n (oDisableCRLChecks, "disable-crl-checks",
|
|
|
|
N_("never consult a CRL")),
|
|
|
|
ARGPARSE_s_n (oEnableCRLChecks, "enable-crl-checks", "@"),
|
|
|
|
ARGPARSE_s_n (oDisableTrustedCertCRLCheck,
|
|
|
|
"disable-trusted-cert-crl-check",
|
|
|
|
N_("do not check CRLs for root certificates")),
|
|
|
|
ARGPARSE_s_n (oEnableTrustedCertCRLCheck,
|
|
|
|
"enable-trusted-cert-crl-check", "@"),
|
|
|
|
ARGPARSE_s_n (oDisableOCSP, "disable-ocsp", "@"),
|
|
|
|
ARGPARSE_s_n (oEnableOCSP, "enable-ocsp", N_("check validity using OCSP")),
|
|
|
|
ARGPARSE_s_n (oDisablePolicyChecks, "disable-policy-checks",
|
|
|
|
N_("do not check certificate policies")),
|
|
|
|
ARGPARSE_s_n (oEnablePolicyChecks, "enable-policy-checks", "@"),
|
|
|
|
ARGPARSE_s_s (oCipherAlgo, "cipher-algo",
|
|
|
|
N_("|NAME|use cipher algorithm NAME")),
|
|
|
|
ARGPARSE_s_s (oDigestAlgo, "digest-algo",
|
|
|
|
N_("|NAME|use message digest algorithm NAME")),
|
|
|
|
ARGPARSE_s_s (oExtraDigestAlgo, "extra-digest-algo", "@"),
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_s_s (oDisableCipherAlgo, "disable-cipher-algo", "@"),
|
|
|
|
ARGPARSE_s_s (oDisablePubkeyAlgo, "disable-pubkey-algo", "@"),
|
|
|
|
ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
|
|
|
|
ARGPARSE_s_n (oNoRandomSeedFile, "no-random-seed-file", "@"),
|
2022-03-08 19:06:30 +01:00
|
|
|
ARGPARSE_s_n (oRequireCompliance, "require-compliance", "@"),
|
2021-11-18 20:44:14 +01:00
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
|
|
|
|
ARGPARSE_header (NULL, N_("Options for unattended use")),
|
|
|
|
|
|
|
|
ARGPARSE_s_n (oBatch, "batch", N_("batch mode: never ask")),
|
|
|
|
ARGPARSE_s_n (oNoBatch, "no-batch", "@"),
|
|
|
|
ARGPARSE_s_n (oAnswerYes, "yes", N_("assume yes on most questions")),
|
|
|
|
ARGPARSE_s_n (oAnswerNo, "no", N_("assume no on most questions")),
|
|
|
|
ARGPARSE_s_i (oStatusFD, "status-fd", N_("|FD|write status info to this FD")),
|
|
|
|
ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
|
|
|
|
ARGPARSE_s_i (oPassphraseFD, "passphrase-fd", "@"),
|
|
|
|
ARGPARSE_s_s (oPinentryMode, "pinentry-mode", "@"),
|
|
|
|
|
|
|
|
|
|
|
|
ARGPARSE_header (NULL, N_("Other options")),
|
|
|
|
|
|
|
|
ARGPARSE_conffile (oOptions, "options", N_("|FILE|read options from FILE")),
|
|
|
|
ARGPARSE_noconffile (oNoOptions, "no-options", "@"),
|
|
|
|
ARGPARSE_s_n (oDryRun, "dry-run", N_("do not make any changes")),
|
|
|
|
ARGPARSE_s_s (oRequestOrigin, "request-origin", "@"),
|
|
|
|
ARGPARSE_s_n (oForceCRLRefresh, "force-crl-refresh", "@"),
|
2020-03-27 21:11:25 +01:00
|
|
|
ARGPARSE_s_n (oEnableIssuerBasedCRLCheck, "enable-issuer-based-crl-check",
|
|
|
|
"@"),
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_s_s (oAuditLog, "audit-log",
|
|
|
|
N_("|FILE|write an audit log to FILE")),
|
|
|
|
ARGPARSE_s_s (oHtmlAuditLog, "html-audit-log", "@"),
|
|
|
|
ARGPARSE_s_s (oDisplay, "display", "@"),
|
|
|
|
ARGPARSE_s_s (oTTYname, "ttyname", "@"),
|
|
|
|
ARGPARSE_s_s (oTTYtype, "ttytype", "@"),
|
|
|
|
ARGPARSE_s_s (oLCctype, "lc-ctype", "@"),
|
|
|
|
ARGPARSE_s_s (oLCmessages, "lc-messages", "@"),
|
|
|
|
ARGPARSE_s_s (oXauthority, "xauthority", "@"),
|
2022-06-13 17:46:40 +02:00
|
|
|
ARGPARSE_s_s (oCompatibilityFlags, "compatibility-flags", "@"),
|
2020-03-06 15:17:53 +01:00
|
|
|
|
|
|
|
ARGPARSE_header (NULL, ""), /* Stop the header group. */
|
|
|
|
|
2008-11-13 12:37:45 +00:00
|
|
|
|
|
|
|
/* Command aliases. */
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_c (aListKeys, "list-key", "@"),
|
2016-10-10 14:55:27 +02:00
|
|
|
ARGPARSE_c (aListChain, "list-signatures", "@"),
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_c (aListChain, "list-sigs", "@"),
|
2016-10-10 15:20:14 +02:00
|
|
|
ARGPARSE_c (aListChain, "check-signatures", "@"),
|
2011-02-04 12:57:53 +01:00
|
|
|
ARGPARSE_c (aListChain, "check-sigs", "@"),
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_c (aDeleteKey, "delete-key", "@"),
|
|
|
|
|
2020-03-06 15:17:53 +01:00
|
|
|
ARGPARSE_group (302, N_(
|
|
|
|
"@\n(See the man page for a complete listing of all commands and options)\n"
|
|
|
|
)),
|
|
|
|
|
2008-11-13 12:37:45 +00:00
|
|
|
ARGPARSE_end ()
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2015-06-23 09:12:44 +02:00
|
|
|
/* The list of supported debug flags. */
|
|
|
|
static struct debug_flags_s debug_flags [] =
|
|
|
|
{
|
|
|
|
{ DBG_X509_VALUE , "x509" },
|
|
|
|
{ DBG_MPI_VALUE , "mpi" },
|
|
|
|
{ DBG_CRYPTO_VALUE , "crypto" },
|
|
|
|
{ DBG_MEMORY_VALUE , "memory" },
|
|
|
|
{ DBG_CACHE_VALUE , "cache" },
|
|
|
|
{ DBG_MEMSTAT_VALUE, "memstat" },
|
|
|
|
{ DBG_HASHING_VALUE, "hashing" },
|
|
|
|
{ DBG_IPC_VALUE , "ipc" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2008-11-13 12:37:45 +00:00
|
|
|
|
|
|
|
|
2022-06-13 17:46:40 +02:00
|
|
|
/* The list of compatibility flags. */
|
|
|
|
static struct compatibility_flags_s compatibility_flags [] =
|
|
|
|
{
|
|
|
|
{ COMPAT_ALLOW_KA_TO_ENCR, "allow-ka-to-encr" },
|
2022-10-28 15:19:19 +02:00
|
|
|
{ COMPAT_ALLOW_ECC_ENCR, "allow-ecc-encr" },
|
2022-06-13 17:46:40 +02:00
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-11-13 12:37:45 +00:00
|
|
|
/* Global variable to keep an error count. */
|
2003-08-05 17:11:04 +00:00
|
|
|
int gpgsm_errors_seen = 0;
|
|
|
|
|
|
|
|
/* It is possible that we are currentlu running under setuid permissions */
|
|
|
|
static int maybe_setuid = 1;
|
|
|
|
|
2004-12-02 07:48:09 +00:00
|
|
|
/* Helper to implement --debug-level and --debug*/
|
|
|
|
static const char *debug_level;
|
|
|
|
static unsigned int debug_value;
|
|
|
|
|
2009-10-19 09:18:46 +00:00
|
|
|
/* Default value for include-certs. We need an extra macro for
|
|
|
|
gpgconf-list because the variable will be changed by the command
|
2011-02-04 12:57:53 +01:00
|
|
|
line option.
|
2009-10-19 09:18:46 +00:00
|
|
|
|
|
|
|
It is often cumbersome to locate intermediate certificates, thus by
|
|
|
|
default we include all certificates in the chain. However we leave
|
|
|
|
out the root certificate because that would make it too easy for
|
|
|
|
the recipient to import that root certificate. A root certificate
|
|
|
|
should be installed only after due checks and thus it won't help to
|
|
|
|
send it along with each message. */
|
|
|
|
#define DEFAULT_INCLUDE_CERTS -2 /* Include all certs but root. */
|
2011-02-04 12:57:53 +01:00
|
|
|
static int default_include_certs = DEFAULT_INCLUDE_CERTS;
|
2006-06-20 17:21:37 +00:00
|
|
|
|
2007-08-10 16:52:05 +00:00
|
|
|
/* Whether the chain mode shall be used for validation. */
|
|
|
|
static int default_validation_model;
|
2006-06-20 17:21:37 +00:00
|
|
|
|
2009-10-19 09:18:46 +00:00
|
|
|
/* The default cipher algo. */
|
2022-11-30 11:00:35 +01:00
|
|
|
#define DEFAULT_CIPHER_ALGO "AES256"
|
2009-10-19 09:18:46 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
static char *build_list (const char *text,
|
|
|
|
const char *(*mapf)(int), int (*chkf)(int));
|
|
|
|
static void set_cmd (enum cmd_and_opt_values *ret_cmd,
|
|
|
|
enum cmd_and_opt_values new_cmd );
|
|
|
|
|
|
|
|
static void emergency_cleanup (void);
|
|
|
|
static int open_read (const char *filename);
|
2010-04-14 11:24:02 +00:00
|
|
|
static estream_t open_es_fread (const char *filename, const char *mode);
|
2007-03-19 14:35:04 +00:00
|
|
|
static estream_t open_es_fwrite (const char *filename);
|
2003-08-05 17:11:04 +00:00
|
|
|
static void run_protect_tool (int argc, char **argv);
|
|
|
|
|
|
|
|
static int
|
|
|
|
our_pk_test_algo (int algo)
|
|
|
|
{
|
2007-08-14 16:50:27 +00:00
|
|
|
switch (algo)
|
|
|
|
{
|
|
|
|
case GCRY_PK_RSA:
|
2008-09-29 15:02:55 +00:00
|
|
|
case GCRY_PK_ECDSA:
|
2020-05-08 14:14:01 +02:00
|
|
|
case GCRY_PK_EDDSA:
|
2007-08-14 16:50:27 +00:00
|
|
|
return gcry_pk_test_algo (algo);
|
|
|
|
default:
|
|
|
|
return 1;
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
our_cipher_test_algo (int algo)
|
|
|
|
{
|
2007-08-14 16:50:27 +00:00
|
|
|
switch (algo)
|
|
|
|
{
|
|
|
|
case GCRY_CIPHER_3DES:
|
|
|
|
case GCRY_CIPHER_AES128:
|
|
|
|
case GCRY_CIPHER_AES192:
|
|
|
|
case GCRY_CIPHER_AES256:
|
|
|
|
case GCRY_CIPHER_SERPENT128:
|
|
|
|
case GCRY_CIPHER_SERPENT192:
|
|
|
|
case GCRY_CIPHER_SERPENT256:
|
2008-12-10 10:57:47 +00:00
|
|
|
case GCRY_CIPHER_SEED:
|
|
|
|
case GCRY_CIPHER_CAMELLIA128:
|
|
|
|
case GCRY_CIPHER_CAMELLIA192:
|
|
|
|
case GCRY_CIPHER_CAMELLIA256:
|
2007-08-14 16:50:27 +00:00
|
|
|
return gcry_cipher_test_algo (algo);
|
|
|
|
default:
|
|
|
|
return 1;
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
|
2007-08-14 16:50:27 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
static int
|
|
|
|
our_md_test_algo (int algo)
|
|
|
|
{
|
2007-08-14 16:50:27 +00:00
|
|
|
switch (algo)
|
|
|
|
{
|
|
|
|
case GCRY_MD_MD5:
|
|
|
|
case GCRY_MD_SHA1:
|
|
|
|
case GCRY_MD_RMD160:
|
2008-12-10 10:57:47 +00:00
|
|
|
case GCRY_MD_SHA224:
|
2007-08-14 16:50:27 +00:00
|
|
|
case GCRY_MD_SHA256:
|
|
|
|
case GCRY_MD_SHA384:
|
|
|
|
case GCRY_MD_SHA512:
|
2008-12-10 10:57:47 +00:00
|
|
|
case GCRY_MD_WHIRLPOOL:
|
2007-08-14 16:50:27 +00:00
|
|
|
return gcry_md_test_algo (algo);
|
|
|
|
default:
|
|
|
|
return 1;
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
|
2007-08-14 16:50:27 +00:00
|
|
|
|
2008-11-18 18:01:03 +00:00
|
|
|
static char *
|
|
|
|
make_libversion (const char *libname, const char *(*getfnc)(const char*))
|
|
|
|
{
|
|
|
|
const char *s;
|
|
|
|
char *result;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2008-11-18 18:01:03 +00:00
|
|
|
if (maybe_setuid)
|
|
|
|
{
|
|
|
|
gcry_control (GCRYCTL_INIT_SECMEM, 0, 0); /* Drop setuid. */
|
|
|
|
maybe_setuid = 0;
|
|
|
|
}
|
|
|
|
s = getfnc (NULL);
|
|
|
|
result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
|
|
|
|
strcpy (stpcpy (stpcpy (result, libname), " "), s);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
static const char *
|
|
|
|
my_strusage( int level )
|
|
|
|
{
|
2008-11-18 18:01:03 +00:00
|
|
|
static char *digests, *pubkeys, *ciphers;
|
|
|
|
static char *ver_gcry, *ver_ksba;
|
2003-08-05 17:11:04 +00:00
|
|
|
const char *p;
|
|
|
|
|
|
|
|
switch (level)
|
|
|
|
{
|
2020-12-04 11:51:48 +01:00
|
|
|
case 9: p = "GPL-3.0-or-later"; break;
|
2013-11-18 14:09:47 +01:00
|
|
|
case 11: p = "@GPGSM@ (@GNUPG@)";
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
case 13: p = VERSION; break;
|
2020-12-04 11:51:48 +01:00
|
|
|
case 14: p = GNUPG_DEF_COPYRIGHT_LINE; break;
|
2003-08-05 17:11:04 +00:00
|
|
|
case 17: p = PRINTABLE_OS_NAME; break;
|
2009-07-21 14:21:05 +00:00
|
|
|
case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case 1:
|
2013-11-18 14:09:47 +01:00
|
|
|
case 40: p = _("Usage: @GPGSM@ [options] [files] (-h for help)");
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
case 41:
|
2013-11-18 14:09:47 +01:00
|
|
|
p = _("Syntax: @GPGSM@ [options] [files]\n"
|
2012-08-22 12:54:38 -04:00
|
|
|
"Sign, check, encrypt or decrypt using the S/MIME protocol\n"
|
|
|
|
"Default operation depends on the input data\n");
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
2008-11-18 18:01:03 +00:00
|
|
|
case 20:
|
|
|
|
if (!ver_gcry)
|
|
|
|
ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
|
|
|
|
p = ver_gcry;
|
|
|
|
break;
|
|
|
|
case 21:
|
|
|
|
if (!ver_ksba)
|
|
|
|
ver_ksba = make_libversion ("libksba", ksba_check_version);
|
|
|
|
p = ver_ksba;
|
|
|
|
break;
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case 31: p = "\nHome: "; break;
|
2016-06-07 10:59:46 +02:00
|
|
|
case 32: p = gnupg_homedir (); break;
|
2003-08-05 17:11:04 +00:00
|
|
|
case 33: p = _("\nSupported algorithms:\n"); break;
|
|
|
|
case 34:
|
|
|
|
if (!ciphers)
|
2010-12-02 15:49:02 +00:00
|
|
|
ciphers = build_list ("Cipher: ", gnupg_cipher_algo_name,
|
2003-08-05 17:11:04 +00:00
|
|
|
our_cipher_test_algo );
|
|
|
|
p = ciphers;
|
|
|
|
break;
|
|
|
|
case 35:
|
|
|
|
if (!pubkeys)
|
|
|
|
pubkeys = build_list ("Pubkey: ", gcry_pk_algo_name,
|
|
|
|
our_pk_test_algo );
|
|
|
|
p = pubkeys;
|
|
|
|
break;
|
|
|
|
case 36:
|
|
|
|
if (!digests)
|
|
|
|
digests = build_list("Hash: ", gcry_md_algo_name, our_md_test_algo );
|
|
|
|
p = digests;
|
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
default: p = NULL; break;
|
|
|
|
}
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static char *
|
|
|
|
build_list (const char *text, const char * (*mapf)(int), int (*chkf)(int))
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
size_t n=strlen(text)+2;
|
|
|
|
char *list, *p;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (maybe_setuid) {
|
|
|
|
gcry_control (GCRYCTL_DROP_PRIVS); /* drop setuid */
|
|
|
|
}
|
|
|
|
|
2007-08-14 16:50:27 +00:00
|
|
|
for (i=1; i < 400; i++ )
|
2003-08-05 17:11:04 +00:00
|
|
|
if (!chkf(i))
|
|
|
|
n += strlen(mapf(i)) + 2;
|
|
|
|
list = xmalloc (21 + n);
|
|
|
|
*list = 0;
|
2007-08-14 16:50:27 +00:00
|
|
|
for (p=NULL, i=1; i < 400; i++)
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
|
|
|
if (!chkf(i))
|
|
|
|
{
|
|
|
|
if( !p )
|
|
|
|
p = stpcpy (list, text );
|
|
|
|
else
|
|
|
|
p = stpcpy (p, ", ");
|
|
|
|
p = stpcpy (p, mapf(i) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (p)
|
2016-01-06 17:51:58 +01:00
|
|
|
strcpy (p, "\n" );
|
2003-08-05 17:11:04 +00:00
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-12-22 17:55:28 +00:00
|
|
|
/* Set the file pointer into binary mode if required. */
|
|
|
|
static void
|
|
|
|
set_binary (FILE *fp)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_DOSISH_SYSTEM
|
|
|
|
setmode (fileno (fp), O_BINARY);
|
2008-10-20 13:53:23 +00:00
|
|
|
#else
|
|
|
|
(void)fp;
|
2004-12-22 17:55:28 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
static void
|
|
|
|
wrong_args (const char *text)
|
|
|
|
{
|
2014-06-25 20:25:28 +02:00
|
|
|
fprintf (stderr, _("usage: %s [options] %s\n"), GPGSM_NAME, text);
|
2003-08-05 17:11:04 +00:00
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-07-07 10:02:41 +00:00
|
|
|
static void
|
|
|
|
set_opt_session_env (const char *name, const char *value)
|
|
|
|
{
|
|
|
|
gpg_error_t err;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2009-07-07 10:02:41 +00:00
|
|
|
err = session_env_setenv (opt.session_env, name, value);
|
|
|
|
if (err)
|
|
|
|
log_fatal ("error setting session environment: %s\n",
|
|
|
|
gpg_strerror (err));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-12-02 07:48:09 +00:00
|
|
|
/* Setup the debugging. With a DEBUG_LEVEL of NULL only the active
|
|
|
|
debug flags are propagated to the subsystems. With DEBUG_LEVEL
|
|
|
|
set, a specific set of debug flags is set; and individual debugging
|
|
|
|
flags will be added on top. */
|
2003-08-05 17:11:04 +00:00
|
|
|
static void
|
2004-12-02 07:48:09 +00:00
|
|
|
set_debug (void)
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
2009-12-03 18:04:40 +00:00
|
|
|
int numok = (debug_level && digitp (debug_level));
|
|
|
|
int numlvl = numok? atoi (debug_level) : 0;
|
|
|
|
|
2004-12-02 07:48:09 +00:00
|
|
|
if (!debug_level)
|
2004-02-18 17:00:21 +00:00
|
|
|
;
|
2009-12-03 18:04:40 +00:00
|
|
|
else if (!strcmp (debug_level, "none") || (numok && numlvl < 1))
|
2004-02-18 17:00:21 +00:00
|
|
|
opt.debug = 0;
|
2009-12-03 18:04:40 +00:00
|
|
|
else if (!strcmp (debug_level, "basic") || (numok && numlvl <= 2))
|
2015-04-06 13:42:17 +02:00
|
|
|
opt.debug = DBG_IPC_VALUE;
|
2009-12-03 18:04:40 +00:00
|
|
|
else if (!strcmp (debug_level, "advanced") || (numok && numlvl <= 5))
|
2015-04-06 13:42:17 +02:00
|
|
|
opt.debug = DBG_IPC_VALUE|DBG_X509_VALUE;
|
2009-12-03 18:04:40 +00:00
|
|
|
else if (!strcmp (debug_level, "expert") || (numok && numlvl <= 8))
|
2015-04-06 13:42:17 +02:00
|
|
|
opt.debug = (DBG_IPC_VALUE|DBG_X509_VALUE
|
2004-02-18 17:00:21 +00:00
|
|
|
|DBG_CACHE_VALUE|DBG_CRYPTO_VALUE);
|
2009-12-03 18:04:40 +00:00
|
|
|
else if (!strcmp (debug_level, "guru") || numok)
|
|
|
|
{
|
|
|
|
opt.debug = ~0;
|
|
|
|
/* Unless the "guru" string has been used we don't want to allow
|
|
|
|
hashing debugging. The rationale is that people tend to
|
|
|
|
select the highest debug value and would then clutter their
|
2011-02-04 12:57:53 +01:00
|
|
|
disk with debug files which may reveal confidential data. */
|
2009-12-03 18:04:40 +00:00
|
|
|
if (numok)
|
|
|
|
opt.debug &= ~(DBG_HASHING_VALUE);
|
|
|
|
}
|
2004-02-18 17:00:21 +00:00
|
|
|
else
|
|
|
|
{
|
2012-06-05 19:29:22 +02:00
|
|
|
log_error (_("invalid debug-level '%s' given\n"), debug_level);
|
2009-12-03 18:04:40 +00:00
|
|
|
gpgsm_exit (2);
|
2004-02-18 17:00:21 +00:00
|
|
|
}
|
|
|
|
|
2004-12-02 07:48:09 +00:00
|
|
|
opt.debug |= debug_value;
|
2004-02-18 17:00:21 +00:00
|
|
|
|
|
|
|
if (opt.debug && !opt.verbose)
|
2004-12-02 07:48:09 +00:00
|
|
|
opt.verbose = 1;
|
|
|
|
if (opt.debug)
|
2004-02-18 17:00:21 +00:00
|
|
|
opt.quiet = 0;
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (opt.debug & DBG_MPI_VALUE)
|
|
|
|
gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2);
|
|
|
|
if (opt.debug & DBG_CRYPTO_VALUE )
|
|
|
|
gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
|
2004-12-02 07:48:09 +00:00
|
|
|
gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
|
2009-12-03 18:04:40 +00:00
|
|
|
|
|
|
|
if (opt.debug)
|
2015-06-23 09:12:44 +02:00
|
|
|
parse_debug_flag (NULL, &opt.debug, debug_flags);
|
2021-02-24 08:38:13 +01:00
|
|
|
|
|
|
|
/* minip12.c may be used outside of GnuPG, thus we don't have the
|
|
|
|
* opt structure over there. */
|
|
|
|
p12_set_verbosity (opt.verbose);
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
set_cmd (enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd)
|
|
|
|
{
|
|
|
|
enum cmd_and_opt_values cmd = *ret_cmd;
|
|
|
|
|
|
|
|
if (!cmd || cmd == new_cmd)
|
|
|
|
cmd = new_cmd;
|
|
|
|
else if ( cmd == aSign && new_cmd == aEncr )
|
|
|
|
cmd = aSignEncr;
|
|
|
|
else if ( cmd == aEncr && new_cmd == aSign )
|
|
|
|
cmd = aSignEncr;
|
|
|
|
else if ( (cmd == aSign && new_cmd == aClearsign)
|
|
|
|
|| (cmd == aClearsign && new_cmd == aSign) )
|
|
|
|
cmd = aClearsign;
|
2011-02-04 12:57:53 +01:00
|
|
|
else
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
|
|
|
log_error(_("conflicting commands\n"));
|
|
|
|
gpgsm_exit(2);
|
|
|
|
}
|
|
|
|
|
|
|
|
*ret_cmd = cmd;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-12-17 17:12:14 +00:00
|
|
|
/* Helper to add recipients to a list. */
|
|
|
|
static void
|
|
|
|
do_add_recipient (ctrl_t ctrl, const char *name,
|
2007-08-14 16:50:27 +00:00
|
|
|
certlist_t *recplist, int is_encrypt_to, int recp_required)
|
2003-12-17 17:12:14 +00:00
|
|
|
{
|
|
|
|
int rc = gpgsm_add_to_certlist (ctrl, name, 0, recplist, is_encrypt_to);
|
|
|
|
if (rc)
|
|
|
|
{
|
2007-08-14 16:50:27 +00:00
|
|
|
if (recp_required)
|
|
|
|
{
|
2012-06-05 19:29:22 +02:00
|
|
|
log_error ("can't encrypt to '%s': %s\n", name, gpg_strerror (rc));
|
2007-08-14 16:50:27 +00:00
|
|
|
gpgsm_status2 (ctrl, STATUS_INV_RECP,
|
2009-08-06 20:12:00 +00:00
|
|
|
get_inv_recpsgnr_code (rc), name, NULL);
|
2007-08-14 16:50:27 +00:00
|
|
|
}
|
|
|
|
else
|
2014-10-10 15:29:42 +02:00
|
|
|
log_info (_("Note: won't be able to encrypt to '%s': %s\n"),
|
2007-08-14 16:50:27 +00:00
|
|
|
name, gpg_strerror (rc));
|
2003-12-17 17:12:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-10 16:52:05 +00:00
|
|
|
static void
|
|
|
|
parse_validation_model (const char *model)
|
|
|
|
{
|
|
|
|
int i = gpgsm_parse_validation_model (model);
|
|
|
|
if (i == -1)
|
2012-06-05 19:29:22 +02:00
|
|
|
log_error (_("unknown validation model '%s'\n"), model);
|
2007-08-10 16:52:05 +00:00
|
|
|
else
|
|
|
|
default_validation_model = i;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-06-12 14:24:46 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
int
|
|
|
|
main ( int argc, char **argv)
|
|
|
|
{
|
|
|
|
ARGPARSE_ARGS pargs;
|
|
|
|
int orig_argc;
|
|
|
|
char **orig_argv;
|
|
|
|
/* char *username;*/
|
|
|
|
int may_coredump;
|
2006-10-02 11:54:35 +00:00
|
|
|
strlist_t sl, remusr= NULL, locusr=NULL;
|
|
|
|
strlist_t nrings=NULL;
|
2003-08-05 17:11:04 +00:00
|
|
|
int detached_sig = 0;
|
2020-12-04 11:51:48 +01:00
|
|
|
char *last_configname = NULL;
|
|
|
|
const char *configname = NULL; /* NULL or points to last_configname.
|
|
|
|
* NULL also indicates that we are
|
|
|
|
* processing options from the cmdline. */
|
|
|
|
int debug_argparser = 0;
|
2003-08-05 17:11:04 +00:00
|
|
|
int no_more_options = 0;
|
|
|
|
int default_keyring = 1;
|
|
|
|
char *logfile = NULL;
|
2007-11-19 16:03:50 +00:00
|
|
|
char *auditlog = NULL;
|
2009-12-02 18:33:59 +00:00
|
|
|
char *htmlauditlog = NULL;
|
2003-08-05 17:11:04 +00:00
|
|
|
int greeting = 0;
|
|
|
|
int nogreeting = 0;
|
|
|
|
int debug_wait = 0;
|
|
|
|
int use_random_seed = 1;
|
2008-02-19 10:33:35 +00:00
|
|
|
int no_common_certs_import = 0;
|
2003-08-05 17:11:04 +00:00
|
|
|
int with_fpr = 0;
|
2009-03-26 19:27:04 +00:00
|
|
|
const char *forced_digest_algo = NULL;
|
|
|
|
const char *extra_digest_algo = NULL;
|
2003-08-05 17:11:04 +00:00
|
|
|
enum cmd_and_opt_values cmd = 0;
|
|
|
|
struct server_control_s ctrl;
|
2006-09-06 16:35:52 +00:00
|
|
|
certlist_t recplist = NULL;
|
|
|
|
certlist_t signerlist = NULL;
|
2004-02-18 17:00:21 +00:00
|
|
|
int do_not_setup_keys = 0;
|
2007-08-14 16:50:27 +00:00
|
|
|
int recp_required = 0;
|
2007-12-12 10:28:30 +00:00
|
|
|
estream_t auditfp = NULL;
|
2009-12-02 18:33:59 +00:00
|
|
|
estream_t htmlauditfp = NULL;
|
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* configure.ac (NEED_LIBASSUAN_API, NEED_LIBASSUAN_VERSION):
Update to new API (2, 1.1.0).
agent/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* gpg-agent.c (parse_rereadable_options): Don't set global assuan
log file (there ain't one anymore).
(main): Update to new API.
(check_own_socket_pid_cb): Return gpg_error_t instead of int.
(check_own_socket_thread, check_for_running_agent): Create assuan
context before connecting to server.
* command.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(write_and_clear_outbuf): Use gpg_error_t instead of
assuan_error_t.
(cmd_geteventcounter, cmd_istrusted, cmd_listtrusted)
(cmd_marktrusted, cmd_havekey, cmd_sigkey, cmd_setkeydesc)
(cmd_sethash, cmd_pksign, cmd_pkdecrypt, cmd_genkey, cmd_readkey)
(cmd_keyinfo, cmd_get_passphrase, cmd_clear_passphrase)
(cmd_get_confirmation, cmd_learn, cmd_passwd)
(cmd_preset_passphrase, cmd_scd, cmd_getval, cmd_putval)
(cmd_updatestartuptty, cmd_killagent, cmd_reloadagent)
(cmd_getinfo, option_handler): Return gpg_error_t instead of int.
(post_cmd_notify): Change type of ERR to gpg_error_t from int.
(io_monitor): Add hook argument. Use symbols for constants.
(register_commands): Change return type of HANDLER to gpg_error_t.
(start_command_handler): Allocate assuan context before starting
server.
* call-pinentry.c: Include "scdaemon.h" before <assuan.h> because
of GPG_ERR_SOURCE_DEFAULT check.
(unlock_pinentry): Call assuan_release instead of
assuan_disconnect.
(getinfo_pid_cb, getpin_cb): Return gpg_error_t instead of int.
(start_pinentry): Allocate assuan context before connecting to
server.
* call-scd.c (membuf_data_cb, learn_status_cb, get_serialno_cb)
(membuf_data_cb, inq_needpin, card_getattr_cb, pass_status_thru)
(pass_data_thru): Change return type to gpg_error_t.
(start_scd): Allocate assuan context before connecting to server.
common/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* asshelp.c (start_new_gpg_agent): Allocate assuan context before
starting server.
g10/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* call-agent.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(learn_status_cb, dummy_data_cb, get_serialno_cb, default_inq_cb)
(learn_status_cb, inq_writecert_parms, inq_writekey_parms)
(scd_genkey_cb, membuf_data_cb): Return gpg_error_t instead of
int.
* gpg.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(main): Update to new Assuan API.
* server.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(option_handler, cmd_recipient, cmd_signer, cmd_encrypt)
(cmd_decrypt, cmd_verify, cmd_sign, cmd_import, cmd_export)
(cmd_delkeys, cmd_message, do_listkeys, cmd_listkeys)
(cmd_listsecretkeys, cmd_genkey, cmd_getinfo): Return gpg_error_t
instead of int.
(register_commands): Allocate assuan context before starting
server.
(gpg_server): Allocate assuan_context before starting server.
scd/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* command.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(option_handler, open_card, cmd_serialno, cmd_lean, cmd_readcert)
(cmd_readkey, cmd_setdata, cmd_pksign, cmd_pkauth, cmd_pkdecrypt)
(cmd_getattr, cmd_setattr, cmd_writecert, cmd_writekey)
(cmd_genkey, cmd_random, cmd_passwd, cmd_checkpin, cmd_lock)
(cmd_unlock, cmd_getinfo, cmd_restart, cmd_disconnect, cmd_apdu)
(cmd_killscd): Return gpg_error_t instead of int.
(scd_command_handler): Allocate assuan context before starting server.
* scdaemon.c (main): Update to new Assuan API.
sm/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* gpgsm.c (main): Update to new assuan API.
* server.c: Include "gpgsm.h" before <assuan.h> due to check for
GPG_ERR_SOURCE_DEFAULT and assuan.h now including gpg-error.h.
(option_handler, cmd_recipient, cmd_signer, cmd_encrypt)
(cmd_decrypt, cmd_verify, cmd_sign, cmd_import, cmd_export)
(cmd_delkeys, cmd_message, cmd_listkeys, cmd_dumpkeys)
(cmd_listsecretkeys, cmd_dumpsecretkeys, cmd_genkey)
(cmd_getauditlog, cmd_getinfo): Return gpg_error_t instead of int.
(register_commands): Same for member HANDLER in table.
(gpgsm_server): Allocate assuan context before starting server.
* sm/call-dirmngr.c:
* call-dirmngr.c (prepare_dirmngr): Check for CTX and error before
setting LDAPSERVER.
(start_dirmngr_ext): Allocate assuan context before starting
server.
(inq_certificate, isvalid_status_cb, lookup_cb, lookup_status_cb)
(run_command_cb, run_command_inq_cb, run_command_status_cb):
Return gpg_error_t instead of int.
tools/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* gpg-connect-agent.c (getinfo_pid_cb, read_and_print_response)
(main): Update to new Assuan API.
2009-09-23 00:01:25 +00:00
|
|
|
struct assuan_malloc_hooks malloc_hooks;
|
2016-03-07 18:09:41 +01:00
|
|
|
int pwfd = -1;
|
2020-12-04 11:51:48 +01:00
|
|
|
|
|
|
|
static const char *homedirvalue;
|
2004-08-17 15:26:22 +00:00
|
|
|
|
2015-01-28 19:57:22 +01:00
|
|
|
early_system_init ();
|
2014-05-07 18:18:27 +02:00
|
|
|
gnupg_reopen_std (GPGSM_NAME);
|
2003-08-05 17:11:04 +00:00
|
|
|
/* trap_unaligned ();*/
|
2007-06-26 13:48:44 +00:00
|
|
|
gnupg_rl_initialize ();
|
2003-08-05 17:11:04 +00:00
|
|
|
set_strusage (my_strusage);
|
|
|
|
gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
|
|
|
|
|
|
|
|
/* Please note that we may running SUID(ROOT), so be very CAREFUL
|
|
|
|
when adding any stuff between here and the call to secmem_init()
|
|
|
|
somewhere after the option parsing */
|
2022-04-20 09:20:35 +02:00
|
|
|
log_set_prefix (GPGSM_NAME, GPGRT_LOG_WITH_PREFIX|GPGRT_LOG_NO_REGISTRY);
|
2004-02-18 17:00:21 +00:00
|
|
|
|
2007-06-14 17:05:07 +00:00
|
|
|
/* Make sure that our subsystems are ready. */
|
2010-08-18 19:25:15 +00:00
|
|
|
i18n_init ();
|
2010-03-22 12:46:05 +00:00
|
|
|
init_common_subsystems (&argc, &argv);
|
2004-02-18 17:00:21 +00:00
|
|
|
|
|
|
|
/* Check that the libraries are suitable. Do it here because the
|
2003-08-05 17:11:04 +00:00
|
|
|
option parse may need services of the library */
|
|
|
|
if (!ksba_check_version (NEED_KSBA_VERSION) )
|
2007-04-20 16:59:37 +00:00
|
|
|
log_fatal (_("%s is too old (need %s, have %s)\n"), "libksba",
|
|
|
|
NEED_KSBA_VERSION, ksba_check_version (NULL) );
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2004-12-15 14:15:54 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
|
|
|
|
|
|
|
|
may_coredump = disable_core_dumps ();
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
gnupg_init_signals (0, emergency_cleanup);
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2011-09-28 15:41:58 +02:00
|
|
|
dotlock_create (NULL, 0); /* Register lockfile cleanup. */
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2017-06-07 15:38:50 +02:00
|
|
|
/* Tell the compliance module who we are. */
|
|
|
|
gnupg_initialize_compliance (GNUPG_MODULE_NAME_GPGSM);
|
|
|
|
|
2014-11-28 09:44:19 +01:00
|
|
|
opt.autostart = 1;
|
2009-07-07 10:02:41 +00:00
|
|
|
opt.session_env = session_env_new ();
|
|
|
|
if (!opt.session_env)
|
|
|
|
log_fatal ("error allocating session environment block: %s\n",
|
|
|
|
strerror (errno));
|
|
|
|
|
2008-12-10 10:57:47 +00:00
|
|
|
/* Note: If you change this default cipher algorithm , please
|
|
|
|
remember to update the Gpgconflist entry as well. */
|
2011-02-04 12:57:53 +01:00
|
|
|
opt.def_cipher_algoid = DEFAULT_CIPHER_ALGO;
|
2004-12-15 14:15:54 +00:00
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2004-12-21 10:03:00 +00:00
|
|
|
/* First check whether we have a config file on the commandline */
|
2003-08-05 17:11:04 +00:00
|
|
|
orig_argc = argc;
|
|
|
|
orig_argv = argv;
|
|
|
|
pargs.argc = &argc;
|
|
|
|
pargs.argv = &argv;
|
2020-12-04 11:51:48 +01:00
|
|
|
pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
|
|
|
|
while (gnupg_argparse (NULL, &pargs, opts))
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
2020-12-04 11:51:48 +01:00
|
|
|
switch (pargs.r_opt)
|
2014-08-14 17:14:21 +02:00
|
|
|
{
|
2020-12-04 11:51:48 +01:00
|
|
|
case oDebug:
|
|
|
|
case oDebugAll:
|
|
|
|
debug_argparser++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case oNoOptions:
|
|
|
|
/* Set here here because the homedir would otherwise be
|
|
|
|
* created before main option parsing starts. */
|
2014-08-14 17:14:21 +02:00
|
|
|
opt.no_homedir_creation = 1;
|
2020-12-04 11:51:48 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case oHomedir:
|
|
|
|
homedirvalue = pargs.r.ret_str;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aCallProtectTool:
|
|
|
|
/* Make sure that --version and --help are passed to the
|
|
|
|
* protect-tool. */
|
|
|
|
goto leave_cmdline_parser;
|
2014-08-14 17:14:21 +02:00
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
2020-12-04 11:51:48 +01:00
|
|
|
leave_cmdline_parser:
|
|
|
|
/* Reset the flags. */
|
|
|
|
pargs.flags &= ~(ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
|
2011-02-04 12:57:53 +01:00
|
|
|
|
|
|
|
|
2008-11-18 18:01:03 +00:00
|
|
|
/* Initialize the secure memory. */
|
2003-08-05 17:11:04 +00:00
|
|
|
gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);
|
|
|
|
maybe_setuid = 0;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
/*
|
2020-12-04 11:51:48 +01:00
|
|
|
* Now we are now working under our real uid
|
|
|
|
*/
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
ksba_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free );
|
2003-12-16 16:31:16 +00:00
|
|
|
|
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* configure.ac (NEED_LIBASSUAN_API, NEED_LIBASSUAN_VERSION):
Update to new API (2, 1.1.0).
agent/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* gpg-agent.c (parse_rereadable_options): Don't set global assuan
log file (there ain't one anymore).
(main): Update to new API.
(check_own_socket_pid_cb): Return gpg_error_t instead of int.
(check_own_socket_thread, check_for_running_agent): Create assuan
context before connecting to server.
* command.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(write_and_clear_outbuf): Use gpg_error_t instead of
assuan_error_t.
(cmd_geteventcounter, cmd_istrusted, cmd_listtrusted)
(cmd_marktrusted, cmd_havekey, cmd_sigkey, cmd_setkeydesc)
(cmd_sethash, cmd_pksign, cmd_pkdecrypt, cmd_genkey, cmd_readkey)
(cmd_keyinfo, cmd_get_passphrase, cmd_clear_passphrase)
(cmd_get_confirmation, cmd_learn, cmd_passwd)
(cmd_preset_passphrase, cmd_scd, cmd_getval, cmd_putval)
(cmd_updatestartuptty, cmd_killagent, cmd_reloadagent)
(cmd_getinfo, option_handler): Return gpg_error_t instead of int.
(post_cmd_notify): Change type of ERR to gpg_error_t from int.
(io_monitor): Add hook argument. Use symbols for constants.
(register_commands): Change return type of HANDLER to gpg_error_t.
(start_command_handler): Allocate assuan context before starting
server.
* call-pinentry.c: Include "scdaemon.h" before <assuan.h> because
of GPG_ERR_SOURCE_DEFAULT check.
(unlock_pinentry): Call assuan_release instead of
assuan_disconnect.
(getinfo_pid_cb, getpin_cb): Return gpg_error_t instead of int.
(start_pinentry): Allocate assuan context before connecting to
server.
* call-scd.c (membuf_data_cb, learn_status_cb, get_serialno_cb)
(membuf_data_cb, inq_needpin, card_getattr_cb, pass_status_thru)
(pass_data_thru): Change return type to gpg_error_t.
(start_scd): Allocate assuan context before connecting to server.
common/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* asshelp.c (start_new_gpg_agent): Allocate assuan context before
starting server.
g10/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* call-agent.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(learn_status_cb, dummy_data_cb, get_serialno_cb, default_inq_cb)
(learn_status_cb, inq_writecert_parms, inq_writekey_parms)
(scd_genkey_cb, membuf_data_cb): Return gpg_error_t instead of
int.
* gpg.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(main): Update to new Assuan API.
* server.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(option_handler, cmd_recipient, cmd_signer, cmd_encrypt)
(cmd_decrypt, cmd_verify, cmd_sign, cmd_import, cmd_export)
(cmd_delkeys, cmd_message, do_listkeys, cmd_listkeys)
(cmd_listsecretkeys, cmd_genkey, cmd_getinfo): Return gpg_error_t
instead of int.
(register_commands): Allocate assuan context before starting
server.
(gpg_server): Allocate assuan_context before starting server.
scd/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* command.c: Include "scdaemon.h" before <assuan.h> because of
GPG_ERR_SOURCE_DEFAULT check.
(option_handler, open_card, cmd_serialno, cmd_lean, cmd_readcert)
(cmd_readkey, cmd_setdata, cmd_pksign, cmd_pkauth, cmd_pkdecrypt)
(cmd_getattr, cmd_setattr, cmd_writecert, cmd_writekey)
(cmd_genkey, cmd_random, cmd_passwd, cmd_checkpin, cmd_lock)
(cmd_unlock, cmd_getinfo, cmd_restart, cmd_disconnect, cmd_apdu)
(cmd_killscd): Return gpg_error_t instead of int.
(scd_command_handler): Allocate assuan context before starting server.
* scdaemon.c (main): Update to new Assuan API.
sm/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* gpgsm.c (main): Update to new assuan API.
* server.c: Include "gpgsm.h" before <assuan.h> due to check for
GPG_ERR_SOURCE_DEFAULT and assuan.h now including gpg-error.h.
(option_handler, cmd_recipient, cmd_signer, cmd_encrypt)
(cmd_decrypt, cmd_verify, cmd_sign, cmd_import, cmd_export)
(cmd_delkeys, cmd_message, cmd_listkeys, cmd_dumpkeys)
(cmd_listsecretkeys, cmd_dumpsecretkeys, cmd_genkey)
(cmd_getauditlog, cmd_getinfo): Return gpg_error_t instead of int.
(register_commands): Same for member HANDLER in table.
(gpgsm_server): Allocate assuan context before starting server.
* sm/call-dirmngr.c:
* call-dirmngr.c (prepare_dirmngr): Check for CTX and error before
setting LDAPSERVER.
(start_dirmngr_ext): Allocate assuan context before starting
server.
(inq_certificate, isvalid_status_cb, lookup_cb, lookup_status_cb)
(run_command_cb, run_command_inq_cb, run_command_status_cb):
Return gpg_error_t instead of int.
tools/
2009-09-23 Marcus Brinkmann <marcus@g10code.de>
* gpg-connect-agent.c (getinfo_pid_cb, read_and_print_response)
(main): Update to new Assuan API.
2009-09-23 00:01:25 +00:00
|
|
|
malloc_hooks.malloc = gcry_malloc;
|
|
|
|
malloc_hooks.realloc = gcry_realloc;
|
|
|
|
malloc_hooks.free = gcry_free;
|
|
|
|
assuan_set_malloc_hooks (&malloc_hooks);
|
|
|
|
assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
|
2016-09-05 10:55:10 +02:00
|
|
|
setup_libassuan_logging (&opt.debug, NULL);
|
2003-12-16 16:31:16 +00:00
|
|
|
|
2020-12-04 11:51:48 +01:00
|
|
|
/* Set homedir. */
|
|
|
|
gnupg_set_homedir (homedirvalue);
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
/* Setup a default control structure for command line mode */
|
|
|
|
memset (&ctrl, 0, sizeof ctrl);
|
|
|
|
gpgsm_init_default_ctrl (&ctrl);
|
|
|
|
ctrl.no_server = 1;
|
2009-07-07 10:02:41 +00:00
|
|
|
ctrl.status_fd = -1; /* No status output. */
|
2003-08-05 17:11:04 +00:00
|
|
|
ctrl.autodetect_encoding = 1;
|
|
|
|
|
2004-08-17 15:26:22 +00:00
|
|
|
/* Set the default policy file */
|
2016-06-07 10:59:46 +02:00
|
|
|
opt.policy_file = make_filename (gnupg_homedir (), "policies.txt", NULL);
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2020-12-04 11:51:48 +01:00
|
|
|
/* The configuraton directories for use by gpgrt_argparser. */
|
|
|
|
gnupg_set_confdir (GNUPG_CONFDIR_SYS, gnupg_sysconfdir ());
|
|
|
|
gnupg_set_confdir (GNUPG_CONFDIR_USER, gnupg_homedir ());
|
|
|
|
|
|
|
|
/* We are re-using the struct, thus the reset flag. We OR the
|
|
|
|
* flags so that the internal intialized flag won't be cleared. */
|
2003-08-05 17:11:04 +00:00
|
|
|
argc = orig_argc;
|
|
|
|
argv = orig_argv;
|
|
|
|
pargs.argc = &argc;
|
|
|
|
pargs.argv = &argv;
|
2020-12-04 11:51:48 +01:00
|
|
|
pargs.flags |= (ARGPARSE_FLAG_RESET
|
|
|
|
| ARGPARSE_FLAG_KEEP
|
|
|
|
| ARGPARSE_FLAG_SYS
|
|
|
|
| ARGPARSE_FLAG_USER);
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
while (!no_more_options
|
2020-12-04 11:51:48 +01:00
|
|
|
&& gnupg_argparser (&pargs, opts, GPGSM_NAME EXTSEP_S "conf"))
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
|
|
|
switch (pargs.r_opt)
|
|
|
|
{
|
2020-12-04 11:51:48 +01:00
|
|
|
case ARGPARSE_CONFFILE:
|
|
|
|
if (debug_argparser)
|
|
|
|
log_info (_("reading options from '%s'\n"),
|
|
|
|
pargs.r_type? pargs.r.ret_str: "[cmdline]");
|
|
|
|
if (pargs.r_type)
|
|
|
|
{
|
|
|
|
xfree (last_configname);
|
|
|
|
last_configname = xstrdup (pargs.r.ret_str);
|
|
|
|
configname = last_configname;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
configname = NULL;
|
|
|
|
break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
case aGPGConfList:
|
|
|
|
case aGPGConfTest:
|
2004-02-18 17:00:21 +00:00
|
|
|
set_cmd (&cmd, pargs.r_opt);
|
|
|
|
do_not_setup_keys = 1;
|
2020-08-25 11:36:12 +02:00
|
|
|
default_keyring = 0;
|
2004-02-18 17:00:21 +00:00
|
|
|
nogreeting = 1;
|
|
|
|
break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
case aServer:
|
2003-08-05 17:11:04 +00:00
|
|
|
opt.batch = 1;
|
|
|
|
set_cmd (&cmd, aServer);
|
|
|
|
break;
|
2004-02-18 17:00:21 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case aCallDirmngr:
|
|
|
|
opt.batch = 1;
|
|
|
|
set_cmd (&cmd, aCallDirmngr);
|
2004-02-18 17:00:21 +00:00
|
|
|
do_not_setup_keys = 1;
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aCallProtectTool:
|
|
|
|
opt.batch = 1;
|
|
|
|
set_cmd (&cmd, aCallProtectTool);
|
|
|
|
no_more_options = 1; /* Stop parsing. */
|
2004-02-18 17:00:21 +00:00
|
|
|
do_not_setup_keys = 1;
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case aDeleteKey:
|
|
|
|
set_cmd (&cmd, aDeleteKey);
|
|
|
|
/*greeting=1;*/
|
2004-02-18 17:00:21 +00:00
|
|
|
do_not_setup_keys = 1;
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aDetachedSign:
|
|
|
|
detached_sig = 1;
|
2011-02-04 12:57:53 +01:00
|
|
|
set_cmd (&cmd, aSign );
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
2004-02-18 17:00:21 +00:00
|
|
|
case aKeygen:
|
|
|
|
set_cmd (&cmd, aKeygen);
|
2011-02-04 12:57:53 +01:00
|
|
|
greeting=1;
|
2004-02-18 17:00:21 +00:00
|
|
|
do_not_setup_keys = 1;
|
|
|
|
break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
case aImport:
|
|
|
|
case aSendKeys:
|
|
|
|
case aRecvKeys:
|
|
|
|
case aExport:
|
|
|
|
case aExportSecretKeyP12:
|
2014-06-03 18:57:33 +02:00
|
|
|
case aExportSecretKeyP8:
|
|
|
|
case aExportSecretKeyRaw:
|
2004-04-22 13:03:44 +00:00
|
|
|
case aDumpKeys:
|
2006-09-13 15:57:30 +00:00
|
|
|
case aDumpChain:
|
2011-02-04 12:57:53 +01:00
|
|
|
case aDumpExternalKeys:
|
|
|
|
case aDumpSecretKeys:
|
2004-02-18 17:00:21 +00:00
|
|
|
case aListKeys:
|
2011-02-04 12:57:53 +01:00
|
|
|
case aListExternalKeys:
|
|
|
|
case aListSecretKeys:
|
|
|
|
case aListChain:
|
|
|
|
case aLearnCard:
|
|
|
|
case aPasswd:
|
2004-04-28 08:59:34 +00:00
|
|
|
case aKeydbClearSomeCertFlags:
|
2004-02-18 17:00:21 +00:00
|
|
|
do_not_setup_keys = 1;
|
|
|
|
set_cmd (&cmd, pargs.r_opt);
|
|
|
|
break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
case aEncr:
|
2007-08-14 16:50:27 +00:00
|
|
|
recp_required = 1;
|
|
|
|
set_cmd (&cmd, pargs.r_opt);
|
|
|
|
break;
|
|
|
|
|
2004-02-18 17:00:21 +00:00
|
|
|
case aSym:
|
2011-02-04 12:57:53 +01:00
|
|
|
case aDecrypt:
|
|
|
|
case aSign:
|
|
|
|
case aClearsign:
|
|
|
|
case aVerify:
|
2004-02-18 17:00:21 +00:00
|
|
|
set_cmd (&cmd, pargs.r_opt);
|
|
|
|
break;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2007-03-20 10:00:55 +00:00
|
|
|
/* Output encoding selection. */
|
2003-08-05 17:11:04 +00:00
|
|
|
case oArmor:
|
|
|
|
ctrl.create_pem = 1;
|
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
case oBase64:
|
2003-08-05 17:11:04 +00:00
|
|
|
ctrl.create_pem = 0;
|
|
|
|
ctrl.create_base64 = 1;
|
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
case oNoArmor:
|
2003-08-05 17:11:04 +00:00
|
|
|
ctrl.create_pem = 0;
|
|
|
|
ctrl.create_base64 = 0;
|
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2007-03-20 10:00:55 +00:00
|
|
|
case oP12Charset:
|
|
|
|
opt.p12_charset = pargs.r.ret_str;
|
|
|
|
break;
|
|
|
|
|
2016-03-07 18:09:41 +01:00
|
|
|
case oPassphraseFD:
|
|
|
|
pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case oPinentryMode:
|
|
|
|
opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
|
|
|
|
if (opt.pinentry_mode == -1)
|
|
|
|
log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
|
2018-03-23 09:06:20 +01:00
|
|
|
case oRequestOrigin:
|
|
|
|
opt.request_origin = parse_request_origin (pargs.r.ret_str);
|
|
|
|
if (opt.request_origin == -1)
|
|
|
|
log_error (_("invalid request origin '%s'\n"), pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
|
2007-03-20 10:00:55 +00:00
|
|
|
/* Input encoding selection. */
|
2003-08-05 17:11:04 +00:00
|
|
|
case oAssumeArmor:
|
|
|
|
ctrl.autodetect_encoding = 0;
|
|
|
|
ctrl.is_pem = 1;
|
|
|
|
ctrl.is_base64 = 0;
|
|
|
|
break;
|
|
|
|
case oAssumeBase64:
|
|
|
|
ctrl.autodetect_encoding = 0;
|
|
|
|
ctrl.is_pem = 0;
|
|
|
|
ctrl.is_base64 = 1;
|
|
|
|
break;
|
|
|
|
case oAssumeBinary:
|
|
|
|
ctrl.autodetect_encoding = 0;
|
|
|
|
ctrl.is_pem = 0;
|
|
|
|
ctrl.is_base64 = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case oDisableCRLChecks:
|
|
|
|
opt.no_crl_check = 1;
|
|
|
|
break;
|
|
|
|
case oEnableCRLChecks:
|
|
|
|
opt.no_crl_check = 0;
|
|
|
|
break;
|
2005-04-21 09:33:07 +00:00
|
|
|
case oDisableTrustedCertCRLCheck:
|
|
|
|
opt.no_trusted_cert_crl_check = 1;
|
|
|
|
break;
|
|
|
|
case oEnableTrustedCertCRLCheck:
|
|
|
|
opt.no_trusted_cert_crl_check = 0;
|
|
|
|
break;
|
2004-04-07 17:59:18 +00:00
|
|
|
case oForceCRLRefresh:
|
|
|
|
opt.force_crl_refresh = 1;
|
|
|
|
break;
|
2020-03-27 21:11:25 +01:00
|
|
|
case oEnableIssuerBasedCRLCheck:
|
|
|
|
opt.enable_issuer_based_crl_check = 1;
|
|
|
|
break;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2003-12-01 10:54:30 +00:00
|
|
|
case oDisableOCSP:
|
2004-03-15 08:39:48 +00:00
|
|
|
ctrl.use_ocsp = opt.enable_ocsp = 0;
|
2003-12-01 10:54:30 +00:00
|
|
|
break;
|
|
|
|
case oEnableOCSP:
|
2004-03-15 08:39:48 +00:00
|
|
|
ctrl.use_ocsp = opt.enable_ocsp = 1;
|
2003-12-01 10:54:30 +00:00
|
|
|
break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
case oIncludeCerts:
|
|
|
|
ctrl.include_certs = default_include_certs = pargs.r.ret_int;
|
2006-06-20 17:21:37 +00:00
|
|
|
break;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
case oPolicyFile:
|
|
|
|
xfree (opt.policy_file);
|
|
|
|
if (*pargs.r.ret_str)
|
|
|
|
opt.policy_file = xstrdup (pargs.r.ret_str);
|
|
|
|
else
|
|
|
|
opt.policy_file = NULL;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case oDisablePolicyChecks:
|
|
|
|
opt.no_policy_check = 1;
|
|
|
|
break;
|
|
|
|
case oEnablePolicyChecks:
|
|
|
|
opt.no_policy_check = 0;
|
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case oAutoIssuerKeyRetrieve:
|
|
|
|
opt.auto_issuer_key_retrieve = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case oOutput: opt.outfile = pargs.r.ret_str; break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case oQuiet: opt.quiet = 1; break;
|
|
|
|
case oNoTTY: /* fixme:tty_no_terminal(1);*/ break;
|
|
|
|
case oDryRun: opt.dry_run = 1; break;
|
|
|
|
|
|
|
|
case oVerbose:
|
|
|
|
opt.verbose++;
|
|
|
|
gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
|
|
|
|
break;
|
|
|
|
case oNoVerbose:
|
|
|
|
opt.verbose = 0;
|
|
|
|
gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case oLogFile: logfile = pargs.r.ret_str; break;
|
2011-02-04 12:57:53 +01:00
|
|
|
case oNoLogFile: logfile = NULL; break;
|
2005-07-21 18:29:13 +00:00
|
|
|
|
2007-11-19 16:03:50 +00:00
|
|
|
case oAuditLog: auditlog = pargs.r.ret_str; break;
|
2009-12-02 18:33:59 +00:00
|
|
|
case oHtmlAuditLog: htmlauditlog = pargs.r.ret_str; break;
|
2007-11-19 16:03:50 +00:00
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
case oBatch:
|
2003-08-05 17:11:04 +00:00
|
|
|
opt.batch = 1;
|
|
|
|
greeting = 0;
|
|
|
|
break;
|
|
|
|
case oNoBatch: opt.batch = 0; break;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case oAnswerYes: opt.answer_yes = 1; break;
|
|
|
|
case oAnswerNo: opt.answer_no = 1; break;
|
|
|
|
|
|
|
|
case oKeyring: append_to_strlist (&nrings, pargs.r.ret_str); break;
|
|
|
|
|
2015-06-23 09:12:44 +02:00
|
|
|
case oDebug:
|
|
|
|
if (parse_debug_flag (pargs.r.ret_str, &debug_value, debug_flags))
|
|
|
|
{
|
|
|
|
pargs.r_opt = ARGPARSE_INVALID_ARG;
|
|
|
|
pargs.err = ARGPARSE_PRINT_ERROR;
|
|
|
|
}
|
|
|
|
break;
|
2004-12-02 07:48:09 +00:00
|
|
|
case oDebugAll: debug_value = ~0; break;
|
2005-07-21 18:29:13 +00:00
|
|
|
case oDebugNone: debug_value = 0; break;
|
2004-02-18 17:00:21 +00:00
|
|
|
case oDebugLevel: debug_level = pargs.r.ret_str; break;
|
2003-08-05 17:11:04 +00:00
|
|
|
case oDebugWait: debug_wait = pargs.r.ret_int; break;
|
2004-05-11 09:54:52 +00:00
|
|
|
case oDebugAllowCoreDump:
|
|
|
|
may_coredump = enable_core_dumps ();
|
|
|
|
break;
|
2003-08-05 17:11:04 +00:00
|
|
|
case oDebugNoChainValidation: opt.no_chain_validation = 1; break;
|
2004-02-20 13:46:21 +00:00
|
|
|
case oDebugIgnoreExpiration: opt.ignore_expiration = 1; break;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2022-06-13 17:46:40 +02:00
|
|
|
case oCompatibilityFlags:
|
|
|
|
if (parse_compatibility_flags (pargs.r.ret_str, &opt.compat_flags,
|
|
|
|
compatibility_flags))
|
|
|
|
{
|
|
|
|
pargs.r_opt = ARGPARSE_INVALID_ARG;
|
|
|
|
pargs.err = ARGPARSE_PRINT_ERROR;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2019-03-25 14:05:52 +01:00
|
|
|
case oStatusFD:
|
|
|
|
ctrl.status_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 1);
|
|
|
|
break;
|
|
|
|
case oLoggerFD:
|
|
|
|
log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
|
|
|
|
break;
|
2004-02-17 15:05:04 +00:00
|
|
|
case oWithMD5Fingerprint:
|
Fix more spelling
* NEWS, acinclude.m4, agent/command-ssh.c, agent/command.c,
agent/gpg-agent.c, agent/keyformat.txt, agent/protect-tool.c,
common/asshelp.c, common/b64enc.c, common/recsel.c, doc/DETAILS,
doc/HACKING, doc/Notes, doc/TRANSLATE, doc/dirmngr.texi,
doc/faq.org, doc/gpg-agent.texi, doc/gpg.texi, doc/gpgsm.texi,
doc/instguide.texi, g10/armor.c, g10/gpg.c, g10/keyedit.c,
g10/mainproc.c, g10/pkclist.c, g10/tofu.c, g13/sh-cmd.c,
g13/sh-dmcrypt.c, kbx/keybox-init.c, m4/pkg.m4, sm/call-dirmngr.c,
sm/gpgsm.c, tests/Makefile.am, tests/gpgscm/Manual.txt,
tests/gpgscm/scheme.c, tests/openpgp/gpgv-forged-keyring.scm,
tests/openpgp/multisig.test, tests/openpgp/verify.scm,
tests/pkits/README, tools/applygnupgdefaults,
tools/gpg-connect-agent.c, tools/mime-maker.c, tools/mime-parser.c:
minor spelling cleanup.
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2016-09-15 14:21:15 -04:00
|
|
|
opt.with_md5_fingerprint=1; /*fall through*/
|
2003-08-05 17:11:04 +00:00
|
|
|
case oWithFingerprint:
|
Fix more spelling
* NEWS, acinclude.m4, agent/command-ssh.c, agent/command.c,
agent/gpg-agent.c, agent/keyformat.txt, agent/protect-tool.c,
common/asshelp.c, common/b64enc.c, common/recsel.c, doc/DETAILS,
doc/HACKING, doc/Notes, doc/TRANSLATE, doc/dirmngr.texi,
doc/faq.org, doc/gpg-agent.texi, doc/gpg.texi, doc/gpgsm.texi,
doc/instguide.texi, g10/armor.c, g10/gpg.c, g10/keyedit.c,
g10/mainproc.c, g10/pkclist.c, g10/tofu.c, g13/sh-cmd.c,
g13/sh-dmcrypt.c, kbx/keybox-init.c, m4/pkg.m4, sm/call-dirmngr.c,
sm/gpgsm.c, tests/Makefile.am, tests/gpgscm/Manual.txt,
tests/gpgscm/scheme.c, tests/openpgp/gpgv-forged-keyring.scm,
tests/openpgp/multisig.test, tests/openpgp/verify.scm,
tests/pkits/README, tools/applygnupgdefaults,
tools/gpg-connect-agent.c, tools/mime-maker.c, tools/mime-parser.c:
minor spelling cleanup.
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2016-09-15 14:21:15 -04:00
|
|
|
with_fpr=1; /*fall through*/
|
2008-11-13 12:37:45 +00:00
|
|
|
case aFingerprint:
|
2003-08-05 17:11:04 +00:00
|
|
|
opt.fingerprint++;
|
|
|
|
break;
|
2010-10-08 11:11:08 +00:00
|
|
|
|
|
|
|
case oWithKeygrip:
|
|
|
|
opt.with_keygrip = 1;
|
|
|
|
break;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2016-06-07 10:59:46 +02:00
|
|
|
case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
|
2003-08-05 17:11:04 +00:00
|
|
|
case oAgentProgram: opt.agent_program = pargs.r.ret_str; break;
|
2009-07-07 10:02:41 +00:00
|
|
|
|
|
|
|
case oDisplay:
|
|
|
|
set_opt_session_env ("DISPLAY", pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
case oTTYname:
|
|
|
|
set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
case oTTYtype:
|
|
|
|
set_opt_session_env ("TERM", pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
case oXauthority:
|
|
|
|
set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case oLCctype: opt.lc_ctype = xstrdup (pargs.r.ret_str); break;
|
|
|
|
case oLCmessages: opt.lc_messages = xstrdup (pargs.r.ret_str); break;
|
2009-07-07 10:02:41 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
|
2008-02-19 10:33:35 +00:00
|
|
|
case oDisableDirmngr: opt.disable_dirmngr = 1; break;
|
2010-08-16 11:03:43 +00:00
|
|
|
case oPreferSystemDirmngr: /* Obsolete */; break;
|
2004-02-13 12:40:23 +00:00
|
|
|
case oProtectToolProgram:
|
2011-02-04 12:57:53 +01:00
|
|
|
opt.protect_tool_program = pargs.r.ret_str;
|
2004-02-13 12:40:23 +00:00
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case oFakedSystemTime:
|
2007-08-10 16:52:05 +00:00
|
|
|
{
|
2011-02-04 12:57:53 +01:00
|
|
|
time_t faked_time = isotime2epoch (pargs.r.ret_str);
|
2007-08-10 16:52:05 +00:00
|
|
|
if (faked_time == (time_t)(-1))
|
|
|
|
faked_time = (time_t)strtoul (pargs.r.ret_str, NULL, 10);
|
|
|
|
gnupg_set_time (faked_time, 0);
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case oNoDefKeyring: default_keyring = 0; break;
|
|
|
|
case oNoGreeting: nogreeting = 1; break;
|
|
|
|
|
|
|
|
case oDefaultKey:
|
2007-07-17 18:11:24 +00:00
|
|
|
if (*pargs.r.ret_str)
|
|
|
|
{
|
|
|
|
xfree (opt.local_user);
|
|
|
|
opt.local_user = xstrdup (pargs.r.ret_str);
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
case oDefRecipient:
|
|
|
|
if (*pargs.r.ret_str)
|
|
|
|
opt.def_recipient = xstrdup (pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
case oDefRecipientSelf:
|
|
|
|
xfree (opt.def_recipient);
|
|
|
|
opt.def_recipient = NULL;
|
|
|
|
opt.def_recipient_self = 1;
|
|
|
|
break;
|
|
|
|
case oNoDefRecipient:
|
|
|
|
xfree (opt.def_recipient);
|
|
|
|
opt.def_recipient = NULL;
|
|
|
|
opt.def_recipient_self = 0;
|
|
|
|
break;
|
|
|
|
|
Fix more spelling
* NEWS, acinclude.m4, agent/command-ssh.c, agent/command.c,
agent/gpg-agent.c, agent/keyformat.txt, agent/protect-tool.c,
common/asshelp.c, common/b64enc.c, common/recsel.c, doc/DETAILS,
doc/HACKING, doc/Notes, doc/TRANSLATE, doc/dirmngr.texi,
doc/faq.org, doc/gpg-agent.texi, doc/gpg.texi, doc/gpgsm.texi,
doc/instguide.texi, g10/armor.c, g10/gpg.c, g10/keyedit.c,
g10/mainproc.c, g10/pkclist.c, g10/tofu.c, g13/sh-cmd.c,
g13/sh-dmcrypt.c, kbx/keybox-init.c, m4/pkg.m4, sm/call-dirmngr.c,
sm/gpgsm.c, tests/Makefile.am, tests/gpgscm/Manual.txt,
tests/gpgscm/scheme.c, tests/openpgp/gpgv-forged-keyring.scm,
tests/openpgp/multisig.test, tests/openpgp/verify.scm,
tests/pkits/README, tools/applygnupgdefaults,
tools/gpg-connect-agent.c, tools/mime-maker.c, tools/mime-parser.c:
minor spelling cleanup.
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2016-09-15 14:21:15 -04:00
|
|
|
case oWithKeyData: opt.with_key_data=1; /* fall through */
|
2003-08-05 17:11:04 +00:00
|
|
|
case oWithColons: ctrl.with_colons = 1; break;
|
2014-06-03 21:35:59 +02:00
|
|
|
case oWithSecret: ctrl.with_secret = 1; break;
|
2004-02-17 15:05:04 +00:00
|
|
|
case oWithValidation: ctrl.with_validation=1; break;
|
2009-03-18 11:18:56 +00:00
|
|
|
case oWithEphemeralKeys: ctrl.with_ephemeral_keys=1; break;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
case oSkipVerify: opt.skip_verify=1; break;
|
|
|
|
|
2003-12-17 17:12:14 +00:00
|
|
|
case oNoEncryptTo: opt.no_encrypt_to = 1; break;
|
|
|
|
case oEncryptTo: /* Store the recipient in the second list */
|
2003-08-05 17:11:04 +00:00
|
|
|
sl = add_to_strlist (&remusr, pargs.r.ret_str);
|
|
|
|
sl->flags = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case oRecipient: /* store the recipient */
|
|
|
|
add_to_strlist ( &remusr, pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
|
2007-07-17 18:11:24 +00:00
|
|
|
case oUser: /* Store the local users, the first one is the default */
|
2003-08-05 17:11:04 +00:00
|
|
|
if (!opt.local_user)
|
2007-07-17 18:11:24 +00:00
|
|
|
opt.local_user = xstrdup (pargs.r.ret_str);
|
2003-08-05 17:11:04 +00:00
|
|
|
add_to_strlist (&locusr, pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case oNoSecmemWarn:
|
2011-02-04 12:57:53 +01:00
|
|
|
gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case oCipherAlgo:
|
|
|
|
opt.def_cipher_algoid = pargs.r.ret_str;
|
|
|
|
break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
case oDisableCipherAlgo:
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
|
|
|
int algo = gcry_cipher_map_name (pargs.r.ret_str);
|
|
|
|
gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
|
|
|
|
}
|
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
case oDisablePubkeyAlgo:
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
|
|
|
int algo = gcry_pk_map_name (pargs.r.ret_str);
|
|
|
|
gcry_pk_ctl (GCRYCTL_DISABLE_ALGO,&algo, sizeof algo );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2008-11-13 12:37:45 +00:00
|
|
|
case oDigestAlgo:
|
2009-03-26 19:27:04 +00:00
|
|
|
forced_digest_algo = pargs.r.ret_str;
|
2008-11-13 12:37:45 +00:00
|
|
|
break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
case oExtraDigestAlgo:
|
2007-12-13 15:45:40 +00:00
|
|
|
extra_digest_algo = pargs.r.ret_str;
|
|
|
|
break;
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
|
|
|
|
case oNoRandomSeedFile: use_random_seed = 0; break;
|
2008-02-19 10:33:35 +00:00
|
|
|
case oNoCommonCertsImport: no_common_certs_import = 1; break;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2016-11-29 16:18:24 +01:00
|
|
|
case oEnableSpecialFilenames:
|
|
|
|
enable_special_filenames ();
|
|
|
|
break;
|
2007-08-10 16:52:05 +00:00
|
|
|
|
|
|
|
case oValidationModel: parse_validation_model (pargs.r.ret_str); break;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2008-06-12 14:24:46 +00:00
|
|
|
case oKeyServer:
|
2021-05-26 14:28:26 +02:00
|
|
|
append_to_strlist (&opt.keyserver, pargs.r.ret_str);
|
2008-06-12 14:24:46 +00:00
|
|
|
break;
|
|
|
|
|
2022-01-27 15:07:02 +01:00
|
|
|
case oKeyServer_deprecated:
|
|
|
|
obsolete_option (configname, pargs.lineno, "ldapserver");
|
|
|
|
break;
|
|
|
|
|
2009-12-10 13:00:30 +00:00
|
|
|
case oIgnoreCertExtension:
|
|
|
|
add_to_strlist (&opt.ignored_cert_extensions, pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
|
2022-02-03 14:14:14 +01:00
|
|
|
case oIgnoreCertWithOID:
|
|
|
|
add_to_strlist (&opt.ignore_cert_with_oid, pargs.r.ret_str);
|
|
|
|
break;
|
|
|
|
|
2014-11-28 09:44:19 +01:00
|
|
|
case oNoAutostart: opt.autostart = 0; break;
|
|
|
|
|
2016-11-15 13:13:14 +01:00
|
|
|
case oCompliance:
|
2017-06-07 11:50:54 +02:00
|
|
|
{
|
|
|
|
struct gnupg_compliance_option compliance_options[] =
|
|
|
|
{
|
2017-12-18 12:05:02 +01:00
|
|
|
{ "gnupg", CO_GNUPG },
|
2017-06-07 11:50:54 +02:00
|
|
|
{ "de-vs", CO_DE_VS }
|
|
|
|
};
|
|
|
|
int compliance = gnupg_parse_compliance_option (pargs.r.ret_str,
|
|
|
|
compliance_options,
|
|
|
|
DIM (compliance_options),
|
|
|
|
opt.quiet);
|
|
|
|
if (compliance < 0)
|
2018-04-06 17:32:08 +02:00
|
|
|
log_inc_errorcount (); /* Force later termination. */
|
2017-06-07 11:50:54 +02:00
|
|
|
opt.compliance = compliance;
|
|
|
|
}
|
2016-11-15 13:13:14 +01:00
|
|
|
break;
|
|
|
|
|
2021-11-18 20:44:14 +01:00
|
|
|
case oMinRSALength: opt.min_rsa_length = pargs.r.ret_ulong; break;
|
|
|
|
|
2022-03-08 19:06:30 +01:00
|
|
|
case oRequireCompliance: opt.require_compliance = 1; break;
|
|
|
|
|
2011-02-04 12:57:53 +01:00
|
|
|
default:
|
2020-12-04 11:51:48 +01:00
|
|
|
if (configname)
|
|
|
|
pargs.err = ARGPARSE_PRINT_WARNING;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pargs.err = ARGPARSE_PRINT_ERROR;
|
|
|
|
/* The argparse function calls a plain exit and thus we
|
|
|
|
* need to print a status here. */
|
|
|
|
gpgsm_status_with_error (&ctrl, STATUS_FAILURE, "option-parser",
|
|
|
|
gpg_error (GPG_ERR_GENERAL));
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-04 11:51:48 +01:00
|
|
|
gnupg_argparse (NULL, &pargs, NULL); /* Release internal state. */
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2020-12-04 11:51:48 +01:00
|
|
|
if (!last_configname)
|
2016-06-07 10:59:46 +02:00
|
|
|
opt.config_filename = make_filename (gnupg_homedir (),
|
2014-06-25 19:26:33 +02:00
|
|
|
GPGSM_NAME EXTSEP_S "conf",
|
2014-05-07 18:18:27 +02:00
|
|
|
NULL);
|
2020-12-04 11:51:48 +01:00
|
|
|
else
|
|
|
|
opt.config_filename = last_configname;
|
2004-05-11 09:15:56 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (log_get_errorcount(0))
|
2018-04-06 17:32:08 +02:00
|
|
|
{
|
|
|
|
gpgsm_status_with_error (&ctrl, STATUS_FAILURE,
|
|
|
|
"option-parser", gpg_error (GPG_ERR_GENERAL));
|
|
|
|
gpgsm_exit(2);
|
|
|
|
}
|
2007-08-10 16:52:05 +00:00
|
|
|
|
2016-03-07 18:09:41 +01:00
|
|
|
if (pwfd != -1) /* Read the passphrase now. */
|
|
|
|
read_passphrase_from_fd (pwfd);
|
|
|
|
|
2009-07-07 10:02:41 +00:00
|
|
|
/* Now that we have the options parsed we need to update the default
|
2007-08-10 16:52:05 +00:00
|
|
|
control structure. */
|
|
|
|
gpgsm_init_default_ctrl (&ctrl);
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (nogreeting)
|
|
|
|
greeting = 0;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (greeting)
|
|
|
|
{
|
2010-08-18 19:25:15 +00:00
|
|
|
es_fprintf (es_stderr, "%s %s; %s\n",
|
|
|
|
strusage(11), strusage(13), strusage(14) );
|
|
|
|
es_fprintf (es_stderr, "%s\n", strusage(15) );
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
# ifdef IS_DEVELOPMENT_VERSION
|
|
|
|
if (!opt.batch)
|
|
|
|
{
|
|
|
|
log_info ("NOTE: THIS IS A DEVELOPMENT VERSION!\n");
|
|
|
|
log_info ("It is only intended for test purposes and should NOT be\n");
|
|
|
|
log_info ("used in a production environment or with production keys!\n");
|
|
|
|
}
|
|
|
|
# endif
|
|
|
|
|
|
|
|
if (may_coredump && !opt.quiet)
|
|
|
|
log_info (_("WARNING: program may create a core file!\n"));
|
|
|
|
|
2005-11-23 09:05:45 +00:00
|
|
|
/* if (opt.qualsig_approval && !opt.quiet) */
|
2015-11-16 12:41:46 +01:00
|
|
|
/* log_info (_("This software has officially been approved to " */
|
2005-11-23 09:05:45 +00:00
|
|
|
/* "create and verify\n" */
|
|
|
|
/* "qualified signatures according to German law.\n")); */
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (logfile && cmd == aServer)
|
|
|
|
{
|
|
|
|
log_set_file (logfile);
|
Call log_set_prefix() with human-readable labels.
* agent/preset-passphrase.c, agent/protect-tool.c, dirmngr/dirmngr.c
* dirmngr/t-http.c, g10/gpg.c, g10/gpgv.c, g13/g13-syshelp.c
* g13/g13.c, kbx/kbxutil.c, scd/scdaemon.c, sm/gpgsm.c
* tests/gpgscm/main.c, tools/gpg-check-pattern.c
* tools/gpg-connect-agent.c, tools/gpgconf.c, tools/gpgtar.c
* tools/symcryptrun.c: Invoke log_set_prefix() with
human-readable labels.
--
Some invocations of log_set_prefix() were done with raw numeric values
instead of values that humans can understand. Use symbolic
representations instead of numeric for better readability.
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2016-08-12 01:37:57 -04:00
|
|
|
log_set_prefix (NULL, GPGRT_LOG_WITH_PREFIX | GPGRT_LOG_WITH_TIME | GPGRT_LOG_WITH_PID);
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (gnupg_faked_time_p ())
|
|
|
|
{
|
2003-10-31 12:12:47 +00:00
|
|
|
gnupg_isotime_t tbuf;
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
log_info (_("WARNING: running with faked system time: "));
|
2003-10-31 12:12:47 +00:00
|
|
|
gnupg_get_isotime (tbuf);
|
2009-03-16 09:44:44 +00:00
|
|
|
dump_isotime (tbuf);
|
2003-08-05 17:11:04 +00:00
|
|
|
log_printf ("\n");
|
|
|
|
}
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2012-03-27 12:35:13 +02:00
|
|
|
/* Print a warning if an argument looks like an option. */
|
|
|
|
if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i=0; i < argc; i++)
|
|
|
|
if (argv[i][0] == '-' && argv[i][1] == '-')
|
2014-10-10 15:29:42 +02:00
|
|
|
log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
|
2012-03-27 12:35:13 +02:00
|
|
|
}
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
/*FIXME if (opt.batch) */
|
|
|
|
/* tty_batchmode (1); */
|
|
|
|
|
|
|
|
gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
|
|
|
|
|
2004-12-02 07:48:09 +00:00
|
|
|
set_debug ();
|
2022-06-13 17:46:40 +02:00
|
|
|
if (opt.verbose) /* Print the compatibility flags. */
|
|
|
|
parse_compatibility_flags (NULL, &opt.compat_flags, compatibility_flags);
|
2022-10-31 17:23:41 +01:00
|
|
|
gnupg_set_compliance_extra_info (CO_EXTRA_INFO_MIN_RSA, opt.min_rsa_length);
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2015-11-16 12:41:46 +01:00
|
|
|
/* Although we always use gpgsm_exit, we better install a regualr
|
2004-06-06 13:00:59 +00:00
|
|
|
exit handler so that at least the secure memory gets wiped
|
|
|
|
out. */
|
|
|
|
if (atexit (emergency_cleanup))
|
|
|
|
{
|
|
|
|
log_error ("atexit failed\n");
|
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2004-06-06 13:00:59 +00:00
|
|
|
/* Must do this after dropping setuid, because the mapping functions
|
2006-10-23 14:02:13 +00:00
|
|
|
may try to load an module and we may have disabled an algorithm.
|
|
|
|
We remap the commonly used algorithms to the OIDs for
|
|
|
|
convenience. We need to work with the OIDs because they are used
|
|
|
|
to check whether the encryption mode is actually available. */
|
|
|
|
if (!strcmp (opt.def_cipher_algoid, "3DES") )
|
|
|
|
opt.def_cipher_algoid = "1.2.840.113549.3.7";
|
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "AES")
|
|
|
|
|| !strcmp (opt.def_cipher_algoid, "AES128"))
|
|
|
|
opt.def_cipher_algoid = "2.16.840.1.101.3.4.1.2";
|
2016-06-14 15:57:57 +02:00
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "AES192") )
|
|
|
|
opt.def_cipher_algoid = "2.16.840.1.101.3.4.1.22";
|
2006-10-23 14:02:13 +00:00
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "AES256") )
|
|
|
|
opt.def_cipher_algoid = "2.16.840.1.101.3.4.1.42";
|
2007-08-14 16:50:27 +00:00
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "SERPENT")
|
|
|
|
|| !strcmp (opt.def_cipher_algoid, "SERPENT128") )
|
|
|
|
opt.def_cipher_algoid = "1.3.6.1.4.1.11591.13.2.2";
|
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "SERPENT192") )
|
|
|
|
opt.def_cipher_algoid = "1.3.6.1.4.1.11591.13.2.22";
|
2016-06-14 15:57:57 +02:00
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "SERPENT256") )
|
2007-08-14 16:50:27 +00:00
|
|
|
opt.def_cipher_algoid = "1.3.6.1.4.1.11591.13.2.42";
|
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "SEED") )
|
|
|
|
opt.def_cipher_algoid = "1.2.410.200004.1.4";
|
2011-02-04 12:57:53 +01:00
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "CAMELLIA")
|
2007-08-14 16:50:27 +00:00
|
|
|
|| !strcmp (opt.def_cipher_algoid, "CAMELLIA128") )
|
|
|
|
opt.def_cipher_algoid = "1.2.392.200011.61.1.1.1.2";
|
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "CAMELLIA192") )
|
|
|
|
opt.def_cipher_algoid = "1.2.392.200011.61.1.1.1.3";
|
|
|
|
else if (!strcmp (opt.def_cipher_algoid, "CAMELLIA256") )
|
|
|
|
opt.def_cipher_algoid = "1.2.392.200011.61.1.1.1.4";
|
2006-10-23 14:02:13 +00:00
|
|
|
|
|
|
|
if (cmd != aGPGConfList)
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
2006-10-23 14:02:13 +00:00
|
|
|
if ( !gcry_cipher_map_name (opt.def_cipher_algoid)
|
|
|
|
|| !gcry_cipher_mode_from_oid (opt.def_cipher_algoid))
|
|
|
|
log_error (_("selected cipher algorithm is invalid\n"));
|
|
|
|
|
2009-03-26 19:27:04 +00:00
|
|
|
if (forced_digest_algo)
|
2006-10-23 14:02:13 +00:00
|
|
|
{
|
2009-03-26 19:27:04 +00:00
|
|
|
opt.forced_digest_algo = gcry_md_map_name (forced_digest_algo);
|
|
|
|
if (our_md_test_algo(opt.forced_digest_algo) )
|
2006-10-23 14:02:13 +00:00
|
|
|
log_error (_("selected digest algorithm is invalid\n"));
|
|
|
|
}
|
2007-12-13 15:45:40 +00:00
|
|
|
if (extra_digest_algo)
|
|
|
|
{
|
|
|
|
opt.extra_digest_algo = gcry_md_map_name (extra_digest_algo);
|
|
|
|
if (our_md_test_algo (opt.extra_digest_algo) )
|
|
|
|
log_error (_("selected digest algorithm is invalid\n"));
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
|
2017-06-06 16:01:40 +02:00
|
|
|
/* Check our chosen algorithms against the list of allowed
|
|
|
|
* algorithms in the current compliance mode, and fail hard if it is
|
|
|
|
* not. This is us being nice to the user informing her early that
|
|
|
|
* the chosen algorithms are not available. We also check and
|
|
|
|
* enforce this right before the actual operation. */
|
|
|
|
if (! gnupg_cipher_is_allowed (opt.compliance,
|
|
|
|
cmd == aEncr || cmd == aSignEncr,
|
|
|
|
gcry_cipher_map_name (opt.def_cipher_algoid),
|
|
|
|
GCRY_CIPHER_MODE_NONE)
|
|
|
|
&& ! gnupg_cipher_is_allowed (opt.compliance,
|
|
|
|
cmd == aEncr || cmd == aSignEncr,
|
2017-06-20 08:31:07 +02:00
|
|
|
gcry_cipher_mode_from_oid
|
|
|
|
(opt.def_cipher_algoid),
|
2017-06-06 16:01:40 +02:00
|
|
|
GCRY_CIPHER_MODE_NONE))
|
2017-07-28 17:46:43 +02:00
|
|
|
log_error (_("cipher algorithm '%s' may not be used in %s mode\n"),
|
2017-06-20 08:31:07 +02:00
|
|
|
opt.def_cipher_algoid,
|
|
|
|
gnupg_compliance_option_string (opt.compliance));
|
2017-06-06 16:01:40 +02:00
|
|
|
|
|
|
|
if (forced_digest_algo
|
|
|
|
&& ! gnupg_digest_is_allowed (opt.compliance,
|
|
|
|
cmd == aSign
|
|
|
|
|| cmd == aSignEncr
|
|
|
|
|| cmd == aClearsign,
|
|
|
|
opt.forced_digest_algo))
|
2017-07-28 17:46:43 +02:00
|
|
|
log_error (_("digest algorithm '%s' may not be used in %s mode\n"),
|
2017-06-20 08:31:07 +02:00
|
|
|
forced_digest_algo,
|
|
|
|
gnupg_compliance_option_string (opt.compliance));
|
2017-06-06 16:01:40 +02:00
|
|
|
|
|
|
|
if (extra_digest_algo
|
|
|
|
&& ! gnupg_digest_is_allowed (opt.compliance,
|
|
|
|
cmd == aSign
|
|
|
|
|| cmd == aSignEncr
|
|
|
|
|| cmd == aClearsign,
|
|
|
|
opt.extra_digest_algo))
|
2017-07-28 17:46:43 +02:00
|
|
|
log_error (_("digest algorithm '%s' may not be used in %s mode\n"),
|
2018-10-24 19:55:19 +02:00
|
|
|
extra_digest_algo,
|
2017-06-20 08:31:07 +02:00
|
|
|
gnupg_compliance_option_string (opt.compliance));
|
2017-06-06 16:01:40 +02:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (log_get_errorcount(0))
|
2018-04-06 17:32:08 +02:00
|
|
|
{
|
|
|
|
gpgsm_status_with_error (&ctrl, STATUS_FAILURE, "option-postprocessing",
|
|
|
|
gpg_error (GPG_ERR_GENERAL));
|
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2004-06-06 13:00:59 +00:00
|
|
|
/* Set the random seed file. */
|
2011-02-04 12:57:53 +01:00
|
|
|
if (use_random_seed)
|
2007-08-02 18:12:43 +00:00
|
|
|
{
|
2016-06-07 10:59:46 +02:00
|
|
|
char *p = make_filename (gnupg_homedir (), "random_seed", NULL);
|
2007-08-02 18:12:43 +00:00
|
|
|
gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
|
|
|
|
xfree(p);
|
|
|
|
}
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (!cmd && opt.fingerprint && !with_fpr)
|
|
|
|
set_cmd (&cmd, aListKeys);
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2007-08-02 18:12:43 +00:00
|
|
|
/* Add default keybox. */
|
|
|
|
if (!nrings && default_keyring)
|
2006-09-18 09:28:58 +00:00
|
|
|
{
|
|
|
|
int created;
|
|
|
|
|
2016-11-10 17:01:19 +01:00
|
|
|
keydb_add_resource (&ctrl, "pubring.kbx", 0, &created);
|
2008-02-19 10:33:35 +00:00
|
|
|
if (created && !no_common_certs_import)
|
2006-09-18 09:28:58 +00:00
|
|
|
{
|
|
|
|
/* Import the standard certificates for a new default keybox. */
|
|
|
|
char *filelist[2];
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2007-06-14 17:05:07 +00:00
|
|
|
filelist[0] = make_filename (gnupg_datadir (),"com-certs.pem", NULL);
|
2006-09-18 09:28:58 +00:00
|
|
|
filelist[1] = NULL;
|
2020-10-20 10:43:55 +02:00
|
|
|
if (!gnupg_access (filelist[0], F_OK))
|
2006-09-18 09:28:58 +00:00
|
|
|
{
|
2012-06-05 19:29:22 +02:00
|
|
|
log_info (_("importing common certificates '%s'\n"),
|
2006-09-18 09:28:58 +00:00
|
|
|
filelist[0]);
|
|
|
|
gpgsm_import_files (&ctrl, 1, filelist, open_read);
|
|
|
|
}
|
|
|
|
xfree (filelist[0]);
|
|
|
|
}
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
for (sl = nrings; sl; sl = sl->next)
|
2016-11-10 17:01:19 +01:00
|
|
|
keydb_add_resource (&ctrl, sl->d, 0, NULL);
|
2003-08-05 17:11:04 +00:00
|
|
|
FREE_STRLIST(nrings);
|
|
|
|
|
2007-12-12 10:28:30 +00:00
|
|
|
|
|
|
|
/* Prepare the audit log feature for certain commands. */
|
2009-12-02 18:33:59 +00:00
|
|
|
if (auditlog || htmlauditlog)
|
2007-12-12 10:28:30 +00:00
|
|
|
{
|
|
|
|
switch (cmd)
|
|
|
|
{
|
2011-02-04 12:57:53 +01:00
|
|
|
case aEncr:
|
2007-12-12 10:28:30 +00:00
|
|
|
case aSign:
|
|
|
|
case aDecrypt:
|
|
|
|
case aVerify:
|
|
|
|
audit_release (ctrl.audit);
|
|
|
|
ctrl.audit = audit_new ();
|
2009-12-02 18:33:59 +00:00
|
|
|
if (auditlog)
|
|
|
|
auditfp = open_es_fwrite (auditlog);
|
|
|
|
if (htmlauditlog)
|
|
|
|
htmlauditfp = open_es_fwrite (htmlauditlog);
|
2007-12-12 10:28:30 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-02-18 17:00:21 +00:00
|
|
|
if (!do_not_setup_keys)
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
2019-03-26 13:31:06 +01:00
|
|
|
int errcount = log_get_errorcount (0);
|
|
|
|
|
2004-02-18 17:00:21 +00:00
|
|
|
for (sl = locusr; sl ; sl = sl->next)
|
2003-08-05 17:11:04 +00:00
|
|
|
{
|
2004-02-18 17:00:21 +00:00
|
|
|
int rc = gpgsm_add_to_certlist (&ctrl, sl->d, 1, &signerlist, 0);
|
|
|
|
if (rc)
|
|
|
|
{
|
2012-06-05 19:29:22 +02:00
|
|
|
log_error (_("can't sign using '%s': %s\n"),
|
2004-02-18 17:00:21 +00:00
|
|
|
sl->d, gpg_strerror (rc));
|
2009-08-06 20:12:00 +00:00
|
|
|
gpgsm_status2 (&ctrl, STATUS_INV_SGNR,
|
|
|
|
get_inv_recpsgnr_code (rc), sl->d, NULL);
|
2004-02-18 17:00:21 +00:00
|
|
|
gpgsm_status2 (&ctrl, STATUS_INV_RECP,
|
2009-08-06 20:12:00 +00:00
|
|
|
get_inv_recpsgnr_code (rc), sl->d, NULL);
|
2004-02-18 17:00:21 +00:00
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2004-02-18 17:00:21 +00:00
|
|
|
/* Build the recipient list. We first add the regular ones and then
|
2007-08-02 18:12:43 +00:00
|
|
|
the encrypt-to ones because the underlying function will silently
|
More cleanup of "allow to".
* README, agent/command.c, agent/keyformat.txt, common/i18n.c,
common/iobuf.c, common/keyserver.h, dirmngr/cdblib.c,
dirmngr/ldap-wrapper.c, doc/DETAILS, doc/TRANSLATE,
doc/announce-2.1.txt, doc/gpg.texi, doc/gpgsm.texi,
doc/scdaemon.texi, doc/tools.texi, doc/whats-new-in-2.1.txt,
g10/export.c, g10/getkey.c, g10/import.c, g10/keyedit.c, m4/ksba.m4,
m4/libgcrypt.m4, m4/ntbtls.m4, po/ca.po, po/cs.po, po/da.po,
po/de.po, po/el.po, po/eo.po, po/es.po, po/et.po, po/fi.po,
po/fr.po, po/gl.po, po/hu.po, po/id.po, po/it.po, po/ja.po,
po/nb.po, po/pl.po, po/pt.po, po/ro.po, po/ru.po, po/sk.po,
po/sv.po, po/tr.po, po/uk.po, po/zh_CN.po, po/zh_TW.po,
scd/app-p15.c, scd/ccid-driver.c, scd/command.c, sm/gpgsm.c,
sm/sign.c, tools/gpgconf-comp.c, tools/gpgtar.h: replace "Allow to"
with clearer text.
In standard English, the normal construction is "${XXX} allows ${YYY}
to" -- that is, the subject (${XXX}) of the sentence is allowing the
object (${YYY}) to do something. When the object is missing, the
phrasing sounds awkward, even if the object is implied by context.
There's almost always a better construction that isn't as awkward.
These changes should make the language a bit clearer.
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2016-08-01 22:19:17 -04:00
|
|
|
ignore duplicates and we can't allow keeping a duplicate which is
|
2004-02-18 17:00:21 +00:00
|
|
|
flagged as encrypt-to as the actually encrypt function would then
|
|
|
|
complain about no (regular) recipients. */
|
2003-12-17 17:12:14 +00:00
|
|
|
for (sl = remusr; sl; sl = sl->next)
|
2004-02-18 17:00:21 +00:00
|
|
|
if (!(sl->flags & 1))
|
2007-08-14 16:50:27 +00:00
|
|
|
do_add_recipient (&ctrl, sl->d, &recplist, 0, recp_required);
|
2004-02-18 17:00:21 +00:00
|
|
|
if (!opt.no_encrypt_to)
|
|
|
|
{
|
|
|
|
for (sl = remusr; sl; sl = sl->next)
|
|
|
|
if ((sl->flags & 1))
|
2007-08-14 16:50:27 +00:00
|
|
|
do_add_recipient (&ctrl, sl->d, &recplist, 1, recp_required);
|
2004-02-18 17:00:21 +00:00
|
|
|
}
|
2019-03-26 13:31:06 +01:00
|
|
|
|
|
|
|
/* We do not require a recipient for decryption but because
|
|
|
|
* recipients and signers are always checked and log_error is
|
|
|
|
* sometimes used (for failed signing keys or due to a failed
|
|
|
|
* CRL checking) that would have bumbed up the error counter.
|
|
|
|
* We clear the counter in the decryption case because there is
|
|
|
|
* no reason to force decryption to fail. */
|
|
|
|
if (cmd == aDecrypt && !errcount)
|
|
|
|
log_get_errorcount (1); /* clear counter */
|
2003-12-17 17:12:14 +00:00
|
|
|
}
|
2004-02-18 17:00:21 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
if (log_get_errorcount(0))
|
2007-08-02 18:12:43 +00:00
|
|
|
gpgsm_exit(1); /* Must stop for invalid recipients. */
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2007-12-12 10:28:30 +00:00
|
|
|
/* Dispatch command. */
|
2003-08-05 17:11:04 +00:00
|
|
|
switch (cmd)
|
|
|
|
{
|
2011-02-04 12:57:53 +01:00
|
|
|
case aGPGConfList:
|
2004-02-18 17:00:21 +00:00
|
|
|
{ /* List options and default values in the GPG Conf format. */
|
2007-06-18 20:15:01 +00:00
|
|
|
|
2010-08-18 19:25:15 +00:00
|
|
|
es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
|
|
|
|
es_printf ("include-certs:%lu:%d:\n", GC_OPT_FLAG_DEFAULT,
|
|
|
|
DEFAULT_INCLUDE_CERTS);
|
|
|
|
es_printf ("cipher-algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
|
|
|
|
DEFAULT_CIPHER_ALGO);
|
|
|
|
es_printf ("p12-charset:%lu:\n", GC_OPT_FLAG_DEFAULT);
|
|
|
|
es_printf ("default-key:%lu:\n", GC_OPT_FLAG_DEFAULT);
|
|
|
|
es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_DEFAULT);
|
2004-03-16 18:59:09 +00:00
|
|
|
|
2009-11-23 19:18:04 +00:00
|
|
|
/* The next one is an info only item and should match what
|
|
|
|
proc_parameters actually implements. */
|
2010-08-18 19:25:15 +00:00
|
|
|
es_printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
|
2017-09-07 18:39:37 -04:00
|
|
|
"RSA-3072");
|
2004-02-18 17:00:21 +00:00
|
|
|
}
|
|
|
|
break;
|
2006-10-23 14:02:13 +00:00
|
|
|
case aGPGConfTest:
|
|
|
|
/* This is merely a dummy command to test whether the
|
|
|
|
configuration file is valid. */
|
|
|
|
break;
|
2004-02-18 17:00:21 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case aServer:
|
|
|
|
if (debug_wait)
|
|
|
|
{
|
|
|
|
log_debug ("waiting for debugger - my pid is %u .....\n",
|
|
|
|
(unsigned int)getpid());
|
2007-06-20 11:16:42 +00:00
|
|
|
gnupg_sleep (debug_wait);
|
2003-08-05 17:11:04 +00:00
|
|
|
log_debug ("... okay\n");
|
|
|
|
}
|
2003-12-17 17:12:14 +00:00
|
|
|
gpgsm_server (recplist);
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aCallDirmngr:
|
|
|
|
if (!argc)
|
2004-04-06 10:01:04 +00:00
|
|
|
wrong_args ("--call-dirmngr <command> {args}");
|
2003-08-05 17:11:04 +00:00
|
|
|
else
|
|
|
|
if (gpgsm_dirmngr_run_command (&ctrl, *argv, argc-1, argv+1))
|
|
|
|
gpgsm_exit (1);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aCallProtectTool:
|
|
|
|
run_protect_tool (argc, argv);
|
|
|
|
break;
|
|
|
|
|
2006-08-29 16:18:30 +00:00
|
|
|
case aEncr: /* Encrypt the given file. */
|
|
|
|
{
|
2010-03-08 12:22:18 +00:00
|
|
|
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
2006-08-29 16:18:30 +00:00
|
|
|
|
|
|
|
set_binary (stdin);
|
|
|
|
|
|
|
|
if (!argc) /* Source is stdin. */
|
2011-02-04 12:57:53 +01:00
|
|
|
gpgsm_encrypt (&ctrl, recplist, 0, fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
else if (argc == 1) /* Source is the given file. */
|
|
|
|
gpgsm_encrypt (&ctrl, recplist, open_read (*argv), fp);
|
|
|
|
else
|
|
|
|
wrong_args ("--encrypt [datafile]");
|
|
|
|
|
2010-03-08 12:22:18 +00:00
|
|
|
es_fclose (fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
2006-08-29 16:18:30 +00:00
|
|
|
case aSign: /* Sign the given file. */
|
|
|
|
{
|
2010-03-08 12:22:18 +00:00
|
|
|
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
2006-08-29 16:18:30 +00:00
|
|
|
|
More cleanup of "allow to".
* README, agent/command.c, agent/keyformat.txt, common/i18n.c,
common/iobuf.c, common/keyserver.h, dirmngr/cdblib.c,
dirmngr/ldap-wrapper.c, doc/DETAILS, doc/TRANSLATE,
doc/announce-2.1.txt, doc/gpg.texi, doc/gpgsm.texi,
doc/scdaemon.texi, doc/tools.texi, doc/whats-new-in-2.1.txt,
g10/export.c, g10/getkey.c, g10/import.c, g10/keyedit.c, m4/ksba.m4,
m4/libgcrypt.m4, m4/ntbtls.m4, po/ca.po, po/cs.po, po/da.po,
po/de.po, po/el.po, po/eo.po, po/es.po, po/et.po, po/fi.po,
po/fr.po, po/gl.po, po/hu.po, po/id.po, po/it.po, po/ja.po,
po/nb.po, po/pl.po, po/pt.po, po/ro.po, po/ru.po, po/sk.po,
po/sv.po, po/tr.po, po/uk.po, po/zh_CN.po, po/zh_TW.po,
scd/app-p15.c, scd/ccid-driver.c, scd/command.c, sm/gpgsm.c,
sm/sign.c, tools/gpgconf-comp.c, tools/gpgtar.h: replace "Allow to"
with clearer text.
In standard English, the normal construction is "${XXX} allows ${YYY}
to" -- that is, the subject (${XXX}) of the sentence is allowing the
object (${YYY}) to do something. When the object is missing, the
phrasing sounds awkward, even if the object is implied by context.
There's almost always a better construction that isn't as awkward.
These changes should make the language a bit clearer.
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2016-08-01 22:19:17 -04:00
|
|
|
/* Fixme: We should also allow concatenation of multiple files for
|
2006-08-29 16:18:30 +00:00
|
|
|
signing because that is what gpg does.*/
|
|
|
|
set_binary (stdin);
|
|
|
|
if (!argc) /* Create from stdin. */
|
2011-02-04 12:57:53 +01:00
|
|
|
gpgsm_sign (&ctrl, signerlist, 0, detached_sig, fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
else if (argc == 1) /* From file. */
|
|
|
|
gpgsm_sign (&ctrl, signerlist,
|
2011-02-04 12:57:53 +01:00
|
|
|
open_read (*argv), detached_sig, fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
else
|
|
|
|
wrong_args ("--sign [datafile]");
|
|
|
|
|
2010-03-08 12:22:18 +00:00
|
|
|
es_fclose (fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case aSignEncr: /* sign and encrypt the given file */
|
|
|
|
log_error ("this command has not yet been implemented\n");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aClearsign: /* make a clearsig */
|
|
|
|
log_error ("this command has not yet been implemented\n");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aVerify:
|
|
|
|
{
|
2010-03-08 12:22:18 +00:00
|
|
|
estream_t fp = NULL;
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2004-12-22 17:55:28 +00:00
|
|
|
set_binary (stdin);
|
2003-08-05 17:11:04 +00:00
|
|
|
if (argc == 2 && opt.outfile)
|
|
|
|
log_info ("option --output ignored for a detached signature\n");
|
|
|
|
else if (opt.outfile)
|
2010-03-08 12:22:18 +00:00
|
|
|
fp = open_es_fwrite (opt.outfile);
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
if (!argc)
|
|
|
|
gpgsm_verify (&ctrl, 0, -1, fp); /* normal signature from stdin */
|
|
|
|
else if (argc == 1)
|
|
|
|
gpgsm_verify (&ctrl, open_read (*argv), -1, fp); /* std signature */
|
|
|
|
else if (argc == 2) /* detached signature (sig, detached) */
|
2011-02-04 12:57:53 +01:00
|
|
|
gpgsm_verify (&ctrl, open_read (*argv), open_read (argv[1]), NULL);
|
2003-08-05 17:11:04 +00:00
|
|
|
else
|
2004-04-06 10:01:04 +00:00
|
|
|
wrong_args ("--verify [signature [detached_data]]");
|
2003-08-05 17:11:04 +00:00
|
|
|
|
2010-03-08 12:22:18 +00:00
|
|
|
es_fclose (fp);
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aDecrypt:
|
2006-08-29 16:18:30 +00:00
|
|
|
{
|
2010-03-08 12:22:18 +00:00
|
|
|
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
2021-06-02 11:03:55 +02:00
|
|
|
gpg_error_t err;
|
2006-08-29 16:18:30 +00:00
|
|
|
|
|
|
|
set_binary (stdin);
|
|
|
|
if (!argc)
|
2021-06-02 11:03:55 +02:00
|
|
|
err = gpgsm_decrypt (&ctrl, 0, fp); /* from stdin */
|
2006-08-29 16:18:30 +00:00
|
|
|
else if (argc == 1)
|
2021-06-02 11:03:55 +02:00
|
|
|
err = gpgsm_decrypt (&ctrl, open_read (*argv), fp); /* from file */
|
2006-08-29 16:18:30 +00:00
|
|
|
else
|
|
|
|
wrong_args ("--decrypt [filename]");
|
2010-03-08 12:22:18 +00:00
|
|
|
|
2021-06-02 11:03:55 +02:00
|
|
|
#if GPGRT_VERSION_NUMBER >= 0x012700 /* 1.39 */
|
|
|
|
if (err)
|
|
|
|
gpgrt_fcancel (fp);
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
es_fclose (fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case aDeleteKey:
|
|
|
|
for (sl=NULL; argc; argc--, argv++)
|
|
|
|
add_to_strlist (&sl, *argv);
|
|
|
|
gpgsm_delete (&ctrl, sl);
|
|
|
|
free_strlist(sl);
|
|
|
|
break;
|
|
|
|
|
2006-09-13 15:57:30 +00:00
|
|
|
case aListChain:
|
|
|
|
case aDumpChain:
|
2017-05-10 11:01:15 +09:00
|
|
|
ctrl.with_chain = 1; /* fall through */
|
2003-08-05 17:11:04 +00:00
|
|
|
case aListKeys:
|
2004-04-22 13:03:44 +00:00
|
|
|
case aDumpKeys:
|
2003-08-05 17:11:04 +00:00
|
|
|
case aListExternalKeys:
|
2004-04-22 13:03:44 +00:00
|
|
|
case aDumpExternalKeys:
|
2003-08-05 17:11:04 +00:00
|
|
|
case aListSecretKeys:
|
2004-04-22 13:03:44 +00:00
|
|
|
case aDumpSecretKeys:
|
2006-09-13 15:57:30 +00:00
|
|
|
{
|
|
|
|
unsigned int mode;
|
2007-03-19 14:35:04 +00:00
|
|
|
estream_t fp;
|
2006-09-13 15:57:30 +00:00
|
|
|
|
|
|
|
switch (cmd)
|
|
|
|
{
|
|
|
|
case aListChain:
|
|
|
|
case aListKeys: mode = (0 | 0 | (1<<6)); break;
|
2011-02-04 12:57:53 +01:00
|
|
|
case aDumpChain:
|
2006-09-13 15:57:30 +00:00
|
|
|
case aDumpKeys: mode = (256 | 0 | (1<<6)); break;
|
|
|
|
case aListExternalKeys: mode = (0 | 0 | (1<<7)); break;
|
|
|
|
case aDumpExternalKeys: mode = (256 | 0 | (1<<7)); break;
|
|
|
|
case aListSecretKeys: mode = (0 | 2 | (1<<6)); break;
|
|
|
|
case aDumpSecretKeys: mode = (256 | 2 | (1<<6)); break;
|
|
|
|
default: BUG();
|
|
|
|
}
|
|
|
|
|
2007-03-19 14:35:04 +00:00
|
|
|
fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
2006-09-13 15:57:30 +00:00
|
|
|
for (sl=NULL; argc; argc--, argv++)
|
|
|
|
add_to_strlist (&sl, *argv);
|
|
|
|
gpgsm_list_keys (&ctrl, sl, fp, mode);
|
|
|
|
free_strlist(sl);
|
2007-03-19 14:35:04 +00:00
|
|
|
es_fclose (fp);
|
2006-09-13 15:57:30 +00:00
|
|
|
}
|
2004-04-22 13:03:44 +00:00
|
|
|
break;
|
|
|
|
|
2006-09-13 15:57:30 +00:00
|
|
|
|
2007-01-31 14:24:41 +00:00
|
|
|
case aKeygen: /* Generate a key; well kind of. */
|
2007-06-21 18:44:48 +00:00
|
|
|
{
|
2009-07-01 18:30:33 +00:00
|
|
|
estream_t fpin = NULL;
|
2010-03-08 18:19:21 +00:00
|
|
|
estream_t fpout;
|
2009-07-01 18:30:33 +00:00
|
|
|
|
|
|
|
if (opt.batch)
|
|
|
|
{
|
|
|
|
if (!argc) /* Create from stdin. */
|
2011-02-04 12:57:53 +01:00
|
|
|
fpin = open_es_fread ("-", "r");
|
2009-07-01 18:30:33 +00:00
|
|
|
else if (argc == 1) /* From file. */
|
2011-02-04 12:57:53 +01:00
|
|
|
fpin = open_es_fread (*argv, "r");
|
2009-07-01 18:30:33 +00:00
|
|
|
else
|
2016-11-14 16:59:23 +01:00
|
|
|
wrong_args ("--generate-key --batch [parmfile]");
|
2009-07-01 18:30:33 +00:00
|
|
|
}
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2010-03-08 18:19:21 +00:00
|
|
|
fpout = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
2009-07-01 18:30:33 +00:00
|
|
|
|
|
|
|
if (fpin)
|
|
|
|
gpgsm_genkey (&ctrl, fpin, fpout);
|
|
|
|
else
|
|
|
|
gpgsm_gencertreq_tty (&ctrl, fpout);
|
|
|
|
|
2010-03-08 18:19:21 +00:00
|
|
|
es_fclose (fpout);
|
2007-06-21 18:44:48 +00:00
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
2007-06-21 18:44:48 +00:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case aImport:
|
|
|
|
gpgsm_import_files (&ctrl, argc, argv, open_read);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aExport:
|
2006-08-29 16:18:30 +00:00
|
|
|
{
|
2010-03-08 18:19:21 +00:00
|
|
|
estream_t fp;
|
2006-08-29 16:18:30 +00:00
|
|
|
|
2010-03-08 18:19:21 +00:00
|
|
|
fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
2006-08-29 16:18:30 +00:00
|
|
|
for (sl=NULL; argc; argc--, argv++)
|
|
|
|
add_to_strlist (&sl, *argv);
|
2010-03-08 18:19:21 +00:00
|
|
|
gpgsm_export (&ctrl, sl, fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
free_strlist(sl);
|
2010-03-08 18:19:21 +00:00
|
|
|
es_fclose (fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
|
2004-02-19 16:26:32 +00:00
|
|
|
case aExportSecretKeyP12:
|
2006-08-29 16:18:30 +00:00
|
|
|
{
|
2010-06-21 10:01:24 +00:00
|
|
|
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
2006-08-29 16:18:30 +00:00
|
|
|
|
|
|
|
if (argc == 1)
|
2014-06-03 18:57:33 +02:00
|
|
|
gpgsm_p12_export (&ctrl, *argv, fp, 0);
|
2006-08-29 16:18:30 +00:00
|
|
|
else
|
|
|
|
wrong_args ("--export-secret-key-p12 KEY-ID");
|
2010-06-21 10:01:24 +00:00
|
|
|
if (fp != es_stdout)
|
|
|
|
es_fclose (fp);
|
2006-08-29 16:18:30 +00:00
|
|
|
}
|
2004-02-19 16:26:32 +00:00
|
|
|
break;
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2014-06-03 18:57:33 +02:00
|
|
|
case aExportSecretKeyP8:
|
|
|
|
{
|
|
|
|
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
|
|
|
|
|
|
|
if (argc == 1)
|
|
|
|
gpgsm_p12_export (&ctrl, *argv, fp, 1);
|
|
|
|
else
|
|
|
|
wrong_args ("--export-secret-key-p8 KEY-ID");
|
|
|
|
if (fp != es_stdout)
|
|
|
|
es_fclose (fp);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aExportSecretKeyRaw:
|
|
|
|
{
|
|
|
|
estream_t fp = open_es_fwrite (opt.outfile?opt.outfile:"-");
|
|
|
|
|
|
|
|
if (argc == 1)
|
|
|
|
gpgsm_p12_export (&ctrl, *argv, fp, 2);
|
|
|
|
else
|
|
|
|
wrong_args ("--export-secret-key-raw KEY-ID");
|
|
|
|
if (fp != es_stdout)
|
|
|
|
es_fclose (fp);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
case aSendKeys:
|
|
|
|
case aRecvKeys:
|
|
|
|
log_error ("this command has not yet been implemented\n");
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case aLearnCard:
|
|
|
|
if (argc)
|
|
|
|
wrong_args ("--learn-card");
|
|
|
|
else
|
|
|
|
{
|
2004-04-26 13:29:09 +00:00
|
|
|
int rc = gpgsm_agent_learn (&ctrl);
|
2003-08-05 17:11:04 +00:00
|
|
|
if (rc)
|
|
|
|
log_error ("error learning card: %s\n", gpg_strerror (rc));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case aPasswd:
|
|
|
|
if (argc != 1)
|
2016-12-13 17:49:47 +01:00
|
|
|
wrong_args ("--change-passphrase <key-Id>");
|
2003-08-05 17:11:04 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
int rc;
|
2003-12-17 12:28:24 +00:00
|
|
|
ksba_cert_t cert = NULL;
|
2003-08-05 17:11:04 +00:00
|
|
|
char *grip = NULL;
|
|
|
|
|
2017-10-24 17:29:04 +02:00
|
|
|
rc = gpgsm_find_cert (&ctrl, *argv, NULL, &cert, 0);
|
2003-08-05 17:11:04 +00:00
|
|
|
if (rc)
|
|
|
|
;
|
|
|
|
else if (!(grip = gpgsm_get_keygrip_hexstring (cert)))
|
|
|
|
rc = gpg_error (GPG_ERR_BUG);
|
2011-02-04 12:57:53 +01:00
|
|
|
else
|
2004-02-21 13:05:52 +00:00
|
|
|
{
|
|
|
|
char *desc = gpgsm_format_keydesc (cert);
|
2004-04-26 13:29:09 +00:00
|
|
|
rc = gpgsm_agent_passwd (&ctrl, grip, desc);
|
2004-02-21 13:05:52 +00:00
|
|
|
xfree (desc);
|
|
|
|
}
|
2003-08-05 17:11:04 +00:00
|
|
|
if (rc)
|
|
|
|
log_error ("error changing passphrase: %s\n", gpg_strerror (rc));
|
|
|
|
xfree (grip);
|
|
|
|
ksba_cert_release (cert);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2004-04-28 08:59:34 +00:00
|
|
|
case aKeydbClearSomeCertFlags:
|
|
|
|
for (sl=NULL; argc; argc--, argv++)
|
|
|
|
add_to_strlist (&sl, *argv);
|
|
|
|
keydb_clear_some_cert_flags (&ctrl, sl);
|
|
|
|
free_strlist(sl);
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
default:
|
2008-05-09 09:54:35 +00:00
|
|
|
log_error (_("invalid command (there is no implicit command)\n"));
|
2003-08-05 17:11:04 +00:00
|
|
|
break;
|
|
|
|
}
|
2007-12-12 10:28:30 +00:00
|
|
|
|
|
|
|
/* Print the audit result if needed. */
|
2009-12-02 18:33:59 +00:00
|
|
|
if ((auditlog && auditfp) || (htmlauditlog && htmlauditfp))
|
2007-12-12 10:28:30 +00:00
|
|
|
{
|
2009-12-02 18:33:59 +00:00
|
|
|
if (auditlog && auditfp)
|
|
|
|
audit_print_result (ctrl.audit, auditfp, 0);
|
|
|
|
if (htmlauditlog && htmlauditfp)
|
|
|
|
audit_print_result (ctrl.audit, htmlauditfp, 1);
|
2007-12-12 10:28:30 +00:00
|
|
|
audit_release (ctrl.audit);
|
|
|
|
ctrl.audit = NULL;
|
|
|
|
es_fclose (auditfp);
|
2009-12-02 18:33:59 +00:00
|
|
|
es_fclose (htmlauditfp);
|
2007-12-12 10:28:30 +00:00
|
|
|
}
|
2011-02-04 12:57:53 +01:00
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
/* cleanup */
|
2021-05-26 14:28:26 +02:00
|
|
|
free_strlist (opt.keyserver);
|
2008-06-12 14:24:46 +00:00
|
|
|
opt.keyserver = NULL;
|
2003-08-05 17:11:04 +00:00
|
|
|
gpgsm_release_certlist (recplist);
|
|
|
|
gpgsm_release_certlist (signerlist);
|
2006-10-02 11:54:35 +00:00
|
|
|
FREE_STRLIST (remusr);
|
|
|
|
FREE_STRLIST (locusr);
|
2003-08-05 17:11:04 +00:00
|
|
|
gpgsm_exit(0);
|
2006-10-02 11:54:35 +00:00
|
|
|
return 8; /*NOTREACHED*/
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Note: This function is used by signal handlers!. */
|
|
|
|
static void
|
|
|
|
emergency_cleanup (void)
|
|
|
|
{
|
|
|
|
gcry_control (GCRYCTL_TERM_SECMEM );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
gpgsm_exit (int rc)
|
|
|
|
{
|
|
|
|
gcry_control (GCRYCTL_UPDATE_RANDOM_SEED_FILE);
|
|
|
|
if (opt.debug & DBG_MEMSTAT_VALUE)
|
|
|
|
{
|
|
|
|
gcry_control( GCRYCTL_DUMP_MEMORY_STATS );
|
|
|
|
gcry_control( GCRYCTL_DUMP_RANDOM_STATS );
|
|
|
|
}
|
|
|
|
if (opt.debug)
|
|
|
|
gcry_control (GCRYCTL_DUMP_SECMEM_STATS );
|
|
|
|
emergency_cleanup ();
|
|
|
|
rc = rc? rc : log_get_errorcount(0)? 2 : gpgsm_errors_seen? 1 : 0;
|
|
|
|
exit (rc);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
gpgsm_init_default_ctrl (struct server_control_s *ctrl)
|
|
|
|
{
|
2006-06-20 17:21:37 +00:00
|
|
|
ctrl->include_certs = default_include_certs;
|
2003-12-01 10:54:30 +00:00
|
|
|
ctrl->use_ocsp = opt.enable_ocsp;
|
2007-08-10 16:52:05 +00:00
|
|
|
ctrl->validation_model = default_validation_model;
|
2015-06-29 11:03:58 +02:00
|
|
|
ctrl->offline = opt.disable_dirmngr;
|
2003-08-05 17:11:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-08-10 16:52:05 +00:00
|
|
|
int
|
|
|
|
gpgsm_parse_validation_model (const char *model)
|
2011-02-04 12:57:53 +01:00
|
|
|
{
|
2007-08-10 16:52:05 +00:00
|
|
|
if (!ascii_strcasecmp (model, "shell") )
|
|
|
|
return 0;
|
|
|
|
else if ( !ascii_strcasecmp (model, "chain") )
|
|
|
|
return 1;
|
2011-12-07 16:15:15 +01:00
|
|
|
else if ( !ascii_strcasecmp (model, "steed") )
|
|
|
|
return 2;
|
2007-08-10 16:52:05 +00:00
|
|
|
else
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
|
|
|
|
|
2010-03-08 12:22:18 +00:00
|
|
|
/* Open the FILENAME for read and return the file descriptor. Stop
|
2003-08-05 17:11:04 +00:00
|
|
|
with an error message in case of problems. "-" denotes stdin and
|
2010-03-08 12:22:18 +00:00
|
|
|
if special filenames are allowed the given fd is opened instead. */
|
2011-02-04 12:57:53 +01:00
|
|
|
static int
|
2003-08-05 17:11:04 +00:00
|
|
|
open_read (const char *filename)
|
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
if (filename[0] == '-' && !filename[1])
|
2004-12-22 17:55:28 +00:00
|
|
|
{
|
|
|
|
set_binary (stdin);
|
|
|
|
return 0; /* stdin */
|
|
|
|
}
|
2016-11-29 16:18:24 +01:00
|
|
|
fd = check_special_filename (filename, 0, 0);
|
2003-08-05 17:11:04 +00:00
|
|
|
if (fd != -1)
|
|
|
|
return fd;
|
2020-10-20 14:08:35 +02:00
|
|
|
fd = gnupg_open (filename, O_RDONLY | O_BINARY, 0);
|
2003-08-05 17:11:04 +00:00
|
|
|
if (fd == -1)
|
|
|
|
{
|
2012-06-05 19:29:22 +02:00
|
|
|
log_error (_("can't open '%s': %s\n"), filename, strerror (errno));
|
2003-08-05 17:11:04 +00:00
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|
|
|
|
return fd;
|
|
|
|
}
|
|
|
|
|
2009-07-01 18:30:33 +00:00
|
|
|
/* Same as open_read but return an estream_t. */
|
|
|
|
static estream_t
|
2010-04-14 11:24:02 +00:00
|
|
|
open_es_fread (const char *filename, const char *mode)
|
2009-07-01 18:30:33 +00:00
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
estream_t fp;
|
|
|
|
|
|
|
|
if (filename[0] == '-' && !filename[1])
|
|
|
|
fd = fileno (stdin);
|
|
|
|
else
|
2016-11-29 16:18:24 +01:00
|
|
|
fd = check_special_filename (filename, 0, 0);
|
2009-07-01 18:30:33 +00:00
|
|
|
if (fd != -1)
|
|
|
|
{
|
2010-04-14 11:24:02 +00:00
|
|
|
fp = es_fdopen_nc (fd, mode);
|
2009-07-01 18:30:33 +00:00
|
|
|
if (!fp)
|
|
|
|
{
|
|
|
|
log_error ("es_fdopen(%d) failed: %s\n", fd, strerror (errno));
|
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|
|
|
|
return fp;
|
|
|
|
}
|
2010-04-14 11:24:02 +00:00
|
|
|
fp = es_fopen (filename, mode);
|
2009-07-01 18:30:33 +00:00
|
|
|
if (!fp)
|
|
|
|
{
|
2012-06-05 19:29:22 +02:00
|
|
|
log_error (_("can't open '%s': %s\n"), filename, strerror (errno));
|
2009-07-01 18:30:33 +00:00
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|
|
|
|
return fp;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-03-19 14:35:04 +00:00
|
|
|
/* Open FILENAME for fwrite and return an extended stream. Stop with
|
|
|
|
an error message in case of problems. "-" denotes stdout and if
|
|
|
|
special filenames are allowed the given fd is opened instead.
|
|
|
|
Caller must close the returned stream. */
|
|
|
|
static estream_t
|
|
|
|
open_es_fwrite (const char *filename)
|
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
estream_t fp;
|
|
|
|
|
|
|
|
if (filename[0] == '-' && !filename[1])
|
|
|
|
{
|
|
|
|
fflush (stdout);
|
2007-06-25 11:54:43 +00:00
|
|
|
fp = es_fdopen_nc (fileno(stdout), "wb");
|
2007-03-19 14:35:04 +00:00
|
|
|
return fp;
|
|
|
|
}
|
|
|
|
|
2016-11-29 16:18:24 +01:00
|
|
|
fd = check_special_filename (filename, 1, 0);
|
2007-03-19 14:35:04 +00:00
|
|
|
if (fd != -1)
|
|
|
|
{
|
2007-06-25 11:54:43 +00:00
|
|
|
fp = es_fdopen_nc (fd, "wb");
|
2007-03-19 14:35:04 +00:00
|
|
|
if (!fp)
|
|
|
|
{
|
|
|
|
log_error ("es_fdopen(%d) failed: %s\n", fd, strerror (errno));
|
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|
|
|
|
return fp;
|
|
|
|
}
|
|
|
|
fp = es_fopen (filename, "wb");
|
|
|
|
if (!fp)
|
|
|
|
{
|
2012-06-05 19:29:22 +02:00
|
|
|
log_error (_("can't open '%s': %s\n"), filename, strerror (errno));
|
2007-03-19 14:35:04 +00:00
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|
|
|
|
return fp;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
static void
|
|
|
|
run_protect_tool (int argc, char **argv)
|
|
|
|
{
|
2014-03-07 09:46:44 +01:00
|
|
|
#ifdef HAVE_W32_SYSTEM
|
|
|
|
(void)argc;
|
|
|
|
(void)argv;
|
|
|
|
#else
|
2004-02-13 12:40:23 +00:00
|
|
|
const char *pgm;
|
2003-08-05 17:11:04 +00:00
|
|
|
char **av;
|
|
|
|
int i;
|
|
|
|
|
2004-02-13 12:40:23 +00:00
|
|
|
if (!opt.protect_tool_program || !*opt.protect_tool_program)
|
2007-06-14 17:05:07 +00:00
|
|
|
pgm = gnupg_module_name (GNUPG_MODULE_NAME_PROTECT_TOOL);
|
2004-02-13 12:40:23 +00:00
|
|
|
else
|
|
|
|
pgm = opt.protect_tool_program;
|
|
|
|
|
2003-08-05 17:11:04 +00:00
|
|
|
av = xcalloc (argc+2, sizeof *av);
|
|
|
|
av[0] = strrchr (pgm, '/');
|
|
|
|
if (!av[0])
|
2004-02-13 12:40:23 +00:00
|
|
|
av[0] = xstrdup (pgm);
|
2003-08-05 17:11:04 +00:00
|
|
|
for (i=1; argc; i++, argc--, argv++)
|
|
|
|
av[i] = *argv;
|
|
|
|
av[i] = NULL;
|
2011-02-04 12:57:53 +01:00
|
|
|
execv (pgm, av);
|
2012-06-05 19:29:22 +02:00
|
|
|
log_error ("error executing '%s': %s\n", pgm, strerror (errno));
|
2014-03-07 09:46:44 +01:00
|
|
|
#endif /*!HAVE_W32_SYSTEM*/
|
2003-08-05 17:11:04 +00:00
|
|
|
gpgsm_exit (2);
|
|
|
|
}
|