fscrypt_private.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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/fscrypto.h>
  13. #define FS_FNAME_CRYPTO_DIGEST_SIZE 32
  14. /* Encryption parameters */
  15. #define FS_XTS_TWEAK_SIZE 16
  16. #define FS_AES_128_ECB_KEY_SIZE 16
  17. #define FS_AES_256_GCM_KEY_SIZE 32
  18. #define FS_AES_256_CBC_KEY_SIZE 32
  19. #define FS_AES_256_CTS_KEY_SIZE 32
  20. #define FS_AES_256_XTS_KEY_SIZE 64
  21. #define FS_MAX_KEY_SIZE 64
  22. #define FS_KEY_DESC_PREFIX "fscrypt:"
  23. #define FS_KEY_DESC_PREFIX_SIZE 8
  24. #define FS_KEY_DERIVATION_NONCE_SIZE 16
  25. /**
  26. * Encryption context for inode
  27. *
  28. * Protector format:
  29. * 1 byte: Protector format (1 = this version)
  30. * 1 byte: File contents encryption mode
  31. * 1 byte: File names encryption mode
  32. * 1 byte: Flags
  33. * 8 bytes: Master Key descriptor
  34. * 16 bytes: Encryption Key derivation nonce
  35. */
  36. struct fscrypt_context {
  37. u8 format;
  38. u8 contents_encryption_mode;
  39. u8 filenames_encryption_mode;
  40. u8 flags;
  41. u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
  42. u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
  43. } __packed;
  44. #define FS_ENCRYPTION_CONTEXT_FORMAT_V1 1
  45. /* This is passed in from userspace into the kernel keyring */
  46. struct fscrypt_key {
  47. u32 mode;
  48. u8 raw[FS_MAX_KEY_SIZE];
  49. u32 size;
  50. } __packed;
  51. /*
  52. * A pointer to this structure is stored in the file system's in-core
  53. * representation of an inode.
  54. */
  55. struct fscrypt_info {
  56. u8 ci_data_mode;
  57. u8 ci_filename_mode;
  58. u8 ci_flags;
  59. struct crypto_skcipher *ci_ctfm;
  60. struct key *ci_keyring_key;
  61. u8 ci_master_key[FS_KEY_DESCRIPTOR_SIZE];
  62. };
  63. #define FS_CTX_REQUIRES_FREE_ENCRYPT_FL 0x00000001
  64. #define FS_CTX_HAS_BOUNCE_BUFFER_FL 0x00000002
  65. struct fscrypt_completion_result {
  66. struct completion completion;
  67. int res;
  68. };
  69. #define DECLARE_FS_COMPLETION_RESULT(ecr) \
  70. struct fscrypt_completion_result ecr = { \
  71. COMPLETION_INITIALIZER((ecr).completion), 0 }
  72. /* crypto.c */
  73. int fscrypt_initialize(unsigned int cop_flags);
  74. /* keyinfo.c */
  75. extern int fscrypt_get_crypt_info(struct inode *);
  76. #endif /* _FSCRYPT_PRIVATE_H */