Whamcloud - gitweb
LU-5053 libcfs: clean up cfs_crypto_hash code
[fs/lustre-release.git] / libcfs / include / libcfs / libcfs_crypto.h
index 64ca62f..10f94d3 100644 (file)
@@ -37,7 +37,7 @@ struct cfs_crypto_hash_type {
 };
 
 enum cfs_crypto_hash_alg {
-       CFS_HASH_ALG_NULL       = 0,
+       CFS_HASH_ALG_NULL       = 0,
        CFS_HASH_ALG_ADLER32,
        CFS_HASH_ALG_CRC32,
        CFS_HASH_ALG_MD5,
@@ -46,89 +46,104 @@ enum cfs_crypto_hash_alg {
        CFS_HASH_ALG_SHA384,
        CFS_HASH_ALG_SHA512,
        CFS_HASH_ALG_CRC32C,
-       CFS_HASH_ALG_MAX
+       CFS_HASH_ALG_MAX,
+       CFS_HASH_ALG_UNKNOWN    = 0xff
 };
 
 static struct cfs_crypto_hash_type hash_types[] = {
-       [CFS_HASH_ALG_NULL]    = { "null",     0,      0 },
-       [CFS_HASH_ALG_ADLER32] = { "adler32",  1,      4 },
-       [CFS_HASH_ALG_CRC32]   = { "crc32",   ~0,      4 },
-       [CFS_HASH_ALG_CRC32C]  = { "crc32c",  ~0,      4 },
-       [CFS_HASH_ALG_MD5]     = { "md5",      0,     16 },
-       [CFS_HASH_ALG_SHA1]    = { "sha1",     0,     20 },
-       [CFS_HASH_ALG_SHA256]  = { "sha256",   0,     32 },
-       [CFS_HASH_ALG_SHA384]  = { "sha384",   0,     48 },
-       [CFS_HASH_ALG_SHA512]  = { "sha512",   0,     64 },
+       [CFS_HASH_ALG_NULL]     = { "null",      0,      0 },
+       [CFS_HASH_ALG_ADLER32]  = { "adler32",   1,      4 },
+       [CFS_HASH_ALG_CRC32]    = { "crc32",    ~0,      4 },
+       [CFS_HASH_ALG_CRC32C]   = { "crc32c",   ~0,      4 },
+       [CFS_HASH_ALG_MD5]      = { "md5",       0,     16 },
+       [CFS_HASH_ALG_SHA1]     = { "sha1",      0,     20 },
+       [CFS_HASH_ALG_SHA256]   = { "sha256",    0,     32 },
+       [CFS_HASH_ALG_SHA384]   = { "sha384",    0,     48 },
+       [CFS_HASH_ALG_SHA512]   = { "sha512",    0,     64 },
+       [CFS_HASH_ALG_MAX]      = { NULL,        0,     64 },
 };
 
-/**    Return pointer to type of hash for valid hash algorithm identifier */
-static inline const struct cfs_crypto_hash_type *
-                   cfs_crypto_hash_type(unsigned char hash_alg)
+/* Maximum size of hash_types[].cht_size */
+#define CFS_CRYPTO_HASH_DIGESTSIZE_MAX 64
+
+/**
+ * Return hash algorithm information for the specified algorithm identifier
+ *
+ * Hash information includes algorithm name, initial seed, hash size.
+ *
+ * \retval             cfs_crypto_hash_type for valid ID (CFS_HASH_ALG_*)
+ * \retval             NULL for unknown algorithm identifier
+ */
+static inline const struct
+cfs_crypto_hash_type *cfs_crypto_hash_type(enum cfs_crypto_hash_alg hash_alg)
 {
        struct cfs_crypto_hash_type *ht;
 
        if (hash_alg < CFS_HASH_ALG_MAX) {
                ht = &hash_types[hash_alg];
-               if (ht->cht_name)
+               if (ht->cht_name != NULL)
                        return ht;
        }
        return NULL;
 }
 
-/**     Return hash name for valid hash algorithm identifier or "unknown" */
-static inline const char *cfs_crypto_hash_name(unsigned char hash_alg)
+/**
+ * Return hash name for hash algorithm identifier
+ *
+ * \param[in] hash_alg hash alrgorithm id (CFS_HASH_ALG_*)
+ *
+ * \retval             string name of known hash algorithm
+ * \retval             "unknown" if hash algorithm is unknown
+ */
+static inline const
+char *cfs_crypto_hash_name(enum cfs_crypto_hash_alg hash_alg)
 {
        const struct cfs_crypto_hash_type *ht;
 
        ht = cfs_crypto_hash_type(hash_alg);
        if (ht)
                return ht->cht_name;
-       else
-               return "unknown";
+
+       return "unknown";
 }
 
-/**     Return digest size for valid algorithm identifier or 0 */
-static inline int cfs_crypto_hash_digestsize(unsigned char hash_alg)
+/**
+ * Return digest size for hash algorithm type
+ *
+ * \param[in] hash_alg hash alrgorithm id (CFS_HASH_ALG_*)
+ *
+ * \retval             hash algorithm digest size in bytes
+ * \retval             0 if hash algorithm type is unknown
+ */
+static inline int cfs_crypto_hash_digestsize(enum cfs_crypto_hash_alg hash_alg)
 {
        const struct cfs_crypto_hash_type *ht;
 
        ht = cfs_crypto_hash_type(hash_alg);
-       if (ht)
+       if (ht != NULL)
                return ht->cht_size;
-       else
-               return 0;
+
+       return 0;
 }
 
-/**     Return hash identifier for valid hash algorithm name or 0xFF */
+/**
+ * Find hash algorithm ID for the specified algorithm name
+ *
+ * \retval             hash algorithm ID for valid ID (CFS_HASH_ALG_*)
+ * \retval             CFS_HASH_ALG_UNKNOWN for unknown algorithm name
+ */
 static inline unsigned char cfs_crypto_hash_alg(const char *algname)
 {
-       unsigned char   i;
+       enum cfs_crypto_hash_alg hash_alg;
+
+       for (hash_alg = 0; hash_alg < CFS_HASH_ALG_MAX; hash_alg++)
+               if (strcmp(hash_types[hash_alg].cht_name, algname) == 0)
+                       return hash_alg;
 
-       for (i = 0; i < CFS_HASH_ALG_MAX; i++)
-               if (!strcmp(hash_types[i].cht_name, algname))
-                       break;
-       return (i == CFS_HASH_ALG_MAX ? 0xFF : i);
+       return CFS_HASH_ALG_UNKNOWN;
 }
 
-/**     Calculate hash digest for buffer.
- *      @param alg         id of hash algorithm
- *      @param buf         buffer of data
- *      @param buf_len buffer len
- *      @param key         initial value for algorithm, if it is NULL,
- *                         default initial value should be used.
- *      @param key_len len of initial value
- *      @param hash       [out] pointer to hash, if it is NULL, hash_len is
- *                         set to valid digest size in bytes, retval -ENOSPC.
- *      @param hash_len       [in,out] size of hash buffer
- *      @returns             status of operation
- *      @retval -EINVAL       if buf, buf_len, hash_len or alg_id is invalid
- *      @retval -ENODEV       if this algorithm is unsupported
- *      @retval -ENOSPC       if pointer to hash is NULL, or hash_len less than
- *                         digest size
- *      @retval 0           for success
- *      @retval < 0       other errors from lower layers.
- */
-int cfs_crypto_hash_digest(unsigned char alg,
+int cfs_crypto_hash_digest(enum cfs_crypto_hash_alg hash_alg,
                           const void *buf, unsigned int buf_len,
                           unsigned char *key, unsigned int key_len,
                           unsigned char *hash, unsigned int *hash_len);
@@ -136,66 +151,17 @@ int cfs_crypto_hash_digest(unsigned char alg,
 /* cfs crypto hash descriptor */
 struct cfs_crypto_hash_desc;
 
-/**     Allocate and initialize desriptor for hash algorithm.
- *      @param alg         algorithm id
- *      @param key         initial value for algorithm, if it is NULL,
- *                         default initial value should be used.
- *      @param key_len len of initial value
- *      @returns             pointer to descriptor of hash instance
- *      @retval ERR_PTR(error) when errors occured.
- */
-struct cfs_crypto_hash_desc*
-       cfs_crypto_hash_init(unsigned char alg,
+struct cfs_crypto_hash_desc *
+       cfs_crypto_hash_init(enum cfs_crypto_hash_alg hash_alg,
                             unsigned char *key, unsigned int key_len);
-
-/**    Update digest by part of data.
- *     @param desc           hash descriptor
- *     @param page           data page
- *     @param offset       data offset
- *     @param len             data len
- *     @returns                 status of operation
- *     @retval 0               for success.
- */
 int cfs_crypto_hash_update_page(struct cfs_crypto_hash_desc *desc,
                                struct page *page, unsigned int offset,
                                unsigned int len);
-
-/**    Update digest by part of data.
- *     @param desc           hash descriptor
- *     @param buf             pointer to data buffer
- *     @param buf_len     size of data at buffer
- *     @returns                 status of operation
- *     @retval 0               for success.
- */
 int cfs_crypto_hash_update(struct cfs_crypto_hash_desc *desc, const void *buf,
                           unsigned int buf_len);
-
-/**    Finalize hash calculation, copy hash digest to buffer, destroy hash
- *     descriptor.
- *     @param desc           hash descriptor
- *     @param hash           buffer pointer to store hash digest
- *     @param hash_len   pointer to hash buffer size, if NULL
- *                           destory hash descriptor
- *     @returns                 status of operation
- *     @retval -ENOSPC   if hash is NULL, or *hash_len less than
- *                           digest size
- *     @retval 0               for success
- *     @retval < 0           other errors from lower layers.
- */
 int cfs_crypto_hash_final(struct cfs_crypto_hash_desc *desc,
                          unsigned char *hash, unsigned int *hash_len);
-/**
- *      Register crypto hash algorithms
- */
 int cfs_crypto_register(void);
-
-/**
- *      Unregister
- */
 void cfs_crypto_unregister(void);
-
-/**     Return hash speed in Mbytes per second for valid hash algorithm
- *      identifier. If test was unsuccessfull -1 would be return.
- */
-int cfs_crypto_hash_speed(unsigned char hash_alg);
+int cfs_crypto_hash_speed(enum cfs_crypto_hash_alg hash_alg);
 #endif