Add nonce generator interface
Nonce generators (nonce_gen_t) can be used to get or allocate nonces. Users can request nonce generators from the crypto factory while nonce plugins register/remove themselves to/from the crypto factory.
This commit is contained in:
committed by
Tobias Brunner
parent
80c5b17d1a
commit
e2fc09c186
@@ -29,6 +29,7 @@ ENUM(plugin_feature_names, FEATURE_NONE, FEATURE_CUSTOM,
|
||||
"PRF",
|
||||
"DH",
|
||||
"RNG",
|
||||
"NONCE_GEN",
|
||||
"PRIVKEY",
|
||||
"PRIVKEY_GEN",
|
||||
"PRIVKEY_SIGN",
|
||||
@@ -74,6 +75,8 @@ bool plugin_feature_matches(plugin_feature_t *a, plugin_feature_t *b)
|
||||
return a->arg.dh_group == b->arg.dh_group;
|
||||
case FEATURE_RNG:
|
||||
return a->arg.rng_quality <= b->arg.rng_quality;
|
||||
case FEATURE_NONCE_GEN:
|
||||
return TRUE;
|
||||
case FEATURE_PRIVKEY:
|
||||
case FEATURE_PRIVKEY_GEN:
|
||||
case FEATURE_PUBKEY:
|
||||
@@ -172,6 +175,12 @@ char* plugin_feature_get_string(plugin_feature_t *feature)
|
||||
return str;
|
||||
}
|
||||
break;
|
||||
case FEATURE_NONCE_GEN:
|
||||
if (asprintf(&str, "%N", plugin_feature_names, feature->type) > 0)
|
||||
{
|
||||
return str;
|
||||
}
|
||||
break;
|
||||
case FEATURE_PRIVKEY:
|
||||
case FEATURE_PRIVKEY_GEN:
|
||||
case FEATURE_PUBKEY:
|
||||
@@ -301,6 +310,10 @@ bool plugin_feature_load(plugin_t *plugin, plugin_feature_t *feature,
|
||||
lib->crypto->add_rng(lib->crypto, feature->arg.rng_quality,
|
||||
name, reg->arg.reg.f);
|
||||
break;
|
||||
case FEATURE_NONCE_GEN:
|
||||
lib->crypto->add_nonce_gen(lib->crypto,
|
||||
name, reg->arg.reg.f);
|
||||
break;
|
||||
case FEATURE_PRIVKEY:
|
||||
case FEATURE_PRIVKEY_GEN:
|
||||
lib->creds->add_builder(lib->creds, CRED_PRIVATE_KEY,
|
||||
@@ -372,6 +385,9 @@ bool plugin_feature_unload(plugin_t *plugin, plugin_feature_t *feature,
|
||||
case FEATURE_RNG:
|
||||
lib->crypto->remove_rng(lib->crypto, reg->arg.reg.f);
|
||||
break;
|
||||
case FEATURE_NONCE_GEN:
|
||||
lib->crypto->remove_nonce_gen(lib->crypto, reg->arg.reg.f);
|
||||
break;
|
||||
case FEATURE_PRIVKEY:
|
||||
case FEATURE_PRIVKEY_GEN:
|
||||
lib->creds->remove_builder(lib->creds, reg->arg.reg.f);
|
||||
|
||||
@@ -107,6 +107,8 @@ struct plugin_feature_t {
|
||||
FEATURE_DH,
|
||||
/** rng_t */
|
||||
FEATURE_RNG,
|
||||
/** nonce_gen_t */
|
||||
FEATURE_NONCE_GEN,
|
||||
/** generic private key support */
|
||||
FEATURE_PRIVKEY,
|
||||
/** generating new private keys */
|
||||
@@ -258,6 +260,7 @@ struct plugin_feature_t {
|
||||
#define _PLUGIN_FEATURE_PRF(kind, alg) __PLUGIN_FEATURE(kind, PRF, .prf = alg)
|
||||
#define _PLUGIN_FEATURE_DH(kind, group) __PLUGIN_FEATURE(kind, DH, .dh_group = group)
|
||||
#define _PLUGIN_FEATURE_RNG(kind, quality) __PLUGIN_FEATURE(kind, RNG, .rng_quality = quality)
|
||||
#define _PLUGIN_FEATURE_NONCE_GEN(kind, ...) __PLUGIN_FEATURE(kind, NONCE_GEN, .custom = NULL)
|
||||
#define _PLUGIN_FEATURE_PRIVKEY(kind, type) __PLUGIN_FEATURE(kind, PRIVKEY, .privkey = type)
|
||||
#define _PLUGIN_FEATURE_PRIVKEY_GEN(kind, type) __PLUGIN_FEATURE(kind, PRIVKEY_GEN, .privkey_gen = type)
|
||||
#define _PLUGIN_FEATURE_PRIVKEY_SIGN(kind, scheme) __PLUGIN_FEATURE(kind, PRIVKEY_SIGN, .privkey_sign = scheme)
|
||||
@@ -284,6 +287,7 @@ struct plugin_feature_t {
|
||||
#define _PLUGIN_FEATURE_REGISTER_PRF(type, f) __PLUGIN_FEATURE_REGISTER(type, f)
|
||||
#define _PLUGIN_FEATURE_REGISTER_DH(type, f) __PLUGIN_FEATURE_REGISTER(type, f)
|
||||
#define _PLUGIN_FEATURE_REGISTER_RNG(type, f) __PLUGIN_FEATURE_REGISTER(type, f)
|
||||
#define _PLUGIN_FEATURE_REGISTER_NONCE_GEN(type, f) __PLUGIN_FEATURE_REGISTER(type, f)
|
||||
#define _PLUGIN_FEATURE_REGISTER_PRIVKEY(type, f, final) __PLUGIN_FEATURE_REGISTER_BUILDER(type, f, final)
|
||||
#define _PLUGIN_FEATURE_REGISTER_PRIVKEY_GEN(type, f, final)__PLUGIN_FEATURE_REGISTER_BUILDER(type, f, final)
|
||||
#define _PLUGIN_FEATURE_REGISTER_PUBKEY(type, f, final) __PLUGIN_FEATURE_REGISTER_BUILDER(type, f, final)
|
||||
|
||||
Reference in New Issue
Block a user