For an attacker with enough means, the private keys can always be exfiltrated, and content can be intercepted, but usually there are much simpler solutions for snooping on encrypted content: the devil is in the (implementation) details (this link is an illustration, and by no means an exhaustive list).
Cryptography is always simpler to go around than to break. So never be satisfied with a cryptography only (or protocol only) audit. There are near infinite of ways to neutralize encryption with a single line of code in a client.
The architecture is also essential. Client-Server encryption has entirely different use cases than Client-Client encryption (EE2E).
And finally, Schneier’s law:
Any person can invent a security system so clever that she or he can’t think of how to break it.