linux/include/crypto/xts.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _CRYPTO_XTS_H
   3#define _CRYPTO_XTS_H
   4
   5#include <crypto/b128ops.h>
   6#include <crypto/internal/skcipher.h>
   7#include <linux/fips.h>
   8
   9#define XTS_BLOCK_SIZE 16
  10
  11static inline int xts_check_key(struct crypto_tfm *tfm,
  12                                const u8 *key, unsigned int keylen)
  13{
  14        /*
  15         * key consists of keys of equal size concatenated, therefore
  16         * the length must be even.
  17         */
  18        if (keylen % 2)
  19                return -EINVAL;
  20
  21        /* ensure that the AES and tweak key are not identical */
  22        if (fips_enabled && !crypto_memneq(key, key + (keylen / 2), keylen / 2))
  23                return -EINVAL;
  24
  25        return 0;
  26}
  27
  28static inline int xts_verify_key(struct crypto_skcipher *tfm,
  29                                 const u8 *key, unsigned int keylen)
  30{
  31        /*
  32         * key consists of keys of equal size concatenated, therefore
  33         * the length must be even.
  34         */
  35        if (keylen % 2)
  36                return -EINVAL;
  37
  38        /* ensure that the AES and tweak key are not identical */
  39        if ((fips_enabled || (crypto_skcipher_get_flags(tfm) &
  40                              CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)) &&
  41            !crypto_memneq(key, key + (keylen / 2), keylen / 2))
  42                return -EINVAL;
  43
  44        return 0;
  45}
  46
  47#endif  /* _CRYPTO_XTS_H */
  48