pf_key/xfrm_algo: prepare pf_key and xfrm_algo for new algorithms without pfkey support

Mark existing algorithms as pfkey supported and make pfkey only use algorithms
that have pfkey_supported set.

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
Jussi Kivilinna 2013-01-31 12:40:38 +02:00 committed by Steffen Klassert
parent cdfa1fe5c0
commit 7e50f84c94
3 changed files with 93 additions and 16 deletions

View file

@ -1320,6 +1320,7 @@ struct xfrm_algo_desc {
char *name; char *name;
char *compat; char *compat;
u8 available:1; u8 available:1;
u8 pfkey_supported:1;
union { union {
struct xfrm_algo_aead_info aead; struct xfrm_algo_aead_info aead;
struct xfrm_algo_auth_info auth; struct xfrm_algo_auth_info auth;
@ -1561,8 +1562,8 @@ extern void xfrm_input_init(void);
extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq); extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq);
extern void xfrm_probe_algs(void); extern void xfrm_probe_algs(void);
extern int xfrm_count_auth_supported(void); extern int xfrm_count_pfkey_auth_supported(void);
extern int xfrm_count_enc_supported(void); extern int xfrm_count_pfkey_enc_supported(void);
extern struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx); extern struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx);
extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx); extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx);
extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id); extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id);

View file

