Skip to content

feat: Lay foundation for FIPS support in crypto module - #1535

Merged
gtema merged 3 commits into
mainfrom
crypto
Oct 15, 2026
Merged

gtema merged 3 commits into
mainfrom
crypto

Conversation

@gtema

@gtema gtema commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator
  • feat(storage-crypto): Add FIPS backend feature
  • feat(storage): Add token-generated IV for PKCS#11
  • fix(storage-crypto): Trim deps and document FIPS limits

gtema added 3 commits October 15, 2026 18:26
Route AES-256-GCM, HKDF, HMAC and random generation through a new
backend module. The default stays RustCrypto; the `fips` feature
selects the FIPS 140-3 validated AWS-LC module via aws-lc-rs, and
`assert_fips()` fails unless it is active. The storage crate forwards
the feature.

Make the EnvKek DEK wrap nonce deterministic (truncated HMAC of the
DEK under a KEK-derived sub-key) so no RNG is used, matching ADR
invariant 10. Reword the invariant: deterministic IVs are SP 800-38D
compliant, so the rule is stricter than FIPS, not in conflict with it.
Document the remaining gap: HKDF-derived state/backup nonces are not
the fixed-field/counter construction.

Assisted-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
Add an opt-in `pkcs11_token_generated_iv` setting. When enabled, the
PKCS#11 KEK wraps the DEK through the PKCS#11 3.0 message API with
CKG_GENERATE_RANDOM so the token generates the GCM IV, as FIPS 140-3
HSMs require. The wire format and unwrap path are unchanged. It is off
by default and untested against real hardware (SoftHSM2 lacks the
message API).

Expose `random_bytes` from storage-crypto and use it for the PKCS#11
fallback IV and the snapshot nonce salt so a `fips` build draws from
the validated DRBG. Document why the HKDF-derived state nonce stays: it
must be identical on every node.

Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
Assisted-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Drop the unused typenum dependency and make the RustCrypto crates
optional behind a default `rustcrypto` feature, so
`--no-default-features --features fips` keeps them out of the tree.
Fail the build when neither backend is selected.

Return InvalidKeyLength for a wrong-size key in both backends. Add a
test that unwraps an EnvKek blob with a foreign nonce, locking in
backward compatibility with randomly wrapped blobs.

Document that deterministic GCM IVs are not an approved FIPS service
in the module, so `assert_fips()` proves the module, not each encrypt.
Note the FIPS build prerequisites.

Assisted-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
@gtema
gtema enabled auto-merge October 15, 2026 17:01
Comment thread crates/storage-crypto/src/backend.rs Dismissed
Comment thread crates/storage-crypto/src/kek.rs Dismissed
Comment thread crates/storage-crypto/src/kek.rs Dismissed
@github-actions

Copy link
Copy Markdown

🦢 Load Test Results

Goose Attack Report

Plan Overview

Action Started Stopped Elapsed Users
Increasing 26-10-15 17:15:58 26-10-15 17:16:22 00:00:24 0 → 45
Maintaining 26-10-15 17:16:22 26-10-15 17:16:52 00:00:30 45
Decreasing 26-10-15 17:16:52 26-10-15 17:16:53 00:00:01 0 ← 45

Request Metrics

