There are two ways how B could get its capability. Either B asks C to give them, or A asks C to send one (of the capabilities it has from C) to B.
Both operations work out of the box. A and B do not trust each other and C do not need a cmp().
I have to say I am at a loss how I can explain it further.
Perhaps we could discuss this offline e.g. via IRC.
Here a summary: A can not ask C to send one, because this would either mean C has to make a blocking call to B, or B has to make a blocking call to A _and_ trust A to forward the request to C. B really wants to make sure that it gets its own new mapping of the capability from C, and not from A.
How does it get the capability the first time?
Bernhard