netlink: fix NETLINK_RECV_NO_ENOBUFS in netlink_set_err()
[linux-2.6.git] / include / linux / crypto.h
index b6efe56..24d2e30 100644 (file)
 #define CRYPTO_ALG_TYPE_ABLKCIPHER     0x00000005
 #define CRYPTO_ALG_TYPE_GIVCIPHER      0x00000006
 #define CRYPTO_ALG_TYPE_DIGEST         0x00000008
-#define CRYPTO_ALG_TYPE_HASH           0x00000009
+#define CRYPTO_ALG_TYPE_HASH           0x00000008
+#define CRYPTO_ALG_TYPE_SHASH          0x00000009
 #define CRYPTO_ALG_TYPE_AHASH          0x0000000a
+#define CRYPTO_ALG_TYPE_RNG            0x0000000c
+#define CRYPTO_ALG_TYPE_PCOMPRESS      0x0000000f
 
 #define CRYPTO_ALG_TYPE_HASH_MASK      0x0000000e
 #define CRYPTO_ALG_TYPE_AHASH_MASK     0x0000000c
 #define CRYPTO_ALG_GENIV               0x00000200
 
 /*
+ * Set if the algorithm has passed automated run-time testing.  Note that
+ * if there is no run-time testing for a given algorithm it is considered
+ * to have passed.
+ */
+
+#define CRYPTO_ALG_TESTED              0x00000400
+
+/*
  * Transform masks and values (for crt_flags).
  */
 #define CRYPTO_TFM_REQ_MASK            0x000fff00
@@ -104,7 +115,7 @@ struct crypto_async_request;
 struct crypto_aead;
 struct crypto_blkcipher;
 struct crypto_hash;
-struct crypto_ahash;
+struct crypto_rng;
 struct crypto_tfm;
 struct crypto_type;
 struct aead_givcrypt_request;
@@ -134,18 +145,6 @@ struct ablkcipher_request {
        void *__ctx[] CRYPTO_MINALIGN_ATTR;
 };
 
