OpenSSL is a library for general-purpose cryptography. OpenSSL is also an open-source command line tool that is commonly used to generate private keys, create CSRs, install your SSL/TLS certificate, and identify certificate information.
Build + Install
#!/bin/bash -xe#For X86export ARCH=""export CROSS_COMPILE=""export OPENSSL_TARGET=""#For arm64, source toolchain and set the below config<<ARM64export ARCH=arm64export CROSS_COMPILE="aarch64-linux-gnu-"export OPENSSL_TARGET=linux-aarch64ARM64echo"Download OpenSSL 1.1.1g"wgethttps://www.openssl.org/source/openssl-1.1.1g.tar.gzecho"untaring... openSSL"tar-xfopenssl-1.1.1g.tar.gzcdopenssl-1.1.1gecho"Configuring OpenSSL"./Configure ${OPENSSL_TARGET} shared-pg-fPIC--cross-compile-prefix=$CROSS_COMPILE--prefix=/tmp/openssl11--openssldir=/tmp/openssl11/etc/sslecho"Building ..."make-j8echo"Installing ...."makeinstall_swDESTDIR=<pathtostagingdir>
Successful compilation directs output into 3 directories
export LD_LIBRARY_PATH=<path till lib dir>./bin/opensslversion-a
Commands
These commands are for "secp384r1" curve. The same applies to other supported curves.
# check the version of opensslopensslversion-a# Get a random numberopensslrand-hex64# Generate Private key for secp384 curveopensslecparam-genkey-namesecp384r1-outprivatekey.pem# Generate Certificate for a given private key opensslreq-new-sha256-keyprivatekey.pem-outcsr.csr-subj"/C=US/ST=FL/L=Orlando/O=Foo LLC/OU=IT/CN=www.example.com"# Generate Public key for given private key and certificate.opensslreq-x509-sha256-days365-keyprivatekey.pem-incsr.csr-outpublickey.pem# Start server instance on port 8443openssls_server-tls1_3-accept8443-certpublickey.pem-curvessecp384r1-keyprivatekey.pem# Connect to the server with the clientopenssls_client-tls1_3-curvessecp384r1-connect<server_ip>:8443
-engine <engine name> : Accelarate with specified engine
-tls1_3 : Use TLSv1.3 for communication
-quiet: less verbose
-rand <path to node > : use the specified random number from node instead of kernel entrophy
API's
Leverage custom engine
OpenSSL provides flexibility to offload operations onto custom HW. The below code leverages the engine to perform all OpenSSL operations
ENGINE_load_builtin_engines();
ENGINE *e = ENGINE_by_id("engine name");
// Make the engine's implementations the default implementations
ENGINE_init(e)
ENGINE_set_default_digests(e)
// Set default engine
ENGINE_set_default(e, ENGINE_METHOD_ALL);
// Free the engine
ENGINE_free(e);
ENGINE_cleanup();
// Perform point multiplication
ret = EC_POINT_mul(ecgroup, pub_key, privKeyBN, NULL, NULL, ctx);
Engine
OpenSSL provides flexibility to offload operations onto custom HW.
openssl command searches for the custom engine library (so) in
default : /usr/lib/engines-1.1/
OpenSSL : <path to openssl>/lib/engines-1.1/
Check Custom Engine
openssl engine <engine name>
-engine <engine name>
Benchmarking
# Benchmark all curves ecdsa operationsopensslspeed-elapsedecdsa# Benchmark single curve ecdsa operationsopensslspeed-elapsedecdsap384# Benchmark all curves point multiplicationopensslspeed-elapsedecdh# Benchmark single curve point multiplicationopensslspeed-elapsedecdhp384
-elapsed gives wall clock time ( actual time lapse ).
Without elapsed it measures only active CPU time.
-multi <n> : runs on multiple instances on multiple cores.