[gnutls-dev] sign callback for certificate authentication

Ludovic Courtès ludovic.courtes at laas.fr
Mon Apr 16 14:15:22 CEST 2007


Hi,

"Jacob Berkman" <jberkman at novell.com> writes:

> I've attached a patch to gnutls which adds a callback for the signing
> step of certificate-based authentication.  This was needed because
> some smart card policies do not allow private keys to be read/exported
> from them.  They implement signing directly on the card.

I think this is a very good idea.

However, in your patch, you defined signing functions as:

  typedef int gnutls_certificate_client_sign_function (gnutls_session_t session,
                                                       gnutls_datum_t * cert,
                                                       gnutls_certificate_type_t cert_type,
                                                       const gnutls_datum_t *hash_concat,
                                                       gnutls_datum_t *
                                                       signature);

I think this suffers from the same shortcomings as most call-backs
defined in GnuTLS: one cannot attach additional data to be passed along
to the sign function.

Thus, I would instead recommend adding a `void *' parameter to
`gnutls_certificate_client_sign_function'; the
`gnutls_certificate_client_set_sign_function ()' needs to be modified
accordingly:

  void gnutls_certificate_client_set_sign_function
    (gnutls_certificate_credentials_t cred,
     gnutls_certificate_client_sign_function * func,
     void *user_data);

This way, USER_DATA would be passed as the last argument of FUNC each
time it is called.


Call-back APIs that fail to provide this make it hard to communicate
information to call-backs in a "safe" way: one has to resort to global
variables or some such, which makes code harder to read and is not
recommended in multi-threaded applications.  Likewise, it makes it hard
to implement bindings for higher-level languages.

Thanks,
Ludovic.





More information about the Gnutls-devel mailing list