13 Jan, 2012

1 commit


17 Nov, 2011

1 commit


16 Nov, 2011

9 commits


25 Oct, 2011

1 commit

  • * 'next' of git://selinuxproject.org/~jmorris/linux-security: (95 commits)
    TOMOYO: Fix incomplete read after seek.
    Smack: allow to access /smack/access as normal user
    TOMOYO: Fix unused kernel config option.
    Smack: fix: invalid length set for the result of /smack/access
    Smack: compilation fix
    Smack: fix for /smack/access output, use string instead of byte
    Smack: domain transition protections (v3)
    Smack: Provide information for UDS getsockopt(SO_PEERCRED)
    Smack: Clean up comments
    Smack: Repair processing of fcntl
    Smack: Rule list lookup performance
    Smack: check permissions from user space (v2)
    TOMOYO: Fix quota and garbage collector.
    TOMOYO: Remove redundant tasklist_lock.
    TOMOYO: Fix domain transition failure warning.
    TOMOYO: Remove tomoyo_policy_memory_lock spinlock.
    TOMOYO: Simplify garbage collector.
    TOMOYO: Fix make namespacecheck warnings.
    target: check hex2bin result
    encrypted-keys: check hex2bin result
    ...

    Linus Torvalds
     

23 Sep, 2011

4 commits

  • Since the buffer might contain security related data it might be a good idea to
    zero the buffer after we have copied it to userspace.

    This got assigned CVE-2011-1162.

    Signed-off-by: Rajiv Andrade
    Cc: Stable Kernel
    Signed-off-by: James Morris

    Peter Huewe
     
  • This patch changes the call of tpm_transmit by supplying the size of the
    userspace buffer instead of TPM_BUFSIZE.

    This got assigned CVE-2011-1161.

    [The first hunk didn't make sense given one could expect
    way less data than TPM_BUFSIZE, so added tpm_transmit boundary
    check over bufsiz instead
    The last parameter of tpm_transmit() reflects the amount
    of data expected from the device, and not the buffer size
    being supplied to it. It isn't ideal to parse it directly,
    so we just set it to the maximum the input buffer can handle
    and let the userspace API to do such job.]

    Signed-off-by: Rajiv Andrade
    Cc: Stable Kernel
    Signed-off-by: James Morris

    Peter Huewe
     
  • platform_device_unregister() will release all resources
    and remove it from the subsystem, then drop reference count by
    calling platform_device_put().

    We should not call kfree(pdev) after platform_device_unregister(pdev).

    Signed-off-by: Axel Lin
    Signed-off-by: Rajiv Andrade
    Signed-off-by: James Morris

    Axel Lin
     
  • On m68k, I get:

    drivers/char/tpm/tpm_atmel.h: In function ‘atmel_get_base_addr’:
    drivers/char/tpm/tpm_atmel.h:129: error: implicit declaration of function ‘ioport_map’
    drivers/char/tpm/tpm_atmel.h:129: warning: return makes pointer from integer without a cast

    The code in tpm_atmel.h supports PPC64 (using the device tree and ioremap())
    and "anything else" (using ioport_map()). However, ioportmap() is only
    available on platforms that set HAS_IOPORT.

    Although PC64 seems to have HAS_IOPORT, a "depends on HAS_IOPORT" should work,
    but I think it's better to expose the special PPC64 handling explicit using
    "depends on PPC64 || HAS_IOPORT".

    Signed-off-by: Geert Uytterhoeven
    Signed-off-by: Rajiv Andrade
    Signed-off-by: James Morris

    Geert Uytterhoeven
     

24 Aug, 2011

1 commit


04 Aug, 2011

1 commit

  • Fix tpm_tis.c build when CONFIG_ACPI is not enabled by providing a stub
    function. Fixes many build errors/warnings:

    drivers/char/tpm/tpm_tis.c:89: error: dereferencing pointer to incomplete type
    drivers/char/tpm/tpm_tis.c:89: warning: type defaults to 'int' in declaration of 'type name'
    drivers/char/tpm/tpm_tis.c:89: error: request for member 'list' in something not a structure or union
    ...

    Signed-off-by: Randy Dunlap
    Cc: Leendert van Doorn
    Cc: James Morris
    Cc: Ingo Molnar
    Cc: Stephen Rothwell
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Randy Dunlap
     

