Usage of OpenPACE

Using libeac

OpenPACE is a native C library on top of OpenSSL. If you want to know how to use OpenPACE from C/C++, have a look at our API documentation.

OpenPACE uses SWIG to offer bindings in some more programming languages. The bindings are easily portable to lots of different languages. Currently, native language bindings need to be explicitly turned on with ./configure --enable-...

If you have chosen to install OpenPACE in a non-standard location you have to set up the LD_LIBRARY_PATH environment variable correctly. One way to do this on Linux is:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libeac

If OpenPACE is compiled for Javascript, it results in a standalone Javascript file that can be used without special requirements.

More details and a number of examples for using the library are covered here:

New in version 1.1.2: Added wrappers for OpenSSL’s OBJ_* functions

New in version 1.0: Added support for certificate signing requests (CVC_verify_request_signature(), CVC_verify_authentication_request_signatures(), certificate_request_print(), certificate_authentication_request_print())

Using cvc-create to Create the EAC PKI

Usage: cvc-create [OPTION]...
Create a card verifiable certificate

  -h, --help                 Print help and exit
  -V, --version              Print version and exit
      --out-cert=FILENAME    Where to save the certificate
                               (default=`CHR.cvcert')
      --role=ENUM            The terminal's role  (possible values="cvca",
                               "dv_domestic", "dv_foreign", "terminal")
      --type=STRING          Type of the terminal. Known values are "at"
                               (Authentication Terminal), "is" (Inspection
                               System), "st" (Signature Terminal),
                               "derived_from_signer" (uses the the signer's
                               CVC type), any other value is interpreted as
                               object identifier.
                               (default=`derived_from_signer')
      --chat=HEXSTRING       Raw Card Holder Authorization Template (CHAT).
                               This option will overwrite any terminal specific
                               effective authorization (see options for
                               AT/IS/ST).
      --issued=YYMMDD        Date the certificate was issued  (default=`today')
      --expires=YYMMDD       Date until the certicate is valid
      --sign-with=FILENAME   Private key for signing the new certificate
      --scheme=ENUM          Signature scheme that the new terminal will use
                               (possible values="ECDSA_SHA_1",
                               "ECDSA_SHA_224", "ECDSA_SHA_256",
                               "ECDSA_SHA_384", "ECDSA_SHA_512",
                               "RSA_v1_5_SHA_1", "RSA_v1_5_SHA_256",
                               "RSA_v1_5_SHA_512", "RSA_PSS_SHA_1",
                               "RSA_PSS_SHA_256", "RSA_PSS_SHA_512")

 Mode: csr
  The properties of the certificate are derived from the given signing request.
      --csr=FILENAME         Certificate signing request with the attributes

 Mode: manual
  The properties of the certificate are derived from the command line switches.
      --chr=CCH...HSSSSS     Certificate holder reference (2 characters ISO
                               3166-1 ALPHA-2 country code, 0-9 characters
                               ISO/IEC 8859-1 holder mnemonic, 5 characters
                               ISO/IEC 8859-1 numeric or alphanumeric sequence
                               number)
      --sign-as=FILENAME     CV certificate of the entity signing the new
                               certificate  (default=`self signed')
      --key=FILENAME         Private key of the Terminal  (default=`derived
                               from signer')
      --out-key=FILENAME     Where to save the derived private key
                               (default=`CHR.pkcs8')

Options for an Authentication Terminal (AT):
      --out-desc=FILENAME    Where to save the encoded certificate description
                               (default=`CHR.desc')
      --cert-desc=FILENAME   Terms of usage as part of the certificate
                               description (*.txt, *.html or *.pdf)
      --issuer-name=STRING   Name of the issuer of this certificate
                               (certificate description)
      --issuer-url=URL       URL that points to informations about the issuer
                               of this certificate (certificate description)
      --subject-name=STRING  Name of the holder of this certificate
                               (certificate description)
      --subject-url=URL      URL that points to informations about the subject
                               of this certificate (certificate description)
      --write-dg17           Allow writing DG 17 (Normal Place of Residence)
                               (default=off)
      --write-dg18           Allow writing DG 18 (Community ID)  (default=off)
      --write-dg19           Allow writing DG 19 (Residence Permit I)
                               (default=off)
      --write-dg20           Allow writing DG 20 (Residence Permit II)
                               (default=off)
      --write-dg21           Allow writing DG 21 (Optional Data)  (default=off)
      --at-rfu32             Allow RFU R/W Access bit 32  (default=off)
      --at-rfu31             Allow RFU R/W Access bit 31  (default=off)
      --at-rfu30             Allow RFU R/W Access bit 30  (default=off)
      --at-rfu29             Allow RFU R/W Access bit 29  (default=off)
      --read-dg1             Allow reading DG 1   (Document Type)
                               (default=off)
      --read-dg2             Allow reading DG 2   (Issuing State)
                               (default=off)
      --read-dg3             Allow reading DG 3   (Date of Expiry)
                               (default=off)
      --read-dg4             Allow reading DG 4   (Given Names)  (default=off)
      --read-dg5             Allow reading DG 5   (Family Names)  (default=off)
      --read-dg6             Allow reading DG 6   (Religious/Artistic Name)
                               (default=off)
      --read-dg7             Allow reading DG 7   (Academic Title)
                               (default=off)
      --read-dg8             Allow reading DG 8   (Date of Birth)
                               (default=off)
      --read-dg9             Allow reading DG 9   (Place of Birth)
                               (default=off)
      --read-dg10            Allow reading DG 10  (Nationality)  (default=off)
      --read-dg11            Allow reading DG 11  (Sex)  (default=off)
      --read-dg12            Allow reading DG 12  (Optional Data)
                               (default=off)
      --read-dg13            Allow reading DG 13  (default=off)
      --read-dg14            Allow reading DG 14  (default=off)
      --read-dg15            Allow reading DG 15  (default=off)
      --read-dg16            Allow reading DG 16  (default=off)
      --read-dg17            Allow reading DG 17  (Normal Place of Residence)
                               (default=off)
      --read-dg18            Allow reading DG 18  (Community ID)  (default=off)
      --read-dg19            Allow reading DG 19  (Residence Permit I)
                               (default=off)
      --read-dg20            Allow reading DG 20  (Residence Permit II)
                               (default=off)
      --read-dg21            Allow reading DG 21  (Optional Data)
                               (default=off)
      --install-qual-cert    Allow installing qualified certificate
                               (default=off)
      --install-cert         Allow installing certificate  (default=off)
      --pin-management       Allow PIN management  (default=off)
      --can-allowed          CAN allowed  (default=off)
      --privileged           Privileged terminal  (default=off)
      --rid                  Allow restricted identification  (default=off)
      --verify-community     Allow community ID verification  (default=off)
      --verify-age           Allow age verification  (default=off)

Options for a Signature Terminal (ST):
      --st-rfu5              Allow RFU bit 5  (default=off)
      --st-rfu4              Allow RFU bit 4  (default=off)
      --st-rfu3              Allow RFU bit 3  (default=off)
      --st-rfu2              Allow RFU bit 2  (default=off)
      --gen-qualified-sig    Generate qualified electronic signature
                               (default=off)
      --gen-sig              Generate electronic signature  (default=off)

Options for an Inspection System (IS):
      --read-eid             Read access to eID application (Deprecated)
                               (default=off)
      --is-rfu4              Allow RFU bit 4  (default=off)
      --is-rfu3              Allow RFU bit 3  (default=off)
      --is-rfu2              Allow RFU bit 2  (default=off)
      --read-iris            Read access to ePassport application: DG 4 (Iris)
                               (default=off)
      --read-finger          Read access to ePassport application: DG 3
                               (Fingerprint)  (default=off)

Report bugs to https://github.com/frankmorgner/openpace/issues

Written by Frank Morgner <frankmorgner@gmail.com>

Below you see an example of how to create a certificate chain of CVCA, DVCA and a Terminal:

# Create country verifying CA's private key
openssl ecparam -out ZZATCVCA00001.pem -name prime192v1 -genkey -param_enc explicit
openssl pkcs8 -topk8 -nocrypt -in ZZATCVCA00001.pem -outform DER -out ZZATCVCA00001.pkcs8
# Create self signed country verifying CA certificate
cvc-create --role=cvca --type=at --chr=ZZATCVCA00001 --expires=`date --date="next year" "+%^y%^m%^d"` --sign-with=ZZATCVCA00001.pkcs8 --scheme=ECDSA_SHA_256 --rid

# Create DVCA certificate signed by CVCA and generate its private key
cvc-create --role=dv_domestic --chr=ZZATDVCA00001 --expires=`date --date="next month" "+%^y%^m%^d"` --sign-with=ZZATCVCA00001.pkcs8 --sign-as=ZZATCVCA00001.cvcert --scheme=ECDSA_SHA_256 --rid

# Create plain text description
echo "whatever" > ZZATTERM00001.txt
# Create TERM certificate signed by DVCA along with the description and generate its private key
cvc-create --role=terminal --chr=ZZATTERM00001 --expires=`date --date="next week" "+%^y%^m%^d"` --sign-with=ZZATDVCA00001.pkcs8 --sign-as=ZZATDVCA00001.cvcert --scheme=ECDSA_SHA_256 --rid --cert-desc=ZZATTERM00001.txt --issuer-name=DVCA --subject-name=TERM

The script generate-eac-pki.sh generates a set of authentication terminals and signature terminals for all signature schemes in all standardized elliptic curves.

New in version 1.1.0: Added support for arbitrary terminal types (--type)

New in version 1.1.0: Added support for arbitrary CHATs (--chat)

New in version 1.0: - Added support for certificate signing requests (--csr) - Renamed --out to --out-cert and added --out-desc, --out-key

New in version 0.9: Created cvc-create for generating a EAC PKI of Authentication Terminals, Signature Terminals or Inspection Systems.

Using cvc-print

Usage: cvc-print [OPTION]...
Prints card verifiable certificate and its description

  -h, --help                  Print help and exit
  -V, --version               Print version and exit
  -c, --cvc=FILENAME          Card Verifiable Certificate
  -d, --description=FILENAME  Certificate description
  -r, --csr=FILENAME          Certificate request
      --cvc-dir=DIRECTORY     Directory of trusted CVCs

Report bugs to https://github.com/frankmorgner/openpace/issues

Written by Frank Morgner and Dominik Oepen

Below you see of how to print the certificates created in the example above:

cvc-print --cvc ZZATCVCA00001.cvcert
cvc-print --cvc ZZATDVCA00001.cvcert
cvc-print --cvc ZZATTERM00001.cvcert --description ZZATTERM00001.desc

New in version 1.1.3: Added --disable-cvc-validity-check

New in version 1.0.2: Added --cvc-dir

New in version 1.0: Added support for certificate signing requests (--csr)

New in version 0.8: Created cvc-print for printing card verifiable certificates.

Creating the Document PKI and EF.CardAccess/EF.CardSecurity

The card’s key agreement capabilities can be read by the terminal from EF.CardAccess. The standardized domain parameter for CA (e.g. brainpoolP256r1/0x0D) need to match the key agreement scheme for CA (e.g. ECDH):

asn1=SET:SecurityInfos

[SecurityInfos]
tainfo=SEQUENCE:TerminalAuthenticationInfo
cainfo=SEQUENCE:ChipAuthenticationInfo
chipauthenticationdomainparameterinfo=SEQUENCE:ChipAuthenticationDomainParameterInfo

[TerminalAuthenticationInfo]
# id-TA
protocol=OID:0.4.0.127.0.7.2.2.2
version=INTEGER:0x02

[ChipAuthenticationInfo]
# id-CA-ECDH-AES-CBC-CMAC-128
protocol=OID:0.4.0.127.0.7.2.2.3.2.2
version=INTEGER:0x02

[ChipAuthenticationDomainParameterInfo]
# id-CA-ECDH
protocol=OID:0.4.0.127.0.7.2.2.3.2
aid=SEQUENCE:AlgorithmIdentifier

[AlgorithmIdentifier]
# standardizedDomainParameters
algorithm=OID:0.4.0.127.0.7.1.2
# brainpoolP256r1
parameter=INTEGER:0x0D

The above example can be found in doc/efcardaccess_asn1.conf. OpenSSL can translate this into its ASN.1 represantation, which gives us EF.CardAccess:

openssl asn1parse -genconf efcardaccess_asn1.conf -out efcardaccess.dump

In EF.CardSecurity the data of EF.CardAccess including the CA public key of the chip is signed by the document signer. First we create the CSCA and the document signer:

# Create the country signing CA's private key
openssl ecparam -out csca_key.pem -name brainpoolP256r1 -genkey -param_enc explicit
# Create the country verifying CA's self signed certificate
openssl req -new -x509 -days 5000 -key csca_key.pem -out csca_cert.pem

# Create the document signer's private key
openssl ecparam -out docsigner_key.pem -name brainpoolP256r1 -genkey -param_enc explicit
# Create the document signer's certificate (signing request)
openssl req -new -key docsigner_key.pem -out docsigner.csr
openssl x509 -req -in docsigner.csr -CA csca_cert.pem -CAkey csca_key.pem -CAcreateserial -out docsigner_cert.pem

Now generate the chip’s private key for CA and print its (public) key:

# Create chip's key
openssl ecparam -out card_key.pem -name brainpoolP256r1 -genkey -param_enc explicit
# Print the public key and copy it to the clipboard
openssl ec -in card_key.pem -text

Finally we can create EF.CardSecurity by adding the card’s public key to the last line of our template and signing the content with the document signer’s key:

# Add the public key (without ':' and ' ') to the template for EF.CardSecurity
cp doc/efcardsecurity_templ_asn1.conf efcardsecurity_asn1.conf && vi efcardsecurity_asn1.conf

# Create and sign EF.CardSecurity
openssl asn1parse -genconf efcardsecurity_asn1.conf -out efcardsecurity_content.dump
openssl cms -sign -nodetach -binary -in efcardsecurity_content.dump -inform DER -signer docsigner_cert.pem -inkey docsigner_key.pem -econtent_type 0.4.0.127.0.7.3.2.1 -noattr -outform DER -out efcardsecurity.dump