1 From 30fc86a09109f169815befc2cd8bbfcae79fe7e0 Mon Sep 17 00:00:00 2001
 
   2 From: Yashpal Dutta <yashpal.dutta@freescale.com>
 
   3 Date: Fri, 7 Mar 2014 07:53:53 +0545
 
   4 Subject: [PATCH 6/9] ECC_KEYGEN and DLC_KEYGEN supported in cryptodev module
 
   6 Upstream-status: Pending
 
   8 Signed-off-by: Yashpal Dutta <yashpal.dutta@freescale.com>
 
  11  crypto/cryptodev.h |  5 +++-
 
  12  ioctl.c            | 29 +++++++++++++++++--
 
  13  main.c             | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
  14  4 files changed, 118 insertions(+), 3 deletions(-)
 
  16 diff --git a/cryptlib.c b/cryptlib.c
 
  17 index 6900028..47cd568 100644
 
  20 @@ -452,6 +452,8 @@ int cryptodev_pkc_offload(struct cryptodev_pkc  *pkc)
 
  26                 pkc->s = crypto_alloc_pkc("pkc(dsa)",
 
  27                          CRYPTO_ALG_TYPE_PKC_DSA, 0);
 
  29 diff --git a/crypto/cryptodev.h b/crypto/cryptodev.h
 
  30 index 4436fbf..275a55c 100644
 
  31 --- a/crypto/cryptodev.h
 
  32 +++ b/crypto/cryptodev.h
 
  33 @@ -268,6 +268,8 @@ enum cryptodev_crk_op_t {
 
  36         CRK_DH_COMPUTE_KEY = 4,
 
  37 +       CRK_DSA_GENERATE_KEY = 5,
 
  38 +       CRK_DH_GENERATE_KEY = 6,
 
  42 @@ -280,7 +282,8 @@ enum cryptodev_crk_op_t {
 
  43  #define CRF_DSA_SIGN           (1 << CRK_DSA_SIGN)
 
  44  #define CRF_DSA_VERIFY         (1 << CRK_DSA_VERIFY)
 
  45  #define CRF_DH_COMPUTE_KEY     (1 << CRK_DH_COMPUTE_KEY)
 
  47 +#define CRF_DSA_GENERATE_KEY   (1 << CRK_DSA_GENERATE_KEY)
 
  48 +#define CRF_DH_GENERATE_KEY    (1 << CRK_DH_GENERATE_KEY)
 
  50  /* ioctl's. Compatible with old linux cryptodev.h
 
  52 diff --git a/ioctl.c b/ioctl.c
 
  53 index 2eb7f03..c813c8c 100644
 
  56 @@ -726,6 +726,23 @@ static int crypto_async_fetch_asym(struct cryptodev_pkc *pkc)
 
  57                                      dh_req->z, dh_req->z_len);
 
  60 +       case CRK_DSA_GENERATE_KEY:
 
  61 +       case CRK_DH_GENERATE_KEY:
 
  63 +               struct keygen_req_s *key_req = &pkc_req->req_u.keygen;
 
  65 +               if (pkc_req->type == ECC_KEYGEN) {
 
  66 +                       copy_to_user(ckop->crk_param[4].crp_p, key_req->pub_key,
 
  67 +                                    key_req->pub_key_len);
 
  68 +                       copy_to_user(ckop->crk_param[5].crp_p,
 
  69 +                                    key_req->priv_key, key_req->priv_key_len);
 
  71 +                       copy_to_user(ckop->crk_param[3].crp_p,
 
  72 +                                    key_req->pub_key, key_req->pub_key_len);
 
  73 +                       copy_to_user(ckop->crk_param[4].crp_p,
 
  74 +                                    key_req->priv_key, key_req->priv_key_len);
 
  80 @@ -939,8 +956,9 @@ cryptodev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg_)
 
  84 -               return put_user(CRF_MOD_EXP_CRT |  CRF_MOD_EXP |
 
  85 -                       CRF_DSA_SIGN | CRF_DSA_VERIFY | CRF_DH_COMPUTE_KEY, p);
 
  86 +               return put_user(CRF_MOD_EXP_CRT |  CRF_MOD_EXP | CRF_DSA_SIGN |
 
  87 +                       CRF_DSA_VERIFY | CRF_DH_COMPUTE_KEY |
 
  88 +                       CRF_DSA_GENERATE_KEY, p);
 
  91                 ret = put_user(fd, p);
 
  92 @@ -1084,7 +1102,14 @@ cryptodev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg_)
 
  93                 if (cookie_list.cookie_available)
 
  94                         copy_to_user(arg, &cookie_list,
 
  95                                      sizeof(struct pkc_cookie_list_s));
 
  97 +                       struct pkc_cookie_list_s *user_ck_list = (void *)arg;
 
  99 +                       put_user(0, &(user_ck_list->cookie_available));
 
 101 +               ret = cookie_list.cookie_available;
 
 107 diff --git a/main.c b/main.c
 
 108 index 0b7951e..c901bc7 100644
 
 111 @@ -342,6 +342,85 @@ err:
 
 115 +int crypto_kop_keygen(struct cryptodev_pkc *pkc)
 
 117 +       struct kernel_crypt_kop *kop = &pkc->kop;
 
 118 +       struct crypt_kop *cop = &kop->kop;
 
 119 +       struct pkc_request *pkc_req;
 
 120 +       struct keygen_req_s *key_req;
 
 124 +       if (!cop->crk_param[0].crp_nbits || !cop->crk_param[1].crp_nbits ||
 
 125 +           !cop->crk_param[2].crp_nbits || !cop->crk_param[3].crp_nbits ||
 
 126 +           !cop->crk_param[4].crp_nbits)
 
 129 +       pkc_req = &pkc->req;
 
 130 +       key_req = &pkc_req->req_u.keygen;
 
 131 +       key_req->q_len = (cop->crk_param[0].crp_nbits + 7)/8;
 
 132 +       key_req->r_len = (cop->crk_param[1].crp_nbits + 7)/8;
 
 133 +       key_req->g_len = (cop->crk_param[2].crp_nbits + 7)/8;
 
 134 +       if (cop->crk_iparams == 3) {
 
 135 +               key_req->pub_key_len = (cop->crk_param[3].crp_nbits + 7)/8;
 
 136 +               key_req->priv_key_len = (cop->crk_param[4].crp_nbits + 7)/8;
 
 137 +               buf_size = key_req->q_len + key_req->r_len + key_req->g_len +
 
 138 +                       key_req->pub_key_len + key_req->priv_key_len;
 
 139 +               pkc_req->type = DLC_KEYGEN;
 
 141 +               key_req->ab_len = (cop->crk_param[3].crp_nbits + 7)/8;
 
 142 +               key_req->pub_key_len = (cop->crk_param[4].crp_nbits + 7)/8;
 
 143 +               key_req->priv_key_len = (cop->crk_param[5].crp_nbits + 7)/8;
 
 144 +               buf_size = key_req->q_len + key_req->r_len + key_req->g_len +
 
 145 +                       key_req->pub_key_len + key_req->priv_key_len +
 
 147 +               pkc_req->type = ECC_KEYGEN;
 
 148 +               pkc_req->curve_type = cop->curve_type;
 
 151 +       buf = kzalloc(buf_size, GFP_DMA);
 
 156 +       key_req->r = key_req->q + key_req->q_len;
 
 157 +       key_req->g = key_req->r + key_req->r_len;
 
 158 +       key_req->pub_key = key_req->g + key_req->g_len;
 
 159 +       key_req->priv_key = key_req->pub_key + key_req->pub_key_len;
 
 160 +       copy_from_user(key_req->q, cop->crk_param[0].crp_p, key_req->q_len);
 
 161 +       copy_from_user(key_req->r, cop->crk_param[1].crp_p, key_req->r_len);
 
 162 +       copy_from_user(key_req->g, cop->crk_param[2].crp_p, key_req->g_len);
 
 163 +       if (cop->crk_iparams == 3) {
 
 164 +               copy_from_user(key_req->pub_key, cop->crk_param[3].crp_p,
 
 165 +                              key_req->pub_key_len);
 
 166 +               copy_from_user(key_req->priv_key, cop->crk_param[4].crp_p,
 
 167 +                              key_req->priv_key_len);
 
 169 +               key_req->ab = key_req->priv_key + key_req->priv_key_len;
 
 170 +               copy_from_user(key_req->ab, cop->crk_param[3].crp_p,
 
 172 +               copy_from_user(key_req->pub_key, cop->crk_param[4].crp_p,
 
 173 +                              key_req->pub_key_len);
 
 174 +               copy_from_user(key_req->priv_key, cop->crk_param[5].crp_p,
 
 175 +                              key_req->priv_key_len);
 
 178 +       rc = cryptodev_pkc_offload(pkc);
 
 179 +       if (pkc->type == SYNCHRONOUS) {
 
 183 +               if (rc != -EINPROGRESS && !rc)
 
 194  int crypto_kop_dh_key(struct cryptodev_pkc *pkc)
 
 196         struct kernel_crypt_kop *kop = &pkc->kop;
 
 197 @@ -554,6 +633,12 @@ int crypto_run_asym(struct cryptodev_pkc *pkc)
 
 199                 ret = crypto_kop_dh_key(pkc);
 
 201 +       case CRK_DH_GENERATE_KEY:
 
 202 +       case CRK_DSA_GENERATE_KEY:
 
 203 +               if ((kop->kop.crk_iparams != 3 && kop->kop.crk_iparams != 4))
 
 205 +               ret = crypto_kop_keygen(pkc);