Except for this reference to `self.ffi.NULL` this cipher registry stuff is almost completely api agnostic.  Even register_cipher_adapter (which presumably all ciphers will need) doesn't reference `evp`, `self.lib` or `self.ffi` at all.  I could imagine instead the adapters doing:

```python
if evp_cipher != self.ffi.NULL:
  return evp_cipher

return None
```

And the interface for adapters being, "A callable that takes an api, cipher, and mode and returns an api specific object or None."