@ -815,18 +815,21 @@ static struct sk_buff *__pfkey_xfrm_state2msg(const struct xfrm_state *x,
sa->sadb_sa_auth = 0; sa->sadb_sa_auth = 0;
if (x->aalg) { if (x->aalg) {
struct xfrm_algo_desc *a = xfrm_aalg_get_byname(x->aalg->alg_name, 0); struct xfrm_algo_desc *a = xfrm_aalg_get_byname(x->aalg->alg_name, 0);
sa->sadb_sa_auth = a ? a->desc.sadb_alg_id : 0; sa->sadb_sa_auth = (a && a->pfkey_supported) ?
a->desc.sadb_alg_id : 0;
} }
sa->sadb_sa_encrypt = 0; sa->sadb_sa_encrypt = 0;
BUG_ON(x->ealg && x->calg); BUG_ON(x->ealg && x->calg);
if (x->ealg) { if (x->ealg) {
struct xfrm_algo_desc *a = xfrm_ealg_get_byname(x->ealg->alg_name, 0); struct xfrm_algo_desc *a = xfrm_ealg_get_byname(x->ealg->alg_name, 0);
sa->sadb_sa_encrypt = a ? a->desc.sadb_alg_id : 0; sa->sadb_sa_encrypt = (a && a->pfkey_supported) ?
a->desc.sadb_alg_id : 0;
} }
/* KAME compatible: sadb_sa_encrypt is overloaded with calg id */ /* KAME compatible: sadb_sa_encrypt is overloaded with calg id */
if (x->calg) { if (x->calg) {
struct xfrm_algo_desc *a = xfrm_calg_get_byname(x->calg->alg_name, 0); struct xfrm_algo_desc *a = xfrm_calg_get_byname(x->calg->alg_name, 0);
sa->sadb_sa_encrypt = a ? a->desc.sadb_alg_id : 0; sa->sadb_sa_encrypt = (a && a->pfkey_supported) ?
a->desc.sadb_alg_id : 0;
} }
sa->sadb_sa_flags = 0; sa->sadb_sa_flags = 0;
@ -1137,7 +1140,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net,
if (sa->sadb_sa_auth) { if (sa->sadb_sa_auth) {
int keysize = 0; int keysize = 0;
struct xfrm_algo_desc *a = xfrm_aalg_get_byid(sa->sadb_sa_auth); struct xfrm_algo_desc *a = xfrm_aalg_get_byid(sa->sadb_sa_auth);
if (!a) { if (!a || !a->pfkey_supported) {
err = -ENOSYS; err = -ENOSYS;
goto out; goto out;
} }
@ -1159,7 +1162,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net,
if (sa->sadb_sa_encrypt) { if (sa->sadb_sa_encrypt) {
if (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) { if (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) {
struct xfrm_algo_desc *a = xfrm_calg_get_byid(sa->sadb_sa_encrypt); struct xfrm_algo_desc *a = xfrm_calg_get_byid(sa->sadb_sa_encrypt);
if (!a) { if (!a || !a->pfkey_supported) {
err = -ENOSYS; err = -ENOSYS;
goto out; goto out;
} }
@ -1171,7 +1174,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net,
} else { } else {
int keysize = 0; int keysize = 0;
struct xfrm_algo_desc *a = xfrm_ealg_get_byid(sa->sadb_sa_encrypt); struct xfrm_algo_desc *a = xfrm_ealg_get_byid(sa->sadb_sa_encrypt);
if (!a) { if (!a || !a->pfkey_supported) {
err = -ENOSYS; err = -ENOSYS;
goto out; goto out;
} }
@ -1577,13 +1580,13 @@ static struct sk_buff *compose_sadb_supported(const struct sadb_msg *orig,
struct sadb_msg *hdr; struct sadb_msg *hdr;
int len, auth_len, enc_len, i; int len, auth_len, enc_len, i;
auth_len = xfrm_count_auth_supported(); auth_len = xfrm_count_pfkey_auth_supported();
if (auth_len) { if (auth_len) {
auth_len *= sizeof(struct sadb_alg); auth_len *= sizeof(struct sadb_alg);
auth_len += sizeof(struct sadb_supported); auth_len += sizeof(struct sadb_supported);
} }
enc_len = xfrm_count_enc_supported(); enc_len = xfrm_count_pfkey_enc_supported();
if (enc_len) { if (enc_len) {
enc_len *= sizeof(struct sadb_alg); enc_len *= sizeof(struct sadb_alg);
enc_len += sizeof(struct sadb_supported); enc_len += sizeof(struct sadb_supported);
@ -1614,6 +1617,8 @@ static struct sk_buff *compose_sadb_supported(const struct sadb_msg *orig,
struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i); struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
if (!aalg) if (!aalg)
break; break;
if (!aalg->pfkey_supported)
continue;
if (aalg->available) if (aalg->available)
*ap++ = aalg->desc; *ap++ = aalg->desc;
} }
@ -1633,6 +1638,8 @@ static struct sk_buff *compose_sadb_supported(const struct sadb_msg *orig,
struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i); struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
if (!ealg) if (!ealg)
break; break;
if (!ealg->pfkey_supported)
continue;
if (ealg->available) if (ealg->available)
*ap++ = ealg->desc; *ap++ = ealg->desc;
} }
@ -2824,6 +2831,8 @@ static int count_ah_combs(const struct xfrm_tmpl *t)
const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i); const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
if (!aalg) if (!aalg)
break; break;
if (!aalg->pfkey_supported)
continue;
if (aalg_tmpl_set(t, aalg) && aalg->available) if (aalg_tmpl_set(t, aalg) && aalg->available)
sz += sizeof(struct sadb_comb); sz += sizeof(struct sadb_comb);
} }
@ -2839,6 +2848,9 @@ static int count_esp_combs(const struct xfrm_tmpl *t)
if (!ealg) if (!ealg)
break; break;
if (!ealg->pfkey_supported)
continue;
if (!(ealg_tmpl_set(t, ealg) && ealg->available)) if (!(ealg_tmpl_set(t, ealg) && ealg->available))
continue; continue;
@ -2847,6 +2859,9 @@ static int count_esp_combs(const struct xfrm_tmpl *t)
if (!aalg) if (!aalg)
break; break;
if (!aalg->pfkey_supported)
continue;
if (aalg_tmpl_set(t, aalg) && aalg->available) if (aalg_tmpl_set(t, aalg) && aalg->available)
sz += sizeof(struct sadb_comb); sz += sizeof(struct sadb_comb);
} }
@ -2870,6 +2885,9 @@ static void dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
if (!aalg) if (!aalg)
break; break;
if (!aalg->pfkey_supported)
continue;
if (aalg_tmpl_set(t, aalg) && aalg->available) { if (aalg_tmpl_set(t, aalg) && aalg->available) {
struct sadb_comb *c; struct sadb_comb *c;
c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb)); c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb));
@ -2902,6 +2920,9 @@ static void dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
if (!ealg) if (!ealg)
break; break;
if (!ealg->pfkey_supported)
continue;
if (!(ealg_tmpl_set(t, ealg) && ealg->available)) if (!(ealg_tmpl_set(t, ealg) && ealg->available))
continue; continue;
@ -2910,6 +2931,8 @@ static void dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k); const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k);
if (!aalg) if (!aalg)
break; break;
if (!aalg->pfkey_supported)
continue;
if (!(aalg_tmpl_set(t, aalg) && aalg->available)) if (!(aalg_tmpl_set(t, aalg) && aalg->available))
continue; continue;
c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb)); c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb));

