ipsec: Add IV generator information to xfrm_state
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 27 May 2015 08:03:45 +0000 (16:03 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 28 May 2015 03:23:20 +0000 (11:23 +0800)
This patch adds IV generator information to xfrm_state.  This
is currently obtained from our own list of algorithm descriptions.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
include/net/xfrm.h
net/key/af_key.c
net/xfrm/xfrm_user.c

index 30bca865c9dc92936e5492c29bdb04969b2d90df..f0ee97eec24d28625d9c3f714ab18a72b0b8f125 100644 (file)
@@ -168,6 +168,7 @@ struct xfrm_state {
        struct xfrm_algo        *ealg;
        struct xfrm_algo        *calg;
        struct xfrm_algo_aead   *aead;
+       const char              *geniv;
 
        /* Data for encapsulator */
        struct xfrm_encap_tmpl  *encap;
index f0d52d721b3a4405b47f38d8f5d6c1990cbf8b5f..3c5b8ce38ef405bf07636adbe3799bfec3b673f0 100644 (file)
@@ -1190,6 +1190,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net,
                                memcpy(x->ealg->alg_key, key+1, keysize);
                        }
                        x->props.ealgo = sa->sadb_sa_encrypt;
+                       x->geniv = a->uinfo.encr.geniv;
                }
        }
        /* x->algo.flags = sa->sadb_sa_flags; */
index 2091664295bae1a3a4725287e5d0bf5cfb28357c..bd16c6c7e1e7660b8ce183c72b16eb65aa51af5b 100644 (file)
@@ -289,6 +289,31 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props,
        return 0;
 }
 
+static int attach_crypt(struct xfrm_state *x, struct nlattr *rta)
+{
+       struct xfrm_algo *p, *ualg;
+       struct xfrm_algo_desc *algo;
+
+       if (!rta)
+               return 0;
+
+       ualg = nla_data(rta);
+
+       algo = xfrm_ealg_get_byname(ualg->alg_name, 1);
+       if (!algo)
+               return -ENOSYS;
+       x->props.ealgo = algo->desc.sadb_alg_id;
+
+       p = kmemdup(ualg, xfrm_alg_len(ualg), GFP_KERNEL);
+       if (!p)
+               return -ENOMEM;
+
+       strcpy(p->alg_name, algo->name);
+       x->ealg = p;
+       x->geniv = algo->uinfo.encr.geniv;
+       return 0;
+}
+
 static int attach_auth(struct xfrm_algo_auth **algpp, u8 *props,
                       struct nlattr *rta)
 {
@@ -349,8 +374,7 @@ static int attach_auth_trunc(struct xfrm_algo_auth **algpp, u8 *props,
        return 0;
 }
 
-static int attach_aead(struct xfrm_algo_aead **algpp, u8 *props,
-                      struct nlattr *rta)
+static int attach_aead(struct xfrm_state *x, struct nlattr *rta)
 {
        struct xfrm_algo_aead *p, *ualg;
        struct xfrm_algo_desc *algo;
@@ -363,14 +387,15 @@ static int attach_aead(struct xfrm_algo_aead **algpp, u8 *props,
        algo = xfrm_aead_get_byname(ualg->alg_name, ualg->alg_icv_len, 1);
        if (!algo)
                return -ENOSYS;
-       *props = algo->desc.sadb_alg_id;
+       x->props.ealgo = algo->desc.sadb_alg_id;
 
        p = kmemdup(ualg, aead_len(ualg), GFP_KERNEL);
        if (!p)
                return -ENOMEM;
 
        strcpy(p->alg_name, algo->name);
-       *algpp = p;
+       x->aead = p;
+       x->geniv = algo->uinfo.aead.geniv;
        return 0;
 }
 
@@ -515,8 +540,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
        if (attrs[XFRMA_SA_EXTRA_FLAGS])
                x->props.extra_flags = nla_get_u32(attrs[XFRMA_SA_EXTRA_FLAGS]);
 
-       if ((err = attach_aead(&x->aead, &x->props.ealgo,
-                              attrs[XFRMA_ALG_AEAD])))
+       if ((err = attach_aead(x, attrs[XFRMA_ALG_AEAD])))
                goto error;
        if ((err = attach_auth_trunc(&x->aalg, &x->props.aalgo,
                                     attrs[XFRMA_ALG_AUTH_TRUNC])))
@@ -526,9 +550,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
                                       attrs[XFRMA_ALG_AUTH])))
                        goto error;
        }
-       if ((err = attach_one_algo(&x->ealg, &x->props.ealgo,
-                                  xfrm_ealg_get_byname,
-                                  attrs[XFRMA_ALG_CRYPT])))
+       if ((err = attach_crypt(x, attrs[XFRMA_ALG_CRYPT])))
                goto error;
        if ((err = attach_one_algo(&x->calg, &x->props.calgo,
                                   xfrm_calg_get_byname,