# Design Notes on Open-Keychain

This document contains notes on the software design of open keychain. Points
with a * are yet to be implemented.


## Database design

The database has two distinct types of tables:
- The key\_ring\_{public,secret} tables, which hold binary blobs of all known
  public and private keys, respectively, and nothing else.
- All other tables, which cache information about key rings in a consistent
  manner. This information includes various pieces of metadata about each key's
  subkeys, user ids, and certificates.

### Constraints

All tables in the database have FOREIGN KEY constraints related to the
key\_ring\_public table. This is also true for the key\_ring\_secret table,
which means that secret keys cannot exist in the database without their public
key counterparts. This has implications in particular on the order of insertion
for private key rings and their public key ring counterparts into the database,
even more so when editing a key ring is edited.

### Cache usage considerations

It is of note that extraction of metadata from key rings is in some cases a
surprisingly expensive operation. As a prime example (heh), properly extracting
a key's associated primary user id requires examination and possibly
verification of all self-certificates, which in turn requires examination of
all certificates.

To ensure consistency, each type of metadata must be extracted one way in
exactly one routine. For this reason, it is often desirable to make use of
cached data even when the underlying pgp key ring objects are contextually
available.


## Further work / WIP

### Separation of concerns

Roughly speaking, the crypto code should be strictly separated from the android
code. At the time of this writing (30.04.14), most of these thoughts are yet to
be put into practice.

There are three aspects to OK which should be kept largely separate:
- Firstly, there is Code dealing with pgp and crypto. This code exclusively makes
  use of the BouncyCastle library. It lives in the .pgp package.
- Secondly, there is code dealing with user interface and system integration,
  which makes exclusive use of Android classes.
- Between these, there is glue code that is responsible for mapping pgp objects
  to the database, and calling methods provided by the crypto code from the ui
  code.

