diff options
Diffstat (limited to 'fs/ecryptfs')
-rw-r--r-- | fs/ecryptfs/Kconfig | 11 | ||||
-rw-r--r-- | fs/ecryptfs/crypto.c | 514 | ||||
-rw-r--r-- | fs/ecryptfs/ecryptfs_kernel.h | 105 | ||||
-rw-r--r-- | fs/ecryptfs/file.c | 45 | ||||
-rw-r--r-- | fs/ecryptfs/inode.c | 303 | ||||
-rw-r--r-- | fs/ecryptfs/keystore.c | 651 | ||||
-rw-r--r-- | fs/ecryptfs/main.c | 126 | ||||
-rw-r--r-- | fs/ecryptfs/messaging.c | 4 | ||||
-rw-r--r-- | fs/ecryptfs/miscdev.c | 18 | ||||
-rw-r--r-- | fs/ecryptfs/mmap.c | 2 |
10 files changed, 1413 insertions, 366 deletions
diff --git a/fs/ecryptfs/Kconfig b/fs/ecryptfs/Kconfig new file mode 100644 index 000000000000..0c754e64232b --- /dev/null +++ b/fs/ecryptfs/Kconfig | |||
@@ -0,0 +1,11 @@ | |||
1 | config ECRYPT_FS | ||
2 | tristate "eCrypt filesystem layer support (EXPERIMENTAL)" | ||
3 | depends on EXPERIMENTAL && KEYS && CRYPTO && NET | ||
4 | help | ||
5 | Encrypted filesystem that operates on the VFS layer. See | ||
6 | <file:Documentation/filesystems/ecryptfs.txt> to learn more about | ||
7 | eCryptfs. Userspace components are required and can be | ||
8 | obtained from <http://ecryptfs.sf.net>. | ||
9 | |||
10 | To compile this file system support as a module, choose M here: the | ||
11 | module will be called ecryptfs. | ||
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 6046239465a1..c01e043670e2 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
@@ -175,8 +175,8 @@ out: | |||
175 | * | 175 | * |
176 | * Returns zero on success; non-zero on error. | 176 | * Returns zero on success; non-zero on error. |
177 | */ | 177 | */ |
178 | static int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat, | 178 | int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat, |
179 | loff_t offset) | 179 | loff_t offset) |
180 | { | 180 | { |
181 | int rc = 0; | 181 | int rc = 0; |
182 | char dst[MD5_DIGEST_SIZE]; | 182 | char dst[MD5_DIGEST_SIZE]; |
@@ -924,6 +924,15 @@ static void ecryptfs_copy_mount_wide_flags_to_inode_flags( | |||
924 | crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR; | 924 | crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR; |
925 | if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) | 925 | if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) |
926 | crypt_stat->flags |= ECRYPTFS_VIEW_AS_ENCRYPTED; | 926 | crypt_stat->flags |= ECRYPTFS_VIEW_AS_ENCRYPTED; |
927 | if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) { | ||
928 | crypt_stat->flags |= ECRYPTFS_ENCRYPT_FILENAMES; | ||
929 | if (mount_crypt_stat->flags | ||
930 | & ECRYPTFS_GLOBAL_ENCFN_USE_MOUNT_FNEK) | ||
931 | crypt_stat->flags |= ECRYPTFS_ENCFN_USE_MOUNT_FNEK; | ||
932 | else if (mount_crypt_stat->flags | ||
933 | & ECRYPTFS_GLOBAL_ENCFN_USE_FEK) | ||
934 | crypt_stat->flags |= ECRYPTFS_ENCFN_USE_FEK; | ||
935 | } | ||
927 | } | 936 | } |
928 | 937 | ||
929 | static int ecryptfs_copy_mount_wide_sigs_to_inode_sigs( | 938 | static int ecryptfs_copy_mount_wide_sigs_to_inode_sigs( |
@@ -1060,7 +1069,8 @@ struct ecryptfs_flag_map_elem { | |||
1060 | static struct ecryptfs_flag_map_elem ecryptfs_flag_map[] = { | 1069 | static struct ecryptfs_flag_map_elem ecryptfs_flag_map[] = { |
1061 | {0x00000001, ECRYPTFS_ENABLE_HMAC}, | 1070 | {0x00000001, ECRYPTFS_ENABLE_HMAC}, |
1062 | {0x00000002, ECRYPTFS_ENCRYPTED}, | 1071 | {0x00000002, ECRYPTFS_ENCRYPTED}, |
1063 | {0x00000004, ECRYPTFS_METADATA_IN_XATTR} | 1072 | {0x00000004, ECRYPTFS_METADATA_IN_XATTR}, |
1073 | {0x00000008, ECRYPTFS_ENCRYPT_FILENAMES} | ||
1064 | }; | 1074 | }; |
1065 | 1075 | ||
1066 | /** | 1076 | /** |
@@ -1149,19 +1159,20 @@ ecryptfs_cipher_code_str_map[] = { | |||
1149 | 1159 | ||
1150 | /** | 1160 | /** |
1151 | * ecryptfs_code_for_cipher_string | 1161 | * ecryptfs_code_for_cipher_string |
1152 | * @crypt_stat: The cryptographic context | 1162 | * @cipher_name: The string alias for the cipher |
1163 | * @key_bytes: Length of key in bytes; used for AES code selection | ||
1153 | * | 1164 | * |
1154 | * Returns zero on no match, or the cipher code on match | 1165 | * Returns zero on no match, or the cipher code on match |
1155 | */ | 1166 | */ |
1156 | u8 ecryptfs_code_for_cipher_string(struct ecryptfs_crypt_stat *crypt_stat) | 1167 | u8 ecryptfs_code_for_cipher_string(char *cipher_name, size_t key_bytes) |
1157 | { | 1168 | { |
1158 | int i; | 1169 | int i; |
1159 | u8 code = 0; | 1170 | u8 code = 0; |
1160 | struct ecryptfs_cipher_code_str_map_elem *map = | 1171 | struct ecryptfs_cipher_code_str_map_elem *map = |
1161 | ecryptfs_cipher_code_str_map; | 1172 | ecryptfs_cipher_code_str_map; |
1162 | 1173 | ||
1163 | if (strcmp(crypt_stat->cipher, "aes") == 0) { | 1174 | if (strcmp(cipher_name, "aes") == 0) { |
1164 | switch (crypt_stat->key_size) { | 1175 | switch (key_bytes) { |
1165 | case 16: | 1176 | case 16: |
1166 | code = RFC2440_CIPHER_AES_128; | 1177 | code = RFC2440_CIPHER_AES_128; |
1167 | break; | 1178 | break; |
@@ -1173,7 +1184,7 @@ u8 ecryptfs_code_for_cipher_string(struct ecryptfs_crypt_stat *crypt_stat) | |||
1173 | } | 1184 | } |
1174 | } else { | 1185 | } else { |
1175 | for (i = 0; i < ARRAY_SIZE(ecryptfs_cipher_code_str_map); i++) | 1186 | for (i = 0; i < ARRAY_SIZE(ecryptfs_cipher_code_str_map); i++) |
1176 | if (strcmp(crypt_stat->cipher, map[i].cipher_str) == 0){ | 1187 | if (strcmp(cipher_name, map[i].cipher_str) == 0) { |
1177 | code = map[i].cipher_code; | 1188 | code = map[i].cipher_code; |
1178 | break; | 1189 | break; |
1179 | } | 1190 | } |
@@ -1212,6 +1223,8 @@ int ecryptfs_read_and_validate_header_region(char *data, | |||
1212 | &(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat); | 1223 | &(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat); |
1213 | int rc; | 1224 | int rc; |
1214 | 1225 | ||
1226 | if (crypt_stat->extent_size == 0) | ||
1227 | crypt_stat->extent_size = ECRYPTFS_DEFAULT_EXTENT_SIZE; | ||
1215 | rc = ecryptfs_read_lower(data, 0, crypt_stat->extent_size, | 1228 | rc = ecryptfs_read_lower(data, 0, crypt_stat->extent_size, |
1216 | ecryptfs_inode); | 1229 | ecryptfs_inode); |
1217 | if (rc) { | 1230 | if (rc) { |
@@ -1221,7 +1234,6 @@ int ecryptfs_read_and_validate_header_region(char *data, | |||
1221 | } | 1234 | } |
1222 | if (!contains_ecryptfs_marker(data + ECRYPTFS_FILE_SIZE_BYTES)) { | 1235 | if (!contains_ecryptfs_marker(data + ECRYPTFS_FILE_SIZE_BYTES)) { |
1223 | rc = -EINVAL; | 1236 | rc = -EINVAL; |
1224 | ecryptfs_printk(KERN_DEBUG, "Valid marker not found\n"); | ||
1225 | } | 1237 | } |
1226 | out: | 1238 | out: |
1227 | return rc; | 1239 | return rc; |
@@ -1628,95 +1640,95 @@ out: | |||
1628 | } | 1640 | } |
1629 | 1641 | ||
1630 | /** | 1642 | /** |
1631 | * ecryptfs_encode_filename - converts a plaintext file name to cipher text | 1643 | * ecryptfs_encrypt_filename - encrypt filename |
1632 | * @crypt_stat: The crypt_stat struct associated with the file anem to encode | ||
1633 | * @name: The plaintext name | ||
1634 | * @length: The length of the plaintext | ||
1635 | * @encoded_name: The encypted name | ||
1636 | * | 1644 | * |
1637 | * Encrypts and encodes a filename into something that constitutes a | 1645 | * CBC-encrypts the filename. We do not want to encrypt the same |
1638 | * valid filename for a filesystem, with printable characters. | 1646 | * filename with the same key and IV, which may happen with hard |
1647 | * links, so we prepend random bits to each filename. | ||
1639 | * | 1648 | * |
1640 | * We assume that we have a properly initialized crypto context, | 1649 | * Returns zero on success; non-zero otherwise |
1641 | * pointed to by crypt_stat->tfm. | ||
1642 | * | ||
1643 | * TODO: Implement filename decoding and decryption here, in place of | ||
1644 | * memcpy. We are keeping the framework around for now to (1) | ||
1645 | * facilitate testing of the components needed to implement filename | ||
1646 | * encryption and (2) to provide a code base from which other | ||
1647 | * developers in the community can easily implement this feature. | ||
1648 | * | ||
1649 | * Returns the length of encoded filename; negative if error | ||
1650 | */ | 1650 | */ |
1651 | int | 1651 | static int |
1652 | ecryptfs_encode_filename(struct ecryptfs_crypt_stat *crypt_stat, | 1652 | ecryptfs_encrypt_filename(struct ecryptfs_filename *filename, |
1653 | const char *name, int length, char **encoded_name) | 1653 | struct ecryptfs_crypt_stat *crypt_stat, |
1654 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat) | ||
1654 | { | 1655 | { |
1655 | int error = 0; | 1656 | int rc = 0; |
1656 | 1657 | ||
1657 | (*encoded_name) = kmalloc(length + 2, GFP_KERNEL); | 1658 | filename->encrypted_filename = NULL; |
1658 | if (!(*encoded_name)) { | 1659 | filename->encrypted_filename_size = 0; |
1659 | error = -ENOMEM; | 1660 | if ((crypt_stat && (crypt_stat->flags & ECRYPTFS_ENCFN_USE_MOUNT_FNEK)) |
1661 | || (mount_crypt_stat && (mount_crypt_stat->flags | ||
1662 | & ECRYPTFS_GLOBAL_ENCFN_USE_MOUNT_FNEK))) { | ||
1663 | size_t packet_size; | ||
1664 | size_t remaining_bytes; | ||
1665 | |||
1666 | rc = ecryptfs_write_tag_70_packet( | ||
1667 | NULL, NULL, | ||
1668 | &filename->encrypted_filename_size, | ||
1669 | mount_crypt_stat, NULL, | ||
1670 | filename->filename_size); | ||
1671 | if (rc) { | ||
1672 | printk(KERN_ERR "%s: Error attempting to get packet " | ||
1673 | "size for tag 72; rc = [%d]\n", __func__, | ||
1674 | rc); | ||
1675 | filename->encrypted_filename_size = 0; | ||
1676 | goto out; | ||
1677 | } | ||
1678 | filename->encrypted_filename = | ||
1679 | kmalloc(filename->encrypted_filename_size, GFP_KERNEL); | ||
1680 | if (!filename->encrypted_filename) { | ||
1681 | printk(KERN_ERR "%s: Out of memory whilst attempting " | ||
1682 | "to kmalloc [%zd] bytes\n", __func__, | ||
1683 | filename->encrypted_filename_size); | ||
1684 | rc = -ENOMEM; | ||
1685 | goto out; | ||
1686 | } | ||
1687 | remaining_bytes = filename->encrypted_filename_size; | ||
1688 | rc = ecryptfs_write_tag_70_packet(filename->encrypted_filename, | ||
1689 | &remaining_bytes, | ||
1690 | &packet_size, | ||
1691 | mount_crypt_stat, | ||
1692 | filename->filename, | ||
1693 | filename->filename_size); | ||
1694 | if (rc) { | ||
1695 | printk(KERN_ERR "%s: Error attempting to generate " | ||
1696 | "tag 70 packet; rc = [%d]\n", __func__, | ||
1697 | rc); | ||
1698 | kfree(filename->encrypted_filename); | ||
1699 | filename->encrypted_filename = NULL; | ||
1700 | filename->encrypted_filename_size = 0; | ||
1701 | goto out; | ||
1702 | } | ||
1703 | filename->encrypted_filename_size = packet_size; | ||
1704 | } else { | ||
1705 | printk(KERN_ERR "%s: No support for requested filename " | ||
1706 | "encryption method in this release\n", __func__); | ||
1707 | rc = -ENOTSUPP; | ||
1660 | goto out; | 1708 | goto out; |
1661 | } | 1709 | } |
1662 | /* TODO: Filename encryption is a scheduled feature for a | ||
1663 | * future version of eCryptfs. This function is here only for | ||
1664 | * the purpose of providing a framework for other developers | ||
1665 | * to easily implement filename encryption. Hint: Replace this | ||
1666 | * memcpy() with a call to encrypt and encode the | ||
1667 | * filename, the set the length accordingly. */ | ||
1668 | memcpy((void *)(*encoded_name), (void *)name, length); | ||
1669 | (*encoded_name)[length] = '\0'; | ||
1670 | error = length + 1; | ||
1671 | out: | 1710 | out: |
1672 | return error; | 1711 | return rc; |
1673 | } | 1712 | } |
1674 | 1713 | ||
1675 | /** | 1714 | static int ecryptfs_copy_filename(char **copied_name, size_t *copied_name_size, |
1676 | * ecryptfs_decode_filename - converts the cipher text name to plaintext | 1715 | const char *name, size_t name_size) |
1677 | * @crypt_stat: The crypt_stat struct associated with the file | ||
1678 | * @name: The filename in cipher text | ||
1679 | * @length: The length of the cipher text name | ||
1680 | * @decrypted_name: The plaintext name | ||
1681 | * | ||
1682 | * Decodes and decrypts the filename. | ||
1683 | * | ||
1684 | * We assume that we have a properly initialized crypto context, | ||
1685 | * pointed to by crypt_stat->tfm. | ||
1686 | * | ||
1687 | * TODO: Implement filename decoding and decryption here, in place of | ||
1688 | * memcpy. We are keeping the framework around for now to (1) | ||
1689 | * facilitate testing of the components needed to implement filename | ||
1690 | * encryption and (2) to provide a code base from which other | ||
1691 | * developers in the community can easily implement this feature. | ||
1692 | * | ||
1693 | * Returns the length of decoded filename; negative if error | ||
1694 | */ | ||
1695 | int | ||
1696 | ecryptfs_decode_filename(struct ecryptfs_crypt_stat *crypt_stat, | ||
1697 | const char *name, int length, char **decrypted_name) | ||
1698 | { | 1716 | { |
1699 | int error = 0; | 1717 | int rc = 0; |
1700 | 1718 | ||
1701 | (*decrypted_name) = kmalloc(length + 2, GFP_KERNEL); | 1719 | (*copied_name) = kmalloc((name_size + 2), GFP_KERNEL); |
1702 | if (!(*decrypted_name)) { | 1720 | if (!(*copied_name)) { |
1703 | error = -ENOMEM; | 1721 | rc = -ENOMEM; |
1704 | goto out; | 1722 | goto out; |
1705 | } | 1723 | } |
1706 | /* TODO: Filename encryption is a scheduled feature for a | 1724 | memcpy((void *)(*copied_name), (void *)name, name_size); |
1707 | * future version of eCryptfs. This function is here only for | 1725 | (*copied_name)[(name_size)] = '\0'; /* Only for convenience |
1708 | * the purpose of providing a framework for other developers | ||
1709 | * to easily implement filename encryption. Hint: Replace this | ||
1710 | * memcpy() with a call to decode and decrypt the | ||
1711 | * filename, the set the length accordingly. */ | ||
1712 | memcpy((void *)(*decrypted_name), (void *)name, length); | ||
1713 | (*decrypted_name)[length + 1] = '\0'; /* Only for convenience | ||
1714 | * in printing out the | 1726 | * in printing out the |
1715 | * string in debug | 1727 | * string in debug |
1716 | * messages */ | 1728 | * messages */ |
1717 | error = length; | 1729 | (*copied_name_size) = (name_size + 1); |
1718 | out: | 1730 | out: |
1719 | return error; | 1731 | return rc; |
1720 | } | 1732 | } |
1721 | 1733 | ||
1722 | /** | 1734 | /** |
@@ -1740,7 +1752,7 @@ ecryptfs_process_key_cipher(struct crypto_blkcipher **key_tfm, | |||
1740 | *key_tfm = NULL; | 1752 | *key_tfm = NULL; |
1741 | if (*key_size > ECRYPTFS_MAX_KEY_BYTES) { | 1753 | if (*key_size > ECRYPTFS_MAX_KEY_BYTES) { |
1742 | rc = -EINVAL; | 1754 | rc = -EINVAL; |
1743 | printk(KERN_ERR "Requested key size is [%Zd] bytes; maximum " | 1755 | printk(KERN_ERR "Requested key size is [%zd] bytes; maximum " |
1744 | "allowable is [%d]\n", *key_size, ECRYPTFS_MAX_KEY_BYTES); | 1756 | "allowable is [%d]\n", *key_size, ECRYPTFS_MAX_KEY_BYTES); |
1745 | goto out; | 1757 | goto out; |
1746 | } | 1758 | } |
@@ -1765,7 +1777,7 @@ ecryptfs_process_key_cipher(struct crypto_blkcipher **key_tfm, | |||
1765 | get_random_bytes(dummy_key, *key_size); | 1777 | get_random_bytes(dummy_key, *key_size); |
1766 | rc = crypto_blkcipher_setkey(*key_tfm, dummy_key, *key_size); | 1778 | rc = crypto_blkcipher_setkey(*key_tfm, dummy_key, *key_size); |
1767 | if (rc) { | 1779 | if (rc) { |
1768 | printk(KERN_ERR "Error attempting to set key of size [%Zd] for " | 1780 | printk(KERN_ERR "Error attempting to set key of size [%zd] for " |
1769 | "cipher [%s]; rc = [%d]\n", *key_size, cipher_name, rc); | 1781 | "cipher [%s]; rc = [%d]\n", *key_size, cipher_name, rc); |
1770 | rc = -EINVAL; | 1782 | rc = -EINVAL; |
1771 | goto out; | 1783 | goto out; |
@@ -1910,3 +1922,341 @@ out: | |||
1910 | mutex_unlock(&key_tfm_list_mutex); | 1922 | mutex_unlock(&key_tfm_list_mutex); |
1911 | return rc; | 1923 | return rc; |
1912 | } | 1924 | } |
1925 | |||
1926 | /* 64 characters forming a 6-bit target field */ | ||
1927 | static unsigned char *portable_filename_chars = ("-.0123456789ABCD" | ||
1928 | "EFGHIJKLMNOPQRST" | ||
1929 | "UVWXYZabcdefghij" | ||
1930 | "klmnopqrstuvwxyz"); | ||
1931 | |||
1932 | /* We could either offset on every reverse map or just pad some 0x00's | ||
1933 | * at the front here */ | ||
1934 | static const unsigned char filename_rev_map[] = { | ||
1935 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 7 */ | ||
1936 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 15 */ | ||
1937 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 23 */ | ||
1938 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 31 */ | ||
1939 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 39 */ | ||
1940 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, /* 47 */ | ||
1941 | 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, /* 55 */ | ||
1942 | 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 63 */ | ||
1943 | 0x00, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, /* 71 */ | ||
1944 | 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, /* 79 */ | ||
1945 | 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, /* 87 */ | ||
1946 | 0x23, 0x24, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, /* 95 */ | ||
1947 | 0x00, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, /* 103 */ | ||
1948 | 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, /* 111 */ | ||
1949 | 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, /* 119 */ | ||
1950 | 0x3D, 0x3E, 0x3F | ||
1951 | }; | ||
1952 | |||
1953 | /** | ||
1954 | * ecryptfs_encode_for_filename | ||
1955 | * @dst: Destination location for encoded filename | ||
1956 | * @dst_size: Size of the encoded filename in bytes | ||
1957 | * @src: Source location for the filename to encode | ||
1958 | * @src_size: Size of the source in bytes | ||
1959 | */ | ||
1960 | void ecryptfs_encode_for_filename(unsigned char *dst, size_t *dst_size, | ||
1961 | unsigned char *src, size_t src_size) | ||
1962 | { | ||
1963 | size_t num_blocks; | ||
1964 | size_t block_num = 0; | ||
1965 | size_t dst_offset = 0; | ||
1966 | unsigned char last_block[3]; | ||
1967 | |||
1968 | if (src_size == 0) { | ||
1969 | (*dst_size) = 0; | ||
1970 | goto out; | ||
1971 | } | ||
1972 | num_blocks = (src_size / 3); | ||
1973 | if ((src_size % 3) == 0) { | ||
1974 | memcpy(last_block, (&src[src_size - 3]), 3); | ||
1975 | } else { | ||
1976 | num_blocks++; | ||
1977 | last_block[2] = 0x00; | ||
1978 | switch (src_size % 3) { | ||
1979 | case 1: | ||
1980 | last_block[0] = src[src_size - 1]; | ||
1981 | last_block[1] = 0x00; | ||
1982 | break; | ||
1983 | case 2: | ||
1984 | last_block[0] = src[src_size - 2]; | ||
1985 | last_block[1] = src[src_size - 1]; | ||
1986 | } | ||
1987 | } | ||
1988 | (*dst_size) = (num_blocks * 4); | ||
1989 | if (!dst) | ||
1990 | goto out; | ||
1991 | while (block_num < num_blocks) { | ||
1992 | unsigned char *src_block; | ||
1993 | unsigned char dst_block[4]; | ||
1994 | |||
1995 | if (block_num == (num_blocks - 1)) | ||
1996 | src_block = last_block; | ||
1997 | else | ||
1998 | src_block = &src[block_num * 3]; | ||
1999 | dst_block[0] = ((src_block[0] >> 2) & 0x3F); | ||
2000 | dst_block[1] = (((src_block[0] << 4) & 0x30) | ||
2001 | | ((src_block[1] >> 4) & 0x0F)); | ||
2002 | dst_block[2] = (((src_block[1] << 2) & 0x3C) | ||
2003 | | ((src_block[2] >> 6) & 0x03)); | ||
2004 | dst_block[3] = (src_block[2] & 0x3F); | ||
2005 | dst[dst_offset++] = portable_filename_chars[dst_block[0]]; | ||
2006 | dst[dst_offset++] = portable_filename_chars[dst_block[1]]; | ||
2007 | dst[dst_offset++] = portable_filename_chars[dst_block[2]]; | ||
2008 | dst[dst_offset++] = portable_filename_chars[dst_block[3]]; | ||
2009 | block_num++; | ||
2010 | } | ||
2011 | out: | ||
2012 | return; | ||
2013 | } | ||
2014 | |||
2015 | /** | ||
2016 | * ecryptfs_decode_from_filename | ||
2017 | * @dst: If NULL, this function only sets @dst_size and returns. If | ||
2018 | * non-NULL, this function decodes the encoded octets in @src | ||
2019 | * into the memory that @dst points to. | ||
2020 | * @dst_size: Set to the size of the decoded string. | ||
2021 | * @src: The encoded set of octets to decode. | ||
2022 | * @src_size: The size of the encoded set of octets to decode. | ||
2023 | */ | ||
2024 | static void | ||
2025 | ecryptfs_decode_from_filename(unsigned char *dst, size_t *dst_size, | ||
2026 | const unsigned char *src, size_t src_size) | ||
2027 | { | ||
2028 | u8 current_bit_offset = 0; | ||
2029 | size_t src_byte_offset = 0; | ||
2030 | size_t dst_byte_offset = 0; | ||
2031 | |||
2032 | if (dst == NULL) { | ||
2033 | /* Not exact; conservatively long. Every block of 4 | ||
2034 | * encoded characters decodes into a block of 3 | ||
2035 | * decoded characters. This segment of code provides | ||
2036 | * the caller with the maximum amount of allocated | ||
2037 | * space that @dst will need to point to in a | ||
2038 | * subsequent call. */ | ||
2039 | (*dst_size) = (((src_size + 1) * 3) / 4); | ||
2040 | goto out; | ||
2041 | } | ||
2042 | while (src_byte_offset < src_size) { | ||
2043 | unsigned char src_byte = | ||
2044 | filename_rev_map[(int)src[src_byte_offset]]; | ||
2045 | |||
2046 | switch (current_bit_offset) { | ||
2047 | case 0: | ||
2048 | dst[dst_byte_offset] = (src_byte << 2); | ||
2049 | current_bit_offset = 6; | ||
2050 | break; | ||
2051 | case 6: | ||
2052 | dst[dst_byte_offset++] |= (src_byte >> 4); | ||
2053 | dst[dst_byte_offset] = ((src_byte & 0xF) | ||
2054 | << 4); | ||
2055 | current_bit_offset = 4; | ||
2056 | break; | ||
2057 | case 4: | ||
2058 | dst[dst_byte_offset++] |= (src_byte >> 2); | ||
2059 | dst[dst_byte_offset] = (src_byte << 6); | ||
2060 | current_bit_offset = 2; | ||
2061 | break; | ||
2062 | case 2: | ||
2063 | dst[dst_byte_offset++] |= (src_byte); | ||
2064 | dst[dst_byte_offset] = 0; | ||
2065 | current_bit_offset = 0; | ||
2066 | break; | ||
2067 | } | ||
2068 | src_byte_offset++; | ||
2069 | } | ||
2070 | (*dst_size) = dst_byte_offset; | ||
2071 | out: | ||
2072 | return; | ||
2073 | } | ||
2074 | |||
2075 | /** | ||
2076 | * ecryptfs_encrypt_and_encode_filename - converts a plaintext file name to cipher text | ||
2077 | * @crypt_stat: The crypt_stat struct associated with the file anem to encode | ||
2078 | * @name: The plaintext name | ||
2079 | * @length: The length of the plaintext | ||
2080 | * @encoded_name: The encypted name | ||
2081 | * | ||
2082 | * Encrypts and encodes a filename into something that constitutes a | ||
2083 | * valid filename for a filesystem, with printable characters. | ||
2084 | * | ||
2085 | * We assume that we have a properly initialized crypto context, | ||
2086 | * pointed to by crypt_stat->tfm. | ||
2087 | * | ||
2088 | * Returns zero on success; non-zero on otherwise | ||
2089 | */ | ||
2090 | int ecryptfs_encrypt_and_encode_filename( | ||
2091 | char **encoded_name, | ||
2092 | size_t *encoded_name_size, | ||
2093 | struct ecryptfs_crypt_stat *crypt_stat, | ||
2094 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, | ||
2095 | const char *name, size_t name_size) | ||
2096 | { | ||
2097 | size_t encoded_name_no_prefix_size; | ||
2098 | int rc = 0; | ||
2099 | |||
2100 | (*encoded_name) = NULL; | ||
2101 | (*encoded_name_size) = 0; | ||
2102 | if ((crypt_stat && (crypt_stat->flags & ECRYPTFS_ENCRYPT_FILENAMES)) | ||
2103 | || (mount_crypt_stat && (mount_crypt_stat->flags | ||
2104 | & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES))) { | ||
2105 | struct ecryptfs_filename *filename; | ||
2106 | |||
2107 | filename = kzalloc(sizeof(*filename), GFP_KERNEL); | ||
2108 | if (!filename) { | ||
2109 | printk(KERN_ERR "%s: Out of memory whilst attempting " | ||
2110 | "to kzalloc [%zd] bytes\n", __func__, | ||
2111 | sizeof(*filename)); | ||
2112 | rc = -ENOMEM; | ||
2113 | goto out; | ||
2114 | } | ||
2115 | filename->filename = (char *)name; | ||
2116 | filename->filename_size = name_size; | ||
2117 | rc = ecryptfs_encrypt_filename(filename, crypt_stat, | ||
2118 | mount_crypt_stat); | ||
2119 | if (rc) { | ||
2120 | printk(KERN_ERR "%s: Error attempting to encrypt " | ||
2121 | "filename; rc = [%d]\n", __func__, rc); | ||
2122 | kfree(filename); | ||
2123 | goto out; | ||
2124 | } | ||
2125 | ecryptfs_encode_for_filename( | ||
2126 | NULL, &encoded_name_no_prefix_size, | ||
2127 | filename->encrypted_filename, | ||
2128 | filename->encrypted_filename_size); | ||
2129 | if ((crypt_stat && (crypt_stat->flags | ||
2130 | & ECRYPTFS_ENCFN_USE_MOUNT_FNEK)) | ||
2131 | || (mount_crypt_stat | ||
2132 | && (mount_crypt_stat->flags | ||
2133 | & ECRYPTFS_GLOBAL_ENCFN_USE_MOUNT_FNEK))) | ||
2134 | (*encoded_name_size) = | ||
2135 | (ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE | ||
2136 | + encoded_name_no_prefix_size); | ||
2137 | else | ||
2138 | (*encoded_name_size) = | ||
2139 | (ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX_SIZE | ||
2140 | + encoded_name_no_prefix_size); | ||
2141 | (*encoded_name) = kmalloc((*encoded_name_size) + 1, GFP_KERNEL); | ||
2142 | if (!(*encoded_name)) { | ||
2143 | printk(KERN_ERR "%s: Out of memory whilst attempting " | ||
2144 | "to kzalloc [%zd] bytes\n", __func__, | ||
2145 | (*encoded_name_size)); | ||
2146 | rc = -ENOMEM; | ||
2147 | kfree(filename->encrypted_filename); | ||
2148 | kfree(filename); | ||
2149 | goto out; | ||
2150 | } | ||
2151 | if ((crypt_stat && (crypt_stat->flags | ||
2152 | & ECRYPTFS_ENCFN_USE_MOUNT_FNEK)) | ||
2153 | || (mount_crypt_stat | ||
2154 | && (mount_crypt_stat->flags | ||
2155 | & ECRYPTFS_GLOBAL_ENCFN_USE_MOUNT_FNEK))) { | ||
2156 | memcpy((*encoded_name), | ||
2157 | ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX, | ||
2158 | ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE); | ||
2159 | ecryptfs_encode_for_filename( | ||
2160 | ((*encoded_name) | ||
2161 | + ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE), | ||
2162 | &encoded_name_no_prefix_size, | ||
2163 | filename->encrypted_filename, | ||
2164 | filename->encrypted_filename_size); | ||
2165 | (*encoded_name_size) = | ||
2166 | (ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE | ||
2167 | + encoded_name_no_prefix_size); | ||
2168 | (*encoded_name)[(*encoded_name_size)] = '\0'; | ||
2169 | (*encoded_name_size)++; | ||
2170 | } else { | ||
2171 | rc = -ENOTSUPP; | ||
2172 | } | ||
2173 | if (rc) { | ||
2174 | printk(KERN_ERR "%s: Error attempting to encode " | ||
2175 | "encrypted filename; rc = [%d]\n", __func__, | ||
2176 | rc); | ||
2177 | kfree((*encoded_name)); | ||
2178 | (*encoded_name) = NULL; | ||
2179 | (*encoded_name_size) = 0; | ||
2180 | } | ||
2181 | kfree(filename->encrypted_filename); | ||
2182 | kfree(filename); | ||
2183 | } else { | ||
2184 | rc = ecryptfs_copy_filename(encoded_name, | ||
2185 | encoded_name_size, | ||
2186 | name, name_size); | ||
2187 | } | ||
2188 | out: | ||
2189 | return rc; | ||
2190 | } | ||
2191 | |||
2192 | /** | ||
2193 | * ecryptfs_decode_and_decrypt_filename - converts the encoded cipher text name to decoded plaintext | ||
2194 | * @plaintext_name: The plaintext name | ||
2195 | * @plaintext_name_size: The plaintext name size | ||
2196 | * @ecryptfs_dir_dentry: eCryptfs directory dentry | ||
2197 | * @name: The filename in cipher text | ||
2198 | * @name_size: The cipher text name size | ||
2199 | * | ||
2200 | * Decrypts and decodes the filename. | ||
2201 | * | ||
2202 | * Returns zero on error; non-zero otherwise | ||
2203 | */ | ||
2204 | int ecryptfs_decode_and_decrypt_filename(char **plaintext_name, | ||
2205 | size_t *plaintext_name_size, | ||
2206 | struct dentry *ecryptfs_dir_dentry, | ||
2207 | const char *name, size_t name_size) | ||
2208 | { | ||
2209 | char *decoded_name; | ||
2210 | size_t decoded_name_size; | ||
2211 | size_t packet_size; | ||
2212 | int rc = 0; | ||
2213 | |||
2214 | if ((name_size > ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE) | ||
2215 | && (strncmp(name, ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX, | ||
2216 | ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE) == 0)) { | ||
2217 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = | ||
2218 | &ecryptfs_superblock_to_private( | ||
2219 | ecryptfs_dir_dentry->d_sb)->mount_crypt_stat; | ||
2220 | const char *orig_name = name; | ||
2221 | size_t orig_name_size = name_size; | ||
2222 | |||
2223 | name += ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE; | ||
2224 | name_size -= ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE; | ||
2225 | ecryptfs_decode_from_filename(NULL, &decoded_name_size, | ||
2226 | name, name_size); | ||
2227 | decoded_name = kmalloc(decoded_name_size, GFP_KERNEL); | ||
2228 | if (!decoded_name) { | ||
2229 | printk(KERN_ERR "%s: Out of memory whilst attempting " | ||
2230 | "to kmalloc [%zd] bytes\n", __func__, | ||
2231 | decoded_name_size); | ||
2232 | rc = -ENOMEM; | ||
2233 | goto out; | ||
2234 | } | ||
2235 | ecryptfs_decode_from_filename(decoded_name, &decoded_name_size, | ||
2236 | name, name_size); | ||
2237 | rc = ecryptfs_parse_tag_70_packet(plaintext_name, | ||
2238 | plaintext_name_size, | ||
2239 | &packet_size, | ||
2240 | mount_crypt_stat, | ||
2241 | decoded_name, | ||
2242 | decoded_name_size); | ||
2243 | if (rc) { | ||
2244 | printk(KERN_INFO "%s: Could not parse tag 70 packet " | ||
2245 | "from filename; copying through filename " | ||
2246 | "as-is\n", __func__); | ||
2247 | rc = ecryptfs_copy_filename(plaintext_name, | ||
2248 | plaintext_name_size, | ||
2249 | orig_name, orig_name_size); | ||
2250 | goto out_free; | ||
2251 | } | ||
2252 | } else { | ||
2253 | rc = ecryptfs_copy_filename(plaintext_name, | ||
2254 | plaintext_name_size, | ||
2255 | name, name_size); | ||
2256 | goto out; | ||
2257 | } | ||
2258 | out_free: | ||
2259 | kfree(decoded_name); | ||
2260 | out: | ||
2261 | return rc; | ||
2262 | } | ||
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index a75026d35d16..c11fc95714ab 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h | |||
@@ -51,12 +51,16 @@ | |||
51 | #define ECRYPTFS_VERSIONING_XATTR 0x00000010 | 51 | #define ECRYPTFS_VERSIONING_XATTR 0x00000010 |
52 | #define ECRYPTFS_VERSIONING_MULTKEY 0x00000020 | 52 | #define ECRYPTFS_VERSIONING_MULTKEY 0x00000020 |
53 | #define ECRYPTFS_VERSIONING_DEVMISC 0x00000040 | 53 | #define ECRYPTFS_VERSIONING_DEVMISC 0x00000040 |
54 | #define ECRYPTFS_VERSIONING_HMAC 0x00000080 | ||
55 | #define ECRYPTFS_VERSIONING_FILENAME_ENCRYPTION 0x00000100 | ||
56 | #define ECRYPTFS_VERSIONING_GCM 0x00000200 | ||
54 | #define ECRYPTFS_VERSIONING_MASK (ECRYPTFS_VERSIONING_PASSPHRASE \ | 57 | #define ECRYPTFS_VERSIONING_MASK (ECRYPTFS_VERSIONING_PASSPHRASE \ |
55 | | ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH \ | 58 | | ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH \ |
56 | | ECRYPTFS_VERSIONING_PUBKEY \ | 59 | | ECRYPTFS_VERSIONING_PUBKEY \ |
57 | | ECRYPTFS_VERSIONING_XATTR \ | 60 | | ECRYPTFS_VERSIONING_XATTR \ |
58 | | ECRYPTFS_VERSIONING_MULTKEY \ | 61 | | ECRYPTFS_VERSIONING_MULTKEY \ |
59 | | ECRYPTFS_VERSIONING_DEVMISC) | 62 | | ECRYPTFS_VERSIONING_DEVMISC \ |
63 | | ECRYPTFS_VERSIONING_FILENAME_ENCRYPTION) | ||
60 | #define ECRYPTFS_MAX_PASSWORD_LENGTH 64 | 64 | #define ECRYPTFS_MAX_PASSWORD_LENGTH 64 |
61 | #define ECRYPTFS_MAX_PASSPHRASE_BYTES ECRYPTFS_MAX_PASSWORD_LENGTH | 65 | #define ECRYPTFS_MAX_PASSPHRASE_BYTES ECRYPTFS_MAX_PASSWORD_LENGTH |
62 | #define ECRYPTFS_SALT_SIZE 8 | 66 | #define ECRYPTFS_SALT_SIZE 8 |
@@ -199,6 +203,7 @@ ecryptfs_get_key_payload_data(struct key *key) | |||
199 | #define ECRYPTFS_DEFAULT_CIPHER "aes" | 203 | #define ECRYPTFS_DEFAULT_CIPHER "aes" |
200 | #define ECRYPTFS_DEFAULT_KEY_BYTES 16 | 204 | #define ECRYPTFS_DEFAULT_KEY_BYTES 16 |
201 | #define ECRYPTFS_DEFAULT_HASH "md5" | 205 | #define ECRYPTFS_DEFAULT_HASH "md5" |
206 | #define ECRYPTFS_TAG_70_DIGEST ECRYPTFS_DEFAULT_HASH | ||
202 | #define ECRYPTFS_TAG_1_PACKET_TYPE 0x01 | 207 | #define ECRYPTFS_TAG_1_PACKET_TYPE 0x01 |
203 | #define ECRYPTFS_TAG_3_PACKET_TYPE 0x8C | 208 | #define ECRYPTFS_TAG_3_PACKET_TYPE 0x8C |
204 | #define ECRYPTFS_TAG_11_PACKET_TYPE 0xED | 209 | #define ECRYPTFS_TAG_11_PACKET_TYPE 0xED |
@@ -206,30 +211,64 @@ ecryptfs_get_key_payload_data(struct key *key) | |||
206 | #define ECRYPTFS_TAG_65_PACKET_TYPE 0x41 | 211 | #define ECRYPTFS_TAG_65_PACKET_TYPE 0x41 |
207 | #define ECRYPTFS_TAG_66_PACKET_TYPE 0x42 | 212 | #define ECRYPTFS_TAG_66_PACKET_TYPE 0x42 |
208 | #define ECRYPTFS_TAG_67_PACKET_TYPE 0x43 | 213 | #define ECRYPTFS_TAG_67_PACKET_TYPE 0x43 |
214 | #define ECRYPTFS_TAG_70_PACKET_TYPE 0x46 /* FNEK-encrypted filename | ||
215 | * as dentry name */ | ||
216 | #define ECRYPTFS_TAG_71_PACKET_TYPE 0x47 /* FNEK-encrypted filename in | ||
217 | * metadata */ | ||
218 | #define ECRYPTFS_TAG_72_PACKET_TYPE 0x48 /* FEK-encrypted filename as | ||
219 | * dentry name */ | ||
220 | #define ECRYPTFS_TAG_73_PACKET_TYPE 0x49 /* FEK-encrypted filename as | ||
221 | * metadata */ | ||
222 | /* Constraint: ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES >= | ||
223 | * ECRYPTFS_MAX_IV_BYTES */ | ||
224 | #define ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES 16 | ||
225 | #define ECRYPTFS_NON_NULL 0x42 /* A reasonable substitute for NULL */ | ||
209 | #define MD5_DIGEST_SIZE 16 | 226 | #define MD5_DIGEST_SIZE 16 |
227 | #define ECRYPTFS_TAG_70_DIGEST_SIZE MD5_DIGEST_SIZE | ||
228 | #define ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX "ECRYPTFS_FEK_ENCRYPTED." | ||
229 | #define ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX_SIZE 23 | ||
230 | #define ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX "ECRYPTFS_FNEK_ENCRYPTED." | ||
231 | #define ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE 24 | ||
232 | #define ECRYPTFS_ENCRYPTED_DENTRY_NAME_LEN (18 + 1 + 4 + 1 + 32) | ||
210 | 233 | ||
211 | struct ecryptfs_key_sig { | 234 | struct ecryptfs_key_sig { |
212 | struct list_head crypt_stat_list; | 235 | struct list_head crypt_stat_list; |
213 | char keysig[ECRYPTFS_SIG_SIZE_HEX]; | 236 | char keysig[ECRYPTFS_SIG_SIZE_HEX]; |
214 | }; | 237 | }; |
215 | 238 | ||
239 | struct ecryptfs_filename { | ||
240 | struct list_head crypt_stat_list; | ||
241 | #define ECRYPTFS_FILENAME_CONTAINS_DECRYPTED 0x00000001 | ||
242 | u32 flags; | ||
243 | u32 seq_no; | ||
244 | char *filename; | ||
245 | char *encrypted_filename; | ||
246 | size_t filename_size; | ||
247 | size_t encrypted_filename_size; | ||
248 | char fnek_sig[ECRYPTFS_SIG_SIZE_HEX]; | ||
249 | char dentry_name[ECRYPTFS_ENCRYPTED_DENTRY_NAME_LEN + 1]; | ||
250 | }; | ||
251 | |||
216 | /** | 252 | /** |
217 | * This is the primary struct associated with each encrypted file. | 253 | * This is the primary struct associated with each encrypted file. |
218 | * | 254 | * |
219 | * TODO: cache align/pack? | 255 | * TODO: cache align/pack? |
220 | */ | 256 | */ |
221 | struct ecryptfs_crypt_stat { | 257 | struct ecryptfs_crypt_stat { |
222 | #define ECRYPTFS_STRUCT_INITIALIZED 0x00000001 | 258 | #define ECRYPTFS_STRUCT_INITIALIZED 0x00000001 |
223 | #define ECRYPTFS_POLICY_APPLIED 0x00000002 | 259 | #define ECRYPTFS_POLICY_APPLIED 0x00000002 |
224 | #define ECRYPTFS_NEW_FILE 0x00000004 | 260 | #define ECRYPTFS_NEW_FILE 0x00000004 |
225 | #define ECRYPTFS_ENCRYPTED 0x00000008 | 261 | #define ECRYPTFS_ENCRYPTED 0x00000008 |
226 | #define ECRYPTFS_SECURITY_WARNING 0x00000010 | 262 | #define ECRYPTFS_SECURITY_WARNING 0x00000010 |
227 | #define ECRYPTFS_ENABLE_HMAC 0x00000020 | 263 | #define ECRYPTFS_ENABLE_HMAC 0x00000020 |
228 | #define ECRYPTFS_ENCRYPT_IV_PAGES 0x00000040 | 264 | #define ECRYPTFS_ENCRYPT_IV_PAGES 0x00000040 |
229 | #define ECRYPTFS_KEY_VALID 0x00000080 | 265 | #define ECRYPTFS_KEY_VALID 0x00000080 |
230 | #define ECRYPTFS_METADATA_IN_XATTR 0x00000100 | 266 | #define ECRYPTFS_METADATA_IN_XATTR 0x00000100 |
231 | #define ECRYPTFS_VIEW_AS_ENCRYPTED 0x00000200 | 267 | #define ECRYPTFS_VIEW_AS_ENCRYPTED 0x00000200 |
232 | #define ECRYPTFS_KEY_SET 0x00000400 | 268 | #define ECRYPTFS_KEY_SET 0x00000400 |
269 | #define ECRYPTFS_ENCRYPT_FILENAMES 0x00000800 | ||
270 | #define ECRYPTFS_ENCFN_USE_MOUNT_FNEK 0x00001000 | ||
271 | #define ECRYPTFS_ENCFN_USE_FEK 0x00002000 | ||
233 | u32 flags; | 272 | u32 flags; |
234 | unsigned int file_version; | 273 | unsigned int file_version; |
235 | size_t iv_bytes; | 274 | size_t iv_bytes; |
@@ -332,13 +371,20 @@ struct ecryptfs_mount_crypt_stat { | |||
332 | #define ECRYPTFS_XATTR_METADATA_ENABLED 0x00000002 | 371 | #define ECRYPTFS_XATTR_METADATA_ENABLED 0x00000002 |
333 | #define ECRYPTFS_ENCRYPTED_VIEW_ENABLED 0x00000004 | 372 | #define ECRYPTFS_ENCRYPTED_VIEW_ENABLED 0x00000004 |
334 | #define ECRYPTFS_MOUNT_CRYPT_STAT_INITIALIZED 0x00000008 | 373 | #define ECRYPTFS_MOUNT_CRYPT_STAT_INITIALIZED 0x00000008 |
374 | #define ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES 0x00000010 | ||
375 | #define ECRYPTFS_GLOBAL_ENCFN_USE_MOUNT_FNEK 0x00000020 | ||
376 | #define ECRYPTFS_GLOBAL_ENCFN_USE_FEK 0x00000040 | ||
335 | u32 flags; | 377 | u32 flags; |
336 | struct list_head global_auth_tok_list; | 378 | struct list_head global_auth_tok_list; |
337 | struct mutex global_auth_tok_list_mutex; | 379 | struct mutex global_auth_tok_list_mutex; |
338 | size_t num_global_auth_toks; | 380 | size_t num_global_auth_toks; |
339 | size_t global_default_cipher_key_size; | 381 | size_t global_default_cipher_key_size; |
382 | size_t global_default_fn_cipher_key_bytes; | ||
340 | unsigned char global_default_cipher_name[ECRYPTFS_MAX_CIPHER_NAME_SIZE | 383 | unsigned char global_default_cipher_name[ECRYPTFS_MAX_CIPHER_NAME_SIZE |
341 | + 1]; | 384 | + 1]; |
385 | unsigned char global_default_fn_cipher_name[ | ||
386 | ECRYPTFS_MAX_CIPHER_NAME_SIZE + 1]; | ||
387 | char global_default_fnek_sig[ECRYPTFS_SIG_SIZE_HEX + 1]; | ||
342 | }; | 388 | }; |
343 | 389 | ||
344 | /* superblock private data. */ | 390 | /* superblock private data. */ |
@@ -571,13 +617,22 @@ struct ecryptfs_open_req { | |||
571 | int ecryptfs_interpose(struct dentry *hidden_dentry, | 617 | int ecryptfs_interpose(struct dentry *hidden_dentry, |
572 | struct dentry *this_dentry, struct super_block *sb, | 618 | struct dentry *this_dentry, struct super_block *sb, |
573 | u32 flags); | 619 | u32 flags); |
620 | int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry, | ||
621 | struct dentry *lower_dentry, | ||
622 | struct ecryptfs_crypt_stat *crypt_stat, | ||
623 | struct inode *ecryptfs_dir_inode, | ||
624 | struct nameidata *ecryptfs_nd); | ||
625 | int ecryptfs_decode_and_decrypt_filename(char **decrypted_name, | ||
626 | size_t *decrypted_name_size, | ||
627 | struct dentry *ecryptfs_dentry, | ||
628 | const char *name, size_t name_size); | ||
574 | int ecryptfs_fill_zeros(struct file *file, loff_t new_length); | 629 | int ecryptfs_fill_zeros(struct file *file, loff_t new_length); |
575 | int ecryptfs_decode_filename(struct ecryptfs_crypt_stat *crypt_stat, | 630 | int ecryptfs_encrypt_and_encode_filename( |
576 | const char *name, int length, | 631 | char **encoded_name, |
577 | char **decrypted_name); | 632 | size_t *encoded_name_size, |
578 | int ecryptfs_encode_filename(struct ecryptfs_crypt_stat *crypt_stat, | 633 | struct ecryptfs_crypt_stat *crypt_stat, |
579 | const char *name, int length, | 634 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, |
580 | char **encoded_name); | 635 | const char *name, size_t name_size); |
581 | struct dentry *ecryptfs_lower_dentry(struct dentry *this_dentry); | 636 | struct dentry *ecryptfs_lower_dentry(struct dentry *this_dentry); |
582 | void ecryptfs_dump_hex(char *data, int bytes); | 637 | void ecryptfs_dump_hex(char *data, int bytes); |
583 | int virt_to_scatterlist(const void *addr, int size, struct scatterlist *sg, | 638 | int virt_to_scatterlist(const void *addr, int size, struct scatterlist *sg, |
@@ -599,7 +654,7 @@ int ecryptfs_read_and_validate_header_region(char *data, | |||
599 | struct inode *ecryptfs_inode); | 654 | struct inode *ecryptfs_inode); |
600 | int ecryptfs_read_and_validate_xattr_region(char *page_virt, | 655 | int ecryptfs_read_and_validate_xattr_region(char *page_virt, |
601 | struct dentry *ecryptfs_dentry); | 656 | struct dentry *ecryptfs_dentry); |
602 | u8 ecryptfs_code_for_cipher_string(struct ecryptfs_crypt_stat *crypt_stat); | 657 | u8 ecryptfs_code_for_cipher_string(char *cipher_name, size_t key_bytes); |
603 | int ecryptfs_cipher_code_to_string(char *str, u8 cipher_code); | 658 | int ecryptfs_cipher_code_to_string(char *str, u8 cipher_code); |
604 | void ecryptfs_set_default_sizes(struct ecryptfs_crypt_stat *crypt_stat); | 659 | void ecryptfs_set_default_sizes(struct ecryptfs_crypt_stat *crypt_stat); |
605 | int ecryptfs_generate_key_packet_set(char *dest_base, | 660 | int ecryptfs_generate_key_packet_set(char *dest_base, |
@@ -694,5 +749,17 @@ int ecryptfs_privileged_open(struct file **lower_file, | |||
694 | struct vfsmount *lower_mnt, | 749 | struct vfsmount *lower_mnt, |
695 | const struct cred *cred); | 750 | const struct cred *cred); |
696 | int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry); | 751 | int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry); |
752 | int | ||
753 | ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes, | ||
754 | size_t *packet_size, | ||
755 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, | ||
756 | char *filename, size_t filename_size); | ||
757 | int | ||
758 | ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size, | ||
759 | size_t *packet_size, | ||
760 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, | ||
761 | char *data, size_t max_packet_size); | ||
762 | int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat, | ||
763 | loff_t offset); | ||
697 | 764 | ||
698 | #endif /* #ifndef ECRYPTFS_KERNEL_H */ | 765 | #endif /* #ifndef ECRYPTFS_KERNEL_H */ |
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index eb3dc4c7ac06..9e944057001b 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
@@ -77,27 +77,27 @@ struct ecryptfs_getdents_callback { | |||
77 | 77 | ||
78 | /* Inspired by generic filldir in fs/readdir.c */ | 78 | /* Inspired by generic filldir in fs/readdir.c */ |
79 | static int | 79 | static int |
80 | ecryptfs_filldir(void *dirent, const char *name, int namelen, loff_t offset, | 80 | ecryptfs_filldir(void *dirent, const char *lower_name, int lower_namelen, |
81 | u64 ino, unsigned int d_type) | 81 | loff_t offset, u64 ino, unsigned int d_type) |
82 | { | 82 | { |
83 | struct ecryptfs_crypt_stat *crypt_stat; | ||
84 | struct ecryptfs_getdents_callback *buf = | 83 | struct ecryptfs_getdents_callback *buf = |
85 | (struct ecryptfs_getdents_callback *)dirent; | 84 | (struct ecryptfs_getdents_callback *)dirent; |
85 | size_t name_size; | ||
86 | char *name; | ||
86 | int rc; | 87 | int rc; |
87 | int decoded_length; | ||
88 | char *decoded_name; | ||
89 | 88 | ||
90 | crypt_stat = ecryptfs_dentry_to_private(buf->dentry)->crypt_stat; | ||
91 | buf->filldir_called++; | 89 | buf->filldir_called++; |
92 | decoded_length = ecryptfs_decode_filename(crypt_stat, name, namelen, | 90 | rc = ecryptfs_decode_and_decrypt_filename(&name, &name_size, |
93 | &decoded_name); | 91 | buf->dentry, lower_name, |
94 | if (decoded_length < 0) { | 92 | lower_namelen); |
95 | rc = decoded_length; | 93 | if (rc) { |
94 | printk(KERN_ERR "%s: Error attempting to decode and decrypt " | ||
95 | "filename [%s]; rc = [%d]\n", __func__, lower_name, | ||
96 | rc); | ||
96 | goto out; | 97 | goto out; |
97 | } | 98 | } |
98 | rc = buf->filldir(buf->dirent, decoded_name, decoded_length, offset, | 99 | rc = buf->filldir(buf->dirent, name, name_size, offset, ino, d_type); |
99 | ino, d_type); | 100 | kfree(name); |
100 | kfree(decoded_name); | ||
101 | if (rc >= 0) | 101 | if (rc >= 0) |
102 | buf->entries_written++; | 102 | buf->entries_written++; |
103 | out: | 103 | out: |
@@ -106,8 +106,8 @@ out: | |||
106 | 106 | ||
107 | /** | 107 | /** |
108 | * ecryptfs_readdir | 108 | * ecryptfs_readdir |
109 | * @file: The ecryptfs file struct | 109 | * @file: The eCryptfs directory file |
110 | * @dirent: Directory entry | 110 | * @dirent: Directory entry handle |
111 | * @filldir: The filldir callback function | 111 | * @filldir: The filldir callback function |
112 | */ | 112 | */ |
113 | static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir) | 113 | static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir) |
@@ -275,18 +275,9 @@ static int ecryptfs_release(struct inode *inode, struct file *file) | |||
275 | static int | 275 | static int |
276 | ecryptfs_fsync(struct file *file, struct dentry *dentry, int datasync) | 276 | ecryptfs_fsync(struct file *file, struct dentry *dentry, int datasync) |
277 | { | 277 | { |
278 | struct file *lower_file = ecryptfs_file_to_lower(file); | 278 | return vfs_fsync(ecryptfs_file_to_lower(file), |
279 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); | 279 | ecryptfs_dentry_to_lower(dentry), |
280 | struct inode *lower_inode = lower_dentry->d_inode; | 280 | datasync); |
281 | int rc = -EINVAL; | ||
282 | |||
283 | if (lower_inode->i_fop->fsync) { | ||
284 | mutex_lock(&lower_inode->i_mutex); | ||
285 | rc = lower_inode->i_fop->fsync(lower_file, lower_dentry, | ||
286 | datasync); | ||
287 | mutex_unlock(&lower_inode->i_mutex); | ||
288 | } | ||
289 | return rc; | ||
290 | } | 281 | } |
291 | 282 | ||
292 | static int ecryptfs_fasync(int fd, struct file *file, int flag) | 283 | static int ecryptfs_fasync(int fd, struct file *file, int flag) |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 89209f00f9c7..5697899a168d 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
@@ -52,8 +52,7 @@ static void unlock_dir(struct dentry *dir) | |||
52 | /** | 52 | /** |
53 | * ecryptfs_create_underlying_file | 53 | * ecryptfs_create_underlying_file |
54 | * @lower_dir_inode: inode of the parent in the lower fs of the new file | 54 | * @lower_dir_inode: inode of the parent in the lower fs of the new file |
55 | * @lower_dentry: New file's dentry in the lower fs | 55 | * @dentry: New file's dentry |
56 | * @ecryptfs_dentry: New file's dentry in ecryptfs | ||
57 | * @mode: The mode of the new file | 56 | * @mode: The mode of the new file |
58 | * @nd: nameidata of ecryptfs' parent's dentry & vfsmount | 57 | * @nd: nameidata of ecryptfs' parent's dentry & vfsmount |
59 | * | 58 | * |
@@ -228,8 +227,7 @@ ecryptfs_create(struct inode *directory_inode, struct dentry *ecryptfs_dentry, | |||
228 | { | 227 | { |
229 | int rc; | 228 | int rc; |
230 | 229 | ||
231 | /* ecryptfs_do_create() calls ecryptfs_interpose(), which opens | 230 | /* ecryptfs_do_create() calls ecryptfs_interpose() */ |
232 | * the crypt_stat->lower_file (persistent file) */ | ||
233 | rc = ecryptfs_do_create(directory_inode, ecryptfs_dentry, mode, nd); | 231 | rc = ecryptfs_do_create(directory_inode, ecryptfs_dentry, mode, nd); |
234 | if (unlikely(rc)) { | 232 | if (unlikely(rc)) { |
235 | ecryptfs_printk(KERN_WARNING, "Failed to create file in" | 233 | ecryptfs_printk(KERN_WARNING, "Failed to create file in" |
@@ -244,141 +242,91 @@ out: | |||
244 | } | 242 | } |
245 | 243 | ||
246 | /** | 244 | /** |
247 | * ecryptfs_lookup | 245 | * ecryptfs_lookup_and_interpose_lower - Perform a lookup |
248 | * @dir: inode | ||
249 | * @dentry: The dentry | ||
250 | * @nd: nameidata, may be NULL | ||
251 | * | ||
252 | * Find a file on disk. If the file does not exist, then we'll add it to the | ||
253 | * dentry cache and continue on to read it from the disk. | ||
254 | */ | 246 | */ |
255 | static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry, | 247 | int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry, |
256 | struct nameidata *nd) | 248 | struct dentry *lower_dentry, |
249 | struct ecryptfs_crypt_stat *crypt_stat, | ||
250 | struct inode *ecryptfs_dir_inode, | ||
251 | struct nameidata *ecryptfs_nd) | ||
257 | { | 252 | { |
258 | int rc = 0; | ||
259 | struct dentry *lower_dir_dentry; | 253 | struct dentry *lower_dir_dentry; |
260 | struct dentry *lower_dentry; | ||
261 | struct vfsmount *lower_mnt; | 254 | struct vfsmount *lower_mnt; |
262 | char *encoded_name; | 255 | struct inode *lower_inode; |
263 | int encoded_namelen; | ||
264 | struct ecryptfs_crypt_stat *crypt_stat = NULL; | ||
265 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat; | 256 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat; |
266 | char *page_virt = NULL; | 257 | char *page_virt = NULL; |
267 | struct inode *lower_inode; | ||
268 | u64 file_size; | 258 | u64 file_size; |
259 | int rc = 0; | ||
269 | 260 | ||
270 | lower_dir_dentry = ecryptfs_dentry_to_lower(dentry->d_parent); | 261 | lower_dir_dentry = lower_dentry->d_parent; |
271 | dentry->d_op = &ecryptfs_dops; | 262 | lower_mnt = mntget(ecryptfs_dentry_to_lower_mnt( |
272 | if ((dentry->d_name.len == 1 && !strcmp(dentry->d_name.name, ".")) | 263 | ecryptfs_dentry->d_parent)); |
273 | || (dentry->d_name.len == 2 | ||
274 | && !strcmp(dentry->d_name.name, ".."))) { | ||
275 | d_drop(dentry); | ||
276 | goto out; | ||
277 | } | ||
278 | encoded_namelen = ecryptfs_encode_filename(crypt_stat, | ||
279 | dentry->d_name.name, | ||
280 | dentry->d_name.len, | ||
281 | &encoded_name); | ||
282 | if (encoded_namelen < 0) { | ||
283 | rc = encoded_namelen; | ||
284 | d_drop(dentry); | ||
285 | goto out; | ||
286 | } | ||
287 | ecryptfs_printk(KERN_DEBUG, "encoded_name = [%s]; encoded_namelen " | ||
288 | "= [%d]\n", encoded_name, encoded_namelen); | ||
289 | lower_dentry = lookup_one_len(encoded_name, lower_dir_dentry, | ||
290 | encoded_namelen - 1); | ||
291 | kfree(encoded_name); | ||
292 | if (IS_ERR(lower_dentry)) { | ||
293 | ecryptfs_printk(KERN_ERR, "ERR from lower_dentry\n"); | ||
294 | rc = PTR_ERR(lower_dentry); | ||
295 | d_drop(dentry); | ||
296 | goto out; | ||
297 | } | ||
298 | lower_mnt = mntget(ecryptfs_dentry_to_lower_mnt(dentry->d_parent)); | ||
299 | ecryptfs_printk(KERN_DEBUG, "lower_dentry = [%p]; lower_dentry->" | ||
300 | "d_name.name = [%s]\n", lower_dentry, | ||
301 | lower_dentry->d_name.name); | ||
302 | lower_inode = lower_dentry->d_inode; | 264 | lower_inode = lower_dentry->d_inode; |
303 | fsstack_copy_attr_atime(dir, lower_dir_dentry->d_inode); | 265 | fsstack_copy_attr_atime(ecryptfs_dir_inode, lower_dir_dentry->d_inode); |
304 | BUG_ON(!atomic_read(&lower_dentry->d_count)); | 266 | BUG_ON(!atomic_read(&lower_dentry->d_count)); |
305 | ecryptfs_set_dentry_private(dentry, | 267 | ecryptfs_set_dentry_private(ecryptfs_dentry, |
306 | kmem_cache_alloc(ecryptfs_dentry_info_cache, | 268 | kmem_cache_alloc(ecryptfs_dentry_info_cache, |
307 | GFP_KERNEL)); | 269 | GFP_KERNEL)); |
308 | if (!ecryptfs_dentry_to_private(dentry)) { | 270 | if (!ecryptfs_dentry_to_private(ecryptfs_dentry)) { |
309 | rc = -ENOMEM; | 271 | rc = -ENOMEM; |
310 | ecryptfs_printk(KERN_ERR, "Out of memory whilst attempting " | 272 | printk(KERN_ERR "%s: Out of memory whilst attempting " |
311 | "to allocate ecryptfs_dentry_info struct\n"); | 273 | "to allocate ecryptfs_dentry_info struct\n", |
274 | __func__); | ||
312 | goto out_dput; | 275 | goto out_dput; |
313 | } | 276 | } |
314 | ecryptfs_set_dentry_lower(dentry, lower_dentry); | 277 | ecryptfs_set_dentry_lower(ecryptfs_dentry, lower_dentry); |
315 | ecryptfs_set_dentry_lower_mnt(dentry, lower_mnt); | 278 | ecryptfs_set_dentry_lower_mnt(ecryptfs_dentry, lower_mnt); |
316 | if (!lower_dentry->d_inode) { | 279 | if (!lower_dentry->d_inode) { |
317 | /* We want to add because we couldn't find in lower */ | 280 | /* We want to add because we couldn't find in lower */ |
318 | d_add(dentry, NULL); | 281 | d_add(ecryptfs_dentry, NULL); |
319 | goto out; | 282 | goto out; |
320 | } | 283 | } |
321 | rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, | 284 | rc = ecryptfs_interpose(lower_dentry, ecryptfs_dentry, |
322 | ECRYPTFS_INTERPOSE_FLAG_D_ADD); | 285 | ecryptfs_dir_inode->i_sb, 1); |
323 | if (rc) { | 286 | if (rc) { |
324 | ecryptfs_printk(KERN_ERR, "Error interposing\n"); | 287 | printk(KERN_ERR "%s: Error interposing; rc = [%d]\n", |
288 | __func__, rc); | ||
325 | goto out; | 289 | goto out; |
326 | } | 290 | } |
327 | if (S_ISDIR(lower_inode->i_mode)) { | 291 | if (S_ISDIR(lower_inode->i_mode)) |
328 | ecryptfs_printk(KERN_DEBUG, "Is a directory; returning\n"); | ||
329 | goto out; | 292 | goto out; |
330 | } | 293 | if (S_ISLNK(lower_inode->i_mode)) |
331 | if (S_ISLNK(lower_inode->i_mode)) { | ||
332 | ecryptfs_printk(KERN_DEBUG, "Is a symlink; returning\n"); | ||
333 | goto out; | 294 | goto out; |
334 | } | 295 | if (special_file(lower_inode->i_mode)) |
335 | if (special_file(lower_inode->i_mode)) { | ||
336 | ecryptfs_printk(KERN_DEBUG, "Is a special file; returning\n"); | ||
337 | goto out; | 296 | goto out; |
338 | } | 297 | if (!ecryptfs_nd) |
339 | if (!nd) { | ||
340 | ecryptfs_printk(KERN_DEBUG, "We have a NULL nd, just leave" | ||
341 | "as we *think* we are about to unlink\n"); | ||
342 | goto out; | 298 | goto out; |
343 | } | ||
344 | /* Released in this function */ | 299 | /* Released in this function */ |
345 | page_virt = kmem_cache_zalloc(ecryptfs_header_cache_2, | 300 | page_virt = kmem_cache_zalloc(ecryptfs_header_cache_2, GFP_USER); |
346 | GFP_USER); | ||
347 | if (!page_virt) { | 301 | if (!page_virt) { |
302 | printk(KERN_ERR "%s: Cannot kmem_cache_zalloc() a page\n", | ||
303 | __func__); | ||
348 | rc = -ENOMEM; | 304 | rc = -ENOMEM; |
349 | ecryptfs_printk(KERN_ERR, | ||
350 | "Cannot ecryptfs_kmalloc a page\n"); | ||
351 | goto out; | 305 | goto out; |
352 | } | 306 | } |
353 | crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat; | 307 | if (!ecryptfs_inode_to_private(ecryptfs_dentry->d_inode)->lower_file) { |
354 | if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)) | 308 | rc = ecryptfs_init_persistent_file(ecryptfs_dentry); |
355 | ecryptfs_set_default_sizes(crypt_stat); | ||
356 | if (!ecryptfs_inode_to_private(dentry->d_inode)->lower_file) { | ||
357 | rc = ecryptfs_init_persistent_file(dentry); | ||
358 | if (rc) { | 309 | if (rc) { |
359 | printk(KERN_ERR "%s: Error attempting to initialize " | 310 | printk(KERN_ERR "%s: Error attempting to initialize " |
360 | "the persistent file for the dentry with name " | 311 | "the persistent file for the dentry with name " |
361 | "[%s]; rc = [%d]\n", __func__, | 312 | "[%s]; rc = [%d]\n", __func__, |
362 | dentry->d_name.name, rc); | 313 | ecryptfs_dentry->d_name.name, rc); |
363 | goto out; | 314 | goto out_free_kmem; |
364 | } | 315 | } |
365 | } | 316 | } |
366 | rc = ecryptfs_read_and_validate_header_region(page_virt, | 317 | rc = ecryptfs_read_and_validate_header_region(page_virt, |
367 | dentry->d_inode); | 318 | ecryptfs_dentry->d_inode); |
368 | if (rc) { | 319 | if (rc) { |
369 | rc = ecryptfs_read_and_validate_xattr_region(page_virt, dentry); | 320 | rc = ecryptfs_read_and_validate_xattr_region(page_virt, |
321 | ecryptfs_dentry); | ||
370 | if (rc) { | 322 | if (rc) { |
371 | printk(KERN_DEBUG "Valid metadata not found in header " | ||
372 | "region or xattr region; treating file as " | ||
373 | "unencrypted\n"); | ||
374 | rc = 0; | 323 | rc = 0; |
375 | kmem_cache_free(ecryptfs_header_cache_2, page_virt); | 324 | goto out_free_kmem; |
376 | goto out; | ||
377 | } | 325 | } |
378 | crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR; | 326 | crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR; |
379 | } | 327 | } |
380 | mount_crypt_stat = &ecryptfs_superblock_to_private( | 328 | mount_crypt_stat = &ecryptfs_superblock_to_private( |
381 | dentry->d_sb)->mount_crypt_stat; | 329 | ecryptfs_dentry->d_sb)->mount_crypt_stat; |
382 | if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) { | 330 | if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) { |
383 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) | 331 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) |
384 | file_size = (crypt_stat->num_header_bytes_at_front | 332 | file_size = (crypt_stat->num_header_bytes_at_front |
@@ -388,14 +336,103 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry, | |||
388 | } else { | 336 | } else { |
389 | file_size = get_unaligned_be64(page_virt); | 337 | file_size = get_unaligned_be64(page_virt); |
390 | } | 338 | } |
391 | i_size_write(dentry->d_inode, (loff_t)file_size); | 339 | i_size_write(ecryptfs_dentry->d_inode, (loff_t)file_size); |
340 | out_free_kmem: | ||
392 | kmem_cache_free(ecryptfs_header_cache_2, page_virt); | 341 | kmem_cache_free(ecryptfs_header_cache_2, page_virt); |
393 | goto out; | 342 | goto out; |
394 | |||
395 | out_dput: | 343 | out_dput: |
396 | dput(lower_dentry); | 344 | dput(lower_dentry); |
397 | d_drop(dentry); | 345 | d_drop(ecryptfs_dentry); |
398 | out: | 346 | out: |
347 | return rc; | ||
348 | } | ||
349 | |||
350 | /** | ||
351 | * ecryptfs_lookup | ||
352 | * @ecryptfs_dir_inode: The eCryptfs directory inode | ||
353 | * @ecryptfs_dentry: The eCryptfs dentry that we are looking up | ||
354 | * @ecryptfs_nd: nameidata; may be NULL | ||
355 | * | ||
356 | * Find a file on disk. If the file does not exist, then we'll add it to the | ||
357 | * dentry cache and continue on to read it from the disk. | ||
358 | */ | ||
359 | static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, | ||
360 | struct dentry *ecryptfs_dentry, | ||
361 | struct nameidata *ecryptfs_nd) | ||
362 | { | ||
363 | char *encrypted_and_encoded_name = NULL; | ||
364 | size_t encrypted_and_encoded_name_size; | ||
365 | struct ecryptfs_crypt_stat *crypt_stat = NULL; | ||
366 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = NULL; | ||
367 | struct ecryptfs_inode_info *inode_info; | ||
368 | struct dentry *lower_dir_dentry, *lower_dentry; | ||
369 | int rc = 0; | ||
370 | |||
371 | ecryptfs_dentry->d_op = &ecryptfs_dops; | ||
372 | if ((ecryptfs_dentry->d_name.len == 1 | ||
373 | && !strcmp(ecryptfs_dentry->d_name.name, ".")) | ||
374 | || (ecryptfs_dentry->d_name.len == 2 | ||
375 | && !strcmp(ecryptfs_dentry->d_name.name, ".."))) { | ||
376 | goto out_d_drop; | ||
377 | } | ||
378 | lower_dir_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry->d_parent); | ||
379 | lower_dentry = lookup_one_len(ecryptfs_dentry->d_name.name, | ||
380 | lower_dir_dentry, | ||
381 | ecryptfs_dentry->d_name.len); | ||
382 | if (IS_ERR(lower_dentry)) { | ||
383 | rc = PTR_ERR(lower_dentry); | ||
384 | printk(KERN_ERR "%s: lookup_one_len() returned [%d] on " | ||
385 | "lower_dentry = [%s]\n", __func__, rc, | ||
386 | ecryptfs_dentry->d_name.name); | ||
387 | goto out_d_drop; | ||
388 | } | ||
389 | if (lower_dentry->d_inode) | ||
390 | goto lookup_and_interpose; | ||
391 | inode_info = ecryptfs_inode_to_private(ecryptfs_dentry->d_inode); | ||
392 | if (inode_info) { | ||
393 | crypt_stat = &inode_info->crypt_stat; | ||
394 | /* TODO: lock for crypt_stat comparison */ | ||
395 | if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)) | ||
396 | ecryptfs_set_default_sizes(crypt_stat); | ||
397 | } | ||
398 | if (crypt_stat) | ||
399 | mount_crypt_stat = crypt_stat->mount_crypt_stat; | ||
400 | else | ||
401 | mount_crypt_stat = &ecryptfs_superblock_to_private( | ||
402 | ecryptfs_dentry->d_sb)->mount_crypt_stat; | ||
403 | if (!(crypt_stat && (crypt_stat->flags & ECRYPTFS_ENCRYPT_FILENAMES)) | ||
404 | && !(mount_crypt_stat && (mount_crypt_stat->flags | ||
405 | & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES))) | ||
406 | goto lookup_and_interpose; | ||
407 | dput(lower_dentry); | ||
408 | rc = ecryptfs_encrypt_and_encode_filename( | ||
409 | &encrypted_and_encoded_name, &encrypted_and_encoded_name_size, | ||
410 | crypt_stat, mount_crypt_stat, ecryptfs_dentry->d_name.name, | ||
411 | ecryptfs_dentry->d_name.len); | ||
412 | if (rc) { | ||
413 | printk(KERN_ERR "%s: Error attempting to encrypt and encode " | ||
414 | "filename; rc = [%d]\n", __func__, rc); | ||
415 | goto out_d_drop; | ||
416 | } | ||
417 | lower_dentry = lookup_one_len(encrypted_and_encoded_name, | ||
418 | lower_dir_dentry, | ||
419 | encrypted_and_encoded_name_size - 1); | ||
420 | if (IS_ERR(lower_dentry)) { | ||
421 | rc = PTR_ERR(lower_dentry); | ||
422 | printk(KERN_ERR "%s: lookup_one_len() returned [%d] on " | ||
423 | "lower_dentry = [%s]\n", __func__, rc, | ||
424 | encrypted_and_encoded_name); | ||
425 | goto out_d_drop; | ||
426 | } | ||
427 | lookup_and_interpose: | ||
428 | rc = ecryptfs_lookup_and_interpose_lower(ecryptfs_dentry, lower_dentry, | ||
429 | crypt_stat, ecryptfs_dir_inode, | ||
430 | ecryptfs_nd); | ||
431 | goto out; | ||
432 | out_d_drop: | ||
433 | d_drop(ecryptfs_dentry); | ||
434 | out: | ||
435 | kfree(encrypted_and_encoded_name); | ||
399 | return ERR_PTR(rc); | 436 | return ERR_PTR(rc); |
400 | } | 437 | } |
401 | 438 | ||
@@ -466,19 +503,21 @@ static int ecryptfs_symlink(struct inode *dir, struct dentry *dentry, | |||
466 | struct dentry *lower_dentry; | 503 | struct dentry *lower_dentry; |
467 | struct dentry *lower_dir_dentry; | 504 | struct dentry *lower_dir_dentry; |
468 | char *encoded_symname; | 505 | char *encoded_symname; |
469 | int encoded_symlen; | 506 | size_t encoded_symlen; |
470 | struct ecryptfs_crypt_stat *crypt_stat = NULL; | 507 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = NULL; |
471 | 508 | ||
472 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 509 | lower_dentry = ecryptfs_dentry_to_lower(dentry); |
473 | dget(lower_dentry); | 510 | dget(lower_dentry); |
474 | lower_dir_dentry = lock_parent(lower_dentry); | 511 | lower_dir_dentry = lock_parent(lower_dentry); |
475 | encoded_symlen = ecryptfs_encode_filename(crypt_stat, symname, | 512 | mount_crypt_stat = &ecryptfs_superblock_to_private( |
476 | strlen(symname), | 513 | dir->i_sb)->mount_crypt_stat; |
477 | &encoded_symname); | 514 | rc = ecryptfs_encrypt_and_encode_filename(&encoded_symname, |
478 | if (encoded_symlen < 0) { | 515 | &encoded_symlen, |
479 | rc = encoded_symlen; | 516 | NULL, |
517 | mount_crypt_stat, symname, | ||
518 | strlen(symname)); | ||
519 | if (rc) | ||
480 | goto out_lock; | 520 | goto out_lock; |
481 | } | ||
482 | rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry, | 521 | rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry, |
483 | encoded_symname); | 522 | encoded_symname); |
484 | kfree(encoded_symname); | 523 | kfree(encoded_symname); |
@@ -602,53 +641,54 @@ out_lock: | |||
602 | } | 641 | } |
603 | 642 | ||
604 | static int | 643 | static int |
605 | ecryptfs_readlink(struct dentry *dentry, char __user * buf, int bufsiz) | 644 | ecryptfs_readlink(struct dentry *dentry, char __user *buf, int bufsiz) |
606 | { | 645 | { |
607 | int rc; | ||
608 | struct dentry *lower_dentry; | ||
609 | char *decoded_name; | ||
610 | char *lower_buf; | 646 | char *lower_buf; |
611 | mm_segment_t old_fs; | 647 | struct dentry *lower_dentry; |
612 | struct ecryptfs_crypt_stat *crypt_stat; | 648 | struct ecryptfs_crypt_stat *crypt_stat; |
649 | char *plaintext_name; | ||
650 | size_t plaintext_name_size; | ||
651 | mm_segment_t old_fs; | ||
652 | int rc; | ||
613 | 653 | ||
614 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 654 | lower_dentry = ecryptfs_dentry_to_lower(dentry); |
615 | if (!lower_dentry->d_inode->i_op || | 655 | if (!lower_dentry->d_inode->i_op->readlink) { |
616 | !lower_dentry->d_inode->i_op->readlink) { | ||
617 | rc = -EINVAL; | 656 | rc = -EINVAL; |
618 | goto out; | 657 | goto out; |
619 | } | 658 | } |
659 | crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat; | ||
620 | /* Released in this function */ | 660 | /* Released in this function */ |
621 | lower_buf = kmalloc(bufsiz, GFP_KERNEL); | 661 | lower_buf = kmalloc(bufsiz, GFP_KERNEL); |
622 | if (lower_buf == NULL) { | 662 | if (lower_buf == NULL) { |
623 | ecryptfs_printk(KERN_ERR, "Out of memory\n"); | 663 | printk(KERN_ERR "%s: Out of memory whilst attempting to " |
664 | "kmalloc [%d] bytes\n", __func__, bufsiz); | ||
624 | rc = -ENOMEM; | 665 | rc = -ENOMEM; |
625 | goto out; | 666 | goto out; |
626 | } | 667 | } |
627 | old_fs = get_fs(); | 668 | old_fs = get_fs(); |
628 | set_fs(get_ds()); | 669 | set_fs(get_ds()); |
629 | ecryptfs_printk(KERN_DEBUG, "Calling readlink w/ " | ||
630 | "lower_dentry->d_name.name = [%s]\n", | ||
631 | lower_dentry->d_name.name); | ||
632 | rc = lower_dentry->d_inode->i_op->readlink(lower_dentry, | 670 | rc = lower_dentry->d_inode->i_op->readlink(lower_dentry, |
633 | (char __user *)lower_buf, | 671 | (char __user *)lower_buf, |
634 | bufsiz); | 672 | bufsiz); |
635 | set_fs(old_fs); | 673 | set_fs(old_fs); |
636 | if (rc >= 0) { | 674 | if (rc >= 0) { |
637 | crypt_stat = NULL; | 675 | rc = ecryptfs_decode_and_decrypt_filename(&plaintext_name, |
638 | rc = ecryptfs_decode_filename(crypt_stat, lower_buf, rc, | 676 | &plaintext_name_size, |
639 | &decoded_name); | 677 | dentry, lower_buf, |
640 | if (rc == -ENOMEM) | 678 | rc); |
679 | if (rc) { | ||
680 | printk(KERN_ERR "%s: Error attempting to decode and " | ||
681 | "decrypt filename; rc = [%d]\n", __func__, | ||
682 | rc); | ||
641 | goto out_free_lower_buf; | 683 | goto out_free_lower_buf; |
642 | if (rc > 0) { | ||
643 | ecryptfs_printk(KERN_DEBUG, "Copying [%d] bytes " | ||
644 | "to userspace: [%*s]\n", rc, | ||
645 | decoded_name); | ||
646 | if (copy_to_user(buf, decoded_name, rc)) | ||
647 | rc = -EFAULT; | ||
648 | } | 684 | } |
649 | kfree(decoded_name); | 685 | rc = copy_to_user(buf, plaintext_name, plaintext_name_size); |
650 | fsstack_copy_attr_atime(dentry->d_inode, | 686 | if (rc) |
651 | lower_dentry->d_inode); | 687 | rc = -EFAULT; |
688 | else | ||
689 | rc = plaintext_name_size; | ||
690 | kfree(plaintext_name); | ||
691 | fsstack_copy_attr_atime(dentry->d_inode, lower_dentry->d_inode); | ||
652 | } | 692 | } |
653 | out_free_lower_buf: | 693 | out_free_lower_buf: |
654 | kfree(lower_buf); | 694 | kfree(lower_buf); |
@@ -670,13 +710,12 @@ static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
670 | } | 710 | } |
671 | old_fs = get_fs(); | 711 | old_fs = get_fs(); |
672 | set_fs(get_ds()); | 712 | set_fs(get_ds()); |
673 | ecryptfs_printk(KERN_DEBUG, "Calling readlink w/ " | ||
674 | "dentry->d_name.name = [%s]\n", dentry->d_name.name); | ||
675 | rc = dentry->d_inode->i_op->readlink(dentry, (char __user *)buf, len); | 713 | rc = dentry->d_inode->i_op->readlink(dentry, (char __user *)buf, len); |
676 | buf[rc] = '\0'; | ||
677 | set_fs(old_fs); | 714 | set_fs(old_fs); |
678 | if (rc < 0) | 715 | if (rc < 0) |
679 | goto out_free; | 716 | goto out_free; |
717 | else | ||
718 | buf[rc] = '\0'; | ||
680 | rc = 0; | 719 | rc = 0; |
681 | nd_set_link(nd, buf); | 720 | nd_set_link(nd, buf); |
682 | goto out; | 721 | goto out; |
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 0d713b691941..ff539420cc6f 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c | |||
@@ -358,7 +358,7 @@ parse_tag_67_packet(struct ecryptfs_key_record *key_rec, | |||
358 | /* verify that everything through the encrypted FEK size is present */ | 358 | /* verify that everything through the encrypted FEK size is present */ |
359 | if (message_len < 4) { | 359 | if (message_len < 4) { |
360 | rc = -EIO; | 360 | rc = -EIO; |
361 | printk(KERN_ERR "%s: message_len is [%Zd]; minimum acceptable " | 361 | printk(KERN_ERR "%s: message_len is [%zd]; minimum acceptable " |
362 | "message length is [%d]\n", __func__, message_len, 4); | 362 | "message length is [%d]\n", __func__, message_len, 4); |
363 | goto out; | 363 | goto out; |
364 | } | 364 | } |
@@ -385,13 +385,13 @@ parse_tag_67_packet(struct ecryptfs_key_record *key_rec, | |||
385 | i += data_len; | 385 | i += data_len; |
386 | if (message_len < (i + key_rec->enc_key_size)) { | 386 | if (message_len < (i + key_rec->enc_key_size)) { |
387 | rc = -EIO; | 387 | rc = -EIO; |
388 | printk(KERN_ERR "%s: message_len [%Zd]; max len is [%Zd]\n", | 388 | printk(KERN_ERR "%s: message_len [%zd]; max len is [%zd]\n", |
389 | __func__, message_len, (i + key_rec->enc_key_size)); | 389 | __func__, message_len, (i + key_rec->enc_key_size)); |
390 | goto out; | 390 | goto out; |
391 | } | 391 | } |
392 | if (key_rec->enc_key_size > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) { | 392 | if (key_rec->enc_key_size > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) { |
393 | rc = -EIO; | 393 | rc = -EIO; |
394 | printk(KERN_ERR "%s: Encrypted key_size [%Zd] larger than " | 394 | printk(KERN_ERR "%s: Encrypted key_size [%zd] larger than " |
395 | "the maximum key size [%d]\n", __func__, | 395 | "the maximum key size [%d]\n", __func__, |
396 | key_rec->enc_key_size, | 396 | key_rec->enc_key_size, |
397 | ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES); | 397 | ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES); |
@@ -403,6 +403,580 @@ out: | |||
403 | } | 403 | } |
404 | 404 | ||
405 | static int | 405 | static int |
406 | ecryptfs_find_global_auth_tok_for_sig( | ||
407 | struct ecryptfs_global_auth_tok **global_auth_tok, | ||
408 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, char *sig) | ||
409 | { | ||
410 | struct ecryptfs_global_auth_tok *walker; | ||
411 | int rc = 0; | ||
412 | |||
413 | (*global_auth_tok) = NULL; | ||
414 | mutex_lock(&mount_crypt_stat->global_auth_tok_list_mutex); | ||
415 | list_for_each_entry(walker, | ||
416 | &mount_crypt_stat->global_auth_tok_list, | ||
417 | mount_crypt_stat_list) { | ||
418 | if (memcmp(walker->sig, sig, ECRYPTFS_SIG_SIZE_HEX) == 0) { | ||
419 | (*global_auth_tok) = walker; | ||
420 | goto out; | ||
421 | } | ||
422 | } | ||
423 | rc = -EINVAL; | ||
424 | out: | ||
425 | mutex_unlock(&mount_crypt_stat->global_auth_tok_list_mutex); | ||
426 | return rc; | ||
427 | } | ||
428 | |||
429 | /** | ||
430 | * ecryptfs_find_auth_tok_for_sig | ||
431 | * @auth_tok: Set to the matching auth_tok; NULL if not found | ||
432 | * @crypt_stat: inode crypt_stat crypto context | ||
433 | * @sig: Sig of auth_tok to find | ||
434 | * | ||
435 | * For now, this function simply looks at the registered auth_tok's | ||
436 | * linked off the mount_crypt_stat, so all the auth_toks that can be | ||
437 | * used must be registered at mount time. This function could | ||
438 | * potentially try a lot harder to find auth_tok's (e.g., by calling | ||
439 | * out to ecryptfsd to dynamically retrieve an auth_tok object) so | ||
440 | * that static registration of auth_tok's will no longer be necessary. | ||
441 | * | ||
442 | * Returns zero on no error; non-zero on error | ||
443 | */ | ||
444 | static int | ||
445 | ecryptfs_find_auth_tok_for_sig( | ||
446 | struct ecryptfs_auth_tok **auth_tok, | ||
447 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, | ||
448 | char *sig) | ||
449 | { | ||
450 | struct ecryptfs_global_auth_tok *global_auth_tok; | ||
451 | int rc = 0; | ||
452 | |||
453 | (*auth_tok) = NULL; | ||
454 | if (ecryptfs_find_global_auth_tok_for_sig(&global_auth_tok, | ||
455 | mount_crypt_stat, sig)) { | ||
456 | struct key *auth_tok_key; | ||
457 | |||
458 | rc = ecryptfs_keyring_auth_tok_for_sig(&auth_tok_key, auth_tok, | ||
459 | sig); | ||
460 | } else | ||
461 | (*auth_tok) = global_auth_tok->global_auth_tok; | ||
462 | return rc; | ||
463 | } | ||
464 | |||
465 | /** | ||
466 | * write_tag_70_packet can gobble a lot of stack space. We stuff most | ||
467 | * of the function's parameters in a kmalloc'd struct to help reduce | ||
468 | * eCryptfs' overall stack usage. | ||
469 | */ | ||
470 | struct ecryptfs_write_tag_70_packet_silly_stack { | ||
471 | u8 cipher_code; | ||
472 | size_t max_packet_size; | ||
473 | size_t packet_size_len; | ||
474 | size_t block_aligned_filename_size; | ||
475 | size_t block_size; | ||
476 | size_t i; | ||
477 | size_t j; | ||
478 | size_t num_rand_bytes; | ||
479 | struct mutex *tfm_mutex; | ||
480 | char *block_aligned_filename; | ||
481 | struct ecryptfs_auth_tok *auth_tok; | ||
482 | struct scatterlist src_sg; | ||
483 | struct scatterlist dst_sg; | ||
484 | struct blkcipher_desc desc; | ||
485 | char iv[ECRYPTFS_MAX_IV_BYTES]; | ||
486 | char hash[ECRYPTFS_TAG_70_DIGEST_SIZE]; | ||
487 | char tmp_hash[ECRYPTFS_TAG_70_DIGEST_SIZE]; | ||
488 | struct hash_desc hash_desc; | ||
489 | struct scatterlist hash_sg; | ||
490 | }; | ||
491 | |||
492 | /** | ||
493 | * write_tag_70_packet - Write encrypted filename (EFN) packet against FNEK | ||
494 | * @filename: NULL-terminated filename string | ||
495 | * | ||
496 | * This is the simplest mechanism for achieving filename encryption in | ||
497 | * eCryptfs. It encrypts the given filename with the mount-wide | ||
498 | * filename encryption key (FNEK) and stores it in a packet to @dest, | ||
499 | * which the callee will encode and write directly into the dentry | ||
500 | * name. | ||
501 | */ | ||
502 | int | ||
503 | ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes, | ||
504 | size_t *packet_size, | ||
505 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, | ||
506 | char *filename, size_t filename_size) | ||
507 | { | ||
508 | struct ecryptfs_write_tag_70_packet_silly_stack *s; | ||
509 | int rc = 0; | ||
510 | |||
511 | s = kmalloc(sizeof(*s), GFP_KERNEL); | ||
512 | if (!s) { | ||
513 | printk(KERN_ERR "%s: Out of memory whilst trying to kmalloc " | ||
514 | "[%zd] bytes of kernel memory\n", __func__, sizeof(*s)); | ||
515 | goto out; | ||
516 | } | ||
517 | s->desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP; | ||
518 | (*packet_size) = 0; | ||
519 | rc = ecryptfs_get_tfm_and_mutex_for_cipher_name( | ||
520 | &s->desc.tfm, | ||
521 | &s->tfm_mutex, mount_crypt_stat->global_default_fn_cipher_name); | ||
522 | if (unlikely(rc)) { | ||
523 | printk(KERN_ERR "Internal error whilst attempting to get " | ||
524 | "tfm and mutex for cipher name [%s]; rc = [%d]\n", | ||
525 | mount_crypt_stat->global_default_fn_cipher_name, rc); | ||
526 | goto out; | ||
527 | } | ||
528 | mutex_lock(s->tfm_mutex); | ||
529 | s->block_size = crypto_blkcipher_blocksize(s->desc.tfm); | ||
530 | /* Plus one for the \0 separator between the random prefix | ||
531 | * and the plaintext filename */ | ||
532 | s->num_rand_bytes = (ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES + 1); | ||
533 | s->block_aligned_filename_size = (s->num_rand_bytes + filename_size); | ||
534 | if ((s->block_aligned_filename_size % s->block_size) != 0) { | ||
535 | s->num_rand_bytes += (s->block_size | ||
536 | - (s->block_aligned_filename_size | ||
537 | % s->block_size)); | ||
538 | s->block_aligned_filename_size = (s->num_rand_bytes | ||
539 | + filename_size); | ||
540 | } | ||
541 | /* Octet 0: Tag 70 identifier | ||
542 | * Octets 1-N1: Tag 70 packet size (includes cipher identifier | ||
543 | * and block-aligned encrypted filename size) | ||
544 | * Octets N1-N2: FNEK sig (ECRYPTFS_SIG_SIZE) | ||
545 | * Octet N2-N3: Cipher identifier (1 octet) | ||
546 | * Octets N3-N4: Block-aligned encrypted filename | ||
547 | * - Consists of a minimum number of random characters, a \0 | ||
548 | * separator, and then the filename */ | ||
549 | s->max_packet_size = (1 /* Tag 70 identifier */ | ||
550 | + 3 /* Max Tag 70 packet size */ | ||
551 | + ECRYPTFS_SIG_SIZE /* FNEK sig */ | ||
552 | + 1 /* Cipher identifier */ | ||
553 | + s->block_aligned_filename_size); | ||
554 | if (dest == NULL) { | ||
555 | (*packet_size) = s->max_packet_size; | ||
556 | goto out_unlock; | ||
557 | } | ||
558 | if (s->max_packet_size > (*remaining_bytes)) { | ||
559 | printk(KERN_WARNING "%s: Require [%zd] bytes to write; only " | ||
560 | "[%zd] available\n", __func__, s->max_packet_size, | ||
561 | (*remaining_bytes)); | ||
562 | rc = -EINVAL; | ||
563 | goto out_unlock; | ||
564 | } | ||
565 | s->block_aligned_filename = kzalloc(s->block_aligned_filename_size, | ||
566 | GFP_KERNEL); | ||
567 | if (!s->block_aligned_filename) { | ||
568 | printk(KERN_ERR "%s: Out of kernel memory whilst attempting to " | ||
569 | "kzalloc [%zd] bytes\n", __func__, | ||
570 | s->block_aligned_filename_size); | ||
571 | rc = -ENOMEM; | ||
572 | goto out_unlock; | ||
573 | } | ||
574 | s->i = 0; | ||
575 | dest[s->i++] = ECRYPTFS_TAG_70_PACKET_TYPE; | ||
576 | rc = ecryptfs_write_packet_length(&dest[s->i], | ||
577 | (ECRYPTFS_SIG_SIZE | ||
578 | + 1 /* Cipher code */ | ||
579 | + s->block_aligned_filename_size), | ||
580 | &s->packet_size_len); | ||
581 | if (rc) { | ||
582 | printk(KERN_ERR "%s: Error generating tag 70 packet " | ||
583 | "header; cannot generate packet length; rc = [%d]\n", | ||
584 | __func__, rc); | ||
585 | goto out_free_unlock; | ||
586 | } | ||
587 | s->i += s->packet_size_len; | ||
588 | ecryptfs_from_hex(&dest[s->i], | ||
589 | mount_crypt_stat->global_default_fnek_sig, | ||
590 | ECRYPTFS_SIG_SIZE); | ||
591 | s->i += ECRYPTFS_SIG_SIZE; | ||
592 | s->cipher_code = ecryptfs_code_for_cipher_string( | ||
593 | mount_crypt_stat->global_default_fn_cipher_name, | ||
594 | mount_crypt_stat->global_default_fn_cipher_key_bytes); | ||
595 | if (s->cipher_code == 0) { | ||
596 | printk(KERN_WARNING "%s: Unable to generate code for " | ||
597 | "cipher [%s] with key bytes [%zd]\n", __func__, | ||
598 | mount_crypt_stat->global_default_fn_cipher_name, | ||
599 | mount_crypt_stat->global_default_fn_cipher_key_bytes); | ||
600 | rc = -EINVAL; | ||
601 | goto out_free_unlock; | ||
602 | } | ||
603 | dest[s->i++] = s->cipher_code; | ||
604 | rc = ecryptfs_find_auth_tok_for_sig( | ||
605 | &s->auth_tok, mount_crypt_stat, | ||
606 | mount_crypt_stat->global_default_fnek_sig); | ||
607 | if (rc) { | ||
608 | printk(KERN_ERR "%s: Error attempting to find auth tok for " | ||
609 | "fnek sig [%s]; rc = [%d]\n", __func__, | ||
610 | mount_crypt_stat->global_default_fnek_sig, rc); | ||
611 | goto out_free_unlock; | ||
612 | } | ||
613 | /* TODO: Support other key modules than passphrase for | ||
614 | * filename encryption */ | ||
615 | BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD); | ||
616 | sg_init_one( | ||
617 | &s->hash_sg, | ||
618 | (u8 *)s->auth_tok->token.password.session_key_encryption_key, | ||
619 | s->auth_tok->token.password.session_key_encryption_key_bytes); | ||
620 | s->hash_desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP; | ||
621 | s->hash_desc.tfm = crypto_alloc_hash(ECRYPTFS_TAG_70_DIGEST, 0, | ||
622 | CRYPTO_ALG_ASYNC); | ||
623 | if (IS_ERR(s->hash_desc.tfm)) { | ||
624 | rc = PTR_ERR(s->hash_desc.tfm); | ||
625 | printk(KERN_ERR "%s: Error attempting to " | ||
626 | "allocate hash crypto context; rc = [%d]\n", | ||
627 | __func__, rc); | ||
628 | goto out_free_unlock; | ||
629 | } | ||
630 | rc = crypto_hash_init(&s->hash_desc); | ||
631 | if (rc) { | ||
632 | printk(KERN_ERR | ||
633 | "%s: Error initializing crypto hash; rc = [%d]\n", | ||
634 | __func__, rc); | ||
635 | goto out_release_free_unlock; | ||
636 | } | ||
637 | rc = crypto_hash_update( | ||
638 | &s->hash_desc, &s->hash_sg, | ||
639 | s->auth_tok->token.password.session_key_encryption_key_bytes); | ||
640 | if (rc) { | ||
641 | printk(KERN_ERR | ||
642 | "%s: Error updating crypto hash; rc = [%d]\n", | ||
643 | __func__, rc); | ||
644 | goto out_release_free_unlock; | ||
645 | } | ||
646 | rc = crypto_hash_final(&s->hash_desc, s->hash); | ||
647 | if (rc) { | ||
648 | printk(KERN_ERR | ||
649 | "%s: Error finalizing crypto hash; rc = [%d]\n", | ||
650 | __func__, rc); | ||
651 | goto out_release_free_unlock; | ||
652 | } | ||
653 | for (s->j = 0; s->j < (s->num_rand_bytes - 1); s->j++) { | ||
654 | s->block_aligned_filename[s->j] = | ||
655 | s->hash[(s->j % ECRYPTFS_TAG_70_DIGEST_SIZE)]; | ||
656 | if ((s->j % ECRYPTFS_TAG_70_DIGEST_SIZE) | ||
657 | == (ECRYPTFS_TAG_70_DIGEST_SIZE - 1)) { | ||
658 | sg_init_one(&s->hash_sg, (u8 *)s->hash, | ||
659 | ECRYPTFS_TAG_70_DIGEST_SIZE); | ||
660 | rc = crypto_hash_init(&s->hash_desc); | ||
661 | if (rc) { | ||
662 | printk(KERN_ERR | ||
663 | "%s: Error initializing crypto hash; " | ||
664 | "rc = [%d]\n", __func__, rc); | ||
665 | goto out_release_free_unlock; | ||
666 | } | ||
667 | rc = crypto_hash_update(&s->hash_desc, &s->hash_sg, | ||
668 | ECRYPTFS_TAG_70_DIGEST_SIZE); | ||
669 | if (rc) { | ||
670 | printk(KERN_ERR | ||
671 | "%s: Error updating crypto hash; " | ||
672 | "rc = [%d]\n", __func__, rc); | ||
673 | goto out_release_free_unlock; | ||
674 | } | ||
675 | rc = crypto_hash_final(&s->hash_desc, s->tmp_hash); | ||
676 | if (rc) { | ||
677 | printk(KERN_ERR | ||
678 | "%s: Error finalizing crypto hash; " | ||
679 | "rc = [%d]\n", __func__, rc); | ||
680 | goto out_release_free_unlock; | ||
681 | } | ||
682 | memcpy(s->hash, s->tmp_hash, | ||
683 | ECRYPTFS_TAG_70_DIGEST_SIZE); | ||
684 | } | ||
685 | if (s->block_aligned_filename[s->j] == '\0') | ||
686 | s->block_aligned_filename[s->j] = ECRYPTFS_NON_NULL; | ||
687 | } | ||
688 | memcpy(&s->block_aligned_filename[s->num_rand_bytes], filename, | ||
689 | filename_size); | ||
690 | rc = virt_to_scatterlist(s->block_aligned_filename, | ||
691 | s->block_aligned_filename_size, &s->src_sg, 1); | ||
692 | if (rc != 1) { | ||
693 | printk(KERN_ERR "%s: Internal error whilst attempting to " | ||
694 | "convert filename memory to scatterlist; " | ||
695 | "expected rc = 1; got rc = [%d]. " | ||
696 | "block_aligned_filename_size = [%zd]\n", __func__, rc, | ||
697 | s->block_aligned_filename_size); | ||
698 | goto out_release_free_unlock; | ||
699 | } | ||
700 | rc = virt_to_scatterlist(&dest[s->i], s->block_aligned_filename_size, | ||
701 | &s->dst_sg, 1); | ||
702 | if (rc != 1) { | ||
703 | printk(KERN_ERR "%s: Internal error whilst attempting to " | ||
704 | "convert encrypted filename memory to scatterlist; " | ||
705 | "expected rc = 1; got rc = [%d]. " | ||
706 | "block_aligned_filename_size = [%zd]\n", __func__, rc, | ||
707 | s->block_aligned_filename_size); | ||
708 | goto out_release_free_unlock; | ||
709 | } | ||
710 | /* The characters in the first block effectively do the job | ||
711 | * of the IV here, so we just use 0's for the IV. Note the | ||
712 | * constraint that ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES | ||
713 | * >= ECRYPTFS_MAX_IV_BYTES. */ | ||
714 | memset(s->iv, 0, ECRYPTFS_MAX_IV_BYTES); | ||
715 | s->desc.info = s->iv; | ||
716 | rc = crypto_blkcipher_setkey( | ||
717 | s->desc.tfm, | ||
718 | s->auth_tok->token.password.session_key_encryption_key, | ||
719 | mount_crypt_stat->global_default_fn_cipher_key_bytes); | ||
720 | if (rc < 0) { | ||
721 | printk(KERN_ERR "%s: Error setting key for crypto context; " | ||
722 | "rc = [%d]. s->auth_tok->token.password.session_key_" | ||
723 | "encryption_key = [0x%p]; mount_crypt_stat->" | ||
724 | "global_default_fn_cipher_key_bytes = [%zd]\n", __func__, | ||
725 | rc, | ||
726 | s->auth_tok->token.password.session_key_encryption_key, | ||
727 | mount_crypt_stat->global_default_fn_cipher_key_bytes); | ||
728 | goto out_release_free_unlock; | ||
729 | } | ||
730 | rc = crypto_blkcipher_encrypt_iv(&s->desc, &s->dst_sg, &s->src_sg, | ||
731 | s->block_aligned_filename_size); | ||
732 | if (rc) { | ||
733 | printk(KERN_ERR "%s: Error attempting to encrypt filename; " | ||
734 | "rc = [%d]\n", __func__, rc); | ||
735 | goto out_release_free_unlock; | ||
736 | } | ||
737 | s->i += s->block_aligned_filename_size; | ||
738 | (*packet_size) = s->i; | ||
739 | (*remaining_bytes) -= (*packet_size); | ||
740 | out_release_free_unlock: | ||
741 | crypto_free_hash(s->hash_desc.tfm); | ||
742 | out_free_unlock: | ||
743 | memset(s->block_aligned_filename, 0, s->block_aligned_filename_size); | ||
744 | kfree(s->block_aligned_filename); | ||
745 | out_unlock: | ||
746 | mutex_unlock(s->tfm_mutex); | ||
747 | out: | ||
748 | kfree(s); | ||
749 | return rc; | ||
750 | } | ||
751 | |||
752 | struct ecryptfs_parse_tag_70_packet_silly_stack { | ||
753 | u8 cipher_code; | ||
754 | size_t max_packet_size; | ||
755 | size_t packet_size_len; | ||
756 | size_t parsed_tag_70_packet_size; | ||
757 | size_t block_aligned_filename_size; | ||
758 | size_t block_size; | ||
759 | size_t i; | ||
760 | struct mutex *tfm_mutex; | ||
761 | char *decrypted_filename; | ||
762 | struct ecryptfs_auth_tok *auth_tok; | ||
763 | struct scatterlist src_sg; | ||
764 | struct scatterlist dst_sg; | ||
765 | struct blkcipher_desc desc; | ||
766 | char fnek_sig_hex[ECRYPTFS_SIG_SIZE_HEX + 1]; | ||
767 | char iv[ECRYPTFS_MAX_IV_BYTES]; | ||
768 | char cipher_string[ECRYPTFS_MAX_CIPHER_NAME_SIZE]; | ||
769 | }; | ||
770 | |||
771 | /** | ||
772 | * parse_tag_70_packet - Parse and process FNEK-encrypted passphrase packet | ||
773 | * @filename: This function kmalloc's the memory for the filename | ||
774 | * @filename_size: This function sets this to the amount of memory | ||
775 | * kmalloc'd for the filename | ||
776 | * @packet_size: This function sets this to the the number of octets | ||
777 | * in the packet parsed | ||
778 | * @mount_crypt_stat: The mount-wide cryptographic context | ||
779 | * @data: The memory location containing the start of the tag 70 | ||
780 | * packet | ||
781 | * @max_packet_size: The maximum legal size of the packet to be parsed | ||
782 | * from @data | ||
783 | * | ||
784 | * Returns zero on success; non-zero otherwise | ||
785 | */ | ||
786 | int | ||
787 | ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size, | ||
788 | size_t *packet_size, | ||
789 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, | ||
790 | char *data, size_t max_packet_size) | ||
791 | { | ||
792 | struct ecryptfs_parse_tag_70_packet_silly_stack *s; | ||
793 | int rc = 0; | ||
794 | |||
795 | (*packet_size) = 0; | ||
796 | (*filename_size) = 0; | ||
797 | (*filename) = NULL; | ||
798 | s = kmalloc(sizeof(*s), GFP_KERNEL); | ||
799 | if (!s) { | ||
800 | printk(KERN_ERR "%s: Out of memory whilst trying to kmalloc " | ||
801 | "[%zd] bytes of kernel memory\n", __func__, sizeof(*s)); | ||
802 | goto out; | ||
803 | } | ||
804 | s->desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP; | ||
805 | if (max_packet_size < (1 + 1 + ECRYPTFS_SIG_SIZE + 1 + 1)) { | ||
806 | printk(KERN_WARNING "%s: max_packet_size is [%zd]; it must be " | ||
807 | "at least [%d]\n", __func__, max_packet_size, | ||
808 | (1 + 1 + ECRYPTFS_SIG_SIZE + 1 + 1)); | ||
809 | rc = -EINVAL; | ||
810 | goto out; | ||
811 | } | ||
812 | /* Octet 0: Tag 70 identifier | ||
813 | * Octets 1-N1: Tag 70 packet size (includes cipher identifier | ||
814 | * and block-aligned encrypted filename size) | ||
815 | * Octets N1-N2: FNEK sig (ECRYPTFS_SIG_SIZE) | ||
816 | * Octet N2-N3: Cipher identifier (1 octet) | ||
817 | * Octets N3-N4: Block-aligned encrypted filename | ||
818 | * - Consists of a minimum number of random numbers, a \0 | ||
819 | * separator, and then the filename */ | ||
820 | if (data[(*packet_size)++] != ECRYPTFS_TAG_70_PACKET_TYPE) { | ||
821 | printk(KERN_WARNING "%s: Invalid packet tag [0x%.2x]; must be " | ||
822 | "tag [0x%.2x]\n", __func__, | ||
823 | data[((*packet_size) - 1)], ECRYPTFS_TAG_70_PACKET_TYPE); | ||
824 | rc = -EINVAL; | ||
825 | goto out; | ||
826 | } | ||
827 | rc = ecryptfs_parse_packet_length(&data[(*packet_size)], | ||
828 | &s->parsed_tag_70_packet_size, | ||
829 | &s->packet_size_len); | ||
830 | if (rc) { | ||
831 | printk(KERN_WARNING "%s: Error parsing packet length; " | ||
832 | "rc = [%d]\n", __func__, rc); | ||
833 | goto out; | ||
834 | } | ||
835 | s->block_aligned_filename_size = (s->parsed_tag_70_packet_size | ||
836 | - ECRYPTFS_SIG_SIZE - 1); | ||
837 | if ((1 + s->packet_size_len + s->parsed_tag_70_packet_size) | ||
838 | > max_packet_size) { | ||
839 | printk(KERN_WARNING "%s: max_packet_size is [%zd]; real packet " | ||
840 | "size is [%zd]\n", __func__, max_packet_size, | ||
841 | (1 + s->packet_size_len + 1 | ||
842 | + s->block_aligned_filename_size)); | ||
843 | rc = -EINVAL; | ||
844 | goto out; | ||
845 | } | ||
846 | (*packet_size) += s->packet_size_len; | ||
847 | ecryptfs_to_hex(s->fnek_sig_hex, &data[(*packet_size)], | ||
848 | ECRYPTFS_SIG_SIZE); | ||
849 | s->fnek_sig_hex[ECRYPTFS_SIG_SIZE_HEX] = '\0'; | ||
850 | (*packet_size) += ECRYPTFS_SIG_SIZE; | ||
851 | s->cipher_code = data[(*packet_size)++]; | ||
852 | rc = ecryptfs_cipher_code_to_string(s->cipher_string, s->cipher_code); | ||
853 | if (rc) { | ||
854 | printk(KERN_WARNING "%s: Cipher code [%d] is invalid\n", | ||
855 | __func__, s->cipher_code); | ||
856 | goto out; | ||
857 | } | ||
858 | rc = ecryptfs_get_tfm_and_mutex_for_cipher_name(&s->desc.tfm, | ||
859 | &s->tfm_mutex, | ||
860 | s->cipher_string); | ||
861 | if (unlikely(rc)) { | ||
862 | printk(KERN_ERR "Internal error whilst attempting to get " | ||
863 | "tfm and mutex for cipher name [%s]; rc = [%d]\n", | ||
864 | s->cipher_string, rc); | ||
865 | goto out; | ||
866 | } | ||
867 | mutex_lock(s->tfm_mutex); | ||
868 | rc = virt_to_scatterlist(&data[(*packet_size)], | ||
869 | s->block_aligned_filename_size, &s->src_sg, 1); | ||
870 | if (rc != 1) { | ||
871 | printk(KERN_ERR "%s: Internal error whilst attempting to " | ||
872 | "convert encrypted filename memory to scatterlist; " | ||
873 | "expected rc = 1; got rc = [%d]. " | ||
874 | "block_aligned_filename_size = [%zd]\n", __func__, rc, | ||
875 | s->block_aligned_filename_size); | ||
876 | goto out_unlock; | ||
877 | } | ||
878 | (*packet_size) += s->block_aligned_filename_size; | ||
879 | s->decrypted_filename = kmalloc(s->block_aligned_filename_size, | ||
880 | GFP_KERNEL); | ||
881 | if (!s->decrypted_filename) { | ||
882 | printk(KERN_ERR "%s: Out of memory whilst attempting to " | ||
883 | "kmalloc [%zd] bytes\n", __func__, | ||
884 | s->block_aligned_filename_size); | ||
885 | rc = -ENOMEM; | ||
886 | goto out_unlock; | ||
887 | } | ||
888 | rc = virt_to_scatterlist(s->decrypted_filename, | ||
889 | s->block_aligned_filename_size, &s->dst_sg, 1); | ||
890 | if (rc != 1) { | ||
891 | printk(KERN_ERR "%s: Internal error whilst attempting to " | ||
892 | "convert decrypted filename memory to scatterlist; " | ||
893 | "expected rc = 1; got rc = [%d]. " | ||
894 | "block_aligned_filename_size = [%zd]\n", __func__, rc, | ||
895 | s->block_aligned_filename_size); | ||
896 | goto out_free_unlock; | ||
897 | } | ||
898 | /* The characters in the first block effectively do the job of | ||
899 | * the IV here, so we just use 0's for the IV. Note the | ||
900 | * constraint that ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES | ||
901 | * >= ECRYPTFS_MAX_IV_BYTES. */ | ||
902 | memset(s->iv, 0, ECRYPTFS_MAX_IV_BYTES); | ||
903 | s->desc.info = s->iv; | ||
904 | rc = ecryptfs_find_auth_tok_for_sig(&s->auth_tok, mount_crypt_stat, | ||
905 | s->fnek_sig_hex); | ||
906 | if (rc) { | ||
907 | printk(KERN_ERR "%s: Error attempting to find auth tok for " | ||
908 | "fnek sig [%s]; rc = [%d]\n", __func__, s->fnek_sig_hex, | ||
909 | rc); | ||
910 | goto out_free_unlock; | ||
911 | } | ||
912 | /* TODO: Support other key modules than passphrase for | ||
913 | * filename encryption */ | ||
914 | BUG_ON(s->auth_tok->token_type != ECRYPTFS_PASSWORD); | ||
915 | rc = crypto_blkcipher_setkey( | ||
916 | s->desc.tfm, | ||
917 | s->auth_tok->token.password.session_key_encryption_key, | ||
918 | mount_crypt_stat->global_default_fn_cipher_key_bytes); | ||
919 | if (rc < 0) { | ||
920 | printk(KERN_ERR "%s: Error setting key for crypto context; " | ||
921 | "rc = [%d]. s->auth_tok->token.password.session_key_" | ||
922 | "encryption_key = [0x%p]; mount_crypt_stat->" | ||
923 | "global_default_fn_cipher_key_bytes = [%zd]\n", __func__, | ||
924 | rc, | ||
925 | s->auth_tok->token.password.session_key_encryption_key, | ||
926 | mount_crypt_stat->global_default_fn_cipher_key_bytes); | ||
927 | goto out_free_unlock; | ||
928 | } | ||
929 | rc = crypto_blkcipher_decrypt_iv(&s->desc, &s->dst_sg, &s->src_sg, | ||
930 | s->block_aligned_filename_size); | ||
931 | if (rc) { | ||
932 | printk(KERN_ERR "%s: Error attempting to decrypt filename; " | ||
933 | "rc = [%d]\n", __func__, rc); | ||
934 | goto out_free_unlock; | ||
935 | } | ||
936 | s->i = 0; | ||
937 | while (s->decrypted_filename[s->i] != '\0' | ||
938 | && s->i < s->block_aligned_filename_size) | ||
939 | s->i++; | ||
940 | if (s->i == s->block_aligned_filename_size) { | ||
941 | printk(KERN_WARNING "%s: Invalid tag 70 packet; could not " | ||
942 | "find valid separator between random characters and " | ||
943 | "the filename\n", __func__); | ||
944 | rc = -EINVAL; | ||
945 | goto out_free_unlock; | ||
946 | } | ||
947 | s->i++; | ||
948 | (*filename_size) = (s->block_aligned_filename_size - s->i); | ||
949 | if (!((*filename_size) > 0 && (*filename_size < PATH_MAX))) { | ||
950 | printk(KERN_WARNING "%s: Filename size is [%zd], which is " | ||
951 | "invalid\n", __func__, (*filename_size)); | ||
952 | rc = -EINVAL; | ||
953 | goto out_free_unlock; | ||
954 | } | ||
955 | (*filename) = kmalloc(((*filename_size) + 1), GFP_KERNEL); | ||
956 | if (!(*filename)) { | ||
957 | printk(KERN_ERR "%s: Out of memory whilst attempting to " | ||
958 | "kmalloc [%zd] bytes\n", __func__, | ||
959 | ((*filename_size) + 1)); | ||
960 | rc = -ENOMEM; | ||
961 | goto out_free_unlock; | ||
962 | } | ||
963 | memcpy((*filename), &s->decrypted_filename[s->i], (*filename_size)); | ||
964 | (*filename)[(*filename_size)] = '\0'; | ||
965 | out_free_unlock: | ||
966 | kfree(s->decrypted_filename); | ||
967 | out_unlock: | ||
968 | mutex_unlock(s->tfm_mutex); | ||
969 | out: | ||
970 | if (rc) { | ||
971 | (*packet_size) = 0; | ||
972 | (*filename_size) = 0; | ||
973 | (*filename) = NULL; | ||
974 | } | ||
975 | kfree(s); | ||
976 | return rc; | ||
977 | } | ||
978 | |||
979 | static int | ||
406 | ecryptfs_get_auth_tok_sig(char **sig, struct ecryptfs_auth_tok *auth_tok) | 980 | ecryptfs_get_auth_tok_sig(char **sig, struct ecryptfs_auth_tok *auth_tok) |
407 | { | 981 | { |
408 | int rc = 0; | 982 | int rc = 0; |
@@ -897,30 +1471,6 @@ out: | |||
897 | return rc; | 1471 | return rc; |
898 | } | 1472 | } |
899 | 1473 | ||
900 | static int | ||
901 | ecryptfs_find_global_auth_tok_for_sig( | ||
902 | struct ecryptfs_global_auth_tok **global_auth_tok, | ||
903 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, char *sig) | ||
904 | { | ||
905 | struct ecryptfs_global_auth_tok *walker; | ||
906 | int rc = 0; | ||
907 | |||
908 | (*global_auth_tok) = NULL; | ||
909 | mutex_lock(&mount_crypt_stat->global_auth_tok_list_mutex); | ||
910 | list_for_each_entry(walker, | ||
911 | &mount_crypt_stat->global_auth_tok_list, | ||
912 | mount_crypt_stat_list) { | ||
913 | if (memcmp(walker->sig, sig, ECRYPTFS_SIG_SIZE_HEX) == 0) { | ||
914 | (*global_auth_tok) = walker; | ||
915 | goto out; | ||
916 | } | ||
917 | } | ||
918 | rc = -EINVAL; | ||
919 | out: | ||
920 | mutex_unlock(&mount_crypt_stat->global_auth_tok_list_mutex); | ||
921 | return rc; | ||
922 | } | ||
923 | |||
924 | /** | 1474 | /** |
925 | * ecryptfs_verify_version | 1475 | * ecryptfs_verify_version |
926 | * @version: The version number to confirm | 1476 | * @version: The version number to confirm |
@@ -990,43 +1540,6 @@ out: | |||
990 | } | 1540 | } |
991 | 1541 | ||
992 | /** | 1542 | /** |
993 | * ecryptfs_find_auth_tok_for_sig | ||
994 | * @auth_tok: Set to the matching auth_tok; NULL if not found | ||
995 | * @crypt_stat: inode crypt_stat crypto context | ||
996 | * @sig: Sig of auth_tok to find | ||
997 | * | ||
998 | * For now, this function simply looks at the registered auth_tok's | ||
999 | * linked off the mount_crypt_stat, so all the auth_toks that can be | ||
1000 | * used must be registered at mount time. This function could | ||
1001 | * potentially try a lot harder to find auth_tok's (e.g., by calling | ||
1002 | * out to ecryptfsd to dynamically retrieve an auth_tok object) so | ||
1003 | * that static registration of auth_tok's will no longer be necessary. | ||
1004 | * | ||
1005 | * Returns zero on no error; non-zero on error | ||
1006 | */ | ||
1007 | static int | ||
1008 | ecryptfs_find_auth_tok_for_sig( | ||
1009 | struct ecryptfs_auth_tok **auth_tok, | ||
1010 | struct ecryptfs_crypt_stat *crypt_stat, char *sig) | ||
1011 | { | ||
1012 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = | ||
1013 | crypt_stat->mount_crypt_stat; | ||
1014 | struct ecryptfs_global_auth_tok *global_auth_tok; | ||
1015 | int rc = 0; | ||
1016 | |||
1017 | (*auth_tok) = NULL; | ||
1018 | if (ecryptfs_find_global_auth_tok_for_sig(&global_auth_tok, | ||
1019 | mount_crypt_stat, sig)) { | ||
1020 | struct key *auth_tok_key; | ||
1021 | |||
1022 | rc = ecryptfs_keyring_auth_tok_for_sig(&auth_tok_key, auth_tok, | ||
1023 | sig); | ||
1024 | } else | ||
1025 | (*auth_tok) = global_auth_tok->global_auth_tok; | ||
1026 | return rc; | ||
1027 | } | ||
1028 | |||
1029 | /** | ||
1030 | * decrypt_passphrase_encrypted_session_key - Decrypt the session key with the given auth_tok. | 1543 | * decrypt_passphrase_encrypted_session_key - Decrypt the session key with the given auth_tok. |
1031 | * @auth_tok: The passphrase authentication token to use to encrypt the FEK | 1544 | * @auth_tok: The passphrase authentication token to use to encrypt the FEK |
1032 | * @crypt_stat: The cryptographic context | 1545 | * @crypt_stat: The cryptographic context |
@@ -1256,7 +1769,8 @@ find_next_matching_auth_tok: | |||
1256 | rc = -EINVAL; | 1769 | rc = -EINVAL; |
1257 | goto out_wipe_list; | 1770 | goto out_wipe_list; |
1258 | } | 1771 | } |
1259 | ecryptfs_find_auth_tok_for_sig(&matching_auth_tok, crypt_stat, | 1772 | ecryptfs_find_auth_tok_for_sig(&matching_auth_tok, |
1773 | crypt_stat->mount_crypt_stat, | ||
1260 | candidate_auth_tok_sig); | 1774 | candidate_auth_tok_sig); |
1261 | if (matching_auth_tok) { | 1775 | if (matching_auth_tok) { |
1262 | found_auth_tok = 1; | 1776 | found_auth_tok = 1; |
@@ -1336,7 +1850,9 @@ pki_encrypt_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
1336 | int rc; | 1850 | int rc; |
1337 | 1851 | ||
1338 | rc = write_tag_66_packet(auth_tok->token.private_key.signature, | 1852 | rc = write_tag_66_packet(auth_tok->token.private_key.signature, |
1339 | ecryptfs_code_for_cipher_string(crypt_stat), | 1853 | ecryptfs_code_for_cipher_string( |
1854 | crypt_stat->cipher, | ||
1855 | crypt_stat->key_size), | ||
1340 | crypt_stat, &payload, &payload_len); | 1856 | crypt_stat, &payload, &payload_len); |
1341 | if (rc) { | 1857 | if (rc) { |
1342 | ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet\n"); | 1858 | ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet\n"); |
@@ -1696,7 +2212,8 @@ encrypted_session_key_set: | |||
1696 | dest[(*packet_size)++] = 0x04; /* version 4 */ | 2212 | dest[(*packet_size)++] = 0x04; /* version 4 */ |
1697 | /* TODO: Break from RFC2440 so that arbitrary ciphers can be | 2213 | /* TODO: Break from RFC2440 so that arbitrary ciphers can be |
1698 | * specified with strings */ | 2214 | * specified with strings */ |
1699 | cipher_code = ecryptfs_code_for_cipher_string(crypt_stat); | 2215 | cipher_code = ecryptfs_code_for_cipher_string(crypt_stat->cipher, |
2216 | crypt_stat->key_size); | ||
1700 | if (cipher_code == 0) { | 2217 | if (cipher_code == 0) { |
1701 | ecryptfs_printk(KERN_WARNING, "Unable to generate code for " | 2218 | ecryptfs_printk(KERN_WARNING, "Unable to generate code for " |
1702 | "cipher [%s]\n", crypt_stat->cipher); | 2219 | "cipher [%s]\n", crypt_stat->cipher); |
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index fd630713c5c7..789cf2e1be1e 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
@@ -206,7 +206,9 @@ enum { ecryptfs_opt_sig, ecryptfs_opt_ecryptfs_sig, | |||
206 | ecryptfs_opt_cipher, ecryptfs_opt_ecryptfs_cipher, | 206 | ecryptfs_opt_cipher, ecryptfs_opt_ecryptfs_cipher, |
207 | ecryptfs_opt_ecryptfs_key_bytes, | 207 | ecryptfs_opt_ecryptfs_key_bytes, |
208 | ecryptfs_opt_passthrough, ecryptfs_opt_xattr_metadata, | 208 | ecryptfs_opt_passthrough, ecryptfs_opt_xattr_metadata, |
209 | ecryptfs_opt_encrypted_view, ecryptfs_opt_err }; | 209 | ecryptfs_opt_encrypted_view, ecryptfs_opt_fnek_sig, |
210 | ecryptfs_opt_fn_cipher, ecryptfs_opt_fn_cipher_key_bytes, | ||
211 | ecryptfs_opt_err }; | ||
210 | 212 | ||
211 | static const match_table_t tokens = { | 213 | static const match_table_t tokens = { |
212 | {ecryptfs_opt_sig, "sig=%s"}, | 214 | {ecryptfs_opt_sig, "sig=%s"}, |
@@ -217,6 +219,9 @@ static const match_table_t tokens = { | |||
217 | {ecryptfs_opt_passthrough, "ecryptfs_passthrough"}, | 219 | {ecryptfs_opt_passthrough, "ecryptfs_passthrough"}, |
218 | {ecryptfs_opt_xattr_metadata, "ecryptfs_xattr_metadata"}, | 220 | {ecryptfs_opt_xattr_metadata, "ecryptfs_xattr_metadata"}, |
219 | {ecryptfs_opt_encrypted_view, "ecryptfs_encrypted_view"}, | 221 | {ecryptfs_opt_encrypted_view, "ecryptfs_encrypted_view"}, |
222 | {ecryptfs_opt_fnek_sig, "ecryptfs_fnek_sig=%s"}, | ||
223 | {ecryptfs_opt_fn_cipher, "ecryptfs_fn_cipher=%s"}, | ||
224 | {ecryptfs_opt_fn_cipher_key_bytes, "ecryptfs_fn_key_bytes=%u"}, | ||
220 | {ecryptfs_opt_err, NULL} | 225 | {ecryptfs_opt_err, NULL} |
221 | }; | 226 | }; |
222 | 227 | ||
@@ -281,8 +286,11 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
281 | int rc = 0; | 286 | int rc = 0; |
282 | int sig_set = 0; | 287 | int sig_set = 0; |
283 | int cipher_name_set = 0; | 288 | int cipher_name_set = 0; |
289 | int fn_cipher_name_set = 0; | ||
284 | int cipher_key_bytes; | 290 | int cipher_key_bytes; |
285 | int cipher_key_bytes_set = 0; | 291 | int cipher_key_bytes_set = 0; |
292 | int fn_cipher_key_bytes; | ||
293 | int fn_cipher_key_bytes_set = 0; | ||
286 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = | 294 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = |
287 | &ecryptfs_superblock_to_private(sb)->mount_crypt_stat; | 295 | &ecryptfs_superblock_to_private(sb)->mount_crypt_stat; |
288 | substring_t args[MAX_OPT_ARGS]; | 296 | substring_t args[MAX_OPT_ARGS]; |
@@ -290,7 +298,12 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
290 | char *sig_src; | 298 | char *sig_src; |
291 | char *cipher_name_dst; | 299 | char *cipher_name_dst; |
292 | char *cipher_name_src; | 300 | char *cipher_name_src; |
301 | char *fn_cipher_name_dst; | ||
302 | char *fn_cipher_name_src; | ||
303 | char *fnek_dst; | ||
304 | char *fnek_src; | ||
293 | char *cipher_key_bytes_src; | 305 | char *cipher_key_bytes_src; |
306 | char *fn_cipher_key_bytes_src; | ||
294 | 307 | ||
295 | if (!options) { | 308 | if (!options) { |
296 | rc = -EINVAL; | 309 | rc = -EINVAL; |
@@ -322,10 +335,7 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
322 | global_default_cipher_name; | 335 | global_default_cipher_name; |
323 | strncpy(cipher_name_dst, cipher_name_src, | 336 | strncpy(cipher_name_dst, cipher_name_src, |
324 | ECRYPTFS_MAX_CIPHER_NAME_SIZE); | 337 | ECRYPTFS_MAX_CIPHER_NAME_SIZE); |
325 | ecryptfs_printk(KERN_DEBUG, | 338 | cipher_name_dst[ECRYPTFS_MAX_CIPHER_NAME_SIZE] = '\0'; |
326 | "The mount_crypt_stat " | ||
327 | "global_default_cipher_name set to: " | ||
328 | "[%s]\n", cipher_name_dst); | ||
329 | cipher_name_set = 1; | 339 | cipher_name_set = 1; |
330 | break; | 340 | break; |
331 | case ecryptfs_opt_ecryptfs_key_bytes: | 341 | case ecryptfs_opt_ecryptfs_key_bytes: |
@@ -335,11 +345,6 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
335 | &cipher_key_bytes_src, 0); | 345 | &cipher_key_bytes_src, 0); |
336 | mount_crypt_stat->global_default_cipher_key_size = | 346 | mount_crypt_stat->global_default_cipher_key_size = |
337 | cipher_key_bytes; | 347 | cipher_key_bytes; |
338 | ecryptfs_printk(KERN_DEBUG, | ||
339 | "The mount_crypt_stat " | ||
340 | "global_default_cipher_key_size " | ||
341 | "set to: [%d]\n", mount_crypt_stat-> | ||
342 | global_default_cipher_key_size); | ||
343 | cipher_key_bytes_set = 1; | 348 | cipher_key_bytes_set = 1; |
344 | break; | 349 | break; |
345 | case ecryptfs_opt_passthrough: | 350 | case ecryptfs_opt_passthrough: |
@@ -356,11 +361,51 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
356 | mount_crypt_stat->flags |= | 361 | mount_crypt_stat->flags |= |
357 | ECRYPTFS_ENCRYPTED_VIEW_ENABLED; | 362 | ECRYPTFS_ENCRYPTED_VIEW_ENABLED; |
358 | break; | 363 | break; |
364 | case ecryptfs_opt_fnek_sig: | ||
365 | fnek_src = args[0].from; | ||
366 | fnek_dst = | ||
367 | mount_crypt_stat->global_default_fnek_sig; | ||
368 | strncpy(fnek_dst, fnek_src, ECRYPTFS_SIG_SIZE_HEX); | ||
369 | mount_crypt_stat->global_default_fnek_sig[ | ||
370 | ECRYPTFS_SIG_SIZE_HEX] = '\0'; | ||
371 | rc = ecryptfs_add_global_auth_tok( | ||
372 | mount_crypt_stat, | ||
373 | mount_crypt_stat->global_default_fnek_sig); | ||
374 | if (rc) { | ||
375 | printk(KERN_ERR "Error attempting to register " | ||
376 | "global fnek sig [%s]; rc = [%d]\n", | ||
377 | mount_crypt_stat->global_default_fnek_sig, | ||
378 | rc); | ||
379 | goto out; | ||
380 | } | ||
381 | mount_crypt_stat->flags |= | ||
382 | (ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES | ||
383 | | ECRYPTFS_GLOBAL_ENCFN_USE_MOUNT_FNEK); | ||
384 | break; | ||
385 | case ecryptfs_opt_fn_cipher: | ||
386 | fn_cipher_name_src = args[0].from; | ||
387 | fn_cipher_name_dst = | ||
388 | mount_crypt_stat->global_default_fn_cipher_name; | ||
389 | strncpy(fn_cipher_name_dst, fn_cipher_name_src, | ||
390 | ECRYPTFS_MAX_CIPHER_NAME_SIZE); | ||
391 | mount_crypt_stat->global_default_fn_cipher_name[ | ||
392 | ECRYPTFS_MAX_CIPHER_NAME_SIZE] = '\0'; | ||
393 | fn_cipher_name_set = 1; | ||
394 | break; | ||
395 | case ecryptfs_opt_fn_cipher_key_bytes: | ||
396 | fn_cipher_key_bytes_src = args[0].from; | ||
397 | fn_cipher_key_bytes = | ||
398 | (int)simple_strtol(fn_cipher_key_bytes_src, | ||
399 | &fn_cipher_key_bytes_src, 0); | ||
400 | mount_crypt_stat->global_default_fn_cipher_key_bytes = | ||
401 | fn_cipher_key_bytes; | ||
402 | fn_cipher_key_bytes_set = 1; | ||
403 | break; | ||
359 | case ecryptfs_opt_err: | 404 | case ecryptfs_opt_err: |
360 | default: | 405 | default: |
361 | ecryptfs_printk(KERN_WARNING, | 406 | printk(KERN_WARNING |
362 | "eCryptfs: unrecognized option '%s'\n", | 407 | "%s: eCryptfs: unrecognized option [%s]\n", |
363 | p); | 408 | __func__, p); |
364 | } | 409 | } |
365 | } | 410 | } |
366 | if (!sig_set) { | 411 | if (!sig_set) { |
@@ -374,33 +419,60 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
374 | int cipher_name_len = strlen(ECRYPTFS_DEFAULT_CIPHER); | 419 | int cipher_name_len = strlen(ECRYPTFS_DEFAULT_CIPHER); |
375 | 420 | ||
376 | BUG_ON(cipher_name_len >= ECRYPTFS_MAX_CIPHER_NAME_SIZE); | 421 | BUG_ON(cipher_name_len >= ECRYPTFS_MAX_CIPHER_NAME_SIZE); |
377 | |||
378 | strcpy(mount_crypt_stat->global_default_cipher_name, | 422 | strcpy(mount_crypt_stat->global_default_cipher_name, |
379 | ECRYPTFS_DEFAULT_CIPHER); | 423 | ECRYPTFS_DEFAULT_CIPHER); |
380 | } | 424 | } |
381 | if (!cipher_key_bytes_set) { | 425 | if ((mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) |
426 | && !fn_cipher_name_set) | ||
427 | strcpy(mount_crypt_stat->global_default_fn_cipher_name, | ||
428 | mount_crypt_stat->global_default_cipher_name); | ||
429 | if (!cipher_key_bytes_set) | ||
382 | mount_crypt_stat->global_default_cipher_key_size = 0; | 430 | mount_crypt_stat->global_default_cipher_key_size = 0; |
383 | } | 431 | if ((mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) |
432 | && !fn_cipher_key_bytes_set) | ||
433 | mount_crypt_stat->global_default_fn_cipher_key_bytes = | ||
434 | mount_crypt_stat->global_default_cipher_key_size; | ||
384 | mutex_lock(&key_tfm_list_mutex); | 435 | mutex_lock(&key_tfm_list_mutex); |
385 | if (!ecryptfs_tfm_exists(mount_crypt_stat->global_default_cipher_name, | 436 | if (!ecryptfs_tfm_exists(mount_crypt_stat->global_default_cipher_name, |
386 | NULL)) | 437 | NULL)) { |
387 | rc = ecryptfs_add_new_key_tfm( | 438 | rc = ecryptfs_add_new_key_tfm( |
388 | NULL, mount_crypt_stat->global_default_cipher_name, | 439 | NULL, mount_crypt_stat->global_default_cipher_name, |
389 | mount_crypt_stat->global_default_cipher_key_size); | 440 | mount_crypt_stat->global_default_cipher_key_size); |
390 | mutex_unlock(&key_tfm_list_mutex); | 441 | if (rc) { |
391 | if (rc) { | 442 | printk(KERN_ERR "Error attempting to initialize " |
392 | printk(KERN_ERR "Error attempting to initialize cipher with " | 443 | "cipher with name = [%s] and key size = [%td]; " |
393 | "name = [%s] and key size = [%td]; rc = [%d]\n", | 444 | "rc = [%d]\n", |
394 | mount_crypt_stat->global_default_cipher_name, | 445 | mount_crypt_stat->global_default_cipher_name, |
395 | mount_crypt_stat->global_default_cipher_key_size, rc); | 446 | mount_crypt_stat->global_default_cipher_key_size, |
396 | rc = -EINVAL; | 447 | rc); |
397 | goto out; | 448 | rc = -EINVAL; |
449 | mutex_unlock(&key_tfm_list_mutex); | ||
450 | goto out; | ||
451 | } | ||
398 | } | 452 | } |
453 | if ((mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) | ||
454 | && !ecryptfs_tfm_exists( | ||
455 | mount_crypt_stat->global_default_fn_cipher_name, NULL)) { | ||
456 | rc = ecryptfs_add_new_key_tfm( | ||
457 | NULL, mount_crypt_stat->global_default_fn_cipher_name, | ||
458 | mount_crypt_stat->global_default_fn_cipher_key_bytes); | ||
459 | if (rc) { | ||
460 | printk(KERN_ERR "Error attempting to initialize " | ||
461 | "cipher with name = [%s] and key size = [%td]; " | ||
462 | "rc = [%d]\n", | ||
463 | mount_crypt_stat->global_default_fn_cipher_name, | ||
464 | mount_crypt_stat->global_default_fn_cipher_key_bytes, | ||
465 | rc); | ||
466 | rc = -EINVAL; | ||
467 | mutex_unlock(&key_tfm_list_mutex); | ||
468 | goto out; | ||
469 | } | ||
470 | } | ||
471 | mutex_unlock(&key_tfm_list_mutex); | ||
399 | rc = ecryptfs_init_global_auth_toks(mount_crypt_stat); | 472 | rc = ecryptfs_init_global_auth_toks(mount_crypt_stat); |
400 | if (rc) { | 473 | if (rc) |
401 | printk(KERN_WARNING "One or more global auth toks could not " | 474 | printk(KERN_WARNING "One or more global auth toks could not " |
402 | "properly register; rc = [%d]\n", rc); | 475 | "properly register; rc = [%d]\n", rc); |
403 | } | ||
404 | out: | 476 | out: |
405 | return rc; | 477 | return rc; |
406 | } | 478 | } |
diff --git a/fs/ecryptfs/messaging.c b/fs/ecryptfs/messaging.c index 6913f727624d..96ef51489e01 100644 --- a/fs/ecryptfs/messaging.c +++ b/fs/ecryptfs/messaging.c | |||
@@ -193,7 +193,7 @@ ecryptfs_spawn_daemon(struct ecryptfs_daemon **daemon, uid_t euid, | |||
193 | (*daemon) = kzalloc(sizeof(**daemon), GFP_KERNEL); | 193 | (*daemon) = kzalloc(sizeof(**daemon), GFP_KERNEL); |
194 | if (!(*daemon)) { | 194 | if (!(*daemon)) { |
195 | rc = -ENOMEM; | 195 | rc = -ENOMEM; |
196 | printk(KERN_ERR "%s: Failed to allocate [%Zd] bytes of " | 196 | printk(KERN_ERR "%s: Failed to allocate [%zd] bytes of " |
197 | "GFP_KERNEL memory\n", __func__, sizeof(**daemon)); | 197 | "GFP_KERNEL memory\n", __func__, sizeof(**daemon)); |
198 | goto out; | 198 | goto out; |
199 | } | 199 | } |
@@ -435,7 +435,7 @@ int ecryptfs_process_response(struct ecryptfs_message *msg, uid_t euid, | |||
435 | msg_ctx->msg = kmalloc(msg_size, GFP_KERNEL); | 435 | msg_ctx->msg = kmalloc(msg_size, GFP_KERNEL); |
436 | if (!msg_ctx->msg) { | 436 | if (!msg_ctx->msg) { |
437 | rc = -ENOMEM; | 437 | rc = -ENOMEM; |
438 | printk(KERN_ERR "%s: Failed to allocate [%Zd] bytes of " | 438 | printk(KERN_ERR "%s: Failed to allocate [%zd] bytes of " |
439 | "GFP_KERNEL memory\n", __func__, msg_size); | 439 | "GFP_KERNEL memory\n", __func__, msg_size); |
440 | goto unlock; | 440 | goto unlock; |
441 | } | 441 | } |
diff --git a/fs/ecryptfs/miscdev.c b/fs/ecryptfs/miscdev.c index efd95a0ed1ea..a67fea655f49 100644 --- a/fs/ecryptfs/miscdev.c +++ b/fs/ecryptfs/miscdev.c | |||
@@ -199,7 +199,7 @@ int ecryptfs_send_miscdev(char *data, size_t data_size, | |||
199 | if (!msg_ctx->msg) { | 199 | if (!msg_ctx->msg) { |
200 | rc = -ENOMEM; | 200 | rc = -ENOMEM; |
201 | printk(KERN_ERR "%s: Out of memory whilst attempting " | 201 | printk(KERN_ERR "%s: Out of memory whilst attempting " |
202 | "to kmalloc(%Zd, GFP_KERNEL)\n", __func__, | 202 | "to kmalloc(%zd, GFP_KERNEL)\n", __func__, |
203 | (sizeof(*msg_ctx->msg) + data_size)); | 203 | (sizeof(*msg_ctx->msg) + data_size)); |
204 | goto out_unlock; | 204 | goto out_unlock; |
205 | } | 205 | } |
@@ -322,7 +322,7 @@ check_list: | |||
322 | if (count < total_length) { | 322 | if (count < total_length) { |
323 | rc = 0; | 323 | rc = 0; |
324 | printk(KERN_WARNING "%s: Only given user buffer of " | 324 | printk(KERN_WARNING "%s: Only given user buffer of " |
325 | "size [%Zd], but we need [%Zd] to read the " | 325 | "size [%zd], but we need [%zd] to read the " |
326 | "pending message\n", __func__, count, total_length); | 326 | "pending message\n", __func__, count, total_length); |
327 | goto out_unlock_msg_ctx; | 327 | goto out_unlock_msg_ctx; |
328 | } | 328 | } |
@@ -376,7 +376,7 @@ static int ecryptfs_miscdev_response(char *data, size_t data_size, | |||
376 | 376 | ||
377 | if ((sizeof(*msg) + msg->data_len) != data_size) { | 377 | if ((sizeof(*msg) + msg->data_len) != data_size) { |
378 | printk(KERN_WARNING "%s: (sizeof(*msg) + msg->data_len) = " | 378 | printk(KERN_WARNING "%s: (sizeof(*msg) + msg->data_len) = " |
379 | "[%Zd]; data_size = [%Zd]. Invalid packet.\n", __func__, | 379 | "[%zd]; data_size = [%zd]. Invalid packet.\n", __func__, |
380 | (sizeof(*msg) + msg->data_len), data_size); | 380 | (sizeof(*msg) + msg->data_len), data_size); |
381 | rc = -EINVAL; | 381 | rc = -EINVAL; |
382 | goto out; | 382 | goto out; |
@@ -421,7 +421,7 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf, | |||
421 | data = kmalloc(count, GFP_KERNEL); | 421 | data = kmalloc(count, GFP_KERNEL); |
422 | if (!data) { | 422 | if (!data) { |
423 | printk(KERN_ERR "%s: Out of memory whilst attempting to " | 423 | printk(KERN_ERR "%s: Out of memory whilst attempting to " |
424 | "kmalloc([%Zd], GFP_KERNEL)\n", __func__, count); | 424 | "kmalloc([%zd], GFP_KERNEL)\n", __func__, count); |
425 | goto out; | 425 | goto out; |
426 | } | 426 | } |
427 | rc = copy_from_user(data, buf, count); | 427 | rc = copy_from_user(data, buf, count); |
@@ -436,8 +436,8 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf, | |||
436 | case ECRYPTFS_MSG_RESPONSE: | 436 | case ECRYPTFS_MSG_RESPONSE: |
437 | if (count < (1 + 4 + 1 + sizeof(struct ecryptfs_message))) { | 437 | if (count < (1 + 4 + 1 + sizeof(struct ecryptfs_message))) { |
438 | printk(KERN_WARNING "%s: Minimum acceptable packet " | 438 | printk(KERN_WARNING "%s: Minimum acceptable packet " |
439 | "size is [%Zd], but amount of data written is " | 439 | "size is [%zd], but amount of data written is " |
440 | "only [%Zd]. Discarding response packet.\n", | 440 | "only [%zd]. Discarding response packet.\n", |
441 | __func__, | 441 | __func__, |
442 | (1 + 4 + 1 + sizeof(struct ecryptfs_message)), | 442 | (1 + 4 + 1 + sizeof(struct ecryptfs_message)), |
443 | count); | 443 | count); |
@@ -455,9 +455,9 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf, | |||
455 | } | 455 | } |
456 | i += packet_size_length; | 456 | i += packet_size_length; |
457 | if ((1 + 4 + packet_size_length + packet_size) != count) { | 457 | if ((1 + 4 + packet_size_length + packet_size) != count) { |
458 | printk(KERN_WARNING "%s: (1 + packet_size_length([%Zd])" | 458 | printk(KERN_WARNING "%s: (1 + packet_size_length([%zd])" |
459 | " + packet_size([%Zd]))([%Zd]) != " | 459 | " + packet_size([%zd]))([%zd]) != " |
460 | "count([%Zd]). Invalid packet format.\n", | 460 | "count([%zd]). Invalid packet format.\n", |
461 | __func__, packet_size_length, packet_size, | 461 | __func__, packet_size_length, packet_size, |
462 | (1 + packet_size_length + packet_size), count); | 462 | (1 + packet_size_length + packet_size), count); |
463 | goto out_free; | 463 | goto out_free; |
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index 04d7b3fa1ac6..46cec2b69796 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c | |||
@@ -288,7 +288,7 @@ static int ecryptfs_write_begin(struct file *file, | |||
288 | loff_t prev_page_end_size; | 288 | loff_t prev_page_end_size; |
289 | int rc = 0; | 289 | int rc = 0; |
290 | 290 | ||
291 | page = __grab_cache_page(mapping, index); | 291 | page = grab_cache_page_write_begin(mapping, index, flags); |
292 | if (!page) | 292 | if (!page) |
293 | return -ENOMEM; | 293 | return -ENOMEM; |
294 | *pagep = page; | 294 | *pagep = page; |