View file

@ -35,6 +35,8 @@ static struct xfrm_algo_desc aead_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV8, .sadb_alg_id = SADB_X_EALG_AES_GCM_ICV8,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -51,6 +53,8 @@ static struct xfrm_algo_desc aead_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV12, .sadb_alg_id = SADB_X_EALG_AES_GCM_ICV12,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -67,6 +71,8 @@ static struct xfrm_algo_desc aead_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV16, .sadb_alg_id = SADB_X_EALG_AES_GCM_ICV16,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -83,6 +89,8 @@ static struct xfrm_algo_desc aead_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV8, .sadb_alg_id = SADB_X_EALG_AES_CCM_ICV8,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -99,6 +107,8 @@ static struct xfrm_algo_desc aead_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV12, .sadb_alg_id = SADB_X_EALG_AES_CCM_ICV12,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -115,6 +125,8 @@ static struct xfrm_algo_desc aead_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV16, .sadb_alg_id = SADB_X_EALG_AES_CCM_ICV16,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -131,6 +143,8 @@ static struct xfrm_algo_desc aead_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_NULL_AES_GMAC, .sadb_alg_id = SADB_X_EALG_NULL_AES_GMAC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -151,6 +165,8 @@ static struct xfrm_algo_desc aalg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_AALG_NULL, .sadb_alg_id = SADB_X_AALG_NULL,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -169,6 +185,8 @@ static struct xfrm_algo_desc aalg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_AALG_MD5HMAC, .sadb_alg_id = SADB_AALG_MD5HMAC,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -187,6 +205,8 @@ static struct xfrm_algo_desc aalg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_AALG_SHA1HMAC, .sadb_alg_id = SADB_AALG_SHA1HMAC,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -205,6 +225,8 @@ static struct xfrm_algo_desc aalg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_AALG_SHA2_256HMAC, .sadb_alg_id = SADB_X_AALG_SHA2_256HMAC,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -222,6 +244,8 @@ static struct xfrm_algo_desc aalg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_AALG_SHA2_384HMAC, .sadb_alg_id = SADB_X_AALG_SHA2_384HMAC,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -239,6 +263,8 @@ static struct xfrm_algo_desc aalg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_AALG_SHA2_512HMAC, .sadb_alg_id = SADB_X_AALG_SHA2_512HMAC,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -257,6 +283,8 @@ static struct xfrm_algo_desc aalg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_AALG_RIPEMD160HMAC, .sadb_alg_id = SADB_X_AALG_RIPEMD160HMAC,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -274,6 +302,8 @@ static struct xfrm_algo_desc aalg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_AALG_AES_XCBC_MAC, .sadb_alg_id = SADB_X_AALG_AES_XCBC_MAC,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -295,6 +325,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_EALG_NULL, .sadb_alg_id = SADB_EALG_NULL,
.sadb_alg_ivlen = 0, .sadb_alg_ivlen = 0,
@ -313,6 +345,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_EALG_DESCBC, .sadb_alg_id = SADB_EALG_DESCBC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -331,6 +365,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_EALG_3DESCBC, .sadb_alg_id = SADB_EALG_3DESCBC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -349,6 +385,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_CASTCBC, .sadb_alg_id = SADB_X_EALG_CASTCBC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -367,6 +405,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_BLOWFISHCBC, .sadb_alg_id = SADB_X_EALG_BLOWFISHCBC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -385,6 +425,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_AESCBC, .sadb_alg_id = SADB_X_EALG_AESCBC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -403,6 +445,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_SERPENTCBC, .sadb_alg_id = SADB_X_EALG_SERPENTCBC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -421,6 +465,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_CAMELLIACBC, .sadb_alg_id = SADB_X_EALG_CAMELLIACBC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -439,6 +485,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_TWOFISHCBC, .sadb_alg_id = SADB_X_EALG_TWOFISHCBC,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -456,6 +504,8 @@ static struct xfrm_algo_desc ealg_list[] = {
} }
}, },
.pfkey_supported = 1,
.desc = { .desc = {
.sadb_alg_id = SADB_X_EALG_AESCTR, .sadb_alg_id = SADB_X_EALG_AESCTR,
.sadb_alg_ivlen = 8, .sadb_alg_ivlen = 8,
@ -473,6 +523,7 @@ static struct xfrm_algo_desc calg_list[] = {
.threshold = 90, .threshold = 90,
} }
}, },
.pfkey_supported = 1,
.desc = { .sadb_alg_id = SADB_X_CALG_DEFLATE } .desc = { .sadb_alg_id = SADB_X_CALG_DEFLATE }
}, },
{ {
@ -482,6 +533,7 @@ static struct xfrm_algo_desc calg_list[] = {
.threshold = 90, .threshold = 90,
} }
}, },
.pfkey_supported = 1,
.desc = { .sadb_alg_id = SADB_X_CALG_LZS } .desc = { .sadb_alg_id = SADB_X_CALG_LZS }
}, },
{ {
@ -491,6 +543,7 @@ static struct xfrm_algo_desc calg_list[] = {
.threshold = 50, .threshold = 50,
} }
}, },
.pfkey_supported = 1,
.desc = { .sadb_alg_id = SADB_X_CALG_LZJH } .desc = { .sadb_alg_id = SADB_X_CALG_LZJH }
}, },
}; };
@ -714,27 +767,27 @@ void xfrm_probe_algs(void)
} }
EXPORT_SYMBOL_GPL(xfrm_probe_algs); EXPORT_SYMBOL_GPL(xfrm_probe_algs);
int xfrm_count_auth_supported(void) int xfrm_count_pfkey_auth_supported(void)
{ {
int i, n; int i, n;
for (i = 0, n = 0; i < aalg_entries(); i++) for (i = 0, n = 0; i < aalg_entries(); i++)
if (aalg_list[i].available) if (aalg_list[i].available && aalg_list[i].pfkey_supported)
n++; n++;
return n; return n;
} }
EXPORT_SYMBOL_GPL(xfrm_count_auth_supported); EXPORT_SYMBOL_GPL(xfrm_count_pfkey_auth_supported);
int xfrm_count_enc_supported(void) int xfrm_count_pfkey_enc_supported(void)
{ {
int i, n; int i, n;
for (i = 0, n = 0; i < ealg_entries(); i++) for (i = 0, n = 0; i < ealg_entries(); i++)
if (ealg_list[i].available) if (ealg_list[i].available && ealg_list[i].pfkey_supported)
n++; n++;
return n; return n;
} }
EXPORT_SYMBOL_GPL(xfrm_count_enc_supported); EXPORT_SYMBOL_GPL(xfrm_count_pfkey_enc_supported);
#if defined(CONFIG_INET_ESP) || defined(CONFIG_INET_ESP_MODULE) || defined(CONFIG_INET6_ESP) || defined(CONFIG_INET6_ESP_MODULE) #if defined(CONFIG_INET_ESP) || defined(CONFIG_INET_ESP_MODULE) || defined(CONFIG_INET6_ESP) || defined(CONFIG_INET6_ESP_MODULE)