gpgme fails encrypting on 64bit debian
Hi, I'm facing a problem which is giving me a bit of troubles to trace with gpgme. I've reproduced it with a simple test program (starting from another simple example I found) which I paste below. This works on a 32-bit debian-based system but fails on 64-bit one. In particular in the 64-bit case I can successfully read and decrypt (not shown in the example) but I get a rather cryptic error in the encryption: $ ./test2 C37DBF71 Ciao! version=1.2.0 Protocol name: OpenPGP file=/usr/bin/gpg, home=(null) Error in encrypting data. Error 1: General error (Unspecified source) The version of libgpgme is shown above as well. GnuPG version 1.4.11 This is the output of uname, just to show you I'm running on 64 bit system: $ uname -a Linux spagan-laptop 3.2.0-39-generic #62-Ubuntu SMP Thu Feb 28 00:28:53 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux Yes, the first thing I've done was to extensively trying to make sure I was defining _FILE_OFFSET_BITS=64; also I checked that off_t has effectively size of 8. This is how I compile it: gcc -m64 -D_FILE_OFFSET_BITS=64 -g test2.c -lgpgme -L/usr/lib/x86_64-linux-gnu -lgpg-error -o test2 and finally below there's the test program I used. Thanks a lot for any help you could give me! I haven't found anything much useful around yet to help me debug this.. (including a rough search in this mailing list archives). Please let me know if you need additional info! Cheers, Simone // test program #include stdio.h /* printf*/ #include unistd.h /* write */ #include errno.h /* errno */ #include locale.h /* locale support*/ #include string.h /* string support*/ #include stdlib.h /* memory management */ #define SIZE 1024 int main(int argc, char **argv) { if (argc 2) { printf(ERROR. Usage: %s key message\n, argv[0]); return -1; } char *m_key = argv[1]; char *pSource = argv[2]; char *pDest = malloc(65536); char *p; char buf[SIZE]; size_t read_bytes; int tmp; gpgme_ctx_t ceofcontext; gpgme_error_t err; gpgme_data_t data; gpgme_engine_info_t enginfo; /* The function `gpgme_check_version' must be called before any other * function in the library, because it initializes the thread support * subsystem in GPGME. (from the info page) */ setlocale (LC_ALL, ); p = (char *) gpgme_check_version(NULL); printf(version=%s\n,p); /* set locale, because tests do also */ gpgme_set_locale(NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL)); /* check for OpenPGP support */ err = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP); if(err != GPG_ERR_NO_ERROR) return 1; p = (char *) gpgme_get_protocol_name(GPGME_PROTOCOL_OpenPGP); printf(Protocol name: %s\n,p); /* get engine information */ err = gpgme_get_engine_info(enginfo); if(err != GPG_ERR_NO_ERROR) return 2; printf(file=%s, home=%s\n,enginfo-file_name,enginfo-home_dir); /* create our own context */ err = gpgme_new(ceofcontext); if(err != GPG_ERR_NO_ERROR) return 3; /* set protocol to use in our context */ err = gpgme_set_protocol(ceofcontext,GPGME_PROTOCOL_OpenPGP); if(err != GPG_ERR_NO_ERROR) return 4; /* set engine info in our context; I changed it for ceof like this: err = gpgme_ctx_set_engine_info (ceofcontext, GPGME_PROTOCOL_OpenPGP, /usr/bin/gpg,/home/user/nico/.ceof/gpg/); but I'll use standard values for this example: */ err = gpgme_ctx_set_engine_info (ceofcontext, GPGME_PROTOCOL_OpenPGP, enginfo-file_name,enginfo-home_dir); if(err != GPG_ERR_NO_ERROR) return 5; /* do ascii armor data, so output is readable in console */ gpgme_set_armor(ceofcontext, 1); gpgme_data_t source; gpgme_data_t dest; //get key to encrypt, get the first key gpgme_key_t key[2]; err = gpgme_op_keylist_start(ceofcontext, m_key, 0); err = gpgme_op_keylist_next (ceofcontext, key); if (err) { printf(Key not found in current key-ring: %s\n, m_key); return 1; } key[1] = 0; //set to NULL the second entry //point to source buffer err = gpgme_data_new_from_mem(source, pSource, strlen(pSource), 0); if (err != GPG_ERR_NO_ERROR) { printf(Error in reading data to encrypt. Error %d: %s (%s)\n, gpgme_err_code(err), gpgme_strerror(err), gpgme_strsource(err)); return 2; } //create dest buffer err = gpgme_data_new(dest); if (err != GPG_ERR_NO_ERROR) { printf(Error in creating output data buffer to encrypt. Error %d: %s (%s)\n, gpgme_err_code(err), gpgme_strerror(err), gpgme_strsource(err)); return 3; } //encrypt text gpgme_encrypt_flags_t flags; flags = GPGME_ENCRYPT_NO_ENCRYPT_TO; //only specified recipient, no defaults please err = gpgme_op_encrypt(ceofcontext, key, flags, source, dest); if (err != GPG_ERR_NO_ERROR) { printf(Error in encrypting data. Error %d: %s (%s)\n, gpgme_err_code(err), gpgme_strerror(err), gpgme_strsource(err)); return 4; } //retrieve result
Re: gpgme fails encrypting on 64bit debian
On Wed, 10 Apr 2013 10:54, simone.pagangr...@gmail.com said: gcc -m64 -D_FILE_OFFSET_BITS=64 -g test2.c -lgpgme -L/usr/lib/x86_64-linux-gnu -lgpg-error -o test2 Why do you want to tweak gcc options if you are anyway on a 64 bit system? Also they seem to be harmelss, hast gpgme been build with the same options? What does gpgme-config --cflags --libs tell you? // test program #include stdio.h /* printf*/ #include unistd.h /* write */ #include errno.h /* errno */ #include locale.h /* locale support*/ #include string.h /* string support*/ #include stdlib.h /* memory management */ gpgme.h ist missing but below you are using constants defined by gpgme.h. char *pDest = malloc(65536); (please always check for malloc error!) p = (char *) gpgme_check_version(NULL); printf(version=%s\n,p); Don't cast without a good reason. p = (char *) gpgme_get_protocol_name(GPGME_PROTOCOL_OpenPGP); printf(Protocol name: %s\n,p); Ditto. err = gpgme_ctx_set_engine_info (ceofcontext, GPGME_PROTOCOL_OpenPGP, enginfo-file_name,enginfo-home_dir); if(err != GPG_ERR_NO_ERROR) return 5; Try first without setting a non default engine info. To debug your problem, I suggest to run the program like this: GPGME_DEBUG=9:/tmp/gpgme.log: and check the log file. Shalom-Salam, Werner -- Die Gedanken sind frei. Ausnahmen regelt ein Bundesgesetz. ___ Gnupg-users mailing list Gnupg-users@gnupg.org http://lists.gnupg.org/mailman/listinfo/gnupg-users
Reading key capabilities information before importing a key
Hello all, I'm trying to find a way to list the key capabilities of a key before importing it. I can obtain some basic information by using the command (I've seen this one in the mailing list archives): gpg2 --with-colons test.key The only catch being that the above command will not list the key capabilities for the keys contained in a file. Any way to obtain this information without importing the key into keyring? I'm using GnuPG 2.0.19 with libgcrypt 1.5.0 on Debian Wheezy 64-bit. Best regards -- Branko Majic Jabber: bra...@majic.rs Please use only Free formats when sending attachments to me. Бранко Мајић Џабер: bra...@majic.rs Молим вас да додатке шаљете искључиво у слободним форматима. signature.asc Description: PGP signature ___ Gnupg-users mailing list Gnupg-users@gnupg.org http://lists.gnupg.org/mailman/listinfo/gnupg-users
Re: Reading key capabilities information before importing a key
Am Mi 10.04.2013, 22:57:53 schrieb Branko Majic: Hello all, I'm trying to find a way to list the key capabilities of a key before importing it. I can obtain some basic information by using the command (I've seen this one in the mailing list archives): gpg2 --with-colons test.key The only catch being that the above command will not list the key capabilities for the keys contained in a file. Any way to obtain this information without importing the key into keyring? Two possibilities: 1) gpg --list-packets hauke__0x1a571df5.asc [...] :public sub key packet: version 4, algo 1, created 1352000413, expires 0 pkey[0]: [2048 bits] pkey[1]: [17 bits] keyid: 486B17AB3F96AD8E :signature packet: algo 1, keyid BF4B8EEF1A571DF5 version 4, created 1352000413, md5len 0, sigclass 0x18 digest algo 2, begin of digest c1 78 hashed subpkt 2 len 4 (sig created 2012-11-04) hashed subpkt 27 len 1 (key flags: 02) [...] Subpacket class 27 is the key capabilities. [http://www.ietf.org/rfc/rfc4880.txt] First octet: 0x01 - This key may be used to certify other keys. 0x02 - This key may be used to sign data. 0x04 - This key may be used to encrypt communications. 0x08 - This key may be used to encrypt storage. 0x10 - The private component of this key may have been split by a secret-sharing mechanism. 0x20 - This key may be used for authentication. 0x80 - The private component of this key may be in the possession of more than one person. 2) You import the key but direct it to a different keyring, see --keyring --secret-keyring --primary-keyring --no-default-keyring Hauke -- ☺ PGP: 7D82 FB9F D25A 2CE4 5241 6C37 BF4B 8EEF 1A57 1DF5 (seit 2012-11-04) http://www.openpgp-schulungen.de/ signature.asc Description: This is a digitally signed message part. ___ Gnupg-users mailing list Gnupg-users@gnupg.org http://lists.gnupg.org/mailman/listinfo/gnupg-users
gpa reports error: Unsupported Protocol
gpa 0.9.3 gpgme 1.3.2 FreeBSD 8.3-STABLE -- amd64 GPA continually displays an error screen when I start it. The screen image is available here: http://www.seibercom.net/logs/gpa-error.png I have tried rebuilding the entire port, but the problem persists. I would welcome any suggestions. -- Jerry ♔ Disclaimer: off-list followups get on-list replies or get ignored. Please do not ignore the Reply-To header. __ ___ Gnupg-users mailing list Gnupg-users@gnupg.org http://lists.gnupg.org/mailman/listinfo/gnupg-users