cjson
.github
workflows CI.yml ci-fuzz.yml
CONTRIBUTING.md
fuzzing
inputs test1 test10 test11 test2 test3 test3.bu test3.uf test3.uu test4 test5 test6 test7 test8 test9
.gitignore CMakeLists.txt afl-prepare-linux.sh afl.c afl.sh cjson_read_fuzzer.c fuzz_main.c json.dict ossfuzz.sh
library_config cJSONConfig.cmake.in cJSONConfigVersion.cmake.in libcjson.pc.in libcjson_utils.pc.in uninstall.cmake
tests
inputs test1 test1.expected test10 test10.expected test11 test11.expected test2 test2.expected test3 test3.expected test4 test4.expected test5 test5.expected test6 test7 test7.expected test8 test8.expected test9 test9.expected
json-patch-tests .editorconfig .gitignore .npmignore README.md cjson-utils-tests.json package.json spec_tests.json tests.json
unity
auto colour_prompt.rb colour_reporter.rb generate_config.yml generate_module.rb generate_test_runner.rb parse_output.rb stylize_as_junit.rb test_file_filter.rb type_sanitizer.rb unity_test_summary.py unity_test_summary.rb unity_to_junit.py
docs ThrowTheSwitchCodingStandard.md UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf UnityAssertionsReference.md UnityConfigurationGuide.md UnityGettingStartedGuide.md UnityHelperScriptsGuide.md license.txt
examples
example_1
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
makefile readme.txt
example_2
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
makefile readme.txt
example_3
helper UnityHelper.c UnityHelper.h
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
rakefile.rb rakefile_helper.rb readme.txt target_gcc_32.yml
unity_config.h
extras
eclipse error_parsers.txt
fixture
src unity_fixture.c unity_fixture.h unity_fixture_internals.h unity_fixture_malloc_overrides.h
rakefile.rb rakefile_helper.rb readme.txt
release build.info version.info
src unity.c unity.h unity_internals.h
.gitattributes .gitignore .travis.yml README.md
CMakeLists.txt cjson_add.c common.h compare_tests.c json_patch_tests.c minify_tests.c misc_tests.c misc_utils_tests.c old_utils_tests.c parse_array.c parse_examples.c parse_hex4.c parse_number.c parse_object.c parse_string.c parse_value.c parse_with_opts.c print_array.c print_number.c print_object.c print_string.c print_value.c readme_examples.c unity_setup.c
.editorconfig .gitattributes .gitignore .travis.yml CHANGELOG.md CMakeLists.txt CONTRIBUTORS.md LICENSE Makefile README.md SECURITY.md appveyor.yml cJSON.c cJSON.h cJSON_Utils.c cJSON_Utils.h test.c valgrind.supp
curl
.circleci config.yml
.github
ISSUE_TEMPLATE bug_report.yml config.yml docs.yml
scripts cleancmd.pl cmp-config.pl cmp-pkg-config.sh codespell-ignore.words codespell.sh distfiles.sh pyspelling.words pyspelling.yaml randcurl.pl requirements-docs.txt requirements-proselint.txt requirements.txt shellcheck-ci.sh shellcheck.sh spellcheck.curl trimmarkdownheader.pl typos.sh typos.toml verify-examples.pl verify-synopsis.pl yamlcheck.sh yamlcheck.yaml
workflows appveyor-status.yml checkdocs.yml checksrc.yml checkurls.yml codeql.yml configure-vs-cmake.yml curl-for-win.yml distcheck.yml fuzz.yml http3-linux.yml label.yml linux-old.yml linux.yml macos.yml non-native.yml windows.yml
CODEOWNERS CONTRIBUTING.md FUNDING.yml dependabot.yml labeler.yml lock.yml stale.yml
CMake CurlSymbolHiding.cmake CurlTests.c FindBrotli.cmake FindCares.cmake FindGSS.cmake FindGnuTLS.cmake FindLDAP.cmake FindLibbacktrace.cmake FindLibgsasl.cmake FindLibidn2.cmake FindLibpsl.cmake FindLibssh.cmake FindLibssh2.cmake FindLibuv.cmake FindMbedTLS.cmake FindNGHTTP2.cmake FindNGHTTP3.cmake FindNGTCP2.cmake FindNettle.cmake FindQuiche.cmake FindRustls.cmake FindWolfSSL.cmake FindZstd.cmake Macros.cmake OtherTests.cmake PickyWarnings.cmake Utilities.cmake cmake_uninstall.in.cmake curl-config.in.cmake unix-cache.cmake win32-cache.cmake
LICENSES BSD-4-Clause-UC.txt ISC.txt curl.txt
docs
cmdline-opts .gitignore CMakeLists.txt MANPAGE.md Makefile.am Makefile.inc _AUTHORS.md _BUGS.md _DESCRIPTION.md _ENVIRONMENT.md _EXITCODES.md _FILES.md _GLOBBING.md _NAME.md _OPTIONS.md _OUTPUT.md _PROGRESS.md _PROTOCOLS.md _PROXYPREFIX.md _SEEALSO.md _SYNOPSIS.md _URL.md _VARIABLES.md _VERSION.md _WWW.md abstract-unix-socket.md alt-svc.md anyauth.md append.md aws-sigv4.md basic.md ca-native.md cacert.md capath.md cert-status.md cert-type.md cert.md ciphers.md compressed-ssh.md compressed.md config.md connect-timeout.md connect-to.md continue-at.md cookie-jar.md cookie.md create-dirs.md create-file-mode.md crlf.md crlfile.md curves.md data-ascii.md data-binary.md data-raw.md data-urlencode.md data.md delegation.md digest.md disable-eprt.md disable-epsv.md disable.md disallow-username-in-url.md dns-interface.md dns-ipv4-addr.md dns-ipv6-addr.md dns-servers.md doh-cert-status.md doh-insecure.md doh-url.md dump-ca-embed.md dump-header.md ech.md egd-file.md engine.md etag-compare.md etag-save.md expect100-timeout.md fail-early.md fail-with-body.md fail.md false-start.md follow.md form-escape.md form-string.md form.md ftp-account.md ftp-alternative-to-user.md ftp-create-dirs.md ftp-method.md ftp-pasv.md ftp-port.md ftp-pret.md ftp-skip-pasv-ip.md ftp-ssl-ccc-mode.md ftp-ssl-ccc.md ftp-ssl-control.md get.md globoff.md happy-eyeballs-timeout-ms.md haproxy-clientip.md haproxy-protocol.md head.md header.md help.md hostpubmd5.md hostpubsha256.md hsts.md http0.9.md http1.0.md http1.1.md http2-prior-knowledge.md http2.md http3-only.md http3.md ignore-content-length.md insecure.md interface.md ip-tos.md ipfs-gateway.md ipv4.md ipv6.md json.md junk-session-cookies.md keepalive-cnt.md keepalive-time.md key-type.md key.md knownhosts.md krb.md libcurl.md limit-rate.md list-only.md local-port.md location-trusted.md location.md login-options.md mail-auth.md mail-from.md mail-rcpt-allowfails.md mail-rcpt.md mainpage.idx manual.md max-filesize.md max-redirs.md max-time.md metalink.md mptcp.md negotiate.md netrc-file.md netrc-optional.md netrc.md next.md no-alpn.md no-buffer.md no-clobber.md no-keepalive.md no-npn.md no-progress-meter.md no-sessionid.md noproxy.md ntlm-wb.md ntlm.md oauth2-bearer.md out-null.md output-dir.md output.md parallel-immediate.md parallel-max-host.md parallel-max.md parallel.md pass.md path-as-is.md pinnedpubkey.md post301.md post302.md post303.md preproxy.md progress-bar.md proto-default.md proto-redir.md proto.md proxy-anyauth.md proxy-basic.md proxy-ca-native.md proxy-cacert.md proxy-capath.md proxy-cert-type.md proxy-cert.md proxy-ciphers.md proxy-crlfile.md proxy-digest.md proxy-header.md proxy-http2.md proxy-insecure.md proxy-key-type.md proxy-key.md proxy-negotiate.md proxy-ntlm.md proxy-pass.md proxy-pinnedpubkey.md proxy-service-name.md proxy-ssl-allow-beast.md proxy-ssl-auto-client-cert.md proxy-tls13-ciphers.md proxy-tlsauthtype.md proxy-tlspassword.md proxy-tlsuser.md proxy-tlsv1.md proxy-user.md proxy.md proxy1.0.md proxytunnel.md pubkey.md quote.md random-file.md range.md rate.md raw.md referer.md remote-header-name.md remote-name-all.md remote-name.md remote-time.md remove-on-error.md request-target.md request.md resolve.md retry-all-errors.md retry-connrefused.md retry-delay.md retry-max-time.md retry.md sasl-authzid.md sasl-ir.md service-name.md show-error.md show-headers.md sigalgs.md silent.md skip-existing.md socks4.md socks4a.md socks5-basic.md socks5-gssapi-nec.md socks5-gssapi-service.md socks5-gssapi.md socks5-hostname.md socks5.md speed-limit.md speed-time.md ssl-allow-beast.md ssl-auto-client-cert.md ssl-no-revoke.md ssl-reqd.md ssl-revoke-best-effort.md ssl-sessions.md ssl.md sslv2.md sslv3.md stderr.md styled-output.md suppress-connect-headers.md tcp-fastopen.md tcp-nodelay.md telnet-option.md tftp-blksize.md tftp-no-options.md time-cond.md tls-earlydata.md tls-max.md tls13-ciphers.md tlsauthtype.md tlspassword.md tlsuser.md tlsv1.0.md tlsv1.1.md tlsv1.2.md tlsv1.3.md tlsv1.md tr-encoding.md trace-ascii.md trace-config.md trace-ids.md trace-time.md trace.md unix-socket.md upload-file.md upload-flags.md url-query.md url.md use-ascii.md user-agent.md user.md variable.md verbose.md version.md vlan-priority.md write-out.md xattr.md
examples .checksrc .gitignore 10-at-a-time.c CMakeLists.txt Makefile.am Makefile.example Makefile.inc README.md adddocsref.pl address-scope.c altsvc.c anyauthput.c block_ip.c cacertinmem.c certinfo.c chkspeed.c connect-to.c cookie_interface.c crawler.c debug.c default-scheme.c ephiperfifo.c evhiperfifo.c externalsocket.c fileupload.c ftp-delete.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c getinfo.c getinmemory.c getredirect.c getreferrer.c ghiper.c headerapi.c hiperfifo.c hsts-preload.c htmltidy.c htmltitle.cpp http-options.c http-post.c http2-download.c http2-pushinmemory.c http2-serverpush.c http2-upload.c http3-present.c http3.c httpcustomheader.c httpput-postfields.c httpput.c https.c imap-append.c imap-authzid.c imap-copy.c imap-create.c imap-delete.c imap-examine.c imap-fetch.c imap-list.c imap-lsub.c imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c imap-tls.c interface.c ipv6.c keepalive.c localport.c log_failed_transfers.c maxconnects.c multi-app.c multi-debugcallback.c multi-double.c multi-event.c multi-formadd.c multi-legacy.c multi-post.c multi-single.c multi-uv.c netrc.c parseurl.c persistent.c pop3-authzid.c pop3-dele.c pop3-list.c pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c postinmemory.c postit2-formadd.c postit2.c progressfunc.c protofeats.c range.c resolve.c rtsp-options.c sendrecv.c sepheaders.c sessioninfo.c sftpget.c sftpuploadresume.c shared-connection-cache.c simple.c simplepost.c simplessl.c smooth-gtk-thread.c smtp-authzid.c smtp-expn.c smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c smtp-tls.c smtp-vrfy.c sslbackend.c synctime.c threaded.c unixsocket.c url2file.c urlapi.c usercertinmem.c version-check.pl websocket-cb.c websocket-updown.c websocket.c xmlstream.c
internals BUFQ.md BUFREF.md CHECKSRC.md CLIENT-READERS.md CLIENT-WRITERS.md CODE_STYLE.md CONNECTION-FILTERS.md CREDENTIALS.md CURLX.md DYNBUF.md HASH.md LLIST.md MID.md MQTT.md MULTI-EV.md NEW-PROTOCOL.md PEERS.md PORTING.md RATELIMITS.md README.md SCORECARD.md SPLAY.md STRPARSE.md THRDPOOL-AND-QUEUE.md TIME-KEEPING.md TLS-SESSIONS.md UINT_SETS.md WEBSOCKET.md
libcurl
opts CMakeLists.txt CURLINFO_ACTIVESOCKET.md CURLINFO_APPCONNECT_TIME.md CURLINFO_APPCONNECT_TIME_T.md CURLINFO_CAINFO.md CURLINFO_CAPATH.md CURLINFO_CERTINFO.md CURLINFO_CONDITION_UNMET.md CURLINFO_CONNECT_TIME.md CURLINFO_CONNECT_TIME_T.md CURLINFO_CONN_ID.md CURLINFO_CONTENT_LENGTH_DOWNLOAD.md CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.md CURLINFO_CONTENT_LENGTH_UPLOAD.md CURLINFO_CONTENT_LENGTH_UPLOAD_T.md CURLINFO_CONTENT_TYPE.md CURLINFO_COOKIELIST.md CURLINFO_EARLYDATA_SENT_T.md CURLINFO_EFFECTIVE_METHOD.md CURLINFO_EFFECTIVE_URL.md CURLINFO_FILETIME.md CURLINFO_FILETIME_T.md CURLINFO_FTP_ENTRY_PATH.md CURLINFO_HEADER_SIZE.md CURLINFO_HTTPAUTH_AVAIL.md CURLINFO_HTTPAUTH_USED.md CURLINFO_HTTP_CONNECTCODE.md CURLINFO_HTTP_VERSION.md CURLINFO_LASTSOCKET.md CURLINFO_LOCAL_IP.md CURLINFO_LOCAL_PORT.md CURLINFO_NAMELOOKUP_TIME.md CURLINFO_NAMELOOKUP_TIME_T.md CURLINFO_NUM_CONNECTS.md CURLINFO_OS_ERRNO.md CURLINFO_POSTTRANSFER_TIME_T.md CURLINFO_PRETRANSFER_TIME.md CURLINFO_PRETRANSFER_TIME_T.md CURLINFO_PRIMARY_IP.md CURLINFO_PRIMARY_PORT.md CURLINFO_PRIVATE.md CURLINFO_PROTOCOL.md CURLINFO_PROXYAUTH_AVAIL.md CURLINFO_PROXYAUTH_USED.md CURLINFO_PROXY_ERROR.md CURLINFO_PROXY_SSL_VERIFYRESULT.md CURLINFO_QUEUE_TIME_T.md CURLINFO_REDIRECT_COUNT.md CURLINFO_REDIRECT_TIME.md CURLINFO_REDIRECT_TIME_T.md CURLINFO_REDIRECT_URL.md CURLINFO_REFERER.md CURLINFO_REQUEST_SIZE.md CURLINFO_RESPONSE_CODE.md CURLINFO_RETRY_AFTER.md CURLINFO_RTSP_CLIENT_CSEQ.md CURLINFO_RTSP_CSEQ_RECV.md CURLINFO_RTSP_SERVER_CSEQ.md CURLINFO_RTSP_SESSION_ID.md CURLINFO_SCHEME.md CURLINFO_SIZE_DELIVERED.md CURLINFO_SIZE_DOWNLOAD.md CURLINFO_SIZE_DOWNLOAD_T.md CURLINFO_SIZE_UPLOAD.md CURLINFO_SIZE_UPLOAD_T.md CURLINFO_SPEED_DOWNLOAD.md CURLINFO_SPEED_DOWNLOAD_T.md CURLINFO_SPEED_UPLOAD.md CURLINFO_SPEED_UPLOAD_T.md CURLINFO_SSL_ENGINES.md CURLINFO_SSL_VERIFYRESULT.md CURLINFO_STARTTRANSFER_TIME.md CURLINFO_STARTTRANSFER_TIME_T.md CURLINFO_TLS_SESSION.md CURLINFO_TLS_SSL_PTR.md CURLINFO_TOTAL_TIME.md CURLINFO_TOTAL_TIME_T.md CURLINFO_USED_PROXY.md CURLINFO_XFER_ID.md CURLMINFO_XFERS_ADDED.md CURLMINFO_XFERS_CURRENT.md CURLMINFO_XFERS_DONE.md CURLMINFO_XFERS_PENDING.md CURLMINFO_XFERS_RUNNING.md CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.md CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.md CURLMOPT_MAXCONNECTS.md CURLMOPT_MAX_CONCURRENT_STREAMS.md CURLMOPT_MAX_HOST_CONNECTIONS.md CURLMOPT_MAX_PIPELINE_LENGTH.md CURLMOPT_MAX_TOTAL_CONNECTIONS.md CURLMOPT_NETWORK_CHANGED.md CURLMOPT_NOTIFYDATA.md CURLMOPT_NOTIFYFUNCTION.md CURLMOPT_PIPELINING.md CURLMOPT_PIPELINING_SERVER_BL.md CURLMOPT_PIPELINING_SITE_BL.md CURLMOPT_PUSHDATA.md CURLMOPT_PUSHFUNCTION.md CURLMOPT_QUICK_EXIT.md CURLMOPT_RESOLVE_THREADS_MAX.md CURLMOPT_SOCKETDATA.md CURLMOPT_SOCKETFUNCTION.md CURLMOPT_TIMERDATA.md CURLMOPT_TIMERFUNCTION.md CURLOPT_ABSTRACT_UNIX_SOCKET.md CURLOPT_ACCEPTTIMEOUT_MS.md CURLOPT_ACCEPT_ENCODING.md CURLOPT_ADDRESS_SCOPE.md CURLOPT_ALTSVC.md CURLOPT_ALTSVC_CTRL.md CURLOPT_APPEND.md CURLOPT_AUTOREFERER.md CURLOPT_AWS_SIGV4.md CURLOPT_BUFFERSIZE.md CURLOPT_CAINFO.md CURLOPT_CAINFO_BLOB.md CURLOPT_CAPATH.md CURLOPT_CA_CACHE_TIMEOUT.md CURLOPT_CERTINFO.md CURLOPT_CHUNK_BGN_FUNCTION.md CURLOPT_CHUNK_DATA.md CURLOPT_CHUNK_END_FUNCTION.md CURLOPT_CLOSESOCKETDATA.md CURLOPT_CLOSESOCKETFUNCTION.md CURLOPT_CONNECTTIMEOUT.md CURLOPT_CONNECTTIMEOUT_MS.md CURLOPT_CONNECT_ONLY.md CURLOPT_CONNECT_TO.md CURLOPT_CONV_FROM_NETWORK_FUNCTION.md CURLOPT_CONV_FROM_UTF8_FUNCTION.md CURLOPT_CONV_TO_NETWORK_FUNCTION.md CURLOPT_COOKIE.md CURLOPT_COOKIEFILE.md CURLOPT_COOKIEJAR.md CURLOPT_COOKIELIST.md CURLOPT_COOKIESESSION.md CURLOPT_COPYPOSTFIELDS.md CURLOPT_CRLF.md CURLOPT_CRLFILE.md CURLOPT_CURLU.md CURLOPT_CUSTOMREQUEST.md CURLOPT_DEBUGDATA.md CURLOPT_DEBUGFUNCTION.md CURLOPT_DEFAULT_PROTOCOL.md CURLOPT_DIRLISTONLY.md CURLOPT_DISALLOW_USERNAME_IN_URL.md CURLOPT_DNS_CACHE_TIMEOUT.md CURLOPT_DNS_INTERFACE.md CURLOPT_DNS_LOCAL_IP4.md CURLOPT_DNS_LOCAL_IP6.md CURLOPT_DNS_SERVERS.md CURLOPT_DNS_SHUFFLE_ADDRESSES.md CURLOPT_DNS_USE_GLOBAL_CACHE.md CURLOPT_DOH_SSL_VERIFYHOST.md CURLOPT_DOH_SSL_VERIFYPEER.md CURLOPT_DOH_SSL_VERIFYSTATUS.md CURLOPT_DOH_URL.md CURLOPT_ECH.md CURLOPT_EGDSOCKET.md CURLOPT_ERRORBUFFER.md CURLOPT_EXPECT_100_TIMEOUT_MS.md CURLOPT_FAILONERROR.md CURLOPT_FILETIME.md CURLOPT_FNMATCH_DATA.md CURLOPT_FNMATCH_FUNCTION.md CURLOPT_FOLLOWLOCATION.md CURLOPT_FORBID_REUSE.md CURLOPT_FRESH_CONNECT.md CURLOPT_FTPPORT.md CURLOPT_FTPSSLAUTH.md CURLOPT_FTP_ACCOUNT.md CURLOPT_FTP_ALTERNATIVE_TO_USER.md CURLOPT_FTP_CREATE_MISSING_DIRS.md CURLOPT_FTP_FILEMETHOD.md CURLOPT_FTP_SKIP_PASV_IP.md CURLOPT_FTP_SSL_CCC.md CURLOPT_FTP_USE_EPRT.md CURLOPT_FTP_USE_EPSV.md CURLOPT_FTP_USE_PRET.md CURLOPT_GSSAPI_DELEGATION.md CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.md CURLOPT_HAPROXYPROTOCOL.md CURLOPT_HAPROXY_CLIENT_IP.md CURLOPT_HEADER.md CURLOPT_HEADERDATA.md CURLOPT_HEADERFUNCTION.md CURLOPT_HEADEROPT.md CURLOPT_HSTS.md CURLOPT_HSTSREADDATA.md CURLOPT_HSTSREADFUNCTION.md CURLOPT_HSTSWRITEDATA.md CURLOPT_HSTSWRITEFUNCTION.md CURLOPT_HSTS_CTRL.md CURLOPT_HTTP09_ALLOWED.md CURLOPT_HTTP200ALIASES.md CURLOPT_HTTPAUTH.md CURLOPT_HTTPGET.md CURLOPT_HTTPHEADER.md CURLOPT_HTTPPOST.md CURLOPT_HTTPPROXYTUNNEL.md CURLOPT_HTTP_CONTENT_DECODING.md CURLOPT_HTTP_TRANSFER_DECODING.md CURLOPT_HTTP_VERSION.md CURLOPT_IGNORE_CONTENT_LENGTH.md CURLOPT_INFILESIZE.md CURLOPT_INFILESIZE_LARGE.md CURLOPT_INTERFACE.md CURLOPT_INTERLEAVEDATA.md CURLOPT_INTERLEAVEFUNCTION.md CURLOPT_IOCTLDATA.md CURLOPT_IOCTLFUNCTION.md CURLOPT_IPRESOLVE.md CURLOPT_ISSUERCERT.md CURLOPT_ISSUERCERT_BLOB.md CURLOPT_KEEP_SENDING_ON_ERROR.md CURLOPT_KEYPASSWD.md CURLOPT_KRBLEVEL.md CURLOPT_LOCALPORT.md CURLOPT_LOCALPORTRANGE.md CURLOPT_LOGIN_OPTIONS.md CURLOPT_LOW_SPEED_LIMIT.md CURLOPT_LOW_SPEED_TIME.md CURLOPT_MAIL_AUTH.md CURLOPT_MAIL_FROM.md CURLOPT_MAIL_RCPT.md CURLOPT_MAIL_RCPT_ALLOWFAILS.md CURLOPT_MAXAGE_CONN.md CURLOPT_MAXCONNECTS.md CURLOPT_MAXFILESIZE.md CURLOPT_MAXFILESIZE_LARGE.md CURLOPT_MAXLIFETIME_CONN.md CURLOPT_MAXREDIRS.md CURLOPT_MAX_RECV_SPEED_LARGE.md CURLOPT_MAX_SEND_SPEED_LARGE.md CURLOPT_MIMEPOST.md CURLOPT_MIME_OPTIONS.md CURLOPT_NETRC.md CURLOPT_NETRC_FILE.md CURLOPT_NEW_DIRECTORY_PERMS.md CURLOPT_NEW_FILE_PERMS.md CURLOPT_NOBODY.md CURLOPT_NOPROGRESS.md CURLOPT_NOPROXY.md CURLOPT_NOSIGNAL.md CURLOPT_OPENSOCKETDATA.md CURLOPT_OPENSOCKETFUNCTION.md CURLOPT_PASSWORD.md CURLOPT_PATH_AS_IS.md CURLOPT_PINNEDPUBLICKEY.md CURLOPT_PIPEWAIT.md CURLOPT_PORT.md CURLOPT_POST.md CURLOPT_POSTFIELDS.md CURLOPT_POSTFIELDSIZE.md CURLOPT_POSTFIELDSIZE_LARGE.md CURLOPT_POSTQUOTE.md CURLOPT_POSTREDIR.md CURLOPT_PREQUOTE.md CURLOPT_PREREQDATA.md CURLOPT_PREREQFUNCTION.md CURLOPT_PRE_PROXY.md CURLOPT_PRIVATE.md CURLOPT_PROGRESSDATA.md CURLOPT_PROGRESSFUNCTION.md CURLOPT_PROTOCOLS.md CURLOPT_PROTOCOLS_STR.md CURLOPT_PROXY.md CURLOPT_PROXYAUTH.md CURLOPT_PROXYHEADER.md CURLOPT_PROXYPASSWORD.md CURLOPT_PROXYPORT.md CURLOPT_PROXYTYPE.md CURLOPT_PROXYUSERNAME.md CURLOPT_PROXYUSERPWD.md CURLOPT_PROXY_CAINFO.md CURLOPT_PROXY_CAINFO_BLOB.md CURLOPT_PROXY_CAPATH.md CURLOPT_PROXY_CRLFILE.md CURLOPT_PROXY_ISSUERCERT.md CURLOPT_PROXY_ISSUERCERT_BLOB.md CURLOPT_PROXY_KEYPASSWD.md CURLOPT_PROXY_PINNEDPUBLICKEY.md CURLOPT_PROXY_SERVICE_NAME.md CURLOPT_PROXY_SSLCERT.md CURLOPT_PROXY_SSLCERTTYPE.md CURLOPT_PROXY_SSLCERT_BLOB.md CURLOPT_PROXY_SSLKEY.md CURLOPT_PROXY_SSLKEYTYPE.md CURLOPT_PROXY_SSLKEY_BLOB.md CURLOPT_PROXY_SSLVERSION.md CURLOPT_PROXY_SSL_CIPHER_LIST.md CURLOPT_PROXY_SSL_OPTIONS.md CURLOPT_PROXY_SSL_VERIFYHOST.md CURLOPT_PROXY_SSL_VERIFYPEER.md CURLOPT_PROXY_TLS13_CIPHERS.md CURLOPT_PROXY_TLSAUTH_PASSWORD.md CURLOPT_PROXY_TLSAUTH_TYPE.md CURLOPT_PROXY_TLSAUTH_USERNAME.md CURLOPT_PROXY_TRANSFER_MODE.md CURLOPT_PUT.md CURLOPT_QUICK_EXIT.md CURLOPT_QUOTE.md CURLOPT_RANDOM_FILE.md CURLOPT_RANGE.md CURLOPT_READDATA.md CURLOPT_READFUNCTION.md CURLOPT_REDIR_PROTOCOLS.md CURLOPT_REDIR_PROTOCOLS_STR.md CURLOPT_REFERER.md CURLOPT_REQUEST_TARGET.md CURLOPT_RESOLVE.md CURLOPT_RESOLVER_START_DATA.md CURLOPT_RESOLVER_START_FUNCTION.md CURLOPT_RESUME_FROM.md CURLOPT_RESUME_FROM_LARGE.md CURLOPT_RTSP_CLIENT_CSEQ.md CURLOPT_RTSP_REQUEST.md CURLOPT_RTSP_SERVER_CSEQ.md CURLOPT_RTSP_SESSION_ID.md CURLOPT_RTSP_STREAM_URI.md CURLOPT_RTSP_TRANSPORT.md CURLOPT_SASL_AUTHZID.md CURLOPT_SASL_IR.md CURLOPT_SEEKDATA.md CURLOPT_SEEKFUNCTION.md CURLOPT_SERVER_RESPONSE_TIMEOUT.md CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.md CURLOPT_SERVICE_NAME.md CURLOPT_SHARE.md CURLOPT_SOCKOPTDATA.md CURLOPT_SOCKOPTFUNCTION.md CURLOPT_SOCKS5_AUTH.md CURLOPT_SOCKS5_GSSAPI_NEC.md CURLOPT_SOCKS5_GSSAPI_SERVICE.md CURLOPT_SSH_AUTH_TYPES.md CURLOPT_SSH_COMPRESSION.md CURLOPT_SSH_HOSTKEYDATA.md CURLOPT_SSH_HOSTKEYFUNCTION.md CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.md CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256.md CURLOPT_SSH_KEYDATA.md CURLOPT_SSH_KEYFUNCTION.md CURLOPT_SSH_KNOWNHOSTS.md CURLOPT_SSH_PRIVATE_KEYFILE.md CURLOPT_SSH_PUBLIC_KEYFILE.md CURLOPT_SSLCERT.md CURLOPT_SSLCERTTYPE.md CURLOPT_SSLCERT_BLOB.md CURLOPT_SSLENGINE.md CURLOPT_SSLENGINE_DEFAULT.md CURLOPT_SSLKEY.md CURLOPT_SSLKEYTYPE.md CURLOPT_SSLKEY_BLOB.md CURLOPT_SSLVERSION.md CURLOPT_SSL_CIPHER_LIST.md CURLOPT_SSL_CTX_DATA.md CURLOPT_SSL_CTX_FUNCTION.md CURLOPT_SSL_EC_CURVES.md CURLOPT_SSL_ENABLE_ALPN.md CURLOPT_SSL_ENABLE_NPN.md CURLOPT_SSL_FALSESTART.md CURLOPT_SSL_OPTIONS.md CURLOPT_SSL_SESSIONID_CACHE.md CURLOPT_SSL_SIGNATURE_ALGORITHMS.md CURLOPT_SSL_VERIFYHOST.md CURLOPT_SSL_VERIFYPEER.md CURLOPT_SSL_VERIFYSTATUS.md CURLOPT_STDERR.md CURLOPT_STREAM_DEPENDS.md CURLOPT_STREAM_DEPENDS_E.md CURLOPT_STREAM_WEIGHT.md CURLOPT_SUPPRESS_CONNECT_HEADERS.md CURLOPT_TCP_FASTOPEN.md CURLOPT_TCP_KEEPALIVE.md CURLOPT_TCP_KEEPCNT.md CURLOPT_TCP_KEEPIDLE.md CURLOPT_TCP_KEEPINTVL.md CURLOPT_TCP_NODELAY.md CURLOPT_TELNETOPTIONS.md CURLOPT_TFTP_BLKSIZE.md CURLOPT_TFTP_NO_OPTIONS.md CURLOPT_TIMECONDITION.md CURLOPT_TIMEOUT.md CURLOPT_TIMEOUT_MS.md CURLOPT_TIMEVALUE.md CURLOPT_TIMEVALUE_LARGE.md CURLOPT_TLS13_CIPHERS.md CURLOPT_TLSAUTH_PASSWORD.md CURLOPT_TLSAUTH_TYPE.md CURLOPT_TLSAUTH_USERNAME.md CURLOPT_TRAILERDATA.md CURLOPT_TRAILERFUNCTION.md CURLOPT_TRANSFERTEXT.md CURLOPT_TRANSFER_ENCODING.md CURLOPT_UNIX_SOCKET_PATH.md CURLOPT_UNRESTRICTED_AUTH.md CURLOPT_UPKEEP_INTERVAL_MS.md CURLOPT_UPLOAD.md CURLOPT_UPLOAD_BUFFERSIZE.md CURLOPT_UPLOAD_FLAGS.md CURLOPT_URL.md CURLOPT_USERAGENT.md CURLOPT_USERNAME.md CURLOPT_USERPWD.md CURLOPT_USE_SSL.md CURLOPT_VERBOSE.md CURLOPT_WILDCARDMATCH.md CURLOPT_WRITEDATA.md CURLOPT_WRITEFUNCTION.md CURLOPT_WS_OPTIONS.md CURLOPT_XFERINFODATA.md CURLOPT_XFERINFOFUNCTION.md CURLOPT_XOAUTH2_BEARER.md CURLSHOPT_LOCKFUNC.md CURLSHOPT_SHARE.md CURLSHOPT_UNLOCKFUNC.md CURLSHOPT_UNSHARE.md CURLSHOPT_USERDATA.md Makefile.am Makefile.inc
.gitignore ABI.md CMakeLists.txt Makefile.am Makefile.inc curl_easy_cleanup.md curl_easy_duphandle.md curl_easy_escape.md curl_easy_getinfo.md curl_easy_header.md curl_easy_init.md curl_easy_nextheader.md curl_easy_option_by_id.md curl_easy_option_by_name.md curl_easy_option_next.md curl_easy_pause.md curl_easy_perform.md curl_easy_recv.md curl_easy_reset.md curl_easy_send.md curl_easy_setopt.md curl_easy_ssls_export.md curl_easy_ssls_import.md curl_easy_strerror.md curl_easy_unescape.md curl_easy_upkeep.md curl_escape.md curl_formadd.md curl_formfree.md curl_formget.md curl_free.md curl_getdate.md curl_getenv.md curl_global_cleanup.md curl_global_init.md curl_global_init_mem.md curl_global_sslset.md curl_global_trace.md curl_mime_addpart.md curl_mime_data.md curl_mime_data_cb.md curl_mime_encoder.md curl_mime_filedata.md curl_mime_filename.md curl_mime_free.md curl_mime_headers.md curl_mime_init.md curl_mime_name.md curl_mime_subparts.md curl_mime_type.md curl_mprintf.md curl_multi_add_handle.md curl_multi_assign.md curl_multi_cleanup.md curl_multi_fdset.md curl_multi_get_handles.md curl_multi_get_offt.md curl_multi_info_read.md curl_multi_init.md curl_multi_notify_disable.md curl_multi_notify_enable.md curl_multi_perform.md curl_multi_poll.md curl_multi_remove_handle.md curl_multi_setopt.md curl_multi_socket.md curl_multi_socket_action.md curl_multi_socket_all.md curl_multi_strerror.md curl_multi_timeout.md curl_multi_wait.md curl_multi_waitfds.md curl_multi_wakeup.md curl_pushheader_byname.md curl_pushheader_bynum.md curl_share_cleanup.md curl_share_init.md curl_share_setopt.md curl_share_strerror.md curl_slist_append.md curl_slist_free_all.md curl_strequal.md curl_strnequal.md curl_unescape.md curl_url.md curl_url_cleanup.md curl_url_dup.md curl_url_get.md curl_url_set.md curl_url_strerror.md curl_version.md curl_version_info.md curl_ws_meta.md curl_ws_recv.md curl_ws_send.md curl_ws_start_frame.md libcurl-easy.md libcurl-env-dbg.md libcurl-env.md libcurl-errors.md libcurl-multi.md libcurl-security.md libcurl-share.md libcurl-thread.md libcurl-tutorial.md libcurl-url.md libcurl-ws.md libcurl.m4 libcurl.md mksymbolsmanpage.pl symbols-in-versions symbols.pl
tests CI.md FILEFORMAT.md HTTP.md TEST-SUITE.md
.gitignore ALTSVC.md BINDINGS.md BUG-BOUNTY.md BUGS.md CIPHERS-TLS12.md CIPHERS.md CMakeLists.txt CODE_OF_CONDUCT.md CODE_REVIEW.md CONTRIBUTE.md CURL-DISABLE.md CURLDOWN.md DEPRECATE.md DISTROS.md EARLY-RELEASE.md ECH.md EXPERIMENTAL.md FAQ.md FEATURES.md GOVERNANCE.md HELP-US.md HISTORY.md HSTS.md HTTP-COOKIES.md HTTP3.md HTTPSRR.md INFRASTRUCTURE.md INSTALL-CMAKE.md INSTALL.md INTERNALS.md IPFS.md KNOWN_BUGS.md KNOWN_RISKS.md MAIL-ETIQUETTE.md MANUAL.md Makefile.am README.md RELEASE-PROCEDURE.md ROADMAP.md RUSTLS.md SECURITY-ADVISORY.md SPONSORS.md SSL-PROBLEMS.md SSLCERTS.md THANKS THANKS-filter TODO.md TheArtOfHttpScripting.md URL-SYNTAX.md VERIFY.md VERSIONS.md VULN-DISCLOSURE-POLICY.md curl-config.md mk-ca-bundle.md options-in-versions runtests.md testcurl.md wcurl.md
include
curl Makefile.am curl.h curlver.h easy.h header.h mprintf.h multi.h options.h stdcheaders.h system.h typecheck-gcc.h urlapi.h websockets.h
Makefile.am README.md
lib
curlx base64.c base64.h basename.c basename.h dynbuf.c dynbuf.h fopen.c fopen.h inet_ntop.c inet_ntop.h inet_pton.c inet_pton.h multibyte.c multibyte.h nonblock.c nonblock.h snprintf.c snprintf.h strcopy.c strcopy.h strdup.c strdup.h strerr.c strerr.h strparse.c strparse.h timediff.c timediff.h timeval.c timeval.h version_win32.c version_win32.h wait.c wait.h warnless.c warnless.h winapi.c winapi.h
vauth cleartext.c cram.c digest.c digest.h digest_sspi.c gsasl.c krb5_gssapi.c krb5_sspi.c ntlm.c ntlm_sspi.c oauth2.c spnego_gssapi.c spnego_sspi.c vauth.c vauth.h
vquic curl_ngtcp2.c curl_ngtcp2.h curl_quiche.c curl_quiche.h vquic-tls.c vquic-tls.h vquic.c vquic.h vquic_int.h
vssh libssh.c libssh2.c ssh.h vssh.c vssh.h
vtls apple.c apple.h cipher_suite.c cipher_suite.h gtls.c gtls.h hostcheck.c hostcheck.h keylog.c keylog.h mbedtls.c mbedtls.h openssl.c openssl.h rustls.c rustls.h schannel.c schannel.h schannel_int.h schannel_verify.c vtls.c vtls.h vtls_int.h vtls_scache.c vtls_scache.h vtls_spack.c vtls_spack.h wolfssl.c wolfssl.h x509asn1.c x509asn1.h
.gitignore CMakeLists.txt Makefile.am Makefile.inc Makefile.soname altsvc.c altsvc.h amigaos.c amigaos.h arpa_telnet.h asyn-ares.c asyn-base.c asyn-thrdd.c asyn.h bufq.c bufq.h bufref.c bufref.h cf-dns.c cf-dns.h cf-h1-proxy.c cf-h1-proxy.h cf-h2-proxy.c cf-h2-proxy.h cf-haproxy.c cf-haproxy.h cf-https-connect.c cf-https-connect.h cf-ip-happy.c cf-ip-happy.h cf-socket.c cf-socket.h cfilters.c cfilters.h config-mac.h config-os400.h config-riscos.h config-win32.h conncache.c conncache.h connect.c connect.h content_encoding.c content_encoding.h cookie.c cookie.h creds.c creds.h cshutdn.c cshutdn.h curl_addrinfo.c curl_addrinfo.h curl_config-cmake.h.in curl_ctype.h curl_endian.c curl_endian.h curl_fnmatch.c curl_fnmatch.h curl_fopen.c curl_fopen.h curl_get_line.c curl_get_line.h curl_gethostname.c curl_gethostname.h curl_gssapi.c curl_gssapi.h curl_hmac.h curl_ldap.h curl_md4.h curl_md5.h curl_memrchr.c curl_memrchr.h curl_ntlm_core.c curl_ntlm_core.h curl_printf.h curl_range.c curl_range.h curl_sasl.c curl_sasl.h curl_setup.h curl_sha256.h curl_sha512_256.c curl_sha512_256.h curl_share.c curl_share.h curl_sspi.c curl_sspi.h curl_threads.c curl_threads.h curl_trc.c curl_trc.h cw-out.c cw-out.h cw-pause.c cw-pause.h dict.c dict.h dllmain.c dnscache.c dnscache.h doh.c doh.h dynhds.c dynhds.h easy.c easy_lock.h easygetopt.c easyif.h easyoptions.c easyoptions.h escape.c escape.h fake_addrinfo.c fake_addrinfo.h file.c file.h fileinfo.c fileinfo.h formdata.c formdata.h ftp-int.h ftp.c ftp.h ftplistparser.c ftplistparser.h functypes.h getenv.c getinfo.c getinfo.h gopher.c gopher.h hash.c hash.h headers.c headers.h hmac.c hostip.c hostip.h hostip4.c hostip6.c hsts.c hsts.h http.c http.h http1.c http1.h http2.c http2.h http_aws_sigv4.c http_aws_sigv4.h http_chunks.c http_chunks.h http_digest.c http_digest.h http_negotiate.c http_negotiate.h http_ntlm.c http_ntlm.h http_proxy.c http_proxy.h httpsrr.c httpsrr.h idn.c idn.h if2ip.c if2ip.h imap.c imap.h ldap.c libcurl.def libcurl.rc libcurl.vers.in llist.c llist.h macos.c macos.h md4.c md5.c memdebug.c mime.c mime.h mprintf.c mqtt.c mqtt.h multi.c multi_ev.c multi_ev.h multi_ntfy.c multi_ntfy.h multihandle.h multiif.h netrc.c netrc.h noproxy.c noproxy.h openldap.c optiontable.pl parsedate.c parsedate.h peer.c peer.h pingpong.c pingpong.h pop3.c pop3.h progress.c progress.h protocol.c protocol.h psl.c psl.h rand.c rand.h ratelimit.c ratelimit.h request.c request.h rtsp.c rtsp.h select.c select.h sendf.c sendf.h setopt.c setopt.h setup-os400.h setup-vms.h setup-win32.h sha256.c sigpipe.h slist.c slist.h smb.c smb.h smtp.c smtp.h sockaddr.h socketpair.c socketpair.h socks.c socks.h socks_gssapi.c socks_sspi.c splay.c splay.h strcase.c strcase.h strequal.c strerror.c strerror.h system_win32.c system_win32.h telnet.c telnet.h tftp.c tftp.h thrdpool.c thrdpool.h thrdqueue.c thrdqueue.h transfer.c transfer.h uint-bset.c uint-bset.h uint-hash.c uint-hash.h uint-spbset.c uint-spbset.h uint-table.c uint-table.h url.c url.h urlapi-int.h urlapi.c urldata.h version.c ws.c ws.h
m4 .gitignore curl-amissl.m4 curl-apple-sectrust.m4 curl-compilers.m4 curl-confopts.m4 curl-functions.m4 curl-gnutls.m4 curl-mbedtls.m4 curl-openssl.m4 curl-override.m4 curl-reentrant.m4 curl-rustls.m4 curl-schannel.m4 curl-sysconfig.m4 curl-wolfssl.m4 xc-am-iface.m4 xc-cc-check.m4 xc-lt-iface.m4 xc-val-flgs.m4 zz40-xc-ovr.m4 zz50-xc-ovr.m4
projects
OS400
rpg-examples HEADERAPI HTTPPOST INMEMORY SIMPLE1 SIMPLE2 SMTPSRCMBR
.checksrc README.OS400 ccsidcurl.c ccsidcurl.h config400.default curl.cmd curl.inc.in curlcl.c curlmain.c initscript.sh make-docs.sh make-include.sh make-lib.sh make-src.sh make-tests.sh makefile.sh os400sys.c os400sys.h
Windows
tmpl .gitattributes README.txt curl-all.sln curl.sln curl.vcxproj curl.vcxproj.filters libcurl.sln libcurl.vcxproj libcurl.vcxproj.filters
.gitignore README.md generate.bat
vms Makefile.am backup_gnv_curl_src.com build_curl-config_script.com build_gnv_curl.com build_gnv_curl_pcsi_desc.com build_gnv_curl_pcsi_text.com build_gnv_curl_release_notes.com build_libcurl_pc.com build_vms.com clean_gnv_curl.com compare_curl_source.com config_h.com curl_crtl_init.c curl_gnv_build_steps.txt curl_release_note_start.txt curl_startup.com curlmsg.h curlmsg.msg curlmsg.sdl curlmsg_vms.h generate_config_vms_h_curl.com generate_vax_transfer.com gnv_conftest.c_first gnv_curl_configure.sh gnv_libcurl_symbols.opt gnv_link_curl.com macro32_exactcase.patch make_gnv_curl_install.sh make_pcsi_curl_kit_name.com pcsi_gnv_curl_file_list.txt pcsi_product_gnv_curl.com readme report_openssl_version.c setup_gnv_curl_build.com stage_curl_install.com vms_eco_level.h
Makefile.am README.md
scripts .checksrc CMakeLists.txt Makefile.am badwords badwords-all badwords.txt cd2cd cd2nroff cdall checksrc-all.pl checksrc.pl cmakelint.sh completion.pl contributors.sh contrithanks.sh coverage.sh delta dmaketgz extract-unit-protos firefox-db2pem.sh installcheck.sh maketgz managen mdlinkcheck mk-ca-bundle.pl mk-unity.pl nroff2cd perlcheck.sh pythonlint.sh randdisable release-notes.pl release-tools.sh schemetable.c singleuse.pl spacecheck.pl top-complexity top-length verify-release wcurl
src
toolx tool_time.c tool_time.h
.checksrc .gitignore CMakeLists.txt Makefile.am Makefile.inc config2setopts.c config2setopts.h curl.rc curlinfo.c mk-file-embed.pl mkhelp.pl slist_wc.c slist_wc.h terminal.c terminal.h tool_cb_dbg.c tool_cb_dbg.h tool_cb_hdr.c tool_cb_hdr.h tool_cb_prg.c tool_cb_prg.h tool_cb_rea.c tool_cb_rea.h tool_cb_see.c tool_cb_see.h tool_cb_soc.c tool_cb_soc.h tool_cb_wrt.c tool_cb_wrt.h tool_cfgable.c tool_cfgable.h tool_dirhie.c tool_dirhie.h tool_doswin.c tool_doswin.h tool_easysrc.c tool_easysrc.h tool_filetime.c tool_filetime.h tool_findfile.c tool_findfile.h tool_formparse.c tool_formparse.h tool_getparam.c tool_getparam.h tool_getpass.c tool_getpass.h tool_help.c tool_help.h tool_helpers.c tool_helpers.h tool_hugehelp.h tool_ipfs.c tool_ipfs.h tool_libinfo.c tool_libinfo.h tool_listhelp.c tool_main.c tool_main.h tool_msgs.c tool_msgs.h tool_operate.c tool_operate.h tool_operhlp.c tool_operhlp.h tool_paramhlp.c tool_paramhlp.h tool_parsecfg.c tool_parsecfg.h tool_progress.c tool_progress.h tool_sdecls.h tool_setopt.c tool_setopt.h tool_setup.h tool_ssls.c tool_ssls.h tool_stderr.c tool_stderr.h tool_urlglob.c tool_urlglob.h tool_util.c tool_util.h tool_version.h tool_vms.c tool_vms.h tool_writeout.c tool_writeout.h tool_writeout_json.c tool_writeout_json.h tool_xattr.c tool_xattr.h var.c var.h
tests
certs .gitignore CMakeLists.txt Makefile.am Makefile.inc genserv.pl srp-verifier-conf srp-verifier-db test-ca.cnf test-ca.prm test-client-cert.prm test-client-eku-only.prm test-localhost-san-first.prm test-localhost-san-last.prm test-localhost.nn.prm test-localhost.prm test-localhost0h.prm
cmake CMakeLists.txt test.c test.cpp test.sh
data .gitignore DISABLED Makefile.am data-xml1 data1400.c data1401.c data1402.c data1403.c data1404.c data1405.c data1406.c data1407.c data1420.c data1461.txt data1463.txt data1465.c data1481.c data1705-1.md data1705-2.md data1705-3.md data1705-4.md data1705-stdout.1 data1706-1.md data1706-2.md data1706-3.md data1706-4.md data1706-stdout.txt data320.html test1 test10 test100 test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 test1008 test1009 test101 test1010 test1011 test1012 test1013 test1014 test1015 test1016 test1017 test1018 test1019 test102 test1020 test1021 test1022 test1023 test1024 test1025 test1026 test1027 test1028 test1029 test103 test1030 test1031 test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 test104 test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 test1048 test1049 test105 test1050 test1051 test1052 test1053 test1054 test1055 test1056 test1057 test1058 test1059 test106 test1060 test1061 test1062 test1063 test1064 test1065 test1066 test1067 test1068 test1069 test107 test1070 test1071 test1072 test1073 test1074 test1075 test1076 test1077 test1078 test1079 test108 test1080 test1081 test1082 test1083 test1084 test1085 test1086 test1087 test1088 test1089 test109 test1090 test1091 test1092 test1093 test1094 test1095 test1096 test1097 test1098 test1099 test11 test110 test1100 test1101 test1102 test1103 test1104 test1105 test1106 test1107 test1108 test1109 test111 test1110 test1111 test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 test112 test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 test1128 test1129 test113 test1130 test1131 test1132 test1133 test1134 test1135 test1136 test1137 test1138 test1139 test114 test1140 test1141 test1142 test1143 test1144 test1145 test1146 test1147 test1148 test1149 test115 test1150 test1151 test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 test116 test1160 test1161 test1162 test1163 test1164 test1165 test1166 test1167 test1168 test1169 test117 test1170 test1171 test1172 test1173 test1174 test1175 test1176 test1177 test1178 test1179 test118 test1180 test1181 test1182 test1183 test1184 test1185 test1186 test1187 test1188 test1189 test119 test1190 test1191 test1192 test1193 test1194 test1195 test1196 test1197 test1198 test1199 test12 test120 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 test1208 test1209 test121 test1210 test1211 test1212 test1213 test1214 test1215 test1216 test1217 test1218 test1219 test122 test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 test1228 test1229 test123 test1230 test1231 test1232 test1233 test1234 test1235 test1236 test1237 test1238 test1239 test124 test1240 test1241 test1242 test1243 test1244 test1245 test1246 test1247 test1248 test1249 test125 test1250 test1251 test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 test126 test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 test1268 test1269 test127 test1270 test1271 test1272 test1273 test1274 test1275 test1276 test1277 test1278 test1279 test128 test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 test1288 test1289 test129 test1290 test1291 test1292 test1293 test1294 test1295 test1296 test1297 test1298 test1299 test13 test130 test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 test1308 test1309 test131 test1310 test1311 test1312 test1313 test1314 test1315 test1316 test1317 test1318 test1319 test132 test1320 test1321 test1322 test1323 test1324 test1325 test1326 test1327 test1328 test1329 test133 test1330 test1331 test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 test134 test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 test1348 test1349 test135 test1350 test1351 test1352 test1353 test1354 test1355 test1356 test1357 test1358 test1359 test136 test1360 test1361 test1362 test1363 test1364 test1365 test1366 test1367 test1368 test1369 test137 test1370 test1371 test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 test138 test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 test1388 test1389 test139 test1390 test1391 test1392 test1393 test1394 test1395 test1396 test1397 test1398 test1399 test14 test140 test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 test1408 test1409 test141 test1410 test1411 test1412 test1413 test1414 test1415 test1416 test1417 test1418 test1419 test142 test1420 test1421 test1422 test1423 test1424 test1425 test1426 test1427 test1428 test1429 test143 test1430 test1431 test1432 test1433 test1434 test1435 test1436 test1437 test1438 test1439 test144 test1440 test1441 test1442 test1443 test1444 test1445 test1446 test1447 test1448 test1449 test145 test1450 test1451 test1452 test1453 test1454 test1455 test1456 test1457 test1458 test1459 test146 test1460 test1461 test1462 test1463 test1464 test1465 test1466 test1467 test1468 test1469 test147 test1470 test1471 test1472 test1473 test1474 test1475 test1476 test1477 test1478 test1479 test148 test1480 test1481 test1482 test1483 test1484 test1485 test1486 test1487 test1488 test1489 test149 test1490 test1491 test1492 test1493 test1494 test1495 test1496 test1497 test1498 test1499 test15 test150 test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 test1508 test1509 test151 test1510 test1511 test1512 test1513 test1514 test1515 test1516 test1517 test1518 test1519 test152 test1520 test1521 test1522 test1523 test1524 test1525 test1526 test1527 test1528 test1529 test153 test1530 test1531 test1532 test1533 test1534 test1535 test1536 test1537 test1538 test1539 test154 test1540 test1541 test1542 test1543 test1544 test1545 test1546 test1547 test1548 test1549 test155 test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 test1558 test1559 test156 test1560 test1561 test1562 test1563 test1564 test1565 test1566 test1567 test1568 test1569 test157 test1570 test1571 test1572 test1573 test1574 test1575 test1576 test1577 test1578 test1579 test158 test1580 test1581 test1582 test1583 test1584 test1585 test1586 test1587 test1588 test1589 test159 test1590 test1591 test1592 test1593 test1594 test1595 test1596 test1597 test1598 test1599 test16 test160 test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 test1608 test1609 test161 test1610 test1611 test1612 test1613 test1614 test1615 test1616 test1617 test1618 test1619 test162 test1620 test1621 test1622 test1623 test1624 test1625 test1626 test1627 test1628 test1629 test163 test1630 test1631 test1632 test1633 test1634 test1635 test1636 test1637 test1638 test1639 test164 test1640 test1641 test1642 test1643 test1644 test1645 test165 test1650 test1651 test1652 test1653 test1654 test1655 test1656 test1657 test1658 test1659 test166 test1660 test1661 test1662 test1663 test1664 test1665 test1666 test1667 test1668 test1669 test167 test1670 test1671 test1672 test1673 test1674 test1675 test1676 test168 test1680 test1681 test1682 test1683 test1684 test1685 test169 test17 test170 test1700 test1701 test1702 test1703 test1704 test1705 test1706 test1707 test1708 test1709 test171 test1710 test1711 test1712 test1713 test1714 test1715 test172 test1720 test1721 test173 test174 test175 test176 test177 test178 test179 test18 test180 test1800 test1801 test1802 test181 test182 test183 test184 test1847 test1848 test1849 test185 test1850 test1851 test186 test187 test188 test189 test19 test190 test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 test1908 test1909 test191 test1910 test1911 test1912 test1913 test1914 test1915 test1916 test1917 test1918 test1919 test192 test1920 test1921 test193 test1933 test1934 test1935 test1936 test1937 test1938 test1939 test194 test1940 test1941 test1942 test1943 test1944 test1945 test1946 test1947 test1948 test195 test1955 test1956 test1957 test1958 test1959 test196 test1960 test1964 test1965 test1966 test197 test1970 test1971 test1972 test1973 test1974 test1975 test1976 test1977 test1978 test1979 test198 test1980 test1981 test1982 test1983 test1984 test199 test2 test20 test200 test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 test2008 test2009 test201 test2010 test2011 test2012 test2013 test2014 test202 test2023 test2024 test2025 test2026 test2027 test2028 test2029 test203 test2030 test2031 test2032 test2033 test2034 test2035 test2037 test2038 test2039 test204 test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 test2048 test2049 test205 test2050 test2051 test2052 test2053 test2054 test2055 test2056 test2057 test2058 test2059 test206 test2060 test2061 test2062 test2063 test2064 test2065 test2066 test2067 test2068 test2069 test207 test2070 test2071 test2072 test2073 test2074 test2075 test2076 test2077 test2078 test2079 test208 test2080 test2081 test2082 test2083 test2084 test2085 test2086 test2087 test2088 test2089 test209 test2090 test2091 test2092 test21 test210 test2100 test2101 test2102 test2103 test2104 test211 test212 test213 test214 test215 test216 test217 test218 test219 test22 test220 test2200 test2201 test2202 test2203 test2204 test2205 test2206 test2207 test221 test222 test223 test224 test225 test226 test227 test228 test229 test23 test230 test2300 test2301 test2302 test2303 test2304 test2306 test2307 test2308 test2309 test231 test232 test233 test234 test235 test236 test237 test238 test239 test24 test240 test2400 test2401 test2402 test2403 test2404 test2405 test2406 test2407 test2408 test2409 test241 test2410 test2411 test242 test243 test244 test245 test246 test247 test248 test249 test25 test250 test2500 test2501 test2502 test2503 test2504 test2505 test2506 test251 test252 test253 test254 test255 test256 test257 test258 test259 test26 test260 test2600 test2601 test2602 test2603 test2604 test2605 test261 test262 test263 test264 test265 test266 test267 test268 test269 test27 test270 test2700 test2701 test2702 test2703 test2704 test2705 test2706 test2707 test2708 test2709 test271 test2710 test2711 test2712 test2713 test2714 test2715 test2716 test2717 test2718 test2719 test272 test2720 test2721 test2722 test2723 test273 test274 test275 test276 test277 test278 test279 test28 test280 test281 test282 test283 test284 test285 test286 test287 test288 test289 test29 test290 test291 test292 test293 test294 test295 test296 test297 test298 test299 test3 test30 test300 test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 test3008 test3009 test301 test3010 test3011 test3012 test3013 test3014 test3015 test3016 test3017 test3018 test3019 test302 test3020 test3021 test3022 test3023 test3024 test3025 test3026 test3027 test3028 test3029 test303 test3030 test3031 test3032 test3033 test3034 test3035 test3036 test304 test305 test306 test307 test308 test309 test31 test310 test3100 test3101 test3102 test3103 test3104 test3105 test3106 test311 test312 test313 test314 test315 test316 test317 test318 test319 test32 test320 test3200 test3201 test3202 test3203 test3204 test3205 test3206 test3207 test3208 test3209 test321 test3210 test3211 test3212 test3213 test3214 test3215 test3216 test3217 test3218 test3219 test322 test3220 test323 test324 test325 test326 test327 test328 test329 test33 test330 test3300 test3301 test3302 test331 test332 test333 test334 test335 test336 test337 test338 test339 test34 test340 test341 test342 test343 test344 test345 test346 test347 test348 test349 test35 test350 test351 test352 test353 test354 test355 test356 test357 test358 test359 test36 test360 test361 test362 test363 test364 test365 test366 test367 test368 test369 test37 test370 test371 test372 test373 test374 test375 test376 test378 test379 test38 test380 test381 test383 test384 test385 test386 test387 test388 test389 test39 test390 test391 test392 test393 test394 test395 test396 test397 test398 test399 test4 test40 test400 test4000 test4001 test401 test402 test403 test404 test405 test406 test407 test408 test409 test41 test410 test411 test412 test413 test414 test415 test416 test417 test418 test419 test42 test420 test421 test422 test423 test424 test425 test426 test427 test428 test429 test43 test430 test431 test432 test433 test434 test435 test436 test437 test438 test439 test44 test440 test441 test442 test443 test444 test445 test446 test447 test448 test449 test45 test450 test451 test452 test453 test454 test455 test456 test457 test458 test459 test46 test460 test461 test462 test463 test467 test468 test469 test47 test470 test471 test472 test473 test474 test475 test476 test477 test478 test479 test48 test480 test481 test482 test483 test484 test485 test486 test487 test488 test489 test49 test490 test491 test492 test493 test494 test495 test496 test497 test498 test499 test5 test50 test500 test501 test502 test503 test504 test505 test506 test507 test508 test509 test51 test510 test511 test512 test513 test514 test515 test516 test517 test518 test519 test52 test520 test521 test522 test523 test524 test525 test526 test527 test528 test529 test53 test530 test531 test532 test533 test534 test535 test536 test537 test538 test539 test54 test540 test541 test542 test543 test544 test545 test546 test547 test548 test549 test55 test550 test551 test552 test553 test554 test555 test556 test557 test558 test559 test56 test560 test561 test562 test563 test564 test565 test566 test567 test568 test569 test57 test570 test571 test572 test573 test574 test575 test576 test577 test578 test579 test58 test580 test581 test582 test583 test584 test585 test586 test587 test588 test589 test59 test590 test591 test592 test593 test594 test595 test596 test597 test598 test599 test6 test60 test600 test601 test602 test603 test604 test605 test606 test607 test608 test609 test61 test610 test611 test612 test613 test614 test615 test616 test617 test618 test619 test62 test620 test621 test622 test623 test624 test625 test626 test627 test628 test629 test63 test630 test631 test632 test633 test634 test635 test636 test637 test638 test639 test64 test640 test641 test642 test643 test644 test645 test646 test647 test648 test649 test65 test650 test651 test652 test653 test654 test655 test656 test658 test659 test66 test660 test661 test662 test663 test664 test665 test666 test667 test668 test669 test67 test670 test671 test672 test673 test674 test675 test676 test677 test678 test679 test68 test680 test681 test682 test683 test684 test685 test686 test687 test688 test689 test69 test690 test691 test692 test693 test694 test695 test696 test697 test698 test699 test7 test70 test700 test701 test702 test703 test704 test705 test706 test707 test708 test709 test71 test710 test711 test712 test713 test714 test715 test716 test717 test718 test719 test72 test720 test721 test722 test723 test724 test725 test726 test727 test728 test729 test73 test730 test731 test732 test733 test734 test735 test736 test737 test738 test739 test74 test740 test741 test742 test743 test744 test745 test746 test747 test748 test749 test75 test750 test751 test752 test753 test754 test755 test756 test757 test758 test759 test76 test760 test761 test762 test763 test764 test765 test766 test767 test768 test769 test77 test770 test771 test772 test773 test774 test775 test776 test777 test778 test779 test78 test780 test781 test782 test783 test784 test785 test786 test787 test788 test789 test79 test790 test791 test792 test793 test794 test795 test796 test797 test798 test799 test8 test80 test800 test801 test802 test803 test804 test805 test806 test807 test808 test809 test81 test810 test811 test812 test813 test814 test815 test816 test817 test818 test819 test82 test820 test821 test822 test823 test824 test825 test826 test827 test828 test829 test83 test830 test831 test832 test833 test834 test835 test836 test837 test838 test839 test84 test840 test841 test842 test843 test844 test845 test846 test847 test848 test849 test85 test850 test851 test852 test853 test854 test855 test856 test857 test858 test859 test86 test860 test861 test862 test863 test864 test865 test866 test867 test868 test869 test87 test870 test871 test872 test873 test874 test875 test876 test877 test878 test879 test88 test880 test881 test882 test883 test884 test885 test886 test887 test888 test889 test89 test890 test891 test892 test893 test894 test895 test896 test897 test898 test899 test9 test90 test900 test901 test902 test903 test904 test905 test906 test907 test908 test909 test91 test910 test911 test912 test913 test914 test915 test916 test917 test918 test919 test92 test920 test921 test922 test923 test924 test925 test926 test927 test928 test929 test93 test930 test931 test932 test933 test934 test935 test936 test937 test938 test939 test94 test940 test941 test942 test943 test944 test945 test946 test947 test948 test949 test95 test950 test951 test952 test953 test954 test955 test956 test957 test958 test959 test96 test960 test961 test962 test963 test964 test965 test966 test967 test968 test969 test97 test970 test971 test972 test973 test974 test975 test976 test977 test978 test979 test98 test980 test981 test982 test983 test984 test985 test986 test987 test988 test989 test99 test990 test991 test992 test993 test994 test995 test996 test997 test998 test999
http
testenv
mod_curltest .gitignore mod_curltest.c
__init__.py caddy.py certs.py client.py curl.py dante.py dnsd.py env.py httpd.py nghttpx.py ports.py sshd.py vsftpd.py ws_echo_server.py
.gitignore CMakeLists.txt Makefile.am config.ini.in conftest.py requirements.txt scorecard.py test_01_basic.py test_02_download.py test_03_goaway.py test_04_stuttered.py test_05_errors.py test_06_eyeballs.py test_07_upload.py test_08_caddy.py test_09_push.py test_10_proxy.py test_11_unix.py test_12_reuse.py test_13_proxy_auth.py test_14_auth.py test_15_tracing.py test_16_info.py test_17_ssl_use.py test_18_methods.py test_19_shutdown.py test_20_websockets.py test_21_resolve.py test_22_httpsrr.py test_30_vsftpd.py test_31_vsftpds.py test_32_ftps_vsftpd.py test_40_socks.py test_50_scp.py test_51_sftp.py
libtest .gitignore CMakeLists.txt Makefile.am Makefile.inc cli_ftp_upload.c cli_h2_pausing.c cli_h2_serverpush.c cli_h2_upgrade_extreme.c cli_hx_download.c cli_hx_upload.c cli_tls_session_reuse.c cli_upload_pausing.c cli_ws_data.c cli_ws_pingpong.c first.c first.h lib1156.c lib1301.c lib1308.c lib1485.c lib1500.c lib1501.c lib1502.c lib1506.c lib1507.c lib1508.c lib1509.c lib1510.c lib1511.c lib1512.c lib1513.c lib1514.c lib1515.c lib1517.c lib1518.c lib1520.c lib1522.c lib1523.c lib1525.c lib1526.c lib1527.c lib1528.c lib1529.c lib1530.c lib1531.c lib1532.c lib1533.c lib1534.c lib1535.c lib1536.c lib1537.c lib1538.c lib1540.c lib1541.c lib1542.c lib1545.c lib1549.c lib1550.c lib1551.c lib1552.c lib1553.c lib1554.c lib1555.c lib1556.c lib1557.c lib1558.c lib1559.c lib1560.c lib1564.c lib1565.c lib1567.c lib1568.c lib1569.c lib1571.c lib1576.c lib1582.c lib1587.c lib1588.c lib1589.c lib1591.c lib1592.c lib1593.c lib1594.c lib1597.c lib1598.c lib1599.c lib1662.c lib1900.c lib1901.c lib1902.c lib1903.c lib1905.c lib1906.c lib1907.c lib1908.c lib1910.c lib1911.c lib1912.c lib1913.c lib1915.c lib1916.c lib1918.c lib1919.c lib1920.c lib1921.c lib1933.c lib1934.c lib1935.c lib1936.c lib1937.c lib1938.c lib1939.c lib1940.c lib1945.c lib1947.c lib1948.c lib1955.c lib1956.c lib1957.c lib1958.c lib1959.c lib1960.c lib1964.c lib1965.c lib1970.c lib1971.c lib1972.c lib1973.c lib1974.c lib1975.c lib1977.c lib1978.c lib2023.c lib2032.c lib2082.c lib2301.c lib2302.c lib2304.c lib2306.c lib2308.c lib2309.c lib2402.c lib2404.c lib2405.c lib2502.c lib2504.c lib2505.c lib2506.c lib2700.c lib3010.c lib3025.c lib3026.c lib3027.c lib3033.c lib3034.c lib3100.c lib3101.c lib3102.c lib3103.c lib3104.c lib3105.c lib3207.c lib3208.c lib500.c lib501.c lib502.c lib503.c lib504.c lib505.c lib506.c lib507.c lib508.c lib509.c lib510.c lib511.c lib512.c lib513.c lib514.c lib515.c lib516.c lib517.c lib518.c lib519.c lib520.c lib521.c lib523.c lib524.c lib525.c lib526.c lib530.c lib533.c lib536.c lib537.c lib539.c lib540.c lib541.c lib542.c lib543.c lib544.c lib547.c lib549.c lib552.c lib553.c lib554.c lib555.c lib556.c lib557.c lib558.c lib559.c lib560.c lib562.c lib564.c lib566.c lib567.c lib568.c lib569.c lib570.c lib571.c lib572.c lib573.c lib574.c lib575.c lib576.c lib578.c lib579.c lib582.c lib583.c lib586.c lib589.c lib590.c lib591.c lib597.c lib598.c lib599.c lib643.c lib650.c lib651.c lib652.c lib653.c lib654.c lib655.c lib658.c lib659.c lib661.c lib666.c lib667.c lib668.c lib670.c lib674.c lib676.c lib677.c lib678.c lib694.c lib695.c lib751.c lib753.c lib757.c lib758.c lib766.c memptr.c mk-lib1521.pl test1013.pl test1022.pl test307.pl test610.pl test613.pl testtrace.c testtrace.h testutil.c testutil.h unitcheck.h
server .checksrc .gitignore CMakeLists.txt Makefile.am Makefile.inc dnsd.c first.c first.h getpart.c mqttd.c resolve.c rtspd.c sockfilt.c socksd.c sws.c tftpd.c util.c
tunit .gitignore CMakeLists.txt Makefile.am Makefile.inc README.md tool1394.c tool1604.c tool1621.c tool1622.c tool1623.c tool1720.c
unit .gitignore CMakeLists.txt Makefile.am Makefile.inc README.md unit1300.c unit1302.c unit1303.c unit1304.c unit1305.c unit1307.c unit1309.c unit1323.c unit1330.c unit1395.c unit1396.c unit1397.c unit1398.c unit1399.c unit1600.c unit1601.c unit1602.c unit1603.c unit1605.c unit1606.c unit1607.c unit1608.c unit1609.c unit1610.c unit1611.c unit1612.c unit1614.c unit1615.c unit1616.c unit1620.c unit1625.c unit1626.c unit1627.c unit1636.c unit1650.c unit1651.c unit1652.c unit1653.c unit1654.c unit1655.c unit1656.c unit1657.c unit1658.c unit1660.c unit1661.c unit1663.c unit1664.c unit1666.c unit1667.c unit1668.c unit1669.c unit1674.c unit1675.c unit1676.c unit1979.c unit1980.c unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c unit2605.c unit3200.c unit3205.c unit3211.c unit3212.c unit3213.c unit3214.c unit3216.c unit3219.c unit3300.c unit3301.c unit3302.c
.gitignore CMakeLists.txt Makefile.am allversions.pm appveyor.pm azure.pm config.in configurehelp.pm.in devtest.pl dictserver.py directories.pm ech_combos.py ech_tests.sh ftpserver.pl getpart.pm globalconfig.pm http-server.pl http2-server.pl http3-server.pl memanalyze.pl memanalyzer.pm negtelnetserver.py nghttpx.conf pathhelp.pm processhelp.pm requirements.txt rtspserver.pl runner.pm runtests.pl secureserver.pl serverhelp.pm servers.pm smbserver.py sshhelp.pm sshserver.pl test1119.pl test1135.pl test1139.pl test1140.pl test1165.pl test1167.pl test1173.pl test1175.pl test1177.pl test1222.pl test1275.pl test1276.pl test1477.pl test1486.pl test1488.pl test1544.pl test1707.pl test745.pl test971.pl testcurl.pl testutil.pm tftpserver.pl util.py valgrind.pm valgrind.supp
.clang-tidy.yml .dir-locals.el .editorconfig .git-blame-ignore-revs .gitattributes .gitignore .mailmap CHANGES.md CMakeLists.txt COPYING Dockerfile GIT-INFO.md Makefile.am README README.md RELEASE-NOTES REUSE.toml SECURITY.md acinclude.m4 appveyor.sh appveyor.yml configure.ac curl-config.in libcurl.pc.in renovate.json
examples .env config.ini crypto_test.lua env_test.lua fs_example.lua http_server.lua https_test.lua ini_example.lua json.lua log.lua path_fs_example.lua process_example.lua request_download.lua request_test.lua run_all.lua sqlite_example.lua sqlite_http_template.lua stash_test.lua template_test.lua timer.lua websocket.lua
iniparser
.github
ISSUE_TEMPLATE config.yml
workflows disable-pull-requests.yml trigger-gitlab-ci.yml
cmake JoinPaths.cmake config.cmake.in pc.in
example iniexample.c iniwrite.c parse.c twisted-errors.ini twisted-genhuge.py twisted-ofkey.ini twisted-ofval.ini twisted.ini
src dictionary.c dictionary.h iniparser.c iniparser.h
test
ressources
bad_ini ends_well.ini twisted-errors.ini twisted-ofkey.ini twisted-ofval.ini
good_ini empty.ini spaced.ini spaced2.ini twisted.ini
gruezi.ini old.ini quotes.ini utf8.ini
CMakeLists.txt test_dictionary.c test_iniparser.c unity-config.yml unity_config.h
.cmake-format.py .gitignore .gitlab-ci.yml .gitmessage .travis.yml AUTHORS CMakeLists.txt FAQ-en.md FAQ-zhcn.md INSTALL LICENSE README.md compile_commands.json
jinjac
example CMakeLists.txt example.c
jinjac_test_app CMakeLists.txt jinjac_test_app.c
libjinjac
include jinjac.h
src CMakeLists.txt ast.c ast.h block_statement.c block_statement.h buffer.c buffer.h buildin.c buildin.h common.h convert.c convert.h flex_decl.h jfunction.c jfunction.h jinja_expression.l jinja_expression.y jinjac_parse.c jinjac_parse.h jinjac_stream.c jinjac_stream.h jlist.c jlist.h jobject.c jobject.h parameter.c parameter.h str_obj.c str_obj.h trace.c trace.h
CMakeLists.txt
test .gitignore CMakeLists.txt autotest.rb test_01.expected test_01.jinja test_01b.expected test_01b.jinja test_01c.expected test_01c.jinja test_01d.expected test_01d.jinja test_02.expected test_02.jinja test_03.expected test_03.jinja test_04.expected test_04.jinja test_05.expected test_05.jinja test_06.expected test_06.jinja test_07.expected test_07.jinja test_08.expected test_08.jinja test_08b.expected test_08b.jinja test_09.expected test_09.jinja test_10.expected test_10.jinja test_11.expected test_11.jinja test_12.expected test_12.jinja test_13.expected test_13.jinja test_14.expected test_14.jinja test_15.expected test_15.jinja test_16.expected test_16.jinja test_17.expected test_17.jinja test_18.expected test_18.jinja test_18b.expected test_18b.jinja test_18c.expected test_18c.jinja test_19.expected test_19.jinja test_19b.expected test_19b.jinja test_19c.expected test_19c.jinja test_19d.expected test_19d.jinja test_19e.expected test_19e.jinja test_19f.expected test_19f.jinja test_20.expected test_20.jinja test_21.expected test_21.jinja test_22.expected test_22.jinja test_22a.expected test_22a.jinja test_22b.expected test_22b.jinja test_23.expected test_23.jinja test_24.expected test_24.jinja
.gitignore CMakeLists.txt LICENSE.txt README.md build_coverage.sh build_debug.sh build_release.sh cppcheck_analysis.sh
libev Changes LICENSE Makefile Makefile.am Makefile.in README Symbols.ev Symbols.event aclocal.m4 autogen.sh compile config.guess config.h config.h.in config.status config.sub configure configure.ac depcomp ev++.h ev.3 ev.c ev.h ev.pod ev_epoll.c ev_kqueue.c ev_poll.c ev_port.c ev_select.c ev_vars.h ev_win32.c ev_wrap.h event.c event.h install-sh libev.m4 libtool ltmain.sh missing mkinstalldirs stamp-h1
luajit
doc
img contact.png
bluequad-print.css bluequad.css contact.html ext_buffer.html ext_c_api.html ext_ffi.html ext_ffi_api.html ext_ffi_semantics.html ext_ffi_tutorial.html ext_jit.html ext_profiler.html extensions.html install.html luajit.html running.html
dynasm dasm_arm.h dasm_arm.lua dasm_arm64.h dasm_arm64.lua dasm_mips.h dasm_mips.lua dasm_mips64.lua dasm_ppc.h dasm_ppc.lua dasm_proto.h dasm_x64.lua dasm_x86.h dasm_x86.lua dynasm.lua
etc luajit.1 luajit.pc
src
host .gitignore README buildvm.c buildvm.h buildvm_asm.c buildvm_fold.c buildvm_lib.c buildvm_libbc.h buildvm_peobj.c genlibbc.lua genminilua.lua genversion.lua minilua.c
jit .gitignore bc.lua bcsave.lua dis_arm.lua dis_arm64.lua dis_arm64be.lua dis_mips.lua dis_mips64.lua dis_mips64el.lua dis_mips64r6.lua dis_mips64r6el.lua dis_mipsel.lua dis_ppc.lua dis_x64.lua dis_x86.lua dump.lua p.lua v.lua zone.lua
.gitignore Makefile Makefile.dep lauxlib.h lib_aux.c lib_base.c lib_bit.c lib_buffer.c lib_debug.c lib_ffi.c lib_init.c lib_io.c lib_jit.c lib_math.c lib_os.c lib_package.c lib_string.c lib_table.c lj_alloc.c lj_alloc.h lj_api.c lj_arch.h lj_asm.c lj_asm.h lj_asm_arm.h lj_asm_arm64.h lj_asm_mips.h lj_asm_ppc.h lj_asm_x86.h lj_assert.c lj_bc.c lj_bc.h lj_bcdump.h lj_bcread.c lj_bcwrite.c lj_buf.c lj_buf.h lj_carith.c lj_carith.h lj_ccall.c lj_ccall.h lj_ccallback.c lj_ccallback.h lj_cconv.c lj_cconv.h lj_cdata.c lj_cdata.h lj_char.c lj_char.h lj_clib.c lj_clib.h lj_cparse.c lj_cparse.h lj_crecord.c lj_crecord.h lj_ctype.c lj_ctype.h lj_debug.c lj_debug.h lj_def.h lj_dispatch.c lj_dispatch.h lj_emit_arm.h lj_emit_arm64.h lj_emit_mips.h lj_emit_ppc.h lj_emit_x86.h lj_err.c lj_err.h lj_errmsg.h lj_ff.h lj_ffrecord.c lj_ffrecord.h lj_frame.h lj_func.c lj_func.h lj_gc.c lj_gc.h lj_gdbjit.c lj_gdbjit.h lj_ir.c lj_ir.h lj_ircall.h lj_iropt.h lj_jit.h lj_lex.c lj_lex.h lj_lib.c lj_lib.h lj_load.c lj_mcode.c lj_mcode.h lj_meta.c lj_meta.h lj_obj.c lj_obj.h lj_opt_dce.c lj_opt_fold.c lj_opt_loop.c lj_opt_mem.c lj_opt_narrow.c lj_opt_sink.c lj_opt_split.c lj_parse.c lj_parse.h lj_prng.c lj_prng.h lj_profile.c lj_profile.h lj_record.c lj_record.h lj_serialize.c lj_serialize.h lj_snap.c lj_snap.h lj_state.c lj_state.h lj_str.c lj_str.h lj_strfmt.c lj_strfmt.h lj_strfmt_num.c lj_strscan.c lj_strscan.h lj_tab.c lj_tab.h lj_target.h lj_target_arm.h lj_target_arm64.h lj_target_mips.h lj_target_ppc.h lj_target_x86.h lj_trace.c lj_trace.h lj_traceerr.h lj_udata.c lj_udata.h lj_vm.h lj_vmevent.c lj_vmevent.h lj_vmmath.c ljamalg.c lua.h lua.hpp luaconf.h luajit.c luajit_rolling.h lualib.h msvcbuild.bat nxbuild.bat ps4build.bat ps5build.bat psvitabuild.bat vm_arm.dasc vm_arm64.dasc vm_mips.dasc vm_mips64.dasc vm_ppc.dasc vm_x64.dasc vm_x86.dasc xb1build.bat xedkbuild.bat
.gitattributes .gitignore .relver COPYRIGHT Makefile README
sqlite shell.c sqlite3.c sqlite3.h sqlite3ext.h
wolfssl
.github
ISSUE_TEMPLATE bug_report.yaml other.yaml
actions
install-apt-deps action.yml
scripts
zephyr-4.x external_libc.conf zephyr-test.sh
openssl-ech.sh tls-anvil-test.sh
workflows
disabled haproxy.yml hitch.yml hostap.yml
hostap-files
configs
07c9f183ea744ac04585fb6dd10220c75a5e2e74 hostapd.config tests wpa_supplicant.config
b607d2723e927a3446d89aed813f1aa6068186bb hostapd.config tests wpa_supplicant.config
hostap_2_10 extra.patch hostapd.config tests wpa_supplicant.config
Makefile README dbus-wpa_supplicant.conf
ada.yml arduino.yml async-examples.yml async.yml atecc608-sim.yml bind.yml cmake-autoconf.yml cmake.yml codespell.yml coverity-scan-fixes.yml cryptocb-only.yml curl.yml cyrus-sasl.yml disable-pk-algs.yml docker-Espressif.yml docker-OpenWrt.yml emnet-nonblock.yml fil-c.yml freertos-mem-track.yml gencertbuf.yml grpc.yml haproxy.yml hostap-vm.yml intelasm-c-fallback.yml ipmitool.yml jwt-cpp.yml krb5.yml libspdm.yml libssh2.yml libvncserver.yml linuxkm.yml macos-apple-native-cert-validation.yml mbedtls.sh mbedtls.yml membrowse-comment.yml membrowse-onboard.yml membrowse-report.yml memcached.sh memcached.yml mono.yml mosquitto.yml msmtp.yml msys2.yml multi-arch.yml multi-compiler.yml net-snmp.yml nginx.yml no-malloc.yml no-tls.yml nss.sh nss.yml ntp.yml ocsp.yml openldap.yml openssh.yml openssl-ech.yml opensslcoexist.yml openvpn.yml os-check.yml packaging.yml pam-ipmi.yml pq-all.yml pr-commit-check.yml psk.yml puf.yml python.yml rng-tools.yml rust-wrapper.yml se050-sim.yml smallStackSize.yml socat.yml softhsm.yml sssd.yml stm32-sim.yml stsafe-a120-sim.yml stunnel.yml symbol-prefixes.yml threadx.yml tls-anvil.yml trackmemory.yml watcomc.yml win-csharp-test.yml wolfCrypt-Wconversion.yml wolfboot-integration.yml wolfsm.yml xcode.yml zephyr-4.x.yml zephyr.yml
PULL_REQUEST_TEMPLATE.md SECURITY.md membrowse-targets.json
Docker
OpenWrt Dockerfile README.md runTests.sh
packaging
debian Dockerfile
fedora Dockerfile
wolfCLU Dockerfile README.md
yocto Dockerfile buildAndPush.sh
Dockerfile Dockerfile.cross-compiler README.md buildAndPush.sh include.am run.sh
IDE
ARDUINO
sketches
wolfssl_client README.md
wolfssl_server README.md
wolfssl_version README.md
README.md
Arduino_README_prepend.md README.md include.am keywords.txt library.properties.template wolfssl-arduino.cpp wolfssl-arduino.sh wolfssl.h
AURIX Cpu0_Main.c README.md include.am user_settings.h wolf_main.c
Android Android.bp README.md include.am user_settings.h
CRYPTOCELL README.md include.am main.c user_settings.h
CSBENCH include.am user_settings.h
ECLIPSE
DEOS
deos_wolfssl .options
README.md deos_malloc.c include.am tls_wolfssl.c tls_wolfssl.h user_settings.h
MICRIUM README.md client_wolfssl.c client_wolfssl.h include.am server_wolfssl.c server_wolfssl.h user_settings.h wolfsslRunTests.c
RTTHREAD README.md include.am user_settings.h wolfssl_test.c
SIFIVE README.md include.am
Espressif
ESP-IDF
examples
template
VisualGDB wolfssl_template_IDF_v5.1_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266
wolfssl_benchmark
VisualGDB wolfssl_benchmark_IDF_v4.4_ESP32.sln wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj wolfssl_benchmark_IDF_v5_ESP32.sln wolfssl_benchmark_IDF_v5_ESP32.vgdbproj wolfssl_benchmark_IDF_v5_ESP32C3.sln wolfssl_benchmark_IDF_v5_ESP32C3.vgdbproj wolfssl_benchmark_IDF_v5_ESP32S3.sln wolfssl_benchmark_IDF_v5_ESP32S3.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266
wolfssl_client
VisualGDB README.md wolfssl_client_IDF_v5_ESP32.sln wolfssl_client_IDF_v5_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include client-tls.h main.h time_helper.h wifi_connect.h
CMakeLists.txt Kconfig.projbuild client-tls.c component.mk main.c time_helper.c wifi_connect.c
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_client_ESP8266.vgdbproj
wolfssl_server
VisualGDB README.md wolfssl_server_IDF_v5_ESP32.sln wolfssl_server_IDF_v5_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h server-tls.h time_helper.h wifi_connect.h
CMakeLists.txt Kconfig.projbuild component.mk main.c server-tls.c time_helper.c wifi_connect.c
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_server_ESP8266.vgdbproj
wolfssl_test
VisualGDB wolfssl_test-IDF_v5_ESP32.sln wolfssl_test-IDF_v5_ESP32.vgdbproj wolfssl_test-IDF_v5_ESP32C3.sln wolfssl_test-IDF_v5_ESP32C3.vgdbproj wolfssl_test-IDF_v5_ESP32C6.sln wolfssl_test-IDF_v5_ESP32C6.vgdbproj wolfssl_test_IDF_v5_ESP32S3.sln wolfssl_test_IDF_v5_ESP32S3.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32 sdkconfig.defaults.esp32c3 sdkconfig.defaults.esp32c6 sdkconfig.defaults.esp32h2 sdkconfig.defaults.esp32s2 sdkconfig.defaults.esp32s3 sdkconfig.defaults.esp8266 testAll.sh testMonitor.sh wolfssl_test_ESP8266.sln wolfssl_test_ESP8266.vgdbproj
wolfssl_test_idf
VisualGDB VisualGDB_wolfssl_test_idf.sln VisualGDB_wolfssl_test_idf.vgdbproj
main CMakeLists.txt Kconfig.projbuild component.mk main.c main_wip.c.ex time_helper.c time_helper.h
CMakeLists.txt Kconfig.projbuild README.md component.mk sdkconfig.defaults
README.md
libs CMakeLists.txt README.md component.mk tigard.cfg
test CMakeLists.txt README.md component.mk test_wolfssl.c
README.md README_32se.md UPDATE.md compileAllExamples.sh dummy_config_h dummy_test_paths.h setup.sh setup_win.bat user_settings.h
README.md include.am
GCC-ARM
Header user_settings.h
Source armtarget.c benchmark_main.c test_main.c tls_client.c tls_server.c wolf_main.c
Makefile Makefile.bench Makefile.client Makefile.common Makefile.server Makefile.static Makefile.test README.md include.am linker.ld linker_fips.ld
Gaisler-BCC README.md include.am
HEXAGON
DSP Makefile wolfssl_dsp.idl
Makefile README.md build.sh ecc-verify-benchmark.c ecc-verify.c include.am user_settings.h
HEXIWEAR
wolfSSL_HW .cwGeneratedFileSetLog user_settings.h
IAR-EWARM
Projects
benchmark benchmark-main.c current_time.c wolfCrypt-benchmark.ewd wolfCrypt-benchmark.ewp
common minimum-startup.c wolfssl.icf
lib wolfSSL-Lib.ewd wolfSSL-Lib.ewp
test test-main.c wolfCrypt-test.ewd wolfCrypt-test.ewp
user_settings.h wolfssl.eww
embOS
SAMV71_XULT
embOS_SAMV71_XULT_Linker_Script samv71q21_wolfssl.icf
embOS_SAMV71_XULT_user_settings user_settings.h user_settings_simple_example.h user_settings_verbose_example.h
embOS_wolfcrypt_benchmark_SAMV71_XULT
Application runBenchmarks.c
README_wolfcrypt_benchmark wolfcrypt_benchmark.ewd wolfcrypt_benchmark.ewp
embOS_wolfcrypt_lib_SAMV71_XULT README_wolfcrypt_lib wolfcrypt_lib.ewd wolfcrypt_lib.ewp
embOS_wolfcrypt_test_SAMV71_XULT
Application runWolfcryptTests.c
README_wolfcrypt_test wolfcrypt_test.ewd wolfcrypt_test.ewp
README_SAMV71
custom_port
custom_port_Linker_Script samv71q21_wolfssl.icf
custom_port_user_settings user_settings.h
wolfcrypt_benchmark_custom_port
Application runBenchmarks.c
wolfcrypt_test_custom_port
Application runWolfcryptTests.c
README_custom_port
extract_trial_here README_extract_trial_here
README
.gitignore README
IAR-MSP430 Makefile README.md include.am main.c user_settings.h
INTIME-RTOS Makefile README.md include.am libwolfssl.c libwolfssl.vcxproj user_settings.h wolfExamples.c wolfExamples.h wolfExamples.sln wolfExamples.vcxproj wolfssl-lib.sln wolfssl-lib.vcxproj
Infineon README.md include.am user_settings.h
KDS
config user_settings.h
include.am
LINUX-SGX README.md build.sh clean.sh include.am sgx_t_static.mk
LPCXPRESSO
lib_wolfssl lpc_18xx_port.c user_settings.h
wolf_example
src lpc_18xx_startup.c wolfssl_example.c
readme.txt
README.md
M68K
benchmark Makefile main.cpp
testwolfcrypt Makefile main.cpp
Makefile README.md include.am user_settings.h
MCUEXPRESSO
RT1170 fsl_caam_c.patch fsl_caam_h.patch user_settings.h
benchmark
source run_benchmark.c
wolfssl liblinks.xml
README.md include.am user_settings.h wolfcrypt_test.c
MDK-ARM
LPC43xx time-LCP43xx.c
MDK-ARM
wolfSSL Retarget.c cert_data.c cert_data.h config-BARE-METAL.h config-FS.h config-RTX-TCP-FS.h config-WOLFLIB.h main.c shell.c time-CortexM3-4.c time-dummy.c wolfssl_MDK_ARM.c wolfssl_MDK_ARM.h
STM32F2xx_StdPeriph_Lib time-STM32F2xx.c
MDK5-ARM
Conf user_settings.h
Inc wolfssl_MDK_ARM.h
Projects
CryptBenchmark Abstract.txt CryptBenchmark.sct CryptBenchmark.uvoptx CryptBenchmark.uvprojx main.c
CryptTest Abstract.txt CryptTest.sct CryptTest.uvoptx CryptTest.uvprojx main.c
EchoClient Abstract.txt EchoClient.uvoptx EchoClient.uvprojx main.c wolfssl-link.sct
EchoServer Abstract.txt EchoServer.uvoptx EchoServer.uvprojx main.c wolfssl-link.sct
SimpleClient Abstract.txt SimpleClient.uvoptx SimpleClient.uvprojx main.c wolfssl-link.sct
SimpleServer Abstract.txt SimpleServer.uvoptx SimpleServer.uvprojx main.c wolfssl-link.sct
wolfSSL-Full Abstract.txt main.c shell.c time-CortexM3-4.c wolfsslFull.uvoptx wolfsslFull.uvprojx
wolfSSL-Lib Abstract.txt wolfSSL-Lib.uvoptx wolfSSL-Lib.uvprojx
Src ssl-dummy.c
README.md include.am
MPLABX16
wolfcrypt_test.X
nbproject
private configurations.xml private.xml
configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
README.md include.am main.c user_settings.h
MQX Makefile README-jp.md README.md client-tls.c include.am server-tls.c user_config.h user_settings.h
MSVS-2019-AZSPHERE
client client.c client.h
server server.c server.h
shared util.h
wolfssl_new_azsphere
HardwareDefinitions
avnet_mt3620_sk
inc
hw template_appliance.h
template_appliance.json
mt3620_rdb
inc
hw template_appliance.h
template_appliance.json
seeed_mt3620_mdb
inc
hw template_appliance.h
template_appliance.json
.gitignore CMakeLists.txt CMakeSettings.json app_manifest.json applibs_versions.h launch.vs.json main.c
README.md include.am user_settings.h
MYSQL CMakeLists_wolfCrypt.txt CMakeLists_wolfSSL.txt do.sh
NDS README.md
NETOS Makefile.wolfcrypt.inc README.md include.am user_settings.h user_settings.h-cert2425 user_settings.h-cert3389 wolfssl_netos_custom.c
OPENSTM32 README.md
PlatformIO
examples
wolfssl_benchmark
include README main.h
lib README
src CMakeLists.txt main.c
test README
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_benchmark.code-workspace
wolfssl_test
include README main.h
lib README
src CMakeLists.txt main.c
test README
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_test.code-workspace
README.md wolfssl_platformio.code-workspace
README.md include.am
QNX
CAAM-DRIVER Makefile
example-client Makefile client-tls.c
example-cmac Makefile cmac-test.c
example-server Makefile server-tls.c
testwolfcrypt Makefile
wolfssl Makefile user_settings.h
README.md include.am
RISCV
SIFIVE-HIFIVE1 Makefile README.md include.am main.c user_settings.h
SIFIVE-UNLEASHED README.md include.am
include.am
ROWLEY-CROSSWORKS-ARM Kinetis_FlashPlacement.xml README.md arm_startup.c benchmark_main.c hw.h include.am kinetis_hw.c retarget.c test_main.c user_settings.h wolfssl.hzp wolfssl_ltc.hzp
Renesas
cs+
Projects
common strings.h unistd.h user_settings.h wolfssl_dummy.c
t4_demo README_en.txt README_jp.txt t4_demo.mtpj wolf_client.c wolf_demo.h wolf_main.c wolf_server.c
test test.mtpj test_main.c
wolfssl_lib wolfssl_lib.mtpj
README include.am
e2studio
DK-S7G2
benchmark-template
src app_entry.c
example_server-template
src app_entry.c
wolfcrypttest-template
src app_entry.c
wolfssl-template-project configuration.xml
README.md include.am user_settings.h
Projects
common strings.h unistd.h user_settings.h wolfssl_dummy.c
test
src key_data.c key_data.h test_main.c wolf_client.c wolf_server.c wolfssl_demo.h
tools generate_rsa_keypair.sh genhexbuf.pl rsa_pss_sign.sh
wolfssl
src .gitkeep
wolfcrypt
src .gitkeep
README include.am
RA6M3
benchmark-wolfcrypt
common .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
client-wolfssl
common
src .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl_thread_entry.h
common
ra6m3g README.md
src freertos_tcp_port.c
user_settings.h util.h
server-wolfssl
common
src .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl_thread_entry.h
test-wolfcrypt
common .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl
src .gitkeep
wolfcrypt .gitkeep
README.md README_APRA6M_en.md README_APRA6M_jp.md include.am
RA6M3G README.md
RA6M4
common user_settings.h wolfssl_demo.h
test
key_data key_data.h key_data_sce.c
src
SEGGER_RTT myprint.c
common .gitignore
test_main.c wolf_client.c wolfssl_sce_unit_test.c
test_RA6M4Debug.launch
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
README.md include.am
RX65N
GR-ROSE
common strings.h unistd.h user_settings.h wolfssl_dummy.c
smc smc.scfg
test
src key_data.c key_data.h test_main.c wolf_client.c wolf_server.c wolfssl_demo.h
test.rcpc test_HardwareDebug.launch
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
wolfssl wolfssl.rcpc
README_EN.md README_JP.md include.am
RSK
resource section.esi
wolfssl wolfssl.rcpc
wolfssl_demo key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h
InstructionManualForExample_RSK+RX65N-2MB_EN.pdf InstructionManualForExample_RSK+RX65N-2MB_JP.pdf README_EN.md README_JP.md include.am
RX72N
EnvisionKit
Simple
common sectioninfo.esi wolfssl_dummy.c
test
src
client simple_tcp_client.c simple_tls_tsip_client.c
server simple_tcp_server.c simple_tls_server.c
test_main.c wolfssl_simple_demo.h
test.rcpc test.scfg test_HardwareDebug.launch
wolfssl wolfssl.rcpc
README_EN.md README_JP.md
resource section.esi
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
wolfssl wolfssl.rcpc
wolfssl_demo key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h wolfssl_tsip_unit_test.c
InstructionManualForExample_RX72N_EnvisonKit_EN.pdf InstructionManualForExample_RX72N_EnvisonKit_JP.pdf README_EN.md README_JP.md include.am
RZN2L
common user_settings.h wolfssl_demo.h
test
src
serial_io app_print.c
test wolf_client.c wolf_server.c wolfssl_rsip_unit_test.c
wolfCrypt .gitignore
wolfSSL .gitignore
local_system_init.c rzn2l_tst_thread_entry.c wolfssl_dummy.c
README.md include.am
SK-S7G2
common user_settings.h
wolfssl_lib configuration.xml
.gitignore README.md include.am
STARCORE README.txt include.am starcore_test.c user_settings.h
STM32Cube README.md STM32_Benchmarks.md default_conf.ftl include.am main.c wolfssl_example.c wolfssl_example.h
SimplicityStudio README.md include.am test_wolf.c user_settings.h
TRUESTUDIO
wolfssl user_settings.h
README include.am
VS-ARM README.md include.am user_settings.h wolfssl.sln wolfssl.vcxproj
VS-AZURE-SPHERE
client app_manifest.json client.c client.h client.vcxproj
server app_manifest.json server.c server.h server.vcxproj
shared util.h
wolfcrypt_test app_manifest.json wolfcrypt_test.vcxproj
README.md include.am user_settings.h wolfssl.sln wolfssl.vcxproj
VisualDSP include.am user_settings.h wolf_tasks.c
WICED-STUDIO README include.am user_settings.h
WIN README.txt include.am test.vcxproj user_settings.h user_settings_dtls.h wolfssl-fips.sln wolfssl-fips.vcxproj
WIN-SGX ReadMe.txt include.am wolfSSL_SGX.edl wolfSSL_SGX.sln wolfSSL_SGX.vcxproj
WIN-SRTP-KDF-140-3 README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxproj
WIN10 README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxproj
WINCE README.md include.am user_settings.h user_settings.h.140-2-deprecated
WORKBENCH README.md include.am
XCODE
Benchmark
wolfBench
Assets.xcassets
AppIcon.appiconset Contents.json
Base.lproj LaunchScreen.storyboard Main.storyboard
AppDelegate.h AppDelegate.m Info.plist ViewController.h ViewController.m main.m
wolfBench.xcodeproj project.pbxproj
include.am
wolfssl-FIPS.xcodeproj project.pbxproj
wolfssl.xcodeproj project.pbxproj
wolfssl_testsuite.xcodeproj project.pbxproj
README.md build-for-i386.sh include.am user_settings.h
XCODE-FIPSv2
macOS-C++
Intel user_settings.h
M1 user_settings.h
include.am user_settings.h
XCODE-FIPSv5 README include.am user_settings.h
XCODE-FIPSv6 README include.am user_settings.h
XilinxSDK
2018_2 lscript.ld
2019_2
wolfCrypt_example
src lscript.ld
wolfCrypt_example_system wolfCrypt_example_system.sprj
2022_1
wolfCrypt_FreeRTOS_example wolfCrypt_FreeRTOS_example.prj
wolfCrypt_FreeRTOS_example_system wolfCrypt_FreeRTOS_example_system.sprj
wolfCrypt_example wolfCrypt_example.prj
wolfCrypt_example_system wolfCrypt_example_system.sprj
.gitignore
README.md bench.sh combine.sh eclipse_formatter_profile.xml graph.sh include.am user_settings.h wolfssl_example.c
apple-universal
wolfssl-multiplatform
wolfssl-multiplatform
Assets.xcassets
AccentColor.colorset Contents.json
AppIcon.appiconset Contents.json
Contents.json
ContentView.swift simple_client_example.c simple_client_example.h wolfssl-multiplatform-Bridging-Header.h wolfssl_multiplatform.entitlements wolfssl_multiplatformApp.swift wolfssl_test_driver.c wolfssl_test_driver.h
wolfssl-multiplatform.xcodeproj project.pbxproj
.gitignore README.md build-wolfssl-framework.sh include.am
iotsafe Makefile README.md ca-cert.c devices.c devices.h include.am main.c memory-tls.c startup.c target.ld user_settings.h
iotsafe-raspberrypi Makefile README.md client-tls13.c include.am main.c
mynewt README.md apps.wolfcrypttest.pkg.yml crypto.wolfssl.pkg.yml crypto.wolfssl.syscfg.yml include.am setup.sh
zephyr README.md include.am
include.am
RTOS
nuttx
wolfssl .gitignore Kconfig Make.defs Makefile README.md setup-wolfssl.sh user_settings.h
include.am
bsdkm Makefile README.md bsdkm_wc_port.h include.am wolfkmod.c wolfkmod_aes.c x86_vecreg.c
certs
1024 ca-cert.der ca-cert.pem ca-key.der ca-key.pem client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der dh1024.der dh1024.pem dsa-pub-1024.pem dsa1024.der dsa1024.pem include.am rsa1024.der server-cert.der server-cert.pem server-key.der server-key.pem
3072 client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der include.am
4096 client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der include.am
acert
rsa_pss acert.pem acert_ietf.pem acert_ietf_pubkey.pem acert_pubkey.pem
acert.pem acert_ietf.pem acert_ietf_pubkey.pem acert_pubkey.pem include.am
aia ca-issuers-cert.pem multi-aia-cert.pem overflow-aia-cert.pem
crl
extra-crls ca-int-cert-revoked.pem claim-root.pem crl_critical_entry.pem crlnum_57oct.pem crlnum_64oct.pem general-server-crl.pem large_crlnum.pem large_crlnum2.pem
hash_der 0fdb2da4.r0
hash_pem 0fdb2da4.r0
bad_time_fmt.pem ca-int-ecc.pem ca-int.pem ca-int2-ecc.pem ca-int2.pem caEcc384Crl.pem caEccCrl.der caEccCrl.pem cliCrl.pem client-int-ecc.pem client-int.pem crl.der crl.pem crl.revoked crl2.der crl2.pem crl_reason.pem crl_rsapss.pem eccCliCRL.pem eccSrvCRL.pem gencrls.sh include.am server-goodaltCrl.pem server-goodaltwildCrl.pem server-goodcnCrl.pem server-goodcnwildCrl.pem server-int-ecc.pem server-int.pem wolfssl.cnf
dilithium bench_dilithium_level2_key.der bench_dilithium_level3_key.der bench_dilithium_level5_key.der include.am
ecc bp256r1-key.der bp256r1-key.pem ca-secp256k1-cert.pem ca-secp256k1-key.pem client-bp256r1-cert.der client-bp256r1-cert.pem client-secp256k1-cert.der client-secp256k1-cert.pem genecc.sh include.am secp256k1-key.der secp256k1-key.pem secp256k1-param.pem secp256k1-privkey.der secp256k1-privkey.pem server-bp256r1-cert.der server-bp256r1-cert.pem server-secp256k1-cert.der server-secp256k1-cert.pem server2-secp256k1-cert.der server2-secp256k1-cert.pem wolfssl.cnf wolfssl_384.cnf
ed25519 ca-ed25519-key.der ca-ed25519-key.pem ca-ed25519-priv.der ca-ed25519-priv.pem ca-ed25519.der ca-ed25519.pem client-ed25519-key.der client-ed25519-key.pem client-ed25519-priv.der client-ed25519-priv.pem client-ed25519.der client-ed25519.pem eddsa-ed25519.der eddsa-ed25519.pem gen-ed25519-certs.sh gen-ed25519-keys.sh gen-ed25519.sh include.am root-ed25519-key.der root-ed25519-key.pem root-ed25519-priv.der root-ed25519-priv.pem root-ed25519.der root-ed25519.pem server-ed25519-cert.pem server-ed25519-key.der server-ed25519-key.pem server-ed25519-priv.der server-ed25519-priv.pem server-ed25519.der server-ed25519.pem
ed448 ca-ed448-key.der ca-ed448-key.pem ca-ed448-priv.der ca-ed448-priv.pem ca-ed448.der ca-ed448.pem client-ed448-key.der client-ed448-key.pem client-ed448-priv.der client-ed448-priv.pem client-ed448.der client-ed448.pem gen-ed448-certs.sh gen-ed448-keys.sh include.am root-ed448-key.der root-ed448-key.pem root-ed448-priv.der root-ed448-priv.pem root-ed448.der root-ed448.pem server-ed448-cert.pem server-ed448-key.der server-ed448-key.pem server-ed448-priv.der server-ed448-priv.pem server-ed448.der server-ed448.pem
external DigiCertGlobalRootCA.pem README.txt ca-digicert-ev.pem ca-globalsign-root.pem ca-google-root.pem ca_collection.pem include.am
falcon bench_falcon_level1_key.der bench_falcon_level5_key.der include.am
intermediate
ca_false_intermediate gentestcert.sh int_ca.key server.key test_ca.key test_ca.pem test_int_not_cacert.pem test_sign_bynoca_srv.pem wolfssl_base.conf wolfssl_srv.conf
ca-ecc-bad-aki.der ca-ecc-bad-aki.pem ca-int-cert.der ca-int-cert.pem ca-int-ecc-cert.der ca-int-ecc-cert.pem ca-int-ecc-key.der ca-int-ecc-key.pem ca-int-key.der ca-int-key.pem ca-int2-cert.der ca-int2-cert.pem ca-int2-ecc-cert.der ca-int2-ecc-cert.pem ca-int2-ecc-key.der ca-int2-ecc-key.pem ca-int2-key.der ca-int2-key.pem client-chain-alt-ecc.pem client-chain-alt.pem client-chain-ecc.der client-chain-ecc.pem client-chain.der client-chain.pem client-int-cert.der client-int-cert.pem client-int-ecc-cert.der client-int-ecc-cert.pem genintcerts.sh include.am server-chain-alt-ecc.pem server-chain-alt.pem server-chain-ecc.der server-chain-ecc.pem server-chain-short.pem server-chain.der server-chain.pem server-int-cert.der server-int-cert.pem server-int-ecc-cert.der server-int-ecc-cert.pem
lms bc_hss_L2_H5_W8_root.der bc_hss_L3_H5_W4_root.der bc_lms_chain_ca.der bc_lms_chain_leaf.der bc_lms_native_bc_root.der bc_lms_sha256_h10_w8_root.der bc_lms_sha256_h5_w4_root.der include.am
mldsa README.txt include.am mldsa44-cert.der mldsa44-cert.pem mldsa44-key.pem mldsa44_bare-priv.der mldsa44_bare-seed.der mldsa44_oqskeypair.der mldsa44_priv-only.der mldsa44_pub-spki.der mldsa44_seed-only.der mldsa44_seed-priv.der mldsa65-cert.der mldsa65-cert.pem mldsa65-key.pem mldsa65_bare-priv.der mldsa65_bare-seed.der mldsa65_oqskeypair.der mldsa65_priv-only.der mldsa65_pub-spki.der mldsa65_seed-only.der mldsa65_seed-priv.der mldsa87-cert.der mldsa87-cert.pem mldsa87-key.pem mldsa87_bare-priv.der mldsa87_bare-seed.der mldsa87_oqskeypair.der mldsa87_priv-only.der mldsa87_pub-spki.der mldsa87_seed-only.der mldsa87_seed-priv.der
ocsp imposter-root-ca-cert.der imposter-root-ca-cert.pem imposter-root-ca-key.der imposter-root-ca-key.pem include.am index-ca-and-intermediate-cas.txt index-ca-and-intermediate-cas.txt.attr index-intermediate1-ca-issued-certs.txt index-intermediate1-ca-issued-certs.txt.attr index-intermediate2-ca-issued-certs.txt index-intermediate2-ca-issued-certs.txt.attr index-intermediate3-ca-issued-certs.txt index-intermediate3-ca-issued-certs.txt.attr intermediate1-ca-cert.der intermediate1-ca-cert.pem intermediate1-ca-key.der intermediate1-ca-key.pem intermediate2-ca-cert.der intermediate2-ca-cert.pem intermediate2-ca-key.der intermediate2-ca-key.pem intermediate3-ca-cert.der intermediate3-ca-cert.pem intermediate3-ca-key.der intermediate3-ca-key.pem ocsp-responder-cert.der ocsp-responder-cert.pem ocsp-responder-key.der ocsp-responder-key.pem openssl.cnf renewcerts-for-test.sh renewcerts.sh root-ca-cert.der root-ca-cert.pem root-ca-crl.pem root-ca-key.der root-ca-key.pem server1-cert.der server1-cert.pem server1-chain-noroot.pem server1-key.der server1-key.pem server2-cert.der server2-cert.pem server2-key.der server2-key.pem server3-cert.der server3-cert.pem server3-key.der server3-key.pem server4-cert.der server4-cert.pem server4-key.der server4-key.pem server5-cert.der server5-cert.pem server5-key.der server5-key.pem test-leaf-response.der test-multi-response.der test-response-nointern.der test-response-rsapss.der test-response.der
p521 ca-p521-key.der ca-p521-key.pem ca-p521-priv.der ca-p521-priv.pem ca-p521.der ca-p521.pem client-p521-key.der client-p521-key.pem client-p521-priv.der client-p521-priv.pem client-p521.der client-p521.pem gen-p521-certs.sh gen-p521-keys.sh include.am root-p521-key.der root-p521-key.pem root-p521-priv.der root-p521-priv.pem root-p521.der root-p521.pem server-p521-cert.pem server-p521-key.der server-p521-key.pem server-p521-priv.der server-p521-priv.pem server-p521.der server-p521.pem
renewcerts wolfssl.cnf
rpk client-cert-rpk.der client-ecc-cert-rpk.der include.am server-cert-rpk.der server-ecc-cert-rpk.der
rsapss ca-3072-rsapss-key.der ca-3072-rsapss-key.pem ca-3072-rsapss-priv.der ca-3072-rsapss-priv.pem ca-3072-rsapss.der ca-3072-rsapss.pem ca-rsapss-key.der ca-rsapss-key.pem ca-rsapss-priv.der ca-rsapss-priv.pem ca-rsapss.der ca-rsapss.pem client-3072-rsapss-key.der client-3072-rsapss-key.pem client-3072-rsapss-priv.der client-3072-rsapss-priv.pem client-3072-rsapss.der client-3072-rsapss.pem client-rsapss-key.der client-rsapss-key.pem client-rsapss-priv.der client-rsapss-priv.pem client-rsapss.der client-rsapss.pem gen-rsapss-keys.sh include.am renew-rsapss-certs.sh root-3072-rsapss-key.der root-3072-rsapss-key.pem root-3072-rsapss-priv.der root-3072-rsapss-priv.pem root-3072-rsapss.der root-3072-rsapss.pem root-rsapss-key.der root-rsapss-key.pem root-rsapss-priv.der root-rsapss-priv.pem root-rsapss.der root-rsapss.pem server-3072-rsapss-cert.pem server-3072-rsapss-key.der server-3072-rsapss-key.pem server-3072-rsapss-priv.der server-3072-rsapss-priv.pem server-3072-rsapss.der server-3072-rsapss.pem server-mix-rsapss-cert.pem server-rsapss-cert.pem server-rsapss-key.der server-rsapss-key.pem server-rsapss-priv.der server-rsapss-priv.pem server-rsapss.der server-rsapss.pem
sia timestamping-sia-cert.pem
slhdsa bench_slhdsa_sha2_128f_key.der bench_slhdsa_sha2_128s_key.der bench_slhdsa_sha2_192f_key.der bench_slhdsa_sha2_192s_key.der bench_slhdsa_sha2_256f_key.der bench_slhdsa_sha2_256s_key.der bench_slhdsa_shake128f_key.der bench_slhdsa_shake128s_key.der bench_slhdsa_shake192f_key.der bench_slhdsa_shake192s_key.der bench_slhdsa_shake256f_key.der bench_slhdsa_shake256s_key.der client-mldsa44-priv.pem client-mldsa44-sha2.der client-mldsa44-sha2.pem client-mldsa44-shake.der client-mldsa44-shake.pem gen-slhdsa-mldsa-certs.sh include.am root-slhdsa-sha2-128s-priv.der root-slhdsa-sha2-128s-priv.pem root-slhdsa-sha2-128s.der root-slhdsa-sha2-128s.pem root-slhdsa-shake-128s-priv.der root-slhdsa-shake-128s-priv.pem root-slhdsa-shake-128s.der root-slhdsa-shake-128s.pem server-mldsa44-priv.pem server-mldsa44-sha2.der server-mldsa44-sha2.pem server-mldsa44-shake.der server-mldsa44-shake.pem
sm2 ca-sm2-key.der ca-sm2-key.pem ca-sm2-priv.der ca-sm2-priv.pem ca-sm2.der ca-sm2.pem client-sm2-key.der client-sm2-key.pem client-sm2-priv.der client-sm2-priv.pem client-sm2.der client-sm2.pem fix_sm2_spki.py gen-sm2-certs.sh gen-sm2-keys.sh include.am root-sm2-key.der root-sm2-key.pem root-sm2-priv.der root-sm2-priv.pem root-sm2.der root-sm2.pem self-sm2-cert.pem self-sm2-key.pem self-sm2-priv.pem server-sm2-cert.der server-sm2-cert.pem server-sm2-key.der server-sm2-key.pem server-sm2-priv.der server-sm2-priv.pem server-sm2.der server-sm2.pem
statickeys dh-ffdhe2048-params.pem dh-ffdhe2048-pub.der dh-ffdhe2048-pub.pem dh-ffdhe2048.der dh-ffdhe2048.pem ecc-secp256r1.der ecc-secp256r1.pem gen-static.sh include.am x25519-pub.der x25519-pub.pem x25519.der x25519.pem
test
expired expired-ca.der expired-ca.pem expired-cert.der expired-cert.pem
catalog.txt cert-bad-neg-int.der cert-bad-oid.der cert-bad-utf8.der cert-ext-ia.cfg cert-ext-ia.der cert-ext-ia.pem cert-ext-joi.cfg cert-ext-joi.der cert-ext-joi.pem cert-ext-mnc.der cert-ext-multiple.cfg cert-ext-multiple.der cert-ext-multiple.pem cert-ext-nc-combined.der cert-ext-nc-combined.pem cert-ext-nc.cfg cert-ext-nc.der cert-ext-nc.pem cert-ext-ncdns.der cert-ext-ncdns.pem cert-ext-ncip.der cert-ext-ncip.pem cert-ext-ncmixed.der cert-ext-ncmulti.der cert-ext-ncmulti.pem cert-ext-ncrid.der cert-ext-ncrid.pem cert-ext-nct.cfg cert-ext-nct.der cert-ext-nct.pem cert-ext-ndir-exc.cfg cert-ext-ndir-exc.der cert-ext-ndir-exc.pem cert-ext-ndir.cfg cert-ext-ndir.der cert-ext-ndir.pem cert-ext-ns.der cert-over-max-altnames.cfg cert-over-max-altnames.der cert-over-max-altnames.pem cert-over-max-nc.cfg cert-over-max-nc.der cert-over-max-nc.pem client-ecc-cert-ski.hex cn-ip-literal.der cn-ip-wildcard.der crit-cert.pem crit-key.pem dh1024.der dh1024.pem dh512.der dh512.pem digsigku.pem encrypteddata.msg gen-badsig.sh gen-ext-certs.sh gen-testcerts.sh include.am kari-keyid-cms.msg ktri-keyid-cms.msg ossl-trusted-cert.pem server-badaltname.der server-badaltname.pem server-badaltnull.der server-badaltnull.pem server-badcn.der server-badcn.pem server-badcnnull.der server-badcnnull.pem server-cert-ecc-badsig.der server-cert-ecc-badsig.pem server-cert-rsa-badsig.der server-cert-rsa-badsig.pem server-duplicate-policy.pem server-garbage.der server-garbage.pem server-goodalt.der server-goodalt.pem server-goodaltwild.der server-goodaltwild.pem server-goodcn.der server-goodcn.pem server-goodcnwild.der server-goodcnwild.pem server-localhost.der server-localhost.pem smime-test-canon.p7s smime-test-multipart-badsig.p7s smime-test-multipart.p7s smime-test.p7s
test-pathlen assemble-chains.sh chainA-ICA1-key.pem chainA-ICA1-pathlen0.pem chainA-assembled.pem chainA-entity-key.pem chainA-entity.pem chainB-ICA1-key.pem chainB-ICA1-pathlen0.pem chainB-ICA2-key.pem chainB-ICA2-pathlen1.pem chainB-assembled.pem chainB-entity-key.pem chainB-entity.pem chainC-ICA1-key.pem chainC-ICA1-pathlen1.pem chainC-assembled.pem chainC-entity-key.pem chainC-entity.pem chainD-ICA1-key.pem chainD-ICA1-pathlen127.pem chainD-assembled.pem chainD-entity-key.pem chainD-entity.pem chainE-ICA1-key.pem chainE-ICA1-pathlen128.pem chainE-assembled.pem chainE-entity-key.pem chainE-entity.pem chainF-ICA1-key.pem chainF-ICA1-pathlen1.pem chainF-ICA2-key.pem chainF-ICA2-pathlen0.pem chainF-assembled.pem chainF-entity-key.pem chainF-entity.pem chainG-ICA1-key.pem chainG-ICA1-pathlen0.pem chainG-ICA2-key.pem chainG-ICA2-pathlen1.pem chainG-ICA3-key.pem chainG-ICA3-pathlen99.pem chainG-ICA4-key.pem chainG-ICA4-pathlen5.pem chainG-ICA5-key.pem chainG-ICA5-pathlen20.pem chainG-ICA6-key.pem chainG-ICA6-pathlen10.pem chainG-ICA7-key.pem chainG-ICA7-pathlen100.pem chainG-assembled.pem chainG-entity-key.pem chainG-entity.pem chainH-ICA1-key.pem chainH-ICA1-pathlen0.pem chainH-ICA2-key.pem chainH-ICA2-pathlen2.pem chainH-ICA3-key.pem chainH-ICA3-pathlen2.pem chainH-ICA4-key.pem chainH-ICA4-pathlen2.pem chainH-assembled.pem chainH-entity-key.pem chainH-entity.pem chainI-ICA1-key.pem chainI-ICA1-no_pathlen.pem chainI-ICA2-key.pem chainI-ICA2-no_pathlen.pem chainI-ICA3-key.pem chainI-ICA3-pathlen2.pem chainI-assembled.pem chainI-entity-key.pem chainI-entity.pem chainJ-ICA1-key.pem chainJ-ICA1-no_pathlen.pem chainJ-ICA2-key.pem chainJ-ICA2-no_pathlen.pem chainJ-ICA3-key.pem chainJ-ICA3-no_pathlen.pem chainJ-ICA4-key.pem chainJ-ICA4-pathlen2.pem chainJ-assembled.pem chainJ-entity-key.pem chainJ-entity.pem include.am refreshkeys.sh
test-serial0 ee_normal.pem ee_serial0.pem generate_certs.sh include.am intermediate_serial0.pem root_serial0.pem root_serial0_key.pem selfsigned_nonca_serial0.pem
xmss bc_xmss_chain_ca.der bc_xmss_chain_leaf.der bc_xmss_sha2_10_256_root.der bc_xmss_sha2_16_256_root.der bc_xmssmt_sha2_20_2_256_root.der bc_xmssmt_sha2_20_4_256_root.der bc_xmssmt_sha2_40_8_256_root.der include.am
ca-cert-chain.der ca-cert.der ca-cert.pem ca-ecc-cert.der ca-ecc-cert.pem ca-ecc-key.der ca-ecc-key.pem ca-ecc384-cert.der ca-ecc384-cert.pem ca-ecc384-key.der ca-ecc384-key.pem ca-key-pkcs8-attribute.der ca-key.der ca-key.pem check_dates.sh client-absolute-urn.pem client-ca-cert.der client-ca-cert.pem client-ca.pem client-cert-ext.der client-cert-ext.pem client-cert.der client-cert.pem client-crl-dist.der client-crl-dist.pem client-ecc-ca-cert.der client-ecc-ca-cert.pem client-ecc-cert.der client-ecc-cert.pem client-ecc384-cert.der client-ecc384-cert.pem client-ecc384-key.der client-ecc384-key.pem client-key.der client-key.pem client-keyEnc.pem client-keyPub.der client-keyPub.pem client-relative-uri.pem client-uri-cert.pem csr.attr.der csr.dsa.der csr.dsa.pem csr.ext.der csr.signed.der dh-priv-2048.der dh-priv-2048.pem dh-pub-2048.der dh-pub-2048.pem dh-pubkey-2048.der dh2048.der dh2048.pem dh3072.der dh3072.pem dh4096.der dh4096.pem dsa-pubkey-2048.der dsa2048.der dsa2048.pem dsa3072.der dsaparams.der dsaparams.pem ecc-client-key.der ecc-client-key.pem ecc-client-keyPub.der ecc-client-keyPub.pem ecc-key-comp.pem ecc-keyPkcs8.der ecc-keyPkcs8.pem ecc-keyPkcs8Enc.der ecc-keyPkcs8Enc.pem ecc-keyPub.der ecc-keyPub.pem ecc-params.der ecc-params.pem ecc-privOnlyCert.pem ecc-privOnlyKey.pem ecc-privkey.der ecc-privkey.pem ecc-privkeyPkcs8.der ecc-privkeyPkcs8.pem ecc-rsa-server.p12 empty-issuer-cert.pem entity-no-ca-bool-cert.pem entity-no-ca-bool-key.pem fpki-cert.der fpki-certpol-cert.der gen_revoked.sh include.am renewcerts.sh rid-cert.der rsa-pub-2048.pem rsa2048.der rsa3072.der server-cert-chain.der server-cert.der server-cert.pem server-ecc-comp.der server-ecc-comp.pem server-ecc-rsa.der server-ecc-rsa.pem server-ecc-self.der server-ecc-self.pem server-ecc.der server-ecc.pem server-ecc384-cert.der server-ecc384-cert.pem server-ecc384-key.der server-ecc384-key.pem server-key.der server-key.pem server-keyEnc.pem server-keyPkcs8.der server-keyPkcs8.pem server-keyPkcs8Enc.der server-keyPkcs8Enc.pem server-keyPkcs8Enc12.pem server-keyPkcs8Enc2.pem server-keyPub.der server-keyPub.pem server-revoked-cert.pem server-revoked-key.pem taoCert.txt test-ber-exp02-05-2022.p7b test-degenerate.p7b test-multiple-recipients.p7b test-servercert-rc2.p12 test-servercert.p12 test-stream-dec.p7b test-stream-sign.p7b wolfssl-website-ca.pem x942dh2048.der x942dh2048.pem
cmake
consumer CMakeLists.txt README.md main.c
modules FindARIA.cmake FindOQS.cmake
Config.cmake.in README.md config.in functions.cmake include.am options.h.in wolfssl-config-version.cmake.in wolfssl-targets.cmake.in
debian
source format
changelog.in control.in copyright include.am libwolfssl-dev.install libwolfssl.install rules.in
doc
dox_comments
header_files aes.h arc4.h ascon.h asn.h asn_public.h blake2.h bn.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cryptocb.h curve25519.h curve448.h des3.h dh.h doxygen_groups.h doxygen_pages.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h evp.h hash.h hmac.h iotsafe.h kdf.h logging.h md2.h md4.h md5.h memory.h ocsp.h pem.h pkcs11.h pkcs7.h poly1305.h psa.h puf.h pwdbased.h quic.h random.h ripemd.h rsa.h sakke.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h srp.h ssl.h tfm.h types.h wc_encrypt.h wc_port.h wc_she.h wc_slhdsa.h wolfio.h
header_files-ja aes.h arc4.h ascon.h asn.h asn_public.h blake2.h bn.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cryptocb.h curve25519.h curve448.h des3.h dh.h doxygen_groups.h doxygen_pages.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h evp.h hash.h hmac.h iotsafe.h kdf.h logging.h md2.h md4.h md5.h memory.h ocsp.h pem.h pkcs11.h pkcs7.h poly1305.h psa.h pwdbased.h quic.h random.h ripemd.h rsa.h sakke.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h srp.h ssl.h tfm.h types.h wc_encrypt.h wc_port.h wolfio.h
formats
html
html_changes
search search.css search.js
customdoxygen.css doxygen.css menu.js menudata.js tabs.css
Doxyfile footer.html header.html mainpage.dox
pdf Doxyfile header.tex
images wolfssl_logo.png
QUIC.md README.txt README_DOXYGEN check_api.sh generate_documentation.sh include.am
examples
asn1 asn1.c dumpasn1.cfg gen_oid_names.rb include.am oid_names.h
async Makefile README.md async_client.c async_server.c async_tls.c async_tls.h include.am user_settings.h
benchmark include.am tls_bench.c tls_bench.h
client client.c client.h client.sln client.vcproj client.vcxproj include.am
configs README.md include.am user_settings_EBSnet.h user_settings_all.h user_settings_arduino.h user_settings_baremetal.h user_settings_ca.h user_settings_curve25519nonblock.h user_settings_dtls13.h user_settings_eccnonblock.h user_settings_espressif.h user_settings_fipsv2.h user_settings_fipsv5.h user_settings_min_ecc.h user_settings_openssl_compat.h user_settings_pkcs7.h user_settings_platformio.h user_settings_pq.h user_settings_rsa_only.h user_settings_stm32.h user_settings_template.h user_settings_tls12.h user_settings_tls13.h user_settings_wolfboot_keytools.h user_settings_wolfssh.h user_settings_wolftpm.h
crypto_policies
default wolfssl.txt
future wolfssl.txt
legacy wolfssl.txt
echoclient echoclient.c echoclient.h echoclient.sln echoclient.vcproj echoclient.vcxproj include.am quit
echoserver echoserver.c echoserver.h echoserver.sln echoserver.vcproj echoserver.vcxproj include.am
ocsp_responder include.am ocsp_responder.c ocsp_responder.h
pem include.am pem.c
sctp include.am sctp-client-dtls.c sctp-client.c sctp-server-dtls.c sctp-server.c
server include.am server.c server.h server.sln server.vcproj server.vcxproj
README.md include.am
linuxkm
patches
5.10.17 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v10v17.patch
5.10.236 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v10v236.patch
5.14.0-570.58.1.el9_6 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v14-570v58v1-el9_6.patch
5.15 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v15.patch
5.17 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v17.patch
5.17-ubuntu-jammy-tegra WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v17-ubuntu-jammy-tegra.patch
6.1.73 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v1v73.patch
6.12 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v12.patch
6.15 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v15.patch
7.0 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-7v0.patch
regen-patches.sh
Kbuild Makefile README.md get_thread_size.c include.am linuxkm-fips-hash-wrapper.sh linuxkm-fips-hash.c linuxkm_memory.c linuxkm_memory.h linuxkm_wc_port.h lkcapi_aes_glue.c lkcapi_dh_glue.c lkcapi_ecdh_glue.c lkcapi_ecdsa_glue.c lkcapi_glue.c lkcapi_rsa_glue.c lkcapi_sha_glue.c module_exports.c.template module_hooks.c pie_redirect_table.c wolfcrypt.lds x86_vector_register_glue.c
m4 ax_add_am_macro.m4 ax_am_jobserver.m4 ax_am_macros.m4 ax_append_compile_flags.m4 ax_append_flag.m4 ax_append_link_flags.m4 ax_append_to_file.m4 ax_atomic.m4 ax_bsdkm.m4 ax_check_compile_flag.m4 ax_check_link_flag.m4 ax_compiler_version.m4 ax_count_cpus.m4 ax_create_generic_config.m4 ax_debug.m4 ax_file_escapes.m4 ax_harden_compiler_flags.m4 ax_linuxkm.m4 ax_print_to_file.m4 ax_pthread.m4 ax_require_defined.m4 ax_tls.m4 ax_vcs_checkout.m4 hexversion.m4 lib_socket_nsl.m4 visibility.m4
mcapi
wolfcrypt_mcapi.X
nbproject configurations.xml include.am project.xml
Makefile
wolfcrypt_test.X
nbproject configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
zlib.X
nbproject configurations.xml include.am project.xml
Makefile
PIC32MZ-serial.h README crypto.c crypto.h include.am mcapi_test.c user_settings.h
mplabx
wolfcrypt_benchmark.X
nbproject configurations.xml include.am project.xml
Makefile
wolfcrypt_test.X
nbproject configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
PIC32MZ-serial.h README benchmark_main.c include.am test_main.c user_settings.h
mqx
util_lib
Sources include.am util.c util.h
wolfcrypt_benchmark
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfcrypt_benchmark_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
wolfcrypt_test
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfcrypt_test_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
wolfssl include.am
wolfssl_client
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfssl_client_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
README
rpm include.am spec.in
scripts
bench bench_functions.sh
aria-cmake-build-test.sh asn1_oid_sum.pl benchmark.test benchmark_compare.sh cleanup_testfiles.sh crl-gen-openssl.test crl-revoked.test dertoc.pl dtls.test dtlscid.test external.test google.test include.am makedistsmall.sh memtest.sh ocsp-responder-openssl-interop.test ocsp-stapling-with-ca-as-responder.test ocsp-stapling-with-wolfssl-responder.test ocsp-stapling.test ocsp-stapling2.test ocsp-stapling_tls13multi.test ocsp.test openssl.test openssl_srtp.test pem.test ping.test pkcallbacks.test psk.test resume.test rsapss.test sniffer-gen.sh sniffer-ipv6.pcap sniffer-static-rsa.pcap sniffer-testsuite.test sniffer-tls12-keylog.out sniffer-tls12-keylog.pcap sniffer-tls12-keylog.sslkeylog sniffer-tls13-dh-resume.pcap sniffer-tls13-dh.pcap sniffer-tls13-ecc-resume.pcap sniffer-tls13-ecc.pcap sniffer-tls13-hrr.pcap sniffer-tls13-keylog.out sniffer-tls13-keylog.pcap sniffer-tls13-keylog.sslkeylog sniffer-tls13-x25519-resume.pcap sniffer-tls13-x25519.pcap stm32l4-v4_0_1_build.sh tls13.test trusted_peer.test unit.test.in user_settings_asm.sh
src bio.c conf.c crl.c dtls.c dtls13.c include.am internal.c keys.c ocsp.c pk.c pk_ec.c pk_rsa.c quic.c sniffer.c ssl.c ssl_api_cert.c ssl_api_crl_ocsp.c ssl_api_pk.c ssl_asn1.c ssl_bn.c ssl_certman.c ssl_crypto.c ssl_ech.c ssl_load.c ssl_misc.c ssl_p7p12.c ssl_sess.c ssl_sk.c tls.c tls13.c wolfio.c x509.c x509_str.c
sslSniffer
sslSnifferTest README_WIN.md include.am snifftest.c sslSniffTest.vcproj sslSniffTest.vcxproj
README.md sslSniffer.vcproj sslSniffer.vcxproj
support gen-debug-trace-error-codes.sh include.am wolfssl.pc.in
tests
api api.h api_decl.h create_ocsp_test_blobs.py include.am test_aes.c test_aes.h test_arc4.c test_arc4.h test_ascon.c test_ascon.h test_ascon_kats.h test_asn.c test_asn.h test_blake2.c test_blake2.h test_camellia.c test_camellia.h test_certman.c test_certman.h test_chacha.c test_chacha.h test_chacha20_poly1305.c test_chacha20_poly1305.h test_cmac.c test_cmac.h test_curve25519.c test_curve25519.h test_curve448.c test_curve448.h test_des3.c test_des3.h test_dh.c test_dh.h test_digest.h test_dsa.c test_dsa.h test_dtls.c test_dtls.h test_ecc.c test_ecc.h test_ed25519.c test_ed25519.h test_ed448.c test_ed448.h test_evp.c test_evp.h test_evp_cipher.c test_evp_cipher.h test_evp_digest.c test_evp_digest.h test_evp_pkey.c test_evp_pkey.h test_hash.c test_hash.h test_hmac.c test_hmac.h test_md2.c test_md2.h test_md4.c test_md4.h test_md5.c test_md5.h test_mldsa.c test_mldsa.h test_mlkem.c test_mlkem.h test_ocsp.c test_ocsp.h test_ocsp_test_blobs.h test_ossl_asn1.c test_ossl_asn1.h test_ossl_bio.c test_ossl_bio.h test_ossl_bn.c test_ossl_bn.h test_ossl_cipher.c test_ossl_cipher.h test_ossl_dgst.c test_ossl_dgst.h test_ossl_dh.c test_ossl_dh.h test_ossl_dsa.c test_ossl_dsa.h test_ossl_ec.c test_ossl_ec.h test_ossl_ecx.c test_ossl_ecx.h test_ossl_mac.c test_ossl_mac.h test_ossl_obj.c test_ossl_obj.h test_ossl_p7p12.c test_ossl_p7p12.h test_ossl_pem.c test_ossl_pem.h test_ossl_rand.c test_ossl_rand.h test_ossl_rsa.c test_ossl_rsa.h test_ossl_sk.c test_ossl_sk.h test_ossl_x509.c test_ossl_x509.h test_ossl_x509_acert.c test_ossl_x509_acert.h test_ossl_x509_crypto.c test_ossl_x509_crypto.h test_ossl_x509_ext.c test_ossl_x509_ext.h test_ossl_x509_info.c test_ossl_x509_info.h test_ossl_x509_io.c test_ossl_x509_io.h test_ossl_x509_lu.c test_ossl_x509_lu.h test_ossl_x509_name.c test_ossl_x509_name.h test_ossl_x509_pk.c test_ossl_x509_pk.h test_ossl_x509_str.c test_ossl_x509_str.h test_ossl_x509_vp.c test_ossl_x509_vp.h test_pkcs12.c test_pkcs12.h test_pkcs7.c test_pkcs7.h test_poly1305.c test_poly1305.h test_random.c test_random.h test_rc2.c test_rc2.h test_ripemd.c test_ripemd.h test_rsa.c test_rsa.h test_sha.c test_sha.h test_sha256.c test_sha256.h test_sha3.c test_sha3.h test_sha512.c test_sha512.h test_she.c test_she.h test_signature.c test_signature.h test_slhdsa.c test_slhdsa.h test_sm2.c test_sm2.h test_sm3.c test_sm3.h test_sm4.c test_sm4.h test_tls.c test_tls.h test_tls13.c test_tls13.h test_tls_ext.c test_tls_ext.h test_wc_encrypt.c test_wc_encrypt.h test_wolfmath.c test_wolfmath.h test_x509.c test_x509.h
emnet
IP IP.h
Makefile emnet_nonblock_test.c emnet_shim.c
freertos-mem-track-repro FreeRTOS.h repro.c run.sh semphr.h task.h user_settings.h
swdev .gitignore Makefile README.md swdev.c swdev.h swdev_loader.c swdev_loader.h user_settings.h
CONF_FILES_README.md NCONF_test.cnf README TXT_DB.txt api.c include.am quic.c srp.c suites.c test-altchains.conf test-chains.conf test-dhprime.conf test-dtls-downgrade.conf test-dtls-fails-cipher.conf test-dtls-fails.conf test-dtls-group.conf test-dtls-mtu.conf test-dtls-reneg-client.conf test-dtls-reneg-server.conf test-dtls-resume.conf test-dtls-sha2.conf test-dtls-srtp-fails.conf test-dtls-srtp.conf test-dtls.conf test-dtls13-cid.conf test-dtls13-downgrade-fails.conf test-dtls13-downgrade.conf test-dtls13-pq-hybrid-extra-frag.conf test-dtls13-pq-hybrid-extra.conf test-dtls13-pq-hybrid-frag.conf test-dtls13-pq-standalone-frag.conf test-dtls13-pq-standalone.conf test-dtls13-psk.conf test-dtls13.conf test-ecc-cust-curves.conf test-ed25519.conf test-ed448.conf test-enckeys.conf test-fails.conf test-maxfrag-dtls.conf test-maxfrag.conf test-p521.conf test-psk-no-id-sha2.conf test-psk-no-id.conf test-psk.conf test-rsapss.conf test-sctp-sha2.conf test-sctp.conf test-sha2.conf test-sig.conf test-sm2.conf test-tls-downgrade.conf test-tls13-down.conf test-tls13-ecc.conf test-tls13-pq-hybrid-extra.conf test-tls13-pq-hybrid.conf test-tls13-pq-standalone.conf test-tls13-psk-certs.conf test-tls13-psk.conf test-tls13-slhdsa-fail.conf test-tls13-slhdsa-sha2.conf test-tls13-slhdsa-shake.conf test-tls13.conf test-trustpeer.conf test.conf unit.c unit.h utils.c utils.h w64wrapper.c
testsuite include.am testsuite.c testsuite.sln testsuite.vcproj testsuite.vcxproj utils.c utils.h
tirtos
packages
ti
net
wolfssl
tests
EK_TM4C1294XL
wolfcrypt
benchmark TM4C1294NC.icf benchmark.cfg main.c package.bld.hide package.xdc
test TM4C1294NC.icf main.c package.bld.hide package.xdc test.cfg
package.bld package.xdc package.xs
.gitignore README include.am products.mak wolfssl.bld wolfssl.mak
wolfcrypt
benchmark README.md benchmark-VS2022.sln benchmark-VS2022.vcxproj benchmark-VS2022.vcxproj.user benchmark.c benchmark.h benchmark.sln benchmark.vcproj benchmark.vcxproj include.am
src
port
Espressif
esp_crt_bundle README.md cacrt_all.pem cacrt_deprecated.pem cacrt_local.pem esp_crt_bundle.c gen_crt_bundle.py pio_install_cryptography.py
README.md esp32_aes.c esp32_mp.c esp32_sha.c esp32_util.c esp_sdk_mem_lib.c esp_sdk_time_lib.c esp_sdk_wifi_lib.c
Renesas README.md renesas_common.c renesas_fspsm_aes.c renesas_fspsm_rsa.c renesas_fspsm_sha.c renesas_fspsm_util.c renesas_rx64_hw_sha.c renesas_rx64_hw_util.c renesas_tsip_aes.c renesas_tsip_rsa.c renesas_tsip_sha.c renesas_tsip_util.c
af_alg afalg_aes.c afalg_hash.c wc_afalg.c
aria aria-crypt.c aria-cryptocb.c
arm armv8-32-aes-asm.S armv8-32-aes-asm_c.c armv8-32-chacha-asm.S armv8-32-chacha-asm_c.c armv8-32-curve25519.S armv8-32-curve25519_c.c armv8-32-mlkem-asm.S armv8-32-mlkem-asm_c.c armv8-32-poly1305-asm.S armv8-32-poly1305-asm_c.c armv8-32-sha256-asm.S armv8-32-sha256-asm_c.c armv8-32-sha3-asm.S armv8-32-sha3-asm_c.c armv8-32-sha512-asm.S armv8-32-sha512-asm_c.c armv8-aes-asm.S armv8-aes-asm_c.c armv8-aes.c armv8-chacha-asm.S armv8-chacha-asm_c.c armv8-curve25519.S armv8-curve25519_c.c armv8-mlkem-asm.S armv8-mlkem-asm_c.c armv8-poly1305-asm.S armv8-poly1305-asm_c.c armv8-sha256-asm.S armv8-sha256-asm_c.c armv8-sha256.c armv8-sha3-asm.S armv8-sha3-asm_c.c armv8-sha512-asm.S armv8-sha512-asm_c.c armv8-sha512.c cryptoCell.c cryptoCellHash.c thumb2-aes-asm.S thumb2-aes-asm_c.c thumb2-chacha-asm.S thumb2-chacha-asm_c.c thumb2-curve25519.S thumb2-curve25519_c.c thumb2-mlkem-asm.S thumb2-mlkem-asm_c.c thumb2-poly1305-asm.S thumb2-poly1305-asm_c.c thumb2-sha256-asm.S thumb2-sha256-asm_c.c thumb2-sha3-asm.S thumb2-sha3-asm_c.c thumb2-sha512-asm.S thumb2-sha512-asm_c.c
atmel README.md atmel.c
autosar README.md cryif.c crypto.c csm.c include.am test.c
caam README.md caam_aes.c caam_doc.pdf caam_driver.c caam_error.c caam_integrity.c caam_qnx.c caam_sha.c wolfcaam_aes.c wolfcaam_cmac.c wolfcaam_ecdsa.c wolfcaam_fsl_nxp.c wolfcaam_hash.c wolfcaam_hmac.c wolfcaam_init.c wolfcaam_qnx.c wolfcaam_rsa.c wolfcaam_seco.c wolfcaam_x25519.c
cavium README.md README_Octeon.md cavium_nitrox.c cavium_octeon_sync.c
cuda README.md aes-cuda.cu
cypress README.md psoc6_crypto.c
devcrypto README.md devcrypto_aes.c devcrypto_ecdsa.c devcrypto_hash.c devcrypto_hmac.c devcrypto_rsa.c devcrypto_x25519.c wc_devcrypto.c
intel README.md quickassist.c quickassist_mem.c quickassist_sync.c
iotsafe iotsafe.c
kcapi README.md kcapi_aes.c kcapi_dh.c kcapi_ecc.c kcapi_hash.c kcapi_hmac.c kcapi_rsa.c
liboqs liboqs.c
maxim README.md max3266x.c maxq10xx.c
mynewt mynewt_port.c
nxp README.md README_SE050.md casper_port.c dcp_port.c hashcrypt_port.c ksdk_port.c se050_port.c
pic32 pic32mz-crypt.c
ppc32 ppc32-sha256-asm.S ppc32-sha256-asm_c.c ppc32-sha256-asm_cr.c
psa README.md psa.c psa_aes.c psa_hash.c psa_pkcbs.c
riscv riscv-64-aes.c riscv-64-chacha.c riscv-64-poly1305.c riscv-64-sha256.c riscv-64-sha3.c riscv-64-sha512.c
rpi_pico README.md pico.c
silabs README.md silabs_aes.c silabs_ecc.c silabs_hash.c silabs_random.c
st README.md STM32MP13.md STM32MP25.md stm32.c stsafe.c
ti ti-aes.c ti-ccm.c ti-des3.c ti-hash.c
tropicsquare README.md tropic01.c
xilinx xil-aesgcm.c xil-sha3.c xil-versal-glue.c xil-versal-trng.c
nrf51.c
ASN_TEMPLATE.md aes.c aes_asm.S aes_asm.asm aes_gcm_asm.S aes_gcm_asm.asm aes_gcm_x86_asm.S aes_xts_asm.S aes_xts_asm.asm arc4.c ascon.c asm.c asn.c asn_orig.c async.c blake2b.c blake2s.c camellia.c chacha.c chacha20_poly1305.c chacha_asm.S chacha_asm.asm cmac.c coding.c compress.c cpuid.c cryptocb.c curve25519.c curve448.c des3.c dh.c dilithium.c dsa.c ecc.c ecc_fp.c eccsi.c ed25519.c ed448.c error.c evp.c evp_pk.c falcon.c fe_448.c fe_low_mem.c fe_operations.c fe_x25519_128.h fe_x25519_asm.S fp_mont_small.i fp_mul_comba_12.i fp_mul_comba_17.i fp_mul_comba_20.i fp_mul_comba_24.i fp_mul_comba_28.i fp_mul_comba_3.i fp_mul_comba_32.i fp_mul_comba_4.i fp_mul_comba_48.i fp_mul_comba_6.i fp_mul_comba_64.i fp_mul_comba_7.i fp_mul_comba_8.i fp_mul_comba_9.i fp_mul_comba_small_set.i fp_sqr_comba_12.i fp_sqr_comba_17.i fp_sqr_comba_20.i fp_sqr_comba_24.i fp_sqr_comba_28.i fp_sqr_comba_3.i fp_sqr_comba_32.i fp_sqr_comba_4.i fp_sqr_comba_48.i fp_sqr_comba_6.i fp_sqr_comba_64.i fp_sqr_comba_7.i fp_sqr_comba_8.i fp_sqr_comba_9.i fp_sqr_comba_small_set.i ge_448.c ge_low_mem.c ge_operations.c hash.c hmac.c hpke.c include.am integer.c kdf.c logging.c md2.c md4.c md5.c memory.c misc.c pkcs12.c pkcs7.c poly1305.c poly1305_asm.S poly1305_asm.asm puf.c pwdbased.c random.c rc2.c ripemd.c rng_bank.c rsa.c sakke.c sha.c sha256.c sha256_asm.S sha3.c sha3_asm.S sha512.c sha512_asm.S signature.c siphash.c sm2.c sm3.c sm3_asm.S sm4.c sp_arm32.c sp_arm64.c sp_armthumb.c sp_c32.c sp_c64.c sp_cortexm.c sp_dsp32.c sp_int.c sp_sm2_arm32.c sp_sm2_arm64.c sp_sm2_armthumb.c sp_sm2_c32.c sp_sm2_c64.c sp_sm2_cortexm.c sp_sm2_x86_64.c sp_sm2_x86_64_asm.S sp_x86_64.c sp_x86_64_asm.S sp_x86_64_asm.asm srp.c tfm.c wc_dsp.c wc_encrypt.c wc_lms.c wc_lms_impl.c wc_mldsa_asm.S wc_mlkem.c wc_mlkem_asm.S wc_mlkem_poly.c wc_pkcs11.c wc_port.c wc_she.c wc_slhdsa.c wc_xmss.c wc_xmss_impl.c wolfentropy.c wolfevent.c wolfmath.c
test README.md include.am test-VS2022.sln test-VS2022.vcxproj test-VS2022.vcxproj.user test.c test.h test.sln test.vcproj test_paths.h.in
wolfssl
openssl aes.h asn1.h asn1t.h bio.h bn.h buffer.h camellia.h cmac.h cms.h compat_types.h conf.h crypto.h des.h dh.h dsa.h ec.h ec25519.h ec448.h ecdh.h ecdsa.h ed25519.h ed448.h engine.h err.h evp.h fips_rand.h hmac.h include.am kdf.h lhash.h md4.h md5.h modes.h obj_mac.h objects.h ocsp.h opensslconf.h opensslv.h ossl_typ.h pem.h pkcs12.h pkcs7.h rand.h rc4.h ripemd.h rsa.h safestack.h sha.h sha3.h srp.h ssl.h ssl23.h stack.h tls1.h txt_db.h ui.h x509.h x509_vfy.h x509v3.h
wolfcrypt
port
Espressif esp-sdk-lib.h esp32-crypt.h esp_crt_bundle.h
Renesas renesas-fspsm-crypt.h renesas-fspsm-types.h renesas-rx64-hw-crypt.h renesas-tsip-crypt.h renesas_cmn.h renesas_fspsm_internal.h renesas_sync.h renesas_tsip_internal.h renesas_tsip_types.h
af_alg afalg_hash.h wc_afalg.h
aria aria-crypt.h aria-cryptocb.h
arm cryptoCell.h
atmel atmel.h
autosar CryIf.h Crypto.h Csm.h StandardTypes.h
caam caam_driver.h caam_error.h caam_qnx.h wolfcaam.h wolfcaam_aes.h wolfcaam_cmac.h wolfcaam_ecdsa.h wolfcaam_fsl_nxp.h wolfcaam_hash.h wolfcaam_qnx.h wolfcaam_rsa.h wolfcaam_seco.h wolfcaam_sha.h wolfcaam_x25519.h
cavium cavium_nitrox.h cavium_octeon_sync.h
cypress psoc6_crypto.h
devcrypto wc_devcrypto.h
intel quickassist.h quickassist_mem.h quickassist_sync.h
iotsafe iotsafe.h
kcapi kcapi_dh.h kcapi_ecc.h kcapi_hash.h kcapi_hmac.h kcapi_rsa.h wc_kcapi.h
liboqs liboqs.h
maxim max3266x-cryptocb.h max3266x.h maxq10xx.h
nxp casper_port.h dcp_port.h hashcrypt_port.h ksdk_port.h se050_port.h
pic32 pic32mz-crypt.h
psa psa.h
riscv riscv-64-asm.h
rpi_pico pico.h
silabs silabs_aes.h silabs_ecc.h silabs_hash.h silabs_random.h
st stm32.h stsafe.h
ti ti-ccm.h ti-hash.h
tropicsquare tropic01.h
xilinx xil-sha3.h xil-versal-glue.h xil-versal-trng.h
nrf51.h
aes.h arc4.h ascon.h asn.h asn_public.h async.h blake2-impl.h blake2-int.h blake2.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cpuid.h cryptocb.h curve25519.h curve448.h des3.h dh.h dilithium.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h falcon.h fe_448.h fe_operations.h fips_test.h ge_448.h ge_operations.h hash.h hmac.h hpke.h include.am integer.h kdf.h libwolfssl_sources.h libwolfssl_sources_asm.h logging.h md2.h md4.h md5.h mem_track.h memory.h misc.h mpi_class.h mpi_superclass.h oid_sum.h pkcs11.h pkcs12.h pkcs7.h poly1305.h puf.h pwdbased.h random.h rc2.h ripemd.h rng_bank.h rsa.h sakke.h selftest.h settings.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h sm2.h sm3.h sm4.h sp.h sp_int.h srp.h tfm.h types.h visibility.h wc_encrypt.h wc_lms.h wc_mlkem.h wc_pkcs11.h wc_port.h wc_she.h wc_slhdsa.h wc_xmss.h wolfentropy.h wolfevent.h wolfmath.h
callbacks.h certs_test.h certs_test_sm.h crl.h error-ssl.h include.am internal.h ocsp.h options.h.in quic.h sniffer.h sniffer_error.h sniffer_error.rc ssl.h test.h version.h version.h.in wolfio.h
wrapper
Ada
examples
src aes_verify_main.adb rsa_verify_main.adb sha256_main.adb spark_sockets.adb spark_sockets.ads spark_terminal.adb spark_terminal.ads tls_client.adb tls_client.ads tls_client_main.adb tls_server.adb tls_server.ads tls_server_main.adb
.gitignore alire.toml examples.gpr
tests
src
support test_support.adb test_support.ads tests_root_suite.adb tests_root_suite.ads
aes_bindings_tests.adb aes_bindings_tests.ads rsa_verify_bindings_tests.adb rsa_verify_bindings_tests.ads sha256_bindings_tests.adb sha256_bindings_tests.ads tests.adb
.gitignore README.md alire.toml tests.gpr valgrind.supp
.gitignore README.md ada_binding.c alire.toml default.gpr include.am restricted.adc user_settings.h wolfssl-full_runtime.adb wolfssl-full_runtime.ads wolfssl.adb wolfssl.ads wolfssl.gpr
CSharp
wolfCrypt-Test
Properties AssemblyInfo.cs
App.config wolfCrypt-Test.cs wolfCrypt-Test.csproj
wolfSSL-DTLS-PSK-Server
Properties AssemblyInfo.cs
App.config wolfSSL-DTLS-PSK-Server.cs wolfSSL-DTLS-PSK-Server.csproj
wolfSSL-DTLS-Server
Properties AssemblyInfo.cs
App.config wolfSSL-DTLS-Server.cs wolfSSL-DTLS-Server.csproj
wolfSSL-Example-IOCallbacks
Properties AssemblyInfo.cs
App.config wolfSSL-Example-IOCallbacks.cs wolfSSL-Example-IOCallbacks.csproj
wolfSSL-TLS-Client
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-Client.cs wolfSSL-TLS-Client.csproj
wolfSSL-TLS-PSK-Client
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-PSK-Client.cs wolfSSL-TLS-PSK-Client.csproj
wolfSSL-TLS-PSK-Server
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-PSK-Server.cs wolfSSL-TLS-PSK-Server.csproj
wolfSSL-TLS-Server
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-Server.cs wolfSSL-TLS-Server.csproj
wolfSSL-TLS-ServerThreaded
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-ServerThreaded.cs wolfSSL-TLS-ServerThreaded.csproj
wolfSSL_CSharp
Properties AssemblyInfo.cs Resources.Designer.cs Resources.resx
X509.cs wolfCrypt.cs wolfSSL.cs wolfSSL_CSharp.csproj
README.md include.am user_settings.h wolfSSL_CSharp.sln wolfssl.vcxproj
python README.md
rust
wolfssl-wolfcrypt
src aes.rs blake2.rs chacha20_poly1305.rs cmac.rs cmac_mac.rs curve25519.rs dh.rs dilithium.rs ecc.rs ecdsa.rs ed25519.rs ed448.rs fips.rs hkdf.rs hmac.rs hmac_mac.rs kdf.rs lib.rs lms.rs mlkem.rs mlkem_kem.rs pbkdf2_password_hash.rs prf.rs random.rs rsa.rs rsa_pkcs1v15.rs sha.rs sha_digest.rs sys.rs
tests
common mod.rs
test_aes.rs test_blake2.rs test_chacha20_poly1305.rs test_cmac.rs test_cmac_mac.rs test_curve25519.rs test_dh.rs test_dilithium.rs test_ecc.rs test_ecdsa.rs test_ed25519.rs test_ed448.rs test_hkdf.rs test_hmac.rs test_hmac_mac.rs test_kdf.rs test_lms.rs test_mlkem.rs test_mlkem_kem.rs test_pbkdf2_password_hash.rs test_prf.rs test_random.rs test_rsa.rs test_rsa_pkcs1v15.rs test_sha.rs test_sha_digest.rs test_wolfcrypt.rs
CHANGELOG.md Cargo.lock Cargo.toml Makefile README.md build.rs headers.h
Makefile README.md include.am
include.am
zephyr
samples
wolfssl_benchmark
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
CMakeLists.txt README install_test.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_test
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
CMakeLists.txt README install_test.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_tls_sock
boards native_sim.conf
src tls_sock.c
CMakeLists.txt README install_sample.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_tls_thread
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
src tls_threaded.c
CMakeLists.txt README install_sample.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl options.h
CMakeLists.txt Kconfig Kconfig.tls-generic README.md include.am module.yml user_settings-no-malloc.h user_settings.h zephyr_init.c
.codespellexcludelines .cyignore .editorconfig .gitignore .wolfssl_known_macro_extras AUTHORS CMakeLists.txt CMakePresets.json CMakeSettings.json COPYING ChangeLog.md INSTALL LICENSING LPCExpresso.cproject LPCExpresso.project Makefile.am README README-async.md README.md SCRIPTS-LIST SECURITY-POLICY.md SECURITY-REPORT-TEMPLATE.md Vagrantfile autogen.sh commit-tests.sh configure.ac fips-check.sh fips-hash.sh gencertbuf.pl input pull_to_vagrant.sh quit resource.h stamp-h.in valgrind-bash.supp valgrind-error.sh wnr-example.conf wolfssl-VS2022.vcxproj wolfssl.rc wolfssl.vcproj wolfssl.vcxproj wolfssl64.sln
.clangd .gitignore DOCS.md Makefile README.md assert.c core.c crypto.c env.c fs.c http.c ini.c json.c log.c luna.h main.c makext.mk path.c process.c request.c sqlite.c stash.c template.c util.c
wolfssl/src/crl.c raw
   1/* crl.c
   2 *
   3 * Copyright (C) 2006-2026 wolfSSL Inc.
   4 *
   5 * This file is part of wolfSSL.
   6 *
   7 * wolfSSL is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 3 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * wolfSSL is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20 */
  21
  22#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
  23
  24/*
  25CRL Options:
  26 * CRL_STATIC_REVOKED_LIST:                                        default: off
  27 *                         Enables fixed static list of RevokedCerts to allow
  28 *                         for a binary search.
  29 * CRL_MAX_REVOKED_CERTS:                                          default: 4
  30 *                         Specifies the number of buffers to hold RevokedCerts.
  31 *                         The default value is set to 4.
  32 * CRL_REPORT_LOAD_ERRORS:                                         default: off
  33 *                         Return any errors encountered during loading CRL
  34 *                         from a directory.
  35*/
  36
  37#ifndef WOLFCRYPT_ONLY
  38#ifdef HAVE_CRL
  39
  40#include <wolfssl/internal.h>
  41#include <wolfssl/error-ssl.h>
  42#include <wolfssl/wolfcrypt/logging.h>
  43#include <wolfssl/wolfcrypt/ecc.h>
  44#include <wolfssl/wolfcrypt/rsa.h>
  45#if defined(OPENSSL_EXTRA)
  46#include <wolfssl/openssl/x509v3.h>
  47#endif
  48
  49#ifndef NO_STRING_H
  50    #include <string.h>
  51#endif
  52
  53#ifdef HAVE_CRL_MONITOR
  54    #if defined(__MACH__) || defined(__FreeBSD__) || defined(__linux__) || \
  55         defined(_MSC_VER)
  56        static int StopMonitor(wolfSSL_CRL_mfd_t mfd);
  57    #else
  58        #error "CRL monitor only currently supported on linux or mach or windows"
  59    #endif
  60#endif /* HAVE_CRL_MONITOR */
  61
  62
  63/* Initialize CRL members */
  64int InitCRL(WOLFSSL_CRL* crl, WOLFSSL_CERT_MANAGER* cm)
  65{
  66    WOLFSSL_ENTER("InitCRL");
  67    if(cm != NULL)
  68        crl->heap = cm->heap;
  69    else
  70        crl->heap = NULL;
  71    crl->cm = cm;
  72    crl->crlList  = NULL;
  73    crl->currentEntry = NULL;
  74#ifdef HAVE_CRL_MONITOR
  75    crl->monitors[0].path = NULL;
  76    crl->monitors[1].path = NULL;
  77    crl->tid = INVALID_THREAD_VAL;
  78    crl->mfd = WOLFSSL_CRL_MFD_INIT_VAL;
  79    crl->setup = 0; /* thread setup done predicate */
  80    if (wolfSSL_CondInit(&crl->cond) != 0) {
  81        WOLFSSL_MSG("thread condition init failed");
  82        return BAD_COND_E;
  83    }
  84#endif
  85#ifdef HAVE_CRL_IO
  86    crl->crlIOCb = NULL;
  87#endif
  88    if (wc_InitRwLock(&crl->crlLock) != 0) {
  89        WOLFSSL_MSG("Init Mutex failed");
  90        return BAD_MUTEX_E;
  91    }
  92#ifdef OPENSSL_ALL
  93    {
  94        int ret;
  95        wolfSSL_RefInit(&crl->ref, &ret);
  96    #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  97        if (ret != 0) {
  98            WOLFSSL_MSG("wolfSSL_RefInit failed");
  99            wc_FreeRwLock(&crl->crlLock);
 100        #ifdef HAVE_CRL_MONITOR
 101            wolfSSL_CondFree(&crl->cond);
 102        #endif
 103            return ret;
 104        }
 105    #else
 106        (void)ret;
 107    #endif
 108    }
 109#endif
 110#if defined(OPENSSL_EXTRA)
 111    crl->revokedStack = NULL;
 112#endif
 113
 114    return 0;
 115}
 116
 117
 118#ifdef CRL_STATIC_REVOKED_LIST
 119/* Compare two RevokedCert entries by (serialSz, serialNumber) for sorting.
 120 * Returns < 0, 0, or > 0 like memcmp. */
 121static int CompareRevokedCert(const RevokedCert* a, const RevokedCert* b)
 122{
 123    if (a->serialSz != b->serialSz)
 124        return a->serialSz - b->serialSz;
 125    return XMEMCMP(a->serialNumber, b->serialNumber, (size_t)a->serialSz);
 126}
 127
 128/* Sort revoked cert array in-place using insertion sort. The array is bounded
 129 * by CRL_MAX_REVOKED_CERTS so O(n^2) is fine. */
 130static void SortCRL_CertList(RevokedCert* certs, int totalCerts)
 131{
 132    int i, j;
 133    RevokedCert tmp;
 134
 135    for (i = 1; i < totalCerts; i++) {
 136        XMEMCPY(&tmp, &certs[i], sizeof(RevokedCert));
 137        j = i - 1;
 138        while (j >= 0 && CompareRevokedCert(&certs[j], &tmp) > 0) {
 139            XMEMCPY(&certs[j + 1], &certs[j], sizeof(RevokedCert));
 140            j--;
 141        }
 142        XMEMCPY(&certs[j + 1], &tmp, sizeof(RevokedCert));
 143    }
 144}
 145#endif /* CRL_STATIC_REVOKED_LIST */
 146
 147/* Initialize CRL Entry */
 148static int InitCRL_Entry(CRL_Entry* crle, DecodedCRL* dcrl, const byte* buff,
 149                         int verified, void* heap)
 150{
 151    WOLFSSL_ENTER("InitCRL_Entry");
 152
 153    XMEMCPY(crle->issuerHash, dcrl->issuerHash, CRL_DIGEST_SIZE);
 154    /* XMEMCPY(crle->crlHash, dcrl->crlHash, CRL_DIGEST_SIZE);
 155     * copy the hash here if needed for optimized comparisons */
 156    XMEMCPY(crle->lastDate, dcrl->lastDate, MAX_DATE_SIZE);
 157    XMEMCPY(crle->nextDate, dcrl->nextDate, MAX_DATE_SIZE);
 158    crle->lastDateFormat = dcrl->lastDateFormat;
 159    crle->nextDateFormat = dcrl->nextDateFormat;
 160    crle->version = dcrl->version;
 161
 162#if defined(OPENSSL_EXTRA)
 163    crle->lastDateAsn1.length = MAX_DATE_SIZE;
 164    XMEMCPY (crle->lastDateAsn1.data, crle->lastDate,
 165             (size_t)crle->lastDateAsn1.length);
 166    crle->lastDateAsn1.type = crle->lastDateFormat;
 167    crle->nextDateAsn1.length = MAX_DATE_SIZE;
 168    XMEMCPY (crle->nextDateAsn1.data, crle->nextDate,
 169             (size_t)crle->nextDateAsn1.length);
 170    crle->nextDateAsn1.type = crle->nextDateFormat;
 171
 172    crle->issuer = NULL;
 173    wolfSSL_d2i_X509_NAME(&crle->issuer, (unsigned char**)&dcrl->issuer,
 174                          dcrl->issuerSz);
 175    if (crle->issuer == NULL) {
 176        return WOLFSSL_FATAL_ERROR;
 177    }
 178#endif
 179#ifdef CRL_STATIC_REVOKED_LIST
 180    /* ParseCRL_CertList() has already cached the Revoked certs into
 181       the crle->certs array. Sort it so binary search in
 182       FindRevokedSerial works correctly. */
 183    crle->totalCerts = dcrl->totalCerts;
 184    SortCRL_CertList(crle->certs, crle->totalCerts);
 185#else
 186    crle->certs = dcrl->certs;   /* take ownership */
 187    crle->totalCerts = dcrl->totalCerts;
 188#endif
 189    dcrl->certs = NULL;
 190    crle->crlNumberSet = dcrl->crlNumberSet;
 191    if (crle->crlNumberSet) {
 192        XMEMCPY(crle->crlNumber, dcrl->crlNumber, sizeof(crle->crlNumber));
 193    }
 194    crle->verified = verified;
 195    if (!verified) {
 196        crle->tbsSz = dcrl->sigIndex - dcrl->certBegin;
 197        crle->signatureSz = dcrl->sigLength;
 198        crle->signatureOID = dcrl->signatureOID;
 199        crle->toBeSigned = (byte*)XMALLOC(crle->tbsSz, heap,
 200                                          DYNAMIC_TYPE_CRL_ENTRY);
 201        if (crle->toBeSigned == NULL)
 202            return WOLFSSL_FATAL_ERROR;
 203        crle->signature = (byte*)XMALLOC(crle->signatureSz, heap,
 204                                         DYNAMIC_TYPE_CRL_ENTRY);
 205        if (crle->signature == NULL) {
 206            XFREE(crle->toBeSigned, heap, DYNAMIC_TYPE_CRL_ENTRY);
 207            crle->toBeSigned = NULL;
 208            return WOLFSSL_FATAL_ERROR;
 209        }
 210
 211    #ifdef WC_RSA_PSS
 212        crle->sigParamsSz = dcrl->sigParamsLength;
 213        if (dcrl->sigParamsLength > 0) {
 214            crle->sigParams = (byte*)XMALLOC(crle->sigParamsSz, heap,
 215                                             DYNAMIC_TYPE_CRL_ENTRY);
 216            if (crle->sigParams== NULL) {
 217                XFREE(crle->toBeSigned, heap, DYNAMIC_TYPE_CRL_ENTRY);
 218                crle->toBeSigned = NULL;
 219                XFREE(crle->signature, heap, DYNAMIC_TYPE_CRL_ENTRY);
 220                crle->signature = NULL;
 221                return WOLFSSL_FATAL_ERROR;
 222            }
 223            XMEMCPY(crle->sigParams, buff + dcrl->sigParamsIndex,
 224                crle->sigParamsSz);
 225        }
 226    #endif
 227        XMEMCPY(crle->toBeSigned, buff + dcrl->certBegin, crle->tbsSz);
 228        XMEMCPY(crle->signature, dcrl->signature, crle->signatureSz);
 229    #ifndef NO_SKID
 230        crle->extAuthKeyIdSet = dcrl->extAuthKeyIdSet;
 231        if (crle->extAuthKeyIdSet)
 232            XMEMCPY(crle->extAuthKeyId, dcrl->extAuthKeyId, KEYID_SIZE);
 233    #endif
 234    }
 235    else {
 236        crle->toBeSigned = NULL;
 237        crle->signature = NULL;
 238    }
 239
 240    (void)verified;
 241    (void)heap;
 242
 243    return 0;
 244}
 245
 246static CRL_Entry* CRL_Entry_new(void* heap)
 247{
 248    CRL_Entry* crle = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), heap,
 249                                          DYNAMIC_TYPE_CRL_ENTRY);
 250    if (crle != NULL) {
 251        XMEMSET(crle, 0, sizeof(CRL_Entry));
 252        if (wc_InitMutex(&crle->verifyMutex) != 0) {
 253            XFREE(crle, heap, DYNAMIC_TYPE_CRL_ENTRY);
 254            crle = NULL;
 255        }
 256    }
 257    (void)heap;
 258    return crle;
 259}
 260
 261/* Free all CRL Entry resources */
 262static void CRL_Entry_free(CRL_Entry* crle, void* heap)
 263{
 264    WOLFSSL_ENTER("CRL_Entry_free");
 265    if (crle == NULL) {
 266        WOLFSSL_MSG("CRL Entry is null");
 267        return;
 268    }
 269#ifdef CRL_STATIC_REVOKED_LIST
 270#if defined(OPENSSL_EXTRA)
 271    {
 272        int i;
 273        for (i = 0; i < CRL_MAX_REVOKED_CERTS; i++) {
 274            XFREE(crle->certs[i].extensions, heap, DYNAMIC_TYPE_REVOKED);
 275        }
 276    }
 277#endif
 278    XMEMSET(crle->certs, 0, CRL_MAX_REVOKED_CERTS*sizeof(RevokedCert));
 279#else
 280    {
 281        RevokedCert* tmp;
 282        RevokedCert* next;
 283
 284        for (tmp = crle->certs; tmp != NULL; tmp = next) {
 285            next = tmp->next;
 286#if defined(OPENSSL_EXTRA)
 287            XFREE(tmp->extensions, heap, DYNAMIC_TYPE_REVOKED);
 288#endif
 289            XFREE(tmp, heap, DYNAMIC_TYPE_REVOKED);
 290        }
 291
 292    }
 293#endif
 294    XFREE(crle->signature, heap, DYNAMIC_TYPE_CRL_ENTRY);
 295    XFREE(crle->toBeSigned, heap, DYNAMIC_TYPE_CRL_ENTRY);
 296#ifdef WC_RSA_PSS
 297    XFREE(crle->sigParams, heap, DYNAMIC_TYPE_CRL_ENTRY);
 298#endif
 299#if defined(OPENSSL_EXTRA)
 300    if (crle->issuer != NULL) {
 301        FreeX509Name(crle->issuer);
 302        XFREE(crle->issuer, heap, DYNAMIC_TYPE_X509);
 303    }
 304#endif
 305    wc_FreeMutex(&crle->verifyMutex);
 306    XFREE(crle, heap, DYNAMIC_TYPE_CRL_ENTRY);
 307    (void)heap;
 308}
 309
 310
 311/* Free all CRL resources */
 312void FreeCRL(WOLFSSL_CRL* crl, int dynamic)
 313{
 314    CRL_Entry* tmp;
 315
 316    WOLFSSL_ENTER("FreeCRL");
 317
 318    if (crl == NULL)
 319        return;
 320
 321#ifdef OPENSSL_ALL
 322    {
 323        int ret;
 324        int doFree = 0;
 325        wolfSSL_RefDec(&crl->ref, &doFree, &ret);
 326        if (ret != 0)
 327            WOLFSSL_MSG("Couldn't lock x509 mutex");
 328        if (!doFree)
 329            return;
 330    }
 331#endif
 332
 333#ifdef HAVE_CRL_MONITOR
 334    if (crl->tid != INVALID_THREAD_VAL) {
 335        WOLFSSL_MSG("stopping monitor thread");
 336        if (StopMonitor(crl->mfd) == 0) {
 337            if (wolfSSL_JoinThread(crl->tid) != 0)
 338                WOLFSSL_MSG("stop monitor failed in wolfSSL_JoinThread");
 339        }
 340        else {
 341            WOLFSSL_MSG("stop monitor failed");
 342        }
 343    }
 344    if (wolfSSL_CondFree(&crl->cond) != 0)
 345        WOLFSSL_MSG("wolfSSL_CondFree failed in FreeCRL");
 346#endif
 347
 348#ifdef OPENSSL_ALL
 349    wolfSSL_RefFree(&crl->ref);
 350#endif
 351
 352    tmp = crl->crlList;
 353#ifdef HAVE_CRL_MONITOR
 354    if (crl->monitors[0].path)
 355        XFREE(crl->monitors[0].path, crl->heap, DYNAMIC_TYPE_CRL_MONITOR);
 356
 357    if (crl->monitors[1].path)
 358        XFREE(crl->monitors[1].path, crl->heap, DYNAMIC_TYPE_CRL_MONITOR);
 359#endif
 360
 361#if defined(OPENSSL_EXTRA)
 362    if (crl->revokedStack != NULL) {
 363        wolfSSL_sk_pop_free(crl->revokedStack, NULL);
 364        crl->revokedStack = NULL;
 365    }
 366#endif
 367    XFREE(crl->currentEntry, crl->heap, DYNAMIC_TYPE_CRL_ENTRY);
 368    crl->currentEntry = NULL;
 369    while(tmp) {
 370        CRL_Entry* next = tmp->next;
 371        CRL_Entry_free(tmp, crl->heap);
 372        tmp = next;
 373    }
 374
 375    wc_FreeRwLock(&crl->crlLock);
 376    if (dynamic)   /* free self */
 377        XFREE(crl, crl->heap, DYNAMIC_TYPE_CRL);
 378}
 379
 380static int FindRevokedSerial(RevokedCert* rc, byte* serial, int serialSz,
 381        byte* serialHash, int totalCerts)
 382{
 383    int ret = 0;
 384    byte hash[SIGNER_DIGEST_SIZE];
 385#ifdef CRL_STATIC_REVOKED_LIST
 386    if (serialHash == NULL) {
 387        /* Binary search by (serialSz, serialNumber). The array was sorted in
 388         * InitCRL_Entry by the same comparison key. */
 389        int low = 0;
 390        int high = totalCerts - 1;
 391
 392        while (low <= high) {
 393            int mid = (low + high) / 2;
 394            int cmp;
 395
 396            /* Compare by serial size first, then by serial content. Shorter
 397             * serials sort before longer ones. */
 398            if (rc[mid].serialSz != serialSz) {
 399                cmp = rc[mid].serialSz - serialSz;
 400            }
 401            else {
 402                cmp = XMEMCMP(rc[mid].serialNumber, serial,
 403                              (size_t)rc[mid].serialSz);
 404            }
 405
 406            if (cmp < 0) {
 407                low = mid + 1;
 408            }
 409            else if (cmp > 0) {
 410                high = mid - 1;
 411            }
 412            else {
 413                WOLFSSL_MSG("Cert revoked");
 414                ret = CRL_CERT_REVOKED;
 415                break;
 416            }
 417        }
 418    }
 419    else {
 420        /* Hash-based lookup -- linear scan required since the array is sorted
 421         * by serial number, not by hash. */
 422        int i;
 423        for (i = 0; i < totalCerts; i++) {
 424            ret = CalcHashId(rc[i].serialNumber, (word32)rc[i].serialSz, hash);
 425            if (ret != 0)
 426                break;
 427            if (XMEMCMP(hash, serialHash, SIGNER_DIGEST_SIZE) == 0) {
 428                WOLFSSL_MSG("Cert revoked");
 429                ret = CRL_CERT_REVOKED;
 430                break;
 431            }
 432        }
 433    }
 434#else
 435    (void)totalCerts;
 436    /* search in the linked list*/
 437    while (rc) {
 438        if (serialHash == NULL) {
 439            if (rc->serialSz == serialSz &&
 440                   XMEMCMP(rc->serialNumber, serial, (size_t)rc->serialSz) == 0) {
 441                WOLFSSL_MSG("Cert revoked");
 442                ret = CRL_CERT_REVOKED;
 443                break;
 444            }
 445        }
 446        else {
 447            ret = CalcHashId(rc->serialNumber, (word32)rc->serialSz, hash);
 448            if (ret != 0)
 449                break;
 450            if (XMEMCMP(hash, serialHash, SIGNER_DIGEST_SIZE) == 0) {
 451                WOLFSSL_MSG("Cert revoked");
 452                ret = CRL_CERT_REVOKED;
 453                break;
 454            }
 455        }
 456        rc = rc->next;
 457    }
 458#endif
 459    return ret;
 460}
 461
 462static int VerifyCRLE(const WOLFSSL_CRL* crl, CRL_Entry* crle)
 463{
 464    Signer* ca = NULL;
 465    SignatureCtx sigCtx;
 466    int ret = 0;
 467
 468#ifndef NO_SKID
 469    if (crle->extAuthKeyIdSet)
 470        ca = GetCA(crl->cm, crle->extAuthKeyId);
 471    if (ca == NULL)
 472        ca = GetCAByName(crl->cm, crle->issuerHash);
 473#else /* NO_SKID */
 474    ca = GetCA(crl->cm, crle->issuerHash);
 475#endif /* NO_SKID */
 476    if (ca == NULL) {
 477        WOLFSSL_MSG("Did NOT find CRL issuer CA");
 478        return ASN_CRL_NO_SIGNER_E;
 479    }
 480
 481    ret = VerifyCRL_Signature(&sigCtx, crle->toBeSigned, crle->tbsSz,
 482            crle->signature, crle->signatureSz, crle->signatureOID,
 483        #ifdef WC_RSA_PSS
 484            crle->sigParams, (int)crle->sigParamsSz,
 485        #else
 486            NULL, 0,
 487        #endif
 488            ca, crl->heap);
 489
 490    if (ret == 0) {
 491        crle->verified = 1;
 492    }
 493    else {
 494        crle->verified = ret;
 495    }
 496
 497    return ret;
 498}
 499
 500static int CheckCertCRLList(WOLFSSL_CRL* crl, byte* issuerHash, byte* serial,
 501        int serialSz, byte* serialHash, int *pFoundEntry)
 502{
 503    CRL_Entry* crle;
 504    int        foundEntry = 0;
 505    int        ret = 0;
 506
 507    if (wc_LockRwLock_Rd(&crl->crlLock) != 0) {
 508        WOLFSSL_MSG("wc_LockRwLock_Rd failed");
 509        return BAD_MUTEX_E;
 510    }
 511
 512    for (crle = crl->crlList; crle != NULL; crle = crle->next) {
 513        if (XMEMCMP(crle->issuerHash, issuerHash, CRL_DIGEST_SIZE) == 0) {
 514            int nextDateValid = 1;
 515
 516            WOLFSSL_MSG("Found CRL Entry on list");
 517
 518            if (crle->verified == 0) {
 519                if (wc_LockMutex(&crle->verifyMutex) != 0) {
 520                    WOLFSSL_MSG("wc_LockMutex failed");
 521                    break;
 522                }
 523
 524                /* A different thread may have verified the entry while we were
 525                 * waiting for the mutex. */
 526                if (crle->verified == 0)
 527                    ret = VerifyCRLE(crl, crle);
 528
 529                wc_UnLockMutex(&crle->verifyMutex);
 530
 531                if (ret != 0)
 532                    break;
 533            }
 534
 535            if (crle->verified < 0) {
 536                WOLFSSL_MSG("Cannot use CRL as it didn't verify");
 537                ret = crle->verified;
 538                break;
 539            }
 540
 541            WOLFSSL_MSG("Checking next date validity");
 542
 543        #ifdef WOLFSSL_NO_CRL_NEXT_DATE
 544            if (crle->nextDateFormat != ASN_OTHER_TYPE)
 545        #endif
 546            {
 547            #if !defined(NO_ASN_TIME) && !defined(WOLFSSL_NO_CRL_DATE_CHECK)
 548                if (!XVALIDATE_DATE(crle->nextDate, crle->nextDateFormat,
 549                                   ASN_AFTER, MAX_DATE_SIZE)) {
 550                    WOLFSSL_MSG("CRL next date is no longer valid");
 551                    nextDateValid = 0;
 552                }
 553            #endif
 554            }
 555            if (nextDateValid) {
 556                foundEntry = 1;
 557                ret = FindRevokedSerial(crle->certs, serial, serialSz,
 558                        serialHash, crle->totalCerts);
 559                if (ret != 0)
 560                    break;
 561            }
 562            else if (foundEntry == 0) {
 563                ret = CRL_CERT_DATE_ERR;
 564            }
 565        }
 566    }
 567
 568    wc_UnLockRwLock(&crl->crlLock);
 569
 570    *pFoundEntry = foundEntry;
 571
 572    return ret;
 573}
 574
 575int CheckCertCRL_ex(WOLFSSL_CRL* crl, byte* issuerHash, byte* serial,
 576        int serialSz, byte* serialHash, const byte* extCrlInfo,
 577        int extCrlInfoSz, void* issuerName)
 578{
 579    int        foundEntry = 0;
 580    int        ret = 0;
 581
 582    WOLFSSL_ENTER("CheckCertCRL");
 583    (void)issuerName;
 584
 585    if ((serial == NULL || serialSz == 0) && serialHash == NULL) {
 586        WOLFSSL_MSG("Either serial or hash has to be provided");
 587        return BUFFER_ERROR;
 588    }
 589
 590#ifdef WOLFSSL_CRL_ALLOW_MISSING_CDP
 591    /* Skip CRL verification in case no CDP in peer cert */
 592    if (!extCrlInfo) {
 593        return ret;
 594    }
 595#endif
 596
 597    ret = CheckCertCRLList(crl, issuerHash, serial, serialSz, serialHash,
 598            &foundEntry);
 599
 600#ifdef HAVE_CRL_IO
 601    if (foundEntry == 0) {
 602        /* perform embedded lookup */
 603        if (crl->crlIOCb) {
 604            int cbRet = crl->crlIOCb(crl, (const char*)extCrlInfo,
 605                                     extCrlInfoSz);
 606            if (cbRet == WC_NO_ERR_TRACE(WOLFSSL_CBIO_ERR_WANT_READ)) {
 607                ret = OCSP_WANT_READ;
 608            }
 609            else if (cbRet >= 0) {
 610                /* try again */
 611                ret = CheckCertCRLList(crl, issuerHash, serial, serialSz,
 612                        serialHash, &foundEntry);
 613            }
 614        }
 615    }
 616#endif
 617
 618#if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
 619    (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
 620    !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \
 621    !defined(NO_STDIO_FILESYSTEM) && \
 622    (!defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH))
 623    /* if not find entry in the CRL list, it looks at the folder that sets  */
 624    /* by LOOKUP_ctrl because user would want to use hash_dir.              */
 625    /* Loading <issuer-hash>.rN form CRL file if find at the folder,        */
 626    /* and try again checking Cert in the CRL list.                         */
 627    /* When not set the folder or not use hash_dir, do nothing.             */
 628    if ((foundEntry == 0) && (ret != WC_NO_ERR_TRACE(OCSP_WANT_READ))) {
 629        if (crl->cm != NULL && crl->cm->x509_store_p != NULL) {
 630            int loadRet = LoadCertByIssuer(crl->cm->x509_store_p,
 631                          (WOLFSSL_X509_NAME*)issuerName, X509_LU_CRL);
 632            if (loadRet == WOLFSSL_SUCCESS) {
 633                /* try again */
 634                ret = CheckCertCRLList(crl, issuerHash, serial, serialSz,
 635                        serialHash, &foundEntry);
 636            }
 637        }
 638    }
 639#endif
 640    if (foundEntry == 0) {
 641        WOLFSSL_MSG("Couldn't find CRL for status check");
 642        if (ret != WC_NO_ERR_TRACE(CRL_CERT_DATE_ERR)) {
 643            ret = CRL_MISSING;
 644        }
 645
 646        if (crl->cm != NULL && crl->cm->cbMissingCRL) {
 647            char url[256];
 648
 649            WOLFSSL_MSG("Issuing missing CRL callback");
 650            url[0] = '\0';
 651            if (extCrlInfo) {
 652                if (extCrlInfoSz < (int)sizeof(url) -1 ) {
 653                    XMEMCPY(url, extCrlInfo, (size_t)extCrlInfoSz);
 654                    url[extCrlInfoSz] = '\0';
 655                }
 656                else  {
 657                    WOLFSSL_MSG("CRL url too long");
 658                }
 659            }
 660
 661            crl->cm->cbMissingCRL(url);
 662        }
 663
 664        if (crl->cm != NULL && crl->cm->crlCb &&
 665                crl->cm->crlCb(ret, crl, crl->cm, crl->cm->crlCbCtx)) {
 666            if (ret != 0)
 667                WOLFSSL_MSG("Overriding CRL error");
 668            ret = 0;
 669        }
 670    }
 671
 672    return ret;
 673}
 674
 675/* Is the cert ok with CRL, return 0 on success */
 676int CheckCertCRL(WOLFSSL_CRL* crl, DecodedCert* cert)
 677{
 678#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
 679    void* issuerName = cert->issuerName;
 680#else
 681    void* issuerName = NULL;
 682#endif
 683    return CheckCertCRL_ex(crl, cert->issuerHash, cert->serial, cert->serialSz,
 684            NULL, cert->extCrlInfo, cert->extCrlInfoSz, issuerName);
 685}
 686
 687#ifdef HAVE_CRL_UPDATE_CB
 688static void SetCrlInfo(CRL_Entry* entry, CrlInfo *info)
 689{
 690    info->issuerHash = (byte *)entry->issuerHash;
 691    info->issuerHashLen = CRL_DIGEST_SIZE;
 692    info->lastDate = (byte *)entry->lastDate;
 693    info->lastDateMaxLen = MAX_DATE_SIZE;
 694    info->lastDateFormat = entry->lastDateFormat;
 695    info->nextDate = (byte *)entry->nextDate;
 696    info->nextDateMaxLen = MAX_DATE_SIZE;
 697    info->nextDateFormat = entry->nextDateFormat;
 698    info->crlNumberSet = entry->crlNumberSet;
 699    if (info->crlNumberSet)
 700        XMEMCPY(info->crlNumber, entry->crlNumber, sizeof(entry->crlNumber));
 701}
 702
 703static void SetCrlInfoFromDecoded(DecodedCRL* entry, CrlInfo *info)
 704{
 705    info->issuerHash = (byte *)entry->issuerHash;
 706    info->issuerHashLen = SIGNER_DIGEST_SIZE;
 707    info->lastDate = (byte *)entry->lastDate;
 708    info->lastDateMaxLen = MAX_DATE_SIZE;
 709    info->lastDateFormat = entry->lastDateFormat;
 710    info->nextDate = (byte *)entry->nextDate;
 711    info->nextDateMaxLen = MAX_DATE_SIZE;
 712    info->nextDateFormat = entry->nextDateFormat;
 713    info->crlNumberSet = entry->crlNumberSet;
 714    if (info->crlNumberSet)
 715        XMEMCPY(info->crlNumber, entry->crlNumber, sizeof(entry->crlNumber));
 716}
 717#endif
 718
 719/* Returns MP_GT if prev crlNumber is smaller
 720 *         MP_EQ if equal
 721 *         MP_LT if prev crlNumber is larger */
 722static int CompareCRLnumber(CRL_Entry* prev, CRL_Entry* curr)
 723{
 724    int ret = 0;
 725    DECL_MP_INT_SIZE_DYN(prev_num, CRL_MAX_NUM_SZ_BITS,
 726                                   CRL_MAX_NUM_SZ_BITS);
 727    DECL_MP_INT_SIZE_DYN(curr_num, CRL_MAX_NUM_SZ_BITS,
 728                                   CRL_MAX_NUM_SZ_BITS);
 729
 730    NEW_MP_INT_SIZE(prev_num, CRL_MAX_NUM_SZ_BITS, NULL,
 731                                   DYNAMIC_TYPE_TMP_BUFFER);
 732    NEW_MP_INT_SIZE(curr_num, CRL_MAX_NUM_SZ_BITS, NULL,
 733                                   DYNAMIC_TYPE_TMP_BUFFER);
 734#ifdef MP_INT_SIZE_CHECK_NULL
 735    if ((prev_num == NULL) || (curr_num == NULL)) {
 736        ret = MEMORY_E;
 737    }
 738#endif
 739
 740    if (ret == 0 && ((INIT_MP_INT_SIZE(prev_num, CRL_MAX_NUM_SZ_BITS)
 741                != MP_OKAY) || (INIT_MP_INT_SIZE(curr_num,
 742                CRL_MAX_NUM_SZ_BITS)) != MP_OKAY)) {
 743        ret = MP_INIT_E;
 744    }
 745
 746    if (ret == 0 && (mp_read_radix(prev_num, (char*)prev->crlNumber,
 747                MP_RADIX_HEX) != MP_OKAY ||
 748                mp_read_radix(curr_num, (char*)curr->crlNumber,
 749                MP_RADIX_HEX) != MP_OKAY)) {
 750        ret = BAD_FUNC_ARG;
 751    }
 752
 753    if (ret == 0)
 754        ret = mp_cmp(prev_num, curr_num);
 755
 756    FREE_MP_INT_SIZE(prev_num, NULL, DYNAMIC_TYPE_TMP_BUFFER);
 757    FREE_MP_INT_SIZE(curr_num, NULL, DYNAMIC_TYPE_TMP_BUFFER);
 758
 759    return ret;
 760}
 761
 762/* Add or replace a decoded CRL, 0 on success */
 763static int AddCRL(WOLFSSL_CRL* crl, DecodedCRL* dcrl, CRL_Entry* crle,
 764                  const byte* buff, int verified)
 765{
 766    CRL_Entry* curr = NULL;
 767    CRL_Entry* prev = NULL;
 768#ifdef HAVE_CRL_UPDATE_CB
 769    CrlInfo old;
 770    CrlInfo cnew;
 771#endif
 772    int ret = 0;
 773
 774    WOLFSSL_ENTER("AddCRL");
 775
 776    if (crl == NULL)
 777        return WOLFSSL_FATAL_ERROR;
 778
 779    if (InitCRL_Entry(crle, dcrl, buff, verified, crl->heap) < 0) {
 780        WOLFSSL_MSG("Init CRL Entry failed");
 781        return WOLFSSL_FATAL_ERROR;
 782    }
 783
 784    if (wc_LockRwLock_Wr(&crl->crlLock) != 0) {
 785        WOLFSSL_MSG("wc_LockRwLock_Wr failed");
 786        return BAD_MUTEX_E;
 787    }
 788
 789    for (curr = crl->crlList; curr != NULL; curr = curr->next) {
 790        if (XMEMCMP(curr->issuerHash, crle->issuerHash, CRL_DIGEST_SIZE) == 0) {
 791            ret = CompareCRLnumber(crle, curr);
 792            /* Error out if the CRL we're attempting to add isn't more
 793             * authoritative than the existing entry */
 794            if (ret == MP_LT || ret == MP_EQ) {
 795                WOLFSSL_MSG("Same or newer CRL entry already exists");
 796                wc_UnLockRwLock(&crl->crlLock);
 797                return DUPE_ENTRY_E;
 798            }
 799            else if (ret < 0) {
 800                WOLFSSL_MSG("Error comparing CRL Numbers");
 801                wc_UnLockRwLock(&crl->crlLock);
 802                return ret;
 803            }
 804
 805            /* Insert the new entry after the current entry. */
 806            crle->next = curr->next;
 807            if (prev != NULL) {
 808                prev->next = crle;
 809            }
 810            else {
 811                crl->crlList = crle;
 812            }
 813
 814#ifdef HAVE_CRL_UPDATE_CB
 815            if (crl->cm && crl->cm->cbUpdateCRL != NULL) {
 816                SetCrlInfo(curr, &old);
 817                SetCrlInfo(crle, &cnew);
 818                crl->cm->cbUpdateCRL(&old, &cnew);
 819            }
 820#endif
 821
 822            /* Remove the current entry which was replaced */
 823            CRL_Entry_free(curr, crl->heap);
 824
 825            break;
 826        }
 827        prev = curr;
 828    }
 829
 830    if (curr == NULL) {
 831        /* No replacement occurred, prepend the new entry. */
 832        crle->next = crl->crlList;
 833        crl->crlList = crle;
 834    }
 835
 836    wc_UnLockRwLock(&crl->crlLock);
 837    return 0;
 838}
 839
 840
 841/* Load CRL File of type, WOLFSSL_SUCCESS on ok */
 842int BufferLoadCRL(WOLFSSL_CRL* crl, const byte* buff, long sz, int type,
 843                  int verify)
 844{
 845    int          ret = WOLFSSL_SUCCESS;
 846    const byte*  myBuffer = buff;    /* if DER ok, otherwise switch */
 847    DerBuffer*   der = NULL;
 848    WC_DECLARE_VAR(dcrl, DecodedCRL, 1, 0);
 849
 850    WOLFSSL_ENTER("BufferLoadCRL");
 851
 852    if (crl == NULL || buff == NULL || sz == 0)
 853        return BAD_FUNC_ARG;
 854
 855    if (type == WOLFSSL_FILETYPE_PEM) {
 856    #ifdef WOLFSSL_PEM_TO_DER
 857        ret = PemToDer(buff, sz, CRL_TYPE, &der, NULL, NULL, NULL);
 858        if (ret == 0) {
 859            myBuffer = der->buffer;
 860            sz = der->length;
 861        }
 862        else {
 863            WOLFSSL_MSG("Pem to Der failed");
 864            FreeDer(&der);
 865            return WOLFSSL_FATAL_ERROR;
 866        }
 867    #else
 868        ret = NOT_COMPILED_IN;
 869    #endif
 870    }
 871
 872#ifdef WOLFSSL_SMALL_STACK
 873    dcrl = (DecodedCRL*)XMALLOC(sizeof(DecodedCRL), NULL, DYNAMIC_TYPE_TMP_BUFFER);
 874    if (dcrl == NULL) {
 875        FreeDer(&der);
 876        return MEMORY_E;
 877    }
 878#endif
 879
 880    crl->currentEntry = CRL_Entry_new(crl->heap);
 881    if (crl->currentEntry == NULL) {
 882        WOLFSSL_MSG_CERT_LOG("alloc CRL Entry failed");
 883        WC_FREE_VAR_EX(dcrl, NULL, DYNAMIC_TYPE_TMP_BUFFER);
 884        FreeDer(&der);
 885        return MEMORY_E;
 886    }
 887
 888    InitDecodedCRL(dcrl, crl->heap);
 889    ret = ParseCRL(crl->currentEntry->certs, dcrl, myBuffer, (word32)sz,
 890                   verify, crl->cm);
 891
 892    if (ret != 0 && !(ret == WC_NO_ERR_TRACE(ASN_CRL_NO_SIGNER_E)
 893                      && verify == NO_VERIFY)) {
 894        WOLFSSL_MSG_CERT_LOG("ParseCRL error");
 895        WOLFSSL_MSG_CERT_EX("ParseCRL verify = %d, ret = %d", verify, ret);
 896        CRL_Entry_free(crl->currentEntry, crl->heap);
 897        crl->currentEntry = NULL;
 898    }
 899    else {
 900        ret = AddCRL(crl, dcrl, crl->currentEntry, myBuffer,
 901                     ret != WC_NO_ERR_TRACE(ASN_CRL_NO_SIGNER_E));
 902        if (ret != 0) {
 903            WOLFSSL_MSG_CERT_LOG("AddCRL error");
 904            CRL_Entry_free(crl->currentEntry, crl->heap);
 905        }
 906        /* Entry now is in the list, or has been freed due to error */
 907        crl->currentEntry = NULL;
 908    }
 909
 910    FreeDecodedCRL(dcrl);
 911
 912    WC_FREE_VAR_EX(dcrl, NULL, DYNAMIC_TYPE_TMP_BUFFER);
 913
 914    FreeDer(&der);
 915
 916    return ret ? ret : WOLFSSL_SUCCESS; /* convert 0 to WOLFSSL_SUCCESS */
 917}
 918
 919/* Store CRL into a buffer in DER or PEM format.
 920 * If buff is NULL, updates inOutSz with required size and returns success.
 921 * Returns WOLFSSL_SUCCESS on success, negative on failure.
 922 */
 923int BufferStoreCRL(WOLFSSL_CRL* crl, byte* buff, long* inOutSz, int type)
 924{
 925    int ret = 0;
 926    CRL_Entry* ent = NULL;
 927    const byte* tbs = NULL;
 928    word32 tbsSz = 0;
 929    const byte* sig = NULL;
 930    word32 sigSz = 0;
 931    word32 sigOID = 0;
 932#ifdef WC_RSA_PSS
 933    const byte* sigParams = NULL;
 934    word32 sigParamsSz = 0;
 935#endif
 936    word32 algoLen = 0;
 937    word32 bitHdrLen = 0;
 938    word32 totalContentLen = 0;
 939    word32 outerHdrLen = 0;
 940    word32 derNeeded = 0;
 941    long outSz = 0;
 942
 943    WOLFSSL_ENTER("BufferStoreCRL");
 944
 945    if (crl == NULL || inOutSz == NULL) {
 946        return BAD_FUNC_ARG;
 947    }
 948
 949    outSz = *inOutSz;
 950
 951    /* Access the first CRL entry. Lock is held until encoding is complete
 952     * to prevent the entry from being freed by another thread. */
 953    if (wc_LockRwLock_Rd(&crl->crlLock) != 0) {
 954        WOLFSSL_MSG("wc_LockRwLock_Rd failed");
 955        return BAD_MUTEX_E;
 956    }
 957    ent = crl->crlList;
 958    if (ent != NULL) {
 959        tbs = ent->toBeSigned;
 960        tbsSz = ent->tbsSz;
 961        sig = ent->signature;
 962        sigSz = ent->signatureSz;
 963        sigOID = ent->signatureOID;
 964#ifdef WC_RSA_PSS
 965        sigParams = ent->sigParams;
 966        sigParamsSz = ent->sigParamsSz;
 967#endif
 968    }
 969
 970    if (ent == NULL || tbs == NULL || tbsSz == 0 || sig == NULL || sigSz == 0) {
 971        WOLFSSL_MSG("CRL entry missing toBeSigned/signature data");
 972        ret = BAD_FUNC_ARG;
 973    }
 974
 975    /* Calculate encoded lengths for AlgorithmIdentifier. */
 976    if (ret == 0) {
 977#ifdef WC_RSA_PSS
 978        if (sigParams != NULL && sigParamsSz > 0) {
 979            /* OID + explicit parameters inside SEQUENCE */
 980            word32 oidSz = 0;
 981            word32 idLen;
 982            const byte* oid = OidFromId(sigOID, oidSigType, &oidSz);
 983            if (oid == NULL) {
 984                WOLFSSL_MSG("Unknown signature OID for CRL");
 985                ret = WOLFSSL_FATAL_ERROR;
 986            }
 987            else {
 988                /* OBJECT IDENTIFIER header */
 989                idLen = (word32)SetObjectId((int)oidSz, NULL);
 990                algoLen = SetSequence(idLen + oidSz + sigParamsSz, NULL)
 991                        + idLen + oidSz + sigParamsSz;
 992            }
 993        }
 994        else
 995#endif
 996        {
 997            algoLen = SetAlgoID((int)sigOID, NULL, oidSigType, 0);
 998            if (algoLen == 0) {
 999                WOLFSSL_MSG("SetAlgoID failed");
1000                ret = WOLFSSL_FATAL_ERROR;
1001            }
1002        }
1003    }
1004
1005    if (ret == 0) {
1006        /* BIT STRING header for signature */
1007        bitHdrLen = SetBitString(sigSz, 0, NULL);
1008
1009        /* Compute total DER size. */
1010        totalContentLen = tbsSz + algoLen + bitHdrLen + sigSz;
1011        outerHdrLen = SetSequence(totalContentLen, NULL);
1012        derNeeded = outerHdrLen + totalContentLen;
1013    }
1014
1015    if (ret == 0 && type == WOLFSSL_FILETYPE_ASN1) {
1016        if (buff == NULL) {
1017            *inOutSz = (long)derNeeded;
1018            ret = WOLFSSL_SUCCESS;
1019        }
1020        else if ((long)derNeeded > outSz) {
1021            WOLFSSL_MSG("Output buffer too small for DER CRL");
1022            ret = BUFFER_E;
1023        }
1024        else {
1025            /* Encode DER CRL directly into caller buffer. */
1026            word32 pos = 0;
1027#ifdef WC_RSA_PSS
1028            word32 oidSz = 0;
1029            const byte* oid = NULL;
1030#endif
1031            /* Outer SEQUENCE header */
1032            pos += SetSequence(totalContentLen, buff + pos);
1033            /* tbsCertList */
1034            XMEMCPY(buff + pos, tbs, tbsSz);
1035            pos += tbsSz;
1036
1037            /* signatureAlgorithm AlgorithmIdentifier */
1038#ifdef WC_RSA_PSS
1039            if (sigParams != NULL && sigParamsSz > 0) {
1040                /* Lookup OID bytes for signature algorithm. */
1041                oid = OidFromId(sigOID, oidSigType, &oidSz);
1042                if (oid == NULL) {
1043                    WOLFSSL_MSG("Unknown signature OID for CRL");
1044                    ret = WOLFSSL_FATAL_ERROR;
1045                }
1046                else {
1047                    /* SEQUENCE header for AlgorithmIdentifier */
1048                    pos += SetSequence((word32)SetObjectId((int)oidSz, NULL) +
1049                                       oidSz + sigParamsSz, buff + pos);
1050                    /* OBJECT IDENTIFIER header and content */
1051                    pos += (word32)SetObjectId((int)oidSz, buff + pos);
1052                    XMEMCPY(buff + pos, oid, oidSz);
1053                    pos += oidSz;
1054                    /* Parameters as captured (already DER encoded) */
1055                    XMEMCPY(buff + pos, sigParams, sigParamsSz);
1056                    pos += sigParamsSz;
1057                }
1058            }
1059            else
1060#endif
1061            {
1062                pos += SetAlgoID((int)sigOID, buff + pos, oidSigType, 0);
1063            }
1064
1065#ifdef WC_RSA_PSS
1066            if (ret == 0)
1067#endif
1068            {
1069                /* signature BIT STRING and bytes */
1070                pos += SetBitString(sigSz, 0, buff + pos);
1071                XMEMCPY(buff + pos, sig, sigSz);
1072
1073                *inOutSz = (long)derNeeded;
1074                ret = WOLFSSL_SUCCESS;
1075            }
1076            (void)pos; /* pos not used after this point */
1077        }
1078    }
1079#ifdef WOLFSSL_DER_TO_PEM
1080    else if (ret == 0 && type == WOLFSSL_FILETYPE_PEM) {
1081        byte* derTmp = NULL;
1082        int pemSz;
1083        /* Build DER first in a temporary buffer. */
1084        derTmp = (byte*)XMALLOC(derNeeded, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
1085        if (derTmp == NULL) {
1086            ret = MEMORY_E;
1087        }
1088
1089        if (ret == 0) {
1090            /* Encode DER CRL into temporary buffer. */
1091            word32 pos = 0;
1092#ifdef WC_RSA_PSS
1093            word32 oidSz = 0;
1094            const byte* oid = NULL;
1095#endif
1096            pos += SetSequence(totalContentLen, derTmp + pos);
1097            XMEMCPY(derTmp + pos, tbs, tbsSz);
1098            pos += tbsSz;
1099#ifdef WC_RSA_PSS
1100            if (sigParams != NULL && sigParamsSz > 0) {
1101                oid = OidFromId(sigOID, oidSigType, &oidSz);
1102                if (oid == NULL) {
1103                    ret = WOLFSSL_FATAL_ERROR;
1104                }
1105                else {
1106                    pos += SetSequence((word32)SetObjectId((int)oidSz, NULL) +
1107                                       oidSz + sigParamsSz, derTmp + pos);
1108                    pos += (word32)SetObjectId((int)oidSz, derTmp + pos);
1109                    XMEMCPY(derTmp + pos, oid, oidSz);
1110                    pos += oidSz;
1111                    XMEMCPY(derTmp + pos, sigParams, sigParamsSz);
1112                    pos += sigParamsSz;
1113                }
1114            }
1115            else
1116#endif
1117            {
1118                pos += SetAlgoID((int)sigOID, derTmp + pos, oidSigType, 0);
1119            }
1120#ifdef WC_RSA_PSS
1121            if (ret == 0)
1122#endif
1123            {
1124                pos += SetBitString(sigSz, 0, derTmp + pos);
1125                XMEMCPY(derTmp + pos, sig, sigSz);
1126            }
1127            (void)pos; /* pos not used after this point */
1128        }
1129
1130        /* Determine required PEM size. */
1131        if (ret == 0) {
1132            pemSz = wc_DerToPemEx(derTmp, derNeeded, NULL, 0, NULL, CRL_TYPE);
1133            if (pemSz < 0) {
1134                ret = WOLFSSL_FATAL_ERROR;
1135            }
1136            else if (buff == NULL) {
1137                *inOutSz = pemSz;
1138                ret = WOLFSSL_SUCCESS;
1139            }
1140            else if (outSz < pemSz) {
1141                WOLFSSL_MSG("Output buffer too small for PEM CRL");
1142                ret = BUFFER_E;
1143            }
1144            else if (wc_DerToPemEx(derTmp, derNeeded, buff, (word32)pemSz,
1145                                   NULL, CRL_TYPE) < 0) {
1146                ret = WOLFSSL_FATAL_ERROR;
1147            }
1148            else {
1149                *inOutSz = pemSz;
1150                ret = WOLFSSL_SUCCESS;
1151            }
1152        }
1153
1154        XFREE(derTmp, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
1155    }
1156#endif /* WOLFSSL_DER_TO_PEM */
1157    else if (ret == 0) {
1158        ret = BAD_FUNC_ARG;
1159    }
1160
1161    wc_UnLockRwLock(&crl->crlLock);
1162    return ret;
1163}
1164
1165#ifdef HAVE_CRL_UPDATE_CB
1166/* Fill out CRL info structure, WOLFSSL_SUCCESS on ok */
1167int GetCRLInfo(WOLFSSL_CRL* crl, CrlInfo* info, const byte* buff,
1168    long sz, int type)
1169{
1170    int          ret = WOLFSSL_SUCCESS;
1171    const byte*  myBuffer = buff;    /* if DER ok, otherwise switch */
1172    DerBuffer*   der = NULL;
1173    CRL_Entry*   crle = NULL;
1174    WC_DECLARE_VAR(dcrl, DecodedCRL, 1, 0);
1175
1176    WOLFSSL_ENTER("GetCRLInfo");
1177
1178    if (crl == NULL || info == NULL || buff == NULL || sz == 0)
1179        return BAD_FUNC_ARG;
1180
1181    if (type == WOLFSSL_FILETYPE_PEM) {
1182    #ifdef WOLFSSL_PEM_TO_DER
1183        ret = PemToDer(buff, sz, CRL_TYPE, &der, NULL, NULL, NULL);
1184        if (ret == 0) {
1185            myBuffer = der->buffer;
1186            sz = der->length;
1187        }
1188        else {
1189            WOLFSSL_MSG("Pem to Der failed");
1190            FreeDer(&der);
1191            return -1;
1192        }
1193    #else
1194        ret = NOT_COMPILED_IN;
1195    #endif
1196    }
1197
1198#ifdef WOLFSSL_SMALL_STACK
1199    dcrl = (DecodedCRL*)XMALLOC(sizeof(DecodedCRL), NULL,
1200        DYNAMIC_TYPE_TMP_BUFFER);
1201    if (dcrl == NULL) {
1202        FreeDer(&der);
1203        return MEMORY_E;
1204    }
1205#endif
1206
1207    crle = CRL_Entry_new(crl->heap);
1208    if (crle == NULL) {
1209        WOLFSSL_MSG("alloc CRL Entry failed");
1210        WC_FREE_VAR_EX(dcrl, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1211        FreeDer(&der);
1212        return MEMORY_E;
1213    }
1214
1215    InitDecodedCRL(dcrl, crl->heap);
1216    ret = ParseCRL(crle->certs, dcrl, myBuffer, (word32)sz,
1217                   0, crl->cm);
1218    if (ret != 0 && !(ret == WC_NO_ERR_TRACE(ASN_CRL_NO_SIGNER_E))) {
1219        WOLFSSL_MSG("ParseCRL error");
1220        CRL_Entry_free(crle, crl->heap);
1221        crle = NULL;
1222    }
1223    else {
1224        SetCrlInfoFromDecoded((DecodedCRL*)dcrl, info);
1225    }
1226
1227    FreeDecodedCRL(dcrl);
1228
1229    WC_FREE_VAR_EX(dcrl, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1230
1231    FreeDer(&der);
1232    CRL_Entry_free(crle, crl->heap);
1233
1234    return ret ? ret : WOLFSSL_SUCCESS; /* convert 0 to WOLFSSL_SUCCESS */
1235}
1236#endif
1237
1238#if defined(OPENSSL_EXTRA) && defined(HAVE_CRL)
1239/* helper function to create a new dynamic WOLFSSL_X509_CRL structure */
1240static WOLFSSL_X509_CRL* wolfSSL_X509_crl_new(WOLFSSL_CERT_MANAGER* cm)
1241{
1242    WOLFSSL_X509_CRL* ret;
1243    void* heap = NULL;
1244
1245    if (cm != NULL) {
1246        heap = cm->heap;
1247    }
1248
1249    ret = (WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), heap,
1250        DYNAMIC_TYPE_CRL);
1251    if (ret != NULL) {
1252        if (InitCRL(ret, cm) < 0) {
1253            WOLFSSL_MSG("Unable to initialize new CRL structure");
1254            XFREE(ret, heap, DYNAMIC_TYPE_CRL);
1255            ret = NULL;
1256        }
1257    }
1258    return ret;
1259}
1260
1261#ifndef CRL_STATIC_REVOKED_LIST
1262/* returns head of copied list that was alloc'd */
1263static RevokedCert *DupRevokedCertList(RevokedCert* in, void* heap)
1264{
1265    RevokedCert* head = NULL;
1266    RevokedCert* current = in;
1267    RevokedCert* prev = NULL;
1268    while (current) {
1269        RevokedCert* tmp = (RevokedCert*)XMALLOC(sizeof(RevokedCert), heap,
1270                DYNAMIC_TYPE_REVOKED);
1271        if (tmp != NULL) {
1272            XMEMCPY(tmp->serialNumber, current->serialNumber,
1273                    EXTERNAL_SERIAL_SIZE);
1274            tmp->serialSz = current->serialSz;
1275            XMEMCPY(tmp->revDate, current->revDate,
1276                    MAX_DATE_SIZE);
1277            tmp->revDateFormat = current->revDateFormat;
1278            tmp->reasonCode = current->reasonCode;
1279#if defined(OPENSSL_EXTRA)
1280            tmp->extensions = NULL;
1281            tmp->extensionsSz = 0;
1282            if (current->extensions != NULL && current->extensionsSz > 0) {
1283                tmp->extensions = (byte*)XMALLOC(current->extensionsSz, heap,
1284                                                 DYNAMIC_TYPE_REVOKED);
1285                if (tmp->extensions != NULL) {
1286                    XMEMCPY(tmp->extensions, current->extensions,
1287                            current->extensionsSz);
1288                    tmp->extensionsSz = current->extensionsSz;
1289                }
1290            }
1291#endif
1292            tmp->next = NULL;
1293            if (prev != NULL)
1294                prev->next = tmp;
1295            if (head == NULL)
1296                head = tmp;
1297            prev = tmp;
1298        }
1299        else {
1300            WOLFSSL_MSG("Failed to allocate new RevokedCert structure");
1301            /* free up any existing list */
1302            while (head != NULL) {
1303                current = head;
1304                head = head->next;
1305#if defined(OPENSSL_EXTRA)
1306                XFREE(current->extensions, heap, DYNAMIC_TYPE_REVOKED);
1307#endif
1308                XFREE(current, heap, DYNAMIC_TYPE_REVOKED);
1309            }
1310            return NULL;
1311        }
1312        current = current->next;
1313    }
1314
1315    (void)heap;
1316    return head;
1317}
1318
1319#endif /* CRL_STATIC_REVOKED_LIST */
1320/* returns a deep copy of ent on success and null on fail */
1321static CRL_Entry* DupCRL_Entry(const CRL_Entry* ent, void* heap)
1322{
1323    CRL_Entry *dupl;
1324    const size_t copyOffset = WC_OFFSETOF(CRL_Entry, verifyMutex) +
1325            sizeof(ent->verifyMutex);
1326#ifdef CRL_STATIC_REVOKED_LIST
1327    if (ent->totalCerts > CRL_MAX_REVOKED_CERTS) {
1328        return NULL;
1329    }
1330#endif
1331    dupl = CRL_Entry_new(heap);
1332    if (dupl == NULL) {
1333        WOLFSSL_MSG("alloc CRL Entry failed");
1334        return NULL;
1335    }
1336
1337    XMEMCPY((byte*)dupl + copyOffset, (byte*)ent + copyOffset,
1338            sizeof(CRL_Entry) - copyOffset);
1339
1340#ifndef CRL_STATIC_REVOKED_LIST
1341    dupl->certs = DupRevokedCertList(ent->certs, heap);
1342    if (ent->certs != NULL && dupl->certs == NULL) {
1343        CRL_Entry_free(dupl, heap);
1344        return NULL;
1345    }
1346#endif
1347#ifdef OPENSSL_EXTRA
1348    dupl->issuer = wolfSSL_X509_NAME_dup(ent->issuer);
1349    if (ent->issuer != NULL && dupl->issuer == NULL) {
1350        CRL_Entry_free(dupl, heap);
1351        return NULL;
1352    }
1353#endif
1354
1355    if (!ent->verified) {
1356        dupl->toBeSigned = (byte*)XMALLOC(dupl->tbsSz, heap,
1357                                          DYNAMIC_TYPE_CRL_ENTRY);
1358        dupl->signature = (byte*)XMALLOC(dupl->signatureSz, heap,
1359                                         DYNAMIC_TYPE_CRL_ENTRY);
1360    #ifdef WC_RSA_PSS
1361        dupl->sigParams = (byte*)XMALLOC(dupl->sigParamsSz, heap,
1362                                         DYNAMIC_TYPE_CRL_ENTRY);
1363    #endif
1364        if (dupl->toBeSigned == NULL || dupl->signature == NULL
1365        #ifdef WC_RSA_PSS
1366            /* allow sigParamsSz is zero and XMALLOC(0) to return NULL */
1367            || (dupl->sigParams == NULL && dupl->sigParamsSz != 0)
1368        #endif
1369        ) {
1370            CRL_Entry_free(dupl, heap);
1371            return NULL;
1372        }
1373        XMEMCPY(dupl->toBeSigned, ent->toBeSigned, dupl->tbsSz);
1374        XMEMCPY(dupl->signature, ent->signature, dupl->signatureSz);
1375    #ifdef WC_RSA_PSS
1376        if (dupl->sigParamsSz > 0) {
1377            XMEMCPY(dupl->sigParams, ent->sigParams, dupl->sigParamsSz);
1378        }
1379    #endif
1380    }
1381    else {
1382        dupl->toBeSigned = NULL;
1383        dupl->tbsSz = 0;
1384        dupl->signature = NULL;
1385        dupl->signatureSz = 0;
1386#ifdef WC_RSA_PSS
1387        dupl->sigParams = NULL;
1388        dupl->sigParamsSz = 0;
1389#endif
1390#if !defined(NO_SKID) && !defined(NO_ASN)
1391        dupl->extAuthKeyIdSet = 0;
1392#endif
1393    }
1394
1395    return dupl;
1396}
1397
1398
1399/* returns the head of a deep copy of the list on success and null on fail */
1400static CRL_Entry* DupCRL_list(CRL_Entry* crl, void* heap)
1401{
1402    CRL_Entry* current;
1403    CRL_Entry* head = NULL;
1404    CRL_Entry** prev = &head;
1405
1406    for (current = crl; current != NULL; current = current->next) {
1407        CRL_Entry* tmp = DupCRL_Entry(current, heap);
1408        if (tmp != NULL) {
1409            *prev = tmp;
1410            prev = &tmp->next;
1411        }
1412        else {
1413            WOLFSSL_MSG("Failed to allocate new CRL_Entry structure");
1414            /* free up any existing list */
1415            while (head != NULL) {
1416                CRL_Entry* next = head->next;
1417                CRL_Entry_free(head, heap);
1418                head = next;
1419            }
1420            return NULL;
1421        }
1422    }
1423
1424    return head;
1425}
1426
1427
1428/* Duplicates everything except the parent cm pointed to.
1429 * Expects that Init has already been done to 'dupl'
1430 * return 0 on success */
1431static int DupX509_CRL(WOLFSSL_X509_CRL *dupl, const WOLFSSL_X509_CRL* crl)
1432{
1433    if (dupl == NULL || crl == NULL) {
1434        return BAD_FUNC_ARG;
1435    }
1436
1437#ifdef HAVE_CRL_MONITOR
1438    if (crl->monitors[0].path) {
1439        size_t pathSz = XSTRLEN(crl->monitors[0].path) + 1;
1440        dupl->monitors[0].path = (char*)XMALLOC(pathSz, dupl->heap,
1441                DYNAMIC_TYPE_CRL_MONITOR);
1442        if (dupl->monitors[0].path != NULL) {
1443            XSTRNCPY(dupl->monitors[0].path, crl->monitors[0].path, pathSz);
1444        }
1445        else {
1446            return MEMORY_E;
1447        }
1448    }
1449
1450    if (crl->monitors[1].path) {
1451        size_t pathSz = XSTRLEN(crl->monitors[1].path) + 1;
1452        dupl->monitors[1].path = (char*)XMALLOC(pathSz, dupl->heap,
1453                DYNAMIC_TYPE_CRL_MONITOR);
1454        if (dupl->monitors[1].path != NULL) {
1455            XSTRNCPY(dupl->monitors[1].path, crl->monitors[1].path, pathSz);
1456        }
1457        else {
1458            if (dupl->monitors[0].path != NULL) {
1459                XFREE(dupl->monitors[0].path, dupl->heap,
1460                        DYNAMIC_TYPE_CRL_MONITOR);
1461                dupl->monitors[0].path = NULL;
1462            }
1463            return MEMORY_E;
1464        }
1465    }
1466#endif
1467
1468    dupl->crlList = DupCRL_list(crl->crlList, dupl->heap);
1469    if (crl->crlList != NULL && dupl->crlList == NULL)
1470        return MEMORY_E;
1471#ifdef HAVE_CRL_IO
1472    dupl->crlIOCb = crl->crlIOCb;
1473#endif
1474
1475    return 0;
1476}
1477
1478WOLFSSL_X509_CRL* wolfSSL_X509_CRL_dup(const WOLFSSL_X509_CRL* crl)
1479{
1480    WOLFSSL_X509_CRL* ret;
1481
1482    WOLFSSL_ENTER("wolfSSL_X509_CRL_dup");
1483
1484    if (crl == NULL)
1485        return NULL;
1486
1487    ret = wolfSSL_X509_crl_new(crl->cm);
1488    if (ret != NULL && DupX509_CRL(ret, crl) != 0) {
1489        FreeCRL(ret, 1);
1490        ret = NULL;
1491    }
1492    return ret;
1493}
1494
1495#ifdef OPENSSL_ALL
1496int wolfSSL_X509_CRL_up_ref(WOLFSSL_X509_CRL* crl)
1497{
1498    int ret;
1499
1500    if (crl == NULL)
1501        return WOLFSSL_FAILURE;
1502
1503    wolfSSL_RefInc(&crl->ref, &ret);
1504#ifdef WOLFSSL_REFCNT_ERROR_RETURN
1505    if (ret != 0) {
1506        WOLFSSL_MSG("Failed to lock x509 mutex");
1507        return WOLFSSL_FAILURE;
1508    }
1509#else
1510    (void)ret;
1511#endif
1512
1513    return WOLFSSL_SUCCESS;
1514}
1515#endif
1516
1517/* returns WOLFSSL_SUCCESS on success. Does not take ownership of newcrl */
1518int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *store, WOLFSSL_X509_CRL *newcrl)
1519{
1520    WOLFSSL_X509_CRL *crl;
1521    int ret = 0;
1522
1523    WOLFSSL_ENTER("wolfSSL_X509_STORE_add_crl");
1524    if (store == NULL || newcrl == NULL || store->cm == NULL)
1525        return BAD_FUNC_ARG;
1526
1527    if (store->cm->crl == NULL) {
1528        crl = wolfSSL_X509_crl_new(store->cm);
1529        if (crl == NULL) {
1530            WOLFSSL_MSG("wolfSSL_X509_crl_new failed");
1531            return WOLFSSL_FAILURE;
1532        }
1533        if (wc_LockRwLock_Rd(&newcrl->crlLock) != 0) {
1534            WOLFSSL_MSG("wc_LockRwLock_Rd failed");
1535            FreeCRL(crl, 1);
1536            return BAD_MUTEX_E;
1537        }
1538        ret = DupX509_CRL(crl, newcrl);
1539        wc_UnLockRwLock(&newcrl->crlLock);
1540        if (ret != 0) {
1541            FreeCRL(crl, 1);
1542            return WOLFSSL_FAILURE;
1543        }
1544        store->crl = store->cm->crl = crl;
1545        if (wolfSSL_CertManagerEnableCRL(store->cm, WOLFSSL_CRL_CHECKALL)
1546                != WOLFSSL_SUCCESS) {
1547            WOLFSSL_MSG("wolfSSL_CertManagerEnableCRL error");
1548            return WOLFSSL_FAILURE;
1549        }
1550        return WOLFSSL_SUCCESS;
1551    }
1552
1553    /* find tail of current list and add new list */
1554    crl  = store->cm->crl;
1555    if (newcrl->crlList != NULL) {
1556        CRL_Entry **tail;
1557        CRL_Entry *toAdd;
1558
1559        if (wc_LockRwLock_Wr(&crl->crlLock) != 0) {
1560            WOLFSSL_MSG("wc_LockRwLock_Wr failed");
1561            return BAD_MUTEX_E;
1562        }
1563
1564        if (crl != newcrl && wc_LockRwLock_Rd(&newcrl->crlLock) != 0) {
1565            WOLFSSL_MSG("wc_LockRwLock_Rd failed");
1566            wc_UnLockRwLock(&crl->crlLock);
1567            return BAD_MUTEX_E;
1568        }
1569        toAdd = DupCRL_list(newcrl->crlList, crl->heap);
1570        if (crl != newcrl)
1571            wc_UnLockRwLock(&newcrl->crlLock);
1572
1573        tail = &crl->crlList;
1574        while (*tail != NULL)
1575            tail = &(*tail)->next;
1576        *tail = toAdd;
1577        wc_UnLockRwLock(&crl->crlLock);
1578    }
1579
1580    if (wolfSSL_CertManagerEnableCRL(store->cm, WOLFSSL_CRL_CHECKALL)
1581            != WOLFSSL_SUCCESS) {
1582        WOLFSSL_MSG("wolfSSL_CertManagerEnableCRL error");
1583        return WOLFSSL_FAILURE;
1584    }
1585
1586    WOLFSSL_LEAVE("wolfSSL_X509_STORE_add_crl", WOLFSSL_SUCCESS);
1587
1588    return WOLFSSL_SUCCESS;
1589}
1590#endif
1591
1592#ifdef HAVE_CRL_MONITOR
1593
1594
1595/* Signal Monitor thread is setup, save status to setup flag, 0 on success */
1596static int SignalSetup(WOLFSSL_CRL* crl, int status)
1597{
1598    int ret, condRet;
1599
1600    ret = wolfSSL_CondStart(&crl->cond);
1601    if (ret != 0)
1602        return ret;
1603
1604    crl->setup = status;
1605
1606    condRet = wolfSSL_CondSignal(&crl->cond);
1607    ret = wolfSSL_CondEnd(&crl->cond);
1608    if (ret != 0)
1609        return ret;
1610
1611    return condRet;
1612}
1613
1614
1615/* read in new CRL entries and save new list */
1616static int SwapLists(WOLFSSL_CRL* crl)
1617{
1618    int        ret;
1619    CRL_Entry* newList;
1620    WC_DECLARE_VAR(tmp, WOLFSSL_CRL, 1, 0);
1621
1622    WC_ALLOC_VAR_EX(tmp, WOLFSSL_CRL, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
1623        return MEMORY_E);
1624
1625    if (InitCRL(tmp, crl->cm) < 0) {
1626        WOLFSSL_MSG("Init tmp CRL failed");
1627        WC_FREE_VAR_EX(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1628        return WOLFSSL_FATAL_ERROR;
1629    }
1630
1631    if (crl->monitors[0].path) {
1632        ret = LoadCRL(tmp, crl->monitors[0].path, WOLFSSL_FILETYPE_PEM, 0);
1633        if (ret != WOLFSSL_SUCCESS) {
1634            WOLFSSL_MSG("PEM LoadCRL on dir change failed");
1635            FreeCRL(tmp, 0);
1636            WC_FREE_VAR_EX(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1637            return WOLFSSL_FATAL_ERROR;
1638        }
1639    }
1640
1641    if (crl->monitors[1].path) {
1642        ret = LoadCRL(tmp, crl->monitors[1].path, WOLFSSL_FILETYPE_ASN1, 0);
1643        if (ret != WOLFSSL_SUCCESS) {
1644            WOLFSSL_MSG("DER LoadCRL on dir change failed");
1645            FreeCRL(tmp, 0);
1646            WC_FREE_VAR_EX(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1647            return WOLFSSL_FATAL_ERROR;
1648        }
1649    }
1650
1651    if (wc_LockRwLock_Wr(&crl->crlLock) != 0) {
1652        WOLFSSL_MSG("wc_LockRwLock_Wr failed");
1653        FreeCRL(tmp, 0);
1654        WC_FREE_VAR_EX(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1655        return WOLFSSL_FATAL_ERROR;
1656    }
1657
1658    newList = tmp->crlList;
1659
1660    /* swap lists */
1661    tmp->crlList  = crl->crlList;
1662    crl->crlList = newList;
1663
1664    wc_UnLockRwLock(&crl->crlLock);
1665
1666    FreeCRL(tmp, 0);
1667
1668    WC_FREE_VAR_EX(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1669
1670    return 0;
1671}
1672
1673
1674#if (defined(__MACH__) || defined(__FreeBSD__))
1675
1676#include <sys/types.h>
1677#include <sys/event.h>
1678#include <sys/time.h>
1679#include <fcntl.h>
1680#include <unistd.h>
1681#include <errno.h>
1682
1683#ifdef __MACH__
1684    #define XEVENT_MODE O_EVTONLY
1685#elif defined(__FreeBSD__)
1686    #define XEVENT_MODE O_RDONLY
1687#endif
1688
1689
1690
1691/* we need a unique kqueue user filter fd for crl in case user is doing custom
1692 * events too */
1693#ifndef CRL_CUSTOM_FD
1694    #define CRL_CUSTOM_FD 123456
1695#endif
1696
1697
1698/* shutdown monitor thread, 0 on success */
1699static int StopMonitor(wolfSSL_CRL_mfd_t mfd)
1700{
1701    struct kevent change;
1702
1703    /* trigger custom shutdown */
1704#if defined(NOTE_TRIGGER)
1705    EV_SET(&change, CRL_CUSTOM_FD, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL);
1706#elif defined(EV_TRIGGER)
1707    EV_SET(&change, CRL_CUSTOM_FD, EVFILT_USER, EV_TRIGGER, 0, 0, NULL);
1708#endif
1709    if (kevent(mfd, &change, 1, NULL, 0, NULL) < 0) {
1710        WOLFSSL_MSG("kevent trigger customer event failed");
1711        return WOLFSSL_FATAL_ERROR;
1712    }
1713
1714    return 0;
1715}
1716
1717
1718/* OS X  monitoring */
1719static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
1720{
1721    int fPEM, fDER;
1722    struct kevent change;
1723
1724    WOLFSSL_CRL* crl = (WOLFSSL_CRL*)arg;
1725
1726    WOLFSSL_ENTER("DoMonitor");
1727
1728    crl->mfd = kqueue();
1729    if (crl->mfd == -1) {
1730        WOLFSSL_MSG("kqueue failed");
1731        SignalSetup(crl, MONITOR_SETUP_E);
1732        return NULL;
1733    }
1734    wc_set_cloexec(crl->mfd);
1735
1736    /* listen for custom shutdown event */
1737    EV_SET(&change, CRL_CUSTOM_FD, EVFILT_USER, EV_ADD, 0, 0, NULL);
1738    if (kevent(crl->mfd, &change, 1, NULL, 0, NULL) < 0) {
1739        WOLFSSL_MSG("kevent monitor customer event failed");
1740        SignalSetup(crl, MONITOR_SETUP_E);
1741        (void)close(crl->mfd);
1742        return NULL;
1743    }
1744
1745    fPEM = -1;
1746    fDER = -1;
1747
1748    if (crl->monitors[0].path) {
1749        fPEM = wc_open_cloexec(crl->monitors[0].path, XEVENT_MODE);
1750        if (fPEM == -1) {
1751            WOLFSSL_MSG("PEM event dir open failed");
1752            SignalSetup(crl, MONITOR_SETUP_E);
1753            (void)close(crl->mfd);
1754            return NULL;
1755        }
1756    }
1757
1758    if (crl->monitors[1].path) {
1759        fDER = wc_open_cloexec(crl->monitors[1].path, XEVENT_MODE);
1760        if (fDER == -1) {
1761            WOLFSSL_MSG("DER event dir open failed");
1762            if (fPEM != -1)
1763                (void)close(fPEM);
1764            (void)close(crl->mfd);
1765            SignalSetup(crl, MONITOR_SETUP_E);
1766            return NULL;
1767        }
1768    }
1769
1770    if (fPEM != -1)
1771        EV_SET(&change, fPEM, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
1772                NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB, 0, 0);
1773
1774    if (fDER != -1)
1775        EV_SET(&change, fDER, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
1776                NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB, 0, 0);
1777
1778    /* signal to calling thread we're setup */
1779    if (SignalSetup(crl, 1) != 0) {
1780        if (fPEM != -1)
1781            (void)close(fPEM);
1782        if (fDER != -1)
1783            (void)close(fDER);
1784        (void)close(crl->mfd);
1785        return NULL;
1786    }
1787
1788    for (;;) {
1789        struct kevent event;
1790        int           numEvents = kevent(crl->mfd, &change, 1, &event, 1, NULL);
1791
1792        WOLFSSL_MSG("Got kevent");
1793
1794        if (numEvents == -1) {
1795            WOLFSSL_MSG("kevent problem, continue");
1796            continue;
1797        }
1798
1799        if (event.filter == EVFILT_USER) {
1800            WOLFSSL_MSG("Got user shutdown event, breaking out");
1801            break;
1802        }
1803
1804        if (SwapLists(crl) < 0) {
1805            WOLFSSL_MSG("SwapLists problem, continue");
1806        }
1807    }
1808
1809    if (fPEM != -1)
1810        (void)close(fPEM);
1811    if (fDER != -1)
1812        (void)close(fDER);
1813
1814    (void)close(crl->mfd);
1815
1816    return NULL;
1817}
1818
1819
1820#elif defined(__linux__)
1821
1822#include <sys/types.h>
1823#include <sys/inotify.h>
1824#include <sys/eventfd.h>
1825#include <unistd.h>
1826#include <fcntl.h>
1827#include <errno.h>
1828
1829#ifndef max
1830    static WC_INLINE int max(int a, int b)
1831    {
1832        return a > b ? a : b;
1833    }
1834#endif /* max */
1835
1836
1837/* shutdown monitor thread, 0 on success */
1838static int StopMonitor(wolfSSL_CRL_mfd_t mfd)
1839{
1840    word64 w64 = 1;
1841
1842    /* write to our custom event */
1843    if (write(mfd, &w64, sizeof(w64)) < 0) {
1844        WOLFSSL_MSG("StopMonitor write failed");
1845        return WOLFSSL_FATAL_ERROR;
1846    }
1847
1848    return 0;
1849}
1850
1851
1852/* linux monitoring */
1853static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
1854{
1855    int         notifyFd;
1856    int         wd  = -1;
1857    WOLFSSL_CRL* crl = (WOLFSSL_CRL*)arg;
1858    WC_DECLARE_VAR(buff, char, 8192, 0);
1859
1860    WOLFSSL_ENTER("DoMonitor");
1861
1862#ifdef EFD_CLOEXEC
1863    crl->mfd = eventfd(0, EFD_CLOEXEC);  /* our custom shutdown event */
1864    if (crl->mfd < 0 && (errno == ENOSYS || errno == EINVAL)) {
1865        crl->mfd = eventfd(0, 0);
1866        wc_set_cloexec(crl->mfd);
1867    }
1868#else
1869    crl->mfd = eventfd(0, 0);  /* our custom shutdown event */
1870    wc_set_cloexec(crl->mfd);
1871#endif
1872    if (crl->mfd < 0) {
1873        WOLFSSL_MSG("eventfd failed");
1874        SignalSetup(crl, MONITOR_SETUP_E);
1875        return NULL;
1876    }
1877
1878#ifdef IN_CLOEXEC
1879    notifyFd = inotify_init1(IN_CLOEXEC);
1880    if (notifyFd < 0 && (errno == ENOSYS || errno == EINVAL)) {
1881        notifyFd = inotify_init();
1882        wc_set_cloexec(notifyFd);
1883    }
1884#else
1885    notifyFd = inotify_init();
1886    wc_set_cloexec(notifyFd);
1887#endif
1888    if (notifyFd < 0) {
1889        WOLFSSL_MSG("inotify failed");
1890        (void)close(crl->mfd);
1891        SignalSetup(crl, MONITOR_SETUP_E);
1892        return NULL;
1893    }
1894
1895    if (crl->monitors[0].path) {
1896        wd = inotify_add_watch(notifyFd, crl->monitors[0].path, IN_CLOSE_WRITE |
1897                                                                IN_DELETE);
1898        if (wd < 0) {
1899            WOLFSSL_MSG("PEM notify add watch failed");
1900            (void)close(crl->mfd);
1901            (void)close(notifyFd);
1902            SignalSetup(crl, MONITOR_SETUP_E);
1903            return NULL;
1904        }
1905    }
1906
1907    if (crl->monitors[1].path) {
1908        wd = inotify_add_watch(notifyFd, crl->monitors[1].path, IN_CLOSE_WRITE |
1909                                                                IN_DELETE);
1910        if (wd < 0) {
1911            WOLFSSL_MSG("DER notify add watch failed");
1912            (void)close(crl->mfd);
1913            (void)close(notifyFd);
1914            SignalSetup(crl, MONITOR_SETUP_E);
1915            return NULL;
1916        }
1917    }
1918
1919
1920    /* signal to calling thread we're setup */
1921    if (SignalSetup(crl, 1) != 0) {
1922        if (wd > 0) {
1923            if (inotify_rm_watch(notifyFd, wd) < 0)
1924                WOLFSSL_MSG("inotify_rm_watch #1 failed in DoMonitor");
1925        }
1926        (void)close(crl->mfd);
1927        (void)close(notifyFd);
1928        return NULL;
1929    }
1930
1931#ifdef WOLFSSL_SMALL_STACK
1932    buff = (char*)XMALLOC(8192, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1933    if (buff == NULL)
1934        return NULL;
1935#endif
1936
1937    for (;;) {
1938        fd_set readfds;
1939        int    result;
1940        int    length;
1941
1942        FD_ZERO(&readfds);
1943        FD_SET(notifyFd, &readfds);
1944        FD_SET(crl->mfd, &readfds);
1945
1946        result = select(max(notifyFd, crl->mfd) + 1, &readfds, NULL, NULL,NULL);
1947
1948        WOLFSSL_MSG("Got notify event");
1949
1950        if (result < 0) {
1951            WOLFSSL_MSG("select problem, continue");
1952            continue;
1953        }
1954
1955        if (FD_ISSET(crl->mfd, &readfds)) {
1956            word64 r64;
1957            int    rlen;
1958
1959            WOLFSSL_MSG("got custom shutdown event, breaking out");
1960
1961            /* read out the bytes written to the event to clean up */
1962            rlen = (int) read(crl->mfd, &r64, sizeof(r64));
1963            if (rlen < 0) {
1964                WOLFSSL_MSG("read custom event failure");
1965            }
1966
1967            break;
1968        }
1969
1970        length = (int) read(notifyFd, buff, 8192);
1971        if (length < 0) {
1972            WOLFSSL_MSG("notify read problem, continue");
1973            continue;
1974        }
1975
1976        if (SwapLists(crl) < 0) {
1977            WOLFSSL_MSG("SwapLists problem, continue");
1978        }
1979    }
1980
1981    WC_FREE_VAR_EX(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1982
1983    if (wd > 0) {
1984        if (inotify_rm_watch(notifyFd, wd) < 0)
1985            WOLFSSL_MSG("inotify_rm_watch #2 failed in DoMonitor");
1986    }
1987    (void)close(crl->mfd);
1988    (void)close(notifyFd);
1989
1990    return NULL;
1991}
1992
1993#elif defined(_MSC_VER)
1994
1995/* shutdown monitor thread, 0 on success */
1996static int StopMonitor(wolfSSL_CRL_mfd_t mfd)
1997{
1998    if (SetEvent(mfd) == 0) {
1999        WOLFSSL_MSG("SetEvent custom event trigger failed");
2000        return WOLFSSL_FATAL_ERROR;
2001    }
2002    return 0;
2003}
2004
2005#ifdef DEBUG_WOLFSSL
2006#define SHOW_WINDOWS_ERROR() do {                               \
2007    LPVOID lpMsgBuf = NULL;                                     \
2008    DWORD dw = GetLastError();                                  \
2009    FormatMessageA(                                             \
2010        FORMAT_MESSAGE_ALLOCATE_BUFFER |                        \
2011        FORMAT_MESSAGE_FROM_SYSTEM |                            \
2012        FORMAT_MESSAGE_IGNORE_INSERTS,                          \
2013        NULL,                                                   \
2014        dw,                                                     \
2015        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),              \
2016        (LPSTR) &lpMsgBuf,                                      \
2017        0, NULL );                                              \
2018    WOLFSSL_MSG_EX("DoMonitor failed with error %d: %s\n",      \
2019        dw, lpMsgBuf);                                          \
2020    LocalFree(lpMsgBuf);                                        \
2021} while(0)
2022#else
2023#define SHOW_WINDOWS_ERROR() WC_DO_NOTHING
2024#endif
2025
2026#define DM_ERROR() do {                                         \
2027    SHOW_WINDOWS_ERROR();                                       \
2028    status = MONITOR_SETUP_E;                                   \
2029    goto cleanup;                                               \
2030} while(0)
2031
2032/* windows monitoring
2033 * Tested initially by hand by running
2034 * .\server.exe -A certs/ca-cert.pem -i -x
2035 * and connecting to with
2036 * .\client.exe -C -c certs/server-cert.pem -k certs/server-key.pem
2037 * This connection succeeds by default. By deleting all files from certs/crl
2038 * except for crl.revoked we disallow the client to connect. Deleting files
2039 * is done while the server is running to show that the monitor reacts to
2040 * changes in the crl directory. */
2041static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg)
2042{
2043    WOLFSSL_CRL* crl = (WOLFSSL_CRL*)arg;
2044    int status = 0;
2045    HANDLE handles[WOLFSSL_CRL_MONITORS_LEN + 1];
2046    DWORD handlesLen = 0;
2047    int i;
2048
2049    WOLFSSL_ENTER("DoMonitor");
2050
2051    handles[0] = crl->mfd = CreateEventA(NULL, FALSE, FALSE, NULL);
2052    if (crl->mfd == NULL) {
2053        WOLFSSL_MSG("CreateEventA failed");
2054        DM_ERROR();
2055    }
2056    handlesLen++;
2057
2058    for (i = 0; i < WOLFSSL_CRL_MONITORS_LEN; i++) {
2059        if (crl->monitors[i].path) {
2060            handles[handlesLen] = FindFirstChangeNotificationA(
2061                crl->monitors[i].path, TRUE,
2062                /* Watch for any changes that may affect what CRL's we load.
2063                 * This may trigger on the same file multiple times but this
2064                 * way we are certain that we have the most up to date and
2065                 * accurate set of CRL's. We don't expect this to trigger
2066                 * often enough for it to be a bottleneck. */
2067                FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES |
2068                FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE |
2069                FILE_NOTIFY_CHANGE_SECURITY);
2070            if (handles[handlesLen] == INVALID_HANDLE_VALUE) {
2071                WOLFSSL_MSG("FindFirstChangeNotificationA failed");
2072                DM_ERROR();
2073            }
2074            handlesLen++;
2075        }
2076    }
2077
2078    if (handlesLen == 1) {
2079        WOLFSSL_MSG("Nothing to watch. Only custom event handle set.");
2080        DM_ERROR();
2081    }
2082
2083    if (SignalSetup(crl, 1) != 0) {
2084        WOLFSSL_MSG("Call to SignalSetup failed");
2085        DM_ERROR();
2086    }
2087
2088    for (;;) {
2089        DWORD waitRet = WaitForMultipleObjects(handlesLen, handles, FALSE,
2090                                               INFINITE);
2091        WOLFSSL_MSG("Got notify event");
2092
2093        if (waitRet >= WAIT_OBJECT_0 && waitRet < WAIT_OBJECT_0 + handlesLen) {
2094            if (waitRet == WAIT_OBJECT_0) {
2095                WOLFSSL_MSG("got custom shutdown event, breaking out");
2096                break;
2097            }
2098            else if (SwapLists(crl) < 0) {
2099                WOLFSSL_MSG("SwapLists problem, continue");
2100            }
2101        }
2102        else {
2103            WOLFSSL_MSG("Unexpected WaitForMultipleObjects return. Continue.");
2104        }
2105
2106        for (i = 1; i < (int)handlesLen; i++) {
2107            if (FindNextChangeNotification(handles[i]) == 0) {
2108                WOLFSSL_MSG("FindNextChangeNotification failed");
2109                DM_ERROR();
2110            }
2111        }
2112    }
2113
2114cleanup:
2115    if (status != 0)
2116        SignalSetup(crl, status);
2117    for (i = 0; i < (int)handlesLen; i++) {
2118        BOOL closeRet;
2119        if (i == 0) /* First handle is our custom event */
2120            closeRet = CloseHandle(handles[i]);
2121        else
2122            closeRet = FindCloseChangeNotification(handles[i]);
2123        if (closeRet == 0) {
2124            WOLFSSL_MSG("Failed to close handle");
2125        }
2126    }
2127    crl->mfd = INVALID_HANDLE_VALUE;
2128    return 0;
2129}
2130
2131#endif /* MACH or linux or windows */
2132
2133
2134/* Start Monitoring the CRL path(s) in a thread */
2135static int StartMonitorCRL(WOLFSSL_CRL* crl)
2136{
2137    int ret = WOLFSSL_SUCCESS;
2138
2139    WOLFSSL_ENTER("StartMonitorCRL");
2140
2141    if (crl == NULL)
2142        return BAD_FUNC_ARG;
2143
2144    if (crl->tid != INVALID_THREAD_VAL) {
2145        WOLFSSL_MSG("Monitor thread already running");
2146        return ret;  /* that's ok, someone already started */
2147    }
2148
2149    if (wolfSSL_NewThread(&crl->tid, DoMonitor, crl) != 0) {
2150        WOLFSSL_MSG("Thread creation error");
2151        return THREAD_CREATE_E;
2152    }
2153
2154    /* wait for setup to complete */
2155    if (wolfSSL_CondStart(&crl->cond) != 0) {
2156        WOLFSSL_MSG("wolfSSL_CondStart failed");
2157        return BAD_MUTEX_E;
2158    }
2159    while (crl->setup == 0) {
2160        int condRet;
2161        condRet = wolfSSL_CondWait(&crl->cond);
2162        if (condRet != 0) {
2163            ret = BAD_COND_E;
2164            break;
2165        }
2166    }
2167    if (ret >= 0 && crl->setup < 0)
2168        ret = crl->setup;  /* store setup error */
2169
2170    if (ret < 0) {
2171        WOLFSSL_MSG("DoMonitor setup failure");
2172        crl->tid = INVALID_THREAD_VAL;  /* thread already done */
2173    }
2174    if (wolfSSL_CondEnd(&crl->cond) != 0) {
2175        WOLFSSL_MSG("wolfSSL_CondEnd failed");
2176        return BAD_MUTEX_E;
2177    }
2178
2179    return ret;
2180}
2181
2182#endif  /* HAVE_CRL_MONITOR */
2183
2184#if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
2185
2186/* Load CRL path files of type, WOLFSSL_SUCCESS on ok */
2187int LoadCRL(WOLFSSL_CRL* crl, const char* path, int type, int monitor)
2188{
2189    int         ret = WOLFSSL_SUCCESS;
2190    char*       name = NULL;
2191    WC_DECLARE_VAR(readCtx, ReadDirCtx, 1, 0);
2192
2193    WOLFSSL_ENTER("LoadCRL");
2194    if (crl == NULL)
2195        return BAD_FUNC_ARG;
2196
2197    WC_ALLOC_VAR_EX(readCtx, ReadDirCtx, 1, crl->heap,
2198        DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E);
2199
2200    /* try to load each regular file in path */
2201    ret = wc_ReadDirFirst(readCtx, path, &name);
2202    while (ret == 0 && name) {
2203        int skip = 0;
2204        if (type == WOLFSSL_FILETYPE_PEM) {
2205            if (XSTRSTR(name, ".pem") == NULL) {
2206                WOLFSSL_MSG("not .pem file, skipping");
2207                skip = 1;
2208            }
2209        }
2210        else {
2211            if (XSTRSTR(name, ".der") == NULL &&
2212                XSTRSTR(name, ".crl") == NULL)
2213            {
2214                WOLFSSL_MSG("not .der or .crl file, skipping");
2215                skip = 1;
2216            }
2217        }
2218
2219#ifndef CRL_REPORT_LOAD_ERRORS
2220        if (!skip && ProcessFile(NULL, name, type, CRL_TYPE, NULL, 0, crl,
2221                                 VERIFY) != WOLFSSL_SUCCESS) {
2222            WOLFSSL_MSG("CRL file load failed, continuing");
2223        }
2224#else
2225        if (!skip) {
2226            ret = ProcessFile(NULL, name, type, CRL_TYPE, NULL, 0, crl, VERIFY);
2227            if (ret != WOLFSSL_SUCCESS) {
2228                WOLFSSL_MSG("CRL file load failed");
2229                wc_ReadDirClose(readCtx);
2230                WC_FREE_VAR_EX(readCtx, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
2231                return ret;
2232            }
2233        }
2234#endif
2235
2236        ret = wc_ReadDirNext(readCtx, path, &name);
2237    }
2238    wc_ReadDirClose(readCtx);
2239
2240    /* load failures not reported, for backwards compat */
2241    ret = WOLFSSL_SUCCESS;
2242
2243    WC_FREE_VAR_EX(readCtx, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
2244
2245    if (monitor & WOLFSSL_CRL_MONITOR) {
2246#ifdef HAVE_CRL_MONITOR
2247        word32 pathLen;
2248        char* pathBuf;
2249
2250        WOLFSSL_MSG("monitor path requested");
2251
2252        pathLen = (word32)XSTRLEN(path);
2253        pathBuf = (char*)XMALLOC(pathLen+1, crl->heap, DYNAMIC_TYPE_CRL_MONITOR);
2254        if (pathBuf) {
2255            XMEMCPY(pathBuf, path, pathLen+1);
2256
2257            if (type == WOLFSSL_FILETYPE_PEM) {
2258                /* free old path before setting a new one */
2259                if (crl->monitors[0].path) {
2260                    XFREE(crl->monitors[0].path, crl->heap,
2261                            DYNAMIC_TYPE_CRL_MONITOR);
2262                }
2263                crl->monitors[0].path = pathBuf;
2264                crl->monitors[0].type = WOLFSSL_FILETYPE_PEM;
2265            } else {
2266                /* free old path before setting a new one */
2267                if (crl->monitors[1].path) {
2268                    XFREE(crl->monitors[1].path, crl->heap,
2269                            DYNAMIC_TYPE_CRL_MONITOR);
2270                }
2271                crl->monitors[1].path = pathBuf;
2272                crl->monitors[1].type = WOLFSSL_FILETYPE_ASN1;
2273            }
2274
2275            if (monitor & WOLFSSL_CRL_START_MON) {
2276                WOLFSSL_MSG("start monitoring requested");
2277
2278                ret = StartMonitorCRL(crl);
2279            }
2280        }
2281        else {
2282            ret = MEMORY_E;
2283        }
2284#else
2285        WOLFSSL_MSG("CRL monitoring requested but not compiled in");
2286        ret = NOT_COMPILED_IN;
2287#endif
2288    }
2289
2290    return ret;
2291}
2292
2293#else
2294int LoadCRL(WOLFSSL_CRL* crl, const char* path, int type, int monitor)
2295{
2296    (void)crl;
2297    (void)path;
2298    (void)type;
2299    (void)monitor;
2300
2301    /* stub for scenario where file system is not supported */
2302    return NOT_COMPILED_IN;
2303}
2304#endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
2305
2306#ifndef NO_FILESYSTEM
2307/* Store CRL to a file in DER or PEM format.
2308 * Returns WOLFSSL_SUCCESS on success, negative on failure.
2309 * @param [in] crl    CRL object.
2310 * @param [in] path   Path to the file to store the CRL.
2311 * @param [in] type   Format of encoding. Valid values:
2312 *                      WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM.
2313 * @return  WOLFSSL_SUCCESS on success, or negative on failure.
2314 */
2315int StoreCRL(WOLFSSL_CRL* crl, const char* path, int type)
2316{
2317    XFILE fp = XBADFILE;
2318    int ret = WOLFSSL_SUCCESS;
2319    long sz = 0;
2320    byte* mem = NULL;
2321
2322    WOLFSSL_ENTER("StoreCRL");
2323
2324    if (crl == NULL || path == NULL)
2325        return BAD_FUNC_ARG;
2326
2327    /* Determine required size. */
2328    ret = BufferStoreCRL(crl, NULL, &sz, type);
2329    if (ret != WOLFSSL_SUCCESS) {
2330        return ret;
2331    }
2332
2333    /* Allocate temporary buffer. */
2334    mem = (byte*)XMALLOC((size_t)sz, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
2335    if (mem == NULL) {
2336        return MEMORY_E;
2337    }
2338
2339    /* Encode CRL into buffer. */
2340    ret = BufferStoreCRL(crl, mem, &sz, type);
2341    if (ret == WOLFSSL_SUCCESS) {
2342        /* Open destination file for writing. */
2343        fp = XFOPEN(path, "wb");
2344        if (fp == XBADFILE) {
2345            ret = WOLFSSL_BAD_FILE;
2346        }
2347        else {
2348            size_t wrote = XFWRITE(mem, 1, (size_t)sz, fp);
2349            if (wrote != (size_t)sz) {
2350                WOLFSSL_MSG("CRL file write failed");
2351                ret = FWRITE_ERROR;
2352            }
2353            XFCLOSE(fp);
2354        }
2355    }
2356
2357    XFREE(mem, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
2358    return ret;
2359}
2360#else
2361int StoreCRL(WOLFSSL_CRL* crl, const char* file, int type)
2362{
2363    (void)crl;
2364    (void)file;
2365    (void)type;
2366    return NOT_COMPILED_IN;
2367}
2368#endif /* NO_FILESYSTEM */
2369
2370#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME)
2371/* Create a new empty CRL object for generation.
2372 * Version is set to 2 by default. Use wolfSSL_X509_CRL_set_version() to
2373 * change it.
2374 * lastUpdate set to current time, nextUpdate set to 500 days from now.
2375 * Returns a new CRL or NULL on failure.
2376 */
2377WOLFSSL_X509_CRL* wolfSSL_X509_CRL_new(void)
2378{
2379    WOLFSSL_X509_CRL* crl;
2380    CRL_Entry* entry;
2381    WOLFSSL_ASN1_TIME asnTime;
2382
2383    WOLFSSL_ENTER("wolfSSL_X509_CRL_new");
2384
2385    crl = (WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
2386                                      DYNAMIC_TYPE_CRL);
2387    if (crl == NULL) {
2388        WOLFSSL_MSG("Memory allocation failed for CRL");
2389        return NULL;
2390    }
2391
2392    if (InitCRL(crl, NULL) < 0) {
2393        WOLFSSL_MSG("Init CRL failed");
2394        XFREE(crl, NULL, DYNAMIC_TYPE_CRL);
2395        return NULL;
2396    }
2397
2398    /* Allocate empty CRL entry for setting fields */
2399    entry = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), NULL,
2400                                DYNAMIC_TYPE_CRL_ENTRY);
2401    if (entry == NULL) {
2402        WOLFSSL_MSG("Memory allocation failed for CRL entry");
2403        FreeCRL(crl, 1);
2404        return NULL;
2405    }
2406    XMEMSET(entry, 0, sizeof(CRL_Entry));
2407
2408    if (wc_InitMutex(&entry->verifyMutex) != 0) {
2409        XFREE(entry, NULL, DYNAMIC_TYPE_CRL_ENTRY);
2410        FreeCRL(crl, 1);
2411        return NULL;
2412    }
2413
2414    crl->crlList = entry;
2415
2416    /* Set thisUpdate to current time */
2417    if (wolfSSL_ASN1_TIME_adj(&asnTime, XTIME(NULL), 0, 0) == NULL) {
2418        WOLFSSL_MSG("Failed to get current time");
2419        FreeCRL(crl, 1);
2420        return NULL;
2421    }
2422    if (wolfSSL_X509_CRL_set_lastUpdate(crl, &asnTime) != WOLFSSL_SUCCESS) {
2423        WOLFSSL_MSG("Failed to set last update");
2424        FreeCRL(crl, 1);
2425        return NULL;
2426    }
2427
2428    /* Set next update date to 500 days from now,
2429     * following convention from wc_InitCert() */
2430    if (wolfSSL_ASN1_TIME_adj(&asnTime, XTIME(NULL), 500, 0) == NULL) {
2431        WOLFSSL_MSG("Failed to get next update time");
2432        FreeCRL(crl, 1);
2433        return NULL;
2434    }
2435    if (wolfSSL_X509_CRL_set_nextUpdate(crl, &asnTime) != WOLFSSL_SUCCESS) {
2436        WOLFSSL_MSG("Failed to set next update");
2437        FreeCRL(crl, 1);
2438        return NULL;
2439    }
2440
2441    /* Set default version to v2 (required for extensions) */
2442    entry->version = 2;
2443
2444    return crl;
2445}
2446
2447#ifdef WOLFSSL_CERT_GEN
2448/* Add a revoked certificate entry to CRL.
2449 * crl: target CRL
2450 * rev: revoked certificate entry (serial, date, reason, etc.)
2451 * Returns WOLFSSL_SUCCESS on success.
2452 */
2453int wolfSSL_X509_CRL_add_revoked(WOLFSSL_X509_CRL* crl,
2454                                 WOLFSSL_X509_REVOKED* rev)
2455{
2456    CRL_Entry* entry;
2457    RevokedCert* rc;
2458    RevokedCert* curr;
2459
2460    WOLFSSL_ENTER("wolfSSL_X509_CRL_add_revoked");
2461
2462    if (crl == NULL || rev == NULL || rev->serialNumber == NULL) {
2463        return BAD_FUNC_ARG;
2464    }
2465
2466    if (rev->revocationDate != NULL && (rev->revocationDate->length <= 0 ||
2467        (unsigned)rev->revocationDate->length > sizeof(rc->revDate))) {
2468        return BAD_FUNC_ARG;
2469    }
2470
2471    entry = crl->crlList;
2472    if (entry == NULL) {
2473        return BAD_FUNC_ARG;
2474    }
2475
2476    {
2477        const byte* serial = rev->serialNumber->data;
2478        int serialSz = rev->serialNumber->length;
2479        int i;
2480        int allZero = 1;
2481
2482        if (serial == NULL || serialSz <= 0) {
2483            return BAD_FUNC_ARG;
2484        }
2485
2486        if (serialSz > EXTERNAL_SERIAL_SIZE) {
2487            return BAD_FUNC_ARG;
2488        }
2489
2490        /* All zero serial numbers are invalid per rfc5280 and not supported */
2491        for (i = 0; i < serialSz; i++) {
2492            if (serial[i] != 0) {
2493                allZero = 0;
2494                break;
2495            }
2496        }
2497        if (allZero) {
2498            return BAD_FUNC_ARG;
2499        }
2500
2501        rc = (RevokedCert*)XMALLOC(sizeof(RevokedCert), crl->heap,
2502                                   DYNAMIC_TYPE_REVOKED);
2503        if (rc == NULL) {
2504            return MEMORY_E;
2505        }
2506        XMEMSET(rc, 0, sizeof(RevokedCert));
2507
2508        XMEMCPY(rc->serialNumber, serial, (size_t)serialSz);
2509        rc->serialSz = serialSz;
2510    }
2511
2512    /* Use caller-provided revocation date, or fall back to current time */
2513    if (rev->revocationDate != NULL && rev->revocationDate->length > 0) {
2514        XMEMCPY(rc->revDate, rev->revocationDate->data,
2515                 (size_t)rev->revocationDate->length);
2516        rc->revDateFormat = (byte)rev->revocationDate->type;
2517    }
2518    else {
2519        WOLFSSL_ASN1_TIME revDate;
2520        XMEMSET(&revDate, 0, sizeof(revDate));
2521        if (wolfSSL_ASN1_TIME_adj(&revDate, XTIME(NULL), 0, 0) == NULL) {
2522            WOLFSSL_MSG("Failed to get current time");
2523            XFREE(rc, crl->heap, DYNAMIC_TYPE_REVOKED);
2524            return BAD_STATE_E;
2525        }
2526        XMEMCPY(rc->revDate, revDate.data, revDate.length);
2527        rc->revDateFormat = (byte)revDate.type;
2528    }
2529
2530    rc->reasonCode = rev->reason;
2531    rc->next = NULL;
2532
2533    /* Add to end of list */
2534    if (entry->certs == NULL) {
2535        entry->certs = rc;
2536    }
2537    else {
2538        for (curr = entry->certs; curr->next != NULL; curr = curr->next)
2539            ;
2540        curr->next = rc;
2541    }
2542    entry->totalCerts++;
2543
2544    /* Invalidate cached STACK_OF(X509_REVOKED) since list changed */
2545    if (crl->revokedStack != NULL) {
2546        wolfSSL_sk_pop_free(crl->revokedStack, NULL);
2547        crl->revokedStack = NULL;
2548    }
2549
2550    WOLFSSL_LEAVE("wolfSSL_X509_CRL_add_revoked", WOLFSSL_SUCCESS);
2551    return WOLFSSL_SUCCESS;
2552}
2553
2554/* Add a revoked certificate entry to CRL by parsing a certificate buffer.
2555 * crl: target CRL
2556 * certBuf: DER-encoded certificate buffer
2557 * certSz: size of certificate buffer
2558 * revDate: revocation date (ASN.1 format), or NULL for
2559 *          current time
2560 * revDateFmt: date format (ASN_UTC_TIME or ASN_GENERALIZED_TIME), ignored if
2561 *             revDate is NULL
2562 * Returns WOLFSSL_SUCCESS on success.
2563 * Note: this function is only available when WOLFSSL_CERT_GEN is defined.
2564 */
2565int wolfSSL_X509_CRL_add_revoked_cert(WOLFSSL_X509_CRL* crl,
2566                                      const unsigned char* certBuf, int certSz)
2567{
2568    int ret;
2569    DecodedCert* cert = NULL;
2570    WOLFSSL_X509_REVOKED revoked;
2571    WOLFSSL_ASN1_INTEGER* serialInt = NULL;
2572
2573    WOLFSSL_ENTER("wolfSSL_X509_CRL_add_revoked_cert");
2574
2575    if (crl == NULL || certBuf == NULL || certSz <= 0) {
2576        return BAD_FUNC_ARG;
2577    }
2578
2579    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
2580    if (cert == NULL) {
2581        return MEMORY_E;
2582    }
2583
2584    /* Initialize and parse the certificate */
2585    InitDecodedCert(cert, certBuf, (word32)certSz, NULL);
2586    ret = ParseCertRelative(cert, CERT_TYPE, NO_VERIFY, NULL, NULL);
2587    if (ret != 0) {
2588        WOLFSSL_MSG("Failed to parse certificate");
2589        FreeDecodedCert(cert);
2590        XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
2591        return ret;
2592    }
2593
2594    serialInt = wolfSSL_ASN1_INTEGER_new();
2595    if (serialInt == NULL) {
2596        FreeDecodedCert(cert);
2597        XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
2598        return MEMORY_E;
2599    }
2600
2601    if (cert->serialSz > WOLFSSL_ASN1_INTEGER_MAX) {
2602        serialInt->data = (unsigned char*)XMALLOC(cert->serialSz, NULL,
2603            DYNAMIC_TYPE_OPENSSL);
2604        if (serialInt->data == NULL) {
2605            wolfSSL_ASN1_INTEGER_free(serialInt);
2606            FreeDecodedCert(cert);
2607            XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
2608            return MEMORY_E;
2609        }
2610        serialInt->dataMax = (unsigned int)cert->serialSz;
2611        serialInt->isDynamic = 1;
2612    }
2613    else {
2614        serialInt->data = serialInt->intData;
2615        serialInt->dataMax = WOLFSSL_ASN1_INTEGER_MAX;
2616    }
2617
2618    XMEMCPY(serialInt->data, cert->serial, cert->serialSz);
2619    serialInt->length = cert->serialSz;
2620
2621    XMEMSET(&revoked, 0, sizeof(revoked));
2622    revoked.serialNumber = serialInt;
2623    revoked.reason = CRL_REASON_NONE;
2624
2625    /* Add the revoked certificate entry */
2626    ret = wolfSSL_X509_CRL_add_revoked(crl, &revoked);
2627
2628    FreeDecodedCert(cert);
2629    XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
2630    wolfSSL_ASN1_INTEGER_free(serialInt);
2631
2632    return ret;
2633}
2634
2635static int GetCrlSignBufSz(int tbsSz, int sigType, RsaKey* rsaKey,
2636    ecc_key* eccKey)
2637{
2638    int sigSz = 0;
2639    int ret;
2640    byte sigDummy = 0;
2641
2642    if (tbsSz <= 0)
2643        return BAD_FUNC_ARG;
2644
2645    (void)rsaKey;
2646    (void)eccKey;
2647#ifndef NO_RSA
2648    if (rsaKey != NULL) {
2649        sigSz = wc_RsaEncryptSize(rsaKey);
2650    }
2651#endif
2652#ifdef HAVE_ECC
2653    if (sigSz <= 0 && eccKey != NULL) {
2654        sigSz = wc_ecc_sig_size(eccKey);
2655    }
2656#endif
2657    if (sigSz <= 0) {
2658        /* Fallback for unexpected key sizes */
2659        sigSz = 1024;
2660    }
2661
2662    /* Estimate total CRL size by asking AddSignature for the DER wrapper
2663     * size (sequence + algo OID + BIT STRING headers). If it fails (e.g.,
2664     * unknown sigType), fall back to a conservative headroom of 64 bytes for
2665     * those headers. This is defensive (size-estimate only); the real sign
2666     * path will still report any unsupported sigType. */
2667    ret = AddSignature(NULL, tbsSz, &sigDummy, sigSz, sigType);
2668    if (ret < 0) {
2669        ret = tbsSz + sigSz + 64;
2670    }
2671    return ret;
2672}
2673
2674/* Sign a CRL with a private key, rebuilding TBS from fields.
2675 * crl: CRL with fields set via setter functions
2676 * pkey: private key for signing
2677 * md: digest algorithm (e.g., EVP_sha256())
2678 * Note: only one entry is supported in the CRL list.
2679 * Returns WOLFSSL_SUCCESS on success.
2680 */
2681int wolfSSL_X509_CRL_sign(WOLFSSL_X509_CRL* crl, WOLFSSL_EVP_PKEY* pkey,
2682                          const WOLFSSL_EVP_MD* md)
2683{
2684    int ret = WOLFSSL_SUCCESS;
2685    CRL_Entry* entry;
2686    byte* issuerDer = NULL;
2687    int issuerSz = 0;
2688    int sigType = 0;
2689    int tbsSz = 0;
2690    int totalSz = 0;
2691    byte* buf = NULL;
2692    int bufSz = 0;
2693    RsaKey* rsaKey = NULL;
2694    ecc_key* eccKey = NULL;
2695    WC_RNG rng;
2696    int rngInit = 0;
2697
2698    WOLFSSL_ENTER("wolfSSL_X509_CRL_sign");
2699
2700    if (crl == NULL || pkey == NULL || md == NULL) {
2701        return BAD_FUNC_ARG;
2702    }
2703
2704    /* Fetch only the first entry in the CRL list */
2705    entry = crl->crlList;
2706    if (entry == NULL) {
2707        WOLFSSL_MSG("CRL has no entry");
2708        return BAD_FUNC_ARG;
2709    }
2710
2711    /* Determine signature type from digest and key type */
2712    if (ret == WOLFSSL_SUCCESS) {
2713#ifndef NO_RSA
2714        if (pkey->type == WC_EVP_PKEY_RSA) {
2715            if (md == wolfSSL_EVP_sha256()) {
2716                sigType = CTC_SHA256wRSA;
2717            }
2718            #ifdef WOLFSSL_SHA384
2719            else if (md == wolfSSL_EVP_sha384()) {
2720                sigType = CTC_SHA384wRSA;
2721            }
2722            #endif
2723            #ifdef WOLFSSL_SHA512
2724            else if (md == wolfSSL_EVP_sha512()) {
2725                sigType = CTC_SHA512wRSA;
2726            }
2727            #endif
2728            else if (md == wolfSSL_EVP_sha1()) {
2729                sigType = CTC_SHAwRSA;
2730            }
2731            else {
2732                WOLFSSL_MSG("Unsupported digest for RSA");
2733                return BAD_FUNC_ARG;
2734            }
2735            rsaKey = (RsaKey*)pkey->rsa->internal;
2736        }
2737        else
2738#endif
2739#ifdef HAVE_ECC
2740        if (pkey->type == WC_EVP_PKEY_EC) {
2741            if (md == wolfSSL_EVP_sha256()) {
2742                sigType = CTC_SHA256wECDSA;
2743            }
2744            #ifdef WOLFSSL_SHA384
2745            else if (md == wolfSSL_EVP_sha384()) {
2746                sigType = CTC_SHA384wECDSA;
2747            }
2748            #endif
2749            #ifdef WOLFSSL_SHA512
2750            else if (md == wolfSSL_EVP_sha512()) {
2751                sigType = CTC_SHA512wECDSA;
2752            }
2753            #endif
2754            else if (md == wolfSSL_EVP_sha1()) {
2755                sigType = CTC_SHAwECDSA;
2756            }
2757            else {
2758                WOLFSSL_MSG("Unsupported digest for ECDSA");
2759                return BAD_FUNC_ARG;
2760            }
2761            eccKey = (ecc_key*)pkey->ecc->internal;
2762        }
2763        else
2764#endif
2765        {
2766            WOLFSSL_MSG("Unsupported key type");
2767            return BAD_FUNC_ARG;
2768        }
2769    }
2770
2771    /* Get issuer name DER */
2772    if (ret == WOLFSSL_SUCCESS) {
2773        if (entry->issuer != NULL) {
2774            /* Retrieve the issuer in two passes so we can avoid making
2775             * assumptions about the heap that is used, as we must free
2776             * this buffer later. */
2777            issuerSz = wolfSSL_i2d_X509_NAME(entry->issuer, NULL);
2778            if (issuerSz <= 0) {
2779                WOLFSSL_MSG("Failed to encode issuer name");
2780                ret = WOLFSSL_FAILURE;
2781            }
2782            else {
2783                issuerDer = (byte*)XMALLOC((size_t)issuerSz, crl->heap,
2784                                           DYNAMIC_TYPE_TMP_BUFFER);
2785                if (issuerDer == NULL) {
2786                    WOLFSSL_MSG("Memory allocation failed for issuer DER");
2787                    ret = MEMORY_E;
2788                }
2789                else {
2790                    /* i2d moves the pointer, so use a temp */
2791                    byte* tempPtr = issuerDer;
2792                    if (wolfSSL_i2d_X509_NAME(entry->issuer, &tempPtr) <= 0) {
2793                        WOLFSSL_MSG("Failed to encode issuer name");
2794                        ret = WOLFSSL_FAILURE;
2795                    }
2796                }
2797            }
2798        }
2799        else {
2800            WOLFSSL_MSG("CRL has no issuer set");
2801            ret = BAD_FUNC_ARG;
2802        }
2803    }
2804
2805    /* Copy dates from ASN1 time structures to raw fields if needed */
2806    if (ret == WOLFSSL_SUCCESS) {
2807        if (entry->lastDateAsn1.length > 0 && entry->lastDateFormat == 0) {
2808            XMEMCPY(entry->lastDate, entry->lastDateAsn1.data,
2809                    (size_t)entry->lastDateAsn1.length);
2810            entry->lastDateFormat = (byte)entry->lastDateAsn1.type;
2811        }
2812        if (entry->nextDateAsn1.length > 0 && entry->nextDateFormat == 0) {
2813            XMEMCPY(entry->nextDate, entry->nextDateAsn1.data,
2814                    (size_t)entry->nextDateAsn1.length);
2815            entry->nextDateFormat = (byte)entry->nextDateAsn1.type;
2816        }
2817    }
2818
2819    /* Verify we have valid dates */
2820    if (ret == WOLFSSL_SUCCESS) {
2821        if (entry->lastDateFormat == 0) {
2822            WOLFSSL_MSG("CRL has no lastUpdate date set");
2823            ret = BAD_FUNC_ARG;
2824        }
2825    }
2826
2827    /* Initialize RNG */
2828    if (ret == WOLFSSL_SUCCESS) {
2829        if (wc_InitRng(&rng) != 0) {
2830            WOLFSSL_MSG("RNG init failed");
2831            ret = WOLFSSL_FAILURE;
2832        }
2833        else {
2834            rngInit = 1;
2835        }
2836    }
2837
2838    if (ret == WOLFSSL_SUCCESS) {
2839        const byte* crlNumber = NULL;
2840        word32 crlNumberSz = 0;
2841
2842        if (entry->crlNumberSet) {
2843            crlNumber = (const byte*)entry->crlNumber;
2844            crlNumberSz = CRL_MAX_NUM_SZ;
2845        }
2846
2847        /* Determine TBS size, but this does not include the outer signature
2848         * wrapper (AlgorithmIdentifier,  BIT STRING and outer SEQUENCE) */
2849        bufSz = wc_MakeCRL_ex(issuerDer, (word32)issuerSz,
2850                              entry->lastDate, entry->lastDateFormat,
2851                              entry->nextDate, entry->nextDateFormat,
2852                              entry->certs, crlNumber, crlNumberSz,
2853                              sigType, entry->version, NULL, 0);
2854        if (bufSz < 0) {
2855            WOLFSSL_MSG("wc_MakeCRL_ex size check failed");
2856            ret = bufSz;
2857        }
2858    }
2859
2860    if (ret == WOLFSSL_SUCCESS) {
2861        bufSz = GetCrlSignBufSz(bufSz, sigType, rsaKey, eccKey);
2862        if (bufSz <= 0) {
2863            WOLFSSL_MSG("CRL buffer size calc failed");
2864            ret = bufSz;
2865        }
2866    }
2867
2868    /* Allocate working buffer for TBS + signature */
2869    if (ret == WOLFSSL_SUCCESS) {
2870        buf = (byte*)XMALLOC(bufSz, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
2871        if (buf == NULL) {
2872            ret = MEMORY_E;
2873        }
2874    }
2875
2876    /* Build to-be-signed (TBS) portion of the CRL buffer.
2877     * Note that we pass the fields rather than the CRL_entry struct so
2878     * wolfcrypt need not know about the openSSL-compatible CRL_entry struct.
2879     */
2880    if (ret == WOLFSSL_SUCCESS) {
2881        const byte* crlNumber = NULL;
2882        word32 crlNumberSz = 0;
2883
2884        if (entry->crlNumberSet) {
2885            crlNumber = (const byte*)entry->crlNumber;
2886            crlNumberSz = CRL_MAX_NUM_SZ;
2887        }
2888
2889        tbsSz = wc_MakeCRL_ex(issuerDer, (word32)issuerSz,
2890                              entry->lastDate, entry->lastDateFormat,
2891                              entry->nextDate, entry->nextDateFormat,
2892                              entry->certs, crlNumber, crlNumberSz,
2893                              sigType,
2894                              entry->version, buf, bufSz);
2895        if (tbsSz < 0) {
2896            WOLFSSL_MSG("wc_MakeCRL_ex failed");
2897            ret = tbsSz;
2898        }
2899    }
2900
2901    /* Sign and complete CRL. Note that the output buffer is the same as the
2902     * input buffer. The signature is added to the end of the buffer.
2903     */
2904    if (ret == WOLFSSL_SUCCESS) {
2905        totalSz = wc_SignCRL_ex(buf, tbsSz, sigType, buf, bufSz,
2906                                rsaKey, eccKey, &rng);
2907        if (totalSz < 0) {
2908            WOLFSSL_MSG("wc_SignCRL_ex failed");
2909            ret = totalSz;
2910        }
2911    }
2912
2913    /* Update CRL entry with new toBeSigned and signature. Build the new
2914     * buffers first and only commit to entry on full success. */
2915    if (ret == WOLFSSL_SUCCESS) {
2916        byte* newToBeSigned = NULL;
2917        byte* newSignature = NULL;
2918        word32 newTbsSz = 0;
2919        word32 newSignatureSz = 0;
2920        word32 newSignatureOid = 0;
2921
2922        /* Extract TBS and signature from the complete CRL buffer.
2923         * After AddSignature, the buffer layout is:
2924         * [outer SEQUENCE header][TBS][AlgorithmIdentifier][BIT STRING sig]
2925         */
2926        {
2927            word32 idx = 0;
2928            int len = 0;
2929            word32 tbsStart = 0;
2930            word32 tbsLen = 0;
2931            int sigLen = 0;
2932
2933            /* Parse outer SEQUENCE */
2934            if (GetSequence(buf, &idx, &len, (word32)totalSz) < 0) {
2935                ret = ASN_PARSE_E;
2936            }
2937
2938            /* TBS starts here */
2939            if (ret == WOLFSSL_SUCCESS) {
2940                tbsStart = idx;
2941            }
2942
2943            /* Parse TBS SEQUENCE to get its length */
2944            if (ret == WOLFSSL_SUCCESS) {
2945                if (GetSequence(buf, &idx, &len, (word32)totalSz) < 0) {
2946                    ret = ASN_PARSE_E;
2947                }
2948            }
2949            if (ret == WOLFSSL_SUCCESS) {
2950                tbsLen = idx + (word32)len - tbsStart;
2951                idx = tbsStart + tbsLen; /* Move past TBS */
2952            }
2953
2954            /* Allocate and copy TBS */
2955            if (ret == WOLFSSL_SUCCESS) {
2956                newToBeSigned = (byte*)XMALLOC(tbsLen, crl->heap,
2957                                               DYNAMIC_TYPE_CRL_ENTRY);
2958                if (newToBeSigned == NULL) {
2959                    ret = MEMORY_E;
2960                }
2961            }
2962            if (ret == WOLFSSL_SUCCESS) {
2963                XMEMCPY(newToBeSigned, buf + tbsStart, tbsLen);
2964                newTbsSz = tbsLen;
2965            }
2966
2967            /* Skip AlgorithmIdentifier */
2968            if (ret == WOLFSSL_SUCCESS) {
2969                if (GetAlgoId(buf, &idx, (word32*)&len, oidSigType,
2970                        (word32)totalSz) < 0) {
2971                    ret = ASN_PARSE_E;
2972                }
2973            }
2974
2975            /* Get BIT STRING */
2976            if (ret == WOLFSSL_SUCCESS) {
2977                if (GetASNHeader(buf, ASN_BIT_STRING, &idx, &sigLen,
2978                        (word32)totalSz) < 0) {
2979                    ret = ASN_PARSE_E;
2980                }
2981            }
2982
2983            /* Skip unused bits byte */
2984            if (ret == WOLFSSL_SUCCESS) {
2985                if (idx >= (word32)totalSz || sigLen <= 0 || buf[idx] != 0) {
2986                    ret = ASN_PARSE_E;
2987                }
2988            }
2989            if (ret == WOLFSSL_SUCCESS) {
2990                idx++;
2991                sigLen--;
2992            }
2993
2994            if (ret == WOLFSSL_SUCCESS) {
2995                newSignature = (byte*)XMALLOC((word32)sigLen, crl->heap,
2996                                              DYNAMIC_TYPE_CRL_ENTRY);
2997                if (newSignature == NULL) {
2998                    ret = MEMORY_E;
2999                }
3000            }
3001            if (ret == WOLFSSL_SUCCESS) {
3002                XMEMCPY(newSignature, buf + idx, (size_t)sigLen);
3003                newSignatureSz = (word32)sigLen;
3004                newSignatureOid = (word32)sigType;
3005            }
3006        }
3007
3008        if (ret == WOLFSSL_SUCCESS) {
3009            if (entry->toBeSigned != NULL) {
3010                XFREE(entry->toBeSigned, crl->heap, DYNAMIC_TYPE_CRL_ENTRY);
3011                entry->toBeSigned = NULL;
3012            }
3013            if (entry->signature != NULL) {
3014                XFREE(entry->signature, crl->heap, DYNAMIC_TYPE_CRL_ENTRY);
3015                entry->signature = NULL;
3016            }
3017
3018            entry->toBeSigned = newToBeSigned;
3019            entry->tbsSz = newTbsSz;
3020            entry->signature = newSignature;
3021            entry->signatureSz = newSignatureSz;
3022            entry->signatureOID = newSignatureOid;
3023        }
3024        else {
3025            if (newToBeSigned != NULL) {
3026                XFREE(newToBeSigned, crl->heap, DYNAMIC_TYPE_CRL_ENTRY);
3027            }
3028            if (newSignature != NULL) {
3029                XFREE(newSignature, crl->heap, DYNAMIC_TYPE_CRL_ENTRY);
3030            }
3031        }
3032    }
3033
3034    /* Mark the CRL as verified/signed for future reference. */
3035    if (ret == WOLFSSL_SUCCESS) {
3036        entry->verified = 1;
3037    }
3038
3039    if (issuerDer) {
3040        XFREE(issuerDer, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
3041    }
3042    if (buf) {
3043        XFREE(buf, crl->heap, DYNAMIC_TYPE_TMP_BUFFER);
3044    }
3045    if (rngInit) {
3046        wc_FreeRng(&rng);
3047    }
3048
3049    return ret;
3050}
3051#endif /* WOLFSSL_CERT_GEN */
3052
3053#endif /* OPENSSL_EXTRA */
3054
3055#endif /* HAVE_CRL */
3056#endif /* !WOLFCRYPT_ONLY */