Skip to content

[fips-9-compliant] Rebase Custom changes to 5.14.0-570.23.1.el9_6 #383

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversation

PlaidCat
Copy link
Collaborator

@PlaidCat PlaidCat commented Jun 30, 2025

Update process (This kernel CentOS base for 5.14.0-570)

  • Kernel History Rebuild Process for all src.rpms hosted by RESF
  • Create fips-9-compliant/5.14.0-570.X.1.el8_10 branch
  • Check if any maintained code is included in the new el release.
  • Cherry-pick all code from previous branch into new branch (skipping unneeded code)
    • Fix conflicts as they arise
  • Build and Test

Removed Commits

None

Forward Port Process

[rolling release update] 0 of 48 commits have FIPS protected changes

[rolling release update] Rolling Product:  fips-9-compliant
[rolling release update] Checking out branch:  fips-9-compliant/5.14.0-570.18.1.el9_6
[rolling release update] Gathering all the RESF kernel Tags
b'e8b954c95fef (tag: resf_kernel-5.14.0-570.18.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.18.1.el9_6'
b'838cd1e8d046 (tag: resf_kernel-5.14.0-570.17.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.17.1.el9_6'
b'171ceb527773 (tag: resf_kernel-5.14.0-570.16.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.16.1.el9_6'
b'18c0812a6563 (tag: resf_kernel-5.14.0-570.12.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.12.1.el9_6'
[rolling release update] Old Rolling Branch Tags:  [b'e8b954c95fef', b'838cd1e8d046', b'171ceb527773', b'18c0812a6563']
[rolling release update] Checking out branch:  rocky9_6
[rolling release update] Gathering all the RESF kernel Tags
b'08b6475feb07 (tag: resf_kernel-5.14.0-570.23.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.23.1.el9_6'
b'667004a38548 (tag: resf_kernel-5.14.0-570.22.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.22.1.el9_6'
b'9477e3364951 (tag: resf_kernel-5.14.0-570.21.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.21.1.el9_6'
b'b94108159618 (tag: resf_kernel-5.14.0-570.19.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.19.1.el9_6'
b'e8b954c95fef (tag: resf_kernel-5.14.0-570.18.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.18.1.el9_6'
b'838cd1e8d046 (tag: resf_kernel-5.14.0-570.17.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.17.1.el9_6'
b'171ceb527773 (tag: resf_kernel-5.14.0-570.16.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.16.1.el9_6'
b'18c0812a6563 (tag: resf_kernel-5.14.0-570.12.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.12.1.el9_6'
[rolling release update] New Base Branch Tags:  [b'08b6475feb07', b'667004a38548', b'9477e3364951', b'b94108159618', b'e8b954c95fef', b'838cd1e8d046', b'171ceb527773', b'18c0812a6563']
[rolling release update] Common tag sha:  b'e8b954c95fef'
"e8b954c95fef772d9bfbbb6c0145611183115814 Rebuild rocky9_6 with kernel-5.14.0-570.18.1.el9_6"
[rolling release update] Checking for FIPS protected changes between the common tag and HEAD
[rolling release update] Checking for FIPS protected changes
[rolling release update] Getting SHAS e8b954c95fef..HEAD
[rolling release update] Number of commits to check:  48
[rolling release update] Checking modifications of shas
[rolling release update] Checked 4 of 48 commits
[rolling release update] Checked 8 of 48 commits
[rolling release update] Checked 12 of 48 commits
[rolling release update] Checked 16 of 48 commits
[rolling release update] Checked 20 of 48 commits
[rolling release update] Checked 24 of 48 commits
[rolling release update] Checked 28 of 48 commits
[rolling release update] Checked 32 of 48 commits
[rolling release update] Checked 36 of 48 commits
[rolling release update] Checked 40 of 48 commits
[rolling release update] Checked 44 of 48 commits
[rolling release update] Checked 48 of 48 commits
[rolling release update] 0 of 48 commits have FIPS protected changes
[rolling release update] Checking out old rolling branch:  fips-9-compliant/5.14.0-570.18.1.el9_6
[rolling release update] Finding the CIQ Kernel and Associated Upstream commits between the last resf tag and HEAD
[rolling release update] Getting SHAS e8b954c95fef..HEAD
[rolling release update] Last RESF tag sha:  b'e8b954c95fef'
[rolling release update] Total Commit in old branch:  11
{ "CIQ COMMMIT" : "UPSTREAM COMMMIT" }
Printing first 5 and last 5 commits
{
  "472f62838d37445fafe0c52c2d281f651ab47cfb": "",
  "e190816174388bb3929e414cc6016f6355bf7c84": "",
  "59ab06296d19aa5c5e6d35d7972fc1812a7f851b": "",
  "e1a3205341eebadb2b3d4e9265baad7bd263f921": "",
  "3741ac23099231e04a9339f4c03a085a24e33c58": ""
}
{
  "3e889ae90182834fa950528fec7535fa7a6e8c0b": "",
  "e91deff7338a6a108ca4031ac37ed02c48a16341": "",
  "9e1a6417474a6b2da704ffdf1cec4c7f8771d644": "",
  "34f7ad230faa864a5dba411d5db39fde1916614d": "",
  "689b16e7814f1bdc906b3311811743dfe427452b": ""
}
[rolling release update] Checking out new base branch:  rocky9_6
[rolling release update] Finding the kernel version for the new rolling release
b'08b6475feb07 (tag: resf_kernel-5.14.0-570.23.1.el9_6) Rebuild rocky9_6 with kernel-5.14.0-570.23.1.el9_6'
<re.Match object; span=(0, 52), match=b'08b6475feb07 (tag: resf_kernel-5.14.0-570.23.1.e>
[rolling release update} New Branch to create  fips-9-compliant/5.14.0-570.23.1.el9_6
[rolling release update] Check if branch Exists:  fips-9-compliant/5.14.0-570.23.1.el9_6
Branch fips-9-compliant/5.14.0-570.23.1.el9_6 does not exists creating
[rolling release update] Creating new branch for PR:  jmaple_fips-9-compliant/5.14.0-570.23.1.el9_6
[rolling release update] Creating Map of all new commits from last rolling release fork
[rolling release update] Total Commit in new branch:  47
{ "CIQ COMMMIT" : "UPSTREAM COMMMIT" }
Printing first 5 and last 5 commits
{
  "96794508804e8d69a557061700908bb1781d7ab7": "",
  "08b6475feb0710ce784c7dda662b85e110bea9d9": "",
  "51f11651aa4b4f242ad2a5154d2f4820c4af1aa6": "c8e008b60492cf6fd31ef127aea6d02fd3d314cd",
  "bc42ef3f898169e29a1abacdc2835fda8e24a4a5": "d93a6caab5d7d9b5ce034d75b1e1e993338e3852",
  "0848fd624f825eaa66f272f9b277a9c21facae41": "5c07be96d8b3f8447e980f29b967bf2e1d7ac732"
}
{
  "cb324233337ed1454783cc1cf4d4cb702144f30a": "482ad2a4ace2740ca0ff1cbc8f3c7f862f3ab507",
  "719f037b2266d6a707b00dccc98c4370d7586e0e": "ee62ce7a1d909ccba0399680a03c2dee83bcae95",
  "7fdffbb885965391b28c20e782ef1c7a250f0e1d": "cd3c93167da0e760b5819246eae7a4ea30fd014b",
  "9dec56d590f6f7b229ff4195a7dc1acd0a0c0d20": "1f6bc02f18489b9c9ea39b068d0695fb0e4567e9",
  "49cf2d4734b6b029973c94fb17799ec775b32b82": "6636c58b946c9cbfbd68a453d4eba2ef4585c65c"
}
[rolling release update] Checking if any of the commits from the old rolling release are already present in the new base branch
[rolling release update] Removing commits from the new branch
[rolling release update] Applying the remaining commits to the new branch
Applying commit  "689b16e7814f1bdc906b3311811743dfe427452b crypto: jitter - replace LFSR with SHA3-256"
Applying commit  "34f7ad230faa864a5dba411d5db39fde1916614d crypto: aead,cipher - zeroize key buffer after use"
Applying commit  "9e1a6417474a6b2da704ffdf1cec4c7f8771d644 SUSE: patch: crypto-ecdh-implement-FIPS-PCT.patch"
Applying commit  "e91deff7338a6a108ca4031ac37ed02c48a16341 crypto: ecdh - explicitly zeroize private_key"
Applying commit  "3e889ae90182834fa950528fec7535fa7a6e8c0b crypto: lib/mpi - Fix unexpected pointer access in mpi_ec_init"
Applying commit  "3c8c29a92afa400495f65b999d3d17367c45d805 In essiv_aead_setkey(), use the same logic as crypto_authenc_esn_setkey() to zeroize keys on exit. converting ws"
Applying commit  "3741ac23099231e04a9339f4c03a085a24e33c58 crypto: drbg - Align buffers to at least a cache line"
Applying commit  "e1a3205341eebadb2b3d4e9265baad7bd263f921 mm/gup: introduce pin_user_pages_fast_only()"
Applying commit  "59ab06296d19aa5c5e6d35d7972fc1812a7f851b crypto: rng - Convert crypto_default_rng_refcnt into an unsigned int"
Applying commit  "e190816174388bb3929e414cc6016f6355bf7c84 crypto: rng - Fix priority inversions due to mutex locks"
Applying commit  "472f62838d37445fafe0c52c2d281f651ab47cfb crypto: rng - Implement fast per-CPU DRBG instances"

