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
[email protected]
https://mail.gna.org/listinfo/cryptodev-linux-devel