I'm developing on an application at the moment which contains quite a lot of personal user information - things like Facebook contacts, etc ... Now, one of the things I want to be able to do (and have done, quite effectively) is open up parts of the application to "3rd Party" applications, using Android's build-in inter-process communication protocol (AIDL). So far so good.

Here's the catch: because we're involved in handling quite a lot of personal information, we have to be quite careful about who can and can't access it; specifically, only "Trusted" applications should be able to do so. So the natural way to do this is to use a custom permission within the AndroidManifest.xml file where we declare the services. My problem is this: I want to be able to enact signature-level protection (similar to the normal "signature" permission level), but with a bit of a catch:

I don't only want application signed with our internal signature to be able to access the services. I'd like to be able to build a list of "trusted signatures" &amp; at runtime (or if there's a better way, then maybe some other time?) be able to check incoming requests against this list of trusted keys.

This would satisfy the security constraints in the same way as the normal "signature" permission level I think - only programs on the "trusted keys list" would be able to access the services, and keys are hard to spoof (if possible at all?) - but with the added bonus that we wouldn't have to sign every application making use of the APIs with our internal team's key.

Is this possible at the moment in Android? And if so, are there any special requirements?

Thanks


Question: Twisted pair cable twists and unwanted signals issue
Answer: A 'voltage' as such, is very difficult to measure.  In fact, it's hard to even define it.  What's always used is a 'voltage difference'.  A typical 'AA' battery uses chemical energy to keep a voltage difference of 1.5V between its contact points.  A light bulb will light up when a voltage difference forces electric charges to flow through its filament.

Think of a waterfall, the energy of the fall depends only on the difference between the altitude at the top and the bottom of the fall.  it doesn't matter if it occurs on top of a mountain or at sea level, as long as the fall itself is the same length.

in old 'single ended' signals (like rs-232, a parallel port, old IDE), bits are represented by the voltage of individual wires.... and a 'reference point' (or ground connection).  it's always a voltage difference, but the reference is constant, so it's not always mentioned.

in 'differential signals' (ethernet, 'ultra scsi', any modern serial port (USB, SATA, SAS, FireWire, even PCI-ex!)), each signal is carried by two wires, usually twisted together (or very close traces on a printed board), and the receiver doesn't use a common reference point to measure the voltage difference, it uses the difference between the two signal wires.  This way, it doesn't matter if wire A is 22v and wire B is 25V, or A is -10v and B is -7V; it only matters that B is 3V higher than A.