283de20386cf9e5340f3f4a1b0eb10cc8a125414
[gnupg.git] / g10 / gpg.c
1 /* gpg.c - The GnuPG utility (main for gpg)
2  * Copyright (C) 1998-2011 Free Software Foundation, Inc.
3  * Copyright (C) 1997-2017 Werner Koch
4  * Copyright (C) 2015-2017 g10 Code GmbH
5  *
6  * This file is part of GnuPG.
7  *
8  * GnuPG is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * GnuPG is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, see <https://www.gnu.org/licenses/>.
20  */
21
22 #include <config.h>
23 #include <errno.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <ctype.h>
28 #include <unistd.h>
29 #ifdef HAVE_STAT
30 #include <sys/stat.h> /* for stat() */
31 #endif
32 #include <fcntl.h>
33 #ifdef HAVE_W32_SYSTEM
34 # ifdef HAVE_WINSOCK2_H
35 #  include <winsock2.h>
36 # endif
37 # include <windows.h>
38 #endif
39
40 #define INCLUDED_BY_MAIN_MODULE 1
41 #include "gpg.h"
42 #include <assuan.h>
43 #include "../common/iobuf.h"
44 #include "../common/util.h"
45 #include "packet.h"
46 #include "../common/membuf.h"
47 #include "main.h"
48 #include "options.h"
49 #include "keydb.h"
50 #include "trustdb.h"
51 #include "filter.h"
52 #include "../common/ttyio.h"
53 #include "../common/i18n.h"
54 #include "../common/sysutils.h"
55 #include "../common/status.h"
56 #include "keyserver-internal.h"
57 #include "exec.h"
58 #include "../common/gc-opt-flags.h"
59 #include "../common/asshelp.h"
60 #include "call-dirmngr.h"
61 #include "tofu.h"
62 #include "../common/init.h"
63 #include "../common/mbox-util.h"
64 #include "../common/shareddefs.h"
65 #include "../common/compliance.h"
66
67 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
68 #define MY_O_BINARY  O_BINARY
69 #ifndef S_IRGRP
70 # define S_IRGRP 0
71 # define S_IWGRP 0
72 #endif
73 #else
74 #define MY_O_BINARY  0
75 #endif
76
77 #ifdef __MINGW32__
78 int _dowildcard = -1;
79 #endif
80
81 enum cmd_and_opt_values
82   {
83     aNull = 0,
84     oArmor        = 'a',
85     aDetachedSign = 'b',
86     aSym          = 'c',
87     aDecrypt      = 'd',
88     aEncr         = 'e',
89     oRecipientFile       = 'f',
90     oHiddenRecipientFile = 'F',
91     oInteractive  = 'i',
92     aListKeys     = 'k',
93     oDryRun       = 'n',
94     oOutput       = 'o',
95     oQuiet        = 'q',
96     oRecipient    = 'r',
97     oHiddenRecipient = 'R',
98     aSign         = 's',
99     oTextmodeShort= 't',
100     oLocalUser    = 'u',
101     oVerbose      = 'v',
102     oCompress     = 'z',
103     oSetNotation  = 'N',
104     aListSecretKeys = 'K',
105     oBatch        = 500,
106     oMaxOutput,
107     oInputSizeHint,
108     oChunkSize,
109     oSigNotation,
110     oCertNotation,
111     oShowNotation,
112     oNoShowNotation,
113     aEncrFiles,
114     aEncrSym,
115     aDecryptFiles,
116     aClearsign,
117     aStore,
118     aQuickKeygen,
119     aFullKeygen,
120     aKeygen,
121     aSignEncr,
122     aSignEncrSym,
123     aSignSym,
124     aSignKey,
125     aLSignKey,
126     aQuickSignKey,
127     aQuickLSignKey,
128     aQuickAddUid,
129     aQuickAddKey,
130     aQuickRevUid,
131     aQuickSetExpire,
132     aQuickSetPrimaryUid,
133     aListConfig,
134     aListGcryptConfig,
135     aGPGConfList,
136     aGPGConfTest,
137     aListPackets,
138     aEditKey,
139     aDeleteKeys,
140     aDeleteSecretKeys,
141     aDeleteSecretAndPublicKeys,
142     aImport,
143     aFastImport,
144     aVerify,
145     aVerifyFiles,
146     aListSigs,
147     aSendKeys,
148     aRecvKeys,
149     aLocateKeys,
150     aSearchKeys,
151     aRefreshKeys,
152     aFetchKeys,
153     aExport,
154     aExportSecret,
155     aExportSecretSub,
156     aExportSshKey,
157     aCheckKeys,
158     aGenRevoke,
159     aDesigRevoke,
160     aPrimegen,
161     aPrintMD,
162     aPrintMDs,
163     aCheckTrustDB,
164     aUpdateTrustDB,
165     aFixTrustDB,
166     aListTrustDB,
167     aListTrustPath,
168     aExportOwnerTrust,
169     aImportOwnerTrust,
170     aDeArmor,
171     aEnArmor,
172     aGenRandom,
173     aRebuildKeydbCaches,
174     aCardStatus,
175     aCardEdit,
176     aChangePIN,
177     aPasswd,
178     aServer,
179     aTOFUPolicy,
180
181     oMimemode,
182     oTextmode,
183     oNoTextmode,
184     oExpert,
185     oNoExpert,
186     oDefSigExpire,
187     oAskSigExpire,
188     oNoAskSigExpire,
189     oDefCertExpire,
190     oAskCertExpire,
191     oNoAskCertExpire,
192     oDefCertLevel,
193     oMinCertLevel,
194     oAskCertLevel,
195     oNoAskCertLevel,
196     oFingerprint,
197     oWithFingerprint,
198     oWithSubkeyFingerprint,
199     oWithICAOSpelling,
200     oWithKeygrip,
201     oWithKeyScreening,
202     oWithSecret,
203     oWithWKDHash,
204     oWithColons,
205     oWithKeyData,
206     oWithKeyOrigin,
207     oWithTofuInfo,
208     oWithSigList,
209     oWithSigCheck,
210     oAnswerYes,
211     oAnswerNo,
212     oKeyring,
213     oPrimaryKeyring,
214     oSecretKeyring,
215     oShowKeyring,
216     oDefaultKey,
217     oDefRecipient,
218     oDefRecipientSelf,
219     oNoDefRecipient,
220     oTrySecretKey,
221     oOptions,
222     oDebug,
223     oDebugLevel,
224     oDebugAll,
225     oDebugIOLBF,
226     oStatusFD,
227     oStatusFile,
228     oAttributeFD,
229     oAttributeFile,
230     oEmitVersion,
231     oNoEmitVersion,
232     oCompletesNeeded,
233     oMarginalsNeeded,
234     oMaxCertDepth,
235     oLoadExtension,
236     oCompliance,
237     oGnuPG,
238     oRFC2440,
239     oRFC4880,
240     oRFC4880bis,
241     oOpenPGP,
242     oPGP6,
243     oPGP7,
244     oPGP8,
245     oDE_VS,
246     oRFC2440Text,
247     oNoRFC2440Text,
248     oCipherAlgo,
249     oAEADAlgo,
250     oDigestAlgo,
251     oCertDigestAlgo,
252     oCompressAlgo,
253     oCompressLevel,
254     oBZ2CompressLevel,
255     oBZ2DecompressLowmem,
256     oPassphrase,
257     oPassphraseFD,
258     oPassphraseFile,
259     oPassphraseRepeat,
260     oPinentryMode,
261     oCommandFD,
262     oCommandFile,
263     oQuickRandom,
264     oNoVerbose,
265     oTrustDBName,
266     oNoSecmemWarn,
267     oRequireSecmem,
268     oNoRequireSecmem,
269     oNoPermissionWarn,
270     oNoMDCWarn,
271     oNoArmor,
272     oNoDefKeyring,
273     oNoKeyring,
274     oNoGreeting,
275     oNoTTY,
276     oNoOptions,
277     oNoBatch,
278     oHomedir,
279     oSkipVerify,
280     oSkipHiddenRecipients,
281     oNoSkipHiddenRecipients,
282     oAlwaysTrust,
283     oTrustModel,
284     oForceOwnertrust,
285     oSetFilename,
286     oForYourEyesOnly,
287     oNoForYourEyesOnly,
288     oSetPolicyURL,
289     oSigPolicyURL,
290     oCertPolicyURL,
291     oShowPolicyURL,
292     oNoShowPolicyURL,
293     oSigKeyserverURL,
294     oUseEmbeddedFilename,
295     oNoUseEmbeddedFilename,
296     oComment,
297     oDefaultComment,
298     oNoComments,
299     oThrowKeyids,
300     oNoThrowKeyids,
301     oShowPhotos,
302     oNoShowPhotos,
303     oPhotoViewer,
304     oForceMDC,
305     oNoForceMDC,
306     oDisableMDC,
307     oNoDisableMDC,
308     oForceAEAD,
309     oS2KMode,
310     oS2KDigest,
311     oS2KCipher,
312     oS2KCount,
313     oDisplayCharset,
314     oNotDashEscaped,
315     oEscapeFrom,
316     oNoEscapeFrom,
317     oLockOnce,
318     oLockMultiple,
319     oLockNever,
320     oKeyServer,
321     oKeyServerOptions,
322     oImportOptions,
323     oImportFilter,
324     oExportOptions,
325     oExportFilter,
326     oListOptions,
327     oVerifyOptions,
328     oTempDir,
329     oExecPath,
330     oEncryptTo,
331     oHiddenEncryptTo,
332     oNoEncryptTo,
333     oEncryptToDefaultKey,
334     oLoggerFD,
335     oLoggerFile,
336     oUtf8Strings,
337     oNoUtf8Strings,
338     oDisableCipherAlgo,
339     oDisablePubkeyAlgo,
340     oAllowNonSelfsignedUID,
341     oNoAllowNonSelfsignedUID,
342     oAllowFreeformUID,
343     oNoAllowFreeformUID,
344     oAllowSecretKeyImport,
345     oEnableSpecialFilenames,
346     oNoLiteral,
347     oSetFilesize,
348     oHonorHttpProxy,
349     oFastListMode,
350     oListOnly,
351     oIgnoreTimeConflict,
352     oIgnoreValidFrom,
353     oIgnoreCrcError,
354     oIgnoreMDCError,
355     oShowSessionKey,
356     oOverrideSessionKey,
357     oOverrideSessionKeyFD,
358     oNoRandomSeedFile,
359     oAutoKeyRetrieve,
360     oNoAutoKeyRetrieve,
361     oUseAgent,
362     oNoUseAgent,
363     oGpgAgentInfo,
364     oMergeOnly,
365     oTryAllSecrets,
366     oTrustedKey,
367     oNoExpensiveTrustChecks,
368     oFixedListMode,
369     oLegacyListMode,
370     oNoSigCache,
371     oAutoCheckTrustDB,
372     oNoAutoCheckTrustDB,
373     oPreservePermissions,
374     oDefaultPreferenceList,
375     oDefaultKeyserverURL,
376     oPersonalCipherPreferences,
377     oPersonalAEADPreferences,
378     oPersonalDigestPreferences,
379     oPersonalCompressPreferences,
380     oAgentProgram,
381     oDirmngrProgram,
382     oDisableDirmngr,
383     oDisplay,
384     oTTYname,
385     oTTYtype,
386     oLCctype,
387     oLCmessages,
388     oXauthority,
389     oGroup,
390     oUnGroup,
391     oNoGroups,
392     oStrict,
393     oNoStrict,
394     oMangleDosFilenames,
395     oNoMangleDosFilenames,
396     oEnableProgressFilter,
397     oMultifile,
398     oKeyidFormat,
399     oExitOnStatusWriteError,
400     oLimitCardInsertTries,
401     oReaderPort,
402     octapiDriver,
403     opcscDriver,
404     oDisableCCID,
405     oRequireCrossCert,
406     oNoRequireCrossCert,
407     oAutoKeyLocate,
408     oNoAutoKeyLocate,
409     oAllowMultisigVerification,
410     oEnableLargeRSA,
411     oDisableLargeRSA,
412     oEnableDSA2,
413     oDisableDSA2,
414     oAllowMultipleMessages,
415     oNoAllowMultipleMessages,
416     oAllowWeakDigestAlgos,
417     oFakedSystemTime,
418     oNoAutostart,
419     oPrintPKARecords,
420     oPrintDANERecords,
421     oTOFUDefaultPolicy,
422     oTOFUDBFormat,
423     oDefaultNewKeyAlgo,
424     oWeakDigest,
425     oUnwrap,
426     oOnlySignTextIDs,
427     oDisableSignerUID,
428     oSender,
429     oKeyOrigin,
430
431     oNoop
432   };
433
434
435 static ARGPARSE_OPTS opts[] = {
436
437   ARGPARSE_group (300, N_("@Commands:\n ")),
438
439   ARGPARSE_c (aSign, "sign", N_("make a signature")),
440   ARGPARSE_c (aClearsign, "clear-sign", N_("make a clear text signature")),
441   ARGPARSE_c (aClearsign, "clearsign", "@"),
442   ARGPARSE_c (aDetachedSign, "detach-sign", N_("make a detached signature")),
443   ARGPARSE_c (aEncr, "encrypt",   N_("encrypt data")),
444   ARGPARSE_c (aEncrFiles, "encrypt-files", "@"),
445   ARGPARSE_c (aSym, "symmetric", N_("encryption only with symmetric cipher")),
446   ARGPARSE_c (aStore, "store",     "@"),
447   ARGPARSE_c (aDecrypt, "decrypt",   N_("decrypt data (default)")),
448   ARGPARSE_c (aDecryptFiles, "decrypt-files", "@"),
449   ARGPARSE_c (aVerify, "verify"   , N_("verify a signature")),
450   ARGPARSE_c (aVerifyFiles, "verify-files" , "@" ),
451   ARGPARSE_c (aListKeys, "list-keys", N_("list keys")),
452   ARGPARSE_c (aListKeys, "list-public-keys", "@" ),
453   ARGPARSE_c (aListSigs, "list-signatures", N_("list keys and signatures")),
454   ARGPARSE_c (aListSigs, "list-sigs", "@"),
455   ARGPARSE_c (aCheckKeys, "check-signatures",
456               N_("list and check key signatures")),
457   ARGPARSE_c (aCheckKeys, "check-sigs", "@"),
458   ARGPARSE_c (oFingerprint, "fingerprint", N_("list keys and fingerprints")),
459   ARGPARSE_c (aListSecretKeys, "list-secret-keys", N_("list secret keys")),
460   ARGPARSE_c (aKeygen,      "generate-key",
461               N_("generate a new key pair")),
462   ARGPARSE_c (aKeygen,      "gen-key", "@"),
463   ARGPARSE_c (aQuickKeygen, "quick-generate-key" ,
464               N_("quickly generate a new key pair")),
465   ARGPARSE_c (aQuickKeygen, "quick-gen-key", "@"),
466   ARGPARSE_c (aQuickAddUid,  "quick-add-uid",
467               N_("quickly add a new user-id")),
468   ARGPARSE_c (aQuickAddUid,  "quick-adduid", "@"),
469   ARGPARSE_c (aQuickAddKey,  "quick-add-key", "@"),
470   ARGPARSE_c (aQuickAddKey,  "quick-addkey", "@"),
471   ARGPARSE_c (aQuickRevUid,  "quick-revoke-uid",
472               N_("quickly revoke a user-id")),
473   ARGPARSE_c (aQuickRevUid,  "quick-revuid", "@"),
474   ARGPARSE_c (aQuickSetExpire,  "quick-set-expire",
475               N_("quickly set a new expiration date")),
476   ARGPARSE_c (aQuickSetPrimaryUid,  "quick-set-primary-uid", "@"),
477   ARGPARSE_c (aFullKeygen,  "full-generate-key" ,
478               N_("full featured key pair generation")),
479   ARGPARSE_c (aFullKeygen,  "full-gen-key", "@"),
480   ARGPARSE_c (aGenRevoke, "generate-revocation",
481               N_("generate a revocation certificate")),
482   ARGPARSE_c (aGenRevoke, "gen-revoke", "@"),
483   ARGPARSE_c (aDeleteKeys,"delete-keys",
484               N_("remove keys from the public keyring")),
485   ARGPARSE_c (aDeleteSecretKeys, "delete-secret-keys",
486               N_("remove keys from the secret keyring")),
487   ARGPARSE_c (aQuickSignKey,  "quick-sign-key" ,
488               N_("quickly sign a key")),
489   ARGPARSE_c (aQuickLSignKey, "quick-lsign-key",
490               N_("quickly sign a key locally")),
491   ARGPARSE_c (aSignKey,  "sign-key"   ,N_("sign a key")),
492   ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
493   ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
494   ARGPARSE_c (aEditKey,  "key-edit"   ,"@"),
495   ARGPARSE_c (aPasswd,   "change-passphrase", N_("change a passphrase")),
496   ARGPARSE_c (aPasswd,   "passwd", "@"),
497   ARGPARSE_c (aDesigRevoke, "generate-designated-revocation", "@"),
498   ARGPARSE_c (aDesigRevoke, "desig-revoke","@" ),
499   ARGPARSE_c (aExport, "export"           , N_("export keys") ),
500   ARGPARSE_c (aSendKeys, "send-keys"     , N_("export keys to a keyserver") ),
501   ARGPARSE_c (aRecvKeys, "receive-keys" , N_("import keys from a keyserver") ),
502   ARGPARSE_c (aRecvKeys, "recv-keys"     , "@"),
503   ARGPARSE_c (aSearchKeys, "search-keys" ,
504               N_("search for keys on a keyserver") ),
505   ARGPARSE_c (aRefreshKeys, "refresh-keys",
506               N_("update all keys from a keyserver")),
507   ARGPARSE_c (aLocateKeys, "locate-keys", "@"),
508   ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
509   ARGPARSE_c (aExportSecret, "export-secret-keys" , "@" ),
510   ARGPARSE_c (aExportSecretSub, "export-secret-subkeys" , "@" ),
511   ARGPARSE_c (aExportSshKey, "export-ssh-key", "@" ),
512   ARGPARSE_c (aImport, "import", N_("import/merge keys")),
513   ARGPARSE_c (aFastImport, "fast-import", "@"),
514 #ifdef ENABLE_CARD_SUPPORT
515   ARGPARSE_c (aCardStatus,  "card-status", N_("print the card status")),
516   ARGPARSE_c (aCardEdit,   "edit-card",  N_("change data on a card")),
517   ARGPARSE_c (aCardEdit,   "card-edit", "@"),
518   ARGPARSE_c (aChangePIN,  "change-pin", N_("change a card's PIN")),
519 #endif
520   ARGPARSE_c (aListConfig, "list-config", "@"),
521   ARGPARSE_c (aListGcryptConfig, "list-gcrypt-config", "@"),
522   ARGPARSE_c (aGPGConfList, "gpgconf-list", "@" ),
523   ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@" ),
524   ARGPARSE_c (aListPackets, "list-packets","@"),
525
526 #ifndef NO_TRUST_MODELS
527   ARGPARSE_c (aExportOwnerTrust, "export-ownertrust", "@"),
528   ARGPARSE_c (aImportOwnerTrust, "import-ownertrust", "@"),
529   ARGPARSE_c (aUpdateTrustDB,"update-trustdb",
530               N_("update the trust database")),
531   ARGPARSE_c (aCheckTrustDB, "check-trustdb", "@"),
532   ARGPARSE_c (aFixTrustDB, "fix-trustdb", "@"),
533 #endif
534
535   ARGPARSE_c (aDeArmor, "dearmor", "@"),
536   ARGPARSE_c (aDeArmor, "dearmour", "@"),
537   ARGPARSE_c (aEnArmor, "enarmor", "@"),
538   ARGPARSE_c (aEnArmor, "enarmour", "@"),
539   ARGPARSE_c (aPrintMD, "print-md", N_("print message digests")),
540   ARGPARSE_c (aPrimegen, "gen-prime", "@" ),
541   ARGPARSE_c (aGenRandom,"gen-random", "@" ),
542   ARGPARSE_c (aServer,   "server",  N_("run in server mode")),
543   ARGPARSE_c (aTOFUPolicy, "tofu-policy",
544               N_("|VALUE|set the TOFU policy for a key")),
545
546   ARGPARSE_group (301, N_("@\nOptions:\n ")),
547
548   ARGPARSE_s_n (oArmor, "armor", N_("create ascii armored output")),
549   ARGPARSE_s_n (oArmor, "armour", "@"),
550
551   ARGPARSE_s_s (oRecipient, "recipient", N_("|USER-ID|encrypt for USER-ID")),
552   ARGPARSE_s_s (oHiddenRecipient, "hidden-recipient", "@"),
553   ARGPARSE_s_s (oRecipientFile, "recipient-file", "@"),
554   ARGPARSE_s_s (oHiddenRecipientFile, "hidden-recipient-file", "@"),
555   ARGPARSE_s_s (oRecipient, "remote-user", "@"),  /* (old option name) */
556   ARGPARSE_s_s (oDefRecipient, "default-recipient", "@"),
557   ARGPARSE_s_n (oDefRecipientSelf,  "default-recipient-self", "@"),
558   ARGPARSE_s_n (oNoDefRecipient, "no-default-recipient", "@"),
559
560   ARGPARSE_s_s (oTempDir,  "temp-directory", "@"),
561   ARGPARSE_s_s (oExecPath, "exec-path", "@"),
562   ARGPARSE_s_s (oEncryptTo,      "encrypt-to", "@"),
563   ARGPARSE_s_n (oNoEncryptTo, "no-encrypt-to", "@"),
564   ARGPARSE_s_s (oHiddenEncryptTo, "hidden-encrypt-to", "@"),
565   ARGPARSE_s_n (oEncryptToDefaultKey, "encrypt-to-default-key", "@"),
566   ARGPARSE_s_s (oLocalUser, "local-user",
567                 N_("|USER-ID|use USER-ID to sign or decrypt")),
568   ARGPARSE_s_s (oSender, "sender", "@"),
569
570   ARGPARSE_s_s (oTrySecretKey, "try-secret-key", "@"),
571
572   ARGPARSE_s_i (oCompress, NULL,
573                 N_("|N|set compress level to N (0 disables)")),
574   ARGPARSE_s_i (oCompressLevel, "compress-level", "@"),
575   ARGPARSE_s_i (oBZ2CompressLevel, "bzip2-compress-level", "@"),
576   ARGPARSE_s_n (oBZ2DecompressLowmem, "bzip2-decompress-lowmem", "@"),
577
578   ARGPARSE_s_n (oMimemode, "mimemode", "@"),
579   ARGPARSE_s_n (oTextmodeShort, NULL, "@"),
580   ARGPARSE_s_n (oTextmode,   "textmode", N_("use canonical text mode")),
581   ARGPARSE_s_n (oNoTextmode, "no-textmode", "@"),
582
583   ARGPARSE_s_n (oExpert,      "expert", "@"),
584   ARGPARSE_s_n (oNoExpert, "no-expert", "@"),
585
586   ARGPARSE_s_s (oDefSigExpire, "default-sig-expire", "@"),
587   ARGPARSE_s_n (oAskSigExpire,      "ask-sig-expire", "@"),
588   ARGPARSE_s_n (oNoAskSigExpire, "no-ask-sig-expire", "@"),
589   ARGPARSE_s_s (oDefCertExpire, "default-cert-expire", "@"),
590   ARGPARSE_s_n (oAskCertExpire,      "ask-cert-expire", "@"),
591   ARGPARSE_s_n (oNoAskCertExpire, "no-ask-cert-expire", "@"),
592   ARGPARSE_s_i (oDefCertLevel, "default-cert-level", "@"),
593   ARGPARSE_s_i (oMinCertLevel, "min-cert-level", "@"),
594   ARGPARSE_s_n (oAskCertLevel,      "ask-cert-level", "@"),
595   ARGPARSE_s_n (oNoAskCertLevel, "no-ask-cert-level", "@"),
596
597   ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
598   ARGPARSE_p_u (oMaxOutput, "max-output", "@"),
599   ARGPARSE_s_s (oInputSizeHint, "input-size-hint", "@"),
600   ARGPARSE_s_i (oChunkSize, "chunk-size", "@"),
601
602   ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
603   ARGPARSE_s_n (oQuiet,   "quiet",   "@"),
604   ARGPARSE_s_n (oNoTTY,   "no-tty",  "@"),
605
606   ARGPARSE_s_n (oForceMDC, "force-mdc", "@"),
607   ARGPARSE_s_n (oNoForceMDC, "no-force-mdc", "@"),
608   ARGPARSE_s_n (oDisableMDC, "disable-mdc", "@"),
609   ARGPARSE_s_n (oNoDisableMDC, "no-disable-mdc", "@"),
610
611   ARGPARSE_s_n (oForceAEAD, "force-aead", "@"),
612
613   ARGPARSE_s_n (oDisableSignerUID, "disable-signer-uid", "@"),
614
615   ARGPARSE_s_n (oDryRun, "dry-run", N_("do not make any changes")),
616   ARGPARSE_s_n (oInteractive, "interactive", N_("prompt before overwriting")),
617
618   ARGPARSE_s_n (oBatch, "batch", "@"),
619   ARGPARSE_s_n (oAnswerYes, "yes", "@"),
620   ARGPARSE_s_n (oAnswerNo, "no", "@"),
621   ARGPARSE_s_s (oKeyring, "keyring", "@"),
622   ARGPARSE_s_s (oPrimaryKeyring, "primary-keyring", "@"),
623   ARGPARSE_s_s (oSecretKeyring, "secret-keyring", "@"),
624   ARGPARSE_s_n (oShowKeyring, "show-keyring", "@"),
625   ARGPARSE_s_s (oDefaultKey, "default-key", "@"),
626
627   ARGPARSE_s_s (oKeyServer, "keyserver", "@"),
628   ARGPARSE_s_s (oKeyServerOptions, "keyserver-options", "@"),
629   ARGPARSE_s_s (oKeyOrigin, "key-origin", "@"),
630   ARGPARSE_s_s (oImportOptions, "import-options", "@"),
631   ARGPARSE_s_s (oImportFilter,  "import-filter", "@"),
632   ARGPARSE_s_s (oExportOptions, "export-options", "@"),
633   ARGPARSE_s_s (oExportFilter,  "export-filter", "@"),
634   ARGPARSE_s_s (oListOptions,   "list-options", "@"),
635   ARGPARSE_s_s (oVerifyOptions, "verify-options", "@"),
636
637   ARGPARSE_s_s (oDisplayCharset, "display-charset", "@"),
638   ARGPARSE_s_s (oDisplayCharset, "charset", "@"),
639   ARGPARSE_s_s (oOptions, "options", "@"),
640
641   ARGPARSE_s_s (oDebug, "debug", "@"),
642   ARGPARSE_s_s (oDebugLevel, "debug-level", "@"),
643   ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
644   ARGPARSE_s_n (oDebugIOLBF, "debug-iolbf", "@"),
645   ARGPARSE_s_i (oStatusFD, "status-fd", "@"),
646   ARGPARSE_s_s (oStatusFile, "status-file", "@"),
647   ARGPARSE_s_i (oAttributeFD, "attribute-fd", "@"),
648   ARGPARSE_s_s (oAttributeFile, "attribute-file", "@"),
649
650   ARGPARSE_s_i (oCompletesNeeded, "completes-needed", "@"),
651   ARGPARSE_s_i (oMarginalsNeeded, "marginals-needed", "@"),
652   ARGPARSE_s_i (oMaxCertDepth,  "max-cert-depth", "@" ),
653   ARGPARSE_s_s (oTrustedKey, "trusted-key", "@"),
654
655   ARGPARSE_s_s (oLoadExtension, "load-extension", "@"),  /* Dummy.  */
656
657   ARGPARSE_s_s (oCompliance, "compliance",   "@"),
658   ARGPARSE_s_n (oGnuPG, "gnupg",   "@"),
659   ARGPARSE_s_n (oGnuPG, "no-pgp2", "@"),
660   ARGPARSE_s_n (oGnuPG, "no-pgp6", "@"),
661   ARGPARSE_s_n (oGnuPG, "no-pgp7", "@"),
662   ARGPARSE_s_n (oGnuPG, "no-pgp8", "@"),
663   ARGPARSE_s_n (oRFC2440, "rfc2440", "@"),
664   ARGPARSE_s_n (oRFC4880, "rfc4880", "@"),
665   ARGPARSE_s_n (oRFC4880bis, "rfc4880bis", "@"),
666   ARGPARSE_s_n (oOpenPGP, "openpgp", N_("use strict OpenPGP behavior")),
667   ARGPARSE_s_n (oPGP6, "pgp6", "@"),
668   ARGPARSE_s_n (oPGP7, "pgp7", "@"),
669   ARGPARSE_s_n (oPGP8, "pgp8", "@"),
670
671   ARGPARSE_s_n (oRFC2440Text,      "rfc2440-text", "@"),
672   ARGPARSE_s_n (oNoRFC2440Text, "no-rfc2440-text", "@"),
673   ARGPARSE_s_i (oS2KMode, "s2k-mode", "@"),
674   ARGPARSE_s_s (oS2KDigest, "s2k-digest-algo", "@"),
675   ARGPARSE_s_s (oS2KCipher, "s2k-cipher-algo", "@"),
676   ARGPARSE_s_i (oS2KCount, "s2k-count", "@"),
677   ARGPARSE_s_s (oCipherAlgo, "cipher-algo", "@"),
678   ARGPARSE_s_s (oAEADAlgo,   "aead-algo", "@"),
679   ARGPARSE_s_s (oDigestAlgo, "digest-algo", "@"),
680   ARGPARSE_s_s (oCertDigestAlgo, "cert-digest-algo", "@"),
681   ARGPARSE_s_s (oCompressAlgo,"compress-algo", "@"),
682   ARGPARSE_s_s (oCompressAlgo, "compression-algo", "@"), /* Alias */
683   ARGPARSE_s_n (oThrowKeyids, "throw-keyids", "@"),
684   ARGPARSE_s_n (oNoThrowKeyids, "no-throw-keyids", "@"),
685   ARGPARSE_s_n (oShowPhotos,   "show-photos", "@"),
686   ARGPARSE_s_n (oNoShowPhotos, "no-show-photos", "@"),
687   ARGPARSE_s_s (oPhotoViewer,  "photo-viewer", "@"),
688   ARGPARSE_s_s (oSetNotation,  "set-notation", "@"),
689   ARGPARSE_s_s (oSigNotation,  "sig-notation", "@"),
690   ARGPARSE_s_s (oCertNotation, "cert-notation", "@"),
691
692   ARGPARSE_group (302, N_(
693   "@\n(See the man page for a complete listing of all commands and options)\n"
694                       )),
695
696   ARGPARSE_group (303, N_("@\nExamples:\n\n"
697     " -se -r Bob [file]          sign and encrypt for user Bob\n"
698     " --clear-sign [file]        make a clear text signature\n"
699     " --detach-sign [file]       make a detached signature\n"
700     " --list-keys [names]        show keys\n"
701     " --fingerprint [names]      show fingerprints\n")),
702
703   /* More hidden commands and options. */
704   ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
705 #ifndef NO_TRUST_MODELS
706   ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
707 #endif
708
709   /* Not yet used:
710      ARGPARSE_c (aListTrustPath, "list-trust-path", "@"), */
711   ARGPARSE_c (aDeleteSecretAndPublicKeys,
712               "delete-secret-and-public-keys", "@"),
713   ARGPARSE_c (aRebuildKeydbCaches, "rebuild-keydb-caches", "@"),
714
715   ARGPARSE_s_s (oPassphrase,      "passphrase", "@"),
716   ARGPARSE_s_i (oPassphraseFD,    "passphrase-fd", "@"),
717   ARGPARSE_s_s (oPassphraseFile,  "passphrase-file", "@"),
718   ARGPARSE_s_i (oPassphraseRepeat,"passphrase-repeat", "@"),
719   ARGPARSE_s_s (oPinentryMode,    "pinentry-mode", "@"),
720   ARGPARSE_s_i (oCommandFD, "command-fd", "@"),
721   ARGPARSE_s_s (oCommandFile, "command-file", "@"),
722   ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
723   ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
724
725 #ifndef NO_TRUST_MODELS
726   ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
727   ARGPARSE_s_n (oAutoCheckTrustDB, "auto-check-trustdb", "@"),
728   ARGPARSE_s_n (oNoAutoCheckTrustDB, "no-auto-check-trustdb", "@"),
729   ARGPARSE_s_s (oForceOwnertrust, "force-ownertrust", "@"),
730 #endif
731
732   ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
733   ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
734   ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
735   ARGPARSE_s_n (oNoPermissionWarn, "no-permission-warning", "@"),
736   ARGPARSE_s_n (oNoMDCWarn, "no-mdc-warning", "@"),
737   ARGPARSE_s_n (oNoArmor, "no-armor", "@"),
738   ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
739   ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
740   ARGPARSE_s_n (oNoKeyring, "no-keyring", "@"),
741   ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
742   ARGPARSE_s_n (oNoOptions, "no-options", "@"),
743   ARGPARSE_s_s (oHomedir, "homedir", "@"),
744   ARGPARSE_s_n (oNoBatch, "no-batch", "@"),
745   ARGPARSE_s_n (oWithColons, "with-colons", "@"),
746   ARGPARSE_s_n (oWithTofuInfo,"with-tofu-info", "@"),
747   ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
748   ARGPARSE_s_n (oWithSigList,"with-sig-list", "@"),
749   ARGPARSE_s_n (oWithSigCheck,"with-sig-check", "@"),
750   ARGPARSE_c (aListKeys, "list-key", "@"),   /* alias */
751   ARGPARSE_c (aListSigs, "list-sig", "@"),   /* alias */
752   ARGPARSE_c (aCheckKeys, "check-sig", "@"), /* alias */
753   ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
754   ARGPARSE_s_n (oSkipHiddenRecipients, "skip-hidden-recipients", "@"),
755   ARGPARSE_s_n (oNoSkipHiddenRecipients, "no-skip-hidden-recipients", "@"),
756   ARGPARSE_s_i (oDefCertLevel, "default-cert-check-level", "@"), /* old */
757 #ifndef NO_TRUST_MODELS
758   ARGPARSE_s_n (oAlwaysTrust, "always-trust", "@"),
759 #endif
760   ARGPARSE_s_s (oTrustModel, "trust-model", "@"),
761   ARGPARSE_s_s (oTOFUDefaultPolicy, "tofu-default-policy", "@"),
762   ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
763   ARGPARSE_s_n (oForYourEyesOnly, "for-your-eyes-only", "@"),
764   ARGPARSE_s_n (oNoForYourEyesOnly, "no-for-your-eyes-only", "@"),
765   ARGPARSE_s_s (oSetPolicyURL,  "set-policy-url", "@"),
766   ARGPARSE_s_s (oSigPolicyURL,  "sig-policy-url", "@"),
767   ARGPARSE_s_s (oCertPolicyURL, "cert-policy-url", "@"),
768   ARGPARSE_s_n (oShowPolicyURL,      "show-policy-url", "@"),
769   ARGPARSE_s_n (oNoShowPolicyURL, "no-show-policy-url", "@"),
770   ARGPARSE_s_s (oSigKeyserverURL, "sig-keyserver-url", "@"),
771   ARGPARSE_s_n (oShowNotation,      "show-notation", "@"),
772   ARGPARSE_s_n (oNoShowNotation, "no-show-notation", "@"),
773   ARGPARSE_s_s (oComment, "comment", "@"),
774   ARGPARSE_s_n (oDefaultComment, "default-comment", "@"),
775   ARGPARSE_s_n (oNoComments, "no-comments", "@"),
776   ARGPARSE_s_n (oEmitVersion,      "emit-version", "@"),
777   ARGPARSE_s_n (oNoEmitVersion, "no-emit-version", "@"),
778   ARGPARSE_s_n (oNoEmitVersion, "no-version", "@"), /* alias */
779   ARGPARSE_s_n (oNotDashEscaped, "not-dash-escaped", "@"),
780   ARGPARSE_s_n (oEscapeFrom,      "escape-from-lines", "@"),
781   ARGPARSE_s_n (oNoEscapeFrom, "no-escape-from-lines", "@"),
782   ARGPARSE_s_n (oLockOnce,     "lock-once", "@"),
783   ARGPARSE_s_n (oLockMultiple, "lock-multiple", "@"),
784   ARGPARSE_s_n (oLockNever,    "lock-never", "@"),
785   ARGPARSE_s_i (oLoggerFD,   "logger-fd", "@"),
786   ARGPARSE_s_s (oLoggerFile, "log-file", "@"),
787   ARGPARSE_s_s (oLoggerFile, "logger-file", "@"),  /* 1.4 compatibility.  */
788   ARGPARSE_s_n (oUseEmbeddedFilename,      "use-embedded-filename", "@"),
789   ARGPARSE_s_n (oNoUseEmbeddedFilename, "no-use-embedded-filename", "@"),
790   ARGPARSE_s_n (oUtf8Strings,      "utf8-strings", "@"),
791   ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
792   ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
793   ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprint", "@"),
794   ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprints", "@"),
795   ARGPARSE_s_n (oWithICAOSpelling, "with-icao-spelling", "@"),
796   ARGPARSE_s_n (oWithKeygrip,     "with-keygrip", "@"),
797   ARGPARSE_s_n (oWithKeyScreening,"with-key-screening", "@"),
798   ARGPARSE_s_n (oWithSecret,      "with-secret", "@"),
799   ARGPARSE_s_n (oWithWKDHash,     "with-wkd-hash", "@"),
800   ARGPARSE_s_n (oWithKeyOrigin,   "with-key-origin", "@"),
801   ARGPARSE_s_s (oDisableCipherAlgo,  "disable-cipher-algo", "@"),
802   ARGPARSE_s_s (oDisablePubkeyAlgo,  "disable-pubkey-algo", "@"),
803   ARGPARSE_s_n (oAllowNonSelfsignedUID,      "allow-non-selfsigned-uid", "@"),
804   ARGPARSE_s_n (oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", "@"),
805   ARGPARSE_s_n (oAllowFreeformUID,      "allow-freeform-uid", "@"),
806   ARGPARSE_s_n (oNoAllowFreeformUID, "no-allow-freeform-uid", "@"),
807   ARGPARSE_s_n (oNoLiteral, "no-literal", "@"),
808   ARGPARSE_p_u (oSetFilesize, "set-filesize", "@"),
809   ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
810   ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
811   ARGPARSE_s_n (oLegacyListMode, "legacy-list-mode", "@"),
812   ARGPARSE_s_n (oListOnly, "list-only", "@"),
813   ARGPARSE_s_n (oPrintPKARecords, "print-pka-records", "@"),
814   ARGPARSE_s_n (oPrintDANERecords, "print-dane-records", "@"),
815   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
816   ARGPARSE_s_n (oIgnoreValidFrom,    "ignore-valid-from", "@"),
817   ARGPARSE_s_n (oIgnoreCrcError, "ignore-crc-error", "@"),
818   ARGPARSE_s_n (oIgnoreMDCError, "ignore-mdc-error", "@"),
819   ARGPARSE_s_n (oShowSessionKey, "show-session-key", "@"),
820   ARGPARSE_s_s (oOverrideSessionKey, "override-session-key", "@"),
821   ARGPARSE_s_i (oOverrideSessionKeyFD, "override-session-key-fd", "@"),
822   ARGPARSE_s_n (oNoRandomSeedFile,  "no-random-seed-file", "@"),
823   ARGPARSE_s_n (oAutoKeyRetrieve, "auto-key-retrieve", "@"),
824   ARGPARSE_s_n (oNoAutoKeyRetrieve, "no-auto-key-retrieve", "@"),
825   ARGPARSE_s_n (oNoSigCache,         "no-sig-cache", "@"),
826   ARGPARSE_s_n (oMergeOnly,       "merge-only", "@" ),
827   ARGPARSE_s_n (oAllowSecretKeyImport, "allow-secret-key-import", "@"),
828   ARGPARSE_s_n (oTryAllSecrets,  "try-all-secrets", "@"),
829   ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
830   ARGPARSE_s_n (oNoExpensiveTrustChecks, "no-expensive-trust-checks", "@"),
831   ARGPARSE_s_n (oPreservePermissions, "preserve-permissions", "@"),
832   ARGPARSE_s_s (oDefaultPreferenceList,  "default-preference-list", "@"),
833   ARGPARSE_s_s (oDefaultKeyserverURL,  "default-keyserver-url", "@"),
834   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-preferences","@"),
835   ARGPARSE_s_s (oPersonalAEADPreferences, "personal-aead-preferences","@"),
836   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
837   ARGPARSE_s_s (oPersonalCompressPreferences,
838                                          "personal-compress-preferences", "@"),
839   ARGPARSE_s_s (oFakedSystemTime, "faked-system-time", "@"),
840   ARGPARSE_s_s (oWeakDigest, "weak-digest","@"),
841   ARGPARSE_s_n (oUnwrap, "unwrap", "@"),
842   ARGPARSE_s_n (oOnlySignTextIDs, "only-sign-text-ids", "@"),
843
844   /* Aliases.  I constantly mistype these, and assume other people do
845      as well. */
846   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-prefs", "@"),
847   ARGPARSE_s_s (oPersonalAEADPreferences,   "personal-aead-prefs", "@"),
848   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-prefs", "@"),
849   ARGPARSE_s_s (oPersonalCompressPreferences, "personal-compress-prefs", "@"),
850
851   ARGPARSE_s_s (oAgentProgram, "agent-program", "@"),
852   ARGPARSE_s_s (oDirmngrProgram, "dirmngr-program", "@"),
853   ARGPARSE_s_n (oDisableDirmngr, "disable-dirmngr", "@"),
854   ARGPARSE_s_s (oDisplay,    "display",    "@"),
855   ARGPARSE_s_s (oTTYname,    "ttyname",    "@"),
856   ARGPARSE_s_s (oTTYtype,    "ttytype",    "@"),
857   ARGPARSE_s_s (oLCctype,    "lc-ctype",   "@"),
858   ARGPARSE_s_s (oLCmessages, "lc-messages","@"),
859   ARGPARSE_s_s (oXauthority, "xauthority", "@"),
860   ARGPARSE_s_s (oGroup,      "group",      "@"),
861   ARGPARSE_s_s (oUnGroup,    "ungroup",    "@"),
862   ARGPARSE_s_n (oNoGroups,   "no-groups",  "@"),
863   ARGPARSE_s_n (oStrict,     "strict",     "@"),
864   ARGPARSE_s_n (oNoStrict,   "no-strict",  "@"),
865   ARGPARSE_s_n (oMangleDosFilenames,      "mangle-dos-filenames", "@"),
866   ARGPARSE_s_n (oNoMangleDosFilenames, "no-mangle-dos-filenames", "@"),
867   ARGPARSE_s_n (oEnableProgressFilter, "enable-progress-filter", "@"),
868   ARGPARSE_s_n (oMultifile, "multifile", "@"),
869   ARGPARSE_s_s (oKeyidFormat, "keyid-format", "@"),
870   ARGPARSE_s_n (oExitOnStatusWriteError, "exit-on-status-write-error", "@"),
871   ARGPARSE_s_i (oLimitCardInsertTries, "limit-card-insert-tries", "@"),
872
873   ARGPARSE_s_n (oAllowMultisigVerification,
874                 "allow-multisig-verification", "@"),
875   ARGPARSE_s_n (oEnableLargeRSA, "enable-large-rsa", "@"),
876   ARGPARSE_s_n (oDisableLargeRSA, "disable-large-rsa", "@"),
877   ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
878   ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
879   ARGPARSE_s_n (oAllowMultipleMessages,      "allow-multiple-messages", "@"),
880   ARGPARSE_s_n (oNoAllowMultipleMessages, "no-allow-multiple-messages", "@"),
881   ARGPARSE_s_n (oAllowWeakDigestAlgos, "allow-weak-digest-algos", "@"),
882
883   ARGPARSE_s_s (oDefaultNewKeyAlgo, "default-new-key-algo", "@"),
884
885   /* These two are aliases to help users of the PGP command line
886      product use gpg with minimal pain.  Many commands are common
887      already as they seem to have borrowed commands from us.  Now I'm
888      returning the favor. */
889   ARGPARSE_s_s (oLocalUser, "sign-with", "@"),
890   ARGPARSE_s_s (oRecipient, "user", "@"),
891
892   ARGPARSE_s_n (oRequireCrossCert, "require-backsigs", "@"),
893   ARGPARSE_s_n (oRequireCrossCert, "require-cross-certification", "@"),
894   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-backsigs", "@"),
895   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-cross-certification", "@"),
896
897   /* New options.  Fixme: Should go more to the top.  */
898   ARGPARSE_s_s (oAutoKeyLocate, "auto-key-locate", "@"),
899   ARGPARSE_s_n (oNoAutoKeyLocate, "no-auto-key-locate", "@"),
900   ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
901
902   /* Dummy options with warnings.  */
903   ARGPARSE_s_n (oUseAgent,      "use-agent", "@"),
904   ARGPARSE_s_n (oNoUseAgent, "no-use-agent", "@"),
905   ARGPARSE_s_s (oGpgAgentInfo, "gpg-agent-info", "@"),
906   ARGPARSE_s_s (oReaderPort, "reader-port", "@"),
907   ARGPARSE_s_s (octapiDriver, "ctapi-driver", "@"),
908   ARGPARSE_s_s (opcscDriver, "pcsc-driver", "@"),
909   ARGPARSE_s_n (oDisableCCID, "disable-ccid", "@"),
910   ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
911   ARGPARSE_s_s (oTOFUDBFormat, "tofu-db-format", "@"),
912
913   /* Dummy options.  */
914   ARGPARSE_s_n (oNoop, "sk-comments", "@"),
915   ARGPARSE_s_n (oNoop, "no-sk-comments", "@"),
916   ARGPARSE_s_n (oNoop, "compress-keys", "@"),
917   ARGPARSE_s_n (oNoop, "compress-sigs", "@"),
918   ARGPARSE_s_n (oNoop, "force-v3-sigs", "@"),
919   ARGPARSE_s_n (oNoop, "no-force-v3-sigs", "@"),
920   ARGPARSE_s_n (oNoop, "force-v4-certs", "@"),
921   ARGPARSE_s_n (oNoop, "no-force-v4-certs", "@"),
922
923   ARGPARSE_end ()
924 };
925
926
927 /* The list of supported debug flags.  */
928 static struct debug_flags_s debug_flags [] =
929   {
930     { DBG_PACKET_VALUE , "packet"  },
931     { DBG_MPI_VALUE    , "mpi"     },
932     { DBG_CRYPTO_VALUE , "crypto"  },
933     { DBG_FILTER_VALUE , "filter"  },
934     { DBG_IOBUF_VALUE  , "iobuf"   },
935     { DBG_MEMORY_VALUE , "memory"  },
936     { DBG_CACHE_VALUE  , "cache"   },
937     { DBG_MEMSTAT_VALUE, "memstat" },
938     { DBG_TRUST_VALUE  , "trust"   },
939     { DBG_HASHING_VALUE, "hashing" },
940     { DBG_IPC_VALUE    , "ipc"     },
941     { DBG_CLOCK_VALUE  , "clock"   },
942     { DBG_LOOKUP_VALUE , "lookup"  },
943     { DBG_EXTPROG_VALUE, "extprog" },
944     { 0, NULL }
945   };
946
947
948 #ifdef ENABLE_SELINUX_HACKS
949 #define ALWAYS_ADD_KEYRINGS 1
950 #else
951 #define ALWAYS_ADD_KEYRINGS 0
952 #endif
953
954
955 int g10_errors_seen = 0;
956
957 static int utf8_strings = 0;
958 static int maybe_setuid = 1;
959
960 static char *build_list( const char *text, char letter,
961                          const char *(*mapf)(int), int (*chkf)(int) );
962 static void set_cmd( enum cmd_and_opt_values *ret_cmd,
963                         enum cmd_and_opt_values new_cmd );
964 static void print_mds( const char *fname, int algo );
965 static void add_notation_data( const char *string, int which );
966 static void add_policy_url( const char *string, int which );
967 static void add_keyserver_url( const char *string, int which );
968 static void emergency_cleanup (void);
969 static void read_sessionkey_from_fd (int fd);
970
971
972 static char *
973 make_libversion (const char *libname, const char *(*getfnc)(const char*))
974 {
975   const char *s;
976   char *result;
977
978   if (maybe_setuid)
979     {
980       gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
981       maybe_setuid = 0;
982     }
983   s = getfnc (NULL);
984   result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
985   strcpy (stpcpy (stpcpy (result, libname), " "), s);
986   return result;
987 }
988
989
990 static int
991 build_list_pk_test_algo (int algo)
992 {
993   /* Show only one "RSA" string.  If RSA_E or RSA_S is available RSA
994      is also available.  */
995   if (algo == PUBKEY_ALGO_RSA_E
996       || algo == PUBKEY_ALGO_RSA_S)
997     return GPG_ERR_DIGEST_ALGO;
998
999   return openpgp_pk_test_algo (algo);
1000 }
1001
1002 static const char *
1003 build_list_pk_algo_name (int algo)
1004 {
1005   return openpgp_pk_algo_name (algo);
1006 }
1007
1008 static int
1009 build_list_cipher_test_algo (int algo)
1010 {
1011   return openpgp_cipher_test_algo (algo);
1012 }
1013
1014 static const char *
1015 build_list_cipher_algo_name (int algo)
1016 {
1017   return openpgp_cipher_algo_name (algo);
1018 }
1019
1020 static int
1021 build_list_aead_test_algo (int algo)
1022 {
1023   return openpgp_aead_test_algo (algo);
1024 }
1025
1026 static const char *
1027 build_list_aead_algo_name (int algo)
1028 {
1029   return openpgp_aead_algo_name (algo);
1030 }
1031
1032 static int
1033 build_list_md_test_algo (int algo)
1034 {
1035   /* By default we do not accept MD5 based signatures.  To avoid
1036      confusion we do not announce support for it either.  */
1037   if (algo == DIGEST_ALGO_MD5)
1038     return GPG_ERR_DIGEST_ALGO;
1039
1040   return openpgp_md_test_algo (algo);
1041 }
1042
1043 static const char *
1044 build_list_md_algo_name (int algo)
1045 {
1046   return openpgp_md_algo_name (algo);
1047 }
1048
1049
1050 static const char *
1051 my_strusage( int level )
1052 {
1053   static char *digests, *pubkeys, *ciphers, *zips, *aeads, *ver_gcry;
1054   const char *p;
1055
1056     switch( level ) {
1057       case 11: p = "@GPG@ (@GNUPG@)";
1058         break;
1059       case 13: p = VERSION; break;
1060       case 17: p = PRINTABLE_OS_NAME; break;
1061       case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
1062
1063     case 20:
1064       if (!ver_gcry)
1065         ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
1066       p = ver_gcry;
1067       break;
1068
1069 #ifdef IS_DEVELOPMENT_VERSION
1070       case 25:
1071         p="NOTE: THIS IS A DEVELOPMENT VERSION!";
1072         break;
1073       case 26:
1074         p="It is only intended for test purposes and should NOT be";
1075         break;
1076       case 27:
1077         p="used in a production environment or with production keys!";
1078         break;
1079 #endif
1080
1081       case 1:
1082       case 40:  p =
1083             _("Usage: @GPG@ [options] [files] (-h for help)");
1084         break;
1085       case 41:  p =
1086             _("Syntax: @GPG@ [options] [files]\n"
1087               "Sign, check, encrypt or decrypt\n"
1088               "Default operation depends on the input data\n");
1089         break;
1090
1091       case 31: p = "\nHome: "; break;
1092 #ifndef __riscos__
1093       case 32: p = gnupg_homedir (); break;
1094 #else /* __riscos__ */
1095       case 32: p = make_filename(gnupg_homedir (), NULL); break;
1096 #endif /* __riscos__ */
1097       case 33: p = _("\nSupported algorithms:\n"); break;
1098       case 34:
1099         if (!pubkeys)
1100             pubkeys = build_list (_("Pubkey: "), 1,
1101                                   build_list_pk_algo_name,
1102                                   build_list_pk_test_algo );
1103         p = pubkeys;
1104         break;
1105       case 35:
1106         if( !ciphers )
1107             ciphers = build_list(_("Cipher: "), 'S',
1108                                  build_list_cipher_algo_name,
1109                                  build_list_cipher_test_algo );
1110         p = ciphers;
1111         break;
1112       case 36:
1113         if (!aeads)
1114           aeads = build_list ("AEAD: ", 'A',
1115                               build_list_aead_algo_name,
1116                               build_list_aead_test_algo);
1117         p = aeads;
1118         break;
1119       case 37:
1120         if( !digests )
1121             digests = build_list(_("Hash: "), 'H',
1122                                  build_list_md_algo_name,
1123                                  build_list_md_test_algo );
1124         p = digests;
1125         break;
1126       case 38:
1127         if( !zips )
1128             zips = build_list(_("Compression: "),'Z',
1129                               compress_algo_to_string,
1130                               check_compress_algo);
1131         p = zips;
1132         break;
1133
1134       default:  p = NULL;
1135     }
1136     return p;
1137 }
1138
1139
1140 static char *
1141 build_list (const char *text, char letter,
1142             const char * (*mapf)(int), int (*chkf)(int))
1143 {
1144   membuf_t mb;
1145   int indent;
1146   int i, j, len;
1147   int limit;
1148   const char *s;
1149   char *string;
1150
1151   if (maybe_setuid)
1152     gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
1153
1154   indent = utf8_charcount (text, -1);
1155   len = 0;
1156   init_membuf (&mb, 512);
1157
1158   limit = (letter == 'A')? 4 : 110;
1159   for (i=0; i <= limit; i++ )
1160     {
1161       if (!chkf (i) && (s = mapf (i)))
1162         {
1163           if (mb.len - len > 60)
1164             {
1165               put_membuf_str (&mb, ",\n");
1166               len = mb.len;
1167               for (j=0; j < indent; j++)
1168                 put_membuf_str (&mb, " ");
1169             }
1170           else if (mb.len)
1171             put_membuf_str (&mb, ", ");
1172           else
1173             put_membuf_str (&mb, text);
1174
1175           put_membuf_str (&mb, s);
1176           if (opt.verbose && letter)
1177             {
1178               char num[20];
1179               if (letter == 1)
1180                 snprintf (num, sizeof num, " (%d)", i);
1181               else
1182                 snprintf (num, sizeof num, " (%c%d)", letter, i);
1183               put_membuf_str (&mb, num);
1184             }
1185         }
1186     }
1187   if (mb.len)
1188     put_membuf_str (&mb, "\n");
1189   put_membuf (&mb, "", 1);
1190
1191   string = get_membuf (&mb, NULL);
1192   return xrealloc (string, strlen (string)+1);
1193 }
1194
1195
1196 static void
1197 wrong_args( const char *text)
1198 {
1199   es_fprintf (es_stderr, _("usage: %s [options] %s\n"), GPG_NAME, text);
1200   g10_exit(2);
1201 }
1202
1203
1204 static char *
1205 make_username( const char *string )
1206 {
1207     char *p;
1208     if( utf8_strings )
1209         p = xstrdup(string);
1210     else
1211         p = native_to_utf8( string );
1212     return p;
1213 }
1214
1215
1216 static void
1217 set_opt_session_env (const char *name, const char *value)
1218 {
1219   gpg_error_t err;
1220
1221   err = session_env_setenv (opt.session_env, name, value);
1222   if (err)
1223     log_fatal ("error setting session environment: %s\n",
1224                gpg_strerror (err));
1225 }
1226
1227
1228 /* Setup the debugging.  With a LEVEL of NULL only the active debug
1229    flags are propagated to the subsystems.  With LEVEL set, a specific
1230    set of debug flags is set; thus overriding all flags already
1231    set. */
1232 static void
1233 set_debug (const char *level)
1234 {
1235   int numok = (level && digitp (level));
1236   int numlvl = numok? atoi (level) : 0;
1237
1238   if (!level)
1239     ;
1240   else if (!strcmp (level, "none") || (numok && numlvl < 1))
1241     opt.debug = 0;
1242   else if (!strcmp (level, "basic") || (numok && numlvl <= 2))
1243     opt.debug = DBG_MEMSTAT_VALUE;
1244   else if (!strcmp (level, "advanced") || (numok && numlvl <= 5))
1245     opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE;
1246   else if (!strcmp (level, "expert")  || (numok && numlvl <= 8))
1247     opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE
1248                  |DBG_CACHE_VALUE|DBG_LOOKUP|DBG_FILTER_VALUE|DBG_PACKET_VALUE);
1249   else if (!strcmp (level, "guru") || numok)
1250     {
1251       opt.debug = ~0;
1252       /* Unless the "guru" string has been used we don't want to allow
1253          hashing debugging.  The rationale is that people tend to
1254          select the highest debug value and would then clutter their
1255          disk with debug files which may reveal confidential data.  */
1256       if (numok)
1257         opt.debug &= ~(DBG_HASHING_VALUE);
1258     }
1259   else
1260     {
1261       log_error (_("invalid debug-level '%s' given\n"), level);
1262       g10_exit (2);
1263     }
1264
1265   if ((opt.debug & DBG_MEMORY_VALUE))
1266     memory_debug_mode = 1;
1267   if ((opt.debug & DBG_MEMSTAT_VALUE))
1268     memory_stat_debug_mode = 1;
1269   if (DBG_MPI)
1270     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2);
1271   if (DBG_CRYPTO)
1272     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
1273   if ((opt.debug & DBG_IOBUF_VALUE))
1274     iobuf_debug_mode = 1;
1275   gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
1276
1277   if (opt.debug)
1278     parse_debug_flag (NULL, &opt.debug, debug_flags);
1279 }
1280
1281
1282 /* We set the screen dimensions for UI purposes.  Do not allow screens
1283    smaller than 80x24 for the sake of simplicity. */
1284 static void
1285 set_screen_dimensions(void)
1286 {
1287 #ifndef HAVE_W32_SYSTEM
1288   char *str;
1289
1290   str=getenv("COLUMNS");
1291   if(str)
1292     opt.screen_columns=atoi(str);
1293
1294   str=getenv("LINES");
1295   if(str)
1296     opt.screen_lines=atoi(str);
1297 #endif
1298
1299   if(opt.screen_columns<80 || opt.screen_columns>255)
1300     opt.screen_columns=80;
1301
1302   if(opt.screen_lines<24 || opt.screen_lines>255)
1303     opt.screen_lines=24;
1304 }
1305
1306
1307 /* Helper to open a file FNAME either for reading or writing to be
1308    used with --status-file etc functions.  Not generally useful but it
1309    avoids the riscos specific functions and well some Windows people
1310    might like it too.  Prints an error message and returns -1 on
1311    error.  On success the file descriptor is returned.  */
1312 static int
1313 open_info_file (const char *fname, int for_write, int binary)
1314 {
1315 #ifdef __riscos__
1316   return riscos_fdopenfile (fname, for_write);
1317 #elif defined (ENABLE_SELINUX_HACKS)
1318   /* We can't allow these even when testing for a secured filename
1319      because files to be secured might not yet been secured.  This is
1320      similar to the option file but in that case it is unlikely that
1321      sensitive information may be retrieved by means of error
1322      messages.  */
1323   (void)fname;
1324   (void)for_write;
1325   (void)binary;
1326   return -1;
1327 #else
1328   int fd;
1329
1330   if (binary)
1331     binary = MY_O_BINARY;
1332
1333 /*   if (is_secured_filename (fname)) */
1334 /*     { */
1335 /*       fd = -1; */
1336 /*       gpg_err_set_errno (EPERM); */
1337 /*     } */
1338 /*   else */
1339 /*     { */
1340       do
1341         {
1342           if (for_write)
1343             fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY | binary,
1344                         S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
1345           else
1346             fd = open (fname, O_RDONLY | binary);
1347         }
1348       while (fd == -1 && errno == EINTR);
1349 /*     } */
1350   if ( fd == -1)
1351     log_error ( for_write? _("can't create '%s': %s\n")
1352                          : _("can't open '%s': %s\n"), fname, strerror(errno));
1353
1354   return fd;
1355 #endif
1356 }
1357
1358 static void
1359 set_cmd( enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd )
1360 {
1361     enum cmd_and_opt_values cmd = *ret_cmd;
1362
1363     if( !cmd || cmd == new_cmd )
1364         cmd = new_cmd;
1365     else if( cmd == aSign && new_cmd == aEncr )
1366         cmd = aSignEncr;
1367     else if( cmd == aEncr && new_cmd == aSign )
1368         cmd = aSignEncr;
1369     else if( cmd == aSign && new_cmd == aSym )
1370         cmd = aSignSym;
1371     else if( cmd == aSym && new_cmd == aSign )
1372         cmd = aSignSym;
1373     else if( cmd == aSym && new_cmd == aEncr )
1374         cmd = aEncrSym;
1375     else if( cmd == aEncr && new_cmd == aSym )
1376         cmd = aEncrSym;
1377     else if (cmd == aSignEncr && new_cmd == aSym)
1378         cmd = aSignEncrSym;
1379     else if (cmd == aSignSym && new_cmd == aEncr)
1380         cmd = aSignEncrSym;
1381     else if (cmd == aEncrSym && new_cmd == aSign)
1382         cmd = aSignEncrSym;
1383     else if(    ( cmd == aSign     && new_cmd == aClearsign )
1384              || ( cmd == aClearsign && new_cmd == aSign )  )
1385         cmd = aClearsign;
1386     else {
1387         log_error(_("conflicting commands\n"));
1388         g10_exit(2);
1389     }
1390
1391     *ret_cmd = cmd;
1392 }
1393
1394
1395 static void
1396 add_group(char *string)
1397 {
1398   char *name,*value;
1399   struct groupitem *item;
1400
1401   /* Break off the group name */
1402   name=strsep(&string,"=");
1403   if(string==NULL)
1404     {
1405       log_error(_("no = sign found in group definition '%s'\n"),name);
1406       return;
1407     }
1408
1409   trim_trailing_ws(name,strlen(name));
1410
1411   /* Does this group already exist? */
1412   for(item=opt.grouplist;item;item=item->next)
1413     if(strcasecmp(item->name,name)==0)
1414       break;
1415
1416   if(!item)
1417     {
1418       item=xmalloc(sizeof(struct groupitem));
1419       item->name=name;
1420       item->next=opt.grouplist;
1421       item->values=NULL;
1422       opt.grouplist=item;
1423     }
1424
1425   /* Break apart the values */
1426   while ((value= strsep(&string," \t")))
1427     {
1428       if (*value)
1429         add_to_strlist2(&item->values,value,utf8_strings);
1430     }
1431 }
1432
1433
1434 static void
1435 rm_group(char *name)
1436 {
1437   struct groupitem *item,*last=NULL;
1438
1439   trim_trailing_ws(name,strlen(name));
1440
1441   for(item=opt.grouplist;item;last=item,item=item->next)
1442     {
1443       if(strcasecmp(item->name,name)==0)
1444         {
1445           if(last)
1446             last->next=item->next;
1447           else
1448             opt.grouplist=item->next;
1449
1450           free_strlist(item->values);
1451           xfree(item);
1452           break;
1453         }
1454     }
1455 }
1456
1457
1458 /* We need to check three things.
1459
1460    0) The homedir.  It must be x00, a directory, and owned by the
1461    user.
1462
1463    1) The options/gpg.conf file.  Okay unless it or its containing
1464    directory is group or other writable or not owned by us.  Disable
1465    exec in this case.
1466
1467    2) Extensions.  Same as #1.
1468
1469    Returns true if the item is unsafe. */
1470 static int
1471 check_permissions (const char *path, int item)
1472 {
1473 #if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
1474   static int homedir_cache=-1;
1475   char *tmppath,*dir;
1476   struct stat statbuf,dirbuf;
1477   int homedir=0,ret=0,checkonly=0;
1478   int perm=0,own=0,enc_dir_perm=0,enc_dir_own=0;
1479
1480   if(opt.no_perm_warn)
1481     return 0;
1482
1483   log_assert(item==0 || item==1 || item==2);
1484
1485   /* extensions may attach a path */
1486   if(item==2 && path[0]!=DIRSEP_C)
1487     {
1488       if(strchr(path,DIRSEP_C))
1489         tmppath=make_filename(path,NULL);
1490       else
1491         tmppath=make_filename(gnupg_libdir (),path,NULL);
1492     }
1493   else
1494     tmppath=xstrdup(path);
1495
1496   /* If the item is located in the homedir, but isn't the homedir,
1497      don't continue if we already checked the homedir itself.  This is
1498      to avoid user confusion with an extra options file warning which
1499      could be rectified if the homedir itself had proper
1500      permissions. */
1501   if(item!=0 && homedir_cache>-1
1502      && !ascii_strncasecmp (gnupg_homedir (), tmppath,
1503                             strlen (gnupg_homedir ())))
1504     {
1505       ret=homedir_cache;
1506       goto end;
1507     }
1508
1509   /* It's okay if the file or directory doesn't exist */
1510   if(stat(tmppath,&statbuf)!=0)
1511     {
1512       ret=0;
1513       goto end;
1514     }
1515
1516   /* Now check the enclosing directory.  Theoretically, we could walk
1517      this test up to the root directory /, but for the sake of sanity,
1518      I'm stopping at one level down. */
1519   dir=make_dirname(tmppath);
1520
1521   if(stat(dir,&dirbuf)!=0 || !S_ISDIR(dirbuf.st_mode))
1522     {
1523       /* Weird error */
1524       ret=1;
1525       goto end;
1526     }
1527
1528   xfree(dir);
1529
1530   /* Assume failure */
1531   ret=1;
1532
1533   if(item==0)
1534     {
1535       /* The homedir must be x00, a directory, and owned by the user. */
1536
1537       if(S_ISDIR(statbuf.st_mode))
1538         {
1539           if(statbuf.st_uid==getuid())
1540             {
1541               if((statbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
1542                 ret=0;
1543               else
1544                 perm=1;
1545             }
1546           else
1547             own=1;
1548
1549           homedir_cache=ret;
1550         }
1551     }
1552   else if(item==1 || item==2)
1553     {
1554       /* The options or extension file.  Okay unless it or its
1555          containing directory is group or other writable or not owned
1556          by us or root. */
1557
1558       if(S_ISREG(statbuf.st_mode))
1559         {
1560           if(statbuf.st_uid==getuid() || statbuf.st_uid==0)
1561             {
1562               if((statbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
1563                 {
1564                   /* it's not writable, so make sure the enclosing
1565                      directory is also not writable */
1566                   if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
1567                     {
1568                       if((dirbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
1569                         ret=0;
1570                       else
1571                         enc_dir_perm=1;
1572                     }
1573                   else
1574                     enc_dir_own=1;
1575                 }
1576               else
1577                 {
1578                   /* it's writable, so the enclosing directory had
1579                      better not let people get to it. */
1580                   if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
1581                     {
1582                       if((dirbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
1583                         ret=0;
1584                       else
1585                         perm=enc_dir_perm=1; /* unclear which one to fix! */
1586                     }
1587                   else
1588                     enc_dir_own=1;
1589                 }
1590             }
1591           else
1592             own=1;
1593         }
1594     }
1595   else
1596     BUG();
1597
1598   if(!checkonly)
1599     {
1600       if(own)
1601         {
1602           if(item==0)
1603             log_info(_("WARNING: unsafe ownership on"
1604                        " homedir '%s'\n"),tmppath);
1605           else if(item==1)
1606             log_info(_("WARNING: unsafe ownership on"
1607                        " configuration file '%s'\n"),tmppath);
1608           else
1609             log_info(_("WARNING: unsafe ownership on"
1610                        " extension '%s'\n"),tmppath);
1611         }
1612       if(perm)
1613         {
1614           if(item==0)
1615             log_info(_("WARNING: unsafe permissions on"
1616                        " homedir '%s'\n"),tmppath);
1617           else if(item==1)
1618             log_info(_("WARNING: unsafe permissions on"
1619                        " configuration file '%s'\n"),tmppath);
1620           else
1621             log_info(_("WARNING: unsafe permissions on"
1622                        " extension '%s'\n"),tmppath);
1623         }
1624       if(enc_dir_own)
1625         {
1626           if(item==0)
1627             log_info(_("WARNING: unsafe enclosing directory ownership on"
1628                        " homedir '%s'\n"),tmppath);
1629           else if(item==1)
1630             log_info(_("WARNING: unsafe enclosing directory ownership on"
1631                        " configuration file '%s'\n"),tmppath);
1632           else
1633             log_info(_("WARNING: unsafe enclosing directory ownership on"
1634                        " extension '%s'\n"),tmppath);
1635         }
1636       if(enc_dir_perm)
1637         {
1638           if(item==0)
1639             log_info(_("WARNING: unsafe enclosing directory permissions on"
1640                        " homedir '%s'\n"),tmppath);
1641           else if(item==1)
1642             log_info(_("WARNING: unsafe enclosing directory permissions on"
1643                        " configuration file '%s'\n"),tmppath);
1644           else
1645             log_info(_("WARNING: unsafe enclosing directory permissions on"
1646                        " extension '%s'\n"),tmppath);
1647         }
1648     }
1649
1650  end:
1651   xfree(tmppath);
1652
1653   if(homedir)
1654     homedir_cache=ret;
1655
1656   return ret;
1657
1658 #else /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
1659   (void)path;
1660   (void)item;
1661   return 0;
1662 #endif /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
1663 }
1664
1665
1666 /* Print the OpenPGP defined algo numbers.  */
1667 static void
1668 print_algo_numbers(int (*checker)(int))
1669 {
1670   int i,first=1;
1671
1672   for(i=0;i<=110;i++)
1673     {
1674       if(!checker(i))
1675         {
1676           if(first)
1677             first=0;
1678           else
1679             es_printf (";");
1680           es_printf ("%d",i);
1681         }
1682     }
1683 }
1684
1685
1686 static void
1687 print_algo_names(int (*checker)(int),const char *(*mapper)(int))
1688 {
1689   int i,first=1;
1690
1691   for(i=0;i<=110;i++)
1692     {
1693       if(!checker(i))
1694         {
1695           if(first)
1696             first=0;
1697           else
1698             es_printf (";");
1699           es_printf ("%s",mapper(i));
1700         }
1701     }
1702 }
1703
1704 /* In the future, we can do all sorts of interesting configuration
1705    output here.  For now, just give "group" as the Enigmail folks need
1706    it, and pubkey, cipher, hash, and compress as they may be useful
1707    for frontends. */
1708 static void
1709 list_config(char *items)
1710 {
1711   int show_all = !items;
1712   char *name = NULL;
1713   const char *s;
1714   struct groupitem *giter;
1715   int first, iter;
1716
1717   if(!opt.with_colons)
1718     return;
1719
1720   while(show_all || (name=strsep(&items," ")))
1721     {
1722       int any=0;
1723
1724       if(show_all || ascii_strcasecmp(name,"group")==0)
1725         {
1726           for (giter = opt.grouplist; giter; giter = giter->next)
1727             {
1728               strlist_t sl;
1729
1730               es_fprintf (es_stdout, "cfg:group:");
1731               es_write_sanitized (es_stdout, giter->name, strlen(giter->name),
1732                                   ":", NULL);
1733               es_putc (':', es_stdout);
1734
1735               for(sl=giter->values; sl; sl=sl->next)
1736                 {
1737                   es_write_sanitized (es_stdout, sl->d, strlen (sl->d),
1738                                       ":;", NULL);
1739                   if(sl->next)
1740                     es_printf(";");
1741                 }
1742
1743               es_printf("\n");
1744             }
1745
1746           any=1;
1747         }
1748
1749       if(show_all || ascii_strcasecmp(name,"version")==0)
1750         {
1751           es_printf("cfg:version:");
1752           es_write_sanitized (es_stdout, VERSION, strlen(VERSION), ":", NULL);
1753           es_printf ("\n");
1754           any=1;
1755         }
1756
1757       if(show_all || ascii_strcasecmp(name,"pubkey")==0)
1758         {
1759           es_printf ("cfg:pubkey:");
1760           print_algo_numbers (build_list_pk_test_algo);
1761           es_printf ("\n");
1762           any=1;
1763         }
1764
1765       if(show_all || ascii_strcasecmp(name,"pubkeyname")==0)
1766         {
1767           es_printf ("cfg:pubkeyname:");
1768           print_algo_names (build_list_pk_test_algo,
1769                             build_list_pk_algo_name);
1770           es_printf ("\n");
1771           any=1;
1772         }
1773
1774       if(show_all || ascii_strcasecmp(name,"cipher")==0)
1775         {
1776           es_printf ("cfg:cipher:");
1777           print_algo_numbers (build_list_cipher_test_algo);
1778           es_printf ("\n");
1779           any=1;
1780         }
1781
1782       if (show_all || !ascii_strcasecmp (name,"ciphername"))
1783         {
1784           es_printf ("cfg:ciphername:");
1785           print_algo_names (build_list_cipher_test_algo,
1786                             build_list_cipher_algo_name);
1787           es_printf ("\n");
1788           any = 1;
1789         }
1790
1791       if(show_all
1792          || ascii_strcasecmp(name,"digest")==0
1793          || ascii_strcasecmp(name,"hash")==0)
1794         {
1795           es_printf ("cfg:digest:");
1796           print_algo_numbers (build_list_md_test_algo);
1797           es_printf ("\n");
1798           any=1;
1799         }
1800
1801       if (show_all
1802           || !ascii_strcasecmp(name,"digestname")
1803           || !ascii_strcasecmp(name,"hashname"))
1804         {
1805           es_printf ("cfg:digestname:");
1806           print_algo_names (build_list_md_test_algo,
1807                             build_list_md_algo_name);
1808           es_printf ("\n");
1809           any=1;
1810         }
1811
1812       if(show_all || ascii_strcasecmp(name,"compress")==0)
1813         {
1814           es_printf ("cfg:compress:");
1815           print_algo_numbers(check_compress_algo);
1816           es_printf ("\n");
1817           any=1;
1818         }
1819
1820       if(show_all || ascii_strcasecmp (name, "compressname") == 0)
1821         {
1822           es_printf ("cfg:compressname:");
1823           print_algo_names (check_compress_algo,
1824                             compress_algo_to_string);
1825           es_printf ("\n");
1826           any=1;
1827         }
1828
1829       if (show_all || !ascii_strcasecmp(name,"ccid-reader-id"))
1830         {
1831           /* We ignore this for GnuPG 1.4 backward compatibility.  */
1832           any=1;
1833         }
1834
1835       if (show_all || !ascii_strcasecmp (name,"curve"))
1836         {
1837           es_printf ("cfg:curve:");
1838           for (iter=0, first=1; (s = openpgp_enum_curves (&iter)); first=0)
1839             es_printf ("%s%s", first?"":";", s);
1840           es_printf ("\n");
1841           any=1;
1842         }
1843
1844       /* Curve OIDs are rarely useful and thus only printed if requested.  */
1845       if (name && !ascii_strcasecmp (name,"curveoid"))
1846         {
1847           es_printf ("cfg:curveoid:");
1848           for (iter=0, first=1; (s = openpgp_enum_curves (&iter)); first = 0)
1849             {
1850               s = openpgp_curve_to_oid (s, NULL);
1851               es_printf ("%s%s", first?"":";", s? s:"[?]");
1852             }
1853           es_printf ("\n");
1854           any=1;
1855         }
1856
1857       if(show_all)
1858         break;
1859
1860       if(!any)
1861         log_error(_("unknown configuration item '%s'\n"),name);
1862     }
1863 }
1864
1865
1866 /* List options and default values in the GPG Conf format.  This is a
1867    new tool distributed with gnupg 1.9.x but we also want some limited
1868    support in older gpg versions.  The output is the name of the
1869    configuration file and a list of options available for editing by
1870    gpgconf.  */
1871 static void
1872 gpgconf_list (const char *configfile)
1873 {
1874   char *configfile_esc = percent_escape (configfile, NULL);
1875
1876   es_printf ("%s-%s.conf:%lu:\"%s\n",
1877              GPGCONF_NAME, GPG_NAME,
1878              GC_OPT_FLAG_DEFAULT,
1879              configfile_esc ? configfile_esc : "/dev/null");
1880   es_printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
1881   es_printf ("quiet:%lu:\n",   GC_OPT_FLAG_NONE);
1882   es_printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
1883   es_printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
1884   es_printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE);
1885   es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
1886   es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE);
1887   es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
1888   es_printf ("auto-key-retrieve:%lu:\n", GC_OPT_FLAG_NONE);
1889   es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
1890   es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
1891   es_printf ("group:%lu:\n", GC_OPT_FLAG_NONE);
1892   es_printf ("compliance:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT, "gnupg");
1893   es_printf ("default-new-key-algo:%lu:\n", GC_OPT_FLAG_NONE);
1894   es_printf ("trust-model:%lu:\n", GC_OPT_FLAG_NONE);
1895   es_printf ("disable-dirmngr:%lu:\n", GC_OPT_FLAG_NONE);
1896   es_printf ("max-cert-depth:%lu:\n", GC_OPT_FLAG_NONE);
1897   es_printf ("completes-needed:%lu:\n", GC_OPT_FLAG_NONE);
1898   es_printf ("marginals-needed:%lu:\n", GC_OPT_FLAG_NONE);
1899
1900   /* The next one is an info only item and should match the macros at
1901      the top of keygen.c  */
1902   es_printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
1903              get_default_pubkey_algo ());
1904
1905   xfree (configfile_esc);
1906 }
1907
1908
1909 static int
1910 parse_subpacket_list(char *list)
1911 {
1912   char *tok;
1913   byte subpackets[128],i;
1914   int count=0;
1915
1916   if(!list)
1917     {
1918       /* No arguments means all subpackets */
1919       memset(subpackets+1,1,sizeof(subpackets)-1);
1920       count=127;
1921     }
1922   else
1923     {
1924       memset(subpackets,0,sizeof(subpackets));
1925
1926       /* Merge with earlier copy */
1927       if(opt.show_subpackets)
1928         {
1929           byte *in;
1930
1931           for(in=opt.show_subpackets;*in;in++)
1932             {
1933               if(*in>127 || *in<1)
1934                 BUG();
1935
1936               if(!subpackets[*in])
1937                 count++;
1938               subpackets[*in]=1;
1939             }
1940         }
1941
1942       while((tok=strsep(&list," ,")))
1943         {
1944           if(!*tok)
1945             continue;
1946
1947           i=atoi(tok);
1948           if(i>127 || i<1)
1949             return 0;
1950
1951           if(!subpackets[i])
1952             count++;
1953           subpackets[i]=1;
1954         }
1955     }
1956
1957   xfree(opt.show_subpackets);
1958   opt.show_subpackets=xmalloc(count+1);
1959   opt.show_subpackets[count--]=0;
1960
1961   for(i=1;i<128 && count>=0;i++)
1962     if(subpackets[i])
1963       opt.show_subpackets[count--]=i;
1964
1965   return 1;
1966 }
1967
1968
1969 static int
1970 parse_list_options(char *str)
1971 {
1972   char *subpackets=""; /* something that isn't NULL */
1973   struct parse_options lopts[]=
1974     {
1975       {"show-photos",LIST_SHOW_PHOTOS,NULL,
1976        N_("display photo IDs during key listings")},
1977       {"show-usage",LIST_SHOW_USAGE,NULL,
1978        N_("show key usage information during key listings")},
1979       {"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL,
1980        N_("show policy URLs during signature listings")},
1981       {"show-notations",LIST_SHOW_NOTATIONS,NULL,
1982        N_("show all notations during signature listings")},
1983       {"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1984        N_("show IETF standard notations during signature listings")},
1985       {"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1986        NULL},
1987       {"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL,
1988        N_("show user-supplied notations during signature listings")},
1989       {"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL,
1990        N_("show preferred keyserver URLs during signature listings")},
1991       {"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL,
1992        N_("show user ID validity during key listings")},
1993       {"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL,
1994        N_("show revoked and expired user IDs in key listings")},
1995       {"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL,
1996        N_("show revoked and expired subkeys in key listings")},
1997       {"show-keyring",LIST_SHOW_KEYRING,NULL,
1998        N_("show the keyring name in key listings")},
1999       {"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL,
2000        N_("show expiration dates during signature listings")},
2001       {"show-sig-subpackets",LIST_SHOW_SIG_SUBPACKETS,NULL,
2002        NULL},
2003       {NULL,0,NULL,NULL}
2004     };
2005
2006   /* C99 allows for non-constant initializers, but we'd like to
2007      compile everywhere, so fill in the show-sig-subpackets argument
2008      here.  Note that if the parse_options array changes, we'll have
2009      to change the subscript here. */
2010   lopts[13].value=&subpackets;
2011
2012   if(parse_options(str,&opt.list_options,lopts,1))
2013     {
2014       if(opt.list_options&LIST_SHOW_SIG_SUBPACKETS)
2015         {
2016           /* Unset so users can pass multiple lists in. */
2017           opt.list_options&=~LIST_SHOW_SIG_SUBPACKETS;
2018           if(!parse_subpacket_list(subpackets))
2019             return 0;
2020         }
2021       else if(subpackets==NULL && opt.show_subpackets)
2022         {
2023           /* User did 'no-show-subpackets' */
2024           xfree(opt.show_subpackets);
2025           opt.show_subpackets=NULL;
2026         }
2027
2028       return 1;
2029     }
2030   else
2031     return 0;
2032 }
2033
2034
2035 /* Collapses argc/argv into a single string that must be freed */
2036 static char *
2037 collapse_args(int argc,char *argv[])
2038 {
2039   char *str=NULL;
2040   int i,first=1,len=0;
2041
2042   for(i=0;i<argc;i++)
2043     {
2044       len+=strlen(argv[i])+2;
2045       str=xrealloc(str,len);
2046       if(first)
2047         {
2048           str[0]='\0';
2049           first=0;
2050         }
2051       else
2052         strcat(str," ");
2053
2054       strcat(str,argv[i]);
2055     }
2056
2057   return str;
2058 }
2059
2060
2061 #ifndef NO_TRUST_MODELS
2062 static void
2063 parse_trust_model(const char *model)
2064 {
2065   if(ascii_strcasecmp(model,"pgp")==0)
2066     opt.trust_model=TM_PGP;
2067   else if(ascii_strcasecmp(model,"classic")==0)
2068     opt.trust_model=TM_CLASSIC;
2069   else if(ascii_strcasecmp(model,"always")==0)
2070     opt.trust_model=TM_ALWAYS;
2071   else if(ascii_strcasecmp(model,"direct")==0)
2072     opt.trust_model=TM_DIRECT;
2073 #ifdef USE_TOFU
2074   else if(ascii_strcasecmp(model,"tofu")==0)
2075     opt.trust_model=TM_TOFU;
2076   else if(ascii_strcasecmp(model,"tofu+pgp")==0)
2077     opt.trust_model=TM_TOFU_PGP;
2078 #endif /*USE_TOFU*/
2079   else if(ascii_strcasecmp(model,"auto")==0)
2080     opt.trust_model=TM_AUTO;
2081   else
2082     log_error("unknown trust model '%s'\n",model);
2083 }
2084 #endif /*NO_TRUST_MODELS*/
2085
2086
2087 static int
2088 parse_tofu_policy (const char *policystr)
2089 {
2090 #ifdef USE_TOFU
2091   struct { const char *keyword; int policy; } list[] = {
2092     { "auto",    TOFU_POLICY_AUTO },
2093     { "good",    TOFU_POLICY_GOOD },
2094     { "unknown", TOFU_POLICY_UNKNOWN },
2095     { "bad",     TOFU_POLICY_BAD },
2096     { "ask",     TOFU_POLICY_ASK }
2097   };
2098   int i;
2099
2100   if (!ascii_strcasecmp (policystr, "help"))
2101     {
2102       log_info (_("valid values for option '%s':\n"), "--tofu-policy");
2103       for (i=0; i < DIM (list); i++)
2104         log_info ("  %s\n", list[i].keyword);
2105       g10_exit (1);
2106     }
2107
2108   for (i=0; i < DIM (list); i++)
2109     if (!ascii_strcasecmp (policystr, list[i].keyword))
2110       return list[i].policy;
2111 #endif /*USE_TOFU*/
2112
2113   log_error (_("unknown TOFU policy '%s'\n"), policystr);
2114   if (!opt.quiet)
2115     log_info (_("(use \"help\" to list choices)\n"));
2116   g10_exit (1);
2117 }
2118
2119
2120 static struct gnupg_compliance_option compliance_options[] =
2121   {
2122     { "gnupg",      oGnuPG },
2123     { "openpgp",    oOpenPGP },
2124     { "rfc4880bis", oRFC4880bis },
2125     { "rfc4880",    oRFC4880 },
2126     { "rfc2440",    oRFC2440 },
2127     { "pgp6",       oPGP6 },
2128     { "pgp7",       oPGP7 },
2129     { "pgp8",       oPGP8 },
2130     { "de-vs",      oDE_VS }
2131   };
2132
2133
2134 /* Helper to set compliance related options.  This is a separate
2135  * function so that it can also be used by the --compliance option
2136  * parser.  */
2137 static void
2138 set_compliance_option (enum cmd_and_opt_values option)
2139 {
2140   switch (option)
2141     {
2142     case oRFC4880bis:
2143       opt.flags.rfc4880bis = 1;
2144       /* fall through.  */
2145     case oOpenPGP:
2146     case oRFC4880:
2147       /* This is effectively the same as RFC2440, but with
2148          "--enable-dsa2 --no-rfc2440-text --escape-from-lines
2149          --require-cross-certification". */
2150       opt.compliance = CO_RFC4880;
2151       opt.flags.dsa2 = 1;
2152       opt.flags.require_cross_cert = 1;
2153       opt.rfc2440_text = 0;
2154       opt.allow_non_selfsigned_uid = 1;
2155       opt.allow_freeform_uid = 1;
2156       opt.escape_from = 1;
2157       opt.not_dash_escaped = 0;
2158       opt.def_cipher_algo = 0;
2159       opt.def_aead_algo = 0;
2160       opt.def_digest_algo = 0;
2161       opt.cert_digest_algo = 0;
2162       opt.compress_algo = -1;
2163       opt.s2k_mode = 3; /* iterated+salted */
2164       opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2165       opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2166       break;
2167     case oRFC2440:
2168       opt.compliance = CO_RFC2440;
2169       opt.flags.dsa2 = 0;
2170       opt.rfc2440_text = 1;
2171       opt.allow_non_selfsigned_uid = 1;
2172       opt.allow_freeform_uid = 1;
2173       opt.escape_from = 0;
2174       opt.not_dash_escaped = 0;
2175       opt.def_cipher_algo = 0;
2176       opt.def_aead_algo = 0;
2177       opt.def_digest_algo = 0;
2178       opt.cert_digest_algo = 0;
2179       opt.compress_algo = -1;
2180       opt.s2k_mode = 3; /* iterated+salted */
2181       opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2182       opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2183       break;
2184     case oPGP6:  opt.compliance = CO_PGP6;  break;
2185     case oPGP7:  opt.compliance = CO_PGP7;  break;
2186     case oPGP8:  opt.compliance = CO_PGP8;  break;
2187     case oGnuPG: opt.compliance = CO_GNUPG; break;
2188
2189     case oDE_VS:
2190       set_compliance_option (oOpenPGP);
2191       opt.compliance = CO_DE_VS;
2192       opt.force_mdc = 1;
2193       opt.def_aead_algo = 0;
2194       /* Fixme: Change other options.  */
2195       break;
2196
2197     default:
2198       BUG ();
2199     }
2200 }
2201
2202
2203
2204
2205
2206
2207 /* This function called to initialized a new control object.  It is
2208    assumed that this object has been zeroed out before calling this
2209    function. */
2210 static void
2211 gpg_init_default_ctrl (ctrl_t ctrl)
2212 {
2213   ctrl->magic = SERVER_CONTROL_MAGIC;
2214 }
2215
2216
2217 /* This function is called to deinitialize a control object.  It is
2218    not deallocated. */
2219 static void
2220 gpg_deinit_default_ctrl (ctrl_t ctrl)
2221 {
2222 #ifdef USE_TOFU
2223   tofu_closedbs (ctrl);
2224 #endif
2225   gpg_dirmngr_deinit_session_data (ctrl);
2226
2227   keydb_release (ctrl->cached_getkey_kdb);
2228 }
2229
2230
2231 char *
2232 get_default_configname (void)
2233 {
2234   char *configname = NULL;
2235   char *name = xstrdup (GPG_NAME EXTSEP_S "conf-" SAFE_VERSION);
2236   char *ver = &name[strlen (GPG_NAME EXTSEP_S "conf-")];
2237
2238   do
2239     {
2240       if (configname)
2241         {
2242           char *tok;
2243
2244           xfree (configname);
2245           configname = NULL;
2246
2247           if ((tok = strrchr (ver, SAFE_VERSION_DASH)))
2248             *tok='\0';
2249           else if ((tok = strrchr (ver, SAFE_VERSION_DOT)))
2250             *tok='\0';
2251           else
2252             break;
2253         }
2254
2255       configname = make_filename (gnupg_homedir (), name, NULL);
2256     }
2257   while (access (configname, R_OK));
2258
2259   xfree(name);
2260
2261   if (! configname)
2262     configname = make_filename (gnupg_homedir (),
2263                                 GPG_NAME EXTSEP_S "conf", NULL);
2264   if (! access (configname, R_OK))
2265     {
2266       /* Print a warning when both config files are present.  */
2267       char *p = make_filename (gnupg_homedir (), "options", NULL);
2268       if (! access (p, R_OK))
2269         log_info (_("Note: old default options file '%s' ignored\n"), p);
2270       xfree (p);
2271     }
2272   else
2273     {
2274       /* Use the old default only if it exists.  */
2275       char *p = make_filename (gnupg_homedir (), "options", NULL);
2276       if (!access (p, R_OK))
2277         {
2278           xfree (configname);
2279           configname = p;
2280         }
2281       else
2282         xfree (p);
2283     }
2284
2285   return configname;
2286 }
2287
2288 int
2289 main (int argc, char **argv)
2290 {
2291     ARGPARSE_ARGS pargs;
2292     IOBUF a;
2293     int rc=0;
2294     int orig_argc;
2295     char **orig_argv;
2296     const char *fname;
2297     char *username;
2298     int may_coredump;
2299     strlist_t sl;
2300     strlist_t remusr = NULL;
2301     strlist_t locusr = NULL;
2302     strlist_t nrings = NULL;
2303     armor_filter_context_t *afx = NULL;
2304     int detached_sig = 0;
2305     FILE *configfp = NULL;
2306     char *configname = NULL;
2307     char *save_configname = NULL;
2308     char *default_configname = NULL;
2309     unsigned configlineno;
2310     int parse_debug = 0;
2311     int default_config = 1;
2312     int default_keyring = 1;
2313     int greeting = 0;
2314     int nogreeting = 0;
2315     char *logfile = NULL;
2316     int use_random_seed = 1;
2317     enum cmd_and_opt_values cmd = 0;
2318     const char *debug_level = NULL;
2319 #ifndef NO_TRUST_MODELS
2320     const char *trustdb_name = NULL;
2321 #endif /*!NO_TRUST_MODELS*/
2322     char *def_cipher_string = NULL;
2323     char *def_aead_string = NULL;
2324     char *def_digest_string = NULL;
2325     char *compress_algo_string = NULL;
2326     char *cert_digest_string = NULL;
2327     char *s2k_cipher_string = NULL;
2328     char *s2k_digest_string = NULL;
2329     char *pers_cipher_list = NULL;
2330     char *pers_aead_list = NULL;
2331     char *pers_digest_list = NULL;
2332     char *pers_compress_list = NULL;
2333     int eyes_only=0;
2334     int multifile=0;
2335     int pwfd = -1;
2336     int ovrseskeyfd = -1;
2337     int fpr_maybe_cmd = 0; /* --fingerprint maybe a command.  */
2338     int any_explicit_recipient = 0;
2339     int default_akl = 1;
2340     int require_secmem = 0;
2341     int got_secmem = 0;
2342     struct assuan_malloc_hooks malloc_hooks;
2343     ctrl_t ctrl;
2344
2345     static int print_dane_records;
2346     static int print_pka_records;
2347
2348
2349 #ifdef __riscos__
2350     opt.lock_once = 1;
2351 #endif /* __riscos__ */
2352
2353     /* Please note that we may running SUID(ROOT), so be very CAREFUL
2354        when adding any stuff between here and the call to
2355        secmem_init() somewhere after the option parsing. */
2356     early_system_init ();
2357     gnupg_reopen_std (GPG_NAME);
2358     trap_unaligned ();
2359     gnupg_rl_initialize ();
2360     set_strusage (my_strusage);
2361     gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
2362     log_set_prefix (GPG_NAME, GPGRT_LOG_WITH_PREFIX);
2363
2364     /* Make sure that our subsystems are ready.  */
2365     i18n_init();
2366     init_common_subsystems (&argc, &argv);
2367
2368     /* Use our own logging handler for Libcgrypt.  */
2369     setup_libgcrypt_logging ();
2370
2371     /* Put random number into secure memory */
2372     gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
2373
2374     may_coredump = disable_core_dumps();
2375
2376     gnupg_init_signals (0, emergency_cleanup);
2377
2378     dotlock_create (NULL, 0); /* Register lock file cleanup. */
2379
2380     /* Tell the compliance module who we are.  */
2381     gnupg_initialize_compliance (GNUPG_MODULE_NAME_GPG);
2382
2383     opt.autostart = 1;
2384     opt.session_env = session_env_new ();
2385     if (!opt.session_env)
2386       log_fatal ("error allocating session environment block: %s\n",
2387                  strerror (errno));
2388
2389     opt.command_fd = -1; /* no command fd */
2390     opt.compress_level = -1; /* defaults to standard compress level */
2391     opt.bz2_compress_level = -1; /* defaults to standard compress level */
2392     /* note: if you change these lines, look at oOpenPGP */
2393     opt.def_cipher_algo = 0;
2394     opt.def_aead_algo = 0;
2395     opt.def_digest_algo = 0;
2396     opt.cert_digest_algo = 0;
2397     opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
2398     opt.s2k_mode = 3; /* iterated+salted */
2399     opt.s2k_count = 0; /* Auto-calibrate when needed.  */
2400     opt.s2k_cipher_algo = DEFAULT_CIPHER_ALGO;
2401     opt.completes_needed = 1;
2402     opt.marginals_needed = 3;
2403     opt.max_cert_depth = 5;
2404     opt.escape_from = 1;
2405     opt.flags.require_cross_cert = 1;
2406     opt.import_options = IMPORT_REPAIR_KEYS;
2407     opt.export_options = EXPORT_ATTRIBUTES;
2408     opt.keyserver_options.import_options = (IMPORT_REPAIR_KEYS
2409                                             | IMPORT_REPAIR_PKS_SUBKEY_BUG);
2410     opt.keyserver_options.export_options = EXPORT_ATTRIBUTES;
2411     opt.keyserver_options.options = KEYSERVER_HONOR_PKA_RECORD;
2412     opt.verify_options = (LIST_SHOW_UID_VALIDITY
2413                           | VERIFY_SHOW_POLICY_URLS
2414                           | VERIFY_SHOW_STD_NOTATIONS
2415                           | VERIFY_SHOW_KEYSERVER_URLS);
2416     opt.list_options   = (LIST_SHOW_UID_VALIDITY
2417                           | LIST_SHOW_USAGE);
2418 #ifdef NO_TRUST_MODELS
2419     opt.trust_model = TM_ALWAYS;
2420 #else
2421     opt.trust_model = TM_AUTO;
2422 #endif
2423     opt.tofu_default_policy = TOFU_POLICY_AUTO;
2424     opt.mangle_dos_filenames = 0;
2425     opt.min_cert_level = 2;
2426     set_screen_dimensions ();
2427     opt.keyid_format = KF_NONE;
2428     opt.def_sig_expire = "0";
2429     opt.def_cert_expire = "0";
2430     gnupg_set_homedir (NULL);
2431     opt.passphrase_repeat = 1;
2432     opt.emit_version = 0;
2433     opt.weak_digests = NULL;
2434
2435     /* Check whether we have a config file on the command line.  */
2436     orig_argc = argc;
2437     orig_argv = argv;
2438     pargs.argc = &argc;
2439     pargs.argv = &argv;
2440     pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
2441     while( arg_parse( &pargs, opts) ) {
2442         if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
2443             parse_debug++;
2444         else if (pargs.r_opt == oDebugIOLBF)
2445             es_setvbuf (es_stdout, NULL, _IOLBF, 0);
2446         else if( pargs.r_opt == oOptions ) {
2447             /* yes there is one, so we do not try the default one, but
2448              * read the option file when it is encountered at the commandline
2449              */
2450             default_config = 0;
2451         }
2452         else if( pargs.r_opt == oNoOptions )
2453           {
2454             default_config = 0; /* --no-options */
2455             opt.no_homedir_creation = 1;
2456           }
2457         else if( pargs.r_opt == oHomedir )
2458             gnupg_set_homedir (pargs.r.ret_str);
2459         else if( pargs.r_opt == oNoPermissionWarn )
2460             opt.no_perm_warn=1;
2461         else if (pargs.r_opt == oStrict )
2462           {
2463             /* Not used */
2464           }
2465         else if (pargs.r_opt == oNoStrict )
2466           {
2467             /* Not used */
2468           }
2469     }
2470
2471 #ifdef HAVE_DOSISH_SYSTEM
2472     if ( strchr (gnupg_homedir (), '\\') ) {
2473       char *d, *buf = xmalloc (strlen (gnupg_homedir ())+1);
2474       const char *s;
2475       for (d=buf, s = gnupg_homedir (); *s; s++)
2476           {
2477             *d++ = *s == '\\'? '/': *s;
2478 #ifdef HAVE_W32_SYSTEM
2479             if (s[1] && IsDBCSLeadByte (*s))
2480               *d++ = *++s;
2481 #endif
2482           }
2483         *d = 0;
2484         gnupg_set_homedir (buf);
2485     }
2486 #endif
2487
2488     /* Initialize the secure memory. */
2489     if (!gcry_control (GCRYCTL_INIT_SECMEM, SECMEM_BUFFER_SIZE, 0))
2490       got_secmem = 1;
2491 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
2492     /* There should be no way to get to this spot while still carrying
2493        setuid privs.  Just in case, bomb out if we are. */
2494     if ( getuid () != geteuid () )
2495       BUG ();
2496 #endif
2497     maybe_setuid = 0;
2498
2499     /* Okay, we are now working under our real uid */
2500
2501     /* malloc hooks go here ... */
2502     malloc_hooks.malloc = gcry_malloc;
2503     malloc_hooks.realloc = gcry_realloc;
2504     malloc_hooks.free = gcry_free;
2505     assuan_set_malloc_hooks (&malloc_hooks);
2506     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
2507     setup_libassuan_logging (&opt.debug, NULL);
2508
2509     /* Set default options which require that malloc stuff is ready.  */
2510     additional_weak_digest ("MD5");
2511     parse_auto_key_locate ("local,wkd");
2512
2513     /* Try for a version specific config file first */
2514     default_configname = get_default_configname ();
2515     if (default_config)
2516       configname = xstrdup (default_configname);
2517
2518     argc = orig_argc;
2519     argv = orig_argv;
2520     pargs.argc = &argc;
2521     pargs.argv = &argv;
2522     pargs.flags= ARGPARSE_FLAG_KEEP;
2523
2524     /* By this point we have a homedir, and cannot change it. */
2525     check_permissions (gnupg_homedir (), 0);
2526
2527   next_pass:
2528     if( configname ) {
2529       if(check_permissions(configname,1))
2530         {
2531           /* If any options file is unsafe, then disable any external
2532              programs for keyserver calls or photo IDs.  Since the
2533              external program to call is set in the options file, a
2534              unsafe options file can lead to an arbitrary program
2535              being run. */
2536
2537           opt.exec_disable=1;
2538         }
2539
2540         configlineno = 0;
2541         configfp = fopen( configname, "r" );
2542         if (configfp && is_secured_file (fileno (configfp)))
2543           {
2544             fclose (configfp);
2545             configfp = NULL;
2546             gpg_err_set_errno (EPERM);
2547           }
2548         if( !configfp ) {
2549             if( default_config ) {
2550                 if( parse_debug )
2551                     log_info(_("Note: no default option file '%s'\n"),
2552                                                             configname );
2553             }
2554             else {
2555                 log_error(_("option file '%s': %s\n"),
2556                                     configname, strerror(errno) );
2557                 g10_exit(2);
2558             }
2559             xfree(configname); configname = NULL;
2560         }
2561         if( parse_debug && configname )
2562             log_info(_("reading options from '%s'\n"), configname );
2563         default_config = 0;
2564     }
2565
2566     while( optfile_parse( configfp, configname, &configlineno,
2567                                                 &pargs, opts) )
2568       {
2569         switch( pargs.r_opt )
2570           {
2571           case aListConfig:
2572           case aListGcryptConfig:
2573           case aGPGConfList:
2574           case aGPGConfTest:
2575             set_cmd (&cmd, pargs.r_opt);
2576             /* Do not register a keyring for these commands.  */
2577             default_keyring = -1;
2578             break;
2579
2580           case aCheckKeys:
2581           case aListPackets:
2582           case aImport:
2583           case aFastImport:
2584           case aSendKeys:
2585           case aRecvKeys:
2586           case aSearchKeys:
2587           case aRefreshKeys:
2588           case aFetchKeys:
2589           case aExport:
2590 #ifdef ENABLE_CARD_SUPPORT
2591           case aCardStatus:
2592           case aCardEdit:
2593           case aChangePIN:
2594 #endif /* ENABLE_CARD_SUPPORT*/
2595           case aListKeys:
2596           case aLocateKeys:
2597           case aListSigs:
2598           case aExportSecret:
2599           case aExportSecretSub:
2600           case aExportSshKey:
2601           case aSym:
2602           case aClearsign:
2603           case aGenRevoke:
2604           case aDesigRevoke:
2605           case aPrimegen:
2606           case aGenRandom:
2607           case aPrintMD:
2608           case aPrintMDs:
2609           case aListTrustDB:
2610           case aCheckTrustDB:
2611           case aUpdateTrustDB:
2612           case aFixTrustDB:
2613           case aListTrustPath:
2614           case aDeArmor:
2615           case aEnArmor:
2616           case aSign:
2617           case aQuickSignKey:
2618           case aQuickLSignKey:
2619           case aSignKey:
2620           case aLSignKey:
2621           case aStore:
2622           case aQuickKeygen:
2623           case aQuickAddUid:
2624           case aQuickAddKey:
2625           case aQuickRevUid:
2626           case aQuickSetExpire:
2627           case aQuickSetPrimaryUid:
2628           case aExportOwnerTrust:
2629           case aImportOwnerTrust:
2630           case aRebuildKeydbCaches:
2631             set_cmd (&cmd, pargs.r_opt);
2632             break;
2633
2634           case aKeygen:
2635           case aFullKeygen:
2636           case aEditKey:
2637           case aDeleteSecretKeys:
2638           case aDeleteSecretAndPublicKeys:
2639           case aDeleteKeys:
2640           case aPasswd:
2641             set_cmd (&cmd, pargs.r_opt);
2642             greeting=1;
2643             break;
2644
2645           case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
2646
2647           case aDecryptFiles: multifile=1; /* fall through */
2648           case aDecrypt: set_cmd( &cmd, aDecrypt); break;
2649
2650           case aEncrFiles: multifile=1; /* fall through */
2651           case aEncr: set_cmd( &cmd, aEncr); break;
2652
2653           case aVerifyFiles: multifile=1; /* fall through */
2654           case aVerify: set_cmd( &cmd, aVerify); break;
2655
2656           case aServer:
2657             set_cmd (&cmd, pargs.r_opt);
2658             opt.batch = 1;
2659             break;
2660
2661           case aTOFUPolicy:
2662             set_cmd (&cmd, pargs.r_opt);
2663             break;
2664
2665           case oArmor: opt.armor = 1; opt.no_armor=0; break;
2666           case oOutput: opt.outfile = pargs.r.ret_str; break;
2667
2668           case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
2669
2670           case oInputSizeHint:
2671             opt.input_size_hint = string_to_u64 (pargs.r.ret_str);
2672             break;
2673
2674           case oChunkSize:
2675             opt.chunk_size = pargs.r.ret_int;
2676             break;
2677
2678           case oQuiet: opt.quiet = 1; break;
2679           case oNoTTY: tty_no_terminal(1); break;
2680           case oDryRun: opt.dry_run = 1; break;
2681           case oInteractive: opt.interactive = 1; break;
2682           case oVerbose:
2683             opt.verbose++;
2684             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2685             opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
2686             opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
2687             break;
2688
2689           case oBatch:
2690             opt.batch = 1;
2691             nogreeting = 1;
2692             break;
2693
2694           case oUseAgent: /* Dummy. */
2695             break;
2696
2697           case oNoUseAgent:
2698             obsolete_option (configname, configlineno, "no-use-agent");
2699             break;
2700           case oGpgAgentInfo:
2701             obsolete_option (configname, configlineno, "gpg-agent-info");
2702             break;
2703           case oReaderPort:
2704             obsolete_scdaemon_option (configname, configlineno, "reader-port");
2705             break;
2706           case octapiDriver:
2707             obsolete_scdaemon_option (configname, configlineno, "ctapi-driver");
2708             break;
2709           case opcscDriver:
2710             obsolete_scdaemon_option (configname, configlineno, "pcsc-driver");
2711             break;
2712           case oDisableCCID:
2713             obsolete_scdaemon_option (configname, configlineno, "disable-ccid");
2714             break;
2715           case oHonorHttpProxy:
2716             obsolete_option (configname, configlineno, "honor-http-proxy");
2717             break;
2718
2719           case oAnswerYes: opt.answer_yes = 1; break;
2720           case oAnswerNo: opt.answer_no = 1; break;
2721           case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
2722           case oPrimaryKeyring:
2723             sl = append_to_strlist (&nrings, pargs.r.ret_str);
2724             sl->flags = KEYDB_RESOURCE_FLAG_PRIMARY;
2725             break;
2726           case oShowKeyring:
2727             deprecated_warning(configname,configlineno,"--show-keyring",
2728                                "--list-options ","show-keyring");
2729             opt.list_options|=LIST_SHOW_KEYRING;
2730             break;
2731
2732           case oDebug:
2733             if (parse_debug_flag (pargs.r.ret_str, &opt.debug, debug_flags))
2734               {
2735                 pargs.r_opt = ARGPARSE_INVALID_ARG;
2736                 pargs.err = ARGPARSE_PRINT_ERROR;
2737               }
2738             break;
2739
2740           case oDebugAll: opt.debug = ~0; break;
2741           case oDebugLevel: debug_level = pargs.r.ret_str; break;
2742
2743           case oDebugIOLBF: break; /* Already set in pre-parse step.  */
2744
2745           case oStatusFD:
2746             set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2747             break;
2748           case oStatusFile:
2749             set_status_fd ( open_info_file (pargs.r.ret_str, 1, 0) );
2750             break;
2751           case oAttributeFD:
2752             set_attrib_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2753             break;
2754           case oAttributeFile:
2755             set_attrib_fd ( open_info_file (pargs.r.ret_str, 1, 1) );
2756             break;
2757           case oLoggerFD:
2758             log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
2759             break;
2760           case oLoggerFile:
2761             logfile = pargs.r.ret_str;
2762             break;
2763
2764           case oWithFingerprint:
2765             opt.with_fingerprint = 1;
2766             opt.fingerprint++;
2767             break;
2768           case oWithSubkeyFingerprint:
2769             opt.with_subkey_fingerprint = 1;
2770             break;
2771           case oWithICAOSpelling:
2772             opt.with_icao_spelling = 1;
2773             break;
2774           case oFingerprint:
2775             opt.fingerprint++;
2776             fpr_maybe_cmd = 1;
2777             break;
2778
2779           case oWithKeygrip:
2780             opt.with_keygrip = 1;
2781             break;
2782
2783           case oWithKeyScreening:
2784             opt.with_key_screening = 1;
2785             break;
2786
2787           case oWithSecret:
2788             opt.with_secret = 1;
2789             break;
2790
2791           case oWithWKDHash:
2792             opt.with_wkd_hash = 1;
2793             break;
2794
2795           case oWithKeyOrigin:
2796             opt.with_key_origin = 1;
2797             break;
2798
2799           case oSecretKeyring:
2800             /* Ignore this old option.  */
2801             break;
2802
2803           case oOptions:
2804             /* config files may not be nested (silently ignore them) */
2805             if( !configfp ) {
2806                 xfree(configname);
2807                 configname = xstrdup(pargs.r.ret_str);
2808                 goto next_pass;
2809             }
2810             break;
2811           case oNoArmor: opt.no_armor=1; opt.armor=0; break;
2812
2813           case oNoDefKeyring:
2814             if (default_keyring > 0)
2815               default_keyring = 0;
2816             break;
2817           case oNoKeyring:
2818             default_keyring = -1;
2819             break;
2820
2821           case oNoGreeting: nogreeting = 1; break;
2822           case oNoVerbose:
2823             opt.verbose = 0;
2824             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2825             opt.list_sigs=0;
2826             break;
2827           case oQuickRandom:
2828             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
2829             break;
2830           case oEmitVersion: opt.emit_version++; break;
2831           case oNoEmitVersion: opt.emit_version=0; break;
2832           case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
2833           case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
2834           case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
2835
2836 #ifndef NO_TRUST_MODELS
2837           case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
2838
2839 #endif /*!NO_TRUST_MODELS*/
2840           case oDefaultKey:
2841             sl = add_to_strlist (&opt.def_secret_key, pargs.r.ret_str);
2842             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
2843             if (configfp)
2844               sl->flags |= PK_LIST_CONFIG;
2845             break;
2846           case oDefRecipient:
2847             if( *pargs.r.ret_str )
2848               {
2849                 xfree (opt.def_recipient);
2850                 opt.def_recipient = make_username(pargs.r.ret_str);
2851               }
2852             break;
2853           case oDefRecipientSelf:
2854             xfree(opt.def_recipient); opt.def_recipient = NULL;
2855             opt.def_recipient_self = 1;
2856             break;
2857           case oNoDefRecipient:
2858             xfree(opt.def_recipient); opt.def_recipient = NULL;
2859             opt.def_recipient_self = 0;
2860             break;
2861           case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
2862           case oHomedir: break;
2863           case oNoBatch: opt.batch = 0; break;
2864
2865           case oWithTofuInfo: opt.with_tofu_info = 1; break;
2866
2867           case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
2868           case oWithColons: opt.with_colons=':'; break;
2869
2870           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
2871           case oWithSigList: opt.list_sigs = 1; break;
2872
2873           case oSkipVerify: opt.skip_verify=1; break;
2874
2875           case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
2876           case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
2877
2878           case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
2879
2880 #ifndef NO_TRUST_MODELS
2881             /* There are many programs (like mutt) that call gpg with
2882                --always-trust so keep this option around for a long
2883                time. */
2884           case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
2885           case oTrustModel:
2886             parse_trust_model(pargs.r.ret_str);
2887             break;
2888 #endif /*!NO_TRUST_MODELS*/
2889           case oTOFUDefaultPolicy:
2890             opt.tofu_default_policy = parse_tofu_policy (pargs.r.ret_str);
2891             break;
2892           case oTOFUDBFormat:
2893             obsolete_option (configname, configlineno, "tofu-db-format");
2894             break;
2895
2896           case oForceOwnertrust:
2897             log_info(_("Note: %s is not for normal use!\n"),
2898                      "--force-ownertrust");
2899             opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
2900             if(opt.force_ownertrust==-1)
2901               {
2902                 log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
2903                 opt.force_ownertrust=0;
2904               }
2905             break;
2906           case oLoadExtension:
2907             /* Dummy so that gpg 1.4 conf files can work. Should
2908                eventually be removed.  */
2909             break;
2910
2911           case oCompliance:
2912             {
2913               int compliance = gnupg_parse_compliance_option
2914                 (pargs.r.ret_str,
2915                  compliance_options, DIM (compliance_options),
2916                  opt.quiet);
2917               if (compliance < 0)
2918                 g10_exit (1);
2919               set_compliance_option (compliance);
2920             }
2921             break;
2922           case oOpenPGP:
2923           case oRFC2440:
2924           case oRFC4880:
2925           case oRFC4880bis:
2926           case oPGP6:
2927           case oPGP7:
2928           case oPGP8:
2929           case oGnuPG:
2930             set_compliance_option (pargs.r_opt);
2931             break;
2932
2933           case oRFC2440Text: opt.rfc2440_text=1; break;
2934           case oNoRFC2440Text: opt.rfc2440_text=0; break;
2935
2936           case oSetFilename:
2937             if(utf8_strings)
2938               opt.set_filename = pargs.r.ret_str;
2939             else
2940               opt.set_filename = native_to_utf8(pargs.r.ret_str);
2941             break;
2942           case oForYourEyesOnly: eyes_only = 1; break;
2943           case oNoForYourEyesOnly: eyes_only = 0; break;
2944           case oSetPolicyURL:
2945             add_policy_url(pargs.r.ret_str,0);
2946             add_policy_url(pargs.r.ret_str,1);
2947             break;
2948           case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
2949           case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
2950           case oShowPolicyURL:
2951             deprecated_warning(configname,configlineno,"--show-policy-url",
2952                                "--list-options ","show-policy-urls");
2953             deprecated_warning(configname,configlineno,"--show-policy-url",
2954                                "--verify-options ","show-policy-urls");
2955             opt.list_options|=LIST_SHOW_POLICY_URLS;
2956             opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
2957             break;
2958           case oNoShowPolicyURL:
2959             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2960                                "--list-options ","no-show-policy-urls");
2961             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2962                                "--verify-options ","no-show-policy-urls");
2963             opt.list_options&=~LIST_SHOW_POLICY_URLS;
2964             opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
2965             break;
2966           case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
2967           case oUseEmbeddedFilename:
2968             opt.flags.use_embedded_filename=1;
2969             break;
2970           case oNoUseEmbeddedFilename:
2971             opt.flags.use_embedded_filename=0;
2972             break;
2973           case oComment:
2974             if(pargs.r.ret_str[0])
2975               append_to_strlist(&opt.comments,pargs.r.ret_str);
2976             break;
2977           case oDefaultComment:
2978             deprecated_warning(configname,configlineno,
2979                                "--default-comment","--no-comments","");
2980             /* fall through */
2981           case oNoComments:
2982             free_strlist(opt.comments);
2983             opt.comments=NULL;
2984             break;
2985           case oThrowKeyids: opt.throw_keyids = 1; break;
2986           case oNoThrowKeyids: opt.throw_keyids = 0; break;
2987           case oShowPhotos:
2988             deprecated_warning(configname,configlineno,"--show-photos",
2989                                "--list-options ","show-photos");
2990             deprecated_warning(configname,configlineno,"--show-photos",
2991                                "--verify-options ","show-photos");
2992             opt.list_options|=LIST_SHOW_PHOTOS;
2993             opt.verify_options|=VERIFY_SHOW_PHOTOS;
2994             break;
2995           case oNoShowPhotos:
2996             deprecated_warning(configname,configlineno,"--no-show-photos",
2997                                "--list-options ","no-show-photos");
2998             deprecated_warning(configname,configlineno,"--no-show-photos",
2999                                "--verify-options ","no-show-photos");
3000             opt.list_options&=~LIST_SHOW_PHOTOS;
3001             opt.verify_options&=~VERIFY_SHOW_PHOTOS;
3002             break;
3003           case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
3004
3005           case oForceMDC: opt.force_mdc = 1; break;
3006           case oNoForceMDC: opt.force_mdc = 0; break;
3007           case oDisableMDC: opt.disable_mdc = 1; break;
3008           case oNoDisableMDC: opt.disable_mdc = 0; break;
3009
3010           case oForceAEAD: opt.force_aead = 1; break;
3011
3012           case oDisableSignerUID: opt.flags.disable_signer_uid = 1; break;
3013
3014           case oS2KMode:   opt.s2k_mode = pargs.r.ret_int; break;
3015           case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
3016           case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
3017           case oS2KCount:
3018             if (pargs.r.ret_int)
3019               opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
3020             else
3021               opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
3022             break;
3023
3024           case oRecipient:
3025           case oHiddenRecipient:
3026           case oRecipientFile:
3027           case oHiddenRecipientFile:
3028             /* Store the recipient.  Note that we also store the
3029              * option as private data in the flags.  This is achieved
3030              * by shifting the option value to the left so to keep
3031              * enough space for the flags.  */
3032             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
3033             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
3034             if (configfp)
3035               sl->flags |= PK_LIST_CONFIG;
3036             if (pargs.r_opt == oHiddenRecipient
3037                 || pargs.r_opt == oHiddenRecipientFile)
3038               sl->flags |= PK_LIST_HIDDEN;
3039             if (pargs.r_opt == oRecipientFile
3040                 || pargs.r_opt == oHiddenRecipientFile)
3041               sl->flags |= PK_LIST_FROM_FILE;
3042             any_explicit_recipient = 1;
3043             break;
3044
3045           case oEncryptTo:
3046           case oHiddenEncryptTo:
3047             /* Store an additional recipient.  */
3048             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
3049             sl->flags = ((pargs.r_opt << PK_LIST_SHIFT) | PK_LIST_ENCRYPT_TO);
3050             if (configfp)
3051               sl->flags |= PK_LIST_CONFIG;
3052             if (pargs.r_opt == oHiddenEncryptTo)
3053               sl->flags |= PK_LIST_HIDDEN;
3054             break;
3055
3056           case oNoEncryptTo:
3057             opt.no_encrypt_to = 1;
3058             break;
3059           case oEncryptToDefaultKey:
3060             opt.encrypt_to_default_key = configfp ? 2 : 1;
3061             break;
3062
3063           case oTrySecretKey:
3064             add_to_strlist2 (&opt.secret_keys_to_try,
3065                              pargs.r.ret_str, utf8_strings);
3066             break;
3067
3068           case oMimemode: opt.mimemode = opt.textmode = 1; break;
3069           case oTextmodeShort: opt.textmode = 2; break;
3070           case oTextmode: opt.textmode=1;  break;
3071           case oNoTextmode: opt.textmode=opt.mimemode=0;  break;
3072
3073           case oExpert: opt.expert = 1; break;
3074           case oNoExpert: opt.expert = 0; break;
3075           case oDefSigExpire:
3076             if(*pargs.r.ret_str!='\0')
3077               {
3078                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3079                   log_error(_("'%s' is not a valid signature expiration\n"),
3080                             pargs.r.ret_str);
3081                 else
3082                   opt.def_sig_expire=pargs.r.ret_str;
3083               }
3084             break;
3085           case oAskSigExpire: opt.ask_sig_expire = 1; break;
3086           case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
3087           case oDefCertExpire:
3088             if(*pargs.r.ret_str!='\0')
3089               {
3090                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3091                   log_error(_("'%s' is not a valid signature expiration\n"),
3092                             pargs.r.ret_str);
3093                 else
3094                   opt.def_cert_expire=pargs.r.ret_str;
3095               }
3096             break;
3097           case oAskCertExpire: opt.ask_cert_expire = 1; break;
3098           case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
3099           case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
3100           case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
3101           case oAskCertLevel: opt.ask_cert_level = 1; break;
3102           case oNoAskCertLevel: opt.ask_cert_level = 0; break;
3103           case oLocalUser: /* store the local users */
3104             sl = add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
3105             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
3106             if (configfp)
3107               sl->flags |= PK_LIST_CONFIG;
3108             break;
3109           case oSender:
3110             {
3111               char *mbox = mailbox_from_userid (pargs.r.ret_str);
3112               if (!mbox)
3113                 log_error (_("\"%s\" is not a proper mail address\n"),
3114                            pargs.r.ret_str);
3115               else
3116                 {
3117                   add_to_strlist (&opt.sender_list, mbox);
3118                   xfree (mbox);
3119                 }
3120             }
3121             break;
3122           case oCompress:
3123             /* this is the -z command line option */
3124             opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
3125             break;
3126           case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
3127           case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
3128           case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
3129           case oPassphrase:
3130             set_passphrase_from_string(pargs.r.ret_str);
3131             break;
3132           case oPassphraseFD:
3133             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3134             break;
3135           case oPassphraseFile:
3136             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
3137             break;
3138           case oPassphraseRepeat:
3139             opt.passphrase_repeat = pargs.r.ret_int;
3140             break;
3141
3142           case oPinentryMode:
3143             opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
3144             if (opt.pinentry_mode == -1)
3145               log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
3146             break;
3147
3148           case oCommandFD:
3149             opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3150             if (! gnupg_fd_valid (opt.command_fd))
3151               log_fatal ("command-fd is invalid: %s\n", strerror (errno));
3152             break;
3153           case oCommandFile:
3154             opt.command_fd = open_info_file (pargs.r.ret_str, 0, 1);
3155             break;
3156           case oCipherAlgo:
3157             def_cipher_string = xstrdup(pargs.r.ret_str);
3158             break;
3159           case oAEADAlgo:
3160             def_aead_string = xstrdup (pargs.r.ret_str);
3161             break;
3162           case oDigestAlgo:
3163             def_digest_string = xstrdup(pargs.r.ret_str);
3164             break;
3165           case oCompressAlgo:
3166             /* If it is all digits, stick a Z in front of it for
3167                later.  This is for backwards compatibility with
3168                versions that took the compress algorithm number. */
3169             {
3170               char *pt=pargs.r.ret_str;
3171               while(*pt)
3172                 {
3173                   if (!isascii (*pt) || !isdigit (*pt))
3174                     break;
3175
3176                   pt++;
3177                 }
3178
3179               if(*pt=='\0')
3180                 {
3181                   compress_algo_string=xmalloc(strlen(pargs.r.ret_str)+2);
3182                   strcpy(compress_algo_string,"Z");
3183                   strcat(compress_algo_string,pargs.r.ret_str);
3184                 }
3185               else
3186                 compress_algo_string = xstrdup(pargs.r.ret_str);
3187             }
3188             break;
3189           case oCertDigestAlgo:
3190             cert_digest_string = xstrdup(pargs.r.ret_str);
3191             break;
3192
3193           case oNoSecmemWarn:
3194             gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
3195             break;
3196
3197           case oRequireSecmem: require_secmem=1; break;
3198           case oNoRequireSecmem: require_secmem=0; break;
3199           case oNoPermissionWarn: opt.no_perm_warn=1; break;
3200           case oNoMDCWarn: opt.no_mdc_warn=1; break;
3201           case oDisplayCharset:
3202             if( set_native_charset( pargs.r.ret_str ) )
3203                 log_error(_("'%s' is not a valid character set\n"),
3204                           pargs.r.ret_str);
3205             break;
3206           case oNotDashEscaped: opt.not_dash_escaped = 1; break;
3207           case oEscapeFrom: opt.escape_from = 1; break;
3208           case oNoEscapeFrom: opt.escape_from = 0; break;
3209           case oLockOnce: opt.lock_once = 1; break;
3210           case oLockNever:
3211             dotlock_disable ();
3212             break;
3213           case oLockMultiple:
3214 #ifndef __riscos__
3215             opt.lock_once = 0;
3216 #else /* __riscos__ */
3217             riscos_not_implemented("lock-multiple");
3218 #endif /* __riscos__ */
3219             break;
3220           case oKeyServer:
3221             {
3222               keyserver_spec_t keyserver;
3223               keyserver = parse_keyserver_uri (pargs.r.ret_str, 0);
3224               if (!keyserver)
3225                 log_error (_("could not parse keyserver URL\n"));
3226               else
3227                 {
3228                   /* We only support a single keyserver.  Later ones
3229                      override earlier ones.  (Since we parse the
3230                      config file first and then the command line
3231                      arguments, the command line takes
3232                      precedence.)  */
3233                   if (opt.keyserver)
3234                     free_keyserver_spec (opt.keyserver);
3235                   opt.keyserver = keyserver;
3236                 }
3237             }
3238             break;
3239           case oKeyServerOptions:
3240             if(!parse_keyserver_options(pargs.r.ret_str))
3241               {
3242                 if(configname)
3243                   log_error(_("%s:%d: invalid keyserver options\n"),
3244                             configname,configlineno);
3245                 else
3246                   log_error(_("invalid keyserver options\n"));
3247               }
3248             break;
3249           case oImportOptions:
3250             if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
3251               {
3252                 if(configname)
3253                   log_error(_("%s:%d: invalid import options\n"),
3254                             configname,configlineno);
3255                 else
3256                   log_error(_("invalid import options\n"));
3257               }
3258             break;
3259           case oImportFilter:
3260             rc = parse_and_set_import_filter (pargs.r.ret_str);
3261             if (rc)
3262               log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3263             break;
3264           case oExportOptions:
3265             if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
3266               {
3267                 if(configname)
3268                   log_error(_("%s:%d: invalid export options\n"),
3269                             configname,configlineno);
3270                 else
3271                   log_error(_("invalid export options\n"));
3272               }
3273             break;
3274           case oExportFilter:
3275             rc = parse_and_set_export_filter (pargs.r.ret_str);
3276             if (rc)
3277               log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3278             break;
3279           case oListOptions:
3280             if(!parse_list_options(pargs.r.ret_str))
3281               {
3282                 if(configname)
3283                   log_error(_("%s:%d: invalid list options\n"),
3284                             configname,configlineno);
3285                 else
3286                   log_error(_("invalid list options\n"));
3287               }
3288             break;
3289           case oVerifyOptions:
3290             {
3291               struct parse_options vopts[]=
3292                 {
3293                   {"show-photos",VERIFY_SHOW_PHOTOS,NULL,
3294                    N_("display photo IDs during signature verification")},
3295                   {"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL,
3296                    N_("show policy URLs during signature verification")},
3297                   {"show-notations",VERIFY_SHOW_NOTATIONS,NULL,
3298                    N_("show all notations during signature verification")},
3299                   {"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3300                    N_("show IETF standard notations during signature verification")},
3301                   {"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3302                    NULL},
3303                   {"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL,
3304                    N_("show user-supplied notations during signature verification")},
3305                   {"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL,
3306                    N_("show preferred keyserver URLs during signature verification")},
3307                   {"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL,
3308                    N_("show user ID validity during signature verification")},
3309                   {"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL,
3310                    N_("show revoked and expired user IDs in signature verification")},
3311                   {"show-primary-uid-only",VERIFY_SHOW_PRIMARY_UID_ONLY,NULL,
3312                    N_("show only the primary user ID in signature verification")},
3313                   {"pka-lookups",VERIFY_PKA_LOOKUPS,NULL,
3314                    N_("validate signatures with PKA data")},
3315                   {"pka-trust-increase",VERIFY_PKA_TRUST_INCREASE,NULL,
3316                    N_("elevate the trust of signatures with valid PKA data")},
3317                   {NULL,0,NULL,NULL}
3318                 };
3319
3320               if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
3321                 {
3322                   if(configname)
3323                     log_error(_("%s:%d: invalid verify options\n"),
3324                               configname,configlineno);
3325                   else
3326                     log_error(_("invalid verify options\n"));
3327                 }
3328             }
3329             break;
3330           case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
3331           case oExecPath:
3332             if(set_exec_path(pargs.r.ret_str))
3333               log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
3334             else
3335               opt.exec_path_set=1;
3336             break;
3337           case oSetNotation:
3338             add_notation_data( pargs.r.ret_str, 0 );
3339             add_notation_data( pargs.r.ret_str, 1 );
3340             break;
3341           case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
3342           case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
3343           case oShowNotation:
3344             deprecated_warning(configname,configlineno,"--show-notation",
3345                                "--list-options ","show-notations");
3346             deprecated_warning(configname,configlineno,"--show-notation",
3347                                "--verify-options ","show-notations");
3348             opt.list_options|=LIST_SHOW_NOTATIONS;
3349             opt.verify_options|=VERIFY_SHOW_NOTATIONS;
3350             break;
3351           case oNoShowNotation:
3352             deprecated_warning(configname,configlineno,"--no-show-notation",
3353                                "--list-options ","no-show-notations");
3354             deprecated_warning(configname,configlineno,"--no-show-notation",
3355                                "--verify-options ","no-show-notations");
3356             opt.list_options&=~LIST_SHOW_NOTATIONS;
3357             opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
3358             break;
3359           case oUtf8Strings: utf8_strings = 1; break;
3360           case oNoUtf8Strings: utf8_strings = 0; break;
3361           case oDisableCipherAlgo:
3362             {
3363               int algo = string_to_cipher_algo (pargs.r.ret_str);
3364               gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3365             }
3366             break;
3367           case oDisablePubkeyAlgo:
3368             {
3369               int algo = gcry_pk_map_name (pargs.r.ret_str);
3370               gcry_pk_ctl (GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3371             }
3372             break;
3373           case oNoSigCache: opt.no_sig_cache = 1; break;
3374           case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
3375           case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
3376           case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
3377           case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
3378           case oNoLiteral: opt.no_literal = 1; break;
3379           case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
3380           case oFastListMode: opt.fast_list_mode = 1; break;
3381           case oFixedListMode: /* Dummy */ break;
3382           case oLegacyListMode: opt.legacy_list_mode = 1; break;
3383           case oPrintPKARecords: print_pka_records = 1; break;
3384           case oPrintDANERecords: print_dane_records = 1; break;
3385           case oListOnly: opt.list_only=1; break;
3386           case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
3387           case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
3388           case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
3389           case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
3390           case oNoRandomSeedFile: use_random_seed = 0; break;
3391
3392           case oAutoKeyRetrieve:
3393             opt.keyserver_options.options |= KEYSERVER_AUTO_KEY_RETRIEVE;
3394             break;
3395           case oNoAutoKeyRetrieve:
3396             opt.keyserver_options.options &= ~KEYSERVER_AUTO_KEY_RETRIEVE;
3397             break;
3398
3399           case oShowSessionKey: opt.show_session_key = 1; break;
3400           case oOverrideSessionKey:
3401                 opt.override_session_key = pargs.r.ret_str;
3402                 break;
3403           case oOverrideSessionKeyFD:
3404                 ovrseskeyfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3405                 break;
3406           case oMergeOnly:
3407                 deprecated_warning(configname,configlineno,"--merge-only",
3408                                    "--import-options ","merge-only");
3409                 opt.import_options|=IMPORT_MERGE_ONLY;
3410             break;
3411           case oAllowSecretKeyImport: /* obsolete */ break;
3412           case oTryAllSecrets: opt.try_all_secrets = 1; break;
3413           case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
3414
3415           case oEnableSpecialFilenames:
3416             enable_special_filenames ();
3417             break;
3418
3419           case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
3420           case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
3421           case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
3422           case oPreservePermissions: opt.preserve_permissions=1; break;
3423           case oDefaultPreferenceList:
3424             opt.def_preference_list = pargs.r.ret_str;
3425             break;
3426           case oDefaultKeyserverURL:
3427             {
3428               keyserver_spec_t keyserver;
3429               keyserver = parse_keyserver_uri (pargs.r.ret_str,1 );
3430               if (!keyserver)
3431                 log_error (_("could not parse keyserver URL\n"));
3432               else
3433                 free_keyserver_spec (keyserver);
3434
3435               opt.def_keyserver_url = pargs.r.ret_str;
3436             }
3437             break;
3438           case oPersonalCipherPreferences:
3439             pers_cipher_list=pargs.r.ret_str;
3440             break;
3441           case oPersonalAEADPreferences:
3442             pers_aead_list = pargs.r.ret_str;
3443             break;
3444           case oPersonalDigestPreferences:
3445             pers_digest_list=pargs.r.ret_str;
3446             break;
3447           case oPersonalCompressPreferences:
3448             pers_compress_list=pargs.r.ret_str;
3449             break;
3450           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
3451           case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
3452           case oDisableDirmngr: opt.disable_dirmngr = 1;  break;
3453           case oWeakDigest:
3454             additional_weak_digest(pargs.r.ret_str);
3455             break;
3456           case oUnwrap:
3457             opt.unwrap_encryption = 1;
3458             break;
3459           case oOnlySignTextIDs:
3460             opt.only_sign_text_ids = 1;
3461             break;
3462
3463           case oDisplay:
3464             set_opt_session_env ("DISPLAY", pargs.r.ret_str);
3465             break;
3466           case oTTYname:
3467             set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
3468             break;
3469           case oTTYtype:
3470             set_opt_session_env ("TERM", pargs.r.ret_str);
3471             break;
3472           case oXauthority:
3473             set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
3474             break;
3475
3476           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
3477           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
3478
3479           case oGroup: add_group(pargs.r.ret_str); break;
3480           case oUnGroup: rm_group(pargs.r.ret_str); break;
3481           case oNoGroups:
3482             while(opt.grouplist)
3483               {
3484                 struct groupitem *iter=opt.grouplist;
3485                 free_strlist(iter->values);
3486                 opt.grouplist=opt.grouplist->next;
3487                 xfree(iter);
3488               }
3489             break;
3490
3491           case oStrict:
3492           case oNoStrict:
3493             /* Not used */
3494             break;
3495
3496           case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
3497           case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
3498           case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
3499           case oMultifile: multifile=1; break;
3500           case oKeyidFormat:
3501             if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
3502               opt.keyid_format=KF_SHORT;
3503             else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
3504               opt.keyid_format=KF_LONG;
3505             else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
3506               opt.keyid_format=KF_0xSHORT;
3507             else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
3508               opt.keyid_format=KF_0xLONG;
3509             else if(ascii_strcasecmp(pargs.r.ret_str,"none")==0)
3510               opt.keyid_format = KF_NONE;
3511             else
3512               log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
3513             break;
3514
3515           case oExitOnStatusWriteError:
3516             opt.exit_on_status_write_error = 1;
3517             break;
3518
3519           case oLimitCardInsertTries:
3520             opt.limit_card_insert_tries = pargs.r.ret_int;
3521             break;
3522
3523           case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
3524           case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
3525
3526           case oAutoKeyLocate:
3527             if (default_akl)
3528               {
3529                 /* This is the first time --aito-key-locate is seen.
3530                  * We need to reset the default akl.  */
3531                 default_akl = 0;
3532                 release_akl();
3533               }
3534             if(!parse_auto_key_locate(pargs.r.ret_str))
3535               {
3536                 if(configname)
3537                   log_error(_("%s:%d: invalid auto-key-locate list\n"),
3538                             configname,configlineno);
3539                 else
3540                   log_error(_("invalid auto-key-locate list\n"));
3541               }
3542             break;
3543           case oNoAutoKeyLocate:
3544             release_akl();
3545             break;
3546
3547           case oKeyOrigin:
3548             if(!parse_key_origin (pargs.r.ret_str))
3549               log_error (_("invalid argument for option \"%.50s\"\n"),
3550                          "--key-origin");
3551             break;
3552
3553           case oEnableLargeRSA:
3554 #if SECMEM_BUFFER_SIZE >= 65536
3555             opt.flags.large_rsa=1;
3556 #else
3557             if (configname)
3558               log_info("%s:%d: WARNING: gpg not built with large secure "
3559                          "memory buffer.  Ignoring enable-large-rsa\n",
3560                         configname,configlineno);
3561             else
3562               log_info("WARNING: gpg not built with large secure "
3563                          "memory buffer.  Ignoring --enable-large-rsa\n");
3564 #endif /* SECMEM_BUFFER_SIZE >= 65536 */
3565             break;
3566           case oDisableLargeRSA: opt.flags.large_rsa=0;
3567             break;
3568
3569           case oEnableDSA2: opt.flags.dsa2=1; break;
3570           case oDisableDSA2: opt.flags.dsa2=0; break;
3571
3572           case oAllowMultisigVerification:
3573           case oAllowMultipleMessages:
3574             opt.flags.allow_multiple_messages=1;
3575             break;
3576
3577           case oNoAllowMultipleMessages:
3578             opt.flags.allow_multiple_messages=0;
3579             break;
3580
3581           case oAllowWeakDigestAlgos:
3582             opt.flags.allow_weak_digest_algos = 1;
3583             break;
3584
3585           case oFakedSystemTime:
3586             {
3587               size_t len = strlen (pargs.r.ret_str);
3588               int freeze = 0;
3589               time_t faked_time;
3590
3591               if (len > 0 && pargs.r.ret_str[len-1] == '!')
3592                 {
3593                   freeze = 1;
3594                   pargs.r.ret_str[len-1] = '\0';
3595                 }
359