On Fri, Feb 06, 2009 at 04:13:40PM -0800, Loc Ho wrote:
>
> struct crypto_type {
> unsigned int (*ctxsize)(struct crypto_alg *alg, u32 type, u32 mask);
> int (*init)(struct crypto_tfm *tfm, u32 type, u32 mask);
> void (*exit)(struct crypto_tfm *tfm);
> void (*show)(struct seq_file *m, struct crypto_alg *alg);
> int (*uspace_setparam)(struct crypto_tfm *tfm, void *param, u32
> param_size);
> int (*uspace_op)(struct crypto_tfm *tfm,
> const struct iovec *iov, u32 iov_cnt,
> crypto_completion_t cb, void *ctx);
> };
I'd like to see a name field. It's better to have user-space
pass through a string for the type instead of an ID.
The reason you want user-space to pass that through is so that
you can locate the crypto_type object and then call crypto_alloc_tfm
on it..
Also the other two functions should take a void * instead of
crypto_tfm * since crypto_alloc_tfm now returns that.
> struct uspace_session {
> __u8 alg_name[64];
> __u32 front_type; /* I don't believe we need this - leave for now */
So instead of front_type I'd like to see front_type_name.
> struct uspace_param {
> __u16 size; /* We need this parameter as I/O control is
> only one pointer */
> __u8 data[0]; /* Variable size - parameters are crypto type specific
> */
> };
>
> struct uspace_param_ahash { /* This is the data field of struct uspace_param
> */
> __u16 hmackey_size;
> __u8 data[0];
> };
>
> struct uspace_param_aead { /* This is the data field of struct uspace_param */
> __u16 key_size;
> __u16 hmackey_size;
> __u8 data[0];
> };
>
> /* Create crypto session */
> #define CIOCGSESSION _IOWR('c', 101, struct session_op)
> /* Set algorithm parameters */
> #define CIOCPARAM _IOWR('c', 102, struct key_op)
>
> struct upsace_aead_op { /* Per operation for aead type */
> #define COP_NONE 0
> #define COP_ENCRYPT 1
> #define COP_DECRYPT 2
> __u16 op; /* i.e. COP_ENCRYPT */
> __u16 flags;
> __u16 iv_size;
> __u16 assoc_size;
> __u8 data[0]; /* parameter for aead per operation */
>
> };
OK, I presume the idea is to stuff this into the iov that's passed
to uspace_op?
I'm starting to think that write(2) isn't really what we want. The
reason is that each operation always has two types of data: obviously
we have the data itself, plus ancillary information like this struct
right here.
So how about switching over to the socket interface:
1. Create fd.
fd = socket(AF_ALGO, SOCK_DGRAM, 0);
2. Allocate tfm, alg_name would be the uspace_session struct.
connect(fd, alg_name, alg_name_len);
3. Set parameters.
setsockopt(fd, ..., param, param_len);
4. Operate.
sendmsg(fd, msg, flags);
Here struct msghdr provides for both the IOV array and space for
ancillary information.
Then the uspace_op function would just need to take a msg plus
the callback stuff.
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html