cjson
fuzzing
inputs
test1 test10 test11 test2 test3 test3.bu test3.uf test3.uu test4 test5 test6 test7 test8 test9library_config
cJSONConfig.cmake.in cJSONConfigVersion.cmake.in libcjson.pc.in libcjson_utils.pc.in uninstall.cmaketests
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.expectedjson-patch-tests
.editorconfig .gitignore .npmignore README.md cjson-utils-tests.json package.json spec_tests.json tests.jsonunity
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.pydocs
ThrowTheSwitchCodingStandard.md UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf UnityAssertionsReference.md UnityConfigurationGuide.md UnityGettingStartedGuide.md UnityHelperScriptsGuide.md license.txtexamples
unity_config.hcurl
.github
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.yamlworkflows
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.ymlCMake
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.cmakedocs
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.mdexamples
.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.cinternals
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.mdlibcurl
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.incinclude
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.hlib
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.hvauth
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.hvquic
curl_ngtcp2.c curl_ngtcp2.h curl_quiche.c curl_quiche.h vquic-tls.c vquic-tls.h vquic.c vquic.h vquic_int.hvtls
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.hm4
.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.m4projects
OS400
.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.hWindows
tmpl
.gitattributes README.txt curl-all.sln curl.sln curl.vcxproj curl.vcxproj.filters libcurl.sln libcurl.vcxproj libcurl.vcxproj.filtersvms
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.hscripts
.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 wcurlsrc
.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.htests
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.prmdata
.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 test999http
testenv
__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.pylibtest
.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.hserver
.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.ctunit
.gitignore CMakeLists.txt Makefile.am Makefile.inc README.md tool1394.c tool1604.c tool1621.c tool1622.c tool1623.c tool1720.cunit
.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.cexamples
.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.luainiparser
example
iniexample.c iniwrite.c parse.c twisted-errors.ini twisted-genhuge.py twisted-ofkey.ini twisted-ofval.ini twisted.initest
CMakeLists.txt test_dictionary.c test_iniparser.c unity-config.yml unity_config.hjinjac
libjinjac
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.htest
.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.jinjalibev
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-h1luajit
doc
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.htmldynasm
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.luasrc
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.cjit
.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.luawolfssl
.github
workflows
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.ymlIDE
ARDUINO
Arduino_README_prepend.md README.md include.am keywords.txt library.properties.template wolfssl-arduino.cpp wolfssl-arduino.sh wolfssl.hECLIPSE
Espressif
ESP-IDF
examples
template
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266wolfssl_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.vgdbprojwolfssl_client
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_client_ESP8266.vgdbprojwolfssl_server
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_server_ESP8266.vgdbprojwolfssl_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.vgdbprojGCC-ARM
Makefile Makefile.bench Makefile.client Makefile.common Makefile.server Makefile.static Makefile.test README.md include.am linker.ld linker_fips.ldIAR-EWARM
embOS
SAMV71_XULT
embOS_SAMV71_XULT_user_settings
user_settings.h user_settings_simple_example.h user_settings_verbose_example.hembOS_wolfcrypt_benchmark_SAMV71_XULT
README_wolfcrypt_benchmark wolfcrypt_benchmark.ewd wolfcrypt_benchmark.ewpINTIME-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.vcxprojMQX
Makefile README-jp.md README.md client-tls.c include.am server-tls.c user_config.h user_settings.hMSVS-2019-AZSPHERE
wolfssl_new_azsphere
.gitignore CMakeLists.txt CMakeSettings.json app_manifest.json applibs_versions.h launch.vs.json main.cNETOS
Makefile.wolfcrypt.inc README.md include.am user_settings.h user_settings.h-cert2425 user_settings.h-cert3389 wolfssl_netos_custom.cPlatformIO
examples
wolfssl_benchmark
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_benchmark.code-workspaceROWLEY-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.hzpRenesas
e2studio
RA6M3
README.md README_APRA6M_en.md README_APRA6M_jp.md include.amRX72N
EnvisionKit
Simple
README_EN.md README_JP.mdwolfssl_demo
key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h wolfssl_tsip_unit_test.cSTM32Cube
README.md STM32_Benchmarks.md default_conf.ftl include.am main.c wolfssl_example.c wolfssl_example.hWIN
README.txt include.am test.vcxproj user_settings.h user_settings_dtls.h wolfssl-fips.sln wolfssl-fips.vcxprojWIN-SRTP-KDF-140-3
README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxprojWIN10
README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxprojXCODE
Benchmark
include.amXilinxSDK
README.md bench.sh combine.sh eclipse_formatter_profile.xml graph.sh include.am user_settings.h wolfssl_example.capple-universal
wolfssl-multiplatform
iotsafe
Makefile README.md ca-cert.c devices.c devices.h include.am main.c memory-tls.c startup.c target.ld user_settings.hmynewt
README.md apps.wolfcrypttest.pkg.yml crypto.wolfssl.pkg.yml crypto.wolfssl.syscfg.yml include.am setup.shcerts
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.pemcrl
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.pemdilithium
bench_dilithium_level2_key.der bench_dilithium_level3_key.der bench_dilithium_level5_key.der include.amecc
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.cnfed25519
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.pemed448
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.pemexternal
DigiCertGlobalRootCA.pem README.txt ca-digicert-ev.pem ca-globalsign-root.pem ca-google-root.pem ca_collection.pem include.amintermediate
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.conflms
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.ammldsa
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.derocsp
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.derp521
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.pemrpk
client-cert-rpk.der client-ecc-cert-rpk.der include.am server-cert-rpk.der server-ecc-cert-rpk.derrsapss
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.pemslhdsa
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.pemsm2
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.pemstatickeys
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.pemtest
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.p7stest-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.shtest-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.pemxmss
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.amcmake
Config.cmake.in README.md config.in functions.cmake include.am options.h.in wolfssl-config-version.cmake.in wolfssl-targets.cmake.indebian
changelog.in control.in copyright include.am libwolfssl-dev.install libwolfssl.install rules.indoc
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.hheader_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.hexamples
async
Makefile README.md async_client.c async_server.c async_tls.c async_tls.h include.am user_settings.hconfigs
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.hechoclient
echoclient.c echoclient.h echoclient.sln echoclient.vcproj echoclient.vcxproj include.am quitlinuxkm
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.cm4
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.m4mqx
wolfcrypt_benchmark
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.launchwolfcrypt_test
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.launchwolfssl_client
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.launchscripts
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.shsrc
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.ctests
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.hwolfcrypt
benchmark
README.md benchmark-VS2022.sln benchmark-VS2022.vcxproj benchmark-VS2022.vcxproj.user benchmark.c benchmark.h benchmark.sln benchmark.vcproj benchmark.vcxproj include.amsrc
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.pyRenesas
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.carm
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.ccaam
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.cdevcrypto
README.md devcrypto_aes.c devcrypto_ecdsa.c devcrypto_hash.c devcrypto_hmac.c devcrypto_rsa.c devcrypto_x25519.c wc_devcrypto.criscv
riscv-64-aes.c riscv-64-chacha.c riscv-64-poly1305.c riscv-64-sha256.c riscv-64-sha3.c riscv-64-sha512.cwolfssl
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.hwolfcrypt
port
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.hcaam
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.hwrapper
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.adbtests
src
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.adbCSharp
wolfSSL-Example-IOCallbacks
App.config wolfSSL-Example-IOCallbacks.cs wolfSSL-Example-IOCallbacks.csprojwolfSSL-TLS-ServerThreaded
App.config wolfSSL-TLS-ServerThreaded.cs wolfSSL-TLS-ServerThreaded.csprojrust
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.rstests
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.rszephyr
samples
wolfssl_benchmark
CMakeLists.txt README install_test.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.confwolfssl_test
CMakeLists.txt README install_test.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_util.c
raw
1/* renesas_tsip_util.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#ifdef HAVE_CONFIG_H
23 #include <config.h>
24#endif
25
26#include <wolfssl/wolfcrypt/settings.h>
27
28#if defined(WOLFSSL_RENESAS_TSIP)
29
30#include <wolfssl/wolfcrypt/wc_port.h>
31#include <wolfssl/wolfcrypt/types.h>
32#include <wolfssl/wolfcrypt/asn.h>
33#include <wolfssl/wolfcrypt/memory.h>
34#include <wolfssl/wolfcrypt/error-crypt.h>
35#include <wolfssl/wolfcrypt/aes.h>
36#ifdef NO_INLINE
37 #include <wolfssl/wolfcrypt/misc.h>
38#else
39 #define WOLFSSL_MISC_INCLUDED
40 #include <wolfcrypt/src/misc.c>
41#endif
42
43#ifndef WOLFSSL_RENESAS_TSIP_CRYPTONLY
44 #include <wolfssl/ssl.h>
45 #include <wolfssl/internal.h>
46 #include <wolfssl/error-ssl.h>
47#endif
48#include <wolfssl/wolfcrypt/port/Renesas/renesas_tsip_internal.h>
49#include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
50
51#include <stdio.h>
52
53#define TSIP_SIGNING_DATA_PREFIX_SZ 64
54#define TSIP_SIGNING_DATA_PREFIX_BYTE 0x20
55#define TSIP_MAX_SIG_DATA_SZ 130
56#define TSIP_CERT_VFY_LABEL_SZ 34
57
58/* function pointer typedefs for TSIP SHAxx HMAC Verification */
59typedef e_tsip_err_t (*shaHmacInitFn)
60 (tsip_hmac_sha_handle_t*, tsip_hmac_sha_key_index_t*);
61typedef e_tsip_err_t (*shaHmacUpdateFn)
62 (tsip_hmac_sha_handle_t*, uint8_t*, uint32_t);
63typedef e_tsip_err_t (*shaHmacFinalFn)
64 (tsip_hmac_sha_handle_t*, uint8_t*, uint32_t);
65
66/* ./ca-cert.der.sign, */
67/* expect to have these variables defined at user application */
68#if defined(WOLFSSL_RENESAS_TSIP) && (WOLFSSL_RENESAS_TSIP_VER>=109)
69extern uint32_t s_inst2[R_TSIP_SINST2_WORD_SIZE];
70#elif defined(WOLFSSL_RENESAS_TSIP) && (WOLFSSL_RENESAS_TSIP_VER>=106)
71extern uint32_t s_flash[];
72extern uint32_t s_inst1[R_TSIP_SINST_WORD_SIZE];
73#endif
74
75#ifndef SINGLE_THREADED
76wolfSSL_Mutex tsip_mutex;
77static int tsip_CryptHwMutexInit_ = 0;
78#endif
79static tsip_key_data g_user_key_info;
80struct WOLFSSL_HEAP_HINT* tsip_heap_hint = NULL;
81
82/* tsip only keep one encrypted ca public key */
83#if defined(WOLFSSL_RENESAS_TSIP_TLS)
84static const byte* ca_cert_sig = NULL;
85static uint32_t g_encrypted_publicCA_key[R_TSIP_SINST_WORD_SIZE];
86
87/* index of CM table. must be global since renesas_common access it. */
88extern uint32_t g_CAscm_Idx;
89
90#if defined(WOLFSSL_TLS13)
91/* The server certificate verification label. */
92static const byte serverCertVfyLabel[TSIP_CERT_VFY_LABEL_SZ] =
93 "TLS 1.3, server CertificateVerify";
94static const byte clientCertVfyLabel[TSIP_CERT_VFY_LABEL_SZ] =
95 "TLS 1.3, client CertificateVerify";
96#endif /* WOLFSSL_TLS13 */
97
98#endif /* WOLFSSL_RENESAS_TSIP_TLS */
99
100
101
102static int tsip_CryptHwMutexInit(wolfSSL_Mutex* mutex)
103{
104 return wc_InitMutex(mutex);
105}
106
107static int tsip_CryptHwMutexLock(wolfSSL_Mutex* mutex)
108{
109 return wc_LockMutex(mutex);
110}
111
112static int tsip_CryptHwMutexUnLock(wolfSSL_Mutex* mutex)
113{
114 return wc_UnLockMutex(mutex);
115}
116
117#if defined(WOLFSSL_RENESAS_TSIP_TLS)
118/* Set client encrypted public key data.
119 * parameters:
120 * ssl WOLFSSL object
121 * keyBuf buffer holding wrapped key which Renesas key tool generated.
122 * keyBufLen buffer length
123 * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256
124 * return 0 on success, others on failure.
125 */
126WOLFSSL_API int tsip_use_PublicKey_buffer_TLS(WOLFSSL* ssl,
127 const char* keyBuf, int keyBufLen, int keyType)
128{
129 int ret = 0;
130 TsipUserCtx* tuc = NULL;
131
132 WOLFSSL_ENTER("tsip_use_PublicKey_buffer_TLS");
133
134 if (ssl == NULL
135 || keyBuf == NULL || keyBufLen == 0 || ssl->RenesasUserCtx == NULL) {
136 ret = BAD_FUNC_ARG;
137 }
138
139 if (ret == 0){
140 tuc = ssl->RenesasUserCtx;
141 tuc->internal->wrappedPublicKey = (uint8_t*)keyBuf;
142 tuc->wrappedKeyType = keyType;
143 }
144
145 WOLFSSL_LEAVE("tsip_use_PublicKey_buffer", ret);
146 return ret;
147}
148/* Set client encrypted private key data.
149 * parameters:
150 * ssl WOLFSSL object
151 * keyBuf buffer holding wrapped key which Renesas key tool generated.
152 * keyBufLen buffer length
153 * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256
154 * return 0 on success, others on failure.
155 */
156WOLFSSL_API int tsip_use_PrivateKey_buffer_TLS(struct WOLFSSL* ssl,
157 const char* keyBuf, int keyBufLen, int keyType)
158{
159 int ret = 0;
160 TsipUserCtx* tuc = NULL;
161
162 WOLFSSL_ENTER("tsip_use_PrivateKey_buffer_TLS");
163
164 if (ssl == NULL || keyBuf == NULL || keyBufLen == 0 ||
165 ssl->RenesasUserCtx == NULL) {
166 ret = BAD_FUNC_ARG;
167 }
168 if (ret == 0){
169 tuc = ssl->RenesasUserCtx;
170
171 tuc->internal->wrappedPrivateKey = (uint8_t*)keyBuf;
172 tuc->wrappedKeyType = keyType;
173
174 /* store keyType as Id since Id capacity is 32 bytes */
175 ret = wolfSSL_use_PrivateKey_Id(ssl,
176 (const unsigned char*)keyBuf, 32,
177 tuc->devId);
178 if (ret == WOLFSSL_SUCCESS) {
179 ret = 0;
180 }
181 }
182
183 WOLFSSL_LEAVE("tsip_use_PrivateKey_buffer_TLS", ret);
184 return ret;
185}
186#endif /* WOLFSSL_RENESAS_TSIP_TLS */
187
188#if defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
189
190/* Set client encrypted public key data.
191 * parameters:
192 * uc Tsip user context
193 * keyBuf buffer holding wrapped key which Renesas key tool generated.
194 * keyBufLen buffer length
195 * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256
196 * return 0 on success, others on failure.
197 */
198WOLFSSL_API int tsip_use_PublicKey_buffer_crypt(TsipUserCtx *uc,
199 const char* keyBuf, int keyBufLen, int keyType)
200{
201 int ret = 0;
202
203 WOLFSSL_ENTER("tsip_use_PublicKey_buffer_crypt");
204
205 if (uc == NULL || keyBuf == NULL || keyBufLen == 0) {
206 ret = BAD_FUNC_ARG;
207 }
208
209 if (ret == 0){
210 uc->internal->wrappedPublicKey = (uint8_t*)keyBuf;
211 uc->wrappedKeyType = keyType;
212 }
213
214 WOLFSSL_LEAVE("tsip_use_PublicKey_buffer_crypt", ret);
215 return ret;
216}
217/* Set client encrypted private key data.
218 * parameters:
219 * uc Tsip user context
220 * keyBuf buffer holding wrapped key which Renesas key tool generated.
221 * keyBufLen buffer length
222 * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256
223 * return 0 on success, others on failure.
224 */
225WOLFSSL_API int tsip_use_PrivateKey_buffer_crypt(TsipUserCtx *uc,
226 const char* keyBuf, int keyBufLen, int keyType)
227{
228 int ret = 0;
229
230 WOLFSSL_ENTER("tsip_use_PrivateKey_buffer_crypt");
231
232 if (uc == NULL || keyBuf == NULL || keyBufLen == 0 ) {
233 ret = BAD_FUNC_ARG;
234 }
235 if (ret == 0){
236 uc->internal->wrappedPrivateKey = (uint8_t*)keyBuf;
237 uc->wrappedKeyType = keyType;
238 }
239
240 WOLFSSL_LEAVE("tsip_use_PrivateKey_buffer_crypt", ret);
241 return ret;
242}
243#endif /* WOLFSSL_RENESAS_TSIP_CRYPTONLY */
244
245#ifdef WOLFSSL_RENESAS_TSIP_TLS
246
247/* Obsolete function. Use tsip_use_PrivateKey_buffer instead.
248 * Set client encrypted private key data.
249 * parameters:
250 * key Renesas Secure Flash Programmer generated key.
251 * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256
252 * return 0 on success, others on failure.
253 */
254WOLFSSL_API int tsip_set_clientPrivateKeyEnc(const byte* encKey, int keyType)
255{
256 int ret = 0;
257
258 WOLFSSL_ENTER("tsip_set_clientPrivateKeyEnc");
259
260 if (ret == 0) {
261 g_user_key_info.encrypted_user_private_key = (uint8_t*)encKey;
262 g_user_key_info.encrypted_user_private_key_type = keyType;
263 }
264
265 WOLFSSL_LEAVE("tsip_set_clientPrivateKeyEnc", ret);
266 return ret;
267}
268
269
270/* Flush raw handshake messages in MsgBag
271 *
272 */
273static void tsipFlushMessages(struct WOLFSSL* ssl)
274{
275 TsipUserCtx* tuc = NULL;
276 MsgBag* bag = NULL;
277
278 if (ssl == NULL)
279 return;
280
281 /* get user context for TSIP */
282 tuc = ssl->RenesasUserCtx;
283 if (tuc == NULL) {
284 return;
285 }
286
287 bag = &(tuc->internal->messageBag);
288
289 ForceZero(bag, sizeof(MsgBag));
290
291}
292
293
294
295int tsip_TlsCleanup(struct WOLFSSL* ssl)
296{
297 int ret = 0;
298 TsipUserCtx* tuc = NULL;
299
300 if (ssl == NULL)
301 return BAD_FUNC_ARG;
302
303 tuc = ssl->RenesasUserCtx;
304
305 if (tuc == NULL)
306 return ret;
307
308 /* free stored messages */
309 tsipFlushMessages(ssl);
310 /* free internal structure */
311 if (tuc->internal) {
312 XFREE(tuc->internal, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
313 tuc->internal = NULL;
314 }
315
316 /* zero clear */
317 ForceZero(tuc, sizeof(TsipUserCtx));
318
319 return ret;
320}
321
322
323
324#if defined(WOLFSSL_TLS13)
325/* generate ECC P265 key pair for ECDHE.
326 * generated public key is stored in KeyShareEntry.pubkey and private key is
327 * stored in TsipUserCtx.EcdhPrivKey13Idx as tsip specific format.
328 * return 0 on success, CRYPTOCB_UNAVAILABLE when tsip can not handle and is
329 * expecting to fallback to S/W, other negative values on error.
330 */
331int tsip_Tls13GenEccKeyPair(WOLFSSL* ssl, KeyShareEntry* kse)
332{
333 int ret = 0;
334 e_tsip_err_t err = TSIP_SUCCESS;
335 int isTLS13 = 0;
336 word16 curveId;
337 ecc_key* ecckey = NULL;
338 TsipUserCtx* tuc = NULL;
339
340 WOLFSSL_ENTER("tsip_Tls13GenEccKeyPair");
341
342 if (ssl == NULL || kse == NULL)
343 ret = BAD_FUNC_ARG;
344
345 if (ret == 0) {
346 if (ssl->version.major == SSLv3_MAJOR &&
347 ssl->version.minor == TLSv1_3_MINOR) {
348 isTLS13 = 1;
349 }
350 /* TSIP works only in TLS13 client side */
351 if (!isTLS13 || ssl->options.side != WOLFSSL_CLIENT_END) {
352 ret = CRYPTOCB_UNAVAILABLE;
353 }
354 }
355
356 if (ret == 0) {
357 /* TSIP can handle SECP256R1 */
358 if (kse->group != WOLFSSL_ECC_SECP256R1) {
359 WOLFSSL_MSG("TSIP can't handle the specified ECC curve.");
360 ret = CRYPTOCB_UNAVAILABLE;
361 }
362 }
363
364 if (ret == 0) {
365 /* get user context for TSIP */
366 tuc = ssl->RenesasUserCtx;
367 if (tuc == NULL) {
368 ret = CRYPTOCB_UNAVAILABLE;
369 }
370 }
371
372 curveId = ECC_SECP256R1;
373
374 /* Allocate space for the public key */
375 if (ret == 0) {
376 kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
377 DYNAMIC_TYPE_PUBLIC_KEY);
378 if (kse->pubKey == NULL) {
379 WOLFSSL_MSG("Key data Memory error");
380 ret = MEMORY_E;
381 }
382 else {
383 ForceZero(kse->pubKey, kse->pubKeyLen);
384 }
385 }
386
387 /* Allocate an ECC key to hold private key. */
388 if (ret == 0) {
389 kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
390 if (kse->key == NULL) {
391 WOLFSSL_MSG("EccTempKey Memory error");
392 ret = MEMORY_E;
393 }
394 else {
395 ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
396 }
397 }
398 if (ret == 0) {
399 ecckey = (ecc_key*)kse->key;
400 ret = wc_ecc_set_curve(ecckey, kse->keyLen, curveId);
401 }
402
403 kse->pubKey[0] = ECC_POINT_UNCOMP;
404
405 /* generate ecc key pair with TSIP */
406 if (ret == 0) {
407 if ((ret = tsip_hw_lock()) == 0) {
408
409 tuc->internal->Dhe_key_set =0;
410
411 err = R_TSIP_GenerateTls13P256EccKeyIndex(
412 &(tuc->internal->handle13),
413 TSIP_TLS13_MODE_FULL_HANDSHAKE,
414 &(tuc->internal->EcdhPrivKey13Idx),/* private key index */
415 &(kse->pubKey[1])); /* generated public key */
416
417 if (err != TSIP_SUCCESS){ret = WC_HW_E;}
418
419 if (ret == 0) {
420 WOLFSSL_MSG("ECDH private key-index is stored by TSIP");
421 tuc->internal->Dhe_key_set =1;
422 }
423
424 tsip_hw_unlock();
425 }
426 else {
427 WOLFSSL_MSG("mutex locking error");
428 }
429 }
430
431 if ((ret != 0) && (ret != CRYPTOCB_UNAVAILABLE)) {
432 XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
433 kse->key = NULL;
434 XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
435 kse->pubKey = NULL;
436 }
437 WOLFSSL_LEAVE("tsip_Tls13GenEccKeyPair", ret);
438 return ret;
439}
440
441/* generate shared secret(pre-master secret)
442 * get peer's raw ECDHE public key from KeyShareEntry.
443 * The pre-master secret generated by TSIP is stored into
444 * TsipUserCtx.sharedSecret13Idx as TSIP specific format.
445 *
446 * return 0 on success, CRYPTOCB_UNAVAILABLE when tsip can not handle and is
447 * expecting to fallback to S/W, other negative values on error.
448 */
449int tsip_Tls13GenSharedSecret(struct WOLFSSL* ssl,
450 struct KeyShareEntry* kse)
451{
452 int ret = 0;
453 e_tsip_err_t err = TSIP_SUCCESS;
454 int isTLS13 = 0;
455 uint8_t* pubkeyraw = NULL;
456 TsipUserCtx* tuc = NULL;
457
458 WOLFSSL_ENTER("tsip_Tls13GenSharedSecret");
459 if (ssl == NULL || kse == NULL)
460 ret = BAD_FUNC_ARG;
461
462 if (ret == 0) {
463 if (ssl->version.major == SSLv3_MAJOR &&
464 ssl->version.minor == TLSv1_3_MINOR) {
465 isTLS13 = 1;
466 }
467 if (!isTLS13 || ssl->options.side != WOLFSSL_CLIENT_END) {
468 WOLFSSL_MSG("Not in TLS1.3 or in client");
469 ret = CRYPTOCB_UNAVAILABLE;
470 }
471 }
472
473 if (ret == 0) {
474 /* make sure it is in TLS13 and in client side */
475 if (kse->group != WOLFSSL_ECC_SECP256R1) {
476 WOLFSSL_MSG("TSIP can't handle the specified group");
477 ret = CRYPTOCB_UNAVAILABLE;
478 }
479 }
480
481 if (ret == 0) {
482 /* get user context for TSIP */
483 tuc = ssl->RenesasUserCtx;
484 if (tuc == NULL) {
485 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
486 ret = CRYPTOCB_UNAVAILABLE;
487 }
488 }
489
490 if (ret == 0) {
491 if (!tuc->internal->Dhe_key_set) {
492 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
493 ret = CRYPTOCB_UNAVAILABLE;
494 }
495 }
496
497 if (ret == 0) {
498 if ((ret = tsip_hw_lock()) == 0) {
499
500 tuc->internal->SharedSecret_set = 0;
501 pubkeyraw = kse->ke + 1; /* peer's raw public key data */
502
503 /* derive shared secret */
504 err = R_TSIP_Tls13GenerateEcdheSharedSecret(
505 TSIP_TLS13_MODE_FULL_HANDSHAKE,
506 pubkeyraw, /* peer's ECDHE public key */
507 &(tuc->internal->EcdhPrivKey13Idx),/*(out) own ECDHE priv key */
508 &(tuc->internal->sharedSecret13Idx)); /*(out) PreMasterSecret */
509
510 if (err != TSIP_SUCCESS) {
511 WOLFSSL_MSG("R_TSIP_Tls13GenerateEcdheSharedSecret error");
512 ret = WC_HW_E;
513 }
514 if (ret == 0) {
515 /* set flag for later tsip operations */
516 tuc->internal->SharedSecret_set = 1;
517 }
518
519 tsip_hw_unlock();
520 }
521 else {
522 WOLFSSL_MSG("mutex locking error");
523 }
524 }
525
526 WOLFSSL_LEAVE("tsip_Tls13GenSharedSecret", ret);
527 return ret;
528}
529
530int tsip_Tls13DeriveEarlySecret(struct WOLFSSL* ssl)
531{
532 int ret = 0;
533 TsipUserCtx* tuc = NULL;
534
535 WOLFSSL_ENTER("tsip_Tls13DeriveEarlySecret");
536 if (ssl == NULL)
537 ret = BAD_FUNC_ARG;
538
539 if (ret == 0) {
540 /* get user context for TSIP */
541 tuc = ssl->RenesasUserCtx;
542 if (tuc == NULL) {
543 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
544 ret = CRYPTOCB_UNAVAILABLE;
545 }
546 else {
547 tuc->internal->EarlySecret_set = 1;
548 }
549 }
550
551 WOLFSSL_LEAVE("tsip_Tls13DeriveEarlySecret", ret);
552 return ret;
553}
554
555/* derive handshake secret.
556 * get pre-master secret stored in TsipUserCtx.sharedSecret13Idx.
557 * Derived handshake secret is stored into TsipUserCtx.handshakeSecret13Idx
558 * as tsip specific format.
559 *
560 * return 0 on success, CRYPTOCB_UNAVAILABLE when tsip can not handle and is
561 * expecting to fallback to S/W, other negative values on error.
562 */
563int tsip_Tls13DeriveHandshakeSecret(struct WOLFSSL* ssl)
564{
565 int ret = 0;
566 e_tsip_err_t err = TSIP_SUCCESS;
567 int isTLS13 = 0;
568 TsipUserCtx* tuc = NULL;
569
570 WOLFSSL_ENTER("tsip_Tls13DeriveHandshakeSecret");
571 if (ssl == NULL)
572 ret = BAD_FUNC_ARG;
573
574 if (ret == 0) {
575 if (ssl->version.major == SSLv3_MAJOR &&
576 ssl->version.minor == TLSv1_3_MINOR) {
577 isTLS13 = 1;
578 }
579
580 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
581 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
582 }
583 }
584
585 if (ret == 0) {
586 /* get user context for TSIP */
587 tuc = ssl->RenesasUserCtx;
588 if (tuc == NULL) {
589 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
590 ret = CRYPTOCB_UNAVAILABLE;
591 }
592 }
593
594 if (ret == 0) {
595 /* check if pre-master secret is generated by tsip */
596 if (!tuc->internal->SharedSecret_set) {
597 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
598 ret = CRYPTOCB_UNAVAILABLE;
599 }
600 }
601
602 if (ret == 0) {
603 if ((ret = tsip_hw_lock()) == 0) {
604
605 tuc->internal->HandshakeSecret_set = 0;
606
607 err = R_TSIP_Tls13GenerateHandshakeSecret(
608 &(tuc->internal->sharedSecret13Idx),
609 &(tuc->internal->handshakeSecret13Idx));
610
611 if (err != TSIP_SUCCESS) {
612 WOLFSSL_MSG("R_TSIP_Tls13GenerateHandshakeSecret error");
613 ret = WC_HW_E;
614 }
615 if (ret == 0) {
616 tuc->internal->HandshakeSecret_set = 1;
617 }
618 tsip_hw_unlock();
619 }
620 else {
621 WOLFSSL_MSG("mutex locking error");
622 }
623 }
624
625 WOLFSSL_LEAVE("tsip_Tls13DeriveHandshakeSecret", ret);
626 return ret;
627}
628
629static int tsipTls13DeriveClientHandshakeKeys(struct WOLFSSL* ssl)
630{
631 int ret = 0;
632 e_tsip_err_t err = TSIP_SUCCESS;
633 int isTLS13 = 0;
634 TsipUserCtx* tuc = NULL;
635 byte hash[WC_SHA256_DIGEST_SIZE];
636
637
638 WOLFSSL_ENTER("tsipTls13DeriveClientHandshakeKeys");
639 if (ssl == NULL)
640 ret = BAD_FUNC_ARG;
641
642 if (ret == 0) {
643 if (ssl->version.major == SSLv3_MAJOR &&
644 ssl->version.minor == TLSv1_3_MINOR) {
645 isTLS13 = 1;
646 }
647 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
648 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
649 }
650 }
651
652 if (ret == 0) {
653 /* get user context for TSIP */
654 tuc = ssl->RenesasUserCtx;
655 if (tuc == NULL) {
656 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
657 ret = CRYPTOCB_UNAVAILABLE;
658 }
659 }
660
661 if (ret == 0) {
662 /* make sure client handshake secret is generated by tsip */
663 if (!tuc->internal->HandshakeSecret_set) {
664 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
665 ret = CRYPTOCB_UNAVAILABLE;
666 }
667 }
668
669 if (ret == 0) {
670 /* get digest of handshake messages */
671 ret = tsip_GetMessageSha256(ssl, hash, NULL);
672 }
673
674 if (ret == 0) {
675 if ((ret = tsip_hw_lock()) == 0) {
676
677 tuc->internal->HandshakeClientTrafficKey_set = 0;
678
679 err = R_TSIP_Tls13GenerateClientHandshakeTrafficKey(
680 &(tuc->internal->handle13),
681 TSIP_TLS13_MODE_FULL_HANDSHAKE,
682 &(tuc->internal->handshakeSecret13Idx),
683 hash,
684 &(tuc->internal->clientWriteKey13Idx),
685 &(tuc->internal->clientFinished13Idx));
686
687 if (err != TSIP_SUCCESS) {
688 WOLFSSL_MSG(
689 "R_TSIP_Tls13GenerateClientHandshakeTrafficKey error");
690 ret = WC_HW_E;
691 }
692
693 /* key derivation succeeded */
694 if (ret == 0) {
695 tuc->internal->HandshakeClientTrafficKey_set = 1;
696 }
697
698 tsip_hw_unlock();
699 }
700 else {
701 WOLFSSL_MSG("mutex locking error");
702 }
703 }
704
705 WOLFSSL_LEAVE("tsipTls13DeriveClientHandshakeKeys", ret);
706 return ret;
707}
708
709static int tsipTls13DeriveServerHandshakeKeys(struct WOLFSSL* ssl)
710{
711 int ret = 0;
712 e_tsip_err_t err = TSIP_SUCCESS;
713 int isTLS13 = 0;
714 TsipUserCtx* tuc = NULL;
715 byte hash[WC_SHA256_DIGEST_SIZE];
716
717
718 WOLFSSL_ENTER("tsipTls13DeriveServerHandshakeKeys");
719 if (ssl == NULL)
720 ret = BAD_FUNC_ARG;
721
722 if (ret == 0) {
723 if (ssl->version.major == SSLv3_MAJOR &&
724 ssl->version.minor == TLSv1_3_MINOR) {
725 isTLS13 = 1;
726 }
727 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
728 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
729 }
730 }
731
732 if (ret == 0) {
733 /* get user context for TSIP */
734 tuc = ssl->RenesasUserCtx;
735 if (tuc == NULL) {
736 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
737 ret = CRYPTOCB_UNAVAILABLE;
738 }
739 }
740
741 if (ret == 0) {
742 /* make sure client handshake secret is generated by tsip */
743 if (!tuc->internal->HandshakeSecret_set) {
744 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
745 ret = CRYPTOCB_UNAVAILABLE;
746 }
747 }
748
749 if (ret == 0) {
750 /* get digest of handshake packets */
751 ret = tsip_GetMessageSha256(ssl, hash, NULL);
752 }
753
754 if (ret == 0) {
755 if ((ret = tsip_hw_lock()) == 0) {
756
757 tuc->internal->HandshakeServerTrafficKey_set = 0;
758
759 err = R_TSIP_Tls13GenerateServerHandshakeTrafficKey(
760 &(tuc->internal->handle13),
761 TSIP_TLS13_MODE_FULL_HANDSHAKE,
762 &(tuc->internal->handshakeSecret13Idx),
763 hash,
764 &(tuc->internal->serverWriteKey13Idx),
765 &(tuc->internal->serverFinished13Idx));
766
767 if (err != TSIP_SUCCESS) {
768 WOLFSSL_MSG(
769 "R_TSIP_Tls13GenerateServerHandshakeTrafficKey error");
770 ret = WC_HW_E;
771 }
772
773 /* key derivation succeeded */
774 if (ret == 0) {
775 tuc->internal->HandshakeServerTrafficKey_set = 1;
776 }
777
778 tsip_hw_unlock();
779 }
780 else {
781 WOLFSSL_MSG("mutex locking error");
782 }
783 }
784
785 WOLFSSL_LEAVE("tsipTls13DeriveServerHandshakeKeys", ret);
786 return ret;
787}
788
789static int tsipTls13DeriveTrafficKeys(struct WOLFSSL* ssl)
790{
791 int ret = 0;
792 e_tsip_err_t err = TSIP_SUCCESS;
793 int isTLS13 = 0;
794 TsipUserCtx* tuc = NULL;
795 byte hash[WC_SHA256_DIGEST_SIZE];
796
797
798 WOLFSSL_ENTER("tsipTls13DeriveTrafficKeys");
799 if (ssl == NULL)
800 ret = BAD_FUNC_ARG;
801
802 if (ret == 0) {
803 if (ssl->version.major == SSLv3_MAJOR &&
804 ssl->version.minor == TLSv1_3_MINOR) {
805 isTLS13 = 1;
806 }
807 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
808 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
809 }
810 }
811
812 if (ret == 0) {
813 /* get user context for TSIP */
814 tuc = ssl->RenesasUserCtx;
815 if (tuc == NULL) {
816 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
817 ret = CRYPTOCB_UNAVAILABLE;
818 }
819 }
820
821 if (ret == 0) {
822 /* make sure master secret is generated by tsip */
823 if (!tuc->internal->MasterSecret_set) {
824 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
825 ret = CRYPTOCB_UNAVAILABLE;
826 }
827 }
828
829 if (ret == 0) {
830 /* get digest of handshake messages */
831 ret = tsip_GetMessageSha256(ssl, hash, NULL);
832 }
833
834 if (ret == 0) {
835 if ((ret = tsip_hw_lock()) == 0) {
836
837 tuc->internal->ServerTrafficSecret_set = 0;
838 tuc->internal->ClientTrafficSecret_set = 0;
839 tuc->internal->ServerWriteTrafficKey_set = 0;
840 tuc->internal->ClientWriteTrafficKey_set = 0;
841
842 err = R_TSIP_Tls13GenerateApplicationTrafficKey(
843 &(tuc->internal->handle13),
844 TSIP_TLS13_MODE_FULL_HANDSHAKE,
845 &(tuc->internal->masterSecret13Idx),
846 (uint8_t*)hash,
847 &(tuc->internal->serverAppTraffic13Secret),
848 &(tuc->internal->clientAppTraffic13Secret),
849 &(tuc->internal->serverAppWriteKey13Idx),
850 &(tuc->internal->clientAppWriteKey13Idx));
851
852 if (err != TSIP_SUCCESS) {
853 WOLFSSL_MSG(
854 "R_TSIP_Tls13GenerateApplicationTrafficKey error");
855 ret = WC_HW_E;
856 }
857
858 /* key derivation succeeded */
859 if (ret == 0) {
860 tuc->internal->ServerTrafficSecret_set = 1;
861 tuc->internal->ClientTrafficSecret_set = 1;
862 tuc->internal->ServerWriteTrafficKey_set = 1;
863 tuc->internal->ClientWriteTrafficKey_set = 1;
864 }
865
866 tsip_hw_unlock();
867 }
868 else {
869 WOLFSSL_MSG("mutex locking error");
870 }
871 }
872
873 WOLFSSL_LEAVE("tsipTls13DeriveTrafficKeys", ret);
874 return ret;
875}
876
877static int tsipTls13UpdateClientTrafficKeys(struct WOLFSSL* ssl)
878{
879 int ret = 0;
880 e_tsip_err_t err = TSIP_SUCCESS;
881 int isTLS13 = 0;
882 TsipUserCtx* tuc = NULL;
883
884 WOLFSSL_ENTER("tsipTls13UpdateClientTrafficKeys");
885
886 if (ssl == NULL)
887 ret = BAD_FUNC_ARG;
888
889 if (ret == 0) {
890 if (ssl->version.major == SSLv3_MAJOR &&
891 ssl->version.minor == TLSv1_3_MINOR) {
892 isTLS13 = 1;
893 }
894 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
895 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
896 }
897 }
898
899 if (ret == 0) {
900 /* get user context for TSIP */
901 tuc = ssl->RenesasUserCtx;
902 if (tuc == NULL) {
903 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
904 ret = CRYPTOCB_UNAVAILABLE;
905 }
906 }
907
908 if (ret == 0) {
909 /* make sure application secret is generated by tsip */
910 if (!tuc->internal->ClientTrafficSecret_set) {
911 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
912 ret = CRYPTOCB_UNAVAILABLE;
913 }
914 }
915 if (ret == 0) {
916 if ((ret = tsip_hw_lock()) == 0) {
917
918 tuc->internal->ClientWriteTrafficKey_set = 0;
919
920 err = R_TSIP_Tls13UpdateApplicationTrafficKey(
921 &(tuc->internal->handle13),
922 TSIP_TLS13_MODE_FULL_HANDSHAKE,
923 TSIP_TLS13_UPDATE_CLIENT_KEY,
924 &(tuc->internal->clientAppTraffic13Secret),
925 &(tuc->internal->clientAppTraffic13Secret),
926 &(tuc->internal->clientAppWriteKey13Idx));
927 if (err != TSIP_SUCCESS) {
928 WOLFSSL_MSG("R_TSIP_Tls13UpdateApplicationTrafficKey error");
929 ret = WC_HW_E;
930 }
931 else {
932 tuc->internal->ClientWriteTrafficKey_set = 1;
933 }
934 tsip_hw_unlock();
935 }
936 else {
937 WOLFSSL_MSG("mutex locking error");
938 }
939 }
940
941 WOLFSSL_LEAVE("tsipTls13UpdateClientTrafficKeys", ret);
942 return ret;
943}
944
945static int tsipTls13UpdateServerTrafficKeys(struct WOLFSSL* ssl)
946{
947 int ret = 0;
948 e_tsip_err_t err = TSIP_SUCCESS;
949 int isTLS13 = 0;
950 TsipUserCtx* tuc = NULL;
951
952 WOLFSSL_ENTER("tsipTls13UpdateServerTrafficKeys");
953
954 if (ssl == NULL)
955 ret = BAD_FUNC_ARG;
956
957 if (ret == 0) {
958 if (ssl->version.major == SSLv3_MAJOR &&
959 ssl->version.minor == TLSv1_3_MINOR) {
960 isTLS13 = 1;
961 }
962 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
963 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
964 }
965 }
966
967 if (ret == 0) {
968 /* get user context for TSIP */
969 tuc = ssl->RenesasUserCtx;
970 if (tuc == NULL) {
971 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
972 ret = CRYPTOCB_UNAVAILABLE;
973 }
974 }
975
976 if (ret == 0) {
977 /* make sure application secret is generated by tsip */
978 if (!tuc->internal->ServerTrafficSecret_set) {
979 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
980 ret = CRYPTOCB_UNAVAILABLE;
981 }
982 }
983 if (ret == 0) {
984 if ((ret = tsip_hw_lock()) == 0) {
985
986 tuc->internal->ServerWriteTrafficKey_set = 0;
987
988 err = R_TSIP_Tls13UpdateApplicationTrafficKey(
989 &(tuc->internal->handle13),
990 TSIP_TLS13_MODE_FULL_HANDSHAKE,
991 TSIP_TLS13_UPDATE_SERVER_KEY,
992 &(tuc->internal->serverAppTraffic13Secret),
993 &(tuc->internal->serverAppTraffic13Secret),
994 &(tuc->internal->serverAppWriteKey13Idx));
995 if (err != TSIP_SUCCESS) {
996 WOLFSSL_MSG("R_TSIP_Tls13UpdateApplicationTrafficKey error");
997 ret = WC_HW_E;
998 }
999 else {
1000 tuc->internal->ServerWriteTrafficKey_set = 1;
1001 }
1002 tsip_hw_unlock();
1003 }
1004 else {
1005 WOLFSSL_MSG("mutex locking error");
1006 }
1007 }
1008
1009 WOLFSSL_LEAVE("tsipTls13UpdateServerTrafficKeys", ret);
1010 return ret;
1011}
1012
1013/* Derive the keys for TLS v1.3.
1014 *
1015 * ssl The WOLFSSL object.
1016 * keyType kind of keys to derive.
1017 * handshake_key: when deriving keys for encrypting handshake messages.
1018 * traffic_key: when deriving first keys for encrypting traffic messages.
1019 * update_traffic_key: when deriving next keys for encrypting
1020 * traffic messages.
1021 *
1022 * side ENCRYPT_SIDE_ONLY: when only encryption secret needs to be derived.
1023 * DECRYPT_SIDE_ONLY: when only decryption secret needs to be derived.
1024 * ENCRYPT_AND_DECRYPT_SIDE: when both secret needs to be derived.
1025 *
1026 * returns 0 on success, CRYPTOCB_UNAVAILABLE when tsip can not handle and is
1027 * expecting to fallback to S/W, other negative values on error.
1028 */
1029int tsip_Tls13DeriveKeys(struct WOLFSSL* ssl,
1030 int keyType, int side)
1031{
1032 int ret = 0;
1033 int provision;
1034
1035 WOLFSSL_ENTER("tsip_Tls13DeriveKeys");
1036
1037 if (side == ENCRYPT_AND_DECRYPT_SIDE) {
1038 provision = PROVISION_CLIENT_SERVER;
1039 }
1040 else {
1041 provision = ((ssl->options.side != WOLFSSL_CLIENT_END) ^
1042 (side == ENCRYPT_SIDE_ONLY)) ? PROVISION_CLIENT :
1043 PROVISION_SERVER;
1044 }
1045 /* derive client key */
1046 switch (keyType) {
1047 case early_data_key:
1048 WOLFSSL_MSG("TSIP can't handle early data key");
1049 ret = CRYPTOCB_UNAVAILABLE;
1050 break;
1051
1052 case handshake_key:
1053 if (provision & PROVISION_CLIENT) {
1054 ret = tsipTls13DeriveClientHandshakeKeys(ssl);
1055 }
1056 break;
1057
1058 case traffic_key:
1059 ret = tsipTls13DeriveTrafficKeys(ssl);
1060 break;
1061
1062 case update_traffic_key:
1063 if (provision & PROVISION_CLIENT) {
1064 ret = tsipTls13UpdateClientTrafficKeys(ssl);
1065 }
1066 break;
1067
1068 default:
1069 ret = CRYPTOCB_UNAVAILABLE;
1070 break;
1071 }
1072
1073 if (ret == 0) {
1074 /* derive server key */
1075 switch (keyType) {
1076 case early_data_key:
1077 WOLFSSL_MSG("TSIP can't handle early data key");
1078 ret = CRYPTOCB_UNAVAILABLE;
1079 break;
1080
1081 case handshake_key:
1082 if (provision & PROVISION_SERVER) {
1083 ret = tsipTls13DeriveServerHandshakeKeys(ssl);
1084 }
1085 break;
1086
1087 case traffic_key:
1088 /* traffic key for server was derived in
1089 * tsipTls13DeriveTrafficKeys
1090 */
1091 break;
1092
1093 case update_traffic_key:
1094 if (provision & PROVISION_SERVER) {
1095 ret = tsipTls13UpdateServerTrafficKeys(ssl);
1096 }
1097 break;
1098
1099 default:
1100 ret = CRYPTOCB_UNAVAILABLE;
1101 break;
1102 }
1103 }
1104 WOLFSSL_LEAVE("tsip_Tls13DeriveKeys", ret);
1105 return ret;
1106}
1107
1108int tsip_Tls13DeriveMasterSecret(struct WOLFSSL* ssl)
1109{
1110 int ret = 0;
1111 e_tsip_err_t err = TSIP_SUCCESS;
1112 int isTLS13 = 0;
1113 TsipUserCtx* tuc = NULL;
1114
1115 WOLFSSL_ENTER("tsip_Tls13DeriveMasterSecret");
1116
1117 if (ssl == NULL)
1118 ret = BAD_FUNC_ARG;
1119
1120 if (ret == 0) {
1121 if (ssl->version.major == SSLv3_MAJOR &&
1122 ssl->version.minor == TLSv1_3_MINOR) {
1123 isTLS13 = 1;
1124 }
1125 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
1126 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
1127 }
1128 }
1129 if (ret == 0) {
1130 /* get user context for TSIP */
1131 tuc = ssl->RenesasUserCtx;
1132 if (tuc == NULL) {
1133 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
1134 ret = CRYPTOCB_UNAVAILABLE;
1135 }
1136 }
1137 if (ret == 0) {
1138 /* make sure handshake secret and verify data has been set by TSIP */
1139 if (!tuc->internal->HandshakeSecret_set ||
1140 !tuc->internal->HandshakeVerifiedData_set) {
1141 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
1142 ret = CRYPTOCB_UNAVAILABLE;
1143 }
1144 }
1145 if (ret == 0) {
1146 if ((ret = tsip_hw_lock()) == 0) {
1147
1148 tuc->internal->MasterSecret_set = 0;
1149
1150 err = R_TSIP_Tls13GenerateMasterSecret(
1151 &(tuc->internal->handle13),
1152 TSIP_TLS13_MODE_FULL_HANDSHAKE,
1153 &(tuc->internal->handshakeSecret13Idx),
1154 (uint32_t*)tuc->internal->verifyData13Idx,
1155 &(tuc->internal->masterSecret13Idx));
1156
1157 if (err != TSIP_SUCCESS) {
1158 WOLFSSL_MSG(
1159 "R_TSIP_Tls13GenerateMasterSecret( error");
1160 ret = WC_HW_E;
1161 }
1162
1163 if (ret == 0) {
1164 tuc->internal->MasterSecret_set = 1;
1165 }
1166
1167 tsip_hw_unlock();
1168 }
1169 else {
1170 WOLFSSL_MSG("mutex locking error");
1171 }
1172 }
1173
1174 WOLFSSL_LEAVE("tsip_Tls13DeriveMasterSecret", ret);
1175 return ret;
1176}
1177
1178/* verify handshake
1179 * ssl WOLFSSL object
1180 * hash buffer holding decrypted finished message content from server.
1181 *
1182 */
1183static int tsipTls13VerifyHandshake(struct WOLFSSL* ssl,
1184 const byte* hash)/*finished message*/
1185{
1186 int ret = 0;
1187 e_tsip_err_t err = TSIP_SUCCESS;
1188 int isTLS13 = 0;
1189 TsipUserCtx* tuc = NULL;
1190 word32 msgHash[WC_SHA256_DIGEST_SIZE/sizeof(word32)];
1191
1192 WOLFSSL_ENTER("tsipTls13VerifyHandshake");
1193
1194 if (ssl == NULL)
1195 ret = BAD_FUNC_ARG;
1196
1197 if (ret == 0) {
1198 if (ssl->version.major == SSLv3_MAJOR &&
1199 ssl->version.minor == TLSv1_3_MINOR) {
1200 isTLS13 = 1;
1201 }
1202 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
1203 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
1204 }
1205 }
1206
1207 if (ret == 0) {
1208 /* get user context for TSIP */
1209 tuc = ssl->RenesasUserCtx;
1210 if (tuc == NULL) {
1211 WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl.");
1212 ret = CRYPTOCB_UNAVAILABLE;
1213 }
1214 }
1215
1216 if (ret == 0) {
1217 /* make sure handshake secret is generated by tsip */
1218 if (!tuc->internal->HandshakeServerTrafficKey_set) {
1219 WOLFSSL_MSG("TSIP wasn't involved in the key-exchange.");
1220 ret = CRYPTOCB_UNAVAILABLE;
1221 }
1222 }
1223 /* get digest of handshake messages */
1224 if (ret == 0) {
1225 ret = tsip_GetMessageSha256(ssl, (byte*)msgHash, NULL);
1226 }
1227
1228 if (ret == 0) {
1229 if ((ret = tsip_hw_lock()) == 0) {
1230
1231 tuc->internal->HandshakeVerifiedData_set = 0;
1232
1233 err = R_TSIP_Tls13ServerHandshakeVerification(
1234 TSIP_TLS13_MODE_FULL_HANDSHAKE,
1235 &(tuc->internal->serverFinished13Idx),
1236 (uint8_t*)msgHash,
1237 (uint8_t*)hash,
1238 (uint32_t*)(tuc->internal->verifyData13Idx));
1239
1240 if (err == TSIP_ERR_VERIFICATION_FAIL) {
1241 WOLFSSL_MSG("Handshake verification error");
1242 ret = VERIFY_FINISHED_ERROR;
1243 }
1244 else if (err != TSIP_SUCCESS) {
1245 WOLFSSL_MSG("R_TSIP_Tls13ServerHandshakeVerification error");
1246 ret = WC_HW_E;
1247 }
1248 if (ret == 0) {
1249 WOLFSSL_MSG("Verified handshake");
1250 tuc->internal->HandshakeVerifiedData_set = 1;
1251 }
1252
1253 tsip_hw_unlock();
1254 }
1255 else {
1256 WOLFSSL_MSG("mutex locking error");
1257 }
1258 }
1259
1260 WOLFSSL_LEAVE("tsipTls13VerifyHandshake", ret);
1261 return ret;
1262}
1263
1264/* handles finished message from server.
1265 * verify hmac in the message. Also output verify data to
1266 * TsipUserCtx.verifyDataIdx, which is used for deriving master secret.
1267 *
1268 * ssl WOLFSSL object
1269 * input the buffer holding decrypted finished message, type and padding
1270 * inOutIdx On entry, the index into the message content of Finished.
1271 * On exit, the index of byte after the Finished message and padding.
1272 * size Length of message content(excluding type and padding)
1273 * totalSz Length in the record header. means message + type + pad.
1274 * return 0, on success, others on failure.
1275 */
1276int tsip_Tls13HandleFinished(
1277 struct WOLFSSL* ssl,
1278 const byte* input,
1279 word32* inOutIdx,
1280 word32 size,
1281 word32 totalSz)
1282{
1283 int ret = 0;
1284
1285 WOLFSSL_ENTER("tsip_Tls13HandleFinished");
1286
1287 if (ssl == NULL || input == NULL || inOutIdx == NULL) {
1288 ret = BAD_FUNC_ARG;
1289 }
1290
1291 if (ret == 0) {
1292 ret = tsipTls13VerifyHandshake(ssl, input + *inOutIdx);
1293 }
1294
1295 if (ret == 0) {
1296 /* Force input exhaustion at ProcessReply by consuming padSz. */
1297 *inOutIdx += size + ssl->keys.padSz;
1298
1299 ssl->options.serverState = SERVER_FINISHED_COMPLETE;
1300 }
1301
1302 WOLFSSL_LEAVE("tsip_Tls13HandleFinished", ret);
1303 return ret;
1304}
1305
1306/* Build TLS v1.3 Message and make it encrypted with AEAD algorithm.
1307 * TSIP supports AES-GCM and AES-CCM.
1308 * ssl The WOLFSSL object.
1309 * output The buffer to write record message to.
1310 * outSz Size of the buffer being written into.
1311 * input The handshake message data to encrypt (excluding trailing type).
1312 * inSz The size of the handshake message (including message header).
1313 * type The real content type being put after the message data.
1314 * hashOutput Whether to hash the unencrypted record data.
1315 * returns the size of the record including header, CRYPTOCB_UNAVAILABLE
1316 * when tsip can not handle and is expecting to fallback to S/W,
1317 * other negative values on error.
1318 */
1319int tsip_Tls13BuildMessage(struct WOLFSSL* ssl,
1320 byte* output,
1321 int outSz,
1322 const byte* input,
1323 int inSz,
1324 int type,
1325 int hashOutput)
1326{
1327 int ret = 0;
1328 int recSz;
1329 int isTLS13 = 0;
1330 RecordLayerHeader* rl = NULL;
1331 (void)outSz;
1332
1333 WOLFSSL_ENTER("tsip_Tls13BuildMessage");
1334
1335 if (ssl == NULL || output == NULL || input == NULL) {
1336 ret = BAD_FUNC_ARG;
1337 }
1338
1339 if (ret == 0) {
1340 if (ssl->version.major == SSLv3_MAJOR &&
1341 ssl->version.minor == TLSv1_3_MINOR) {
1342 isTLS13 = 1;
1343 }
1344 if (!isTLS13 || (ssl->options.side != WOLFSSL_CLIENT_END)) {
1345 ret = CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */
1346 }
1347 }
1348
1349 if (ret == 0) {
1350 /* make sure hash algorithm is SHA256 */
1351 if (ssl->specs.mac_algorithm != sha256_mac ) {
1352 WOLFSSL_MSG("TSIP can't handle this hash algorithm.");
1353 ret = CRYPTOCB_UNAVAILABLE;
1354 }
1355 }
1356
1357 if (ret == 0) {
1358 if ((ssl->specs.bulk_cipher_algorithm != wolfssl_aes_gcm) &&
1359 (ssl->specs.bulk_cipher_algorithm != wolfssl_aes_ccm)) {
1360 WOLFSSL_MSG("TSIP can't handle the specified algorithm");
1361 ret = CRYPTOCB_UNAVAILABLE;
1362 }
1363 }
1364
1365 if (ret == 0) {
1366 /* set size in record header */
1367 recSz = inSz + 1 + ssl->specs.aead_mac_size;
1368
1369 /* update the record header with the new size. */
1370 rl = (RecordLayerHeader*)output;
1371 rl->type = application_data;
1372 rl->pvMajor = ssl->version.major;
1373 rl->pvMinor = TLSv1_2_MINOR;
1374 c16toa((word16)recSz, rl->length);
1375
1376 if (input != output + RECORD_HEADER_SZ) {
1377 XMEMCPY(output + RECORD_HEADER_SZ, input, inSz);
1378 }
1379
1380 if (hashOutput) {
1381 ret = HashOutput(ssl, output, RECORD_HEADER_SZ + inSz, 0);
1382 }
1383 }
1384 if (ret == 0) {
1385 /* The real record content type goes at the end of the data. */
1386 output[RECORD_HEADER_SZ + inSz] = (byte)type;
1387
1388 ret = tsip_Tls13AesEncrypt(ssl,
1389 output + RECORD_HEADER_SZ, /* output */
1390 output + RECORD_HEADER_SZ, /* plain message */
1391 inSz + 1); /* plain data size(= inSz + 1 for type) */
1392
1393 if (ret > 0) {
1394 ret = recSz + RECORD_HEADER_SZ; /* return record size */
1395 }
1396 }
1397
1398 WOLFSSL_LEAVE("tsip_Tls13BuildMessage", ret);
1399 return ret;
1400}
1401
1402/* Send finished message to the server.
1403 *
1404 * ssl WOLFSSL object
1405 * output buffer to output packet, including packet header and finished message
1406 * outSz buffer size of output
1407 * input buffer holding finished message
1408 * hashOut
1409 * return 0 on success, CRYPTOCB_UNAVAILABLE when TSIP can not handle,
1410 * other negative values on error.
1411 */
1412int tsip_Tls13SendFinished(
1413 struct WOLFSSL* ssl,
1414 byte* output,
1415 int outSz,
1416 const byte* input,
1417 int hashOut)
1418{
1419 int ret = 0;
1420 int finishedSz;
1421 int headerSz = HANDSHAKE_HEADER_SZ;
1422 int recordSz;
1423
1424 WOLFSSL_ENTER("tsip_Tls13SendFinished");
1425
1426 if (ssl == NULL || output == NULL || input == NULL || outSz == 0) {
1427 ret = BAD_FUNC_ARG;
1428 }
1429
1430 if (ret == 0) {
1431 finishedSz = ssl->specs.hash_size;
1432
1433 ret = tsip_Tls13GetHmacMessages(ssl, (byte*)&input[headerSz]);
1434 }
1435
1436 if (ret == 0) {
1437 recordSz = WC_MAX_DIGEST_SIZE + DTLS_HANDSHAKE_HEADER_SZ + MAX_MSG_EXTRA;
1438 /* check for available size */
1439 ret = CheckAvailableSize(ssl, recordSz);
1440 recordSz = 0;
1441 }
1442
1443 if (ret == 0) {
1444 recordSz = tsip_Tls13BuildMessage(ssl,
1445 output, outSz,
1446 input, headerSz + finishedSz,
1447 handshake, hashOut);
1448
1449 if (recordSz > 0) {
1450 ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
1451 ssl->options.handShakeState = HANDSHAKE_DONE;
1452 ssl->options.handShakeDone = 1;
1453 ssl->buffers.outputBuffer.length += recordSz; /* advance length */
1454
1455 ret = SendBuffered(ssl);
1456 }
1457 else {
1458 ret = recordSz;
1459 }
1460 }
1461 WOLFSSL_LEAVE("tsip_Tls13SendFinished", ret);
1462 return ret;
1463}
1464
1465/* Parse and handle a TLS v1.3 CertificateVerify message sent from a server.
1466 *
1467 * ssl WOLFSSL object
1468 * input buffer holding certificate verify message
1469 * inOutIdx On entry, the index into the message buffer of
1470 * CertificateVerify.
1471 * On exit, the index of byte after the CertificateVerify message.
1472 * totalSz The length of the current handshake message.
1473 * return 0 on success, CRYPTOCB_UNAVAILABLE when TSIP can not handle,
1474 * other negative values on error.
1475 */
1476int tsip_Tls13CertificateVerify(struct WOLFSSL* ssl,
1477 const byte* input, word32* inOutIdx,
1478 word32 totalSz)
1479{
1480 int ret = 0;
1481 byte* sigData = NULL;
1482 byte hiAlgo,loAlgo;
1483 int messageSz;
1484 word16 signatureLen;
1485 word16 idx;
1486 e_tsip_err_t err = TSIP_SUCCESS;
1487 TsipUserCtx* tuc = NULL;
1488 e_tsip_tls13_signature_scheme_type_t sig_scheme;
1489
1490 WOLFSSL_ENTER("tsip_Tls13CertificateVerify");
1491
1492
1493 if (ssl == NULL || input == NULL || inOutIdx == NULL) {
1494 ret = BAD_FUNC_ARG;
1495 }
1496
1497 if (ret == 0) {
1498 if (ENUM_LEN + ENUM_LEN > totalSz) {
1499 ret = BUFFER_ERROR;
1500 }
1501 /* parse certificate verify message to get hash-algo */
1502 hiAlgo = *(input + *inOutIdx);
1503 loAlgo = *(input + *inOutIdx + 1);
1504 }
1505 if (ret == 0) {
1506 /* get signature length */
1507 ato16(input + *inOutIdx + 2, &signatureLen);
1508
1509 if (ENUM_LEN + ENUM_LEN + OPAQUE16_LEN > totalSz) {
1510 ret = BUFFER_ERROR;
1511 }
1512 }
1513 if (ret == 0) {
1514 if (ENUM_LEN + ENUM_LEN + OPAQUE16_LEN + signatureLen > totalSz) {
1515 ret = BUFFER_ERROR;
1516 }
1517 }
1518 if (ret == 0) {
1519 /* check if tsip accepts signature algorithm */
1520 if (hiAlgo == NEW_SA_MAJOR && loAlgo == sha256_mac) {
1521 /* rsa_pss_rsae_sha256 0x0804 */
1522 WOLFSSL_MSG("Peer sent RSA sig");
1523 sig_scheme = TSIP_TLS13_SIGNATURE_SCHEME_RSA_PSS_RSAE_SHA256;
1524 }
1525 else if (hiAlgo == 0x04 && loAlgo == ecc_dsa_sa_algo) {
1526 /* ecdsa_secp256r1_sha256 0x0403 */
1527 WOLFSSL_MSG("Peer sent ECC sig");
1528 sig_scheme = TSIP_TLS13_SIGNATURE_SCHEME_ECDSA_SECP256R1_SHA256;
1529 }
1530 else {
1531 ret = CRYPTOCB_UNAVAILABLE;
1532 }
1533 }
1534
1535 if (ret == 0) {
1536 /* get user context for TSIP */
1537 tuc = ssl->RenesasUserCtx;
1538 if (tuc == NULL) {
1539 WOLFSSL_MSG("TsipUserCtx is not set to ssl.");
1540 ret = CRYPTOCB_UNAVAILABLE;
1541 }
1542 }
1543
1544 /* check if peer's public key is stored */
1545 if (ret == 0) {
1546 if (ssl->peerSceTsipEncRsaKeyIndex == NULL) {
1547 ret = CRYPTOCB_UNAVAILABLE;
1548 }
1549 }
1550
1551 if (ret == 0) {
1552 /* create sign data */
1553 sigData = tuc->internal->sigDataCertVerify;
1554
1555 idx = 0;
1556 ForceZero(sigData, sizeof(tuc->internal->sigDataCertVerify));
1557 XMEMSET(sigData, TSIP_SIGNING_DATA_PREFIX_BYTE,
1558 TSIP_SIGNING_DATA_PREFIX_SZ);
1559
1560 idx += TSIP_SIGNING_DATA_PREFIX_SZ;
1561 XMEMCPY(&sigData[idx], serverCertVfyLabel, TSIP_CERT_VFY_LABEL_SZ);
1562
1563 idx += TSIP_CERT_VFY_LABEL_SZ;
1564 ret = tsip_GetMessageSha256(ssl, &sigData[idx], &messageSz);
1565 }
1566
1567 if (ret == 0) {
1568
1569 if ((ret = tsip_hw_lock()) == 0) {
1570 err = R_TSIP_Tls13CertificateVerifyVerification(
1571 (uint32_t*)ssl->peerSceTsipEncRsaKeyIndex,
1572 sig_scheme,
1573 &sigData[idx],
1574 (uint8_t*)(input + *inOutIdx),
1575 totalSz);
1576
1577 if (err == TSIP_SUCCESS) {
1578
1579 *inOutIdx += totalSz;
1580 *inOutIdx += ssl->keys.padSz;
1581 ssl->options.peerAuthGood = 1;
1582 ssl->options.havePeerVerify = 1;
1583 #if !defined(NO_WOLFSSL_CLIENT)
1584 if (ssl->options.side == WOLFSSL_CLIENT_END)
1585 ssl->options.serverState = SERVER_CERT_VERIFY_COMPLETE;
1586 #endif
1587 }
1588 else {
1589 ret = WC_HW_E;
1590 if (err == TSIP_ERR_AUTHENTICATION) {
1591 WOLFSSL_MSG("Certificate Verification failed.");
1592 }
1593 }
1594
1595 tsip_hw_unlock();
1596 }
1597 else {
1598 WOLFSSL_MSG("mutex locking error");
1599 }
1600 }
1601
1602 WOLFSSL_LEAVE("tsip_Tls13CertificateVerify", ret);
1603 return ret;
1604}
1605
1606/* Send the TLS v1.3 CertificateVerify message. A part of the message is
1607 * processed by TSIP for acceleration.
1608 *
1609 * Prior to this function call, the appropriate key-pair should be set via
1610 * tsip_use_PrivateKey_buffer_TLS and tsip_use_PublicKey_buffer_TLS APIs.
1611 * Those key pair can be generated by the tool named
1612 * "Renesas secure flash programmer".
1613 * When RSA certificate is used, both public and private keys should be set.
1614 * The public key is used for self-verify the generated certificateVerify
1615 * message. When ECC certificate is used, the self-verify will be performed only
1616 * WOLFSSL_CHECK_SIG_FAULTS is defined.
1617 *
1618 * Returns 0 on success, CRYPTOCB_UNAVAILABLE when the required key is not
1619 * provided or unsupported algo is specified and otherwise failure.
1620 */
1621int tsip_Tls13SendCertVerify(WOLFSSL* ssl)
1622{
1623 int ret = 0;
1624 e_tsip_err_t err = TSIP_SUCCESS;
1625 byte* sigData = NULL;
1626 word16 idx;
1627 int isTLS13 = 0;
1628 TsipUserCtx* tuc = NULL;
1629 byte* output = NULL;
1630 byte* message = NULL;
1631 byte* derSig = NULL;
1632 int isRsa = -1;
1633 uint32_t messageSz,recordSz,hashSz;
1634 byte hash[WC_SHA256_DIGEST_SIZE];
1635 byte sig_rs[R_TSIP_ECDSA_DATA_BYTE_SIZE];
1636 tsip_rsa_byte_data_t rsa_sig,rsa_hash;
1637 tsip_ecdsa_byte_data_t ecdsa_sig,ecdsa_hash;
1638
1639 WOLFSSL_ENTER("tsip_Tls13SendCertVerify");
1640 (void)derSig;
1641 (void)rsa_sig;
1642 (void)rsa_hash;
1643 (void)ecdsa_sig;
1644 (void)ecdsa_hash;
1645 (void)sig_rs;
1646
1647 if (ssl == NULL) {
1648 ret = BAD_FUNC_ARG;
1649 }
1650
1651 if (ret == 0) {
1652 if (ssl->version.major == SSLv3_MAJOR &&
1653 ssl->version.minor == TLSv1_3_MINOR)
1654 isTLS13 = 1;
1655
1656 /* check if it's TLS13 and client side */
1657 if (!isTLS13 || ssl->options.side != WOLFSSL_CLIENT_END) {
1658 ret = CRYPTOCB_UNAVAILABLE;
1659 }
1660 }
1661
1662 if (ret == 0) {
1663 /* get user context for TSIP */
1664 tuc = ssl->RenesasUserCtx;
1665 if (tuc == NULL) {
1666 ret = CRYPTOCB_UNAVAILABLE;
1667 }
1668 }
1669
1670 if (ret == 0) {
1671 #if !defined(NO_RSA)
1672 if (ssl->options.haveRSA)
1673 isRsa = 1;
1674 else
1675 #endif
1676 #ifdef HAVE_ECC
1677 if (ssl->options.haveECC)
1678 isRsa = 0;
1679 else
1680 #endif /* HAVE_ECC */
1681 isRsa = -1;
1682
1683 if (isRsa != 0 && isRsa != 1) {
1684 ret = CRYPTOCB_UNAVAILABLE;
1685 }
1686 }
1687
1688 if (ret == 0) {
1689 ret = tsip_ImportPrivateKey(tuc, tuc->wrappedKeyType);
1690 }
1691
1692 if (ret == 0) {
1693 if (isRsa) {
1694 if (!tuc->internal->ClientRsa2048PrivKey_set) {
1695 ret = NO_PRIVATE_KEY;
1696 }
1697 }
1698 else {
1699 if (!tuc->internal->ClientEccPrivKey_set) {
1700 ret = NO_PRIVATE_KEY;
1701 }
1702 }
1703 }
1704
1705 if (ret == 0) {
1706 /* get message hash */
1707 ForceZero(hash, sizeof(hash));
1708 ret = tsip_GetMessageSha256(ssl, hash, (int*)&hashSz);
1709 }
1710
1711 if (ret == 0) {
1712 recordSz = WC_MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA * 2;
1713 /* check for available size */
1714 ret = CheckAvailableSize(ssl, recordSz);
1715 recordSz = 0;
1716 }
1717
1718 if (ret == 0) {
1719 /* get output buffer for record header */
1720 output = ssl->buffers.outputBuffer.buffer +
1721 ssl->buffers.outputBuffer.length;
1722
1723 /* buffer for message header */
1724 message = output + RECORD_HEADER_SZ;
1725 }
1726
1727 /* generate signature */
1728 if (ret == 0) {
1729 if ((ret = tsip_hw_lock()) == 0) {
1730 if (isRsa) {
1731 err = R_TSIP_Tls13CertificateVerifyGenerate(
1732 (uint32_t*)&(tuc->internal->Rsa2048PrivateKeyIdx),
1733 TSIP_TLS13_SIGNATURE_SCHEME_RSA_PSS_RSAE_SHA256,
1734 hash,
1735 message + HANDSHAKE_HEADER_SZ,
1736 &messageSz);
1737 }
1738 else {
1739 err = R_TSIP_Tls13CertificateVerifyGenerate(
1740 (uint32_t*)&(tuc->internal->EcdsaPrivateKeyIdx),
1741 TSIP_TLS13_SIGNATURE_SCHEME_ECDSA_SECP256R1_SHA256,
1742 hash,
1743 message + HANDSHAKE_HEADER_SZ,
1744 &messageSz);
1745 }
1746 if (err != TSIP_SUCCESS) {
1747 WOLFSSL_MSG("failed to make certificate verify message");
1748 ret = WC_HW_E;
1749 }
1750 tsip_hw_unlock();
1751 }
1752 else {
1753 WOLFSSL_MSG("mutex locking error");
1754 }
1755 }
1756
1757 if (ret == 0) {
1758 if (isRsa) {
1759 ret = tsip_ImportPublicKey(tuc, tuc->wrappedKeyType);
1760 }
1761 else {
1762#if defined(WOLFSSL_CHECK_SIG_FAULTS)
1763 ret = tsip_ImportPublicKey(tuc, tuc->wrappedKeyType);
1764#endif
1765 }
1766 }
1767
1768 if (ret == 0) {
1769 if (isRsa) {
1770 if (!tuc->internal->ClientRsa2048PubKey_set) {
1771 ret = NO_PRIVATE_KEY;
1772 }
1773 }
1774 else {
1775#if defined(WOLFSSL_CHECK_SIG_FAULTS)
1776 if (!tuc->ClientEccPubKey_set) {
1777 ret = NO_PRIVATE_KEY;
1778 }
1779#endif /* WOLFSSL_CHECK_SIG_FAULTS */
1780 }
1781 }
1782
1783 if (ret == 0) {
1784 sigData = tuc->internal->sigDataCertVerify;
1785
1786 idx = 0;
1787 ForceZero(sigData, sizeof(tuc->internal->sigDataCertVerify));
1788 XMEMSET(sigData, TSIP_SIGNING_DATA_PREFIX_BYTE,
1789 TSIP_SIGNING_DATA_PREFIX_SZ);
1790
1791 idx += TSIP_SIGNING_DATA_PREFIX_SZ;
1792 XMEMCPY(&sigData[idx], clientCertVfyLabel, TSIP_CERT_VFY_LABEL_SZ);
1793
1794 idx += TSIP_CERT_VFY_LABEL_SZ;
1795 XMEMCPY(&sigData[idx], hash, hashSz);
1796 }
1797
1798 if (ret == 0) {
1799 /* extract signature data from generated CertificateVerify message */
1800 if (!isRsa) {
1801#if defined(WOLFSSL_CHECK_SIG_FAULTS)
1802 idx = 4;
1803 derSig = message +
1804 HANDSHAKE_HEADER_SZ + HASH_SIG_SIZE + VERIFY_HEADER;
1805 if (derSig[idx] == 0x00)
1806 idx++;
1807 XMEMCPY(sig_rs, &derSig[idx], R_TSIP_ECDSA_DATA_BYTE_SIZE / 2);
1808 idx += (R_TSIP_ECDSA_DATA_BYTE_SIZE / 2) + ASN_TAG_SZ + 1;
1809 if (derSig[idx] == 0x00)
1810 idx++;
1811 XMEMCPY(&sig_rs[R_TSIP_ECDSA_DATA_BYTE_SIZE / 2],
1812 &derSig[idx], R_TSIP_ECDSA_DATA_BYTE_SIZE / 2);
1813#endif /* WOLFSSL_CHECK_SIG_FAULTS */
1814 }
1815 }
1816
1817 if (ret == 0) {
1818 if ((ret = tsip_hw_lock()) == 0) {
1819 if (isRsa) {
1820 rsa_sig.pdata = message + HANDSHAKE_HEADER_SZ +
1821 HASH_SIG_SIZE + VERIFY_HEADER;
1822 rsa_hash.pdata = sigData;
1823 rsa_hash.data_length = TSIP_SIGNING_DATA_PREFIX_SZ +
1824 TSIP_CERT_VFY_LABEL_SZ + sizeof(hash);
1825
1826 rsa_hash.data_type = 0;
1827
1828 err = R_TSIP_RsassaPss2048SignatureVerification(
1829 &rsa_sig, &rsa_hash,
1830 &(tuc->internal)->Rsa2048PublicKeyIdx,
1831 R_TSIP_RSA_HASH_SHA256);
1832 WOLFSSL_MSG("Perform self-verify for rsa signature");
1833 }
1834 else {
1835 err = TSIP_SUCCESS;
1836#if defined(WOLFSSL_CHECK_SIG_FAULTS)
1837 ecdsa_sig.pdata = sig_rs;
1838 ecdsa_hash.pdata = sigData;
1839 ecdsa_hash.data_length = TSIP_SIGNING_DATA_PREFIX_SZ +
1840 TSIP_CERT_VFY_LABEL_SZ + sizeof(hash);
1841 ecdsa_hash.data_type = 0;
1842
1843 err = R_TSIP_EcdsaP256SignatureVerification(
1844 &ecdsa_sig, &ecdsa_hash,
1845 &tuc->EcdsaPublicKeyIdx);
1846 WOLFSSL_MSG("Perform self-verify for ecc signature");
1847#endif /* WOLFSSL_CHECK_SIG_FAULTS */
1848 }
1849 if (err != TSIP_SUCCESS) {
1850 WOLFSSL_MSG("Failed to verify signature");
1851 ret = VERIFY_SIGN_ERROR;
1852 }
1853 tsip_hw_unlock();
1854 }
1855 else {
1856 WOLFSSL_MSG("mutex locking error");
1857 }
1858 }
1859
1860 /* create message header */
1861 if (ret == 0) {
1862
1863 ((HandShakeHeader*)message)->type = certificate_verify;
1864
1865 c32to24(messageSz, ((HandShakeHeader*)message)->length);
1866
1867 recordSz = tsip_Tls13BuildMessage(ssl, output, 0, message,
1868 messageSz + HANDSHAKE_HEADER_SZ,
1869 handshake, 1);
1870
1871 if (recordSz > 0) {
1872 ssl->buffers.outputBuffer.length += recordSz;
1873 ret = SendBuffered(ssl);
1874 }
1875 else {
1876 ret = recordSz;
1877 }
1878 }
1879
1880 WOLFSSL_LEAVE("tsip_Tls13SendCertVerify", ret);
1881 return ret;
1882}
1883#endif /* WOLFSSL_TLS13 */
1884#endif /* WOLFSSL_RENESAS_TSIP_TLS */
1885
1886
1887#if defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER >=109)
1888
1889static uint32_t GetTsipCipherSuite(
1890 uint8_t cipherSuiteFirst,
1891 uint8_t cipherSuite)
1892{
1893 WOLFSSL_ENTER("GetTsipCipherSuite");
1894 uint32_t tsipCipher;
1895
1896 if (cipherSuiteFirst == CIPHER_BYTE)
1897 {
1898 switch(cipherSuite) {
1899
1900 case TLS_RSA_WITH_AES_128_CBC_SHA: /*2F*/
1901 tsipCipher = R_TSIP_TLS_RSA_WITH_AES_128_CBC_SHA; /*0*/
1902 break;
1903
1904 case TLS_RSA_WITH_AES_128_CBC_SHA256:
1905 tsipCipher = R_TSIP_TLS_RSA_WITH_AES_128_CBC_SHA256;
1906 break;
1907
1908 case TLS_RSA_WITH_AES_256_CBC_SHA:
1909 tsipCipher = R_TSIP_TLS_RSA_WITH_AES_256_CBC_SHA;
1910 break;
1911
1912 case TLS_RSA_WITH_AES_256_CBC_SHA256:
1913 tsipCipher = R_TSIP_TLS_RSA_WITH_AES_256_CBC_SHA256;
1914 break;
1915
1916 default:
1917 tsipCipher = (uint32_t)WOLFSSL_TSIP_ILLEGAL_CIPHERSUITE;
1918 break;
1919 }
1920 WOLFSSL_LEAVE("GetTsipCipherSuite", tsipCipher);
1921 return tsipCipher;
1922 }
1923 else if (cipherSuiteFirst == ECC_BYTE)
1924 {
1925 tsipCipher = (uint32_t)WOLFSSL_TSIP_ILLEGAL_CIPHERSUITE;
1926
1927 switch(cipherSuite) {
1928
1929 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
1930 tsipCipher = R_TSIP_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
1931 break;
1932
1933 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
1934 tsipCipher = R_TSIP_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
1935 break;
1936
1937 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
1938 tsipCipher = R_TSIP_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
1939 break;
1940
1941 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
1942 tsipCipher = R_TSIP_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
1943 break;
1944
1945 default:
1946 tsipCipher = (uint32_t)WOLFSSL_TSIP_ILLEGAL_CIPHERSUITE;
1947 break;
1948 }
1949 }
1950 else {
1951 tsipCipher = (uint32_t)WOLFSSL_TSIP_ILLEGAL_CIPHERSUITE;
1952 }
1953
1954 WOLFSSL_LEAVE("GetTsipCipherSuite", tsipCipher);
1955
1956 return tsipCipher;
1957}
1958
1959/* Attempt to get a public key exchanged with the peer in ECDHE.
1960 * the public key is verified by given signature then stored into ctx.
1961 *
1962 * return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure.
1963 */
1964static int tsip_ServerKeyExVerify(
1965 word32 type, /* public key type 0:RSA2048 2:ECDSA P-256 */
1966 WOLFSSL* ssl,
1967 const byte* sig,
1968 word32 sigSz,
1969 void* ctx)
1970{
1971 int ret = WOLFSSL_FAILURE;
1972 byte qx[MAX_ECC_BYTES], qy[MAX_ECC_BYTES];
1973 byte* peerkey = NULL;
1974 word32 qxLen = sizeof(qx), qyLen = sizeof(qy);
1975 TsipUserCtx* userCtx = NULL;
1976
1977 WOLFSSL_ENTER("tsip_ServerKeyExVerify");
1978
1979 /* sanity check */
1980 if (ssl == NULL || sig == NULL || ctx == NULL)
1981 return ret;
1982
1983 userCtx = (TsipUserCtx*)ctx;
1984
1985 /* export public peer public key */
1986 ret = wc_ecc_export_public_raw(ssl->peerEccKey, qx, &qxLen, qy, &qyLen);
1987
1988 if (ret != 0) {
1989 WOLFSSL_MSG("failed to export peer ecc key");
1990 WOLFSSL_LEAVE("tsip_ServerKeyExVerify", ret);
1991 return ret;
1992 }
1993 /* make peer ecc key data for SCE */
1994 /* 0padding(24bit) || 04(8bit) || Qx(256bit) || Qy(256bit) */
1995 peerkey = (byte*)XMALLOC((3 + 1 + qxLen + qyLen), NULL,
1996 DYNAMIC_TYPE_TMP_BUFFER);
1997 if (peerkey == NULL) {
1998 WOLFSSL_MSG("failed to malloc ecc key");
1999 WOLFSSL_LEAVE("tsip_ServerKeyExVerify", ret);
2000 return WOLFSSL_FAILURE;
2001 }
2002
2003 ForceZero(peerkey, (3 + 1 + qxLen + qyLen));
2004 peerkey[3] = ECC_POINT_UNCOMP;
2005 XMEMCPY(&peerkey[4], qx, qxLen);
2006 XMEMCPY(&peerkey[4+qxLen], qy, qyLen);
2007
2008 /* 0 : RSA 2048bit, 1 : Reserved, 2 : ECDSA P-256 */
2009 if ((ret = tsip_hw_lock()) == 0) {
2010 ret = R_TSIP_TlsServersEphemeralEcdhPublicKeyRetrieves(
2011 type,
2012 (uint8_t*) ssl->arrays->clientRandom,
2013 (uint8_t*) ssl->arrays->serverRandom,
2014 (uint8_t*) peerkey,
2015 (uint8_t*) sig,
2016 (uint32_t*)ssl->peerSceTsipEncRsaKeyIndex,
2017 (uint32_t*)userCtx->internal->encrypted_ephemeral_ecdh_public_key);
2018
2019 if (ret !=TSIP_SUCCESS) {
2020 WOLFSSL_MSG("R_TSIP_TlsServersEphemeralEcdhPublicKeyRetrieves failed");
2021 }
2022 else {
2023 ret = WOLFSSL_SUCCESS;
2024 }
2025
2026 tsip_hw_unlock();
2027 }
2028 else {
2029 WOLFSSL_MSG("Failed to lock tsip hw");
2030 }
2031
2032 XFREE(peerkey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
2033
2034 WOLFSSL_LEAVE("tsip_ServerKeyExVerify", ret);
2035 return ret;
2036}
2037/*
2038 * return 0 on success
2039 */
2040int wc_tsip_RsaVerify(
2041 WOLFSSL* ssl,
2042 byte* sig, word32 sigSz,
2043 byte** out,
2044 const byte* key,
2045 word32 keySz,
2046 void* ctx)
2047{
2048 int ret;
2049
2050 WOLFSSL_ENTER("tsip_RsaVerify");
2051
2052 if (tsip_usable(ssl, 0))
2053 ret = tsip_ServerKeyExVerify(0, ssl, sig, sigSz, ctx);
2054 else
2055 ret = CRYPTOCB_UNAVAILABLE;
2056
2057 if (ret == WOLFSSL_SUCCESS)
2058 ret = 0;
2059
2060 WOLFSSL_LEAVE("tsip_RsaVerify", ret);
2061 return ret;
2062}
2063/* Verify signature for Server Key Exchange with TSIP
2064 * TSIP can handle prime256v1 curve and sha256 hash
2065 * parameters:
2066 * ssl WOLFSSL object
2067 * sig buffer holding DER encoded ecdsa signature data
2068 * sigSz signature data size
2069 * hash buffer holding sha256 hash data
2070 * hashSz hash data size
2071 * key buffer holding peer's public key (NOT used in this function)
2072 * keySz public key size((NOT used in this function))
2073 * result address of the variable to output result
2074 * ctx context
2075 * return 0 on success, CRYPTOCB_UNAVAILABLE in case TSIP cannot handle
2076 */
2077int wc_tsip_EccVerify(
2078 WOLFSSL* ssl,
2079 const byte* sig, word32 sigSz,
2080 const byte* hash, word32 hashSz,
2081 const byte* key, word32 keySz,
2082 int* result, void* ctx)
2083{
2084 int ret = WOLFSSL_FAILURE;
2085 uint8_t sigforSCE [R_TSIP_ECDSA_DATA_BYTE_SIZE] = {0};
2086 const byte rs_size = R_TSIP_ECDSA_DATA_BYTE_SIZE/2;
2087 byte offset = 0x3;
2088
2089 WOLFSSL_ENTER("wc_tsip_EccVerify");
2090
2091 /* check if TSIP can handle given cipher suite */
2092 if (!tsip_usable(ssl, 0)) {
2093 WOLFSSL_MSG("Cannot handle cipher suite by TSIP");
2094 WOLFSSL_LEAVE("wc_tsip_EccVerify", CRYPTOCB_UNAVAILABLE);
2095 return CRYPTOCB_UNAVAILABLE;
2096 }
2097
2098 /* in TLS1.3 */
2099 if (ssl->version.major == SSLv3_MAJOR &&
2100 ssl->version.minor == TLSv1_3_MINOR) {
2101 WOLFSSL_LEAVE("wc_tsip_EccVerify", CRYPTOCB_UNAVAILABLE);
2102 return CRYPTOCB_UNAVAILABLE;
2103 }
2104
2105 /* concatenate r and s parts of the signature so that TSIP can handle it */
2106 /* r */
2107 if (sig[offset] == 0x20) {
2108 XMEMCPY(sigforSCE, &sig[offset+1], rs_size);
2109
2110 offset = 0x25;
2111 /* s */
2112 if (sig[offset] == 0x20) {
2113 XMEMCPY(&sigforSCE[rs_size], &sig[offset+1], rs_size);
2114 }
2115 else {
2116 XMEMCPY(&sigforSCE[rs_size], &sig[offset+2], rs_size);
2117 }
2118 }
2119 else {
2120 XMEMCPY(sigforSCE, &sig[offset+2], rs_size);
2121
2122 offset = 0x26;
2123 /* s */
2124 if (sig[offset] == rs_size) {
2125 XMEMCPY(&sigforSCE[rs_size], &sig[offset+1], rs_size);
2126 }
2127 else {
2128 XMEMCPY(&sigforSCE[rs_size], &sig[offset+2], rs_size);
2129 }
2130 }
2131
2132 ret = tsip_ServerKeyExVerify(2, ssl, sigforSCE, 64, ctx);
2133
2134 if (ret == WOLFSSL_SUCCESS) {
2135 *result = 1;
2136 ret = 0; /* for success */
2137 }
2138 else
2139 *result = 0;
2140
2141 WOLFSSL_LEAVE("wc_tsip_EccVerify", ret);
2142 return ret;
2143}
2144
2145/*
2146 * generate premaster secret
2147 * 1. generate P256 ECC key pair for ECDHE key exchange
2148 * 2. generate pre-master secret
2149 * output 64 bytes premaster secret to "out" buffer.
2150 */
2151int wc_tsip_EccSharedSecret(
2152 WOLFSSL* ssl,
2153 ecc_key* otherKey,
2154 unsigned char* pubKeyDer, unsigned int* pubKeySz,
2155 unsigned char* out, unsigned int* outlen,
2156 int side, void* ctx)
2157{
2158 int ret;
2159 TsipUserCtx* usrCtx = (TsipUserCtx*)ctx;
2160
2161 (void)ssl;
2162 (void)otherKey;
2163
2164 WOLFSSL_ENTER("wc_tsip_EccSharedSecret");
2165 /* sanity check */
2166 if (ssl == NULL || pubKeyDer == NULL || pubKeySz == NULL ||
2167 out == NULL || outlen == NULL || ctx == NULL) {
2168 WOLFSSL_LEAVE("wc_tsip_EccSharedSecret", WOLFSSL_FAILURE);
2169 return WOLFSSL_FAILURE;
2170 }
2171 if ((ret = tsip_hw_lock()) == 0) {
2172 /* Generate ECC public key for key exchange */
2173 ret = R_TSIP_GenerateTlsP256EccKeyIndex(
2174 &(usrCtx->internal->ecc_p256_wrapped_key),
2175 (uint8_t*)&(usrCtx->internal->ecc_ecdh_public_key));
2176
2177 if (ret == TSIP_SUCCESS) {
2178
2179 /* copy generated ecdh public key into buffer */
2180 pubKeyDer[0] = ECC_POINT_UNCOMP;
2181 *pubKeySz = 1 + sizeof(usrCtx->internal->ecc_ecdh_public_key);
2182 XMEMCPY(&pubKeyDer[1], &(usrCtx->internal->ecc_ecdh_public_key),
2183 sizeof(usrCtx->internal->ecc_ecdh_public_key));
2184
2185 /* Generate Premaster Secret */
2186 ret = R_TSIP_TlsGeneratePreMasterSecretWithEccP256Key(
2187 (uint32_t*)&(usrCtx->internal->encrypted_ephemeral_ecdh_public_key),
2188 &(usrCtx->internal->ecc_p256_wrapped_key),
2189 (uint32_t*)out/* pre-master secret 64 bytes */);
2190 }
2191 if (ret == TSIP_SUCCESS) {
2192 *outlen = 64;
2193 wolfSSL_CTX_SetGenMasterSecretCb(ssl->ctx,
2194 Renesas_cmn_genMasterSecret);
2195 wolfSSL_SetGenMasterSecretCtx(ssl, usrCtx);
2196
2197 }
2198
2199 tsip_hw_unlock();
2200 }
2201 else {
2202 WOLFSSL_MSG("Failed to lock tsip hw");
2203 }
2204 WOLFSSL_LEAVE("wc_tsip_EccSharedSecret", ret);
2205 return ret;
2206}
2207
2208
2209WOLFSSL_API void tsip_set_callbacks(WOLFSSL_CTX* ctx)
2210{
2211 WOLFSSL_ENTER("tsip_set_callbacks");
2212 wolfSSL_CTX_SetEccVerifyCb(ctx, (CallbackEccVerify)Renesas_cmn_EccVerify);
2213 wolfSSL_CTX_SetRsaVerifyCb(ctx, (CallbackRsaVerify)Renesas_cmn_RsaVerify);
2214 wolfSSL_CTX_SetGenPreMasterCb(ctx, Renesas_cmn_generatePremasterSecret);
2215 wolfSSL_CTX_SetRsaEncCb(ctx, Renesas_cmn_RsaEnc);
2216#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
2217 wolfSSL_CTX_SetVerifyMacCb(ctx, (CallbackVerifyMac)Renesas_cmn_VerifyHmac);
2218#endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
2219 wolfSSL_CTX_SetEccSharedSecretCb(ctx, NULL);
2220 /* Set ssl-> options.sendVerify to SEND_CERT by the following two
2221 * registrations. This will allow the client certificate to be sent to
2222 * the server even if the private key is empty. The two callbacks do
2223 * virtually nothing.
2224 */
2225 #ifdef WOLFSSL_TLS13
2226 #ifdef HAVE_ECC
2227 wolfSSL_CTX_SetEccSignCb(ctx, Renesas_cmn_EccSignCb);
2228 #endif
2229 #ifndef NO_RSA
2230 wolfSSL_CTX_SetRsaSignCb(ctx, Renesas_cmn_RsaSignCb);
2231 #endif
2232 #endif /* WOLFSSL_TLS13 */
2233
2234 wolfSSL_CTX_SetRsaSignCheckCb(ctx, Renesas_cmn_RsaSignCheckCb);
2235
2236 /* set heap-hint to tsip_heap_hint so that tsip sha funcs can refer it */
2237 if (ctx->heap != NULL) {
2238 tsip_heap_hint = ctx->heap;
2239 }
2240
2241 WOLFSSL_LEAVE("tsip_set_callbacks", 0);
2242}
2243
2244WOLFSSL_API int tsip_set_callback_ctx(WOLFSSL* ssl, void* user_ctx)
2245{
2246 WOLFSSL_ENTER("tsip_set_callback_ctx");
2247
2248 TsipUserCtx* uCtx = (TsipUserCtx*)user_ctx;
2249 if (user_ctx == NULL || ssl == NULL) {
2250 WOLFSSL_MSG("user ctx is null");
2251 return BAD_FUNC_ARG;
2252 }
2253
2254 ForceZero(uCtx, sizeof(TsipUserCtx));
2255
2256 uCtx->internal =
2257 (TsipUserCtx_Internal*)XMALLOC(sizeof(TsipUserCtx_Internal),
2258 ssl->heap,
2259 DYNAMIC_TYPE_TMP_BUFFER);
2260
2261 if (!uCtx->internal) {
2262 printf("Failed to allocate memory for user ctx internal");
2263 return MEMORY_E;
2264 }
2265
2266 ForceZero(uCtx->internal, sizeof(TsipUserCtx_Internal));
2267
2268 uCtx->internal->ssl = ssl;
2269 uCtx->internal->ctx = ssl->ctx;
2270 uCtx->internal->heap = ssl->heap;
2271 uCtx->internal->side = ssl->ctx->method->side;
2272
2273 ssl->RenesasUserCtx = user_ctx; /* ssl doesn't own user_ctx */
2274
2275 wolfSSL_SetEccVerifyCtx(ssl, user_ctx);
2276 wolfSSL_SetRsaEncCtx(ssl, user_ctx);
2277 wolfSSL_SetRsaVerifyCtx(ssl, user_ctx);
2278 wolfSSL_SetRsaSignCtx(ssl, user_ctx);
2279 wolfSSL_SetGenPreMasterCtx(ssl, user_ctx);
2280 wolfSSL_SetEccSharedSecretCtx(ssl, NULL);
2281#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
2282 wolfSSL_SetVerifyMacCtx(ssl, user_ctx);
2283#endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
2284 /* set up crypt callback */
2285 wc_CryptoCb_CryptInitRenesasCmn(ssl, user_ctx);
2286 WOLFSSL_LEAVE("tsip_set_callback_ctx", 0);
2287 return 0;
2288}
2289
2290#elif defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER >=106)
2291
2292/* convert def to tsip define */
2293static byte _tls2tsipdef(byte cipher)
2294{
2295 byte def = R_TSIP_TLS_RSA_WITH_AES_128_CBC_SHA;
2296 switch(cipher) {
2297 case l_TLS_RSA_WITH_AES_128_CBC_SHA:
2298 break;
2299 case l_TLS_RSA_WITH_AES_128_CBC_SHA256:
2300 def = R_TSIP_TLS_RSA_WITH_AES_128_CBC_SHA256;
2301 break;
2302 case l_TLS_RSA_WITH_AES_256_CBC_SHA:
2303 def = R_TSIP_TLS_RSA_WITH_AES_256_CBC_SHA;
2304 break;
2305 case l_TLS_RSA_WITH_AES_256_CBC_SHA256:
2306 def = R_TSIP_TLS_RSA_WITH_AES_256_CBC_SHA256;
2307 break;
2308 default:break;
2309 }
2310 return def;
2311}
2312#endif
2313
2314#ifdef WOLFSSL_RENESAS_TSIP_TLS
2315/*
2316 * Import wrapped private key then convert it into TSIP key_index format.
2317 * The target key should be set with tsip_use_PrivateKey_buffer in advance.
2318 * Acceptable key types are:
2319 * TSIP_KEY_TYPE_RSA2048 rsa 2048 bit key
2320 * TSIP_KEY_TYPE_RSA3072 rsa 3072 bit key
2321 * TSIP_KEY_TYPE_RSA4096 rsa 4096 bit key
2322 * TSIP_KEY_TYPE_ECDSAP256 ecdsa p256r1 key
2323 * TSIP_KEY_TYPE_ECDSAP384 ecdsa p384r1 key
2324 */
2325int tsip_ImportPrivateKey(TsipUserCtx* tuc, int keyType)
2326{
2327 int ret = 0;
2328 e_tsip_err_t err = TSIP_SUCCESS;
2329 uint8_t* provisioning_key = g_user_key_info.encrypted_provisioning_key;
2330 uint8_t* iv = g_user_key_info.iv;
2331 uint8_t* encPrivKey;
2332
2333 WOLFSSL_ENTER("tsip_ImportPrivateKey");
2334
2335 if (tuc == NULL)
2336 return BAD_FUNC_ARG;
2337
2338 encPrivKey = tuc->internal->wrappedPrivateKey;
2339
2340 if (encPrivKey == NULL || provisioning_key == NULL || iv == NULL) {
2341 WOLFSSL_MSG("Missing some key materials used for import" );
2342 return CRYPTOCB_UNAVAILABLE;
2343 }
2344
2345 if (ret == 0) {
2346 if (keyType != tuc->wrappedKeyType) {
2347 WOLFSSL_MSG("No public key of specified type is set" );
2348 return CRYPTOCB_UNAVAILABLE;
2349 }
2350 }
2351
2352 if ((ret = tsip_hw_lock()) == 0) {
2353 switch (keyType) {
2354
2355 #if !defined(NO_RSA)
2356 case TSIP_KEY_TYPE_RSA2048:
2357
2358 tuc->internal->ClientRsa2048PrivKey_set = 0;
2359 err = R_TSIP_GenerateRsa2048PrivateKeyIndex(
2360 provisioning_key, iv, (uint8_t*)encPrivKey,
2361 &(tuc->internal->Rsa2048PrivateKeyIdx));
2362 if (err == TSIP_SUCCESS) {
2363 tuc->internal->ClientRsa2048PrivKey_set = 1;
2364 }
2365 else {
2366 ret = WC_HW_E;
2367 }
2368 break;
2369 #endif
2370
2371 case TSIP_KEY_TYPE_RSA4096:
2372 /* not supported as of TSIPv1.15 */
2373 ret = CRYPTOCB_UNAVAILABLE;
2374 break;
2375
2376 #if defined(HAVE_ECC)
2377 case TSIP_KEY_TYPE_ECDSAP256:
2378
2379 tuc->internal->ClientEccPrivKey_set = 0;
2380 err = R_TSIP_GenerateEccP256PrivateKeyIndex(
2381 provisioning_key, iv, (uint8_t*)encPrivKey,
2382 &(tuc->internal->EcdsaPrivateKeyIdx));
2383 if (err == TSIP_SUCCESS) {
2384 tuc->internal->ClientEccPrivKey_set = 1;
2385 }
2386 else {
2387 ret = WC_HW_E;
2388 }
2389 break;
2390 #endif
2391
2392 default:
2393 ret = BAD_FUNC_ARG;
2394 break;
2395 }
2396 tsip_hw_unlock();
2397 }
2398 else {
2399 WOLFSSL_MSG("mutex locking error");
2400 }
2401 WOLFSSL_LEAVE("tsip_ImportPrivateKey", ret);
2402 return ret;
2403}
2404
2405#endif /* WOLFSSL_RENESAS_TSIP_TLS */
2406
2407/*
2408 * Import wrapped public key then convert it into TSIP key_index format.
2409 * The target key should be set with tsip_use_PublicKey_buffer in advance.
2410 * Acceptable key types are:
2411 * TSIP_KEY_TYPE_RSA2048 rsa 2048 bit key
2412 * TSIP_KEY_TYPE_RSA3072 rsa 3072 bit key
2413 * TSIP_KEY_TYPE_RSA4096 rsa 4096 bit key
2414 * TSIP_KEY_TYPE_ECDSAP256 ecdsa p256r1 key
2415 * TSIP_KEY_TYPE_ECDSAP384 ecdsa p384r1 key
2416 */
2417int tsip_ImportPublicKey(TsipUserCtx* tuc, int keyType)
2418{
2419 int ret = 0;
2420 e_tsip_err_t err = TSIP_SUCCESS;
2421 uint8_t* provisioning_key = g_user_key_info.encrypted_provisioning_key;
2422 uint8_t* iv = g_user_key_info.iv;
2423 uint8_t* encPubKey;
2424
2425 WOLFSSL_ENTER("tsip_ImportPublicKey");
2426
2427 if (tuc == NULL ) {
2428 return BAD_FUNC_ARG;
2429 }
2430
2431 encPubKey = tuc->internal->wrappedPublicKey;
2432
2433 if (encPubKey == NULL || provisioning_key == NULL || iv == NULL) {
2434 WOLFSSL_MSG("Missing some key materials used for import" );
2435 return CRYPTOCB_UNAVAILABLE;
2436 }
2437
2438 if (ret == 0) {
2439 if (keyType != tuc->wrappedKeyType) {
2440 WOLFSSL_MSG("No public key of specified type is set" );
2441 return CRYPTOCB_UNAVAILABLE;
2442 }
2443 }
2444
2445 if ((ret = tsip_hw_lock()) == 0) {
2446 switch (keyType) {
2447
2448 #if !defined(NO_RSA)
2449 #if ((defined(TSIP_RSAES_2048) && TSIP_RSAES_2048 == 1) || \
2450 (defined(TSIP_RSASSA_2048) && TSIP_RSASSA_2048 == 1))
2451 case TSIP_KEY_TYPE_RSA2048:
2452 #if defined(WOLFSSL_RENESAS_TSIP_TLS)
2453 tuc->internal->ClientRsa2048PubKey_set = 0;
2454 #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
2455 XFREE(tuc->rsa2048pub_keyIdx, NULL, DYNAMIC_TYPE_RSA_BUFFER);
2456 tuc->keyflgs_crypt.bits.rsapub2048_key_set = 0;
2457 tuc->rsa2048pub_keyIdx =
2458 (tsip_rsa2048_public_key_index_t*)XMALLOC(
2459 sizeof(tsip_rsa2048_public_key_index_t), NULL,
2460 DYNAMIC_TYPE_RSA_BUFFER);
2461 if (tuc->rsa2048pub_keyIdx == NULL) {
2462 return MEMORY_E;
2463 }
2464 #endif
2465 err = R_TSIP_GenerateRsa2048PublicKeyIndex(
2466 provisioning_key, iv, (uint8_t*)encPubKey,
2467 #if defined(WOLFSSL_RENESAS_TSIP_TLS)
2468 &(tuc->internal->Rsa2048PublicKeyIdx)
2469 #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
2470 tuc->rsa2048pub_keyIdx
2471 #endif
2472 );
2473 if (err == TSIP_SUCCESS) {
2474 #if defined(WOLFSSL_RENESAS_TSIP_TLS)
2475 tuc->internal->ClientRsa2048PubKey_set = 1;
2476 #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
2477 tuc->keyflgs_crypt.bits.rsapub2048_key_set = 1;
2478 #endif
2479 }
2480 else {
2481 ret = WC_HW_E;
2482 }
2483 break;
2484 #endif /* TSIP_RSAES_2048 */
2485 case TSIP_KEY_TYPE_RSA4096:
2486 /* not supported as of TSIPv1.15 */
2487 ret = CRYPTOCB_UNAVAILABLE;
2488 break;
2489 #endif /* !NO_RSA */
2490
2491 #if defined(HAVE_ECC)
2492 case TSIP_KEY_TYPE_ECDSAP256:
2493 case TSIP_KEY_TYPE_ECDSAP384:
2494 #if defined(WOLFSSL_RENESAS_TSIP_TLS)
2495 tuc->internal->ClientEccPubKey_set = 0;
2496 #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
2497 tuc->keyflgs_crypt.bits.eccpub_key_set = 0;
2498 #endif
2499 if (keyType == TSIP_KEY_TYPE_ECDSAP256) {
2500 #if defined(TSIP_ECDSA_P256) && TSIP_ECDSA_P256 == 1
2501 err = R_TSIP_GenerateEccP256PublicKeyIndex(
2502 provisioning_key, iv, (uint8_t*)encPubKey,
2503 #if defined(WOLFSSL_RENESAS_TSIP_TLS)
2504 &(tuc->internal->EcdsaPublicKeyIdx)
2505 #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
2506 &tuc->eccpub_keyIdx
2507 #endif
2508 );
2509 #else
2510 err = NOT_COMPILED_IN;
2511 #endif
2512 }
2513 else if (keyType == TSIP_KEY_TYPE_ECDSAP384) {
2514 #if defined(TSIP_ECDSA_P384) && TSIP_ECDSA_P384 == 1
2515 err = R_TSIP_GenerateEccP384PublicKeyIndex(
2516 provisioning_key, iv, (uint8_t*)encPubKey,
2517 #if defined(WOLFSSL_RENESAS_TSIP_TLS)
2518 &(tuc->internal->EcdsaPublicKeyIdx)
2519 #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
2520 &tuc->eccpub_keyIdx
2521 #endif
2522 );
2523 #else
2524 err = NOT_COMPILED_IN;
2525 #endif
2526 }
2527 if (err == TSIP_SUCCESS) {
2528 #if defined(WOLFSSL_RENESAS_TSIP_TLS)
2529 tuc->internal->ClientEccPubKey_set = 1;
2530 #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
2531 tuc->keyflgs_crypt.bits.eccpub_key_set = 1;
2532 #endif
2533 }
2534 else {
2535 ret = WC_HW_E;
2536 }
2537 break;
2538 #endif
2539
2540 default:
2541 ret = BAD_FUNC_ARG;
2542 break;
2543 }
2544 tsip_hw_unlock();
2545 }
2546 else {
2547 WOLFSSL_MSG("mutex locking error");
2548 }
2549 WOLFSSL_LEAVE("tsip_ImportPublicKey", ret);
2550 return ret;
2551}
2552
2553#if defined(WOLFSSL_RENESAS_TSIP_TLS)
2554/* check if tsip tls functions can be used for the cipher */
2555/* return :1 when tsip can be used , 0 not be used. */
2556int tsip_usable(const WOLFSSL *ssl, uint8_t session_key_generated)
2557{
2558 byte cipher0 = ssl->options.cipherSuite0;
2559 byte cipher = ssl->options.cipherSuite;
2560 byte side = ssl->options.side;
2561 int ret = WOLFSSL_SUCCESS;
2562 const Ciphers *enc;
2563 const Ciphers *dec;
2564
2565 WOLFSSL_ENTER("tsip_usable");
2566
2567 /* sanity check */
2568 if (ssl == NULL) {
2569 WOLFSSL_MSG("ssl is NULL");
2570 ret = BAD_FUNC_ARG;
2571 }
2572
2573 /* when rsa key index == NULL, tsip isn't used for cert verification. */
2574 /* in the case, we cannot use TSIP. */
2575 if (ret == WOLFSSL_SUCCESS) {
2576 if (!ssl->peerSceTsipEncRsaKeyIndex) {
2577 WOLFSSL_MSG("ssl->peerSceTsipEncRsaKeyIndex is NULL");
2578 ret = WOLFSSL_FAILURE;
2579 }
2580 }
2581
2582 if (ret == WOLFSSL_SUCCESS) {
2583 if (session_key_generated) {
2584 enc = &ssl->encrypt;
2585 dec = &ssl->decrypt;
2586 if (enc == NULL || dec == NULL) {
2587 /* something wrong */
2588 ret = WOLFSSL_FAILURE;
2589 }
2590 if (enc->aes == NULL || dec->aes == NULL) {
2591 ret = WOLFSSL_FAILURE;
2592 }
2593 if (enc->aes->ctx.setup == 0) {
2594 /* session key for SCE is not created */
2595 ret = WOLFSSL_FAILURE;
2596 }
2597 }
2598 }
2599
2600 /* when enabled Extended Master Secret, we cannot use TSIP. */
2601
2602 if (ret == WOLFSSL_SUCCESS) {
2603 if (ssl->options.haveEMS) {
2604 WOLFSSL_MSG("ssl->options.haveEMS");
2605 ret = WOLFSSL_FAILURE;
2606 }
2607 }
2608 /* TSIP works only for TLS client */
2609 if (ret == WOLFSSL_SUCCESS) {
2610 if (side != WOLFSSL_CLIENT_END) {
2611 WOLFSSL_MSG("Not client side");
2612 ret = WOLFSSL_FAILURE;
2613 }
2614 }
2615 /* Check if TSIP can handle cipher suite */
2616 if (ret == WOLFSSL_SUCCESS) {
2617 if (
2618 (cipher0 == CIPHER_BYTE &&
2619 (cipher == l_TLS_RSA_WITH_AES_128_CBC_SHA ||
2620 cipher == l_TLS_RSA_WITH_AES_128_CBC_SHA256 ||
2621 cipher == l_TLS_RSA_WITH_AES_256_CBC_SHA ||
2622 cipher == l_TLS_RSA_WITH_AES_256_CBC_SHA256))
2623 #if (WOLFSSL_RENESAS_TSIP_VER >= 109)
2624 ||
2625 (cipher0 == ECC_BYTE &&
2626 (cipher == l_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ||
2627 cipher == l_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ||
2628 cipher == l_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ||
2629 cipher == l_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256))
2630 #endif
2631 #if (WOLFSSL_RENESAS_TSIP_VER >= 114)
2632 ||
2633 (cipher0 == TLS13_BYTE &&
2634 (cipher == l_TLS_AES_128_GCM_SHA256 ||
2635 cipher == l_TLS_AES_128_CCM_SHA256))
2636 #endif
2637 ) {
2638 WOLFSSL_MSG("supported cipher suite");
2639 }
2640 else {
2641 WOLFSSL_MSG("unsupported cipher suite");
2642 ret = WOLFSSL_FAILURE;;
2643 }
2644 }
2645
2646 WOLFSSL_LEAVE("tsip_usable", ret);
2647 return ret;
2648}
2649#endif /* WOLFSSL_RENESAS_TSIP_TLS */
2650
2651#ifndef SINGLE_THREADED
2652/*
2653* lock hw engine.
2654* this should be called before using engine.
2655*/
2656int tsip_hw_lock(void)
2657{
2658 int ret = 0;
2659
2660 if (tsip_CryptHwMutexInit_ == 0) {
2661
2662 ret = tsip_CryptHwMutexInit(&tsip_mutex);
2663
2664 if (ret == 0) {
2665 tsip_CryptHwMutexInit_ = 1;
2666 }
2667 else {
2668 WOLFSSL_MSG(" mutex initialization failed.");
2669 return -1;
2670 }
2671 }
2672 if (tsip_CryptHwMutexLock(&tsip_mutex) != 0) {
2673 /* this should not happens */
2674 return -1;
2675 }
2676
2677 return ret;
2678}
2679
2680/*
2681* release hw engine
2682*/
2683void tsip_hw_unlock(void)
2684{
2685 tsip_CryptHwMutexUnLock(&tsip_mutex);
2686}
2687#endif
2688
2689/* open TSIP driver
2690 * return 0 on success.
2691 */
2692int tsip_Open(void)
2693{
2694 int ret = TSIP_SUCCESS;
2695
2696 WOLFSSL_ENTER("tsip_Open");
2697
2698 if ((ret = tsip_hw_lock()) == 0) {
2699
2700#if defined(WOLFSSL_RENESAS_TSIP) && (WOLFSSL_RENESAS_TSIP_VER>=109)
2701
2702 ret = R_TSIP_Open(NULL,NULL);
2703 if (ret != TSIP_SUCCESS) {
2704 WOLFSSL_MSG("RENESAS TSIP Open failed");
2705 }
2706
2707 #if defined(WOLFSSL_RENESAS_TSIP_TLS)
2708 if (ret == TSIP_SUCCESS && g_user_key_info.encrypted_user_tls_key) {
2709
2710 ret = R_TSIP_GenerateTlsRsaPublicKeyIndex(
2711 g_user_key_info.encrypted_provisioning_key,
2712 g_user_key_info.iv,
2713 g_user_key_info.encrypted_user_tls_key,
2714 &g_user_key_info.user_rsa2048_tls_pubindex); /* OUT */
2715
2716 R_TSIP_Close(); /* close once */
2717
2718 if (ret != TSIP_SUCCESS) {
2719
2720 WOLFSSL_MSG("R_TSIP_GenerateTlsRsa: NG");
2721
2722 }
2723 else {
2724
2725 /* open again with newly created TLS public key index*/
2726 ret = R_TSIP_Open(
2727 &g_user_key_info.user_rsa2048_tls_pubindex,
2728 (tsip_update_key_ring_t*)s_inst2);
2729
2730 if (ret != TSIP_SUCCESS) {
2731 WOLFSSL_MSG("R_TSIP_(Re)Open: NG");
2732 }
2733
2734 /* init vars */
2735 g_CAscm_Idx = (uint32_t)-1;
2736 }
2737 }
2738 #endif
2739
2740#elif defined(WOLFSSL_RENESAS_TSIP) && (WOLFSSL_RENESAS_TSIP_VER>=106)
2741
2742 ret = R_TSIP_Open((uint32_t*)s_flash, s_inst1, s_inst2);
2743 if (ret != TSIP_SUCCESS) {
2744 WOLFSSL_MSG("RENESAS TSIP Open failed");
2745 }
2746 #if defined(WOLFSSL_RENESAS_TLS)
2747 /* generate TLS Rsa public key for Certificate verification */
2748 if (ret == TSIP_SUCCESS && g_user_key_info.encrypted_user_tls_key) {
2749 ret = R_TSIP_GenerateTlsRsaPublicKeyIndex(
2750 g_user_key_info.encrypted_session_key,
2751 g_user_key_info.iv,
2752 g_user_key_info.encrypted_user_tls_key,
2753 &g_user_key_info.user_rsa2048_tls_pubindex);
2754
2755 if (ret != TSIP_SUCCESS) {
2756 WOLFSSL_MSG("R_TSIP_GenerateTlsRsaPublicKeyIndex failed");
2757 }
2758 else {
2759 /* close once */
2760 tsip_Close();
2761 /* open again with s_inst[] */
2762 XMEMCPY(s_inst1,
2763 g_user_key_info.user_rsa2048_tls_pubindex.value,
2764 sizeof(s_inst1));
2765 ret = R_TSIP_Open((uint32_t*)s_flash, s_inst1, s_inst2);
2766 if (ret != TSIP_SUCCESS) {
2767 WOLFSSL_MSG("R_TSIP_(Re)Open failed");
2768 }
2769
2770 /* init vars */
2771 g_CAscm_Idx = (uint32_t)-1;
2772 }
2773 }
2774 #endif
2775#else
2776 ret = R_TSIP_Open((uint32_t*)s_flash, s_inst1, s_inst2);
2777 if (ret != TSIP_SUCCESS) {
2778 WOLFSSL_MSG("RENESAS TSIP Open failed");
2779 }
2780#endif
2781 /* unlock hw */
2782 tsip_hw_unlock();
2783 }
2784 else
2785 WOLFSSL_MSG("Failed to lock tsip hw ");
2786
2787 WOLFSSL_LEAVE("tsip_Open", ret);
2788 return ret;
2789}
2790
2791/* close TSIP driver */
2792void tsip_Close(void)
2793{
2794 WOLFSSL_ENTER("tsip_Close");
2795 int ret;
2796
2797 if ((ret = tsip_hw_lock()) == 0) {
2798 /* close TSIP */
2799 ret = R_TSIP_Close();
2800#if defined(WOLFSSL_RENESAS_TSIP_TLS)
2801 g_CAscm_Idx = (uint32_t)-1;
2802#endif
2803 /* unlock hw */
2804 tsip_hw_unlock();
2805 if (ret != TSIP_SUCCESS) {
2806 WOLFSSL_MSG("RENESAS TSIP Close failed");
2807 }
2808 }
2809 else
2810 WOLFSSL_MSG("Failed to unlock tsip hw");
2811 WOLFSSL_LEAVE("tsip_Close", 0);
2812}
2813
2814int wc_tsip_GenerateRandBlock(byte* output, word32 sz)
2815{
2816 /* Generate PRNG based on NIST SP800-90A AES CTR-DRBG */
2817 int ret = 0;
2818 word32 buffer[4];
2819
2820 while (sz > 0) {
2821 word32 len = sizeof(buffer);
2822
2823 if (sz < len) {
2824 len = sz;
2825 }
2826 /* return 4 words random number*/
2827 ret = R_TSIP_GenerateRandomNumber((uint32_t*)buffer);
2828 if(ret == TSIP_SUCCESS) {
2829 XMEMCPY(output, &buffer, len);
2830 output += len;
2831 sz -= len;
2832 } else
2833 return ret;
2834 }
2835 return ret;
2836}
2837
2838#if (WOLFSSL_RENESAS_TSIP_VER>=109)
2839void tsip_inform_user_keys_ex(
2840 byte* encrypted_provisioning_key,
2841 byte* iv,
2842 byte* encrypted_user_tls_key,
2843 word32 encrypted_user_tls_key_type)
2844{
2845 WOLFSSL_ENTER("tsip_inform_user_keys_ex");
2846
2847 XMEMSET(&g_user_key_info, 0, sizeof(g_user_key_info));
2848 g_user_key_info.encrypted_provisioning_key = NULL;
2849 g_user_key_info.iv = NULL;
2850
2851 if (encrypted_provisioning_key) {
2852 g_user_key_info.encrypted_provisioning_key = encrypted_provisioning_key;
2853 }
2854 if (iv) {
2855 g_user_key_info.iv = iv;
2856 }
2857 if (encrypted_user_tls_key) {
2858 g_user_key_info.encrypted_user_tls_key = encrypted_user_tls_key;
2859 }
2860
2861 g_user_key_info.encrypted_user_tls_key_type = encrypted_user_tls_key_type;
2862 WOLFSSL_LEAVE("tsip_inform_user_keys_ex", 0);
2863}
2864#elif (WOLFSSL_RENESAS_TSIP_VER>=106)
2865/* inform user key */
2866/* the function expects to be called from user application */
2867/* user has to create these key information by Renesas tool in advance.*/
2868void tsip_inform_user_keys(
2869 byte *encrypted_session_key,
2870 byte *iv,
2871 byte *encrypted_user_tls_key)
2872{
2873 g_user_key_info.encrypted_session_key = NULL;
2874 g_user_key_info.iv = NULL;
2875 g_user_key_info.encrypted_user_tls_key = NULL;
2876
2877 if (encrypted_session_key) {
2878 g_user_key_info.encrypted_session_key = encrypted_session_key;
2879 }
2880 if (iv) {
2881 g_user_key_info.iv = iv;
2882 }
2883 if (encrypted_user_tls_key) {
2884 g_user_key_info.encrypted_user_tls_key = encrypted_user_tls_key;
2885 }
2886}
2887#endif
2888
2889/* Support functions for TSIP TLS Capability */
2890#if defined(WOLFSSL_RENESAS_TSIP_TLS)
2891
2892/* to inform ca certificate sign */
2893/* signature format expects RSA 2048 PSS with SHA256 */
2894void tsip_inform_cert_sign(const byte *sign)
2895{
2896 if (sign)
2897 ca_cert_sig = sign;
2898}
2899/* Sha1Hmac */
2900int wc_tsip_Sha1HmacGenerate(
2901 const WOLFSSL *ssl,
2902 const byte* myInner,
2903 word32 innerSz,
2904 const byte* in,
2905 word32 sz,
2906 byte* digest)
2907{
2908 WOLFSSL_ENTER("wc_tsip_Sha1HmacGenerate");
2909
2910 tsip_hmac_sha_handle_t _handle;
2911 tsip_hmac_sha_key_index_t key_index;
2912 int ret;
2913
2914 if ((ssl == NULL) || (myInner == NULL) || (in == NULL) ||
2915 (digest == NULL)) {
2916 WOLFSSL_LEAVE("wc_tsip_Sha1HmacGenerate", BAD_FUNC_ARG);
2917 return BAD_FUNC_ARG;
2918 }
2919
2920 if ((ret = tsip_hw_lock()) != 0) {
2921 WOLFSSL_MSG("hw lock failed");
2922 WOLFSSL_LEAVE("wc_tsip_Sha1HmacGenerate", ret);
2923 return ret;
2924 }
2925
2926 key_index = ssl->keys.tsip_client_write_MAC_secret;
2927
2928 ret = R_TSIP_Sha1HmacGenerateInit(
2929 &_handle,
2930 &key_index);
2931
2932 if (ret == TSIP_SUCCESS)
2933 ret = R_TSIP_Sha1HmacGenerateUpdate(
2934 &_handle,
2935 (uint8_t*)myInner,
2936 (uint32_t)innerSz);
2937
2938 if (ret == TSIP_SUCCESS)
2939 ret = R_TSIP_Sha1HmacGenerateUpdate(
2940 &_handle,
2941 (uint8_t*)in,
2942 sz);
2943
2944 if (ret == TSIP_SUCCESS)
2945 ret = R_TSIP_Sha1HmacGenerateFinal(
2946 &_handle,
2947 digest);
2948
2949 tsip_hw_unlock();
2950
2951 WOLFSSL_LEAVE("wc_tsip_Sha1HmacGenerate", ret);
2952 return ret;
2953}
2954
2955
2956/* Sha256Hmac */
2957int wc_tsip_Sha256HmacGenerate(
2958 const WOLFSSL *ssl,
2959 const byte* myInner,
2960 word32 innerSz,
2961 const byte* in,
2962 word32 sz,
2963 byte* digest)
2964{
2965 WOLFSSL_ENTER("wc_tsip_Sha256HmacGenerate");
2966
2967 tsip_hmac_sha_handle_t _handle;
2968 tsip_hmac_sha_key_index_t key_index;
2969 int ret;
2970
2971 if ((ssl == NULL) || (myInner == NULL) || (in == NULL) ||
2972 (digest == NULL))
2973 return BAD_FUNC_ARG;
2974
2975 key_index = ssl->keys.tsip_client_write_MAC_secret;
2976
2977 if ((ret = tsip_hw_lock()) != 0) {
2978 WOLFSSL_MSG("hw lock failed");
2979 return ret;
2980 }
2981
2982 ret = R_TSIP_Sha256HmacGenerateInit(
2983 &_handle,
2984 &key_index);
2985
2986 if (ret == TSIP_SUCCESS) {
2987 ret = R_TSIP_Sha256HmacGenerateUpdate(
2988 &_handle,
2989 (uint8_t*)myInner,
2990 innerSz);
2991 }
2992 else {
2993 WOLFSSL_MSG("R_TSIP_Sha256HmacGenerateInit failed");
2994 }
2995
2996 if (ret == TSIP_SUCCESS) {
2997 ret = R_TSIP_Sha256HmacGenerateUpdate(
2998 &_handle,
2999 (uint8_t*)in,
3000 sz);
3001 }
3002 else {
3003 WOLFSSL_MSG("R_TSIP_Sha256HmacGenerateUpdate: inner failed");
3004 }
3005 if (ret == TSIP_SUCCESS) {
3006
3007 ret = R_TSIP_Sha256HmacGenerateFinal(
3008 &_handle,
3009 digest);
3010 }
3011 else {
3012 WOLFSSL_MSG("R_TSIP_Sha256HmacGenerateUpdate: in failed");
3013 }
3014 if (ret != TSIP_SUCCESS) {
3015 WOLFSSL_MSG("R_TSIP_Sha256HmacGenerateFinal failed");
3016 ret = 1;
3017 }
3018 /* unlock hw */
3019 tsip_hw_unlock();
3020 WOLFSSL_LEAVE("wc_tsip_Sha256HmacGenerate", ret);
3021 return ret;
3022}
3023/*
3024 * Perform SHA1 and SHA256 Hmac verification
3025 */
3026int wc_tsip_ShaXHmacVerify(
3027 const WOLFSSL *ssl,
3028 const byte* message,
3029 word32 messageSz,
3030 word32 macSz,
3031 word32 content)
3032{
3033 WOLFSSL_ENTER("tsip_ShaXHmacVerify");
3034
3035 tsip_hmac_sha_handle_t handle;
3036 tsip_hmac_sha_key_index_t wrapped_key;
3037
3038 shaHmacInitFn initFn = NULL;
3039 shaHmacUpdateFn updateFn = NULL;
3040 shaHmacFinalFn finalFn = NULL;
3041
3042 byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
3043 int ret;
3044
3045 if ((ssl == NULL) || (message == NULL)) {
3046 WOLFSSL_LEAVE("tsip_ShaXHmacVerify", BAD_FUNC_ARG);
3047 return BAD_FUNC_ARG;
3048 }
3049 wrapped_key = ssl->keys.tsip_server_write_MAC_secret;
3050
3051 if (wrapped_key.type ==
3052#if (WOLFSSL_RENESAS_TSIP_VER >= 121)
3053 TSIP_KEY_INDEX_TYPE_TLS_SERVER_HMAC_SHA1_FOR_CLIENT
3054#else
3055 TSIP_KEY_INDEX_TYPE_HMAC_SHA1_FOR_TLS
3056#endif
3057 ){
3058 WOLFSSL_MSG("perform Sha1-Hmac verification");
3059 initFn = R_TSIP_Sha1HmacVerifyInit;
3060 updateFn = R_TSIP_Sha1HmacVerifyUpdate;
3061 finalFn = R_TSIP_Sha1HmacVerifyFinal;
3062 }
3063 else if (wrapped_key.type ==
3064#if (WOLFSSL_RENESAS_TSIP_VER >= 121)
3065 TSIP_KEY_INDEX_TYPE_TLS_SERVER_HMAC_SHA256_FOR_CLIENT
3066#else
3067 TSIP_KEY_INDEX_TYPE_HMAC_SHA256_FOR_TLS
3068#endif
3069 ) {
3070 WOLFSSL_MSG("perform Sha256-Hmac verification");
3071 initFn = R_TSIP_Sha256HmacVerifyInit;
3072 updateFn = R_TSIP_Sha256HmacVerifyUpdate;
3073 finalFn = R_TSIP_Sha256HmacVerifyFinal;
3074 }
3075 else {
3076 WOLFSSL_MSG("unsupported key type");
3077 WOLFSSL_LEAVE("tsip_ShaXHmacVerify", BAD_FUNC_ARG);
3078 return BAD_FUNC_ARG;
3079 }
3080
3081 if ((ret = tsip_hw_lock()) != 0) {
3082 WOLFSSL_MSG("hw lock failed\n");
3083 WOLFSSL_LEAVE("tsip_ShaXHmacVerify", ret);
3084 return ret;
3085 }
3086
3087 wolfSSL_SetTlsHmacInner((WOLFSSL*)ssl, (byte*)myInner,
3088 messageSz, content, 1);
3089
3090 ret = initFn(&handle, &wrapped_key);
3091
3092 if (ret == TSIP_SUCCESS) {
3093 ret = updateFn(&handle, myInner, WOLFSSL_TLS_HMAC_INNER_SZ);
3094 }
3095 if (ret == TSIP_SUCCESS) {
3096 ret = updateFn(&handle, (uint8_t*)message, (uint32_t)messageSz);
3097 }
3098 if (ret == TSIP_SUCCESS) {
3099 ret = finalFn(&handle, (uint8_t*)(message + messageSz), (uint32_t)macSz);
3100 }
3101 if (ret != TSIP_SUCCESS) {
3102 WOLFSSL_MSG("TSIP Mac verification failed");
3103 }
3104
3105 /* unlock hw */
3106 tsip_hw_unlock();
3107 WOLFSSL_LEAVE("tsip_ShaXHmacVerify", ret);
3108 return ret;
3109}
3110
3111/* generate Verify Data based on master secret */
3112int wc_tsip_generateVerifyData(
3113 const byte* ms, /* master secret */
3114 const byte* side, /* 0:client-side 1:server-side */
3115 const byte* handshake_hash,
3116 byte* hashes) /* out */
3117{
3118 int ret ;
3119 uint32_t l_side = R_TSIP_TLS_GENERATE_CLIENT_VERIFY;
3120
3121 WOLFSSL_ENTER("tsip_generateVerifyData");
3122
3123 if ((ms == NULL) || (side == NULL) || (handshake_hash == NULL) ||
3124 (hashes == NULL)) {
3125 WOLFSSL_LEAVE("tsip_generateVerifyData", BAD_FUNC_ARG);
3126 return BAD_FUNC_ARG;
3127 }
3128 if (XSTRNCMP((const char*)side, (const char*)kTlsServerFinStr,
3129 FINISHED_LABEL_SZ) == 0) {
3130 l_side = R_TSIP_TLS_GENERATE_SERVER_VERIFY;
3131 }
3132
3133 if ((ret = tsip_hw_lock()) == 0) {
3134 ret = R_TSIP_TlsGenerateVerifyData(l_side, (uint32_t*)ms,
3135 (uint8_t*)handshake_hash, hashes/* out */);
3136 if (ret != TSIP_SUCCESS) {
3137 WOLFSSL_MSG("R_TSIP_TlsGenerateSessionKey failed");
3138 }
3139 }
3140 /* unlock hw */
3141 tsip_hw_unlock();
3142 WOLFSSL_LEAVE("tsip_generateVerifyData", ret);
3143 return ret;
3144}
3145
3146/* generate keys for TLS communication */
3147int wc_tsip_generateSessionKey(
3148 WOLFSSL *ssl,
3149 TsipUserCtx* ctx,
3150 int devId)
3151{
3152 int ret;
3153 Ciphers *enc;
3154 Ciphers *dec;
3155 tsip_hmac_sha_key_index_t key_client_mac;
3156 tsip_hmac_sha_key_index_t key_server_mac;
3157 tsip_aes_key_index_t key_client_aes;
3158 tsip_aes_key_index_t key_server_aes;
3159
3160 WOLFSSL_ENTER("wc_tsip_generateSessionKey");
3161
3162 if (ssl== NULL)
3163 return BAD_FUNC_ARG;
3164
3165 if ((ret = tsip_hw_lock()) == 0) {
3166
3167#if (WOLFSSL_RENESAS_TSIP_VER>=109)
3168
3169 uint32_t tsipCS = GetTsipCipherSuite(ssl->options.cipherSuite0,
3170 ssl->options.cipherSuite);
3171
3172 if (tsipCS == R_TSIP_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ||
3173 tsipCS == R_TSIP_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) {
3174 WOLFSSL_MSG("Session key for AES-GCM generation skipped.");
3175
3176 /* Do not release ssl-> arrays to reference the master secret and
3177 * randoms, as the AES GCM session key will be generated in
3178 * encryption or description timing.
3179 */
3180 wolfSSL_KeepArrays(ssl);
3181 ret = TSIP_SUCCESS;
3182 }
3183 else {
3184
3185 ret = R_TSIP_TlsGenerateSessionKey(
3186 tsipCS,
3187 (uint32_t*)ssl->arrays->tsip_masterSecret,
3188 (uint8_t*) ssl->arrays->clientRandom,
3189 (uint8_t*) ssl->arrays->serverRandom,
3190 NULL, /* nonce is required only for AES-GCM key */
3191 &key_client_mac,
3192 &key_server_mac,
3193 &key_client_aes,
3194 &key_server_aes,
3195 NULL, NULL);
3196 }
3197#else /* WOLFSSL_RENESAS_TSIP_VER < 109 */
3198
3199 ret = R_TSIP_TlsGenerateSessionKey(
3200 _tls2tsipdef(ssl->options.cipherSuite),
3201 (uint32_t*)ssl->arrays->tsip_masterSecret,
3202 (uint8_t*)ssl->arrays->clientRandom,
3203 (uint8_t*)ssl->arrays->serverRandom,
3204 &key_client_mac,
3205 &key_server_mac,
3206 &key_client_aes,
3207 &key_server_aes,
3208 NULL, NULL);
3209#endif
3210 if (ret != TSIP_SUCCESS) {
3211 WOLFSSL_MSG("R_TSIP_TlsGenerateSessionKey failed");
3212 }
3213 else {
3214 /* succeeded creating session keys */
3215 /* alloc aes instance for both enc and dec */
3216 enc = &ssl->encrypt;
3217 dec = &ssl->decrypt;
3218
3219 if (enc) {
3220 if (enc->aes == NULL) {
3221 enc->aes = (Aes*)XMALLOC(sizeof(Aes), ssl->heap,
3222 DYNAMIC_TYPE_CIPHER);
3223 if (enc->aes == NULL)
3224 return MEMORY_E;
3225 }
3226
3227 ForceZero(enc->aes, sizeof(Aes));
3228 }
3229 if (dec) {
3230 if (dec->aes == NULL) {
3231 dec->aes = (Aes*)XMALLOC(sizeof(Aes), ssl->heap,
3232 DYNAMIC_TYPE_CIPHER);
3233 if (dec->aes == NULL) {
3234 if (enc) {
3235 XFREE(enc->aes, NULL, DYNAMIC_TYPE_CIPHER);
3236 }
3237 return MEMORY_E;
3238 }
3239 }
3240
3241 ForceZero(dec->aes, sizeof(Aes));
3242 }
3243
3244 /* copy key index into aes */
3245 if (ssl->options.side == PROVISION_CLIENT) {
3246 XMEMCPY(&enc->aes->ctx.tsip_keyIdx, &key_client_aes,
3247 sizeof(key_client_aes));
3248 XMEMCPY(&dec->aes->ctx.tsip_keyIdx, &key_server_aes,
3249 sizeof(key_server_aes));
3250 }
3251 else {
3252 XMEMCPY(&enc->aes->ctx.tsip_keyIdx, &key_server_aes,
3253 sizeof(key_server_aes));
3254 XMEMCPY(&dec->aes->ctx.tsip_keyIdx, &key_client_aes,
3255 sizeof(key_client_aes));
3256 }
3257
3258 /* copy hac key index into keys */
3259 ssl->keys.tsip_client_write_MAC_secret = key_client_mac;
3260 ssl->keys.tsip_server_write_MAC_secret = key_server_mac;
3261
3262 /* set up key size and marked ready */
3263 if (enc) {
3264 enc->aes->ctx.keySize = ssl->specs.key_size;
3265 enc->aes->ctx.setup = 1;
3266 /* ready-for-use flag will be set when SetKeySide() is called */
3267 }
3268 /* set up key size and marked ready */
3269 if (dec) {
3270 dec->aes->ctx.keySize = ssl->specs.key_size;
3271 dec->aes->ctx.setup = 1;
3272 /* ready-for-use flag will be set when SetKeySide() is called */
3273 }
3274
3275 if (ctx->internal->tsip_cipher ==
3276 R_TSIP_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ||
3277 ctx->internal->tsip_cipher ==
3278 R_TSIP_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) {
3279 enc->aes->nonceSz = AEAD_NONCE_SZ;
3280 dec->aes->nonceSz = AEAD_NONCE_SZ;
3281 }
3282
3283 enc->aes->devId = devId;
3284 dec->aes->devId = devId;
3285
3286 ctx->internal->session_key_set = 1;
3287 }
3288 /* unlock hw */
3289 tsip_hw_unlock();
3290 }
3291 else
3292 WOLFSSL_MSG("hw lock failed");
3293
3294 WOLFSSL_LEAVE("wc_tsip_generateSessionKey", ret);
3295 return ret;
3296}
3297
3298
3299
3300/* generate Master secrete by TSIP */
3301#if (WOLFSSL_RENESAS_TSIP_VER>=109)
3302
3303int wc_tsip_generateMasterSecretEx(
3304 byte cipherSuiteFirst,
3305 byte cipherSuite,
3306 const byte *pr, /* pre-master */
3307 const byte *cr, /* client random */
3308 const byte *sr, /* server random */
3309 byte *ms)
3310{
3311 int ret;
3312
3313 WOLFSSL_ENTER("tsip_generateMasterSecretEx");
3314
3315 if ((pr == NULL) || (cr == NULL) || (sr == NULL) ||
3316 (ms == NULL))
3317 return BAD_FUNC_ARG;
3318
3319 uint32_t tsipCS = GetTsipCipherSuite(cipherSuiteFirst,cipherSuite);
3320 if (tsipCS == 0xffffffff)
3321 return BAD_FUNC_ARG;
3322
3323 if ((ret = tsip_hw_lock()) == 0) {
3324 ret = R_TSIP_TlsGenerateMasterSecret(
3325 tsipCS,
3326 (uint32_t*)pr,
3327 (uint8_t*)cr, (uint8_t*)sr, (uint32_t*)ms);
3328 if (ret != TSIP_SUCCESS) {
3329 WOLFSSL_MSG("R_TSIP_TlsGenerateMasterSecret failed");
3330 }
3331 /* unlock hw */
3332 tsip_hw_unlock();
3333 }
3334 else {
3335 WOLFSSL_MSG(" hw lock failed ");
3336 }
3337 WOLFSSL_LEAVE("tsip_generateMasterSecretEx", ret);
3338 return ret;
3339}
3340
3341#else /* WOLFSSL_RENESAS_TSIP_VER < 109 */
3342
3343int wc_tsip_generateMasterSecret(
3344 const byte* pr, /* pre-master */
3345 const byte* cr, /* client random */
3346 const byte* sr, /* server random */
3347 byte* ms)
3348{
3349 int ret;
3350 WOLFSSL_ENTER("tsip_generateMasterSecret");
3351 if ((pr == NULL) || (cr == NULL) || (sr == NULL) ||
3352 (ms == NULL))
3353 return BAD_FUNC_ARG;
3354
3355 if ((ret = tsip_hw_lock()) == 0) {
3356 ret = R_TSIP_TlsGenerateMasterSecret(
3357 (uint32_t*)pr,
3358 (uint8_t*)cr,
3359 (uint8_t*)sr,
3360 (uint32_t*)ms);
3361
3362 if (ret != TSIP_SUCCESS) {
3363 WOLFSSL_MSG("R_TSIP_TlsGenerateMasterSecret failed");
3364 }
3365 /* unlock hw */
3366 tsip_hw_unlock();
3367 }
3368 else {
3369 WOLFSSL_MSG(" hw lock failed ");
3370 }
3371 WOLFSSL_LEAVE("tsip_generateMasterSecret", ret);
3372 return ret;
3373}
3374#endif /* WOLFSSL_RENESAS_TSIP_VER */
3375
3376/* store elements for session key generation into ssl->keys.
3377 * return 0 on success, negative value on failure
3378 */
3379int wc_tsip_storeKeyCtx(WOLFSSL* ssl, TsipUserCtx* userCtx)
3380{
3381 int ret = 0;
3382
3383 WOLFSSL_ENTER("tsip_storeKeyCtx");
3384
3385 if (ssl == NULL || userCtx == NULL)
3386 ret = BAD_FUNC_ARG;
3387
3388 if (ret == 0) {
3389 XMEMCPY(userCtx->internal->tsip_masterSecret,
3390 ssl->arrays->tsip_masterSecret, TSIP_TLS_MASTERSECRET_SIZE);
3391 XMEMCPY(userCtx->internal->tsip_clientRandom,
3392 ssl->arrays->clientRandom, TSIP_TLS_CLIENTRANDOM_SZ);
3393 XMEMCPY(userCtx->internal->tsip_serverRandom,
3394 ssl->arrays->serverRandom, TSIP_TLS_SERVERRANDOM_SZ);
3395 userCtx->internal->tsip_cipher = GetTsipCipherSuite(
3396 ssl->options.cipherSuite0,
3397 ssl->options.cipherSuite);
3398 }
3399
3400 WOLFSSL_LEAVE("tsip_storeKeyCtx", ret);
3401 return ret;
3402}
3403
3404/* generate pre-Master secrete by TSIP */
3405int wc_tsip_generatePremasterSecret(byte *premaster, word32 preSz)
3406{
3407 WOLFSSL_ENTER("tsip_generatePremasterSecret");
3408 int ret;
3409
3410 if (premaster == NULL)
3411 return BAD_FUNC_ARG;
3412
3413 if ((ret = tsip_hw_lock()) == 0 && preSz >=
3414 (R_TSIP_TLS_MASTER_SECRET_WORD_SIZE*4)) {
3415 /* generate pre-master, 80 bytes */
3416 ret = R_TSIP_TlsGeneratePreMasterSecret((uint32_t*)premaster);
3417 if (ret != TSIP_SUCCESS) {
3418 WOLFSSL_MSG(" R_TSIP_TlsGeneratePreMasterSecret failed");
3419 }
3420
3421 /* unlock hw */
3422 tsip_hw_unlock();
3423 }
3424 else {
3425 WOLFSSL_MSG(" hw lock failed or preSz is smaller than 80");
3426 }
3427 WOLFSSL_LEAVE("tsip_generatePremasterSecret", ret);
3428 return ret;
3429}
3430
3431/*
3432* generate encrypted pre-Master secrete by TSIP
3433*/
3434int wc_tsip_generateEncryptPreMasterSecret(
3435 WOLFSSL* ssl,
3436 byte* out,
3437 word32* outSz)
3438{
3439 int ret;
3440
3441 WOLFSSL_ENTER("tsip_generateEncryptPreMasterSecret");
3442
3443 if ((ssl == NULL) || (out == NULL) || (outSz == NULL))
3444 return BAD_FUNC_ARG;
3445
3446 if ((ret = tsip_hw_lock()) == 0) {
3447 if (*outSz >= 256)
3448
3449 #if (WOLFSSL_RENESAS_TSIP_VER>=109)
3450
3451 ret = R_TSIP_TlsEncryptPreMasterSecretWithRsa2048PublicKey(
3452 (uint32_t*)ssl->peerSceTsipEncRsaKeyIndex,
3453 (uint32_t*)ssl->arrays->preMasterSecret,
3454 (uint8_t*)out);
3455
3456 #else
3457
3458 ret = R_TSIP_TlsEncryptPreMasterSecret(
3459 (uint32_t*)ssl->peerSceTsipEncRsaKeyIndex,
3460 (uint32_t*)ssl->arrays->preMasterSecret,
3461 (uint8_t*)out);
3462
3463 #endif
3464 else
3465 ret = -1;
3466
3467 if (ret != TSIP_SUCCESS) {
3468 WOLFSSL_MSG(" R_TSIP_TlsEncryptPreMasterSecret failed");
3469 }
3470 else {
3471 *outSz = 256; /* TSIP can only handles 2048 RSA */
3472 void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
3473 wolfSSL_CTX_SetGenMasterSecretCb(ssl->ctx,
3474 Renesas_cmn_genMasterSecret);
3475 wolfSSL_SetGenMasterSecretCtx(ssl, ctx);
3476 }
3477
3478 tsip_hw_unlock();
3479
3480 }
3481 else {
3482 WOLFSSL_MSG(" hw lock failed ");
3483 }
3484 WOLFSSL_LEAVE("tsip_generateEncryptPreMasterSecret", ret);
3485 return ret;
3486}
3487
3488
3489/* Certificate verification by TSIP */
3490int wc_tsip_tls_CertVerify(
3491 const uint8_t* cert, uint32_t certSz,
3492 const uint8_t* signature, uint32_t sigSz,
3493 uint32_t key_n_start, uint32_t key_n_len,
3494 uint32_t key_e_start, uint32_t key_e_len,
3495 uint8_t* tsip_encRsaKeyIndex)
3496{
3497 int ret;
3498 uint8_t *sigforSCE = NULL;
3499 uint8_t *pSig = NULL;
3500 const byte rs_size = 0x20;
3501 byte offset = 0x3;
3502
3503 WOLFSSL_ENTER("wc_tsip_tls_CertVerify");
3504
3505 if (cert == NULL)
3506 return BAD_FUNC_ARG;
3507
3508 if (!signature) {
3509 WOLFSSL_MSG(" signature for ca verification is not set");
3510 return -1;
3511 }
3512 if (!tsip_encRsaKeyIndex) {
3513 WOLFSSL_MSG(" tsip_encRsaKeyIndex is NULL.");
3514 return -1;
3515 }
3516
3517 /* Public key type: Prime256r1 */
3518 if (g_user_key_info.encrypted_user_tls_key_type ==
3519 R_TSIP_TLS_PUBLIC_KEY_TYPE_ECDSA_P256) {
3520
3521 if ((sigforSCE = (uint8_t*)XMALLOC(R_TSIP_ECDSA_DATA_BYTE_SIZE,
3522 NULL, DYNAMIC_TYPE_ECC)) == NULL) {
3523 WOLFSSL_MSG("failed to malloc memory");
3524 return MEMORY_E;
3525 }
3526 /* initialization */
3527 ForceZero(sigforSCE, R_TSIP_ECDSA_DATA_BYTE_SIZE);
3528
3529 if (signature[offset] == 0x20) {
3530 XMEMCPY(sigforSCE, &signature[offset+1], rs_size);
3531
3532 offset = 0x25;
3533 if (signature[offset] == 0x20) {
3534 XMEMCPY(&sigforSCE[rs_size], &signature[offset+1], rs_size);
3535 }
3536 else {
3537 XMEMCPY(&sigforSCE[rs_size], &signature[offset+2], rs_size);
3538 }
3539 }
3540 else {
3541 XMEMCPY(sigforSCE, &signature[offset+2], rs_size);
3542 offset = 0x26;
3543
3544 if (signature[offset] == rs_size) {
3545 XMEMCPY(&sigforSCE[rs_size], &signature[offset+1], rs_size);
3546 }
3547 else {
3548 XMEMCPY(&sigforSCE[rs_size], &signature[offset+2], rs_size);
3549 }
3550 }
3551 pSig = sigforSCE;
3552 }
3553 /* Public key type: RSA 2048bit */
3554 else {
3555 pSig = (uint8_t*)signature;
3556 }
3557
3558 if ((ret = tsip_hw_lock()) == 0) {
3559
3560 #if (WOLFSSL_RENESAS_TSIP_VER>=109)
3561
3562 ret = R_TSIP_TlsCertificateVerification(
3563 g_user_key_info.encrypted_user_tls_key_type,
3564 (uint32_t*)g_encrypted_publicCA_key,/* encrypted public key */
3565 (uint8_t*)cert, /* certificate der */
3566 certSz, /* length of der */
3567 (uint8_t*)pSig, /* sign data by RSA PSS */
3568 key_n_start, /* start position of public key n in bytes */
3569 (key_n_start + key_n_len), /* length of the public key n */
3570 key_e_start, /* start pos, key e in bytes */
3571 (key_e_start + key_e_len), /* length of the public key e */
3572 (uint32_t*)tsip_encRsaKeyIndex /* returned encrypted key */
3573 );
3574
3575 #elif (WOLFSSL_RENESAS_TSIP_VER>=106)
3576
3577 ret = R_TSIP_TlsCertificateVerification(
3578 (uint32_t*)g_encrypted_publicCA_key,/* encrypted public key */
3579 (uint8_t*)cert, /* certificate der */
3580 certSz, /* length of der */
3581 (uint8_t*)pSig, /* sign data by RSA PSS */
3582 key_n_start, /* start position of public key n in bytes */
3583 (key_n_start + key_n_len), /* length of the public key n */
3584 key_e_start, /* start pos, key e in bytes */
3585 (key_e_start + key_e_len), /* length of the public key e */
3586 (uint32_t*)tsip_encRsaKeyIndex /* returned encrypted key */
3587 );
3588 #endif
3589
3590 if (ret != TSIP_SUCCESS) {
3591 WOLFSSL_MSG(" R_TSIP_TlsCertificateVerification failed");
3592 }
3593 XFREE(sigforSCE, NULL, DYNAMIC_TYPE_ECC);
3594 tsip_hw_unlock();
3595 }
3596 else {
3597 WOLFSSL_MSG(" hw lock failed ");
3598 }
3599 WOLFSSL_LEAVE("wc_tsip_tls_CertVerify", ret);
3600 return ret;
3601}
3602/* Root Certificate verification */
3603int wc_tsip_tls_RootCertVerify(
3604 const byte* cert, word32 cert_len,
3605 word32 key_n_start, word32 key_n_len,
3606 word32 key_e_start, word32 key_e_len,
3607 word32 cm_row)
3608{
3609 int ret;
3610 /* call to generate encrypted public key for certificate verification */
3611 uint8_t *signature = (uint8_t*)ca_cert_sig;
3612
3613 WOLFSSL_ENTER("wc_tsip_tls_RootCertVerify");
3614
3615 if (cert == NULL)
3616 return BAD_FUNC_ARG;
3617
3618 if (!signature) {
3619 WOLFSSL_MSG(" signature for ca verification is not set");
3620 return -1;
3621 }
3622
3623 if ((ret = tsip_hw_lock()) == 0) {
3624
3625 #if (WOLFSSL_RENESAS_TSIP_VER>=109)
3626 ret = R_TSIP_TlsRootCertificateVerification(
3627 g_user_key_info.encrypted_user_tls_key_type,
3628 (uint8_t*)cert, /* CA cert */
3629 (uint32_t)cert_len, /* length of CA cert */
3630 key_n_start, /* Byte position of public key */
3631 (key_n_start + key_n_len),
3632 key_e_start,
3633 (key_e_start + key_e_len),
3634 (uint8_t*)ca_cert_sig, /* RSA 2048 PSS with SHA256 */
3635 g_encrypted_publicCA_key /* RSA-2048 public key 560 bytes */
3636 );
3637 #else /* WOLFSSL_RENESAS_TSIP_VER < 109 */
3638 ret = R_TSIP_TlsRootCertificateVerification(
3639 (uint8_t*)cert,/* CA cert */
3640 (uint32_t)cert_len,/* length of CA cert */
3641 key_n_start, /* Byte position of public key */
3642 (key_n_start + key_n_len),
3643 key_e_start,
3644 (key_e_start + key_e_len),
3645 (uint8_t*)ca_cert_sig,/* "RSA 2048 PSS with SHA256" */
3646 /* RSA-2048 public key used by RSA-2048 PSS with SHA256. 560 Bytes */
3647 g_encrypted_publicCA_key
3648 );
3649 #endif
3650
3651 if (ret != TSIP_SUCCESS) {
3652 WOLFSSL_MSG(" R_TSIP_TlsRootCertificateVerification failed");
3653 }
3654 else {
3655 g_CAscm_Idx = cm_row;
3656 }
3657
3658 tsip_hw_unlock();
3659 }
3660 else {
3661 WOLFSSL_MSG(" hw lock failed ");
3662 }
3663 WOLFSSL_LEAVE("wc_tsip_tls_RootCertVerify", ret);
3664 return ret;
3665}
3666#endif /* WOLFSSL_RENESAS_TSIP_TLS */
3667
3668#if !defined(NO_RSA)
3669/* Perform signing with the client's RSA private key on hash value of messages
3670 * exchanged with server.
3671 *
3672 * parameters
3673 * info->pk.rsa.in : not used
3674 * info->pk.rsa.inlen : not used
3675 * info->pk.rsa.out : the buffer where the signature data is output to
3676 * info->pk.rsa.outlen: the length of the pk.rsa.out
3677 * tuc: the pointer to the TsipUserCtx structure
3678 * returns
3679 * 0 on success, CRYPTOCB_UNAVAILABLE on unsupported key type specified.
3680 *
3681 */
3682int tsip_SignRsaPkcs(wc_CryptoInfo* info, TsipUserCtx* tuc)
3683{
3684 int ret = 0;
3685 e_tsip_err_t err = TSIP_SUCCESS;
3686 tsip_rsa_byte_data_t hashData, sigData;
3687 WOLFSSL* ssl = NULL;
3688 uint8_t tsip_hash_type;
3689
3690 WOLFSSL_ENTER("tsip_SignRsaPkcs");
3691
3692 if (info == NULL || tuc == NULL
3693 #ifndef WOLFSSL_RENESAS_TSIP_CRYPTONLY
3694 || tuc->internal->ssl == NULL
3695 #endif
3696 ) {
3697 ret = BAD_FUNC_ARG;
3698 }
3699
3700#ifdef WOLFSSL_RENESAS_TSIP_TLS
3701 if (ret == 0) {
3702 ssl = tuc->internal->ssl;
3703
3704 if (ssl->version.major == SSLv3_MAJOR &&
3705 ssl->version.minor == TLSv1_3_MINOR) {
3706 ret = CRYPTOCB_UNAVAILABLE;
3707 }
3708 }
3709
3710 if (ret == 0) {
3711 /* import private key_index from wrapped key */
3712 ret = tsip_ImportPrivateKey(tuc, tuc->wrappedKeyType);
3713 }
3714
3715 if (ret == 0) {
3716 if (ssl->options.hashAlgo == md5_mac)
3717 tsip_hash_type = R_TSIP_RSA_HASH_MD5;
3718 else if (ssl->options.hashAlgo == sha_mac)
3719 tsip_hash_type = R_TSIP_RSA_HASH_SHA1;
3720 else if (ssl->options.hashAlgo == sha256_mac)
3721 tsip_hash_type = R_TSIP_RSA_HASH_SHA256;
3722 else
3723 ret = CRYPTOCB_UNAVAILABLE;
3724 }
3725#else
3726 (void)ssl;
3727
3728 if (ret == 0) {
3729 if (tuc->sign_hash_type == md5_mac)
3730 tsip_hash_type = R_TSIP_RSA_HASH_MD5;
3731 else if (tuc->sign_hash_type == sha_mac)
3732 tsip_hash_type = R_TSIP_RSA_HASH_SHA1;
3733 else if (tuc->sign_hash_type == sha256_mac)
3734 tsip_hash_type = R_TSIP_RSA_HASH_SHA256;
3735 else
3736 ret = CRYPTOCB_UNAVAILABLE;
3737 }
3738
3739 switch (tuc->wrappedKeyType) {
3740#if defined(TSIP_RSASSA_1024) && TSIP_RSASSA_1024 == 1
3741 case TSIP_KEY_TYPE_RSA1024:
3742 if (tuc->keyflgs_crypt.bits.rsapri1024_key_set != 1) {
3743 WOLFSSL_MSG("tsip rsa private key 1024 not set");
3744 ret = CRYPTOCB_UNAVAILABLE;
3745 }
3746 break;
3747#endif
3748#if defined(TSIP_RSASSA_2048) && TSIP_RSASSA_2048 == 1
3749 case TSIP_KEY_TYPE_RSA2048:
3750 if (tuc->keyflgs_crypt.bits.rsapri2048_key_set != 1) {
3751 WOLFSSL_MSG("tsip rsa private key 2048 not set");
3752 ret = CRYPTOCB_UNAVAILABLE;
3753 }
3754 break;
3755#endif
3756 default:
3757 WOLFSSL_MSG("wrapped private key is not supported");
3758 ret = CRYPTOCB_UNAVAILABLE;
3759 break;
3760 }
3761#endif
3762
3763 if (ret == 0) {
3764 #ifdef WOLFSSL_RENESAS_TSIP_TLS
3765 /* since TSIP driver adds ASN.1 input data uses raw digest */
3766 hashData.pdata = (uint8_t*)ssl->buffers.digest.buffer;
3767 hashData.data_length= ssl->buffers.digest.length;
3768 hashData.data_type = 1; /* hashed data */
3769 sigData.pdata = (uint8_t*)info->pk.rsa.out;
3770 sigData.data_length = 0; /* signature size will be returned here */
3771 #else
3772 hashData.pdata = (uint8_t*)info->pk.rsa.in;
3773 hashData.data_length= info->pk.rsa.inLen;
3774 hashData.data_type = tuc->keyflgs_crypt.bits.message_type;
3775 sigData.pdata = (uint8_t*)info->pk.rsa.out;
3776 sigData.data_length = 0;
3777 #endif
3778 if ((ret = tsip_hw_lock()) == 0) {
3779 switch (tuc->wrappedKeyType) {
3780#if (defined(TSIP_RSASSA_1024) && TSIP_RSASSA_1024 == 1) && \
3781 defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
3782 case TSIP_KEY_TYPE_RSA1024:
3783 err = R_TSIP_RsassaPkcs1024SignatureGenerate(
3784 &hashData, &sigData,
3785 (tsip_rsa1024_private_key_index_t*)
3786 tuc->rsa1024pri_keyIdx,
3787 tsip_hash_type);
3788
3789 if (err != TSIP_SUCCESS) {
3790 ret = WC_HW_E;
3791 }
3792 break;
3793#endif
3794#if defined(TSIP_RSASSA_2048) && TSIP_RSASSA_2048 == 1
3795 case TSIP_KEY_TYPE_RSA2048:
3796 err = R_TSIP_RsassaPkcs2048SignatureGenerate(
3797 &hashData, &sigData,
3798 #ifdef WOLFSSL_RENESAS_TSIP_TLS
3799 &(tuc->internal->Rsa2048PrivateKeyIdx),
3800 #else
3801 (tsip_rsa2048_private_key_index_t*)
3802 tuc->rsa2048pri_keyIdx,
3803 #endif
3804 tsip_hash_type);
3805
3806 if (err != TSIP_SUCCESS) {
3807 ret = WC_HW_E;
3808 }
3809 *(info->pk.rsa.outLen) = sigData.data_length;
3810 break;
3811#endif
3812 case TSIP_KEY_TYPE_RSA4096:
3813 ret = CRYPTOCB_UNAVAILABLE;
3814 break;
3815
3816 default:
3817 WOLFSSL_MSG("wrapped private key is not supported");
3818 ret = CRYPTOCB_UNAVAILABLE;
3819 break;
3820 }
3821
3822 tsip_hw_unlock();
3823 }
3824 else {
3825 WOLFSSL_MSG("mutex locking error");
3826 }
3827 }
3828
3829 WOLFSSL_LEAVE("tsip_SignRsaPkcs", ret);
3830 return ret;
3831}
3832#endif /* !NO_RSA */
3833
3834#if !defined(NO_RSA) && defined(WOLFSSL_RENESAS_TSIP_TLS)
3835int tsip_VerifyRsaPkcsCb(
3836 WOLFSSL* ssl,
3837 unsigned char* sig, unsigned int sigSz,
3838 unsigned char** out,
3839 const unsigned char* keyDer, unsigned int keySz,
3840 void* ctx)
3841{
3842 int ret = 0;
3843 e_tsip_err_t err = TSIP_SUCCESS;
3844 tsip_rsa_byte_data_t hashData, sigData;
3845 TsipUserCtx* tuc = NULL;
3846 uint8_t tsip_hash_type;
3847 (void)keyDer;
3848 (void)keySz;
3849
3850 WOLFSSL_ENTER("tsip_VerifyRsaPkcsCb");
3851
3852 if (sig == NULL || out == NULL || ctx == NULL) {
3853 ret = BAD_FUNC_ARG;
3854 }
3855
3856 if (ssl->version.major == SSLv3_MAJOR &&
3857 ssl->version.minor == TLSv1_3_MINOR) {
3858 ret = CRYPTOCB_UNAVAILABLE;
3859 }
3860
3861 if (ret == 0) {
3862 tuc = (TsipUserCtx*)ctx;
3863 if (tuc == NULL)
3864 ret = CRYPTOCB_UNAVAILABLE;
3865 }
3866
3867 if (ret == 0) {
3868 /* import public key_index from wrapped key */
3869 ret = tsip_ImportPublicKey(tuc, tuc->wrappedKeyType);
3870 }
3871
3872 if (ret == 0) {
3873 if (ssl->options.hashAlgo == md5_mac)
3874 tsip_hash_type = R_TSIP_RSA_HASH_MD5;
3875 else if (ssl->options.hashAlgo == sha_mac)
3876 tsip_hash_type = R_TSIP_RSA_HASH_SHA1;
3877 else if (ssl->options.hashAlgo == sha256_mac)
3878 tsip_hash_type = R_TSIP_RSA_HASH_SHA256;
3879 else {
3880 ret = CRYPTOCB_UNAVAILABLE;
3881 }
3882 }
3883
3884 if (ret == 0) {
3885 sigData.pdata = (uint8_t*)sig;
3886 sigData.data_length = sigSz;
3887 /* Since TSITP driver handles ASN.1 internally,
3888 * the expected data is raw hash.
3889 */
3890 hashData.pdata = (uint8_t*)ssl->buffers.digest.buffer;
3891 hashData.data_type = 1; /* hash value */
3892
3893 if ((ret = tsip_hw_lock()) == 0) {
3894
3895 switch (tuc->wrappedKeyType) {
3896#if defined(TSIP_RSASSA_2048) && TSIP_RSASSA_2048 == 1
3897 case TSIP_KEY_TYPE_RSA2048:
3898 err = R_TSIP_RsassaPkcs2048SignatureVerification(
3899 &sigData, &hashData,
3900 &(tuc->internal->Rsa2048PublicKeyIdx),
3901 tsip_hash_type);
3902
3903 if (err == TSIP_ERR_AUTHENTICATION) {
3904 ret = VERIFY_CERT_ERROR;
3905 }
3906 else if (err == TSIP_SUCCESS) {
3907 ret = 0;
3908 }
3909 else {
3910 ret = WC_HW_E;
3911 }
3912 break;
3913#endif
3914 case TSIP_KEY_TYPE_RSA4096:
3915 ret = CRYPTOCB_UNAVAILABLE;
3916 break;
3917
3918 default:
3919 WOLFSSL_MSG("wrapped private key is not supported");
3920 ret = CRYPTOCB_UNAVAILABLE;
3921 break;
3922 }
3923 tsip_hw_unlock();
3924 }
3925 else {
3926 WOLFSSL_MSG("mutex locking error");
3927 }
3928 }
3929 WOLFSSL_LEAVE("tsip_VerifyRsaPkcsCb", ret);
3930 return ret;
3931}
3932#endif /* !NO_RSA && TSIP_TLS */
3933
3934#if defined(HAVE_ECC)
3935#if defined(WOLFSSL_RENESAS_TSIP_TLS)
3936/* Perform signing with the client's ECC private key on hash value of messages
3937 * exchanged with server.
3938 *
3939 * parameters
3940 * info->pk.eccsign.in : the buffer holding hash value of messages
3941 * info->pk.eccsign.inlen : hash data size
3942 * info->pk.eccsign.out : the buffer where the signature data is output to
3943 * info->pk.eccsign.outlen: the length of the buffer pk.eccsign.out
3944 * tuc: the pointer to the TsipUserCtx structure
3945 * returns
3946 * 0 on success, CRYPTOCB_UNAVAILABLE on unsupported key type specified.
3947 * note
3948 * signature will be DER encoded and stored into out buffer.
3949 * the private key must be imported as TSIP specific format.
3950 */
3951int tsip_SignEcdsa(wc_CryptoInfo* info, TsipUserCtx* tuc)
3952{
3953 int ret = 0;
3954 e_tsip_err_t err = TSIP_SUCCESS;
3955 tsip_ecdsa_byte_data_t hashData, sigData;
3956 byte offsetForWork;
3957 byte* out = NULL;
3958 byte* sig = NULL;
3959 int rSz = 0;
3960 int sSz = 0;
3961 int idx = 0;
3962 int sz = 0;
3963 WOLFSSL* ssl = NULL;
3964
3965 WOLFSSL_ENTER("tsip_SignEcdsa");
3966
3967 if (info == NULL || tuc == NULL) {
3968 ret = CRYPTOCB_UNAVAILABLE;
3969 }
3970
3971 if (ret == 0) {
3972 ssl = tuc->internal->ssl;
3973
3974 if (ssl->version.major == SSLv3_MAJOR &&
3975 ssl->version.minor == TLSv1_3_MINOR) {
3976 ret = CRYPTOCB_UNAVAILABLE;
3977 }
3978 }
3979
3980 if (ret == 0) {
3981 /* import private key_index from wrapped key */
3982 ret = tsip_ImportPrivateKey(tuc, tuc->wrappedKeyType);
3983 }
3984
3985 if (ret == 0) {
3986 hashData.pdata = (uint8_t*)info->pk.eccsign.in;
3987 hashData.data_type = 1;
3988 sigData.pdata = (uint8_t*)info->pk.eccsign.out;
3989 sigData.data_length = 0; /* signature size will be returned here */
3990
3991 if ((ret = tsip_hw_lock()) == 0) {
3992 switch (tuc->wrappedKeyType) {
3993
3994 #if !defined(NO_ECC256)
3995 case TSIP_KEY_TYPE_ECDSAP256:
3996 offsetForWork = R_TSIP_ECDSA_DATA_BYTE_SIZE + 32;
3997 if (*(info->pk.eccsign.outlen) <
3998 R_TSIP_ECDSA_DATA_BYTE_SIZE + offsetForWork) {
3999 ret = BUFFER_E;
4000 break;
4001 }
4002
4003 sigData.pdata = (uint8_t*)info->pk.eccsign.out +
4004 offsetForWork;
4005 err = R_TSIP_EcdsaP256SignatureGenerate(
4006 &hashData, &sigData,
4007 &(tuc->internal->EcdsaPrivateKeyIdx));
4008 if (err != TSIP_SUCCESS) {
4009 ret = WC_HW_E;
4010 break;
4011 }
4012
4013 out = info->pk.eccsign.out;
4014 sig = sigData.pdata;
4015
4016 rSz = sSz = R_TSIP_ECDSA_DATA_BYTE_SIZE / 2;
4017 rSz += (sig[0] & 0x80)?1:0;
4018 sSz += (sig[sSz] & 0x80)?1:0;
4019 sz = (ASN_TAG_SZ + 1) * 2 + rSz + sSz;
4020
4021 /* encode ASN sequence */
4022 out[idx++] = ASN_SEQUENCE | ASN_CONSTRUCTED;
4023 out[idx++] = sz;
4024
4025 /* copy r part */
4026 out[idx++] = ASN_INTEGER;
4027 out[idx++] = rSz;
4028 if (rSz > R_TSIP_ECDSA_DATA_BYTE_SIZE / 2)
4029 out[idx++] = 0x00;
4030 XMEMCPY(&out[idx], sig, R_TSIP_ECDSA_DATA_BYTE_SIZE / 2);
4031 idx += R_TSIP_ECDSA_DATA_BYTE_SIZE / 2;
4032 sig += R_TSIP_ECDSA_DATA_BYTE_SIZE / 2;
4033 /* copy s part */
4034 out[idx++] = ASN_INTEGER;
4035 out[idx++] = sSz;
4036 if (sSz > R_TSIP_ECDSA_DATA_BYTE_SIZE / 2)
4037 out[idx++] = 0x00;
4038 XMEMCPY(&out[idx], sig, R_TSIP_ECDSA_DATA_BYTE_SIZE / 2);
4039
4040 /* out size */
4041 *(info->pk.eccsign.outlen) = ASN_TAG_SZ + 1 + sz;
4042 break;
4043 #endif
4044
4045 #if defined(HAVE_ECC384)
4046 case TSIP_KEY_TYPE_ECDSAP384:
4047 ret = CRYPTOCB_UNAVAILABLE;
4048 break;
4049 #endif
4050
4051 default:
4052 WOLFSSL_MSG("wrapped private key is not supported");
4053 ret = CRYPTOCB_UNAVAILABLE;
4054 break;
4055 }
4056 tsip_hw_unlock();
4057 }
4058 else {
4059 WOLFSSL_MSG("mutex locking error");
4060 }
4061 }
4062 WOLFSSL_LEAVE("tsip_SignEcdsa", ret);
4063 return ret;
4064}
4065#endif /* WOLFSSL_RENESAS_TSIP_TLS */
4066
4067#if defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)
4068/* zero pad or truncate hash */
4069static int tsip_HashPad(int curveSz, uint8_t* hash,
4070 const uint8_t* hashIn, int hashSz)
4071{
4072 if (hashSz > curveSz)
4073 hashSz = curveSz;
4074 XMEMCPY(hash + (curveSz - hashSz), hashIn, hashSz);
4075 return curveSz;
4076}
4077
4078/* Perform verify with the wrapped public key, provided hash and signature r+s
4079 *
4080 * parameters
4081 * info->pk.eccverify.in : the buffer holding hash value of messages
4082 * info->pk.eccverify.inlen : hash data size
4083 * info->pk.eccverify.out : the buffer where the signature data is output to
4084 * info->pk.eccverify.outlen: the length of the buffer pk.eccsign.out
4085 * tuc: the pointer to the TsipUserCtx structure
4086 * returns
4087 * 0 on success, CRYPTOCB_UNAVAILABLE on unsupported key type specified.
4088 */
4089int tsip_VerifyEcdsa(wc_CryptoInfo* info, TsipUserCtx* tuc)
4090{
4091 int ret = 0;
4092 e_tsip_err_t err = TSIP_SUCCESS;
4093 tsip_ecdsa_byte_data_t hashData, sigData;
4094 /* hard coding largest digest size, since WC_MAX_DIGEST_SZ could be 32
4095 * if using SHA2-256 with ECDSA SECP384R1 */
4096 uint8_t hash[TSIP_MAX_ECC_BYTES];
4097
4098 WOLFSSL_ENTER("tsip_VerifyEcdsa");
4099
4100 if (info == NULL || tuc == NULL) {
4101 ret = CRYPTOCB_UNAVAILABLE;
4102 }
4103
4104 XMEMSET(hash, 0, sizeof(hash));
4105
4106 if (ret == 0) {
4107 /* import public key_index from wrapped key */
4108 ret = tsip_ImportPublicKey(tuc, tuc->wrappedKeyType);
4109 }
4110
4111 if (ret == 0) {
4112 int curveSz = info->pk.eccverify.key->dp->size;
4113 hashData.pdata = (uint8_t*)hash;
4114 hashData.data_type = tuc->keyflgs_crypt.bits.message_type;
4115 sigData.pdata = (uint8_t*)info->pk.eccverify.sig;
4116 sigData.data_length = info->pk.eccverify.siglen;
4117
4118 if ((ret = tsip_hw_lock()) == 0) {
4119 switch (tuc->wrappedKeyType) {
4120 #if !defined(NO_ECC256)
4121 case TSIP_KEY_TYPE_ECDSAP256:
4122 /* zero pad or truncate */
4123 hashData.data_length = tsip_HashPad(curveSz,
4124 hash, info->pk.eccverify.hash,
4125 info->pk.eccverify.hashlen);
4126
4127 err = R_TSIP_EcdsaP256SignatureVerification(&sigData,
4128 &hashData, &tuc->eccpub_keyIdx);
4129 if (err == TSIP_SUCCESS) {
4130 *info->pk.eccverify.res = 1; /* success */
4131 }
4132 else {
4133 ret = WC_HW_E;
4134 }
4135 break;
4136 break;
4137 #endif
4138
4139 #if defined(HAVE_ECC384)
4140 case TSIP_KEY_TYPE_ECDSAP384:
4141 /* zero pad or truncate */
4142 hashData.data_length = tsip_HashPad(curveSz,
4143 hash, info->pk.eccverify.hash,
4144 info->pk.eccverify.hashlen);
4145
4146 err = R_TSIP_EcdsaP384SignatureVerification(&sigData,
4147 &hashData, &tuc->eccpub_keyIdx);
4148 if (err == TSIP_SUCCESS) {
4149 *info->pk.eccverify.res = 1; /* success */
4150 }
4151 else {
4152 ret = WC_HW_E;
4153 }
4154 break;
4155 #endif
4156
4157 default:
4158 WOLFSSL_MSG("ECDSA public key size not available");
4159 ret = CRYPTOCB_UNAVAILABLE;
4160 break;
4161 }
4162 tsip_hw_unlock();
4163 }
4164 else {
4165 WOLFSSL_MSG("mutex locking error");
4166 }
4167 }
4168 WOLFSSL_LEAVE("tsip_VerifyEcdsa", ret);
4169 return ret;
4170}
4171#endif /* WOLFSSL_RENESAS_TSIP_CRYPTONLY */
4172#endif /* HAVE_ECC */
4173
4174
4175#ifdef WOLFSSL_RENESAS_TSIP_CRYPT_DEBUG
4176
4177#if 0
4178 /* this is here for documentation purposes. */
4179 enum e_tsip_err {
4180 TSIP_SUCCESS = 0,
4181 TSIP_ERR_SELF_CHECK1, /* Self-check 1 fail or TSIP function internal err. */
4182 TSIP_ERR_RESOURCE_CONFLICT, /* A resource conflict occurred. */
4183 TSIP_ERR_SELF_CHECK2, /* Self-check 2 fail. */
4184 TSIP_ERR_KEY_SET, /* setting the invalid key. */
4185 TSIP_ERR_AUTHENTICATION, /* Authentication failed. */
4186 TSIP_ERR_CALLBACK_UNREGIST, /* Callback function is not registered. */
4187 TSIP_ERR_PARAMETER, /* Illegal Input data. */
4188 TSIP_ERR_PROHIBIT_FUNCTION, /* An invalid function call occurred. */
4189 TSIP_RESUME_FIRMWARE_GENERATE_MAC
4190 /* There is a continuation of R_TSIP_GenerateFirmwareMAC. */
4191 };
4192#endif
4193
4194static void hexdump(const uint8_t* in, uint32_t len)
4195{
4196 uint32_t i;
4197
4198 if (in == NULL)
4199 return;
4200
4201 for (i = 0; i <= len;i++, in++) {
4202 printf("%02x:", *in);
4203 if (((i+1)%16)==0) {
4204 printf("\n");
4205 }
4206 }
4207 printf("\n");
4208}
4209
4210byte *ret2err(word32 ret)
4211{
4212 switch(ret) {
4213 case TSIP_SUCCESS: return "success";
4214 case TSIP_ERR_SELF_CHECK1: return "selfcheck1";
4215 case TSIP_ERR_RESOURCE_CONFLICT: return "rsconflict";
4216 case TSIP_ERR_SELF_CHECK2: return "selfcheck2";
4217 case TSIP_ERR_KEY_SET: return "keyset";
4218 case TSIP_ERR_AUTHENTICATION: return "authentication";
4219 case TSIP_ERR_CALLBACK_UNREGIST: return "callback unreg";
4220 case TSIP_ERR_PARAMETER: return "badarg";
4221 case TSIP_ERR_PROHIBIT_FUNCTION: return "prohibitfunc";
4222 case TSIP_RESUME_FIRMWARE_GENERATE_MAC: return "conti-generate-mac";
4223 default:return "unknown";
4224 }
4225}
4226
4227#endif /* WOLFSSL_RENESAS_TSIP_CRYPT_DEBUG */
4228#endif /* WOLFSSL_RENESAS_TSIP */