microg/GmsCore · error · TokenBinding.UnsupportedTokenBindingStatusException

TokenBindingStatus not supported

Error message

TokenBindingStatus ${str} not supported

What it means

TokenBinding.TokenBindingStatus.fromString() maps a token-binding status string ("supported" or "present") to the enum. Unknown strings throw UnsupportedTokenBindingStatusException. It's invoked from createFromParcel during unparceling of objects containing a TokenBinding, so it can also surface as a RuntimeException during Parcel deserialization.

Solutions

  1. Use exactly "supported" or "present" for the status string.
  2. Prefer TokenBindingStatus enum constants over raw strings when constructing TokenBinding.
  3. Wrap createFromParcel/fromString in try-catch for UnsupportedTokenBindingStatusException and default to null (token binding omitted) when unknown.

Example fix

// before
TokenBinding tb = TokenBinding.TokenBindingStatus.fromString("not-supported");
// after
TokenBinding tb;
try {
    tb = TokenBinding.TokenBindingStatus.fromString(status);
} catch (UnsupportedTokenBindingStatusException e) {
    tb = null;
}
Defensive patterns

Strategy: try-catch

Validate before calling

boolean valid = "supported".equals(status) || "present".equals(status);

Try / catch

try { status = TokenBinding.TokenBindingStatus.fromString(s); } catch (UnsupportedTokenBindingStatusException e) { status = null; /* token binding omitted */ }

Prevention

When it happens

Trigger: Calling fromString with a status other than "supported"/"present" (e.g. "not-supported", "", null), or parceling a TokenBinding whose status was written from an unrecognized string and later unparceled via createFromParcel.

Common situations: Server-side JSON carrying a tokenBinding status from a different WebAuthn revision; hand-built TokenBinding objects with typo'd statuses that blow up later at parcel-unmarshal time rather than at construction.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of microg/GmsCore@157c9d86ac (2026-09-06). Data as JSON: /api/errors/d77ed0a43c9f18db. Report an issue: GitHub.

Appendix: source

Thrown at play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/TokenBinding.java:154

        SUPPORTED("supported"),
        /**
         * The client does not support token binding.
         */
        NOT_SUPPORTED("not-supported");

        @NonNull
        private final String value;

        TokenBindingStatus(@NonNull String value) {
            this.value = value;
        }

        @Hide
        public static TokenBindingStatus fromString(String str) throws UnsupportedTokenBindingStatusException {
            for (TokenBindingStatus value : values()) {
                if (value.value.equals(str)) return value;
            }
            throw new UnsupportedTokenBindingStatusException("TokenBindingStatus " + str + " not supported");
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(value);
        }

        @Override
        public int describeContents() {
            return 0;
        }

        public static final Creator<TokenBindingStatus> CREATOR = new Creator<TokenBindingStatus>() {
            @Override
            public TokenBindingStatus createFromParcel(Parcel in) {
                try {
                    return fromString(in.readString());
                } catch (UnsupportedTokenBindingStatusException e) {

View on GitHub (pinned to 157c9d86ac)