KBuild

[jmaple@devbox code]$ egrep -B 5 -A 5 "\[TIMER\]|^Starting Build" kbuild.resf_kernel-5.14.0-570.23.1.el9_6.log
  CLEAN   scripts/mod
  CLEAN   scripts/selinux/genheaders
  CLEAN   scripts/selinux/mdp
  CLEAN   scripts
  CLEAN   include/config include/generated arch/x86/include/generated .config .config.old .version Module.symvers certs/signing_key.pem certs/signing_key.x509 certs/x509.genkey
[TIMER]{MRPROPER}: 9s
x86_64 architecture detected, copying config
'configs/kernel-x86_64-rhel.config' -> '.config'
Setting Local Version for build
CONFIG_LOCALVERSION="-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828"
Making olddefconfig
--
  HOSTCC  scripts/kconfig/util.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
Starting Build
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_32.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_64.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_x32.h
  SYSTBL  arch/x86/include/generated/asm/syscalls_32.h
  SYSHDR  arch/x86/include/generated/asm/unistd_32_ia32.h
--
  BTF [M] sound/usb/usx2y/snd-usb-usx2y.ko
  BTF [M] sound/virtio/virtio_snd.ko
  BTF [M] sound/x86/snd-hdmi-lpe-audio.ko
  LD [M]  sound/xen/snd_xen_front.ko
  BTF [M] sound/xen/snd_xen_front.ko
