cjson
.github
workflows CI.yml ci-fuzz.yml
CONTRIBUTING.md
fuzzing
inputs test1 test10 test11 test2 test3 test3.bu test3.uf test3.uu test4 test5 test6 test7 test8 test9
.gitignore CMakeLists.txt afl-prepare-linux.sh afl.c afl.sh cjson_read_fuzzer.c fuzz_main.c json.dict ossfuzz.sh
library_config cJSONConfig.cmake.in cJSONConfigVersion.cmake.in libcjson.pc.in libcjson_utils.pc.in uninstall.cmake
tests
inputs test1 test1.expected test10 test10.expected test11 test11.expected test2 test2.expected test3 test3.expected test4 test4.expected test5 test5.expected test6 test7 test7.expected test8 test8.expected test9 test9.expected
json-patch-tests .editorconfig .gitignore .npmignore README.md cjson-utils-tests.json package.json spec_tests.json tests.json
unity
auto colour_prompt.rb colour_reporter.rb generate_config.yml generate_module.rb generate_test_runner.rb parse_output.rb stylize_as_junit.rb test_file_filter.rb type_sanitizer.rb unity_test_summary.py unity_test_summary.rb unity_to_junit.py
docs ThrowTheSwitchCodingStandard.md UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf UnityAssertionsReference.md UnityConfigurationGuide.md UnityGettingStartedGuide.md UnityHelperScriptsGuide.md license.txt
examples
example_1
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
makefile readme.txt
example_2
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
makefile readme.txt
example_3
helper UnityHelper.c UnityHelper.h
src ProductionCode.c ProductionCode.h ProductionCode2.c ProductionCode2.h
rakefile.rb rakefile_helper.rb readme.txt target_gcc_32.yml
unity_config.h
extras
eclipse error_parsers.txt
fixture
src unity_fixture.c unity_fixture.h unity_fixture_internals.h unity_fixture_malloc_overrides.h
rakefile.rb rakefile_helper.rb readme.txt
release build.info version.info
src unity.c unity.h unity_internals.h
.gitattributes .gitignore .travis.yml README.md
CMakeLists.txt cjson_add.c common.h compare_tests.c json_patch_tests.c minify_tests.c misc_tests.c misc_utils_tests.c old_utils_tests.c parse_array.c parse_examples.c parse_hex4.c parse_number.c parse_object.c parse_string.c parse_value.c parse_with_opts.c print_array.c print_number.c print_object.c print_string.c print_value.c readme_examples.c unity_setup.c
.editorconfig .gitattributes .gitignore .travis.yml CHANGELOG.md CMakeLists.txt CONTRIBUTORS.md LICENSE Makefile README.md SECURITY.md appveyor.yml cJSON.c cJSON.h cJSON_Utils.c cJSON_Utils.h test.c valgrind.supp
curl
.circleci config.yml
.github
ISSUE_TEMPLATE bug_report.yml config.yml docs.yml
scripts cleancmd.pl cmp-config.pl cmp-pkg-config.sh codespell-ignore.words codespell.sh distfiles.sh pyspelling.words pyspelling.yaml randcurl.pl requirements-docs.txt requirements-proselint.txt requirements.txt shellcheck-ci.sh shellcheck.sh spellcheck.curl trimmarkdownheader.pl typos.sh typos.toml verify-examples.pl verify-synopsis.pl yamlcheck.sh yamlcheck.yaml
workflows appveyor-status.yml checkdocs.yml checksrc.yml checkurls.yml codeql.yml configure-vs-cmake.yml curl-for-win.yml distcheck.yml fuzz.yml http3-linux.yml label.yml linux-old.yml linux.yml macos.yml non-native.yml windows.yml
CODEOWNERS CONTRIBUTING.md FUNDING.yml dependabot.yml labeler.yml lock.yml stale.yml
CMake CurlSymbolHiding.cmake CurlTests.c FindBrotli.cmake FindCares.cmake FindGSS.cmake FindGnuTLS.cmake FindLDAP.cmake FindLibbacktrace.cmake FindLibgsasl.cmake FindLibidn2.cmake FindLibpsl.cmake FindLibssh.cmake FindLibssh2.cmake FindLibuv.cmake FindMbedTLS.cmake FindNGHTTP2.cmake FindNGHTTP3.cmake FindNGTCP2.cmake FindNettle.cmake FindQuiche.cmake FindRustls.cmake FindWolfSSL.cmake FindZstd.cmake Macros.cmake OtherTests.cmake PickyWarnings.cmake Utilities.cmake cmake_uninstall.in.cmake curl-config.in.cmake unix-cache.cmake win32-cache.cmake
LICENSES BSD-4-Clause-UC.txt ISC.txt curl.txt
docs
cmdline-opts .gitignore CMakeLists.txt MANPAGE.md Makefile.am Makefile.inc _AUTHORS.md _BUGS.md _DESCRIPTION.md _ENVIRONMENT.md _EXITCODES.md _FILES.md _GLOBBING.md _NAME.md _OPTIONS.md _OUTPUT.md _PROGRESS.md _PROTOCOLS.md _PROXYPREFIX.md _SEEALSO.md _SYNOPSIS.md _URL.md _VARIABLES.md _VERSION.md _WWW.md abstract-unix-socket.md alt-svc.md anyauth.md append.md aws-sigv4.md basic.md ca-native.md cacert.md capath.md cert-status.md cert-type.md cert.md ciphers.md compressed-ssh.md compressed.md config.md connect-timeout.md connect-to.md continue-at.md cookie-jar.md cookie.md create-dirs.md create-file-mode.md crlf.md crlfile.md curves.md data-ascii.md data-binary.md data-raw.md data-urlencode.md data.md delegation.md digest.md disable-eprt.md disable-epsv.md disable.md disallow-username-in-url.md dns-interface.md dns-ipv4-addr.md dns-ipv6-addr.md dns-servers.md doh-cert-status.md doh-insecure.md doh-url.md dump-ca-embed.md dump-header.md ech.md egd-file.md engine.md etag-compare.md etag-save.md expect100-timeout.md fail-early.md fail-with-body.md fail.md false-start.md follow.md form-escape.md form-string.md form.md ftp-account.md ftp-alternative-to-user.md ftp-create-dirs.md ftp-method.md ftp-pasv.md ftp-port.md ftp-pret.md ftp-skip-pasv-ip.md ftp-ssl-ccc-mode.md ftp-ssl-ccc.md ftp-ssl-control.md get.md globoff.md happy-eyeballs-timeout-ms.md haproxy-clientip.md haproxy-protocol.md head.md header.md help.md hostpubmd5.md hostpubsha256.md hsts.md http0.9.md http1.0.md http1.1.md http2-prior-knowledge.md http2.md http3-only.md http3.md ignore-content-length.md insecure.md interface.md ip-tos.md ipfs-gateway.md ipv4.md ipv6.md json.md junk-session-cookies.md keepalive-cnt.md keepalive-time.md key-type.md key.md knownhosts.md krb.md libcurl.md limit-rate.md list-only.md local-port.md location-trusted.md location.md login-options.md mail-auth.md mail-from.md mail-rcpt-allowfails.md mail-rcpt.md mainpage.idx manual.md max-filesize.md max-redirs.md max-time.md metalink.md mptcp.md negotiate.md netrc-file.md netrc-optional.md netrc.md next.md no-alpn.md no-buffer.md no-clobber.md no-keepalive.md no-npn.md no-progress-meter.md no-sessionid.md noproxy.md ntlm-wb.md ntlm.md oauth2-bearer.md out-null.md output-dir.md output.md parallel-immediate.md parallel-max-host.md parallel-max.md parallel.md pass.md path-as-is.md pinnedpubkey.md post301.md post302.md post303.md preproxy.md progress-bar.md proto-default.md proto-redir.md proto.md proxy-anyauth.md proxy-basic.md proxy-ca-native.md proxy-cacert.md proxy-capath.md proxy-cert-type.md proxy-cert.md proxy-ciphers.md proxy-crlfile.md proxy-digest.md proxy-header.md proxy-http2.md proxy-insecure.md proxy-key-type.md proxy-key.md proxy-negotiate.md proxy-ntlm.md proxy-pass.md proxy-pinnedpubkey.md proxy-service-name.md proxy-ssl-allow-beast.md proxy-ssl-auto-client-cert.md proxy-tls13-ciphers.md proxy-tlsauthtype.md proxy-tlspassword.md proxy-tlsuser.md proxy-tlsv1.md proxy-user.md proxy.md proxy1.0.md proxytunnel.md pubkey.md quote.md random-file.md range.md rate.md raw.md referer.md remote-header-name.md remote-name-all.md remote-name.md remote-time.md remove-on-error.md request-target.md request.md resolve.md retry-all-errors.md retry-connrefused.md retry-delay.md retry-max-time.md retry.md sasl-authzid.md sasl-ir.md service-name.md show-error.md show-headers.md sigalgs.md silent.md skip-existing.md socks4.md socks4a.md socks5-basic.md socks5-gssapi-nec.md socks5-gssapi-service.md socks5-gssapi.md socks5-hostname.md socks5.md speed-limit.md speed-time.md ssl-allow-beast.md ssl-auto-client-cert.md ssl-no-revoke.md ssl-reqd.md ssl-revoke-best-effort.md ssl-sessions.md ssl.md sslv2.md sslv3.md stderr.md styled-output.md suppress-connect-headers.md tcp-fastopen.md tcp-nodelay.md telnet-option.md tftp-blksize.md tftp-no-options.md time-cond.md tls-earlydata.md tls-max.md tls13-ciphers.md tlsauthtype.md tlspassword.md tlsuser.md tlsv1.0.md tlsv1.1.md tlsv1.2.md tlsv1.3.md tlsv1.md tr-encoding.md trace-ascii.md trace-config.md trace-ids.md trace-time.md trace.md unix-socket.md upload-file.md upload-flags.md url-query.md url.md use-ascii.md user-agent.md user.md variable.md verbose.md version.md vlan-priority.md write-out.md xattr.md
examples .checksrc .gitignore 10-at-a-time.c CMakeLists.txt Makefile.am Makefile.example Makefile.inc README.md adddocsref.pl address-scope.c altsvc.c anyauthput.c block_ip.c cacertinmem.c certinfo.c chkspeed.c connect-to.c cookie_interface.c crawler.c debug.c default-scheme.c ephiperfifo.c evhiperfifo.c externalsocket.c fileupload.c ftp-delete.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c getinfo.c getinmemory.c getredirect.c getreferrer.c ghiper.c headerapi.c hiperfifo.c hsts-preload.c htmltidy.c htmltitle.cpp http-options.c http-post.c http2-download.c http2-pushinmemory.c http2-serverpush.c http2-upload.c http3-present.c http3.c httpcustomheader.c httpput-postfields.c httpput.c https.c imap-append.c imap-authzid.c imap-copy.c imap-create.c imap-delete.c imap-examine.c imap-fetch.c imap-list.c imap-lsub.c imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c imap-tls.c interface.c ipv6.c keepalive.c localport.c log_failed_transfers.c maxconnects.c multi-app.c multi-debugcallback.c multi-double.c multi-event.c multi-formadd.c multi-legacy.c multi-post.c multi-single.c multi-uv.c netrc.c parseurl.c persistent.c pop3-authzid.c pop3-dele.c pop3-list.c pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c postinmemory.c postit2-formadd.c postit2.c progressfunc.c protofeats.c range.c resolve.c rtsp-options.c sendrecv.c sepheaders.c sessioninfo.c sftpget.c sftpuploadresume.c shared-connection-cache.c simple.c simplepost.c simplessl.c smooth-gtk-thread.c smtp-authzid.c smtp-expn.c smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c smtp-tls.c smtp-vrfy.c sslbackend.c synctime.c threaded.c unixsocket.c url2file.c urlapi.c usercertinmem.c version-check.pl websocket-cb.c websocket-updown.c websocket.c xmlstream.c
internals BUFQ.md BUFREF.md CHECKSRC.md CLIENT-READERS.md CLIENT-WRITERS.md CODE_STYLE.md CONNECTION-FILTERS.md CREDENTIALS.md CURLX.md DYNBUF.md HASH.md LLIST.md MID.md MQTT.md MULTI-EV.md NEW-PROTOCOL.md PEERS.md PORTING.md RATELIMITS.md README.md SCORECARD.md SPLAY.md STRPARSE.md THRDPOOL-AND-QUEUE.md TIME-KEEPING.md TLS-SESSIONS.md UINT_SETS.md WEBSOCKET.md
libcurl
opts CMakeLists.txt CURLINFO_ACTIVESOCKET.md CURLINFO_APPCONNECT_TIME.md CURLINFO_APPCONNECT_TIME_T.md CURLINFO_CAINFO.md CURLINFO_CAPATH.md CURLINFO_CERTINFO.md CURLINFO_CONDITION_UNMET.md CURLINFO_CONNECT_TIME.md CURLINFO_CONNECT_TIME_T.md CURLINFO_CONN_ID.md CURLINFO_CONTENT_LENGTH_DOWNLOAD.md CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.md CURLINFO_CONTENT_LENGTH_UPLOAD.md CURLINFO_CONTENT_LENGTH_UPLOAD_T.md CURLINFO_CONTENT_TYPE.md CURLINFO_COOKIELIST.md CURLINFO_EARLYDATA_SENT_T.md CURLINFO_EFFECTIVE_METHOD.md CURLINFO_EFFECTIVE_URL.md CURLINFO_FILETIME.md CURLINFO_FILETIME_T.md CURLINFO_FTP_ENTRY_PATH.md CURLINFO_HEADER_SIZE.md CURLINFO_HTTPAUTH_AVAIL.md CURLINFO_HTTPAUTH_USED.md CURLINFO_HTTP_CONNECTCODE.md CURLINFO_HTTP_VERSION.md CURLINFO_LASTSOCKET.md CURLINFO_LOCAL_IP.md CURLINFO_LOCAL_PORT.md CURLINFO_NAMELOOKUP_TIME.md CURLINFO_NAMELOOKUP_TIME_T.md CURLINFO_NUM_CONNECTS.md CURLINFO_OS_ERRNO.md CURLINFO_POSTTRANSFER_TIME_T.md CURLINFO_PRETRANSFER_TIME.md CURLINFO_PRETRANSFER_TIME_T.md CURLINFO_PRIMARY_IP.md CURLINFO_PRIMARY_PORT.md CURLINFO_PRIVATE.md CURLINFO_PROTOCOL.md CURLINFO_PROXYAUTH_AVAIL.md CURLINFO_PROXYAUTH_USED.md CURLINFO_PROXY_ERROR.md CURLINFO_PROXY_SSL_VERIFYRESULT.md CURLINFO_QUEUE_TIME_T.md CURLINFO_REDIRECT_COUNT.md CURLINFO_REDIRECT_TIME.md CURLINFO_REDIRECT_TIME_T.md CURLINFO_REDIRECT_URL.md CURLINFO_REFERER.md CURLINFO_REQUEST_SIZE.md CURLINFO_RESPONSE_CODE.md CURLINFO_RETRY_AFTER.md CURLINFO_RTSP_CLIENT_CSEQ.md CURLINFO_RTSP_CSEQ_RECV.md CURLINFO_RTSP_SERVER_CSEQ.md CURLINFO_RTSP_SESSION_ID.md CURLINFO_SCHEME.md CURLINFO_SIZE_DELIVERED.md CURLINFO_SIZE_DOWNLOAD.md CURLINFO_SIZE_DOWNLOAD_T.md CURLINFO_SIZE_UPLOAD.md CURLINFO_SIZE_UPLOAD_T.md CURLINFO_SPEED_DOWNLOAD.md CURLINFO_SPEED_DOWNLOAD_T.md CURLINFO_SPEED_UPLOAD.md CURLINFO_SPEED_UPLOAD_T.md CURLINFO_SSL_ENGINES.md CURLINFO_SSL_VERIFYRESULT.md CURLINFO_STARTTRANSFER_TIME.md CURLINFO_STARTTRANSFER_TIME_T.md CURLINFO_TLS_SESSION.md CURLINFO_TLS_SSL_PTR.md CURLINFO_TOTAL_TIME.md CURLINFO_TOTAL_TIME_T.md CURLINFO_USED_PROXY.md CURLINFO_XFER_ID.md CURLMINFO_XFERS_ADDED.md CURLMINFO_XFERS_CURRENT.md CURLMINFO_XFERS_DONE.md CURLMINFO_XFERS_PENDING.md CURLMINFO_XFERS_RUNNING.md CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.md CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.md CURLMOPT_MAXCONNECTS.md CURLMOPT_MAX_CONCURRENT_STREAMS.md CURLMOPT_MAX_HOST_CONNECTIONS.md CURLMOPT_MAX_PIPELINE_LENGTH.md CURLMOPT_MAX_TOTAL_CONNECTIONS.md CURLMOPT_NETWORK_CHANGED.md CURLMOPT_NOTIFYDATA.md CURLMOPT_NOTIFYFUNCTION.md CURLMOPT_PIPELINING.md CURLMOPT_PIPELINING_SERVER_BL.md CURLMOPT_PIPELINING_SITE_BL.md CURLMOPT_PUSHDATA.md CURLMOPT_PUSHFUNCTION.md CURLMOPT_QUICK_EXIT.md CURLMOPT_RESOLVE_THREADS_MAX.md CURLMOPT_SOCKETDATA.md CURLMOPT_SOCKETFUNCTION.md CURLMOPT_TIMERDATA.md CURLMOPT_TIMERFUNCTION.md CURLOPT_ABSTRACT_UNIX_SOCKET.md CURLOPT_ACCEPTTIMEOUT_MS.md CURLOPT_ACCEPT_ENCODING.md CURLOPT_ADDRESS_SCOPE.md CURLOPT_ALTSVC.md CURLOPT_ALTSVC_CTRL.md CURLOPT_APPEND.md CURLOPT_AUTOREFERER.md CURLOPT_AWS_SIGV4.md CURLOPT_BUFFERSIZE.md CURLOPT_CAINFO.md CURLOPT_CAINFO_BLOB.md CURLOPT_CAPATH.md CURLOPT_CA_CACHE_TIMEOUT.md CURLOPT_CERTINFO.md CURLOPT_CHUNK_BGN_FUNCTION.md CURLOPT_CHUNK_DATA.md CURLOPT_CHUNK_END_FUNCTION.md CURLOPT_CLOSESOCKETDATA.md CURLOPT_CLOSESOCKETFUNCTION.md CURLOPT_CONNECTTIMEOUT.md CURLOPT_CONNECTTIMEOUT_MS.md CURLOPT_CONNECT_ONLY.md CURLOPT_CONNECT_TO.md CURLOPT_CONV_FROM_NETWORK_FUNCTION.md CURLOPT_CONV_FROM_UTF8_FUNCTION.md CURLOPT_CONV_TO_NETWORK_FUNCTION.md CURLOPT_COOKIE.md CURLOPT_COOKIEFILE.md CURLOPT_COOKIEJAR.md CURLOPT_COOKIELIST.md CURLOPT_COOKIESESSION.md CURLOPT_COPYPOSTFIELDS.md CURLOPT_CRLF.md CURLOPT_CRLFILE.md CURLOPT_CURLU.md CURLOPT_CUSTOMREQUEST.md CURLOPT_DEBUGDATA.md CURLOPT_DEBUGFUNCTION.md CURLOPT_DEFAULT_PROTOCOL.md CURLOPT_DIRLISTONLY.md CURLOPT_DISALLOW_USERNAME_IN_URL.md CURLOPT_DNS_CACHE_TIMEOUT.md CURLOPT_DNS_INTERFACE.md CURLOPT_DNS_LOCAL_IP4.md CURLOPT_DNS_LOCAL_IP6.md CURLOPT_DNS_SERVERS.md CURLOPT_DNS_SHUFFLE_ADDRESSES.md CURLOPT_DNS_USE_GLOBAL_CACHE.md CURLOPT_DOH_SSL_VERIFYHOST.md CURLOPT_DOH_SSL_VERIFYPEER.md CURLOPT_DOH_SSL_VERIFYSTATUS.md CURLOPT_DOH_URL.md CURLOPT_ECH.md CURLOPT_EGDSOCKET.md CURLOPT_ERRORBUFFER.md CURLOPT_EXPECT_100_TIMEOUT_MS.md CURLOPT_FAILONERROR.md CURLOPT_FILETIME.md CURLOPT_FNMATCH_DATA.md CURLOPT_FNMATCH_FUNCTION.md CURLOPT_FOLLOWLOCATION.md CURLOPT_FORBID_REUSE.md CURLOPT_FRESH_CONNECT.md CURLOPT_FTPPORT.md CURLOPT_FTPSSLAUTH.md CURLOPT_FTP_ACCOUNT.md CURLOPT_FTP_ALTERNATIVE_TO_USER.md CURLOPT_FTP_CREATE_MISSING_DIRS.md CURLOPT_FTP_FILEMETHOD.md CURLOPT_FTP_SKIP_PASV_IP.md CURLOPT_FTP_SSL_CCC.md CURLOPT_FTP_USE_EPRT.md CURLOPT_FTP_USE_EPSV.md CURLOPT_FTP_USE_PRET.md CURLOPT_GSSAPI_DELEGATION.md CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.md CURLOPT_HAPROXYPROTOCOL.md CURLOPT_HAPROXY_CLIENT_IP.md CURLOPT_HEADER.md CURLOPT_HEADERDATA.md CURLOPT_HEADERFUNCTION.md CURLOPT_HEADEROPT.md CURLOPT_HSTS.md CURLOPT_HSTSREADDATA.md CURLOPT_HSTSREADFUNCTION.md CURLOPT_HSTSWRITEDATA.md CURLOPT_HSTSWRITEFUNCTION.md CURLOPT_HSTS_CTRL.md CURLOPT_HTTP09_ALLOWED.md CURLOPT_HTTP200ALIASES.md CURLOPT_HTTPAUTH.md CURLOPT_HTTPGET.md CURLOPT_HTTPHEADER.md CURLOPT_HTTPPOST.md CURLOPT_HTTPPROXYTUNNEL.md CURLOPT_HTTP_CONTENT_DECODING.md CURLOPT_HTTP_TRANSFER_DECODING.md CURLOPT_HTTP_VERSION.md CURLOPT_IGNORE_CONTENT_LENGTH.md CURLOPT_INFILESIZE.md CURLOPT_INFILESIZE_LARGE.md CURLOPT_INTERFACE.md CURLOPT_INTERLEAVEDATA.md CURLOPT_INTERLEAVEFUNCTION.md CURLOPT_IOCTLDATA.md CURLOPT_IOCTLFUNCTION.md CURLOPT_IPRESOLVE.md CURLOPT_ISSUERCERT.md CURLOPT_ISSUERCERT_BLOB.md CURLOPT_KEEP_SENDING_ON_ERROR.md CURLOPT_KEYPASSWD.md CURLOPT_KRBLEVEL.md CURLOPT_LOCALPORT.md CURLOPT_LOCALPORTRANGE.md CURLOPT_LOGIN_OPTIONS.md CURLOPT_LOW_SPEED_LIMIT.md CURLOPT_LOW_SPEED_TIME.md CURLOPT_MAIL_AUTH.md CURLOPT_MAIL_FROM.md CURLOPT_MAIL_RCPT.md CURLOPT_MAIL_RCPT_ALLOWFAILS.md CURLOPT_MAXAGE_CONN.md CURLOPT_MAXCONNECTS.md CURLOPT_MAXFILESIZE.md CURLOPT_MAXFILESIZE_LARGE.md CURLOPT_MAXLIFETIME_CONN.md CURLOPT_MAXREDIRS.md CURLOPT_MAX_RECV_SPEED_LARGE.md CURLOPT_MAX_SEND_SPEED_LARGE.md CURLOPT_MIMEPOST.md CURLOPT_MIME_OPTIONS.md CURLOPT_NETRC.md CURLOPT_NETRC_FILE.md CURLOPT_NEW_DIRECTORY_PERMS.md CURLOPT_NEW_FILE_PERMS.md CURLOPT_NOBODY.md CURLOPT_NOPROGRESS.md CURLOPT_NOPROXY.md CURLOPT_NOSIGNAL.md CURLOPT_OPENSOCKETDATA.md CURLOPT_OPENSOCKETFUNCTION.md CURLOPT_PASSWORD.md CURLOPT_PATH_AS_IS.md CURLOPT_PINNEDPUBLICKEY.md CURLOPT_PIPEWAIT.md CURLOPT_PORT.md CURLOPT_POST.md CURLOPT_POSTFIELDS.md CURLOPT_POSTFIELDSIZE.md CURLOPT_POSTFIELDSIZE_LARGE.md CURLOPT_POSTQUOTE.md CURLOPT_POSTREDIR.md CURLOPT_PREQUOTE.md CURLOPT_PREREQDATA.md CURLOPT_PREREQFUNCTION.md CURLOPT_PRE_PROXY.md CURLOPT_PRIVATE.md CURLOPT_PROGRESSDATA.md CURLOPT_PROGRESSFUNCTION.md CURLOPT_PROTOCOLS.md CURLOPT_PROTOCOLS_STR.md CURLOPT_PROXY.md CURLOPT_PROXYAUTH.md CURLOPT_PROXYHEADER.md CURLOPT_PROXYPASSWORD.md CURLOPT_PROXYPORT.md CURLOPT_PROXYTYPE.md CURLOPT_PROXYUSERNAME.md CURLOPT_PROXYUSERPWD.md CURLOPT_PROXY_CAINFO.md CURLOPT_PROXY_CAINFO_BLOB.md CURLOPT_PROXY_CAPATH.md CURLOPT_PROXY_CRLFILE.md CURLOPT_PROXY_ISSUERCERT.md CURLOPT_PROXY_ISSUERCERT_BLOB.md CURLOPT_PROXY_KEYPASSWD.md CURLOPT_PROXY_PINNEDPUBLICKEY.md CURLOPT_PROXY_SERVICE_NAME.md CURLOPT_PROXY_SSLCERT.md CURLOPT_PROXY_SSLCERTTYPE.md CURLOPT_PROXY_SSLCERT_BLOB.md CURLOPT_PROXY_SSLKEY.md CURLOPT_PROXY_SSLKEYTYPE.md CURLOPT_PROXY_SSLKEY_BLOB.md CURLOPT_PROXY_SSLVERSION.md CURLOPT_PROXY_SSL_CIPHER_LIST.md CURLOPT_PROXY_SSL_OPTIONS.md CURLOPT_PROXY_SSL_VERIFYHOST.md CURLOPT_PROXY_SSL_VERIFYPEER.md CURLOPT_PROXY_TLS13_CIPHERS.md CURLOPT_PROXY_TLSAUTH_PASSWORD.md CURLOPT_PROXY_TLSAUTH_TYPE.md CURLOPT_PROXY_TLSAUTH_USERNAME.md CURLOPT_PROXY_TRANSFER_MODE.md CURLOPT_PUT.md CURLOPT_QUICK_EXIT.md CURLOPT_QUOTE.md CURLOPT_RANDOM_FILE.md CURLOPT_RANGE.md CURLOPT_READDATA.md CURLOPT_READFUNCTION.md CURLOPT_REDIR_PROTOCOLS.md CURLOPT_REDIR_PROTOCOLS_STR.md CURLOPT_REFERER.md CURLOPT_REQUEST_TARGET.md CURLOPT_RESOLVE.md CURLOPT_RESOLVER_START_DATA.md CURLOPT_RESOLVER_START_FUNCTION.md CURLOPT_RESUME_FROM.md CURLOPT_RESUME_FROM_LARGE.md CURLOPT_RTSP_CLIENT_CSEQ.md CURLOPT_RTSP_REQUEST.md CURLOPT_RTSP_SERVER_CSEQ.md CURLOPT_RTSP_SESSION_ID.md CURLOPT_RTSP_STREAM_URI.md CURLOPT_RTSP_TRANSPORT.md CURLOPT_SASL_AUTHZID.md CURLOPT_SASL_IR.md CURLOPT_SEEKDATA.md CURLOPT_SEEKFUNCTION.md CURLOPT_SERVER_RESPONSE_TIMEOUT.md CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.md CURLOPT_SERVICE_NAME.md CURLOPT_SHARE.md CURLOPT_SOCKOPTDATA.md CURLOPT_SOCKOPTFUNCTION.md CURLOPT_SOCKS5_AUTH.md CURLOPT_SOCKS5_GSSAPI_NEC.md CURLOPT_SOCKS5_GSSAPI_SERVICE.md CURLOPT_SSH_AUTH_TYPES.md CURLOPT_SSH_COMPRESSION.md CURLOPT_SSH_HOSTKEYDATA.md CURLOPT_SSH_HOSTKEYFUNCTION.md CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.md CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256.md CURLOPT_SSH_KEYDATA.md CURLOPT_SSH_KEYFUNCTION.md CURLOPT_SSH_KNOWNHOSTS.md CURLOPT_SSH_PRIVATE_KEYFILE.md CURLOPT_SSH_PUBLIC_KEYFILE.md CURLOPT_SSLCERT.md CURLOPT_SSLCERTTYPE.md CURLOPT_SSLCERT_BLOB.md CURLOPT_SSLENGINE.md CURLOPT_SSLENGINE_DEFAULT.md CURLOPT_SSLKEY.md CURLOPT_SSLKEYTYPE.md CURLOPT_SSLKEY_BLOB.md CURLOPT_SSLVERSION.md CURLOPT_SSL_CIPHER_LIST.md CURLOPT_SSL_CTX_DATA.md CURLOPT_SSL_CTX_FUNCTION.md CURLOPT_SSL_EC_CURVES.md CURLOPT_SSL_ENABLE_ALPN.md CURLOPT_SSL_ENABLE_NPN.md CURLOPT_SSL_FALSESTART.md CURLOPT_SSL_OPTIONS.md CURLOPT_SSL_SESSIONID_CACHE.md CURLOPT_SSL_SIGNATURE_ALGORITHMS.md CURLOPT_SSL_VERIFYHOST.md CURLOPT_SSL_VERIFYPEER.md CURLOPT_SSL_VERIFYSTATUS.md CURLOPT_STDERR.md CURLOPT_STREAM_DEPENDS.md CURLOPT_STREAM_DEPENDS_E.md CURLOPT_STREAM_WEIGHT.md CURLOPT_SUPPRESS_CONNECT_HEADERS.md CURLOPT_TCP_FASTOPEN.md CURLOPT_TCP_KEEPALIVE.md CURLOPT_TCP_KEEPCNT.md CURLOPT_TCP_KEEPIDLE.md CURLOPT_TCP_KEEPINTVL.md CURLOPT_TCP_NODELAY.md CURLOPT_TELNETOPTIONS.md CURLOPT_TFTP_BLKSIZE.md CURLOPT_TFTP_NO_OPTIONS.md CURLOPT_TIMECONDITION.md CURLOPT_TIMEOUT.md CURLOPT_TIMEOUT_MS.md CURLOPT_TIMEVALUE.md CURLOPT_TIMEVALUE_LARGE.md CURLOPT_TLS13_CIPHERS.md CURLOPT_TLSAUTH_PASSWORD.md CURLOPT_TLSAUTH_TYPE.md CURLOPT_TLSAUTH_USERNAME.md CURLOPT_TRAILERDATA.md CURLOPT_TRAILERFUNCTION.md CURLOPT_TRANSFERTEXT.md CURLOPT_TRANSFER_ENCODING.md CURLOPT_UNIX_SOCKET_PATH.md CURLOPT_UNRESTRICTED_AUTH.md CURLOPT_UPKEEP_INTERVAL_MS.md CURLOPT_UPLOAD.md CURLOPT_UPLOAD_BUFFERSIZE.md CURLOPT_UPLOAD_FLAGS.md CURLOPT_URL.md CURLOPT_USERAGENT.md CURLOPT_USERNAME.md CURLOPT_USERPWD.md CURLOPT_USE_SSL.md CURLOPT_VERBOSE.md CURLOPT_WILDCARDMATCH.md CURLOPT_WRITEDATA.md CURLOPT_WRITEFUNCTION.md CURLOPT_WS_OPTIONS.md CURLOPT_XFERINFODATA.md CURLOPT_XFERINFOFUNCTION.md CURLOPT_XOAUTH2_BEARER.md CURLSHOPT_LOCKFUNC.md CURLSHOPT_SHARE.md CURLSHOPT_UNLOCKFUNC.md CURLSHOPT_UNSHARE.md CURLSHOPT_USERDATA.md Makefile.am Makefile.inc
.gitignore ABI.md CMakeLists.txt Makefile.am Makefile.inc curl_easy_cleanup.md curl_easy_duphandle.md curl_easy_escape.md curl_easy_getinfo.md curl_easy_header.md curl_easy_init.md curl_easy_nextheader.md curl_easy_option_by_id.md curl_easy_option_by_name.md curl_easy_option_next.md curl_easy_pause.md curl_easy_perform.md curl_easy_recv.md curl_easy_reset.md curl_easy_send.md curl_easy_setopt.md curl_easy_ssls_export.md curl_easy_ssls_import.md curl_easy_strerror.md curl_easy_unescape.md curl_easy_upkeep.md curl_escape.md curl_formadd.md curl_formfree.md curl_formget.md curl_free.md curl_getdate.md curl_getenv.md curl_global_cleanup.md curl_global_init.md curl_global_init_mem.md curl_global_sslset.md curl_global_trace.md curl_mime_addpart.md curl_mime_data.md curl_mime_data_cb.md curl_mime_encoder.md curl_mime_filedata.md curl_mime_filename.md curl_mime_free.md curl_mime_headers.md curl_mime_init.md curl_mime_name.md curl_mime_subparts.md curl_mime_type.md curl_mprintf.md curl_multi_add_handle.md curl_multi_assign.md curl_multi_cleanup.md curl_multi_fdset.md curl_multi_get_handles.md curl_multi_get_offt.md curl_multi_info_read.md curl_multi_init.md curl_multi_notify_disable.md curl_multi_notify_enable.md curl_multi_perform.md curl_multi_poll.md curl_multi_remove_handle.md curl_multi_setopt.md curl_multi_socket.md curl_multi_socket_action.md curl_multi_socket_all.md curl_multi_strerror.md curl_multi_timeout.md curl_multi_wait.md curl_multi_waitfds.md curl_multi_wakeup.md curl_pushheader_byname.md curl_pushheader_bynum.md curl_share_cleanup.md curl_share_init.md curl_share_setopt.md curl_share_strerror.md curl_slist_append.md curl_slist_free_all.md curl_strequal.md curl_strnequal.md curl_unescape.md curl_url.md curl_url_cleanup.md curl_url_dup.md curl_url_get.md curl_url_set.md curl_url_strerror.md curl_version.md curl_version_info.md curl_ws_meta.md curl_ws_recv.md curl_ws_send.md curl_ws_start_frame.md libcurl-easy.md libcurl-env-dbg.md libcurl-env.md libcurl-errors.md libcurl-multi.md libcurl-security.md libcurl-share.md libcurl-thread.md libcurl-tutorial.md libcurl-url.md libcurl-ws.md libcurl.m4 libcurl.md mksymbolsmanpage.pl symbols-in-versions symbols.pl
tests CI.md FILEFORMAT.md HTTP.md TEST-SUITE.md
.gitignore ALTSVC.md BINDINGS.md BUG-BOUNTY.md BUGS.md CIPHERS-TLS12.md CIPHERS.md CMakeLists.txt CODE_OF_CONDUCT.md CODE_REVIEW.md CONTRIBUTE.md CURL-DISABLE.md CURLDOWN.md DEPRECATE.md DISTROS.md EARLY-RELEASE.md ECH.md EXPERIMENTAL.md FAQ.md FEATURES.md GOVERNANCE.md HELP-US.md HISTORY.md HSTS.md HTTP-COOKIES.md HTTP3.md HTTPSRR.md INFRASTRUCTURE.md INSTALL-CMAKE.md INSTALL.md INTERNALS.md IPFS.md KNOWN_BUGS.md KNOWN_RISKS.md MAIL-ETIQUETTE.md MANUAL.md Makefile.am README.md RELEASE-PROCEDURE.md ROADMAP.md RUSTLS.md SECURITY-ADVISORY.md SPONSORS.md SSL-PROBLEMS.md SSLCERTS.md THANKS THANKS-filter TODO.md TheArtOfHttpScripting.md URL-SYNTAX.md VERIFY.md VERSIONS.md VULN-DISCLOSURE-POLICY.md curl-config.md mk-ca-bundle.md options-in-versions runtests.md testcurl.md wcurl.md
include
curl Makefile.am curl.h curlver.h easy.h header.h mprintf.h multi.h options.h stdcheaders.h system.h typecheck-gcc.h urlapi.h websockets.h
Makefile.am README.md
lib
curlx base64.c base64.h basename.c basename.h dynbuf.c dynbuf.h fopen.c fopen.h inet_ntop.c inet_ntop.h inet_pton.c inet_pton.h multibyte.c multibyte.h nonblock.c nonblock.h snprintf.c snprintf.h strcopy.c strcopy.h strdup.c strdup.h strerr.c strerr.h strparse.c strparse.h timediff.c timediff.h timeval.c timeval.h version_win32.c version_win32.h wait.c wait.h warnless.c warnless.h winapi.c winapi.h
vauth cleartext.c cram.c digest.c digest.h digest_sspi.c gsasl.c krb5_gssapi.c krb5_sspi.c ntlm.c ntlm_sspi.c oauth2.c spnego_gssapi.c spnego_sspi.c vauth.c vauth.h
vquic curl_ngtcp2.c curl_ngtcp2.h curl_quiche.c curl_quiche.h vquic-tls.c vquic-tls.h vquic.c vquic.h vquic_int.h
vssh libssh.c libssh2.c ssh.h vssh.c vssh.h
vtls apple.c apple.h cipher_suite.c cipher_suite.h gtls.c gtls.h hostcheck.c hostcheck.h keylog.c keylog.h mbedtls.c mbedtls.h openssl.c openssl.h rustls.c rustls.h schannel.c schannel.h schannel_int.h schannel_verify.c vtls.c vtls.h vtls_int.h vtls_scache.c vtls_scache.h vtls_spack.c vtls_spack.h wolfssl.c wolfssl.h x509asn1.c x509asn1.h
.gitignore CMakeLists.txt Makefile.am Makefile.inc Makefile.soname altsvc.c altsvc.h amigaos.c amigaos.h arpa_telnet.h asyn-ares.c asyn-base.c asyn-thrdd.c asyn.h bufq.c bufq.h bufref.c bufref.h cf-dns.c cf-dns.h cf-h1-proxy.c cf-h1-proxy.h cf-h2-proxy.c cf-h2-proxy.h cf-haproxy.c cf-haproxy.h cf-https-connect.c cf-https-connect.h cf-ip-happy.c cf-ip-happy.h cf-socket.c cf-socket.h cfilters.c cfilters.h config-mac.h config-os400.h config-riscos.h config-win32.h conncache.c conncache.h connect.c connect.h content_encoding.c content_encoding.h cookie.c cookie.h creds.c creds.h cshutdn.c cshutdn.h curl_addrinfo.c curl_addrinfo.h curl_config-cmake.h.in curl_ctype.h curl_endian.c curl_endian.h curl_fnmatch.c curl_fnmatch.h curl_fopen.c curl_fopen.h curl_get_line.c curl_get_line.h curl_gethostname.c curl_gethostname.h curl_gssapi.c curl_gssapi.h curl_hmac.h curl_ldap.h curl_md4.h curl_md5.h curl_memrchr.c curl_memrchr.h curl_ntlm_core.c curl_ntlm_core.h curl_printf.h curl_range.c curl_range.h curl_sasl.c curl_sasl.h curl_setup.h curl_sha256.h curl_sha512_256.c curl_sha512_256.h curl_share.c curl_share.h curl_sspi.c curl_sspi.h curl_threads.c curl_threads.h curl_trc.c curl_trc.h cw-out.c cw-out.h cw-pause.c cw-pause.h dict.c dict.h dllmain.c dnscache.c dnscache.h doh.c doh.h dynhds.c dynhds.h easy.c easy_lock.h easygetopt.c easyif.h easyoptions.c easyoptions.h escape.c escape.h fake_addrinfo.c fake_addrinfo.h file.c file.h fileinfo.c fileinfo.h formdata.c formdata.h ftp-int.h ftp.c ftp.h ftplistparser.c ftplistparser.h functypes.h getenv.c getinfo.c getinfo.h gopher.c gopher.h hash.c hash.h headers.c headers.h hmac.c hostip.c hostip.h hostip4.c hostip6.c hsts.c hsts.h http.c http.h http1.c http1.h http2.c http2.h http_aws_sigv4.c http_aws_sigv4.h http_chunks.c http_chunks.h http_digest.c http_digest.h http_negotiate.c http_negotiate.h http_ntlm.c http_ntlm.h http_proxy.c http_proxy.h httpsrr.c httpsrr.h idn.c idn.h if2ip.c if2ip.h imap.c imap.h ldap.c libcurl.def libcurl.rc libcurl.vers.in llist.c llist.h macos.c macos.h md4.c md5.c memdebug.c mime.c mime.h mprintf.c mqtt.c mqtt.h multi.c multi_ev.c multi_ev.h multi_ntfy.c multi_ntfy.h multihandle.h multiif.h netrc.c netrc.h noproxy.c noproxy.h openldap.c optiontable.pl parsedate.c parsedate.h peer.c peer.h pingpong.c pingpong.h pop3.c pop3.h progress.c progress.h protocol.c protocol.h psl.c psl.h rand.c rand.h ratelimit.c ratelimit.h request.c request.h rtsp.c rtsp.h select.c select.h sendf.c sendf.h setopt.c setopt.h setup-os400.h setup-vms.h setup-win32.h sha256.c sigpipe.h slist.c slist.h smb.c smb.h smtp.c smtp.h sockaddr.h socketpair.c socketpair.h socks.c socks.h socks_gssapi.c socks_sspi.c splay.c splay.h strcase.c strcase.h strequal.c strerror.c strerror.h system_win32.c system_win32.h telnet.c telnet.h tftp.c tftp.h thrdpool.c thrdpool.h thrdqueue.c thrdqueue.h transfer.c transfer.h uint-bset.c uint-bset.h uint-hash.c uint-hash.h uint-spbset.c uint-spbset.h uint-table.c uint-table.h url.c url.h urlapi-int.h urlapi.c urldata.h version.c ws.c ws.h
m4 .gitignore curl-amissl.m4 curl-apple-sectrust.m4 curl-compilers.m4 curl-confopts.m4 curl-functions.m4 curl-gnutls.m4 curl-mbedtls.m4 curl-openssl.m4 curl-override.m4 curl-reentrant.m4 curl-rustls.m4 curl-schannel.m4 curl-sysconfig.m4 curl-wolfssl.m4 xc-am-iface.m4 xc-cc-check.m4 xc-lt-iface.m4 xc-val-flgs.m4 zz40-xc-ovr.m4 zz50-xc-ovr.m4
projects
OS400
rpg-examples HEADERAPI HTTPPOST INMEMORY SIMPLE1 SIMPLE2 SMTPSRCMBR
.checksrc README.OS400 ccsidcurl.c ccsidcurl.h config400.default curl.cmd curl.inc.in curlcl.c curlmain.c initscript.sh make-docs.sh make-include.sh make-lib.sh make-src.sh make-tests.sh makefile.sh os400sys.c os400sys.h
Windows
tmpl .gitattributes README.txt curl-all.sln curl.sln curl.vcxproj curl.vcxproj.filters libcurl.sln libcurl.vcxproj libcurl.vcxproj.filters
.gitignore README.md generate.bat
vms Makefile.am backup_gnv_curl_src.com build_curl-config_script.com build_gnv_curl.com build_gnv_curl_pcsi_desc.com build_gnv_curl_pcsi_text.com build_gnv_curl_release_notes.com build_libcurl_pc.com build_vms.com clean_gnv_curl.com compare_curl_source.com config_h.com curl_crtl_init.c curl_gnv_build_steps.txt curl_release_note_start.txt curl_startup.com curlmsg.h curlmsg.msg curlmsg.sdl curlmsg_vms.h generate_config_vms_h_curl.com generate_vax_transfer.com gnv_conftest.c_first gnv_curl_configure.sh gnv_libcurl_symbols.opt gnv_link_curl.com macro32_exactcase.patch make_gnv_curl_install.sh make_pcsi_curl_kit_name.com pcsi_gnv_curl_file_list.txt pcsi_product_gnv_curl.com readme report_openssl_version.c setup_gnv_curl_build.com stage_curl_install.com vms_eco_level.h
Makefile.am README.md
scripts .checksrc CMakeLists.txt Makefile.am badwords badwords-all badwords.txt cd2cd cd2nroff cdall checksrc-all.pl checksrc.pl cmakelint.sh completion.pl contributors.sh contrithanks.sh coverage.sh delta dmaketgz extract-unit-protos firefox-db2pem.sh installcheck.sh maketgz managen mdlinkcheck mk-ca-bundle.pl mk-unity.pl nroff2cd perlcheck.sh pythonlint.sh randdisable release-notes.pl release-tools.sh schemetable.c singleuse.pl spacecheck.pl top-complexity top-length verify-release wcurl
src
toolx tool_time.c tool_time.h
.checksrc .gitignore CMakeLists.txt Makefile.am Makefile.inc config2setopts.c config2setopts.h curl.rc curlinfo.c mk-file-embed.pl mkhelp.pl slist_wc.c slist_wc.h terminal.c terminal.h tool_cb_dbg.c tool_cb_dbg.h tool_cb_hdr.c tool_cb_hdr.h tool_cb_prg.c tool_cb_prg.h tool_cb_rea.c tool_cb_rea.h tool_cb_see.c tool_cb_see.h tool_cb_soc.c tool_cb_soc.h tool_cb_wrt.c tool_cb_wrt.h tool_cfgable.c tool_cfgable.h tool_dirhie.c tool_dirhie.h tool_doswin.c tool_doswin.h tool_easysrc.c tool_easysrc.h tool_filetime.c tool_filetime.h tool_findfile.c tool_findfile.h tool_formparse.c tool_formparse.h tool_getparam.c tool_getparam.h tool_getpass.c tool_getpass.h tool_help.c tool_help.h tool_helpers.c tool_helpers.h tool_hugehelp.h tool_ipfs.c tool_ipfs.h tool_libinfo.c tool_libinfo.h tool_listhelp.c tool_main.c tool_main.h tool_msgs.c tool_msgs.h tool_operate.c tool_operate.h tool_operhlp.c tool_operhlp.h tool_paramhlp.c tool_paramhlp.h tool_parsecfg.c tool_parsecfg.h tool_progress.c tool_progress.h tool_sdecls.h tool_setopt.c tool_setopt.h tool_setup.h tool_ssls.c tool_ssls.h tool_stderr.c tool_stderr.h tool_urlglob.c tool_urlglob.h tool_util.c tool_util.h tool_version.h tool_vms.c tool_vms.h tool_writeout.c tool_writeout.h tool_writeout_json.c tool_writeout_json.h tool_xattr.c tool_xattr.h var.c var.h
tests
certs .gitignore CMakeLists.txt Makefile.am Makefile.inc genserv.pl srp-verifier-conf srp-verifier-db test-ca.cnf test-ca.prm test-client-cert.prm test-client-eku-only.prm test-localhost-san-first.prm test-localhost-san-last.prm test-localhost.nn.prm test-localhost.prm test-localhost0h.prm
cmake CMakeLists.txt test.c test.cpp test.sh
data .gitignore DISABLED Makefile.am data-xml1 data1400.c data1401.c data1402.c data1403.c data1404.c data1405.c data1406.c data1407.c data1420.c data1461.txt data1463.txt data1465.c data1481.c data1705-1.md data1705-2.md data1705-3.md data1705-4.md data1705-stdout.1 data1706-1.md data1706-2.md data1706-3.md data1706-4.md data1706-stdout.txt data320.html test1 test10 test100 test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 test1008 test1009 test101 test1010 test1011 test1012 test1013 test1014 test1015 test1016 test1017 test1018 test1019 test102 test1020 test1021 test1022 test1023 test1024 test1025 test1026 test1027 test1028 test1029 test103 test1030 test1031 test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 test104 test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 test1048 test1049 test105 test1050 test1051 test1052 test1053 test1054 test1055 test1056 test1057 test1058 test1059 test106 test1060 test1061 test1062 test1063 test1064 test1065 test1066 test1067 test1068 test1069 test107 test1070 test1071 test1072 test1073 test1074 test1075 test1076 test1077 test1078 test1079 test108 test1080 test1081 test1082 test1083 test1084 test1085 test1086 test1087 test1088 test1089 test109 test1090 test1091 test1092 test1093 test1094 test1095 test1096 test1097 test1098 test1099 test11 test110 test1100 test1101 test1102 test1103 test1104 test1105 test1106 test1107 test1108 test1109 test111 test1110 test1111 test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 test112 test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 test1128 test1129 test113 test1130 test1131 test1132 test1133 test1134 test1135 test1136 test1137 test1138 test1139 test114 test1140 test1141 test1142 test1143 test1144 test1145 test1146 test1147 test1148 test1149 test115 test1150 test1151 test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 test116 test1160 test1161 test1162 test1163 test1164 test1165 test1166 test1167 test1168 test1169 test117 test1170 test1171 test1172 test1173 test1174 test1175 test1176 test1177 test1178 test1179 test118 test1180 test1181 test1182 test1183 test1184 test1185 test1186 test1187 test1188 test1189 test119 test1190 test1191 test1192 test1193 test1194 test1195 test1196 test1197 test1198 test1199 test12 test120 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 test1208 test1209 test121 test1210 test1211 test1212 test1213 test1214 test1215 test1216 test1217 test1218 test1219 test122 test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 test1228 test1229 test123 test1230 test1231 test1232 test1233 test1234 test1235 test1236 test1237 test1238 test1239 test124 test1240 test1241 test1242 test1243 test1244 test1245 test1246 test1247 test1248 test1249 test125 test1250 test1251 test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 test126 test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 test1268 test1269 test127 test1270 test1271 test1272 test1273 test1274 test1275 test1276 test1277 test1278 test1279 test128 test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 test1288 test1289 test129 test1290 test1291 test1292 test1293 test1294 test1295 test1296 test1297 test1298 test1299 test13 test130 test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 test1308 test1309 test131 test1310 test1311 test1312 test1313 test1314 test1315 test1316 test1317 test1318 test1319 test132 test1320 test1321 test1322 test1323 test1324 test1325 test1326 test1327 test1328 test1329 test133 test1330 test1331 test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 test134 test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 test1348 test1349 test135 test1350 test1351 test1352 test1353 test1354 test1355 test1356 test1357 test1358 test1359 test136 test1360 test1361 test1362 test1363 test1364 test1365 test1366 test1367 test1368 test1369 test137 test1370 test1371 test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 test138 test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 test1388 test1389 test139 test1390 test1391 test1392 test1393 test1394 test1395 test1396 test1397 test1398 test1399 test14 test140 test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 test1408 test1409 test141 test1410 test1411 test1412 test1413 test1414 test1415 test1416 test1417 test1418 test1419 test142 test1420 test1421 test1422 test1423 test1424 test1425 test1426 test1427 test1428 test1429 test143 test1430 test1431 test1432 test1433 test1434 test1435 test1436 test1437 test1438 test1439 test144 test1440 test1441 test1442 test1443 test1444 test1445 test1446 test1447 test1448 test1449 test145 test1450 test1451 test1452 test1453 test1454 test1455 test1456 test1457 test1458 test1459 test146 test1460 test1461 test1462 test1463 test1464 test1465 test1466 test1467 test1468 test1469 test147 test1470 test1471 test1472 test1473 test1474 test1475 test1476 test1477 test1478 test1479 test148 test1480 test1481 test1482 test1483 test1484 test1485 test1486 test1487 test1488 test1489 test149 test1490 test1491 test1492 test1493 test1494 test1495 test1496 test1497 test1498 test1499 test15 test150 test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 test1508 test1509 test151 test1510 test1511 test1512 test1513 test1514 test1515 test1516 test1517 test1518 test1519 test152 test1520 test1521 test1522 test1523 test1524 test1525 test1526 test1527 test1528 test1529 test153 test1530 test1531 test1532 test1533 test1534 test1535 test1536 test1537 test1538 test1539 test154 test1540 test1541 test1542 test1543 test1544 test1545 test1546 test1547 test1548 test1549 test155 test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 test1558 test1559 test156 test1560 test1561 test1562 test1563 test1564 test1565 test1566 test1567 test1568 test1569 test157 test1570 test1571 test1572 test1573 test1574 test1575 test1576 test1577 test1578 test1579 test158 test1580 test1581 test1582 test1583 test1584 test1585 test1586 test1587 test1588 test1589 test159 test1590 test1591 test1592 test1593 test1594 test1595 test1596 test1597 test1598 test1599 test16 test160 test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 test1608 test1609 test161 test1610 test1611 test1612 test1613 test1614 test1615 test1616 test1617 test1618 test1619 test162 test1620 test1621 test1622 test1623 test1624 test1625 test1626 test1627 test1628 test1629 test163 test1630 test1631 test1632 test1633 test1634 test1635 test1636 test1637 test1638 test1639 test164 test1640 test1641 test1642 test1643 test1644 test1645 test165 test1650 test1651 test1652 test1653 test1654 test1655 test1656 test1657 test1658 test1659 test166 test1660 test1661 test1662 test1663 test1664 test1665 test1666 test1667 test1668 test1669 test167 test1670 test1671 test1672 test1673 test1674 test1675 test1676 test168 test1680 test1681 test1682 test1683 test1684 test1685 test169 test17 test170 test1700 test1701 test1702 test1703 test1704 test1705 test1706 test1707 test1708 test1709 test171 test1710 test1711 test1712 test1713 test1714 test1715 test172 test1720 test1721 test173 test174 test175 test176 test177 test178 test179 test18 test180 test1800 test1801 test1802 test181 test182 test183 test184 test1847 test1848 test1849 test185 test1850 test1851 test186 test187 test188 test189 test19 test190 test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 test1908 test1909 test191 test1910 test1911 test1912 test1913 test1914 test1915 test1916 test1917 test1918 test1919 test192 test1920 test1921 test193 test1933 test1934 test1935 test1936 test1937 test1938 test1939 test194 test1940 test1941 test1942 test1943 test1944 test1945 test1946 test1947 test1948 test195 test1955 test1956 test1957 test1958 test1959 test196 test1960 test1964 test1965 test1966 test197 test1970 test1971 test1972 test1973 test1974 test1975 test1976 test1977 test1978 test1979 test198 test1980 test1981 test1982 test1983 test1984 test199 test2 test20 test200 test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 test2008 test2009 test201 test2010 test2011 test2012 test2013 test2014 test202 test2023 test2024 test2025 test2026 test2027 test2028 test2029 test203 test2030 test2031 test2032 test2033 test2034 test2035 test2037 test2038 test2039 test204 test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 test2048 test2049 test205 test2050 test2051 test2052 test2053 test2054 test2055 test2056 test2057 test2058 test2059 test206 test2060 test2061 test2062 test2063 test2064 test2065 test2066 test2067 test2068 test2069 test207 test2070 test2071 test2072 test2073 test2074 test2075 test2076 test2077 test2078 test2079 test208 test2080 test2081 test2082 test2083 test2084 test2085 test2086 test2087 test2088 test2089 test209 test2090 test2091 test2092 test21 test210 test2100 test2101 test2102 test2103 test2104 test211 test212 test213 test214 test215 test216 test217 test218 test219 test22 test220 test2200 test2201 test2202 test2203 test2204 test2205 test2206 test2207 test221 test222 test223 test224 test225 test226 test227 test228 test229 test23 test230 test2300 test2301 test2302 test2303 test2304 test2306 test2307 test2308 test2309 test231 test232 test233 test234 test235 test236 test237 test238 test239 test24 test240 test2400 test2401 test2402 test2403 test2404 test2405 test2406 test2407 test2408 test2409 test241 test2410 test2411 test242 test243 test244 test245 test246 test247 test248 test249 test25 test250 test2500 test2501 test2502 test2503 test2504 test2505 test2506 test251 test252 test253 test254 test255 test256 test257 test258 test259 test26 test260 test2600 test2601 test2602 test2603 test2604 test2605 test261 test262 test263 test264 test265 test266 test267 test268 test269 test27 test270 test2700 test2701 test2702 test2703 test2704 test2705 test2706 test2707 test2708 test2709 test271 test2710 test2711 test2712 test2713 test2714 test2715 test2716 test2717 test2718 test2719 test272 test2720 test2721 test2722 test2723 test273 test274 test275 test276 test277 test278 test279 test28 test280 test281 test282 test283 test284 test285 test286 test287 test288 test289 test29 test290 test291 test292 test293 test294 test295 test296 test297 test298 test299 test3 test30 test300 test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 test3008 test3009 test301 test3010 test3011 test3012 test3013 test3014 test3015 test3016 test3017 test3018 test3019 test302 test3020 test3021 test3022 test3023 test3024 test3025 test3026 test3027 test3028 test3029 test303 test3030 test3031 test3032 test3033 test3034 test3035 test3036 test304 test305 test306 test307 test308 test309 test31 test310 test3100 test3101 test3102 test3103 test3104 test3105 test3106 test311 test312 test313 test314 test315 test316 test317 test318 test319 test32 test320 test3200 test3201 test3202 test3203 test3204 test3205 test3206 test3207 test3208 test3209 test321 test3210 test3211 test3212 test3213 test3214 test3215 test3216 test3217 test3218 test3219 test322 test3220 test323 test324 test325 test326 test327 test328 test329 test33 test330 test3300 test3301 test3302 test331 test332 test333 test334 test335 test336 test337 test338 test339 test34 test340 test341 test342 test343 test344 test345 test346 test347 test348 test349 test35 test350 test351 test352 test353 test354 test355 test356 test357 test358 test359 test36 test360 test361 test362 test363 test364 test365 test366 test367 test368 test369 test37 test370 test371 test372 test373 test374 test375 test376 test378 test379 test38 test380 test381 test383 test384 test385 test386 test387 test388 test389 test39 test390 test391 test392 test393 test394 test395 test396 test397 test398 test399 test4 test40 test400 test4000 test4001 test401 test402 test403 test404 test405 test406 test407 test408 test409 test41 test410 test411 test412 test413 test414 test415 test416 test417 test418 test419 test42 test420 test421 test422 test423 test424 test425 test426 test427 test428 test429 test43 test430 test431 test432 test433 test434 test435 test436 test437 test438 test439 test44 test440 test441 test442 test443 test444 test445 test446 test447 test448 test449 test45 test450 test451 test452 test453 test454 test455 test456 test457 test458 test459 test46 test460 test461 test462 test463 test467 test468 test469 test47 test470 test471 test472 test473 test474 test475 test476 test477 test478 test479 test48 test480 test481 test482 test483 test484 test485 test486 test487 test488 test489 test49 test490 test491 test492 test493 test494 test495 test496 test497 test498 test499 test5 test50 test500 test501 test502 test503 test504 test505 test506 test507 test508 test509 test51 test510 test511 test512 test513 test514 test515 test516 test517 test518 test519 test52 test520 test521 test522 test523 test524 test525 test526 test527 test528 test529 test53 test530 test531 test532 test533 test534 test535 test536 test537 test538 test539 test54 test540 test541 test542 test543 test544 test545 test546 test547 test548 test549 test55 test550 test551 test552 test553 test554 test555 test556 test557 test558 test559 test56 test560 test561 test562 test563 test564 test565 test566 test567 test568 test569 test57 test570 test571 test572 test573 test574 test575 test576 test577 test578 test579 test58 test580 test581 test582 test583 test584 test585 test586 test587 test588 test589 test59 test590 test591 test592 test593 test594 test595 test596 test597 test598 test599 test6 test60 test600 test601 test602 test603 test604 test605 test606 test607 test608 test609 test61 test610 test611 test612 test613 test614 test615 test616 test617 test618 test619 test62 test620 test621 test622 test623 test624 test625 test626 test627 test628 test629 test63 test630 test631 test632 test633 test634 test635 test636 test637 test638 test639 test64 test640 test641 test642 test643 test644 test645 test646 test647 test648 test649 test65 test650 test651 test652 test653 test654 test655 test656 test658 test659 test66 test660 test661 test662 test663 test664 test665 test666 test667 test668 test669 test67 test670 test671 test672 test673 test674 test675 test676 test677 test678 test679 test68 test680 test681 test682 test683 test684 test685 test686 test687 test688 test689 test69 test690 test691 test692 test693 test694 test695 test696 test697 test698 test699 test7 test70 test700 test701 test702 test703 test704 test705 test706 test707 test708 test709 test71 test710 test711 test712 test713 test714 test715 test716 test717 test718 test719 test72 test720 test721 test722 test723 test724 test725 test726 test727 test728 test729 test73 test730 test731 test732 test733 test734 test735 test736 test737 test738 test739 test74 test740 test741 test742 test743 test744 test745 test746 test747 test748 test749 test75 test750 test751 test752 test753 test754 test755 test756 test757 test758 test759 test76 test760 test761 test762 test763 test764 test765 test766 test767 test768 test769 test77 test770 test771 test772 test773 test774 test775 test776 test777 test778 test779 test78 test780 test781 test782 test783 test784 test785 test786 test787 test788 test789 test79 test790 test791 test792 test793 test794 test795 test796 test797 test798 test799 test8 test80 test800 test801 test802 test803 test804 test805 test806 test807 test808 test809 test81 test810 test811 test812 test813 test814 test815 test816 test817 test818 test819 test82 test820 test821 test822 test823 test824 test825 test826 test827 test828 test829 test83 test830 test831 test832 test833 test834 test835 test836 test837 test838 test839 test84 test840 test841 test842 test843 test844 test845 test846 test847 test848 test849 test85 test850 test851 test852 test853 test854 test855 test856 test857 test858 test859 test86 test860 test861 test862 test863 test864 test865 test866 test867 test868 test869 test87 test870 test871 test872 test873 test874 test875 test876 test877 test878 test879 test88 test880 test881 test882 test883 test884 test885 test886 test887 test888 test889 test89 test890 test891 test892 test893 test894 test895 test896 test897 test898 test899 test9 test90 test900 test901 test902 test903 test904 test905 test906 test907 test908 test909 test91 test910 test911 test912 test913 test914 test915 test916 test917 test918 test919 test92 test920 test921 test922 test923 test924 test925 test926 test927 test928 test929 test93 test930 test931 test932 test933 test934 test935 test936 test937 test938 test939 test94 test940 test941 test942 test943 test944 test945 test946 test947 test948 test949 test95 test950 test951 test952 test953 test954 test955 test956 test957 test958 test959 test96 test960 test961 test962 test963 test964 test965 test966 test967 test968 test969 test97 test970 test971 test972 test973 test974 test975 test976 test977 test978 test979 test98 test980 test981 test982 test983 test984 test985 test986 test987 test988 test989 test99 test990 test991 test992 test993 test994 test995 test996 test997 test998 test999
http
testenv
mod_curltest .gitignore mod_curltest.c
__init__.py caddy.py certs.py client.py curl.py dante.py dnsd.py env.py httpd.py nghttpx.py ports.py sshd.py vsftpd.py ws_echo_server.py
.gitignore CMakeLists.txt Makefile.am config.ini.in conftest.py requirements.txt scorecard.py test_01_basic.py test_02_download.py test_03_goaway.py test_04_stuttered.py test_05_errors.py test_06_eyeballs.py test_07_upload.py test_08_caddy.py test_09_push.py test_10_proxy.py test_11_unix.py test_12_reuse.py test_13_proxy_auth.py test_14_auth.py test_15_tracing.py test_16_info.py test_17_ssl_use.py test_18_methods.py test_19_shutdown.py test_20_websockets.py test_21_resolve.py test_22_httpsrr.py test_30_vsftpd.py test_31_vsftpds.py test_32_ftps_vsftpd.py test_40_socks.py test_50_scp.py test_51_sftp.py
libtest .gitignore CMakeLists.txt Makefile.am Makefile.inc cli_ftp_upload.c cli_h2_pausing.c cli_h2_serverpush.c cli_h2_upgrade_extreme.c cli_hx_download.c cli_hx_upload.c cli_tls_session_reuse.c cli_upload_pausing.c cli_ws_data.c cli_ws_pingpong.c first.c first.h lib1156.c lib1301.c lib1308.c lib1485.c lib1500.c lib1501.c lib1502.c lib1506.c lib1507.c lib1508.c lib1509.c lib1510.c lib1511.c lib1512.c lib1513.c lib1514.c lib1515.c lib1517.c lib1518.c lib1520.c lib1522.c lib1523.c lib1525.c lib1526.c lib1527.c lib1528.c lib1529.c lib1530.c lib1531.c lib1532.c lib1533.c lib1534.c lib1535.c lib1536.c lib1537.c lib1538.c lib1540.c lib1541.c lib1542.c lib1545.c lib1549.c lib1550.c lib1551.c lib1552.c lib1553.c lib1554.c lib1555.c lib1556.c lib1557.c lib1558.c lib1559.c lib1560.c lib1564.c lib1565.c lib1567.c lib1568.c lib1569.c lib1571.c lib1576.c lib1582.c lib1587.c lib1588.c lib1589.c lib1591.c lib1592.c lib1593.c lib1594.c lib1597.c lib1598.c lib1599.c lib1662.c lib1900.c lib1901.c lib1902.c lib1903.c lib1905.c lib1906.c lib1907.c lib1908.c lib1910.c lib1911.c lib1912.c lib1913.c lib1915.c lib1916.c lib1918.c lib1919.c lib1920.c lib1921.c lib1933.c lib1934.c lib1935.c lib1936.c lib1937.c lib1938.c lib1939.c lib1940.c lib1945.c lib1947.c lib1948.c lib1955.c lib1956.c lib1957.c lib1958.c lib1959.c lib1960.c lib1964.c lib1965.c lib1970.c lib1971.c lib1972.c lib1973.c lib1974.c lib1975.c lib1977.c lib1978.c lib2023.c lib2032.c lib2082.c lib2301.c lib2302.c lib2304.c lib2306.c lib2308.c lib2309.c lib2402.c lib2404.c lib2405.c lib2502.c lib2504.c lib2505.c lib2506.c lib2700.c lib3010.c lib3025.c lib3026.c lib3027.c lib3033.c lib3034.c lib3100.c lib3101.c lib3102.c lib3103.c lib3104.c lib3105.c lib3207.c lib3208.c lib500.c lib501.c lib502.c lib503.c lib504.c lib505.c lib506.c lib507.c lib508.c lib509.c lib510.c lib511.c lib512.c lib513.c lib514.c lib515.c lib516.c lib517.c lib518.c lib519.c lib520.c lib521.c lib523.c lib524.c lib525.c lib526.c lib530.c lib533.c lib536.c lib537.c lib539.c lib540.c lib541.c lib542.c lib543.c lib544.c lib547.c lib549.c lib552.c lib553.c lib554.c lib555.c lib556.c lib557.c lib558.c lib559.c lib560.c lib562.c lib564.c lib566.c lib567.c lib568.c lib569.c lib570.c lib571.c lib572.c lib573.c lib574.c lib575.c lib576.c lib578.c lib579.c lib582.c lib583.c lib586.c lib589.c lib590.c lib591.c lib597.c lib598.c lib599.c lib643.c lib650.c lib651.c lib652.c lib653.c lib654.c lib655.c lib658.c lib659.c lib661.c lib666.c lib667.c lib668.c lib670.c lib674.c lib676.c lib677.c lib678.c lib694.c lib695.c lib751.c lib753.c lib757.c lib758.c lib766.c memptr.c mk-lib1521.pl test1013.pl test1022.pl test307.pl test610.pl test613.pl testtrace.c testtrace.h testutil.c testutil.h unitcheck.h
server .checksrc .gitignore CMakeLists.txt Makefile.am Makefile.inc dnsd.c first.c first.h getpart.c mqttd.c resolve.c rtspd.c sockfilt.c socksd.c sws.c tftpd.c util.c
tunit .gitignore CMakeLists.txt Makefile.am Makefile.inc README.md tool1394.c tool1604.c tool1621.c tool1622.c tool1623.c tool1720.c
unit .gitignore CMakeLists.txt Makefile.am Makefile.inc README.md unit1300.c unit1302.c unit1303.c unit1304.c unit1305.c unit1307.c unit1309.c unit1323.c unit1330.c unit1395.c unit1396.c unit1397.c unit1398.c unit1399.c unit1600.c unit1601.c unit1602.c unit1603.c unit1605.c unit1606.c unit1607.c unit1608.c unit1609.c unit1610.c unit1611.c unit1612.c unit1614.c unit1615.c unit1616.c unit1620.c unit1625.c unit1626.c unit1627.c unit1636.c unit1650.c unit1651.c unit1652.c unit1653.c unit1654.c unit1655.c unit1656.c unit1657.c unit1658.c unit1660.c unit1661.c unit1663.c unit1664.c unit1666.c unit1667.c unit1668.c unit1669.c unit1674.c unit1675.c unit1676.c unit1979.c unit1980.c unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c unit2605.c unit3200.c unit3205.c unit3211.c unit3212.c unit3213.c unit3214.c unit3216.c unit3219.c unit3300.c unit3301.c unit3302.c
.gitignore CMakeLists.txt Makefile.am allversions.pm appveyor.pm azure.pm config.in configurehelp.pm.in devtest.pl dictserver.py directories.pm ech_combos.py ech_tests.sh ftpserver.pl getpart.pm globalconfig.pm http-server.pl http2-server.pl http3-server.pl memanalyze.pl memanalyzer.pm negtelnetserver.py nghttpx.conf pathhelp.pm processhelp.pm requirements.txt rtspserver.pl runner.pm runtests.pl secureserver.pl serverhelp.pm servers.pm smbserver.py sshhelp.pm sshserver.pl test1119.pl test1135.pl test1139.pl test1140.pl test1165.pl test1167.pl test1173.pl test1175.pl test1177.pl test1222.pl test1275.pl test1276.pl test1477.pl test1486.pl test1488.pl test1544.pl test1707.pl test745.pl test971.pl testcurl.pl testutil.pm tftpserver.pl util.py valgrind.pm valgrind.supp
.clang-tidy.yml .dir-locals.el .editorconfig .git-blame-ignore-revs .gitattributes .gitignore .mailmap CHANGES.md CMakeLists.txt COPYING Dockerfile GIT-INFO.md Makefile.am README README.md RELEASE-NOTES REUSE.toml SECURITY.md acinclude.m4 appveyor.sh appveyor.yml configure.ac curl-config.in libcurl.pc.in renovate.json
examples .env config.ini crypto_test.lua env_test.lua fs_example.lua http_server.lua https_test.lua ini_example.lua json.lua log.lua path_fs_example.lua process_example.lua request_download.lua request_test.lua run_all.lua sqlite_example.lua sqlite_http_template.lua stash_test.lua template_test.lua timer.lua websocket.lua
iniparser
.github
ISSUE_TEMPLATE config.yml
workflows disable-pull-requests.yml trigger-gitlab-ci.yml
cmake JoinPaths.cmake config.cmake.in pc.in
example iniexample.c iniwrite.c parse.c twisted-errors.ini twisted-genhuge.py twisted-ofkey.ini twisted-ofval.ini twisted.ini
src dictionary.c dictionary.h iniparser.c iniparser.h
test
ressources
bad_ini ends_well.ini twisted-errors.ini twisted-ofkey.ini twisted-ofval.ini
good_ini empty.ini spaced.ini spaced2.ini twisted.ini
gruezi.ini old.ini quotes.ini utf8.ini
CMakeLists.txt test_dictionary.c test_iniparser.c unity-config.yml unity_config.h
.cmake-format.py .gitignore .gitlab-ci.yml .gitmessage .travis.yml AUTHORS CMakeLists.txt FAQ-en.md FAQ-zhcn.md INSTALL LICENSE README.md compile_commands.json
jinjac
example CMakeLists.txt example.c
jinjac_test_app CMakeLists.txt jinjac_test_app.c
libjinjac
include jinjac.h
src CMakeLists.txt ast.c ast.h block_statement.c block_statement.h buffer.c buffer.h buildin.c buildin.h common.h convert.c convert.h flex_decl.h jfunction.c jfunction.h jinja_expression.l jinja_expression.y jinjac_parse.c jinjac_parse.h jinjac_stream.c jinjac_stream.h jlist.c jlist.h jobject.c jobject.h parameter.c parameter.h str_obj.c str_obj.h trace.c trace.h
CMakeLists.txt
test .gitignore CMakeLists.txt autotest.rb test_01.expected test_01.jinja test_01b.expected test_01b.jinja test_01c.expected test_01c.jinja test_01d.expected test_01d.jinja test_02.expected test_02.jinja test_03.expected test_03.jinja test_04.expected test_04.jinja test_05.expected test_05.jinja test_06.expected test_06.jinja test_07.expected test_07.jinja test_08.expected test_08.jinja test_08b.expected test_08b.jinja test_09.expected test_09.jinja test_10.expected test_10.jinja test_11.expected test_11.jinja test_12.expected test_12.jinja test_13.expected test_13.jinja test_14.expected test_14.jinja test_15.expected test_15.jinja test_16.expected test_16.jinja test_17.expected test_17.jinja test_18.expected test_18.jinja test_18b.expected test_18b.jinja test_18c.expected test_18c.jinja test_19.expected test_19.jinja test_19b.expected test_19b.jinja test_19c.expected test_19c.jinja test_19d.expected test_19d.jinja test_19e.expected test_19e.jinja test_19f.expected test_19f.jinja test_20.expected test_20.jinja test_21.expected test_21.jinja test_22.expected test_22.jinja test_22a.expected test_22a.jinja test_22b.expected test_22b.jinja test_23.expected test_23.jinja test_24.expected test_24.jinja
.gitignore CMakeLists.txt LICENSE.txt README.md build_coverage.sh build_debug.sh build_release.sh cppcheck_analysis.sh
libev Changes LICENSE Makefile Makefile.am Makefile.in README Symbols.ev Symbols.event aclocal.m4 autogen.sh compile config.guess config.h config.h.in config.status config.sub configure configure.ac depcomp ev++.h ev.3 ev.c ev.h ev.pod ev_epoll.c ev_kqueue.c ev_poll.c ev_port.c ev_select.c ev_vars.h ev_win32.c ev_wrap.h event.c event.h install-sh libev.m4 libtool ltmain.sh missing mkinstalldirs stamp-h1
luajit
doc
img contact.png
bluequad-print.css bluequad.css contact.html ext_buffer.html ext_c_api.html ext_ffi.html ext_ffi_api.html ext_ffi_semantics.html ext_ffi_tutorial.html ext_jit.html ext_profiler.html extensions.html install.html luajit.html running.html
dynasm dasm_arm.h dasm_arm.lua dasm_arm64.h dasm_arm64.lua dasm_mips.h dasm_mips.lua dasm_mips64.lua dasm_ppc.h dasm_ppc.lua dasm_proto.h dasm_x64.lua dasm_x86.h dasm_x86.lua dynasm.lua
etc luajit.1 luajit.pc
src
host .gitignore README buildvm.c buildvm.h buildvm_asm.c buildvm_fold.c buildvm_lib.c buildvm_libbc.h buildvm_peobj.c genlibbc.lua genminilua.lua genversion.lua minilua.c
jit .gitignore bc.lua bcsave.lua dis_arm.lua dis_arm64.lua dis_arm64be.lua dis_mips.lua dis_mips64.lua dis_mips64el.lua dis_mips64r6.lua dis_mips64r6el.lua dis_mipsel.lua dis_ppc.lua dis_x64.lua dis_x86.lua dump.lua p.lua v.lua zone.lua
.gitignore Makefile Makefile.dep lauxlib.h lib_aux.c lib_base.c lib_bit.c lib_buffer.c lib_debug.c lib_ffi.c lib_init.c lib_io.c lib_jit.c lib_math.c lib_os.c lib_package.c lib_string.c lib_table.c lj_alloc.c lj_alloc.h lj_api.c lj_arch.h lj_asm.c lj_asm.h lj_asm_arm.h lj_asm_arm64.h lj_asm_mips.h lj_asm_ppc.h lj_asm_x86.h lj_assert.c lj_bc.c lj_bc.h lj_bcdump.h lj_bcread.c lj_bcwrite.c lj_buf.c lj_buf.h lj_carith.c lj_carith.h lj_ccall.c lj_ccall.h lj_ccallback.c lj_ccallback.h lj_cconv.c lj_cconv.h lj_cdata.c lj_cdata.h lj_char.c lj_char.h lj_clib.c lj_clib.h lj_cparse.c lj_cparse.h lj_crecord.c lj_crecord.h lj_ctype.c lj_ctype.h lj_debug.c lj_debug.h lj_def.h lj_dispatch.c lj_dispatch.h lj_emit_arm.h lj_emit_arm64.h lj_emit_mips.h lj_emit_ppc.h lj_emit_x86.h lj_err.c lj_err.h lj_errmsg.h lj_ff.h lj_ffrecord.c lj_ffrecord.h lj_frame.h lj_func.c lj_func.h lj_gc.c lj_gc.h lj_gdbjit.c lj_gdbjit.h lj_ir.c lj_ir.h lj_ircall.h lj_iropt.h lj_jit.h lj_lex.c lj_lex.h lj_lib.c lj_lib.h lj_load.c lj_mcode.c lj_mcode.h lj_meta.c lj_meta.h lj_obj.c lj_obj.h lj_opt_dce.c lj_opt_fold.c lj_opt_loop.c lj_opt_mem.c lj_opt_narrow.c lj_opt_sink.c lj_opt_split.c lj_parse.c lj_parse.h lj_prng.c lj_prng.h lj_profile.c lj_profile.h lj_record.c lj_record.h lj_serialize.c lj_serialize.h lj_snap.c lj_snap.h lj_state.c lj_state.h lj_str.c lj_str.h lj_strfmt.c lj_strfmt.h lj_strfmt_num.c lj_strscan.c lj_strscan.h lj_tab.c lj_tab.h lj_target.h lj_target_arm.h lj_target_arm64.h lj_target_mips.h lj_target_ppc.h lj_target_x86.h lj_trace.c lj_trace.h lj_traceerr.h lj_udata.c lj_udata.h lj_vm.h lj_vmevent.c lj_vmevent.h lj_vmmath.c ljamalg.c lua.h lua.hpp luaconf.h luajit.c luajit_rolling.h lualib.h msvcbuild.bat nxbuild.bat ps4build.bat ps5build.bat psvitabuild.bat vm_arm.dasc vm_arm64.dasc vm_mips.dasc vm_mips64.dasc vm_ppc.dasc vm_x64.dasc vm_x86.dasc xb1build.bat xedkbuild.bat
.gitattributes .gitignore .relver COPYRIGHT Makefile README
sqlite shell.c sqlite3.c sqlite3.h sqlite3ext.h
wolfssl
.github
ISSUE_TEMPLATE bug_report.yaml other.yaml
actions
install-apt-deps action.yml
scripts
zephyr-4.x external_libc.conf zephyr-test.sh
openssl-ech.sh tls-anvil-test.sh
workflows
disabled haproxy.yml hitch.yml hostap.yml
hostap-files
configs
07c9f183ea744ac04585fb6dd10220c75a5e2e74 hostapd.config tests wpa_supplicant.config
b607d2723e927a3446d89aed813f1aa6068186bb hostapd.config tests wpa_supplicant.config
hostap_2_10 extra.patch hostapd.config tests wpa_supplicant.config
Makefile README dbus-wpa_supplicant.conf
ada.yml arduino.yml async-examples.yml async.yml atecc608-sim.yml bind.yml cmake-autoconf.yml cmake.yml codespell.yml coverity-scan-fixes.yml cryptocb-only.yml curl.yml cyrus-sasl.yml disable-pk-algs.yml docker-Espressif.yml docker-OpenWrt.yml emnet-nonblock.yml fil-c.yml freertos-mem-track.yml gencertbuf.yml grpc.yml haproxy.yml hostap-vm.yml intelasm-c-fallback.yml ipmitool.yml jwt-cpp.yml krb5.yml libspdm.yml libssh2.yml libvncserver.yml linuxkm.yml macos-apple-native-cert-validation.yml mbedtls.sh mbedtls.yml membrowse-comment.yml membrowse-onboard.yml membrowse-report.yml memcached.sh memcached.yml mono.yml mosquitto.yml msmtp.yml msys2.yml multi-arch.yml multi-compiler.yml net-snmp.yml nginx.yml no-malloc.yml no-tls.yml nss.sh nss.yml ntp.yml ocsp.yml openldap.yml openssh.yml openssl-ech.yml opensslcoexist.yml openvpn.yml os-check.yml packaging.yml pam-ipmi.yml pq-all.yml pr-commit-check.yml psk.yml puf.yml python.yml rng-tools.yml rust-wrapper.yml se050-sim.yml smallStackSize.yml socat.yml softhsm.yml sssd.yml stm32-sim.yml stsafe-a120-sim.yml stunnel.yml symbol-prefixes.yml threadx.yml tls-anvil.yml trackmemory.yml watcomc.yml win-csharp-test.yml wolfCrypt-Wconversion.yml wolfboot-integration.yml wolfsm.yml xcode.yml zephyr-4.x.yml zephyr.yml
PULL_REQUEST_TEMPLATE.md SECURITY.md membrowse-targets.json
Docker
OpenWrt Dockerfile README.md runTests.sh
packaging
debian Dockerfile
fedora Dockerfile
wolfCLU Dockerfile README.md
yocto Dockerfile buildAndPush.sh
Dockerfile Dockerfile.cross-compiler README.md buildAndPush.sh include.am run.sh
IDE
ARDUINO
sketches
wolfssl_client README.md
wolfssl_server README.md
wolfssl_version README.md
README.md
Arduino_README_prepend.md README.md include.am keywords.txt library.properties.template wolfssl-arduino.cpp wolfssl-arduino.sh wolfssl.h
AURIX Cpu0_Main.c README.md include.am user_settings.h wolf_main.c
Android Android.bp README.md include.am user_settings.h
CRYPTOCELL README.md include.am main.c user_settings.h
CSBENCH include.am user_settings.h
ECLIPSE
DEOS
deos_wolfssl .options
README.md deos_malloc.c include.am tls_wolfssl.c tls_wolfssl.h user_settings.h
MICRIUM README.md client_wolfssl.c client_wolfssl.h include.am server_wolfssl.c server_wolfssl.h user_settings.h wolfsslRunTests.c
RTTHREAD README.md include.am user_settings.h wolfssl_test.c
SIFIVE README.md include.am
Espressif
ESP-IDF
examples
template
VisualGDB wolfssl_template_IDF_v5.1_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266
wolfssl_benchmark
VisualGDB wolfssl_benchmark_IDF_v4.4_ESP32.sln wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj wolfssl_benchmark_IDF_v5_ESP32.sln wolfssl_benchmark_IDF_v5_ESP32.vgdbproj wolfssl_benchmark_IDF_v5_ESP32C3.sln wolfssl_benchmark_IDF_v5_ESP32C3.vgdbproj wolfssl_benchmark_IDF_v5_ESP32S3.sln wolfssl_benchmark_IDF_v5_ESP32S3.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266
wolfssl_client
VisualGDB README.md wolfssl_client_IDF_v5_ESP32.sln wolfssl_client_IDF_v5_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include client-tls.h main.h time_helper.h wifi_connect.h
CMakeLists.txt Kconfig.projbuild client-tls.c component.mk main.c time_helper.c wifi_connect.c
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_client_ESP8266.vgdbproj
wolfssl_server
VisualGDB README.md wolfssl_server_IDF_v5_ESP32.sln wolfssl_server_IDF_v5_ESP32.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h server-tls.h time_helper.h wifi_connect.h
CMakeLists.txt Kconfig.projbuild component.mk main.c server-tls.c time_helper.c wifi_connect.c
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_server_ESP8266.vgdbproj
wolfssl_test
VisualGDB wolfssl_test-IDF_v5_ESP32.sln wolfssl_test-IDF_v5_ESP32.vgdbproj wolfssl_test-IDF_v5_ESP32C3.sln wolfssl_test-IDF_v5_ESP32C3.vgdbproj wolfssl_test-IDF_v5_ESP32C6.sln wolfssl_test-IDF_v5_ESP32C6.vgdbproj wolfssl_test_IDF_v5_ESP32S3.sln wolfssl_test_IDF_v5_ESP32S3.vgdbproj
components
wolfssl
include user_settings.h
CMakeLists.txt Kconfig README.md component.mk
main
include main.h
CMakeLists.txt Kconfig.projbuild component.mk main.c
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32 sdkconfig.defaults.esp32c3 sdkconfig.defaults.esp32c6 sdkconfig.defaults.esp32h2 sdkconfig.defaults.esp32s2 sdkconfig.defaults.esp32s3 sdkconfig.defaults.esp8266 testAll.sh testMonitor.sh wolfssl_test_ESP8266.sln wolfssl_test_ESP8266.vgdbproj
wolfssl_test_idf
VisualGDB VisualGDB_wolfssl_test_idf.sln VisualGDB_wolfssl_test_idf.vgdbproj
main CMakeLists.txt Kconfig.projbuild component.mk main.c main_wip.c.ex time_helper.c time_helper.h
CMakeLists.txt Kconfig.projbuild README.md component.mk sdkconfig.defaults
README.md
libs CMakeLists.txt README.md component.mk tigard.cfg
test CMakeLists.txt README.md component.mk test_wolfssl.c
README.md README_32se.md UPDATE.md compileAllExamples.sh dummy_config_h dummy_test_paths.h setup.sh setup_win.bat user_settings.h
README.md include.am
GCC-ARM
Header user_settings.h
Source armtarget.c benchmark_main.c test_main.c tls_client.c tls_server.c wolf_main.c
Makefile Makefile.bench Makefile.client Makefile.common Makefile.server Makefile.static Makefile.test README.md include.am linker.ld linker_fips.ld
Gaisler-BCC README.md include.am
HEXAGON
DSP Makefile wolfssl_dsp.idl
Makefile README.md build.sh ecc-verify-benchmark.c ecc-verify.c include.am user_settings.h
HEXIWEAR
wolfSSL_HW .cwGeneratedFileSetLog user_settings.h
IAR-EWARM
Projects
benchmark benchmark-main.c current_time.c wolfCrypt-benchmark.ewd wolfCrypt-benchmark.ewp
common minimum-startup.c wolfssl.icf
lib wolfSSL-Lib.ewd wolfSSL-Lib.ewp
test test-main.c wolfCrypt-test.ewd wolfCrypt-test.ewp
user_settings.h wolfssl.eww
embOS
SAMV71_XULT
embOS_SAMV71_XULT_Linker_Script samv71q21_wolfssl.icf
embOS_SAMV71_XULT_user_settings user_settings.h user_settings_simple_example.h user_settings_verbose_example.h
embOS_wolfcrypt_benchmark_SAMV71_XULT
Application runBenchmarks.c
README_wolfcrypt_benchmark wolfcrypt_benchmark.ewd wolfcrypt_benchmark.ewp
embOS_wolfcrypt_lib_SAMV71_XULT README_wolfcrypt_lib wolfcrypt_lib.ewd wolfcrypt_lib.ewp
embOS_wolfcrypt_test_SAMV71_XULT
Application runWolfcryptTests.c
README_wolfcrypt_test wolfcrypt_test.ewd wolfcrypt_test.ewp
README_SAMV71
custom_port
custom_port_Linker_Script samv71q21_wolfssl.icf
custom_port_user_settings user_settings.h
wolfcrypt_benchmark_custom_port
Application runBenchmarks.c
wolfcrypt_test_custom_port
Application runWolfcryptTests.c
README_custom_port
extract_trial_here README_extract_trial_here
README
.gitignore README
IAR-MSP430 Makefile README.md include.am main.c user_settings.h
INTIME-RTOS Makefile README.md include.am libwolfssl.c libwolfssl.vcxproj user_settings.h wolfExamples.c wolfExamples.h wolfExamples.sln wolfExamples.vcxproj wolfssl-lib.sln wolfssl-lib.vcxproj
Infineon README.md include.am user_settings.h
KDS
config user_settings.h
include.am
LINUX-SGX README.md build.sh clean.sh include.am sgx_t_static.mk
LPCXPRESSO
lib_wolfssl lpc_18xx_port.c user_settings.h
wolf_example
src lpc_18xx_startup.c wolfssl_example.c
readme.txt
README.md
M68K
benchmark Makefile main.cpp
testwolfcrypt Makefile main.cpp
Makefile README.md include.am user_settings.h
MCUEXPRESSO
RT1170 fsl_caam_c.patch fsl_caam_h.patch user_settings.h
benchmark
source run_benchmark.c
wolfssl liblinks.xml
README.md include.am user_settings.h wolfcrypt_test.c
MDK-ARM
LPC43xx time-LCP43xx.c
MDK-ARM
wolfSSL Retarget.c cert_data.c cert_data.h config-BARE-METAL.h config-FS.h config-RTX-TCP-FS.h config-WOLFLIB.h main.c shell.c time-CortexM3-4.c time-dummy.c wolfssl_MDK_ARM.c wolfssl_MDK_ARM.h
STM32F2xx_StdPeriph_Lib time-STM32F2xx.c
MDK5-ARM
Conf user_settings.h
Inc wolfssl_MDK_ARM.h
Projects
CryptBenchmark Abstract.txt CryptBenchmark.sct CryptBenchmark.uvoptx CryptBenchmark.uvprojx main.c
CryptTest Abstract.txt CryptTest.sct CryptTest.uvoptx CryptTest.uvprojx main.c
EchoClient Abstract.txt EchoClient.uvoptx EchoClient.uvprojx main.c wolfssl-link.sct
EchoServer Abstract.txt EchoServer.uvoptx EchoServer.uvprojx main.c wolfssl-link.sct
SimpleClient Abstract.txt SimpleClient.uvoptx SimpleClient.uvprojx main.c wolfssl-link.sct
SimpleServer Abstract.txt SimpleServer.uvoptx SimpleServer.uvprojx main.c wolfssl-link.sct
wolfSSL-Full Abstract.txt main.c shell.c time-CortexM3-4.c wolfsslFull.uvoptx wolfsslFull.uvprojx
wolfSSL-Lib Abstract.txt wolfSSL-Lib.uvoptx wolfSSL-Lib.uvprojx
Src ssl-dummy.c
README.md include.am
MPLABX16
wolfcrypt_test.X
nbproject
private configurations.xml private.xml
configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
README.md include.am main.c user_settings.h
MQX Makefile README-jp.md README.md client-tls.c include.am server-tls.c user_config.h user_settings.h
MSVS-2019-AZSPHERE
client client.c client.h
server server.c server.h
shared util.h
wolfssl_new_azsphere
HardwareDefinitions
avnet_mt3620_sk
inc
hw template_appliance.h
template_appliance.json
mt3620_rdb
inc
hw template_appliance.h
template_appliance.json
seeed_mt3620_mdb
inc
hw template_appliance.h
template_appliance.json
.gitignore CMakeLists.txt CMakeSettings.json app_manifest.json applibs_versions.h launch.vs.json main.c
README.md include.am user_settings.h
MYSQL CMakeLists_wolfCrypt.txt CMakeLists_wolfSSL.txt do.sh
NDS README.md
NETOS Makefile.wolfcrypt.inc README.md include.am user_settings.h user_settings.h-cert2425 user_settings.h-cert3389 wolfssl_netos_custom.c
OPENSTM32 README.md
PlatformIO
examples
wolfssl_benchmark
include README main.h
lib README
src CMakeLists.txt main.c
test README
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_benchmark.code-workspace
wolfssl_test
include README main.h
lib README
src CMakeLists.txt main.c
test README
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_test.code-workspace
README.md wolfssl_platformio.code-workspace
README.md include.am
QNX
CAAM-DRIVER Makefile
example-client Makefile client-tls.c
example-cmac Makefile cmac-test.c
example-server Makefile server-tls.c
testwolfcrypt Makefile
wolfssl Makefile user_settings.h
README.md include.am
RISCV
SIFIVE-HIFIVE1 Makefile README.md include.am main.c user_settings.h
SIFIVE-UNLEASHED README.md include.am
include.am
ROWLEY-CROSSWORKS-ARM Kinetis_FlashPlacement.xml README.md arm_startup.c benchmark_main.c hw.h include.am kinetis_hw.c retarget.c test_main.c user_settings.h wolfssl.hzp wolfssl_ltc.hzp
Renesas
cs+
Projects
common strings.h unistd.h user_settings.h wolfssl_dummy.c
t4_demo README_en.txt README_jp.txt t4_demo.mtpj wolf_client.c wolf_demo.h wolf_main.c wolf_server.c
test test.mtpj test_main.c
wolfssl_lib wolfssl_lib.mtpj
README include.am
e2studio
DK-S7G2
benchmark-template
src app_entry.c
example_server-template
src app_entry.c
wolfcrypttest-template
src app_entry.c
wolfssl-template-project configuration.xml
README.md include.am user_settings.h
Projects
common strings.h unistd.h user_settings.h wolfssl_dummy.c
test
src key_data.c key_data.h test_main.c wolf_client.c wolf_server.c wolfssl_demo.h
tools generate_rsa_keypair.sh genhexbuf.pl rsa_pss_sign.sh
wolfssl
src .gitkeep
wolfcrypt
src .gitkeep
README include.am
RA6M3
benchmark-wolfcrypt
common .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
client-wolfssl
common
src .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl_thread_entry.h
common
ra6m3g README.md
src freertos_tcp_port.c
user_settings.h util.h
server-wolfssl
common
src .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl_thread_entry.h
test-wolfcrypt
common .gitkeep
script .gitkeep
src wolfssl_thread_entry.c
wolfssl
src .gitkeep
wolfcrypt .gitkeep
README.md README_APRA6M_en.md README_APRA6M_jp.md include.am
RA6M3G README.md
RA6M4
common user_settings.h wolfssl_demo.h
test
key_data key_data.h key_data_sce.c
src
SEGGER_RTT myprint.c
common .gitignore
test_main.c wolf_client.c wolfssl_sce_unit_test.c
test_RA6M4Debug.launch
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
README.md include.am
RX65N
GR-ROSE
common strings.h unistd.h user_settings.h wolfssl_dummy.c
smc smc.scfg
test
src key_data.c key_data.h test_main.c wolf_client.c wolf_server.c wolfssl_demo.h
test.rcpc test_HardwareDebug.launch
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
wolfssl wolfssl.rcpc
README_EN.md README_JP.md include.am
RSK
resource section.esi
wolfssl wolfssl.rcpc
wolfssl_demo key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h
InstructionManualForExample_RSK+RX65N-2MB_EN.pdf InstructionManualForExample_RSK+RX65N-2MB_JP.pdf README_EN.md README_JP.md include.am
RX72N
EnvisionKit
Simple
common sectioninfo.esi wolfssl_dummy.c
test
src
client simple_tcp_client.c simple_tls_tsip_client.c
server simple_tcp_server.c simple_tls_server.c
test_main.c wolfssl_simple_demo.h
test.rcpc test.scfg test_HardwareDebug.launch
wolfssl wolfssl.rcpc
README_EN.md README_JP.md
resource section.esi
tools
example_keys generate_SignedCA.sh rsa_private.pem rsa_public.pem
README.md
wolfssl wolfssl.rcpc
wolfssl_demo key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h wolfssl_tsip_unit_test.c
InstructionManualForExample_RX72N_EnvisonKit_EN.pdf InstructionManualForExample_RX72N_EnvisonKit_JP.pdf README_EN.md README_JP.md include.am
RZN2L
common user_settings.h wolfssl_demo.h
test
src
serial_io app_print.c
test wolf_client.c wolf_server.c wolfssl_rsip_unit_test.c
wolfCrypt .gitignore
wolfSSL .gitignore
local_system_init.c rzn2l_tst_thread_entry.c wolfssl_dummy.c
README.md include.am
SK-S7G2
common user_settings.h
wolfssl_lib configuration.xml
.gitignore README.md include.am
STARCORE README.txt include.am starcore_test.c user_settings.h
STM32Cube README.md STM32_Benchmarks.md default_conf.ftl include.am main.c wolfssl_example.c wolfssl_example.h
SimplicityStudio README.md include.am test_wolf.c user_settings.h
TRUESTUDIO
wolfssl user_settings.h
README include.am
VS-ARM README.md include.am user_settings.h wolfssl.sln wolfssl.vcxproj
VS-AZURE-SPHERE
client app_manifest.json client.c client.h client.vcxproj
server app_manifest.json server.c server.h server.vcxproj
shared util.h
wolfcrypt_test app_manifest.json wolfcrypt_test.vcxproj
README.md include.am user_settings.h wolfssl.sln wolfssl.vcxproj
VisualDSP include.am user_settings.h wolf_tasks.c
WICED-STUDIO README include.am user_settings.h
WIN README.txt include.am test.vcxproj user_settings.h user_settings_dtls.h wolfssl-fips.sln wolfssl-fips.vcxproj
WIN-SGX ReadMe.txt include.am wolfSSL_SGX.edl wolfSSL_SGX.sln wolfSSL_SGX.vcxproj
WIN-SRTP-KDF-140-3 README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxproj
WIN10 README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxproj
WINCE README.md include.am user_settings.h user_settings.h.140-2-deprecated
WORKBENCH README.md include.am
XCODE
Benchmark
wolfBench
Assets.xcassets
AppIcon.appiconset Contents.json
Base.lproj LaunchScreen.storyboard Main.storyboard
AppDelegate.h AppDelegate.m Info.plist ViewController.h ViewController.m main.m
wolfBench.xcodeproj project.pbxproj
include.am
wolfssl-FIPS.xcodeproj project.pbxproj
wolfssl.xcodeproj project.pbxproj
wolfssl_testsuite.xcodeproj project.pbxproj
README.md build-for-i386.sh include.am user_settings.h
XCODE-FIPSv2
macOS-C++
Intel user_settings.h
M1 user_settings.h
include.am user_settings.h
XCODE-FIPSv5 README include.am user_settings.h
XCODE-FIPSv6 README include.am user_settings.h
XilinxSDK
2018_2 lscript.ld
2019_2
wolfCrypt_example
src lscript.ld
wolfCrypt_example_system wolfCrypt_example_system.sprj
2022_1
wolfCrypt_FreeRTOS_example wolfCrypt_FreeRTOS_example.prj
wolfCrypt_FreeRTOS_example_system wolfCrypt_FreeRTOS_example_system.sprj
wolfCrypt_example wolfCrypt_example.prj
wolfCrypt_example_system wolfCrypt_example_system.sprj
.gitignore
README.md bench.sh combine.sh eclipse_formatter_profile.xml graph.sh include.am user_settings.h wolfssl_example.c
apple-universal
wolfssl-multiplatform
wolfssl-multiplatform
Assets.xcassets
AccentColor.colorset Contents.json
AppIcon.appiconset Contents.json
Contents.json
ContentView.swift simple_client_example.c simple_client_example.h wolfssl-multiplatform-Bridging-Header.h wolfssl_multiplatform.entitlements wolfssl_multiplatformApp.swift wolfssl_test_driver.c wolfssl_test_driver.h
wolfssl-multiplatform.xcodeproj project.pbxproj
.gitignore README.md build-wolfssl-framework.sh include.am
iotsafe Makefile README.md ca-cert.c devices.c devices.h include.am main.c memory-tls.c startup.c target.ld user_settings.h
iotsafe-raspberrypi Makefile README.md client-tls13.c include.am main.c
mynewt README.md apps.wolfcrypttest.pkg.yml crypto.wolfssl.pkg.yml crypto.wolfssl.syscfg.yml include.am setup.sh
zephyr README.md include.am
include.am
RTOS
nuttx
wolfssl .gitignore Kconfig Make.defs Makefile README.md setup-wolfssl.sh user_settings.h
include.am
bsdkm Makefile README.md bsdkm_wc_port.h include.am wolfkmod.c wolfkmod_aes.c x86_vecreg.c
certs
1024 ca-cert.der ca-cert.pem ca-key.der ca-key.pem client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der dh1024.der dh1024.pem dsa-pub-1024.pem dsa1024.der dsa1024.pem include.am rsa1024.der server-cert.der server-cert.pem server-key.der server-key.pem
3072 client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der include.am
4096 client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der include.am
acert
rsa_pss acert.pem acert_ietf.pem acert_ietf_pubkey.pem acert_pubkey.pem
acert.pem acert_ietf.pem acert_ietf_pubkey.pem acert_pubkey.pem include.am
aia ca-issuers-cert.pem multi-aia-cert.pem overflow-aia-cert.pem
crl
extra-crls ca-int-cert-revoked.pem claim-root.pem crl_critical_entry.pem crlnum_57oct.pem crlnum_64oct.pem general-server-crl.pem large_crlnum.pem large_crlnum2.pem
hash_der 0fdb2da4.r0
hash_pem 0fdb2da4.r0
bad_time_fmt.pem ca-int-ecc.pem ca-int.pem ca-int2-ecc.pem ca-int2.pem caEcc384Crl.pem caEccCrl.der caEccCrl.pem cliCrl.pem client-int-ecc.pem client-int.pem crl.der crl.pem crl.revoked crl2.der crl2.pem crl_reason.pem crl_rsapss.pem eccCliCRL.pem eccSrvCRL.pem gencrls.sh include.am server-goodaltCrl.pem server-goodaltwildCrl.pem server-goodcnCrl.pem server-goodcnwildCrl.pem server-int-ecc.pem server-int.pem wolfssl.cnf
dilithium bench_dilithium_level2_key.der bench_dilithium_level3_key.der bench_dilithium_level5_key.der include.am
ecc bp256r1-key.der bp256r1-key.pem ca-secp256k1-cert.pem ca-secp256k1-key.pem client-bp256r1-cert.der client-bp256r1-cert.pem client-secp256k1-cert.der client-secp256k1-cert.pem genecc.sh include.am secp256k1-key.der secp256k1-key.pem secp256k1-param.pem secp256k1-privkey.der secp256k1-privkey.pem server-bp256r1-cert.der server-bp256r1-cert.pem server-secp256k1-cert.der server-secp256k1-cert.pem server2-secp256k1-cert.der server2-secp256k1-cert.pem wolfssl.cnf wolfssl_384.cnf
ed25519 ca-ed25519-key.der ca-ed25519-key.pem ca-ed25519-priv.der ca-ed25519-priv.pem ca-ed25519.der ca-ed25519.pem client-ed25519-key.der client-ed25519-key.pem client-ed25519-priv.der client-ed25519-priv.pem client-ed25519.der client-ed25519.pem eddsa-ed25519.der eddsa-ed25519.pem gen-ed25519-certs.sh gen-ed25519-keys.sh gen-ed25519.sh include.am root-ed25519-key.der root-ed25519-key.pem root-ed25519-priv.der root-ed25519-priv.pem root-ed25519.der root-ed25519.pem server-ed25519-cert.pem server-ed25519-key.der server-ed25519-key.pem server-ed25519-priv.der server-ed25519-priv.pem server-ed25519.der server-ed25519.pem
ed448 ca-ed448-key.der ca-ed448-key.pem ca-ed448-priv.der ca-ed448-priv.pem ca-ed448.der ca-ed448.pem client-ed448-key.der client-ed448-key.pem client-ed448-priv.der client-ed448-priv.pem client-ed448.der client-ed448.pem gen-ed448-certs.sh gen-ed448-keys.sh include.am root-ed448-key.der root-ed448-key.pem root-ed448-priv.der root-ed448-priv.pem root-ed448.der root-ed448.pem server-ed448-cert.pem server-ed448-key.der server-ed448-key.pem server-ed448-priv.der server-ed448-priv.pem server-ed448.der server-ed448.pem
external DigiCertGlobalRootCA.pem README.txt ca-digicert-ev.pem ca-globalsign-root.pem ca-google-root.pem ca_collection.pem include.am
falcon bench_falcon_level1_key.der bench_falcon_level5_key.der include.am
intermediate
ca_false_intermediate gentestcert.sh int_ca.key server.key test_ca.key test_ca.pem test_int_not_cacert.pem test_sign_bynoca_srv.pem wolfssl_base.conf wolfssl_srv.conf
ca-ecc-bad-aki.der ca-ecc-bad-aki.pem ca-int-cert.der ca-int-cert.pem ca-int-ecc-cert.der ca-int-ecc-cert.pem ca-int-ecc-key.der ca-int-ecc-key.pem ca-int-key.der ca-int-key.pem ca-int2-cert.der ca-int2-cert.pem ca-int2-ecc-cert.der ca-int2-ecc-cert.pem ca-int2-ecc-key.der ca-int2-ecc-key.pem ca-int2-key.der ca-int2-key.pem client-chain-alt-ecc.pem client-chain-alt.pem client-chain-ecc.der client-chain-ecc.pem client-chain.der client-chain.pem client-int-cert.der client-int-cert.pem client-int-ecc-cert.der client-int-ecc-cert.pem genintcerts.sh include.am server-chain-alt-ecc.pem server-chain-alt.pem server-chain-ecc.der server-chain-ecc.pem server-chain-short.pem server-chain.der server-chain.pem server-int-cert.der server-int-cert.pem server-int-ecc-cert.der server-int-ecc-cert.pem
lms bc_hss_L2_H5_W8_root.der bc_hss_L3_H5_W4_root.der bc_lms_chain_ca.der bc_lms_chain_leaf.der bc_lms_native_bc_root.der bc_lms_sha256_h10_w8_root.der bc_lms_sha256_h5_w4_root.der include.am
mldsa README.txt include.am mldsa44-cert.der mldsa44-cert.pem mldsa44-key.pem mldsa44_bare-priv.der mldsa44_bare-seed.der mldsa44_oqskeypair.der mldsa44_priv-only.der mldsa44_pub-spki.der mldsa44_seed-only.der mldsa44_seed-priv.der mldsa65-cert.der mldsa65-cert.pem mldsa65-key.pem mldsa65_bare-priv.der mldsa65_bare-seed.der mldsa65_oqskeypair.der mldsa65_priv-only.der mldsa65_pub-spki.der mldsa65_seed-only.der mldsa65_seed-priv.der mldsa87-cert.der mldsa87-cert.pem mldsa87-key.pem mldsa87_bare-priv.der mldsa87_bare-seed.der mldsa87_oqskeypair.der mldsa87_priv-only.der mldsa87_pub-spki.der mldsa87_seed-only.der mldsa87_seed-priv.der
ocsp imposter-root-ca-cert.der imposter-root-ca-cert.pem imposter-root-ca-key.der imposter-root-ca-key.pem include.am index-ca-and-intermediate-cas.txt index-ca-and-intermediate-cas.txt.attr index-intermediate1-ca-issued-certs.txt index-intermediate1-ca-issued-certs.txt.attr index-intermediate2-ca-issued-certs.txt index-intermediate2-ca-issued-certs.txt.attr index-intermediate3-ca-issued-certs.txt index-intermediate3-ca-issued-certs.txt.attr intermediate1-ca-cert.der intermediate1-ca-cert.pem intermediate1-ca-key.der intermediate1-ca-key.pem intermediate2-ca-cert.der intermediate2-ca-cert.pem intermediate2-ca-key.der intermediate2-ca-key.pem intermediate3-ca-cert.der intermediate3-ca-cert.pem intermediate3-ca-key.der intermediate3-ca-key.pem ocsp-responder-cert.der ocsp-responder-cert.pem ocsp-responder-key.der ocsp-responder-key.pem openssl.cnf renewcerts-for-test.sh renewcerts.sh root-ca-cert.der root-ca-cert.pem root-ca-crl.pem root-ca-key.der root-ca-key.pem server1-cert.der server1-cert.pem server1-chain-noroot.pem server1-key.der server1-key.pem server2-cert.der server2-cert.pem server2-key.der server2-key.pem server3-cert.der server3-cert.pem server3-key.der server3-key.pem server4-cert.der server4-cert.pem server4-key.der server4-key.pem server5-cert.der server5-cert.pem server5-key.der server5-key.pem test-leaf-response.der test-multi-response.der test-response-nointern.der test-response-rsapss.der test-response.der
p521 ca-p521-key.der ca-p521-key.pem ca-p521-priv.der ca-p521-priv.pem ca-p521.der ca-p521.pem client-p521-key.der client-p521-key.pem client-p521-priv.der client-p521-priv.pem client-p521.der client-p521.pem gen-p521-certs.sh gen-p521-keys.sh include.am root-p521-key.der root-p521-key.pem root-p521-priv.der root-p521-priv.pem root-p521.der root-p521.pem server-p521-cert.pem server-p521-key.der server-p521-key.pem server-p521-priv.der server-p521-priv.pem server-p521.der server-p521.pem
renewcerts wolfssl.cnf
rpk client-cert-rpk.der client-ecc-cert-rpk.der include.am server-cert-rpk.der server-ecc-cert-rpk.der
rsapss ca-3072-rsapss-key.der ca-3072-rsapss-key.pem ca-3072-rsapss-priv.der ca-3072-rsapss-priv.pem ca-3072-rsapss.der ca-3072-rsapss.pem ca-rsapss-key.der ca-rsapss-key.pem ca-rsapss-priv.der ca-rsapss-priv.pem ca-rsapss.der ca-rsapss.pem client-3072-rsapss-key.der client-3072-rsapss-key.pem client-3072-rsapss-priv.der client-3072-rsapss-priv.pem client-3072-rsapss.der client-3072-rsapss.pem client-rsapss-key.der client-rsapss-key.pem client-rsapss-priv.der client-rsapss-priv.pem client-rsapss.der client-rsapss.pem gen-rsapss-keys.sh include.am renew-rsapss-certs.sh root-3072-rsapss-key.der root-3072-rsapss-key.pem root-3072-rsapss-priv.der root-3072-rsapss-priv.pem root-3072-rsapss.der root-3072-rsapss.pem root-rsapss-key.der root-rsapss-key.pem root-rsapss-priv.der root-rsapss-priv.pem root-rsapss.der root-rsapss.pem server-3072-rsapss-cert.pem server-3072-rsapss-key.der server-3072-rsapss-key.pem server-3072-rsapss-priv.der server-3072-rsapss-priv.pem server-3072-rsapss.der server-3072-rsapss.pem server-mix-rsapss-cert.pem server-rsapss-cert.pem server-rsapss-key.der server-rsapss-key.pem server-rsapss-priv.der server-rsapss-priv.pem server-rsapss.der server-rsapss.pem
sia timestamping-sia-cert.pem
slhdsa bench_slhdsa_sha2_128f_key.der bench_slhdsa_sha2_128s_key.der bench_slhdsa_sha2_192f_key.der bench_slhdsa_sha2_192s_key.der bench_slhdsa_sha2_256f_key.der bench_slhdsa_sha2_256s_key.der bench_slhdsa_shake128f_key.der bench_slhdsa_shake128s_key.der bench_slhdsa_shake192f_key.der bench_slhdsa_shake192s_key.der bench_slhdsa_shake256f_key.der bench_slhdsa_shake256s_key.der client-mldsa44-priv.pem client-mldsa44-sha2.der client-mldsa44-sha2.pem client-mldsa44-shake.der client-mldsa44-shake.pem gen-slhdsa-mldsa-certs.sh include.am root-slhdsa-sha2-128s-priv.der root-slhdsa-sha2-128s-priv.pem root-slhdsa-sha2-128s.der root-slhdsa-sha2-128s.pem root-slhdsa-shake-128s-priv.der root-slhdsa-shake-128s-priv.pem root-slhdsa-shake-128s.der root-slhdsa-shake-128s.pem server-mldsa44-priv.pem server-mldsa44-sha2.der server-mldsa44-sha2.pem server-mldsa44-shake.der server-mldsa44-shake.pem
sm2 ca-sm2-key.der ca-sm2-key.pem ca-sm2-priv.der ca-sm2-priv.pem ca-sm2.der ca-sm2.pem client-sm2-key.der client-sm2-key.pem client-sm2-priv.der client-sm2-priv.pem client-sm2.der client-sm2.pem fix_sm2_spki.py gen-sm2-certs.sh gen-sm2-keys.sh include.am root-sm2-key.der root-sm2-key.pem root-sm2-priv.der root-sm2-priv.pem root-sm2.der root-sm2.pem self-sm2-cert.pem self-sm2-key.pem self-sm2-priv.pem server-sm2-cert.der server-sm2-cert.pem server-sm2-key.der server-sm2-key.pem server-sm2-priv.der server-sm2-priv.pem server-sm2.der server-sm2.pem
statickeys dh-ffdhe2048-params.pem dh-ffdhe2048-pub.der dh-ffdhe2048-pub.pem dh-ffdhe2048.der dh-ffdhe2048.pem ecc-secp256r1.der ecc-secp256r1.pem gen-static.sh include.am x25519-pub.der x25519-pub.pem x25519.der x25519.pem
test
expired expired-ca.der expired-ca.pem expired-cert.der expired-cert.pem
catalog.txt cert-bad-neg-int.der cert-bad-oid.der cert-bad-utf8.der cert-ext-ia.cfg cert-ext-ia.der cert-ext-ia.pem cert-ext-joi.cfg cert-ext-joi.der cert-ext-joi.pem cert-ext-mnc.der cert-ext-multiple.cfg cert-ext-multiple.der cert-ext-multiple.pem cert-ext-nc-combined.der cert-ext-nc-combined.pem cert-ext-nc.cfg cert-ext-nc.der cert-ext-nc.pem cert-ext-ncdns.der cert-ext-ncdns.pem cert-ext-ncip.der cert-ext-ncip.pem cert-ext-ncmixed.der cert-ext-ncmulti.der cert-ext-ncmulti.pem cert-ext-ncrid.der cert-ext-ncrid.pem cert-ext-nct.cfg cert-ext-nct.der cert-ext-nct.pem cert-ext-ndir-exc.cfg cert-ext-ndir-exc.der cert-ext-ndir-exc.pem cert-ext-ndir.cfg cert-ext-ndir.der cert-ext-ndir.pem cert-ext-ns.der cert-over-max-altnames.cfg cert-over-max-altnames.der cert-over-max-altnames.pem cert-over-max-nc.cfg cert-over-max-nc.der cert-over-max-nc.pem client-ecc-cert-ski.hex cn-ip-literal.der cn-ip-wildcard.der crit-cert.pem crit-key.pem dh1024.der dh1024.pem dh512.der dh512.pem digsigku.pem encrypteddata.msg gen-badsig.sh gen-ext-certs.sh gen-testcerts.sh include.am kari-keyid-cms.msg ktri-keyid-cms.msg ossl-trusted-cert.pem server-badaltname.der server-badaltname.pem server-badaltnull.der server-badaltnull.pem server-badcn.der server-badcn.pem server-badcnnull.der server-badcnnull.pem server-cert-ecc-badsig.der server-cert-ecc-badsig.pem server-cert-rsa-badsig.der server-cert-rsa-badsig.pem server-duplicate-policy.pem server-garbage.der server-garbage.pem server-goodalt.der server-goodalt.pem server-goodaltwild.der server-goodaltwild.pem server-goodcn.der server-goodcn.pem server-goodcnwild.der server-goodcnwild.pem server-localhost.der server-localhost.pem smime-test-canon.p7s smime-test-multipart-badsig.p7s smime-test-multipart.p7s smime-test.p7s
test-pathlen assemble-chains.sh chainA-ICA1-key.pem chainA-ICA1-pathlen0.pem chainA-assembled.pem chainA-entity-key.pem chainA-entity.pem chainB-ICA1-key.pem chainB-ICA1-pathlen0.pem chainB-ICA2-key.pem chainB-ICA2-pathlen1.pem chainB-assembled.pem chainB-entity-key.pem chainB-entity.pem chainC-ICA1-key.pem chainC-ICA1-pathlen1.pem chainC-assembled.pem chainC-entity-key.pem chainC-entity.pem chainD-ICA1-key.pem chainD-ICA1-pathlen127.pem chainD-assembled.pem chainD-entity-key.pem chainD-entity.pem chainE-ICA1-key.pem chainE-ICA1-pathlen128.pem chainE-assembled.pem chainE-entity-key.pem chainE-entity.pem chainF-ICA1-key.pem chainF-ICA1-pathlen1.pem chainF-ICA2-key.pem chainF-ICA2-pathlen0.pem chainF-assembled.pem chainF-entity-key.pem chainF-entity.pem chainG-ICA1-key.pem chainG-ICA1-pathlen0.pem chainG-ICA2-key.pem chainG-ICA2-pathlen1.pem chainG-ICA3-key.pem chainG-ICA3-pathlen99.pem chainG-ICA4-key.pem chainG-ICA4-pathlen5.pem chainG-ICA5-key.pem chainG-ICA5-pathlen20.pem chainG-ICA6-key.pem chainG-ICA6-pathlen10.pem chainG-ICA7-key.pem chainG-ICA7-pathlen100.pem chainG-assembled.pem chainG-entity-key.pem chainG-entity.pem chainH-ICA1-key.pem chainH-ICA1-pathlen0.pem chainH-ICA2-key.pem chainH-ICA2-pathlen2.pem chainH-ICA3-key.pem chainH-ICA3-pathlen2.pem chainH-ICA4-key.pem chainH-ICA4-pathlen2.pem chainH-assembled.pem chainH-entity-key.pem chainH-entity.pem chainI-ICA1-key.pem chainI-ICA1-no_pathlen.pem chainI-ICA2-key.pem chainI-ICA2-no_pathlen.pem chainI-ICA3-key.pem chainI-ICA3-pathlen2.pem chainI-assembled.pem chainI-entity-key.pem chainI-entity.pem chainJ-ICA1-key.pem chainJ-ICA1-no_pathlen.pem chainJ-ICA2-key.pem chainJ-ICA2-no_pathlen.pem chainJ-ICA3-key.pem chainJ-ICA3-no_pathlen.pem chainJ-ICA4-key.pem chainJ-ICA4-pathlen2.pem chainJ-assembled.pem chainJ-entity-key.pem chainJ-entity.pem include.am refreshkeys.sh
test-serial0 ee_normal.pem ee_serial0.pem generate_certs.sh include.am intermediate_serial0.pem root_serial0.pem root_serial0_key.pem selfsigned_nonca_serial0.pem
xmss bc_xmss_chain_ca.der bc_xmss_chain_leaf.der bc_xmss_sha2_10_256_root.der bc_xmss_sha2_16_256_root.der bc_xmssmt_sha2_20_2_256_root.der bc_xmssmt_sha2_20_4_256_root.der bc_xmssmt_sha2_40_8_256_root.der include.am
ca-cert-chain.der ca-cert.der ca-cert.pem ca-ecc-cert.der ca-ecc-cert.pem ca-ecc-key.der ca-ecc-key.pem ca-ecc384-cert.der ca-ecc384-cert.pem ca-ecc384-key.der ca-ecc384-key.pem ca-key-pkcs8-attribute.der ca-key.der ca-key.pem check_dates.sh client-absolute-urn.pem client-ca-cert.der client-ca-cert.pem client-ca.pem client-cert-ext.der client-cert-ext.pem client-cert.der client-cert.pem client-crl-dist.der client-crl-dist.pem client-ecc-ca-cert.der client-ecc-ca-cert.pem client-ecc-cert.der client-ecc-cert.pem client-ecc384-cert.der client-ecc384-cert.pem client-ecc384-key.der client-ecc384-key.pem client-key.der client-key.pem client-keyEnc.pem client-keyPub.der client-keyPub.pem client-relative-uri.pem client-uri-cert.pem csr.attr.der csr.dsa.der csr.dsa.pem csr.ext.der csr.signed.der dh-priv-2048.der dh-priv-2048.pem dh-pub-2048.der dh-pub-2048.pem dh-pubkey-2048.der dh2048.der dh2048.pem dh3072.der dh3072.pem dh4096.der dh4096.pem dsa-pubkey-2048.der dsa2048.der dsa2048.pem dsa3072.der dsaparams.der dsaparams.pem ecc-client-key.der ecc-client-key.pem ecc-client-keyPub.der ecc-client-keyPub.pem ecc-key-comp.pem ecc-keyPkcs8.der ecc-keyPkcs8.pem ecc-keyPkcs8Enc.der ecc-keyPkcs8Enc.pem ecc-keyPub.der ecc-keyPub.pem ecc-params.der ecc-params.pem ecc-privOnlyCert.pem ecc-privOnlyKey.pem ecc-privkey.der ecc-privkey.pem ecc-privkeyPkcs8.der ecc-privkeyPkcs8.pem ecc-rsa-server.p12 empty-issuer-cert.pem entity-no-ca-bool-cert.pem entity-no-ca-bool-key.pem fpki-cert.der fpki-certpol-cert.der gen_revoked.sh include.am renewcerts.sh rid-cert.der rsa-pub-2048.pem rsa2048.der rsa3072.der server-cert-chain.der server-cert.der server-cert.pem server-ecc-comp.der server-ecc-comp.pem server-ecc-rsa.der server-ecc-rsa.pem server-ecc-self.der server-ecc-self.pem server-ecc.der server-ecc.pem server-ecc384-cert.der server-ecc384-cert.pem server-ecc384-key.der server-ecc384-key.pem server-key.der server-key.pem server-keyEnc.pem server-keyPkcs8.der server-keyPkcs8.pem server-keyPkcs8Enc.der server-keyPkcs8Enc.pem server-keyPkcs8Enc12.pem server-keyPkcs8Enc2.pem server-keyPub.der server-keyPub.pem server-revoked-cert.pem server-revoked-key.pem taoCert.txt test-ber-exp02-05-2022.p7b test-degenerate.p7b test-multiple-recipients.p7b test-servercert-rc2.p12 test-servercert.p12 test-stream-dec.p7b test-stream-sign.p7b wolfssl-website-ca.pem x942dh2048.der x942dh2048.pem
cmake
consumer CMakeLists.txt README.md main.c
modules FindARIA.cmake FindOQS.cmake
Config.cmake.in README.md config.in functions.cmake include.am options.h.in wolfssl-config-version.cmake.in wolfssl-targets.cmake.in
debian
source format
changelog.in control.in copyright include.am libwolfssl-dev.install libwolfssl.install rules.in
doc
dox_comments
header_files aes.h arc4.h ascon.h asn.h asn_public.h blake2.h bn.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cryptocb.h curve25519.h curve448.h des3.h dh.h doxygen_groups.h doxygen_pages.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h evp.h hash.h hmac.h iotsafe.h kdf.h logging.h md2.h md4.h md5.h memory.h ocsp.h pem.h pkcs11.h pkcs7.h poly1305.h psa.h puf.h pwdbased.h quic.h random.h ripemd.h rsa.h sakke.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h srp.h ssl.h tfm.h types.h wc_encrypt.h wc_port.h wc_she.h wc_slhdsa.h wolfio.h
header_files-ja aes.h arc4.h ascon.h asn.h asn_public.h blake2.h bn.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cryptocb.h curve25519.h curve448.h des3.h dh.h doxygen_groups.h doxygen_pages.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h evp.h hash.h hmac.h iotsafe.h kdf.h logging.h md2.h md4.h md5.h memory.h ocsp.h pem.h pkcs11.h pkcs7.h poly1305.h psa.h pwdbased.h quic.h random.h ripemd.h rsa.h sakke.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h srp.h ssl.h tfm.h types.h wc_encrypt.h wc_port.h wolfio.h
formats
html
html_changes
search search.css search.js
customdoxygen.css doxygen.css menu.js menudata.js tabs.css
Doxyfile footer.html header.html mainpage.dox
pdf Doxyfile header.tex
images wolfssl_logo.png
QUIC.md README.txt README_DOXYGEN check_api.sh generate_documentation.sh include.am
examples
asn1 asn1.c dumpasn1.cfg gen_oid_names.rb include.am oid_names.h
async Makefile README.md async_client.c async_server.c async_tls.c async_tls.h include.am user_settings.h
benchmark include.am tls_bench.c tls_bench.h
client client.c client.h client.sln client.vcproj client.vcxproj include.am
configs README.md include.am user_settings_EBSnet.h user_settings_all.h user_settings_arduino.h user_settings_baremetal.h user_settings_ca.h user_settings_curve25519nonblock.h user_settings_dtls13.h user_settings_eccnonblock.h user_settings_espressif.h user_settings_fipsv2.h user_settings_fipsv5.h user_settings_min_ecc.h user_settings_openssl_compat.h user_settings_pkcs7.h user_settings_platformio.h user_settings_pq.h user_settings_rsa_only.h user_settings_stm32.h user_settings_template.h user_settings_tls12.h user_settings_tls13.h user_settings_wolfboot_keytools.h user_settings_wolfssh.h user_settings_wolftpm.h
crypto_policies
default wolfssl.txt
future wolfssl.txt
legacy wolfssl.txt
echoclient echoclient.c echoclient.h echoclient.sln echoclient.vcproj echoclient.vcxproj include.am quit
echoserver echoserver.c echoserver.h echoserver.sln echoserver.vcproj echoserver.vcxproj include.am
ocsp_responder include.am ocsp_responder.c ocsp_responder.h
pem include.am pem.c
sctp include.am sctp-client-dtls.c sctp-client.c sctp-server-dtls.c sctp-server.c
server include.am server.c server.h server.sln server.vcproj server.vcxproj
README.md include.am
linuxkm
patches
5.10.17 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v10v17.patch
5.10.236 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v10v236.patch
5.14.0-570.58.1.el9_6 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v14-570v58v1-el9_6.patch
5.15 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v15.patch
5.17 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v17.patch
5.17-ubuntu-jammy-tegra WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v17-ubuntu-jammy-tegra.patch
6.1.73 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v1v73.patch
6.12 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v12.patch
6.15 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-6v15.patch
7.0 WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-7v0.patch
regen-patches.sh
Kbuild Makefile README.md get_thread_size.c include.am linuxkm-fips-hash-wrapper.sh linuxkm-fips-hash.c linuxkm_memory.c linuxkm_memory.h linuxkm_wc_port.h lkcapi_aes_glue.c lkcapi_dh_glue.c lkcapi_ecdh_glue.c lkcapi_ecdsa_glue.c lkcapi_glue.c lkcapi_rsa_glue.c lkcapi_sha_glue.c module_exports.c.template module_hooks.c pie_redirect_table.c wolfcrypt.lds x86_vector_register_glue.c
m4 ax_add_am_macro.m4 ax_am_jobserver.m4 ax_am_macros.m4 ax_append_compile_flags.m4 ax_append_flag.m4 ax_append_link_flags.m4 ax_append_to_file.m4 ax_atomic.m4 ax_bsdkm.m4 ax_check_compile_flag.m4 ax_check_link_flag.m4 ax_compiler_version.m4 ax_count_cpus.m4 ax_create_generic_config.m4 ax_debug.m4 ax_file_escapes.m4 ax_harden_compiler_flags.m4 ax_linuxkm.m4 ax_print_to_file.m4 ax_pthread.m4 ax_require_defined.m4 ax_tls.m4 ax_vcs_checkout.m4 hexversion.m4 lib_socket_nsl.m4 visibility.m4
mcapi
wolfcrypt_mcapi.X
nbproject configurations.xml include.am project.xml
Makefile
wolfcrypt_test.X
nbproject configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
zlib.X
nbproject configurations.xml include.am project.xml
Makefile
PIC32MZ-serial.h README crypto.c crypto.h include.am mcapi_test.c user_settings.h
mplabx
wolfcrypt_benchmark.X
nbproject configurations.xml include.am project.xml
Makefile
wolfcrypt_test.X
nbproject configurations.xml include.am project.xml
Makefile
wolfssl.X
nbproject configurations.xml include.am project.xml
Makefile
PIC32MZ-serial.h README benchmark_main.c include.am test_main.c user_settings.h
mqx
util_lib
Sources include.am util.c util.h
wolfcrypt_benchmark
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfcrypt_benchmark_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
wolfcrypt_test
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfcrypt_test_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
wolfssl include.am
wolfssl_client
Debugger K70FN1M0.mem init_kinetis.tcl mass_erase_kinetis.tcl
Sources include.am main.c main.h
ReferencedRSESystems.xml wolfssl_client_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launch
README
rpm include.am spec.in
scripts
bench bench_functions.sh
aria-cmake-build-test.sh asn1_oid_sum.pl benchmark.test benchmark_compare.sh cleanup_testfiles.sh crl-gen-openssl.test crl-revoked.test dertoc.pl dtls.test dtlscid.test external.test google.test include.am makedistsmall.sh memtest.sh ocsp-responder-openssl-interop.test ocsp-stapling-with-ca-as-responder.test ocsp-stapling-with-wolfssl-responder.test ocsp-stapling.test ocsp-stapling2.test ocsp-stapling_tls13multi.test ocsp.test openssl.test openssl_srtp.test pem.test ping.test pkcallbacks.test psk.test resume.test rsapss.test sniffer-gen.sh sniffer-ipv6.pcap sniffer-static-rsa.pcap sniffer-testsuite.test sniffer-tls12-keylog.out sniffer-tls12-keylog.pcap sniffer-tls12-keylog.sslkeylog sniffer-tls13-dh-resume.pcap sniffer-tls13-dh.pcap sniffer-tls13-ecc-resume.pcap sniffer-tls13-ecc.pcap sniffer-tls13-hrr.pcap sniffer-tls13-keylog.out sniffer-tls13-keylog.pcap sniffer-tls13-keylog.sslkeylog sniffer-tls13-x25519-resume.pcap sniffer-tls13-x25519.pcap stm32l4-v4_0_1_build.sh tls13.test trusted_peer.test unit.test.in user_settings_asm.sh
src bio.c conf.c crl.c dtls.c dtls13.c include.am internal.c keys.c ocsp.c pk.c pk_ec.c pk_rsa.c quic.c sniffer.c ssl.c ssl_api_cert.c ssl_api_crl_ocsp.c ssl_api_pk.c ssl_asn1.c ssl_bn.c ssl_certman.c ssl_crypto.c ssl_ech.c ssl_load.c ssl_misc.c ssl_p7p12.c ssl_sess.c ssl_sk.c tls.c tls13.c wolfio.c x509.c x509_str.c
sslSniffer
sslSnifferTest README_WIN.md include.am snifftest.c sslSniffTest.vcproj sslSniffTest.vcxproj
README.md sslSniffer.vcproj sslSniffer.vcxproj
support gen-debug-trace-error-codes.sh include.am wolfssl.pc.in
tests
api api.h api_decl.h create_ocsp_test_blobs.py include.am test_aes.c test_aes.h test_arc4.c test_arc4.h test_ascon.c test_ascon.h test_ascon_kats.h test_asn.c test_asn.h test_blake2.c test_blake2.h test_camellia.c test_camellia.h test_certman.c test_certman.h test_chacha.c test_chacha.h test_chacha20_poly1305.c test_chacha20_poly1305.h test_cmac.c test_cmac.h test_curve25519.c test_curve25519.h test_curve448.c test_curve448.h test_des3.c test_des3.h test_dh.c test_dh.h test_digest.h test_dsa.c test_dsa.h test_dtls.c test_dtls.h test_ecc.c test_ecc.h test_ed25519.c test_ed25519.h test_ed448.c test_ed448.h test_evp.c test_evp.h test_evp_cipher.c test_evp_cipher.h test_evp_digest.c test_evp_digest.h test_evp_pkey.c test_evp_pkey.h test_hash.c test_hash.h test_hmac.c test_hmac.h test_md2.c test_md2.h test_md4.c test_md4.h test_md5.c test_md5.h test_mldsa.c test_mldsa.h test_mlkem.c test_mlkem.h test_ocsp.c test_ocsp.h test_ocsp_test_blobs.h test_ossl_asn1.c test_ossl_asn1.h test_ossl_bio.c test_ossl_bio.h test_ossl_bn.c test_ossl_bn.h test_ossl_cipher.c test_ossl_cipher.h test_ossl_dgst.c test_ossl_dgst.h test_ossl_dh.c test_ossl_dh.h test_ossl_dsa.c test_ossl_dsa.h test_ossl_ec.c test_ossl_ec.h test_ossl_ecx.c test_ossl_ecx.h test_ossl_mac.c test_ossl_mac.h test_ossl_obj.c test_ossl_obj.h test_ossl_p7p12.c test_ossl_p7p12.h test_ossl_pem.c test_ossl_pem.h test_ossl_rand.c test_ossl_rand.h test_ossl_rsa.c test_ossl_rsa.h test_ossl_sk.c test_ossl_sk.h test_ossl_x509.c test_ossl_x509.h test_ossl_x509_acert.c test_ossl_x509_acert.h test_ossl_x509_crypto.c test_ossl_x509_crypto.h test_ossl_x509_ext.c test_ossl_x509_ext.h test_ossl_x509_info.c test_ossl_x509_info.h test_ossl_x509_io.c test_ossl_x509_io.h test_ossl_x509_lu.c test_ossl_x509_lu.h test_ossl_x509_name.c test_ossl_x509_name.h test_ossl_x509_pk.c test_ossl_x509_pk.h test_ossl_x509_str.c test_ossl_x509_str.h test_ossl_x509_vp.c test_ossl_x509_vp.h test_pkcs12.c test_pkcs12.h test_pkcs7.c test_pkcs7.h test_poly1305.c test_poly1305.h test_random.c test_random.h test_rc2.c test_rc2.h test_ripemd.c test_ripemd.h test_rsa.c test_rsa.h test_sha.c test_sha.h test_sha256.c test_sha256.h test_sha3.c test_sha3.h test_sha512.c test_sha512.h test_she.c test_she.h test_signature.c test_signature.h test_slhdsa.c test_slhdsa.h test_sm2.c test_sm2.h test_sm3.c test_sm3.h test_sm4.c test_sm4.h test_tls.c test_tls.h test_tls13.c test_tls13.h test_tls_ext.c test_tls_ext.h test_wc_encrypt.c test_wc_encrypt.h test_wolfmath.c test_wolfmath.h test_x509.c test_x509.h
emnet
IP IP.h
Makefile emnet_nonblock_test.c emnet_shim.c
freertos-mem-track-repro FreeRTOS.h repro.c run.sh semphr.h task.h user_settings.h
swdev .gitignore Makefile README.md swdev.c swdev.h swdev_loader.c swdev_loader.h user_settings.h
CONF_FILES_README.md NCONF_test.cnf README TXT_DB.txt api.c include.am quic.c srp.c suites.c test-altchains.conf test-chains.conf test-dhprime.conf test-dtls-downgrade.conf test-dtls-fails-cipher.conf test-dtls-fails.conf test-dtls-group.conf test-dtls-mtu.conf test-dtls-reneg-client.conf test-dtls-reneg-server.conf test-dtls-resume.conf test-dtls-sha2.conf test-dtls-srtp-fails.conf test-dtls-srtp.conf test-dtls.conf test-dtls13-cid.conf test-dtls13-downgrade-fails.conf test-dtls13-downgrade.conf test-dtls13-pq-hybrid-extra-frag.conf test-dtls13-pq-hybrid-extra.conf test-dtls13-pq-hybrid-frag.conf test-dtls13-pq-standalone-frag.conf test-dtls13-pq-standalone.conf test-dtls13-psk.conf test-dtls13.conf test-ecc-cust-curves.conf test-ed25519.conf test-ed448.conf test-enckeys.conf test-fails.conf test-maxfrag-dtls.conf test-maxfrag.conf test-p521.conf test-psk-no-id-sha2.conf test-psk-no-id.conf test-psk.conf test-rsapss.conf test-sctp-sha2.conf test-sctp.conf test-sha2.conf test-sig.conf test-sm2.conf test-tls-downgrade.conf test-tls13-down.conf test-tls13-ecc.conf test-tls13-pq-hybrid-extra.conf test-tls13-pq-hybrid.conf test-tls13-pq-standalone.conf test-tls13-psk-certs.conf test-tls13-psk.conf test-tls13-slhdsa-fail.conf test-tls13-slhdsa-sha2.conf test-tls13-slhdsa-shake.conf test-tls13.conf test-trustpeer.conf test.conf unit.c unit.h utils.c utils.h w64wrapper.c
testsuite include.am testsuite.c testsuite.sln testsuite.vcproj testsuite.vcxproj utils.c utils.h
tirtos
packages
ti
net
wolfssl
tests
EK_TM4C1294XL
wolfcrypt
benchmark TM4C1294NC.icf benchmark.cfg main.c package.bld.hide package.xdc
test TM4C1294NC.icf main.c package.bld.hide package.xdc test.cfg
package.bld package.xdc package.xs
.gitignore README include.am products.mak wolfssl.bld wolfssl.mak
wolfcrypt
benchmark README.md benchmark-VS2022.sln benchmark-VS2022.vcxproj benchmark-VS2022.vcxproj.user benchmark.c benchmark.h benchmark.sln benchmark.vcproj benchmark.vcxproj include.am
src
port
Espressif
esp_crt_bundle README.md cacrt_all.pem cacrt_deprecated.pem cacrt_local.pem esp_crt_bundle.c gen_crt_bundle.py pio_install_cryptography.py
README.md esp32_aes.c esp32_mp.c esp32_sha.c esp32_util.c esp_sdk_mem_lib.c esp_sdk_time_lib.c esp_sdk_wifi_lib.c
Renesas README.md renesas_common.c renesas_fspsm_aes.c renesas_fspsm_rsa.c renesas_fspsm_sha.c renesas_fspsm_util.c renesas_rx64_hw_sha.c renesas_rx64_hw_util.c renesas_tsip_aes.c renesas_tsip_rsa.c renesas_tsip_sha.c renesas_tsip_util.c
af_alg afalg_aes.c afalg_hash.c wc_afalg.c
aria aria-crypt.c aria-cryptocb.c
arm armv8-32-aes-asm.S armv8-32-aes-asm_c.c armv8-32-chacha-asm.S armv8-32-chacha-asm_c.c armv8-32-curve25519.S armv8-32-curve25519_c.c armv8-32-mlkem-asm.S armv8-32-mlkem-asm_c.c armv8-32-poly1305-asm.S armv8-32-poly1305-asm_c.c armv8-32-sha256-asm.S armv8-32-sha256-asm_c.c armv8-32-sha3-asm.S armv8-32-sha3-asm_c.c armv8-32-sha512-asm.S armv8-32-sha512-asm_c.c armv8-aes-asm.S armv8-aes-asm_c.c armv8-aes.c armv8-chacha-asm.S armv8-chacha-asm_c.c armv8-curve25519.S armv8-curve25519_c.c armv8-mlkem-asm.S armv8-mlkem-asm_c.c armv8-poly1305-asm.S armv8-poly1305-asm_c.c armv8-sha256-asm.S armv8-sha256-asm_c.c armv8-sha256.c armv8-sha3-asm.S armv8-sha3-asm_c.c armv8-sha512-asm.S armv8-sha512-asm_c.c armv8-sha512.c cryptoCell.c cryptoCellHash.c thumb2-aes-asm.S thumb2-aes-asm_c.c thumb2-chacha-asm.S thumb2-chacha-asm_c.c thumb2-curve25519.S thumb2-curve25519_c.c thumb2-mlkem-asm.S thumb2-mlkem-asm_c.c thumb2-poly1305-asm.S thumb2-poly1305-asm_c.c thumb2-sha256-asm.S thumb2-sha256-asm_c.c thumb2-sha3-asm.S thumb2-sha3-asm_c.c thumb2-sha512-asm.S thumb2-sha512-asm_c.c
atmel README.md atmel.c
autosar README.md cryif.c crypto.c csm.c include.am test.c
caam README.md caam_aes.c caam_doc.pdf caam_driver.c caam_error.c caam_integrity.c caam_qnx.c caam_sha.c wolfcaam_aes.c wolfcaam_cmac.c wolfcaam_ecdsa.c wolfcaam_fsl_nxp.c wolfcaam_hash.c wolfcaam_hmac.c wolfcaam_init.c wolfcaam_qnx.c wolfcaam_rsa.c wolfcaam_seco.c wolfcaam_x25519.c
cavium README.md README_Octeon.md cavium_nitrox.c cavium_octeon_sync.c
cuda README.md aes-cuda.cu
cypress README.md psoc6_crypto.c
devcrypto README.md devcrypto_aes.c devcrypto_ecdsa.c devcrypto_hash.c devcrypto_hmac.c devcrypto_rsa.c devcrypto_x25519.c wc_devcrypto.c
intel README.md quickassist.c quickassist_mem.c quickassist_sync.c
iotsafe iotsafe.c
kcapi README.md kcapi_aes.c kcapi_dh.c kcapi_ecc.c kcapi_hash.c kcapi_hmac.c kcapi_rsa.c
liboqs liboqs.c
maxim README.md max3266x.c maxq10xx.c
mynewt mynewt_port.c
nxp README.md README_SE050.md casper_port.c dcp_port.c hashcrypt_port.c ksdk_port.c se050_port.c
pic32 pic32mz-crypt.c
ppc32 ppc32-sha256-asm.S ppc32-sha256-asm_c.c ppc32-sha256-asm_cr.c
psa README.md psa.c psa_aes.c psa_hash.c psa_pkcbs.c
riscv riscv-64-aes.c riscv-64-chacha.c riscv-64-poly1305.c riscv-64-sha256.c riscv-64-sha3.c riscv-64-sha512.c
rpi_pico README.md pico.c
silabs README.md silabs_aes.c silabs_ecc.c silabs_hash.c silabs_random.c
st README.md STM32MP13.md STM32MP25.md stm32.c stsafe.c
ti ti-aes.c ti-ccm.c ti-des3.c ti-hash.c
tropicsquare README.md tropic01.c
xilinx xil-aesgcm.c xil-sha3.c xil-versal-glue.c xil-versal-trng.c
nrf51.c
ASN_TEMPLATE.md aes.c aes_asm.S aes_asm.asm aes_gcm_asm.S aes_gcm_asm.asm aes_gcm_x86_asm.S aes_xts_asm.S aes_xts_asm.asm arc4.c ascon.c asm.c asn.c asn_orig.c async.c blake2b.c blake2s.c camellia.c chacha.c chacha20_poly1305.c chacha_asm.S chacha_asm.asm cmac.c coding.c compress.c cpuid.c cryptocb.c curve25519.c curve448.c des3.c dh.c dilithium.c dsa.c ecc.c ecc_fp.c eccsi.c ed25519.c ed448.c error.c evp.c evp_pk.c falcon.c fe_448.c fe_low_mem.c fe_operations.c fe_x25519_128.h fe_x25519_asm.S fp_mont_small.i fp_mul_comba_12.i fp_mul_comba_17.i fp_mul_comba_20.i fp_mul_comba_24.i fp_mul_comba_28.i fp_mul_comba_3.i fp_mul_comba_32.i fp_mul_comba_4.i fp_mul_comba_48.i fp_mul_comba_6.i fp_mul_comba_64.i fp_mul_comba_7.i fp_mul_comba_8.i fp_mul_comba_9.i fp_mul_comba_small_set.i fp_sqr_comba_12.i fp_sqr_comba_17.i fp_sqr_comba_20.i fp_sqr_comba_24.i fp_sqr_comba_28.i fp_sqr_comba_3.i fp_sqr_comba_32.i fp_sqr_comba_4.i fp_sqr_comba_48.i fp_sqr_comba_6.i fp_sqr_comba_64.i fp_sqr_comba_7.i fp_sqr_comba_8.i fp_sqr_comba_9.i fp_sqr_comba_small_set.i ge_448.c ge_low_mem.c ge_operations.c hash.c hmac.c hpke.c include.am integer.c kdf.c logging.c md2.c md4.c md5.c memory.c misc.c pkcs12.c pkcs7.c poly1305.c poly1305_asm.S poly1305_asm.asm puf.c pwdbased.c random.c rc2.c ripemd.c rng_bank.c rsa.c sakke.c sha.c sha256.c sha256_asm.S sha3.c sha3_asm.S sha512.c sha512_asm.S signature.c siphash.c sm2.c sm3.c sm3_asm.S sm4.c sp_arm32.c sp_arm64.c sp_armthumb.c sp_c32.c sp_c64.c sp_cortexm.c sp_dsp32.c sp_int.c sp_sm2_arm32.c sp_sm2_arm64.c sp_sm2_armthumb.c sp_sm2_c32.c sp_sm2_c64.c sp_sm2_cortexm.c sp_sm2_x86_64.c sp_sm2_x86_64_asm.S sp_x86_64.c sp_x86_64_asm.S sp_x86_64_asm.asm srp.c tfm.c wc_dsp.c wc_encrypt.c wc_lms.c wc_lms_impl.c wc_mldsa_asm.S wc_mlkem.c wc_mlkem_asm.S wc_mlkem_poly.c wc_pkcs11.c wc_port.c wc_she.c wc_slhdsa.c wc_xmss.c wc_xmss_impl.c wolfentropy.c wolfevent.c wolfmath.c
test README.md include.am test-VS2022.sln test-VS2022.vcxproj test-VS2022.vcxproj.user test.c test.h test.sln test.vcproj test_paths.h.in
wolfssl
openssl aes.h asn1.h asn1t.h bio.h bn.h buffer.h camellia.h cmac.h cms.h compat_types.h conf.h crypto.h des.h dh.h dsa.h ec.h ec25519.h ec448.h ecdh.h ecdsa.h ed25519.h ed448.h engine.h err.h evp.h fips_rand.h hmac.h include.am kdf.h lhash.h md4.h md5.h modes.h obj_mac.h objects.h ocsp.h opensslconf.h opensslv.h ossl_typ.h pem.h pkcs12.h pkcs7.h rand.h rc4.h ripemd.h rsa.h safestack.h sha.h sha3.h srp.h ssl.h ssl23.h stack.h tls1.h txt_db.h ui.h x509.h x509_vfy.h x509v3.h
wolfcrypt
port
Espressif esp-sdk-lib.h esp32-crypt.h esp_crt_bundle.h
Renesas renesas-fspsm-crypt.h renesas-fspsm-types.h renesas-rx64-hw-crypt.h renesas-tsip-crypt.h renesas_cmn.h renesas_fspsm_internal.h renesas_sync.h renesas_tsip_internal.h renesas_tsip_types.h
af_alg afalg_hash.h wc_afalg.h
aria aria-crypt.h aria-cryptocb.h
arm cryptoCell.h
atmel atmel.h
autosar CryIf.h Crypto.h Csm.h StandardTypes.h
caam caam_driver.h caam_error.h caam_qnx.h wolfcaam.h wolfcaam_aes.h wolfcaam_cmac.h wolfcaam_ecdsa.h wolfcaam_fsl_nxp.h wolfcaam_hash.h wolfcaam_qnx.h wolfcaam_rsa.h wolfcaam_seco.h wolfcaam_sha.h wolfcaam_x25519.h
cavium cavium_nitrox.h cavium_octeon_sync.h
cypress psoc6_crypto.h
devcrypto wc_devcrypto.h
intel quickassist.h quickassist_mem.h quickassist_sync.h
iotsafe iotsafe.h
kcapi kcapi_dh.h kcapi_ecc.h kcapi_hash.h kcapi_hmac.h kcapi_rsa.h wc_kcapi.h
liboqs liboqs.h
maxim max3266x-cryptocb.h max3266x.h maxq10xx.h
nxp casper_port.h dcp_port.h hashcrypt_port.h ksdk_port.h se050_port.h
pic32 pic32mz-crypt.h
psa psa.h
riscv riscv-64-asm.h
rpi_pico pico.h
silabs silabs_aes.h silabs_ecc.h silabs_hash.h silabs_random.h
st stm32.h stsafe.h
ti ti-ccm.h ti-hash.h
tropicsquare tropic01.h
xilinx xil-sha3.h xil-versal-glue.h xil-versal-trng.h
nrf51.h
aes.h arc4.h ascon.h asn.h asn_public.h async.h blake2-impl.h blake2-int.h blake2.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cpuid.h cryptocb.h curve25519.h curve448.h des3.h dh.h dilithium.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h falcon.h fe_448.h fe_operations.h fips_test.h ge_448.h ge_operations.h hash.h hmac.h hpke.h include.am integer.h kdf.h libwolfssl_sources.h libwolfssl_sources_asm.h logging.h md2.h md4.h md5.h mem_track.h memory.h misc.h mpi_class.h mpi_superclass.h oid_sum.h pkcs11.h pkcs12.h pkcs7.h poly1305.h puf.h pwdbased.h random.h rc2.h ripemd.h rng_bank.h rsa.h sakke.h selftest.h settings.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h sm2.h sm3.h sm4.h sp.h sp_int.h srp.h tfm.h types.h visibility.h wc_encrypt.h wc_lms.h wc_mlkem.h wc_pkcs11.h wc_port.h wc_she.h wc_slhdsa.h wc_xmss.h wolfentropy.h wolfevent.h wolfmath.h
callbacks.h certs_test.h certs_test_sm.h crl.h error-ssl.h include.am internal.h ocsp.h options.h.in quic.h sniffer.h sniffer_error.h sniffer_error.rc ssl.h test.h version.h version.h.in wolfio.h
wrapper
Ada
examples
src aes_verify_main.adb rsa_verify_main.adb sha256_main.adb spark_sockets.adb spark_sockets.ads spark_terminal.adb spark_terminal.ads tls_client.adb tls_client.ads tls_client_main.adb tls_server.adb tls_server.ads tls_server_main.adb
.gitignore alire.toml examples.gpr
tests
src
support test_support.adb test_support.ads tests_root_suite.adb tests_root_suite.ads
aes_bindings_tests.adb aes_bindings_tests.ads rsa_verify_bindings_tests.adb rsa_verify_bindings_tests.ads sha256_bindings_tests.adb sha256_bindings_tests.ads tests.adb
.gitignore README.md alire.toml tests.gpr valgrind.supp
.gitignore README.md ada_binding.c alire.toml default.gpr include.am restricted.adc user_settings.h wolfssl-full_runtime.adb wolfssl-full_runtime.ads wolfssl.adb wolfssl.ads wolfssl.gpr
CSharp
wolfCrypt-Test
Properties AssemblyInfo.cs
App.config wolfCrypt-Test.cs wolfCrypt-Test.csproj
wolfSSL-DTLS-PSK-Server
Properties AssemblyInfo.cs
App.config wolfSSL-DTLS-PSK-Server.cs wolfSSL-DTLS-PSK-Server.csproj
wolfSSL-DTLS-Server
Properties AssemblyInfo.cs
App.config wolfSSL-DTLS-Server.cs wolfSSL-DTLS-Server.csproj
wolfSSL-Example-IOCallbacks
Properties AssemblyInfo.cs
App.config wolfSSL-Example-IOCallbacks.cs wolfSSL-Example-IOCallbacks.csproj
wolfSSL-TLS-Client
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-Client.cs wolfSSL-TLS-Client.csproj
wolfSSL-TLS-PSK-Client
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-PSK-Client.cs wolfSSL-TLS-PSK-Client.csproj
wolfSSL-TLS-PSK-Server
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-PSK-Server.cs wolfSSL-TLS-PSK-Server.csproj
wolfSSL-TLS-Server
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-Server.cs wolfSSL-TLS-Server.csproj
wolfSSL-TLS-ServerThreaded
Properties AssemblyInfo.cs
App.config wolfSSL-TLS-ServerThreaded.cs wolfSSL-TLS-ServerThreaded.csproj
wolfSSL_CSharp
Properties AssemblyInfo.cs Resources.Designer.cs Resources.resx
X509.cs wolfCrypt.cs wolfSSL.cs wolfSSL_CSharp.csproj
README.md include.am user_settings.h wolfSSL_CSharp.sln wolfssl.vcxproj
python README.md
rust
wolfssl-wolfcrypt
src aes.rs blake2.rs chacha20_poly1305.rs cmac.rs cmac_mac.rs curve25519.rs dh.rs dilithium.rs ecc.rs ecdsa.rs ed25519.rs ed448.rs fips.rs hkdf.rs hmac.rs hmac_mac.rs kdf.rs lib.rs lms.rs mlkem.rs mlkem_kem.rs pbkdf2_password_hash.rs prf.rs random.rs rsa.rs rsa_pkcs1v15.rs sha.rs sha_digest.rs sys.rs
tests
common mod.rs
test_aes.rs test_blake2.rs test_chacha20_poly1305.rs test_cmac.rs test_cmac_mac.rs test_curve25519.rs test_dh.rs test_dilithium.rs test_ecc.rs test_ecdsa.rs test_ed25519.rs test_ed448.rs test_hkdf.rs test_hmac.rs test_hmac_mac.rs test_kdf.rs test_lms.rs test_mlkem.rs test_mlkem_kem.rs test_pbkdf2_password_hash.rs test_prf.rs test_random.rs test_rsa.rs test_rsa_pkcs1v15.rs test_sha.rs test_sha_digest.rs test_wolfcrypt.rs
CHANGELOG.md Cargo.lock Cargo.toml Makefile README.md build.rs headers.h
Makefile README.md include.am
include.am
zephyr
samples
wolfssl_benchmark
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
CMakeLists.txt README install_test.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_test
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
CMakeLists.txt README install_test.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_tls_sock
boards native_sim.conf
src tls_sock.c
CMakeLists.txt README install_sample.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl_tls_thread
boards native_sim.conf nrf5340dk_nrf5340_cpuapp.conf nrf5340dk_nrf5340_cpuapp_ns.conf
src tls_threaded.c
CMakeLists.txt README install_sample.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
wolfssl options.h
CMakeLists.txt Kconfig Kconfig.tls-generic README.md include.am module.yml user_settings-no-malloc.h user_settings.h zephyr_init.c
.codespellexcludelines .cyignore .editorconfig .gitignore .wolfssl_known_macro_extras AUTHORS CMakeLists.txt CMakePresets.json CMakeSettings.json COPYING ChangeLog.md INSTALL LICENSING LPCExpresso.cproject LPCExpresso.project Makefile.am README README-async.md README.md SCRIPTS-LIST SECURITY-POLICY.md SECURITY-REPORT-TEMPLATE.md Vagrantfile autogen.sh commit-tests.sh configure.ac fips-check.sh fips-hash.sh gencertbuf.pl input pull_to_vagrant.sh quit resource.h stamp-h.in valgrind-bash.supp valgrind-error.sh wnr-example.conf wolfssl-VS2022.vcxproj wolfssl.rc wolfssl.vcproj wolfssl.vcxproj wolfssl64.sln
.clangd .gitignore DOCS.md Makefile README.md assert.c core.c crypto.c env.c fs.c http.c ini.c json.c log.c luna.h main.c makext.mk path.c process.c request.c sqlite.c stash.c template.c util.c
wolfssl/src/pk_ec.c raw
   1/* pk_ec.c
   2 *
   3 * Copyright (C) 2006-2026 wolfSSL Inc.
   4 *
   5 * This file is part of wolfSSL.
   6 *
   7 * wolfSSL is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 3 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * wolfSSL is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20 */
  21
  22#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
  23
  24#include <wolfssl/internal.h>
  25#ifndef WC_NO_RNG
  26    #include <wolfssl/wolfcrypt/random.h>
  27#endif
  28
  29#ifdef HAVE_ECC
  30    #include <wolfssl/wolfcrypt/ecc.h>
  31    #ifdef HAVE_SELFTEST
  32        /* point compression types. */
  33        #define ECC_POINT_COMP_EVEN 0x02
  34        #define ECC_POINT_COMP_ODD  0x03
  35        #define ECC_POINT_UNCOMP    0x04
  36    #endif
  37#endif
  38#ifndef WOLFSSL_HAVE_ECC_KEY_GET_PRIV
  39    /* FIPS build has replaced ecc.h. */
  40    #define wc_ecc_key_get_priv(key) (&((key)->k))
  41    #define WOLFSSL_HAVE_ECC_KEY_GET_PRIV
  42#endif
  43
  44#if !defined(WOLFSSL_PK_EC_INCLUDED)
  45    #ifndef WOLFSSL_IGNORE_FILE_WARN
  46        #warning pk_ec.c does not need to be compiled separately from ssl.c
  47    #endif
  48#else
  49
  50/*******************************************************************************
  51 * START OF EC API
  52 ******************************************************************************/
  53
  54#ifdef HAVE_ECC
  55
  56#if defined(OPENSSL_EXTRA)
  57
  58/* Start EC_curve */
  59
  60/* Get the NIST name for the numeric ID.
  61 *
  62 * @param [in] nid  Numeric ID of an EC curve.
  63 * @return  String representing NIST name of EC curve on success.
  64 * @return  NULL on error.
  65 */
  66const char* wolfSSL_EC_curve_nid2nist(int nid)
  67{
  68    const char* name = NULL;
  69    const WOLF_EC_NIST_NAME* nist_name;
  70
  71    /* Attempt to find the curve info matching the NID passed in. */
  72    for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  73        if (nist_name->nid == nid) {
  74            /* NID found - return name. */
  75            name = nist_name->name;
  76            break;
  77        }
  78    }
  79
  80    return name;
  81}
  82
  83/* Get the numeric ID for the NIST name.
  84 *
  85 * @param [in] name  NIST name of EC curve.
  86 * @return  NID matching NIST name on success.
  87 * @return  0 on error.
  88 */
  89int wolfSSL_EC_curve_nist2nid(const char* name)
  90{
  91    int nid = 0;
  92    const WOLF_EC_NIST_NAME* nist_name;
  93
  94    /* Attempt to find the curve info matching the NIST name passed in. */
  95    for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
  96        if (XSTRCMP(nist_name->name, name) == 0) {
  97            /* Name found - return NID. */
  98            nid = nist_name->nid;
  99            break;
 100        }
 101    }
 102
 103    return nid;
 104}
 105
 106#endif /* OPENSSL_EXTRA */
 107
 108/* End EC_curve */
 109
 110/* Start EC_METHOD */
 111
 112#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
 113/* Get the EC method of the EC group object.
 114 *
 115 * wolfSSL doesn't use method tables. Implementation used is dependent upon
 116 * the NID.
 117 *
 118 * @param [in] group  EC group object.
 119 * @return  EC method.
 120 */
 121const WOLFSSL_EC_METHOD* wolfSSL_EC_GROUP_method_of(
 122    const WOLFSSL_EC_GROUP *group)
 123{
 124    /* No method table used so just return the same object. */
 125    return group;
 126}
 127
 128/* Get field type for method.
 129 *
 130 * Only prime fields are supported.
 131 *
 132 * @param [in] meth  EC method.
 133 * @return  X9.63 prime field NID on success.
 134 * @return  0 on error.
 135 */
 136int wolfSSL_EC_METHOD_get_field_type(const WOLFSSL_EC_METHOD *meth)
 137{
 138    int nid = 0;
 139
 140    if (meth != NULL) {
 141        /* Only field type supported by code base. */
 142        nid = WC_NID_X9_62_prime_field;
 143    }
 144
 145    return nid;
 146}
 147#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
 148
 149/* End EC_METHOD */
 150
 151/* Start EC_GROUP */
 152
 153#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
 154/* Converts ECC curve enum values in ecc_curve_id to the associated OpenSSL NID
 155 * value.
 156 *
 157 * @param [in] n  ECC curve id.
 158 * @return  ECC curve NID (OpenSSL compatible value).
 159 */
 160int EccEnumToNID(int n)
 161{
 162    WOLFSSL_ENTER("EccEnumToNID");
 163
 164    switch(n) {
 165        case ECC_SECP192R1:
 166            return WC_NID_X9_62_prime192v1;
 167        case ECC_PRIME192V2:
 168            return WC_NID_X9_62_prime192v2;
 169        case ECC_PRIME192V3:
 170            return WC_NID_X9_62_prime192v3;
 171        case ECC_PRIME239V1:
 172            return WC_NID_X9_62_prime239v1;
 173        case ECC_PRIME239V2:
 174            return WC_NID_X9_62_prime239v2;
 175        case ECC_PRIME239V3:
 176            return WC_NID_X9_62_prime239v3;
 177        case ECC_SECP256R1:
 178            return WC_NID_X9_62_prime256v1;
 179        case ECC_SECP112R1:
 180            return WC_NID_secp112r1;
 181        case ECC_SECP112R2:
 182            return WC_NID_secp112r2;
 183        case ECC_SECP128R1:
 184            return WC_NID_secp128r1;
 185        case ECC_SECP128R2:
 186            return WC_NID_secp128r2;
 187        case ECC_SECP160R1:
 188            return WC_NID_secp160r1;
 189        case ECC_SECP160R2:
 190            return WC_NID_secp160r2;
 191        case ECC_SECP224R1:
 192            return WC_NID_secp224r1;
 193        case ECC_SECP384R1:
 194            return WC_NID_secp384r1;
 195        case ECC_SECP521R1:
 196            return WC_NID_secp521r1;
 197        case ECC_SECP160K1:
 198            return WC_NID_secp160k1;
 199        case ECC_SECP192K1:
 200            return WC_NID_secp192k1;
 201        case ECC_SECP224K1:
 202            return WC_NID_secp224k1;
 203        case ECC_SECP256K1:
 204            return WC_NID_secp256k1;
 205        case ECC_BRAINPOOLP160R1:
 206            return WC_NID_brainpoolP160r1;
 207        case ECC_BRAINPOOLP192R1:
 208            return WC_NID_brainpoolP192r1;
 209        case ECC_BRAINPOOLP224R1:
 210            return WC_NID_brainpoolP224r1;
 211        case ECC_BRAINPOOLP256R1:
 212            return WC_NID_brainpoolP256r1;
 213        case ECC_BRAINPOOLP320R1:
 214            return WC_NID_brainpoolP320r1;
 215        case ECC_BRAINPOOLP384R1:
 216            return WC_NID_brainpoolP384r1;
 217        case ECC_BRAINPOOLP512R1:
 218            return WC_NID_brainpoolP512r1;
 219    #ifdef WOLFSSL_SM2
 220        case ECC_SM2P256V1:
 221            return WC_NID_sm2;
 222    #endif
 223        default:
 224            WOLFSSL_MSG("NID not found");
 225            return WOLFSSL_FATAL_ERROR;
 226    }
 227}
 228#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
 229
 230#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
 231/* Converts OpenSSL NID of EC curve to the enum value in ecc_curve_id
 232 *
 233 * Used by ecc_sets[].
 234 *
 235 * @param [in] n  OpenSSL NID of EC curve.
 236 * @return  wolfCrypt EC curve id.
 237 * @return  -1 on error.
 238 */
 239int NIDToEccEnum(int nid)
 240{
 241    int id;
 242
 243    WOLFSSL_ENTER("NIDToEccEnum");
 244
 245    switch (nid) {
 246        case WC_NID_X9_62_prime192v1:
 247            id = ECC_SECP192R1;
 248            break;
 249        case WC_NID_X9_62_prime192v2:
 250            id = ECC_PRIME192V2;
 251            break;
 252        case WC_NID_X9_62_prime192v3:
 253            id = ECC_PRIME192V3;
 254            break;
 255        case WC_NID_X9_62_prime239v1:
 256            id = ECC_PRIME239V1;
 257            break;
 258        case WC_NID_X9_62_prime239v2:
 259            id = ECC_PRIME239V2;
 260            break;
 261        case WC_NID_X9_62_prime239v3:
 262            id = ECC_PRIME239V3;
 263            break;
 264        case WC_NID_X9_62_prime256v1:
 265            id = ECC_SECP256R1;
 266            break;
 267        case WC_NID_secp112r1:
 268            id = ECC_SECP112R1;
 269            break;
 270        case WC_NID_secp112r2:
 271            id = ECC_SECP112R2;
 272            break;
 273        case WC_NID_secp128r1:
 274            id = ECC_SECP128R1;
 275            break;
 276        case WC_NID_secp128r2:
 277            id = ECC_SECP128R2;
 278            break;
 279        case WC_NID_secp160r1:
 280            id = ECC_SECP160R1;
 281            break;
 282        case WC_NID_secp160r2:
 283            id = ECC_SECP160R2;
 284            break;
 285        case WC_NID_secp224r1:
 286            id = ECC_SECP224R1;
 287            break;
 288        case WC_NID_secp384r1:
 289            id = ECC_SECP384R1;
 290            break;
 291        case WC_NID_secp521r1:
 292            id = ECC_SECP521R1;
 293            break;
 294        case WC_NID_secp160k1:
 295            id = ECC_SECP160K1;
 296            break;
 297        case WC_NID_secp192k1:
 298            id = ECC_SECP192K1;
 299            break;
 300        case WC_NID_secp224k1:
 301            id = ECC_SECP224K1;
 302            break;
 303        case WC_NID_secp256k1:
 304            id = ECC_SECP256K1;
 305            break;
 306        case WC_NID_brainpoolP160r1:
 307            id = ECC_BRAINPOOLP160R1;
 308            break;
 309        case WC_NID_brainpoolP192r1:
 310            id = ECC_BRAINPOOLP192R1;
 311            break;
 312        case WC_NID_brainpoolP224r1:
 313            id = ECC_BRAINPOOLP224R1;
 314            break;
 315        case WC_NID_brainpoolP256r1:
 316            id = ECC_BRAINPOOLP256R1;
 317            break;
 318        case WC_NID_brainpoolP320r1:
 319            id = ECC_BRAINPOOLP320R1;
 320            break;
 321        case WC_NID_brainpoolP384r1:
 322            id = ECC_BRAINPOOLP384R1;
 323            break;
 324        case WC_NID_brainpoolP512r1:
 325            id = ECC_BRAINPOOLP512R1;
 326            break;
 327        default:
 328            WOLFSSL_MSG("NID not found");
 329            /* -1 on error. */
 330            id = WOLFSSL_FATAL_ERROR;
 331    }
 332
 333    return id;
 334}
 335
 336/* Set the fields of the EC group based on numeric ID.
 337 *
 338 * @param [in, out] group  EC group.
 339 * @param [in]      nid    Numeric ID of an EC curve.
 340 */
 341static void ec_group_set_nid(WOLFSSL_EC_GROUP* group, int nid)
 342{
 343    int eccEnum;
 344    int realNid;
 345
 346    /* Convert ecc_curve_id enum to NID. */
 347    if ((realNid = EccEnumToNID(nid)) != -1) {
 348        /* ecc_curve_id enum passed in - have real NID value set. */
 349        eccEnum = nid;
 350    }
 351    else {
 352        /* NID passed in is OpenSSL type. */
 353        realNid = nid;
 354        /* Convert NID to ecc_curve_id enum. */
 355        eccEnum = NIDToEccEnum(nid);
 356    }
 357
 358    /* Set the numeric ID of the curve */
 359    group->curve_nid = realNid;
 360    /* Initialize index to -1 (i.e. wolfCrypt doesn't support curve). */
 361    group->curve_idx = -1;
 362
 363    /* Find index and OID sum for curve if wolfCrypt supports it. */
 364    if (eccEnum != -1) {
 365        int i;
 366
 367        /* Find id and set the internal curve idx and OID sum. */
 368        for (i = 0; ecc_sets[i].size != 0; i++) {
 369            if (ecc_sets[i].id == eccEnum) {
 370                /* Found id in wolfCrypt supported EC curves. */
 371                group->curve_idx = i;
 372                group->curve_oid = (int)ecc_sets[i].oidSum;
 373                break;
 374            }
 375        }
 376    }
 377}
 378
 379/* Create a new EC group with the numeric ID for an EC curve.
 380 *
 381 * @param [in] nid  Numeric ID of an EC curve.
 382 * @return  New, allocated EC group on success.
 383 * @return  NULL on error.
 384 */
 385WOLFSSL_EC_GROUP* wolfSSL_EC_GROUP_new_by_curve_name(int nid)
 386{
 387    int err = 0;
 388    WOLFSSL_EC_GROUP* group;
 389
 390    WOLFSSL_ENTER("wolfSSL_EC_GROUP_new_by_curve_name");
 391
 392    /* Allocate EC group. */
 393    group = (WOLFSSL_EC_GROUP*)XMALLOC(sizeof(WOLFSSL_EC_GROUP), NULL,
 394        DYNAMIC_TYPE_ECC);
 395    if (group == NULL) {
 396        WOLFSSL_MSG("wolfSSL_EC_GROUP_new_by_curve_name malloc failure");
 397        err = 1;
 398    }
 399
 400    if (!err) {
 401        /* Reset all fields. */
 402        XMEMSET(group, 0, sizeof(WOLFSSL_EC_GROUP));
 403
 404        /* Set the fields of group based on the numeric ID. */
 405        ec_group_set_nid(group, nid);
 406    }
 407
 408    return group;
 409}
 410#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
 411
 412#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
 413/* Dispose of the EC group.
 414 *
 415 * Cannot use group after this call.
 416 *
 417 * @param [in] group  EC group to free.
 418 */
 419void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group)
 420{
 421    WOLFSSL_ENTER("wolfSSL_EC_GROUP_free");
 422
 423    /* Dispose of EC group. */
 424    XFREE(group, NULL, DYNAMIC_TYPE_ECC);
 425}
 426#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
 427
 428#ifdef OPENSSL_EXTRA
 429#ifndef NO_BIO
 430
 431/* Creates an EC group from the DER encoding.
 432 *
 433 * Only named curves supported.
 434 *
 435 * @param [out] group  Reference to EC group object.
 436 * @param [in]  in     Buffer holding DER encoding of curve.
 437 * @param [in]  inSz   Length of data in buffer.
 438 * @return  EC group on success.
 439 * @return  NULL on error.
 440 */
 441static WOLFSSL_EC_GROUP* wolfssl_ec_group_d2i(WOLFSSL_EC_GROUP** group,
 442    const unsigned char** in_pp, long inSz)
 443{
 444    int err = 0;
 445    WOLFSSL_EC_GROUP* ret = NULL;
 446    word32 idx = 0;
 447    word32 oid = 0;
 448    int id = 0;
 449    const unsigned char* in;
 450
 451    if (in_pp == NULL || *in_pp == NULL)
 452        return NULL;
 453
 454    in = *in_pp;
 455
 456    /* Use the group passed in. */
 457    if ((group != NULL) && (*group != NULL)) {
 458        ret = *group;
 459    }
 460
 461    /* Only support named curves. */
 462    if (in[0] != ASN_OBJECT_ID) {
 463        WOLFSSL_ERROR_MSG("Invalid or unsupported encoding");
 464        err = 1;
 465    }
 466    /* Decode the OBJECT ID - expecting an EC curve OID. */
 467    if ((!err) && (GetObjectId(in, &idx, &oid, oidCurveType, (word32)inSz) !=
 468            0)) {
 469        err = 1;
 470    }
 471    if (!err) {
 472        /* Get the internal ID for OID. */
 473        id = wc_ecc_get_oid(oid, NULL, NULL);
 474        if (id < 0) {
 475            err = 1;
 476        }
 477    }
 478    if (!err) {
 479        /* Get the NID for the internal ID. */
 480        int nid = EccEnumToNID(id);
 481        if (ret == NULL) {
 482            /* Create a new EC group with the numeric ID. */
 483            ret = wolfSSL_EC_GROUP_new_by_curve_name(nid);
 484            if (ret == NULL) {
 485                err = 1;
 486            }
 487        }
 488        else {
 489            ec_group_set_nid(ret, nid);
 490        }
 491    }
 492    if ((!err) && (group != NULL)) {
 493        /* Return the EC group through reference. */
 494        *group = ret;
 495    }
 496
 497    if (err) {
 498        if ((ret != NULL) && (ret != *group)) {
 499            wolfSSL_EC_GROUP_free(ret);
 500        }
 501        ret = NULL;
 502    }
 503    else {
 504        *in_pp += idx;
 505    }
 506    return ret;
 507}
 508
 509/* Creates a new EC group from the PEM encoding in the BIO.
 510 *
 511 * @param [in]  bio    BIO to read PEM encoding from.
 512 * @param [out] group  Reference to EC group object.
 513 * @param [in]  cb     Password callback when PEM encrypted.
 514 * @param [in]  pass   NUL terminated string for passphrase when PEM encrypted.
 515 * @return  EC group on success.
 516 * @return  NULL on error.
 517 */
 518WOLFSSL_EC_GROUP* wolfSSL_PEM_read_bio_ECPKParameters(WOLFSSL_BIO* bio,
 519    WOLFSSL_EC_GROUP** group, wc_pem_password_cb* cb, void* pass)
 520{
 521    int err = 0;
 522    WOLFSSL_EC_GROUP* ret = NULL;
 523    DerBuffer*        der = NULL;
 524    int               keyFormat = 0;
 525
 526     if (bio == NULL) {
 527         err = 1;
 528     }
 529
 530    /* Read parameters from BIO and convert PEM to DER. */
 531    if ((!err) && (pem_read_bio_key(bio, cb, pass, ECC_PARAM_TYPE,
 532            &keyFormat, &der) < 0)) {
 533        err = 1;
 534    }
 535    if (!err) {
 536        /* Create EC group from DER encoding. */
 537        const byte** p = (const byte**)&der->buffer;
 538        ret = wolfssl_ec_group_d2i(group, p, der->length);
 539        if (ret == NULL) {
 540            WOLFSSL_ERROR_MSG("Error loading DER buffer into WOLFSSL_EC_GROUP");
 541        }
 542    }
 543
 544    /* Dispose of any allocated data. */
 545    FreeDer(&der);
 546    return ret;
 547}
 548
 549WOLFSSL_EC_GROUP *wolfSSL_d2i_ECPKParameters(WOLFSSL_EC_GROUP **out,
 550        const unsigned char **in, long len)
 551{
 552    return wolfssl_ec_group_d2i(out, in, len);
 553}
 554
 555int wolfSSL_i2d_ECPKParameters(const WOLFSSL_EC_GROUP* grp, unsigned char** pp)
 556{
 557    unsigned char* out = NULL;
 558    int len = 0;
 559    int idx;
 560    const byte* oid = NULL;
 561    word32 oidSz = 0;
 562
 563    if (grp == NULL || !wc_ecc_is_valid_idx(grp->curve_idx) ||
 564            grp->curve_idx < 0)
 565        return WOLFSSL_FATAL_ERROR;
 566
 567    /* Get the actual DER encoding of the OID. ecc_sets[grp->curve_idx].oid
 568     * is just the numerical representation. */
 569    if (wc_ecc_get_oid((word32)grp->curve_oid, &oid, &oidSz) < 0)
 570        return WOLFSSL_FATAL_ERROR;
 571
 572    len = SetObjectId((int)oidSz, NULL) + (int)oidSz;
 573
 574    if (pp == NULL)
 575        return len;
 576
 577    if (*pp == NULL) {
 578        out = (unsigned char*)XMALLOC((size_t)len, NULL, DYNAMIC_TYPE_ASN1);
 579        if (out == NULL)
 580            return WOLFSSL_FATAL_ERROR;
 581    }
 582    else {
 583        out = *pp;
 584    }
 585
 586    idx = SetObjectId((int)oidSz, out);
 587    XMEMCPY(out + idx, oid, oidSz);
 588    if (*pp == NULL)
 589        *pp = out;
 590    else
 591        *pp += len;
 592
 593    return len;
 594}
 595#endif /* !NO_BIO */
 596
 597#if defined(OPENSSL_ALL) && !defined(NO_CERTS)
 598/* Copy an EC group.
 599 *
 600 * Only used by wolfSSL_EC_KEY_dup at this time.
 601 *
 602 * @param [in, out] dst  Destination EC group.
 603 * @param [in]      src  Source EC group.
 604 * @return  0 on success.
 605 */
 606static int wolfssl_ec_group_copy(WOLFSSL_EC_GROUP* dst,
 607    const WOLFSSL_EC_GROUP* src)
 608{
 609    /* Copy the fields. */
 610    dst->curve_idx = src->curve_idx;
 611    dst->curve_nid = src->curve_nid;
 612    dst->curve_oid = src->curve_oid;
 613
 614    return 0;
 615}
 616#endif /* OPENSSL_ALL && !NO_CERTS */
 617
 618/* Copies ecc_key into new WOLFSSL_EC_GROUP object
 619 *
 620 * @param [in] src  EC group to duplicate.
 621 *
 622 * @return  EC group on success.
 623 * @return  NULL on error.
 624 */
 625WOLFSSL_EC_GROUP* wolfSSL_EC_GROUP_dup(const WOLFSSL_EC_GROUP *src)
 626{
 627    WOLFSSL_EC_GROUP* newGroup = NULL;
 628
 629    if (src != NULL) {
 630        /* Create new group base on NID in original EC group. */
 631        newGroup = wolfSSL_EC_GROUP_new_by_curve_name(src->curve_nid);
 632     }
 633
 634    return newGroup;
 635}
 636
 637/* Compare two EC groups.
 638 *
 639 * Return code compliant with OpenSSL.
 640 *
 641 * @param [in] a    First EC group.
 642 * @param [in] b    Second EC group.
 643 * @param [in] ctx  Big number context to use when comparing fields. Unused.
 644 *
 645 * @return  0 if equal.
 646 * @return  1 if not equal.
 647 * @return  -1 on error.
 648 */
 649int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b,
 650                         WOLFSSL_BN_CTX *ctx)
 651{
 652    int ret;
 653
 654    /* No BN operations performed. */
 655    (void)ctx;
 656
 657    WOLFSSL_ENTER("wolfSSL_EC_GROUP_cmp");
 658
 659    /* Validate parameters. */
 660    if ((a == NULL) || (b == NULL)) {
 661        WOLFSSL_MSG("wolfSSL_EC_GROUP_cmp Bad arguments");
 662        /* Return error value. */
 663        ret = WOLFSSL_FATAL_ERROR;
 664    }
 665    /* Compare NID and wolfSSL curve index. */
 666    else {
 667        /* 0 when same, 1 when not. */
 668        ret = ((a->curve_nid == b->curve_nid) &&
 669               (a->curve_idx == b->curve_idx)) ? 0 : 1;
 670    }
 671
 672    return ret;
 673}
 674
 675#ifndef NO_WOLFSSL_STUB
 676/* Set the ASN.1 flag that indicate encoding of curve.
 677 *
 678 * Stub function - flag not used elsewhere.
 679 * Always encoded as named curve.
 680 *
 681 * @param [in] group  EC group to modify.
 682 * @param [in] flag   ASN.1 flag to set. Valid values:
 683 *                    OPENSSL_EC_EXPLICIT_CURVE, OPENSSL_EC_NAMED_CURVE
 684 */
 685void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag)
 686{
 687    (void)group;
 688    (void)flag;
 689
 690    WOLFSSL_ENTER("wolfSSL_EC_GROUP_set_asn1_flag");
 691    WOLFSSL_STUB("EC_GROUP_set_asn1_flag");
 692}
 693#endif
 694
 695/* Get the curve NID of the group.
 696 *
 697 * Return code compliant with OpenSSL.
 698 *
 699 * @param [in] group  EC group.
 700 * @return  Curve NID on success.
 701 * @return  0 on error.
 702 */
 703int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group)
 704{
 705    int nid = 0;
 706    WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_curve_name");
 707
 708    if (group == NULL) {
 709        WOLFSSL_MSG("wolfSSL_EC_GROUP_get_curve_name Bad arguments");
 710    }
 711    else {
 712        nid = group->curve_nid;
 713    }
 714
 715    return nid;
 716}
 717
 718/* Get the degree (curve size in bits) of the EC group.
 719 *
 720 * Return code compliant with OpenSSL.
 721 *
 722 * @return  Degree of the curve on success.
 723 * @return  0 on error.
 724 */
 725int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group)
 726{
 727    int degree = 0;
 728
 729    WOLFSSL_ENTER("wolfSSL_EC_GROUP_get_degree");
 730
 731    if (group == NULL) {
 732        WOLFSSL_MSG("wolfSSL_EC_GROUP_get_degree Bad arguments");
 733    }
 734    else {
 735        switch (group->curve_nid) {
 736            case WC_NID_secp112r1:
 737            case WC_NID_secp112r2:
 738                degree = 112;
 739                break;
 740            case WC_NID_secp128r1:
 741            case WC_NID_secp128r2:
 742                degree = 128;
 743                break;
 744            case WC_NID_secp160k1:
 745            case WC_NID_secp160r1:
 746            case WC_NID_secp160r2:
 747            case WC_NID_brainpoolP160r1:
 748                degree = 160;
 749                break;
 750            case WC_NID_secp192k1:
 751            case WC_NID_brainpoolP192r1:
 752            case WC_NID_X9_62_prime192v1:
 753            case WC_NID_X9_62_prime192v2:
 754            case WC_NID_X9_62_prime192v3:
 755                degree = 192;
 756                break;
 757            case WC_NID_secp224k1:
 758            case WC_NID_secp224r1:
 759            case WC_NID_brainpoolP224r1:
 760                degree = 224;
 761                break;
 762            case WC_NID_X9_62_prime239v1:
 763            case WC_NID_X9_62_prime239v2:
 764            case WC_NID_X9_62_prime239v3:
 765                degree = 239;
 766                break;
 767            case WC_NID_secp256k1:
 768            case WC_NID_brainpoolP256r1:
 769            case WC_NID_X9_62_prime256v1:
 770                degree = 256;
 771                break;
 772            case WC_NID_brainpoolP320r1:
 773                degree = 320;
 774                break;
 775            case WC_NID_secp384r1:
 776            case WC_NID_brainpoolP384r1:
 777                degree = 384;
 778                break;
 779            case WC_NID_brainpoolP512r1:
 780                degree = 512;
 781                break;
 782            case WC_NID_secp521r1:
 783                degree = 521;
 784                break;
 785        }
 786    }
 787
 788    return degree;
 789}
 790#endif /* OPENSSL_EXTRA */
 791
 792#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
 793/* Get the length of the order in bits of the EC group.
 794 *
 795 * TODO: consider switch statement or calculating directly from hex string
 796 * array instead of using mp_int.
 797 *
 798 * @param [in] group  EC group.
 799 * @return  Length of order in bits on success.
 800 * @return  0 on error.
 801 */
 802int wolfSSL_EC_GROUP_order_bits(const WOLFSSL_EC_GROUP *group)
 803{
 804    int ret = 0;
 805    WC_DECLARE_VAR(order, mp_int, 1, 0);
 806
 807    /* Validate parameter. */
 808    if ((group == NULL) || (group->curve_idx < 0)) {
 809        WOLFSSL_MSG("wolfSSL_EC_GROUP_order_bits NULL error");
 810        ret = WOLFSSL_FATAL_ERROR;
 811    }
 812
 813#ifdef WOLFSSL_SMALL_STACK
 814    if (ret == 0) {
 815        /* Allocate memory for mp_int that will hold order value. */
 816        order = (mp_int *)XMALLOC(sizeof(*order), NULL,
 817            DYNAMIC_TYPE_TMP_BUFFER);
 818        if (order == NULL) {
 819            ret = WOLFSSL_FATAL_ERROR;
 820        }
 821    }
 822#endif
 823
 824    if (ret == 0) {
 825        /* Initialize mp_int. */
 826        ret = mp_init(order);
 827    }
 828
 829    if (ret == 0) {
 830        /* Read hex string of order from wolfCrypt array of curves. */
 831        ret = mp_read_radix(order, ecc_sets[group->curve_idx].order,
 832            MP_RADIX_HEX);
 833        if (ret == 0) {
 834            /* Get bits of order. */
 835            ret = mp_count_bits(order);
 836        }
 837        /* Clear and free mp_int. */
 838        mp_clear(order);
 839    }
 840
 841    WC_FREE_VAR_EX(order, NULL, DYNAMIC_TYPE_TMP_BUFFER);
 842
 843    /* Convert error code to length of 0. */
 844    if (ret < 0) {
 845        ret = 0;
 846    }
 847
 848    return ret;
 849}
 850#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
 851
 852#if defined(OPENSSL_EXTRA)
 853/* Get the order of the group as a BN.
 854 *
 855 * Return code compliant with OpenSSL.
 856 *
 857 * @param [in]      group  EC group.
 858 * @param [in, out] order  BN to hold order value.
 859 * @param [in]      ctx    Context to use for BN operations. Unused.
 860 * @return  1 on success.
 861 * @return  0 on error.
 862 */
 863int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group,
 864    WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx)
 865{
 866    int ret = 1;
 867    mp_int* mp = NULL;
 868
 869    /* No BN operations performed - done with mp_int in BN. */
 870    (void)ctx;
 871
 872    /* Validate parameters. */
 873    if ((group == NULL) || (order == NULL) || (order->internal == NULL)) {
 874        WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order NULL error");
 875        ret = 0;
 876    }
 877
 878    if (ret == 1 &&
 879            (group->curve_idx < 0 || !wc_ecc_is_valid_idx(group->curve_idx))) {
 880        WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order Bad group idx");
 881        ret = 0;
 882    }
 883
 884    if (ret == 1) {
 885        mp = (mp_int*)order->internal;
 886    }
 887    /* Initialize */
 888    if ((ret == 1) && (mp_init(mp) != MP_OKAY)) {
 889        WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_init failure");
 890        ret = 0;
 891    }
 892    /* Read hex string of order from wolfCrypt array of curves. */
 893    if ((ret == 1) && (mp_read_radix(mp, ecc_sets[group->curve_idx].order,
 894            MP_RADIX_HEX) != MP_OKAY)) {
 895        WOLFSSL_MSG("wolfSSL_EC_GROUP_get_order mp_read order failure");
 896        /* Zero out any partial value but don't free. */
 897        mp_zero(mp);
 898        ret = 0;
 899    }
 900
 901    return ret;
 902}
 903
 904#endif /* OPENSSL_EXTRA */
 905
 906/* End EC_GROUP */
 907
 908/* Start EC_POINT */
 909
 910#if defined(OPENSSL_EXTRA)
 911
 912/* Set data of EC point into internal, wolfCrypt EC point object.
 913 *
 914 * EC_POINT Openssl -> WolfSSL
 915 *
 916 * @param [in, out] p  EC point to update.
 917 * @return  1 on success.
 918 * @return  -1 on failure.
 919 */
 920static int ec_point_internal_set(WOLFSSL_EC_POINT *p)
 921{
 922    int ret = 1;
 923
 924    WOLFSSL_ENTER("ec_point_internal_set");
 925
 926    /* Validate parameter. */
 927    if ((p == NULL) || (p->internal == NULL)) {
 928        WOLFSSL_MSG("ECPoint NULL error");
 929        ret = WOLFSSL_FATAL_ERROR;
 930    }
 931    else {
 932        /* Get internal point as a wolfCrypt EC point. */
 933        ecc_point* point = (ecc_point*)p->internal;
 934
 935        /* Set X ordinate if available. */
 936        if ((p->X != NULL) && (wolfssl_bn_get_value(p->X, point->x) != 1)) {
 937            WOLFSSL_MSG("ecc point X error");
 938            ret = WOLFSSL_FATAL_ERROR;
 939        }
 940        /* Set Y ordinate if available. */
 941        if ((ret == 1) && (p->Y != NULL) && (wolfssl_bn_get_value(p->Y,
 942                point->y) != 1)) {
 943            WOLFSSL_MSG("ecc point Y error");
 944            ret = WOLFSSL_FATAL_ERROR;
 945        }
 946        /* Set Z ordinate if available. */
 947        if ((ret == 1) && (p->Z != NULL) && (wolfssl_bn_get_value(p->Z,
 948                point->z) != 1)) {
 949            WOLFSSL_MSG("ecc point Z error");
 950            ret = WOLFSSL_FATAL_ERROR;
 951        }
 952        /* Internal values set when operations succeeded. */
 953        p->inSet = (ret == 1);
 954    }
 955
 956    return ret;
 957}
 958
 959/* Set data of internal, wolfCrypt EC point object into EC point.
 960 *
 961 * EC_POINT WolfSSL -> OpenSSL
 962 *
 963 * @param [in, out] p  EC point to update.
 964 * @return  1 on success.
 965 * @return  -1 on failure.
 966 */
 967static int ec_point_external_set(WOLFSSL_EC_POINT *p)
 968{
 969    int ret = 1;
 970
 971    WOLFSSL_ENTER("ec_point_external_set");
 972
 973    /* Validate parameter. */
 974    if ((p == NULL) || (p->internal == NULL)) {
 975        WOLFSSL_MSG("ECPoint NULL error");
 976        ret = WOLFSSL_FATAL_ERROR;
 977    }
 978    else {
 979        /* Get internal point as a wolfCrypt EC point. */
 980        ecc_point* point = (ecc_point*)p->internal;
 981
 982        /* Set X ordinate. */
 983        if (wolfssl_bn_set_value(&p->X, point->x) != 1) {
 984            WOLFSSL_MSG("ecc point X error");
 985            ret = WOLFSSL_FATAL_ERROR;
 986        }
 987        /* Set Y ordinate. */
 988        if ((ret == 1) && (wolfssl_bn_set_value(&p->Y, point->y) != 1)) {
 989            WOLFSSL_MSG("ecc point Y error");
 990            ret = WOLFSSL_FATAL_ERROR;
 991        }
 992        /* Set Z ordinate. */
 993        if ((ret == 1) && (wolfssl_bn_set_value(&p->Z, point->z) != 1)) {
 994            WOLFSSL_MSG("ecc point Z error");
 995            ret = WOLFSSL_FATAL_ERROR;
 996        }
 997        /* External values set when operations succeeded. */
 998        p->exSet = (ret == 1);
 999    }
1000
1001    return ret;
1002}
1003
1004/* Setup internals of EC point.
1005 *
1006 * Assumes point is not NULL.
1007 *
1008 * @param [in, out] point  EC point to update.
1009 * @return  1 on success.
1010 * @return  0 on failure.
1011 */
1012static int ec_point_setup(const WOLFSSL_EC_POINT *point) {
1013    int ret = 1;
1014
1015    /* Check if internal values need setting. */
1016    if (!point->inSet) {
1017        WOLFSSL_MSG("No ECPoint internal set, do it");
1018
1019        /* Forcing to non-constant type to update internals. */
1020        if (ec_point_internal_set((WOLFSSL_EC_POINT *)point) != 1) {
1021            WOLFSSL_MSG("ec_point_internal_set failed");
1022            ret = 0;
1023        }
1024    }
1025
1026    return ret;
1027}
1028
1029/* Create a new EC point from the group.
1030 *
1031 * @param [in] group  EC group.
1032 * @return  EC point on success.
1033 * @return  NULL on error.
1034 */
1035WOLFSSL_EC_POINT* wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP* group)
1036{
1037    int err = 0;
1038    WOLFSSL_EC_POINT* point = NULL;
1039
1040    WOLFSSL_ENTER("wolfSSL_EC_POINT_new");
1041
1042    /* Validate parameter. */
1043    if (group == NULL) {
1044        WOLFSSL_MSG("wolfSSL_EC_POINT_new NULL error");
1045        err = 1;
1046    }
1047
1048    if (!err) {
1049        /* Allocate memory for new EC point. */
1050        point = (WOLFSSL_EC_POINT*)XMALLOC(sizeof(WOLFSSL_EC_POINT), NULL,
1051            DYNAMIC_TYPE_ECC);
1052        if (point == NULL) {
1053            WOLFSSL_MSG("wolfSSL_EC_POINT_new malloc ecc point failure");
1054            err = 1;
1055        }
1056    }
1057    if (!err) {
1058        /* Clear fields of EC point. */
1059        XMEMSET(point, 0, sizeof(WOLFSSL_EC_POINT));
1060
1061        /* Allocate internal EC point. */
1062        point->internal = wc_ecc_new_point();
1063        if (point->internal == NULL) {
1064            WOLFSSL_MSG("ecc_new_point failure");
1065            err = 1;
1066        }
1067    }
1068
1069    if (err) {
1070        XFREE(point, NULL, DYNAMIC_TYPE_ECC);
1071        point = NULL;
1072    }
1073    return point;
1074}
1075
1076#endif /* OPENSSL_EXTRA */
1077
1078#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
1079/* Dispose of the EC point.
1080 *
1081 * Cannot use point after this call.
1082 *
1083 * @param [in, out] point  EC point to free.
1084 */
1085void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *point)
1086{
1087    WOLFSSL_ENTER("wolfSSL_EC_POINT_free");
1088
1089    if (point != NULL) {
1090        if (point->internal != NULL) {
1091            wc_ecc_del_point((ecc_point*)point->internal);
1092            point->internal = NULL;
1093        }
1094
1095        /* Free ordinates. */
1096        wolfSSL_BN_free(point->X);
1097        wolfSSL_BN_free(point->Y);
1098        wolfSSL_BN_free(point->Z);
1099        /* Clear fields. */
1100        point->X = NULL;
1101        point->Y = NULL;
1102        point->Z = NULL;
1103        point->inSet = 0;
1104        point->exSet = 0;
1105
1106        /* Dispose of EC point. */
1107        XFREE(point, NULL, DYNAMIC_TYPE_ECC);
1108    }
1109}
1110#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
1111
1112#ifdef OPENSSL_EXTRA
1113
1114/* Clear and dispose of the EC point.
1115 *
1116 * Cannot use point after this call.
1117 *
1118 * @param [in, out] point  EC point to free.
1119 */
1120void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *point)
1121{
1122    WOLFSSL_ENTER("wolfSSL_EC_POINT_clear_free");
1123
1124    if (point != NULL) {
1125        if (point->internal != NULL) {
1126            /* Force internal point to be zeros. */
1127    #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
1128            wc_ecc_forcezero_point((ecc_point*)point->internal);
1129    #else
1130            ecc_point* p = (ecc_point*)point->internal;
1131            mp_forcezero(p->x);
1132            mp_forcezero(p->y);
1133            mp_forcezero(p->z);
1134    #endif
1135            wc_ecc_del_point((ecc_point*)point->internal);
1136            point->internal = NULL;
1137        }
1138
1139        /* Clear the ordinates before freeing. */
1140        wolfSSL_BN_clear_free(point->X);
1141        wolfSSL_BN_clear_free(point->Y);
1142        wolfSSL_BN_clear_free(point->Z);
1143        /* Clear fields. */
1144        point->X = NULL;
1145        point->Y = NULL;
1146        point->Z = NULL;
1147        point->inSet = 0;
1148        point->exSet = 0;
1149
1150        /* Dispose of EC point. */
1151        XFREE(point, NULL, DYNAMIC_TYPE_ECC);
1152    }
1153}
1154
1155/* Print out the internals of EC point in debug and when logging callback set.
1156 *
1157 * Not an OpenSSL API.
1158 *
1159 * TODO: Use WOLFSSL_MSG_EX()?
1160 *
1161 * @param [in] msg    Message to prepend.
1162 * @param [in] point  EC point to print.
1163 */
1164void wolfSSL_EC_POINT_dump(const char *msg, const WOLFSSL_EC_POINT *point)
1165{
1166#if defined(DEBUG_WOLFSSL)
1167    char *num;
1168
1169    WOLFSSL_ENTER("wolfSSL_EC_POINT_dump");
1170
1171    /* Only print when debugging on. */
1172    if (WOLFSSL_IS_DEBUG_ON()) {
1173        if (point == NULL) {
1174            /* No point passed in so just put out "NULL". */
1175            WOLFSSL_MSG_EX("%s = NULL\n", msg);
1176        }
1177        else {
1178            /* Put out message and status of internal/external data set. */
1179            WOLFSSL_MSG_EX("%s:\n\tinSet=%d, exSet=%d\n", msg, point->inSet,
1180                point->exSet);
1181            /* Get x-ordinate as a hex string and print. */
1182            num = wolfSSL_BN_bn2hex(point->X);
1183            WOLFSSL_MSG_EX("\tX = %s\n", num);
1184            XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL);
1185            /* Get x-ordinate as a hex string and print. */
1186            num = wolfSSL_BN_bn2hex(point->Y);
1187            WOLFSSL_MSG_EX("\tY = %s\n", num);
1188            XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL);
1189            /* Get z-ordinate as a hex string and print. */
1190            num = wolfSSL_BN_bn2hex(point->Z);
1191            WOLFSSL_MSG_EX("\tZ = %s\n", num);
1192            XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL);
1193        }
1194    }
1195#else
1196    (void)msg;
1197    (void)point;
1198#endif
1199}
1200
1201/* Convert EC point to hex string that as either uncompressed or compressed.
1202 *
1203 * ECC point compression types were not included in selftest ecc.h
1204 *
1205 * @param [in] group  EC group for point.
1206 * @param [in] point  EC point to encode.
1207 * @param [in] form   Format of encoding. Valid values:
1208 *                    POINT_CONVERSION_UNCOMPRESSED, POINT_CONVERSION_COMPRESSED
1209 * @param [in] ctx    Context to use for BN operations. Unused.
1210 * @return  Allocated hex string on success.
1211 * @return  NULL on error.
1212 */
1213char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group,
1214    const WOLFSSL_EC_POINT* point, int form, WOLFSSL_BN_CTX* ctx)
1215{
1216    static const char* hexDigit = "0123456789ABCDEF";
1217    char* hex = NULL;
1218    int i;
1219    int sz = 0;
1220    int len = 0;
1221    int err = 0;
1222
1223    /* No BN operations performed. */
1224    (void)ctx;
1225
1226    /* Validate parameters. */
1227    if ((group == NULL) || (point == NULL)) {
1228        err = 1;
1229    }
1230    /* Get curve id expects a positive index. */
1231    if ((!err) && (group->curve_idx < 0)) {
1232        err = 1;
1233    }
1234
1235    if (!err) {
1236        /* Get curve id to look up ordinate size. */
1237        int id = wc_ecc_get_curve_id(group->curve_idx);
1238        /* Get size of ordinate. */
1239        if ((sz = wc_ecc_get_curve_size_from_id(id)) < 0) {
1240            err = 1;
1241        }
1242    }
1243    if (!err) {
1244        /* <format byte> <x-ordinate> [<y-ordinate>] */
1245        len = sz + 1;
1246        if (form == WC_POINT_CONVERSION_UNCOMPRESSED) {
1247            /* Include y ordinate when uncompressed. */
1248            len += sz;
1249        }
1250
1251        /* Hex string: allocate 2 bytes to represent each byte plus 1 for '\0'.
1252         */
1253        hex = (char*)XMALLOC((size_t)(2 * len + 1), NULL, DYNAMIC_TYPE_ECC);
1254        if (hex == NULL) {
1255            err = 1;
1256        }
1257    }
1258    if (!err) {
1259        /* Make bytes all zeros to allow for ordinate values less than max size.
1260         */
1261        XMEMSET(hex, 0, (size_t)(2 * len + 1));
1262
1263        /* Calculate offset as leading zeros not encoded. */
1264        i = sz - mp_unsigned_bin_size((mp_int*)point->X->internal) + 1;
1265        /* Put in x-ordinate after format byte. */
1266        if (mp_to_unsigned_bin((mp_int*)point->X->internal, (byte*)(hex + i)) <
1267                0) {
1268            err = 1;
1269        }
1270    }
1271    if (!err) {
1272        if (form == WC_POINT_CONVERSION_COMPRESSED) {
1273            /* Compressed format byte value dependent on whether y-ordinate is
1274             * odd.
1275             */
1276            hex[0] = mp_isodd((mp_int*)point->Y->internal) ?
1277                ECC_POINT_COMP_ODD : ECC_POINT_COMP_EVEN;
1278            /* No y-ordinate. */
1279        }
1280        else {
1281            /* Put in uncompressed format byte. */
1282            hex[0] = ECC_POINT_UNCOMP;
1283            /* Calculate offset as leading zeros not encoded. */
1284            i = 1 + 2 * sz - mp_unsigned_bin_size((mp_int*)point->Y->internal);
1285            /* Put in y-ordinate after x-ordinate. */
1286            if (mp_to_unsigned_bin((mp_int*)point->Y->internal,
1287                    (byte*)(hex + i)) < 0) {
1288                err = 1;
1289            }
1290        }
1291    }
1292    if (!err) {
1293        /* Convert binary encoding to hex string. */
1294        /* Start at end so as not to overwrite. */
1295        for (i = len-1; i >= 0; i--) {
1296            /* Get byte value and store has hex string. */
1297            byte b = (byte)hex[i];
1298            hex[i * 2 + 1] = hexDigit[b  & 0xf];
1299            hex[i * 2    ] = hexDigit[b >>   4];
1300        }
1301        /* Memset put trailing zero or '\0' on end of string. */
1302    }
1303
1304    if (err && (hex != NULL)) {
1305        /* Dispose of allocated data not being returned. */
1306        XFREE(hex,  NULL, DYNAMIC_TYPE_ECC);
1307        hex = NULL;
1308    }
1309    /* Return hex string encoding. */
1310    return hex;
1311}
1312
1313static size_t hex_to_bytes(const char *hex, unsigned char *output, size_t sz)
1314{
1315    word32 i;
1316    for (i = 0; i < sz; i++) {
1317        signed char ch1, ch2;
1318        ch1 = HexCharToByte(hex[i * 2]);
1319        ch2 = HexCharToByte(hex[i * 2 + 1]);
1320        if ((ch1 < 0) || (ch2 < 0)) {
1321            WOLFSSL_MSG("hex_to_bytes: syntax error");
1322            return 0;
1323        }
1324        output[i] = (unsigned char)((ch1 << 4) + ch2);
1325    }
1326    return sz;
1327}
1328
1329WOLFSSL_EC_POINT* wolfSSL_EC_POINT_hex2point(const WOLFSSL_EC_GROUP *group,
1330            const char *hex, WOLFSSL_EC_POINT*p, WOLFSSL_BN_CTX *ctx)
1331{
1332    /* for uncompressed mode */
1333    size_t str_sz;
1334    WOLFSSL_BIGNUM *Gx  = NULL;
1335    WOLFSSL_BIGNUM *Gy  = NULL;
1336    char   strGx[MAX_ECC_BYTES * 2 + 1];
1337
1338    /* for compressed mode */
1339    int    key_sz;
1340    byte   *octGx = (byte *)strGx; /* octGx[MAX_ECC_BYTES] */
1341
1342    int p_alloc = 0;
1343    int ret;
1344
1345    WOLFSSL_ENTER("wolfSSL_EC_POINT_hex2point");
1346
1347    if (group == NULL || hex == NULL || ctx == NULL)
1348        return NULL;
1349
1350    if (p == NULL) {
1351        if ((p = wolfSSL_EC_POINT_new(group)) == NULL) {
1352            WOLFSSL_MSG("wolfSSL_EC_POINT_new");
1353            goto err;
1354        }
1355        p_alloc = 1;
1356    }
1357
1358    key_sz = (wolfSSL_EC_GROUP_get_degree(group) + 7) / 8;
1359    if (key_sz <= 0 || (size_t)key_sz > MAX_ECC_BYTES)
1360        goto err;
1361
1362    if (hex[0] ==  '0' && hex[1] == '4') { /* uncompressed mode */
1363        str_sz = (size_t)key_sz * 2;
1364
1365        /* The uncompressed encoding is exactly 2 + 4*key_sz hex chars
1366         * ("04" prefix plus X and Y as 2*key_sz hex chars each). Reject
1367         * any other length so XMEMCPY/BN_hex2bn cannot read past the end
1368         * of the input and trailing garbage is not silently absorbed. */
1369        if (XSTRLEN(hex + 2) != str_sz * 2)
1370            goto err;
1371
1372        XMEMSET(strGx, 0x0, str_sz + 1);
1373        XMEMCPY(strGx, hex + 2, str_sz);
1374
1375        if (wolfSSL_BN_hex2bn(&Gx, strGx) == 0)
1376            goto err;
1377
1378        if (wolfSSL_BN_hex2bn(&Gy, hex + 2 + str_sz) == 0)
1379            goto err;
1380
1381        ret = wolfSSL_EC_POINT_set_affine_coordinates_GFp
1382                                            (group, p, Gx, Gy, ctx);
1383
1384        if (ret != WOLFSSL_SUCCESS) {
1385            WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp");
1386            goto err;
1387        }
1388    }
1389    else if (hex[0] == '0' && (hex[1] == '2' || hex[1] == '3')) {
1390        /* The SEC 1 compressed encoding is exactly 1 + key_sz bytes, so
1391         * the hex payload after the "02"/"03" prefix must be exactly
1392         * 2*key_sz hex chars. Compare the input length directly (rather
1393         * than XSTRLEN/2) so that odd-length inputs cannot slip past via
1394         * integer truncation. The exact-match rejects oversized inputs
1395         * (preventing a hex_to_bytes() write past strGx) and undersized
1396         * inputs (preventing wolfSSL_ECPoint_d2i() from reading
1397         * uninitialized stack bytes as the X coordinate). */
1398        if (XSTRLEN(hex + 2) != (size_t)key_sz * 2)
1399            goto err;
1400        octGx[0] = (hex[1] == '2') ? ECC_POINT_COMP_EVEN
1401                                   : ECC_POINT_COMP_ODD;
1402        if (hex_to_bytes(hex + 2, octGx + 1, (size_t)key_sz)
1403                                            != (size_t)key_sz) {
1404            goto err;
1405        }
1406        if (wolfSSL_ECPoint_d2i(octGx, (word32)key_sz + 1, group, p)
1407                                            != WOLFSSL_SUCCESS) {
1408            goto err;
1409        }
1410    }
1411    else
1412        goto err;
1413
1414    wolfSSL_BN_free(Gx);
1415    wolfSSL_BN_free(Gy);
1416    return p;
1417
1418err:
1419    wolfSSL_BN_free(Gx);
1420    wolfSSL_BN_free(Gy);
1421    if (p_alloc) {
1422        wolfSSL_EC_POINT_free(p);
1423    }
1424    return NULL;
1425
1426}
1427
1428/* Encode the EC point as an uncompressed point in DER.
1429 *
1430 * Return code compliant with OpenSSL.
1431 * Not OpenSSL API.
1432 *
1433 * @param [in]      group  EC group point belongs to.
1434 * @param [in]      point  EC point to encode.
1435 * @param [out]     out    Buffer to encode into. May be NULL.
1436 * @param [in, out] len    On in, length of buffer in bytes.
1437 *                         On out, length of encoding in bytes.
1438 * @return  1 on success.
1439 * @return  0 on error.
1440 */
1441int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *group,
1442    const WOLFSSL_EC_POINT *point, unsigned char *out, unsigned int *len)
1443{
1444    int res = 1;
1445
1446    WOLFSSL_ENTER("wolfSSL_ECPoint_i2d");
1447
1448    /* Validate parameters. */
1449    if ((group == NULL) || (point == NULL) || (len == NULL)) {
1450        WOLFSSL_MSG("wolfSSL_ECPoint_i2d NULL error");
1451        res = 0;
1452    }
1453
1454    /* Ensure points internals are set up. */
1455    if ((res == 1) && (ec_point_setup(point) != 1)) {
1456        res = 0;
1457    }
1458
1459    /* Dump the point if encoding. */
1460    if ((res == 1) && (out != NULL)) {
1461        wolfSSL_EC_POINT_dump("i2d p", point);
1462    }
1463
1464    if (res == 1) {
1465        /* DER encode point in uncompressed format. */
1466        int ret = wc_ecc_export_point_der(group->curve_idx,
1467            (ecc_point*)point->internal, out, len);
1468        /* Check return. When out is NULL, return will be length only error. */
1469        if ((ret != MP_OKAY) && ((out != NULL) ||
1470                                 (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)))) {
1471            WOLFSSL_MSG("wolfSSL_ECPoint_i2d wc_ecc_export_point_der failed");
1472            res = 0;
1473        }
1474    }
1475
1476    return res;
1477}
1478
1479/* Decode the uncompressed point in DER into EC point.
1480 *
1481 * Return code compliant with OpenSSL.
1482 * Not OpenSSL API.
1483 *
1484 * @param [in]      in     Buffer containing DER encoded point.
1485 * @param [in]      len    Length of data in bytes.
1486 * @param [in]      group  EC group associated with point.
1487 * @param [in, out] point  EC point to set data into.
1488 * @return  1 on success.
1489 * @return  0 on error.
1490 */
1491int wolfSSL_ECPoint_d2i(const unsigned char *in, unsigned int len,
1492    const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *point)
1493{
1494    int ret = 1;
1495    WOLFSSL_BIGNUM* x = NULL;
1496    WOLFSSL_BIGNUM* y = NULL;
1497
1498    WOLFSSL_ENTER("wolfSSL_ECPoint_d2i");
1499
1500    /* Validate parameters. */
1501    if ((in == NULL) || (group == NULL) || (point == NULL) ||
1502            (point->internal == NULL)) {
1503        WOLFSSL_MSG("wolfSSL_ECPoint_d2i NULL error");
1504        ret = 0;
1505    }
1506
1507    if (ret == 1) {
1508    #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
1509        /* Import point into internal EC point. */
1510        if (wc_ecc_import_point_der_ex(in, len, group->curve_idx,
1511                (ecc_point*)point->internal, 0) != MP_OKAY) {
1512            WOLFSSL_MSG("wc_ecc_import_point_der_ex failed");
1513            ret = 0;
1514        }
1515    #else
1516        /* ECC_POINT_UNCOMP is not defined CAVP self test so use magic number */
1517        if (in[0] == 0x04) {
1518            /* Import point into internal EC point. */
1519            if (wc_ecc_import_point_der((unsigned char *)in, len,
1520                    group->curve_idx, (ecc_point*)point->internal) != MP_OKAY) {
1521                WOLFSSL_MSG("wc_ecc_import_point_der failed");
1522                ret = 0;
1523            }
1524        }
1525        else {
1526            WOLFSSL_MSG("Only uncompressed points supported with "
1527                        "HAVE_SELFTEST");
1528            ret = 0;
1529        }
1530    #endif
1531    }
1532
1533    if (ret == 1)
1534        point->inSet = 1;
1535
1536    /* Set new external point. */
1537    if (ret == 1 && ec_point_external_set(point) != 1) {
1538        WOLFSSL_MSG("ec_point_external_set failed");
1539        ret = 0;
1540    }
1541
1542    if (ret == 1 && !wolfSSL_BN_is_one(point->Z)) {
1543#if !defined(WOLFSSL_SP_MATH) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
1544        x = wolfSSL_BN_new();
1545        y = wolfSSL_BN_new();
1546        if (x == NULL || y == NULL)
1547            ret = 0;
1548
1549        if (ret == 1 && wolfSSL_EC_POINT_get_affine_coordinates_GFp(group,
1550                point, x, y, NULL) != 1) {
1551            WOLFSSL_MSG("wolfSSL_EC_POINT_get_affine_coordinates_GFp failed");
1552            ret = 0;
1553        }
1554
1555        /* wolfSSL_EC_POINT_set_affine_coordinates_GFp checks that the point is
1556         * on the curve. */
1557        if (ret == 1 && wolfSSL_EC_POINT_set_affine_coordinates_GFp(group,
1558                point, x, y, NULL) != 1) {
1559            WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp failed");
1560            ret = 0;
1561        }
1562#else
1563        WOLFSSL_MSG("Importing non-affine point. This may cause issues in math "
1564                    "operations later on.");
1565#endif
1566    }
1567#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
1568    /* Validate that the imported point lies on the curve.  The Z!=1 path
1569     * above validates via set_affine_coordinates_GFp, but for affine
1570     * imports (Z==1), the common case for uncompressed points, that
1571     * block is skipped.  Check unconditionally so no import path can
1572     * bypass validation. */
1573    if (ret == 1 && wolfSSL_EC_POINT_is_on_curve(group,
1574            (WOLFSSL_EC_POINT *)point, NULL) != 1) {
1575        WOLFSSL_MSG("wolfSSL_ECPoint_d2i: point not on curve");
1576        ret = 0;
1577    }
1578#endif
1579
1580    if (ret == 1) {
1581        /* Dump new point. */
1582        wolfSSL_EC_POINT_dump("d2i p", point);
1583    }
1584
1585    wolfSSL_BN_free(x);
1586    wolfSSL_BN_free(y);
1587
1588    return ret;
1589}
1590
1591/* Encode point as octet string.
1592 *
1593 * HYBRID not supported.
1594 *
1595 * @param [in]  group  EC group that point belongs to.
1596 * @param [in]  point  EC point to encode.
1597 * @param [in]  form   Format of encoding. Valid values:
1598 *                     POINT_CONVERSION_UNCOMPRESSED,POINT_CONVERSION_COMPRESSED
1599 * @param [out] buf    Buffer to write encoding into.
1600 * @param [in]  len    Length of buffer.
1601 * @param [in]  ctx    Context to use for BN operations. Unused.
1602 * @return  Length of encoded data on success.
1603 * @return  0 on error.
1604 */
1605size_t wolfSSL_EC_POINT_point2oct(const WOLFSSL_EC_GROUP *group,
1606   const WOLFSSL_EC_POINT *point, int form, byte *buf, size_t len,
1607   WOLFSSL_BN_CTX *ctx)
1608{
1609    int err = 0;
1610    word32 enc_len = (word32)len;
1611#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
1612    int compressed = ((form == WC_POINT_CONVERSION_COMPRESSED) ? 1 : 0);
1613#endif /* !HAVE_SELFTEST */
1614
1615    WOLFSSL_ENTER("wolfSSL_EC_POINT_point2oct");
1616
1617    /* No BN operations performed. */
1618    (void)ctx;
1619
1620    /* Validate parameters. */
1621    if ((group == NULL) || (point == NULL)) {
1622        err = 1;
1623    }
1624
1625    /* Ensure points internals are set up. */
1626    if ((!err) && (ec_point_setup(point) != 1)) {
1627        err = 1;
1628    }
1629
1630    /* Special case when point is infinity. */
1631    if ((!err) && wolfSSL_EC_POINT_is_at_infinity(group, point)) {
1632        /* Encoding is a single octet: 0x00. */
1633        enc_len = 1;
1634        if (buf != NULL) {
1635            /* Check whether buffer has space. */
1636            if (len < 1) {
1637                wolfSSL_ECerr(WOLFSSL_EC_F_EC_GFP_SIMPLE_POINT2OCT, BUFFER_E);
1638                err = 1;
1639            }
1640            else {
1641                /* Put in encoding of infinity. */
1642                buf[0] = 0x00;
1643            }
1644        }
1645    }
1646    /* Not infinity. */
1647    else if (!err) {
1648        /* Validate format. */
1649        if (form != WC_POINT_CONVERSION_UNCOMPRESSED
1650        #ifndef HAVE_SELFTEST
1651                && form != WC_POINT_CONVERSION_COMPRESSED
1652        #endif /* !HAVE_SELFTEST */
1653            ) {
1654            WOLFSSL_MSG("Unsupported point form");
1655            err = 1;
1656        }
1657
1658        if (!err) {
1659            int ret;
1660
1661    #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
1662            /* Encode as compressed or uncompressed. */
1663            ret = wc_ecc_export_point_der_ex(group->curve_idx,
1664                (ecc_point*)point->internal, buf, &enc_len, compressed);
1665    #else
1666            /* Encode uncompressed point in DER format. */
1667            ret = wc_ecc_export_point_der(group->curve_idx,
1668                (ecc_point*)point->internal, buf, &enc_len);
1669    #endif /* !HAVE_SELFTEST */
1670            /* Check return. When buf is NULL, return will be length only
1671             * error.
1672             */
1673            if (ret != ((buf != NULL) ? MP_OKAY :
1674                                        WC_NO_ERR_TRACE(LENGTH_ONLY_E))) {
1675                err = 1;
1676            }
1677        }
1678    }
1679
1680#if defined(DEBUG_WOLFSSL)
1681    if (!err) {
1682        wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_point2oct point", point);
1683        WOLFSSL_MSG("\twolfSSL_EC_POINT_point2oct output:");
1684        WOLFSSL_BUFFER(buf, enc_len);
1685    }
1686#endif
1687
1688    /* On error, return encoding length of 0. */
1689    if (err) {
1690        enc_len = 0;
1691    }
1692    return (size_t)enc_len;
1693}
1694
1695
1696/* Convert octet string to EC point.
1697 *
1698 * @param [in]      group  EC group.
1699 * @param [in, out] point  EC point to set data into.
1700 * @param [in]      buf    Buffer holding octet string.
1701 * @param [in]      len    Length of data in buffer in bytes.
1702 * @param [in]      ctx    Context to use for BN operations. Unused.
1703 */
1704int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group,
1705    WOLFSSL_EC_POINT *point, const unsigned char *buf, size_t len,
1706    WOLFSSL_BN_CTX *ctx)
1707{
1708    int ret;
1709
1710    WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
1711
1712    /* No BN operations performed. */
1713    (void)ctx;
1714
1715    /* Validate parameters. */
1716    if ((group == NULL) || (point == NULL)) {
1717        ret = 0;
1718    }
1719    else {
1720        /* Decode DER encoding into EC point. */
1721        ret = wolfSSL_ECPoint_d2i((unsigned char*)buf, (unsigned int)len, group,
1722            point);
1723    }
1724
1725    return ret;
1726}
1727
1728/* Convert an EC point to a single BN.
1729 *
1730 * @param [in]      group  EC group.
1731 * @param [in]      point  EC point.
1732 * @param [in]      form   Format of encoding. Valid values:
1733 *                         WC_POINT_CONVERSION_UNCOMPRESSED,
1734 *                         WC_POINT_CONVERSION_COMPRESSED.
1735 * @param [in, out] bn     BN to hold point value.
1736 *                         When NULL a new BN is allocated otherwise this is
1737 *                         returned on success.
1738 * @param [in]      ctx    Context to use for BN operations. Unused.
1739 * @return  BN object with point as a value on success.
1740 * @return  NULL on error.
1741 */
1742WOLFSSL_BIGNUM *wolfSSL_EC_POINT_point2bn(const WOLFSSL_EC_GROUP* group,
1743    const WOLFSSL_EC_POINT* point, int form, WOLFSSL_BIGNUM* bn,
1744    WOLFSSL_BN_CTX* ctx)
1745{
1746    int err = 0;
1747    size_t len = 0;
1748    byte *buf = NULL;
1749    WOLFSSL_BIGNUM *ret = NULL;
1750
1751    WOLFSSL_ENTER("wolfSSL_EC_POINT_oct2point");
1752
1753    /* Validate parameters. */
1754    if ((group == NULL) || (point == NULL)) {
1755        err = 1;
1756    }
1757
1758    /* Calculate length of octet encoding. */
1759    if ((!err) && ((len = wolfSSL_EC_POINT_point2oct(group, point, form, NULL,
1760            0, ctx)) == 0)) {
1761        err = 1;
1762    }
1763    /* Allocate buffer to hold octet encoding. */
1764    if ((!err) && ((buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER)) ==
1765            NULL)) {
1766        WOLFSSL_MSG("malloc failed");
1767        err = 1;
1768    }
1769    /* Encode EC point as an octet string. */
1770    if ((!err) && (wolfSSL_EC_POINT_point2oct(group, point, form, buf, len,
1771            ctx) != len)) {
1772        err = 1;
1773    }
1774    /* Load BN with octet string data. */
1775    if (!err) {
1776        ret = wolfSSL_BN_bin2bn(buf, (int)len, bn);
1777    }
1778
1779    /* Dispose of any allocated data. */
1780    XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1781
1782    return ret;
1783}
1784
1785#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
1786/* Check if EC point is on the the curve defined by the EC group.
1787 *
1788 * @param [in] group  EC group defining curve.
1789 * @param [in] point  EC point to check.
1790 * @param [in] ctx    Context to use for BN operations. Unused.
1791 * @return  1 when point is on curve.
1792 * @return  0 when point is not on curve or error.
1793 */
1794int wolfSSL_EC_POINT_is_on_curve(const WOLFSSL_EC_GROUP *group,
1795    const WOLFSSL_EC_POINT *point, WOLFSSL_BN_CTX *ctx)
1796{
1797    int err = 0;
1798
1799    WOLFSSL_ENTER("wolfSSL_EC_POINT_is_on_curve");
1800
1801    /* No BN operations performed. */
1802    (void)ctx;
1803
1804    /* Validate parameters. */
1805    if ((group == NULL) || (point == NULL)) {
1806        WOLFSSL_MSG("Invalid arguments");
1807        err = 1;
1808    }
1809
1810    /* Ensure internal EC point set. */
1811    if ((!err) && (!point->inSet) && ec_point_internal_set(
1812            (WOLFSSL_EC_POINT*)point) != 1) {
1813        WOLFSSL_MSG("ec_point_internal_set error");
1814        err = 1;
1815    }
1816
1817    /* Check point is on curve from group. */
1818    if ((!err) && (wc_ecc_point_is_on_curve((ecc_point*)point->internal,
1819            group->curve_idx) != MP_OKAY)) {
1820        err = 1;
1821    }
1822
1823    /* Return boolean of on curve. No error means on curve. */
1824    return !err;
1825}
1826#endif /* !HAVE_SELFTEST && !(HAVE_FIPS && FIPS_VERSION <= 2) */
1827
1828#if !defined(WOLFSSL_SP_MATH) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
1829/* Convert Jacobian ordinates to affine.
1830 *
1831 * @param [in]      group  EC group.
1832 * @param [in]      point  EC point to get coordinates from.
1833 * @return  1 on success.
1834 * @return  0 on error.
1835 */
1836int ec_point_convert_to_affine(const WOLFSSL_EC_GROUP *group,
1837    WOLFSSL_EC_POINT *point)
1838{
1839    int err = 0;
1840    mp_digit mp = 0;
1841    WC_DECLARE_VAR(modulus, mp_int, 1, 0);
1842
1843    /* Allocate memory for curve's prime modulus. */
1844    WC_ALLOC_VAR_EX(modulus, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT, err=1);
1845    /* Initialize the MP integer. */
1846    if ((!err) && (mp_init(modulus) != MP_OKAY)) {
1847        WOLFSSL_MSG("mp_init failed");
1848        err = 1;
1849    }
1850
1851    if (!err) {
1852        /* Get the modulus from the hex string in the EC curve set. */
1853        if (mp_read_radix(modulus, ecc_sets[group->curve_idx].prime,
1854                MP_RADIX_HEX) != MP_OKAY) {
1855            WOLFSSL_MSG("mp_read_radix failed");
1856            err = 1;
1857        }
1858        /* Get Montgomery multiplier for the modulus as ordinates in
1859         * Montgomery form.
1860         */
1861        if ((!err) && (mp_montgomery_setup(modulus, &mp) != MP_OKAY)) {
1862            WOLFSSL_MSG("mp_montgomery_setup failed");
1863            err = 1;
1864        }
1865        /* Map internal EC point from Jacobian to affine. */
1866        if ((!err) && (ecc_map((ecc_point*)point->internal, modulus, mp) !=
1867                MP_OKAY)) {
1868            WOLFSSL_MSG("ecc_map failed");
1869            err = 1;
1870        }
1871        /* Set new ordinates into external EC point. */
1872        if ((!err) && (ec_point_external_set((WOLFSSL_EC_POINT *)point) != 1)) {
1873            WOLFSSL_MSG("ec_point_external_set failed");
1874            err = 1;
1875        }
1876
1877        point->exSet = !err;
1878        mp_clear(modulus);
1879    }
1880
1881    WC_FREE_VAR_EX(modulus, NULL, DYNAMIC_TYPE_BIGINT);
1882
1883    return err;
1884}
1885
1886/* Get the affine coordinates of the EC point on a Prime curve.
1887 *
1888 * When z-ordinate is not one then coordinates are Jacobian and need to be
1889 * converted to affine before storing in BNs.
1890 *
1891 * Return code compliant with OpenSSL.
1892 *
1893 * TODO: OpenSSL doesn't change point when Jacobian. Do the same?
1894 *
1895 * @param [in]      group  EC group.
1896 * @param [in]      point  EC point to get coordinates from.
1897 * @param [in, out] x      BN to hold x-ordinate.
1898 * @param [in, out] y      BN to hold y-ordinate.
1899 * @param [in]      ctx    Context to use for BN operations. Unused.
1900 * @return  1 on success.
1901 * @return  0 on error.
1902 */
1903int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP* group,
1904    const WOLFSSL_EC_POINT* point, WOLFSSL_BIGNUM* x, WOLFSSL_BIGNUM* y,
1905    WOLFSSL_BN_CTX* ctx)
1906{
1907    int ret = 1;
1908
1909    /* BN operations don't need context. */
1910    (void)ctx;
1911
1912    WOLFSSL_ENTER("wolfSSL_EC_POINT_get_affine_coordinates_GFp");
1913
1914    /* Validate parameters. */
1915    if ((group == NULL) || (point == NULL) || (point->internal == NULL) ||
1916            (x == NULL) || (y == NULL)) {
1917        WOLFSSL_MSG("wolfSSL_EC_POINT_get_affine_coordinates_GFp NULL error");
1918        ret = 0;
1919    }
1920    /* Don't return point at infinity. */
1921    if ((ret == 1) && wolfSSL_EC_POINT_is_at_infinity(group, point)) {
1922        ret = 0;
1923    }
1924
1925    /* Ensure internal EC point has values of external EC point. */
1926    if ((ret == 1) && (ec_point_setup(point) != 1)) {
1927        ret = 0;
1928    }
1929
1930    /* Check whether ordinates are in Jacobian form. */
1931    if ((ret == 1) && (!wolfSSL_BN_is_one(point->Z))) {
1932        /* Convert from Jacobian to affine. */
1933        if (ec_point_convert_to_affine(group, (WOLFSSL_EC_POINT*)point) == 1) {
1934            ret = 0;
1935        }
1936    }
1937
1938    /* Copy the externally set x and y ordinates. */
1939    if ((ret == 1) && (wolfSSL_BN_copy(x, point->X) == NULL)) {
1940        ret = 0;
1941    }
1942    if ((ret == 1) && (wolfSSL_BN_copy(y, point->Y) == NULL)) {
1943        ret = 0;
1944    }
1945
1946    return ret;
1947}
1948#endif /* !WOLFSSL_SP_MATH && !WOLF_CRYPTO_CB_ONLY_ECC */
1949
1950/* Sets the affine coordinates that belong on a prime curve.
1951 *
1952 * @param [in]      group  EC group.
1953 * @param [in, out] point  EC point to set coordinates into.
1954 * @param [in]      x      BN holding x-ordinate.
1955 * @param [in]      y      BN holding y-ordinate.
1956 * @param [in]      ctx    Context to use for BN operations. Unused.
1957 * @return  1 on success.
1958 * @return  0 on error.
1959 */
1960int wolfSSL_EC_POINT_set_affine_coordinates_GFp(const WOLFSSL_EC_GROUP* group,
1961    WOLFSSL_EC_POINT* point, const WOLFSSL_BIGNUM* x, const WOLFSSL_BIGNUM* y,
1962    WOLFSSL_BN_CTX* ctx)
1963{
1964    int ret = 1;
1965
1966    /* BN operations don't need context. */
1967    (void)ctx;
1968
1969    WOLFSSL_ENTER("wolfSSL_EC_POINT_set_affine_coordinates_GFp");
1970
1971    /* Validate parameters. */
1972    if ((group == NULL) || (point == NULL) || (point->internal == NULL) ||
1973            (x == NULL) || (y == NULL)) {
1974        WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp NULL error");
1975        ret = 0;
1976    }
1977
1978    /* Ensure we have a object for x-ordinate. */
1979    if ((ret == 1) && (point->X == NULL) &&
1980            ((point->X = wolfSSL_BN_new()) == NULL)) {
1981        WOLFSSL_MSG("wolfSSL_BN_new failed");
1982        ret = 0;
1983    }
1984    /* Ensure we have a object for y-ordinate. */
1985    if ((ret == 1) && (point->Y == NULL) &&
1986            ((point->Y = wolfSSL_BN_new()) == NULL)) {
1987        WOLFSSL_MSG("wolfSSL_BN_new failed");
1988        ret = 0;
1989    }
1990    /* Ensure we have a object for z-ordinate. */
1991    if ((ret == 1) && (point->Z == NULL) &&
1992            ((point->Z = wolfSSL_BN_new()) == NULL)) {
1993        WOLFSSL_MSG("wolfSSL_BN_new failed");
1994        ret = 0;
1995    }
1996
1997    /* Copy the x-ordinate. */
1998    if ((ret == 1) && ((wolfSSL_BN_copy(point->X, x)) == NULL)) {
1999        WOLFSSL_MSG("wolfSSL_BN_copy failed");
2000        ret = 0;
2001    }
2002    /* Copy the y-ordinate. */
2003    if ((ret == 1) && ((wolfSSL_BN_copy(point->Y, y)) == NULL)) {
2004        WOLFSSL_MSG("wolfSSL_BN_copy failed");
2005        ret = 0;
2006    }
2007    /* z-ordinate is one for affine coordinates. */
2008    if ((ret == 1) && ((wolfSSL_BN_one(point->Z)) == 0)) {
2009        WOLFSSL_MSG("wolfSSL_BN_one failed");
2010        ret = 0;
2011    }
2012
2013    /* Copy the new point data to internal object. */
2014    if ((ret == 1) && (ec_point_internal_set((WOLFSSL_EC_POINT *)point) != 1)) {
2015        WOLFSSL_MSG("ec_point_internal_set failed");
2016        ret = 0;
2017    }
2018
2019#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))
2020    /* Check that the point is valid. */
2021    if ((ret == 1) && (wolfSSL_EC_POINT_is_on_curve(group,
2022            (WOLFSSL_EC_POINT *)point, ctx) != 1)) {
2023        WOLFSSL_MSG("EC_POINT_is_on_curve failed");
2024        ret = 0;
2025    }
2026#endif
2027
2028    return ret;
2029}
2030
2031#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
2032    !defined(HAVE_SELFTEST) && !defined(WOLFSSL_SP_MATH) && \
2033    !defined(WOLF_CRYPTO_CB_ONLY_ECC)
2034/* Add two points on the same together.
2035 *
2036 * @param [in]  curveIdx  Index of curve in ecc_set.
2037 * @param [out] r         Result point.
2038 * @param [in]  p1        First point to add.
2039 * @param [in]  p2        Second point to add.
2040 * @return  1 on success.
2041 * @return  0 on error.
2042 */
2043static int wolfssl_ec_point_add(int curveIdx, ecc_point* r, ecc_point* p1,
2044    ecc_point* p2)
2045{
2046    int ret = 1;
2047#ifdef WOLFSSL_SMALL_STACK
2048    mp_int* a = NULL;
2049    mp_int* prime = NULL;
2050    mp_int* mu = NULL;
2051#else
2052    mp_int a[1];
2053    mp_int prime[1];
2054    mp_int mu[1];
2055#endif
2056    mp_digit mp = 0;
2057    ecc_point* montP1 = NULL;
2058    ecc_point* montP2 = NULL;
2059
2060#ifdef WOLFSSL_SMALL_STACK
2061    if (ret == 1) {
2062        /* Allocate memory for curve parameter: a. */
2063        a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
2064        if (a == NULL) {
2065            WOLFSSL_MSG("Failed to allocate memory for mp_int a");
2066            ret = 0;
2067        }
2068    }
2069    if (ret == 1) {
2070        /* Allocate memory for curve parameter: prime. */
2071        prime = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
2072        if (prime == NULL) {
2073            WOLFSSL_MSG("Failed to allocate memory for mp_int prime");
2074            ret = 0;
2075        }
2076    }
2077    if (ret == 1) {
2078        /* Allocate memory for mu (Montgomery normalizer). */
2079        mu = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
2080        if (mu == NULL) {
2081            WOLFSSL_MSG("Failed to allocate memory for mp_int mu");
2082            ret = 0;
2083        }
2084    }
2085    if (ret == 1) {
2086        /* Zero out all MP int data in case initialization fails. */
2087        XMEMSET(a, 0, sizeof(mp_int));
2088        XMEMSET(prime, 0, sizeof(mp_int));
2089        XMEMSET(mu, 0, sizeof(mp_int));
2090    }
2091#endif
2092
2093    /* Initialize the MP ints. */
2094    if ((ret == 1) && (mp_init_multi(prime, a, mu, NULL, NULL, NULL) !=
2095            MP_OKAY)) {
2096        WOLFSSL_MSG("mp_init_multi error");
2097        ret = 0;
2098    }
2099
2100    /* Read the curve parameter: a. */
2101    if ((ret == 1) && (mp_read_radix(a, ecc_sets[curveIdx].Af, MP_RADIX_HEX) !=
2102            MP_OKAY)) {
2103        WOLFSSL_MSG("mp_read_radix a error");
2104        ret = 0;
2105    }
2106
2107    /* Read the curve parameter: prime. */
2108    if ((ret == 1) && (mp_read_radix(prime, ecc_sets[curveIdx].prime,
2109            MP_RADIX_HEX) != MP_OKAY)) {
2110        WOLFSSL_MSG("mp_read_radix prime error");
2111        ret = 0;
2112    }
2113
2114    /* Calculate the Montgomery product. */
2115    if ((ret == 1) && (mp_montgomery_setup(prime, &mp) != MP_OKAY)) {
2116        WOLFSSL_MSG("mp_montgomery_setup nqm error");
2117        ret = 0;
2118    }
2119
2120    /* TODO: use the heap filed of one of the points? */
2121    /* Allocate new points to hold the Montgomery form values. */
2122    if ((ret == 1) && (((montP1 = wc_ecc_new_point_h(NULL)) == NULL) ||
2123            ((montP2 = wc_ecc_new_point_h(NULL)) == NULL))) {
2124        WOLFSSL_MSG("wc_ecc_new_point_h nqm error");
2125        ret = 0;
2126    }
2127
2128    /* Calculate the Montgomery normalizer. */
2129    if ((ret == 1) && (mp_montgomery_calc_normalization(mu, prime) !=
2130            MP_OKAY)) {
2131        WOLFSSL_MSG("mp_montgomery_calc_normalization error");
2132        ret = 0;
2133    }
2134
2135    /* Convert to Montgomery form. */
2136    if ((ret == 1) && (mp_cmp_d(mu, 1) == MP_EQ)) {
2137        /* Copy the points if the normalizer is 1.  */
2138        if ((wc_ecc_copy_point(p1, montP1) != MP_OKAY) ||
2139                (wc_ecc_copy_point(p2, montP2) != MP_OKAY)) {
2140            WOLFSSL_MSG("wc_ecc_copy_point error");
2141            ret = 0;
2142        }
2143    }
2144    else if (ret == 1) {
2145        /* Multiply each ordinate by the Montgomery normalizer.  */
2146        if ((mp_mulmod(p1->x, mu, prime, montP1->x) != MP_OKAY) ||
2147                (mp_mulmod(p1->y, mu, prime, montP1->y) != MP_OKAY) ||
2148                (mp_mulmod(p1->z, mu, prime, montP1->z) != MP_OKAY)) {
2149            WOLFSSL_MSG("mp_mulmod error");
2150            ret = 0;
2151        }
2152        /* Multiply each ordinate by the Montgomery normalizer.  */
2153        if ((mp_mulmod(p2->x, mu, prime, montP2->x) != MP_OKAY) ||
2154                (mp_mulmod(p2->y, mu, prime, montP2->y) != MP_OKAY) ||
2155                (mp_mulmod(p2->z, mu, prime, montP2->z) != MP_OKAY)) {
2156            WOLFSSL_MSG("mp_mulmod error");
2157            ret = 0;
2158        }
2159    }
2160
2161    /* Perform point addition with internal EC point objects - Jacobian form
2162     * result.
2163     */
2164    if ((ret == 1) && (ecc_projective_add_point(montP1, montP2, r, a, prime,
2165            mp) != MP_OKAY)) {
2166        WOLFSSL_MSG("ecc_projective_add_point error");
2167        ret = 0;
2168    }
2169
2170    /* Map point back to affine coordinates. Converts from Montogomery form. */
2171    if ((ret == 1) && (ecc_map(r, prime, mp) != MP_OKAY)) {
2172        WOLFSSL_MSG("ecc_map error");
2173        ret = 0;
2174    }
2175
2176    /* Dispose of allocated memory. */
2177    mp_clear(a);
2178    mp_clear(prime);
2179    mp_clear(mu);
2180    wc_ecc_del_point_h(montP1, NULL);
2181    wc_ecc_del_point_h(montP2, NULL);
2182    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
2183    WC_FREE_VAR_EX(prime, NULL, DYNAMIC_TYPE_BIGINT);
2184    WC_FREE_VAR_EX(mu, NULL, DYNAMIC_TYPE_BIGINT);
2185    return ret;
2186}
2187
2188/* Add two points on the same curve together.
2189 *
2190 * @param [in]  group  EC group.
2191 * @param [out] r      EC point that is result of point addition.
2192 * @param [in]  p1     First EC point to add.
2193 * @param [in]  p2     Second EC point to add.
2194 * @param [in]  ctx    Context to use for BN operations. Unused.
2195 * @return  1 on success.
2196 * @return  0 on error.
2197 */
2198int wolfSSL_EC_POINT_add(const WOLFSSL_EC_GROUP* group, WOLFSSL_EC_POINT* r,
2199    const WOLFSSL_EC_POINT* p1, const WOLFSSL_EC_POINT* p2, WOLFSSL_BN_CTX* ctx)
2200{
2201    int ret = 1;
2202
2203    /* No BN operations performed. */
2204    (void)ctx;
2205
2206    /* Validate parameters. */
2207    if ((group == NULL) || (r == NULL) || (p1 == NULL) || (p2 == NULL)) {
2208        WOLFSSL_MSG("wolfSSL_EC_POINT_add error");
2209        ret = 0;
2210    }
2211
2212    /* Ensure the internal objects of the EC points are setup. */
2213    if ((ret == 1) && ((ec_point_setup(r) != 1) || (ec_point_setup(p1) != 1) ||
2214            (ec_point_setup(p2) != 1))) {
2215        WOLFSSL_MSG("ec_point_setup error");
2216        ret = 0;
2217    }
2218
2219#ifdef DEBUG_WOLFSSL
2220    if (ret == 1) {
2221        int nid = wolfSSL_EC_GROUP_get_curve_name(group);
2222        const char* curve = wolfSSL_OBJ_nid2ln(nid);
2223        const char* nistName = wolfSSL_EC_curve_nid2nist(nid);
2224        wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_add p1", p1);
2225        wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_add p2", p2);
2226        if (curve != NULL)
2227            WOLFSSL_MSG_EX("curve name: %s", curve);
2228        if (nistName != NULL)
2229            WOLFSSL_MSG_EX("nist curve name: %s", nistName);
2230    }
2231#endif
2232
2233    if (ret == 1) {
2234        /* Add points using wolfCrypt objects. */
2235        ret = wolfssl_ec_point_add(group->curve_idx, (ecc_point*)r->internal,
2236            (ecc_point*)p1->internal, (ecc_point*)p2->internal);
2237    }
2238
2239    /* Copy internal EC point values out to external EC point. */
2240    if ((ret == 1) && (ec_point_external_set(r) != 1)) {
2241        WOLFSSL_MSG("ec_point_external_set error");
2242        ret = 0;
2243    }
2244
2245#ifdef DEBUG_WOLFSSL
2246    if (ret == 1) {
2247        wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_add result", r);
2248    }
2249#endif
2250
2251    return ret;
2252}
2253
2254/* Sum the scalar multiplications of the base point and n, and q and m.
2255 *
2256 * r = base point * n + q * m
2257 *
2258 * @param [out] r      EC point that is result of operation.
2259 * @param [in]  b      Base point of curve.
2260 * @param [in]  n      Scalar to multiply by base point.
2261 * @param [in]  q      EC point to be scalar multiplied.
2262 * @param [in]  m      Scalar to multiply q by.
2263 * @param [in]  a      Parameter A of curve.
2264 * @param [in]  prime  Prime (modulus) of curve.
2265 * @return  1 on success.
2266 * @return  0 on error.
2267 */
2268static int ec_mul2add(ecc_point* r, ecc_point* b, mp_int* n, ecc_point* q,
2269    mp_int* m, mp_int* a, mp_int* prime)
2270{
2271    int ret = 1;
2272#if defined(ECC_SHAMIR) && !defined(WOLFSSL_KCAPI_ECC)
2273    if (ecc_mul2add(b, n, q, m, r, a, prime, NULL) != MP_OKAY) {
2274        WOLFSSL_MSG("ecc_mul2add error");
2275        ret = 0;
2276    }
2277#else
2278    ecc_point* tmp = NULL;
2279    mp_digit mp = 0;
2280
2281    /* Calculate Montgomery product. */
2282    if (mp_montgomery_setup(prime, &mp) != MP_OKAY) {
2283        WOLFSSL_MSG("mp_montgomery_setup nqm error");
2284        ret = 0;
2285    }
2286    /* Create temporary point to hold: q * m */
2287    if ((ret == 1) && ((tmp = wc_ecc_new_point()) == NULL)) {
2288        WOLFSSL_MSG("wolfSSL_EC_POINT_new nqm error");
2289        ret = 0;
2290    }
2291    /* r = base point * n */
2292    if ((ret == 1) && (wc_ecc_mulmod(n, b, r, a, prime, 0) !=
2293            MP_OKAY)) {
2294        WOLFSSL_MSG("wc_ecc_mulmod nqm error");
2295        ret = 0;
2296    }
2297    /* tmp = q * m */
2298    if ((ret == 1) && (wc_ecc_mulmod(m, q, tmp, a, prime, 0) != MP_OKAY)) {
2299        WOLFSSL_MSG("wc_ecc_mulmod nqm error");
2300        ret = 0;
2301    }
2302    /* r = r + tmp */
2303    if ((ret == 1) && (ecc_projective_add_point(tmp, r, r, a, prime, mp) !=
2304            MP_OKAY)) {
2305        WOLFSSL_MSG("wc_ecc_mulmod nqm error");
2306        ret = 0;
2307    }
2308    /* Map point back to affine coordinates. Converts from Montogomery
2309     * form. */
2310    if ((ret == 1) && (ecc_map(r, prime, mp) != MP_OKAY)) {
2311        WOLFSSL_MSG("ecc_map nqm error");
2312        ret = 0;
2313    }
2314
2315    /* Dispose of allocated temporary point. */
2316    wc_ecc_del_point(tmp);
2317#endif
2318
2319    return ret;
2320}
2321
2322/* Sum the scalar multiplications of the base point and n, and q and m.
2323 *
2324 * r = base point * n + q * m
2325 *
2326 * @param [in]  curveIdx  Index of curve in ecc_set.
2327 * @param [out] r         EC point that is result of operation.
2328 * @param [in]  n         Scalar to multiply by base point. May be NULL.
2329 * @param [in]  q         EC point to be scalar multiplied. May be NULL.
2330 * @param [in]  m         Scalar to multiply q by. May be NULL.
2331 * @return  1 on success.
2332 * @return  0 on error.
2333 */
2334static int wolfssl_ec_point_mul(int curveIdx, ecc_point* r, mp_int* n,
2335    ecc_point* q, mp_int* m)
2336{
2337    int ret = 1;
2338#ifdef WOLFSSL_SMALL_STACK
2339    mp_int* a = NULL;
2340    mp_int* prime = NULL;
2341#else
2342    mp_int a[1], prime[1];
2343#endif
2344
2345#ifdef WOLFSSL_SMALL_STACK
2346    /* Allocate MP integer for curve parameter: a. */
2347    a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
2348    if (a == NULL) {
2349        ret = 0;
2350    }
2351    if (ret == 1) {
2352        /* Allocate MP integer for curve parameter: prime. */
2353        prime = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT);
2354        if (prime == NULL)  {
2355            ret = 0;
2356        }
2357    }
2358#endif
2359
2360    /* Initialize the MP ints. */
2361    if ((ret == 1) && (mp_init_multi(prime, a, NULL, NULL, NULL, NULL) !=
2362             MP_OKAY)) {
2363        WOLFSSL_MSG("mp_init_multi error");
2364        ret = 0;
2365    }
2366
2367    /* Read the curve parameter: prime. */
2368    if ((ret == 1) && (mp_read_radix(prime, ecc_sets[curveIdx].prime,
2369            MP_RADIX_HEX) != MP_OKAY)) {
2370        WOLFSSL_MSG("mp_read_radix prime error");
2371        ret = 0;
2372    }
2373
2374    /* Read the curve parameter: a. */
2375    if ((ret == 1) && (mp_read_radix(a, ecc_sets[curveIdx].Af,
2376            MP_RADIX_HEX) != MP_OKAY)) {
2377        WOLFSSL_MSG("mp_read_radix a error");
2378        ret = 0;
2379    }
2380
2381    if ((ret == 1) && (n != NULL)) {
2382        /* Get generator - base point. */
2383    #if !defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0)
2384        if ((ret == 1) && (wc_ecc_get_generator(r, curveIdx) != MP_OKAY)) {
2385            WOLFSSL_MSG("wc_ecc_get_generator error");
2386            ret = 0;
2387        }
2388    #else
2389        /* wc_ecc_get_generator is not defined in the FIPS v2 module. */
2390        /* Read generator (base point) x-ordinate. */
2391        if ((ret == 1) && (mp_read_radix(r->x, ecc_sets[curveIdx].Gx,
2392                MP_RADIX_HEX) != MP_OKAY)) {
2393            WOLFSSL_MSG("mp_read_radix Gx error");
2394            ret = 0;
2395        }
2396        /* Read generator (base point) y-ordinate. */
2397        if ((ret == 1) && (mp_read_radix(r->y, ecc_sets[curveIdx].Gy,
2398                MP_RADIX_HEX) != MP_OKAY)) {
2399            WOLFSSL_MSG("mp_read_radix Gy error");
2400            ret = 0;
2401        }
2402        /* z-ordinate is one as point is affine. */
2403        if ((ret == 1) && (mp_set(r->z, 1) != MP_OKAY)) {
2404            WOLFSSL_MSG("mp_set Gz error");
2405            ret = 0;
2406        }
2407    #endif /* NOPT_FIPS_VERSION == 2 */
2408    }
2409
2410    if ((ret == 1) && (n != NULL) && (q != NULL) && (m != NULL)) {
2411        /* r = base point * n + q * m */
2412        ret = ec_mul2add(r, r, n, q, m, a, prime);
2413    }
2414    /* Not all values present, see if we are only doing base point * n. */
2415    else if ((ret == 1) && (n != NULL)) {
2416        /* r = base point * n */
2417        if (wc_ecc_mulmod(n, r, r, a, prime, 1) != MP_OKAY) {
2418            WOLFSSL_MSG("wc_ecc_mulmod gn error");
2419            ret = 0;
2420        }
2421    }
2422    /* Not all values present, see if we are only doing q * m. */
2423    else if ((ret == 1) && (q != NULL) && (m != NULL)) {
2424        /* r = q * m */
2425        if (wc_ecc_mulmod(m, q, r, a, prime, 1) != MP_OKAY) {
2426            WOLFSSL_MSG("wc_ecc_mulmod qm error");
2427            ret = 0;
2428        }
2429    }
2430    /* No values to use. */
2431    else if (ret == 1) {
2432        /* Set result to infinity as no values passed in. */
2433        mp_zero(r->x);
2434        mp_zero(r->y);
2435        mp_zero(r->z);
2436    }
2437
2438    mp_clear(a);
2439    mp_clear(prime);
2440    WC_FREE_VAR_EX(a, NULL, DYNAMIC_TYPE_BIGINT);
2441    WC_FREE_VAR_EX(prime, NULL, DYNAMIC_TYPE_BIGINT);
2442    return ret;
2443}
2444
2445/* Sum the scalar multiplications of the base point and n, and q and m.
2446 *
2447 * r = base point * n + q * m
2448 *
2449 * Return code compliant with OpenSSL.
2450 *
2451 * @param [in]  group  EC group.
2452 * @param [out] r      EC point that is result of operation.
2453 * @param [in]  n      Scalar to multiply by base point. May be NULL.
2454 * @param [in]  q      EC point to be scalar multiplied. May be NULL.
2455 * @param [in]  m      Scalar to multiply q by. May be NULL.
2456 * @param [in]  ctx    Context to use for BN operations. Unused.
2457 * @return  1 on success.
2458 * @return  0 on error.
2459 */
2460int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
2461    const WOLFSSL_BIGNUM *n, const WOLFSSL_EC_POINT *q, const WOLFSSL_BIGNUM *m,
2462    WOLFSSL_BN_CTX *ctx)
2463{
2464    int ret = 1;
2465
2466    /* No BN operations performed. */
2467    (void)ctx;
2468
2469    WOLFSSL_ENTER("wolfSSL_EC_POINT_mul");
2470
2471    /* Validate parameters. */
2472    if ((group == NULL) || (r == NULL)) {
2473        WOLFSSL_MSG("wolfSSL_EC_POINT_mul NULL error");
2474        ret = 0;
2475    }
2476
2477    /* Ensure the internal representation of the EC point q is setup. */
2478    if ((ret == 1) && (q != NULL) && (ec_point_setup(q) != 1)) {
2479        WOLFSSL_MSG("ec_point_setup error");
2480        ret = 0;
2481    }
2482
2483#ifdef DEBUG_WOLFSSL
2484    if (ret == 1) {
2485        int nid = wolfSSL_EC_GROUP_get_curve_name(group);
2486        const char* curve = wolfSSL_OBJ_nid2ln(nid);
2487        const char* nistName = wolfSSL_EC_curve_nid2nist(nid);
2488        char* num;
2489        wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_mul input q", q);
2490        num = wolfSSL_BN_bn2hex(n);
2491        WOLFSSL_MSG_EX("\tn = %s", num);
2492        XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL);
2493        num = wolfSSL_BN_bn2hex(m);
2494        WOLFSSL_MSG_EX("\tm = %s", num);
2495        XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL);
2496        if (curve != NULL)
2497            WOLFSSL_MSG_EX("curve name: %s", curve);
2498        if (nistName != NULL)
2499            WOLFSSL_MSG_EX("nist curve name: %s", nistName);
2500    }
2501#endif
2502
2503    if (ret == 1) {
2504        mp_int* ni = (n != NULL) ? (mp_int*)n->internal : NULL;
2505        ecc_point* qi = (q != NULL) ? (ecc_point*)q->internal : NULL;
2506        mp_int* mi = (m != NULL) ? (mp_int*)m->internal : NULL;
2507
2508        /* Perform multiplication with wolfCrypt objects. */
2509        ret = wolfssl_ec_point_mul(group->curve_idx, (ecc_point*)r->internal,
2510            ni, qi, mi);
2511    }
2512
2513    /* Only on success is the internal point guaranteed to be set. */
2514    if (r != NULL) {
2515        r->inSet = (ret == 1);
2516    }
2517    /* Copy internal EC point values out to external EC point. */
2518    if ((ret == 1) && (ec_point_external_set(r) != 1)) {
2519        WOLFSSL_MSG("ec_point_external_set error");
2520        ret = 0;
2521    }
2522
2523#ifdef DEBUG_WOLFSSL
2524    if (ret == 1) {
2525        wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_mul result", r);
2526    }
2527#endif
2528
2529    return ret;
2530}
2531#endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A && !HAVE_SELFTEST &&
2532        * !WOLFSSL_SP_MATH */
2533
2534/* Invert the point on the curve.
2535 * (x, y) -> (x, -y) = (x, (prime - y) % prime)
2536 *
2537 * @param [in]      curveIdx  Index of curve in ecc_set.
2538 * @param [in, out] point     EC point to invert.
2539 * @return  1 on success.
2540 * @return  0 on error.
2541 */
2542static int wolfssl_ec_point_invert(int curveIdx, ecc_point* point)
2543{
2544    int ret = 1;
2545    WC_DECLARE_VAR(prime, mp_int, 1, 0);
2546
2547    /* Allocate memory for an MP int to hold the prime of the curve. */
2548    WC_ALLOC_VAR_EX(prime, mp_int, 1, NULL, DYNAMIC_TYPE_BIGINT, ret=0);
2549
2550    /* Initialize MP int. */
2551    if ((ret == 1) && (mp_init(prime) != MP_OKAY)) {
2552        WOLFSSL_MSG("mp_init_multi error");
2553        ret = 0;
2554    }
2555
2556    /* Read the curve parameter: prime. */
2557    if ((ret == 1) && (mp_read_radix(prime, ecc_sets[curveIdx].prime,
2558            MP_RADIX_HEX) != MP_OKAY)) {
2559        WOLFSSL_MSG("mp_read_radix prime error");
2560        ret = 0;
2561    }
2562
2563    /* y = (prime - y) mod prime. */
2564    if ((ret == 1) && (!mp_iszero(point->y)) && (mp_sub(prime, point->y,
2565            point->y) != MP_OKAY)) {
2566        WOLFSSL_MSG("mp_sub error");
2567        ret = 0;
2568    }
2569
2570    /* Dispose of memory associated with MP. */
2571    mp_free(prime);
2572    WC_FREE_VAR_EX(prime, NULL, DYNAMIC_TYPE_BIGINT);
2573    return ret;
2574}
2575
2576/* Invert the point on the curve.
2577 * (x, y) -> (x, -y) = (x, (prime - y) % prime)
2578 *
2579 * @param [in]      group  EC group.
2580 * @param [in, out] point  EC point to invert.
2581 * @param [in]      ctx    Context to use for BN operations. Unused.
2582 * @return  1 on success.
2583 * @return  0 on error.
2584 */
2585int wolfSSL_EC_POINT_invert(const WOLFSSL_EC_GROUP *group,
2586    WOLFSSL_EC_POINT *point, WOLFSSL_BN_CTX *ctx)
2587{
2588    int ret = 1;
2589
2590    /* No BN operations performed. */
2591    (void)ctx;
2592
2593    WOLFSSL_ENTER("wolfSSL_EC_POINT_invert");
2594
2595    /* Validate parameters. */
2596    if ((group == NULL) || (point == NULL) || (point->internal == NULL)) {
2597        ret = 0;
2598    }
2599
2600    /* Ensure internal representation of point is setup. */
2601    if ((ret == 1) && (ec_point_setup(point) != 1)) {
2602        ret = 0;
2603    }
2604
2605#ifdef DEBUG_WOLFSSL
2606    if (ret == 1) {
2607        int nid = wolfSSL_EC_GROUP_get_curve_name(group);
2608        const char* curve = wolfSSL_OBJ_nid2ln(nid);
2609        const char* nistName = wolfSSL_EC_curve_nid2nist(nid);
2610        wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_invert input", point);
2611        if (curve != NULL)
2612            WOLFSSL_MSG_EX("curve name: %s", curve);
2613        if (nistName != NULL)
2614            WOLFSSL_MSG_EX("nist curve name: %s", nistName);
2615
2616    }
2617#endif
2618
2619    if (ret == 1 && !wolfSSL_BN_is_one(point->Z)) {
2620#if !defined(WOLFSSL_SP_MATH) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)
2621        if (ec_point_convert_to_affine(group, point) != 0)
2622            ret = 0;
2623#else
2624        WOLFSSL_MSG("wolfSSL_EC_POINT_invert called on non-affine point");
2625        ret = 0;
2626#endif
2627    }
2628
2629    if (ret == 1) {
2630        /* Perform inversion using wolfCrypt objects. */
2631        ret = wolfssl_ec_point_invert(group->curve_idx,
2632            (ecc_point*)point->internal);
2633    }
2634
2635    /* Set the external EC point representation based on internal. */
2636    if ((ret == 1) && (ec_point_external_set(point) != 1)) {
2637        WOLFSSL_MSG("ec_point_external_set error");
2638        ret = 0;
2639    }
2640
2641#ifdef DEBUG_WOLFSSL
2642    if (ret == 1) {
2643        wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_invert result", point);
2644    }
2645#endif
2646
2647    return ret;
2648}
2649
2650#ifdef WOLFSSL_EC_POINT_CMP_JACOBIAN
2651/* Compare two points on a the same curve.
2652 *
2653 * (Ax, Ay, Az) => (Ax / (Az ^ 2), Ay / (Az ^ 3))
2654 * (Bx, By, Bz) => (Bx / (Bz ^ 2), By / (Bz ^ 3))
2655 * When equal:
2656 *      (Ax / (Az ^ 2), Ay / (Az ^ 3)) = (Bx / (Bz ^ 2), By / (Bz ^ 3))
2657 *   => (Ax * (Bz ^ 2), Ay * (Bz ^ 3)) = (Bx * (Az ^ 2), By * (Az ^ 3))
2658 *
2659 * @param [in] group  EC group.
2660 * @param [in] a      EC point to compare.
2661 * @param [in] b      EC point to compare.
2662 * @return  0 when equal.
2663 * @return  1 when different.
2664 * @return  -1 on error.
2665 */
2666static int ec_point_cmp_jacobian(const WOLFSSL_EC_GROUP* group,
2667    const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b, WOLFSSL_BN_CTX *ctx)
2668{
2669    int ret = 0;
2670    BIGNUM* at = BN_new();
2671    BIGNUM* bt = BN_new();
2672    BIGNUM* az = BN_new();
2673    BIGNUM* bz = BN_new();
2674    BIGNUM* mod = BN_new();
2675
2676    /* Check that the big numbers were allocated. */
2677    if ((at == NULL) || (bt == NULL) || (az == NULL) || (bz == NULL) ||
2678            (mod == NULL)) {
2679        ret = WOLFSSL_FATAL_ERROR;
2680    }
2681    /* Get the modulus for the curve. */
2682    if ((ret == 0) &&
2683            (BN_hex2bn(&mod, ecc_sets[group->curve_idx].prime) != 1)) {
2684        ret = WOLFSSL_FATAL_ERROR;
2685    }
2686    if (ret == 0) {
2687        /* bt = Bx * (Az ^ 2). When Az is one then just copy. */
2688        if (BN_is_one(a->Z)) {
2689            if (BN_copy(bt, b->X) == NULL) {
2690                ret = WOLFSSL_FATAL_ERROR;
2691            }
2692        }
2693        /* az = Az ^ 2 */
2694        else if ((BN_mod_mul(az, a->Z, a->Z, mod, ctx) != 1)) {
2695            ret = WOLFSSL_FATAL_ERROR;
2696        }
2697        /* bt = Bx * az = Bx * (Az ^ 2) */
2698        else if (BN_mod_mul(bt, b->X, az, mod, ctx) != 1) {
2699            ret = WOLFSSL_FATAL_ERROR;
2700        }
2701    }
2702    if (ret == 0) {
2703        /* at = Ax * (Bz ^ 2). When Bz is one then just copy. */
2704        if (BN_is_one(b->Z)) {
2705            if (BN_copy(at, a->X) == NULL) {
2706                ret = WOLFSSL_FATAL_ERROR;
2707            }
2708        }
2709        /* bz = Bz ^ 2 */
2710        else if (BN_mod_mul(bz, b->Z, b->Z, mod, ctx) != 1) {
2711            ret = WOLFSSL_FATAL_ERROR;
2712        }
2713        /* at = Ax * bz = Ax * (Bz ^ 2) */
2714        else if (BN_mod_mul(at, a->X, bz, mod, ctx) != 1) {
2715            ret = WOLFSSL_FATAL_ERROR;
2716        }
2717    }
2718    /* Compare x-ordinates. */
2719    if ((ret == 0) && (BN_cmp(at, bt) != 0)) {
2720        ret = 1;
2721    }
2722    if (ret == 0) {
2723        /* bt = By * (Az ^ 3). When Az is one then just copy. */
2724        if (BN_is_one(a->Z)) {
2725            if (BN_copy(bt, b->Y) == NULL) {
2726                ret = WOLFSSL_FATAL_ERROR;
2727            }
2728        }
2729        /* az = az * Az = Az ^ 3 */
2730        else if ((BN_mod_mul(az, az, a->Z, mod, ctx) != 1)) {
2731            ret = WOLFSSL_FATAL_ERROR;
2732        }
2733        /* bt = By * az = By * (Az ^ 3) */
2734        else if (BN_mod_mul(bt, b->Y, az, mod, ctx) != 1) {
2735            ret = WOLFSSL_FATAL_ERROR;
2736        }
2737    }
2738    if (ret == 0) {
2739        /* at = Ay * (Bz ^ 3). When Bz is one then just copy. */
2740        if (BN_is_one(b->Z)) {
2741            if (BN_copy(at, a->Y) == NULL) {
2742                ret = WOLFSSL_FATAL_ERROR;
2743            }
2744        }
2745        /* bz = bz * Bz = Bz ^ 3 */
2746        else if (BN_mod_mul(bz, bz, b->Z, mod, ctx) != 1) {
2747            ret = WOLFSSL_FATAL_ERROR;
2748        }
2749        /* at = Ay * bz = Ay * (Bz ^ 3) */
2750        else if (BN_mod_mul(at, a->Y, bz, mod, ctx) != 1) {
2751            ret = WOLFSSL_FATAL_ERROR;
2752        }
2753    }
2754    /* Compare y-ordinates. */
2755    if ((ret == 0) && (BN_cmp(at, bt) != 0)) {
2756        ret = 1;
2757    }
2758
2759    BN_free(mod);
2760    BN_free(bz);
2761    BN_free(az);
2762    BN_free(bt);
2763    BN_free(at);
2764    return ret;
2765}
2766#endif
2767
2768/* Compare two points on a the same curve.
2769 *
2770 * Return code compliant with OpenSSL.
2771 *
2772 * @param [in] group  EC group.
2773 * @param [in] a      EC point to compare.
2774 * @param [in] b      EC point to compare.
2775 * @param [in] ctx    Context to use for BN operations. Unused.
2776 * @return  0 when equal.
2777 * @return  1 when different.
2778 * @return  -1 on error.
2779 */
2780int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group,
2781    const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b, WOLFSSL_BN_CTX *ctx)
2782{
2783    int ret = 0;
2784
2785    WOLFSSL_ENTER("wolfSSL_EC_POINT_cmp");
2786
2787    /* Validate parameters. */
2788    if ((group == NULL) || (a == NULL) || (a->internal == NULL) ||
2789            (b == NULL) || (b->internal == NULL)) {
2790        WOLFSSL_MSG("wolfSSL_EC_POINT_cmp Bad arguments");
2791        ret = WOLFSSL_FATAL_ERROR;
2792    }
2793    if (ret != -1) {
2794    #ifdef WOLFSSL_EC_POINT_CMP_JACOBIAN
2795        /* If same Z ordinate then no need to convert to affine. */
2796        if (BN_cmp(a->Z, b->Z) == 0) {
2797            /* Compare */
2798            ret = ((BN_cmp(a->X, b->X) != 0) || (BN_cmp(a->Y, b->Y) != 0));
2799        }
2800        else {
2801            ret = ec_point_cmp_jacobian(group, a, b, ctx);
2802        }
2803    #else
2804        /* No BN operations performed. */
2805        (void)ctx;
2806
2807        ret = (wc_ecc_cmp_point((ecc_point*)a->internal,
2808            (ecc_point*)b->internal) != MP_EQ);
2809    #endif
2810    }
2811
2812    return ret;
2813}
2814
2815/* Copy EC point.
2816 *
2817 * @param [out] dest  EC point to copy into.
2818 * @param [in]  src   EC point to copy.
2819 * @return  1 on success.
2820 * @return  0 on error.
2821 */
2822int wolfSSL_EC_POINT_copy(WOLFSSL_EC_POINT *dest, const WOLFSSL_EC_POINT *src)
2823{
2824    int ret = 1;
2825
2826    WOLFSSL_ENTER("wolfSSL_EC_POINT_copy");
2827
2828    /* Validate parameters. */
2829    if ((dest == NULL) || (src == NULL)) {
2830        ret = 0;
2831    }
2832
2833    /* Ensure internal EC point of src is setup. */
2834    if ((ret == 1) && (ec_point_setup(src) != 1)) {
2835        ret = 0;
2836    }
2837
2838    /* Copy internal EC points. */
2839    if ((ret == 1) && (wc_ecc_copy_point((ecc_point*)src->internal,
2840            (ecc_point*)dest->internal) != MP_OKAY)) {
2841        ret = 0;
2842    }
2843
2844    if (ret == 1) {
2845        /* Destinatation internal point is set. */
2846        dest->inSet = 1;
2847
2848        /* Set the external EC point of dest based on internal. */
2849        if (ec_point_external_set(dest) != 1) {
2850            ret = 0;
2851        }
2852    }
2853
2854    return ret;
2855}
2856
2857/* Duplicates an EC point.
2858 *
2859 * @param [in] src    EC point to duplicate.
2860 * @param [in] group  EC group for the new point.
2861 * @return  New EC point on success.
2862 * @return  NULL on failure.
2863 */
2864WOLFSSL_EC_POINT *wolfSSL_EC_POINT_dup(const WOLFSSL_EC_POINT *src,
2865    const WOLFSSL_EC_GROUP *group)
2866{
2867    WOLFSSL_EC_POINT *dest;
2868
2869    WOLFSSL_ENTER("wolfSSL_EC_POINT_dup");
2870
2871    if ((src == NULL) || (group == NULL)) {
2872        return NULL;
2873    }
2874
2875    dest = wolfSSL_EC_POINT_new(group);
2876    if (dest == NULL) {
2877        return NULL;
2878    }
2879
2880    if (wolfSSL_EC_POINT_copy(dest, src) != 1) {
2881        wolfSSL_EC_POINT_free(dest);
2882        return NULL;
2883    }
2884
2885    return dest;
2886}
2887
2888/* Checks whether point is at infinity.
2889 *
2890 * Return code compliant with OpenSSL.
2891 *
2892 * @param [in] group  EC group.
2893 * @param [in] point  EC point to check.
2894 * @return  1 when at infinity.
2895 * @return  0 when not at infinity.
2896 */
2897int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group,
2898    const WOLFSSL_EC_POINT *point)
2899{
2900    int ret = 1;
2901
2902    WOLFSSL_ENTER("wolfSSL_EC_POINT_is_at_infinity");
2903
2904    /* Validate parameters. */
2905    if ((group == NULL) || (point == NULL) || (point->internal == NULL)) {
2906        WOLFSSL_MSG("wolfSSL_EC_POINT_is_at_infinity NULL error");
2907        ret = 0;
2908    }
2909
2910    /* Ensure internal EC point is setup. */
2911    if ((ret == 1) && (ec_point_setup(point) != 1)) {
2912        ret = 0;
2913    }
2914    if (ret == 1) {
2915    #ifndef WOLF_CRYPTO_CB_ONLY_ECC
2916        /* Check for infinity. */
2917        ret = wc_ecc_point_is_at_infinity((ecc_point*)point->internal);
2918        if (ret < 0) {
2919            WOLFSSL_MSG("ecc_point_is_at_infinity failure");
2920            /* Error return is 0 by OpenSSL. */
2921            ret = 0;
2922        }
2923    #else
2924        WOLFSSL_MSG("ecc_point_is_at_infinitiy compiled out");
2925        ret = 0;
2926    #endif
2927    }
2928
2929    return ret;
2930}
2931
2932#endif /* OPENSSL_EXTRA */
2933
2934/* End EC_POINT */
2935
2936/* Start EC_KEY */
2937
2938#ifdef OPENSSL_EXTRA
2939
2940/*
2941 * EC key constructor/deconstructor APIs
2942 */
2943
2944/* Allocate a new EC key.
2945 *
2946 * Not OpenSSL API.
2947 *
2948 * @param [in] heap   Heap hint for dynamic memory allocation.
2949 * @param [in] devId  Device identifier value.
2950 * @return  New, allocated EC key on success.
2951 * @return  NULL on error.
2952 */
2953WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_ex(void* heap, int devId)
2954{
2955    WOLFSSL_EC_KEY *key = NULL;
2956    int err = 0;
2957
2958    WOLFSSL_ENTER("wolfSSL_EC_KEY_new");
2959
2960    /* Allocate memory for EC key. */
2961    key = (WOLFSSL_EC_KEY*)XMALLOC(sizeof(WOLFSSL_EC_KEY), heap,
2962        DYNAMIC_TYPE_ECC);
2963    if (key == NULL) {
2964        WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_KEY failure");
2965        err = 1;
2966    }
2967    if (!err) {
2968        /* Reset all fields to 0. */
2969        XMEMSET(key, 0, sizeof(WOLFSSL_EC_KEY));
2970        /* Cache heap hint. */
2971        key->heap = heap;
2972        /* Initialize fields to defaults. */
2973        key->form     = WC_POINT_CONVERSION_UNCOMPRESSED;
2974
2975        /* Initialize reference count. */
2976        wolfSSL_RefInit(&key->ref, &err);
2977#ifdef WOLFSSL_REFCNT_ERROR_RETURN
2978    }
2979    if (!err) {
2980#endif
2981        /* Allocate memory for internal EC key representation. */
2982        key->internal = (ecc_key*)XMALLOC(sizeof(ecc_key), heap,
2983            DYNAMIC_TYPE_ECC);
2984        if (key->internal == NULL) {
2985            WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc ecc key failure");
2986            err = 1;
2987        }
2988    }
2989    if (!err) {
2990        /* Initialize wolfCrypt EC key. */
2991        if (wc_ecc_init_ex((ecc_key*)key->internal, heap, devId) != 0) {
2992            WOLFSSL_MSG("wolfSSL_EC_KEY_new init ecc key failure");
2993            err = 1;
2994        }
2995    }
2996
2997    if (!err) {
2998        /* Group unknown at creation */
2999        key->group = wolfSSL_EC_GROUP_new_by_curve_name(WC_NID_undef);
3000        if (key->group == NULL) {
3001            WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure");
3002            err = 1;
3003        }
3004    }
3005
3006    if (!err) {
3007        /* Allocate a point as public key. */
3008        key->pub_key = wolfSSL_EC_POINT_new(key->group);
3009        if (key->pub_key == NULL) {
3010            WOLFSSL_MSG("wolfSSL_EC_POINT_new failure");
3011            err = 1;
3012        }
3013    }
3014
3015    if (!err) {
3016        /* Allocate a BN as private key. */
3017        key->priv_key = wolfSSL_BN_new();
3018        if (key->priv_key == NULL) {
3019            WOLFSSL_MSG("wolfSSL_BN_new failure");
3020            err = 1;
3021        }
3022    }
3023
3024    if (err) {
3025        /* Dispose of EC key on error. */
3026        wolfSSL_EC_KEY_free(key);
3027        key = NULL;
3028    }
3029    /* Return new EC key object. */
3030    return key;
3031}
3032
3033/* Allocate a new EC key.
3034 *
3035 * @return  New, allocated EC key on success.
3036 * @return  NULL on error.
3037 */
3038WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void)
3039{
3040    return wolfSSL_EC_KEY_new_ex(NULL, INVALID_DEVID);
3041}
3042
3043/* Create new EC key with the group having the specified numeric ID.
3044 *
3045 * @param [in] nid  Numeric ID.
3046 * @return  New, allocated EC key on success.
3047 * @return  NULL on error.
3048 */
3049WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid)
3050{
3051    WOLFSSL_EC_KEY *key;
3052    int err = 0;
3053
3054    WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
3055
3056    /* Allocate empty, EC key. */
3057    key = wolfSSL_EC_KEY_new();
3058    if (key == NULL) {
3059        WOLFSSL_MSG("wolfSSL_EC_KEY_new failure");
3060        err = 1;
3061    }
3062
3063    if (!err) {
3064        /* Set group to be nid. */
3065        ec_group_set_nid(key->group, nid);
3066        if (key->group->curve_idx == -1) {
3067            wolfSSL_EC_KEY_free(key);
3068            key = NULL;
3069        }
3070    }
3071
3072    /* Return the new EC key object. */
3073    return key;
3074}
3075
3076/* Dispose of the EC key and allocated data.
3077 *
3078 * Cannot use key after this call.
3079 *
3080 * @param [in] key  EC key to free.
3081 */
3082void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key)
3083{
3084    int doFree = 0;
3085    int err;
3086
3087    (void)err;
3088
3089    WOLFSSL_ENTER("wolfSSL_EC_KEY_free");
3090
3091    if (key != NULL) {
3092        void* heap = key->heap;
3093
3094        /* Decrement reference count. */
3095        wolfSSL_RefDec(&key->ref, &doFree, &err);
3096        if (doFree) {
3097            /* Dispose of allocated reference counting data. */
3098            wolfSSL_RefFree(&key->ref);
3099
3100            /* Dispose of private key. */
3101            wolfSSL_BN_free(key->priv_key);
3102            wolfSSL_EC_POINT_free(key->pub_key);
3103            wolfSSL_EC_GROUP_free(key->group);
3104            if (key->internal != NULL) {
3105                /* Dispose of wolfCrypt representation of EC key. */
3106                wc_ecc_free((ecc_key*)key->internal);
3107                XFREE(key->internal, heap, DYNAMIC_TYPE_ECC);
3108            }
3109
3110            /* Set back to NULLs for safety. */
3111            ForceZero(key, sizeof(*key));
3112
3113            /* Dispose of the memory associated with the EC key. */
3114            XFREE(key, heap, DYNAMIC_TYPE_ECC);
3115            (void)heap;
3116        }
3117    }
3118}
3119
3120/* Increments ref count of EC key.
3121 *
3122 * @param [in, out] key  EC key.
3123 * @return  1 on success
3124 * @return  0 on error
3125 */
3126int wolfSSL_EC_KEY_up_ref(WOLFSSL_EC_KEY* key)
3127{
3128    int err = 1;
3129
3130    if (key != NULL) {
3131        wolfSSL_RefInc(&key->ref, &err);
3132    }
3133
3134    return !err;
3135}
3136
3137#ifndef NO_CERTS
3138
3139#if defined(OPENSSL_ALL)
3140/* Copy the internal, wolfCrypt EC key.
3141 *
3142 * @param [in, out] dst  Destination wolfCrypt EC key.
3143 * @param [in]      src  Source wolfCrypt EC key.
3144 * @return  0 on success.
3145 * @return  Negative on error.
3146 */
3147static int wolfssl_ec_key_int_copy(ecc_key* dst, const ecc_key* src)
3148{
3149    int ret;
3150
3151    /* Copy public key. */
3152#if !defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0)
3153    ret = wc_ecc_copy_point(&src->pubkey, &dst->pubkey);
3154#else
3155    ret = wc_ecc_copy_point((ecc_point*)&src->pubkey, &dst->pubkey);
3156#endif
3157    if (ret != MP_OKAY) {
3158        WOLFSSL_MSG("wc_ecc_copy_point error");
3159    }
3160
3161    if (ret == 0) {
3162        /* Copy private key. */
3163        ret = mp_copy(wc_ecc_key_get_priv((ecc_key*)src),
3164            wc_ecc_key_get_priv(dst));
3165        if (ret != MP_OKAY) {
3166            WOLFSSL_MSG("mp_copy error");
3167        }
3168    }
3169
3170    if (ret == 0) {
3171        /* Copy domain parameters. */
3172        if (src->dp) {
3173            ret = wc_ecc_set_curve(dst, 0, src->dp->id);
3174            if (ret != 0) {
3175                WOLFSSL_MSG("wc_ecc_set_curve error");
3176            }
3177        }
3178    }
3179
3180    if (ret == 0) {
3181        /* Copy the other components. */
3182        dst->type  = src->type;
3183        dst->idx   = src->idx;
3184        dst->state = src->state;
3185        dst->flags = src->flags;
3186    }
3187
3188    return ret;
3189}
3190
3191/* Copies ecc_key into new WOLFSSL_EC_KEY object
3192 *
3193 * Copies the internal representation as well.
3194 *
3195 * @param [in] src  EC key to duplicate.
3196 *
3197 * @return  EC key on success.
3198 * @return  NULL on error.
3199 */
3200WOLFSSL_EC_KEY *wolfSSL_EC_KEY_dup(const WOLFSSL_EC_KEY *src)
3201{
3202    int err = 0;
3203    WOLFSSL_EC_KEY* newKey = NULL;
3204
3205    WOLFSSL_ENTER("wolfSSL_EC_KEY_dup");
3206
3207    /* Validate EC key. */
3208    if ((src == NULL) || (src->internal == NULL) || (src->group == NULL) ||
3209         (src->pub_key == NULL) || (src->priv_key == NULL)) {
3210        WOLFSSL_MSG("src NULL error");
3211        err = 1;
3212    }
3213
3214    if (!err) {
3215        /* Create a new, empty key. */
3216        newKey = wolfSSL_EC_KEY_new();
3217        if (newKey == NULL) {
3218            WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
3219            err = 1;
3220        }
3221    }
3222
3223    if (!err) {
3224        /* Copy internal EC key. */
3225        if (wolfssl_ec_key_int_copy((ecc_key*)newKey->internal,
3226                (ecc_key*)src->internal) != 0) {
3227            WOLFSSL_MSG("Copying internal EC key error");
3228            err = 1;
3229        }
3230    }
3231    if (!err) {
3232        /* Internal key set. */
3233        newKey->inSet = 1;
3234
3235        /* Copy group */
3236        err = wolfssl_ec_group_copy(newKey->group, src->group);
3237    }
3238    /* Copy public key. */
3239    if ((!err) && (wolfSSL_EC_POINT_copy(newKey->pub_key, src->pub_key) != 1)) {
3240        WOLFSSL_MSG("Copying EC public key error");
3241        err = 1;
3242    }
3243
3244    if (!err) {
3245        /* Set header size of private key in PKCS#8 format.*/
3246        newKey->pkcs8HeaderSz = src->pkcs8HeaderSz;
3247
3248        /* Copy private key. */
3249        if (wolfSSL_BN_copy(newKey->priv_key, src->priv_key) == NULL) {
3250            WOLFSSL_MSG("Copying EC private key error");
3251            err = 1;
3252        }
3253    }
3254
3255    if (err) {
3256        /* Dispose of EC key on error. */
3257        wolfSSL_EC_KEY_free(newKey);
3258        newKey = NULL;
3259    }
3260    /* Return the new EC key. */
3261    return newKey;
3262}
3263
3264#endif /* OPENSSL_ALL */
3265
3266#endif /* !NO_CERTS */
3267
3268/*
3269 * EC key to/from bin/octet APIs
3270 */
3271
3272/* Create an EC key from the octet encoded public key.
3273 *
3274 * Behaviour checked against OpenSSL.
3275 *
3276 * @param [out]     key  Reference to EC key. Must pass in a valid object with
3277 *                       group set.
3278 * @param [in, out] in   On in, reference to buffer that contains data.
3279 *                       On out, reference to buffer after public key data.
3280 * @param [in]      len  Length of data in the buffer. Must be length of the
3281 *                       encoded public key.
3282 * @return  Allocated EC key on success.
3283 * @return  NULL on error.
3284 */
3285WOLFSSL_EC_KEY *wolfSSL_o2i_ECPublicKey(WOLFSSL_EC_KEY **key,
3286   const unsigned char **in, long len)
3287{
3288    int err = 0;
3289    WOLFSSL_EC_KEY* ret = NULL;
3290
3291    WOLFSSL_ENTER("wolfSSL_o2i_ECPublicKey");
3292
3293    /* Validate parameters: EC group needed to perform import. */
3294    if ((key == NULL) || (*key == NULL) || ((*key)->group == NULL) ||
3295            (in == NULL) || (*in == NULL) || (len <= 0)) {
3296        WOLFSSL_MSG("wolfSSL_o2i_ECPublicKey Bad arguments");
3297        err = 1;
3298    }
3299
3300    if (!err) {
3301        /* Return the EC key object passed in. */
3302        ret = *key;
3303
3304        /* Import point into public key field. */
3305        if (wolfSSL_EC_POINT_oct2point(ret->group, ret->pub_key, *in,
3306                (size_t)len, NULL) != 1) {
3307            WOLFSSL_MSG("wolfSSL_EC_POINT_oct2point error");
3308            ret = NULL;
3309            err = 1;
3310        }
3311    }
3312    if (!err) {
3313        /* Assumed length passed in is all the data. */
3314        *in += len;
3315    }
3316
3317    return ret;
3318}
3319
3320/* Puts the encoded public key into out.
3321 *
3322 * Passing in NULL for out returns length only.
3323 * Passing in NULL for *out has buffer allocated, encoded into and passed back.
3324 * Passing non-NULL for *out has it encoded into and pointer moved past.
3325 *
3326 * @param [in]      key  EC key to encode.
3327 * @param [in, out] out  Reference to buffer to encode into. May be NULL or
3328 *                       point to NULL.
3329 * @return  Length of encoding in bytes on success.
3330 * @return  0 on error.
3331 */
3332int wolfSSL_i2o_ECPublicKey(const WOLFSSL_EC_KEY *key, unsigned char **out)
3333{
3334    int ret = 1;
3335    size_t len = 0;
3336    int form = WC_POINT_CONVERSION_UNCOMPRESSED;
3337
3338    WOLFSSL_ENTER("wolfSSL_i2o_ECPublicKey");
3339
3340    /* Validate parameters. */
3341    if (key == NULL) {
3342        WOLFSSL_MSG("wolfSSL_i2o_ECPublicKey Bad arguments");
3343        ret = 0;
3344    }
3345
3346    /* Ensure the external key data is set from the internal EC key. */
3347    if ((ret == 1) && (!key->exSet) && (SetECKeyExternal((WOLFSSL_EC_KEY*)
3348            key) != 1)) {
3349        WOLFSSL_MSG("SetECKeyExternal failure");
3350        ret = 0;
3351    }
3352
3353    if (ret == 1) {
3354    #ifdef HAVE_COMP_KEY
3355        /* Default to compressed form if not set */
3356        form = (key->form == WC_POINT_CONVERSION_UNCOMPRESSED) ?
3357               WC_POINT_CONVERSION_UNCOMPRESSED :
3358               WC_POINT_CONVERSION_COMPRESSED;
3359    #endif
3360
3361        /* Calculate length of point encoding. */
3362        len = wolfSSL_EC_POINT_point2oct(key->group, key->pub_key, form, NULL,
3363            0, NULL);
3364    }
3365    /* Encode if length calculated and pointer supplied to update. */
3366    if ((ret == 1) && (len != 0) && (out != NULL)) {
3367        unsigned char *tmp = NULL;
3368
3369        /* Allocate buffer for encoding if no buffer supplied. */
3370        if (*out == NULL) {
3371            tmp = (unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
3372            if (tmp == NULL) {
3373                WOLFSSL_MSG("malloc failed");
3374                ret = 0;
3375            }
3376        }
3377        else {
3378            /* Get buffer to encode into. */
3379            tmp = *out;
3380        }
3381
3382        /* Encode public key into buffer. */
3383        if ((ret == 1) && (wolfSSL_EC_POINT_point2oct(key->group, key->pub_key,
3384                form, tmp, len, NULL) == 0)) {
3385            ret = 0;
3386        }
3387
3388        if (ret == 1) {
3389            /* Return buffer if allocated. */
3390            if (*out == NULL) {
3391                *out = tmp;
3392            }
3393            else {
3394                /* Step over encoded data if not allocated. */
3395                *out += len;
3396            }
3397        }
3398        else if (*out == NULL) {
3399            /* Dispose of allocated buffer. */
3400            XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
3401        }
3402    }
3403
3404    if (ret == 1) {
3405        /* Return length on success. */
3406        ret = (int)len;
3407    }
3408    return ret;
3409}
3410
3411#ifdef HAVE_ECC_KEY_IMPORT
3412/* Create a EC key from the DER encoded private key.
3413 *
3414 * @param [out]     key   Reference to EC key.
3415 * @param [in, out] in    On in, reference to buffer that contains DER data.
3416 *                        On out, reference to buffer after private key data.
3417 * @param [in]      long  Length of data in the buffer. May be larger than the
3418 *                        length of the encoded private key.
3419 * @return  Allocated EC key on success.
3420 * @return  NULL on error.
3421 */
3422WOLFSSL_EC_KEY* wolfSSL_d2i_ECPrivateKey(WOLFSSL_EC_KEY** key,
3423    const unsigned char** in, long len)
3424{
3425    int err = 0;
3426    word32 idx = 0;
3427    WOLFSSL_EC_KEY* ret = NULL;
3428
3429    WOLFSSL_ENTER("wolfSSL_d2i_ECPrivateKey");
3430
3431    /* Validate parameters. */
3432    if ((in == NULL) || (*in == NULL) || (len <= 0)) {
3433        WOLFSSL_MSG("wolfSSL_d2i_ECPrivateKey Bad arguments");
3434        err = 1;
3435    }
3436
3437    /* Create a new, empty EC key.  */
3438    if ((!err) && ((ret = wolfSSL_EC_KEY_new()) == NULL)) {
3439        WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
3440        err = 1;
3441    }
3442
3443    /* Decode the private key DER data into internal EC key. */
3444    if ((!err) && (wc_EccPrivateKeyDecode(*in, &idx, (ecc_key*)ret->internal,
3445            (word32)len) != 0)) {
3446        WOLFSSL_MSG("wc_EccPrivateKeyDecode error");
3447        err = 1;
3448    }
3449
3450    if (!err) {
3451        /* Internal EC key setup. */
3452        ret->inSet = 1;
3453
3454        /* Set the EC key from the internal values. */
3455        if (SetECKeyExternal(ret) != 1) {
3456            WOLFSSL_MSG("SetECKeyExternal error");
3457            err = 1;
3458        }
3459    }
3460
3461    if (!err) {
3462        /* Move buffer on to next byte after data used. */
3463        *in += idx;
3464        if (key) {
3465            /* Return new EC key through reference. */
3466            *key = ret;
3467        }
3468    }
3469
3470    if (err && (ret != NULL)) {
3471        /* Dispose of allocated EC key. */
3472        wolfSSL_EC_KEY_free(ret);
3473        ret = NULL;
3474    }
3475    return ret;
3476}
3477#endif /* HAVE_ECC_KEY_IMPORT */
3478
3479/* Enecode the private key of the EC key into the buffer as DER.
3480 *
3481 * @param [in]      key  EC key to encode.
3482 * @param [in, out] out  On in, reference to buffer to place DER encoding into.
3483 *                       On out, reference to buffer after the encoding.
3484 *                       May be NULL.
3485 * @return  Length of DER encoding on success.
3486 * @return  0 on error.
3487 */
3488int wolfSSL_i2d_ECPrivateKey(const WOLFSSL_EC_KEY *key, unsigned char **out)
3489{
3490    int err = 0;
3491    word32 len = 0;
3492
3493    WOLFSSL_ENTER("wolfSSL_i2d_ECPrivateKey");
3494
3495    /* Validate parameters. */
3496    if (key == NULL) {
3497        WOLFSSL_MSG("wolfSSL_i2d_ECPrivateKey Bad arguments");
3498        err = 1;
3499    }
3500
3501    /* Update the internal EC key if not set. */
3502    if ((!err) && (!key->inSet) && (SetECKeyInternal((WOLFSSL_EC_KEY*)key) !=
3503            1)) {
3504        WOLFSSL_MSG("SetECKeyInternal error");
3505        err = 1;
3506    }
3507
3508    /* Calculate the length of the private key DER encoding using internal EC
3509     * key. */
3510    if ((!err) && ((int)(len = (word32)wc_EccKeyDerSize((ecc_key*)key->internal,
3511           0)) <= 0)) {
3512        WOLFSSL_MSG("wc_EccKeyDerSize error");
3513        err = 1;
3514    }
3515
3516    /* Only return length when out is NULL. */
3517    if ((!err) && (out != NULL)) {
3518        unsigned char* buf = NULL;
3519
3520        /* Must have a buffer to encode into. */
3521        if (*out == NULL) {
3522            /* Allocate a new buffer of appropriate length. */
3523            buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
3524            if (buf == NULL) {
3525                /* Error and return 0. */
3526                err = 1;
3527                len = 0;
3528            }
3529            else {
3530                /* Return the allocated buffer. */
3531                *out = buf;
3532            }
3533        }
3534        /* Encode the internal EC key as a private key in DER format. */
3535        if ((!err) && wc_EccPrivateKeyToDer((ecc_key*)key->internal, *out,
3536                len) < 0) {
3537            WOLFSSL_MSG("wc_EccPrivateKeyToDer error");
3538            err = 1;
3539        }
3540        else if (buf != *out) {
3541            /* Move the reference to byte past encoded private key. */
3542            *out += len;
3543        }
3544
3545        /* Dispose of any allocated buffer on error. */
3546        if (err && (*out == buf)) {
3547            if (buf != NULL) {
3548                ForceZero(buf, len);
3549            }
3550            XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
3551            *out = NULL;
3552        }
3553    }
3554
3555    return (int)len;
3556}
3557
3558/* Load private key into EC key from DER encoding.
3559 *
3560 * Not an OpenSSL compatibility API.
3561 *
3562 * @param [in, out] key     EC key to put private key values into.
3563 * @param [in]      derBuf  Buffer holding DER encoding.
3564 * @param [in]      derSz   Size of DER encoding in bytes.
3565 * @return  1 on success.
3566 * @return  -1 on error.
3567 */
3568int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
3569                           int derSz)
3570{
3571    return wolfSSL_EC_KEY_LoadDer_ex(key, derBuf, derSz,
3572        WOLFSSL_EC_KEY_LOAD_PRIVATE);
3573}
3574
3575/* Load private/public key into EC key from DER encoding.
3576 *
3577 * Not an OpenSSL compatibility API.
3578 *
3579 * @param [in, out] key     EC key to put private/public key values into.
3580 * @param [in]      derBuf  Buffer holding DER encoding.
3581 * @param [in]      derSz   Size of DER encoding in bytes.
3582 * @param [in]      opt     Key type option. Valid values:
3583 *                            WOLFSSL_EC_KEY_LOAD_PRIVATE,
3584 *                            WOLFSSL_EC_KEY_LOAD_PUBLIC.
3585 * @return  1 on success.
3586 * @return  -1 on error.
3587 */
3588int wolfSSL_EC_KEY_LoadDer_ex(WOLFSSL_EC_KEY* key, const unsigned char* derBuf,
3589                              int derSz, int opt)
3590{
3591    int res = 1;
3592    int ret;
3593    word32 idx = 0;
3594    word32 algId;
3595
3596    WOLFSSL_ENTER("wolfSSL_EC_KEY_LoadDer");
3597
3598    /* Validate parameters. */
3599    if ((key == NULL) || (key->internal == NULL) || (derBuf == NULL) ||
3600            (derSz <= 0)) {
3601        WOLFSSL_MSG("Bad function arguments");
3602        res = WOLFSSL_FATAL_ERROR;
3603    }
3604    if ((res == 1) && (opt != WOLFSSL_EC_KEY_LOAD_PRIVATE) &&
3605            (opt != WOLFSSL_EC_KEY_LOAD_PUBLIC)) {
3606        res = WOLFSSL_FATAL_ERROR;
3607    }
3608
3609    if (res == 1) {
3610        /* Assume no PKCS#8 header. */
3611        key->pkcs8HeaderSz = 0;
3612
3613        /* Check if input buffer has PKCS8 header. In the case that it does not
3614         * have a PKCS8 header then do not error out.
3615         */
3616        if ((ret = ToTraditionalInline_ex((const byte*)derBuf, &idx,
3617                (word32)derSz, &algId)) >= 0) {
3618            WOLFSSL_MSG("Found PKCS8 header");
3619            key->pkcs8HeaderSz = (word16)idx;
3620            res = 1;
3621        }
3622        /* Error out on parsing error. */
3623        else if (ret != WC_NO_ERR_TRACE(ASN_PARSE_E)) {
3624            WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 header");
3625            res = WOLFSSL_FATAL_ERROR;
3626        }
3627    }
3628
3629    if (res == 1) {
3630        /* Load into internal EC key based on key type option. */
3631        if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
3632            ret = wc_EccPrivateKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
3633                (word32)derSz);
3634        }
3635        else {
3636            ret = wc_EccPublicKeyDecode(derBuf, &idx, (ecc_key*)key->internal,
3637                (word32)derSz);
3638            if (ret < 0) {
3639                ecc_key *tmp = (ecc_key*)XMALLOC(sizeof(ecc_key),
3640                    ((ecc_key*)key->internal)->heap, DYNAMIC_TYPE_ECC);
3641                if (tmp == NULL) {
3642                    ret = WOLFSSL_FATAL_ERROR;
3643                }
3644                else {
3645                    /* We now try again as x.963 [point type][x][opt y]. */
3646                    ret = wc_ecc_init_ex(tmp, ((ecc_key*)key->internal)->heap,
3647                                         INVALID_DEVID);
3648                    if (ret == 0) {
3649                        ret = wc_ecc_import_x963(derBuf, (word32)derSz, tmp);
3650                        if (ret == 0) {
3651                            /* Take ownership of new key - set tmp to the old
3652                             * key which will then be freed below. */
3653                            ecc_key *old = (ecc_key *)key->internal;
3654                            key->internal = tmp;
3655                            tmp = old;
3656
3657                            idx = (word32)derSz;
3658                        }
3659                        wc_ecc_free(tmp);
3660                    }
3661                    XFREE(tmp, ((ecc_key*)key->internal)->heap,
3662                          DYNAMIC_TYPE_ECC);
3663                }
3664            }
3665        }
3666        if (ret < 0) {
3667            /* Error returned from wolfSSL. */
3668            if (opt == WOLFSSL_EC_KEY_LOAD_PRIVATE) {
3669                WOLFSSL_MSG("wc_EccPrivateKeyDecode failed");
3670            }
3671            else {
3672                WOLFSSL_MSG("wc_EccPublicKeyDecode failed");
3673            }
3674            res = WOLFSSL_FATAL_ERROR;
3675        }
3676
3677        /* Internal key updated - update whether it is a valid key. */
3678        key->inSet = (res == 1);
3679    }
3680
3681    /* Set the external EC key based on value in internal. */
3682    if ((res == 1) && (SetECKeyExternal(key) != 1)) {
3683        WOLFSSL_MSG("SetECKeyExternal failed");
3684        res = WOLFSSL_FATAL_ERROR;
3685    }
3686
3687    return res;
3688}
3689
3690
3691#ifndef NO_BIO
3692
3693WOLFSSL_EC_KEY *wolfSSL_d2i_EC_PUBKEY_bio(WOLFSSL_BIO *bio,
3694        WOLFSSL_EC_KEY **out)
3695{
3696    char* data = NULL;
3697    int dataSz = 0;
3698    int memAlloced = 0;
3699    WOLFSSL_EC_KEY* ec = NULL;
3700    int err = 0;
3701
3702    WOLFSSL_ENTER("wolfSSL_d2i_EC_PUBKEY_bio");
3703
3704    if (bio == NULL)
3705        return NULL;
3706
3707    if (err == 0 && wolfssl_read_bio(bio, &data, &dataSz, &memAlloced) != 0) {
3708        WOLFSSL_ERROR_MSG("wolfssl_read_bio failed");
3709        err = 1;
3710    }
3711
3712    if (err == 0 && (ec = wolfSSL_EC_KEY_new()) == NULL) {
3713        WOLFSSL_ERROR_MSG("wolfSSL_EC_KEY_new failed");
3714        err = 1;
3715    }
3716
3717    /* Load the EC key with the public key from the DER encoding. */
3718    if (err == 0 && wolfSSL_EC_KEY_LoadDer_ex(ec, (const unsigned char*)data,
3719            dataSz, WOLFSSL_EC_KEY_LOAD_PUBLIC) != 1) {
3720        WOLFSSL_ERROR_MSG("wolfSSL_EC_KEY_LoadDer_ex failed");
3721        err = 1;
3722    }
3723
3724    if (memAlloced)
3725        XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
3726    if (err) { /* on error */
3727        wolfSSL_EC_KEY_free(ec);
3728        ec = NULL;
3729    }
3730    else { /* on success */
3731        if (out != NULL)
3732            *out = ec;
3733    }
3734
3735    return ec;
3736}
3737
3738#endif /* !NO_BIO */
3739
3740/*
3741 * EC key PEM APIs
3742 */
3743
3744#ifdef HAVE_ECC_KEY_EXPORT
3745#if defined(WOLFSSL_KEY_GEN) && (!defined(NO_FILESYSTEM) || !defined(NO_BIO))
3746/* Encode the EC public key as DER.
3747 *
3748 * @param [in]  key   EC key to encode.
3749 * @param [out] der   Pointer through which buffer is returned.
3750 * @param [in]  heap  Heap hint.
3751 * @return  Size of encoding on success.
3752 * @return  0 on error.
3753 */
3754static int wolfssl_ec_key_to_pubkey_der(WOLFSSL_EC_KEY* key,
3755    unsigned char** der, void* heap)
3756{
3757    int sz;
3758    unsigned char* buf = NULL;
3759
3760    (void)heap;
3761
3762    /* Calculate encoded size to allocate. */
3763    sz = wc_EccPublicKeyDerSize((ecc_key*)key->internal, 1);
3764    if (sz <= 0) {
3765        WOLFSSL_MSG("wc_EccPublicKeyDerSize failed");
3766        sz = 0;
3767    }
3768    if (sz > 0) {
3769        /* Allocate memory to hold encoding. */
3770        buf = (byte*)XMALLOC((size_t)sz, heap, DYNAMIC_TYPE_TMP_BUFFER);
3771        if (buf == NULL) {
3772            WOLFSSL_MSG("malloc failed");
3773            sz = 0;
3774        }
3775    }
3776    if (sz > 0) {
3777        /* Encode public key to DER using wolfSSL.  */
3778        sz = wc_EccPublicKeyToDer((ecc_key*)key->internal, buf, (word32)sz, 1);
3779        if (sz < 0) {
3780            WOLFSSL_MSG("wc_EccPublicKeyToDer failed");
3781            sz = 0;
3782        }
3783    }
3784
3785    /* Return buffer on success. */
3786    if (sz > 0) {
3787        *der = buf;
3788    }
3789    else {
3790        /* Dispose of any dynamically allocated data not returned. */
3791        XFREE(buf, heap, DYNAMIC_TYPE_TMP_BUFFER);
3792    }
3793
3794    return sz;
3795}
3796#endif
3797
3798#if !defined(NO_FILESYSTEM) && defined(WOLFSSL_KEY_GEN)
3799/*
3800 * Return code compliant with OpenSSL.
3801 *
3802 * @param [in] fp   File pointer to write PEM encoding to.
3803 * @param [in] key  EC key to encode and write.
3804 * @return  1 on success.
3805 * @return  0 on error.
3806 */
3807int wolfSSL_PEM_write_EC_PUBKEY(XFILE fp, WOLFSSL_EC_KEY* key)
3808{
3809    int ret = 1;
3810    unsigned char* derBuf = NULL;
3811    int derSz = 0;
3812
3813    WOLFSSL_ENTER("wolfSSL_PEM_write_EC_PUBKEY");
3814
3815    /* Validate parameters. */
3816    if ((fp == XBADFILE) || (key == NULL)) {
3817        WOLFSSL_MSG("Bad argument.");
3818        return 0;
3819    }
3820
3821    /* Encode public key in EC key as DER. */
3822    derSz = wolfssl_ec_key_to_pubkey_der(key, &derBuf, key->heap);
3823    if (derSz == 0) {
3824        ret = 0;
3825    }
3826
3827    /* Write out to file the PEM encoding of the DER. */
3828    if ((ret == 1) && (der_write_to_file_as_pem(derBuf, derSz, fp,
3829            ECC_PUBLICKEY_TYPE, key->heap) != 1)) {
3830        ret = 0;
3831    }
3832
3833    /* Dispose of any dynamically allocated data. */
3834    XFREE(derBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
3835
3836    WOLFSSL_LEAVE("wolfSSL_PEM_write_EC_PUBKEY", ret);
3837
3838    return ret;
3839}
3840#endif
3841#endif
3842
3843#ifndef NO_BIO
3844/* Read a PEM encoded EC public key from a BIO.
3845 *
3846 * @param [in]  bio   BIO to read EC public key from.
3847 * @param [out] out   Pointer to return EC key object through. May be NULL.
3848 * @param [in]  cb    Password callback when PEM encrypted.
3849 * @param [in]  pass  NUL terminated string for passphrase when PEM
3850 *                    encrypted.
3851 * @return  New EC key object on success.
3852 * @return  NULL on error.
3853 */
3854WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_EC_PUBKEY(WOLFSSL_BIO* bio,
3855    WOLFSSL_EC_KEY** out, wc_pem_password_cb* cb, void *pass)
3856{
3857    int             err = 0;
3858    WOLFSSL_EC_KEY* ec = NULL;
3859    DerBuffer*      der = NULL;
3860    int             keyFormat = 0;
3861
3862    WOLFSSL_ENTER("wolfSSL_PEM_read_bio_EC_PUBKEY");
3863
3864    /* Validate parameters. */
3865    if (bio == NULL) {
3866        err = 1;
3867    }
3868
3869    if (!err) {
3870        /* Create an empty EC key. */
3871        ec = wolfSSL_EC_KEY_new();
3872        if (ec == NULL) {
3873            err = 1;
3874        }
3875    }
3876    /* Read a PEM key in to a new DER buffer. */
3877    if ((!err) && (pem_read_bio_key(bio, cb, pass, ECC_PUBLICKEY_TYPE,
3878            &keyFormat, &der) <= 0)) {
3879        err = 1;
3880    }
3881    /* Load the EC key with the public key from the DER encoding. */
3882    if ((!err) && (wolfSSL_EC_KEY_LoadDer_ex(ec, der->buffer, (int)der->length,
3883            WOLFSSL_EC_KEY_LOAD_PUBLIC) != 1)) {
3884        WOLFSSL_ERROR_MSG("Error loading DER buffer into WOLFSSL_EC_KEY");
3885        err = 1;
3886    }
3887
3888    /* Dispose of dynamically allocated data not needed anymore. */
3889    FreeDer(&der);
3890    if (err) {
3891        wolfSSL_EC_KEY_free(ec);
3892        ec = NULL;
3893    }
3894
3895    /* Return EC key through out if required. */
3896    if ((out != NULL) && (ec != NULL)) {
3897        *out = ec;
3898    }
3899    return ec;
3900}
3901
3902/* Read a PEM encoded EC private key from a BIO.
3903 *
3904 * @param [in]  bio   BIO to read EC private key from.
3905 * @param [out] out   Pointer to return EC key object through. May be NULL.
3906 * @param [in]  cb    Password callback when PEM encrypted.
3907 * @param [in]  pass  NUL terminated string for passphrase when PEM
3908 *                    encrypted.
3909 * @return  New EC key object on success.
3910 * @return  NULL on error.
3911 */
3912WOLFSSL_EC_KEY* wolfSSL_PEM_read_bio_ECPrivateKey(WOLFSSL_BIO* bio,
3913   WOLFSSL_EC_KEY** out, wc_pem_password_cb* cb, void *pass)
3914{
3915    int             err = 0;
3916    WOLFSSL_EC_KEY* ec = NULL;
3917    DerBuffer*      der = NULL;
3918    int             keyFormat = 0;
3919
3920    WOLFSSL_ENTER("wolfSSL_PEM_read_bio_ECPrivateKey");
3921
3922    /* Validate parameters. */
3923    if (bio == NULL) {
3924        err = 1;
3925    }
3926
3927    if (!err) {
3928        /* Create an empty EC key. */
3929        ec = wolfSSL_EC_KEY_new();
3930        if (ec == NULL) {
3931            err = 1;
3932        }
3933    }
3934    /* Read a PEM key in to a new DER buffer.
3935     * To check ENC EC PRIVATE KEY, it uses PRIVATEKEY_TYPE to call
3936     * pem_read_bio_key(), and then check key format if it is EC.
3937     */
3938    if ((!err) && (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE,
3939            &keyFormat, &der) <= 0)) {
3940        err = 1;
3941    }
3942    if (keyFormat != ECDSAk) {
3943        WOLFSSL_ERROR_MSG("Error not EC key format");
3944        err = 1;
3945    }
3946    /* Load the EC key with the private key from the DER encoding. */
3947    if ((!err) && (wolfSSL_EC_KEY_LoadDer_ex(ec, der->buffer, (int)der->length,
3948            WOLFSSL_EC_KEY_LOAD_PRIVATE) != 1)) {
3949        WOLFSSL_ERROR_MSG("Error loading DER buffer into WOLFSSL_EC_KEY");
3950        err = 1;
3951    }
3952
3953    /* Dispose of dynamically allocated data not needed anymore. */
3954    FreeDer(&der);
3955    if (err) {
3956        wolfSSL_EC_KEY_free(ec);
3957        ec = NULL;
3958    }
3959
3960    /* Return EC key through out if required. */
3961    if ((out != NULL) && (ec != NULL)) {
3962        *out = ec;
3963    }
3964    return ec;
3965}
3966#endif /* !NO_BIO */
3967
3968#if defined(WOLFSSL_KEY_GEN) && defined(HAVE_ECC_KEY_EXPORT)
3969#ifndef NO_BIO
3970/* Write out the EC public key as PEM to the BIO.
3971 *
3972 * @param [in] bio  BIO to write PEM encoding to.
3973 * @param [in] ec   EC public key to encode.
3974 * @return  1 on success.
3975 * @return  0 on error.
3976 */
3977int wolfSSL_PEM_write_bio_EC_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec)
3978{
3979    int ret = 1;
3980    unsigned char* derBuf = NULL;
3981    int derSz = 0;
3982
3983    WOLFSSL_ENTER("wolfSSL_PEM_write_bio_EC_PUBKEY");
3984
3985    /* Validate parameters. */
3986    if ((bio == NULL) || (ec == NULL)) {
3987        WOLFSSL_MSG("Bad Function Arguments");
3988        return 0;
3989    }
3990
3991    /* Encode public key in EC key as DER. */
3992    derSz = wolfssl_ec_key_to_pubkey_der(ec, &derBuf, ec->heap);
3993    if (derSz == 0) {
3994        ret = 0;
3995    }
3996
3997    /* Write out to BIO the PEM encoding of the EC public key. */
3998    if ((ret == 1) && (der_write_to_bio_as_pem(derBuf, derSz, bio,
3999            ECC_PUBLICKEY_TYPE) != 1)) {
4000        ret = 0;
4001    }
4002
4003    /* Dispose of any dynamically allocated data. */
4004    XFREE(derBuf, ec->heap, DYNAMIC_TYPE_TMP_BUFFER);
4005
4006    return ret;
4007}
4008
4009/* Write out the EC private key as PEM to the BIO.
4010 *
4011 * Return code compliant with OpenSSL.
4012 *
4013 * @param [in] bio       BIO to write PEM encoding to.
4014 * @param [in] ec        EC private key to encode.
4015 * @param [in] cipher    Cipher to use when PEM encrypted. May be NULL.
4016 * @param [in] passwd    Password string when PEM encrypted. May be NULL.
4017 * @param [in] passwdSz  Length of password string when PEM encrypted.
4018 * @param [in] cb        Password callback when PEM encrypted. Unused.
4019 * @param [in] pass      NUL terminated string for passphrase when PEM
4020 *                       encrypted. Unused.
4021 * @return  1 on success.
4022 * @return  0 on error.
4023 */
4024int wolfSSL_PEM_write_bio_ECPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EC_KEY* ec,
4025    const WOLFSSL_EVP_CIPHER* cipher, unsigned char* passwd, int passwdSz,
4026    wc_pem_password_cb* cb, void* arg)
4027{
4028    int ret = 1;
4029    unsigned char* pem = NULL;
4030    int pLen = 0;
4031
4032    (void)cb;
4033    (void)arg;
4034
4035    /* Validate parameters. */
4036    if ((bio == NULL) || (ec == NULL)) {
4037        ret = 0;
4038    }
4039
4040    /* Write EC private key to PEM. */
4041    if ((ret == 1) && (wolfSSL_PEM_write_mem_ECPrivateKey(ec, cipher, passwd,
4042            passwdSz, &pem, &pLen) != 1)) {
4043       ret = 0;
4044    }
4045    /* Write PEM to BIO. */
4046    if ((ret == 1) && (wolfSSL_BIO_write(bio, pem, pLen) != pLen)) {
4047        WOLFSSL_ERROR_MSG("EC private key BIO write failed");
4048        ret = 0;
4049    }
4050
4051    XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
4052
4053    return ret;
4054}
4055
4056#endif /* !NO_BIO */
4057
4058/* Encode the EC private key as PEM into buffer.
4059 *
4060 * Return code compliant with OpenSSL.
4061 * Not an OpenSSL API.
4062 *
4063 * @param [in]  ec        EC private key to encode.
4064 * @param [in]  cipher    Cipher to use when PEM encrypted. May be NULL.
4065 * @param [in]  passwd    Password string when PEM encrypted. May be NULL.
4066 * @param [in]  passwdSz  Length of password string when PEM encrypted.
4067 * @param [out] pem       Newly allocated buffer holding PEM encoding.
4068 * @param [out] pLen      Length of PEM encoding in bytes.
4069 * @return  1 on success.
4070 * @return  0 on error.
4071 */
4072int wolfSSL_PEM_write_mem_ECPrivateKey(WOLFSSL_EC_KEY* ec,
4073    const WOLFSSL_EVP_CIPHER* cipher, unsigned char* passwd, int passwdSz,
4074    unsigned char **pem, int *pLen)
4075{
4076#if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
4077    int ret = 1;
4078    byte* derBuf = NULL;
4079    word32 der_max_len = 0;
4080    int derSz = 0;
4081
4082    WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey");
4083
4084    /* Validate parameters. */
4085    if ((pem == NULL) || (pLen == NULL) || (ec == NULL) ||
4086            (ec->internal == NULL)) {
4087        WOLFSSL_MSG("Bad function arguments");
4088        ret = 0;
4089    }
4090
4091    /* Ensure internal EC key is set from external. */
4092    if ((ret == 1) && (ec->inSet == 0)) {
4093        WOLFSSL_MSG("No ECC internal set, do it");
4094
4095        if (SetECKeyInternal(ec) != 1) {
4096            WOLFSSL_MSG("SetECKeyInternal failed");
4097            ret = 0;
4098        }
4099    }
4100
4101    if (ret == 1) {
4102        /* Calculate maximum size of DER encoding.
4103         * 4 > size of pub, priv + ASN.1 additional information */
4104        der_max_len = 4 * (word32)wc_ecc_size((ecc_key*)ec->internal) +
4105                      WC_AES_BLOCK_SIZE;
4106
4107        /* Allocate buffer big enough to hold encoding. */
4108        derBuf = (byte*)XMALLOC((size_t)der_max_len, NULL,
4109            DYNAMIC_TYPE_TMP_BUFFER);
4110        if (derBuf == NULL) {
4111            WOLFSSL_MSG("malloc failed");
4112            ret = 0;
4113        }
4114    }
4115
4116    if (ret == 1) {
4117        /* Encode EC private key as DER. */
4118        derSz = wc_EccKeyToDer((ecc_key*)ec->internal, derBuf, der_max_len);
4119        if (derSz < 0) {
4120            WOLFSSL_MSG("wc_EccKeyToDer failed");
4121            ForceZero(derBuf, der_max_len);
4122            XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
4123            ret = 0;
4124        }
4125    }
4126
4127    /* Convert DER to PEM - possibly encrypting. */
4128    if ((ret == 1) && (der_to_enc_pem_alloc(derBuf, derSz, cipher, passwd,
4129            passwdSz, ECC_PRIVATEKEY_TYPE, NULL, pem, pLen) != 1)) {
4130        WOLFSSL_ERROR_MSG("der_to_enc_pem_alloc failed");
4131        ret = 0;
4132    }
4133
4134    return ret;
4135#else
4136    (void)ec;
4137    (void)cipher;
4138    (void)passwd;
4139    (void)passwdSz;
4140    (void)pem;
4141    (void)pLen;
4142    return 0;
4143#endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
4144}
4145
4146#ifndef NO_FILESYSTEM
4147/* Write out the EC private key as PEM to file.
4148 *
4149 * Return code compliant with OpenSSL.
4150 *
4151 * @param [in] fp        File pointer to write PEM encoding to.
4152 * @param [in] ec        EC private key to encode.
4153 * @param [in] cipher    Cipher to use when PEM encrypted. May be NULL.
4154 * @param [in] passwd    Password string when PEM encrypted. May be NULL.
4155 * @param [in] passwdSz  Length of password string when PEM encrypted.
4156 * @param [in] cb        Password callback when PEM encrypted. Unused.
4157 * @param [in] pass      NUL terminated string for passphrase when PEM
4158 *                       encrypted. Unused.
4159 * @return  1 on success.
4160 * @return  0 on error.
4161 */
4162int wolfSSL_PEM_write_ECPrivateKey(XFILE fp, WOLFSSL_EC_KEY *ec,
4163    const WOLFSSL_EVP_CIPHER *cipher, unsigned char *passwd, int passwdSz,
4164    wc_pem_password_cb *cb, void *pass)
4165{
4166    int ret = 1;
4167    byte *pem = NULL;
4168    int pLen = 0;
4169
4170    (void)cb;
4171    (void)pass;
4172
4173    WOLFSSL_MSG("wolfSSL_PEM_write_ECPrivateKey");
4174
4175    /* Validate parameters. */
4176    if ((fp == XBADFILE) || (ec == NULL) || (ec->internal == NULL)) {
4177        WOLFSSL_MSG("Bad function arguments");
4178        ret = 0;
4179    }
4180
4181    /* Write EC private key to PEM. */
4182    if ((ret == 1) && (wolfSSL_PEM_write_mem_ECPrivateKey(ec, cipher, passwd,
4183            passwdSz, &pem, &pLen) != 1)) {
4184        WOLFSSL_MSG("wolfSSL_PEM_write_mem_ECPrivateKey failed");
4185        ret = 0;
4186    }
4187
4188    /* Write out to file the PEM encoding of the EC private key. */
4189    if ((ret == 1) && ((int)XFWRITE(pem, 1, (size_t)pLen, fp) != pLen)) {
4190        WOLFSSL_MSG("ECC private key file write failed");
4191        ret = 0;
4192    }
4193
4194    /* Dispose of any dynamically allocated data. */
4195    XFREE(pem, NULL, DYNAMIC_TYPE_KEY);
4196
4197    return ret;
4198}
4199
4200#endif /* NO_FILESYSTEM */
4201#endif /* WOLFSSL_KEY_GEN && HAVE_ECC_KEY_EXPORT */
4202
4203/*
4204 * EC key print APIs
4205 */
4206
4207#ifndef NO_CERTS
4208
4209#if defined(XFPRINTF) && !defined(NO_FILESYSTEM) && \
4210    !defined(NO_STDIO_FILESYSTEM)
4211/* Print the EC key to a file pointer as text.
4212 *
4213 * @param [in] fp      File pointer.
4214 * @param [in] key     EC key to print.
4215 * @param [in] indent  Number of spaces to place before each line printed.
4216 * @return  1 on success.
4217 * @return  0 on failure.
4218 */
4219int wolfSSL_EC_KEY_print_fp(XFILE fp, WOLFSSL_EC_KEY* key, int indent)
4220{
4221    int ret = 1;
4222    int bits = 0;
4223    int priv = 0;
4224
4225    WOLFSSL_ENTER("wolfSSL_EC_KEY_print_fp");
4226
4227    /* Validate parameters. */
4228    if ((fp == XBADFILE) || (key == NULL) || (key->group == NULL) ||
4229            (indent < 0)) {
4230        ret = 0;
4231    }
4232
4233    if (ret == 1) {
4234        /* Get EC groups order size in bits. */
4235        bits = wolfSSL_EC_GROUP_order_bits(key->group);
4236        if (bits <= 0) {
4237            WOLFSSL_MSG("Failed to get group order bits.");
4238            ret = 0;
4239        }
4240    }
4241    if (ret == 1) {
4242        const char* keyType;
4243
4244        /* Determine whether this is a private or public key. */
4245        if ((key->priv_key != NULL) && (!wolfSSL_BN_is_zero(key->priv_key))) {
4246            keyType = "Private-Key";
4247            priv = 1;
4248        }
4249        else {
4250            keyType = "Public-Key";
4251        }
4252
4253        /* Print key header. */
4254        if (XFPRINTF(fp, "%*s%s: (%d bit)\n", indent, "", keyType, bits) < 0) {
4255            ret = 0;
4256        }
4257    }
4258    if ((ret == 1) && priv) {
4259        /* Print the private key BN. */
4260        ret = pk_bn_field_print_fp(fp, indent, "priv", key->priv_key);
4261    }
4262    /* Check for public key data in EC key. */
4263    if ((ret == 1) && (key->pub_key != NULL) && (key->pub_key->exSet)) {
4264        /* Get the public key point as one BN. */
4265        WOLFSSL_BIGNUM* pubBn = wolfSSL_EC_POINT_point2bn(key->group,
4266            key->pub_key, WC_POINT_CONVERSION_UNCOMPRESSED, NULL, NULL);
4267        if (pubBn == NULL) {
4268            WOLFSSL_MSG("wolfSSL_EC_POINT_point2bn failed.");
4269            ret = 0;
4270        }
4271        else {
4272            /* Print the public key in a BN. */
4273            ret = pk_bn_field_print_fp(fp, indent, "pub", pubBn);
4274            wolfSSL_BN_free(pubBn);
4275        }
4276    }
4277    if (ret == 1) {
4278        /* Get the NID of the group. */
4279        int nid = wolfSSL_EC_GROUP_get_curve_name(key->group);
4280        if (nid > 0) {
4281            /* Convert the NID into a long name and NIST name. */
4282            const char* curve = wolfSSL_OBJ_nid2ln(nid);
4283            const char* nistName = wolfSSL_EC_curve_nid2nist(nid);
4284
4285            /* Print OID name if known. */
4286            if ((curve != NULL) &&
4287                (XFPRINTF(fp, "%*sASN1 OID: %s\n", indent, "", curve) < 0)) {
4288                ret = 0;
4289            }
4290            /* Print NIST curve name if known. */
4291            if ((nistName != NULL) &&
4292                (XFPRINTF(fp, "%*sNIST CURVE: %s\n", indent, "",
4293                    nistName) < 0)) {
4294                ret = 0;
4295            }
4296        }
4297    }
4298
4299
4300    WOLFSSL_LEAVE("wolfSSL_EC_KEY_print_fp", ret);
4301
4302    return ret;
4303}
4304#endif /* XFPRINTF && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
4305
4306#endif /* !NO_CERTS */
4307
4308/*
4309 * EC_KEY get/set/test APIs
4310 */
4311
4312/* Set data of internal, wolfCrypt EC key object into EC key.
4313 *
4314 * EC_KEY wolfSSL -> OpenSSL
4315 *
4316 * @param [in, out] p  EC key to update.
4317 * @return  1 on success.
4318 * @return  -1 on failure.
4319 */
4320int SetECKeyExternal(WOLFSSL_EC_KEY* eckey)
4321{
4322    int ret = 1;
4323
4324    WOLFSSL_ENTER("SetECKeyExternal");
4325
4326    /* Validate parameter. */
4327    if ((eckey == NULL) || (eckey->internal == NULL)) {
4328        WOLFSSL_MSG("ec key NULL error");
4329        ret = WOLFSSL_FATAL_ERROR;
4330    }
4331    else {
4332        ecc_key* key = (ecc_key*)eckey->internal;
4333
4334        /* Set group (OID, nid and idx) from wolfCrypt EC key. */
4335        eckey->group->curve_oid = (int)key->dp->oidSum;
4336        eckey->group->curve_nid = EccEnumToNID(key->dp->id);
4337        eckey->group->curve_idx = key->idx;
4338
4339        if (eckey->pub_key->internal != NULL) {
4340            /* Copy internal public point from internal key's public point. */
4341            if (wc_ecc_copy_point(&key->pubkey,
4342                    (ecc_point*)eckey->pub_key->internal) != MP_OKAY) {
4343                WOLFSSL_MSG("SetECKeyExternal ecc_copy_point failed");
4344                ret = WOLFSSL_FATAL_ERROR;
4345            }
4346
4347            /* Set external public key from internal wolfCrypt, public key. */
4348            if ((ret == 1) && (ec_point_external_set(eckey->pub_key) != 1)) {
4349                WOLFSSL_MSG("SetECKeyExternal ec_point_external_set failed");
4350                ret = WOLFSSL_FATAL_ERROR;
4351            }
4352        }
4353
4354        /* set the external privkey */
4355        if ((ret == 1) && (key->type == ECC_PRIVATEKEY) &&
4356                (wolfssl_bn_set_value(&eckey->priv_key,
4357                wc_ecc_key_get_priv(key)) != 1)) {
4358            WOLFSSL_MSG("ec priv key error");
4359            ret = WOLFSSL_FATAL_ERROR;
4360        }
4361
4362        /* External values set when operations succeeded. */
4363        eckey->exSet = (ret == 1);
4364    }
4365
4366    return ret;
4367}
4368
4369/* Set data of EC key into internal, wolfCrypt EC key object.
4370 *
4371 * EC_KEY Openssl -> WolfSSL
4372 *
4373 * @param [in, out] p  EC key to update.
4374 * @return  1 on success.
4375 * @return  -1 on failure.
4376 */
4377int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
4378{
4379    int ret = 1;
4380
4381    WOLFSSL_ENTER("SetECKeyInternal");
4382
4383    /* Validate parameter. */
4384    if ((eckey == NULL) || (eckey->internal == NULL) ||
4385            (eckey->group == NULL)) {
4386        WOLFSSL_MSG("ec key NULL error");
4387        ret = WOLFSSL_FATAL_ERROR;
4388    }
4389    else {
4390        ecc_key* key = (ecc_key*)eckey->internal;
4391        int pubSet = 0;
4392
4393        /* Validate group. */
4394        if ((eckey->group->curve_idx < 0) ||
4395            (wc_ecc_is_valid_idx(eckey->group->curve_idx) == 0)) {
4396            WOLFSSL_MSG("invalid curve idx");
4397            ret = WOLFSSL_FATAL_ERROR;
4398        }
4399
4400        if (ret == 1) {
4401            /* Set group (idx of curve and corresponding domain parameters). */
4402            key->idx = eckey->group->curve_idx;
4403            key->dp = &ecc_sets[key->idx];
4404            pubSet = (eckey->pub_key != NULL);
4405        }
4406        /* Set public key (point). */
4407        if ((ret == 1) && pubSet) {
4408            if (ec_point_internal_set(eckey->pub_key) != 1) {
4409                WOLFSSL_MSG("ec key pub error");
4410                ret = WOLFSSL_FATAL_ERROR;
4411            }
4412            /* Copy public point to key. */
4413            if ((ret == 1) && (wc_ecc_copy_point(
4414                    (ecc_point*)eckey->pub_key->internal, &key->pubkey) !=
4415                    MP_OKAY)) {
4416                WOLFSSL_MSG("wc_ecc_copy_point error");
4417                ret = WOLFSSL_FATAL_ERROR;
4418            }
4419
4420            if (ret == 1) {
4421                /* Set that the internal key is a public key */
4422                key->type = ECC_PUBLICKEY;
4423            }
4424        }
4425
4426        /* set privkey */
4427        if ((ret == 1) && (eckey->priv_key != NULL)) {
4428            if (wolfssl_bn_get_value(eckey->priv_key,
4429                    wc_ecc_key_get_priv(key)) != 1) {
4430                WOLFSSL_MSG("ec key priv error");
4431                ret = WOLFSSL_FATAL_ERROR;
4432            }
4433            /* private key */
4434            if ((ret == 1) && (!mp_iszero(wc_ecc_key_get_priv(key)))) {
4435                if (pubSet) {
4436                    key->type = ECC_PRIVATEKEY;
4437                }
4438                else {
4439                    key->type = ECC_PRIVATEKEY_ONLY;
4440                }
4441            }
4442        }
4443
4444        /* Internal values set when operations succeeded. */
4445        eckey->inSet = (ret == 1);
4446    }
4447
4448    return ret;
4449}
4450
4451/* Get point conversion format of EC key.
4452 *
4453 * @param [in] key  EC key.
4454 * @return  Point conversion format on success.
4455 * @return  -1 on error.
4456 */
4457wc_point_conversion_form_t wolfSSL_EC_KEY_get_conv_form(
4458    const WOLFSSL_EC_KEY* key)
4459{
4460    if (key == NULL)
4461        return WOLFSSL_FATAL_ERROR;
4462    return key->form;
4463}
4464
4465/* Set point conversion format into EC key.
4466 *
4467 * @param [in, out] key   EC key to set format into.
4468 * @param [in]      form  Point conversion format. Valid values:
4469 *                          WC_POINT_CONVERSION_UNCOMPRESSED,
4470 *                          WC_POINT_CONVERSION_COMPRESSED (when HAVE_COMP_KEY)
4471 */
4472void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *key, int form)
4473{
4474    if (key == NULL) {
4475        WOLFSSL_MSG("Key passed in NULL");
4476    }
4477    else if (form == WC_POINT_CONVERSION_UNCOMPRESSED
4478#ifdef HAVE_COMP_KEY
4479          || form == WC_POINT_CONVERSION_COMPRESSED
4480#endif
4481             ) {
4482        key->form = (unsigned char)form;
4483    }
4484    else {
4485        WOLFSSL_MSG("Incorrect form or HAVE_COMP_KEY not compiled in");
4486    }
4487}
4488
4489/* Get the EC group object that is in EC key.
4490 *
4491 * @param [in] key  EC key.
4492 * @return  EC group object on success.
4493 * @return  NULL when key is NULL.
4494 */
4495const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key)
4496{
4497    WOLFSSL_EC_GROUP* group = NULL;
4498
4499    WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_group");
4500
4501    if (key != NULL) {
4502        group = key->group;
4503    }
4504
4505    return group;
4506}
4507
4508/* Set the group in WOLFSSL_EC_KEY
4509 *
4510 * @param [in, out] key    EC key to update.
4511 * @param [in]      group  EC group to copy.
4512 * @return  1 on success
4513 * @return  0 on failure.
4514 */
4515int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group)
4516{
4517    int ret = 1;
4518
4519    WOLFSSL_ENTER("wolfSSL_EC_KEY_set_group");
4520
4521    /* Validate parameters. */
4522    if ((key == NULL) || (group == NULL)) {
4523        ret = 0;
4524    }
4525
4526    if (ret == 1) {
4527        /* Dispose of the current group. */
4528        if (key->group != NULL) {
4529            wolfSSL_EC_GROUP_free(key->group);
4530        }
4531        /* Duplicate the passed in group into EC key. */
4532        key->group = wolfSSL_EC_GROUP_dup(group);
4533        if (key->group == NULL) {
4534            ret = 0;
4535        }
4536    }
4537
4538    return ret;
4539}
4540
4541/* Get the BN object that is the private key in the EC key.
4542 *
4543 * @param [in] key  EC key.
4544 * @return  BN object on success.
4545 * @return  NULL when key is NULL or private key is not set.
4546 */
4547WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key)
4548{
4549    WOLFSSL_BIGNUM* priv_key = NULL;
4550
4551    WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_private_key");
4552
4553    /* Validate parameter. */
4554    if (key == NULL) {
4555        WOLFSSL_MSG("wolfSSL_EC_KEY_get0_private_key Bad arguments");
4556    }
4557    /* Only return private key if it is not 0. */
4558    else if (!wolfSSL_BN_is_zero(key->priv_key)) {
4559        priv_key = key->priv_key;
4560    }
4561
4562    return priv_key;
4563}
4564
4565/* Sets the private key value into EC key.
4566 *
4567 * Return code compliant with OpenSSL.
4568 *
4569 * @param [in, out] key       EC key to set.
4570 * @param [in]      priv_key  Private key value in a BN.
4571 * @return  1 on success
4572 * @return  0 on failure.
4573 */
4574int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key,
4575    const WOLFSSL_BIGNUM *priv_key)
4576{
4577    int ret = 1;
4578
4579    WOLFSSL_ENTER("wolfSSL_EC_KEY_set_private_key");
4580
4581    /* Validate parameters. */
4582    if ((key == NULL) || (priv_key == NULL)) {
4583        WOLFSSL_MSG("Bad arguments");
4584        ret = 0;
4585    }
4586
4587    /* Check for obvious invalid values. */
4588    if (wolfSSL_BN_is_negative(priv_key) || wolfSSL_BN_is_zero(priv_key) ||
4589            wolfSSL_BN_is_one(priv_key)) {
4590        WOLFSSL_MSG("Invalid private key value");
4591        ret = 0;
4592    }
4593
4594    if (ret == 1) {
4595        /* Free key if previously set. */
4596        if (key->priv_key != NULL) {
4597            wolfSSL_BN_free(key->priv_key);
4598        }
4599
4600        /* Duplicate the BN passed in. */
4601        key->priv_key = wolfSSL_BN_dup(priv_key);
4602        if (key->priv_key == NULL) {
4603            WOLFSSL_MSG("key ecc priv key NULL");
4604            ret = 0;
4605        }
4606    }
4607    /* Set the external values into internal EC key. */
4608    if ((ret == 1) && (SetECKeyInternal(key) != 1)) {
4609        WOLFSSL_MSG("SetECKeyInternal failed");
4610        /* Dispose of new private key on error. */
4611        wolfSSL_BN_free(key->priv_key);
4612        key->priv_key = NULL;
4613        ret = 0;
4614    }
4615
4616    return ret;
4617}
4618
4619/* Get the public key EC point object that is in EC key.
4620 *
4621 * @param [in] key  EC key.
4622 * @return  EC point object that is the public key on success.
4623 * @return  NULL when key is NULL.
4624 */
4625WOLFSSL_EC_POINT* wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key)
4626{
4627    WOLFSSL_EC_POINT* pub_key = NULL;
4628
4629    WOLFSSL_ENTER("wolfSSL_EC_KEY_get0_public_key");
4630
4631    if (key != NULL) {
4632        pub_key = key->pub_key;
4633    }
4634
4635    return pub_key;
4636}
4637
4638/*
4639 * Return code compliant with OpenSSL.
4640 *
4641 * @param [in, out] key  EC key.
4642 * @param [in]      pub  Public key as an EC point.
4643 * @return  1 on success
4644 * @return  0 on failure.
4645 */
4646int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key,
4647    const WOLFSSL_EC_POINT *pub)
4648{
4649    int ret = 1;
4650    ecc_point *pub_p = NULL;
4651    ecc_point *key_p = NULL;
4652
4653    WOLFSSL_ENTER("wolfSSL_EC_KEY_set_public_key");
4654
4655    /* Validate parameters. */
4656    if ((key == NULL) || (key->internal == NULL) || (pub == NULL) ||
4657            (pub->internal == NULL)) {
4658        WOLFSSL_MSG("wolfSSL_EC_KEY_set_public_key Bad arguments");
4659        ret = 0;
4660    }
4661
4662    /* Ensure the internal EC key is set. */
4663    if ((ret == 1) && (key->inSet == 0) && (SetECKeyInternal(key) != 1)) {
4664        WOLFSSL_MSG("SetECKeyInternal failed");
4665        ret = 0;
4666    }
4667
4668    /* Ensure the internal EC point of pub is setup. */
4669    if ((ret == 1) && (ec_point_setup(pub) != 1)) {
4670        ret = 0;
4671    }
4672
4673    if (ret == 1) {
4674        /* Get the internal point of pub and the public key in key. */
4675        pub_p = (ecc_point*)pub->internal;
4676        key_p = (ecc_point*)key->pub_key->internal;
4677
4678        /* Create new point if required. */
4679        if (key_p == NULL) {
4680            key_p = wc_ecc_new_point();
4681            key->pub_key->internal = (void*)key_p;
4682        }
4683        /* Check point available. */
4684        if (key_p == NULL) {
4685            WOLFSSL_MSG("key ecc point NULL");
4686            ret = 0;
4687        }
4688    }
4689
4690    /* Copy the internal pub point into internal key point. */
4691    if ((ret == 1) && (wc_ecc_copy_point(pub_p, key_p) != MP_OKAY)) {
4692        WOLFSSL_MSG("ecc_copy_point failure");
4693        ret = 0;
4694    }
4695
4696    /* Copy the internal point data into external. */
4697    if ((ret == 1) && (ec_point_external_set(key->pub_key) != 1)) {
4698        WOLFSSL_MSG("SetECKeyInternal failed");
4699        ret = 0;
4700    }
4701
4702    /* Copy the internal key into external. */
4703    if ((ret == 1) && (SetECKeyInternal(key) != 1)) {
4704        WOLFSSL_MSG("SetECKeyInternal failed");
4705        ret = 0;
4706    }
4707
4708    if (ret == 1) {
4709        /* Dump out the point and the key's public key for debug. */
4710        wolfSSL_EC_POINT_dump("pub", pub);
4711        wolfSSL_EC_POINT_dump("key->pub_key", key->pub_key);
4712    }
4713
4714    return ret;
4715}
4716
4717#ifndef NO_WOLFSSL_STUB
4718/* Set the ASN.1 encoding flag against the EC key.
4719 *
4720 * No implementation as only named curves supported for encoding.
4721 *
4722 * @param [in, out] key   EC key.
4723 * @param [in]      flag  ASN.1 flag to set. Valid values:
4724 *                        OPENSSL_EC_EXPLICIT_CURVE, OPENSSL_EC_NAMED_CURVE
4725 */
4726void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag)
4727{
4728    (void)key;
4729    (void)asn1_flag;
4730
4731    WOLFSSL_ENTER("wolfSSL_EC_KEY_set_asn1_flag");
4732    WOLFSSL_STUB("EC_KEY_set_asn1_flag");
4733}
4734#endif
4735
4736/*
4737 * EC key generate key APIs
4738 */
4739
4740/* Generate an EC key.
4741 *
4742 * Uses the internal curve index set in the EC key or the default.
4743 *
4744 * @param [in, out] key  EC key.
4745 * @return  1 on success
4746 * @return  0 on failure.
4747 */
4748int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key)
4749{
4750    int res = 1;
4751    int initTmpRng = 0;
4752    WC_RNG* rng = NULL;
4753    WC_DECLARE_VAR(tmpRng, WC_RNG, 1, 0);
4754
4755    WOLFSSL_ENTER("wolfSSL_EC_KEY_generate_key");
4756
4757    /* Validate parameters. */
4758    if ((key == NULL) || (key->internal == NULL) || (key->group == NULL)) {
4759        WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key Bad arguments");
4760        res = 0;
4761    }
4762    if (res == 1) {
4763        /* Check if we know which internal curve index to use. */
4764        if (key->group->curve_idx < 0) {
4765            /* Generate key using the default curve. */
4766#if FIPS_VERSION3_GE(6,0,0)
4767            key->group->curve_idx = ECC_SECP256R1; /* FIPS default to 256 */
4768#else
4769            key->group->curve_idx = ECC_CURVE_DEF;
4770#endif
4771        }
4772
4773        /* Create a random number generator. */
4774        rng = wolfssl_make_rng(tmpRng, &initTmpRng);
4775        if (rng == NULL) {
4776            WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to make RNG");
4777            res = 0;
4778        }
4779    }
4780    if (res == 1) {
4781        /* NIDToEccEnum returns -1 for invalid NID so if key->group->curve_nid
4782         * is 0 then pass ECC_CURVE_DEF as arg */
4783        int eccEnum = key->group->curve_nid ?
4784#if FIPS_VERSION3_GE(6,0,0)
4785            NIDToEccEnum(key->group->curve_nid) : ECC_SECP256R1;
4786#else
4787            NIDToEccEnum(key->group->curve_nid) : ECC_CURVE_DEF;
4788#endif
4789        /* Get the internal EC key. */
4790        ecc_key* ecKey = (ecc_key*)key->internal;
4791        /* Make the key using internal API. */
4792        int ret = 0;
4793
4794#if FIPS_VERSION3_GE(6,0,0)
4795        /* In the case of FIPS only allow key generation with approved curves */
4796        if (eccEnum != ECC_SECP256R1 && eccEnum != ECC_SECP224R1 &&
4797            eccEnum != ECC_SECP384R1 && eccEnum != ECC_SECP521R1) {
4798            WOLFSSL_MSG("Unsupported curve selected in FIPS mode");
4799            res = 0;
4800        }
4801        if (res == 1) {
4802#endif
4803        ret  = wc_ecc_make_key_ex(rng, 0, ecKey, eccEnum);
4804#if FIPS_VERSION3_GE(6,0,0)
4805        }
4806#endif
4807
4808    #if defined(WOLFSSL_ASYNC_CRYPT)
4809        /* Wait on asynchronouse operation. */
4810        ret = wc_AsyncWait(ret, &ecKey->asyncDev, WC_ASYNC_FLAG_NONE);
4811    #endif
4812        if (ret != 0) {
4813            WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key wc_ecc_make_key failed");
4814            res = 0;
4815        }
4816    }
4817
4818    /* Dispose of local random number generator if initialized. */
4819    if (initTmpRng) {
4820        wc_FreeRng(rng);
4821        WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
4822    }
4823
4824    /* Set the external key from new internal key values. */
4825    if ((res == 1) && (SetECKeyExternal(key) != 1)) {
4826        WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key SetECKeyExternal failed");
4827        res = 0;
4828    }
4829
4830    return res;
4831}
4832
4833/*
4834 * EC key check key APIs
4835 */
4836
4837/* Check that the EC key is valid.
4838 *
4839 * @param [in] key  EC key.
4840 * @return  1 on valid.
4841 * @return  0 on invalid or error.
4842 */
4843int wolfSSL_EC_KEY_check_key(const WOLFSSL_EC_KEY *key)
4844{
4845    int ret = 1;
4846
4847    WOLFSSL_ENTER("wolfSSL_EC_KEY_check_key");
4848
4849    /* Validate parameter. */
4850    if ((key == NULL) || (key->internal == NULL)) {
4851        WOLFSSL_MSG("Bad parameter");
4852        ret = 0;
4853    }
4854
4855    /* Set the external EC key values into internal if not already. */
4856    if ((ret == 1) && (key->inSet == 0) && (SetECKeyInternal(
4857            (WOLFSSL_EC_KEY*)key) != 1)) {
4858        WOLFSSL_MSG("SetECKeyInternal failed");
4859        ret = 0;
4860    }
4861
4862    if (ret == 1) {
4863        /* Have internal EC implementation check key. */
4864        ret = wc_ecc_check_key((ecc_key*)key->internal) == 0;
4865    }
4866
4867    return ret;
4868}
4869
4870/* End EC_KEY */
4871
4872#if !defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0)
4873/* Get the supported, built-in EC curves
4874 *
4875 * @param [in, out] curves  Pre-allocated list to put supported curves into.
4876 * @param [in]      len     Maximum number of items to place in list.
4877 * @return  Number of built-in EC curves when curves is NULL or len is 0.
4878 * @return  Number of items placed in list otherwise.
4879 */
4880size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *curves,
4881    size_t len)
4882{
4883    size_t i;
4884    size_t cnt;
4885#ifdef HAVE_SELFTEST
4886    /* Defined in ecc.h when available. */
4887    size_t ecc_sets_count;
4888
4889    /* Count the pre-defined curves since global not available. */
4890    for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++) {
4891        /* Do nothing. */
4892    }
4893    ecc_sets_count = i;
4894#endif
4895
4896    /* Assume we are going to return total count. */
4897    cnt = ecc_sets_count;
4898    /* Check we have a list that can hold data. */
4899    if ((curves != NULL) && (len != 0)) {
4900        /* Limit count to length of list. */
4901        if (cnt > len) {
4902            cnt = len;
4903        }
4904
4905        /* Put in built-in EC curve nid and short name. */
4906        for (i = 0; i < cnt; i++) {
4907            curves[i].nid = EccEnumToNID(ecc_sets[i].id);
4908            curves[i].comment = wolfSSL_OBJ_nid2sn(curves[i].nid);
4909        }
4910    }
4911
4912    return cnt;
4913}
4914#endif /* !HAVE_FIPS || FIPS_VERSION_GT(2,0) */
4915
4916/* Start ECDSA_SIG */
4917
4918/* Allocate a new ECDSA signature object.
4919 *
4920 * @return  New, allocated ECDSA signature object on success.
4921 * @return  NULL on error.
4922 */
4923WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_SIG_new(void)
4924{
4925    int err = 0;
4926    WOLFSSL_ECDSA_SIG *sig;
4927
4928    WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_new");
4929
4930    /* Allocate memory for ECDSA signature object. */
4931    sig = (WOLFSSL_ECDSA_SIG*)XMALLOC(sizeof(WOLFSSL_ECDSA_SIG), NULL,
4932        DYNAMIC_TYPE_ECC);
4933    if (sig == NULL) {
4934        WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA signature failure");
4935        return NULL;
4936    }
4937
4938    /* Set s to NULL in case of error. */
4939    sig->s = NULL;
4940    /* Allocate BN into r. */
4941    sig->r = wolfSSL_BN_new();
4942    if (sig->r == NULL) {
4943        WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA r failure");
4944        err = 1;
4945    }
4946    if (!err) {
4947        /* Allocate BN into s. */
4948        sig->s = wolfSSL_BN_new();
4949        if (sig->s == NULL) {
4950            WOLFSSL_MSG("wolfSSL_ECDSA_SIG_new malloc ECDSA s failure");
4951            err = 1;
4952        }
4953    }
4954
4955    if (err) {
4956        /* Dispose of allocated memory. */
4957        wolfSSL_ECDSA_SIG_free(sig);
4958        sig = NULL;
4959    }
4960    return sig;
4961}
4962
4963/* Dispose of ECDSA signature object.
4964 *
4965 * Cannot use object after this call.
4966 *
4967 * @param [in] sig  ECDSA signature object to free.
4968 */
4969void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig)
4970{
4971    WOLFSSL_ENTER("wolfSSL_ECDSA_SIG_free");
4972
4973    if (sig != NULL) {
4974        /* Dispose of BNs allocated for r and s. */
4975        wolfSSL_BN_free(sig->r);
4976        wolfSSL_BN_free(sig->s);
4977
4978        /* Dispose of memory associated with ECDSA signature object. */
4979        XFREE(sig, NULL, DYNAMIC_TYPE_ECC);
4980    }
4981}
4982
4983/* Create an ECDSA signature from the DER encoding.
4984 *
4985 * @param [in, out] sig  Reference to ECDSA signature object. May be NULL.
4986 * @param [in, out] pp   On in, reference to buffer containing DER encoding.
4987 *                       On out, reference to buffer after signature data.
4988 * @param [in]      len  Length of the data in the buffer. May be more than
4989 *                       the length of the signature.
4990 * @return  ECDSA signature object on success.
4991 * @return  NULL on error.
4992 */
4993WOLFSSL_ECDSA_SIG* wolfSSL_d2i_ECDSA_SIG(WOLFSSL_ECDSA_SIG** sig,
4994    const unsigned char** pp, long len)
4995{
4996    int err = 0;
4997    /* ECDSA signature object to return. */
4998    WOLFSSL_ECDSA_SIG *s = NULL;
4999
5000    /* Validate parameter. */
5001    if (pp == NULL) {
5002        err = 1;
5003    }
5004    if (!err) {
5005        if (sig != NULL) {
5006            /* Use the ECDSA signature object passed in. */
5007            s = *sig;
5008        }
5009        if (s == NULL) {
5010            /* No ECDSA signature object passed in - create a new one. */
5011            s = wolfSSL_ECDSA_SIG_new();
5012            if (s == NULL) {
5013                err = 1;
5014            }
5015        }
5016    }
5017    if (!err) {
5018        /* DecodeECC_DSA_Sig calls mp_init, so free these. */
5019        mp_free((mp_int*)s->r->internal);
5020        mp_free((mp_int*)s->s->internal);
5021
5022        /* Decode the signature into internal r and s fields. */
5023        if (DecodeECC_DSA_Sig(*pp, (word32)len, (mp_int*)s->r->internal,
5024                (mp_int*)s->s->internal) != MP_OKAY) {
5025            err = 1;
5026        }
5027    }
5028
5029    if (!err) {
5030        /* Move pointer passed signature data successfully decoded. */
5031        *pp += wolfssl_der_length(*pp, (int)len);
5032        if (sig != NULL) {
5033            /* Update reference to ECDSA signature object. */
5034            *sig = s;
5035        }
5036    }
5037
5038    /* Dispose of newly allocated object on error. */
5039    if (err) {
5040        if ((s != NULL) && ((sig == NULL) || (*sig != s))) {
5041            wolfSSL_ECDSA_SIG_free(s);
5042        }
5043        /* Return NULL for object on error. */
5044        s = NULL;
5045    }
5046    return s;
5047}
5048
5049/* Encode the ECDSA signature as DER.
5050 *
5051 * @param [in]      sig  ECDSA signature object.
5052 * @param [in, out] pp   On in, reference to buffer in which to place encoding.
5053 *                       On out, reference to buffer after encoding.
5054 *                       May be NULL or point to NULL in which case no encoding
5055 *                       is done.
5056 * @return  Length of encoding on success.
5057 * @return  0 on error.
5058 */
5059int wolfSSL_i2d_ECDSA_SIG(const WOLFSSL_ECDSA_SIG *sig, unsigned char **pp)
5060{
5061    word32 len = 0;
5062    int    update_p = 1;
5063
5064    /* Validate parameter. */
5065    if (sig != NULL) {
5066        /* ASN.1: SEQ + INT + INT
5067         *   ASN.1 Integer must be a positive value - prepend zero if number has
5068         *   top bit set.
5069         */
5070        /* Get total length of r including any prepended zero. */
5071        word32 rLen = (word32)(mp_leading_bit((mp_int*)sig->r->internal) +
5072               mp_unsigned_bin_size((mp_int*)sig->r->internal));
5073        /* Get total length of s including any prepended zero. */
5074        word32 sLen = (word32)(mp_leading_bit((mp_int*)sig->s->internal) +
5075               mp_unsigned_bin_size((mp_int*)sig->s->internal));
5076        /* Calculate length of data in sequence. */
5077        len = (word32)1 + ASN_LEN_SIZE(rLen) + rLen +
5078              (word32)1 + ASN_LEN_SIZE(sLen) + sLen;
5079        /* Add in the length of the SEQUENCE. */
5080        len += (word32)1 + ASN_LEN_SIZE(len);
5081
5082        #ifdef WOLFSSL_I2D_ECDSA_SIG_ALLOC
5083        if ((pp != NULL) && (*pp == NULL)) {
5084            *pp = (unsigned char *)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
5085            if (*pp == NULL) {
5086                WOLFSSL_MSG("malloc error");
5087                return 0;
5088            }
5089            update_p = 0;
5090        }
5091        #endif
5092
5093        /* Encode only if there is a buffer to encode into. */
5094        if ((pp != NULL) && (*pp != NULL)) {
5095            /* Encode using the internal representations of r and s. */
5096            if (StoreECC_DSA_Sig(*pp, &len, (mp_int*)sig->r->internal,
5097                    (mp_int*)sig->s->internal) != MP_OKAY) {
5098                /* No bytes encoded. */
5099                len = 0;
5100            }
5101            else if (update_p) {
5102                /* Update pointer to after encoding. */
5103                *pp += len;
5104            }
5105        }
5106    }
5107
5108    return (int)len;
5109}
5110
5111/* Get the pointer to the fields of the ECDSA signature.
5112 *
5113 * r and s untouched when sig is NULL.
5114 *
5115 * @param [in]  sig  ECDSA signature object.
5116 * @param [out] r    R field of ECDSA signature as a BN. May be NULL.
5117 * @param [out] s    S field of ECDSA signature as a BN. May be NULL.
5118 */
5119void wolfSSL_ECDSA_SIG_get0(const WOLFSSL_ECDSA_SIG* sig,
5120    const WOLFSSL_BIGNUM** r, const WOLFSSL_BIGNUM** s)
5121{
5122    /* Validate parameter. */
5123    if (sig != NULL) {
5124        /* Return the r BN when pointer to return through. */
5125        if (r != NULL) {
5126            *r = sig->r;
5127        }
5128        /* Return the s BN when pointer to return through. */
5129        if (s != NULL) {
5130            *s = sig->s;
5131        }
5132    }
5133}
5134
5135/* Set the pointers to the fields of the ECDSA signature.
5136 *
5137 * @param [in, out] sig  ECDSA signature object to update.
5138 * @param [in]      r    R field of ECDSA signature as a BN.
5139 * @param [in]      s    S field of ECDSA signature as a BN.
5140 * @return  1 on success.
5141 * @return  0 on error.
5142 */
5143int wolfSSL_ECDSA_SIG_set0(WOLFSSL_ECDSA_SIG* sig, WOLFSSL_BIGNUM* r,
5144    WOLFSSL_BIGNUM* s)
5145{
5146    int ret = 1;
5147
5148    /* Validate parameters. */
5149    if ((sig == NULL) || (r == NULL) || (s == NULL)) {
5150        ret = 0;
5151    }
5152
5153    if (ret == 1) {
5154        /* Dispose of old BN objects. */
5155        wolfSSL_BN_free(sig->r);
5156        wolfSSL_BN_free(sig->s);
5157
5158        /* Assign new BN objects. */
5159        sig->r = r;
5160        sig->s = s;
5161    }
5162
5163    return ret;
5164}
5165
5166/* End ECDSA_SIG */
5167
5168/* Start ECDSA */
5169
5170/* Calculate maximum size of the DER encoded ECDSA signature for the curve.
5171 *
5172 * @param [in] key  EC key.
5173 * @return  Size of DER encoded signature on success.
5174 * @return  0 on error.
5175 */
5176int wolfSSL_ECDSA_size(const WOLFSSL_EC_KEY *key)
5177{
5178    int err = 0;
5179    int len = 0;
5180    const WOLFSSL_EC_GROUP *group = NULL;
5181    int bits = 0;
5182
5183    /* Validate parameter. */
5184    if (key == NULL) {
5185        err = 1;
5186    }
5187
5188    /* Get group from key to get order bits. */
5189    if ((!err) && ((group = wolfSSL_EC_KEY_get0_group(key)) == NULL)) {
5190        err = 1;
5191    }
5192    /* Get order bits of group. */
5193    if ((!err) && ((bits = wolfSSL_EC_GROUP_order_bits(group)) == 0)) {
5194        /* Group is not set. */
5195        err = 1;
5196    }
5197
5198    if (!err) {
5199        /* r and s are mod order. */
5200        int bytes = (bits + 7) / 8;  /* Bytes needed to hold bits. */
5201        len = SIG_HEADER_SZ + /* 2*ASN_TAG + 2*LEN(ENUM) */
5202            ECC_MAX_PAD_SZ +  /* possible leading zeroes in r and s */
5203            bytes + bytes;    /* max r and s in bytes */
5204    }
5205
5206    return len;
5207}
5208
5209/* Create ECDSA signature by signing digest with key.
5210 *
5211 * @param [in] dgst  Digest to sign.
5212 * @param [in] dLen  Length of digest in bytes.
5213 * @param [in] key   EC key to sign with.
5214 * @return  ECDSA signature object on success.
5215 * @return  NULL on error.
5216 */
5217WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_do_sign(const unsigned char *dgst, int dLen,
5218    WOLFSSL_EC_KEY *key)
5219{
5220    int err = 0;
5221    WOLFSSL_ECDSA_SIG *sig = NULL;
5222    WC_DECLARE_VAR(out, byte, ECC_BUFSIZE, 0);
5223    unsigned int outLen = ECC_BUFSIZE;
5224
5225    WOLFSSL_ENTER("wolfSSL_ECDSA_do_sign");
5226
5227    /* Validate parameters. */
5228    if ((dgst == NULL) || (key == NULL) || (key->internal == NULL)) {
5229        WOLFSSL_MSG("wolfSSL_ECDSA_do_sign Bad arguments");
5230        err = 1;
5231    }
5232
5233    /* Ensure internal EC key is set from external. */
5234    if ((!err) && (key->inSet == 0)) {
5235        WOLFSSL_MSG("wolfSSL_ECDSA_do_sign No EC key internal set, do it");
5236
5237        if (SetECKeyInternal(key) != 1) {
5238            WOLFSSL_MSG("wolfSSL_ECDSA_do_sign SetECKeyInternal failed");
5239            err = 1;
5240        }
5241    }
5242
5243#ifdef WOLFSSL_SMALL_STACK
5244    if (!err) {
5245        /* Allocate buffer to hold encoded signature. */
5246        out = (byte*)XMALLOC(outLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
5247        if (out == NULL) {
5248            err = 1;
5249        }
5250    }
5251#endif
5252
5253    /* Sign the digest with the key to create encoded ECDSA signature. */
5254    if ((!err) && (wolfSSL_ECDSA_sign(0, dgst, dLen, out, &outLen, key) != 1)) {
5255        err = 1;
5256    }
5257
5258    if (!err) {
5259        const byte* p = out;
5260        /* Decode the ECDSA signature into a new object. */
5261        sig = wolfSSL_d2i_ECDSA_SIG(NULL, &p, outLen);
5262    }
5263
5264    WC_FREE_VAR_EX(out, NULL, DYNAMIC_TYPE_TMP_BUFFER);
5265
5266    return sig;
5267}
5268
5269/* Verify ECDSA signature in the object using digest and key.
5270 *
5271 * Return code compliant with OpenSSL.
5272 *
5273 * @param [in] dgst  Digest to verify.
5274 * @param [in] dLen  Length of the digest in bytes.
5275 * @param [in] sig   ECDSA signature object.
5276 * @param [in] key   EC key containing public key.
5277 * @return  1 when signature is valid.
5278 * @return  0 when signature is invalid.
5279 * @return  -1 on error.
5280 */
5281int wolfSSL_ECDSA_do_verify(const unsigned char *dgst, int dLen,
5282    const WOLFSSL_ECDSA_SIG *sig, WOLFSSL_EC_KEY *key)
5283{
5284    int ret = 1;
5285    int verified = 0;
5286#ifdef WOLF_CRYPTO_CB_ONLY_ECC
5287    byte signature[ECC_MAX_SIG_SIZE];
5288    int signatureLen;
5289    byte* p = signature;
5290#endif
5291
5292    WOLFSSL_ENTER("wolfSSL_ECDSA_do_verify");
5293
5294    /* Validate parameters. */
5295    if ((dgst == NULL) || (sig == NULL) || (key == NULL) ||
5296            (key->internal == NULL)) {
5297        WOLFSSL_MSG("wolfSSL_ECDSA_do_verify Bad arguments");
5298        ret = WOLFSSL_FATAL_ERROR;
5299    }
5300
5301    /* Check hash length */
5302    if ((ret == 1) &&
5303        ((dLen > WC_MAX_DIGEST_SIZE) ||
5304         (dLen < WC_MIN_DIGEST_SIZE))) {
5305        WOLFSSL_MSG("wolfSSL_ECDSA_do_verify Bad digest size");
5306        ret = WOLFSSL_FATAL_ERROR;
5307    }
5308
5309    /* Ensure internal EC key is set from external. */
5310    if ((ret == 1) && (key->inSet == 0)) {
5311        WOLFSSL_MSG("No EC key internal set, do it");
5312
5313        if (SetECKeyInternal(key) != 1) {
5314            WOLFSSL_MSG("SetECKeyInternal failed");
5315            ret = WOLFSSL_FATAL_ERROR;
5316        }
5317    }
5318
5319    if (ret == 1) {
5320#ifndef WOLF_CRYPTO_CB_ONLY_ECC
5321        /* Verify hash using digest, r and s as MP ints and internal EC key. */
5322        if (wc_ecc_verify_hash_ex((mp_int*)sig->r->internal,
5323                (mp_int*)sig->s->internal, dgst, (word32)dLen, &verified,
5324                (ecc_key *)key->internal) != MP_OKAY) {
5325            WOLFSSL_MSG("wc_ecc_verify_hash failed");
5326            ret = WOLFSSL_FATAL_ERROR;
5327        }
5328        else if (verified == 0) {
5329            WOLFSSL_MSG("wc_ecc_verify_hash incorrect signature detected");
5330            ret = 0;
5331        }
5332#else
5333        signatureLen = i2d_ECDSA_SIG(sig, &p);
5334        if (signatureLen > 0) {
5335            /* verify hash. expects to call wc_CryptoCb_EccVerify internally */
5336            ret = wc_ecc_verify_hash(signature, signatureLen, dgst,
5337                (word32)dLen, &verified, (ecc_key*)key->internal);
5338            if (ret != MP_OKAY) {
5339                WOLFSSL_MSG("wc_ecc_verify_hash failed");
5340                ret = WOLFSSL_FATAL_ERROR;
5341            }
5342            else if (verified == 0) {
5343                WOLFSSL_MSG("wc_ecc_verify_hash incorrect signature detected");
5344                ret = 0;
5345            }
5346        }
5347#endif /* WOLF_CRYPTO_CB_ONLY_ECC */
5348    }
5349
5350    return ret;
5351}
5352
5353/* Sign the digest with the key to produce a DER encode signature.
5354 *
5355 * @param [in]      type      Digest algorithm used to create digest. Unused.
5356 * @param [in]      digest    Digest of the message to sign.
5357 * @param [in]      digestSz  Size of the digest in bytes.
5358 * @param [out]     sig       Buffer to hold signature.
5359 * @param [in, out] sigSz     On in, size of buffer in bytes.
5360 *                            On out, size of signatre in bytes.
5361 * @param [in]      key       EC key containing private key.
5362 * @return  1 on success.
5363 * @return  0 on error.
5364 */
5365int wolfSSL_ECDSA_sign(int type, const unsigned char *digest, int digestSz,
5366    unsigned char *sig, unsigned int *sigSz, WOLFSSL_EC_KEY *key)
5367{
5368    int ret = 1;
5369    WC_RNG* rng = NULL;
5370    WC_DECLARE_VAR(tmpRng, WC_RNG, 1, 0);
5371    int initTmpRng = 0;
5372
5373    WOLFSSL_ENTER("wolfSSL_ECDSA_sign");
5374
5375    /* Digest algorithm not used in DER encoding. */
5376    (void)type;
5377
5378    /* Validate parameters. */
5379    if (key == NULL) {
5380        ret = 0;
5381    }
5382
5383    if (ret == 1) {
5384        /* Make an RNG - create local or get global. */
5385        rng = wolfssl_make_rng(tmpRng, &initTmpRng);
5386        if (rng == NULL) {
5387            ret = 0;
5388        }
5389    }
5390    /* Sign the digest with the key using the RNG and put signature into buffer
5391     * update sigSz to be actual length.
5392     */
5393    if ((ret == 1) && (wc_ecc_sign_hash(digest, (word32)digestSz, sig, sigSz,
5394            rng, (ecc_key*)key->internal) != 0)) {
5395        ret = 0;
5396    }
5397
5398    if (initTmpRng) {
5399        wc_FreeRng(rng);
5400        WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
5401    }
5402
5403    return ret;
5404}
5405
5406/* Verify the signature with the digest and key.
5407 *
5408 * @param [in] type      Digest algorithm used to create digest. Unused.
5409 * @param [in] digest    Digest of the message to verify.
5410 * @param [in] digestSz  Size of the digest in bytes.
5411 * @param [in] sig       Buffer holding signature.
5412 * @param [in] sigSz     Size of signature data in bytes.
5413 * @param [in] key       EC key containing public key.
5414 * @return  1 when signature is valid.
5415 * @return  0 when signature is invalid or error.
5416 */
5417int wolfSSL_ECDSA_verify(int type, const unsigned char *digest, int digestSz,
5418    const unsigned char *sig, int sigSz, WOLFSSL_EC_KEY *key)
5419{
5420    int ret = 1;
5421    int verify = 0;
5422
5423    WOLFSSL_ENTER("wolfSSL_ECDSA_verify");
5424
5425    /* Digest algorithm not used in DER encoding. */
5426    (void)type;
5427
5428    /* Validate parameters. */
5429    if (key == NULL) {
5430        ret = 0;
5431    }
5432
5433    /* Check hash length */
5434    if ((ret == 1) &&
5435        ((digestSz > WC_MAX_DIGEST_SIZE) ||
5436         (digestSz < WC_MIN_DIGEST_SIZE))) {
5437        WOLFSSL_MSG("wolfSSL_ECDSA_verify Bad digest size");
5438        ret = 0;
5439    }
5440
5441    /* Verify signature using digest and key. */
5442    if ((ret == 1) && (wc_ecc_verify_hash(sig, (word32)sigSz, digest,
5443            (word32)digestSz, &verify, (ecc_key*)key->internal) != 0)) {
5444        ret = 0;
5445    }
5446    /* When no error, verification may still have failed - check now. */
5447    if ((ret == 1) && (verify != 1)) {
5448        WOLFSSL_MSG("wolfSSL_ECDSA_verify failed");
5449        ret = 0;
5450    }
5451
5452    return ret;
5453}
5454
5455/* End ECDSA */
5456
5457/* Start ECDH */
5458
5459#ifndef WOLF_CRYPTO_CB_ONLY_ECC
5460/* Compute the shared secret (key) using ECDH.
5461 *
5462 * KDF not supported.
5463 *
5464 * Return code compliant with OpenSSL.
5465 *
5466 * @param [out] out      Buffer to hold key.
5467 * @param [in]  outLen   Length of buffer in bytes.
5468 * @param [in]  pubKey   Public key as an EC point.
5469 * @param [in]  privKey  EC key holding a private key.
5470 * @param [in]  kdf      Key derivation function to apply to secret.
5471 * @return  Length of computed key on success
5472 * @return  0 on error.
5473 */
5474int wolfSSL_ECDH_compute_key(void *out, size_t outLen,
5475    const WOLFSSL_EC_POINT *pubKey, WOLFSSL_EC_KEY *privKey,
5476    void *(*kdf) (const void *in, size_t inlen, void *out, size_t *outLen))
5477{
5478    int err = 0;
5479    word32 len = 0;
5480    ecc_key* key = NULL;
5481#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) && \
5482    (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,0))
5483    int setGlobalRNG = 0;
5484#endif
5485
5486    /* TODO: support using the KDF. */
5487    (void)kdf;
5488
5489    WOLFSSL_ENTER("wolfSSL_ECDH_compute_key");
5490
5491    /* Validate parameters. */
5492    if ((out == NULL) || (pubKey == NULL) || (pubKey->internal == NULL) ||
5493        (privKey == NULL) || (privKey->internal == NULL)) {
5494        WOLFSSL_MSG("Bad function arguments");
5495        err = 1;
5496    }
5497
5498    /* Ensure internal EC key is set from external. */
5499    if ((!err) && (privKey->inSet == 0)) {
5500        WOLFSSL_MSG("No EC key internal set, do it");
5501
5502        if (SetECKeyInternal(privKey) != 1) {
5503            WOLFSSL_MSG("SetECKeyInternal failed");
5504            err = 1;
5505        }
5506    }
5507
5508    if (!err) {
5509        int ret;
5510
5511        /* Get the internal key. */
5512        key = (ecc_key*)privKey->internal;
5513        /* Set length into variable of type suitable for wolfSSL API. */
5514        len = (word32)outLen;
5515
5516    #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) && \
5517        (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,0))
5518        /* An RNG is needed. */
5519        if (key->rng == NULL) {
5520            key->rng = wolfssl_make_global_rng();
5521            /* RNG set and needs to be unset. */
5522            setGlobalRNG = 1;
5523        }
5524    #endif
5525
5526        PRIVATE_KEY_UNLOCK();
5527        /* Create secret using wolfSSL. */
5528        ret = wc_ecc_shared_secret_ex(key, (ecc_point*)pubKey->internal,
5529            (byte *)out, &len);
5530        PRIVATE_KEY_LOCK();
5531        if (ret != MP_OKAY) {
5532            WOLFSSL_MSG("wc_ecc_shared_secret failed");
5533            err = 1;
5534        }
5535    }
5536
5537#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) && \
5538    (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,0))
5539    /* Remove global from key. */
5540    if (setGlobalRNG) {
5541        key->rng = NULL;
5542    }
5543#endif
5544
5545    if (err) {
5546        /* Make returned value zero. */
5547        len = 0;
5548    }
5549    return (int)len;
5550}
5551#endif /* WOLF_CRYPTO_CB_ONLY_ECC */
5552
5553/* End ECDH */
5554
5555#ifndef NO_WOLFSSL_STUB
5556const WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_OpenSSL(void)
5557{
5558    WOLFSSL_STUB("wolfSSL_EC_KEY_OpenSSL");
5559
5560    return NULL;
5561}
5562
5563WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_METHOD_new(
5564        const WOLFSSL_EC_KEY_METHOD *meth)
5565{
5566    WOLFSSL_STUB("wolfSSL_EC_KEY_METHOD_new");
5567
5568    (void)meth;
5569
5570    return NULL;
5571}
5572
5573void wolfSSL_EC_KEY_METHOD_free(WOLFSSL_EC_KEY_METHOD *meth)
5574{
5575    WOLFSSL_STUB("wolfSSL_EC_KEY_METHOD_free");
5576
5577    (void)meth;
5578}
5579
5580void wolfSSL_EC_KEY_METHOD_set_init(WOLFSSL_EC_KEY_METHOD *meth,
5581        void* a1, void* a2, void* a3, void* a4, void* a5, void* a6)
5582{
5583    WOLFSSL_STUB("wolfSSL_EC_KEY_METHOD_set_init");
5584
5585    (void)meth;
5586    (void)a1;
5587    (void)a2;
5588    (void)a3;
5589    (void)a4;
5590    (void)a5;
5591    (void)a6;
5592}
5593
5594void wolfSSL_EC_KEY_METHOD_set_sign(WOLFSSL_EC_KEY_METHOD *meth,
5595        void* a1, void* a2, void* a3)
5596{
5597    WOLFSSL_STUB("wolfSSL_EC_KEY_METHOD_set_sign");
5598
5599    (void)meth;
5600    (void)a1;
5601    (void)a2;
5602    (void)a3;
5603}
5604
5605const WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_get_method(
5606        const WOLFSSL_EC_KEY *key)
5607{
5608    WOLFSSL_STUB("wolfSSL_EC_KEY_get_method");
5609
5610    (void)key;
5611
5612    return NULL;
5613}
5614
5615int wolfSSL_EC_KEY_set_method(WOLFSSL_EC_KEY *key,
5616        const WOLFSSL_EC_KEY_METHOD *meth)
5617{
5618    WOLFSSL_STUB("wolfSSL_EC_KEY_set_method");
5619
5620    (void)key;
5621    (void)meth;
5622
5623    return 0;
5624}
5625
5626#endif /* !NO_WOLFSSL_STUB */
5627
5628#endif /* OPENSSL_EXTRA */
5629
5630#endif /* HAVE_ECC */
5631
5632/*******************************************************************************
5633 * END OF EC API
5634 ******************************************************************************/
5635
5636#endif /* !WOLFSSL_PK_EC_INCLUDED */
5637