Method Name # Requests # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
DELETE DELETE /v3/auth/tokens 57 0 396.14 69 503 1.90 0.00
DELETE DELETE /v3/projects/:id (teardown) 1 0 146.00 146 146 0.03 0.00
DELETE DELETE /v3/roles/:id (teardown) 1 0 66.00 66 66 0.03 0.00
DELETE DELETE /v3/users/:id (teardown) 2 0 179.50 110 249 0.07 0.00
DELETE DELETE /v4/mappings/rulesets/:mapping_id (cc teardown) 1 0 11.00 11 11 0.03 0.00
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 1 0 124.00 124 124 0.03 0.00
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (cc teardown) 1 0 11.00 11 11 0.03 0.00
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 1 0 286.00 286 286 0.03 0.00
GET 626 0 466.30 215 708 20.87 0.00
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 49 30 232.16 2 711 1.63 1.00
GET GET /v3/auth/tokens (validate new) 57 0 437.21 242 623 1.90 0.00
GET GET /v3/auth/tokens (validate revoked) 57 0 384.02 41 506 1.90 0.00
GET GET /v3/projects/:id 71 0 430.08 216 580 2.37 0.00
GET GET /v3/projects/:id (catalog) 105 0 421.31 233 573 3.50 0.00
GET GET /v3/role_assignments 55 0 416.16 258 556 1.83 0.00
GET GET /v3/role_assignments?role.id 54 0 417.02 214 549 1.80 0.00
GET GET /v3/role_assignments?scope.domain.id 55 0 403.71 223 545 1.83 0.00
GET GET /v3/role_assignments?user.id 55 0 425.31 237 567 1.83 0.00
GET GET /v3/roles 141 0 429.60 229 600 4.70 0.00
GET GET /v3/roles/:id 71 0 426.99 214 670 2.37 0.00
GET GET /v3/users/:id 135 0 448.44 240 594 4.50 0.00
GET GET /v3/users/:id (catalog) 132 0 449.64 225 641 4.40 0.00
GET GET /v4/api-keys 37 0 410.54 245 542 1.23 0.00
GET GET /v4/api-keys/:client_id 37 0 413.05 225 531 1.23 0.00
GET GET /v4/mappings/rulesets 37 0 402.84 202 601 1.23 0.00
GET GET /v4/mappings/rulesets/:mapping_id 38 0 407.82 259 588 1.27 0.00
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 1880 0 23.70 4 120 62.67 0.00
GET GET /v4/oauth2/:domain_id/clients 37 0 398.57 233 532 1.23 0.00
GET GET /v4/oauth2/:domain_id/clients/:provider_id 37 0 419.86 217 530 1.23 0.00
GET GET /v4/oauth2/:domain_id/jwks 1878 0 23.32 4 103 62.60 0.00
GET GET /v4/scim_realms 24 0 413.50 244 642 0.80 0.00
GET GET /v4/scim_realms/:domain_id/:provider_id 24 0 399.71 290 501 0.80 0.00
POST POST /v3/auth/tokens 54 0 405.26 252 534 1.80 0.00
POST POST /v3/auth/tokens (password, invalid) 44 0 694.36 498 1082 1.47 0.00
POST POST /v3/auth/tokens (password, project-scoped) 69 0 992.48 596 1405 2.30 0.00
POST POST /v3/auth/tokens (password, unscoped) 68 0 805.24 438 1307 2.27 0.00
POST POST /v3/auth/tokens (rescope to system) 126 0 480.79 236 666 4.20 0.00
POST POST /v3/auth/tokens (rescope, invalid project) 74 0 409.01 203 525 2.47 0.00
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 63 0 967.92 434 1479 2.10 0.00
POST POST /v4/api-keys/:client_id/revoke (teardown) 1 0 232.00 232 232 0.03 0.00
POST POST /v4/oauth2/:domain_id/device_authorization 546 0 54.76 17 152 18.20 0.00
POST POST /v4/oauth2/:domain_id/token (client_credentials) 15 0 508.07 304 786 0.50 0.00
PUT PUT /v4/scim_realms/:domain_id/:provider_id 24 0 451.92 257 568 0.80 0.00
Aggregated 6841 30 193.73 2 1479 228.03 1.00

Response Time Metrics

