gpgme 0.3.3 questions

Werner Koch wk at
Fri Sep 28 13:00:01 CEST 2001

On Thu, 27 Sep 2001 11:52:31 +0200, Stephane Corthesy said:

> How is it possible to write GpgmeData initialized with  
> gpgme_data_new_with_read_cb(), with gpgme_data_new_from_file(), with  
> gpgme_data_new_from_filepart() ?

I don't understand this.

> I still don't understand why it would do this. Would it return an  
> error code?

No, it just returns 0 for the number of bytes read.  EOF is returned
as an error code.   

> If I ask for length, how can I sure that it returned me the real  
> length (up to EOF)?

It either does return the entire length or returns with an error

> Do we really need to call rewind before ever trying to read a data?  
> If we just inited the data, we don't, do we?

Better do a rewind before you start to read.

> In GpgmeRecipients, would it be possible to provide a function which  
> would return the validity assigned to a name contained in the  
> GpgmeRecipients instance?


> BTW, here's another bug: it it not possible to retrieve fingerprints  
> for subkeys


On Thu, 27 Sep 2001 18:57:53 +0200, Stephane Corthesy said:

> - Is there a particular return code we can expect when sign  
> operation has been cancelled, either user cancelled entry, or program  
> aborted context operation? Can we always expect GPGME_No_Data to be  
> returned for this case only?

GPGME_Canceled should be returned, nowever this does not yet work.

> - There is an inconsistent behaviour: if we pass three times an  
> invalid (but non empty) passphrase, return code is GPGME_No_Data, but  
> if we pass three times an empty (and invalid) passphrase, we get  
> GPGME_No_Passphrase.

Will be fixed.

> passphrase callback. If I use the same GpgmeContext as the one which  
> is currently asking for a passphrase, my app crashes: the r_hd in
> the  

You should not do this - I have to add checks to return an error.

> callback has become invalid; if I use a brand new one, the callback  
> is called recursively, when I ask to enumerate keys.


> Seems there is no way to retrieve the corresponding GpgmeKey during  
> passphrase callback... This could be OK when signing, 'cause I know  

Must be fixed.

> - Currently there is no way to perform encrypt+sign operations!!!  
> gpgme_signers_add() cannot be used for gpgme_op_encrypt().

I know but this is a minor problem compared to the fact that it is not
possible to decrypt and check the signature.  I don't know what
application you have currently in mind, my primary target are MUAs and
tehre is is better not to use the combined method but first sign, pack
this into a MIEM object and the encrypt this MIME object again.  The
big advantage is that you can remove the encryption layer and still
keep the signature.  

> - Is there a way to get the currently used hash algorithm? Or to set  
> it in a GpgmeContext operation?

Yes, here is my code from Sylpheed to do this (src/rfc2015.c, don't
know whether this is already in the current CVS):


        char *siginfo;
        sigdata = pgp_sign (plain, ac, &siginfo); 
        if (siginfo) {
            micalg = extract_micalg (siginfo);
            free (siginfo);

 * Find TAG in XML and return a pointer into xml set just behind the
 * closing angle.  Return NULL if not found. 
static const char *
find_xml_tag (const char *xml, const char *tag)
    int taglen = strlen (tag);
    const char *s = xml;
    while ( (s = strchr (s, '<')) ) {
        if (!strncmp (s, tag, taglen)) {
            const char *s2 = s + taglen;
            if (*s2 == '>' || isspace (*(const unsigned char*)s2) ) {
                /* found */
                while (*s2 && *s2 != '>') /* skip attributes */
                /* fixme: do need to handle angles inside attribute vallues? */
                return *s2? (s2+1):NULL;
        while (*s && *s != '>') /* skip to end of tag */
    return NULL;

 * Extract the micalg from an GnupgOperationInfo XML container.
const char *
extract_micalg (char *xml)
    const char *s;

    s = find_xml_tag (xml, "GnupgOperationInfo");
    if (s) {
        const char *s_end = find_xml_tag (s, "/GnupgOperationInfo");
        s = find_xml_tag (s, "signature");
        if (s && s_end && s < s_end) {
            const char *s_end2 = find_xml_tag (s, "/signature");
            if (s_end2 && s_end2 < s_end) {
                s = find_xml_tag (s, "micalg");
                if (s && s < s_end2) {
                    s_end = strchr (s, '<');
                    if (s_end) {
                        char *p = g_malloc (s_end - s + 1);
                        memcpy (p, s, s_end - s);
                        p[s_end-s] = 0;
                        return p;
    return NULL;


Werner Koch        Omnis enim res, quae dando non deficit, dum habetur
g10 Code GmbH      et non datur, nondum habetur, quomodo habenda est.
Privacy Solutions                                        -- Augustinus

More information about the Gnupg-devel mailing list