26 Jul, 2011

1 commit


22 Jul, 2011

1 commit


21 Jul, 2011

1 commit

  • The is_itpm() function is only accessed from a block surrounded by
    #ifdef CONFIG_PNP. Therefore, also surround it with #ifdef CONFIG_PNP
    and remove the #else branch causing the warning.

    http://lxr.linux.no/#linux+v2.6.39/drivers/char/tpm/tpm_tis.c#L622

    v2:
    - fixes a previous typo

    Signed-off-by: Stefan Berger
    Reported-by: Randy Dunlap
    Signed-off-by: James Morris

    Stefan Berger
     

13 Jul, 2011

12 commits

  • This patch fixes a typo.

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • This patch introduces a function for automatic probing for the Intel iTPM
    STS_DATA_EXPECT flaw.

    The patch splits the current tpm_tis_send function into 2 parts where the 1st
    part is now called tpm_tis_send_data() and merely sends the data to the TPM.
    This function is then used for probing. The new tpm_tis_send function now
    first calls tpm_tis_send_data and if that succeeds has the TPM process the
    command and waits until the response is there.

    The probing for the Intel iTPM is only invoked if the user has not passed
    itpm=1 as parameter for the module *or* if such a TPM was detected via ACPI.
    Previously it was necessary to pass itpm=1 when also passing force=1 to the
    module when doing a 'modprobe'. This function is more general than the ACPI
    test function and the function relying on ACPI could probably be removed.

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • This patch fixes several aspects of the probing for interrupts.

    This patch reads the TPM's timeouts before probing for the interrupts. The
    tpm_get_timeouts() function is invoked in polling mode and gets the proper
    timeouts from the TPM so that we don't need to fall back to 2 minutes timeouts
    for short duration commands while the interrupt probing is happening.

    This patch introduces a variable probed_irq into the vendor structure that gets
    the irq number if an interrupt is received while the the tpm_gen_interrupt()
    function is run in polling mode during interrupt probing. Previously some
    parts of tpm_gen_interrupt() were run in polling mode, then the irq variable
    was set in the interrupt handler when an interrupt was received and execution
    of tpm_gen_interrupt() ended up switching over to interrupt mode.
    tpm_gen_interrupt() execution ended up on an event queue where it eventually
    timed out since the probing handler doesn't wake any queues.

    Before calling into free_irq() clear all interrupt flags that may have
    been set by the TPM. The reason is that free_irq() will call into the probing
    interrupt handler and may otherwise fool us into thinking that a real interrupt
    happened (because we see the flags as being set) while the TPM's interrupt line
    is not even connected to anything on the motherboard. This solves a problem
    on one machine I did testing on (Thinkpad T60).

    If a TPM claims to use a specifc interrupt, the probing is done as well
    to verify that the interrupt is actually working. If a TPM indicates
    that it does not use a specific interrupt (returns '0'), probe all interrupts
    from 3 to 15.

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • This patch delays the (ACPI S3) suspend while the TPM is busy processing a
    command and the TPM TIS driver is run in interrupt mode. This is the same
    behavior as we already have it for the TPM TIS driver in polling mode.

    Reasoning: Some of the TPM's commands advance the internal state of the TPM.
    An example would be the extending of one of its PCR registers. Upper layers,
    such as IMA or TSS (TrouSerS), would certainly want to be sure that the
    command succeeded rather than getting an error code (-62 = -ETIME) that may
    not give a conclusive answer as for what reason the command failed. Reissuing
    such a command would put the TPM into the wrong state, so waiting for it to
    finish is really the only option.

    The downside is that some commands (key creation) can take a long time and
    actually prevent the machine from entering S3 at all before the 20 second
    timeout of the power management subsystem arrives.

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • This patch makes sure that if the TPM TIS interface is run in interrupt mode
    (rather than polling mode) that all interrupts are enabled in the TPM's
    interrupt enable register after a resume from ACPI S3 suspend. The registers
    may either have been cleared by the TPM loosing its state during device sleep
    or by the BIOS leaving the TPM in polling mode (after sending a command to
    the TPM for starting it up again)

    You may want to check if your TPM runs with interrupts by doing

    cat /proc/interrupts | grep -i tpm

    and see whether there is an entry or otherwise for it to use interrupts:

    modprobe tpm_tis interrupts=1 [add 'itpm=1' for Intel TPM ]

    v2:
    - the patch was adapted to work with the pnp and platform driver
    implementations in tpm_tis.c

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • This patch fixes the TPM's pubek sysfs entry that is accessible as long
    as the TPM doesn't have an owner. It was necessary to shift the access to the
    data by -10 -- the first byte immediately follows the 10 byte header. The
    line

    data = tpm_cmd.params.readpubek_out_buffer;

    sets it at the offset '10' in the packet, so we can read the data array
    starting at offset '0'.

    Before:

    Algorithm: 00 0C 00 00
    Encscheme: 08 00
    Sigscheme: 00 00
    Parameters: 00 00 00 00 01 00 AC E2 5E 3C A0 78
    Modulus length: -563306801
    Modulus:
    28 21 08 0F 82 CD F2 B1 E7 49 F7 74 70 BE 59 8C
    43 78 B1 24 EA 52 E2 FE 52 5C 3A 12 3B DC 61 71
    [...]

    After:

    Algorithm: 00 00 00 01
    Encscheme: 00 03
    Sigscheme: 00 01
    Parameters: 00 00 08 00 00 00 00 02 00 00 00 00
    Modulus length: 256
    Modulus:
    AC E2 5E 3C A0 78 DE 6C 9E CF 28 21 08 0F 82 CD
    F2 B1 E7 49 F7 74 70 BE 59 8C 43 78 B1 24 EA 52
    [...]

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • Display the TPM's interface timeouts in a 'timeouts' sysfs entry. Display
    the entries as having been adjusted when they were scaled due to their values
    being reported in milliseconds rather than microseconds.

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • Adjust the interface timeouts if they are found to be too small, i.e., if
    they are returned in milliseconds rather than microseconds as we heared
    from Infineon that some (old) Infineon TPMs do.

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • The TPM driver currently discards the interface timeout values returned
    from the TPM. The check of the response packet needs to consider that
    the return_code field is 0 on success and the size of the expected
    packet is equivalent to the header size + u32 length indicator for the
    TPM_GetCapability() result + 4 interface timeout indicators of type u32.

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • Display the TPM's command timeouts in a 'durations' sysfs entry. Display
    the entries as having been adjusted when they were scaled due to their values
    being reported in milliseconds rather than microseconds.

    Signed-off-by: Stefan Berger
    Tested-by: Guillaume Chazarain
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • Adjust the durations if they are found to be too small, i.e., if they are
    returned in milliseconds rather than microseconds as some Infineon TPMs are
    reported to do.

    Signed-off-by: Stefan Berger
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     
  • The TPM driver currently discards the durations values returned
    from the TPM. The check of the response packet needs to consider that
    the return_code field is 0 on success and the size of the expected
    packet is equivalent to the header size + u32 length indicator for the
    TPM_GetCapability() result + 3 timeout indicators of type u32.

    v4:
    - sysfs entry 'durations' is now a patch of its own
    - the work-around for TPMs reporting durations in milliseconds is now in a
    patch of its own

    v3:
    - sysfs entry now called 'durations' to resemble TPM-speak (previously
    was called 'timeouts')

    v2:
    - adjusting all timeouts for TPM devices reporting timeouts in msec rather
    than usec
    - also displaying in sysfs whether the timeouts are 'original' or 'adjusted'

    Signed-off-by: Stefan Berger
    Tested-by: Guillaume Chazarain
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     

30 Mar, 2011

1 commit

  • This patch fixes information leakage to the userspace by initializing
    the data buffer to zero.

    Reported-by: Peter Huewe
    Signed-off-by: Peter Huewe
    Signed-off-by: Marcel Selhorst
    [ Also removed the silly "* sizeof(u8)". If that isn't 1, we have way
    deeper problems than a simple multiplication can fix. - Linus ]
    Signed-off-by: Linus Torvalds

    Peter Huewe
     

02 Mar, 2011

1 commit

  • This reverts commit c4ff4b829ef9e6353c0b133b7adb564a68054979.

    Ted Ts'o reports:

    "TPM is working for me so I can log into employer's network in 2.6.37.
    It broke when I tried 2.6.38-rc6, with the following relevant lines
    from my dmesg:

    [ 11.081627] tpm_tis 00:0b: 1.2 TPM (device-id 0x0, rev-id 78)
    [ 25.734114] tpm_tis 00:0b: Operation Timed out
    [ 78.040949] tpm_tis 00:0b: Operation Timed out

    This caused me to get suspicious, especially since the _other_ TPM
    commit in 2.6.38 had already been reverted, so I tried reverting
    commit c4ff4b829e: "TPM: Long default timeout fix". With this commit
    reverted, my TPM on my Lenovo T410 is once again working."

    Requested-and-tested-by: Theodore Ts'o
    Acked-by: Rajiv Andrade
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

