summaryrefslogtreecommitdiffstats
path: root/fs/attr.c
AgeCommit message (Expand)Author
2017-03-02sched/headers: Prepare for new header dependencies before moving code to <lin...Ingo Molnar
2016-10-10Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vir...Linus Torvalds
2016-10-08Merge remote-tracking branch 'jk/vfs' into work.miscAl Viro
2016-09-27fs: Replace current_fs_time() with current_time()Deepa Dinamani
2016-09-22fs: Avoid premature clearing of capabilitiesJan Kara
2016-09-22fs: Give dentry to inode_change_ok() instead of inodeJan Kara
2016-09-16vfs: move permission checking into notify_change() for utimes(NULL)Miklos Szeredi
2016-07-05vfs: Don't modify inodes with a uid or gid unknown to the vfsEric W. Biederman
2016-06-27fs: Refuse uid/gid changes which don't map into s_user_nsSeth Forshee
2016-01-22wrappers for ->i_mutex accessAl Viro
2014-06-10fs,userns: Change inode_capable to capable_wrt_inode_uidgidAndy Lutomirski
2013-12-05fs: fix iversion handlingChristoph Hellwig
2013-11-09locks: break delegations on any attribute modificationJ. Bruce Fields
2012-11-20userns: Allow chown and setgid preservationEric W. Biederman
2012-09-07ima: add inode_post_setattr callMimi Zohar
2012-07-14notify_change(): check that i_mutex is heldAndrew Morton
2012-05-30vfs: increment iversion when a file is truncatedDmitry Kasatkin
2012-05-03userns: Use uid_eq gid_eq helpers when comparing kuids and kgids in the vfsEric W. Biederman
2012-02-28fs: reduce the use of module.h wherever possiblePaul Gortmaker
2012-01-03switch is_sxid() to umode_tAl Viro
2011-08-09Merge branch 'next-evm' of git://git.kernel.org/pub/scm/linux/kernel/git/zoha...James Morris
2011-07-20fs: move inode_dio_wait calls into ->setattrChristoph Hellwig
2011-07-20fs: kill i_alloc_semChristoph Hellwig
2011-07-18evm: imbed evm_inode_post_setattrMimi Zohar
2011-05-28Cache xattr security drop check for write v2Andi Kleen
2011-03-31Fix common misspellingsLucas De Marchi
2011-03-23userns: rename is_owner_or_cap to inode_owner_or_capableSerge E. Hallyn
2010-08-09check ATTR_SIZE contraints in inode_change_okChristoph Hellwig
2010-08-09remove inode_setattrChristoph Hellwig
2010-08-09default to simple_setattrChristoph Hellwig
2010-08-09rename generic_setattrChristoph Hellwig
2010-05-27fs: introduce new truncate sequencenpiggin@suse.de
2010-03-06fs: use rlimit helpersJiri Slaby
2010-03-05dquot: move dquot transfer responsibility into the filesystemChristoph Hellwig
2009-09-24truncate: new helpersnpiggin@suse.de
2009-03-26vfs: Use lowercase names of quota functionsJan Kara
2008-11-14CRED: Wrap task credential accesses in the filesystem subsystemDavid Howells
2008-10-23[patch] vfs: make security_inode_setattr() calling consistentMiklos Szeredi
2008-07-26[patch 4/4] vfs: immutable inode checking cleanupMiklos Szeredi
2008-07-26[patch 1/4] vfs: utimes: move owner check into inode_change_ok()Miklos Szeredi
2007-10-18VFS: make notify_change pass ATTR_KILL_S*ID to setattr operationsJeff Layton
2007-10-17Implement file posix capabilitiesSerge E. Hallyn
2007-07-17Introduce is_owner_or_cap() to wrap CAP_FOWNER use with fsuid checkSatyam Sharma
2007-05-08header cleaning: don't include smp_lock.h when not usedRandy Dunlap
2006-01-11[PATCH] capable/capability.h (fs/)Randy Dunlap
2006-01-11fs/attr.c: header included twiceNicolas Kaiser
2006-01-08[PATCH] Fix some problems with truncate and mtime semantics.NeilBrown
2005-10-30[PATCH] fs/attr.c: remove BUG()Alexey Dobriyan
2005-07-12[PATCH] inotifyRobert Love
2005-04-16Linux-2.6.12-rc2Linus Torvalds
99'>299 300 301 302 303 304
/* crypto/constant_time_test.c */
/*-
 * Utilities for constant-time cryptography.
 *
 * Author: Emilia Kasper (emilia@openssl.org)
 * Based on previous work by Bodo Moeller, Emilia Kasper, Adam Langley
 * (Google).
 * ====================================================================
 * Copyright (c) 2014 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 *
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#include "../crypto/constant_time_locl.h"

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

static const unsigned int CONSTTIME_TRUE = (unsigned)(~0);
static const unsigned int CONSTTIME_FALSE = 0;
static const unsigned char CONSTTIME_TRUE_8 = 0xff;
static const unsigned char CONSTTIME_FALSE_8 = 0;

static int test_binary_op(unsigned int (*op) (unsigned int a, unsigned int b),
                          const char *op_name, unsigned int a, unsigned int b,
                          int is_true)
{
    unsigned c = op(a, b);
    if (is_true && c != CONSTTIME_TRUE) {
        fprintf(stderr, "Test failed for %s(%du, %du): expected %du "
                "(TRUE), got %du\n", op_name, a, b, CONSTTIME_TRUE, c);
        return 1;
    } else if (!is_true && c != CONSTTIME_FALSE) {
        fprintf(stderr, "Test failed for  %s(%du, %du): expected %du "
                "(FALSE), got %du\n", op_name, a, b, CONSTTIME_FALSE, c);
        return 1;
    }
    return 0;
}

static int test_binary_op_8(unsigned
                            char (*op) (unsigned int a, unsigned int b),
                            const char *op_name, unsigned int a,
                            unsigned int b, int is_true)
{
    unsigned char c = op(a, b);
    if (is_true && c != CONSTTIME_TRUE_8) {
        fprintf(stderr, "Test failed for %s(%du, %du): expected %u "
                "(TRUE), got %u\n", op_name, a, b, CONSTTIME_TRUE_8, c);
        return 1;
    } else if (!is_true && c != CONSTTIME_FALSE_8) {
        fprintf(stderr, "Test failed for  %s(%du, %du): expected %u "
                "(FALSE), got %u\n", op_name, a, b, CONSTTIME_FALSE_8, c);
        return 1;
    }
    return 0;
}

static int test_is_zero(unsigned int a)
{
    unsigned int c = constant_time_is_zero(a);
    if (a == 0 && c != CONSTTIME_TRUE) {
        fprintf(stderr, "Test failed for constant_time_is_zero(%du): "
                "expected %du (TRUE), got %du\n", a, CONSTTIME_TRUE, c);
        return 1;
    } else if (a != 0 && c != CONSTTIME_FALSE) {
        fprintf(stderr, "Test failed for constant_time_is_zero(%du): "
                "expected %du (FALSE), got %du\n", a, CONSTTIME_FALSE, c);
        return 1;
    }
    return 0;
}

static int test_is_zero_8(unsigned int a)
{
    unsigned char c = constant_time_is_zero_8(a);
    if (a == 0 && c != CONSTTIME_TRUE_8) {
        fprintf(stderr, "Test failed for constant_time_is_zero(%du): "
                "expected %u (TRUE), got %u\n", a, CONSTTIME_TRUE_8, c);
        return 1;
    } else if (a != 0 && c != CONSTTIME_FALSE) {
        fprintf(stderr, "Test failed for constant_time_is_zero(%du): "
                "expected %u (FALSE), got %u\n", a, CONSTTIME_FALSE_8, c);
        return 1;
    }
    return 0;
}

static int test_select(unsigned int a, unsigned int b)
{
    unsigned int selected = constant_time_select(CONSTTIME_TRUE, a, b);
    if (selected != a) {
        fprintf(stderr, "Test failed for constant_time_select(%du, %du,"
                "%du): expected %du(first value), got %du\n",
                CONSTTIME_TRUE, a, b, a, selected);
        return 1;
    }
    selected = constant_time_select(CONSTTIME_FALSE, a, b);
    if (selected != b) {
        fprintf(stderr, "Test failed for constant_time_select(%du, %du,"
                "%du): expected %du(second value), got %du\n",
                CONSTTIME_FALSE, a, b, b, selected);
        return 1;
    }
    return 0;
}

static int test_select_8(unsigned char a, unsigned char b)
{
    unsigned char selected = constant_time_select_8(CONSTTIME_TRUE_8, a, b);
    if (selected != a) {
        fprintf(stderr, "Test failed for constant_time_select(%u, %u,"
                "%u): expected %u(first value), got %u\n",
                CONSTTIME_TRUE, a, b, a, selected);
        return 1;
    }
    selected = constant_time_select_8(CONSTTIME_FALSE_8, a, b);
    if (selected != b) {
        fprintf(stderr, "Test failed for constant_time_select(%u, %u,"
                "%u): expected %u(second value), got %u\n",
                CONSTTIME_FALSE, a, b, b, selected);
        return 1;
    }
    return 0;
}

static int test_select_int(int a, int b)
{
    int selected = constant_time_select_int(CONSTTIME_TRUE, a, b);
    if (selected != a) {
        fprintf(stderr, "Test failed for constant_time_select(%du, %d,"
                "%d): expected %d(first value), got %d\n",
                CONSTTIME_TRUE, a, b, a, selected);
        return 1;
    }
    selected = constant_time_select_int(CONSTTIME_FALSE, a, b);
    if (selected != b) {
        fprintf(stderr, "Test failed for constant_time_select(%du, %d,"
                "%d): expected %d(second value), got %d\n",
                CONSTTIME_FALSE, a, b, b, selected);
        return 1;
    }
    return 0;
}

static int test_eq_int(int a, int b)
{
    unsigned int equal = constant_time_eq_int(a, b);
    if (a == b && equal != CONSTTIME_TRUE) {
        fprintf(stderr, "Test failed for constant_time_eq_int(%d, %d): "
                "expected %du(TRUE), got %du\n", a, b, CONSTTIME_TRUE, equal);
        return 1;
    } else if (a != b && equal != CONSTTIME_FALSE) {
        fprintf(stderr, "Test failed for constant_time_eq_int(%d, %d): "
                "expected %du(FALSE), got %du\n",
                a, b, CONSTTIME_FALSE, equal);
        return 1;
    }
    return 0;
}

static int test_eq_int_8(int a, int b)
{
    unsigned char equal = constant_time_eq_int_8(a, b);
    if (a == b && equal != CONSTTIME_TRUE_8) {
        fprintf(stderr, "Test failed for constant_time_eq_int_8(%d, %d): "
                "expected %u(TRUE), got %u\n", a, b, CONSTTIME_TRUE_8, equal);
        return 1;
    } else if (a != b && equal != CONSTTIME_FALSE_8) {
        fprintf(stderr, "Test failed for constant_time_eq_int_8(%d, %d): "
                "expected %u(FALSE), got %u\n",
                a, b, CONSTTIME_FALSE_8, equal);
        return 1;
    }
    return 0;
}

static unsigned int test_values[] =
    { 0, 1, 1024, 12345, 32000, UINT_MAX / 2 - 1,
    UINT_MAX / 2, UINT_MAX / 2 + 1, UINT_MAX - 1,
    UINT_MAX
};

static unsigned