For now, the only information returned are the verbose names of the requested cipher and hash algos along with their driver names. --- cryptodev.h | 14 ++++++++++++++ cryptodev_main.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 0 deletions(-)
diff --git a/cryptodev.h b/cryptodev.h index f367262..d7343ba 100644 --- a/cryptodev.h +++ b/cryptodev.h @@ -68,6 +68,9 @@ enum cryptodev_crypto_op_t { /* Values for hashes/MAC */ #define AALG_MAX_RESULT_LEN 64 +/* maximum length of verbose alg names (depends on CRYPTO_MAX_ALG_NAME) */ +#define CRYPTODEV_MAX_ALG_NAME 64 + /* input of CIOCGSESSION */ struct session_op { /* Specify either cipher or mac @@ -85,6 +88,16 @@ struct session_op { __u16 alignmask; /* alignment constraints */ }; +struct session_info_op { + __u32 ses; /* session identifier */ + + /* verbose names for the requested ciphers */ + struct alg_info { + char cra_name[CRYPTODEV_MAX_ALG_NAME]; + char cra_driver_name[CRYPTODEV_MAX_ALG_NAME]; + } cipher_info, hash_info; +}; + #define COP_ENCRYPT 0 #define COP_DECRYPT 1 @@ -162,6 +175,7 @@ enum cryptodev_crk_op_t { #define CIOCCRYPT _IOWR('c', 104, struct crypt_op) #define CIOCKEY _IOWR('c', 105, struct crypt_kop) #define CIOCASYMFEAT _IOR('c', 106, __u32) +#define CIOCGSESSINFO _IOWR('c', 107, struct session_info_op) /* to indicate that CRIOGET is not required in linux */ diff --git a/cryptodev_main.c b/cryptodev_main.c index e869557..750e282 100644 --- a/cryptodev_main.c +++ b/cryptodev_main.c @@ -32,6 +32,7 @@ * */ +#include <crypto/hash.h> #include <linux/crypto.h> #include <linux/mm.h> #include <linux/highmem.h> @@ -1006,6 +1007,38 @@ static int kcop_from_user(struct kernel_crypt_op *kcop, return fill_kcop_from_cop(kcop, fcr); } +static inline void tfm_info_to_alg_info(struct alg_info *dst, struct crypto_tfm *tfm) +{ + snprintf(dst->cra_name, CRYPTODEV_MAX_ALG_NAME, + "%s", crypto_tfm_alg_name(tfm)); + snprintf(dst->cra_driver_name, CRYPTODEV_MAX_ALG_NAME, + "%s", crypto_tfm_alg_driver_name(tfm)); +} + +static int get_session_info(struct fcrypt *fcr, struct session_info_op *siop) +{ + struct csession *ses_ptr; + + /* this also enters ses_ptr->sem */ + ses_ptr = crypto_get_session_by_sid(fcr, siop->ses); + if (unlikely(!ses_ptr)) { + dprintk(1, KERN_ERR, "invalid session ID=0x%08X\n", siop->ses); + return -EINVAL; + } + + if (ses_ptr->cdata.init) { + tfm_info_to_alg_info(&siop->cipher_info, + crypto_ablkcipher_tfm(ses_ptr->cdata.async.s)); + } + if (ses_ptr->hdata.init) { + tfm_info_to_alg_info(&siop->hash_info, + crypto_ahash_tfm(ses_ptr->hdata.async.s)); + } + + mutex_unlock(&ses_ptr->sem); + return 0; +} + static long cryptodev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg_) { @@ -1015,6 +1048,7 @@ cryptodev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg_) struct kernel_crypt_op kcop; struct crypt_priv *pcr = filp->private_data; struct fcrypt *fcr; + struct session_info_op siop; uint32_t ses; int ret, fd; @@ -1053,6 +1087,14 @@ cryptodev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg_) return ret; ret = crypto_finish_session(fcr, ses); return ret; + case CIOCGSESSINFO: + if (unlikely(copy_from_user(&siop, arg, sizeof(siop)))) + return -EFAULT; + + ret = get_session_info(fcr, &siop); + if (unlikely(ret)) + return ret; + return copy_to_user(arg, &siop, sizeof(siop)); case CIOCCRYPT: if (unlikely(ret = kcop_from_user(&kcop, fcr, arg))) return ret; -- 1.7.3.2 _______________________________________________ Cryptodev-linux-devel mailing list Cryptodev-linux-devel@gna.org https://mail.gna.org/listinfo/cryptodev-linux-devel