1 /* gpg.c - The GnuPG utility (main for gpg)
2 * Copyright (C) 1998-2011 Free Software Foundation, Inc.
3 * Copyright (C) 1997-2016 Werner Koch
4 * Copyright (C) 2015-2016 g10 Code GmbH
6 * This file is part of GnuPG.
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.
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.
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/>.
30 #include <sys/stat.h> /* for stat() */
33 #ifdef HAVE_W32_SYSTEM
34 # ifdef HAVE_WINSOCK2_H
35 # include <winsock2.h>
40 #define INCLUDED_BY_MAIN_MODULE 1
43 #include "../common/iobuf.h"
56 #include "keyserver-internal.h"
58 #include "gc-opt-flags.h"
60 #include "call-dirmngr.h"
62 #include "../common/init.h"
63 #include "../common/mbox-util.h"
64 #include "../common/shareddefs.h"
66 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
67 #define MY_O_BINARY O_BINARY
77 enum cmd_and_opt_values
86 oHiddenRecipientFile = 'F',
93 oHiddenRecipient = 'R',
100 aListSecretKeys = 'K',
135 aDeleteSecretAndPublicKeys,
192 oWithSubkeyFingerprint,
246 oBZ2DecompressLowmem,
271 oSkipHiddenRecipients,
272 oNoSkipHiddenRecipients,
285 oUseEmbeddedFilename,
286 oNoUseEmbeddedFilename,
323 oEncryptToDefaultKey,
330 oAllowNonSelfsignedUID,
331 oNoAllowNonSelfsignedUID,
334 oAllowSecretKeyImport,
335 oEnableSpecialFilenames,
347 oOverrideSessionKeyFD,
357 oNoExpensiveTrustChecks,
363 oPreservePermissions,
364 oDefaultPreferenceList,
365 oDefaultKeyserverURL,
366 oPersonalCipherPreferences,
367 oPersonalDigestPreferences,
368 oPersonalCompressPreferences,
383 oNoMangleDosFilenames,
384 oEnableProgressFilter,
387 oExitOnStatusWriteError,
388 oLimitCardInsertTries,
397 oAllowMultisigVerification,
402 oAllowMultipleMessages,
403 oNoAllowMultipleMessages,
404 oAllowWeakDigestAlgos,
422 static ARGPARSE_OPTS opts[] = {
424 ARGPARSE_group (300, N_("@Commands:\n ")),
426 ARGPARSE_c (aSign, "sign", N_("make a signature")),
427 ARGPARSE_c (aClearsign, "clear-sign", N_("make a clear text signature")),
428 ARGPARSE_c (aClearsign, "clearsign", "@"),
429 ARGPARSE_c (aDetachedSign, "detach-sign", N_("make a detached signature")),
430 ARGPARSE_c (aEncr, "encrypt", N_("encrypt data")),
431 ARGPARSE_c (aEncrFiles, "encrypt-files", "@"),
432 ARGPARSE_c (aSym, "symmetric", N_("encryption only with symmetric cipher")),
433 ARGPARSE_c (aStore, "store", "@"),
434 ARGPARSE_c (aDecrypt, "decrypt", N_("decrypt data (default)")),
435 ARGPARSE_c (aDecryptFiles, "decrypt-files", "@"),
436 ARGPARSE_c (aVerify, "verify" , N_("verify a signature")),
437 ARGPARSE_c (aVerifyFiles, "verify-files" , "@" ),
438 ARGPARSE_c (aListKeys, "list-keys", N_("list keys")),
439 ARGPARSE_c (aListKeys, "list-public-keys", "@" ),
440 ARGPARSE_c (aListSigs, "list-signatures", N_("list keys and signatures")),
441 ARGPARSE_c (aListSigs, "list-sigs", "@"),
442 ARGPARSE_c (aCheckKeys, "check-signatures",
443 N_("list and check key signatures")),
444 ARGPARSE_c (aCheckKeys, "check-sigs", "@"),
445 ARGPARSE_c (oFingerprint, "fingerprint", N_("list keys and fingerprints")),
446 ARGPARSE_c (aListSecretKeys, "list-secret-keys", N_("list secret keys")),
447 ARGPARSE_c (aKeygen, "generate-key",
448 N_("generate a new key pair")),
449 ARGPARSE_c (aKeygen, "gen-key", "@"),
450 ARGPARSE_c (aQuickKeygen, "quick-generate-key" ,
451 N_("quickly generate a new key pair")),
452 ARGPARSE_c (aQuickKeygen, "quick-gen-key", "@"),
453 ARGPARSE_c (aQuickAddUid, "quick-add-uid",
454 N_("quickly add a new user-id")),
455 ARGPARSE_c (aQuickAddUid, "quick-adduid", "@"),
456 ARGPARSE_c (aQuickAddKey, "quick-add-key", "@"),
457 ARGPARSE_c (aQuickAddKey, "quick-addkey", "@"),
458 ARGPARSE_c (aQuickRevUid, "quick-revoke-uid",
459 N_("quickly revoke a user-id")),
460 ARGPARSE_c (aQuickRevUid, "quick-revuid", "@"),
461 ARGPARSE_c (aQuickSetExpire, "quick-set-expire",
462 N_("quickly set a new expiration date")),
463 ARGPARSE_c (aFullKeygen, "full-generate-key" ,
464 N_("full featured key pair generation")),
465 ARGPARSE_c (aFullKeygen, "full-gen-key", "@"),
466 ARGPARSE_c (aGenRevoke, "generate-revocation",
467 N_("generate a revocation certificate")),
468 ARGPARSE_c (aGenRevoke, "gen-revoke", "@"),
469 ARGPARSE_c (aDeleteKeys,"delete-keys",
470 N_("remove keys from the public keyring")),
471 ARGPARSE_c (aDeleteSecretKeys, "delete-secret-keys",
472 N_("remove keys from the secret keyring")),
473 ARGPARSE_c (aQuickSignKey, "quick-sign-key" ,
474 N_("quickly sign a key")),
475 ARGPARSE_c (aQuickLSignKey, "quick-lsign-key",
476 N_("quickly sign a key locally")),
477 ARGPARSE_c (aSignKey, "sign-key" ,N_("sign a key")),
478 ARGPARSE_c (aLSignKey, "lsign-key" ,N_("sign a key locally")),
479 ARGPARSE_c (aEditKey, "edit-key" ,N_("sign or edit a key")),
480 ARGPARSE_c (aEditKey, "key-edit" ,"@"),
481 ARGPARSE_c (aPasswd, "change-passphrase", N_("change a passphrase")),
482 ARGPARSE_c (aPasswd, "passwd", "@"),
483 ARGPARSE_c (aDesigRevoke, "generate-designated-revocation", "@"),
484 ARGPARSE_c (aDesigRevoke, "desig-revoke","@" ),
485 ARGPARSE_c (aExport, "export" , N_("export keys") ),
486 ARGPARSE_c (aSendKeys, "send-keys" , N_("export keys to a keyserver") ),
487 ARGPARSE_c (aRecvKeys, "receive-keys" , N_("import keys from a keyserver") ),
488 ARGPARSE_c (aRecvKeys, "recv-keys" , "@"),
489 ARGPARSE_c (aSearchKeys, "search-keys" ,
490 N_("search for keys on a keyserver") ),
491 ARGPARSE_c (aRefreshKeys, "refresh-keys",
492 N_("update all keys from a keyserver")),
493 ARGPARSE_c (aLocateKeys, "locate-keys", "@"),
494 ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
495 ARGPARSE_c (aExportSecret, "export-secret-keys" , "@" ),
496 ARGPARSE_c (aExportSecretSub, "export-secret-subkeys" , "@" ),
497 ARGPARSE_c (aExportSshKey, "export-ssh-key", "@" ),
498 ARGPARSE_c (aImport, "import", N_("import/merge keys")),
499 ARGPARSE_c (aFastImport, "fast-import", "@"),
500 #ifdef ENABLE_CARD_SUPPORT
501 ARGPARSE_c (aCardStatus, "card-status", N_("print the card status")),
502 ARGPARSE_c (aCardEdit, "edit-card", N_("change data on a card")),
503 ARGPARSE_c (aCardEdit, "card-edit", "@"),
504 ARGPARSE_c (aChangePIN, "change-pin", N_("change a card's PIN")),
506 ARGPARSE_c (aListConfig, "list-config", "@"),
507 ARGPARSE_c (aListGcryptConfig, "list-gcrypt-config", "@"),
508 ARGPARSE_c (aGPGConfList, "gpgconf-list", "@" ),
509 ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@" ),
510 ARGPARSE_c (aListPackets, "list-packets","@"),
512 #ifndef NO_TRUST_MODELS
513 ARGPARSE_c (aExportOwnerTrust, "export-ownertrust", "@"),
514 ARGPARSE_c (aImportOwnerTrust, "import-ownertrust", "@"),
515 ARGPARSE_c (aUpdateTrustDB,"update-trustdb",
516 N_("update the trust database")),
517 ARGPARSE_c (aCheckTrustDB, "check-trustdb", "@"),
518 ARGPARSE_c (aFixTrustDB, "fix-trustdb", "@"),
521 ARGPARSE_c (aDeArmor, "dearmor", "@"),
522 ARGPARSE_c (aDeArmor, "dearmour", "@"),
523 ARGPARSE_c (aEnArmor, "enarmor", "@"),
524 ARGPARSE_c (aEnArmor, "enarmour", "@"),
525 ARGPARSE_c (aPrintMD, "print-md", N_("print message digests")),
526 ARGPARSE_c (aPrimegen, "gen-prime", "@" ),
527 ARGPARSE_c (aGenRandom,"gen-random", "@" ),
528 ARGPARSE_c (aServer, "server", N_("run in server mode")),
529 ARGPARSE_c (aTOFUPolicy, "tofu-policy",
530 N_("|VALUE|set the TOFU policy for a key")),
532 ARGPARSE_group (301, N_("@\nOptions:\n ")),
534 ARGPARSE_s_n (oArmor, "armor", N_("create ascii armored output")),
535 ARGPARSE_s_n (oArmor, "armour", "@"),
537 ARGPARSE_s_s (oRecipient, "recipient", N_("|USER-ID|encrypt for USER-ID")),
538 ARGPARSE_s_s (oHiddenRecipient, "hidden-recipient", "@"),
539 ARGPARSE_s_s (oRecipientFile, "recipient-file", "@"),
540 ARGPARSE_s_s (oHiddenRecipientFile, "hidden-recipient-file", "@"),
541 ARGPARSE_s_s (oRecipient, "remote-user", "@"), /* (old option name) */
542 ARGPARSE_s_s (oDefRecipient, "default-recipient", "@"),
543 ARGPARSE_s_n (oDefRecipientSelf, "default-recipient-self", "@"),
544 ARGPARSE_s_n (oNoDefRecipient, "no-default-recipient", "@"),
546 ARGPARSE_s_s (oTempDir, "temp-directory", "@"),
547 ARGPARSE_s_s (oExecPath, "exec-path", "@"),
548 ARGPARSE_s_s (oEncryptTo, "encrypt-to", "@"),
549 ARGPARSE_s_n (oNoEncryptTo, "no-encrypt-to", "@"),
550 ARGPARSE_s_s (oHiddenEncryptTo, "hidden-encrypt-to", "@"),
551 ARGPARSE_s_n (oEncryptToDefaultKey, "encrypt-to-default-key", "@"),
552 ARGPARSE_s_s (oLocalUser, "local-user",
553 N_("|USER-ID|use USER-ID to sign or decrypt")),
554 ARGPARSE_s_s (oSender, "sender", "@"),
556 ARGPARSE_s_s (oTrySecretKey, "try-secret-key", "@"),
558 ARGPARSE_s_i (oCompress, NULL,
559 N_("|N|set compress level to N (0 disables)")),
560 ARGPARSE_s_i (oCompressLevel, "compress-level", "@"),
561 ARGPARSE_s_i (oBZ2CompressLevel, "bzip2-compress-level", "@"),
562 ARGPARSE_s_n (oBZ2DecompressLowmem, "bzip2-decompress-lowmem", "@"),
564 ARGPARSE_s_n (oMimemode, "mimemode", "@"),
565 ARGPARSE_s_n (oTextmodeShort, NULL, "@"),
566 ARGPARSE_s_n (oTextmode, "textmode", N_("use canonical text mode")),
567 ARGPARSE_s_n (oNoTextmode, "no-textmode", "@"),
569 ARGPARSE_s_n (oExpert, "expert", "@"),
570 ARGPARSE_s_n (oNoExpert, "no-expert", "@"),
572 ARGPARSE_s_s (oDefSigExpire, "default-sig-expire", "@"),
573 ARGPARSE_s_n (oAskSigExpire, "ask-sig-expire", "@"),
574 ARGPARSE_s_n (oNoAskSigExpire, "no-ask-sig-expire", "@"),
575 ARGPARSE_s_s (oDefCertExpire, "default-cert-expire", "@"),
576 ARGPARSE_s_n (oAskCertExpire, "ask-cert-expire", "@"),
577 ARGPARSE_s_n (oNoAskCertExpire, "no-ask-cert-expire", "@"),
578 ARGPARSE_s_i (oDefCertLevel, "default-cert-level", "@"),
579 ARGPARSE_s_i (oMinCertLevel, "min-cert-level", "@"),
580 ARGPARSE_s_n (oAskCertLevel, "ask-cert-level", "@"),
581 ARGPARSE_s_n (oNoAskCertLevel, "no-ask-cert-level", "@"),
583 ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
584 ARGPARSE_p_u (oMaxOutput, "max-output", "@"),
585 ARGPARSE_s_s (oInputSizeHint, "input-size-hint", "@"),
587 ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
588 ARGPARSE_s_n (oQuiet, "quiet", "@"),
589 ARGPARSE_s_n (oNoTTY, "no-tty", "@"),
591 ARGPARSE_s_n (oForceMDC, "force-mdc", "@"),
592 ARGPARSE_s_n (oNoForceMDC, "no-force-mdc", "@"),
593 ARGPARSE_s_n (oDisableMDC, "disable-mdc", "@"),
594 ARGPARSE_s_n (oNoDisableMDC, "no-disable-mdc", "@"),
596 ARGPARSE_s_n (oDisableSignerUID, "disable-signer-uid", "@"),
598 ARGPARSE_s_n (oDryRun, "dry-run", N_("do not make any changes")),
599 ARGPARSE_s_n (oInteractive, "interactive", N_("prompt before overwriting")),
601 ARGPARSE_s_n (oBatch, "batch", "@"),
602 ARGPARSE_s_n (oAnswerYes, "yes", "@"),
603 ARGPARSE_s_n (oAnswerNo, "no", "@"),
604 ARGPARSE_s_s (oKeyring, "keyring", "@"),
605 ARGPARSE_s_s (oPrimaryKeyring, "primary-keyring", "@"),
606 ARGPARSE_s_s (oSecretKeyring, "secret-keyring", "@"),
607 ARGPARSE_s_n (oShowKeyring, "show-keyring", "@"),
608 ARGPARSE_s_s (oDefaultKey, "default-key", "@"),
610 ARGPARSE_s_s (oKeyServer, "keyserver", "@"),
611 ARGPARSE_s_s (oKeyServerOptions, "keyserver-options", "@"),
612 ARGPARSE_s_s (oImportOptions, "import-options", "@"),
613 ARGPARSE_s_s (oImportFilter, "import-filter", "@"),
614 ARGPARSE_s_s (oExportOptions, "export-options", "@"),
615 ARGPARSE_s_s (oExportFilter, "export-filter", "@"),
616 ARGPARSE_s_s (oListOptions, "list-options", "@"),
617 ARGPARSE_s_s (oVerifyOptions, "verify-options", "@"),
619 ARGPARSE_s_s (oDisplayCharset, "display-charset", "@"),
620 ARGPARSE_s_s (oDisplayCharset, "charset", "@"),
621 ARGPARSE_s_s (oOptions, "options", "@"),
623 ARGPARSE_s_s (oDebug, "debug", "@"),
624 ARGPARSE_s_s (oDebugLevel, "debug-level", "@"),
625 ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
626 ARGPARSE_s_n (oDebugIOLBF, "debug-iolbf", "@"),
627 ARGPARSE_s_i (oStatusFD, "status-fd", "@"),
628 ARGPARSE_s_s (oStatusFile, "status-file", "@"),
629 ARGPARSE_s_i (oAttributeFD, "attribute-fd", "@"),
630 ARGPARSE_s_s (oAttributeFile, "attribute-file", "@"),
632 ARGPARSE_s_i (oCompletesNeeded, "completes-needed", "@"),
633 ARGPARSE_s_i (oMarginalsNeeded, "marginals-needed", "@"),
634 ARGPARSE_s_i (oMaxCertDepth, "max-cert-depth", "@" ),
635 ARGPARSE_s_s (oTrustedKey, "trusted-key", "@"),
637 ARGPARSE_s_s (oLoadExtension, "load-extension", "@"), /* Dummy. */
639 ARGPARSE_s_s (oCompliance, "compliance", "@"),
640 ARGPARSE_s_n (oGnuPG, "gnupg", "@"),
641 ARGPARSE_s_n (oGnuPG, "no-pgp2", "@"),
642 ARGPARSE_s_n (oGnuPG, "no-pgp6", "@"),
643 ARGPARSE_s_n (oGnuPG, "no-pgp7", "@"),
644 ARGPARSE_s_n (oGnuPG, "no-pgp8", "@"),
645 ARGPARSE_s_n (oRFC2440, "rfc2440", "@"),
646 ARGPARSE_s_n (oRFC4880, "rfc4880", "@"),
647 ARGPARSE_s_n (oRFC4880bis, "rfc4880bis", "@"),
648 ARGPARSE_s_n (oOpenPGP, "openpgp", N_("use strict OpenPGP behavior")),
649 ARGPARSE_s_n (oPGP6, "pgp6", "@"),
650 ARGPARSE_s_n (oPGP7, "pgp7", "@"),
651 ARGPARSE_s_n (oPGP8, "pgp8", "@"),
653 ARGPARSE_s_n (oRFC2440Text, "rfc2440-text", "@"),
654 ARGPARSE_s_n (oNoRFC2440Text, "no-rfc2440-text", "@"),
655 ARGPARSE_s_i (oS2KMode, "s2k-mode", "@"),
656 ARGPARSE_s_s (oS2KDigest, "s2k-digest-algo", "@"),
657 ARGPARSE_s_s (oS2KCipher, "s2k-cipher-algo", "@"),
658 ARGPARSE_s_i (oS2KCount, "s2k-count", "@"),
659 ARGPARSE_s_s (oCipherAlgo, "cipher-algo", "@"),
660 ARGPARSE_s_s (oDigestAlgo, "digest-algo", "@"),
661 ARGPARSE_s_s (oCertDigestAlgo, "cert-digest-algo", "@"),
662 ARGPARSE_s_s (oCompressAlgo,"compress-algo", "@"),
663 ARGPARSE_s_s (oCompressAlgo, "compression-algo", "@"), /* Alias */
664 ARGPARSE_s_n (oThrowKeyids, "throw-keyids", "@"),
665 ARGPARSE_s_n (oNoThrowKeyids, "no-throw-keyids", "@"),
666 ARGPARSE_s_n (oShowPhotos, "show-photos", "@"),
667 ARGPARSE_s_n (oNoShowPhotos, "no-show-photos", "@"),
668 ARGPARSE_s_s (oPhotoViewer, "photo-viewer", "@"),
669 ARGPARSE_s_s (oSetNotation, "set-notation", "@"),
670 ARGPARSE_s_s (oSigNotation, "sig-notation", "@"),
671 ARGPARSE_s_s (oCertNotation, "cert-notation", "@"),
673 ARGPARSE_group (302, N_(
674 "@\n(See the man page for a complete listing of all commands and options)\n"
677 ARGPARSE_group (303, N_("@\nExamples:\n\n"
678 " -se -r Bob [file] sign and encrypt for user Bob\n"
679 " --clear-sign [file] make a clear text signature\n"
680 " --detach-sign [file] make a detached signature\n"
681 " --list-keys [names] show keys\n"
682 " --fingerprint [names] show fingerprints\n")),
684 /* More hidden commands and options. */
685 ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
686 #ifndef NO_TRUST_MODELS
687 ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
691 ARGPARSE_c (aListTrustPath, "list-trust-path", "@"), */
692 ARGPARSE_c (aDeleteSecretAndPublicKeys,
693 "delete-secret-and-public-keys", "@"),
694 ARGPARSE_c (aRebuildKeydbCaches, "rebuild-keydb-caches", "@"),
696 ARGPARSE_s_s (oPassphrase, "passphrase", "@"),
697 ARGPARSE_s_i (oPassphraseFD, "passphrase-fd", "@"),
698 ARGPARSE_s_s (oPassphraseFile, "passphrase-file", "@"),
699 ARGPARSE_s_i (oPassphraseRepeat,"passphrase-repeat", "@"),
700 ARGPARSE_s_s (oPinentryMode, "pinentry-mode", "@"),
701 ARGPARSE_s_i (oCommandFD, "command-fd", "@"),
702 ARGPARSE_s_s (oCommandFile, "command-file", "@"),
703 ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
704 ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
706 #ifndef NO_TRUST_MODELS
707 ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
708 ARGPARSE_s_n (oAutoCheckTrustDB, "auto-check-trustdb", "@"),
709 ARGPARSE_s_n (oNoAutoCheckTrustDB, "no-auto-check-trustdb", "@"),
710 ARGPARSE_s_s (oForceOwnertrust, "force-ownertrust", "@"),
713 ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
714 ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
715 ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
716 ARGPARSE_s_n (oNoPermissionWarn, "no-permission-warning", "@"),
717 ARGPARSE_s_n (oNoMDCWarn, "no-mdc-warning", "@"),
718 ARGPARSE_s_n (oNoArmor, "no-armor", "@"),
719 ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
720 ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
721 ARGPARSE_s_n (oNoKeyring, "no-keyring", "@"),
722 ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
723 ARGPARSE_s_n (oNoOptions, "no-options", "@"),
724 ARGPARSE_s_s (oHomedir, "homedir", "@"),
725 ARGPARSE_s_n (oNoBatch, "no-batch", "@"),
726 ARGPARSE_s_n (oWithColons, "with-colons", "@"),
727 ARGPARSE_s_n (oWithTofuInfo,"with-tofu-info", "@"),
728 ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
729 ARGPARSE_s_n (oWithSigList,"with-sig-list", "@"),
730 ARGPARSE_s_n (oWithSigCheck,"with-sig-check", "@"),
731 ARGPARSE_c (aListKeys, "list-key", "@"), /* alias */
732 ARGPARSE_c (aListSigs, "list-sig", "@"), /* alias */
733 ARGPARSE_c (aCheckKeys, "check-sig", "@"), /* alias */
734 ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
735 ARGPARSE_s_n (oSkipHiddenRecipients, "skip-hidden-recipients", "@"),
736 ARGPARSE_s_n (oNoSkipHiddenRecipients, "no-skip-hidden-recipients", "@"),
737 ARGPARSE_s_i (oDefCertLevel, "default-cert-check-level", "@"), /* old */
738 #ifndef NO_TRUST_MODELS
739 ARGPARSE_s_n (oAlwaysTrust, "always-trust", "@"),
741 ARGPARSE_s_s (oTrustModel, "trust-model", "@"),
742 ARGPARSE_s_s (oTOFUDefaultPolicy, "tofu-default-policy", "@"),
743 ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
744 ARGPARSE_s_n (oForYourEyesOnly, "for-your-eyes-only", "@"),
745 ARGPARSE_s_n (oNoForYourEyesOnly, "no-for-your-eyes-only", "@"),
746 ARGPARSE_s_s (oSetPolicyURL, "set-policy-url", "@"),
747 ARGPARSE_s_s (oSigPolicyURL, "sig-policy-url", "@"),
748 ARGPARSE_s_s (oCertPolicyURL, "cert-policy-url", "@"),
749 ARGPARSE_s_n (oShowPolicyURL, "show-policy-url", "@"),
750 ARGPARSE_s_n (oNoShowPolicyURL, "no-show-policy-url", "@"),
751 ARGPARSE_s_s (oSigKeyserverURL, "sig-keyserver-url", "@"),
752 ARGPARSE_s_n (oShowNotation, "show-notation", "@"),
753 ARGPARSE_s_n (oNoShowNotation, "no-show-notation", "@"),
754 ARGPARSE_s_s (oComment, "comment", "@"),
755 ARGPARSE_s_n (oDefaultComment, "default-comment", "@"),
756 ARGPARSE_s_n (oNoComments, "no-comments", "@"),
757 ARGPARSE_s_n (oEmitVersion, "emit-version", "@"),
758 ARGPARSE_s_n (oNoEmitVersion, "no-emit-version", "@"),
759 ARGPARSE_s_n (oNoEmitVersion, "no-version", "@"), /* alias */
760 ARGPARSE_s_n (oNotDashEscaped, "not-dash-escaped", "@"),
761 ARGPARSE_s_n (oEscapeFrom, "escape-from-lines", "@"),
762 ARGPARSE_s_n (oNoEscapeFrom, "no-escape-from-lines", "@"),
763 ARGPARSE_s_n (oLockOnce, "lock-once", "@"),
764 ARGPARSE_s_n (oLockMultiple, "lock-multiple", "@"),
765 ARGPARSE_s_n (oLockNever, "lock-never", "@"),
766 ARGPARSE_s_i (oLoggerFD, "logger-fd", "@"),
767 ARGPARSE_s_s (oLoggerFile, "log-file", "@"),
768 ARGPARSE_s_s (oLoggerFile, "logger-file", "@"), /* 1.4 compatibility. */
769 ARGPARSE_s_n (oUseEmbeddedFilename, "use-embedded-filename", "@"),
770 ARGPARSE_s_n (oNoUseEmbeddedFilename, "no-use-embedded-filename", "@"),
771 ARGPARSE_s_n (oUtf8Strings, "utf8-strings", "@"),
772 ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
773 ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
774 ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprint", "@"),
775 ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprints", "@"),
776 ARGPARSE_s_n (oWithICAOSpelling, "with-icao-spelling", "@"),
777 ARGPARSE_s_n (oWithKeygrip, "with-keygrip", "@"),
778 ARGPARSE_s_n (oWithSecret, "with-secret", "@"),
779 ARGPARSE_s_n (oWithWKDHash, "with-wkd-hash", "@"),
780 ARGPARSE_s_s (oDisableCipherAlgo, "disable-cipher-algo", "@"),
781 ARGPARSE_s_s (oDisablePubkeyAlgo, "disable-pubkey-algo", "@"),
782 ARGPARSE_s_n (oAllowNonSelfsignedUID, "allow-non-selfsigned-uid", "@"),
783 ARGPARSE_s_n (oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", "@"),
784 ARGPARSE_s_n (oAllowFreeformUID, "allow-freeform-uid", "@"),
785 ARGPARSE_s_n (oNoAllowFreeformUID, "no-allow-freeform-uid", "@"),
786 ARGPARSE_s_n (oNoLiteral, "no-literal", "@"),
787 ARGPARSE_p_u (oSetFilesize, "set-filesize", "@"),
788 ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
789 ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
790 ARGPARSE_s_n (oLegacyListMode, "legacy-list-mode", "@"),
791 ARGPARSE_s_n (oListOnly, "list-only", "@"),
792 ARGPARSE_s_n (oPrintPKARecords, "print-pka-records", "@"),
793 ARGPARSE_s_n (oPrintDANERecords, "print-dane-records", "@"),
794 ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
795 ARGPARSE_s_n (oIgnoreValidFrom, "ignore-valid-from", "@"),
796 ARGPARSE_s_n (oIgnoreCrcError, "ignore-crc-error", "@"),
797 ARGPARSE_s_n (oIgnoreMDCError, "ignore-mdc-error", "@"),
798 ARGPARSE_s_n (oShowSessionKey, "show-session-key", "@"),
799 ARGPARSE_s_s (oOverrideSessionKey, "override-session-key", "@"),
800 ARGPARSE_s_i (oOverrideSessionKeyFD, "override-session-key-fd", "@"),
801 ARGPARSE_s_n (oNoRandomSeedFile, "no-random-seed-file", "@"),
802 ARGPARSE_s_n (oAutoKeyRetrieve, "auto-key-retrieve", "@"),
803 ARGPARSE_s_n (oNoAutoKeyRetrieve, "no-auto-key-retrieve", "@"),
804 ARGPARSE_s_n (oNoSigCache, "no-sig-cache", "@"),
805 ARGPARSE_s_n (oMergeOnly, "merge-only", "@" ),
806 ARGPARSE_s_n (oAllowSecretKeyImport, "allow-secret-key-import", "@"),
807 ARGPARSE_s_n (oTryAllSecrets, "try-all-secrets", "@"),
808 ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
809 ARGPARSE_s_n (oNoExpensiveTrustChecks, "no-expensive-trust-checks", "@"),
810 ARGPARSE_s_n (oPreservePermissions, "preserve-permissions", "@"),
811 ARGPARSE_s_s (oDefaultPreferenceList, "default-preference-list", "@"),
812 ARGPARSE_s_s (oDefaultKeyserverURL, "default-keyserver-url", "@"),
813 ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-preferences","@"),
814 ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
815 ARGPARSE_s_s (oPersonalCompressPreferences,
816 "personal-compress-preferences", "@"),
817 ARGPARSE_s_s (oFakedSystemTime, "faked-system-time", "@"),
818 ARGPARSE_s_s (oWeakDigest, "weak-digest","@"),
819 ARGPARSE_s_n (oUnwrap, "unwrap", "@"),
820 ARGPARSE_s_n (oOnlySignTextIDs, "only-sign-text-ids", "@"),
822 /* Aliases. I constantly mistype these, and assume other people do
824 ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-prefs", "@"),
825 ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-prefs", "@"),
826 ARGPARSE_s_s (oPersonalCompressPreferences, "personal-compress-prefs", "@"),
828 ARGPARSE_s_s (oAgentProgram, "agent-program", "@"),
829 ARGPARSE_s_s (oDirmngrProgram, "dirmngr-program", "@"),
830 ARGPARSE_s_s (oDisplay, "display", "@"),
831 ARGPARSE_s_s (oTTYname, "ttyname", "@"),
832 ARGPARSE_s_s (oTTYtype, "ttytype", "@"),
833 ARGPARSE_s_s (oLCctype, "lc-ctype", "@"),
834 ARGPARSE_s_s (oLCmessages, "lc-messages","@"),
835 ARGPARSE_s_s (oXauthority, "xauthority", "@"),
836 ARGPARSE_s_s (oGroup, "group", "@"),
837 ARGPARSE_s_s (oUnGroup, "ungroup", "@"),
838 ARGPARSE_s_n (oNoGroups, "no-groups", "@"),
839 ARGPARSE_s_n (oStrict, "strict", "@"),
840 ARGPARSE_s_n (oNoStrict, "no-strict", "@"),
841 ARGPARSE_s_n (oMangleDosFilenames, "mangle-dos-filenames", "@"),
842 ARGPARSE_s_n (oNoMangleDosFilenames, "no-mangle-dos-filenames", "@"),
843 ARGPARSE_s_n (oEnableProgressFilter, "enable-progress-filter", "@"),
844 ARGPARSE_s_n (oMultifile, "multifile", "@"),
845 ARGPARSE_s_s (oKeyidFormat, "keyid-format", "@"),
846 ARGPARSE_s_n (oExitOnStatusWriteError, "exit-on-status-write-error", "@"),
847 ARGPARSE_s_i (oLimitCardInsertTries, "limit-card-insert-tries", "@"),
849 ARGPARSE_s_n (oAllowMultisigVerification,
850 "allow-multisig-verification", "@"),
851 ARGPARSE_s_n (oEnableLargeRSA, "enable-large-rsa", "@"),
852 ARGPARSE_s_n (oDisableLargeRSA, "disable-large-rsa", "@"),
853 ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
854 ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
855 ARGPARSE_s_n (oAllowMultipleMessages, "allow-multiple-messages", "@"),
856 ARGPARSE_s_n (oNoAllowMultipleMessages, "no-allow-multiple-messages", "@"),
857 ARGPARSE_s_n (oAllowWeakDigestAlgos, "allow-weak-digest-algos", "@"),
859 ARGPARSE_s_s (oDefaultNewKeyAlgo, "default-new-key-algo", "@"),
861 /* These two are aliases to help users of the PGP command line
862 product use gpg with minimal pain. Many commands are common
863 already as they seem to have borrowed commands from us. Now I'm
864 returning the favor. */
865 ARGPARSE_s_s (oLocalUser, "sign-with", "@"),
866 ARGPARSE_s_s (oRecipient, "user", "@"),
868 ARGPARSE_s_n (oRequireCrossCert, "require-backsigs", "@"),
869 ARGPARSE_s_n (oRequireCrossCert, "require-cross-certification", "@"),
870 ARGPARSE_s_n (oNoRequireCrossCert, "no-require-backsigs", "@"),
871 ARGPARSE_s_n (oNoRequireCrossCert, "no-require-cross-certification", "@"),
873 /* New options. Fixme: Should go more to the top. */
874 ARGPARSE_s_s (oAutoKeyLocate, "auto-key-locate", "@"),
875 ARGPARSE_s_n (oNoAutoKeyLocate, "no-auto-key-locate", "@"),
876 ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
878 /* Dummy options with warnings. */
879 ARGPARSE_s_n (oUseAgent, "use-agent", "@"),
880 ARGPARSE_s_n (oNoUseAgent, "no-use-agent", "@"),
881 ARGPARSE_s_s (oGpgAgentInfo, "gpg-agent-info", "@"),
882 ARGPARSE_s_s (oReaderPort, "reader-port", "@"),
883 ARGPARSE_s_s (octapiDriver, "ctapi-driver", "@"),
884 ARGPARSE_s_s (opcscDriver, "pcsc-driver", "@"),
885 ARGPARSE_s_n (oDisableCCID, "disable-ccid", "@"),
886 ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
887 ARGPARSE_s_s (oTOFUDBFormat, "tofu-db-format", "@"),
890 ARGPARSE_s_n (oNoop, "sk-comments", "@"),
891 ARGPARSE_s_n (oNoop, "no-sk-comments", "@"),
892 ARGPARSE_s_n (oNoop, "compress-keys", "@"),
893 ARGPARSE_s_n (oNoop, "compress-sigs", "@"),
894 ARGPARSE_s_n (oNoop, "force-v3-sigs", "@"),
895 ARGPARSE_s_n (oNoop, "no-force-v3-sigs", "@"),
896 ARGPARSE_s_n (oNoop, "force-v4-certs", "@"),
897 ARGPARSE_s_n (oNoop, "no-force-v4-certs", "@"),
903 /* The list of supported debug flags. */
904 static struct debug_flags_s debug_flags [] =
906 { DBG_PACKET_VALUE , "packet" },
907 { DBG_MPI_VALUE , "mpi" },
908 { DBG_CRYPTO_VALUE , "crypto" },
909 { DBG_FILTER_VALUE , "filter" },
910 { DBG_IOBUF_VALUE , "iobuf" },
911 { DBG_MEMORY_VALUE , "memory" },
912 { DBG_CACHE_VALUE , "cache" },
913 { DBG_MEMSTAT_VALUE, "memstat" },
914 { DBG_TRUST_VALUE , "trust" },
915 { DBG_HASHING_VALUE, "hashing" },
916 { DBG_IPC_VALUE , "ipc" },
917 { DBG_CLOCK_VALUE , "clock" },
918 { DBG_LOOKUP_VALUE , "lookup" },
919 { DBG_EXTPROG_VALUE, "extprog" },
924 #ifdef ENABLE_SELINUX_HACKS
925 #define ALWAYS_ADD_KEYRINGS 1
927 #define ALWAYS_ADD_KEYRINGS 0
931 int g10_errors_seen = 0;
933 static int utf8_strings = 0;
934 static int maybe_setuid = 1;
936 static char *build_list( const char *text, char letter,
937 const char *(*mapf)(int), int (*chkf)(int) );
938 static void set_cmd( enum cmd_and_opt_values *ret_cmd,
939 enum cmd_and_opt_values new_cmd );
940 static void print_mds( const char *fname, int algo );
941 static void add_notation_data( const char *string, int which );
942 static void add_policy_url( const char *string, int which );
943 static void add_keyserver_url( const char *string, int which );
944 static void emergency_cleanup (void);
945 static void read_sessionkey_from_fd (int fd);
949 make_libversion (const char *libname, const char *(*getfnc)(const char*))
956 gcry_control (GCRYCTL_INIT_SECMEM, 0, 0); /* Drop setuid. */
960 result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
961 strcpy (stpcpy (stpcpy (result, libname), " "), s);
967 build_list_pk_test_algo (int algo)
969 /* Show only one "RSA" string. If RSA_E or RSA_S is available RSA
970 is also available. */
971 if (algo == PUBKEY_ALGO_RSA_E
972 || algo == PUBKEY_ALGO_RSA_S)
973 return GPG_ERR_DIGEST_ALGO;
975 return openpgp_pk_test_algo (algo);
979 build_list_pk_algo_name (int algo)
981 return openpgp_pk_algo_name (algo);
985 build_list_cipher_test_algo (int algo)
987 return openpgp_cipher_test_algo (algo);
991 build_list_cipher_algo_name (int algo)
993 return openpgp_cipher_algo_name (algo);
997 build_list_md_test_algo (int algo)
999 /* By default we do not accept MD5 based signatures. To avoid
1000 confusion we do not announce support for it either. */
1001 if (algo == DIGEST_ALGO_MD5)
1002 return GPG_ERR_DIGEST_ALGO;
1004 return openpgp_md_test_algo (algo);
1008 build_list_md_algo_name (int algo)
1010 return openpgp_md_algo_name (algo);
1015 my_strusage( int level )
1017 static char *digests, *pubkeys, *ciphers, *zips, *ver_gcry;
1021 case 11: p = "@GPG@ (@GNUPG@)";
1023 case 13: p = VERSION; break;
1024 case 17: p = PRINTABLE_OS_NAME; break;
1025 case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
1029 ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
1033 #ifdef IS_DEVELOPMENT_VERSION
1035 p="NOTE: THIS IS A DEVELOPMENT VERSION!";
1038 p="It is only intended for test purposes and should NOT be";
1041 p="used in a production environment or with production keys!";
1047 _("Usage: @GPG@ [options] [files] (-h for help)");
1050 _("Syntax: @GPG@ [options] [files]\n"
1051 "Sign, check, encrypt or decrypt\n"
1052 "Default operation depends on the input data\n");
1055 case 31: p = "\nHome: "; break;
1057 case 32: p = gnupg_homedir (); break;
1058 #else /* __riscos__ */
1059 case 32: p = make_filename(gnupg_homedir (), NULL); break;
1060 #endif /* __riscos__ */
1061 case 33: p = _("\nSupported algorithms:\n"); break;
1064 pubkeys = build_list (_("Pubkey: "), 1,
1065 build_list_pk_algo_name,
1066 build_list_pk_test_algo );
1071 ciphers = build_list(_("Cipher: "), 'S',
1072 build_list_cipher_algo_name,
1073 build_list_cipher_test_algo );
1078 digests = build_list(_("Hash: "), 'H',
1079 build_list_md_algo_name,
1080 build_list_md_test_algo );
1085 zips = build_list(_("Compression: "),'Z',
1086 compress_algo_to_string,
1087 check_compress_algo);
1098 build_list (const char *text, char letter,
1099 const char * (*mapf)(int), int (*chkf)(int))
1108 gcry_control (GCRYCTL_INIT_SECMEM, 0, 0); /* Drop setuid. */
1110 indent = utf8_charcount (text, -1);
1112 init_membuf (&mb, 512);
1114 for (i=0; i <= 110; i++ )
1116 if (!chkf (i) && (s = mapf (i)))
1118 if (mb.len - len > 60)
1120 put_membuf_str (&mb, ",\n");
1122 for (j=0; j < indent; j++)
1123 put_membuf_str (&mb, " ");
1126 put_membuf_str (&mb, ", ");
1128 put_membuf_str (&mb, text);
1130 put_membuf_str (&mb, s);
1131 if (opt.verbose && letter)
1135 snprintf (num, sizeof num, " (%d)", i);
1137 snprintf (num, sizeof num, " (%c%d)", letter, i);
1138 put_membuf_str (&mb, num);
1143 put_membuf_str (&mb, "\n");
1144 put_membuf (&mb, "", 1);
1146 string = get_membuf (&mb, NULL);
1147 return xrealloc (string, strlen (string)+1);
1152 wrong_args( const char *text)
1154 es_fprintf (es_stderr, _("usage: %s [options] %s\n"), GPG_NAME, text);
1160 make_username( const char *string )
1164 p = xstrdup(string);
1166 p = native_to_utf8( string );
1172 set_opt_session_env (const char *name, const char *value)
1176 err = session_env_setenv (opt.session_env, name, value);
1178 log_fatal ("error setting session environment: %s\n",
1179 gpg_strerror (err));
1183 /* Setup the debugging. With a LEVEL of NULL only the active debug
1184 flags are propagated to the subsystems. With LEVEL set, a specific
1185 set of debug flags is set; thus overriding all flags already
1188 set_debug (const char *level)
1190 int numok = (level && digitp (level));
1191 int numlvl = numok? atoi (level) : 0;
1195 else if (!strcmp (level, "none") || (numok && numlvl < 1))
1197 else if (!strcmp (level, "basic") || (numok && numlvl <= 2))
1198 opt.debug = DBG_MEMSTAT_VALUE;
1199 else if (!strcmp (level, "advanced") || (numok && numlvl <= 5))
1200 opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE;
1201 else if (!strcmp (level, "expert") || (numok && numlvl <= 8))
1202 opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE
1203 |DBG_CACHE_VALUE|DBG_LOOKUP|DBG_FILTER_VALUE|DBG_PACKET_VALUE);
1204 else if (!strcmp (level, "guru") || numok)
1207 /* Unless the "guru" string has been used we don't want to allow
1208 hashing debugging. The rationale is that people tend to
1209 select the highest debug value and would then clutter their
1210 disk with debug files which may reveal confidential data. */
1212 opt.debug &= ~(DBG_HASHING_VALUE);
1216 log_error (_("invalid debug-level '%s' given\n"), level);
1220 if ((opt.debug & DBG_MEMORY_VALUE))
1221 memory_debug_mode = 1;
1222 if ((opt.debug & DBG_MEMSTAT_VALUE))
1223 memory_stat_debug_mode = 1;
1225 gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2);
1227 gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
1228 if ((opt.debug & DBG_IOBUF_VALUE))
1229 iobuf_debug_mode = 1;
1230 gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
1233 parse_debug_flag (NULL, &opt.debug, debug_flags);
1237 /* We set the screen dimensions for UI purposes. Do not allow screens
1238 smaller than 80x24 for the sake of simplicity. */
1240 set_screen_dimensions(void)
1242 #ifndef HAVE_W32_SYSTEM
1245 str=getenv("COLUMNS");
1247 opt.screen_columns=atoi(str);
1249 str=getenv("LINES");
1251 opt.screen_lines=atoi(str);
1254 if(opt.screen_columns<80 || opt.screen_columns>255)
1255 opt.screen_columns=80;
1257 if(opt.screen_lines<24 || opt.screen_lines>255)
1258 opt.screen_lines=24;
1262 /* Helper to open a file FNAME either for reading or writing to be
1263 used with --status-file etc functions. Not generally useful but it
1264 avoids the riscos specific functions and well some Windows people
1265 might like it too. Prints an error message and returns -1 on
1266 error. On success the file descriptor is returned. */
1268 open_info_file (const char *fname, int for_write, int binary)
1271 return riscos_fdopenfile (fname, for_write);
1272 #elif defined (ENABLE_SELINUX_HACKS)
1273 /* We can't allow these even when testing for a secured filename
1274 because files to be secured might not yet been secured. This is
1275 similar to the option file but in that case it is unlikely that
1276 sensitive information may be retrieved by means of error
1286 binary = MY_O_BINARY;
1288 /* if (is_secured_filename (fname)) */
1291 /* gpg_err_set_errno (EPERM); */
1298 fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY | binary,
1299 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
1301 fd = open (fname, O_RDONLY | binary);
1303 while (fd == -1 && errno == EINTR);
1306 log_error ( for_write? _("can't create '%s': %s\n")
1307 : _("can't open '%s': %s\n"), fname, strerror(errno));
1314 set_cmd( enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd )
1316 enum cmd_and_opt_values cmd = *ret_cmd;
1318 if( !cmd || cmd == new_cmd )
1320 else if( cmd == aSign && new_cmd == aEncr )
1322 else if( cmd == aEncr && new_cmd == aSign )
1324 else if( cmd == aSign && new_cmd == aSym )
1326 else if( cmd == aSym && new_cmd == aSign )
1328 else if( cmd == aSym && new_cmd == aEncr )
1330 else if( cmd == aEncr && new_cmd == aSym )
1332 else if (cmd == aSignEncr && new_cmd == aSym)
1334 else if (cmd == aSignSym && new_cmd == aEncr)
1336 else if (cmd == aEncrSym && new_cmd == aSign)
1338 else if( ( cmd == aSign && new_cmd == aClearsign )
1339 || ( cmd == aClearsign && new_cmd == aSign ) )
1342 log_error(_("conflicting commands\n"));
1351 add_group(char *string)
1354 struct groupitem *item;
1356 /* Break off the group name */
1357 name=strsep(&string,"=");
1360 log_error(_("no = sign found in group definition '%s'\n"),name);
1364 trim_trailing_ws(name,strlen(name));
1366 /* Does this group already exist? */
1367 for(item=opt.grouplist;item;item=item->next)
1368 if(strcasecmp(item->name,name)==0)
1373 item=xmalloc(sizeof(struct groupitem));
1375 item->next=opt.grouplist;
1380 /* Break apart the values */
1381 while ((value= strsep(&string," \t")))
1384 add_to_strlist2(&item->values,value,utf8_strings);
1390 rm_group(char *name)
1392 struct groupitem *item,*last=NULL;
1394 trim_trailing_ws(name,strlen(name));
1396 for(item=opt.grouplist;item;last=item,item=item->next)
1398 if(strcasecmp(item->name,name)==0)
1401 last->next=item->next;
1403 opt.grouplist=item->next;
1405 free_strlist(item->values);
1413 /* We need to check three things.
1415 0) The homedir. It must be x00, a directory, and owned by the
1418 1) The options/gpg.conf file. Okay unless it or its containing
1419 directory is group or other writable or not owned by us. Disable
1422 2) Extensions. Same as #1.
1424 Returns true if the item is unsafe. */
1426 check_permissions (const char *path, int item)
1428 #if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
1429 static int homedir_cache=-1;
1431 struct stat statbuf,dirbuf;
1432 int homedir=0,ret=0,checkonly=0;
1433 int perm=0,own=0,enc_dir_perm=0,enc_dir_own=0;
1435 if(opt.no_perm_warn)
1438 log_assert(item==0 || item==1 || item==2);
1440 /* extensions may attach a path */
1441 if(item==2 && path[0]!=DIRSEP_C)
1443 if(strchr(path,DIRSEP_C))
1444 tmppath=make_filename(path,NULL);
1446 tmppath=make_filename(gnupg_libdir (),path,NULL);
1449 tmppath=xstrdup(path);
1451 /* If the item is located in the homedir, but isn't the homedir,
1452 don't continue if we already checked the homedir itself. This is
1453 to avoid user confusion with an extra options file warning which
1454 could be rectified if the homedir itself had proper
1456 if(item!=0 && homedir_cache>-1
1457 && !ascii_strncasecmp (gnupg_homedir (), tmppath,
1458 strlen (gnupg_homedir ())))
1464 /* It's okay if the file or directory doesn't exist */
1465 if(stat(tmppath,&statbuf)!=0)
1471 /* Now check the enclosing directory. Theoretically, we could walk
1472 this test up to the root directory /, but for the sake of sanity,
1473 I'm stopping at one level down. */
1474 dir=make_dirname(tmppath);
1476 if(stat(dir,&dirbuf)!=0 || !S_ISDIR(dirbuf.st_mode))
1485 /* Assume failure */
1490 /* The homedir must be x00, a directory, and owned by the user. */
1492 if(S_ISDIR(statbuf.st_mode))
1494 if(statbuf.st_uid==getuid())
1496 if((statbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
1507 else if(item==1 || item==2)
1509 /* The options or extension file. Okay unless it or its
1510 containing directory is group or other writable or not owned
1513 if(S_ISREG(statbuf.st_mode))
1515 if(statbuf.st_uid==getuid() || statbuf.st_uid==0)
1517 if((statbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
1519 /* it's not writable, so make sure the enclosing
1520 directory is also not writable */
1521 if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
1523 if((dirbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
1533 /* it's writable, so the enclosing directory had
1534 better not let people get to it. */
1535 if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
1537 if((dirbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
1540 perm=enc_dir_perm=1; /* unclear which one to fix! */
1558 log_info(_("WARNING: unsafe ownership on"
1559 " homedir '%s'\n"),tmppath);
1561 log_info(_("WARNING: unsafe ownership on"
1562 " configuration file '%s'\n"),tmppath);
1564 log_info(_("WARNING: unsafe ownership on"
1565 " extension '%s'\n"),tmppath);
1570 log_info(_("WARNING: unsafe permissions on"
1571 " homedir '%s'\n"),tmppath);
1573 log_info(_("WARNING: unsafe permissions on"
1574 " configuration file '%s'\n"),tmppath);
1576 log_info(_("WARNING: unsafe permissions on"
1577 " extension '%s'\n"),tmppath);
1582 log_info(_("WARNING: unsafe enclosing directory ownership on"
1583 " homedir '%s'\n"),tmppath);
1585 log_info(_("WARNING: unsafe enclosing directory ownership on"
1586 " configuration file '%s'\n"),tmppath);
1588 log_info(_("WARNING: unsafe enclosing directory ownership on"
1589 " extension '%s'\n"),tmppath);
1594 log_info(_("WARNING: unsafe enclosing directory permissions on"
1595 " homedir '%s'\n"),tmppath);
1597 log_info(_("WARNING: unsafe enclosing directory permissions on"
1598 " configuration file '%s'\n"),tmppath);
1600 log_info(_("WARNING: unsafe enclosing directory permissions on"
1601 " extension '%s'\n"),tmppath);
1613 #else /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
1617 #endif /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
1621 /* Print the OpenPGP defined algo numbers. */
1623 print_algo_numbers(int (*checker)(int))
1642 print_algo_names(int (*checker)(int),const char *(*mapper)(int))
1654 es_printf ("%s",mapper(i));
1659 /* In the future, we can do all sorts of interesting configuration
1660 output here. For now, just give "group" as the Enigmail folks need
1661 it, and pubkey, cipher, hash, and compress as they may be useful
1664 list_config(char *items)
1666 int show_all = !items;
1669 struct groupitem *giter;
1672 if(!opt.with_colons)
1675 while(show_all || (name=strsep(&items," ")))
1679 if(show_all || ascii_strcasecmp(name,"group")==0)
1681 for (giter = opt.grouplist; giter; giter = giter->next)
1685 es_fprintf (es_stdout, "cfg:group:");
1686 es_write_sanitized (es_stdout, giter->name, strlen(giter->name),
1688 es_putc (':', es_stdout);
1690 for(sl=giter->values; sl; sl=sl->next)
1692 es_write_sanitized (es_stdout, sl->d, strlen (sl->d),
1704 if(show_all || ascii_strcasecmp(name,"version")==0)
1706 es_printf("cfg:version:");
1707 es_write_sanitized (es_stdout, VERSION, strlen(VERSION), ":", NULL);
1712 if(show_all || ascii_strcasecmp(name,"pubkey")==0)
1714 es_printf ("cfg:pubkey:");
1715 print_algo_numbers (build_list_pk_test_algo);
1720 if(show_all || ascii_strcasecmp(name,"pubkeyname")==0)
1722 es_printf ("cfg:pubkeyname:");
1723 print_algo_names (build_list_pk_test_algo,
1724 build_list_pk_algo_name);
1729 if(show_all || ascii_strcasecmp(name,"cipher")==0)
1731 es_printf ("cfg:cipher:");
1732 print_algo_numbers (build_list_cipher_test_algo);
1737 if (show_all || !ascii_strcasecmp (name,"ciphername"))
1739 es_printf ("cfg:ciphername:");
1740 print_algo_names (build_list_cipher_test_algo,
1741 build_list_cipher_algo_name);
1747 || ascii_strcasecmp(name,"digest")==0
1748 || ascii_strcasecmp(name,"hash")==0)
1750 es_printf ("cfg:digest:");
1751 print_algo_numbers (build_list_md_test_algo);
1757 || !ascii_strcasecmp(name,"digestname")
1758 || !ascii_strcasecmp(name,"hashname"))
1760 es_printf ("cfg:digestname:");
1761 print_algo_names (build_list_md_test_algo,
1762 build_list_md_algo_name);
1767 if(show_all || ascii_strcasecmp(name,"compress")==0)
1769 es_printf ("cfg:compress:");
1770 print_algo_numbers(check_compress_algo);
1775 if(show_all || ascii_strcasecmp (name, "compressname") == 0)
1777 es_printf ("cfg:compressname:");
1778 print_algo_names (check_compress_algo,
1779 compress_algo_to_string);
1784 if (show_all || !ascii_strcasecmp(name,"ccid-reader-id"))
1786 /* We ignore this for GnuPG 1.4 backward compatibility. */
1790 if (show_all || !ascii_strcasecmp (name,"curve"))
1792 es_printf ("cfg:curve:");
1793 for (iter=0, first=1; (s = openpgp_enum_curves (&iter)); first=0)
1794 es_printf ("%s%s", first?"":";", s);
1799 /* Curve OIDs are rarely useful and thus only printed if requested. */
1800 if (name && !ascii_strcasecmp (name,"curveoid"))
1802 es_printf ("cfg:curveoid:");
1803 for (iter=0, first=1; (s = openpgp_enum_curves (&iter)); first = 0)
1805 s = openpgp_curve_to_oid (s, NULL);
1806 es_printf ("%s%s", first?"":";", s? s:"[?]");
1816 log_error(_("unknown configuration item '%s'\n"),name);
1821 /* List options and default values in the GPG Conf format. This is a
1822 new tool distributed with gnupg 1.9.x but we also want some limited
1823 support in older gpg versions. The output is the name of the
1824 configuration file and a list of options available for editing by
1827 gpgconf_list (const char *configfile)
1829 char *configfile_esc = percent_escape (configfile, NULL);
1831 es_printf ("%s-%s.conf:%lu:\"%s\n",
1832 GPGCONF_NAME, GPG_NAME,
1833 GC_OPT_FLAG_DEFAULT,
1834 configfile_esc ? configfile_esc : "/dev/null");
1835 es_printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
1836 es_printf ("quiet:%lu:\n", GC_OPT_FLAG_NONE);
1837 es_printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
1838 es_printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
1839 es_printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE);
1840 es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
1841 es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE);
1842 es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
1843 es_printf ("auto-key-retrieve:%lu:\n", GC_OPT_FLAG_NONE);
1844 es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
1845 es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
1846 es_printf ("group:%lu:\n", GC_OPT_FLAG_NONE);
1847 es_printf ("compliance:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT, "gnupg");
1848 es_printf ("default-new-key-algo:%lu:\n", GC_OPT_FLAG_NONE);
1849 es_printf ("trust-model:%lu:\n", GC_OPT_FLAG_NONE);
1851 /* The next one is an info only item and should match the macros at
1852 the top of keygen.c */
1853 es_printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
1854 get_default_pubkey_algo ());
1856 xfree (configfile_esc);
1861 parse_subpacket_list(char *list)
1864 byte subpackets[128],i;
1869 /* No arguments means all subpackets */
1870 memset(subpackets+1,1,sizeof(subpackets)-1);
1875 memset(subpackets,0,sizeof(subpackets));
1877 /* Merge with earlier copy */
1878 if(opt.show_subpackets)
1882 for(in=opt.show_subpackets;*in;in++)
1884 if(*in>127 || *in<1)
1887 if(!subpackets[*in])
1893 while((tok=strsep(&list," ,")))
1908 xfree(opt.show_subpackets);
1909 opt.show_subpackets=xmalloc(count+1);
1910 opt.show_subpackets[count--]=0;
1912 for(i=1;i<128 && count>=0;i++)
1914 opt.show_subpackets[count--]=i;
1921 parse_list_options(char *str)
1923 char *subpackets=""; /* something that isn't NULL */
1924 struct parse_options lopts[]=
1926 {"show-photos",LIST_SHOW_PHOTOS,NULL,
1927 N_("display photo IDs during key listings")},
1928 {"show-usage",LIST_SHOW_USAGE,NULL,
1929 N_("show key usage information during key listings")},
1930 {"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL,
1931 N_("show policy URLs during signature listings")},
1932 {"show-notations",LIST_SHOW_NOTATIONS,NULL,
1933 N_("show all notations during signature listings")},
1934 {"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1935 N_("show IETF standard notations during signature listings")},
1936 {"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1938 {"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL,
1939 N_("show user-supplied notations during signature listings")},
1940 {"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL,
1941 N_("show preferred keyserver URLs during signature listings")},
1942 {"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL,
1943 N_("show user ID validity during key listings")},
1944 {"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL,
1945 N_("show revoked and expired user IDs in key listings")},
1946 {"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL,
1947 N_("show revoked and expired subkeys in key listings")},
1948 {"show-keyring",LIST_SHOW_KEYRING,NULL,
1949 N_("show the keyring name in key listings")},
1950 {"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL,
1951 N_("show expiration dates during signature listings")},
1952 {"show-sig-subpackets",LIST_SHOW_SIG_SUBPACKETS,NULL,
1957 /* C99 allows for non-constant initializers, but we'd like to
1958 compile everywhere, so fill in the show-sig-subpackets argument
1959 here. Note that if the parse_options array changes, we'll have
1960 to change the subscript here. */
1961 lopts[13].value=&subpackets;
1963 if(parse_options(str,&opt.list_options,lopts,1))
1965 if(opt.list_options&LIST_SHOW_SIG_SUBPACKETS)
1967 /* Unset so users can pass multiple lists in. */
1968 opt.list_options&=~LIST_SHOW_SIG_SUBPACKETS;
1969 if(!parse_subpacket_list(subpackets))
1972 else if(subpackets==NULL && opt.show_subpackets)
1974 /* User did 'no-show-subpackets' */
1975 xfree(opt.show_subpackets);
1976 opt.show_subpackets=NULL;
1986 /* Collapses argc/argv into a single string that must be freed */
1988 collapse_args(int argc,char *argv[])
1991 int i,first=1,len=0;
1995 len+=strlen(argv[i])+2;
1996 str=xrealloc(str,len);
2005 strcat(str,argv[i]);
2012 #ifndef NO_TRUST_MODELS
2014 parse_trust_model(const char *model)
2016 if(ascii_strcasecmp(model,"pgp")==0)
2017 opt.trust_model=TM_PGP;
2018 else if(ascii_strcasecmp(model,"classic")==0)
2019 opt.trust_model=TM_CLASSIC;
2020 else if(ascii_strcasecmp(model,"always")==0)
2021 opt.trust_model=TM_ALWAYS;
2022 else if(ascii_strcasecmp(model,"direct")==0)
2023 opt.trust_model=TM_DIRECT;
2025 else if(ascii_strcasecmp(model,"tofu")==0)
2026 opt.trust_model=TM_TOFU;
2027 else if(ascii_strcasecmp(model,"tofu+pgp")==0)
2028 opt.trust_model=TM_TOFU_PGP;
2030 else if(ascii_strcasecmp(model,"auto")==0)
2031 opt.trust_model=TM_AUTO;
2033 log_error("unknown trust model '%s'\n",model);
2035 #endif /*NO_TRUST_MODELS*/
2039 parse_tofu_policy (const char *policystr)
2042 struct { const char *keyword; int policy; } list[] = {
2043 { "auto", TOFU_POLICY_AUTO },
2044 { "good", TOFU_POLICY_GOOD },
2045 { "unknown", TOFU_POLICY_UNKNOWN },
2046 { "bad", TOFU_POLICY_BAD },
2047 { "ask", TOFU_POLICY_ASK }
2051 if (!ascii_strcasecmp (policystr, "help"))
2053 log_info (_("valid values for option '%s':\n"), "--tofu-policy");
2054 for (i=0; i < DIM (list); i++)
2055 log_info (" %s\n", list[i].keyword);
2059 for (i=0; i < DIM (list); i++)
2060 if (!ascii_strcasecmp (policystr, list[i].keyword))
2061 return list[i].policy;
2064 log_error (_("unknown TOFU policy '%s'\n"), policystr);
2066 log_info (_("(use \"help\" to list choices)\n"));
2071 /* Parse the value of --compliance. */
2073 parse_compliance_option (const char *string)
2075 struct { const char *keyword; enum cmd_and_opt_values option; } list[] = {
2076 { "gnupg", oGnuPG },
2077 { "openpgp", oOpenPGP },
2078 { "rfc4880bis", oRFC4880bis },
2079 { "rfc4880", oRFC4880 },
2080 { "rfc2440", oRFC2440 },
2088 if (!ascii_strcasecmp (string, "help"))
2090 log_info (_("valid values for option '%s':\n"), "--compliance");
2091 for (i=0; i < DIM (list); i++)
2092 log_info (" %s\n", list[i].keyword);
2096 for (i=0; i < DIM (list); i++)
2097 if (!ascii_strcasecmp (string, list[i].keyword))
2098 return list[i].option;
2100 log_error (_("invalid value for option '%s'\n"), "--compliance");
2102 log_info (_("(use \"help\" to list choices)\n"));
2108 /* Helper to set compliance related options. This is a separte
2109 * function so that it can also be used by the --compliance option
2112 set_compliance_option (enum cmd_and_opt_values option)
2117 opt.flags.rfc4880bis = 1;
2121 /* This is effectively the same as RFC2440, but with
2122 "--enable-dsa2 --no-rfc2440-text --escape-from-lines
2123 --require-cross-certification". */
2124 opt.compliance = CO_RFC4880;
2126 opt.flags.require_cross_cert = 1;
2127 opt.rfc2440_text = 0;
2128 opt.allow_non_selfsigned_uid = 1;
2129 opt.allow_freeform_uid = 1;
2130 opt.escape_from = 1;
2131 opt.not_dash_escaped = 0;
2132 opt.def_cipher_algo = 0;
2133 opt.def_digest_algo = 0;
2134 opt.cert_digest_algo = 0;
2135 opt.compress_algo = -1;
2136 opt.s2k_mode = 3; /* iterated+salted */
2137 opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2138 opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2141 opt.compliance = CO_RFC2440;
2143 opt.rfc2440_text = 1;
2144 opt.allow_non_selfsigned_uid = 1;
2145 opt.allow_freeform_uid = 1;
2146 opt.escape_from = 0;
2147 opt.not_dash_escaped = 0;
2148 opt.def_cipher_algo = 0;
2149 opt.def_digest_algo = 0;
2150 opt.cert_digest_algo = 0;
2151 opt.compress_algo = -1;
2152 opt.s2k_mode = 3; /* iterated+salted */
2153 opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2154 opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2156 case oPGP6: opt.compliance = CO_PGP6; break;
2157 case oPGP7: opt.compliance = CO_PGP7; break;
2158 case oPGP8: opt.compliance = CO_PGP8; break;
2159 case oGnuPG: opt.compliance = CO_GNUPG; break;
2162 set_compliance_option (oOpenPGP);
2163 opt.compliance = CO_DE_VS;
2164 /* Fixme: Change other options. */
2177 /* This function called to initialized a new control object. It is
2178 assumed that this object has been zeroed out before calling this
2181 gpg_init_default_ctrl (ctrl_t ctrl)
2187 /* This function is called to deinitialize a control object. It is
2190 gpg_deinit_default_ctrl (ctrl_t ctrl)
2193 tofu_closedbs (ctrl);
2195 gpg_dirmngr_deinit_session_data (ctrl);
2200 get_default_configname (void)
2202 char *configname = NULL;
2203 char *name = xstrdup (GPG_NAME EXTSEP_S "conf-" SAFE_VERSION);
2204 char *ver = &name[strlen (GPG_NAME EXTSEP_S "conf-")];
2215 if ((tok = strrchr (ver, SAFE_VERSION_DASH)))
2217 else if ((tok = strrchr (ver, SAFE_VERSION_DOT)))
2223 configname = make_filename (gnupg_homedir (), name, NULL);
2225 while (access (configname, R_OK));
2230 configname = make_filename (gnupg_homedir (),
2231 GPG_NAME EXTSEP_S "conf", NULL);
2232 if (! access (configname, R_OK))
2234 /* Print a warning when both config files are present. */
2235 char *p = make_filename (gnupg_homedir (), "options", NULL);
2236 if (! access (p, R_OK))
2237 log_info (_("Note: old default options file '%s' ignored\n"), p);
2242 /* Use the old default only if it exists. */
2243 char *p = make_filename (gnupg_homedir (), "options", NULL);
2244 if (!access (p, R_OK))
2257 main (int argc, char **argv)
2259 ARGPARSE_ARGS pargs;
2268 strlist_t remusr = NULL;
2269 strlist_t locusr = NULL;
2270 strlist_t nrings = NULL;
2271 armor_filter_context_t *afx = NULL;
2272 int detached_sig = 0;
2273 FILE *configfp = NULL;
2274 char *configname = NULL;
2275 char *save_configname = NULL;
2276 char *default_configname = NULL;
2277 unsigned configlineno;
2278 int parse_debug = 0;
2279 int default_config = 1;
2280 int default_keyring = 1;
2283 char *logfile = NULL;
2284 int use_random_seed = 1;
2285 enum cmd_and_opt_values cmd = 0;
2286 const char *debug_level = NULL;
2287 #ifndef NO_TRUST_MODELS
2288 const char *trustdb_name = NULL;
2289 #endif /*!NO_TRUST_MODELS*/
2290 char *def_cipher_string = NULL;
2291 char *def_digest_string = NULL;
2292 char *compress_algo_string = NULL;
2293 char *cert_digest_string = NULL;
2294 char *s2k_cipher_string = NULL;
2295 char *s2k_digest_string = NULL;
2296 char *pers_cipher_list = NULL;
2297 char *pers_digest_list = NULL;
2298 char *pers_compress_list = NULL;
2302 int ovrseskeyfd = -1;
2303 int fpr_maybe_cmd = 0; /* --fingerprint maybe a command. */
2304 int any_explicit_recipient = 0;
2305 int require_secmem = 0;
2307 struct assuan_malloc_hooks malloc_hooks;
2310 static int print_dane_records;
2311 static int print_pka_records;
2316 #endif /* __riscos__ */
2318 /* Please note that we may running SUID(ROOT), so be very CAREFUL
2319 when adding any stuff between here and the call to
2320 secmem_init() somewhere after the option parsing. */
2321 early_system_init ();
2322 gnupg_reopen_std (GPG_NAME);
2324 gnupg_rl_initialize ();
2325 set_strusage (my_strusage);
2326 gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
2327 log_set_prefix (GPG_NAME, GPGRT_LOG_WITH_PREFIX);
2329 /* Make sure that our subsystems are ready. */
2331 init_common_subsystems (&argc, &argv);
2333 /* Use our own logging handler for Libcgrypt. */
2334 setup_libgcrypt_logging ();
2336 /* Put random number into secure memory */
2337 gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
2339 may_coredump = disable_core_dumps();
2341 gnupg_init_signals (0, emergency_cleanup);
2343 dotlock_create (NULL, 0); /* Register lock file cleanup. */
2346 opt.session_env = session_env_new ();
2347 if (!opt.session_env)
2348 log_fatal ("error allocating session environment block: %s\n",
2351 opt.command_fd = -1; /* no command fd */
2352 opt.compress_level = -1; /* defaults to standard compress level */
2353 opt.bz2_compress_level = -1; /* defaults to standard compress level */
2354 /* note: if you change these lines, look at oOpenPGP */
2355 opt.def_cipher_algo = 0;
2356 opt.def_digest_algo = 0;
2357 opt.cert_digest_algo = 0;
2358 opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
2359 opt.s2k_mode = 3; /* iterated+salted */
2360 opt.s2k_count = 0; /* Auto-calibrate when needed. */
2361 opt.s2k_cipher_algo = DEFAULT_CIPHER_ALGO;
2362 opt.completes_needed = 1;
2363 opt.marginals_needed = 3;
2364 opt.max_cert_depth = 5;
2365 opt.escape_from = 1;
2366 opt.flags.require_cross_cert = 1;
2367 opt.import_options = 0;
2368 opt.export_options = EXPORT_ATTRIBUTES;
2369 opt.keyserver_options.import_options = IMPORT_REPAIR_PKS_SUBKEY_BUG;
2370 opt.keyserver_options.export_options = EXPORT_ATTRIBUTES;
2371 opt.keyserver_options.options = KEYSERVER_HONOR_PKA_RECORD;
2372 opt.verify_options = (LIST_SHOW_UID_VALIDITY
2373 | VERIFY_SHOW_POLICY_URLS
2374 | VERIFY_SHOW_STD_NOTATIONS
2375 | VERIFY_SHOW_KEYSERVER_URLS);
2376 opt.list_options = (LIST_SHOW_UID_VALIDITY
2378 #ifdef NO_TRUST_MODELS
2379 opt.trust_model = TM_ALWAYS;
2381 opt.trust_model = TM_AUTO;
2383 opt.tofu_default_policy = TOFU_POLICY_AUTO;
2384 opt.mangle_dos_filenames = 0;
2385 opt.min_cert_level = 2;
2386 set_screen_dimensions ();
2387 opt.keyid_format = KF_NONE;
2388 opt.def_sig_expire = "0";
2389 opt.def_cert_expire = "0";
2390 gnupg_set_homedir (NULL);
2391 opt.passphrase_repeat = 1;
2392 opt.emit_version = 0;
2393 opt.weak_digests = NULL;
2394 additional_weak_digest("MD5");
2396 /* Check whether we have a config file on the command line. */
2401 pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
2402 while( arg_parse( &pargs, opts) ) {
2403 if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
2405 else if (pargs.r_opt == oDebugIOLBF)
2406 es_setvbuf (es_stdout, NULL, _IOLBF, 0);
2407 else if( pargs.r_opt == oOptions ) {
2408 /* yes there is one, so we do not try the default one, but
2409 * read the option file when it is encountered at the commandline
2413 else if( pargs.r_opt == oNoOptions )
2415 default_config = 0; /* --no-options */
2416 opt.no_homedir_creation = 1;
2418 else if( pargs.r_opt == oHomedir )
2419 gnupg_set_homedir (pargs.r.ret_str);
2420 else if( pargs.r_opt == oNoPermissionWarn )
2422 else if (pargs.r_opt == oStrict )
2426 else if (pargs.r_opt == oNoStrict )
2432 #ifdef HAVE_DOSISH_SYSTEM
2433 if ( strchr (gnupg_homedir (), '\\') ) {
2434 char *d, *buf = xmalloc (strlen (gnupg_homedir ())+1);
2436 for (d=buf, s = gnupg_homedir (); *s; s++)
2438 *d++ = *s == '\\'? '/': *s;
2439 #ifdef HAVE_W32_SYSTEM
2440 if (s[1] && IsDBCSLeadByte (*s))
2445 gnupg_set_homedir (buf);
2449 /* Initialize the secure memory. */
2450 if (!gcry_control (GCRYCTL_INIT_SECMEM, SECMEM_BUFFER_SIZE, 0))
2452 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
2453 /* There should be no way to get to this spot while still carrying
2454 setuid privs. Just in case, bomb out if we are. */
2455 if ( getuid () != geteuid () )
2460 /* Okay, we are now working under our real uid */
2462 /* malloc hooks go here ... */
2463 malloc_hooks.malloc = gcry_malloc;
2464 malloc_hooks.realloc = gcry_realloc;
2465 malloc_hooks.free = gcry_free;
2466 assuan_set_malloc_hooks (&malloc_hooks);
2467 assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
2468 setup_libassuan_logging (&opt.debug, NULL);
2470 /* Try for a version specific config file first */
2471 default_configname = get_default_configname ();
2473 configname = xstrdup (default_configname);
2479 pargs.flags= ARGPARSE_FLAG_KEEP;
2481 /* By this point we have a homedir, and cannot change it. */
2482 check_permissions (gnupg_homedir (), 0);
2486 if(check_permissions(configname,1))
2488 /* If any options file is unsafe, then disable any external
2489 programs for keyserver calls or photo IDs. Since the
2490 external program to call is set in the options file, a
2491 unsafe options file can lead to an arbitrary program
2498 configfp = fopen( configname, "r" );
2499 if (configfp && is_secured_file (fileno (configfp)))
2503 gpg_err_set_errno (EPERM);
2506 if( default_config ) {
2508 log_info(_("Note: no default option file '%s'\n"),
2512 log_error(_("option file '%s': %s\n"),
2513 configname, strerror(errno) );
2516 xfree(configname); configname = NULL;
2518 if( parse_debug && configname )
2519 log_info(_("reading options from '%s'\n"), configname );
2523 while( optfile_parse( configfp, configname, &configlineno,
2526 switch( pargs.r_opt )
2529 case aListGcryptConfig:
2532 set_cmd (&cmd, pargs.r_opt);
2533 /* Do not register a keyring for these commands. */
2534 default_keyring = -1;
2547 #ifdef ENABLE_CARD_SUPPORT
2551 #endif /* ENABLE_CARD_SUPPORT*/
2556 case aExportSecretSub:
2568 case aUpdateTrustDB:
2570 case aListTrustPath:
2575 case aQuickLSignKey:
2583 case aQuickSetExpire:
2584 case aExportOwnerTrust:
2585 case aImportOwnerTrust:
2586 case aRebuildKeydbCaches:
2587 set_cmd (&cmd, pargs.r_opt);
2593 case aDeleteSecretKeys:
2594 case aDeleteSecretAndPublicKeys:
2597 set_cmd (&cmd, pargs.r_opt);
2601 case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
2603 case aDecryptFiles: multifile=1; /* fall through */
2604 case aDecrypt: set_cmd( &cmd, aDecrypt); break;
2606 case aEncrFiles: multifile=1; /* fall through */
2607 case aEncr: set_cmd( &cmd, aEncr); break;
2609 case aVerifyFiles: multifile=1; /* fall through */
2610 case aVerify: set_cmd( &cmd, aVerify); break;
2613 set_cmd (&cmd, pargs.r_opt);
2618 set_cmd (&cmd, pargs.r_opt);
2621 case oArmor: opt.armor = 1; opt.no_armor=0; break;
2622 case oOutput: opt.outfile = pargs.r.ret_str; break;
2624 case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
2626 case oInputSizeHint:
2627 opt.input_size_hint = string_to_u64 (pargs.r.ret_str);
2630 case oQuiet: opt.quiet = 1; break;
2631 case oNoTTY: tty_no_terminal(1); break;
2632 case oDryRun: opt.dry_run = 1; break;
2633 case oInteractive: opt.interactive = 1; break;
2636 gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2637 opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
2638 opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
2646 case oUseAgent: /* Dummy. */
2650 obsolete_option (configname, configlineno, "no-use-agent");
2653 obsolete_option (configname, configlineno, "gpg-agent-info");
2656 obsolete_scdaemon_option (configname, configlineno, "reader-port");
2659 obsolete_scdaemon_option (configname, configlineno, "ctapi-driver");
2662 obsolete_scdaemon_option (configname, configlineno, "pcsc-driver");
2665 obsolete_scdaemon_option (configname, configlineno, "disable-ccid");
2667 case oHonorHttpProxy:
2668 obsolete_option (configname, configlineno, "honor-http-proxy");
2671 case oAnswerYes: opt.answer_yes = 1; break;
2672 case oAnswerNo: opt.answer_no = 1; break;
2673 case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
2674 case oPrimaryKeyring:
2675 sl = append_to_strlist (&nrings, pargs.r.ret_str);
2676 sl->flags = KEYDB_RESOURCE_FLAG_PRIMARY;
2679 deprecated_warning(configname,configlineno,"--show-keyring",
2680 "--list-options ","show-keyring");
2681 opt.list_options|=LIST_SHOW_KEYRING;
2685 if (parse_debug_flag (pargs.r.ret_str, &opt.debug, debug_flags))
2687 pargs.r_opt = ARGPARSE_INVALID_ARG;
2688 pargs.err = ARGPARSE_PRINT_ERROR;
2692 case oDebugAll: opt.debug = ~0; break;
2693 case oDebugLevel: debug_level = pargs.r.ret_str; break;
2695 case oDebugIOLBF: break; /* Already set in pre-parse step. */
2698 set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2701 set_status_fd ( open_info_file (pargs.r.ret_str, 1, 0) );
2704 set_attrib_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2706 case oAttributeFile:
2707 set_attrib_fd ( open_info_file (pargs.r.ret_str, 1, 1) );
2710 log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
2713 logfile = pargs.r.ret_str;
2716 case oWithFingerprint:
2717 opt.with_fingerprint = 1;
2720 case oWithSubkeyFingerprint:
2721 opt.with_subkey_fingerprint = 1;
2723 case oWithICAOSpelling:
2724 opt.with_icao_spelling = 1;
2732 opt.with_keygrip = 1;
2736 opt.with_secret = 1;
2740 opt.with_wkd_hash = 1;
2743 case oSecretKeyring:
2744 /* Ignore this old option. */
2748 /* config files may not be nested (silently ignore them) */
2751 configname = xstrdup(pargs.r.ret_str);
2755 case oNoArmor: opt.no_armor=1; opt.armor=0; break;
2758 if (default_keyring > 0)
2759 default_keyring = 0;
2762 default_keyring = -1;
2765 case oNoGreeting: nogreeting = 1; break;
2768 gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2772 gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
2774 case oEmitVersion: opt.emit_version++; break;
2775 case oNoEmitVersion: opt.emit_version=0; break;
2776 case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
2777 case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
2778 case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
2780 #ifndef NO_TRUST_MODELS
2781 case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
2783 #endif /*!NO_TRUST_MODELS*/
2785 sl = add_to_strlist (&opt.def_secret_key, pargs.r.ret_str);
2786 sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
2788 sl->flags |= PK_LIST_CONFIG;
2791 if( *pargs.r.ret_str )
2793 xfree (opt.def_recipient);
2794 opt.def_recipient = make_username(pargs.r.ret_str);
2797 case oDefRecipientSelf:
2798 xfree(opt.def_recipient); opt.def_recipient = NULL;
2799 opt.def_recipient_self = 1;
2801 case oNoDefRecipient:
2802 xfree(opt.def_recipient); opt.def_recipient = NULL;
2803 opt.def_recipient_self = 0;
2805 case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
2806 case oHomedir: break;
2807 case oNoBatch: opt.batch = 0; break;
2809 case oWithTofuInfo: opt.with_tofu_info = 1; break;
2811 case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
2812 case oWithColons: opt.with_colons=':'; break;
2814 case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
2815 case oWithSigList: opt.list_sigs = 1; break;
2817 case oSkipVerify: opt.skip_verify=1; break;
2819 case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
2820 case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
2822 case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
2824 #ifndef NO_TRUST_MODELS
2825 /* There are many programs (like mutt) that call gpg with
2826 --always-trust so keep this option around for a long
2828 case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
2830 parse_trust_model(pargs.r.ret_str);
2832 #endif /*!NO_TRUST_MODELS*/
2833 case oTOFUDefaultPolicy:
2834 opt.tofu_default_policy = parse_tofu_policy (pargs.r.ret_str);
2837 obsolete_option (configname, configlineno, "tofu-db-format");
2840 case oForceOwnertrust:
2841 log_info(_("Note: %s is not for normal use!\n"),
2842 "--force-ownertrust");
2843 opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
2844 if(opt.force_ownertrust==-1)
2846 log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
2847 opt.force_ownertrust=0;
2850 case oLoadExtension:
2851 /* Dummy so that gpg 1.4 conf files can work. Should
2852 eventually be removed. */
2856 set_compliance_option (parse_compliance_option (pargs.r.ret_str));
2866 set_compliance_option (pargs.r_opt);
2869 case oRFC2440Text: opt.rfc2440_text=1; break;
2870 case oNoRFC2440Text: opt.rfc2440_text=0; break;
2874 opt.set_filename = pargs.r.ret_str;
2876 opt.set_filename = native_to_utf8(pargs.r.ret_str);
2878 case oForYourEyesOnly: eyes_only = 1; break;
2879 case oNoForYourEyesOnly: eyes_only = 0; break;
2881 add_policy_url(pargs.r.ret_str,0);
2882 add_policy_url(pargs.r.ret_str,1);
2884 case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
2885 case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
2886 case oShowPolicyURL:
2887 deprecated_warning(configname,configlineno,"--show-policy-url",
2888 "--list-options ","show-policy-urls");
2889 deprecated_warning(configname,configlineno,"--show-policy-url",
2890 "--verify-options ","show-policy-urls");
2891 opt.list_options|=LIST_SHOW_POLICY_URLS;
2892 opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
2894 case oNoShowPolicyURL:
2895 deprecated_warning(configname,configlineno,"--no-show-policy-url",
2896 "--list-options ","no-show-policy-urls");
2897 deprecated_warning(configname,configlineno,"--no-show-policy-url",
2898 "--verify-options ","no-show-policy-urls");
2899 opt.list_options&=~LIST_SHOW_POLICY_URLS;
2900 opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
2902 case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
2903 case oUseEmbeddedFilename:
2904 opt.flags.use_embedded_filename=1;
2906 case oNoUseEmbeddedFilename:
2907 opt.flags.use_embedded_filename=0;
2910 if(pargs.r.ret_str[0])
2911 append_to_strlist(&opt.comments,pargs.r.ret_str);
2913 case oDefaultComment:
2914 deprecated_warning(configname,configlineno,
2915 "--default-comment","--no-comments","");
2918 free_strlist(opt.comments);
2921 case oThrowKeyids: opt.throw_keyids = 1; break;
2922 case oNoThrowKeyids: opt.throw_keyids = 0; break;
2924 deprecated_warning(configname,configlineno,"--show-photos",
2925 "--list-options ","show-photos");
2926 deprecated_warning(configname,configlineno,"--show-photos",
2927 "--verify-options ","show-photos");
2928 opt.list_options|=LIST_SHOW_PHOTOS;
2929 opt.verify_options|=VERIFY_SHOW_PHOTOS;
2932 deprecated_warning(configname,configlineno,"--no-show-photos",
2933 "--list-options ","no-show-photos");
2934 deprecated_warning(configname,configlineno,"--no-show-photos",
2935 "--verify-options ","no-show-photos");
2936 opt.list_options&=~LIST_SHOW_PHOTOS;
2937 opt.verify_options&=~VERIFY_SHOW_PHOTOS;
2939 case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
2941 case oForceMDC: opt.force_mdc = 1; break;
2942 case oNoForceMDC: opt.force_mdc = 0; break;
2943 case oDisableMDC: opt.disable_mdc = 1; break;
2944 case oNoDisableMDC: opt.disable_mdc = 0; break;
2946 case oDisableSignerUID: opt.flags.disable_signer_uid = 1; break;
2948 case oS2KMode: opt.s2k_mode = pargs.r.ret_int; break;
2949 case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
2950 case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
2952 if (pargs.r.ret_int)
2953 opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
2955 opt.s2k_count = 0; /* Auto-calibrate when needed. */
2959 case oHiddenRecipient:
2960 case oRecipientFile:
2961 case oHiddenRecipientFile:
2962 /* Store the recipient. Note that we also store the
2963 * option as private data in the flags. This is achieved
2964 * by shifting the option value to the left so to keep
2965 * enough space for the flags. */
2966 sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2967 sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
2969 sl->flags |= PK_LIST_CONFIG;
2970 if (pargs.r_opt == oHiddenRecipient
2971 || pargs.r_opt == oHiddenRecipientFile)
2972 sl->flags |= PK_LIST_HIDDEN;
2973 if (pargs.r_opt == oRecipientFile
2974 || pargs.r_opt == oHiddenRecipientFile)
2975 sl->flags |= PK_LIST_FROM_FILE;
2976 any_explicit_recipient = 1;
2980 case oHiddenEncryptTo:
2981 /* Store an additional recipient. */
2982 sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2983 sl->flags = ((pargs.r_opt << PK_LIST_SHIFT) | PK_LIST_ENCRYPT_TO);
2985 sl->flags |= PK_LIST_CONFIG;
2986 if (pargs.r_opt == oHiddenEncryptTo)
2987 sl->flags |= PK_LIST_HIDDEN;
2991 opt.no_encrypt_to = 1;
2993 case oEncryptToDefaultKey:
2994 opt.encrypt_to_default_key = configfp ? 2 : 1;
2998 add_to_strlist2 (&opt.secret_keys_to_try,
2999 pargs.r.ret_str, utf8_strings);
3002 case oMimemode: opt.mimemode = opt.textmode = 1; break;
3003 case oTextmodeShort: opt.textmode = 2; break;
3004 case oTextmode: opt.textmode=1; break;
3005 case oNoTextmode: opt.textmode=opt.mimemode=0; break;
3007 case oExpert: opt.expert = 1; break;
3008 case oNoExpert: opt.expert = 0; break;
3010 if(*pargs.r.ret_str!='\0')
3012 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3013 log_error(_("'%s' is not a valid signature expiration\n"),
3016 opt.def_sig_expire=pargs.r.ret_str;
3019 case oAskSigExpire: opt.ask_sig_expire = 1; break;
3020 case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
3021 case oDefCertExpire:
3022 if(*pargs.r.ret_str!='\0')
3024 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3025 log_error(_("'%s' is not a valid signature expiration\n"),
3028 opt.def_cert_expire=pargs.r.ret_str;
3031 case oAskCertExpire: opt.ask_cert_expire = 1; break;
3032 case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
3033 case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
3034 case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
3035 case oAskCertLevel: opt.ask_cert_level = 1; break;
3036 case oNoAskCertLevel: opt.ask_cert_level = 0; break;
3037 case oLocalUser: /* store the local users */
3038 sl = add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
3039 sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
3041 sl->flags |= PK_LIST_CONFIG;
3045 char *mbox = mailbox_from_userid (pargs.r.ret_str);
3047 log_error (_("\"%s\" is not a proper mail address\n"),
3051 add_to_strlist (&opt.sender_list, mbox);
3057 /* this is the -z command line option */
3058 opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
3060 case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
3061 case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
3062 case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
3064 set_passphrase_from_string(pargs.r.ret_str);
3067 pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3069 case oPassphraseFile:
3070 pwfd = open_info_file (pargs.r.ret_str, 0, 1);
3072 case oPassphraseRepeat:
3073 opt.passphrase_repeat = pargs.r.ret_int;
3077 opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
3078 if (opt.pinentry_mode == -1)
3079 log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
3083 opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3084 if (! gnupg_fd_valid (opt.command_fd))
3085 log_fatal ("command-fd is invalid: %s\n", strerror (errno));
3088 opt.command_fd = open_info_file (pargs.r.ret_str, 0, 1);
3091 def_cipher_string = xstrdup(pargs.r.ret_str);
3094 def_digest_string = xstrdup(pargs.r.ret_str);
3097 /* If it is all digits, stick a Z in front of it for
3098 later. This is for backwards compatibility with
3099 versions that took the compress algorithm number. */
3101 char *pt=pargs.r.ret_str;
3104 if (!isascii (*pt) || !isdigit (*pt))
3112 compress_algo_string=xmalloc(strlen(pargs.r.ret_str)+2);
3113 strcpy(compress_algo_string,"Z");
3114 strcat(compress_algo_string,pargs.r.ret_str);
3117 compress_algo_string = xstrdup(pargs.r.ret_str);
3120 case oCertDigestAlgo:
3121 cert_digest_string = xstrdup(pargs.r.ret_str);
3125 gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
3128 case oRequireSecmem: require_secmem=1; break;
3129 case oNoRequireSecmem: require_secmem=0; break;
3130 case oNoPermissionWarn: opt.no_perm_warn=1; break;
3131 case oNoMDCWarn: opt.no_mdc_warn=1; break;
3132 case oDisplayCharset:
3133 if( set_native_charset( pargs.r.ret_str ) )
3134 log_error(_("'%s' is not a valid character set\n"),
3137 case oNotDashEscaped: opt.not_dash_escaped = 1; break;
3138 case oEscapeFrom: opt.escape_from = 1; break;
3139 case oNoEscapeFrom: opt.escape_from = 0; break;
3140 case oLockOnce: opt.lock_once = 1; break;
3147 #else /* __riscos__ */
3148 riscos_not_implemented("lock-multiple");
3149 #endif /* __riscos__ */
3153 keyserver_spec_t keyserver;
3154 keyserver = parse_keyserver_uri (pargs.r.ret_str, 0);
3156 log_error (_("could not parse keyserver URL\n"));
3159 /* We only support a single keyserver. Later ones
3160 override earlier ones. (Since we parse the
3161 config file first and then the command line
3162 arguments, the command line takes
3165 free_keyserver_spec (opt.keyserver);
3166 opt.keyserver = keyserver;
3170 case oKeyServerOptions:
3171 if(!parse_keyserver_options(pargs.r.ret_str))
3174 log_error(_("%s:%d: invalid keyserver options\n"),
3175 configname,configlineno);
3177 log_error(_("invalid keyserver options\n"));
3180 case oImportOptions:
3181 if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
3184 log_error(_("%s:%d: invalid import options\n"),
3185 configname,configlineno);
3187 log_error(_("invalid import options\n"));
3191 rc = parse_and_set_import_filter (pargs.r.ret_str);
3193 log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3195 case oExportOptions:
3196 if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
3199 log_error(_("%s:%d: invalid export options\n"),
3200 configname,configlineno);
3202 log_error(_("invalid export options\n"));
3206 rc = parse_and_set_export_filter (pargs.r.ret_str);
3208 log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3211 if(!parse_list_options(pargs.r.ret_str))
3214 log_error(_("%s:%d: invalid list options\n"),
3215 configname,configlineno);
3217 log_error(_("invalid list options\n"));
3220 case oVerifyOptions:
3222 struct parse_options vopts[]=
3224 {"show-photos",VERIFY_SHOW_PHOTOS,NULL,
3225 N_("display photo IDs during signature verification")},
3226 {"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL,
3227 N_("show policy URLs during signature verification")},
3228 {"show-notations",VERIFY_SHOW_NOTATIONS,NULL,
3229 N_("show all notations during signature verification")},
3230 {"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3231 N_("show IETF standard notations during signature verification")},
3232 {"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3234 {"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL,
3235 N_("show user-supplied notations during signature verification")},
3236 {"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL,
3237 N_("show preferred keyserver URLs during signature verification")},
3238 {"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL,
3239 N_("show user ID validity during signature verification")},
3240 {"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL,
3241 N_("show revoked and expired user IDs in signature verification")},
3242 {"show-primary-uid-only",VERIFY_SHOW_PRIMARY_UID_ONLY,NULL,
3243 N_("show only the primary user ID in signature verification")},
3244 {"pka-lookups",VERIFY_PKA_LOOKUPS,NULL,
3245 N_("validate signatures with PKA data")},
3246 {"pka-trust-increase",VERIFY_PKA_TRUST_INCREASE,NULL,
3247 N_("elevate the trust of signatures with valid PKA data")},
3251 if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
3254 log_error(_("%s:%d: invalid verify options\n"),
3255 configname,configlineno);
3257 log_error(_("invalid verify options\n"));
3261 case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
3263 if(set_exec_path(pargs.r.ret_str))
3264 log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
3266 opt.exec_path_set=1;
3269 add_notation_data( pargs.r.ret_str, 0 );
3270 add_notation_data( pargs.r.ret_str, 1 );
3272 case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
3273 case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
3275 deprecated_warning(configname,configlineno,"--show-notation",
3276 "--list-options ","show-notations");
3277 deprecated_warning(configname,configlineno,"--show-notation",
3278 "--verify-options ","show-notations");
3279 opt.list_options|=LIST_SHOW_NOTATIONS;
3280 opt.verify_options|=VERIFY_SHOW_NOTATIONS;
3282 case oNoShowNotation:
3283 deprecated_warning(configname,configlineno,"--no-show-notation",
3284 "--list-options ","no-show-notations");
3285 deprecated_warning(configname,configlineno,"--no-show-notation",
3286 "--verify-options ","no-show-notations");
3287 opt.list_options&=~LIST_SHOW_NOTATIONS;
3288 opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
3290 case oUtf8Strings: utf8_strings = 1; break;
3291 case oNoUtf8Strings: utf8_strings = 0; break;
3292 case oDisableCipherAlgo:
3294 int algo = string_to_cipher_algo (pargs.r.ret_str);
3295 gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3298 case oDisablePubkeyAlgo:
3300 int algo = gcry_pk_map_name (pargs.r.ret_str);
3301 gcry_pk_ctl (GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3304 case oNoSigCache: opt.no_sig_cache = 1; break;
3305 case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
3306 case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
3307 case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
3308 case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
3309 case oNoLiteral: opt.no_literal = 1; break;
3310 case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
3311 case oFastListMode: opt.fast_list_mode = 1; break;
3312 case oFixedListMode: /* Dummy */ break;
3313 case oLegacyListMode: opt.legacy_list_mode = 1; break;
3314 case oPrintPKARecords: print_pka_records = 1; break;
3315 case oPrintDANERecords: print_dane_records = 1; break;
3316 case oListOnly: opt.list_only=1; break;
3317 case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
3318 case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
3319 case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
3320 case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
3321 case oNoRandomSeedFile: use_random_seed = 0; break;
3322 case oAutoKeyRetrieve:
3323 case oNoAutoKeyRetrieve:
3324 if(pargs.r_opt==oAutoKeyRetrieve)
3325 opt.keyserver_options.options|=KEYSERVER_AUTO_KEY_RETRIEVE;
3327 opt.keyserver_options.options&=~KEYSERVER_AUTO_KEY_RETRIEVE;
3329 case oShowSessionKey: opt.show_session_key = 1; break;
3330 case oOverrideSessionKey:
3331 opt.override_session_key = pargs.r.ret_str;
3333 case oOverrideSessionKeyFD:
3334 ovrseskeyfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3337 deprecated_warning(configname,configlineno,"--merge-only",
3338 "--import-options ","merge-only");
3339 opt.import_options|=IMPORT_MERGE_ONLY;
3341 case oAllowSecretKeyImport: /* obsolete */ break;
3342 case oTryAllSecrets: opt.try_all_secrets = 1; break;
3343 case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
3345 case oEnableSpecialFilenames:
3346 enable_special_filenames ();
3349 case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
3350 case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
3351 case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
3352 case oPreservePermissions: opt.preserve_permissions=1; break;
3353 case oDefaultPreferenceList:
3354 opt.def_preference_list = pargs.r.ret_str;
3356 case oDefaultKeyserverURL:
3358 keyserver_spec_t keyserver;
3359 keyserver = parse_keyserver_uri (pargs.r.ret_str,1 );
3361 log_error (_("could not parse keyserver URL\n"));
3363 free_keyserver_spec (keyserver);
3365 opt.def_keyserver_url = pargs.r.ret_str;
3368 case oPersonalCipherPreferences:
3369 pers_cipher_list=pargs.r.ret_str;
3371 case oPersonalDigestPreferences:
3372 pers_digest_list=pargs.r.ret_str;
3374 case oPersonalCompressPreferences:
3375 pers_compress_list=pargs.r.ret_str;
3377 case oAgentProgram: opt.agent_program = pargs.r.ret_str; break;
3378 case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
3380 additional_weak_digest(pargs.r.ret_str);
3383 opt.unwrap_encryption = 1;
3385 case oOnlySignTextIDs:
3386 opt.only_sign_text_ids = 1;
3390 set_opt_session_env ("DISPLAY", pargs.r.ret_str);
3393 set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
3396 set_opt_session_env ("TERM", pargs.r.ret_str);
3399 set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
3402 case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
3403 case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
3405 case oGroup: add_group(pargs.r.ret_str); break;
3406 case oUnGroup: rm_group(pargs.r.ret_str); break;
3408 while(opt.grouplist)
3410 struct groupitem *iter=opt.grouplist;
3411 free_strlist(iter->values);
3412 opt.grouplist=opt.grouplist->next;
3422 case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
3423 case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
3424 case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
3425 case oMultifile: multifile=1; break;
3427 if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
3428 opt.keyid_format=KF_SHORT;
3429 else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
3430 opt.keyid_format=KF_LONG;
3431 else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
3432 opt.keyid_format=KF_0xSHORT;
3433 else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
3434 opt.keyid_format=KF_0xLONG;
3435 else if(ascii_strcasecmp(pargs.r.ret_str,"none")==0)
3436 opt.keyid_format = KF_NONE;
3438 log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
3441 case oExitOnStatusWriteError:
3442 opt.exit_on_status_write_error = 1;
3445 case oLimitCardInsertTries:
3446 opt.limit_card_insert_tries = pargs.r.ret_int;
3449 case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
3450 case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
3452 case oAutoKeyLocate:
3453 if(!parse_auto_key_locate(pargs.r.ret_str))
3456 log_error(_("%s:%d: invalid auto-key-locate list\n"),
3457 configname,configlineno);
3459 log_error(_("invalid auto-key-locate list\n"));
3462 case oNoAutoKeyLocate:
3466 case oEnableLargeRSA:
3467 #if SECMEM_BUFFER_SIZE >= 65536
3468 opt.flags.large_rsa=1;
3471 log_info("%s:%d: WARNING: gpg not built with large secure "
3472 "memory buffer. Ignoring enable-large-rsa\n",
3473 configname,configlineno);
3475 log_info("WARNING: gpg not built with large secure "
3476 "memory buffer. Ignoring --enable-large-rsa\n");
3477 #endif /* SECMEM_BUFFER_SIZE >= 65536 */
3479 case oDisableLargeRSA: opt.flags.large_rsa=0;
3482 case oEnableDSA2: opt.flags.dsa2=1; break;
3483 case oDisableDSA2: opt.flags.dsa2=0; break;
3485 case oAllowMultisigVerification:
3486 case oAllowMultipleMessages:
3487 opt.flags.allow_multiple_messages=1;
3490 case oNoAllowMultipleMessages:
3491 opt.flags.allow_multiple_messages=0;
3494 case oAllowWeakDigestAlgos:
3495 opt.flags.allow_weak_digest_algos = 1;
3498 case oFakedSystemTime:
3500 size_t len = strlen (pargs.r.ret_str);
3504 if (len > 0 && pargs.r.ret_str[len-1] == '!')
3507 pargs.r.ret_str[len-1] = '\0';
3510 faked_time = isotime2epoch (pargs.r.ret_str);
3511 if (faked_time == (time_t)(-1))
3512 faked_time = (time_t)strtoul (pargs.r.ret_str, NULL, 10);
3513 gnupg_set_time (faked_time, freeze);
3517 case oNoAutostart: opt.autostart = 0; break;
3519 case oDefaultNewKeyAlgo:
3520 opt.def_new_key_algo = pargs.r.ret_str;
3526 pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
3535 /* Remember the first config file name. */
3536 if (!save_configname)
3537 save_configname = configname;
3543 xfree(configname); configname = NULL;
3544 if (log_get_errorcount (0))
3547 /* The command --gpgconf-list is pretty simple and may be called
3548 directly after the option parsing. */
3549 if (cmd == aGPGConfList)
3551 gpgconf_list (save_configname ? save_configname : default_configname);
3554 xfree (save_configname);
3555 xfree (default_configname);
3557 if (print_dane_records)
3558 log_error ("invalid option \"%s\"; use \"%s\" instead\n",
3559 "--print-dane-records",
3560 "--export-options export-dane");
3561 if (print_pka_records)
3562 log_error ("invalid option \"%s\"; use \"%s\" instead\n",
3563 "--print-pks-records",
3564 "--export-options export-pka");
3565 if (log_get_errorcount (0))
3574 es_fprintf (es_stderr, "%s %s; %s\n",
3575 strusage(11), strusage(13), strusage(14) );
3576 es_fprintf (es_stderr, "%s\n", strusage(15) );
3578 #ifdef IS_DEVELOPMENT_VERSION
3583 if((s=strusage(25)))
3585 if((s=strusage(26)))
3587 if((s=strusage(27)))
3592 /* FIXME: We should use logging to a file only in server mode;
3593 however we have not yet implemetyed that. Thus we try to get
3594 away with --batch as indication for logging to file
3596 if (logfile && opt.batch)
3598 log_set_file (logfile);
3599 log_set_prefix (NULL, GPGRT_LOG_WITH_PREFIX | GPGRT_LOG_WITH_TIME | GPGRT_LOG_WITH_PID);
3602 if (opt.verbose > 2)
3603 log_info ("using character set '%s'\n", get_native_charset ());
3605 if( may_coredump && !opt.quiet )
3606 log_info(_("WARNING: program may create a core file!\n"));
3608 if (opt.flags.rfc4880bis)
3609 log_info ("WARNING: using experimental features from RFC4880bis!\n");
3612 opt.mimemode = 0; /* This will use text mode instead. */
3616 if (opt.set_filename)
3617 log_info(_("WARNING: %s overrides %s\n"),
3618 "--for-your-eyes-only","--set-filename");
3620 opt.set_filename="_CONSOLE";
3623 if (opt.no_literal) {
3624 log_info(_("Note: %s is not for normal use!\n"), "--no-literal");
3626 log_error(_("%s not allowed with %s!\n"),
3627 "--textmode", "--no-literal" );
3628 if (opt.set_filename)
3629 log_error(_("%s makes no sense with %s!\n"),
3630 eyes_only?"--for-your-eyes-only":"--set-filename",
3635 if (opt.set_filesize)
3636 log_info(_("Note: %s is not for normal use!\n"), "--set-filesize");
3640 if (gnupg_faked_time_p ())
3642 gnupg_isotime_t tbuf;
3644 log_info (_("WARNING: running with faked system time: "));
3645 gnupg_get_isotime (tbuf);
3646 dump_isotime (tbuf);
3650 /* Print a warning if an argument looks like an option. */
3651 if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
3655 for (i=0; i < argc; i++)
3656 if (argv[i][0] == '-' && argv[i][1] == '-')
3657 log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
3661 gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
3663 if(require_secmem && !got_secmem)
3665 log_info(_("will not run with insecure memory due to %s\n"),
3666 "--require-secmem");
3670 set_debug (debug_level);
3672 log_clock ("start");
3674 /* Do these after the switch(), so they can override settings. */
3677 /* That does not anymore work because we have no more support
3678 for v3 signatures. */
3681 opt.ask_sig_expire=0;
3685 /* That does not anymore work because we have no more support
3686 for v3 signatures. */
3688 opt.ask_sig_expire=0;
3696 if( def_cipher_string ) {
3697 opt.def_cipher_algo = string_to_cipher_algo (def_cipher_string);
3698 xfree(def_cipher_string); def_cipher_string = NULL;
3699 if ( openpgp_cipher_test_algo (opt.def_cipher_algo) )
3700 log_error(_("selected cipher algorithm is invalid\n"));
3702 if( def_digest_string ) {
3703 opt.def_digest_algo = string_to_digest_algo (def_digest_string);
3704 xfree(def_digest_string); def_digest_string = NULL;
3705 if ( openpgp_md_test_algo (opt.def_digest_algo) )
3706 log_error(_("selected digest algorithm is invalid\n"));
3708 if( compress_algo_string ) {
3709 opt.compress_algo = string_to_compress_algo(compress_algo_string);
3710 xfree(compress_algo_string); compress_algo_string = NULL;
3711 if( check_compress_algo(opt.compress_algo) )
3712 log_error(_("selected compression algorithm is invalid\n"));
3714 if( cert_digest_string ) {
3715 opt.cert_digest_algo = string_to_digest_algo (cert_digest_string);
3716 xfree(cert_digest_string); cert_digest_string = NULL;
3717 if (openpgp_md_test_algo(opt.cert_digest_algo))
3718 log_error(_("selected certification digest algorithm is invalid\n"));
3720 if( s2k_cipher_string ) {
3721 opt.s2k_cipher_algo = string_to_cipher_algo (s2k_cipher_string);
3722 xfree(s2k_cipher_string); s2k_cipher_string = NULL;
3723 if (openpgp_cipher_test_algo (opt.s2k_cipher_algo))
3724 log_error(_("selected cipher algorithm is invalid\n"));
3726 if( s2k_digest_string ) {
3727 opt.s2k_digest_algo = string_to_digest_algo (s2k_digest_string);
3728 xfree(s2k_digest_string); s2k_digest_string = NULL;
3729 if (openpgp_md_test_algo(opt.s2k_digest_algo))
3730 log_error(_("selected digest algorithm is invalid\n"));
3732 if( opt.completes_needed < 1 )
3733 log_error(_("completes-needed must be greater than 0\n"));
3734 if( opt.marginals_needed < 2 )
3735 log_error(_("marginals-needed must be greater than 1\n"));
3736 if( opt.max_cert_depth < 1 || opt.max_cert_depth > 255 )
3737 log_error(_("max-cert-depth must be in the range from 1 to 255\n"));
3738 if(opt.def_cert_level<0 || opt.def_cert_level>3)
3739 log_error(_("invalid default-cert-level; must be 0, 1, 2, or 3\n"));
3740 if( opt.min_cert_level < 1 || opt.min_cert_level > 3 )
3741 log_error(_("invalid min-cert-level; must be 1, 2, or 3\n"));
3742 switch( opt.s2k_mode ) {
3744 log_info(_("Note: simple S2K mode (0) is strongly discouraged\n"));
3746 case 1: case 3: break;
3748 log_error(_("invalid S2K mode; must be 0, 1 or 3\n"));
3751 /* This isn't actually needed, but does serve to error out if the
3752 string is invalid. */
3753 if(opt.def_preference_list &&
3754 keygen_set_std_prefs(opt.def_preference_list,0))
3755 log_error(_("invalid default preferences\n"));
3757 if(pers_cipher_list &&
3758 keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
3759 log_error(_("invalid personal cipher preferences\n"));
3761 if(pers_digest_list &&
3762 keygen_set_std_prefs(pers_digest_list,PREFTYPE_HASH))
3763 log_error(_("invalid personal digest preferences\n"));
3765 if(pers_compress_list &&
3766 keygen_set_std_prefs(pers_compress_list,PREFTYPE_ZIP))
3767 log_error(_("invalid personal compress preferences\n"));
3769 /* We don't support all possible commands with multifile yet */
3780 cmdname="--sign --encrypt";
3783 cmdname="--clear-sign";
3786 cmdname="--detach-sign";
3789 cmdname="--symmetric";
3792 cmdname="--symmetric --encrypt";
3803 log_error(_("%s does not yet work with %s\n"),cmdname,"--multifile");
3806 if( log_get_errorcount(0) )
3809 if(opt.compress_level==0)
3810 opt.compress_algo=COMPRESS_ALGO_NONE;
3812 /* Check our chosen algorithms against the list of legal
3817 const char *badalg=NULL;
3818 preftype_t badtype=PREFTYPE_NONE;
3820 if(opt.def_cipher_algo
3821 && !algo_available(PREFTYPE_SYM,opt.def_cipher_algo,NULL))
3823 badalg = openpgp_cipher_algo_name (opt.def_cipher_algo);
3824 badtype = PREFTYPE_SYM;
3826 else if(opt.def_digest_algo
3827 && !algo_available(PREFTYPE_HASH,opt.def_digest_algo,NULL))
3829 badalg = gcry_md_algo_name (opt.def_digest_algo);
3830 badtype = PREFTYPE_HASH;
3832 else if(opt.cert_digest_algo
3833 && !algo_available(PREFTYPE_HASH,opt.cert_digest_algo,NULL))
3835 badalg = gcry_md_algo_name (opt.cert_digest_algo);
3836 badtype = PREFTYPE_HASH;
3838 else if(opt.compress_algo!=-1
3839 && !algo_available(PREFTYPE_ZIP,opt.compress_algo,NULL))
3841 badalg = compress_algo_to_string(opt.compress_algo);
3842 badtype = PREFTYPE_ZIP;
3850 log_info(_("you may not use cipher algorithm '%s'"
3851 " while in %s mode\n"),
3852 badalg,compliance_option_string());
3855 log_info(_("you may not use digest algorithm '%s'"
3856 " while in %s mode\n"),
3857 badalg,compliance_option_string());
3860 log_info(_("you may not use compression algorithm '%s'"
3861 " while in %s mode\n"),
3862 badalg,compliance_option_string());
3868 compliance_failure();
3872 /* Set the random seed file. */
3873 if( use_random_seed ) {
3874 char *p = make_filename (gnupg_homedir (), "random_seed", NULL );
3875 gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
3876 if (!access (p, F_OK))
3877 register_secured_file (p);
3881 /* If there is no command but the --fingerprint is given, default
3882 to the --list-keys command. */
3883 if (!cmd && fpr_maybe_cmd)
3885 set_cmd (&cmd, aListKeys);
3889 if( opt.verbose > 1 )
3890 set_packet_list_mode(1);
3892 /* Add the keyrings, but not for some special commands. We always
3893 * need to add the keyrings if we are running under SELinux, this
3894 * is so that the rings are added to the list of secured files.
3895 * We do not add any keyring if --no-keyring has been used. */
3896 if (default_keyring >= 0
3897 && (ALWAYS_ADD_KEYRINGS
3898 || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest)))
3900 if (!nrings || default_keyring > 0) /* Add default ring. */
3901 keydb_add_resource ("pubring" EXTSEP_S GPGEXT_GPG,
3902 KEYDB_RESOURCE_FLAG_DEFAULT);
3903 for (sl = nrings; sl; sl = sl->next )
3904 keydb_add_resource (sl->d, sl->flags);
3906 FREE_STRLIST(nrings);
3908 if (opt.pinentry_mode == PINENTRY_MODE_LOOPBACK)
3909 /* In loopback mode, never ask for the password multiple
3912 opt.passphrase_repeat = 0;
3915 if (cmd == aGPGConfTest)
3919 if (pwfd != -1) /* Read the passphrase now. */
3920 read_passphrase_from_fd (pwfd);
3922 if (ovrseskeyfd != -1 ) /* Read the sessionkey now. */
3923 read_sessionkey_from_fd (ovrseskeyfd);
3925 fname = argc? *argv : NULL;
3927 if(fname && utf8_strings)
3928 opt.flags.utf8_filename=1;
3930 ctrl = xcalloc (1, sizeof *ctrl);
3931 gpg_init_default_ctrl (ctrl);
3933 #ifndef NO_TRUST_MODELS
3943 case aListGcryptConfig:
3946 case aExportOwnerTrust:
3947 rc = setup_trustdb (0, trustdb_name);
3950 rc = setup_trustdb (argc? 1:0, trustdb_name);
3953 /* If we are using TM_ALWAYS, we do not need to create the
3955 rc = setup_trustdb (opt.trust_model != TM_ALWAYS, trustdb_name);
3959 log_error (_("failed to initialize the TrustDB: %s\n"),
3961 #endif /*!NO_TRUST_MODELS*/
3970 if (!opt.quiet && any_explicit_recipient)
3971 log_info (_("WARNING: recipients (-r) given "
3972 "without using public key encryption\n"));
3979 /* Check for certain command whether we need to migrate a
3980 secring.gpg to the gpg-agent. */
3983 case aListSecretKeys:
3994 case aDeleteSecretKeys:
3995 case aDeleteSecretAndPublicKeys:
4004 case aExportSecretSub:
4009 migrate_secring (ctrl);
4012 if (opt.with_secret)
4013 migrate_secring (ctrl);
4019 /* The command dispatcher. */
4026 case aStore: /* only store the file */
4028 wrong_args("--store [filename]");
4029 if( (rc = encrypt_store(fname)) )
4031 write_status_failure ("store", rc);
4032 log_error ("storing '%s' failed: %s\n",
4033 print_fname_stdin(fname),gpg_strerror (rc) );
4036 case aSym: /* encrypt the given file only with the symmetric cipher */
4038 wrong_args("--symmetric [filename]");
4039 if( (rc = encrypt_symmetric(fname)) )
4041 write_status_failure ("symencrypt", rc);
4042 log_error (_("symmetric encryption of '%s' failed: %s\n"),
4043 print_fname_stdin(fname),gpg_strerror (rc) );
4047 case aEncr: /* encrypt the given file */
4049 encrypt_crypt_files (ctrl, argc, argv, remusr);
4053 wrong_args("--encrypt [filename]");
4054 if( (rc = encrypt_crypt (ctrl, -1, fname, remusr, 0, NULL, -1)) )
4056 write_status_failure ("encrypt", rc);
4057 log_error("%s: encryption failed: %s\n",
4058 print_fname_stdin(fname), gpg_strerror (rc) );
4064 /* This works with PGP 8 in the sense that it acts just like a
4065 symmetric message. It doesn't work at all with 2 or 6. It
4066 might work with 7, but alas, I don't have a copy to test
4069 wrong_args("--symmetric --encrypt [filename]");
4070 else if(opt.s2k_mode==0)
4071 log_error(_("you cannot use --symmetric --encrypt"
4072 " with --s2k-mode 0\n"));
4073 else if(PGP6 || PGP7)
4074 log_error(_("you cannot use --symmetric --encrypt"
4075 " while in %s mode\n"),compliance_option_string());
4078 if( (rc = encrypt_crypt (ctrl, -1, fname, remusr, 1, NULL, -1)) )
4080 write_status_failure ("encrypt", rc);
4081 log_error ("%s: encryption failed: %s\n",
4082 print_fname_stdin(fname), gpg_strerror (rc) );
4087 case aSign: /* sign the given file */
4089 if( detached_sig ) { /* sign all files */
4090 for( ; argc; argc--, argv++ )
4091 add_to_strlist( &sl, *argv );
4095 wrong_args("--sign [filename]");
4097 sl = xmalloc_clear( sizeof *sl + strlen(fname));
4098 strcpy(sl->d, fname);
4101 if ((rc = sign_file (ctrl, sl, detached_sig, locusr, 0, NULL, NULL)))
4103 write_status_failure ("sign", rc);
4104 log_error ("signing failed: %s\n", gpg_strerror (rc) );
4109 case aSignEncr: /* sign and encrypt the given file */
4111 wrong_args("--sign --encrypt [filename]");
4113 sl = xmalloc_clear( sizeof *sl + strlen(fname));
4114 strcpy(sl->d, fname);
4118 if ((rc = sign_file (ctrl, sl, detached_sig, locusr, 1, remusr, NULL)))
4120 write_status_failure ("sign-encrypt", rc);
4121 log_error("%s: sign+encrypt failed: %s\n",
4122 print_fname_stdin(fname), gpg_strerror (rc) );
4127 case aSignEncrSym: /* sign and encrypt the given file */
4129 wrong_args("--symmetric --sign --encrypt [filename]");
4130 else if(opt.s2k_mode==0)
4131 log_error(_("you cannot use --symmetric --sign --encrypt"
4132 " with --s2k-mode 0\n"));
4133 else if(PGP6 || PGP7)
4134 log_error(_("you cannot use --symmetric --sign --encrypt"
4135 " while in %s mode\n"),compliance_option_string());
4140 sl = xmalloc_clear( sizeof *sl + strlen(fname));
4141 strcpy(sl->d, fname);
4145 if ((rc = sign_file (ctrl, sl, detached_sig, locusr,
4148 write_status_failure ("sign-encrypt", rc);
4149 log_error("%s: symmetric+sign+encrypt failed: %s\n",
4150 print_fname_stdin(fname), gpg_strerror (rc) );
4156 case aSignSym: /* sign and conventionally encrypt the given file */
4158 wrong_args("--sign --symmetric [filename]");
4159 rc = sign_symencrypt_file (ctrl, fname, locusr);
4162 write_status_failure ("sign-symencrypt", rc);
4163 log_error("%s: sign+symmetric failed: %s\n",
4164 print_fname_stdin(fname), gpg_strerror (rc) );
4168 case aClearsign: /* make a clearsig */
4170 wrong_args("--clear-sign [filename]");
4171 if( (rc = clearsign_file (ctrl, fname, locusr, NULL)) )
4173 write_status_failure ("sign", rc);
4174 log_error("%s: clear-sign failed: %s\n",
4175 print_fname_stdin(fname), gpg_strerror (rc) );
4182 if ((rc = verify_files (ctrl, argc, argv)))
4183 log_error("verify files failed: %s\n", gpg_strerror (rc) );
4187 if ((rc = verify_signatures (ctrl, argc, argv)))
4188 log_error("verify signatures failed: %s\n", gpg_strerror (rc) );
4191 write_status_failure ("verify", rc);
4196 decrypt_messages (ctrl, argc, argv);
4200 wrong_args("--decrypt [filename]");
4201 if( (rc = decrypt_message (ctrl, fname) ))
4203 write_status_failure ("decrypt", rc);
4204 log_error("decrypt_message failed: %s\n", gpg_strerror (rc) );
4210 case aQuickLSignKey:
4215 wrong_args ("--quick-[l]sign-key fingerprint [userids]");
4216 fpr = *argv++; argc--;
4218 for( ; argc; argc--, argv++)
4219 append_to_strlist2 (&sl, *argv, utf8_strings);
4220 keyedit_quick_sign (ctrl, fpr, sl, locusr, (cmd == aQuickLSignKey));
4227 wrong_args("--sign-key user-id");
4231 wrong_args("--lsign-key user-id");
4237 append_to_strlist(&sl,"sign");
4238 else if(cmd==aLSignKey)
4239 append_to_strlist(&sl,"lsign");
4243 append_to_strlist( &sl, "save" );
4244 username = make_username( fname );
4245 keyedit_menu (ctrl, username, locusr, sl, 0, 0 );
4250 case aEditKey: /* Edit a key signature */
4252 wrong_args("--edit-key user-id [commands]");
4253 username = make_username( fname );
4256 for( argc--, argv++ ; argc; argc--, argv++ )
4257 append_to_strlist( &sl, *argv );
4258 keyedit_menu (ctrl, username, locusr, sl, 0, 1 );
4262 keyedit_menu (ctrl, username, locusr, NULL, 0, 1 );
4268 wrong_args("--change-passphrase <user-id>");
4271 username = make_username (fname);
4272 keyedit_passwd (ctrl, username);
4278 case aDeleteSecretKeys:
4279 case aDeleteSecretAndPublicKeys:
4281 /* I'm adding these in reverse order as add_to_strlist2
4282 reverses them again, and it's easier to understand in the
4284 for( ; argc; argc-- )
4285 add_to_strlist2( &sl, argv[argc-1], utf8_strings );
4286 delete_keys(sl,cmd==aDeleteSecretKeys,cmd==aDeleteSecretAndPublicKeys);
4296 for( ; argc; argc--, argv++ )
4297 add_to_strlist2( &sl, *argv, utf8_strings );
4298 public_key_list (ctrl, sl, 0);
4301 case aListSecretKeys:
4303 for( ; argc; argc--, argv++ )
4304 add_to_strlist2( &sl, *argv, utf8_strings );
4305 secret_key_list (ctrl, sl);
4310 for (; argc; argc--, argv++)
4311 add_to_strlist2( &sl, *argv, utf8_strings );
4312 public_key_list (ctrl, sl, 1);
4318 const char *x_algo, *x_usage, *x_expire;
4320 if (argc < 1 || argc > 4)
4321 wrong_args("--quick-generate-key USER-ID [ALGO [USAGE [EXPIRE]]]");
4322 username = make_username (fname);
4329 x_algo = *argv++; argc--;
4332 x_usage = *argv++; argc--;
4335 x_expire = *argv++; argc--;
4339 quick_generate_keypair (ctrl, username, x_algo, x_usage, x_expire);
4344 case aKeygen: /* generate a key */
4347 wrong_args("--generate-key [parameterfile]");
4348 generate_keypair (ctrl, 0, argc? *argv : NULL, NULL, 0);
4351 if (opt.command_fd != -1 && argc)
4354 wrong_args("--generate-key [parameterfile]");
4357 generate_keypair (ctrl, 0, argc? *argv : NULL, NULL, 0);
4360 wrong_args ("--generate-key");
4362 generate_keypair (ctrl, 0, NULL, NULL, 0);
4366 case aFullKeygen: /* Generate a key with all options. */
4370 wrong_args ("--full-generate-key [parameterfile]");
4371 generate_keypair (ctrl, 1, argc? *argv : NULL, NULL, 0);
4376 wrong_args("--full-generate-key");
4377 generate_keypair (ctrl, 1, NULL, NULL, 0);
4383 const char *uid, *newuid;
4386 wrong_args ("--quick-add-uid USER-ID NEW-USER-ID");
4387 uid = *argv++; argc--;
4388 newuid = *argv++; argc--;
4389 keyedit_quick_adduid (ctrl, uid, newuid);
4395 const char *x_fpr, *x_algo, *x_usage, *x_expire;
4397 if (argc < 1 || argc > 4)
4398 wrong_args ("--quick-add-key FINGERPRINT [ALGO [USAGE [EXPIRE]]]");
4399 x_fpr = *argv++; argc--;
4405 x_algo = *argv++; argc--;
4408 x_usage = *argv++; argc--;
4411 x_expire = *argv++; argc--;
4415 keyedit_quick_addkey (ctrl, x_fpr, x_algo, x_usage, x_expire);
4421 const char *uid, *uidtorev;
4424 wrong_args ("--quick-revoke-uid USER-ID USER-ID-TO-REVOKE");
4425 uid = *argv++; argc--;
4426 uidtorev = *argv++; argc--;
4427 keyedit_quick_revuid (ctrl, uid, uidtorev);
4431 case aQuickSetExpire:
4433 const char *x_fpr, *x_expire;
4436 wrong_args ("--quick-set-exipre FINGERPRINT EXPIRE");
4437 x_fpr = *argv++; argc--;
4438 x_expire = *argv++; argc--;
4439 keyedit_quick_set_expire (ctrl, x_fpr, x_expire);
4444 opt.import_options |= IMPORT_FAST;
4446 import_keys (ctrl, argc? argv:NULL, argc, NULL, opt.import_options);
4449 /* TODO: There are a number of command that use this same
4450 "make strlist, call function, report error, free strlist"
4451 pattern. Join them together here and avoid all that
4458 for( ; argc; argc--, argv++ )
4459 append_to_strlist2( &sl, *argv, utf8_strings );
4460 if( cmd == aSendKeys )
4461 rc = keyserver_export (ctrl, sl );
4462 else if( cmd == aRecvKeys )
4463 rc = keyserver_import (ctrl, sl );
4466 export_stats_t stats = export_new_stats ();
4467 rc = export_pubkeys (ctrl, sl, opt.export_options, stats);
4468 export_print_stats (stats);
4469 export_release_stats (stats);
4475 write_status_failure ("send-keys", rc);
4476 log_error(_("keyserver send failed: %s\n"),gpg_strerror (rc));
4478 else if(cmd==aRecvKeys)
4480 write_status_failure ("recv-keys", rc);
4481 log_error (_("keyserver receive failed: %s\n"),
4486 write_status_failure ("export", rc);
4487 log_error (_("key export failed: %s\n"), gpg_strerror (rc));
4495 wrong_args ("--export-ssh-key <user-id>");
4496 rc = export_ssh_key (ctrl, argv[0]);
4499 write_status_failure ("export-ssh-key", rc);
4500 log_error (_("export as ssh key failed: %s\n"), gpg_strerror (rc));
4506 for (; argc; argc--, argv++)
4507 append_to_strlist2 (&sl, *argv, utf8_strings);
4508 rc = keyserver_search (ctrl, sl);
4511 write_status_failure ("search-keys", rc);
4512 log_error (_("keyserver search failed: %s\n"), gpg_strerror (rc));
4519 for( ; argc; argc--, argv++ )
4520 append_to_strlist2( &sl, *argv, utf8_strings );
4521 rc = keyserver_refresh (ctrl, sl);
4524 write_status_failure ("refresh-keys", rc);
4525 log_error (_("keyserver refresh failed: %s\n"),gpg_strerror (rc));
4532 for( ; argc; argc--, argv++ )
4533 append_to_strlist2( &sl, *argv, utf8_strings );
4534 rc = keyserver_fetch (ctrl, sl);
4537 write_status_failure ("fetch-keys", rc);
4538 log_error ("key fetch failed: %s\n",gpg_strerror (rc));
4545 for( ; argc; argc--, argv++ )
4546 add_to_strlist2( &sl, *argv, utf8_strings );
4548 export_stats_t stats = export_new_stats ();
4549 export_seckeys (ctrl, sl, opt.export_options, stats);
4550 export_print_stats (stats);
4551 export_release_stats (stats);
4556 case aExportSecretSub:
4558 for( ; argc; argc--, argv++ )
4559 add_to_strlist2( &sl, *argv, utf8_strings );
4561 export_stats_t stats = export_new_stats ();
4562 export_secsubkeys (ctrl, sl, opt.export_options, stats);
4563 export_print_stats (stats);
4564 export_release_stats (stats);
4571 wrong_args("--generate-revocation user-id");
4572 username = make_username(*argv);
4573 gen_revoke( username );
4579 wrong_args ("--generate-designated-revocation user-id");
4580 username = make_username (*argv);
4581 gen_desig_revoke (ctrl, username, locusr);
4587 wrong_args("--dearmor [file]");
4588 rc = dearmor_file( argc? *argv: NULL );
4591 write_status_failure ("dearmor", rc);
4592 log_error (_("dearmoring failed: %s\n"), gpg_strerror (rc));
4598 wrong_args("--enarmor [file]");
4599 rc = enarmor_file( argc? *argv: NULL );
4602 write_status_failure ("enarmor", rc);
4603 log_error (_("enarmoring failed: %s\n"), gpg_strerror (rc));
4610 { int mode = argc < 2 ? 0 : atoi(*argv);
4612 if( mode == 1 && argc == 2 ) {
4613 mpi_print (es_stdout,
4614 generate_public_prime( atoi(argv[1]) ), 1);
4616 else if( mode == 2 && argc == 3 ) {
4617 mpi_print (es_stdout, generate_elg_prime(
4619 atoi(argv[2]), NULL,NULL ), 1);
4621 else if( mode == 3 && argc == 3 ) {
4623 mpi_print (es_stdout, generate_elg_prime(
4625 atoi(argv[2]), NULL,&factors ), 1);
4626 es_putc ('\n', es_stdout);
4627 mpi_print (es_stdout, factors[0], 1 ); /* print q */
4629 else if( mode == 4 && argc == 3 ) {
4630 MPI g = mpi_alloc(1);
4631 mpi_print (es_stdout, generate_elg_prime(
4633 atoi(argv[2]), g, NULL ), 1);
4634 es_putc ('\n', es_stdout);
4635 mpi_print (es_stdout, g, 1 );
4639 wrong_args("--gen-prime mode bits [qbits] ");
4640 es_putc ('\n', es_stdout);
4643 wrong_args("--gen-prime not yet supported ");
4648 int level = argc ? atoi(*argv):0;
4649 int count = argc > 1 ? atoi(argv[1]): 0;
4650 int endless = !count;
4652 if( argc < 1 || argc > 2 || level < 0 || level > 2 || count < 0 )
4653 wrong_args("--gen-random 0|1|2 [count]");
4655 while( endless || count ) {
4657 /* Wee need a multiple of 3, so that in case of
4658 armored output we get a correct string. No
4659 linefolding is done, as it is best to levae this to
4661 size_t n = !endless && count < 99? count : 99;
4663 p = gcry_random_bytes (n, level);
4664 #ifdef HAVE_DOSISH_SYSTEM
4665 setmode ( fileno(stdout), O_BINARY );
4668 char *tmp = make_radix64_string (p, n);
4669 es_fputs (tmp, es_stdout);
4672 es_putc ('=', es_stdout);
4674 es_putc ('=', es_stdout);
4676 es_fwrite( p, n, 1, es_stdout );
4683 es_putc ('\n', es_stdout);
4689 wrong_args("--print-md algo [files]");
4691 int all_algos = (**argv=='*' && !(*argv)[1]);
4692 int algo = all_algos? 0 : gcry_md_map_name (*argv);
4694 if( !algo && !all_algos )
4695 log_error(_("invalid hash algorithm '%s'\n"), *argv );
4699 print_mds(NULL, algo);
4701 for(; argc; argc--, argv++ )
4702 print_mds(*argv, algo);
4708 case aPrintMDs: /* old option */
4712 for(; argc; argc--, argv++ )
4717 #ifndef NO_TRUST_MODELS
4720 list_trustdb (es_stdout, NULL);
4722 for( ; argc; argc--, argv++ )
4723 list_trustdb (es_stdout, *argv );
4727 case aUpdateTrustDB:
4729 wrong_args("--update-trustdb");
4730 update_trustdb (ctrl);
4734 /* Old versions allowed for arguments - ignore them */
4735 check_trustdb (ctrl);
4739 how_to_fix_the_trustdb ();
4742 case aListTrustPath:
4744 wrong_args("--list-trust-path <user-ids>");
4745 for( ; argc; argc--, argv++ ) {
4746 username = make_username( *argv );
4747 list_trust_path( username );
4752 case aExportOwnerTrust:
4754 wrong_args("--export-ownertrust");
4755 export_ownertrust();
4758 case aImportOwnerTrust:
4760 wrong_args("--import-ownertrust [file]");
4761 import_ownertrust( argc? *argv:NULL );
4763 #endif /*!NO_TRUST_MODELS*/
4765 case aRebuildKeydbCaches:
4767 wrong_args ("--rebuild-keydb-caches");
4768 keydb_rebuild_caches (1);
4771 #ifdef ENABLE_CARD_SUPPORT
4774 wrong_args ("--card-status");
4775 card_status (es_stdout, NULL, 0);
4781 for (argc--, argv++ ; argc; argc--, argv++)
4782 append_to_strlist (&sl, *argv);
4783 card_edit (ctrl, sl);
4787 card_edit (ctrl, NULL);
4794 change_pin (atoi (*argv),1);
4796 wrong_args ("--change-pin [no]");
4798 #endif /* ENABLE_CARD_SUPPORT*/
4802 char *str=collapse_args(argc,argv);
4808 case aListGcryptConfig:
4809 /* Fixme: It would be nice to integrate that with
4810 --list-config but unfortunately there is no way yet to have
4811 libgcrypt print it to an estream for further parsing. */
4812 gcry_control (GCRYCTL_PRINT_CONFIG, stdout);
4823 wrong_args ("--tofu-policy POLICY KEYID [KEYID...]");
4825 policy = parse_tofu_policy (argv[0]);
4831 tofu_begin_batch_update (ctrl);
4833 for (i = 1; i < argc; i ++)
4835 KEYDB_SEARCH_DESC desc;
4838 rc = classify_user_id (argv[i], &desc, 0);
4841 log_error (_("error parsing key specification '%s': %s\n"),
4842 argv[i], gpg_strerror (rc));
4846 if (! (desc.mode == KEYDB_SEARCH_MODE_SHORT_KID
4847 || desc.mode == KEYDB_SEARCH_MODE_LONG_KID
4848 || desc.mode == KEYDB_SEARCH_MODE_FPR16
4849 || desc.mode == KEYDB_SEARCH_MODE_FPR20
4850 || desc.mode == KEYDB_SEARCH_MODE_FPR
4851 || desc.mode == KEYDB_SEARCH_MODE_KEYGRIP))
4853 log_error (_("'%s' does not appear to be a valid"
4854 " key ID, fingerprint or keygrip\n"),
4859 rc = keydb_search_reset (hd);
4862 /* This should not happen, thus no need to tranalate
4864 log_error ("keydb_search_reset failed: %s\n",
4869 rc = keydb_search (hd, &desc, 1, NULL);
4872 log_error (_("key \"%s\" not found: %s\n"), argv[i],
4877 rc = keydb_get_keyblock (hd, &kb);
4880 log_error (_("error reading keyblock: %s\n"),
4885 merge_keys_and_selfsig (kb);
4886 if (tofu_set_policy (ctrl, kb, policy))
4889 release_kbnode (kb);
4892 tofu_end_batch_update (ctrl);
4901 log_info (_("WARNING: no command supplied."
4902 " Trying to guess what you mean ...\n"));
4906 wrong_args("[filename]");
4907 /* Issue some output for the unix newbie */
4908 if (!fname && !opt.outfile
4909 && gnupg_isatty (fileno (stdin))
4910 && gnupg_isatty (fileno (stdout))
4911 && gnupg_isatty (fileno (stderr)))
4912 log_info(_("Go ahead and type your message ...\n"));
4914 a = iobuf_open(fname);
4915 if (a && is_secured_file (iobuf_get_fd (a)))
4919 gpg_err_set_errno (EPERM);
4922 log_error(_("can't open '%s'\n"), print_fname_stdin(fname));
4925 if( !opt.no_armor ) {
4926 if( use_armor_filter( a ) ) {
4927 afx = new_armor_context ();
4928 push_armor_filter (afx, a);
4931 if( cmd == aListPackets ) {
4933 set_packet_list_mode(1);
4935 rc = proc_packets (ctrl, NULL, a );
4938 write_status_failure ("-", rc);
4939 log_error ("processing message failed: %s\n",
4948 gpg_deinit_default_ctrl (ctrl);
4950 release_armor_context (afx);
4951 FREE_STRLIST(remusr);
4952 FREE_STRLIST(locusr);
4954 return 8; /*NEVER REACHED*/
4958 /* Note: This function is used by signal handlers!. */
4960 emergency_cleanup (void)
4962 gcry_control (GCRYCTL_TERM_SECMEM );
4969 gcry_control (GCRYCTL_UPDATE_RANDOM_SEED_FILE);
4973 if ( (opt.debug & DBG_MEMSTAT_VALUE) )
4975 keydb_dump_stats ();
4976 gcry_control (GCRYCTL_DUMP_MEMORY_STATS);
4977 gcry_control (GCRYCTL_DUMP_RANDOM_STATS);
4980 gcry_control (GCRYCTL_DUMP_SECMEM_STATS );
4982 emergency_cleanup ();
4984 rc = rc? rc : log_get_errorcount(0)? 2 : g10_errors_seen? 1 : 0;
4989 /* Pretty-print hex hashes. This assumes at least an 80-character
4990 display, but there are a few other similar assumptions in the
4993 print_hex (gcry_md_hd_t md, int algo, const char *fname)
4995 int i,n,count,indent=0;
4999 indent = es_printf("%s: ",fname);
5007 if (algo==DIGEST_ALGO_RMD160)
5008 indent += es_printf("RMD160 = ");
5010 indent += es_printf("%6s = ", gcry_md_algo_name (algo));
5016 p = gcry_md_read (md, algo);
5017 n = gcry_md_get_algo_dlen (algo);
5019 count += es_printf ("%02X",*p++);
5021 for(i=1;i<n;i++,p++)
5027 es_printf ("\n%*s",indent," ");
5031 count += es_printf(" ");
5034 count += es_printf(" ");
5042 es_printf ("\n%*s",indent," ");
5046 count += es_printf(" ");
5050 count += es_printf(" ");
5058 es_printf ("\n%*s",indent," ");
5062 count += es_printf(" ");
5066 count += es_printf("%02X",*p);
5073 print_hashline( gcry_md_hd_t md, int algo, const char *fname )
5080 for (p = fname; *p; p++ )
5082 if ( *p <= 32 || *p > 127 || *p == ':' || *p == '%' )
5083 es_printf ("%%%02X", *p );
5085 es_putc (*p, es_stdout);
5088 es_putc (':', es_stdout);
5089 es_printf ("%d:", algo);
5090 p = gcry_md_read (md, algo);
5091 n = gcry_md_get_algo_dlen (algo);
5092 for(i=0; i < n ; i++, p++ )
5093 es_printf ("%02X", *p);
5094 es_fputs (":\n", es_stdout);
5099 print_mds( const char *fname, int algo )
5113 fp = es_fopen (fname, "rb" );
5114 if (fp && is_secured_file (es_fileno (fp)))
5118 gpg_err_set_errno (EPERM);
5123 log_error("%s: %s\n", fname?fname:"[stdin]", strerror(errno) );
5127 gcry_md_open (&md, 0, 0);
5129 gcry_md_enable (md, algo);
5132 if (!gcry_md_test_algo (GCRY_MD_MD5))
5133 gcry_md_enable (md, GCRY_MD_MD5);
5134 gcry_md_enable (md, GCRY_MD_SHA1);
5135 if (!gcry_md_test_algo (GCRY_MD_RMD160))
5136 gcry_md_enable (md, GCRY_MD_RMD160);
5137 if (!gcry_md_test_algo (GCRY_MD_SHA224))
5138 gcry_md_enable (md, GCRY_MD_SHA224);
5139 if (!gcry_md_test_algo (GCRY_MD_SHA256))
5140 gcry_md_enable (md, GCRY_MD_SHA256);
5141 if (!gcry_md_test_algo (GCRY_MD_SHA384))
5142 gcry_md_enable (md, GCRY_MD_SHA384);
5143 if (!gcry_md_test_algo (GCRY_MD_SHA512))
5144 gcry_md_enable (md, GCRY_MD_SHA512);
5147 while ((n=es_fread (buf, 1, DIM(buf), fp)))
5148 gcry_md_write (md, buf, n);
5151 log_error ("%s: %s\n", fname?fname:"[stdin]", strerror(errno));
5155 if (opt.with_colons)
5158 print_hashline (md, algo, fname);
5161 if (!gcry_md_test_algo (GCRY_MD_MD5))
5162 print_hashline( md, GCRY_MD_MD5, fname );
5163 print_hashline( md, GCRY_MD_SHA1, fname );
5164 if (!gcry_md_test_algo (GCRY_MD_RMD160))
5165 print_hashline( md, GCRY_MD_RMD160, fname );
5166 if (!gcry_md_test_algo (GCRY_MD_SHA224))
5167 print_hashline (md, GCRY_MD_SHA224, fname);
5168 if (!gcry_md_test_algo (GCRY_MD_SHA256))
5169 print_hashline( md, GCRY_MD_SHA256, fname );
5170 if (!gcry_md_test_algo (GCRY_MD_SHA384))
5171 print_hashline ( md, GCRY_MD_SHA384, fname );
5172 if (!gcry_md_test_algo (GCRY_MD_SHA512))
5173 print_hashline ( md, GCRY_MD_SHA512, fname );
5179 print_hex (md, -algo, fname);
5182 if (!gcry_md_test_algo (GCRY_MD_MD5))
5183 print_hex (md, GCRY_MD_MD5, fname);
5184 print_hex (md, GCRY_MD_SHA1, fname );
5185 if (!gcry_md_test_algo (GCRY_MD_RMD160))
5186 print_hex (md, GCRY_MD_RMD160, fname );
5187 if (!gcry_md_test_algo (GCRY_MD_SHA224))
5188 print_hex (md, GCRY_MD_SHA224, fname);
5189 if (!gcry_md_test_algo (GCRY_MD_SHA256))
5190 print_hex (md, GCRY_MD_SHA256, fname );
5191 if (!gcry_md_test_algo (GCRY_MD_SHA384))
5192 print_hex (md, GCRY_MD_SHA384, fname );
5193 if (!gcry_md_test_algo (GCRY_MD_SHA512))
5194 print_hex (md, GCRY_MD_SHA512, fname );
5206 * Check the supplied name,value string and add it to the notation
5207 * data to be used for signatures. which==0 for sig notations, and 1
5208 * for cert notations.
5211 add_notation_data( const char *string, int which )
5213 struct notation *notation;
5215 notation=string_to_notation(string,utf8_strings);
5220 notation->next=opt.cert_notations;
5221 opt.cert_notations=notation;
5225 notation->next=opt.sig_notations;
5226 opt.sig_notations=notation;
5232 add_policy_url( const char *string, int which )
5234 unsigned int i,critical=0;
5243 for(i=0;i<strlen(string);i++)
5244 if( !isascii (string[i]) || iscntrl(string[i]))
5247 if(i==0 || i<strlen(string))
5250 log_error(_("the given certification policy URL is invalid\n"));
5252 log_error(_("the given signature policy URL is invalid\n"));
5256 sl=add_to_strlist( &opt.cert_policy_url, string );
5258 sl=add_to_strlist( &opt.sig_policy_url, string );
5265 add_keyserver_url( const char *string, int which )
5267 unsigned int i,critical=0;
5276 for(i=0;i<strlen(string);i++)
5277 if( !isascii (string[i]) || iscntrl(string[i]))
5280 if(i==0 || i<strlen(string))
5285 log_error(_("the given preferred keyserver URL is invalid\n"));
5291 sl=add_to_strlist( &opt.sig_keyserver_url, string );
5299 read_sessionkey_from_fd (int fd)
5304 if (! gnupg_fd_valid (fd))
5305 log_fatal ("override-session-key-fd is invalid: %s\n", strerror (errno));
5307 for (line = NULL, i = len = 100; ; i++ )
5313 line = xmalloc_secure (len);
5316 memcpy (line, tmp, i);
5322 if (read (fd, line + i, 1) != 1 || line[i] == '\n')
5326 log_debug ("seskey: %s\n", line);
5327 gpgrt_annotate_leaked_object (line);
5328 opt.override_session_key = line;