{"record":{"id":"64c53b5ac32bfa54","repo":"microg/GmsCore","slug":"app-not-installed","errorCode":"APP_NOT_INSTALLED","errorMessage":"$callingPackage signature is null","messagePattern":"\\$callingPackage signature is null","errorType":"error_code","errorClass":"StandardIntegrityException","httpStatus":null,"severity":"error","filePath":"vending-app/src/main/kotlin/com/google/android/finsky/IntegrityExtensions.kt","lineNumber":110,"sourceCode":"const val PARAMS_PIA_EXPRESS_DEVICE_KEY = \"piaExpressDeviceKey\"\n\nconst val RESULT_UN_AUTH = \"<UNAUTH>\"\n\nprivate const val KEY_VERSION_MAJOR = \"playcore.integrity.version.major\"\nprivate const val KEY_VERSION_MINOR = \"playcore.integrity.version.minor\"\nprivate const val KEY_VERSION_PATCH = \"playcore.integrity.version.patch\"\n\nprivate const val DEVICE_INTEGRITY_SOFT_EXPIRATION_CHECK_PERIOD = 600L // 10 minutes\nprivate const val TEMPORARY_DEVICE_KEY_VALIDITY = 64800L // 18 hours\nprivate const val DEVICE_INTEGRITY_SOFT_EXPIRATION = 100800L // 28 hours\nprivate const val DEVICE_INTEGRITY_HARD_EXPIRATION = 432000L // 5 day\nconst val INTERMEDIATE_INTEGRITY_HARD_EXPIRATION = 86400L // 1 day\nprivate const val TAG = \"IntegrityExtensions\"\n\nfun callerAppToIntegrityData(context: Context, callingPackage: String): PlayIntegrityData {\n    val pkgSignSha256ByteArray = context.packageManager.getFirstSignatureDigest(callingPackage, \"SHA-256\")\n    if (pkgSignSha256ByteArray == null) {\n        throw StandardIntegrityException(IntegrityErrorCode.APP_NOT_INSTALLED, \"$callingPackage signature is null\")\n    }\n    val pkgSignSha256 = Base64.encodeToString(pkgSignSha256ByteArray, Base64.NO_WRAP)\n    Log.d(TAG, \"callerToVisitData $callingPackage pkgSignSha256: $pkgSignSha256\")\n    val playIntegrityAppList = VendingPreferences.getPlayIntegrityAppList(context)\n    val loadDataSet = PlayIntegrityData.loadDataSet(playIntegrityAppList)\n    if (loadDataSet.isEmpty() || loadDataSet.none { it.packageName == callingPackage && it.pkgSignSha256 == pkgSignSha256 }) {\n        return PlayIntegrityData(true, callingPackage, pkgSignSha256, System.currentTimeMillis())\n    }\n    return loadDataSet.first { it.packageName == callingPackage && it.pkgSignSha256 == pkgSignSha256 }\n}\n\nfun PlayIntegrityData.updateAppIntegrityContent(context: Context, time: Long, result: String, status: Boolean = false) {\n    val playIntegrityAppList = VendingPreferences.getPlayIntegrityAppList(context)\n    val loadDataSet = PlayIntegrityData.loadDataSet(playIntegrityAppList)\n    val dataSetString = PlayIntegrityData.updateDataSetString(loadDataSet, apply {\n        lastTime = time\n        lastResult = result\n        lastStatus = status","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/vending-app/src/main/kotlin/com/google/android/finsky/IntegrityExtensions.kt#L92-L128","documentation":"Integrity guard in IntegrityExtensions.callerAppToIntegrityData: the calling package's signature could not be read (PackageInfo.signature null), so the app cannot be fingerprinted for the Play Integrity verdict.","triggerScenarios":"Thrown at vending-app/src/main/kotlin/com/google/android/finsky/IntegrityExtensions.kt:110 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the calling package is installed and queryable with GET_SIGNATURES","Reject or fail-closed the integrity request when the signature cannot be resolved"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}