Method Name 50%ile (ms) 60%ile (ms) 70%ile (ms) 80%ile (ms) 90%ile (ms) 95%ile (ms) 99%ile (ms) 100%ile (ms)
DELETE DELETE /v3/auth/tokens 420 430 440 460 470 500 500 500
DELETE DELETE /v3/projects/:id (teardown) 146 146 146 146 146 146 146 146
DELETE DELETE /v3/roles/:id (teardown) 66 66 66 66 66 66 66 66
DELETE DELETE /v3/users/:id (teardown) 110 110 110 249 249 249 249 249
DELETE DELETE /v4/mappings/rulesets/:mapping_id (cc teardown) 11 11 11 11 11 11 11 11
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 124 124 124 124 124 124 124 124
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (cc teardown) 11 11 11 11 11 11 11 11
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 286 286 286 286 286 286 286 286
GET 470 490 500 500 600 600 600 700
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 280 310 350 410 500 600 700 700
GET GET /v3/auth/tokens (validate new) 430 460 460 500 500 600 600 600
GET GET /v3/auth/tokens (validate revoked) 400 420 440 450 480 490 500 500
GET GET /v3/projects/:id 440 450 470 490 500 500 580 580
GET GET /v3/projects/:id (catalog) 420 440 450 470 500 500 573 573
GET GET /v3/role_assignments 420 430 440 460 500 500 556 556
GET GET /v3/role_assignments?role.id 430 440 460 470 500 500 500 500
GET GET /v3/role_assignments?scope.domain.id 410 420 450 470 500 500 500 500
GET GET /v3/role_assignments?user.id 420 430 460 490 500 500 567 567
GET GET /v3/roles 430 440 470 500 500 500 600 600
GET GET /v3/roles/:id 430 450 460 490 500 500 600 670
GET GET /v3/users/:id 450 460 490 500 500 594 594 594
GET GET /v3/users/:id (catalog) 450 460 480 500 500 500 600 600
GET GET /v4/api-keys 410 420 450 470 490 500 500 500
GET GET /v4/api-keys/:client_id 420 420 440 470 470 490 500 500
GET GET /v4/mappings/rulesets 400 420 430 460 490 500 600 600
GET GET /v4/mappings/rulesets/:mapping_id 420 430 440 460 490 500 588 588
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 21 23 27 31 40 51 76 120
GET GET /v4/oauth2/:domain_id/clients 390 420 440 460 490 500 500 500
GET GET /v4/oauth2/:domain_id/clients/:provider_id 430 430 450 470 490 500 500 500
GET GET /v4/oauth2/:domain_id/jwks 20 23 26 31 40 52 78 100
GET GET /v4/scim_realms 400 410 450 460 500 500 600 600
GET GET /v4/scim_realms/:domain_id/:provider_id 390 400 430 450 490 490 500 500
POST POST /v3/auth/tokens 410 420 430 450 480 500 500 500
POST POST /v3/auth/tokens (password, invalid) 700 700 700 800 900 1,000 1,000 1,000
POST POST /v3/auth/tokens (password, project-scoped) 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000
POST POST /v3/auth/tokens (password, unscoped) 800 800 900 1,000 1,000 1,000 1,000 1,000
POST POST /v3/auth/tokens (rescope to system) 490 500 500 500 600 600 600 666
POST POST /v3/auth/tokens (rescope, invalid project) 410 420 440 460 500 500 500 500
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 900 1,000 1,000 1,000 1,000 1,000 1,000 1,000
POST POST /v4/api-keys/:client_id/revoke (teardown) 232 232 232 232 232 232 232 232
POST POST /v4/oauth2/:domain_id/device_authorization 49 55 62 70 86 100 140 150
POST POST /v4/oauth2/:domain_id/token (client_credentials) 500 500 500 600 600 600 786 786
PUT PUT /v4/scim_realms/:domain_id/:provider_id 440 450 500 500 568 568 568 568
Aggregated 37 64 380 440 500 600 1,000 1,000

Status Code Metrics

Method Name Status Codes
DELETE DELETE /v3/auth/tokens 57 [204]
DELETE DELETE /v3/projects/:id (teardown) 1 [204]
DELETE DELETE /v3/roles/:id (teardown) 1 [204]
DELETE DELETE /v3/users/:id (teardown) 2 [204]
DELETE DELETE /v4/mappings/rulesets/:mapping_id (cc teardown) 1 [204]
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 1 [204]
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (cc teardown) 1 [204]
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 1 [204]
GET 626 [200]
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 30 [401], 19 [429]
GET GET /v3/auth/tokens (validate new) 57 [200]
GET GET /v3/auth/tokens (validate revoked) 57 [404]
GET GET /v3/projects/:id 71 [200]
GET GET /v3/projects/:id (catalog) 105 [200]
GET GET /v3/role_assignments 55 [200]
GET GET /v3/role_assignments?role.id 54 [200]
GET GET /v3/role_assignments?scope.domain.id 55 [200]
GET GET /v3/role_assignments?user.id 55 [200]
GET GET /v3/roles 141 [200]
GET GET /v3/roles/:id 71 [200]
GET GET /v3/users/:id 135 [200]
GET GET /v3/users/:id (catalog) 132 [200]
GET GET /v4/api-keys 37 [200]
GET GET /v4/api-keys/:client_id 37 [200]
GET GET /v4/mappings/rulesets 37 [200]
GET GET /v4/mappings/rulesets/:mapping_id 38 [200]
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 1,880 [200]
GET GET /v4/oauth2/:domain_id/clients 37 [200]
GET GET /v4/oauth2/:domain_id/clients/:provider_id 37 [200]
GET GET /v4/oauth2/:domain_id/jwks 1,878 [200]
GET GET /v4/scim_realms 24 [200]
GET GET /v4/scim_realms/:domain_id/:provider_id 24 [200]
POST POST /v3/auth/tokens 54 [201]
POST POST /v3/auth/tokens (password, invalid) 44 [401]
POST POST /v3/auth/tokens (password, project-scoped) 69 [201]
POST POST /v3/auth/tokens (password, unscoped) 68 [201]
POST POST /v3/auth/tokens (rescope to system) 126 [201]
POST POST /v3/auth/tokens (rescope, invalid project) 74 [401]
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 63 [201]
POST POST /v4/api-keys/:client_id/revoke (teardown) 1 [200]
POST POST /v4/oauth2/:domain_id/device_authorization 546 [200]
POST POST /v4/oauth2/:domain_id/token (client_credentials) 15 [200]
PUT PUT /v4/scim_realms/:domain_id/:provider_id 24 [200]
Aggregated 57 [404], 148 [401], 6,172 [200], 65 [204], 19 [429], 380 [201]

Transaction Metrics

Transaction # Times Run # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
ReadHeavy
0.0 1 0 26.00 26 26 0.03 0.00
0.1 89 0 478.17 249 643 2.97 0.00
0.2 90 0 432.76 215 576 3.00 0.00
0.3 90 0 442.49 224 584 3.00 0.00
TokenLifecycle
1.0 0 0 0.00 0 0 0.00 0.00
1.1 57 0 1622.09 794 1944 1.90 0.00
ValidateToken
2.0 0 0 0.00 0 0 0.00 0.00
2.1 119 0 511.46 277 708 3.97 0.00
UserCRUD
3.0 0 0 0.00 0 0 0.00 0.00
3.1 0 0 0.00 0 0 0.00 0.00
3.2 135 0 448.45 240 594 4.50 0.00
3.3 2 0 179.50 110 249 0.07 0.00
ProjectCRUD
4.0 0 0 0.00 0 0 0.00 0.00
4.1 0 0 0.00 0 0 0.00 0.00
4.2 71 0 430.10 216 580 2.37 0.00
4.3 1 0 146.00 146 146 0.03 0.00
RoleCRUD
5.0 0 0 0.00 0 0 0.00 0.00
5.1 0 0 0.00 0 0 0.00 0.00
5.2 71 0 427.04 214 670 2.37 0.00
5.3 1 0 66.00 66 66 0.03 0.00
RoleList
6.0 0 0 0.00 0 0 0.00 0.00
6.1 141 0 429.62 229 600 4.70 0.00
RoleAssignmentList
7.0 0 0 0.00 0 0 0.00 0.00
7.1 55 0 416.20 258 556 1.83 0.00
7.2 55 0 425.36 237 567 1.83 0.00
7.3 55 0 403.71 223 545 1.83 0.00
7.4 54 0 417.06 214 549 1.80 0.00
UserRead
8.0 0 0 0.00 0 0 0.00 0.00
8.1 132 0 474.74 245 637 4.40 0.00
8.2 132 0 449.68 225 641 4.40 0.00
ProjectRead
9.0 0 0 0.00 0 0 0.00 0.00
9.1 106 0 443.94 234 652 3.53 0.00
9.2 105 0 421.36 233 573 3.50 0.00
PasswordAuth
10.0 68 0 805.24 438 1307 2.27 0.00
10.1 69 0 992.52 596 1405 2.30 0.00
PasswordAuthNegative
11.0 44 0 694.39 498 1082 1.47 0.00
Rescope
12.0 0 0 0.00 0 0 0.00 0.00
12.1 126 0 480.85 236 666 4.20 0.00
RescopeNegative
13.0 0 0 0.00 0 0 0.00 0.00
13.1 74 0 409.07 203 525 2.47 0.00
SystemScopeAuth
14.0 63 0 967.92 434 1479 2.10 0.00
ApiKeyCRUD
15.0 0 0 0.00 0 0 0.00 0.00
15.1 0 0 0.00 0 0 0.00 0.00
15.2 37 0 413.11 225 531 1.23 0.00
15.3 37 0 410.57 245 542 1.23 0.00
15.4 1 0 232.00 232 232 0.03 0.00
MappingCRUD
16.0 0 0 0.00 0 0 0.00 0.00
16.1 0 0 0.00 0 0 0.00 0.00
16.2 38 0 407.82 259 588 1.27 0.00
16.3 37 0 402.84 202 601 1.23 0.00
16.4 1 0 124.00 124 124 0.03 0.00
OAuth2ClientCRUD
17.0 0 0 0.00 0 0 0.00 0.00
17.1 0 0 0.00 0 0 0.00 0.00
17.2 37 0 419.92 217 530 1.23 0.00
17.3 37 0 398.57 233 532 1.23 0.00
17.4 1 0 286.00 286 286 0.03 0.00
OAuth2ClientCredentials
18.0 0 0 0.00 0 0 0.00 0.00
18.1 0 0 0.00 0 0 0.00 0.00
18.2 15 0 508.07 304 786 0.50 0.00
18.3 1 0 22.00 22 22 0.03 0.00
OAuth2DeviceAuthorization
19.0 546 0 54.79 17 152 18.20 0.00
OAuth2Discovery
20.0 1878 0 23.34 4 103 62.60 0.00
20.1 1880 0 23.72 4 120 62.67 0.00
ScimRealmRead
21.0 0 0 0.00 0 0 0.00 0.00
21.1 24 0 399.71 290 501 0.80 0.00
21.2 24 0 413.50 244 642 0.80 0.00
21.3 24 0 451.92 257 568 0.80 0.00
ScimSync
22.0 0 0 0.00 0 0 0.00 0.00
22.1 0 0 0.00 0 0 0.00 0.00
22.2 0 0 0.00 0 0 0.00 0.00
22.3 49 0 620.33 144 1017 1.63 0.00
22.4 48 0 0.00 0 0 1.60 0.00
22.5 48 0 0.00 0 0 1.60 0.00
22.6 1 0 0.00 0 0 0.03 0.00
Aggregated 6770 0 195.77 4 1944 225.67 0.00

Scenario Metrics

Transaction # Users # Times Run Average (ms) Min (ms) Max (ms) Scenarios/s Iterations
ReadHeavy 4 88 1356.28 794 1618 2.93 22.00
TokenLifecycle 3 54 1661.93 1223 1944 1.80 18.00
ValidateToken 2 117 513.10 277 708 3.90 58.50
UserCRUD 2 133 449.02 240 594 4.43 66.50
ProjectCRUD 1 70 431.00 216 580 2.33 70.00
RoleCRUD 1 70 429.33 214 670 2.33 70.00
RoleList 2 139 430.28 229 600 4.63 69.50
RoleAssignmentList 3 54 1664.96 1222 1891 1.80 18.00
UserRead 4 131 929.34 497 1152 4.37 32.75
ProjectRead 3 105 868.71 473 1093 3.50 35.00
PasswordAuth 4 67 1811.09 1275 2478 2.23 16.75
PasswordAuthNegative 1 43 696.74 498 1082 1.43 43.00
Rescope 2 124 482.27 236 666 4.13 62.00
RescopeNegative 1 73 409.15 203 525 2.43 73.00
SystemScopeAuth 2 61 983.95 620 1479 2.03 30.50
ApiKeyCRUD 1 36 825.42 511 974 1.20 36.00
MappingCRUD 1 37 814.76 497 1031 1.23 37.00
OAuth2ClientCRUD 1 37 817.76 451 971 1.23 37.00
OAuth2ClientCredentials 1 15 2080.73 1644 2529 0.50 15.00
OAuth2DeviceAuthorization 1 545 54.69 17 152 18.17 545.00
OAuth2Discovery 3 1877 47.59 12 181 62.57 625.67
ScimRealmRead 1 24 1270.12 886 1446 0.80 24.00
ScimSync 1 48 612.19 144 1017 1.60 48.00
Aggregated 45 3948 342.72 12 2529 131.60 2053.17

