mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
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> Change-Id: I8a51662015715f6444011ce2298fe7d8c9651a81
This commit is contained in:
parent
850f524248
commit
fe2daa40e9
3 changed files with 93 additions and 16 deletions
|
@ -1317,6 +1317,7 @@ struct xfrm_algo_desc {
|
|||
char *name;
|
||||
char *compat;
|
||||
u8 available:1;
|
||||
u8 pfkey_supported:1;
|
||||
union {
|
||||
struct xfrm_algo_aead_info aead;
|
||||
struct xfrm_algo_auth_info auth;
|
||||
|
@ -1556,8 +1557,8 @@ extern void xfrm_input_init(void);
|
|||
extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq);
|
||||
|
||||
extern void xfrm_probe_algs(void);
|
||||
extern int xfrm_count_auth_supported(void);
|
||||
extern int xfrm_count_enc_supported(void);
|
||||
extern int xfrm_count_pfkey_auth_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_ealg_get_byidx(unsigned int idx);
|
||||
extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id);
|
||||
|
|
|
@ -816,18 +816,21 @@ static struct sk_buff *__pfkey_xfrm_state2msg(const struct xfrm_state *x,
|
|||
sa->sadb_sa_auth = 0;
|
||||
if (x->aalg) {
|
||||
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;
|
||||
BUG_ON(x->ealg && x->calg);
|
||||
if (x->ealg) {
|
||||
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 */
|
||||
if (x->calg) {
|
||||
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;
|
||||
|
@ -1138,7 +1141,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net,
|
|||
if (sa->sadb_sa_auth) {
|
||||
int keysize = 0;
|
||||
struct xfrm_algo_desc *a = xfrm_aalg_get_byid(sa->sadb_sa_auth);
|
||||
if (!a) {
|
||||
if (!a || !a->pfkey_supported) {
|
||||
err = -ENOSYS;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1160,7 +1163,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net,
|
|||
if (sa->sadb_sa_encrypt) {
|
||||
if (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) {
|
||||
struct xfrm_algo_desc *a = xfrm_calg_get_byid(sa->sadb_sa_encrypt);
|
||||
if (!a) {
|
||||
if (!a || !a->pfkey_supported) {
|
||||
err = -ENOSYS;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1172,7 +1175,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net,
|
|||
} else {
|
||||
int keysize = 0;
|
||||
struct xfrm_algo_desc *a = xfrm_ealg_get_byid(sa->sadb_sa_encrypt);
|
||||
if (!a) {
|
||||
if (!a || !a->pfkey_supported) {
|
||||
err = -ENOSYS;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1578,13 +1581,13 @@ static struct sk_buff *compose_sadb_supported(const struct sadb_msg *orig,
|
|||
struct sadb_msg *hdr;
|
||||
int len, auth_len, enc_len, i;
|
||||
|
||||
auth_len = xfrm_count_auth_supported();
|
||||
auth_len = xfrm_count_pfkey_auth_supported();
|
||||
if (auth_len) {
|
||||
auth_len *= sizeof(struct sadb_alg);
|
||||
auth_len += sizeof(struct sadb_supported);
|
||||
}
|
||||
|
||||
enc_len = xfrm_count_enc_supported();
|
||||
enc_len = xfrm_count_pfkey_enc_supported();
|
||||
if (enc_len) {
|
||||
enc_len *= sizeof(struct sadb_alg);
|
||||
enc_len += sizeof(struct sadb_supported);
|
||||
|
@ -1615,6 +1618,8 @@ static struct sk_buff *compose_sadb_supported(const struct sadb_msg *orig,
|
|||
struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
|
||||
if (!aalg)
|
||||
break;
|
||||
if (!aalg->pfkey_supported)
|
||||
continue;
|
||||
if (aalg->available)
|
||||
*ap++ = aalg->desc;
|
||||
}
|
||||
|
@ -1634,6 +1639,8 @@ static struct sk_buff *compose_sadb_supported(const struct sadb_msg *orig,
|
|||
struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
|
||||
if (!ealg)
|
||||
break;
|
||||
if (!ealg->pfkey_supported)
|
||||
continue;
|
||||
if (ealg->available)
|
||||
*ap++ = ealg->desc;
|
||||
}
|
||||
|
@ -2826,6 +2833,8 @@ static int count_ah_combs(const struct xfrm_tmpl *t)
|
|||
const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
|
||||
if (!aalg)
|
||||
break;
|
||||
if (!aalg->pfkey_supported)
|
||||
continue;
|
||||
if (aalg_tmpl_set(t, aalg) && aalg->available)
|
||||
sz += sizeof(struct sadb_comb);
|
||||
}
|
||||
|
@ -2841,6 +2850,9 @@ static int count_esp_combs(const struct xfrm_tmpl *t)
|
|||
if (!ealg)
|
||||
break;
|
||||
|
||||
if (!ealg->pfkey_supported)
|
||||
continue;
|
||||
|
||||
if (!(ealg_tmpl_set(t, ealg) && ealg->available))
|
||||
continue;
|
||||
|
||||
|
@ -2849,6 +2861,9 @@ static int count_esp_combs(const struct xfrm_tmpl *t)
|
|||
if (!aalg)
|
||||
break;
|
||||
|
||||
if (!aalg->pfkey_supported)
|
||||
continue;
|
||||
|
||||
if (aalg_tmpl_set(t, aalg) && aalg->available)
|
||||
sz += sizeof(struct sadb_comb);
|
||||
}
|
||||
|
@ -2872,6 +2887,9 @@ static void dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
|
|||
if (!aalg)
|
||||
break;
|
||||
|
||||
if (!aalg->pfkey_supported)
|
||||
continue;
|
||||
|
||||
if (aalg_tmpl_set(t, aalg) && aalg->available) {
|
||||
struct sadb_comb *c;
|
||||
c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb));
|
||||
|
@ -2904,6 +2922,9 @@ static void dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
|
|||
if (!ealg)
|
||||
break;
|
||||
|
||||
if (!ealg->pfkey_supported)
|
||||
continue;
|
||||
|
||||
if (!(ealg_tmpl_set(t, ealg) && ealg->available))
|
||||
continue;
|
||||
|
||||
|
@ -2912,6 +2933,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);
|
||||
if (!aalg)
|
||||
break;
|
||||
if (!aalg->pfkey_supported)
|
||||
continue;
|
||||
if (!(aalg_tmpl_set(t, aalg) && aalg->available))
|
||||
continue;
|
||||
c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb));
|
||||
|
|
|
@ -38,6 +38,8 @@ static struct xfrm_algo_desc aead_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV8,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -54,6 +56,8 @@ static struct xfrm_algo_desc aead_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV12,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -70,6 +74,8 @@ static struct xfrm_algo_desc aead_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AES_GCM_ICV16,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -86,6 +92,8 @@ static struct xfrm_algo_desc aead_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV8,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -102,6 +110,8 @@ static struct xfrm_algo_desc aead_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV12,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -118,6 +128,8 @@ static struct xfrm_algo_desc aead_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AES_CCM_ICV16,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -134,6 +146,8 @@ static struct xfrm_algo_desc aead_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_NULL_AES_GMAC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -154,6 +168,8 @@ static struct xfrm_algo_desc aalg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_AALG_NULL,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -172,6 +188,8 @@ static struct xfrm_algo_desc aalg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_AALG_MD5HMAC,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -190,6 +208,8 @@ static struct xfrm_algo_desc aalg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_AALG_SHA1HMAC,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -208,6 +228,8 @@ static struct xfrm_algo_desc aalg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_AALG_SHA2_256HMAC,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -225,6 +247,8 @@ static struct xfrm_algo_desc aalg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_AALG_SHA2_384HMAC,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -242,6 +266,8 @@ static struct xfrm_algo_desc aalg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_AALG_SHA2_512HMAC,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -260,6 +286,8 @@ static struct xfrm_algo_desc aalg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_AALG_RIPEMD160HMAC,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -277,6 +305,8 @@ static struct xfrm_algo_desc aalg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_AALG_AES_XCBC_MAC,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -298,6 +328,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_EALG_NULL,
|
||||
.sadb_alg_ivlen = 0,
|
||||
|
@ -316,6 +348,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_EALG_DESCBC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -334,6 +368,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_EALG_3DESCBC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -352,6 +388,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_CASTCBC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -370,6 +408,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_BLOWFISHCBC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -388,6 +428,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AESCBC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -406,6 +448,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_SERPENTCBC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -424,6 +468,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_CAMELLIACBC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -442,6 +488,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_TWOFISHCBC,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -459,6 +507,8 @@ static struct xfrm_algo_desc ealg_list[] = {
|
|||
}
|
||||
},
|
||||
|
||||
.pfkey_supported = 1,
|
||||
|
||||
.desc = {
|
||||
.sadb_alg_id = SADB_X_EALG_AESCTR,
|
||||
.sadb_alg_ivlen = 8,
|
||||
|
@ -476,6 +526,7 @@ static struct xfrm_algo_desc calg_list[] = {
|
|||
.threshold = 90,
|
||||
}
|
||||
},
|
||||
.pfkey_supported = 1,
|
||||
.desc = { .sadb_alg_id = SADB_X_CALG_DEFLATE }
|
||||
},
|
||||
{
|
||||
|
@ -485,6 +536,7 @@ static struct xfrm_algo_desc calg_list[] = {
|
|||
.threshold = 90,
|
||||
}
|
||||
},
|
||||
.pfkey_supported = 1,
|
||||
.desc = { .sadb_alg_id = SADB_X_CALG_LZS }
|
||||
},
|
||||
{
|
||||
|
@ -494,6 +546,7 @@ static struct xfrm_algo_desc calg_list[] = {
|
|||
.threshold = 50,
|
||||
}
|
||||
},
|
||||
.pfkey_supported = 1,
|
||||
.desc = { .sadb_alg_id = SADB_X_CALG_LZJH }
|
||||
},
|
||||
};
|
||||
|
@ -717,27 +770,27 @@ void xfrm_probe_algs(void)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(xfrm_probe_algs);
|
||||
|
||||
int xfrm_count_auth_supported(void)
|
||||
int xfrm_count_pfkey_auth_supported(void)
|
||||
{
|
||||
int i, n;
|
||||
|
||||
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++;
|
||||
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;
|
||||
|
||||
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++;
|
||||
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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue