gpgme_data_new_from_mem works, gpgme_data_write doesn't
Marcus Brinkmann
marcus.brinkmann at ruhr-uni-bochum.de
Thu Jul 31 02:49:41 CEST 2008
At Mon, 7 Jul 2008 00:10:10 +0200,
Nico Schottelius <nico-gnupg-dev-0 at schottelius.org> wrote:
>
> [1 <multipart/signed (7bit)>]
> [1.1 <text/plain; us-ascii (quoted-printable)>]
> Hello!
>
> I am testing around with gpgme and it seems I am doing something
> wrong with gpgme_data_write():
>
> If I do
>
> gerr = gpgme_data_new(&g_test);
> if(gerr != GPG_ERR_NO_ERROR) return 20;
> i = strlen(b_encrypt);
>
> /* THIS WORKS */
> gerr = gpgme_data_new_from_mem(&g_encrypt_send, b_encrypt, i, 1);
> if(gerr != GPG_ERR_NO_ERROR) return 24;
>
> /* decrypt: from gpgme_data_new_from_mem() */
> gerr = gpgme_op_decrypt(g_context, g_encrypt_send, g_plain_recv);
> if(gerr != GPG_ERR_NO_ERROR) {
> printf("gerr=%d\n",gerr);
> return 19;
> }
>
>
> it works. If I do
>
> gerr = gpgme_data_new(&g_test);
> if(gerr != GPG_ERR_NO_ERROR) return 20;
> i = strlen(b_encrypt);
> printf("strlen(%s) = %d\n",b_encrypt,i);
>
> /* THIS DOES NOT WORK */
> tmp = gpgme_data_write(g_test, b_encrypt, i);
> printf("gpgmedatawrite: %d\n", tmp);
>
> /* decrypt: from gpgme_data_write() */
> gerr = gpgme_op_decrypt(g_context, g_test, g_plain_recv2);
> if(gerr != GPG_ERR_NO_ERROR) {
> printf("gerr=%d\n",gerr);
> return 41;
> }
>
> it does *NOT* work.
As I wrote before: "gpgme data objects have a file pointer that must
be rewound to read written data (gpgme_data_seek). To use the seek
function make sure you compile with large file support. See the
documentation."
The gpgme_data_write() above works just fine, but after it the file
pointer is at the end of the data, and the gpgme_op_decrypt sees an
empty data buffer:
g_test: some-data
^
| "file" pointer
You need to rewind the file pointer to the beginning after
gpgme_data_write. Please see the documentation, and take notice of
the large file support necessary when using gpgme_data_seek.
Thanks,
Marcus
More information about the Gnupg-devel
mailing list