Error Metrics

Method Name # Error
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 49 401 Unauthorized: GET /SCIM/v2/:domain_id/Users (sync reconcile list)
POST POST /SCIM/v2/:domain_id/Users (sync provision) 1 401 Unauthorized: POST /SCIM/v2/:domain_id/Users (sync provision)
POST POST /v3/auth/tokens (password, invalid) 102 401 Unauthorized: POST /v3/auth/tokens (password, invalid)
POST POST /v3/auth/tokens (rescope, invalid project) 188 401 Unauthorized: POST /v3/auth/tokens (rescope, invalid project)
GET GET /v3/auth/tokens (validate revoked) 218 404 Not Found: GET /v3/auth/tokens (validate revoked)
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 48 429 Too Many Requests: GET /SCIM/v2/:domain_id/Users (sync reconcile list)

View full report

@github-actions

Copy link
Copy Markdown

🧪 Tempest Identity Compatibility Results (advisory, non-blocking)

rust

Totals
======
Ran: 113 tests in 21.0342 sec.
 - Passed: 63
 - Skipped: 2
 - Expected Fail: 0
 - Unexpected Success: 0
 - Failed: 48
Sum of execute time for each test: 15.7506 sec.
Failed test IDs
===== FAILED TESTS (target=rust) =====
tempest.api.identity.admin.v3.test_credentials.CredentialsTestJSON.test_credentials_create_get_update_delete[id-7cd59bf9-bda4-4c72-9467-d21cab278355,smoke]
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_group_users_add_list_delete[id-1598521a-2f36-4606-8df9-30772bd51339,smoke]
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_list_user_groups[id-64573281-d26a-4a52-b899-503cb0f4e4ec]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_domain_config_and_show_config_groups_and_options[id-9e3ff13c-f597-4f01-9377-d6c06c2a1477]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_update_and_delete_domain_config_groups_and_opts[id-c7510fa2-6661-4170-9c6b-4783a80651e9]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_show_default_group_config_and_options[id-11a02bf0-6f94-4380-b3b0-c8dc18fc0d22]
tempest.api.identity.admin.v3.test_domains_negative.DomainsNegativeTestJSON.test_delete_active_domain[gate,id-1f3fbff5-4e44-400d-9ca1-d953f05f609b,negative]
tempest.api.identity.admin.v3.test_default_project_id.TestDefaultProjectId.test_default_project_id[id-d6110661-6a71-49a7-a453-b5e26640ff6d]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_check_revoke_roles_on_projects_group[id-26021436-d5a4-4256-943c-ded01e0d4b45]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_check_revoke_roles_on_projects_user[id-18b70e45-7687-4b72-8277-b8f1a47d7591]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_check_revoke_roles_on_domains_group[id-c7a8dda2-be50-4fb4-9a9c-e830771078b1]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_check_revoke_roles_on_domains_user[id-4e6f0366-97c8-423c-b2be-41eae6ac91c8]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_revoke_user_roles_on_domain[id-3acf666e-5354-42ac-8e17-8b68893bcd36]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_revoke_user_roles_on_project_tree[id-9f02ccd9-9b57-46b4-8f77-dd5a736f3a06]
setUpClass (tempest.api.identity.admin.v3.test_endpoint_groups.EndPointGroupsTest)
tempest.api.identity.admin.v3.test_list_projects.ListProjectsTestJSON.test_list_projects_with_parent[id-6edc66f5-2941-4a17-9526-4073311c1fac]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_assignments_for_domain_roles[id-3859df7e-5b78-4e4d-b10e-214c8953842a]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_assignments_for_implied_roles_create_delete[id-c8828027-df48-4021-95df-b65b92c7429e]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_domain[id-4bf8a70b-e785-413a-ad53-9f91ce02faa7]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_project[id-cbf11737-1904-4690-9613-97bcbb3df1c4]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_user_on_domain[id-6c9a2940-3625-43a3-ac02-5dcec62ef3bd]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_implied_domain_roles[id-eb1e1c24-1bc4-4d47-9748-e127a1852c82]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_implied_roles_create_check_show_delete[id-c90c316c-d706-4728-bcba-eb1912081b69]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_role_create_update_show_list[id-18afc6c0-46cf-4911-824e-9989cc056c3a,smoke]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_create_and_show_consumer[id-c8307ea6-a86c-47fd-ae7b-5b3b2caca76d]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_delete_consumer[id-fdfa1b7f-2a31-4354-b2c7-f6ae20554f93]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_list_consumers[id-09ca50de-78f2-4ffb-ac71-f2254036b2b8]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_update_consumer[id-080a9b1a-c009-47c0-9979-5305bf72e3dc]
tempest.api.identity.admin.v3.test_project_tags.IdentityV3ProjectTagsTest.test_list_update_delete_project_tags[id-7c123aac-999d-416a-a0fb-84b915ab10de]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_get_trusts_all[id-4773ebd5-ecbf-4255-b8d8-b63e6f72b65d,smoke]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_get_trusts_query[id-6268b345-87ca-47c0-9ce3-37792b43403a]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_create_is_domain_project[id-a7eb9416-6f9b-4dbb-b71b-7f73aaef59d5]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_expire[id-0ed14b66-cefd-4b5c-a964-65759453e292]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_project_create_with_parent[id-1854f9c0-70bc-4d11-a08a-1c789d339e3d]
setUpClass (tempest.api.identity.admin.v3.test_tokens.TokensV3TestJSON)
setUpClass (tempest.api.identity.admin.v3.test_users_negative.UsersNegativeTest)
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_expire_invalid[id-3e48f95d-e660-4fa9-85e0-5a3d85594384]
setUpClass (tempest.api.identity.admin.v3.test_projects_negative.ProjectsNegativeTestJSON)
setUpClass (tempest.api.identity.admin.v3.test_users.UsersV3TestJSON)
setUpClass (tempest.api.identity.v3.test_domains.DefaultDomainTestJSON)
setUpClass (tempest.api.identity.v3.test_projects.IdentityV3ProjectsTest)
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_impersonate[id-5a0a91a4-baef-4a14-baba-59bf4d7fcace]
setUpClass (tempest.api.identity.v3.test_tokens.TokensV3Test)
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_noimpersonate[id-ed2a8779-a7ac-49dc-afd7-30f32f936ed2]
setUpClass (tempest.api.identity.v3.test_api_discovery.TestApiDiscovery)
setUpClass (tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test)
setUpClass (tempest.api.identity.v3.test_catalog.IdentityCatalogTest)
setUpClass (tempest.api.identity.v3.test_ec2_credentials.EC2CredentialsTest)
===== END FAILED TESTS (target=rust) =====

