Support SHA-1 digests in configuration

This commit is contained in:
Marvin W 2020-10-15 19:07:37 +02:00
parent 8f22b3f6be
commit c474fce454
No known key found for this signature in database
GPG Key ID: 072E9235DB996F2A
2 changed files with 8 additions and 10 deletions

View File

@ -5,7 +5,7 @@ SPDX-License-Identifier: CC-BY-SA-4.0
<img src="http://i.imgur.com/hXY4lcC.png" height="42px" alt="microG" /> Unified Network Location Provider <img src="http://i.imgur.com/hXY4lcC.png" height="42px" alt="microG" /> Unified Network Location Provider
========== ==========
[![Build Status](https://travis-ci.org/microg/android_packages_apps_UnifiedNlp.svg?branch=master)](https://travis-ci.org/microg/android_packages_apps_UnifiedNlp) [![Build Status](https://travis-ci.com/microg/UnifiedNlp.svg?branch=master)](https://travis-ci.com/microg/UnifiedNlp)
The next generation Network Location Provider, based on plugins. Usually abbreviated as UnifiedNlp. The next generation Network Location Provider, based on plugins. Usually abbreviated as UnifiedNlp.

View File

@ -12,12 +12,9 @@ import android.content.Intent
import android.content.ServiceConnection import android.content.ServiceConnection
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.Signature
import android.os.IBinder import android.os.IBinder
import android.os.RemoteException
import android.util.Log import android.util.Log
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import java.security.MessageDigest import java.security.MessageDigest
import java.security.NoSuchAlgorithmException import java.security.NoSuchAlgorithmException
@ -70,8 +67,9 @@ abstract class AbstractBackendHelper(private val TAG: String, private val contex
Log.w(TAG, "Intent is not properly resolved, can't verify signature. Aborting.") Log.w(TAG, "Intent is not properly resolved, can't verify signature. Aborting.")
return return
} }
if (signatureDigest != null && signatureDigest != firstSignatureDigest(context, serviceIntent.getPackage())) { val computedDigest = firstSignatureDigest(context, serviceIntent.getPackage(), if (signatureDigest?.length == 40) "SHA-1" else "SHA-256")
Log.w(TAG, "Target signature does not match selected package (" + signatureDigest + " = " + firstSignatureDigest(context, serviceIntent.getPackage()) + "). Aborting.") if (signatureDigest != null && signatureDigest != computedDigest) {
Log.w(TAG, "Target signature does not match selected package ($signatureDigest != $computedDigest). Aborting.")
return return
} }
try { try {
@ -86,7 +84,7 @@ abstract class AbstractBackendHelper(private val TAG: String, private val contex
companion object { companion object {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@SuppressLint("PackageManagerGetSignatures") @SuppressLint("PackageManagerGetSignatures")
fun firstSignatureDigest(context: Context, packageName: String?): String? { fun firstSignatureDigest(context: Context, packageName: String?, algorithm: String): String? {
val packageManager = context.packageManager val packageManager = context.packageManager
val info: PackageInfo? val info: PackageInfo?
try { try {
@ -97,15 +95,15 @@ abstract class AbstractBackendHelper(private val TAG: String, private val contex
if (info?.signatures.isNotNullOrEmpty()) { if (info?.signatures.isNotNullOrEmpty()) {
for (sig in info.signatures) { for (sig in info.signatures) {
sha256sum(sig.toByteArray())?.let { return it } digest(sig.toByteArray(), algorithm)?.let { return it }
} }
} }
return null return null
} }
private fun sha256sum(bytes: ByteArray): String? { private fun digest(bytes: ByteArray, algorithm: String): String? {
try { try {
val md = MessageDigest.getInstance("SHA-256") val md = MessageDigest.getInstance(algorithm)
val digest = md.digest(bytes) val digest = md.digest(bytes)
val sb = StringBuilder(2 * digest.size) val sb = StringBuilder(2 * digest.size)
for (b in digest) { for (b in digest) {