Here is a snip from sshpk.h (SSH v3.2.9.1):
struct SshPkTypeRec
{
/* Name for key. Keys are named/typed as follows:
if-modn for RSA etc.
dl-modp for DSA, ElGamal etc.
ec-modp for ECDSA, ECElGamal etc.
ec-gf2n for ECDSA, etc.
*/
const char *name;
/* Special actions, for key management. I.e. things like inserting
parameters, fixing exponent etc. */
const SshPkAction *action_list;
/********************************************************************
-
- Group actions
********************************************************************/
void * (*pk_group_action_init)(void);
void * (*pk_group_action_make)(void *context);
void (*pk_group_action_free)(void *context);
- Group actions
Boolean (*pk_group_import)(const unsigned char *buf,
size_t length,
void **pk_group);
Boolean (*pk_group_export)(const void *pk_group,
unsigned char **buf,
size_t *length_return);
void (*pk_group_free)(void *pk_group);
void (*pk_group_copy)(void *op_src, void **op_dest);
char * (*pk_group_get_predefined_groups)(void);
void (*pk_group_precompute)(void *context);
/* Randomizer handling. */
unsigned int (*pk_group_count_randomizers)(void *pk_group);
Boolean (*pk_group_generate_randomizer)(void *pk_group);
Boolean (*pk_group_export_randomizer)(void *pk_group,
unsigned char **buf,
size_t *length_return);
Boolean (*pk_group_import_randomizer)(void *pk_group,
const unsigned char *buf,
size_t length);
/********************************************************************
-
- Public key actions
********************************************************************/
void *(*public_key_action_init)(void);
void *(*public_key_action_make)(void *context);
void (*public_key_action_free)(void *context);
- Public key actions
Boolean (*public_key_import)(const unsigned char *buf,
size_t len,
void **public_key);
Boolean (*public_key_export)(const void *public_key,
unsigned char **buf,
size_t *length_return);
void (*public_key_free)(void *public_key);
void (*public_key_copy)(void *op_src, void **op_dest);
void (*public_key_derive_pk_group)(void *public_key,
void **pk_group);
void (*public_key_precompute)(void *context);
/********************************************************************
-
- Private key actions
********************************************************************/
void *(*private_key_action_init)(void);
void *(*private_key_action_define)(void *context);
void *(*private_key_action_generate)(void *context);
void (*private_key_action_free)(void *context);
- Private key actions
Boolean (*private_key_import)(const unsigned char *buf,
size_t len,
void **private_key);
Boolean (*private_key_export)(const void *private_key,
unsigned char **buf,
size_t *length_return);
void (*private_key_free)(void *private_key);
void (*private_key_derive_public_key)(const void *private_key,
void **public_key);
void (*private_key_copy)(void *op_src, void **op_dest);
void (*private_key_derive_pk_group)(void *private_key,
void **pk_group);
void (*private_key_precompute)(void *context);
/* More to come… */
};
/* Maximum of provider slots. It is assumed that SSH modules will not
add very many providers. */
#define SSH_PK_TYPE_MAX_SLOTS 16
extern SshPkType const * ssh_pk_type_slots[SSH_PK_TYPE_MAX_SLOTS];
Here is a snip from sshcrypt.h:
/************************* Public key cryptography ************************/
typedef struct SshPkTypeRec SshPkType;
SshCryptoStatus ssh_pk_provider_register(const SshPkType *type);
#ifdef SSHDIST_CRYPT_RSA
extern const SshPkType ssh_pk_if_modn;
extern const SshPkType ssh_pk_if_modn_generator;
#endif /* SSHDIST_CRYPT_RSA */
#ifdef SSHDIST_CRYPT_DSA
extern const SshPkType ssh_pk_dl_modp;
extern const SshPkType ssh_pk_dl_modp_generator;
#endif /* SSHDIST_CRYPT_DSA */
I get an error “Variable has incomplete type” regarding all four:
ssh_pk_if_modn
ssh_pk_if_modn_generator
ssh_pk_if_modp
ssh_pk_if_modp_generator
How to solve the problem?
Tony.