gnutls_privkey_deinit_func deinit_func;
gnutls_privkey_info_func info_func;
void *userdata;
+ unsigned bits;
} ext;
} key;
* (obtained with GNUTLS_FLAGS_TO_SIGN_ALGO) is supported.
*/
#define GNUTLS_PRIVKEY_INFO_HAVE_SIGN_ALGO (1<<2)
+/* Should return the number of bits of the public key algorithm (required for RSA-PSS)
+ * It is the value that should be retuned by gnutls_pubkey_get_pk_algorithm() */
+#define GNUTLS_PRIVKEY_INFO_PK_ALGO_BITS (1<<3)
/* returns information on the public key associated with userdata */
typedef int (*gnutls_privkey_info_func) (gnutls_privkey_t key, unsigned int flags, void *userdata);
return gnutls_x509_privkey_get_pk_algorithm(key->key.x509);
case GNUTLS_PRIVKEY_EXT:
if (bits)
- *bits = 0;
+ *bits = key->key.ext.bits;
+
return key->pk_algorithm;
default:
gnutls_assert();
* unless prohibited by the type of the algorithm (e.g., as with Ed25519).
*
* The @info_fn must provide information on the signature algorithms supported by
- * this private key, and should support the flags %GNUTLS_PRIVKEY_INFO_PK_ALGO and
- * %GNUTLS_PRIVKEY_INFO_HAVE_SIGN_ALGO. It must return -1 on unknown flags.
+ * this private key, and should support the flags %GNUTLS_PRIVKEY_INFO_PK_ALGO,
+ * %GNUTLS_PRIVKEY_INFO_HAVE_SIGN_ALGO and %GNUTLS_PRIVKEY_INFO_PK_ALGO_BITS.
+ * It must return -1 on unknown flags.
*
* Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
* negative error value.
pkey->pk_algorithm = pkey->key.ext.info_func(pkey, GNUTLS_PRIVKEY_INFO_PK_ALGO, pkey->key.ext.userdata);
+ ret = pkey->key.ext.info_func(pkey, GNUTLS_PRIVKEY_INFO_PK_ALGO_BITS, pkey->key.ext.userdata);
+ if (ret >= 0)
+ pkey->key.ext.bits = ret;
+
/* Ensure gnutls_privkey_deinit() calls the deinit_func */
if (deinit_fn)
pkey->flags |= GNUTLS_PRIVKEY_IMPORT_AUTO_RELEASE;
gnutls_privkey_t rkey; /* the real thing */
unsigned pk;
unsigned sig;
+ unsigned bits;
};
static int key_cb_info_func(gnutls_privkey_t key, unsigned int flags, void *userdata)
if (flags & GNUTLS_PRIVKEY_INFO_PK_ALGO)
return p->pk;
+ else if (flags & GNUTLS_PRIVKEY_INFO_PK_ALGO_BITS)
+ return p->bits;
else if (flags & GNUTLS_PRIVKEY_INFO_HAVE_SIGN_ALGO) {
unsigned sig = GNUTLS_FLAGS_TO_SIGN_ALGO(flags);
if (ret < 0)
fail("gnutls_privkey_import\n");
+ gnutls_privkey_get_pk_algorithm(userdata->rkey, &userdata->bits);
+
userdata->pk = pk;
userdata->sig = sig;
gnutls_privkey_t rkey; /* the real thing */
unsigned pk;
unsigned sig;
+ unsigned bits;
};
static int key_cb_info_func(gnutls_privkey_t key, unsigned int flags, void *userdata)
if (flags & GNUTLS_PRIVKEY_INFO_PK_ALGO)
return p->pk;
+ else if (flags & GNUTLS_PRIVKEY_INFO_PK_ALGO_BITS)
+ return p->bits;
else if (flags & GNUTLS_PRIVKEY_INFO_HAVE_SIGN_ALGO) {
unsigned sig = GNUTLS_FLAGS_TO_SIGN_ALGO(flags);
if (ret < 0)
testfail("gnutls_privkey_import\n");
+ gnutls_privkey_get_pk_algorithm(userdata->rkey, &userdata->bits);
+
userdata->pk = pk;
userdata->sig = sig;