# Description

This C++ version is really just C plus namespaces. Namespaces are the 
only feature of C++ that is used

Separate ROM files provide the constants required for each curve. The
associated header files (big.h, fp.h and ecp.h) also specify 
certain constants that must be set for the particular curve.

# Installation and Testing

To build a library and see it in action, copy all of the files in this 
directory to a fresh directory. Then execute the python3 script config32.py 
for a 32-bit build, or config64.py for a 64-bit build, and select the curves 
that you wish to support. Note that support for 16-bit builds is currently 
somewhat limited - see config16.py. A library is built automatically 
including all of the modules that you will need.

The configuration files assume the g++ compiler. For clang++ edit the
config*.py files and substitute "clang++" for "g++".
Note that clang++ is about 10-15% faster.*

Make sure to use a 64-bit compiler on a 64-bit architecture.

---------------------------------------

To create a 32-bit library

    python3 config32.py

Then select options 1, 3, 7, 28, 30, 37, 38 and 42, which are fixed for the example 
programs. (For a 16-bit build select 1, 4 and 6). Select 0 then to exit.

Then compile

    g++ -O2  testecc.cpp core.a -o testecc

(if using MINGW-W64 in Windows change -o testecc to -o testecc.exe)

The test program exercises 3 different ordinary elliptic curves (for ECDH 
Key exchange, ECDSA signature and ECIES encryption), plus RSA, all in the 
one binary

Next compile

    g++ -O2  testeddsa.cpp core.a -o testeddsa

This test program exercises the EDDSA signature algorithm using the Edwards curves Ed25519 and Ed448


Next compile

    g++ -O2  testmpin.cpp core.a -o testmpin

This test program exercises 4 different pairing friendly curves using 
the MPIN authentication protocol.

The correct PIN is 1234


Next compile

    g++ -O2  testbls.cpp core.a -o testbls

This program implements the pairing-based BLS signature


Next compile 

    g++ -O2  benchtest_all.cpp core.a -o benchtest_all

This program provides some timings.

Finally

     g++ -O2  testnhs.cpp core.a -o testnhs

-------------------------------------------------

Alternatively building and testing can be combined via

    python3 configXX.py test

where XX can be 16, 32 or 64

Note that this builds the library for ALL of the options. 
Executables of the above test programs are created, and can be run immediately.

-------------------------------------------------

NEW: support for emerging Hash To Curve standard.
See https://datatracker.ietf.org/doc/draft-irtf-cfrg-hash-to-curve/


Create 32 or 64-bit library selecting curves 1, 2, 3, 7, 17 and 31 (Ed25519, C25519, NIST256, Ed448, SECP256K1 and BLS12381)

    g++ -O2 testhtp.cpp core.a -o testhtp

Test program runs through test vectors from the draft standard.

-------------------------------------------------

NEW: Experimental support for emerging HPKE (Hybrid Public Key Encryption) standard.
See https://datatracker.ietf.org/doc/draft-irtf-cfrg-hpke/

New hpke.cpp/.h api files

- Supports KEM_IDs for X25519, X448, P256 and P521
- Supports HDF_IDs for SHA256/512
- Supports AEAD_IDs for AES-GCM-128/256 only

Create 32 or 64-bit library selecting curves 2 and 10 (X25519 and P521)

    g++ -O2 testhpke.cpp core.a -o testhpke

Test program runs through test vectors for all modes 0-3.

---------------------------------------------------

*Using clang on Windows.
Download latest clang from http://releases.llvm.org/download.html.
Choose Clang for Windows (64-bit) (.sig).
Install a free version of Microsoft Visual C++ https://www.visualstudio.com/downloads/.
Now use "clang++" wherever "g++" was used before.
