fscrypt_private.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * fscrypt_private.h
  3. *
  4. * Copyright (C) 2015, Google, Inc.
  5. *
  6. * This contains encryption key functions.
  7. *
  8. * Written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar, 2015.
  9. */
  10. #ifndef _FSCRYPT_PRIVATE_H
  11. #define _FSCRYPT_PRIVATE_H
  12. #include <linux/fscrypt_supp.h>
  13. #include <crypto/hash.h>
  14. /* Encryption parameters */
  15. #define FS_IV_SIZE 16
  16. #define FS_AES_128_ECB_KEY_SIZE 16
  17. #define FS_AES_128_CBC_KEY_SIZE 16
  18. #define FS_AES_128_CTS_KEY_SIZE 16
  19. #define FS_AES_256_GCM_KEY_SIZE 32
  20. #define FS_AES_256_CBC_KEY_SIZE 32
  21. #define FS_AES_256_CTS_KEY_SIZE 32
  22. #define FS_AES_256_XTS_KEY_SIZE 64
  23. #define FS_KEY_DERIVATION_NONCE_SIZE 16
  24. /**
  25. * Encryption context for inode
  26. *
  27. * Protector format:
  28. * 1 byte: Protector format (1 = this version)
  29. * 1 byte: File contents encryption mode
  30. * 1 byte: File names encryption mode
  31. * 1 byte: Flags
  32. * 8 bytes: Master Key descriptor
  33. * 16 bytes: Encryption Key derivation nonce
  34. */
  35. struct fscrypt_context {
  36. u8 format;
  37. u8 contents_encryption_mode;
  38. u8 filenames_encryption_mode;
  39. u8 flags;
  40. u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
  41. u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
  42. } __packed;
  43. #define FS_ENCRYPTION_CONTEXT_FORMAT_V1 1
  44. /*
  45. * A pointer to this structure is stored in the file system's in-core
  46. * representation of an inode.
  47. */
  48. struct fscrypt_info {
  49. u8 ci_data_mode;
  50. u8 ci_filename_mode;
  51. u8 ci_flags;
  52. struct crypto_skcipher *ci_ctfm;
  53. struct crypto_cipher *ci_essiv_tfm;
  54. u8 ci_master_key[FS_KEY_DESCRIPTOR_SIZE];
  55. };
  56. typedef enum {
  57. FS_DECRYPT = 0,
  58. FS_ENCRYPT,
  59. } fscrypt_direction_t;
  60. #define FS_CTX_REQUIRES_FREE_ENCRYPT_FL 0x00000001
  61. #define FS_CTX_HAS_BOUNCE_BUFFER_FL 0x00000002
  62. struct fscrypt_completion_result {
  63. struct completion completion;
  64. int res;
  65. };
  66. #define DECLARE_FS_COMPLETION_RESULT(ecr) \
  67. struct fscrypt_completion_result ecr = { \
  68. COMPLETION_INITIALIZER_ONSTACK((ecr).completion), 0 }
  69. /* crypto.c */
  70. extern int fscrypt_initialize(unsigned int cop_flags);
  71. extern struct workqueue_struct *fscrypt_read_workqueue;
  72. extern int fscrypt_do_page_crypto(const struct inode *inode,
  73. fscrypt_direction_t rw, u64 lblk_num,
  74. struct page *src_page,
  75. struct page *dest_page,
  76. unsigned int len, unsigned int offs,
  77. gfp_t gfp_flags);
  78. extern struct page *fscrypt_alloc_bounce_page(struct fscrypt_ctx *ctx,
  79. gfp_t gfp_flags);
  80. /* keyinfo.c */
  81. extern void __exit fscrypt_essiv_cleanup(void);
  82. #endif /* _FSCRYPT_PRIVATE_H */