Releases: a-sit-plus/warden-supreme
1.0.0-RC9
1.0.0-RC8
- Stabilise Hoplite and Spring Config Loading
1.0.0-RC7
- Features
- Support custom verified boot keys
- Allows treating self-signed just like a locked bootloader if desired
- Makes it possible to disallow even OEM ROMS and allow only GrapheneOS, for example
- Support custom verified boot keys
- API Changes:
- Signer fingerprints is now a
Setand not a list anymore
- Signer fingerprints is now a
- Behavioural Changes:
parseHexnow also strips:by default
- Dependency Updates
- Signum 3.20.0 + Supreme 0.12.0 fixing DER SET ordering
- Kotlinx.serialization 1.10.0
1.0.0-RC5
- Features
- Proper iOS assertion validation (thanks @andreybogdanov-sprind!)
- Serializers and ASN.1 codec for
ValidatedAttestation - Move
AttestationConfigurationhelpers intosupreme-common. - Add
config-hoplitemodule that provideshopliteDecoder()for allAttestationConfigurationreaders. - Add experimental
config-springmodule that binds Spring Boot config loading to the canonical serialization path. - YAML polymorphic configs now use a flat
typeshape (matching JSON) while still accepting legacytype/valueYAML on decode.
- Fixes
- Expose Kotlin-Stdlib as API dependency to make integration with Java projects smoother
- Tests
- Extend configuration round-trip tests to include Hoplite loading and legacy YAML fixtures.
- API Changes:
- rename
AttestationService.ios.verifyAssertion->AttestationService.ios.verifyCombinedand deprecate the old function
- rename
- Dependency Updates
- Update upstream attestation library to 9066c0a003225e776b93ba5906d46c45904173de
1.0.0-RC3
This release finally introduces a new Android attestation extension parser. We urge everyone to enable it by setting supremeParser = true in the Android attestation configuration and provide feedback.
The new parser should outperform Google's current and legacy parser and was tested using thousands of captured attestation proofs from real devices. Still, the old one successfully handled millions, so we need more data.
- Features:
- Get Attestation extension from certificate chain (same as Google's parser: return the attestation extension closest to the root)
- Rework custom Attestation extension parser
- Now list-based to handle arbitrary properties
- Add missing properties to custom parser * Expose known properties as getters from this list * Custom Parser correctly handles UserAuthType and many more * -> Warden Supreme now parses more Attestation extensions correctly than Google's shiny new parser AND with better semantics and Debugging * Add
attestationExtensionshorthand toAttestationResult, returning anAttestationKeyDescription
- Refactor Roboto *
Robotochanges from abstract base class to a concrete wired based on config (experimentalParser, HW/SW toggles) * Delegate actual checks toEnginesto prepare replacing Google's parser and PKIX cert path validator (setexperimentalParser = truein config to try it out) * Deprecate old blocking verification function that was tied to Google's old parser * Introduce new suspending verification function
* Returns aKmmResult<List<X509Certificate>>* Never throws- First preview of attestation checks based on own parser
- Fixes:
- Relax the upstream parser to glitch out less often * -> Warden Supreme now parses more Attestation extensions than WARDEN-roboto ever could.
- Correctly re-encode cursed X.509 certificate extensions that encode
critical=trueinstead of omitting it - Artefacts don't need
google()maven repo any more - No mire init crash in Java projects using Warden Supreme
- API-Changes:
- Roboto refactor * Directly instantiate Roboto (see "Refactor Roboto") * Roboto's functions now expect Kotlin
Instantinstead of JavaDate* Blocking functions have been made extensions instead of members * Java-compatible signature remain *HardwareAttestationVerifier/SoftwareAttestationVerifierare no longer classes * Now they are deprecated factory objects returning aRobotoinstance - Weed out half-baked
AttestationValuefunctions and add mappings from/to (Kmm)Result - Weed out half-baked
AttestationValuefunctions and add mappings from/to (Kmm)Result
- Roboto refactor * Directly instantiate Roboto (see "Refactor Roboto") * Roboto's functions now expect Kotlin
- Revised and expanded documentation
- Dependency Updates:
- Signum 3.19.3 / Supreme 0.11.3
1.0.0-RC2
- Features:
- Relax custom parser to report less values as error
- Add extension to read/write configurations directly from/to files
- Fixes:
- Correct generation of API docs
- Support cursed RSA PKCS1 X.509 signature algorithm profiles used by one of the larges OEMs
- Revised and extended documentation
- Dependency Updates:
- Signum 3.19.2 / Supreme 0.11.2
If you are coming from WARDEN or Warden Supreme 0.9, be sure to checkout the Changelog for 1.0.0-RC!
1.0.0-RC
Release Candidate for Warden Supreme 1.0.0
Critical fix (integrated flow):
Warden Supreme (and its predecessors WARDEN and WARDEN-roboto) always correctly validated attestation.
However, earlier Warden Supreme builds had a bug in the proof-of-possession check for the client private key (signature verification).
This only affected the fully integrated ("Supreme") flow (implemented in AttestationVerifier).
Roboto and Makoto were never affected since neither did proof-of-possession checks.
If you use AttestationVerifier (the integrated flow), update to this release. If you use Roboto and/or Makoto directly, you are not affected.
- New Features
- Make it possible to configure only iOS or only Android attestation
AttestationResult.Error.CONTENTis now thrown when an attestation is received for a non-configured platform
- Ability to set the clock on the client for testing/debugging (only sensible on Android)
- Add custom Android Attestation Extension parser (for debugging purposes, for now)
- Revamp AttestationChallenge
- Configurable device name OID
- Replace
includeGenericDeviceNamein favour ofgenericDeviceNameOID - Old constructor signatures have been removed
- Also affects
AttestationVerifier
- Replace
- Bump challenge version to
2
- Configurable device name OID
- Revamp challenge validation API to take the full CSR from the client instead of just the nonce already extracted from it
- Introduce canonical config format to avoid issues with config loading
- Discourage config loading through Hoplite or Spring Boot
- Includes YAML and JSON format
- Docs include auto-generated full JSON and YAML as a reference
- Completely revamped Android revocation checks based on configurable, chainable loaders
- Allows specifying custom revocation lists
- Allows disabling revocation checks altogether
- Extensible with custom loaders
- Included loaders:
- HTTP-based, caching
- Supports SOCKS and HTTP proxies
- File-based, caching
- In-memory, static, non-caching
- HTTP-based, caching
- Provide fully-fledged Android revocation lists
- The Android-specific
Revokederror now includes the revocation list entry that indicates a revocation or suspension.
- The Android-specific
- Debugging is now smoother because debug statements now include the snapshot of the revocations lists they have been using
- Make it possible to configure only iOS or only Android attestation
- Fixes
- Fix a proof-of-possession (client private key) verification bug in the Supreme integrated
AttestationVerifierflow- Attestation verification was always correct; only proof-of-possession was affected
- Neither Roboto nor Makoto were ever affected by this
- Per-App Strongbox overrides are now respected
- Fix custom auth prompts not propagating for fully integrated flows
- Fix per-app trust anchors not being picked up when using the config builders.
- Allow specifying CSR attributes and extensions for fully integrated flows
- Fix nonce validity duration calculation
- Additional fixes to exception equality checks
- Fix a proof-of-possession (client private key) verification bug in the Supreme integrated
- Removed Features
- Nougat Hybrid Attestation has been completely removed due to irrelevance
- Android 7 was released a decade ago
- Devices released with Android 7 it lost support around eight years ago
- Nougat Hybrid Attestation has been completely removed due to irrelevance
- API-only Changes
- Remove all deprecations marked for removal with 1.0.0.
- Switch order of
androidAttestationConfigurationJandiosAttestationConfigurationJfor Java-oriented Makoto constructor - Remove ability to specify challenge validity as instant
- Validity is set as a duration
- read-only
validUntilInstant-property stays
- Make Content exception a sealed class
- Rename
AttestationValueException.Reason.TIME->AttestationValueException.Reason.STATEMENT_TIME - AttestationResult.Error will now always contain a
cause - Make attestation functions suspending and provide blocking wrappers under old
@JvmNames - Make Makoto configs publicly accessible
- Deprecate misnamed and overly complex APIs. They will be removed with 1.1
- Fail early on invalid iOS team identifier length
- Android-only debug statements must now also contain a version number
- Add
onChallengeValidatedcallback toAttestationVerifier.verifyAttestation - Make
verifyAttestationcallbacks suspending and ignore callback exceptions
- Dependency and Build updates
- Gradle 9 + Kotlin 2.3
- Return value checker defaults to
check
- Return value checker defaults to
- Dependency updates:
- Dokka 2.10.0
- AGP 8.12.3
- Ktor 3.3.3
- Bouncy Castle 1.83 (no more forcing exact version)
- Android Key Attestation Check lib from Google b5176b4d3fdd97301be0d194ab48ab3c6fa558fb
- Gradle 9 + Kotlin 2.3
0.9.9999.1
0.9.9999.1
- Fix missing old HW trust anchor
0.9.9999
- Fix infinite recursion on clock conversion
- Integration tests with default validity periods
- Fix wrong offset sign with secondary
AttestationVerifierconstructor - Rework NOOP attestation and NOOP results
- Non-error AttestationResults now come with an
AttestationResult.Kindmarker interface - Makoto produces
AttestationResult.Verified - NoopAttestationService produces
AttestationResult.NOOP KeyAttestation.foldnow produces a nullableAttestationResult.Verifiedon success to acccount for NOOP results- Makoto and NoopAttestationService bring their own
foldTypedextenstion (which sadly cannot override a common abstract extension, because they need to be inline)
- Non-error AttestationResults now come with an
- Make
makotoproperty ofAttestationVerifierpublic - Versioned debug statements
0.9.999
- Quality of life improvements:
- Truly, fully integrated attestation flows in a single line of client code
- Ability to set an auth prompt text and cancel message for integrated flows
- Various documentation fixes
- Force allow signing
- Add schemas to docs
- Fix
supreme-commonsbuild setup
0.9.99
Towards 1.0.0
This release introduces breaking changes to the integrated ("Supreme") components to deliver truly, fully integrated
key and app attestation, pinning down the last unnecessarily moving parts:
- Rename
AttestationValidator->AttestationVerifierto align with wording (and introduce typealias, but marked as deprecated) - Rename
verifyKeyAttestation->verifyAttestation(and introduce delegate, but marked as deprecated)CertificateIssuernow hasAttestationResult.Verifiedas receiver for the new function.- The deprecated function stays as it is.
- Allow
CertificateIssuerto throw instead of returning aKmmResult - Constrain challenge issuing wrt. validity duration: No more params can be specified, but informational adding of time zone is still allowed.
It also includes behavioural changes to the Android and iOS attestation defaults:
- Don't allow negative validity durations
- Ignore Android leaf cert validity by default, because Warden Supreme, by default, uses random cryptographic nonces.
ingoreLeafValidity()(yes, with typo!) function of theAndroidAttestationConfiguration.Builderis now a deprecated NOOP to be removed.enforceLeafValidity()(without typo!) function was introduced
- Android
attestationStatementValiditySecondsdefaults tonull, because Warden Supreme, by default, uses random cryptographic nonces. - iOS clock verification time offset defaults to five minutes, which are added to the attestation statement validity by default.
- Rename
Warden->Makototo more clearly distinguish individual components by name- A
typealias Warden = Makotois present, but marked as deprecated
- A
- Rename
AndroidAttestationChecker->Robototo more clearly distinguish individual components by name- Rename
HardwareAttestationChecker->HardwareAttestationVerifier(and introduce typealias, but marked as deprecated) - Rename
NougatHybridAttestationChecker->NougatHybridAttestationVerifier(and introduce typealias, but marked as deprecated) - Rename
SoftwareAttestationChecker->SoftwareAttestationVerifier(and introduce typealias, but marked as deprecated)
- Rename
- Android total validity offset is now more lenient and simply checked for overflows
- If all parameters are configured explicitly, nothing changes, except for some renames
New features:
- Ship a default OID to identify the attestation proof.
- Add defaults for keyConstraints and nonce validity duration → Fully integrated key and attestation generation
- Transmit device names inside CSR on a best-effort basis
- Per-App StrongboxOverride
- Expose Makoto
verificationTimeOffsetandclock,shortestValidityDuration - Rework Trust Anchor Management:
- Introduce
TrustedRootinterface to represent trust anchorsTrustedRoot.Certificatefor certificatesTrustedRoot.PublicKeyfor using raw public keys, optionally specifying a CA name- No CA name -> no CA name check
- CA name set -> CA name check
- Android trust anchors can now be certificates or public keys thanks to
TrustedRoot- Default hardware attestation trust anchors are available in
GOOGLE_DEFAULT_HARDWARE_TRUST_ANCHORS - Default software attestation trust anchors for Android <=11 are available in
GOOGLE_SOFTWARE_TRUST_ANCHORS_UNTIL_A11
- Default hardware attestation trust anchors are available in
- iOS now also supports setting custom trust anchors (currently certificates only) via
trustedRootsconfig propertytrustedRootOverridesfor app-specific overridesoverrideTrustedRootsfor the builder- Defaults trusted roots are available in
APPLE_DEFAULT_TRUSTED_ROOTS
- Default android trust anchors are now all the attestation certificates, not just a raw public key
- Existing function signatures and constants are preserved for compatibility but will be removed in the next major
release - Android configuration migration guide (iOS only got added functionality):
hardwareAttestationTrustAnchors->hardwareTrustedRootssoftwareAttestationTrustAnchors->softwareTrustedRootsAppData.overrideTrustAnchors->AppData.trustedRootOverridesAppData.trustAnchorOverrides->AppData.trustedRootOverridesAppData.signatureDigests->AppData.signerFingerprints
- Introduce
- Consistent configuration Builder API functions
overrideXXX(s)->XXXoverride(s)