**OpenPGP card client library**
This project implements a client library for the
[OpenPGP card](https://gnupg.org/ftp/specs/OpenPGP-smart-card-application-3.4.1.pdf)
specification, in Rust.
The project consists of a number of crates:
- [openpgp-card](https://crates.io/crates/openpgp-card), which offers an
implementation-agnostic, relatively low level OpenPGP card client API.
It is PGP implementation agnostic.
- [openpgp-card-sequoia](https://crates.io/crates/openpgp-card-sequoia),
a higher level API for conveniently using openpgp-card with
[Sequoia PGP](https://sequoia-pgp.org/).
- [openpgp-card-pcsc](https://crates.io/crates/openpgp-card-pcsc),
a backend to communicate with smartcards via pcsc.
- [openpgp-card-scdc](https://gitlab.com/hkos/openpgp-card/-/tree/main/scdc),
a backend to communicate with smartcards via an scdaemon instance.
- [openpgp-card-tests](https://gitlab.com/hkos/openpgp-card/-/tree/main/card-functionality),
a testsuite to run OpenPGP card operations on smartcards.
**Architecture**
```mermaid
graph BT
OP["openpgp-card-pcsc
(pcsclite backend)"] --> OC
OS["openpgp-card-scdc
(scdaemon backend)"] --> OC["openpgp-card
(low level API)"]
OC --> OCS["openpgp-card-sequoia
(high level, sequoia based API)"]
OC -.-> U1[non-sequoia/low level user application]
OCS -.-> U2[sequoia-based user application]
classDef userApp stroke-dasharray: 5 5;
class U1,U2 userApp;
```
The backends implement very simple transport functionality. They can send
APDU commands and receive responses. All OpenPGP card-specific logic,
as well as command chaining are handled in `openpgp-card`.
**Acknowledgements**
This project is based on the
[OpenPGP Card spec](https://gnupg.org/ftp/specs/OpenPGP-smart-card-application-3.4.1.pdf),
version 3.4.1.
Other helpful resources included:
- The free [Gnuk](https://git.gniibe.org/cgit/gnuk/gnuk.git/)
OpenPGP card implementation by [gniibe](https://www.gniibe.org/).
- The Rust/Sequoia-based OpenPGP card client code in
[kushaldas](https://kushaldas.in/)' project
[johnnycanencrypt](https://github.com/kushaldas/johnnycanencrypt/).
- The [scdaemon](https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=tree;f=scd;hb=refs/heads/master)
client implementation by the [GnuPG](https://gnupg.org/) project.
- The [open-keychain](https://github.com/open-keychain/open-keychain) project,
which implements an OpenPGP card client for Java/Android.
- The Rust/Sequoia-based OpenPGP card client code by
[Robin Krahl](https://git.sr.ht/~ireas/sqsc).