linux/fs/crypto/fname.c
<<
>>
Prefs
   1/*
   2 * This contains functions for filename crypto management
   3 *
   4 * Copyright (C) 2015, Google, Inc.
   5 * Copyright (C) 2015, Motorola Mobility
   6 *
   7 * Written by Uday Savagaonkar, 2014.
   8 * Modified by Jaegeuk Kim, 2015.
   9 *
  10 * This has not yet undergone a rigorous security audit.
  11 */
  12
  13#include <keys/encrypted-type.h>
  14#include <keys/user-type.h>
  15#include <linux/scatterlist.h>
  16#include <linux/ratelimit.h>
  17#include <linux/fscrypto.h>
  18
  19static u32 size_round_up(size_t size, size_t blksize)
  20{
  21        return ((size + blksize - 1) / blksize) * blksize;
  22}
  23
  24/**
  25 * dir_crypt_complete() -
  26 */
  27static void dir_crypt_complete(struct crypto_async_request *req, int res)
  28{
  29        struct fscrypt_completion_result *ecr = req->data;
  30
  31        if (res == -EINPROGRESS)
  32                return;
  33        ecr->res = res;
  34        complete(&ecr->completion);
  35}
  36
  37/**
  38 * fname_encrypt() -
  39 *
  40 * This function encrypts the input filename, and returns the length of the
  41 * ciphertext. Errors are returned as negative numbers.  We trust the caller to
  42 * allocate sufficient memory to oname string.
  43 */
  44static int fname_encrypt(struct inode *inode,
  45                        const struct qstr *iname, struct fscrypt_str *oname)
  46{
  47        u32 ciphertext_len;
  48        struct skcipher_request *req = NULL;
  49        DECLARE_FS_COMPLETION_RESULT(ecr);
  50        struct fscrypt_info *ci = inode->i_crypt_info;
  51        struct crypto_skcipher *tfm = ci->ci_ctfm;
  52        int res = 0;
  53        char iv[FS_CRYPTO_BLOCK_SIZE];
  54        struct scatterlist src_sg, dst_sg;
  55        int padding = 4 << (ci->ci_flags & FS_POLICY_FLAGS_PAD_MASK);
  56        char *workbuf, buf[32], *alloc_buf = NULL;
  57        unsigned lim;
  58
  59        lim = inode->i_sb->s_cop->max_namelen(inode);
  60        if (iname->len <= 0 || iname->len > lim)
  61                return -EIO;
  62
  63        ciphertext_len = (iname->len < FS_CRYPTO_BLOCK_SIZE) ?
  64                                        FS_CRYPTO_BLOCK_SIZE : iname->len;
  65        ciphertext_len = size_round_up(ciphertext_len, padding);
  66        ciphertext_len = (ciphertext_len > lim) ? lim : ciphertext_len;
  67
  68        if (ciphertext_len <= sizeof(buf)) {
  69                workbuf = buf;
  70        } else {
  71                alloc_buf = kmalloc(ciphertext_len, GFP_NOFS);
  72                if (!alloc_buf)
  73                        return -ENOMEM;
  74                workbuf = alloc_buf;
  75        }
  76
  77        /* Allocate request */
  78        req = skcipher_request_alloc(tfm, GFP_NOFS);
  79        if (!req) {
  80                printk_ratelimited(KERN_ERR
  81                        "%s: crypto_request_alloc() failed\n", __func__);
  82                kfree(alloc_buf);
  83                return -ENOMEM;
  84        }
  85        skcipher_request_set_callback(req,
  86                        CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
  87                        dir_crypt_complete, &ecr);
  88
  89        /* Copy the input */
  90        memcpy(workbuf, iname->name, iname->len);
  91        if (iname->len < ciphertext_len)
  92                memset(workbuf + iname->len, 0, ciphertext_len - iname->len);
  93
  94        /* Initialize IV */
  95        memset(iv, 0, FS_CRYPTO_BLOCK_SIZE);
  96
  97        /* Create encryption request */
  98        sg_init_one(&src_sg, workbuf, ciphertext_len);
  99        sg_init_one(&dst_sg, oname->name, ciphertext_len);
 100        skcipher_request_set_crypt(req, &src_sg, &dst_sg, ciphertext_len, iv);
 101        res = crypto_skcipher_encrypt(req);
 102        if (res == -EINPROGRESS || res == -EBUSY) {
 103                wait_for_completion(&ecr.completion);
 104                res = ecr.res;
 105        }
 106        kfree(alloc_buf);
 107        skcipher_request_free(req);
 108        if (res < 0)
 109                printk_ratelimited(KERN_ERR
 110                                "%s: Error (error code %d)\n", __func__, res);
 111
 112        oname->len = ciphertext_len;
 113        return res;
 114}
 115
 116/*
 117 * fname_decrypt()
 118 *      This function decrypts the input filename, and returns
 119 *      the length of the plaintext.
 120 *      Errors are returned as negative numbers.
 121 *      We trust the caller to allocate sufficient memory to oname string.
 122 */
 123static int fname_decrypt(struct inode *inode,
 124                                const struct fscrypt_str *iname,
 125                                struct fscrypt_str *oname)
 126{
 127        struct skcipher_request *req = NULL;
 128        DECLARE_FS_COMPLETION_RESULT(ecr);
 129        struct scatterlist src_sg, dst_sg;
 130        struct fscrypt_info *ci = inode->i_crypt_info;
 131        struct crypto_skcipher *tfm = ci->ci_ctfm;
 132        int res = 0;
 133        char iv[FS_CRYPTO_BLOCK_SIZE];
 134        unsigned lim;
 135
 136        lim = inode->i_sb->s_cop->max_namelen(inode);
 137        if (iname->len <= 0 || iname->len > lim)
 138                return -EIO;
 139
 140        /* Allocate request */
 141        req = skcipher_request_alloc(tfm, GFP_NOFS);
 142        if (!req) {
 143                printk_ratelimited(KERN_ERR
 144                        "%s: crypto_request_alloc() failed\n",  __func__);
 145                return -ENOMEM;
 146        }
 147        skcipher_request_set_callback(req,
 148                CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
 149                dir_crypt_complete, &ecr);
 150
 151        /* Initialize IV */
 152        memset(iv, 0, FS_CRYPTO_BLOCK_SIZE);
 153
 154        /* Create decryption request */
 155        sg_init_one(&src_sg, iname->name, iname->len);
 156        sg_init_one(&dst_sg, oname->name, oname->len);
 157        skcipher_request_set_crypt(req, &src_sg, &dst_sg, iname->len, iv);
 158        res = crypto_skcipher_decrypt(req);
 159        if (res == -EINPROGRESS || res == -EBUSY) {
 160                wait_for_completion(&ecr.completion);
 161                res = ecr.res;
 162        }
 163        skcipher_request_free(req);
 164        if (res < 0) {
 165                printk_ratelimited(KERN_ERR
 166                                "%s: Error (error code %d)\n", __func__, res);
 167                return res;
 168        }
 169
 170        oname->len = strnlen(oname->name, iname->len);
 171        return oname->len;
 172}
 173
 174static const char *lookup_table =
 175        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,";
 176
 177/**
 178 * digest_encode() -
 179 *
 180 * Encodes the input digest using characters from the set [a-zA-Z0-9_+].
 181 * The encoded string is roughly 4/3 times the size of the input string.
 182 */
 183static int digest_encode(const char *src, int len, char *dst)
 184{
 185        int i = 0, bits = 0, ac = 0;
 186        char *cp = dst;
 187
 188        while (i < len) {
 189                ac += (((unsigned char) src[i]) << bits);
 190                bits += 8;
 191                do {
 192                        *cp++ = lookup_table[ac & 0x3f];
 193                        ac >>= 6;
 194                        bits -= 6;
 195                } while (bits >= 6);
 196                i++;
 197        }
 198        if (bits)
 199                *cp++ = lookup_table[ac & 0x3f];
 200        return cp - dst;
 201}
 202
 203static int digest_decode(const char *src, int len, char *dst)
 204{
 205        int i = 0, bits = 0, ac = 0;
 206        const char *p;
 207        char *cp = dst;
 208
 209        while (i < len) {
 210                p = strchr(lookup_table, src[i]);
 211                if (p == NULL || src[i] == 0)
 212                        return -2;
 213                ac += (p - lookup_table) << bits;
 214                bits += 6;
 215                if (bits >= 8) {
 216                        *cp++ = ac & 0xff;
 217                        ac >>= 8;
 218                        bits -= 8;
 219                }
 220                i++;
 221        }
 222        if (ac)
 223                return -1;
 224        return cp - dst;
 225}
 226
 227u32 fscrypt_fname_encrypted_size(struct inode *inode, u32 ilen)
 228{
 229        int padding = 32;
 230        struct fscrypt_info *ci = inode->i_crypt_info;
 231
 232        if (ci)
 233                padding = 4 << (ci->ci_flags & FS_POLICY_FLAGS_PAD_MASK);
 234        if (ilen < FS_CRYPTO_BLOCK_SIZE)
 235                ilen = FS_CRYPTO_BLOCK_SIZE;
 236        return size_round_up(ilen, padding);
 237}
 238EXPORT_SYMBOL(fscrypt_fname_encrypted_size);
 239
 240/**
 241 * fscrypt_fname_crypto_alloc_obuff() -
 242 *
 243 * Allocates an output buffer that is sufficient for the crypto operation
 244 * specified by the context and the direction.
 245 */
 246int fscrypt_fname_alloc_buffer(struct inode *inode,
 247                                u32 ilen, struct fscrypt_str *crypto_str)
 248{
 249        unsigned int olen = fscrypt_fname_encrypted_size(inode, ilen);
 250
 251        crypto_str->len = olen;
 252        if (olen < FS_FNAME_CRYPTO_DIGEST_SIZE * 2)
 253                olen = FS_FNAME_CRYPTO_DIGEST_SIZE * 2;
 254        /*
 255         * Allocated buffer can hold one more character to null-terminate the
 256         * string
 257         */
 258        crypto_str->name = kmalloc(olen + 1, GFP_NOFS);
 259        if (!(crypto_str->name))
 260                return -ENOMEM;
 261        return 0;
 262}
 263EXPORT_SYMBOL(fscrypt_fname_alloc_buffer);
 264
 265/**
 266 * fscrypt_fname_crypto_free_buffer() -
 267 *
 268 * Frees the buffer allocated for crypto operation.
 269 */
 270void fscrypt_fname_free_buffer(struct fscrypt_str *crypto_str)
 271{
 272        if (!crypto_str)
 273                return;
 274        kfree(crypto_str->name);
 275        crypto_str->name = NULL;
 276}
 277EXPORT_SYMBOL(fscrypt_fname_free_buffer);
 278
 279/**
 280 * fscrypt_fname_disk_to_usr() - converts a filename from disk space to user
 281 * space
 282 */
 283int fscrypt_fname_disk_to_usr(struct inode *inode,
 284                        u32 hash, u32 minor_hash,
 285                        const struct fscrypt_str *iname,
 286                        struct fscrypt_str *oname)
 287{
 288        const struct qstr qname = FSTR_TO_QSTR(iname);
 289        char buf[24];
 290        int ret;
 291
 292        if (fscrypt_is_dot_dotdot(&qname)) {
 293                oname->name[0] = '.';
 294                oname->name[iname->len - 1] = '.';
 295                oname->len = iname->len;
 296                return oname->len;
 297        }
 298
 299        if (iname->len < FS_CRYPTO_BLOCK_SIZE)
 300                return -EUCLEAN;
 301
 302        if (inode->i_crypt_info)
 303                return fname_decrypt(inode, iname, oname);
 304
 305        if (iname->len <= FS_FNAME_CRYPTO_DIGEST_SIZE) {
 306                ret = digest_encode(iname->name, iname->len, oname->name);
 307                oname->len = ret;
 308                return ret;
 309        }
 310        if (hash) {
 311                memcpy(buf, &hash, 4);
 312                memcpy(buf + 4, &minor_hash, 4);
 313        } else {
 314                memset(buf, 0, 8);
 315        }
 316        memcpy(buf + 8, iname->name + iname->len - 16, 16);
 317        oname->name[0] = '_';
 318        ret = digest_encode(buf, 24, oname->name + 1);
 319        oname->len = ret + 1;
 320        return ret + 1;
 321}
 322EXPORT_SYMBOL(fscrypt_fname_disk_to_usr);
 323
 324/**
 325 * fscrypt_fname_usr_to_disk() - converts a filename from user space to disk
 326 * space
 327 */
 328int fscrypt_fname_usr_to_disk(struct inode *inode,
 329                        const struct qstr *iname,
 330                        struct fscrypt_str *oname)
 331{
 332        if (fscrypt_is_dot_dotdot(iname)) {
 333                oname->name[0] = '.';
 334                oname->name[iname->len - 1] = '.';
 335                oname->len = iname->len;
 336                return oname->len;
 337        }
 338        if (inode->i_crypt_info)
 339                return fname_encrypt(inode, iname, oname);
 340        /*
 341         * Without a proper key, a user is not allowed to modify the filenames
 342         * in a directory. Consequently, a user space name cannot be mapped to
 343         * a disk-space name
 344         */
 345        return -EACCES;
 346}
 347EXPORT_SYMBOL(fscrypt_fname_usr_to_disk);
 348
 349int fscrypt_setup_filename(struct inode *dir, const struct qstr *iname,
 350                              int lookup, struct fscrypt_name *fname)
 351{
 352        int ret = 0, bigname = 0;
 353
 354        memset(fname, 0, sizeof(struct fscrypt_name));
 355        fname->usr_fname = iname;
 356
 357        if (!dir->i_sb->s_cop->is_encrypted(dir) ||
 358                                fscrypt_is_dot_dotdot(iname)) {
 359                fname->disk_name.name = (unsigned char *)iname->name;
 360                fname->disk_name.len = iname->len;
 361                return 0;
 362        }
 363        ret = get_crypt_info(dir);
 364        if (ret && ret != -EOPNOTSUPP)
 365                return ret;
 366
 367        if (dir->i_crypt_info) {
 368                ret = fscrypt_fname_alloc_buffer(dir, iname->len,
 369                                                        &fname->crypto_buf);
 370                if (ret < 0)
 371                        return ret;
 372                ret = fname_encrypt(dir, iname, &fname->crypto_buf);
 373                if (ret < 0)
 374                        goto errout;
 375                fname->disk_name.name = fname->crypto_buf.name;
 376                fname->disk_name.len = fname->crypto_buf.len;
 377                return 0;
 378        }
 379        if (!lookup)
 380                return -EACCES;
 381
 382        /*
 383         * We don't have the key and we are doing a lookup; decode the
 384         * user-supplied name
 385         */
 386        if (iname->name[0] == '_')
 387                bigname = 1;
 388        if ((bigname && (iname->len != 33)) || (!bigname && (iname->len > 43)))
 389                return -ENOENT;
 390
 391        fname->crypto_buf.name = kmalloc(32, GFP_KERNEL);
 392        if (fname->crypto_buf.name == NULL)
 393                return -ENOMEM;
 394
 395        ret = digest_decode(iname->name + bigname, iname->len - bigname,
 396                                fname->crypto_buf.name);
 397        if (ret < 0) {
 398                ret = -ENOENT;
 399                goto errout;
 400        }
 401        fname->crypto_buf.len = ret;
 402        if (bigname) {
 403                memcpy(&fname->hash, fname->crypto_buf.name, 4);
 404                memcpy(&fname->minor_hash, fname->crypto_buf.name + 4, 4);
 405        } else {
 406                fname->disk_name.name = fname->crypto_buf.name;
 407                fname->disk_name.len = fname->crypto_buf.len;
 408        }
 409        return 0;
 410
 411errout:
 412        fscrypt_fname_free_buffer(&fname->crypto_buf);
 413        return ret;
 414}
 415EXPORT_SYMBOL(fscrypt_setup_filename);
 416
 417void fscrypt_free_filename(struct fscrypt_name *fname)
 418{
 419        kfree(fname->crypto_buf.name);
 420        fname->crypto_buf.name = NULL;
 421        fname->usr_fname = NULL;
 422        fname->disk_name.name = NULL;
 423}
 424EXPORT_SYMBOL(fscrypt_free_filename);
 425