Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: torvalds/linux
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: master
Choose a base ref
...
head repository: l1k/linux
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: doe
Choose a head ref
Checking mergeability… Don’t worry, you can still create the pull request.
  • 13 commits
  • 46 files changed
  • 2 contributors

Commits on Dec 22, 2025

  1. X.509: Make certificate parser public

    The upcoming support for PCI device authentication with CMA-SPDM
    (PCIe r6.1 sec 6.31) requires validating the Subject Alternative Name
    in X.509 certificates.
    
    High-level functions for X.509 parsing such as key_create_or_update()
    throw away the internal, low-level struct x509_certificate after
    extracting the struct public_key and public_key_signature from it.
    The Subject Alternative Name is thus inaccessible when using those
    functions.
    
    Afford CMA-SPDM access to the Subject Alternative Name by making struct
    x509_certificate public, together with the functions for parsing an
    X.509 certificate into such a struct and freeing such a struct.
    
    The private header file x509_parser.h previously included <linux/time.h>
    for the definition of time64_t.  That definition was since moved to
    <linux/time64.h> by commit 361a3bf ("time64: Add time64.h header
    and define struct timespec64"), so adjust the #include directive as part
    of the move to the new public header file <keys/x509-parser.h>.
    
    No functional change intended.
    
    Signed-off-by: Lukas Wunner <[email protected]>
    Reviewed-by: Dan Williams <[email protected]>
    Reviewed-by: Alistair Francis <[email protected]>
    Reviewed-by: Ilpo Järvinen <[email protected]>
    Reviewed-by: Jonathan Cameron <[email protected]>
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    64b5f6e View commit details
    Browse the repository at this point in the history
  2. X.509: Parse Subject Alternative Name in certificates

    The upcoming support for PCI device authentication with CMA-SPDM
    (PCIe r6.1 sec 6.31) requires validating the Subject Alternative Name
    in X.509 certificates.
    
    Store a pointer to the Subject Alternative Name upon parsing for
    consumption by CMA-SPDM.
    
    Signed-off-by: Lukas Wunner <[email protected]>
    Reviewed-by: Wilfred Mallawa <[email protected]>
    Reviewed-by: Alistair Francis <[email protected]>
    Reviewed-by: Ilpo Järvinen <[email protected]>
    Reviewed-by: Jonathan Cameron <[email protected]>
    Acked-by: Dan Williams <[email protected]>
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    4f39575 View commit details
    Browse the repository at this point in the history
  3. X.509: Move certificate length retrieval into new helper

    The upcoming in-kernel SPDM library (Security Protocol and Data Model,
    https://www.dmtf.org/dsp/DSP0274) needs to retrieve the length from
    ASN.1 DER-encoded X.509 certificates.
    
    Such code already exists in x509_load_certificate_list(), so move it
    into a new helper for reuse by SPDM.
    
    Export the helper so that SPDM can be tristate.  (Some upcoming users of
    the SPDM library may be modular, such as SCSI and ATA.)
    
    No functional change intended.
    
    Signed-off-by: Lukas Wunner <[email protected]>
    Reviewed-by: Dan Williams <[email protected]>
    Reviewed-by: Alistair Francis <[email protected]>
    Reviewed-by: Jonathan Cameron <[email protected]>
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    e93c123 View commit details
    Browse the repository at this point in the history
  4. certs: Create blacklist keyring earlier

    The upcoming support for PCI device authentication with CMA-SPDM
    (PCIe r6.2 sec 6.31) requires parsing X.509 certificates upon
    device enumeration, which happens in a subsys_initcall().
    
    Parsing X.509 certificates accesses the blacklist keyring:
    x509_cert_parse()
      x509_get_sig_params()
        is_hash_blacklisted()
          keyring_search()
    
    So far the keyring is created much later in a device_initcall().  Avoid
    a NULL pointer dereference on access to the keyring by creating it one
    initcall level earlier than PCI device enumeration, i.e. in an
    arch_initcall().
    
    Signed-off-by: Lukas Wunner <[email protected]>
    Reviewed-by: Dan Williams <[email protected]>
    Reviewed-by: Wilfred Mallawa <[email protected]>
    Reviewed-by: Alistair Francis <[email protected]>
    Reviewed-by: Ilpo Järvinen <[email protected]>
    Reviewed-by: Jonathan Cameron <[email protected]>
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    6b08f7c View commit details
    Browse the repository at this point in the history
  5. crypto: Allow use of ECDSA, RSA, SHA2, SHA3 in subsys_initcall

    Commit ef93f15 ("Revert "crypto: run initcalls for generic
    implementations earlier"") downgraded generic ECDSA, RSA, SHA2
    to a device_initcall when built into the kernel proper.
    
    Commit 0d474be ("crypto: sha3-generic - Use API partial block
    handling") did the same for generic SHA3.
    
    To be able to authenticate PCI devices upon enumeration, move them back
    to subsys_initcall level (which is when PCI device enumeration happens).
    
    Signed-off-by: Lukas Wunner <[email protected]>
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    bf1aa3d View commit details
    Browse the repository at this point in the history
  6. spdm: Introduce library to authenticate devices

    The Security Protocol and Data Model (SPDM) allows for device
    authentication, measurement, key exchange and encrypted sessions.
    
    SPDM was conceived by the Distributed Management Task Force (DMTF).
    Its specification defines a request/response protocol spoken between
    host and attached devices over a variety of transports:
    
      https://www.dmtf.org/dsp/DSP0274
    
    This implementation supports SPDM 1.0 through 1.3 (the latest version).
    It is designed to be transport-agnostic as the kernel already supports
    four different SPDM-capable transports:
    
    * PCIe Data Object Exchange, which is a mailbox in PCI config space
      (PCIe r6.2 sec 6.30, drivers/pci/doe.c)
    * Management Component Transport Protocol
      (MCTP, Documentation/networking/mctp.rst)
    * TCP/IP (in draft stage)
      https://www.dmtf.org/sites/default/files/standards/documents/DSP0287_1.0.0WIP99.pdf
    * SCSI and ATA (in draft stage)
      "SECURITY PROTOCOL IN/OUT" and "TRUSTED SEND/RECEIVE" commands
    
    Use cases for SPDM include, but are not limited to:
    
    * PCIe Component Measurement and Authentication (PCIe r6.2 sec 6.31)
    * Compute Express Link (CXL r3.0 sec 14.11.6)
    * Open Compute Project (Attestation of System Components v1.0)
      https://www.opencompute.org/documents/attestation-v1-0-20201104-pdf
    * Open Compute Project (Datacenter NVMe SSD Specification v2.0)
      https://www.opencompute.org/documents/datacenter-nvme-ssd-specification-v2-0r21-pdf
    
    The initial focus of this implementation is enabling PCIe CMA device
    authentication.  As such, only a subset of the SPDM specification is
    contained herein, namely the request/response sequence GET_VERSION,
    GET_CAPABILITIES, NEGOTIATE_ALGORITHMS, GET_DIGESTS, GET_CERTIFICATE
    and CHALLENGE.
    
    This sequence first negotiates the SPDM protocol version, capabilities
    and algorithms with the device.  It then retrieves the up to eight
    certificate chains which may be provisioned on the device.  Finally it
    performs challenge-response authentication with the device using one of
    those eight certificate chains and the algorithms negotiated before.
    The challenge-response authentication comprises computing a hash over
    all exchanged messages to detect modification by a man-in-the-middle
    or media error.  The hash is then signed with the device's private key
    and the resulting signature is verified by the kernel using the device's
    public key from the certificate chain.  Nonces are included in the
    message sequence to protect against replay attacks.
    
    A simple API is provided for subsystems wishing to authenticate devices:
    spdm_create(), spdm_authenticate() (can be called repeatedly for
    reauthentication) and spdm_destroy().  Certificates presented by devices
    are validated against an in-kernel keyring of trusted root certificates.
    A pointer to the keyring is passed to spdm_create().
    
    The set of supported cryptographic algorithms is limited to those
    declared mandatory in PCIe r6.2 sec 6.31.3.  Adding more algorithms
    is straightforward as long as the crypto subsystem supports them.
    
    Future commits will extend this implementation with support for
    measurement, key exchange and encrypted sessions.
    
    So far, only the SPDM requester role is implemented.  Care was taken to
    allow for effortless addition of the responder role at a later stage.
    This could be needed for a PCIe host bridge operating in endpoint mode.
    The responder role will be able to reuse struct definitions and helpers
    such as spdm_create_combined_prefix().
    
    Credits:  Jonathan wrote a proof-of-concept of this SPDM implementation.
    Lukas reworked it for upstream.
    
    Signed-off-by: Jonathan Cameron <[email protected]>
    Co-developed-by: Lukas Wunner <[email protected]>
    Signed-off-by: Lukas Wunner <[email protected]>
    jic23 authored and l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    bca645e View commit details
    Browse the repository at this point in the history
  7. PCI/CMA: Authenticate devices on enumeration

    Component Measurement and Authentication (CMA, PCIe r6.2 sec 6.31)
    allows for measurement and authentication of PCIe devices.  It is
    based on the Security Protocol and Data Model specification (SPDM,
    https://www.dmtf.org/dsp/DSP0274).
    
    CMA-SPDM in turn forms the basis for Integrity and Data Encryption
    (IDE, PCIe r6.2 sec 6.33) because the key material used by IDE is
    transmitted over a CMA-SPDM session.
    
    As a first step, authenticate CMA-capable devices on enumeration.
    A subsequent commit will expose the result in sysfs.
    
    When allocating SPDM session state with spdm_create(), the maximum SPDM
    message length needs to be passed.  Make the PCI_DOE_MAX_LENGTH macro
    public and calculate the maximum payload length from it.
    
    Credits:  Jonathan wrote a proof-of-concept of this CMA implementation.
    Lukas reworked it for upstream.  Wilfred contributed fixes for issues
    discovered during testing.
    
    Signed-off-by: Jonathan Cameron <[email protected]>
    Co-developed-by: Wilfred Mallawa <[email protected]>
    Signed-off-by: Wilfred Mallawa <[email protected]>
    Co-developed-by: Lukas Wunner <[email protected]>
    Signed-off-by: Lukas Wunner <[email protected]>
    jic23 authored and l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    f8343c6 View commit details
    Browse the repository at this point in the history
  8. PCI/CMA: Validate Subject Alternative Name in certificates

    PCIe r6.1 sec 6.31.3 stipulates requirements for Leaf Certificates
    presented by devices, in particular the presence of a Subject Alternative
    Name which encodes the Vendor ID, Device ID, Device Serial Number, etc.
    
    This prevents a mismatch between the device identity in Config Space and
    the certificate.  A device cannot misappropriate a certificate from a
    different device without also spoofing Config Space.  As a corollary,
    it cannot dupe an arbitrary driver into binding to it.  Only drivers
    which bind to the device identity in the Subject Alternative Name work
    (PCIe r6.1 sec 6.31 "Implementation Note: Overview of Threat Model").
    
    The Subject Alternative Name is signed, hence constitutes a signed copy
    of a Config Space portion.  It's the same concept as web certificates
    which contain a set of domain names in the Subject Alternative Name for
    identity verification.
    
    Parse the Subject Alternative Name using a small ASN.1 module and
    validate its contents.  The theory of operation is explained in a
    comment at the top of the newly inserted code.
    
    This functionality is introduced in a separate commit on top of basic
    CMA-SPDM support to split the code into digestible, reviewable chunks.
    
    The CMA OID added here is taken from the official OID Repository
    (it's not documented in the PCIe Base Spec):
    https://oid-rep.orange-labs.fr/get/2.23.147
    
    Side notes:
    
    * PCIe r6.2 removes the spec language on the Subject Alternative Name.
      It still "requires the leaf certificate to include the information
      typically used by system software for device driver binding", but no
      longer specifies how that information is encoded into the certificate.
    
      According to the editor of the PCIe Base Spec and the author of the
      CMA 1.1 ECN (which caused this change), FPGA cards which mutate their
      device identity at runtime (due to a firmware update) were thought as
      unable to satisfy the previous spec language.  The Protocol Working
      Group could not agree on a better solution and therefore dropped the
      spec language entirely.  They acknowledge that the requirement is now
      under-spec'd.  Because products already exist which adhere to the
      Subject Alternative Name requirement per PCIe r6.1 sec 6.31.3, they
      recommended to "push through" and use it as the de facto standard.
    
      The FPGA concerns are easily overcome by reauthenticating the device
      after a firmware update, either via sysfs or pci_cma_reauthenticate()
      (added by a subsequent commit).
    
    * PCIe r6.1 sec 6.31.3 strongly recommends to verify that "the
      information provided in the Subject Alternative Name entry is signed
      by the vendor indicated by the Vendor ID."  In other words, the root
      certificate on pci_cma_keyring which signs the device's certificate
      chain must have been created for a particular Vendor ID.
    
      Unfortunately the spec neglects to define how the Vendor ID shall be
      encoded into the root certificate.  So the recommendation cannot be
      implemented at this point and it is thus possible that a vendor signs
      device certificates of a different vendor.
    
    * Instead of a Subject Alternative Name, Leaf Certificates may include
      "a Reference Integrity Manifest, e.g., see Trusted Computing Group" or
      "a pointer to a location where such a Reference Integrity Manifest can
      be obtained" (PCIe r6.1 sec 6.31.3).
    
      A Reference Integrity Manifest contains "golden" measurements which
      can be compared to actual measurements retrieved from a device.
      It serves a different purpose than the Subject Alternative Name,
      hence it is unclear why the spec says only either of them is necessary.
      It is also unclear how a Reference Integrity Manifest shall be encoded
      into a certificate.
    
      Hence ignore the Reference Integrity Manifest requirement.
    
    Signed-off-by: Lukas Wunner <[email protected]>
    Reviewed-by: Jonathan Cameron <[email protected]> # except ASN.1
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    d58b920 View commit details
    Browse the repository at this point in the history
  9. PCI/CMA: Reauthenticate devices on reset and resume

    CMA-SPDM state is lost when a device undergoes a Conventional Reset.
    (But not a Function Level Reset, PCIe r6.2 sec 6.6.2.)  A D3cold to D0
    transition implies a Conventional Reset (PCIe r6.2 sec 5.8).
    
    Thus, reauthenticate devices on resume from D3cold and on recovery from
    a Secondary Bus Reset or DPC-induced Hot Reset.
    
    The requirement to reauthenticate devices on resume from system sleep
    (and in the future reestablish IDE encryption) is the reason why SPDM
    needs to be in-kernel:  During ->resume_noirq, which is the first phase
    after system sleep, the PCI core walks down the hierarchy, puts each
    device in D0, restores its config space and invokes the driver's
    ->resume_noirq callback.  The driver is afforded the right to access the
    device already during this phase.
    
    To retain this usage model in the face of authentication and encryption,
    CMA-SPDM reauthentication and IDE reestablishment must happen during the
    ->resume_noirq phase, before the driver's first access to the device.
    The driver is thus afforded seamless authenticated and encrypted access
    until the last moment before suspend and from the first moment after
    resume.
    
    During the ->resume_noirq phase, device interrupts are not yet enabled.
    It is thus impossible to defer CMA-SPDM reauthentication to a user space
    component on an attached disk or on the network, making an in-kernel
    SPDM implementation mandatory.
    
    The same catch-22 exists on recovery from a Conventional Reset:  A user
    space SPDM implementation might live on a device which underwent reset,
    rendering its execution impossible.
    
    Signed-off-by: Lukas Wunner <[email protected]>
    Reviewed-by: Alistair Francis <[email protected]>
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    55d6714 View commit details
    Browse the repository at this point in the history
  10. PCI/CMA: Expose in sysfs whether devices are authenticated

    The PCI core has just been amended to authenticate CMA-capable devices
    on enumeration and store the result in an "authenticated" bit in struct
    pci_dev->spdm_state.
    
    Expose the bit to user space through an eponymous sysfs attribute.
    
    Allow user space to trigger reauthentication (e.g. after it has updated
    the CMA keyring) by writing to the sysfs attribute.
    
    Implement the attribute in the SPDM library so that other bus types
    besides PCI may take advantage of it.  They just need to add
    spdm_attr_group to the attribute groups of their devices and amend the
    dev_to_spdm_state() helper which retrieves the spdm_state for a given
    device.
    
    The helper may return an ERR_PTR if it couldn't be determined whether
    SPDM is supported by the device.  The sysfs attribute is visible in that
    case but returns an error on access.  This prevents downgrade attacks
    where an attacker disturbs memory allocation or DOE communication
    in order to create the appearance that SPDM is unsupported.
    
    Subject to further discussion, a future commit might add a user-defined
    policy to forbid driver binding to devices which failed authentication,
    similar to the "authorized" attribute for USB.
    
    Alternatively, authentication success might be signaled to user space
    through a uevent, whereupon it may bind a (blacklisted) driver.
    A uevent signaling authentication failure might similarly cause user
    space to unbind or outright remove the potentially malicious device.
    
    Traffic from devices which failed authentication could also be filtered
    through ACS I/O Request Blocking Enable (PCIe r6.2 sec 7.7.11.3) or
    through Link Disable (PCIe r6.2 sec 7.5.3.7).  Unlike an IOMMU, that
    will not only protect the host, but also prevent malicious peer-to-peer
    traffic to other devices.
    
    Signed-off-by: Lukas Wunner <[email protected]>
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    5a5f50e View commit details
    Browse the repository at this point in the history
  11. PCI/CMA: Expose certificates in sysfs

    The kernel already caches certificate chains retrieved from a device
    upon authentication.  Expose them in "slot[0-7]" files in sysfs for
    examination by user space.
    
    As noted in the ABI documentation, the "slot[0-7]" files always have a
    file size of 65535 bytes (the maximum size of a certificate chain per
    SPDM 1.0.0 table 18), even if the certificate chain in the slot is
    actually smaller.  Although it would be possible to use the certifiate
    chain's actual size as the file size, doing so would require a separate
    struct attribute_group for each device, which would occupy additional
    memory.
    
    Slots are visible in sysfs even if they're currently unprovisioned
    because a future commit will add support for certificate provisioning
    by writing to the "slot[0-7]" files.
    
    Signed-off-by: Lukas Wunner <[email protected]>
    l1k committed Dec 22, 2025
    Configuration menu
    Copy the full SHA
    a49c445 View commit details
    Browse the repository at this point in the history

Commits on Jan 11, 2026

  1. netlink: Introduce nla_put_blob() to add zero-copy blob attribute to skb

    The in-kernel SPDM library (Security Protocol and Data Model) for device
    authentication is about to introduce multicasting of received signatures
    via Netlink.  This enables remote attestation services to verify the
    signatures and apply custom policies.
    
    The netlink transmission needs to include a blob, the SPDM transcript.
    It can be several megabytes in size, exceeding the maximum linear data
    of a socket buffer and causing performance overhead when copied to the
    linear data.
    
    Overcome both limitations by introducing nla_put_blob(), a helper which
    attaches the pages occupied by the SPDM transcript as fragments to the
    socket buffer.  Details are in the kernel-doc.
    
    Amend nlmsg_end() to take these fragments into account when computing
    the total netlink message length.
    
    Signed-off-by: Lukas Wunner <[email protected]>
    l1k committed Jan 11, 2026
    Configuration menu
    Copy the full SHA
    af9b939 View commit details
    Browse the repository at this point in the history
  2. spdm: Multicast received signatures via netlink

    WIP
    
    When authenticating a device with CMA-SPDM, the kernel verifies the
    challenge-response received from the device, but otherwise keeps it to
    itself.
    
    James Bottomley contends that's not good enough because user space or a
    remote attestation service may want to re-verify the challenge-response:
    Either because it mistrusts the kernel or because the kernel is unaware
    of policy constraints that user space or the remote attestation service
    want to apply.
    
    Facilitate such use cases by exposing a log in sysfs which consists of
    several files for each challenge-response event.  The files are prefixed
    with a monotonically increasing number, starting at 0:
    
    /sys/devices/.../signatures/0_signature
    /sys/devices/.../signatures/0_transcript
    /sys/devices/.../signatures/0_requester_nonce
    /sys/devices/.../signatures/0_responder_nonce
    /sys/devices/.../signatures/0_hash_algorithm
    /sys/devices/.../signatures/0_combined_spdm_prefix
    /sys/devices/.../signatures/0_certificate_chain
    /sys/devices/.../signatures/0_type
    
    The 0_signature is computed over the 0_transcript (a concatenation of
    all SPDM messages exchanged with the device).
    
    To verify the signature, 0_transcript is hashed with 0_hash_algorithm
    (e.g. "sha384") and prefixed by 0_combined_spdm_prefix.
    
    The public key to verify the signature against is the leaf certificate
    contained in 0_certificate_chain.
    
    The nonces chosen by requester and responder are exposed as separate
    attributes to ease verification of their freshness.  They're already
    contained in the transcript but their offsets within the transcript are
    variable, so user space would otherwise have to parse the SPDM messages
    in the transcript to find the nonces.
    
    The type attribute contains the event type:  Currently it is always
    "responder-challenge_auth signing".  In the future it may also contain
    "responder-measurements signing".
    
    This custom log format was chosen for lack of a better alternative.
    Although the TCG PFP Specification defines DEVICE_SECURITY_EVENT_DATA
    structures, those structures do not store the transcript (which can be
    a few kBytes or up to several MBytes in size).  They do store nonces,
    hence at least allow for verification of nonce freshness.  But without
    the transcript, user space cannot verify the signature:
    
    https://trustedcomputinggroup.org/resource/pc-client-specific-platform-firmware-profile-specification/
    
    Exposing the transcript as an attribute of its own has the benefit that
    it can directly be fed into a protocol dissector for debugging purposes
    (think Wireshark).
    
    Signed-off-by: Lukas Wunner <[email protected]>
    Cc: James Bottomley <[email protected]>
    Cc: Jérôme Glisse <[email protected]>
    Cc: Jason Gunthorpe <[email protected]>
    l1k committed Jan 11, 2026
    Configuration menu
    Copy the full SHA
    009663b View commit details
    Browse the repository at this point in the history
Loading