-struct ahash_request {
-       struct crypto_async_request base;
-
-       void *info;
-
-       unsigned int nbytes;
-       struct scatterlist *src;
-       u8                 *result;
-
-       void *__ctx[] CRYPTO_MINALIGN_ATTR;
-};
-
 /**
  *     struct aead_request - AEAD request
  *     @base: Common attributes for async crypto requests
@@ -210,17 +209,6 @@ struct ablkcipher_alg {
        unsigned int ivsize;
 };
 
-struct ahash_alg {
-       int (*init)(struct ahash_request *req);
-       int (*update)(struct ahash_request *req);
-       int (*final)(struct ahash_request *req);
-       int (*digest)(struct ahash_request *req);
-       int (*setkey)(struct crypto_ahash *tfm, const u8 *key,
-                       unsigned int keylen);
-
-       unsigned int digestsize;
-};
-
 struct aead_alg {
        int (*setkey)(struct crypto_aead *tfm, const u8 *key,
                      unsigned int keylen);
@@ -262,29 +250,6 @@ struct cipher_alg {
        void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src);
 };
 
-struct digest_alg {
-       unsigned int dia_digestsize;
-       void (*dia_init)(struct crypto_tfm *tfm);
-       void (*dia_update)(struct crypto_tfm *tfm, const u8 *data,
-                          unsigned int len);
-       void (*dia_final)(struct crypto_tfm *tfm, u8 *out);
-       int (*dia_setkey)(struct crypto_tfm *tfm, const u8 *key,
-                         unsigned int keylen);
-};
-
-struct hash_alg {
-       int (*init)(struct hash_desc *desc);
-       int (*update)(struct hash_desc *desc, struct scatterlist *sg,
-                     unsigned int nbytes);
-       int (*final)(struct hash_desc *desc, u8 *out);
-       int (*digest)(struct hash_desc *desc, struct scatterlist *sg,
-                     unsigned int nbytes, u8 *out);
-       int (*setkey)(struct crypto_hash *tfm, const u8 *key,
-                     unsigned int keylen);
-
-       unsigned int digestsize;
-};
-
 struct compress_alg {
        int (*coa_compress)(struct crypto_tfm *tfm, const u8 *src,
                            unsigned int slen, u8 *dst, unsigned int *dlen);
@@ -292,14 +257,21 @@ struct compress_alg {
                              unsigned int slen, u8 *dst, unsigned int *dlen);
 };
 
+struct rng_alg {
+       int (*rng_make_random)(struct crypto_rng *tfm, u8 *rdata,
+                              unsigned int dlen);
+       int (*rng_reset)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
+
+       unsigned int seedsize;
+};
+
+
 #define cra_ablkcipher cra_u.ablkcipher
 #define cra_aead       cra_u.aead
 #define cra_blkcipher  cra_u.blkcipher
 #define cra_cipher     cra_u.cipher
-#define cra_digest     cra_u.digest
-#define cra_hash       cra_u.hash
-#define cra_ahash      cra_u.ahash
 #define cra_compress   cra_u.compress
+#define cra_rng                cra_u.rng
 
 struct crypto_alg {
        struct list_head cra_list;
@@ -323,10 +295,8 @@ struct crypto_alg {
                struct aead_alg aead;
                struct blkcipher_alg blkcipher;
                struct cipher_alg cipher;
-               struct digest_alg digest;
-               struct hash_alg hash;
-               struct ahash_alg ahash;
                struct compress_alg compress;
+               struct rng_alg rng;
        } cra_u;
 
        int (*cra_init)(struct crypto_tfm *tfm);
@@ -411,19 +381,6 @@ struct hash_tfm {
        unsigned int digestsize;
 };
 
-struct ahash_tfm {
-       int (*init)(struct ahash_request *req);
-       int (*update)(struct ahash_request *req);
-       int (*final)(struct ahash_request *req);
-       int (*digest)(struct ahash_request *req);
-       int (*setkey)(struct crypto_ahash *tfm, const u8 *key,
-                       unsigned int keylen);
-
-       unsigned int digestsize;
-       struct crypto_ahash *base;
-       unsigned int reqsize;
-};
-
 struct compress_tfm {
        int (*cot_compress)(struct crypto_tfm *tfm,
                            const u8 *src, unsigned int slen,
@@ -433,13 +390,19 @@ struct compress_tfm {
                              u8 *dst, unsigned int *dlen);
 };
 
+struct rng_tfm {
+       int (*rng_gen_random)(struct crypto_rng *tfm, u8 *rdata,
+                             unsigned int dlen);
+       int (*rng_reset)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
+};
+
 #define crt_ablkcipher crt_u.ablkcipher
 #define crt_aead       crt_u.aead
 #define crt_blkcipher  crt_u.blkcipher
 #define crt_cipher     crt_u.cipher
 #define crt_hash       crt_u.hash
-#define crt_ahash      crt_u.ahash
 #define crt_compress   crt_u.compress
+#define crt_rng                crt_u.rng
 
 struct crypto_tfm {
 
@@ -451,9 +414,11 @@ struct crypto_tfm {
                struct blkcipher_tfm blkcipher;
                struct cipher_tfm cipher;
                struct hash_tfm hash;
-               struct ahash_tfm ahash;
                struct compress_tfm compress;
+               struct rng_tfm rng;
        } crt_u;
+
+       void (*exit)(struct crypto_tfm *tfm);
        
        struct crypto_alg *__crt_alg;
 
@@ -484,7 +449,7 @@ struct crypto_hash {
        struct crypto_tfm base;
 };
 
-struct crypto_ahash {
+struct crypto_rng {
        struct crypto_tfm base;
 };
 
@@ -518,9 +483,15 @@ struct crypto_attr_u32 {
  * Transform user interface.
  */
  
-struct crypto_tfm *crypto_alloc_tfm(const char *alg_name, u32 tfm_flags);
 struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask);
