wolfssl 5.5.0 release

wolfSSL version 5.5.0 is available now! Say hello to QUIC support. With this release of wolfSSL we have added in QUIC support and can be used with QUIC implementations such as ngtcp2 (https://github.com/ngtcp2/ngtcp2); which means wolfSSL can now be used for the TLS portion of HTTP/3 connections in cURL. Along with QUIC support this release saw additions for: RSA-PSS certificate support, Dilithium post quantum algorithm use with TLS, and some additional porting to even more embedded devices to name a few things. In addition to the new features added, there were enhancements to some of the existing ones, such as the expansion of ABI support, along with some fixes like with DTLS 1.3 asynchronous builds.

A full list of changes can be found in the ChangeLog.md or on the wolfssl website.
For questions about the release contact facts@wolfssl.com

wolfSSL Release 5.5.0 Vulnerabilities

wolfSSL release 5.5.0 contained 4 vulnerability fixes. Most are considered low severity and affect a very small subset of users. 3 of the listed issues were found by external researchers (thanks to their efforts! you can see them mentioned on each of the reports) The last one listed with a potential DTLS DoS attack was found thanks to our internal testing.

CVE ID Severity Description
CVE-2022-38153 Low In wolfSSL version 5.3.0 if compiled with –enable-session-ticket and the client has non-empty session cache, with TLS 1.2 there is the possibility of a man in the middle passing a large session ticket to the client and causing a crash due to an invalid free. There is also the potential for a malicious TLS 1.3 server to crash a client in a similar manner except in TLS 1.3 it is not susceptible to a man in the middle attack. Users on the client side with –enable-session-ticket compiled in and using wolfSSL version 5.3.0 should update their version of wolfSSL. 

Thanks to Max at Trail of Bits for the report and “LORIA, INRIA, France” for research on tlspuffin.

CVE-2022-38152 Low If using wolfSSL_clear to reset a WOLFSSL object (vs the normal wolfSSL_free/wolfSSL_new) it can result in runtime issues. This exists with builds using the wolfSSL compatibility layer (–enable-opnesslextra) and only when the application is making use of wolfSSL_clear instead of SSL_free/SSL_new. In the case of a TLS 1.3 resumption, after continuing to use the WOLFSSH object after having called wolfSSL_clear, an application could crash. It is suggested that users calling wolfSSL_clear update the version of wolfSSL used. 

Thanks to Max at Trail of Bits for the report and “LORIA, INRIA, France” for research on tlspuffin.

N/A Low Fault injection attack on RAM via Rowhammer leads to ECDSA key disclosure. Users doing operations with private ECC keys such as server side TLS connections and creating ECC signatures, who also have hardware that could be targeted with a sophisticated Rowhammer attack should update the version of wolfSSL and compile using the macro WOLFSSL_CHECK_SIG_FAULTS. 

Thanks to Yarkin Doroz, Berk Sunar, Koksal Must, Caner Tol, and Kristi Rahman all affiliated with the Vernam Applied Cryptography and Cybersecurity Lab at Worcester Polytechnic Institute for the report.

N/A Medium Potential DoS attack on DTLS 1.2. In the case of receiving a malicious plaintext handshake message at epoch 0 the connection will enter an error state reporting a duplicate message. This affects both server and client side. Users that have DTLS enabled and in use should update their version of wolfSSL to mitigate the potential for a DoS attack.


If not free’ing FP_ECC caches per thread by calling wc_ecc_fp_free there is a possible memory leak during TLS 1.3 handshakes which use ECC. Users are urged to confirm they are free’ing FP_ECC caches per thread if enabled to avoid this issue. 


For additional vulnerability information visit the vulnerability page at https://www.wolfssl.com/docs/security-vulnerabilities/

A full list of what was changed can be found in the wolfSSL ChangeLog (https://www.wolfssl.com/docs/wolfssl-changelog/).

If you have a vulnerability to report or would like more information, contact us at facts@wolfssl.com, the wolfSSL development team takes vulnerabilities seriously.

Crypto in go-wolfssl

wolfSSL’s GoLang wrapper, go-wolfssl, now includes a first round of wolfCrypt APIs. The wolfCrypt cryptography engine is a lightweight crypto library written in ANSI C and known for its small size, speed, and feature set, as well as its royalty-free pricing and excellent cross-platform support. Now with go-wolfssl, GO users can take advantage of this crypto engine and the many algorithms/ciphers it supports. The recently added features include ECC sign/verify, SHA hashing, and AES encryption.

Although it’s still in its early stages, factors like optimization, FIPS validation, and excellent customer support from our expert engineers make go-wolfssl the ideal TLS/crypto solution for GO projects in the long run.

Are you interested in a more complete Golang wrapper?

Contact us at facts@wolfssl.com with any questions, comments, or suggestions!

TLS 1.3 Versus Noise Protocol

Here at wolfSSL we love TLS 1.3, but we also know there are other protocols out there such as: DTLS, QUIC, SSH, MQTT and Noise.  In this post we will compare and contrast TLS 1.3 against Noise and provide some notes about FIPS-140 and post-quantum cryptography.

Noise itself is NOT a protocol per se; it is a protocol framework (here lies the biggest difference between TLS 1.3 and Noise). When using TLS 1.3 the connection will be authenticated, confidential, and have integrity. It is quite simple and efficient to get these properties.  All of wolfSSL’s example server and client applications that do TLS 1.3 are just a few hundred lines of code and the simplest can easily be under 100 lines (found here:https://github.com/wolfSSL/wolfssl-examples/tree/master/tls). Contrast that with the requirement that you need to design your own Noise-based protocol depending on the security properties that you desire, and suddenly Noise looks a bit more challenging than TLS 1.3.  Expertise is required! See section 7.5 of https://noiseprotocol.org/noise.html to see the fundamental patterns that can be used.

The next biggest difference is authentication. TLS usually requires the server to have an X.509 certificate so the client can verify the identity of the server.  The server’s identity is bound to the public key via the certificate and is verified by proving possession of the private key to the client. The Noise Framework does not support identity verification; it leaves that to the application. However, it does allow for using static encryption keys which then ensures that each side is talking to the same party they were talking to in the past. And again, you must design or use the correct pattern to achieve this goal and then design identity verification into your application.

TLS 1.3 standardizes the cryptographic algorithms and NIST gives guidance on which algorithms to use in it. As a result, it is easy to stay in compliance with FIPS-140. For example, if you simply use wolfSSL’s defaults in our FIPS-certified product, you will be fine. On the other hand, for Noise, NIST has given no guidance so you are on your own when you design your protocol or pick your patterns.

Can you do post-quantum cryptography in TLS 1.3 today? Yes! There are private use code points for the Supported Groups Extension and Signature Algorithm Extension.  However, once post-quantum algorithms are standardized, standard codepoint and OIDs should quickly follow. The mechanics and cryptographic artifacts of post-quantum signature schemes and KEMs (key encapsulation mechanism) fit quite nicely into the TLS 1.3 handshake and X.509 certificate PKI. For more details, you can read our documentation about post-quantum TLS 1.3 in wolfSSL at https://www.wolfssl.com/documentation/manuals/wolfssl/appendix07.html.  What about the Noise Framework? The short answer is no. The protocol framework relies on the “non-interactiveness” of the Diffie-Hellman key exchange protocol and KEMs are interactive! There are no known post-quantum non-interactive key exchange algorithms as of the time of this writing.  However, research into different possibilities is ongoing and the Noise Protocol framework could eventually evolve into supporting post-quantum algorithms. For example, please see https://eprint.iacr.org/2022/539.pdf

Our conclusion is that if TLS 1.3 can get you what you need, then keep it simple and use TLS 1.3.

For any questions, or to get help using wolfSSL in your product or projects, contact us at facts@wolfssl.com.

wolfCrypt JCE Provider and JNI Wrapper 1.4.0 Now Available

Version 1.4.0 of the wolfCrypt JCE Provider and JNI wrapper is now available for download!

wolfCrypt JNI/JCE provide Java-based applications with an easy way to use the native wolfCrypt cryptography library. The thin JNI wrapper can be used for direct JNI calls into native wolfCrypt, or the JCE provider (wolfJCE) can be registered as a Java Security provider for seamless integration underneath the Java Security API. wolfCrypt JNI/JCE can work with wolfCrypt FIPS 140-2 (and upcoming 140-3) as well!

Release 1.4.0 of wolfCrypt JNI has bug fixes and new features including:

  • Add example directory with one simple ProviderTest example (PR 32)
  • Fix double free of ChaCha pointer (PR 34)
  • Add test cases for ChaCha.java (PR 34)
  • Skip WolfCryptMacTest for HMAC-MD5 when using wolfCrypt FIPS 140-3 (PR 35)
  • Use new hash struct names (wc_Md5/wc_Sha/etc) in native code (PR 35)
  • Fix potential build error with non-ASCII apostrophes in Fips.java (PR 36)

Version 1.4.0 can be downloaded from the wolfSSL download page, and an updated version of the wolfCrypt JNI/JCE User Manual can be found here. For any questions, or to get help using wolfSSL in your product or projects, contact us at facts@wolfssl.com.

wolfSSL JSSE Provider and JNI Wrapper 1.10.0 Now Available

Version 1.10.0 of the wolfSSL JSSE Provider and JNI wrapper is now available for download!

wolfSSL JNI/JSSE provide Java-based applications with an easy way to use the native wolfSSL SSL/TLS library. The thin JNI wrapper can be used for direct JNI calls into native wolfSSL, or the JSSE provider (wolfJSSE) can be registered as a Java Security provider for seamless integration underneath the Java Security API. wolfSSL JNI/JSSE provides TLS 1.3 support and also can work with wolfCrypt FIPS 140-2 (and upcoming 140-3).

Release 1.10.0 has bug fixes and new features including:

JNI and JSSE Changes:

  • Add SSLEngine.getApplicationProtocol(), fixes Undertow compatibility (PR 84)
  • Wrap wolfSSL_UseALPN() at JNI level (PR 84)
  • Fix compile error for wolfSSL < 4.2.0 and wolfSSL_set_alpn_protos() (PR 84)
  • Fix NullPointerException when no selected ALPN is available (PR 84)
  • Fix JNI build when wolfSSL compiled with –disable-filesystem (PR 104)
  • Fix SSLEngine compatibility with data larger than TLS record size (PR 105)
  • Refactor SSLEngine handshake status to be more inline with SunJSSE (PR 105)
  • Add verbose SSLEngine logging with “wolfsslengine.debug” property (PR 105)

Documentation Changes:

  • Fix missing Javadoc warnings in ALPN code

Example Changes:

  • Update Android Studio IDE project to use Android 11 (SDK 30)

Version 1.10 can be downloaded from the wolfSSL download page, and an updated version of the wolfSSL JNI/JSSE User Manual can be found here. For any questions, or to get help using wolfSSL in your product or projects, contact us at facts@wolfssl.com.

Building wolfSSL with Yocto explained in only 2 minutes!

If you use Yocto and have a communications security need or maybe just crypto, perhaps meta-wolfssl has what you are looking for! wolfSSL offers the latest cutting edge solutions in cryptography and transport protocols.

wolfSSL Inc. has support for post-quantum crypto, API’s for use with a QUIC library, crypto with a certification (if needed) FIPS 140-2, FIPS 140-3, or DO-178C DAL A and much more including but not limited to: in-house embedded SSH client/server, MQTT client, secure bootloader (wolfBoot) etc! wolfSSL also offers support for many commonly used third-party open source implementations, just head on over to our products page or check out our OSP support repo on GitHub to find out more!

To get started with wolfSSL in Yocto, if you have 2 minutes to spare in your day, please checkout our two-part series YouTube-short videos at the following links:

wolfSSL + Yocto – how to (part 1)
wolfSSL + Yocto – how to (part 2)

This very quick, two-part series shows you all you would need to get started for building wolfSSL into your yocto image in just 2 minutes! wolfSSL has very experienced and knowledgeable engineers to answer any questions you might have once you are beyond the initial standup phase (IE how to configure wolfSSL with different settings etc), just reach out to us at support@wolfssl.com if you have any questions, we are always eager to help out!

P.S. If meta-wolfssl does not yet include a Yocto recipe for one of our products please let us know through our support channel which one you would be eager to see added next!

wolfSSL QUIC Support

wolfSSL continues to follow recent development of the protocols driving today’s Internet. QUIC, by some regarded as the successor to TCP, is gaining momentum and is used in production by Google, Fastly, Cloudflare and others when you browse the net.

QUIC is built on top of TLSv1.3 – in a novel way – and now you may use wolfSSL inside your QUIC protocol stack to deliver HTTP/3. The wolfSSL team has contributed integrations to ngtcp2, the popular QUIC implementation. cURL will give you HTTP/3 with wolfSSL on the command line and in your libcurl integration soon.

HTTP/3 is only one (but dominant) use of QUIC. DNS queries are coming, adding the new triple ‘DoQ’ to the list of ‘Do*’ acronyms for name resolution protocols. And other QUIC applications are under active development in the IETF.


The wolfSSL QUIC API is aligned with the corresponding APIs in other *SSL libraries, making integration with QUIC protocol stacks easier and protecting investments. This is a departure from past customs where OpenSSL used to drive the design of APIs. However OpenSSL declined to participate and offers no QUIC support for the foreseeable future.
The need for a new API arises from the improved security design of the QUIC protocol. QUIC protects not only application data, but also its own protocol information with strong encryption. Its packets are more opaque to middleboxes.

This means that en-/decryption needs to happen ‘outside’ of what a TLS library commonly handles. However, the designers of QUIC were well aware of the worth of TLSv1.3 in its design
and implementations.

This resulted in a protocol that makes full use of TLSv1.3 handshake negotiation, ciphers and sessions, but takes over the actual en-/decryption itself. Using secrets and keys from the TLS handshake. These are the facilities that the QUIC API adds.

wolfSSL + QUIC == wolfSSL

Building wolfSSL with QUIC support will give you wolfSSL. All features work as before. In addition you may enable QUIC on a WOLFSSL instance or context. And have a mix of (D)TLS and QUIC sessions in the same application.

For more details about the release of information in general contact facts@wolfssl.com.

wolfSSL Espressif ESP32-C3 RISC-V Support

The wolfSSL team continues to embrace the open source community for the ever expanding product line of Espressif chips with support for the RISC-V architecture of the ESP32-C3.

Do you want to use world-class encryption software on your next ESP32 project? Check out the fully open-source wolfSSL codebase. The code continues to be free to use for makers under the terms of GPLv2. Commercial users for any size project are encouraged to contact us for licensing, professional support, and engineering development services.  

Try out the wolfSSL encryption libraries today! Wondering which board to use? Check out our friends creating the ICE-V Wireless RISC-V ESP32-C3 and ice40 FPGA board. There’s a community example using this board for the wolfSSL SSH to UART Server

We are currently working on adding RISC-V cryptographic hardware acceleration  and support for the Espressif ESP-IDF Version 5.0.

For the RISC-V ESP32-C3 with software only running at 160MHz here are our current wolfSSL benchmarks:

Build:Feb  7 2021
rst:0x1 (POWERON),boot:0xf (SPI_FAST_FLASH_BOOT)
mode:DIO, clock div:1
I (30) boot: ESP-IDF v4.4.1-dirty 2nd stage bootloader
I (30) boot: compile time 10:13:40
I (30) boot: chip revision: 3
I (32) boot.esp32c3: SPI Speed      : 80MHz
I (37) boot.esp32c3: SPI Mode       : DIO
I (42) boot.esp32c3: SPI Flash Size : 4MB
I (47) boot: Enabling RNG early entropy source...
I (216) cpu_start: cpu freq: 160000000
I (216) cpu_start: Application information:
I (218) cpu_start: Project name:     wolfSSL_esp32_benchmark
I (225) cpu_start: App version:      v0.1-925-g935ebfd
I (231) cpu_start: Compile time:     Aug  3 2022 10:12:05
I (237) cpu_start: ELF file SHA256:  900d509ee08c8d01...
I (243) cpu_start: ESP-IDF:          v4.4.1-dirty
I (249) heap_init: Initializing. RAM available for dynamic allocation:
I (255) heap_init: At 3FC8DB60 len 000324A0 (201 KiB): DRAM
I (261) heap_init: At 3FCC0000 len 0001F060 (124 KiB): STACK/DRAM
I (268) heap_init: At 50000020 len 00001FE0 (7 KiB): RTCRAM
I (275) spi_flash: detected chip: generic
I (279) spi_flash: flash io: dio
AES-128-CBC-enc     10 MB took 1.000 seconds,   10.376 MB/s
AES-128-CBC-dec     11 MB took 1.001 seconds,   10.561 MB/s
AES-192-CBC-enc      9 MB took 1.000 seconds,    9.399 MB/s
AES-192-CBC-dec     10 MB took 1.000 seconds,    9.546 MB/s
AES-256-CBC-enc      9 MB took 1.000 seconds,    8.594 MB/s
AES-256-CBC-dec      9 MB took 1.002 seconds,    8.723 MB/s
AES-128-GCM-enc      3 MB took 1.007 seconds,    2.546 MB/s
AES-128-GCM-dec      3 MB took 1.007 seconds,    2.546 MB/s
AES-192-GCM-enc      2 MB took 1.004 seconds,    2.480 MB/s
AES-192-GCM-dec      2 MB took 1.004 seconds,    2.480 MB/s
AES-256-GCM-enc      2 MB took 1.008 seconds,    2.422 MB/s
AES-256-GCM-dec      2 MB took 1.009 seconds,    2.420 MB/s
GMAC Default         3 MB took 1.000 seconds,    3.397 MB/s
3DES                 3 MB took 1.003 seconds,    3.164 MB/s
MD5                102 MB took 1.000 seconds,  101.978 MB/s
SHA                 49 MB took 1.000 seconds,   48.730 MB/s
SHA-256             15 MB took 1.000 seconds,   14.941 MB/s
SHA-512             13 MB took 1.001 seconds,   12.731 MB/s
HMAC-MD5           101 MB took 1.000 seconds,  100.977 MB/s
HMAC-SHA            48 MB took 1.000 seconds,   48.291 MB/s
HMAC-SHA256         15 MB took 1.001 seconds,   14.805 MB/s
HMAC-SHA512         13 MB took 1.001 seconds,   12.536 MB/s
PBKDF2               2 KB took 1.008 seconds,    1.829 KB/s
RSA     2048 public        394 ops took 1.000 sec, avg 2.538 ms, 394.000 ops/sec
RSA     2048 private         8 ops took 1.293 sec, avg 161.625 ms, 6.187 ops/sec
ECC   [      SECP256R1]   256 key gen        50 ops took 1.039 sec, avg 20.780 m                                  s, 48.123 ops/sec
ECDHE [      SECP256R1]   256 agree          50 ops took 1.038 sec, avg 20.760 m                                  s, 48.170 ops/sec
ECDSA [      SECP256R1]   256 sign           48 ops took 1.010 sec, avg 21.042 m                                  s, 47.525 ops/sec
ECDSA [      SECP256R1]   256 verify         26 ops took 1.045 sec, avg 40.192 m                                  s, 24.880 ops/sec
CURVE  25519 key gen        20 ops took 1.003 sec, avg 50.150 ms, 19.940 ops/sec
CURVE  25519 agree          20 ops took 1.002 sec, avg 50.100 ms, 19.960 ops/sec
ED     25519 key gen       529 ops took 1.001 sec, avg 1.892 ms, 528.472 ops/sec
ED     25519 sign          470 ops took 1.000 sec, avg 2.128 ms, 470.000 ops/sec
ED     25519 verify        254 ops took 1.002 sec, avg 3.945 ms, 253.493 ops/sec
Benchmark complete
I (467072) wolfbenchmark: wolfssl_check: 0

See also:

For questions please email facts@wolfssl.com

Sniffer Improvements for Cryptographic Offloading and Concurrent Stream Processing

The sniffer support for processing multiple streams concurrently using our asynchronous version of the library. Support has been added for offloading to Intel QuickAssist or Cavium Nitrox V type hardware. Additionally we support offloading to worker threads. This allows a large increase in sniffer throughput for handling the asymmetric operations.

Our sniffer tool is built into wolfSSL and allows decryption of TLS traffic where the static RSA/ECC key is know or the ephemeral key used on one side is known. We support TLS v1.2 and TLS v1.3. The sniffer tool can process pcap files previously recorded or live.

We also support using a Key Manager for protected generation and storage of ephemeral keys with TLS v1.3. This is based on the ETSI TS 103 523-3 Middlebox Security Protocol; Part 3: Enterprise Transport Security. If interested see our full library and demo here: https://github.com/wolfSSL/wolfKeyMgr

For questions about using the sniffer with TLS please email facts@wolfssl.com.


Posts navigation

1 2