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);