-void crypto_free_tfm(struct crypto_tfm *tfm);
+void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm);
+
+static inline void crypto_free_tfm(struct crypto_tfm *tfm)
+{
+       return crypto_destroy_tfm(tfm, tfm);
+}
+
+int alg_test(const char *driver, const char *alg, u32 type, u32 mask);
 
 /*
  * Transform helpers which query the underlying algorithm.
@@ -733,7 +704,7 @@ static inline struct ablkcipher_request *ablkcipher_request_alloc(
 
 static inline void ablkcipher_request_free(struct ablkcipher_request *req)
 {
-       kfree(req);
+       kzfree(req);
 }
 
 static inline void ablkcipher_request_set_callback(
@@ -864,7 +835,7 @@ static inline struct aead_request *aead_request_alloc(struct crypto_aead *tfm,
 
 static inline void aead_request_free(struct aead_request *req)
 {
-       kfree(req);
+       kzfree(req);
 }
 
 static inline void aead_request_set_callback(struct aead_request *req,
@@ -1311,137 +1282,5 @@ static inline int crypto_comp_decompress(struct crypto_comp *tfm,
                                                    src, slen, dst, dlen);
 }
 
-static inline struct crypto_ahash *__crypto_ahash_cast(struct crypto_tfm *tfm)
-{
-       return (struct crypto_ahash *)tfm;
-}
-
-static inline struct crypto_ahash *crypto_alloc_ahash(const char *alg_name,
-                                                     u32 type, u32 mask)
-{
-       type &= ~CRYPTO_ALG_TYPE_MASK;
-       mask &= ~CRYPTO_ALG_TYPE_MASK;
-       type |= CRYPTO_ALG_TYPE_AHASH;
-       mask |= CRYPTO_ALG_TYPE_AHASH_MASK;
-
-       return __crypto_ahash_cast(crypto_alloc_base(alg_name, type, mask));
-}
-
-static inline struct crypto_tfm *crypto_ahash_tfm(struct crypto_ahash *tfm)
-{
-       return &tfm->base;
-}
-
-static inline void crypto_free_ahash(struct crypto_ahash *tfm)
-{
-       crypto_free_tfm(crypto_ahash_tfm(tfm));
-}
-
-static inline unsigned int crypto_ahash_alignmask(
-       struct crypto_ahash *tfm)
-{
-       return crypto_tfm_alg_alignmask(crypto_ahash_tfm(tfm));
-}
-
-static inline struct ahash_tfm *crypto_ahash_crt(struct crypto_ahash *tfm)
-{
-       return &crypto_ahash_tfm(tfm)->crt_ahash;
-}
-
-static inline unsigned int crypto_ahash_digestsize(struct crypto_ahash *tfm)
-{
-       return crypto_ahash_crt(tfm)->digestsize;
-}
-
-static inline u32 crypto_ahash_get_flags(struct crypto_ahash *tfm)
-{
-       return crypto_tfm_get_flags(crypto_ahash_tfm(tfm));
-}
-
-static inline void crypto_ahash_set_flags(struct crypto_ahash *tfm, u32 flags)
-{
-       crypto_tfm_set_flags(crypto_ahash_tfm(tfm), flags);
-}
-
-static inline void crypto_ahash_clear_flags(struct crypto_ahash *tfm, u32 flags)
-{
-       crypto_tfm_clear_flags(crypto_ahash_tfm(tfm), flags);
-}
-
-static inline struct crypto_ahash *crypto_ahash_reqtfm(
-       struct ahash_request *req)
-{
-       return __crypto_ahash_cast(req->base.tfm);
-}
-
-static inline unsigned int crypto_ahash_reqsize(struct crypto_ahash *tfm)
-{
-       return crypto_ahash_crt(tfm)->reqsize;
-}
-
-static inline int crypto_ahash_setkey(struct crypto_ahash *tfm,
-                                     const u8 *key, unsigned int keylen)
-{
-       struct ahash_tfm *crt = crypto_ahash_crt(tfm);
-
-       return crt->setkey(crt->base, key, keylen);
-}
-
-static inline int crypto_ahash_digest(struct ahash_request *req)
-{
-       struct ahash_tfm *crt = crypto_ahash_crt(crypto_ahash_reqtfm(req));
-       return crt->digest(req);
-}
-
-static inline void ahash_request_set_tfm(struct ahash_request *req,
-                                        struct crypto_ahash *tfm)
-{
-       req->base.tfm = crypto_ahash_tfm(crypto_ahash_crt(tfm)->base);
-}
-
-static inline struct ahash_request *ahash_request_alloc(
-       struct crypto_ahash *tfm, gfp_t gfp)
-{
-       struct ahash_request *req;
-
-       req = kmalloc(sizeof(struct ahash_request) +
-                     crypto_ahash_reqsize(tfm), gfp);
-
-       if (likely(req))
-               ahash_request_set_tfm(req, tfm);
-
-       return req;
-}
-
-static inline void ahash_request_free(struct ahash_request *req)
-{
-       kfree(req);
-}
-
-static inline struct ahash_request *ahash_request_cast(
-       struct crypto_async_request *req)
-{
-       return container_of(req, struct ahash_request, base);
-}
-
-static inline void ahash_request_set_callback(struct ahash_request *req,
-                                             u32 flags,
-                                             crypto_completion_t complete,
-                                             void *data)
-{
-       req->base.complete = complete;
-       req->base.data = data;
-       req->base.flags = flags;
-}
-
-static inline void ahash_request_set_crypt(struct ahash_request *req,
-                                          struct scatterlist *src, u8 *result,
-                                          unsigned int nbytes)
-{
-       req->src = src;
-       req->nbytes = nbytes;
-       req->result = result;
-}
-
 #endif /* _LINUX_CRYPTO_H */