21 Feb, 2011

1 commit

  • This reverts commit 9b29050f8f75916f974a2d231ae5d3cd59792296.

    It has caused hibernate regressions, for example Juri Sladby's report:

    "I'm unable to hibernate 2.6.37.1 unless I rmmod tpm_tis:
    [10974.074587] Suspending console(s) (use no_console_suspend to debug)
    [10974.103073] tpm_tis 00:0c: Operation Timed out
    [10974.103089] legacy_suspend(): pnp_bus_suspend+0x0/0xa0 returns -62
    [10974.103095] PM: Device 00:0c failed to freeze: error -62"

    and Rafael points out that some of the new conditionals in that commit
    seem to make no sense. This commit needs more work and testing, let's
    revert it for now.

    Reported-by: Norbert Preining
    Reported-and-requested-by: Jiri Slaby
    Cc: Stefan Berger
    Cc: Guillaume Chazarain
    Cc: Rajiv Andrade
    Acked-by: Rafael J. Wysocki
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

11 Feb, 2011

1 commit

  • The current TPM TIS driver in git discards the timeout values returned
    from the TPM. The check of the response packet needs to consider that
    the return_code field is 0 on success and the size of the expected
    packet is equivalent to the header size + u32 length indicator for the
    TPM_GetCapability() result + 3 timeout indicators of type u32.

    I am also adding a sysfs entry 'timeouts' showing the timeouts that are
    being used.

    Signed-off-by: Stefan Berger
    Tested-by: Guillaume Chazarain
    Signed-off-by: Rajiv Andrade

    Stefan Berger
     

24 Jan, 2011

2 commits

  • commit 3f0d3d016d89a5efb8b926d4707eb21fa13f3d27 adds a check for
    PNP device id to the common tpm_tis_init() function, which in some
    cases (force=1) will be called without the device being a member of
    a pnp_dev. Oopsing and panics ensue.

    Move the test up to before the call to tpm_tis_init(), since it
    just modifies a global variable anyway.

    Signed-off-by: Olof Johansson
    Acked-by: Rajiv Andrade
    Signed-off-by: James Morris

    Olof Johansson
     
  • If duration variable value is 0 at this point, it's because
    chip->vendor.duration wasn't filled by tpm_get_timeouts() yet.
    This patch sets then the lowest timeout just to give enough
    time for tpm_get_timeouts() to further succeed.

    This fix avoids long boot times in case another entity attempts
    to send commands to the TPM when the TPM isn't accessible.

    Signed-off-by: Rajiv Andrade
    Signed-off-by: James Morris

    Rajiv Andrade
     

10 Jan, 2011

1 commit