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");
 
 
341
340
  /* OpenPGP credentials */
 
342
341
  gnutls_certificate_allocate_credentials(&mc->cred);
 
343
342
  if (ret != GNUTLS_E_SUCCESS){
 
344
 
    fprintf (stderr, "GnuTLS memory error: %s\n",
 
 
343
    fprintf (stderr, "GnuTLS memory error: %s\n", /* Spurious
 
345
345
             safer_gnutls_strerror(ret));
 
346
346
    gnutls_global_deinit ();
 
 
475
474
    fprintf(stderr, "Binding to interface %s\n", interface);
 
478
 
  memset(&to, 0, sizeof(to));   /* Spurious warning */
 
 
477
  memset(&to, 0, sizeof(to));
 
479
478
  to.in6.sin6_family = AF_INET6;
 
480
479
  /* It would be nice to have a way to detect if we were passed an
 
481
480
     IPv4 address here.   Now we assume an IPv6 address. */
 
 
772
773
    const char *pubkeyname = "pubkey.txt";
 
773
774
    const char *seckeyname = "seckey.txt";
 
774
775
    mandos_context mc = { .simple_poll = NULL, .server = NULL,
 
775
 
                          .dh_bits = 1024, .priority = "SECURE256"};
 
 
776
                          .dh_bits = 1024, .priority = "SECURE256"
 
 
777
                          ":!CTYPE-X.509:+CTYPE-OPENPGP" };
 
776
778
    bool gnutls_initalized = false;
 
 
780
782
        { .name = "debug", .key = 128,
 
781
783
          .doc = "Debug mode", .group = 3 },
 
782
784
        { .name = "connect", .key = 'c',
 
784
 
          .doc = "Connect directly to a sepcified mandos server",
 
 
785
          .arg = "ADDRESS:PORT",
 
 
786
          .doc = "Connect directly to a specific Mandos server",
 
786
788
        { .name = "interface", .key = 'i',
 
788
 
          .doc = "Interface that Avahi will conntect through",
 
 
790
          .doc = "Interface that will be used to search for Mandos"
 
790
793
        { .name = "keydir", .key = 'd',
 
792
 
          .doc = "Directory where the openpgp keyring is",
 
 
795
          .doc = "Directory to read the OpenPGP key files from",
 
794
797
        { .name = "seckey", .key = 's',
 
796
 
          .doc = "Secret openpgp key for gnutls authentication",
 
 
799
          .doc = "OpenPGP secret key file base name",
 
798
801
        { .name = "pubkey", .key = 'p',
 
800
 
          .doc = "Public openpgp key for gnutls authentication",
 
 
803
          .doc = "OpenPGP public key file base name",
 
802
805
        { .name = "dh-bits", .key = 129,
 
804
 
          .doc = "dh-bits to use in gnutls communication",
 
 
807
          .doc = "Bit length of the prime number used in the"
 
 
808
          " Diffie-Hellman key exchange",
 
806
810
        { .name = "priority", .key = 130,
 
808
 
          .doc = "GNUTLS priority", .group = 1 },
 
 
812
          .doc = "GnuTLS priority string for the TLS handshake",
 
813
817
      error_t parse_opt (int key, char *arg,
 
814
818
                         struct argp_state *state) {
 
815
819
        /* Get the INPUT argument from `argp_parse', which we know is
 
816
820
           a pointer to our plugin list pointer. */
 
 
822
        case 128:               /* --debug */
 
 
825
        case 'c':               /* --connect */
 
822
826
          connect_to = arg;
 
 
828
        case 'i':               /* --interface */
 
 
831
        case 'd':               /* --keydir */
 
 
834
        case 's':               /* --seckey */
 
831
835
          seckeyname = arg;
 
 
837
        case 'p':               /* --pubkey */
 
834
838
          pubkeyname = arg;
 
 
840
        case 129:               /* --dh-bits */
 
838
842
          mc.dh_bits = (unsigned int) strtol(arg, NULL, 10);
 
 
857
861
      struct argp argp = { .options = options, .parser = parse_opt,
 
859
863
                           .doc = "Mandos client -- Get and decrypt"
 
860
 
                           " passwords from mandos server" };
 
 
864
                           " passwords from a Mandos server" };
 
861
865
      ret = argp_parse (&argp, argc, argv, 0, 0, NULL);
 
862
866
      if (ret == ARGP_ERR_UNKNOWN){
 
863
867
        fprintf(stderr, "Unknown error while parsing arguments\n");
 
 
986
990
      config.publish_addresses = 0;
 
987
991
      config.publish_workstation = 0;
 
988
992
      config.publish_domain = 0;
 
990
994
      /* Allocate a new server */
 
991
995
      mc.server = avahi_server_new(avahi_simple_poll_get
 
992
996
                                   (mc.simple_poll), &config, NULL,
 
995
999
      /* Free the Avahi configuration data */
 
996
1000
      avahi_server_config_free(&config);