Skip to content

Releases: a-sit-plus/warden-supreme

1.0.0-RC9

16 Apr 08:09

Choose a tag to compare

  • Relax Spring and Hoplite parsing (property names / keys can now be snake_case (upper and lower) and kebap-case as well)
  • Add Java-friendly Spring config loading functions
  • Signum 3.21.0 / Supreme 0.13.0
  • Drop Apple X64 targets

1.0.0-RC8

12 Apr 15:38

Choose a tag to compare

  • Stabilise Hoplite and Spring Config Loading

1.0.0-RC7

24 Mar 17:34
0bd62a8

Choose a tag to compare

  • 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
  • API Changes:
    • Signer fingerprints is now a Set and not a list anymore
  • Behavioural Changes:
    • parseHex now 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

25 Feb 16:17

Choose a tag to compare

  • Features
    • Proper iOS assertion validation (thanks @andreybogdanov-sprind!)
    • Serializers and ASN.1 codec for ValidatedAttestation
    • Move AttestationConfiguration helpers into supreme-common.
    • Add config-hoplite module that provides hopliteDecoder() for all AttestationConfiguration readers.
    • Add experimental config-spring module that binds Spring Boot config loading to the canonical serialization path.
    • YAML polymorphic configs now use a flat type shape (matching JSON) while still accepting legacy type/value YAML 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.verifyCombined and deprecate the old function
  • Dependency Updates
    • Update upstream attestation library to 9066c0a003225e776b93ba5906d46c45904173de

1.0.0-RC3

04 Feb 12:21

Choose a tag to compare

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 attestationExtension shorthand to AttestationResult, returning an AttestationKeyDescription
    • Refactor Roboto * Roboto changes from abstract base class to a concrete wired based on config (experimentalParser, HW/SW toggles) * Delegate actual checks to Engines to prepare replacing Google's parser and PKIX cert path validator (set experimentalParser = true in config to try it out) * Deprecate old blocking verification function that was tied to Google's old parser * Introduce new suspending verification function
      * Returns a KmmResult<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=true instead 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 Instant instead of Java Date * Blocking functions have been made extensions instead of members * Java-compatible signature remain * HardwareAttestationVerifier / SoftwareAttestationVerifier are no longer classes * Now they are deprecated factory objects returning a Roboto instance
    • Weed out half-baked AttestationValue functions and add mappings from/to (Kmm)Result
    • Weed out half-baked AttestationValue functions and add mappings from/to (Kmm)Result
  • Revised and expanded documentation
  • Dependency Updates:
    • Signum 3.19.3 / Supreme 0.11.3

1.0.0-RC2

29 Jan 14:21

Choose a tag to compare

  • 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

27 Jan 17:49

Choose a tag to compare

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.CONTENT is 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 includeGenericDeviceName in favour of genericDeviceNameOID
        • Old constructor signatures have been removed
        • Also affects AttestationVerifier
      • Bump challenge version to 2
    • 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
    • Provide fully-fledged Android revocation lists
      • The Android-specific Revoked error now includes the revocation list entry that indicates a revocation or suspension.
    • Debugging is now smoother because debug statements now include the snapshot of the revocations lists they have been using
  • Fixes
    • Fix a proof-of-possession (client private key) verification bug in the Supreme integrated AttestationVerifier flow
      • 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
  • 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
  • API-only Changes
    • Remove all deprecations marked for removal with 1.0.0.
    • Switch order of androidAttestationConfigurationJ and iosAttestationConfigurationJ for Java-oriented Makoto constructor
    • Remove ability to specify challenge validity as instant
      • Validity is set as a duration
      • read-only validUntil Instant-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 onChallengeValidated callback to AttestationVerifier.verifyAttestation
    • Make verifyAttestation callbacks suspending and ignore callback exceptions
  • Dependency and Build updates
    • Gradle 9 + Kotlin 2.3
      • Return value checker defaults to check
    • 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

0.9.9999.1

19 Jan 18:17

Choose a tag to compare

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 AttestationVerifier constructor
  • Rework NOOP attestation and NOOP results
    • Non-error AttestationResults now come with an AttestationResult.Kind marker interface
    • Makoto produces AttestationResult.Verified
    • NoopAttestationService produces AttestationResult.NOOP
    • KeyAttestation.fold now produces a nullable AttestationResult.Verified on success to acccount for NOOP results
    • Makoto and NoopAttestationService bring their own foldTyped extenstion (which sadly cannot override a common abstract extension, because they need to be inline)
  • Make makoto property of AttestationVerifier public
  • Versioned debug statements

0.9.999

19 Nov 18:22

Choose a tag to compare

  • 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-commons build setup

0.9.99

18 Nov 06:11

Choose a tag to compare

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 -> AttestationVerifier to align with wording (and introduce typealias, but marked as deprecated)
  • Rename verifyKeyAttestation -> verifyAttestation (and introduce delegate, but marked as deprecated)
    • CertificateIssuer now has AttestationResult.Verified as receiver for the new function.
    • The deprecated function stays as it is.
  • Allow CertificateIssuer to throw instead of returning a KmmResult
  • 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 the AndroidAttestationConfiguration.Builder is now a deprecated NOOP to be removed.
    • enforceLeafValidity() (without typo!) function was introduced
  • Android attestationStatementValiditySeconds defaults to null, 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 -> Makoto to more clearly distinguish individual components by name
    • A typealias Warden = Makoto is present, but marked as deprecated
  • Rename AndroidAttestationChecker -> Roboto to 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)
  • 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 verificationTimeOffset and clock, shortestValidityDuration
  • Rework Trust Anchor Management:
    • Introduce TrustedRoot interface to represent trust anchors
      • TrustedRoot.Certificate for certificates
      • TrustedRoot.PublicKey for 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
    • iOS now also supports setting custom trust anchors (currently certificates only) via
      • trustedRoots config property
      • trustedRootOverrides for app-specific overrides
      • overrideTrustedRoots for 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 -> hardwareTrustedRoots
      • softwareAttestationTrustAnchors -> softwareTrustedRoots
      • AppData.overrideTrustAnchors -> AppData.trustedRootOverrides
      • AppData.trustAnchorOverrides -> AppData.trustedRootOverrides
      • AppData.signatureDigests -> AppData.signerFingerprints
  • Consistent configuration Builder API functions
    • overrideXXX(s) -> XXXoverride(s)