View full run

@gtema
gtema added this pull request to the merge queue Oct 15, 2026
@github-actions

Copy link
Copy Markdown

🐰 Bencher Report

Projectkeystone
Branchcrypto
Testbedubuntu-latest
Click to view all benchmark results
BenchmarkLatencyBenchmark Result
nanoseconds (ns)
(Result Δ%)
Upper Boundary
nanoseconds (ns)
(Limit %)
Command_Serde/apply/remove📈 view plot
🚷 view threshold
201,530.00 ns
(+47.77%)Baseline: 136,377.75 ns
266,298.77 ns
(75.68%)
Command_Serde/apply/set📈 view plot
🚷 view threshold
207,770.00 ns
(+43.84%)Baseline: 144,444.89 ns
258,045.70 ns
(80.52%)
Command_Serde/pack/delete📈 view plot
🚷 view threshold
86.67 ns
(-26.77%)Baseline: 118.36 ns
166.93 ns
(51.92%)
Command_Serde/pack/delete_index📈 view plot
🚷 view threshold
78.92 ns
(-25.73%)Baseline: 106.26 ns
146.24 ns
(53.97%)
Command_Serde/pack/set📈 view plot
🚷 view threshold
149.02 ns
(-21.69%)Baseline: 190.30 ns
269.39 ns
(55.32%)
Command_Serde/pack/set_index📈 view plot
🚷 view threshold
78.33 ns
(-26.76%)Baseline: 106.95 ns
148.19 ns
(52.86%)
Command_Serde/unpack/delete📈 view plot
🚷 view threshold
89.89 ns
(-39.03%)Baseline: 147.43 ns
216.79 ns
(41.46%)
Command_Serde/unpack/delete_index📈 view plot
🚷 view threshold
80.60 ns
(-35.82%)Baseline: 125.58 ns
185.20 ns
(43.52%)
Command_Serde/unpack/set📈 view plot
🚷 view threshold
143.31 ns
(-37.65%)Baseline: 229.84 ns
344.74 ns
(41.57%)
Command_Serde/unpack/set_index📈 view plot
🚷 view threshold
80.68 ns
(-35.30%)Baseline: 124.70 ns
183.78 ns
(43.90%)
Payload_encryption/pack/remove_cmd📈 view plot
🚷 view threshold
75.42 ns
(-31.96%)Baseline: 110.85 ns
162.18 ns
(46.51%)
Payload_encryption/pack/set_cmd📈 view plot
🚷 view threshold
137.25 ns
(-31.65%)Baseline: 200.79 ns
301.38 ns
(45.54%)
Payload_encryption/unpack/remove_cmd📈 view plot
🚷 view threshold
94.13 ns
(-37.21%)Baseline: 149.90 ns
218.55 ns
(43.07%)
Payload_encryption/unpack/set_cmd📈 view plot
🚷 view threshold
148.57 ns
(-36.40%)Baseline: 233.62 ns
351.00 ns
(42.33%)
Raft_1Node_Latency/prefix/1node📈 view plot
🚷 view threshold
2,495,300.00 ns
(-31.30%)Baseline: 3,632,323.59 ns
8,552,239.25 ns
(29.18%)
Raft_1Node_Latency/read/1node📈 view plot
🚷 view threshold
30,130.00 ns
(-13.59%)Baseline: 34,868.81 ns
50,872.24 ns
(59.23%)
Raft_1Node_Latency/remove/1node📈 view plot
🚷 view threshold
462,280.00 ns
(+33.26%)Baseline: 346,902.34 ns
573,980.52 ns
(80.54%)
Raft_1Node_Latency/write/1node📈 view plot
🚷 view threshold
482,630.00 ns
(+25.12%)Baseline: 385,745.47 ns
752,803.91 ns
(64.11%)
build_snapshot/default📈 view plot
🚷 view threshold
1,780.10 ns
(-15.72%)Baseline: 2,112.21 ns
2,842.77 ns
(62.62%)
fernet token/project📈 view plot
🚷 view threshold
1,063.00 ns
(-18.73%)Baseline: 1,307.95 ns
1,775.97 ns
(59.85%)
get_data_keyspace📈 view plot
🚷 view threshold
0.24 ns
(-19.43%)Baseline: 0.30 ns
0.39 ns
(62.42%)
get_db📈 view plot
🚷 view threshold
0.26 ns
(-13.31%)Baseline: 0.30 ns
0.39 ns
(67.16%)
get_fernet_token_timestamp/project📈 view plot
🚷 view threshold
112.24 ns
(-16.18%)Baseline: 133.90 ns
182.21 ns
(61.60%)
get_keyspace📈 view plot
🚷 view threshold
10.82 ns
(+61.78%)Baseline: 6.69 ns
15.89 ns
(68.12%)
🐰 View full continuous benchmarking report in Bencher

Merged via the queue into main with commit 96c5285 Oct 15, 2026
37 checks passed
gtema added a commit that referenced this pull request Oct 15, 2026
The storage crate now offers opt-in stale local reads (#1532) and a
FIPS backend (#1535); section 8.3 and section 20.1 still described
both as missing.

Local reads apply only to tier 0/1 records, and every record on the
KMS's authorization and cache-fill path is tier 2 or 3, so they help
for display metadata only. Update the FIPS table and rule 1 to the
reworded invariant 10, and narrow open question 14 to the remaining
gap: HKDF-derived state and backup nonces that must stay identical on
every node.

Signed-off-by: artem.goncharov <artem.goncharov@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants