`loadKey()` doesn't call `setPrivateKey()` so it's hard to see how `setPrivateKey()`'s calling `loadKey()` would result in an infinite loop. `loadKey()` conditionally calls `setPublicKey()`, sure, but `setPrivateKey()` isn't called anywhere.  And `setPublicKey()`, although called by `loadKey()`, doesn't, itself, call `setPublicKey()`.

I can't comment too much on #317 as I haven't really looked at it yet.

>  Instead of creating yet another instance of Crypt_RSA where you call loadKey() to check whether the key is valid, you should extract whatever logic loadKey() has to decide whether it is a correct key into a new method and just call that instead.

Certainly that could be done. idk most things can be done any number of ways. The `__clone()` function could have the logic from the constructor in it and the constructor could conditionally call `__clone()` itself instead of doing everything itself. Both work and I don't see either as being clearly deficient to the other (and I don't think that the deficiencies that have been alleged are legitimate).