/* External signing. */
if (!pkey)
{
+ int ret;
+
if (!session->internals.sign_func)
return GNUTLS_E_INSUFFICIENT_CREDENTIALS;
- return (*session->internals.sign_func)
- (session, session->internals.sign_func_userdata,
- cert->cert_type, &cert->raw, hash_concat, signature);
+ if (!_gnutls_version_has_selectable_sighash (ver))
+ return (*session->internals.sign_func)
+ (session, session->internals.sign_func_userdata,
+ cert->cert_type, &cert->raw, hash_concat, signature);
+ else
+ {
+ gnutls_datum_t digest;
+
+ ret = _gnutls_set_datum(&digest, hash_concat->data, hash_concat->size);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ ret = pk_prepare_hash (gnutls_privkey_get_pk_algorithm(pkey, NULL), hash_algo, &digest);
+ if (ret < 0)
+ {
+ gnutls_assert ();
+ goto es_cleanup;
+ }
+
+ ret = (*session->internals.sign_func)
+ (session, session->internals.sign_func_userdata,
+ cert->cert_type, &cert->raw, &digest, signature);
+es_cleanup:
+ gnutls_free(digest.data);
+
+ return ret;
+ }
}
}