Document new versioning scheme and bump mainline to v5.0.0#3212
Document new versioning scheme and bump mainline to v5.0.0#3212samuel40791765 wants to merge 6 commits into
Conversation
### Issues: Resolves P425126007 ### Description of changes: AWS-LC does not currently document its versioning scheme or release types for external consumers. This change adds `VERSIONING.md` at the repo root describing the AWS-LC version number scheme, the FIPS version number, the distinction between rolling mainline and LTS releases, the LTS release policy, non-LTS FIPS branches, branch naming conventions, and deprecation timelines for legacy FIPS branches. Also bumps mainline from v1.72.1 to v5.0.0 to reflect that the 4.x line now belongs to the first LTS branch (`fips-2025-09-12-lts`) under the new versioning scheme. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license and the ISC license.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #3212 +/- ##
==========================================
- Coverage 78.30% 78.15% -0.16%
==========================================
Files 689 689
Lines 123310 123334 +24
Branches 17150 17173 +23
==========================================
- Hits 96564 96387 -177
- Misses 25835 26035 +200
- Partials 911 912 +1 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Co-authored-by: Doug Chapman <dougch@amazon.com>
|
|
||
| Rolling mainline is periodically submitted for FIPS 140-3 validation, though changes may land between submissions. LTS branches are fixed FIPS submissions; they are not modified after they are cut, except for the backports permitted by the [LTS release policy](#lts-release-policy). The FIPS version number a given build corresponds to is tracked independently of the AWS-LC version number (see [FIPS version number](#fips-version-number)). | ||
|
|
||
| AWS-LC is committed to providing a stable public API across both release types. LTS releases additionally guarantee ABI stability for the duration of the support window. |
There was a problem hiding this comment.
- Should we point consumers to our
AWSLC_API_VERSIONmacro orABI_VERSIONas better indicators of compatibility breaking changes than the version number? Should this policy also cover our use of these values? (ShouldABI_VERSIONbe exposed in our header files as well?) - I think we should state explicitly that our versioning is NOT SemVer:
Mainline does not follow SemVer with respect to major-version bumps; ABI may
change between minor releases on mainline. Consumers requiring ABI stability
should pin to an LTS branch.
There was a problem hiding this comment.
Applied most wording updates.
Good point on ABI_VERSION. Although, I'm slightly unsure on how we've committed to updating this and exposing would require better knowledge of how we're planning to document and maintain the API.
|
|
||
| ## Non-LTS FIPS branches | ||
|
|
||
| FIPS validation requires a fixed snapshot of the cryptographic module's source code. Each time AWS-LC is submitted for FIPS validation, a branch is cut from mainline that preserves the exact code submitted. Most of these branches are not designated as LTS. |
There was a problem hiding this comment.
The "Most of these branches are not designated as LTS" introduces some ambiguity. Instead, should we clarify that a branch is marked "LTS", or not, at time of creation -- a branch is never "promoted"?
An LTS branch is always cut fresh from mainline at the time of designation;
existing non-LTS branches are never promoted to LTS.
| ### Permitted changes on LTS branches | ||
|
|
||
| The following are permitted on LTS branches: | ||
|
|
||
| * Security fixes for CVEs and critical vulnerabilities. These may alter the FIPS module integrity hash when necessary. | ||
| * Bug fixes that do not alter public API behavior, ABI compatibility, or the FIPS module integrity hash. | ||
| * Platform compatibility fixes for supported operating environments that do not alter the FIPS module integrity hash. | ||
| * Additive changes that preserve existing function signatures. |
There was a problem hiding this comment.
It seems to be implied, but could be made explicit. I think the intent is:
- Feature Additive (signature-preserving) changes --> minor bump
- Security / Bug / Platform (possibly not signature-preserving) fixes --> patch bump
There was a problem hiding this comment.
Restructured the above a bit to reflect that clearly
|
|
||
| Non-LTS FIPS branches exist solely to preserve the validated snapshot. They do not receive release tags, and consumers should not depend on them. | ||
|
|
||
| We may apply critical security fixes to a non-LTS FIPS branch while it is the most recently NIST-certified FIPS branch. This is a maintenance concession, not a supported consumption model. Once a newer FIPS branch receives certification, the previous non-LTS branch is frozen and receives no further updates. |
There was a problem hiding this comment.
I think we could spell this out even more:
We may apply critical security fixes to a non-LTS FIPS branch only while
it is in review and until it is the most recently NIST-certified FIPS branch.
This is a maintenance concession; these branches are NOT supported for
consumption. Once a newer FIPS branch (whether LTS or non-LTS) receives NIST
certification, the previous non-LTS branch is frozen and will receive no
further updates.
|
|
||
| We may apply critical security fixes to a non-LTS FIPS branch while it is the most recently NIST-certified FIPS branch. This is a maintenance concession, not a supported consumption model. Once a newer FIPS branch receives certification, the previous non-LTS branch is frozen and receives no further updates. | ||
|
|
||
| A non-LTS FIPS branch inherits its version from mainline at cut time and only ever issues patch-level increments (e.g., a branch cut at `5.6.0` becomes `5.6.1` after a security fix). Because mainline only produces minor increments (`5.6.0` → `5.7.0`), patch versions on a non-LTS branch cannot collide with mainline. |
There was a problem hiding this comment.
We could add another sentence at the end of this paragraph:
Note that at the branch point, both mainline and the non-LTS branch share the
same AWS-LC version string; they are distinguished by `FIPS_version()` and
`AWSLC_FIPS_VERSION_NUMBER`.
There was a problem hiding this comment.
I reworded it slightly, but added a sentence that should reflect what we're looking for here.
|
|
||
| Rolling mainline is periodically submitted for FIPS 140-3 validation, though changes may land between submissions. LTS branches are fixed FIPS submissions; they are not modified after they are cut, except for the backports permitted by the [LTS release policy](#lts-release-policy). The FIPS version number a given build corresponds to is tracked independently of the AWS-LC version number (see [FIPS version number](#fips-version-number)). | ||
|
|
||
| AWS-LC is committed to providing a stable public API across both release types. LTS releases additionally guarantee ABI stability for the duration of the support window. |
There was a problem hiding this comment.
NP: I don't know that we could do anything about it -- but what if CVE fix fundamentally requires us to change a function signature or add a field to a stack-allocatable struct? We'd be force to choose between patching the CVE or not breaking ABI?
¯\_(ツ)_/¯
There was a problem hiding this comment.
Great point, I had briefly thought about this and there were mentions that there were possible workarounds around this. In most cases, the LTS branch can ship a custom patch that fixes the same security issue while preserving ABI compatibility (even when mainline's version doesn't) by using a more minimal patch, side state, or wrapper variant rather than restructuring existing types.
Of course, there could be edge cases where none of those approaches fit and we'd be forced into the trade-off scenario you described. If it comes to that, we could treat them as one-offs and decide on the appropriate approach based on the specific circumstance.
| * **Rolling mainline releases** are the primary release for most consumers. Rolling mainline receives the latest features, performance improvements, and security fixes as they are developed. | ||
| * **Long-term support (LTS) releases** are intended for consumers that require a stable ABI over a multi-year support window. | ||
|
|
||
| Rolling mainline is periodically submitted for FIPS 140-3 validation, though changes may land between submissions. LTS branches are fixed FIPS submissions; they are not modified after they are cut, except for the backports permitted by the [LTS release policy](#lts-release-policy). The FIPS version number a given build corresponds to is tracked independently of the AWS-LC version number (see [FIPS version number](#fips-version-number)). |
There was a problem hiding this comment.
NP: Should there be an API or Macro (or both) to indicate at build or runtime whether this version of AWS-LC is an LTS?
Of course, at build or runtime a consumer can compare AWSLC_FIPS_VERSION_NUMBER with AWSLC_VERSION_NUMBER_STRING -- if they align, then we're on an LTS. Should we call this out? Or provide a function that does this?
There was a problem hiding this comment.
Should there be an API or Macro (or both) to indicate at build or runtime whether this version of AWS-LC is an LTS?
I think an LTS designation API may be worth doing if the need arises. Happy to take up explicit LTS detection in a separate PR if we want it.
I do want to call out that It would have to be its own value that's set and returned however. The comparison only works today because LTS-1 was coincidentally cut at major 4 with FIPS submission 4. As non-LTS submissions accumulate, the heuristic breaks down:
| Event | Mainline (major / FIPS) | LTS-1 (major / FIPS) | LTS-2 (major / FIPS) |
|---|---|---|---|
| Today | 5 / 4 |
4 / 4 |
— |
| Non-LTS #5 cut | 5 / 5 |
4 / 4 |
— |
| Non-LTS #6 cut | 5 / 6 |
4 / 4 |
— |
| Non-LTS #7 cut | 5 / 7 |
4 / 4 |
— |
| LTS-2 cut at FIPS 8 | 6 / 8 |
4 / 4 |
5 / 8 |
When the second LTS is cut, its major (5) and FIPS submission (8) don't align, so the comparison would break.
ebd4dca to
1b7f622
Compare
Issues:
Resolves P425126007
Description of changes:
AWS-LC does not currently document its versioning scheme or release
types for external consumers. This change adds
VERSIONING.mdat therepo root describing the AWS-LC version number scheme, the FIPS version
number, the distinction between rolling mainline and LTS releases, the
LTS release policy, non-LTS FIPS branches, branch naming conventions,
and deprecation timelines for legacy FIPS branches.
Also bumps mainline from v1.72.1 to v5.0.0 to reflect that the 4.x line
now belongs to the first LTS branch (
fips-2025-09-12-lts) under thenew versioning scheme.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license and the ISC license.