214
214
    fprintf(stderr, "bad gpgme_op_decrypt: %s: %s\n",
 
215
215
            gpgme_strsource(rc), gpgme_strerror(rc));
 
216
216
    plaintext_length = -1;
 
 
218
      gpgme_decrypt_result_t result;
 
 
219
      result = gpgme_op_decrypt_result(ctx);
 
 
221
        fprintf(stderr, "gpgme_op_decrypt_result failed\n");
 
 
223
        fprintf(stderr, "Unsupported algorithm: %s\n",
 
 
224
                result->unsupported_algorithm);
 
 
225
        fprintf(stderr, "Wrong key usage: %u\n",
 
 
226
                result->wrong_key_usage);
 
 
227
        if(result->file_name != NULL){
 
 
228
          fprintf(stderr, "File name: %s\n", result->file_name);
 
 
230
        gpgme_recipient_t recipient;
 
 
231
        recipient = result->recipients;
 
 
233
          while(recipient != NULL){
 
 
234
            fprintf(stderr, "Public key algorithm: %s\n",
 
 
235
                    gpgme_pubkey_algo_name(recipient->pubkey_algo));
 
 
236
            fprintf(stderr, "Key ID: %s\n", recipient->keyid);
 
 
237
            fprintf(stderr, "Secret key available: %s\n",
 
 
238
                    recipient->status == GPG_ERR_NO_SECKEY
 
 
240
            recipient = recipient->next;
 
217
245
    goto decrypt_end;
 
 
221
249
    fprintf(stderr, "Decryption of OpenPGP data succeeded\n");
 
225
 
    gpgme_decrypt_result_t result;
 
226
 
    result = gpgme_op_decrypt_result(ctx);
 
228
 
      fprintf(stderr, "gpgme_op_decrypt_result failed\n");
 
230
 
      fprintf(stderr, "Unsupported algorithm: %s\n",
 
231
 
              result->unsupported_algorithm);
 
232
 
      fprintf(stderr, "Wrong key usage: %u\n",
 
233
 
              result->wrong_key_usage);
 
234
 
      if(result->file_name != NULL){
 
235
 
        fprintf(stderr, "File name: %s\n", result->file_name);
 
237
 
      gpgme_recipient_t recipient;
 
238
 
      recipient = result->recipients;
 
240
 
        while(recipient != NULL){
 
241
 
          fprintf(stderr, "Public key algorithm: %s\n",
 
242
 
                  gpgme_pubkey_algo_name(recipient->pubkey_algo));
 
243
 
          fprintf(stderr, "Key ID: %s\n", recipient->keyid);
 
244
 
          fprintf(stderr, "Secret key available: %s\n",
 
245
 
                  recipient->status == GPG_ERR_NO_SECKEY
 
247
 
          recipient = recipient->next;
 
253
252
  /* Seek back to the beginning of the GPGME plaintext data buffer */
 
254
253
  if (gpgme_data_seek(dh_plain, (off_t) 0, SEEK_SET) == -1){
 
255
254
    perror("pgpme_data_seek");
 
 
352
 
    fprintf(stderr, "Attempting to use OpenPGP certificate %s"
 
353
 
            " and keyfile %s as GnuTLS credentials\n", pubkeyfilename,
 
 
351
    fprintf(stderr, "Attempting to use OpenPGP public key %s and"
 
 
352
            " secret key %s as GnuTLS credentials\n", pubkeyfilename,
 
 
362
361
            "Error[%d] while reading the OpenPGP key pair ('%s',"
 
363
362
            " '%s')\n", ret, pubkeyfilename, seckeyfilename);
 
364
 
    fprintf(stdout, "The GnuTLS error is: %s\n",
 
 
363
    fprintf(stderr, "The GnuTLS error is: %s\n",
 
365
364
            safer_gnutls_strerror(ret));
 
 
773
773
    const char *pubkeyname = "pubkey.txt";
 
774
774
    const char *seckeyname = "seckey.txt";
 
775
775
    mandos_context mc = { .simple_poll = NULL, .server = NULL,
 
776
 
                          .dh_bits = 1024, .priority = "SECURE256"};
 
 
776
                          .dh_bits = 1024, .priority = "SECURE256"
 
 
777
                          ":!CTYPE-X.509:+CTYPE-OPENPGP" };
 
777
778
    bool gnutls_initalized = false;
 
 
781
782
        { .name = "debug", .key = 128,
 
782
783
          .doc = "Debug mode", .group = 3 },
 
783
784
        { .name = "connect", .key = 'c',
 
785
 
          .doc = "Connect directly to a sepcified mandos server",
 
 
785
          .arg = "ADDRESS:PORT",
 
 
786
          .doc = "Connect directly to a specific Mandos server",
 
787
788
        { .name = "interface", .key = 'i',
 
789
 
          .doc = "Interface that Avahi will conntect through",
 
 
790
          .doc = "Interface that will be used to search for Mandos"
 
791
793
        { .name = "keydir", .key = 'd',
 
793
 
          .doc = "Directory where the openpgp keyring is",
 
 
795
          .doc = "Directory to read the OpenPGP key files from",
 
795
797
        { .name = "seckey", .key = 's',
 
797
 
          .doc = "Secret openpgp key for gnutls authentication",
 
 
799
          .doc = "OpenPGP secret key file base name",
 
799
801
        { .name = "pubkey", .key = 'p',
 
801
 
          .doc = "Public openpgp key for gnutls authentication",
 
 
803
          .doc = "OpenPGP public key file base name",
 
803
805
        { .name = "dh-bits", .key = 129,
 
805
 
          .doc = "dh-bits to use in gnutls communication",
 
 
807
          .doc = "Bit length of the prime number used in the"
 
 
808
          " Diffie-Hellman key exchange",
 
807
810
        { .name = "priority", .key = 130,
 
809
 
          .doc = "GNUTLS priority", .group = 1 },
 
 
812
          .doc = "GnuTLS priority string for the TLS handshake",
 
814
817
      error_t parse_opt (int key, char *arg,
 
815
818
                         struct argp_state *state) {
 
816
819
        /* Get the INPUT argument from `argp_parse', which we know is
 
817
820
           a pointer to our plugin list pointer. */
 
 
822
        case 128:               /* --debug */
 
 
825
        case 'c':               /* --connect */
 
823
826
          connect_to = arg;
 
 
828
        case 'i':               /* --interface */
 
 
831
        case 'd':               /* --keydir */
 
 
834
        case 's':               /* --seckey */
 
832
835
          seckeyname = arg;
 
 
837
        case 'p':               /* --pubkey */
 
835
838
          pubkeyname = arg;
 
 
840
        case 129:               /* --dh-bits */
 
839
842
          mc.dh_bits = (unsigned int) strtol(arg, NULL, 10);
 
 
858
861
      struct argp argp = { .options = options, .parser = parse_opt,
 
860
863
                           .doc = "Mandos client -- Get and decrypt"
 
861
 
                           " passwords from mandos server" };
 
 
864
                           " passwords from a Mandos server" };
 
862
865
      ret = argp_parse (&argp, argc, argv, 0, 0, NULL);
 
863
866
      if (ret == ARGP_ERR_UNKNOWN){
 
864
867
        fprintf(stderr, "Unknown error while parsing arguments\n");
 
 
987
990
      config.publish_addresses = 0;
 
988
991
      config.publish_workstation = 0;
 
989
992
      config.publish_domain = 0;
 
991
994
      /* Allocate a new server */
 
992
995
      mc.server = avahi_server_new(avahi_simple_poll_get
 
993
996
                                   (mc.simple_poll), &config, NULL,
 
996
999
      /* Free the Avahi configuration data */
 
997
1000
      avahi_server_config_free(&config);