Conversation
InstanceID failures could be suppressed into an empty string. The empty credential was then exposed as a successful getIidToken response, signed, and included in a GetVerifiedPhoneNumbers request. Propagate InstanceID failures to the existing error handlers and reject empty credentials before reading the FID, signing, building IIDTokenAuth, or executing GPNV. Regression tests cover exceptions, empty credentials, and the valid request path. PR microg#3388 handles IID failures in a different Constellation implementation. This change applies equivalent error semantics plus explicit empty-token and GPNV guards to the microg#3359 architecture.
A regenerated EC key was allowed to inherit the previous key's server acknowledgement. Validate stored key material before reading that state, and reset it atomically whenever key material is generated. Add instrumentation coverage for corrupt and valid stored key pairs.
Align DG cache naming and VM keys with stock GMS, preserve partial init replies, and fall back to phone number hints during Constellation provisioning.
Introduce shared phone-number and VM cache utilities, wire them into Constellation and DroidGuard, and add offline JUnit coverage for provisioning and tachyon-related logic.
…ctory hasAccount in NetworkHandleProxyFactory.createRequest() was hardcoded to false. This reads the value dynamically from AccountManager for 'com.google' accounts, incorporating a SecurityException fallback to false.
|
This addresses the My branch is built directly on #3784's head: naormeit/GmsCore@rcs-bounty-2994...juliushill42:GmsCore:rcs-2994-spatula-fix What the delta does:
Focused tests, lint, and No hardware install has been performed yet; Binder permission/lifecycle and end-to-end RCS provisioning still need device validation. This is intentionally scoped as a narrow contribution on top of #3784, not a new Constellation/Asterism implementation. |
|
There is now a direct empirical link for the small consent-semantics follow-up in naormeit#3. Earlier in #2994, @unpluggederan tested the real SetConsent endpoint and reported that a request with #3784's existing Asterism SetConsent path already uses those version/trigger semantics, but the separate automatic-consent fallback in The two KeelTrace commits in naormeit#3 only align that fallback with the known-working/request-accepted semantics and add regression coverage:
Verification is green for focused JUnit, changed-module lint, and an independent This is a narrow correctness contribution on top of #3784, not a separate #2994 implementation or full-bounty claim. |
…nsent request semantics Incorporates two commits from keeltrace that fix the automatic-consent fallback in VerifyPhoneNumber.kt: - fix(constellation): align automatic RCS consent request - test(constellation): cover automatic RCS consent semantics Co-Authored-By: keeltrace <keeltrace@users.noreply.github.com> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Assemble the ordered PDU parts from a single SMS_RECEIVED broadcast before matching and buffering the logical message. Reject missing parts and keep the first available sender. Co-authored-by: Codex <codex@openai.com>
Cover multipart ordering, invalid or missing parts, and single-part/null-sender behavior. Co-authored-by: Codex <codex@openai.com>
Assemble ordered PDU parts from a single SMS_RECEIVED broadcast into one logical message before buffering and matching. Previously each PDU was treated as a separate ReceivedSms, so a challenge split across segments could never satisfy a pending match as one body. Also rejects empty broadcasts and broadcasts with any missing body part. Single-part behavior is unchanged. Co-authored-by: HumbleDrummer <HumbleDrummer@users.noreply.github.com>
Restore the complete timeout configuration reported from decompiled stock GMS: connect/read/write/call are all 60 seconds. The consolidated microg#3784 baseline retained only readTimeout(60s), leaving OkHttp defaults for connect/write and an unbounded call timeout. This can reproduce the earlier Sync/Proceed timeout failures during SMS verification flows whose server responses exceed OkHttp's 10-second defaults. Provenance: - Original bug discovery and real-device observation: @unpluggederan in microg#3360 - Prior implementation: @chenlinxi890-spec in microg#3596 - Foundragon delta: behavior-neutral client factory plus deterministic timeout regression in parent 687a236 Regression: - BEFORE at 276523b: [connect, read, write, call] = [10s, 60s, 10s, 0] - AFTER: [60s, 60s, 60s, 60s] Physical RCS E2E remains NOT YET PHYSICALLY VERIFIED.
This PR implements the GMS services required for RCS provisioning, addressing issue #2994 where Google Messages displays "RCS chats aren't available for this device" or hangs on "Setting up...". Previously, Constellation (GmsService 155, phone number verification) and Asterism (GmsService 199, RCS ToS/consent) were bound to DummyService. This also resolves DroidGuard tachyon_registration token rejections caused by cache path discrepancies visible to DG via /proc/self/maps.
Fixes #2994.
Contributors & Changes:
@opstic: Implemented Constellation and Asterism from scratch (Implement
play-services-constellation#3359, Implementplay-services-asterism#3360), including AIDL interfaces, proto definitions, gRPC clients, all verification paths (UPI/OTP, MO-SMS, MT-SMS, TS.43 EAP-AKA), and Phenotype flags for Messages/IMS.@br413: Provided DroidGuard tachyon parity fixes (RCS: DroidGuard tachyon fixes, phone-number fallback, and unit tests (#2994) #3644): Changed
getDir("cache_dg")toapp_dg_cache/, uppercased VM cache key hex, fixedDroidGuardInitReply.createFromParcel()null handling, and added phone number hint fallback when E.164 is null.@camilo-12ch: Fixed the IID empty token issue.
getIidToken()no longer returns""on failure, preventing empty credentials from reaching Google's GPNV endpoint.@paulcakeface: Fixed the public-key ack ordering bug. The EC key is now validated/regenerated before
isPublicKeyAcked()is read. Includes regression test.@nwinkelman2: Integrated and repaired the branches. Fixed all 11 Android lint errors, fixed the instrumentation manifest, removed the unsubstantiated custom DG classloader experiment, and fixed a false JVM Parcel round-trip assertion in tests, achieving a CI-green branch for Debug and Release.
@keeltrace: Fixed the automatic RCS consent fallback in
VerifyPhoneNumber.kt. The auto-consent path now usesRCS_CONSENTforrcs_consent.consent_versionandCONSENT_API_TRIGGERinRequestHeader, matching the known-accepted semantics from [BOUNTY] RCS Support [14999$] #2994 testing. Includes regression tests.@HumbleDrummer: Fixed multipart MT-SMS assembly in
MtSmsInbox. Assembles ordered PDU parts from a singleSMS_RECEIVEDbroadcast into one logical message before matching, preventing split challenges from failing verification. Includes unit tests.@Anusha0501: Added X-Goog-Spatula header injection via
AppCertServicebinding inconstellation-core, with 30-minute cache (avoids circular dependency on play-services-core). FixedAppCertManager's Android-ID fallback which was building the proto then returning null. Added Asterism consent fallback torcs_consentwhen no Gaia entry exists for the RCS client. Corrected TS.43 EAP-AKA to use a consistent identity throughout; entitlement requests now populate terminal vendor/model/SW fromBuild.*when omitted.Author (This PR): Implemented
hasAccountcorrectness fix inNetworkHandleProxyFactory.createRequest(). Replaced hardcodedhasAccount = falsewith dynamic reading fromAccountManagerforcom.googleaccounts (withSecurityExceptionfallback to false).Out of Scope / Not Claimed:
TS.43 carrier testing (no SIM available).
Locked-bootloader E2E hardware test — tester recruitment in progress.
Testing:
Lint (all three modules): 0 errors — BUILD SUCCESSFUL locally.
Unit tests: CI green on base branch (nwinkelman2/integration/rcs-current-upstream).
Hardware E2E: Pending — tester being recruited by community (see RCS: consolidated Constellation/Asterism hardening for #2994 #3808 discussion).