[TIMER]{BUILD}: 1957s
Making Modules
  INSTALL /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+/kernel/arch/x86/crypto/blake2s-x86_64.ko
  INSTALL /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+/kernel/arch/x86/crypto/blowfish-x86_64.ko
  INSTALL /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+/kernel/arch/x86/crypto/camellia-aesni-avx-x86_64.ko
  INSTALL /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+/kernel/arch/x86/crypto/camellia-aesni-avx2.ko
--
  SIGN    /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+/kernel/sound/usb/usx2y/snd-usb-usx2y.ko
  SIGN    /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+/kernel/sound/virtio/virtio_snd.ko
  SIGN    /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+/kernel/sound/xen/snd_xen_front.ko
  SIGN    /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+/kernel/sound/x86/snd-hdmi-lpe-audio.ko
  DEPMOD  /lib/modules/5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+
[TIMER]{MODULES}: 13s
Making Install
sh ./arch/x86/boot/install.sh 5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+ \
	arch/x86/boot/bzImage System.map "/boot"
[TIMER]{INSTALL}: 23s
Checking kABI
Checking kABI
kABI check passed
Setting Default Kernel to /boot/vmlinuz-5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+ and Index to 2
Hopefully Grub2.0 took everything ... rebooting after time metrices
[TIMER]{MRPROPER}: 9s
[TIMER]{BUILD}: 1957s
[TIMER]{MODULES}: 13s
[TIMER]{INSTALL}: 23s
[TIMER]{TOTAL} 2008s
Rebooting in 10 seconds

KselfTest

This is the first time I'm running this so comparing it against the Sig Cloud Results

[jmaple@devbox code]$ ls kselftest.5.14.0-jmaple_sig-cloud-9_5.14.0-570.23.1.el9_6-ac92a001c7aa+.log kselftest.5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+.log | while read line; do echo $line; grep '^ok ' $line | wc -l; done
kselftest.5.14.0-jmaple_fips-9-compliant_5.14.0-570.2-51923823e828+.log
317
kselftest.5.14.0-jmaple_sig-cloud-9_5.14.0-570.23.1.el9_6-ac92a001c7aa+.log
317

jallisonciq and others added 11 commits June 30, 2025 12:38
        Using the kernel crypto API, the SHA3-256 algorithm is used as
        conditioning element to replace the LFSR in the Jitter RNG. All other
        parts of the Jitter RNG are unchanged.

        The application and use of the SHA-3 conditioning operation is identical
        to the user space Jitter RNG 3.4.0 by applying the following concept:

        - the Jitter RNG initializes a SHA-3 state which acts as the "entropy
          pool" when the Jitter RNG is allocated.

        - When a new time delta is obtained, it is inserted into the "entropy
          pool" with a SHA-3 update operation. Note, this operation in most of
          the cases is a simple memcpy() onto the SHA-3 stack.

        - To cause a true SHA-3 operation for each time delta operation, a
          second SHA-3 operation is performed hashing Jitter RNG status
          information. The final message digest is also inserted into the
          "entropy pool" with a SHA-3 update operation. Yet, this data is not
          considered to provide any entropy, but it shall stir the entropy pool.

        - To generate a random number, a SHA-3 final operation is performed to
          calculate a message digest followed by an immediate SHA-3 init to
          re-initialize the "entropy pool". The obtained message digest is one
          block of the Jitter RNG that is returned to the caller.

        Mathematically speaking, the random number generated by the Jitter RNG
        is:

        aux_t = SHA-3(Jitter RNG state data)

        Jitter RNG block = SHA-3(time_i || aux_i || time_(i-1) || aux_(i-1) ||
                                 ... || time_(i-255) || aux_(i-255))

        when assuming that the OSR = 1, i.e. the default value.

        This operation implies that the Jitter RNG has an output-blocksize of
        256 bits instead of the 64 bits of the LFSR-based Jitter RNG that is
        replaced with this patch.

        The patch also replaces the varying number of invocations of the
        conditioning function with one fixed number of invocations. The use
        of the conditioning function consistent with the userspace Jitter RNG
        library version 3.4.0.

        The code is tested with a system that exhibited the least amount of
        entropy generated by the Jitter RNG: the SiFive Unmatched RISC-V
        system. The measured entropy rate is well above the heuristically
        implied entropy value of 1 bit of entropy per time delta. On all other
        tested systems, the measured entropy rate is even higher by orders
        of magnitude. The measurement was performed using updated tooling
        provided with the user space Jitter RNG library test framework.

        The performance of the Jitter RNG with this patch is about en par
        with the performance of the Jitter RNG without the patch.

        Signed-off-by: Stephan Mueller <[email protected]>
        Signed-off-by: Herbert Xu <[email protected]>

            Back-port of commit bb897c5
            Author: Stephan Müller <[email protected]>
            Date:   Fri Apr 21 08:08:04 2023 +0200

Signed-off-by: Jeremy Allison <[email protected]>
Signed-off-by: Jonathan Maple <[email protected]>
    I.G 9.7.B for FIPS 140-3 specifies that variables temporarily holding
    cryptographic information should be zeroized once they are no longer
    needed. Accomplish this by using kfree_sensitive for buffers that
    previously held the private key.

    Signed-off-by: Hailey Mothershead <[email protected]>
    Signed-off-by: Herbert Xu <[email protected]>

        Back-ported from commit 23e4099
        Author: Hailey Mothershead <[email protected]>
        Date:   Mon Apr 15 22:19:15 2024 +0000

Signed-off-by: Jeremy Allison <[email protected]>
Signed-off-by: Jonathan Maple <[email protected]>
Signed-off-by: Jeremy Allison <[email protected]>
Signed-off-by: Jonathan Maple <[email protected]>
private_key is overwritten with the key parameter passed in by the
caller (if present), or alternatively a newly generated private key.
However, it is possible that the caller provides a key (or the newly
generated key) which is shorter than the previous key. In that
scenario, some key material from the previous key would not be
overwritten. The easiest solution is to explicitly zeroize the entire
private_key array first.

Note that this patch slightly changes the behavior of this function:
previously, if the ecc_gen_privkey failed, the old private_key would
remain. Now, the private_key is always zeroized. This behavior is
consistent with the case where params.key is set and ecc_is_key_valid
fails.

Signed-off-by: Joachim Vandersmissen <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
Signed-off-by: Jonathan Maple <[email protected]>
[ Upstream commit ba3c557 ]

When the mpi_ec_ctx structure is initialized, some fields are not
cleared, causing a crash when referencing the field when the
structure was released. Initially, this issue was ignored because
memory for mpi_ec_ctx is allocated with the __GFP_ZERO flag.
For example, this error will be triggered when calculating the
Za value for SM2 separately.

Fixes: d58bb7e ("lib/mpi: Introduce ec implementation to MPI library")
Cc: [email protected] # v6.5
Signed-off-by: Tianjia Zhang <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
Signed-off-by: Jonathan Maple <[email protected]>
…ey() to zeroize keys on exit.

converting ws

Signed-off-by: Jonathan Maple <[email protected]>
None of the ciphers used by the DRBG have an alignment requirement; thus,
they all return 0 from .crypto_init, resulting in inconsistent alignment
across all buffers.

Align all buffers to at least a cache line to improve performance. This is
especially useful when multiple DRBG instances are used, since it prevents
false sharing of cache lines between the different instances.

Signed-off-by: Sultan Alsawaf <[email protected]>

Signed-off-by: Jonathan Maple <[email protected]>
Like pin_user_pages_fast(), but with the internal-only FOLL_FAST_ONLY flag.

This complements the get_user_pages*() API, which already has
get_user_pages_fast_only().

Signed-off-by: Sultan Alsawaf <[email protected]>

Signed-off-by: Jonathan Maple <[email protected]>
There is no reason this refcount should be a signed int. Convert it to an
unsigned int, thereby also making it less likely to ever overflow.

Signed-off-by: Sultan Alsawaf <[email protected]>

Signed-off-by: Jonathan Maple <[email protected]>
Since crypto_devrandom_read_iter() is invoked directly by user tasks and is
accessible by every task in the system, there are glaring priority
inversions on crypto_reseed_rng_lock and crypto_default_rng_lock.

Tasks of arbitrary scheduling priority access crypto_devrandom_read_iter().
When a low-priority task owns one of the mutex locks, higher-priority tasks
waiting on that mutex lock are stalled until the low-priority task is done.

Fix the priority inversions by converting the mutex locks into rt_mutex
locks which have PI support.

Signed-off-by: Sultan Alsawaf <[email protected]>

Signed-off-by: Jonathan Maple <[email protected]>
When the kernel is booted with fips=1, the RNG exposed to userspace is
hijacked away from the CRNG and redirects to crypto_devrandom_read_iter(),
which utilizes the DRBG.

Notably, crypto_devrandom_read_iter() maintains just two global DRBG
instances _for the entire system_, and the two instances serve separate
request types: one instance for GRND_RANDOM requests (crypto_reseed_rng),
and one instance for non-GRND_RANDOM requests (crypto_default_rng). So in
essence, for requests of a single type, there is just one global RNG for
all CPUs in the entire system, which scales _very_ poorly.

To make matters worse, the temporary buffer used to ferry data between the
DRBG and userspace is woefully small at only 256 bytes, which doesn't do a
good job of maximizing throughput from the DRBG. This results in lost
performance when userspace requests >256 bytes; it is observed that DRBG
throughput improves by 70% on an i9-13900H when the buffer size is
increased to 4096 bytes (one page). Going beyond the size of one page up to
the DRBG maximum request limit of 65536 bytes produces diminishing returns
of only 3% improved throughput in comparison. And going below the size of
one page produces progressively less throughput at each power of 2: there's
a 5% loss going from 4096 bytes to 2048 bytes and a 9% loss going from 2048
bytes to 1024 bytes.

Thus, this implements per-CPU DRBG instances utilizing a page-sized buffer
for each CPU to utilize the DRBG itself more effectively. On top of that,
for non-GRND_RANDOM requests, the DRBG's operations now occur under a local
lock that disables preemption on non-PREEMPT_RT kernels, which not only
keeps each CPU's DRBG instance isolated from another, but also improves
temporal cache locality while the DRBG actively generates a new string of
random bytes.

Prefaulting one user destination page at a time is also employed to prevent
a DRBG instance from getting blocked on page faults, thereby maximizing the
use of the DRBG so that the only bottleneck is the DRBG itself.

Signed-off-by: Sultan Alsawaf <[email protected]>
Signed-off-by: Jonathan Maple <[email protected]>
Copy link

@thefossguy-ciq thefossguy-ciq left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚤

Copy link
Collaborator

@bmastbergen bmastbergen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🥌

@PlaidCat PlaidCat merged commit 5192382 into fips-9-compliant/5.14.0-570.23.1.el9_6 Jul 2, 2025
4 checks passed
@PlaidCat PlaidCat deleted the jmaple_fips-9-compliant/5.14.0-570.23.1.el9_6 branch July 2, 2025 15:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

8 participants