diff --git a/.gitignore b/.gitignore
index 49238abcc..0f9b391cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -379,6 +379,9 @@ IDE/XCODE/Index
/IDE/QNX/example-cmac/cmac-test
/IDE/QNX/CAAM-DRIVER/wolfCrypt
+# Xilinx
+/IDE/XilinxSDK/data
+
# Emacs
*~
diff --git a/IDE/XilinxSDK/2022_1/.gitignore b/IDE/XilinxSDK/2022_1/.gitignore
new file mode 100644
index 000000000..8fae7550d
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/.gitignore
@@ -0,0 +1,9 @@
+.analytics
+.metadata/
+_ide/
+Debug/
+Release/
+*/.gitignore
+
+vmk180/
+*.ld
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.cproject b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.cproject
new file mode 100644
index 000000000..1741fb770
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.cproject
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.project b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.project
new file mode 100644
index 000000000..23ce39a74
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.project
@@ -0,0 +1,1859 @@
+
+
+ wolfCrypt_FreeRTOS_example
+ Created by Vitis v2022.1
+
+ vmk180
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ com.xilinx.sdx.sdk.core.SdkProjectNature
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
+
+ inc
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl
+ 2
+ virtual:/virtual
+
+
+ src/IDE
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/callbacks.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/callbacks.h
+
+
+ inc/wolfssl/certs_test.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/certs_test.h
+
+
+ inc/wolfssl/crl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/crl.h
+
+
+ inc/wolfssl/error-ssl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/error-ssl.h
+
+
+ inc/wolfssl/include.am
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/include.am
+
+
+ inc/wolfssl/internal.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/internal.h
+
+
+ inc/wolfssl/ocsp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/ocsp.h
+
+
+ inc/wolfssl/openssl
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/options.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/options.h
+
+
+ inc/wolfssl/options.h.in
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/options.h.in
+
+
+ inc/wolfssl/quic.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/quic.h
+
+
+ inc/wolfssl/sniffer.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/sniffer.h
+
+
+ inc/wolfssl/sniffer_error.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/sniffer_error.h
+
+
+ inc/wolfssl/sniffer_error.rc
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/sniffer_error.rc
+
+
+ inc/wolfssl/ssl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/ssl.h
+
+
+ inc/wolfssl/test.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/test.h
+
+
+ inc/wolfssl/version.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/version.h
+
+
+ inc/wolfssl/version.h.in
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/version.h.in
+
+
+ inc/wolfssl/wolfcrypt
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfio.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfio.h
+
+
+ src/IDE/XilinxSDK
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/benchmark
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/src
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/test
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/openssl/aes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/aes.h
+
+
+ inc/wolfssl/openssl/asn1.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/asn1.h
+
+
+ inc/wolfssl/openssl/asn1t.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/asn1t.h
+
+
+ inc/wolfssl/openssl/bio.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/bio.h
+
+
+ inc/wolfssl/openssl/bn.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/bn.h
+
+
+ inc/wolfssl/openssl/buffer.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/buffer.h
+
+
+ inc/wolfssl/openssl/camellia.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/camellia.h
+
+
+ inc/wolfssl/openssl/cmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/cmac.h
+
+
+ inc/wolfssl/openssl/cms.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/cms.h
+
+
+ inc/wolfssl/openssl/compat_types.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/compat_types.h
+
+
+ inc/wolfssl/openssl/conf.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/conf.h
+
+
+ inc/wolfssl/openssl/crypto.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/crypto.h
+
+
+ inc/wolfssl/openssl/des.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/des.h
+
+
+ inc/wolfssl/openssl/dh.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/dh.h
+
+
+ inc/wolfssl/openssl/dsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/dsa.h
+
+
+ inc/wolfssl/openssl/ec.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ec.h
+
+
+ inc/wolfssl/openssl/ec25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ec25519.h
+
+
+ inc/wolfssl/openssl/ec448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ec448.h
+
+
+ inc/wolfssl/openssl/ecdh.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ecdh.h
+
+
+ inc/wolfssl/openssl/ecdsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ecdsa.h
+
+
+ inc/wolfssl/openssl/ed25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ed25519.h
+
+
+ inc/wolfssl/openssl/ed448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ed448.h
+
+
+ inc/wolfssl/openssl/engine.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/engine.h
+
+
+ inc/wolfssl/openssl/err.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/err.h
+
+
+ inc/wolfssl/openssl/evp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/evp.h
+
+
+ inc/wolfssl/openssl/fips_rand.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/fips_rand.h
+
+
+ inc/wolfssl/openssl/hmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/hmac.h
+
+
+ inc/wolfssl/openssl/include.am
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/include.am
+
+
+ inc/wolfssl/openssl/kdf.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/kdf.h
+
+
+ inc/wolfssl/openssl/lhash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/lhash.h
+
+
+ inc/wolfssl/openssl/md4.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/md4.h
+
+
+ inc/wolfssl/openssl/md5.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/md5.h
+
+
+ inc/wolfssl/openssl/modes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/modes.h
+
+
+ inc/wolfssl/openssl/obj_mac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/obj_mac.h
+
+
+ inc/wolfssl/openssl/objects.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/objects.h
+
+
+ inc/wolfssl/openssl/ocsp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ocsp.h
+
+
+ inc/wolfssl/openssl/opensslconf.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/opensslconf.h
+
+
+ inc/wolfssl/openssl/opensslv.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/opensslv.h
+
+
+ inc/wolfssl/openssl/ossl_typ.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ossl_typ.h
+
+
+ inc/wolfssl/openssl/pem.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/pem.h
+
+
+ inc/wolfssl/openssl/pkcs12.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/pkcs12.h
+
+
+ inc/wolfssl/openssl/pkcs7.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/pkcs7.h
+
+
+ inc/wolfssl/openssl/rand.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/rand.h
+
+
+ inc/wolfssl/openssl/rc4.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/rc4.h
+
+
+ inc/wolfssl/openssl/ripemd.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ripemd.h
+
+
+ inc/wolfssl/openssl/rsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/rsa.h
+
+
+ inc/wolfssl/openssl/sha.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/sha.h
+
+
+ inc/wolfssl/openssl/sha3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/sha3.h
+
+
+ inc/wolfssl/openssl/srp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/srp.h
+
+
+ inc/wolfssl/openssl/ssl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ssl.h
+
+
+ inc/wolfssl/openssl/ssl23.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ssl23.h
+
+
+ inc/wolfssl/openssl/stack.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/stack.h
+
+
+ inc/wolfssl/openssl/tls1.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/tls1.h
+
+
+ inc/wolfssl/openssl/txt_db.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/txt_db.h
+
+
+ inc/wolfssl/openssl/ui.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ui.h
+
+
+ inc/wolfssl/openssl/x509.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/x509.h
+
+
+ inc/wolfssl/openssl/x509_vfy.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/x509_vfy.h
+
+
+ inc/wolfssl/openssl/x509v3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/x509v3.h
+
+
+ inc/wolfssl/wolfcrypt/aes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/aes.h
+
+
+ inc/wolfssl/wolfcrypt/arc4.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/arc4.h
+
+
+ inc/wolfssl/wolfcrypt/asn.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/asn.h
+
+
+ inc/wolfssl/wolfcrypt/asn_public.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/asn_public.h
+
+
+ inc/wolfssl/wolfcrypt/async.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/async.h
+
+
+ inc/wolfssl/wolfcrypt/blake2-impl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/blake2-impl.h
+
+
+ inc/wolfssl/wolfcrypt/blake2-int.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/blake2-int.h
+
+
+ inc/wolfssl/wolfcrypt/blake2.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/blake2.h
+
+
+ inc/wolfssl/wolfcrypt/camellia.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/camellia.h
+
+
+ inc/wolfssl/wolfcrypt/chacha.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/chacha.h
+
+
+ inc/wolfssl/wolfcrypt/chacha20_poly1305.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/chacha20_poly1305.h
+
+
+ inc/wolfssl/wolfcrypt/cmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/cmac.h
+
+
+ inc/wolfssl/wolfcrypt/coding.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/coding.h
+
+
+ inc/wolfssl/wolfcrypt/compress.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/compress.h
+
+
+ inc/wolfssl/wolfcrypt/cpuid.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/cpuid.h
+
+
+ inc/wolfssl/wolfcrypt/cryptocb.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/cryptocb.h
+
+
+ inc/wolfssl/wolfcrypt/curve25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/curve25519.h
+
+
+ inc/wolfssl/wolfcrypt/curve448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/curve448.h
+
+
+ inc/wolfssl/wolfcrypt/des3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/des3.h
+
+
+ inc/wolfssl/wolfcrypt/dh.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/dh.h
+
+
+ inc/wolfssl/wolfcrypt/dilithium.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/dilithium.h
+
+
+ inc/wolfssl/wolfcrypt/dsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/dsa.h
+
+
+ inc/wolfssl/wolfcrypt/ecc.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ecc.h
+
+
+ inc/wolfssl/wolfcrypt/eccsi.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/eccsi.h
+
+
+ inc/wolfssl/wolfcrypt/ed25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ed25519.h
+
+
+ inc/wolfssl/wolfcrypt/ed448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ed448.h
+
+
+ inc/wolfssl/wolfcrypt/error-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/error-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/falcon.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/falcon.h
+
+
+ inc/wolfssl/wolfcrypt/fe_448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/fe_448.h
+
+
+ inc/wolfssl/wolfcrypt/fe_operations.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/fe_operations.h
+
+
+ inc/wolfssl/wolfcrypt/fips.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/fips.h
+
+
+ inc/wolfssl/wolfcrypt/fips_test.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/fips_test.h
+
+
+ inc/wolfssl/wolfcrypt/ge_448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ge_448.h
+
+
+ inc/wolfssl/wolfcrypt/ge_operations.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ge_operations.h
+
+
+ inc/wolfssl/wolfcrypt/hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/hash.h
+
+
+ inc/wolfssl/wolfcrypt/hmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/hmac.h
+
+
+ inc/wolfssl/wolfcrypt/include.am
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/include.am
+
+
+ inc/wolfssl/wolfcrypt/integer.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/integer.h
+
+
+ inc/wolfssl/wolfcrypt/kdf.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/kdf.h
+
+
+ inc/wolfssl/wolfcrypt/logging.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/logging.h
+
+
+ inc/wolfssl/wolfcrypt/md2.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/md2.h
+
+
+ inc/wolfssl/wolfcrypt/md4.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/md4.h
+
+
+ inc/wolfssl/wolfcrypt/md5.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/md5.h
+
+
+ inc/wolfssl/wolfcrypt/mem_track.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/mem_track.h
+
+
+ inc/wolfssl/wolfcrypt/memory.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/memory.h
+
+
+ inc/wolfssl/wolfcrypt/misc.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/misc.h
+
+
+ inc/wolfssl/wolfcrypt/mpi_class.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/mpi_class.h
+
+
+ inc/wolfssl/wolfcrypt/mpi_superclass.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/mpi_superclass.h
+
+
+ inc/wolfssl/wolfcrypt/pkcs11.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/pkcs11.h
+
+
+ inc/wolfssl/wolfcrypt/pkcs12.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/pkcs12.h
+
+
+ inc/wolfssl/wolfcrypt/pkcs7.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/pkcs7.h
+
+
+ inc/wolfssl/wolfcrypt/poly1305.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/poly1305.h
+
+
+ inc/wolfssl/wolfcrypt/port
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/pwdbased.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/pwdbased.h
+
+
+ inc/wolfssl/wolfcrypt/random.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/random.h
+
+
+ inc/wolfssl/wolfcrypt/rc2.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/rc2.h
+
+
+ inc/wolfssl/wolfcrypt/ripemd.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ripemd.h
+
+
+ inc/wolfssl/wolfcrypt/rsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/rsa.h
+
+
+ inc/wolfssl/wolfcrypt/sakke.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sakke.h
+
+
+ inc/wolfssl/wolfcrypt/selftest.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/selftest.h
+
+
+ inc/wolfssl/wolfcrypt/settings.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/settings.h
+
+
+ inc/wolfssl/wolfcrypt/sha.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sha.h
+
+
+ inc/wolfssl/wolfcrypt/sha256.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sha256.h
+
+
+ inc/wolfssl/wolfcrypt/sha3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sha3.h
+
+
+ inc/wolfssl/wolfcrypt/sha512.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sha512.h
+
+
+ inc/wolfssl/wolfcrypt/signature.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/signature.h
+
+
+ inc/wolfssl/wolfcrypt/siphash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/siphash.h
+
+
+ inc/wolfssl/wolfcrypt/sp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sp.h
+
+
+ inc/wolfssl/wolfcrypt/sp_int.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sp_int.h
+
+
+ inc/wolfssl/wolfcrypt/srp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/srp.h
+
+
+ inc/wolfssl/wolfcrypt/tfm.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/tfm.h
+
+
+ inc/wolfssl/wolfcrypt/types.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/types.h
+
+
+ inc/wolfssl/wolfcrypt/visibility.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/visibility.h
+
+
+ inc/wolfssl/wolfcrypt/wc_encrypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wc_encrypt.h
+
+
+ inc/wolfssl/wolfcrypt/wc_pkcs11.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wc_pkcs11.h
+
+
+ inc/wolfssl/wolfcrypt/wc_port.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wc_port.h
+
+
+ inc/wolfssl/wolfcrypt/wolfevent.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wolfevent.h
+
+
+ inc/wolfssl/wolfcrypt/wolfmath.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wolfmath.h
+
+
+ src/IDE/XilinxSDK/user_settings.h
+ 1
+ PARENT-1-WORKSPACE_LOC/user_settings.h
+
+
+ src/IDE/XilinxSDK/wolfssl_example.c
+ 1
+ PARENT-1-WORKSPACE_LOC/wolfssl_example.c
+
+
+ src/wolfcrypt/benchmark/benchmark.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/benchmark/benchmark.c
+
+
+ src/wolfcrypt/benchmark/benchmark.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/benchmark/benchmark.h
+
+
+ src/wolfcrypt/src/aes.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/aes.c
+
+
+ src/wolfcrypt/src/arc4.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/arc4.c
+
+
+ src/wolfcrypt/src/asm.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/asm.c
+
+
+ src/wolfcrypt/src/asn.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/asn.c
+
+
+ src/wolfcrypt/src/blake2b.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/blake2b.c
+
+
+ src/wolfcrypt/src/blake2s.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/blake2s.c
+
+
+ src/wolfcrypt/src/camellia.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/camellia.c
+
+
+ src/wolfcrypt/src/chacha.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/chacha.c
+
+
+ src/wolfcrypt/src/chacha20_poly1305.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/chacha20_poly1305.c
+
+
+ src/wolfcrypt/src/cmac.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/cmac.c
+
+
+ src/wolfcrypt/src/coding.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/coding.c
+
+
+ src/wolfcrypt/src/compress.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/compress.c
+
+
+ src/wolfcrypt/src/cpuid.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/cpuid.c
+
+
+ src/wolfcrypt/src/cryptocb.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/cryptocb.c
+
+
+ src/wolfcrypt/src/curve25519.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/curve25519.c
+
+
+ src/wolfcrypt/src/curve448.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/curve448.c
+
+
+ src/wolfcrypt/src/des3.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/des3.c
+
+
+ src/wolfcrypt/src/dh.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/dh.c
+
+
+ src/wolfcrypt/src/dsa.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/dsa.c
+
+
+ src/wolfcrypt/src/ecc.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ecc.c
+
+
+ src/wolfcrypt/src/ecc_fp.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ecc_fp.c
+
+
+ src/wolfcrypt/src/eccsi.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/eccsi.c
+
+
+ src/wolfcrypt/src/ed25519.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ed25519.c
+
+
+ src/wolfcrypt/src/ed448.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ed448.c
+
+
+ src/wolfcrypt/src/error.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/error.c
+
+
+ src/wolfcrypt/src/evp.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/evp.c
+
+
+ src/wolfcrypt/src/falcon.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/falcon.c
+
+
+ src/wolfcrypt/src/fe_448.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_448.c
+
+
+ src/wolfcrypt/src/fe_low_mem.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_low_mem.c
+
+
+ src/wolfcrypt/src/fe_operations.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_operations.c
+
+
+ src/wolfcrypt/src/fe_x25519_128.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_x25519_128.i
+
+
+ src/wolfcrypt/src/fp_mont_small.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mont_small.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_12.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_12.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_17.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_17.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_20.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_20.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_24.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_24.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_28.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_28.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_3.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_3.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_32.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_32.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_4.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_4.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_48.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_48.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_6.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_6.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_64.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_64.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_7.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_7.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_8.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_8.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_9.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_9.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_small_set.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_small_set.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_12.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_12.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_17.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_17.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_20.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_20.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_24.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_24.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_28.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_28.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_3.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_3.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_32.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_32.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_4.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_4.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_48.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_48.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_6.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_6.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_64.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_64.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_7.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_7.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_8.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_8.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_9.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_9.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_small_set.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_small_set.i
+
+
+ src/wolfcrypt/src/ge_448.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ge_448.c
+
+
+ src/wolfcrypt/src/ge_low_mem.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ge_low_mem.c
+
+
+ src/wolfcrypt/src/ge_operations.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ge_operations.c
+
+
+ src/wolfcrypt/src/hash.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/hash.c
+
+
+ src/wolfcrypt/src/hmac.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/hmac.c
+
+
+ src/wolfcrypt/src/integer.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/integer.c
+
+
+ src/wolfcrypt/src/kdf.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/kdf.c
+
+
+ src/wolfcrypt/src/logging.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/logging.c
+
+
+ src/wolfcrypt/src/md2.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/md2.c
+
+
+ src/wolfcrypt/src/md4.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/md4.c
+
+
+ src/wolfcrypt/src/md5.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/md5.c
+
+
+ src/wolfcrypt/src/memory.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/memory.c
+
+
+ src/wolfcrypt/src/misc.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/misc.c
+
+
+ src/wolfcrypt/src/pkcs12.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/pkcs12.c
+
+
+ src/wolfcrypt/src/pkcs7.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/pkcs7.c
+
+
+ src/wolfcrypt/src/poly1305.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/poly1305.c
+
+
+ src/wolfcrypt/src/port
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/src/pwdbased.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/pwdbased.c
+
+
+ src/wolfcrypt/src/random.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/random.c
+
+
+ src/wolfcrypt/src/rc2.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/rc2.c
+
+
+ src/wolfcrypt/src/ripemd.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ripemd.c
+
+
+ src/wolfcrypt/src/rsa.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/rsa.c
+
+
+ src/wolfcrypt/src/sakke.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sakke.c
+
+
+ src/wolfcrypt/src/sha.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sha.c
+
+
+ src/wolfcrypt/src/sha256.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sha256.c
+
+
+ src/wolfcrypt/src/sha3.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sha3.c
+
+
+ src/wolfcrypt/src/sha512.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sha512.c
+
+
+ src/wolfcrypt/src/signature.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/signature.c
+
+
+ src/wolfcrypt/src/siphash.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/siphash.c
+
+
+ src/wolfcrypt/src/sp_arm32.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_arm32.c
+
+
+ src/wolfcrypt/src/sp_arm64.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_arm64.c
+
+
+ src/wolfcrypt/src/sp_armthumb.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_armthumb.c
+
+
+ src/wolfcrypt/src/sp_c32.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_c32.c
+
+
+ src/wolfcrypt/src/sp_c64.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_c64.c
+
+
+ src/wolfcrypt/src/sp_cortexm.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_cortexm.c
+
+
+ src/wolfcrypt/src/sp_dsp32.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_dsp32.c
+
+
+ src/wolfcrypt/src/sp_int.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_int.c
+
+
+ src/wolfcrypt/src/srp.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/srp.c
+
+
+ src/wolfcrypt/src/tfm.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/tfm.c
+
+
+ src/wolfcrypt/src/wc_dsp.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wc_dsp.c
+
+
+ src/wolfcrypt/src/wc_encrypt.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wc_encrypt.c
+
+
+ src/wolfcrypt/src/wc_pkcs11.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wc_pkcs11.c
+
+
+ src/wolfcrypt/src/wc_port.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wc_port.c
+
+
+ src/wolfcrypt/src/wolfevent.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wolfevent.c
+
+
+ src/wolfcrypt/src/wolfmath.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wolfmath.c
+
+
+ src/wolfcrypt/test/test.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/test/test.c
+
+
+ src/wolfcrypt/test/test.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/test/test.h
+
+
+ inc/wolfssl/wolfcrypt/port/Espressif
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/af_alg
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/arm
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/atmel
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/caam
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/cavium
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/cypress
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/devcrypto
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/intel
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/iotsafe
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/nrf51.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/nrf51.h
+
+
+ inc/wolfssl/wolfcrypt/port/nxp
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/pic32
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/psa
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/silabs
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/st
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/ti
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/xilinx
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/src/port/arm
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/src/port/xilinx
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h
+
+
+ inc/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h
+
+
+ inc/wolfssl/wolfcrypt/port/arm/cryptoCell.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/arm/cryptoCell.h
+
+
+ inc/wolfssl/wolfcrypt/port/atmel/atmel.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/atmel/atmel.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/caam_driver.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/caam_driver.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/caam_error.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/caam_error.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/caam_qnx.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/caam_qnx.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_aes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_aes.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_cmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_cmac.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_ecdsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_ecdsa.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_rsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_rsa.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_x25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_x25519.h
+
+
+ inc/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h
+
+
+ inc/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h
+
+
+ inc/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h
+
+
+ inc/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h
+
+
+ inc/wolfssl/wolfcrypt/port/intel/quickassist.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/intel/quickassist.h
+
+
+ inc/wolfssl/wolfcrypt/port/intel/quickassist_mem.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/intel/quickassist_mem.h
+
+
+ inc/wolfssl/wolfcrypt/port/intel/quickassist_sync.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/intel/quickassist_sync.h
+
+
+ inc/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_dh.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_dh.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_ecc.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_ecc.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_rsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_rsa.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/wc_kcapi.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/wc_kcapi.h
+
+
+ inc/wolfssl/wolfcrypt/port/nxp/dcp_port.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/nxp/dcp_port.h
+
+
+ inc/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
+
+
+ inc/wolfssl/wolfcrypt/port/nxp/se050_port.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/nxp/se050_port.h
+
+
+ inc/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/port/psa/psa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/psa/psa.h
+
+
+ inc/wolfssl/wolfcrypt/port/silabs/silabs_aes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/silabs/silabs_aes.h
+
+
+ inc/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h
+
+
+ inc/wolfssl/wolfcrypt/port/silabs/silabs_hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/silabs/silabs_hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/silabs/silabs_random.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/silabs/silabs_random.h
+
+
+ inc/wolfssl/wolfcrypt/port/st/stm32.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/st/stm32.h
+
+
+ inc/wolfssl/wolfcrypt/port/st/stsafe.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/st/stsafe.h
+
+
+ inc/wolfssl/wolfcrypt/port/ti/ti-ccm.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/ti/ti-ccm.h
+
+
+ inc/wolfssl/wolfcrypt/port/ti/ti-hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/ti/ti-hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
+
+
+ inc/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h
+
+
+ inc/wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h
+
+
+ src/wolfcrypt/src/port/arm/armv8-aes.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-aes.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-chacha.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-chacha.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-curve25519_c.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-curve25519_c.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-poly1305.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-poly1305.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-sha256.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-sha256.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-sha512.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-sha512.c
+
+
+ src/wolfcrypt/src/port/arm/cryptoCell.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/cryptoCell.c
+
+
+ src/wolfcrypt/src/port/arm/cryptoCellHash.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/cryptoCellHash.c
+
+
+ src/wolfcrypt/src/port/xilinx/xil-aesgcm.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/xilinx/xil-aesgcm.c
+
+
+ src/wolfcrypt/src/port/xilinx/xil-sha3.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/xilinx/xil-sha3.c
+
+
+ src/wolfcrypt/src/port/xilinx/xil-versal-glue.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/xilinx/xil-versal-glue.c
+
+
+ src/wolfcrypt/src/port/xilinx/xil-versal-trng.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/xilinx/xil-versal-trng.c
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/wolfCrypt_FreeRTOS_example.prj b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/wolfCrypt_FreeRTOS_example.prj
new file mode 100644
index 000000000..6e18f802d
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/wolfCrypt_FreeRTOS_example.prj
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/.cproject b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/.cproject
new file mode 100644
index 000000000..452d22bb2
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/.cproject
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/.project b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/.project
new file mode 100644
index 000000000..aa9cef576
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/.project
@@ -0,0 +1,29 @@
+
+
+ wolfCrypt_FreeRTOS_example_system
+
+
+ wolfCrypt_FreeRTOS_example
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ com.xilinx.sdx.system.core.embedded
+ com.xilinx.sdx.system.systemprojectnature
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.core.ccnature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/wolfCrypt_FreeRTOS_example_system.sprj b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/wolfCrypt_FreeRTOS_example_system.sprj
new file mode 100644
index 000000000..33af837de
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example_system/wolfCrypt_FreeRTOS_example_system.sprj
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_example/.cproject b/IDE/XilinxSDK/2022_1/wolfCrypt_example/.cproject
new file mode 100644
index 000000000..a41741925
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_example/.cproject
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_example/.project b/IDE/XilinxSDK/2022_1/wolfCrypt_example/.project
new file mode 100644
index 000000000..60b0945e3
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_example/.project
@@ -0,0 +1,1859 @@
+
+
+ wolfCrypt_example
+ Created by Vitis v2022.1
+
+ vmk180
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ com.xilinx.sdx.sdk.core.SdkProjectNature
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
+
+ inc
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl
+ 2
+ virtual:/virtual
+
+
+ src/IDE
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/callbacks.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/callbacks.h
+
+
+ inc/wolfssl/certs_test.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/certs_test.h
+
+
+ inc/wolfssl/crl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/crl.h
+
+
+ inc/wolfssl/error-ssl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/error-ssl.h
+
+
+ inc/wolfssl/include.am
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/include.am
+
+
+ inc/wolfssl/internal.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/internal.h
+
+
+ inc/wolfssl/ocsp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/ocsp.h
+
+
+ inc/wolfssl/openssl
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/options.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/options.h
+
+
+ inc/wolfssl/options.h.in
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/options.h.in
+
+
+ inc/wolfssl/quic.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/quic.h
+
+
+ inc/wolfssl/sniffer.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/sniffer.h
+
+
+ inc/wolfssl/sniffer_error.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/sniffer_error.h
+
+
+ inc/wolfssl/sniffer_error.rc
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/sniffer_error.rc
+
+
+ inc/wolfssl/ssl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/ssl.h
+
+
+ inc/wolfssl/test.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/test.h
+
+
+ inc/wolfssl/version.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/version.h
+
+
+ inc/wolfssl/version.h.in
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/version.h.in
+
+
+ inc/wolfssl/wolfcrypt
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfio.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfio.h
+
+
+ src/IDE/XilinxSDK
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/benchmark
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/src
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/test
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/openssl/aes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/aes.h
+
+
+ inc/wolfssl/openssl/asn1.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/asn1.h
+
+
+ inc/wolfssl/openssl/asn1t.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/asn1t.h
+
+
+ inc/wolfssl/openssl/bio.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/bio.h
+
+
+ inc/wolfssl/openssl/bn.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/bn.h
+
+
+ inc/wolfssl/openssl/buffer.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/buffer.h
+
+
+ inc/wolfssl/openssl/camellia.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/camellia.h
+
+
+ inc/wolfssl/openssl/cmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/cmac.h
+
+
+ inc/wolfssl/openssl/cms.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/cms.h
+
+
+ inc/wolfssl/openssl/compat_types.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/compat_types.h
+
+
+ inc/wolfssl/openssl/conf.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/conf.h
+
+
+ inc/wolfssl/openssl/crypto.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/crypto.h
+
+
+ inc/wolfssl/openssl/des.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/des.h
+
+
+ inc/wolfssl/openssl/dh.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/dh.h
+
+
+ inc/wolfssl/openssl/dsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/dsa.h
+
+
+ inc/wolfssl/openssl/ec.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ec.h
+
+
+ inc/wolfssl/openssl/ec25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ec25519.h
+
+
+ inc/wolfssl/openssl/ec448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ec448.h
+
+
+ inc/wolfssl/openssl/ecdh.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ecdh.h
+
+
+ inc/wolfssl/openssl/ecdsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ecdsa.h
+
+
+ inc/wolfssl/openssl/ed25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ed25519.h
+
+
+ inc/wolfssl/openssl/ed448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ed448.h
+
+
+ inc/wolfssl/openssl/engine.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/engine.h
+
+
+ inc/wolfssl/openssl/err.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/err.h
+
+
+ inc/wolfssl/openssl/evp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/evp.h
+
+
+ inc/wolfssl/openssl/fips_rand.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/fips_rand.h
+
+
+ inc/wolfssl/openssl/hmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/hmac.h
+
+
+ inc/wolfssl/openssl/include.am
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/include.am
+
+
+ inc/wolfssl/openssl/kdf.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/kdf.h
+
+
+ inc/wolfssl/openssl/lhash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/lhash.h
+
+
+ inc/wolfssl/openssl/md4.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/md4.h
+
+
+ inc/wolfssl/openssl/md5.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/md5.h
+
+
+ inc/wolfssl/openssl/modes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/modes.h
+
+
+ inc/wolfssl/openssl/obj_mac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/obj_mac.h
+
+
+ inc/wolfssl/openssl/objects.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/objects.h
+
+
+ inc/wolfssl/openssl/ocsp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ocsp.h
+
+
+ inc/wolfssl/openssl/opensslconf.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/opensslconf.h
+
+
+ inc/wolfssl/openssl/opensslv.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/opensslv.h
+
+
+ inc/wolfssl/openssl/ossl_typ.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ossl_typ.h
+
+
+ inc/wolfssl/openssl/pem.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/pem.h
+
+
+ inc/wolfssl/openssl/pkcs12.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/pkcs12.h
+
+
+ inc/wolfssl/openssl/pkcs7.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/pkcs7.h
+
+
+ inc/wolfssl/openssl/rand.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/rand.h
+
+
+ inc/wolfssl/openssl/rc4.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/rc4.h
+
+
+ inc/wolfssl/openssl/ripemd.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ripemd.h
+
+
+ inc/wolfssl/openssl/rsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/rsa.h
+
+
+ inc/wolfssl/openssl/sha.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/sha.h
+
+
+ inc/wolfssl/openssl/sha3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/sha3.h
+
+
+ inc/wolfssl/openssl/srp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/srp.h
+
+
+ inc/wolfssl/openssl/ssl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ssl.h
+
+
+ inc/wolfssl/openssl/ssl23.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ssl23.h
+
+
+ inc/wolfssl/openssl/stack.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/stack.h
+
+
+ inc/wolfssl/openssl/tls1.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/tls1.h
+
+
+ inc/wolfssl/openssl/txt_db.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/txt_db.h
+
+
+ inc/wolfssl/openssl/ui.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/ui.h
+
+
+ inc/wolfssl/openssl/x509.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/x509.h
+
+
+ inc/wolfssl/openssl/x509_vfy.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/x509_vfy.h
+
+
+ inc/wolfssl/openssl/x509v3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/openssl/x509v3.h
+
+
+ inc/wolfssl/wolfcrypt/aes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/aes.h
+
+
+ inc/wolfssl/wolfcrypt/arc4.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/arc4.h
+
+
+ inc/wolfssl/wolfcrypt/asn.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/asn.h
+
+
+ inc/wolfssl/wolfcrypt/asn_public.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/asn_public.h
+
+
+ inc/wolfssl/wolfcrypt/async.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/async.h
+
+
+ inc/wolfssl/wolfcrypt/blake2-impl.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/blake2-impl.h
+
+
+ inc/wolfssl/wolfcrypt/blake2-int.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/blake2-int.h
+
+
+ inc/wolfssl/wolfcrypt/blake2.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/blake2.h
+
+
+ inc/wolfssl/wolfcrypt/camellia.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/camellia.h
+
+
+ inc/wolfssl/wolfcrypt/chacha.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/chacha.h
+
+
+ inc/wolfssl/wolfcrypt/chacha20_poly1305.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/chacha20_poly1305.h
+
+
+ inc/wolfssl/wolfcrypt/cmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/cmac.h
+
+
+ inc/wolfssl/wolfcrypt/coding.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/coding.h
+
+
+ inc/wolfssl/wolfcrypt/compress.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/compress.h
+
+
+ inc/wolfssl/wolfcrypt/cpuid.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/cpuid.h
+
+
+ inc/wolfssl/wolfcrypt/cryptocb.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/cryptocb.h
+
+
+ inc/wolfssl/wolfcrypt/curve25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/curve25519.h
+
+
+ inc/wolfssl/wolfcrypt/curve448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/curve448.h
+
+
+ inc/wolfssl/wolfcrypt/des3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/des3.h
+
+
+ inc/wolfssl/wolfcrypt/dh.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/dh.h
+
+
+ inc/wolfssl/wolfcrypt/dilithium.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/dilithium.h
+
+
+ inc/wolfssl/wolfcrypt/dsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/dsa.h
+
+
+ inc/wolfssl/wolfcrypt/ecc.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ecc.h
+
+
+ inc/wolfssl/wolfcrypt/eccsi.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/eccsi.h
+
+
+ inc/wolfssl/wolfcrypt/ed25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ed25519.h
+
+
+ inc/wolfssl/wolfcrypt/ed448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ed448.h
+
+
+ inc/wolfssl/wolfcrypt/error-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/error-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/falcon.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/falcon.h
+
+
+ inc/wolfssl/wolfcrypt/fe_448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/fe_448.h
+
+
+ inc/wolfssl/wolfcrypt/fe_operations.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/fe_operations.h
+
+
+ inc/wolfssl/wolfcrypt/fips.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/fips.h
+
+
+ inc/wolfssl/wolfcrypt/fips_test.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/fips_test.h
+
+
+ inc/wolfssl/wolfcrypt/ge_448.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ge_448.h
+
+
+ inc/wolfssl/wolfcrypt/ge_operations.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ge_operations.h
+
+
+ inc/wolfssl/wolfcrypt/hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/hash.h
+
+
+ inc/wolfssl/wolfcrypt/hmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/hmac.h
+
+
+ inc/wolfssl/wolfcrypt/include.am
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/include.am
+
+
+ inc/wolfssl/wolfcrypt/integer.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/integer.h
+
+
+ inc/wolfssl/wolfcrypt/kdf.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/kdf.h
+
+
+ inc/wolfssl/wolfcrypt/logging.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/logging.h
+
+
+ inc/wolfssl/wolfcrypt/md2.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/md2.h
+
+
+ inc/wolfssl/wolfcrypt/md4.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/md4.h
+
+
+ inc/wolfssl/wolfcrypt/md5.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/md5.h
+
+
+ inc/wolfssl/wolfcrypt/mem_track.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/mem_track.h
+
+
+ inc/wolfssl/wolfcrypt/memory.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/memory.h
+
+
+ inc/wolfssl/wolfcrypt/misc.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/misc.h
+
+
+ inc/wolfssl/wolfcrypt/mpi_class.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/mpi_class.h
+
+
+ inc/wolfssl/wolfcrypt/mpi_superclass.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/mpi_superclass.h
+
+
+ inc/wolfssl/wolfcrypt/pkcs11.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/pkcs11.h
+
+
+ inc/wolfssl/wolfcrypt/pkcs12.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/pkcs12.h
+
+
+ inc/wolfssl/wolfcrypt/pkcs7.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/pkcs7.h
+
+
+ inc/wolfssl/wolfcrypt/poly1305.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/poly1305.h
+
+
+ inc/wolfssl/wolfcrypt/port
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/pwdbased.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/pwdbased.h
+
+
+ inc/wolfssl/wolfcrypt/random.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/random.h
+
+
+ inc/wolfssl/wolfcrypt/rc2.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/rc2.h
+
+
+ inc/wolfssl/wolfcrypt/ripemd.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/ripemd.h
+
+
+ inc/wolfssl/wolfcrypt/rsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/rsa.h
+
+
+ inc/wolfssl/wolfcrypt/sakke.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sakke.h
+
+
+ inc/wolfssl/wolfcrypt/selftest.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/selftest.h
+
+
+ inc/wolfssl/wolfcrypt/settings.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/settings.h
+
+
+ inc/wolfssl/wolfcrypt/sha.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sha.h
+
+
+ inc/wolfssl/wolfcrypt/sha256.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sha256.h
+
+
+ inc/wolfssl/wolfcrypt/sha3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sha3.h
+
+
+ inc/wolfssl/wolfcrypt/sha512.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sha512.h
+
+
+ inc/wolfssl/wolfcrypt/signature.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/signature.h
+
+
+ inc/wolfssl/wolfcrypt/siphash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/siphash.h
+
+
+ inc/wolfssl/wolfcrypt/sp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sp.h
+
+
+ inc/wolfssl/wolfcrypt/sp_int.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/sp_int.h
+
+
+ inc/wolfssl/wolfcrypt/srp.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/srp.h
+
+
+ inc/wolfssl/wolfcrypt/tfm.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/tfm.h
+
+
+ inc/wolfssl/wolfcrypt/types.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/types.h
+
+
+ inc/wolfssl/wolfcrypt/visibility.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/visibility.h
+
+
+ inc/wolfssl/wolfcrypt/wc_encrypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wc_encrypt.h
+
+
+ inc/wolfssl/wolfcrypt/wc_pkcs11.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wc_pkcs11.h
+
+
+ inc/wolfssl/wolfcrypt/wc_port.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wc_port.h
+
+
+ inc/wolfssl/wolfcrypt/wolfevent.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wolfevent.h
+
+
+ inc/wolfssl/wolfcrypt/wolfmath.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/wolfmath.h
+
+
+ src/IDE/XilinxSDK/user_settings.h
+ 1
+ PARENT-1-WORKSPACE_LOC/user_settings.h
+
+
+ src/IDE/XilinxSDK/wolfssl_example.c
+ 1
+ PARENT-1-WORKSPACE_LOC/wolfssl_example.c
+
+
+ src/wolfcrypt/benchmark/benchmark.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/benchmark/benchmark.c
+
+
+ src/wolfcrypt/benchmark/benchmark.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/benchmark/benchmark.h
+
+
+ src/wolfcrypt/src/aes.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/aes.c
+
+
+ src/wolfcrypt/src/arc4.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/arc4.c
+
+
+ src/wolfcrypt/src/asm.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/asm.c
+
+
+ src/wolfcrypt/src/asn.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/asn.c
+
+
+ src/wolfcrypt/src/blake2b.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/blake2b.c
+
+
+ src/wolfcrypt/src/blake2s.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/blake2s.c
+
+
+ src/wolfcrypt/src/camellia.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/camellia.c
+
+
+ src/wolfcrypt/src/chacha.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/chacha.c
+
+
+ src/wolfcrypt/src/chacha20_poly1305.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/chacha20_poly1305.c
+
+
+ src/wolfcrypt/src/cmac.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/cmac.c
+
+
+ src/wolfcrypt/src/coding.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/coding.c
+
+
+ src/wolfcrypt/src/compress.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/compress.c
+
+
+ src/wolfcrypt/src/cpuid.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/cpuid.c
+
+
+ src/wolfcrypt/src/cryptocb.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/cryptocb.c
+
+
+ src/wolfcrypt/src/curve25519.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/curve25519.c
+
+
+ src/wolfcrypt/src/curve448.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/curve448.c
+
+
+ src/wolfcrypt/src/des3.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/des3.c
+
+
+ src/wolfcrypt/src/dh.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/dh.c
+
+
+ src/wolfcrypt/src/dsa.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/dsa.c
+
+
+ src/wolfcrypt/src/ecc.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ecc.c
+
+
+ src/wolfcrypt/src/ecc_fp.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ecc_fp.c
+
+
+ src/wolfcrypt/src/eccsi.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/eccsi.c
+
+
+ src/wolfcrypt/src/ed25519.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ed25519.c
+
+
+ src/wolfcrypt/src/ed448.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ed448.c
+
+
+ src/wolfcrypt/src/error.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/error.c
+
+
+ src/wolfcrypt/src/evp.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/evp.c
+
+
+ src/wolfcrypt/src/falcon.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/falcon.c
+
+
+ src/wolfcrypt/src/fe_448.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_448.c
+
+
+ src/wolfcrypt/src/fe_low_mem.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_low_mem.c
+
+
+ src/wolfcrypt/src/fe_operations.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_operations.c
+
+
+ src/wolfcrypt/src/fe_x25519_128.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_x25519_128.i
+
+
+ src/wolfcrypt/src/fp_mont_small.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mont_small.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_12.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_12.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_17.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_17.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_20.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_20.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_24.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_24.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_28.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_28.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_3.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_3.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_32.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_32.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_4.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_4.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_48.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_48.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_6.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_6.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_64.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_64.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_7.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_7.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_8.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_8.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_9.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_9.i
+
+
+ src/wolfcrypt/src/fp_mul_comba_small_set.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_mul_comba_small_set.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_12.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_12.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_17.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_17.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_20.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_20.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_24.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_24.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_28.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_28.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_3.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_3.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_32.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_32.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_4.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_4.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_48.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_48.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_6.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_6.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_64.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_64.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_7.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_7.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_8.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_8.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_9.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_9.i
+
+
+ src/wolfcrypt/src/fp_sqr_comba_small_set.i
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fp_sqr_comba_small_set.i
+
+
+ src/wolfcrypt/src/ge_448.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ge_448.c
+
+
+ src/wolfcrypt/src/ge_low_mem.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ge_low_mem.c
+
+
+ src/wolfcrypt/src/ge_operations.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ge_operations.c
+
+
+ src/wolfcrypt/src/hash.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/hash.c
+
+
+ src/wolfcrypt/src/hmac.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/hmac.c
+
+
+ src/wolfcrypt/src/integer.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/integer.c
+
+
+ src/wolfcrypt/src/kdf.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/kdf.c
+
+
+ src/wolfcrypt/src/logging.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/logging.c
+
+
+ src/wolfcrypt/src/md2.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/md2.c
+
+
+ src/wolfcrypt/src/md4.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/md4.c
+
+
+ src/wolfcrypt/src/md5.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/md5.c
+
+
+ src/wolfcrypt/src/memory.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/memory.c
+
+
+ src/wolfcrypt/src/misc.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/misc.c
+
+
+ src/wolfcrypt/src/pkcs12.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/pkcs12.c
+
+
+ src/wolfcrypt/src/pkcs7.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/pkcs7.c
+
+
+ src/wolfcrypt/src/poly1305.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/poly1305.c
+
+
+ src/wolfcrypt/src/port
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/src/pwdbased.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/pwdbased.c
+
+
+ src/wolfcrypt/src/random.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/random.c
+
+
+ src/wolfcrypt/src/rc2.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/rc2.c
+
+
+ src/wolfcrypt/src/ripemd.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/ripemd.c
+
+
+ src/wolfcrypt/src/rsa.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/rsa.c
+
+
+ src/wolfcrypt/src/sakke.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sakke.c
+
+
+ src/wolfcrypt/src/sha.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sha.c
+
+
+ src/wolfcrypt/src/sha256.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sha256.c
+
+
+ src/wolfcrypt/src/sha3.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sha3.c
+
+
+ src/wolfcrypt/src/sha512.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sha512.c
+
+
+ src/wolfcrypt/src/signature.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/signature.c
+
+
+ src/wolfcrypt/src/siphash.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/siphash.c
+
+
+ src/wolfcrypt/src/sp_arm32.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_arm32.c
+
+
+ src/wolfcrypt/src/sp_arm64.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_arm64.c
+
+
+ src/wolfcrypt/src/sp_armthumb.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_armthumb.c
+
+
+ src/wolfcrypt/src/sp_c32.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_c32.c
+
+
+ src/wolfcrypt/src/sp_c64.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_c64.c
+
+
+ src/wolfcrypt/src/sp_cortexm.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_cortexm.c
+
+
+ src/wolfcrypt/src/sp_dsp32.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_dsp32.c
+
+
+ src/wolfcrypt/src/sp_int.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/sp_int.c
+
+
+ src/wolfcrypt/src/srp.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/srp.c
+
+
+ src/wolfcrypt/src/tfm.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/tfm.c
+
+
+ src/wolfcrypt/src/wc_dsp.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wc_dsp.c
+
+
+ src/wolfcrypt/src/wc_encrypt.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wc_encrypt.c
+
+
+ src/wolfcrypt/src/wc_pkcs11.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wc_pkcs11.c
+
+
+ src/wolfcrypt/src/wc_port.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wc_port.c
+
+
+ src/wolfcrypt/src/wolfevent.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wolfevent.c
+
+
+ src/wolfcrypt/src/wolfmath.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/wolfmath.c
+
+
+ src/wolfcrypt/test/test.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/test/test.c
+
+
+ src/wolfcrypt/test/test.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/test/test.h
+
+
+ inc/wolfssl/wolfcrypt/port/Espressif
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/af_alg
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/arm
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/atmel
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/caam
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/cavium
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/cypress
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/devcrypto
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/intel
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/iotsafe
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/nrf51.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/nrf51.h
+
+
+ inc/wolfssl/wolfcrypt/port/nxp
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/pic32
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/psa
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/silabs
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/st
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/ti
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/xilinx
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/src/port/arm
+ 2
+ virtual:/virtual
+
+
+ src/wolfcrypt/src/port/xilinx
+ 2
+ virtual:/virtual
+
+
+ inc/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h
+
+
+ inc/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h
+
+
+ inc/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h
+
+
+ inc/wolfssl/wolfcrypt/port/arm/cryptoCell.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/arm/cryptoCell.h
+
+
+ inc/wolfssl/wolfcrypt/port/atmel/atmel.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/atmel/atmel.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/caam_driver.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/caam_driver.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/caam_error.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/caam_error.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/caam_qnx.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/caam_qnx.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_aes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_aes.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_cmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_cmac.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_ecdsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_ecdsa.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_rsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_rsa.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h
+
+
+ inc/wolfssl/wolfcrypt/port/caam/wolfcaam_x25519.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/caam/wolfcaam_x25519.h
+
+
+ inc/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h
+
+
+ inc/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h
+
+
+ inc/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h
+
+
+ inc/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h
+
+
+ inc/wolfssl/wolfcrypt/port/intel/quickassist.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/intel/quickassist.h
+
+
+ inc/wolfssl/wolfcrypt/port/intel/quickassist_mem.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/intel/quickassist_mem.h
+
+
+ inc/wolfssl/wolfcrypt/port/intel/quickassist_sync.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/intel/quickassist_sync.h
+
+
+ inc/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_dh.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_dh.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_ecc.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_ecc.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/kcapi_rsa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/kcapi_rsa.h
+
+
+ inc/wolfssl/wolfcrypt/port/kcapi/wc_kcapi.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/kcapi/wc_kcapi.h
+
+
+ inc/wolfssl/wolfcrypt/port/nxp/dcp_port.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/nxp/dcp_port.h
+
+
+ inc/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/nxp/ksdk_port.h
+
+
+ inc/wolfssl/wolfcrypt/port/nxp/se050_port.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/nxp/se050_port.h
+
+
+ inc/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h
+
+
+ inc/wolfssl/wolfcrypt/port/psa/psa.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/psa/psa.h
+
+
+ inc/wolfssl/wolfcrypt/port/silabs/silabs_aes.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/silabs/silabs_aes.h
+
+
+ inc/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h
+
+
+ inc/wolfssl/wolfcrypt/port/silabs/silabs_hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/silabs/silabs_hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/silabs/silabs_random.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/silabs/silabs_random.h
+
+
+ inc/wolfssl/wolfcrypt/port/st/stm32.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/st/stm32.h
+
+
+ inc/wolfssl/wolfcrypt/port/st/stsafe.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/st/stsafe.h
+
+
+ inc/wolfssl/wolfcrypt/port/ti/ti-ccm.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/ti/ti-ccm.h
+
+
+ inc/wolfssl/wolfcrypt/port/ti/ti-hash.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/ti/ti-hash.h
+
+
+ inc/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
+
+
+ inc/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h
+
+
+ inc/wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h
+
+
+ src/wolfcrypt/src/port/arm/armv8-aes.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-aes.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-chacha.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-chacha.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-curve25519_c.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-curve25519_c.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-poly1305.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-poly1305.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-sha256.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-sha256.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c
+
+
+ src/wolfcrypt/src/port/arm/armv8-sha512.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/armv8-sha512.c
+
+
+ src/wolfcrypt/src/port/arm/cryptoCell.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/cryptoCell.c
+
+
+ src/wolfcrypt/src/port/arm/cryptoCellHash.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/arm/cryptoCellHash.c
+
+
+ src/wolfcrypt/src/port/xilinx/xil-aesgcm.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/xilinx/xil-aesgcm.c
+
+
+ src/wolfcrypt/src/port/xilinx/xil-sha3.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/xilinx/xil-sha3.c
+
+
+ src/wolfcrypt/src/port/xilinx/xil-versal-glue.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/xilinx/xil-versal-glue.c
+
+
+ src/wolfcrypt/src/port/xilinx/xil-versal-trng.c
+ 1
+ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/port/xilinx/xil-versal-trng.c
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_example/wolfCrypt_example.prj b/IDE/XilinxSDK/2022_1/wolfCrypt_example/wolfCrypt_example.prj
new file mode 100644
index 000000000..515678fcc
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_example/wolfCrypt_example.prj
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/.cproject b/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/.cproject
new file mode 100644
index 000000000..24083d098
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/.cproject
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/.project b/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/.project
new file mode 100644
index 000000000..183723602
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/.project
@@ -0,0 +1,29 @@
+
+
+ wolfCrypt_example_system
+
+
+ wolfCrypt_example
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ com.xilinx.sdx.system.core.embedded
+ com.xilinx.sdx.system.systemprojectnature
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.core.ccnature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
diff --git a/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/wolfCrypt_example_system.sprj b/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/wolfCrypt_example_system.sprj
new file mode 100644
index 000000000..d7a914de9
--- /dev/null
+++ b/IDE/XilinxSDK/2022_1/wolfCrypt_example_system/wolfCrypt_example_system.sprj
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/README.md b/IDE/XilinxSDK/README.md
index f65d80606..ac43368ac 100644
--- a/IDE/XilinxSDK/README.md
+++ b/IDE/XilinxSDK/README.md
@@ -1,6 +1,6 @@
# Common Gotcha's
-- If compiling all code together (ie no separate wolfssl library) than the -fPIC compiler flag should be used. Without using -fPIC in this build setup there could be unexpected failures.
+- If compiling all code together (ie no separate wolfssl library) then the -fPIC compiler flag should be used. Without using -fPIC in this build setup there could be unexpected failures.
- If building with ARMv8 crypto extensions then the compiler flags "-mstrict-align -mcpu=generic+crypto" must be used.
- Check that enough stack and heap memory is set for the operations if a crash or stall happens.
@@ -30,6 +30,82 @@ To use this example project:
7. Select the root directory of `wolfssl/IDE/XilinxSDK/2019_2`, and select `wolfCrypt_example` and `wolfCrypt_example_system`. Then click "Finish"
+# Detailed Instructions For Example Use With Vitis 2022.1
+
+This shows the necessary steps on the basis of using the VMK180 development board.
+
+1. Create a new workspace located in the directory `wolfssl/IDE/XilinxSDK/2022_1`.
+2. Create a new platform project.
+ - On the welcome screen select "Create platform project".
+ - Give it a good name, e.g. `vmk180` and click 'Next'.
+ - In the Hardware Specification drop-down menu select "vmk180" and click 'Finish'.
+3. Enable the necessary libraries in the bsp.
+ - Open `platform.spr` in the 'vmk180' platform project.
+ - In the tree-view select "Board Support Package" and click on "Modify BSP Settings...".
+ - Enable the `xilmailbox` and `xilsecure` libraries.
+ - In this tree-view on the left side under "Overview->standalone" appeared now a "xilsecure" entry.
+ - Select "xilsecure" and change the configuration of `cache_disable` to `false`. Press 'OK' to confirm the change.
+ - Build the platform project, either via "Project->Build All" or by the keyboard shortcut 'CTRL+b'.
+4. Import the wolfcrypt example projects "File->Import->Eclipse workspace or zip file".
+ - Behind 'Select Root directory' click on 'Browse...'. You should already be in the correct directory, but still make sure that you're in `wolfssl/IDE/XilinxSDK/2022_1/`. Click 'Open'.
+ - Uncheck "Copy projects into workspace".
+ - Select the two example projects `wolfCrypt_example` and `wolfCrypt_example_system`, then click 'Finish'.
+5. Fix the missing link from platform project and system project.
+ - In the 'Explorer' Window open the `wolfCrypt_example_system` and double-click `wolfCrypt_example_system.prj`.
+ - You should normally see a pop-up with the title "Platform invalid". Click on "Change referred platform", select your platform and click 'OK'.
+ - In case you didn't see the pop-up, you should see the 'System Project Settings'. Click on the `...` behind 'Platform', select your platform and click 'OK'.
+ - Vitis will now remind you that all build configurations will be cleaned, click 'Yes'.
+6. Create a new linker script
+ - In the 'Explorer' Window open the `wolfCrypt_example_system` and right-click on the `wolfCrypt_example` project. Click 'Generate Linker Script'.
+ - Configure the memory sections you want to use, the default should be OK for this example.
+ - 'Heap Size' must be increased according to your use case. For this example to run it is sufficient to increase to `8 MB`. For benchmarks with big chunk sizes increase to `512 MB`.
+ - Increase 'Stack Size' to `32 KB`.
+ - Click 'Generate'
+
+## FreeRTOS based example projects
+
+1. In the previously created `vmk180` platform, one can see a tree where you can also find the "Board support package" settings.
+ - Click on the bold green `+` on the top to 'Add Domain'.
+ - Give the new domain the name "freertos" and change the "OS" in the drop-down menu to "freertos".
+2. Repeat the same steps of the previous step 3 for the newly created domain.
+ - In the tree-view select "freertos10_xilinx" and then open the "kernel_behavior" sub-entry.
+ - Change `minimal_stack_size` to `8000`, `tick_rate` to `1000` and `total_heap_size` to `8388608`. "Big chunk sizes" have not been tested under FreeRTOS.
+3. Repeat the same steps of the preivous steps 4 to 6, but with the `wolfCrypt_FreeRTOS_example` resp. `wolfCrypt_FreeRTOS_example_system`.
+
+
+## Troubleshooting
+
+* `make: *** No rule to make target '../src/lscript.ld', needed by 'wolfCrypt_example.elf'. Stop.`: You forgot to create the linker script
+* `/path/to/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h:30:10: fatal error: xsecure_mailbox.h: No such file or directory`: You forgot to add the `xilmailbox` and/or `xilsecure` libraries.
+* `/path/to/wolfssl/wolfcrypt/src/port/xilinx/xil-aesgcm.c:90: undefined reference to 'Secure_AesInitialize'` (and others): You forgot to build the platform project after adding the libraries.
+
+## Code formatter
+
+In case one wants to write code in "wolfSSL style" in Vitis:
+ - go to "Window->Preferences->Additional->C/C++->Code Style->Formatter".
+ - Click on 'Import', navigate to `wolfssl/IDE/XilinxSDK/` and select the file `eclipse_formatter_profile.xml`, click on 'Apply and Close'.
+
+## Configuration
+
+All configuration is done through the header file in `wolfssl/IDE/XilinxSDK/user_settings.h`
+
+### Build flavors
+
+Define `WOLFSSL_XILINX_CRYPT` to enable the **crypto engines**. (This is the default)
+
+Undefine `WOLFSSL_XILINX_CRYPT` and define `WOLFSSL_ARMASM` to enable the **ARMv8 Cryptographic Extensions**.
+
+Undefine both `WOLFSSL_XILINX_CRYPT` and `WOLFSSL_ARMASM` to enable a **software-only build**.
+
+### Further features
+
+Define `WC_XIL_AESGCM_DPA_CM` to enable Counter Measures for Differential Power Analysis of the AES-GCM core. (Only available when using the crypto engines).
+
+Undefine `HAVE_HASHDRBG` to enable usage of the DRBG in the crypto engine.
+
+Define `WOLFSSL_ECDSA_DETERMINISTIC_K` to use "deterministic K" as of RFC6979. (Supported for all three build flavors).
+
+
# Steps For Creating Project From Scratch
1. Create a new workspace
diff --git a/IDE/XilinxSDK/bench.sh b/IDE/XilinxSDK/bench.sh
new file mode 100755
index 000000000..2c9fce7d9
--- /dev/null
+++ b/IDE/XilinxSDK/bench.sh
@@ -0,0 +1,76 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Parametrisation to this script is as follows:
+# * The first argument will be taken as suffix to the result folder
+# e.g. `./bench.sh _config0`
+# * It is possible to make its output a bit more verbose by setting
+# the `VERBOSE` environment variable to '1', e.g. via
+# `VERBOSE=1 ./bench.sh` or to make it quiet by setting it to '0'
+# * Per default we read from /dev/ttyUSB2, by setting the `WC_TTY`
+# environment variable this can adapted
+# e.g. `WC_TTY=/dev/ttyACM0 ./bench.sh`
+
+###
+# Preamble
+###
+
+readonly my_path=$(dirname $(readlink -f $0))
+readonly csv_path_suffix="$1"
+
+readonly common_opts="-blocks 128"
+readonly ccm_gcm_opts="-all_aad -aad_size 13"
+
+# options used in `small_block()`
+readonly cbc_opts="$common_opts"
+readonly ccm_opts="$common_opts $ccm_gcm_opts"
+readonly gcm_opts="$common_opts $ccm_gcm_opts"
+readonly small_block_ciphers="cbc ccm gcm"
+readonly small_block_ciphers_hw="gcm"
+readonly small_block_sizes="16 528 1024 4112 7696 15888 32768 65536 131072"
+
+# options used in `large_block()`
+readonly ccm_fast_opts="$common_opts -all_aad"
+readonly gcm_fast_opts="$common_opts -all_aad"
+# 512 MiB transfer, 128 MiB max. blocksize
+readonly large_block_ciphers="gcm"
+readonly large_num_bytes=$((512 * 1024 * 1024))
+readonly large_max_blocksize=$((128 * 1024 * 1024))
+
+
+source "$my_path"/../../scripts/bench/bench_functions.sh
+
+
+###
+# Implementation
+###
+
+[ "$1" == "_HW" ] && small_block "$small_block_ciphers_hw" \
+ || small_block "$small_block_ciphers"
+
+# No large blocksizes for analysis
+#[ "$1" == "_HW" ] && large_block
+
+# Benchmark only on HW and SW
+if [ "$1" != "_ARMv8" ]; then
+ bench "ecc" "-ecc -ecc-all -ecc-kg"
+
+ bench "sha3" "-sha3-384"
+
+ for keysize in 2048 3072 4096
+ do
+ bench "rsa" "-rsa-sz -rsa-kg $keysize" "_$keysize"
+ done
+
+ bench "rng" "-rng"
+fi
+
+# Benchmark only on ARMv8 and SW
+if [ "$1" != "_HW" ]; then
+ bench "sha2" "-sha2"
+
+ bench "cmac" "-cmac"
+fi
+
+#eof
diff --git a/IDE/XilinxSDK/combine.sh b/IDE/XilinxSDK/combine.sh
new file mode 100755
index 000000000..fc697a6b4
--- /dev/null
+++ b/IDE/XilinxSDK/combine.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Parametrisation to this script is as follows:
+# * none yet
+
+###
+# Preamble
+###
+
+readonly my_path="$(dirname $(readlink -f $0))"
+readonly csv_path="$my_path/data"
+
+function cleanup() {
+ echo OK
+}
+trap cleanup EXIT
+
+function error_out() {
+ exit 1
+}
+trap error_out INT TERM
+
+###
+# Functions
+###
+
+
+
+###
+# Implementation
+###
+
+readonly configs=$(find $csv_path -maxdepth 1 -type d -name '*results_*' | sed 's@.*results_@@g')
+
+declare -A algos
+algos["asym"]="ecc rsa"
+algos["hashes"]="sha2 sha3"
+algos["mac"]="cmac"
+algos["rng"]="rng"
+algos["sym"]="cbc ccm gcm"
+
+declare -A headers
+headers["asym"]="config,keysize_2,algorithm,keysize,operation,avg ms,ops/sec,"
+headers["hashes"]="config,unused,algorithm,MiB/s,"
+headers["mac"]="config,unused,algorithm,keysize,MiB/s,"
+headers["rng"]="config,unused,algorithm,MiB/s,"
+headers["sym"]="config,chunksize,algorithm,blocksize,direction,AAD,MiB/s,"
+
+# "... now you have two problems"
+declare -A filters
+filters["ccm"]="-e s/-\(enc\|dec\)-\(no_AAD\|custom\)/,128,\1,\2/g -e s/-\(enc\|dec\),/,128,\1,,/g"
+filters["gcm"]="-e /-192-/d -e /GMAC/d -e s/-\(enc\|dec\)-\(no_AAD\|custom\)/,\1,\2/g -e s/-\(enc\|dec\),/,\1,default,/g -e s/\(128\|256\)-GCM/GCM,\1/g"
+filters["cbc"]="-e /-192-/d -e s/-\(enc\|dec\),/,\1,,/g -e s/\(128\|256\)-CBC/CBC,\1/g"
+filters["cmac"]="-e s/\(128\|256\)-CMAC/CMAC,\1/g"
+filters["ecc"]='-e 1!{/SECP384R1\|SECP521R1/!d}'
+filters["sha2"]="-e s/SHA-/SHA2-/g"
+
+for t in ${!algos[@]}
+do
+ for algo in ${algos[$t]}
+ do
+ outfile="$csv_path/combined_${algo}.csv"
+ echo ${headers[$t]} > "$outfile"
+ for cfg in $configs
+ do
+ for f in $(find $csv_path/results_${cfg} -name "*${algo}*.csv" | sort -V)
+ do
+ sz=$(basename $f | sed -e s/${algo}// -e s/_// -e s/\.csv//)
+ sz=",$sz"
+ for l in $(tail -n +2 $f | tr -d ' ')
+ do
+ echo "${cfg}${sz},${l}" >> "$outfile"
+ done
+ [ "${filters[$algo]}" == "" ] || sed -i "$outfile" ${filters[$algo]}
+ done
+ echo $algo $t $cfg
+ done
+ done
+done
diff --git a/IDE/XilinxSDK/eclipse_formatter_profile.xml b/IDE/XilinxSDK/eclipse_formatter_profile.xml
new file mode 100644
index 000000000..832431d04
--- /dev/null
+++ b/IDE/XilinxSDK/eclipse_formatter_profile.xml
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IDE/XilinxSDK/graph.sh b/IDE/XilinxSDK/graph.sh
new file mode 100755
index 000000000..d66cbdf63
--- /dev/null
+++ b/IDE/XilinxSDK/graph.sh
@@ -0,0 +1,327 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Parametrisation to this script is as follows:
+# * none yet
+
+###
+# Preamble
+###
+
+readonly my_path="$(dirname $(readlink -f $0))"
+readonly csv_path="$my_path/data"
+readonly log_path="$csv_path/logs"
+readonly img_path="$csv_path/images"
+readonly gnuplot_terminal="svg enhanced background rgb 'white' size 800 600"
+mkdir -p "$log_path"
+mkdir -p "$img_path"
+
+function cleanup() {
+ echo OK
+}
+trap cleanup EXIT
+
+function error_out() {
+ exit 1
+}
+trap error_out INT TERM
+
+###
+# Functions
+###
+
+
+function cg() {
+ csvgrep -c $1 -r $2 $3
+}
+
+
+###
+# Implementation
+###
+
+readonly desc_block_ciphers="Benchmarks were done with growing sample size and averaging over\nprocessing of 128 samples of said sample size"
+readonly desc_asymmetric="Benchmarks were done with averaging over\nas many repetitions possible of the benchmarked operation in 1s"
+readonly desc_others="Benchmarks were done with 1MiB block size and averaging over\nas many repetitions possible of processing 5MiB data in 1s"
+
+readonly configs=$(find $csv_path -type d -name '*results*' | sed 's@.*results_@@g')
+
+###
+# Symmetric crypto
+
+readonly sym="cbc ccm gcm"
+
+declare -A directions
+directions["dec"]="decryption"
+directions["enc"]="encryption"
+
+declare -A aad_sizes
+aad_sizes["no_AAD"]="0 Bytes"
+aad_sizes["custom"]="13 Bytes"
+aad_sizes["default"]="16 Bytes"
+
+# not pretty but works for me :)
+# CBC&GCM encryption is in software a lot faster than decryption,
+# therefor use the same Range on the Y-Axis to also have a visual indication.
+# This will break if something changes, so let the user override the value
+cbc_yrange="${cbc_yrange:=1400}"
+gcm_yrange="${gcm_yrange:=500}"
+
+for mode in $sym
+do
+ infile="$csv_path/combined_${mode}.csv"
+ for dir in ${!directions[@]}
+ do
+ plotstring=
+ more_style=
+ for cfg in $configs
+ do
+ for bsize in $(csvcut -c blocksize $infile | tail -n +2 | sort -u)
+ do
+ if [ "$mode" == "cbc" ]; then
+ outfile=$log_path/${mode}${bsize}_${cfg}_${dir}.log
+ val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')"
+ if [ "$val" != "" ]; then
+ echo "$val" > $outfile
+ [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring},"
+ plotstring="${plotstring} '"$outfile"' smooth bezier title \"$cfg AES$bsize\""
+ fi
+ [ "$mode" == "cbc" -a "$cbc_yrange" != "" ] && more_style="set yrange [ 0 : $cbc_yrange ]"
+ else
+ for aad in ${!aad_sizes[@]}
+ do
+ outfile=$log_path/${mode}${bsize}_${cfg}_${dir}_${aad}.log
+ val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | cg AAD $aad | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')"
+ if [ "$val" != "" ]; then
+ echo "$val" > $outfile
+ [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring},"
+ plotstring="${plotstring} '"$outfile"' smooth bezier title \"$cfg AES$bsize ${aad_sizes[$aad]} AAD\""
+ fi
+ done
+ [ "$mode" == "gcm" -a "$gcm_yrange" != "" ] && more_style="set yrange [ 0 : $gcm_yrange ]"
+ fi
+ done
+ done
+ modep=${mode^^}
+ gnuplot << EOF
+set terminal $gnuplot_terminal
+set title "${modep} ${directions[${dir}]} on Xilinx Versal"
+set x2label "${desc_block_ciphers}"
+set xlabel "Sample size"
+set ylabel "MiB/s"
+set style data lines
+$more_style
+
+set output "${img_path}/${mode}_${dir}.${gnuplot_terminal%% *}"
+$plotstring
+EOF
+ done
+done
+
+###
+# Also create separate graphs for AES-GCM-128 and -256 since that's too many lines in one image
+
+for mode in gcm
+do
+ infile="$csv_path/combined_${mode}.csv"
+ for dir in ${!directions[@]}
+ do
+ for bsize in $(csvcut -c blocksize $infile | tail -n +2 | sort -u)
+ do
+ plotstring=
+ more_style="set yrange [ 0 : $gcm_yrange ]"
+ for cfg in $configs
+ do
+ for aad in ${!aad_sizes[@]}
+ do
+ outfile=$log_path/${mode}${bsize}_${cfg}_${dir}_${aad}.log
+ val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | cg AAD $aad | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')"
+ if [ "$val" != "" ]; then
+ echo "$val" > $outfile
+ [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring},"
+ plotstring="${plotstring} '"$outfile"' smooth bezier title \"$cfg AES$bsize ${aad_sizes[$aad]} AAD\""
+ fi
+ done
+ done
+ modep=${mode^^}
+ gnuplot << EOF
+set terminal $gnuplot_terminal
+set title "${modep}-${bsize} ${directions[${dir}]} on Xilinx Versal"
+set x2label "${desc_block_ciphers}"
+set xlabel "Sample size"
+set ylabel "MiB/s"
+set style data lines
+$more_style
+
+set output "${img_path}/${mode}${bsize}_${dir}.${gnuplot_terminal%% *}"
+$plotstring
+EOF
+ done
+ done
+done
+
+###
+# Asymmetric crypto
+
+declare -A asym_operations
+asym_operations["ecc"]="keygen agree sign verify"
+asym_operations["rsa"]="keygen public private"
+
+for algo in ${!asym_operations[@]}
+do
+ infile="$csv_path/combined_${algo}.csv"
+ for op in ${asym_operations[$algo]}
+ do
+ outfile=$log_path/${algo}_${op}.log
+ echo -n "" > $outfile
+ for ksize in $(csvcut -c keysize $infile | tail -n +2 | sort -u)
+ do
+ for cfg in $configs
+ do
+ h="${algo^^}-$ksize"
+ v=$(cg config $cfg $infile | cg operation $op | cg keysize $ksize | csvcut -c "avg ms" | tail -n +2 | tr ',' ' ')
+ [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile
+ done
+ done
+ algop=${algo^^}
+ gnuplot << EOF
+set terminal $gnuplot_terminal
+set title "${algop} ${op} on Xilinx Versal"
+set x2label "${desc_asymmetric}"
+set xlabel 'Configurations' offset 0,-1
+set ylabel "ms per op"
+set style fill solid
+set style line 1 lc rgb "grey50"
+set boxwidth 0.5
+unset key
+
+
+set output "${img_path}/${algo}_${op}.${gnuplot_terminal%% *}"
+plot "$outfile" using :2:xtic(1) with boxes ls 1, \
+ '' using :2:2 w labels offset 0,0.7
+EOF
+ done
+done
+
+###
+# Hashes
+
+declare -A hash_sizes
+hash_sizes["sha2"]="224 256 384 512"
+hash_sizes["sha3"]="384"
+
+plotstring=
+outfile=$log_path/sha.log
+echo -n "" > $outfile
+for algo in ${!hash_sizes[@]}
+do
+ infile="$csv_path/combined_${algo}.csv"
+ for hsize in ${hash_sizes[$algo]}
+ do
+ for cfg in $configs
+ do
+ h="${algo^^}-$hsize"
+ v=$(cg config $cfg $infile | cg algorithm $h | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@')
+ [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile
+ done
+ echo >> $outfile
+ done
+done
+
+gnuplot << EOF
+set terminal $gnuplot_terminal
+set title "SHA2/SHA3 on Xilinx Versal"
+set x2label "${desc_others}"
+set xlabel 'Configurations' offset 0,-1
+set ylabel "MiB/s"
+set style fill solid
+set style line 1 lc rgb "grey50"
+set boxwidth 0.5
+unset key
+
+
+set output "${img_path}/sha.${gnuplot_terminal%% *}"
+plot "$outfile" using :2:xtic(1) with boxes ls 1, \
+ '' using :2:2 w labels offset 0,0.7
+EOF
+
+###
+# MACs
+
+declare -A macs
+macs["cmac"]="128 256"
+
+plotstring=
+outfile=$log_path/mac.log
+echo -n "" > $outfile
+for algo in ${!macs[@]}
+do
+ infile="$csv_path/combined_${algo}.csv"
+ for hsize in ${macs[$algo]}
+ do
+ for cfg in $configs
+ do
+ h="${algo^^}-$hsize"
+ v=$(cg config $cfg $infile | cg keysize $hsize | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@')
+ [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile
+ done
+ echo >> $outfile
+ done
+done
+
+gnuplot << EOF
+set terminal $gnuplot_terminal
+set title "MAC's on Xilinx Versal"
+set x2label "${desc_others}"
+set xlabel 'Configurations' offset 0,-1
+set ylabel "MiB/s"
+set style fill solid
+set style line 1 lc rgb "grey50"
+set boxwidth 0.5
+unset key
+set yrange [ 0 : 500 ]
+
+
+set output "${img_path}/mac.${gnuplot_terminal%% *}"
+plot "$outfile" using :2:xtic(1) with boxes ls 1, \
+ '' using :2:2 w labels offset 0,0.7
+EOF
+
+###
+# RNG
+
+plotstring=
+outfile=$log_path/rng.log
+echo -n "" > $outfile
+for algo in rng
+do
+ infile="$csv_path/combined_${algo}.csv"
+ for cfg in $configs
+ do
+ h="${algo^^}"
+ v=$(cg config $cfg $infile | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@')
+ [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile
+ done
+ echo >> $outfile
+done
+
+gnuplot << EOF
+set terminal $gnuplot_terminal
+set title "RNG on Xilinx Versal"
+set x2label "${desc_others}"
+set xlabel 'Configurations' offset 0,-1
+set ylabel "MiB/s"
+set style fill solid
+set style line 1 lc rgb "grey50"
+set boxwidth 0.5
+unset key
+set yrange [ 0 : 50 ]
+
+with_unit(Value,Unit) = sprintf("%d %s", Value, Unit)
+set output "${img_path}/rng.${gnuplot_terminal%% *}"
+plot "$outfile" using :2:xtic(1) with boxes ls 1, \
+ '' using :2:2 w labels offset 0,0.7
+EOF
+
+#eof
diff --git a/IDE/XilinxSDK/include.am b/IDE/XilinxSDK/include.am
index 32d47e4c2..0a103be7b 100644
--- a/IDE/XilinxSDK/include.am
+++ b/IDE/XilinxSDK/include.am
@@ -3,6 +3,10 @@
# All paths should be given relative to the root
EXTRA_DIST+= IDE/XilinxSDK/README.md
+EXTRA_DIST+= IDE/XilinxSDK/bench.sh
+EXTRA_DIST+= IDE/XilinxSDK/combine.sh
+EXTRA_DIST+= IDE/XilinxSDK/eclipse_formatter_profile.xml
+EXTRA_DIST+= IDE/XilinxSDK/graph.sh
EXTRA_DIST+= IDE/XilinxSDK/user_settings.h
EXTRA_DIST+= IDE/XilinxSDK/wolfssl_example.c
EXTRA_DIST+= IDE/XilinxSDK/2018_2/lscript.ld
@@ -14,3 +18,10 @@ EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example/src/lscript.ld
EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.cproject
EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/.project
EXTRA_DIST+= IDE/XilinxSDK/2019_2/wolfCrypt_example_system/wolfCrypt_example_system.sprj
+EXTRA_DIST+= IDE/XilinxSDK/2022_1/.gitignore
+EXTRA_DIST+= IDE/XilinxSDK/2022_1/wolfCrypt_example/.cproject
+EXTRA_DIST+= IDE/XilinxSDK/2022_1/wolfCrypt_example/.project
+EXTRA_DIST+= IDE/XilinxSDK/2022_1/wolfCrypt_example/wolfCrypt_example.prj
+EXTRA_DIST+= IDE/XilinxSDK/2022_1/wolfCrypt_example_system/.cproject
+EXTRA_DIST+= IDE/XilinxSDK/2022_1/wolfCrypt_example_system/.project
+EXTRA_DIST+= IDE/XilinxSDK/2022_1/wolfCrypt_example_system/wolfCrypt_example_system.sprj
diff --git a/IDE/XilinxSDK/user_settings.h b/IDE/XilinxSDK/user_settings.h
index 1cb5644e2..4e7135aa8 100644
--- a/IDE/XilinxSDK/user_settings.h
+++ b/IDE/XilinxSDK/user_settings.h
@@ -23,32 +23,41 @@
* user_settings.h
*
* Created on: Mar 20, 2020
- * Generated using:
+ * Generated using:
* ./configure --enable-cryptonly --enable-armasm --enable-ecc --enable-aesgcm --enable-pwdbased --enable-sp --enable-sp-asm \
- * --disable-dh --disable-sha --disable-md5 --disable-sha224 --disable-aescbc --disable-shake256
+ * --disable-dh --disable-sha --disable-md5 --disable-sha224 --disable-aescbc --disable-shake256
* Result: wolfssl/options.h
*/
#ifndef SRC_USER_SETTINGS_H_
#define SRC_USER_SETTINGS_H_
+#include
+
/* Disable all TLS support, only wolfCrypt features */
#define WOLFCRYPT_ONLY
/* Xilinx SDK */
#define WOLFSSL_XILINX
+#define WOLFSSL_XILINX_CRYPT
+#if defined(versal) && defined(WOLFSSL_XILINX_CRYPT)
+#define WOLFSSL_XILINX_CRYPT_VERSAL
+#endif
#ifndef FREERTOS
#define SINGLE_THREADED
#endif
#define NO_FILESYSTEM
+#define HAVE_UINTPTR_T
/* Platform - remap printf */
#include "xil_printf.h"
#define XPRINTF xil_printf
+#if !defined(WOLFSSL_XILINX_CRYPT_VERSAL)
/* Enable ARMv8 (Aarch64) assembly speedups - SHA256 / AESGCM */
/* Note: Requires CFLAGS="-mcpu=generic+crypto -mstrict-align" */
#define WOLFSSL_ARMASM
+#endif
/* Math */
#define USE_FAST_MATH
@@ -61,20 +70,47 @@
#define WOLFSSL_HAVE_SP_ECC
#define WOLFSSL_HAVE_SP_RSA
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
/* Random: HashDRGB / P-RNG (SHA256) */
+/* Versal supports both, with and w/o software-based HashDRGB.
+ * It's your choice */
+#define HAVE_HASHDRBG
+
+#define WOLFSSL_PSV_TRNG_DEV_ID XPAR_VERSAL_CIPS_0_PSPMC_0_PSV_PMC_TRNG_DEVICE_ID
+#if !defined(HAVE_HASHDRBG)
+#define CUSTOM_RAND_GENERATE_BLOCK wc_VersalTrngGenerate
+#else
+#define CUSTOM_RAND_GENERATE_SEED wc_VersalTrngGenerate
+#endif
+#else
+/* If we don't use the Versal Crypto we need the HASHDRBG */
#define HAVE_HASHDRBG
extern unsigned char my_rng_seed_gen(void);
#define CUSTOM_RAND_GENERATE my_rng_seed_gen
+#endif
/* Timing Resistance */
#define TFM_TIMING_RESISTANT
#define ECC_TIMING_RESISTANT
#define WC_RSA_BLINDING
+//#define WC_XIL_AESGCM_DPA_CM
/* ECC */
#define HAVE_ECC
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+#define ECC_USER_CURVES
+#define NO_ECC256
+#define WOLFSSL_SP_NO_256
+#define HAVE_ECC384
+#define WOLFSSL_SP_384
+#define HAVE_ECC521
+#define WOLFSSL_SP_521
+/* Versal also supports usage of RFC6979 if you want to */
+//#define WOLFSSL_ECDSA_DETERMINISTIC_K
+#else
#define TFM_ECC256
#define ECC_SHAMIR
+#endif
/* DH */
#undef NO_DH
@@ -94,15 +130,21 @@ extern unsigned char my_rng_seed_gen(void);
#define HAVE_CHACHA
#define HAVE_POLY1305
-/* AES-GCM Only */
-#define NO_AES_CBC
+/* AES-CBC is enabled by default if not disabled
+ * The others have to be enabled */
+#define HAVE_AESCCM
#define HAVE_AESGCM
+#define WOLFSSL_AES_DIRECT
+#define WOLFSSL_CMAC
/* Hashing */
#define WOLFSSL_SHA512
#define WOLFSSL_SHA384
+#define WOLFSSL_SHA224
#define WOLFSSL_SHA3
#define WOLFSSL_NO_HASH_RAW /* not supported with ARMASM */
+#define WOLFSSL_NO_SHAKE128
+#define WOLFSSL_NO_SHAKE256
/* HKDF */
#define HAVE_HKDF
@@ -118,8 +160,12 @@ extern unsigned char my_rng_seed_gen(void);
/* Other */
#define WOLFSSL_IGNORE_FILE_WARN /* Ignore file include warnings */
-#define NO_MAIN_DRIVER /* User supplied "main" entry point */
-#define BENCH_EMBEDDED /* Use smaller buffers for benchmarking */
+#define NO_MAIN_FUNCTION /* User supplied "main" entry point */
+//#define BENCH_EMBEDDED /* Use smaller buffers for benchmarking */
+#define WOLFSSL_KEY_GEN
+/* Pre-define AAD size to 16 for benchmarks. When executing the benchmarks we
+ * also use a custom size of 13 to measure "the default size". */
+#define AES_AUTH_ADD_SZ 16
/* Test with "wolfssl/certs_test.h" buffers - no file system */
#define USE_CERT_BUFFERS_256
@@ -127,7 +173,7 @@ extern unsigned char my_rng_seed_gen(void);
/* Debugging */
#if 0
- #define DEBUG_WOLFSSL
+ #define DEBUG_WOLFSSL
#endif
#endif /* SRC_USER_SETTINGS_H_ */
diff --git a/IDE/XilinxSDK/wolfssl_example.c b/IDE/XilinxSDK/wolfssl_example.c
index 1b21c03e2..d2829ba7d 100644
--- a/IDE/XilinxSDK/wolfssl_example.c
+++ b/IDE/XilinxSDK/wolfssl_example.c
@@ -48,26 +48,31 @@
/*****************************************************************************
* Public types/enumerations/variables
****************************************************************************/
-typedef struct func_args {
- int argc;
- char** argv;
- int return_code;
+typedef struct func_args
+{
+ int argc;
+ char **argv;
+ int return_code;
} func_args;
const char menu1[] = "\n"
- "\tt. WolfCrypt Test\n"
- "\tb. WolfCrypt Benchmark\n";
+ "\tb. WolfCrypt Benchmark\n"
+ "\tt. WolfCrypt Test\n"
+ "\n"
+ "\tc. Command mode\n";
/*****************************************************************************
* Private functions
****************************************************************************/
+#if !defined(WOLFSSL_XILINX_CRYPT_VERSAL)
/* Test RNG Seed Function */
/* TODO: Must provide real seed to RNG */
unsigned char my_rng_seed_gen(void)
{
- static unsigned int kTestSeed = 1;
- return kTestSeed++;
+ static unsigned int kTestSeed = 1;
+ return kTestSeed++;
}
+#endif
/*****************************************************************************
* Public functions
@@ -79,6 +84,8 @@ static TaskHandle_t xWolfsslTask;
int main( void )
{
+ xil_printf("\nStarting up FreeRTOS\n");
+
xTaskCreate(wolfssl_task, /* The function that implements the task. */
(const char*) "Tx", /* Text name for the task, provided to assist debugging only. */
configMINIMAL_STACK_SIZE, /* The stack allocated to the task. */
@@ -103,8 +110,12 @@ static void wolfssl_task( void *pvParameters )
int main()
#endif
{
- uint8_t cmd;
- func_args args;
+ uint8_t cmd[128], c;
+ char *arg[sizeof(cmd)/2 + 1];
+ size_t cmdlen, argnum, n;
+ func_args args;
+ int (*func)(int argc, char** argv);
+ int command_mode = 0;
#ifdef DEBUG_WOLFSSL
wolfSSL_Debugging_ON();
@@ -117,38 +128,87 @@ int main()
memset(&args, 0, sizeof(args));
args.return_code = NOT_COMPILED_IN; /* default */
- xil_printf("\n\t\t\t\tMENU\n");
- xil_printf(menu1);
- xil_printf("Please select one of the above options:\n");
+ if (!command_mode) {
+ xil_printf("\n\t\t\t\tMENU\n");
+ xil_printf(menu1);
+ xil_printf("Please select one of the above options:\n");
+ xil_printf("Both 'b' and 't' allow arguments as if you'd call the regular shell version.\n");
+ }
+
+ cmdlen = 0;
do {
- cmd = inbyte();
- } while (cmd == '\n' || cmd == '\r');
+ c = inbyte();
+ cmd[cmdlen] = c;
+ if (!command_mode) outbyte(c);
+ cmdlen++;
+ cmdlen %= sizeof(cmd);
+ } while (c != '\n' && c != '\r');
- switch (cmd) {
- case 't':
- xil_printf("Running wolfCrypt Tests...\n");
- #ifndef NO_CRYPT_TEST
- args.return_code = 0;
- wolfcrypt_test(&args);
- #endif
- xil_printf("Crypt Test: Return code %d\n", args.return_code);
- break;
+ if (cmdlen > 2) {
+ outbyte('\n');
+ /* Poor man's argv parser */
+ XMEMSET(arg, 0, sizeof(arg));
+ if (cmd[1] == ' ') {
+ if (cmd[0] == 'b') {
+ arg[0] = "wolfcrypt_benchmark";
+ func = wolfcrypt_benchmark_main;
+ } else if (cmd[0] == 't') {
+ arg[0] = "wolfcrypt_test";
+ func = wolfcrypt_test_main;
+ }
+ if (arg[0] != NULL) {
+ argnum = 1;
+ for (n = 2; n < cmdlen; ++n) {
+ switch (cmd[n]) {
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ cmd[n] = '\0';
+ if (arg[argnum] != NULL)
+ argnum++;
+ break;
+ default:
+ if (arg[argnum] == NULL)
+ arg[argnum] = (char*)&cmd[n];
+ break;
+ }
+ }
+ func(argnum, arg);
+ }
+ }
+ } else {
+ switch (cmd[0]) {
+ case 't':
+ xil_printf("Running wolfCrypt Tests...\n");
+ #ifndef NO_CRYPT_TEST
+ args.return_code = 0;
+ wolfcrypt_test(&args);
+ #endif
+ xil_printf("Crypt Test: Return code %d\n", args.return_code);
+ break;
- case 'b':
- xil_printf("Running wolfCrypt Benchmarks...\n");
- #ifndef NO_CRYPT_BENCHMARK
- args.return_code = 0;
- benchmark_test(&args);
- #endif
- xil_printf("Benchmark Test: Return code %d\n", args.return_code);
- break;
+ case 'b':
+ xil_printf("Running wolfCrypt Benchmarks...\n");
+ #ifndef NO_CRYPT_BENCHMARK
+ args.return_code = 0;
+ benchmark_test(&args);
+ #endif
+ xil_printf("Benchmark Test: Return code %d\n", args.return_code);
+ break;
- default:
- xil_printf("\nSelection out of range\n");
- break;
- }
- }
+ case 'c':
+ if (!command_mode) xil_printf("Entering command mode, enter 'c' to return to manual mode\n");
+ command_mode ^= 1;
+ break;
+
+ default:
+ if (!command_mode) xil_printf("\nSelection out of range\n");
+ break;
+ }
+ }
+ }
wolfCrypt_Cleanup();
#ifndef FREERTOS
diff --git a/scripts/bench/bench_functions.sh b/scripts/bench/bench_functions.sh
new file mode 100755
index 000000000..395ac80a9
--- /dev/null
+++ b/scripts/bench/bench_functions.sh
@@ -0,0 +1,137 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Parametrisation to this script is as follows:
+# * `my_path` MUST be set
+# * `WC_TTY` can be set to override the default '/dev/ttyUSB2'
+# * `csv_path_suffix` can be set to add a suffix to the output path
+# * `VERBOSE` can be set to '0' to suppress all output
+# or '1' to make the output more verbose
+
+###
+# Preamble
+###
+
+
+if (return 0 2>/dev/null); then
+ [ "$my_path" != "" ] || { echo "\$my_path must not be empty"; return 1; }
+else
+ echo "This script shall only be sourced"
+ exit 1
+fi
+
+readonly tty="${WC_TTY:-/dev/ttyUSB2}"
+readonly fifo="$(mktemp -u)"
+readonly csv_path="${my_path}/data/results${csv_path_suffix}"
+
+function status_echo() {
+ [ "$VERBOSE" = "0" ] || echo "$*"
+}
+
+function cleanup() {
+ wait
+ rm $fifo
+}
+mkfifo $fifo
+trap cleanup EXIT
+
+function error_out() {
+ exit 1
+}
+trap error_out INT TERM
+
+mkdir -p $csv_path
+
+status_echo "Writing to folder: $csv_path"
+status_echo "Reading from TTY: $tty"
+
+###
+# Functions
+###
+
+function read_tty() {
+ while true; do
+ read -r l
+ $1 "$l"
+ $read_tty_ret
+ done < $tty
+}
+
+function wait_until_finished() {
+ while true; do
+ read -r ret
+ [ "$ret" == "finished" ] && break
+ done < $fifo
+}
+
+function process_csv() {
+ read_tty_ret=
+ case "$csv_state" in
+ "0")
+ case "$1" in
+ "Algorithm,MB/s,Cycles per byte," | \
+ "Algorithm,key size,operation,avg ms,ops/sec,")
+ echo "$1" > $csv
+ csv_state=1
+ ;;
+ esac
+ ;;
+ "1")
+ if [ "$1" != "Benchmark complete" ]; then
+ echo "$1" >> $csv
+ [ "$VERBOSE" = "1" ] && echo "$1"
+ else
+ echo "finished" > $fifo
+ read_tty_ret=return
+ fi
+ ;;
+ esac
+}
+
+function csv_start() {
+ csv_state=0
+ csv=$csv_path/$1
+ read_tty process_csv &
+}
+
+function bench() {
+ status_echo "Benchmark ${1^^}$3"
+ csv_start ${1}${3}.csv
+ echo "b $2 -csv" > $tty
+ wait_until_finished
+}
+
+###
+# Implementation
+###
+
+function small_block() {
+ for blocksize in $small_block_sizes
+ do
+ status_echo "Benchmark with $blocksize bytes sized blocks"
+ for mode in $1
+ do
+ local opts=${mode}_opts
+ bench "${mode}" "-aes-${mode} $blocksize ${!opts}" "_${blocksize}"
+ done
+ done
+}
+
+function large_block() {
+ # 1 MiB
+ local blocksize=$((1024 * 1024))
+ while [ $blocksize -lt $large_max_blocksize ]
+ do
+ local num_blocks=$(($large_num_bytes / $blocksize))
+ status_echo "Benchmark with $blocksize bytes sized blocks"
+ for mode in $large_block_ciphers
+ do
+ local opts=${mode}_fast_opts
+ bench "${mode}" "-aes-${mode} ${!opts} $blocksize -blocks $num_blocks" "_${blocksize}"
+ done
+ blocksize=$(($blocksize * 2))
+ done
+}
+
+#eof
diff --git a/scripts/include.am b/scripts/include.am
index cd891ab26..c0397374f 100644
--- a/scripts/include.am
+++ b/scripts/include.am
@@ -118,3 +118,5 @@ if BUILD_DTLS13
EXTRA_DIST += scripts/dtls13.test
EXTRA_DIST += scripts/dtlscid.test
endif
+
+EXTRA_DIST += scripts/bench/bench_functions.sh
diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c
index 03b6fd63f..a92190bf3 100644
--- a/wolfcrypt/src/ecc.c
+++ b/wolfcrypt/src/ecc.c
@@ -197,6 +197,10 @@ ECC Curve Sizes:
#include
#endif
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ #include
+#endif
+
#if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
#include
@@ -221,6 +225,9 @@ ECC Curve Sizes:
/* forward declarations */
static int wc_ecc_new_point_ex(ecc_point** point, void* heap);
static void wc_ecc_del_point_ex(ecc_point* p, void* heap);
+#if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
+static int deterministic_sign_helper(const byte* in, word32 inlen, ecc_key* key);
+#endif
/* internal ECC states */
enum {
@@ -1324,6 +1331,52 @@ enum ecc_curve_load_mask {
#endif
};
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+static const u32 xil_curve_type[ECC_CURVE_MAX] = {
+ [ECC_SECP384R1] = WOLFSSL_XSECURE_ECC_NIST_P384,
+ [ECC_SECP521R1] = WOLFSSL_XSECURE_ECC_NIST_P521,
+};
+
+static void buf_reverse(byte *outbuf, const byte *inbuf, word32 len)
+{
+ word32 up, down;
+ up = 0;
+ down = len - 1;
+ while (up < len)
+ outbuf[up++] = inbuf[down--];
+}
+
+static int xil_mpi_import(mp_int *mpi,
+ const byte *inbuf,
+ word32 len,
+ void* heap)
+{
+ int err;
+#ifdef WOLFSSL_SMALL_STACK
+ byte* buf = NULL;
+#else
+ byte buf[MAX_ECC_BYTES];
+
+ if (len > MAX_ECC_BYTES)
+ return BUFFER_E;
+#endif
+
+#ifdef WOLFSSL_SMALL_STACK
+ buf = (byte*)XMALLOC(len, heap, DYNAMIC_TYPE_PRIVATE_KEY);
+ if (buf == NULL)
+ return MEMORY_E;
+#endif
+ buf_reverse(buf, inbuf, len);
+
+ err = mp_read_unsigned_bin(mpi, buf, len);
+ ForceZero(buf, len);
+#ifdef WOLFSSL_SMALL_STACK
+ XFREE(buf, heap, DYNAMIC_TYPE_PRIVATE_KEY);
+#endif
+ return err;
+}
+#endif
+
#ifdef ECC_CACHE_CURVE
/* cache (mp_int) of the curve parameters */
static ecc_curve_spec* ecc_curve_spec_cache[ECC_SET_COUNT];
@@ -5282,6 +5335,59 @@ static int _ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key,
err = KcapiEcc_MakeKey(key, keysize, curve_id);
(void)rng;
+#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ if (xil_curve_type[key->dp->id] == 0)
+ return ECC_CURVE_OID_E;
+
+ err = wc_RNG_GenerateBlock(rng, key->privKey, key->dp->size);
+ if (err)
+ return err;
+ /* Make sure that private key is max. 521 bits */
+ if (key->dp->size == 66)
+ key->privKey[65] &= 0x1U;
+
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->privKey), key->dp->size);
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(key->keyRaw),
+ 2 * key->dp->size);
+
+ err = XSecure_EllipticGenerateKey(&(key->xSec.cinst),
+ xil_curve_type[key->dp->id],
+ XIL_CAST_U64(key->privKey),
+ XIL_CAST_U64(key->keyRaw));
+ if (err != XST_SUCCESS) {
+ WOLFSSL_XIL_ERROR("Generate ECC key failed", err);
+ err = WC_HW_E;
+ }
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(key->keyRaw),
+ 2 * key->dp->size);
+
+#ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
+ if (err == 0)
+ err = XSecure_EllipticValidateKey(&(key->xSec.cinst),
+ xil_curve_type[key->dp->id],
+ XIL_CAST_U64(key->keyRaw));
+#endif
+
+ if (err == 0)
+ err = xil_mpi_import(key->pubkey.x, key->keyRaw, key->dp->size,
+ key->heap);
+ if (err == 0)
+ err = xil_mpi_import(key->pubkey.y, key->keyRaw + key->dp->size,
+ key->dp->size, key->heap);
+ if (err == 0)
+ err = xil_mpi_import(&key->k, key->privKey, key->dp->size, key->heap);
+ if (err == 0)
+ err = mp_set(key->pubkey.z, 1);
+ if (err) {
+ key->privKey = NULL;
+ XMEMSET(key->keyRaw, 0, sizeof(key->keyRaw));
+ return err;
+ }
+
+ key->type = ECC_PRIVATEKEY;
+
#else
#ifdef WOLFSSL_HAVE_SP_ECC
@@ -5649,6 +5755,15 @@ int wc_ecc_init_ex(ecc_key* key, void* heap, int devId)
mp_memzero_add("ECC k", &key->k);
#endif
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ key->privKey = key->keyRaw + (2 * ECC_MAX_CRYPTO_HW_SIZE);
+
+ if (wc_InitXsecure(&(key->xSec))) {
+ WOLFSSL_MSG("Can't initialize Xsecure");
+ return WC_HW_E;
+ }
+#endif
+
return ret;
}
@@ -5747,7 +5862,7 @@ static int wc_ecc_get_curve_order_bit_count(const ecc_set_type* dp)
#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) || \
defined(WOLFSSL_SILABS_SE_ACCEL) || defined(WOLFSSL_KCAPI_ECC) || \
- defined(WOLFSSL_SE050)
+ defined(WOLFSSL_SE050) || defined(WOLFSSL_XILINX_CRYPT_VERSAL)
static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen,
mp_int* r, mp_int* s, byte* out, word32 *outlen, WC_RNG* rng,
ecc_key* key)
@@ -5764,6 +5879,19 @@ static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen,
word32 msgLenInBytes = inlen;
CRYS_ECPKI_HASH_OpMode_t hash_mode;
#endif
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+#ifdef WOLFSSL_SMALL_STACK
+ byte* K = NULL;
+ byte* incopy = NULL;
+#else
+ byte K[MAX_ECC_BYTES] = {0};
+ byte incopy[MAX_ECC_BYTES] = {0};
+#endif
+#if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
+ defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
+ word32 Ksize;
+#endif
+#endif
word32 keysize = (word32)key->dp->size;
#ifdef PLUTON_CRYPTO_ECC
word32 orderBits = wc_ecc_get_curve_order_bit_count(key->dp);
@@ -5841,7 +5969,76 @@ static int wc_ecc_sign_hash_hw(const byte* in, word32 inlen,
return err;
}
(void)rng;
- #endif
+ #elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+
+#ifdef WOLFSSL_SMALL_STACK
+ K = (byte*)XMALLOC(keysize, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
+ incopy = (byte*)XMALLOC(inlen, key->heap, DYNAMIC_TYPE_HASH_TMP);
+ if (K == NULL || incopy == NULL) {
+ XFREE(incopy, key->heap, DYNAMIC_TYPE_HASH_TMP);
+ XFREE(K, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
+ return MEMORY_E;
+ }
+#else
+ if (inlen > sizeof(incopy))
+ return ECC_BAD_ARG_E;
+#endif
+
+#if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \
+ defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
+ err = deterministic_sign_helper(in, inlen, key);
+ if (err)
+ return err;
+ Ksize = mp_unsigned_bin_size(key->sign_k);
+ if (Ksize > keysize) {
+ err = BUFFER_E;
+ goto error_out;
+ }
+ err = mp_to_unsigned_bin(key->sign_k, K);
+ if (err)
+ goto error_out;
+ mp_reverse(K, Ksize);
+#else
+ err = wc_RNG_GenerateBlock(rng, K, keysize);
+ if (err)
+ goto error_out;
+ /* Make sure that K is max. 521 bits */
+ if (keysize == 66)
+ K[65] &= 0x1;
+#endif
+ buf_reverse(incopy, in, inlen < keysize ? inlen : keysize);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(incopy), keysize);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->privKey), keysize);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(K), keysize);
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(out), keysize * 2);
+
+ err = XSecure_EllipticGenerateSign(&(key->xSec.cinst),
+ xil_curve_type[key->dp->id],
+ XIL_CAST_U64(incopy), keysize,
+ XIL_CAST_U64(key->privKey),
+ XIL_CAST_U64(K),
+ XIL_CAST_U64(out));
+ if (err) {
+ WOLFSSL_XIL_ERROR("Generate ECC signature failed", err);
+ err = WC_HW_E;
+ }
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(out), keysize * 2);
+ mp_reverse(&out[0], keysize);
+ mp_reverse(&out[keysize], keysize);
+
+error_out:
+ ForceZero(K, MAX_ECC_BYTES);
+#ifdef WOLFSSL_SMALL_STACK
+ XFREE(incopy, key->heap, DYNAMIC_TYPE_HASH_TMP);
+ XFREE(K, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
+#endif
+ if (err) {
+ ForceZero(out, keysize * 2);
+ return err;
+ }
+ #endif /* HW-specific #if-#elif chain */
/* Load R and S */
err = mp_read_unsigned_bin(r, &out[0], keysize);
@@ -6025,7 +6222,7 @@ int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen,
#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) || \
defined(WOLFSSL_SILABS_SE_ACCEL) || defined(WOLFSSL_KCAPI_ECC) || \
- defined(WOLFSSL_SE050)
+ defined(WOLFSSL_SE050) || defined(WOLFSSL_XILINX_CRYPT_VERSAL)
err = wc_ecc_sign_hash_hw(in, inlen, r, s, out, outlen, rng, key);
#else
err = wc_ecc_sign_hash_ex(in, inlen, rng, key, r, s);
@@ -7117,6 +7314,12 @@ int wc_ecc_free(ecc_key* key)
KcapiEcc_Free(key);
#endif
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ key->privKey = NULL;
+ ForceZero(key->keyRaw, sizeof(key->keyRaw));
+ ForceZero(&key->xSec, sizeof(key->xSec));
+#endif
+
mp_clear(key->pubkey.x);
mp_clear(key->pubkey.y);
mp_clear(key->pubkey.z);
@@ -7843,6 +8046,9 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
byte sigRS[MAX_ECC_BYTES*2];
#elif defined(WOLFSSL_SE050)
byte sigRS[ECC_MAX_CRYPTO_HW_SIZE * 2];
+#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ byte sigRS[ECC_MAX_CRYPTO_HW_SIZE * 2];
+ byte hashcopy[ECC_MAX_CRYPTO_HW_SIZE] = {0};
#elif !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
int did_init = 0;
ecc_point *mG = NULL, *mQ = NULL;
@@ -7906,10 +8112,11 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_SILABS_SE_ACCEL) || \
- defined(WOLFSSL_KCAPI_ECC) || defined(WOLFSSL_SE050)
+ defined(WOLFSSL_KCAPI_ECC) || defined(WOLFSSL_SE050) || \
+ defined(WOLFSSL_XILINX_CRYPT_VERSAL)
/* Extract R and S with front zero padding (if required) */
- XMEMSET(sigRS, 0, keySz * 2);
+ XMEMSET(sigRS, 0, sizeof(sigRS));
err = mp_to_unsigned_bin(r, sigRS +
(keySz - mp_unsigned_bin_size(r)));
if (err != MP_OKAY) {
@@ -7965,6 +8172,28 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
}
#elif defined(WOLFSSL_SE050)
err = se050_ecc_verify_hash_ex(hash, hashlen, sigRS, keySz * 2, key, res);
+#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ if (hashlen > sizeof(hashcopy))
+ return ECC_BAD_ARG_E;
+ buf_reverse(hashcopy, hash, (hashlen < keySz) ? hashlen : keySz);
+ mp_reverse(sigRS, keySz);
+ mp_reverse(sigRS + keySz, keySz);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(hashcopy), keySz);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw), keySz * 2);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(sigRS), keySz * 2);
+
+ err = XSecure_EllipticVerifySign(&(key->xSec.cinst),
+ xil_curve_type[key->dp->id],
+ XIL_CAST_U64(hashcopy), keySz,
+ XIL_CAST_U64(key->keyRaw),
+ XIL_CAST_U64(sigRS));
+
+ if (err != XST_SUCCESS) {
+ WOLFSSL_XIL_ERROR("Verify ECC signature failed", err);
+ err = WC_HW_E;
+ } else {
+ *res = 1;
+ }
#endif
#else
@@ -9412,7 +9641,8 @@ static int _ecc_validate_public_key(ecc_key* key, int partial, int priv)
#ifndef WOLFSSL_SP_MATH
#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_SILABS_SE_ACCEL) || \
- defined(WOLFSSL_SE050) || defined(WOLF_CRYPTO_CB_ONLY_ECC)
+ defined(WOLFSSL_SE050) || defined(WOLF_CRYPTO_CB_ONLY_ECC) || \
+ defined(WOLFSSL_XILINX_CRYPT_VERSAL)
/* consider key check success on HW crypto
* ex: ATECC508/608A, CryptoCell and Silabs
@@ -9813,6 +10043,15 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
#elif defined(WOLFSSL_SILABS_SE_ACCEL)
if (err == MP_OKAY)
err = silabs_ecc_import(key, keysize);
+#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ #ifndef HAVE_COMP_KEY
+ if (err == MP_OKAY) {
+ #else
+ if (err == MP_OKAY && !compressed) {
+ #endif
+ buf_reverse(&key->keyRaw[0], &in[0], keysize);
+ buf_reverse(&key->keyRaw[keysize], &in[keysize], keysize);
+ }
#endif
#ifdef WOLFSSL_VALIDATE_ECC_IMPORT
if (err == MP_OKAY)
@@ -10297,7 +10536,7 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
!defined(WOLFSSL_ATECC608A)
const CRYS_ECPKI_Domain_t* pDomain;
CRYS_ECPKI_BUILD_TempData_t tempBuff;
- byte key_raw[ECC_MAX_CRYPTO_HW_SIZE*2 + 1];
+ byte keyRaw[ECC_MAX_CRYPTO_HW_SIZE*2 + 1];
#endif
#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \
@@ -10396,12 +10635,12 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
}
#elif defined(WOLFSSL_CRYPTOCELL)
if (err == MP_OKAY) {
- key_raw[0] = ECC_POINT_UNCOMP;
+ keyRaw[0] = ECC_POINT_UNCOMP;
keySz = (word32)key->dp->size;
- err = wc_export_int(key->pubkey.x, &key_raw[1], &keySz, keySz,
+ err = wc_export_int(key->pubkey.x, &keyRaw[1], &keySz, keySz,
WC_TYPE_UNSIGNED_BIN);
if (err == MP_OKAY) {
- err = wc_export_int(key->pubkey.y, &key_raw[1+keySz],
+ err = wc_export_int(key->pubkey.y, &keyRaw[1+keySz],
&keySz, keySz, WC_TYPE_UNSIGNED_BIN);
}
@@ -10410,7 +10649,7 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
/* create public key from external key buffer */
err = CRYS_ECPKI_BuildPublKeyFullCheck(pDomain,
- key_raw,
+ keyRaw,
keySz*2 + 1,
&key->ctx.pubKey,
&tempBuff);
@@ -10432,6 +10671,34 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
WC_TYPE_UNSIGNED_BIN);
}
}
+#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ if (err == MP_OKAY) {
+ const word32 keySize = key->dp->size;
+ word32 bufSize = sizeof(key->keyRaw);
+ err = wc_export_int(key->pubkey.x, key->keyRaw, &bufSize, keySize,
+ WC_TYPE_UNSIGNED_BIN);
+ if (err == MP_OKAY) {
+ const word32 offset = bufSize;
+ bufSize = sizeof(key->keyRaw) - offset;
+ err = wc_export_int(key->pubkey.y, &key->keyRaw[offset], &bufSize,
+ keySize, WC_TYPE_UNSIGNED_BIN);
+ }
+ if (err == MP_OKAY) {
+ mp_reverse(key->keyRaw, keySize);
+ mp_reverse(&key->keyRaw[keySize], keySize);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw),
+ keySize * 2);
+#ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
+ err = XSecure_EllipticValidateKey(&(key->xSec.cinst),
+ xil_curve_type[key->dp->id],
+ XIL_CAST_U64(key->keyRaw));
+ if (err) {
+ WOLFSSL_XIL_ERROR("Validation of ECC key failed", err);
+ err = WC_HW_E;
+ }
+#endif
+ }
+ }
#endif
#ifdef WOLFSSL_VALIDATE_ECC_IMPORT
@@ -10457,14 +10724,14 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
err = mp_read_unsigned_bin(&key->k, (const byte*)d,
key->dp->size);
if (err == MP_OKAY) {
- err = wc_export_int(&key->k, &key_raw[0], &keySz, keySz,
+ err = wc_export_int(&key->k, &keyRaw[0], &keySz, keySz,
WC_TYPE_UNSIGNED_BIN);
}
if (err == MP_OKAY) {
/* Create private key from external key buffer*/
err = CRYS_ECPKI_BuildPrivKey(pDomain,
- key_raw,
+ keyRaw,
keySz,
&key->ctx.privKey);
@@ -10491,10 +10758,20 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
key->dp->size);
}
}
- #endif /* WOLFSSL_ATECC508A */
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ if (err == MP_OKAY) {
+ const word32 key_size = key->dp->size;
+ word32 buf_size = key_size;
+ err = wc_export_int(&key->k, key->privKey,
+ &buf_size, key_size, WC_TYPE_UNSIGNED_BIN);
+ mp_reverse(key->privKey, key_size);
+ }
+#endif
+
+ #endif /* #else-case of custom HW-specific implementations */
if (mp_iszero(&key->k) || mp_isneg(&key->k)) {
WOLFSSL_MSG("Invalid private key");
- return BAD_FUNC_ARG;
+ err = BAD_FUNC_ARG;
}
} else {
key->type = ECC_PUBLICKEY;
@@ -10520,6 +10797,9 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
mp_clear(key->pubkey.y);
mp_clear(key->pubkey.z);
mp_clear(&key->k);
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ ForceZero(key->keyRaw, sizeof(key->keyRaw));
+#endif
}
return err;
diff --git a/wolfcrypt/src/include.am b/wolfcrypt/src/include.am
index d2bdf734d..7c16ce078 100644
--- a/wolfcrypt/src/include.am
+++ b/wolfcrypt/src/include.am
@@ -69,6 +69,8 @@ EXTRA_DIST += wolfcrypt/src/port/ti/ti-aes.c \
wolfcrypt/src/port/atmel/README.md \
wolfcrypt/src/port/xilinx/xil-sha3.c \
wolfcrypt/src/port/xilinx/xil-aesgcm.c \
+ wolfcrypt/src/port/xilinx/xil-versal-glue.c \
+ wolfcrypt/src/port/xilinx/xil-versal-trng.c \
wolfcrypt/src/port/caam/caam_aes.c \
wolfcrypt/src/port/caam/caam_driver.c \
wolfcrypt/src/port/caam/caam_error.c \
diff --git a/wolfcrypt/src/port/xilinx/xil-aesgcm.c b/wolfcrypt/src/port/xilinx/xil-aesgcm.c
index 0ee0fbffd..670438242 100644
--- a/wolfcrypt/src/port/xilinx/xil-aesgcm.c
+++ b/wolfcrypt/src/port/xilinx/xil-aesgcm.c
@@ -26,14 +26,12 @@
#include
+/* Make calls to Xilinx hardened AES-GCM crypto */
+
#if !defined(NO_AES) && defined(WOLFSSL_XILINX_CRYPT)
#include
-
-#ifdef HAVE_AESGCM
-/* Make calls to Xilinx hardened AES-GCM crypto */
-
#include
#include
@@ -44,14 +42,438 @@
#include
#endif
-#include "xparameters.h"
-
enum {
AEAD_NONCE_SZ = 12,
AES_GCM_AUTH_SZ = 16, /* AES-GCM Auth Tag length */
};
+#ifdef HAVE_AESGCM
+
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+
+#include "xsecure_aesclient.h"
+
+typedef int (*init_fn)(XSecure_ClientInstance *InstancePtr,
+ XSecure_AesKeySource KeySrc,
+ u32 Size,
+ u64 IvAddr);
+
+enum aad_state {
+ SW_AAD,
+ HW_ENGINE_AAD
+};
+
+#define XIL_AESGCM_ALIGN 4u
+#define NEEDS_ALIGNMENT(ptr, align) (((wc_ptr_t)ptr % align) != 0u)
+
+static WC_INLINE int aligned_xmalloc(byte** buf, byte** aligned, void* heap, word32 size, word32 align)
+{
+#ifndef NO_WOLFSSL_ALLOC_ALIGN
+ byte* tmp = (byte*)XMALLOC(size + align, heap, DYNAMIC_TYPE_TMP_BUFFER);
+ if (tmp == NULL)
+ return MEMORY_E;
+
+ *buf = tmp;
+ *aligned = tmp + (align - ((wc_ptr_t)tmp % align));
+
+ return 0;
+#else
+ WOLFSSL_MSG("AES-ECB encrypt with bad alignment");
+ WOLFSSL_ERROR_VERBOSE(BAD_ALIGN_E);
+ return BAD_ALIGN_E;
+#endif
+}
+
+static WC_INLINE void aligned_xfree(void* buf, void* heap)
+{
+ if (buf == NULL)
+ return;
+ XFREE(buf, heap, DYNAMIC_TYPE_TMP_BUFFER);
+}
+
+static WC_INLINE int check_keysize(word32 len)
+{
+ if (len != AES_128_KEY_SIZE && len != AES_256_KEY_SIZE) {
+ WOLFSSL_MSG("Expecting a 128 or 256 bit key");
+ return BAD_FUNC_ARG;
+ }
+ return 0;
+}
+
+int wc_AesGcmSetKey_ex(Aes* aes, const byte* key, word32 len, word32 kup)
+{
+ int ret;
+
+ if (aes == NULL || key == NULL) {
+ return BAD_FUNC_ARG;
+ }
+
+ if (check_keysize(len)) {
+ return BAD_FUNC_ARG;
+ }
+
+ ret = wc_InitXsecure(&(aes->xSec));
+ if (ret != 0) {
+ WOLFSSL_MSG("Unable to initialize xSecure for AES-GCM");
+ return ret;
+ }
+ ret = XSecure_AesInitialize(&(aes->xSec.cinst));
+ if (ret != XST_SUCCESS) {
+ WOLFSSL_XIL_ERROR("Failed to initialize AES client instance", ret);
+ return WC_HW_E;
+ }
+#ifdef WC_XIL_AESGCM_DPA_CM
+ ret = XSecure_AesSetDpaCm(&(aes->xSec.cinst), 1);
+ if (ret != XST_SUCCESS) {
+ WOLFSSL_XIL_ERROR("Failed to enable AES DPA countermeasures", ret);
+ return WC_HW_E;
+ }
+#endif
+ aes->keylen = len;
+ aes->kup = kup;
+ aes->xKeySize =
+ len == AES_128_KEY_SIZE ? XSECURE_AES_KEY_SIZE_128 :
+ XSECURE_AES_KEY_SIZE_256;
+ XMEMCPY(aes->keyInit, key, len);
+
+ return 0;
+}
+
+static WC_INLINE int setup(Aes* aes,
+ init_fn init,
+ const byte* iv,
+ const byte* authIn, word32 authInSz)
+{
+ ALIGN64 byte iv_[AEAD_NONCE_SZ];
+ byte *piv = (byte*)iv;
+ byte *aad = (byte*)authIn;
+ byte *aad_buf = NULL;
+ int err;
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)aes->keyInit,
+ sizeof(aes->keyInit));
+
+ if (XSecure_AesWriteKey(&(aes->xSec.cinst), aes->kup, aes->xKeySize,
+ XIL_CAST_U64(aes->keyInit))) {
+ WOLFSSL_XIL_MSG("Failed to write key");
+ return 1;
+ }
+
+ if (NEEDS_ALIGNMENT(iv, XIL_AESGCM_ALIGN)) {
+ XMEMCPY(iv_, iv, AEAD_NONCE_SZ);
+ piv = iv_;
+ }
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)piv, AEAD_NONCE_SZ);
+
+ if (init(&(aes->xSec.cinst), aes->kup, aes->xKeySize, XIL_CAST_U64(piv))) {
+ WOLFSSL_XIL_MSG("Failed to init");
+ return 1;
+ }
+
+ /* Stop here in case there's no AAD ...
+ */
+ if (authIn == NULL || authInSz == 0) {
+ aes->aadStyle = HW_ENGINE_AAD;
+ return 0;
+ }
+ /* ... or the AAD length is no multiple of 16,
+ * as the HW-engine can't handle this.
+ */
+ if ((authInSz % WOLFSSL_XSECURE_QWORD_SIZE) != 0) {
+ aes->aadStyle = SW_AAD;
+ return 0;
+ }
+
+ if (NEEDS_ALIGNMENT(authIn, XIL_AESGCM_ALIGN)) {
+ err = aligned_xmalloc(&aad_buf, (byte**)&aad, aes->heap, authInSz,
+ XIL_AESGCM_ALIGN);
+ if (err) {
+ WOLFSSL_MSG("Failed to alloc memory for AESGCM AAD alignment");
+ return 1;
+ }
+ XMEMCPY((void* )aad, authIn, authInSz);
+ }
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)aad, authInSz);
+
+ if (XSecure_AesUpdateAad(&(aes->xSec.cinst), XIL_CAST_U64(authIn),
+ authInSz)) {
+ WOLFSSL_XIL_MSG("Failed to set AAD");
+ err = 1;
+ } else {
+ aes->aadStyle = HW_ENGINE_AAD;
+ err = 0;
+ }
+
+ aligned_xfree(aad_buf, aes->heap);
+
+ return err;
+}
+
+static WC_INLINE int handle_aad( Aes* aes,
+ const byte* data, word32 sz,
+ const byte* iv,
+ byte* authTag,
+ const byte* authIn, word32 authInSz) {
+ int ret;
+ byte scratch[AES_BLOCK_SIZE];
+ byte initalCounter[AES_BLOCK_SIZE] = { 0 };
+ XMEMCPY(initalCounter, iv, AEAD_NONCE_SZ);
+ initalCounter[AES_BLOCK_SIZE - 1] = 1;
+ GHASH(aes, authIn, authInSz, data, sz, authTag, AES_GCM_AUTH_SZ);
+ ret = wc_AesEncryptDirect(aes, scratch, initalCounter);
+ if (ret == 0)
+ xorbuf(authTag, scratch, AES_GCM_AUTH_SZ);
+ return ret;
+}
+
+int wc_AesGcmEncrypt( Aes* aes, byte* out,
+ const byte* in, word32 sz,
+ const byte* iv, word32 ivSz,
+ byte* authTag, word32 authTagSz,
+ const byte* authIn, word32 authInSz)
+{
+ int ret = 0;
+ ALIGN64 u8 tag[AES_GCM_AUTH_SZ];
+ byte *in_aligned;
+ byte *in_buf = NULL;
+ byte *out_aligned;
+ byte *out_buf = NULL;
+
+ if (aes == NULL || (in == NULL && sz > 0u) || iv == NULL || authTag == NULL
+ || authTagSz != AES_GCM_AUTH_SZ) {
+ return BAD_FUNC_ARG;
+ }
+
+ if (ivSz != AEAD_NONCE_SZ) {
+ WOLFSSL_MSG("Expecting an IV size of 12");
+ return BAD_FUNC_ARG;
+ }
+
+ if (in == NULL || out == NULL || sz == 0u) {
+ return handle_aad(aes, NULL, 0u, iv, authTag, authIn, authInSz);
+ }
+
+ if (check_keysize(aes->keylen)) {
+ return BAD_FUNC_ARG;
+ }
+
+ if (setup(aes, XSecure_AesEncryptInit, iv, authIn, authInSz)) {
+ return WC_HW_E;
+ }
+
+ in_aligned = (byte*) in;
+ if (NEEDS_ALIGNMENT(in, XIL_AESGCM_ALIGN)) {
+ ret = aligned_xmalloc(&in_buf, &in_aligned, aes->heap, sz,
+ XIL_AESGCM_ALIGN);
+ if (ret) {
+ WOLFSSL_MSG(
+ "Failed to alloc memory for AESGCM Encrypt alignment (in)");
+ return 1;
+ }
+ XMEMCPY(in_aligned, in, sz);
+ }
+
+ if (NEEDS_ALIGNMENT(out, XIL_AESGCM_ALIGN)) {
+ if (in != in_aligned) {
+ /* In case `in` has been copied already, re-use that buffer
+ * and also write to it instead of allocating another one.
+ */
+ out_aligned = in_aligned;
+ } else {
+ ret = aligned_xmalloc(&out_buf, &out_aligned, aes->heap, sz,
+ XIL_AESGCM_ALIGN);
+ if (ret) {
+ aligned_xfree(in_buf, aes->heap);
+ WOLFSSL_MSG(
+ "Failed to alloc memory for AESGCM Encrypt alignment (out)");
+ return 1;
+ }
+ XMEMCPY(out_aligned, out, sz);
+ }
+ } else {
+ out_aligned = out;
+ }
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)in_aligned, sz);
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out_aligned, sz);
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)tag, sizeof(tag));
+
+ if (XSecure_AesEncryptUpdate(&(aes->xSec.cinst), XIL_CAST_U64(in_aligned),
+ XIL_CAST_U64(out_aligned), sz, TRUE)) {
+ WOLFSSL_XIL_MSG("Encrypt failed");
+ ret = WC_HW_E;
+ goto error_out;
+ }
+
+ ret = XSecure_AesEncryptFinal(&(aes->xSec.cinst), XIL_CAST_U64(tag));
+ if (ret != XST_SUCCESS) {
+ WOLFSSL_XIL_ERROR("EncryptFinal failed", ret);
+ ret = WC_HW_E;
+ ForceZero(authTag, authTagSz);
+ } else {
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out_aligned, sz);
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)tag, sizeof(tag));
+
+ if (aes->aadStyle == SW_AAD) {
+ ret = handle_aad(aes, out_aligned, sz, iv, authTag, authIn,
+ authInSz);
+ } else {
+ XMEMCPY(authTag, tag, authTagSz);
+ }
+
+ if (out != out_aligned) {
+ XMEMCPY(out, out_aligned, sz);
+ }
+ }
+
+error_out:
+ aligned_xfree(out_buf, aes->heap);
+ aligned_xfree(in_buf, aes->heap);
+ ForceZero(tag, sizeof(tag));
+ XSecure_AesKeyZero(&(aes->xSec.cinst), aes->kup);
+
+ return ret;
+}
+
+int wc_AesGcmDecrypt( Aes* aes, byte* out,
+ const byte* in, word32 sz,
+ const byte* iv, word32 ivSz,
+ const byte* authTag, word32 authTagSz,
+ const byte* authIn, word32 authInSz)
+{
+ int ret = 0;
+ ALIGN64 u8 buf[AES_GCM_AUTH_SZ];
+ ALIGN64 u8 real_tag[AES_GCM_AUTH_SZ];
+ const u8 *tag;
+ byte *in_aligned;
+ byte *in_buf = NULL;
+ byte *out_aligned;
+ byte *out_buf = NULL;
+
+ if (aes == NULL || (in == NULL && sz > 0u) || iv == NULL || authTag == NULL
+ || authTagSz != AES_GCM_AUTH_SZ) {
+ return BAD_FUNC_ARG;
+ }
+
+ if (ivSz != AEAD_NONCE_SZ) {
+ WOLFSSL_MSG("Expecting an IV size of 12");
+ return BAD_FUNC_ARG;
+ }
+
+ if (in == NULL || out == NULL || sz == 0u) {
+ ret = handle_aad(aes, NULL, 0u, iv, buf, authIn, authInSz);
+ if (ret == 0 && ConstantCompare(authTag, buf, authTagSz) != 0) {
+ ret = AES_GCM_AUTH_E;
+ }
+ return ret;
+ }
+
+ if (check_keysize(aes->keylen)) {
+ return BAD_FUNC_ARG;
+ }
+
+ if (setup(aes, XSecure_AesDecryptInit, iv, authIn, authInSz)) {
+ return WC_HW_E;
+ }
+
+ in_aligned = (byte*) in;
+ if (NEEDS_ALIGNMENT(in, XIL_AESGCM_ALIGN)) {
+ ret = aligned_xmalloc(&in_buf, &in_aligned, aes->heap, sz,
+ XIL_AESGCM_ALIGN);
+ if (ret) {
+ WOLFSSL_MSG(
+ "Failed to alloc memory for AESGCM Decrypt alignment (in)");
+ return 1;
+ }
+ XMEMCPY(in_aligned, in, sz);
+ }
+
+ if (NEEDS_ALIGNMENT(out, XIL_AESGCM_ALIGN)) {
+ if (in != in_aligned) {
+ /* In case `in` has been copied already, re-use that buffer
+ * and also write to it instead of allocating another one.
+ */
+ out_aligned = in_aligned;
+ } else {
+ ret = aligned_xmalloc(&out_buf, &out_aligned, aes->heap, sz,
+ XIL_AESGCM_ALIGN);
+ if (ret) {
+ aligned_xfree(in_buf, aes->heap);
+ WOLFSSL_MSG(
+ "Failed to alloc memory for AESGCM Decrypt alignment (out)");
+ return 1;
+ }
+ XMEMCPY(out_aligned, out, sz);
+ }
+ } else {
+ out_aligned = out;
+ }
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)in_aligned, sz);
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out_aligned, sz);
+
+ if (aes->aadStyle == HW_ENGINE_AAD) {
+ /* Use the originally provided tag */
+ if (NEEDS_ALIGNMENT(authTag, XIL_AESGCM_ALIGN)) {
+ XMEMCPY(real_tag, authTag, AES_GCM_AUTH_SZ);
+ tag = real_tag;
+ } else {
+ tag = authTag;
+ }
+ } else {
+ /* Create a fake tag that will match, so the HW-engine is OK when comparing the tags */
+ ret = handle_aad(aes, in_aligned, sz, iv, buf, NULL, 0);
+ if (ret)
+ goto error_out;
+ tag = buf;
+ /* and create the real tag to compare against later */
+ ret = handle_aad(aes, in_aligned, sz, iv, real_tag, authIn, authInSz);
+ if (ret)
+ goto error_out;
+ }
+
+ if (XSecure_AesDecryptUpdate(&(aes->xSec.cinst), XIL_CAST_U64(in_aligned),
+ XIL_CAST_U64(out_aligned), sz, TRUE)) {
+ WOLFSSL_XIL_MSG("Decrypt failed");
+ ret = WC_HW_E;
+ goto error_out;
+ }
+
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)tag, AES_GCM_AUTH_SZ);
+
+ if (XSecure_AesDecryptFinal(&(aes->xSec.cinst), XIL_CAST_U64(tag))) {
+ WOLFSSL_XIL_MSG("DecryptFinal failed");
+ ret = WC_HW_E;
+ } else {
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out_aligned, sz);
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)buf, sizeof(buf));
+
+ if (aes->aadStyle == SW_AAD) {
+ if (ConstantCompare(authTag, real_tag, authTagSz) != 0) {
+ ret = AES_GCM_AUTH_E;
+ }
+ }
+
+ if (out != out_aligned) {
+ XMEMCPY(out, out_aligned, sz);
+ }
+ }
+
+error_out:
+ aligned_xfree(out_buf, aes->heap);
+ aligned_xfree(in_buf, aes->heap);
+ ForceZero(real_tag, sizeof(real_tag));
+ ForceZero(buf, sizeof(buf));
+ XSecure_AesKeyZero(&(aes->xSec.cinst), aes->kup);
+
+ return ret;
+}
+
+#else
+
+
int wc_AesGcmSetKey_ex(Aes* aes, const byte* key, word32 len, word32 kup)
{
XCsuDma_Config* con;
@@ -60,7 +482,7 @@ int wc_AesGcmSetKey_ex(Aes* aes, const byte* key, word32 len, word32 kup)
return BAD_FUNC_ARG;
}
- if (len != 32) {
+ if (len != AES_256_KEY_SIZE) {
WOLFSSL_MSG("Expecting a 256 bit key");
return BAD_FUNC_ARG;
}
@@ -79,7 +501,7 @@ int wc_AesGcmSetKey_ex(Aes* aes, const byte* key, word32 len, word32 kup)
aes->keylen = len;
aes->kup = kup;
- XMEMCPY((byte*)(aes->key_init), key, len);
+ XMEMCPY((byte*)(aes->keyInit), key, len);
return 0;
}
@@ -111,7 +533,7 @@ int wc_AesGcmEncrypt(Aes* aes, byte* out,
* buffer is created to keep AES encrypt from writing over the end of
* out buffer. */
if (in != NULL) {
- if (aes->keylen != 32) {
+ if (aes->keylen != AES_256_KEY_SIZE) {
WOLFSSL_MSG("Expecting 256 bit AES key");
return BAD_FUNC_ARG;
}
@@ -123,7 +545,7 @@ int wc_AesGcmEncrypt(Aes* aes, byte* out,
}
XSecure_AesInitialize(&(aes->xilAes), &(aes->dma), aes->kup, (word32*)iv,
- aes->key_init);
+ aes->keyInit);
XSecure_AesEncryptData(&(aes->xilAes), tmp, in, sz);
XMEMCPY(out, tmp, sz);
XMEMCPY(authTag, tmp + sz, authTagSz);
@@ -187,7 +609,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out,
/* calls to hardened crypto */
XSecure_AesInitialize(&(aes->xilAes), &(aes->dma), aes->kup,
- (word32*)iv, aes->key_init);
+ (word32*)iv, aes->keyInit);
XSecure_AesDecryptData(&(aes->xilAes), out, in, sz, tag);
/* account for additional data */
@@ -205,6 +627,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out,
return 0;
}
+#endif /* versal */
#endif /* HAVE_AESGCM */
#endif
diff --git a/wolfcrypt/src/port/xilinx/xil-sha3.c b/wolfcrypt/src/port/xilinx/xil-sha3.c
index d43441893..e7ad5924f 100644
--- a/wolfcrypt/src/port/xilinx/xil-sha3.c
+++ b/wolfcrypt/src/port/xilinx/xil-sha3.c
@@ -33,6 +33,83 @@
#include
#include
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+
+#include
+
+/* Initialize hardware for SHA3 operations
+ *
+ * sha SHA3 structure to initialize
+ * heap memory heap hint to use
+ * devId used for async operations (currently not supported here)
+ */
+int wc_InitSha3_384(wc_Sha3* sha, void* heap, int devId)
+{
+ (void) heap;
+ (void) devId;
+
+ if (sha == NULL) {
+ return BAD_FUNC_ARG;
+ }
+
+ if (wc_InitXsecure(&(sha->xSec))) {
+ WOLFSSL_MSG("Can't initialize Xsecure");
+ return BAD_STATE_E;
+ }
+
+ XSecure_Sha3Initialize();
+
+ return 0;
+}
+
+
+/* Update SHA3 state
+ *
+ * sha SHA3 structure to update
+ * data message to update SHA3 state with
+ * len length of data buffer
+ */
+int wc_Sha3_384_Update(wc_Sha3* sha, const byte* data, word32 len)
+{
+ if (sha == NULL || (data == NULL && len > 0)) {
+ return BAD_FUNC_ARG;
+ }
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)data, len);
+ XSecure_Sha3Update(&(sha->xSec.cinst), XIL_CAST_U64(data), len);
+
+ return 0;
+}
+
+
+/* Finalize SHA3 state and get digest
+ *
+ * sha SHA3 structure to get hash
+ * out digest out, expected to be large enough to hold SHA3 digest
+ */
+int wc_Sha3_384_Final(wc_Sha3* sha, byte* out)
+{
+ if (sha == NULL || out == NULL) {
+ return BAD_FUNC_ARG;
+ }
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out, WC_SHA3_384_DIGEST_SIZE);
+ XSecure_Sha3Finish(&(sha->xSec.cinst), XIL_CAST_U64(out));
+
+ return wc_InitSha3_384(sha, NULL, INVALID_DEVID);
+}
+
+
+/* Free SHA3 structure
+ *
+ * sha SHA3 structure to free
+ */
+void wc_Sha3_384_Free(wc_Sha3* sha)
+{
+ (void)sha;
+ /* nothing to free yet */
+}
+
+#else /* non-versal */
+
#if !defined(WOLFSSL_NOSHA3_224) || !defined(WOLFSSL_NOSHA3_256) \
|| !defined(WOLFSSL_NOSHA3_512)
#error sizes of SHA3 other than 384 are not supported
@@ -163,5 +240,6 @@ int wc_Sha3_384_Copy(wc_Sha3* src, wc_Sha3* dst)
return -1;
#endif
}
+#endif
#endif
diff --git a/wolfcrypt/src/port/xilinx/xil-versal-glue.c b/wolfcrypt/src/port/xilinx/xil-versal-glue.c
new file mode 100644
index 000000000..8657b4096
--- /dev/null
+++ b/wolfcrypt/src/port/xilinx/xil-versal-glue.c
@@ -0,0 +1,211 @@
+/* xil-versal-glue.c
+ *
+ * Copyright (C) 2006-2022 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifdef HAVE_CONFIG_H
+ #include
+#endif
+
+#include
+
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+
+#include
+#include
+#include
+
+#include
+
+/**
+ Initialize versal peripherals
+
+ xsec Xsecure structure to initialize
+
+ Returns 0 on success
+ */
+int wc_InitXsecure(wc_Xsecure* xsec)
+{
+#ifdef XSECURE_CACHE_DISABLE
+ static int cache_disabled = 0;
+ if (cache_disabled == 0) {
+ Xil_DCacheDisable();
+ cache_disabled = 1;
+ }
+#endif
+
+ if (xsec == NULL) {
+ return BAD_FUNC_ARG;
+ }
+
+ if (XMailbox_Initialize(&(xsec->mb), 0U) != XST_SUCCESS) {
+ WOLFSSL_MSG("Can't initialize mailbox");
+ return WC_HW_E;
+ }
+
+ if (XSecure_ClientInit(&(xsec->cinst), &(xsec->mb)) != XST_SUCCESS) {
+ WOLFSSL_MSG("Can't initialize secure client");
+ return WC_HW_E;
+ }
+
+ /* Set shared memory */
+ if (XMailbox_SetSharedMem(&(xsec->mb), XIL_CAST_U64(xsec->mem),
+ sizeof(xsec->mem)) != XST_SUCCESS) {
+ WOLFSSL_MSG("Can't set shared mem");
+ return WC_HW_E;
+ }
+
+ return 0;
+}
+
+/**
+ Convert Xilinx specific error to string
+
+ err The error to convert
+
+ Returns a pointer to a string (always, never returns NULL).
+ */
+const char *wc_XsecureErrorToString(int err)
+{
+ if (err == 0) {
+ return "Success";
+ }
+ if (err == 1) {
+ return "Generic \"Failure\".";
+ }
+ switch (err & 0xff) {
+ case 0x02:
+ return "Error when SHA3 init fails.";
+ case 0x03:
+ return "Error when SHA3 last update fails.";
+ case 0x04:
+ return "Error when DMA driver fails to update the data to SHA3.";
+ case 0x05:
+ return "Error when timeout.";
+ case 0x06:
+ return "Error when SHA3 hash not matched with expected hash.";
+ case 0x07:
+ return "Error when SHA3 finish fails.";
+ case 0x08:
+ return "SHA3 Invalid Argument.";
+ case 0x09:
+ return "SSS Invalid Argument.";
+ case 0x0A:
+ return "SHA3 State mismatch.";
+ case 0x40:
+ return "user provided GCM tag does not match calculated tag.";
+ case 0x41:
+ return "AES key clear error.";
+ case 0x42:
+ return "AES DPA CM is not supported on device.";
+ case 0x43:
+ return "Error when AES key write fails.";
+ case 0x44:
+ return "Error when AES decrypt init fails.";
+ case 0x45:
+ return "Error when GCM tag not matched with user provided tag.";
+ case 0x46:
+ return "Error when AES data not matched with expected data.";
+ case 0x47:
+ return "AES KAT fails.";
+ case 0x48:
+ return "Error when AESDPACM key write fails.";
+ case 0x49:
+ return "Error when AESDPACM key load fails.";
+ case 0x4A:
+ return "Error when AESDPACM sss config fails.";
+ case 0x4B:
+ return "AESDPACM KAT fails.";
+ case 0x4C:
+ return "Error 1 when AESDPACM data not matched with expected data.";
+ case 0x4D:
+ return "Error 2 when AESDPACM data not matched with expected data.";
+ case 0x4E:
+ return "Error 3 when AESDPACM data not matched with expected data.";
+ case 0x4F:
+ return "Error 4 when AESDPACM data not matched with expected data.";
+ case 0x50:
+ return "Error 5 when AESDPACM data not matched with expected data.";
+ case 0x51:
+ return "AES Invalid Argument.";
+ case 0x52:
+ return "AES KAT Invalid Argument.";
+ case 0x53:
+ return "AES State mismatch.";
+ case 0x54:
+ return "AES - Access to device keys is not allowed for IPI for any operations.";
+ case 0x80:
+ return "RSA KAT fails.";
+ case 0x81:
+ return "Error when RSA data not matched with expected data.";
+ case 0x82:
+ return "RSA Invalid Argument.";
+ case 0x83:
+ return "RSA KAT Invalid Argument.";
+ case 0x84:
+ return "RSA State mismatch.";
+ case 0xC0:
+ return "ECC key is not valid.";
+ case 0xC1:
+ return "Elliptic KAT fails.";
+ case 0xC2:
+ return "Elliptic Curve not supported.";
+ case 0xC3:
+ return "Public key is zero.";
+ case 0xC4:
+ return "Wrong order of Public key.";
+ case 0xC5:
+ return "Key not found on curve.";
+ case 0xC6:
+ return "Signature provided for verification is bad.";
+ case 0xC7:
+ return "Incorrect hash length for sign generation.";
+ case 0xC8:
+ return "Incorrect hash length for sign verification.";
+ case 0xC9:
+ return "Bad random number used for sign generation.";
+ case 0xCA:
+ return "Error in generating Public key.";
+ case 0xCB:
+ return "Invalid argument.";
+ case 0xCC:
+ return "R set to zero.";
+ case 0xCD:
+ return "S set to zero.";
+ case 0xCE:
+ return "R is not within ECC order.";
+ case 0xCF:
+ return "S is not within ECC order.";
+ case 0xD0:
+ return "Curve not supported for KAT.";
+ case 0xF0:
+ return "No tamper response when tamper interrupt is detected.";
+ case 0xF1:
+ return "Access to Xilsecure IPIs is disabled if IPI request is non secure.";
+ case 0xF2:
+ return "SHA3 busy with earlier operation, Kat can't be executed.";
+ case 0xF3:
+ return "AES busy with earlier operation, Kat can't be executed.";
+ default:
+ return "Unknown error code.";
+ }
+}
+
+#endif
diff --git a/wolfcrypt/src/port/xilinx/xil-versal-trng.c b/wolfcrypt/src/port/xilinx/xil-versal-trng.c
new file mode 100644
index 000000000..693a489d2
--- /dev/null
+++ b/wolfcrypt/src/port/xilinx/xil-versal-trng.c
@@ -0,0 +1,227 @@
+/* xil-versal-trng.c
+ *
+ * Copyright (C) 2006-2022 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+ #include
+#endif
+
+#include
+
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+
+#include
+#include
+#include
+
+#include
+
+#if !defined(HAVE_HASHDRBG)
+/** How often shall the DRBG part be re-seeded */
+#ifndef WC_RESEED_INTERVAL
+#define WC_RESEED_INTERVAL (1000000)
+#endif
+
+/** How big shall the seed be */
+#ifndef WC_XILINX_TRNG_DF_LEN_MUL
+#ifdef DRBG_SEED_LEN
+#define WC_XILINX_TRNG_DF_LEN_MUL (DRBG_SEED_LEN / BYTES_PER_BLOCK)
+#else
+/* Use the next best value to the default `DRBG_SEED_LEN` (= 440bits)
+ * WC_XILINX_TRNG_DF_LEN_MUL * BYTES_PER_BLOCK * BITS_PER_BYTE
+ * 4U * 16 * 8 = 512
+ */
+#define WC_XILINX_TRNG_DF_LEN_MUL 4U
+#endif
+#endif
+#endif /* !defined(HAVE_HASHDRBG) */
+
+static XTrngpsv trng;
+
+static sword32 versal_trng_selftest(void)
+{
+ sword32 ret = XTrngpsv_RunKAT(&trng);
+ if (ret == XTRNGPSV_SUCCESS)
+ ret = XTrngpsv_RunHealthTest(&trng);
+ return ret;
+}
+
+#if !defined(HAVE_HASHDRBG)
+static WC_INLINE void array_add_one(byte* data, word32 dataSz)
+{
+ int i;
+
+ for (i = dataSz - 1; i >= 0; i--) {
+ data[i]++;
+ if (data[i] != 0)
+ break;
+ }
+}
+
+static WC_INLINE void usercfg_add_nonce(XTrngpsv_UsrCfg* user_cfg,
+ byte* nonce,
+ word32 nonceSz)
+{
+ word32 nonce_written = 0;
+ byte *pers_string = (byte*)user_cfg->PersString;
+ byte *nonce_rd = nonce;
+ do {
+ word32 to_write =
+ nonce_written + nonceSz <= sizeof(user_cfg->PersString) ?
+ nonceSz : sizeof(user_cfg->PersString) - nonce_written;
+ XMEMCPY(pers_string, nonce_rd, to_write);
+ if (nonce != nonce_rd)
+ array_add_one(pers_string, to_write);
+ nonce_rd = pers_string;
+ pers_string += to_write;
+ nonce_written += to_write;
+ } while (nonce_written < sizeof(user_cfg->PersString));
+ user_cfg->PersStrPresent = XTRNGPSV_TRUE;
+}
+#endif
+
+/**
+ Initialize the Versal TRNG.
+
+ nonce Pointer to user-supplied nonce.
+ nonceSz Size of the user-supplied nonce.
+
+ Returns 0 on success
+ */
+int wc_VersalTrngInit(byte* nonce, word32 nonceSz)
+{
+#if !defined(HAVE_HASHDRBG)
+ /* Use the HRNG mode (with DF) which lets us extract FIPS compliant
+ * random data from the TRNG.
+ */
+ XTrngpsv_UsrCfg user_cfg = {
+ .Mode = XTRNGPSV_HRNG,
+ .SeedLife = WC_RESEED_INTERVAL,
+ .PredResistanceEn = XTRNGPSV_FALSE,
+ .DFDisable = XTRNGPSV_FALSE,
+ .DFLenMul = WC_XILINX_TRNG_DF_LEN_MUL,
+ .InitSeedPresent = XTRNGPSV_FALSE,
+ .PersStrPresent = XTRNGPSV_FALSE
+ };
+#else
+ /* Use the PTRNG mode (without DF) which lets us extract raw entropy
+ * to be used as a seed to the internal DRBG.
+ */
+ const XTrngpsv_UsrCfg user_cfg = {
+ .Mode = XTRNGPSV_PTRNG,
+ .SeedLife = 0U,
+ .PredResistanceEn = XTRNGPSV_FALSE,
+ .DFDisable = XTRNGPSV_TRUE,
+ .DFLenMul = 0U,
+ .InitSeedPresent = XTRNGPSV_FALSE,
+ .PersStrPresent = XTRNGPSV_FALSE
+ };
+#endif
+ int ret = WC_HW_E;
+ XTrngpsv_Config *cfg;
+ sword32 xret = 0;
+ if (trng.State == XTRNGPSV_HEALTHY) {
+ return 0;
+ }
+ cfg = XTrngpsv_LookupConfig(WOLFSSL_PSV_TRNG_DEV_ID);
+ if (!cfg) {
+ WOLFSSL_MSG("Could not lookup TRNG config");
+ goto out;
+ }
+ xret = XTrngpsv_CfgInitialize(&trng, cfg, cfg->BaseAddress);
+ if (xret)
+ goto out;
+ xret = versal_trng_selftest();
+ if (xret)
+ goto out;
+#if !defined(HAVE_HASHDRBG)
+ if (nonce)
+ usercfg_add_nonce(&user_cfg, nonce, nonceSz);
+#endif
+ xret = XTrngpsv_Instantiate(&trng, &user_cfg);
+ if (xret)
+ goto out;
+
+ ret = 0;
+
+out:
+ if (xret) {
+ WOLFSSL_MSG_EX("Xilinx API returned 0x%08x", xret);
+ }
+ return ret;
+}
+
+/**
+ Reset the Versal TRNG.
+
+ Returns 0 on success
+ */
+int wc_VersalTrngReset(void)
+{
+ sword32 xret = XTrngpsv_Uninstantiate(&trng);
+ if (xret) {
+ WOLFSSL_MSG_EX("XTrngpsv_Uninstantiate() returned 0x%08x", xret);
+ return WC_HW_E;
+ }
+ return 0;
+}
+
+/**
+ Run the Versal TRNG self-test.
+
+ Returns 0 on success
+ */
+int wc_VersalTrngSelftest(void)
+{
+ return versal_trng_selftest() == XTRNGPSV_SUCCESS ? 0 : -1;
+}
+
+/**
+ Read from the Versal TRNG.
+
+ output Destination
+ sz Length of output
+
+ Returns 0 on success
+ */
+int wc_VersalTrngGenerate(byte* output, word32 sz)
+{
+ /* The TRNG always generates exactly 32bytes of output */
+ byte buf[XTRNGPSV_SEC_STRENGTH_BYTES];
+ word32 bytes_generated = 0;
+ do {
+ word32 bytes_left = sz - bytes_generated;
+ word32 bytes_required =
+ bytes_left > XTRNGPSV_SEC_STRENGTH_BYTES ?
+ XTRNGPSV_SEC_STRENGTH_BYTES : bytes_left;
+ sword32 xret = XTrngpsv_Generate(&trng, buf,
+ XTRNGPSV_SEC_STRENGTH_BYTES,
+ XTRNGPSV_FALSE);
+ if (xret) {
+ WOLFSSL_MSG_EX("XTrngpsv_Generate() returned 0x%08x", xret);
+ return WC_HW_E;
+ }
+ XMEMCPY(&output[bytes_generated], buf, bytes_required);
+ bytes_generated += bytes_required;
+ } while (bytes_generated < sz);
+ return 0;
+}
+
+#endif
diff --git a/wolfcrypt/src/random.c b/wolfcrypt/src/random.c
index 24bc8a847..26e830c52 100644
--- a/wolfcrypt/src/random.c
+++ b/wolfcrypt/src/random.c
@@ -146,6 +146,8 @@ int wc_RNG_GenerateByte(WC_RNG* rng, byte* b)
#include
#include
#include
+#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+#include "wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h"
#elif defined(NO_DEV_RANDOM)
#elif defined(CUSTOM_RAND_GENERATE)
#elif defined(CUSTOM_RAND_GENERATE_BLOCK)
@@ -822,6 +824,12 @@ static int _InitRng(WC_RNG* rng, byte* nonce, word32 nonceSz,
return 0;
#endif
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL
+ ret = wc_VersalTrngInit(nonce, nonceSz);
+ if (ret)
+ return ret;
+#endif
+
#ifdef CUSTOM_RAND_GENERATE_BLOCK
ret = 0; /* success */
#else
@@ -1113,6 +1121,12 @@ int wc_FreeRng(WC_RNG* rng)
rng->status = DRBG_NOT_INIT;
#endif /* HAVE_HASHDRBG */
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL\
+ /* don't overwrite previously set error */
+ if (wc_VersalTrngReset() && !ret)
+ ret = WC_HW_E;
+#endif
+
return ret;
}
diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c
index ae2cf2879..568d8e8cc 100644
--- a/wolfcrypt/src/rsa.c
+++ b/wolfcrypt/src/rsa.c
@@ -52,7 +52,9 @@ RSA keys can be used to encrypt, decrypt, sign and verify data.
#ifdef WOLFSSL_AFALG_XILINX_RSA
#include
#endif
-
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+#include
+#endif
#ifdef WOLFSSL_HAVE_SP_RSA
#include
#endif
@@ -410,13 +412,23 @@ int wc_InitRsaHw(RsaKey* key)
word32 e = 0; /* RSA public exponent */
int mSz;
int eSz;
+ int ret;
if (key == NULL) {
return BAD_FUNC_ARG;
}
mSz = mp_unsigned_bin_size(&(key->n));
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ if (mSz > WOLFSSL_XSECURE_RSA_KEY_SIZE) {
+ return BAD_FUNC_ARG;
+ }
+ /* Allocate 4 bytes more for the public exponent. */
+ m = (unsigned char*) XMALLOC(WOLFSSL_XSECURE_RSA_KEY_SIZE + 4, key->heap,
+ DYNAMIC_TYPE_KEY);
+#else
m = (unsigned char*)XMALLOC(mSz, key->heap, DYNAMIC_TYPE_KEY);
+#endif
if (m == NULL) {
return MEMORY_E;
}
@@ -426,6 +438,9 @@ int wc_InitRsaHw(RsaKey* key)
XFREE(m, key->heap, DYNAMIC_TYPE_KEY);
return MP_READ_E;
}
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ XMEMSET(m + mSz, 0, WOLFSSL_XSECURE_RSA_KEY_SIZE + 4 - mSz);
+#endif
eSz = mp_unsigned_bin_size(&(key->e));
if (eSz > MAX_E_SIZE) {
@@ -449,6 +464,16 @@ int wc_InitRsaHw(RsaKey* key)
key->pubExp = e;
key->mod = m;
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ ret = wc_InitXsecure(&(key->xSec));
+ if (ret != 0) {
+ WOLFSSL_MSG("Unable to initialize xSecure for RSA");
+ XFREE(m, key->heap, DYNAMIC_TYPE_KEY);
+ return ret;
+ }
+ XMEMCPY(&m[WOLFSSL_XSECURE_RSA_KEY_SIZE], &e, sizeof(e));
+ key->mSz = mSz;
+#else
if (XSecure_RsaInitialize(&(key->xRsa), key->mod, NULL,
(byte*)&(key->pubExp)) != XST_SUCCESS) {
WOLFSSL_MSG("Unable to initialize RSA on hardware");
@@ -465,6 +490,7 @@ int wc_InitRsaHw(RsaKey* key)
return BAD_STATE_E;
}
}
+#endif
#endif
return 0;
} /* WOLFSSL_XILINX_CRYPT*/
@@ -2117,23 +2143,45 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
{
byte *d;
int dSz;
+#if !defined(WOLFSSL_XILINX_CRYPT_VERSAL)
XSecure_Rsa rsa;
+#endif
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ dSz = WOLFSSL_XSECURE_RSA_KEY_SIZE * 2;
+#else
dSz = mp_unsigned_bin_size(&key->d);
+#endif
d = (byte*)XMALLOC(dSz, key->heap, DYNAMIC_TYPE_PRIVATE_KEY);
if (d == NULL) {
ret = MEMORY_E;
- }
- else {
+ } else {
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ XMEMSET(d, 0, dSz);
+ XMEMCPY(d, key->mod, key->mSz);
+ ret = mp_to_unsigned_bin(&key->d, &d[WOLFSSL_XSECURE_RSA_KEY_SIZE]);
+#else
ret = mp_to_unsigned_bin(&key->d, d);
XSecure_RsaInitialize(&rsa, key->mod, NULL, d);
+#endif
}
if (ret == 0) {
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)d, dSz);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)in, inLen);
+ if (XSecure_RsaPrivateDecrypt(&(key->xSec.cinst), XIL_CAST_U64(d),
+ XIL_CAST_U64(in), inLen,
+ XIL_CAST_U64(out)) != XST_SUCCESS) {
+ ret = BAD_STATE_E;
+ }
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out, inLen);
+#else
if (XSecure_RsaPrivateDecrypt(&rsa, (u8*)in, inLen, out) !=
XST_SUCCESS) {
ret = BAD_STATE_E;
}
+#endif
}
if (d != NULL) {
@@ -2144,7 +2192,19 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
break;
case RSA_PUBLIC_ENCRYPT:
case RSA_PUBLIC_DECRYPT:
-#ifdef WOLFSSL_XILINX_CRYPTO_OLD
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)key->mod,
+ WOLFSSL_XSECURE_RSA_KEY_SIZE + 4);
+ WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)in, inLen);
+ if (XSecure_RsaPublicEncrypt(&(key->xSec.cinst),
+ XIL_CAST_U64(key->mod),
+ XIL_CAST_U64(in), inLen,
+ XIL_CAST_U64(out))) {
+ WOLFSSL_MSG("RSA public operation failed");
+ ret = BAD_STATE_E;
+ }
+ WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out, inLen);
+#elif defined(WOLFSSL_XILINX_CRYPTO_OLD)
if (XSecure_RsaDecrypt(&(key->xRsa), in, out) != XST_SUCCESS) {
ret = BAD_STATE_E;
}
diff --git a/wolfcrypt/src/signature.c b/wolfcrypt/src/signature.c
index c880abf07..16f404c2c 100644
--- a/wolfcrypt/src/signature.c
+++ b/wolfcrypt/src/signature.c
@@ -201,7 +201,7 @@ int wc_SignatureVerifyHash(
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
byte *plain_data;
#else
- byte plain_data[MAX_ENCODED_SIG_SZ];
+ ALIGN64 byte plain_data[MAX_ENCODED_SIG_SZ];
#endif
/* Make sure the plain text output is at least key size */
diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c
index 83c9e9abf..b06937849 100644
--- a/wolfcrypt/test/test.c
+++ b/wolfcrypt/test/test.c
@@ -361,7 +361,7 @@
/* these cases do not have intermediate hashing support */
#if (defined(WOLFSSL_AFALG_XILINX_SHA3) && !defined(WOLFSSL_AFALG_HASH_KEEP)) \
- && !defined(WOLFSSL_XILINX_CRYPT)
+ && !defined(WOLFSSL_XILINX_CRYPT) || defined(WOLFSSL_XILINX_CRYPT_VERSAL)
#define NO_INTM_HASH_TEST
#endif
@@ -3293,6 +3293,7 @@ static int sha3_384_test(void)
{
wc_Sha3 sha;
byte hash[WC_SHA3_384_DIGEST_SIZE];
+ byte buf[64];
#ifndef NO_INTM_HASH_TEST
byte hashcopy[WC_SHA3_384_DIGEST_SIZE];
#endif
@@ -3310,7 +3311,7 @@ static int sha3_384_test(void)
a.inLen = XSTRLEN(a.input);
a.outLen = WC_SHA3_384_DIGEST_SIZE;
-#if defined(WOLFSSL_AFALG_XILINX_SHA3) || defined(WOLFSSL_XILINX_CRYPT)
+#if defined(WOLFSSL_AFALG_XILINX_SHA3) || defined(WOLFSSL_XILINX_CRYPT) && !defined(WOLFSSL_XILINX_CRYPT_VERSAL)
/* NIST test vector with a length that is a multiple of 4 */
b.input = "\x7d\x80\xb1\x60\xc4\xb5\x36\xa3\xbe\xb7\x99\x80\x59\x93\x44"
"\x04\x7c\x5f\x82\xa1\xdf\xc3\xee\xd4";
@@ -3337,8 +3338,8 @@ static int sha3_384_test(void)
c.inLen = XSTRLEN(c.input);
c.outLen = WC_SHA3_384_DIGEST_SIZE;
-#ifdef WOLFSSL_XILINX_CRYPT
- test_sha[0] = b; /* hardware acc. can not handle "" string */
+#if defined(WOLFSSL_XILINX_CRYPT) && !defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ test_sha[0] = b; /* hardware acc. pre-Versal can not handle "" string */
#else
test_sha[0] = a;
#endif
@@ -3350,7 +3351,8 @@ static int sha3_384_test(void)
return -2800;
for (i = 0; i < times; ++i) {
- ret = wc_Sha3_384_Update(&sha, (byte*)test_sha[i].input,
+ XMEMCPY(buf, test_sha[i].input, test_sha[i].inLen);
+ ret = wc_Sha3_384_Update(&sha, buf,
(word32)test_sha[i].inLen);
if (ret != 0)
ERROR_OUT(-2801 - (i * 10), exit);
@@ -10790,7 +10792,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
#endif
#endif
- byte resultT[sizeof(t1)];
+ byte resultT[sizeof(t1) + AES_BLOCK_SIZE];
byte resultP[sizeof(p) + AES_BLOCK_SIZE];
byte resultC[sizeof(p) + AES_BLOCK_SIZE];
int result = 0;
@@ -10801,6 +10803,11 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
int plen;
#endif
#endif
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ byte buf[sizeof(p) + AES_BLOCK_SIZE];
+ byte bufA[sizeof(a) + 1];
+ byte *large_aad = (byte*)XMALLOC((size_t)1024 + 16, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
+#endif
#if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM)
#if !defined(BENCH_AESGCM_LARGE)
@@ -10853,7 +10860,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
/* AES-GCM encrypt and decrypt both use AES encrypt internally */
result = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), iv1, sizeof(iv1),
- resultT, sizeof(resultT), a, sizeof(a));
+ resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10861,7 +10868,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
ERROR_OUT(-6303, out);
if (XMEMCMP(c1, resultC, sizeof(c1)))
ERROR_OUT(-6304, out);
- if (XMEMCMP(t1, resultT, sizeof(resultT)))
+ if (XMEMCMP(t1, resultT, sizeof(t1)))
ERROR_OUT(-6305, out);
#ifdef HAVE_AES_DECRYPT
@@ -10870,7 +10877,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
ERROR_OUT(-6306, out);
result = wc_AesGcmDecrypt(dec, resultP, resultC, sizeof(c1),
- iv1, sizeof(iv1), resultT, sizeof(resultT), a, sizeof(a));
+ iv1, sizeof(iv1), resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &dec->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10889,7 +10896,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
/* AES-GCM encrypt and decrypt both use AES encrypt internally */
result = wc_AesGcmEncrypt(enc, large_output, large_input,
BENCH_AESGCM_LARGE, iv1, sizeof(iv1),
- resultT, sizeof(resultT), a, sizeof(a));
+ resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10899,7 +10906,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
#ifdef HAVE_AES_DECRYPT
result = wc_AesGcmDecrypt(dec, large_outdec, large_output,
BENCH_AESGCM_LARGE, iv1, sizeof(iv1), resultT,
- sizeof(resultT), a, sizeof(a));
+ sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &dec->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10914,7 +10921,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
for (ivlen=1; ivlen<(int)sizeof(k1); ivlen++) {
/* AES-GCM encrypt and decrypt both use AES encrypt internally */
result = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), k1,
- (word32)ivlen, resultT, sizeof(resultT), a, sizeof(a));
+ (word32)ivlen, resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10922,7 +10929,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
ERROR_OUT(-6312, out);
#ifdef HAVE_AES_DECRYPT
result = wc_AesGcmDecrypt(dec, resultP, resultC, sizeof(c1), k1,
- (word32)ivlen, resultT, sizeof(resultT), a, sizeof(a));
+ (word32)ivlen, resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &dec->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10937,7 +10944,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
for (alen=0; alen<(int)sizeof(p); alen++) {
/* AES-GCM encrypt and decrypt both use AES encrypt internally */
result = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), iv1,
- sizeof(iv1), resultT, sizeof(resultT), p, (word32)alen);
+ sizeof(iv1), resultT, sizeof(t1), p, (word32)alen);
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10945,7 +10952,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
ERROR_OUT(-6314, out);
#ifdef HAVE_AES_DECRYPT
result = wc_AesGcmDecrypt(dec, resultP, resultC, sizeof(c1), iv1,
- sizeof(iv1), resultT, sizeof(resultT), p, (word32)alen);
+ sizeof(iv1), resultT, sizeof(t1), p, (word32)alen);
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &dec->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10953,6 +10960,56 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
ERROR_OUT(-6315, out);
#endif /* HAVE_AES_DECRYPT */
}
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ if (! large_aad)
+ ERROR_OUT(MEMORY_E, out);
+ XMEMSET(large_aad, 0, 1024+16);
+ /* Variable authenticated data length test */
+ for (alen=0; alen<=1024; alen+=16) {
+ /* AES-GCM encrypt and decrypt both use AES encrypt internally */
+ result = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), iv1,
+ sizeof(iv1), resultT, sizeof(t1), large_aad, (word32)alen);
+ if (result != 0)
+ ERROR_OUT(-6316, out);
+#ifdef HAVE_AES_DECRYPT
+ result = wc_AesGcmDecrypt(dec, resultP, resultC, sizeof(c1), iv1,
+ sizeof(iv1), resultT, sizeof(t1), large_aad, (word32)alen);
+ if (result != 0)
+ ERROR_OUT(-6317, out);
+#endif /* HAVE_AES_DECRYPT */
+ }
+
+ /* Test unaligned memory of all potential arguments */
+ result = wc_AesGcmSetKey(enc, k1, sizeof(k1));
+ if (result != 0)
+ ERROR_OUT(-6318, out);
+
+ /* AES-GCM encrypt and decrypt both use AES encrypt internally */
+ XMEMCPY(&buf[1], p, sizeof(p));
+ XMEMCPY(&bufA[1], a, sizeof(a));
+ result = wc_AesGcmEncrypt(enc, &resultC[1], &buf[1], sizeof(p), iv1, sizeof(iv1),
+ &resultT[1], sizeof(t1), &bufA[1], sizeof(a));
+ if (result != 0)
+ ERROR_OUT(-6319, out);
+ if (XMEMCMP(c1, &resultC[1], sizeof(c1)))
+ ERROR_OUT(-6320, out);
+ if (XMEMCMP(t1, &resultT[1], sizeof(t1)))
+ ERROR_OUT(-6321, out);
+
+#ifdef HAVE_AES_DECRYPT
+ result = wc_AesGcmSetKey(dec, k1, sizeof(k1));
+ if (result != 0)
+ ERROR_OUT(-6322, out);
+
+ result = wc_AesGcmDecrypt(dec, &resultP[1], &resultC[1], sizeof(c1),
+ iv1, sizeof(iv1), &resultT[1], sizeof(t1), &bufA[1], sizeof(a));
+ if (result != 0)
+ ERROR_OUT(-6323, out);
+ if (XMEMCMP(p, &resultP[1], sizeof(p)))
+ ERROR_OUT(-6324, out);
+#endif /* HAVE_AES_DECRYPT */
+
+#endif /* Xilinx Versal */
#endif
#if !defined(WOLFSSL_AFALG_XILINX_AES) && !defined(WOLFSSL_XILINX_CRYPT)
@@ -10962,7 +11019,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
/* AES-GCM encrypt and decrypt both use AES encrypt internally */
result = wc_AesGcmEncrypt(enc, large_output, large_input,
plen, iv1, sizeof(iv1), resultT,
- sizeof(resultT), a, sizeof(a));
+ sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10972,7 +11029,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
#ifdef HAVE_AES_DECRYPT
result = wc_AesGcmDecrypt(dec, large_outdec, large_output,
plen, iv1, sizeof(iv1), resultT,
- sizeof(resultT), a, sizeof(a));
+ sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &dec->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10985,7 +11042,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
for (plen=1; plen<(int)sizeof(p); plen++) {
/* AES-GCM encrypt and decrypt both use AES encrypt internally */
result = wc_AesGcmEncrypt(enc, resultC, p, (word32)plen, iv1,
- sizeof(iv1), resultT, sizeof(resultT), a, sizeof(a));
+ sizeof(iv1), resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -10993,7 +11050,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
ERROR_OUT(-6318, out);
#ifdef HAVE_AES_DECRYPT
result = wc_AesGcmDecrypt(dec, resultP, resultC, (word32)plen, iv1,
- sizeof(iv1), resultT, sizeof(resultT), a, sizeof(a));
+ sizeof(iv1), resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &dec->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -11015,7 +11072,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
wc_AesGcmSetKey(enc, k2, sizeof(k2));
/* AES-GCM encrypt and decrypt both use AES encrypt internally */
result = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), iv2, sizeof(iv2),
- resultT, sizeof(resultT), a, sizeof(a));
+ resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -11023,12 +11080,12 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
ERROR_OUT(-6320, out);
if (XMEMCMP(c2, resultC, sizeof(c2)))
ERROR_OUT(-6321, out);
- if (XMEMCMP(t2, resultT, sizeof(resultT)))
+ if (XMEMCMP(t2, resultT, sizeof(t1)))
ERROR_OUT(-6322, out);
#ifdef HAVE_AES_DECRYPT
result = wc_AesGcmDecrypt(enc, resultP, resultC, sizeof(c1),
- iv2, sizeof(iv2), resultT, sizeof(resultT), a, sizeof(a));
+ iv2, sizeof(iv2), resultT, sizeof(t1), a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -11082,7 +11139,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
wc_AesGcmSetKey(enc, k1, sizeof(k1));
/* AES-GCM encrypt and decrypt both use AES encrypt internally */
result = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), iv1, sizeof(iv1),
- resultT + 1, sizeof(resultT) - 1, a, sizeof(a));
+ resultT + 1, sizeof(t1) - 1, a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -11090,12 +11147,12 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
ERROR_OUT(-6330, out);
if (XMEMCMP(c1, resultC, sizeof(c1)))
ERROR_OUT(-6331, out);
- if (XMEMCMP(t1, resultT + 1, sizeof(resultT) - 1))
+ if (XMEMCMP(t1, resultT + 1, sizeof(t1) - 1))
ERROR_OUT(-6332, out);
#ifdef HAVE_AES_DECRYPT
result = wc_AesGcmDecrypt(enc, resultP, resultC, sizeof(p),
- iv1, sizeof(iv1), resultT + 1, sizeof(resultT) - 1, a, sizeof(a));
+ iv1, sizeof(iv1), resultT + 1, sizeof(t1) - 1, a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
#endif
@@ -11132,7 +11189,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
result = wc_AesGcmEncrypt_ex(enc,
resultC, p, sizeof(p),
randIV, sizeof(randIV),
- resultT, sizeof(resultT),
+ resultT, sizeof(t1),
a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &enc->asyncDev, WC_ASYNC_FLAG_NONE);
@@ -11159,7 +11216,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
result = wc_AesGcmDecrypt(dec,
resultP, resultC, sizeof(c1),
randIV, sizeof(randIV),
- resultT, sizeof(resultT),
+ resultT, sizeof(t1),
a, sizeof(a));
#if defined(WOLFSSL_ASYNC_CRYPT)
result = wc_AsyncWait(result, &dec->asyncDev, WC_ASYNC_FLAG_NONE);
@@ -11184,7 +11241,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
result = wc_AesGcmEncryptUpdate(enc, resultC, p, sizeof(p), a, sizeof(a));
if (result != 0)
ERROR_OUT(-6361, out);
- result = wc_AesGcmEncryptFinal(enc, resultT, sizeof(resultT));
+ result = wc_AesGcmEncryptFinal(enc, resultT, sizeof(t1));
if (result != 0)
ERROR_OUT(-6362, out);
if (XMEMCMP(resultC, c1, sizeof(c1)) != 0)
@@ -11229,7 +11286,7 @@ WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void)
if (result != 0)
ERROR_OUT(-6382, out);
}
- result = wc_AesGcmEncryptFinal(enc, resultT, sizeof(resultT));
+ result = wc_AesGcmEncryptFinal(enc, resultT, sizeof(t1));
if (result != 0)
ERROR_OUT(-6383, out);
if (XMEMCMP(resultC, c1, sizeof(c1)) != 0)
@@ -14951,7 +15008,8 @@ static int rsa_even_mod_test(WC_RNG* rng, RsaKey* key)
/* after loading in key use tmp as the test buffer */
#if !(defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION == 2) && \
- (defined(WOLFSSL_SP_ARM64_ASM) || defined(WOLFSSL_SP_ARM32_ASM)))
+ (defined(WOLFSSL_SP_ARM64_ASM) || defined(WOLFSSL_SP_ARM32_ASM))) && \
+ !defined(WOLFSSL_XILINX_CRYPT)
/* The ARM64_ASM code that was FIPS validated did not return these expected
* failure codes. These tests cases were added after the assembly was
* in-lined in the module and validated, these tests will be available in
@@ -22277,7 +22335,12 @@ WOLFSSL_TEST_SUBROUTINE int x963kdf_test(void)
#else
#define ECC_SHARED_SIZE MAX_ECC_BYTES
#endif
+#if defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)
+#define HAVE_ECC_DETERMINISTIC_K
+#define ECC_DIGEST_SIZE WC_SHA256_DIGEST_SIZE
+#else
#define ECC_DIGEST_SIZE MAX_ECC_BYTES
+#endif
#define ECC_SIG_SIZE ECC_MAX_SIG_SIZE
#ifndef NO_ECC_VECTOR_TEST
@@ -22658,7 +22721,8 @@ static int ecc_test_vector(int keySize)
}
#endif /* WOLF_CRYPTO_CB_ONLY_ECC */
-#if defined(HAVE_ECC_SIGN) && defined(WOLFSSL_ECDSA_DETERMINISTIC_K)
+#if defined(HAVE_ECC_SIGN) && defined(HAVE_ECC_DETERMINISTIC_K)
+#if defined(HAVE_ECC256)
static int ecc_test_deterministic_k(WC_RNG* rng)
{
int ret;
@@ -22744,6 +22808,7 @@ done:
wc_ecc_free(&key);
return ret;
}
+#endif
#ifdef WOLFSSL_PUBLIC_MP
#if defined(HAVE_ECC384)
@@ -23249,7 +23314,7 @@ static int ecc_test_make_pub(WC_RNG* rng)
#if defined(HAVE_ECC_SIGN) && (!defined(ECC_TIMING_RESISTANT) || \
(defined(ECC_TIMING_RESISTANT) && !defined(WC_NO_RNG))) && \
- !defined(WOLF_CRYPTO_CB_ONLY_ECC)
+ !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(HAVE_ECC_DETERMINISTIC_K)
tmpSz = ECC_BUFSIZE;
ret = 0;
do {
@@ -23941,8 +24006,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount,
ret = wc_AsyncWait(ret, &userA->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
#endif
if (ret == 0)
- ret = wc_ecc_sign_hash(digest, ECC_DIGEST_SIZE, sig, &x, rng,
- userA);
+ ret = wc_ecc_sign_hash(digest, ECC_DIGEST_SIZE, sig, &x, rng, userA);
} while (ret == WC_PENDING_E);
if (ret != 0)
ERROR_OUT(-9939, done);
@@ -23956,8 +24020,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount,
ret = wc_AsyncWait(ret, &userA->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
#endif
if (ret == 0)
- ret = wc_ecc_verify_hash(sig, x, digest, ECC_DIGEST_SIZE,
- &verify, userA);
+ ret = wc_ecc_verify_hash(sig, x, digest, ECC_DIGEST_SIZE, &verify, userA);
} while (ret == WC_PENDING_E);
if (ret != 0)
ERROR_OUT(-9940, done);
@@ -25889,7 +25952,8 @@ WOLFSSL_TEST_SUBROUTINE int ecc_test(void)
}
#endif
-#if defined(HAVE_ECC_SIGN) && defined(WOLFSSL_ECDSA_DETERMINISTIC_K)
+#if defined(HAVE_ECC_SIGN) && defined(HAVE_ECC256) \
+ && defined(HAVE_ECC_DETERMINISTIC_K)
ret = ecc_test_deterministic_k(&rng);
if (ret != 0) {
printf("ecc_test_deterministic_k failed! %d\n", ret);
diff --git a/wolfssl/wolfcrypt/aes.h b/wolfssl/wolfcrypt/aes.h
index 9f1bd80e1..6727fcfb0 100644
--- a/wolfssl/wolfcrypt/aes.h
+++ b/wolfssl/wolfcrypt/aes.h
@@ -67,8 +67,14 @@ block cipher mechanism that uses n-bit binary string parameter key with 128-bits
#endif
#ifdef WOLFSSL_XILINX_CRYPT
-#include "xsecure_aes.h"
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL
+#include
+#include
+#define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_AES_USER_KEY_0
+#else /* versal */
+#include
#define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_CSU_AES_KEY_SRC_KUP
+#endif /* !versal */
#endif /* WOLFSSL_XILINX_CRYPT */
#if defined(WOLFSSL_XILINX_CRYPT) || defined(WOLFSSL_AFALG_XILINX_AES)
@@ -236,9 +242,16 @@ struct Aes {
word32 left; /* unused bytes left from last call */
#endif
#ifdef WOLFSSL_XILINX_CRYPT
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL
+ wc_Xsecure xSec;
+ XSecure_AesKeySize xKeySize;
+ int aadStyle;
+ byte keyInit[WOLFSSL_XSECURE_AES_KEY_SIZE] ALIGN64;
+#else
XSecure_Aes xilAes;
XCsuDma dma;
- word32 key_init[8];
+ word32 keyInit[8];
+#endif
word32 kup;
#endif
#if defined(WOLFSSL_AFALG) || defined(WOLFSSL_AFALG_XILINX_AES)
diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h
index 5f1d2ee0b..4b93405c5 100644
--- a/wolfssl/wolfcrypt/ecc.h
+++ b/wolfssl/wolfcrypt/ecc.h
@@ -70,6 +70,10 @@
#include
#endif
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ #include
+#endif
+
#ifdef WOLFSSL_HAVE_SP_ECC
#include
#endif
@@ -175,6 +179,8 @@ enum {
#elif defined(WOLFSSL_SE050)
ECC_MAX_CRYPTO_HW_SIZE = 32,
ECC_MAX_CRYPTO_HW_PUBKEY_SIZE = 64,
+#elif defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ ECC_MAX_CRYPTO_HW_SIZE = MAX_ECC_BYTES,
#endif
@@ -469,7 +475,11 @@ struct ecc_key {
struct kcapi_handle* handle;
byte pubkey_raw[MAX_ECC_BYTES * 2];
#endif
-
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ wc_Xsecure xSec;
+ byte keyRaw[3 * ECC_MAX_CRYPTO_HW_SIZE] ALIGN32;
+ byte* privKey;
+#endif
#ifdef WOLFSSL_ASYNC_CRYPT
mp_int* r; /* sign/verify temps */
mp_int* s;
diff --git a/wolfssl/wolfcrypt/include.am b/wolfssl/wolfcrypt/include.am
index 543670b8a..f61d29e06 100644
--- a/wolfssl/wolfcrypt/include.am
+++ b/wolfssl/wolfcrypt/include.am
@@ -85,6 +85,8 @@ noinst_HEADERS+= \
wolfssl/wolfcrypt/port/nxp/dcp_port.h \
wolfssl/wolfcrypt/port/nxp/se050_port.h \
wolfssl/wolfcrypt/port/xilinx/xil-sha3.h \
+ wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h \
+ wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h \
wolfssl/wolfcrypt/port/caam/caam_driver.h \
wolfssl/wolfcrypt/port/caam/caam_error.h \
wolfssl/wolfcrypt/port/caam/caam_qnx.h \
diff --git a/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h b/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
index af2c55aa5..da989454d 100644
--- a/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
+++ b/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h
@@ -23,8 +23,12 @@
#ifndef WOLF_XIL_CRYPT_SHA3_H
#define WOLF_XIL_CRYPT_SHA3_H
-#ifdef WOLFSSL_SHA3
-#include "xsecure_sha.h"
+#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_XILINX_CRYPT)
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL
+#include
+#else
+#include
+#endif
#ifdef __cplusplus
extern "C" {
@@ -32,14 +36,18 @@
/* Sha3 digest */
typedef struct Sha3 {
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL
+ wc_Xsecure xSec;
+#else
XSecure_Sha3 hw;
XCsuDma dma;
+#endif
} wc_Sha3;
#ifdef __cplusplus
} /* extern "C" */
#endif
-#endif /* WOLFSSL_SHA3 */
+#endif /* WOLFSSL_SHA3 && WOLFSSL_XILINX_CRYPT */
#endif /* WOLF_XIL_CRYPT_SHA3_H */
diff --git a/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h b/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h
new file mode 100644
index 000000000..49399e792
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h
@@ -0,0 +1,101 @@
+/* xil-versal-glue.h
+ *
+ * Copyright (C) 2006-2022 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLF_XIL_CRYPT_VERSAL_GLUE_H
+#define WOLF_XIL_CRYPT_VERSAL_GLUE_H
+
+#include
+
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define XIL_CAST_U64(v) ((u64)(UINTPTR)(v))
+
+#ifdef XSECURE_CACHE_DISABLE
+#define WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(p, l) do{}while(0)
+#define WOLFSSL_XIL_DCACHE_FLUSH_RANGE(p, l) do{}while(0)
+#else
+#define WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(p, l) \
+ do{ Xil_DCacheInvalidateRange((p), (l)); }while(0)
+#define WOLFSSL_XIL_DCACHE_FLUSH_RANGE(p, l) \
+ do{ Xil_DCacheFlushRange((p), (l)); }while(0)
+#endif
+
+#if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_DEBUG_ERRORS_ONLY) \
+ && !defined(WOLFSSL_XIL_MSG_NO_SLEEP)
+#include
+#define WOLFSSL_XIL_SLEEP(n) do{ sleep(n); }while(0)
+#else
+#define WOLFSSL_XIL_SLEEP(n) do{}while(0)
+#endif
+
+/* Provide our own message macro since the Versal PLM maybe
+ * prints an error message to the same console.
+ * In order to not mix those outputs up, sleep a little while
+ * before printing our message.
+ * This behavior can be disabled by defining `WOLFSSL_XIL_MSG_NO_SLEEP`
+ */
+#define WOLFSSL_XIL_MSG(msg) do { \
+ WOLFSSL_XIL_SLEEP(1); \
+ WOLFSSL_MSG(msg); \
+} while(0)
+#define WOLFSSL_XIL_ERROR(msg, err) do { \
+ WOLFSSL_XIL_MSG(msg); \
+ WOLFSSL_MSG_EX("Xilinx API returned 0x%08x: %s", (err), \
+ wc_XsecureErrorToString(err)); \
+} while(0)
+
+
+
+#define WOLFSSL_XSECURE_QWORD_SIZE 16u
+#define WOLFSSL_XSECURE_AES_KEY_SIZE 32u
+#define WOLFSSL_XSECURE_AES_IV_SIZE 12u
+#define WOLFSSL_XSECURE_RSA_KEY_SIZE 512u
+
+enum {
+ WOLFSSL_XSECURE_ECC_NIST_P384 = 4,
+ WOLFSSL_XSECURE_ECC_NIST_P521 = 5,
+ WOLFSSL_XSECURE_ECC_NUM
+};
+
+typedef struct Xsecure {
+ ALIGN64 u8 mem[XSECURE_SHARED_MEM_SIZE];
+ XMailbox mb;
+ XSecure_ClientInstance cinst;
+} wc_Xsecure;
+
+WOLFSSL_LOCAL int wc_InitXsecure(wc_Xsecure* xsec);
+WOLFSSL_LOCAL const char *wc_XsecureErrorToString(int err);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* WOLFSSL_XILINX_CRYPT_VERSAL */
+#endif /* WOLF_XIL_CRYPT_VERSAL_GLUE_H */
+
diff --git a/wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h b/wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h
new file mode 100644
index 000000000..b99679b79
--- /dev/null
+++ b/wolfssl/wolfcrypt/port/xilinx/xil-versal-trng.h
@@ -0,0 +1,44 @@
+/* xil-versal-trng.h
+ *
+ * Copyright (C) 2006-2022 wolfSSL Inc.
+ *
+ * This file is part of wolfSSL.
+ *
+ * wolfSSL is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * wolfSSL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
+ */
+
+
+#ifndef WOLF_XIL_CRYPT_VERSAL_TRNG_H
+#define WOLF_XIL_CRYPT_VERSAL_TRNG_H
+
+#include
+
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+WOLFSSL_LOCAL int wc_VersalTrngInit(byte* nonce, word32 nonceSz);
+WOLFSSL_LOCAL int wc_VersalTrngReset(void);
+WOLFSSL_LOCAL int wc_VersalTrngSelftest(void);
+WOLFSSL_LOCAL int wc_VersalTrngGenerate(byte *output, word32 sz);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* versal */
+#endif /* WOLF_XIL_CRYPT_VERSAL_TRNG_H */
+
diff --git a/wolfssl/wolfcrypt/rsa.h b/wolfssl/wolfcrypt/rsa.h
index 17f182096..4e1daa36e 100644
--- a/wolfssl/wolfcrypt/rsa.h
+++ b/wolfssl/wolfcrypt/rsa.h
@@ -83,7 +83,11 @@ RSA keys can be used to encrypt, decrypt, sign and verify data.
#include
#ifdef WOLFSSL_XILINX_CRYPT
-#include "xsecure_rsa.h"
+#ifdef WOLFSSL_XILINX_CRYPT_VERSAL
+#include
+#else
+#include
+#endif
#endif
#if defined(WOLFSSL_CRYPTOCELL)
@@ -214,8 +218,13 @@ struct RsaKey {
#ifdef WOLFSSL_XILINX_CRYPT
word32 pubExp; /* to keep values in scope they are here in struct */
byte* mod;
+#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ int mSz;
+ wc_Xsecure xSec;
+#else
XSecure_Rsa xRsa;
#endif
+#endif
#if defined(WOLFSSL_KCAPI_RSA)
struct kcapi_handle* handle;
#endif
diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h
index d1efa4605..1f2537187 100644
--- a/wolfssl/wolfcrypt/settings.h
+++ b/wolfssl/wolfcrypt/settings.h
@@ -1641,8 +1641,10 @@ extern void uITRON4_free(void *p) ;
#if defined(WOLFSSL_XILINX)
+ #if !defined(WOLFSSL_XILINX_CRYPT_VERSAL)
+ #define NO_DEV_RANDOM
+ #endif
#define NO_WOLFSSL_DIR
- #define NO_DEV_RANDOM
#define HAVE_AESGCM
#endif
diff --git a/wolfssl/wolfcrypt/types.h b/wolfssl/wolfcrypt/types.h
index 089e27076..026e8487e 100644
--- a/wolfssl/wolfcrypt/types.h
+++ b/wolfssl/wolfcrypt/types.h
@@ -1131,7 +1131,8 @@ typedef struct w64wrapper {
/* AESNI requires alignment and ARMASM gains some performance from it
* Xilinx RSA operations require alignment */
#if defined(WOLFSSL_AESNI) || defined(WOLFSSL_ARMASM) || \
- defined(USE_INTEL_SPEEDUP) || defined(WOLFSSL_AFALG_XILINX)
+ defined(USE_INTEL_SPEEDUP) || defined(WOLFSSL_AFALG_XILINX) || \
+ defined(WOLFSSL_XILINX)
#ifndef WOLFSSL_USE_ALIGN
#define WOLFSSL_USE_ALIGN
#endif