From 19206ab7638100e9db8a13c5b829c32f6d5f4704 Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Mon, 16 Sep 2024 17:08:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BASE64.cpp | 418 + Include/BASE64.h | 54 + Include/DNFTOOL.hpp | 647 ++ Include/Hook.hpp | 1745 ++++ Include/HookUi.hpp | 186 + Include/MinHook.h | 186 + Include/RegisterSquirrel.hpp | 3006 ++++++ Include/httplib.h | 8170 +++++++++++++++++ Include/inlinehook.h | 53 + Include/sqstdaux.h | 16 + Include/sqstdblob.h | 20 + Include/sqstdio.h | 53 + Include/sqstdmath.h | 15 + Include/sqstdstring.h | 31 + Include/sqstdsystem.h | 15 + Include/squirrel.h | 422 + .../include/openssl/__DECC_INCLUDE_EPILOGUE.H | 22 + .../include/openssl/__DECC_INCLUDE_PROLOGUE.H | 26 + OtherInc/openssl/include/openssl/aes.h | 111 + OtherInc/openssl/include/openssl/applink.c | 144 + OtherInc/openssl/include/openssl/asn1.h | 1128 +++ OtherInc/openssl/include/openssl/asn1_mac.h | 10 + OtherInc/openssl/include/openssl/asn1err.h | 140 + OtherInc/openssl/include/openssl/asn1t.h | 946 ++ OtherInc/openssl/include/openssl/async.h | 96 + OtherInc/openssl/include/openssl/asyncerr.h | 29 + OtherInc/openssl/include/openssl/bio.h | 886 ++ OtherInc/openssl/include/openssl/bioerr.h | 65 + OtherInc/openssl/include/openssl/blowfish.h | 78 + OtherInc/openssl/include/openssl/bn.h | 583 ++ OtherInc/openssl/include/openssl/bnerr.h | 46 + OtherInc/openssl/include/openssl/buffer.h | 62 + OtherInc/openssl/include/openssl/buffererr.h | 25 + OtherInc/openssl/include/openssl/camellia.h | 117 + OtherInc/openssl/include/openssl/cast.h | 71 + OtherInc/openssl/include/openssl/cmac.h | 52 + OtherInc/openssl/include/openssl/cmp.h | 592 ++ OtherInc/openssl/include/openssl/cmp_util.h | 56 + OtherInc/openssl/include/openssl/cmperr.h | 112 + OtherInc/openssl/include/openssl/cms.h | 493 + OtherInc/openssl/include/openssl/cmserr.h | 122 + OtherInc/openssl/include/openssl/comp.h | 59 + OtherInc/openssl/include/openssl/comperr.h | 31 + OtherInc/openssl/include/openssl/conf.h | 211 + OtherInc/openssl/include/openssl/conf_api.h | 46 + OtherInc/openssl/include/openssl/conferr.h | 51 + .../openssl/include/openssl/configuration.h | 133 + OtherInc/openssl/include/openssl/conftypes.h | 44 + OtherInc/openssl/include/openssl/core.h | 233 + .../openssl/include/openssl/core_dispatch.h | 943 ++ OtherInc/openssl/include/openssl/core_names.h | 556 ++ .../openssl/include/openssl/core_object.h | 41 + OtherInc/openssl/include/openssl/crmf.h | 227 + OtherInc/openssl/include/openssl/crmferr.h | 50 + OtherInc/openssl/include/openssl/crypto.h | 558 ++ OtherInc/openssl/include/openssl/cryptoerr.h | 46 + .../include/openssl/cryptoerr_legacy.h | 1466 +++ OtherInc/openssl/include/openssl/ct.h | 573 ++ OtherInc/openssl/include/openssl/cterr.h | 45 + OtherInc/openssl/include/openssl/decoder.h | 133 + OtherInc/openssl/include/openssl/decodererr.h | 28 + OtherInc/openssl/include/openssl/des.h | 211 + OtherInc/openssl/include/openssl/dh.h | 328 + OtherInc/openssl/include/openssl/dherr.h | 57 + OtherInc/openssl/include/openssl/dsa.h | 275 + OtherInc/openssl/include/openssl/dsaerr.h | 43 + OtherInc/openssl/include/openssl/dtls1.h | 57 + OtherInc/openssl/include/openssl/e_os2.h | 305 + OtherInc/openssl/include/openssl/ebcdic.h | 39 + OtherInc/openssl/include/openssl/ec.h | 1569 ++++ OtherInc/openssl/include/openssl/ecdh.h | 10 + OtherInc/openssl/include/openssl/ecdsa.h | 10 + OtherInc/openssl/include/openssl/ecerr.h | 103 + OtherInc/openssl/include/openssl/encoder.h | 124 + OtherInc/openssl/include/openssl/encodererr.h | 28 + OtherInc/openssl/include/openssl/engine.h | 833 ++ OtherInc/openssl/include/openssl/engineerr.h | 63 + OtherInc/openssl/include/openssl/err.h | 492 + OtherInc/openssl/include/openssl/ess.h | 128 + OtherInc/openssl/include/openssl/esserr.h | 32 + OtherInc/openssl/include/openssl/evp.h | 2170 +++++ OtherInc/openssl/include/openssl/evperr.h | 134 + OtherInc/openssl/include/openssl/fips_names.h | 60 + OtherInc/openssl/include/openssl/fipskey.h | 36 + OtherInc/openssl/include/openssl/hmac.h | 62 + OtherInc/openssl/include/openssl/http.h | 109 + OtherInc/openssl/include/openssl/httperr.h | 55 + OtherInc/openssl/include/openssl/idea.h | 82 + OtherInc/openssl/include/openssl/kdf.h | 138 + OtherInc/openssl/include/openssl/kdferr.h | 16 + OtherInc/openssl/include/openssl/lhash.h | 288 + OtherInc/openssl/include/openssl/macros.h | 304 + OtherInc/openssl/include/openssl/md2.h | 56 + OtherInc/openssl/include/openssl/md4.h | 63 + OtherInc/openssl/include/openssl/md5.h | 62 + OtherInc/openssl/include/openssl/mdc2.h | 55 + OtherInc/openssl/include/openssl/modes.h | 219 + OtherInc/openssl/include/openssl/obj_mac.h | 5481 +++++++++++ OtherInc/openssl/include/openssl/objects.h | 183 + OtherInc/openssl/include/openssl/objectserr.h | 28 + OtherInc/openssl/include/openssl/ocsp.h | 483 + OtherInc/openssl/include/openssl/ocsperr.h | 53 + .../openssl/include/openssl/opensslconf.h | 17 + OtherInc/openssl/include/openssl/opensslv.h | 114 + OtherInc/openssl/include/openssl/ossl_typ.h | 16 + .../openssl/include/openssl/param_build.h | 63 + OtherInc/openssl/include/openssl/params.h | 160 + OtherInc/openssl/include/openssl/pem.h | 538 ++ OtherInc/openssl/include/openssl/pem2.h | 19 + OtherInc/openssl/include/openssl/pemerr.h | 58 + OtherInc/openssl/include/openssl/pkcs12.h | 350 + OtherInc/openssl/include/openssl/pkcs12err.h | 45 + OtherInc/openssl/include/openssl/pkcs7.h | 427 + OtherInc/openssl/include/openssl/pkcs7err.h | 63 + OtherInc/openssl/include/openssl/prov_ssl.h | 34 + OtherInc/openssl/include/openssl/proverr.h | 148 + OtherInc/openssl/include/openssl/provider.h | 60 + OtherInc/openssl/include/openssl/rand.h | 123 + OtherInc/openssl/include/openssl/randerr.h | 68 + OtherInc/openssl/include/openssl/rc2.h | 68 + OtherInc/openssl/include/openssl/rc4.h | 47 + OtherInc/openssl/include/openssl/rc5.h | 79 + OtherInc/openssl/include/openssl/ripemd.h | 59 + OtherInc/openssl/include/openssl/rsa.h | 604 ++ OtherInc/openssl/include/openssl/rsaerr.h | 107 + OtherInc/openssl/include/openssl/safestack.h | 297 + OtherInc/openssl/include/openssl/seed.h | 113 + OtherInc/openssl/include/openssl/self_test.h | 92 + OtherInc/openssl/include/openssl/sha.h | 138 + OtherInc/openssl/include/openssl/srp.h | 285 + OtherInc/openssl/include/openssl/srtp.h | 56 + OtherInc/openssl/include/openssl/ssl.h | 2599 ++++++ OtherInc/openssl/include/openssl/ssl2.h | 30 + OtherInc/openssl/include/openssl/ssl3.h | 347 + OtherInc/openssl/include/openssl/sslerr.h | 343 + .../openssl/include/openssl/sslerr_legacy.h | 468 + OtherInc/openssl/include/openssl/stack.h | 90 + OtherInc/openssl/include/openssl/store.h | 369 + OtherInc/openssl/include/openssl/storeerr.h | 49 + OtherInc/openssl/include/openssl/symhacks.h | 39 + OtherInc/openssl/include/openssl/tls1.h | 1223 +++ OtherInc/openssl/include/openssl/trace.h | 312 + OtherInc/openssl/include/openssl/ts.h | 503 + OtherInc/openssl/include/openssl/tserr.h | 67 + OtherInc/openssl/include/openssl/txt_db.h | 63 + OtherInc/openssl/include/openssl/types.h | 236 + OtherInc/openssl/include/openssl/ui.h | 407 + OtherInc/openssl/include/openssl/uierr.h | 38 + OtherInc/openssl/include/openssl/whrlpool.h | 62 + OtherInc/openssl/include/openssl/x509.h | 1276 +++ OtherInc/openssl/include/openssl/x509_vfy.h | 894 ++ OtherInc/openssl/include/openssl/x509err.h | 68 + OtherInc/openssl/include/openssl/x509v3.h | 1450 +++ OtherInc/openssl/include/openssl/x509v3err.h | 93 + OtherInc/openssl/lib/engines-3/capi.dll | Bin 0 -> 53248 bytes .../openssl/lib/engines-3/loader_attic.dll | Bin 0 -> 61952 bytes OtherInc/openssl/lib/engines-3/padlock.dll | Bin 0 -> 46592 bytes OtherInc/openssl/lib/libcrypto.lib | Bin 0 -> 1256052 bytes OtherInc/openssl/lib/libssl.lib | Bin 0 -> 126770 bytes OtherInc/openssl/lib/ossl-modules/legacy.dll | Bin 0 -> 100864 bytes OtherInc/rapidjson/allocators.h | 271 + OtherInc/rapidjson/document.h | 2575 ++++++ OtherInc/rapidjson/encodedstream.h | 299 + OtherInc/rapidjson/encodings.h | 716 ++ OtherInc/rapidjson/error/en.h | 74 + OtherInc/rapidjson/error/error.h | 155 + OtherInc/rapidjson/filereadstream.h | 99 + OtherInc/rapidjson/filewritestream.h | 104 + OtherInc/rapidjson/fwd.h | 151 + OtherInc/rapidjson/internal/biginteger.h | 290 + OtherInc/rapidjson/internal/diyfp.h | 258 + OtherInc/rapidjson/internal/dtoa.h | 245 + OtherInc/rapidjson/internal/ieee754.h | 78 + OtherInc/rapidjson/internal/itoa.h | 304 + OtherInc/rapidjson/internal/meta.h | 181 + OtherInc/rapidjson/internal/pow10.h | 55 + OtherInc/rapidjson/internal/regex.h | 701 ++ OtherInc/rapidjson/internal/stack.h | 230 + OtherInc/rapidjson/internal/strfunc.h | 55 + OtherInc/rapidjson/internal/strtod.h | 269 + OtherInc/rapidjson/internal/swap.h | 46 + OtherInc/rapidjson/istreamwrapper.h | 115 + OtherInc/rapidjson/memorybuffer.h | 70 + OtherInc/rapidjson/memorystream.h | 71 + OtherInc/rapidjson/msinttypes/inttypes.h | 316 + OtherInc/rapidjson/msinttypes/stdint.h | 300 + OtherInc/rapidjson/ostreamwrapper.h | 81 + OtherInc/rapidjson/pointer.h | 1358 +++ OtherInc/rapidjson/prettywriter.h | 255 + OtherInc/rapidjson/rapidjson.h | 615 ++ OtherInc/rapidjson/reader.h | 1879 ++++ OtherInc/rapidjson/schema.h | 2006 ++++ OtherInc/rapidjson/stream.h | 179 + OtherInc/rapidjson/stringbuffer.h | 117 + OtherInc/rapidjson/writer.h | 610 ++ OtherLib/engines-3/capi.dll | Bin 0 -> 53248 bytes OtherLib/engines-3/loader_attic.dll | Bin 0 -> 61952 bytes OtherLib/engines-3/padlock.dll | Bin 0 -> 46592 bytes OtherLib/libMinHook.x86.lib | Bin 0 -> 245350 bytes OtherLib/libcrypto.lib | Bin 0 -> 1256052 bytes OtherLib/libssl.lib | Bin 0 -> 126770 bytes OtherLib/ossl-modules/legacy.dll | Bin 0 -> 100864 bytes OtherLib/zlib.lib | Bin 0 -> 17072 bytes OtherLib/zlibstatic.lib | Bin 0 -> 116008 bytes Rindro_Plugin.sln | 93 + Rindro_Plugin.vcxproj | 185 + Rindro_Plugin.vcxproj.filters | 57 + dllmain.cpp | 102 + framework.h | 7 + inlinehook.cpp | 36 + pch.cpp | 5 + pch.h | 44 + 212 files changed, 72298 insertions(+) create mode 100644 Include/BASE64.cpp create mode 100644 Include/BASE64.h create mode 100644 Include/DNFTOOL.hpp create mode 100644 Include/Hook.hpp create mode 100644 Include/HookUi.hpp create mode 100644 Include/MinHook.h create mode 100644 Include/RegisterSquirrel.hpp create mode 100644 Include/httplib.h create mode 100644 Include/inlinehook.h create mode 100644 Include/sqstdaux.h create mode 100644 Include/sqstdblob.h create mode 100644 Include/sqstdio.h create mode 100644 Include/sqstdmath.h create mode 100644 Include/sqstdstring.h create mode 100644 Include/sqstdsystem.h create mode 100644 Include/squirrel.h create mode 100644 OtherInc/openssl/include/openssl/__DECC_INCLUDE_EPILOGUE.H create mode 100644 OtherInc/openssl/include/openssl/__DECC_INCLUDE_PROLOGUE.H create mode 100644 OtherInc/openssl/include/openssl/aes.h create mode 100644 OtherInc/openssl/include/openssl/applink.c create mode 100644 OtherInc/openssl/include/openssl/asn1.h create mode 100644 OtherInc/openssl/include/openssl/asn1_mac.h create mode 100644 OtherInc/openssl/include/openssl/asn1err.h create mode 100644 OtherInc/openssl/include/openssl/asn1t.h create mode 100644 OtherInc/openssl/include/openssl/async.h create mode 100644 OtherInc/openssl/include/openssl/asyncerr.h create mode 100644 OtherInc/openssl/include/openssl/bio.h create mode 100644 OtherInc/openssl/include/openssl/bioerr.h create mode 100644 OtherInc/openssl/include/openssl/blowfish.h create mode 100644 OtherInc/openssl/include/openssl/bn.h create mode 100644 OtherInc/openssl/include/openssl/bnerr.h create mode 100644 OtherInc/openssl/include/openssl/buffer.h create mode 100644 OtherInc/openssl/include/openssl/buffererr.h create mode 100644 OtherInc/openssl/include/openssl/camellia.h create mode 100644 OtherInc/openssl/include/openssl/cast.h create mode 100644 OtherInc/openssl/include/openssl/cmac.h create mode 100644 OtherInc/openssl/include/openssl/cmp.h create mode 100644 OtherInc/openssl/include/openssl/cmp_util.h create mode 100644 OtherInc/openssl/include/openssl/cmperr.h create mode 100644 OtherInc/openssl/include/openssl/cms.h create mode 100644 OtherInc/openssl/include/openssl/cmserr.h create mode 100644 OtherInc/openssl/include/openssl/comp.h create mode 100644 OtherInc/openssl/include/openssl/comperr.h create mode 100644 OtherInc/openssl/include/openssl/conf.h create mode 100644 OtherInc/openssl/include/openssl/conf_api.h create mode 100644 OtherInc/openssl/include/openssl/conferr.h create mode 100644 OtherInc/openssl/include/openssl/configuration.h create mode 100644 OtherInc/openssl/include/openssl/conftypes.h create mode 100644 OtherInc/openssl/include/openssl/core.h create mode 100644 OtherInc/openssl/include/openssl/core_dispatch.h create mode 100644 OtherInc/openssl/include/openssl/core_names.h create mode 100644 OtherInc/openssl/include/openssl/core_object.h create mode 100644 OtherInc/openssl/include/openssl/crmf.h create mode 100644 OtherInc/openssl/include/openssl/crmferr.h create mode 100644 OtherInc/openssl/include/openssl/crypto.h create mode 100644 OtherInc/openssl/include/openssl/cryptoerr.h create mode 100644 OtherInc/openssl/include/openssl/cryptoerr_legacy.h create mode 100644 OtherInc/openssl/include/openssl/ct.h create mode 100644 OtherInc/openssl/include/openssl/cterr.h create mode 100644 OtherInc/openssl/include/openssl/decoder.h create mode 100644 OtherInc/openssl/include/openssl/decodererr.h create mode 100644 OtherInc/openssl/include/openssl/des.h create mode 100644 OtherInc/openssl/include/openssl/dh.h create mode 100644 OtherInc/openssl/include/openssl/dherr.h create mode 100644 OtherInc/openssl/include/openssl/dsa.h create mode 100644 OtherInc/openssl/include/openssl/dsaerr.h create mode 100644 OtherInc/openssl/include/openssl/dtls1.h create mode 100644 OtherInc/openssl/include/openssl/e_os2.h create mode 100644 OtherInc/openssl/include/openssl/ebcdic.h create mode 100644 OtherInc/openssl/include/openssl/ec.h create mode 100644 OtherInc/openssl/include/openssl/ecdh.h create mode 100644 OtherInc/openssl/include/openssl/ecdsa.h create mode 100644 OtherInc/openssl/include/openssl/ecerr.h create mode 100644 OtherInc/openssl/include/openssl/encoder.h create mode 100644 OtherInc/openssl/include/openssl/encodererr.h create mode 100644 OtherInc/openssl/include/openssl/engine.h create mode 100644 OtherInc/openssl/include/openssl/engineerr.h create mode 100644 OtherInc/openssl/include/openssl/err.h create mode 100644 OtherInc/openssl/include/openssl/ess.h create mode 100644 OtherInc/openssl/include/openssl/esserr.h create mode 100644 OtherInc/openssl/include/openssl/evp.h create mode 100644 OtherInc/openssl/include/openssl/evperr.h create mode 100644 OtherInc/openssl/include/openssl/fips_names.h create mode 100644 OtherInc/openssl/include/openssl/fipskey.h create mode 100644 OtherInc/openssl/include/openssl/hmac.h create mode 100644 OtherInc/openssl/include/openssl/http.h create mode 100644 OtherInc/openssl/include/openssl/httperr.h create mode 100644 OtherInc/openssl/include/openssl/idea.h create mode 100644 OtherInc/openssl/include/openssl/kdf.h create mode 100644 OtherInc/openssl/include/openssl/kdferr.h create mode 100644 OtherInc/openssl/include/openssl/lhash.h create mode 100644 OtherInc/openssl/include/openssl/macros.h create mode 100644 OtherInc/openssl/include/openssl/md2.h create mode 100644 OtherInc/openssl/include/openssl/md4.h create mode 100644 OtherInc/openssl/include/openssl/md5.h create mode 100644 OtherInc/openssl/include/openssl/mdc2.h create mode 100644 OtherInc/openssl/include/openssl/modes.h create mode 100644 OtherInc/openssl/include/openssl/obj_mac.h create mode 100644 OtherInc/openssl/include/openssl/objects.h create mode 100644 OtherInc/openssl/include/openssl/objectserr.h create mode 100644 OtherInc/openssl/include/openssl/ocsp.h create mode 100644 OtherInc/openssl/include/openssl/ocsperr.h create mode 100644 OtherInc/openssl/include/openssl/opensslconf.h create mode 100644 OtherInc/openssl/include/openssl/opensslv.h create mode 100644 OtherInc/openssl/include/openssl/ossl_typ.h create mode 100644 OtherInc/openssl/include/openssl/param_build.h create mode 100644 OtherInc/openssl/include/openssl/params.h create mode 100644 OtherInc/openssl/include/openssl/pem.h create mode 100644 OtherInc/openssl/include/openssl/pem2.h create mode 100644 OtherInc/openssl/include/openssl/pemerr.h create mode 100644 OtherInc/openssl/include/openssl/pkcs12.h create mode 100644 OtherInc/openssl/include/openssl/pkcs12err.h create mode 100644 OtherInc/openssl/include/openssl/pkcs7.h create mode 100644 OtherInc/openssl/include/openssl/pkcs7err.h create mode 100644 OtherInc/openssl/include/openssl/prov_ssl.h create mode 100644 OtherInc/openssl/include/openssl/proverr.h create mode 100644 OtherInc/openssl/include/openssl/provider.h create mode 100644 OtherInc/openssl/include/openssl/rand.h create mode 100644 OtherInc/openssl/include/openssl/randerr.h create mode 100644 OtherInc/openssl/include/openssl/rc2.h create mode 100644 OtherInc/openssl/include/openssl/rc4.h create mode 100644 OtherInc/openssl/include/openssl/rc5.h create mode 100644 OtherInc/openssl/include/openssl/ripemd.h create mode 100644 OtherInc/openssl/include/openssl/rsa.h create mode 100644 OtherInc/openssl/include/openssl/rsaerr.h create mode 100644 OtherInc/openssl/include/openssl/safestack.h create mode 100644 OtherInc/openssl/include/openssl/seed.h create mode 100644 OtherInc/openssl/include/openssl/self_test.h create mode 100644 OtherInc/openssl/include/openssl/sha.h create mode 100644 OtherInc/openssl/include/openssl/srp.h create mode 100644 OtherInc/openssl/include/openssl/srtp.h create mode 100644 OtherInc/openssl/include/openssl/ssl.h create mode 100644 OtherInc/openssl/include/openssl/ssl2.h create mode 100644 OtherInc/openssl/include/openssl/ssl3.h create mode 100644 OtherInc/openssl/include/openssl/sslerr.h create mode 100644 OtherInc/openssl/include/openssl/sslerr_legacy.h create mode 100644 OtherInc/openssl/include/openssl/stack.h create mode 100644 OtherInc/openssl/include/openssl/store.h create mode 100644 OtherInc/openssl/include/openssl/storeerr.h create mode 100644 OtherInc/openssl/include/openssl/symhacks.h create mode 100644 OtherInc/openssl/include/openssl/tls1.h create mode 100644 OtherInc/openssl/include/openssl/trace.h create mode 100644 OtherInc/openssl/include/openssl/ts.h create mode 100644 OtherInc/openssl/include/openssl/tserr.h create mode 100644 OtherInc/openssl/include/openssl/txt_db.h create mode 100644 OtherInc/openssl/include/openssl/types.h create mode 100644 OtherInc/openssl/include/openssl/ui.h create mode 100644 OtherInc/openssl/include/openssl/uierr.h create mode 100644 OtherInc/openssl/include/openssl/whrlpool.h create mode 100644 OtherInc/openssl/include/openssl/x509.h create mode 100644 OtherInc/openssl/include/openssl/x509_vfy.h create mode 100644 OtherInc/openssl/include/openssl/x509err.h create mode 100644 OtherInc/openssl/include/openssl/x509v3.h create mode 100644 OtherInc/openssl/include/openssl/x509v3err.h create mode 100644 OtherInc/openssl/lib/engines-3/capi.dll create mode 100644 OtherInc/openssl/lib/engines-3/loader_attic.dll create mode 100644 OtherInc/openssl/lib/engines-3/padlock.dll create mode 100644 OtherInc/openssl/lib/libcrypto.lib create mode 100644 OtherInc/openssl/lib/libssl.lib create mode 100644 OtherInc/openssl/lib/ossl-modules/legacy.dll create mode 100644 OtherInc/rapidjson/allocators.h create mode 100644 OtherInc/rapidjson/document.h create mode 100644 OtherInc/rapidjson/encodedstream.h create mode 100644 OtherInc/rapidjson/encodings.h create mode 100644 OtherInc/rapidjson/error/en.h create mode 100644 OtherInc/rapidjson/error/error.h create mode 100644 OtherInc/rapidjson/filereadstream.h create mode 100644 OtherInc/rapidjson/filewritestream.h create mode 100644 OtherInc/rapidjson/fwd.h create mode 100644 OtherInc/rapidjson/internal/biginteger.h create mode 100644 OtherInc/rapidjson/internal/diyfp.h create mode 100644 OtherInc/rapidjson/internal/dtoa.h create mode 100644 OtherInc/rapidjson/internal/ieee754.h create mode 100644 OtherInc/rapidjson/internal/itoa.h create mode 100644 OtherInc/rapidjson/internal/meta.h create mode 100644 OtherInc/rapidjson/internal/pow10.h create mode 100644 OtherInc/rapidjson/internal/regex.h create mode 100644 OtherInc/rapidjson/internal/stack.h create mode 100644 OtherInc/rapidjson/internal/strfunc.h create mode 100644 OtherInc/rapidjson/internal/strtod.h create mode 100644 OtherInc/rapidjson/internal/swap.h create mode 100644 OtherInc/rapidjson/istreamwrapper.h create mode 100644 OtherInc/rapidjson/memorybuffer.h create mode 100644 OtherInc/rapidjson/memorystream.h create mode 100644 OtherInc/rapidjson/msinttypes/inttypes.h create mode 100644 OtherInc/rapidjson/msinttypes/stdint.h create mode 100644 OtherInc/rapidjson/ostreamwrapper.h create mode 100644 OtherInc/rapidjson/pointer.h create mode 100644 OtherInc/rapidjson/prettywriter.h create mode 100644 OtherInc/rapidjson/rapidjson.h create mode 100644 OtherInc/rapidjson/reader.h create mode 100644 OtherInc/rapidjson/schema.h create mode 100644 OtherInc/rapidjson/stream.h create mode 100644 OtherInc/rapidjson/stringbuffer.h create mode 100644 OtherInc/rapidjson/writer.h create mode 100644 OtherLib/engines-3/capi.dll create mode 100644 OtherLib/engines-3/loader_attic.dll create mode 100644 OtherLib/engines-3/padlock.dll create mode 100644 OtherLib/libMinHook.x86.lib create mode 100644 OtherLib/libcrypto.lib create mode 100644 OtherLib/libssl.lib create mode 100644 OtherLib/ossl-modules/legacy.dll create mode 100644 OtherLib/zlib.lib create mode 100644 OtherLib/zlibstatic.lib create mode 100644 Rindro_Plugin.sln create mode 100644 Rindro_Plugin.vcxproj create mode 100644 Rindro_Plugin.vcxproj.filters create mode 100644 dllmain.cpp create mode 100644 framework.h create mode 100644 inlinehook.cpp create mode 100644 pch.cpp create mode 100644 pch.h diff --git a/Include/BASE64.cpp b/Include/BASE64.cpp new file mode 100644 index 0000000..4125055 --- /dev/null +++ b/Include/BASE64.cpp @@ -0,0 +1,418 @@ + +#include "pch.h" +#include "BASE64.h" +#include +#include +#include + + +using namespace LenheartBase; + + +// 加解密函数签名 +typedef int (*RSA_encryptOrDecrypt)(int flen, const unsigned char* from, unsigned char* to, RSA* rsa, int padding); + + +// 编解码转换表 +unsigned char CBASE64::s_encTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +unsigned char CBASE64::s_decTable[] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + +// 执行BASE64编码操作 +std::string CBASE64::encode(const std::string& str) +{ + std::string strEncode; + strEncode.resize((str.size() / 3 + 1) * 4); + strEncode.resize(__encode((unsigned char*)strEncode.data(), (const unsigned char*)str.data(), str.size())); + return strEncode; +} + +// 执行BASE64解码操作 +std::string CBASE64::decode(const std::string& str) +{ + std::string strDecode; + strDecode.resize(str.size()); + strDecode.resize(__decode((unsigned char*)strDecode.data(), (const unsigned char*)str.data(), str.size())); + return strDecode; +} + +// 分组编码 +int CBASE64::__encode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen) +{ + unsigned char* dst = pDest; + const unsigned char* src = pSrc; + size_t len = nSrcLen; + + unsigned char* odst = dst; + unsigned long l = 0, m = 0, n = 0; + + // 循环处理分组 + size_t off = 0; + for (; off + 3 <= len; off += 3) + { + l = *src++; + m = *src++; + n = *src++; + + *dst++ = s_encTable[(l >> 2) & 0x3F]; + *dst++ = s_encTable[((l << 4) & 0x30) | ((m >> 4) & 0x0F)]; + *dst++ = s_encTable[((m << 2) & 0x3C) | ((n >> 6) & 0x03)]; + *dst++ = s_encTable[n & 0x3F]; + } + + // 处理余下的2个字节 + if (off + 2 <= len) + { + l = *src++; + m = *src++; + + *dst++ = s_encTable[(l >> 2) & 0x3F]; + *dst++ = s_encTable[((l << 4) & 0x30) | ((m >> 4) & 0x0F)]; + *dst++ = s_encTable[((m << 2) & 0x3C)]; + *dst++ = '='; + } + + // 处理余下的1个字节 + else if (off + 1 <= len) + { + l = *src++; + + *dst++ = s_encTable[(l >> 2) & 0x3F]; + *dst++ = s_encTable[((l << 4) & 0x30)]; + *dst++ = '='; + *dst++ = '='; + } + + return (int)(dst - odst); +} + +// 分组解码 +int CBASE64::__decode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen) +{ + unsigned char* dst = pDest; + const unsigned char* src = pSrc; + size_t len = nSrcLen; + + unsigned char* odst = dst; + unsigned long l = 0, m = 0, n = 0, o = 0; + + // 循环处理分组 + size_t off = 0; + for (; off + 4 <= len; off += 4) + { + if ((src[0] > 0x7F) || (src[1] > 0x7F) || (src[2] > 0x7F) || (src[3] > 0x7F)) + return (int)(dst - odst); + if ((src[0] == '=') || (src[1] == '=') || (src[2] == '=') || (src[3] == '=')) + break; + + l = s_decTable[*src++]; + m = s_decTable[*src++]; + n = s_decTable[*src++]; + o = s_decTable[*src++]; + + *dst++ = (unsigned char)(((l << 2) & 0xFC) | ((m >> 4) & 0x03)); + *dst++ = (unsigned char)(((m << 4) & 0xF0) | ((n >> 2) & 0x0F)); + *dst++ = (unsigned char)(((n << 6) & 0xC0) | (o & 0x3F)); + } + + // 处理余下的3个字节 + if (off + 3 <= len) + { + if ((src[0] != '=') && (src[1] != '=')) + { + l = s_decTable[*src++]; + m = s_decTable[*src++]; + + *dst++ = (unsigned char)(((l << 2) & 0xFC) | ((m >> 4) & 0x03)); + } + + if ((src[2] != '=')) + { + n = s_decTable[*src++]; + + *dst++ = (unsigned char)(((m << 4) & 0xF0) | ((n >> 2) & 0x0F)); + } + } + + // 处理余下的两个字节 + else if (off + 2 <= len) + { + if ((src[0] != '=') && (src[1] != '=')) + { + l = s_decTable[*src++]; + m = s_decTable[*src++]; + + *dst++ = (unsigned char)(((l << 2) & 0xFC) | ((m >> 4) & 0x03)); + } + } + + return (int)(dst - odst); +} + +std::string CBASE64::RsaPriDecrypt(const std::string& cipher_text, const std::string& pri_key) +{ + std::string decrypt_text; + RSA* rsa = RSA_new(); + BIO* keybio; + keybio = BIO_new_mem_buf((unsigned char*)pri_key.c_str(), -1); + + rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL); + if (rsa == nullptr) + { + unsigned long err = ERR_get_error(); //获取错误号 + char err_msg[1024] = { 0 }; + ERR_error_string(err, err_msg); // 格式:error:errId:库:函数:原因 + return std::string(); + } + + // 获取RSA单次处理的最大长度 + int key_len = RSA_size(rsa); + char* sub_text = new char[key_len + 1]; + memset(sub_text, 0, key_len + 1); + int ret = 0; + std::string sub_str; + unsigned int pos = 0; + // 对密文进行分段解密 + while (pos < cipher_text.length() - 1) + { + sub_str = cipher_text.substr(pos, key_len); + memset(sub_text, 0, key_len + 1); + ret = RSA_private_decrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, 1); + if (ret >= 0) + { + decrypt_text.append(std::string(sub_text, ret)); + // printf("pos:%d, Length: %d ,sub: %s\n", pos, cipher_text.length(),sub_text); + pos += key_len; + } + } + // 释放内存 + delete[] sub_text; + BIO_free_all(keybio); + RSA_free(rsa); + + return decrypt_text; +} + +std::string CBASE64::RsaPriEncrypt(const std::string& clear_text, const std::string& pri_key) +{ + std::string encrypt_text; + BIO* keybio = BIO_new_mem_buf((unsigned char*)pri_key.c_str(), -1); + RSA* rsa = RSA_new(); + rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL); + if (!rsa) + { + BIO_free_all(keybio); + return std::string(""); + } + + // 获取RSA单次可以处理的数据块的最大长度 + int key_len = RSA_size(rsa); + int block_len = key_len - 11; // 因为填充方式为RSA_PKCS1_PADDING, 所以要在key_len基础上减去11 + + // 申请内存:存贮加密后的密文数据 + char* sub_text = new char[key_len + 1]; + memset(sub_text, 0, key_len + 1); + int ret = 0; + unsigned int pos = 0; + std::string sub_str; + // 对数据进行分段加密(返回值是加密后数据的长度) + while (pos < clear_text.length()) + { + sub_str = clear_text.substr(pos, block_len); + memset(sub_text, 0, key_len + 1); + ret = RSA_private_encrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, RSA_PKCS1_PADDING); + if (ret >= 0) + { + encrypt_text.append(std::string(sub_text, ret)); + } + pos += block_len; + } + + // 释放内存 + delete sub_text; + BIO_free_all(keybio); + RSA_free(rsa); + + return encrypt_text; +} + +// 生成RSA密钥结构 +void* CBASE64::__genKey(int nBits) +{ + RSA* rsa = RSA_new(); + + BIGNUM* bne = BN_new(); + BN_set_word(bne, RSA_F4); + + int ret = RSA_generate_key_ex(rsa, nBits, bne, NULL); + + BN_free(bne); + + if (ret != 1) + { + RSA_free(rsa); + return NULL; + } + + return (void*)rsa; +} + +// 生成密钥对,输出为PEM字符串 +bool CBASE64::genKeyStrings(std::string& strPrivateKeyPEMString, std::string& strPublicKeyPEMString) +{ + // 生成RSA + RSA* rsa = (RSA*)__genKey(1024); + if (rsa == NULL) + return false; + + // 输出私钥 + { + BIO* bio = BIO_new(BIO_s_mem()); + int ret = PEM_write_bio_RSAPrivateKey(bio, rsa, NULL, NULL, 0, NULL, NULL); + if (ret != 1) + { + BIO_free(bio); + RSA_free(rsa); + return false; + } + + char sBuf[1024] = { 0 }; + int bytes = BIO_read(bio, sBuf, 1024); + if (bytes <= 0) + { + BIO_free(bio); + RSA_free(rsa); + return false; + } + + BIO_free(bio); + strPrivateKeyPEMString.assign(sBuf, bytes); + } + + // 输出公钥 + { + BIO* bio = BIO_new(BIO_s_mem()); + int ret = PEM_write_bio_RSAPublicKey(bio, rsa); + if (ret != 1) + { + BIO_free(bio); + RSA_free(rsa); + return false; + } + + char sBuf[1024] = { 0 }; + int bytes = BIO_read(bio, sBuf, 1024); + if (bytes <= 0) + { + BIO_free(bio); + RSA_free(rsa); + return false; + } + + BIO_free(bio); + strPublicKeyPEMString.assign(sBuf, bytes); + } + + RSA_free(rsa); + return true; +} + + +// 使用PEM私钥字符串加密 +bool CBASE64::encryptByPrivatePEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString) +{ + // 加载私钥 + BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size()); + RSA* rsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL); + BIO_free(bio); + + if (rsa == NULL) + return false; + + // 使用私钥加密 + bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_private_encrypt, true); + RSA_free(rsa); + return b; +} + + +// 使用RSA执行加密或解密 +bool CBASE64::__encryptOrDecrypt(const std::string& strIn, std::string& strOut, const void* pRSA, const void* pFunc, bool bEncrypt) +{ + const RSA_encryptOrDecrypt encryptOrDecrypt = (const RSA_encryptOrDecrypt)pFunc; + + // 计算加密块大小 + int nKeySize = RSA_size((RSA*)pRSA); + int nBlockSize = bEncrypt ? (nKeySize - RSA_PKCS1_PADDING_SIZE) : nKeySize; + + const unsigned char* pIn = (const unsigned char*)strIn.data(); + int nInSize = strIn.size(); + + unsigned char* pBuf = new unsigned char[nKeySize]; + + // 分组迭代加密 + for (int i = 0; i < nInSize; ) + { + int nBlockLen = (nInSize - i > nBlockSize ? nBlockSize : nInSize - i); + + int ret = encryptOrDecrypt(nBlockLen, pIn + i, pBuf, (RSA*)pRSA, RSA_PKCS1_PADDING); + if (ret <= 0) + { + delete[] pBuf; + return false; + } + + strOut.append((char*)pBuf, ret); + i += nBlockLen; + } + + delete[] pBuf; + return true; +} + +// 使用PEM公钥字符串加密 +bool CBASE64::encryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString) +{ + // 加载公钥 + BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size()); + RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); + BIO_free(bio); + + if (rsa == NULL) + return false; + + // 使用公钥加密 + bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_public_encrypt, true); + RSA_free(rsa); + return b; +} + +// 使用PEM公钥字符串解密 +bool CBASE64::decryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString) +{ + // 加载公钥 + BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size()); + RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); + BIO_free(bio); + + if (rsa == NULL) + return false; + + // 检查密文大小是否为分组的整数倍 + int keySize = RSA_size(rsa); + int blockSize = keySize; + if ((strIn.size() % blockSize) != 0) + return false; + + // 使用公钥解密 + bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_public_decrypt, false); + RSA_free(rsa); + return b; +} \ No newline at end of file diff --git a/Include/BASE64.h b/Include/BASE64.h new file mode 100644 index 0000000..d8ec2d9 --- /dev/null +++ b/Include/BASE64.h @@ -0,0 +1,54 @@ +#ifndef __DAKUANG_BASE64_H__ +#define __DAKUANG_BASE64_H__ + +#include + +namespace LenheartBase +{ + class CBASE64 + { + public: + // 生成RSA密钥结构 + static void* __genKey(int nBits); + + // 生成密钥对,输出为PEM字符串 + static bool genKeyStrings(std::string& strPrivateKeyPEMString, std::string& strPublicKeyPEMString); + + // 执行BASE64编码操作 + static std::string encode(const std::string& str); + + // 执行BASE64解码操作 + static std::string decode(const std::string& str); + + // 执行RSA私匙解密操作 + static std::string RsaPriDecrypt(const std::string& cipher_text, const std::string& pri_key); + // 执行RSA私匙加密操作 + static std::string RsaPriEncrypt(const std::string& clear_text, const std::string& pri_key); + + // 使用PEM私钥字符串加密 + static bool encryptByPrivatePEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString); + + // 使用PEM公钥字符串加密 + static bool encryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString); + + // 使用PEM公钥字符串解密 + static bool decryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString); + + // 使用RSA执行加密或解密 + static bool __encryptOrDecrypt(const std::string& strIn, std::string& strOut, const void* pRSA, const void* pFunc, bool bEncrypt); + + private: + // 分组编码 + static int __encode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen); + + // 分组解码 + static int __decode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen); + + private: + // 编解码转换表 + static unsigned char s_encTable[]; + static unsigned char s_decTable[]; + }; +} + +#endif \ No newline at end of file diff --git a/Include/DNFTOOL.hpp b/Include/DNFTOOL.hpp new file mode 100644 index 0000000..54c9686 --- /dev/null +++ b/Include/DNFTOOL.hpp @@ -0,0 +1,647 @@ +#pragma once +#include +#include +#include +#include +#include "BASE64.h" + +#define CPPHTTPLIB_OPENSSL_SUPPORT +#include "httplib.h" +#include +#include +#include + +#include "rapidjson/document.h" +#include "rapidjson/writer.h" +#include "rapidjson/stringbuffer.h" +#include "rapidjson/filereadstream.h" +#include "rapidjson/filewritestream.h" +#include "rapidjson/istreamwrapper.h" + +bool jiaoben = false; +std::vector BaseData; + +class DNFTOOL +{ +public: + DNFTOOL(); + ~DNFTOOL(); + +private: + +public: + static void DNFTOOL::Wchar_tToString(std::string& szDst, wchar_t* wchar) + { + wchar_t* wText = wchar; + DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, NULL, 0, NULL, FALSE);// WideCharToMultiByte的运用 + char* psText; // psText为char*的临时数组,作为赋值给std::string的中间变量 + psText = new char[dwNum]; + WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, psText, dwNum, NULL, FALSE);// WideCharToMultiByte的再次运用 + szDst = psText;// std::string赋值 + delete[]psText;// psText的清除 + } + static wchar_t* DNFTOOL::charTowchar_t(char* wbuffer) + { + size_t requiredSize = mbstowcs(nullptr, wbuffer, 0); + wchar_t* wcString = new wchar_t[requiredSize + 1]; + mbstowcs(wcString, wbuffer, requiredSize + 1); + return wcString; + } + + static void DNFTOOL::Split(const std::string& src, std::vector& dest, const std::string& separator) + { + std::string str = src; + std::string substring; + std::string::size_type start = 0, index; + dest.clear(); + index = str.find_first_of(separator, start); + do + { + if (index != std::string::npos) + { + substring = str.substr(start, index - start); + dest.push_back(substring); + start = index + separator.size(); + index = str.find(separator, start); + if (start == std::string::npos) break; + } + } while (index != std::string::npos); + + //the last part + substring = str.substr(start); + dest.push_back(substring); + } + static char* DNFTOOL::U8ToUnicode(const char* szU8) + { + //UTF8 to Unicode + //预转换,得到所需空间的大小 + int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0); + //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间 + wchar_t* wszString = new wchar_t[wcsLen + 1]; + //转换 + ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen); + //最后加上'\0' + wszString[wcsLen] = '\0'; + + char* m_char; + int len = WideCharToMultiByte(CP_ACP, 0, wszString, wcslen(wszString), NULL, 0, NULL, NULL); + m_char = new char[len + 1]; + WideCharToMultiByte(CP_ACP, 0, wszString, wcslen(wszString), m_char, len, NULL, NULL); + delete[]wszString; + m_char[len] = '\0'; + return m_char; + } + static char* DNFTOOL::SquirrelU2W(const wchar_t* Str) + { + size_t len = 0; + char* wbuffer = (char*)(Str); + while (true) + { + if (wbuffer[len] == 0 && wbuffer[len - 1] == 0)break; + ++len; + } + char* cbuffer = new char[len / 2 + 1]; + int k = 0; + for (size_t i = 0; i < len; i++) + { + if (i % 2 == 0) + { + cbuffer[k] = wbuffer[i]; + ++k; + } + } + cbuffer[len / 2] = '\0'; + char* Text = U8ToUnicode(cbuffer); + delete[]cbuffer; + return Text; + } + static char* DNFTOOL::GBKTOUTF8(std::string& strGBK)//转码 GBK编码转成UTF8编码 + { + int len = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0); + wchar_t* wszUtf8 = new wchar_t[len]; + memset(wszUtf8, 0, len); + MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, wszUtf8, len); + len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); + char* szUtf8 = new char[len + 1]; + memset(szUtf8, 0, len + 1); + WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL); + strGBK = szUtf8; + delete[] szUtf8; + delete[] wszUtf8; + return (char*)strGBK.c_str(); + } + static char* DNFTOOL::wchar_tTochar(wchar_t* wbuffer) + { + size_t requiredSize = wcstombs(nullptr, wbuffer, 0); + char* key = new char[requiredSize + 1]; + wcstombs(key, wbuffer, requiredSize + 1); + return key; + } + static std::string& ReplaceAll(std::string& str, const std::string& src, const std::string& dst) { + std::string::size_type pos(0); + while (true) { + if ((pos = str.find(src)) != std::string::npos) { + str.replace(pos, src.length(), dst); + } + else { + break; + } + } + return str; + } + static char* DNFTOOL::UnicodeToUtf8(const wchar_t* unicode) + { + int len; + len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL); + char* szUtf8 = (char*)malloc(len + 1); + memset(szUtf8, 0, len + 1); + WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL); + return szUtf8; + } + static int DNFTOOL::DNFDeCode(int Address) + { + DWORD nEax, nEcx8, nEsi, nEdx, nTmp; + nEax = *(int*)(Address); + if (nEax == -1) + return nEax; + nEcx8 = *(int*)(Address + 8); + if (nEcx8 == -1) + return nEcx8; + nEsi = *(int*)(0x1AF8D78); + nEdx = nEax >> 16; + nTmp = (nEdx << 2) + nEsi + 36; + nEdx = *(int*)(nTmp); + if (nEdx == -1) + return nEdx; + nEax = nEax & 65535; + nTmp = (nEax << 2) + nEdx + 8468; + nEax = *(int*)(nTmp); + if (nEax == -1) + return nEax; + _asm + { + mov eax, nEax + movzx edx, ax + mov nEdx, edx + } + nEsi = nEdx << 16; + nEsi = nEsi | nEdx; + nEax = nEsi ^ nEcx8; + return nEax; + } + static void DNFTOOL::DNFEnCode(int AddreSs, int Data) + { + long JEdi, JEcx, JEax, JEsi, JEdx, JSs; + JEcx = AddreSs; + JEax = *(int*)(0x1AF8DB8); + JEax = JEax + 1; + *(int*)(0x1AF8DB8) = JEax; + JEdx = JEax; + JEdx = JEdx >> 8; + JEdx = JEdx << 24; + JEdx = JEdx >> 24; + JEdx = *(int*)(JEdx * 2 + 0x1843F58); + JEdx = JEdx & 0xFFFF; + JEax = JEax << 24; + JEax = JEax >> 24; + JSs = *(int*)(JEax * 2 + 0x1844158); + JSs = JSs & 0xFFFF; + JEdx = JEdx ^ JSs; + JEax = JEdx; + JEax = JEax & 0xFFFF; + JEsi = Data; + JEdx = JEsi >> 16; + Sleep(10); + JSs = JEsi & 0xFFFF; + JEdx = JEdx + JSs; + JEdx = JEdx ^ JEax; + JEdi = JEdx; + JEdx = JEax; + JEax = JEax << 16; + JEax = JEax + JEdx; + JEsi = Data; + JEax = JEax ^ JEsi; + JEsi = AddreSs + 8; + *(int*)(JEsi) = JEax; + JEax = *(int*)(AddreSs); + JEsi = *(int*)(0x1AF8D78); + + JEcx = JEdi; + JEcx = JEcx << 16; + JEcx = JEcx + JEdx; + JEdx = JEax; + JEdx = JEdx >> 16; + JEdx = *(int*)(JEsi + JEdx * 4 + 36); + JEax = JEax & 0xFFFF; + *(int*)(JEdx + JEax * 4 + 8468) = JEcx; + } + static int DNFTOOL::GetEquAddr(int addr) + { + switch (addr) + { + case 1: + return 0x3038; + break; + case 2: + return 0x304C; + break; + case 3: + return 0x3048; + break; + case 4: + return 0x3050; + break; + case 5: + return 0x3044; + break; + case 6: + return 0x3040; + break; + case 7: + return 0x3058; + break; + case 8: + return 0x305C; + break; + case 9: + return 0x3054; + break; + case 10: + return 0x3060; + break; + case 11: + return 0x3064; + break; + case 12: + return 0x303c; + break; + + + case 13://帽子 + return 0x3010; + break; + case 14://头部 + return 0x3014; + break; + case 15://脸 + return 0x3018; + break; + case 16: + return 0x301c; + break; + case 17: + return 0x3020; + break; + case 18: + return 0x3024; + break; + case 19: + return 0x3028; + break; + case 20: + return 0x302c; + break; + case 21: + return 0x3030; + break; + case 22: + return 0x3034; + break; + case 23: + return 0x3030; + break; + case 24: + return 0x3068; + break; + case 25: + return 0x306C; + break; + case 26: + return 0x3070; + break; + case 27: + return 0x3074; + break; + } + return -1; + } + static wchar_t* DNFTOOL::char2wchar(const char* cchar) + { + wchar_t* m_wchar; + int len = MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), NULL, 0); + m_wchar = new wchar_t[len + 1]; + MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), m_wchar, len); + m_wchar[len] = '\0'; + return m_wchar; + } + +public: + static void DNFTOOL::WriteInt(int addr, int buf) + { + *(int*)addr = buf; + } + + + static void DNFTOOL::WriteByteArr(int addr, BYTE buf[], int len) + { + for (size_t i = 0; i < len; i++) + { + *(BYTE*)(addr + i) = (int)buf[i]; + } + } + + static int DNFTOOL::GetHook(int Addr, std::string 地址, int Type) + { + size_t pos = 地址.find("+"); + size_t size = 地址.size(); + int GetHookArr[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + int i = 0; + + while (pos != std::string::npos) + { + std::string x = 地址.substr(0, pos); + GetHookArr[i] = stoi(x, 0, 16); + i++; + 地址 = 地址.substr(pos + 1, size); + pos = 地址.find("+"); + } + + int num; + num = *(int*)(Addr); + + if (num != 0) + { + for (int z = 0; z < i; z++) + { + if (num <= 0 && z != i - 1)//可能读取发生了错误 + { + num = 0; + return num; + } + if (z == i - 1) + { + if (Type == 0)return *(int*)(num + GetHookArr[z]); + else return (num + GetHookArr[z]); + } + else + { + num = *(int*)(num + GetHookArr[z]); + } + } + } + return num; + } + + static std::string DNFTOOL::GetIP() + { + std::ifstream inFile; + inFile.open("DFC180.dll"); // 默认当方式打开文件 + if (!inFile.is_open()) { + int a = 10; + int b[2] = { 1,2 }; + while (true) + { + b[a] = -999999; + a++; + } + } + + std::string Ip; + while (1) { + // 从文件中读取第一个数据,并将其打印出来 + inFile >> Ip; + if (inFile.eof()) { + break; + } + } + + char* uncode = (char*)Ip.c_str(); + int skey[] = DFCSkey;//定义解密数组 + + Cutecode(uncode, skey);//解密 + + Ip = uncode; + //std::cout << "获取Ip" << std::endl; + return Ip; + } + + static std::string DNFTOOL::GetUserIp() + { + std::string ippack; + wchar_t* wgameip = (wchar_t*)0x1AE9CEC; + DNFTOOL::Wchar_tToString(ippack, wgameip); + return ippack; + } + + static std::string DNFTOOL::rsaDecrypt(const std::string& encryptedData, const std::string& publicKeyStr) { + RSA* rsa = RSA_new(); + BIO* bio = BIO_new_mem_buf(const_cast(publicKeyStr.c_str()), -1); + PEM_read_bio_RSA_PUBKEY(bio, &rsa, NULL, NULL); + + int rsaSize = RSA_size(rsa); + std::string decryptedData(rsaSize, 0); + + int decryptedSize = RSA_public_decrypt(encryptedData.size(), reinterpret_cast(encryptedData.c_str()), reinterpret_cast(&decryptedData[0]), rsa, RSA_PKCS1_PADDING); + + if (decryptedSize == -1) { + std::cerr << "Error decrypting data" << std::endl; + return ""; + } + + RSA_free(rsa); + BIO_free(bio); + + decryptedData.resize(decryptedSize); + return decryptedData; + } + + static void UnHtRe(std::string ippack, std::string Rqip) { + httplib::Client* CliObj = NULL;// http连接主体 + CliObj = new httplib::Client(Rqip);//初始化 http 对象 + } + + static void Unski(std::string Body, std::string Ti, std::string APath) { + //必须在前面加载 不然会拿不到版本号 + std::string sustr = "ENUM_TW_GROWTYPE_TI <- " + Ti; + BaseData.push_back(sustr); + + std::string apstr = "ENUM_TW_GROWTYPE_PO <- \"" + APath + "\""; + BaseData.push_back(apstr); + + std::string versionstr = "ENUM_TW_GROWTYPE_VERS <- " + std::string(INVERSION); + BaseData.push_back(versionstr); + + std::vector BaseDataBuffer; + DNFTOOL::Split(Body, BaseDataBuffer, "$$$$$"); + + size_t Ds = BaseDataBuffer.size(); + + std::vector NNKey; + DNFTOOL::Split(APath, NNKey, ","); + + int RealKey[5] = { atoi(NNKey[0].c_str()),atoi(NNKey[1].c_str()) ,atoi(NNKey[2].c_str()) ,atoi(NNKey[3].c_str()) ,atoi(NNKey[4].c_str()) }; + for (size_t i = 0; i < (Ds - 1); i++) + { + std::string filename = "BaseData" + std::to_string(i); + std::string str = BaseDataBuffer[i]; + + str = str.substr(str.find("[") + 1, str.length() - 2); + + std::vector Data; + DNFTOOL::Split(str, Data, ", "); + size_t DDs = Data.size(); + + char* nutstr = new char[DDs + 1]; + + + for (size_t s = 0; s < DDs; s++) + { + nutstr[s] = char(atoi(Data[s].c_str())); + } + nutstr[DDs] = '\0'; + + Cutecode(nutstr, RealKey, DDs);//解密 + + //std::cout << nutstr << std::endl << std::flush;; + + BaseData.push_back(std::string(nutstr, DDs)); + delete[]nutstr; + } + + + jiaoben = true; + } + + static bool DNFTOOL::ReqIpLicense(std::string ippack, std::string Rqip, std::string ym) + { + httplib::Client cli(ym); + + //cli.set_ca_cert_path("./ca-bundle.crt"); + + // Disable cert verification + cli.enable_server_certificate_verification(false); + //cli.set_read_timeout(30); // 读取超时30秒 + //cli.set_connection_timeout(30); + //cli.set_write_timeout(30); + + + httplib::Params ParamsObj;//新建 Params 对象 + ParamsObj.emplace("ip", ippack.c_str());//加入账号数据进数据包 + + //程序运行时间 + std::string Ti = std::to_string(clock()); + + FILE* file2 = fopen("Script.pvf", "rb"); + fseek(file2, 60, SEEK_SET); + int code1 = fgetc(file2); + fseek(file2, 1500, SEEK_SET); + int code2 = fgetc(file2); + fseek(file2, 4000, SEEK_SET); + int code3 = fgetc(file2); + fseek(file2, 16008, SEEK_SET); + int code4 = fgetc(file2); + fseek(file2, 24003, SEEK_SET); + int code5 = fgetc(file2); + fclose(file2); + + std::string Apath = std::to_string(code1 % 10) + "," + std::to_string(code2 % 10) + "," + std::to_string(code3 % 10) + "," + std::to_string(code4 % 10) + "," + std::to_string(code5 % 10); + + //随机值 + std::string s = Ti + Apath; + + + ParamsObj.emplace("s", s.c_str());//随机值 + ParamsObj.emplace("su", Ti.c_str());//程序运行的时间 + + + auto now = std::chrono::system_clock::now(); + auto now_c = std::chrono::system_clock::to_time_t(now); + + std::string timestamp = std::ctime(&now_c); + timestamp.pop_back(); // Remove trailing newline character + ParamsObj.emplace("l", timestamp);//时间戳 + + //CliObj->set_connection_timeout(0, 1000000); // 300 milliseconds + //CliObj->set_read_timeout(5, 0); // 5 seconds + //CliObj->set_write_timeout(5, 0); // 5 seconds + + auto res = cli.Post("/c/user2/getproclient", ParamsObj); + //auto res = cli.Get("/c/user/getproclient"); + if (res) { + if (res->status == 200)//如果返回包正常 + { + std::string jso = res->body;//取得date + std::string pub = R"(-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHXJ0Df2JAAZSAyW9sKmYGBB0S +UXh7yFm3sjVe8ybDGXWUZkGCotljJjTB9wysluwgs3WK7x20OUMqj2GkNV/YVb+G +z81zykggVT4eQq9d1sCoId5YS5m5AP4SfYIkSKPY0+O3xxN0WiZInEcgqlg0ojrJ +xe4DWCUH/DAGq5f6EwIDAQAB +-----END PUBLIC KEY-----)"; + + + LenheartBase::CBASE64 bb; + std::string decryptedData = DNFTOOL::rsaDecrypt(bb.decode(jso), pub); + + rapidjson::Document Dom; + Dom.Parse(decryptedData.c_str());//加载 字符串 + + //1级验证 + if (Dom["ce"].GetString() == s) { + + +#ifdef SELL + + httplib::Client nutcli(Rqip); + nutcli.enable_server_certificate_verification(false); + + + httplib::Headers headers = { + {"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"} + }; + + auto nutres = nutcli.Get("/client/getclients2", headers); + + if (nutres) { + if (nutres->status == 200)//如果返回包正常 + { + Unski(nutres->body, Ti, Dom["key2"].GetString()); + return true; + } + else { + } + } + else { + } + return false; +#endif // SELL + return true; + } + else { + DNFTOOL::UnHtRe(ippack, Rqip); + return false; + } + } + else + { + DNFTOOL::UnHtRe(ippack, Rqip); + return false; + } + + } + else { + // 获取HTTP请求的错误码 + DNFTOOL::UnHtRe(ippack, Rqip); + return false; + } + DNFTOOL::UnHtRe(ippack, Rqip); + return false; + } +}; + +DNFTOOL::DNFTOOL() +{ +} + +DNFTOOL::~DNFTOOL() +{ +} \ No newline at end of file diff --git a/Include/Hook.hpp b/Include/Hook.hpp new file mode 100644 index 0000000..546733e --- /dev/null +++ b/Include/Hook.hpp @@ -0,0 +1,1745 @@ +#pragma once +#include +#include "MinHook.h" +#include "inlinehook.h" +#include "RegisterSquirrel.hpp" + +//游戏初始化完毕Flag +static bool InitGameFlag = false; + +//脚本是否请求到的Flag +extern bool jiaoben; +//脚本文件数组 +extern std::vector BaseData; +//加载脚本的逻辑 +void Suxn() { + size_t Ds = BaseData.size(); + + for (size_t i = 0; i < Ds; i++) + { + std::string filenamebuf = "BaseData" + std::to_string(i); + std::string strbuf = BaseData[i]; + wchar_t* filename = DNFTOOL::charTowchar_t((char*)filenamebuf.c_str()); + wchar_t* str = DNFTOOL::charTowchar_t((char*)strbuf.c_str()); + + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; +#ifdef SELL + //std::cout << strbuf << std::endl; + if (sq_mycompilebuffer(v, str, wcslen(str), L"interactive console", false) >= 0) { + Sq_pushroottable(v); + Sq_call(v, 1, SQTrue, SQFalse); + Sq_pop(v, 1); + } +#else + if (sq_mycompilebuffer(v, str, wcslen(str), filename, false) >= 0) { + Sq_pushroottable(v); + Sq_call(v, 1, SQTrue, SQFalse); + Sq_pop(v, 1); + } +#endif // SELL + + delete[] filename; + delete[] str; + } + BaseData.clear(); + jiaoben = false; +} + + + +typedef struct REG +{ + DWORD EAX; + DWORD EBX; + DWORD ECX; + DWORD EDX; + DWORD ESI; + DWORD EDI; + DWORD ESP; + DWORD EBP; + DWORD VmAddress; + BYTE Cl; + +} REG; +REG PlayerEach = { 0 }; +void __declspec(naked)PlayerEach2() { + static int address = 0x11B34E0; + static int address1 = 0x001004B59; + _asm + { + pushad + pushfd + + mov PlayerEach.ECX, ecx + mov PlayerEach.EDI, edi + } + + if (PlayerEach.EDI == 2) { + PlayerEach.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"Sq_PlayerEachPos", -1); + if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2))) + { + Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, *(int*)(PlayerEach.ECX + 0x14)); + Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, *(int*)(PlayerEach.ECX + 0x18)); + Sq_call(*(HSQUIRRELVM*)0x1AF3544, 3, 0, 1); + } + Sq_settop(*(HSQUIRRELVM*)0x1AF3544, PlayerEach.VmAddress); + } + + _asm { + popfd + popad + call address + test al, al + jmp address1 + } + +} +REG MouseAsm = { 0 }; +void __declspec(naked)MouseWheelUp() { + static int address = 0x11BDE12; + static int address1 = 0x0011BDEEE; + static int address2 = 0x0011BDEDF; + static int address3 = 0x0011BDECE; + _asm + { + pushad + pushfd + mov MouseAsm.EDI, edi + mov MouseAsm.ECX, ecx + } + + if ((int)*(BYTE*)0x1B46886 == 0) { + _asm { + popfd + popad + jmp address + } + } + else { + if (MouseAsm.EDI == 0x20A) { + if (MouseAsm.ECX == 0x780000) { + _asm { + popfd + popad + jmp address3 + } + } + else { + _asm { + popfd + popad + jmp address2 + } + } + } + else { + _asm { + popfd + popad + jmp address1 + } + } + } +} +REG DrawWindow_BAsm = { 0 }; +void __declspec(naked)DrawWindow_B_Hook() { + static int address = 0xFFDA10; + static int address1 = 0x66BEA1; + _asm + { + pushad + pushfd + + } + + if (InitGameFlag) + { + DrawWindow_BAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"L_DrawWindow_B", -1); + if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2))) + { + Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544); + Sq_call(*(HSQUIRRELVM*)0x1AF3544, 1, 0, 1); + } + Sq_settop(*(HSQUIRRELVM*)0x1AF3544, DrawWindow_BAsm.VmAddress); + } + + _asm { + popfd + popad + mov ecx, eax + call address + jmp address1 + } + +} + +REG BuffIconHookAsm = { 0 }; +void __declspec(naked)BuffIcon_Hook() { + static int address = 0x4C8C1D; + static int address2 = 0x4C8C5B; + _asm + { + pushad + pushfd + + } + + _asm { + popfd + popad + add esi,0x88 + sub edi,eax + mov BuffIconHookAsm.Cl, cl + pushad + pushfd + } + + if (BuffIconHookAsm.Cl == 1) { + _asm { + popfd + popad + jmp address + } + } + else { + _asm { + popfd + popad + jmp address2 + } + } + +} +REG BuffIconHookBAsm = { 0 }; +void __declspec(naked)BuffIcon_Hook_B() { + static int address = 0x4BF566; + //static int address2 = 0x4C8C5B; + _asm + { + pushad + pushfd + + } + + _asm { + popfd + popad + sub edi,eax + add esi, 0x88 + mov [ebp-40],esi + jmp address + } +} +void __declspec(naked)HudBloodBackground() { + static int address = 0x4CA055; + _asm + { + pushad + pushfd + + } + + if (InitGameFlag) + { + DrawWindow_BAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"L_HUD_BloodBackground", -1); + if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2))) + { + Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544); + Sq_call(*(HSQUIRRELVM*)0x1AF3544, 1, 0, 1); + } + Sq_settop(*(HSQUIRRELVM*)0x1AF3544, DrawWindow_BAsm.VmAddress); + } + + _asm { + popfd + popad + jmp address + } +} + +REG Damage_HookAsm = { 0 }; +void __declspec(naked)Damage_Hook() { + static int address = 0xE5A2E5; + _asm + { + pushad + pushfd + + mov Damage_HookAsm.EDI, edi + mov Damage_HookAsm.EBX, ebx + mov Damage_HookAsm.EBP, ebp + } + + + Damage_HookAsm.EAX = *(int*)0x1AB7CDC; + + if (InitGameFlag) + { + int Address = Damage_HookAsm.EBX;//只要等于 red 或者 等于0 就说明是我自己的伤害 + int Damage = *(DWORD*)(Damage_HookAsm.EBP - 0x17c); + + Damage_HookAsm.VmAddress = Sq_gettop(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushstring(*(HSQUIRRELVM*)0x1AF3544, L"Sq_PushDamageData", -1); + if (SQ_SUCCEEDED(Sq_get(*(HSQUIRRELVM*)0x1AF3544, -2))) + { + Sq_pushroottable(*(HSQUIRRELVM*)0x1AF3544); + Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Address); + Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Damage_HookAsm.EAX); + Sq_pushinteger(*(HSQUIRRELVM*)0x1AF3544, Damage); + Sq_call(*(HSQUIRRELVM*)0x1AF3544, 4, 0, 1); + } + Sq_settop(*(HSQUIRRELVM*)0x1AF3544, Damage_HookAsm.VmAddress); + Damage_HookAsm.EBX = 0; + Damage_HookAsm.EBP = 0; + } + + _asm { + popfd + popad + mov eax, Damage_HookAsm.EAX + xor ecx,ecx + jmp address + } + +} + +void __declspec(naked)SelectCharacter_Hook() { + static int address = 0x10F79D1; + _asm + { + imul edx,edx,0x7a + xor eax, eax + add edx, 0xA1 + pushad + pushfd + } + _asm { + popfd + popad + jmp address + } +} +void __declspec(naked)SelectCharacter_Hook1() { + static int address = 0x10F7B4B; + _asm + { + imul eax, eax, 0x7a + xor edx, edx + add eax, 0xA1 + pushad + pushfd + } + _asm { + popfd + popad + jmp address + } +} +void __declspec(naked)SelectCharacter_Hook2() { + static int address = 0x10F7F91; + _asm + { + imul ecx, ecx, 0x7a + add ecx, 0xA1 + xor edx, edx + pushad + pushfd + } + _asm { + popfd + popad + jmp address + } +} +void __declspec(naked)SelectCharacter_Hook3() { + static int address = 0x10F8319; + _asm + { + imul edx, edx, 0x7a + xor eax, eax + add edx, 0xA1 + pushad + pushfd + } + _asm { + popfd + popad + jmp address + } +} +void __declspec(naked)SelectCharacter_Hook4() { + static int address = 0x10F843E; + _asm + { + imul eax, eax, 0x7a + xor ecx, ecx + add eax, 0xA1 + pushad + pushfd + } + _asm { + popfd + popad + jmp address + } +} +void __declspec(naked)SelectCharacter_Hook5() { + static int address = 0x10F85F2; + _asm + { + imul eax, eax, 0x7a + xor ecx, ecx + add eax, 0xA1 + pushad + pushfd + } + _asm { + popfd + popad + jmp address + } +} +void __declspec(naked)SelectCharacter_Hook6() { + static int address = 0x10F2C74; + _asm + { + imul eax, eax, 0x7a + add eax, 0xA1 + pushad + pushfd + } + _asm { + popfd + popad + jmp address + } +} +void __declspec(naked)SelectCharacter_Hook7() { + static int address = 0x10F3480; + _asm + { + imul eax, eax, 0x7a + xor edx, edx + add eax, 0xA1 + pushad + pushfd + } + _asm { + popfd + popad + jmp address + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//窗口打开事件Hook +typedef void(__fastcall _OpenWindow)(DWORD thisc, DWORD Seat, DWORD a1, char* a2, DWORD a3); +static _OpenWindow* OldOpenWindow; +void __fastcall NewOpenWindow(DWORD thisc, DWORD Seat, DWORD a1, char* a2, DWORD a3) { + if (*(DWORD*)0x1A5FB20 == thisc) { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"L_OpenOldWindowCallBack", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, a1); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + } + OldOpenWindow(thisc, 0, a1, a2, a3); +} + +//鼠标事件 +typedef void(_11BDC90)(int a1, unsigned int a2, int a3); +static _11BDC90* Old11BDC90; +void New11BDC90(int a1, unsigned int a2, int a3) { + if (InitGameFlag) { + int X = *(int*)0x1B4686C; + int Y = *(int*)0x1B46870; + if ((X | Y) >= 0) { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"L_MouseCallBack", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, a1); + Sq_pushinteger(v, a2); + Sq_pushinteger(v, X); + Sq_pushinteger(v, Y); + Sq_call(v, 5, SQFalse, SQTrue); + } + Sq_settop(v, Top); + } + } + Old11BDC90(a1, a2, a3); + return; +} + +//N键大地图 +typedef int(_fastcall _1030C30)(int a1, int a2, BYTE* a3); +static _1030C30* Old1030C30; +int _fastcall New1030C30(int a1, int a2, BYTE* a3) +{ + int ret = Old1030C30(a1, a2, a3); + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_DrawMiniMapUI", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, 111); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + return ret; +} + +//官方的组合NutHook +typedef int(_fastcall _674030)(wchar_t* thisc, DWORD Seat, wchar_t* a2, int a3); +static _674030* Old674030; +int _fastcall New674030(wchar_t* thisc, DWORD Seat, wchar_t* a2, int a3) +{ + int ret = Old674030(thisc, Seat, a2, a3); + return ret; +} + + +//他人信息Hook +typedef int(_fastcall _FA42D0)(int a1, int seat, int a2, int a3); +static _FA42D0* OldFA42D0; +int _fastcall NewFA42D0(int a1, int seat, int a2, int a3) +{ + //OtherPlayerInfoType = a2 + 1; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + SQBool Flag; + Sq_pushroottable(v); + Sq_pushstring(v, L"L_Other_Character_Info_Window", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, *(int*)(a1 + 0xc)); + Sq_call(v, 2, SQTrue, SQTrue); + Sq_getbool(v, -1, &Flag); + } + Sq_settop(v, Top); + + if (!Flag)return OldFA42D0(a1, seat, a2, a3); + return 0; +} + + + +//DrawMain HOOK +typedef DWORD(_fastcall _4C61F0)(DWORD thisc, DWORD Seat); +static _4C61F0* Old4C61F0; +DWORD _fastcall New4C61F0(DWORD thisc, DWORD Seat) +{ + DWORD Ret = Old4C61F0(thisc, Seat); + if (BaseData.size() > 0 && jiaoben == true && InitGameFlag) { + Suxn(); + } + static bool mouseInit = false; + + //进入角色调用 + if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+", 0) == 0) { + if (!InitGameFlag) + { + InitGameFlag = true; + } + } + if (InitGameFlag) { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + //std::cout << "A: " << Sq_gettop(v) << std::endl; + //Old1359130(v, *(int*)((char*)0x19E364 + (4 * 5)), *(int*)((char*)0x19E364 + (4 * 6))); + //Old1359130(v, *(int*)((char*)0x19E364 + (4 * 2)), *(int*)((char*)0x19E364 + (4 * 3))); + //std::cout << "Q: " << Sq_gettop(v) << std::endl; + Sq_pushroottable(v); + Sq_pushstring(v, L"L_DrawWindow_A", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_call(v, 1, SQFalse, SQTrue); + } + Sq_settop(v, Top); + + Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"L_drawMainCustomUI_All", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_call(v, 1, SQFalse, SQTrue); + } + Sq_settop(v, Top); + //std::cout << "H: " << Sq_gettop(v) << std::endl; + } + return Ret; +} + + +//伤害字体 HOOK +typedef DWORD(_cdecl _7EEED0)(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6); +static _7EEED0* Old7EEED0; +DWORD _cdecl New7EEED0(DWORD a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6) +{ + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + SQBool Flag; + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_PushDamageFontData", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, a1); + Sq_pushinteger(v, a2); + Sq_pushinteger(v, a3); + Sq_pushinteger(v, a4); + Sq_pushinteger(v, a5); + Sq_pushinteger(v, a6); + Sq_pushinteger(v, Damage_HookAsm.EDI); + Sq_pushinteger(v, Damage_HookAsm.EBX); + Sq_call(v, 9, SQTrue, SQTrue); + Sq_getbool(v, -1, &Flag); + } + Sq_settop(v, Top); + if (Flag) { + return Old7EEED0(a1, a2, a3, a4, a5, a6); + } + return 0; +} + + + +//注册收包 +typedef void(__fastcall* init_pack_handler_t)(void* Ecx); +static init_pack_handler_t Lpfn_Init = nullptr; +typedef void(__cdecl* pack_handler_t)(int idx, int err, void*, void*); +typedef void(__cdecl* register_pack_handler_t)(int idx, pack_handler_t handler, int zero); +typedef bool(__cdecl* _Net_Get_Dword)(DWORD*); +static _Net_Get_Dword Net_Get_Dword = reinterpret_cast<_Net_Get_Dword>(0x011AEA60); +typedef bool(__cdecl* _Net_Get_Buffer)(char*, int); +static _Net_Get_Buffer Net_Get_Buffer = reinterpret_cast<_Net_Get_Buffer>(0x011AEA90); +//130号收包 +void Pack_Control(int idx, int code, void* p3, void* p4) +{ + if (InitGameFlag) + { + DWORD Size; + Net_Get_Dword(&Size); + char* Buffer = new char[Size + 1]; + Net_Get_Buffer(Buffer, Size); + Buffer[Size] = '\0'; + + wchar_t* ss = DNFTOOL::charTowchar_t(Buffer); + + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); +#ifdef SELL + Sq_pushstring(v, L"Sq_Pack_Control", -1); +#else + Sq_pushstring(v, L"Sq_Pack_ControlLocal", -1); +#endif // SELL + + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushstring(v, ss, -1); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + delete[]ss; + } +} +void H_Register_Pack(void* Ecx) +{ + Lpfn_Init(Ecx); + auto Registerfunc = reinterpret_cast(0x7186D0); + + Registerfunc(130, Pack_Control, 0); +} + + + + + +//HookNut函数注册 +typedef void(__cdecl _Register_Nut)(); +static _Register_Nut* Register_Nut_Old; +void __cdecl H_Register_Nut() +{ + Register_Nut_Old(); + static bool Init = false; + if (!Init) { + Init = true; + R_Register_Nut(); + std::string BaseFile = "YosinBaseC"; + std::string Base = R"( +Lenheart_P_Update <- true; +function Sq_L_Medal (x,y) {} +function Sq_SettingWindowCallBack (x,y) {} +function Sq_BuffSwitchingCallBack (x,y) {} +function Sq_SwitchingCallBack (x,y) {} +function Sq_UpgradeCallBack (x,y) {} +function Sq_RecoveryCallBack (x,y) {} +function Sq_RecoveryTypeSetCallBack (Type) {} +function Sq_DrawMainMaxLayerCustomUI (pack) {} +function Lenheart (VmTop) {} +function Sq_MouseEventCallBack (Lb, Rb, Mb) {} +function Sq_SelectCharacter (Chunk) {} +function Sq_DrawMainTopLayerCustomUI (pack) {} +function Sq_GetExeStr_Event (StrIndex) {return StrIndex;} +function Sq_CreatChr (chunk) {} +function Sq_SendPackType_Event (Type) {} +function Sq_SendPackByte_Event (Parm) {} +function Sq_SendPackWord_Event (Parm) {} +function Sq_SendPackDWord_Event (Parm) {} +function Sq_SendPackChar_Event (Parm) {} +function Sq_SendPack_Event () {} +function Sq_DrawItemBack (Xpos, Ypos, Image) {} +function Sq_DrawItemFront (Xpos, Ypos, Image) {} +function Sq_GetDrawMonBloodSw () {return false;} +function Sq_DrawMonsterBlood (Object, X, Y) {} +function Sq_Set_Inventory_M_Pos (This) {} +function Sq_Get_Ex_IntData (SkillAddress, Idx, objAddress) {return 0;} +function Sq_Get_Ex_SkillCoolTime (SkillAddress, Idx, objAddress) {return 0;} +function Sq_Get_Ex_LevelData (SkillAddress, Idx, objAddress) {return 0;} +function Sq_PlayerEachPos (x, y) {} +function Sq_DrawMainMaxLayerCustomUI (pack) {} +function Sq_PushDamageFontData (ObjAddress, X, Y, Z, Value, Type,A8,A9) { return true;} +function Sq_PushDamageData(ObjAddress, MySelfAddress, Value); +function Sq_Pack_Control (chunk) {} +function Sq_MessageWindowDraw (a,c) {} +function Sq_Get_Event_Pos_X () {return 1;} +function Sq_Get_Event_Pos_Y () {return 1;} +function Sq_L_OtherPlayerInfo (x, y, Type, Value, ImgBuf) {local str = Value.tostring(); local lenght = L_sq_GetStringDrawLength(str); L_sq_DrawImg(ImgBuf, x + 70 - lenght, y + 5); return Value;} +function Sq_DrawMiniMapUI (a) {} +function Sq_CompleteTask(a1,a2,a3){} +function L_drawMainCustomUI_All(){} +function L_MouseCallBack(a, b, c,d) {} +function L_DrawWindow_A() {} +function L_DrawWindow_B() {} +function L_OpenOldWindowCallBack(WindowIndex) {} +function L_Old_Window_Get(WindowObject) {} +function L_Character_Info_Window(WindowObject) { return false;} +function L_Other_Character_Info_Window(WindowObject) {return false;} +function L_Old_Window_Visible(WindowObject,Flag) {} + + +getroottable().LenheartBaseFuncTab <- {}; +getroottable().LenheartFuncTab <- {}; +getroottable().Rindro_Scr_Width <- L_sq_RA(0x4D848E); +getroottable().Rindro_Scr_High <- L_sq_RA(0x4D8495); +)"; + //是否为本地 + FILE* file = fopen("sqr/DofileList.nut", "rb"); + if (file) + { + Base += "RINDROLOCAL <- true"; + fclose(file); + } + else { + Base += "RINDROLOCAL <- false"; + } + + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + + wchar_t* filename = DNFTOOL::charTowchar_t((char*)BaseFile.c_str()); + wchar_t* str = DNFTOOL::charTowchar_t((char*)Base.c_str()); + + if (sq_mycompilebuffer(v, str, wcslen(str), filename, false) >= 0) { + Sq_pushroottable(v); + Sq_call(v, 1, SQTrue, SQFalse); + Sq_pop(v, 1); + } + + delete[]filename; + delete[]str; + +#ifndef SELL//本地模式要加在整体脚本 + Sq_pushroottable(v); + Sq_pushstring(v, L"dofile", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushstring(v, L"sqr/DofileList.nut", -1); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_pop(v, 2); +#endif // !SELL + } +} + + +//HOOK绘制字体 +typedef void(__fastcall* DrawCode)(DWORD thisc, int Seat, int a3, int a4, int a5, int a6); +static DrawCode DrawCodeF; +typedef int(_fastcall _DrawOtherPlayer_Img)(int thisc, void*, int X, int Y, int Img); +static _DrawOtherPlayer_Img* DrawOtherPlayer_Img = (_DrawOtherPlayer_Img*)0x11A8F60; +void _fastcall H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, int a5, int a6) +{ + + + wchar_t* strbuffer = (wchar_t*)a6; + if (strbuffer == NULL)return; + + wchar_t* clone = new wchar_t[wcslen(strbuffer) + 2]; + wcscpy(clone, strbuffer); + + std::string GameStr; + DNFTOOL::Wchar_tToString(GameStr, clone); + delete[]clone; + + + //if (GameStr.find("1/") != std::string::npos) { + // std::cout << GameStr << std::endl; + //} + + return DrawCodeF(thisc, Seat, a3, a4, a5, a6); +} + + + +//HOOK Item颜色 +extern std::map< int, int>ItemColorMap; +typedef DWORD(_cdecl _OldHookEquNameColor)(int rarity); +static _OldHookEquNameColor* OldHookEquNameColor; +DWORD _cdecl HookEquNameColor(int rarity) +{ + DWORD OldColor = OldHookEquNameColor(rarity); + switch (rarity) + { + case 6: + return 0xFF0055FF; + case 7: + return 0xFF9314FF; + case 8: + return 0xFF1CBC0C; + case 9: + return 0xFFACFF08; + } + return OldColor; +} +typedef DWORD(_fastcall _OldHookItemColor)(DWORD thisc, DWORD Seat); +static _OldHookItemColor* OldHookItemColor; +DWORD _fastcall HookItemColor(DWORD thisc, DWORD Seat) +{ + int ItemCode = *(int*)(thisc + 0x1C); + if (ItemColorMap.count(ItemCode) == 1) + { + return ItemColorMap[ItemCode]; + } + + //不在注册项目颜色map里就执行原颜色获取 + int Rarity = *(int*)(thisc + 0xF4); + int color = HookEquNameColor(Rarity); + + return color; +} + + + + + + +//Hook发包相关 +static SendPacksType _OldSendPackType; +int __fastcall NewSendPacksType(DWORD thisc, int Seat, int Parm) +{ + if (InitGameFlag) + { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_SendPackType_Event", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, Parm); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + return _OldSendPackType(thisc, 0, Parm); + } + return _OldSendPackType(thisc, 0, Parm); +} +static SendPacksByte _OldSendPackByte; +int __fastcall NewSendPacksByte(DWORD thisc, int Seat, int Parm) +{ + if (InitGameFlag) + { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_SendPackByte_Event", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, Parm); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + } + return _OldSendPackByte(thisc, 0, Parm); +} +static SendPacksWORD _OldSendPackWord; +int __fastcall NewSendPacksWord(DWORD thisc, int Seat, int Parm) +{ + if (InitGameFlag) + { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_SendPackWord_Event", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, Parm); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + } + return _OldSendPackWord(thisc, 0, Parm); +} +static SendPacksDWORD _OldSendPackDWord; +int __fastcall NewSendPacksDWord(DWORD thisc, int Seat, int Parm) +{ + if (InitGameFlag) + { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_SendPackDWord_Event", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, Parm); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + } + return _OldSendPackDWord(thisc, 0, Parm); +} +static SendPacksChar _OldSendPackChar; +int __fastcall NewSendPacksChar(DWORD thisc, int Seat, char* Parm, int Size) +{ + if (InitGameFlag) + { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_SendPackChar_Event", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushstring(v, (SQChar*)Parm, Size); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + } + return _OldSendPackChar(thisc, 0, Parm, Size); +} +static SendPacks* _OldSend; +int NewSend() +{ + if (InitGameFlag) + { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_SendPack_Event", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_call(v, 1, SQFalse, SQTrue); + } + Sq_settop(v, Top); + } + return _OldSend(); +} + + + + + +//Exe索引字符串函数Hook +typedef int(_cdecl _sub1220590)(int a1); +static _sub1220590* sub1220590 = (_sub1220590*)0x1220590; +int _cdecl Newsub1220590(int a1) +{ + if (InitGameFlag) + { + SQInteger StrIndex = a1; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_GetExeStr_Event", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, a1); + Sq_call(v, 2, SQTrue, SQTrue); + Sq_getinteger(v, -1, &StrIndex); + } + Sq_settop(v, Top); + return sub1220590(StrIndex); + } + return sub1220590(a1); +} + + +//绘制Item_图标 +typedef int(_fastcall _sub11A8F60)(DWORD a1, DWORD Seat, int a2, int a3, int a4); +static _sub11A8F60* sub11A8F60; +int _fastcall newsub11A8F60(DWORD a1, DWORD Seat, int a2, int a3, int a4) +{ + if (InitGameFlag) + { + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_DrawItemBack", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, a2); + Sq_pushinteger(v, a3); + Sq_pushinteger(v, a4); + Sq_call(v, 4, SQFalse, SQTrue); + } + Sq_settop(v, Top); + + int ret = sub11A8F60(a1, 0, a2, a3, a4); + + Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_DrawItemFront", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, a2); + Sq_pushinteger(v, a3); + Sq_pushinteger(v, a4); + Sq_call(v, 4, SQFalse, SQTrue); + } + Sq_settop(v, Top); + + return ret; + } + + return sub11A8F60(a1, 0, a2, a3, a4); +} + +//活动图标 +typedef DWORD** (_fastcall _Event)(DWORD thisc, DWORD Seat, DWORD a2, DWORD** a3, char a4); +static _Event* OldEvent; +DWORD** _fastcall NewEvent(DWORD thisc, DWORD Seat, DWORD a2, DWORD** a3, char a4) +{ + if ((int)a4 == 1 && (int)a3 == 96527 /*&& a2 <= 536 && ((a2 - 456)%20 == 0)*/)//事先修改了活动图标的Y轴 在进行HOOK以便修改 + { + int X, Y; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_Get_Event_Pos_X", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_call(v, 1, SQTrue, SQTrue); + Sq_getinteger(v, -1, &X); + } + Sq_settop(v, Top); + + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_Get_Event_Pos_Y", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_call(v, 1, SQTrue, SQTrue); + Sq_getinteger(v, -1, &Y); + } + Sq_settop(v, Top); + + a2 += X; + a3 = (DWORD**)Y; + } + return OldEvent(thisc, Seat, a2, a3, a4); +} + +//选择频道 +typedef void(_fastcall _10F2700)(DWORD thisc, DWORD Seat, int a2); +static _10F2700* Old10F2700; +void _fastcall New10F2700(DWORD thisc, DWORD Seat, int a2) +{ + + Old10F2700(thisc, Seat, a2); + + static bool Flag = false; + if (!Flag && thisc) { + for (size_t i = 0; i < 29; i++) + { + int addr = *(int*)(thisc + (0x4 * i) + 0x1c); + int value = *(int*)(addr + 0x14); + *(int*)(addr + 0x14) = value + 133; + } + Flag = true; + } + + + + return; +} +//选择服务器 +typedef void (_fastcall _FC9440)(DWORD thisc, DWORD Seat,int a2); +static _FC9440* OldFC9440; +void _fastcall NewFC9440(DWORD thisc, DWORD Seat,int a2) +{ + OldFC9440(thisc, Seat, a2); + + //游戏开始按钮 + *(int*)((*(int*)(thisc + 0x1c0)) + 0x14) = 470; + + return; +} +//选择角色 +typedef void(_fastcall _10F7660)(DWORD thisc, DWORD Seat,int a3); +static _10F7660* Old10F7660; +void _fastcall New10F7660(DWORD thisc, DWORD Seat, int a3) +{ + Old10F7660(thisc, Seat, a3); + + static bool Flag = false; + if (!Flag && thisc) { + //其他按钮 + for (size_t i = 0; i < 5; i++) + { + int addr = *(int*)(thisc + (0x4 * i) + 0x70); + int value = *(int*)(addr + 0x14); + *(int*)(addr + 0x14) = value + 133; + } + + //选择频道按钮 + { + int addr = *(int*)(thisc + 0x15c); + int value = *(int*)(addr + 0x14); + *(int*)(addr + 0x14) = value + 133; + } + + //滚轮进度条 + for (size_t i = 0; i < 8; i++) + { + int addr = *(int*)(thisc + (0x4 * i) + 0xA0); + int value = *(int*)(addr + 0x14); + *(int*)(addr + 0x14) = value + 133; + } + + //滚轮上下按钮 + for (size_t i = 0; i < 2; i++) + { + int addr = *(int*)(thisc + (0x4 * i) + 0x16c); + int value = *(int*)(addr + 0x14); + *(int*)(addr + 0x14) = value + 133; + } + + //冒险团描述和进度 按钮 + { + int addr = *(int*)(thisc + 0x34c); + int value = *(int*)(addr + 0x14); + *(int*)(addr + 0x14) = value + 133; + + addr = *(int*)(addr + 0x2c0); + value = *(int*)(addr + 0x14); + *(int*)(addr + 0x14) = value + 133; + } + Flag = true; + } + + return ; +} + +//HOOK PushString +typedef uint32_t(__cdecl* LSqPushStringFunc)(uint32_t v, const wchar_t* s, uint32_t l); +LSqPushStringFunc LrealSqPushString; +uint32_t __cdecl LMySqPushString(uint32_t v, const wchar_t* s, uint32_t l) +{ + //获取技能攻击力 + if (!wcscmp(s, L"getCurrentModuleDamageRate")) { + return LrealSqPushString(v, L"L_getCurrentModuleDamageRate", l); + } + return LrealSqPushString(v, s, l); +} + + + +//GetIntData +typedef DWORD(_fastcall _908510)(DWORD thisc, DWORD Seat, DWORD a2, int a3); +static _908510* Old908510; +DWORD _fastcall New908510(DWORD thisc, DWORD Seat, DWORD a2, int a3) +{ + if (a3 != *(int*)0x1AB7CDC)return Old908510(thisc, Seat, a2, a3); + + SQInteger NutAddValue = 0; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, thisc); + Sq_pushinteger(v, a2); + Sq_pushinteger(v, a3); + Sq_call(v, 4, SQTrue, SQTrue); + Sq_getinteger(v, -1, &NutAddValue); + } + Sq_settop(v, Top); + return NutAddValue + Old908510(thisc, Seat, a2, a3); +} +//读取冷却 +typedef DWORD(_fastcall _909020)(DWORD thisc, DWORD Seat, DWORD a2, int a3); +static _908510* Old909020; +DWORD _fastcall New909020(DWORD thisc, DWORD Seat, DWORD a2, int a3) +{ + if (a3 != *(int*)0x1AB7CDC)return Old909020(thisc, Seat, a2, a3); + SQInteger NutAddValue = 0; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, thisc); + Sq_pushinteger(v, a2); + Sq_pushinteger(v, a3); + Sq_call(v, 4, SQTrue, SQTrue); + Sq_getinteger(v, -1, &NutAddValue); + } + Sq_settop(v, Top); + return NutAddValue + Old909020(thisc, Seat, a2, a3); +} + +//原生角色Get +typedef DWORD(_fastcall _90A4A0)(DWORD thisc, DWORD Seat, DWORD a2, int a3); +static _90A4A0* Old90A4A0; +DWORD _fastcall New90A4A0(DWORD thisc, DWORD Seat, DWORD a2, int a3) { + if (!InitGameFlag)return Old90A4A0(thisc, Seat, a2, a3); + if (a3 != *(int*)0x1AB7CDC)return Old90A4A0(thisc, Seat, a2, a3); + + SQInteger NutAddValue = 0; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_Get_Ex_IntData", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, thisc); + Sq_pushinteger(v, a2); + Sq_pushinteger(v, a3); + Sq_call(v, 4, SQTrue, SQTrue); + Sq_getinteger(v, -1, &NutAddValue); + } + Sq_settop(v, Top); + int ret = NutAddValue + Old90A4A0(thisc, Seat, a2, a3); + return ret; +} +//获取技能对象 +typedef int __fastcall sub_TTTTTT(int a1, int a2, int a3); +static sub_TTTTTT* TFuncsub_GetSkillAddress = (sub_TTTTTT*)0x8406C0; +//Nut角色Get1 +typedef DWORD(_fastcall _BA89D0)(DWORD thisc, DWORD Seat, DWORD a2, DWORD a3, DWORD a4); +static _BA89D0* OldBA89D0; +DWORD _fastcall NewBA89D0(DWORD thisc, DWORD Seat, DWORD a2, DWORD a3, DWORD a4) { + if (!InitGameFlag)return OldBA89D0(thisc, Seat, a2, a3, a4); + if (a3 != *(int*)0x1AB7CDC)return OldBA89D0(thisc, Seat, a2, a3, a4); + DWORD ADDRESS = TFuncsub_GetSkillAddress(thisc, 0, a3); + + SQInteger NutAddValue = 0; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, ADDRESS); + Sq_pushinteger(v, a2); + Sq_pushinteger(v, thisc); + Sq_call(v, 4, SQTrue, SQTrue); + Sq_getinteger(v, -1, &NutAddValue); + } + Sq_settop(v, Top); + int ret = NutAddValue + OldBA89D0(thisc, Seat, a2, a3, a4); + return ret; +} +//Nut角色Get2 +typedef DWORD(_5A40E0)(DWORD a1, DWORD a2, DWORD a3, DWORD a4); +static _5A40E0* Old5A40E0; +DWORD New5A40E0(DWORD a1, DWORD a2, DWORD a3, DWORD a4) { + if (!InitGameFlag)return Old5A40E0(a1, a2, a3, a4); + if (a3 != *(int*)0x1AB7CDC)return Old5A40E0(a1, a2, a3, a4); + + DWORD ADDRESS = TFuncsub_GetSkillAddress(a1, 0, a2); + + SQInteger NutAddValue = 0; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, ADDRESS); + Sq_pushinteger(v, a3); + Sq_pushinteger(v, a1); + Sq_call(v, 4, SQTrue, SQTrue); + Sq_getinteger(v, -1, &NutAddValue); + } + Sq_settop(v, Top); + int ret = NutAddValue + Old5A40E0(a1, a2, a3, a4); + return ret; +} +//描述对象HOOK +typedef struct LevelDataBuffer +{ + DWORD SkillAddresss; + DWORD SkillIdx; + DWORD ObjectAddress; + +} RELevelDataBufferG; +LevelDataBuffer _LevelDataBuffer = { 0 }; +typedef DWORD(_75D1F0)(DWORD thisc); +static _75D1F0* Old75D1F0; +DWORD New75D1F0(DWORD thisc) { + if (!InitGameFlag)return Old75D1F0(thisc); + if (_LevelDataBuffer.ObjectAddress != *(int*)0x1AB7CDC)return Old75D1F0(thisc); + + SQInteger NutAddValue = 0; + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"Sq_Get_Ex_LevelData", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, _LevelDataBuffer.SkillAddresss); + Sq_pushinteger(v, _LevelDataBuffer.SkillIdx); + Sq_pushinteger(v, _LevelDataBuffer.ObjectAddress); + Sq_call(v, 4, SQTrue, SQTrue); + Sq_getinteger(v, -1, &NutAddValue); + } + Sq_settop(v, Top); + + if (NutAddValue != 0) { + int ret = NutAddValue + Old75D1F0(thisc); + _LevelDataBuffer.SkillAddresss = 0; + _LevelDataBuffer.SkillIdx = 0; + _LevelDataBuffer.ObjectAddress = 0; + return ret; + } + return Old75D1F0(thisc); +} + + +typedef DWORD(__fastcall _44E620)(void* thisc,DWORD Seat); +static _44E620* Old44E620; +DWORD __fastcall New44E620(void* thisc, DWORD Seat) { + //*(int*)((char*)thisc + 0xC) = 256; + DWORD Ret = Old44E620(thisc, Seat); + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"L_Old_Window_Get", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, (int)thisc); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + + return Ret; +} + +typedef char(__fastcall _11B3B70)(void* thisc, DWORD Seat,char Flag); +static _11B3B70* Old11B3B70; +char __fastcall New11B3B70(void* thisc, DWORD Seat, char Flag) { + + char Ret = Old11B3B70(thisc, Seat, Flag); + + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + Sq_pushroottable(v); + Sq_pushstring(v, L"L_Old_Window_Visible", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, (int)thisc); + Sq_pushinteger(v, (int)Flag); + Sq_call(v, 3, SQFalse, SQTrue); + } + Sq_settop(v, Top); + + return Ret; +} + +typedef char(__fastcall _11D43A0)(void* thisc, DWORD Seat); +static _11D43A0* Old11D43A0; +char __fastcall New11D43A0(void* thisc, DWORD Seat) { + + //char Ret = Old11D43A0(thisc, Seat); + + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + SQBool Flag; + Sq_pushroottable(v); + Sq_pushstring(v, L"L_Character_Info_Window", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, (int)thisc); + Sq_call(v, 2, SQTrue, SQTrue); + Sq_getbool(v, -1, &Flag); + } + Sq_settop(v, Top); + + if(!Flag)return Old11D43A0(thisc, Seat); + return 0; +} + +typedef DWORD(__fastcall _7CDA30)(void* thisc, DWORD Seat, DWORD*a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6); +static _7CDA30* Old7CDA30; +DWORD __fastcall New7CDA30(void* thisc, DWORD Seat, DWORD* a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6) { + + DWORD Ret = Old7CDA30(thisc, Seat, a2, a3, a4, a5, a6); + + //std::cout << "相机坐标: " << *(int*)((int)thisc + 0x638) << std::endl; + + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + SQInteger Top = Sq_gettop(v); + SQBool Flag; + Sq_pushroottable(v); + Sq_pushstring(v, L"L_Sync_Camera_Pos", -1); + if (SQ_SUCCEEDED(Sq_get(v, -2))) { + Sq_pushroottable(v); + Sq_pushinteger(v, *(int*)((int)thisc + 0x638)); + Sq_call(v, 2, SQFalse, SQTrue); + } + Sq_settop(v, Top); + + return Ret; +} + + +typedef int(_fastcall _Get_Img)(int thisc, void*, int a2); +static _Get_Img* OldGet_Img; +int _fastcall NewGet_Img(int thisc, void*, int a2) { + + if (a2 == 76) { + std::cout << 12123123 << std::endl; + } + return OldGet_Img(thisc, 0, a2); +} + +typedef int(_fastcall _4294A0)(int thisc, void*,int a2); +static _4294A0* Old4294A0; +int _fastcall New4294A0(int thisc, void*,int a2) { + + return 0; + return Old4294A0(thisc, 0,a2); +} + + +void RegisterHook() { + + //InlineHook/// + + //玩家菜单选项HOOK 有回调 + inlinehook SSS(0x001004B52, (int)&PlayerEach2); + SSS.Motify_address(); + //修复滚轮 + //inlinehook MMM(0x011BDE05, (int)&MouseWheelUp); + //MMM.Motify_address(); + //窗口绘制HOOK + inlinehook WindowDrawHook(0x066BE9A, (int)&DrawWindow_B_Hook); + WindowDrawHook.Motify_address(); + //伤害HOOK + inlinehook DamageHook(0xE5A2DE, (int)&Damage_Hook); + DamageHook.Motify_address(); + + + + //Fundction Hook// + MH_Initialize(); + + + //关闭原版商城 + //MH_CreateHook((void*)0x4294A0, &New4294A0, reinterpret_cast(&Old4294A0)); + //MH_EnableHook((void*)0x4294A0); + + + //MH_CreateHook((void*)0x11AA190, &NewGet_Img, reinterpret_cast(&OldGet_Img)); + //MH_EnableHook((void*)0x11AA190); + + //镜头坐标HOOK + MH_CreateHook((void*)0x7CDA30, &New7CDA30, reinterpret_cast(&Old7CDA30)); + MH_EnableHook((void*)0x7CDA30); + + + //窗口遍历事件 + MH_CreateHook((void*)0x44E620, &New44E620, reinterpret_cast(&Old44E620)); + MH_EnableHook((void*)0x44E620); + + //窗口打开事件Hook 为了写UI框架 打开原生窗口将渲染队列切换为下层 + MH_CreateHook((void*)0xE6E070, &NewOpenWindow, reinterpret_cast(&OldOpenWindow)); + MH_EnableHook((void*)0xE6E070); + + //鼠标事件HOOK + MH_CreateHook((void*)0x11BDC90, &New11BDC90, reinterpret_cast(&Old11BDC90)); + MH_EnableHook((void*)0x11BDC90); + + //N键大地图 + MH_CreateHook((void*)0x1030C30, &New1030C30, reinterpret_cast(&Old1030C30)); + MH_EnableHook((void*)0x1030C30); + + //官方的组合NutHook + MH_CreateHook((void*)0x674030, &New674030, reinterpret_cast(&Old674030)); + MH_EnableHook((void*)0x674030); + + + + //DrawMain HOOK + MH_CreateHook((void*)0x4C61F0, &New4C61F0, reinterpret_cast(&Old4C61F0)); + MH_EnableHook((void*)0x4C61F0); + + //伤害字体 HOOK + MH_CreateHook((void*)0x7EEED0, &New7EEED0, reinterpret_cast(&Old7EEED0)); + MH_EnableHook((void*)0x7EEED0); + + //Hook收包 + MH_CreateHook((void*)0x721EA0, &H_Register_Pack, reinterpret_cast(&Lpfn_Init)); + MH_EnableHook((void*)0x721EA0); + + //HookNut函数注册 + MH_CreateHook((void*)0x67B910, &H_Register_Nut, reinterpret_cast(&Register_Nut_Old)); + MH_EnableHook((void*)0x67B910); + + //Hook绘制字符 + MH_CreateHook((void*)0x1206BD0, &H_Register_DrawCode, reinterpret_cast(&DrawCodeF)); + MH_EnableHook((void*)0x1206BD0); + + + //HOOK获取绘制颜色 + MH_CreateHook((void*)0x7AB080, &HookItemColor, reinterpret_cast(&OldHookItemColor)); + MH_EnableHook((void*)0x7AB080); + + //HOOK根据品级得到颜色 + MH_CreateHook((void*)0x7AAD00, &HookEquNameColor, reinterpret_cast(&OldHookEquNameColor)); + MH_EnableHook((void*)0x7AAD00); + + //Hook发包相关 + //HOOK发包类型 + //MH_CreateHook((void*)0x1127D60, &NewSendPacksType, reinterpret_cast(&_OldSendPackType)); + //MH_EnableHook((void*)0x1127D60); + //MH_CreateHook((void*)0x1128550, &NewSendPacksByte, reinterpret_cast(&_OldSendPackByte)); + //MH_EnableHook((void*)0x1128550); + //MH_CreateHook((void*)0x1128580, &NewSendPacksWord, reinterpret_cast(&_OldSendPackWord)); + //MH_EnableHook((void*)0x1128580); + //MH_CreateHook((void*)0x11285B0, &NewSendPacksDWord, reinterpret_cast(&_OldSendPackDWord)); + //MH_EnableHook((void*)0x11285B0); + //MH_CreateHook((void*)0x11285E0, &NewSendPacksChar, reinterpret_cast(&_OldSendPackChar)); + //MH_EnableHook((void*)0x11285E0); + MH_CreateHook((void*)0x1127EC0, &NewSend, reinterpret_cast(&_OldSend)); + MH_EnableHook((void*)0x1127EC0); + + //exe字符串索引 + MH_CreateHook((void*)0x1220590, &Newsub1220590, reinterpret_cast(&sub1220590)); + MH_EnableHook((void*)0x1220590); + + //绘制Item_图标 + MH_CreateHook((void*)0x11A8F60, &newsub11A8F60, reinterpret_cast(&sub11A8F60)); + MH_EnableHook((void*)0x11A8F60); + + //如果加载了百级UI + FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb"); + if (file) { + //BUFF图标 显示 + inlinehook BuffIconHook(0x04C8C14, (int)&BuffIcon_Hook); + BuffIconHook.Motify_address(); + //BUFF图标 文字标识 + inlinehook BuffIconHookB(0x04BF55E, (int)&BuffIcon_Hook_B); + BuffIconHookB.Motify_address(); + //血槽背景 + inlinehook HudBloodBackgroundHook(0x04CA035, (int)&HudBloodBackground); + HudBloodBackgroundHook.Motify_address(); + + //活动图标 + MH_CreateHook((void*)0x11B4030, &NewEvent, reinterpret_cast(&OldEvent)); + MH_EnableHook((void*)0x11B4030); + + //选择服务器 + //MH_CreateHook((void*)0xFC9440, &NewFC9440, reinterpret_cast(&OldFC9440)); + //MH_EnableHook((void*)0xFC9440); + //选择频道界面 + MH_CreateHook((void*)0x10F2700, &New10F2700, reinterpret_cast(&Old10F2700)); + MH_EnableHook((void*)0x10F2700); + //选择角色 + MH_CreateHook((void*)0x10F7660, &New10F7660, reinterpret_cast(&Old10F7660)); + MH_EnableHook((void*)0x10F7660); + inlinehook SelectCharacter(0x10F79C9, (int)&SelectCharacter_Hook); + SelectCharacter.Motify_address(); + inlinehook SelectCharacter1(0x10F7B43, (int)&SelectCharacter_Hook1); + SelectCharacter1.Motify_address(); + inlinehook SelectCharacter2(0x10F7F89, (int)&SelectCharacter_Hook2); + SelectCharacter2.Motify_address(); + inlinehook SelectCharacter3(0x10F8311, (int)&SelectCharacter_Hook3); + SelectCharacter3.Motify_address(); + inlinehook SelectCharacter4(0x10F8436, (int)&SelectCharacter_Hook4); + SelectCharacter4.Motify_address(); + inlinehook SelectCharacter5(0x10F85EA, (int)&SelectCharacter_Hook5); + SelectCharacter5.Motify_address(); + inlinehook SelectCharacter6(0x10F2C6E, (int)&SelectCharacter_Hook6); + SelectCharacter6.Motify_address(); + inlinehook SelectCharacter7(0x10F3478, (int)&SelectCharacter_Hook7); + SelectCharacter7.Motify_address(); + fclose(file); + } + + //HOOK PushString + MH_CreateHook((void*)0x1358A60, &LMySqPushString, reinterpret_cast(&LrealSqPushString)); + MH_EnableHook((void*)0x1358A60); + + //读取静态数据 + MH_CreateHook((void*)0x908510, &New908510, reinterpret_cast(&Old908510)); + MH_EnableHook((void*)0x908510); + //读取冷却 + MH_CreateHook((void*)0x909020, &New909020, reinterpret_cast(&Old909020)); + MH_EnableHook((void*)0x909020); + //读取动态数据 + MH_CreateHook((void*)0x090A4A0, &New90A4A0, reinterpret_cast(&Old90A4A0)); + MH_EnableHook((void*)0x090A4A0); + MH_CreateHook((void*)0x0BA89D0, &NewBA89D0, reinterpret_cast(&OldBA89D0)); + MH_EnableHook((void*)0x0BA89D0); + MH_CreateHook((void*)0x05A40E0, &New5A40E0, reinterpret_cast(&Old5A40E0)); + MH_EnableHook((void*)0x05A40E0); + //技能描述对象HOOK + MH_CreateHook((void*)0x075D1F0, &New75D1F0, reinterpret_cast(&Old75D1F0)); + MH_EnableHook((void*)0x075D1F0); + + //窗口设置显示与隐藏 + MH_CreateHook((void*)0x11B3B70, &New11B3B70, reinterpret_cast(&Old11B3B70)); + MH_EnableHook((void*)0x11B3B70); + //个人面板的属性信息遍历 + MH_CreateHook((void*)0x11D43A0, &New11D43A0, reinterpret_cast(&Old11D43A0)); + MH_EnableHook((void*)0x11D43A0); + + + //他人信息Hook 数值 + MH_CreateHook((void*)0xFA42D0, &NewFA42D0, reinterpret_cast(&OldFA42D0)); + MH_EnableHook((void*)0xFA42D0); + //他人信息Hook 图标 + //MH_CreateHook((void*)0xFA8230, &NewFA8230, reinterpret_cast(&OldFA8230)); + //MH_EnableHook((void*)0xFA8230); +} \ No newline at end of file diff --git a/Include/HookUi.hpp b/Include/HookUi.hpp new file mode 100644 index 0000000..a9b08a8 --- /dev/null +++ b/Include/HookUi.hpp @@ -0,0 +1,186 @@ +#pragma once +#include "DNFTOOL.hpp" +void HookHudUi() { + + + + ////角色和PK经验条 提示标识(删除) + DNFTOOL::WriteInt(0x004B85EF, -5000);//角色经验条Y + DNFTOOL::WriteInt(5007000, 0); //识别区域宽度 + BYTE M[] = { 0 }; + DNFTOOL::WriteByteArr(5007018, M, 1); //识别区域高度 + + //////lv 等级贴图 + //DNFTOOL::WriteInt(4953915, 1587); + //DNFTOOL::WriteInt(4953931, 1587); + //DNFTOOL::WriteInt(4953879, 44 + 170 + 172); + //////PK 等级贴图 + //DNFTOOL::WriteInt(4954030, 44 + 170 + 172); + //DNFTOOL::WriteInt(4954109, 44 + 170 + 172); + //DNFTOOL::WriteInt(4954079, 1587); + //DNFTOOL::WriteInt(4954006, 1587); + + + ////SP点坐标 + DNFTOOL::WriteInt(5022550, 707); + DNFTOOL::WriteInt(5022555, 590); + + ////SP点 提示标识 + DNFTOOL::WriteInt(5008949, 4294966586); //X轴 FFFFFD3A → lea ecx,[edi-000002C6] + DNFTOOL::WriteInt(5008960, 4294966711); //Y轴 FFFFFDB7 → lea edx,[esi-00000249] + BYTE H[] = { 0 }; + DNFTOOL::WriteByteArr(5008955, H, 1); //识别区域宽度 + BYTE I[] = { 0 }; + DNFTOOL::WriteByteArr(5008966, I, 1); //识别区域高度 + + + ////疲劳条(删除) + DNFTOOL::WriteInt(4962645, -5150); + + DNFTOOL::WriteInt(4962678, -5539 + 116); + DNFTOOL::WriteInt(4962768, -5539 + 116); + DNFTOOL::WriteInt(4962667, -5539 + 116); + DNFTOOL::WriteInt(4962582, -5539 + 116); + + DNFTOOL::WriteInt(4962763, -5591); + DNFTOOL::WriteInt(4962673, -5591); + DNFTOOL::WriteInt(4962577, -5591); + + DNFTOOL::WriteInt(5008389, -5413 + 305); //疲劳值文字标识 X轴 + DNFTOOL::WriteInt(5008384, -5550 + 41); //疲劳值文字标识 Y轴 + DNFTOOL::WriteInt(5008743, -5413 + 305); //疯狂阶段文字标识① X轴 + DNFTOOL::WriteInt(5008738, -5550 + 41); //疯狂阶段文字标识① Y轴 + DNFTOOL::WriteInt(5008868, -5413 + 305); //疯狂阶段文字标识② X轴 + DNFTOOL::WriteInt(5008863, -5550 + 41); //疯狂阶段文字标识② Y轴 + + BYTE N[] = { 0 }; + DNFTOOL::WriteByteArr(5008027, N, 1); //疲劳条识别区域宽度 + BYTE O[] = { 0 }; + DNFTOOL::WriteByteArr(5008045, O, 1); //疲劳条识别区域高度 + DNFTOOL::WriteInt(5008021, 4294966650); //疲劳条识别区域 X轴 FFFFFEAF → lea edx,[edi-00000151] + DNFTOOL::WriteInt(5008039, 4294966706); //疲劳条识别区域 Y轴 FFFFFDDD → lea eax,[esi-00000223] + + //////物品栏坐标 + //BYTE WPL[] = { 31 }; + //DNFTOOL::WriteByteArr(5037196, WPL, 1); + //DNFTOOL::WriteInt(5037103, 3); + //DNFTOOL::WriteInt(5037173, 569); + //DNFTOOL::WriteInt(5037202, 271); + + + //////扩展技能栏坐标 + //BYTE SPL[] = { 31 }; + //DNFTOOL::WriteByteArr(5037480, WPL, 1); + //DNFTOOL::WriteInt(5037374, 300); + //DNFTOOL::WriteInt(5037444, 534); + //DNFTOOL::WriteInt(5037486, 478); + + //BYTE buf[] = { 194, 12, 0 }; + //////干掉nut初始化基础技能栏坐标 + //DNFTOOL::WriteByteArr(4928048, buf, 3); + + //////基础技能栏坐标 + //BYTE SSPL[] = { 31 }; + //DNFTOOL::WriteByteArr(5037302, WPL, 1); + //DNFTOOL::WriteInt(5037209, 300); + //DNFTOOL::WriteInt(5037279, 565); + //DNFTOOL::WriteInt(5037308, 478); + + ////支援兵(删除) + DNFTOOL::WriteInt(7247082, 1679); + DNFTOOL::WriteInt(7247077, -5000); + + ////活动按钮图标 + BYTE J[] = { 114 }; + DNFTOOL::WriteByteArr(5105455, J, 1); + DNFTOOL::WriteInt(5105439, 96527); + + //////buff图标及提示文字坐标 + //BYTE K[] = { 0 }; + //DNFTOOL::WriteByteArr(5016598, K, 1); + //DNFTOOL::WriteInt(5016565, 96528); + //DNFTOOL::WriteByteArr(4978018, K, 1); + //DNFTOOL::WriteInt(4978010, 96528); + + ////被动技能栏 + DNFTOOL::WriteInt(5037996, 286); + DNFTOOL::WriteInt(5037991, 532); + + //城镇右上角小地图X + DNFTOOL::WriteInt(0x01032274, 1059); + //副本右上角小地图X + DNFTOOL::WriteInt(0x01031D6C, 1059); + DNFTOOL::WriteInt(0x0102D605, 1059); + DNFTOOL::WriteInt(0x01031CAE, 1063); + DNFTOOL::WriteInt(0x01031D21, 1066); + DNFTOOL::WriteInt(0x01031D37, 1066); + DNFTOOL::WriteInt(0x01031C9F, 1066); + + int offset = 250; + *(int*)0x008DEC6E = 348; //被伤害 字 Y轴 + *(int*)0x008DECF4 = 348; //被伤害 数 Y轴 + + //评分系统总体Y轴 + *(int*)0x008E3363 = -15; //有 志愿兵控件时 + *(int*)0x008E3389 = -15; //没 志愿兵控件时 + + *(int*)0x004B802B = 0x01010101;//从左到右每个字节分别是 伤害点数 技巧 操作 被击数(00关/01开) + + *(int*)0x008E3801 = 499; //被击数 总 Y轴 + *(int*)0x008E3821 = 748 + offset; //被击数 字 X轴 + *(int*)0x008E3876 = 728 + offset; //被击数 次 X轴 + *(int*)0x008E38A2 = 728 + offset; //被击数 数 X轴 + + *(int*)0x008E39F3 = 439; //操作 总 Y轴 + *(int*)0x008E3A13 = 756 + offset; //操作 总 X轴 + DNFTOOL::WriteInt(0x008E3A69, 744 + offset);// X 符号 + DNFTOOL::WriteInt(0x008E3A88, 743 + offset);//X 数字 + + *(int*)0x008E3BD1 = 439; //技巧 总 Y轴 + *(int*)0x008E3BE3 = 756 + offset;//技巧 总 X轴 + DNFTOOL::WriteInt(0x008E3C39, 744 + offset); + DNFTOOL::WriteInt(0x008E3C55, 743 + offset); + + *(int*)0x008E34D1 = 761 + offset; //评分 字 X轴 + *(int*)0x008E363C = 760 + offset; //评分 数 X轴 + *(int*)0x008E34BF = 479;//评分 字 Y轴 + *(int*)0x008E3663 = 479;//评分 数 Y轴 + + //打击效果评分系统坐标 + *(int*)0x008DE969 = 718 + offset; //技巧 字 X轴 + *(int*)0x008DE9D3 = 713 + offset; //技巧 字 X轴修正 + *(int*)0x008DE9F8 = 368; //技巧 字 Y轴 + *(int*)0x008DEA15 = 713 + offset; //技巧 数 X轴 + *(int*)0x008DEA66 = 367; //技巧 数 Y轴 + + *(int*)0x008DEAA9 = 718 + offset; //操作 字 X轴 + *(int*)0x008DEB13 = 713 + offset; //操作 字 X轴修正 + *(int*)0x008DEB38 = 388; //操作 字 Y轴 + *(int*)0x008DEB55 = 713 + offset; //操作 数 X轴 + *(int*)0x008DEBA6 = 389; //操作 数 Y轴 + + memcpy((void*)0x008E3675, "\xE9\x14\x01\x00\x00\x90", 6);//关闭 伤害点数 + + DNFTOOL::WriteInt(0x008E33D1, 498);//被击伤害率Y + DNFTOOL::WriteInt(0x008E33E3, 725 + offset);//被击伤害率X + DNFTOOL::WriteInt(0x008E3439, 707 + offset);//符号 + DNFTOOL::WriteInt(0x008E3473, 705 + offset);//数 + + //DNFTOOL::WriteInt(0x008E36E4, 558);//伤害点数Y + //DNFTOOL::WriteInt(0x008E3704, 726 + offset);//伤害点数X + + + DNFTOOL::WriteInt(0x00FC9662, 423);//频道界面版本号 + DNFTOOL::WriteInt(0x006F469C, 423);//进游戏界面版本号 + + + DNFTOOL::WriteInt(0x1004581, 1067);//NPC交互 + DNFTOOL::WriteInt(0x8EA429, 1067);//NPC交互 + + + DNFTOOL::WriteInt(0x6F45FB, 504);//载入界面转圈X轴 + //DNFTOOL::WriteInt(0x6F45F6, 1067);//载入界面转圈Y轴 + + + *(char*)(0x10F17FA) = 235;//跳选择服务器 +} \ No newline at end of file diff --git a/Include/MinHook.h b/Include/MinHook.h new file mode 100644 index 0000000..15c0a87 --- /dev/null +++ b/Include/MinHook.h @@ -0,0 +1,186 @@ +/* + * MinHook - The Minimalistic API Hooking Library for x64/x86 + * Copyright (C) 2009-2017 Tsuda Kageyu. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) + #error MinHook supports only x86 and x64 systems. +#endif + +#include + +// MinHook Error Codes. +typedef enum MH_STATUS +{ + // Unknown error. Should not be returned. + MH_UNKNOWN = -1, + + // Successful. + MH_OK = 0, + + // MinHook is already initialized. + MH_ERROR_ALREADY_INITIALIZED, + + // MinHook is not initialized yet, or already uninitialized. + MH_ERROR_NOT_INITIALIZED, + + // The hook for the specified target function is already created. + MH_ERROR_ALREADY_CREATED, + + // The hook for the specified target function is not created yet. + MH_ERROR_NOT_CREATED, + + // The hook for the specified target function is already enabled. + MH_ERROR_ENABLED, + + // The hook for the specified target function is not enabled yet, or already + // disabled. + MH_ERROR_DISABLED, + + // The specified pointer is invalid. It points the address of non-allocated + // and/or non-executable region. + MH_ERROR_NOT_EXECUTABLE, + + // The specified target function cannot be hooked. + MH_ERROR_UNSUPPORTED_FUNCTION, + + // Failed to allocate memory. + MH_ERROR_MEMORY_ALLOC, + + // Failed to change the memory protection. + MH_ERROR_MEMORY_PROTECT, + + // The specified module is not loaded. + MH_ERROR_MODULE_NOT_FOUND, + + // The specified function is not found. + MH_ERROR_FUNCTION_NOT_FOUND +} +MH_STATUS; + +// Can be passed as a parameter to MH_EnableHook, MH_DisableHook, +// MH_QueueEnableHook or MH_QueueDisableHook. +#define MH_ALL_HOOKS NULL + +#ifdef __cplusplus +extern "C" { +#endif + + // Initialize the MinHook library. You must call this function EXACTLY ONCE + // at the beginning of your program. + MH_STATUS WINAPI MH_Initialize(VOID); + + // Uninitialize the MinHook library. You must call this function EXACTLY + // ONCE at the end of your program. + MH_STATUS WINAPI MH_Uninitialize(VOID); + + // Creates a Hook for the specified target function, in disabled state. + // Parameters: + // pTarget [in] A pointer to the target function, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); + + // Creates a Hook for the specified API function, in disabled state. + // Parameters: + // pszModule [in] A pointer to the loaded module name which contains the + // target function. + // pszTarget [in] A pointer to the target function name, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHookApi( + LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); + + // Creates a Hook for the specified API function, in disabled state. + // Parameters: + // pszModule [in] A pointer to the loaded module name which contains the + // target function. + // pszTarget [in] A pointer to the target function name, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + // ppTarget [out] A pointer to the target function, which will be used + // with other functions. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHookApiEx( + LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); + + // Removes an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); + + // Enables an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // enabled in one go. + MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); + + // Disables an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // disabled in one go. + MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); + + // Queues to enable an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // queued to be enabled. + MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); + + // Queues to disable an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // queued to be disabled. + MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); + + // Applies all queued changes in one go. + MH_STATUS WINAPI MH_ApplyQueued(VOID); + + // Translates the MH_STATUS to its name as a string. + const char * WINAPI MH_StatusToString(MH_STATUS status); + +#ifdef __cplusplus +} +#endif + diff --git a/Include/RegisterSquirrel.hpp b/Include/RegisterSquirrel.hpp new file mode 100644 index 0000000..8b1c1b0 --- /dev/null +++ b/Include/RegisterSquirrel.hpp @@ -0,0 +1,3006 @@ +#pragma once +#include "squirrel.h" +#include "sqstdaux.h" +#include "sqstdblob.h" +#include "sqstdio.h" +#include "sqstdmath.h" +#include "sqstdstring.h" +#include "sqstdsystem.h" + +#include "DNFTOOL.hpp" + +#include "zlib.h" +#include +#include +#include +typedef struct SQVM* HSQUIRRELVM; +//注册 Nut API +// PushRoot +typedef int(SqPushRootFunc)(HSQUIRRELVM v); +static SqPushRootFunc* Sq_pushroottable = (SqPushRootFunc*)0x1358C50; +// // New槽 +typedef int(SqNewSlot)(HSQUIRRELVM v, int a, BOOL b); +static SqNewSlot* SQNewSlot = (SqNewSlot*)0x135AA80; +// 平栈 +typedef int(SqPopTop)(HSQUIRRELVM v); +static SqPopTop* SQPopTop = (SqPopTop*)0x1358FF0; +// Push 函数绑定闭包 +typedef int(realSqNewClosure)(HSQUIRRELVM v, void* funcAddr, int a); +static realSqNewClosure* RealSqNewClosure = (realSqNewClosure*)0x135B850; +//SQ_Call +typedef int (Sq_CallFunc)(HSQUIRRELVM v, int params, int retval, int raiseerror); +static Sq_CallFunc* Sq_call = (Sq_CallFunc*)0x1359280; +// 平栈 +typedef int(SqPop)(HSQUIRRELVM v, int n); +static SqPop* Sq_pop = (SqPop*)0x1358FD0; +// 设置栈 +typedef int(SqSetTop)(HSQUIRRELVM v, int n); +static SqSetTop* Sq_settop = (SqSetTop*)0x135AA40; +//SQ_Get +typedef int(Sq_Get)(HSQUIRRELVM v, int n); +static Sq_Get* Sq_get = (Sq_Get*)0x135AE30; +//GetTop +typedef int(SqGetTopFunc)(HSQUIRRELVM v); +static SqGetTopFunc* Sq_gettop = (SqGetTopFunc*)0x1358FC0; +//GetInt +typedef int(SqGetIntFunc)(HSQUIRRELVM v, int stackIndex, int* sint); +static SqGetIntFunc* Sq_getinteger = (SqGetIntFunc*)0x1358D70; +//GetString +typedef int(SqGetStringFunc)(HSQUIRRELVM v, uint32_t stackIndex, const SQChar** sstring); +static SqGetStringFunc* Sq_getstring = (SqGetStringFunc*)0x1358E70; +//GetFloat +typedef int(SqGetFloatFunc)(HSQUIRRELVM v, uint32_t stackIndex, FLOAT* sfloat); +static SqGetFloatFunc* Sq_getfloat = (SqGetFloatFunc*)0x1358DD0; +//GetBool +typedef int(SqGetBoolFunc)(HSQUIRRELVM v, uint32_t stackIndex, SQBool* sbool); +static SqGetBoolFunc* Sq_getbool = (SqGetBoolFunc*)0x1358E30; +//GetUserdata +typedef int(SqGetUserdataFunc)(HSQUIRRELVM v, uint32_t stackIndex, DWORD* up, DWORD* up1); +static SqGetUserdataFunc* Sq_getuserdata = (SqGetUserdataFunc*)0x1358EC0; +//GetObjtypetag +typedef int(SqGetObjtypetagFunc)(HSQUIRRELVM v, DWORD* up); +static SqGetObjtypetagFunc* Sq_getobjtypetag = (SqGetObjtypetagFunc*)0x1358F20; +//GetUserpointer +typedef int(SqGetUserpointerFunc)(HSQUIRRELVM v, uint32_t idx, DWORD* up); +static SqGetUserpointerFunc* Sq_getuserpointer = (SqGetUserpointerFunc*)0x1358F80; + + +//Push +typedef int(SqPushFunc)(HSQUIRRELVM v, int idx); +static SqPushFunc* Sq_push = (SqPushFunc*)0x1358C90; +//PushString +typedef int(SqPushStringFunc)(HSQUIRRELVM v, const SQChar* s, int len); +static SqPushStringFunc* Sq_pushstring = (SqPushStringFunc*)0x1358A60; +//PushInt +typedef int(SqPushIntFunc)(HSQUIRRELVM v, int sint); +static SqPushIntFunc* Sq_pushinteger = (SqPushIntFunc*)0x1358AD0; +//PushBool +typedef int(SqPushBoolFunc)(HSQUIRRELVM v, SQBool sbool); +static SqPushBoolFunc* Sq_pushbool = (SqPushBoolFunc*)0x1358B10; +//PushFloat +typedef int(SqPushFloatFunc)(HSQUIRRELVM v, FLOAT sfloat); +static SqPushFloatFunc* Sq_pushfloat = (SqPushFloatFunc*)0x1358B60; +//PushUserpointer +typedef int(SqPushUserpointerFunc)(HSQUIRRELVM v, void* sfloat); +static SqPushUserpointerFunc* Sq_pushuserpointer = (SqPushUserpointerFunc*)0x1358BA0; + +//特殊操作 +typedef DWORD(_1359130)(void* thisc, DWORD a2, DWORD a3); +static _1359130* Old1359130 = (_1359130*)0x1359130; + + +//键盘按键是否按下 +#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) + +//发包类型 地址 +typedef int(__fastcall* SendPacksType)(DWORD thisc, int Seat, int Parm); +static SendPacksType _SendpacksType = (SendPacksType)0x1127D60; + +//发包参数 BYTE +typedef int(__fastcall* SendPacksByte)(DWORD thisc, int Seat, int Parm); +static SendPacksByte _SendPacksByte = (SendPacksByte)0x1128550; + +//发包参数 WORD +typedef int(__fastcall* SendPacksWORD)(DWORD thisc, int Seat, int Parm); +static SendPacksWORD _SendPacksWord = (SendPacksWORD)0x1128580; + +//发包参数 DWORD +typedef int(__fastcall* SendPacksDWORD)(DWORD thisc, int Seat, int Parm); +static SendPacksDWORD _SendPacksDWord = (SendPacksDWORD)0x11285B0; + +//发包参数 char +typedef int(__fastcall* SendPacksChar)(DWORD thisc, int Seat, char* Parm, int Size); +static SendPacksChar _SendPacksChar = (SendPacksChar)0x11285E0; + +//发包函数 地址 +typedef DWORD SendPacks(); +static SendPacks* _SendPacks = (SendPacks*)0x1127EC0; + + + + + +std::map< int, int>ItemColorMap; +int RegisterItemColor_STL(HSQUIRRELVM v) +{ + int ItemID, Clolr; + int ParameterNum = Sq_gettop(v); + if (ParameterNum == 3) + { + Sq_getinteger(v, 2, &ItemID); + Sq_getinteger(v, 3, &Clolr); + ItemColorMap[ItemID] = Clolr; + } + return 0; +} + + + + + + + + + + + + + + + + + + + + + + + + +static SQInteger sq_GetLocalConfig(HSQUIRRELVM v) +{ + std::ifstream inFile; + inFile.open("Rindro_Config.cfg"); // 默认当方式打开文件 + //没有打开文件 + if (!inFile.is_open()) { + sq_pushnull(v); + return 1; + } + + std::stringstream buffer; + buffer << inFile.rdbuf(); + std::string Str = buffer.str(); + + char* uncode = (char*)Str.c_str(); + + //int skey[] = DFCSkey;//定义解密数组 + //Cutecode(uncode, skey);//解密 + char* ss = DNFTOOL::GBKTOUTF8(std::string(uncode)); + wchar_t* cfg = DNFTOOL::charTowchar_t(ss); + Sq_pushstring(v, cfg, -1); + delete[]cfg; + return 1; +} +static SQInteger sq_SetLocalConfig(HSQUIRRELVM v) +{ + const SQChar* valuebuf1; + Sq_getstring(v, 2, &valuebuf1); + char* OutPutText = DNFTOOL::SquirrelU2W(valuebuf1); + + std::ofstream outFile; + outFile.open("Rindro_Config.cfg", std::ios::trunc); // 默认当方式打开文件 + if (outFile.is_open()) { + outFile << OutPutText; + outFile.close(); + } + else { + std::cerr << "Unable to open file."; + } + + delete[]OutPutText; + return 0; +} + + +static SQInteger sq_LongLongOperation(HSQUIRRELVM v) +{ + const SQChar* valuebuf1; + Sq_getstring(v, 2, &valuebuf1); + char* OutPutText = DNFTOOL::SquirrelU2W(valuebuf1); + LONGLONG value1 = std::atoll(OutPutText); + delete[]OutPutText; + + const SQChar* valuebuf2; + Sq_getstring(v, 3, &valuebuf2); + char* OutPutText2 = DNFTOOL::SquirrelU2W(valuebuf2); + LONGLONG value2 = std::atoll(OutPutText2); + delete[]OutPutText2; + + const SQChar* TypeBuf; + Sq_getstring(v, 4, &TypeBuf); + char* TypecharBuf = DNFTOOL::SquirrelU2W(TypeBuf); + std::string Type(TypecharBuf); + delete[]TypecharBuf; + + std::string RetString = ""; + if (Type == "+") { + RetString = std::to_string(value1 + value2); + }else if(Type == "-") { + RetString = std::to_string(value1 - value2); + } + else if (Type == "*") { + RetString = std::to_string((static_cast(value1) * static_cast(value2))); + } + else if (Type == "/") { + RetString = std::to_string((static_cast(value1) / static_cast(value2))); + } + else if (Type == "%") { + RetString = std::to_string(value1 % value2); + } + else if (Type == "format") { + if (value1 < 1000) { + RetString = std::to_string(value1); + } + else if (value1 < 1000000) { + RetString = std::to_string(value1 / 1000.0) + "k"; + } + else if (value1 < 1000000000) { + RetString = std::to_string(value1 / 1000000.0) + "M"; + } + else if (value1 < 1000000000000LL) { + RetString = std::to_string(value1 / 1000000000.0) + "G"; + } + else { + RetString = std::to_string(value1 / 1000000000000.0) + "T"; + } + } + + + wchar_t* ss = DNFTOOL::charTowchar_t((char*)RetString.c_str()); + Sq_pushstring(v, ss, -1); + delete[]ss; + + return 1; +} + + + + + +//zlib解压 +std::string gzip_decompress(const std::string& compressed) { + z_stream zs; + memset(&zs, 0, sizeof(zs)); + + if (inflateInit2(&zs, 16 + MAX_WBITS) != Z_OK) { + //throw std::runtime_error("inflateInit failed"); + return "null"; + } + + zs.next_in = (Bytef*)compressed.data(); + zs.avail_in = compressed.size(); + + int ret; + char outbuffer[32768]; + std::string outstring; + + do { + zs.next_out = reinterpret_cast(outbuffer); + zs.avail_out = sizeof(outbuffer); + + ret = inflate(&zs, 0); + + if (outstring.size() < zs.total_out) { + outstring.append(outbuffer, zs.total_out - outstring.size()); + } + + } while (ret == Z_OK); + + inflateEnd(&zs); + + if (ret != Z_STREAM_END) { + //throw std::runtime_error("Exception during zlib decompression: (" + std::to_string(ret) + ") " + zs.msg); + return "null"; + } + + return outstring; +} +static SQInteger sq_Dezlib(HSQUIRRELVM v) +{ + const SQChar* Str; + Sq_getstring(v, 2, &Str); + char* OutPutText = DNFTOOL::SquirrelU2W(Str); + std::string RealStr = OutPutText; + delete[]OutPutText; + + LenheartBase::CBASE64 bb; + std::string StrBuf = bb.decode(RealStr); + StrBuf = gzip_decompress(StrBuf); + + wchar_t* ss = DNFTOOL::charTowchar_t((char*)StrBuf.c_str()); + Sq_pushstring(v, ss, -1); + delete[]ss; + + //std::cout << StrBuf << std::endl; + return 1; +} + + + +//绘制Img +typedef int(_fastcall _Load_Npk)(int thisc, void*, int a2, wchar_t* a3); +typedef int(_fastcall _Get_Img)(int thisc, void*, int a2); +typedef int(_fastcall _Draw_Img)(int thisc, void*, int X, int Y, int Img); +typedef int(_fastcall _Ex_Draw_Img)(DWORD thisc, DWORD Seat, int X, int Y, DWORD Img, int a5, int a6, int a7, int a8, float a9, float a10); +typedef int(_fastcall _Ex_Draw_Num)(DWORD thisc, DWORD Seat, int X, int Y, DWORD Value, DWORD RGBA, int a6); +typedef int(_fastcall _Ex_Draw_Init)(DWORD thisc, DWORD Seat, DWORD Value, DWORD RGBA, DWORD asadsd, DWORD asads3d); +typedef int(_cdecl _Get_Draw_This)(DWORD thisc); + +static _Load_Npk* Load_Npk = (_Load_Npk*)0x11C0410; +static _Get_Img* Get_Img = (_Get_Img*)0x11AA190; +static _Draw_Img* Draw_Img = (_Draw_Img*)0x11A8F60; +static _Ex_Draw_Img* Ex_Draw_Img = (_Ex_Draw_Img*)0x11A97E0; +static _Ex_Draw_Num* Ex_Draw_Num = (_Ex_Draw_Num*)0x11b2390; +static _Ex_Draw_Init* Ex_Draw_Init = (_Ex_Draw_Init*)0x11B22C0; +static _Get_Draw_This* Get_Draw_This = (_Get_Draw_This*)0x11A5990; + +static SQInteger sq_DrawImg(HSQUIRRELVM v) +{ + int Top = Sq_gettop(v); + if (Top == 4) { + int imgbuf; + Sq_getinteger(v, 2, &imgbuf); + int X; + Sq_getinteger(v, 3, &X); + int Y; + Sq_getinteger(v, 4, &Y); + Draw_Img(*(int*)0x1B45B94, 0, X, Y, imgbuf); + return 0; + } + if (Top == 5) + { + const SQChar* File; + Sq_getstring(v, 2, &File); + int Idx; + Sq_getinteger(v, 3, &Idx); + int X; + Sq_getinteger(v, 4, &X); + int Y; + Sq_getinteger(v, 5, &Y); + + + int npkbuf = Load_Npk(*(int*)0x1B4684C, 0, 0, (wchar_t*)File); + int imgbuf = Get_Img(npkbuf, 0, Idx); + Draw_Img(*(int*)0x1B45B94, 0, X, Y, imgbuf); + return 0; + } + else if (Top == 6) { + const SQChar* File; + Sq_getstring(v, 2, &File); + int Value; + Sq_getinteger(v, 3, &Value); + int X; + Sq_getinteger(v, 4, &X); + int Y; + Sq_getinteger(v, 5, &Y); + int rgba; + Sq_getinteger(v, 6, &rgba); + + int thisc = Get_Draw_This(56); + int npkbuf = Load_Npk(*(int*)0x1B4684C, 0, 0, (wchar_t*)File); + int intibuf = Ex_Draw_Init(thisc, 0, *(int*)0x1B45B94, npkbuf, X, Y);//偏移多少的数值 -1 == 0 所需偏移 - 1 + *(int*)0x1A70190 = intibuf; + Ex_Draw_Num(intibuf, 0, 100, 100, Value, rgba, 0); + + + } + else if (Top == 9 || Top == 10) { + const SQChar* File; + Sq_getstring(v, 2, &File); + int Idx; + Sq_getinteger(v, 3, &Idx); + int X; + Sq_getinteger(v, 4, &X); + int Y; + Sq_getinteger(v, 5, &Y); + int Model; + Sq_getinteger(v, 6, &Model); + int rgba; + Sq_getinteger(v, 7, &rgba); + + int Xf; + Sq_getfloat(v, 8, (FLOAT*)&Xf); + int Yf; + Sq_getfloat(v, 9, (FLOAT*)&Yf); + + int npkbuf = Load_Npk(*(int*)0x1B4684C, 0, 0, (wchar_t*)File); + int imgbuf = Get_Img(npkbuf, 0, Idx); + Ex_Draw_Img(*(int*)0x1B45B94, 0, X, Y, imgbuf, Xf, Yf, Model, rgba, 0, 0); + return 0; + } + return 0; +} +//设置渲染模式 +typedef int(_cdecl _SetDrawImgModel)(int a1, int a2); +static _SetDrawImgModel* SetDrawImgModel = (_SetDrawImgModel*)0x11A8A50; +//还原渲染模式 +typedef int(_cdecl _ReleaseDrawImgModel)(); +static _ReleaseDrawImgModel* ReleaseDrawImgModel = (_ReleaseDrawImgModel*)0x11A8B60; +static SQInteger sq_SetDrawImgModel(HSQUIRRELVM v) +{ + int M1; + Sq_getinteger(v, 2, &M1); + int M2; + Sq_getinteger(v, 3, &M2); + SetDrawImgModel(M1, M2); + return 0; +} +static SQInteger sq_ReleaseDrawImgModel(HSQUIRRELVM v) +{ + ReleaseDrawImgModel(); + return 0; +} + +//初始化数字绘制 +typedef struct DamageFontInfo +{ + int Type[8][10]; + +} DamageFontInfo; +static DamageFontInfo MyFont = { 0 }; +static SQInteger sq_IntiNumberDraw(HSQUIRRELVM v) +{ + const SQChar* File; + Sq_getstring(v, 2, &File); + int Idx; + Sq_getinteger(v, 3, &Idx); + int Type; + Sq_getinteger(v, 4, &Type); + + int npkbuf = Load_Npk(*(int*)0x1B4684C, 0, 0, (wchar_t*)File); + + for (size_t i = 0; i < 10; i++) + { + int imgbuf = Get_Img(npkbuf, 0, Idx + i); + MyFont.Type[Type][i] = imgbuf; + } + return 0; +} +//绘制数字 +static SQInteger sq_DrawNumber(HSQUIRRELVM v) +{ + int X; + Sq_getinteger(v, 2, &X); + int Y; + Sq_getinteger(v, 3, &Y); + int rgba; + Sq_getinteger(v, 4, &rgba); + int Xf; + Sq_getfloat(v, 5, (FLOAT*)&Xf); + int Yf; + Sq_getfloat(v, 6, (FLOAT*)&Yf); + int Type; + Sq_getinteger(v, 7, &Type); + int Interval; + Sq_getinteger(v, 8, &Interval); + int OneOffset; + Sq_getinteger(v, 9, &OneOffset); + int Number; + Sq_getinteger(v, 10, &Number); + std::string Value = std::to_string(Number); + for (size_t i = 0; i < Value.size(); i++) + { + int Idx = Value[i] - 48; + if (Idx == 1)Ex_Draw_Img(*(int*)0x1B45B94, 0, X + (i * Interval) + OneOffset, Y, MyFont.Type[Type][Idx], Xf, Yf, 0, rgba, 0, 0); + else Ex_Draw_Img(*(int*)0x1B45B94, 0, X + (i * Interval), Y, MyFont.Type[Type][Idx], Xf, Yf, 0, rgba, 0, 0); + } + return 0; +} +//绘制九宫格 +static SQInteger sq_DrawWindow(HSQUIRRELVM v) +{ + int Top = Sq_gettop(v); + int X; + Sq_getinteger(v, 2, &X); + int Y; + Sq_getinteger(v, 3, &Y); + int WindowWidth; + Sq_getinteger(v, 4, &WindowWidth); + int WindowHeight; + Sq_getinteger(v, 5, &WindowHeight); + + //路径 + wchar_t* File = L"interface/windowcommon.img"; + int StartIdx = 0; + + int leftWidth = 11;//最左边的拼接的宽度 + int centerWidth = 12;//中间部分拼接的宽度 + + int topHeight = 11;//最上面拼接的高度 + int centerHeight = 13;//中间部分拼接的高度 + + if (Top == 11) { + const SQChar* bFile; + Sq_getstring(v, 6, &bFile); + int Idx; + Sq_getinteger(v, 7, &Idx); + File = (wchar_t*)bFile; + StartIdx = Idx; + Sq_getinteger(v, 8, &leftWidth); + Sq_getinteger(v, 9, ¢erWidth); + Sq_getinteger(v, 10, &topHeight); + Sq_getinteger(v, 11, ¢erHeight); + } + + int widthCount = round(WindowWidth / centerWidth); + int heightCount = round(WindowHeight / centerWidth); + + int npkbuf = Load_Npk(*(int*)0x1B4684C, 0, 0, File); + int leftTopFrame = Get_Img(npkbuf, 0, 0 + StartIdx); + int topCenterFrame = Get_Img(npkbuf, 0, 1 + StartIdx); + int rightTopFrame = Get_Img(npkbuf, 0, 2 + StartIdx); + int leftCenterFrame = Get_Img(npkbuf, 0, 3 + StartIdx); + int centerFrame = Get_Img(npkbuf, 0, 4 + StartIdx); + int rightCenterFrame = Get_Img(npkbuf, 0, 5 + StartIdx); + int leftBottomFrame = Get_Img(npkbuf, 0, 6 + StartIdx); + int centerBottomFrame = Get_Img(npkbuf, 0, 7 + StartIdx); + int rightBottomFrame = Get_Img(npkbuf, 0, 8 + StartIdx); + + Draw_Img(*(int*)0x1B45B94, 0, X, Y, leftTopFrame); + + for (int i = 0; i < widthCount; i++) { + Draw_Img(*(int*)0x1B45B94, 0, X + leftWidth + centerWidth * i, Y, topCenterFrame); + } + + Draw_Img(*(int*)0x1B45B94, 0, X + leftWidth + centerWidth * widthCount, Y, rightTopFrame); + + + //拼接中间和下面部分的 + //j为往下数的第几行 + for (int j = 0; j < heightCount; j++) { + Draw_Img(*(int*)0x1B45B94, 0, X, Y + topHeight + centerHeight * j, leftCenterFrame); + //绘制最左边的部分 + + if (j == 0) + Draw_Img(*(int*)0x1B45B94, 0, X, Y + topHeight + centerHeight * heightCount, leftBottomFrame); + //这是绘制最下左边的拐角 + + //绘制中间的部分 + for (int i = 0; i < widthCount; i++) { + Draw_Img(*(int*)0x1B45B94, 0, X + leftWidth + centerWidth * i, Y + topHeight + centerHeight * j, centerFrame); + if (j == 0) + Draw_Img(*(int*)0x1B45B94, 0, X + leftWidth + centerWidth * i, Y + topHeight + centerHeight * heightCount, centerBottomFrame); + //绘制中间最下面的部分 + } + + Draw_Img(*(int*)0x1B45B94, 0, X + leftWidth + centerWidth * widthCount, Y + topHeight + centerHeight * j, rightCenterFrame); + //绘制最右边的部分 + + if (j == 0) + Draw_Img(*(int*)0x1B45B94, 0, X + leftWidth + centerWidth * widthCount, Y + topHeight + centerHeight * heightCount, rightBottomFrame); + //绘制最右边最下面拐角处 + + } + + + if (heightCount == 0) { + Draw_Img(*(int*)0x1B45B94, 0, X, Y + topHeight + centerHeight * heightCount, leftBottomFrame); + for (int i = 0; i < widthCount; i++) { + Draw_Img(*(int*)0x1B45B94, 0, X + leftWidth + centerWidth * i, Y + topHeight + centerHeight * heightCount, centerBottomFrame); + } + //绘制中间最下面的部分 + Draw_Img(*(int*)0x1B45B94, 0, X + leftWidth + centerWidth * widthCount, Y + topHeight + centerHeight * heightCount, rightBottomFrame); + //绘制最右边最下面拐角处 + } + + + return 0; +} +//绘制三图 +static SQInteger sq_DrawButton(HSQUIRRELVM v) +{ + int Top = Sq_gettop(v); + int X; + Sq_getinteger(v, 2, &X); + int Y; + Sq_getinteger(v, 3, &Y); + int WindowWidth; + Sq_getinteger(v, 4, &WindowWidth); + const SQChar* File; + Sq_getstring(v, 5, &File); + int StartIdx; + Sq_getinteger(v, 6, &StartIdx); + //填充宽度 + int FillWidth; + Sq_getinteger(v, 7, &FillWidth); + //首节宽度 + int FirstWidth; + Sq_getinteger(v, 8, &FirstWidth); + + int widthCount = round(WindowWidth / 2); + + int npkbuf = Load_Npk(*(int*)0x1B4684C, 0, 0, (wchar_t*)File); + int leftFrame = Get_Img(npkbuf, 0, 0 + StartIdx); + int CenterFrame = Get_Img(npkbuf, 0, 1 + StartIdx); + int rightFrame = Get_Img(npkbuf, 0, 2 + StartIdx); + + Draw_Img(*(int*)0x1B45B94, 0, X, Y, leftFrame); + for (int i = 0; i < widthCount; i++) { + Draw_Img(*(int*)0x1B45B94, 0, X + FirstWidth + FillWidth * i, Y, CenterFrame); + } + + Draw_Img(*(int*)0x1B45B94, 0, X + FirstWidth + FillWidth * widthCount, Y, rightFrame); + return 0; +} +//获取文字绘制长度 +static std::mapLenheartCodeWidth; +static SQInteger Sq_getstringDrawLength(HSQUIRRELVM v) { + + const SQChar* Str; + Sq_getstring(v, 2, &Str); + + char* OutPutText = DNFTOOL::SquirrelU2W(Str); + std::string RealStr = OutPutText; + delete[]OutPutText; + + if (!LenheartCodeWidth.count("0")) { + LenheartCodeWidth[" "] = 4; + LenheartCodeWidth["0"] = 7; + LenheartCodeWidth["1"] = 5; + LenheartCodeWidth["2"] = 7; + LenheartCodeWidth["3"] = 7; + LenheartCodeWidth["4"] = 7; + LenheartCodeWidth["5"] = 7; + LenheartCodeWidth["6"] = 7; + LenheartCodeWidth["7"] = 6; + LenheartCodeWidth["8"] = 7; + LenheartCodeWidth["9"] = 7; + LenheartCodeWidth["z"] = 6; + LenheartCodeWidth["y"] = 8; + LenheartCodeWidth["x"] = 7; + LenheartCodeWidth["w"] = 7; + LenheartCodeWidth["v"] = 7; + LenheartCodeWidth["u"] = 8; + LenheartCodeWidth["t"] = 6; + LenheartCodeWidth["s"] = 6; + LenheartCodeWidth["r"] = 7; + LenheartCodeWidth["q"] = 7; + LenheartCodeWidth["p"] = 7; + LenheartCodeWidth["o"] = 6; + LenheartCodeWidth["n"] = 8; + LenheartCodeWidth["m"] = 7; + LenheartCodeWidth["l"] = 7; + LenheartCodeWidth["k"] = 7; + LenheartCodeWidth["j"] = 6; + LenheartCodeWidth["i"] = 5; + LenheartCodeWidth["h"] = 8; + LenheartCodeWidth["g"] = 7; + LenheartCodeWidth["f"] = 7; + LenheartCodeWidth["e"] = 6; + LenheartCodeWidth["d"] = 7; + LenheartCodeWidth["c"] = 6; + LenheartCodeWidth["b"] = 7; + LenheartCodeWidth["a"] = 7; + LenheartCodeWidth["A"] = 8; + LenheartCodeWidth["B"] = 7; + LenheartCodeWidth["C"] = 7; + LenheartCodeWidth["D"] = 7; + LenheartCodeWidth["E"] = 7; + LenheartCodeWidth["F"] = 7; + LenheartCodeWidth["G"] = 8; + LenheartCodeWidth["H"] = 8; + LenheartCodeWidth["I"] = 5; + LenheartCodeWidth["J"] = 8; + LenheartCodeWidth["K"] = 8; + LenheartCodeWidth["L"] = 8; + LenheartCodeWidth["M"] = 8; + LenheartCodeWidth["N"] = 8; + LenheartCodeWidth["O"] = 7; + LenheartCodeWidth["P"] = 7; + LenheartCodeWidth["Q"] = 7; + LenheartCodeWidth["R"] = 8; + LenheartCodeWidth["S"] = 7; + LenheartCodeWidth["T"] = 7; + LenheartCodeWidth["U"] = 8; + LenheartCodeWidth["V"] = 8; + LenheartCodeWidth["W"] = 7; + LenheartCodeWidth["X"] = 7; + LenheartCodeWidth["Y"] = 7; + LenheartCodeWidth["Z"] = 7; + LenheartCodeWidth[","] = 4; + LenheartCodeWidth[","] = 4; + LenheartCodeWidth["."] = 3; + LenheartCodeWidth["。"] = 6; + LenheartCodeWidth["!"] = 3; + LenheartCodeWidth["!"] = 4; + LenheartCodeWidth["?"] = 7; + LenheartCodeWidth["?"] = 8; + LenheartCodeWidth[";"] = 3; + LenheartCodeWidth[";"] = 4; + LenheartCodeWidth["["] = 5; + LenheartCodeWidth["]"] = 5; + LenheartCodeWidth["{"] = 5; + LenheartCodeWidth["}"] = 5; + LenheartCodeWidth["("] = 5; + LenheartCodeWidth[")"] = 5; + LenheartCodeWidth["\\"] = 6; + LenheartCodeWidth["“"] = 7; + LenheartCodeWidth["”"] = 7; + LenheartCodeWidth["\""] = 4; + LenheartCodeWidth["’"] = 4; + LenheartCodeWidth["+"] = 7; + LenheartCodeWidth["-"] = 8; + LenheartCodeWidth["*"] = 7; + LenheartCodeWidth["/"] = 8; + LenheartCodeWidth["="] = 8; + } + + int L = 0; + + int StrTextLength = 0; + for (size_t i = 0; i < RealStr.length();) + { + int cplen = 1; + if (RealStr[i] < 0)cplen = 2; + std::string c = RealStr.substr(i, cplen); + if (LenheartCodeWidth.count(c)) { + L += LenheartCodeWidth[c]; + } + else { + L += 13; + } + i += cplen; + StrTextLength++; + } + L -= StrTextLength; + + Sq_pushinteger(v, L); + return 1; +} +//获取文字换行返回数组 +static SQInteger Sq_getstringDrawArray(HSQUIRRELVM v) { + + const SQChar* Str; + Sq_getstring(v, 2, &Str); + + int Len; + Sq_getinteger(v, 3, &Len); + + char* OutPutText = DNFTOOL::SquirrelU2W(Str); + std::string RealStr = OutPutText; + delete[]OutPutText; + + if (!LenheartCodeWidth.count("0")) { + LenheartCodeWidth[" "] = 4; + LenheartCodeWidth["0"] = 7; + LenheartCodeWidth["1"] = 5; + LenheartCodeWidth["2"] = 7; + LenheartCodeWidth["3"] = 7; + LenheartCodeWidth["4"] = 7; + LenheartCodeWidth["5"] = 7; + LenheartCodeWidth["6"] = 7; + LenheartCodeWidth["7"] = 6; + LenheartCodeWidth["8"] = 7; + LenheartCodeWidth["9"] = 7; + LenheartCodeWidth["z"] = 6; + LenheartCodeWidth["y"] = 8; + LenheartCodeWidth["x"] = 7; + LenheartCodeWidth["w"] = 7; + LenheartCodeWidth["v"] = 7; + LenheartCodeWidth["u"] = 8; + LenheartCodeWidth["t"] = 6; + LenheartCodeWidth["s"] = 6; + LenheartCodeWidth["r"] = 7; + LenheartCodeWidth["q"] = 7; + LenheartCodeWidth["p"] = 7; + LenheartCodeWidth["o"] = 6; + LenheartCodeWidth["n"] = 8; + LenheartCodeWidth["m"] = 7; + LenheartCodeWidth["l"] = 7; + LenheartCodeWidth["k"] = 7; + LenheartCodeWidth["j"] = 6; + LenheartCodeWidth["i"] = 5; + LenheartCodeWidth["h"] = 8; + LenheartCodeWidth["g"] = 7; + LenheartCodeWidth["f"] = 7; + LenheartCodeWidth["e"] = 6; + LenheartCodeWidth["d"] = 7; + LenheartCodeWidth["c"] = 6; + LenheartCodeWidth["b"] = 7; + LenheartCodeWidth["a"] = 7; + LenheartCodeWidth["A"] = 8; + LenheartCodeWidth["B"] = 7; + LenheartCodeWidth["C"] = 7; + LenheartCodeWidth["D"] = 7; + LenheartCodeWidth["E"] = 7; + LenheartCodeWidth["F"] = 7; + LenheartCodeWidth["G"] = 8; + LenheartCodeWidth["H"] = 8; + LenheartCodeWidth["I"] = 5; + LenheartCodeWidth["J"] = 8; + LenheartCodeWidth["K"] = 8; + LenheartCodeWidth["L"] = 8; + LenheartCodeWidth["M"] = 8; + LenheartCodeWidth["N"] = 8; + LenheartCodeWidth["O"] = 7; + LenheartCodeWidth["P"] = 7; + LenheartCodeWidth["Q"] = 7; + LenheartCodeWidth["R"] = 8; + LenheartCodeWidth["S"] = 7; + LenheartCodeWidth["T"] = 7; + LenheartCodeWidth["U"] = 8; + LenheartCodeWidth["V"] = 8; + LenheartCodeWidth["W"] = 7; + LenheartCodeWidth["X"] = 7; + LenheartCodeWidth["Y"] = 7; + LenheartCodeWidth["Z"] = 7; + LenheartCodeWidth[","] = 4; + LenheartCodeWidth[","] = 4; + LenheartCodeWidth["."] = 3; + LenheartCodeWidth["。"] = 6; + LenheartCodeWidth["!"] = 3; + LenheartCodeWidth["!"] = 4; + LenheartCodeWidth["?"] = 7; + LenheartCodeWidth["?"] = 8; + LenheartCodeWidth[";"] = 3; + LenheartCodeWidth[";"] = 4; + LenheartCodeWidth["["] = 5; + LenheartCodeWidth["]"] = 5; + LenheartCodeWidth["{"] = 5; + LenheartCodeWidth["}"] = 5; + LenheartCodeWidth["("] = 5; + LenheartCodeWidth[")"] = 5; + LenheartCodeWidth["\\"] = 6; + LenheartCodeWidth["“"] = 7; + LenheartCodeWidth["”"] = 7; + LenheartCodeWidth["\""] = 4; + LenheartCodeWidth["’"] = 4; + LenheartCodeWidth["+"] = 7; + LenheartCodeWidth["-"] = 8; + LenheartCodeWidth["*"] = 7; + LenheartCodeWidth["/"] = 8; + LenheartCodeWidth["="] = 8; + } + + std::vectorStrBuf; + + int StrTextLength = 0; + for (size_t i = 0; i < RealStr.length();) + { + int cplen = 1; + if (RealStr[i] < 0)cplen = 2; + std::string c = RealStr.substr(i, cplen); + + StrBuf.push_back(c); + i += cplen; + } + + std::vectorPushStrBuf; + std::string Ostr = ""; + for (unsigned int i = 0; i < StrBuf.size(); ++i) + { + int AddLen = 0; + if (LenheartCodeWidth.count(StrBuf[i])) { + AddLen = LenheartCodeWidth[StrBuf[i]]; + } + else { + AddLen = 13; + } + + //超过了 + if (AddLen + StrTextLength > Len) { + PushStrBuf.push_back(Ostr); + StrTextLength = AddLen; + Ostr = StrBuf[i]; + } + else { + Ostr += StrBuf[i]; + StrTextLength += AddLen; + //最后一段 + if (i == StrBuf.size() - 1) { + PushStrBuf.push_back(Ostr); + } + } + + } + + sq_newarray((HSQUIRRELVM)v, 0); + + for (unsigned int i = 0; i < PushStrBuf.size(); ++i) + { + std::string Buf = PushStrBuf[i]; + char* ss = DNFTOOL::GBKTOUTF8(Buf); + wchar_t* aa = DNFTOOL::charTowchar_t(ss); + Sq_pushstring(v, aa, -1); + sq_arrayappend((HSQUIRRELVM)v, -2); + delete[]aa; + } + return 1; +} +//反序列化Json +static SQInteger DecondeJson(HSQUIRRELVM v) { + const SQChar* OutPutBuffer; + Sq_getstring(v, 2, &OutPutBuffer); + char* OutPutText = DNFTOOL::wchar_tTochar((wchar_t*)OutPutBuffer); + std::string str = OutPutText; + delete[]OutPutText; + + size_t pos = 0; + bool Ars = false; + while ((pos = str.find("\"", pos)) != std::string::npos) { + // 判断双引号是否在Key的位置 + if (pos > 0) { + if (str[pos - 1] == '[') { + Ars = true; + } + if ((str[pos - 1] == '{' || str[pos + 1] == ':' || str[pos - 1] == ',') && !Ars) { + // 删除双引号 + str.erase(pos, 1); + } + else { + pos++; + } + if (str[pos] == ']') { + Ars = false; + } + } + else { + pos++; + } + } + + str = DNFTOOL::ReplaceAll(str, ":", "="); + + wchar_t* ss = DNFTOOL::charTowchar_t((char*)str.c_str()); + Sq_pushstring(v, ss, -1); + delete[]ss; + return 1; +} +//序列化Json +std::string EncodeARRAY(HSQUIRRELVM v, std::string Jso); +std::string EncodeTABLE(HSQUIRRELVM v, std::string Jso); +std::string EncodeARRAY(HSQUIRRELVM v, std::string Jso) { + Jso += "["; + + sq_pushnull((HSQUIRRELVM)v); // null iterator + while (SQ_SUCCEEDED(sq_next((HSQUIRRELVM)v, -2))) + { + SQObjectType Type = sq_gettype((HSQUIRRELVM)v, -1); + switch (Type) + { + case OT_INTEGER: { + static SQInteger value; + Sq_getinteger(v, -1, &value); + Jso += std::to_string(value); + Jso += ","; + } + break; + case OT_FLOAT: + { + SQFloat value; + Sq_getfloat(v, -1, &value); + Jso += std::to_string(value); + Jso += ","; + } + break; + case OT_BOOL: + { + SQBool value; + Sq_getbool(v, -1, &value); + Jso += std::to_string(value); + Jso += ","; + } + break; + case OT_STRING: + { + const SQChar* value; + Sq_getstring((HSQUIRRELVM)v, -1, &value); + + char* vOutPutText = DNFTOOL::SquirrelU2W(value); + std::string vstr = vOutPutText; + delete[]vOutPutText; + Jso += "\""; + Jso += vstr; + Jso += "\""; + Jso += ","; + } + break; + case OT_TABLE: + { + static SQInteger Top = Sq_gettop(v); + SQObject obj; + sq_getstackobj(v, -1, &obj); + sq_pushobject(v, obj); + Jso = EncodeTABLE(v, Jso); + sq_settop(v, Top); + Jso += ","; + } + break; + case OT_ARRAY: + { + static SQInteger Top = Sq_gettop(v); + SQObject obj; + sq_getstackobj(v, -1, &obj); + sq_pushobject(v, obj); + Jso = EncodeARRAY(v, Jso); + sq_settop(v, Top); + Jso += ","; + } + break; + default: + break; + } + + //这里-1是值,-2是键 + sq_pop((HSQUIRRELVM)v, 2); //在下一次迭代之前弹出键和值 + } + sq_pop((HSQUIRRELVM)v, 1); //在下一次迭代之前弹出键和值 + Jso = Jso.substr(0, Jso.length() - 1); + Jso += "]"; + return Jso; +} +std::string EncodeTABLE(HSQUIRRELVM v, std::string Jso) { + + Jso += "{"; + + sq_pushnull((HSQUIRRELVM)v); // null iterator + while (SQ_SUCCEEDED(sq_next((HSQUIRRELVM)v, -2))) + { + const SQChar* Key; + Sq_getstring((HSQUIRRELVM)v, -2, &Key); + + + char* OutPutText = DNFTOOL::SquirrelU2W(Key); + std::string str = OutPutText; + delete[]OutPutText; + + + Jso += "\""; + Jso += str; + Jso += "\""; + Jso += ":"; + + SQObjectType Type = sq_gettype((HSQUIRRELVM)v, -1); + switch (Type) + { + case OT_INTEGER: { + static SQInteger value; + Sq_getinteger(v, -1, &value); + Jso += std::to_string(value); + Jso += ","; + } + break; + case OT_FLOAT: + { + SQFloat value; + Sq_getfloat(v, -1, &value); + Jso += std::to_string(value); + Jso += ","; + } + break; + case OT_BOOL: + { + SQBool value; + Sq_getbool(v, -1, &value); + Jso += std::to_string(value); + Jso += ","; + } + break; + case OT_STRING: + { + const SQChar* value; + Sq_getstring((HSQUIRRELVM)v, -1, &value); + + char* vOutPutText = DNFTOOL::SquirrelU2W(value); + std::string vstr = vOutPutText; + delete[]vOutPutText; + Jso += "\""; + Jso += vstr; + Jso += "\""; + Jso += ","; + } + break; + case OT_TABLE: + { + static SQInteger Top = Sq_gettop(v); + SQObject obj; + sq_getstackobj(v, -1, &obj); + sq_pushobject(v, obj); + Jso = EncodeTABLE(v, Jso); + sq_settop(v, Top); + Jso += ","; + } + break; + case OT_ARRAY: + { + static SQInteger Top = Sq_gettop(v); + SQObject obj; + sq_getstackobj(v, -1, &obj); + sq_pushobject(v, obj); + Jso = EncodeARRAY(v, Jso); + sq_settop(v, Top); + Jso += ","; + } + break; + default: + break; + } + + //这里-1是值,-2是键 + sq_pop((HSQUIRRELVM)v, 2); //在下一次迭代之前弹出键和值 + } + sq_pop((HSQUIRRELVM)v, 1); //在下一次迭代之前弹出键和值 + Jso = Jso.substr(0, Jso.length() - 1); + Jso += "}"; + return Jso; +} +static SQInteger EncondeJson(HSQUIRRELVM v) { + + std::string Jso = ""; + std::string RealJso = EncodeTABLE((HSQUIRRELVM)v, Jso); + char* sbuf = DNFTOOL::GBKTOUTF8(RealJso); + wchar_t* ss = DNFTOOL::charTowchar_t(sbuf); + Sq_pushstring(v, ss, -1); + return 1; +} +//按键是否按下 +static SQInteger sq_IsKeyDown(HSQUIRRELVM v) { + + int KeyCode; + Sq_getinteger(v, 2, &KeyCode); + + if (KEY_DOWN(KeyCode)) { + Sq_pushbool(v, true); + } + else { + Sq_pushbool(v, false); + } + return 1; +} +//打开特殊窗口 +//窗口CALL +typedef void(*NNoticeTCall)(DWORD thisc, DWORD Seat, DWORD a1, wchar_t* a2, DWORD a3, DWORD a4, DWORD a5); +static NNoticeTCall _ANoticeTcall = (NNoticeTCall)0xE6E070; +typedef void(_fastcall _Open_ExWindow)(int thisc, void*, int a2, char a3, char a4); +static _Open_ExWindow* Open_ExWindow = (_Open_ExWindow*)0xE718A0; +static _Open_ExWindow* Open_ExWindow2 = (_Open_ExWindow*)0xE6E070; +static SQInteger sq_Open_ExWindow(HSQUIRRELVM v) { + int a1, a2, a3, a4; + Sq_getinteger(v, 2, &a1); + Sq_getinteger(v, 3, &a2); + Sq_getinteger(v, 4, &a3); + Sq_getinteger(v, 5, &a4); + Open_ExWindow(a1, 0, a2, a3, a4); + return 0; +} +static SQInteger sq_Open_ExWindow2(HSQUIRRELVM v) { + int a1, a2, a3, a4; + Sq_getinteger(v, 2, &a1); + Sq_getinteger(v, 3, &a2); + Sq_getinteger(v, 4, &a3); + Sq_getinteger(v, 5, &a4); + Open_ExWindow2(a1, 0, a2, a3, a4); + return 0; +} +typedef int(_cdecl _GetWindowByIdx)(int Idx); +static _GetWindowByIdx* GetWindowByIdx = (_GetWindowByIdx*)0x5A2A00; +static SQInteger sq_GetWindowById(HSQUIRRELVM v) { + int Idx; + Sq_getinteger(v, 2, &Idx); + int WindowAddress = GetWindowByIdx(Idx); + Sq_pushinteger(v, WindowAddress); + + return 1; +} +//选择大地图区域 +static SQInteger sq_Select_MiniMap_Index(HSQUIRRELVM v) { + int ReIndex; + Sq_getinteger(v, 2, &ReIndex); + static int dnf_103E030 = 0x103E030; + static int dnf_287FA88 = 0x287FA88; + static int dnf_103DCD0 = 0x103DCD0; + static int dnf_103B240 = 0x103B240; + static int dnf_2878D95 = 0x2878D95; + static int dnf_1194FC0 = 0x1194FC0; + static int dnf_410230 = 0x410230; + static int dnf_102F4D0 = 0x102F4D0; + _asm + { + mov ecx, dword ptr ds : [0x1A5FB20] + mov esi, dword ptr ds : [ecx + 0x42DC] + push ReIndex + call dnf_103E030 + mov ecx, eax + call dnf_287FA88 + push ReIndex + call dnf_103E030 + mov ecx, eax + call dnf_103DCD0 + mov ecx, eax + mov dword ptr ds : [esi + 0x24] , eax + call dnf_103B240 + mov ecx, dword ptr ds : [esi + 0x24] + call dnf_2878D95 + push 0x1556138 + call dnf_1194FC0 + mov ecx, eax + add esp, 4 + lea edi, dword ptr ds : [ecx + 2] + dnf_1031651 : + mov dx, word ptr ds : [ecx] + add ecx, 2 + test dx, dx + jne dnf_1031651 + sub ecx, edi + sar ecx, 1 + push ecx + push eax + lea ecx, dword ptr ds : [esi + 0x144] + call dnf_410230 + } + return 0; +} +//绘制技能 +typedef void(_fastcall _DrawSkill)(int a1, int seat, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11); +static _DrawSkill* DrawSkill = (_DrawSkill*)0x909d70; +static SQInteger sq_DrawSkill(HSQUIRRELVM v) +{ + int a1, x, y, a4, a5, a6, a7, a8, a9, a10; + //a1技能地址 + Sq_getinteger(v, 2, &a1); + Sq_getinteger(v, 3, &x); + Sq_getinteger(v, 4, &y); + Sq_getinteger(v, 5, &a4); + Sq_getinteger(v, 6, &a5); + Sq_getinteger(v, 7, &a6); + Sq_getinteger(v, 8, &a7); + Sq_getinteger(v, 9, &a8); + Sq_getinteger(v, 10, &a9); + Sq_getinteger(v, 11, &a10); + DrawSkill(a1, 0, *(int*)0x1AB7CDC, x, y, a4, a5, a6, a7, a8, a9, a10); + return 1; +} +//使用技能 +static SQInteger sq_UseSkill(HSQUIRRELVM v) +{ + int Key_Value; + Sq_getinteger(v, 2, &Key_Value); + BYTE* thisc = (BYTE*)(*(DWORD*)(0x1B470E0)); + thisc[269 + Key_Value] = 0x80; + return 0; +} +//获取当前选择交互角色姓名 +static SQInteger sq_GetPlayerEachName(HSQUIRRELVM v) +{ + int objNameAddress = *(int*)(0x1ade0e0); + char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)(objNameAddress + 0x20)); + wchar_t* name = DNFTOOL::charTowchar_t(str); + free(str); + Sq_pushstring(v, name, -1); + delete[]name; + return 1; +} +//获取技能地址 +typedef int __fastcall _Funcsub_GetSkillAddress(int a1, int a2, int a3); +static _Funcsub_GetSkillAddress* Funcsub_GetSkillAddress = (_Funcsub_GetSkillAddress*)0x8406C0; +static SQInteger sq_GetSkillAddress(HSQUIRRELVM v) +{ + int SkillId; + Sq_getinteger(v, 2, &SkillId); + DWORD ADDRESS = Funcsub_GetSkillAddress(*(int*)0x1AB7CDC, 0, SkillId); + Sq_pushinteger(v, ADDRESS); + return 1; +} +//顺图 +static SQInteger sq_MoveMap(HSQUIRRELVM v) +{ + int dct; + Sq_getinteger(v, 2, &dct); + DWORD Address1 = 0x1A5FB18; + DWORD Address2 = 0x7CE9E0; + _asm + { + mov ecx, [Address1] + mov ecx, [ecx] + mov ecx, [ecx + 0x20a050] + mov ecx, [ecx + 0x4c] + push 0x1 + push 0x1 + push 0x0 + push 0x0 + push 0x0 + push 0x0 + push 0x0 + push dct + call Address2 + } + return 0; +} + +//通过Item编号获取图标Img +typedef int(_cdecl _sub7AAB60)(int a1); +static _sub7AAB60* getitemimg = (_sub7AAB60*)0x7aab60; +static SQInteger sq_GetImg(HSQUIRRELVM v) +{ + int a1; + Sq_getinteger(v, 2, &a1); + int img = getitemimg(a1); + Sq_pushinteger(v, img); + return 1; +} +//绘制Item +typedef int(_cdecl _sub7AA800)(int a1, int a2, int a3, int a4, int a5, int a6, char a7); +static _sub7AA800* drawimg = (_sub7AA800*)0x7aa800; +static SQInteger sq_DrawItem(HSQUIRRELVM v) +{ + int a1, a2, a3, a4, a5, a6, a7; + Sq_getinteger(v, 2, &a1); + Sq_getinteger(v, 3, &a2); + Sq_getinteger(v, 4, &a3); + Sq_getinteger(v, 5, &a4); + Sq_getinteger(v, 6, &a5); + Sq_getinteger(v, 7, &a6); + Sq_getinteger(v, 8, &a7); + int img = getitemimg(a3); + drawimg(a1, a2, img, a4, a5, a6, a7); + return 0; +} + + + + + +//获取SQR的对象转换为原始对象地址 +typedef int(_cdecl __GetSqrObject)(HSQUIRRELVM a1, int a2); +static __GetSqrObject* GetSqrObject = (__GetSqrObject*)0x5c1420; +static __GetSqrObject* GetExeObject = (__GetSqrObject*)0x5c13A0; +//获取对象地址 +static SQInteger GetObjectAddress(HSQUIRRELVM v) +{ + int objAddress = GetSqrObject(v, 2); + Sq_pushinteger(v, objAddress); + return 1; +} +//获取对象名称 +static SQInteger GetObjectName(HSQUIRRELVM v) +{ + int objAddress = GetSqrObject(v, 2); + int objNameAddress = *(int*)(objAddress + 0x258); + char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress); + wchar_t* name = DNFTOOL::charTowchar_t(str); + free(str); + Sq_pushstring(v, name, -1); + delete[]name; + return 1; +} +//获取对象名称 +static SQInteger GetObjectNameByAddress(HSQUIRRELVM v) +{ + int objAddress; + Sq_getinteger(v, 2, &objAddress); + int objNameAddress = *(int*)(objAddress + 0x258); + char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress); + wchar_t* name = DNFTOOL::charTowchar_t(str); + free(str); + Sq_pushstring(v, name, -1); + delete[]name; + return 1; +} + +//获取对象属性 +static SQInteger GetObjectInfo(HSQUIRRELVM v) +{ + int objAddress; + Sq_getinteger(v, 2, &objAddress); + int ParameterNum = Sq_gettop(v); + if (ParameterNum == 4) + { + int InfoAddress; + Sq_getinteger(v, 3, &InfoAddress); + int Value = (objAddress + InfoAddress); + + SQBool Type; + Sq_getbool(v, 4, &Type); + if (Type == TRUE) + { + Sq_pushinteger(v, *(int*)Value); + } + else if (Type == FALSE) + { + Sq_pushfloat(v, *(FLOAT*)Value); + } + } + else if (ParameterNum == 5) + { + int EquAddress; + Sq_getinteger(v, 3, &EquAddress); + int InfoAddress; + Sq_getinteger(v, 4, &InfoAddress); + int Value = (objAddress + EquAddress); + Value = *(int*)Value; + + Value = Value + InfoAddress; + SQBool Type; + Sq_getbool(v, 5, &Type); + if (Type == TRUE) + { + Sq_pushinteger(v, *(int*)Value); + } + else if (Type == FALSE) + { + Sq_pushfloat(v, *(FLOAT*)Value); + } + } + else + { + sq_throwerror(v, L"Incorrect function argument"); + return 0; + } + + return 1; +} +//获取骑乘对象地址 +static SQInteger GetRidingObjectAddress(HSQUIRRELVM v) +{ + int objAddress = GetSqrObject(v, 2); + Sq_pushinteger(v, *(int*)(objAddress + 0x54d0)); + return 1; +} +//解密获取对象属性 +static SQInteger GetObjectDeInfo(HSQUIRRELVM v) +{ + int objAddress; + Sq_getinteger(v, 2, &objAddress); + int ParameterNum = Sq_gettop(v); + if (ParameterNum == 4) + { + int InfoAddress; + Sq_getinteger(v, 3, &InfoAddress); + int Value = (objAddress + InfoAddress); + + SQBool Type; + Sq_getbool(v, 4, &Type); + if (Type == TRUE) + { + Sq_pushinteger(v, DNFTOOL::DNFDeCode(Value)); + } + else if (Type == FALSE) + { + Sq_pushfloat(v, (FLOAT)DNFTOOL::DNFDeCode(Value)); + } + } + else if (ParameterNum == 5) + { + int EquAddress; + Sq_getinteger(v, 3, &EquAddress); + int InfoAddress; + Sq_getinteger(v, 4, &InfoAddress); + int Value = (objAddress + EquAddress); + Value = *(int*)Value; + + Value = Value + InfoAddress; + SQBool Type; + Sq_getbool(v, 5, &Type); + if (Type == TRUE) + { + Sq_pushinteger(v, DNFTOOL::DNFDeCode(Value)); + } + else if (Type == FALSE) + { + Sq_pushfloat(v, (FLOAT)DNFTOOL::DNFDeCode(Value)); + } + } + else + { + sq_throwerror(v, L"Incorrect function argument"); + return 0; + } + + return 1; +} +//设置对象属性 +static SQInteger SetObjectInfo(HSQUIRRELVM v) +{ + int objAddress; + Sq_getinteger(v, 2, &objAddress); + int ParameterNum = Sq_gettop(v); + if (ParameterNum == 5) + { + int InfoAddress; + Sq_getinteger(v, 3, &InfoAddress); + int Value = (objAddress + InfoAddress); + + SQBool Type; + Sq_getbool(v, 4, &Type); + if (Type == TRUE) + { + int W_Value; + Sq_getinteger(v, 5, &W_Value); + *(int*)Value = W_Value; + } + else if (Type == FALSE) + { + FLOAT W_Value; + Sq_getfloat(v, 5, &W_Value); + *(FLOAT*)Value = W_Value; + } + } + else if (ParameterNum == 6) + { + int EquAddress; + Sq_getinteger(v, 3, &EquAddress); + int InfoAddress; + Sq_getinteger(v, 4, &InfoAddress); + int Value = (objAddress + EquAddress); + Value = *(int*)Value; + + Value = Value + InfoAddress; + SQBool Type; + Sq_getbool(v, 5, &Type); + if (Type == TRUE) + { + int W_Value; + Sq_getinteger(v, 6, &W_Value); + *(int*)Value = W_Value; + } + else if (Type == FALSE) + { + FLOAT W_Value; + Sq_getfloat(v, 6, &W_Value); + *(FLOAT*)Value = W_Value; + } + } + else + { + sq_throwerror(v, L"Incorrect function argument"); + return 0; + } + return 1; +} +//加密设置对象属性 +static SQInteger SetObjectDeInfo(HSQUIRRELVM v) +{ + int objAddress; + Sq_getinteger(v, 2, &objAddress); + int ParameterNum = Sq_gettop(v); + if (ParameterNum == 5) + { + int InfoAddress; + Sq_getinteger(v, 3, &InfoAddress); + int Value = (objAddress + InfoAddress); + + SQBool Type; + Sq_getbool(v, 4, &Type); + if (Type == TRUE) + { + int W_Value; + Sq_getinteger(v, 5, &W_Value); + DNFTOOL::DNFEnCode(Value, W_Value); + } + else if (Type == FALSE) + { + FLOAT W_Value; + Sq_getfloat(v, 5, &W_Value); + DNFTOOL::DNFEnCode(Value, (int)W_Value); + } + } + else if (ParameterNum == 6) + { + int EquAddress; + Sq_getinteger(v, 3, &EquAddress); + int InfoAddress; + Sq_getinteger(v, 4, &InfoAddress); + int Value = (objAddress + EquAddress); + Value = *(int*)Value; + + Value = Value + InfoAddress; + SQBool Type; + Sq_getbool(v, 5, &Type); + if (Type == TRUE) + { + int W_Value; + Sq_getinteger(v, 6, &W_Value); + DNFTOOL::DNFEnCode(Value, W_Value); + } + else if (Type == FALSE) + { + FLOAT W_Value; + Sq_getfloat(v, 6, &W_Value); + DNFTOOL::DNFEnCode(Value, (int)W_Value); + } + } + else + { + sq_throwerror(v, L"Incorrect function argument"); + return 0; + } + return 1; +} +//获取对象等级 +static SQInteger GetObjectLevel(HSQUIRRELVM v) +{ + int objAddress = GetSqrObject(v, 2); + int Level = DNFTOOL::DNFDeCode(objAddress + 0x1A4C); + Sq_pushinteger(v, Level); + return 1; +} + +//获取对象是否是玩家函数地址 +typedef DWORD IsCharacter(int Address); +static IsCharacter* _IsCharacter = (IsCharacter*)0x5A36F0; +//获取对象是否是玩家 +static SQInteger GetObjectIsCharacter(HSQUIRRELVM v) +{ + int objAddress; + Sq_getinteger(v, 2, &objAddress); + int Ret = _IsCharacter(objAddress); + Sq_pushinteger(v, Ret); + return 1; +} + +typedef int(__fastcall* _GetObjectAttribute)(DWORD thisc, int Seat, int Type); +typedef int(__fastcall* _FloatDecode)(int Address); +static _GetObjectAttribute GetObjectAttributeFunc = (_GetObjectAttribute)0xD07390; +static _FloatDecode FloatDecode = (_FloatDecode)0x5B0090; +//获取对象属性 +static SQInteger GetObjectAttribute(HSQUIRRELVM v) +{ + int objAddress ,Type; + Sq_getinteger(v, 2, &objAddress); + Sq_getinteger(v, 3, &Type); + int Ret = GetObjectAttributeFunc(objAddress,0, Type); + Ret = FloatDecode(Ret); + Sq_pushinteger(v, Ret); + return 1; +} + +//读人物 或 装备属性 +static SQInteger GetCharacterAttribute(HSQUIRRELVM v) +{ + int n1, n2; + int num = Sq_gettop(v); + + int CharAddr = *(int*)(0x1AB7CDC); + if (num == 3) + { + Sq_getinteger(v, 2, &n1); + Sq_getinteger(v, 3, &n2); + int TValue = *(int*)(CharAddr + DNFTOOL::GetEquAddr(n2)); + int SValue = (TValue + n1); + if (SValue < 0x400000) + Sq_pushinteger(v, 0); + else if (n1 != 0x8 && n1 != 0x1C && n1 != 0xF4 && n1 != 0x854) + Sq_pushinteger(v, (DNFTOOL::DNFDeCode(SValue))); + else + Sq_pushinteger(v, (*(int*)(SValue))); + } + else if (num == 2) + { + Sq_getinteger(v, 2, &n1); + int Value = (CharAddr + n1); + + Sq_pushinteger(v, (DNFTOOL::DNFDeCode(Value))); + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//写人物 或 装备属性 +static SQInteger SetCharacterAttribute(HSQUIRRELVM v) +{ + int n1, n2, n3; + int num = Sq_gettop(v); + int CharAddr = *(int*)(0x1AB7CDC); + if (num == 4) + { + Sq_getinteger(v, 2, &n1); + Sq_getinteger(v, 3, &n2); + Sq_getinteger(v, 4, &n3); + + int TValue = *(int*)(CharAddr + DNFTOOL::GetEquAddr(n2)); + int SValue = (TValue + n1); + if (SValue < 0x400000) + Sq_pushbool(v, false); + else if (n1 != 0x8 && n1 != 0x1C && n1 != 0xF4) + DNFTOOL::DNFEnCode(SValue, n3); + else + *(int*)SValue = n3; + Sq_pushbool(v, true); + } + else if (num == 3) + { + Sq_getinteger(v, 2, &n1); + Sq_getinteger(v, 3, &n2); + + int Value = (CharAddr + n1); + DNFTOOL::DNFEnCode(Value, n2); + Sq_pushbool(v, true); + } + else + { + Sq_pushbool(v, false); + } + return 1; +} +//获取城镇编号 +static SQInteger GetTownIndex(HSQUIRRELVM v) +{ + Sq_pushinteger(v, DNFTOOL::GetHook(0x1A5E258, "0xAC+0xD4+",0)); + return 1; +} +//获取城镇区域编号 +static SQInteger GetRegionIndex(HSQUIRRELVM v) +{ + Sq_pushinteger(v, *(int*)(DNFTOOL::GetHook(0x1A5E258, "0xAC+0xD8+",0))); + return 1; +} +//获取城镇X坐标 +static SQInteger GetTownXpos(HSQUIRRELVM v) +{ + Sq_pushinteger(v, DNFTOOL::GetHook(0x1AB7CE0, "0x2BC+",0)); + return 1; +} +//获取城镇Y坐标 +static SQInteger GetTownYpos(HSQUIRRELVM v) +{ + Sq_pushinteger(v, DNFTOOL::GetHook(0x1AB7CE0, "0x2C0+",0)); + return 1; +} +//获取疲劳值 +static SQInteger GetFatigue(HSQUIRRELVM v) +{ + int Type; + int num = Sq_gettop(v); + if (num == 2) + { + Sq_getinteger(v, 2, &Type); + + switch (Type) + { + case 0: + Sq_pushinteger(v, DNFTOOL::DNFDeCode(0x1AB7E1C)); + break; + case 1: + Sq_pushinteger(v, DNFTOOL::DNFDeCode(0x1AB7E10)); + break; + default: + Sq_pushbool(v, false); + break; + } + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//获取经验值 +static SQInteger GetExp(HSQUIRRELVM v) +{ + int Type; + + int num = Sq_gettop(v); + if (num == 2) + { + Sq_getinteger(v, 2, &Type); + + switch (Type) + { + case 0: + Sq_pushinteger(v, DNFTOOL::DNFDeCode(DNFTOOL::GetHook(0x1AB7CDC, "0x3C4C+", 1))); + break; + case 1: + Sq_pushinteger(v, DNFTOOL::DNFDeCode(DNFTOOL::GetHook(0x1AB7CDC, "0x3C40+", 1))); + break; + default: + Sq_pushbool(v, false); + break; + } + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//获取sp点 +typedef int(_fastcall _9166B0)(int a1, int seat); +static _9166B0* GetSp = (_9166B0*)0x9166B0; +static SQInteger sq_GetSp(HSQUIRRELVM v) +{ + int num = Sq_gettop(v); + if (num == 1) + { + Sq_pushinteger(v, GetSp(NULL, 0)); + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//获取冒险团等级 +typedef int(_61A5F0)(); +static _61A5F0* GetPass = (_61A5F0*)0x61A5F0; +static SQInteger sq_GetPassLevel(HSQUIRRELVM v) +{ + int Passobj = GetPass(); + int l = *(int*)Passobj; + Sq_pushinteger(v, l); + return 1; +} +//刷新活动图标 +typedef int(_fastcall _4DE680)(int a1, int seat); +static _4DE680* RefreshEventIcon = (_4DE680*)0x4DE680; +static SQInteger sq_RefreshEventIcon(HSQUIRRELVM v) +{ + RefreshEventIcon(0x01A39B78, 0); + return 0; +} +//发包类型 +typedef DWORD SendClass; +static SendClass* _SendClass = (SendClass*)0x1AEB6E4; +static SQInteger SendPackType(HSQUIRRELVM v) +{ + int n1; + int num = Sq_gettop(v); + if (num == 2) + { + Sq_getinteger(v, 2, &n1); + _SendpacksType(*_SendClass, 0, n1); + + Sq_pushbool(v, true); + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//发包Byte +static SQInteger SendPackByte(HSQUIRRELVM v) +{ + int n1; + int num = Sq_gettop(v); + if (num == 2) + { + Sq_getinteger(v, 2, &n1); + _SendPacksByte(*_SendClass, 0, n1); + Sq_pushbool(v, true); + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//发包Word +static SQInteger SendPackWord(HSQUIRRELVM v) +{ + int n1; + int num = Sq_gettop(v); + if (num == 2) + { + Sq_getinteger(v, 2, &n1); + _SendPacksWord(*_SendClass, 0, n1); + Sq_pushbool(v, true); + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//发包DWord +static SQInteger SendPackDWord(HSQUIRRELVM v) +{ + int n1; + int num = Sq_gettop(v); + if (num == 2) + { + Sq_getinteger(v, 2, &n1); + _SendPacksDWord(*_SendClass, 0, n1); + Sq_pushbool(v, true); + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//发包wchar_t* (转了char*) +static SQInteger SendPackWChar(HSQUIRRELVM v) +{ + const SQChar* n1; + int num = Sq_gettop(v); + if (num == 2) + { + Sq_getstring(v, 2, &n1); + //wchar_t* 转 char* + char* fname = DNFTOOL::wchar_tTochar((wchar_t*)n1); + _SendPacksChar(*_SendClass, 0, fname, strlen(fname)); + delete[]fname; + Sq_pushbool(v, true); + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//发包 +static SQInteger SendPack(HSQUIRRELVM v) +{ + int num = Sq_gettop(v); + if (num == 1) + { + _SendPacks(); + Sq_pushbool(v, true); + } + else + { + sq_throwerror(v, L"parameter error"); + } + return 1; +} +//去副本 +static SQInteger GoDungeon(HSQUIRRELVM v) +{ + int n1 = 0; + int n2 = 0; + int n3 = 0; + int n4 = 0; + + int num = Sq_gettop(v); + + if (num == 2) + { + Sq_getinteger(v, 2, &n1); + } + else if (num == 5) + { + Sq_getinteger(v, 2, &n1); + Sq_getinteger(v, 3, &n2); + Sq_getinteger(v, 4, &n3); + Sq_getinteger(v, 5, &n4); + } + else + { + Sq_pushbool(v, false); + return 1; + } + + _SendpacksType(*_SendClass, 0, 15); + _SendPacks(); + + _SendpacksType(*_SendClass, 0, 16); + _SendPacksWord(*_SendClass, 0, n1); + _SendPacksByte(*_SendClass, 0, n2); + _SendPacksByte(*_SendClass, 0, n3); + _SendPacksByte(*_SendClass, 0, n4); + _SendPacks(); + + Sq_pushbool(v, true); + return 1; +} +//回城 +static SQInteger GoTown(HSQUIRRELVM v) +{ + int num = Sq_gettop(v); + if (num == 1) + { + _SendpacksType(*_SendClass, 0, 0x2D); + _SendPacks(); + Sq_pushbool(v, true); + } + else + { + Sq_pushbool(v, false); + } + return 1; +} +//移动城镇 +static SQInteger MoveTown(HSQUIRRELVM v) +{ + int TownIndex; + int ReIndex; + int XPos; + int YPos; + int num = Sq_gettop(v); + if (num == 5) + { + Sq_getinteger(v, 2, &TownIndex); + Sq_getinteger(v, 3, &ReIndex); + Sq_getinteger(v, 4, &XPos); + Sq_getinteger(v, 5, &YPos); + + _SendpacksType(*_SendClass, 0, 38); + _SendPacksByte(*_SendClass, 0, TownIndex); + _SendPacksByte(*_SendClass, 0, ReIndex); + _SendPacksWord(*_SendClass, 0, XPos); + _SendPacksWord(*_SendClass, 0, YPos); + _SendPacksByte(*_SendClass, 0, 5); + _SendPacksWord(*_SendClass, 0, 0); + _SendPacksWord(*_SendClass, 0, 0); + _SendPacks(); + + Sq_pushbool(v, true); + } + else + { + Sq_pushbool(v, false); + } + return 1; +} +//绘制字符 +typedef void(__fastcall* DrawCode)(DWORD thisc, int Seat, int a3, int a4, int a5, int a6); +typedef DWORD(_fastcall _FontInit)(DWORD thisc, DWORD Seat); +static _FontInit* sub_11BE9A0 = (_FontInit*)0x11BE9A0; +static _FontInit* sub_11BE980 = (_FontInit*)0x11BE980; +typedef DWORD(_fastcall _BFontInit)(DWORD thisc, DWORD Seat); +static _BFontInit* sub_1206570 = (_BFontInit*)0x1206570; +typedef DWORD(_fastcall _FontC)(DWORD thisc, DWORD Seat, DWORD Font); +static _FontC* sub_1206550 = (_FontC*)0x1206550; +static DrawCode NewDrawCodeF = (DrawCode)0x01206BD0; + +static SQInteger sq_DrawCode(HSQUIRRELVM v) +{ + const SQChar* Str; + int XPos; + int YPos; + int Color; + int Type; + int Stroke; + + int ParameterNum = Sq_gettop(v); + + if (ParameterNum == 4) + { + Color = (int)0xfffffffff; + Type = 1; + Stroke = 0; + + Sq_pushbool(v, true); + } + else if (ParameterNum == 5) + { + //获取颜色 + Sq_getinteger(v, 5, &Color); + Type = 1; + Stroke = 0; + + Sq_pushbool(v, true); + } + else if (ParameterNum == 6) + { + //获取颜色 + Sq_getinteger(v, 5, &Color); + //获取类型 + Sq_getinteger(v, 6, &Type); + Stroke = 0; + + Sq_pushbool(v, true); + } + else if (ParameterNum == 7) + { + //获取颜色 + Sq_getinteger(v, 5, &Color); + //获取类型 + Sq_getinteger(v, 6, &Type); + //获取描边 + Sq_getinteger(v, 7, &Stroke); + + Sq_pushbool(v, true); + } + else + { + Sq_pushbool(v, false); + return 1; + } + + //获取字符串内容 + Sq_getstring(v, 2, &Str); + //获取X坐标 + Sq_getinteger(v, 3, &XPos); + //获取X坐标 + Sq_getinteger(v, 4, &YPos); + //松鼠 Wchar_t 转换为 Unicode + char* OutPutText = DNFTOOL::SquirrelU2W(Str); + //转为正确的Unicode字符 + wchar_t* str = DNFTOOL::char2wchar(OutPutText); + + //申请笔 + unsigned char* font = new unsigned char[1000]; + //初始化笔 + sub_11BE9A0((DWORD)font, 0); + sub_11BE980((DWORD)font, 0); + //是否描边 + font[1] = Stroke; + + int FontObj; + + switch (Type) + { + case 1: + FontObj = *(int*)0x1B468CC; + break; + case 2: + FontObj = *(int*)0x1B468DC; + break; + case 3: + FontObj = *(int*)0x1B468D4; + break; + default: + FontObj = *(int*)0x1B468CC; + break; + } + + //字体 + *(int*)((int)font + 8) = FontObj; + + //得到绘制句柄 + DWORD base = *(int*)0x1B45B94; + //设置笔 + sub_1206550(base, 0, (DWORD)font); + //绘制字体 + NewDrawCodeF(base, 0, XPos, YPos, Color, (int)str); + //取消笔 + sub_1206570(base, 0); + + + delete[]OutPutText; + delete[]str; + delete[]font; + return 1; +} +//读内存 +static SQInteger LReadAddress(HSQUIRRELVM v) +{ + //内存地址 int型 + int Address; + + //获取参数个数 + int ParameterNum = Sq_gettop(v); + + //1个参数时 + if (ParameterNum == 2) + { + //获取值的类型 + int ParameterType = sq_gettype(v, 2); + + switch (ParameterType) + { + case OT_INTEGER://int类型 + { + //获取地址 + Sq_getinteger(v, 2, &Address); + if (Address >= 0x400000) { + int Value = *(int*)Address; + Sq_pushinteger(v, Value); + } + else { + Sq_pushinteger(v, -1); + } + return 1; + } + break; + } + } + if (ParameterNum == 3) + { + //地址 + int Address; + //偏移 + const SQChar* offset; + + Sq_getinteger(v, 2, &Address); + Sq_getstring(v, 3, &offset); + + int Value = DNFTOOL::GetHook(Address, DNFTOOL::wchar_tTochar((wchar_t*)offset),0); + Sq_pushinteger(v, Value); + return 1; + } + return 0; +} +//读内存 +static SQInteger LReadAddressB(HSQUIRRELVM v) +{ + //内存地址 int型 + int Address; + + //获取参数个数 + int ParameterNum = Sq_gettop(v); + //1个参数时 + if (ParameterNum == 2) + { + //获取地址 + Sq_getinteger(v, 2, &Address); + int Value = *(BYTE*)Address; + Sq_pushinteger(v, Value); + return 1; + } + if (ParameterNum == 3) + { + ////地址 + //int Address; + ////偏移 + //wchar_t* offset; + + //Sq_getinteger(v, 2, &Address); + //SQGetString(v, 3, &offset); + + //int Value = DNFTOOL::GetHook(Address, DNFTOOL::wchar_tTochar(offset)); + //SQPushInt(v, Value); + std::cout << "未完成" << std::endl; + return 0; + } + else + { + Sq_pushbool(v, false); + return 1; + } + return 0; +} +//读内存 +static SQInteger LReadAddressFloat(HSQUIRRELVM v) +{ + //内存地址 int型 + int Address; + Sq_getinteger(v, 2, &Address); + Sq_pushfloat(v, *(float*)Address); + return 1; +} +//写内存 +static SQInteger LWriteAddressB(HSQUIRRELVM v) +{ + //内存地址 int型 + int Address; + + //获取参数个数 + int ParameterNum = Sq_gettop(v); + //1个参数时 + if (ParameterNum == 3) + { + //获取地址 + Sq_getinteger(v, 2, &Address); + //获取修改的值 + int WriteValue; + Sq_getinteger(v, 3, &WriteValue); + *(BYTE*)Address = (BYTE)WriteValue; + Sq_pushbool(v, true); + return 1; + } + if (ParameterNum == 4) + { + //地址 + int Address; + //偏移 + const SQChar* offset; + //修改值 + int WriteValue; + + Sq_getinteger(v, 2, &Address); + Sq_getstring(v, 3, &offset); + Sq_getinteger(v, 4, &WriteValue); + int SelectAddress = DNFTOOL::GetHook(Address, DNFTOOL::wchar_tTochar((wchar_t*)offset), 1); + *(BYTE*)Address = (BYTE)WriteValue; + } + else + { + Sq_pushbool(v, false); + return 1; + } + return 0; +} +//写内存 +static SQInteger LWriteAddress(HSQUIRRELVM v) +{ + //内存地址 int型 + int Address; + + //获取参数个数 + int ParameterNum = Sq_gettop(v); + //1个参数时 + if (ParameterNum == 3) + { + //获取地址 + Sq_getinteger(v, 2, &Address); + //获取修改的值 + int WriteValue; + Sq_getinteger(v, 3, &WriteValue); + + *(int*)Address = WriteValue; + Sq_pushbool(v, true); + return 1; + } + if (ParameterNum == 4) + { + //地址 + int Address; + //偏移 + const SQChar* offset; + //修改值 + int WriteValue; + + Sq_getinteger(v, 2, &Address); + Sq_getstring(v, 3, &offset); + Sq_getinteger(v, 4, &WriteValue); + + int SelectAddress = DNFTOOL::GetHook(Address, DNFTOOL::wchar_tTochar((wchar_t*)offset), 1); + *(int*)SelectAddress = WriteValue; + } + else + { + Sq_pushbool(v, false); + return 1; + } + return 0; +} +//输出 +static SQInteger Sout(HSQUIRRELVM v) +{ + int Top = Sq_gettop(v); + if (Top <= 0) + { + sq_throwerror(v, L"Incorrect function argument"); + return 0; + } + + const SQChar* OutPutBuffer; + Sq_getstring(v, 2, &OutPutBuffer); + char* OutPutText = DNFTOOL::SquirrelU2W(OutPutBuffer); + + std::vector Data; + DNFTOOL::Split(OutPutText, Data, "%L"); + delete[]OutPutText; + + if (Top != Data.size() + 1) + { + sq_throwerror(v, L"Incorrect function argument"); + return 0; + } + + size_t Fnum = Data.size(); + if (Fnum > 1)Fnum -= 1; + std::string Text = ""; + for (size_t i = 0; i < Fnum; i++) + { + std::string Parameter; + //获取值的类型 + int ValueType = sq_gettype(v, 3 + i); + //判断值类型 + switch (ValueType) + { + case OT_INTEGER://int类型 + { + int Value; + Sq_getinteger(v, 3 + i, &Value); + Parameter = std::to_string(Value); + break; + } + case OT_FLOAT://float类型 + { + FLOAT Value; + Sq_getfloat(v, 3 + i, &Value); + std::ostringstream oss; + oss << Value; + std::string str(oss.str()); + Parameter = str; + break; + } + case OT_BOOL://bool类型 + { + SQBool Value; + Sq_getbool(v, 3 + i, &Value); + switch (Value) + { + case true: + Parameter = "true"; + break; + case false: + Parameter = "false"; + break; + } + //Parameter = std::to_string(Value); + break; + } + case OT_STRING://string类型 + { + const SQChar* Value; + Sq_getstring(v, 3 + i, &Value); + char* str = DNFTOOL::SquirrelU2W(Value); + Parameter = str; + delete[]str; + break; + } + default: + Parameter = " "; + break; + } + Text += Data[i]; + Text += Parameter; + } + std::cout << Text << std::endl; + return 0; +} + +static SQInteger Clock(HSQUIRRELVM v) +{ + Sq_pushinteger(v, clock()); + return 1; +} + +static SQInteger Getmicroseconds(HSQUIRRELVM v) +{ + auto now = std::chrono::high_resolution_clock::now(); + auto duration = now.time_since_epoch(); + auto microseconds = std::chrono::duration_cast(duration).count(); + Sq_pushfloat(v, microseconds / 1000); + return 1; +} +//新建窗口 +//窗口CALL +typedef void(__fastcall* NoticeTCall)(DWORD thisc, DWORD Seat, DWORD a1, char* a2, DWORD a3); +static NoticeTCall _NoticeTcall = (NoticeTCall)0xE6E070; +static void WindowsNotice(char* str, int type, int b) +{ + DWORD thisc = 0x1A5FB20; + thisc = *(DWORD*)thisc; + _NoticeTcall(thisc, 0, type, str, b); +} +static SQInteger NewWindows(HSQUIRRELVM v) +{ + const SQChar* str = NULL; + int type = NULL; + int color = NULL; + int num = Sq_gettop(v); + + if (num == 2 || num == 3 || num == 4) + { + switch (num) + { + case 2: + Sq_getstring(v, 2, &str); + break; + case 3: + Sq_getstring(v, 2, &str); + Sq_getinteger(v, 3, &type); + break; + case 4: + Sq_getstring(v, 2, &str); + Sq_getinteger(v, 3, &type); + Sq_getinteger(v, 4, &color); + break; + } + + char* OutPutText = DNFTOOL::SquirrelU2W(str); + WindowsNotice(OutPutText, type, color); + delete[]OutPutText; + Sq_pushbool(v, true); + } + else + { + Sq_pushbool(v, false); + } + + return 1; +} +static SQInteger sq_Cmd(HSQUIRRELVM v) +{ + const SQChar* OutPutBuffer; + Sq_getstring(v, 2, &OutPutBuffer); + char* OutPutText = DNFTOOL::SquirrelU2W(OutPutBuffer); + + system(OutPutText); + delete[]OutPutText; + return 0; +} +static SQInteger sq_CmdEx(HSQUIRRELVM v) +{ + const SQChar* OutPutBuffer; + Sq_getstring(v, 2, &OutPutBuffer); + char* OutPutText = DNFTOOL::SquirrelU2W((wchar_t*)OutPutBuffer); + + STARTUPINFOA si = { sizeof(STARTUPINFO) }; + PROCESS_INFORMATION pi; + + // 创建新进程 + BOOL result = CreateProcessA( + NULL, // 应用程序名称 + OutPutText, // 命令行参数 + NULL, // 进程安全属性 + NULL, // 线程安全属性 + FALSE, // 继承句柄选项 + 0, // 创建标志 + NULL, // 环境变量 + NULL, // 当前目录 + &si, // STARTUPINFO + &pi // PROCESS_INFORMATION + ); + + if (result) { + // 不等待新进程结束,直接关闭句柄 + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + else { + } + + delete[]OutPutText; + return 0; +} +//设置UI槽坐标 +static SQInteger SetSlot(HSQUIRRELVM v) +{ + int Type = NULL; + int Index = NULL; + int Xpos = NULL; + int Ypos = NULL; + + + int OneAddr = NULL; + int* xpos = NULL; + int* ypos = NULL; + + int ParameterNum = Sq_gettop(v); + + if (ParameterNum == 5) + { + Sq_getinteger(v, 2, &Type); + Sq_getinteger(v, 3, &Index); + Sq_getinteger(v, 4, &Xpos); + Sq_getinteger(v, 5, &Ypos); + + Sq_pop(v, ParameterNum); + + switch (Type) + { + case 0://拓展技能栏 + OneAddr = *(int*)0x1ADE0CC; + OneAddr = *(int*)(OneAddr + (0x60 + (4 * Index))); + xpos = (int*)(OneAddr + (0x14)); + ypos = (int*)(OneAddr + (0x18)); + *xpos = Xpos; + *ypos = Ypos; + break; + case 1://基础技能栏 + OneAddr = *(int*)0x1ADE0CC; + OneAddr = *(int*)(OneAddr + (0x30 + (4 * Index))); + xpos = (int*)(OneAddr + (0x14)); + ypos = (int*)(OneAddr + (0x18)); + *xpos = Xpos; + *ypos = Ypos; + break; + case 2://切换技能栏 + OneAddr = *(int*)0x1ADE0CC; + OneAddr = *(int*)(OneAddr + (0x124 + (4 * Index))); + xpos = (int*)(OneAddr + (0x14)); + ypos = (int*)(OneAddr + (0x18)); + *xpos = Xpos; + *ypos = Ypos; + break; + case 3://快捷物品栏 + OneAddr = *(int*)0x1ADE0CC; + OneAddr = *(int*)(OneAddr + (0x18 + (4 * Index))); + xpos = (int*)(OneAddr + (0x14)); + ypos = (int*)(OneAddr + (0x18)); + *xpos = Xpos; + *ypos = Ypos; + break; + case 4://特性技能展开栏 + OneAddr = *(int*)0x1ADE0CC; + OneAddr = *(int*)(OneAddr + 0xC); + OneAddr = *(int*)(OneAddr + 0x4); + OneAddr = *(int*)(OneAddr + 0x0); + OneAddr = *(int*)(OneAddr + 0x34); + OneAddr = *(int*)(OneAddr + 0x4); + OneAddr = *(int*)(OneAddr + 0x28); + OneAddr = *(int*)(OneAddr + 0x4); + + xpos = (int*)(OneAddr + (0x394)); + ypos = (int*)(OneAddr + (0x398)); + *xpos = Xpos; + *ypos = Ypos; + break; + case 5://特性技能技能栏 + OneAddr = *(int*)(0x16E95AC + 0x400000); + OneAddr = *(int*)(OneAddr + 0x68); + OneAddr = *(int*)(OneAddr + 0x0); + OneAddr = *(int*)(OneAddr + 0x8); + OneAddr = *(int*)(OneAddr + 0x64); + OneAddr = *(int*)(OneAddr + 0x0); + OneAddr = *(int*)(OneAddr + 0x1C); + OneAddr = *(int*)(OneAddr + 0x0); + + xpos = (int*)(OneAddr + (0x1794)); + ypos = (int*)(OneAddr + (0x1798)); + *xpos = Xpos; + *ypos = Ypos; + break; + case 6://菜单栏 + OneAddr = *(int*)0x1ADE0CC; + OneAddr = *(int*)(OneAddr + (0x84 + (4 * Index))); + xpos = (int*)(OneAddr + (0x14)); + ypos = (int*)(OneAddr + (0x18)); + *xpos = Xpos; + *ypos = Ypos; + break; + } + + Sq_pushbool(v, true); + } + else + { + Sq_pushbool(v, false); + } + + return 1; +} + +//输入框相关 +struct InputWindowInfoS { + int x; + int y; + int width; + int height; + std::string str; +}; +LRESULT CALLBACK LenheartCode(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + HDC hdc; + PAINTSTRUCT ps; + static int mX, mY; + static HWND hwndButton; + static HWND hwndEditbox; + std::string strXy; + const int IDcmdButton = 1; + const int IDeditBox = 2; + static InputWindowInfoS* WInfo; + + + switch (message) { + case WM_CREATE: + { + RECT rect; + GetWindowRect(hwnd, &rect); // 获取窗口的矩形区域 + + // 获取传递的参数 + CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam; + WInfo = (InputWindowInfoS*)pCreate->lpCreateParams; + + hwndEditbox = CreateWindowA("edit", NULL, + WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, + 0, 0, + WInfo->width, WInfo->height, + hwnd, (HMENU)IDeditBox, NULL, NULL); + + ShowWindow(hwndEditbox, SW_SHOW); + UpdateWindow(hwndEditbox); + + + HFONT hFont = CreateFont(13.5, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, TEXT("Fonts\\msjh.ttf")); + SendMessage(hwndEditbox, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); + SetForegroundWindow(hwndEditbox); + + //如果有字先写进去 + if (WInfo->str.length() > 0)SetWindowTextA(hwndEditbox, WInfo->str.c_str()); + // 获取当前文本长度 + int length = GetWindowTextLengthA(hwndEditbox); + + // 将光标移动到文本末尾 + SendMessage(hwndEditbox, EM_SETSEL, length, length); + + return 0; + } + case WM_CTLCOLOREDIT: + { + HDC ahdc = (HDC)wParam; + SetTextColor(ahdc, RGB(0, 0, 0)); + //SetTextColor(ahdc, RGB(255, 255, 255)); + SetBkMode(ahdc, TRANSPARENT); // 设置背景透明 + return (INT_PTR)GetStockObject(NULL_BRUSH); // 返回空画刷 + //return 0; //返回句柄画刷时,背景颜色变为对应的背景颜色 + } + case WM_PAINT: + { + hdc = BeginPaint(hwnd, &ps); + EndPaint(hwnd, &ps); + return 0; + } + case WM_SIZE: + { + + return 0; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case 0: + PostQuitMessage(0); + break; + case IDeditBox: + if (HIWORD(wParam) == EN_CHANGE) { + char strbuf[256]; + // 编辑框内容发生变化 + GetWindowTextA(hwndEditbox, strbuf, 256); + //std::cout << strbuf << std::endl; + WInfo->str = strbuf; + } + + if (HIWORD(wParam) == EN_SETFOCUS) { + } + else if (HIWORD(wParam) == EN_KILLFOCUS) { + DestroyWindow(hwnd); //销毁窗口 + WInfo->str = "LenheartNULL"; + //CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam; + //delete[](InputWindowInfoS*)pCreate->lpCreateParams; + //pCreate->lpCreateParams = NULL; + //exit(0); + } + break; + } + return 0; + + case WM_MOUSEACTIVATE: + break; + + case WM_CLOSE: + DestroyWindow(hwnd); //销毁窗口 + return 0; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + + return DefWindowProc(hwnd, message, wParam, lParam); +} + +void LenheartWindows(LPVOID lpParam) { + + HWND DNFW = FindWindow(L"DNF Taiwan", L"DNF Taiwan"); // 替换"Window Title"为你要查找的窗口标题 + RECT rect; + GetWindowRect(DNFW, &rect); // 获取窗口的矩形区域 + + InputWindowInfoS* WInfo = (InputWindowInfoS*)lpParam; + + const wchar_t* className = L"myInputBoxClass"; + HINSTANCE hInstance = GetModuleHandle(NULL); + + WNDCLASS wc = {}; + wc.lpfnWndProc = LenheartCode; + wc.hInstance = hInstance; + wc.lpszClassName = className; + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0)); + //wc.hbrBackground = NULL; + + RegisterClass(&wc); + + // 创建输入框 + HWND hwnd = CreateWindowEx( + 0, className, L"Input Box", + WS_POPUP | WS_EX_TOOLWINDOW, + rect.left + WInfo->x, rect.top + WInfo->y, WInfo->width, WInfo->height, + NULL, NULL, hInstance, lpParam); + + + SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TOOLWINDOW); + SetLayeredWindowAttributes(hwnd, 0, 0, LWA_ALPHA); + + + ShowWindow(hwnd, SW_SHOW); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} +static SQInteger sq_NewInputBox(HSQUIRRELVM v) +{ + InputWindowInfoS* WInfo = new InputWindowInfoS(); + Sq_getinteger(v, 2, &WInfo->x); + Sq_getinteger(v, 3, &WInfo->y); + Sq_getinteger(v, 4, &WInfo->width); + Sq_getinteger(v, 5, &WInfo->height); + const SQChar* Str; + Sq_getstring(v, 6, &Str); + char* OutPutText = DNFTOOL::SquirrelU2W(Str); + std::string RealStr = OutPutText; + delete[]OutPutText; + WInfo->str = RealStr; + + + DWORD threadID3; + HANDLE Thand3 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)LenheartWindows, WInfo, 0, &threadID3); + + Sq_pushinteger(v, (int)WInfo); + return 1; +} + +static SQInteger sq_GetInputBoxStr(HSQUIRRELVM v) +{ + int Addr; + Sq_getinteger(v, 2, &Addr); + InputWindowInfoS* WInfo = (InputWindowInfoS*)Addr; + + std::string str = WInfo->str; + char* ss = DNFTOOL::GBKTOUTF8(str); + //wchar_t* name = DNFTOOL::charTowchar_t((char*)Buf.c_str()); + + wchar_t* aa = DNFTOOL::charTowchar_t(ss); + Sq_pushstring(v, aa, -1); + return 1; + +} + +static SQInteger sq_SetInputBoxStr(HSQUIRRELVM v) +{ + int Addr; + Sq_getinteger(v, 2, &Addr); + const SQChar* Str; + Sq_getstring(v, 3, &Str); + char* OutPutText = DNFTOOL::SquirrelU2W(Str); + std::string RealStr = OutPutText; + delete[]OutPutText; + + InputWindowInfoS* WInfo = (InputWindowInfoS*)Addr; + WInfo->str = RealStr; + return 0; + +} + +static SQInteger sq_MouseClick(HSQUIRRELVM v) +{ + // 模拟鼠标左键按下 + INPUT input = { 0 }; + input.type = INPUT_MOUSE; + input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; + SendInput(1, &input, sizeof(INPUT)); + + // 模拟鼠标左键抬起 + input.mi.dwFlags = MOUSEEVENTF_LEFTUP; + SendInput(1, &input, sizeof(INPUT)); + return 0; +} + +typedef int(_fastcall _112AF50)(DWORD thisc,DWORD Seat,int Idx , unsigned int NK); +static _112AF50* GetItem112AF50 = (_112AF50*)0x112AF50; +static _112AF50* Chanage112AF50 = (_112AF50*)0x8265A0; +static SQInteger sq_Test(HSQUIRRELVM v) +{ + int ObjectAddress = *(int*)0x1ab7cdc; + for (int i = 0; i < 0x1000; i+= 0x4) { + if (*(int*)(ObjectAddress + i)) { + int Buffer = DNFTOOL::DNFDeCode(ObjectAddress + i); + if (Buffer == 1073741824) std::cout << std::hex << (i) << std::endl;; + } + } + //Sq_pushinteger(v, Ret); + return 0; + +} + + + +void RegisterMyNutApi(wchar_t* funcName, SQFUNCTION funcAddr) +{ + HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544; + Sq_pushroottable(v); + Sq_pushstring(v, funcName, -1); + RealSqNewClosure(v, funcAddr, 0); + SQNewSlot(v, -3, SQFalse); + SQPopTop(v); +} + + +void R_Register_Nut() { + + RegisterMyNutApi(L"L_sq_Test", sq_Test);//zlib解压 + + RegisterMyNutApi(L"L_sq_GetLocalConfig", sq_GetLocalConfig);//获取本地配置 + RegisterMyNutApi(L"L_sq_SetLocalConfig", sq_SetLocalConfig);//设置本地配置 + RegisterMyNutApi(L"L_sq_LongLongOperation", sq_LongLongOperation);//longlong类型运算 + RegisterMyNutApi(L"L_sq_Dezlib", sq_Dezlib);//zlib解压 + RegisterMyNutApi(L"L_sq_DrawImg", sq_DrawImg);//绘制Img + RegisterMyNutApi(L"L_sq_SetDrawImgModel", sq_SetDrawImgModel);//设置Img绘制模式 + RegisterMyNutApi(L"L_sq_ReleaseDrawImgModel", sq_ReleaseDrawImgModel);//释放Img绘制模式 + RegisterMyNutApi(L"L_sq_IntiNumberDraw", sq_IntiNumberDraw);//初始化数字绘制 + RegisterMyNutApi(L"L_sq_DrawNumber", sq_DrawNumber);//绘制数字 + RegisterMyNutApi(L"L_sq_DrawWindow", sq_DrawWindow);//绘制九宫格 + RegisterMyNutApi(L"L_sq_DrawButton", sq_DrawButton);//绘制三联图 + RegisterMyNutApi(L"L_sq_GetStringDrawLength", Sq_getstringDrawLength);//获取文字绘制长度 + RegisterMyNutApi(L"L_sq_GetStringDrawArray", Sq_getstringDrawArray);//获取文字换行返回数组 + RegisterMyNutApi(L"L_sq_DecondeJson", DecondeJson);//反序列化Json + RegisterMyNutApi(L"L_sq_EncondeJson", EncondeJson);//序列化Json + + RegisterMyNutApi(L"L_sq_IsKeyDown", sq_IsKeyDown);//按键是否按下 + RegisterMyNutApi(L"L_sq_MouseClick", sq_MouseClick);//按下鼠标左键 + + RegisterMyNutApi(L"L_sq_Open_ExWindow", sq_Open_ExWindow);//创建特殊窗口 + RegisterMyNutApi(L"L_sq_Open_ExWindow2", sq_Open_ExWindow2);//创建特殊窗口 + RegisterMyNutApi(L"L_sq_GetWindowById", sq_GetWindowById);//通过ID获取窗口地址 + RegisterMyNutApi(L"L_sq_Select_MiniMap_Index", sq_Select_MiniMap_Index);//选择大地图区域 + + RegisterMyNutApi(L"L_Sq_DrawSkill", sq_DrawSkill);//绘制技能 + RegisterMyNutApi(L"L_sq_UseSkill", sq_UseSkill);//使用技能 + + RegisterMyNutApi(L"L_Sq_GetPlayerEachName", sq_GetPlayerEachName);//获取当前选择交互角色姓名 + RegisterMyNutApi(L"L_Sq_GetSkillAddress", sq_GetSkillAddress);//获取技能地址 + + RegisterMyNutApi(L"L_sq_MoveMap", sq_MoveMap);//顺图 + + RegisterMyNutApi(L"L_Sq_GetImg", sq_GetImg);//通过Item编号获取图标Img + RegisterMyNutApi(L"L_Sq_DrawItem", sq_DrawItem);//绘制Item + + RegisterMyNutApi(L"L_Sq_GetObjectAddress", GetObjectAddress);//获取对象地址 + RegisterMyNutApi(L"L_Sq_GetRidingObjectAddress", GetRidingObjectAddress);//获取骑乘对象地址 + RegisterMyNutApi(L"L_Sq_GetObjectName", GetObjectName);//获取对象名字 + RegisterMyNutApi(L"L_Sq_GetObjectNameByAddress", GetObjectNameByAddress);//获取对象名字 + RegisterMyNutApi(L"L_Sq_GetObjectInfo", GetObjectInfo);//获取对象信息 + RegisterMyNutApi(L"L_Sq_GetObjectDeInfo", GetObjectDeInfo);//获取对象加密信息 + RegisterMyNutApi(L"L_Sq_SetObjectInfo", SetObjectInfo);//设置对象信息 + RegisterMyNutApi(L"L_Sq_SetObjectDeInfo", SetObjectDeInfo);//设置对象加密信息 + RegisterMyNutApi(L"L_Sq_GetObjectLevel", GetObjectLevel);//获取对象等级 + RegisterMyNutApi(L"L_Sq_GetObjectIsCharacter", GetObjectIsCharacter);//获取对象是否是玩家 + RegisterMyNutApi(L"L_Sq_GetObjectAttribute", GetObjectAttribute);//获取对象属性 + + RegisterMyNutApi(L"L_sq_GetCharacterAttribute", GetCharacterAttribute);//获取人物或装备属性 + RegisterMyNutApi(L"L_sq_SetCharacterAttribute", SetCharacterAttribute);//设置人物或装备属性 + + + RegisterMyNutApi(L"L_sq_GetTownIndex", GetTownIndex);//获取城镇编号 + RegisterMyNutApi(L"L_sq_GetRegionIndex", GetRegionIndex);//获取区域编号 + RegisterMyNutApi(L"L_sq_GetTownXpos", GetTownXpos);//获取城镇X坐标 + RegisterMyNutApi(L"L_sq_GetTownYpos", GetTownYpos);//获取城镇Y坐标 + + RegisterMyNutApi(L"L_sq_GetFatigue", GetFatigue);//获取疲劳值 + RegisterMyNutApi(L"L_sq_GetExp", GetExp);//获取经验值 + RegisterMyNutApi(L"L_sq_GetSp", sq_GetSp);//获取SP点 + RegisterMyNutApi(L"L_sq_GetPassLevel", sq_GetPassLevel);//获取冒险团等级 + RegisterMyNutApi(L"L_sq_RefreshEventIcon", sq_RefreshEventIcon);//刷新活动图标 + + RegisterMyNutApi(L"L_sq_SendPackType", SendPackType);//发包类型 + RegisterMyNutApi(L"L_sq_SendPackByte", SendPackByte);//包数据Byte + RegisterMyNutApi(L"L_sq_SendPackWord", SendPackWord);//包数据Word + RegisterMyNutApi(L"L_sq_SendPackDWord", SendPackDWord);//包数据DWord + RegisterMyNutApi(L"L_sq_SendPackWChar", SendPackWChar);//包数据DWord + RegisterMyNutApi(L"L_sq_SendPack", SendPack);//发包 + + RegisterMyNutApi(L"L_sq_GoDungeon", GoDungeon);//去副本 + RegisterMyNutApi(L"L_sq_GoTown", GoTown);//去城镇 + RegisterMyNutApi(L"L_sq_MoveTown", MoveTown);//去城镇 + + RegisterMyNutApi(L"L_sq_DrawCode", sq_DrawCode);//绘制字符 //TODO + + RegisterMyNutApi(L"L_sq_RA", LReadAddress);//读内存 + RegisterMyNutApi(L"L_sq_WA", LWriteAddress);//写内存 + + RegisterMyNutApi(L"L_sq_RAF", LReadAddressFloat);//读内存 + //RegisterMyNutApi(L"L_sq_WAF", LWriteAddressFloat);//写内存 + + RegisterMyNutApi(L"L_sq_RAB", LReadAddressB);//读内存 + RegisterMyNutApi(L"L_sq_WAB", LWriteAddressB);//写内存 + + RegisterMyNutApi(L"Sout", Sout);//输出 + RegisterMyNutApi(L"Clock", Clock);//输出 + RegisterMyNutApi(L"L_Getmicroseconds", Getmicroseconds);//获取微秒级 + + RegisterMyNutApi(L"L_NewWindows", NewWindows);//创建窗口 + RegisterMyNutApi(L"L_Cmd", sq_Cmd);//执行Cmd命令 + RegisterMyNutApi(L"L_CmdEx", sq_CmdEx);//执行Cmd命令Ex + + RegisterMyNutApi(L"L_SetSlot", SetSlot);//设置槽坐标 + + RegisterMyNutApi(L"L_RegisterItemColor_STL", RegisterItemColor_STL);//注册Item颜色 + + //输入框 + RegisterMyNutApi(L"L_sq_GetInputBoxStr", sq_GetInputBoxStr); + RegisterMyNutApi(L"L_sq_SetInputBoxStr", sq_SetInputBoxStr); + RegisterMyNutApi(L"L_sq_NewInputBox", sq_NewInputBox); +} \ No newline at end of file diff --git a/Include/httplib.h b/Include/httplib.h new file mode 100644 index 0000000..a5d4bbb --- /dev/null +++ b/Include/httplib.h @@ -0,0 +1,8170 @@ +// +// httplib.h +// +// Copyright (c) 2021 Yuji Hirose. All rights reserved. +// MIT License +// + +#ifndef CPPHTTPLIB_HTTPLIB_H +#define CPPHTTPLIB_HTTPLIB_H + +/* + * Configuration + */ + +#ifndef CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND +#define CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND 500 +#endif + +#ifndef CPPHTTPLIB_KEEPALIVE_MAX_COUNT +#define CPPHTTPLIB_KEEPALIVE_MAX_COUNT 500 +#endif + +#ifndef CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND +#define CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND 30000 +#endif + +#ifndef CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND +#define CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND 0 +#endif + +#ifndef CPPHTTPLIB_READ_TIMEOUT_SECOND +#define CPPHTTPLIB_READ_TIMEOUT_SECOND 500 +#endif + +#ifndef CPPHTTPLIB_READ_TIMEOUT_USECOND +#define CPPHTTPLIB_READ_TIMEOUT_USECOND 0 +#endif + +#ifndef CPPHTTPLIB_WRITE_TIMEOUT_SECOND +#define CPPHTTPLIB_WRITE_TIMEOUT_SECOND 500 +#endif + +#ifndef CPPHTTPLIB_WRITE_TIMEOUT_USECOND +#define CPPHTTPLIB_WRITE_TIMEOUT_USECOND 0 +#endif + +#ifndef CPPHTTPLIB_IDLE_INTERVAL_SECOND +#define CPPHTTPLIB_IDLE_INTERVAL_SECOND 0 +#endif + +#ifndef CPPHTTPLIB_IDLE_INTERVAL_USECOND +#ifdef _WIN32 +#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 10000 +#else +#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 0 +#endif +#endif + +#ifndef CPPHTTPLIB_REQUEST_URI_MAX_LENGTH +#define CPPHTTPLIB_REQUEST_URI_MAX_LENGTH 8192 +#endif + +#ifndef CPPHTTPLIB_HEADER_MAX_LENGTH +#define CPPHTTPLIB_HEADER_MAX_LENGTH 81920 +#endif + +#ifndef CPPHTTPLIB_REDIRECT_MAX_COUNT +#define CPPHTTPLIB_REDIRECT_MAX_COUNT 20 +#endif + +#ifndef CPPHTTPLIB_PAYLOAD_MAX_LENGTH +#define CPPHTTPLIB_PAYLOAD_MAX_LENGTH ((std::numeric_limits::max)()) +#endif + +#ifndef CPPHTTPLIB_TCP_NODELAY +#define CPPHTTPLIB_TCP_NODELAY false +#endif + +#ifndef CPPHTTPLIB_RECV_BUFSIZ +#define CPPHTTPLIB_RECV_BUFSIZ size_t(4096u) +#endif + +#ifndef CPPHTTPLIB_COMPRESSION_BUFSIZ +#define CPPHTTPLIB_COMPRESSION_BUFSIZ size_t(16384u) +#endif + +#ifndef CPPHTTPLIB_THREAD_POOL_COUNT +#define CPPHTTPLIB_THREAD_POOL_COUNT \ + ((std::max)(8u, std::thread::hardware_concurrency() > 0 \ + ? std::thread::hardware_concurrency() - 1 \ + : 0)) +#endif + +#ifndef CPPHTTPLIB_RECV_FLAGS +#define CPPHTTPLIB_RECV_FLAGS 0 +#endif + +#ifndef CPPHTTPLIB_SEND_FLAGS +#define CPPHTTPLIB_SEND_FLAGS 0 +#endif + +#ifndef CPPHTTPLIB_LISTEN_BACKLOG +#define CPPHTTPLIB_LISTEN_BACKLOG 5 +#endif + +/* + * Headers + */ + +#ifdef _WIN32 +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif //_CRT_SECURE_NO_WARNINGS + +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE +#endif //_CRT_NONSTDC_NO_DEPRECATE + +#if defined(_MSC_VER) +#ifdef _WIN64 +using ssize_t = __int64; +#else +using ssize_t = int; +#endif + +#if _MSC_VER < 1900 +#define snprintf _snprintf_s +#endif +#endif // _MSC_VER + +#ifndef S_ISREG +#define S_ISREG(m) (((m)&S_IFREG) == S_IFREG) +#endif // S_ISREG + +#ifndef S_ISDIR +#define S_ISDIR(m) (((m)&S_IFDIR) == S_IFDIR) +#endif // S_ISDIR + +#ifndef NOMINMAX +#define NOMINMAX +#endif // NOMINMAX + +#include +#include + +#include +#include + +#ifndef WSA_FLAG_NO_HANDLE_INHERIT +#define WSA_FLAG_NO_HANDLE_INHERIT 0x80 +#endif + +#ifdef _MSC_VER +#pragma comment(lib, "ws2_32.lib") +#pragma comment(lib, "crypt32.lib") +#pragma comment(lib, "cryptui.lib") +#endif + +#ifndef strcasecmp +#define strcasecmp _stricmp +#endif // strcasecmp + +using socket_t = SOCKET; +#ifdef CPPHTTPLIB_USE_POLL +#define poll(fds, nfds, timeout) WSAPoll(fds, nfds, timeout) +#endif + +#else // not _WIN32 + +#include +#include +#include +#include +#include +#ifdef __linux__ +#include +#endif +#include +#ifdef CPPHTTPLIB_USE_POLL +#include +#endif +#include +#include +#include +#include +#include + +using socket_t = int; +#ifndef INVALID_SOCKET +#define INVALID_SOCKET (-1) +#endif +#endif //_WIN32 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +// these are defined in wincrypt.h and it breaks compilation if BoringSSL is +// used +#ifdef _WIN32 +#undef X509_NAME +#undef X509_CERT_PAIR +#undef X509_EXTENSIONS +#undef PKCS7_SIGNER_INFO +#endif + +#include +#include +#include +#include + +#if defined(_WIN32) && defined(OPENSSL_USE_APPLINK) +#include +#endif + +#include +#include + +#if OPENSSL_VERSION_NUMBER < 0x1010100fL +#error Sorry, OpenSSL versions prior to 1.1.1 are not supported +#endif + +#if OPENSSL_VERSION_NUMBER < 0x10100000L +#include +inline const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *asn1) { + return M_ASN1_STRING_data(asn1); +} +#endif +#endif + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +#include +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +#include +#include +#endif + +/* + * Declaration + */ +namespace httplib { + +namespace detail { + +/* + * Backport std::make_unique from C++14. + * + * NOTE: This code came up with the following stackoverflow post: + * https://stackoverflow.com/questions/10149840/c-arrays-and-make-unique + * + */ + +template +typename std::enable_if::value, std::unique_ptr>::type +make_unique(Args &&...args) { + return std::unique_ptr(new T(std::forward(args)...)); +} + +template +typename std::enable_if::value, std::unique_ptr>::type +make_unique(std::size_t n) { + typedef typename std::remove_extent::type RT; + return std::unique_ptr(new RT[n]); +} + +struct ci { + bool operator()(const std::string &s1, const std::string &s2) const { + return std::lexicographical_compare(s1.begin(), s1.end(), s2.begin(), + s2.end(), + [](unsigned char c1, unsigned char c2) { + return ::tolower(c1) < ::tolower(c2); + }); + } +}; + +} // namespace detail + +using Headers = std::multimap; + +using Params = std::multimap; +using Match = std::smatch; + +using Progress = std::function; + +struct Response; +using ResponseHandler = std::function; + +struct MultipartFormData { + std::string name; + std::string content; + std::string filename; + std::string content_type; +}; +using MultipartFormDataItems = std::vector; +using MultipartFormDataMap = std::multimap; + +class DataSink { +public: + DataSink() : os(&sb_), sb_(*this) {} + + DataSink(const DataSink &) = delete; + DataSink &operator=(const DataSink &) = delete; + DataSink(DataSink &&) = delete; + DataSink &operator=(DataSink &&) = delete; + + std::function write; + std::function done; + std::function is_writable; + std::ostream os; + +private: + class data_sink_streambuf : public std::streambuf { + public: + explicit data_sink_streambuf(DataSink &sink) : sink_(sink) {} + + protected: + std::streamsize xsputn(const char *s, std::streamsize n) { + sink_.write(s, static_cast(n)); + return n; + } + + private: + DataSink &sink_; + }; + + data_sink_streambuf sb_; +}; + +using ContentProvider = + std::function; + +using ContentProviderWithoutLength = + std::function; + +using ContentProviderResourceReleaser = std::function; + +using ContentReceiverWithProgress = + std::function; + +using ContentReceiver = + std::function; + +using MultipartContentHeader = + std::function; + +class ContentReader { +public: + using Reader = std::function; + using MultipartReader = std::function; + + ContentReader(Reader reader, MultipartReader multipart_reader) + : reader_(std::move(reader)), + multipart_reader_(std::move(multipart_reader)) {} + + bool operator()(MultipartContentHeader header, + ContentReceiver receiver) const { + return multipart_reader_(std::move(header), std::move(receiver)); + } + + bool operator()(ContentReceiver receiver) const { + return reader_(std::move(receiver)); + } + + Reader reader_; + MultipartReader multipart_reader_; +}; + +using Range = std::pair; +using Ranges = std::vector; + +struct Request { + std::string method; + std::string path; + Headers headers; + std::string body; + + std::string remote_addr; + int remote_port = -1; + + // for server + std::string version; + std::string target; + Params params; + MultipartFormDataMap files; + Ranges ranges; + Match matches; + + // for client + ResponseHandler response_handler; + ContentReceiverWithProgress content_receiver; + Progress progress; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + const SSL *ssl = nullptr; +#endif + + bool has_header(const char *key) const; + std::string get_header_value(const char *key, size_t id = 0) const; + template + T get_header_value(const char *key, size_t id = 0) const; + size_t get_header_value_count(const char *key) const; + void set_header(const char *key, const char *val); + void set_header(const char *key, const std::string &val); + + bool has_param(const char *key) const; + std::string get_param_value(const char *key, size_t id = 0) const; + size_t get_param_value_count(const char *key) const; + + bool is_multipart_form_data() const; + + bool has_file(const char *key) const; + MultipartFormData get_file_value(const char *key) const; + + // private members... + size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT; + size_t content_length_ = 0; + ContentProvider content_provider_; + bool is_chunked_content_provider_ = false; + size_t authorization_count_ = 0; +}; + +struct Response { + std::string version; + int status = -1; + std::string reason; + Headers headers; + std::string body; + std::string location; // Redirect location + + bool has_header(const char *key) const; + std::string get_header_value(const char *key, size_t id = 0) const; + template + T get_header_value(const char *key, size_t id = 0) const; + size_t get_header_value_count(const char *key) const; + void set_header(const char *key, const char *val); + void set_header(const char *key, const std::string &val); + + void set_redirect(const char *url, int status = 302); + void set_redirect(const std::string &url, int status = 302); + void set_content(const char *s, size_t n, const char *content_type); + void set_content(const std::string &s, const char *content_type); + + void set_content_provider( + size_t length, const char *content_type, ContentProvider provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + void set_content_provider( + const char *content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + void set_chunked_content_provider( + const char *content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + Response() = default; + Response(const Response &) = default; + Response &operator=(const Response &) = default; + Response(Response &&) = default; + Response &operator=(Response &&) = default; + ~Response() { + if (content_provider_resource_releaser_) { + content_provider_resource_releaser_(content_provider_success_); + } + } + + // private members... + size_t content_length_ = 0; + ContentProvider content_provider_; + ContentProviderResourceReleaser content_provider_resource_releaser_; + bool is_chunked_content_provider_ = false; + bool content_provider_success_ = false; +}; + +class Stream { +public: + virtual ~Stream() = default; + + virtual bool is_readable() const = 0; + virtual bool is_writable() const = 0; + + virtual ssize_t read(char *ptr, size_t size) = 0; + virtual ssize_t write(const char *ptr, size_t size) = 0; + virtual void get_remote_ip_and_port(std::string &ip, int &port) const = 0; + virtual socket_t socket() const = 0; + + template + ssize_t write_format(const char *fmt, const Args &...args); + ssize_t write(const char *ptr); + ssize_t write(const std::string &s); +}; + +class TaskQueue { +public: + TaskQueue() = default; + virtual ~TaskQueue() = default; + + virtual void enqueue(std::function fn) = 0; + virtual void shutdown() = 0; + + virtual void on_idle() {} +}; + +class ThreadPool : public TaskQueue { +public: + explicit ThreadPool(size_t n) : shutdown_(false) { + while (n) { + threads_.emplace_back(worker(*this)); + n--; + } + } + + ThreadPool(const ThreadPool &) = delete; + ~ThreadPool() override = default; + + void enqueue(std::function fn) override { + std::unique_lock lock(mutex_); + jobs_.push_back(std::move(fn)); + cond_.notify_one(); + } + + void shutdown() override { + // Stop all worker threads... + { + std::unique_lock lock(mutex_); + shutdown_ = true; + } + + cond_.notify_all(); + + // Join... + for (auto &t : threads_) { + t.join(); + } + } + +private: + struct worker { + explicit worker(ThreadPool &pool) : pool_(pool) {} + + void operator()() { + for (;;) { + std::function fn; + { + std::unique_lock lock(pool_.mutex_); + + pool_.cond_.wait( + lock, [&] { return !pool_.jobs_.empty() || pool_.shutdown_; }); + + if (pool_.shutdown_ && pool_.jobs_.empty()) { break; } + + fn = pool_.jobs_.front(); + pool_.jobs_.pop_front(); + } + + assert(true == static_cast(fn)); + fn(); + } + } + + ThreadPool &pool_; + }; + friend struct worker; + + std::vector threads_; + std::list> jobs_; + + bool shutdown_; + + std::condition_variable cond_; + std::mutex mutex_; +}; + +using Logger = std::function; + +using SocketOptions = std::function; + +void default_socket_options(socket_t sock); + +class Server { +public: + using Handler = std::function; + + using ExceptionHandler = + std::function; + + enum class HandlerResponse { + Handled, + Unhandled, + }; + using HandlerWithResponse = + std::function; + + using HandlerWithContentReader = std::function; + + using Expect100ContinueHandler = + std::function; + + Server(); + + virtual ~Server(); + + virtual bool is_valid() const; + + Server &Get(const std::string &pattern, Handler handler); + Server &Post(const std::string &pattern, Handler handler); + Server &Post(const std::string &pattern, HandlerWithContentReader handler); + Server &Put(const std::string &pattern, Handler handler); + Server &Put(const std::string &pattern, HandlerWithContentReader handler); + Server &Patch(const std::string &pattern, Handler handler); + Server &Patch(const std::string &pattern, HandlerWithContentReader handler); + Server &Delete(const std::string &pattern, Handler handler); + Server &Delete(const std::string &pattern, HandlerWithContentReader handler); + Server &Options(const std::string &pattern, Handler handler); + + bool set_base_dir(const std::string &dir, + const std::string &mount_point = std::string()); + bool set_mount_point(const std::string &mount_point, const std::string &dir, + Headers headers = Headers()); + bool remove_mount_point(const std::string &mount_point); + Server &set_file_extension_and_mimetype_mapping(const char *ext, + const char *mime); + Server &set_file_request_handler(Handler handler); + + Server &set_error_handler(HandlerWithResponse handler); + Server &set_error_handler(Handler handler); + Server &set_exception_handler(ExceptionHandler handler); + Server &set_pre_routing_handler(HandlerWithResponse handler); + Server &set_post_routing_handler(Handler handler); + + Server &set_expect_100_continue_handler(Expect100ContinueHandler handler); + Server &set_logger(Logger logger); + + Server &set_address_family(int family); + Server &set_tcp_nodelay(bool on); + Server &set_socket_options(SocketOptions socket_options); + + Server &set_default_headers(Headers headers); + + Server &set_keep_alive_max_count(size_t count); + Server &set_keep_alive_timeout(time_t sec); + + Server &set_read_timeout(time_t sec, time_t usec = 0); + template + Server &set_read_timeout(const std::chrono::duration &duration); + + Server &set_write_timeout(time_t sec, time_t usec = 0); + template + Server &set_write_timeout(const std::chrono::duration &duration); + + Server &set_idle_interval(time_t sec, time_t usec = 0); + template + Server &set_idle_interval(const std::chrono::duration &duration); + + Server &set_payload_max_length(size_t length); + + bool bind_to_port(const char *host, int port, int socket_flags = 0); + int bind_to_any_port(const char *host, int socket_flags = 0); + bool listen_after_bind(); + + bool listen(const char *host, int port, int socket_flags = 0); + + bool is_running() const; + void stop(); + + std::function new_task_queue; + +protected: + bool process_request(Stream &strm, bool close_connection, + bool &connection_closed, + const std::function &setup_request); + + std::atomic svr_sock_; + size_t keep_alive_max_count_ = CPPHTTPLIB_KEEPALIVE_MAX_COUNT; + time_t keep_alive_timeout_sec_ = CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND; + time_t read_timeout_sec_ = CPPHTTPLIB_READ_TIMEOUT_SECOND; + time_t read_timeout_usec_ = CPPHTTPLIB_READ_TIMEOUT_USECOND; + time_t write_timeout_sec_ = CPPHTTPLIB_WRITE_TIMEOUT_SECOND; + time_t write_timeout_usec_ = CPPHTTPLIB_WRITE_TIMEOUT_USECOND; + time_t idle_interval_sec_ = CPPHTTPLIB_IDLE_INTERVAL_SECOND; + time_t idle_interval_usec_ = CPPHTTPLIB_IDLE_INTERVAL_USECOND; + size_t payload_max_length_ = CPPHTTPLIB_PAYLOAD_MAX_LENGTH; + +private: + using Handlers = std::vector>; + using HandlersForContentReader = + std::vector>; + + socket_t create_server_socket(const char *host, int port, int socket_flags, + SocketOptions socket_options) const; + int bind_internal(const char *host, int port, int socket_flags); + bool listen_internal(); + + bool routing(Request &req, Response &res, Stream &strm); + bool handle_file_request(const Request &req, Response &res, + bool head = false); + bool dispatch_request(Request &req, Response &res, const Handlers &handlers); + bool + dispatch_request_for_content_reader(Request &req, Response &res, + ContentReader content_reader, + const HandlersForContentReader &handlers); + + bool parse_request_line(const char *s, Request &req); + void apply_ranges(const Request &req, Response &res, + std::string &content_type, std::string &boundary); + bool write_response(Stream &strm, bool close_connection, const Request &req, + Response &res); + bool write_response_with_content(Stream &strm, bool close_connection, + const Request &req, Response &res); + bool write_response_core(Stream &strm, bool close_connection, + const Request &req, Response &res, + bool need_apply_ranges); + bool write_content_with_provider(Stream &strm, const Request &req, + Response &res, const std::string &boundary, + const std::string &content_type); + bool read_content(Stream &strm, Request &req, Response &res); + bool + read_content_with_content_receiver(Stream &strm, Request &req, Response &res, + ContentReceiver receiver, + MultipartContentHeader multipart_header, + ContentReceiver multipart_receiver); + bool read_content_core(Stream &strm, Request &req, Response &res, + ContentReceiver receiver, + MultipartContentHeader mulitpart_header, + ContentReceiver multipart_receiver); + + virtual bool process_and_close_socket(socket_t sock); + + struct MountPointEntry { + std::string mount_point; + std::string base_dir; + Headers headers; + }; + std::vector base_dirs_; + + std::atomic is_running_; + std::map file_extension_and_mimetype_map_; + Handler file_request_handler_; + Handlers get_handlers_; + Handlers post_handlers_; + HandlersForContentReader post_handlers_for_content_reader_; + Handlers put_handlers_; + HandlersForContentReader put_handlers_for_content_reader_; + Handlers patch_handlers_; + HandlersForContentReader patch_handlers_for_content_reader_; + Handlers delete_handlers_; + HandlersForContentReader delete_handlers_for_content_reader_; + Handlers options_handlers_; + HandlerWithResponse error_handler_; + ExceptionHandler exception_handler_; + HandlerWithResponse pre_routing_handler_; + Handler post_routing_handler_; + Logger logger_; + Expect100ContinueHandler expect_100_continue_handler_; + + int address_family_ = AF_UNSPEC; + bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; + SocketOptions socket_options_ = default_socket_options; + + Headers default_headers_; +}; + +enum class Error { + Success = 0, + Unknown, + Connection, + BindIPAddress, + Read, + Write, + ExceedRedirectCount, + Canceled, + SSLConnection, + SSLLoadingCerts, + SSLServerVerification, + UnsupportedMultipartBoundaryChars, + Compression, + ConnectionTimeout, +}; + +std::string to_string(const Error error); + +std::ostream &operator<<(std::ostream &os, const Error &obj); + +class Result { +public: + Result(std::unique_ptr &&res, Error err, + Headers &&request_headers = Headers{}) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)) {} + // Response + operator bool() const { return res_ != nullptr; } + bool operator==(std::nullptr_t) const { return res_ == nullptr; } + bool operator!=(std::nullptr_t) const { return res_ != nullptr; } + const Response &value() const { return *res_; } + Response &value() { return *res_; } + const Response &operator*() const { return *res_; } + Response &operator*() { return *res_; } + const Response *operator->() const { return res_.get(); } + Response *operator->() { return res_.get(); } + + // Error + Error error() const { return err_; } + + // Request Headers + bool has_request_header(const char *key) const; + std::string get_request_header_value(const char *key, size_t id = 0) const; + template + T get_request_header_value(const char *key, size_t id = 0) const; + size_t get_request_header_value_count(const char *key) const; + +private: + std::unique_ptr res_; + Error err_; + Headers request_headers_; +}; + +class ClientImpl { +public: + explicit ClientImpl(const std::string &host); + + explicit ClientImpl(const std::string &host, int port); + + explicit ClientImpl(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path); + + virtual ~ClientImpl(); + + virtual bool is_valid() const; + + Result Get(const char *path); + Result Get(const char *path, const Headers &headers); + Result Get(const char *path, Progress progress); + Result Get(const char *path, const Headers &headers, Progress progress); + Result Get(const char *path, ContentReceiver content_receiver); + Result Get(const char *path, const Headers &headers, + ContentReceiver content_receiver); + Result Get(const char *path, ContentReceiver content_receiver, + Progress progress); + Result Get(const char *path, const Headers &headers, + ContentReceiver content_receiver, Progress progress); + Result Get(const char *path, ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const char *path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const char *path, ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress); + Result Get(const char *path, const Headers &headers, + ResponseHandler response_handler, ContentReceiver content_receiver, + Progress progress); + + Result Get(const char *path, const Params ¶ms, const Headers &headers, + Progress progress = nullptr); + Result Get(const char *path, const Params ¶ms, const Headers &headers, + ContentReceiver content_receiver, Progress progress = nullptr); + Result Get(const char *path, const Params ¶ms, const Headers &headers, + ResponseHandler response_handler, ContentReceiver content_receiver, + Progress progress = nullptr); + + Result Head(const char *path); + Result Head(const char *path, const Headers &headers); + + Result Post(const char *path); + Result Post(const char *path, const char *body, size_t content_length, + const char *content_type); + Result Post(const char *path, const Headers &headers, const char *body, + size_t content_length, const char *content_type); + Result Post(const char *path, const std::string &body, + const char *content_type); + Result Post(const char *path, const Headers &headers, const std::string &body, + const char *content_type); + Result Post(const char *path, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Post(const char *path, ContentProviderWithoutLength content_provider, + const char *content_type); + Result Post(const char *path, const Headers &headers, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Post(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type); + Result Post(const char *path, const Params ¶ms); + Result Post(const char *path, const Headers &headers, const Params ¶ms); + Result Post(const char *path, const MultipartFormDataItems &items); + Result Post(const char *path, const Headers &headers, + const MultipartFormDataItems &items); + Result Post(const char *path, const Headers &headers, + const MultipartFormDataItems &items, const std::string &boundary); + + Result Put(const char *path); + Result Put(const char *path, const char *body, size_t content_length, + const char *content_type); + Result Put(const char *path, const Headers &headers, const char *body, + size_t content_length, const char *content_type); + Result Put(const char *path, const std::string &body, + const char *content_type); + Result Put(const char *path, const Headers &headers, const std::string &body, + const char *content_type); + Result Put(const char *path, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Put(const char *path, ContentProviderWithoutLength content_provider, + const char *content_type); + Result Put(const char *path, const Headers &headers, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Put(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type); + Result Put(const char *path, const Params ¶ms); + Result Put(const char *path, const Headers &headers, const Params ¶ms); + + Result Patch(const char *path); + Result Patch(const char *path, const char *body, size_t content_length, + const char *content_type); + Result Patch(const char *path, const Headers &headers, const char *body, + size_t content_length, const char *content_type); + Result Patch(const char *path, const std::string &body, + const char *content_type); + Result Patch(const char *path, const Headers &headers, + const std::string &body, const char *content_type); + Result Patch(const char *path, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Patch(const char *path, ContentProviderWithoutLength content_provider, + const char *content_type); + Result Patch(const char *path, const Headers &headers, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Patch(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type); + + Result Delete(const char *path); + Result Delete(const char *path, const Headers &headers); + Result Delete(const char *path, const char *body, size_t content_length, + const char *content_type); + Result Delete(const char *path, const Headers &headers, const char *body, + size_t content_length, const char *content_type); + Result Delete(const char *path, const std::string &body, + const char *content_type); + Result Delete(const char *path, const Headers &headers, + const std::string &body, const char *content_type); + + Result Options(const char *path); + Result Options(const char *path, const Headers &headers); + + bool send(Request &req, Response &res, Error &error); + Result send(const Request &req); + + size_t is_socket_open() const; + + void stop(); + + void set_hostname_addr_map(const std::map addr_map); + + void set_default_headers(Headers headers); + + void set_address_family(int family); + void set_tcp_nodelay(bool on); + void set_socket_options(SocketOptions socket_options); + + void set_connection_timeout(time_t sec, time_t usec = 0); + template + void + set_connection_timeout(const std::chrono::duration &duration); + + void set_read_timeout(time_t sec, time_t usec = 0); + template + void set_read_timeout(const std::chrono::duration &duration); + + void set_write_timeout(time_t sec, time_t usec = 0); + template + void set_write_timeout(const std::chrono::duration &duration); + + void set_basic_auth(const char *username, const char *password); + void set_bearer_token_auth(const char *token); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_digest_auth(const char *username, const char *password); +#endif + + void set_keep_alive(bool on); + void set_follow_location(bool on); + + void set_url_encode(bool on); + + void set_compress(bool on); + + void set_decompress(bool on); + + void set_interface(const char *intf); + + void set_proxy(const char *host, int port); + void set_proxy_basic_auth(const char *username, const char *password); + void set_proxy_bearer_token_auth(const char *token); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_proxy_digest_auth(const char *username, const char *password); +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_ca_cert_path(const char *ca_cert_file_path, + const char *ca_cert_dir_path = nullptr); + void set_ca_cert_store(X509_STORE *ca_cert_store); +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void enable_server_certificate_verification(bool enabled); +#endif + + void set_logger(Logger logger); + +protected: + struct Socket { + socket_t sock = INVALID_SOCKET; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + SSL *ssl = nullptr; +#endif + + bool is_open() const { return sock != INVALID_SOCKET; } + }; + + Result send_(Request &&req); + + virtual bool create_and_connect_socket(Socket &socket, Error &error); + + // All of: + // shutdown_ssl + // shutdown_socket + // close_socket + // should ONLY be called when socket_mutex_ is locked. + // Also, shutdown_ssl and close_socket should also NOT be called concurrently + // with a DIFFERENT thread sending requests using that socket. + virtual void shutdown_ssl(Socket &socket, bool shutdown_gracefully); + void shutdown_socket(Socket &socket); + void close_socket(Socket &socket); + + bool process_request(Stream &strm, Request &req, Response &res, + bool close_connection, Error &error); + + bool write_content_with_provider(Stream &strm, const Request &req, + Error &error); + + void copy_settings(const ClientImpl &rhs); + + // Socket endoint information + const std::string host_; + const int port_; + const std::string host_and_port_; + + // Current open socket + Socket socket_; + mutable std::mutex socket_mutex_; + std::recursive_mutex request_mutex_; + + // These are all protected under socket_mutex + size_t socket_requests_in_flight_ = 0; + std::thread::id socket_requests_are_from_thread_ = std::thread::id(); + bool socket_should_be_closed_when_request_is_done_ = false; + + // Hostname-IP map + std::map addr_map_; + + // Default headers + Headers default_headers_; + + // Settings + std::string client_cert_path_; + std::string client_key_path_; + + time_t connection_timeout_sec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND; + time_t connection_timeout_usec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND; + time_t read_timeout_sec_ = CPPHTTPLIB_READ_TIMEOUT_SECOND; + time_t read_timeout_usec_ = CPPHTTPLIB_READ_TIMEOUT_USECOND; + time_t write_timeout_sec_ = CPPHTTPLIB_WRITE_TIMEOUT_SECOND; + time_t write_timeout_usec_ = CPPHTTPLIB_WRITE_TIMEOUT_USECOND; + + std::string basic_auth_username_; + std::string basic_auth_password_; + std::string bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + std::string digest_auth_username_; + std::string digest_auth_password_; +#endif + + bool keep_alive_ = false; + bool follow_location_ = false; + + bool url_encode_ = true; + + int address_family_ = AF_UNSPEC; + bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; + SocketOptions socket_options_ = nullptr; + + bool compress_ = false; + bool decompress_ = true; + + std::string interface_; + + std::string proxy_host_; + int proxy_port_ = -1; + + std::string proxy_basic_auth_username_; + std::string proxy_basic_auth_password_; + std::string proxy_bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + std::string proxy_digest_auth_username_; + std::string proxy_digest_auth_password_; +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + std::string ca_cert_file_path_; + std::string ca_cert_dir_path_; + + X509_STORE *ca_cert_store_ = nullptr; +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + bool server_certificate_verification_ = true; +#endif + + Logger logger_; + +private: + socket_t create_client_socket(Error &error) const; + bool read_response_line(Stream &strm, const Request &req, Response &res); + bool write_request(Stream &strm, Request &req, bool close_connection, + Error &error); + bool redirect(Request &req, Response &res, Error &error); + bool handle_request(Stream &strm, Request &req, Response &res, + bool close_connection, Error &error); + std::unique_ptr send_with_content_provider( + Request &req, + // const char *method, const char *path, const Headers &headers, + const char *body, size_t content_length, ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const char *content_type, Error &error); + Result send_with_content_provider( + const char *method, const char *path, const Headers &headers, + const char *body, size_t content_length, ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const char *content_type); + + std::string adjust_host_string(const std::string &host) const; + + virtual bool process_socket(const Socket &socket, + std::function callback); + virtual bool is_ssl() const; +}; + +class Client { +public: + // Universal interface + explicit Client(const std::string &scheme_host_port); + + explicit Client(const std::string &scheme_host_port, + const std::string &client_cert_path, + const std::string &client_key_path); + + // HTTP only interface + explicit Client(const std::string &host, int port); + + explicit Client(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path); + + Client(Client &&) = default; + + ~Client(); + + bool is_valid() const; + + Result Get(const char *path); + Result Get(const char *path, const Headers &headers); + Result Get(const char *path, Progress progress); + Result Get(const char *path, const Headers &headers, Progress progress); + Result Get(const char *path, ContentReceiver content_receiver); + Result Get(const char *path, const Headers &headers, + ContentReceiver content_receiver); + Result Get(const char *path, ContentReceiver content_receiver, + Progress progress); + Result Get(const char *path, const Headers &headers, + ContentReceiver content_receiver, Progress progress); + Result Get(const char *path, ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const char *path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const char *path, const Headers &headers, + ResponseHandler response_handler, ContentReceiver content_receiver, + Progress progress); + Result Get(const char *path, ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress); + + Result Get(const char *path, const Params ¶ms, const Headers &headers, + Progress progress = nullptr); + Result Get(const char *path, const Params ¶ms, const Headers &headers, + ContentReceiver content_receiver, Progress progress = nullptr); + Result Get(const char *path, const Params ¶ms, const Headers &headers, + ResponseHandler response_handler, ContentReceiver content_receiver, + Progress progress = nullptr); + + Result Head(const char *path); + Result Head(const char *path, const Headers &headers); + + Result Post(const char *path); + Result Post(const char *path, const char *body, size_t content_length, + const char *content_type); + Result Post(const char *path, const Headers &headers, const char *body, + size_t content_length, const char *content_type); + Result Post(const char *path, const std::string &body, + const char *content_type); + Result Post(const char *path, const Headers &headers, const std::string &body, + const char *content_type); + Result Post(const char *path, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Post(const char *path, ContentProviderWithoutLength content_provider, + const char *content_type); + Result Post(const char *path, const Headers &headers, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Post(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type); + Result Post(const char *path, const Params ¶ms); + Result Post(const char *path, const Headers &headers, const Params ¶ms); + Result Post(const char *path, const MultipartFormDataItems &items); + Result Post(const char *path, const Headers &headers, + const MultipartFormDataItems &items); + Result Post(const char *path, const Headers &headers, + const MultipartFormDataItems &items, const std::string &boundary); + Result Put(const char *path); + Result Put(const char *path, const char *body, size_t content_length, + const char *content_type); + Result Put(const char *path, const Headers &headers, const char *body, + size_t content_length, const char *content_type); + Result Put(const char *path, const std::string &body, + const char *content_type); + Result Put(const char *path, const Headers &headers, const std::string &body, + const char *content_type); + Result Put(const char *path, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Put(const char *path, ContentProviderWithoutLength content_provider, + const char *content_type); + Result Put(const char *path, const Headers &headers, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Put(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type); + Result Put(const char *path, const Params ¶ms); + Result Put(const char *path, const Headers &headers, const Params ¶ms); + Result Patch(const char *path); + Result Patch(const char *path, const char *body, size_t content_length, + const char *content_type); + Result Patch(const char *path, const Headers &headers, const char *body, + size_t content_length, const char *content_type); + Result Patch(const char *path, const std::string &body, + const char *content_type); + Result Patch(const char *path, const Headers &headers, + const std::string &body, const char *content_type); + Result Patch(const char *path, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Patch(const char *path, ContentProviderWithoutLength content_provider, + const char *content_type); + Result Patch(const char *path, const Headers &headers, size_t content_length, + ContentProvider content_provider, const char *content_type); + Result Patch(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type); + + Result Delete(const char *path); + Result Delete(const char *path, const Headers &headers); + Result Delete(const char *path, const char *body, size_t content_length, + const char *content_type); + Result Delete(const char *path, const Headers &headers, const char *body, + size_t content_length, const char *content_type); + Result Delete(const char *path, const std::string &body, + const char *content_type); + Result Delete(const char *path, const Headers &headers, + const std::string &body, const char *content_type); + + Result Options(const char *path); + Result Options(const char *path, const Headers &headers); + + bool send(Request &req, Response &res, Error &error); + Result send(const Request &req); + + size_t is_socket_open() const; + + void stop(); + + void set_hostname_addr_map(const std::map addr_map); + + void set_default_headers(Headers headers); + + void set_address_family(int family); + void set_tcp_nodelay(bool on); + void set_socket_options(SocketOptions socket_options); + + void set_connection_timeout(time_t sec, time_t usec = 0); + template + void + set_connection_timeout(const std::chrono::duration &duration); + + void set_read_timeout(time_t sec, time_t usec = 0); + template + void set_read_timeout(const std::chrono::duration &duration); + + void set_write_timeout(time_t sec, time_t usec = 0); + template + void set_write_timeout(const std::chrono::duration &duration); + + void set_basic_auth(const char *username, const char *password); + void set_bearer_token_auth(const char *token); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_digest_auth(const char *username, const char *password); +#endif + + void set_keep_alive(bool on); + void set_follow_location(bool on); + + void set_url_encode(bool on); + + void set_compress(bool on); + + void set_decompress(bool on); + + void set_interface(const char *intf); + + void set_proxy(const char *host, int port); + void set_proxy_basic_auth(const char *username, const char *password); + void set_proxy_bearer_token_auth(const char *token); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_proxy_digest_auth(const char *username, const char *password); +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void enable_server_certificate_verification(bool enabled); +#endif + + void set_logger(Logger logger); + + // SSL +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_ca_cert_path(const char *ca_cert_file_path, + const char *ca_cert_dir_path = nullptr); + + void set_ca_cert_store(X509_STORE *ca_cert_store); + + long get_openssl_verify_result() const; + + SSL_CTX *ssl_context() const; +#endif + +private: + std::unique_ptr cli_; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + bool is_ssl_ = false; +#endif +}; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +class SSLServer : public Server { +public: + SSLServer(const char *cert_path, const char *private_key_path, + const char *client_ca_cert_file_path = nullptr, + const char *client_ca_cert_dir_path = nullptr); + + SSLServer(X509 *cert, EVP_PKEY *private_key, + X509_STORE *client_ca_cert_store = nullptr); + + SSLServer( + const std::function &setup_ssl_ctx_callback); + + ~SSLServer() override; + + bool is_valid() const override; + + SSL_CTX *ssl_context() const; + +private: + bool process_and_close_socket(socket_t sock) override; + + SSL_CTX *ctx_; + std::mutex ctx_mutex_; +}; + +class SSLClient : public ClientImpl { +public: + explicit SSLClient(const std::string &host); + + explicit SSLClient(const std::string &host, int port); + + explicit SSLClient(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path); + + explicit SSLClient(const std::string &host, int port, X509 *client_cert, + EVP_PKEY *client_key); + + ~SSLClient() override; + + bool is_valid() const override; + + void set_ca_cert_store(X509_STORE *ca_cert_store); + + long get_openssl_verify_result() const; + + SSL_CTX *ssl_context() const; + +private: + bool create_and_connect_socket(Socket &socket, Error &error) override; + void shutdown_ssl(Socket &socket, bool shutdown_gracefully) override; + void shutdown_ssl_impl(Socket &socket, bool shutdown_socket); + + bool process_socket(const Socket &socket, + std::function callback) override; + bool is_ssl() const override; + + bool connect_with_proxy(Socket &sock, Response &res, bool &success, + Error &error); + bool initialize_ssl(Socket &socket, Error &error); + + bool load_certs(); + + bool verify_host(X509 *server_cert) const; + bool verify_host_with_subject_alt_name(X509 *server_cert) const; + bool verify_host_with_common_name(X509 *server_cert) const; + bool check_host_name(const char *pattern, size_t pattern_len) const; + + SSL_CTX *ctx_; + std::mutex ctx_mutex_; + std::once_flag initialize_cert_; + + std::vector host_components_; + + long verify_result_ = 0; + + friend class ClientImpl; +}; +#endif + +/* + * Implementation of template methods. + */ + +namespace detail { + +template +inline void duration_to_sec_and_usec(const T &duration, U callback) { + auto sec = std::chrono::duration_cast(duration).count(); + auto usec = std::chrono::duration_cast( + duration - std::chrono::seconds(sec)) + .count(); + callback(sec, usec); +} + +template +inline T get_header_value(const Headers & /*headers*/, const char * /*key*/, + size_t /*id*/ = 0, uint64_t /*def*/ = 0) {} + +template <> +inline uint64_t get_header_value(const Headers &headers, + const char *key, size_t id, + uint64_t def) { + auto rng = headers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { + return std::strtoull(it->second.data(), nullptr, 10); + } + return def; +} + +} // namespace detail + +template +inline T Request::get_header_value(const char *key, size_t id) const { + return detail::get_header_value(headers, key, id, 0); +} + +template +inline T Response::get_header_value(const char *key, size_t id) const { + return detail::get_header_value(headers, key, id, 0); +} + +template +inline ssize_t Stream::write_format(const char *fmt, const Args &...args) { + const auto bufsiz = 2048; + std::array buf{}; + +#if defined(_MSC_VER) && _MSC_VER < 1900 + auto sn = _snprintf_s(buf.data(), bufsiz, _TRUNCATE, fmt, args...); +#else + auto sn = snprintf(buf.data(), buf.size() - 1, fmt, args...); +#endif + if (sn <= 0) { return sn; } + + auto n = static_cast(sn); + + if (n >= buf.size() - 1) { + std::vector glowable_buf(buf.size()); + + while (n >= glowable_buf.size() - 1) { + glowable_buf.resize(glowable_buf.size() * 2); +#if defined(_MSC_VER) && _MSC_VER < 1900 + n = static_cast(_snprintf_s(&glowable_buf[0], glowable_buf.size(), + glowable_buf.size() - 1, fmt, + args...)); +#else + n = static_cast( + snprintf(&glowable_buf[0], glowable_buf.size() - 1, fmt, args...)); +#endif + } + return write(&glowable_buf[0], n); + } else { + return write(buf.data(), n); + } +} + +inline void default_socket_options(socket_t sock) { + int yes = 1; +#ifdef _WIN32 + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&yes), + sizeof(yes)); + setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, + reinterpret_cast(&yes), sizeof(yes)); +#else +#ifdef SO_REUSEPORT + setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast(&yes), + sizeof(yes)); +#else + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&yes), + sizeof(yes)); +#endif +#endif +} + +template +inline Server & +Server::set_read_timeout(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_read_timeout(sec, usec); }); + return *this; +} + +template +inline Server & +Server::set_write_timeout(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_write_timeout(sec, usec); }); + return *this; +} + +template +inline Server & +Server::set_idle_interval(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_idle_interval(sec, usec); }); + return *this; +} + +inline std::string to_string(const Error error) { + switch (error) { + case Error::Success: return "Success"; + case Error::Connection: return "Connection"; + case Error::BindIPAddress: return "BindIPAddress"; + case Error::Read: return "Read"; + case Error::Write: return "Write"; + case Error::ExceedRedirectCount: return "ExceedRedirectCount"; + case Error::Canceled: return "Canceled"; + case Error::SSLConnection: return "SSLConnection"; + case Error::SSLLoadingCerts: return "SSLLoadingCerts"; + case Error::SSLServerVerification: return "SSLServerVerification"; + case Error::UnsupportedMultipartBoundaryChars: + return "UnsupportedMultipartBoundaryChars"; + case Error::Compression: return "Compression"; + case Error::ConnectionTimeout: return "ConnectionTimeout"; + case Error::Unknown: return "Unknown"; + default: break; + } + + return "Invalid"; +} + +inline std::ostream &operator<<(std::ostream &os, const Error &obj) { + os << to_string(obj); + os << " (" << static_cast::type>(obj) << ')'; + return os; +} + +template +inline T Result::get_request_header_value(const char *key, size_t id) const { + return detail::get_header_value(request_headers_, key, id, 0); +} + +template +inline void ClientImpl::set_connection_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec(duration, [&](time_t sec, time_t usec) { + set_connection_timeout(sec, usec); + }); +} + +template +inline void ClientImpl::set_read_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_read_timeout(sec, usec); }); +} + +template +inline void ClientImpl::set_write_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_write_timeout(sec, usec); }); +} + +template +inline void Client::set_connection_timeout( + const std::chrono::duration &duration) { + cli_->set_connection_timeout(duration); +} + +template +inline void +Client::set_read_timeout(const std::chrono::duration &duration) { + cli_->set_read_timeout(duration); +} + +template +inline void +Client::set_write_timeout(const std::chrono::duration &duration) { + cli_->set_write_timeout(duration); +} + +/* + * Forward declarations and types that will be part of the .h file if split into + * .h + .cc. + */ + +std::string hosted_at(const char *hostname); + +void hosted_at(const char *hostname, std::vector &addrs); + +std::string append_query_params(const char *path, const Params ¶ms); + +std::pair make_range_header(Ranges ranges); + +std::pair +make_basic_authentication_header(const std::string &username, + const std::string &password, + bool is_proxy = false); + +namespace detail { + +std::string encode_query_param(const std::string &value); + +std::string decode_url(const std::string &s, bool convert_plus_to_space); + +void read_file(const std::string &path, std::string &out); + +std::string trim_copy(const std::string &s); + +void split(const char *b, const char *e, char d, + std::function fn); + +bool process_client_socket(socket_t sock, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, + std::function callback); + +socket_t create_client_socket( + const char *host, const char *ip, int port, int address_family, + bool tcp_nodelay, SocketOptions socket_options, + time_t connection_timeout_sec, time_t connection_timeout_usec, + time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, const std::string &intf, Error &error); + +const char *get_header_value(const Headers &headers, const char *key, + size_t id = 0, const char *def = nullptr); + +std::string params_to_query_str(const Params ¶ms); + +void parse_query_text(const std::string &s, Params ¶ms); + +bool parse_range_header(const std::string &s, Ranges &ranges); + +int close_socket(socket_t sock); + +ssize_t send_socket(socket_t sock, const void *ptr, size_t size, int flags); + +ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags); + +enum class EncodingType { None = 0, Gzip, Brotli }; + +EncodingType encoding_type(const Request &req, const Response &res); + +class BufferStream : public Stream { +public: + BufferStream() = default; + ~BufferStream() override = default; + + bool is_readable() const override; + bool is_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + + const std::string &get_buffer() const; + +private: + std::string buffer; + size_t position = 0; +}; + +class compressor { +public: + virtual ~compressor() = default; + + typedef std::function Callback; + virtual bool compress(const char *data, size_t data_length, bool last, + Callback callback) = 0; +}; + +class decompressor { +public: + virtual ~decompressor() = default; + + virtual bool is_valid() const = 0; + + typedef std::function Callback; + virtual bool decompress(const char *data, size_t data_length, + Callback callback) = 0; +}; + +class nocompressor : public compressor { +public: + virtual ~nocompressor() = default; + + bool compress(const char *data, size_t data_length, bool /*last*/, + Callback callback) override; +}; + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +class gzip_compressor : public compressor { +public: + gzip_compressor(); + ~gzip_compressor(); + + bool compress(const char *data, size_t data_length, bool last, + Callback callback) override; + +private: + bool is_valid_ = false; + z_stream strm_; +}; + +class gzip_decompressor : public decompressor { +public: + gzip_decompressor(); + ~gzip_decompressor(); + + bool is_valid() const override; + + bool decompress(const char *data, size_t data_length, + Callback callback) override; + +private: + bool is_valid_ = false; + z_stream strm_; +}; +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +class brotli_compressor : public compressor { +public: + brotli_compressor(); + ~brotli_compressor(); + + bool compress(const char *data, size_t data_length, bool last, + Callback callback) override; + +private: + BrotliEncoderState *state_ = nullptr; +}; + +class brotli_decompressor : public decompressor { +public: + brotli_decompressor(); + ~brotli_decompressor(); + + bool is_valid() const override; + + bool decompress(const char *data, size_t data_length, + Callback callback) override; + +private: + BrotliDecoderResult decoder_r; + BrotliDecoderState *decoder_s = nullptr; +}; +#endif + +// NOTE: until the read size reaches `fixed_buffer_size`, use `fixed_buffer` +// to store data. The call can set memory on stack for performance. +class stream_line_reader { +public: + stream_line_reader(Stream &strm, char *fixed_buffer, + size_t fixed_buffer_size); + const char *ptr() const; + size_t size() const; + bool end_with_crlf() const; + bool getline(); + +private: + void append(char c); + + Stream &strm_; + char *fixed_buffer_; + const size_t fixed_buffer_size_; + size_t fixed_buffer_used_size_ = 0; + std::string glowable_buffer_; +}; + +} // namespace detail + +// ---------------------------------------------------------------------------- + +/* + * Implementation that will be part of the .cc file if split into .h + .cc. + */ + +namespace detail { + +inline bool is_hex(char c, int &v) { + if (0x20 <= c && isdigit(c)) { + v = c - '0'; + return true; + } else if ('A' <= c && c <= 'F') { + v = c - 'A' + 10; + return true; + } else if ('a' <= c && c <= 'f') { + v = c - 'a' + 10; + return true; + } + return false; +} + +inline bool from_hex_to_i(const std::string &s, size_t i, size_t cnt, + int &val) { + if (i >= s.size()) { return false; } + + val = 0; + for (; cnt; i++, cnt--) { + if (!s[i]) { return false; } + int v = 0; + if (is_hex(s[i], v)) { + val = val * 16 + v; + } else { + return false; + } + } + return true; +} + +inline std::string from_i_to_hex(size_t n) { + const char *charset = "0123456789abcdef"; + std::string ret; + do { + ret = charset[n & 15] + ret; + n >>= 4; + } while (n > 0); + return ret; +} + +inline size_t to_utf8(int code, char *buff) { + if (code < 0x0080) { + buff[0] = (code & 0x7F); + return 1; + } else if (code < 0x0800) { + buff[0] = static_cast(0xC0 | ((code >> 6) & 0x1F)); + buff[1] = static_cast(0x80 | (code & 0x3F)); + return 2; + } else if (code < 0xD800) { + buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); + buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[2] = static_cast(0x80 | (code & 0x3F)); + return 3; + } else if (code < 0xE000) { // D800 - DFFF is invalid... + return 0; + } else if (code < 0x10000) { + buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); + buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[2] = static_cast(0x80 | (code & 0x3F)); + return 3; + } else if (code < 0x110000) { + buff[0] = static_cast(0xF0 | ((code >> 18) & 0x7)); + buff[1] = static_cast(0x80 | ((code >> 12) & 0x3F)); + buff[2] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[3] = static_cast(0x80 | (code & 0x3F)); + return 4; + } + + // NOTREACHED + return 0; +} + +// NOTE: This code came up with the following stackoverflow post: +// https://stackoverflow.com/questions/180947/base64-decode-snippet-in-c +inline std::string base64_encode(const std::string &in) { + static const auto lookup = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + std::string out; + out.reserve(in.size()); + + int val = 0; + int valb = -6; + + for (auto c : in) { + val = (val << 8) + static_cast(c); + valb += 8; + while (valb >= 0) { + out.push_back(lookup[(val >> valb) & 0x3F]); + valb -= 6; + } + } + + if (valb > -6) { out.push_back(lookup[((val << 8) >> (valb + 8)) & 0x3F]); } + + while (out.size() % 4) { + out.push_back('='); + } + + return out; +} + +inline bool is_file(const std::string &path) { +#ifdef _WIN32 + return _access_s(path.c_str(), 0) == 0; +#else + struct stat st; + return stat(path.c_str(), &st) >= 0 && S_ISREG(st.st_mode); +#endif +} + +inline bool is_dir(const std::string &path) { + struct stat st; + return stat(path.c_str(), &st) >= 0 && S_ISDIR(st.st_mode); +} + +inline bool is_valid_path(const std::string &path) { + size_t level = 0; + size_t i = 0; + + // Skip slash + while (i < path.size() && path[i] == '/') { + i++; + } + + while (i < path.size()) { + // Read component + auto beg = i; + while (i < path.size() && path[i] != '/') { + i++; + } + + auto len = i - beg; + assert(len > 0); + + if (!path.compare(beg, len, ".")) { + ; + } else if (!path.compare(beg, len, "..")) { + if (level == 0) { return false; } + level--; + } else { + level++; + } + + // Skip slash + while (i < path.size() && path[i] == '/') { + i++; + } + } + + return true; +} + +inline std::string encode_query_param(const std::string &value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (auto c : value) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || + c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || + c == ')') { + escaped << c; + } else { + escaped << std::uppercase; + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); + escaped << std::nouppercase; + } + } + + return escaped.str(); +} + +inline std::string encode_url(const std::string &s) { + std::string result; + result.reserve(s.size()); + + for (size_t i = 0; s[i]; i++) { + switch (s[i]) { + case ' ': result += "%20"; break; + case '+': result += "%2B"; break; + case '\r': result += "%0D"; break; + case '\n': result += "%0A"; break; + case '\'': result += "%27"; break; + case ',': result += "%2C"; break; + // case ':': result += "%3A"; break; // ok? probably... + case ';': result += "%3B"; break; + default: + auto c = static_cast(s[i]); + if (c >= 0x80) { + result += '%'; + char hex[4]; + auto len = snprintf(hex, sizeof(hex) - 1, "%02X", c); + assert(len == 2); + result.append(hex, static_cast(len)); + } else { + result += s[i]; + } + break; + } + } + + return result; +} + +inline std::string decode_url(const std::string &s, + bool convert_plus_to_space) { + std::string result; + + for (size_t i = 0; i < s.size(); i++) { + if (s[i] == '%' && i + 1 < s.size()) { + if (s[i + 1] == 'u') { + int val = 0; + if (from_hex_to_i(s, i + 2, 4, val)) { + // 4 digits Unicode codes + char buff[4]; + size_t len = to_utf8(val, buff); + if (len > 0) { result.append(buff, len); } + i += 5; // 'u0000' + } else { + result += s[i]; + } + } else { + int val = 0; + if (from_hex_to_i(s, i + 1, 2, val)) { + // 2 digits hex codes + result += static_cast(val); + i += 2; // '00' + } else { + result += s[i]; + } + } + } else if (convert_plus_to_space && s[i] == '+') { + result += ' '; + } else { + result += s[i]; + } + } + + return result; +} + +inline void read_file(const std::string &path, std::string &out) { + std::ifstream fs(path, std::ios_base::binary); + fs.seekg(0, std::ios_base::end); + auto size = fs.tellg(); + fs.seekg(0); + out.resize(static_cast(size)); + fs.read(&out[0], static_cast(size)); +} + +inline std::string file_extension(const std::string &path) { + std::smatch m; + static auto re = std::regex("\\.([a-zA-Z0-9]+)$"); + if (std::regex_search(path, m, re)) { return m[1].str(); } + return std::string(); +} + +inline bool is_space_or_tab(char c) { return c == ' ' || c == '\t'; } + +inline std::pair trim(const char *b, const char *e, size_t left, + size_t right) { + while (b + left < e && is_space_or_tab(b[left])) { + left++; + } + while (right > 0 && is_space_or_tab(b[right - 1])) { + right--; + } + return std::make_pair(left, right); +} + +inline std::string trim_copy(const std::string &s) { + auto r = trim(s.data(), s.data() + s.size(), 0, s.size()); + return s.substr(r.first, r.second - r.first); +} + +inline void split(const char *b, const char *e, char d, + std::function fn) { + size_t i = 0; + size_t beg = 0; + + while (e ? (b + i < e) : (b[i] != '\0')) { + if (b[i] == d) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } + beg = i + 1; + } + i++; + } + + if (i) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } + } +} + +inline stream_line_reader::stream_line_reader(Stream &strm, char *fixed_buffer, + size_t fixed_buffer_size) + : strm_(strm), fixed_buffer_(fixed_buffer), + fixed_buffer_size_(fixed_buffer_size) {} + +inline const char *stream_line_reader::ptr() const { + if (glowable_buffer_.empty()) { + return fixed_buffer_; + } else { + return glowable_buffer_.data(); + } +} + +inline size_t stream_line_reader::size() const { + if (glowable_buffer_.empty()) { + return fixed_buffer_used_size_; + } else { + return glowable_buffer_.size(); + } +} + +inline bool stream_line_reader::end_with_crlf() const { + auto end = ptr() + size(); + return size() >= 2 && end[-2] == '\r' && end[-1] == '\n'; +} + +inline bool stream_line_reader::getline() { + fixed_buffer_used_size_ = 0; + glowable_buffer_.clear(); + + for (size_t i = 0;; i++) { + char byte; + auto n = strm_.read(&byte, 1); + + if (n < 0) { + return false; + } else if (n == 0) { + if (i == 0) { + return false; + } else { + break; + } + } + + append(byte); + + if (byte == '\n') { break; } + } + + return true; +} + +inline void stream_line_reader::append(char c) { + if (fixed_buffer_used_size_ < fixed_buffer_size_ - 1) { + fixed_buffer_[fixed_buffer_used_size_++] = c; + fixed_buffer_[fixed_buffer_used_size_] = '\0'; + } else { + if (glowable_buffer_.empty()) { + assert(fixed_buffer_[fixed_buffer_used_size_] == '\0'); + glowable_buffer_.assign(fixed_buffer_, fixed_buffer_used_size_); + } + glowable_buffer_ += c; + } +} + +inline int close_socket(socket_t sock) { +#ifdef _WIN32 + return closesocket(sock); +#else + return close(sock); +#endif +} + +template inline ssize_t handle_EINTR(T fn) { + ssize_t res = false; + while (true) { + res = fn(); + if (res < 0 && errno == EINTR) { continue; } + break; + } + return res; +} + +inline ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags) { + return handle_EINTR([&]() { + return recv(sock, +#ifdef _WIN32 + static_cast(ptr), static_cast(size), +#else + ptr, size, +#endif + flags); + }); +} + +inline ssize_t send_socket(socket_t sock, const void *ptr, size_t size, + int flags) { + return handle_EINTR([&]() { + return send(sock, +#ifdef _WIN32 + static_cast(ptr), static_cast(size), +#else + ptr, size, +#endif + flags); + }); +} + +inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) { +#ifdef CPPHTTPLIB_USE_POLL + struct pollfd pfd_read; + pfd_read.fd = sock; + pfd_read.events = POLLIN; + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + return handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); }); +#else +#ifndef _WIN32 + if (sock >= FD_SETSIZE) { return 1; } +#endif + + fd_set fds; + FD_ZERO(&fds); + FD_SET(sock, &fds); + + timeval tv; + tv.tv_sec = static_cast(sec); + tv.tv_usec = static_cast(usec); + + return handle_EINTR([&]() { + return select(static_cast(sock + 1), &fds, nullptr, nullptr, &tv); + }); +#endif +} + +inline ssize_t select_write(socket_t sock, time_t sec, time_t usec) { +#ifdef CPPHTTPLIB_USE_POLL + struct pollfd pfd_read; + pfd_read.fd = sock; + pfd_read.events = POLLOUT; + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + return handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); }); +#else +#ifndef _WIN32 + if (sock >= FD_SETSIZE) { return 1; } +#endif + + fd_set fds; + FD_ZERO(&fds); + FD_SET(sock, &fds); + + timeval tv; + tv.tv_sec = static_cast(sec); + tv.tv_usec = static_cast(usec); + + return handle_EINTR([&]() { + return select(static_cast(sock + 1), nullptr, &fds, nullptr, &tv); + }); +#endif +} + +inline Error wait_until_socket_is_ready(socket_t sock, time_t sec, + time_t usec) { +#ifdef CPPHTTPLIB_USE_POLL + struct pollfd pfd_read; + pfd_read.fd = sock; + pfd_read.events = POLLIN | POLLOUT; + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + auto poll_res = handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); }); + + if (poll_res == 0) { return Error::ConnectionTimeout; } + + if (poll_res > 0 && pfd_read.revents & (POLLIN | POLLOUT)) { + int error = 0; + socklen_t len = sizeof(error); + auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, + reinterpret_cast(&error), &len); + auto successful = res >= 0 && !error; + return successful ? Error::Success : Error::Connection; + } + + return Error::Connection; +#else +#ifndef _WIN32 + if (sock >= FD_SETSIZE) { return Error::Connection; } +#endif + + fd_set fdsr; + FD_ZERO(&fdsr); + FD_SET(sock, &fdsr); + + auto fdsw = fdsr; + auto fdse = fdsr; + + timeval tv; + tv.tv_sec = static_cast(sec); + tv.tv_usec = static_cast(usec); + + auto ret = handle_EINTR([&]() { + return select(static_cast(sock + 1), &fdsr, &fdsw, &fdse, &tv); + }); + + if (ret == 0) { return Error::ConnectionTimeout; } + + if (ret > 0 && (FD_ISSET(sock, &fdsr) || FD_ISSET(sock, &fdsw))) { + int error = 0; + socklen_t len = sizeof(error); + auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, + reinterpret_cast(&error), &len); + auto successful = res >= 0 && !error; + return successful ? Error::Success : Error::Connection; + } + return Error::Connection; +#endif +} + +inline bool is_socket_alive(socket_t sock) { + const auto val = detail::select_read(sock, 0, 0); + if (val == 0) { + return true; + } else if (val < 0 && errno == EBADF) { + return false; + } + char buf[1]; + return detail::read_socket(sock, &buf[0], sizeof(buf), MSG_PEEK) > 0; +} + +class SocketStream : public Stream { +public: + SocketStream(socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec); + ~SocketStream() override; + + bool is_readable() const override; + bool is_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + +private: + socket_t sock_; + time_t read_timeout_sec_; + time_t read_timeout_usec_; + time_t write_timeout_sec_; + time_t write_timeout_usec_; + + std::vector read_buff_; + size_t read_buff_off_ = 0; + size_t read_buff_content_size_ = 0; + + static const size_t read_buff_size_ = 1024 * 4; +}; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +class SSLSocketStream : public Stream { +public: + SSLSocketStream(socket_t sock, SSL *ssl, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec); + ~SSLSocketStream() override; + + bool is_readable() const override; + bool is_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + +private: + socket_t sock_; + SSL *ssl_; + time_t read_timeout_sec_; + time_t read_timeout_usec_; + time_t write_timeout_sec_; + time_t write_timeout_usec_; +}; +#endif + +inline bool keep_alive(socket_t sock, time_t keep_alive_timeout_sec) { + using namespace std::chrono; + auto start = steady_clock::now(); + while (true) { + auto val = select_read(sock, 0, 10000); + if (val < 0) { + return false; + } else if (val == 0) { + auto current = steady_clock::now(); + auto duration = duration_cast(current - start); + auto timeout = keep_alive_timeout_sec * 1000; + if (duration.count() > timeout) { return false; } + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } else { + return true; + } + } +} + +template +inline bool +process_server_socket_core(const std::atomic &svr_sock, socket_t sock, + size_t keep_alive_max_count, + time_t keep_alive_timeout_sec, T callback) { + assert(keep_alive_max_count > 0); + auto ret = false; + auto count = keep_alive_max_count; + while (svr_sock != INVALID_SOCKET && count > 0 && + keep_alive(sock, keep_alive_timeout_sec)) { + auto close_connection = count == 1; + auto connection_closed = false; + ret = callback(close_connection, connection_closed); + if (!ret || connection_closed) { break; } + count--; + } + return ret; +} + +template +inline bool +process_server_socket(const std::atomic &svr_sock, socket_t sock, + size_t keep_alive_max_count, + time_t keep_alive_timeout_sec, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + return process_server_socket_core( + svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, + [&](bool close_connection, bool &connection_closed) { + SocketStream strm(sock, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm, close_connection, connection_closed); + }); +} + +inline bool process_client_socket(socket_t sock, time_t read_timeout_sec, + time_t read_timeout_usec, + time_t write_timeout_sec, + time_t write_timeout_usec, + std::function callback) { + SocketStream strm(sock, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm); +} + +inline int shutdown_socket(socket_t sock) { +#ifdef _WIN32 + return shutdown(sock, SD_BOTH); +#else + return shutdown(sock, SHUT_RDWR); +#endif +} + +template +socket_t create_socket(const char *host, const char *ip, int port, + int address_family, int socket_flags, bool tcp_nodelay, + SocketOptions socket_options, + BindOrConnect bind_or_connect) { + // Get address info + const char *node = nullptr; + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (ip[0] != '\0') { + node = ip; + // Ask getaddrinfo to convert IP in c-string to address + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_NUMERICHOST; + } else { + node = host; + hints.ai_family = address_family; + hints.ai_flags = socket_flags; + } + + auto service = std::to_string(port); + + if (getaddrinfo(node, service.c_str(), &hints, &result)) { +#if defined __linux__ && !defined __ANDROID__ + res_init(); +#endif + return INVALID_SOCKET; + } + + for (auto rp = result; rp; rp = rp->ai_next) { + // Create a socket +#ifdef _WIN32 + auto sock = + WSASocketW(rp->ai_family, rp->ai_socktype, rp->ai_protocol, nullptr, 0, + WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); + /** + * Since the WSA_FLAG_NO_HANDLE_INHERIT is only supported on Windows 7 SP1 + * and above the socket creation fails on older Windows Systems. + * + * Let's try to create a socket the old way in this case. + * + * Reference: + * https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa + * + * WSA_FLAG_NO_HANDLE_INHERIT: + * This flag is supported on Windows 7 with SP1, Windows Server 2008 R2 with + * SP1, and later + * + */ + if (sock == INVALID_SOCKET) { + sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + } +#else + auto sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); +#endif + if (sock == INVALID_SOCKET) { continue; } + +#ifndef _WIN32 + if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) { continue; } +#endif + + if (tcp_nodelay) { + int yes = 1; + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&yes), + sizeof(yes)); + } + + if (socket_options) { socket_options(sock); } + + if (rp->ai_family == AF_INET6) { + int no = 0; + setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&no), + sizeof(no)); + } + + // bind or connect + if (bind_or_connect(sock, *rp)) { + freeaddrinfo(result); + return sock; + } + + close_socket(sock); + } + + freeaddrinfo(result); + return INVALID_SOCKET; +} + +inline void set_nonblocking(socket_t sock, bool nonblocking) { +#ifdef _WIN32 + auto flags = nonblocking ? 1UL : 0UL; + ioctlsocket(sock, FIONBIO, &flags); +#else + auto flags = fcntl(sock, F_GETFL, 0); + fcntl(sock, F_SETFL, + nonblocking ? (flags | O_NONBLOCK) : (flags & (~O_NONBLOCK))); +#endif +} + +inline bool is_connection_error() { +#ifdef _WIN32 + return WSAGetLastError() != WSAEWOULDBLOCK; +#else + return errno != EINPROGRESS; +#endif +} + +inline bool bind_ip_address(socket_t sock, const char *host) { + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (getaddrinfo(host, "0", &hints, &result)) { return false; } + + auto ret = false; + for (auto rp = result; rp; rp = rp->ai_next) { + const auto &ai = *rp; + if (!::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + ret = true; + break; + } + } + + freeaddrinfo(result); + return ret; +} + +#if !defined _WIN32 && !defined ANDROID +#define USE_IF2IP +#endif + +#ifdef USE_IF2IP +inline std::string if2ip(const std::string &ifn) { + struct ifaddrs *ifap; + getifaddrs(&ifap); + for (auto ifa = ifap; ifa; ifa = ifa->ifa_next) { + if (ifa->ifa_addr && ifn == ifa->ifa_name) { + if (ifa->ifa_addr->sa_family == AF_INET) { + auto sa = reinterpret_cast(ifa->ifa_addr); + char buf[INET_ADDRSTRLEN]; + if (inet_ntop(AF_INET, &sa->sin_addr, buf, INET_ADDRSTRLEN)) { + freeifaddrs(ifap); + return std::string(buf, INET_ADDRSTRLEN); + } + } + } + } + freeifaddrs(ifap); + return std::string(); +} +#endif + +inline socket_t create_client_socket( + const char *host, const char *ip, int port, int address_family, + bool tcp_nodelay, SocketOptions socket_options, + time_t connection_timeout_sec, time_t connection_timeout_usec, + time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, const std::string &intf, Error &error) { + auto sock = create_socket( + host, ip, port, address_family, 0, tcp_nodelay, std::move(socket_options), + [&](socket_t sock2, struct addrinfo &ai) -> bool { + if (!intf.empty()) { +#ifdef USE_IF2IP + auto ip = if2ip(intf); + if (ip.empty()) { ip = intf; } + if (!bind_ip_address(sock2, ip.c_str())) { + error = Error::BindIPAddress; + return false; + } +#endif + } + + set_nonblocking(sock2, true); + + auto ret = + ::connect(sock2, ai.ai_addr, static_cast(ai.ai_addrlen)); + + if (ret < 0) { + if (is_connection_error()) { + error = Error::Connection; + return false; + } + error = wait_until_socket_is_ready(sock2, connection_timeout_sec, + connection_timeout_usec); + if (error != Error::Success) { return false; } + } + + set_nonblocking(sock2, false); + + { +#ifdef _WIN32 + auto timeout = static_cast(read_timeout_sec * 1000 + + read_timeout_usec / 1000); + setsockopt(sock2, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, + sizeof(timeout)); +#else + timeval tv; + tv.tv_sec = static_cast(read_timeout_sec); + tv.tv_usec = static_cast(read_timeout_usec); + setsockopt(sock2, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); +#endif + } + { + +#ifdef _WIN32 + auto timeout = static_cast(write_timeout_sec * 1000 + + write_timeout_usec / 1000); + setsockopt(sock2, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, + sizeof(timeout)); +#else + timeval tv; + tv.tv_sec = static_cast(write_timeout_sec); + tv.tv_usec = static_cast(write_timeout_usec); + setsockopt(sock2, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); +#endif + } + + error = Error::Success; + return true; + }); + + if (sock != INVALID_SOCKET) { + error = Error::Success; + } else { + if (error == Error::Success) { error = Error::Connection; } + } + + return sock; +} + +inline bool get_remote_ip_and_port(const struct sockaddr_storage &addr, + socklen_t addr_len, std::string &ip, + int &port) { + if (addr.ss_family == AF_INET) { + port = ntohs(reinterpret_cast(&addr)->sin_port); + } else if (addr.ss_family == AF_INET6) { + port = + ntohs(reinterpret_cast(&addr)->sin6_port); + } else { + return false; + } + + std::array ipstr{}; + if (getnameinfo(reinterpret_cast(&addr), addr_len, + ipstr.data(), static_cast(ipstr.size()), nullptr, + 0, NI_NUMERICHOST)) { + return false; + } + + ip = ipstr.data(); + return true; +} + +inline void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + + if (!getpeername(sock, reinterpret_cast(&addr), + &addr_len)) { + get_remote_ip_and_port(addr, addr_len, ip, port); + } +} + +inline constexpr unsigned int str2tag_core(const char *s, size_t l, + unsigned int h) { + return (l == 0) ? h + : str2tag_core(s + 1, l - 1, + (h * 33) ^ static_cast(*s)); +} + +inline unsigned int str2tag(const std::string &s) { + return str2tag_core(s.data(), s.size(), 0); +} + +namespace udl { + +inline constexpr unsigned int operator"" _t(const char *s, size_t l) { + return str2tag_core(s, l, 0); +} + +} // namespace udl + +inline const char * +find_content_type(const std::string &path, + const std::map &user_data) { + auto ext = file_extension(path); + + auto it = user_data.find(ext); + if (it != user_data.end()) { return it->second.c_str(); } + + using udl::operator""_t; + + switch (str2tag(ext)) { + default: return nullptr; + case "css"_t: return "text/css"; + case "csv"_t: return "text/csv"; + case "txt"_t: return "text/plain"; + case "vtt"_t: return "text/vtt"; + case "htm"_t: + case "html"_t: return "text/html"; + + case "apng"_t: return "image/apng"; + case "avif"_t: return "image/avif"; + case "bmp"_t: return "image/bmp"; + case "gif"_t: return "image/gif"; + case "png"_t: return "image/png"; + case "svg"_t: return "image/svg+xml"; + case "webp"_t: return "image/webp"; + case "ico"_t: return "image/x-icon"; + case "tif"_t: return "image/tiff"; + case "tiff"_t: return "image/tiff"; + case "jpg"_t: + case "jpeg"_t: return "image/jpeg"; + + case "mp4"_t: return "video/mp4"; + case "mpeg"_t: return "video/mpeg"; + case "webm"_t: return "video/webm"; + + case "mp3"_t: return "audio/mp3"; + case "mpga"_t: return "audio/mpeg"; + case "weba"_t: return "audio/webm"; + case "wav"_t: return "audio/wave"; + + case "otf"_t: return "font/otf"; + case "ttf"_t: return "font/ttf"; + case "woff"_t: return "font/woff"; + case "woff2"_t: return "font/woff2"; + + case "7z"_t: return "application/x-7z-compressed"; + case "atom"_t: return "application/atom+xml"; + case "pdf"_t: return "application/pdf"; + case "js"_t: + case "mjs"_t: return "application/javascript"; + case "json"_t: return "application/json"; + case "rss"_t: return "application/rss+xml"; + case "tar"_t: return "application/x-tar"; + case "xht"_t: + case "xhtml"_t: return "application/xhtml+xml"; + case "xslt"_t: return "application/xslt+xml"; + case "xml"_t: return "application/xml"; + case "gz"_t: return "application/gzip"; + case "zip"_t: return "application/zip"; + case "wasm"_t: return "application/wasm"; + } +} + +inline const char *status_message(int status) { + switch (status) { + case 100: return "Continue"; + case 101: return "Switching Protocol"; + case 102: return "Processing"; + case 103: return "Early Hints"; + case 200: return "OK"; + case 201: return "Created"; + case 202: return "Accepted"; + case 203: return "Non-Authoritative Information"; + case 204: return "No Content"; + case 205: return "Reset Content"; + case 206: return "Partial Content"; + case 207: return "Multi-Status"; + case 208: return "Already Reported"; + case 226: return "IM Used"; + case 300: return "Multiple Choice"; + case 301: return "Moved Permanently"; + case 302: return "Found"; + case 303: return "See Other"; + case 304: return "Not Modified"; + case 305: return "Use Proxy"; + case 306: return "unused"; + case 307: return "Temporary Redirect"; + case 308: return "Permanent Redirect"; + case 400: return "Bad Request"; + case 401: return "Unauthorized"; + case 402: return "Payment Required"; + case 403: return "Forbidden"; + case 404: return "Not Found"; + case 405: return "Method Not Allowed"; + case 406: return "Not Acceptable"; + case 407: return "Proxy Authentication Required"; + case 408: return "Request Timeout"; + case 409: return "Conflict"; + case 410: return "Gone"; + case 411: return "Length Required"; + case 412: return "Precondition Failed"; + case 413: return "Payload Too Large"; + case 414: return "URI Too Long"; + case 415: return "Unsupported Media Type"; + case 416: return "Range Not Satisfiable"; + case 417: return "Expectation Failed"; + case 418: return "I'm a teapot"; + case 421: return "Misdirected Request"; + case 422: return "Unprocessable Entity"; + case 423: return "Locked"; + case 424: return "Failed Dependency"; + case 425: return "Too Early"; + case 426: return "Upgrade Required"; + case 428: return "Precondition Required"; + case 429: return "Too Many Requests"; + case 431: return "Request Header Fields Too Large"; + case 451: return "Unavailable For Legal Reasons"; + case 501: return "Not Implemented"; + case 502: return "Bad Gateway"; + case 503: return "Service Unavailable"; + case 504: return "Gateway Timeout"; + case 505: return "HTTP Version Not Supported"; + case 506: return "Variant Also Negotiates"; + case 507: return "Insufficient Storage"; + case 508: return "Loop Detected"; + case 510: return "Not Extended"; + case 511: return "Network Authentication Required"; + + default: + case 500: return "Internal Server Error"; + } +} + +inline bool can_compress_content_type(const std::string &content_type) { + return (!content_type.rfind("text/", 0) && + content_type != "text/event-stream") || + content_type == "image/svg+xml" || + content_type == "application/javascript" || + content_type == "application/json" || + content_type == "application/xml" || + content_type == "application/protobuf" || + content_type == "application/xhtml+xml"; +} + +inline EncodingType encoding_type(const Request &req, const Response &res) { + auto ret = + detail::can_compress_content_type(res.get_header_value("Content-Type")); + if (!ret) { return EncodingType::None; } + + const auto &s = req.get_header_value("Accept-Encoding"); + (void)(s); + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + // TODO: 'Accept-Encoding' has br, not br;q=0 + ret = s.find("br") != std::string::npos; + if (ret) { return EncodingType::Brotli; } +#endif + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + // TODO: 'Accept-Encoding' has gzip, not gzip;q=0 + ret = s.find("gzip") != std::string::npos; + if (ret) { return EncodingType::Gzip; } +#endif + + return EncodingType::None; +} + +inline bool nocompressor::compress(const char *data, size_t data_length, + bool /*last*/, Callback callback) { + if (!data_length) { return true; } + return callback(data, data_length); +} + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +inline gzip_compressor::gzip_compressor() { + std::memset(&strm_, 0, sizeof(strm_)); + strm_.zalloc = Z_NULL; + strm_.zfree = Z_NULL; + strm_.opaque = Z_NULL; + + is_valid_ = deflateInit2(&strm_, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31, 8, + Z_DEFAULT_STRATEGY) == Z_OK; +} + +inline gzip_compressor::~gzip_compressor() { deflateEnd(&strm_); } + +inline bool gzip_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + assert(is_valid_); + + do { + constexpr size_t max_avail_in = + (std::numeric_limits::max)(); + + strm_.avail_in = static_cast( + (std::min)(data_length, max_avail_in)); + strm_.next_in = const_cast(reinterpret_cast(data)); + + data_length -= strm_.avail_in; + data += strm_.avail_in; + + auto flush = (last && data_length == 0) ? Z_FINISH : Z_NO_FLUSH; + int ret = Z_OK; + + std::array buff{}; + do { + strm_.avail_out = static_cast(buff.size()); + strm_.next_out = reinterpret_cast(buff.data()); + + ret = deflate(&strm_, flush); + if (ret == Z_STREAM_ERROR) { return false; } + + if (!callback(buff.data(), buff.size() - strm_.avail_out)) { + return false; + } + } while (strm_.avail_out == 0); + + assert((flush == Z_FINISH && ret == Z_STREAM_END) || + (flush == Z_NO_FLUSH && ret == Z_OK)); + assert(strm_.avail_in == 0); + + } while (data_length > 0); + + return true; +} + +inline gzip_decompressor::gzip_decompressor() { + std::memset(&strm_, 0, sizeof(strm_)); + strm_.zalloc = Z_NULL; + strm_.zfree = Z_NULL; + strm_.opaque = Z_NULL; + + // 15 is the value of wbits, which should be at the maximum possible value + // to ensure that any gzip stream can be decoded. The offset of 32 specifies + // that the stream type should be automatically detected either gzip or + // deflate. + is_valid_ = inflateInit2(&strm_, 32 + 15) == Z_OK; +} + +inline gzip_decompressor::~gzip_decompressor() { inflateEnd(&strm_); } + +inline bool gzip_decompressor::is_valid() const { return is_valid_; } + +inline bool gzip_decompressor::decompress(const char *data, size_t data_length, + Callback callback) { + assert(is_valid_); + + int ret = Z_OK; + + do { + constexpr size_t max_avail_in = + (std::numeric_limits::max)(); + + strm_.avail_in = static_cast( + (std::min)(data_length, max_avail_in)); + strm_.next_in = const_cast(reinterpret_cast(data)); + + data_length -= strm_.avail_in; + data += strm_.avail_in; + + std::array buff{}; + while (strm_.avail_in > 0) { + strm_.avail_out = static_cast(buff.size()); + strm_.next_out = reinterpret_cast(buff.data()); + + auto prev_avail_in = strm_.avail_in; + + ret = inflate(&strm_, Z_NO_FLUSH); + + if (prev_avail_in - strm_.avail_in == 0) { return false; } + + assert(ret != Z_STREAM_ERROR); + switch (ret) { + case Z_NEED_DICT: + case Z_DATA_ERROR: + case Z_MEM_ERROR: inflateEnd(&strm_); return false; + } + + if (!callback(buff.data(), buff.size() - strm_.avail_out)) { + return false; + } + } + + if (ret != Z_OK && ret != Z_STREAM_END) return false; + + } while (data_length > 0); + + return true; +} +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +inline brotli_compressor::brotli_compressor() { + state_ = BrotliEncoderCreateInstance(nullptr, nullptr, nullptr); +} + +inline brotli_compressor::~brotli_compressor() { + BrotliEncoderDestroyInstance(state_); +} + +inline bool brotli_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + std::array buff{}; + + auto operation = last ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS; + auto available_in = data_length; + auto next_in = reinterpret_cast(data); + + for (;;) { + if (last) { + if (BrotliEncoderIsFinished(state_)) { break; } + } else { + if (!available_in) { break; } + } + + auto available_out = buff.size(); + auto next_out = buff.data(); + + if (!BrotliEncoderCompressStream(state_, operation, &available_in, &next_in, + &available_out, &next_out, nullptr)) { + return false; + } + + auto output_bytes = buff.size() - available_out; + if (output_bytes) { + callback(reinterpret_cast(buff.data()), output_bytes); + } + } + + return true; +} + +inline brotli_decompressor::brotli_decompressor() { + decoder_s = BrotliDecoderCreateInstance(0, 0, 0); + decoder_r = decoder_s ? BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT + : BROTLI_DECODER_RESULT_ERROR; +} + +inline brotli_decompressor::~brotli_decompressor() { + if (decoder_s) { BrotliDecoderDestroyInstance(decoder_s); } +} + +inline bool brotli_decompressor::is_valid() const { return decoder_s; } + +inline bool brotli_decompressor::decompress(const char *data, + size_t data_length, + Callback callback) { + if (decoder_r == BROTLI_DECODER_RESULT_SUCCESS || + decoder_r == BROTLI_DECODER_RESULT_ERROR) { + return 0; + } + + const uint8_t *next_in = (const uint8_t *)data; + size_t avail_in = data_length; + size_t total_out; + + decoder_r = BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT; + + std::array buff{}; + while (decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) { + char *next_out = buff.data(); + size_t avail_out = buff.size(); + + decoder_r = BrotliDecoderDecompressStream( + decoder_s, &avail_in, &next_in, &avail_out, + reinterpret_cast(&next_out), &total_out); + + if (decoder_r == BROTLI_DECODER_RESULT_ERROR) { return false; } + + if (!callback(buff.data(), buff.size() - avail_out)) { return false; } + } + + return decoder_r == BROTLI_DECODER_RESULT_SUCCESS || + decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT; +} +#endif + +inline bool has_header(const Headers &headers, const char *key) { + return headers.find(key) != headers.end(); +} + +inline const char *get_header_value(const Headers &headers, const char *key, + size_t id, const char *def) { + auto rng = headers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second.c_str(); } + return def; +} + +template +inline bool parse_header(const char *beg, const char *end, T fn) { + // Skip trailing spaces and tabs. + while (beg < end && is_space_or_tab(end[-1])) { + end--; + } + + auto p = beg; + while (p < end && *p != ':') { + p++; + } + + if (p == end) { return false; } + + auto key_end = p; + + if (*p++ != ':') { return false; } + + while (p < end && is_space_or_tab(*p)) { + p++; + } + + if (p < end) { + fn(std::string(beg, key_end), decode_url(std::string(p, end), false)); + return true; + } + + return false; +} + +inline bool read_headers(Stream &strm, Headers &headers) { + const auto bufsiz = 2048; + char buf[bufsiz]; + stream_line_reader line_reader(strm, buf, bufsiz); + + for (;;) { + if (!line_reader.getline()) { return false; } + + // Check if the line ends with CRLF. + auto line_terminator_len = 2; + if (line_reader.end_with_crlf()) { + // Blank line indicates end of headers. + if (line_reader.size() == 2) { break; } +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + } else { + // Blank line indicates end of headers. + if (line_reader.size() == 1) { break; } + line_terminator_len = 1; + } +#else + } else { + continue; // Skip invalid line. + } +#endif + + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + + // Exclude line terminator + auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; + + parse_header(line_reader.ptr(), end, + [&](std::string &&key, std::string &&val) { + headers.emplace(std::move(key), std::move(val)); + }); + } + + return true; +} + +inline bool read_content_with_length(Stream &strm, uint64_t len, + Progress progress, + ContentReceiverWithProgress out) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + + uint64_t r = 0; + while (r < len) { + auto read_len = static_cast(len - r); + auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); + if (n <= 0) { return false; } + + if (!out(buf, static_cast(n), r, len)) { return false; } + r += static_cast(n); + + if (progress) { + if (!progress(r, len)) { return false; } + } + } + + return true; +} + +inline void skip_content_with_length(Stream &strm, uint64_t len) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + uint64_t r = 0; + while (r < len) { + auto read_len = static_cast(len - r); + auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); + if (n <= 0) { return; } + r += static_cast(n); + } +} + +inline bool read_content_without_length(Stream &strm, + ContentReceiverWithProgress out) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + uint64_t r = 0; + for (;;) { + auto n = strm.read(buf, CPPHTTPLIB_RECV_BUFSIZ); + if (n < 0) { + return false; + } else if (n == 0) { + return true; + } + + if (!out(buf, static_cast(n), r, 0)) { return false; } + r += static_cast(n); + } + + return true; +} + +inline bool read_content_chunked(Stream &strm, + ContentReceiverWithProgress out) { + const auto bufsiz = 16; + char buf[bufsiz]; + + stream_line_reader line_reader(strm, buf, bufsiz); + + if (!line_reader.getline()) { return false; } + + unsigned long chunk_len; + while (true) { + char *end_ptr; + + chunk_len = std::strtoul(line_reader.ptr(), &end_ptr, 16); + + if (end_ptr == line_reader.ptr()) { return false; } + if (chunk_len == ULONG_MAX) { return false; } + + if (chunk_len == 0) { break; } + + if (!read_content_with_length(strm, chunk_len, nullptr, out)) { + return false; + } + + if (!line_reader.getline()) { return false; } + + if (strcmp(line_reader.ptr(), "\r\n")) { break; } + + if (!line_reader.getline()) { return false; } + } + + if (chunk_len == 0) { + // Reader terminator after chunks + if (!line_reader.getline() || strcmp(line_reader.ptr(), "\r\n")) + return false; + } + + return true; +} + +inline bool is_chunked_transfer_encoding(const Headers &headers) { + return !strcasecmp(get_header_value(headers, "Transfer-Encoding", 0, ""), + "chunked"); +} + +template +bool prepare_content_receiver(T &x, int &status, + ContentReceiverWithProgress receiver, + bool decompress, U callback) { + if (decompress) { + std::string encoding = x.get_header_value("Content-Encoding"); + std::unique_ptr decompressor; + + if (encoding == "gzip" || encoding == "deflate") { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + decompressor = detail::make_unique(); +#else + status = 415; + return false; +#endif + } else if (encoding.find("br") != std::string::npos) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + decompressor = detail::make_unique(); +#else + status = 415; + return false; +#endif + } + + if (decompressor) { + if (decompressor->is_valid()) { + ContentReceiverWithProgress out = [&](const char *buf, size_t n, + uint64_t off, uint64_t len) { + return decompressor->decompress(buf, n, + [&](const char *buf2, size_t n2) { + return receiver(buf2, n2, off, len); + }); + }; + return callback(std::move(out)); + } else { + status = 500; + return false; + } + } + } + + ContentReceiverWithProgress out = [&](const char *buf, size_t n, uint64_t off, + uint64_t len) { + return receiver(buf, n, off, len); + }; + return callback(std::move(out)); +} + +template +bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, + Progress progress, ContentReceiverWithProgress receiver, + bool decompress) { + return prepare_content_receiver( + x, status, std::move(receiver), decompress, + [&](const ContentReceiverWithProgress &out) { + auto ret = true; + auto exceed_payload_max_length = false; + + if (is_chunked_transfer_encoding(x.headers)) { + ret = read_content_chunked(strm, out); + } else if (!has_header(x.headers, "Content-Length")) { + ret = read_content_without_length(strm, out); + } else { + auto len = get_header_value(x.headers, "Content-Length"); + if (len > payload_max_length) { + exceed_payload_max_length = true; + skip_content_with_length(strm, len); + ret = false; + } else if (len > 0) { + ret = read_content_with_length(strm, len, std::move(progress), out); + } + } + + if (!ret) { status = exceed_payload_max_length ? 413 : 400; } + return ret; + }); +} + +inline ssize_t write_headers(Stream &strm, const Headers &headers) { + ssize_t write_len = 0; + for (const auto &x : headers) { + auto len = + strm.write_format("%s: %s\r\n", x.first.c_str(), x.second.c_str()); + if (len < 0) { return len; } + write_len += len; + } + auto len = strm.write("\r\n"); + if (len < 0) { return len; } + write_len += len; + return write_len; +} + +inline bool write_data(Stream &strm, const char *d, size_t l) { + size_t offset = 0; + while (offset < l) { + auto length = strm.write(d + offset, l - offset); + if (length < 0) { return false; } + offset += static_cast(length); + } + return true; +} + +template +inline bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, T is_shutting_down, + Error &error) { + size_t end_offset = offset + length; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + if (write_data(strm, d, l)) { + offset += l; + } else { + ok = false; + } + } + return ok; + }; + + data_sink.is_writable = [&](void) { return ok && strm.is_writable(); }; + + while (offset < end_offset && !is_shutting_down()) { + if (!content_provider(offset, end_offset - offset, data_sink)) { + error = Error::Canceled; + return false; + } + if (!ok) { + error = Error::Write; + return false; + } + } + + error = Error::Success; + return true; +} + +template +inline bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, + const T &is_shutting_down) { + auto error = Error::Success; + return write_content(strm, content_provider, offset, length, is_shutting_down, + error); +} + +template +inline bool +write_content_without_length(Stream &strm, + const ContentProvider &content_provider, + const T &is_shutting_down) { + size_t offset = 0; + auto data_available = true; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + offset += l; + if (!write_data(strm, d, l)) { ok = false; } + } + return ok; + }; + + data_sink.done = [&](void) { data_available = false; }; + + data_sink.is_writable = [&](void) { return ok && strm.is_writable(); }; + + while (data_available && !is_shutting_down()) { + if (!content_provider(offset, 0, data_sink)) { return false; } + if (!ok) { return false; } + } + return true; +} + +template +inline bool +write_content_chunked(Stream &strm, const ContentProvider &content_provider, + const T &is_shutting_down, U &compressor, Error &error) { + size_t offset = 0; + auto data_available = true; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + data_available = l > 0; + offset += l; + + std::string payload; + if (compressor.compress(d, l, false, + [&](const char *data, size_t data_len) { + payload.append(data, data_len); + return true; + })) { + if (!payload.empty()) { + // Emit chunked response header and footer for each chunk + auto chunk = + from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; + if (!write_data(strm, chunk.data(), chunk.size())) { ok = false; } + } + } else { + ok = false; + } + } + return ok; + }; + + data_sink.done = [&](void) { + if (!ok) { return; } + + data_available = false; + + std::string payload; + if (!compressor.compress(nullptr, 0, true, + [&](const char *data, size_t data_len) { + payload.append(data, data_len); + return true; + })) { + ok = false; + return; + } + + if (!payload.empty()) { + // Emit chunked response header and footer for each chunk + auto chunk = from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; + if (!write_data(strm, chunk.data(), chunk.size())) { + ok = false; + return; + } + } + + static const std::string done_marker("0\r\n\r\n"); + if (!write_data(strm, done_marker.data(), done_marker.size())) { + ok = false; + } + }; + + data_sink.is_writable = [&](void) { return ok && strm.is_writable(); }; + + while (data_available && !is_shutting_down()) { + if (!content_provider(offset, 0, data_sink)) { + error = Error::Canceled; + return false; + } + if (!ok) { + error = Error::Write; + return false; + } + } + + error = Error::Success; + return true; +} + +template +inline bool write_content_chunked(Stream &strm, + const ContentProvider &content_provider, + const T &is_shutting_down, U &compressor) { + auto error = Error::Success; + return write_content_chunked(strm, content_provider, is_shutting_down, + compressor, error); +} + +template +inline bool redirect(T &cli, Request &req, Response &res, + const std::string &path, const std::string &location, + Error &error) { + Request new_req = req; + new_req.path = path; + new_req.redirect_count_ -= 1; + + if (res.status == 303 && (req.method != "GET" && req.method != "HEAD")) { + new_req.method = "GET"; + new_req.body.clear(); + new_req.headers.clear(); + } + + Response new_res; + + auto ret = cli.send(new_req, new_res, error); + if (ret) { + req = new_req; + res = new_res; + res.location = location; + } + return ret; +} + +inline std::string params_to_query_str(const Params ¶ms) { + std::string query; + + for (auto it = params.begin(); it != params.end(); ++it) { + if (it != params.begin()) { query += "&"; } + query += it->first; + query += "="; + query += encode_query_param(it->second); + } + return query; +} + +inline void parse_query_text(const std::string &s, Params ¶ms) { + std::set cache; + split(s.data(), s.data() + s.size(), '&', [&](const char *b, const char *e) { + std::string kv(b, e); + if (cache.find(kv) != cache.end()) { return; } + cache.insert(kv); + + std::string key; + std::string val; + split(b, e, '=', [&](const char *b2, const char *e2) { + if (key.empty()) { + key.assign(b2, e2); + } else { + val.assign(b2, e2); + } + }); + + if (!key.empty()) { + params.emplace(decode_url(key, true), decode_url(val, true)); + } + }); +} + +inline bool parse_multipart_boundary(const std::string &content_type, + std::string &boundary) { + auto pos = content_type.find("boundary="); + if (pos == std::string::npos) { return false; } + boundary = content_type.substr(pos + 9); + if (boundary.length() >= 2 && boundary.front() == '"' && + boundary.back() == '"') { + boundary = boundary.substr(1, boundary.size() - 2); + } + return !boundary.empty(); +} + +#ifdef CPPHTTPLIB_NO_EXCEPTIONS +inline bool parse_range_header(const std::string &s, Ranges &ranges) { +#else +inline bool parse_range_header(const std::string &s, Ranges &ranges) try { +#endif + static auto re_first_range = std::regex(R"(bytes=(\d*-\d*(?:,\s*\d*-\d*)*))"); + std::smatch m; + if (std::regex_match(s, m, re_first_range)) { + auto pos = static_cast(m.position(1)); + auto len = static_cast(m.length(1)); + bool all_valid_ranges = true; + split(&s[pos], &s[pos + len], ',', [&](const char *b, const char *e) { + if (!all_valid_ranges) return; + static auto re_another_range = std::regex(R"(\s*(\d*)-(\d*))"); + std::cmatch cm; + if (std::regex_match(b, e, cm, re_another_range)) { + ssize_t first = -1; + if (!cm.str(1).empty()) { + first = static_cast(std::stoll(cm.str(1))); + } + + ssize_t last = -1; + if (!cm.str(2).empty()) { + last = static_cast(std::stoll(cm.str(2))); + } + + if (first != -1 && last != -1 && first > last) { + all_valid_ranges = false; + return; + } + ranges.emplace_back(std::make_pair(first, last)); + } + }); + return all_valid_ranges; + } + return false; +#ifdef CPPHTTPLIB_NO_EXCEPTIONS +} +#else +} catch (...) { return false; } +#endif + +class MultipartFormDataParser { +public: + MultipartFormDataParser() = default; + + void set_boundary(std::string &&boundary) { boundary_ = boundary; } + + bool is_valid() const { return is_valid_; } + + bool parse(const char *buf, size_t n, const ContentReceiver &content_callback, + const MultipartContentHeader &header_callback) { + + static const std::regex re_content_disposition( + "^Content-Disposition:\\s*form-data;\\s*name=\"(.*?)\"(?:;\\s*filename=" + "\"(.*?)\")?\\s*$", + std::regex_constants::icase); + static const std::string dash_ = "--"; + static const std::string crlf_ = "\r\n"; + + buf_append(buf, n); + + while (buf_size() > 0) { + switch (state_) { + case 0: { // Initial boundary + auto pattern = dash_ + boundary_ + crlf_; + if (pattern.size() > buf_size()) { return true; } + if (!buf_start_with(pattern)) { return false; } + buf_erase(pattern.size()); + state_ = 1; + break; + } + case 1: { // New entry + clear_file_info(); + state_ = 2; + break; + } + case 2: { // Headers + auto pos = buf_find(crlf_); + if (pos > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + while (pos < buf_size()) { + // Empty line + if (pos == 0) { + if (!header_callback(file_)) { + is_valid_ = false; + return false; + } + buf_erase(crlf_.size()); + state_ = 3; + break; + } + + static const std::string header_name = "content-type:"; + const auto header = buf_head(pos); + if (start_with_case_ignore(header, header_name)) { + file_.content_type = trim_copy(header.substr(header_name.size())); + } else { + std::smatch m; + if (std::regex_match(header, m, re_content_disposition)) { + file_.name = m[1]; + file_.filename = m[2]; + } + } + + buf_erase(pos + crlf_.size()); + pos = buf_find(crlf_); + } + if (state_ != 3) { return true; } + break; + } + case 3: { // Body + { + auto pattern = crlf_ + dash_; + if (pattern.size() > buf_size()) { return true; } + + auto pos = buf_find(pattern); + + if (!content_callback(buf_data(), pos)) { + is_valid_ = false; + return false; + } + + buf_erase(pos); + } + { + auto pattern = crlf_ + dash_ + boundary_; + if (pattern.size() > buf_size()) { return true; } + + auto pos = buf_find(pattern); + if (pos < buf_size()) { + if (!content_callback(buf_data(), pos)) { + is_valid_ = false; + return false; + } + + buf_erase(pos + pattern.size()); + state_ = 4; + } else { + if (!content_callback(buf_data(), pattern.size())) { + is_valid_ = false; + return false; + } + + buf_erase(pattern.size()); + } + } + break; + } + case 4: { // Boundary + if (crlf_.size() > buf_size()) { return true; } + if (buf_start_with(crlf_)) { + buf_erase(crlf_.size()); + state_ = 1; + } else { + auto pattern = dash_ + crlf_; + if (pattern.size() > buf_size()) { return true; } + if (buf_start_with(pattern)) { + buf_erase(pattern.size()); + is_valid_ = true; + state_ = 5; + } else { + return true; + } + } + break; + } + case 5: { // Done + is_valid_ = false; + return false; + } + } + } + + return true; + } + +private: + void clear_file_info() { + file_.name.clear(); + file_.filename.clear(); + file_.content_type.clear(); + } + + bool start_with_case_ignore(const std::string &a, + const std::string &b) const { + if (a.size() < b.size()) { return false; } + for (size_t i = 0; i < b.size(); i++) { + if (::tolower(a[i]) != ::tolower(b[i])) { return false; } + } + return true; + } + + std::string boundary_; + + size_t state_ = 0; + bool is_valid_ = false; + MultipartFormData file_; + + // Buffer + bool start_with(const std::string &a, size_t spos, size_t epos, + const std::string &b) const { + if (epos - spos < b.size()) { return false; } + for (size_t i = 0; i < b.size(); i++) { + if (a[i + spos] != b[i]) { return false; } + } + return true; + } + + size_t buf_size() const { return buf_epos_ - buf_spos_; } + + const char *buf_data() const { return &buf_[buf_spos_]; } + + std::string buf_head(size_t l) const { return buf_.substr(buf_spos_, l); } + + bool buf_start_with(const std::string &s) const { + return start_with(buf_, buf_spos_, buf_epos_, s); + } + + size_t buf_find(const std::string &s) const { + auto c = s.front(); + + size_t off = buf_spos_; + while (off < buf_epos_) { + auto pos = off; + while (true) { + if (pos == buf_epos_) { return buf_size(); } + if (buf_[pos] == c) { break; } + pos++; + } + + auto remaining_size = buf_epos_ - pos; + if (s.size() > remaining_size) { return buf_size(); } + + if (start_with(buf_, pos, buf_epos_, s)) { return pos - buf_spos_; } + + off = pos + 1; + } + + return buf_size(); + } + + void buf_append(const char *data, size_t n) { + auto remaining_size = buf_size(); + if (remaining_size > 0 && buf_spos_ > 0) { + for (size_t i = 0; i < remaining_size; i++) { + buf_[i] = buf_[buf_spos_ + i]; + } + } + buf_spos_ = 0; + buf_epos_ = remaining_size; + + if (remaining_size + n > buf_.size()) { buf_.resize(remaining_size + n); } + + for (size_t i = 0; i < n; i++) { + buf_[buf_epos_ + i] = data[i]; + } + buf_epos_ += n; + } + + void buf_erase(size_t size) { buf_spos_ += size; } + + std::string buf_; + size_t buf_spos_ = 0; + size_t buf_epos_ = 0; +}; + +inline std::string to_lower(const char *beg, const char *end) { + std::string out; + auto it = beg; + while (it != end) { + out += static_cast(::tolower(*it)); + it++; + } + return out; +} + +inline std::string make_multipart_data_boundary() { + static const char data[] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + // std::random_device might actually be deterministic on some + // platforms, but due to lack of support in the c++ standard library, + // doing better requires either some ugly hacks or breaking portability. + std::random_device seed_gen; + + // Request 128 bits of entropy for initialization + std::seed_seq seed_sequence{seed_gen(), seed_gen(), seed_gen(), seed_gen()}; + std::mt19937 engine(seed_sequence); + + std::string result = "--cpp-httplib-multipart-data-"; + + for (auto i = 0; i < 16; i++) { + result += data[engine() % (sizeof(data) - 1)]; + } + + return result; +} + +inline std::pair +get_range_offset_and_length(const Request &req, size_t content_length, + size_t index) { + auto r = req.ranges[index]; + + if (r.first == -1 && r.second == -1) { + return std::make_pair(0, content_length); + } + + auto slen = static_cast(content_length); + + if (r.first == -1) { + r.first = (std::max)(static_cast(0), slen - r.second); + r.second = slen - 1; + } + + if (r.second == -1) { r.second = slen - 1; } + return std::make_pair(r.first, static_cast(r.second - r.first) + 1); +} + +inline std::string make_content_range_header_field(size_t offset, size_t length, + size_t content_length) { + std::string field = "bytes "; + field += std::to_string(offset); + field += "-"; + field += std::to_string(offset + length - 1); + field += "/"; + field += std::to_string(content_length); + return field; +} + +template +bool process_multipart_ranges_data(const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type, + SToken stoken, CToken ctoken, + Content content) { + for (size_t i = 0; i < req.ranges.size(); i++) { + ctoken("--"); + stoken(boundary); + ctoken("\r\n"); + if (!content_type.empty()) { + ctoken("Content-Type: "); + stoken(content_type); + ctoken("\r\n"); + } + + auto offsets = get_range_offset_and_length(req, res.body.size(), i); + auto offset = offsets.first; + auto length = offsets.second; + + ctoken("Content-Range: "); + stoken(make_content_range_header_field(offset, length, res.body.size())); + ctoken("\r\n"); + ctoken("\r\n"); + if (!content(offset, length)) { return false; } + ctoken("\r\n"); + } + + ctoken("--"); + stoken(boundary); + ctoken("--\r\n"); + + return true; +} + +inline bool make_multipart_ranges_data(const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type, + std::string &data) { + return process_multipart_ranges_data( + req, res, boundary, content_type, + [&](const std::string &token) { data += token; }, + [&](const char *token) { data += token; }, + [&](size_t offset, size_t length) { + if (offset < res.body.size()) { + data += res.body.substr(offset, length); + return true; + } + return false; + }); +} + +inline size_t +get_multipart_ranges_data_length(const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type) { + size_t data_length = 0; + + process_multipart_ranges_data( + req, res, boundary, content_type, + [&](const std::string &token) { data_length += token.size(); }, + [&](const char *token) { data_length += strlen(token); }, + [&](size_t /*offset*/, size_t length) { + data_length += length; + return true; + }); + + return data_length; +} + +template +inline bool write_multipart_ranges_data(Stream &strm, const Request &req, + Response &res, + const std::string &boundary, + const std::string &content_type, + const T &is_shutting_down) { + return process_multipart_ranges_data( + req, res, boundary, content_type, + [&](const std::string &token) { strm.write(token); }, + [&](const char *token) { strm.write(token); }, + [&](size_t offset, size_t length) { + return write_content(strm, res.content_provider_, offset, length, + is_shutting_down); + }); +} + +inline std::pair +get_range_offset_and_length(const Request &req, const Response &res, + size_t index) { + auto r = req.ranges[index]; + + if (r.second == -1) { + r.second = static_cast(res.content_length_) - 1; + } + + return std::make_pair(r.first, r.second - r.first + 1); +} + +inline bool expect_content(const Request &req) { + if (req.method == "POST" || req.method == "PUT" || req.method == "PATCH" || + req.method == "PRI" || req.method == "DELETE") { + return true; + } + // TODO: check if Content-Length is set + return false; +} + +inline bool has_crlf(const char *s) { + auto p = s; + while (*p) { + if (*p == '\r' || *p == '\n') { return true; } + p++; + } + return false; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +template +inline std::string message_digest(const std::string &s, Init init, + Update update, Final final, + size_t digest_length) { + std::vector md(digest_length, 0); + CTX ctx; + init(&ctx); + update(&ctx, s.data(), s.size()); + final(md.data(), &ctx); + + std::stringstream ss; + for (auto c : md) { + ss << std::setfill('0') << std::setw(2) << std::hex << (unsigned int)c; + } + return ss.str(); +} + +inline std::string MD5(const std::string &s) { + return message_digest(s, MD5_Init, MD5_Update, MD5_Final, + MD5_DIGEST_LENGTH); +} + +inline std::string SHA_256(const std::string &s) { + return message_digest(s, SHA256_Init, SHA256_Update, SHA256_Final, + SHA256_DIGEST_LENGTH); +} + +inline std::string SHA_512(const std::string &s) { + return message_digest(s, SHA512_Init, SHA512_Update, SHA512_Final, + SHA512_DIGEST_LENGTH); +} +#endif + +#ifdef _WIN32 +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +// NOTE: This code came up with the following stackoverflow post: +// https://stackoverflow.com/questions/9507184/can-openssl-on-windows-use-the-system-certificate-store +inline bool load_system_certs_on_windows(X509_STORE *store) { + auto hStore = CertOpenSystemStoreW((HCRYPTPROV_LEGACY)NULL, L"ROOT"); + + if (!hStore) { return false; } + + PCCERT_CONTEXT pContext = NULL; + while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != + nullptr) { + auto encoded_cert = + static_cast(pContext->pbCertEncoded); + + auto x509 = d2i_X509(NULL, &encoded_cert, pContext->cbCertEncoded); + if (x509) { + X509_STORE_add_cert(store, x509); + X509_free(x509); + } + } + + CertFreeCertificateContext(pContext); + CertCloseStore(hStore, 0); + + return true; +} +#endif + +class WSInit { +public: + WSInit() { + WSADATA wsaData; + WSAStartup(0x0002, &wsaData); + } + + ~WSInit() { WSACleanup(); } +}; + +static WSInit wsinit_; +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline std::pair make_digest_authentication_header( + const Request &req, const std::map &auth, + size_t cnonce_count, const std::string &cnonce, const std::string &username, + const std::string &password, bool is_proxy = false) { + std::string nc; + { + std::stringstream ss; + ss << std::setfill('0') << std::setw(8) << std::hex << cnonce_count; + nc = ss.str(); + } + + std::string qop; + if (auth.find("qop") != auth.end()) { + qop = auth.at("qop"); + if (qop.find("auth-int") != std::string::npos) { + qop = "auth-int"; + } else if (qop.find("auth") != std::string::npos) { + qop = "auth"; + } else { + qop.clear(); + } + } + + std::string algo = "MD5"; + if (auth.find("algorithm") != auth.end()) { algo = auth.at("algorithm"); } + + std::string response; + { + auto H = algo == "SHA-256" ? detail::SHA_256 + : algo == "SHA-512" ? detail::SHA_512 + : detail::MD5; + + auto A1 = username + ":" + auth.at("realm") + ":" + password; + + auto A2 = req.method + ":" + req.path; + if (qop == "auth-int") { A2 += ":" + H(req.body); } + + if (qop.empty()) { + response = H(H(A1) + ":" + auth.at("nonce") + ":" + H(A2)); + } else { + response = H(H(A1) + ":" + auth.at("nonce") + ":" + nc + ":" + cnonce + + ":" + qop + ":" + H(A2)); + } + } + + auto opaque = (auth.find("opaque") != auth.end()) ? auth.at("opaque") : ""; + + auto field = "Digest username=\"" + username + "\", realm=\"" + + auth.at("realm") + "\", nonce=\"" + auth.at("nonce") + + "\", uri=\"" + req.path + "\", algorithm=" + algo + + (qop.empty() ? ", response=\"" + : ", qop=" + qop + ", nc=" + nc + ", cnonce=\"" + + cnonce + "\", response=\"") + + response + "\"" + + (opaque.empty() ? "" : ", opaque=\"" + opaque + "\""); + + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, field); +} +#endif + +inline bool parse_www_authenticate(const Response &res, + std::map &auth, + bool is_proxy) { + auto auth_key = is_proxy ? "Proxy-Authenticate" : "WWW-Authenticate"; + if (res.has_header(auth_key)) { + static auto re = std::regex(R"~((?:(?:,\s*)?(.+?)=(?:"(.*?)"|([^,]*))))~"); + auto s = res.get_header_value(auth_key); + auto pos = s.find(' '); + if (pos != std::string::npos) { + auto type = s.substr(0, pos); + if (type == "Basic") { + return false; + } else if (type == "Digest") { + s = s.substr(pos + 1); + auto beg = std::sregex_iterator(s.begin(), s.end(), re); + for (auto i = beg; i != std::sregex_iterator(); ++i) { + auto m = *i; + auto key = s.substr(static_cast(m.position(1)), + static_cast(m.length(1))); + auto val = m.length(2) > 0 + ? s.substr(static_cast(m.position(2)), + static_cast(m.length(2))) + : s.substr(static_cast(m.position(3)), + static_cast(m.length(3))); + auth[key] = val; + } + return true; + } + } + } + return false; +} + +// https://stackoverflow.com/questions/440133/how-do-i-create-a-random-alpha-numeric-string-in-c/440240#answer-440240 +inline std::string random_string(size_t length) { + auto randchar = []() -> char { + const char charset[] = "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"; + const size_t max_index = (sizeof(charset) - 1); + return charset[static_cast(std::rand()) % max_index]; + }; + std::string str(length, 0); + std::generate_n(str.begin(), length, randchar); + return str; +} + +class ContentProviderAdapter { +public: + explicit ContentProviderAdapter( + ContentProviderWithoutLength &&content_provider) + : content_provider_(content_provider) {} + + bool operator()(size_t offset, size_t, DataSink &sink) { + return content_provider_(offset, sink); + } + +private: + ContentProviderWithoutLength content_provider_; +}; + +} // namespace detail + +inline std::string hosted_at(const char *hostname) { + std::vector addrs; + hosted_at(hostname, addrs); + if (addrs.empty()) { return std::string(); } + return addrs[0]; +} + +inline void hosted_at(const char *hostname, std::vector &addrs) { + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (getaddrinfo(hostname, nullptr, &hints, &result)) { +#if defined __linux__ && !defined __ANDROID__ + res_init(); +#endif + return; + } + + for (auto rp = result; rp; rp = rp->ai_next) { + const auto &addr = + *reinterpret_cast(rp->ai_addr); + std::string ip; + int dummy = -1; + if (detail::get_remote_ip_and_port(addr, sizeof(struct sockaddr_storage), + ip, dummy)) { + addrs.push_back(ip); + } + } +} + +inline std::string append_query_params(const char *path, const Params ¶ms) { + std::string path_with_query = path; + const static std::regex re("[^?]+\\?.*"); + auto delm = std::regex_match(path, re) ? '&' : '?'; + path_with_query += delm + detail::params_to_query_str(params); + return path_with_query; +} + +// Header utilities +inline std::pair make_range_header(Ranges ranges) { + std::string field = "bytes="; + auto i = 0; + for (auto r : ranges) { + if (i != 0) { field += ", "; } + if (r.first != -1) { field += std::to_string(r.first); } + field += '-'; + if (r.second != -1) { field += std::to_string(r.second); } + i++; + } + return std::make_pair("Range", std::move(field)); +} + +inline std::pair +make_basic_authentication_header(const std::string &username, + const std::string &password, bool is_proxy) { + auto field = "Basic " + detail::base64_encode(username + ":" + password); + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, std::move(field)); +} + +inline std::pair +make_bearer_token_authentication_header(const std::string &token, + bool is_proxy = false) { + auto field = "Bearer " + token; + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, std::move(field)); +} + +// Request implementation +inline bool Request::has_header(const char *key) const { + return detail::has_header(headers, key); +} + +inline std::string Request::get_header_value(const char *key, size_t id) const { + return detail::get_header_value(headers, key, id, ""); +} + +inline size_t Request::get_header_value_count(const char *key) const { + auto r = headers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline void Request::set_header(const char *key, const char *val) { + if (!detail::has_crlf(key) && !detail::has_crlf(val)) { + headers.emplace(key, val); + } +} + +inline void Request::set_header(const char *key, const std::string &val) { + if (!detail::has_crlf(key) && !detail::has_crlf(val.c_str())) { + headers.emplace(key, val); + } +} + +inline bool Request::has_param(const char *key) const { + return params.find(key) != params.end(); +} + +inline std::string Request::get_param_value(const char *key, size_t id) const { + auto rng = params.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return std::string(); +} + +inline size_t Request::get_param_value_count(const char *key) const { + auto r = params.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline bool Request::is_multipart_form_data() const { + const auto &content_type = get_header_value("Content-Type"); + return !content_type.rfind("multipart/form-data", 0); +} + +inline bool Request::has_file(const char *key) const { + return files.find(key) != files.end(); +} + +inline MultipartFormData Request::get_file_value(const char *key) const { + auto it = files.find(key); + if (it != files.end()) { return it->second; } + return MultipartFormData(); +} + +// Response implementation +inline bool Response::has_header(const char *key) const { + return headers.find(key) != headers.end(); +} + +inline std::string Response::get_header_value(const char *key, + size_t id) const { + return detail::get_header_value(headers, key, id, ""); +} + +inline size_t Response::get_header_value_count(const char *key) const { + auto r = headers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline void Response::set_header(const char *key, const char *val) { + if (!detail::has_crlf(key) && !detail::has_crlf(val)) { + headers.emplace(key, val); + } +} + +inline void Response::set_header(const char *key, const std::string &val) { + if (!detail::has_crlf(key) && !detail::has_crlf(val.c_str())) { + headers.emplace(key, val); + } +} + +inline void Response::set_redirect(const char *url, int stat) { + if (!detail::has_crlf(url)) { + set_header("Location", url); + if (300 <= stat && stat < 400) { + this->status = stat; + } else { + this->status = 302; + } + } +} + +inline void Response::set_redirect(const std::string &url, int stat) { + set_redirect(url.c_str(), stat); +} + +inline void Response::set_content(const char *s, size_t n, + const char *content_type) { + body.assign(s, n); + + auto rng = headers.equal_range("Content-Type"); + headers.erase(rng.first, rng.second); + set_header("Content-Type", content_type); +} + +inline void Response::set_content(const std::string &s, + const char *content_type) { + set_content(s.data(), s.size(), content_type); +} + +inline void Response::set_content_provider( + size_t in_length, const char *content_type, ContentProvider provider, + ContentProviderResourceReleaser resource_releaser) { + assert(in_length > 0); + set_header("Content-Type", content_type); + content_length_ = in_length; + content_provider_ = std::move(provider); + content_provider_resource_releaser_ = resource_releaser; + is_chunked_content_provider_ = false; +} + +inline void Response::set_content_provider( + const char *content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = 0; + content_provider_ = detail::ContentProviderAdapter(std::move(provider)); + content_provider_resource_releaser_ = resource_releaser; + is_chunked_content_provider_ = false; +} + +inline void Response::set_chunked_content_provider( + const char *content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = 0; + content_provider_ = detail::ContentProviderAdapter(std::move(provider)); + content_provider_resource_releaser_ = resource_releaser; + is_chunked_content_provider_ = true; +} + +// Result implementation +inline bool Result::has_request_header(const char *key) const { + return request_headers_.find(key) != request_headers_.end(); +} + +inline std::string Result::get_request_header_value(const char *key, + size_t id) const { + return detail::get_header_value(request_headers_, key, id, ""); +} + +inline size_t Result::get_request_header_value_count(const char *key) const { + auto r = request_headers_.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +// Stream implementation +inline ssize_t Stream::write(const char *ptr) { + return write(ptr, strlen(ptr)); +} + +inline ssize_t Stream::write(const std::string &s) { + return write(s.data(), s.size()); +} + +namespace detail { + +// Socket stream implementation +inline SocketStream::SocketStream(socket_t sock, time_t read_timeout_sec, + time_t read_timeout_usec, + time_t write_timeout_sec, + time_t write_timeout_usec) + : sock_(sock), read_timeout_sec_(read_timeout_sec), + read_timeout_usec_(read_timeout_usec), + write_timeout_sec_(write_timeout_sec), + write_timeout_usec_(write_timeout_usec), read_buff_(read_buff_size_, 0) {} + +inline SocketStream::~SocketStream() {} + +inline bool SocketStream::is_readable() const { + return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; +} + +inline bool SocketStream::is_writable() const { + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0; +} + +inline ssize_t SocketStream::read(char *ptr, size_t size) { +#ifdef _WIN32 + size = + (std::min)(size, static_cast((std::numeric_limits::max)())); +#else + size = (std::min)(size, + static_cast((std::numeric_limits::max)())); +#endif + + if (read_buff_off_ < read_buff_content_size_) { + auto remaining_size = read_buff_content_size_ - read_buff_off_; + if (size <= remaining_size) { + memcpy(ptr, read_buff_.data() + read_buff_off_, size); + read_buff_off_ += size; + return static_cast(size); + } else { + memcpy(ptr, read_buff_.data() + read_buff_off_, remaining_size); + read_buff_off_ += remaining_size; + return static_cast(remaining_size); + } + } + + if (!is_readable()) { return -1; } + + read_buff_off_ = 0; + read_buff_content_size_ = 0; + + if (size < read_buff_size_) { + auto n = read_socket(sock_, read_buff_.data(), read_buff_size_, + CPPHTTPLIB_RECV_FLAGS); + if (n <= 0) { + return n; + } else if (n <= static_cast(size)) { + memcpy(ptr, read_buff_.data(), static_cast(n)); + return n; + } else { + memcpy(ptr, read_buff_.data(), size); + read_buff_off_ = size; + read_buff_content_size_ = static_cast(n); + return static_cast(size); + } + } else { + return read_socket(sock_, ptr, size, CPPHTTPLIB_RECV_FLAGS); + } +} + +inline ssize_t SocketStream::write(const char *ptr, size_t size) { + if (!is_writable()) { return -1; } + +#ifdef _WIN32 + size = + (std::min)(size, static_cast((std::numeric_limits::max)())); +#endif + + return send_socket(sock_, ptr, size, CPPHTTPLIB_SEND_FLAGS); +} + +inline void SocketStream::get_remote_ip_and_port(std::string &ip, + int &port) const { + return detail::get_remote_ip_and_port(sock_, ip, port); +} + +inline socket_t SocketStream::socket() const { return sock_; } + +// Buffer stream implementation +inline bool BufferStream::is_readable() const { return true; } + +inline bool BufferStream::is_writable() const { return true; } + +inline ssize_t BufferStream::read(char *ptr, size_t size) { +#if defined(_MSC_VER) && _MSC_VER <= 1900 + auto len_read = buffer._Copy_s(ptr, size, size, position); +#else + auto len_read = buffer.copy(ptr, size, position); +#endif + position += static_cast(len_read); + return static_cast(len_read); +} + +inline ssize_t BufferStream::write(const char *ptr, size_t size) { + buffer.append(ptr, size); + return static_cast(size); +} + +inline void BufferStream::get_remote_ip_and_port(std::string & /*ip*/, + int & /*port*/) const {} + +inline socket_t BufferStream::socket() const { return 0; } + +inline const std::string &BufferStream::get_buffer() const { return buffer; } + +} // namespace detail + +// HTTP server implementation +inline Server::Server() + : new_task_queue( + [] { return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT); }), + svr_sock_(INVALID_SOCKET), is_running_(false) { +#ifndef _WIN32 + signal(SIGPIPE, SIG_IGN); +#endif +} + +inline Server::~Server() {} + +inline Server &Server::Get(const std::string &pattern, Handler handler) { + get_handlers_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Post(const std::string &pattern, Handler handler) { + post_handlers_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Post(const std::string &pattern, + HandlerWithContentReader handler) { + post_handlers_for_content_reader_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Put(const std::string &pattern, Handler handler) { + put_handlers_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Put(const std::string &pattern, + HandlerWithContentReader handler) { + put_handlers_for_content_reader_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Patch(const std::string &pattern, Handler handler) { + patch_handlers_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Patch(const std::string &pattern, + HandlerWithContentReader handler) { + patch_handlers_for_content_reader_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Delete(const std::string &pattern, Handler handler) { + delete_handlers_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Delete(const std::string &pattern, + HandlerWithContentReader handler) { + delete_handlers_for_content_reader_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline Server &Server::Options(const std::string &pattern, Handler handler) { + options_handlers_.push_back( + std::make_pair(std::regex(pattern), std::move(handler))); + return *this; +} + +inline bool Server::set_base_dir(const std::string &dir, + const std::string &mount_point) { + return set_mount_point(mount_point, dir); +} + +inline bool Server::set_mount_point(const std::string &mount_point, + const std::string &dir, Headers headers) { + if (detail::is_dir(dir)) { + std::string mnt = !mount_point.empty() ? mount_point : "/"; + if (!mnt.empty() && mnt[0] == '/') { + base_dirs_.push_back({mnt, dir, std::move(headers)}); + return true; + } + } + return false; +} + +inline bool Server::remove_mount_point(const std::string &mount_point) { + for (auto it = base_dirs_.begin(); it != base_dirs_.end(); ++it) { + if (it->mount_point == mount_point) { + base_dirs_.erase(it); + return true; + } + } + return false; +} + +inline Server & +Server::set_file_extension_and_mimetype_mapping(const char *ext, + const char *mime) { + file_extension_and_mimetype_map_[ext] = mime; + return *this; +} + +inline Server &Server::set_file_request_handler(Handler handler) { + file_request_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_error_handler(HandlerWithResponse handler) { + error_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_error_handler(Handler handler) { + error_handler_ = [handler](const Request &req, Response &res) { + handler(req, res); + return HandlerResponse::Handled; + }; + return *this; +} + +inline Server &Server::set_exception_handler(ExceptionHandler handler) { + exception_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_pre_routing_handler(HandlerWithResponse handler) { + pre_routing_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_post_routing_handler(Handler handler) { + post_routing_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_logger(Logger logger) { + logger_ = std::move(logger); + return *this; +} + +inline Server & +Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) { + expect_100_continue_handler_ = std::move(handler); + + return *this; +} + +inline Server &Server::set_address_family(int family) { + address_family_ = family; + return *this; +} + +inline Server &Server::set_tcp_nodelay(bool on) { + tcp_nodelay_ = on; + return *this; +} + +inline Server &Server::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); + return *this; +} + +inline Server &Server::set_default_headers(Headers headers) { + default_headers_ = std::move(headers); + return *this; +} + +inline Server &Server::set_keep_alive_max_count(size_t count) { + keep_alive_max_count_ = count; + return *this; +} + +inline Server &Server::set_keep_alive_timeout(time_t sec) { + keep_alive_timeout_sec_ = sec; + return *this; +} + +inline Server &Server::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; + return *this; +} + +inline Server &Server::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; + return *this; +} + +inline Server &Server::set_idle_interval(time_t sec, time_t usec) { + idle_interval_sec_ = sec; + idle_interval_usec_ = usec; + return *this; +} + +inline Server &Server::set_payload_max_length(size_t length) { + payload_max_length_ = length; + return *this; +} + +inline bool Server::bind_to_port(const char *host, int port, int socket_flags) { + if (bind_internal(host, port, socket_flags) < 0) return false; + return true; +} +inline int Server::bind_to_any_port(const char *host, int socket_flags) { + return bind_internal(host, 0, socket_flags); +} + +inline bool Server::listen_after_bind() { return listen_internal(); } + +inline bool Server::listen(const char *host, int port, int socket_flags) { + return bind_to_port(host, port, socket_flags) && listen_internal(); +} + +inline bool Server::is_running() const { return is_running_; } + +inline void Server::stop() { + if (is_running_) { + assert(svr_sock_ != INVALID_SOCKET); + std::atomic sock(svr_sock_.exchange(INVALID_SOCKET)); + detail::shutdown_socket(sock); + detail::close_socket(sock); + } +} + +inline bool Server::parse_request_line(const char *s, Request &req) { + auto len = strlen(s); + if (len < 2 || s[len - 2] != '\r' || s[len - 1] != '\n') { return false; } + len -= 2; + + { + size_t count = 0; + + detail::split(s, s + len, ' ', [&](const char *b, const char *e) { + switch (count) { + case 0: req.method = std::string(b, e); break; + case 1: req.target = std::string(b, e); break; + case 2: req.version = std::string(b, e); break; + default: break; + } + count++; + }); + + if (count != 3) { return false; } + } + + static const std::set methods{ + "GET", "HEAD", "POST", "PUT", "DELETE", + "CONNECT", "OPTIONS", "TRACE", "PATCH", "PRI"}; + + if (methods.find(req.method) == methods.end()) { return false; } + + if (req.version != "HTTP/1.1" && req.version != "HTTP/1.0") { return false; } + + { + size_t count = 0; + + detail::split(req.target.data(), req.target.data() + req.target.size(), '?', + [&](const char *b, const char *e) { + switch (count) { + case 0: + req.path = detail::decode_url(std::string(b, e), false); + break; + case 1: { + if (e - b > 0) { + detail::parse_query_text(std::string(b, e), req.params); + } + break; + } + default: break; + } + count++; + }); + + if (count > 2) { return false; } + } + + return true; +} + +inline bool Server::write_response(Stream &strm, bool close_connection, + const Request &req, Response &res) { + return write_response_core(strm, close_connection, req, res, false); +} + +inline bool Server::write_response_with_content(Stream &strm, + bool close_connection, + const Request &req, + Response &res) { + return write_response_core(strm, close_connection, req, res, true); +} + +inline bool Server::write_response_core(Stream &strm, bool close_connection, + const Request &req, Response &res, + bool need_apply_ranges) { + assert(res.status != -1); + + if (400 <= res.status && error_handler_ && + error_handler_(req, res) == HandlerResponse::Handled) { + need_apply_ranges = true; + } + + std::string content_type; + std::string boundary; + if (need_apply_ranges) { apply_ranges(req, res, content_type, boundary); } + + // Prepare additional headers + if (close_connection || req.get_header_value("Connection") == "close") { + res.set_header("Connection", "close"); + } else { + std::stringstream ss; + ss << "timeout=" << keep_alive_timeout_sec_ + << ", max=" << keep_alive_max_count_; + res.set_header("Keep-Alive", ss.str()); + } + + if (!res.has_header("Content-Type") && + (!res.body.empty() || res.content_length_ > 0 || res.content_provider_)) { + res.set_header("Content-Type", "text/plain"); + } + + if (!res.has_header("Content-Length") && res.body.empty() && + !res.content_length_ && !res.content_provider_) { + res.set_header("Content-Length", "0"); + } + + if (!res.has_header("Accept-Ranges") && req.method == "HEAD") { + res.set_header("Accept-Ranges", "bytes"); + } + + if (post_routing_handler_) { post_routing_handler_(req, res); } + + // Response line and headers + { + detail::BufferStream bstrm; + + if (!bstrm.write_format("HTTP/1.1 %d %s\r\n", res.status, + detail::status_message(res.status))) { + return false; + } + + if (!detail::write_headers(bstrm, res.headers)) { return false; } + + // Flush buffer + auto &data = bstrm.get_buffer(); + strm.write(data.data(), data.size()); + } + + // Body + auto ret = true; + if (req.method != "HEAD") { + if (!res.body.empty()) { + if (!strm.write(res.body)) { ret = false; } + } else if (res.content_provider_) { + if (write_content_with_provider(strm, req, res, boundary, content_type)) { + res.content_provider_success_ = true; + } else { + res.content_provider_success_ = false; + ret = false; + } + } + } + + // Log + if (logger_) { logger_(req, res); } + + return ret; +} + +inline bool +Server::write_content_with_provider(Stream &strm, const Request &req, + Response &res, const std::string &boundary, + const std::string &content_type) { + auto is_shutting_down = [this]() { + return this->svr_sock_ == INVALID_SOCKET; + }; + + if (res.content_length_ > 0) { + if (req.ranges.empty()) { + return detail::write_content(strm, res.content_provider_, 0, + res.content_length_, is_shutting_down); + } else if (req.ranges.size() == 1) { + auto offsets = + detail::get_range_offset_and_length(req, res.content_length_, 0); + auto offset = offsets.first; + auto length = offsets.second; + return detail::write_content(strm, res.content_provider_, offset, length, + is_shutting_down); + } else { + return detail::write_multipart_ranges_data( + strm, req, res, boundary, content_type, is_shutting_down); + } + } else { + if (res.is_chunked_content_provider_) { + auto type = detail::encoding_type(req, res); + + std::unique_ptr compressor; + if (type == detail::EncodingType::Gzip) { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + compressor = detail::make_unique(); +#endif + } else if (type == detail::EncodingType::Brotli) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + compressor = detail::make_unique(); +#endif + } else { + compressor = detail::make_unique(); + } + assert(compressor != nullptr); + + return detail::write_content_chunked(strm, res.content_provider_, + is_shutting_down, *compressor); + } else { + return detail::write_content_without_length(strm, res.content_provider_, + is_shutting_down); + } + } +} + +inline bool Server::read_content(Stream &strm, Request &req, Response &res) { + MultipartFormDataMap::iterator cur; + if (read_content_core( + strm, req, res, + // Regular + [&](const char *buf, size_t n) { + if (req.body.size() + n > req.body.max_size()) { return false; } + req.body.append(buf, n); + return true; + }, + // Multipart + [&](const MultipartFormData &file) { + cur = req.files.emplace(file.name, file); + return true; + }, + [&](const char *buf, size_t n) { + auto &content = cur->second.content; + if (content.size() + n > content.max_size()) { return false; } + content.append(buf, n); + return true; + })) { + const auto &content_type = req.get_header_value("Content-Type"); + if (!content_type.find("application/x-www-form-urlencoded")) { + if (req.body.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { + res.status = 413; // NOTE: should be 414? + return false; + } + detail::parse_query_text(req.body, req.params); + } + return true; + } + return false; +} + +inline bool Server::read_content_with_content_receiver( + Stream &strm, Request &req, Response &res, ContentReceiver receiver, + MultipartContentHeader multipart_header, + ContentReceiver multipart_receiver) { + return read_content_core(strm, req, res, std::move(receiver), + std::move(multipart_header), + std::move(multipart_receiver)); +} + +inline bool Server::read_content_core(Stream &strm, Request &req, Response &res, + ContentReceiver receiver, + MultipartContentHeader mulitpart_header, + ContentReceiver multipart_receiver) { + detail::MultipartFormDataParser multipart_form_data_parser; + ContentReceiverWithProgress out; + + if (req.is_multipart_form_data()) { + const auto &content_type = req.get_header_value("Content-Type"); + std::string boundary; + if (!detail::parse_multipart_boundary(content_type, boundary)) { + res.status = 400; + return false; + } + + multipart_form_data_parser.set_boundary(std::move(boundary)); + out = [&](const char *buf, size_t n, uint64_t /*off*/, uint64_t /*len*/) { + /* For debug + size_t pos = 0; + while (pos < n) { + auto read_size = (std::min)(1, n - pos); + auto ret = multipart_form_data_parser.parse( + buf + pos, read_size, multipart_receiver, mulitpart_header); + if (!ret) { return false; } + pos += read_size; + } + return true; + */ + return multipart_form_data_parser.parse(buf, n, multipart_receiver, + mulitpart_header); + }; + } else { + out = [receiver](const char *buf, size_t n, uint64_t /*off*/, + uint64_t /*len*/) { return receiver(buf, n); }; + } + + if (req.method == "DELETE" && !req.has_header("Content-Length")) { + return true; + } + + if (!detail::read_content(strm, req, payload_max_length_, res.status, nullptr, + out, true)) { + return false; + } + + if (req.is_multipart_form_data()) { + if (!multipart_form_data_parser.is_valid()) { + res.status = 400; + return false; + } + } + + return true; +} + +inline bool Server::handle_file_request(const Request &req, Response &res, + bool head) { + for (const auto &entry : base_dirs_) { + // Prefix match + if (!req.path.compare(0, entry.mount_point.size(), entry.mount_point)) { + std::string sub_path = "/" + req.path.substr(entry.mount_point.size()); + if (detail::is_valid_path(sub_path)) { + auto path = entry.base_dir + sub_path; + if (path.back() == '/') { path += "index.html"; } + + if (detail::is_file(path)) { + detail::read_file(path, res.body); + auto type = + detail::find_content_type(path, file_extension_and_mimetype_map_); + if (type) { res.set_header("Content-Type", type); } + for (const auto &kv : entry.headers) { + res.set_header(kv.first.c_str(), kv.second); + } + res.status = req.has_header("Range") ? 206 : 200; + if (!head && file_request_handler_) { + file_request_handler_(req, res); + } + return true; + } + } + } + } + return false; +} + +inline socket_t +Server::create_server_socket(const char *host, int port, int socket_flags, + SocketOptions socket_options) const { + return detail::create_socket( + host, "", port, address_family_, socket_flags, tcp_nodelay_, + std::move(socket_options), + [](socket_t sock, struct addrinfo &ai) -> bool { + if (::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + return false; + } + if (::listen(sock, CPPHTTPLIB_LISTEN_BACKLOG)) { return false; } + return true; + }); +} + +inline int Server::bind_internal(const char *host, int port, int socket_flags) { + if (!is_valid()) { return -1; } + + svr_sock_ = create_server_socket(host, port, socket_flags, socket_options_); + if (svr_sock_ == INVALID_SOCKET) { return -1; } + + if (port == 0) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(svr_sock_, reinterpret_cast(&addr), + &addr_len) == -1) { + return -1; + } + if (addr.ss_family == AF_INET) { + return ntohs(reinterpret_cast(&addr)->sin_port); + } else if (addr.ss_family == AF_INET6) { + return ntohs(reinterpret_cast(&addr)->sin6_port); + } else { + return -1; + } + } else { + return port; + } +} + +inline bool Server::listen_internal() { + auto ret = true; + is_running_ = true; + + { + std::unique_ptr task_queue(new_task_queue()); + + while (svr_sock_ != INVALID_SOCKET) { +#ifndef _WIN32 + if (idle_interval_sec_ > 0 || idle_interval_usec_ > 0) { +#endif + auto val = detail::select_read(svr_sock_, idle_interval_sec_, + idle_interval_usec_); + if (val == 0) { // Timeout + task_queue->on_idle(); + continue; + } +#ifndef _WIN32 + } +#endif + socket_t sock = accept(svr_sock_, nullptr, nullptr); + + if (sock == INVALID_SOCKET) { + if (errno == EMFILE) { + // The per-process limit of open file descriptors has been reached. + // Try to accept new connections after a short sleep. + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + continue; + } + if (svr_sock_ != INVALID_SOCKET) { + detail::close_socket(svr_sock_); + ret = false; + } else { + ; // The server socket was closed by user. + } + break; + } + + { +#ifdef _WIN32 + auto timeout = static_cast(read_timeout_sec_ * 1000 + + read_timeout_usec_ / 1000); + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, + sizeof(timeout)); +#else + timeval tv; + tv.tv_sec = static_cast(read_timeout_sec_); + tv.tv_usec = static_cast(read_timeout_usec_); + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); +#endif + } + { + +#ifdef _WIN32 + auto timeout = static_cast(write_timeout_sec_ * 1000 + + write_timeout_usec_ / 1000); + setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, + sizeof(timeout)); +#else + timeval tv; + tv.tv_sec = static_cast(write_timeout_sec_); + tv.tv_usec = static_cast(write_timeout_usec_); + setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); +#endif + } + +#if __cplusplus > 201703L + task_queue->enqueue([=, this]() { process_and_close_socket(sock); }); +#else + task_queue->enqueue([=]() { process_and_close_socket(sock); }); +#endif + } + + task_queue->shutdown(); + } + + is_running_ = false; + return ret; +} + +inline bool Server::routing(Request &req, Response &res, Stream &strm) { + if (pre_routing_handler_ && + pre_routing_handler_(req, res) == HandlerResponse::Handled) { + return true; + } + + // File handler + bool is_head_request = req.method == "HEAD"; + if ((req.method == "GET" || is_head_request) && + handle_file_request(req, res, is_head_request)) { + return true; + } + + if (detail::expect_content(req)) { + // Content reader handler + { + ContentReader reader( + [&](ContentReceiver receiver) { + return read_content_with_content_receiver( + strm, req, res, std::move(receiver), nullptr, nullptr); + }, + [&](MultipartContentHeader header, ContentReceiver receiver) { + return read_content_with_content_receiver(strm, req, res, nullptr, + std::move(header), + std::move(receiver)); + }); + + if (req.method == "POST") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + post_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "PUT") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + put_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "PATCH") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + patch_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "DELETE") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + delete_handlers_for_content_reader_)) { + return true; + } + } + } + + // Read content into `req.body` + if (!read_content(strm, req, res)) { return false; } + } + + // Regular handler + if (req.method == "GET" || req.method == "HEAD") { + return dispatch_request(req, res, get_handlers_); + } else if (req.method == "POST") { + return dispatch_request(req, res, post_handlers_); + } else if (req.method == "PUT") { + return dispatch_request(req, res, put_handlers_); + } else if (req.method == "DELETE") { + return dispatch_request(req, res, delete_handlers_); + } else if (req.method == "OPTIONS") { + return dispatch_request(req, res, options_handlers_); + } else if (req.method == "PATCH") { + return dispatch_request(req, res, patch_handlers_); + } + + res.status = 400; + return false; +} + +inline bool Server::dispatch_request(Request &req, Response &res, + const Handlers &handlers) { + for (const auto &x : handlers) { + const auto &pattern = x.first; + const auto &handler = x.second; + + if (std::regex_match(req.path, req.matches, pattern)) { + handler(req, res); + return true; + } + } + return false; +} + +inline void Server::apply_ranges(const Request &req, Response &res, + std::string &content_type, + std::string &boundary) { + if (req.ranges.size() > 1) { + boundary = detail::make_multipart_data_boundary(); + + auto it = res.headers.find("Content-Type"); + if (it != res.headers.end()) { + content_type = it->second; + res.headers.erase(it); + } + + res.headers.emplace("Content-Type", + "multipart/byteranges; boundary=" + boundary); + } + + auto type = detail::encoding_type(req, res); + + if (res.body.empty()) { + if (res.content_length_ > 0) { + size_t length = 0; + if (req.ranges.empty()) { + length = res.content_length_; + } else if (req.ranges.size() == 1) { + auto offsets = + detail::get_range_offset_and_length(req, res.content_length_, 0); + auto offset = offsets.first; + length = offsets.second; + auto content_range = detail::make_content_range_header_field( + offset, length, res.content_length_); + res.set_header("Content-Range", content_range); + } else { + length = detail::get_multipart_ranges_data_length(req, res, boundary, + content_type); + } + res.set_header("Content-Length", std::to_string(length)); + } else { + if (res.content_provider_) { + if (res.is_chunked_content_provider_) { + res.set_header("Transfer-Encoding", "chunked"); + if (type == detail::EncodingType::Gzip) { + res.set_header("Content-Encoding", "gzip"); + } else if (type == detail::EncodingType::Brotli) { + res.set_header("Content-Encoding", "br"); + } + } + } + } + } else { + if (req.ranges.empty()) { + ; + } else if (req.ranges.size() == 1) { + auto offsets = + detail::get_range_offset_and_length(req, res.body.size(), 0); + auto offset = offsets.first; + auto length = offsets.second; + auto content_range = detail::make_content_range_header_field( + offset, length, res.body.size()); + res.set_header("Content-Range", content_range); + if (offset < res.body.size()) { + res.body = res.body.substr(offset, length); + } else { + res.body.clear(); + res.status = 416; + } + } else { + std::string data; + if (detail::make_multipart_ranges_data(req, res, boundary, content_type, + data)) { + res.body.swap(data); + } else { + res.body.clear(); + res.status = 416; + } + } + + if (type != detail::EncodingType::None) { + std::unique_ptr compressor; + std::string content_encoding; + + if (type == detail::EncodingType::Gzip) { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + compressor = detail::make_unique(); + content_encoding = "gzip"; +#endif + } else if (type == detail::EncodingType::Brotli) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + compressor = detail::make_unique(); + content_encoding = "br"; +#endif + } + + if (compressor) { + std::string compressed; + if (compressor->compress(res.body.data(), res.body.size(), true, + [&](const char *data, size_t data_len) { + compressed.append(data, data_len); + return true; + })) { + res.body.swap(compressed); + res.set_header("Content-Encoding", content_encoding); + } + } + } + + auto length = std::to_string(res.body.size()); + res.set_header("Content-Length", length); + } +} + +inline bool Server::dispatch_request_for_content_reader( + Request &req, Response &res, ContentReader content_reader, + const HandlersForContentReader &handlers) { + for (const auto &x : handlers) { + const auto &pattern = x.first; + const auto &handler = x.second; + + if (std::regex_match(req.path, req.matches, pattern)) { + handler(req, res, content_reader); + return true; + } + } + return false; +} + +inline bool +Server::process_request(Stream &strm, bool close_connection, + bool &connection_closed, + const std::function &setup_request) { + std::array buf{}; + + detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); + + // Connection has been closed on client + if (!line_reader.getline()) { return false; } + + Request req; + Response res; + + res.version = "HTTP/1.1"; + + for (const auto &header : default_headers_) { + if (res.headers.find(header.first) == res.headers.end()) { + res.headers.insert(header); + } + } + +#ifdef _WIN32 + // TODO: Increase FD_SETSIZE statically (libzmq), dynamically (MySQL). +#else +#ifndef CPPHTTPLIB_USE_POLL + // Socket file descriptor exceeded FD_SETSIZE... + if (strm.socket() >= FD_SETSIZE) { + Headers dummy; + detail::read_headers(strm, dummy); + res.status = 500; + return write_response(strm, close_connection, req, res); + } +#endif +#endif + + // Check if the request URI doesn't exceed the limit + if (line_reader.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { + Headers dummy; + detail::read_headers(strm, dummy); + res.status = 414; + return write_response(strm, close_connection, req, res); + } + + // Request line and headers + if (!parse_request_line(line_reader.ptr(), req) || + !detail::read_headers(strm, req.headers)) { + res.status = 400; + return write_response(strm, close_connection, req, res); + } + + if (req.get_header_value("Connection") == "close") { + connection_closed = true; + } + + if (req.version == "HTTP/1.0" && + req.get_header_value("Connection") != "Keep-Alive") { + connection_closed = true; + } + + strm.get_remote_ip_and_port(req.remote_addr, req.remote_port); + req.set_header("REMOTE_ADDR", req.remote_addr); + req.set_header("REMOTE_PORT", std::to_string(req.remote_port)); + + if (req.has_header("Range")) { + const auto &range_header_value = req.get_header_value("Range"); + if (!detail::parse_range_header(range_header_value, req.ranges)) { + res.status = 416; + return write_response(strm, close_connection, req, res); + } + } + + if (setup_request) { setup_request(req); } + + if (req.get_header_value("Expect") == "100-continue") { + auto status = 100; + if (expect_100_continue_handler_) { + status = expect_100_continue_handler_(req, res); + } + switch (status) { + case 100: + case 417: + strm.write_format("HTTP/1.1 %d %s\r\n\r\n", status, + detail::status_message(status)); + break; + default: return write_response(strm, close_connection, req, res); + } + } + + // Rounting + bool routed = false; +#ifdef CPPHTTPLIB_NO_EXCEPTIONS + routed = routing(req, res, strm); +#else + try { + routed = routing(req, res, strm); + } catch (std::exception &e) { + if (exception_handler_) { + exception_handler_(req, res, e); + routed = true; + } else { + res.status = 500; + res.set_header("EXCEPTION_WHAT", e.what()); + } + } catch (...) { + res.status = 500; + res.set_header("EXCEPTION_WHAT", "UNKNOWN"); + } +#endif + + if (routed) { + if (res.status == -1) { res.status = req.ranges.empty() ? 200 : 206; } + return write_response_with_content(strm, close_connection, req, res); + } else { + if (res.status == -1) { res.status = 404; } + return write_response(strm, close_connection, req, res); + } +} + +inline bool Server::is_valid() const { return true; } + +inline bool Server::process_and_close_socket(socket_t sock) { + auto ret = detail::process_server_socket( + svr_sock_, sock, keep_alive_max_count_, keep_alive_timeout_sec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, + [this](Stream &strm, bool close_connection, bool &connection_closed) { + return process_request(strm, close_connection, connection_closed, + nullptr); + }); + + detail::shutdown_socket(sock); + detail::close_socket(sock); + return ret; +} + +// HTTP client implementation +inline ClientImpl::ClientImpl(const std::string &host) + : ClientImpl(host, 80, std::string(), std::string()) {} + +inline ClientImpl::ClientImpl(const std::string &host, int port) + : ClientImpl(host, port, std::string(), std::string()) {} + +inline ClientImpl::ClientImpl(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : host_(host), port_(port), + host_and_port_(adjust_host_string(host) + ":" + std::to_string(port)), + client_cert_path_(client_cert_path), client_key_path_(client_key_path) {} + +inline ClientImpl::~ClientImpl() { + std::lock_guard guard(socket_mutex_); + shutdown_socket(socket_); + close_socket(socket_); +} + +inline bool ClientImpl::is_valid() const { return true; } + +inline void ClientImpl::copy_settings(const ClientImpl &rhs) { + client_cert_path_ = rhs.client_cert_path_; + client_key_path_ = rhs.client_key_path_; + connection_timeout_sec_ = rhs.connection_timeout_sec_; + read_timeout_sec_ = rhs.read_timeout_sec_; + read_timeout_usec_ = rhs.read_timeout_usec_; + write_timeout_sec_ = rhs.write_timeout_sec_; + write_timeout_usec_ = rhs.write_timeout_usec_; + basic_auth_username_ = rhs.basic_auth_username_; + basic_auth_password_ = rhs.basic_auth_password_; + bearer_token_auth_token_ = rhs.bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + digest_auth_username_ = rhs.digest_auth_username_; + digest_auth_password_ = rhs.digest_auth_password_; +#endif + keep_alive_ = rhs.keep_alive_; + follow_location_ = rhs.follow_location_; + url_encode_ = rhs.url_encode_; + address_family_ = rhs.address_family_; + tcp_nodelay_ = rhs.tcp_nodelay_; + socket_options_ = rhs.socket_options_; + compress_ = rhs.compress_; + decompress_ = rhs.decompress_; + interface_ = rhs.interface_; + proxy_host_ = rhs.proxy_host_; + proxy_port_ = rhs.proxy_port_; + proxy_basic_auth_username_ = rhs.proxy_basic_auth_username_; + proxy_basic_auth_password_ = rhs.proxy_basic_auth_password_; + proxy_bearer_token_auth_token_ = rhs.proxy_bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + proxy_digest_auth_username_ = rhs.proxy_digest_auth_username_; + proxy_digest_auth_password_ = rhs.proxy_digest_auth_password_; +#endif +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + ca_cert_file_path_ = rhs.ca_cert_file_path_; + ca_cert_dir_path_ = rhs.ca_cert_dir_path_; + ca_cert_store_ = rhs.ca_cert_store_; +#endif +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + server_certificate_verification_ = rhs.server_certificate_verification_; +#endif + logger_ = rhs.logger_; +} + +inline socket_t ClientImpl::create_client_socket(Error &error) const { + if (!proxy_host_.empty() && proxy_port_ != -1) { + return detail::create_client_socket( + proxy_host_.c_str(), "", proxy_port_, address_family_, tcp_nodelay_, + socket_options_, connection_timeout_sec_, connection_timeout_usec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, interface_, error); + } + + // Check is custom IP specified for host_ + std::string ip; + auto it = addr_map_.find(host_); + if (it != addr_map_.end()) ip = it->second; + + return detail::create_client_socket( + host_.c_str(), ip.c_str(), port_, address_family_, tcp_nodelay_, + socket_options_, connection_timeout_sec_, connection_timeout_usec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, interface_, error); +} + +inline bool ClientImpl::create_and_connect_socket(Socket &socket, + Error &error) { + auto sock = create_client_socket(error); + if (sock == INVALID_SOCKET) { return false; } + socket.sock = sock; + return true; +} + +inline void ClientImpl::shutdown_ssl(Socket & /*socket*/, + bool /*shutdown_gracefully*/) { + // If there are any requests in flight from threads other than us, then it's + // a thread-unsafe race because individual ssl* objects are not thread-safe. + assert(socket_requests_in_flight_ == 0 || + socket_requests_are_from_thread_ == std::this_thread::get_id()); +} + +inline void ClientImpl::shutdown_socket(Socket &socket) { + if (socket.sock == INVALID_SOCKET) { return; } + detail::shutdown_socket(socket.sock); +} + +inline void ClientImpl::close_socket(Socket &socket) { + // If there are requests in flight in another thread, usually closing + // the socket will be fine and they will simply receive an error when + // using the closed socket, but it is still a bug since rarely the OS + // may reassign the socket id to be used for a new socket, and then + // suddenly they will be operating on a live socket that is different + // than the one they intended! + assert(socket_requests_in_flight_ == 0 || + socket_requests_are_from_thread_ == std::this_thread::get_id()); + + // It is also a bug if this happens while SSL is still active +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + assert(socket.ssl == nullptr); +#endif + if (socket.sock == INVALID_SOCKET) { return; } + detail::close_socket(socket.sock); + socket.sock = INVALID_SOCKET; +} + +inline bool ClientImpl::read_response_line(Stream &strm, const Request &req, + Response &res) { + std::array buf{}; + + detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); + + if (!line_reader.getline()) { return false; } + +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + const static std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r\n"); +#else + const static std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r?\n"); +#endif + + std::cmatch m; + if (!std::regex_match(line_reader.ptr(), m, re)) { + return req.method == "CONNECT"; + } + res.version = std::string(m[1]); + res.status = std::stoi(std::string(m[2])); + res.reason = std::string(m[3]); + + // Ignore '100 Continue' + while (res.status == 100) { + if (!line_reader.getline()) { return false; } // CRLF + if (!line_reader.getline()) { return false; } // next response line + + if (!std::regex_match(line_reader.ptr(), m, re)) { return false; } + res.version = std::string(m[1]); + res.status = std::stoi(std::string(m[2])); + res.reason = std::string(m[3]); + } + + return true; +} + +inline bool ClientImpl::send(Request &req, Response &res, Error &error) { + std::lock_guard request_mutex_guard(request_mutex_); + + { + std::lock_guard guard(socket_mutex_); + + // Set this to false immediately - if it ever gets set to true by the end of + // the request, we know another thread instructed us to close the socket. + socket_should_be_closed_when_request_is_done_ = false; + + auto is_alive = false; + if (socket_.is_open()) { + is_alive = detail::is_socket_alive(socket_.sock); + if (!is_alive) { + // Attempt to avoid sigpipe by shutting down nongracefully if it seems + // like the other side has already closed the connection Also, there + // cannot be any requests in flight from other threads since we locked + // request_mutex_, so safe to close everything immediately + const bool shutdown_gracefully = false; + shutdown_ssl(socket_, shutdown_gracefully); + shutdown_socket(socket_); + close_socket(socket_); + } + } + + if (!is_alive) { + if (!create_and_connect_socket(socket_, error)) { return false; } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // TODO: refactoring + if (is_ssl()) { + auto &scli = static_cast(*this); + if (!proxy_host_.empty() && proxy_port_ != -1) { + bool success = false; + if (!scli.connect_with_proxy(socket_, res, success, error)) { + return success; + } + } + + if (!scli.initialize_ssl(socket_, error)) { return false; } + } +#endif + } + + // Mark the current socket as being in use so that it cannot be closed by + // anyone else while this request is ongoing, even though we will be + // releasing the mutex. + if (socket_requests_in_flight_ > 1) { + assert(socket_requests_are_from_thread_ == std::this_thread::get_id()); + } + socket_requests_in_flight_ += 1; + socket_requests_are_from_thread_ = std::this_thread::get_id(); + } + + for (const auto &header : default_headers_) { + if (req.headers.find(header.first) == req.headers.end()) { + req.headers.insert(header); + } + } + + auto close_connection = !keep_alive_; + auto ret = process_socket(socket_, [&](Stream &strm) { + return handle_request(strm, req, res, close_connection, error); + }); + + // Briefly lock mutex in order to mark that a request is no longer ongoing + { + std::lock_guard guard(socket_mutex_); + socket_requests_in_flight_ -= 1; + if (socket_requests_in_flight_ <= 0) { + assert(socket_requests_in_flight_ == 0); + socket_requests_are_from_thread_ = std::thread::id(); + } + + if (socket_should_be_closed_when_request_is_done_ || close_connection || + !ret) { + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); + } + } + + if (!ret) { + if (error == Error::Success) { error = Error::Unknown; } + } + + return ret; +} + +inline Result ClientImpl::send(const Request &req) { + auto req2 = req; + return send_(std::move(req2)); +} + +inline Result ClientImpl::send_(Request &&req) { + auto res = detail::make_unique(); + auto error = Error::Success; + auto ret = send(req, *res, error); + return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers)}; +} + +inline bool ClientImpl::handle_request(Stream &strm, Request &req, + Response &res, bool close_connection, + Error &error) { + if (req.path.empty()) { + error = Error::Connection; + return false; + } + + auto req_save = req; + + bool ret; + + if (!is_ssl() && !proxy_host_.empty() && proxy_port_ != -1) { + auto req2 = req; + req2.path = "http://" + host_and_port_ + req.path; + ret = process_request(strm, req2, res, close_connection, error); + req = req2; + req.path = req_save.path; + } else { + ret = process_request(strm, req, res, close_connection, error); + } + + if (!ret) { return false; } + + if (300 < res.status && res.status < 400 && follow_location_) { + req = req_save; + ret = redirect(req, res, error); + } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if ((res.status == 401 || res.status == 407) && + req.authorization_count_ < 5) { + auto is_proxy = res.status == 407; + const auto &username = + is_proxy ? proxy_digest_auth_username_ : digest_auth_username_; + const auto &password = + is_proxy ? proxy_digest_auth_password_ : digest_auth_password_; + + if (!username.empty() && !password.empty()) { + std::map auth; + if (detail::parse_www_authenticate(res, auth, is_proxy)) { + Request new_req = req; + new_req.authorization_count_ += 1; + new_req.headers.erase(is_proxy ? "Proxy-Authorization" + : "Authorization"); + new_req.headers.insert(detail::make_digest_authentication_header( + req, auth, new_req.authorization_count_, detail::random_string(10), + username, password, is_proxy)); + + Response new_res; + + ret = send(new_req, new_res, error); + if (ret) { res = new_res; } + } + } + } +#endif + + return ret; +} + +inline bool ClientImpl::redirect(Request &req, Response &res, Error &error) { + if (req.redirect_count_ == 0) { + error = Error::ExceedRedirectCount; + return false; + } + + auto location = detail::decode_url(res.get_header_value("location"), true); + if (location.empty()) { return false; } + + const static std::regex re( + R"((?:(https?):)?(?://(?:\[([\d:]+)\]|([^:/?#]+))(?::(\d+))?)?([^?#]*(?:\?[^#]*)?)(?:#.*)?)"); + + std::smatch m; + if (!std::regex_match(location, m, re)) { return false; } + + auto scheme = is_ssl() ? "https" : "http"; + + auto next_scheme = m[1].str(); + auto next_host = m[2].str(); + if (next_host.empty()) { next_host = m[3].str(); } + auto port_str = m[4].str(); + auto next_path = m[5].str(); + + auto next_port = port_; + if (!port_str.empty()) { + next_port = std::stoi(port_str); + } else if (!next_scheme.empty()) { + next_port = next_scheme == "https" ? 443 : 80; + } + + if (next_scheme.empty()) { next_scheme = scheme; } + if (next_host.empty()) { next_host = host_; } + if (next_path.empty()) { next_path = "/"; } + + if (next_scheme == scheme && next_host == host_ && next_port == port_) { + return detail::redirect(*this, req, res, next_path, location, error); + } else { + if (next_scheme == "https") { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + SSLClient cli(next_host.c_str(), next_port); + cli.copy_settings(*this); + if (ca_cert_store_) { cli.set_ca_cert_store(ca_cert_store_); } + return detail::redirect(cli, req, res, next_path, location, error); +#else + return false; +#endif + } else { + ClientImpl cli(next_host.c_str(), next_port); + cli.copy_settings(*this); + return detail::redirect(cli, req, res, next_path, location, error); + } + } +} + +inline bool ClientImpl::write_content_with_provider(Stream &strm, + const Request &req, + Error &error) { + auto is_shutting_down = []() { return false; }; + + if (req.is_chunked_content_provider_) { + // TODO: Brotli suport + std::unique_ptr compressor; +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_) { + compressor = detail::make_unique(); + } else +#endif + { + compressor = detail::make_unique(); + } + + return detail::write_content_chunked(strm, req.content_provider_, + is_shutting_down, *compressor, error); + } else { + return detail::write_content(strm, req.content_provider_, 0, + req.content_length_, is_shutting_down, error); + } +} // namespace httplib + +inline bool ClientImpl::write_request(Stream &strm, Request &req, + bool close_connection, Error &error) { + // Prepare additional headers + if (close_connection) { + if (!req.has_header("Connection")) { + req.headers.emplace("Connection", "close"); + } + } + + if (!req.has_header("Host")) { + if (is_ssl()) { + if (port_ == 443) { + req.headers.emplace("Host", host_); + } else { + req.headers.emplace("Host", host_and_port_); + } + } else { + if (port_ == 80) { + req.headers.emplace("Host", host_); + } else { + req.headers.emplace("Host", host_and_port_); + } + } + } + + if (!req.has_header("Accept")) { req.headers.emplace("Accept", "*/*"); } + +#ifndef CPPHTTPLIB_NO_DEFAULT_USER_AGENT + if (!req.has_header("User-Agent")) { + req.headers.emplace("User-Agent", "cpp-httplib/0.10.3"); + } +#endif + + if (req.body.empty()) { + if (req.content_provider_) { + if (!req.is_chunked_content_provider_) { + if (!req.has_header("Content-Length")) { + auto length = std::to_string(req.content_length_); + req.headers.emplace("Content-Length", length); + } + } + } else { + if (req.method == "POST" || req.method == "PUT" || + req.method == "PATCH") { + req.headers.emplace("Content-Length", "0"); + } + } + } else { + if (!req.has_header("Content-Type")) { + req.headers.emplace("Content-Type", "text/plain"); + } + + if (!req.has_header("Content-Length")) { + auto length = std::to_string(req.body.size()); + req.headers.emplace("Content-Length", length); + } + } + + if (!basic_auth_password_.empty() || !basic_auth_username_.empty()) { + if (!req.has_header("Authorization")) { + req.headers.insert(make_basic_authentication_header( + basic_auth_username_, basic_auth_password_, false)); + } + } + + if (!proxy_basic_auth_username_.empty() && + !proxy_basic_auth_password_.empty()) { + if (!req.has_header("Proxy-Authorization")) { + req.headers.insert(make_basic_authentication_header( + proxy_basic_auth_username_, proxy_basic_auth_password_, true)); + } + } + + if (!bearer_token_auth_token_.empty()) { + if (!req.has_header("Authorization")) { + req.headers.insert(make_bearer_token_authentication_header( + bearer_token_auth_token_, false)); + } + } + + if (!proxy_bearer_token_auth_token_.empty()) { + if (!req.has_header("Proxy-Authorization")) { + req.headers.insert(make_bearer_token_authentication_header( + proxy_bearer_token_auth_token_, true)); + } + } + + // Request line and headers + { + detail::BufferStream bstrm; + + const auto &path = url_encode_ ? detail::encode_url(req.path) : req.path; + bstrm.write_format("%s %s HTTP/1.1\r\n", req.method.c_str(), path.c_str()); + + detail::write_headers(bstrm, req.headers); + + // Flush buffer + auto &data = bstrm.get_buffer(); + if (!detail::write_data(strm, data.data(), data.size())) { + error = Error::Write; + return false; + } + } + + // Body + if (req.body.empty()) { + return write_content_with_provider(strm, req, error); + } + + if (!detail::write_data(strm, req.body.data(), req.body.size())) { + error = Error::Write; + return false; + } + + return true; +} + +inline std::unique_ptr ClientImpl::send_with_content_provider( + Request &req, + // const char *method, const char *path, const Headers &headers, + const char *body, size_t content_length, ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const char *content_type, Error &error) { + + if (content_type) { req.headers.emplace("Content-Type", content_type); } + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_) { req.headers.emplace("Content-Encoding", "gzip"); } +#endif + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_ && !content_provider_without_length) { + // TODO: Brotli support + detail::gzip_compressor compressor; + + if (content_provider) { + auto ok = true; + size_t offset = 0; + DataSink data_sink; + + data_sink.write = [&](const char *data, size_t data_len) -> bool { + if (ok) { + auto last = offset + data_len == content_length; + + auto ret = compressor.compress( + data, data_len, last, [&](const char *data, size_t data_len) { + req.body.append(data, data_len); + return true; + }); + + if (ret) { + offset += data_len; + } else { + ok = false; + } + } + return ok; + }; + + data_sink.is_writable = [&](void) { return ok && true; }; + + while (ok && offset < content_length) { + if (!content_provider(offset, content_length - offset, data_sink)) { + error = Error::Canceled; + return nullptr; + } + } + } else { + if (!compressor.compress(body, content_length, true, + [&](const char *data, size_t data_len) { + req.body.append(data, data_len); + return true; + })) { + error = Error::Compression; + return nullptr; + } + } + } else +#endif + { + if (content_provider) { + req.content_length_ = content_length; + req.content_provider_ = std::move(content_provider); + req.is_chunked_content_provider_ = false; + } else if (content_provider_without_length) { + req.content_length_ = 0; + req.content_provider_ = detail::ContentProviderAdapter( + std::move(content_provider_without_length)); + req.is_chunked_content_provider_ = true; + req.headers.emplace("Transfer-Encoding", "chunked"); + } else { + req.body.assign(body, content_length); + ; + } + } + + auto res = detail::make_unique(); + return send(req, *res, error) ? std::move(res) : nullptr; +} + +inline Result ClientImpl::send_with_content_provider( + const char *method, const char *path, const Headers &headers, + const char *body, size_t content_length, ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const char *content_type) { + Request req; + req.method = method; + req.headers = headers; + req.path = path; + + auto error = Error::Success; + + auto res = send_with_content_provider( + req, + // method, path, headers, + body, content_length, std::move(content_provider), + std::move(content_provider_without_length), content_type, error); + + return Result{std::move(res), error, std::move(req.headers)}; +} + +inline std::string +ClientImpl::adjust_host_string(const std::string &host) const { + if (host.find(':') != std::string::npos) { return "[" + host + "]"; } + return host; +} + +inline bool ClientImpl::process_request(Stream &strm, Request &req, + Response &res, bool close_connection, + Error &error) { + // Send request + if (!write_request(strm, req, close_connection, error)) { return false; } + + // Receive response and headers + if (!read_response_line(strm, req, res) || + !detail::read_headers(strm, res.headers)) { + error = Error::Read; + return false; + } + + // Body + if ((res.status != 204) && req.method != "HEAD" && req.method != "CONNECT") { + auto redirect = 300 < res.status && res.status < 400 && follow_location_; + + if (req.response_handler && !redirect) { + if (!req.response_handler(res)) { + error = Error::Canceled; + return false; + } + } + + auto out = + req.content_receiver + ? static_cast( + [&](const char *buf, size_t n, uint64_t off, uint64_t len) { + if (redirect) { return true; } + auto ret = req.content_receiver(buf, n, off, len); + if (!ret) { error = Error::Canceled; } + return ret; + }) + : static_cast( + [&](const char *buf, size_t n, uint64_t /*off*/, + uint64_t /*len*/) { + if (res.body.size() + n > res.body.max_size()) { + return false; + } + res.body.append(buf, n); + return true; + }); + + auto progress = [&](uint64_t current, uint64_t total) { + if (!req.progress || redirect) { return true; } + auto ret = req.progress(current, total); + if (!ret) { error = Error::Canceled; } + return ret; + }; + + int dummy_status; + if (!detail::read_content(strm, res, (std::numeric_limits::max)(), + dummy_status, std::move(progress), std::move(out), + decompress_)) { + if (error != Error::Canceled) { error = Error::Read; } + return false; + } + } + + if (res.get_header_value("Connection") == "close" || + (res.version == "HTTP/1.0" && res.reason != "Connection established")) { + // TODO this requires a not-entirely-obvious chain of calls to be correct + // for this to be safe. Maybe a code refactor (such as moving this out to + // the send function and getting rid of the recursiveness of the mutex) + // could make this more obvious. + + // This is safe to call because process_request is only called by + // handle_request which is only called by send, which locks the request + // mutex during the process. It would be a bug to call it from a different + // thread since it's a thread-safety issue to do these things to the socket + // if another thread is using the socket. + std::lock_guard guard(socket_mutex_); + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); + } + + // Log + if (logger_) { logger_(req, res); } + + return true; +} + +inline bool +ClientImpl::process_socket(const Socket &socket, + std::function callback) { + return detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, std::move(callback)); +} + +inline bool ClientImpl::is_ssl() const { return false; } + +inline Result ClientImpl::Get(const char *path) { + return Get(path, Headers(), Progress()); +} + +inline Result ClientImpl::Get(const char *path, Progress progress) { + return Get(path, Headers(), std::move(progress)); +} + +inline Result ClientImpl::Get(const char *path, const Headers &headers) { + return Get(path, headers, Progress()); +} + +inline Result ClientImpl::Get(const char *path, const Headers &headers, + Progress progress) { + Request req; + req.method = "GET"; + req.path = path; + req.headers = headers; + req.progress = std::move(progress); + + return send_(std::move(req)); +} + +inline Result ClientImpl::Get(const char *path, + ContentReceiver content_receiver) { + return Get(path, Headers(), nullptr, std::move(content_receiver), nullptr); +} + +inline Result ClientImpl::Get(const char *path, + ContentReceiver content_receiver, + Progress progress) { + return Get(path, Headers(), nullptr, std::move(content_receiver), + std::move(progress)); +} + +inline Result ClientImpl::Get(const char *path, const Headers &headers, + ContentReceiver content_receiver) { + return Get(path, headers, nullptr, std::move(content_receiver), nullptr); +} + +inline Result ClientImpl::Get(const char *path, const Headers &headers, + ContentReceiver content_receiver, + Progress progress) { + return Get(path, headers, nullptr, std::move(content_receiver), + std::move(progress)); +} + +inline Result ClientImpl::Get(const char *path, + ResponseHandler response_handler, + ContentReceiver content_receiver) { + return Get(path, Headers(), std::move(response_handler), + std::move(content_receiver), nullptr); +} + +inline Result ClientImpl::Get(const char *path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver) { + return Get(path, headers, std::move(response_handler), + std::move(content_receiver), nullptr); +} + +inline Result ClientImpl::Get(const char *path, + ResponseHandler response_handler, + ContentReceiver content_receiver, + Progress progress) { + return Get(path, Headers(), std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Get(const char *path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + Progress progress) { + Request req; + req.method = "GET"; + req.path = path; + req.headers = headers; + req.response_handler = std::move(response_handler); + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + uint64_t /*offset*/, uint64_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.progress = std::move(progress); + + return send_(std::move(req)); +} + +inline Result ClientImpl::Get(const char *path, const Params ¶ms, + const Headers &headers, Progress progress) { + if (params.empty()) { return Get(path, headers); } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query.c_str(), headers, progress); +} + +inline Result ClientImpl::Get(const char *path, const Params ¶ms, + const Headers &headers, + ContentReceiver content_receiver, + Progress progress) { + return Get(path, params, headers, nullptr, content_receiver, progress); +} + +inline Result ClientImpl::Get(const char *path, const Params ¶ms, + const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + Progress progress) { + if (params.empty()) { + return Get(path, headers, response_handler, content_receiver, progress); + } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query.c_str(), headers, response_handler, + content_receiver, progress); +} + +inline Result ClientImpl::Head(const char *path) { + return Head(path, Headers()); +} + +inline Result ClientImpl::Head(const char *path, const Headers &headers) { + Request req; + req.method = "HEAD"; + req.headers = headers; + req.path = path; + + return send_(std::move(req)); +} + +inline Result ClientImpl::Post(const char *path) { + return Post(path, std::string(), nullptr); +} + +inline Result ClientImpl::Post(const char *path, const char *body, + size_t content_length, + const char *content_type) { + return Post(path, Headers(), body, content_length, content_type); +} + +inline Result ClientImpl::Post(const char *path, const Headers &headers, + const char *body, size_t content_length, + const char *content_type) { + return send_with_content_provider("POST", path, headers, body, content_length, + nullptr, nullptr, content_type); +} + +inline Result ClientImpl::Post(const char *path, const std::string &body, + const char *content_type) { + return Post(path, Headers(), body, content_type); +} + +inline Result ClientImpl::Post(const char *path, const Headers &headers, + const std::string &body, + const char *content_type) { + return send_with_content_provider("POST", path, headers, body.data(), + body.size(), nullptr, nullptr, + content_type); +} + +inline Result ClientImpl::Post(const char *path, const Params ¶ms) { + return Post(path, Headers(), params); +} + +inline Result ClientImpl::Post(const char *path, size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return Post(path, Headers(), content_length, std::move(content_provider), + content_type); +} + +inline Result ClientImpl::Post(const char *path, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return Post(path, Headers(), std::move(content_provider), content_type); +} + +inline Result ClientImpl::Post(const char *path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return send_with_content_provider("POST", path, headers, nullptr, + content_length, std::move(content_provider), + nullptr, content_type); +} + +inline Result ClientImpl::Post(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return send_with_content_provider("POST", path, headers, nullptr, 0, nullptr, + std::move(content_provider), content_type); +} + +inline Result ClientImpl::Post(const char *path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Post(path, headers, query, "application/x-www-form-urlencoded"); +} + +inline Result ClientImpl::Post(const char *path, + const MultipartFormDataItems &items) { + return Post(path, Headers(), items); +} + +inline Result ClientImpl::Post(const char *path, const Headers &headers, + const MultipartFormDataItems &items) { + return Post(path, headers, items, detail::make_multipart_data_boundary()); +} +inline Result ClientImpl::Post(const char *path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + for (size_t i = 0; i < boundary.size(); i++) { + char c = boundary[i]; + if (!std::isalnum(c) && c != '-' && c != '_') { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + } + + std::string body; + + for (const auto &item : items) { + body += "--" + boundary + "\r\n"; + body += "Content-Disposition: form-data; name=\"" + item.name + "\""; + if (!item.filename.empty()) { + body += "; filename=\"" + item.filename + "\""; + } + body += "\r\n"; + if (!item.content_type.empty()) { + body += "Content-Type: " + item.content_type + "\r\n"; + } + body += "\r\n"; + body += item.content + "\r\n"; + } + + body += "--" + boundary + "--\r\n"; + + std::string content_type = "multipart/form-data; boundary=" + boundary; + return Post(path, headers, body, content_type.c_str()); +} + +inline Result ClientImpl::Put(const char *path) { + return Put(path, std::string(), nullptr); +} + +inline Result ClientImpl::Put(const char *path, const char *body, + size_t content_length, const char *content_type) { + return Put(path, Headers(), body, content_length, content_type); +} + +inline Result ClientImpl::Put(const char *path, const Headers &headers, + const char *body, size_t content_length, + const char *content_type) { + return send_with_content_provider("PUT", path, headers, body, content_length, + nullptr, nullptr, content_type); +} + +inline Result ClientImpl::Put(const char *path, const std::string &body, + const char *content_type) { + return Put(path, Headers(), body, content_type); +} + +inline Result ClientImpl::Put(const char *path, const Headers &headers, + const std::string &body, + const char *content_type) { + return send_with_content_provider("PUT", path, headers, body.data(), + body.size(), nullptr, nullptr, + content_type); +} + +inline Result ClientImpl::Put(const char *path, size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return Put(path, Headers(), content_length, std::move(content_provider), + content_type); +} + +inline Result ClientImpl::Put(const char *path, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return Put(path, Headers(), std::move(content_provider), content_type); +} + +inline Result ClientImpl::Put(const char *path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return send_with_content_provider("PUT", path, headers, nullptr, + content_length, std::move(content_provider), + nullptr, content_type); +} + +inline Result ClientImpl::Put(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return send_with_content_provider("PUT", path, headers, nullptr, 0, nullptr, + std::move(content_provider), content_type); +} + +inline Result ClientImpl::Put(const char *path, const Params ¶ms) { + return Put(path, Headers(), params); +} + +inline Result ClientImpl::Put(const char *path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Put(path, headers, query, "application/x-www-form-urlencoded"); +} + +inline Result ClientImpl::Patch(const char *path) { + return Patch(path, std::string(), nullptr); +} + +inline Result ClientImpl::Patch(const char *path, const char *body, + size_t content_length, + const char *content_type) { + return Patch(path, Headers(), body, content_length, content_type); +} + +inline Result ClientImpl::Patch(const char *path, const Headers &headers, + const char *body, size_t content_length, + const char *content_type) { + return send_with_content_provider("PATCH", path, headers, body, + content_length, nullptr, nullptr, + content_type); +} + +inline Result ClientImpl::Patch(const char *path, const std::string &body, + const char *content_type) { + return Patch(path, Headers(), body, content_type); +} + +inline Result ClientImpl::Patch(const char *path, const Headers &headers, + const std::string &body, + const char *content_type) { + return send_with_content_provider("PATCH", path, headers, body.data(), + body.size(), nullptr, nullptr, + content_type); +} + +inline Result ClientImpl::Patch(const char *path, size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return Patch(path, Headers(), content_length, std::move(content_provider), + content_type); +} + +inline Result ClientImpl::Patch(const char *path, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return Patch(path, Headers(), std::move(content_provider), content_type); +} + +inline Result ClientImpl::Patch(const char *path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return send_with_content_provider("PATCH", path, headers, nullptr, + content_length, std::move(content_provider), + nullptr, content_type); +} + +inline Result ClientImpl::Patch(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return send_with_content_provider("PATCH", path, headers, nullptr, 0, nullptr, + std::move(content_provider), content_type); +} + +inline Result ClientImpl::Delete(const char *path) { + return Delete(path, Headers(), std::string(), nullptr); +} + +inline Result ClientImpl::Delete(const char *path, const Headers &headers) { + return Delete(path, headers, std::string(), nullptr); +} + +inline Result ClientImpl::Delete(const char *path, const char *body, + size_t content_length, + const char *content_type) { + return Delete(path, Headers(), body, content_length, content_type); +} + +inline Result ClientImpl::Delete(const char *path, const Headers &headers, + const char *body, size_t content_length, + const char *content_type) { + Request req; + req.method = "DELETE"; + req.headers = headers; + req.path = path; + + if (content_type) { req.headers.emplace("Content-Type", content_type); } + req.body.assign(body, content_length); + + return send_(std::move(req)); +} + +inline Result ClientImpl::Delete(const char *path, const std::string &body, + const char *content_type) { + return Delete(path, Headers(), body.data(), body.size(), content_type); +} + +inline Result ClientImpl::Delete(const char *path, const Headers &headers, + const std::string &body, + const char *content_type) { + return Delete(path, headers, body.data(), body.size(), content_type); +} + +inline Result ClientImpl::Options(const char *path) { + return Options(path, Headers()); +} + +inline Result ClientImpl::Options(const char *path, const Headers &headers) { + Request req; + req.method = "OPTIONS"; + req.headers = headers; + req.path = path; + + return send_(std::move(req)); +} + +inline size_t ClientImpl::is_socket_open() const { + std::lock_guard guard(socket_mutex_); + return socket_.is_open(); +} + +inline void ClientImpl::stop() { + std::lock_guard guard(socket_mutex_); + + // If there is anything ongoing right now, the ONLY thread-safe thing we can + // do is to shutdown_socket, so that threads using this socket suddenly + // discover they can't read/write any more and error out. Everything else + // (closing the socket, shutting ssl down) is unsafe because these actions are + // not thread-safe. + if (socket_requests_in_flight_ > 0) { + shutdown_socket(socket_); + + // Aside from that, we set a flag for the socket to be closed when we're + // done. + socket_should_be_closed_when_request_is_done_ = true; + return; + } + + // Otherwise, sitll holding the mutex, we can shut everything down ourselves + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); +} + +inline void ClientImpl::set_connection_timeout(time_t sec, time_t usec) { + connection_timeout_sec_ = sec; + connection_timeout_usec_ = usec; +} + +inline void ClientImpl::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; +} + +inline void ClientImpl::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; +} + +inline void ClientImpl::set_basic_auth(const char *username, + const char *password) { + basic_auth_username_ = username; + basic_auth_password_ = password; +} + +inline void ClientImpl::set_bearer_token_auth(const char *token) { + bearer_token_auth_token_ = token; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void ClientImpl::set_digest_auth(const char *username, + const char *password) { + digest_auth_username_ = username; + digest_auth_password_ = password; +} +#endif + +inline void ClientImpl::set_keep_alive(bool on) { keep_alive_ = on; } + +inline void ClientImpl::set_follow_location(bool on) { follow_location_ = on; } + +inline void ClientImpl::set_url_encode(bool on) { url_encode_ = on; } + +inline void ClientImpl::set_hostname_addr_map( + const std::map addr_map) { + addr_map_ = std::move(addr_map); +} + +inline void ClientImpl::set_default_headers(Headers headers) { + default_headers_ = std::move(headers); +} + +inline void ClientImpl::set_address_family(int family) { + address_family_ = family; +} + +inline void ClientImpl::set_tcp_nodelay(bool on) { tcp_nodelay_ = on; } + +inline void ClientImpl::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); +} + +inline void ClientImpl::set_compress(bool on) { compress_ = on; } + +inline void ClientImpl::set_decompress(bool on) { decompress_ = on; } + +inline void ClientImpl::set_interface(const char *intf) { interface_ = intf; } + +inline void ClientImpl::set_proxy(const char *host, int port) { + proxy_host_ = host; + proxy_port_ = port; +} + +inline void ClientImpl::set_proxy_basic_auth(const char *username, + const char *password) { + proxy_basic_auth_username_ = username; + proxy_basic_auth_password_ = password; +} + +inline void ClientImpl::set_proxy_bearer_token_auth(const char *token) { + proxy_bearer_token_auth_token_ = token; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void ClientImpl::set_proxy_digest_auth(const char *username, + const char *password) { + proxy_digest_auth_username_ = username; + proxy_digest_auth_password_ = password; +} +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void ClientImpl::set_ca_cert_path(const char *ca_cert_file_path, + const char *ca_cert_dir_path) { + if (ca_cert_file_path) { ca_cert_file_path_ = ca_cert_file_path; } + if (ca_cert_dir_path) { ca_cert_dir_path_ = ca_cert_dir_path; } +} + +inline void ClientImpl::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (ca_cert_store && ca_cert_store != ca_cert_store_) { + ca_cert_store_ = ca_cert_store; + } +} +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void ClientImpl::enable_server_certificate_verification(bool enabled) { + server_certificate_verification_ = enabled; +} +#endif + +inline void ClientImpl::set_logger(Logger logger) { + logger_ = std::move(logger); +} + +/* + * SSL Implementation + */ +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +namespace detail { + +template +inline SSL *ssl_new(socket_t sock, SSL_CTX *ctx, std::mutex &ctx_mutex, + U SSL_connect_or_accept, V setup) { + SSL *ssl = nullptr; + { + std::lock_guard guard(ctx_mutex); + ssl = SSL_new(ctx); + } + + if (ssl) { + set_nonblocking(sock, true); + auto bio = BIO_new_socket(static_cast(sock), BIO_NOCLOSE); + BIO_set_nbio(bio, 1); + SSL_set_bio(ssl, bio, bio); + + if (!setup(ssl) || SSL_connect_or_accept(ssl) != 1) { + SSL_shutdown(ssl); + { + std::lock_guard guard(ctx_mutex); + SSL_free(ssl); + } + set_nonblocking(sock, false); + return nullptr; + } + BIO_set_nbio(bio, 0); + set_nonblocking(sock, false); + } + + return ssl; +} + +inline void ssl_delete(std::mutex &ctx_mutex, SSL *ssl, + bool shutdown_gracefully) { + // sometimes we may want to skip this to try to avoid SIGPIPE if we know + // the remote has closed the network connection + // Note that it is not always possible to avoid SIGPIPE, this is merely a + // best-efforts. + if (shutdown_gracefully) { SSL_shutdown(ssl); } + + std::lock_guard guard(ctx_mutex); + SSL_free(ssl); +} + +template +bool ssl_connect_or_accept_nonblocking(socket_t sock, SSL *ssl, + U ssl_connect_or_accept, + time_t timeout_sec, + time_t timeout_usec) { + int res = 0; + while ((res = ssl_connect_or_accept(ssl)) != 1) { + auto err = SSL_get_error(ssl, res); + switch (err) { + case SSL_ERROR_WANT_READ: + if (select_read(sock, timeout_sec, timeout_usec) > 0) { continue; } + break; + case SSL_ERROR_WANT_WRITE: + if (select_write(sock, timeout_sec, timeout_usec) > 0) { continue; } + break; + default: break; + } + return false; + } + return true; +} + +template +inline bool process_server_socket_ssl( + const std::atomic &svr_sock, SSL *ssl, socket_t sock, + size_t keep_alive_max_count, time_t keep_alive_timeout_sec, + time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + return process_server_socket_core( + svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, + [&](bool close_connection, bool &connection_closed) { + SSLSocketStream strm(sock, ssl, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm, close_connection, connection_closed); + }); +} + +template +inline bool +process_client_socket_ssl(SSL *ssl, socket_t sock, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + SSLSocketStream strm(sock, ssl, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm); +} + +#if OPENSSL_VERSION_NUMBER < 0x10100000L +static std::shared_ptr> openSSL_locks_; + +class SSLThreadLocks { +public: + SSLThreadLocks() { + openSSL_locks_ = + std::make_shared>(CRYPTO_num_locks()); + CRYPTO_set_locking_callback(locking_callback); + } + + ~SSLThreadLocks() { CRYPTO_set_locking_callback(nullptr); } + +private: + static void locking_callback(int mode, int type, const char * /*file*/, + int /*line*/) { + auto &lk = (*openSSL_locks_)[static_cast(type)]; + if (mode & CRYPTO_LOCK) { + lk.lock(); + } else { + lk.unlock(); + } + } +}; + +#endif + +class SSLInit { +public: + SSLInit() { +#if OPENSSL_VERSION_NUMBER < 0x1010001fL + SSL_load_error_strings(); + SSL_library_init(); +#else + OPENSSL_init_ssl( + OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); +#endif + } + + ~SSLInit() { +#if OPENSSL_VERSION_NUMBER < 0x1010001fL + ERR_free_strings(); +#endif + } + +private: +#if OPENSSL_VERSION_NUMBER < 0x10100000L + SSLThreadLocks thread_init_; +#endif +}; + +// SSL socket stream implementation +inline SSLSocketStream::SSLSocketStream(socket_t sock, SSL *ssl, + time_t read_timeout_sec, + time_t read_timeout_usec, + time_t write_timeout_sec, + time_t write_timeout_usec) + : sock_(sock), ssl_(ssl), read_timeout_sec_(read_timeout_sec), + read_timeout_usec_(read_timeout_usec), + write_timeout_sec_(write_timeout_sec), + write_timeout_usec_(write_timeout_usec) { + SSL_clear_mode(ssl, SSL_MODE_AUTO_RETRY); +} + +inline SSLSocketStream::~SSLSocketStream() {} + +inline bool SSLSocketStream::is_readable() const { + return detail::select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; +} + +inline bool SSLSocketStream::is_writable() const { + return detail::select_write(sock_, write_timeout_sec_, write_timeout_usec_) > + 0; +} + +inline ssize_t SSLSocketStream::read(char *ptr, size_t size) { + if (SSL_pending(ssl_) > 0) { + return SSL_read(ssl_, ptr, static_cast(size)); + } else if (is_readable()) { + auto ret = SSL_read(ssl_, ptr, static_cast(size)); + if (ret < 0) { + auto err = SSL_get_error(ssl_, ret); + int n = 1000; +#ifdef _WIN32 + while (--n >= 0 && (err == SSL_ERROR_WANT_READ || + (err == SSL_ERROR_SYSCALL && + WSAGetLastError() == WSAETIMEDOUT))) { +#else + while (--n >= 0 && err == SSL_ERROR_WANT_READ) { +#endif + if (SSL_pending(ssl_) > 0) { + return SSL_read(ssl_, ptr, static_cast(size)); + } else if (is_readable()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + ret = SSL_read(ssl_, ptr, static_cast(size)); + if (ret >= 0) { return ret; } + err = SSL_get_error(ssl_, ret); + } else { + return -1; + } + } + } + return ret; + } + return -1; +} + +inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) { + if (is_writable()) { + auto ret = SSL_write(ssl_, ptr, static_cast(size)); + if (ret < 0) { + auto err = SSL_get_error(ssl_, ret); + int n = 1000; +#ifdef _WIN32 + while (--n >= 0 && (err == SSL_ERROR_WANT_WRITE || + (err == SSL_ERROR_SYSCALL && + WSAGetLastError() == WSAETIMEDOUT))) { +#else + while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) { +#endif + if (is_writable()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + ret = SSL_write(ssl_, ptr, static_cast(size)); + if (ret >= 0) { return ret; } + err = SSL_get_error(ssl_, ret); + } else { + return -1; + } + } + } + return ret; + } + return -1; +} + +inline void SSLSocketStream::get_remote_ip_and_port(std::string &ip, + int &port) const { + detail::get_remote_ip_and_port(sock_, ip, port); +} + +inline socket_t SSLSocketStream::socket() const { return sock_; } + +static SSLInit sslinit_; + +} // namespace detail + +// SSL HTTP server implementation +inline SSLServer::SSLServer(const char *cert_path, const char *private_key_path, + const char *client_ca_cert_file_path, + const char *client_ca_cert_dir_path) { + ctx_ = SSL_CTX_new(TLS_server_method()); + + if (ctx_) { + SSL_CTX_set_options(ctx_, + SSL_OP_NO_COMPRESSION | + SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); + + SSL_CTX_set_min_proto_version(ctx_, TLS1_1_VERSION); + + if (SSL_CTX_use_certificate_chain_file(ctx_, cert_path) != 1 || + SSL_CTX_use_PrivateKey_file(ctx_, private_key_path, SSL_FILETYPE_PEM) != + 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } else if (client_ca_cert_file_path || client_ca_cert_dir_path) { + SSL_CTX_load_verify_locations(ctx_, client_ca_cert_file_path, + client_ca_cert_dir_path); + + SSL_CTX_set_verify( + ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); + } + } +} + +inline SSLServer::SSLServer(X509 *cert, EVP_PKEY *private_key, + X509_STORE *client_ca_cert_store) { + ctx_ = SSL_CTX_new(TLS_server_method()); + + if (ctx_) { + SSL_CTX_set_options(ctx_, + SSL_OP_NO_COMPRESSION | + SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); + + SSL_CTX_set_min_proto_version(ctx_, TLS1_1_VERSION); + + if (SSL_CTX_use_certificate(ctx_, cert) != 1 || + SSL_CTX_use_PrivateKey(ctx_, private_key) != 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } else if (client_ca_cert_store) { + SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); + + SSL_CTX_set_verify( + ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); + } + } +} + +inline SSLServer::SSLServer( + const std::function &setup_ssl_ctx_callback) { + ctx_ = SSL_CTX_new(TLS_method()); + if (ctx_) { + if (!setup_ssl_ctx_callback(*ctx_)) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +inline SSLServer::~SSLServer() { + if (ctx_) { SSL_CTX_free(ctx_); } +} + +inline bool SSLServer::is_valid() const { return ctx_; } + +inline SSL_CTX *SSLServer::ssl_context() const { return ctx_; } + +inline bool SSLServer::process_and_close_socket(socket_t sock) { + auto ssl = detail::ssl_new( + sock, ctx_, ctx_mutex_, + [&](SSL *ssl) { + return detail::ssl_connect_or_accept_nonblocking( + sock, ssl, SSL_accept, read_timeout_sec_, read_timeout_usec_); + }, + [](SSL * /*ssl*/) { return true; }); + + bool ret = false; + if (ssl) { + ret = detail::process_server_socket_ssl( + svr_sock_, ssl, sock, keep_alive_max_count_, keep_alive_timeout_sec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, + [this, ssl](Stream &strm, bool close_connection, + bool &connection_closed) { + return process_request(strm, close_connection, connection_closed, + [&](Request &req) { req.ssl = ssl; }); + }); + + // Shutdown gracefully if the result seemed successful, non-gracefully if + // the connection appeared to be closed. + const bool shutdown_gracefully = ret; + detail::ssl_delete(ctx_mutex_, ssl, shutdown_gracefully); + } + + detail::shutdown_socket(sock); + detail::close_socket(sock); + return ret; +} + +// SSL HTTP client implementation +inline SSLClient::SSLClient(const std::string &host) + : SSLClient(host, 443, std::string(), std::string()) {} + +inline SSLClient::SSLClient(const std::string &host, int port) + : SSLClient(host, port, std::string(), std::string()) {} + +inline SSLClient::SSLClient(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : ClientImpl(host, port, client_cert_path, client_key_path) { + ctx_ = SSL_CTX_new(TLS_client_method()); + + detail::split(&host_[0], &host_[host_.size()], '.', + [&](const char *b, const char *e) { + host_components_.emplace_back(std::string(b, e)); + }); + + if (!client_cert_path.empty() && !client_key_path.empty()) { + if (SSL_CTX_use_certificate_file(ctx_, client_cert_path.c_str(), + SSL_FILETYPE_PEM) != 1 || + SSL_CTX_use_PrivateKey_file(ctx_, client_key_path.c_str(), + SSL_FILETYPE_PEM) != 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +inline SSLClient::SSLClient(const std::string &host, int port, + X509 *client_cert, EVP_PKEY *client_key) + : ClientImpl(host, port) { + ctx_ = SSL_CTX_new(TLS_client_method()); + + detail::split(&host_[0], &host_[host_.size()], '.', + [&](const char *b, const char *e) { + host_components_.emplace_back(std::string(b, e)); + }); + + if (client_cert != nullptr && client_key != nullptr) { + if (SSL_CTX_use_certificate(ctx_, client_cert) != 1 || + SSL_CTX_use_PrivateKey(ctx_, client_key) != 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +inline SSLClient::~SSLClient() { + if (ctx_) { SSL_CTX_free(ctx_); } + // Make sure to shut down SSL since shutdown_ssl will resolve to the + // base function rather than the derived function once we get to the + // base class destructor, and won't free the SSL (causing a leak). + shutdown_ssl_impl(socket_, true); +} + +inline bool SSLClient::is_valid() const { return ctx_; } + +inline void SSLClient::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (ca_cert_store) { + if (ctx_) { + if (SSL_CTX_get_cert_store(ctx_) != ca_cert_store) { + // Free memory allocated for old cert and use new store `ca_cert_store` + SSL_CTX_set_cert_store(ctx_, ca_cert_store); + } + } else { + X509_STORE_free(ca_cert_store); + } + } +} + +inline long SSLClient::get_openssl_verify_result() const { + return verify_result_; +} + +inline SSL_CTX *SSLClient::ssl_context() const { return ctx_; } + +inline bool SSLClient::create_and_connect_socket(Socket &socket, Error &error) { + return is_valid() && ClientImpl::create_and_connect_socket(socket, error); +} + +// Assumes that socket_mutex_ is locked and that there are no requests in flight +inline bool SSLClient::connect_with_proxy(Socket &socket, Response &res, + bool &success, Error &error) { + success = true; + Response res2; + if (!detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, [&](Stream &strm) { + Request req2; + req2.method = "CONNECT"; + req2.path = host_and_port_; + return process_request(strm, req2, res2, false, error); + })) { + // Thread-safe to close everything because we are assuming there are no + // requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + success = false; + return false; + } + + if (res2.status == 407) { + if (!proxy_digest_auth_username_.empty() && + !proxy_digest_auth_password_.empty()) { + std::map auth; + if (detail::parse_www_authenticate(res2, auth, true)) { + Response res3; + if (!detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, [&](Stream &strm) { + Request req3; + req3.method = "CONNECT"; + req3.path = host_and_port_; + req3.headers.insert(detail::make_digest_authentication_header( + req3, auth, 1, detail::random_string(10), + proxy_digest_auth_username_, proxy_digest_auth_password_, + true)); + return process_request(strm, req3, res3, false, error); + })) { + // Thread-safe to close everything because we are assuming there are + // no requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + success = false; + return false; + } + } + } else { + res = res2; + return false; + } + } + + return true; +} + +inline bool SSLClient::load_certs() { + bool ret = true; + + std::call_once(initialize_cert_, [&]() { + std::lock_guard guard(ctx_mutex_); + if (!ca_cert_file_path_.empty()) { + if (!SSL_CTX_load_verify_locations(ctx_, ca_cert_file_path_.c_str(), + nullptr)) { + ret = false; + } + } else if (!ca_cert_dir_path_.empty()) { + if (!SSL_CTX_load_verify_locations(ctx_, nullptr, + ca_cert_dir_path_.c_str())) { + ret = false; + } + } else { +#ifdef _WIN32 + detail::load_system_certs_on_windows(SSL_CTX_get_cert_store(ctx_)); +#else + SSL_CTX_set_default_verify_paths(ctx_); +#endif + } + }); + + return ret; +} + +inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { + auto ssl = detail::ssl_new( + socket.sock, ctx_, ctx_mutex_, + [&](SSL *ssl) { + if (server_certificate_verification_) { + if (!load_certs()) { + error = Error::SSLLoadingCerts; + return false; + } + SSL_set_verify(ssl, SSL_VERIFY_NONE, nullptr); + } + + if (!detail::ssl_connect_or_accept_nonblocking( + socket.sock, ssl, SSL_connect, connection_timeout_sec_, + connection_timeout_usec_)) { + error = Error::SSLConnection; + return false; + } + + if (server_certificate_verification_) { + verify_result_ = SSL_get_verify_result(ssl); + + if (verify_result_ != X509_V_OK) { + error = Error::SSLServerVerification; + return false; + } + + auto server_cert = SSL_get_peer_certificate(ssl); + + if (server_cert == nullptr) { + error = Error::SSLServerVerification; + return false; + } + + if (!verify_host(server_cert)) { + X509_free(server_cert); + error = Error::SSLServerVerification; + return false; + } + X509_free(server_cert); + } + + return true; + }, + [&](SSL *ssl) { + SSL_set_tlsext_host_name(ssl, host_.c_str()); + return true; + }); + + if (ssl) { + socket.ssl = ssl; + return true; + } + + shutdown_socket(socket); + close_socket(socket); + return false; +} + +inline void SSLClient::shutdown_ssl(Socket &socket, bool shutdown_gracefully) { + shutdown_ssl_impl(socket, shutdown_gracefully); +} + +inline void SSLClient::shutdown_ssl_impl(Socket &socket, + bool shutdown_gracefully) { + if (socket.sock == INVALID_SOCKET) { + assert(socket.ssl == nullptr); + return; + } + if (socket.ssl) { + detail::ssl_delete(ctx_mutex_, socket.ssl, shutdown_gracefully); + socket.ssl = nullptr; + } + assert(socket.ssl == nullptr); +} + +inline bool +SSLClient::process_socket(const Socket &socket, + std::function callback) { + assert(socket.ssl); + return detail::process_client_socket_ssl( + socket.ssl, socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, std::move(callback)); +} + +inline bool SSLClient::is_ssl() const { return true; } + +inline bool SSLClient::verify_host(X509 *server_cert) const { + /* Quote from RFC2818 section 3.1 "Server Identity" + + If a subjectAltName extension of type dNSName is present, that MUST + be used as the identity. Otherwise, the (most specific) Common Name + field in the Subject field of the certificate MUST be used. Although + the use of the Common Name is existing practice, it is deprecated and + Certification Authorities are encouraged to use the dNSName instead. + + Matching is performed using the matching rules specified by + [RFC2459]. If more than one identity of a given type is present in + the certificate (e.g., more than one dNSName name, a match in any one + of the set is considered acceptable.) Names may contain the wildcard + character * which is considered to match any single domain name + component or component fragment. E.g., *.a.com matches foo.a.com but + not bar.foo.a.com. f*.com matches foo.com but not bar.com. + + In some cases, the URI is specified as an IP address rather than a + hostname. In this case, the iPAddress subjectAltName must be present + in the certificate and must exactly match the IP in the URI. + + */ + return verify_host_with_subject_alt_name(server_cert) || + verify_host_with_common_name(server_cert); +} + +inline bool +SSLClient::verify_host_with_subject_alt_name(X509 *server_cert) const { + auto ret = false; + + auto type = GEN_DNS; + + struct in6_addr addr6; + struct in_addr addr; + size_t addr_len = 0; + +#ifndef __MINGW32__ + if (inet_pton(AF_INET6, host_.c_str(), &addr6)) { + type = GEN_IPADD; + addr_len = sizeof(struct in6_addr); + } else if (inet_pton(AF_INET, host_.c_str(), &addr)) { + type = GEN_IPADD; + addr_len = sizeof(struct in_addr); + } +#endif + + auto alt_names = static_cast( + X509_get_ext_d2i(server_cert, NID_subject_alt_name, nullptr, nullptr)); + + if (alt_names) { + auto dsn_matched = false; + auto ip_mached = false; + + auto count = sk_GENERAL_NAME_num(alt_names); + + for (decltype(count) i = 0; i < count && !dsn_matched; i++) { + auto val = sk_GENERAL_NAME_value(alt_names, i); + if (val->type == type) { + auto name = (const char *)ASN1_STRING_get0_data(val->d.ia5); + auto name_len = (size_t)ASN1_STRING_length(val->d.ia5); + + switch (type) { + case GEN_DNS: dsn_matched = check_host_name(name, name_len); break; + + case GEN_IPADD: + if (!memcmp(&addr6, name, addr_len) || + !memcmp(&addr, name, addr_len)) { + ip_mached = true; + } + break; + } + } + } + + if (dsn_matched || ip_mached) { ret = true; } + } + + GENERAL_NAMES_free((STACK_OF(GENERAL_NAME) *)alt_names); + return ret; +} + +inline bool SSLClient::verify_host_with_common_name(X509 *server_cert) const { + const auto subject_name = X509_get_subject_name(server_cert); + + if (subject_name != nullptr) { + char name[BUFSIZ]; + auto name_len = X509_NAME_get_text_by_NID(subject_name, NID_commonName, + name, sizeof(name)); + + if (name_len != -1) { + return check_host_name(name, static_cast(name_len)); + } + } + + return false; +} + +inline bool SSLClient::check_host_name(const char *pattern, + size_t pattern_len) const { + if (host_.size() == pattern_len && host_ == pattern) { return true; } + + // Wildcard match + // https://bugs.launchpad.net/ubuntu/+source/firefox-3.0/+bug/376484 + std::vector pattern_components; + detail::split(&pattern[0], &pattern[pattern_len], '.', + [&](const char *b, const char *e) { + pattern_components.emplace_back(std::string(b, e)); + }); + + if (host_components_.size() != pattern_components.size()) { return false; } + + auto itr = pattern_components.begin(); + for (const auto &h : host_components_) { + auto &p = *itr; + if (p != h && p != "*") { + auto partial_match = (p.size() > 0 && p[p.size() - 1] == '*' && + !p.compare(0, p.size() - 1, h)); + if (!partial_match) { return false; } + } + ++itr; + } + + return true; +} +#endif + +// Universal client implementation +inline Client::Client(const std::string &scheme_host_port) + : Client(scheme_host_port, std::string(), std::string()) {} + +inline Client::Client(const std::string &scheme_host_port, + const std::string &client_cert_path, + const std::string &client_key_path) { + const static std::regex re( + R"((?:([a-z]+):\/\/)?(?:\[([\d:]+)\]|([^:/?#]+))(?::(\d+))?)"); + + std::smatch m; + if (std::regex_match(scheme_host_port, m, re)) { + auto scheme = m[1].str(); + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (!scheme.empty() && (scheme != "http" && scheme != "https")) { +#else + if (!scheme.empty() && scheme != "http") { +#endif +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "'" + scheme + "' scheme is not supported."; + throw std::invalid_argument(msg); +#endif + return; + } + + auto is_ssl = scheme == "https"; + + auto host = m[2].str(); + if (host.empty()) { host = m[3].str(); } + + auto port_str = m[4].str(); + auto port = !port_str.empty() ? std::stoi(port_str) : (is_ssl ? 443 : 80); + + if (is_ssl) { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + cli_ = detail::make_unique(host.c_str(), port, + client_cert_path, client_key_path); + is_ssl_ = is_ssl; +#endif + } else { + cli_ = detail::make_unique(host.c_str(), port, + client_cert_path, client_key_path); + } + } else { + cli_ = detail::make_unique(scheme_host_port, 80, + client_cert_path, client_key_path); + } +} + +inline Client::Client(const std::string &host, int port) + : cli_(detail::make_unique(host, port)) {} + +inline Client::Client(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : cli_(detail::make_unique(host, port, client_cert_path, + client_key_path)) {} + +inline Client::~Client() {} + +inline bool Client::is_valid() const { + return cli_ != nullptr && cli_->is_valid(); +} + +inline Result Client::Get(const char *path) { return cli_->Get(path); } +inline Result Client::Get(const char *path, const Headers &headers) { + return cli_->Get(path, headers); +} +inline Result Client::Get(const char *path, Progress progress) { + return cli_->Get(path, std::move(progress)); +} +inline Result Client::Get(const char *path, const Headers &headers, + Progress progress) { + return cli_->Get(path, headers, std::move(progress)); +} +inline Result Client::Get(const char *path, ContentReceiver content_receiver) { + return cli_->Get(path, std::move(content_receiver)); +} +inline Result Client::Get(const char *path, const Headers &headers, + ContentReceiver content_receiver) { + return cli_->Get(path, headers, std::move(content_receiver)); +} +inline Result Client::Get(const char *path, ContentReceiver content_receiver, + Progress progress) { + return cli_->Get(path, std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const char *path, const Headers &headers, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, headers, std::move(content_receiver), + std::move(progress)); +} +inline Result Client::Get(const char *path, ResponseHandler response_handler, + ContentReceiver content_receiver) { + return cli_->Get(path, std::move(response_handler), + std::move(content_receiver)); +} +inline Result Client::Get(const char *path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver) { + return cli_->Get(path, headers, std::move(response_handler), + std::move(content_receiver)); +} +inline Result Client::Get(const char *path, ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const char *path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const char *path, const Params ¶ms, + const Headers &headers, Progress progress) { + return cli_->Get(path, params, headers, progress); +} +inline Result Client::Get(const char *path, const Params ¶ms, + const Headers &headers, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, params, headers, content_receiver, progress); +} +inline Result Client::Get(const char *path, const Params ¶ms, + const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, params, headers, response_handler, content_receiver, + progress); +} + +inline Result Client::Head(const char *path) { return cli_->Head(path); } +inline Result Client::Head(const char *path, const Headers &headers) { + return cli_->Head(path, headers); +} + +inline Result Client::Post(const char *path) { return cli_->Post(path); } +inline Result Client::Post(const char *path, const char *body, + size_t content_length, const char *content_type) { + return cli_->Post(path, body, content_length, content_type); +} +inline Result Client::Post(const char *path, const Headers &headers, + const char *body, size_t content_length, + const char *content_type) { + return cli_->Post(path, headers, body, content_length, content_type); +} +inline Result Client::Post(const char *path, const std::string &body, + const char *content_type) { + return cli_->Post(path, body, content_type); +} +inline Result Client::Post(const char *path, const Headers &headers, + const std::string &body, const char *content_type) { + return cli_->Post(path, headers, body, content_type); +} +inline Result Client::Post(const char *path, size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return cli_->Post(path, content_length, std::move(content_provider), + content_type); +} +inline Result Client::Post(const char *path, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return cli_->Post(path, std::move(content_provider), content_type); +} +inline Result Client::Post(const char *path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return cli_->Post(path, headers, content_length, std::move(content_provider), + content_type); +} +inline Result Client::Post(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return cli_->Post(path, headers, std::move(content_provider), content_type); +} +inline Result Client::Post(const char *path, const Params ¶ms) { + return cli_->Post(path, params); +} +inline Result Client::Post(const char *path, const Headers &headers, + const Params ¶ms) { + return cli_->Post(path, headers, params); +} +inline Result Client::Post(const char *path, + const MultipartFormDataItems &items) { + return cli_->Post(path, items); +} +inline Result Client::Post(const char *path, const Headers &headers, + const MultipartFormDataItems &items) { + return cli_->Post(path, headers, items); +} +inline Result Client::Post(const char *path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + return cli_->Post(path, headers, items, boundary); +} +inline Result Client::Put(const char *path) { return cli_->Put(path); } +inline Result Client::Put(const char *path, const char *body, + size_t content_length, const char *content_type) { + return cli_->Put(path, body, content_length, content_type); +} +inline Result Client::Put(const char *path, const Headers &headers, + const char *body, size_t content_length, + const char *content_type) { + return cli_->Put(path, headers, body, content_length, content_type); +} +inline Result Client::Put(const char *path, const std::string &body, + const char *content_type) { + return cli_->Put(path, body, content_type); +} +inline Result Client::Put(const char *path, const Headers &headers, + const std::string &body, const char *content_type) { + return cli_->Put(path, headers, body, content_type); +} +inline Result Client::Put(const char *path, size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return cli_->Put(path, content_length, std::move(content_provider), + content_type); +} +inline Result Client::Put(const char *path, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return cli_->Put(path, std::move(content_provider), content_type); +} +inline Result Client::Put(const char *path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return cli_->Put(path, headers, content_length, std::move(content_provider), + content_type); +} +inline Result Client::Put(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return cli_->Put(path, headers, std::move(content_provider), content_type); +} +inline Result Client::Put(const char *path, const Params ¶ms) { + return cli_->Put(path, params); +} +inline Result Client::Put(const char *path, const Headers &headers, + const Params ¶ms) { + return cli_->Put(path, headers, params); +} +inline Result Client::Patch(const char *path) { return cli_->Patch(path); } +inline Result Client::Patch(const char *path, const char *body, + size_t content_length, const char *content_type) { + return cli_->Patch(path, body, content_length, content_type); +} +inline Result Client::Patch(const char *path, const Headers &headers, + const char *body, size_t content_length, + const char *content_type) { + return cli_->Patch(path, headers, body, content_length, content_type); +} +inline Result Client::Patch(const char *path, const std::string &body, + const char *content_type) { + return cli_->Patch(path, body, content_type); +} +inline Result Client::Patch(const char *path, const Headers &headers, + const std::string &body, const char *content_type) { + return cli_->Patch(path, headers, body, content_type); +} +inline Result Client::Patch(const char *path, size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return cli_->Patch(path, content_length, std::move(content_provider), + content_type); +} +inline Result Client::Patch(const char *path, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return cli_->Patch(path, std::move(content_provider), content_type); +} +inline Result Client::Patch(const char *path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const char *content_type) { + return cli_->Patch(path, headers, content_length, std::move(content_provider), + content_type); +} +inline Result Client::Patch(const char *path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const char *content_type) { + return cli_->Patch(path, headers, std::move(content_provider), content_type); +} +inline Result Client::Delete(const char *path) { return cli_->Delete(path); } +inline Result Client::Delete(const char *path, const Headers &headers) { + return cli_->Delete(path, headers); +} +inline Result Client::Delete(const char *path, const char *body, + size_t content_length, const char *content_type) { + return cli_->Delete(path, body, content_length, content_type); +} +inline Result Client::Delete(const char *path, const Headers &headers, + const char *body, size_t content_length, + const char *content_type) { + return cli_->Delete(path, headers, body, content_length, content_type); +} +inline Result Client::Delete(const char *path, const std::string &body, + const char *content_type) { + return cli_->Delete(path, body, content_type); +} +inline Result Client::Delete(const char *path, const Headers &headers, + const std::string &body, + const char *content_type) { + return cli_->Delete(path, headers, body, content_type); +} +inline Result Client::Options(const char *path) { return cli_->Options(path); } +inline Result Client::Options(const char *path, const Headers &headers) { + return cli_->Options(path, headers); +} + +inline bool Client::send(Request &req, Response &res, Error &error) { + return cli_->send(req, res, error); +} + +inline Result Client::send(const Request &req) { return cli_->send(req); } + +inline size_t Client::is_socket_open() const { return cli_->is_socket_open(); } + +inline void Client::stop() { cli_->stop(); } + +inline void Client::set_hostname_addr_map( + const std::map addr_map) { + cli_->set_hostname_addr_map(std::move(addr_map)); +} + +inline void Client::set_default_headers(Headers headers) { + cli_->set_default_headers(std::move(headers)); +} + +inline void Client::set_address_family(int family) { + cli_->set_address_family(family); +} + +inline void Client::set_tcp_nodelay(bool on) { cli_->set_tcp_nodelay(on); } + +inline void Client::set_socket_options(SocketOptions socket_options) { + cli_->set_socket_options(std::move(socket_options)); +} + +inline void Client::set_connection_timeout(time_t sec, time_t usec) { + cli_->set_connection_timeout(sec, usec); +} + +inline void Client::set_read_timeout(time_t sec, time_t usec) { + cli_->set_read_timeout(sec, usec); +} + +inline void Client::set_write_timeout(time_t sec, time_t usec) { + cli_->set_write_timeout(sec, usec); +} + +inline void Client::set_basic_auth(const char *username, const char *password) { + cli_->set_basic_auth(username, password); +} +inline void Client::set_bearer_token_auth(const char *token) { + cli_->set_bearer_token_auth(token); +} +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void Client::set_digest_auth(const char *username, + const char *password) { + cli_->set_digest_auth(username, password); +} +#endif + +inline void Client::set_keep_alive(bool on) { cli_->set_keep_alive(on); } +inline void Client::set_follow_location(bool on) { + cli_->set_follow_location(on); +} + +inline void Client::set_url_encode(bool on) { cli_->set_url_encode(on); } + +inline void Client::set_compress(bool on) { cli_->set_compress(on); } + +inline void Client::set_decompress(bool on) { cli_->set_decompress(on); } + +inline void Client::set_interface(const char *intf) { + cli_->set_interface(intf); +} + +inline void Client::set_proxy(const char *host, int port) { + cli_->set_proxy(host, port); +} +inline void Client::set_proxy_basic_auth(const char *username, + const char *password) { + cli_->set_proxy_basic_auth(username, password); +} +inline void Client::set_proxy_bearer_token_auth(const char *token) { + cli_->set_proxy_bearer_token_auth(token); +} +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void Client::set_proxy_digest_auth(const char *username, + const char *password) { + cli_->set_proxy_digest_auth(username, password); +} +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void Client::enable_server_certificate_verification(bool enabled) { + cli_->enable_server_certificate_verification(enabled); +} +#endif + +inline void Client::set_logger(Logger logger) { cli_->set_logger(logger); } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void Client::set_ca_cert_path(const char *ca_cert_file_path, + const char *ca_cert_dir_path) { + cli_->set_ca_cert_path(ca_cert_file_path, ca_cert_dir_path); +} + +inline void Client::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (is_ssl_) { + static_cast(*cli_).set_ca_cert_store(ca_cert_store); + } else { + cli_->set_ca_cert_store(ca_cert_store); + } +} + +inline long Client::get_openssl_verify_result() const { + if (is_ssl_) { + return static_cast(*cli_).get_openssl_verify_result(); + } + return -1; // NOTE: -1 doesn't match any of X509_V_ERR_??? +} + +inline SSL_CTX *Client::ssl_context() const { + if (is_ssl_) { return static_cast(*cli_).ssl_context(); } + return nullptr; +} +#endif + +// ---------------------------------------------------------------------------- + +} // namespace httplib + +#endif // CPPHTTPLIB_HTTPLIB_H diff --git a/Include/inlinehook.h b/Include/inlinehook.h new file mode 100644 index 0000000..23f45f5 --- /dev/null +++ b/Include/inlinehook.h @@ -0,0 +1,53 @@ +#pragma once + + +constexpr int Byte_Length = 6; +class inlinehook +{ +private: + using uchar = unsigned char; + + //原始函数处的汇编指令 + uchar m_original_byte[Byte_Length]; + //我们构造的汇编指令 + uchar m_self_byte[Byte_Length]; + + //原始函数地址 + int m_original_address; + //我们函数地址 + int m_self_address; + + DWORD Motify_memory_attributes(int address, DWORD attributes = PAGE_EXECUTE_READWRITE); + + +public: + + inlinehook(int original_address, int self_address) :m_original_address(original_address), m_self_address(self_address) + { + //构造jmp + m_self_byte[0] = '\xe9'; + //计算偏移 + int offset = self_address + 1 - (original_address + Byte_Length); + + //构造跳转到我们的函数BYTE + memcpy(&m_self_byte[1], &offset, Byte_Length - 2); + + m_self_byte[5] = '\x90'; + //修改内存属性 + DWORD attributes = Motify_memory_attributes(original_address); + + //保存原始的函数地址的BYTE + memcpy(&m_original_byte, reinterpret_cast(original_address), Byte_Length); + + //恢复内存属性 + Motify_memory_attributes(original_address, attributes); + } + + + //修改地址 + void Motify_address(); + + //还原地址 + void Restore_address(); +}; + diff --git a/Include/sqstdaux.h b/Include/sqstdaux.h new file mode 100644 index 0000000..c16b043 --- /dev/null +++ b/Include/sqstdaux.h @@ -0,0 +1,16 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTD_AUXLIB_H_ +#define _SQSTD_AUXLIB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +SQUIRREL_API void sqstd_seterrorhandlers(HSQUIRRELVM v); +SQUIRREL_API void sqstd_printcallstack(HSQUIRRELVM v); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* _SQSTD_AUXLIB_H_ */ diff --git a/Include/sqstdblob.h b/Include/sqstdblob.h new file mode 100644 index 0000000..1d9a4cd --- /dev/null +++ b/Include/sqstdblob.h @@ -0,0 +1,20 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTDBLOB_H_ +#define _SQSTDBLOB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +SQUIRREL_API SQUserPointer sqstd_createblob(HSQUIRRELVM v, SQInteger size); +SQUIRREL_API SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr); +SQUIRREL_API SQInteger sqstd_getblobsize(HSQUIRRELVM v,SQInteger idx); + +SQUIRREL_API SQRESULT sqstd_register_bloblib(HSQUIRRELVM v); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*_SQSTDBLOB_H_*/ + diff --git a/Include/sqstdio.h b/Include/sqstdio.h new file mode 100644 index 0000000..2cb744b --- /dev/null +++ b/Include/sqstdio.h @@ -0,0 +1,53 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTDIO_H_ +#define _SQSTDIO_H_ + +#ifdef __cplusplus + +#define SQSTD_STREAM_TYPE_TAG 0x80000000 + +struct SQStream { + virtual SQInteger Read(void *buffer, SQInteger size) = 0; + virtual SQInteger Write(void *buffer, SQInteger size) = 0; + virtual SQInteger Flush() = 0; + virtual SQInteger Tell() = 0; + virtual SQInteger Len() = 0; + virtual SQInteger Seek(SQInteger offset, SQInteger origin) = 0; + virtual bool IsValid() = 0; + virtual bool EOS() = 0; +}; + +extern "C" { +#endif + +#define SQ_SEEK_CUR 0 +#define SQ_SEEK_END 1 +#define SQ_SEEK_SET 2 + +typedef void* SQFILE; + +SQUIRREL_API SQFILE sqstd_fopen(const SQChar *,const SQChar *); +SQUIRREL_API SQInteger sqstd_fread(SQUserPointer, SQInteger, SQInteger, SQFILE); +SQUIRREL_API SQInteger sqstd_fwrite(const SQUserPointer, SQInteger, SQInteger, SQFILE); +SQUIRREL_API SQInteger sqstd_fseek(SQFILE , SQInteger , SQInteger); +SQUIRREL_API SQInteger sqstd_ftell(SQFILE); +SQUIRREL_API SQInteger sqstd_fflush(SQFILE); +SQUIRREL_API SQInteger sqstd_fclose(SQFILE); +SQUIRREL_API SQInteger sqstd_feof(SQFILE); + +SQUIRREL_API SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own); +SQUIRREL_API SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file); + +//compiler helpers +SQUIRREL_API SQRESULT sqstd_loadfile(HSQUIRRELVM v,const SQChar *filename,SQBool printerror); +SQUIRREL_API SQRESULT sqstd_dofile(HSQUIRRELVM v,const SQChar *filename,SQBool retval,SQBool printerror); +SQUIRREL_API SQRESULT sqstd_writeclosuretofile(HSQUIRRELVM v,const SQChar *filename); + +SQUIRREL_API SQRESULT sqstd_register_iolib(HSQUIRRELVM v); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*_SQSTDIO_H_*/ + diff --git a/Include/sqstdmath.h b/Include/sqstdmath.h new file mode 100644 index 0000000..65de6fd --- /dev/null +++ b/Include/sqstdmath.h @@ -0,0 +1,15 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTD_MATH_H_ +#define _SQSTD_MATH_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +SQUIRREL_API SQRESULT sqstd_register_mathlib(HSQUIRRELVM v); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*_SQSTD_MATH_H_*/ diff --git a/Include/sqstdstring.h b/Include/sqstdstring.h new file mode 100644 index 0000000..72f30b4 --- /dev/null +++ b/Include/sqstdstring.h @@ -0,0 +1,31 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTD_STRING_H_ +#define _SQSTD_STRING_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned int SQRexBool; +typedef struct SQRex SQRex; + +typedef struct { + const SQChar *begin; + SQInteger len; +} SQRexMatch; + +SQUIRREL_API SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error); +SQUIRREL_API void sqstd_rex_free(SQRex *exp); +SQUIRREL_API SQBool sqstd_rex_match(SQRex* exp,const SQChar* text); +SQUIRREL_API SQBool sqstd_rex_search(SQRex* exp,const SQChar* text, const SQChar** out_begin, const SQChar** out_end); +SQUIRREL_API SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* text_end,const SQChar** out_begin, const SQChar** out_end); +SQUIRREL_API SQInteger sqstd_rex_getsubexpcount(SQRex* exp); +SQUIRREL_API SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *subexp); + +SQUIRREL_API SQRESULT sqstd_register_stringlib(HSQUIRRELVM v); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*_SQSTD_STRING_H_*/ diff --git a/Include/sqstdsystem.h b/Include/sqstdsystem.h new file mode 100644 index 0000000..b155a91 --- /dev/null +++ b/Include/sqstdsystem.h @@ -0,0 +1,15 @@ +/* see copyright notice in squirrel.h */ +#ifndef _SQSTD_SYSTEMLIB_H_ +#define _SQSTD_SYSTEMLIB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +SQUIRREL_API SQInteger sqstd_register_systemlib(HSQUIRRELVM v); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* _SQSTD_SYSTEMLIB_H_ */ diff --git a/Include/squirrel.h b/Include/squirrel.h new file mode 100644 index 0000000..d6a775c --- /dev/null +++ b/Include/squirrel.h @@ -0,0 +1,422 @@ +/* +Copyright (c) 2003-2006 Alberto Demichelis + +This software is provided 'as-is', without any +express or implied warranty. In no event will the +authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software +for any purpose, including commercial applications, +and to alter it and redistribute it freely, subject +to the following restrictions: + + 1. The origin of this software must not be + misrepresented; you must not claim that + you wrote the original software. If you + use this software in a product, an + acknowledgment in the product + documentation would be appreciated but is + not required. + + 2. Altered source versions must be plainly + marked as such, and must not be + misrepresented as being the original + software. + + 3. This notice may not be removed or + altered from any source distribution. + +*/ +#ifndef _SQUIRREL_H_ +#define _SQUIRREL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SQUIRREL_API +#define SQUIRREL_API extern +#endif + +#ifdef _SQ64 +#ifdef _MSC_VER +typedef __int64 SQInteger; +typedef unsigned __int64 SQUnsignedInteger; +typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/ +#else +typedef long SQInteger; +typedef unsigned long SQUnsignedInteger; +typedef unsigned long SQHash; /*should be the same size of a pointer*/ +#endif +typedef int SQInt32; +#else +typedef int SQInteger; +typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/ +typedef unsigned int SQUnsignedInteger; +typedef unsigned int SQHash; /*should be the same size of a pointer*/ +#endif + +typedef float SQFloat; +typedef void* SQUserPointer; +typedef SQUnsignedInteger SQBool; +typedef SQInteger SQRESULT; + +#define SQTrue (1) +#define SQFalse (0) + + +struct SQVM; +struct SQTable; +struct SQArray; +struct SQString; +struct SQClosure; +struct SQGenerator; +struct SQNativeClosure; +struct SQUserData; +struct SQFunctionProto; +struct SQRefCounted; +struct SQClass; +struct SQInstance; +struct SQDelegable; + +#ifdef _UNICODE +#define SQUNICODE +#endif + +#ifdef SQUNICODE +#if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8 + +#if defined(wchar_t) //this is if the compiler considers wchar_t as native type +#define wchar_t unsigned short +#endif + +#else +typedef unsigned short wchar_t; +#endif + +typedef wchar_t SQChar; +#define _SC(a) L##a +#define scstrcmp wcscmp +#define scsprintf swprintf +#define scstrlen wcslen +#define scstrtod wcstod +#define scstrtol wcstol +#define scatoi _wtoi +#define scstrtoul wcstoul +#define scvsprintf vswprintf +#define scstrstr wcsstr +#define scisspace iswspace +#define scisdigit iswdigit +#define scisxdigit iswxdigit +#define scisalpha iswalpha +#define sciscntrl iswcntrl +#define scisalnum iswalnum +#define scprintf wprintf +#define MAX_CHAR 0xFFFF +#else +typedef char SQChar; +#define _SC(a) a +#define scstrcmp strcmp +#define scsprintf sprintf +#define scstrlen strlen +#define scstrtod strtod +#define scstrtol strtol +#define scatoi atoi +#define scstrtoul strtoul +#define scvsprintf vsprintf +#define scstrstr strstr +#define scisspace isspace +#define scisdigit isdigit +#define scisxdigit isxdigit +#define sciscntrl iscntrl +#define scisalpha isalpha +#define scisalnum isalnum +#define scprintf printf +#define MAX_CHAR 0xFF +#endif + +#define SQUIRREL_VERSION _SC("Squirrel 2.1.1 stable") +#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2006 Alberto Demichelis") +#define SQUIRREL_AUTHOR _SC("Alberto Demichelis") + +#define SQ_VMSTATE_IDLE 0 +#define SQ_VMSTATE_RUNNING 1 +#define SQ_VMSTATE_SUSPENDED 2 + +#define SQUIRREL_EOB 0 +#define SQ_BYTECODE_STREAM_TAG 0xFAFA + +#define SQOBJECT_REF_COUNTED 0x08000000 +#define SQOBJECT_NUMERIC 0x04000000 +#define SQOBJECT_DELEGABLE 0x02000000 +#define SQOBJECT_CANBEFALSE 0x01000000 + +#define SQ_MATCHTYPEMASKSTRING (-99999) + +#define _RT_MASK 0x00FFFFFF +#define _RAW_TYPE(type) (type&_RT_MASK) + +#define _RT_NULL 0x00000001 +#define _RT_INTEGER 0x00000002 +#define _RT_FLOAT 0x00000004 +#define _RT_BOOL 0x00000008 +#define _RT_STRING 0x00000010 +#define _RT_TABLE 0x00000020 +#define _RT_ARRAY 0x00000040 +#define _RT_USERDATA 0x00000080 +#define _RT_CLOSURE 0x00000100 +#define _RT_NATIVECLOSURE 0x00000200 +#define _RT_GENERATOR 0x00000400 +#define _RT_USERPOINTER 0x00000800 +#define _RT_THREAD 0x00001000 +#define _RT_FUNCPROTO 0x00002000 +#define _RT_CLASS 0x00004000 +#define _RT_INSTANCE 0x00008000 +#define _RT_WEAKREF 0x00010000 + +typedef enum tagSQObjectType{ + OT_NULL = (_RT_NULL|SQOBJECT_CANBEFALSE), + OT_INTEGER = (_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE), + OT_FLOAT = (_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE), + OT_BOOL = (_RT_BOOL|SQOBJECT_CANBEFALSE), + OT_STRING = (_RT_STRING|SQOBJECT_REF_COUNTED), + OT_TABLE = (_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE), + OT_ARRAY = (_RT_ARRAY|SQOBJECT_REF_COUNTED), + OT_USERDATA = (_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE), + OT_CLOSURE = (_RT_CLOSURE|SQOBJECT_REF_COUNTED), + OT_NATIVECLOSURE = (_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED), + OT_GENERATOR = (_RT_GENERATOR|SQOBJECT_REF_COUNTED), + OT_USERPOINTER = _RT_USERPOINTER, + OT_THREAD = (_RT_THREAD|SQOBJECT_REF_COUNTED) , + OT_FUNCPROTO = (_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only + OT_CLASS = (_RT_CLASS|SQOBJECT_REF_COUNTED), + OT_INSTANCE = (_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE), + OT_WEAKREF = (_RT_WEAKREF|SQOBJECT_REF_COUNTED) +}SQObjectType; + +#define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED) + + +typedef union tagSQObjectValue +{ + struct SQTable *pTable; + struct SQArray *pArray; + struct SQClosure *pClosure; + struct SQGenerator *pGenerator; + struct SQNativeClosure *pNativeClosure; + struct SQString *pString; + struct SQUserData *pUserData; + SQInteger nInteger; + SQFloat fFloat; + SQUserPointer pUserPointer; + struct SQFunctionProto *pFunctionProto; + struct SQRefCounted *pRefCounted; + struct SQDelegable *pDelegable; + struct SQVM *pThread; + struct SQClass *pClass; + struct SQInstance *pInstance; + struct SQWeakRef *pWeakRef; +}SQObjectValue; + + +typedef struct tagSQObject +{ + SQObjectType _type; + SQObjectValue _unVal; +}SQObject; + +typedef struct tagSQStackInfos{ + const SQChar* funcname; + const SQChar* source; + SQInteger line; +}SQStackInfos; + +typedef struct SQVM* HSQUIRRELVM; +typedef SQObject HSQOBJECT; +typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM); +typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size); +typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/); +typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...); + +typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger); +typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger); + +typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer); + +typedef struct tagSQRegFunction{ + const SQChar *name; + SQFUNCTION f; + SQInteger nparamscheck; + const SQChar *typemask; +}SQRegFunction; + +/*vm*/ +SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize); +SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize); +SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v); +SQUIRREL_API void sq_close(HSQUIRRELVM v); +SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p); +SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v); +SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc); +SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v); +SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v); +SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror); +SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v); + +/*compiler*/ +SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror); +SQUIRREL_API SQRESULT sq_mycompile(HSQUIRRELVM v, SQLEXREADFUNC read, SQUserPointer p, const SQChar* sourcename, SQBool raiseerror); +SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror); +SQUIRREL_API SQRESULT sq_mycompilebuffer(HSQUIRRELVM v, const SQChar* s, SQInteger size, const SQChar* sourcename, SQBool raiseerror); +SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable); +SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable); +SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f); + +/*stack operations*/ +SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop); +SQUIRREL_API void sq_poptop(HSQUIRRELVM v); +SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v); +SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop); +SQUIRREL_API void sq_reservestack(HSQUIRRELVM v,SQInteger nsize); +SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v); +SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx); + +/*object creation handling*/ +SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size); +SQUIRREL_API void sq_newtable(HSQUIRRELVM v); +SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size); +SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars); +SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask); +SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len); +SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f); +SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n); +SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b); +SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p); +SQUIRREL_API void sq_pushnull(HSQUIRRELVM v); +SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQBool sq_instanceof(HSQUIRRELVM v); +SQUIRREL_API void sq_tostring(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b); +SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c); +SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i); +SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f); +SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b); +SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread); +SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p); +SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag); +SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag); +SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag); +SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook); +SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize); +SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars); +SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name); +SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p); +SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag); +SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase); +SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t); + +/*object manipulation*/ +SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v); +SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v); +SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v); +SQUIRREL_API SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic); +SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval); +SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval); +SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval); +SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize); +SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval); +SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx); +SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx); + +/*calls*/ +SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror); +SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror); +SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx); +SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval); +SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err); +SQUIRREL_API void sq_reseterror(HSQUIRRELVM v); +SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v); + +/*raw object handling*/ +SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po); +SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj); +SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po); +SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po); +SQUIRREL_API void sq_resetobject(HSQOBJECT *po); +SQUIRREL_API const SQChar *sq_objtostring(HSQOBJECT *o); +SQUIRREL_API SQBool sq_objtobool(HSQOBJECT *o); +SQUIRREL_API SQInteger sq_objtointeger(HSQOBJECT *o); +SQUIRREL_API SQFloat sq_objtofloat(HSQOBJECT *o); +SQUIRREL_API SQRESULT sq_getobjtypetag(HSQOBJECT *o,SQUserPointer * typetag); + +/*GC*/ +SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v); + +/*serialization*/ +SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up); +SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up); + +/*mem allocation*/ +SQUIRREL_API void *sq_malloc(SQUnsignedInteger size); +SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize); +SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size); + +/*debug*/ +SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si); +SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v); + +/*UTILITY MACRO*/ +#define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC) +#define sq_istable(o) ((o)._type==OT_TABLE) +#define sq_isarray(o) ((o)._type==OT_ARRAY) +#define sq_isfunction(o) ((o)._type==OT_FUNCPROTO) +#define sq_isclosure(o) ((o)._type==OT_CLOSURE) +#define sq_isgenerator(o) ((o)._type==OT_GENERATOR) +#define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE) +#define sq_isstring(o) ((o)._type==OT_STRING) +#define sq_isinteger(o) ((o)._type==OT_INTEGER) +#define sq_isfloat(o) ((o)._type==OT_FLOAT) +#define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER) +#define sq_isuserdata(o) ((o)._type==OT_USERDATA) +#define sq_isthread(o) ((o)._type==OT_THREAD) +#define sq_isnull(o) ((o)._type==OT_NULL) +#define sq_isclass(o) ((o)._type==OT_CLASS) +#define sq_isinstance(o) ((o)._type==OT_INSTANCE) +#define sq_isbool(o) ((o)._type==OT_BOOL) +#define sq_isweakref(o) ((o)._type==OT_WEAKREF) +#define sq_type(o) ((o)._type) + +/* deprecated */ +#define sq_createslot(v,n) sq_newslot(v,n,SQFalse) + +#define SQ_OK (0) +#define SQ_ERROR (-1) + +#define SQ_FAILED(res) (res<0) +#define SQ_SUCCEEDED(res) (res>=0) + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*_SQUIRREL_H_*/ diff --git a/OtherInc/openssl/include/openssl/__DECC_INCLUDE_EPILOGUE.H b/OtherInc/openssl/include/openssl/__DECC_INCLUDE_EPILOGUE.H new file mode 100644 index 0000000..d251d0a --- /dev/null +++ b/OtherInc/openssl/include/openssl/__DECC_INCLUDE_EPILOGUE.H @@ -0,0 +1,22 @@ +/* + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is only used by HP C/C++ on VMS, and is included automatically + * after each header file from this directory + */ + +/* + * The C++ compiler doesn't understand these pragmas, even though it + * understands the corresponding command line qualifier. + */ +#ifndef __cplusplus +/* restore state. Must correspond to the save in __decc_include_prologue.h */ +# pragma names restore +#endif diff --git a/OtherInc/openssl/include/openssl/__DECC_INCLUDE_PROLOGUE.H b/OtherInc/openssl/include/openssl/__DECC_INCLUDE_PROLOGUE.H new file mode 100644 index 0000000..91ac6b3 --- /dev/null +++ b/OtherInc/openssl/include/openssl/__DECC_INCLUDE_PROLOGUE.H @@ -0,0 +1,26 @@ +/* + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This file is only used by HP C/C++ on VMS, and is included automatically + * after each header file from this directory + */ + +/* + * The C++ compiler doesn't understand these pragmas, even though it + * understands the corresponding command line qualifier. + */ +#ifndef __cplusplus +/* save state */ +# pragma names save +/* have the compiler shorten symbols larger than 31 chars to 23 chars + * followed by a 8 hex char CRC + */ +# pragma names as_is,shortened +#endif diff --git a/OtherInc/openssl/include/openssl/aes.h b/OtherInc/openssl/include/openssl/aes.h new file mode 100644 index 0000000..d0f9dfc --- /dev/null +++ b/OtherInc/openssl/include/openssl/aes.h @@ -0,0 +1,111 @@ +/* + * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_AES_H +# define OPENSSL_AES_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_AES_H +# endif + +# include + +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define AES_BLOCK_SIZE 16 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 + +# define AES_ENCRYPT 1 +# define AES_DECRYPT 0 + +# define AES_MAXNR 14 + + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st { +# ifdef AES_LONG + unsigned long rd_key[4 * (AES_MAXNR + 1)]; +# else + unsigned int rd_key[4 * (AES_MAXNR + 1)]; +# endif + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *AES_options(void); +OSSL_DEPRECATEDIN_3_0 +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +OSSL_DEPRECATEDIN_3_0 +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +OSSL_DEPRECATEDIN_3_0 +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +OSSL_DEPRECATEDIN_3_0 +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +OSSL_DEPRECATEDIN_3_0 +void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key, const int enc); +OSSL_DEPRECATEDIN_3_0 +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +OSSL_DEPRECATEDIN_3_0 +void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +OSSL_DEPRECATEDIN_3_0 +void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +OSSL_DEPRECATEDIN_3_0 +void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +OSSL_DEPRECATEDIN_3_0 +void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, int *num); + +/* NB: the IV is _two_ blocks long */ +OSSL_DEPRECATEDIN_3_0 +void AES_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, + unsigned char *ivec, const int enc); +/* NB: the IV is _four_ blocks long */ +OSSL_DEPRECATEDIN_3_0 +void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const AES_KEY *key, const AES_KEY *key2, + const unsigned char *ivec, const int enc); +OSSL_DEPRECATEDIN_3_0 +int AES_wrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, const unsigned char *in, + unsigned int inlen); +OSSL_DEPRECATEDIN_3_0 +int AES_unwrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, const unsigned char *in, + unsigned int inlen); +# endif + + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/applink.c b/OtherInc/openssl/include/openssl/applink.c new file mode 100644 index 0000000..1d8ecf7 --- /dev/null +++ b/OtherInc/openssl/include/openssl/applink.c @@ -0,0 +1,144 @@ +/* + * Copyright 2004-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#define APPLINK_STDIN 1 +#define APPLINK_STDOUT 2 +#define APPLINK_STDERR 3 +#define APPLINK_FPRINTF 4 +#define APPLINK_FGETS 5 +#define APPLINK_FREAD 6 +#define APPLINK_FWRITE 7 +#define APPLINK_FSETMOD 8 +#define APPLINK_FEOF 9 +#define APPLINK_FCLOSE 10 /* should not be used */ + +#define APPLINK_FOPEN 11 /* solely for completeness */ +#define APPLINK_FSEEK 12 +#define APPLINK_FTELL 13 +#define APPLINK_FFLUSH 14 +#define APPLINK_FERROR 15 +#define APPLINK_CLEARERR 16 +#define APPLINK_FILENO 17 /* to be used with below */ + +#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */ +#define APPLINK_READ 19 +#define APPLINK_WRITE 20 +#define APPLINK_LSEEK 21 +#define APPLINK_CLOSE 22 +#define APPLINK_MAX 22 /* always same as last macro */ + +#ifndef APPMACROS_ONLY +# include +# include +# include + +# ifdef __BORLANDC__ + /* _lseek in is a function-like macro so we can't take its address */ +# undef _lseek +# define _lseek lseek +# endif + +static void *app_stdin(void) +{ + return stdin; +} + +static void *app_stdout(void) +{ + return stdout; +} + +static void *app_stderr(void) +{ + return stderr; +} + +static int app_feof(FILE *fp) +{ + return feof(fp); +} + +static int app_ferror(FILE *fp) +{ + return ferror(fp); +} + +static void app_clearerr(FILE *fp) +{ + clearerr(fp); +} + +static int app_fileno(FILE *fp) +{ + return _fileno(fp); +} + +static int app_fsetmod(FILE *fp, char mod) +{ + return _setmode(_fileno(fp), mod == 'b' ? _O_BINARY : _O_TEXT); +} + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllexport) +void ** +# if defined(__BORLANDC__) +/* + * __stdcall appears to be the only way to get the name + * decoration right with Borland C. Otherwise it works + * purely incidentally, as we pass no parameters. + */ +__stdcall +# else +__cdecl +# endif +OPENSSL_Applink(void) +{ + static int once = 1; + static void *OPENSSL_ApplinkTable[APPLINK_MAX + 1] = + { (void *)APPLINK_MAX }; + + if (once) { + OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin; + OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout; + OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr; + OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf; + OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets; + OPENSSL_ApplinkTable[APPLINK_FREAD] = fread; + OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite; + OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod; + OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof; + OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose; + + OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen; + OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek; + OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell; + OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush; + OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror; + OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr; + OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno; + + OPENSSL_ApplinkTable[APPLINK_OPEN] = _open; + OPENSSL_ApplinkTable[APPLINK_READ] = _read; + OPENSSL_ApplinkTable[APPLINK_WRITE] = _write; + OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek; + OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close; + + once = 0; + } + + return OPENSSL_ApplinkTable; +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/asn1.h b/OtherInc/openssl/include/openssl/asn1.h new file mode 100644 index 0000000..aada23d --- /dev/null +++ b/OtherInc/openssl/include/openssl/asn1.h @@ -0,0 +1,1128 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\asn1.h.in + * + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_ASN1_H +# define OPENSSL_ASN1_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_ASN1_H +# endif + +# include +# include +# include +# include +# include +# include +# include + +# include +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define V_ASN1_UNIVERSAL 0x00 +# define V_ASN1_APPLICATION 0x40 +# define V_ASN1_CONTEXT_SPECIFIC 0x80 +# define V_ASN1_PRIVATE 0xc0 + +# define V_ASN1_CONSTRUCTED 0x20 +# define V_ASN1_PRIMITIVE_TAG 0x1f +# define V_ASN1_PRIMATIVE_TAG /*compat*/ V_ASN1_PRIMITIVE_TAG + +# define V_ASN1_APP_CHOOSE -2/* let the recipient choose */ +# define V_ASN1_OTHER -3/* used in ASN1_TYPE */ +# define V_ASN1_ANY -4/* used in ASN1 template code */ + +# define V_ASN1_UNDEF -1 +/* ASN.1 tag values */ +# define V_ASN1_EOC 0 +# define V_ASN1_BOOLEAN 1 /**/ +# define V_ASN1_INTEGER 2 +# define V_ASN1_BIT_STRING 3 +# define V_ASN1_OCTET_STRING 4 +# define V_ASN1_NULL 5 +# define V_ASN1_OBJECT 6 +# define V_ASN1_OBJECT_DESCRIPTOR 7 +# define V_ASN1_EXTERNAL 8 +# define V_ASN1_REAL 9 +# define V_ASN1_ENUMERATED 10 +# define V_ASN1_UTF8STRING 12 +# define V_ASN1_SEQUENCE 16 +# define V_ASN1_SET 17 +# define V_ASN1_NUMERICSTRING 18 /**/ +# define V_ASN1_PRINTABLESTRING 19 +# define V_ASN1_T61STRING 20 +# define V_ASN1_TELETEXSTRING 20/* alias */ +# define V_ASN1_VIDEOTEXSTRING 21 /**/ +# define V_ASN1_IA5STRING 22 +# define V_ASN1_UTCTIME 23 +# define V_ASN1_GENERALIZEDTIME 24 /**/ +# define V_ASN1_GRAPHICSTRING 25 /**/ +# define V_ASN1_ISO64STRING 26 /**/ +# define V_ASN1_VISIBLESTRING 26/* alias */ +# define V_ASN1_GENERALSTRING 27 /**/ +# define V_ASN1_UNIVERSALSTRING 28 /**/ +# define V_ASN1_BMPSTRING 30 + +/* + * NB the constants below are used internally by ASN1_INTEGER + * and ASN1_ENUMERATED to indicate the sign. They are *not* on + * the wire tag values. + */ + +# define V_ASN1_NEG 0x100 +# define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +# define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) + +/* For use with d2i_ASN1_type_bytes() */ +# define B_ASN1_NUMERICSTRING 0x0001 +# define B_ASN1_PRINTABLESTRING 0x0002 +# define B_ASN1_T61STRING 0x0004 +# define B_ASN1_TELETEXSTRING 0x0004 +# define B_ASN1_VIDEOTEXSTRING 0x0008 +# define B_ASN1_IA5STRING 0x0010 +# define B_ASN1_GRAPHICSTRING 0x0020 +# define B_ASN1_ISO64STRING 0x0040 +# define B_ASN1_VISIBLESTRING 0x0040 +# define B_ASN1_GENERALSTRING 0x0080 +# define B_ASN1_UNIVERSALSTRING 0x0100 +# define B_ASN1_OCTET_STRING 0x0200 +# define B_ASN1_BIT_STRING 0x0400 +# define B_ASN1_BMPSTRING 0x0800 +# define B_ASN1_UNKNOWN 0x1000 +# define B_ASN1_UTF8STRING 0x2000 +# define B_ASN1_UTCTIME 0x4000 +# define B_ASN1_GENERALIZEDTIME 0x8000 +# define B_ASN1_SEQUENCE 0x10000 +/* For use with ASN1_mbstring_copy() */ +# define MBSTRING_FLAG 0x1000 +# define MBSTRING_UTF8 (MBSTRING_FLAG) +# define MBSTRING_ASC (MBSTRING_FLAG|1) +# define MBSTRING_BMP (MBSTRING_FLAG|2) +# define MBSTRING_UNIV (MBSTRING_FLAG|4) +# define SMIME_OLDMIME 0x400 +# define SMIME_CRLFEOL 0x800 +# define SMIME_STREAM 0x1000 + +/* Stacks for types not otherwise defined in this header */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_ALGOR, X509_ALGOR, X509_ALGOR) +#define sk_X509_ALGOR_num(sk) OPENSSL_sk_num(ossl_check_const_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_value(sk, idx) ((X509_ALGOR *)OPENSSL_sk_value(ossl_check_const_X509_ALGOR_sk_type(sk), (idx))) +#define sk_X509_ALGOR_new(cmp) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new(ossl_check_X509_ALGOR_compfunc_type(cmp))) +#define sk_X509_ALGOR_new_null() ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new_null()) +#define sk_X509_ALGOR_new_reserve(cmp, n) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new_reserve(ossl_check_X509_ALGOR_compfunc_type(cmp), (n))) +#define sk_X509_ALGOR_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_ALGOR_sk_type(sk), (n)) +#define sk_X509_ALGOR_free(sk) OPENSSL_sk_free(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_zero(sk) OPENSSL_sk_zero(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_delete(sk, i) ((X509_ALGOR *)OPENSSL_sk_delete(ossl_check_X509_ALGOR_sk_type(sk), (i))) +#define sk_X509_ALGOR_delete_ptr(sk, ptr) ((X509_ALGOR *)OPENSSL_sk_delete_ptr(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr))) +#define sk_X509_ALGOR_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_pop(sk) ((X509_ALGOR *)OPENSSL_sk_pop(ossl_check_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_shift(sk) ((X509_ALGOR *)OPENSSL_sk_shift(ossl_check_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_ALGOR_sk_type(sk),ossl_check_X509_ALGOR_freefunc_type(freefunc)) +#define sk_X509_ALGOR_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr), (idx)) +#define sk_X509_ALGOR_set(sk, idx, ptr) ((X509_ALGOR *)OPENSSL_sk_set(ossl_check_X509_ALGOR_sk_type(sk), (idx), ossl_check_X509_ALGOR_type(ptr))) +#define sk_X509_ALGOR_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr), pnum) +#define sk_X509_ALGOR_sort(sk) OPENSSL_sk_sort(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_dup(sk) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_dup(ossl_check_const_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_copyfunc_type(copyfunc), ossl_check_X509_ALGOR_freefunc_type(freefunc))) +#define sk_X509_ALGOR_set_cmp_func(sk, cmp) ((sk_X509_ALGOR_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_compfunc_type(cmp))) + + + +# define ASN1_STRING_FLAG_BITS_LEFT 0x08/* Set if 0x07 has bits left value */ +/* + * This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should be + * inserted in the memory buffer + */ +# define ASN1_STRING_FLAG_NDEF 0x010 + +/* + * This flag is used by the CMS code to indicate that a string is not + * complete and is a place holder for content when it had all been accessed. + * The flag will be reset when content has been written to it. + */ + +# define ASN1_STRING_FLAG_CONT 0x020 +/* + * This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING + * type. + */ +# define ASN1_STRING_FLAG_MSTRING 0x040 +/* String is embedded and only content should be freed */ +# define ASN1_STRING_FLAG_EMBED 0x080 +/* String should be parsed in RFC 5280's time format */ +# define ASN1_STRING_FLAG_X509_TIME 0x100 +/* This is the base type that holds just about everything :-) */ +struct asn1_string_st { + int length; + int type; + unsigned char *data; + /* + * The value of the following field depends on the type being held. It + * is mostly being used for BIT_STRING so if the input data has a + * non-zero 'unused bits' value, it will be handled correctly + */ + long flags; +}; + +/* + * ASN1_ENCODING structure: this is used to save the received encoding of an + * ASN1 type. This is useful to get round problems with invalid encodings + * which can break signatures. + */ + +typedef struct ASN1_ENCODING_st { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ +} ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +# define ASN1_LONG_UNDEF 0x7fffffffL + +# define STABLE_FLAGS_MALLOC 0x01 +/* + * A zero passed to ASN1_STRING_TABLE_new_add for the flags is interpreted + * as "don't change" and STABLE_FLAGS_MALLOC is always set. By setting + * STABLE_FLAGS_MALLOC only we can clear the existing value. Use the alias + * STABLE_FLAGS_CLEAR to reflect this. + */ +# define STABLE_FLAGS_CLEAR STABLE_FLAGS_MALLOC +# define STABLE_NO_MASK 0x02 +# define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING) +# define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING) + +struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +}; + +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_STRING_TABLE, ASN1_STRING_TABLE, ASN1_STRING_TABLE) +#define sk_ASN1_STRING_TABLE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_value(sk, idx) ((ASN1_STRING_TABLE *)OPENSSL_sk_value(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk), (idx))) +#define sk_ASN1_STRING_TABLE_new(cmp) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new(ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp))) +#define sk_ASN1_STRING_TABLE_new_null() ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_STRING_TABLE_new_reserve(cmp, n) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp), (n))) +#define sk_ASN1_STRING_TABLE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (n)) +#define sk_ASN1_STRING_TABLE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_delete(sk, i) ((ASN1_STRING_TABLE *)OPENSSL_sk_delete(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (i))) +#define sk_ASN1_STRING_TABLE_delete_ptr(sk, ptr) ((ASN1_STRING_TABLE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr))) +#define sk_ASN1_STRING_TABLE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_pop(sk) ((ASN1_STRING_TABLE *)OPENSSL_sk_pop(ossl_check_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_shift(sk) ((ASN1_STRING_TABLE *)OPENSSL_sk_shift(ossl_check_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_STRING_TABLE_sk_type(sk),ossl_check_ASN1_STRING_TABLE_freefunc_type(freefunc)) +#define sk_ASN1_STRING_TABLE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr), (idx)) +#define sk_ASN1_STRING_TABLE_set(sk, idx, ptr) ((ASN1_STRING_TABLE *)OPENSSL_sk_set(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (idx), ossl_check_ASN1_STRING_TABLE_type(ptr))) +#define sk_ASN1_STRING_TABLE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr), pnum) +#define sk_ASN1_STRING_TABLE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_dup(sk) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_copyfunc_type(copyfunc), ossl_check_ASN1_STRING_TABLE_freefunc_type(freefunc))) +#define sk_ASN1_STRING_TABLE_set_cmp_func(sk, cmp) ((sk_ASN1_STRING_TABLE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp))) + + +/* size limits: this stuff is taken straight from RFC2459 */ + +# define ub_name 32768 +# define ub_common_name 64 +# define ub_locality_name 128 +# define ub_state_name 128 +# define ub_organization_name 64 +# define ub_organization_unit_name 64 +# define ub_title 64 +# define ub_email_address 128 + +/* + * Declarations for template structures: for full definitions see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +/* Declare ASN1 functions: the implement macro in in asn1t.h */ + +/* + * The mysterious 'extern' that's passed to some macros is innocuous, + * and is there to quiet pre-C99 compilers that may complain about empty + * arguments in macro calls. + */ + +# define DECLARE_ASN1_FUNCTIONS_attr(attr, type) \ + DECLARE_ASN1_FUNCTIONS_name_attr(attr, type, type) +# define DECLARE_ASN1_FUNCTIONS(type) \ + DECLARE_ASN1_FUNCTIONS_attr(extern, type) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS_attr(attr, type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, type) +# define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_attr(extern, type) + +# define DECLARE_ASN1_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(attr, type, name) +# define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_FUNCTIONS_name_attr(extern, type, name) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS_attr(attr, type, itname, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(attr, type, name) \ + DECLARE_ASN1_ITEM_attr(attr, itname) +# define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_attr(extern, type, itname, name) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_attr(attr, type, name, name) +# define DECLARE_ASN1_ENCODE_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(extern, type, name) + +# define DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(attr, type, name) \ + attr type *d2i_##name(type **a, const unsigned char **in, long len); \ + attr int i2d_##name(const type *a, unsigned char **out); +# define DECLARE_ASN1_ENCODE_FUNCTIONS_only(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(extern, type, name) + +# define DECLARE_ASN1_NDEF_FUNCTION_attr(attr, name) \ + attr int i2d_##name##_NDEF(const name *a, unsigned char **out); +# define DECLARE_ASN1_NDEF_FUNCTION(name) \ + DECLARE_ASN1_NDEF_FUNCTION_attr(extern, name) + +# define DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, name) \ + attr type *name##_new(void); \ + attr void name##_free(type *a); +# define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(extern, type, name) + +# define DECLARE_ASN1_DUP_FUNCTION_attr(attr, type) \ + DECLARE_ASN1_DUP_FUNCTION_name_attr(attr, type, type) +# define DECLARE_ASN1_DUP_FUNCTION(type) \ + DECLARE_ASN1_DUP_FUNCTION_attr(extern, type) + +# define DECLARE_ASN1_DUP_FUNCTION_name_attr(attr, type, name) \ + attr type *name##_dup(const type *a); +# define DECLARE_ASN1_DUP_FUNCTION_name(type, name) \ + DECLARE_ASN1_DUP_FUNCTION_name_attr(extern, type, name) + +# define DECLARE_ASN1_PRINT_FUNCTION_attr(attr, stname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname_attr(attr, stname, stname) +# define DECLARE_ASN1_PRINT_FUNCTION(stname) \ + DECLARE_ASN1_PRINT_FUNCTION_attr(extern, stname) + +# define DECLARE_ASN1_PRINT_FUNCTION_fname_attr(attr, stname, fname) \ + attr int fname##_print_ctx(BIO *out, const stname *x, int indent, \ + const ASN1_PCTX *pctx); +# define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname_attr(extern, stname, fname) + +# define D2I_OF(type) type *(*)(type **,const unsigned char **,long) +# define I2D_OF(type) int (*)(const type *,unsigned char **) + +# define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) +# define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) +# define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) +# define CHECKED_PTR_OF(type, p) \ + ((void*) (1 ? p : (type*)0)) +# define CHECKED_PPTR_OF(type, p) \ + ((void**) (1 ? p : (type**)0)) + +# define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) +# define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(const type *,unsigned char **) +# define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) + +typedef void *d2i_of_void(void **, const unsigned char **, long); +typedef int i2d_of_void(const void *, unsigned char **); + +/*- + * The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + + +/* + * Platforms that can't easily handle shared global variables are declared as + * functions returning ASN1_ITEM pointers. + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM *ASN1_ITEM_EXP (void); + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +# define ASN1_ITEM_ptr(iptr) (iptr()) + +/* Macro to include ASN1_ITEM pointer from base type */ +# define ASN1_ITEM_ref(iptr) (iptr##_it) + +# define ASN1_ITEM_rptr(ref) (ref##_it()) + +# define DECLARE_ASN1_ITEM_attr(attr, name) \ + attr const ASN1_ITEM * name##_it(void); +# define DECLARE_ASN1_ITEM(name) \ + DECLARE_ASN1_ITEM_attr(extern, name) + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* + * These determine which characters to escape: RFC2253 special characters, + * control characters and MSB set characters + */ + +# define ASN1_STRFLGS_ESC_2253 1 +# define ASN1_STRFLGS_ESC_CTRL 2 +# define ASN1_STRFLGS_ESC_MSB 4 + +/* Lower 8 bits are reserved as an output type specifier */ +# define ASN1_DTFLGS_TYPE_MASK 0x0FUL +# define ASN1_DTFLGS_RFC822 0x00UL +# define ASN1_DTFLGS_ISO8601 0x01UL + +/* + * This flag determines how we do escaping: normally RC2253 backslash only, + * set this to use backslash and quote. + */ + +# define ASN1_STRFLGS_ESC_QUOTE 8 + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +# define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +# define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +# define CHARTYPE_LAST_ESC_2253 0x40 + +/* + * NB the internal flags are safely reused below by flags handled at the top + * level. + */ + +/* + * If this is set we convert all character strings to UTF8 first + */ + +# define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* + * If this is set we don't attempt to interpret content: just assume all + * strings are 1 byte per character. This will produce some pretty odd + * looking output! + */ + +# define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +# define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* + * This determines which strings to display and which to 'dump' (hex dump of + * content octets or DER encoding). We can only dump non character strings or + * everything. If we don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to the usual escaping + * options. + */ + +# define ASN1_STRFLGS_DUMP_ALL 0x80 +# define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* + * These determine what 'dumping' does, we can dump the content octets or the + * DER encoding: both use the RFC2253 #XXXXX notation. + */ + +# define ASN1_STRFLGS_DUMP_DER 0x200 + +/* + * This flag specifies that RC2254 escaping shall be performed. + */ +#define ASN1_STRFLGS_ESC_2254 0x400 + +/* + * All the string flags consistent with RFC2253, escaping control characters + * isn't essential in RFC2253 but it is advisable anyway. + */ + +# define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | \ + ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + ASN1_STRFLGS_UTF8_CONVERT | \ + ASN1_STRFLGS_DUMP_UNKNOWN | \ + ASN1_STRFLGS_DUMP_DER) + + +struct asn1_type_st { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING *asn1_string; + ASN1_OBJECT *object; + ASN1_INTEGER *integer; + ASN1_ENUMERATED *enumerated; + ASN1_BIT_STRING *bit_string; + ASN1_OCTET_STRING *octet_string; + ASN1_PRINTABLESTRING *printablestring; + ASN1_T61STRING *t61string; + ASN1_IA5STRING *ia5string; + ASN1_GENERALSTRING *generalstring; + ASN1_BMPSTRING *bmpstring; + ASN1_UNIVERSALSTRING *universalstring; + ASN1_UTCTIME *utctime; + ASN1_GENERALIZEDTIME *generalizedtime; + ASN1_VISIBLESTRING *visiblestring; + ASN1_UTF8STRING *utf8string; + /* + * set and sequence are left complete and still contain the set or + * sequence bytes + */ + ASN1_STRING *set; + ASN1_STRING *sequence; + ASN1_VALUE *asn1_value; + } value; +}; + +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_TYPE, ASN1_TYPE, ASN1_TYPE) +#define sk_ASN1_TYPE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_value(sk, idx) ((ASN1_TYPE *)OPENSSL_sk_value(ossl_check_const_ASN1_TYPE_sk_type(sk), (idx))) +#define sk_ASN1_TYPE_new(cmp) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new(ossl_check_ASN1_TYPE_compfunc_type(cmp))) +#define sk_ASN1_TYPE_new_null() ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_TYPE_new_reserve(cmp, n) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_TYPE_compfunc_type(cmp), (n))) +#define sk_ASN1_TYPE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_TYPE_sk_type(sk), (n)) +#define sk_ASN1_TYPE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_delete(sk, i) ((ASN1_TYPE *)OPENSSL_sk_delete(ossl_check_ASN1_TYPE_sk_type(sk), (i))) +#define sk_ASN1_TYPE_delete_ptr(sk, ptr) ((ASN1_TYPE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr))) +#define sk_ASN1_TYPE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_pop(sk) ((ASN1_TYPE *)OPENSSL_sk_pop(ossl_check_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_shift(sk) ((ASN1_TYPE *)OPENSSL_sk_shift(ossl_check_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_TYPE_sk_type(sk),ossl_check_ASN1_TYPE_freefunc_type(freefunc)) +#define sk_ASN1_TYPE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr), (idx)) +#define sk_ASN1_TYPE_set(sk, idx, ptr) ((ASN1_TYPE *)OPENSSL_sk_set(ossl_check_ASN1_TYPE_sk_type(sk), (idx), ossl_check_ASN1_TYPE_type(ptr))) +#define sk_ASN1_TYPE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr), pnum) +#define sk_ASN1_TYPE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_dup(sk) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_copyfunc_type(copyfunc), ossl_check_ASN1_TYPE_freefunc_type(freefunc))) +#define sk_ASN1_TYPE_set_cmp_func(sk, cmp) ((sk_ASN1_TYPE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_compfunc_type(cmp))) + + +typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; + +DECLARE_ASN1_ENCODE_FUNCTIONS_name(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY) +DECLARE_ASN1_ENCODE_FUNCTIONS_name(ASN1_SEQUENCE_ANY, ASN1_SET_ANY) + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + +# define B_ASN1_TIME \ + B_ASN1_UTCTIME | \ + B_ASN1_GENERALIZEDTIME + +# define B_ASN1_PRINTABLE \ + B_ASN1_NUMERICSTRING| \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_T61STRING| \ + B_ASN1_IA5STRING| \ + B_ASN1_BIT_STRING| \ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING|\ + B_ASN1_SEQUENCE|\ + B_ASN1_UNKNOWN + +# define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING| \ + B_ASN1_TELETEXSTRING|\ + B_ASN1_BMPSTRING|\ + B_ASN1_UNIVERSALSTRING|\ + B_ASN1_UTF8STRING + +# define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING| \ + B_ASN1_VISIBLESTRING| \ + B_ASN1_BMPSTRING|\ + B_ASN1_UTF8STRING + +DECLARE_ASN1_ALLOC_FUNCTIONS_name(ASN1_TYPE, ASN1_TYPE) +DECLARE_ASN1_ENCODE_FUNCTIONS(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(const ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); + +ASN1_TYPE *ASN1_TYPE_pack_sequence(const ASN1_ITEM *it, void *s, ASN1_TYPE **t); +void *ASN1_TYPE_unpack_sequence(const ASN1_ITEM *it, const ASN1_TYPE *t); + +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_OBJECT, ASN1_OBJECT, ASN1_OBJECT) +#define sk_ASN1_OBJECT_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_value(sk, idx) ((ASN1_OBJECT *)OPENSSL_sk_value(ossl_check_const_ASN1_OBJECT_sk_type(sk), (idx))) +#define sk_ASN1_OBJECT_new(cmp) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new(ossl_check_ASN1_OBJECT_compfunc_type(cmp))) +#define sk_ASN1_OBJECT_new_null() ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new_null()) +#define sk_ASN1_OBJECT_new_reserve(cmp, n) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_OBJECT_compfunc_type(cmp), (n))) +#define sk_ASN1_OBJECT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_OBJECT_sk_type(sk), (n)) +#define sk_ASN1_OBJECT_free(sk) OPENSSL_sk_free(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_delete(sk, i) ((ASN1_OBJECT *)OPENSSL_sk_delete(ossl_check_ASN1_OBJECT_sk_type(sk), (i))) +#define sk_ASN1_OBJECT_delete_ptr(sk, ptr) ((ASN1_OBJECT *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr))) +#define sk_ASN1_OBJECT_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_pop(sk) ((ASN1_OBJECT *)OPENSSL_sk_pop(ossl_check_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_shift(sk) ((ASN1_OBJECT *)OPENSSL_sk_shift(ossl_check_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_OBJECT_sk_type(sk),ossl_check_ASN1_OBJECT_freefunc_type(freefunc)) +#define sk_ASN1_OBJECT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr), (idx)) +#define sk_ASN1_OBJECT_set(sk, idx, ptr) ((ASN1_OBJECT *)OPENSSL_sk_set(ossl_check_ASN1_OBJECT_sk_type(sk), (idx), ossl_check_ASN1_OBJECT_type(ptr))) +#define sk_ASN1_OBJECT_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr), pnum) +#define sk_ASN1_OBJECT_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_dup(sk) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_dup(ossl_check_const_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_copyfunc_type(copyfunc), ossl_check_ASN1_OBJECT_freefunc_type(freefunc))) +#define sk_ASN1_OBJECT_set_cmp_func(sk, cmp) ((sk_ASN1_OBJECT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_compfunc_type(cmp))) + + +DECLARE_ASN1_FUNCTIONS(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +void ASN1_STRING_clear_free(ASN1_STRING *a); +int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); +DECLARE_ASN1_DUP_FUNCTION(ASN1_STRING) +ASN1_STRING *ASN1_STRING_type_new(int type); +int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); + /* + * Since this is used to store all sorts of things, via macros, for now, + * make its data void * + */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); +int ASN1_STRING_length(const ASN1_STRING *x); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void ASN1_STRING_length_set(ASN1_STRING *x, int n); +# endif +int ASN1_STRING_type(const ASN1_STRING *x); +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 unsigned char *ASN1_STRING_data(ASN1_STRING *x); +# endif +const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a, + const unsigned char *flags, int flags_len); + +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +int ASN1_BIT_STRING_num_asc(const char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, const char *name, int value, + BIT_STRING_BITNAME *tbl); + +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_INTEGER, ASN1_INTEGER, ASN1_INTEGER) +#define sk_ASN1_INTEGER_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_value(sk, idx) ((ASN1_INTEGER *)OPENSSL_sk_value(ossl_check_const_ASN1_INTEGER_sk_type(sk), (idx))) +#define sk_ASN1_INTEGER_new(cmp) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new(ossl_check_ASN1_INTEGER_compfunc_type(cmp))) +#define sk_ASN1_INTEGER_new_null() ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new_null()) +#define sk_ASN1_INTEGER_new_reserve(cmp, n) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_INTEGER_compfunc_type(cmp), (n))) +#define sk_ASN1_INTEGER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_INTEGER_sk_type(sk), (n)) +#define sk_ASN1_INTEGER_free(sk) OPENSSL_sk_free(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_delete(sk, i) ((ASN1_INTEGER *)OPENSSL_sk_delete(ossl_check_ASN1_INTEGER_sk_type(sk), (i))) +#define sk_ASN1_INTEGER_delete_ptr(sk, ptr) ((ASN1_INTEGER *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr))) +#define sk_ASN1_INTEGER_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_pop(sk) ((ASN1_INTEGER *)OPENSSL_sk_pop(ossl_check_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_shift(sk) ((ASN1_INTEGER *)OPENSSL_sk_shift(ossl_check_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_INTEGER_sk_type(sk),ossl_check_ASN1_INTEGER_freefunc_type(freefunc)) +#define sk_ASN1_INTEGER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr), (idx)) +#define sk_ASN1_INTEGER_set(sk, idx, ptr) ((ASN1_INTEGER *)OPENSSL_sk_set(ossl_check_ASN1_INTEGER_sk_type(sk), (idx), ossl_check_ASN1_INTEGER_type(ptr))) +#define sk_ASN1_INTEGER_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr), pnum) +#define sk_ASN1_INTEGER_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_dup(sk) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_dup(ossl_check_const_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_copyfunc_type(copyfunc), ossl_check_ASN1_INTEGER_freefunc_type(freefunc))) +#define sk_ASN1_INTEGER_set_cmp_func(sk, cmp) ((sk_ASN1_INTEGER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_compfunc_type(cmp))) + + + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +DECLARE_ASN1_DUP_FUNCTION(ASN1_INTEGER) +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); + +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, + long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); + +int ASN1_TIME_diff(int *pday, int *psec, + const ASN1_TIME *from, const ASN1_TIME *to); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +DECLARE_ASN1_DUP_FUNCTION(ASN1_OCTET_STRING) +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_UTF8STRING, ASN1_UTF8STRING, ASN1_UTF8STRING) +#define sk_ASN1_UTF8STRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_value(sk, idx) ((ASN1_UTF8STRING *)OPENSSL_sk_value(ossl_check_const_ASN1_UTF8STRING_sk_type(sk), (idx))) +#define sk_ASN1_UTF8STRING_new(cmp) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new(ossl_check_ASN1_UTF8STRING_compfunc_type(cmp))) +#define sk_ASN1_UTF8STRING_new_null() ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_UTF8STRING_new_reserve(cmp, n) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_UTF8STRING_compfunc_type(cmp), (n))) +#define sk_ASN1_UTF8STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_UTF8STRING_sk_type(sk), (n)) +#define sk_ASN1_UTF8STRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_delete(sk, i) ((ASN1_UTF8STRING *)OPENSSL_sk_delete(ossl_check_ASN1_UTF8STRING_sk_type(sk), (i))) +#define sk_ASN1_UTF8STRING_delete_ptr(sk, ptr) ((ASN1_UTF8STRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr))) +#define sk_ASN1_UTF8STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_pop(sk) ((ASN1_UTF8STRING *)OPENSSL_sk_pop(ossl_check_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_shift(sk) ((ASN1_UTF8STRING *)OPENSSL_sk_shift(ossl_check_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_UTF8STRING_sk_type(sk),ossl_check_ASN1_UTF8STRING_freefunc_type(freefunc)) +#define sk_ASN1_UTF8STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr), (idx)) +#define sk_ASN1_UTF8STRING_set(sk, idx, ptr) ((ASN1_UTF8STRING *)OPENSSL_sk_set(ossl_check_ASN1_UTF8STRING_sk_type(sk), (idx), ossl_check_ASN1_UTF8STRING_type(ptr))) +#define sk_ASN1_UTF8STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr), pnum) +#define sk_ASN1_UTF8STRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_dup(sk) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_copyfunc_type(copyfunc), ossl_check_ASN1_UTF8STRING_freefunc_type(freefunc))) +#define sk_ASN1_UTF8STRING_set_cmp_func(sk, cmp) ((sk_ASN1_UTF8STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_compfunc_type(cmp))) + + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_GENERALSTRING, ASN1_GENERALSTRING, ASN1_GENERALSTRING) +#define sk_ASN1_GENERALSTRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_value(sk, idx) ((ASN1_GENERALSTRING *)OPENSSL_sk_value(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk), (idx))) +#define sk_ASN1_GENERALSTRING_new(cmp) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new(ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp))) +#define sk_ASN1_GENERALSTRING_new_null() ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_GENERALSTRING_new_reserve(cmp, n) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp), (n))) +#define sk_ASN1_GENERALSTRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (n)) +#define sk_ASN1_GENERALSTRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_delete(sk, i) ((ASN1_GENERALSTRING *)OPENSSL_sk_delete(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (i))) +#define sk_ASN1_GENERALSTRING_delete_ptr(sk, ptr) ((ASN1_GENERALSTRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr))) +#define sk_ASN1_GENERALSTRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_pop(sk) ((ASN1_GENERALSTRING *)OPENSSL_sk_pop(ossl_check_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_shift(sk) ((ASN1_GENERALSTRING *)OPENSSL_sk_shift(ossl_check_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_GENERALSTRING_sk_type(sk),ossl_check_ASN1_GENERALSTRING_freefunc_type(freefunc)) +#define sk_ASN1_GENERALSTRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr), (idx)) +#define sk_ASN1_GENERALSTRING_set(sk, idx, ptr) ((ASN1_GENERALSTRING *)OPENSSL_sk_set(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (idx), ossl_check_ASN1_GENERALSTRING_type(ptr))) +#define sk_ASN1_GENERALSTRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr), pnum) +#define sk_ASN1_GENERALSTRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_dup(sk) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_copyfunc_type(copyfunc), ossl_check_ASN1_GENERALSTRING_freefunc_type(freefunc))) +#define sk_ASN1_GENERALSTRING_set_cmp_func(sk, cmp) ((sk_ASN1_GENERALSTRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp))) + + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_DUP_FUNCTION(ASN1_TIME) +DECLARE_ASN1_DUP_FUNCTION(ASN1_UTCTIME) +DECLARE_ASN1_DUP_FUNCTION(ASN1_GENERALIZEDTIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_TIME_check(const ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t, + ASN1_GENERALIZEDTIME **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); +int ASN1_TIME_set_string_X509(ASN1_TIME *s, const char *str); +int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm); +int ASN1_TIME_normalize(ASN1_TIME *s); +int ASN1_TIME_cmp_time_t(const ASN1_TIME *s, time_t t); +int ASN1_TIME_compare(const ASN1_TIME *a, const ASN1_TIME *b); + +int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type); +int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_get_int64(int64_t *pr, const ASN1_INTEGER *a); +int ASN1_INTEGER_set_int64(ASN1_INTEGER *a, int64_t r); +int ASN1_INTEGER_get_uint64(uint64_t *pr, const ASN1_INTEGER *a); +int ASN1_INTEGER_set_uint64(ASN1_INTEGER *a, uint64_t r); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(const ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); + +int ASN1_ENUMERATED_get_int64(int64_t *pr, const ASN1_ENUMERATED *a); +int ASN1_ENUMERATED_set_int64(ASN1_ENUMERATED *a, int64_t r); + + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(const ASN1_ENUMERATED *ai, BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +unsigned long ASN1_tag2bit(int tag); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p, long len); +int ASN1_const_check_infinite_end(const unsigned char **p, long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, + int tag, int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, const void *x); + +# define ASN1_dup_of(type,i2d,d2i,x) \ + ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +void *ASN1_item_dup(const ASN1_ITEM *it, const void *x); +int ASN1_item_sign_ex(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + const void *data, const ASN1_OCTET_STRING *id, + EVP_PKEY *pkey, const EVP_MD *md, OSSL_LIB_CTX *libctx, + const char *propq); +int ASN1_item_verify_ex(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + const ASN1_OCTET_STRING *id, EVP_PKEY *pkey, + OSSL_LIB_CTX *libctx, const char *propq); + +/* ASN1 alloc/free macros for when a type is only used internally */ + +# define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) +# define M_ASN1_free_of(x, type) \ + ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) + +# ifndef OPENSSL_NO_STDIO +void *ASN1_d2i_fp(void *(*xnew) (void), d2i_of_void *d2i, FILE *in, void **x); + +# define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp_ex(const ASN1_ITEM *it, FILE *in, void *x, + OSSL_LIB_CTX *libctx, const char *propq); +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, const void *x); + +# define ASN1_i2d_fp_of(type,i2d,out,x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, const void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str, unsigned long flags); +# endif + +int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in); + +void *ASN1_d2i_bio(void *(*xnew) (void), d2i_of_void *d2i, BIO *in, void **x); + +# define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ + ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio_ex(const ASN1_ITEM *it, BIO *in, void *pval, + OSSL_LIB_CTX *libctx, const char *propq); +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *pval); +int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, const void *x); + +# define ASN1_i2d_bio_of(type,i2d,out,x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, const void *x); +BIO *ASN1_item_i2d_mem_bio(const ASN1_ITEM *it, const ASN1_VALUE *val); +int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm); +int ASN1_TIME_print_ex(BIO *bp, const ASN1_TIME *tm, unsigned long flags); +int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags); +int ASN1_buf_print(BIO *bp, const unsigned char *buf, size_t buflen, int off); +int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, + unsigned char *buf, int off); +int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); +int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, + int dump); +const char *ASN1_tag2str(int tag); + +/* Used to load and write Netscape format cert */ + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(const ASN1_TYPE *a, unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, + unsigned char *data, int len); +int ASN1_TYPE_get_int_octetstring(const ASN1_TYPE *a, long *num, + unsigned char *data, int max_len); + +void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it); + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, + ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(const char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, + long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, + int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_new_ex(const ASN1_ITEM *it, OSSL_LIB_CTX *libctx, + const char *propq); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_d2i_ex(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it); +int ASN1_item_i2d(const ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(const ASN1_VALUE *val, unsigned char **out, + const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); +void ASN1_add_stable_module(void); + +ASN1_TYPE *ASN1_generate_nconf(const char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf); +int ASN1_str2mask(const char *str, unsigned long *pmask); + +/* ASN1 Print flags */ + +/* Indicate missing OPTIONAL fields */ +# define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 +/* Mark start and end of SEQUENCE */ +# define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 +/* Mark start and end of SEQUENCE/SET OF */ +# define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 +/* Show the ASN1 type of primitives */ +# define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 +/* Don't show ASN1 type of ANY */ +# define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 +/* Don't show ASN1 type of MSTRINGs */ +# define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 +/* Don't show field names in SEQUENCE */ +# define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 +/* Show structure names of each SEQUENCE field */ +# define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 +/* Don't show structure name even at top level */ +# define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 + +int ASN1_item_print(BIO *out, const ASN1_VALUE *ifld, int indent, + const ASN1_ITEM *it, const ASN1_PCTX *pctx); +ASN1_PCTX *ASN1_PCTX_new(void); +void ASN1_PCTX_free(ASN1_PCTX *p); +unsigned long ASN1_PCTX_get_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +ASN1_SCTX *ASN1_SCTX_new(int (*scan_cb) (ASN1_SCTX *ctx)); +void ASN1_SCTX_free(ASN1_SCTX *p); +const ASN1_ITEM *ASN1_SCTX_get_item(ASN1_SCTX *p); +const ASN1_TEMPLATE *ASN1_SCTX_get_template(ASN1_SCTX *p); +unsigned long ASN1_SCTX_get_flags(ASN1_SCTX *p); +void ASN1_SCTX_set_app_data(ASN1_SCTX *p, void *data); +void *ASN1_SCTX_get_app_data(ASN1_SCTX *p); + +const BIO_METHOD *BIO_f_asn1(void); + +/* cannot constify val because of CMS_stream() */ +BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); + +int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const ASN1_ITEM *it); +int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const char *hdr, const ASN1_ITEM *it); +/* cannot constify val because of CMS_dataFinal() */ +int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it); +int SMIME_write_ASN1_ex(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); +ASN1_VALUE *SMIME_read_ASN1_ex(BIO *bio, int flags, BIO **bcont, + const ASN1_ITEM *it, ASN1_VALUE **x, + OSSL_LIB_CTX *libctx, const char *propq); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +const ASN1_ITEM *ASN1_ITEM_lookup(const char *name); +const ASN1_ITEM *ASN1_ITEM_get(size_t i); + +/* Legacy compatibility */ +# define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) +# define DECLARE_ASN1_FUNCTIONS_const(type) DECLARE_ASN1_FUNCTIONS(type) +# define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name) +# define I2D_OF_const(type) I2D_OF(type) +# define ASN1_dup_of_const(type,i2d,d2i,x) ASN1_dup_of(type,i2d,d2i,x) +# define ASN1_i2d_fp_of_const(type,i2d,out,x) ASN1_i2d_fp_of(type,i2d,out,x) +# define ASN1_i2d_bio_of_const(type,i2d,out,x) ASN1_i2d_bio_of(type,i2d,out,x) + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/asn1_mac.h b/OtherInc/openssl/include/openssl/asn1_mac.h new file mode 100644 index 0000000..fdcb983 --- /dev/null +++ b/OtherInc/openssl/include/openssl/asn1_mac.h @@ -0,0 +1,10 @@ +/* + * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#error "This file is obsolete; please update your software." diff --git a/OtherInc/openssl/include/openssl/asn1err.h b/OtherInc/openssl/include/openssl/asn1err.h new file mode 100644 index 0000000..d427622 --- /dev/null +++ b/OtherInc/openssl/include/openssl/asn1err.h @@ -0,0 +1,140 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_ASN1ERR_H +# define OPENSSL_ASN1ERR_H +# pragma once + +# include +# include +# include + + + +/* + * ASN1 reason codes. + */ +# define ASN1_R_ADDING_OBJECT 171 +# define ASN1_R_ASN1_PARSE_ERROR 203 +# define ASN1_R_ASN1_SIG_PARSE_ERROR 204 +# define ASN1_R_AUX_ERROR 100 +# define ASN1_R_BAD_OBJECT_HEADER 102 +# define ASN1_R_BAD_TEMPLATE 230 +# define ASN1_R_BMPSTRING_IS_WRONG_LENGTH 214 +# define ASN1_R_BN_LIB 105 +# define ASN1_R_BOOLEAN_IS_WRONG_LENGTH 106 +# define ASN1_R_BUFFER_TOO_SMALL 107 +# define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 108 +# define ASN1_R_CONTEXT_NOT_INITIALISED 217 +# define ASN1_R_DATA_IS_WRONG 109 +# define ASN1_R_DECODE_ERROR 110 +# define ASN1_R_DEPTH_EXCEEDED 174 +# define ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED 198 +# define ASN1_R_ENCODE_ERROR 112 +# define ASN1_R_ERROR_GETTING_TIME 173 +# define ASN1_R_ERROR_LOADING_SECTION 172 +# define ASN1_R_ERROR_SETTING_CIPHER_PARAMS 114 +# define ASN1_R_EXPECTING_AN_INTEGER 115 +# define ASN1_R_EXPECTING_AN_OBJECT 116 +# define ASN1_R_EXPLICIT_LENGTH_MISMATCH 119 +# define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED 120 +# define ASN1_R_FIELD_MISSING 121 +# define ASN1_R_FIRST_NUM_TOO_LARGE 122 +# define ASN1_R_HEADER_TOO_LONG 123 +# define ASN1_R_ILLEGAL_BITSTRING_FORMAT 175 +# define ASN1_R_ILLEGAL_BOOLEAN 176 +# define ASN1_R_ILLEGAL_CHARACTERS 124 +# define ASN1_R_ILLEGAL_FORMAT 177 +# define ASN1_R_ILLEGAL_HEX 178 +# define ASN1_R_ILLEGAL_IMPLICIT_TAG 179 +# define ASN1_R_ILLEGAL_INTEGER 180 +# define ASN1_R_ILLEGAL_NEGATIVE_VALUE 226 +# define ASN1_R_ILLEGAL_NESTED_TAGGING 181 +# define ASN1_R_ILLEGAL_NULL 125 +# define ASN1_R_ILLEGAL_NULL_VALUE 182 +# define ASN1_R_ILLEGAL_OBJECT 183 +# define ASN1_R_ILLEGAL_OPTIONAL_ANY 126 +# define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE 170 +# define ASN1_R_ILLEGAL_PADDING 221 +# define ASN1_R_ILLEGAL_TAGGED_ANY 127 +# define ASN1_R_ILLEGAL_TIME_VALUE 184 +# define ASN1_R_ILLEGAL_ZERO_CONTENT 222 +# define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 +# define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 +# define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 +# define ASN1_R_INVALID_BMPSTRING_LENGTH 129 +# define ASN1_R_INVALID_DIGIT 130 +# define ASN1_R_INVALID_MIME_TYPE 205 +# define ASN1_R_INVALID_MODIFIER 186 +# define ASN1_R_INVALID_NUMBER 187 +# define ASN1_R_INVALID_OBJECT_ENCODING 216 +# define ASN1_R_INVALID_SCRYPT_PARAMETERS 227 +# define ASN1_R_INVALID_SEPARATOR 131 +# define ASN1_R_INVALID_STRING_TABLE_VALUE 218 +# define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH 133 +# define ASN1_R_INVALID_UTF8STRING 134 +# define ASN1_R_INVALID_VALUE 219 +# define ASN1_R_LENGTH_TOO_LONG 231 +# define ASN1_R_LIST_ERROR 188 +# define ASN1_R_MIME_NO_CONTENT_TYPE 206 +# define ASN1_R_MIME_PARSE_ERROR 207 +# define ASN1_R_MIME_SIG_PARSE_ERROR 208 +# define ASN1_R_MISSING_EOC 137 +# define ASN1_R_MISSING_SECOND_NUMBER 138 +# define ASN1_R_MISSING_VALUE 189 +# define ASN1_R_MSTRING_NOT_UNIVERSAL 139 +# define ASN1_R_MSTRING_WRONG_TAG 140 +# define ASN1_R_NESTED_ASN1_STRING 197 +# define ASN1_R_NESTED_TOO_DEEP 201 +# define ASN1_R_NON_HEX_CHARACTERS 141 +# define ASN1_R_NOT_ASCII_FORMAT 190 +# define ASN1_R_NOT_ENOUGH_DATA 142 +# define ASN1_R_NO_CONTENT_TYPE 209 +# define ASN1_R_NO_MATCHING_CHOICE_TYPE 143 +# define ASN1_R_NO_MULTIPART_BODY_FAILURE 210 +# define ASN1_R_NO_MULTIPART_BOUNDARY 211 +# define ASN1_R_NO_SIG_CONTENT_TYPE 212 +# define ASN1_R_NULL_IS_WRONG_LENGTH 144 +# define ASN1_R_OBJECT_NOT_ASCII_FORMAT 191 +# define ASN1_R_ODD_NUMBER_OF_CHARS 145 +# define ASN1_R_SECOND_NUMBER_TOO_LARGE 147 +# define ASN1_R_SEQUENCE_LENGTH_MISMATCH 148 +# define ASN1_R_SEQUENCE_NOT_CONSTRUCTED 149 +# define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG 192 +# define ASN1_R_SHORT_LINE 150 +# define ASN1_R_SIG_INVALID_MIME_TYPE 213 +# define ASN1_R_STREAMING_NOT_SUPPORTED 202 +# define ASN1_R_STRING_TOO_LONG 151 +# define ASN1_R_STRING_TOO_SHORT 152 +# define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154 +# define ASN1_R_TIME_NOT_ASCII_FORMAT 193 +# define ASN1_R_TOO_LARGE 223 +# define ASN1_R_TOO_LONG 155 +# define ASN1_R_TOO_SMALL 224 +# define ASN1_R_TYPE_NOT_CONSTRUCTED 156 +# define ASN1_R_TYPE_NOT_PRIMITIVE 195 +# define ASN1_R_UNEXPECTED_EOC 159 +# define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH 215 +# define ASN1_R_UNKNOWN_DIGEST 229 +# define ASN1_R_UNKNOWN_FORMAT 160 +# define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM 161 +# define ASN1_R_UNKNOWN_OBJECT_TYPE 162 +# define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE 163 +# define ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM 199 +# define ASN1_R_UNKNOWN_TAG 194 +# define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE 164 +# define ASN1_R_UNSUPPORTED_CIPHER 228 +# define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE 167 +# define ASN1_R_UNSUPPORTED_TYPE 196 +# define ASN1_R_WRONG_INTEGER_TYPE 225 +# define ASN1_R_WRONG_PUBLIC_KEY_TYPE 200 +# define ASN1_R_WRONG_TAG 168 + +#endif diff --git a/OtherInc/openssl/include/openssl/asn1t.h b/OtherInc/openssl/include/openssl/asn1t.h new file mode 100644 index 0000000..a725c53 --- /dev/null +++ b/OtherInc/openssl/include/openssl/asn1t.h @@ -0,0 +1,946 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\asn1t.h.in + * + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_ASN1T_H +# define OPENSSL_ASN1T_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_ASN1T_H +# endif + +# include +# include +# include + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * These are the possible values for the itype field of the + * ASN1_ITEM structure and determine how it is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application-specific + * data and functions. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +# define ASN1_ITYPE_PRIMITIVE 0x0 +# define ASN1_ITYPE_SEQUENCE 0x1 +# define ASN1_ITYPE_CHOICE 0x2 +/* unused value 0x3 */ +# define ASN1_ITYPE_EXTERN 0x4 +# define ASN1_ITYPE_MSTRING 0x5 +# define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +# define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)((iptr)())) + +/* Macros for start and end of ASN1_ITEM definition */ + +# define ASN1_ITEM_start(itname) \ + const ASN1_ITEM * itname##_it(void) \ + { \ + static const ASN1_ITEM local_it = { + +# define static_ASN1_ITEM_start(itname) \ + static ASN1_ITEM_start(itname) + +# define ASN1_ITEM_end(itname) \ + }; \ + return &local_it; \ + } + +/* Macros to aid ASN1 template writing */ + +# define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +# define ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE,\ + -1,\ + &tname##_item_tt,\ + 0,\ + NULL,\ + 0,\ + #tname \ + ASN1_ITEM_end(tname) +# define static_ASN1_ITEM_TEMPLATE_END(tname) \ + ;\ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE,\ + -1,\ + &tname##_item_tt,\ + 0,\ + NULL,\ + 0,\ + #tname \ + ASN1_ITEM_end(tname) + +/* This is a ASN1 type which just embeds a template */ + +/*- + * This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +# define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +# define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +# define static_ASN1_SEQUENCE_END(stname) static_ASN1_SEQUENCE_END_name(stname, stname) + +# define ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #tname \ + ASN1_ITEM_end(tname) + +# define static_ASN1_SEQUENCE_END_name(stname, tname) \ + ;\ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ + ASN1_SEQUENCE_cb(tname, cb) + +# define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0, NULL}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_const_cb(tname, const_cb) \ + static const ASN1_AUX tname##_aux = \ + {NULL, ASN1_AFLG_CONST_CB, 0, 0, NULL, 0, const_cb}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_cb_const_cb(tname, cb, const_cb) \ + static const ASN1_AUX tname##_aux = \ + {NULL, ASN1_AFLG_CONST_CB, 0, 0, cb, 0, const_cb}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_ref(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), offsetof(tname, lock), cb, 0, NULL}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc), NULL}; \ + ASN1_SEQUENCE(tname) + +# define ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(tname),\ + #tname \ + ASN1_ITEM_end(tname) +# define static_ASN1_NDEF_SEQUENCE_END(tname) \ + ;\ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(tname),\ + #tname \ + ASN1_ITEM_end(tname) + + +# define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) +# define static_ASN1_SEQUENCE_END_cb(stname, tname) static_ASN1_SEQUENCE_END_ref(stname, tname) + +# define ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #tname \ + ASN1_ITEM_end(tname) +# define static_ASN1_SEQUENCE_END_ref(stname, tname) \ + ;\ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE,\ + V_ASN1_SEQUENCE,\ + tname##_seq_tt,\ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/*- + * This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +# define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +# define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0, NULL}; \ + ASN1_CHOICE(tname) + +# define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +# define static_ASN1_CHOICE_END(stname) static_ASN1_CHOICE_END_name(stname, stname) + +# define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +# define static_ASN1_CHOICE_END_name(stname, tname) static_ASN1_CHOICE_END_selector(stname, tname, type) + +# define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define static_ASN1_CHOICE_END_selector(stname, tname, selname) \ + ;\ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + NULL,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +# define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ;\ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE,\ + offsetof(stname,selname) ,\ + tname##_ch_tt,\ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\ + &tname##_aux,\ + sizeof(stname),\ + #stname \ + ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +# define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0,\ + #name, ASN1_ITEM_ref(type) } + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +# define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field),\ + #field, ASN1_ITEM_ref(type) } + +/* implicit and explicit helper macros */ + +# define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | (ex), tag, stname, field, type) + +# define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | (ex), tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +# define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } +# define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } + +/* Plain simple type */ +# define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type) +/* Embedded simple type */ +# define ASN1_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_EMBED,0, stname, field, type) + +/* OPTIONAL simple type */ +# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) +# define ASN1_OPT_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) +# define ASN1_IMP_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) + +/* IMPLICIT tagged OPTIONAL simple type */ +# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) +# define ASN1_IMP_OPT_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED) + +/* Same as above but EXPLICIT */ + +# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +# define ASN1_EXP_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) +# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) +# define ASN1_EXP_OPT_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED) + +/* SEQUENCE OF type */ +# define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +# define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +# define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +# define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +# define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +# define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +# define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +# define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL) + +/* EXPLICIT using indefinite length constructed form */ +# define ASN1_NDEF_EXP(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +# define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +# define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + +# define ASN1_ADB_END(name, flags, field, adb_cb, def, none) \ + ;\ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = \ + {\ + flags,\ + offsetof(name, field),\ + adb_cb,\ + name##_adbtbl,\ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\ + def,\ + none\ + }; \ + return (const ASN1_ITEM *) &internal_adb; \ + } \ + void dummy_function(void) + +# define ADB_ENTRY(val, template) {val, template} + +# define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +/* + * This is the ASN1 template structure that defines a wrapper round the + * actual type. It determines the actual position of the field in the value + * structure, various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { + unsigned long flags; /* Various flags */ + long tag; /* tag, not used if no tagging */ + unsigned long offset; /* Offset of this field in structure */ + const char *field_name; /* Field name */ + ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +# define ASN1_TEMPLATE_item(t) (t->item_ptr) +# define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + int (*adb_cb)(long *psel); /* Application callback */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +# define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +# define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +# define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* + * Special case: this refers to a SET OF that will be sorted into DER order + * when encoded *and* the corresponding STACK will be modified to match the + * new order. + */ +# define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +# define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* + * These flags mean the tag should be taken from the tag field. If EXPLICIT + * then the underlying type is used for the inner tag. + */ + +/* IMPLICIT tagging */ +# define ASN1_TFLG_IMPTAG (0x1 << 3) + +/* EXPLICIT tagging, inner tag from underlying type */ +# define ASN1_TFLG_EXPTAG (0x2 << 3) + +# define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +# define ASN1_TFLG_IMPLICIT (ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT) + +/* context specific EXPLICIT */ +# define ASN1_TFLG_EXPLICIT (ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT) + +/* + * If tagging is in force these determine the type of tag to use. Otherwise + * the tag is determined by the underlying type. These values reflect the + * actual octet format. + */ + +/* Universal tag */ +# define ASN1_TFLG_UNIVERSAL (0x0<<6) +/* Application tag */ +# define ASN1_TFLG_APPLICATION (0x1<<6) +/* Context specific tag */ +# define ASN1_TFLG_CONTEXT (0x2<<6) +/* Private tag */ +# define ASN1_TFLG_PRIVATE (0x3<<6) + +# define ASN1_TFLG_TAG_CLASS (0x3<<6) + +/* + * These are for ANY DEFINED BY type. In this case the 'item' field points to + * an ASN1_ADB structure which contains a table of values to decode the + * relevant type + */ + +# define ASN1_TFLG_ADB_MASK (0x3<<8) + +# define ASN1_TFLG_ADB_OID (0x1<<8) + +# define ASN1_TFLG_ADB_INT (0x1<<9) + +/* + * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes + * indefinite length constructed encoding to be used if required. + */ + +# define ASN1_TFLG_NDEF (0x1<<11) + +/* Field is embedded and not a pointer */ +# define ASN1_TFLG_EMBED (0x1 << 12) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { + char itype; /* The item type, primitive, SEQUENCE, CHOICE + * or extern */ + long utype; /* underlying type */ + const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains + * the contents */ + long tcount; /* Number of templates if SEQUENCE or CHOICE */ + const void *funcs; /* further data and type-specific functions */ + /* funcs can be ASN1_PRIMITIVE_FUNCS*, ASN1_EXTERN_FUNCS*, or ASN1_AUX* */ + long size; /* Structure size (usually) */ + const char *sname; /* Structure name */ +}; + +/* + * Cache for ASN1 tag and length, so we don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st { + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +typedef int ASN1_ex_d2i_ex(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx, OSSL_LIB_CTX *libctx, + const char *propq); +typedef int ASN1_ex_i2d(const ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef int ASN1_ex_new_ex_func(ASN1_VALUE **pval, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_ex_print_func(BIO *out, const ASN1_VALUE **pval, + int indent, const char *fname, + const ASN1_PCTX *pctx); + +typedef int ASN1_primitive_i2c(const ASN1_VALUE **pval, unsigned char *cont, + int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, + int len, int utype, char *free_cont, + const ASN1_ITEM *it); +typedef int ASN1_primitive_print(BIO *out, const ASN1_VALUE **pval, + const ASN1_ITEM *it, int indent, + const ASN1_PCTX *pctx); + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; + ASN1_ex_print_func *asn1_ex_print; + ASN1_ex_new_ex_func *asn1_ex_new_ex; + ASN1_ex_d2i_ex *asn1_ex_d2i_ex; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; + ASN1_primitive_print *prim_print; +} ASN1_PRIMITIVE_FUNCS; + +/* + * This is the ASN1_AUX structure: it handles various miscellaneous + * requirements. For example the use of reference counts and an informational + * callback. The "informational callback" is called at various points during + * the ASN1 encoding and decoding. It can be used to provide minor + * customisation of the structures used. This is most useful where the + * supplied routines *almost* do the right thing but need some extra help at + * a few points. If the callback returns zero then it is assumed a fatal + * error has occurred and the main operation should be abandoned. If major + * changes in the default behaviour are required then an external type is + * more appropriate. + * For the operations ASN1_OP_I2D_PRE, ASN1_OP_I2D_POST, ASN1_OP_PRINT_PRE, and + * ASN1_OP_PRINT_POST, meanwhile a variant of the callback with const parameter + * 'in' is provided to make clear statically that its input is not modified. If + * and only if this variant is in use the flag ASN1_AFLG_CONST_CB must be set. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, + void *exarg); +typedef int ASN1_aux_const_cb(int operation, const ASN1_VALUE **in, + const ASN1_ITEM *it, void *exarg); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Offset of lock value */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ + ASN1_aux_const_cb *asn1_const_cb; /* for ASN1_OP_I2D_ and ASN1_OP_PRINT_ */ +} ASN1_AUX; + +/* For print related callbacks exarg points to this structure */ +typedef struct ASN1_PRINT_ARG_st { + BIO *out; + int indent; + const ASN1_PCTX *pctx; +} ASN1_PRINT_ARG; + +/* For streaming related callbacks exarg points to this structure */ +typedef struct ASN1_STREAM_ARG_st { + /* BIO to stream through */ + BIO *out; + /* BIO with filters appended */ + BIO *ndef_bio; + /* Streaming I/O boundary */ + unsigned char **boundary; +} ASN1_STREAM_ARG; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +# define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +# define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +# define ASN1_AFLG_BROKEN 4 +/* Use the new asn1_const_cb */ +# define ASN1_AFLG_CONST_CB 8 + +/* operation values for asn1_cb */ + +# define ASN1_OP_NEW_PRE 0 +# define ASN1_OP_NEW_POST 1 +# define ASN1_OP_FREE_PRE 2 +# define ASN1_OP_FREE_POST 3 +# define ASN1_OP_D2I_PRE 4 +# define ASN1_OP_D2I_POST 5 +# define ASN1_OP_I2D_PRE 6 +# define ASN1_OP_I2D_POST 7 +# define ASN1_OP_PRINT_PRE 8 +# define ASN1_OP_PRINT_POST 9 +# define ASN1_OP_STREAM_PRE 10 +# define ASN1_OP_STREAM_POST 11 +# define ASN1_OP_DETACHED_PRE 12 +# define ASN1_OP_DETACHED_POST 13 +# define ASN1_OP_DUP_PRE 14 +# define ASN1_OP_DUP_POST 15 +# define ASN1_OP_GET0_LIBCTX 16 +# define ASN1_OP_GET0_PROPQ 17 + +/* Macro to implement a primitive type */ +# define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +# define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \ + ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +# define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \ + ASN1_ITEM_end(itname) + +# define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname \ + ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +# define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +# define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +# define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ + pre stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + pre void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +# define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((const ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\ + } + +# define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((const ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\ + } + +# define IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(stname) \ + static stname *d2i_##stname(stname **a, \ + const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, \ + ASN1_ITEM_rptr(stname)); \ + } \ + static int i2d_##stname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((const ASN1_VALUE *)a, out, \ + ASN1_ITEM_rptr(stname)); \ + } + +# define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname * stname##_dup(const stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +# define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ + IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) + +# define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ + int fname##_print_ctx(BIO *out, const stname *x, int indent, \ + const ASN1_PCTX *pctx) \ + { \ + return ASN1_item_print(out, (const ASN1_VALUE *)x, indent, \ + ASN1_ITEM_rptr(itname), pctx); \ + } + +/* external definitions for primitive types */ + +DECLARE_ASN1_ITEM(ASN1_BOOLEAN) +DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_SEQUENCE) +DECLARE_ASN1_ITEM(CBIGNUM) +DECLARE_ASN1_ITEM(BIGNUM) +DECLARE_ASN1_ITEM(INT32) +DECLARE_ASN1_ITEM(ZINT32) +DECLARE_ASN1_ITEM(UINT32) +DECLARE_ASN1_ITEM(ZUINT32) +DECLARE_ASN1_ITEM(INT64) +DECLARE_ASN1_ITEM(ZINT64) +DECLARE_ASN1_ITEM(UINT64) +DECLARE_ASN1_ITEM(ZUINT64) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* + * LONG and ZLONG are strongly discouraged for use as stored data, as the + * underlying C type (long) differs in size depending on the architecture. + * They are designed with 32-bit longs in mind. + */ +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) +# endif + +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_VALUE, ASN1_VALUE, ASN1_VALUE) +#define sk_ASN1_VALUE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_value(sk, idx) ((ASN1_VALUE *)OPENSSL_sk_value(ossl_check_const_ASN1_VALUE_sk_type(sk), (idx))) +#define sk_ASN1_VALUE_new(cmp) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new(ossl_check_ASN1_VALUE_compfunc_type(cmp))) +#define sk_ASN1_VALUE_new_null() ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_VALUE_new_reserve(cmp, n) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_VALUE_compfunc_type(cmp), (n))) +#define sk_ASN1_VALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_VALUE_sk_type(sk), (n)) +#define sk_ASN1_VALUE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_delete(sk, i) ((ASN1_VALUE *)OPENSSL_sk_delete(ossl_check_ASN1_VALUE_sk_type(sk), (i))) +#define sk_ASN1_VALUE_delete_ptr(sk, ptr) ((ASN1_VALUE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr))) +#define sk_ASN1_VALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_pop(sk) ((ASN1_VALUE *)OPENSSL_sk_pop(ossl_check_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_shift(sk) ((ASN1_VALUE *)OPENSSL_sk_shift(ossl_check_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_VALUE_sk_type(sk),ossl_check_ASN1_VALUE_freefunc_type(freefunc)) +#define sk_ASN1_VALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr), (idx)) +#define sk_ASN1_VALUE_set(sk, idx, ptr) ((ASN1_VALUE *)OPENSSL_sk_set(ossl_check_ASN1_VALUE_sk_type(sk), (idx), ossl_check_ASN1_VALUE_type(ptr))) +#define sk_ASN1_VALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr), pnum) +#define sk_ASN1_VALUE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_dup(sk) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_copyfunc_type(copyfunc), ossl_check_ASN1_VALUE_freefunc_type(freefunc))) +#define sk_ASN1_VALUE_set_cmp_func(sk, cmp) ((sk_ASN1_VALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_compfunc_type(cmp))) + + + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(const ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); + +/* Legacy compatibility */ +# define IMPLEMENT_ASN1_FUNCTIONS_const(name) IMPLEMENT_ASN1_FUNCTIONS(name) +# define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/async.h b/OtherInc/openssl/include/openssl/async.h new file mode 100644 index 0000000..bc27d5d --- /dev/null +++ b/OtherInc/openssl/include/openssl/async.h @@ -0,0 +1,96 @@ +/* + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include + +#ifndef OPENSSL_ASYNC_H +# define OPENSSL_ASYNC_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_ASYNC_H +# endif + +#if defined(_WIN32) +# if defined(BASETYPES) || defined(_WINDEF_H) +/* application has to include to use this */ +#define OSSL_ASYNC_FD HANDLE +#define OSSL_BAD_ASYNC_FD INVALID_HANDLE_VALUE +# endif +#else +#define OSSL_ASYNC_FD int +#define OSSL_BAD_ASYNC_FD -1 +#endif +# include + + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct async_job_st ASYNC_JOB; +typedef struct async_wait_ctx_st ASYNC_WAIT_CTX; +typedef int (*ASYNC_callback_fn)(void *arg); + +#define ASYNC_ERR 0 +#define ASYNC_NO_JOBS 1 +#define ASYNC_PAUSE 2 +#define ASYNC_FINISH 3 + +#define ASYNC_STATUS_UNSUPPORTED 0 +#define ASYNC_STATUS_ERR 1 +#define ASYNC_STATUS_OK 2 +#define ASYNC_STATUS_EAGAIN 3 + +int ASYNC_init_thread(size_t max_size, size_t init_size); +void ASYNC_cleanup_thread(void); + +#ifdef OSSL_ASYNC_FD +ASYNC_WAIT_CTX *ASYNC_WAIT_CTX_new(void); +void ASYNC_WAIT_CTX_free(ASYNC_WAIT_CTX *ctx); +int ASYNC_WAIT_CTX_set_wait_fd(ASYNC_WAIT_CTX *ctx, const void *key, + OSSL_ASYNC_FD fd, + void *custom_data, + void (*cleanup)(ASYNC_WAIT_CTX *, const void *, + OSSL_ASYNC_FD, void *)); +int ASYNC_WAIT_CTX_get_fd(ASYNC_WAIT_CTX *ctx, const void *key, + OSSL_ASYNC_FD *fd, void **custom_data); +int ASYNC_WAIT_CTX_get_all_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *fd, + size_t *numfds); +int ASYNC_WAIT_CTX_get_callback(ASYNC_WAIT_CTX *ctx, + ASYNC_callback_fn *callback, + void **callback_arg); +int ASYNC_WAIT_CTX_set_callback(ASYNC_WAIT_CTX *ctx, + ASYNC_callback_fn callback, + void *callback_arg); +int ASYNC_WAIT_CTX_set_status(ASYNC_WAIT_CTX *ctx, int status); +int ASYNC_WAIT_CTX_get_status(ASYNC_WAIT_CTX *ctx); +int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd, + size_t *numaddfds, OSSL_ASYNC_FD *delfd, + size_t *numdelfds); +int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key); +#endif + +int ASYNC_is_capable(void); + +int ASYNC_start_job(ASYNC_JOB **job, ASYNC_WAIT_CTX *ctx, int *ret, + int (*func)(void *), void *args, size_t size); +int ASYNC_pause_job(void); + +ASYNC_JOB *ASYNC_get_current_job(void); +ASYNC_WAIT_CTX *ASYNC_get_wait_ctx(ASYNC_JOB *job); +void ASYNC_block_pause(void); +void ASYNC_unblock_pause(void); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/asyncerr.h b/OtherInc/openssl/include/openssl/asyncerr.h new file mode 100644 index 0000000..c093f7b --- /dev/null +++ b/OtherInc/openssl/include/openssl/asyncerr.h @@ -0,0 +1,29 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_ASYNCERR_H +# define OPENSSL_ASYNCERR_H +# pragma once + +# include +# include +# include + + + +/* + * ASYNC reason codes. + */ +# define ASYNC_R_FAILED_TO_SET_POOL 101 +# define ASYNC_R_FAILED_TO_SWAP_CONTEXT 102 +# define ASYNC_R_INIT_FAILED 105 +# define ASYNC_R_INVALID_POOL_SIZE 103 + +#endif diff --git a/OtherInc/openssl/include/openssl/bio.h b/OtherInc/openssl/include/openssl/bio.h new file mode 100644 index 0000000..ff967ed --- /dev/null +++ b/OtherInc/openssl/include/openssl/bio.h @@ -0,0 +1,886 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\bio.h.in + * + * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + +#ifndef OPENSSL_BIO_H +# define OPENSSL_BIO_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_BIO_H +# endif + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# endif +# include + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* There are the classes of BIOs */ +# define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ +# define BIO_TYPE_FILTER 0x0200 +# define BIO_TYPE_SOURCE_SINK 0x0400 + +/* These are the 'types' of BIOs */ +# define BIO_TYPE_NONE 0 +# define BIO_TYPE_MEM ( 1|BIO_TYPE_SOURCE_SINK) +# define BIO_TYPE_FILE ( 2|BIO_TYPE_SOURCE_SINK) + +# define BIO_TYPE_FD ( 4|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# define BIO_TYPE_SOCKET ( 5|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# define BIO_TYPE_NULL ( 6|BIO_TYPE_SOURCE_SINK) +# define BIO_TYPE_SSL ( 7|BIO_TYPE_FILTER) +# define BIO_TYPE_MD ( 8|BIO_TYPE_FILTER) +# define BIO_TYPE_BUFFER ( 9|BIO_TYPE_FILTER) +# define BIO_TYPE_CIPHER (10|BIO_TYPE_FILTER) +# define BIO_TYPE_BASE64 (11|BIO_TYPE_FILTER) +# define BIO_TYPE_CONNECT (12|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# define BIO_TYPE_ACCEPT (13|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) + +# define BIO_TYPE_NBIO_TEST (16|BIO_TYPE_FILTER)/* server proxy BIO */ +# define BIO_TYPE_NULL_FILTER (17|BIO_TYPE_FILTER) +# define BIO_TYPE_BIO (19|BIO_TYPE_SOURCE_SINK)/* half a BIO pair */ +# define BIO_TYPE_LINEBUFFER (20|BIO_TYPE_FILTER) +# define BIO_TYPE_DGRAM (21|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# define BIO_TYPE_ASN1 (22|BIO_TYPE_FILTER) +# define BIO_TYPE_COMP (23|BIO_TYPE_FILTER) +# ifndef OPENSSL_NO_SCTP +# define BIO_TYPE_DGRAM_SCTP (24|BIO_TYPE_SOURCE_SINK|BIO_TYPE_DESCRIPTOR) +# endif +# define BIO_TYPE_CORE_TO_PROV (25|BIO_TYPE_SOURCE_SINK) + +#define BIO_TYPE_START 128 + +/* + * BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); + */ +# define BIO_NOCLOSE 0x00 +# define BIO_CLOSE 0x01 + +/* + * These are used in the following macros and are passed to BIO_ctrl() + */ +# define BIO_CTRL_RESET 1/* opt - rewind/zero etc */ +# define BIO_CTRL_EOF 2/* opt - are we at the eof */ +# define BIO_CTRL_INFO 3/* opt - extra tit-bits */ +# define BIO_CTRL_SET 4/* man - set the 'IO' type */ +# define BIO_CTRL_GET 5/* man - get the 'IO' type */ +# define BIO_CTRL_PUSH 6/* opt - internal, used to signify change */ +# define BIO_CTRL_POP 7/* opt - internal, used to signify change */ +# define BIO_CTRL_GET_CLOSE 8/* man - set the 'close' on free */ +# define BIO_CTRL_SET_CLOSE 9/* man - set the 'close' on free */ +# define BIO_CTRL_PENDING 10/* opt - is their more data buffered */ +# define BIO_CTRL_FLUSH 11/* opt - 'flush' buffered output */ +# define BIO_CTRL_DUP 12/* man - extra stuff for 'duped' BIO */ +# define BIO_CTRL_WPENDING 13/* opt - number of bytes still to write */ +# define BIO_CTRL_SET_CALLBACK 14/* opt - set callback function */ +# define BIO_CTRL_GET_CALLBACK 15/* opt - set callback function */ + +# define BIO_CTRL_PEEK 29/* BIO_f_buffer special */ +# define BIO_CTRL_SET_FILENAME 30/* BIO_s_file special */ + +/* dgram BIO stuff */ +# define BIO_CTRL_DGRAM_CONNECT 31/* BIO dgram special */ +# define BIO_CTRL_DGRAM_SET_CONNECTED 32/* allow for an externally connected + * socket to be passed in */ +# define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34/* getsockopt, essentially */ +# define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35/* setsockopt, essentially */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36/* getsockopt, essentially */ + +# define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37/* flag whether the last */ +# define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38/* I/O operation timed out */ + +/* #ifdef IP_MTU_DISCOVER */ +# define BIO_CTRL_DGRAM_MTU_DISCOVER 39/* set DF bit on egress packets */ +/* #endif */ + +# define BIO_CTRL_DGRAM_QUERY_MTU 40/* as kernel for current MTU */ +# define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +# define BIO_CTRL_DGRAM_GET_MTU 41/* get cached value for MTU */ +# define BIO_CTRL_DGRAM_SET_MTU 42/* set cached value for MTU. + * want to use this if asking + * the kernel fails */ + +# define BIO_CTRL_DGRAM_MTU_EXCEEDED 43/* check whether the MTU was + * exceed in the previous write + * operation */ + +# define BIO_CTRL_DGRAM_GET_PEER 46 +# define BIO_CTRL_DGRAM_SET_PEER 44/* Destination for the data */ + +# define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45/* Next DTLS handshake timeout + * to adjust socket timeouts */ +# define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 + +# define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 + +/* Deliberately outside of OPENSSL_NO_SCTP - used in bss_dgram.c */ +# define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 +# ifndef OPENSSL_NO_SCTP +/* SCTP stuff */ +# define BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY 51 +# define BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY 52 +# define BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD 53 +# define BIO_CTRL_DGRAM_SCTP_GET_SNDINFO 60 +# define BIO_CTRL_DGRAM_SCTP_SET_SNDINFO 61 +# define BIO_CTRL_DGRAM_SCTP_GET_RCVINFO 62 +# define BIO_CTRL_DGRAM_SCTP_SET_RCVINFO 63 +# define BIO_CTRL_DGRAM_SCTP_GET_PRINFO 64 +# define BIO_CTRL_DGRAM_SCTP_SET_PRINFO 65 +# define BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN 70 +# endif + +# define BIO_CTRL_DGRAM_SET_PEEK_MODE 71 + +/* + * internal BIO: + * # define BIO_CTRL_SET_KTLS_SEND 72 + * # define BIO_CTRL_SET_KTLS_SEND_CTRL_MSG 74 + * # define BIO_CTRL_CLEAR_KTLS_CTRL_MSG 75 + */ + +# define BIO_CTRL_GET_KTLS_SEND 73 +# define BIO_CTRL_GET_KTLS_RECV 76 + +# define BIO_CTRL_DGRAM_SCTP_WAIT_FOR_DRY 77 +# define BIO_CTRL_DGRAM_SCTP_MSG_WAITING 78 + +/* BIO_f_prefix controls */ +# define BIO_CTRL_SET_PREFIX 79 +# define BIO_CTRL_SET_INDENT 80 +# define BIO_CTRL_GET_INDENT 81 + +# ifndef OPENSSL_NO_KTLS +# define BIO_get_ktls_send(b) \ + BIO_ctrl(b, BIO_CTRL_GET_KTLS_SEND, 0, NULL) +# define BIO_get_ktls_recv(b) \ + BIO_ctrl(b, BIO_CTRL_GET_KTLS_RECV, 0, NULL) +# else +# define BIO_get_ktls_send(b) (0) +# define BIO_get_ktls_recv(b) (0) +# endif + +/* modifiers */ +# define BIO_FP_READ 0x02 +# define BIO_FP_WRITE 0x04 +# define BIO_FP_APPEND 0x08 +# define BIO_FP_TEXT 0x10 + +# define BIO_FLAGS_READ 0x01 +# define BIO_FLAGS_WRITE 0x02 +# define BIO_FLAGS_IO_SPECIAL 0x04 +# define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) +# define BIO_FLAGS_SHOULD_RETRY 0x08 +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* This #define was replaced by an internal constant and should not be used. */ +# define BIO_FLAGS_UPLINK 0 +# endif + +# define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* + * This is used with memory BIOs: + * BIO_FLAGS_MEM_RDONLY means we shouldn't free up or change the data in any way; + * BIO_FLAGS_NONCLEAR_RST means we shouldn't clear data on reset. + */ +# define BIO_FLAGS_MEM_RDONLY 0x200 +# define BIO_FLAGS_NONCLEAR_RST 0x400 +# define BIO_FLAGS_IN_EOF 0x800 + +/* the BIO FLAGS values 0x1000 to 0x4000 are reserved for internal KTLS flags */ + +typedef union bio_addr_st BIO_ADDR; +typedef struct bio_addrinfo_st BIO_ADDRINFO; + +int BIO_get_new_index(void); +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +# define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +# define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +# define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) +# define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +# define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +# define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +# define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +# define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +# define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* + * The next three are used in conjunction with the BIO_should_io_special() + * condition. After this returns true, BIO *BIO_get_retry_BIO(BIO *bio, int + * *reason); will walk the BIO stack and return the 'reason' for the special + * and the offending BIO. Given a BIO, BIO_get_retry_reason(bio) will return + * the code. + */ +/* + * Returned from the SSL bio when the certificate retrieval code had an error + */ +# define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +# define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +# define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +# define BIO_CB_FREE 0x01 +# define BIO_CB_READ 0x02 +# define BIO_CB_WRITE 0x03 +# define BIO_CB_PUTS 0x04 +# define BIO_CB_GETS 0x05 +# define BIO_CB_CTRL 0x06 + +/* + * The callback is called before and after the underling operation, The + * BIO_CB_RETURN flag indicates if it is after the call + */ +# define BIO_CB_RETURN 0x80 +# define BIO_CB_return(a) ((a)|BIO_CB_RETURN) +# define BIO_cb_pre(a) (!((a)&BIO_CB_RETURN)) +# define BIO_cb_post(a) ((a)&BIO_CB_RETURN) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef long (*BIO_callback_fn)(BIO *b, int oper, const char *argp, int argi, + long argl, long ret); +OSSL_DEPRECATEDIN_3_0 BIO_callback_fn BIO_get_callback(const BIO *b); +OSSL_DEPRECATEDIN_3_0 void BIO_set_callback(BIO *b, BIO_callback_fn callback); +OSSL_DEPRECATEDIN_3_0 long BIO_debug_callback(BIO *bio, int cmd, + const char *argp, int argi, + long argl, long ret); +# endif + +typedef long (*BIO_callback_fn_ex)(BIO *b, int oper, const char *argp, + size_t len, int argi, + long argl, int ret, size_t *processed); +BIO_callback_fn_ex BIO_get_callback_ex(const BIO *b); +void BIO_set_callback_ex(BIO *b, BIO_callback_fn_ex callback); +long BIO_debug_callback_ex(BIO *bio, int oper, const char *argp, size_t len, + int argi, long argl, int ret, size_t *processed); + +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +typedef struct bio_method_st BIO_METHOD; + +const char *BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef int BIO_info_cb(BIO *, int, int); +typedef BIO_info_cb bio_info_cb; /* backward compatibility */ + +SKM_DEFINE_STACK_OF_INTERNAL(BIO, BIO, BIO) +#define sk_BIO_num(sk) OPENSSL_sk_num(ossl_check_const_BIO_sk_type(sk)) +#define sk_BIO_value(sk, idx) ((BIO *)OPENSSL_sk_value(ossl_check_const_BIO_sk_type(sk), (idx))) +#define sk_BIO_new(cmp) ((STACK_OF(BIO) *)OPENSSL_sk_new(ossl_check_BIO_compfunc_type(cmp))) +#define sk_BIO_new_null() ((STACK_OF(BIO) *)OPENSSL_sk_new_null()) +#define sk_BIO_new_reserve(cmp, n) ((STACK_OF(BIO) *)OPENSSL_sk_new_reserve(ossl_check_BIO_compfunc_type(cmp), (n))) +#define sk_BIO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_BIO_sk_type(sk), (n)) +#define sk_BIO_free(sk) OPENSSL_sk_free(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_zero(sk) OPENSSL_sk_zero(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_delete(sk, i) ((BIO *)OPENSSL_sk_delete(ossl_check_BIO_sk_type(sk), (i))) +#define sk_BIO_delete_ptr(sk, ptr) ((BIO *)OPENSSL_sk_delete_ptr(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr))) +#define sk_BIO_push(sk, ptr) OPENSSL_sk_push(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_pop(sk) ((BIO *)OPENSSL_sk_pop(ossl_check_BIO_sk_type(sk))) +#define sk_BIO_shift(sk) ((BIO *)OPENSSL_sk_shift(ossl_check_BIO_sk_type(sk))) +#define sk_BIO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_BIO_sk_type(sk),ossl_check_BIO_freefunc_type(freefunc)) +#define sk_BIO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr), (idx)) +#define sk_BIO_set(sk, idx, ptr) ((BIO *)OPENSSL_sk_set(ossl_check_BIO_sk_type(sk), (idx), ossl_check_BIO_type(ptr))) +#define sk_BIO_find(sk, ptr) OPENSSL_sk_find(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr), pnum) +#define sk_BIO_sort(sk) OPENSSL_sk_sort(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_BIO_sk_type(sk)) +#define sk_BIO_dup(sk) ((STACK_OF(BIO) *)OPENSSL_sk_dup(ossl_check_const_BIO_sk_type(sk))) +#define sk_BIO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(BIO) *)OPENSSL_sk_deep_copy(ossl_check_const_BIO_sk_type(sk), ossl_check_BIO_copyfunc_type(copyfunc), ossl_check_BIO_freefunc_type(freefunc))) +#define sk_BIO_set_cmp_func(sk, cmp) ((sk_BIO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_BIO_sk_type(sk), ossl_check_BIO_compfunc_type(cmp))) + + + +/* Prefix and suffix callback in ASN1 BIO */ +typedef int asn1_ps_func (BIO *b, unsigned char **pbuf, int *plen, + void *parg); + +typedef void (*BIO_dgram_sctp_notification_handler_fn) (BIO *b, + void *context, + void *buf); +# ifndef OPENSSL_NO_SCTP +/* SCTP parameter structs */ +struct bio_dgram_sctp_sndinfo { + uint16_t snd_sid; + uint16_t snd_flags; + uint32_t snd_ppid; + uint32_t snd_context; +}; + +struct bio_dgram_sctp_rcvinfo { + uint16_t rcv_sid; + uint16_t rcv_ssn; + uint16_t rcv_flags; + uint32_t rcv_ppid; + uint32_t rcv_tsn; + uint32_t rcv_cumtsn; + uint32_t rcv_context; +}; + +struct bio_dgram_sctp_prinfo { + uint16_t pr_policy; + uint32_t pr_value; +}; +# endif + +/* + * #define BIO_CONN_get_param_hostname BIO_ctrl + */ + +# define BIO_C_SET_CONNECT 100 +# define BIO_C_DO_STATE_MACHINE 101 +# define BIO_C_SET_NBIO 102 +/* # define BIO_C_SET_PROXY_PARAM 103 */ +# define BIO_C_SET_FD 104 +# define BIO_C_GET_FD 105 +# define BIO_C_SET_FILE_PTR 106 +# define BIO_C_GET_FILE_PTR 107 +# define BIO_C_SET_FILENAME 108 +# define BIO_C_SET_SSL 109 +# define BIO_C_GET_SSL 110 +# define BIO_C_SET_MD 111 +# define BIO_C_GET_MD 112 +# define BIO_C_GET_CIPHER_STATUS 113 +# define BIO_C_SET_BUF_MEM 114 +# define BIO_C_GET_BUF_MEM_PTR 115 +# define BIO_C_GET_BUFF_NUM_LINES 116 +# define BIO_C_SET_BUFF_SIZE 117 +# define BIO_C_SET_ACCEPT 118 +# define BIO_C_SSL_MODE 119 +# define BIO_C_GET_MD_CTX 120 +/* # define BIO_C_GET_PROXY_PARAM 121 */ +# define BIO_C_SET_BUFF_READ_DATA 122/* data to read first */ +# define BIO_C_GET_CONNECT 123 +# define BIO_C_GET_ACCEPT 124 +# define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +# define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +# define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 +# define BIO_C_FILE_SEEK 128 +# define BIO_C_GET_CIPHER_CTX 129 +# define BIO_C_SET_BUF_MEM_EOF_RETURN 130/* return end of input + * value */ +# define BIO_C_SET_BIND_MODE 131 +# define BIO_C_GET_BIND_MODE 132 +# define BIO_C_FILE_TELL 133 +# define BIO_C_GET_SOCKS 134 +# define BIO_C_SET_SOCKS 135 + +# define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */ +# define BIO_C_GET_WRITE_BUF_SIZE 137 +# define BIO_C_MAKE_BIO_PAIR 138 +# define BIO_C_DESTROY_BIO_PAIR 139 +# define BIO_C_GET_WRITE_GUARANTEE 140 +# define BIO_C_GET_READ_REQUEST 141 +# define BIO_C_SHUTDOWN_WR 142 +# define BIO_C_NREAD0 143 +# define BIO_C_NREAD 144 +# define BIO_C_NWRITE0 145 +# define BIO_C_NWRITE 146 +# define BIO_C_RESET_READ_REQUEST 147 +# define BIO_C_SET_MD_CTX 148 + +# define BIO_C_SET_PREFIX 149 +# define BIO_C_GET_PREFIX 150 +# define BIO_C_SET_SUFFIX 151 +# define BIO_C_GET_SUFFIX 152 + +# define BIO_C_SET_EX_ARG 153 +# define BIO_C_GET_EX_ARG 154 + +# define BIO_C_SET_CONNECT_MODE 155 + +# define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,arg) +# define BIO_get_app_data(s) BIO_get_ex_data(s,0) + +# define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) + +# ifndef OPENSSL_NO_SOCK +/* IP families we support, for BIO_s_connect() and BIO_s_accept() */ +/* Note: the underlying operating system may not support some of them */ +# define BIO_FAMILY_IPV4 4 +# define BIO_FAMILY_IPV6 6 +# define BIO_FAMILY_IPANY 256 + +/* BIO_s_connect() */ +# define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0, \ + (char *)(name)) +# define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1, \ + (char *)(port)) +# define BIO_set_conn_address(b,addr) BIO_ctrl(b,BIO_C_SET_CONNECT,2, \ + (char *)(addr)) +# define BIO_set_conn_ip_family(b,f) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,f) +# define BIO_get_conn_hostname(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)) +# define BIO_get_conn_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)) +# define BIO_get_conn_address(b) ((const BIO_ADDR *)BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2)) +# define BIO_get_conn_ip_family(b) BIO_ctrl(b,BIO_C_GET_CONNECT,3,NULL) +# define BIO_set_conn_mode(b,n) BIO_ctrl(b,BIO_C_SET_CONNECT_MODE,(n),NULL) + +/* BIO_s_accept() */ +# define BIO_set_accept_name(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0, \ + (char *)(name)) +# define BIO_set_accept_port(b,port) BIO_ctrl(b,BIO_C_SET_ACCEPT,1, \ + (char *)(port)) +# define BIO_get_accept_name(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0)) +# define BIO_get_accept_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,1)) +# define BIO_get_peer_name(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,2)) +# define BIO_get_peer_port(b) ((const char *)BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,3)) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +# define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(n)?(void *)"a":NULL) +# define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,3, \ + (char *)(bio)) +# define BIO_set_accept_ip_family(b,f) BIO_int_ctrl(b,BIO_C_SET_ACCEPT,4,f) +# define BIO_get_accept_ip_family(b) BIO_ctrl(b,BIO_C_GET_ACCEPT,4,NULL) + +/* Aliases kept for backward compatibility */ +# define BIO_BIND_NORMAL 0 +# define BIO_BIND_REUSEADDR BIO_SOCK_REUSEADDR +# define BIO_BIND_REUSEADDR_IF_UNUSED BIO_SOCK_REUSEADDR +# define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL) +# define BIO_get_bind_mode(b) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL) +# endif /* OPENSSL_NO_SOCK */ + +# define BIO_do_connect(b) BIO_do_handshake(b) +# define BIO_do_accept(b) BIO_do_handshake(b) + +# define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) + +/* BIO_s_datagram(), BIO_s_fd(), BIO_s_socket(), BIO_s_accept() and BIO_s_connect() */ +# define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) +# define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)(c)) + +/* BIO_s_file() */ +# define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)(fp)) +# define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)(fpp)) + +/* BIO_s_fd() and BIO_s_file() */ +# define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL) +# define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL) + +/* + * name is cast to lose const, but might be better to route through a + * function so we can do it safely + */ +# ifdef CONST_STRICT +/* + * If you are wondering why this isn't defined, its because CONST_STRICT is + * purely a compile-time kludge to allow const to be checked. + */ +int BIO_read_filename(BIO *b, const char *name); +# else +# define BIO_read_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ,(char *)(name)) +# endif +# define BIO_write_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_WRITE,name) +# define BIO_append_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_APPEND,name) +# define BIO_rw_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, \ + BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name) + +/* + * WARNING WARNING, this ups the reference count on the read bio of the SSL + * structure. This is because the ssl read BIO is now pointed to by the + * next_bio field in the bio. So when you free the BIO, make sure you are + * doing a BIO_free_all() to catch the underlying BIO. + */ +# define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)(ssl)) +# define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)(sslp)) +# define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) +# define BIO_set_ssl_renegotiate_bytes(b,num) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL) +# define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL) +# define BIO_set_ssl_renegotiate_timeout(b,seconds) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL) + +/* defined in evp.h */ +/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)(md)) */ + +# define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)(pp)) +# define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)(bm)) +# define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0, \ + (char *)(pp)) +# define BIO_set_mem_eof_return(b,v) \ + BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL) + +/* For the BIO_f_buffer() type */ +# define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) +# define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) +# define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) +# define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) +# define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) + +/* Don't use the next one unless you know what you are doing :-) */ +# define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) + +# define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) +# define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) +# define BIO_set_close(b,c) (int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL) +# define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) +# define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) +# define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +# define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) +# define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \ + cbp) +# define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb) + +/* For the BIO_f_buffer() type */ +# define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) +# define BIO_buffer_peek(b,s,l) BIO_ctrl(b,BIO_CTRL_PEEK,(l),(s)) + +/* For BIO_s_bio() */ +# define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL) +# define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL) +# define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2) +# define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL) +# define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +# define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL) +# define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +# define BIO_ctrl_dgram_connect(b,peer) \ + (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)(peer)) +# define BIO_ctrl_set_connected(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, 0, (char *)(peer)) +# define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +# define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +# define BIO_dgram_get_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)(peer)) +# define BIO_dgram_set_peer(b,peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)(peer)) +# define BIO_dgram_get_mtu_overhead(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) + +/* ctrl macros for BIO_f_prefix */ +# define BIO_set_prefix(b,p) BIO_ctrl((b), BIO_CTRL_SET_PREFIX, 0, (void *)(p)) +# define BIO_set_indent(b,i) BIO_ctrl((b), BIO_CTRL_SET_INDENT, (i), NULL) +# define BIO_get_indent(b) BIO_ctrl((b), BIO_CTRL_GET_INDENT, 0, NULL) + +#define BIO_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, l, p, newf, dupf, freef) +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(const BIO *bio, int idx); +uint64_t BIO_number_read(BIO *bio); +uint64_t BIO_number_written(BIO *bio); + +/* For BIO_f_asn1() */ +int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, + asn1_ps_func *prefix_free); +int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, + asn1_ps_func **pprefix_free); +int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, + asn1_ps_func *suffix_free); +int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, + asn1_ps_func **psuffix_free); + +const BIO_METHOD *BIO_s_file(void); +BIO *BIO_new_file(const char *filename, const char *mode); +BIO *BIO_new_from_core_bio(OSSL_LIB_CTX *libctx, OSSL_CORE_BIO *corebio); +# ifndef OPENSSL_NO_STDIO +BIO *BIO_new_fp(FILE *stream, int close_flag); +# endif +BIO *BIO_new_ex(OSSL_LIB_CTX *libctx, const BIO_METHOD *method); +BIO *BIO_new(const BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_set_data(BIO *a, void *ptr); +void *BIO_get_data(BIO *a); +void BIO_set_init(BIO *a, int init); +int BIO_get_init(BIO *a); +void BIO_set_shutdown(BIO *a, int shut); +int BIO_get_shutdown(BIO *a); +void BIO_vfree(BIO *a); +int BIO_up_ref(BIO *a); +int BIO_read(BIO *b, void *data, int dlen); +int BIO_read_ex(BIO *b, void *data, size_t dlen, size_t *readbytes); +int BIO_gets(BIO *bp, char *buf, int size); +int BIO_get_line(BIO *bio, char *buf, int size); +int BIO_write(BIO *b, const void *data, int dlen); +int BIO_write_ex(BIO *b, const void *data, size_t dlen, size_t *written); +int BIO_puts(BIO *bp, const char *buf); +int BIO_indent(BIO *b, int indent, int max); +long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, BIO_info_cb *fp); +void *BIO_ptr_ctrl(BIO *bp, int cmd, long larg); +long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); +BIO *BIO_push(BIO *b, BIO *append); +BIO *BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO *BIO_find_type(BIO *b, int bio_type); +BIO *BIO_next(BIO *b); +void BIO_set_next(BIO *b, BIO *next); +BIO *BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +void BIO_set_retry_reason(BIO *bio, int reason); +BIO *BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +const BIO_METHOD *BIO_s_mem(void); +const BIO_METHOD *BIO_s_secmem(void); +BIO *BIO_new_mem_buf(const void *buf, int len); +# ifndef OPENSSL_NO_SOCK +const BIO_METHOD *BIO_s_socket(void); +const BIO_METHOD *BIO_s_connect(void); +const BIO_METHOD *BIO_s_accept(void); +# endif +const BIO_METHOD *BIO_s_fd(void); +const BIO_METHOD *BIO_s_log(void); +const BIO_METHOD *BIO_s_bio(void); +const BIO_METHOD *BIO_s_null(void); +const BIO_METHOD *BIO_f_null(void); +const BIO_METHOD *BIO_f_buffer(void); +const BIO_METHOD *BIO_f_readbuffer(void); +const BIO_METHOD *BIO_f_linebuffer(void); +const BIO_METHOD *BIO_f_nbio_test(void); +const BIO_METHOD *BIO_f_prefix(void); +const BIO_METHOD *BIO_s_core(void); +# ifndef OPENSSL_NO_DGRAM +const BIO_METHOD *BIO_s_datagram(void); +int BIO_dgram_non_fatal_error(int error); +BIO *BIO_new_dgram(int fd, int close_flag); +# ifndef OPENSSL_NO_SCTP +const BIO_METHOD *BIO_s_datagram_sctp(void); +BIO *BIO_new_dgram_sctp(int fd, int close_flag); +int BIO_dgram_is_sctp(BIO *bio); +int BIO_dgram_sctp_notification_cb(BIO *b, + BIO_dgram_sctp_notification_handler_fn handle_notifications, + void *context); +int BIO_dgram_sctp_wait_for_dry(BIO *b); +int BIO_dgram_sctp_msg_waiting(BIO *b); +# endif +# endif + +# ifndef OPENSSL_NO_SOCK +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +int BIO_socket_wait(int fd, int for_read, time_t max_time); +# endif +int BIO_wait(BIO *bio, time_t max_time, unsigned int nap_milliseconds); +int BIO_do_connect_retry(BIO *bio, int timeout, int nap_milliseconds); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const void *s, int len); +int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u), + void *u, const void *s, int len, int indent); +int BIO_dump(BIO *b, const void *bytes, int len); +int BIO_dump_indent(BIO *b, const void *bytes, int len, int indent); +# ifndef OPENSSL_NO_STDIO +int BIO_dump_fp(FILE *fp, const void *s, int len); +int BIO_dump_indent_fp(FILE *fp, const void *s, int len, int indent); +# endif +int BIO_hex_string(BIO *out, int indent, int width, const void *data, + int datalen); + +# ifndef OPENSSL_NO_SOCK +BIO_ADDR *BIO_ADDR_new(void); +int BIO_ADDR_rawmake(BIO_ADDR *ap, int family, + const void *where, size_t wherelen, unsigned short port); +void BIO_ADDR_free(BIO_ADDR *); +void BIO_ADDR_clear(BIO_ADDR *ap); +int BIO_ADDR_family(const BIO_ADDR *ap); +int BIO_ADDR_rawaddress(const BIO_ADDR *ap, void *p, size_t *l); +unsigned short BIO_ADDR_rawport(const BIO_ADDR *ap); +char *BIO_ADDR_hostname_string(const BIO_ADDR *ap, int numeric); +char *BIO_ADDR_service_string(const BIO_ADDR *ap, int numeric); +char *BIO_ADDR_path_string(const BIO_ADDR *ap); + +const BIO_ADDRINFO *BIO_ADDRINFO_next(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_family(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_socktype(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_protocol(const BIO_ADDRINFO *bai); +const BIO_ADDR *BIO_ADDRINFO_address(const BIO_ADDRINFO *bai); +void BIO_ADDRINFO_free(BIO_ADDRINFO *bai); + +enum BIO_hostserv_priorities { + BIO_PARSE_PRIO_HOST, BIO_PARSE_PRIO_SERV +}; +int BIO_parse_hostserv(const char *hostserv, char **host, char **service, + enum BIO_hostserv_priorities hostserv_prio); +enum BIO_lookup_type { + BIO_LOOKUP_CLIENT, BIO_LOOKUP_SERVER +}; +int BIO_lookup(const char *host, const char *service, + enum BIO_lookup_type lookup_type, + int family, int socktype, BIO_ADDRINFO **res); +int BIO_lookup_ex(const char *host, const char *service, + int lookup_type, int family, int socktype, int protocol, + BIO_ADDRINFO **res); +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd, int mode); +int BIO_sock_init(void); +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define BIO_sock_cleanup() while(0) continue +# endif +int BIO_set_tcp_ndelay(int sock, int turn_on); +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 struct hostent *BIO_gethostbyname(const char *name); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_port(const char *str, unsigned short *port_ptr); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_host_ip(const char *str, unsigned char *ip); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_accept_socket(char *host_port, int mode); +OSSL_DEPRECATEDIN_1_1_0 int BIO_accept(int sock, char **ip_port); +# endif + +union BIO_sock_info_u { + BIO_ADDR *addr; +}; +enum BIO_sock_info_type { + BIO_SOCK_INFO_ADDRESS +}; +int BIO_sock_info(int sock, + enum BIO_sock_info_type type, union BIO_sock_info_u *info); + +# define BIO_SOCK_REUSEADDR 0x01 +# define BIO_SOCK_V6_ONLY 0x02 +# define BIO_SOCK_KEEPALIVE 0x04 +# define BIO_SOCK_NONBLOCK 0x08 +# define BIO_SOCK_NODELAY 0x10 + +int BIO_socket(int domain, int socktype, int protocol, int options); +int BIO_connect(int sock, const BIO_ADDR *addr, int options); +int BIO_bind(int sock, const BIO_ADDR *addr, int options); +int BIO_listen(int sock, const BIO_ADDR *addr, int options); +int BIO_accept_ex(int accept_sock, BIO_ADDR *addr, int options); +int BIO_closesocket(int sock); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_connect(const char *host_port); +BIO *BIO_new_accept(const char *host_port); +# endif /* OPENSSL_NO_SOCK*/ + +BIO *BIO_new_fd(int fd, int close_flag); + +int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +/* + * If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. Size 0 uses default + * value. + */ + +void BIO_copy_next_retry(BIO *b); + +/* + * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); + */ + +# define ossl_bio__attr__(x) +# if defined(__GNUC__) && defined(__STDC_VERSION__) \ + && !defined(__APPLE__) + /* + * Because we support the 'z' modifier, which made its appearance in C99, + * we can't use __attribute__ with pre C99 dialects. + */ +# if __STDC_VERSION__ >= 199901L +# undef ossl_bio__attr__ +# define ossl_bio__attr__ __attribute__ +# if __GNUC__*10 + __GNUC_MINOR__ >= 44 +# define ossl_bio__printf__ __gnu_printf__ +# else +# define ossl_bio__printf__ __printf__ +# endif +# endif +# endif +int BIO_printf(BIO *bio, const char *format, ...) +ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) +ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) +ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) +ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 0))); +# undef ossl_bio__attr__ +# undef ossl_bio__printf__ + + +BIO_METHOD *BIO_meth_new(int type, const char *name); +void BIO_meth_free(BIO_METHOD *biom); +int (*BIO_meth_get_write(const BIO_METHOD *biom)) (BIO *, const char *, int); +int (*BIO_meth_get_write_ex(const BIO_METHOD *biom)) (BIO *, const char *, size_t, + size_t *); +int BIO_meth_set_write(BIO_METHOD *biom, + int (*write) (BIO *, const char *, int)); +int BIO_meth_set_write_ex(BIO_METHOD *biom, + int (*bwrite) (BIO *, const char *, size_t, size_t *)); +int (*BIO_meth_get_read(const BIO_METHOD *biom)) (BIO *, char *, int); +int (*BIO_meth_get_read_ex(const BIO_METHOD *biom)) (BIO *, char *, size_t, size_t *); +int BIO_meth_set_read(BIO_METHOD *biom, + int (*read) (BIO *, char *, int)); +int BIO_meth_set_read_ex(BIO_METHOD *biom, + int (*bread) (BIO *, char *, size_t, size_t *)); +int (*BIO_meth_get_puts(const BIO_METHOD *biom)) (BIO *, const char *); +int BIO_meth_set_puts(BIO_METHOD *biom, + int (*puts) (BIO *, const char *)); +int (*BIO_meth_get_gets(const BIO_METHOD *biom)) (BIO *, char *, int); +int BIO_meth_set_gets(BIO_METHOD *biom, + int (*gets) (BIO *, char *, int)); +long (*BIO_meth_get_ctrl(const BIO_METHOD *biom)) (BIO *, int, long, void *); +int BIO_meth_set_ctrl(BIO_METHOD *biom, + long (*ctrl) (BIO *, int, long, void *)); +int (*BIO_meth_get_create(const BIO_METHOD *bion)) (BIO *); +int BIO_meth_set_create(BIO_METHOD *biom, int (*create) (BIO *)); +int (*BIO_meth_get_destroy(const BIO_METHOD *biom)) (BIO *); +int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy) (BIO *)); +long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom)) + (BIO *, int, BIO_info_cb *); +int BIO_meth_set_callback_ctrl(BIO_METHOD *biom, + long (*callback_ctrl) (BIO *, int, + BIO_info_cb *)); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/bioerr.h b/OtherInc/openssl/include/openssl/bioerr.h new file mode 100644 index 0000000..787b30a --- /dev/null +++ b/OtherInc/openssl/include/openssl/bioerr.h @@ -0,0 +1,65 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_BIOERR_H +# define OPENSSL_BIOERR_H +# pragma once + +# include +# include +# include + + + +/* + * BIO reason codes. + */ +# define BIO_R_ACCEPT_ERROR 100 +# define BIO_R_ADDRINFO_ADDR_IS_NOT_AF_INET 141 +# define BIO_R_AMBIGUOUS_HOST_OR_SERVICE 129 +# define BIO_R_BAD_FOPEN_MODE 101 +# define BIO_R_BROKEN_PIPE 124 +# define BIO_R_CONNECT_ERROR 103 +# define BIO_R_CONNECT_TIMEOUT 147 +# define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 +# define BIO_R_GETSOCKNAME_ERROR 132 +# define BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS 133 +# define BIO_R_GETTING_SOCKTYPE 134 +# define BIO_R_INVALID_ARGUMENT 125 +# define BIO_R_INVALID_SOCKET 135 +# define BIO_R_IN_USE 123 +# define BIO_R_LENGTH_TOO_LONG 102 +# define BIO_R_LISTEN_V6_ONLY 136 +# define BIO_R_LOOKUP_RETURNED_NOTHING 142 +# define BIO_R_MALFORMED_HOST_OR_SERVICE 130 +# define BIO_R_NBIO_CONNECT_ERROR 110 +# define BIO_R_NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED 143 +# define BIO_R_NO_HOSTNAME_OR_SERVICE_SPECIFIED 144 +# define BIO_R_NO_PORT_DEFINED 113 +# define BIO_R_NO_SUCH_FILE 128 +# define BIO_R_NULL_PARAMETER 115 /* unused */ +# define BIO_R_TRANSFER_ERROR 104 +# define BIO_R_TRANSFER_TIMEOUT 105 +# define BIO_R_UNABLE_TO_BIND_SOCKET 117 +# define BIO_R_UNABLE_TO_CREATE_SOCKET 118 +# define BIO_R_UNABLE_TO_KEEPALIVE 137 +# define BIO_R_UNABLE_TO_LISTEN_SOCKET 119 +# define BIO_R_UNABLE_TO_NODELAY 138 +# define BIO_R_UNABLE_TO_REUSEADDR 139 +# define BIO_R_UNAVAILABLE_IP_FAMILY 145 +# define BIO_R_UNINITIALIZED 120 +# define BIO_R_UNKNOWN_INFO_TYPE 140 +# define BIO_R_UNSUPPORTED_IP_FAMILY 146 +# define BIO_R_UNSUPPORTED_METHOD 121 +# define BIO_R_UNSUPPORTED_PROTOCOL_FAMILY 131 +# define BIO_R_WRITE_TO_READ_ONLY_BIO 126 +# define BIO_R_WSASTARTUP 122 + +#endif diff --git a/OtherInc/openssl/include/openssl/blowfish.h b/OtherInc/openssl/include/openssl/blowfish.h new file mode 100644 index 0000000..667d642 --- /dev/null +++ b/OtherInc/openssl/include/openssl/blowfish.h @@ -0,0 +1,78 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_BLOWFISH_H +# define OPENSSL_BLOWFISH_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_BLOWFISH_H +# endif + +# include + +# ifndef OPENSSL_NO_BF +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define BF_BLOCK 8 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 + +# define BF_ENCRYPT 1 +# define BF_DECRYPT 0 + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! BF_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ +# define BF_LONG unsigned int + +# define BF_ROUNDS 16 + +typedef struct bf_key_st { + BF_LONG P[BF_ROUNDS + 2]; + BF_LONG S[4 * 256]; +} BF_KEY; + +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void BF_set_key(BF_KEY *key, int len, + const unsigned char *data); +OSSL_DEPRECATEDIN_3_0 void BF_encrypt(BF_LONG *data, const BF_KEY *key); +OSSL_DEPRECATEDIN_3_0 void BF_decrypt(BF_LONG *data, const BF_KEY *key); +OSSL_DEPRECATEDIN_3_0 void BF_ecb_encrypt(const unsigned char *in, + unsigned char *out, const BF_KEY *key, + int enc); +OSSL_DEPRECATEDIN_3_0 void BF_cbc_encrypt(const unsigned char *in, + unsigned char *out, long length, + const BF_KEY *schedule, + unsigned char *ivec, int enc); +OSSL_DEPRECATEDIN_3_0 void BF_cfb64_encrypt(const unsigned char *in, + unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num, + int enc); +OSSL_DEPRECATEDIN_3_0 void BF_ofb64_encrypt(const unsigned char *in, + unsigned char *out, + long length, const BF_KEY *schedule, + unsigned char *ivec, int *num); +OSSL_DEPRECATEDIN_3_0 const char *BF_options(void); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/bn.h b/OtherInc/openssl/include/openssl/bn.h new file mode 100644 index 0000000..ecd7f01 --- /dev/null +++ b/OtherInc/openssl/include/openssl/bn.h @@ -0,0 +1,583 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_BN_H +# define OPENSSL_BN_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_BN_H +# endif + +# include +# ifndef OPENSSL_NO_STDIO +# include +# endif +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * 64-bit processor with LP64 ABI + */ +# ifdef SIXTY_FOUR_BIT_LONG +# define BN_ULONG unsigned long +# define BN_BYTES 8 +# endif + +/* + * 64-bit processor other than LP64 ABI + */ +# ifdef SIXTY_FOUR_BIT +# define BN_ULONG unsigned long long +# define BN_BYTES 8 +# endif + +# ifdef THIRTY_TWO_BIT +# define BN_ULONG unsigned int +# define BN_BYTES 4 +# endif + +# define BN_BITS2 (BN_BYTES * 8) +# define BN_BITS (BN_BITS2 * 2) +# define BN_TBIT ((BN_ULONG)1 << (BN_BITS2 - 1)) + +# define BN_FLG_MALLOCED 0x01 +# define BN_FLG_STATIC_DATA 0x02 + +/* + * avoid leaking exponent information through timing, + * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, + * BN_div() will call BN_div_no_branch, + * BN_mod_inverse() will call bn_mod_inverse_no_branch. + */ +# define BN_FLG_CONSTTIME 0x04 +# define BN_FLG_SECURE 0x08 + +# ifndef OPENSSL_NO_DEPRECATED_0_9_8 +/* deprecated name for the flag */ +# define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME +# define BN_FLG_FREE 0x8000 /* used for debugging */ +# endif + +void BN_set_flags(BIGNUM *b, int n); +int BN_get_flags(const BIGNUM *b, int n); + +/* Values for |top| in BN_rand() */ +#define BN_RAND_TOP_ANY -1 +#define BN_RAND_TOP_ONE 0 +#define BN_RAND_TOP_TWO 1 + +/* Values for |bottom| in BN_rand() */ +#define BN_RAND_BOTTOM_ANY 0 +#define BN_RAND_BOTTOM_ODD 1 + +/* + * get a clone of a BIGNUM with changed flags, for *temporary* use only (the + * two BIGNUMs cannot be used in parallel!). Also only for *read only* use. The + * value |dest| should be a newly allocated BIGNUM obtained via BN_new() that + * has not been otherwise initialised or used. + */ +void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags); + +/* Wrapper function to make using BN_GENCB easier */ +int BN_GENCB_call(BN_GENCB *cb, int a, int b); + +BN_GENCB *BN_GENCB_new(void); +void BN_GENCB_free(BN_GENCB *cb); + +/* Populate a BN_GENCB structure with an "old"-style callback */ +void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *), + void *cb_arg); + +/* Populate a BN_GENCB structure with a "new"-style callback */ +void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *), + void *cb_arg); + +void *BN_GENCB_get_arg(BN_GENCB *cb); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define BN_prime_checks 0 /* default: select number of iterations based + * on the size of the number */ + +/* + * BN_prime_checks_for_size() returns the number of Miller-Rabin iterations + * that will be done for checking that a random number is probably prime. The + * error rate for accepting a composite number as prime depends on the size of + * the prime |b|. The error rates used are for calculating an RSA key with 2 primes, + * and so the level is what you would expect for a key of double the size of the + * prime. + * + * This table is generated using the algorithm of FIPS PUB 186-4 + * Digital Signature Standard (DSS), section F.1, page 117. + * (https://dx.doi.org/10.6028/NIST.FIPS.186-4) + * + * The following magma script was used to generate the output: + * securitybits:=125; + * k:=1024; + * for t:=1 to 65 do + * for M:=3 to Floor(2*Sqrt(k-1)-1) do + * S:=0; + * // Sum over m + * for m:=3 to M do + * s:=0; + * // Sum over j + * for j:=2 to m do + * s+:=(RealField(32)!2)^-(j+(k-1)/j); + * end for; + * S+:=2^(m-(m-1)*t)*s; + * end for; + * A:=2^(k-2-M*t); + * B:=8*(Pi(RealField(32))^2-6)/3*2^(k-2)*S; + * pkt:=2.00743*Log(2)*k*2^-k*(A+B); + * seclevel:=Floor(-Log(2,pkt)); + * if seclevel ge securitybits then + * printf "k: %5o, security: %o bits (t: %o, M: %o)\n",k,seclevel,t,M; + * break; + * end if; + * end for; + * if seclevel ge securitybits then break; end if; + * end for; + * + * It can be run online at: + * http://magma.maths.usyd.edu.au/calc + * + * And will output: + * k: 1024, security: 129 bits (t: 6, M: 23) + * + * k is the number of bits of the prime, securitybits is the level we want to + * reach. + * + * prime length | RSA key size | # MR tests | security level + * -------------+--------------|------------+--------------- + * (b) >= 6394 | >= 12788 | 3 | 256 bit + * (b) >= 3747 | >= 7494 | 3 | 192 bit + * (b) >= 1345 | >= 2690 | 4 | 128 bit + * (b) >= 1080 | >= 2160 | 5 | 128 bit + * (b) >= 852 | >= 1704 | 5 | 112 bit + * (b) >= 476 | >= 952 | 5 | 80 bit + * (b) >= 400 | >= 800 | 6 | 80 bit + * (b) >= 347 | >= 694 | 7 | 80 bit + * (b) >= 308 | >= 616 | 8 | 80 bit + * (b) >= 55 | >= 110 | 27 | 64 bit + * (b) >= 6 | >= 12 | 34 | 64 bit + */ + +# define BN_prime_checks_for_size(b) ((b) >= 3747 ? 3 : \ + (b) >= 1345 ? 4 : \ + (b) >= 476 ? 5 : \ + (b) >= 400 ? 6 : \ + (b) >= 347 ? 7 : \ + (b) >= 308 ? 8 : \ + (b) >= 55 ? 27 : \ + /* b >= 6 */ 34) +# endif + +# define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) + +int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w); +int BN_is_zero(const BIGNUM *a); +int BN_is_one(const BIGNUM *a); +int BN_is_word(const BIGNUM *a, const BN_ULONG w); +int BN_is_odd(const BIGNUM *a); + +# define BN_one(a) (BN_set_word((a),1)) + +void BN_zero_ex(BIGNUM *a); + +# if OPENSSL_API_LEVEL > 908 +# define BN_zero(a) BN_zero_ex(a) +# else +# define BN_zero(a) (BN_set_word((a),0)) +# endif + +const BIGNUM *BN_value_one(void); +char *BN_options(void); +BN_CTX *BN_CTX_new_ex(OSSL_LIB_CTX *ctx); +BN_CTX *BN_CTX_new(void); +BN_CTX *BN_CTX_secure_new_ex(OSSL_LIB_CTX *ctx); +BN_CTX *BN_CTX_secure_new(void); +void BN_CTX_free(BN_CTX *c); +void BN_CTX_start(BN_CTX *ctx); +BIGNUM *BN_CTX_get(BN_CTX *ctx); +void BN_CTX_end(BN_CTX *ctx); +int BN_rand_ex(BIGNUM *rnd, int bits, int top, int bottom, + unsigned int strength, BN_CTX *ctx); +int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_priv_rand_ex(BIGNUM *rnd, int bits, int top, int bottom, + unsigned int strength, BN_CTX *ctx); +int BN_priv_rand(BIGNUM *rnd, int bits, int top, int bottom); +int BN_rand_range_ex(BIGNUM *r, const BIGNUM *range, unsigned int strength, + BN_CTX *ctx); +int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); +int BN_priv_rand_range_ex(BIGNUM *r, const BIGNUM *range, + unsigned int strength, BN_CTX *ctx); +int BN_priv_rand_range(BIGNUM *rnd, const BIGNUM *range); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); +OSSL_DEPRECATEDIN_3_0 +int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); +# endif +int BN_num_bits(const BIGNUM *a); +int BN_num_bits_word(BN_ULONG l); +int BN_security_bits(int L, int N); +BIGNUM *BN_new(void); +BIGNUM *BN_secure_new(void); +void BN_clear_free(BIGNUM *a); +BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); +void BN_swap(BIGNUM *a, BIGNUM *b); +BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2bin(const BIGNUM *a, unsigned char *to); +int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen); +BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen); +BIGNUM *BN_native2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2nativepad(const BIGNUM *a, unsigned char *to, int tolen); +BIGNUM *BN_mpi2bn(const unsigned char *s, int len, BIGNUM *ret); +int BN_bn2mpi(const BIGNUM *a, unsigned char *to); +int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); +/** BN_set_negative sets sign of a BIGNUM + * \param b pointer to the BIGNUM object + * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise + */ +void BN_set_negative(BIGNUM *b, int n); +/** BN_is_negative returns 1 if the BIGNUM is negative + * \param b pointer to the BIGNUM object + * \return 1 if a < 0 and 0 otherwise + */ +int BN_is_negative(const BIGNUM *b); + +int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d, + BN_CTX *ctx); +# define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx)) +int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx); +int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *m); +int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); +int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m); +int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, + BN_CTX *ctx); +int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m); + +BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); +BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w); +int BN_mul_word(BIGNUM *a, BN_ULONG w); +int BN_add_word(BIGNUM *a, BN_ULONG w); +int BN_sub_word(BIGNUM *a, BN_ULONG w); +int BN_set_word(BIGNUM *a, BN_ULONG w); +BN_ULONG BN_get_word(const BIGNUM *a); + +int BN_cmp(const BIGNUM *a, const BIGNUM *b); +void BN_free(BIGNUM *a); +int BN_is_bit_set(const BIGNUM *a, int n); +int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_lshift1(BIGNUM *r, const BIGNUM *a); +int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, + BN_MONT_CTX *in_mont); +int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1, + const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, + BN_CTX *ctx, BN_MONT_CTX *m_ctx); +int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_mod_exp_mont_consttime_x2(BIGNUM *rr1, const BIGNUM *a1, const BIGNUM *p1, + const BIGNUM *m1, BN_MONT_CTX *in_mont1, + BIGNUM *rr2, const BIGNUM *a2, const BIGNUM *p2, + const BIGNUM *m2, BN_MONT_CTX *in_mont2, + BN_CTX *ctx); + +int BN_mask_bits(BIGNUM *a, int n); +# ifndef OPENSSL_NO_STDIO +int BN_print_fp(FILE *fp, const BIGNUM *a); +# endif +int BN_print(BIO *bio, const BIGNUM *a); +int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); +int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); +int BN_rshift1(BIGNUM *r, const BIGNUM *a); +void BN_clear(BIGNUM *a); +BIGNUM *BN_dup(const BIGNUM *a); +int BN_ucmp(const BIGNUM *a, const BIGNUM *b); +int BN_set_bit(BIGNUM *a, int n); +int BN_clear_bit(BIGNUM *a, int n); +char *BN_bn2hex(const BIGNUM *a); +char *BN_bn2dec(const BIGNUM *a); +int BN_hex2bn(BIGNUM **a, const char *str); +int BN_dec2bn(BIGNUM **a, const char *str); +int BN_asc2bn(BIGNUM **a, const char *str); +int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); +int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); /* returns + * -2 for + * error */ +BIGNUM *BN_mod_inverse(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); +BIGNUM *BN_mod_sqrt(BIGNUM *ret, + const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx); + +void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords); + +/* Deprecated versions */ +# ifndef OPENSSL_NO_DEPRECATED_0_9_8 +OSSL_DEPRECATEDIN_0_9_8 +BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, + const BIGNUM *add, const BIGNUM *rem, + void (*callback) (int, int, void *), + void *cb_arg); +OSSL_DEPRECATEDIN_0_9_8 +int BN_is_prime(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), + BN_CTX *ctx, void *cb_arg); +OSSL_DEPRECATEDIN_0_9_8 +int BN_is_prime_fasttest(const BIGNUM *p, int nchecks, + void (*callback) (int, int, void *), + BN_CTX *ctx, void *cb_arg, + int do_trial_division); +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); +OSSL_DEPRECATEDIN_3_0 +int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, + int do_trial_division, BN_GENCB *cb); +# endif +/* Newer versions */ +int BN_generate_prime_ex2(BIGNUM *ret, int bits, int safe, + const BIGNUM *add, const BIGNUM *rem, BN_GENCB *cb, + BN_CTX *ctx); +int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, + const BIGNUM *rem, BN_GENCB *cb); +int BN_check_prime(const BIGNUM *p, BN_CTX *ctx, BN_GENCB *cb); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); + +OSSL_DEPRECATEDIN_3_0 +int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, + const BIGNUM *Xp, const BIGNUM *Xp1, + const BIGNUM *Xp2, const BIGNUM *e, BN_CTX *ctx, + BN_GENCB *cb); +OSSL_DEPRECATEDIN_3_0 +int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, BIGNUM *Xp1, + BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *e, + BN_CTX *ctx, BN_GENCB *cb); +# endif + +BN_MONT_CTX *BN_MONT_CTX_new(void); +int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_MONT_CTX *mont, BN_CTX *ctx); +int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, + BN_CTX *ctx); +int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, + BN_CTX *ctx); +void BN_MONT_CTX_free(BN_MONT_CTX *mont); +int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx); +BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from); +BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, CRYPTO_RWLOCK *lock, + const BIGNUM *mod, BN_CTX *ctx); + +/* BN_BLINDING flags */ +# define BN_BLINDING_NO_UPDATE 0x00000001 +# define BN_BLINDING_NO_RECREATE 0x00000002 + +BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod); +void BN_BLINDING_free(BN_BLINDING *b); +int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); +int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); +int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, + BN_CTX *); + +int BN_BLINDING_is_current_thread(BN_BLINDING *b); +void BN_BLINDING_set_current_thread(BN_BLINDING *b); +int BN_BLINDING_lock(BN_BLINDING *b); +int BN_BLINDING_unlock(BN_BLINDING *b); + +unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); +void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); +BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, + const BIGNUM *e, BIGNUM *m, BN_CTX *ctx, + int (*bn_mod_exp) (BIGNUM *r, + const BIGNUM *a, + const BIGNUM *p, + const BIGNUM *m, + BN_CTX *ctx, + BN_MONT_CTX *m_ctx), + BN_MONT_CTX *m_ctx); +# ifndef OPENSSL_NO_DEPRECATED_0_9_8 +OSSL_DEPRECATEDIN_0_9_8 +void BN_set_params(int mul, int high, int low, int mont); +OSSL_DEPRECATEDIN_0_9_8 +int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */ +# endif + +BN_RECP_CTX *BN_RECP_CTX_new(void); +void BN_RECP_CTX_free(BN_RECP_CTX *recp); +int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); +int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp, BN_CTX *ctx); +int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + const BIGNUM *m, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, + BN_RECP_CTX *recp, BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M + +/* + * Functions for arithmetic over binary polynomials represented by BIGNUMs. + * The BIGNUM::neg property of BIGNUMs representing binary polynomials is + * ignored. Note that input arguments are not const so that their bit arrays + * can be expanded to the appropriate size if needed. + */ + +/* + * r = a + b + */ +int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); +# define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b) +/* + * r=a mod p + */ +int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const BIGNUM *p, BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, + BN_CTX *ctx); +# define BN_GF2m_cmp(a, b) BN_ucmp((a), (b)) +/*- + * Some functions allow for representation of the irreducible polynomials + * as an unsigned int[], say p. The irreducible f(t) is then of the form: + * t^p[0] + t^p[1] + ... + t^p[k] + * where m = p[0] > p[1] > ... > p[k] = 0. + */ +/* r = a mod p */ +int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); +/* r = (a * b) mod p */ +int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a * a) mod p */ +int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], + BN_CTX *ctx); +/* r = (1 / b) mod p */ +int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], + BN_CTX *ctx); +/* r = (a / b) mod p */ +int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = (a ^ b) mod p */ +int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + const int p[], BN_CTX *ctx); +/* r = sqrt(a) mod p */ +int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +/* r^2 + r = a mod p */ +int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, + const int p[], BN_CTX *ctx); +int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); +int BN_GF2m_arr2poly(const int p[], BIGNUM *a); + +# endif + +/* + * faster mod functions for the 'NIST primes' 0 <= a < p^2 + */ +int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); +int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); + +const BIGNUM *BN_get0_nist_prime_192(void); +const BIGNUM *BN_get0_nist_prime_224(void); +const BIGNUM *BN_get0_nist_prime_256(void); +const BIGNUM *BN_get0_nist_prime_384(void); +const BIGNUM *BN_get0_nist_prime_521(void); + +int (*BN_nist_mod_func(const BIGNUM *p)) (BIGNUM *r, const BIGNUM *a, + const BIGNUM *field, BN_CTX *ctx); + +int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range, + const BIGNUM *priv, const unsigned char *message, + size_t message_len, BN_CTX *ctx); + +/* Primes from RFC 2409 */ +BIGNUM *BN_get_rfc2409_prime_768(BIGNUM *bn); +BIGNUM *BN_get_rfc2409_prime_1024(BIGNUM *bn); + +/* Primes from RFC 3526 */ +BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *bn); +BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *bn); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define get_rfc2409_prime_768 BN_get_rfc2409_prime_768 +# define get_rfc2409_prime_1024 BN_get_rfc2409_prime_1024 +# define get_rfc3526_prime_1536 BN_get_rfc3526_prime_1536 +# define get_rfc3526_prime_2048 BN_get_rfc3526_prime_2048 +# define get_rfc3526_prime_3072 BN_get_rfc3526_prime_3072 +# define get_rfc3526_prime_4096 BN_get_rfc3526_prime_4096 +# define get_rfc3526_prime_6144 BN_get_rfc3526_prime_6144 +# define get_rfc3526_prime_8192 BN_get_rfc3526_prime_8192 +# endif + +int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/bnerr.h b/OtherInc/openssl/include/openssl/bnerr.h new file mode 100644 index 0000000..847d326 --- /dev/null +++ b/OtherInc/openssl/include/openssl/bnerr.h @@ -0,0 +1,46 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_BNERR_H +# define OPENSSL_BNERR_H +# pragma once + +# include +# include +# include + + + +/* + * BN reason codes. + */ +# define BN_R_ARG2_LT_ARG3 100 +# define BN_R_BAD_RECIPROCAL 101 +# define BN_R_BIGNUM_TOO_LONG 114 +# define BN_R_BITS_TOO_SMALL 118 +# define BN_R_CALLED_WITH_EVEN_MODULUS 102 +# define BN_R_DIV_BY_ZERO 103 +# define BN_R_ENCODING_ERROR 104 +# define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105 +# define BN_R_INPUT_NOT_REDUCED 110 +# define BN_R_INVALID_LENGTH 106 +# define BN_R_INVALID_RANGE 115 +# define BN_R_INVALID_SHIFT 119 +# define BN_R_NOT_A_SQUARE 111 +# define BN_R_NOT_INITIALIZED 107 +# define BN_R_NO_INVERSE 108 +# define BN_R_NO_SOLUTION 116 +# define BN_R_NO_SUITABLE_DIGEST 120 +# define BN_R_PRIVATE_KEY_TOO_LARGE 117 +# define BN_R_P_IS_NOT_PRIME 112 +# define BN_R_TOO_MANY_ITERATIONS 113 +# define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109 + +#endif diff --git a/OtherInc/openssl/include/openssl/buffer.h b/OtherInc/openssl/include/openssl/buffer.h new file mode 100644 index 0000000..5773b98 --- /dev/null +++ b/OtherInc/openssl/include/openssl/buffer.h @@ -0,0 +1,62 @@ +/* + * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_BUFFER_H +# define OPENSSL_BUFFER_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_BUFFER_H +# endif + +# include +# ifndef OPENSSL_CRYPTO_H +# include +# endif +# include + + +#ifdef __cplusplus +extern "C" { +#endif + +# include +# include + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define BUF_strdup(s) OPENSSL_strdup(s) +# define BUF_strndup(s, size) OPENSSL_strndup(s, size) +# define BUF_memdup(data, size) OPENSSL_memdup(data, size) +# define BUF_strlcpy(dst, src, size) OPENSSL_strlcpy(dst, src, size) +# define BUF_strlcat(dst, src, size) OPENSSL_strlcat(dst, src, size) +# define BUF_strnlen(str, maxlen) OPENSSL_strnlen(str, maxlen) +# endif + +struct buf_mem_st { + size_t length; /* current number of bytes */ + char *data; + size_t max; /* size of buffer */ + unsigned long flags; +}; + +# define BUF_MEM_FLAG_SECURE 0x01 + +BUF_MEM *BUF_MEM_new(void); +BUF_MEM *BUF_MEM_new_ex(unsigned long flags); +void BUF_MEM_free(BUF_MEM *a); +size_t BUF_MEM_grow(BUF_MEM *str, size_t len); +size_t BUF_MEM_grow_clean(BUF_MEM *str, size_t len); +void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/buffererr.h b/OtherInc/openssl/include/openssl/buffererr.h new file mode 100644 index 0000000..d18b1f8 --- /dev/null +++ b/OtherInc/openssl/include/openssl/buffererr.h @@ -0,0 +1,25 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_BUFFERERR_H +# define OPENSSL_BUFFERERR_H +# pragma once + +# include +# include +# include + + + +/* + * BUF reason codes. + */ + +#endif diff --git a/OtherInc/openssl/include/openssl/camellia.h b/OtherInc/openssl/include/openssl/camellia.h new file mode 100644 index 0000000..88c2279 --- /dev/null +++ b/OtherInc/openssl/include/openssl/camellia.h @@ -0,0 +1,117 @@ +/* + * Copyright 2006-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CAMELLIA_H +# define OPENSSL_CAMELLIA_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_CAMELLIA_H +# endif + +# include + +# ifndef OPENSSL_NO_CAMELLIA +# include +#ifdef __cplusplus +extern "C" { +#endif + +# define CAMELLIA_BLOCK_SIZE 16 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 + +# define CAMELLIA_ENCRYPT 1 +# define CAMELLIA_DECRYPT 0 + +/* + * Because array size can't be a const in C, the following two are macros. + * Both sizes are in bytes. + */ + +/* This should be a hidden type, but EVP requires that the size be known */ + +# define CAMELLIA_TABLE_BYTE_LEN 272 +# define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) + +typedef unsigned int KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; /* to match + * with WORD */ + +struct camellia_key_st { + union { + double d; /* ensures 64-bit align */ + KEY_TABLE_TYPE rd_key; + } u; + int grand_rounds; +}; +typedef struct camellia_key_st CAMELLIA_KEY; + +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int Camellia_set_key(const unsigned char *userKey, + const int bits, + CAMELLIA_KEY *key); +OSSL_DEPRECATEDIN_3_0 void Camellia_encrypt(const unsigned char *in, + unsigned char *out, + const CAMELLIA_KEY *key); +OSSL_DEPRECATEDIN_3_0 void Camellia_decrypt(const unsigned char *in, + unsigned char *out, + const CAMELLIA_KEY *key); +OSSL_DEPRECATEDIN_3_0 void Camellia_ecb_encrypt(const unsigned char *in, + unsigned char *out, + const CAMELLIA_KEY *key, + const int enc); +OSSL_DEPRECATEDIN_3_0 void Camellia_cbc_encrypt(const unsigned char *in, + unsigned char *out, + size_t length, + const CAMELLIA_KEY *key, + unsigned char *ivec, + const int enc); +OSSL_DEPRECATEDIN_3_0 void Camellia_cfb128_encrypt(const unsigned char *in, + unsigned char *out, + size_t length, + const CAMELLIA_KEY *key, + unsigned char *ivec, + int *num, + const int enc); +OSSL_DEPRECATEDIN_3_0 void Camellia_cfb1_encrypt(const unsigned char *in, + unsigned char *out, + size_t length, + const CAMELLIA_KEY *key, + unsigned char *ivec, + int *num, + const int enc); +OSSL_DEPRECATEDIN_3_0 void Camellia_cfb8_encrypt(const unsigned char *in, + unsigned char *out, + size_t length, + const CAMELLIA_KEY *key, + unsigned char *ivec, + int *num, + const int enc); +OSSL_DEPRECATEDIN_3_0 void Camellia_ofb128_encrypt(const unsigned char *in, + unsigned char *out, + size_t length, + const CAMELLIA_KEY *key, + unsigned char *ivec, + int *num); +OSSL_DEPRECATEDIN_3_0 +void Camellia_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const CAMELLIA_KEY *key, + unsigned char ivec[CAMELLIA_BLOCK_SIZE], + unsigned char ecount_buf[CAMELLIA_BLOCK_SIZE], + unsigned int *num); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/cast.h b/OtherInc/openssl/include/openssl/cast.h new file mode 100644 index 0000000..0bf217b --- /dev/null +++ b/OtherInc/openssl/include/openssl/cast.h @@ -0,0 +1,71 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CAST_H +# define OPENSSL_CAST_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_CAST_H +# endif + +# include + +# ifndef OPENSSL_NO_CAST +# ifdef __cplusplus +extern "C" { +# endif + +# define CAST_BLOCK 8 +# define CAST_KEY_LENGTH 16 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 + +# define CAST_ENCRYPT 1 +# define CAST_DECRYPT 0 + +# define CAST_LONG unsigned int + +typedef struct cast_key_st { + CAST_LONG data[32]; + int short_key; /* Use reduced rounds for short key */ +} CAST_KEY; + +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data); +OSSL_DEPRECATEDIN_3_0 +void CAST_ecb_encrypt(const unsigned char *in, unsigned char *out, + const CAST_KEY *key, int enc); +OSSL_DEPRECATEDIN_3_0 +void CAST_encrypt(CAST_LONG *data, const CAST_KEY *key); +OSSL_DEPRECATEDIN_3_0 +void CAST_decrypt(CAST_LONG *data, const CAST_KEY *key); +OSSL_DEPRECATEDIN_3_0 +void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *ks, unsigned char *iv, + int enc); +OSSL_DEPRECATEDIN_3_0 +void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num, int enc); +OSSL_DEPRECATEDIN_3_0 +void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, const CAST_KEY *schedule, + unsigned char *ivec, int *num); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/cmac.h b/OtherInc/openssl/include/openssl/cmac.h new file mode 100644 index 0000000..f508618 --- /dev/null +++ b/OtherInc/openssl/include/openssl/cmac.h @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CMAC_H +# define OPENSSL_CMAC_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_CMAC_H +# endif + +# ifndef OPENSSL_NO_CMAC + +# ifdef __cplusplus +extern "C" { +# endif + +# include + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* Opaque */ +typedef struct CMAC_CTX_st CMAC_CTX; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 CMAC_CTX *CMAC_CTX_new(void); +OSSL_DEPRECATEDIN_3_0 void CMAC_CTX_cleanup(CMAC_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 void CMAC_CTX_free(CMAC_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in); +OSSL_DEPRECATEDIN_3_0 int CMAC_Init(CMAC_CTX *ctx, + const void *key, size_t keylen, + const EVP_CIPHER *cipher, ENGINE *impl); +OSSL_DEPRECATEDIN_3_0 int CMAC_Update(CMAC_CTX *ctx, + const void *data, size_t dlen); +OSSL_DEPRECATEDIN_3_0 int CMAC_Final(CMAC_CTX *ctx, + unsigned char *out, size_t *poutlen); +OSSL_DEPRECATEDIN_3_0 int CMAC_resume(CMAC_CTX *ctx); +# endif + +# ifdef __cplusplus +} +# endif + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/cmp.h b/OtherInc/openssl/include/openssl/cmp.h new file mode 100644 index 0000000..7f258dc --- /dev/null +++ b/OtherInc/openssl/include/openssl/cmp.h @@ -0,0 +1,592 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\cmp.h.in + * + * Copyright 2007-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright Nokia 2007-2019 + * Copyright Siemens AG 2015-2019 + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_CMP_H +# define OPENSSL_CMP_H + +# include +# ifndef OPENSSL_NO_CMP + +# include +# include +# include +# include + +/* explicit #includes not strictly needed since implied by the above: */ +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# define OSSL_CMP_PVNO 2 + +/*- + * PKIFailureInfo ::= BIT STRING { + * -- since we can fail in more than one way! + * -- More codes may be added in the future if/when required. + * badAlg (0), + * -- unrecognized or unsupported Algorithm Identifier + * badMessageCheck (1), + * -- integrity check failed (e.g., signature did not verify) + * badRequest (2), + * -- transaction not permitted or supported + * badTime (3), + * -- messageTime was not sufficiently close to the system time, + * -- as defined by local policy + * badCertId (4), + * -- no certificate could be found matching the provided criteria + * badDataFormat (5), + * -- the data submitted has the wrong format + * wrongAuthority (6), + * -- the authority indicated in the request is different from the + * -- one creating the response token + * incorrectData (7), + * -- the requester's data is incorrect (for notary services) + * missingTimeStamp (8), + * -- when the timestamp is missing but should be there + * -- (by policy) + * badPOP (9), + * -- the proof-of-possession failed + * certRevoked (10), + * -- the certificate has already been revoked + * certConfirmed (11), + * -- the certificate has already been confirmed + * wrongIntegrity (12), + * -- invalid integrity, password based instead of signature or + * -- vice versa + * badRecipientNonce (13), + * -- invalid recipient nonce, either missing or wrong value + * timeNotAvailable (14), + * -- the TSA's time source is not available + * unacceptedPolicy (15), + * -- the requested TSA policy is not supported by the TSA. + * unacceptedExtension (16), + * -- the requested extension is not supported by the TSA. + * addInfoNotAvailable (17), + * -- the additional information requested could not be + * -- understood or is not available + * badSenderNonce (18), + * -- invalid sender nonce, either missing or wrong size + * badCertTemplate (19), + * -- invalid cert. template or missing mandatory information + * signerNotTrusted (20), + * -- signer of the message unknown or not trusted + * transactionIdInUse (21), + * -- the transaction identifier is already in use + * unsupportedVersion (22), + * -- the version of the message is not supported + * notAuthorized (23), + * -- the sender was not authorized to make the preceding + * -- request or perform the preceding action + * systemUnavail (24), + * -- the request cannot be handled due to system unavailability + * systemFailure (25), + * -- the request cannot be handled due to system failure + * duplicateCertReq (26) + * -- certificate cannot be issued because a duplicate + * -- certificate already exists + * } + */ +# define OSSL_CMP_PKIFAILUREINFO_badAlg 0 +# define OSSL_CMP_PKIFAILUREINFO_badMessageCheck 1 +# define OSSL_CMP_PKIFAILUREINFO_badRequest 2 +# define OSSL_CMP_PKIFAILUREINFO_badTime 3 +# define OSSL_CMP_PKIFAILUREINFO_badCertId 4 +# define OSSL_CMP_PKIFAILUREINFO_badDataFormat 5 +# define OSSL_CMP_PKIFAILUREINFO_wrongAuthority 6 +# define OSSL_CMP_PKIFAILUREINFO_incorrectData 7 +# define OSSL_CMP_PKIFAILUREINFO_missingTimeStamp 8 +# define OSSL_CMP_PKIFAILUREINFO_badPOP 9 +# define OSSL_CMP_PKIFAILUREINFO_certRevoked 10 +# define OSSL_CMP_PKIFAILUREINFO_certConfirmed 11 +# define OSSL_CMP_PKIFAILUREINFO_wrongIntegrity 12 +# define OSSL_CMP_PKIFAILUREINFO_badRecipientNonce 13 +# define OSSL_CMP_PKIFAILUREINFO_timeNotAvailable 14 +# define OSSL_CMP_PKIFAILUREINFO_unacceptedPolicy 15 +# define OSSL_CMP_PKIFAILUREINFO_unacceptedExtension 16 +# define OSSL_CMP_PKIFAILUREINFO_addInfoNotAvailable 17 +# define OSSL_CMP_PKIFAILUREINFO_badSenderNonce 18 +# define OSSL_CMP_PKIFAILUREINFO_badCertTemplate 19 +# define OSSL_CMP_PKIFAILUREINFO_signerNotTrusted 20 +# define OSSL_CMP_PKIFAILUREINFO_transactionIdInUse 21 +# define OSSL_CMP_PKIFAILUREINFO_unsupportedVersion 22 +# define OSSL_CMP_PKIFAILUREINFO_notAuthorized 23 +# define OSSL_CMP_PKIFAILUREINFO_systemUnavail 24 +# define OSSL_CMP_PKIFAILUREINFO_systemFailure 25 +# define OSSL_CMP_PKIFAILUREINFO_duplicateCertReq 26 +# define OSSL_CMP_PKIFAILUREINFO_MAX 26 +# define OSSL_CMP_PKIFAILUREINFO_MAX_BIT_PATTERN \ + ((1 << (OSSL_CMP_PKIFAILUREINFO_MAX + 1)) - 1) +# if OSSL_CMP_PKIFAILUREINFO_MAX_BIT_PATTERN > INT_MAX +# error CMP_PKIFAILUREINFO_MAX bit pattern does not fit in type int +# endif + +typedef ASN1_BIT_STRING OSSL_CMP_PKIFAILUREINFO; + +# define OSSL_CMP_CTX_FAILINFO_badAlg (1 << 0) +# define OSSL_CMP_CTX_FAILINFO_badMessageCheck (1 << 1) +# define OSSL_CMP_CTX_FAILINFO_badRequest (1 << 2) +# define OSSL_CMP_CTX_FAILINFO_badTime (1 << 3) +# define OSSL_CMP_CTX_FAILINFO_badCertId (1 << 4) +# define OSSL_CMP_CTX_FAILINFO_badDataFormat (1 << 5) +# define OSSL_CMP_CTX_FAILINFO_wrongAuthority (1 << 6) +# define OSSL_CMP_CTX_FAILINFO_incorrectData (1 << 7) +# define OSSL_CMP_CTX_FAILINFO_missingTimeStamp (1 << 8) +# define OSSL_CMP_CTX_FAILINFO_badPOP (1 << 9) +# define OSSL_CMP_CTX_FAILINFO_certRevoked (1 << 10) +# define OSSL_CMP_CTX_FAILINFO_certConfirmed (1 << 11) +# define OSSL_CMP_CTX_FAILINFO_wrongIntegrity (1 << 12) +# define OSSL_CMP_CTX_FAILINFO_badRecipientNonce (1 << 13) +# define OSSL_CMP_CTX_FAILINFO_timeNotAvailable (1 << 14) +# define OSSL_CMP_CTX_FAILINFO_unacceptedPolicy (1 << 15) +# define OSSL_CMP_CTX_FAILINFO_unacceptedExtension (1 << 16) +# define OSSL_CMP_CTX_FAILINFO_addInfoNotAvailable (1 << 17) +# define OSSL_CMP_CTX_FAILINFO_badSenderNonce (1 << 18) +# define OSSL_CMP_CTX_FAILINFO_badCertTemplate (1 << 19) +# define OSSL_CMP_CTX_FAILINFO_signerNotTrusted (1 << 20) +# define OSSL_CMP_CTX_FAILINFO_transactionIdInUse (1 << 21) +# define OSSL_CMP_CTX_FAILINFO_unsupportedVersion (1 << 22) +# define OSSL_CMP_CTX_FAILINFO_notAuthorized (1 << 23) +# define OSSL_CMP_CTX_FAILINFO_systemUnavail (1 << 24) +# define OSSL_CMP_CTX_FAILINFO_systemFailure (1 << 25) +# define OSSL_CMP_CTX_FAILINFO_duplicateCertReq (1 << 26) + +/*- + * PKIStatus ::= INTEGER { + * accepted (0), + * -- you got exactly what you asked for + * grantedWithMods (1), + * -- you got something like what you asked for; the + * -- requester is responsible for ascertaining the differences + * rejection (2), + * -- you don't get it, more information elsewhere in the message + * waiting (3), + * -- the request body part has not yet been processed; expect to + * -- hear more later (note: proper handling of this status + * -- response MAY use the polling req/rep PKIMessages specified + * -- in Section 5.3.22; alternatively, polling in the underlying + * -- transport layer MAY have some utility in this regard) + * revocationWarning (4), + * -- this message contains a warning that a revocation is + * -- imminent + * revocationNotification (5), + * -- notification that a revocation has occurred + * keyUpdateWarning (6) + * -- update already done for the oldCertId specified in + * -- CertReqMsg + * } + */ +# define OSSL_CMP_PKISTATUS_accepted 0 +# define OSSL_CMP_PKISTATUS_grantedWithMods 1 +# define OSSL_CMP_PKISTATUS_rejection 2 +# define OSSL_CMP_PKISTATUS_waiting 3 +# define OSSL_CMP_PKISTATUS_revocationWarning 4 +# define OSSL_CMP_PKISTATUS_revocationNotification 5 +# define OSSL_CMP_PKISTATUS_keyUpdateWarning 6 + +typedef ASN1_INTEGER OSSL_CMP_PKISTATUS; +DECLARE_ASN1_ITEM(OSSL_CMP_PKISTATUS) + +# define OSSL_CMP_CERTORENCCERT_CERTIFICATE 0 +# define OSSL_CMP_CERTORENCCERT_ENCRYPTEDCERT 1 + +/* data type declarations */ +typedef struct ossl_cmp_ctx_st OSSL_CMP_CTX; +typedef struct ossl_cmp_pkiheader_st OSSL_CMP_PKIHEADER; +DECLARE_ASN1_FUNCTIONS(OSSL_CMP_PKIHEADER) +typedef struct ossl_cmp_msg_st OSSL_CMP_MSG; +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_MSG) +DECLARE_ASN1_ENCODE_FUNCTIONS(OSSL_CMP_MSG, OSSL_CMP_MSG, OSSL_CMP_MSG) +typedef struct ossl_cmp_certstatus_st OSSL_CMP_CERTSTATUS; +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTSTATUS, OSSL_CMP_CERTSTATUS, OSSL_CMP_CERTSTATUS) +#define sk_OSSL_CMP_CERTSTATUS_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_value(sk, idx) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTSTATUS_new(cmp) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTSTATUS_new_null() ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTSTATUS_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTSTATUS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTSTATUS_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_delete(sk, i) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTSTATUS_delete_ptr(sk, ptr) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr))) +#define sk_OSSL_CMP_CERTSTATUS_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_pop(sk) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_shift(sk) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk),ossl_check_OSSL_CMP_CERTSTATUS_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTSTATUS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTSTATUS_set(sk, idx, ptr) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr))) +#define sk_OSSL_CMP_CERTSTATUS_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr), pnum) +#define sk_OSSL_CMP_CERTSTATUS_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_dup(sk) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTSTATUS_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTSTATUS_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTSTATUS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp))) + +typedef struct ossl_cmp_itav_st OSSL_CMP_ITAV; +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_ITAV) +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_ITAV, OSSL_CMP_ITAV, OSSL_CMP_ITAV) +#define sk_OSSL_CMP_ITAV_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_value(sk, idx) ((OSSL_CMP_ITAV *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk), (idx))) +#define sk_OSSL_CMP_ITAV_new(cmp) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp))) +#define sk_OSSL_CMP_ITAV_new_null() ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_ITAV_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_ITAV_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (n)) +#define sk_OSSL_CMP_ITAV_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_delete(sk, i) ((OSSL_CMP_ITAV *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (i))) +#define sk_OSSL_CMP_ITAV_delete_ptr(sk, ptr) ((OSSL_CMP_ITAV *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr))) +#define sk_OSSL_CMP_ITAV_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_pop(sk) ((OSSL_CMP_ITAV *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_shift(sk) ((OSSL_CMP_ITAV *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_ITAV_sk_type(sk),ossl_check_OSSL_CMP_ITAV_freefunc_type(freefunc)) +#define sk_OSSL_CMP_ITAV_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr), (idx)) +#define sk_OSSL_CMP_ITAV_set(sk, idx, ptr) ((OSSL_CMP_ITAV *)OPENSSL_sk_set(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (idx), ossl_check_OSSL_CMP_ITAV_type(ptr))) +#define sk_OSSL_CMP_ITAV_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr), pnum) +#define sk_OSSL_CMP_ITAV_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_dup(sk) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_ITAV_freefunc_type(freefunc))) +#define sk_OSSL_CMP_ITAV_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_ITAV_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp))) + +typedef struct ossl_cmp_revrepcontent_st OSSL_CMP_REVREPCONTENT; +typedef struct ossl_cmp_pkisi_st OSSL_CMP_PKISI; +DECLARE_ASN1_FUNCTIONS(OSSL_CMP_PKISI) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_PKISI) +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_PKISI, OSSL_CMP_PKISI, OSSL_CMP_PKISI) +#define sk_OSSL_CMP_PKISI_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_value(sk, idx) ((OSSL_CMP_PKISI *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk), (idx))) +#define sk_OSSL_CMP_PKISI_new(cmp) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp))) +#define sk_OSSL_CMP_PKISI_new_null() ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_PKISI_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_PKISI_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (n)) +#define sk_OSSL_CMP_PKISI_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_delete(sk, i) ((OSSL_CMP_PKISI *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (i))) +#define sk_OSSL_CMP_PKISI_delete_ptr(sk, ptr) ((OSSL_CMP_PKISI *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr))) +#define sk_OSSL_CMP_PKISI_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_pop(sk) ((OSSL_CMP_PKISI *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_shift(sk) ((OSSL_CMP_PKISI *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_PKISI_sk_type(sk),ossl_check_OSSL_CMP_PKISI_freefunc_type(freefunc)) +#define sk_OSSL_CMP_PKISI_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr), (idx)) +#define sk_OSSL_CMP_PKISI_set(sk, idx, ptr) ((OSSL_CMP_PKISI *)OPENSSL_sk_set(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (idx), ossl_check_OSSL_CMP_PKISI_type(ptr))) +#define sk_OSSL_CMP_PKISI_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr), pnum) +#define sk_OSSL_CMP_PKISI_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_dup(sk) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_PKISI_freefunc_type(freefunc))) +#define sk_OSSL_CMP_PKISI_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_PKISI_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp))) + +typedef struct ossl_cmp_certrepmessage_st OSSL_CMP_CERTREPMESSAGE; +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTREPMESSAGE, OSSL_CMP_CERTREPMESSAGE, OSSL_CMP_CERTREPMESSAGE) +#define sk_OSSL_CMP_CERTREPMESSAGE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_value(sk, idx) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTREPMESSAGE_new(cmp) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTREPMESSAGE_new_null() ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTREPMESSAGE_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTREPMESSAGE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTREPMESSAGE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_delete(sk, i) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTREPMESSAGE_delete_ptr(sk, ptr) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr))) +#define sk_OSSL_CMP_CERTREPMESSAGE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_pop(sk) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_shift(sk) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk),ossl_check_OSSL_CMP_CERTREPMESSAGE_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTREPMESSAGE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTREPMESSAGE_set(sk, idx, ptr) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr))) +#define sk_OSSL_CMP_CERTREPMESSAGE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr), pnum) +#define sk_OSSL_CMP_CERTREPMESSAGE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_dup(sk) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTREPMESSAGE_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTREPMESSAGE_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTREPMESSAGE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp))) + +typedef struct ossl_cmp_pollrep_st OSSL_CMP_POLLREP; +typedef STACK_OF(OSSL_CMP_POLLREP) OSSL_CMP_POLLREPCONTENT; +typedef struct ossl_cmp_certresponse_st OSSL_CMP_CERTRESPONSE; +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTRESPONSE, OSSL_CMP_CERTRESPONSE, OSSL_CMP_CERTRESPONSE) +#define sk_OSSL_CMP_CERTRESPONSE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_value(sk, idx) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTRESPONSE_new(cmp) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTRESPONSE_new_null() ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTRESPONSE_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTRESPONSE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTRESPONSE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_delete(sk, i) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTRESPONSE_delete_ptr(sk, ptr) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr))) +#define sk_OSSL_CMP_CERTRESPONSE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_pop(sk) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_shift(sk) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk),ossl_check_OSSL_CMP_CERTRESPONSE_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTRESPONSE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTRESPONSE_set(sk, idx, ptr) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr))) +#define sk_OSSL_CMP_CERTRESPONSE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr), pnum) +#define sk_OSSL_CMP_CERTRESPONSE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_dup(sk) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTRESPONSE_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTRESPONSE_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTRESPONSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp))) + +typedef STACK_OF(ASN1_UTF8STRING) OSSL_CMP_PKIFREETEXT; + +/* + * function DECLARATIONS + */ + +/* from cmp_asn.c */ +OSSL_CMP_ITAV *OSSL_CMP_ITAV_create(ASN1_OBJECT *type, ASN1_TYPE *value); +void OSSL_CMP_ITAV_set0(OSSL_CMP_ITAV *itav, ASN1_OBJECT *type, + ASN1_TYPE *value); +ASN1_OBJECT *OSSL_CMP_ITAV_get0_type(const OSSL_CMP_ITAV *itav); +ASN1_TYPE *OSSL_CMP_ITAV_get0_value(const OSSL_CMP_ITAV *itav); +int OSSL_CMP_ITAV_push0_stack_item(STACK_OF(OSSL_CMP_ITAV) **itav_sk_p, + OSSL_CMP_ITAV *itav); +void OSSL_CMP_ITAV_free(OSSL_CMP_ITAV *itav); +void OSSL_CMP_MSG_free(OSSL_CMP_MSG *msg); + +/* from cmp_ctx.c */ +OSSL_CMP_CTX *OSSL_CMP_CTX_new(OSSL_LIB_CTX *libctx, const char *propq); +void OSSL_CMP_CTX_free(OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_reinit(OSSL_CMP_CTX *ctx); +/* CMP general options: */ +# define OSSL_CMP_OPT_LOG_VERBOSITY 0 +/* CMP transfer options: */ +# define OSSL_CMP_OPT_KEEP_ALIVE 10 +# define OSSL_CMP_OPT_MSG_TIMEOUT 11 +# define OSSL_CMP_OPT_TOTAL_TIMEOUT 12 +/* CMP request options: */ +# define OSSL_CMP_OPT_VALIDITY_DAYS 20 +# define OSSL_CMP_OPT_SUBJECTALTNAME_NODEFAULT 21 +# define OSSL_CMP_OPT_SUBJECTALTNAME_CRITICAL 22 +# define OSSL_CMP_OPT_POLICIES_CRITICAL 23 +# define OSSL_CMP_OPT_POPO_METHOD 24 +# define OSSL_CMP_OPT_IMPLICIT_CONFIRM 25 +# define OSSL_CMP_OPT_DISABLE_CONFIRM 26 +# define OSSL_CMP_OPT_REVOCATION_REASON 27 +/* CMP protection options: */ +# define OSSL_CMP_OPT_UNPROTECTED_SEND 30 +# define OSSL_CMP_OPT_UNPROTECTED_ERRORS 31 +# define OSSL_CMP_OPT_OWF_ALGNID 32 +# define OSSL_CMP_OPT_MAC_ALGNID 33 +# define OSSL_CMP_OPT_DIGEST_ALGNID 34 +# define OSSL_CMP_OPT_IGNORE_KEYUSAGE 35 +# define OSSL_CMP_OPT_PERMIT_TA_IN_EXTRACERTS_FOR_IR 36 +int OSSL_CMP_CTX_set_option(OSSL_CMP_CTX *ctx, int opt, int val); +int OSSL_CMP_CTX_get_option(const OSSL_CMP_CTX *ctx, int opt); +/* CMP-specific callback for logging and outputting the error queue: */ +int OSSL_CMP_CTX_set_log_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_log_cb_t cb); +# define OSSL_CMP_CTX_set_log_verbosity(ctx, level) \ + OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_LOG_VERBOSITY, level) +void OSSL_CMP_CTX_print_errors(const OSSL_CMP_CTX *ctx); +/* message transfer: */ +int OSSL_CMP_CTX_set1_serverPath(OSSL_CMP_CTX *ctx, const char *path); +int OSSL_CMP_CTX_set1_server(OSSL_CMP_CTX *ctx, const char *address); +int OSSL_CMP_CTX_set_serverPort(OSSL_CMP_CTX *ctx, int port); +int OSSL_CMP_CTX_set1_proxy(OSSL_CMP_CTX *ctx, const char *name); +int OSSL_CMP_CTX_set1_no_proxy(OSSL_CMP_CTX *ctx, const char *names); +int OSSL_CMP_CTX_set_http_cb(OSSL_CMP_CTX *ctx, OSSL_HTTP_bio_cb_t cb); +int OSSL_CMP_CTX_set_http_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_http_cb_arg(const OSSL_CMP_CTX *ctx); +typedef OSSL_CMP_MSG *(*OSSL_CMP_transfer_cb_t) (OSSL_CMP_CTX *ctx, + const OSSL_CMP_MSG *req); +int OSSL_CMP_CTX_set_transfer_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_transfer_cb_t cb); +int OSSL_CMP_CTX_set_transfer_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_transfer_cb_arg(const OSSL_CMP_CTX *ctx); +/* server authentication: */ +int OSSL_CMP_CTX_set1_srvCert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_set1_expected_sender(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_set0_trustedStore(OSSL_CMP_CTX *ctx, X509_STORE *store); +X509_STORE *OSSL_CMP_CTX_get0_trustedStore(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_set1_untrusted(OSSL_CMP_CTX *ctx, STACK_OF(X509) *certs); +STACK_OF(X509) *OSSL_CMP_CTX_get0_untrusted(const OSSL_CMP_CTX *ctx); +/* client authentication: */ +int OSSL_CMP_CTX_set1_cert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_build_cert_chain(OSSL_CMP_CTX *ctx, X509_STORE *own_trusted, + STACK_OF(X509) *candidates); +int OSSL_CMP_CTX_set1_pkey(OSSL_CMP_CTX *ctx, EVP_PKEY *pkey); +int OSSL_CMP_CTX_set1_referenceValue(OSSL_CMP_CTX *ctx, + const unsigned char *ref, int len); +int OSSL_CMP_CTX_set1_secretValue(OSSL_CMP_CTX *ctx, const unsigned char *sec, + const int len); +/* CMP message header and extra certificates: */ +int OSSL_CMP_CTX_set1_recipient(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_push0_geninfo_ITAV(OSSL_CMP_CTX *ctx, OSSL_CMP_ITAV *itav); +int OSSL_CMP_CTX_set1_extraCertsOut(OSSL_CMP_CTX *ctx, + STACK_OF(X509) *extraCertsOut); +/* certificate template: */ +int OSSL_CMP_CTX_set0_newPkey(OSSL_CMP_CTX *ctx, int priv, EVP_PKEY *pkey); +EVP_PKEY *OSSL_CMP_CTX_get0_newPkey(const OSSL_CMP_CTX *ctx, int priv); +int OSSL_CMP_CTX_set1_issuer(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_set1_subjectName(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_push1_subjectAltName(OSSL_CMP_CTX *ctx, + const GENERAL_NAME *name); +int OSSL_CMP_CTX_set0_reqExtensions(OSSL_CMP_CTX *ctx, X509_EXTENSIONS *exts); +int OSSL_CMP_CTX_reqExtensions_have_SAN(OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_push0_policy(OSSL_CMP_CTX *ctx, POLICYINFO *pinfo); +int OSSL_CMP_CTX_set1_oldCert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_set1_p10CSR(OSSL_CMP_CTX *ctx, const X509_REQ *csr); +/* misc body contents: */ +int OSSL_CMP_CTX_push0_genm_ITAV(OSSL_CMP_CTX *ctx, OSSL_CMP_ITAV *itav); +/* certificate confirmation: */ +typedef int (*OSSL_CMP_certConf_cb_t) (OSSL_CMP_CTX *ctx, X509 *cert, + int fail_info, const char **txt); +int OSSL_CMP_certConf_cb(OSSL_CMP_CTX *ctx, X509 *cert, int fail_info, + const char **text); +int OSSL_CMP_CTX_set_certConf_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_certConf_cb_t cb); +int OSSL_CMP_CTX_set_certConf_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_certConf_cb_arg(const OSSL_CMP_CTX *ctx); +/* result fetching: */ +int OSSL_CMP_CTX_get_status(const OSSL_CMP_CTX *ctx); +OSSL_CMP_PKIFREETEXT *OSSL_CMP_CTX_get0_statusString(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_get_failInfoCode(const OSSL_CMP_CTX *ctx); +# define OSSL_CMP_PKISI_BUFLEN 1024 +X509 *OSSL_CMP_CTX_get0_newCert(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_newChain(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_caPubs(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_extraCertsIn(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_set1_transactionID(OSSL_CMP_CTX *ctx, + const ASN1_OCTET_STRING *id); +int OSSL_CMP_CTX_set1_senderNonce(OSSL_CMP_CTX *ctx, + const ASN1_OCTET_STRING *nonce); + +/* from cmp_status.c */ +char *OSSL_CMP_CTX_snprint_PKIStatus(const OSSL_CMP_CTX *ctx, char *buf, + size_t bufsize); +char *OSSL_CMP_snprint_PKIStatusInfo(const OSSL_CMP_PKISI *statusInfo, + char *buf, size_t bufsize); +OSSL_CMP_PKISI * +OSSL_CMP_STATUSINFO_new(int status, int fail_info, const char *text); + +/* from cmp_hdr.c */ +ASN1_OCTET_STRING *OSSL_CMP_HDR_get0_transactionID(const + OSSL_CMP_PKIHEADER *hdr); +ASN1_OCTET_STRING *OSSL_CMP_HDR_get0_recipNonce(const OSSL_CMP_PKIHEADER *hdr); + +/* from cmp_msg.c */ +OSSL_CMP_PKIHEADER *OSSL_CMP_MSG_get0_header(const OSSL_CMP_MSG *msg); +int OSSL_CMP_MSG_get_bodytype(const OSSL_CMP_MSG *msg); +int OSSL_CMP_MSG_update_transactionID(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg); +OSSL_CRMF_MSG *OSSL_CMP_CTX_setup_CRM(OSSL_CMP_CTX *ctx, int for_KUR, int rid); +OSSL_CMP_MSG *OSSL_CMP_MSG_read(const char *file, OSSL_LIB_CTX *libctx, + const char *propq); +int OSSL_CMP_MSG_write(const char *file, const OSSL_CMP_MSG *msg); +OSSL_CMP_MSG *d2i_OSSL_CMP_MSG_bio(BIO *bio, OSSL_CMP_MSG **msg); +int i2d_OSSL_CMP_MSG_bio(BIO *bio, const OSSL_CMP_MSG *msg); + +/* from cmp_vfy.c */ +int OSSL_CMP_validate_msg(OSSL_CMP_CTX *ctx, const OSSL_CMP_MSG *msg); +int OSSL_CMP_validate_cert_path(const OSSL_CMP_CTX *ctx, + X509_STORE *trusted_store, X509 *cert); + +/* from cmp_http.c */ +OSSL_CMP_MSG *OSSL_CMP_MSG_http_perform(OSSL_CMP_CTX *ctx, + const OSSL_CMP_MSG *req); + +/* from cmp_server.c */ +typedef struct ossl_cmp_srv_ctx_st OSSL_CMP_SRV_CTX; +OSSL_CMP_MSG *OSSL_CMP_SRV_process_request(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req); +OSSL_CMP_MSG * OSSL_CMP_CTX_server_perform(OSSL_CMP_CTX *client_ctx, + const OSSL_CMP_MSG *req); +OSSL_CMP_SRV_CTX *OSSL_CMP_SRV_CTX_new(OSSL_LIB_CTX *libctx, const char *propq); +void OSSL_CMP_SRV_CTX_free(OSSL_CMP_SRV_CTX *srv_ctx); +typedef OSSL_CMP_PKISI *(*OSSL_CMP_SRV_cert_request_cb_t) + (OSSL_CMP_SRV_CTX *srv_ctx, const OSSL_CMP_MSG *req, int certReqId, + const OSSL_CRMF_MSG *crm, const X509_REQ *p10cr, + X509 **certOut, STACK_OF(X509) **chainOut, STACK_OF(X509) **caPubs); +typedef OSSL_CMP_PKISI *(*OSSL_CMP_SRV_rr_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const X509_NAME *issuer, + const ASN1_INTEGER *serial); +typedef int (*OSSL_CMP_SRV_genm_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const STACK_OF(OSSL_CMP_ITAV) *in, + STACK_OF(OSSL_CMP_ITAV) **out); +typedef void (*OSSL_CMP_SRV_error_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const OSSL_CMP_PKISI *statusInfo, + const ASN1_INTEGER *errorCode, + const OSSL_CMP_PKIFREETEXT *errDetails); +typedef int (*OSSL_CMP_SRV_certConf_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + int certReqId, + const ASN1_OCTET_STRING *certHash, + const OSSL_CMP_PKISI *si); +typedef int (*OSSL_CMP_SRV_pollReq_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, int certReqId, + OSSL_CMP_MSG **certReq, + int64_t *check_after); +int OSSL_CMP_SRV_CTX_init(OSSL_CMP_SRV_CTX *srv_ctx, void *custom_ctx, + OSSL_CMP_SRV_cert_request_cb_t process_cert_request, + OSSL_CMP_SRV_rr_cb_t process_rr, + OSSL_CMP_SRV_genm_cb_t process_genm, + OSSL_CMP_SRV_error_cb_t process_error, + OSSL_CMP_SRV_certConf_cb_t process_certConf, + OSSL_CMP_SRV_pollReq_cb_t process_pollReq); +OSSL_CMP_CTX *OSSL_CMP_SRV_CTX_get0_cmp_ctx(const OSSL_CMP_SRV_CTX *srv_ctx); +void *OSSL_CMP_SRV_CTX_get0_custom_ctx(const OSSL_CMP_SRV_CTX *srv_ctx); +int OSSL_CMP_SRV_CTX_set_send_unprotected_errors(OSSL_CMP_SRV_CTX *srv_ctx, + int val); +int OSSL_CMP_SRV_CTX_set_accept_unprotected(OSSL_CMP_SRV_CTX *srv_ctx, int val); +int OSSL_CMP_SRV_CTX_set_accept_raverified(OSSL_CMP_SRV_CTX *srv_ctx, int val); +int OSSL_CMP_SRV_CTX_set_grant_implicit_confirm(OSSL_CMP_SRV_CTX *srv_ctx, + int val); + +/* from cmp_client.c */ +X509 *OSSL_CMP_exec_certreq(OSSL_CMP_CTX *ctx, int req_type, + const OSSL_CRMF_MSG *crm); +# define OSSL_CMP_IR 0 +# define OSSL_CMP_CR 2 +# define OSSL_CMP_P10CR 4 +# define OSSL_CMP_KUR 7 +# define OSSL_CMP_exec_IR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_IR, NULL) +# define OSSL_CMP_exec_CR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_CR, NULL) +# define OSSL_CMP_exec_P10CR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_P10CR, NULL) +# define OSSL_CMP_exec_KUR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_KUR, NULL) +int OSSL_CMP_try_certreq(OSSL_CMP_CTX *ctx, int req_type, + const OSSL_CRMF_MSG *crm, int *checkAfter); +int OSSL_CMP_exec_RR_ses(OSSL_CMP_CTX *ctx); +STACK_OF(OSSL_CMP_ITAV) *OSSL_CMP_exec_GENM_ses(OSSL_CMP_CTX *ctx); + +# ifdef __cplusplus +} +# endif +# endif /* !defined(OPENSSL_NO_CMP) */ +#endif /* !defined(OPENSSL_CMP_H) */ diff --git a/OtherInc/openssl/include/openssl/cmp_util.h b/OtherInc/openssl/include/openssl/cmp_util.h new file mode 100644 index 0000000..9a16892 --- /dev/null +++ b/OtherInc/openssl/include/openssl/cmp_util.h @@ -0,0 +1,56 @@ +/* + * Copyright 2007-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright Nokia 2007-2019 + * Copyright Siemens AG 2015-2019 + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CMP_UTIL_H +# define OPENSSL_CMP_UTIL_H +# pragma once + +# include +# ifndef OPENSSL_NO_CMP + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +int OSSL_CMP_log_open(void); +void OSSL_CMP_log_close(void); +# define OSSL_CMP_LOG_PREFIX "CMP " + +/* + * generalized logging/error callback mirroring the severity levels of syslog.h + */ +typedef int OSSL_CMP_severity; +# define OSSL_CMP_LOG_EMERG 0 +# define OSSL_CMP_LOG_ALERT 1 +# define OSSL_CMP_LOG_CRIT 2 +# define OSSL_CMP_LOG_ERR 3 +# define OSSL_CMP_LOG_WARNING 4 +# define OSSL_CMP_LOG_NOTICE 5 +# define OSSL_CMP_LOG_INFO 6 +# define OSSL_CMP_LOG_DEBUG 7 +# define OSSL_CMP_LOG_TRACE 8 +# define OSSL_CMP_LOG_MAX OSSL_CMP_LOG_TRACE +typedef int (*OSSL_CMP_log_cb_t)(const char *func, const char *file, int line, + OSSL_CMP_severity level, const char *msg); + +int OSSL_CMP_print_to_bio(BIO *bio, const char *component, const char *file, + int line, OSSL_CMP_severity level, const char *msg); +/* use of the logging callback for outputting error queue */ +void OSSL_CMP_print_errors_cb(OSSL_CMP_log_cb_t log_fn); + +# ifdef __cplusplus +} +# endif +# endif /* !defined(OPENSSL_NO_CMP) */ +#endif /* !defined(OPENSSL_CMP_UTIL_H) */ diff --git a/OtherInc/openssl/include/openssl/cmperr.h b/OtherInc/openssl/include/openssl/cmperr.h new file mode 100644 index 0000000..3a26fd0 --- /dev/null +++ b/OtherInc/openssl/include/openssl/cmperr.h @@ -0,0 +1,112 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CMPERR_H +# define OPENSSL_CMPERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_CMP + + +/* + * CMP reason codes. + */ +# define CMP_R_ALGORITHM_NOT_SUPPORTED 139 +# define CMP_R_BAD_CHECKAFTER_IN_POLLREP 167 +# define CMP_R_BAD_REQUEST_ID 108 +# define CMP_R_CERTHASH_UNMATCHED 156 +# define CMP_R_CERTID_NOT_FOUND 109 +# define CMP_R_CERTIFICATE_NOT_ACCEPTED 169 +# define CMP_R_CERTIFICATE_NOT_FOUND 112 +# define CMP_R_CERTREQMSG_NOT_FOUND 157 +# define CMP_R_CERTRESPONSE_NOT_FOUND 113 +# define CMP_R_CERT_AND_KEY_DO_NOT_MATCH 114 +# define CMP_R_CHECKAFTER_OUT_OF_RANGE 181 +# define CMP_R_ENCOUNTERED_KEYUPDATEWARNING 176 +# define CMP_R_ENCOUNTERED_WAITING 162 +# define CMP_R_ERROR_CALCULATING_PROTECTION 115 +# define CMP_R_ERROR_CREATING_CERTCONF 116 +# define CMP_R_ERROR_CREATING_CERTREP 117 +# define CMP_R_ERROR_CREATING_CERTREQ 163 +# define CMP_R_ERROR_CREATING_ERROR 118 +# define CMP_R_ERROR_CREATING_GENM 119 +# define CMP_R_ERROR_CREATING_GENP 120 +# define CMP_R_ERROR_CREATING_PKICONF 122 +# define CMP_R_ERROR_CREATING_POLLREP 123 +# define CMP_R_ERROR_CREATING_POLLREQ 124 +# define CMP_R_ERROR_CREATING_RP 125 +# define CMP_R_ERROR_CREATING_RR 126 +# define CMP_R_ERROR_PARSING_PKISTATUS 107 +# define CMP_R_ERROR_PROCESSING_MESSAGE 158 +# define CMP_R_ERROR_PROTECTING_MESSAGE 127 +# define CMP_R_ERROR_SETTING_CERTHASH 128 +# define CMP_R_ERROR_UNEXPECTED_CERTCONF 160 +# define CMP_R_ERROR_VALIDATING_PROTECTION 140 +# define CMP_R_ERROR_VALIDATING_SIGNATURE 171 +# define CMP_R_FAILED_BUILDING_OWN_CHAIN 164 +# define CMP_R_FAILED_EXTRACTING_PUBKEY 141 +# define CMP_R_FAILURE_OBTAINING_RANDOM 110 +# define CMP_R_FAIL_INFO_OUT_OF_RANGE 129 +# define CMP_R_INVALID_ARGS 100 +# define CMP_R_INVALID_OPTION 174 +# define CMP_R_MISSING_CERTID 165 +# define CMP_R_MISSING_KEY_INPUT_FOR_CREATING_PROTECTION 130 +# define CMP_R_MISSING_KEY_USAGE_DIGITALSIGNATURE 142 +# define CMP_R_MISSING_P10CSR 121 +# define CMP_R_MISSING_PBM_SECRET 166 +# define CMP_R_MISSING_PRIVATE_KEY 131 +# define CMP_R_MISSING_PROTECTION 143 +# define CMP_R_MISSING_REFERENCE_CERT 168 +# define CMP_R_MISSING_SENDER_IDENTIFICATION 111 +# define CMP_R_MISSING_TRUST_STORE 144 +# define CMP_R_MULTIPLE_REQUESTS_NOT_SUPPORTED 161 +# define CMP_R_MULTIPLE_RESPONSES_NOT_SUPPORTED 170 +# define CMP_R_MULTIPLE_SAN_SOURCES 102 +# define CMP_R_NO_STDIO 194 +# define CMP_R_NO_SUITABLE_SENDER_CERT 145 +# define CMP_R_NULL_ARGUMENT 103 +# define CMP_R_PKIBODY_ERROR 146 +# define CMP_R_PKISTATUSINFO_NOT_FOUND 132 +# define CMP_R_POLLING_FAILED 172 +# define CMP_R_POTENTIALLY_INVALID_CERTIFICATE 147 +# define CMP_R_RECEIVED_ERROR 180 +# define CMP_R_RECIPNONCE_UNMATCHED 148 +# define CMP_R_REQUEST_NOT_ACCEPTED 149 +# define CMP_R_REQUEST_REJECTED_BY_SERVER 182 +# define CMP_R_SENDER_GENERALNAME_TYPE_NOT_SUPPORTED 150 +# define CMP_R_SRVCERT_DOES_NOT_VALIDATE_MSG 151 +# define CMP_R_TOTAL_TIMEOUT 184 +# define CMP_R_TRANSACTIONID_UNMATCHED 152 +# define CMP_R_TRANSFER_ERROR 159 +# define CMP_R_UNEXPECTED_PKIBODY 133 +# define CMP_R_UNEXPECTED_PKISTATUS 185 +# define CMP_R_UNEXPECTED_PVNO 153 +# define CMP_R_UNKNOWN_ALGORITHM_ID 134 +# define CMP_R_UNKNOWN_CERT_TYPE 135 +# define CMP_R_UNKNOWN_PKISTATUS 186 +# define CMP_R_UNSUPPORTED_ALGORITHM 136 +# define CMP_R_UNSUPPORTED_KEY_TYPE 137 +# define CMP_R_UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC 154 +# define CMP_R_VALUE_TOO_LARGE 175 +# define CMP_R_VALUE_TOO_SMALL 177 +# define CMP_R_WRONG_ALGORITHM_OID 138 +# define CMP_R_WRONG_CERTID 189 +# define CMP_R_WRONG_CERTID_IN_RP 187 +# define CMP_R_WRONG_PBM_VALUE 155 +# define CMP_R_WRONG_RP_COMPONENT_COUNT 188 +# define CMP_R_WRONG_SERIAL_IN_RP 173 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/cms.h b/OtherInc/openssl/include/openssl/cms.h new file mode 100644 index 0000000..5b907f2 --- /dev/null +++ b/OtherInc/openssl/include/openssl/cms.h @@ -0,0 +1,493 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\cms.h.in + * + * Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_CMS_H +# define OPENSSL_CMS_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_CMS_H +# endif + +# include + +# ifndef OPENSSL_NO_CMS +# include +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct CMS_ContentInfo_st CMS_ContentInfo; +typedef struct CMS_SignerInfo_st CMS_SignerInfo; +typedef struct CMS_CertificateChoices CMS_CertificateChoices; +typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; +typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; +typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; +typedef struct CMS_Receipt_st CMS_Receipt; +typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; +typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; + +SKM_DEFINE_STACK_OF_INTERNAL(CMS_SignerInfo, CMS_SignerInfo, CMS_SignerInfo) +#define sk_CMS_SignerInfo_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_value(sk, idx) ((CMS_SignerInfo *)OPENSSL_sk_value(ossl_check_const_CMS_SignerInfo_sk_type(sk), (idx))) +#define sk_CMS_SignerInfo_new(cmp) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new(ossl_check_CMS_SignerInfo_compfunc_type(cmp))) +#define sk_CMS_SignerInfo_new_null() ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new_null()) +#define sk_CMS_SignerInfo_new_reserve(cmp, n) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new_reserve(ossl_check_CMS_SignerInfo_compfunc_type(cmp), (n))) +#define sk_CMS_SignerInfo_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_SignerInfo_sk_type(sk), (n)) +#define sk_CMS_SignerInfo_free(sk) OPENSSL_sk_free(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_delete(sk, i) ((CMS_SignerInfo *)OPENSSL_sk_delete(ossl_check_CMS_SignerInfo_sk_type(sk), (i))) +#define sk_CMS_SignerInfo_delete_ptr(sk, ptr) ((CMS_SignerInfo *)OPENSSL_sk_delete_ptr(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr))) +#define sk_CMS_SignerInfo_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_pop(sk) ((CMS_SignerInfo *)OPENSSL_sk_pop(ossl_check_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_shift(sk) ((CMS_SignerInfo *)OPENSSL_sk_shift(ossl_check_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_SignerInfo_sk_type(sk),ossl_check_CMS_SignerInfo_freefunc_type(freefunc)) +#define sk_CMS_SignerInfo_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr), (idx)) +#define sk_CMS_SignerInfo_set(sk, idx, ptr) ((CMS_SignerInfo *)OPENSSL_sk_set(ossl_check_CMS_SignerInfo_sk_type(sk), (idx), ossl_check_CMS_SignerInfo_type(ptr))) +#define sk_CMS_SignerInfo_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr), pnum) +#define sk_CMS_SignerInfo_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_dup(sk) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_dup(ossl_check_const_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_copyfunc_type(copyfunc), ossl_check_CMS_SignerInfo_freefunc_type(freefunc))) +#define sk_CMS_SignerInfo_set_cmp_func(sk, cmp) ((sk_CMS_SignerInfo_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RecipientEncryptedKey, CMS_RecipientEncryptedKey, CMS_RecipientEncryptedKey) +#define sk_CMS_RecipientEncryptedKey_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_value(sk, idx) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_value(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk), (idx))) +#define sk_CMS_RecipientEncryptedKey_new(cmp) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new(ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp))) +#define sk_CMS_RecipientEncryptedKey_new_null() ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new_null()) +#define sk_CMS_RecipientEncryptedKey_new_reserve(cmp, n) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp), (n))) +#define sk_CMS_RecipientEncryptedKey_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (n)) +#define sk_CMS_RecipientEncryptedKey_free(sk) OPENSSL_sk_free(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_delete(sk, i) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_delete(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (i))) +#define sk_CMS_RecipientEncryptedKey_delete_ptr(sk, ptr) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr))) +#define sk_CMS_RecipientEncryptedKey_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_pop(sk) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_pop(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_shift(sk) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_shift(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk),ossl_check_CMS_RecipientEncryptedKey_freefunc_type(freefunc)) +#define sk_CMS_RecipientEncryptedKey_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr), (idx)) +#define sk_CMS_RecipientEncryptedKey_set(sk, idx, ptr) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_set(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (idx), ossl_check_CMS_RecipientEncryptedKey_type(ptr))) +#define sk_CMS_RecipientEncryptedKey_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr), pnum) +#define sk_CMS_RecipientEncryptedKey_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_dup(sk) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_dup(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_copyfunc_type(copyfunc), ossl_check_CMS_RecipientEncryptedKey_freefunc_type(freefunc))) +#define sk_CMS_RecipientEncryptedKey_set_cmp_func(sk, cmp) ((sk_CMS_RecipientEncryptedKey_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RecipientInfo, CMS_RecipientInfo, CMS_RecipientInfo) +#define sk_CMS_RecipientInfo_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_value(sk, idx) ((CMS_RecipientInfo *)OPENSSL_sk_value(ossl_check_const_CMS_RecipientInfo_sk_type(sk), (idx))) +#define sk_CMS_RecipientInfo_new(cmp) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new(ossl_check_CMS_RecipientInfo_compfunc_type(cmp))) +#define sk_CMS_RecipientInfo_new_null() ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new_null()) +#define sk_CMS_RecipientInfo_new_reserve(cmp, n) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RecipientInfo_compfunc_type(cmp), (n))) +#define sk_CMS_RecipientInfo_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RecipientInfo_sk_type(sk), (n)) +#define sk_CMS_RecipientInfo_free(sk) OPENSSL_sk_free(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_delete(sk, i) ((CMS_RecipientInfo *)OPENSSL_sk_delete(ossl_check_CMS_RecipientInfo_sk_type(sk), (i))) +#define sk_CMS_RecipientInfo_delete_ptr(sk, ptr) ((CMS_RecipientInfo *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr))) +#define sk_CMS_RecipientInfo_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_pop(sk) ((CMS_RecipientInfo *)OPENSSL_sk_pop(ossl_check_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_shift(sk) ((CMS_RecipientInfo *)OPENSSL_sk_shift(ossl_check_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RecipientInfo_sk_type(sk),ossl_check_CMS_RecipientInfo_freefunc_type(freefunc)) +#define sk_CMS_RecipientInfo_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr), (idx)) +#define sk_CMS_RecipientInfo_set(sk, idx, ptr) ((CMS_RecipientInfo *)OPENSSL_sk_set(ossl_check_CMS_RecipientInfo_sk_type(sk), (idx), ossl_check_CMS_RecipientInfo_type(ptr))) +#define sk_CMS_RecipientInfo_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr), pnum) +#define sk_CMS_RecipientInfo_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_dup(sk) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_dup(ossl_check_const_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_copyfunc_type(copyfunc), ossl_check_CMS_RecipientInfo_freefunc_type(freefunc))) +#define sk_CMS_RecipientInfo_set_cmp_func(sk, cmp) ((sk_CMS_RecipientInfo_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RevocationInfoChoice, CMS_RevocationInfoChoice, CMS_RevocationInfoChoice) +#define sk_CMS_RevocationInfoChoice_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_value(sk, idx) ((CMS_RevocationInfoChoice *)OPENSSL_sk_value(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk), (idx))) +#define sk_CMS_RevocationInfoChoice_new(cmp) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new(ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp))) +#define sk_CMS_RevocationInfoChoice_new_null() ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new_null()) +#define sk_CMS_RevocationInfoChoice_new_reserve(cmp, n) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp), (n))) +#define sk_CMS_RevocationInfoChoice_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (n)) +#define sk_CMS_RevocationInfoChoice_free(sk) OPENSSL_sk_free(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_delete(sk, i) ((CMS_RevocationInfoChoice *)OPENSSL_sk_delete(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (i))) +#define sk_CMS_RevocationInfoChoice_delete_ptr(sk, ptr) ((CMS_RevocationInfoChoice *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr))) +#define sk_CMS_RevocationInfoChoice_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_pop(sk) ((CMS_RevocationInfoChoice *)OPENSSL_sk_pop(ossl_check_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_shift(sk) ((CMS_RevocationInfoChoice *)OPENSSL_sk_shift(ossl_check_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RevocationInfoChoice_sk_type(sk),ossl_check_CMS_RevocationInfoChoice_freefunc_type(freefunc)) +#define sk_CMS_RevocationInfoChoice_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr), (idx)) +#define sk_CMS_RevocationInfoChoice_set(sk, idx, ptr) ((CMS_RevocationInfoChoice *)OPENSSL_sk_set(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (idx), ossl_check_CMS_RevocationInfoChoice_type(ptr))) +#define sk_CMS_RevocationInfoChoice_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr), pnum) +#define sk_CMS_RevocationInfoChoice_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_dup(sk) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_dup(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_copyfunc_type(copyfunc), ossl_check_CMS_RevocationInfoChoice_freefunc_type(freefunc))) +#define sk_CMS_RevocationInfoChoice_set_cmp_func(sk, cmp) ((sk_CMS_RevocationInfoChoice_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp))) + + +DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) +DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) +DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) + +CMS_ContentInfo *CMS_ContentInfo_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +# define CMS_SIGNERINFO_ISSUER_SERIAL 0 +# define CMS_SIGNERINFO_KEYIDENTIFIER 1 + +# define CMS_RECIPINFO_NONE -1 +# define CMS_RECIPINFO_TRANS 0 +# define CMS_RECIPINFO_AGREE 1 +# define CMS_RECIPINFO_KEK 2 +# define CMS_RECIPINFO_PASS 3 +# define CMS_RECIPINFO_OTHER 4 + +/* S/MIME related flags */ + +# define CMS_TEXT 0x1 +# define CMS_NOCERTS 0x2 +# define CMS_NO_CONTENT_VERIFY 0x4 +# define CMS_NO_ATTR_VERIFY 0x8 +# define CMS_NOSIGS \ + (CMS_NO_CONTENT_VERIFY|CMS_NO_ATTR_VERIFY) +# define CMS_NOINTERN 0x10 +# define CMS_NO_SIGNER_CERT_VERIFY 0x20 +# define CMS_NOVERIFY 0x20 +# define CMS_DETACHED 0x40 +# define CMS_BINARY 0x80 +# define CMS_NOATTR 0x100 +# define CMS_NOSMIMECAP 0x200 +# define CMS_NOOLDMIMETYPE 0x400 +# define CMS_CRLFEOL 0x800 +# define CMS_STREAM 0x1000 +# define CMS_NOCRL 0x2000 +# define CMS_PARTIAL 0x4000 +# define CMS_REUSE_DIGEST 0x8000 +# define CMS_USE_KEYID 0x10000 +# define CMS_DEBUG_DECRYPT 0x20000 +# define CMS_KEY_PARAM 0x40000 +# define CMS_ASCIICRLF 0x80000 +# define CMS_CADES 0x100000 +# define CMS_USE_ORIGINATOR_KEYID 0x200000 + +const ASN1_OBJECT *CMS_get0_type(const CMS_ContentInfo *cms); + +BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont); +int CMS_dataFinal(CMS_ContentInfo *cms, BIO *bio); + +ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms); +int CMS_is_detached(CMS_ContentInfo *cms); +int CMS_set_detached(CMS_ContentInfo *cms, int detached); + +# ifdef OPENSSL_PEM_H +DECLARE_PEM_rw(CMS, CMS_ContentInfo) +# endif +int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); +CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); +int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); + +BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); +int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); +int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, + int flags); +CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); +CMS_ContentInfo *SMIME_read_CMS_ex(BIO *bio, int flags, BIO **bcont, CMS_ContentInfo **ci); +int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); + +int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, + unsigned int flags); + +CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags); +CMS_ContentInfo *CMS_sign_ex(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags, OSSL_LIB_CTX *ctx, + const char *propq); + +CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, + X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, unsigned int flags); + +int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); +CMS_ContentInfo *CMS_data_create_ex(BIO *in, unsigned int flags, + OSSL_LIB_CTX *ctx, const char *propq); + +int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create_ex(BIO *in, const EVP_MD *md, + unsigned int flags, OSSL_LIB_CTX *ctx, + const char *propq); + +int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, + const unsigned char *key, size_t keylen, + BIO *dcont, BIO *out, unsigned int flags); + +CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags); +CMS_ContentInfo *CMS_EncryptedData_encrypt_ex(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags, + OSSL_LIB_CTX *ctx, + const char *propq); + +int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, + const unsigned char *key, size_t keylen); + +int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); + +int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, + STACK_OF(X509) *certs, + X509_STORE *store, unsigned int flags); + +STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); + +CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags); +CMS_ContentInfo *CMS_encrypt_ex(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags, + OSSL_LIB_CTX *ctx, const char *propq); + +int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, + BIO *dcont, BIO *out, unsigned int flags); + +int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); +int CMS_decrypt_set1_pkey_and_peer(CMS_ContentInfo *cms, EVP_PKEY *pk, + X509 *cert, X509 *peer); +int CMS_decrypt_set1_key(CMS_ContentInfo *cms, + unsigned char *key, size_t keylen, + const unsigned char *id, size_t idlen); +int CMS_decrypt_set1_password(CMS_ContentInfo *cms, + unsigned char *pass, ossl_ssize_t passlen); + +STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); +int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); +EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); +CMS_ContentInfo *CMS_AuthEnvelopedData_create(const EVP_CIPHER *cipher); +CMS_ContentInfo * +CMS_AuthEnvelopedData_create_ex(const EVP_CIPHER *cipher, OSSL_LIB_CTX *ctx, + const char *propq); +CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); +CMS_ContentInfo *CMS_EnvelopedData_create_ex(const EVP_CIPHER *cipher, + OSSL_LIB_CTX *ctx, + const char *propq); + +CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, + X509 *recip, unsigned int flags); +CMS_RecipientInfo *CMS_add1_recipient(CMS_ContentInfo *cms, X509 *recip, + EVP_PKEY *originatorPrivKey, X509 * originator, unsigned int flags); +int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); +int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); +int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, + EVP_PKEY **pk, X509 **recip, + X509_ALGOR **palg); +int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen, + ASN1_GENERALIZEDTIME *date, + ASN1_OBJECT *otherTypeId, + ASN1_TYPE *otherType); + +int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pid, + ASN1_GENERALIZEDTIME **pdate, + ASN1_OBJECT **potherid, + ASN1_TYPE **pothertype); + +int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, + unsigned char *key, size_t keylen); + +int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, + const unsigned char *id, size_t idlen); + +int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, + unsigned char *pass, + ossl_ssize_t passlen); + +CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, + int iter, int wrap_nid, + int pbe_nid, + unsigned char *pass, + ossl_ssize_t passlen, + const EVP_CIPHER *kekciph); + +int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); +int CMS_RecipientInfo_encrypt(const CMS_ContentInfo *cms, CMS_RecipientInfo *ri); + +int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); + +int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); +const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); + +CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); +int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); +int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); +STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); + +CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); +int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); +int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); +STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); + +int CMS_SignedData_init(CMS_ContentInfo *cms); +CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, + X509 *signer, EVP_PKEY *pk, const EVP_MD *md, + unsigned int flags); +EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); +EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); +STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); + +void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); +int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); +int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + unsigned int flags); +void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, + X509 **signer, X509_ALGOR **pdig, + X509_ALGOR **psig); +ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); +int CMS_SignerInfo_sign(CMS_SignerInfo *si); +int CMS_SignerInfo_verify(CMS_SignerInfo *si); +int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); + +int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); +int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, + int algnid, int keysize); +int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); + +int CMS_signed_get_attr_count(const CMS_SignerInfo *si); +int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_signed_get0_data_by_OBJ(const CMS_SignerInfo *si, + const ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); +int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0( + unsigned char *id, int idlen, int allorfirst, + STACK_OF(GENERAL_NAMES) *receiptList, + STACK_OF(GENERAL_NAMES) *receiptsTo); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0_ex( + unsigned char *id, int idlen, int allorfirst, + STACK_OF(GENERAL_NAMES) *receiptList, + STACK_OF(GENERAL_NAMES) *receiptsTo, + OSSL_LIB_CTX *ctx); + +int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); +void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, + ASN1_STRING **pcid, + int *pallorfirst, + STACK_OF(GENERAL_NAMES) **plist, + STACK_OF(GENERAL_NAMES) **prto); +int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pukm); +STACK_OF(CMS_RecipientEncryptedKey) +*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); + +int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, + X509_ALGOR **pubalg, + ASN1_BIT_STRING **pubkey, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); + +int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, + ASN1_OCTET_STRING **keyid, + ASN1_GENERALIZEDTIME **tm, + CMS_OtherKeyAttribute **other, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, + X509 *cert); +int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); +int CMS_RecipientInfo_kari_set0_pkey_and_peer(CMS_RecipientInfo *ri, EVP_PKEY *pk, X509 *peer); +EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); +int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, + CMS_RecipientInfo *ri, + CMS_RecipientEncryptedKey *rek); + +int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, + ASN1_OCTET_STRING *ukm, int keylen); + +/* Backward compatibility for spelling errors. */ +# define CMS_R_UNKNOWN_DIGEST_ALGORITM CMS_R_UNKNOWN_DIGEST_ALGORITHM +# define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE \ + CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/cmserr.h b/OtherInc/openssl/include/openssl/cmserr.h new file mode 100644 index 0000000..1c4f4c7 --- /dev/null +++ b/OtherInc/openssl/include/openssl/cmserr.h @@ -0,0 +1,122 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CMSERR_H +# define OPENSSL_CMSERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_CMS + + +/* + * CMS reason codes. + */ +# define CMS_R_ADD_SIGNER_ERROR 99 +# define CMS_R_ATTRIBUTE_ERROR 161 +# define CMS_R_CERTIFICATE_ALREADY_PRESENT 175 +# define CMS_R_CERTIFICATE_HAS_NO_KEYID 160 +# define CMS_R_CERTIFICATE_VERIFY_ERROR 100 +# define CMS_R_CIPHER_AEAD_SET_TAG_ERROR 184 +# define CMS_R_CIPHER_GET_TAG 185 +# define CMS_R_CIPHER_INITIALISATION_ERROR 101 +# define CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR 102 +# define CMS_R_CMS_DATAFINAL_ERROR 103 +# define CMS_R_CMS_LIB 104 +# define CMS_R_CONTENTIDENTIFIER_MISMATCH 170 +# define CMS_R_CONTENT_NOT_FOUND 105 +# define CMS_R_CONTENT_TYPE_MISMATCH 171 +# define CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA 106 +# define CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA 107 +# define CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA 108 +# define CMS_R_CONTENT_VERIFY_ERROR 109 +# define CMS_R_CTRL_ERROR 110 +# define CMS_R_CTRL_FAILURE 111 +# define CMS_R_DECODE_ERROR 187 +# define CMS_R_DECRYPT_ERROR 112 +# define CMS_R_ERROR_GETTING_PUBLIC_KEY 113 +# define CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE 114 +# define CMS_R_ERROR_SETTING_KEY 115 +# define CMS_R_ERROR_SETTING_RECIPIENTINFO 116 +# define CMS_R_ESS_SIGNING_CERTID_MISMATCH_ERROR 183 +# define CMS_R_INVALID_ENCRYPTED_KEY_LENGTH 117 +# define CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER 176 +# define CMS_R_INVALID_KEY_LENGTH 118 +# define CMS_R_INVALID_LABEL 190 +# define CMS_R_INVALID_OAEP_PARAMETERS 191 +# define CMS_R_KDF_PARAMETER_ERROR 186 +# define CMS_R_MD_BIO_INIT_ERROR 119 +# define CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH 120 +# define CMS_R_MESSAGEDIGEST_WRONG_LENGTH 121 +# define CMS_R_MSGSIGDIGEST_ERROR 172 +# define CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE 162 +# define CMS_R_MSGSIGDIGEST_WRONG_LENGTH 163 +# define CMS_R_NEED_ONE_SIGNER 164 +# define CMS_R_NOT_A_SIGNED_RECEIPT 165 +# define CMS_R_NOT_ENCRYPTED_DATA 122 +# define CMS_R_NOT_KEK 123 +# define CMS_R_NOT_KEY_AGREEMENT 181 +# define CMS_R_NOT_KEY_TRANSPORT 124 +# define CMS_R_NOT_PWRI 177 +# define CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 125 +# define CMS_R_NO_CIPHER 126 +# define CMS_R_NO_CONTENT 127 +# define CMS_R_NO_CONTENT_TYPE 173 +# define CMS_R_NO_DEFAULT_DIGEST 128 +# define CMS_R_NO_DIGEST_SET 129 +# define CMS_R_NO_KEY 130 +# define CMS_R_NO_KEY_OR_CERT 174 +# define CMS_R_NO_MATCHING_DIGEST 131 +# define CMS_R_NO_MATCHING_RECIPIENT 132 +# define CMS_R_NO_MATCHING_SIGNATURE 166 +# define CMS_R_NO_MSGSIGDIGEST 167 +# define CMS_R_NO_PASSWORD 178 +# define CMS_R_NO_PRIVATE_KEY 133 +# define CMS_R_NO_PUBLIC_KEY 134 +# define CMS_R_NO_RECEIPT_REQUEST 168 +# define CMS_R_NO_SIGNERS 135 +# define CMS_R_PEER_KEY_ERROR 188 +# define CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 136 +# define CMS_R_RECEIPT_DECODE_ERROR 169 +# define CMS_R_RECIPIENT_ERROR 137 +# define CMS_R_SHARED_INFO_ERROR 189 +# define CMS_R_SIGNER_CERTIFICATE_NOT_FOUND 138 +# define CMS_R_SIGNFINAL_ERROR 139 +# define CMS_R_SMIME_TEXT_ERROR 140 +# define CMS_R_STORE_INIT_ERROR 141 +# define CMS_R_TYPE_NOT_COMPRESSED_DATA 142 +# define CMS_R_TYPE_NOT_DATA 143 +# define CMS_R_TYPE_NOT_DIGESTED_DATA 144 +# define CMS_R_TYPE_NOT_ENCRYPTED_DATA 145 +# define CMS_R_TYPE_NOT_ENVELOPED_DATA 146 +# define CMS_R_UNABLE_TO_FINALIZE_CONTEXT 147 +# define CMS_R_UNKNOWN_CIPHER 148 +# define CMS_R_UNKNOWN_DIGEST_ALGORITHM 149 +# define CMS_R_UNKNOWN_ID 150 +# define CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM 151 +# define CMS_R_UNSUPPORTED_CONTENT_TYPE 152 +# define CMS_R_UNSUPPORTED_ENCRYPTION_TYPE 192 +# define CMS_R_UNSUPPORTED_KEK_ALGORITHM 153 +# define CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM 179 +# define CMS_R_UNSUPPORTED_LABEL_SOURCE 193 +# define CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE 155 +# define CMS_R_UNSUPPORTED_RECIPIENT_TYPE 154 +# define CMS_R_UNSUPPORTED_TYPE 156 +# define CMS_R_UNWRAP_ERROR 157 +# define CMS_R_UNWRAP_FAILURE 180 +# define CMS_R_VERIFICATION_FAILURE 158 +# define CMS_R_WRAP_ERROR 159 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/comp.h b/OtherInc/openssl/include/openssl/comp.h new file mode 100644 index 0000000..06ff581 --- /dev/null +++ b/OtherInc/openssl/include/openssl/comp.h @@ -0,0 +1,59 @@ +/* + * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_COMP_H +# define OPENSSL_COMP_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_COMP_H +# endif + +# include + +# ifndef OPENSSL_NO_COMP +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + + + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +const COMP_METHOD *COMP_CTX_get_method(const COMP_CTX *ctx); +int COMP_CTX_get_type(const COMP_CTX* comp); +int COMP_get_type(const COMP_METHOD *meth); +const char *COMP_get_name(const COMP_METHOD *meth); +void COMP_CTX_free(COMP_CTX *ctx); + +int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); + +COMP_METHOD *COMP_zlib(void); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define COMP_zlib_cleanup() while(0) continue +#endif + +# ifdef OPENSSL_BIO_H +# ifdef ZLIB +const BIO_METHOD *BIO_f_zlib(void); +# endif +# endif + + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/comperr.h b/OtherInc/openssl/include/openssl/comperr.h new file mode 100644 index 0000000..01dd3e6 --- /dev/null +++ b/OtherInc/openssl/include/openssl/comperr.h @@ -0,0 +1,31 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_COMPERR_H +# define OPENSSL_COMPERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_COMP + + +/* + * COMP reason codes. + */ +# define COMP_R_ZLIB_DEFLATE_ERROR 99 +# define COMP_R_ZLIB_INFLATE_ERROR 100 +# define COMP_R_ZLIB_NOT_SUPPORTED 101 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/conf.h b/OtherInc/openssl/include/openssl/conf.h new file mode 100644 index 0000000..07793f1 --- /dev/null +++ b/OtherInc/openssl/include/openssl/conf.h @@ -0,0 +1,211 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\conf.h.in + * + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_CONF_H +# define OPENSSL_CONF_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_CONF_H +# endif + +# include +# include +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char *section; + char *name; + char *value; +} CONF_VALUE; + +SKM_DEFINE_STACK_OF_INTERNAL(CONF_VALUE, CONF_VALUE, CONF_VALUE) +#define sk_CONF_VALUE_num(sk) OPENSSL_sk_num(ossl_check_const_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_value(sk, idx) ((CONF_VALUE *)OPENSSL_sk_value(ossl_check_const_CONF_VALUE_sk_type(sk), (idx))) +#define sk_CONF_VALUE_new(cmp) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new(ossl_check_CONF_VALUE_compfunc_type(cmp))) +#define sk_CONF_VALUE_new_null() ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new_null()) +#define sk_CONF_VALUE_new_reserve(cmp, n) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new_reserve(ossl_check_CONF_VALUE_compfunc_type(cmp), (n))) +#define sk_CONF_VALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CONF_VALUE_sk_type(sk), (n)) +#define sk_CONF_VALUE_free(sk) OPENSSL_sk_free(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_zero(sk) OPENSSL_sk_zero(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_delete(sk, i) ((CONF_VALUE *)OPENSSL_sk_delete(ossl_check_CONF_VALUE_sk_type(sk), (i))) +#define sk_CONF_VALUE_delete_ptr(sk, ptr) ((CONF_VALUE *)OPENSSL_sk_delete_ptr(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr))) +#define sk_CONF_VALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_pop(sk) ((CONF_VALUE *)OPENSSL_sk_pop(ossl_check_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_shift(sk) ((CONF_VALUE *)OPENSSL_sk_shift(ossl_check_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CONF_VALUE_sk_type(sk),ossl_check_CONF_VALUE_freefunc_type(freefunc)) +#define sk_CONF_VALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr), (idx)) +#define sk_CONF_VALUE_set(sk, idx, ptr) ((CONF_VALUE *)OPENSSL_sk_set(ossl_check_CONF_VALUE_sk_type(sk), (idx), ossl_check_CONF_VALUE_type(ptr))) +#define sk_CONF_VALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr), pnum) +#define sk_CONF_VALUE_sort(sk) OPENSSL_sk_sort(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_dup(sk) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_dup(ossl_check_const_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_copyfunc_type(copyfunc), ossl_check_CONF_VALUE_freefunc_type(freefunc))) +#define sk_CONF_VALUE_set_cmp_func(sk, cmp) ((sk_CONF_VALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_compfunc_type(cmp))) +DEFINE_LHASH_OF_INTERNAL(CONF_VALUE); +#define lh_CONF_VALUE_new(hfn, cmp) ((LHASH_OF(CONF_VALUE) *)OPENSSL_LH_new(ossl_check_CONF_VALUE_lh_hashfunc_type(hfn), ossl_check_CONF_VALUE_lh_compfunc_type(cmp))) +#define lh_CONF_VALUE_free(lh) OPENSSL_LH_free(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_flush(lh) OPENSSL_LH_flush(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_insert(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_insert(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_delete(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_delete(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_const_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_retrieve(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_retrieve(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_const_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_error(lh) OPENSSL_LH_error(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_num_items(lh) OPENSSL_LH_num_items(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_CONF_VALUE_lh_type(lh), dl) +#define lh_CONF_VALUE_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_CONF_VALUE_lh_doallfunc_type(dfn)) + + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# include +# endif + +/* Module definitions */ +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +STACK_OF(CONF_MODULE); +STACK_OF(CONF_IMODULE); + +/* DSO module function typedefs */ +typedef int conf_init_func (CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func (CONF_IMODULE *md); + +# define CONF_MFLAGS_IGNORE_ERRORS 0x1 +# define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +# define CONF_MFLAGS_SILENT 0x4 +# define CONF_MFLAGS_NO_DSO 0x8 +# define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +# define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); +LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, + long *eline); +# ifndef OPENSSL_NO_STDIO +LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, + long *eline); +# endif +LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, + long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, + const char *section); +char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +void CONF_free(LHASH_OF(CONF_VALUE) *conf); +#ifndef OPENSSL_NO_STDIO +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +#endif +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void OPENSSL_config(const char *config_name); +#endif + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define OPENSSL_no_config() \ + OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG, NULL) +#endif + +/* + * New conf code. The semantics are different from the functions above. If + * that wasn't the case, the above functions would have been replaced + */ + +CONF *NCONF_new_ex(OSSL_LIB_CTX *libctx, CONF_METHOD *meth); +OSSL_LIB_CTX *NCONF_get0_libctx(const CONF *conf); +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 CONF_METHOD *NCONF_WIN32(void); +#endif +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +# ifndef OPENSSL_NO_STDIO +int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); +# endif +int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); +STACK_OF(OPENSSL_CSTRING) *NCONF_get_section_names(const CONF *conf); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, + const char *section); +char *NCONF_get_string(const CONF *conf, const char *group, const char *name); +int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, + long *result); +#ifndef OPENSSL_NO_STDIO +int NCONF_dump_fp(const CONF *conf, FILE *out); +#endif +int NCONF_dump_bio(const CONF *conf, BIO *out); + +#define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r) + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file_ex(OSSL_LIB_CTX *libctx, const char *filename, + const char *appname, unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define CONF_modules_free() while(0) continue +#endif +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb) (const char *elem, int len, void *usr), + void *arg); + +void OPENSSL_load_builtin_modules(void); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/conf_api.h b/OtherInc/openssl/include/openssl/conf_api.h new file mode 100644 index 0000000..ed67d57 --- /dev/null +++ b/OtherInc/openssl/include/openssl/conf_api.h @@ -0,0 +1,46 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CONF_API_H +# define OPENSSL_CONF_API_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_CONF_API_H +# endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Up until OpenSSL 0.9.5a, this was new_section */ +CONF_VALUE *_CONF_new_section(CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was get_section */ +CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section); +/* Up until OpenSSL 0.9.5a, this was CONF_get_section */ +STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf, + const char *section); + +int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value); +char *_CONF_get_string(const CONF *conf, const char *section, + const char *name); +long _CONF_get_number(const CONF *conf, const char *section, + const char *name); + +int _CONF_new_data(CONF *conf); +void _CONF_free_data(CONF *conf); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/conferr.h b/OtherInc/openssl/include/openssl/conferr.h new file mode 100644 index 0000000..496e2e1 --- /dev/null +++ b/OtherInc/openssl/include/openssl/conferr.h @@ -0,0 +1,51 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CONFERR_H +# define OPENSSL_CONFERR_H +# pragma once + +# include +# include +# include + + + +/* + * CONF reason codes. + */ +# define CONF_R_ERROR_LOADING_DSO 110 +# define CONF_R_INVALID_PRAGMA 122 +# define CONF_R_LIST_CANNOT_BE_NULL 115 +# define CONF_R_MANDATORY_BRACES_IN_VARIABLE_EXPANSION 123 +# define CONF_R_MISSING_CLOSE_SQUARE_BRACKET 100 +# define CONF_R_MISSING_EQUAL_SIGN 101 +# define CONF_R_MISSING_INIT_FUNCTION 112 +# define CONF_R_MODULE_INITIALIZATION_ERROR 109 +# define CONF_R_NO_CLOSE_BRACE 102 +# define CONF_R_NO_CONF 105 +# define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE 106 +# define CONF_R_NO_SECTION 107 +# define CONF_R_NO_SUCH_FILE 114 +# define CONF_R_NO_VALUE 108 +# define CONF_R_NUMBER_TOO_LARGE 121 +# define CONF_R_OPENSSL_CONF_REFERENCES_MISSING_SECTION 124 +# define CONF_R_RECURSIVE_DIRECTORY_INCLUDE 111 +# define CONF_R_RELATIVE_PATH 125 +# define CONF_R_SSL_COMMAND_SECTION_EMPTY 117 +# define CONF_R_SSL_COMMAND_SECTION_NOT_FOUND 118 +# define CONF_R_SSL_SECTION_EMPTY 119 +# define CONF_R_SSL_SECTION_NOT_FOUND 120 +# define CONF_R_UNABLE_TO_CREATE_NEW_SECTION 103 +# define CONF_R_UNKNOWN_MODULE_NAME 113 +# define CONF_R_VARIABLE_EXPANSION_TOO_LONG 116 +# define CONF_R_VARIABLE_HAS_NO_VALUE 104 + +#endif diff --git a/OtherInc/openssl/include/openssl/configuration.h b/OtherInc/openssl/include/openssl/configuration.h new file mode 100644 index 0000000..44800af --- /dev/null +++ b/OtherInc/openssl/include/openssl/configuration.h @@ -0,0 +1,133 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\configuration.h.in + * + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CONFIGURATION_H +# define OPENSSL_CONFIGURATION_H +# pragma once + +# ifdef __cplusplus +extern "C" { +# endif + +# ifdef OPENSSL_ALGORITHM_DEFINES +# error OPENSSL_ALGORITHM_DEFINES no longer supported +# endif + +/* + * OpenSSL was configured with the following options: + */ + +# ifndef OPENSSL_SYS_WIN32 +# define OPENSSL_SYS_WIN32 1 +# endif +# define OPENSSL_CONFIGURED_API 30000 +# ifndef OPENSSL_RAND_SEED_OS +# define OPENSSL_RAND_SEED_OS +# endif +# ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +# endif +# ifndef OPENSSL_NO_ACVP_TESTS +# define OPENSSL_NO_ACVP_TESTS +# endif +# ifndef OPENSSL_NO_AFALGENG +# define OPENSSL_NO_AFALGENG +# endif +# ifndef OPENSSL_NO_ASAN +# define OPENSSL_NO_ASAN +# endif +# ifndef OPENSSL_NO_CRYPTO_MDEBUG +# define OPENSSL_NO_CRYPTO_MDEBUG +# endif +# ifndef OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE +# define OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE +# endif +# ifndef OPENSSL_NO_DEVCRYPTOENG +# define OPENSSL_NO_DEVCRYPTOENG +# endif +# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +# endif +# ifndef OPENSSL_NO_EGD +# define OPENSSL_NO_EGD +# endif +# ifndef OPENSSL_NO_EXTERNAL_TESTS +# define OPENSSL_NO_EXTERNAL_TESTS +# endif +# ifndef OPENSSL_NO_FIPS_SECURITYCHECKS +# define OPENSSL_NO_FIPS_SECURITYCHECKS +# endif +# ifndef OPENSSL_NO_FUZZ_AFL +# define OPENSSL_NO_FUZZ_AFL +# endif +# ifndef OPENSSL_NO_FUZZ_LIBFUZZER +# define OPENSSL_NO_FUZZ_LIBFUZZER +# endif +# ifndef OPENSSL_NO_KTLS +# define OPENSSL_NO_KTLS +# endif +# ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +# endif +# ifndef OPENSSL_NO_MSAN +# define OPENSSL_NO_MSAN +# endif +# ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +# endif +# ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +# endif +# ifndef OPENSSL_NO_SSL3 +# define OPENSSL_NO_SSL3 +# endif +# ifndef OPENSSL_NO_SSL3_METHOD +# define OPENSSL_NO_SSL3_METHOD +# endif +# ifndef OPENSSL_NO_TRACE +# define OPENSSL_NO_TRACE +# endif +# ifndef OPENSSL_NO_UBSAN +# define OPENSSL_NO_UBSAN +# endif +# ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +# endif +# ifndef OPENSSL_NO_WEAK_SSL_CIPHERS +# define OPENSSL_NO_WEAK_SSL_CIPHERS +# endif +# ifndef OPENSSL_NO_STATIC_ENGINE +# define OPENSSL_NO_STATIC_ENGINE +# endif + + +/* Generate 80386 code? */ +# undef I386_ONLY + +/* + * The following are cipher-specific, but are part of the public API. + */ +# if !defined(OPENSSL_SYS_UEFI) +# define BN_LLONG +/* Only one for the following should be defined */ +# undef SIXTY_FOUR_BIT_LONG +# undef SIXTY_FOUR_BIT +# define THIRTY_TWO_BIT +# endif + +# define RC4_INT unsigned int + +# ifdef __cplusplus +} +# endif + +#endif /* OPENSSL_CONFIGURATION_H */ diff --git a/OtherInc/openssl/include/openssl/conftypes.h b/OtherInc/openssl/include/openssl/conftypes.h new file mode 100644 index 0000000..17cefaa --- /dev/null +++ b/OtherInc/openssl/include/openssl/conftypes.h @@ -0,0 +1,44 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CONFTYPES_H +# define OPENSSL_CONFTYPES_H +# pragma once + +#ifndef OPENSSL_CONF_H +# include +#endif + +/* + * The contents of this file are deprecated and will be made opaque + */ +struct conf_method_st { + const char *name; + CONF *(*create) (CONF_METHOD *meth); + int (*init) (CONF *conf); + int (*destroy) (CONF *conf); + int (*destroy_data) (CONF *conf); + int (*load_bio) (CONF *conf, BIO *bp, long *eline); + int (*dump) (const CONF *conf, BIO *bp); + int (*is_number) (const CONF *conf, char c); + int (*to_int) (const CONF *conf, char c); + int (*load) (CONF *conf, const char *name, long *eline); +}; + +struct conf_st { + CONF_METHOD *meth; + void *meth_data; + LHASH_OF(CONF_VALUE) *data; + int flag_dollarid; + int flag_abspath; + char *includedir; + OSSL_LIB_CTX *libctx; +}; + +#endif diff --git a/OtherInc/openssl/include/openssl/core.h b/OtherInc/openssl/include/openssl/core.h new file mode 100644 index 0000000..9683ac7 --- /dev/null +++ b/OtherInc/openssl/include/openssl/core.h @@ -0,0 +1,233 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CORE_H +# define OPENSSL_CORE_H +# pragma once + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +/*- + * Base types + * ---------- + * + * These are the types that the OpenSSL core and providers have in common + * to communicate data between them. + */ + +/* Opaque handles to be used with core upcall functions from providers */ +typedef struct ossl_core_handle_st OSSL_CORE_HANDLE; +typedef struct openssl_core_ctx_st OPENSSL_CORE_CTX; +typedef struct ossl_core_bio_st OSSL_CORE_BIO; + +/* + * Dispatch table element. function_id numbers and the functions are defined + * in core_dispatch.h, see macros with 'OSSL_CORE_MAKE_FUNC' in their names. + * + * An array of these is always terminated by function_id == 0 + */ +struct ossl_dispatch_st { + int function_id; + void (*function)(void); +}; + +/* + * Other items, essentially an int<->pointer map element. + * + * We make this type distinct from OSSL_DISPATCH to ensure that dispatch + * tables remain tables with function pointers only. + * + * This is used whenever we need to pass things like a table of error reason + * codes <-> reason string maps, ... + * + * Usage determines which field works as key if any, rather than field order. + * + * An array of these is always terminated by id == 0 && ptr == NULL + */ +struct ossl_item_st { + unsigned int id; + void *ptr; +}; + +/* + * Type to tie together algorithm names, property definition string and + * the algorithm implementation in the form of a dispatch table. + * + * An array of these is always terminated by algorithm_names == NULL + */ +struct ossl_algorithm_st { + const char *algorithm_names; /* key */ + const char *property_definition; /* key */ + const OSSL_DISPATCH *implementation; + const char *algorithm_description; +}; + +/* + * Type to pass object data in a uniform way, without exposing the object + * structure. + * + * An array of these is always terminated by key == NULL + */ +struct ossl_param_st { + const char *key; /* the name of the parameter */ + unsigned int data_type; /* declare what kind of content is in buffer */ + void *data; /* value being passed in or out */ + size_t data_size; /* data size */ + size_t return_size; /* returned content size */ +}; + +/* Currently supported OSSL_PARAM data types */ +/* + * OSSL_PARAM_INTEGER and OSSL_PARAM_UNSIGNED_INTEGER + * are arbitrary length and therefore require an arbitrarily sized buffer, + * since they may be used to pass numbers larger than what is natively + * available. + * + * The number must be buffered in native form, i.e. MSB first on B_ENDIAN + * systems and LSB first on L_ENDIAN systems. This means that arbitrary + * native integers can be stored in the buffer, just make sure that the + * buffer size is correct and the buffer itself is properly aligned (for + * example by having the buffer field point at a C integer). + */ +# define OSSL_PARAM_INTEGER 1 +# define OSSL_PARAM_UNSIGNED_INTEGER 2 +/*- + * OSSL_PARAM_REAL + * is a C binary floating point values in native form and alignment. + */ +# define OSSL_PARAM_REAL 3 +/*- + * OSSL_PARAM_UTF8_STRING + * is a printable string. It is expected to be printed as it is. + */ +# define OSSL_PARAM_UTF8_STRING 4 +/*- + * OSSL_PARAM_OCTET_STRING + * is a string of bytes with no further specification. It is expected to be + * printed as a hexdump. + */ +# define OSSL_PARAM_OCTET_STRING 5 +/*- + * OSSL_PARAM_UTF8_PTR + * is a pointer to a printable string. It is expected to be printed as it is. + * + * The difference between this and OSSL_PARAM_UTF8_STRING is that only pointers + * are manipulated for this type. + * + * This is more relevant for parameter requests, where the responding + * function doesn't need to copy the data to the provided buffer, but + * sets the provided buffer to point at the actual data instead. + * + * WARNING! Using these is FRAGILE, as it assumes that the actual + * data and its location are constant. + * + * EXTRA WARNING! If you are not completely sure you most likely want + * to use the OSSL_PARAM_UTF8_STRING type. + */ +# define OSSL_PARAM_UTF8_PTR 6 +/*- + * OSSL_PARAM_OCTET_PTR + * is a pointer to a string of bytes with no further specification. It is + * expected to be printed as a hexdump. + * + * The difference between this and OSSL_PARAM_OCTET_STRING is that only pointers + * are manipulated for this type. + * + * This is more relevant for parameter requests, where the responding + * function doesn't need to copy the data to the provided buffer, but + * sets the provided buffer to point at the actual data instead. + * + * WARNING! Using these is FRAGILE, as it assumes that the actual + * data and its location are constant. + * + * EXTRA WARNING! If you are not completely sure you most likely want + * to use the OSSL_PARAM_OCTET_STRING type. + */ +# define OSSL_PARAM_OCTET_PTR 7 + +/* + * Typedef for the thread stop handling callback. Used both internally and by + * providers. + * + * Providers may register for notifications about threads stopping by + * registering a callback to hear about such events. Providers register the + * callback using the OSSL_FUNC_CORE_THREAD_START function in the |in| dispatch + * table passed to OSSL_provider_init(). The arg passed back to a provider will + * be the provider side context object. + */ +typedef void (*OSSL_thread_stop_handler_fn)(void *arg); + + +/*- + * Provider entry point + * -------------------- + * + * This function is expected to be present in any dynamically loadable + * provider module. By definition, if this function doesn't exist in a + * module, that module is not an OpenSSL provider module. + */ +/*- + * |handle| pointer to opaque type OSSL_CORE_HANDLE. This can be used + * together with some functions passed via |in| to query data. + * |in| is the array of functions that the Core passes to the provider. + * |out| will be the array of base functions that the provider passes + * back to the Core. + * |provctx| a provider side context object, optionally created if the + * provider needs it. This value is passed to other provider + * functions, notably other context constructors. + */ +typedef int (OSSL_provider_init_fn)(const OSSL_CORE_HANDLE *handle, + const OSSL_DISPATCH *in, + const OSSL_DISPATCH **out, + void **provctx); +# ifdef __VMS +# pragma names save +# pragma names uppercase,truncated +# endif +OPENSSL_EXPORT OSSL_provider_init_fn OSSL_provider_init; +# ifdef __VMS +# pragma names restore +# endif + +/* + * Generic callback function signature. + * + * The expectation is that any provider function that wants to offer + * a callback / hook can do so by taking an argument with this type, + * as well as a pointer to caller-specific data. When calling the + * callback, the provider function can populate an OSSL_PARAM array + * with data of its choice and pass that in the callback call, along + * with the caller data argument. + * + * libcrypto may use the OSSL_PARAM array to create arguments for an + * application callback it knows about. + */ +typedef int (OSSL_CALLBACK)(const OSSL_PARAM params[], void *arg); +typedef int (OSSL_INOUT_CALLBACK)(const OSSL_PARAM in_params[], + OSSL_PARAM out_params[], void *arg); +/* + * Passphrase callback function signature + * + * This is similar to the generic callback function above, but adds a + * result parameter. + */ +typedef int (OSSL_PASSPHRASE_CALLBACK)(char *pass, size_t pass_size, + size_t *pass_len, + const OSSL_PARAM params[], void *arg); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/core_dispatch.h b/OtherInc/openssl/include/openssl/core_dispatch.h new file mode 100644 index 0000000..99fcda0 --- /dev/null +++ b/OtherInc/openssl/include/openssl/core_dispatch.h @@ -0,0 +1,943 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CORE_NUMBERS_H +# define OPENSSL_CORE_NUMBERS_H +# pragma once + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +/*- + * Identities + * ---------- + * + * All series start with 1, to allow 0 to be an array terminator. + * For any FUNC identity, we also provide a function signature typedef + * and a static inline function to extract a function pointer from a + * OSSL_DISPATCH element in a type safe manner. + * + * Names: + * for any function base name 'foo' (uppercase form 'FOO'), we will have + * the following: + * - a macro for the identity with the name OSSL_FUNC_'FOO' or derivatives + * thereof (to be specified further down) + * - a function signature typedef with the name OSSL_FUNC_'foo'_fn + * - a function pointer extractor function with the name OSSL_FUNC_'foo' + */ + +/* + * Helper macro to create the function signature typedef and the extractor + * |type| is the return-type of the function, |name| is the name of the + * function to fetch, and |args| is a parenthesized list of parameters + * for the function (that is, it is |name|'s function signature). + * Note: This is considered a "reserved" internal macro. Applications should + * not use this or assume its existence. + */ +#define OSSL_CORE_MAKE_FUNC(type,name,args) \ + typedef type (OSSL_FUNC_##name##_fn)args; \ + static ossl_unused ossl_inline \ + OSSL_FUNC_##name##_fn *OSSL_FUNC_##name(const OSSL_DISPATCH *opf) \ + { \ + return (OSSL_FUNC_##name##_fn *)opf->function; \ + } + +/* + * Core function identities, for the two OSSL_DISPATCH tables being passed + * in the OSSL_provider_init call. + * + * 0 serves as a marker for the end of the OSSL_DISPATCH array, and must + * therefore NEVER be used as a function identity. + */ +/* Functions provided by the Core to the provider, reserved numbers 1-1023 */ +# define OSSL_FUNC_CORE_GETTABLE_PARAMS 1 +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, + core_gettable_params,(const OSSL_CORE_HANDLE *prov)) +# define OSSL_FUNC_CORE_GET_PARAMS 2 +OSSL_CORE_MAKE_FUNC(int,core_get_params,(const OSSL_CORE_HANDLE *prov, + OSSL_PARAM params[])) +# define OSSL_FUNC_CORE_THREAD_START 3 +OSSL_CORE_MAKE_FUNC(int,core_thread_start,(const OSSL_CORE_HANDLE *prov, + OSSL_thread_stop_handler_fn handfn, + void *arg)) +# define OSSL_FUNC_CORE_GET_LIBCTX 4 +OSSL_CORE_MAKE_FUNC(OPENSSL_CORE_CTX *,core_get_libctx, + (const OSSL_CORE_HANDLE *prov)) +# define OSSL_FUNC_CORE_NEW_ERROR 5 +OSSL_CORE_MAKE_FUNC(void,core_new_error,(const OSSL_CORE_HANDLE *prov)) +# define OSSL_FUNC_CORE_SET_ERROR_DEBUG 6 +OSSL_CORE_MAKE_FUNC(void,core_set_error_debug, + (const OSSL_CORE_HANDLE *prov, + const char *file, int line, const char *func)) +# define OSSL_FUNC_CORE_VSET_ERROR 7 +OSSL_CORE_MAKE_FUNC(void,core_vset_error, + (const OSSL_CORE_HANDLE *prov, + uint32_t reason, const char *fmt, va_list args)) +# define OSSL_FUNC_CORE_SET_ERROR_MARK 8 +OSSL_CORE_MAKE_FUNC(int, core_set_error_mark, (const OSSL_CORE_HANDLE *prov)) +# define OSSL_FUNC_CORE_CLEAR_LAST_ERROR_MARK 9 +OSSL_CORE_MAKE_FUNC(int, core_clear_last_error_mark, + (const OSSL_CORE_HANDLE *prov)) +# define OSSL_FUNC_CORE_POP_ERROR_TO_MARK 10 +OSSL_CORE_MAKE_FUNC(int, core_pop_error_to_mark, (const OSSL_CORE_HANDLE *prov)) + + +/* Functions to access the OBJ database */ + +#define OSSL_FUNC_CORE_OBJ_ADD_SIGID 11 +#define OSSL_FUNC_CORE_OBJ_CREATE 12 + +OSSL_CORE_MAKE_FUNC(int, core_obj_add_sigid, + (const OSSL_CORE_HANDLE *prov, const char *sign_name, + const char *digest_name, const char *pkey_name)) +OSSL_CORE_MAKE_FUNC(int, core_obj_create, + (const OSSL_CORE_HANDLE *prov, const char *oid, + const char *sn, const char *ln)) + +/* Memory allocation, freeing, clearing. */ +#define OSSL_FUNC_CRYPTO_MALLOC 20 +OSSL_CORE_MAKE_FUNC(void *, + CRYPTO_malloc, (size_t num, const char *file, int line)) +#define OSSL_FUNC_CRYPTO_ZALLOC 21 +OSSL_CORE_MAKE_FUNC(void *, + CRYPTO_zalloc, (size_t num, const char *file, int line)) +#define OSSL_FUNC_CRYPTO_FREE 22 +OSSL_CORE_MAKE_FUNC(void, + CRYPTO_free, (void *ptr, const char *file, int line)) +#define OSSL_FUNC_CRYPTO_CLEAR_FREE 23 +OSSL_CORE_MAKE_FUNC(void, + CRYPTO_clear_free, (void *ptr, size_t num, const char *file, int line)) +#define OSSL_FUNC_CRYPTO_REALLOC 24 +OSSL_CORE_MAKE_FUNC(void *, + CRYPTO_realloc, (void *addr, size_t num, const char *file, int line)) +#define OSSL_FUNC_CRYPTO_CLEAR_REALLOC 25 +OSSL_CORE_MAKE_FUNC(void *, + CRYPTO_clear_realloc, (void *addr, size_t old_num, size_t num, + const char *file, int line)) +#define OSSL_FUNC_CRYPTO_SECURE_MALLOC 26 +OSSL_CORE_MAKE_FUNC(void *, + CRYPTO_secure_malloc, (size_t num, const char *file, int line)) +#define OSSL_FUNC_CRYPTO_SECURE_ZALLOC 27 +OSSL_CORE_MAKE_FUNC(void *, + CRYPTO_secure_zalloc, (size_t num, const char *file, int line)) +#define OSSL_FUNC_CRYPTO_SECURE_FREE 28 +OSSL_CORE_MAKE_FUNC(void, + CRYPTO_secure_free, (void *ptr, const char *file, int line)) +#define OSSL_FUNC_CRYPTO_SECURE_CLEAR_FREE 29 +OSSL_CORE_MAKE_FUNC(void, + CRYPTO_secure_clear_free, (void *ptr, size_t num, const char *file, + int line)) +#define OSSL_FUNC_CRYPTO_SECURE_ALLOCATED 30 +OSSL_CORE_MAKE_FUNC(int, + CRYPTO_secure_allocated, (const void *ptr)) +#define OSSL_FUNC_OPENSSL_CLEANSE 31 +OSSL_CORE_MAKE_FUNC(void, + OPENSSL_cleanse, (void *ptr, size_t len)) + +/* Bio functions provided by the core */ +#define OSSL_FUNC_BIO_NEW_FILE 40 +#define OSSL_FUNC_BIO_NEW_MEMBUF 41 +#define OSSL_FUNC_BIO_READ_EX 42 +#define OSSL_FUNC_BIO_WRITE_EX 43 +#define OSSL_FUNC_BIO_UP_REF 44 +#define OSSL_FUNC_BIO_FREE 45 +#define OSSL_FUNC_BIO_VPRINTF 46 +#define OSSL_FUNC_BIO_VSNPRINTF 47 +#define OSSL_FUNC_BIO_PUTS 48 +#define OSSL_FUNC_BIO_GETS 49 +#define OSSL_FUNC_BIO_CTRL 50 + + +OSSL_CORE_MAKE_FUNC(OSSL_CORE_BIO *, BIO_new_file, (const char *filename, + const char *mode)) +OSSL_CORE_MAKE_FUNC(OSSL_CORE_BIO *, BIO_new_membuf, (const void *buf, int len)) +OSSL_CORE_MAKE_FUNC(int, BIO_read_ex, (OSSL_CORE_BIO *bio, void *data, + size_t data_len, size_t *bytes_read)) +OSSL_CORE_MAKE_FUNC(int, BIO_write_ex, (OSSL_CORE_BIO *bio, const void *data, + size_t data_len, size_t *written)) +OSSL_CORE_MAKE_FUNC(int, BIO_gets, (OSSL_CORE_BIO *bio, char *buf, int size)) +OSSL_CORE_MAKE_FUNC(int, BIO_puts, (OSSL_CORE_BIO *bio, const char *str)) +OSSL_CORE_MAKE_FUNC(int, BIO_up_ref, (OSSL_CORE_BIO *bio)) +OSSL_CORE_MAKE_FUNC(int, BIO_free, (OSSL_CORE_BIO *bio)) +OSSL_CORE_MAKE_FUNC(int, BIO_vprintf, (OSSL_CORE_BIO *bio, const char *format, + va_list args)) +OSSL_CORE_MAKE_FUNC(int, BIO_vsnprintf, + (char *buf, size_t n, const char *fmt, va_list args)) +OSSL_CORE_MAKE_FUNC(int, BIO_ctrl, (OSSL_CORE_BIO *bio, + int cmd, long num, void *ptr)) + +#define OSSL_FUNC_SELF_TEST_CB 100 +OSSL_CORE_MAKE_FUNC(void, self_test_cb, (OPENSSL_CORE_CTX *ctx, OSSL_CALLBACK **cb, + void **cbarg)) + +/* Functions to get seed material from the operating system */ +#define OSSL_FUNC_GET_ENTROPY 101 +#define OSSL_FUNC_CLEANUP_ENTROPY 102 +#define OSSL_FUNC_GET_NONCE 103 +#define OSSL_FUNC_CLEANUP_NONCE 104 +OSSL_CORE_MAKE_FUNC(size_t, get_entropy, (const OSSL_CORE_HANDLE *handle, + unsigned char **pout, int entropy, + size_t min_len, size_t max_len)) +OSSL_CORE_MAKE_FUNC(void, cleanup_entropy, (const OSSL_CORE_HANDLE *handle, + unsigned char *buf, size_t len)) +OSSL_CORE_MAKE_FUNC(size_t, get_nonce, (const OSSL_CORE_HANDLE *handle, + unsigned char **pout, size_t min_len, + size_t max_len, const void *salt, + size_t salt_len)) +OSSL_CORE_MAKE_FUNC(void, cleanup_nonce, (const OSSL_CORE_HANDLE *handle, + unsigned char *buf, size_t len)) + +/* Functions to access the core's providers */ +#define OSSL_FUNC_PROVIDER_REGISTER_CHILD_CB 105 +#define OSSL_FUNC_PROVIDER_DEREGISTER_CHILD_CB 106 +#define OSSL_FUNC_PROVIDER_NAME 107 +#define OSSL_FUNC_PROVIDER_GET0_PROVIDER_CTX 108 +#define OSSL_FUNC_PROVIDER_GET0_DISPATCH 109 +#define OSSL_FUNC_PROVIDER_UP_REF 110 +#define OSSL_FUNC_PROVIDER_FREE 111 + +OSSL_CORE_MAKE_FUNC(int, provider_register_child_cb, + (const OSSL_CORE_HANDLE *handle, + int (*create_cb)(const OSSL_CORE_HANDLE *provider, void *cbdata), + int (*remove_cb)(const OSSL_CORE_HANDLE *provider, void *cbdata), + int (*global_props_cb)(const char *props, void *cbdata), + void *cbdata)) +OSSL_CORE_MAKE_FUNC(void, provider_deregister_child_cb, + (const OSSL_CORE_HANDLE *handle)) +OSSL_CORE_MAKE_FUNC(const char *, provider_name, + (const OSSL_CORE_HANDLE *prov)) +OSSL_CORE_MAKE_FUNC(void *, provider_get0_provider_ctx, + (const OSSL_CORE_HANDLE *prov)) +OSSL_CORE_MAKE_FUNC(const OSSL_DISPATCH *, provider_get0_dispatch, + (const OSSL_CORE_HANDLE *prov)) +OSSL_CORE_MAKE_FUNC(int, provider_up_ref, + (const OSSL_CORE_HANDLE *prov, int activate)) +OSSL_CORE_MAKE_FUNC(int, provider_free, + (const OSSL_CORE_HANDLE *prov, int deactivate)) + +/* Functions provided by the provider to the Core, reserved numbers 1024-1535 */ +# define OSSL_FUNC_PROVIDER_TEARDOWN 1024 +OSSL_CORE_MAKE_FUNC(void,provider_teardown,(void *provctx)) +# define OSSL_FUNC_PROVIDER_GETTABLE_PARAMS 1025 +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, + provider_gettable_params,(void *provctx)) +# define OSSL_FUNC_PROVIDER_GET_PARAMS 1026 +OSSL_CORE_MAKE_FUNC(int,provider_get_params,(void *provctx, + OSSL_PARAM params[])) +# define OSSL_FUNC_PROVIDER_QUERY_OPERATION 1027 +OSSL_CORE_MAKE_FUNC(const OSSL_ALGORITHM *,provider_query_operation, + (void *provctx, int operation_id, int *no_store)) +# define OSSL_FUNC_PROVIDER_UNQUERY_OPERATION 1028 +OSSL_CORE_MAKE_FUNC(void, provider_unquery_operation, + (void *provctx, int operation_id, const OSSL_ALGORITHM *)) +# define OSSL_FUNC_PROVIDER_GET_REASON_STRINGS 1029 +OSSL_CORE_MAKE_FUNC(const OSSL_ITEM *,provider_get_reason_strings, + (void *provctx)) +# define OSSL_FUNC_PROVIDER_GET_CAPABILITIES 1030 +OSSL_CORE_MAKE_FUNC(int, provider_get_capabilities, (void *provctx, + const char *capability, OSSL_CALLBACK *cb, void *arg)) +# define OSSL_FUNC_PROVIDER_SELF_TEST 1031 +OSSL_CORE_MAKE_FUNC(int, provider_self_test, (void *provctx)) + +/* Operations */ + +# define OSSL_OP_DIGEST 1 +# define OSSL_OP_CIPHER 2 /* Symmetric Ciphers */ +# define OSSL_OP_MAC 3 +# define OSSL_OP_KDF 4 +# define OSSL_OP_RAND 5 +# define OSSL_OP_KEYMGMT 10 +# define OSSL_OP_KEYEXCH 11 +# define OSSL_OP_SIGNATURE 12 +# define OSSL_OP_ASYM_CIPHER 13 +# define OSSL_OP_KEM 14 +/* New section for non-EVP operations */ +# define OSSL_OP_ENCODER 20 +# define OSSL_OP_DECODER 21 +# define OSSL_OP_STORE 22 +/* Highest known operation number */ +# define OSSL_OP__HIGHEST 22 + +/* Digests */ + +# define OSSL_FUNC_DIGEST_NEWCTX 1 +# define OSSL_FUNC_DIGEST_INIT 2 +# define OSSL_FUNC_DIGEST_UPDATE 3 +# define OSSL_FUNC_DIGEST_FINAL 4 +# define OSSL_FUNC_DIGEST_DIGEST 5 +# define OSSL_FUNC_DIGEST_FREECTX 6 +# define OSSL_FUNC_DIGEST_DUPCTX 7 +# define OSSL_FUNC_DIGEST_GET_PARAMS 8 +# define OSSL_FUNC_DIGEST_SET_CTX_PARAMS 9 +# define OSSL_FUNC_DIGEST_GET_CTX_PARAMS 10 +# define OSSL_FUNC_DIGEST_GETTABLE_PARAMS 11 +# define OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS 12 +# define OSSL_FUNC_DIGEST_GETTABLE_CTX_PARAMS 13 + +OSSL_CORE_MAKE_FUNC(void *, digest_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, digest_init, (void *dctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, digest_update, + (void *dctx, const unsigned char *in, size_t inl)) +OSSL_CORE_MAKE_FUNC(int, digest_final, + (void *dctx, + unsigned char *out, size_t *outl, size_t outsz)) +OSSL_CORE_MAKE_FUNC(int, digest_digest, + (void *provctx, const unsigned char *in, size_t inl, + unsigned char *out, size_t *outl, size_t outsz)) + +OSSL_CORE_MAKE_FUNC(void, digest_freectx, (void *dctx)) +OSSL_CORE_MAKE_FUNC(void *, digest_dupctx, (void *dctx)) + +OSSL_CORE_MAKE_FUNC(int, digest_get_params, (OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, digest_set_ctx_params, + (void *vctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, digest_get_ctx_params, + (void *vctx, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, digest_gettable_params, + (void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, digest_settable_ctx_params, + (void *dctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, digest_gettable_ctx_params, + (void *dctx, void *provctx)) + +/* Symmetric Ciphers */ + +# define OSSL_FUNC_CIPHER_NEWCTX 1 +# define OSSL_FUNC_CIPHER_ENCRYPT_INIT 2 +# define OSSL_FUNC_CIPHER_DECRYPT_INIT 3 +# define OSSL_FUNC_CIPHER_UPDATE 4 +# define OSSL_FUNC_CIPHER_FINAL 5 +# define OSSL_FUNC_CIPHER_CIPHER 6 +# define OSSL_FUNC_CIPHER_FREECTX 7 +# define OSSL_FUNC_CIPHER_DUPCTX 8 +# define OSSL_FUNC_CIPHER_GET_PARAMS 9 +# define OSSL_FUNC_CIPHER_GET_CTX_PARAMS 10 +# define OSSL_FUNC_CIPHER_SET_CTX_PARAMS 11 +# define OSSL_FUNC_CIPHER_GETTABLE_PARAMS 12 +# define OSSL_FUNC_CIPHER_GETTABLE_CTX_PARAMS 13 +# define OSSL_FUNC_CIPHER_SETTABLE_CTX_PARAMS 14 + +OSSL_CORE_MAKE_FUNC(void *, cipher_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, cipher_encrypt_init, (void *cctx, + const unsigned char *key, + size_t keylen, + const unsigned char *iv, + size_t ivlen, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, cipher_decrypt_init, (void *cctx, + const unsigned char *key, + size_t keylen, + const unsigned char *iv, + size_t ivlen, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, cipher_update, + (void *cctx, + unsigned char *out, size_t *outl, size_t outsize, + const unsigned char *in, size_t inl)) +OSSL_CORE_MAKE_FUNC(int, cipher_final, + (void *cctx, + unsigned char *out, size_t *outl, size_t outsize)) +OSSL_CORE_MAKE_FUNC(int, cipher_cipher, + (void *cctx, + unsigned char *out, size_t *outl, size_t outsize, + const unsigned char *in, size_t inl)) +OSSL_CORE_MAKE_FUNC(void, cipher_freectx, (void *cctx)) +OSSL_CORE_MAKE_FUNC(void *, cipher_dupctx, (void *cctx)) +OSSL_CORE_MAKE_FUNC(int, cipher_get_params, (OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, cipher_get_ctx_params, (void *cctx, + OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, cipher_set_ctx_params, (void *cctx, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, cipher_gettable_params, + (void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, cipher_settable_ctx_params, + (void *cctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, cipher_gettable_ctx_params, + (void *cctx, void *provctx)) + +/* MACs */ + +# define OSSL_FUNC_MAC_NEWCTX 1 +# define OSSL_FUNC_MAC_DUPCTX 2 +# define OSSL_FUNC_MAC_FREECTX 3 +# define OSSL_FUNC_MAC_INIT 4 +# define OSSL_FUNC_MAC_UPDATE 5 +# define OSSL_FUNC_MAC_FINAL 6 +# define OSSL_FUNC_MAC_GET_PARAMS 7 +# define OSSL_FUNC_MAC_GET_CTX_PARAMS 8 +# define OSSL_FUNC_MAC_SET_CTX_PARAMS 9 +# define OSSL_FUNC_MAC_GETTABLE_PARAMS 10 +# define OSSL_FUNC_MAC_GETTABLE_CTX_PARAMS 11 +# define OSSL_FUNC_MAC_SETTABLE_CTX_PARAMS 12 + +OSSL_CORE_MAKE_FUNC(void *, mac_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(void *, mac_dupctx, (void *src)) +OSSL_CORE_MAKE_FUNC(void, mac_freectx, (void *mctx)) +OSSL_CORE_MAKE_FUNC(int, mac_init, (void *mctx, const unsigned char *key, + size_t keylen, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, mac_update, + (void *mctx, const unsigned char *in, size_t inl)) +OSSL_CORE_MAKE_FUNC(int, mac_final, + (void *mctx, + unsigned char *out, size_t *outl, size_t outsize)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, mac_gettable_params, (void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, mac_gettable_ctx_params, + (void *mctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, mac_settable_ctx_params, + (void *mctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(int, mac_get_params, (OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, mac_get_ctx_params, + (void *mctx, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, mac_set_ctx_params, + (void *mctx, const OSSL_PARAM params[])) + +/* KDFs and PRFs */ + +# define OSSL_FUNC_KDF_NEWCTX 1 +# define OSSL_FUNC_KDF_DUPCTX 2 +# define OSSL_FUNC_KDF_FREECTX 3 +# define OSSL_FUNC_KDF_RESET 4 +# define OSSL_FUNC_KDF_DERIVE 5 +# define OSSL_FUNC_KDF_GETTABLE_PARAMS 6 +# define OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS 7 +# define OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS 8 +# define OSSL_FUNC_KDF_GET_PARAMS 9 +# define OSSL_FUNC_KDF_GET_CTX_PARAMS 10 +# define OSSL_FUNC_KDF_SET_CTX_PARAMS 11 + +OSSL_CORE_MAKE_FUNC(void *, kdf_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(void *, kdf_dupctx, (void *src)) +OSSL_CORE_MAKE_FUNC(void, kdf_freectx, (void *kctx)) +OSSL_CORE_MAKE_FUNC(void, kdf_reset, (void *kctx)) +OSSL_CORE_MAKE_FUNC(int, kdf_derive, (void *kctx, unsigned char *key, + size_t keylen, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, kdf_gettable_params, (void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, kdf_gettable_ctx_params, + (void *kctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, kdf_settable_ctx_params, + (void *kctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(int, kdf_get_params, (OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, kdf_get_ctx_params, + (void *kctx, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, kdf_set_ctx_params, + (void *kctx, const OSSL_PARAM params[])) + +/* RAND */ + +# define OSSL_FUNC_RAND_NEWCTX 1 +# define OSSL_FUNC_RAND_FREECTX 2 +# define OSSL_FUNC_RAND_INSTANTIATE 3 +# define OSSL_FUNC_RAND_UNINSTANTIATE 4 +# define OSSL_FUNC_RAND_GENERATE 5 +# define OSSL_FUNC_RAND_RESEED 6 +# define OSSL_FUNC_RAND_NONCE 7 +# define OSSL_FUNC_RAND_ENABLE_LOCKING 8 +# define OSSL_FUNC_RAND_LOCK 9 +# define OSSL_FUNC_RAND_UNLOCK 10 +# define OSSL_FUNC_RAND_GETTABLE_PARAMS 11 +# define OSSL_FUNC_RAND_GETTABLE_CTX_PARAMS 12 +# define OSSL_FUNC_RAND_SETTABLE_CTX_PARAMS 13 +# define OSSL_FUNC_RAND_GET_PARAMS 14 +# define OSSL_FUNC_RAND_GET_CTX_PARAMS 15 +# define OSSL_FUNC_RAND_SET_CTX_PARAMS 16 +# define OSSL_FUNC_RAND_VERIFY_ZEROIZATION 17 +# define OSSL_FUNC_RAND_GET_SEED 18 +# define OSSL_FUNC_RAND_CLEAR_SEED 19 + +OSSL_CORE_MAKE_FUNC(void *,rand_newctx, + (void *provctx, void *parent, + const OSSL_DISPATCH *parent_calls)) +OSSL_CORE_MAKE_FUNC(void,rand_freectx, (void *vctx)) +OSSL_CORE_MAKE_FUNC(int,rand_instantiate, + (void *vdrbg, unsigned int strength, + int prediction_resistance, + const unsigned char *pstr, size_t pstr_len, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int,rand_uninstantiate, (void *vdrbg)) +OSSL_CORE_MAKE_FUNC(int,rand_generate, + (void *vctx, unsigned char *out, size_t outlen, + unsigned int strength, int prediction_resistance, + const unsigned char *addin, size_t addin_len)) +OSSL_CORE_MAKE_FUNC(int,rand_reseed, + (void *vctx, int prediction_resistance, + const unsigned char *ent, size_t ent_len, + const unsigned char *addin, size_t addin_len)) +OSSL_CORE_MAKE_FUNC(size_t,rand_nonce, + (void *vctx, unsigned char *out, unsigned int strength, + size_t min_noncelen, size_t max_noncelen)) +OSSL_CORE_MAKE_FUNC(int,rand_enable_locking, (void *vctx)) +OSSL_CORE_MAKE_FUNC(int,rand_lock, (void *vctx)) +OSSL_CORE_MAKE_FUNC(void,rand_unlock, (void *vctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *,rand_gettable_params, (void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *,rand_gettable_ctx_params, + (void *vctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *,rand_settable_ctx_params, + (void *vctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(int,rand_get_params, (OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int,rand_get_ctx_params, + (void *vctx, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int,rand_set_ctx_params, + (void *vctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(void,rand_set_callbacks, + (void *vctx, OSSL_INOUT_CALLBACK *get_entropy, + OSSL_CALLBACK *cleanup_entropy, + OSSL_INOUT_CALLBACK *get_nonce, + OSSL_CALLBACK *cleanup_nonce, void *arg)) +OSSL_CORE_MAKE_FUNC(int,rand_verify_zeroization, + (void *vctx)) +OSSL_CORE_MAKE_FUNC(size_t,rand_get_seed, + (void *vctx, unsigned char **buffer, + int entropy, size_t min_len, size_t max_len, + int prediction_resistance, + const unsigned char *adin, size_t adin_len)) +OSSL_CORE_MAKE_FUNC(void,rand_clear_seed, + (void *vctx, unsigned char *buffer, size_t b_len)) + +/*- + * Key management + * + * The Key Management takes care of provider side key objects, and includes + * all current functionality to create them, destroy them, set parameters + * and key material, etc, essentially everything that manipulates the keys + * themselves and their parameters. + * + * The key objects are commonly refered to as |keydata|, and it MUST be able + * to contain parameters if the key has any, the public key and the private + * key. All parts are optional, but their presence determines what can be + * done with the key object in terms of encryption, signature, and so on. + * The assumption from libcrypto is that the key object contains any of the + * following data combinations: + * + * - parameters only + * - public key only + * - public key + private key + * - parameters + public key + * - parameters + public key + private key + * + * What "parameters", "public key" and "private key" means in detail is left + * to the implementation. In the case of DH and DSA, they would typically + * include domain parameters, while for certain variants of RSA, they would + * typically include PSS or OAEP parameters. + * + * Key objects are created with OSSL_FUNC_keymgmt_new() and destroyed with + * OSSL_FUNC_keymgmt_free(). Key objects can have data filled in with + * OSSL_FUNC_keymgmt_import(). + * + * Three functions are made available to check what selection of data is + * present in a key object: OSSL_FUNC_keymgmt_has_parameters(), + * OSSL_FUNC_keymgmt_has_public_key(), and OSSL_FUNC_keymgmt_has_private_key(), + */ + +/* Key data subset selection - individual bits */ +# define OSSL_KEYMGMT_SELECT_PRIVATE_KEY 0x01 +# define OSSL_KEYMGMT_SELECT_PUBLIC_KEY 0x02 +# define OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS 0x04 +# define OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS 0x80 + +/* Key data subset selection - combinations */ +# define OSSL_KEYMGMT_SELECT_ALL_PARAMETERS \ + ( OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS \ + | OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS) +# define OSSL_KEYMGMT_SELECT_KEYPAIR \ + ( OSSL_KEYMGMT_SELECT_PRIVATE_KEY | OSSL_KEYMGMT_SELECT_PUBLIC_KEY ) +# define OSSL_KEYMGMT_SELECT_ALL \ + ( OSSL_KEYMGMT_SELECT_KEYPAIR | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ) + +# define OSSL_KEYMGMT_VALIDATE_FULL_CHECK 0 +# define OSSL_KEYMGMT_VALIDATE_QUICK_CHECK 1 + +/* Basic key object creation */ +# define OSSL_FUNC_KEYMGMT_NEW 1 +OSSL_CORE_MAKE_FUNC(void *, keymgmt_new, (void *provctx)) + +/* Generation, a more complex constructor */ +# define OSSL_FUNC_KEYMGMT_GEN_INIT 2 +# define OSSL_FUNC_KEYMGMT_GEN_SET_TEMPLATE 3 +# define OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS 4 +# define OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS 5 +# define OSSL_FUNC_KEYMGMT_GEN 6 +# define OSSL_FUNC_KEYMGMT_GEN_CLEANUP 7 +OSSL_CORE_MAKE_FUNC(void *, keymgmt_gen_init, + (void *provctx, int selection, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, keymgmt_gen_set_template, + (void *genctx, void *templ)) +OSSL_CORE_MAKE_FUNC(int, keymgmt_gen_set_params, + (void *genctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, + keymgmt_gen_settable_params, + (void *genctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(void *, keymgmt_gen, + (void *genctx, OSSL_CALLBACK *cb, void *cbarg)) +OSSL_CORE_MAKE_FUNC(void, keymgmt_gen_cleanup, (void *genctx)) + +/* Key loading by object reference */ +# define OSSL_FUNC_KEYMGMT_LOAD 8 +OSSL_CORE_MAKE_FUNC(void *, keymgmt_load, + (const void *reference, size_t reference_sz)) + +/* Basic key object destruction */ +# define OSSL_FUNC_KEYMGMT_FREE 10 +OSSL_CORE_MAKE_FUNC(void, keymgmt_free, (void *keydata)) + +/* Key object information, with discovery */ +#define OSSL_FUNC_KEYMGMT_GET_PARAMS 11 +#define OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS 12 +OSSL_CORE_MAKE_FUNC(int, keymgmt_get_params, + (void *keydata, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, keymgmt_gettable_params, + (void *provctx)) + +#define OSSL_FUNC_KEYMGMT_SET_PARAMS 13 +#define OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS 14 +OSSL_CORE_MAKE_FUNC(int, keymgmt_set_params, + (void *keydata, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, keymgmt_settable_params, + (void *provctx)) + +/* Key checks - discovery of supported operations */ +# define OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME 20 +OSSL_CORE_MAKE_FUNC(const char *, keymgmt_query_operation_name, + (int operation_id)) + +/* Key checks - key data content checks */ +# define OSSL_FUNC_KEYMGMT_HAS 21 +OSSL_CORE_MAKE_FUNC(int, keymgmt_has, (const void *keydata, int selection)) + +/* Key checks - validation */ +# define OSSL_FUNC_KEYMGMT_VALIDATE 22 +OSSL_CORE_MAKE_FUNC(int, keymgmt_validate, (const void *keydata, int selection, + int checktype)) + +/* Key checks - matching */ +# define OSSL_FUNC_KEYMGMT_MATCH 23 +OSSL_CORE_MAKE_FUNC(int, keymgmt_match, + (const void *keydata1, const void *keydata2, + int selection)) + +/* Import and export functions, with discovery */ +# define OSSL_FUNC_KEYMGMT_IMPORT 40 +# define OSSL_FUNC_KEYMGMT_IMPORT_TYPES 41 +# define OSSL_FUNC_KEYMGMT_EXPORT 42 +# define OSSL_FUNC_KEYMGMT_EXPORT_TYPES 43 +OSSL_CORE_MAKE_FUNC(int, keymgmt_import, + (void *keydata, int selection, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, keymgmt_import_types, + (int selection)) +OSSL_CORE_MAKE_FUNC(int, keymgmt_export, + (void *keydata, int selection, + OSSL_CALLBACK *param_cb, void *cbarg)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, keymgmt_export_types, + (int selection)) + +/* Dup function, constructor */ +# define OSSL_FUNC_KEYMGMT_DUP 44 +OSSL_CORE_MAKE_FUNC(void *, keymgmt_dup, + (const void *keydata_from, int selection)) + +/* Key Exchange */ + +# define OSSL_FUNC_KEYEXCH_NEWCTX 1 +# define OSSL_FUNC_KEYEXCH_INIT 2 +# define OSSL_FUNC_KEYEXCH_DERIVE 3 +# define OSSL_FUNC_KEYEXCH_SET_PEER 4 +# define OSSL_FUNC_KEYEXCH_FREECTX 5 +# define OSSL_FUNC_KEYEXCH_DUPCTX 6 +# define OSSL_FUNC_KEYEXCH_SET_CTX_PARAMS 7 +# define OSSL_FUNC_KEYEXCH_SETTABLE_CTX_PARAMS 8 +# define OSSL_FUNC_KEYEXCH_GET_CTX_PARAMS 9 +# define OSSL_FUNC_KEYEXCH_GETTABLE_CTX_PARAMS 10 + +OSSL_CORE_MAKE_FUNC(void *, keyexch_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, keyexch_init, (void *ctx, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, keyexch_derive, (void *ctx, unsigned char *secret, + size_t *secretlen, size_t outlen)) +OSSL_CORE_MAKE_FUNC(int, keyexch_set_peer, (void *ctx, void *provkey)) +OSSL_CORE_MAKE_FUNC(void, keyexch_freectx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(void *, keyexch_dupctx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(int, keyexch_set_ctx_params, (void *ctx, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, keyexch_settable_ctx_params, + (void *ctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(int, keyexch_get_ctx_params, (void *ctx, + OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, keyexch_gettable_ctx_params, + (void *ctx, void *provctx)) + +/* Signature */ + +# define OSSL_FUNC_SIGNATURE_NEWCTX 1 +# define OSSL_FUNC_SIGNATURE_SIGN_INIT 2 +# define OSSL_FUNC_SIGNATURE_SIGN 3 +# define OSSL_FUNC_SIGNATURE_VERIFY_INIT 4 +# define OSSL_FUNC_SIGNATURE_VERIFY 5 +# define OSSL_FUNC_SIGNATURE_VERIFY_RECOVER_INIT 6 +# define OSSL_FUNC_SIGNATURE_VERIFY_RECOVER 7 +# define OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT 8 +# define OSSL_FUNC_SIGNATURE_DIGEST_SIGN_UPDATE 9 +# define OSSL_FUNC_SIGNATURE_DIGEST_SIGN_FINAL 10 +# define OSSL_FUNC_SIGNATURE_DIGEST_SIGN 11 +# define OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT 12 +# define OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_UPDATE 13 +# define OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_FINAL 14 +# define OSSL_FUNC_SIGNATURE_DIGEST_VERIFY 15 +# define OSSL_FUNC_SIGNATURE_FREECTX 16 +# define OSSL_FUNC_SIGNATURE_DUPCTX 17 +# define OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS 18 +# define OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS 19 +# define OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS 20 +# define OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS 21 +# define OSSL_FUNC_SIGNATURE_GET_CTX_MD_PARAMS 22 +# define OSSL_FUNC_SIGNATURE_GETTABLE_CTX_MD_PARAMS 23 +# define OSSL_FUNC_SIGNATURE_SET_CTX_MD_PARAMS 24 +# define OSSL_FUNC_SIGNATURE_SETTABLE_CTX_MD_PARAMS 25 + +OSSL_CORE_MAKE_FUNC(void *, signature_newctx, (void *provctx, + const char *propq)) +OSSL_CORE_MAKE_FUNC(int, signature_sign_init, (void *ctx, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, signature_sign, (void *ctx, unsigned char *sig, + size_t *siglen, size_t sigsize, + const unsigned char *tbs, + size_t tbslen)) +OSSL_CORE_MAKE_FUNC(int, signature_verify_init, (void *ctx, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, signature_verify, (void *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)) +OSSL_CORE_MAKE_FUNC(int, signature_verify_recover_init, + (void *ctx, void *provkey, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, signature_verify_recover, + (void *ctx, unsigned char *rout, size_t *routlen, + size_t routsize, const unsigned char *sig, size_t siglen)) +OSSL_CORE_MAKE_FUNC(int, signature_digest_sign_init, + (void *ctx, const char *mdname, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, signature_digest_sign_update, + (void *ctx, const unsigned char *data, size_t datalen)) +OSSL_CORE_MAKE_FUNC(int, signature_digest_sign_final, + (void *ctx, unsigned char *sig, size_t *siglen, + size_t sigsize)) +OSSL_CORE_MAKE_FUNC(int, signature_digest_sign, + (void *ctx, unsigned char *sigret, size_t *siglen, + size_t sigsize, const unsigned char *tbs, size_t tbslen)) +OSSL_CORE_MAKE_FUNC(int, signature_digest_verify_init, + (void *ctx, const char *mdname, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, signature_digest_verify_update, + (void *ctx, const unsigned char *data, size_t datalen)) +OSSL_CORE_MAKE_FUNC(int, signature_digest_verify_final, + (void *ctx, const unsigned char *sig, size_t siglen)) +OSSL_CORE_MAKE_FUNC(int, signature_digest_verify, + (void *ctx, const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen)) +OSSL_CORE_MAKE_FUNC(void, signature_freectx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(void *, signature_dupctx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(int, signature_get_ctx_params, + (void *ctx, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, signature_gettable_ctx_params, + (void *ctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(int, signature_set_ctx_params, + (void *ctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, signature_settable_ctx_params, + (void *ctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(int, signature_get_ctx_md_params, + (void *ctx, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, signature_gettable_ctx_md_params, + (void *ctx)) +OSSL_CORE_MAKE_FUNC(int, signature_set_ctx_md_params, + (void *ctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, signature_settable_ctx_md_params, + (void *ctx)) + + +/* Asymmetric Ciphers */ + +# define OSSL_FUNC_ASYM_CIPHER_NEWCTX 1 +# define OSSL_FUNC_ASYM_CIPHER_ENCRYPT_INIT 2 +# define OSSL_FUNC_ASYM_CIPHER_ENCRYPT 3 +# define OSSL_FUNC_ASYM_CIPHER_DECRYPT_INIT 4 +# define OSSL_FUNC_ASYM_CIPHER_DECRYPT 5 +# define OSSL_FUNC_ASYM_CIPHER_FREECTX 6 +# define OSSL_FUNC_ASYM_CIPHER_DUPCTX 7 +# define OSSL_FUNC_ASYM_CIPHER_GET_CTX_PARAMS 8 +# define OSSL_FUNC_ASYM_CIPHER_GETTABLE_CTX_PARAMS 9 +# define OSSL_FUNC_ASYM_CIPHER_SET_CTX_PARAMS 10 +# define OSSL_FUNC_ASYM_CIPHER_SETTABLE_CTX_PARAMS 11 + +OSSL_CORE_MAKE_FUNC(void *, asym_cipher_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, asym_cipher_encrypt_init, (void *ctx, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, asym_cipher_encrypt, (void *ctx, unsigned char *out, + size_t *outlen, + size_t outsize, + const unsigned char *in, + size_t inlen)) +OSSL_CORE_MAKE_FUNC(int, asym_cipher_decrypt_init, (void *ctx, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, asym_cipher_decrypt, (void *ctx, unsigned char *out, + size_t *outlen, + size_t outsize, + const unsigned char *in, + size_t inlen)) +OSSL_CORE_MAKE_FUNC(void, asym_cipher_freectx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(void *, asym_cipher_dupctx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(int, asym_cipher_get_ctx_params, + (void *ctx, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, asym_cipher_gettable_ctx_params, + (void *ctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(int, asym_cipher_set_ctx_params, + (void *ctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, asym_cipher_settable_ctx_params, + (void *ctx, void *provctx)) + +/* Asymmetric Key encapsulation */ +# define OSSL_FUNC_KEM_NEWCTX 1 +# define OSSL_FUNC_KEM_ENCAPSULATE_INIT 2 +# define OSSL_FUNC_KEM_ENCAPSULATE 3 +# define OSSL_FUNC_KEM_DECAPSULATE_INIT 4 +# define OSSL_FUNC_KEM_DECAPSULATE 5 +# define OSSL_FUNC_KEM_FREECTX 6 +# define OSSL_FUNC_KEM_DUPCTX 7 +# define OSSL_FUNC_KEM_GET_CTX_PARAMS 8 +# define OSSL_FUNC_KEM_GETTABLE_CTX_PARAMS 9 +# define OSSL_FUNC_KEM_SET_CTX_PARAMS 10 +# define OSSL_FUNC_KEM_SETTABLE_CTX_PARAMS 11 + +OSSL_CORE_MAKE_FUNC(void *, kem_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, kem_encapsulate_init, (void *ctx, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, kem_encapsulate, (void *ctx, + unsigned char *out, size_t *outlen, + unsigned char *secret, + size_t *secretlen)) +OSSL_CORE_MAKE_FUNC(int, kem_decapsulate_init, (void *ctx, void *provkey, + const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, kem_decapsulate, (void *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen)) +OSSL_CORE_MAKE_FUNC(void, kem_freectx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(void *, kem_dupctx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(int, kem_get_ctx_params, (void *ctx, OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, kem_gettable_ctx_params, + (void *ctx, void *provctx)) +OSSL_CORE_MAKE_FUNC(int, kem_set_ctx_params, + (void *ctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, kem_settable_ctx_params, + (void *ctx, void *provctx)) + +/* Encoders and decoders */ +# define OSSL_FUNC_ENCODER_NEWCTX 1 +# define OSSL_FUNC_ENCODER_FREECTX 2 +# define OSSL_FUNC_ENCODER_GET_PARAMS 3 +# define OSSL_FUNC_ENCODER_GETTABLE_PARAMS 4 +# define OSSL_FUNC_ENCODER_SET_CTX_PARAMS 5 +# define OSSL_FUNC_ENCODER_SETTABLE_CTX_PARAMS 6 +# define OSSL_FUNC_ENCODER_DOES_SELECTION 10 +# define OSSL_FUNC_ENCODER_ENCODE 11 +# define OSSL_FUNC_ENCODER_IMPORT_OBJECT 20 +# define OSSL_FUNC_ENCODER_FREE_OBJECT 21 +OSSL_CORE_MAKE_FUNC(void *, encoder_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(void, encoder_freectx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(int, encoder_get_params, (OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, encoder_gettable_params, + (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, encoder_set_ctx_params, + (void *ctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, encoder_settable_ctx_params, + (void *provctx)) + +OSSL_CORE_MAKE_FUNC(int, encoder_does_selection, + (void *provctx, int selection)) +OSSL_CORE_MAKE_FUNC(int, encoder_encode, + (void *ctx, OSSL_CORE_BIO *out, + const void *obj_raw, const OSSL_PARAM obj_abstract[], + int selection, + OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg)) + +OSSL_CORE_MAKE_FUNC(void *, encoder_import_object, + (void *ctx, int selection, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(void, encoder_free_object, (void *obj)) + +# define OSSL_FUNC_DECODER_NEWCTX 1 +# define OSSL_FUNC_DECODER_FREECTX 2 +# define OSSL_FUNC_DECODER_GET_PARAMS 3 +# define OSSL_FUNC_DECODER_GETTABLE_PARAMS 4 +# define OSSL_FUNC_DECODER_SET_CTX_PARAMS 5 +# define OSSL_FUNC_DECODER_SETTABLE_CTX_PARAMS 6 +# define OSSL_FUNC_DECODER_DOES_SELECTION 10 +# define OSSL_FUNC_DECODER_DECODE 11 +# define OSSL_FUNC_DECODER_EXPORT_OBJECT 20 +OSSL_CORE_MAKE_FUNC(void *, decoder_newctx, (void *provctx)) +OSSL_CORE_MAKE_FUNC(void, decoder_freectx, (void *ctx)) +OSSL_CORE_MAKE_FUNC(int, decoder_get_params, (OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, decoder_gettable_params, + (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, decoder_set_ctx_params, + (void *ctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, decoder_settable_ctx_params, + (void *provctx)) + +OSSL_CORE_MAKE_FUNC(int, decoder_does_selection, + (void *provctx, int selection)) +OSSL_CORE_MAKE_FUNC(int, decoder_decode, + (void *ctx, OSSL_CORE_BIO *in, int selection, + OSSL_CALLBACK *data_cb, void *data_cbarg, + OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg)) +OSSL_CORE_MAKE_FUNC(int, decoder_export_object, + (void *ctx, const void *objref, size_t objref_sz, + OSSL_CALLBACK *export_cb, void *export_cbarg)) + +/*- + * Store + * + * Objects are scanned by using the 'open', 'load', 'eof' and 'close' + * functions, which implement an OSSL_STORE loader. + * + * store_load() works in a way that's very similar to the decoders, in + * that they pass an abstract object through a callback, either as a DER + * octet string or as an object reference, which libcrypto will have to + * deal with. + */ + +#define OSSL_FUNC_STORE_OPEN 1 +#define OSSL_FUNC_STORE_ATTACH 2 +#define OSSL_FUNC_STORE_SETTABLE_CTX_PARAMS 3 +#define OSSL_FUNC_STORE_SET_CTX_PARAMS 4 +#define OSSL_FUNC_STORE_LOAD 5 +#define OSSL_FUNC_STORE_EOF 6 +#define OSSL_FUNC_STORE_CLOSE 7 +#define OSSL_FUNC_STORE_EXPORT_OBJECT 8 +OSSL_CORE_MAKE_FUNC(void *, store_open, (void *provctx, const char *uri)) +OSSL_CORE_MAKE_FUNC(void *, store_attach, (void *provctx, OSSL_CORE_BIO *in)) +OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, store_settable_ctx_params, + (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, store_set_ctx_params, + (void *loaderctx, const OSSL_PARAM params[])) +OSSL_CORE_MAKE_FUNC(int, store_load, + (void *loaderctx, + OSSL_CALLBACK *object_cb, void *object_cbarg, + OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg)) +OSSL_CORE_MAKE_FUNC(int, store_eof, (void *loaderctx)) +OSSL_CORE_MAKE_FUNC(int, store_close, (void *loaderctx)) +OSSL_CORE_MAKE_FUNC(int, store_export_object, + (void *loaderctx, const void *objref, size_t objref_sz, + OSSL_CALLBACK *export_cb, void *export_cbarg)) + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/core_names.h b/OtherInc/openssl/include/openssl/core_names.h new file mode 100644 index 0000000..b549dae --- /dev/null +++ b/OtherInc/openssl/include/openssl/core_names.h @@ -0,0 +1,556 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CORE_NAMES_H +# define OPENSSL_CORE_NAMES_H +# pragma once + +# ifdef __cplusplus +extern "C" { +# endif + +/* Well known parameter names that core passes to providers */ +#define OSSL_PROV_PARAM_CORE_VERSION "openssl-version" /* utf8_ptr */ +#define OSSL_PROV_PARAM_CORE_PROV_NAME "provider-name" /* utf8_ptr */ +#define OSSL_PROV_PARAM_CORE_MODULE_FILENAME "module-filename" /* utf8_ptr */ + +/* Well known parameter names that Providers can define */ +#define OSSL_PROV_PARAM_NAME "name" /* utf8_string */ +#define OSSL_PROV_PARAM_VERSION "version" /* utf8_string */ +#define OSSL_PROV_PARAM_BUILDINFO "buildinfo" /* utf8_string */ +#define OSSL_PROV_PARAM_STATUS "status" /* uint */ +#define OSSL_PROV_PARAM_SECURITY_CHECKS "security-checks" /* uint */ + +/* Self test callback parameters */ +#define OSSL_PROV_PARAM_SELF_TEST_PHASE "st-phase" /* utf8_string */ +#define OSSL_PROV_PARAM_SELF_TEST_TYPE "st-type" /* utf8_string */ +#define OSSL_PROV_PARAM_SELF_TEST_DESC "st-desc" /* utf8_string */ + +/*- + * Provider-native object abstractions + * + * These are used when a provider wants to pass object data or an object + * reference back to libcrypto. This is only useful for provider functions + * that take a callback to which an OSSL_PARAM array with these parameters + * can be passed. + * + * This set of parameter names is explained in detail in provider-object(7) + * (doc/man7/provider-object.pod) + */ +#define OSSL_OBJECT_PARAM_TYPE "type" /* INTEGER */ +#define OSSL_OBJECT_PARAM_DATA_TYPE "data-type" /* UTF8_STRING */ +#define OSSL_OBJECT_PARAM_DATA_STRUCTURE "data-structure" /* UTF8_STRING */ +#define OSSL_OBJECT_PARAM_REFERENCE "reference" /* OCTET_STRING */ +#define OSSL_OBJECT_PARAM_DATA "data" /* OCTET_STRING or UTF8_STRING */ +#define OSSL_OBJECT_PARAM_DESC "desc" /* UTF8_STRING */ + +/* + * Algorithm parameters + * If "engine" or "properties" are specified, they should always be paired + * with the algorithm type. + * Note these are common names that are shared by many types (such as kdf, mac, + * and pkey) e.g: see OSSL_MAC_PARAM_DIGEST below. + */ +#define OSSL_ALG_PARAM_DIGEST "digest" /* utf8_string */ +#define OSSL_ALG_PARAM_CIPHER "cipher" /* utf8_string */ +#define OSSL_ALG_PARAM_ENGINE "engine" /* utf8_string */ +#define OSSL_ALG_PARAM_MAC "mac" /* utf8_string */ +#define OSSL_ALG_PARAM_PROPERTIES "properties"/* utf8_string */ + +/* cipher parameters */ +#define OSSL_CIPHER_PARAM_PADDING "padding" /* uint */ +#define OSSL_CIPHER_PARAM_USE_BITS "use-bits" /* uint */ +#define OSSL_CIPHER_PARAM_TLS_VERSION "tls-version" /* uint */ +#define OSSL_CIPHER_PARAM_TLS_MAC "tls-mac" /* octet_ptr */ +#define OSSL_CIPHER_PARAM_TLS_MAC_SIZE "tls-mac-size" /* size_t */ +#define OSSL_CIPHER_PARAM_MODE "mode" /* uint */ +#define OSSL_CIPHER_PARAM_BLOCK_SIZE "blocksize" /* size_t */ +#define OSSL_CIPHER_PARAM_AEAD "aead" /* int, 0 or 1 */ +#define OSSL_CIPHER_PARAM_CUSTOM_IV "custom-iv" /* int, 0 or 1 */ +#define OSSL_CIPHER_PARAM_CTS "cts" /* int, 0 or 1 */ +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK "tls-multi" /* int, 0 or 1 */ +#define OSSL_CIPHER_PARAM_HAS_RAND_KEY "has-randkey" /* int, 0 or 1 */ +#define OSSL_CIPHER_PARAM_KEYLEN "keylen" /* size_t */ +#define OSSL_CIPHER_PARAM_IVLEN "ivlen" /* size_t */ +#define OSSL_CIPHER_PARAM_IV "iv" /* octet_string OR octet_ptr */ +#define OSSL_CIPHER_PARAM_UPDATED_IV "updated-iv" /* octet_string OR octet_ptr */ +#define OSSL_CIPHER_PARAM_NUM "num" /* uint */ +#define OSSL_CIPHER_PARAM_ROUNDS "rounds" /* uint */ +#define OSSL_CIPHER_PARAM_AEAD_TAG "tag" /* octet_string */ +#define OSSL_CIPHER_PARAM_AEAD_TLS1_AAD "tlsaad" /* octet_string */ +#define OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD "tlsaadpad" /* size_t */ +#define OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED "tlsivfixed" /* octet_string */ +#define OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN "tlsivgen" /* octet_string */ +#define OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV "tlsivinv" /* octet_string */ +#define OSSL_CIPHER_PARAM_AEAD_IVLEN OSSL_CIPHER_PARAM_IVLEN +#define OSSL_CIPHER_PARAM_AEAD_TAGLEN "taglen" /* size_t */ +#define OSSL_CIPHER_PARAM_AEAD_MAC_KEY "mackey" /* octet_string */ +#define OSSL_CIPHER_PARAM_RANDOM_KEY "randkey" /* octet_string */ +#define OSSL_CIPHER_PARAM_RC2_KEYBITS "keybits" /* size_t */ +#define OSSL_CIPHER_PARAM_SPEED "speed" /* uint */ +#define OSSL_CIPHER_PARAM_CTS_MODE "cts_mode" /* utf8_string */ +/* For passing the AlgorithmIdentifier parameter in DER form */ +#define OSSL_CIPHER_PARAM_ALGORITHM_ID_PARAMS "alg_id_param" /* octet_string */ + +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT \ + "tls1multi_maxsndfrag" /* uint */ +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE \ + "tls1multi_maxbufsz" /* size_t */ +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE \ + "tls1multi_interleave" /* uint */ +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD \ + "tls1multi_aad" /* octet_string */ +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN \ + "tls1multi_aadpacklen" /* uint */ +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC \ + "tls1multi_enc" /* octet_string */ +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN \ + "tls1multi_encin" /* octet_string */ +#define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN \ + "tls1multi_enclen" /* size_t */ + +/* OSSL_CIPHER_PARAM_CTS_MODE Values */ +#define OSSL_CIPHER_CTS_MODE_CS1 "CS1" +#define OSSL_CIPHER_CTS_MODE_CS2 "CS2" +#define OSSL_CIPHER_CTS_MODE_CS3 "CS3" + +/* digest parameters */ +#define OSSL_DIGEST_PARAM_XOFLEN "xoflen" /* size_t */ +#define OSSL_DIGEST_PARAM_SSL3_MS "ssl3-ms" /* octet string */ +#define OSSL_DIGEST_PARAM_PAD_TYPE "pad-type" /* uint */ +#define OSSL_DIGEST_PARAM_MICALG "micalg" /* utf8 string */ +#define OSSL_DIGEST_PARAM_BLOCK_SIZE "blocksize" /* size_t */ +#define OSSL_DIGEST_PARAM_SIZE "size" /* size_t */ +#define OSSL_DIGEST_PARAM_XOF "xof" /* int, 0 or 1 */ +#define OSSL_DIGEST_PARAM_ALGID_ABSENT "algid-absent" /* int, 0 or 1 */ + +/* Known DIGEST names (not a complete list) */ +#define OSSL_DIGEST_NAME_MD5 "MD5" +#define OSSL_DIGEST_NAME_MD5_SHA1 "MD5-SHA1" +#define OSSL_DIGEST_NAME_SHA1 "SHA1" +#define OSSL_DIGEST_NAME_SHA2_224 "SHA2-224" +#define OSSL_DIGEST_NAME_SHA2_256 "SHA2-256" +#define OSSL_DIGEST_NAME_SHA2_384 "SHA2-384" +#define OSSL_DIGEST_NAME_SHA2_512 "SHA2-512" +#define OSSL_DIGEST_NAME_SHA2_512_224 "SHA2-512/224" +#define OSSL_DIGEST_NAME_SHA2_512_256 "SHA2-512/256" +#define OSSL_DIGEST_NAME_MD2 "MD2" +#define OSSL_DIGEST_NAME_MD4 "MD4" +#define OSSL_DIGEST_NAME_MDC2 "MDC2" +#define OSSL_DIGEST_NAME_RIPEMD160 "RIPEMD160" +#define OSSL_DIGEST_NAME_SHA3_224 "SHA3-224" +#define OSSL_DIGEST_NAME_SHA3_256 "SHA3-256" +#define OSSL_DIGEST_NAME_SHA3_384 "SHA3-384" +#define OSSL_DIGEST_NAME_SHA3_512 "SHA3-512" +#define OSSL_DIGEST_NAME_KECCAK_KMAC128 "KECCAK-KMAC-128" +#define OSSL_DIGEST_NAME_KECCAK_KMAC256 "KECCAK-KMAC-256" +#define OSSL_DIGEST_NAME_SM3 "SM3" + +/* MAC parameters */ +#define OSSL_MAC_PARAM_KEY "key" /* octet string */ +#define OSSL_MAC_PARAM_IV "iv" /* octet string */ +#define OSSL_MAC_PARAM_CUSTOM "custom" /* utf8 string */ +#define OSSL_MAC_PARAM_SALT "salt" /* octet string */ +#define OSSL_MAC_PARAM_XOF "xof" /* int, 0 or 1 */ +#define OSSL_MAC_PARAM_DIGEST_NOINIT "digest-noinit" /* int, 0 or 1 */ +#define OSSL_MAC_PARAM_DIGEST_ONESHOT "digest-oneshot" /* int, 0 or 1 */ +#define OSSL_MAC_PARAM_C_ROUNDS "c-rounds" /* unsigned int */ +#define OSSL_MAC_PARAM_D_ROUNDS "d-rounds" /* unsigned int */ + +/* + * If "engine" or "properties" are specified, they should always be paired + * with "cipher" or "digest". + */ +#define OSSL_MAC_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER /* utf8 string */ +#define OSSL_MAC_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST /* utf8 string */ +#define OSSL_MAC_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES /* utf8 string */ +#define OSSL_MAC_PARAM_SIZE "size" /* size_t */ +#define OSSL_MAC_PARAM_BLOCK_SIZE "block-size" /* size_t */ +#define OSSL_MAC_PARAM_TLS_DATA_SIZE "tls-data-size" /* size_t */ + +/* Known MAC names */ +#define OSSL_MAC_NAME_BLAKE2BMAC "BLAKE2BMAC" +#define OSSL_MAC_NAME_BLAKE2SMAC "BLAKE2SMAC" +#define OSSL_MAC_NAME_CMAC "CMAC" +#define OSSL_MAC_NAME_GMAC "GMAC" +#define OSSL_MAC_NAME_HMAC "HMAC" +#define OSSL_MAC_NAME_KMAC128 "KMAC128" +#define OSSL_MAC_NAME_KMAC256 "KMAC256" +#define OSSL_MAC_NAME_POLY1305 "POLY1305" +#define OSSL_MAC_NAME_SIPHASH "SIPHASH" + +/* KDF / PRF parameters */ +#define OSSL_KDF_PARAM_SECRET "secret" /* octet string */ +#define OSSL_KDF_PARAM_KEY "key" /* octet string */ +#define OSSL_KDF_PARAM_SALT "salt" /* octet string */ +#define OSSL_KDF_PARAM_PASSWORD "pass" /* octet string */ +#define OSSL_KDF_PARAM_PREFIX "prefix" /* octet string */ +#define OSSL_KDF_PARAM_LABEL "label" /* octet string */ +#define OSSL_KDF_PARAM_DATA "data" /* octet string */ +#define OSSL_KDF_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST /* utf8 string */ +#define OSSL_KDF_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER /* utf8 string */ +#define OSSL_KDF_PARAM_MAC OSSL_ALG_PARAM_MAC /* utf8 string */ +#define OSSL_KDF_PARAM_MAC_SIZE "maclen" /* size_t */ +#define OSSL_KDF_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES /* utf8 string */ +#define OSSL_KDF_PARAM_ITER "iter" /* unsigned int */ +#define OSSL_KDF_PARAM_MODE "mode" /* utf8 string or int */ +#define OSSL_KDF_PARAM_PKCS5 "pkcs5" /* int */ +#define OSSL_KDF_PARAM_UKM "ukm" /* octet string */ +#define OSSL_KDF_PARAM_CEK_ALG "cekalg" /* utf8 string */ +#define OSSL_KDF_PARAM_SCRYPT_N "n" /* uint64_t */ +#define OSSL_KDF_PARAM_SCRYPT_R "r" /* uint32_t */ +#define OSSL_KDF_PARAM_SCRYPT_P "p" /* uint32_t */ +#define OSSL_KDF_PARAM_SCRYPT_MAXMEM "maxmem_bytes" /* uint64_t */ +#define OSSL_KDF_PARAM_INFO "info" /* octet string */ +#define OSSL_KDF_PARAM_SEED "seed" /* octet string */ +#define OSSL_KDF_PARAM_SSHKDF_XCGHASH "xcghash" /* octet string */ +#define OSSL_KDF_PARAM_SSHKDF_SESSION_ID "session_id" /* octet string */ +#define OSSL_KDF_PARAM_SSHKDF_TYPE "type" /* int */ +#define OSSL_KDF_PARAM_SIZE "size" /* size_t */ +#define OSSL_KDF_PARAM_CONSTANT "constant" /* octet string */ +#define OSSL_KDF_PARAM_PKCS12_ID "id" /* int */ +#define OSSL_KDF_PARAM_KBKDF_USE_L "use-l" /* int */ +#define OSSL_KDF_PARAM_KBKDF_USE_SEPARATOR "use-separator" /* int */ +#define OSSL_KDF_PARAM_X942_ACVPINFO "acvp-info" +#define OSSL_KDF_PARAM_X942_PARTYUINFO "partyu-info" +#define OSSL_KDF_PARAM_X942_PARTYVINFO "partyv-info" +#define OSSL_KDF_PARAM_X942_SUPP_PUBINFO "supp-pubinfo" +#define OSSL_KDF_PARAM_X942_SUPP_PRIVINFO "supp-privinfo" +#define OSSL_KDF_PARAM_X942_USE_KEYBITS "use-keybits" + +/* Known KDF names */ +#define OSSL_KDF_NAME_HKDF "HKDF" +#define OSSL_KDF_NAME_TLS1_3_KDF "TLS13-KDF" +#define OSSL_KDF_NAME_PBKDF1 "PBKDF1" +#define OSSL_KDF_NAME_PBKDF2 "PBKDF2" +#define OSSL_KDF_NAME_SCRYPT "SCRYPT" +#define OSSL_KDF_NAME_SSHKDF "SSHKDF" +#define OSSL_KDF_NAME_SSKDF "SSKDF" +#define OSSL_KDF_NAME_TLS1_PRF "TLS1-PRF" +#define OSSL_KDF_NAME_X942KDF_ASN1 "X942KDF-ASN1" +#define OSSL_KDF_NAME_X942KDF_CONCAT "X942KDF-CONCAT" +#define OSSL_KDF_NAME_X963KDF "X963KDF" +#define OSSL_KDF_NAME_KBKDF "KBKDF" +#define OSSL_KDF_NAME_KRB5KDF "KRB5KDF" + +/* Known RAND names */ +#define OSSL_RAND_PARAM_STATE "state" +#define OSSL_RAND_PARAM_STRENGTH "strength" +#define OSSL_RAND_PARAM_MAX_REQUEST "max_request" +#define OSSL_RAND_PARAM_TEST_ENTROPY "test_entropy" +#define OSSL_RAND_PARAM_TEST_NONCE "test_nonce" + +/* RAND/DRBG names */ +#define OSSL_DRBG_PARAM_RESEED_REQUESTS "reseed_requests" +#define OSSL_DRBG_PARAM_RESEED_TIME_INTERVAL "reseed_time_interval" +#define OSSL_DRBG_PARAM_MIN_ENTROPYLEN "min_entropylen" +#define OSSL_DRBG_PARAM_MAX_ENTROPYLEN "max_entropylen" +#define OSSL_DRBG_PARAM_MIN_NONCELEN "min_noncelen" +#define OSSL_DRBG_PARAM_MAX_NONCELEN "max_noncelen" +#define OSSL_DRBG_PARAM_MAX_PERSLEN "max_perslen" +#define OSSL_DRBG_PARAM_MAX_ADINLEN "max_adinlen" +#define OSSL_DRBG_PARAM_RESEED_COUNTER "reseed_counter" +#define OSSL_DRBG_PARAM_RESEED_TIME "reseed_time" +#define OSSL_DRBG_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +#define OSSL_DRBG_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +#define OSSL_DRBG_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +#define OSSL_DRBG_PARAM_MAC OSSL_ALG_PARAM_MAC +#define OSSL_DRBG_PARAM_USE_DF "use_derivation_function" + +/* DRBG call back parameters */ +#define OSSL_DRBG_PARAM_ENTROPY_REQUIRED "entropy_required" +#define OSSL_DRBG_PARAM_PREDICTION_RESISTANCE "prediction_resistance" +#define OSSL_DRBG_PARAM_MIN_LENGTH "minium_length" +#define OSSL_DRBG_PARAM_MAX_LENGTH "maxium_length" +#define OSSL_DRBG_PARAM_RANDOM_DATA "random_data" +#define OSSL_DRBG_PARAM_SIZE "size" + +/* PKEY parameters */ +/* Common PKEY parameters */ +#define OSSL_PKEY_PARAM_BITS "bits" /* integer */ +#define OSSL_PKEY_PARAM_MAX_SIZE "max-size" /* integer */ +#define OSSL_PKEY_PARAM_SECURITY_BITS "security-bits" /* integer */ +#define OSSL_PKEY_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +#define OSSL_PKEY_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER /* utf8 string */ +#define OSSL_PKEY_PARAM_ENGINE OSSL_ALG_PARAM_ENGINE /* utf8 string */ +#define OSSL_PKEY_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +#define OSSL_PKEY_PARAM_DEFAULT_DIGEST "default-digest" /* utf8 string */ +#define OSSL_PKEY_PARAM_MANDATORY_DIGEST "mandatory-digest" /* utf8 string */ +#define OSSL_PKEY_PARAM_PAD_MODE "pad-mode" +#define OSSL_PKEY_PARAM_DIGEST_SIZE "digest-size" +#define OSSL_PKEY_PARAM_MASKGENFUNC "mgf" +#define OSSL_PKEY_PARAM_MGF1_DIGEST "mgf1-digest" +#define OSSL_PKEY_PARAM_MGF1_PROPERTIES "mgf1-properties" +#define OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY "encoded-pub-key" +#define OSSL_PKEY_PARAM_GROUP_NAME "group" +#define OSSL_PKEY_PARAM_DIST_ID "distid" +#define OSSL_PKEY_PARAM_PUB_KEY "pub" +#define OSSL_PKEY_PARAM_PRIV_KEY "priv" + +/* Diffie-Hellman/DSA Parameters */ +#define OSSL_PKEY_PARAM_FFC_P "p" +#define OSSL_PKEY_PARAM_FFC_G "g" +#define OSSL_PKEY_PARAM_FFC_Q "q" +#define OSSL_PKEY_PARAM_FFC_GINDEX "gindex" +#define OSSL_PKEY_PARAM_FFC_PCOUNTER "pcounter" +#define OSSL_PKEY_PARAM_FFC_SEED "seed" +#define OSSL_PKEY_PARAM_FFC_COFACTOR "j" +#define OSSL_PKEY_PARAM_FFC_H "hindex" +#define OSSL_PKEY_PARAM_FFC_VALIDATE_PQ "validate-pq" +#define OSSL_PKEY_PARAM_FFC_VALIDATE_G "validate-g" +#define OSSL_PKEY_PARAM_FFC_VALIDATE_LEGACY "validate-legacy" + +/* Diffie-Hellman params */ +#define OSSL_PKEY_PARAM_DH_GENERATOR "safeprime-generator" +#define OSSL_PKEY_PARAM_DH_PRIV_LEN "priv_len" + +/* Elliptic Curve Domain Parameters */ +#define OSSL_PKEY_PARAM_EC_PUB_X "qx" +#define OSSL_PKEY_PARAM_EC_PUB_Y "qy" + +/* Elliptic Curve Explicit Domain Parameters */ +#define OSSL_PKEY_PARAM_EC_FIELD_TYPE "field-type" +#define OSSL_PKEY_PARAM_EC_P "p" +#define OSSL_PKEY_PARAM_EC_A "a" +#define OSSL_PKEY_PARAM_EC_B "b" +#define OSSL_PKEY_PARAM_EC_GENERATOR "generator" +#define OSSL_PKEY_PARAM_EC_ORDER "order" +#define OSSL_PKEY_PARAM_EC_COFACTOR "cofactor" +#define OSSL_PKEY_PARAM_EC_SEED "seed" +#define OSSL_PKEY_PARAM_EC_CHAR2_M "m" +#define OSSL_PKEY_PARAM_EC_CHAR2_TYPE "basis-type" +#define OSSL_PKEY_PARAM_EC_CHAR2_TP_BASIS "tp" +#define OSSL_PKEY_PARAM_EC_CHAR2_PP_K1 "k1" +#define OSSL_PKEY_PARAM_EC_CHAR2_PP_K2 "k2" +#define OSSL_PKEY_PARAM_EC_CHAR2_PP_K3 "k3" +#define OSSL_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS "decoded-from-explicit" + +/* Elliptic Curve Key Parameters */ +#define OSSL_PKEY_PARAM_USE_COFACTOR_FLAG "use-cofactor-flag" +#define OSSL_PKEY_PARAM_USE_COFACTOR_ECDH \ + OSSL_PKEY_PARAM_USE_COFACTOR_FLAG + +/* RSA Keys */ +/* + * n, e, d are the usual public and private key components + * + * rsa-num is the number of factors, including p and q + * rsa-factor is used for each factor: p, q, r_i (i = 3, ...) + * rsa-exponent is used for each exponent: dP, dQ, d_i (i = 3, ...) + * rsa-coefficient is used for each coefficient: qInv, t_i (i = 3, ...) + * + * The number of rsa-factor items must be equal to the number of rsa-exponent + * items, and the number of rsa-coefficients must be one less. + * (the base i for the coefficients is 2, not 1, at least as implied by + * RFC 8017) + */ +#define OSSL_PKEY_PARAM_RSA_N "n" +#define OSSL_PKEY_PARAM_RSA_E "e" +#define OSSL_PKEY_PARAM_RSA_D "d" +#define OSSL_PKEY_PARAM_RSA_FACTOR "rsa-factor" +#define OSSL_PKEY_PARAM_RSA_EXPONENT "rsa-exponent" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT "rsa-coefficient" +#define OSSL_PKEY_PARAM_RSA_FACTOR1 OSSL_PKEY_PARAM_RSA_FACTOR"1" +#define OSSL_PKEY_PARAM_RSA_FACTOR2 OSSL_PKEY_PARAM_RSA_FACTOR"2" +#define OSSL_PKEY_PARAM_RSA_FACTOR3 OSSL_PKEY_PARAM_RSA_FACTOR"3" +#define OSSL_PKEY_PARAM_RSA_FACTOR4 OSSL_PKEY_PARAM_RSA_FACTOR"4" +#define OSSL_PKEY_PARAM_RSA_FACTOR5 OSSL_PKEY_PARAM_RSA_FACTOR"5" +#define OSSL_PKEY_PARAM_RSA_FACTOR6 OSSL_PKEY_PARAM_RSA_FACTOR"6" +#define OSSL_PKEY_PARAM_RSA_FACTOR7 OSSL_PKEY_PARAM_RSA_FACTOR"7" +#define OSSL_PKEY_PARAM_RSA_FACTOR8 OSSL_PKEY_PARAM_RSA_FACTOR"8" +#define OSSL_PKEY_PARAM_RSA_FACTOR9 OSSL_PKEY_PARAM_RSA_FACTOR"9" +#define OSSL_PKEY_PARAM_RSA_FACTOR10 OSSL_PKEY_PARAM_RSA_FACTOR"10" +#define OSSL_PKEY_PARAM_RSA_EXPONENT1 OSSL_PKEY_PARAM_RSA_EXPONENT"1" +#define OSSL_PKEY_PARAM_RSA_EXPONENT2 OSSL_PKEY_PARAM_RSA_EXPONENT"2" +#define OSSL_PKEY_PARAM_RSA_EXPONENT3 OSSL_PKEY_PARAM_RSA_EXPONENT"3" +#define OSSL_PKEY_PARAM_RSA_EXPONENT4 OSSL_PKEY_PARAM_RSA_EXPONENT"4" +#define OSSL_PKEY_PARAM_RSA_EXPONENT5 OSSL_PKEY_PARAM_RSA_EXPONENT"5" +#define OSSL_PKEY_PARAM_RSA_EXPONENT6 OSSL_PKEY_PARAM_RSA_EXPONENT"6" +#define OSSL_PKEY_PARAM_RSA_EXPONENT7 OSSL_PKEY_PARAM_RSA_EXPONENT"7" +#define OSSL_PKEY_PARAM_RSA_EXPONENT8 OSSL_PKEY_PARAM_RSA_EXPONENT"8" +#define OSSL_PKEY_PARAM_RSA_EXPONENT9 OSSL_PKEY_PARAM_RSA_EXPONENT"9" +#define OSSL_PKEY_PARAM_RSA_EXPONENT10 OSSL_PKEY_PARAM_RSA_EXPONENT"10" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT1 OSSL_PKEY_PARAM_RSA_COEFFICIENT"1" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT2 OSSL_PKEY_PARAM_RSA_COEFFICIENT"2" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT3 OSSL_PKEY_PARAM_RSA_COEFFICIENT"3" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT4 OSSL_PKEY_PARAM_RSA_COEFFICIENT"4" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT5 OSSL_PKEY_PARAM_RSA_COEFFICIENT"5" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT6 OSSL_PKEY_PARAM_RSA_COEFFICIENT"6" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT7 OSSL_PKEY_PARAM_RSA_COEFFICIENT"7" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT8 OSSL_PKEY_PARAM_RSA_COEFFICIENT"8" +#define OSSL_PKEY_PARAM_RSA_COEFFICIENT9 OSSL_PKEY_PARAM_RSA_COEFFICIENT"9" + +/* RSA padding modes */ +#define OSSL_PKEY_RSA_PAD_MODE_NONE "none" +#define OSSL_PKEY_RSA_PAD_MODE_PKCSV15 "pkcs1" +#define OSSL_PKEY_RSA_PAD_MODE_OAEP "oaep" +#define OSSL_PKEY_RSA_PAD_MODE_X931 "x931" +#define OSSL_PKEY_RSA_PAD_MODE_PSS "pss" + +/* RSA pss padding salt length */ +#define OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST "digest" +#define OSSL_PKEY_RSA_PSS_SALT_LEN_MAX "max" +#define OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO "auto" + +/* Key generation parameters */ +#define OSSL_PKEY_PARAM_RSA_BITS OSSL_PKEY_PARAM_BITS +#define OSSL_PKEY_PARAM_RSA_PRIMES "primes" +#define OSSL_PKEY_PARAM_RSA_DIGEST OSSL_PKEY_PARAM_DIGEST +#define OSSL_PKEY_PARAM_RSA_DIGEST_PROPS OSSL_PKEY_PARAM_PROPERTIES +#define OSSL_PKEY_PARAM_RSA_MASKGENFUNC OSSL_PKEY_PARAM_MASKGENFUNC +#define OSSL_PKEY_PARAM_RSA_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST +#define OSSL_PKEY_PARAM_RSA_PSS_SALTLEN "saltlen" + +/* Key generation parameters */ +#define OSSL_PKEY_PARAM_FFC_TYPE "type" +#define OSSL_PKEY_PARAM_FFC_PBITS "pbits" +#define OSSL_PKEY_PARAM_FFC_QBITS "qbits" +#define OSSL_PKEY_PARAM_FFC_DIGEST OSSL_PKEY_PARAM_DIGEST +#define OSSL_PKEY_PARAM_FFC_DIGEST_PROPS OSSL_PKEY_PARAM_PROPERTIES + +#define OSSL_PKEY_PARAM_EC_ENCODING "encoding" /* utf8_string */ +#define OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT "point-format" +#define OSSL_PKEY_PARAM_EC_GROUP_CHECK_TYPE "group-check" +#define OSSL_PKEY_PARAM_EC_INCLUDE_PUBLIC "include-public" + +/* OSSL_PKEY_PARAM_EC_ENCODING values */ +#define OSSL_PKEY_EC_ENCODING_EXPLICIT "explicit" +#define OSSL_PKEY_EC_ENCODING_GROUP "named_curve" + +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_UNCOMPRESSED "uncompressed" +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_COMPRESSED "compressed" +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_HYBRID "hybrid" + +#define OSSL_PKEY_EC_GROUP_CHECK_DEFAULT "default" +#define OSSL_PKEY_EC_GROUP_CHECK_NAMED "named" +#define OSSL_PKEY_EC_GROUP_CHECK_NAMED_NIST "named-nist" + +/* Key Exchange parameters */ +#define OSSL_EXCHANGE_PARAM_PAD "pad" /* uint */ +#define OSSL_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE "ecdh-cofactor-mode" /* int */ +#define OSSL_EXCHANGE_PARAM_KDF_TYPE "kdf-type" /* utf8_string */ +#define OSSL_EXCHANGE_PARAM_KDF_DIGEST "kdf-digest" /* utf8_string */ +#define OSSL_EXCHANGE_PARAM_KDF_DIGEST_PROPS "kdf-digest-props" /* utf8_string */ +#define OSSL_EXCHANGE_PARAM_KDF_OUTLEN "kdf-outlen" /* size_t */ +/* The following parameter is an octet_string on set and an octet_ptr on get */ +#define OSSL_EXCHANGE_PARAM_KDF_UKM "kdf-ukm" + +/* Signature parameters */ +#define OSSL_SIGNATURE_PARAM_ALGORITHM_ID "algorithm-id" +#define OSSL_SIGNATURE_PARAM_PAD_MODE OSSL_PKEY_PARAM_PAD_MODE +#define OSSL_SIGNATURE_PARAM_DIGEST OSSL_PKEY_PARAM_DIGEST +#define OSSL_SIGNATURE_PARAM_PROPERTIES OSSL_PKEY_PARAM_PROPERTIES +#define OSSL_SIGNATURE_PARAM_PSS_SALTLEN "saltlen" +#define OSSL_SIGNATURE_PARAM_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST +#define OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES \ + OSSL_PKEY_PARAM_MGF1_PROPERTIES +#define OSSL_SIGNATURE_PARAM_DIGEST_SIZE OSSL_PKEY_PARAM_DIGEST_SIZE + +/* Asym cipher parameters */ +#define OSSL_ASYM_CIPHER_PARAM_DIGEST OSSL_PKEY_PARAM_DIGEST +#define OSSL_ASYM_CIPHER_PARAM_PROPERTIES OSSL_PKEY_PARAM_PROPERTIES +#define OSSL_ASYM_CIPHER_PARAM_ENGINE OSSL_PKEY_PARAM_ENGINE +#define OSSL_ASYM_CIPHER_PARAM_PAD_MODE OSSL_PKEY_PARAM_PAD_MODE +#define OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST \ + OSSL_PKEY_PARAM_MGF1_DIGEST +#define OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST_PROPS \ + OSSL_PKEY_PARAM_MGF1_PROPERTIES +#define OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST OSSL_ALG_PARAM_DIGEST +#define OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS "digest-props" +/* The following parameter is an octet_string on set and an octet_ptr on get */ +#define OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL "oaep-label" +#define OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION "tls-client-version" +#define OSSL_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION "tls-negotiated-version" + +/* + * Encoder / decoder parameters + */ +#define OSSL_ENCODER_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +#define OSSL_ENCODER_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +/* Currently PVK only, but reusable for others as needed */ +#define OSSL_ENCODER_PARAM_ENCRYPT_LEVEL "encrypt-level" +#define OSSL_ENCODER_PARAM_SAVE_PARAMETERS "save-parameters" /* integer */ + +#define OSSL_DECODER_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES + +/* Passphrase callback parameters */ +#define OSSL_PASSPHRASE_PARAM_INFO "info" + +/* Keygen callback parameters, from provider to libcrypto */ +#define OSSL_GEN_PARAM_POTENTIAL "potential" /* integer */ +#define OSSL_GEN_PARAM_ITERATION "iteration" /* integer */ + +/* ACVP Test parameters : These should not be used normally */ +#define OSSL_PKEY_PARAM_RSA_TEST_XP1 "xp1" +#define OSSL_PKEY_PARAM_RSA_TEST_XP2 "xp2" +#define OSSL_PKEY_PARAM_RSA_TEST_XP "xp" +#define OSSL_PKEY_PARAM_RSA_TEST_XQ1 "xq1" +#define OSSL_PKEY_PARAM_RSA_TEST_XQ2 "xq2" +#define OSSL_PKEY_PARAM_RSA_TEST_XQ "xq" +#define OSSL_PKEY_PARAM_RSA_TEST_P1 "p1" +#define OSSL_PKEY_PARAM_RSA_TEST_P2 "p2" +#define OSSL_PKEY_PARAM_RSA_TEST_Q1 "q1" +#define OSSL_PKEY_PARAM_RSA_TEST_Q2 "q2" +#define OSSL_SIGNATURE_PARAM_KAT "kat" + +/* KEM parameters */ +#define OSSL_KEM_PARAM_OPERATION "operation" + +/* OSSL_KEM_PARAM_OPERATION values */ +#define OSSL_KEM_PARAM_OPERATION_RSASVE "RSASVE" + +/* Capabilities */ + +/* TLS-GROUP Capability */ +#define OSSL_CAPABILITY_TLS_GROUP_NAME "tls-group-name" +#define OSSL_CAPABILITY_TLS_GROUP_NAME_INTERNAL "tls-group-name-internal" +#define OSSL_CAPABILITY_TLS_GROUP_ID "tls-group-id" +#define OSSL_CAPABILITY_TLS_GROUP_ALG "tls-group-alg" +#define OSSL_CAPABILITY_TLS_GROUP_SECURITY_BITS "tls-group-sec-bits" +#define OSSL_CAPABILITY_TLS_GROUP_IS_KEM "tls-group-is-kem" +#define OSSL_CAPABILITY_TLS_GROUP_MIN_TLS "tls-min-tls" +#define OSSL_CAPABILITY_TLS_GROUP_MAX_TLS "tls-max-tls" +#define OSSL_CAPABILITY_TLS_GROUP_MIN_DTLS "tls-min-dtls" +#define OSSL_CAPABILITY_TLS_GROUP_MAX_DTLS "tls-max-dtls" + +/*- + * storemgmt parameters + */ + +/* + * Used by storemgmt_ctx_set_params(): + * + * - OSSL_STORE_PARAM_EXPECT is an INTEGER, and the value is any of the + * OSSL_STORE_INFO numbers. This is used to set the expected type of + * object loaded. + * + * - OSSL_STORE_PARAM_SUBJECT, OSSL_STORE_PARAM_ISSUER, + * OSSL_STORE_PARAM_SERIAL, OSSL_STORE_PARAM_FINGERPRINT, + * OSSL_STORE_PARAM_DIGEST, OSSL_STORE_PARAM_ALIAS + * are used as search criteria. + * (OSSL_STORE_PARAM_DIGEST is used with OSSL_STORE_PARAM_FINGERPRINT) + */ +#define OSSL_STORE_PARAM_EXPECT "expect" /* INTEGER */ +#define OSSL_STORE_PARAM_SUBJECT "subject" /* DER blob => OCTET_STRING */ +#define OSSL_STORE_PARAM_ISSUER "name" /* DER blob => OCTET_STRING */ +#define OSSL_STORE_PARAM_SERIAL "serial" /* INTEGER */ +#define OSSL_STORE_PARAM_DIGEST "digest" /* UTF8_STRING */ +#define OSSL_STORE_PARAM_FINGERPRINT "fingerprint" /* OCTET_STRING */ +#define OSSL_STORE_PARAM_ALIAS "alias" /* UTF8_STRING */ + +/* You may want to pass properties for the provider implementation to use */ +#define OSSL_STORE_PARAM_PROPERTIES "properties" /* utf8_string */ +/* OSSL_DECODER input type if a decoder is used by the store */ +#define OSSL_STORE_PARAM_INPUT_TYPE "input-type" /* UTF8_STRING */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/core_object.h b/OtherInc/openssl/include/openssl/core_object.h new file mode 100644 index 0000000..62ccf39 --- /dev/null +++ b/OtherInc/openssl/include/openssl/core_object.h @@ -0,0 +1,41 @@ +/* + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CORE_OBJECT_H +# define OPENSSL_CORE_OBJECT_H +# pragma once + +# ifdef __cplusplus +extern "C" { +# endif + +/*- + * Known object types + * + * These numbers are used as values for the OSSL_PARAM parameter + * OSSL_OBJECT_PARAM_TYPE. + * + * For most of these types, there's a corresponding libcrypto object type. + * The corresponding type is indicated with a comment after the number. + */ +# define OSSL_OBJECT_UNKNOWN 0 +# define OSSL_OBJECT_NAME 1 /* char * */ +# define OSSL_OBJECT_PKEY 2 /* EVP_PKEY * */ +# define OSSL_OBJECT_CERT 3 /* X509 * */ +# define OSSL_OBJECT_CRL 4 /* X509_CRL * */ + +/* + * The rest of the associated OSSL_PARAM elements is described in core_names.h + */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/crmf.h b/OtherInc/openssl/include/openssl/crmf.h new file mode 100644 index 0000000..b2a82ed --- /dev/null +++ b/OtherInc/openssl/include/openssl/crmf.h @@ -0,0 +1,227 @@ +/*- + * WARNING: do not edit! + * Generated by makefile from include\openssl\crmf.h.in + * + * Copyright 2007-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright Nokia 2007-2019 + * Copyright Siemens AG 2015-2019 + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + * + * CRMF (RFC 4211) implementation by M. Peylo, M. Viljanen, and D. von Oheimb. + */ + + + +#ifndef OPENSSL_CRMF_H +# define OPENSSL_CRMF_H + +# include + +# ifndef OPENSSL_NO_CRMF +# include +# include +# include +# include /* for GENERAL_NAME etc. */ + +/* explicit #includes not strictly needed since implied by the above: */ +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# define OSSL_CRMF_POPOPRIVKEY_THISMESSAGE 0 +# define OSSL_CRMF_POPOPRIVKEY_SUBSEQUENTMESSAGE 1 +# define OSSL_CRMF_POPOPRIVKEY_DHMAC 2 +# define OSSL_CRMF_POPOPRIVKEY_AGREEMAC 3 +# define OSSL_CRMF_POPOPRIVKEY_ENCRYPTEDKEY 4 + +# define OSSL_CRMF_SUBSEQUENTMESSAGE_ENCRCERT 0 +# define OSSL_CRMF_SUBSEQUENTMESSAGE_CHALLENGERESP 1 + +typedef struct ossl_crmf_encryptedvalue_st OSSL_CRMF_ENCRYPTEDVALUE; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDVALUE) +typedef struct ossl_crmf_msg_st OSSL_CRMF_MSG; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_MSG) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_MSG) +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CRMF_MSG, OSSL_CRMF_MSG, OSSL_CRMF_MSG) +#define sk_OSSL_CRMF_MSG_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_value(sk, idx) ((OSSL_CRMF_MSG *)OPENSSL_sk_value(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk), (idx))) +#define sk_OSSL_CRMF_MSG_new(cmp) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new(ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp))) +#define sk_OSSL_CRMF_MSG_new_null() ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CRMF_MSG_new_reserve(cmp, n) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp), (n))) +#define sk_OSSL_CRMF_MSG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (n)) +#define sk_OSSL_CRMF_MSG_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_delete(sk, i) ((OSSL_CRMF_MSG *)OPENSSL_sk_delete(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (i))) +#define sk_OSSL_CRMF_MSG_delete_ptr(sk, ptr) ((OSSL_CRMF_MSG *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr))) +#define sk_OSSL_CRMF_MSG_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_pop(sk) ((OSSL_CRMF_MSG *)OPENSSL_sk_pop(ossl_check_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_shift(sk) ((OSSL_CRMF_MSG *)OPENSSL_sk_shift(ossl_check_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CRMF_MSG_sk_type(sk),ossl_check_OSSL_CRMF_MSG_freefunc_type(freefunc)) +#define sk_OSSL_CRMF_MSG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr), (idx)) +#define sk_OSSL_CRMF_MSG_set(sk, idx, ptr) ((OSSL_CRMF_MSG *)OPENSSL_sk_set(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (idx), ossl_check_OSSL_CRMF_MSG_type(ptr))) +#define sk_OSSL_CRMF_MSG_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr), pnum) +#define sk_OSSL_CRMF_MSG_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_dup(sk) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_copyfunc_type(copyfunc), ossl_check_OSSL_CRMF_MSG_freefunc_type(freefunc))) +#define sk_OSSL_CRMF_MSG_set_cmp_func(sk, cmp) ((sk_OSSL_CRMF_MSG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp))) + +typedef struct ossl_crmf_attributetypeandvalue_st OSSL_CRMF_ATTRIBUTETYPEANDVALUE; +typedef struct ossl_crmf_pbmparameter_st OSSL_CRMF_PBMPARAMETER; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_PBMPARAMETER) +typedef struct ossl_crmf_poposigningkey_st OSSL_CRMF_POPOSIGNINGKEY; +typedef struct ossl_crmf_certrequest_st OSSL_CRMF_CERTREQUEST; +typedef struct ossl_crmf_certid_st OSSL_CRMF_CERTID; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_CERTID) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTID) +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CRMF_CERTID, OSSL_CRMF_CERTID, OSSL_CRMF_CERTID) +#define sk_OSSL_CRMF_CERTID_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_value(sk, idx) ((OSSL_CRMF_CERTID *)OPENSSL_sk_value(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk), (idx))) +#define sk_OSSL_CRMF_CERTID_new(cmp) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new(ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp))) +#define sk_OSSL_CRMF_CERTID_new_null() ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CRMF_CERTID_new_reserve(cmp, n) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp), (n))) +#define sk_OSSL_CRMF_CERTID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (n)) +#define sk_OSSL_CRMF_CERTID_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_delete(sk, i) ((OSSL_CRMF_CERTID *)OPENSSL_sk_delete(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (i))) +#define sk_OSSL_CRMF_CERTID_delete_ptr(sk, ptr) ((OSSL_CRMF_CERTID *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr))) +#define sk_OSSL_CRMF_CERTID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_pop(sk) ((OSSL_CRMF_CERTID *)OPENSSL_sk_pop(ossl_check_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_shift(sk) ((OSSL_CRMF_CERTID *)OPENSSL_sk_shift(ossl_check_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CRMF_CERTID_sk_type(sk),ossl_check_OSSL_CRMF_CERTID_freefunc_type(freefunc)) +#define sk_OSSL_CRMF_CERTID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr), (idx)) +#define sk_OSSL_CRMF_CERTID_set(sk, idx, ptr) ((OSSL_CRMF_CERTID *)OPENSSL_sk_set(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (idx), ossl_check_OSSL_CRMF_CERTID_type(ptr))) +#define sk_OSSL_CRMF_CERTID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr), pnum) +#define sk_OSSL_CRMF_CERTID_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_dup(sk) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_copyfunc_type(copyfunc), ossl_check_OSSL_CRMF_CERTID_freefunc_type(freefunc))) +#define sk_OSSL_CRMF_CERTID_set_cmp_func(sk, cmp) ((sk_OSSL_CRMF_CERTID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp))) + + +typedef struct ossl_crmf_pkipublicationinfo_st OSSL_CRMF_PKIPUBLICATIONINFO; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_PKIPUBLICATIONINFO) +typedef struct ossl_crmf_singlepubinfo_st OSSL_CRMF_SINGLEPUBINFO; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_SINGLEPUBINFO) +typedef struct ossl_crmf_certtemplate_st OSSL_CRMF_CERTTEMPLATE; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_CERTTEMPLATE) +typedef STACK_OF(OSSL_CRMF_MSG) OSSL_CRMF_MSGS; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_MSGS) + +typedef struct ossl_crmf_optionalvalidity_st OSSL_CRMF_OPTIONALVALIDITY; + +/* crmf_pbm.c */ +OSSL_CRMF_PBMPARAMETER *OSSL_CRMF_pbmp_new(OSSL_LIB_CTX *libctx, size_t slen, + int owfnid, size_t itercnt, + int macnid); +int OSSL_CRMF_pbm_new(OSSL_LIB_CTX *libctx, const char *propq, + const OSSL_CRMF_PBMPARAMETER *pbmp, + const unsigned char *msg, size_t msglen, + const unsigned char *sec, size_t seclen, + unsigned char **mac, size_t *maclen); + +/* crmf_lib.c */ +int OSSL_CRMF_MSG_set1_regCtrl_regToken(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *tok); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regCtrl_regToken(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_authenticator(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *auth); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regCtrl_authenticator(const OSSL_CRMF_MSG *msg); +int +OSSL_CRMF_MSG_PKIPublicationInfo_push0_SinglePubInfo(OSSL_CRMF_PKIPUBLICATIONINFO *pi, + OSSL_CRMF_SINGLEPUBINFO *spi); +# define OSSL_CRMF_PUB_METHOD_DONTCARE 0 +# define OSSL_CRMF_PUB_METHOD_X500 1 +# define OSSL_CRMF_PUB_METHOD_WEB 2 +# define OSSL_CRMF_PUB_METHOD_LDAP 3 +int OSSL_CRMF_MSG_set0_SinglePubInfo(OSSL_CRMF_SINGLEPUBINFO *spi, + int method, GENERAL_NAME *nm); +# define OSSL_CRMF_PUB_ACTION_DONTPUBLISH 0 +# define OSSL_CRMF_PUB_ACTION_PLEASEPUBLISH 1 +int OSSL_CRMF_MSG_set_PKIPublicationInfo_action(OSSL_CRMF_PKIPUBLICATIONINFO *pi, + int action); +int OSSL_CRMF_MSG_set1_regCtrl_pkiPublicationInfo(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_PKIPUBLICATIONINFO *pi); +OSSL_CRMF_PKIPUBLICATIONINFO +*OSSL_CRMF_MSG_get0_regCtrl_pkiPublicationInfo(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_protocolEncrKey(OSSL_CRMF_MSG *msg, + const X509_PUBKEY *pubkey); +X509_PUBKEY +*OSSL_CRMF_MSG_get0_regCtrl_protocolEncrKey(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_oldCertID(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_CERTID *cid); +OSSL_CRMF_CERTID +*OSSL_CRMF_MSG_get0_regCtrl_oldCertID(const OSSL_CRMF_MSG *msg); +OSSL_CRMF_CERTID *OSSL_CRMF_CERTID_gen(const X509_NAME *issuer, + const ASN1_INTEGER *serial); + +int OSSL_CRMF_MSG_set1_regInfo_utf8Pairs(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *utf8pairs); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regInfo_utf8Pairs(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regInfo_certReq(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_CERTREQUEST *cr); +OSSL_CRMF_CERTREQUEST +*OSSL_CRMF_MSG_get0_regInfo_certReq(const OSSL_CRMF_MSG *msg); + +int OSSL_CRMF_MSG_set0_validity(OSSL_CRMF_MSG *crm, + ASN1_TIME *notBefore, ASN1_TIME *notAfter); +int OSSL_CRMF_MSG_set_certReqId(OSSL_CRMF_MSG *crm, int rid); +int OSSL_CRMF_MSG_get_certReqId(const OSSL_CRMF_MSG *crm); +int OSSL_CRMF_MSG_set0_extensions(OSSL_CRMF_MSG *crm, X509_EXTENSIONS *exts); + +int OSSL_CRMF_MSG_push0_extension(OSSL_CRMF_MSG *crm, X509_EXTENSION *ext); +# define OSSL_CRMF_POPO_NONE -1 +# define OSSL_CRMF_POPO_RAVERIFIED 0 +# define OSSL_CRMF_POPO_SIGNATURE 1 +# define OSSL_CRMF_POPO_KEYENC 2 +# define OSSL_CRMF_POPO_KEYAGREE 3 +int OSSL_CRMF_MSG_create_popo(int meth, OSSL_CRMF_MSG *crm, + EVP_PKEY *pkey, const EVP_MD *digest, + OSSL_LIB_CTX *libctx, const char *propq); +int OSSL_CRMF_MSGS_verify_popo(const OSSL_CRMF_MSGS *reqs, + int rid, int acceptRAVerified, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_CRMF_CERTTEMPLATE *OSSL_CRMF_MSG_get0_tmpl(const OSSL_CRMF_MSG *crm); +const ASN1_INTEGER +*OSSL_CRMF_CERTTEMPLATE_get0_serialNumber(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME +*OSSL_CRMF_CERTTEMPLATE_get0_subject(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME +*OSSL_CRMF_CERTTEMPLATE_get0_issuer(const OSSL_CRMF_CERTTEMPLATE *tmpl); +X509_EXTENSIONS +*OSSL_CRMF_CERTTEMPLATE_get0_extensions(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME +*OSSL_CRMF_CERTID_get0_issuer(const OSSL_CRMF_CERTID *cid); +const ASN1_INTEGER +*OSSL_CRMF_CERTID_get0_serialNumber(const OSSL_CRMF_CERTID *cid); +int OSSL_CRMF_CERTTEMPLATE_fill(OSSL_CRMF_CERTTEMPLATE *tmpl, + EVP_PKEY *pubkey, + const X509_NAME *subject, + const X509_NAME *issuer, + const ASN1_INTEGER *serial); +X509 +*OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(const OSSL_CRMF_ENCRYPTEDVALUE *ecert, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey); + +# ifdef __cplusplus +} +# endif +# endif /* !defined(OPENSSL_NO_CRMF) */ +#endif /* !defined(OPENSSL_CRMF_H) */ diff --git a/OtherInc/openssl/include/openssl/crmferr.h b/OtherInc/openssl/include/openssl/crmferr.h new file mode 100644 index 0000000..b242b92 --- /dev/null +++ b/OtherInc/openssl/include/openssl/crmferr.h @@ -0,0 +1,50 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CRMFERR_H +# define OPENSSL_CRMFERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_CRMF + + +/* + * CRMF reason codes. + */ +# define CRMF_R_BAD_PBM_ITERATIONCOUNT 100 +# define CRMF_R_CRMFERROR 102 +# define CRMF_R_ERROR 103 +# define CRMF_R_ERROR_DECODING_CERTIFICATE 104 +# define CRMF_R_ERROR_DECRYPTING_CERTIFICATE 105 +# define CRMF_R_ERROR_DECRYPTING_SYMMETRIC_KEY 106 +# define CRMF_R_FAILURE_OBTAINING_RANDOM 107 +# define CRMF_R_ITERATIONCOUNT_BELOW_100 108 +# define CRMF_R_MALFORMED_IV 101 +# define CRMF_R_NULL_ARGUMENT 109 +# define CRMF_R_POPOSKINPUT_NOT_SUPPORTED 113 +# define CRMF_R_POPO_INCONSISTENT_PUBLIC_KEY 117 +# define CRMF_R_POPO_MISSING 121 +# define CRMF_R_POPO_MISSING_PUBLIC_KEY 118 +# define CRMF_R_POPO_MISSING_SUBJECT 119 +# define CRMF_R_POPO_RAVERIFIED_NOT_ACCEPTED 120 +# define CRMF_R_SETTING_MAC_ALGOR_FAILURE 110 +# define CRMF_R_SETTING_OWF_ALGOR_FAILURE 111 +# define CRMF_R_UNSUPPORTED_ALGORITHM 112 +# define CRMF_R_UNSUPPORTED_CIPHER 114 +# define CRMF_R_UNSUPPORTED_METHOD_FOR_CREATING_POPO 115 +# define CRMF_R_UNSUPPORTED_POPO_METHOD 116 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/crypto.h b/OtherInc/openssl/include/openssl/crypto.h new file mode 100644 index 0000000..8b82593 --- /dev/null +++ b/OtherInc/openssl/include/openssl/crypto.h @@ -0,0 +1,558 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\crypto.h.in + * + * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_CRYPTO_H +# define OPENSSL_CRYPTO_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_CRYPTO_H +# endif + +# include +# include + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# endif + +# include +# include +# include +# include +# include +# include + +# ifdef CHARSET_EBCDIC +# include +# endif + +/* + * Resolve problems on some operating systems with symbol names that clash + * one way or another + */ +# include + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define SSLeay OpenSSL_version_num +# define SSLeay_version OpenSSL_version +# define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +# define SSLEAY_VERSION OPENSSL_VERSION +# define SSLEAY_CFLAGS OPENSSL_CFLAGS +# define SSLEAY_BUILT_ON OPENSSL_BUILT_ON +# define SSLEAY_PLATFORM OPENSSL_PLATFORM +# define SSLEAY_DIR OPENSSL_DIR + +/* + * Old type for allocating dynamic locks. No longer used. Use the new thread + * API instead. + */ +typedef struct { + int dummy; +} CRYPTO_dynlock; + +# endif /* OPENSSL_NO_DEPRECATED_1_1_0 */ + +typedef void CRYPTO_RWLOCK; + +CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void); +__owur int CRYPTO_THREAD_read_lock(CRYPTO_RWLOCK *lock); +__owur int CRYPTO_THREAD_write_lock(CRYPTO_RWLOCK *lock); +int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock); +void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock); + +int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_or(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_load(uint64_t *val, uint64_t *ret, CRYPTO_RWLOCK *lock); + +/* No longer needed, so this is a no-op */ +#define OPENSSL_malloc_init() while(0) continue + +# define OPENSSL_malloc(num) \ + CRYPTO_malloc(num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_zalloc(num) \ + CRYPTO_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_realloc(addr, num) \ + CRYPTO_realloc(addr, num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_clear_realloc(addr, old_num, num) \ + CRYPTO_clear_realloc(addr, old_num, num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_clear_free(addr, num) \ + CRYPTO_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_free(addr) \ + CRYPTO_free(addr, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_memdup(str, s) \ + CRYPTO_memdup((str), s, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_strdup(str) \ + CRYPTO_strdup(str, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_strndup(str, n) \ + CRYPTO_strndup(str, n, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_malloc(num) \ + CRYPTO_secure_malloc(num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_zalloc(num) \ + CRYPTO_secure_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_free(addr) \ + CRYPTO_secure_free(addr, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_clear_free(addr, num) \ + CRYPTO_secure_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_secure_actual_size(ptr) \ + CRYPTO_secure_actual_size(ptr) + +size_t OPENSSL_strlcpy(char *dst, const char *src, size_t siz); +size_t OPENSSL_strlcat(char *dst, const char *src, size_t siz); +size_t OPENSSL_strnlen(const char *str, size_t maxlen); +int OPENSSL_buf2hexstr_ex(char *str, size_t str_n, size_t *strlength, + const unsigned char *buf, size_t buflen, + const char sep); +char *OPENSSL_buf2hexstr(const unsigned char *buf, long buflen); +int OPENSSL_hexstr2buf_ex(unsigned char *buf, size_t buf_n, size_t *buflen, + const char *str, const char sep); +unsigned char *OPENSSL_hexstr2buf(const char *str, long *buflen); +int OPENSSL_hexchar2int(unsigned char c); +int OPENSSL_strcasecmp(const char *s1, const char *s2); +int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n); + +# define OPENSSL_MALLOC_MAX_NELEMS(type) (((1U<<(sizeof(int)*8-1))-1)/sizeof(type)) + +/* + * These functions return the values of OPENSSL_VERSION_MAJOR, + * OPENSSL_VERSION_MINOR, OPENSSL_VERSION_PATCH, OPENSSL_VERSION_PRE_RELEASE + * and OPENSSL_VERSION_BUILD_METADATA, respectively. + */ +unsigned int OPENSSL_version_major(void); +unsigned int OPENSSL_version_minor(void); +unsigned int OPENSSL_version_patch(void); +const char *OPENSSL_version_pre_release(void); +const char *OPENSSL_version_build_metadata(void); + +unsigned long OpenSSL_version_num(void); +const char *OpenSSL_version(int type); +# define OPENSSL_VERSION 0 +# define OPENSSL_CFLAGS 1 +# define OPENSSL_BUILT_ON 2 +# define OPENSSL_PLATFORM 3 +# define OPENSSL_DIR 4 +# define OPENSSL_ENGINES_DIR 5 +# define OPENSSL_VERSION_STRING 6 +# define OPENSSL_FULL_VERSION_STRING 7 +# define OPENSSL_MODULES_DIR 8 +# define OPENSSL_CPU_INFO 9 + +const char *OPENSSL_info(int type); +/* + * The series starts at 1001 to avoid confusion with the OpenSSL_version + * types. + */ +# define OPENSSL_INFO_CONFIG_DIR 1001 +# define OPENSSL_INFO_ENGINES_DIR 1002 +# define OPENSSL_INFO_MODULES_DIR 1003 +# define OPENSSL_INFO_DSO_EXTENSION 1004 +# define OPENSSL_INFO_DIR_FILENAME_SEPARATOR 1005 +# define OPENSSL_INFO_LIST_SEPARATOR 1006 +# define OPENSSL_INFO_SEED_SOURCE 1007 +# define OPENSSL_INFO_CPU_SETTINGS 1008 + +int OPENSSL_issetugid(void); + +struct crypto_ex_data_st { + OSSL_LIB_CTX *ctx; + STACK_OF(void) *sk; +}; + +SKM_DEFINE_STACK_OF_INTERNAL(void, void, void) +#define sk_void_num(sk) OPENSSL_sk_num(ossl_check_const_void_sk_type(sk)) +#define sk_void_value(sk, idx) ((void *)OPENSSL_sk_value(ossl_check_const_void_sk_type(sk), (idx))) +#define sk_void_new(cmp) ((STACK_OF(void) *)OPENSSL_sk_new(ossl_check_void_compfunc_type(cmp))) +#define sk_void_new_null() ((STACK_OF(void) *)OPENSSL_sk_new_null()) +#define sk_void_new_reserve(cmp, n) ((STACK_OF(void) *)OPENSSL_sk_new_reserve(ossl_check_void_compfunc_type(cmp), (n))) +#define sk_void_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_void_sk_type(sk), (n)) +#define sk_void_free(sk) OPENSSL_sk_free(ossl_check_void_sk_type(sk)) +#define sk_void_zero(sk) OPENSSL_sk_zero(ossl_check_void_sk_type(sk)) +#define sk_void_delete(sk, i) ((void *)OPENSSL_sk_delete(ossl_check_void_sk_type(sk), (i))) +#define sk_void_delete_ptr(sk, ptr) ((void *)OPENSSL_sk_delete_ptr(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr))) +#define sk_void_push(sk, ptr) OPENSSL_sk_push(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_pop(sk) ((void *)OPENSSL_sk_pop(ossl_check_void_sk_type(sk))) +#define sk_void_shift(sk) ((void *)OPENSSL_sk_shift(ossl_check_void_sk_type(sk))) +#define sk_void_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_void_sk_type(sk),ossl_check_void_freefunc_type(freefunc)) +#define sk_void_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr), (idx)) +#define sk_void_set(sk, idx, ptr) ((void *)OPENSSL_sk_set(ossl_check_void_sk_type(sk), (idx), ossl_check_void_type(ptr))) +#define sk_void_find(sk, ptr) OPENSSL_sk_find(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr), pnum) +#define sk_void_sort(sk) OPENSSL_sk_sort(ossl_check_void_sk_type(sk)) +#define sk_void_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_void_sk_type(sk)) +#define sk_void_dup(sk) ((STACK_OF(void) *)OPENSSL_sk_dup(ossl_check_const_void_sk_type(sk))) +#define sk_void_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(void) *)OPENSSL_sk_deep_copy(ossl_check_const_void_sk_type(sk), ossl_check_void_copyfunc_type(copyfunc), ossl_check_void_freefunc_type(freefunc))) +#define sk_void_set_cmp_func(sk, cmp) ((sk_void_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_void_sk_type(sk), ossl_check_void_compfunc_type(cmp))) + + + +/* + * Per class, we have a STACK of function pointers. + */ +# define CRYPTO_EX_INDEX_SSL 0 +# define CRYPTO_EX_INDEX_SSL_CTX 1 +# define CRYPTO_EX_INDEX_SSL_SESSION 2 +# define CRYPTO_EX_INDEX_X509 3 +# define CRYPTO_EX_INDEX_X509_STORE 4 +# define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +# define CRYPTO_EX_INDEX_DH 6 +# define CRYPTO_EX_INDEX_DSA 7 +# define CRYPTO_EX_INDEX_EC_KEY 8 +# define CRYPTO_EX_INDEX_RSA 9 +# define CRYPTO_EX_INDEX_ENGINE 10 +# define CRYPTO_EX_INDEX_UI 11 +# define CRYPTO_EX_INDEX_BIO 12 +# define CRYPTO_EX_INDEX_APP 13 +# define CRYPTO_EX_INDEX_UI_METHOD 14 +# define CRYPTO_EX_INDEX_RAND_DRBG 15 +# define CRYPTO_EX_INDEX_DRBG CRYPTO_EX_INDEX_RAND_DRBG +# define CRYPTO_EX_INDEX_OSSL_LIB_CTX 16 +# define CRYPTO_EX_INDEX_EVP_PKEY 17 +# define CRYPTO_EX_INDEX__COUNT 18 + +typedef void CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from, + void **from_d, int idx, long argl, void *argp); +__owur int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* No longer use an index. */ +int CRYPTO_free_ex_index(int class_index, int idx); + +/* + * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a + * given class (invokes whatever per-class callbacks are applicable) + */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + const CRYPTO_EX_DATA *from); + +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); + +/* Allocate a single item in the CRYPTO_EX_DATA variable */ +int CRYPTO_alloc_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad, + int idx); + +/* + * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular + * index (relative to the class type involved) + */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* + * This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. + */ +# define CRYPTO_cleanup_all_ex_data() while(0) continue + +/* + * The old locking functions have been removed completely without compatibility + * macros. This is because the old functions either could not properly report + * errors, or the returned error values were not clearly documented. + * Replacing the locking functions with no-ops would cause race condition + * issues in the affected applications. It is far better for them to fail at + * compile time. + * On the other hand, the locking callbacks are no longer used. Consequently, + * the callback management functions can be safely replaced with no-op macros. + */ +# define CRYPTO_num_locks() (1) +# define CRYPTO_set_locking_callback(func) +# define CRYPTO_get_locking_callback() (NULL) +# define CRYPTO_set_add_lock_callback(func) +# define CRYPTO_get_add_lock_callback() (NULL) + +/* + * These defines where used in combination with the old locking callbacks, + * they are not called anymore, but old code that's not called might still + * use them. + */ +# define CRYPTO_LOCK 1 +# define CRYPTO_UNLOCK 2 +# define CRYPTO_READ 4 +# define CRYPTO_WRITE 8 + +/* This structure is no longer used */ +typedef struct crypto_threadid_st { + int dummy; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +# define CRYPTO_THREADID_set_numeric(id, val) +# define CRYPTO_THREADID_set_pointer(id, ptr) +# define CRYPTO_THREADID_set_callback(threadid_func) (0) +# define CRYPTO_THREADID_get_callback() (NULL) +# define CRYPTO_THREADID_current(id) +# define CRYPTO_THREADID_cmp(a, b) (-1) +# define CRYPTO_THREADID_cpy(dest, src) +# define CRYPTO_THREADID_hash(id) (0UL) + +# ifndef OPENSSL_NO_DEPRECATED_1_0_0 +# define CRYPTO_set_id_callback(func) +# define CRYPTO_get_id_callback() (NULL) +# define CRYPTO_thread_id() (0UL) +# endif /* OPENSSL_NO_DEPRECATED_1_0_0 */ + +# define CRYPTO_set_dynlock_create_callback(dyn_create_function) +# define CRYPTO_set_dynlock_lock_callback(dyn_lock_function) +# define CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function) +# define CRYPTO_get_dynlock_create_callback() (NULL) +# define CRYPTO_get_dynlock_lock_callback() (NULL) +# define CRYPTO_get_dynlock_destroy_callback() (NULL) +# endif /* OPENSSL_NO_DEPRECATED_1_1_0 */ + +typedef void *(*CRYPTO_malloc_fn)(size_t num, const char *file, int line); +typedef void *(*CRYPTO_realloc_fn)(void *addr, size_t num, const char *file, + int line); +typedef void (*CRYPTO_free_fn)(void *addr, const char *file, int line); +int CRYPTO_set_mem_functions(CRYPTO_malloc_fn malloc_fn, + CRYPTO_realloc_fn realloc_fn, + CRYPTO_free_fn free_fn); +void CRYPTO_get_mem_functions(CRYPTO_malloc_fn *malloc_fn, + CRYPTO_realloc_fn *realloc_fn, + CRYPTO_free_fn *free_fn); + +void *CRYPTO_malloc(size_t num, const char *file, int line); +void *CRYPTO_zalloc(size_t num, const char *file, int line); +void *CRYPTO_memdup(const void *str, size_t siz, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +char *CRYPTO_strndup(const char *str, size_t s, const char *file, int line); +void CRYPTO_free(void *ptr, const char *file, int line); +void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line); +void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line); +void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num, + const char *file, int line); + +int CRYPTO_secure_malloc_init(size_t sz, size_t minsize); +int CRYPTO_secure_malloc_done(void); +void *CRYPTO_secure_malloc(size_t num, const char *file, int line); +void *CRYPTO_secure_zalloc(size_t num, const char *file, int line); +void CRYPTO_secure_free(void *ptr, const char *file, int line); +void CRYPTO_secure_clear_free(void *ptr, size_t num, + const char *file, int line); +int CRYPTO_secure_allocated(const void *ptr); +int CRYPTO_secure_malloc_initialized(void); +size_t CRYPTO_secure_actual_size(void *ptr); +size_t CRYPTO_secure_used(void); + +void OPENSSL_cleanse(void *ptr, size_t len); + +# ifndef OPENSSL_NO_CRYPTO_MDEBUG +/* + * The following can be used to detect memory leaks in the library. If + * used, it turns on malloc checking + */ +# define CRYPTO_MEM_CHECK_OFF 0x0 /* Control only */ +# define CRYPTO_MEM_CHECK_ON 0x1 /* Control and mode bit */ +# define CRYPTO_MEM_CHECK_ENABLE 0x2 /* Control and mode bit */ +# define CRYPTO_MEM_CHECK_DISABLE 0x3 /* Control only */ + +void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define OPENSSL_mem_debug_push(info) \ + CRYPTO_mem_debug_push(info, OPENSSL_FILE, OPENSSL_LINE) +# define OPENSSL_mem_debug_pop() \ + CRYPTO_mem_debug_pop() +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_set_mem_debug(int flag); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_ctrl(int mode); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_debug_push(const char *info, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_debug_pop(void); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_malloc(void *addr, size_t num, + int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_realloc(void *addr1, void *addr2, + size_t num, int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_free(void *addr, int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 +int CRYPTO_mem_leaks_cb(int (*cb)(const char *str, size_t len, void *u), + void *u); +# endif +# ifndef OPENSSL_NO_STDIO +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_leaks_fp(FILE *); +# endif +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_leaks(BIO *bio); +# endif +# endif /* OPENSSL_NO_CRYPTO_MDEBUG */ + +/* die if we have to */ +ossl_noreturn void OPENSSL_die(const char *assertion, const char *file, int line); +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define OpenSSLDie(f,l,a) OPENSSL_die((a),(f),(l)) +# endif +# define OPENSSL_assert(e) \ + (void)((e) ? 0 : (OPENSSL_die("assertion failed: " #e, OPENSSL_FILE, OPENSSL_LINE), 1)) + +int OPENSSL_isservice(void); + +void OPENSSL_init(void); +# ifdef OPENSSL_SYS_UNIX +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_prepare(void); +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_parent(void); +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_child(void); +# endif +# endif + +struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); +int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); +int OPENSSL_gmtime_diff(int *pday, int *psec, + const struct tm *from, const struct tm *to); + +/* + * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. + * It takes an amount of time dependent on |len|, but independent of the + * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements + * into a defined order as the return value when a != b is undefined, other + * than to be non-zero. + */ +int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len); + +/* Standard initialisation options */ +# define OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS 0x00000001L +# define OPENSSL_INIT_LOAD_CRYPTO_STRINGS 0x00000002L +# define OPENSSL_INIT_ADD_ALL_CIPHERS 0x00000004L +# define OPENSSL_INIT_ADD_ALL_DIGESTS 0x00000008L +# define OPENSSL_INIT_NO_ADD_ALL_CIPHERS 0x00000010L +# define OPENSSL_INIT_NO_ADD_ALL_DIGESTS 0x00000020L +# define OPENSSL_INIT_LOAD_CONFIG 0x00000040L +# define OPENSSL_INIT_NO_LOAD_CONFIG 0x00000080L +# define OPENSSL_INIT_ASYNC 0x00000100L +# define OPENSSL_INIT_ENGINE_RDRAND 0x00000200L +# define OPENSSL_INIT_ENGINE_DYNAMIC 0x00000400L +# define OPENSSL_INIT_ENGINE_OPENSSL 0x00000800L +# define OPENSSL_INIT_ENGINE_CRYPTODEV 0x00001000L +# define OPENSSL_INIT_ENGINE_CAPI 0x00002000L +# define OPENSSL_INIT_ENGINE_PADLOCK 0x00004000L +# define OPENSSL_INIT_ENGINE_AFALG 0x00008000L +/* FREE: 0x00010000L */ +# define OPENSSL_INIT_ATFORK 0x00020000L +/* OPENSSL_INIT_BASE_ONLY 0x00040000L */ +# define OPENSSL_INIT_NO_ATEXIT 0x00080000L +/* OPENSSL_INIT flag range 0x03f00000 reserved for OPENSSL_init_ssl() */ +/* FREE: 0x04000000L */ +/* FREE: 0x08000000L */ +/* FREE: 0x10000000L */ +/* FREE: 0x20000000L */ +/* FREE: 0x40000000L */ +/* FREE: 0x80000000L */ +/* Max OPENSSL_INIT flag value is 0x80000000 */ + +/* openssl and dasync not counted as builtin */ +# define OPENSSL_INIT_ENGINE_ALL_BUILTIN \ + (OPENSSL_INIT_ENGINE_RDRAND | OPENSSL_INIT_ENGINE_DYNAMIC \ + | OPENSSL_INIT_ENGINE_CRYPTODEV | OPENSSL_INIT_ENGINE_CAPI | \ + OPENSSL_INIT_ENGINE_PADLOCK) + +/* Library initialisation functions */ +void OPENSSL_cleanup(void); +int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); +int OPENSSL_atexit(void (*handler)(void)); +void OPENSSL_thread_stop(void); +void OPENSSL_thread_stop_ex(OSSL_LIB_CTX *ctx); + +/* Low-level control of initialization */ +OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void); +# ifndef OPENSSL_NO_STDIO +int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, + const char *config_filename); +void OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS *settings, + unsigned long flags); +int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings, + const char *config_appname); +# endif +void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings); + +# if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) +# if defined(_WIN32) +# if defined(BASETYPES) || defined(_WINDEF_H) +/* application has to include in order to use this */ +typedef DWORD CRYPTO_THREAD_LOCAL; +typedef DWORD CRYPTO_THREAD_ID; + +typedef LONG CRYPTO_ONCE; +# define CRYPTO_ONCE_STATIC_INIT 0 +# endif +# else +# if defined(__TANDEM) && defined(_SPT_MODEL_) +# define SPT_THREAD_SIGNAL 1 +# define SPT_THREAD_AWARE 1 +# include +# else +# include +# endif +typedef pthread_once_t CRYPTO_ONCE; +typedef pthread_key_t CRYPTO_THREAD_LOCAL; +typedef pthread_t CRYPTO_THREAD_ID; + +# define CRYPTO_ONCE_STATIC_INIT PTHREAD_ONCE_INIT +# endif +# endif + +# if !defined(CRYPTO_ONCE_STATIC_INIT) +typedef unsigned int CRYPTO_ONCE; +typedef unsigned int CRYPTO_THREAD_LOCAL; +typedef unsigned int CRYPTO_THREAD_ID; +# define CRYPTO_ONCE_STATIC_INIT 0 +# endif + +int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void)); + +int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *)); +void *CRYPTO_THREAD_get_local(CRYPTO_THREAD_LOCAL *key); +int CRYPTO_THREAD_set_local(CRYPTO_THREAD_LOCAL *key, void *val); +int CRYPTO_THREAD_cleanup_local(CRYPTO_THREAD_LOCAL *key); + +CRYPTO_THREAD_ID CRYPTO_THREAD_get_current_id(void); +int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b); + +OSSL_LIB_CTX *OSSL_LIB_CTX_new(void); +OSSL_LIB_CTX *OSSL_LIB_CTX_new_from_dispatch(const OSSL_CORE_HANDLE *handle, + const OSSL_DISPATCH *in); +OSSL_LIB_CTX *OSSL_LIB_CTX_new_child(const OSSL_CORE_HANDLE *handle, + const OSSL_DISPATCH *in); +int OSSL_LIB_CTX_load_config(OSSL_LIB_CTX *ctx, const char *config_file); +void OSSL_LIB_CTX_free(OSSL_LIB_CTX *); +OSSL_LIB_CTX *OSSL_LIB_CTX_get0_global_default(void); +OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *libctx); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/cryptoerr.h b/OtherInc/openssl/include/openssl/cryptoerr.h new file mode 100644 index 0000000..c6a04d9 --- /dev/null +++ b/OtherInc/openssl/include/openssl/cryptoerr.h @@ -0,0 +1,46 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CRYPTOERR_H +# define OPENSSL_CRYPTOERR_H +# pragma once + +# include +# include +# include + + + +/* + * CRYPTO reason codes. + */ +# define CRYPTO_R_BAD_ALGORITHM_NAME 117 +# define CRYPTO_R_CONFLICTING_NAMES 118 +# define CRYPTO_R_HEX_STRING_TOO_SHORT 121 +# define CRYPTO_R_ILLEGAL_HEX_DIGIT 102 +# define CRYPTO_R_INSUFFICIENT_DATA_SPACE 106 +# define CRYPTO_R_INSUFFICIENT_PARAM_SIZE 107 +# define CRYPTO_R_INSUFFICIENT_SECURE_DATA_SPACE 108 +# define CRYPTO_R_INVALID_NEGATIVE_VALUE 122 +# define CRYPTO_R_INVALID_NULL_ARGUMENT 109 +# define CRYPTO_R_INVALID_OSSL_PARAM_TYPE 110 +# define CRYPTO_R_ODD_NUMBER_OF_DIGITS 103 +# define CRYPTO_R_PROVIDER_ALREADY_EXISTS 104 +# define CRYPTO_R_PROVIDER_SECTION_ERROR 105 +# define CRYPTO_R_RANDOM_SECTION_ERROR 119 +# define CRYPTO_R_SECURE_MALLOC_FAILURE 111 +# define CRYPTO_R_STRING_TOO_LONG 112 +# define CRYPTO_R_TOO_MANY_BYTES 113 +# define CRYPTO_R_TOO_MANY_RECORDS 114 +# define CRYPTO_R_TOO_SMALL_BUFFER 116 +# define CRYPTO_R_UNKNOWN_NAME_IN_RANDOM_SECTION 120 +# define CRYPTO_R_ZERO_LENGTH_NUMBER 115 + +#endif diff --git a/OtherInc/openssl/include/openssl/cryptoerr_legacy.h b/OtherInc/openssl/include/openssl/cryptoerr_legacy.h new file mode 100644 index 0000000..ccab33a --- /dev/null +++ b/OtherInc/openssl/include/openssl/cryptoerr_legacy.h @@ -0,0 +1,1466 @@ +/* + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This header file preserves symbols from pre-3.0 OpenSSL. + * It should never be included directly, as it's already included + * by the public {lib}err.h headers, and since it will go away some + * time in the future. + */ + +#ifndef OPENSSL_CRYPTOERR_LEGACY_H +# define OPENSSL_CRYPTOERR_LEGACY_H +# pragma once + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ERR_load_ASN1_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_ASYNC_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_BIO_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_BN_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_BUF_strings(void); +# ifndef OPENSSL_NO_CMS +OSSL_DEPRECATEDIN_3_0 int ERR_load_CMS_strings(void); +# endif +# ifndef OPENSSL_NO_COMP +OSSL_DEPRECATEDIN_3_0 int ERR_load_COMP_strings(void); +# endif +OSSL_DEPRECATEDIN_3_0 int ERR_load_CONF_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_CRYPTO_strings(void); +# ifndef OPENSSL_NO_CT +OSSL_DEPRECATEDIN_3_0 int ERR_load_CT_strings(void); +# endif +# ifndef OPENSSL_NO_DH +OSSL_DEPRECATEDIN_3_0 int ERR_load_DH_strings(void); +# endif +# ifndef OPENSSL_NO_DSA +OSSL_DEPRECATEDIN_3_0 int ERR_load_DSA_strings(void); +# endif +# ifndef OPENSSL_NO_EC +OSSL_DEPRECATEDIN_3_0 int ERR_load_EC_strings(void); +# endif +# ifndef OPENSSL_NO_ENGINE +OSSL_DEPRECATEDIN_3_0 int ERR_load_ENGINE_strings(void); +# endif +OSSL_DEPRECATEDIN_3_0 int ERR_load_ERR_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_EVP_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_KDF_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_OBJ_strings(void); +# ifndef OPENSSL_NO_OCSP +OSSL_DEPRECATEDIN_3_0 int ERR_load_OCSP_strings(void); +# endif +OSSL_DEPRECATEDIN_3_0 int ERR_load_PEM_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_PKCS12_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_PKCS7_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_RAND_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_RSA_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_OSSL_STORE_strings(void); +# ifndef OPENSSL_NO_TS +OSSL_DEPRECATEDIN_3_0 int ERR_load_TS_strings(void); +# endif +OSSL_DEPRECATEDIN_3_0 int ERR_load_UI_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_X509_strings(void); +OSSL_DEPRECATEDIN_3_0 int ERR_load_X509V3_strings(void); + +/* Collected _F_ macros from OpenSSL 1.1.1 */ + +/* + * ASN1 function codes. + */ +# define ASN1_F_A2D_ASN1_OBJECT 0 +# define ASN1_F_A2I_ASN1_INTEGER 0 +# define ASN1_F_A2I_ASN1_STRING 0 +# define ASN1_F_APPEND_EXP 0 +# define ASN1_F_ASN1_BIO_INIT 0 +# define ASN1_F_ASN1_BIT_STRING_SET_BIT 0 +# define ASN1_F_ASN1_CB 0 +# define ASN1_F_ASN1_CHECK_TLEN 0 +# define ASN1_F_ASN1_COLLECT 0 +# define ASN1_F_ASN1_D2I_EX_PRIMITIVE 0 +# define ASN1_F_ASN1_D2I_FP 0 +# define ASN1_F_ASN1_D2I_READ_BIO 0 +# define ASN1_F_ASN1_DIGEST 0 +# define ASN1_F_ASN1_DO_ADB 0 +# define ASN1_F_ASN1_DO_LOCK 0 +# define ASN1_F_ASN1_DUP 0 +# define ASN1_F_ASN1_ENC_SAVE 0 +# define ASN1_F_ASN1_EX_C2I 0 +# define ASN1_F_ASN1_FIND_END 0 +# define ASN1_F_ASN1_GENERALIZEDTIME_ADJ 0 +# define ASN1_F_ASN1_GENERATE_V3 0 +# define ASN1_F_ASN1_GET_INT64 0 +# define ASN1_F_ASN1_GET_OBJECT 0 +# define ASN1_F_ASN1_GET_UINT64 0 +# define ASN1_F_ASN1_I2D_BIO 0 +# define ASN1_F_ASN1_I2D_FP 0 +# define ASN1_F_ASN1_ITEM_D2I_FP 0 +# define ASN1_F_ASN1_ITEM_DUP 0 +# define ASN1_F_ASN1_ITEM_EMBED_D2I 0 +# define ASN1_F_ASN1_ITEM_EMBED_NEW 0 +# define ASN1_F_ASN1_ITEM_FLAGS_I2D 0 +# define ASN1_F_ASN1_ITEM_I2D_BIO 0 +# define ASN1_F_ASN1_ITEM_I2D_FP 0 +# define ASN1_F_ASN1_ITEM_PACK 0 +# define ASN1_F_ASN1_ITEM_SIGN 0 +# define ASN1_F_ASN1_ITEM_SIGN_CTX 0 +# define ASN1_F_ASN1_ITEM_UNPACK 0 +# define ASN1_F_ASN1_ITEM_VERIFY 0 +# define ASN1_F_ASN1_MBSTRING_NCOPY 0 +# define ASN1_F_ASN1_OBJECT_NEW 0 +# define ASN1_F_ASN1_OUTPUT_DATA 0 +# define ASN1_F_ASN1_PCTX_NEW 0 +# define ASN1_F_ASN1_PRIMITIVE_NEW 0 +# define ASN1_F_ASN1_SCTX_NEW 0 +# define ASN1_F_ASN1_SIGN 0 +# define ASN1_F_ASN1_STR2TYPE 0 +# define ASN1_F_ASN1_STRING_GET_INT64 0 +# define ASN1_F_ASN1_STRING_GET_UINT64 0 +# define ASN1_F_ASN1_STRING_SET 0 +# define ASN1_F_ASN1_STRING_TABLE_ADD 0 +# define ASN1_F_ASN1_STRING_TO_BN 0 +# define ASN1_F_ASN1_STRING_TYPE_NEW 0 +# define ASN1_F_ASN1_TEMPLATE_EX_D2I 0 +# define ASN1_F_ASN1_TEMPLATE_NEW 0 +# define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I 0 +# define ASN1_F_ASN1_TIME_ADJ 0 +# define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING 0 +# define ASN1_F_ASN1_TYPE_GET_OCTETSTRING 0 +# define ASN1_F_ASN1_UTCTIME_ADJ 0 +# define ASN1_F_ASN1_VERIFY 0 +# define ASN1_F_B64_READ_ASN1 0 +# define ASN1_F_B64_WRITE_ASN1 0 +# define ASN1_F_BIO_NEW_NDEF 0 +# define ASN1_F_BITSTR_CB 0 +# define ASN1_F_BN_TO_ASN1_STRING 0 +# define ASN1_F_C2I_ASN1_BIT_STRING 0 +# define ASN1_F_C2I_ASN1_INTEGER 0 +# define ASN1_F_C2I_ASN1_OBJECT 0 +# define ASN1_F_C2I_IBUF 0 +# define ASN1_F_C2I_UINT64_INT 0 +# define ASN1_F_COLLECT_DATA 0 +# define ASN1_F_D2I_ASN1_OBJECT 0 +# define ASN1_F_D2I_ASN1_UINTEGER 0 +# define ASN1_F_D2I_AUTOPRIVATEKEY 0 +# define ASN1_F_D2I_PRIVATEKEY 0 +# define ASN1_F_D2I_PUBLICKEY 0 +# define ASN1_F_DO_BUF 0 +# define ASN1_F_DO_CREATE 0 +# define ASN1_F_DO_DUMP 0 +# define ASN1_F_DO_TCREATE 0 +# define ASN1_F_I2A_ASN1_OBJECT 0 +# define ASN1_F_I2D_ASN1_BIO_STREAM 0 +# define ASN1_F_I2D_ASN1_OBJECT 0 +# define ASN1_F_I2D_DSA_PUBKEY 0 +# define ASN1_F_I2D_EC_PUBKEY 0 +# define ASN1_F_I2D_PRIVATEKEY 0 +# define ASN1_F_I2D_PUBLICKEY 0 +# define ASN1_F_I2D_RSA_PUBKEY 0 +# define ASN1_F_LONG_C2I 0 +# define ASN1_F_NDEF_PREFIX 0 +# define ASN1_F_NDEF_SUFFIX 0 +# define ASN1_F_OID_MODULE_INIT 0 +# define ASN1_F_PARSE_TAGGING 0 +# define ASN1_F_PKCS5_PBE2_SET_IV 0 +# define ASN1_F_PKCS5_PBE2_SET_SCRYPT 0 +# define ASN1_F_PKCS5_PBE_SET 0 +# define ASN1_F_PKCS5_PBE_SET0_ALGOR 0 +# define ASN1_F_PKCS5_PBKDF2_SET 0 +# define ASN1_F_PKCS5_SCRYPT_SET 0 +# define ASN1_F_SMIME_READ_ASN1 0 +# define ASN1_F_SMIME_TEXT 0 +# define ASN1_F_STABLE_GET 0 +# define ASN1_F_STBL_MODULE_INIT 0 +# define ASN1_F_UINT32_C2I 0 +# define ASN1_F_UINT32_NEW 0 +# define ASN1_F_UINT64_C2I 0 +# define ASN1_F_UINT64_NEW 0 +# define ASN1_F_X509_CRL_ADD0_REVOKED 0 +# define ASN1_F_X509_INFO_NEW 0 +# define ASN1_F_X509_NAME_ENCODE 0 +# define ASN1_F_X509_NAME_EX_D2I 0 +# define ASN1_F_X509_NAME_EX_NEW 0 +# define ASN1_F_X509_PKEY_NEW 0 + +/* + * ASYNC function codes. + */ +# define ASYNC_F_ASYNC_CTX_NEW 0 +# define ASYNC_F_ASYNC_INIT_THREAD 0 +# define ASYNC_F_ASYNC_JOB_NEW 0 +# define ASYNC_F_ASYNC_PAUSE_JOB 0 +# define ASYNC_F_ASYNC_START_FUNC 0 +# define ASYNC_F_ASYNC_START_JOB 0 +# define ASYNC_F_ASYNC_WAIT_CTX_SET_WAIT_FD 0 + +/* + * BIO function codes. + */ +# define BIO_F_ACPT_STATE 0 +# define BIO_F_ADDRINFO_WRAP 0 +# define BIO_F_ADDR_STRINGS 0 +# define BIO_F_BIO_ACCEPT 0 +# define BIO_F_BIO_ACCEPT_EX 0 +# define BIO_F_BIO_ACCEPT_NEW 0 +# define BIO_F_BIO_ADDR_NEW 0 +# define BIO_F_BIO_BIND 0 +# define BIO_F_BIO_CALLBACK_CTRL 0 +# define BIO_F_BIO_CONNECT 0 +# define BIO_F_BIO_CONNECT_NEW 0 +# define BIO_F_BIO_CTRL 0 +# define BIO_F_BIO_GETS 0 +# define BIO_F_BIO_GET_HOST_IP 0 +# define BIO_F_BIO_GET_NEW_INDEX 0 +# define BIO_F_BIO_GET_PORT 0 +# define BIO_F_BIO_LISTEN 0 +# define BIO_F_BIO_LOOKUP 0 +# define BIO_F_BIO_LOOKUP_EX 0 +# define BIO_F_BIO_MAKE_PAIR 0 +# define BIO_F_BIO_METH_NEW 0 +# define BIO_F_BIO_NEW 0 +# define BIO_F_BIO_NEW_DGRAM_SCTP 0 +# define BIO_F_BIO_NEW_FILE 0 +# define BIO_F_BIO_NEW_MEM_BUF 0 +# define BIO_F_BIO_NREAD 0 +# define BIO_F_BIO_NREAD0 0 +# define BIO_F_BIO_NWRITE 0 +# define BIO_F_BIO_NWRITE0 0 +# define BIO_F_BIO_PARSE_HOSTSERV 0 +# define BIO_F_BIO_PUTS 0 +# define BIO_F_BIO_READ 0 +# define BIO_F_BIO_READ_EX 0 +# define BIO_F_BIO_READ_INTERN 0 +# define BIO_F_BIO_SOCKET 0 +# define BIO_F_BIO_SOCKET_NBIO 0 +# define BIO_F_BIO_SOCK_INFO 0 +# define BIO_F_BIO_SOCK_INIT 0 +# define BIO_F_BIO_WRITE 0 +# define BIO_F_BIO_WRITE_EX 0 +# define BIO_F_BIO_WRITE_INTERN 0 +# define BIO_F_BUFFER_CTRL 0 +# define BIO_F_CONN_CTRL 0 +# define BIO_F_CONN_STATE 0 +# define BIO_F_DGRAM_SCTP_NEW 0 +# define BIO_F_DGRAM_SCTP_READ 0 +# define BIO_F_DGRAM_SCTP_WRITE 0 +# define BIO_F_DOAPR_OUTCH 0 +# define BIO_F_FILE_CTRL 0 +# define BIO_F_FILE_READ 0 +# define BIO_F_LINEBUFFER_CTRL 0 +# define BIO_F_LINEBUFFER_NEW 0 +# define BIO_F_MEM_WRITE 0 +# define BIO_F_NBIOF_NEW 0 +# define BIO_F_SLG_WRITE 0 +# define BIO_F_SSL_NEW 0 + +/* + * BN function codes. + */ +# define BN_F_BNRAND 0 +# define BN_F_BNRAND_RANGE 0 +# define BN_F_BN_BLINDING_CONVERT_EX 0 +# define BN_F_BN_BLINDING_CREATE_PARAM 0 +# define BN_F_BN_BLINDING_INVERT_EX 0 +# define BN_F_BN_BLINDING_NEW 0 +# define BN_F_BN_BLINDING_UPDATE 0 +# define BN_F_BN_BN2DEC 0 +# define BN_F_BN_BN2HEX 0 +# define BN_F_BN_COMPUTE_WNAF 0 +# define BN_F_BN_CTX_GET 0 +# define BN_F_BN_CTX_NEW 0 +# define BN_F_BN_CTX_START 0 +# define BN_F_BN_DIV 0 +# define BN_F_BN_DIV_RECP 0 +# define BN_F_BN_EXP 0 +# define BN_F_BN_EXPAND_INTERNAL 0 +# define BN_F_BN_GENCB_NEW 0 +# define BN_F_BN_GENERATE_DSA_NONCE 0 +# define BN_F_BN_GENERATE_PRIME_EX 0 +# define BN_F_BN_GF2M_MOD 0 +# define BN_F_BN_GF2M_MOD_EXP 0 +# define BN_F_BN_GF2M_MOD_MUL 0 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD 0 +# define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 0 +# define BN_F_BN_GF2M_MOD_SQR 0 +# define BN_F_BN_GF2M_MOD_SQRT 0 +# define BN_F_BN_LSHIFT 0 +# define BN_F_BN_MOD_EXP2_MONT 0 +# define BN_F_BN_MOD_EXP_MONT 0 +# define BN_F_BN_MOD_EXP_MONT_CONSTTIME 0 +# define BN_F_BN_MOD_EXP_MONT_WORD 0 +# define BN_F_BN_MOD_EXP_RECP 0 +# define BN_F_BN_MOD_EXP_SIMPLE 0 +# define BN_F_BN_MOD_INVERSE 0 +# define BN_F_BN_MOD_INVERSE_NO_BRANCH 0 +# define BN_F_BN_MOD_LSHIFT_QUICK 0 +# define BN_F_BN_MOD_SQRT 0 +# define BN_F_BN_MONT_CTX_NEW 0 +# define BN_F_BN_MPI2BN 0 +# define BN_F_BN_NEW 0 +# define BN_F_BN_POOL_GET 0 +# define BN_F_BN_RAND 0 +# define BN_F_BN_RAND_RANGE 0 +# define BN_F_BN_RECP_CTX_NEW 0 +# define BN_F_BN_RSHIFT 0 +# define BN_F_BN_SET_WORDS 0 +# define BN_F_BN_STACK_PUSH 0 +# define BN_F_BN_USUB 0 + +/* + * BUF function codes. + */ +# define BUF_F_BUF_MEM_GROW 0 +# define BUF_F_BUF_MEM_GROW_CLEAN 0 +# define BUF_F_BUF_MEM_NEW 0 + +# ifndef OPENSSL_NO_CMS +/* + * CMS function codes. + */ +# define CMS_F_CHECK_CONTENT 0 +# define CMS_F_CMS_ADD0_CERT 0 +# define CMS_F_CMS_ADD0_RECIPIENT_KEY 0 +# define CMS_F_CMS_ADD0_RECIPIENT_PASSWORD 0 +# define CMS_F_CMS_ADD1_RECEIPTREQUEST 0 +# define CMS_F_CMS_ADD1_RECIPIENT_CERT 0 +# define CMS_F_CMS_ADD1_SIGNER 0 +# define CMS_F_CMS_ADD1_SIGNINGTIME 0 +# define CMS_F_CMS_COMPRESS 0 +# define CMS_F_CMS_COMPRESSEDDATA_CREATE 0 +# define CMS_F_CMS_COMPRESSEDDATA_INIT_BIO 0 +# define CMS_F_CMS_COPY_CONTENT 0 +# define CMS_F_CMS_COPY_MESSAGEDIGEST 0 +# define CMS_F_CMS_DATA 0 +# define CMS_F_CMS_DATAFINAL 0 +# define CMS_F_CMS_DATAINIT 0 +# define CMS_F_CMS_DECRYPT 0 +# define CMS_F_CMS_DECRYPT_SET1_KEY 0 +# define CMS_F_CMS_DECRYPT_SET1_PASSWORD 0 +# define CMS_F_CMS_DECRYPT_SET1_PKEY 0 +# define CMS_F_CMS_DIGESTALGORITHM_FIND_CTX 0 +# define CMS_F_CMS_DIGESTALGORITHM_INIT_BIO 0 +# define CMS_F_CMS_DIGESTEDDATA_DO_FINAL 0 +# define CMS_F_CMS_DIGEST_VERIFY 0 +# define CMS_F_CMS_ENCODE_RECEIPT 0 +# define CMS_F_CMS_ENCRYPT 0 +# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT 0 +# define CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO 0 +# define CMS_F_CMS_ENCRYPTEDDATA_DECRYPT 0 +# define CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT 0 +# define CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY 0 +# define CMS_F_CMS_ENVELOPEDDATA_CREATE 0 +# define CMS_F_CMS_ENVELOPEDDATA_INIT_BIO 0 +# define CMS_F_CMS_ENVELOPED_DATA_INIT 0 +# define CMS_F_CMS_ENV_ASN1_CTRL 0 +# define CMS_F_CMS_FINAL 0 +# define CMS_F_CMS_GET0_CERTIFICATE_CHOICES 0 +# define CMS_F_CMS_GET0_CONTENT 0 +# define CMS_F_CMS_GET0_ECONTENT_TYPE 0 +# define CMS_F_CMS_GET0_ENVELOPED 0 +# define CMS_F_CMS_GET0_REVOCATION_CHOICES 0 +# define CMS_F_CMS_GET0_SIGNED 0 +# define CMS_F_CMS_MSGSIGDIGEST_ADD1 0 +# define CMS_F_CMS_RECEIPTREQUEST_CREATE0 0 +# define CMS_F_CMS_RECEIPT_VERIFY 0 +# define CMS_F_CMS_RECIPIENTINFO_DECRYPT 0 +# define CMS_F_CMS_RECIPIENTINFO_ENCRYPT 0 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT 0 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG 0 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID 0 +# define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS 0 +# define CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP 0 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT 0 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT 0 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID 0 +# define CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP 0 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP 0 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT 0 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT 0 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS 0 +# define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID 0 +# define CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT 0 +# define CMS_F_CMS_RECIPIENTINFO_SET0_KEY 0 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD 0 +# define CMS_F_CMS_RECIPIENTINFO_SET0_PKEY 0 +# define CMS_F_CMS_SD_ASN1_CTRL 0 +# define CMS_F_CMS_SET1_IAS 0 +# define CMS_F_CMS_SET1_KEYID 0 +# define CMS_F_CMS_SET1_SIGNERIDENTIFIER 0 +# define CMS_F_CMS_SET_DETACHED 0 +# define CMS_F_CMS_SIGN 0 +# define CMS_F_CMS_SIGNED_DATA_INIT 0 +# define CMS_F_CMS_SIGNERINFO_CONTENT_SIGN 0 +# define CMS_F_CMS_SIGNERINFO_SIGN 0 +# define CMS_F_CMS_SIGNERINFO_VERIFY 0 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CERT 0 +# define CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT 0 +# define CMS_F_CMS_SIGN_RECEIPT 0 +# define CMS_F_CMS_SI_CHECK_ATTRIBUTES 0 +# define CMS_F_CMS_STREAM 0 +# define CMS_F_CMS_UNCOMPRESS 0 +# define CMS_F_CMS_VERIFY 0 +# define CMS_F_KEK_UNWRAP_KEY 0 +# endif + +# ifndef OPENSSL_NO_COMP +/* + * COMP function codes. + */ +# define COMP_F_BIO_ZLIB_FLUSH 0 +# define COMP_F_BIO_ZLIB_NEW 0 +# define COMP_F_BIO_ZLIB_READ 0 +# define COMP_F_BIO_ZLIB_WRITE 0 +# define COMP_F_COMP_CTX_NEW 0 +# endif + +/* + * CONF function codes. + */ +# define CONF_F_CONF_DUMP_FP 0 +# define CONF_F_CONF_LOAD 0 +# define CONF_F_CONF_LOAD_FP 0 +# define CONF_F_CONF_PARSE_LIST 0 +# define CONF_F_DEF_LOAD 0 +# define CONF_F_DEF_LOAD_BIO 0 +# define CONF_F_GET_NEXT_FILE 0 +# define CONF_F_MODULE_ADD 0 +# define CONF_F_MODULE_INIT 0 +# define CONF_F_MODULE_LOAD_DSO 0 +# define CONF_F_MODULE_RUN 0 +# define CONF_F_NCONF_DUMP_BIO 0 +# define CONF_F_NCONF_DUMP_FP 0 +# define CONF_F_NCONF_GET_NUMBER_E 0 +# define CONF_F_NCONF_GET_SECTION 0 +# define CONF_F_NCONF_GET_STRING 0 +# define CONF_F_NCONF_LOAD 0 +# define CONF_F_NCONF_LOAD_BIO 0 +# define CONF_F_NCONF_LOAD_FP 0 +# define CONF_F_NCONF_NEW 0 +# define CONF_F_PROCESS_INCLUDE 0 +# define CONF_F_SSL_MODULE_INIT 0 +# define CONF_F_STR_COPY 0 + +/* + * CRYPTO function codes. + */ +# define CRYPTO_F_CMAC_CTX_NEW 0 +# define CRYPTO_F_CRYPTO_DUP_EX_DATA 0 +# define CRYPTO_F_CRYPTO_FREE_EX_DATA 0 +# define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX 0 +# define CRYPTO_F_CRYPTO_MEMDUP 0 +# define CRYPTO_F_CRYPTO_NEW_EX_DATA 0 +# define CRYPTO_F_CRYPTO_OCB128_COPY_CTX 0 +# define CRYPTO_F_CRYPTO_OCB128_INIT 0 +# define CRYPTO_F_CRYPTO_SET_EX_DATA 0 +# define CRYPTO_F_GET_AND_LOCK 0 +# define CRYPTO_F_OPENSSL_ATEXIT 0 +# define CRYPTO_F_OPENSSL_BUF2HEXSTR 0 +# define CRYPTO_F_OPENSSL_FOPEN 0 +# define CRYPTO_F_OPENSSL_HEXSTR2BUF 0 +# define CRYPTO_F_OPENSSL_INIT_CRYPTO 0 +# define CRYPTO_F_OPENSSL_LH_NEW 0 +# define CRYPTO_F_OPENSSL_SK_DEEP_COPY 0 +# define CRYPTO_F_OPENSSL_SK_DUP 0 +# define CRYPTO_F_PKEY_HMAC_INIT 0 +# define CRYPTO_F_PKEY_POLY1305_INIT 0 +# define CRYPTO_F_PKEY_SIPHASH_INIT 0 +# define CRYPTO_F_SK_RESERVE 0 + +# ifndef OPENSSL_NO_CT +/* + * CT function codes. + */ +# define CT_F_CTLOG_NEW 0 +# define CT_F_CTLOG_NEW_FROM_BASE64 0 +# define CT_F_CTLOG_NEW_FROM_CONF 0 +# define CT_F_CTLOG_STORE_LOAD_CTX_NEW 0 +# define CT_F_CTLOG_STORE_LOAD_FILE 0 +# define CT_F_CTLOG_STORE_LOAD_LOG 0 +# define CT_F_CTLOG_STORE_NEW 0 +# define CT_F_CT_BASE64_DECODE 0 +# define CT_F_CT_POLICY_EVAL_CTX_NEW 0 +# define CT_F_CT_V1_LOG_ID_FROM_PKEY 0 +# define CT_F_I2O_SCT 0 +# define CT_F_I2O_SCT_LIST 0 +# define CT_F_I2O_SCT_SIGNATURE 0 +# define CT_F_O2I_SCT 0 +# define CT_F_O2I_SCT_LIST 0 +# define CT_F_O2I_SCT_SIGNATURE 0 +# define CT_F_SCT_CTX_NEW 0 +# define CT_F_SCT_CTX_VERIFY 0 +# define CT_F_SCT_NEW 0 +# define CT_F_SCT_NEW_FROM_BASE64 0 +# define CT_F_SCT_SET0_LOG_ID 0 +# define CT_F_SCT_SET1_EXTENSIONS 0 +# define CT_F_SCT_SET1_LOG_ID 0 +# define CT_F_SCT_SET1_SIGNATURE 0 +# define CT_F_SCT_SET_LOG_ENTRY_TYPE 0 +# define CT_F_SCT_SET_SIGNATURE_NID 0 +# define CT_F_SCT_SET_VERSION 0 +# endif + +# ifndef OPENSSL_NO_DH +/* + * DH function codes. + */ +# define DH_F_COMPUTE_KEY 0 +# define DH_F_DHPARAMS_PRINT_FP 0 +# define DH_F_DH_BUILTIN_GENPARAMS 0 +# define DH_F_DH_CHECK_EX 0 +# define DH_F_DH_CHECK_PARAMS_EX 0 +# define DH_F_DH_CHECK_PUB_KEY_EX 0 +# define DH_F_DH_CMS_DECRYPT 0 +# define DH_F_DH_CMS_SET_PEERKEY 0 +# define DH_F_DH_CMS_SET_SHARED_INFO 0 +# define DH_F_DH_METH_DUP 0 +# define DH_F_DH_METH_NEW 0 +# define DH_F_DH_METH_SET1_NAME 0 +# define DH_F_DH_NEW_BY_NID 0 +# define DH_F_DH_NEW_METHOD 0 +# define DH_F_DH_PARAM_DECODE 0 +# define DH_F_DH_PKEY_PUBLIC_CHECK 0 +# define DH_F_DH_PRIV_DECODE 0 +# define DH_F_DH_PRIV_ENCODE 0 +# define DH_F_DH_PUB_DECODE 0 +# define DH_F_DH_PUB_ENCODE 0 +# define DH_F_DO_DH_PRINT 0 +# define DH_F_GENERATE_KEY 0 +# define DH_F_PKEY_DH_CTRL_STR 0 +# define DH_F_PKEY_DH_DERIVE 0 +# define DH_F_PKEY_DH_INIT 0 +# define DH_F_PKEY_DH_KEYGEN 0 +# endif + +# ifndef OPENSSL_NO_DSA +/* + * DSA function codes. + */ +# define DSA_F_DSAPARAMS_PRINT 0 +# define DSA_F_DSAPARAMS_PRINT_FP 0 +# define DSA_F_DSA_BUILTIN_PARAMGEN 0 +# define DSA_F_DSA_BUILTIN_PARAMGEN2 0 +# define DSA_F_DSA_DO_SIGN 0 +# define DSA_F_DSA_DO_VERIFY 0 +# define DSA_F_DSA_METH_DUP 0 +# define DSA_F_DSA_METH_NEW 0 +# define DSA_F_DSA_METH_SET1_NAME 0 +# define DSA_F_DSA_NEW_METHOD 0 +# define DSA_F_DSA_PARAM_DECODE 0 +# define DSA_F_DSA_PRINT_FP 0 +# define DSA_F_DSA_PRIV_DECODE 0 +# define DSA_F_DSA_PRIV_ENCODE 0 +# define DSA_F_DSA_PUB_DECODE 0 +# define DSA_F_DSA_PUB_ENCODE 0 +# define DSA_F_DSA_SIGN 0 +# define DSA_F_DSA_SIGN_SETUP 0 +# define DSA_F_DSA_SIG_NEW 0 +# define DSA_F_OLD_DSA_PRIV_DECODE 0 +# define DSA_F_PKEY_DSA_CTRL 0 +# define DSA_F_PKEY_DSA_CTRL_STR 0 +# define DSA_F_PKEY_DSA_KEYGEN 0 +# endif + +# ifndef OPENSSL_NO_EC +/* + * EC function codes. + */ +# define EC_F_BN_TO_FELEM 0 +# define EC_F_D2I_ECPARAMETERS 0 +# define EC_F_D2I_ECPKPARAMETERS 0 +# define EC_F_D2I_ECPRIVATEKEY 0 +# define EC_F_DO_EC_KEY_PRINT 0 +# define EC_F_ECDH_CMS_DECRYPT 0 +# define EC_F_ECDH_CMS_SET_SHARED_INFO 0 +# define EC_F_ECDH_COMPUTE_KEY 0 +# define EC_F_ECDH_SIMPLE_COMPUTE_KEY 0 +# define EC_F_ECDSA_DO_SIGN_EX 0 +# define EC_F_ECDSA_DO_VERIFY 0 +# define EC_F_ECDSA_SIGN_EX 0 +# define EC_F_ECDSA_SIGN_SETUP 0 +# define EC_F_ECDSA_SIG_NEW 0 +# define EC_F_ECDSA_VERIFY 0 +# define EC_F_ECD_ITEM_VERIFY 0 +# define EC_F_ECKEY_PARAM2TYPE 0 +# define EC_F_ECKEY_PARAM_DECODE 0 +# define EC_F_ECKEY_PRIV_DECODE 0 +# define EC_F_ECKEY_PRIV_ENCODE 0 +# define EC_F_ECKEY_PUB_DECODE 0 +# define EC_F_ECKEY_PUB_ENCODE 0 +# define EC_F_ECKEY_TYPE2PARAM 0 +# define EC_F_ECPARAMETERS_PRINT 0 +# define EC_F_ECPARAMETERS_PRINT_FP 0 +# define EC_F_ECPKPARAMETERS_PRINT 0 +# define EC_F_ECPKPARAMETERS_PRINT_FP 0 +# define EC_F_ECP_NISTZ256_GET_AFFINE 0 +# define EC_F_ECP_NISTZ256_INV_MOD_ORD 0 +# define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE 0 +# define EC_F_ECP_NISTZ256_POINTS_MUL 0 +# define EC_F_ECP_NISTZ256_PRE_COMP_NEW 0 +# define EC_F_ECP_NISTZ256_WINDOWED_MUL 0 +# define EC_F_ECX_KEY_OP 0 +# define EC_F_ECX_PRIV_ENCODE 0 +# define EC_F_ECX_PUB_ENCODE 0 +# define EC_F_EC_ASN1_GROUP2CURVE 0 +# define EC_F_EC_ASN1_GROUP2FIELDID 0 +# define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY 0 +# define EC_F_EC_GF2M_SIMPLE_FIELD_INV 0 +# define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 0 +# define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 0 +# define EC_F_EC_GF2M_SIMPLE_LADDER_POST 0 +# define EC_F_EC_GF2M_SIMPLE_LADDER_PRE 0 +# define EC_F_EC_GF2M_SIMPLE_OCT2POINT 0 +# define EC_F_EC_GF2M_SIMPLE_POINT2OCT 0 +# define EC_F_EC_GF2M_SIMPLE_POINTS_MUL 0 +# define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 0 +# define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 0 +# define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 0 +# define EC_F_EC_GFP_MONT_FIELD_DECODE 0 +# define EC_F_EC_GFP_MONT_FIELD_ENCODE 0 +# define EC_F_EC_GFP_MONT_FIELD_INV 0 +# define EC_F_EC_GFP_MONT_FIELD_MUL 0 +# define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE 0 +# define EC_F_EC_GFP_MONT_FIELD_SQR 0 +# define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 0 +# define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 0 +# define EC_F_EC_GFP_NISTP224_POINTS_MUL 0 +# define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 0 +# define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE 0 +# define EC_F_EC_GFP_NISTP256_POINTS_MUL 0 +# define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 0 +# define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE 0 +# define EC_F_EC_GFP_NISTP521_POINTS_MUL 0 +# define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 0 +# define EC_F_EC_GFP_NIST_FIELD_MUL 0 +# define EC_F_EC_GFP_NIST_FIELD_SQR 0 +# define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 0 +# define EC_F_EC_GFP_SIMPLE_BLIND_COORDINATES 0 +# define EC_F_EC_GFP_SIMPLE_FIELD_INV 0 +# define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 0 +# define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 0 +# define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 0 +# define EC_F_EC_GFP_SIMPLE_OCT2POINT 0 +# define EC_F_EC_GFP_SIMPLE_POINT2OCT 0 +# define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 0 +# define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 0 +# define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 0 +# define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 0 +# define EC_F_EC_GROUP_CHECK 0 +# define EC_F_EC_GROUP_CHECK_DISCRIMINANT 0 +# define EC_F_EC_GROUP_COPY 0 +# define EC_F_EC_GROUP_GET_CURVE 0 +# define EC_F_EC_GROUP_GET_CURVE_GF2M 0 +# define EC_F_EC_GROUP_GET_CURVE_GFP 0 +# define EC_F_EC_GROUP_GET_DEGREE 0 +# define EC_F_EC_GROUP_GET_ECPARAMETERS 0 +# define EC_F_EC_GROUP_GET_ECPKPARAMETERS 0 +# define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 0 +# define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 0 +# define EC_F_EC_GROUP_NEW 0 +# define EC_F_EC_GROUP_NEW_BY_CURVE_NAME 0 +# define EC_F_EC_GROUP_NEW_FROM_DATA 0 +# define EC_F_EC_GROUP_NEW_FROM_ECPARAMETERS 0 +# define EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS 0 +# define EC_F_EC_GROUP_SET_CURVE 0 +# define EC_F_EC_GROUP_SET_CURVE_GF2M 0 +# define EC_F_EC_GROUP_SET_CURVE_GFP 0 +# define EC_F_EC_GROUP_SET_GENERATOR 0 +# define EC_F_EC_GROUP_SET_SEED 0 +# define EC_F_EC_KEY_CHECK_KEY 0 +# define EC_F_EC_KEY_COPY 0 +# define EC_F_EC_KEY_GENERATE_KEY 0 +# define EC_F_EC_KEY_NEW 0 +# define EC_F_EC_KEY_NEW_METHOD 0 +# define EC_F_EC_KEY_OCT2PRIV 0 +# define EC_F_EC_KEY_PRINT 0 +# define EC_F_EC_KEY_PRINT_FP 0 +# define EC_F_EC_KEY_PRIV2BUF 0 +# define EC_F_EC_KEY_PRIV2OCT 0 +# define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES 0 +# define EC_F_EC_KEY_SIMPLE_CHECK_KEY 0 +# define EC_F_EC_KEY_SIMPLE_OCT2PRIV 0 +# define EC_F_EC_KEY_SIMPLE_PRIV2OCT 0 +# define EC_F_EC_PKEY_CHECK 0 +# define EC_F_EC_PKEY_PARAM_CHECK 0 +# define EC_F_EC_POINTS_MAKE_AFFINE 0 +# define EC_F_EC_POINTS_MUL 0 +# define EC_F_EC_POINT_ADD 0 +# define EC_F_EC_POINT_BN2POINT 0 +# define EC_F_EC_POINT_CMP 0 +# define EC_F_EC_POINT_COPY 0 +# define EC_F_EC_POINT_DBL 0 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES 0 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 0 +# define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 0 +# define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 0 +# define EC_F_EC_POINT_INVERT 0 +# define EC_F_EC_POINT_IS_AT_INFINITY 0 +# define EC_F_EC_POINT_IS_ON_CURVE 0 +# define EC_F_EC_POINT_MAKE_AFFINE 0 +# define EC_F_EC_POINT_NEW 0 +# define EC_F_EC_POINT_OCT2POINT 0 +# define EC_F_EC_POINT_POINT2BUF 0 +# define EC_F_EC_POINT_POINT2OCT 0 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES 0 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 0 +# define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 0 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES 0 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 0 +# define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 0 +# define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 0 +# define EC_F_EC_POINT_SET_TO_INFINITY 0 +# define EC_F_EC_PRE_COMP_NEW 0 +# define EC_F_EC_SCALAR_MUL_LADDER 0 +# define EC_F_EC_WNAF_MUL 0 +# define EC_F_EC_WNAF_PRECOMPUTE_MULT 0 +# define EC_F_I2D_ECPARAMETERS 0 +# define EC_F_I2D_ECPKPARAMETERS 0 +# define EC_F_I2D_ECPRIVATEKEY 0 +# define EC_F_I2O_ECPUBLICKEY 0 +# define EC_F_NISTP224_PRE_COMP_NEW 0 +# define EC_F_NISTP256_PRE_COMP_NEW 0 +# define EC_F_NISTP521_PRE_COMP_NEW 0 +# define EC_F_O2I_ECPUBLICKEY 0 +# define EC_F_OLD_EC_PRIV_DECODE 0 +# define EC_F_OSSL_ECDH_COMPUTE_KEY 0 +# define EC_F_OSSL_ECDSA_SIGN_SIG 0 +# define EC_F_OSSL_ECDSA_VERIFY_SIG 0 +# define EC_F_PKEY_ECD_CTRL 0 +# define EC_F_PKEY_ECD_DIGESTSIGN 0 +# define EC_F_PKEY_ECD_DIGESTSIGN25519 0 +# define EC_F_PKEY_ECD_DIGESTSIGN448 0 +# define EC_F_PKEY_ECX_DERIVE 0 +# define EC_F_PKEY_EC_CTRL 0 +# define EC_F_PKEY_EC_CTRL_STR 0 +# define EC_F_PKEY_EC_DERIVE 0 +# define EC_F_PKEY_EC_INIT 0 +# define EC_F_PKEY_EC_KDF_DERIVE 0 +# define EC_F_PKEY_EC_KEYGEN 0 +# define EC_F_PKEY_EC_PARAMGEN 0 +# define EC_F_PKEY_EC_SIGN 0 +# define EC_F_VALIDATE_ECX_DERIVE 0 +# endif + +# ifndef OPENSSL_NO_ENGINE +/* + * ENGINE function codes. + */ +# define ENGINE_F_DIGEST_UPDATE 0 +# define ENGINE_F_DYNAMIC_CTRL 0 +# define ENGINE_F_DYNAMIC_GET_DATA_CTX 0 +# define ENGINE_F_DYNAMIC_LOAD 0 +# define ENGINE_F_DYNAMIC_SET_DATA_CTX 0 +# define ENGINE_F_ENGINE_ADD 0 +# define ENGINE_F_ENGINE_BY_ID 0 +# define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 0 +# define ENGINE_F_ENGINE_CTRL 0 +# define ENGINE_F_ENGINE_CTRL_CMD 0 +# define ENGINE_F_ENGINE_CTRL_CMD_STRING 0 +# define ENGINE_F_ENGINE_FINISH 0 +# define ENGINE_F_ENGINE_GET_CIPHER 0 +# define ENGINE_F_ENGINE_GET_DIGEST 0 +# define ENGINE_F_ENGINE_GET_FIRST 0 +# define ENGINE_F_ENGINE_GET_LAST 0 +# define ENGINE_F_ENGINE_GET_NEXT 0 +# define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH 0 +# define ENGINE_F_ENGINE_GET_PKEY_METH 0 +# define ENGINE_F_ENGINE_GET_PREV 0 +# define ENGINE_F_ENGINE_INIT 0 +# define ENGINE_F_ENGINE_LIST_ADD 0 +# define ENGINE_F_ENGINE_LIST_REMOVE 0 +# define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 0 +# define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 0 +# define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 0 +# define ENGINE_F_ENGINE_NEW 0 +# define ENGINE_F_ENGINE_PKEY_ASN1_FIND_STR 0 +# define ENGINE_F_ENGINE_REMOVE 0 +# define ENGINE_F_ENGINE_SET_DEFAULT_STRING 0 +# define ENGINE_F_ENGINE_SET_ID 0 +# define ENGINE_F_ENGINE_SET_NAME 0 +# define ENGINE_F_ENGINE_TABLE_REGISTER 0 +# define ENGINE_F_ENGINE_UNLOCKED_FINISH 0 +# define ENGINE_F_ENGINE_UP_REF 0 +# define ENGINE_F_INT_CLEANUP_ITEM 0 +# define ENGINE_F_INT_CTRL_HELPER 0 +# define ENGINE_F_INT_ENGINE_CONFIGURE 0 +# define ENGINE_F_INT_ENGINE_MODULE_INIT 0 +# define ENGINE_F_OSSL_HMAC_INIT 0 +# endif + +/* + * EVP function codes. + */ +# define EVP_F_AESNI_INIT_KEY 0 +# define EVP_F_AESNI_XTS_INIT_KEY 0 +# define EVP_F_AES_GCM_CTRL 0 +# define EVP_F_AES_INIT_KEY 0 +# define EVP_F_AES_OCB_CIPHER 0 +# define EVP_F_AES_T4_INIT_KEY 0 +# define EVP_F_AES_T4_XTS_INIT_KEY 0 +# define EVP_F_AES_WRAP_CIPHER 0 +# define EVP_F_AES_XTS_INIT_KEY 0 +# define EVP_F_ALG_MODULE_INIT 0 +# define EVP_F_ARIA_CCM_INIT_KEY 0 +# define EVP_F_ARIA_GCM_CTRL 0 +# define EVP_F_ARIA_GCM_INIT_KEY 0 +# define EVP_F_ARIA_INIT_KEY 0 +# define EVP_F_B64_NEW 0 +# define EVP_F_CAMELLIA_INIT_KEY 0 +# define EVP_F_CHACHA20_POLY1305_CTRL 0 +# define EVP_F_CMLL_T4_INIT_KEY 0 +# define EVP_F_DES_EDE3_WRAP_CIPHER 0 +# define EVP_F_DO_SIGVER_INIT 0 +# define EVP_F_ENC_NEW 0 +# define EVP_F_EVP_CIPHERINIT_EX 0 +# define EVP_F_EVP_CIPHER_ASN1_TO_PARAM 0 +# define EVP_F_EVP_CIPHER_CTX_COPY 0 +# define EVP_F_EVP_CIPHER_CTX_CTRL 0 +# define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH 0 +# define EVP_F_EVP_CIPHER_PARAM_TO_ASN1 0 +# define EVP_F_EVP_DECRYPTFINAL_EX 0 +# define EVP_F_EVP_DECRYPTUPDATE 0 +# define EVP_F_EVP_DIGESTFINALXOF 0 +# define EVP_F_EVP_DIGESTINIT_EX 0 +# define EVP_F_EVP_ENCRYPTDECRYPTUPDATE 0 +# define EVP_F_EVP_ENCRYPTFINAL_EX 0 +# define EVP_F_EVP_ENCRYPTUPDATE 0 +# define EVP_F_EVP_MD_CTX_COPY_EX 0 +# define EVP_F_EVP_MD_SIZE 0 +# define EVP_F_EVP_OPENINIT 0 +# define EVP_F_EVP_PBE_ALG_ADD 0 +# define EVP_F_EVP_PBE_ALG_ADD_TYPE 0 +# define EVP_F_EVP_PBE_CIPHERINIT 0 +# define EVP_F_EVP_PBE_SCRYPT 0 +# define EVP_F_EVP_PKCS82PKEY 0 +# define EVP_F_EVP_PKEY2PKCS8 0 +# define EVP_F_EVP_PKEY_ASN1_ADD0 0 +# define EVP_F_EVP_PKEY_CHECK 0 +# define EVP_F_EVP_PKEY_COPY_PARAMETERS 0 +# define EVP_F_EVP_PKEY_CTX_CTRL 0 +# define EVP_F_EVP_PKEY_CTX_CTRL_STR 0 +# define EVP_F_EVP_PKEY_CTX_DUP 0 +# define EVP_F_EVP_PKEY_CTX_MD 0 +# define EVP_F_EVP_PKEY_DECRYPT 0 +# define EVP_F_EVP_PKEY_DECRYPT_INIT 0 +# define EVP_F_EVP_PKEY_DECRYPT_OLD 0 +# define EVP_F_EVP_PKEY_DERIVE 0 +# define EVP_F_EVP_PKEY_DERIVE_INIT 0 +# define EVP_F_EVP_PKEY_DERIVE_SET_PEER 0 +# define EVP_F_EVP_PKEY_ENCRYPT 0 +# define EVP_F_EVP_PKEY_ENCRYPT_INIT 0 +# define EVP_F_EVP_PKEY_ENCRYPT_OLD 0 +# define EVP_F_EVP_PKEY_GET0_DH 0 +# define EVP_F_EVP_PKEY_GET0_DSA 0 +# define EVP_F_EVP_PKEY_GET0_EC_KEY 0 +# define EVP_F_EVP_PKEY_GET0_HMAC 0 +# define EVP_F_EVP_PKEY_GET0_POLY1305 0 +# define EVP_F_EVP_PKEY_GET0_RSA 0 +# define EVP_F_EVP_PKEY_GET0_SIPHASH 0 +# define EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY 0 +# define EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY 0 +# define EVP_F_EVP_PKEY_KEYGEN 0 +# define EVP_F_EVP_PKEY_KEYGEN_INIT 0 +# define EVP_F_EVP_PKEY_METH_ADD0 0 +# define EVP_F_EVP_PKEY_METH_NEW 0 +# define EVP_F_EVP_PKEY_NEW 0 +# define EVP_F_EVP_PKEY_NEW_CMAC_KEY 0 +# define EVP_F_EVP_PKEY_NEW_RAW_PRIVATE_KEY 0 +# define EVP_F_EVP_PKEY_NEW_RAW_PUBLIC_KEY 0 +# define EVP_F_EVP_PKEY_PARAMGEN 0 +# define EVP_F_EVP_PKEY_PARAMGEN_INIT 0 +# define EVP_F_EVP_PKEY_PARAM_CHECK 0 +# define EVP_F_EVP_PKEY_PUBLIC_CHECK 0 +# define EVP_F_EVP_PKEY_SET1_ENGINE 0 +# define EVP_F_EVP_PKEY_SET_ALIAS_TYPE 0 +# define EVP_F_EVP_PKEY_SIGN 0 +# define EVP_F_EVP_PKEY_SIGN_INIT 0 +# define EVP_F_EVP_PKEY_VERIFY 0 +# define EVP_F_EVP_PKEY_VERIFY_INIT 0 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER 0 +# define EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT 0 +# define EVP_F_EVP_SIGNFINAL 0 +# define EVP_F_EVP_VERIFYFINAL 0 +# define EVP_F_INT_CTX_NEW 0 +# define EVP_F_OK_NEW 0 +# define EVP_F_PKCS5_PBE_KEYIVGEN 0 +# define EVP_F_PKCS5_V2_PBE_KEYIVGEN 0 +# define EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN 0 +# define EVP_F_PKCS5_V2_SCRYPT_KEYIVGEN 0 +# define EVP_F_PKEY_SET_TYPE 0 +# define EVP_F_RC2_MAGIC_TO_METH 0 +# define EVP_F_RC5_CTRL 0 +# define EVP_F_R_32_12_16_INIT_KEY 0 +# define EVP_F_S390X_AES_GCM_CTRL 0 +# define EVP_F_UPDATE 0 + +/* + * KDF function codes. + */ +# define KDF_F_PKEY_HKDF_CTRL_STR 0 +# define KDF_F_PKEY_HKDF_DERIVE 0 +# define KDF_F_PKEY_HKDF_INIT 0 +# define KDF_F_PKEY_SCRYPT_CTRL_STR 0 +# define KDF_F_PKEY_SCRYPT_CTRL_UINT64 0 +# define KDF_F_PKEY_SCRYPT_DERIVE 0 +# define KDF_F_PKEY_SCRYPT_INIT 0 +# define KDF_F_PKEY_SCRYPT_SET_MEMBUF 0 +# define KDF_F_PKEY_TLS1_PRF_CTRL_STR 0 +# define KDF_F_PKEY_TLS1_PRF_DERIVE 0 +# define KDF_F_PKEY_TLS1_PRF_INIT 0 +# define KDF_F_TLS1_PRF_ALG 0 + +/* + * KDF reason codes. + */ +# define KDF_R_INVALID_DIGEST 0 +# define KDF_R_MISSING_ITERATION_COUNT 0 +# define KDF_R_MISSING_KEY 0 +# define KDF_R_MISSING_MESSAGE_DIGEST 0 +# define KDF_R_MISSING_PARAMETER 0 +# define KDF_R_MISSING_PASS 0 +# define KDF_R_MISSING_SALT 0 +# define KDF_R_MISSING_SECRET 0 +# define KDF_R_MISSING_SEED 0 +# define KDF_R_UNKNOWN_PARAMETER_TYPE 0 +# define KDF_R_VALUE_ERROR 0 +# define KDF_R_VALUE_MISSING 0 + +/* + * OBJ function codes. + */ +# define OBJ_F_OBJ_ADD_OBJECT 0 +# define OBJ_F_OBJ_ADD_SIGID 0 +# define OBJ_F_OBJ_CREATE 0 +# define OBJ_F_OBJ_DUP 0 +# define OBJ_F_OBJ_NAME_NEW_INDEX 0 +# define OBJ_F_OBJ_NID2LN 0 +# define OBJ_F_OBJ_NID2OBJ 0 +# define OBJ_F_OBJ_NID2SN 0 +# define OBJ_F_OBJ_TXT2OBJ 0 + +# ifndef OPENSSL_NO_OCSP +/* + * OCSP function codes. + */ +# define OCSP_F_D2I_OCSP_NONCE 0 +# define OCSP_F_OCSP_BASIC_ADD1_STATUS 0 +# define OCSP_F_OCSP_BASIC_SIGN 0 +# define OCSP_F_OCSP_BASIC_SIGN_CTX 0 +# define OCSP_F_OCSP_BASIC_VERIFY 0 +# define OCSP_F_OCSP_CERT_ID_NEW 0 +# define OCSP_F_OCSP_CHECK_DELEGATED 0 +# define OCSP_F_OCSP_CHECK_IDS 0 +# define OCSP_F_OCSP_CHECK_ISSUER 0 +# define OCSP_F_OCSP_CHECK_VALIDITY 0 +# define OCSP_F_OCSP_MATCH_ISSUERID 0 +# define OCSP_F_OCSP_PARSE_URL 0 +# define OCSP_F_OCSP_REQUEST_SIGN 0 +# define OCSP_F_OCSP_REQUEST_VERIFY 0 +# define OCSP_F_OCSP_RESPONSE_GET1_BASIC 0 +# define OCSP_F_PARSE_HTTP_LINE1 0 +# endif + +/* + * PEM function codes. + */ +# define PEM_F_B2I_DSS 0 +# define PEM_F_B2I_PVK_BIO 0 +# define PEM_F_B2I_RSA 0 +# define PEM_F_CHECK_BITLEN_DSA 0 +# define PEM_F_CHECK_BITLEN_RSA 0 +# define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 0 +# define PEM_F_D2I_PKCS8PRIVATEKEY_FP 0 +# define PEM_F_DO_B2I 0 +# define PEM_F_DO_B2I_BIO 0 +# define PEM_F_DO_BLOB_HEADER 0 +# define PEM_F_DO_I2B 0 +# define PEM_F_DO_PK8PKEY 0 +# define PEM_F_DO_PK8PKEY_FP 0 +# define PEM_F_DO_PVK_BODY 0 +# define PEM_F_DO_PVK_HEADER 0 +# define PEM_F_GET_HEADER_AND_DATA 0 +# define PEM_F_GET_NAME 0 +# define PEM_F_I2B_PVK 0 +# define PEM_F_I2B_PVK_BIO 0 +# define PEM_F_LOAD_IV 0 +# define PEM_F_PEM_ASN1_READ 0 +# define PEM_F_PEM_ASN1_READ_BIO 0 +# define PEM_F_PEM_ASN1_WRITE 0 +# define PEM_F_PEM_ASN1_WRITE_BIO 0 +# define PEM_F_PEM_DEF_CALLBACK 0 +# define PEM_F_PEM_DO_HEADER 0 +# define PEM_F_PEM_GET_EVP_CIPHER_INFO 0 +# define PEM_F_PEM_READ 0 +# define PEM_F_PEM_READ_BIO 0 +# define PEM_F_PEM_READ_BIO_DHPARAMS 0 +# define PEM_F_PEM_READ_BIO_EX 0 +# define PEM_F_PEM_READ_BIO_PARAMETERS 0 +# define PEM_F_PEM_READ_BIO_PRIVATEKEY 0 +# define PEM_F_PEM_READ_DHPARAMS 0 +# define PEM_F_PEM_READ_PRIVATEKEY 0 +# define PEM_F_PEM_SIGNFINAL 0 +# define PEM_F_PEM_WRITE 0 +# define PEM_F_PEM_WRITE_BIO 0 +# define PEM_F_PEM_WRITE_BIO_PRIVATEKEY_TRADITIONAL 0 +# define PEM_F_PEM_WRITE_PRIVATEKEY 0 +# define PEM_F_PEM_X509_INFO_READ 0 +# define PEM_F_PEM_X509_INFO_READ_BIO 0 +# define PEM_F_PEM_X509_INFO_WRITE_BIO 0 + +/* + * PKCS12 function codes. + */ +# define PKCS12_F_OPENSSL_ASC2UNI 0 +# define PKCS12_F_OPENSSL_UNI2ASC 0 +# define PKCS12_F_OPENSSL_UNI2UTF8 0 +# define PKCS12_F_OPENSSL_UTF82UNI 0 +# define PKCS12_F_PKCS12_CREATE 0 +# define PKCS12_F_PKCS12_GEN_MAC 0 +# define PKCS12_F_PKCS12_INIT 0 +# define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 0 +# define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 0 +# define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 0 +# define PKCS12_F_PKCS12_KEY_GEN_ASC 0 +# define PKCS12_F_PKCS12_KEY_GEN_UNI 0 +# define PKCS12_F_PKCS12_KEY_GEN_UTF8 0 +# define PKCS12_F_PKCS12_NEWPASS 0 +# define PKCS12_F_PKCS12_PACK_P7DATA 0 +# define PKCS12_F_PKCS12_PACK_P7ENCDATA 0 +# define PKCS12_F_PKCS12_PARSE 0 +# define PKCS12_F_PKCS12_PBE_CRYPT 0 +# define PKCS12_F_PKCS12_PBE_KEYIVGEN 0 +# define PKCS12_F_PKCS12_SAFEBAG_CREATE0_P8INF 0 +# define PKCS12_F_PKCS12_SAFEBAG_CREATE0_PKCS8 0 +# define PKCS12_F_PKCS12_SAFEBAG_CREATE_PKCS8_ENCRYPT 0 +# define PKCS12_F_PKCS12_SETUP_MAC 0 +# define PKCS12_F_PKCS12_SET_MAC 0 +# define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 0 +# define PKCS12_F_PKCS12_UNPACK_P7DATA 0 +# define PKCS12_F_PKCS12_VERIFY_MAC 0 +# define PKCS12_F_PKCS8_ENCRYPT 0 +# define PKCS12_F_PKCS8_SET0_PBE 0 + +/* + * PKCS7 function codes. + */ +# define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB 0 +# define PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME 0 +# define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP 0 +# define PKCS7_F_PKCS7_ADD_CERTIFICATE 0 +# define PKCS7_F_PKCS7_ADD_CRL 0 +# define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO 0 +# define PKCS7_F_PKCS7_ADD_SIGNATURE 0 +# define PKCS7_F_PKCS7_ADD_SIGNER 0 +# define PKCS7_F_PKCS7_BIO_ADD_DIGEST 0 +# define PKCS7_F_PKCS7_COPY_EXISTING_DIGEST 0 +# define PKCS7_F_PKCS7_CTRL 0 +# define PKCS7_F_PKCS7_DATADECODE 0 +# define PKCS7_F_PKCS7_DATAFINAL 0 +# define PKCS7_F_PKCS7_DATAINIT 0 +# define PKCS7_F_PKCS7_DATAVERIFY 0 +# define PKCS7_F_PKCS7_DECRYPT 0 +# define PKCS7_F_PKCS7_DECRYPT_RINFO 0 +# define PKCS7_F_PKCS7_ENCODE_RINFO 0 +# define PKCS7_F_PKCS7_ENCRYPT 0 +# define PKCS7_F_PKCS7_FINAL 0 +# define PKCS7_F_PKCS7_FIND_DIGEST 0 +# define PKCS7_F_PKCS7_GET0_SIGNERS 0 +# define PKCS7_F_PKCS7_RECIP_INFO_SET 0 +# define PKCS7_F_PKCS7_SET_CIPHER 0 +# define PKCS7_F_PKCS7_SET_CONTENT 0 +# define PKCS7_F_PKCS7_SET_DIGEST 0 +# define PKCS7_F_PKCS7_SET_TYPE 0 +# define PKCS7_F_PKCS7_SIGN 0 +# define PKCS7_F_PKCS7_SIGNATUREVERIFY 0 +# define PKCS7_F_PKCS7_SIGNER_INFO_SET 0 +# define PKCS7_F_PKCS7_SIGNER_INFO_SIGN 0 +# define PKCS7_F_PKCS7_SIGN_ADD_SIGNER 0 +# define PKCS7_F_PKCS7_SIMPLE_SMIMECAP 0 +# define PKCS7_F_PKCS7_VERIFY 0 + +/* + * RAND function codes. + */ +# define RAND_F_DATA_COLLECT_METHOD 0 +# define RAND_F_DRBG_BYTES 0 +# define RAND_F_DRBG_GET_ENTROPY 0 +# define RAND_F_DRBG_SETUP 0 +# define RAND_F_GET_ENTROPY 0 +# define RAND_F_RAND_BYTES 0 +# define RAND_F_RAND_DRBG_ENABLE_LOCKING 0 +# define RAND_F_RAND_DRBG_GENERATE 0 +# define RAND_F_RAND_DRBG_GET_ENTROPY 0 +# define RAND_F_RAND_DRBG_GET_NONCE 0 +# define RAND_F_RAND_DRBG_INSTANTIATE 0 +# define RAND_F_RAND_DRBG_NEW 0 +# define RAND_F_RAND_DRBG_RESEED 0 +# define RAND_F_RAND_DRBG_RESTART 0 +# define RAND_F_RAND_DRBG_SET 0 +# define RAND_F_RAND_DRBG_SET_DEFAULTS 0 +# define RAND_F_RAND_DRBG_UNINSTANTIATE 0 +# define RAND_F_RAND_LOAD_FILE 0 +# define RAND_F_RAND_POOL_ACQUIRE_ENTROPY 0 +# define RAND_F_RAND_POOL_ADD 0 +# define RAND_F_RAND_POOL_ADD_BEGIN 0 +# define RAND_F_RAND_POOL_ADD_END 0 +# define RAND_F_RAND_POOL_ATTACH 0 +# define RAND_F_RAND_POOL_BYTES_NEEDED 0 +# define RAND_F_RAND_POOL_GROW 0 +# define RAND_F_RAND_POOL_NEW 0 +# define RAND_F_RAND_PSEUDO_BYTES 0 +# define RAND_F_RAND_WRITE_FILE 0 + +/* + * RSA function codes. + */ +# define RSA_F_CHECK_PADDING_MD 0 +# define RSA_F_ENCODE_PKCS1 0 +# define RSA_F_INT_RSA_VERIFY 0 +# define RSA_F_OLD_RSA_PRIV_DECODE 0 +# define RSA_F_PKEY_PSS_INIT 0 +# define RSA_F_PKEY_RSA_CTRL 0 +# define RSA_F_PKEY_RSA_CTRL_STR 0 +# define RSA_F_PKEY_RSA_SIGN 0 +# define RSA_F_PKEY_RSA_VERIFY 0 +# define RSA_F_PKEY_RSA_VERIFYRECOVER 0 +# define RSA_F_RSA_ALGOR_TO_MD 0 +# define RSA_F_RSA_BUILTIN_KEYGEN 0 +# define RSA_F_RSA_CHECK_KEY 0 +# define RSA_F_RSA_CHECK_KEY_EX 0 +# define RSA_F_RSA_CMS_DECRYPT 0 +# define RSA_F_RSA_CMS_VERIFY 0 +# define RSA_F_RSA_ITEM_VERIFY 0 +# define RSA_F_RSA_METH_DUP 0 +# define RSA_F_RSA_METH_NEW 0 +# define RSA_F_RSA_METH_SET1_NAME 0 +# define RSA_F_RSA_MGF1_TO_MD 0 +# define RSA_F_RSA_MULTIP_INFO_NEW 0 +# define RSA_F_RSA_NEW_METHOD 0 +# define RSA_F_RSA_NULL 0 +# define RSA_F_RSA_NULL_PRIVATE_DECRYPT 0 +# define RSA_F_RSA_NULL_PRIVATE_ENCRYPT 0 +# define RSA_F_RSA_NULL_PUBLIC_DECRYPT 0 +# define RSA_F_RSA_NULL_PUBLIC_ENCRYPT 0 +# define RSA_F_RSA_OSSL_PRIVATE_DECRYPT 0 +# define RSA_F_RSA_OSSL_PRIVATE_ENCRYPT 0 +# define RSA_F_RSA_OSSL_PUBLIC_DECRYPT 0 +# define RSA_F_RSA_OSSL_PUBLIC_ENCRYPT 0 +# define RSA_F_RSA_PADDING_ADD_NONE 0 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP 0 +# define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP_MGF1 0 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS 0 +# define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1 0 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1 0 +# define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2 0 +# define RSA_F_RSA_PADDING_ADD_SSLV23 0 +# define RSA_F_RSA_PADDING_ADD_X931 0 +# define RSA_F_RSA_PADDING_CHECK_NONE 0 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP 0 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1 0 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1 0 +# define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2 0 +# define RSA_F_RSA_PADDING_CHECK_SSLV23 0 +# define RSA_F_RSA_PADDING_CHECK_X931 0 +# define RSA_F_RSA_PARAM_DECODE 0 +# define RSA_F_RSA_PRINT 0 +# define RSA_F_RSA_PRINT_FP 0 +# define RSA_F_RSA_PRIV_DECODE 0 +# define RSA_F_RSA_PRIV_ENCODE 0 +# define RSA_F_RSA_PSS_GET_PARAM 0 +# define RSA_F_RSA_PSS_TO_CTX 0 +# define RSA_F_RSA_PUB_DECODE 0 +# define RSA_F_RSA_SETUP_BLINDING 0 +# define RSA_F_RSA_SIGN 0 +# define RSA_F_RSA_SIGN_ASN1_OCTET_STRING 0 +# define RSA_F_RSA_VERIFY 0 +# define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING 0 +# define RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1 0 +# define RSA_F_SETUP_TBUF 0 + +/* + * OSSL_STORE function codes. + */ +# define OSSL_STORE_F_FILE_CTRL 0 +# define OSSL_STORE_F_FILE_FIND 0 +# define OSSL_STORE_F_FILE_GET_PASS 0 +# define OSSL_STORE_F_FILE_LOAD 0 +# define OSSL_STORE_F_FILE_LOAD_TRY_DECODE 0 +# define OSSL_STORE_F_FILE_NAME_TO_URI 0 +# define OSSL_STORE_F_FILE_OPEN 0 +# define OSSL_STORE_F_OSSL_STORE_ATTACH_PEM_BIO 0 +# define OSSL_STORE_F_OSSL_STORE_EXPECT 0 +# define OSSL_STORE_F_OSSL_STORE_FILE_ATTACH_PEM_BIO_INT 0 +# define OSSL_STORE_F_OSSL_STORE_FIND 0 +# define OSSL_STORE_F_OSSL_STORE_GET0_LOADER_INT 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_CERT 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_CRL 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_NAME 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_NAME_DESCRIPTION 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_PARAMS 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_GET1_PKEY 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_CERT 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_CRL 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_EMBEDDED 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_NAME 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_PARAMS 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_NEW_PKEY 0 +# define OSSL_STORE_F_OSSL_STORE_INFO_SET0_NAME_DESCRIPTION 0 +# define OSSL_STORE_F_OSSL_STORE_INIT_ONCE 0 +# define OSSL_STORE_F_OSSL_STORE_LOADER_NEW 0 +# define OSSL_STORE_F_OSSL_STORE_OPEN 0 +# define OSSL_STORE_F_OSSL_STORE_OPEN_INT 0 +# define OSSL_STORE_F_OSSL_STORE_REGISTER_LOADER_INT 0 +# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_ALIAS 0 +# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_ISSUER_SERIAL 0 +# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT 0 +# define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_NAME 0 +# define OSSL_STORE_F_OSSL_STORE_UNREGISTER_LOADER_INT 0 +# define OSSL_STORE_F_TRY_DECODE_PARAMS 0 +# define OSSL_STORE_F_TRY_DECODE_PKCS12 0 +# define OSSL_STORE_F_TRY_DECODE_PKCS8ENCRYPTED 0 + +# ifndef OPENSSL_NO_TS +/* + * TS function codes. + */ +# define TS_F_DEF_SERIAL_CB 0 +# define TS_F_DEF_TIME_CB 0 +# define TS_F_ESS_ADD_SIGNING_CERT 0 +# define TS_F_ESS_ADD_SIGNING_CERT_V2 0 +# define TS_F_ESS_CERT_ID_NEW_INIT 0 +# define TS_F_ESS_CERT_ID_V2_NEW_INIT 0 +# define TS_F_ESS_SIGNING_CERT_NEW_INIT 0 +# define TS_F_ESS_SIGNING_CERT_V2_NEW_INIT 0 +# define TS_F_INT_TS_RESP_VERIFY_TOKEN 0 +# define TS_F_PKCS7_TO_TS_TST_INFO 0 +# define TS_F_TS_ACCURACY_SET_MICROS 0 +# define TS_F_TS_ACCURACY_SET_MILLIS 0 +# define TS_F_TS_ACCURACY_SET_SECONDS 0 +# define TS_F_TS_CHECK_IMPRINTS 0 +# define TS_F_TS_CHECK_NONCES 0 +# define TS_F_TS_CHECK_POLICY 0 +# define TS_F_TS_CHECK_SIGNING_CERTS 0 +# define TS_F_TS_CHECK_STATUS_INFO 0 +# define TS_F_TS_COMPUTE_IMPRINT 0 +# define TS_F_TS_CONF_INVALID 0 +# define TS_F_TS_CONF_LOAD_CERT 0 +# define TS_F_TS_CONF_LOAD_CERTS 0 +# define TS_F_TS_CONF_LOAD_KEY 0 +# define TS_F_TS_CONF_LOOKUP_FAIL 0 +# define TS_F_TS_CONF_SET_DEFAULT_ENGINE 0 +# define TS_F_TS_GET_STATUS_TEXT 0 +# define TS_F_TS_MSG_IMPRINT_SET_ALGO 0 +# define TS_F_TS_REQ_SET_MSG_IMPRINT 0 +# define TS_F_TS_REQ_SET_NONCE 0 +# define TS_F_TS_REQ_SET_POLICY_ID 0 +# define TS_F_TS_RESP_CREATE_RESPONSE 0 +# define TS_F_TS_RESP_CREATE_TST_INFO 0 +# define TS_F_TS_RESP_CTX_ADD_FAILURE_INFO 0 +# define TS_F_TS_RESP_CTX_ADD_MD 0 +# define TS_F_TS_RESP_CTX_ADD_POLICY 0 +# define TS_F_TS_RESP_CTX_NEW 0 +# define TS_F_TS_RESP_CTX_SET_ACCURACY 0 +# define TS_F_TS_RESP_CTX_SET_CERTS 0 +# define TS_F_TS_RESP_CTX_SET_DEF_POLICY 0 +# define TS_F_TS_RESP_CTX_SET_SIGNER_CERT 0 +# define TS_F_TS_RESP_CTX_SET_STATUS_INFO 0 +# define TS_F_TS_RESP_GET_POLICY 0 +# define TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION 0 +# define TS_F_TS_RESP_SET_STATUS_INFO 0 +# define TS_F_TS_RESP_SET_TST_INFO 0 +# define TS_F_TS_RESP_SIGN 0 +# define TS_F_TS_RESP_VERIFY_SIGNATURE 0 +# define TS_F_TS_TST_INFO_SET_ACCURACY 0 +# define TS_F_TS_TST_INFO_SET_MSG_IMPRINT 0 +# define TS_F_TS_TST_INFO_SET_NONCE 0 +# define TS_F_TS_TST_INFO_SET_POLICY_ID 0 +# define TS_F_TS_TST_INFO_SET_SERIAL 0 +# define TS_F_TS_TST_INFO_SET_TIME 0 +# define TS_F_TS_TST_INFO_SET_TSA 0 +# define TS_F_TS_VERIFY 0 +# define TS_F_TS_VERIFY_CERT 0 +# define TS_F_TS_VERIFY_CTX_NEW 0 +# endif + +/* + * UI function codes. + */ +# define UI_F_CLOSE_CONSOLE 0 +# define UI_F_ECHO_CONSOLE 0 +# define UI_F_GENERAL_ALLOCATE_BOOLEAN 0 +# define UI_F_GENERAL_ALLOCATE_PROMPT 0 +# define UI_F_NOECHO_CONSOLE 0 +# define UI_F_OPEN_CONSOLE 0 +# define UI_F_UI_CONSTRUCT_PROMPT 0 +# define UI_F_UI_CREATE_METHOD 0 +# define UI_F_UI_CTRL 0 +# define UI_F_UI_DUP_ERROR_STRING 0 +# define UI_F_UI_DUP_INFO_STRING 0 +# define UI_F_UI_DUP_INPUT_BOOLEAN 0 +# define UI_F_UI_DUP_INPUT_STRING 0 +# define UI_F_UI_DUP_USER_DATA 0 +# define UI_F_UI_DUP_VERIFY_STRING 0 +# define UI_F_UI_GET0_RESULT 0 +# define UI_F_UI_GET_RESULT_LENGTH 0 +# define UI_F_UI_NEW_METHOD 0 +# define UI_F_UI_PROCESS 0 +# define UI_F_UI_SET_RESULT 0 +# define UI_F_UI_SET_RESULT_EX 0 + +/* + * X509 function codes. + */ +# define X509_F_ADD_CERT_DIR 0 +# define X509_F_BUILD_CHAIN 0 +# define X509_F_BY_FILE_CTRL 0 +# define X509_F_CHECK_NAME_CONSTRAINTS 0 +# define X509_F_CHECK_POLICY 0 +# define X509_F_DANE_I2D 0 +# define X509_F_DIR_CTRL 0 +# define X509_F_GET_CERT_BY_SUBJECT 0 +# define X509_F_I2D_X509_AUX 0 +# define X509_F_LOOKUP_CERTS_SK 0 +# define X509_F_NETSCAPE_SPKI_B64_DECODE 0 +# define X509_F_NETSCAPE_SPKI_B64_ENCODE 0 +# define X509_F_NEW_DIR 0 +# define X509_F_X509AT_ADD1_ATTR 0 +# define X509_F_X509V3_ADD_EXT 0 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_NID 0 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ 0 +# define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT 0 +# define X509_F_X509_ATTRIBUTE_GET0_DATA 0 +# define X509_F_X509_ATTRIBUTE_SET1_DATA 0 +# define X509_F_X509_CHECK_PRIVATE_KEY 0 +# define X509_F_X509_CRL_DIFF 0 +# define X509_F_X509_CRL_METHOD_NEW 0 +# define X509_F_X509_CRL_PRINT_FP 0 +# define X509_F_X509_EXTENSION_CREATE_BY_NID 0 +# define X509_F_X509_EXTENSION_CREATE_BY_OBJ 0 +# define X509_F_X509_GET_PUBKEY_PARAMETERS 0 +# define X509_F_X509_LOAD_CERT_CRL_FILE 0 +# define X509_F_X509_LOAD_CERT_FILE 0 +# define X509_F_X509_LOAD_CRL_FILE 0 +# define X509_F_X509_LOOKUP_METH_NEW 0 +# define X509_F_X509_LOOKUP_NEW 0 +# define X509_F_X509_NAME_ADD_ENTRY 0 +# define X509_F_X509_NAME_CANON 0 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_NID 0 +# define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT 0 +# define X509_F_X509_NAME_ENTRY_SET_OBJECT 0 +# define X509_F_X509_NAME_ONELINE 0 +# define X509_F_X509_NAME_PRINT 0 +# define X509_F_X509_OBJECT_NEW 0 +# define X509_F_X509_PRINT_EX_FP 0 +# define X509_F_X509_PUBKEY_DECODE 0 +# define X509_F_X509_PUBKEY_GET 0 +# define X509_F_X509_PUBKEY_GET0 0 +# define X509_F_X509_PUBKEY_SET 0 +# define X509_F_X509_REQ_CHECK_PRIVATE_KEY 0 +# define X509_F_X509_REQ_PRINT_EX 0 +# define X509_F_X509_REQ_PRINT_FP 0 +# define X509_F_X509_REQ_TO_X509 0 +# define X509_F_X509_STORE_ADD_CERT 0 +# define X509_F_X509_STORE_ADD_CRL 0 +# define X509_F_X509_STORE_ADD_LOOKUP 0 +# define X509_F_X509_STORE_CTX_GET1_ISSUER 0 +# define X509_F_X509_STORE_CTX_INIT 0 +# define X509_F_X509_STORE_CTX_NEW 0 +# define X509_F_X509_STORE_CTX_PURPOSE_INHERIT 0 +# define X509_F_X509_STORE_NEW 0 +# define X509_F_X509_TO_X509_REQ 0 +# define X509_F_X509_TRUST_ADD 0 +# define X509_F_X509_TRUST_SET 0 +# define X509_F_X509_VERIFY_CERT 0 +# define X509_F_X509_VERIFY_PARAM_NEW 0 + +/* + * X509V3 function codes. + */ +# define X509V3_F_A2I_GENERAL_NAME 0 +# define X509V3_F_ADDR_VALIDATE_PATH_INTERNAL 0 +# define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE 0 +# define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL 0 +# define X509V3_F_BIGNUM_TO_STRING 0 +# define X509V3_F_COPY_EMAIL 0 +# define X509V3_F_COPY_ISSUER 0 +# define X509V3_F_DO_DIRNAME 0 +# define X509V3_F_DO_EXT_I2D 0 +# define X509V3_F_DO_EXT_NCONF 0 +# define X509V3_F_GNAMES_FROM_SECTNAME 0 +# define X509V3_F_I2S_ASN1_ENUMERATED 0 +# define X509V3_F_I2S_ASN1_IA5STRING 0 +# define X509V3_F_I2S_ASN1_INTEGER 0 +# define X509V3_F_I2V_AUTHORITY_INFO_ACCESS 0 +# define X509V3_F_LEVEL_ADD_NODE 0 +# define X509V3_F_NOTICE_SECTION 0 +# define X509V3_F_NREF_NOS 0 +# define X509V3_F_POLICY_CACHE_CREATE 0 +# define X509V3_F_POLICY_CACHE_NEW 0 +# define X509V3_F_POLICY_DATA_NEW 0 +# define X509V3_F_POLICY_SECTION 0 +# define X509V3_F_PROCESS_PCI_VALUE 0 +# define X509V3_F_R2I_CERTPOL 0 +# define X509V3_F_R2I_PCI 0 +# define X509V3_F_S2I_ASN1_IA5STRING 0 +# define X509V3_F_S2I_ASN1_INTEGER 0 +# define X509V3_F_S2I_ASN1_OCTET_STRING 0 +# define X509V3_F_S2I_SKEY_ID 0 +# define X509V3_F_SET_DIST_POINT_NAME 0 +# define X509V3_F_SXNET_ADD_ID_ASC 0 +# define X509V3_F_SXNET_ADD_ID_INTEGER 0 +# define X509V3_F_SXNET_ADD_ID_ULONG 0 +# define X509V3_F_SXNET_GET_ID_ASC 0 +# define X509V3_F_SXNET_GET_ID_ULONG 0 +# define X509V3_F_TREE_INIT 0 +# define X509V3_F_V2I_ASIDENTIFIERS 0 +# define X509V3_F_V2I_ASN1_BIT_STRING 0 +# define X509V3_F_V2I_AUTHORITY_INFO_ACCESS 0 +# define X509V3_F_V2I_AUTHORITY_KEYID 0 +# define X509V3_F_V2I_BASIC_CONSTRAINTS 0 +# define X509V3_F_V2I_CRLD 0 +# define X509V3_F_V2I_EXTENDED_KEY_USAGE 0 +# define X509V3_F_V2I_GENERAL_NAMES 0 +# define X509V3_F_V2I_GENERAL_NAME_EX 0 +# define X509V3_F_V2I_IDP 0 +# define X509V3_F_V2I_IPADDRBLOCKS 0 +# define X509V3_F_V2I_ISSUER_ALT 0 +# define X509V3_F_V2I_NAME_CONSTRAINTS 0 +# define X509V3_F_V2I_POLICY_CONSTRAINTS 0 +# define X509V3_F_V2I_POLICY_MAPPINGS 0 +# define X509V3_F_V2I_SUBJECT_ALT 0 +# define X509V3_F_V2I_TLS_FEATURE 0 +# define X509V3_F_V3_GENERIC_EXTENSION 0 +# define X509V3_F_X509V3_ADD1_I2D 0 +# define X509V3_F_X509V3_ADD_VALUE 0 +# define X509V3_F_X509V3_EXT_ADD 0 +# define X509V3_F_X509V3_EXT_ADD_ALIAS 0 +# define X509V3_F_X509V3_EXT_I2D 0 +# define X509V3_F_X509V3_EXT_NCONF 0 +# define X509V3_F_X509V3_GET_SECTION 0 +# define X509V3_F_X509V3_GET_STRING 0 +# define X509V3_F_X509V3_GET_VALUE_BOOL 0 +# define X509V3_F_X509V3_PARSE_LIST 0 +# define X509V3_F_X509_PURPOSE_ADD 0 +# define X509V3_F_X509_PURPOSE_SET 0 + +/* + * Compatibility defines. + */ +# define EVP_R_OPERATON_NOT_INITIALIZED EVP_R_OPERATION_NOT_INITIALIZED + +# endif + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/ct.h b/OtherInc/openssl/include/openssl/ct.h new file mode 100644 index 0000000..06c41b7 --- /dev/null +++ b/OtherInc/openssl/include/openssl/ct.h @@ -0,0 +1,573 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\ct.h.in + * + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_CT_H +# define OPENSSL_CT_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_CT_H +# endif + +# include + +# ifndef OPENSSL_NO_CT +# include +# include +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + + +/* Minimum RSA key size, from RFC6962 */ +# define SCT_MIN_RSA_BITS 2048 + +/* All hashes are SHA256 in v1 of Certificate Transparency */ +# define CT_V1_HASHLEN SHA256_DIGEST_LENGTH + +SKM_DEFINE_STACK_OF_INTERNAL(SCT, SCT, SCT) +#define sk_SCT_num(sk) OPENSSL_sk_num(ossl_check_const_SCT_sk_type(sk)) +#define sk_SCT_value(sk, idx) ((SCT *)OPENSSL_sk_value(ossl_check_const_SCT_sk_type(sk), (idx))) +#define sk_SCT_new(cmp) ((STACK_OF(SCT) *)OPENSSL_sk_new(ossl_check_SCT_compfunc_type(cmp))) +#define sk_SCT_new_null() ((STACK_OF(SCT) *)OPENSSL_sk_new_null()) +#define sk_SCT_new_reserve(cmp, n) ((STACK_OF(SCT) *)OPENSSL_sk_new_reserve(ossl_check_SCT_compfunc_type(cmp), (n))) +#define sk_SCT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SCT_sk_type(sk), (n)) +#define sk_SCT_free(sk) OPENSSL_sk_free(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_zero(sk) OPENSSL_sk_zero(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_delete(sk, i) ((SCT *)OPENSSL_sk_delete(ossl_check_SCT_sk_type(sk), (i))) +#define sk_SCT_delete_ptr(sk, ptr) ((SCT *)OPENSSL_sk_delete_ptr(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr))) +#define sk_SCT_push(sk, ptr) OPENSSL_sk_push(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_pop(sk) ((SCT *)OPENSSL_sk_pop(ossl_check_SCT_sk_type(sk))) +#define sk_SCT_shift(sk) ((SCT *)OPENSSL_sk_shift(ossl_check_SCT_sk_type(sk))) +#define sk_SCT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SCT_sk_type(sk),ossl_check_SCT_freefunc_type(freefunc)) +#define sk_SCT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr), (idx)) +#define sk_SCT_set(sk, idx, ptr) ((SCT *)OPENSSL_sk_set(ossl_check_SCT_sk_type(sk), (idx), ossl_check_SCT_type(ptr))) +#define sk_SCT_find(sk, ptr) OPENSSL_sk_find(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr), pnum) +#define sk_SCT_sort(sk) OPENSSL_sk_sort(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SCT_sk_type(sk)) +#define sk_SCT_dup(sk) ((STACK_OF(SCT) *)OPENSSL_sk_dup(ossl_check_const_SCT_sk_type(sk))) +#define sk_SCT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SCT) *)OPENSSL_sk_deep_copy(ossl_check_const_SCT_sk_type(sk), ossl_check_SCT_copyfunc_type(copyfunc), ossl_check_SCT_freefunc_type(freefunc))) +#define sk_SCT_set_cmp_func(sk, cmp) ((sk_SCT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SCT_sk_type(sk), ossl_check_SCT_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CTLOG, CTLOG, CTLOG) +#define sk_CTLOG_num(sk) OPENSSL_sk_num(ossl_check_const_CTLOG_sk_type(sk)) +#define sk_CTLOG_value(sk, idx) ((CTLOG *)OPENSSL_sk_value(ossl_check_const_CTLOG_sk_type(sk), (idx))) +#define sk_CTLOG_new(cmp) ((STACK_OF(CTLOG) *)OPENSSL_sk_new(ossl_check_CTLOG_compfunc_type(cmp))) +#define sk_CTLOG_new_null() ((STACK_OF(CTLOG) *)OPENSSL_sk_new_null()) +#define sk_CTLOG_new_reserve(cmp, n) ((STACK_OF(CTLOG) *)OPENSSL_sk_new_reserve(ossl_check_CTLOG_compfunc_type(cmp), (n))) +#define sk_CTLOG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CTLOG_sk_type(sk), (n)) +#define sk_CTLOG_free(sk) OPENSSL_sk_free(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_zero(sk) OPENSSL_sk_zero(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_delete(sk, i) ((CTLOG *)OPENSSL_sk_delete(ossl_check_CTLOG_sk_type(sk), (i))) +#define sk_CTLOG_delete_ptr(sk, ptr) ((CTLOG *)OPENSSL_sk_delete_ptr(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr))) +#define sk_CTLOG_push(sk, ptr) OPENSSL_sk_push(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_pop(sk) ((CTLOG *)OPENSSL_sk_pop(ossl_check_CTLOG_sk_type(sk))) +#define sk_CTLOG_shift(sk) ((CTLOG *)OPENSSL_sk_shift(ossl_check_CTLOG_sk_type(sk))) +#define sk_CTLOG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CTLOG_sk_type(sk),ossl_check_CTLOG_freefunc_type(freefunc)) +#define sk_CTLOG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr), (idx)) +#define sk_CTLOG_set(sk, idx, ptr) ((CTLOG *)OPENSSL_sk_set(ossl_check_CTLOG_sk_type(sk), (idx), ossl_check_CTLOG_type(ptr))) +#define sk_CTLOG_find(sk, ptr) OPENSSL_sk_find(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr), pnum) +#define sk_CTLOG_sort(sk) OPENSSL_sk_sort(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CTLOG_sk_type(sk)) +#define sk_CTLOG_dup(sk) ((STACK_OF(CTLOG) *)OPENSSL_sk_dup(ossl_check_const_CTLOG_sk_type(sk))) +#define sk_CTLOG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CTLOG) *)OPENSSL_sk_deep_copy(ossl_check_const_CTLOG_sk_type(sk), ossl_check_CTLOG_copyfunc_type(copyfunc), ossl_check_CTLOG_freefunc_type(freefunc))) +#define sk_CTLOG_set_cmp_func(sk, cmp) ((sk_CTLOG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_compfunc_type(cmp))) + + + +typedef enum { + CT_LOG_ENTRY_TYPE_NOT_SET = -1, + CT_LOG_ENTRY_TYPE_X509 = 0, + CT_LOG_ENTRY_TYPE_PRECERT = 1 +} ct_log_entry_type_t; + +typedef enum { + SCT_VERSION_NOT_SET = -1, + SCT_VERSION_V1 = 0 +} sct_version_t; + +typedef enum { + SCT_SOURCE_UNKNOWN, + SCT_SOURCE_TLS_EXTENSION, + SCT_SOURCE_X509V3_EXTENSION, + SCT_SOURCE_OCSP_STAPLED_RESPONSE +} sct_source_t; + +typedef enum { + SCT_VALIDATION_STATUS_NOT_SET, + SCT_VALIDATION_STATUS_UNKNOWN_LOG, + SCT_VALIDATION_STATUS_VALID, + SCT_VALIDATION_STATUS_INVALID, + SCT_VALIDATION_STATUS_UNVERIFIED, + SCT_VALIDATION_STATUS_UNKNOWN_VERSION +} sct_validation_status_t; + +/****************************************** + * CT policy evaluation context functions * + ******************************************/ + +/* + * Creates a new, empty policy evaluation context associated with the given + * library context and property query string. + * The caller is responsible for calling CT_POLICY_EVAL_CTX_free when finished + * with the CT_POLICY_EVAL_CTX. + */ +CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new_ex(OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CT_POLICY_EVAL_CTX_new_ex() but the default library + * context and property query string is used. + */ +CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new(void); + +/* Deletes a policy evaluation context and anything it owns. */ +void CT_POLICY_EVAL_CTX_free(CT_POLICY_EVAL_CTX *ctx); + +/* Gets the peer certificate that the SCTs are for */ +X509* CT_POLICY_EVAL_CTX_get0_cert(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the certificate associated with the received SCTs. + * Increments the reference count of cert. + * Returns 1 on success, 0 otherwise. + */ +int CT_POLICY_EVAL_CTX_set1_cert(CT_POLICY_EVAL_CTX *ctx, X509 *cert); + +/* Gets the issuer of the aforementioned certificate */ +X509* CT_POLICY_EVAL_CTX_get0_issuer(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the issuer of the certificate associated with the received SCTs. + * Increments the reference count of issuer. + * Returns 1 on success, 0 otherwise. + */ +int CT_POLICY_EVAL_CTX_set1_issuer(CT_POLICY_EVAL_CTX *ctx, X509 *issuer); + +/* Gets the CT logs that are trusted sources of SCTs */ +const CTLOG_STORE *CT_POLICY_EVAL_CTX_get0_log_store(const CT_POLICY_EVAL_CTX *ctx); + +/* Sets the log store that is in use. It must outlive the CT_POLICY_EVAL_CTX. */ +void CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE(CT_POLICY_EVAL_CTX *ctx, + CTLOG_STORE *log_store); + +/* + * Gets the time, in milliseconds since the Unix epoch, that will be used as the + * current time when checking whether an SCT was issued in the future. + * Such SCTs will fail validation, as required by RFC6962. + */ +uint64_t CT_POLICY_EVAL_CTX_get_time(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the time to evaluate SCTs against, in milliseconds since the Unix epoch. + * If an SCT's timestamp is after this time, it will be interpreted as having + * been issued in the future. RFC6962 states that "TLS clients MUST reject SCTs + * whose timestamp is in the future", so an SCT will not validate in this case. + */ +void CT_POLICY_EVAL_CTX_set_time(CT_POLICY_EVAL_CTX *ctx, uint64_t time_in_ms); + +/***************** + * SCT functions * + *****************/ + +/* + * Creates a new, blank SCT. + * The caller is responsible for calling SCT_free when finished with the SCT. + */ +SCT *SCT_new(void); + +/* + * Creates a new SCT from some base64-encoded strings. + * The caller is responsible for calling SCT_free when finished with the SCT. + */ +SCT *SCT_new_from_base64(unsigned char version, + const char *logid_base64, + ct_log_entry_type_t entry_type, + uint64_t timestamp, + const char *extensions_base64, + const char *signature_base64); + +/* + * Frees the SCT and the underlying data structures. + */ +void SCT_free(SCT *sct); + +/* + * Free a stack of SCTs, and the underlying SCTs themselves. + * Intended to be compatible with X509V3_EXT_FREE. + */ +void SCT_LIST_free(STACK_OF(SCT) *a); + +/* + * Returns the version of the SCT. + */ +sct_version_t SCT_get_version(const SCT *sct); + +/* + * Set the version of an SCT. + * Returns 1 on success, 0 if the version is unrecognized. + */ +__owur int SCT_set_version(SCT *sct, sct_version_t version); + +/* + * Returns the log entry type of the SCT. + */ +ct_log_entry_type_t SCT_get_log_entry_type(const SCT *sct); + +/* + * Set the log entry type of an SCT. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type); + +/* + * Gets the ID of the log that an SCT came from. + * Ownership of the log ID remains with the SCT. + * Returns the length of the log ID. + */ +size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id); + +/* + * Set the log ID of an SCT to point directly to the *log_id specified. + * The SCT takes ownership of the specified pointer. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len); + +/* + * Set the log ID of an SCT. + * This makes a copy of the log_id. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_log_id(SCT *sct, const unsigned char *log_id, + size_t log_id_len); + +/* + * Returns the timestamp for the SCT (epoch time in milliseconds). + */ +uint64_t SCT_get_timestamp(const SCT *sct); + +/* + * Set the timestamp of an SCT (epoch time in milliseconds). + */ +void SCT_set_timestamp(SCT *sct, uint64_t timestamp); + +/* + * Return the NID for the signature used by the SCT. + * For CT v1, this will be either NID_sha256WithRSAEncryption or + * NID_ecdsa_with_SHA256 (or NID_undef if incorrect/unset). + */ +int SCT_get_signature_nid(const SCT *sct); + +/* + * Set the signature type of an SCT + * For CT v1, this should be either NID_sha256WithRSAEncryption or + * NID_ecdsa_with_SHA256. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_signature_nid(SCT *sct, int nid); + +/* + * Set *ext to point to the extension data for the SCT. ext must not be NULL. + * The SCT retains ownership of this pointer. + * Returns length of the data pointed to. + */ +size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext); + +/* + * Set the extensions of an SCT to point directly to the *ext specified. + * The SCT takes ownership of the specified pointer. + */ +void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len); + +/* + * Set the extensions of an SCT. + * This takes a copy of the ext. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_extensions(SCT *sct, const unsigned char *ext, + size_t ext_len); + +/* + * Set *sig to point to the signature for the SCT. sig must not be NULL. + * The SCT retains ownership of this pointer. + * Returns length of the data pointed to. + */ +size_t SCT_get0_signature(const SCT *sct, unsigned char **sig); + +/* + * Set the signature of an SCT to point directly to the *sig specified. + * The SCT takes ownership of the specified pointer. + */ +void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len); + +/* + * Set the signature of an SCT to be a copy of the *sig specified. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_signature(SCT *sct, const unsigned char *sig, + size_t sig_len); + +/* + * The origin of this SCT, e.g. TLS extension, OCSP response, etc. + */ +sct_source_t SCT_get_source(const SCT *sct); + +/* + * Set the origin of this SCT, e.g. TLS extension, OCSP response, etc. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_source(SCT *sct, sct_source_t source); + +/* + * Returns a text string describing the validation status of |sct|. + */ +const char *SCT_validation_status_string(const SCT *sct); + +/* + * Pretty-prints an |sct| to |out|. + * It will be indented by the number of spaces specified by |indent|. + * If |logs| is not NULL, it will be used to lookup the CT log that the SCT came + * from, so that the log name can be printed. + */ +void SCT_print(const SCT *sct, BIO *out, int indent, const CTLOG_STORE *logs); + +/* + * Pretty-prints an |sct_list| to |out|. + * It will be indented by the number of spaces specified by |indent|. + * SCTs will be delimited by |separator|. + * If |logs| is not NULL, it will be used to lookup the CT log that each SCT + * came from, so that the log names can be printed. + */ +void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, + const char *separator, const CTLOG_STORE *logs); + +/* + * Gets the last result of validating this SCT. + * If it has not been validated yet, returns SCT_VALIDATION_STATUS_NOT_SET. + */ +sct_validation_status_t SCT_get_validation_status(const SCT *sct); + +/* + * Validates the given SCT with the provided context. + * Sets the "validation_status" field of the SCT. + * Returns 1 if the SCT is valid and the signature verifies. + * Returns 0 if the SCT is invalid or could not be verified. + * Returns -1 if an error occurs. + */ +__owur int SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx); + +/* + * Validates the given list of SCTs with the provided context. + * Sets the "validation_status" field of each SCT. + * Returns 1 if there are no invalid SCTs and all signatures verify. + * Returns 0 if at least one SCT is invalid or could not be verified. + * Returns a negative integer if an error occurs. + */ +__owur int SCT_LIST_validate(const STACK_OF(SCT) *scts, + CT_POLICY_EVAL_CTX *ctx); + + +/********************************* + * SCT parsing and serialization * + *********************************/ + +/* + * Serialize (to TLS format) a stack of SCTs and return the length. + * "a" must not be NULL. + * If "pp" is NULL, just return the length of what would have been serialized. + * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer + * for data that caller is responsible for freeing (only if function returns + * successfully). + * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring + * that "*pp" is large enough to accept all of the serialized data. + * Returns < 0 on error, >= 0 indicating bytes written (or would have been) + * on success. + */ +__owur int i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); + +/* + * Convert TLS format SCT list to a stack of SCTs. + * If "a" or "*a" is NULL, a new stack will be created that the caller is + * responsible for freeing (by calling SCT_LIST_free). + * "**pp" and "*pp" must not be NULL. + * Upon success, "*pp" will point to after the last bytes read, and a stack + * will be returned. + * Upon failure, a NULL pointer will be returned, and the position of "*pp" is + * not defined. + */ +STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, + size_t len); + +/* + * Serialize (to DER format) a stack of SCTs and return the length. + * "a" must not be NULL. + * If "pp" is NULL, just returns the length of what would have been serialized. + * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer + * for data that caller is responsible for freeing (only if function returns + * successfully). + * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring + * that "*pp" is large enough to accept all of the serialized data. + * Returns < 0 on error, >= 0 indicating bytes written (or would have been) + * on success. + */ +__owur int i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); + +/* + * Parses an SCT list in DER format and returns it. + * If "a" or "*a" is NULL, a new stack will be created that the caller is + * responsible for freeing (by calling SCT_LIST_free). + * "**pp" and "*pp" must not be NULL. + * Upon success, "*pp" will point to after the last bytes read, and a stack + * will be returned. + * Upon failure, a NULL pointer will be returned, and the position of "*pp" is + * not defined. + */ +STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, + long len); + +/* + * Serialize (to TLS format) an |sct| and write it to |out|. + * If |out| is null, no SCT will be output but the length will still be returned. + * If |out| points to a null pointer, a string will be allocated to hold the + * TLS-format SCT. It is the responsibility of the caller to free it. + * If |out| points to an allocated string, the TLS-format SCT will be written + * to it. + * The length of the SCT in TLS format will be returned. + */ +__owur int i2o_SCT(const SCT *sct, unsigned char **out); + +/* + * Parses an SCT in TLS format and returns it. + * If |psct| is not null, it will end up pointing to the parsed SCT. If it + * already points to a non-null pointer, the pointer will be free'd. + * |in| should be a pointer to a string containing the TLS-format SCT. + * |in| will be advanced to the end of the SCT if parsing succeeds. + * |len| should be the length of the SCT in |in|. + * Returns NULL if an error occurs. + * If the SCT is an unsupported version, only the SCT's 'sct' and 'sct_len' + * fields will be populated (with |in| and |len| respectively). + */ +SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len); + +/******************** + * CT log functions * + ********************/ + +/* + * Creates a new CT log instance with the given |public_key| and |name| and + * associates it with the give library context |libctx| and property query + * string |propq|. + * Takes ownership of |public_key| but copies |name|. + * Returns NULL if malloc fails or if |public_key| cannot be converted to DER. + * Should be deleted by the caller using CTLOG_free when no longer needed. + */ +CTLOG *CTLOG_new_ex(EVP_PKEY *public_key, const char *name, OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CTLOG_new_ex except that the default library context and + * property query string are used. + */ +CTLOG *CTLOG_new(EVP_PKEY *public_key, const char *name); + +/* + * Creates a new CTLOG instance with the base64-encoded SubjectPublicKeyInfo DER + * in |pkey_base64| and associated with the given library context |libctx| and + * property query string |propq|. The |name| is a string to help users identify + * this log. + * Returns 1 on success, 0 on failure. + * Should be deleted by the caller using CTLOG_free when no longer needed. + */ +int CTLOG_new_from_base64_ex(CTLOG **ct_log, const char *pkey_base64, + const char *name, OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CTLOG_new_from_base64_ex() except that the default + * library context and property query string are used. + * Returns 1 on success, 0 on failure. + */ +int CTLOG_new_from_base64(CTLOG ** ct_log, + const char *pkey_base64, const char *name); + +/* + * Deletes a CT log instance and its fields. + */ +void CTLOG_free(CTLOG *log); + +/* Gets the name of the CT log */ +const char *CTLOG_get0_name(const CTLOG *log); +/* Gets the ID of the CT log */ +void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, + size_t *log_id_len); +/* Gets the public key of the CT log */ +EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log); + +/************************** + * CT log store functions * + **************************/ + +/* + * Creates a new CT log store and associates it with the given libctx and + * property query string. + * Should be deleted by the caller using CTLOG_STORE_free when no longer needed. + */ +CTLOG_STORE *CTLOG_STORE_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +/* + * Same as CTLOG_STORE_new_ex except that the default libctx and + * property query string are used. + * Should be deleted by the caller using CTLOG_STORE_free when no longer needed. + */ +CTLOG_STORE *CTLOG_STORE_new(void); + +/* + * Deletes a CT log store and all of the CT log instances held within. + */ +void CTLOG_STORE_free(CTLOG_STORE *store); + +/* + * Finds a CT log in the store based on its log ID. + * Returns the CT log, or NULL if no match is found. + */ +const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, + const uint8_t *log_id, + size_t log_id_len); + +/* + * Loads a CT log list into a |store| from a |file|. + * Returns 1 if loading is successful, or 0 otherwise. + */ +__owur int CTLOG_STORE_load_file(CTLOG_STORE *store, const char *file); + +/* + * Loads the default CT log list into a |store|. + * Returns 1 if loading is successful, or 0 otherwise. + */ +__owur int CTLOG_STORE_load_default_file(CTLOG_STORE *store); + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/cterr.h b/OtherInc/openssl/include/openssl/cterr.h new file mode 100644 index 0000000..935d32d --- /dev/null +++ b/OtherInc/openssl/include/openssl/cterr.h @@ -0,0 +1,45 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CTERR_H +# define OPENSSL_CTERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_CT + + +/* + * CT reason codes. + */ +# define CT_R_BASE64_DECODE_ERROR 108 +# define CT_R_INVALID_LOG_ID_LENGTH 100 +# define CT_R_LOG_CONF_INVALID 109 +# define CT_R_LOG_CONF_INVALID_KEY 110 +# define CT_R_LOG_CONF_MISSING_DESCRIPTION 111 +# define CT_R_LOG_CONF_MISSING_KEY 112 +# define CT_R_LOG_KEY_INVALID 113 +# define CT_R_SCT_FUTURE_TIMESTAMP 116 +# define CT_R_SCT_INVALID 104 +# define CT_R_SCT_INVALID_SIGNATURE 107 +# define CT_R_SCT_LIST_INVALID 105 +# define CT_R_SCT_LOG_ID_MISMATCH 114 +# define CT_R_SCT_NOT_SET 106 +# define CT_R_SCT_UNSUPPORTED_VERSION 115 +# define CT_R_UNRECOGNIZED_SIGNATURE_NID 101 +# define CT_R_UNSUPPORTED_ENTRY_TYPE 102 +# define CT_R_UNSUPPORTED_VERSION 103 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/decoder.h b/OtherInc/openssl/include/openssl/decoder.h new file mode 100644 index 0000000..d4ee2cf --- /dev/null +++ b/OtherInc/openssl/include/openssl/decoder.h @@ -0,0 +1,133 @@ +/* + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_DECODER_H +# define OPENSSL_DECODER_H +# pragma once + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# endif +# include +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +OSSL_DECODER *OSSL_DECODER_fetch(OSSL_LIB_CTX *libctx, const char *name, + const char *properties); +int OSSL_DECODER_up_ref(OSSL_DECODER *encoder); +void OSSL_DECODER_free(OSSL_DECODER *encoder); + +const OSSL_PROVIDER *OSSL_DECODER_get0_provider(const OSSL_DECODER *encoder); +const char *OSSL_DECODER_get0_properties(const OSSL_DECODER *encoder); +const char *OSSL_DECODER_get0_name(const OSSL_DECODER *decoder); +const char *OSSL_DECODER_get0_description(const OSSL_DECODER *decoder); +int OSSL_DECODER_is_a(const OSSL_DECODER *encoder, const char *name); + +void OSSL_DECODER_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(OSSL_DECODER *encoder, void *arg), + void *arg); +int OSSL_DECODER_names_do_all(const OSSL_DECODER *encoder, + void (*fn)(const char *name, void *data), + void *data); +const OSSL_PARAM *OSSL_DECODER_gettable_params(OSSL_DECODER *decoder); +int OSSL_DECODER_get_params(OSSL_DECODER *decoder, OSSL_PARAM params[]); + +const OSSL_PARAM *OSSL_DECODER_settable_ctx_params(OSSL_DECODER *encoder); +OSSL_DECODER_CTX *OSSL_DECODER_CTX_new(void); +int OSSL_DECODER_CTX_set_params(OSSL_DECODER_CTX *ctx, + const OSSL_PARAM params[]); +void OSSL_DECODER_CTX_free(OSSL_DECODER_CTX *ctx); + +/* Utilities that help set specific parameters */ +int OSSL_DECODER_CTX_set_passphrase(OSSL_DECODER_CTX *ctx, + const unsigned char *kstr, size_t klen); +int OSSL_DECODER_CTX_set_pem_password_cb(OSSL_DECODER_CTX *ctx, + pem_password_cb *cb, void *cbarg); +int OSSL_DECODER_CTX_set_passphrase_cb(OSSL_DECODER_CTX *ctx, + OSSL_PASSPHRASE_CALLBACK *cb, + void *cbarg); +int OSSL_DECODER_CTX_set_passphrase_ui(OSSL_DECODER_CTX *ctx, + const UI_METHOD *ui_method, + void *ui_data); + +/* + * Utilities to read the object to decode, with the result sent to cb. + * These will discover all provided methods + */ + +int OSSL_DECODER_CTX_set_selection(OSSL_DECODER_CTX *ctx, int selection); +int OSSL_DECODER_CTX_set_input_type(OSSL_DECODER_CTX *ctx, + const char *input_type); +int OSSL_DECODER_CTX_set_input_structure(OSSL_DECODER_CTX *ctx, + const char *input_structure); +int OSSL_DECODER_CTX_add_decoder(OSSL_DECODER_CTX *ctx, OSSL_DECODER *decoder); +int OSSL_DECODER_CTX_add_extra(OSSL_DECODER_CTX *ctx, + OSSL_LIB_CTX *libctx, const char *propq); +int OSSL_DECODER_CTX_get_num_decoders(OSSL_DECODER_CTX *ctx); + +typedef struct ossl_decoder_instance_st OSSL_DECODER_INSTANCE; +OSSL_DECODER * +OSSL_DECODER_INSTANCE_get_decoder(OSSL_DECODER_INSTANCE *decoder_inst); +void * +OSSL_DECODER_INSTANCE_get_decoder_ctx(OSSL_DECODER_INSTANCE *decoder_inst); +const char * +OSSL_DECODER_INSTANCE_get_input_type(OSSL_DECODER_INSTANCE *decoder_inst); +const char * +OSSL_DECODER_INSTANCE_get_input_structure(OSSL_DECODER_INSTANCE *decoder_inst, + int *was_set); + +typedef int OSSL_DECODER_CONSTRUCT(OSSL_DECODER_INSTANCE *decoder_inst, + const OSSL_PARAM *params, + void *construct_data); +typedef void OSSL_DECODER_CLEANUP(void *construct_data); + +int OSSL_DECODER_CTX_set_construct(OSSL_DECODER_CTX *ctx, + OSSL_DECODER_CONSTRUCT *construct); +int OSSL_DECODER_CTX_set_construct_data(OSSL_DECODER_CTX *ctx, + void *construct_data); +int OSSL_DECODER_CTX_set_cleanup(OSSL_DECODER_CTX *ctx, + OSSL_DECODER_CLEANUP *cleanup); +OSSL_DECODER_CONSTRUCT *OSSL_DECODER_CTX_get_construct(OSSL_DECODER_CTX *ctx); +void *OSSL_DECODER_CTX_get_construct_data(OSSL_DECODER_CTX *ctx); +OSSL_DECODER_CLEANUP *OSSL_DECODER_CTX_get_cleanup(OSSL_DECODER_CTX *ctx); + +int OSSL_DECODER_export(OSSL_DECODER_INSTANCE *decoder_inst, + void *reference, size_t reference_sz, + OSSL_CALLBACK *export_cb, void *export_cbarg); + +int OSSL_DECODER_from_bio(OSSL_DECODER_CTX *ctx, BIO *in); +#ifndef OPENSSL_NO_STDIO +int OSSL_DECODER_from_fp(OSSL_DECODER_CTX *ctx, FILE *in); +#endif +int OSSL_DECODER_from_data(OSSL_DECODER_CTX *ctx, const unsigned char **pdata, + size_t *pdata_len); + +/* + * Create the OSSL_DECODER_CTX with an associated type. This will perform + * an implicit OSSL_DECODER_fetch(), suitable for the object of that type. + */ +OSSL_DECODER_CTX * +OSSL_DECODER_CTX_new_for_pkey(EVP_PKEY **pkey, + const char *input_type, + const char *input_struct, + const char *keytype, int selection, + OSSL_LIB_CTX *libctx, const char *propquery); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/decodererr.h b/OtherInc/openssl/include/openssl/decodererr.h new file mode 100644 index 0000000..4212a38 --- /dev/null +++ b/OtherInc/openssl/include/openssl/decodererr.h @@ -0,0 +1,28 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_DECODERERR_H +# define OPENSSL_DECODERERR_H +# pragma once + +# include +# include +# include + + + +/* + * OSSL_DECODER reason codes. + */ +# define OSSL_DECODER_R_COULD_NOT_DECODE_OBJECT 101 +# define OSSL_DECODER_R_DECODER_NOT_FOUND 102 +# define OSSL_DECODER_R_MISSING_GET_PARAMS 100 + +#endif diff --git a/OtherInc/openssl/include/openssl/des.h b/OtherInc/openssl/include/openssl/des.h new file mode 100644 index 0000000..09798a6 --- /dev/null +++ b/OtherInc/openssl/include/openssl/des.h @@ -0,0 +1,211 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_DES_H +# define OPENSSL_DES_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_DES_H +# endif + +# include + +# ifndef OPENSSL_NO_DES +# ifdef __cplusplus +extern "C" { +# endif +# include + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef unsigned int DES_LONG; + +# ifdef OPENSSL_BUILD_SHLIBCRYPTO +# undef OPENSSL_EXTERN +# define OPENSSL_EXTERN OPENSSL_EXPORT +# endif + +typedef unsigned char DES_cblock[8]; +typedef /* const */ unsigned char const_DES_cblock[8]; +/* + * With "const", gcc 2.8.1 on Solaris thinks that DES_cblock * and + * const_DES_cblock * are incompatible pointer types. + */ + +typedef struct DES_ks { + union { + DES_cblock cblock; + /* + * make sure things are correct size on machines with 8 byte longs + */ + DES_LONG deslong[2]; + } ks[16]; +} DES_key_schedule; + +# define DES_KEY_SZ (sizeof(DES_cblock)) +# define DES_SCHEDULE_SZ (sizeof(DES_key_schedule)) + +# define DES_ENCRYPT 1 +# define DES_DECRYPT 0 + +# define DES_CBC_MODE 0 +# define DES_PCBC_MODE 1 + +# define DES_ecb2_encrypt(i,o,k1,k2,e) \ + DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +# define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +# define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \ + DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e)) + +# define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \ + DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n)) + +# define DES_fixup_key_parity DES_set_odd_parity +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *DES_options(void); +OSSL_DEPRECATEDIN_3_0 +void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, int enc); +OSSL_DEPRECATEDIN_3_0 +DES_LONG DES_cbc_cksum(const unsigned char *input, DES_cblock *output, + long length, DES_key_schedule *schedule, + const_DES_cblock *ivec); +# endif +/* DES_cbc_encrypt does not update the IV! Use DES_ncbc_encrypt instead. */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +void DES_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, DES_cblock *ivec, + int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, DES_cblock *ivec, + int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_xcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, DES_cblock *ivec, + const_DES_cblock *inw, const_DES_cblock *outw, int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, DES_cblock *ivec, + int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks, int enc); +# endif + +/* + * This is the DES encryption function that gets called by just about every + * other DES routine in the library. You should not use this function except + * to implement 'modes' of DES. I say this because the functions that call + * this routine do the conversion from 'char *' to long, and this needs to be + * done to make sure 'non-aligned' memory access do not occur. The + * characters are loaded 'little endian'. Data is a pointer to 2 unsigned + * long's and ks is the DES_key_schedule to use. enc, is non zero specifies + * encryption, zero if decryption. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc); +# endif + +/* + * This functions is the same as DES_encrypt1() except that the DES initial + * permutation (IP) and final permutation (FP) have been left out. As for + * DES_encrypt1(), you should not use this function. It is used by the + * routines in the library that implement triple DES. IP() DES_encrypt2() + * DES_encrypt2() DES_encrypt2() FP() is the same as DES_encrypt1() + * DES_encrypt1() DES_encrypt1() except faster :-). + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3); +OSSL_DEPRECATEDIN_3_0 +void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3); +OSSL_DEPRECATEDIN_3_0 +void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num, int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_ede3_cfb_encrypt(const unsigned char *in, unsigned char *out, + int numbits, long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *ivec, int *num); +OSSL_DEPRECATEDIN_3_0 +char *DES_fcrypt(const char *buf, const char *salt, char *ret); +OSSL_DEPRECATEDIN_3_0 +char *DES_crypt(const char *buf, const char *salt); +OSSL_DEPRECATEDIN_3_0 +void DES_ofb_encrypt(const unsigned char *in, unsigned char *out, int numbits, + long length, DES_key_schedule *schedule, DES_cblock *ivec); +OSSL_DEPRECATEDIN_3_0 +void DES_pcbc_encrypt(const unsigned char *input, unsigned char *output, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int enc); +OSSL_DEPRECATEDIN_3_0 +DES_LONG DES_quad_cksum(const unsigned char *input, DES_cblock output[], + long length, int out_count, DES_cblock *seed); +OSSL_DEPRECATEDIN_3_0 int DES_random_key(DES_cblock *ret); +OSSL_DEPRECATEDIN_3_0 void DES_set_odd_parity(DES_cblock *key); +OSSL_DEPRECATEDIN_3_0 int DES_check_key_parity(const_DES_cblock *key); +OSSL_DEPRECATEDIN_3_0 int DES_is_weak_key(const_DES_cblock *key); +# endif +/* + * DES_set_key (= set_key = DES_key_sched = key_sched) calls + * DES_set_key_checked + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule); +OSSL_DEPRECATEDIN_3_0 +int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule); +OSSL_DEPRECATEDIN_3_0 +int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule); +OSSL_DEPRECATEDIN_3_0 +void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule); +OSSL_DEPRECATEDIN_3_0 void DES_string_to_key(const char *str, DES_cblock *key); +OSSL_DEPRECATEDIN_3_0 +void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2); +OSSL_DEPRECATEDIN_3_0 +void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num, int enc); +OSSL_DEPRECATEDIN_3_0 +void DES_ofb64_encrypt(const unsigned char *in, unsigned char *out, + long length, DES_key_schedule *schedule, + DES_cblock *ivec, int *num); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/dh.h b/OtherInc/openssl/include/openssl/dh.h new file mode 100644 index 0000000..b97871e --- /dev/null +++ b/OtherInc/openssl/include/openssl/dh.h @@ -0,0 +1,328 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_DH_H +# define OPENSSL_DH_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_DH_H +# endif + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +#include + +/* DH parameter generation types used by EVP_PKEY_CTX_set_dh_paramgen_type() */ +# define DH_PARAMGEN_TYPE_GENERATOR 0 /* Use a safe prime generator */ +# define DH_PARAMGEN_TYPE_FIPS_186_2 1 /* Use FIPS186-2 standard */ +# define DH_PARAMGEN_TYPE_FIPS_186_4 2 /* Use FIPS186-4 standard */ +# define DH_PARAMGEN_TYPE_GROUP 3 /* Use a named safe prime group */ + +int EVP_PKEY_CTX_set_dh_paramgen_type(EVP_PKEY_CTX *ctx, int typ); +int EVP_PKEY_CTX_set_dh_paramgen_gindex(EVP_PKEY_CTX *ctx, int gindex); +int EVP_PKEY_CTX_set_dh_paramgen_seed(EVP_PKEY_CTX *ctx, + const unsigned char *seed, + size_t seedlen); +int EVP_PKEY_CTX_set_dh_paramgen_prime_len(EVP_PKEY_CTX *ctx, int pbits); +int EVP_PKEY_CTX_set_dh_paramgen_subprime_len(EVP_PKEY_CTX *ctx, int qlen); +int EVP_PKEY_CTX_set_dh_paramgen_generator(EVP_PKEY_CTX *ctx, int gen); +int EVP_PKEY_CTX_set_dh_nid(EVP_PKEY_CTX *ctx, int nid); +int EVP_PKEY_CTX_set_dh_rfc5114(EVP_PKEY_CTX *ctx, int gen); +int EVP_PKEY_CTX_set_dhx_rfc5114(EVP_PKEY_CTX *ctx, int gen); +int EVP_PKEY_CTX_set_dh_pad(EVP_PKEY_CTX *ctx, int pad); + +int EVP_PKEY_CTX_set_dh_kdf_type(EVP_PKEY_CTX *ctx, int kdf); +int EVP_PKEY_CTX_get_dh_kdf_type(EVP_PKEY_CTX *ctx); +int EVP_PKEY_CTX_set0_dh_kdf_oid(EVP_PKEY_CTX *ctx, ASN1_OBJECT *oid); +int EVP_PKEY_CTX_get0_dh_kdf_oid(EVP_PKEY_CTX *ctx, ASN1_OBJECT **oid); +int EVP_PKEY_CTX_set_dh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); +int EVP_PKEY_CTX_get_dh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD **md); +int EVP_PKEY_CTX_set_dh_kdf_outlen(EVP_PKEY_CTX *ctx, int len); +int EVP_PKEY_CTX_get_dh_kdf_outlen(EVP_PKEY_CTX *ctx, int *len); +int EVP_PKEY_CTX_set0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char *ukm, int len); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_CTX_get0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char **ukm); +#endif + +# define EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DH_RFC5114 (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_DH_PARAMGEN_TYPE (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_DH_KDF_TYPE (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_DH_KDF_MD (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_DH_KDF_UKM (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 13) +# define EVP_PKEY_CTRL_GET_DH_KDF_OID (EVP_PKEY_ALG_CTRL + 14) +# define EVP_PKEY_CTRL_DH_NID (EVP_PKEY_ALG_CTRL + 15) +# define EVP_PKEY_CTRL_DH_PAD (EVP_PKEY_ALG_CTRL + 16) + +/* KDF types */ +# define EVP_PKEY_DH_KDF_NONE 1 +# define EVP_PKEY_DH_KDF_X9_42 2 + +# ifndef OPENSSL_NO_DH +# include +# include +# include +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# endif +# include + +# ifndef OPENSSL_DH_MAX_MODULUS_BITS +# define OPENSSL_DH_MAX_MODULUS_BITS 10000 +# endif + +# define OPENSSL_DH_FIPS_MIN_MODULUS_BITS 1024 + +# define DH_FLAG_CACHE_MONT_P 0x01 + +# define DH_FLAG_TYPE_MASK 0xF000 +# define DH_FLAG_TYPE_DH 0x0000 +# define DH_FLAG_TYPE_DHX 0x1000 + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* + * Does nothing. Previously this switched off constant time behaviour. + */ +# define DH_FLAG_NO_EXP_CONSTTIME 0x00 +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* + * If this flag is set the DH method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its responsibility to ensure the + * result is compliant. + */ + +# define DH_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DH_FLAG_NON_FIPS_ALLOW 0x0400 +# endif + +/* Already defined in ossl_typ.h */ +/* typedef struct dh_st DH; */ +/* typedef struct dh_method DH_METHOD; */ + +DECLARE_ASN1_ITEM(DHparams) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DH_GENERATOR_2 2 +# define DH_GENERATOR_3 3 +# define DH_GENERATOR_5 5 + +/* DH_check error codes */ +/* + * NB: These values must align with the equivalently named macros in + * internal/ffc.h. + */ +# define DH_CHECK_P_NOT_PRIME 0x01 +# define DH_CHECK_P_NOT_SAFE_PRIME 0x02 +# define DH_UNABLE_TO_CHECK_GENERATOR 0x04 +# define DH_NOT_SUITABLE_GENERATOR 0x08 +# define DH_CHECK_Q_NOT_PRIME 0x10 +# define DH_CHECK_INVALID_Q_VALUE 0x20 +# define DH_CHECK_INVALID_J_VALUE 0x40 +# define DH_MODULUS_TOO_SMALL 0x80 +# define DH_MODULUS_TOO_LARGE 0x100 + +/* DH_check_pub_key error codes */ +# define DH_CHECK_PUBKEY_TOO_SMALL 0x01 +# define DH_CHECK_PUBKEY_TOO_LARGE 0x02 +# define DH_CHECK_PUBKEY_INVALID 0x04 + +/* + * primes p where (p-1)/2 is prime too are called "safe"; we define this for + * backward compatibility: + */ +# define DH_CHECK_P_NOT_STRONG_PRIME DH_CHECK_P_NOT_SAFE_PRIME + +# define d2i_DHparams_fp(fp, x) \ + (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ + (char *(*)())d2i_DHparams, \ + (fp), \ + (unsigned char **)(x)) +# define i2d_DHparams_fp(fp, x) \ + ASN1_i2d_fp(i2d_DHparams,(fp), (unsigned char *)(x)) +# define d2i_DHparams_bio(bp, x) \ + ASN1_d2i_bio_of(DH, DH_new, d2i_DHparams, bp, x) +# define i2d_DHparams_bio(bp, x) \ + ASN1_i2d_bio_of(DH, i2d_DHparams, bp, x) + +# define d2i_DHxparams_fp(fp,x) \ + (DH *)ASN1_d2i_fp((char *(*)())DH_new, \ + (char *(*)())d2i_DHxparams, \ + (fp), \ + (unsigned char **)(x)) +# define i2d_DHxparams_fp(fp, x) \ + ASN1_i2d_fp(i2d_DHxparams,(fp), (unsigned char *)(x)) +# define d2i_DHxparams_bio(bp, x) \ + ASN1_d2i_bio_of(DH, DH_new, d2i_DHxparams, bp, x) +# define i2d_DHxparams_bio(bp, x) \ + ASN1_i2d_bio_of(DH, i2d_DHxparams, bp, x) + +DECLARE_ASN1_DUP_FUNCTION_name_attr(OSSL_DEPRECATEDIN_3_0, DH, DHparams) + +OSSL_DEPRECATEDIN_3_0 const DH_METHOD *DH_OpenSSL(void); + +OSSL_DEPRECATEDIN_3_0 void DH_set_default_method(const DH_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 const DH_METHOD *DH_get_default_method(void); +OSSL_DEPRECATEDIN_3_0 int DH_set_method(DH *dh, const DH_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 DH *DH_new_method(ENGINE *engine); + +OSSL_DEPRECATEDIN_3_0 DH *DH_new(void); +OSSL_DEPRECATEDIN_3_0 void DH_free(DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_up_ref(DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_bits(const DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_size(const DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_security_bits(const DH *dh); + +# define DH_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DH, l, p, newf, dupf, freef) + +OSSL_DEPRECATEDIN_3_0 int DH_set_ex_data(DH *d, int idx, void *arg); +OSSL_DEPRECATEDIN_3_0 void *DH_get_ex_data(const DH *d, int idx); + +OSSL_DEPRECATEDIN_3_0 int DH_generate_parameters_ex(DH *dh, int prime_len, + int generator, + BN_GENCB *cb); + +OSSL_DEPRECATEDIN_3_0 int DH_check_params_ex(const DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_check_ex(const DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_check_pub_key_ex(const DH *dh, const BIGNUM *pub_key); +OSSL_DEPRECATEDIN_3_0 int DH_check_params(const DH *dh, int *ret); +OSSL_DEPRECATEDIN_3_0 int DH_check(const DH *dh, int *codes); +OSSL_DEPRECATEDIN_3_0 int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, + int *codes); +OSSL_DEPRECATEDIN_3_0 int DH_generate_key(DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_compute_key(unsigned char *key, + const BIGNUM *pub_key, DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_compute_key_padded(unsigned char *key, + const BIGNUM *pub_key, DH *dh); + +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, DH, DHparams) +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, DH, DHxparams) + +# ifndef OPENSSL_NO_STDIO +OSSL_DEPRECATEDIN_3_0 int DHparams_print_fp(FILE *fp, const DH *x); +# endif +OSSL_DEPRECATEDIN_3_0 int DHparams_print(BIO *bp, const DH *x); + +/* RFC 5114 parameters */ +OSSL_DEPRECATEDIN_3_0 DH *DH_get_1024_160(void); +OSSL_DEPRECATEDIN_3_0 DH *DH_get_2048_224(void); +OSSL_DEPRECATEDIN_3_0 DH *DH_get_2048_256(void); + +/* Named parameters, currently RFC7919 and RFC3526 */ +OSSL_DEPRECATEDIN_3_0 DH *DH_new_by_nid(int nid); +OSSL_DEPRECATEDIN_3_0 int DH_get_nid(const DH *dh); + +/* RFC2631 KDF */ +OSSL_DEPRECATEDIN_3_0 int DH_KDF_X9_42(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + ASN1_OBJECT *key_oid, + const unsigned char *ukm, + size_t ukmlen, const EVP_MD *md); + +OSSL_DEPRECATEDIN_3_0 void DH_get0_pqg(const DH *dh, const BIGNUM **p, + const BIGNUM **q, const BIGNUM **g); +OSSL_DEPRECATEDIN_3_0 int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g); +OSSL_DEPRECATEDIN_3_0 void DH_get0_key(const DH *dh, const BIGNUM **pub_key, + const BIGNUM **priv_key); +OSSL_DEPRECATEDIN_3_0 int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DH_get0_p(const DH *dh); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DH_get0_q(const DH *dh); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DH_get0_g(const DH *dh); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DH_get0_priv_key(const DH *dh); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DH_get0_pub_key(const DH *dh); +OSSL_DEPRECATEDIN_3_0 void DH_clear_flags(DH *dh, int flags); +OSSL_DEPRECATEDIN_3_0 int DH_test_flags(const DH *dh, int flags); +OSSL_DEPRECATEDIN_3_0 void DH_set_flags(DH *dh, int flags); +OSSL_DEPRECATEDIN_3_0 ENGINE *DH_get0_engine(DH *d); +OSSL_DEPRECATEDIN_3_0 long DH_get_length(const DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_set_length(DH *dh, long length); + +OSSL_DEPRECATEDIN_3_0 DH_METHOD *DH_meth_new(const char *name, int flags); +OSSL_DEPRECATEDIN_3_0 void DH_meth_free(DH_METHOD *dhm); +OSSL_DEPRECATEDIN_3_0 DH_METHOD *DH_meth_dup(const DH_METHOD *dhm); +OSSL_DEPRECATEDIN_3_0 const char *DH_meth_get0_name(const DH_METHOD *dhm); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set1_name(DH_METHOD *dhm, const char *name); +OSSL_DEPRECATEDIN_3_0 int DH_meth_get_flags(const DH_METHOD *dhm); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set_flags(DH_METHOD *dhm, int flags); +OSSL_DEPRECATEDIN_3_0 void *DH_meth_get0_app_data(const DH_METHOD *dhm); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set0_app_data(DH_METHOD *dhm, void *app_data); +OSSL_DEPRECATEDIN_3_0 int (*DH_meth_get_generate_key(const DH_METHOD *dhm)) (DH *); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set_generate_key(DH_METHOD *dhm, + int (*generate_key) (DH *)); +OSSL_DEPRECATEDIN_3_0 int (*DH_meth_get_compute_key(const DH_METHOD *dhm)) + (unsigned char *key, + const BIGNUM *pub_key, + DH *dh); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set_compute_key(DH_METHOD *dhm, + int (*compute_key) + (unsigned char *key, + const BIGNUM *pub_key, + DH *dh)); +OSSL_DEPRECATEDIN_3_0 int (*DH_meth_get_bn_mod_exp(const DH_METHOD *dhm)) + (const DH *, BIGNUM *, + const BIGNUM *, + const BIGNUM *, + const BIGNUM *, BN_CTX *, + BN_MONT_CTX *); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set_bn_mod_exp(DH_METHOD *dhm, + int (*bn_mod_exp) + (const DH *, BIGNUM *, + const BIGNUM *, const BIGNUM *, + const BIGNUM *, BN_CTX *, + BN_MONT_CTX *)); +OSSL_DEPRECATEDIN_3_0 int (*DH_meth_get_init(const DH_METHOD *dhm))(DH *); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set_init(DH_METHOD *dhm, int (*init)(DH *)); +OSSL_DEPRECATEDIN_3_0 int (*DH_meth_get_finish(const DH_METHOD *dhm)) (DH *); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set_finish(DH_METHOD *dhm, int (*finish) (DH *)); +OSSL_DEPRECATEDIN_3_0 int (*DH_meth_get_generate_params(const DH_METHOD *dhm)) + (DH *, int, int, + BN_GENCB *); +OSSL_DEPRECATEDIN_3_0 int DH_meth_set_generate_params(DH_METHOD *dhm, + int (*generate_params) + (DH *, int, int, + BN_GENCB *)); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +# ifndef OPENSSL_NO_DEPRECATED_0_9_8 +OSSL_DEPRECATEDIN_0_9_8 DH *DH_generate_parameters(int prime_len, int generator, + void (*callback) (int, int, + void *), + void *cb_arg); +# endif + +# endif +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/dherr.h b/OtherInc/openssl/include/openssl/dherr.h new file mode 100644 index 0000000..5d2a762 --- /dev/null +++ b/OtherInc/openssl/include/openssl/dherr.h @@ -0,0 +1,57 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_DHERR_H +# define OPENSSL_DHERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_DH + + +/* + * DH reason codes. + */ +# define DH_R_BAD_FFC_PARAMETERS 127 +# define DH_R_BAD_GENERATOR 101 +# define DH_R_BN_DECODE_ERROR 109 +# define DH_R_BN_ERROR 106 +# define DH_R_CHECK_INVALID_J_VALUE 115 +# define DH_R_CHECK_INVALID_Q_VALUE 116 +# define DH_R_CHECK_PUBKEY_INVALID 122 +# define DH_R_CHECK_PUBKEY_TOO_LARGE 123 +# define DH_R_CHECK_PUBKEY_TOO_SMALL 124 +# define DH_R_CHECK_P_NOT_PRIME 117 +# define DH_R_CHECK_P_NOT_SAFE_PRIME 118 +# define DH_R_CHECK_Q_NOT_PRIME 119 +# define DH_R_DECODE_ERROR 104 +# define DH_R_INVALID_PARAMETER_NAME 110 +# define DH_R_INVALID_PARAMETER_NID 114 +# define DH_R_INVALID_PUBKEY 102 +# define DH_R_INVALID_SECRET 128 +# define DH_R_KDF_PARAMETER_ERROR 112 +# define DH_R_KEYS_NOT_SET 108 +# define DH_R_MISSING_PUBKEY 125 +# define DH_R_MODULUS_TOO_LARGE 103 +# define DH_R_MODULUS_TOO_SMALL 126 +# define DH_R_NOT_SUITABLE_GENERATOR 120 +# define DH_R_NO_PARAMETERS_SET 107 +# define DH_R_NO_PRIVATE_VALUE 100 +# define DH_R_PARAMETER_ENCODING_ERROR 105 +# define DH_R_PEER_KEY_ERROR 111 +# define DH_R_SHARED_INFO_ERROR 113 +# define DH_R_UNABLE_TO_CHECK_GENERATOR 121 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/dsa.h b/OtherInc/openssl/include/openssl/dsa.h new file mode 100644 index 0000000..5c0e4cd --- /dev/null +++ b/OtherInc/openssl/include/openssl/dsa.h @@ -0,0 +1,275 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_DSA_H +# define OPENSSL_DSA_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_DSA_H +# endif + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# include + +int EVP_PKEY_CTX_set_dsa_paramgen_bits(EVP_PKEY_CTX *ctx, int nbits); +int EVP_PKEY_CTX_set_dsa_paramgen_q_bits(EVP_PKEY_CTX *ctx, int qbits); +int EVP_PKEY_CTX_set_dsa_paramgen_md_props(EVP_PKEY_CTX *ctx, + const char *md_name, + const char *md_properties); +int EVP_PKEY_CTX_set_dsa_paramgen_gindex(EVP_PKEY_CTX *ctx, int gindex); +int EVP_PKEY_CTX_set_dsa_paramgen_type(EVP_PKEY_CTX *ctx, const char *name); +int EVP_PKEY_CTX_set_dsa_paramgen_seed(EVP_PKEY_CTX *ctx, + const unsigned char *seed, + size_t seedlen); +int EVP_PKEY_CTX_set_dsa_paramgen_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); + +# define EVP_PKEY_CTRL_DSA_PARAMGEN_BITS (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_DSA_PARAMGEN_MD (EVP_PKEY_ALG_CTRL + 3) + +# ifndef OPENSSL_NO_DSA +# include +# include +# include +# include +# include +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# endif +# include + +# ifndef OPENSSL_DSA_MAX_MODULUS_BITS +# define OPENSSL_DSA_MAX_MODULUS_BITS 10000 +# endif + +# define OPENSSL_DSA_FIPS_MIN_MODULUS_BITS 1024 + +typedef struct DSA_SIG_st DSA_SIG; +DSA_SIG *DSA_SIG_new(void); +void DSA_SIG_free(DSA_SIG *a); +DECLARE_ASN1_ENCODE_FUNCTIONS_only(DSA_SIG, DSA_SIG) +void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); +int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s); + + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* + * Does nothing. Previously this switched off constant time behaviour. + */ +# define DSA_FLAG_NO_EXP_CONSTTIME 0x00 +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DSA_FLAG_CACHE_MONT_P 0x01 + +/* + * If this flag is set the DSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its responsibility to ensure the + * result is compliant. + */ + +# define DSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define DSA_FLAG_NON_FIPS_ALLOW 0x0400 +# define DSA_FLAG_FIPS_CHECKED 0x0800 + +/* Already defined in ossl_typ.h */ +/* typedef struct dsa_st DSA; */ +/* typedef struct dsa_method DSA_METHOD; */ + +# define d2i_DSAparams_fp(fp, x) \ + (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \ + (char *(*)())d2i_DSAparams, (fp), \ + (unsigned char **)(x)) +# define i2d_DSAparams_fp(fp, x) \ + ASN1_i2d_fp(i2d_DSAparams, (fp), (unsigned char *)(x)) +# define d2i_DSAparams_bio(bp, x) \ + ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSAparams, bp, x) +# define i2d_DSAparams_bio(bp, x) \ + ASN1_i2d_bio_of(DSA, i2d_DSAparams, bp, x) + +DECLARE_ASN1_DUP_FUNCTION_name_attr(OSSL_DEPRECATEDIN_3_0, DSA, DSAparams) +OSSL_DEPRECATEDIN_3_0 DSA_SIG *DSA_do_sign(const unsigned char *dgst, int dlen, + DSA *dsa); +OSSL_DEPRECATEDIN_3_0 int DSA_do_verify(const unsigned char *dgst, int dgst_len, + DSA_SIG *sig, DSA *dsa); + +OSSL_DEPRECATEDIN_3_0 const DSA_METHOD *DSA_OpenSSL(void); + +OSSL_DEPRECATEDIN_3_0 void DSA_set_default_method(const DSA_METHOD *); +OSSL_DEPRECATEDIN_3_0 const DSA_METHOD *DSA_get_default_method(void); +OSSL_DEPRECATEDIN_3_0 int DSA_set_method(DSA *dsa, const DSA_METHOD *); +OSSL_DEPRECATEDIN_3_0 const DSA_METHOD *DSA_get_method(DSA *d); + +OSSL_DEPRECATEDIN_3_0 DSA *DSA_new(void); +OSSL_DEPRECATEDIN_3_0 DSA *DSA_new_method(ENGINE *engine); +OSSL_DEPRECATEDIN_3_0 void DSA_free(DSA *r); +/* "up" the DSA object's reference count */ +OSSL_DEPRECATEDIN_3_0 int DSA_up_ref(DSA *r); +OSSL_DEPRECATEDIN_3_0 int DSA_size(const DSA *); +OSSL_DEPRECATEDIN_3_0 int DSA_bits(const DSA *d); +OSSL_DEPRECATEDIN_3_0 int DSA_security_bits(const DSA *d); + /* next 4 return -1 on error */ +OSSL_DEPRECATEDIN_3_0 int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, + BIGNUM **kinvp, BIGNUM **rp); +OSSL_DEPRECATEDIN_3_0 int DSA_sign(int type, const unsigned char *dgst, + int dlen, unsigned char *sig, + unsigned int *siglen, DSA *dsa); +OSSL_DEPRECATEDIN_3_0 int DSA_verify(int type, const unsigned char *dgst, + int dgst_len, const unsigned char *sigbuf, + int siglen, DSA *dsa); + +# define DSA_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DSA, l, p, newf, dupf, freef) +OSSL_DEPRECATEDIN_3_0 int DSA_set_ex_data(DSA *d, int idx, void *arg); +OSSL_DEPRECATEDIN_3_0 void *DSA_get_ex_data(const DSA *d, int idx); + +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, + DSA, DSAPublicKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, + DSA, DSAPrivateKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, + DSA, DSAparams) +# endif + +# ifndef OPENSSL_NO_DEPRECATED_0_9_8 +/* Deprecated version */ +OSSL_DEPRECATEDIN_0_9_8 +DSA *DSA_generate_parameters(int bits, unsigned char *seed, int seed_len, + int *counter_ret, unsigned long *h_ret, + void (*callback) (int, int, void *), + void *cb_arg); +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* New version */ +OSSL_DEPRECATEDIN_3_0 int DSA_generate_parameters_ex(DSA *dsa, int bits, + const unsigned char *seed, + int seed_len, + int *counter_ret, + unsigned long *h_ret, + BN_GENCB *cb); + +OSSL_DEPRECATEDIN_3_0 int DSA_generate_key(DSA *a); + +OSSL_DEPRECATEDIN_3_0 int DSAparams_print(BIO *bp, const DSA *x); +OSSL_DEPRECATEDIN_3_0 int DSA_print(BIO *bp, const DSA *x, int off); +# ifndef OPENSSL_NO_STDIO +OSSL_DEPRECATEDIN_3_0 int DSAparams_print_fp(FILE *fp, const DSA *x); +OSSL_DEPRECATEDIN_3_0 int DSA_print_fp(FILE *bp, const DSA *x, int off); +# endif + +# define DSS_prime_checks 64 +/* + * Primality test according to FIPS PUB 186-4, Appendix C.3. Since we only + * have one value here we set the number of checks to 64 which is the 128 bit + * security level that is the highest level and valid for creating a 3072 bit + * DSA key. + */ +# define DSA_is_prime(n, callback, cb_arg) \ + BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) + +# ifndef OPENSSL_NO_DH +/* + * Convert DSA structure (key or just parameters) into DH structure (be + * careful to avoid small subgroup attacks when using this!) + */ +OSSL_DEPRECATEDIN_3_0 DH *DSA_dup_DH(const DSA *r); +# endif + +OSSL_DEPRECATEDIN_3_0 void DSA_get0_pqg(const DSA *d, const BIGNUM **p, + const BIGNUM **q, const BIGNUM **g); +OSSL_DEPRECATEDIN_3_0 int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g); +OSSL_DEPRECATEDIN_3_0 void DSA_get0_key(const DSA *d, const BIGNUM **pub_key, + const BIGNUM **priv_key); +OSSL_DEPRECATEDIN_3_0 int DSA_set0_key(DSA *d, BIGNUM *pub_key, + BIGNUM *priv_key); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DSA_get0_p(const DSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DSA_get0_q(const DSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DSA_get0_g(const DSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DSA_get0_pub_key(const DSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *DSA_get0_priv_key(const DSA *d); +OSSL_DEPRECATEDIN_3_0 void DSA_clear_flags(DSA *d, int flags); +OSSL_DEPRECATEDIN_3_0 int DSA_test_flags(const DSA *d, int flags); +OSSL_DEPRECATEDIN_3_0 void DSA_set_flags(DSA *d, int flags); +OSSL_DEPRECATEDIN_3_0 ENGINE *DSA_get0_engine(DSA *d); + +OSSL_DEPRECATEDIN_3_0 DSA_METHOD *DSA_meth_new(const char *name, int flags); +OSSL_DEPRECATEDIN_3_0 void DSA_meth_free(DSA_METHOD *dsam); +OSSL_DEPRECATEDIN_3_0 DSA_METHOD *DSA_meth_dup(const DSA_METHOD *dsam); +OSSL_DEPRECATEDIN_3_0 const char *DSA_meth_get0_name(const DSA_METHOD *dsam); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set1_name(DSA_METHOD *dsam, + const char *name); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_get_flags(const DSA_METHOD *dsam); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_flags(DSA_METHOD *dsam, int flags); +OSSL_DEPRECATEDIN_3_0 void *DSA_meth_get0_app_data(const DSA_METHOD *dsam); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set0_app_data(DSA_METHOD *dsam, + void *app_data); +OSSL_DEPRECATEDIN_3_0 DSA_SIG *(*DSA_meth_get_sign(const DSA_METHOD *dsam)) + (const unsigned char *, int, DSA *); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_sign(DSA_METHOD *dsam, + DSA_SIG *(*sign) (const unsigned char *, int, DSA *)); +OSSL_DEPRECATEDIN_3_0 int (*DSA_meth_get_sign_setup(const DSA_METHOD *dsam)) + (DSA *, BN_CTX *, BIGNUM **, BIGNUM **); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_sign_setup(DSA_METHOD *dsam, + int (*sign_setup) (DSA *, BN_CTX *, BIGNUM **, BIGNUM **)); +OSSL_DEPRECATEDIN_3_0 int (*DSA_meth_get_verify(const DSA_METHOD *dsam)) + (const unsigned char *, int, DSA_SIG *, DSA *); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_verify(DSA_METHOD *dsam, + int (*verify) (const unsigned char *, int, DSA_SIG *, DSA *)); +OSSL_DEPRECATEDIN_3_0 int (*DSA_meth_get_mod_exp(const DSA_METHOD *dsam)) + (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + const BIGNUM *, const BIGNUM *, BN_CTX *, BN_MONT_CTX *); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_mod_exp(DSA_METHOD *dsam, + int (*mod_exp) (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, + const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *, + BN_MONT_CTX *)); +OSSL_DEPRECATEDIN_3_0 int (*DSA_meth_get_bn_mod_exp(const DSA_METHOD *dsam)) + (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, + BN_CTX *, BN_MONT_CTX *); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_bn_mod_exp(DSA_METHOD *dsam, + int (*bn_mod_exp) (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, + const BIGNUM *, BN_CTX *, BN_MONT_CTX *)); +OSSL_DEPRECATEDIN_3_0 int (*DSA_meth_get_init(const DSA_METHOD *dsam))(DSA *); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_init(DSA_METHOD *dsam, + int (*init)(DSA *)); +OSSL_DEPRECATEDIN_3_0 int (*DSA_meth_get_finish(const DSA_METHOD *dsam))(DSA *); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_finish(DSA_METHOD *dsam, + int (*finish)(DSA *)); +OSSL_DEPRECATEDIN_3_0 int (*DSA_meth_get_paramgen(const DSA_METHOD *dsam)) + (DSA *, int, const unsigned char *, int, int *, unsigned long *, + BN_GENCB *); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_paramgen(DSA_METHOD *dsam, + int (*paramgen) (DSA *, int, const unsigned char *, int, int *, + unsigned long *, BN_GENCB *)); +OSSL_DEPRECATEDIN_3_0 int (*DSA_meth_get_keygen(const DSA_METHOD *dsam))(DSA *); +OSSL_DEPRECATEDIN_3_0 int DSA_meth_set_keygen(DSA_METHOD *dsam, + int (*keygen) (DSA *)); + +# endif +# endif +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/dsaerr.h b/OtherInc/openssl/include/openssl/dsaerr.h new file mode 100644 index 0000000..5f0ca8d --- /dev/null +++ b/OtherInc/openssl/include/openssl/dsaerr.h @@ -0,0 +1,43 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_DSAERR_H +# define OPENSSL_DSAERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_DSA + + +/* + * DSA reason codes. + */ +# define DSA_R_BAD_FFC_PARAMETERS 114 +# define DSA_R_BAD_Q_VALUE 102 +# define DSA_R_BN_DECODE_ERROR 108 +# define DSA_R_BN_ERROR 109 +# define DSA_R_DECODE_ERROR 104 +# define DSA_R_INVALID_DIGEST_TYPE 106 +# define DSA_R_INVALID_PARAMETERS 112 +# define DSA_R_MISSING_PARAMETERS 101 +# define DSA_R_MISSING_PRIVATE_KEY 111 +# define DSA_R_MODULUS_TOO_LARGE 103 +# define DSA_R_NO_PARAMETERS_SET 107 +# define DSA_R_PARAMETER_ENCODING_ERROR 105 +# define DSA_R_P_NOT_PRIME 115 +# define DSA_R_Q_NOT_PRIME 113 +# define DSA_R_SEED_LEN_SMALL 110 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/dtls1.h b/OtherInc/openssl/include/openssl/dtls1.h new file mode 100644 index 0000000..5dc6b54 --- /dev/null +++ b/OtherInc/openssl/include/openssl/dtls1.h @@ -0,0 +1,57 @@ +/* + * Copyright 2005-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_DTLS1_H +# define OPENSSL_DTLS1_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_DTLS1_H +# endif + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* DTLS*_VERSION constants are defined in prov_ssl.h */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DTLS_MIN_VERSION DTLS1_VERSION +# define DTLS_MAX_VERSION DTLS1_2_VERSION +# endif +# define DTLS1_VERSION_MAJOR 0xFE + +/* Special value for method supporting multiple versions */ +# define DTLS_ANY_VERSION 0x1FFFF + +/* lengths of messages */ + +# define DTLS1_COOKIE_LENGTH 255 + +# define DTLS1_RT_HEADER_LENGTH 13 + +# define DTLS1_HM_HEADER_LENGTH 12 + +# define DTLS1_HM_BAD_FRAGMENT -2 +# define DTLS1_HM_FRAGMENT_RETRY -3 + +# define DTLS1_CCS_HEADER_LENGTH 1 + +# define DTLS1_AL_HEADER_LENGTH 2 + +# define DTLS1_TMO_ALERT_COUNT 12 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/e_os2.h b/OtherInc/openssl/include/openssl/e_os2.h new file mode 100644 index 0000000..6728909 --- /dev/null +++ b/OtherInc/openssl/include/openssl/e_os2.h @@ -0,0 +1,305 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_E_OS2_H +# define OPENSSL_E_OS2_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_E_OS2_H +# endif + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Detect operating systems. This probably needs completing. + * The result is that at least one OPENSSL_SYS_os macro should be defined. + * However, if none is defined, Unix is assumed. + **/ + +# define OPENSSL_SYS_UNIX + +/* --------------------- Microsoft operating systems ---------------------- */ + +/* + * Note that MSDOS actually denotes 32-bit environments running on top of + * MS-DOS, such as DJGPP one. + */ +# if defined(OPENSSL_SYS_MSDOS) +# undef OPENSSL_SYS_UNIX +# endif + +/* + * For 32 bit environment, there seems to be the CygWin environment and then + * all the others that try to do the same thing Microsoft does... + */ +/* + * UEFI lives here because it might be built with a Microsoft toolchain and + * we need to avoid the false positive match on Windows. + */ +# if defined(OPENSSL_SYS_UEFI) +# undef OPENSSL_SYS_UNIX +# elif defined(OPENSSL_SYS_UWIN) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WIN32_UWIN +# else +# if defined(__CYGWIN__) || defined(OPENSSL_SYS_CYGWIN) +# define OPENSSL_SYS_WIN32_CYGWIN +# else +# if defined(_WIN32) || defined(OPENSSL_SYS_WIN32) +# undef OPENSSL_SYS_UNIX +# if !defined(OPENSSL_SYS_WIN32) +# define OPENSSL_SYS_WIN32 +# endif +# endif +# if defined(_WIN64) || defined(OPENSSL_SYS_WIN64) +# undef OPENSSL_SYS_UNIX +# if !defined(OPENSSL_SYS_WIN64) +# define OPENSSL_SYS_WIN64 +# endif +# endif +# if defined(OPENSSL_SYS_WINNT) +# undef OPENSSL_SYS_UNIX +# endif +# if defined(OPENSSL_SYS_WINCE) +# undef OPENSSL_SYS_UNIX +# endif +# endif +# endif + +/* Anything that tries to look like Microsoft is "Windows" */ +# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN64) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_SYS_MSDOS +# define OPENSSL_SYS_MSDOS +# endif +# endif + +/* + * DLL settings. This part is a bit tough, because it's up to the + * application implementor how he or she will link the application, so it + * requires some macro to be used. + */ +# ifdef OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_OPT_WINDLL +# if defined(_WINDLL) /* This is used when building OpenSSL to + * indicate that DLL linkage should be used */ +# define OPENSSL_OPT_WINDLL +# endif +# endif +# endif + +/* ------------------------------- OpenVMS -------------------------------- */ +# if defined(__VMS) || defined(VMS) +# if !defined(OPENSSL_SYS_VMS) +# undef OPENSSL_SYS_UNIX +# define OPENSSL_SYS_VMS +# endif +# if defined(__DECC) +# define OPENSSL_SYS_VMS_DECC +# elif defined(__DECCXX) +# define OPENSSL_SYS_VMS_DECC +# define OPENSSL_SYS_VMS_DECCXX +# else +# define OPENSSL_SYS_VMS_NODECC +# endif +# endif + +/* -------------------------------- Unix ---------------------------------- */ +# ifdef OPENSSL_SYS_UNIX +# if defined(linux) || defined(__linux__) && !defined(OPENSSL_SYS_LINUX) +# define OPENSSL_SYS_LINUX +# endif +# if defined(_AIX) && !defined(OPENSSL_SYS_AIX) +# define OPENSSL_SYS_AIX +# endif +# endif + +/* -------------------------------- VOS ----------------------------------- */ +# if defined(__VOS__) && !defined(OPENSSL_SYS_VOS) +# define OPENSSL_SYS_VOS +# ifdef __HPPA__ +# define OPENSSL_SYS_VOS_HPPA +# endif +# ifdef __IA32__ +# define OPENSSL_SYS_VOS_IA32 +# endif +# endif + +/* ---------------------------- HP NonStop -------------------------------- */ +# ifdef __TANDEM +# ifdef _STRING +# include +# endif +# define OPENSSL_USE_BUILD_DATE +# if defined(OPENSSL_THREADS) && defined(_SPT_MODEL_) +# define SPT_THREAD_SIGNAL 1 +# define SPT_THREAD_AWARE 1 +# include +# elif defined(OPENSSL_THREADS) && defined(_PUT_MODEL_) +# include +# endif +# endif + +/** + * That's it for OS-specific stuff + *****************************************************************************/ + +/*- + * OPENSSL_EXTERN is normally used to declare a symbol with possible extra + * attributes to handle its presence in a shared library. + * OPENSSL_EXPORT is used to define a symbol with extra possible attributes + * to make it visible in a shared library. + * Care needs to be taken when a header file is used both to declare and + * define symbols. Basically, for any library that exports some global + * variables, the following code must be present in the header file that + * declares them, before OPENSSL_EXTERN is used: + * + * #ifdef SOME_BUILD_FLAG_MACRO + * # undef OPENSSL_EXTERN + * # define OPENSSL_EXTERN OPENSSL_EXPORT + * #endif + * + * The default is to have OPENSSL_EXPORT and OPENSSL_EXTERN + * have some generally sensible values. + */ + +# if defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) +# define OPENSSL_EXPORT extern __declspec(dllexport) +# define OPENSSL_EXTERN extern __declspec(dllimport) +# else +# define OPENSSL_EXPORT extern +# define OPENSSL_EXTERN extern +# endif + +# ifdef _WIN32 +# ifdef _WIN64 +# define ossl_ssize_t __int64 +# define OSSL_SSIZE_MAX _I64_MAX +# else +# define ossl_ssize_t int +# define OSSL_SSIZE_MAX INT_MAX +# endif +# endif + +# if defined(OPENSSL_SYS_UEFI) && !defined(ossl_ssize_t) +# define ossl_ssize_t INTN +# define OSSL_SSIZE_MAX MAX_INTN +# endif + +# ifndef ossl_ssize_t +# define ossl_ssize_t ssize_t +# if defined(SSIZE_MAX) +# define OSSL_SSIZE_MAX SSIZE_MAX +# elif defined(_POSIX_SSIZE_MAX) +# define OSSL_SSIZE_MAX _POSIX_SSIZE_MAX +# else +# define OSSL_SSIZE_MAX ((ssize_t)(SIZE_MAX>>1)) +# endif +# endif + +# if defined(UNUSEDRESULT_DEBUG) +# define __owur __attribute__((__warn_unused_result__)) +# else +# define __owur +# endif + +/* Standard integer types */ +# define OPENSSL_NO_INTTYPES_H +# define OPENSSL_NO_STDINT_H +# if defined(OPENSSL_SYS_UEFI) +typedef INT8 int8_t; +typedef UINT8 uint8_t; +typedef INT16 int16_t; +typedef UINT16 uint16_t; +typedef INT32 int32_t; +typedef UINT32 uint32_t; +typedef INT64 int64_t; +typedef UINT64 uint64_t; +# elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ + defined(__osf__) || defined(__sgi) || defined(__hpux) || \ + defined(OPENSSL_SYS_VMS) || defined (__OpenBSD__) +# include +# undef OPENSSL_NO_INTTYPES_H +/* Because the specs say that inttypes.h includes stdint.h if present */ +# undef OPENSSL_NO_STDINT_H +# elif defined(_MSC_VER) && _MSC_VER<1600 +/* + * minimally required typdefs for systems not supporting inttypes.h or + * stdint.h: currently just older VC++ + */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +# else +# include +# undef OPENSSL_NO_STDINT_H +# endif +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && \ + defined(INTMAX_MAX) && defined(UINTMAX_MAX) +typedef intmax_t ossl_intmax_t; +typedef uintmax_t ossl_uintmax_t; +# else +/* Fall back to the largest we know we require and can handle */ +typedef int64_t ossl_intmax_t; +typedef uint64_t ossl_uintmax_t; +# endif + +/* ossl_inline: portable inline definition usable in public headers */ +# if !defined(inline) && !defined(__cplusplus) +# if defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L + /* just use inline */ +# define ossl_inline inline +# elif defined(__GNUC__) && __GNUC__>=2 +# define ossl_inline __inline__ +# elif defined(_MSC_VER) + /* + * Visual Studio: inline is available in C++ only, however + * __inline is available for C, see + * http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx + */ +# define ossl_inline __inline +# else +# define ossl_inline +# endif +# else +# define ossl_inline inline +# endif + +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && \ + !defined(__cplusplus) +# define ossl_noreturn _Noreturn +# elif defined(__GNUC__) && __GNUC__ >= 2 +# define ossl_noreturn __attribute__((noreturn)) +# else +# define ossl_noreturn +# endif + +/* ossl_unused: portable unused attribute for use in public headers */ +# if defined(__GNUC__) +# define ossl_unused __attribute__((unused)) +# else +# define ossl_unused +# endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/ebcdic.h b/OtherInc/openssl/include/openssl/ebcdic.h new file mode 100644 index 0000000..e0ae1aa --- /dev/null +++ b/OtherInc/openssl/include/openssl/ebcdic.h @@ -0,0 +1,39 @@ +/* + * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_EBCDIC_H +# define OPENSSL_EBCDIC_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_EBCDIC_H +# endif + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Avoid name clashes with other applications */ +# define os_toascii _openssl_os_toascii +# define os_toebcdic _openssl_os_toebcdic +# define ebcdic2ascii _openssl_ebcdic2ascii +# define ascii2ebcdic _openssl_ascii2ebcdic + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void *ebcdic2ascii(void *dest, const void *srce, size_t count); +void *ascii2ebcdic(void *dest, const void *srce, size_t count); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/ec.h b/OtherInc/openssl/include/openssl/ec.h new file mode 100644 index 0000000..44d7193 --- /dev/null +++ b/OtherInc/openssl/include/openssl/ec.h @@ -0,0 +1,1569 @@ +/* + * Copyright 2002-2022 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_EC_H +# define OPENSSL_EC_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_EC_H +# endif + +# include +# include + +# include + +# ifdef __cplusplus +extern "C" { +# endif + +/* Values for EVP_PKEY_CTX_set_ec_param_enc() */ +# define OPENSSL_EC_EXPLICIT_CURVE 0x000 +# define OPENSSL_EC_NAMED_CURVE 0x001 + +int EVP_PKEY_CTX_set_ec_paramgen_curve_nid(EVP_PKEY_CTX *ctx, int nid); +int EVP_PKEY_CTX_set_ec_param_enc(EVP_PKEY_CTX *ctx, int param_enc); +int EVP_PKEY_CTX_set_ecdh_cofactor_mode(EVP_PKEY_CTX *ctx, int cofactor_mode); +int EVP_PKEY_CTX_get_ecdh_cofactor_mode(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_set_ecdh_kdf_type(EVP_PKEY_CTX *ctx, int kdf); +int EVP_PKEY_CTX_get_ecdh_kdf_type(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_set_ecdh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); +int EVP_PKEY_CTX_get_ecdh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD **md); + +int EVP_PKEY_CTX_set_ecdh_kdf_outlen(EVP_PKEY_CTX *ctx, int len); +int EVP_PKEY_CTX_get_ecdh_kdf_outlen(EVP_PKEY_CTX *ctx, int *len); + +int EVP_PKEY_CTX_set0_ecdh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char *ukm, + int len); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_CTX_get0_ecdh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char **ukm); +# endif + +# define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_EC_PARAM_ENC (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_EC_ECDH_COFACTOR (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_EC_KDF_TYPE (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_GET_EC_KDF_MD (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_EC_KDF_OUTLEN (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_GET_EC_KDF_UKM (EVP_PKEY_ALG_CTRL + 10) + +/* KDF types */ +# define EVP_PKEY_ECDH_KDF_NONE 1 +# define EVP_PKEY_ECDH_KDF_X9_63 2 +/* + * The old name for EVP_PKEY_ECDH_KDF_X9_63 + * The ECDH KDF specification has been mistakenly attributed to ANSI X9.62, + * it is actually specified in ANSI X9.63. + * This identifier is retained for backwards compatibility + */ +# define EVP_PKEY_ECDH_KDF_X9_62 EVP_PKEY_ECDH_KDF_X9_63 + +/** Enum for the point conversion form as defined in X9.62 (ECDSA) + * for the encoding of a elliptic curve point (x,y) */ +typedef enum { + /** the point is encoded as z||x, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_COMPRESSED = 2, + /** the point is encoded as z||x||y, where z is the octet 0x04 */ + POINT_CONVERSION_UNCOMPRESSED = 4, + /** the point is encoded as z||x||y, where the octet z specifies + * which solution of the quadratic equation y is */ + POINT_CONVERSION_HYBRID = 6 +} point_conversion_form_t; + +const char *OSSL_EC_curve_nid2name(int nid); + +# ifndef OPENSSL_NO_EC +# include +# include +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# endif +# include + +# ifndef OPENSSL_ECC_MAX_FIELD_BITS +# define OPENSSL_ECC_MAX_FIELD_BITS 661 +# endif + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef struct ec_method_st EC_METHOD; +# endif +typedef struct ec_group_st EC_GROUP; +typedef struct ec_point_st EC_POINT; +typedef struct ecpk_parameters_st ECPKPARAMETERS; +typedef struct ec_parameters_st ECPARAMETERS; + +/********************************************************************/ +/* EC_METHODs for curves over GF(p) */ +/********************************************************************/ + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/** Returns the basic GFp ec methods which provides the basis for the + * optimized methods. + * \return EC_METHOD object + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_GFp_simple_method(void); + +/** Returns GFp methods using montgomery multiplication. + * \return EC_METHOD object + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_GFp_mont_method(void); + +/** Returns GFp methods using optimized methods for NIST recommended curves + * \return EC_METHOD object + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_GFp_nist_method(void); + +# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +/** Returns 64-bit optimized methods for nistp224 + * \return EC_METHOD object + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_GFp_nistp224_method(void); + +/** Returns 64-bit optimized methods for nistp256 + * \return EC_METHOD object + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_GFp_nistp256_method(void); + +/** Returns 64-bit optimized methods for nistp521 + * \return EC_METHOD object + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_GFp_nistp521_method(void); +# endif /* OPENSSL_NO_EC_NISTP_64_GCC_128 */ + +# ifndef OPENSSL_NO_EC2M +/********************************************************************/ +/* EC_METHOD for curves over GF(2^m) */ +/********************************************************************/ + +/** Returns the basic GF2m ec method + * \return EC_METHOD object + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_GF2m_simple_method(void); + +# endif + +/********************************************************************/ +/* EC_GROUP functions */ +/********************************************************************/ + +/** + * Creates a new EC_GROUP object + * \param meth EC_METHOD to use + * \return newly created EC_GROUP object or NULL in case of an error. + */ +OSSL_DEPRECATEDIN_3_0 EC_GROUP *EC_GROUP_new(const EC_METHOD *meth); + +/** Clears and frees a EC_GROUP object + * \param group EC_GROUP object to be cleared and freed. + */ +OSSL_DEPRECATEDIN_3_0 void EC_GROUP_clear_free(EC_GROUP *group); + +/** Returns the EC_METHOD of the EC_GROUP object. + * \param group EC_GROUP object + * \return EC_METHOD used in this EC_GROUP object. + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *group); + +/** Returns the field type of the EC_METHOD. + * \param meth EC_METHOD object + * \return NID of the underlying field type OID. + */ +OSSL_DEPRECATEDIN_3_0 int EC_METHOD_get_field_type(const EC_METHOD *meth); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/** Frees a EC_GROUP object + * \param group EC_GROUP object to be freed. + */ +void EC_GROUP_free(EC_GROUP *group); + +/** Copies EC_GROUP objects. Note: both EC_GROUPs must use the same EC_METHOD. + * \param dst destination EC_GROUP object + * \param src source EC_GROUP object + * \return 1 on success and 0 if an error occurred. + */ +int EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src); + +/** Creates a new EC_GROUP object and copies the content + * form src to the newly created EC_KEY object + * \param src source EC_GROUP object + * \return newly created EC_GROUP object or NULL in case of an error. + */ +EC_GROUP *EC_GROUP_dup(const EC_GROUP *src); + +/** Sets the generator and its order/cofactor of a EC_GROUP object. + * \param group EC_GROUP object + * \param generator EC_POINT object with the generator. + * \param order the order of the group generated by the generator. + * \param cofactor the index of the sub-group generated by the generator + * in the group of all points on the elliptic curve. + * \return 1 on success and 0 if an error occurred + */ +int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, + const BIGNUM *order, const BIGNUM *cofactor); + +/** Returns the generator of a EC_GROUP object. + * \param group EC_GROUP object + * \return the currently used generator (possibly NULL). + */ +const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group); + +/** Returns the montgomery data for order(Generator) + * \param group EC_GROUP object + * \return the currently used montgomery data (possibly NULL). +*/ +BN_MONT_CTX *EC_GROUP_get_mont_data(const EC_GROUP *group); + +/** Gets the order of a EC_GROUP + * \param group EC_GROUP object + * \param order BIGNUM to which the order is copied + * \param ctx unused + * \return 1 on success and 0 if an error occurred + */ +int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx); + +/** Gets the order of an EC_GROUP + * \param group EC_GROUP object + * \return the group order + */ +const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group); + +/** Gets the number of bits of the order of an EC_GROUP + * \param group EC_GROUP object + * \return number of bits of group order. + */ +int EC_GROUP_order_bits(const EC_GROUP *group); + +/** Gets the cofactor of a EC_GROUP + * \param group EC_GROUP object + * \param cofactor BIGNUM to which the cofactor is copied + * \param ctx unused + * \return 1 on success and 0 if an error occurred + */ +int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, + BN_CTX *ctx); + +/** Gets the cofactor of an EC_GROUP + * \param group EC_GROUP object + * \return the group cofactor + */ +const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group); + +/** Sets the name of a EC_GROUP object + * \param group EC_GROUP object + * \param nid NID of the curve name OID + */ +void EC_GROUP_set_curve_name(EC_GROUP *group, int nid); + +/** Returns the curve name of a EC_GROUP object + * \param group EC_GROUP object + * \return NID of the curve name OID or 0 if not set. + */ +int EC_GROUP_get_curve_name(const EC_GROUP *group); + +/** Gets the field of an EC_GROUP + * \param group EC_GROUP object + * \return the group field + */ +const BIGNUM *EC_GROUP_get0_field(const EC_GROUP *group); + +/** Returns the field type of the EC_GROUP. + * \param group EC_GROUP object + * \return NID of the underlying field type OID. + */ +int EC_GROUP_get_field_type(const EC_GROUP *group); + +void EC_GROUP_set_asn1_flag(EC_GROUP *group, int flag); +int EC_GROUP_get_asn1_flag(const EC_GROUP *group); + +void EC_GROUP_set_point_conversion_form(EC_GROUP *group, + point_conversion_form_t form); +point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *); + +unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x); +size_t EC_GROUP_get_seed_len(const EC_GROUP *); +size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len); + +/** Sets the parameters of an ec curve defined by y^2 = x^3 + a*x + b (for GFp) + * or y^2 + x*y = x^3 + a*x^2 + b (for GF2m) + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_GROUP_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); + +/** Gets the parameters of the ec curve defined by y^2 = x^3 + a*x + b (for GFp) + * or y^2 + x*y = x^3 + a*x^2 + b (for GF2m) + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, + BN_CTX *ctx); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/** Sets the parameters of an ec curve. Synonym for EC_GROUP_set_curve + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_GROUP_set_curve_GFp(EC_GROUP *group, + const BIGNUM *p, + const BIGNUM *a, + const BIGNUM *b, + BN_CTX *ctx); + +/** Gets the parameters of an ec curve. Synonym for EC_GROUP_get_curve + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_GROUP_get_curve_GFp(const EC_GROUP *group, + BIGNUM *p, + BIGNUM *a, BIGNUM *b, + BN_CTX *ctx); + +# ifndef OPENSSL_NO_EC2M +/** Sets the parameter of an ec curve. Synonym for EC_GROUP_set_curve + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \param a BIGNUM with parameter a of the equation + * \param b BIGNUM with parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_GROUP_set_curve_GF2m(EC_GROUP *group, + const BIGNUM *p, + const BIGNUM *a, + const BIGNUM *b, + BN_CTX *ctx); + +/** Gets the parameters of an ec curve. Synonym for EC_GROUP_get_curve + * \param group EC_GROUP object + * \param p BIGNUM with the prime number (GFp) or the polynomial + * defining the underlying field (GF2m) + * \param a BIGNUM for parameter a of the equation + * \param b BIGNUM for parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, + BIGNUM *p, + BIGNUM *a, BIGNUM *b, + BN_CTX *ctx); +# endif /* OPENSSL_NO_EC2M */ +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/** Returns the number of bits needed to represent a field element + * \param group EC_GROUP object + * \return number of bits needed to represent a field element + */ +int EC_GROUP_get_degree(const EC_GROUP *group); + +/** Checks whether the parameter in the EC_GROUP define a valid ec group + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if group is a valid ec group and 0 otherwise + */ +int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx); + +/** Checks whether the discriminant of the elliptic curve is zero or not + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 if the discriminant is not zero and 0 otherwise + */ +int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx); + +/** Compares two EC_GROUP objects + * \param a first EC_GROUP object + * \param b second EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 0 if the groups are equal, 1 if not, or -1 on error + */ +int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx); + +/* + * EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*() after + * choosing an appropriate EC_METHOD + */ + +/** Creates a new EC_GROUP object with the specified parameters defined + * over GFp (defined by the equation y^2 = x^3 + a*x + b) + * \param p BIGNUM with the prime number + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Creates a new EC_GROUP object with the specified parameters defined + * over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b) + * \param p BIGNUM with the polynomial defining the underlying field + * \param a BIGNUM with the parameter a of the equation + * \param b BIGNUM with the parameter b of the equation + * \param ctx BN_CTX object (optional) + * \return newly created EC_GROUP object with the specified parameters + */ +EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx); +# endif + +/** + * Creates a EC_GROUP object with a curve specified by parameters. + * The parameters may be explicit or a named curve, + * \param params A list of parameters describing the group. + * \param libctx The associated library context or NULL for the default + * context + * \param propq A property query string + * \return newly created EC_GROUP object with specified parameters or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_from_params(const OSSL_PARAM params[], + OSSL_LIB_CTX *libctx, const char *propq); + +/** + * Creates a EC_GROUP object with a curve specified by a NID + * \param libctx The associated library context or NULL for the default + * context + * \param propq A property query string + * \param nid NID of the OID of the curve name + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_by_curve_name_ex(OSSL_LIB_CTX *libctx, const char *propq, + int nid); + +/** + * Creates a EC_GROUP object with a curve specified by a NID. Same as + * EC_GROUP_new_by_curve_name_ex but the libctx and propq are always + * NULL. + * \param nid NID of the OID of the curve name + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_by_curve_name(int nid); + +/** Creates a new EC_GROUP object from an ECPARAMETERS object + * \param params pointer to the ECPARAMETERS object + * \return newly created EC_GROUP object with specified curve or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_from_ecparameters(const ECPARAMETERS *params); + +/** Creates an ECPARAMETERS object for the given EC_GROUP object. + * \param group pointer to the EC_GROUP object + * \param params pointer to an existing ECPARAMETERS object or NULL + * \return pointer to the new ECPARAMETERS object or NULL + * if an error occurred. + */ +ECPARAMETERS *EC_GROUP_get_ecparameters(const EC_GROUP *group, + ECPARAMETERS *params); + +/** Creates a new EC_GROUP object from an ECPKPARAMETERS object + * \param params pointer to an existing ECPKPARAMETERS object, or NULL + * \return newly created EC_GROUP object with specified curve, or NULL + * if an error occurred + */ +EC_GROUP *EC_GROUP_new_from_ecpkparameters(const ECPKPARAMETERS *params); + +/** Creates an ECPKPARAMETERS object for the given EC_GROUP object. + * \param group pointer to the EC_GROUP object + * \param params pointer to an existing ECPKPARAMETERS object or NULL + * \return pointer to the new ECPKPARAMETERS object or NULL + * if an error occurred. + */ +ECPKPARAMETERS *EC_GROUP_get_ecpkparameters(const EC_GROUP *group, + ECPKPARAMETERS *params); + +/********************************************************************/ +/* handling of internal curves */ +/********************************************************************/ + +typedef struct { + int nid; + const char *comment; +} EC_builtin_curve; + +/* + * EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number of all + * available curves or zero if a error occurred. In case r is not zero, + * nitems EC_builtin_curve structures are filled with the data of the first + * nitems internal groups + */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); + +const char *EC_curve_nid2nist(int nid); +int EC_curve_nist2nid(const char *name); +int EC_GROUP_check_named_curve(const EC_GROUP *group, int nist_only, + BN_CTX *ctx); + +/********************************************************************/ +/* EC_POINT functions */ +/********************************************************************/ + +/** Creates a new EC_POINT object for the specified EC_GROUP + * \param group EC_GROUP the underlying EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_new(const EC_GROUP *group); + +/** Frees a EC_POINT object + * \param point EC_POINT object to be freed + */ +void EC_POINT_free(EC_POINT *point); + +/** Clears and frees a EC_POINT object + * \param point EC_POINT object to be cleared and freed + */ +void EC_POINT_clear_free(EC_POINT *point); + +/** Copies EC_POINT object + * \param dst destination EC_POINT object + * \param src source EC_POINT object + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_copy(EC_POINT *dst, const EC_POINT *src); + +/** Creates a new EC_POINT object and copies the content of the supplied + * EC_POINT + * \param src source EC_POINT object + * \param group underlying the EC_GROUP object + * \return newly created EC_POINT object or NULL if an error occurred + */ +EC_POINT *EC_POINT_dup(const EC_POINT *src, const EC_GROUP *group); + +/** Sets a point to infinity (neutral element) + * \param group underlying EC_GROUP object + * \param point EC_POINT to set to infinity + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/** Returns the EC_METHOD used in EC_POINT object + * \param point EC_POINT object + * \return the EC_METHOD used + */ +OSSL_DEPRECATEDIN_3_0 const EC_METHOD *EC_POINT_method_of(const EC_POINT *point); + +/** Sets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param z BIGNUM with the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINT_set_Jprojective_coordinates_GFp + (const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, + BN_CTX *ctx); + +/** Gets the jacobian projective coordinates of a EC_POINT over GFp + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param z BIGNUM for the z-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINT_get_Jprojective_coordinates_GFp + (const EC_GROUP *group, const EC_POINT *p, + BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/** Sets the affine coordinates of an EC_POINT + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, + BN_CTX *ctx); + +/** Gets the affine coordinates of an EC_POINT. + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *p, + BIGNUM *x, BIGNUM *y, BN_CTX *ctx); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/** Sets the affine coordinates of an EC_POINT. A synonym of + * EC_POINT_set_affine_coordinates + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINT_set_affine_coordinates_GFp + (const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx); + +/** Gets the affine coordinates of an EC_POINT. A synonym of + * EC_POINT_get_affine_coordinates + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINT_get_affine_coordinates_GFp + (const EC_GROUP *group, const EC_POINT *p, + BIGNUM *x, BIGNUM *y, BN_CTX *ctx); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/** Sets the x9.62 compressed coordinates of a EC_POINT + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, int y_bit, + BN_CTX *ctx); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/** Sets the x9.62 compressed coordinates of a EC_POINT. A synonym of + * EC_POINT_set_compressed_coordinates + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINT_set_compressed_coordinates_GFp + (const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, int y_bit, BN_CTX *ctx); +# ifndef OPENSSL_NO_EC2M +/** Sets the affine coordinates of an EC_POINT. A synonym of + * EC_POINT_set_affine_coordinates + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with the x-coordinate + * \param y BIGNUM with the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINT_set_affine_coordinates_GF2m + (const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx); + +/** Gets the affine coordinates of an EC_POINT. A synonym of + * EC_POINT_get_affine_coordinates + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM for the x-coordinate + * \param y BIGNUM for the y-coordinate + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINT_get_affine_coordinates_GF2m + (const EC_GROUP *group, const EC_POINT *p, + BIGNUM *x, BIGNUM *y, BN_CTX *ctx); + +/** Sets the x9.62 compressed coordinates of a EC_POINT. A synonym of + * EC_POINT_set_compressed_coordinates + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param x BIGNUM with x-coordinate + * \param y_bit integer with the y-Bit (either 0 or 1) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINT_set_compressed_coordinates_GF2m + (const EC_GROUP *group, EC_POINT *p, + const BIGNUM *x, int y_bit, BN_CTX *ctx); +# endif +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/** Encodes a EC_POINT object to a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param form point conversion form + * \param buf memory buffer for the result. If NULL the function returns + * required buffer size. + * \param len length of the memory buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *p, + point_conversion_form_t form, + unsigned char *buf, size_t len, BN_CTX *ctx); + +/** Decodes a EC_POINT from a octet string + * \param group underlying EC_GROUP object + * \param p EC_POINT object + * \param buf memory buffer with the encoded ec point + * \param len length of the encoded ec point + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *p, + const unsigned char *buf, size_t len, BN_CTX *ctx); + +/** Encodes an EC_POINT object to an allocated octet string + * \param group underlying EC_GROUP object + * \param point EC_POINT object + * \param form point conversion form + * \param pbuf returns pointer to allocated buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +size_t EC_POINT_point2buf(const EC_GROUP *group, const EC_POINT *point, + point_conversion_form_t form, + unsigned char **pbuf, BN_CTX *ctx); + +/* other interfaces to point2oct/oct2point: */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 BIGNUM *EC_POINT_point2bn(const EC_GROUP *, + const EC_POINT *, + point_conversion_form_t form, + BIGNUM *, BN_CTX *); +OSSL_DEPRECATEDIN_3_0 EC_POINT *EC_POINT_bn2point(const EC_GROUP *, + const BIGNUM *, + EC_POINT *, BN_CTX *); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, + point_conversion_form_t form, BN_CTX *); +EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, + EC_POINT *, BN_CTX *); + +/********************************************************************/ +/* functions for doing EC_POINT arithmetic */ +/********************************************************************/ + +/** Computes the sum of two EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = a + b) + * \param a EC_POINT object with the first summand + * \param b EC_POINT object with the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + const EC_POINT *b, BN_CTX *ctx); + +/** Computes the double of a EC_POINT + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result (r = 2 * a) + * \param a EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, + BN_CTX *ctx); + +/** Computes the inverse of a EC_POINT + * \param group underlying EC_GROUP object + * \param a EC_POINT object to be inverted (it's used for the result as well) + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_invert(const EC_GROUP *group, EC_POINT *a, BN_CTX *ctx); + +/** Checks whether the point is the neutral element of the group + * \param group the underlying EC_GROUP object + * \param p EC_POINT object + * \return 1 if the point is the neutral element and 0 otherwise + */ +int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *p); + +/** Checks whether the point is on the curve + * \param group underlying EC_GROUP object + * \param point EC_POINT object to check + * \param ctx BN_CTX object (optional) + * \return 1 if the point is on the curve, 0 if not, or -1 on error + */ +int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point, + BN_CTX *ctx); + +/** Compares two EC_POINTs + * \param group underlying EC_GROUP object + * \param a first EC_POINT object + * \param b second EC_POINT object + * \param ctx BN_CTX object (optional) + * \return 1 if the points are not equal, 0 if they are, or -1 on error + */ +int EC_POINT_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, + BN_CTX *ctx); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int EC_POINT_make_affine(const EC_GROUP *group, + EC_POINT *point, BN_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 int EC_POINTs_make_affine(const EC_GROUP *group, size_t num, + EC_POINT *points[], BN_CTX *ctx); + +/** Computes r = generator * n + sum_{i=0}^{num-1} p[i] * m[i] + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param num number further summands + * \param p array of size num of EC_POINT objects + * \param m array of size num of BIGNUM objects + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, + const BIGNUM *n, size_t num, + const EC_POINT *p[], const BIGNUM *m[], + BN_CTX *ctx); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/** Computes r = generator * n + q * m + * \param group underlying EC_GROUP object + * \param r EC_POINT object for the result + * \param n BIGNUM with the multiplier for the group generator (optional) + * \param q EC_POINT object with the first factor of the second summand + * \param m BIGNUM with the second factor of the second summand + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, + const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/** Stores multiples of generator for faster point multiplication + * \param group EC_GROUP object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_GROUP_precompute_mult(EC_GROUP *group, BN_CTX *ctx); + +/** Reports whether a precomputation has been done + * \param group EC_GROUP object + * \return 1 if a pre-computation has been done and 0 otherwise + */ +OSSL_DEPRECATEDIN_3_0 int EC_GROUP_have_precompute_mult(const EC_GROUP *group); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/********************************************************************/ +/* ASN1 stuff */ +/********************************************************************/ + +DECLARE_ASN1_ITEM(ECPKPARAMETERS) +DECLARE_ASN1_ALLOC_FUNCTIONS(ECPKPARAMETERS) +DECLARE_ASN1_ITEM(ECPARAMETERS) +DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS) + +/* + * EC_GROUP_get_basis_type() returns the NID of the basis type used to + * represent the field elements + */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +# ifndef OPENSSL_NO_EC2M +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); +# endif + +EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len); +int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out); + +# define d2i_ECPKParameters_bio(bp,x) \ + ASN1_d2i_bio_of(EC_GROUP, NULL, d2i_ECPKParameters, bp, x) +# define i2d_ECPKParameters_bio(bp,x) \ + ASN1_i2d_bio_of(EC_GROUP, i2d_ECPKParameters, bp, x) +# define d2i_ECPKParameters_fp(fp,x) \ + (EC_GROUP *)ASN1_d2i_fp(NULL, (d2i_of_void *)d2i_ECPKParameters, (fp), \ + (void **)(x)) +# define i2d_ECPKParameters_fp(fp,x) \ + ASN1_i2d_fp((i2d_of_void *)i2d_ECPKParameters, (fp), (void *)(x)) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ECPKParameters_print(BIO *bp, const EC_GROUP *x, + int off); +# ifndef OPENSSL_NO_STDIO +OSSL_DEPRECATEDIN_3_0 int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, + int off); +# endif +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/********************************************************************/ +/* EC_KEY functions */ +/********************************************************************/ + +/* some values for the encoding_flag */ +# define EC_PKEY_NO_PARAMETERS 0x001 +# define EC_PKEY_NO_PUBKEY 0x002 + +/* some values for the flags field */ +# define EC_FLAG_SM2_RANGE 0x0004 +# define EC_FLAG_COFACTOR_ECDH 0x1000 +# define EC_FLAG_CHECK_NAMED_GROUP 0x2000 +# define EC_FLAG_CHECK_NAMED_GROUP_NIST 0x4000 +# define EC_FLAG_CHECK_NAMED_GROUP_MASK \ + (EC_FLAG_CHECK_NAMED_GROUP | EC_FLAG_CHECK_NAMED_GROUP_NIST) + +/* Deprecated flags - it was using 0x01..0x02 */ +# define EC_FLAG_NON_FIPS_ALLOW 0x0000 +# define EC_FLAG_FIPS_CHECKED 0x0000 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/** + * Creates a new EC_KEY object. + * \param ctx The library context for to use for this EC_KEY. May be NULL in + * which case the default library context is used. + * \return EC_KEY object or NULL if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *EC_KEY_new_ex(OSSL_LIB_CTX *ctx, const char *propq); + +/** + * Creates a new EC_KEY object. Same as calling EC_KEY_new_ex with a + * NULL library context + * \return EC_KEY object or NULL if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *EC_KEY_new(void); + +OSSL_DEPRECATEDIN_3_0 int EC_KEY_get_flags(const EC_KEY *key); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_set_flags(EC_KEY *key, int flags); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_clear_flags(EC_KEY *key, int flags); + +OSSL_DEPRECATEDIN_3_0 int EC_KEY_decoded_from_explicit_params(const EC_KEY *key); + +/** + * Creates a new EC_KEY object using a named curve as underlying + * EC_GROUP object. + * \param ctx The library context for to use for this EC_KEY. May be NULL in + * which case the default library context is used. + * \param propq Any property query string + * \param nid NID of the named curve. + * \return EC_KEY object or NULL if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *EC_KEY_new_by_curve_name_ex(OSSL_LIB_CTX *ctx, + const char *propq, + int nid); + +/** + * Creates a new EC_KEY object using a named curve as underlying + * EC_GROUP object. Same as calling EC_KEY_new_by_curve_name_ex with a NULL + * library context and property query string. + * \param nid NID of the named curve. + * \return EC_KEY object or NULL if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *EC_KEY_new_by_curve_name(int nid); + +/** Frees a EC_KEY object. + * \param key EC_KEY object to be freed. + */ +OSSL_DEPRECATEDIN_3_0 void EC_KEY_free(EC_KEY *key); + +/** Copies a EC_KEY object. + * \param dst destination EC_KEY object + * \param src src EC_KEY object + * \return dst or NULL if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *EC_KEY_copy(EC_KEY *dst, const EC_KEY *src); + +/** Creates a new EC_KEY object and copies the content from src to it. + * \param src the source EC_KEY object + * \return newly created EC_KEY object or NULL if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *EC_KEY_dup(const EC_KEY *src); + +/** Increases the internal reference count of a EC_KEY object. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_up_ref(EC_KEY *key); + +/** Returns the ENGINE object of a EC_KEY object + * \param eckey EC_KEY object + * \return the ENGINE object (possibly NULL). + */ +OSSL_DEPRECATEDIN_3_0 ENGINE *EC_KEY_get0_engine(const EC_KEY *eckey); + +/** Returns the EC_GROUP object of a EC_KEY object + * \param key EC_KEY object + * \return the EC_GROUP object (possibly NULL). + */ +OSSL_DEPRECATEDIN_3_0 const EC_GROUP *EC_KEY_get0_group(const EC_KEY *key); + +/** Sets the EC_GROUP of a EC_KEY object. + * \param key EC_KEY object + * \param group EC_GROUP to use in the EC_KEY object (note: the EC_KEY + * object will use an own copy of the EC_GROUP). + * \return 1 on success and 0 if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_set_group(EC_KEY *key, const EC_GROUP *group); + +/** Returns the private key of a EC_KEY object. + * \param key EC_KEY object + * \return a BIGNUM with the private key (possibly NULL). + */ +OSSL_DEPRECATEDIN_3_0 const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *key); + +/** Sets the private key of a EC_KEY object. + * \param key EC_KEY object + * \param prv BIGNUM with the private key (note: the EC_KEY object + * will use an own copy of the BIGNUM). + * \return 1 on success and 0 if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *prv); + +/** Returns the public key of a EC_KEY object. + * \param key the EC_KEY object + * \return a EC_POINT object with the public key (possibly NULL) + */ +OSSL_DEPRECATEDIN_3_0 const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *key); + +/** Sets the public key of a EC_KEY object. + * \param key EC_KEY object + * \param pub EC_POINT object with the public key (note: the EC_KEY object + * will use an own copy of the EC_POINT object). + * \return 1 on success and 0 if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_set_public_key(EC_KEY *key, const EC_POINT *pub); + +OSSL_DEPRECATEDIN_3_0 unsigned EC_KEY_get_enc_flags(const EC_KEY *key); +OSSL_DEPRECATEDIN_3_0 void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int flags); +OSSL_DEPRECATEDIN_3_0 point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key); +OSSL_DEPRECATEDIN_3_0 void EC_KEY_set_conv_form(EC_KEY *eckey, + point_conversion_form_t cform); +# endif /*OPENSSL_NO_DEPRECATED_3_0 */ + +# define EC_KEY_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_EC_KEY, l, p, newf, dupf, freef) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int EC_KEY_set_ex_data(EC_KEY *key, int idx, void *arg); +OSSL_DEPRECATEDIN_3_0 void *EC_KEY_get_ex_data(const EC_KEY *key, int idx); + +/* wrapper functions for the underlying EC_GROUP object */ +OSSL_DEPRECATEDIN_3_0 void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag); + +/** Creates a table of pre-computed multiples of the generator to + * accelerate further EC_KEY operations. + * \param key EC_KEY object + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx); + +/** Creates a new ec private (and optional a new public) key. + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_generate_key(EC_KEY *key); + +/** Verifies that a private and/or public key is valid. + * \param key the EC_KEY object + * \return 1 on success and 0 otherwise. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_check_key(const EC_KEY *key); + +/** Indicates if an EC_KEY can be used for signing. + * \param eckey the EC_KEY object + * \return 1 if can can sign and 0 otherwise. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_can_sign(const EC_KEY *eckey); + +/** Sets a public key from affine coordinates performing + * necessary NIST PKV tests. + * \param key the EC_KEY object + * \param x public key x coordinate + * \param y public key y coordinate + * \return 1 on success and 0 otherwise. + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, + BIGNUM *x, + BIGNUM *y); + +/** Encodes an EC_KEY public key to an allocated octet string + * \param key key to encode + * \param form point conversion form + * \param pbuf returns pointer to allocated buffer + * \param ctx BN_CTX object (optional) + * \return the length of the encoded octet string or 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 size_t EC_KEY_key2buf(const EC_KEY *key, + point_conversion_form_t form, + unsigned char **pbuf, BN_CTX *ctx); + +/** Decodes a EC_KEY public key from a octet string + * \param key key to decode + * \param buf memory buffer with the encoded ec point + * \param len length of the encoded ec point + * \param ctx BN_CTX object (optional) + * \return 1 on success and 0 if an error occurred + */ + +OSSL_DEPRECATEDIN_3_0 int EC_KEY_oct2key(EC_KEY *key, const unsigned char *buf, + size_t len, BN_CTX *ctx); + +/** Decodes an EC_KEY private key from an octet string + * \param key key to decode + * \param buf memory buffer with the encoded private key + * \param len length of the encoded key + * \return 1 on success and 0 if an error occurred + */ + +OSSL_DEPRECATEDIN_3_0 int EC_KEY_oct2priv(EC_KEY *key, const unsigned char *buf, + size_t len); + +/** Encodes a EC_KEY private key to an octet string + * \param key key to encode + * \param buf memory buffer for the result. If NULL the function returns + * required buffer size. + * \param len length of the memory buffer + * \return the length of the encoded octet string or 0 if an error occurred + */ + +OSSL_DEPRECATEDIN_3_0 size_t EC_KEY_priv2oct(const EC_KEY *key, + unsigned char *buf, size_t len); + +/** Encodes an EC_KEY private key to an allocated octet string + * \param eckey key to encode + * \param pbuf returns pointer to allocated buffer + * \return the length of the encoded octet string or 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 size_t EC_KEY_priv2buf(const EC_KEY *eckey, + unsigned char **pbuf); + +/********************************************************************/ +/* de- and encoding functions for SEC1 ECPrivateKey */ +/********************************************************************/ + +/** Decodes a private key from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded private key + * \param len length of the DER encoded private key + * \return the decoded private key or NULL if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey(EC_KEY **key, + const unsigned char **in, + long len); + +/** Encodes a private key object and stores the result in a buffer. + * \param key the EC_KEY object to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey(const EC_KEY *key, + unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC parameters */ +/********************************************************************/ + +/** Decodes ec parameter from a memory buffer. + * \param key a pointer to a EC_KEY object which should be used (or NULL) + * \param in pointer to memory with the DER encoded ec parameters + * \param len length of the DER encoded ec parameters + * \return a EC_KEY object with the decoded parameters or NULL if an error + * occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECParameters(EC_KEY **key, + const unsigned char **in, + long len); + +/** Encodes ec parameter and stores the result in a buffer. + * \param key the EC_KEY object with ec parameters to encode + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred. + */ +OSSL_DEPRECATEDIN_3_0 int i2d_ECParameters(const EC_KEY *key, + unsigned char **out); + +/********************************************************************/ +/* de- and encoding functions for EC public key */ +/* (octet string, not DER -- hence 'o2i' and 'i2o') */ +/********************************************************************/ + +/** Decodes an ec public key from a octet string. + * \param key a pointer to a EC_KEY object which should be used + * \param in memory buffer with the encoded public key + * \param len length of the encoded public key + * \return EC_KEY object with decoded public key or NULL if an error + * occurred. + */ +OSSL_DEPRECATEDIN_3_0 EC_KEY *o2i_ECPublicKey(EC_KEY **key, + const unsigned char **in, long len); + +/** Encodes an ec public key in an octet string. + * \param key the EC_KEY object with the public key + * \param out the buffer for the result (if NULL the function returns number + * of bytes needed). + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int i2o_ECPublicKey(const EC_KEY *key, unsigned char **out); + +/** Prints out the ec parameters on human readable form. + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int ECParameters_print(BIO *bp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param bp BIO object to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_print(BIO *bp, const EC_KEY *key, int off); + +# ifndef OPENSSL_NO_STDIO +/** Prints out the ec parameters on human readable form. + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int ECParameters_print_fp(FILE *fp, const EC_KEY *key); + +/** Prints out the contents of a EC_KEY object + * \param fp file descriptor to which the information is printed + * \param key EC_KEY object + * \param off line offset + * \return 1 on success and 0 if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 int EC_KEY_print_fp(FILE *fp, const EC_KEY *key, int off); +# endif /* OPENSSL_NO_STDIO */ + +OSSL_DEPRECATEDIN_3_0 const EC_KEY_METHOD *EC_KEY_OpenSSL(void); +OSSL_DEPRECATEDIN_3_0 const EC_KEY_METHOD *EC_KEY_get_default_method(void); +OSSL_DEPRECATEDIN_3_0 void EC_KEY_set_default_method(const EC_KEY_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 const EC_KEY_METHOD *EC_KEY_get_method(const EC_KEY *key); +OSSL_DEPRECATEDIN_3_0 int EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 EC_KEY *EC_KEY_new_method(ENGINE *engine); + +/** The old name for ecdh_KDF_X9_63 + * The ECDH KDF specification has been mistakingly attributed to ANSI X9.62, + * it is actually specified in ANSI X9.63. + * This identifier is retained for backwards compatibility + */ +OSSL_DEPRECATEDIN_3_0 int ECDH_KDF_X9_62(unsigned char *out, size_t outlen, + const unsigned char *Z, size_t Zlen, + const unsigned char *sinfo, + size_t sinfolen, const EVP_MD *md); + +OSSL_DEPRECATEDIN_3_0 int ECDH_compute_key(void *out, size_t outlen, + const EC_POINT *pub_key, + const EC_KEY *ecdh, + void *(*KDF)(const void *in, + size_t inlen, void *out, + size_t *outlen)); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +typedef struct ECDSA_SIG_st ECDSA_SIG; + +/** Allocates and initialize a ECDSA_SIG structure + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +ECDSA_SIG *ECDSA_SIG_new(void); + +/** frees a ECDSA_SIG structure + * \param sig pointer to the ECDSA_SIG structure + */ +void ECDSA_SIG_free(ECDSA_SIG *sig); + +/** i2d_ECDSA_SIG encodes content of ECDSA_SIG (note: this function modifies *pp + * (*pp += length of the DER encoded signature)). + * \param sig pointer to the ECDSA_SIG object + * \param pp pointer to a unsigned char pointer for the output or NULL + * \return the length of the DER encoded ECDSA_SIG object or a negative value + * on error + */ +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ECDSA_SIG, ECDSA_SIG) + +/** d2i_ECDSA_SIG decodes an ECDSA signature (note: this function modifies *pp + * (*pp += len)). + * \param sig pointer to ECDSA_SIG pointer (may be NULL) + * \param pp memory buffer with the DER encoded signature + * \param len length of the buffer + * \return pointer to the decoded ECDSA_SIG structure (or NULL) + */ + +/** Accessor for r and s fields of ECDSA_SIG + * \param sig pointer to ECDSA_SIG structure + * \param pr pointer to BIGNUM pointer for r (may be NULL) + * \param ps pointer to BIGNUM pointer for s (may be NULL) + */ +void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); + +/** Accessor for r field of ECDSA_SIG + * \param sig pointer to ECDSA_SIG structure + */ +const BIGNUM *ECDSA_SIG_get0_r(const ECDSA_SIG *sig); + +/** Accessor for s field of ECDSA_SIG + * \param sig pointer to ECDSA_SIG structure + */ +const BIGNUM *ECDSA_SIG_get0_s(const ECDSA_SIG *sig); + +/** Setter for r and s fields of ECDSA_SIG + * \param sig pointer to ECDSA_SIG structure + * \param r pointer to BIGNUM for r + * \param s pointer to BIGNUM for s + */ +int ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/** Computes the ECDSA signature of the given hash value using + * the supplied private key and returns the created signature. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst, + int dgst_len, EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optional), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return pointer to a ECDSA_SIG structure or NULL if an error occurred + */ +OSSL_DEPRECATEDIN_3_0 ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, + int dgstlen, const BIGNUM *kinv, + const BIGNUM *rp, EC_KEY *eckey); + +/** Verifies that the supplied signature is a valid ECDSA + * signature of the supplied hash value using the supplied public key. + * \param dgst pointer to the hash value + * \param dgst_len length of the hash value + * \param sig ECDSA_SIG structure + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +OSSL_DEPRECATEDIN_3_0 int ECDSA_do_verify(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY *eckey); + +/** Precompute parts of the signing operation + * \param eckey EC_KEY object containing a private EC key + * \param ctx BN_CTX object (optional) + * \param kinv BIGNUM pointer for the inverse of k + * \param rp BIGNUM pointer for x coordinate of k * generator + * \return 1 on success and 0 otherwise + */ +OSSL_DEPRECATEDIN_3_0 int ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, + BIGNUM **kinv, BIGNUM **rp); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig memory for the DER encoded created signature + * \param siglen pointer to the length of the returned signature + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +OSSL_DEPRECATEDIN_3_0 int ECDSA_sign(int type, const unsigned char *dgst, + int dgstlen, unsigned char *sig, + unsigned int *siglen, EC_KEY *eckey); + +/** Computes ECDSA signature of a given hash value using the supplied + * private key (note: sig must point to ECDSA_size(eckey) bytes of memory). + * \param type this parameter is ignored + * \param dgst pointer to the hash value to sign + * \param dgstlen length of the hash value + * \param sig buffer to hold the DER encoded signature + * \param siglen pointer to the length of the returned signature + * \param kinv BIGNUM with a pre-computed inverse k (optional) + * \param rp BIGNUM with a pre-computed rp value (optional), + * see ECDSA_sign_setup + * \param eckey EC_KEY object containing a private EC key + * \return 1 on success and 0 otherwise + */ +OSSL_DEPRECATEDIN_3_0 int ECDSA_sign_ex(int type, const unsigned char *dgst, + int dgstlen, unsigned char *sig, + unsigned int *siglen, const BIGNUM *kinv, + const BIGNUM *rp, EC_KEY *eckey); + +/** Verifies that the given signature is valid ECDSA signature + * of the supplied hash value using the specified public key. + * \param type this parameter is ignored + * \param dgst pointer to the hash value + * \param dgstlen length of the hash value + * \param sig pointer to the DER encoded signature + * \param siglen length of the DER encoded signature + * \param eckey EC_KEY object containing a public EC key + * \return 1 if the signature is valid, 0 if the signature is invalid + * and -1 on error + */ +OSSL_DEPRECATEDIN_3_0 int ECDSA_verify(int type, const unsigned char *dgst, + int dgstlen, const unsigned char *sig, + int siglen, EC_KEY *eckey); + +/** Returns the maximum length of the DER encoded signature + * \param eckey EC_KEY object + * \return numbers of bytes required for the DER encoded signature + */ +OSSL_DEPRECATEDIN_3_0 int ECDSA_size(const EC_KEY *eckey); + +/********************************************************************/ +/* EC_KEY_METHOD constructors, destructors, writers and accessors */ +/********************************************************************/ + +OSSL_DEPRECATEDIN_3_0 EC_KEY_METHOD *EC_KEY_METHOD_new(const EC_KEY_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_free(EC_KEY_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_set_init + (EC_KEY_METHOD *meth, + int (*init)(EC_KEY *key), + void (*finish)(EC_KEY *key), + int (*copy)(EC_KEY *dest, const EC_KEY *src), + int (*set_group)(EC_KEY *key, const EC_GROUP *grp), + int (*set_private)(EC_KEY *key, const BIGNUM *priv_key), + int (*set_public)(EC_KEY *key, const EC_POINT *pub_key)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth, + int (*keygen)(EC_KEY *key)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_set_compute_key + (EC_KEY_METHOD *meth, + int (*ckey)(unsigned char **psec, size_t *pseclen, + const EC_POINT *pub_key, const EC_KEY *ecdh)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_set_sign + (EC_KEY_METHOD *meth, + int (*sign)(int type, const unsigned char *dgst, + int dlen, unsigned char *sig, + unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *r, + EC_KEY *eckey), + int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, + BIGNUM **kinvp, BIGNUM **rp), + ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, + int dgst_len, + const BIGNUM *in_kinv, + const BIGNUM *in_r, + EC_KEY *eckey)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_set_verify + (EC_KEY_METHOD *meth, + int (*verify)(int type, const unsigned + char *dgst, int dgst_len, + const unsigned char *sigbuf, + int sig_len, EC_KEY *eckey), + int (*verify_sig)(const unsigned char *dgst, + int dgst_len, const ECDSA_SIG *sig, + EC_KEY *eckey)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_get_init + (const EC_KEY_METHOD *meth, + int (**pinit)(EC_KEY *key), + void (**pfinish)(EC_KEY *key), + int (**pcopy)(EC_KEY *dest, const EC_KEY *src), + int (**pset_group)(EC_KEY *key, const EC_GROUP *grp), + int (**pset_private)(EC_KEY *key, const BIGNUM *priv_key), + int (**pset_public)(EC_KEY *key, const EC_POINT *pub_key)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_get_keygen + (const EC_KEY_METHOD *meth, int (**pkeygen)(EC_KEY *key)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_get_compute_key + (const EC_KEY_METHOD *meth, + int (**pck)(unsigned char **psec, + size_t *pseclen, + const EC_POINT *pub_key, + const EC_KEY *ecdh)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_get_sign + (const EC_KEY_METHOD *meth, + int (**psign)(int type, const unsigned char *dgst, + int dlen, unsigned char *sig, + unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *r, + EC_KEY *eckey), + int (**psign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, + BIGNUM **kinvp, BIGNUM **rp), + ECDSA_SIG *(**psign_sig)(const unsigned char *dgst, + int dgst_len, + const BIGNUM *in_kinv, + const BIGNUM *in_r, + EC_KEY *eckey)); + +OSSL_DEPRECATEDIN_3_0 void EC_KEY_METHOD_get_verify + (const EC_KEY_METHOD *meth, + int (**pverify)(int type, const unsigned + char *dgst, int dgst_len, + const unsigned char *sigbuf, + int sig_len, EC_KEY *eckey), + int (**pverify_sig)(const unsigned char *dgst, + int dgst_len, + const ECDSA_SIG *sig, + EC_KEY *eckey)); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +# define EVP_EC_gen(curve) \ + EVP_PKEY_Q_keygen(NULL, NULL, "EC", (char *)(strstr(curve, ""))) + /* strstr is used to enable type checking for the variadic string arg */ +# define ECParameters_dup(x) ASN1_dup_of(EC_KEY, i2d_ECParameters, \ + d2i_ECParameters, x) + +# ifndef __cplusplus +# if defined(__SUNPRO_C) +# if __SUNPRO_C >= 0x520 +# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE) +# endif +# endif +# endif + +# endif +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/ecdh.h b/OtherInc/openssl/include/openssl/ecdh.h new file mode 100644 index 0000000..56bd4cc --- /dev/null +++ b/OtherInc/openssl/include/openssl/ecdh.h @@ -0,0 +1,10 @@ +/* + * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include diff --git a/OtherInc/openssl/include/openssl/ecdsa.h b/OtherInc/openssl/include/openssl/ecdsa.h new file mode 100644 index 0000000..56bd4cc --- /dev/null +++ b/OtherInc/openssl/include/openssl/ecdsa.h @@ -0,0 +1,10 @@ +/* + * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include diff --git a/OtherInc/openssl/include/openssl/ecerr.h b/OtherInc/openssl/include/openssl/ecerr.h new file mode 100644 index 0000000..46405ac --- /dev/null +++ b/OtherInc/openssl/include/openssl/ecerr.h @@ -0,0 +1,103 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_ECERR_H +# define OPENSSL_ECERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_EC + + +/* + * EC reason codes. + */ +# define EC_R_ASN1_ERROR 115 +# define EC_R_BAD_SIGNATURE 156 +# define EC_R_BIGNUM_OUT_OF_RANGE 144 +# define EC_R_BUFFER_TOO_SMALL 100 +# define EC_R_CANNOT_INVERT 165 +# define EC_R_COORDINATES_OUT_OF_RANGE 146 +# define EC_R_CURVE_DOES_NOT_SUPPORT_ECDH 160 +# define EC_R_CURVE_DOES_NOT_SUPPORT_ECDSA 170 +# define EC_R_CURVE_DOES_NOT_SUPPORT_SIGNING 159 +# define EC_R_DECODE_ERROR 142 +# define EC_R_DISCRIMINANT_IS_ZERO 118 +# define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +# define EC_R_EXPLICIT_PARAMS_NOT_SUPPORTED 127 +# define EC_R_FAILED_MAKING_PUBLIC_KEY 166 +# define EC_R_FIELD_TOO_LARGE 143 +# define EC_R_GF2M_NOT_SUPPORTED 147 +# define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +# define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 +# define EC_R_INCOMPATIBLE_OBJECTS 101 +# define EC_R_INVALID_A 168 +# define EC_R_INVALID_ARGUMENT 112 +# define EC_R_INVALID_B 169 +# define EC_R_INVALID_COFACTOR 171 +# define EC_R_INVALID_COMPRESSED_POINT 110 +# define EC_R_INVALID_COMPRESSION_BIT 109 +# define EC_R_INVALID_CURVE 141 +# define EC_R_INVALID_DIGEST 151 +# define EC_R_INVALID_DIGEST_TYPE 138 +# define EC_R_INVALID_ENCODING 102 +# define EC_R_INVALID_FIELD 103 +# define EC_R_INVALID_FORM 104 +# define EC_R_INVALID_GENERATOR 173 +# define EC_R_INVALID_GROUP_ORDER 122 +# define EC_R_INVALID_KEY 116 +# define EC_R_INVALID_LENGTH 117 +# define EC_R_INVALID_NAMED_GROUP_CONVERSION 174 +# define EC_R_INVALID_OUTPUT_LENGTH 161 +# define EC_R_INVALID_P 172 +# define EC_R_INVALID_PEER_KEY 133 +# define EC_R_INVALID_PENTANOMIAL_BASIS 132 +# define EC_R_INVALID_PRIVATE_KEY 123 +# define EC_R_INVALID_SEED 175 +# define EC_R_INVALID_TRINOMIAL_BASIS 137 +# define EC_R_KDF_PARAMETER_ERROR 148 +# define EC_R_KEYS_NOT_SET 140 +# define EC_R_LADDER_POST_FAILURE 136 +# define EC_R_LADDER_PRE_FAILURE 153 +# define EC_R_LADDER_STEP_FAILURE 162 +# define EC_R_MISSING_OID 167 +# define EC_R_MISSING_PARAMETERS 124 +# define EC_R_MISSING_PRIVATE_KEY 125 +# define EC_R_NEED_NEW_SETUP_VALUES 157 +# define EC_R_NOT_A_NIST_PRIME 135 +# define EC_R_NOT_IMPLEMENTED 126 +# define EC_R_NOT_INITIALIZED 111 +# define EC_R_NO_PARAMETERS_SET 139 +# define EC_R_NO_PRIVATE_VALUE 154 +# define EC_R_OPERATION_NOT_SUPPORTED 152 +# define EC_R_PASSED_NULL_PARAMETER 134 +# define EC_R_PEER_KEY_ERROR 149 +# define EC_R_POINT_ARITHMETIC_FAILURE 155 +# define EC_R_POINT_AT_INFINITY 106 +# define EC_R_POINT_COORDINATES_BLIND_FAILURE 163 +# define EC_R_POINT_IS_NOT_ON_CURVE 107 +# define EC_R_RANDOM_NUMBER_GENERATION_FAILED 158 +# define EC_R_SHARED_INFO_ERROR 150 +# define EC_R_SLOT_FULL 108 +# define EC_R_UNDEFINED_GENERATOR 113 +# define EC_R_UNDEFINED_ORDER 128 +# define EC_R_UNKNOWN_COFACTOR 164 +# define EC_R_UNKNOWN_GROUP 129 +# define EC_R_UNKNOWN_ORDER 114 +# define EC_R_UNSUPPORTED_FIELD 131 +# define EC_R_WRONG_CURVE_PARAMETERS 145 +# define EC_R_WRONG_ORDER 130 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/encoder.h b/OtherInc/openssl/include/openssl/encoder.h new file mode 100644 index 0000000..c37a6f1 --- /dev/null +++ b/OtherInc/openssl/include/openssl/encoder.h @@ -0,0 +1,124 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_ENCODER_H +# define OPENSSL_ENCODER_H +# pragma once + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# endif +# include +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +OSSL_ENCODER *OSSL_ENCODER_fetch(OSSL_LIB_CTX *libctx, const char *name, + const char *properties); +int OSSL_ENCODER_up_ref(OSSL_ENCODER *encoder); +void OSSL_ENCODER_free(OSSL_ENCODER *encoder); + +const OSSL_PROVIDER *OSSL_ENCODER_get0_provider(const OSSL_ENCODER *encoder); +const char *OSSL_ENCODER_get0_properties(const OSSL_ENCODER *encoder); +const char *OSSL_ENCODER_get0_name(const OSSL_ENCODER *kdf); +const char *OSSL_ENCODER_get0_description(const OSSL_ENCODER *kdf); +int OSSL_ENCODER_is_a(const OSSL_ENCODER *encoder, const char *name); + +void OSSL_ENCODER_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(OSSL_ENCODER *encoder, void *arg), + void *arg); +int OSSL_ENCODER_names_do_all(const OSSL_ENCODER *encoder, + void (*fn)(const char *name, void *data), + void *data); +const OSSL_PARAM *OSSL_ENCODER_gettable_params(OSSL_ENCODER *encoder); +int OSSL_ENCODER_get_params(OSSL_ENCODER *encoder, OSSL_PARAM params[]); + +const OSSL_PARAM *OSSL_ENCODER_settable_ctx_params(OSSL_ENCODER *encoder); +OSSL_ENCODER_CTX *OSSL_ENCODER_CTX_new(void); +int OSSL_ENCODER_CTX_set_params(OSSL_ENCODER_CTX *ctx, + const OSSL_PARAM params[]); +void OSSL_ENCODER_CTX_free(OSSL_ENCODER_CTX *ctx); + +/* Utilities that help set specific parameters */ +int OSSL_ENCODER_CTX_set_passphrase(OSSL_ENCODER_CTX *ctx, + const unsigned char *kstr, size_t klen); +int OSSL_ENCODER_CTX_set_pem_password_cb(OSSL_ENCODER_CTX *ctx, + pem_password_cb *cb, void *cbarg); +int OSSL_ENCODER_CTX_set_passphrase_cb(OSSL_ENCODER_CTX *ctx, + OSSL_PASSPHRASE_CALLBACK *cb, + void *cbarg); +int OSSL_ENCODER_CTX_set_passphrase_ui(OSSL_ENCODER_CTX *ctx, + const UI_METHOD *ui_method, + void *ui_data); +int OSSL_ENCODER_CTX_set_cipher(OSSL_ENCODER_CTX *ctx, + const char *cipher_name, + const char *propquery); +int OSSL_ENCODER_CTX_set_selection(OSSL_ENCODER_CTX *ctx, int selection); +int OSSL_ENCODER_CTX_set_output_type(OSSL_ENCODER_CTX *ctx, + const char *output_type); +int OSSL_ENCODER_CTX_set_output_structure(OSSL_ENCODER_CTX *ctx, + const char *output_structure); + +/* Utilities to add encoders */ +int OSSL_ENCODER_CTX_add_encoder(OSSL_ENCODER_CTX *ctx, OSSL_ENCODER *encoder); +int OSSL_ENCODER_CTX_add_extra(OSSL_ENCODER_CTX *ctx, + OSSL_LIB_CTX *libctx, const char *propq); +int OSSL_ENCODER_CTX_get_num_encoders(OSSL_ENCODER_CTX *ctx); + +typedef struct ossl_encoder_instance_st OSSL_ENCODER_INSTANCE; +OSSL_ENCODER * +OSSL_ENCODER_INSTANCE_get_encoder(OSSL_ENCODER_INSTANCE *encoder_inst); +void * +OSSL_ENCODER_INSTANCE_get_encoder_ctx(OSSL_ENCODER_INSTANCE *encoder_inst); +const char * +OSSL_ENCODER_INSTANCE_get_output_type(OSSL_ENCODER_INSTANCE *encoder_inst); +const char * +OSSL_ENCODER_INSTANCE_get_output_structure(OSSL_ENCODER_INSTANCE *encoder_inst); + +typedef const void *OSSL_ENCODER_CONSTRUCT(OSSL_ENCODER_INSTANCE *encoder_inst, + void *construct_data); +typedef void OSSL_ENCODER_CLEANUP(void *construct_data); + +int OSSL_ENCODER_CTX_set_construct(OSSL_ENCODER_CTX *ctx, + OSSL_ENCODER_CONSTRUCT *construct); +int OSSL_ENCODER_CTX_set_construct_data(OSSL_ENCODER_CTX *ctx, + void *construct_data); +int OSSL_ENCODER_CTX_set_cleanup(OSSL_ENCODER_CTX *ctx, + OSSL_ENCODER_CLEANUP *cleanup); + +/* Utilities to output the object to encode */ +int OSSL_ENCODER_to_bio(OSSL_ENCODER_CTX *ctx, BIO *out); +#ifndef OPENSSL_NO_STDIO +int OSSL_ENCODER_to_fp(OSSL_ENCODER_CTX *ctx, FILE *fp); +#endif +int OSSL_ENCODER_to_data(OSSL_ENCODER_CTX *ctx, unsigned char **pdata, + size_t *pdata_len); + +/* + * Create the OSSL_ENCODER_CTX with an associated type. This will perform + * an implicit OSSL_ENCODER_fetch(), suitable for the object of that type. + * This is more useful than calling OSSL_ENCODER_CTX_new(). + */ +OSSL_ENCODER_CTX *OSSL_ENCODER_CTX_new_for_pkey(const EVP_PKEY *pkey, + int selection, + const char *output_type, + const char *output_struct, + const char *propquery); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/encodererr.h b/OtherInc/openssl/include/openssl/encodererr.h new file mode 100644 index 0000000..5e318b1 --- /dev/null +++ b/OtherInc/openssl/include/openssl/encodererr.h @@ -0,0 +1,28 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_ENCODERERR_H +# define OPENSSL_ENCODERERR_H +# pragma once + +# include +# include +# include + + + +/* + * OSSL_ENCODER reason codes. + */ +# define OSSL_ENCODER_R_ENCODER_NOT_FOUND 101 +# define OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY 100 +# define OSSL_ENCODER_R_MISSING_GET_PARAMS 102 + +#endif diff --git a/OtherInc/openssl/include/openssl/engine.h b/OtherInc/openssl/include/openssl/engine.h new file mode 100644 index 0000000..c965800 --- /dev/null +++ b/OtherInc/openssl/include/openssl/engine.h @@ -0,0 +1,833 @@ +/* + * Copyright 2000-2022 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_ENGINE_H +# define OPENSSL_ENGINE_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_ENGINE_H +# endif + +# include + +# ifndef OPENSSL_NO_ENGINE +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# include +# include +# include +# include +# include +# include +# include +# endif +# include +# include +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +/* + * These flags are used to control combinations of algorithm (methods) by + * bitwise "OR"ing. + */ +# define ENGINE_METHOD_RSA (unsigned int)0x0001 +# define ENGINE_METHOD_DSA (unsigned int)0x0002 +# define ENGINE_METHOD_DH (unsigned int)0x0004 +# define ENGINE_METHOD_RAND (unsigned int)0x0008 +# define ENGINE_METHOD_CIPHERS (unsigned int)0x0040 +# define ENGINE_METHOD_DIGESTS (unsigned int)0x0080 +# define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200 +# define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400 +# define ENGINE_METHOD_EC (unsigned int)0x0800 +/* Obvious all-or-nothing cases. */ +# define ENGINE_METHOD_ALL (unsigned int)0xFFFF +# define ENGINE_METHOD_NONE (unsigned int)0x0000 + +/* + * This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used + * internally to control registration of ENGINE implementations, and can be + * set by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to + * initialise registered ENGINEs if they are not already initialised. + */ +# define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001 + +/* ENGINE flags that can be set by ENGINE_set_flags(). */ +/* Not used */ +/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ + +/* + * This flag is for ENGINEs that wish to handle the various 'CMD'-related + * control commands on their own. Without this flag, ENGINE_ctrl() handles + * these control commands on behalf of the ENGINE using their "cmd_defns" + * data. + */ +# define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002 + +/* + * This flag is for ENGINEs who return new duplicate structures when found + * via "ENGINE_by_id()". When an ENGINE must store state (eg. if + * ENGINE_ctrl() commands are called in sequence as part of some stateful + * process like key-generation setup and execution), it can set this flag - + * then each attempt to obtain the ENGINE will result in it being copied into + * a new structure. Normally, ENGINEs don't declare this flag so + * ENGINE_by_id() just increments the existing ENGINE's structural reference + * count. + */ +# define ENGINE_FLAGS_BY_ID_COPY (int)0x0004 + +/* + * This flag if for an ENGINE that does not want its methods registered as + * part of ENGINE_register_all_complete() for example if the methods are not + * usable as default methods. + */ + +# define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008 + +/* + * ENGINEs can support their own command types, and these flags are used in + * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input + * each command expects. Currently only numeric and string input is + * supported. If a control command supports none of the _NUMERIC, _STRING, or + * _NO_INPUT options, then it is regarded as an "internal" control command - + * and not for use in config setting situations. As such, they're not + * available to the ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() + * access. Changes to this list of 'command types' should be reflected + * carefully in ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). + */ + +/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */ +# define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001 +/* + * accepts string input (cast from 'void*' to 'const char *', 4th parameter + * to ENGINE_ctrl) + */ +# define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002 +/* + * Indicates that the control command takes *no* input. Ie. the control + * command is unparameterised. + */ +# define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004 +/* + * Indicates that the control command is internal. This control command won't + * be shown in any output, and is only usable through the ENGINE_ctrl_cmd() + * function. + */ +# define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008 + +/* + * NB: These 3 control commands are deprecated and should not be used. + * ENGINEs relying on these commands should compile conditional support for + * compatibility (eg. if these symbols are defined) but should also migrate + * the same functionality to their own ENGINE-specific control functions that + * can be "discovered" by calling applications. The fact these control + * commands wouldn't be "executable" (ie. usable by text-based config) + * doesn't change the fact that application code can find and use them + * without requiring per-ENGINE hacking. + */ + +/* + * These flags are used to tell the ctrl function what should be done. All + * command numbers are shared between all engines, even if some don't make + * sense to some engines. In such a case, they do nothing but return the + * error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. + */ +# define ENGINE_CTRL_SET_LOGSTREAM 1 +# define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 +# define ENGINE_CTRL_HUP 3/* Close and reinitialise + * any handles/connections + * etc. */ +# define ENGINE_CTRL_SET_USER_INTERFACE 4/* Alternative to callback */ +# define ENGINE_CTRL_SET_CALLBACK_DATA 5/* User-specific data, used + * when calling the password + * callback and the user + * interface */ +# define ENGINE_CTRL_LOAD_CONFIGURATION 6/* Load a configuration, + * given a string that + * represents a file name + * or so */ +# define ENGINE_CTRL_LOAD_SECTION 7/* Load data from a given + * section in the already + * loaded configuration */ + +/* + * These control commands allow an application to deal with an arbitrary + * engine in a dynamic way. Warn: Negative return values indicate errors FOR + * THESE COMMANDS because zero is used to indicate 'end-of-list'. Other + * commands, including ENGINE-specific command types, return zero for an + * error. An ENGINE can choose to implement these ctrl functions, and can + * internally manage things however it chooses - it does so by setting the + * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise + * the ENGINE_ctrl() code handles this on the ENGINE's behalf using the + * cmd_defns data (set using ENGINE_set_cmd_defns()). This means an ENGINE's + * ctrl() handler need only implement its own commands - the above "meta" + * commands will be taken care of. + */ + +/* + * Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", + * then all the remaining control commands will return failure, so it is + * worth checking this first if the caller is trying to "discover" the + * engine's capabilities and doesn't want errors generated unnecessarily. + */ +# define ENGINE_CTRL_HAS_CTRL_FUNCTION 10 +/* + * Returns a positive command number for the first command supported by the + * engine. Returns zero if no ctrl commands are supported. + */ +# define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11 +/* + * The 'long' argument specifies a command implemented by the engine, and the + * return value is the next command supported, or zero if there are no more. + */ +# define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12 +/* + * The 'void*' argument is a command name (cast from 'const char *'), and the + * return value is the command that corresponds to it. + */ +# define ENGINE_CTRL_GET_CMD_FROM_NAME 13 +/* + * The next two allow a command to be converted into its corresponding string + * form. In each case, the 'long' argument supplies the command. In the + * NAME_LEN case, the return value is the length of the command name (not + * counting a trailing EOL). In the NAME case, the 'void*' argument must be a + * string buffer large enough, and it will be populated with the name of the + * command (WITH a trailing EOL). + */ +# define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14 +# define ENGINE_CTRL_GET_NAME_FROM_CMD 15 +/* The next two are similar but give a "short description" of a command. */ +# define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16 +# define ENGINE_CTRL_GET_DESC_FROM_CMD 17 +/* + * With this command, the return value is the OR'd combination of + * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given + * engine-specific ctrl command expects. + */ +# define ENGINE_CTRL_GET_CMD_FLAGS 18 + +/* + * ENGINE implementations should start the numbering of their own control + * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). + */ +# define ENGINE_CMD_BASE 200 + +/* + * NB: These 2 nCipher "chil" control commands are deprecated, and their + * functionality is now available through ENGINE-specific control commands + * (exposed through the above-mentioned 'CMD'-handling). Code using these 2 + * commands should be migrated to the more general command handling before + * these are removed. + */ + +/* Flags specific to the nCipher "chil" engine */ +# define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 + /* + * Depending on the value of the (long)i argument, this sets or + * unsets the SimpleForkCheck flag in the CHIL API to enable or + * disable checking and workarounds for applications that fork(). + */ +# define ENGINE_CTRL_CHIL_NO_LOCKING 101 + /* + * This prevents the initialisation function from providing mutex + * callbacks to the nCipher library. + */ + +/* + * If an ENGINE supports its own specific control commands and wishes the + * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on + * its behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN + * entries to ENGINE_set_cmd_defns(). It should also implement a ctrl() + * handler that supports the stated commands (ie. the "cmd_num" entries as + * described by the array). NB: The array must be ordered in increasing order + * of cmd_num. "null-terminated" means that the last ENGINE_CMD_DEFN element + * has cmd_num set to zero and/or cmd_name set to NULL. + */ +typedef struct ENGINE_CMD_DEFN_st { + unsigned int cmd_num; /* The command number */ + const char *cmd_name; /* The command name itself */ + const char *cmd_desc; /* A short description of the command */ + unsigned int cmd_flags; /* The input the command expects */ +} ENGINE_CMD_DEFN; + +/* Generic function pointer */ +typedef int (*ENGINE_GEN_FUNC_PTR) (void); +/* Generic function pointer taking no arguments */ +typedef int (*ENGINE_GEN_INT_FUNC_PTR) (ENGINE *); +/* Specific control function pointer */ +typedef int (*ENGINE_CTRL_FUNC_PTR) (ENGINE *, int, long, void *, + void (*f) (void)); +/* Generic load_key function pointer */ +typedef EVP_PKEY *(*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *, + UI_METHOD *ui_method, + void *callback_data); +typedef int (*ENGINE_SSL_CLIENT_CERT_PTR) (ENGINE *, SSL *ssl, + STACK_OF(X509_NAME) *ca_dn, + X509 **pcert, EVP_PKEY **pkey, + STACK_OF(X509) **pother, + UI_METHOD *ui_method, + void *callback_data); +/*- + * These callback types are for an ENGINE's handler for cipher and digest logic. + * These handlers have these prototypes; + * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid); + * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid); + * Looking at how to implement these handlers in the case of cipher support, if + * the framework wants the EVP_CIPHER for 'nid', it will call; + * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure) + * If the framework wants a list of supported 'nid's, it will call; + * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error) + */ +/* + * Returns to a pointer to the array of supported cipher 'nid's. If the + * second parameter is non-NULL it is set to the size of the returned array. + */ +typedef int (*ENGINE_CIPHERS_PTR) (ENGINE *, const EVP_CIPHER **, + const int **, int); +typedef int (*ENGINE_DIGESTS_PTR) (ENGINE *, const EVP_MD **, const int **, + int); +typedef int (*ENGINE_PKEY_METHS_PTR) (ENGINE *, EVP_PKEY_METHOD **, + const int **, int); +typedef int (*ENGINE_PKEY_ASN1_METHS_PTR) (ENGINE *, EVP_PKEY_ASN1_METHOD **, + const int **, int); +/* + * STRUCTURE functions ... all of these functions deal with pointers to + * ENGINE structures where the pointers have a "structural reference". This + * means that their reference is to allowed access to the structure but it + * does not imply that the structure is functional. To simply increment or + * decrement the structural reference count, use ENGINE_by_id and + * ENGINE_free. NB: This is not required when iterating using ENGINE_get_next + * as it will automatically decrement the structural reference count of the + * "current" ENGINE and increment the structural reference count of the + * ENGINE it returns (unless it is NULL). + */ + +/* Get the first/last "ENGINE" type available. */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_first(void); +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_last(void); +# endif +/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_next(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_prev(ENGINE *e); +# endif +/* Add another "ENGINE" type into the array. */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_add(ENGINE *e); +# endif +/* Remove an existing "ENGINE" type from the array. */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_remove(ENGINE *e); +# endif +/* Retrieve an engine from the list by its unique "id" value. */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_by_id(const char *id); +# endif + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define ENGINE_load_openssl() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_OPENSSL, NULL) +# define ENGINE_load_dynamic() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_DYNAMIC, NULL) +# ifndef OPENSSL_NO_STATIC_ENGINE +# define ENGINE_load_padlock() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_PADLOCK, NULL) +# define ENGINE_load_capi() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_CAPI, NULL) +# define ENGINE_load_afalg() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_AFALG, NULL) +# endif +# define ENGINE_load_cryptodev() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_CRYPTODEV, NULL) +# define ENGINE_load_rdrand() \ + OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_RDRAND, NULL) +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void ENGINE_load_builtin_engines(void); +# endif + +/* + * Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation + * "registry" handling. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 unsigned int ENGINE_get_table_flags(void); +OSSL_DEPRECATEDIN_3_0 void ENGINE_set_table_flags(unsigned int flags); +# endif + +/*- Manage registration of ENGINEs per "table". For each type, there are 3 + * functions; + * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one) + * ENGINE_unregister_***(e) - unregister the implementation from 'e' + * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list + * Cleanup is automatically registered from each table when required. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_RSA(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_RSA(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_RSA(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_DSA(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_DSA(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_DSA(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_EC(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_EC(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_EC(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_DH(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_DH(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_DH(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_RAND(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_RAND(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_RAND(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_ciphers(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_ciphers(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_ciphers(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_digests(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_digests(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_digests(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_pkey_meths(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_pkey_meths(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_pkey_meths(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_pkey_asn1_meths(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_unregister_pkey_asn1_meths(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 void ENGINE_register_all_pkey_asn1_meths(void); +# endif + +/* + * These functions register all support from the above categories. Note, use + * of these functions can result in static linkage of code your application + * may not need. If you only need a subset of functionality, consider using + * more selective initialisation. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_complete(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_register_all_complete(void); +# endif + +/* + * Send parameterised control commands to the engine. The possibilities to + * send down an integer, a pointer to data or a function pointer are + * provided. Any of the parameters may or may not be NULL, depending on the + * command number. In actuality, this function only requires a structural + * (rather than functional) reference to an engine, but many control commands + * may require the engine be functional. The caller should be aware of trying + * commands that require an operational ENGINE, and only use functional + * references in such situations. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, + void (*f) (void)); +# endif + +/* + * This function tests if an ENGINE-specific command is usable as a + * "setting". Eg. in an application's config file that gets processed through + * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to + * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_cmd_is_executable(ENGINE *e, int cmd); +# endif + +/* + * This function works like ENGINE_ctrl() with the exception of taking a + * command name instead of a command number, and can handle optional + * commands. See the comment on ENGINE_ctrl_cmd_string() for an explanation + * on how to use the cmd_name and cmd_optional. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name, + long i, void *p, void (*f) (void), + int cmd_optional); +# endif + +/* + * This function passes a command-name and argument to an ENGINE. The + * cmd_name is converted to a command number and the control command is + * called using 'arg' as an argument (unless the ENGINE doesn't support such + * a command, in which case no control command is called). The command is + * checked for input flags, and if necessary the argument will be converted + * to a numeric value. If cmd_optional is non-zero, then if the ENGINE + * doesn't support the given cmd_name the return value will be success + * anyway. This function is intended for applications to use so that users + * (or config files) can supply engine-specific config data to the ENGINE at + * run-time to control behaviour of specific engines. As such, it shouldn't + * be used for calling ENGINE_ctrl() functions that return data, deal with + * binary data, or that are otherwise supposed to be used directly through + * ENGINE_ctrl() in application code. Any "return" data from an ENGINE_ctrl() + * operation in this function will be lost - the return value is interpreted + * as failure if the return value is zero, success otherwise, and this + * function returns a boolean value as a result. In other words, vendors of + * 'ENGINE'-enabled devices should write ENGINE implementations with + * parameterisations that work in this scheme, so that compliant ENGINE-based + * applications can work consistently with the same configuration for the + * same ENGINE-enabled devices, across applications. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg, + int cmd_optional); +# endif + +/* + * These functions are useful for manufacturing new ENGINE structures. They + * don't address reference counting at all - one uses them to populate an + * ENGINE structure with personalised implementations of things prior to + * using it directly or adding it to the builtin ENGINE list in OpenSSL. + * These are also here so that the ENGINE structure doesn't have to be + * exposed and break binary compatibility! + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_new(void); +OSSL_DEPRECATEDIN_3_0 int ENGINE_free(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_up_ref(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_id(ENGINE *e, const char *id); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_name(ENGINE *e, const char *name); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_EC(ENGINE *e, const EC_KEY_METHOD *ecdsa_meth); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_destroy_function(ENGINE *e,ENGINE_GEN_INT_FUNC_PTR destroy_f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, + ENGINE_SSL_CLIENT_CERT_PTR loadssl_f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_flags(ENGINE *e, int flags); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_cmd_defns(ENGINE *e, + const ENGINE_CMD_DEFN *defns); +# endif +/* These functions allow control over any per-structure ENGINE data. */ +# define ENGINE_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_ENGINE, l, p, newf, dupf, freef) +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg); +OSSL_DEPRECATEDIN_3_0 void *ENGINE_get_ex_data(const ENGINE *e, int idx); +# endif + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* + * This function previously cleaned up anything that needs it. Auto-deinit will + * now take care of it so it is no longer required to call this function. + */ +# define ENGINE_cleanup() while(0) continue +# endif + +/* + * These return values from within the ENGINE structure. These can be useful + * with functional references as well as structural references - it depends + * which you obtained. Using the result for functional purposes if you only + * obtained a structural reference may be problematic! + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *ENGINE_get_id(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 const char *ENGINE_get_name(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 const EC_KEY_METHOD *ENGINE_get_EC(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 const DH_METHOD *ENGINE_get_DH(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid); +OSSL_DEPRECATEDIN_3_0 +const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid); +OSSL_DEPRECATEDIN_3_0 +const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid); +OSSL_DEPRECATEDIN_3_0 +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid); +OSSL_DEPRECATEDIN_3_0 +const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e, + const char *str, + int len); +OSSL_DEPRECATEDIN_3_0 +const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe, + const char *str, int len); +OSSL_DEPRECATEDIN_3_0 +const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_get_flags(const ENGINE *e); +# endif + +/* + * FUNCTIONAL functions. These functions deal with ENGINE structures that + * have (or will) be initialised for use. Broadly speaking, the structural + * functions are useful for iterating the list of available engine types, + * creating new engine types, and other "list" operations. These functions + * actually deal with ENGINEs that are to be used. As such these functions + * can fail (if applicable) when particular engines are unavailable - eg. if + * a hardware accelerator is not attached or not functioning correctly. Each + * ENGINE has 2 reference counts; structural and functional. Every time a + * functional reference is obtained or released, a corresponding structural + * reference is automatically obtained or released too. + */ + +/* + * Initialise a engine type for use (or up its reference count if it's + * already in use). This will fail if the engine is not currently operational + * and cannot initialise. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_init(ENGINE *e); +# endif +/* + * Free a functional reference to a engine type. This does not require a + * corresponding call to ENGINE_free as it also releases a structural + * reference. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_finish(ENGINE *e); +# endif + +/* + * The following functions handle keys that are stored in some secondary + * location, handled by the engine. The storage may be on a card or + * whatever. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +OSSL_DEPRECATEDIN_3_0 +EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, + UI_METHOD *ui_method, void *callback_data); +OSSL_DEPRECATEDIN_3_0 +int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, STACK_OF(X509_NAME) *ca_dn, + X509 **pcert, EVP_PKEY **ppkey, + STACK_OF(X509) **pother, + UI_METHOD *ui_method, void *callback_data); +# endif + +/* + * This returns a pointer for the current ENGINE structure that is (by + * default) performing any RSA operations. The value returned is an + * incremented reference, so it should be free'd (ENGINE_finish) before it is + * discarded. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_default_RSA(void); +# endif +/* Same for the other "methods" */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_default_DSA(void); +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_default_EC(void); +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_default_DH(void); +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_default_RAND(void); +# endif +/* + * These functions can be used to get a functional reference to perform + * ciphering or digesting corresponding to "nid". + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_cipher_engine(int nid); +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_digest_engine(int nid); +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_pkey_meth_engine(int nid); +OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid); +# endif + +/* + * This sets a new default ENGINE structure for performing RSA operations. If + * the result is non-zero (success) then the ENGINE structure will have had + * its reference count up'd so the caller should still free their own + * reference 'e'. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_RSA(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_string(ENGINE *e, + const char *def_list); +# endif +/* Same for the other "methods" */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_DSA(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_EC(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_DH(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_RAND(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_ciphers(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_digests(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_pkey_meths(ENGINE *e); +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default_pkey_asn1_meths(ENGINE *e); +# endif + +/* + * The combination "set" - the flags are bitwise "OR"d from the + * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()" + * function, this function can result in unnecessary static linkage. If your + * application requires only specific functionality, consider using more + * selective functions. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default(ENGINE *e, unsigned int flags); +OSSL_DEPRECATEDIN_3_0 void ENGINE_add_conf_module(void); +# endif + +/* Deprecated functions ... */ +/* int ENGINE_clear_defaults(void); */ + +/**************************/ +/* DYNAMIC ENGINE SUPPORT */ +/**************************/ + +/* Binary/behaviour compatibility levels */ +# define OSSL_DYNAMIC_VERSION (unsigned long)0x00030000 +/* + * Binary versions older than this are too old for us (whether we're a loader + * or a loadee) + */ +# define OSSL_DYNAMIC_OLDEST (unsigned long)0x00030000 + +/* + * When compiling an ENGINE entirely as an external shared library, loadable + * by the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' + * structure type provides the calling application's (or library's) error + * functionality and memory management function pointers to the loaded + * library. These should be used/set in the loaded library code so that the + * loading application's 'state' will be used/changed in all operations. The + * 'static_state' pointer allows the loaded library to know if it shares the + * same static data as the calling application (or library), and thus whether + * these callbacks need to be set or not. + */ +typedef void *(*dyn_MEM_malloc_fn) (size_t, const char *, int); +typedef void *(*dyn_MEM_realloc_fn) (void *, size_t, const char *, int); +typedef void (*dyn_MEM_free_fn) (void *, const char *, int); +typedef struct st_dynamic_MEM_fns { + dyn_MEM_malloc_fn malloc_fn; + dyn_MEM_realloc_fn realloc_fn; + dyn_MEM_free_fn free_fn; +} dynamic_MEM_fns; +/* + * FIXME: Perhaps the memory and locking code (crypto.h) should declare and + * use these types so we (and any other dependent code) can simplify a bit?? + */ +/* The top-level structure */ +typedef struct st_dynamic_fns { + void *static_state; + dynamic_MEM_fns mem_fns; +} dynamic_fns; + +/* + * The version checking function should be of this prototype. NB: The + * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading + * code. If this function returns zero, it indicates a (potential) version + * incompatibility and the loaded library doesn't believe it can proceed. + * Otherwise, the returned value is the (latest) version supported by the + * loading library. The loader may still decide that the loaded code's + * version is unsatisfactory and could veto the load. The function is + * expected to be implemented with the symbol name "v_check", and a default + * implementation can be fully instantiated with + * IMPLEMENT_DYNAMIC_CHECK_FN(). + */ +typedef unsigned long (*dynamic_v_check_fn) (unsigned long ossl_version); +# define IMPLEMENT_DYNAMIC_CHECK_FN() \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v); \ + OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \ + if (v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \ + return 0; } + +/* + * This function is passed the ENGINE structure to initialise with its own + * function and command settings. It should not adjust the structural or + * functional reference counts. If this function returns zero, (a) the load + * will be aborted, (b) the previous ENGINE state will be memcpy'd back onto + * the structure, and (c) the shared library will be unloaded. So + * implementations should do their own internal cleanup in failure + * circumstances otherwise they could leak. The 'id' parameter, if non-NULL, + * represents the ENGINE id that the loader is looking for. If this is NULL, + * the shared library can choose to return failure or to initialise a + * 'default' ENGINE. If non-NULL, the shared library must initialise only an + * ENGINE matching the passed 'id'. The function is expected to be + * implemented with the symbol name "bind_engine". A standard implementation + * can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where the parameter + * 'fn' is a callback function that populates the ENGINE structure and + * returns an int value (zero for failure). 'fn' should have prototype; + * [static] int fn(ENGINE *e, const char *id); + */ +typedef int (*dynamic_bind_engine) (ENGINE *e, const char *id, + const dynamic_fns *fns); +# define IMPLEMENT_DYNAMIC_BIND_FN(fn) \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \ + OPENSSL_EXPORT \ + int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \ + if (ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \ + CRYPTO_set_mem_functions(fns->mem_fns.malloc_fn, \ + fns->mem_fns.realloc_fn, \ + fns->mem_fns.free_fn); \ + OPENSSL_init_crypto(OPENSSL_INIT_NO_ATEXIT, NULL); \ + skip_cbs: \ + if (!fn(e, id)) return 0; \ + return 1; } + +/* + * If the loading application (or library) and the loaded ENGINE library + * share the same static data (eg. they're both dynamically linked to the + * same libcrypto.so) we need a way to avoid trying to set system callbacks - + * this would fail, and for the same reason that it's unnecessary to try. If + * the loaded ENGINE has (or gets from through the loader) its own copy of + * the libcrypto static data, we will need to set the callbacks. The easiest + * way to detect this is to have a function that returns a pointer to some + * static data and let the loading application and loaded ENGINE compare + * their respective values. + */ +void *ENGINE_get_static_state(void); + +# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void ENGINE_setup_bsd_cryptodev(void); +# endif +# endif + + +# ifdef __cplusplus +} +# endif +# endif /* OPENSSL_NO_ENGINE */ +#endif /* OPENSSL_ENGINE_H */ diff --git a/OtherInc/openssl/include/openssl/engineerr.h b/OtherInc/openssl/include/openssl/engineerr.h new file mode 100644 index 0000000..d439b68 --- /dev/null +++ b/OtherInc/openssl/include/openssl/engineerr.h @@ -0,0 +1,63 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_ENGINEERR_H +# define OPENSSL_ENGINEERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_ENGINE + + +/* + * ENGINE reason codes. + */ +# define ENGINE_R_ALREADY_LOADED 100 +# define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133 +# define ENGINE_R_CMD_NOT_EXECUTABLE 134 +# define ENGINE_R_COMMAND_TAKES_INPUT 135 +# define ENGINE_R_COMMAND_TAKES_NO_INPUT 136 +# define ENGINE_R_CONFLICTING_ENGINE_ID 103 +# define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 +# define ENGINE_R_DSO_FAILURE 104 +# define ENGINE_R_DSO_NOT_FOUND 132 +# define ENGINE_R_ENGINES_SECTION_ERROR 148 +# define ENGINE_R_ENGINE_CONFIGURATION_ERROR 102 +# define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 +# define ENGINE_R_ENGINE_SECTION_ERROR 149 +# define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 +# define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 +# define ENGINE_R_FINISH_FAILED 106 +# define ENGINE_R_ID_OR_NAME_MISSING 108 +# define ENGINE_R_INIT_FAILED 109 +# define ENGINE_R_INTERNAL_LIST_ERROR 110 +# define ENGINE_R_INVALID_ARGUMENT 143 +# define ENGINE_R_INVALID_CMD_NAME 137 +# define ENGINE_R_INVALID_CMD_NUMBER 138 +# define ENGINE_R_INVALID_INIT_VALUE 151 +# define ENGINE_R_INVALID_STRING 150 +# define ENGINE_R_NOT_INITIALISED 117 +# define ENGINE_R_NOT_LOADED 112 +# define ENGINE_R_NO_CONTROL_FUNCTION 120 +# define ENGINE_R_NO_INDEX 144 +# define ENGINE_R_NO_LOAD_FUNCTION 125 +# define ENGINE_R_NO_REFERENCE 130 +# define ENGINE_R_NO_SUCH_ENGINE 116 +# define ENGINE_R_UNIMPLEMENTED_CIPHER 146 +# define ENGINE_R_UNIMPLEMENTED_DIGEST 147 +# define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101 +# define ENGINE_R_VERSION_INCOMPATIBILITY 145 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/err.h b/OtherInc/openssl/include/openssl/err.h new file mode 100644 index 0000000..3c7299d --- /dev/null +++ b/OtherInc/openssl/include/openssl/err.h @@ -0,0 +1,492 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_ERR_H +# define OPENSSL_ERR_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_ERR_H +# endif + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# include +# endif + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_FILENAMES +# define ERR_PUT_error(l,f,r,fn,ln) ERR_put_error(l,f,r,fn,ln) +# else +# define ERR_PUT_error(l,f,r,fn,ln) ERR_put_error(l,f,r,NULL,0) +# endif +# endif + +# include +# include + +# define ERR_TXT_MALLOCED 0x01 +# define ERR_TXT_STRING 0x02 + +# if !defined(OPENSSL_NO_DEPRECATED_3_0) || defined(OSSL_FORCE_ERR_STATE) +# define ERR_FLAG_MARK 0x01 +# define ERR_FLAG_CLEAR 0x02 + +# define ERR_NUM_ERRORS 16 +struct err_state_st { + int err_flags[ERR_NUM_ERRORS]; + int err_marks[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + size_t err_data_size[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + char *err_func[ERR_NUM_ERRORS]; + int top, bottom; +}; +# endif + +/* library */ +# define ERR_LIB_NONE 1 +# define ERR_LIB_SYS 2 +# define ERR_LIB_BN 3 +# define ERR_LIB_RSA 4 +# define ERR_LIB_DH 5 +# define ERR_LIB_EVP 6 +# define ERR_LIB_BUF 7 +# define ERR_LIB_OBJ 8 +# define ERR_LIB_PEM 9 +# define ERR_LIB_DSA 10 +# define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +# define ERR_LIB_ASN1 13 +# define ERR_LIB_CONF 14 +# define ERR_LIB_CRYPTO 15 +# define ERR_LIB_EC 16 +# define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +# define ERR_LIB_BIO 32 +# define ERR_LIB_PKCS7 33 +# define ERR_LIB_X509V3 34 +# define ERR_LIB_PKCS12 35 +# define ERR_LIB_RAND 36 +# define ERR_LIB_DSO 37 +# define ERR_LIB_ENGINE 38 +# define ERR_LIB_OCSP 39 +# define ERR_LIB_UI 40 +# define ERR_LIB_COMP 41 +# define ERR_LIB_ECDSA 42 +# define ERR_LIB_ECDH 43 +# define ERR_LIB_OSSL_STORE 44 +# define ERR_LIB_FIPS 45 +# define ERR_LIB_CMS 46 +# define ERR_LIB_TS 47 +# define ERR_LIB_HMAC 48 +/* # define ERR_LIB_JPAKE 49 */ +# define ERR_LIB_CT 50 +# define ERR_LIB_ASYNC 51 +# define ERR_LIB_KDF 52 +# define ERR_LIB_SM2 53 +# define ERR_LIB_ESS 54 +# define ERR_LIB_PROP 55 +# define ERR_LIB_CRMF 56 +# define ERR_LIB_PROV 57 +# define ERR_LIB_CMP 58 +# define ERR_LIB_OSSL_ENCODER 59 +# define ERR_LIB_OSSL_DECODER 60 +# define ERR_LIB_HTTP 61 + +# define ERR_LIB_USER 128 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define ASN1err(f, r) ERR_raise_data(ERR_LIB_ASN1, (r), NULL) +# define ASYNCerr(f, r) ERR_raise_data(ERR_LIB_ASYNC, (r), NULL) +# define BIOerr(f, r) ERR_raise_data(ERR_LIB_BIO, (r), NULL) +# define BNerr(f, r) ERR_raise_data(ERR_LIB_BN, (r), NULL) +# define BUFerr(f, r) ERR_raise_data(ERR_LIB_BUF, (r), NULL) +# define CMPerr(f, r) ERR_raise_data(ERR_LIB_CMP, (r), NULL) +# define CMSerr(f, r) ERR_raise_data(ERR_LIB_CMS, (r), NULL) +# define COMPerr(f, r) ERR_raise_data(ERR_LIB_COMP, (r), NULL) +# define CONFerr(f, r) ERR_raise_data(ERR_LIB_CONF, (r), NULL) +# define CRMFerr(f, r) ERR_raise_data(ERR_LIB_CRMF, (r), NULL) +# define CRYPTOerr(f, r) ERR_raise_data(ERR_LIB_CRYPTO, (r), NULL) +# define CTerr(f, r) ERR_raise_data(ERR_LIB_CT, (r), NULL) +# define DHerr(f, r) ERR_raise_data(ERR_LIB_DH, (r), NULL) +# define DSAerr(f, r) ERR_raise_data(ERR_LIB_DSA, (r), NULL) +# define DSOerr(f, r) ERR_raise_data(ERR_LIB_DSO, (r), NULL) +# define ECDHerr(f, r) ERR_raise_data(ERR_LIB_ECDH, (r), NULL) +# define ECDSAerr(f, r) ERR_raise_data(ERR_LIB_ECDSA, (r), NULL) +# define ECerr(f, r) ERR_raise_data(ERR_LIB_EC, (r), NULL) +# define ENGINEerr(f, r) ERR_raise_data(ERR_LIB_ENGINE, (r), NULL) +# define ESSerr(f, r) ERR_raise_data(ERR_LIB_ESS, (r), NULL) +# define EVPerr(f, r) ERR_raise_data(ERR_LIB_EVP, (r), NULL) +# define FIPSerr(f, r) ERR_raise_data(ERR_LIB_FIPS, (r), NULL) +# define HMACerr(f, r) ERR_raise_data(ERR_LIB_HMAC, (r), NULL) +# define HTTPerr(f, r) ERR_raise_data(ERR_LIB_HTTP, (r), NULL) +# define KDFerr(f, r) ERR_raise_data(ERR_LIB_KDF, (r), NULL) +# define OBJerr(f, r) ERR_raise_data(ERR_LIB_OBJ, (r), NULL) +# define OCSPerr(f, r) ERR_raise_data(ERR_LIB_OCSP, (r), NULL) +# define OSSL_STOREerr(f, r) ERR_raise_data(ERR_LIB_OSSL_STORE, (r), NULL) +# define PEMerr(f, r) ERR_raise_data(ERR_LIB_PEM, (r), NULL) +# define PKCS12err(f, r) ERR_raise_data(ERR_LIB_PKCS12, (r), NULL) +# define PKCS7err(f, r) ERR_raise_data(ERR_LIB_PKCS7, (r), NULL) +# define PROPerr(f, r) ERR_raise_data(ERR_LIB_PROP, (r), NULL) +# define PROVerr(f, r) ERR_raise_data(ERR_LIB_PROV, (r), NULL) +# define RANDerr(f, r) ERR_raise_data(ERR_LIB_RAND, (r), NULL) +# define RSAerr(f, r) ERR_raise_data(ERR_LIB_RSA, (r), NULL) +# define KDFerr(f, r) ERR_raise_data(ERR_LIB_KDF, (r), NULL) +# define SM2err(f, r) ERR_raise_data(ERR_LIB_SM2, (r), NULL) +# define SSLerr(f, r) ERR_raise_data(ERR_LIB_SSL, (r), NULL) +# define SYSerr(f, r) ERR_raise_data(ERR_LIB_SYS, (r), NULL) +# define TSerr(f, r) ERR_raise_data(ERR_LIB_TS, (r), NULL) +# define UIerr(f, r) ERR_raise_data(ERR_LIB_UI, (r), NULL) +# define X509V3err(f, r) ERR_raise_data(ERR_LIB_X509V3, (r), NULL) +# define X509err(f, r) ERR_raise_data(ERR_LIB_X509, (r), NULL) +# endif + +/*- + * The error code packs differently depending on if it records a system + * error or an OpenSSL error. + * + * A system error packs like this (we follow POSIX and only allow positive + * numbers that fit in an |int|): + * + * +-+-------------------------------------------------------------+ + * |1| system error number | + * +-+-------------------------------------------------------------+ + * + * An OpenSSL error packs like this: + * + * <---------------------------- 32 bits --------------------------> + * <--- 8 bits ---><------------------ 23 bits -----------------> + * +-+---------------+---------------------------------------------+ + * |0| library | reason | + * +-+---------------+---------------------------------------------+ + * + * A few of the reason bits are reserved as flags with special meaning: + * + * <5 bits-<>--------- 19 bits -----------------> + * +-------+-+-----------------------------------+ + * | rflags| | reason | + * +-------+-+-----------------------------------+ + * ^ + * | + * ERR_RFLAG_FATAL = ERR_R_FATAL + * + * The reason flags are part of the overall reason code for practical + * reasons, as they provide an easy way to place different types of + * reason codes in different numeric ranges. + * + * The currently known reason flags are: + * + * ERR_RFLAG_FATAL Flags that the reason code is considered fatal. + * For backward compatibility reasons, this flag + * is also the code for ERR_R_FATAL (that reason + * code served the dual purpose of flag and reason + * code in one in pre-3.0 OpenSSL). + * ERR_RFLAG_COMMON Flags that the reason code is common to all + * libraries. All ERR_R_ macros must use this flag, + * and no other _R_ macro is allowed to use it. + */ + +/* Macros to help decode recorded system errors */ +# define ERR_SYSTEM_FLAG ((unsigned int)INT_MAX + 1) +# define ERR_SYSTEM_MASK ((unsigned int)INT_MAX) + +/* + * Macros to help decode recorded OpenSSL errors + * As expressed above, RFLAGS and REASON overlap by one bit to allow + * ERR_R_FATAL to use ERR_RFLAG_FATAL as its reason code. + */ +# define ERR_LIB_OFFSET 23L +# define ERR_LIB_MASK 0xFF +# define ERR_RFLAGS_OFFSET 18L +# define ERR_RFLAGS_MASK 0x1F +# define ERR_REASON_MASK 0X7FFFFF + +/* + * Reason flags are defined pre-shifted to easily combine with the reason + * number. + */ +# define ERR_RFLAG_FATAL (0x1 << ERR_RFLAGS_OFFSET) +# define ERR_RFLAG_COMMON (0x2 << ERR_RFLAGS_OFFSET) + +# define ERR_SYSTEM_ERROR(errcode) (((errcode) & ERR_SYSTEM_FLAG) != 0) + +static ossl_unused ossl_inline int ERR_GET_LIB(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return ERR_LIB_SYS; + return (errcode >> ERR_LIB_OFFSET) & ERR_LIB_MASK; +} + +static ossl_unused ossl_inline int ERR_GET_RFLAGS(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return 0; + return errcode & (ERR_RFLAGS_MASK << ERR_RFLAGS_OFFSET); +} + +static ossl_unused ossl_inline int ERR_GET_REASON(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return errcode & ERR_SYSTEM_MASK; + return errcode & ERR_REASON_MASK; +} + +static ossl_unused ossl_inline int ERR_FATAL_ERROR(unsigned long errcode) +{ + return (ERR_GET_RFLAGS(errcode) & ERR_RFLAG_FATAL) != 0; +} + +static ossl_unused ossl_inline int ERR_COMMON_ERROR(unsigned long errcode) +{ + return (ERR_GET_RFLAGS(errcode) & ERR_RFLAG_COMMON) != 0; +} + +/* + * ERR_PACK is a helper macro to properly pack OpenSSL error codes and may + * only be used for that purpose. System errors are packed internally. + * ERR_PACK takes reason flags and reason code combined in |reason|. + * ERR_PACK ignores |func|, that parameter is just legacy from pre-3.0 OpenSSL. + */ +# define ERR_PACK(lib,func,reason) \ + ( (((unsigned long)(lib) & ERR_LIB_MASK ) << ERR_LIB_OFFSET) | \ + (((unsigned long)(reason) & ERR_REASON_MASK)) ) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SYS_F_FOPEN 0 +# define SYS_F_CONNECT 0 +# define SYS_F_GETSERVBYNAME 0 +# define SYS_F_SOCKET 0 +# define SYS_F_IOCTLSOCKET 0 +# define SYS_F_BIND 0 +# define SYS_F_LISTEN 0 +# define SYS_F_ACCEPT 0 +# define SYS_F_WSASTARTUP 0 +# define SYS_F_OPENDIR 0 +# define SYS_F_FREAD 0 +# define SYS_F_GETADDRINFO 0 +# define SYS_F_GETNAMEINFO 0 +# define SYS_F_SETSOCKOPT 0 +# define SYS_F_GETSOCKOPT 0 +# define SYS_F_GETSOCKNAME 0 +# define SYS_F_GETHOSTBYNAME 0 +# define SYS_F_FFLUSH 0 +# define SYS_F_OPEN 0 +# define SYS_F_CLOSE 0 +# define SYS_F_IOCTL 0 +# define SYS_F_STAT 0 +# define SYS_F_FCNTL 0 +# define SYS_F_FSTAT 0 +# define SYS_F_SENDFILE 0 +# endif + +/* + * All ERR_R_ codes must be combined with ERR_RFLAG_COMMON. + */ + +/* "we came from here" global reason codes, range 1..255 */ +# define ERR_R_SYS_LIB (ERR_LIB_SYS/* 2 */ | ERR_RFLAG_COMMON) +# define ERR_R_BN_LIB (ERR_LIB_BN/* 3 */ | ERR_RFLAG_COMMON) +# define ERR_R_RSA_LIB (ERR_LIB_RSA/* 4 */ | ERR_RFLAG_COMMON) +# define ERR_R_DH_LIB (ERR_LIB_DH/* 5 */ | ERR_RFLAG_COMMON) +# define ERR_R_EVP_LIB (ERR_LIB_EVP/* 6 */ | ERR_RFLAG_COMMON) +# define ERR_R_BUF_LIB (ERR_LIB_BUF/* 7 */ | ERR_RFLAG_COMMON) +# define ERR_R_OBJ_LIB (ERR_LIB_OBJ/* 8 */ | ERR_RFLAG_COMMON) +# define ERR_R_PEM_LIB (ERR_LIB_PEM/* 9 */ | ERR_RFLAG_COMMON) +# define ERR_R_DSA_LIB (ERR_LIB_DSA/* 10 */ | ERR_RFLAG_COMMON) +# define ERR_R_X509_LIB (ERR_LIB_X509/* 11 */ | ERR_RFLAG_COMMON) +# define ERR_R_ASN1_LIB (ERR_LIB_ASN1/* 13 */ | ERR_RFLAG_COMMON) +# define ERR_R_CRYPTO_LIB (ERR_LIB_CRYPTO/* 15 */ | ERR_RFLAG_COMMON) +# define ERR_R_EC_LIB (ERR_LIB_EC/* 16 */ | ERR_RFLAG_COMMON) +# define ERR_R_BIO_LIB (ERR_LIB_BIO/* 32 */ | ERR_RFLAG_COMMON) +# define ERR_R_PKCS7_LIB (ERR_LIB_PKCS7/* 33 */ | ERR_RFLAG_COMMON) +# define ERR_R_X509V3_LIB (ERR_LIB_X509V3/* 34 */ | ERR_RFLAG_COMMON) +# define ERR_R_ENGINE_LIB (ERR_LIB_ENGINE/* 38 */ | ERR_RFLAG_COMMON) +# define ERR_R_UI_LIB (ERR_LIB_UI/* 40 */ | ERR_RFLAG_COMMON) +# define ERR_R_ECDSA_LIB (ERR_LIB_ECDSA/* 42 */ | ERR_RFLAG_COMMON) +# define ERR_R_OSSL_STORE_LIB (ERR_LIB_OSSL_STORE/* 44 */ | ERR_RFLAG_COMMON) +# define ERR_R_OSSL_DECODER_LIB (ERR_LIB_OSSL_DECODER/* 60 */ | ERR_RFLAG_COMMON) + +/* Other common error codes, range 256..2^ERR_RFLAGS_OFFSET-1 */ +# define ERR_R_FATAL (ERR_RFLAG_FATAL|ERR_RFLAG_COMMON) +# define ERR_R_MALLOC_FAILURE (256|ERR_R_FATAL) +# define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (257|ERR_R_FATAL) +# define ERR_R_PASSED_NULL_PARAMETER (258|ERR_R_FATAL) +# define ERR_R_INTERNAL_ERROR (259|ERR_R_FATAL) +# define ERR_R_DISABLED (260|ERR_R_FATAL) +# define ERR_R_INIT_FAIL (261|ERR_R_FATAL) +# define ERR_R_PASSED_INVALID_ARGUMENT (262|ERR_RFLAG_COMMON) +# define ERR_R_OPERATION_FAIL (263|ERR_R_FATAL) +# define ERR_R_INVALID_PROVIDER_FUNCTIONS (264|ERR_R_FATAL) +# define ERR_R_INTERRUPTED_OR_CANCELLED (265|ERR_RFLAG_COMMON) +# define ERR_R_NESTED_ASN1_ERROR (266|ERR_RFLAG_COMMON) +# define ERR_R_MISSING_ASN1_EOS (267|ERR_RFLAG_COMMON) +# define ERR_R_UNSUPPORTED (268|ERR_RFLAG_COMMON) +# define ERR_R_FETCH_FAILED (269|ERR_RFLAG_COMMON) +# define ERR_R_INVALID_PROPERTY_DEFINITION (270|ERR_RFLAG_COMMON) +# define ERR_R_UNABLE_TO_GET_READ_LOCK (271|ERR_R_FATAL) +# define ERR_R_UNABLE_TO_GET_WRITE_LOCK (272|ERR_R_FATAL) + +typedef struct ERR_string_data_st { + unsigned long error; + const char *string; +} ERR_STRING_DATA; + +DEFINE_LHASH_OF_INTERNAL(ERR_STRING_DATA); +#define lh_ERR_STRING_DATA_new(hfn, cmp) ((LHASH_OF(ERR_STRING_DATA) *)OPENSSL_LH_new(ossl_check_ERR_STRING_DATA_lh_hashfunc_type(hfn), ossl_check_ERR_STRING_DATA_lh_compfunc_type(cmp))) +#define lh_ERR_STRING_DATA_free(lh) OPENSSL_LH_free(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_flush(lh) OPENSSL_LH_flush(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_insert(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_insert(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_delete(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_delete(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_const_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_retrieve(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_retrieve(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_const_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_error(lh) OPENSSL_LH_error(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_num_items(lh) OPENSSL_LH_num_items(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_ERR_STRING_DATA_lh_type(lh), dl) +#define lh_ERR_STRING_DATA_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_ERR_STRING_DATA_lh_doallfunc_type(dfn)) + + +/* 12 lines and some on an 80 column terminal */ +#define ERR_MAX_DATA_SIZE 1024 + +/* Building blocks */ +void ERR_new(void); +void ERR_set_debug(const char *file, int line, const char *func); +void ERR_set_error(int lib, int reason, const char *fmt, ...); +void ERR_vset_error(int lib, int reason, const char *fmt, va_list args); + +/* Main error raising functions */ +# define ERR_raise(lib, reason) ERR_raise_data((lib),(reason),NULL) +# define ERR_raise_data \ + (ERR_new(), \ + ERR_set_debug(OPENSSL_FILE,OPENSSL_LINE,OPENSSL_FUNC), \ + ERR_set_error) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* Backward compatibility */ +# define ERR_put_error(lib, func, reason, file, line) \ + (ERR_new(), \ + ERR_set_debug((file), (line), OPENSSL_FUNC), \ + ERR_set_error((lib), (reason), NULL)) +# endif + +void ERR_set_error_data(char *data, int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_get_error_line(const char **file, int *line); +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_get_error_line_data(const char **file, int *line, + const char **data, int *flags); +#endif +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file, int *line); +unsigned long ERR_peek_error_func(const char **func); +unsigned long ERR_peek_error_data(const char **data, int *flags); +unsigned long ERR_peek_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_peek_error_line_data(const char **file, int *line, + const char **data, int *flags); +# endif +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file, int *line); +unsigned long ERR_peek_last_error_func(const char **func); +unsigned long ERR_peek_last_error_data(const char **data, int *flags); +unsigned long ERR_peek_last_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); +# endif + +void ERR_clear_error(void); + +char *ERR_error_string(unsigned long e, char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *ERR_func_error_string(unsigned long e); +# endif +const char *ERR_reason_error_string(unsigned long e); + +void ERR_print_errors_cb(int (*cb) (const char *str, size_t len, void *u), + void *u); +# ifndef OPENSSL_NO_STDIO +void ERR_print_errors_fp(FILE *fp); +# endif +void ERR_print_errors(BIO *bp); + +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +void ERR_add_error_txt(const char *sepr, const char *txt); +void ERR_add_error_mem_bio(const char *sep, BIO *bio); + +int ERR_load_strings(int lib, ERR_STRING_DATA *str); +int ERR_load_strings_const(const ERR_STRING_DATA *str); +int ERR_unload_strings(int lib, ERR_STRING_DATA *str); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define ERR_load_crypto_strings() \ + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) +# define ERR_free_strings() while(0) continue +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void ERR_remove_thread_state(void *); +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_0_0 +OSSL_DEPRECATEDIN_1_0_0 void ERR_remove_state(unsigned long pid); +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ERR_STATE *ERR_get_state(void); +#endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); +int ERR_clear_last_mark(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/OtherInc/openssl/include/openssl/ess.h b/OtherInc/openssl/include/openssl/ess.h new file mode 100644 index 0000000..dad596a --- /dev/null +++ b/OtherInc/openssl/include/openssl/ess.h @@ -0,0 +1,128 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\ess.h.in + * + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_ESS_H +# define OPENSSL_ESS_H +# pragma once + +# include + +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + + +typedef struct ESS_issuer_serial ESS_ISSUER_SERIAL; +typedef struct ESS_cert_id ESS_CERT_ID; +typedef struct ESS_signing_cert ESS_SIGNING_CERT; + +SKM_DEFINE_STACK_OF_INTERNAL(ESS_CERT_ID, ESS_CERT_ID, ESS_CERT_ID) +#define sk_ESS_CERT_ID_num(sk) OPENSSL_sk_num(ossl_check_const_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_value(sk, idx) ((ESS_CERT_ID *)OPENSSL_sk_value(ossl_check_const_ESS_CERT_ID_sk_type(sk), (idx))) +#define sk_ESS_CERT_ID_new(cmp) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new(ossl_check_ESS_CERT_ID_compfunc_type(cmp))) +#define sk_ESS_CERT_ID_new_null() ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new_null()) +#define sk_ESS_CERT_ID_new_reserve(cmp, n) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new_reserve(ossl_check_ESS_CERT_ID_compfunc_type(cmp), (n))) +#define sk_ESS_CERT_ID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ESS_CERT_ID_sk_type(sk), (n)) +#define sk_ESS_CERT_ID_free(sk) OPENSSL_sk_free(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_zero(sk) OPENSSL_sk_zero(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_delete(sk, i) ((ESS_CERT_ID *)OPENSSL_sk_delete(ossl_check_ESS_CERT_ID_sk_type(sk), (i))) +#define sk_ESS_CERT_ID_delete_ptr(sk, ptr) ((ESS_CERT_ID *)OPENSSL_sk_delete_ptr(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr))) +#define sk_ESS_CERT_ID_push(sk, ptr) OPENSSL_sk_push(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_pop(sk) ((ESS_CERT_ID *)OPENSSL_sk_pop(ossl_check_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_shift(sk) ((ESS_CERT_ID *)OPENSSL_sk_shift(ossl_check_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ESS_CERT_ID_sk_type(sk),ossl_check_ESS_CERT_ID_freefunc_type(freefunc)) +#define sk_ESS_CERT_ID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr), (idx)) +#define sk_ESS_CERT_ID_set(sk, idx, ptr) ((ESS_CERT_ID *)OPENSSL_sk_set(ossl_check_ESS_CERT_ID_sk_type(sk), (idx), ossl_check_ESS_CERT_ID_type(ptr))) +#define sk_ESS_CERT_ID_find(sk, ptr) OPENSSL_sk_find(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr), pnum) +#define sk_ESS_CERT_ID_sort(sk) OPENSSL_sk_sort(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_dup(sk) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_dup(ossl_check_const_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_deep_copy(ossl_check_const_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_copyfunc_type(copyfunc), ossl_check_ESS_CERT_ID_freefunc_type(freefunc))) +#define sk_ESS_CERT_ID_set_cmp_func(sk, cmp) ((sk_ESS_CERT_ID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_compfunc_type(cmp))) + + + +typedef struct ESS_signing_cert_v2_st ESS_SIGNING_CERT_V2; +typedef struct ESS_cert_id_v2_st ESS_CERT_ID_V2; + +SKM_DEFINE_STACK_OF_INTERNAL(ESS_CERT_ID_V2, ESS_CERT_ID_V2, ESS_CERT_ID_V2) +#define sk_ESS_CERT_ID_V2_num(sk) OPENSSL_sk_num(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_value(sk, idx) ((ESS_CERT_ID_V2 *)OPENSSL_sk_value(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk), (idx))) +#define sk_ESS_CERT_ID_V2_new(cmp) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new(ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp))) +#define sk_ESS_CERT_ID_V2_new_null() ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new_null()) +#define sk_ESS_CERT_ID_V2_new_reserve(cmp, n) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new_reserve(ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp), (n))) +#define sk_ESS_CERT_ID_V2_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (n)) +#define sk_ESS_CERT_ID_V2_free(sk) OPENSSL_sk_free(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_zero(sk) OPENSSL_sk_zero(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_delete(sk, i) ((ESS_CERT_ID_V2 *)OPENSSL_sk_delete(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (i))) +#define sk_ESS_CERT_ID_V2_delete_ptr(sk, ptr) ((ESS_CERT_ID_V2 *)OPENSSL_sk_delete_ptr(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr))) +#define sk_ESS_CERT_ID_V2_push(sk, ptr) OPENSSL_sk_push(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_pop(sk) ((ESS_CERT_ID_V2 *)OPENSSL_sk_pop(ossl_check_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_shift(sk) ((ESS_CERT_ID_V2 *)OPENSSL_sk_shift(ossl_check_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ESS_CERT_ID_V2_sk_type(sk),ossl_check_ESS_CERT_ID_V2_freefunc_type(freefunc)) +#define sk_ESS_CERT_ID_V2_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr), (idx)) +#define sk_ESS_CERT_ID_V2_set(sk, idx, ptr) ((ESS_CERT_ID_V2 *)OPENSSL_sk_set(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (idx), ossl_check_ESS_CERT_ID_V2_type(ptr))) +#define sk_ESS_CERT_ID_V2_find(sk, ptr) OPENSSL_sk_find(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr), pnum) +#define sk_ESS_CERT_ID_V2_sort(sk) OPENSSL_sk_sort(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_dup(sk) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_dup(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_deep_copy(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_copyfunc_type(copyfunc), ossl_check_ESS_CERT_ID_V2_freefunc_type(freefunc))) +#define sk_ESS_CERT_ID_V2_set_cmp_func(sk, cmp) ((sk_ESS_CERT_ID_V2_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp))) + + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_ISSUER_SERIAL) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_ISSUER_SERIAL, ESS_ISSUER_SERIAL) +DECLARE_ASN1_DUP_FUNCTION(ESS_ISSUER_SERIAL) + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_CERT_ID) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_CERT_ID, ESS_CERT_ID) +DECLARE_ASN1_DUP_FUNCTION(ESS_CERT_ID) + +DECLARE_ASN1_FUNCTIONS(ESS_SIGNING_CERT) +DECLARE_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT) + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_CERT_ID_V2) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_CERT_ID_V2, ESS_CERT_ID_V2) +DECLARE_ASN1_DUP_FUNCTION(ESS_CERT_ID_V2) + +DECLARE_ASN1_FUNCTIONS(ESS_SIGNING_CERT_V2) +DECLARE_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT_V2) + +ESS_SIGNING_CERT *OSSL_ESS_signing_cert_new_init(const X509 *signcert, + const STACK_OF(X509) *certs, + int set_issuer_serial); +ESS_SIGNING_CERT_V2 *OSSL_ESS_signing_cert_v2_new_init(const EVP_MD *hash_alg, + const X509 *signcert, + const + STACK_OF(X509) *certs, + int set_issuer_serial); +int OSSL_ESS_check_signing_certs(const ESS_SIGNING_CERT *ss, + const ESS_SIGNING_CERT_V2 *ssv2, + const STACK_OF(X509) *chain, + int require_signing_cert); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/esserr.h b/OtherInc/openssl/include/openssl/esserr.h new file mode 100644 index 0000000..165ce7c --- /dev/null +++ b/OtherInc/openssl/include/openssl/esserr.h @@ -0,0 +1,32 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_ESSERR_H +# define OPENSSL_ESSERR_H +# pragma once + +# include +# include +# include + +/* + * ESS reason codes. + */ +# define ESS_R_EMPTY_ESS_CERT_ID_LIST 107 +# define ESS_R_ESS_CERT_DIGEST_ERROR 103 +# define ESS_R_ESS_CERT_ID_NOT_FOUND 104 +# define ESS_R_ESS_CERT_ID_WRONG_ORDER 105 +# define ESS_R_ESS_DIGEST_ALG_UNKNOWN 106 +# define ESS_R_ESS_SIGNING_CERTIFICATE_ERROR 102 +# define ESS_R_ESS_SIGNING_CERT_ADD_ERROR 100 +# define ESS_R_ESS_SIGNING_CERT_V2_ADD_ERROR 101 +# define ESS_R_MISSING_SIGNING_CERTIFICATE_ATTRIBUTE 108 + +#endif diff --git a/OtherInc/openssl/include/openssl/evp.h b/OtherInc/openssl/include/openssl/evp.h new file mode 100644 index 0000000..49e8e1d --- /dev/null +++ b/OtherInc/openssl/include/openssl/evp.h @@ -0,0 +1,2170 @@ +/* + * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_EVP_H +# define OPENSSL_EVP_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_ENVELOPE_H +# endif + +# include + +# ifndef OPENSSL_NO_STDIO +# include +# endif + +# include +# include +# include +# include +# include +# include +# include +# include + +# define EVP_MAX_MD_SIZE 64/* longest known is SHA512 */ +# define EVP_MAX_KEY_LENGTH 64 +# define EVP_MAX_IV_LENGTH 16 +# define EVP_MAX_BLOCK_LENGTH 32 + +# define PKCS5_SALT_LEN 8 +/* Default PKCS#5 iteration count */ +# define PKCS5_DEFAULT_ITER 2048 + +# include + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define EVP_PK_RSA 0x0001 +# define EVP_PK_DSA 0x0002 +# define EVP_PK_DH 0x0004 +# define EVP_PK_EC 0x0008 +# define EVP_PKT_SIGN 0x0010 +# define EVP_PKT_ENC 0x0020 +# define EVP_PKT_EXCH 0x0040 +# define EVP_PKS_RSA 0x0100 +# define EVP_PKS_DSA 0x0200 +# define EVP_PKS_EC 0x0400 +# endif + +# define EVP_PKEY_NONE NID_undef +# define EVP_PKEY_RSA NID_rsaEncryption +# define EVP_PKEY_RSA2 NID_rsa +# define EVP_PKEY_RSA_PSS NID_rsassaPss +# define EVP_PKEY_DSA NID_dsa +# define EVP_PKEY_DSA1 NID_dsa_2 +# define EVP_PKEY_DSA2 NID_dsaWithSHA +# define EVP_PKEY_DSA3 NID_dsaWithSHA1 +# define EVP_PKEY_DSA4 NID_dsaWithSHA1_2 +# define EVP_PKEY_DH NID_dhKeyAgreement +# define EVP_PKEY_DHX NID_dhpublicnumber +# define EVP_PKEY_EC NID_X9_62_id_ecPublicKey +# define EVP_PKEY_SM2 NID_sm2 +# define EVP_PKEY_HMAC NID_hmac +# define EVP_PKEY_CMAC NID_cmac +# define EVP_PKEY_SCRYPT NID_id_scrypt +# define EVP_PKEY_TLS1_PRF NID_tls1_prf +# define EVP_PKEY_HKDF NID_hkdf +# define EVP_PKEY_POLY1305 NID_poly1305 +# define EVP_PKEY_SIPHASH NID_siphash +# define EVP_PKEY_X25519 NID_X25519 +# define EVP_PKEY_ED25519 NID_ED25519 +# define EVP_PKEY_X448 NID_X448 +# define EVP_PKEY_ED448 NID_ED448 +/* Special indicator that the object is uniquely provider side */ +# define EVP_PKEY_KEYMGMT -1 + +/* Easy to use macros for EVP_PKEY related selections */ +# define EVP_PKEY_KEY_PARAMETERS \ + ( OSSL_KEYMGMT_SELECT_ALL_PARAMETERS ) +# define EVP_PKEY_PUBLIC_KEY \ + ( EVP_PKEY_KEY_PARAMETERS | OSSL_KEYMGMT_SELECT_PUBLIC_KEY ) +# define EVP_PKEY_KEYPAIR \ + ( EVP_PKEY_PUBLIC_KEY | OSSL_KEYMGMT_SELECT_PRIVATE_KEY ) + +#ifdef __cplusplus +extern "C" { +#endif + +int EVP_set_default_properties(OSSL_LIB_CTX *libctx, const char *propq); +int EVP_default_properties_is_fips_enabled(OSSL_LIB_CTX *libctx); +int EVP_default_properties_enable_fips(OSSL_LIB_CTX *libctx, int enable); + +# define EVP_PKEY_MO_SIGN 0x0001 +# define EVP_PKEY_MO_VERIFY 0x0002 +# define EVP_PKEY_MO_ENCRYPT 0x0004 +# define EVP_PKEY_MO_DECRYPT 0x0008 + +# ifndef EVP_MD +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 EVP_MD *EVP_MD_meth_new(int md_type, int pkey_type); +OSSL_DEPRECATEDIN_3_0 EVP_MD *EVP_MD_meth_dup(const EVP_MD *md); +OSSL_DEPRECATEDIN_3_0 void EVP_MD_meth_free(EVP_MD *md); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_input_blocksize(EVP_MD *md, int blocksize); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_result_size(EVP_MD *md, int resultsize); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_app_datasize(EVP_MD *md, int datasize); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_flags(EVP_MD *md, unsigned long flags); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_init(EVP_MD *md, int (*init)(EVP_MD_CTX *ctx)); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_update(EVP_MD *md, int (*update)(EVP_MD_CTX *ctx, + const void *data, + size_t count)); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_final(EVP_MD *md, int (*final)(EVP_MD_CTX *ctx, + unsigned char *md)); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_copy(EVP_MD *md, int (*copy)(EVP_MD_CTX *to, + const EVP_MD_CTX *from)); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_cleanup(EVP_MD *md, int (*cleanup)(EVP_MD_CTX *ctx)); +OSSL_DEPRECATEDIN_3_0 +int EVP_MD_meth_set_ctrl(EVP_MD *md, int (*ctrl)(EVP_MD_CTX *ctx, int cmd, + int p1, void *p2)); +OSSL_DEPRECATEDIN_3_0 int EVP_MD_meth_get_input_blocksize(const EVP_MD *md); +OSSL_DEPRECATEDIN_3_0 int EVP_MD_meth_get_result_size(const EVP_MD *md); +OSSL_DEPRECATEDIN_3_0 int EVP_MD_meth_get_app_datasize(const EVP_MD *md); +OSSL_DEPRECATEDIN_3_0 unsigned long EVP_MD_meth_get_flags(const EVP_MD *md); +OSSL_DEPRECATEDIN_3_0 +int (*EVP_MD_meth_get_init(const EVP_MD *md))(EVP_MD_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 +int (*EVP_MD_meth_get_update(const EVP_MD *md))(EVP_MD_CTX *ctx, + const void *data, size_t count); +OSSL_DEPRECATEDIN_3_0 +int (*EVP_MD_meth_get_final(const EVP_MD *md))(EVP_MD_CTX *ctx, + unsigned char *md); +OSSL_DEPRECATEDIN_3_0 +int (*EVP_MD_meth_get_copy(const EVP_MD *md))(EVP_MD_CTX *to, + const EVP_MD_CTX *from); +OSSL_DEPRECATEDIN_3_0 +int (*EVP_MD_meth_get_cleanup(const EVP_MD *md))(EVP_MD_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 +int (*EVP_MD_meth_get_ctrl(const EVP_MD *md))(EVP_MD_CTX *ctx, int cmd, + int p1, void *p2); +# endif +/* digest can only handle a single block */ +# define EVP_MD_FLAG_ONESHOT 0x0001 + +/* digest is extensible-output function, XOF */ +# define EVP_MD_FLAG_XOF 0x0002 + +/* DigestAlgorithmIdentifier flags... */ + +# define EVP_MD_FLAG_DIGALGID_MASK 0x0018 + +/* NULL or absent parameter accepted. Use NULL */ + +# define EVP_MD_FLAG_DIGALGID_NULL 0x0000 + +/* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */ + +# define EVP_MD_FLAG_DIGALGID_ABSENT 0x0008 + +/* Custom handling via ctrl */ + +# define EVP_MD_FLAG_DIGALGID_CUSTOM 0x0018 + +/* Note if suitable for use in FIPS mode */ +# define EVP_MD_FLAG_FIPS 0x0400 + +/* Digest ctrls */ + +# define EVP_MD_CTRL_DIGALGID 0x1 +# define EVP_MD_CTRL_MICALG 0x2 +# define EVP_MD_CTRL_XOF_LEN 0x3 +# define EVP_MD_CTRL_TLSTREE 0x4 + +/* Minimum Algorithm specific ctrl value */ + +# define EVP_MD_CTRL_ALG_CTRL 0x1000 + +# endif /* !EVP_MD */ + +/* values for EVP_MD_CTX flags */ + +# define EVP_MD_CTX_FLAG_ONESHOT 0x0001/* digest update will be + * called once only */ +# define EVP_MD_CTX_FLAG_CLEANED 0x0002/* context has already been + * cleaned */ +# define EVP_MD_CTX_FLAG_REUSE 0x0004/* Don't free up ctx->md_data + * in EVP_MD_CTX_reset */ +/* + * FIPS and pad options are ignored in 1.0.0, definitions are here so we + * don't accidentally reuse the values for other purposes. + */ + +/* This flag has no effect from openssl-3.0 onwards */ +# define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW 0x0008 + +/* + * The following PAD options are also currently ignored in 1.0.0, digest + * parameters are handled through EVP_DigestSign*() and EVP_DigestVerify*() + * instead. + */ +# define EVP_MD_CTX_FLAG_PAD_MASK 0xF0/* RSA mode to use */ +# define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00/* PKCS#1 v1.5 mode */ +# define EVP_MD_CTX_FLAG_PAD_X931 0x10/* X9.31 mode */ +# define EVP_MD_CTX_FLAG_PAD_PSS 0x20/* PSS mode */ + +# define EVP_MD_CTX_FLAG_NO_INIT 0x0100/* Don't initialize md_data */ +/* + * Some functions such as EVP_DigestSign only finalise copies of internal + * contexts so additional data can be included after the finalisation call. + * This is inefficient if this functionality is not required: it is disabled + * if the following flag is set. + */ +# define EVP_MD_CTX_FLAG_FINALISE 0x0200 +/* NOTE: 0x0400 is reserved for internal usage */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +EVP_CIPHER *EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len); +OSSL_DEPRECATEDIN_3_0 +EVP_CIPHER *EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher); +OSSL_DEPRECATEDIN_3_0 +void EVP_CIPHER_meth_free(EVP_CIPHER *cipher); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher, + int (*init) (EVP_CIPHER_CTX *ctx, + const unsigned char *key, + const unsigned char *iv, + int enc)); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher, + int (*do_cipher) (EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + size_t inl)); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher, + int (*cleanup) (EVP_CIPHER_CTX *)); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher, + int (*set_asn1_parameters) (EVP_CIPHER_CTX *, + ASN1_TYPE *)); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher, + int (*get_asn1_parameters) (EVP_CIPHER_CTX *, + ASN1_TYPE *)); +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher, + int (*ctrl) (EVP_CIPHER_CTX *, int type, + int arg, void *ptr)); +OSSL_DEPRECATEDIN_3_0 int +(*EVP_CIPHER_meth_get_init(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, + const unsigned char *key, + const unsigned char *iv, + int enc); +OSSL_DEPRECATEDIN_3_0 int +(*EVP_CIPHER_meth_get_do_cipher(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + size_t inl); +OSSL_DEPRECATEDIN_3_0 int +(*EVP_CIPHER_meth_get_cleanup(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *); +OSSL_DEPRECATEDIN_3_0 int +(*EVP_CIPHER_meth_get_set_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, + ASN1_TYPE *); +OSSL_DEPRECATEDIN_3_0 int +(*EVP_CIPHER_meth_get_get_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, + ASN1_TYPE *); +OSSL_DEPRECATEDIN_3_0 int +(*EVP_CIPHER_meth_get_ctrl(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, int type, + int arg, void *ptr); +# endif + +/* Values for cipher flags */ + +/* Modes for ciphers */ + +# define EVP_CIPH_STREAM_CIPHER 0x0 +# define EVP_CIPH_ECB_MODE 0x1 +# define EVP_CIPH_CBC_MODE 0x2 +# define EVP_CIPH_CFB_MODE 0x3 +# define EVP_CIPH_OFB_MODE 0x4 +# define EVP_CIPH_CTR_MODE 0x5 +# define EVP_CIPH_GCM_MODE 0x6 +# define EVP_CIPH_CCM_MODE 0x7 +# define EVP_CIPH_XTS_MODE 0x10001 +# define EVP_CIPH_WRAP_MODE 0x10002 +# define EVP_CIPH_OCB_MODE 0x10003 +# define EVP_CIPH_SIV_MODE 0x10004 +# define EVP_CIPH_MODE 0xF0007 +/* Set if variable length cipher */ +# define EVP_CIPH_VARIABLE_LENGTH 0x8 +/* Set if the iv handling should be done by the cipher itself */ +# define EVP_CIPH_CUSTOM_IV 0x10 +/* Set if the cipher's init() function should be called if key is NULL */ +# define EVP_CIPH_ALWAYS_CALL_INIT 0x20 +/* Call ctrl() to init cipher parameters */ +# define EVP_CIPH_CTRL_INIT 0x40 +/* Don't use standard key length function */ +# define EVP_CIPH_CUSTOM_KEY_LENGTH 0x80 +/* Don't use standard block padding */ +# define EVP_CIPH_NO_PADDING 0x100 +/* cipher handles random key generation */ +# define EVP_CIPH_RAND_KEY 0x200 +/* cipher has its own additional copying logic */ +# define EVP_CIPH_CUSTOM_COPY 0x400 +/* Don't use standard iv length function */ +# define EVP_CIPH_CUSTOM_IV_LENGTH 0x800 +/* Legacy and no longer relevant: Allow use default ASN1 get/set iv */ +# define EVP_CIPH_FLAG_DEFAULT_ASN1 0 +/* Free: 0x1000 */ +/* Buffer length in bits not bytes: CFB1 mode only */ +# define EVP_CIPH_FLAG_LENGTH_BITS 0x2000 +/* Deprecated FIPS flag: was 0x4000 */ +# define EVP_CIPH_FLAG_FIPS 0 +/* Deprecated FIPS flag: was 0x8000 */ +# define EVP_CIPH_FLAG_NON_FIPS_ALLOW 0 + +/* + * Cipher handles any and all padding logic as well as finalisation. + */ +# define EVP_CIPH_FLAG_CTS 0x4000 +# define EVP_CIPH_FLAG_CUSTOM_CIPHER 0x100000 +# define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 +# define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0x400000 +/* Cipher can handle pipeline operations */ +# define EVP_CIPH_FLAG_PIPELINE 0X800000 +/* For provider implementations that handle ASN1 get/set param themselves */ +# define EVP_CIPH_FLAG_CUSTOM_ASN1 0x1000000 +/* For ciphers generating unprotected CMS attributes */ +# define EVP_CIPH_FLAG_CIPHER_WITH_MAC 0x2000000 +/* For supplementary wrap cipher support */ +# define EVP_CIPH_FLAG_GET_WRAP_CIPHER 0x4000000 +# define EVP_CIPH_FLAG_INVERSE_CIPHER 0x8000000 + +/* + * Cipher context flag to indicate we can handle wrap mode: if allowed in + * older applications it could overflow buffers. + */ + +# define EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 0x1 + +/* ctrl() values */ + +# define EVP_CTRL_INIT 0x0 +# define EVP_CTRL_SET_KEY_LENGTH 0x1 +# define EVP_CTRL_GET_RC2_KEY_BITS 0x2 +# define EVP_CTRL_SET_RC2_KEY_BITS 0x3 +# define EVP_CTRL_GET_RC5_ROUNDS 0x4 +# define EVP_CTRL_SET_RC5_ROUNDS 0x5 +# define EVP_CTRL_RAND_KEY 0x6 +# define EVP_CTRL_PBE_PRF_NID 0x7 +# define EVP_CTRL_COPY 0x8 +# define EVP_CTRL_AEAD_SET_IVLEN 0x9 +# define EVP_CTRL_AEAD_GET_TAG 0x10 +# define EVP_CTRL_AEAD_SET_TAG 0x11 +# define EVP_CTRL_AEAD_SET_IV_FIXED 0x12 +# define EVP_CTRL_GCM_SET_IVLEN EVP_CTRL_AEAD_SET_IVLEN +# define EVP_CTRL_GCM_GET_TAG EVP_CTRL_AEAD_GET_TAG +# define EVP_CTRL_GCM_SET_TAG EVP_CTRL_AEAD_SET_TAG +# define EVP_CTRL_GCM_SET_IV_FIXED EVP_CTRL_AEAD_SET_IV_FIXED +# define EVP_CTRL_GCM_IV_GEN 0x13 +# define EVP_CTRL_CCM_SET_IVLEN EVP_CTRL_AEAD_SET_IVLEN +# define EVP_CTRL_CCM_GET_TAG EVP_CTRL_AEAD_GET_TAG +# define EVP_CTRL_CCM_SET_TAG EVP_CTRL_AEAD_SET_TAG +# define EVP_CTRL_CCM_SET_IV_FIXED EVP_CTRL_AEAD_SET_IV_FIXED +# define EVP_CTRL_CCM_SET_L 0x14 +# define EVP_CTRL_CCM_SET_MSGLEN 0x15 +/* + * AEAD cipher deduces payload length and returns number of bytes required to + * store MAC and eventual padding. Subsequent call to EVP_Cipher even + * appends/verifies MAC. + */ +# define EVP_CTRL_AEAD_TLS1_AAD 0x16 +/* Used by composite AEAD ciphers, no-op in GCM, CCM... */ +# define EVP_CTRL_AEAD_SET_MAC_KEY 0x17 +/* Set the GCM invocation field, decrypt only */ +# define EVP_CTRL_GCM_SET_IV_INV 0x18 + +# define EVP_CTRL_TLS1_1_MULTIBLOCK_AAD 0x19 +# define EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT 0x1a +# define EVP_CTRL_TLS1_1_MULTIBLOCK_DECRYPT 0x1b +# define EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE 0x1c + +# define EVP_CTRL_SSL3_MASTER_SECRET 0x1d + +/* EVP_CTRL_SET_SBOX takes the char * specifying S-boxes */ +# define EVP_CTRL_SET_SBOX 0x1e +/* + * EVP_CTRL_SBOX_USED takes a 'size_t' and 'char *', pointing at a + * pre-allocated buffer with specified size + */ +# define EVP_CTRL_SBOX_USED 0x1f +/* EVP_CTRL_KEY_MESH takes 'size_t' number of bytes to mesh the key after, + * 0 switches meshing off + */ +# define EVP_CTRL_KEY_MESH 0x20 +/* EVP_CTRL_BLOCK_PADDING_MODE takes the padding mode */ +# define EVP_CTRL_BLOCK_PADDING_MODE 0x21 + +/* Set the output buffers to use for a pipelined operation */ +# define EVP_CTRL_SET_PIPELINE_OUTPUT_BUFS 0x22 +/* Set the input buffers to use for a pipelined operation */ +# define EVP_CTRL_SET_PIPELINE_INPUT_BUFS 0x23 +/* Set the input buffer lengths to use for a pipelined operation */ +# define EVP_CTRL_SET_PIPELINE_INPUT_LENS 0x24 +/* Get the IV length used by the cipher */ +# define EVP_CTRL_GET_IVLEN 0x25 +/* 0x26 is unused */ +/* Tell the cipher it's doing a speed test (SIV disallows multiple ops) */ +# define EVP_CTRL_SET_SPEED 0x27 +/* Get the unprotectedAttrs from cipher ctx */ +# define EVP_CTRL_PROCESS_UNPROTECTED 0x28 +/* Get the supplementary wrap cipher */ +#define EVP_CTRL_GET_WRAP_CIPHER 0x29 +/* TLSTREE key diversification */ +#define EVP_CTRL_TLSTREE 0x2A + +/* Padding modes */ +#define EVP_PADDING_PKCS7 1 +#define EVP_PADDING_ISO7816_4 2 +#define EVP_PADDING_ANSI923 3 +#define EVP_PADDING_ISO10126 4 +#define EVP_PADDING_ZERO 5 + +/* RFC 5246 defines additional data to be 13 bytes in length */ +# define EVP_AEAD_TLS1_AAD_LEN 13 + +typedef struct { + unsigned char *out; + const unsigned char *inp; + size_t len; + unsigned int interleave; +} EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM; + +/* GCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +# define EVP_GCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +# define EVP_GCM_TLS_EXPLICIT_IV_LEN 8 +/* Length of tag for TLS */ +# define EVP_GCM_TLS_TAG_LEN 16 + +/* CCM TLS constants */ +/* Length of fixed part of IV derived from PRF */ +# define EVP_CCM_TLS_FIXED_IV_LEN 4 +/* Length of explicit part of IV part of TLS records */ +# define EVP_CCM_TLS_EXPLICIT_IV_LEN 8 +/* Total length of CCM IV length for TLS */ +# define EVP_CCM_TLS_IV_LEN 12 +/* Length of tag for TLS */ +# define EVP_CCM_TLS_TAG_LEN 16 +/* Length of CCM8 tag for TLS */ +# define EVP_CCM8_TLS_TAG_LEN 8 + +/* Length of tag for TLS */ +# define EVP_CHACHAPOLY_TLS_TAG_LEN 16 + +typedef struct evp_cipher_info_st { + const EVP_CIPHER *cipher; + unsigned char iv[EVP_MAX_IV_LENGTH]; +} EVP_CIPHER_INFO; + + +/* Password based encryption function */ +typedef int (EVP_PBE_KEYGEN) (EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de); + +typedef int (EVP_PBE_KEYGEN_EX) (EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *cipher, const EVP_MD *md, + int en_de, OSSL_LIB_CTX *libctx, const char *propq); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\ + (rsa)) +# endif + +# ifndef OPENSSL_NO_DSA +# define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\ + (dsa)) +# endif + +# if !defined(OPENSSL_NO_DH) && !defined(OPENSSL_NO_DEPRECATED_3_0) +# define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,(dh)) +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_EC +# define EVP_PKEY_assign_EC_KEY(pkey,eckey) \ + EVP_PKEY_assign((pkey), EVP_PKEY_EC, (eckey)) +# endif +# endif +# ifndef OPENSSL_NO_SIPHASH +# define EVP_PKEY_assign_SIPHASH(pkey,shkey) EVP_PKEY_assign((pkey),\ + EVP_PKEY_SIPHASH,(shkey)) +# endif + +# ifndef OPENSSL_NO_POLY1305 +# define EVP_PKEY_assign_POLY1305(pkey,polykey) EVP_PKEY_assign((pkey),\ + EVP_PKEY_POLY1305,(polykey)) +# endif + +/* Add some extra combinations */ +# define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a)) +# define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a)) +# define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) +# define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) + +int EVP_MD_get_type(const EVP_MD *md); +# define EVP_MD_type EVP_MD_get_type +# define EVP_MD_nid EVP_MD_get_type +const char *EVP_MD_get0_name(const EVP_MD *md); +# define EVP_MD_name EVP_MD_get0_name +const char *EVP_MD_get0_description(const EVP_MD *md); +int EVP_MD_is_a(const EVP_MD *md, const char *name); +int EVP_MD_names_do_all(const EVP_MD *md, + void (*fn)(const char *name, void *data), + void *data); +const OSSL_PROVIDER *EVP_MD_get0_provider(const EVP_MD *md); +int EVP_MD_get_pkey_type(const EVP_MD *md); +# define EVP_MD_pkey_type EVP_MD_get_pkey_type +int EVP_MD_get_size(const EVP_MD *md); +# define EVP_MD_size EVP_MD_get_size +int EVP_MD_get_block_size(const EVP_MD *md); +# define EVP_MD_block_size EVP_MD_get_block_size +unsigned long EVP_MD_get_flags(const EVP_MD *md); +# define EVP_MD_flags EVP_MD_get_flags + +const EVP_MD *EVP_MD_CTX_get0_md(const EVP_MD_CTX *ctx); +EVP_MD *EVP_MD_CTX_get1_md(EVP_MD_CTX *ctx); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 +int (*EVP_MD_CTX_update_fn(EVP_MD_CTX *ctx))(EVP_MD_CTX *ctx, + const void *data, size_t count); +OSSL_DEPRECATEDIN_3_0 +void EVP_MD_CTX_set_update_fn(EVP_MD_CTX *ctx, + int (*update) (EVP_MD_CTX *ctx, + const void *data, size_t count)); +# endif +# define EVP_MD_CTX_get0_name(e) EVP_MD_get0_name(EVP_MD_CTX_get0_md(e)) +# define EVP_MD_CTX_get_size(e) EVP_MD_get_size(EVP_MD_CTX_get0_md(e)) +# define EVP_MD_CTX_size EVP_MD_CTX_get_size +# define EVP_MD_CTX_get_block_size(e) EVP_MD_get_block_size(EVP_MD_CTX_get0_md(e)) +# define EVP_MD_CTX_block_size EVP_MD_CTX_get_block_size +# define EVP_MD_CTX_get_type(e) EVP_MD_get_type(EVP_MD_CTX_get0_md(e)) +# define EVP_MD_CTX_type EVP_MD_CTX_get_type +EVP_PKEY_CTX *EVP_MD_CTX_get_pkey_ctx(const EVP_MD_CTX *ctx); +# define EVP_MD_CTX_pkey_ctx EVP_MD_CTX_get_pkey_ctx +void EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx); +void *EVP_MD_CTX_get0_md_data(const EVP_MD_CTX *ctx); +# define EVP_MD_CTX_md_data EVP_MD_CTX_get0_md_data + +int EVP_CIPHER_get_nid(const EVP_CIPHER *cipher); +# define EVP_CIPHER_nid EVP_CIPHER_get_nid +const char *EVP_CIPHER_get0_name(const EVP_CIPHER *cipher); +# define EVP_CIPHER_name EVP_CIPHER_get0_name +const char *EVP_CIPHER_get0_description(const EVP_CIPHER *cipher); +int EVP_CIPHER_is_a(const EVP_CIPHER *cipher, const char *name); +int EVP_CIPHER_names_do_all(const EVP_CIPHER *cipher, + void (*fn)(const char *name, void *data), + void *data); +const OSSL_PROVIDER *EVP_CIPHER_get0_provider(const EVP_CIPHER *cipher); +int EVP_CIPHER_get_block_size(const EVP_CIPHER *cipher); +# define EVP_CIPHER_block_size EVP_CIPHER_get_block_size +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int EVP_CIPHER_impl_ctx_size(const EVP_CIPHER *cipher); +# endif +int EVP_CIPHER_get_key_length(const EVP_CIPHER *cipher); +# define EVP_CIPHER_key_length EVP_CIPHER_get_key_length +int EVP_CIPHER_get_iv_length(const EVP_CIPHER *cipher); +# define EVP_CIPHER_iv_length EVP_CIPHER_get_iv_length +unsigned long EVP_CIPHER_get_flags(const EVP_CIPHER *cipher); +# define EVP_CIPHER_flags EVP_CIPHER_get_flags +int EVP_CIPHER_get_mode(const EVP_CIPHER *cipher); +# define EVP_CIPHER_mode EVP_CIPHER_get_mode +int EVP_CIPHER_get_type(const EVP_CIPHER *cipher); +# define EVP_CIPHER_type EVP_CIPHER_get_type +EVP_CIPHER *EVP_CIPHER_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, + const char *properties); +int EVP_CIPHER_up_ref(EVP_CIPHER *cipher); +void EVP_CIPHER_free(EVP_CIPHER *cipher); + +const EVP_CIPHER *EVP_CIPHER_CTX_get0_cipher(const EVP_CIPHER_CTX *ctx); +EVP_CIPHER *EVP_CIPHER_CTX_get1_cipher(EVP_CIPHER_CTX *ctx); +int EVP_CIPHER_CTX_is_encrypting(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_encrypting EVP_CIPHER_CTX_is_encrypting +int EVP_CIPHER_CTX_get_nid(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_nid EVP_CIPHER_CTX_get_nid +int EVP_CIPHER_CTX_get_block_size(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_block_size EVP_CIPHER_CTX_get_block_size +int EVP_CIPHER_CTX_get_key_length(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_key_length EVP_CIPHER_CTX_get_key_length +int EVP_CIPHER_CTX_get_iv_length(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_iv_length EVP_CIPHER_CTX_get_iv_length +int EVP_CIPHER_CTX_get_tag_length(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_tag_length EVP_CIPHER_CTX_get_tag_length +# ifndef OPENSSL_NO_DEPRECATED_3_0 +const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 const unsigned char *EVP_CIPHER_CTX_iv(const EVP_CIPHER_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 const unsigned char *EVP_CIPHER_CTX_original_iv(const EVP_CIPHER_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 unsigned char *EVP_CIPHER_CTX_iv_noconst(EVP_CIPHER_CTX *ctx); +# endif +int EVP_CIPHER_CTX_get_updated_iv(EVP_CIPHER_CTX *ctx, void *buf, size_t len); +int EVP_CIPHER_CTX_get_original_iv(EVP_CIPHER_CTX *ctx, void *buf, size_t len); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned char *EVP_CIPHER_CTX_buf_noconst(EVP_CIPHER_CTX *ctx); +# endif +int EVP_CIPHER_CTX_get_num(const EVP_CIPHER_CTX *ctx); +# define EVP_CIPHER_CTX_num EVP_CIPHER_CTX_get_num +int EVP_CIPHER_CTX_set_num(EVP_CIPHER_CTX *ctx, int num); +int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in); +void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx); +void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data); +void *EVP_CIPHER_CTX_get_cipher_data(const EVP_CIPHER_CTX *ctx); +void *EVP_CIPHER_CTX_set_cipher_data(EVP_CIPHER_CTX *ctx, void *cipher_data); +# define EVP_CIPHER_CTX_get0_name(c) EVP_CIPHER_get0_name(EVP_CIPHER_CTX_get0_cipher(c)) +# define EVP_CIPHER_CTX_get_type(c) EVP_CIPHER_get_type(EVP_CIPHER_CTX_get0_cipher(c)) +# define EVP_CIPHER_CTX_type EVP_CIPHER_CTX_get_type +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define EVP_CIPHER_CTX_flags(c) EVP_CIPHER_get_flags(EVP_CIPHER_CTX_get0_cipher(c)) +# endif +# define EVP_CIPHER_CTX_get_mode(c) EVP_CIPHER_get_mode(EVP_CIPHER_CTX_get0_cipher(c)) +# define EVP_CIPHER_CTX_mode EVP_CIPHER_CTX_get_mode + +# define EVP_ENCODE_LENGTH(l) ((((l)+2)/3*4)+((l)/48+1)*2+80) +# define EVP_DECODE_LENGTH(l) (((l)+3)/4*3+80) + +# define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_SignInit(a,b) EVP_DigestInit(a,b) +# define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c) +# define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) +# define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) +# define EVP_OpenUpdate(a,b,c,d,e) EVP_DecryptUpdate(a,b,c,d,e) +# define EVP_SealUpdate(a,b,c,d,e) EVP_EncryptUpdate(a,b,c,d,e) + +# ifdef CONST_STRICT +void BIO_set_md(BIO *, const EVP_MD *md); +# else +# define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,0,(void *)(md)) +# endif +# define BIO_get_md(b,mdp) BIO_ctrl(b,BIO_C_GET_MD,0,(mdp)) +# define BIO_get_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_GET_MD_CTX,0,(mdcp)) +# define BIO_set_md_ctx(b,mdcp) BIO_ctrl(b,BIO_C_SET_MD_CTX,0,(mdcp)) +# define BIO_get_cipher_status(b) BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL) +# define BIO_get_cipher_ctx(b,c_pp) BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,(c_pp)) + +/*__owur*/ int EVP_Cipher(EVP_CIPHER_CTX *c, + unsigned char *out, + const unsigned char *in, unsigned int inl); + +# define EVP_add_cipher_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_add_digest_alias(n,alias) \ + OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n)) +# define EVP_delete_cipher_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS); +# define EVP_delete_digest_alias(alias) \ + OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS); + +int EVP_MD_get_params(const EVP_MD *digest, OSSL_PARAM params[]); +int EVP_MD_CTX_set_params(EVP_MD_CTX *ctx, const OSSL_PARAM params[]); +int EVP_MD_CTX_get_params(EVP_MD_CTX *ctx, OSSL_PARAM params[]); +const OSSL_PARAM *EVP_MD_gettable_params(const EVP_MD *digest); +const OSSL_PARAM *EVP_MD_settable_ctx_params(const EVP_MD *md); +const OSSL_PARAM *EVP_MD_gettable_ctx_params(const EVP_MD *md); +const OSSL_PARAM *EVP_MD_CTX_settable_params(EVP_MD_CTX *ctx); +const OSSL_PARAM *EVP_MD_CTX_gettable_params(EVP_MD_CTX *ctx); +int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2); +EVP_MD_CTX *EVP_MD_CTX_new(void); +int EVP_MD_CTX_reset(EVP_MD_CTX *ctx); +void EVP_MD_CTX_free(EVP_MD_CTX *ctx); +# define EVP_MD_CTX_create() EVP_MD_CTX_new() +# define EVP_MD_CTX_init(ctx) EVP_MD_CTX_reset((ctx)) +# define EVP_MD_CTX_destroy(ctx) EVP_MD_CTX_free((ctx)) +__owur int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in); +void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); +void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); +int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags); +__owur int EVP_DigestInit_ex2(EVP_MD_CTX *ctx, const EVP_MD *type, + const OSSL_PARAM params[]); +__owur int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, + ENGINE *impl); +__owur int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, + size_t cnt); +__owur int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, + unsigned int *s); +__owur int EVP_Digest(const void *data, size_t count, + unsigned char *md, unsigned int *size, + const EVP_MD *type, ENGINE *impl); +__owur int EVP_Q_digest(OSSL_LIB_CTX *libctx, const char *name, + const char *propq, const void *data, size_t datalen, + unsigned char *md, size_t *mdlen); + +__owur int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in); +__owur int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); +__owur int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, + unsigned int *s); +__owur int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, + size_t len); + +__owur EVP_MD *EVP_MD_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, + const char *properties); + +int EVP_MD_up_ref(EVP_MD *md); +void EVP_MD_free(EVP_MD *md); + +int EVP_read_pw_string(char *buf, int length, const char *prompt, int verify); +int EVP_read_pw_string_min(char *buf, int minlen, int maxlen, + const char *prompt, int verify); +void EVP_set_pw_prompt(const char *prompt); +char *EVP_get_pw_prompt(void); + +__owur int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, + const unsigned char *salt, + const unsigned char *data, int datal, int count, + unsigned char *key, unsigned char *iv); + +void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags); +void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags); +int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags); + +__owur int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +/*__owur*/ int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, + const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key, + const unsigned char *iv); +__owur int EVP_EncryptInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, + const unsigned char *iv, + const OSSL_PARAM params[]); +/*__owur*/ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +/*__owur*/ int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl); +/*__owur*/ int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl); + +__owur int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv); +/*__owur*/ int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, + const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key, + const unsigned char *iv); +__owur int EVP_DecryptInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, + const unsigned char *iv, + const OSSL_PARAM params[]); +/*__owur*/ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +__owur int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, + int *outl); +/*__owur*/ int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, + int *outl); + +__owur int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv, + int enc); +/*__owur*/ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, + const EVP_CIPHER *cipher, ENGINE *impl, + const unsigned char *key, + const unsigned char *iv, int enc); +__owur int EVP_CipherInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, + const unsigned char *key, const unsigned char *iv, + int enc, const OSSL_PARAM params[]); +__owur int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, const unsigned char *in, int inl); +__owur int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, + int *outl); +__owur int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, + int *outl); + +__owur int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, + EVP_PKEY *pkey); +__owur int EVP_SignFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, + EVP_PKEY *pkey, OSSL_LIB_CTX *libctx, + const char *propq); + +__owur int EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, + size_t *siglen, const unsigned char *tbs, + size_t tbslen); + +__owur int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, + unsigned int siglen, EVP_PKEY *pkey); +__owur int EVP_VerifyFinal_ex(EVP_MD_CTX *ctx, const unsigned char *sigbuf, + unsigned int siglen, EVP_PKEY *pkey, + OSSL_LIB_CTX *libctx, const char *propq); + +__owur int EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, + size_t siglen, const unsigned char *tbs, + size_t tbslen); + +int EVP_DigestSignInit_ex(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const char *mdname, OSSL_LIB_CTX *libctx, + const char *props, EVP_PKEY *pkey, + const OSSL_PARAM params[]); +/*__owur*/ int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, + EVP_PKEY *pkey); +int EVP_DigestSignUpdate(EVP_MD_CTX *ctx, const void *data, size_t dsize); +__owur int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + size_t *siglen); + +int EVP_DigestVerifyInit_ex(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const char *mdname, OSSL_LIB_CTX *libctx, + const char *props, EVP_PKEY *pkey, + const OSSL_PARAM params[]); +__owur int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, + EVP_PKEY *pkey); +int EVP_DigestVerifyUpdate(EVP_MD_CTX *ctx, const void *data, size_t dsize); +__owur int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sig, + size_t siglen); + +__owur int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + const unsigned char *ek, int ekl, + const unsigned char *iv, EVP_PKEY *priv); +__owur int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +__owur int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, + unsigned char **ek, int *ekl, unsigned char *iv, + EVP_PKEY **pubk, int npubk); +__owur int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); + +EVP_ENCODE_CTX *EVP_ENCODE_CTX_new(void); +void EVP_ENCODE_CTX_free(EVP_ENCODE_CTX *ctx); +int EVP_ENCODE_CTX_copy(EVP_ENCODE_CTX *dctx, const EVP_ENCODE_CTX *sctx); +int EVP_ENCODE_CTX_num(EVP_ENCODE_CTX *ctx); +void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); +int EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl); +int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); + +void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); +int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inl); +int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned + char *out, int *outl); +int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define EVP_CIPHER_CTX_init(c) EVP_CIPHER_CTX_reset(c) +# define EVP_CIPHER_CTX_cleanup(c) EVP_CIPHER_CTX_reset(c) +# endif +EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); +int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *c); +void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *c); +int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); +int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); +int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); +int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key); +int EVP_CIPHER_get_params(EVP_CIPHER *cipher, OSSL_PARAM params[]); +int EVP_CIPHER_CTX_set_params(EVP_CIPHER_CTX *ctx, const OSSL_PARAM params[]); +int EVP_CIPHER_CTX_get_params(EVP_CIPHER_CTX *ctx, OSSL_PARAM params[]); +const OSSL_PARAM *EVP_CIPHER_gettable_params(const EVP_CIPHER *cipher); +const OSSL_PARAM *EVP_CIPHER_settable_ctx_params(const EVP_CIPHER *cipher); +const OSSL_PARAM *EVP_CIPHER_gettable_ctx_params(const EVP_CIPHER *cipher); +const OSSL_PARAM *EVP_CIPHER_CTX_settable_params(EVP_CIPHER_CTX *ctx); +const OSSL_PARAM *EVP_CIPHER_CTX_gettable_params(EVP_CIPHER_CTX *ctx); + +const BIO_METHOD *BIO_f_md(void); +const BIO_METHOD *BIO_f_base64(void); +const BIO_METHOD *BIO_f_cipher(void); +const BIO_METHOD *BIO_f_reliable(void); +__owur int BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k, + const unsigned char *i, int enc); + +const EVP_MD *EVP_md_null(void); +# ifndef OPENSSL_NO_MD2 +const EVP_MD *EVP_md2(void); +# endif +# ifndef OPENSSL_NO_MD4 +const EVP_MD *EVP_md4(void); +# endif +# ifndef OPENSSL_NO_MD5 +const EVP_MD *EVP_md5(void); +const EVP_MD *EVP_md5_sha1(void); +# endif +# ifndef OPENSSL_NO_BLAKE2 +const EVP_MD *EVP_blake2b512(void); +const EVP_MD *EVP_blake2s256(void); +# endif +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_sha224(void); +const EVP_MD *EVP_sha256(void); +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); +const EVP_MD *EVP_sha512_224(void); +const EVP_MD *EVP_sha512_256(void); +const EVP_MD *EVP_sha3_224(void); +const EVP_MD *EVP_sha3_256(void); +const EVP_MD *EVP_sha3_384(void); +const EVP_MD *EVP_sha3_512(void); +const EVP_MD *EVP_shake128(void); +const EVP_MD *EVP_shake256(void); + +# ifndef OPENSSL_NO_MDC2 +const EVP_MD *EVP_mdc2(void); +# endif +# ifndef OPENSSL_NO_RMD160 +const EVP_MD *EVP_ripemd160(void); +# endif +# ifndef OPENSSL_NO_WHIRLPOOL +const EVP_MD *EVP_whirlpool(void); +# endif +# ifndef OPENSSL_NO_SM3 +const EVP_MD *EVP_sm3(void); +# endif +const EVP_CIPHER *EVP_enc_null(void); /* does nothing :-) */ +# ifndef OPENSSL_NO_DES +const EVP_CIPHER *EVP_des_ecb(void); +const EVP_CIPHER *EVP_des_ede(void); +const EVP_CIPHER *EVP_des_ede3(void); +const EVP_CIPHER *EVP_des_ede_ecb(void); +const EVP_CIPHER *EVP_des_ede3_ecb(void); +const EVP_CIPHER *EVP_des_cfb64(void); +# define EVP_des_cfb EVP_des_cfb64 +const EVP_CIPHER *EVP_des_cfb1(void); +const EVP_CIPHER *EVP_des_cfb8(void); +const EVP_CIPHER *EVP_des_ede_cfb64(void); +# define EVP_des_ede_cfb EVP_des_ede_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb64(void); +# define EVP_des_ede3_cfb EVP_des_ede3_cfb64 +const EVP_CIPHER *EVP_des_ede3_cfb1(void); +const EVP_CIPHER *EVP_des_ede3_cfb8(void); +const EVP_CIPHER *EVP_des_ofb(void); +const EVP_CIPHER *EVP_des_ede_ofb(void); +const EVP_CIPHER *EVP_des_ede3_ofb(void); +const EVP_CIPHER *EVP_des_cbc(void); +const EVP_CIPHER *EVP_des_ede_cbc(void); +const EVP_CIPHER *EVP_des_ede3_cbc(void); +const EVP_CIPHER *EVP_desx_cbc(void); +const EVP_CIPHER *EVP_des_ede3_wrap(void); +/* + * This should now be supported through the dev_crypto ENGINE. But also, why + * are rc4 and md5 declarations made here inside a "NO_DES" precompiler + * branch? + */ +# endif +# ifndef OPENSSL_NO_RC4 +const EVP_CIPHER *EVP_rc4(void); +const EVP_CIPHER *EVP_rc4_40(void); +# ifndef OPENSSL_NO_MD5 +const EVP_CIPHER *EVP_rc4_hmac_md5(void); +# endif +# endif +# ifndef OPENSSL_NO_IDEA +const EVP_CIPHER *EVP_idea_ecb(void); +const EVP_CIPHER *EVP_idea_cfb64(void); +# define EVP_idea_cfb EVP_idea_cfb64 +const EVP_CIPHER *EVP_idea_ofb(void); +const EVP_CIPHER *EVP_idea_cbc(void); +# endif +# ifndef OPENSSL_NO_RC2 +const EVP_CIPHER *EVP_rc2_ecb(void); +const EVP_CIPHER *EVP_rc2_cbc(void); +const EVP_CIPHER *EVP_rc2_40_cbc(void); +const EVP_CIPHER *EVP_rc2_64_cbc(void); +const EVP_CIPHER *EVP_rc2_cfb64(void); +# define EVP_rc2_cfb EVP_rc2_cfb64 +const EVP_CIPHER *EVP_rc2_ofb(void); +# endif +# ifndef OPENSSL_NO_BF +const EVP_CIPHER *EVP_bf_ecb(void); +const EVP_CIPHER *EVP_bf_cbc(void); +const EVP_CIPHER *EVP_bf_cfb64(void); +# define EVP_bf_cfb EVP_bf_cfb64 +const EVP_CIPHER *EVP_bf_ofb(void); +# endif +# ifndef OPENSSL_NO_CAST +const EVP_CIPHER *EVP_cast5_ecb(void); +const EVP_CIPHER *EVP_cast5_cbc(void); +const EVP_CIPHER *EVP_cast5_cfb64(void); +# define EVP_cast5_cfb EVP_cast5_cfb64 +const EVP_CIPHER *EVP_cast5_ofb(void); +# endif +# ifndef OPENSSL_NO_RC5 +const EVP_CIPHER *EVP_rc5_32_12_16_cbc(void); +const EVP_CIPHER *EVP_rc5_32_12_16_ecb(void); +const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void); +# define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64 +const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void); +# endif +const EVP_CIPHER *EVP_aes_128_ecb(void); +const EVP_CIPHER *EVP_aes_128_cbc(void); +const EVP_CIPHER *EVP_aes_128_cfb1(void); +const EVP_CIPHER *EVP_aes_128_cfb8(void); +const EVP_CIPHER *EVP_aes_128_cfb128(void); +# define EVP_aes_128_cfb EVP_aes_128_cfb128 +const EVP_CIPHER *EVP_aes_128_ofb(void); +const EVP_CIPHER *EVP_aes_128_ctr(void); +const EVP_CIPHER *EVP_aes_128_ccm(void); +const EVP_CIPHER *EVP_aes_128_gcm(void); +const EVP_CIPHER *EVP_aes_128_xts(void); +const EVP_CIPHER *EVP_aes_128_wrap(void); +const EVP_CIPHER *EVP_aes_128_wrap_pad(void); +# ifndef OPENSSL_NO_OCB +const EVP_CIPHER *EVP_aes_128_ocb(void); +# endif +const EVP_CIPHER *EVP_aes_192_ecb(void); +const EVP_CIPHER *EVP_aes_192_cbc(void); +const EVP_CIPHER *EVP_aes_192_cfb1(void); +const EVP_CIPHER *EVP_aes_192_cfb8(void); +const EVP_CIPHER *EVP_aes_192_cfb128(void); +# define EVP_aes_192_cfb EVP_aes_192_cfb128 +const EVP_CIPHER *EVP_aes_192_ofb(void); +const EVP_CIPHER *EVP_aes_192_ctr(void); +const EVP_CIPHER *EVP_aes_192_ccm(void); +const EVP_CIPHER *EVP_aes_192_gcm(void); +const EVP_CIPHER *EVP_aes_192_wrap(void); +const EVP_CIPHER *EVP_aes_192_wrap_pad(void); +# ifndef OPENSSL_NO_OCB +const EVP_CIPHER *EVP_aes_192_ocb(void); +# endif +const EVP_CIPHER *EVP_aes_256_ecb(void); +const EVP_CIPHER *EVP_aes_256_cbc(void); +const EVP_CIPHER *EVP_aes_256_cfb1(void); +const EVP_CIPHER *EVP_aes_256_cfb8(void); +const EVP_CIPHER *EVP_aes_256_cfb128(void); +# define EVP_aes_256_cfb EVP_aes_256_cfb128 +const EVP_CIPHER *EVP_aes_256_ofb(void); +const EVP_CIPHER *EVP_aes_256_ctr(void); +const EVP_CIPHER *EVP_aes_256_ccm(void); +const EVP_CIPHER *EVP_aes_256_gcm(void); +const EVP_CIPHER *EVP_aes_256_xts(void); +const EVP_CIPHER *EVP_aes_256_wrap(void); +const EVP_CIPHER *EVP_aes_256_wrap_pad(void); +# ifndef OPENSSL_NO_OCB +const EVP_CIPHER *EVP_aes_256_ocb(void); +# endif +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void); +const EVP_CIPHER *EVP_aes_128_cbc_hmac_sha256(void); +const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha256(void); +# ifndef OPENSSL_NO_ARIA +const EVP_CIPHER *EVP_aria_128_ecb(void); +const EVP_CIPHER *EVP_aria_128_cbc(void); +const EVP_CIPHER *EVP_aria_128_cfb1(void); +const EVP_CIPHER *EVP_aria_128_cfb8(void); +const EVP_CIPHER *EVP_aria_128_cfb128(void); +# define EVP_aria_128_cfb EVP_aria_128_cfb128 +const EVP_CIPHER *EVP_aria_128_ctr(void); +const EVP_CIPHER *EVP_aria_128_ofb(void); +const EVP_CIPHER *EVP_aria_128_gcm(void); +const EVP_CIPHER *EVP_aria_128_ccm(void); +const EVP_CIPHER *EVP_aria_192_ecb(void); +const EVP_CIPHER *EVP_aria_192_cbc(void); +const EVP_CIPHER *EVP_aria_192_cfb1(void); +const EVP_CIPHER *EVP_aria_192_cfb8(void); +const EVP_CIPHER *EVP_aria_192_cfb128(void); +# define EVP_aria_192_cfb EVP_aria_192_cfb128 +const EVP_CIPHER *EVP_aria_192_ctr(void); +const EVP_CIPHER *EVP_aria_192_ofb(void); +const EVP_CIPHER *EVP_aria_192_gcm(void); +const EVP_CIPHER *EVP_aria_192_ccm(void); +const EVP_CIPHER *EVP_aria_256_ecb(void); +const EVP_CIPHER *EVP_aria_256_cbc(void); +const EVP_CIPHER *EVP_aria_256_cfb1(void); +const EVP_CIPHER *EVP_aria_256_cfb8(void); +const EVP_CIPHER *EVP_aria_256_cfb128(void); +# define EVP_aria_256_cfb EVP_aria_256_cfb128 +const EVP_CIPHER *EVP_aria_256_ctr(void); +const EVP_CIPHER *EVP_aria_256_ofb(void); +const EVP_CIPHER *EVP_aria_256_gcm(void); +const EVP_CIPHER *EVP_aria_256_ccm(void); +# endif +# ifndef OPENSSL_NO_CAMELLIA +const EVP_CIPHER *EVP_camellia_128_ecb(void); +const EVP_CIPHER *EVP_camellia_128_cbc(void); +const EVP_CIPHER *EVP_camellia_128_cfb1(void); +const EVP_CIPHER *EVP_camellia_128_cfb8(void); +const EVP_CIPHER *EVP_camellia_128_cfb128(void); +# define EVP_camellia_128_cfb EVP_camellia_128_cfb128 +const EVP_CIPHER *EVP_camellia_128_ofb(void); +const EVP_CIPHER *EVP_camellia_128_ctr(void); +const EVP_CIPHER *EVP_camellia_192_ecb(void); +const EVP_CIPHER *EVP_camellia_192_cbc(void); +const EVP_CIPHER *EVP_camellia_192_cfb1(void); +const EVP_CIPHER *EVP_camellia_192_cfb8(void); +const EVP_CIPHER *EVP_camellia_192_cfb128(void); +# define EVP_camellia_192_cfb EVP_camellia_192_cfb128 +const EVP_CIPHER *EVP_camellia_192_ofb(void); +const EVP_CIPHER *EVP_camellia_192_ctr(void); +const EVP_CIPHER *EVP_camellia_256_ecb(void); +const EVP_CIPHER *EVP_camellia_256_cbc(void); +const EVP_CIPHER *EVP_camellia_256_cfb1(void); +const EVP_CIPHER *EVP_camellia_256_cfb8(void); +const EVP_CIPHER *EVP_camellia_256_cfb128(void); +# define EVP_camellia_256_cfb EVP_camellia_256_cfb128 +const EVP_CIPHER *EVP_camellia_256_ofb(void); +const EVP_CIPHER *EVP_camellia_256_ctr(void); +# endif +# ifndef OPENSSL_NO_CHACHA +const EVP_CIPHER *EVP_chacha20(void); +# ifndef OPENSSL_NO_POLY1305 +const EVP_CIPHER *EVP_chacha20_poly1305(void); +# endif +# endif + +# ifndef OPENSSL_NO_SEED +const EVP_CIPHER *EVP_seed_ecb(void); +const EVP_CIPHER *EVP_seed_cbc(void); +const EVP_CIPHER *EVP_seed_cfb128(void); +# define EVP_seed_cfb EVP_seed_cfb128 +const EVP_CIPHER *EVP_seed_ofb(void); +# endif + +# ifndef OPENSSL_NO_SM4 +const EVP_CIPHER *EVP_sm4_ecb(void); +const EVP_CIPHER *EVP_sm4_cbc(void); +const EVP_CIPHER *EVP_sm4_cfb128(void); +# define EVP_sm4_cfb EVP_sm4_cfb128 +const EVP_CIPHER *EVP_sm4_ofb(void); +const EVP_CIPHER *EVP_sm4_ctr(void); +# endif + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define OPENSSL_add_all_algorithms_conf() \ + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \ + | OPENSSL_INIT_ADD_ALL_DIGESTS \ + | OPENSSL_INIT_LOAD_CONFIG, NULL) +# define OPENSSL_add_all_algorithms_noconf() \ + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \ + | OPENSSL_INIT_ADD_ALL_DIGESTS, NULL) + +# ifdef OPENSSL_LOAD_CONF +# define OpenSSL_add_all_algorithms() OPENSSL_add_all_algorithms_conf() +# else +# define OpenSSL_add_all_algorithms() OPENSSL_add_all_algorithms_noconf() +# endif + +# define OpenSSL_add_all_ciphers() \ + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS, NULL) +# define OpenSSL_add_all_digests() \ + OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_DIGESTS, NULL) + +# define EVP_cleanup() while(0) continue +# endif + +int EVP_add_cipher(const EVP_CIPHER *cipher); +int EVP_add_digest(const EVP_MD *digest); + +const EVP_CIPHER *EVP_get_cipherbyname(const char *name); +const EVP_MD *EVP_get_digestbyname(const char *name); + +void EVP_CIPHER_do_all(void (*fn) (const EVP_CIPHER *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_CIPHER_do_all_sorted(void (*fn) + (const EVP_CIPHER *ciph, const char *from, + const char *to, void *x), void *arg); +void EVP_CIPHER_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_CIPHER *cipher, void *arg), + void *arg); + +void EVP_MD_do_all(void (*fn) (const EVP_MD *ciph, + const char *from, const char *to, void *x), + void *arg); +void EVP_MD_do_all_sorted(void (*fn) + (const EVP_MD *ciph, const char *from, + const char *to, void *x), void *arg); +void EVP_MD_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_MD *md, void *arg), + void *arg); + +/* MAC stuff */ + +EVP_MAC *EVP_MAC_fetch(OSSL_LIB_CTX *libctx, const char *algorithm, + const char *properties); +int EVP_MAC_up_ref(EVP_MAC *mac); +void EVP_MAC_free(EVP_MAC *mac); +const char *EVP_MAC_get0_name(const EVP_MAC *mac); +const char *EVP_MAC_get0_description(const EVP_MAC *mac); +int EVP_MAC_is_a(const EVP_MAC *mac, const char *name); +const OSSL_PROVIDER *EVP_MAC_get0_provider(const EVP_MAC *mac); +int EVP_MAC_get_params(EVP_MAC *mac, OSSL_PARAM params[]); + +EVP_MAC_CTX *EVP_MAC_CTX_new(EVP_MAC *mac); +void EVP_MAC_CTX_free(EVP_MAC_CTX *ctx); +EVP_MAC_CTX *EVP_MAC_CTX_dup(const EVP_MAC_CTX *src); +EVP_MAC *EVP_MAC_CTX_get0_mac(EVP_MAC_CTX *ctx); +int EVP_MAC_CTX_get_params(EVP_MAC_CTX *ctx, OSSL_PARAM params[]); +int EVP_MAC_CTX_set_params(EVP_MAC_CTX *ctx, const OSSL_PARAM params[]); + +size_t EVP_MAC_CTX_get_mac_size(EVP_MAC_CTX *ctx); +size_t EVP_MAC_CTX_get_block_size(EVP_MAC_CTX *ctx); +unsigned char *EVP_Q_mac(OSSL_LIB_CTX *libctx, const char *name, const char *propq, + const char *subalg, const OSSL_PARAM *params, + const void *key, size_t keylen, + const unsigned char *data, size_t datalen, + unsigned char *out, size_t outsize, size_t *outlen); +int EVP_MAC_init(EVP_MAC_CTX *ctx, const unsigned char *key, size_t keylen, + const OSSL_PARAM params[]); +int EVP_MAC_update(EVP_MAC_CTX *ctx, const unsigned char *data, size_t datalen); +int EVP_MAC_final(EVP_MAC_CTX *ctx, + unsigned char *out, size_t *outl, size_t outsize); +int EVP_MAC_finalXOF(EVP_MAC_CTX *ctx, unsigned char *out, size_t outsize); +const OSSL_PARAM *EVP_MAC_gettable_params(const EVP_MAC *mac); +const OSSL_PARAM *EVP_MAC_gettable_ctx_params(const EVP_MAC *mac); +const OSSL_PARAM *EVP_MAC_settable_ctx_params(const EVP_MAC *mac); +const OSSL_PARAM *EVP_MAC_CTX_gettable_params(EVP_MAC_CTX *ctx); +const OSSL_PARAM *EVP_MAC_CTX_settable_params(EVP_MAC_CTX *ctx); + +void EVP_MAC_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_MAC *mac, void *arg), + void *arg); +int EVP_MAC_names_do_all(const EVP_MAC *mac, + void (*fn)(const char *name, void *data), + void *data); + +/* RAND stuff */ +EVP_RAND *EVP_RAND_fetch(OSSL_LIB_CTX *libctx, const char *algorithm, + const char *properties); +int EVP_RAND_up_ref(EVP_RAND *rand); +void EVP_RAND_free(EVP_RAND *rand); +const char *EVP_RAND_get0_name(const EVP_RAND *rand); +const char *EVP_RAND_get0_description(const EVP_RAND *md); +int EVP_RAND_is_a(const EVP_RAND *rand, const char *name); +const OSSL_PROVIDER *EVP_RAND_get0_provider(const EVP_RAND *rand); +int EVP_RAND_get_params(EVP_RAND *rand, OSSL_PARAM params[]); + +EVP_RAND_CTX *EVP_RAND_CTX_new(EVP_RAND *rand, EVP_RAND_CTX *parent); +void EVP_RAND_CTX_free(EVP_RAND_CTX *ctx); +EVP_RAND *EVP_RAND_CTX_get0_rand(EVP_RAND_CTX *ctx); +int EVP_RAND_CTX_get_params(EVP_RAND_CTX *ctx, OSSL_PARAM params[]); +int EVP_RAND_CTX_set_params(EVP_RAND_CTX *ctx, const OSSL_PARAM params[]); +const OSSL_PARAM *EVP_RAND_gettable_params(const EVP_RAND *rand); +const OSSL_PARAM *EVP_RAND_gettable_ctx_params(const EVP_RAND *rand); +const OSSL_PARAM *EVP_RAND_settable_ctx_params(const EVP_RAND *rand); +const OSSL_PARAM *EVP_RAND_CTX_gettable_params(EVP_RAND_CTX *ctx); +const OSSL_PARAM *EVP_RAND_CTX_settable_params(EVP_RAND_CTX *ctx); + +void EVP_RAND_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_RAND *rand, void *arg), + void *arg); +int EVP_RAND_names_do_all(const EVP_RAND *rand, + void (*fn)(const char *name, void *data), + void *data); + +__owur int EVP_RAND_instantiate(EVP_RAND_CTX *ctx, unsigned int strength, + int prediction_resistance, + const unsigned char *pstr, size_t pstr_len, + const OSSL_PARAM params[]); +int EVP_RAND_uninstantiate(EVP_RAND_CTX *ctx); +__owur int EVP_RAND_generate(EVP_RAND_CTX *ctx, unsigned char *out, + size_t outlen, unsigned int strength, + int prediction_resistance, + const unsigned char *addin, size_t addin_len); +int EVP_RAND_reseed(EVP_RAND_CTX *ctx, int prediction_resistance, + const unsigned char *ent, size_t ent_len, + const unsigned char *addin, size_t addin_len); +__owur int EVP_RAND_nonce(EVP_RAND_CTX *ctx, unsigned char *out, size_t outlen); +__owur int EVP_RAND_enable_locking(EVP_RAND_CTX *ctx); + +int EVP_RAND_verify_zeroization(EVP_RAND_CTX *ctx); +unsigned int EVP_RAND_get_strength(EVP_RAND_CTX *ctx); +int EVP_RAND_get_state(EVP_RAND_CTX *ctx); + +# define EVP_RAND_STATE_UNINITIALISED 0 +# define EVP_RAND_STATE_READY 1 +# define EVP_RAND_STATE_ERROR 2 + +/* PKEY stuff */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int EVP_PKEY_decrypt_old(unsigned char *dec_key, + const unsigned char *enc_key, + int enc_key_len, + EVP_PKEY *private_key); +OSSL_DEPRECATEDIN_3_0 int EVP_PKEY_encrypt_old(unsigned char *enc_key, + const unsigned char *key, + int key_len, EVP_PKEY *pub_key); +# endif +int EVP_PKEY_is_a(const EVP_PKEY *pkey, const char *name); +int EVP_PKEY_type_names_do_all(const EVP_PKEY *pkey, + void (*fn)(const char *name, void *data), + void *data); +int EVP_PKEY_type(int type); +int EVP_PKEY_get_id(const EVP_PKEY *pkey); +# define EVP_PKEY_id EVP_PKEY_get_id +int EVP_PKEY_get_base_id(const EVP_PKEY *pkey); +# define EVP_PKEY_base_id EVP_PKEY_get_base_id +int EVP_PKEY_get_bits(const EVP_PKEY *pkey); +# define EVP_PKEY_bits EVP_PKEY_get_bits +int EVP_PKEY_get_security_bits(const EVP_PKEY *pkey); +# define EVP_PKEY_security_bits EVP_PKEY_get_security_bits +int EVP_PKEY_get_size(const EVP_PKEY *pkey); +# define EVP_PKEY_size EVP_PKEY_get_size +int EVP_PKEY_can_sign(const EVP_PKEY *pkey); +int EVP_PKEY_set_type(EVP_PKEY *pkey, int type); +int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len); +int EVP_PKEY_set_type_by_keymgmt(EVP_PKEY *pkey, EVP_KEYMGMT *keymgmt); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_ENGINE +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_set1_engine(EVP_PKEY *pkey, ENGINE *e); +OSSL_DEPRECATEDIN_3_0 +ENGINE *EVP_PKEY_get0_engine(const EVP_PKEY *pkey); +# endif +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); +OSSL_DEPRECATEDIN_3_0 +void *EVP_PKEY_get0(const EVP_PKEY *pkey); +OSSL_DEPRECATEDIN_3_0 +const unsigned char *EVP_PKEY_get0_hmac(const EVP_PKEY *pkey, size_t *len); +# ifndef OPENSSL_NO_POLY1305 +OSSL_DEPRECATEDIN_3_0 +const unsigned char *EVP_PKEY_get0_poly1305(const EVP_PKEY *pkey, size_t *len); +# endif +# ifndef OPENSSL_NO_SIPHASH +OSSL_DEPRECATEDIN_3_0 +const unsigned char *EVP_PKEY_get0_siphash(const EVP_PKEY *pkey, size_t *len); +# endif + +struct rsa_st; +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key); +OSSL_DEPRECATEDIN_3_0 +const struct rsa_st *EVP_PKEY_get0_RSA(const EVP_PKEY *pkey); +OSSL_DEPRECATEDIN_3_0 +struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey); + +# ifndef OPENSSL_NO_DSA +struct dsa_st; +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key); +OSSL_DEPRECATEDIN_3_0 +const struct dsa_st *EVP_PKEY_get0_DSA(const EVP_PKEY *pkey); +OSSL_DEPRECATEDIN_3_0 +struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey); +# endif + +# ifndef OPENSSL_NO_DH +struct dh_st; +OSSL_DEPRECATEDIN_3_0 int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key); +OSSL_DEPRECATEDIN_3_0 const struct dh_st *EVP_PKEY_get0_DH(const EVP_PKEY *pkey); +OSSL_DEPRECATEDIN_3_0 struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey); +# endif + +# ifndef OPENSSL_NO_EC +struct ec_key_st; +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key); +OSSL_DEPRECATEDIN_3_0 +const struct ec_key_st *EVP_PKEY_get0_EC_KEY(const EVP_PKEY *pkey); +OSSL_DEPRECATEDIN_3_0 +struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey); +# endif +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +EVP_PKEY *EVP_PKEY_new(void); +int EVP_PKEY_up_ref(EVP_PKEY *pkey); +EVP_PKEY *EVP_PKEY_dup(EVP_PKEY *pkey); +void EVP_PKEY_free(EVP_PKEY *pkey); +const char *EVP_PKEY_get0_description(const EVP_PKEY *pkey); +const OSSL_PROVIDER *EVP_PKEY_get0_provider(const EVP_PKEY *key); + +EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PublicKey(const EVP_PKEY *a, unsigned char **pp); + + +EVP_PKEY *d2i_PrivateKey_ex(int type, EVP_PKEY **a, const unsigned char **pp, + long length, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +EVP_PKEY *d2i_AutoPrivateKey_ex(EVP_PKEY **a, const unsigned char **pp, + long length, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_PrivateKey(const EVP_PKEY *a, unsigned char **pp); + +int i2d_KeyParams(const EVP_PKEY *a, unsigned char **pp); +EVP_PKEY *d2i_KeyParams(int type, EVP_PKEY **a, const unsigned char **pp, + long length); +int i2d_KeyParams_bio(BIO *bp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_KeyParams_bio(int type, EVP_PKEY **a, BIO *in); + +int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from); +int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey); +int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode); +int EVP_PKEY_parameters_eq(const EVP_PKEY *a, const EVP_PKEY *b); +int EVP_PKEY_eq(const EVP_PKEY *a, const EVP_PKEY *b); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b); +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b); +# endif + +int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +# ifndef OPENSSL_NO_STDIO +int EVP_PKEY_print_public_fp(FILE *fp, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_private_fp(FILE *fp, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +int EVP_PKEY_print_params_fp(FILE *fp, const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx); +# endif + +int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid); +int EVP_PKEY_get_default_digest_name(EVP_PKEY *pkey, + char *mdname, size_t mdname_sz); +int EVP_PKEY_digestsign_supports_digest(EVP_PKEY *pkey, OSSL_LIB_CTX *libctx, + const char *name, const char *propq); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* + * For backwards compatibility. Use EVP_PKEY_set1_encoded_public_key in + * preference + */ +# define EVP_PKEY_set1_tls_encodedpoint(pkey, pt, ptlen) \ + EVP_PKEY_set1_encoded_public_key((pkey), (pt), (ptlen)) +# endif + +int EVP_PKEY_set1_encoded_public_key(EVP_PKEY *pkey, + const unsigned char *pub, size_t publen); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* + * For backwards compatibility. Use EVP_PKEY_get1_encoded_public_key in + * preference + */ +# define EVP_PKEY_get1_tls_encodedpoint(pkey, ppt) \ + EVP_PKEY_get1_encoded_public_key((pkey), (ppt)) +# endif + +size_t EVP_PKEY_get1_encoded_public_key(EVP_PKEY *pkey, unsigned char **ppub); + +/* calls methods */ +int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* These are used by EVP_CIPHER methods */ +int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); +int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); + +/* PKCS5 password based encryption */ +int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); +int PKCS5_PBE_keyivgen_ex(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de, OSSL_LIB_CTX *libctx, + const char *propq); +int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + int keylen, unsigned char *out); +int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, + const unsigned char *salt, int saltlen, int iter, + const EVP_MD *digest, int keylen, unsigned char *out); +int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de); +int PKCS5_v2_PBE_keyivgen_ex(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md, int en_de, + OSSL_LIB_CTX *libctx, const char *propq); + +#ifndef OPENSSL_NO_SCRYPT +int EVP_PBE_scrypt(const char *pass, size_t passlen, + const unsigned char *salt, size_t saltlen, + uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem, + unsigned char *key, size_t keylen); +int EVP_PBE_scrypt_ex(const char *pass, size_t passlen, + const unsigned char *salt, size_t saltlen, + uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem, + unsigned char *key, size_t keylen, + OSSL_LIB_CTX *ctx, const char *propq); + +int PKCS5_v2_scrypt_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *c, const EVP_MD *md, int en_de); +int PKCS5_v2_scrypt_keyivgen_ex(EVP_CIPHER_CTX *ctx, const char *pass, + int passlen, ASN1_TYPE *param, + const EVP_CIPHER *c, const EVP_MD *md, int en_de, + OSSL_LIB_CTX *libctx, const char *propq); +#endif + +void PKCS5_PBE_add(void); + +int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, + ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); + +int EVP_PBE_CipherInit_ex(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, + ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de, + OSSL_LIB_CTX *libctx, const char *propq); + +/* PBE type */ + +/* Can appear as the outermost AlgorithmIdentifier */ +# define EVP_PBE_TYPE_OUTER 0x0 +/* Is an PRF type OID */ +# define EVP_PBE_TYPE_PRF 0x1 +/* Is a PKCS#5 v2.0 KDF */ +# define EVP_PBE_TYPE_KDF 0x2 + +int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, + int md_nid, EVP_PBE_KEYGEN *keygen); +int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, + EVP_PBE_KEYGEN *keygen); +int EVP_PBE_find(int type, int pbe_nid, int *pcnid, int *pmnid, + EVP_PBE_KEYGEN **pkeygen); +int EVP_PBE_find_ex(int type, int pbe_nid, int *pcnid, int *pmnid, + EVP_PBE_KEYGEN **pkeygen, EVP_PBE_KEYGEN_EX **pkeygen_ex); +void EVP_PBE_cleanup(void); +int EVP_PBE_get(int *ptype, int *ppbe_nid, size_t num); + +# define ASN1_PKEY_ALIAS 0x1 +# define ASN1_PKEY_DYNAMIC 0x2 +# define ASN1_PKEY_SIGPARAM_NULL 0x4 + +# define ASN1_PKEY_CTRL_PKCS7_SIGN 0x1 +# define ASN1_PKEY_CTRL_PKCS7_ENCRYPT 0x2 +# define ASN1_PKEY_CTRL_DEFAULT_MD_NID 0x3 +# define ASN1_PKEY_CTRL_CMS_SIGN 0x5 +# define ASN1_PKEY_CTRL_CMS_ENVELOPE 0x7 +# define ASN1_PKEY_CTRL_CMS_RI_TYPE 0x8 + +# define ASN1_PKEY_CTRL_SET1_TLS_ENCPT 0x9 +# define ASN1_PKEY_CTRL_GET1_TLS_ENCPT 0xa +# define ASN1_PKEY_CTRL_CMS_IS_RI_TYPE_SUPPORTED 0xb + +int EVP_PKEY_asn1_get_count(void); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type); +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, + const char *str, int len); +int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth); +int EVP_PKEY_asn1_add_alias(int to, int from); +int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *pkey_base_id, + int *ppkey_flags, const char **pinfo, + const char **ppem_str, + const EVP_PKEY_ASN1_METHOD *ameth); + +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(const EVP_PKEY *pkey); +EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags, + const char *pem_str, + const char *info); +void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, + const EVP_PKEY_ASN1_METHOD *src); +void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth); +void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, + int (*pub_decode) (EVP_PKEY *pk, + const X509_PUBKEY *pub), + int (*pub_encode) (X509_PUBKEY *pub, + const EVP_PKEY *pk), + int (*pub_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*pub_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, ASN1_PCTX *pctx), + int (*pkey_size) (const EVP_PKEY *pk), + int (*pkey_bits) (const EVP_PKEY *pk)); +void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, + int (*priv_decode) (EVP_PKEY *pk, + const PKCS8_PRIV_KEY_INFO + *p8inf), + int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8, + const EVP_PKEY *pk), + int (*priv_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); +void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, + int (*param_decode) (EVP_PKEY *pkey, + const unsigned char **pder, + int derlen), + int (*param_encode) (const EVP_PKEY *pkey, + unsigned char **pder), + int (*param_missing) (const EVP_PKEY *pk), + int (*param_copy) (EVP_PKEY *to, + const EVP_PKEY *from), + int (*param_cmp) (const EVP_PKEY *a, + const EVP_PKEY *b), + int (*param_print) (BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)); + +void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, + void (*pkey_free) (EVP_PKEY *pkey)); +void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_ctrl) (EVP_PKEY *pkey, int op, + long arg1, void *arg2)); +void EVP_PKEY_asn1_set_item(EVP_PKEY_ASN1_METHOD *ameth, + int (*item_verify) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + const void *data, + const X509_ALGOR *a, + const ASN1_BIT_STRING *sig, + EVP_PKEY *pkey), + int (*item_sign) (EVP_MD_CTX *ctx, + const ASN1_ITEM *it, + const void *data, + X509_ALGOR *alg1, + X509_ALGOR *alg2, + ASN1_BIT_STRING *sig)); + +void EVP_PKEY_asn1_set_siginf(EVP_PKEY_ASN1_METHOD *ameth, + int (*siginf_set) (X509_SIG_INFO *siginf, + const X509_ALGOR *alg, + const ASN1_STRING *sig)); + +void EVP_PKEY_asn1_set_check(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_check) (const EVP_PKEY *pk)); + +void EVP_PKEY_asn1_set_public_check(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_pub_check) (const EVP_PKEY *pk)); + +void EVP_PKEY_asn1_set_param_check(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_param_check) (const EVP_PKEY *pk)); + +void EVP_PKEY_asn1_set_set_priv_key(EVP_PKEY_ASN1_METHOD *ameth, + int (*set_priv_key) (EVP_PKEY *pk, + const unsigned char + *priv, + size_t len)); +void EVP_PKEY_asn1_set_set_pub_key(EVP_PKEY_ASN1_METHOD *ameth, + int (*set_pub_key) (EVP_PKEY *pk, + const unsigned char *pub, + size_t len)); +void EVP_PKEY_asn1_set_get_priv_key(EVP_PKEY_ASN1_METHOD *ameth, + int (*get_priv_key) (const EVP_PKEY *pk, + unsigned char *priv, + size_t *len)); +void EVP_PKEY_asn1_set_get_pub_key(EVP_PKEY_ASN1_METHOD *ameth, + int (*get_pub_key) (const EVP_PKEY *pk, + unsigned char *pub, + size_t *len)); + +void EVP_PKEY_asn1_set_security_bits(EVP_PKEY_ASN1_METHOD *ameth, + int (*pkey_security_bits) (const EVP_PKEY + *pk)); + +int EVP_PKEY_CTX_get_signature_md(EVP_PKEY_CTX *ctx, const EVP_MD **md); +int EVP_PKEY_CTX_set_signature_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); + +int EVP_PKEY_CTX_set1_id(EVP_PKEY_CTX *ctx, const void *id, int len); +int EVP_PKEY_CTX_get1_id(EVP_PKEY_CTX *ctx, void *id); +int EVP_PKEY_CTX_get1_id_len(EVP_PKEY_CTX *ctx, size_t *id_len); + +int EVP_PKEY_CTX_set_kem_op(EVP_PKEY_CTX *ctx, const char *op); + +const char *EVP_PKEY_get0_type_name(const EVP_PKEY *key); + +# define EVP_PKEY_OP_UNDEFINED 0 +# define EVP_PKEY_OP_PARAMGEN (1<<1) +# define EVP_PKEY_OP_KEYGEN (1<<2) +# define EVP_PKEY_OP_FROMDATA (1<<3) +# define EVP_PKEY_OP_SIGN (1<<4) +# define EVP_PKEY_OP_VERIFY (1<<5) +# define EVP_PKEY_OP_VERIFYRECOVER (1<<6) +# define EVP_PKEY_OP_SIGNCTX (1<<7) +# define EVP_PKEY_OP_VERIFYCTX (1<<8) +# define EVP_PKEY_OP_ENCRYPT (1<<9) +# define EVP_PKEY_OP_DECRYPT (1<<10) +# define EVP_PKEY_OP_DERIVE (1<<11) +# define EVP_PKEY_OP_ENCAPSULATE (1<<12) +# define EVP_PKEY_OP_DECAPSULATE (1<<13) + +# define EVP_PKEY_OP_TYPE_SIG \ + (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER \ + | EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX) + +# define EVP_PKEY_OP_TYPE_CRYPT \ + (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT) + +# define EVP_PKEY_OP_TYPE_NOGEN \ + (EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT | EVP_PKEY_OP_DERIVE) + +# define EVP_PKEY_OP_TYPE_GEN \ + (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN) + + +int EVP_PKEY_CTX_set_mac_key(EVP_PKEY_CTX *ctx, const unsigned char *key, + int keylen); + +# define EVP_PKEY_CTRL_MD 1 +# define EVP_PKEY_CTRL_PEER_KEY 2 +# define EVP_PKEY_CTRL_SET_MAC_KEY 6 +# define EVP_PKEY_CTRL_DIGESTINIT 7 +/* Used by GOST key encryption in TLS */ +# define EVP_PKEY_CTRL_SET_IV 8 +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define EVP_PKEY_CTRL_PKCS7_ENCRYPT 3 +# define EVP_PKEY_CTRL_PKCS7_DECRYPT 4 +# define EVP_PKEY_CTRL_PKCS7_SIGN 5 +# define EVP_PKEY_CTRL_CMS_ENCRYPT 9 +# define EVP_PKEY_CTRL_CMS_DECRYPT 10 +# define EVP_PKEY_CTRL_CMS_SIGN 11 +# endif +# define EVP_PKEY_CTRL_CIPHER 12 +# define EVP_PKEY_CTRL_GET_MD 13 +# define EVP_PKEY_CTRL_SET_DIGEST_SIZE 14 +# define EVP_PKEY_CTRL_SET1_ID 15 +# define EVP_PKEY_CTRL_GET1_ID 16 +# define EVP_PKEY_CTRL_GET1_ID_LEN 17 + +# define EVP_PKEY_ALG_CTRL 0x1000 + +# define EVP_PKEY_FLAG_AUTOARGLEN 2 +/* + * Method handles all operations: don't assume any digest related defaults. + */ +# define EVP_PKEY_FLAG_SIGCTX_CUSTOM 4 +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type); +OSSL_DEPRECATEDIN_3_0 EVP_PKEY_METHOD *EVP_PKEY_meth_new(int id, int flags); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, + const EVP_PKEY_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, + const EVP_PKEY_METHOD *src); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth); +OSSL_DEPRECATEDIN_3_0 int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth); +OSSL_DEPRECATEDIN_3_0 int EVP_PKEY_meth_remove(const EVP_PKEY_METHOD *pmeth); +OSSL_DEPRECATEDIN_3_0 size_t EVP_PKEY_meth_get_count(void); +OSSL_DEPRECATEDIN_3_0 const EVP_PKEY_METHOD *EVP_PKEY_meth_get0(size_t idx); +# endif + +EVP_KEYMGMT *EVP_KEYMGMT_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, + const char *properties); +int EVP_KEYMGMT_up_ref(EVP_KEYMGMT *keymgmt); +void EVP_KEYMGMT_free(EVP_KEYMGMT *keymgmt); +const OSSL_PROVIDER *EVP_KEYMGMT_get0_provider(const EVP_KEYMGMT *keymgmt); +const char *EVP_KEYMGMT_get0_name(const EVP_KEYMGMT *keymgmt); +const char *EVP_KEYMGMT_get0_description(const EVP_KEYMGMT *keymgmt); +int EVP_KEYMGMT_is_a(const EVP_KEYMGMT *keymgmt, const char *name); +void EVP_KEYMGMT_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_KEYMGMT *keymgmt, void *arg), + void *arg); +int EVP_KEYMGMT_names_do_all(const EVP_KEYMGMT *keymgmt, + void (*fn)(const char *name, void *data), + void *data); +const OSSL_PARAM *EVP_KEYMGMT_gettable_params(const EVP_KEYMGMT *keymgmt); +const OSSL_PARAM *EVP_KEYMGMT_settable_params(const EVP_KEYMGMT *keymgmt); +const OSSL_PARAM *EVP_KEYMGMT_gen_settable_params(const EVP_KEYMGMT *keymgmt); + +EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_from_name(OSSL_LIB_CTX *libctx, + const char *name, + const char *propquery); +EVP_PKEY_CTX *EVP_PKEY_CTX_new_from_pkey(OSSL_LIB_CTX *libctx, + EVP_PKEY *pkey, const char *propquery); +EVP_PKEY_CTX *EVP_PKEY_CTX_dup(const EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx); +int EVP_PKEY_CTX_is_a(EVP_PKEY_CTX *ctx, const char *keytype); + +int EVP_PKEY_CTX_get_params(EVP_PKEY_CTX *ctx, OSSL_PARAM *params); +const OSSL_PARAM *EVP_PKEY_CTX_gettable_params(const EVP_PKEY_CTX *ctx); +int EVP_PKEY_CTX_set_params(EVP_PKEY_CTX *ctx, const OSSL_PARAM *params); +const OSSL_PARAM *EVP_PKEY_CTX_settable_params(const EVP_PKEY_CTX *ctx); +int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, + int cmd, int p1, void *p2); +int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, + const char *value); +int EVP_PKEY_CTX_ctrl_uint64(EVP_PKEY_CTX *ctx, int keytype, int optype, + int cmd, uint64_t value); + +int EVP_PKEY_CTX_str2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *str); +int EVP_PKEY_CTX_hex2ctrl(EVP_PKEY_CTX *ctx, int cmd, const char *hex); + +int EVP_PKEY_CTX_md(EVP_PKEY_CTX *ctx, int optype, int cmd, const char *md); + +int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX *ctx); +void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX *ctx, int *dat, int datlen); + +EVP_PKEY *EVP_PKEY_new_mac_key(int type, ENGINE *e, + const unsigned char *key, int keylen); +EVP_PKEY *EVP_PKEY_new_raw_private_key_ex(OSSL_LIB_CTX *libctx, + const char *keytype, + const char *propq, + const unsigned char *priv, size_t len); +EVP_PKEY *EVP_PKEY_new_raw_private_key(int type, ENGINE *e, + const unsigned char *priv, + size_t len); +EVP_PKEY *EVP_PKEY_new_raw_public_key_ex(OSSL_LIB_CTX *libctx, + const char *keytype, const char *propq, + const unsigned char *pub, size_t len); +EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *e, + const unsigned char *pub, + size_t len); +int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, unsigned char *priv, + size_t *len); +int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, unsigned char *pub, + size_t *len); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +EVP_PKEY *EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv, + size_t len, const EVP_CIPHER *cipher); +# endif + +void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_data(const EVP_PKEY_CTX *ctx); +EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx); + +EVP_PKEY *EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX *ctx); + +void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data); +void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx); + +void EVP_SIGNATURE_free(EVP_SIGNATURE *signature); +int EVP_SIGNATURE_up_ref(EVP_SIGNATURE *signature); +OSSL_PROVIDER *EVP_SIGNATURE_get0_provider(const EVP_SIGNATURE *signature); +EVP_SIGNATURE *EVP_SIGNATURE_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, + const char *properties); +int EVP_SIGNATURE_is_a(const EVP_SIGNATURE *signature, const char *name); +const char *EVP_SIGNATURE_get0_name(const EVP_SIGNATURE *signature); +const char *EVP_SIGNATURE_get0_description(const EVP_SIGNATURE *signature); +void EVP_SIGNATURE_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_SIGNATURE *signature, + void *data), + void *data); +int EVP_SIGNATURE_names_do_all(const EVP_SIGNATURE *signature, + void (*fn)(const char *name, void *data), + void *data); +const OSSL_PARAM *EVP_SIGNATURE_gettable_ctx_params(const EVP_SIGNATURE *sig); +const OSSL_PARAM *EVP_SIGNATURE_settable_ctx_params(const EVP_SIGNATURE *sig); + +void EVP_ASYM_CIPHER_free(EVP_ASYM_CIPHER *cipher); +int EVP_ASYM_CIPHER_up_ref(EVP_ASYM_CIPHER *cipher); +OSSL_PROVIDER *EVP_ASYM_CIPHER_get0_provider(const EVP_ASYM_CIPHER *cipher); +EVP_ASYM_CIPHER *EVP_ASYM_CIPHER_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, + const char *properties); +int EVP_ASYM_CIPHER_is_a(const EVP_ASYM_CIPHER *cipher, const char *name); +const char *EVP_ASYM_CIPHER_get0_name(const EVP_ASYM_CIPHER *cipher); +const char *EVP_ASYM_CIPHER_get0_description(const EVP_ASYM_CIPHER *cipher); +void EVP_ASYM_CIPHER_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_ASYM_CIPHER *cipher, + void *arg), + void *arg); +int EVP_ASYM_CIPHER_names_do_all(const EVP_ASYM_CIPHER *cipher, + void (*fn)(const char *name, void *data), + void *data); +const OSSL_PARAM *EVP_ASYM_CIPHER_gettable_ctx_params(const EVP_ASYM_CIPHER *ciph); +const OSSL_PARAM *EVP_ASYM_CIPHER_settable_ctx_params(const EVP_ASYM_CIPHER *ciph); + +void EVP_KEM_free(EVP_KEM *wrap); +int EVP_KEM_up_ref(EVP_KEM *wrap); +OSSL_PROVIDER *EVP_KEM_get0_provider(const EVP_KEM *wrap); +EVP_KEM *EVP_KEM_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, + const char *properties); +int EVP_KEM_is_a(const EVP_KEM *wrap, const char *name); +const char *EVP_KEM_get0_name(const EVP_KEM *wrap); +const char *EVP_KEM_get0_description(const EVP_KEM *wrap); +void EVP_KEM_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_KEM *wrap, void *arg), void *arg); +int EVP_KEM_names_do_all(const EVP_KEM *wrap, + void (*fn)(const char *name, void *data), void *data); +const OSSL_PARAM *EVP_KEM_gettable_ctx_params(const EVP_KEM *kem); +const OSSL_PARAM *EVP_KEM_settable_ctx_params(const EVP_KEM *kem); + +int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_sign_init_ex(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]); +int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify_init_ex(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]); +int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, + const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen); +int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_verify_recover_init_ex(EVP_PKEY_CTX *ctx, + const OSSL_PARAM params[]); +int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx, + unsigned char *rout, size_t *routlen, + const unsigned char *sig, size_t siglen); +int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_encrypt_init_ex(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]); +int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); +int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_decrypt_init_ex(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]); +int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); + +int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_derive_init_ex(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]); +int EVP_PKEY_derive_set_peer_ex(EVP_PKEY_CTX *ctx, EVP_PKEY *peer, + int validate_peer); +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer); +int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); + +int EVP_PKEY_encapsulate_init(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]); +int EVP_PKEY_encapsulate(EVP_PKEY_CTX *ctx, + unsigned char *wrappedkey, size_t *wrappedkeylen, + unsigned char *genkey, size_t *genkeylen); +int EVP_PKEY_decapsulate_init(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]); +int EVP_PKEY_decapsulate(EVP_PKEY_CTX *ctx, + unsigned char *unwrapped, size_t *unwrappedlen, + const unsigned char *wrapped, size_t wrappedlen); + +typedef int EVP_PKEY_gen_cb(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_fromdata_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_fromdata(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey, int selection, + OSSL_PARAM param[]); +const OSSL_PARAM *EVP_PKEY_fromdata_settable(EVP_PKEY_CTX *ctx, int selection); + +int EVP_PKEY_todata(const EVP_PKEY *pkey, int selection, OSSL_PARAM **params); +int EVP_PKEY_export(const EVP_PKEY *pkey, int selection, + OSSL_CALLBACK *export_cb, void *export_cbarg); + +const OSSL_PARAM *EVP_PKEY_gettable_params(const EVP_PKEY *pkey); +int EVP_PKEY_get_params(const EVP_PKEY *pkey, OSSL_PARAM params[]); +int EVP_PKEY_get_int_param(const EVP_PKEY *pkey, const char *key_name, + int *out); +int EVP_PKEY_get_size_t_param(const EVP_PKEY *pkey, const char *key_name, + size_t *out); +int EVP_PKEY_get_bn_param(const EVP_PKEY *pkey, const char *key_name, + BIGNUM **bn); +int EVP_PKEY_get_utf8_string_param(const EVP_PKEY *pkey, const char *key_name, + char *str, size_t max_buf_sz, size_t *out_sz); +int EVP_PKEY_get_octet_string_param(const EVP_PKEY *pkey, const char *key_name, + unsigned char *buf, size_t max_buf_sz, + size_t *out_sz); + +const OSSL_PARAM *EVP_PKEY_settable_params(const EVP_PKEY *pkey); +int EVP_PKEY_set_params(EVP_PKEY *pkey, OSSL_PARAM params[]); +int EVP_PKEY_set_int_param(EVP_PKEY *pkey, const char *key_name, int in); +int EVP_PKEY_set_size_t_param(EVP_PKEY *pkey, const char *key_name, size_t in); +int EVP_PKEY_set_bn_param(EVP_PKEY *pkey, const char *key_name, + const BIGNUM *bn); +int EVP_PKEY_set_utf8_string_param(EVP_PKEY *pkey, const char *key_name, + const char *str); +int EVP_PKEY_set_octet_string_param(EVP_PKEY *pkey, const char *key_name, + const unsigned char *buf, size_t bsize); + +int EVP_PKEY_get_ec_point_conv_form(const EVP_PKEY *pkey); +int EVP_PKEY_get_field_type(const EVP_PKEY *pkey); + +EVP_PKEY *EVP_PKEY_Q_keygen(OSSL_LIB_CTX *libctx, const char *propq, + const char *type, ...); +int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); +int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx); +int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); +int EVP_PKEY_generate(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey); +int EVP_PKEY_check(EVP_PKEY_CTX *ctx); +int EVP_PKEY_public_check(EVP_PKEY_CTX *ctx); +int EVP_PKEY_public_check_quick(EVP_PKEY_CTX *ctx); +int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx); +int EVP_PKEY_param_check_quick(EVP_PKEY_CTX *ctx); +int EVP_PKEY_private_check(EVP_PKEY_CTX *ctx); +int EVP_PKEY_pairwise_check(EVP_PKEY_CTX *ctx); + +# define EVP_PKEY_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_EVP_PKEY, l, p, newf, dupf, freef) +int EVP_PKEY_set_ex_data(EVP_PKEY *key, int idx, void *arg); +void *EVP_PKEY_get_ex_data(const EVP_PKEY *key, int idx); + +void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb); +EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx); + +int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth, + int (*init) (EVP_PKEY_CTX *ctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_copy + (EVP_PKEY_METHOD *pmeth, int (*copy) (EVP_PKEY_CTX *dst, + const EVP_PKEY_CTX *src)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_cleanup + (EVP_PKEY_METHOD *pmeth, void (*cleanup) (EVP_PKEY_CTX *ctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_paramgen + (EVP_PKEY_METHOD *pmeth, int (*paramgen_init) (EVP_PKEY_CTX *ctx), + int (*paramgen) (EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_keygen + (EVP_PKEY_METHOD *pmeth, int (*keygen_init) (EVP_PKEY_CTX *ctx), + int (*keygen) (EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_sign + (EVP_PKEY_METHOD *pmeth, int (*sign_init) (EVP_PKEY_CTX *ctx), + int (*sign) (EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_verify + (EVP_PKEY_METHOD *pmeth, int (*verify_init) (EVP_PKEY_CTX *ctx), + int (*verify) (EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, + const unsigned char *tbs, size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_verify_recover + (EVP_PKEY_METHOD *pmeth, int (*verify_recover_init) (EVP_PKEY_CTX *ctx), + int (*verify_recover) (EVP_PKEY_CTX *ctx, unsigned char *sig, + size_t *siglen, const unsigned char *tbs, + size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_signctx + (EVP_PKEY_METHOD *pmeth, int (*signctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*signctx) (EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, + EVP_MD_CTX *mctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_verifyctx + (EVP_PKEY_METHOD *pmeth, int (*verifyctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (*verifyctx) (EVP_PKEY_CTX *ctx, const unsigned char *sig, int siglen, + EVP_MD_CTX *mctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_encrypt + (EVP_PKEY_METHOD *pmeth, int (*encrypt_init) (EVP_PKEY_CTX *ctx), + int (*encryptfn) (EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_decrypt + (EVP_PKEY_METHOD *pmeth, int (*decrypt_init) (EVP_PKEY_CTX *ctx), + int (*decrypt) (EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_derive + (EVP_PKEY_METHOD *pmeth, int (*derive_init) (EVP_PKEY_CTX *ctx), + int (*derive) (EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_ctrl + (EVP_PKEY_METHOD *pmeth, int (*ctrl) (EVP_PKEY_CTX *ctx, int type, int p1, + void *p2), + int (*ctrl_str) (EVP_PKEY_CTX *ctx, const char *type, const char *value)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_digestsign + (EVP_PKEY_METHOD *pmeth, + int (*digestsign) (EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_digestverify + (EVP_PKEY_METHOD *pmeth, + int (*digestverify) (EVP_MD_CTX *ctx, const unsigned char *sig, + size_t siglen, const unsigned char *tbs, + size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_check + (EVP_PKEY_METHOD *pmeth, int (*check) (EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_public_check + (EVP_PKEY_METHOD *pmeth, int (*check) (EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_param_check + (EVP_PKEY_METHOD *pmeth, int (*check) (EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_set_digest_custom + (EVP_PKEY_METHOD *pmeth, int (*digest_custom) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_init + (const EVP_PKEY_METHOD *pmeth, int (**pinit) (EVP_PKEY_CTX *ctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_copy + (const EVP_PKEY_METHOD *pmeth, int (**pcopy) (EVP_PKEY_CTX *dst, + const EVP_PKEY_CTX *src)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_cleanup + (const EVP_PKEY_METHOD *pmeth, void (**pcleanup) (EVP_PKEY_CTX *ctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_paramgen + (const EVP_PKEY_METHOD *pmeth, int (**pparamgen_init) (EVP_PKEY_CTX *ctx), + int (**pparamgen) (EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_keygen + (const EVP_PKEY_METHOD *pmeth, int (**pkeygen_init) (EVP_PKEY_CTX *ctx), + int (**pkeygen) (EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_sign + (const EVP_PKEY_METHOD *pmeth, int (**psign_init) (EVP_PKEY_CTX *ctx), + int (**psign) (EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_verify + (const EVP_PKEY_METHOD *pmeth, int (**pverify_init) (EVP_PKEY_CTX *ctx), + int (**pverify) (EVP_PKEY_CTX *ctx, const unsigned char *sig, + size_t siglen, const unsigned char *tbs, size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_verify_recover + (const EVP_PKEY_METHOD *pmeth, + int (**pverify_recover_init) (EVP_PKEY_CTX *ctx), + int (**pverify_recover) (EVP_PKEY_CTX *ctx, unsigned char *sig, + size_t *siglen, const unsigned char *tbs, + size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_signctx + (const EVP_PKEY_METHOD *pmeth, + int (**psignctx_init) (EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx), + int (**psignctx) (EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, + EVP_MD_CTX *mctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_verifyctx + (const EVP_PKEY_METHOD *pmeth, + int (**pverifyctx_init) (EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx), + int (**pverifyctx) (EVP_PKEY_CTX *ctx, const unsigned char *sig, + int siglen, EVP_MD_CTX *mctx)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_encrypt + (const EVP_PKEY_METHOD *pmeth, int (**pencrypt_init) (EVP_PKEY_CTX *ctx), + int (**pencryptfn) (EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_decrypt + (const EVP_PKEY_METHOD *pmeth, int (**pdecrypt_init) (EVP_PKEY_CTX *ctx), + int (**pdecrypt) (EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_derive + (const EVP_PKEY_METHOD *pmeth, int (**pderive_init) (EVP_PKEY_CTX *ctx), + int (**pderive) (EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_ctrl + (const EVP_PKEY_METHOD *pmeth, + int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1, void *p2), + int (**pctrl_str) (EVP_PKEY_CTX *ctx, const char *type, + const char *value)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_digestsign + (const EVP_PKEY_METHOD *pmeth, + int (**digestsign) (EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen, + const unsigned char *tbs, size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_digestverify + (const EVP_PKEY_METHOD *pmeth, + int (**digestverify) (EVP_MD_CTX *ctx, const unsigned char *sig, + size_t siglen, const unsigned char *tbs, + size_t tbslen)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_check + (const EVP_PKEY_METHOD *pmeth, int (**pcheck) (EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_public_check + (const EVP_PKEY_METHOD *pmeth, int (**pcheck) (EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_param_check + (const EVP_PKEY_METHOD *pmeth, int (**pcheck) (EVP_PKEY *pkey)); +OSSL_DEPRECATEDIN_3_0 void EVP_PKEY_meth_get_digest_custom + (const EVP_PKEY_METHOD *pmeth, + int (**pdigest_custom) (EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx)); +# endif + +void EVP_KEYEXCH_free(EVP_KEYEXCH *exchange); +int EVP_KEYEXCH_up_ref(EVP_KEYEXCH *exchange); +EVP_KEYEXCH *EVP_KEYEXCH_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, + const char *properties); +OSSL_PROVIDER *EVP_KEYEXCH_get0_provider(const EVP_KEYEXCH *exchange); +int EVP_KEYEXCH_is_a(const EVP_KEYEXCH *keyexch, const char *name); +const char *EVP_KEYEXCH_get0_name(const EVP_KEYEXCH *keyexch); +const char *EVP_KEYEXCH_get0_description(const EVP_KEYEXCH *keyexch); +void EVP_KEYEXCH_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_KEYEXCH *keyexch, void *data), + void *data); +int EVP_KEYEXCH_names_do_all(const EVP_KEYEXCH *keyexch, + void (*fn)(const char *name, void *data), + void *data); +const OSSL_PARAM *EVP_KEYEXCH_gettable_ctx_params(const EVP_KEYEXCH *keyexch); +const OSSL_PARAM *EVP_KEYEXCH_settable_ctx_params(const EVP_KEYEXCH *keyexch); + +void EVP_add_alg_module(void); + +int EVP_PKEY_CTX_set_group_name(EVP_PKEY_CTX *ctx, const char *name); +int EVP_PKEY_CTX_get_group_name(EVP_PKEY_CTX *ctx, char *name, size_t namelen); +int EVP_PKEY_get_group_name(const EVP_PKEY *pkey, char *name, size_t name_sz, + size_t *gname_len); + +OSSL_LIB_CTX *EVP_PKEY_CTX_get0_libctx(EVP_PKEY_CTX *ctx); +const char *EVP_PKEY_CTX_get0_propq(const EVP_PKEY_CTX *ctx); +const OSSL_PROVIDER *EVP_PKEY_CTX_get0_provider(const EVP_PKEY_CTX *ctx); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/evperr.h b/OtherInc/openssl/include/openssl/evperr.h new file mode 100644 index 0000000..a5053f6 --- /dev/null +++ b/OtherInc/openssl/include/openssl/evperr.h @@ -0,0 +1,134 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_EVPERR_H +# define OPENSSL_EVPERR_H +# pragma once + +# include +# include +# include + + + +/* + * EVP reason codes. + */ +# define EVP_R_AES_KEY_SETUP_FAILED 143 +# define EVP_R_ARIA_KEY_SETUP_FAILED 176 +# define EVP_R_BAD_ALGORITHM_NAME 200 +# define EVP_R_BAD_DECRYPT 100 +# define EVP_R_BAD_KEY_LENGTH 195 +# define EVP_R_BUFFER_TOO_SMALL 155 +# define EVP_R_CACHE_CONSTANTS_FAILED 225 +# define EVP_R_CAMELLIA_KEY_SETUP_FAILED 157 +# define EVP_R_CANNOT_GET_PARAMETERS 197 +# define EVP_R_CANNOT_SET_PARAMETERS 198 +# define EVP_R_CIPHER_NOT_GCM_MODE 184 +# define EVP_R_CIPHER_PARAMETER_ERROR 122 +# define EVP_R_COMMAND_NOT_SUPPORTED 147 +# define EVP_R_CONFLICTING_ALGORITHM_NAME 201 +# define EVP_R_COPY_ERROR 173 +# define EVP_R_CTRL_NOT_IMPLEMENTED 132 +# define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED 133 +# define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH 138 +# define EVP_R_DECODE_ERROR 114 +# define EVP_R_DEFAULT_QUERY_PARSE_ERROR 210 +# define EVP_R_DIFFERENT_KEY_TYPES 101 +# define EVP_R_DIFFERENT_PARAMETERS 153 +# define EVP_R_ERROR_LOADING_SECTION 165 +# define EVP_R_EXPECTING_AN_HMAC_KEY 174 +# define EVP_R_EXPECTING_AN_RSA_KEY 127 +# define EVP_R_EXPECTING_A_DH_KEY 128 +# define EVP_R_EXPECTING_A_DSA_KEY 129 +# define EVP_R_EXPECTING_A_ECX_KEY 219 +# define EVP_R_EXPECTING_A_EC_KEY 142 +# define EVP_R_EXPECTING_A_POLY1305_KEY 164 +# define EVP_R_EXPECTING_A_SIPHASH_KEY 175 +# define EVP_R_FINAL_ERROR 188 +# define EVP_R_GENERATE_ERROR 214 +# define EVP_R_GET_RAW_KEY_FAILED 182 +# define EVP_R_ILLEGAL_SCRYPT_PARAMETERS 171 +# define EVP_R_INACCESSIBLE_DOMAIN_PARAMETERS 204 +# define EVP_R_INACCESSIBLE_KEY 203 +# define EVP_R_INITIALIZATION_ERROR 134 +# define EVP_R_INPUT_NOT_INITIALIZED 111 +# define EVP_R_INVALID_CUSTOM_LENGTH 185 +# define EVP_R_INVALID_DIGEST 152 +# define EVP_R_INVALID_IV_LENGTH 194 +# define EVP_R_INVALID_KEY 163 +# define EVP_R_INVALID_KEY_LENGTH 130 +# define EVP_R_INVALID_LENGTH 221 +# define EVP_R_INVALID_NULL_ALGORITHM 218 +# define EVP_R_INVALID_OPERATION 148 +# define EVP_R_INVALID_PROVIDER_FUNCTIONS 193 +# define EVP_R_INVALID_SALT_LENGTH 186 +# define EVP_R_INVALID_SECRET_LENGTH 223 +# define EVP_R_INVALID_SEED_LENGTH 220 +# define EVP_R_INVALID_VALUE 222 +# define EVP_R_KEYMGMT_EXPORT_FAILURE 205 +# define EVP_R_KEY_SETUP_FAILED 180 +# define EVP_R_LOCKING_NOT_SUPPORTED 213 +# define EVP_R_MEMORY_LIMIT_EXCEEDED 172 +# define EVP_R_MESSAGE_DIGEST_IS_NULL 159 +# define EVP_R_METHOD_NOT_SUPPORTED 144 +# define EVP_R_MISSING_PARAMETERS 103 +# define EVP_R_NOT_ABLE_TO_COPY_CTX 190 +# define EVP_R_NOT_XOF_OR_INVALID_LENGTH 178 +# define EVP_R_NO_CIPHER_SET 131 +# define EVP_R_NO_DEFAULT_DIGEST 158 +# define EVP_R_NO_DIGEST_SET 139 +# define EVP_R_NO_IMPORT_FUNCTION 206 +# define EVP_R_NO_KEYMGMT_AVAILABLE 199 +# define EVP_R_NO_KEYMGMT_PRESENT 196 +# define EVP_R_NO_KEY_SET 154 +# define EVP_R_NO_OPERATION_SET 149 +# define EVP_R_NULL_MAC_PKEY_CTX 208 +# define EVP_R_ONLY_ONESHOT_SUPPORTED 177 +# define EVP_R_OPERATION_NOT_INITIALIZED 151 +# define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 +# define EVP_R_OUTPUT_WOULD_OVERFLOW 202 +# define EVP_R_PARAMETER_TOO_LARGE 187 +# define EVP_R_PARTIALLY_OVERLAPPING 162 +# define EVP_R_PBKDF2_ERROR 181 +# define EVP_R_PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED 179 +# define EVP_R_PRIVATE_KEY_DECODE_ERROR 145 +# define EVP_R_PRIVATE_KEY_ENCODE_ERROR 146 +# define EVP_R_PUBLIC_KEY_NOT_RSA 106 +# define EVP_R_SETTING_XOF_FAILED 227 +# define EVP_R_SET_DEFAULT_PROPERTY_FAILURE 209 +# define EVP_R_TOO_MANY_RECORDS 183 +# define EVP_R_UNABLE_TO_ENABLE_LOCKING 212 +# define EVP_R_UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE 215 +# define EVP_R_UNABLE_TO_GET_RANDOM_STRENGTH 216 +# define EVP_R_UNABLE_TO_LOCK_CONTEXT 211 +# define EVP_R_UNABLE_TO_SET_CALLBACKS 217 +# define EVP_R_UNKNOWN_CIPHER 160 +# define EVP_R_UNKNOWN_DIGEST 161 +# define EVP_R_UNKNOWN_KEY_TYPE 207 +# define EVP_R_UNKNOWN_OPTION 169 +# define EVP_R_UNKNOWN_PBE_ALGORITHM 121 +# define EVP_R_UNSUPPORTED_ALGORITHM 156 +# define EVP_R_UNSUPPORTED_CIPHER 107 +# define EVP_R_UNSUPPORTED_KEYLENGTH 123 +# define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION 124 +# define EVP_R_UNSUPPORTED_KEY_SIZE 108 +# define EVP_R_UNSUPPORTED_KEY_TYPE 224 +# define EVP_R_UNSUPPORTED_NUMBER_OF_ROUNDS 135 +# define EVP_R_UNSUPPORTED_PRF 125 +# define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM 118 +# define EVP_R_UNSUPPORTED_SALT_TYPE 126 +# define EVP_R_UPDATE_ERROR 189 +# define EVP_R_WRAP_MODE_NOT_ALLOWED 170 +# define EVP_R_WRONG_FINAL_BLOCK_LENGTH 109 +# define EVP_R_XTS_DATA_UNIT_IS_TOO_LARGE 191 +# define EVP_R_XTS_DUPLICATED_KEYS 192 + +#endif diff --git a/OtherInc/openssl/include/openssl/fips_names.h b/OtherInc/openssl/include/openssl/fips_names.h new file mode 100644 index 0000000..0fdf544 --- /dev/null +++ b/OtherInc/openssl/include/openssl/fips_names.h @@ -0,0 +1,60 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_FIPS_NAMES_H +# define OPENSSL_FIPS_NAMES_H +# pragma once + +# ifdef __cplusplus +extern "C" { +# endif + +/* + * Parameter names that the FIPS Provider defines + */ + +/* + * The calculated MAC of the module file (Used for FIPS Self Testing) + * Type: OSSL_PARAM_UTF8_STRING + */ +# define OSSL_PROV_FIPS_PARAM_MODULE_MAC "module-mac" +/* + * A version number for the fips install process (Used for FIPS Self Testing) + * Type: OSSL_PARAM_UTF8_STRING + */ +# define OSSL_PROV_FIPS_PARAM_INSTALL_VERSION "install-version" +/* + * The calculated MAC of the install status indicator (Used for FIPS Self Testing) + * Type: OSSL_PARAM_UTF8_STRING + */ +# define OSSL_PROV_FIPS_PARAM_INSTALL_MAC "install-mac" +/* + * The install status indicator (Used for FIPS Self Testing) + * Type: OSSL_PARAM_UTF8_STRING + */ +# define OSSL_PROV_FIPS_PARAM_INSTALL_STATUS "install-status" + +/* + * A boolean that determines if the FIPS conditional test errors result in + * the module entering an error state. + * Type: OSSL_PARAM_UTF8_STRING + */ +# define OSSL_PROV_FIPS_PARAM_CONDITIONAL_ERRORS "conditional-errors" + +/* + * A boolean that determines if the runtime FIPS security checks are performed. + * Type: OSSL_PARAM_UTF8_STRING + */ +# define OSSL_PROV_FIPS_PARAM_SECURITY_CHECKS "security-checks" + +# ifdef __cplusplus +} +# endif + +#endif /* OPENSSL_FIPS_NAMES_H */ diff --git a/OtherInc/openssl/include/openssl/fipskey.h b/OtherInc/openssl/include/openssl/fipskey.h new file mode 100644 index 0000000..ccc1d2f --- /dev/null +++ b/OtherInc/openssl/include/openssl/fipskey.h @@ -0,0 +1,36 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\fipskey.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_FIPSKEY_H +# define OPENSSL_FIPSKEY_H +# pragma once + +# ifdef __cplusplus +extern "C" { +# endif + +/* + * The FIPS validation HMAC key, usable as an array initializer. + */ +#define FIPS_KEY_ELEMENTS \ + 0xf4, 0x55, 0x66, 0x50, 0xac, 0x31, 0xd3, 0x54, 0x61, 0x61, 0x0b, 0xac, 0x4e, 0xd8, 0x1b, 0x1a, 0x18, 0x1b, 0x2d, 0x8a, 0x43, 0xea, 0x28, 0x54, 0xcb, 0xae, 0x22, 0xca, 0x74, 0x56, 0x08, 0x13 + +/* + * The FIPS validation key, as a string. + */ +#define FIPS_KEY_STRING "f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813" + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/hmac.h b/OtherInc/openssl/include/openssl/hmac.h new file mode 100644 index 0000000..f9e1bff --- /dev/null +++ b/OtherInc/openssl/include/openssl/hmac.h @@ -0,0 +1,62 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_HMAC_H +# define OPENSSL_HMAC_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_HMAC_H +# endif + +# include + +# include + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HMAC_MAX_MD_CBLOCK 200 /* Deprecated */ +# endif + +# ifdef __cplusplus +extern "C" { +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 size_t HMAC_size(const HMAC_CTX *e); +OSSL_DEPRECATEDIN_3_0 HMAC_CTX *HMAC_CTX_new(void); +OSSL_DEPRECATEDIN_3_0 int HMAC_CTX_reset(HMAC_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 void HMAC_CTX_free(HMAC_CTX *ctx); +# endif +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur int HMAC_Init(HMAC_CTX *ctx, + const void *key, int len, + const EVP_MD *md); +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, + const EVP_MD *md, ENGINE *impl); +OSSL_DEPRECATEDIN_3_0 int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, + size_t len); +OSSL_DEPRECATEDIN_3_0 int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, + unsigned int *len); +OSSL_DEPRECATEDIN_3_0 __owur int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx); +OSSL_DEPRECATEDIN_3_0 void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags); +OSSL_DEPRECATEDIN_3_0 const EVP_MD *HMAC_CTX_get_md(const HMAC_CTX *ctx); +# endif + +unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, + const unsigned char *data, size_t data_len, + unsigned char *md, unsigned int *md_len); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/http.h b/OtherInc/openssl/include/openssl/http.h new file mode 100644 index 0000000..f7ab214 --- /dev/null +++ b/OtherInc/openssl/include/openssl/http.h @@ -0,0 +1,109 @@ +/* + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright Siemens AG 2018-2020 + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_HTTP_H +# define OPENSSL_HTTP_H +# pragma once + +# include + +# include +# include +# include + + +# ifdef __cplusplus +extern "C" { +# endif + +# define OSSL_HTTP_NAME "http" +# define OSSL_HTTPS_NAME "https" +# define OSSL_HTTP_PREFIX OSSL_HTTP_NAME"://" +# define OSSL_HTTPS_PREFIX OSSL_HTTPS_NAME"://" +# define OSSL_HTTP_PORT "80" +# define OSSL_HTTPS_PORT "443" +# define OPENSSL_NO_PROXY "NO_PROXY" +# define OPENSSL_HTTP_PROXY "HTTP_PROXY" +# define OPENSSL_HTTPS_PROXY "HTTPS_PROXY" + +#define OSSL_HTTP_DEFAULT_MAX_LINE_LEN (4 * 1024) +#define OSSL_HTTP_DEFAULT_MAX_RESP_LEN (100 * 1024) + +/* Low-level HTTP API */ +OSSL_HTTP_REQ_CTX *OSSL_HTTP_REQ_CTX_new(BIO *wbio, BIO *rbio, int buf_size); +void OSSL_HTTP_REQ_CTX_free(OSSL_HTTP_REQ_CTX *rctx); +int OSSL_HTTP_REQ_CTX_set_request_line(OSSL_HTTP_REQ_CTX *rctx, int method_POST, + const char *server, const char *port, + const char *path); +int OSSL_HTTP_REQ_CTX_add1_header(OSSL_HTTP_REQ_CTX *rctx, + const char *name, const char *value); +int OSSL_HTTP_REQ_CTX_set_expected(OSSL_HTTP_REQ_CTX *rctx, + const char *content_type, int asn1, + int timeout, int keep_alive); +int OSSL_HTTP_REQ_CTX_set1_req(OSSL_HTTP_REQ_CTX *rctx, const char *content_type, + const ASN1_ITEM *it, const ASN1_VALUE *req); +int OSSL_HTTP_REQ_CTX_nbio(OSSL_HTTP_REQ_CTX *rctx); +int OSSL_HTTP_REQ_CTX_nbio_d2i(OSSL_HTTP_REQ_CTX *rctx, + ASN1_VALUE **pval, const ASN1_ITEM *it); +BIO *OSSL_HTTP_REQ_CTX_exchange(OSSL_HTTP_REQ_CTX *rctx); +BIO *OSSL_HTTP_REQ_CTX_get0_mem_bio(const OSSL_HTTP_REQ_CTX *rctx); +size_t OSSL_HTTP_REQ_CTX_get_resp_len(const OSSL_HTTP_REQ_CTX *rctx); +void OSSL_HTTP_REQ_CTX_set_max_response_length(OSSL_HTTP_REQ_CTX *rctx, + unsigned long len); +int OSSL_HTTP_is_alive(const OSSL_HTTP_REQ_CTX *rctx); + +/* High-level HTTP API */ +typedef BIO *(*OSSL_HTTP_bio_cb_t)(BIO *bio, void *arg, int connect, int detail); +OSSL_HTTP_REQ_CTX *OSSL_HTTP_open(const char *server, const char *port, + const char *proxy, const char *no_proxy, + int use_ssl, BIO *bio, BIO *rbio, + OSSL_HTTP_bio_cb_t bio_update_fn, void *arg, + int buf_size, int overall_timeout); +int OSSL_HTTP_proxy_connect(BIO *bio, const char *server, const char *port, + const char *proxyuser, const char *proxypass, + int timeout, BIO *bio_err, const char *prog); +int OSSL_HTTP_set1_request(OSSL_HTTP_REQ_CTX *rctx, const char *path, + const STACK_OF(CONF_VALUE) *headers, + const char *content_type, BIO *req, + const char *expected_content_type, int expect_asn1, + size_t max_resp_len, int timeout, int keep_alive); +BIO *OSSL_HTTP_exchange(OSSL_HTTP_REQ_CTX *rctx, char **redirection_url); +BIO *OSSL_HTTP_get(const char *url, const char *proxy, const char *no_proxy, + BIO *bio, BIO *rbio, + OSSL_HTTP_bio_cb_t bio_update_fn, void *arg, + int buf_size, const STACK_OF(CONF_VALUE) *headers, + const char *expected_content_type, int expect_asn1, + size_t max_resp_len, int timeout); +BIO *OSSL_HTTP_transfer(OSSL_HTTP_REQ_CTX **prctx, + const char *server, const char *port, + const char *path, int use_ssl, + const char *proxy, const char *no_proxy, + BIO *bio, BIO *rbio, + OSSL_HTTP_bio_cb_t bio_update_fn, void *arg, + int buf_size, const STACK_OF(CONF_VALUE) *headers, + const char *content_type, BIO *req, + const char *expected_content_type, int expect_asn1, + size_t max_resp_len, int timeout, int keep_alive); +int OSSL_HTTP_close(OSSL_HTTP_REQ_CTX *rctx, int ok); + +/* Auxiliary functions */ +int OSSL_parse_url(const char *url, char **pscheme, char **puser, char **phost, + char **pport, int *pport_num, + char **ppath, char **pquery, char **pfrag); +int OSSL_HTTP_parse_url(const char *url, int *pssl, char **puser, char **phost, + char **pport, int *pport_num, + char **ppath, char **pquery, char **pfrag); +const char *OSSL_HTTP_adapt_proxy(const char *proxy, const char *no_proxy, + const char *server, int use_ssl); + +# ifdef __cplusplus +} +# endif +#endif /* !defined(OPENSSL_HTTP_H) */ diff --git a/OtherInc/openssl/include/openssl/httperr.h b/OtherInc/openssl/include/openssl/httperr.h new file mode 100644 index 0000000..ee08959 --- /dev/null +++ b/OtherInc/openssl/include/openssl/httperr.h @@ -0,0 +1,55 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_HTTPERR_H +# define OPENSSL_HTTPERR_H +# pragma once + +# include +# include +# include + + + +/* + * HTTP reason codes. + */ +# define HTTP_R_ASN1_LEN_EXCEEDS_MAX_RESP_LEN 108 +# define HTTP_R_CONNECT_FAILURE 100 +# define HTTP_R_ERROR_PARSING_ASN1_LENGTH 109 +# define HTTP_R_ERROR_PARSING_CONTENT_LENGTH 119 +# define HTTP_R_ERROR_PARSING_URL 101 +# define HTTP_R_ERROR_RECEIVING 103 +# define HTTP_R_ERROR_SENDING 102 +# define HTTP_R_FAILED_READING_DATA 128 +# define HTTP_R_HEADER_PARSE_ERROR 126 +# define HTTP_R_INCONSISTENT_CONTENT_LENGTH 120 +# define HTTP_R_INVALID_PORT_NUMBER 123 +# define HTTP_R_INVALID_URL_PATH 125 +# define HTTP_R_INVALID_URL_SCHEME 124 +# define HTTP_R_MAX_RESP_LEN_EXCEEDED 117 +# define HTTP_R_MISSING_ASN1_ENCODING 110 +# define HTTP_R_MISSING_CONTENT_TYPE 121 +# define HTTP_R_MISSING_REDIRECT_LOCATION 111 +# define HTTP_R_RECEIVED_ERROR 105 +# define HTTP_R_RECEIVED_WRONG_HTTP_VERSION 106 +# define HTTP_R_REDIRECTION_FROM_HTTPS_TO_HTTP 112 +# define HTTP_R_REDIRECTION_NOT_ENABLED 116 +# define HTTP_R_RESPONSE_LINE_TOO_LONG 113 +# define HTTP_R_RESPONSE_PARSE_ERROR 104 +# define HTTP_R_RETRY_TIMEOUT 129 +# define HTTP_R_SERVER_CANCELED_CONNECTION 127 +# define HTTP_R_SOCK_NOT_SUPPORTED 122 +# define HTTP_R_STATUS_CODE_UNSUPPORTED 114 +# define HTTP_R_TLS_NOT_ENABLED 107 +# define HTTP_R_TOO_MANY_REDIRECTIONS 115 +# define HTTP_R_UNEXPECTED_CONTENT_TYPE 118 + +#endif diff --git a/OtherInc/openssl/include/openssl/idea.h b/OtherInc/openssl/include/openssl/idea.h new file mode 100644 index 0000000..1f9bb3b --- /dev/null +++ b/OtherInc/openssl/include/openssl/idea.h @@ -0,0 +1,82 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_IDEA_H +# define OPENSSL_IDEA_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_IDEA_H +# endif + +# include + +# ifndef OPENSSL_NO_IDEA +# ifdef __cplusplus +extern "C" { +# endif + +# define IDEA_BLOCK 8 +# define IDEA_KEY_LENGTH 16 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 + +typedef unsigned int IDEA_INT; + +# define IDEA_ENCRYPT 1 +# define IDEA_DECRYPT 0 + +typedef struct idea_key_st { + IDEA_INT data[9][6]; +} IDEA_KEY_SCHEDULE; +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *IDEA_options(void); +OSSL_DEPRECATEDIN_3_0 void IDEA_ecb_encrypt(const unsigned char *in, + unsigned char *out, + IDEA_KEY_SCHEDULE *ks); +OSSL_DEPRECATEDIN_3_0 void IDEA_set_encrypt_key(const unsigned char *key, + IDEA_KEY_SCHEDULE *ks); +OSSL_DEPRECATEDIN_3_0 void IDEA_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, + IDEA_KEY_SCHEDULE *dk); +OSSL_DEPRECATEDIN_3_0 void IDEA_cbc_encrypt(const unsigned char *in, + unsigned char *out, long length, + IDEA_KEY_SCHEDULE *ks, + unsigned char *iv, int enc); +OSSL_DEPRECATEDIN_3_0 void IDEA_cfb64_encrypt(const unsigned char *in, + unsigned char *out, long length, + IDEA_KEY_SCHEDULE *ks, + unsigned char *iv, int *num, + int enc); +OSSL_DEPRECATEDIN_3_0 void IDEA_ofb64_encrypt(const unsigned char *in, + unsigned char *out, long length, + IDEA_KEY_SCHEDULE *ks, + unsigned char *iv, int *num); +OSSL_DEPRECATEDIN_3_0 void IDEA_encrypt(unsigned long *in, + IDEA_KEY_SCHEDULE *ks); +#endif + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define idea_options IDEA_options +# define idea_ecb_encrypt IDEA_ecb_encrypt +# define idea_set_encrypt_key IDEA_set_encrypt_key +# define idea_set_decrypt_key IDEA_set_decrypt_key +# define idea_cbc_encrypt IDEA_cbc_encrypt +# define idea_cfb64_encrypt IDEA_cfb64_encrypt +# define idea_ofb64_encrypt IDEA_ofb64_encrypt +# define idea_encrypt IDEA_encrypt +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/kdf.h b/OtherInc/openssl/include/openssl/kdf.h new file mode 100644 index 0000000..0983230 --- /dev/null +++ b/OtherInc/openssl/include/openssl/kdf.h @@ -0,0 +1,138 @@ +/* + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_KDF_H +# define OPENSSL_KDF_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_KDF_H +# endif + +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +int EVP_KDF_up_ref(EVP_KDF *kdf); +void EVP_KDF_free(EVP_KDF *kdf); +EVP_KDF *EVP_KDF_fetch(OSSL_LIB_CTX *libctx, const char *algorithm, + const char *properties); + +EVP_KDF_CTX *EVP_KDF_CTX_new(EVP_KDF *kdf); +void EVP_KDF_CTX_free(EVP_KDF_CTX *ctx); +EVP_KDF_CTX *EVP_KDF_CTX_dup(const EVP_KDF_CTX *src); +const char *EVP_KDF_get0_description(const EVP_KDF *kdf); +int EVP_KDF_is_a(const EVP_KDF *kdf, const char *name); +const char *EVP_KDF_get0_name(const EVP_KDF *kdf); +const OSSL_PROVIDER *EVP_KDF_get0_provider(const EVP_KDF *kdf); +const EVP_KDF *EVP_KDF_CTX_kdf(EVP_KDF_CTX *ctx); + +void EVP_KDF_CTX_reset(EVP_KDF_CTX *ctx); +size_t EVP_KDF_CTX_get_kdf_size(EVP_KDF_CTX *ctx); +int EVP_KDF_derive(EVP_KDF_CTX *ctx, unsigned char *key, size_t keylen, + const OSSL_PARAM params[]); +int EVP_KDF_get_params(EVP_KDF *kdf, OSSL_PARAM params[]); +int EVP_KDF_CTX_get_params(EVP_KDF_CTX *ctx, OSSL_PARAM params[]); +int EVP_KDF_CTX_set_params(EVP_KDF_CTX *ctx, const OSSL_PARAM params[]); +const OSSL_PARAM *EVP_KDF_gettable_params(const EVP_KDF *kdf); +const OSSL_PARAM *EVP_KDF_gettable_ctx_params(const EVP_KDF *kdf); +const OSSL_PARAM *EVP_KDF_settable_ctx_params(const EVP_KDF *kdf); +const OSSL_PARAM *EVP_KDF_CTX_gettable_params(EVP_KDF_CTX *ctx); +const OSSL_PARAM *EVP_KDF_CTX_settable_params(EVP_KDF_CTX *ctx); + +void EVP_KDF_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(EVP_KDF *kdf, void *arg), + void *arg); +int EVP_KDF_names_do_all(const EVP_KDF *kdf, + void (*fn)(const char *name, void *data), + void *data); + +# define EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND 0 +# define EVP_KDF_HKDF_MODE_EXTRACT_ONLY 1 +# define EVP_KDF_HKDF_MODE_EXPAND_ONLY 2 + +#define EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV 65 +#define EVP_KDF_SSHKDF_TYPE_INITIAL_IV_SRV_TO_CLI 66 +#define EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_CLI_TO_SRV 67 +#define EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_SRV_TO_CLI 68 +#define EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_CLI_TO_SRV 69 +#define EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_SRV_TO_CLI 70 + +/**** The legacy PKEY-based KDF API follows. ****/ + +# define EVP_PKEY_CTRL_TLS_MD (EVP_PKEY_ALG_CTRL) +# define EVP_PKEY_CTRL_TLS_SECRET (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_TLS_SEED (EVP_PKEY_ALG_CTRL + 2) +# define EVP_PKEY_CTRL_HKDF_MD (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_HKDF_SALT (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_HKDF_KEY (EVP_PKEY_ALG_CTRL + 5) +# define EVP_PKEY_CTRL_HKDF_INFO (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_HKDF_MODE (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_PASS (EVP_PKEY_ALG_CTRL + 8) +# define EVP_PKEY_CTRL_SCRYPT_SALT (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_SCRYPT_N (EVP_PKEY_ALG_CTRL + 10) +# define EVP_PKEY_CTRL_SCRYPT_R (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_SCRYPT_P (EVP_PKEY_ALG_CTRL + 12) +# define EVP_PKEY_CTRL_SCRYPT_MAXMEM_BYTES (EVP_PKEY_ALG_CTRL + 13) + +# define EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND \ + EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND +# define EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY \ + EVP_KDF_HKDF_MODE_EXTRACT_ONLY +# define EVP_PKEY_HKDEF_MODE_EXPAND_ONLY \ + EVP_KDF_HKDF_MODE_EXPAND_ONLY + +int EVP_PKEY_CTX_set_tls1_prf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); + +int EVP_PKEY_CTX_set1_tls1_prf_secret(EVP_PKEY_CTX *pctx, + const unsigned char *sec, int seclen); + +int EVP_PKEY_CTX_add1_tls1_prf_seed(EVP_PKEY_CTX *pctx, + const unsigned char *seed, int seedlen); + +int EVP_PKEY_CTX_set_hkdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); + +int EVP_PKEY_CTX_set1_hkdf_salt(EVP_PKEY_CTX *ctx, + const unsigned char *salt, int saltlen); + +int EVP_PKEY_CTX_set1_hkdf_key(EVP_PKEY_CTX *ctx, + const unsigned char *key, int keylen); + +int EVP_PKEY_CTX_add1_hkdf_info(EVP_PKEY_CTX *ctx, + const unsigned char *info, int infolen); + +int EVP_PKEY_CTX_set_hkdf_mode(EVP_PKEY_CTX *ctx, int mode); +# define EVP_PKEY_CTX_hkdf_mode EVP_PKEY_CTX_set_hkdf_mode + +int EVP_PKEY_CTX_set1_pbe_pass(EVP_PKEY_CTX *ctx, const char *pass, + int passlen); + +int EVP_PKEY_CTX_set1_scrypt_salt(EVP_PKEY_CTX *ctx, + const unsigned char *salt, int saltlen); + +int EVP_PKEY_CTX_set_scrypt_N(EVP_PKEY_CTX *ctx, uint64_t n); + +int EVP_PKEY_CTX_set_scrypt_r(EVP_PKEY_CTX *ctx, uint64_t r); + +int EVP_PKEY_CTX_set_scrypt_p(EVP_PKEY_CTX *ctx, uint64_t p); + +int EVP_PKEY_CTX_set_scrypt_maxmem_bytes(EVP_PKEY_CTX *ctx, + uint64_t maxmem_bytes); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/kdferr.h b/OtherInc/openssl/include/openssl/kdferr.h new file mode 100644 index 0000000..963d766 --- /dev/null +++ b/OtherInc/openssl/include/openssl/kdferr.h @@ -0,0 +1,16 @@ +/* + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_KDFERR_H +# define OPENSSL_KDFERR_H +# pragma once + +#include + +#endif /* !defined(OPENSSL_KDFERR_H) */ diff --git a/OtherInc/openssl/include/openssl/lhash.h b/OtherInc/openssl/include/openssl/lhash.h new file mode 100644 index 0000000..39dd625 --- /dev/null +++ b/OtherInc/openssl/include/openssl/lhash.h @@ -0,0 +1,288 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +/* + * Header for dynamic hash table routines Author - Eric Young + */ + +#ifndef OPENSSL_LHASH_H +# define OPENSSL_LHASH_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_LHASH_H +# endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st OPENSSL_LH_NODE; +typedef int (*OPENSSL_LH_COMPFUNC) (const void *, const void *); +typedef unsigned long (*OPENSSL_LH_HASHFUNC) (const void *); +typedef void (*OPENSSL_LH_DOALL_FUNC) (void *); +typedef void (*OPENSSL_LH_DOALL_FUNCARG) (void *, void *); +typedef struct lhash_st OPENSSL_LHASH; + +/* + * Macros for declaring and implementing type-safe wrappers for LHASH + * callbacks. This way, callbacks can be provided to LHASH structures without + * function pointer casting and the macro-defined callbacks provide + * per-variable casting before deferring to the underlying type-specific + * callbacks. NB: It is possible to place a "static" in front of both the + * DECLARE and IMPLEMENT macros if the functions are strictly internal. + */ + +/* First: "hash" functions */ +# define DECLARE_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *); +# define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *arg) { \ + const o_type *a = arg; \ + return name##_hash(a); } +# define LHASH_HASH_FN(name) name##_LHASH_HASH + +/* Second: "compare" functions */ +# define DECLARE_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *, const void *); +# define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ + const o_type *a = arg1; \ + const o_type *b = arg2; \ + return name##_cmp(a,b); } +# define LHASH_COMP_FN(name) name##_LHASH_COMP + +/* Fourth: "doall_arg" functions */ +# define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *, void *); +# define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ + o_type *a = arg1; \ + a_type *b = arg2; \ + name##_doall_arg(a, b); } +# define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG + + +# define LH_LOAD_MULT 256 + +int OPENSSL_LH_error(OPENSSL_LHASH *lh); +OPENSSL_LHASH *OPENSSL_LH_new(OPENSSL_LH_HASHFUNC h, OPENSSL_LH_COMPFUNC c); +void OPENSSL_LH_free(OPENSSL_LHASH *lh); +void OPENSSL_LH_flush(OPENSSL_LHASH *lh); +void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data); +void *OPENSSL_LH_delete(OPENSSL_LHASH *lh, const void *data); +void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data); +void OPENSSL_LH_doall(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNC func); +void OPENSSL_LH_doall_arg(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNCARG func, void *arg); +unsigned long OPENSSL_LH_strhash(const char *c); +unsigned long OPENSSL_LH_num_items(const OPENSSL_LHASH *lh); +unsigned long OPENSSL_LH_get_down_load(const OPENSSL_LHASH *lh); +void OPENSSL_LH_set_down_load(OPENSSL_LHASH *lh, unsigned long down_load); + +# ifndef OPENSSL_NO_STDIO +void OPENSSL_LH_stats(const OPENSSL_LHASH *lh, FILE *fp); +void OPENSSL_LH_node_stats(const OPENSSL_LHASH *lh, FILE *fp); +void OPENSSL_LH_node_usage_stats(const OPENSSL_LHASH *lh, FILE *fp); +# endif +void OPENSSL_LH_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +void OPENSSL_LH_node_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define _LHASH OPENSSL_LHASH +# define LHASH_NODE OPENSSL_LH_NODE +# define lh_error OPENSSL_LH_error +# define lh_new OPENSSL_LH_new +# define lh_free OPENSSL_LH_free +# define lh_insert OPENSSL_LH_insert +# define lh_delete OPENSSL_LH_delete +# define lh_retrieve OPENSSL_LH_retrieve +# define lh_doall OPENSSL_LH_doall +# define lh_doall_arg OPENSSL_LH_doall_arg +# define lh_strhash OPENSSL_LH_strhash +# define lh_num_items OPENSSL_LH_num_items +# ifndef OPENSSL_NO_STDIO +# define lh_stats OPENSSL_LH_stats +# define lh_node_stats OPENSSL_LH_node_stats +# define lh_node_usage_stats OPENSSL_LH_node_usage_stats +# endif +# define lh_stats_bio OPENSSL_LH_stats_bio +# define lh_node_stats_bio OPENSSL_LH_node_stats_bio +# define lh_node_usage_stats_bio OPENSSL_LH_node_usage_stats_bio +# endif + +/* Type checking... */ + +# define LHASH_OF(type) struct lhash_st_##type + +/* Helper macro for internal use */ +# define DEFINE_LHASH_OF_INTERNAL(type) \ + LHASH_OF(type) { union lh_##type##_dummy { void* d1; unsigned long d2; int d3; } dummy; }; \ + typedef int (*lh_##type##_compfunc)(const type *a, const type *b); \ + typedef unsigned long (*lh_##type##_hashfunc)(const type *a); \ + typedef void (*lh_##type##_doallfunc)(type *a); \ + static ossl_unused ossl_inline type *ossl_check_##type##_lh_plain_type(type *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const type *ossl_check_const_##type##_lh_plain_type(const type *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const OPENSSL_LHASH *ossl_check_const_##type##_lh_type(const LHASH_OF(type) *lh) \ + { \ + return (const OPENSSL_LHASH *)lh; \ + } \ + static ossl_unused ossl_inline OPENSSL_LHASH *ossl_check_##type##_lh_type(LHASH_OF(type) *lh) \ + { \ + return (OPENSSL_LHASH *)lh; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_COMPFUNC ossl_check_##type##_lh_compfunc_type(lh_##type##_compfunc cmp) \ + { \ + return (OPENSSL_LH_COMPFUNC)cmp; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_HASHFUNC ossl_check_##type##_lh_hashfunc_type(lh_##type##_hashfunc hfn) \ + { \ + return (OPENSSL_LH_HASHFUNC)hfn; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_DOALL_FUNC ossl_check_##type##_lh_doallfunc_type(lh_##type##_doallfunc dfn) \ + { \ + return (OPENSSL_LH_DOALL_FUNC)dfn; \ + } \ + LHASH_OF(type) + +# define DEFINE_LHASH_OF(type) \ + LHASH_OF(type) { union lh_##type##_dummy { void* d1; unsigned long d2; int d3; } dummy; }; \ + static ossl_unused ossl_inline LHASH_OF(type) *lh_##type##_new(unsigned long (*hfn)(const type *), \ + int (*cfn)(const type *, const type *)) \ + { \ + return (LHASH_OF(type) *) \ + OPENSSL_LH_new((OPENSSL_LH_HASHFUNC)hfn, (OPENSSL_LH_COMPFUNC)cfn); \ + } \ + static ossl_unused ossl_inline void lh_##type##_free(LHASH_OF(type) *lh) \ + { \ + OPENSSL_LH_free((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void lh_##type##_flush(LHASH_OF(type) *lh) \ + { \ + OPENSSL_LH_flush((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline type *lh_##type##_insert(LHASH_OF(type) *lh, type *d) \ + { \ + return (type *)OPENSSL_LH_insert((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline type *lh_##type##_delete(LHASH_OF(type) *lh, const type *d) \ + { \ + return (type *)OPENSSL_LH_delete((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline type *lh_##type##_retrieve(LHASH_OF(type) *lh, const type *d) \ + { \ + return (type *)OPENSSL_LH_retrieve((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline int lh_##type##_error(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_error((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline unsigned long lh_##type##_num_items(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_num_items((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void lh_##type##_node_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_node_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline void lh_##type##_node_usage_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_node_usage_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline void lh_##type##_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline unsigned long lh_##type##_get_down_load(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_get_down_load((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void lh_##type##_set_down_load(LHASH_OF(type) *lh, unsigned long dl) \ + { \ + OPENSSL_LH_set_down_load((OPENSSL_LHASH *)lh, dl); \ + } \ + static ossl_unused ossl_inline void lh_##type##_doall(LHASH_OF(type) *lh, \ + void (*doall)(type *)) \ + { \ + OPENSSL_LH_doall((OPENSSL_LHASH *)lh, (OPENSSL_LH_DOALL_FUNC)doall); \ + } \ + static ossl_unused ossl_inline void lh_##type##_doall_arg(LHASH_OF(type) *lh, \ + void (*doallarg)(type *, void *), \ + void *arg) \ + { \ + OPENSSL_LH_doall_arg((OPENSSL_LHASH *)lh, \ + (OPENSSL_LH_DOALL_FUNCARG)doallarg, arg); \ + } \ + LHASH_OF(type) + +#define IMPLEMENT_LHASH_DOALL_ARG_CONST(type, argtype) \ + int_implement_lhash_doall(type, argtype, const type) + +#define IMPLEMENT_LHASH_DOALL_ARG(type, argtype) \ + int_implement_lhash_doall(type, argtype, type) + +#define int_implement_lhash_doall(type, argtype, cbargtype) \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_##argtype(LHASH_OF(type) *lh, \ + void (*fn)(cbargtype *, argtype *), \ + argtype *arg) \ + { \ + OPENSSL_LH_doall_arg((OPENSSL_LHASH *)lh, (OPENSSL_LH_DOALL_FUNCARG)fn, (void *)arg); \ + } \ + LHASH_OF(type) + +DEFINE_LHASH_OF_INTERNAL(OPENSSL_STRING); +#define lh_OPENSSL_STRING_new(hfn, cmp) ((LHASH_OF(OPENSSL_STRING) *)OPENSSL_LH_new(ossl_check_OPENSSL_STRING_lh_hashfunc_type(hfn), ossl_check_OPENSSL_STRING_lh_compfunc_type(cmp))) +#define lh_OPENSSL_STRING_free(lh) OPENSSL_LH_free(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_flush(lh) OPENSSL_LH_flush(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_insert(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_insert(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_delete(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_delete(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_const_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_retrieve(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_retrieve(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_const_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_error(lh) OPENSSL_LH_error(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_num_items(lh) OPENSSL_LH_num_items(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_OPENSSL_STRING_lh_type(lh), dl) +#define lh_OPENSSL_STRING_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_OPENSSL_STRING_lh_doallfunc_type(dfn)) +DEFINE_LHASH_OF_INTERNAL(OPENSSL_CSTRING); +#define lh_OPENSSL_CSTRING_new(hfn, cmp) ((LHASH_OF(OPENSSL_CSTRING) *)OPENSSL_LH_new(ossl_check_OPENSSL_CSTRING_lh_hashfunc_type(hfn), ossl_check_OPENSSL_CSTRING_lh_compfunc_type(cmp))) +#define lh_OPENSSL_CSTRING_free(lh) OPENSSL_LH_free(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_flush(lh) OPENSSL_LH_flush(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_insert(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_insert(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_delete(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_delete(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_const_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_retrieve(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_retrieve(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_const_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_error(lh) OPENSSL_LH_error(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_num_items(lh) OPENSSL_LH_num_items(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_OPENSSL_CSTRING_lh_type(lh), dl) +#define lh_OPENSSL_CSTRING_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_OPENSSL_CSTRING_lh_doallfunc_type(dfn)) + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/OtherInc/openssl/include/openssl/macros.h b/OtherInc/openssl/include/openssl/macros.h new file mode 100644 index 0000000..a6bc3f1 --- /dev/null +++ b/OtherInc/openssl/include/openssl/macros.h @@ -0,0 +1,304 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_MACROS_H +# define OPENSSL_MACROS_H +# pragma once + +#include +#include + + +/* Helper macros for CPP string composition */ +# define OPENSSL_MSTR_HELPER(x) #x +# define OPENSSL_MSTR(x) OPENSSL_MSTR_HELPER(x) + +/* + * Sometimes OPENSSL_NO_xxx ends up with an empty file and some compilers + * don't like that. This will hopefully silence them. + */ +# define NON_EMPTY_TRANSLATION_UNIT static void *dummy = &dummy; + +/* + * Generic deprecation macro + * + * If OPENSSL_SUPPRESS_DEPRECATED is defined, then OSSL_DEPRECATED and + * OSSL_DEPRECATED_FOR become no-ops + */ +# ifndef OSSL_DEPRECATED +# undef OSSL_DEPRECATED_FOR +# ifndef OPENSSL_SUPPRESS_DEPRECATED +# if defined(_MSC_VER) + /* + * MSVC supports __declspec(deprecated) since MSVC 2003 (13.10), + * and __declspec(deprecated(message)) since MSVC 2005 (14.00) + */ +# if _MSC_VER >= 1400 +# define OSSL_DEPRECATED(since) \ + __declspec(deprecated("Since OpenSSL " # since)) +# define OSSL_DEPRECATED_FOR(since, message) \ + __declspec(deprecated("Since OpenSSL " # since ";" message)) +# elif _MSC_VER >= 1310 +# define OSSL_DEPRECATED(since) __declspec(deprecated) +# define OSSL_DEPRECATED_FOR(since, message) __declspec(deprecated) +# endif +# elif defined(__GNUC__) + /* + * According to GCC documentation, deprecations with message appeared in + * GCC 4.5.0 + */ +# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +# define OSSL_DEPRECATED(since) \ + __attribute__((deprecated("Since OpenSSL " # since))) +# define OSSL_DEPRECATED_FOR(since, message) \ + __attribute__((deprecated("Since OpenSSL " # since ";" message))) +# elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 0) +# define OSSL_DEPRECATED(since) __attribute__((deprecated)) +# define OSSL_DEPRECATED_FOR(since, message) __attribute__((deprecated)) +# endif +# elif defined(__SUNPRO_C) +# if (__SUNPRO_C >= 0x5130) +# define OSSL_DEPRECATED(since) __attribute__ ((deprecated)) +# define OSSL_DEPRECATED_FOR(since, message) __attribute__ ((deprecated)) +# endif +# endif +# endif +# endif + +/* + * Still not defined? Then define no-op macros. This means these macros + * are unsuitable for use in a typedef. + */ +# ifndef OSSL_DEPRECATED +# define OSSL_DEPRECATED(since) extern +# define OSSL_DEPRECATED_FOR(since, message) extern +# endif + +/* + * Applications should use -DOPENSSL_API_COMPAT= to suppress the + * declarations of functions deprecated in or before . If this is + * undefined, the value of the macro OPENSSL_CONFIGURED_API (defined in + * ) is the default. + * + * For any version number up until version 1.1.x, is expected to be + * the calculated version number 0xMNNFFPPSL. + * For version numbers 3.0 and on, is expected to be a computation + * of the major and minor numbers in decimal using this formula: + * + * MAJOR * 10000 + MINOR * 100 + * + * So version 3.0 becomes 30000, version 3.2 becomes 30200, etc. + */ + +/* + * We use the OPENSSL_API_COMPAT value to define API level macros. These + * macros are used to enable or disable features at that API version boundary. + */ + +# ifdef OPENSSL_API_LEVEL +# error "OPENSSL_API_LEVEL must not be defined by application" +# endif + +/* + * We figure out what API level was intended by simple numeric comparison. + * The lowest old style number we recognise is 0x00908000L, so we take some + * safety margin and assume that anything below 0x00900000L is a new style + * number. This allows new versions up to and including v943.71.83. + */ +# ifdef OPENSSL_API_COMPAT +# if OPENSSL_API_COMPAT < 0x900000L +# define OPENSSL_API_LEVEL (OPENSSL_API_COMPAT) +# else +# define OPENSSL_API_LEVEL \ + (((OPENSSL_API_COMPAT >> 28) & 0xF) * 10000 \ + + ((OPENSSL_API_COMPAT >> 20) & 0xFF) * 100 \ + + ((OPENSSL_API_COMPAT >> 12) & 0xFF)) +# endif +# endif + +/* + * If OPENSSL_API_COMPAT wasn't given, we use default numbers to set + * the API compatibility level. + */ +# ifndef OPENSSL_API_LEVEL +# if OPENSSL_CONFIGURED_API > 0 +# define OPENSSL_API_LEVEL (OPENSSL_CONFIGURED_API) +# else +# define OPENSSL_API_LEVEL \ + (OPENSSL_VERSION_MAJOR * 10000 + OPENSSL_VERSION_MINOR * 100) +# endif +# endif + +# if OPENSSL_API_LEVEL > OPENSSL_CONFIGURED_API +# error "The requested API level higher than the configured API compatibility level" +# endif + +/* + * Check of sane values. + */ +/* Can't go higher than the current version. */ +# if OPENSSL_API_LEVEL > (OPENSSL_VERSION_MAJOR * 10000 + OPENSSL_VERSION_MINOR * 100) +# error "OPENSSL_API_COMPAT expresses an impossible API compatibility level" +# endif +/* OpenSSL will have no version 2.y.z */ +# if OPENSSL_API_LEVEL < 30000 && OPENSSL_API_LEVEL >= 20000 +# error "OPENSSL_API_COMPAT expresses an impossible API compatibility level" +# endif +/* Below 0.9.8 is unacceptably low */ +# if OPENSSL_API_LEVEL < 908 +# error "OPENSSL_API_COMPAT expresses an impossible API compatibility level" +# endif + +/* + * Define macros for deprecation and simulated removal purposes. + * + * The macros OSSL_DEPRECATED_{major}_{minor} are always defined for + * all OpenSSL versions we care for. They can be used as attributes + * in function declarations where appropriate. + * + * The macros OPENSSL_NO_DEPRECATED_{major}_{minor} are defined for + * all OpenSSL versions up to or equal to the version given with + * OPENSSL_API_COMPAT. They are used as guards around anything that's + * deprecated up to that version, as an effect of the developer option + * 'no-deprecated'. + */ + +# undef OPENSSL_NO_DEPRECATED_3_0 +# undef OPENSSL_NO_DEPRECATED_1_1_1 +# undef OPENSSL_NO_DEPRECATED_1_1_0 +# undef OPENSSL_NO_DEPRECATED_1_0_2 +# undef OPENSSL_NO_DEPRECATED_1_0_1 +# undef OPENSSL_NO_DEPRECATED_1_0_0 +# undef OPENSSL_NO_DEPRECATED_0_9_8 + +# if OPENSSL_API_LEVEL >= 30000 +# ifndef OPENSSL_NO_DEPRECATED +# define OSSL_DEPRECATEDIN_3_0 OSSL_DEPRECATED(3.0) +# define OSSL_DEPRECATEDIN_3_0_FOR(msg) OSSL_DEPRECATED_FOR(3.0, msg) +# else +# define OPENSSL_NO_DEPRECATED_3_0 +# endif +# else +# define OSSL_DEPRECATEDIN_3_0 +# define OSSL_DEPRECATEDIN_3_0_FOR(msg) +# endif +# if OPENSSL_API_LEVEL >= 10101 +# ifndef OPENSSL_NO_DEPRECATED +# define OSSL_DEPRECATEDIN_1_1_1 OSSL_DEPRECATED(1.1.1) +# define OSSL_DEPRECATEDIN_1_1_1_FOR(msg) OSSL_DEPRECATED_FOR(1.1.1, msg) +# else +# define OPENSSL_NO_DEPRECATED_1_1_1 +# endif +# else +# define OSSL_DEPRECATEDIN_1_1_1 +# define OSSL_DEPRECATEDIN_1_1_1_FOR(msg) +# endif +# if OPENSSL_API_LEVEL >= 10100 +# ifndef OPENSSL_NO_DEPRECATED +# define OSSL_DEPRECATEDIN_1_1_0 OSSL_DEPRECATED(1.1.0) +# define OSSL_DEPRECATEDIN_1_1_0_FOR(msg) OSSL_DEPRECATED_FOR(1.1.0, msg) +# else +# define OPENSSL_NO_DEPRECATED_1_1_0 +# endif +# else +# define OSSL_DEPRECATEDIN_1_1_0 +# define OSSL_DEPRECATEDIN_1_1_0_FOR(msg) +# endif +# if OPENSSL_API_LEVEL >= 10002 +# ifndef OPENSSL_NO_DEPRECATED +# define OSSL_DEPRECATEDIN_1_0_2 OSSL_DEPRECATED(1.0.2) +# define OSSL_DEPRECATEDIN_1_0_2_FOR(msg) OSSL_DEPRECATED_FOR(1.0.2, msg) +# else +# define OPENSSL_NO_DEPRECATED_1_0_2 +# endif +# else +# define OSSL_DEPRECATEDIN_1_0_2 +# define OSSL_DEPRECATEDIN_1_0_2_FOR(msg) +# endif +# if OPENSSL_API_LEVEL >= 10001 +# ifndef OPENSSL_NO_DEPRECATED +# define OSSL_DEPRECATEDIN_1_0_1 OSSL_DEPRECATED(1.0.1) +# define OSSL_DEPRECATEDIN_1_0_1_FOR(msg) OSSL_DEPRECATED_FOR(1.0.1, msg) +# else +# define OPENSSL_NO_DEPRECATED_1_0_1 +# endif +# else +# define OSSL_DEPRECATEDIN_1_0_1 +# define OSSL_DEPRECATEDIN_1_0_1_FOR(msg) +# endif +# if OPENSSL_API_LEVEL >= 10000 +# ifndef OPENSSL_NO_DEPRECATED +# define OSSL_DEPRECATEDIN_1_0_0 OSSL_DEPRECATED(1.0.0) +# define OSSL_DEPRECATEDIN_1_0_0_FOR(msg) OSSL_DEPRECATED_FOR(1.0.0, msg) +# else +# define OPENSSL_NO_DEPRECATED_1_0_0 +# endif +# else +# define OSSL_DEPRECATEDIN_1_0_0 +# define OSSL_DEPRECATEDIN_1_0_0_FOR(msg) +# endif +# if OPENSSL_API_LEVEL >= 908 +# ifndef OPENSSL_NO_DEPRECATED +# define OSSL_DEPRECATEDIN_0_9_8 OSSL_DEPRECATED(0.9.8) +# define OSSL_DEPRECATEDIN_0_9_8_FOR(msg) OSSL_DEPRECATED_FOR(0.9.8, msg) +# else +# define OPENSSL_NO_DEPRECATED_0_9_8 +# endif +# else +# define OSSL_DEPRECATEDIN_0_9_8 +# define OSSL_DEPRECATEDIN_0_9_8_FOR(msg) +# endif + +/* + * Make our own variants of __FILE__ and __LINE__, depending on configuration + */ + +# ifndef OPENSSL_FILE +# ifdef OPENSSL_NO_FILENAMES +# define OPENSSL_FILE "" +# define OPENSSL_LINE 0 +# else +# define OPENSSL_FILE __FILE__ +# define OPENSSL_LINE __LINE__ +# endif +# endif + +/* + * __func__ was standardized in C99, so for any compiler that claims + * to implement that language level or newer, we assume we can safely + * use that symbol. + * + * GNU C also provides __FUNCTION__ since version 2, which predates + * C99. We can, however, only use this if __STDC_VERSION__ exists, + * as it's otherwise not allowed according to ISO C standards (C90). + * (compiling with GNU C's -pedantic tells us so) + * + * If none of the above applies, we check if the compiler is MSVC, + * and use __FUNCTION__ if that's the case. + */ +# ifndef OPENSSL_FUNC +# if defined(__STDC_VERSION__) +# if __STDC_VERSION__ >= 199901L +# define OPENSSL_FUNC __func__ +# elif defined(__GNUC__) && __GNUC__ >= 2 +# define OPENSSL_FUNC __FUNCTION__ +# endif +# elif defined(_MSC_VER) +# define OPENSSL_FUNC __FUNCTION__ +# endif +/* + * If all these possibilities are exhausted, we give up and use a + * static string. + */ +# ifndef OPENSSL_FUNC +# define OPENSSL_FUNC "(unknown function)" +# endif +# endif + +#endif /* OPENSSL_MACROS_H */ diff --git a/OtherInc/openssl/include/openssl/md2.h b/OtherInc/openssl/include/openssl/md2.h new file mode 100644 index 0000000..5d4cb77 --- /dev/null +++ b/OtherInc/openssl/include/openssl/md2.h @@ -0,0 +1,56 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_MD2_H +# define OPENSSL_MD2_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_MD2_H +# endif + +# include + +# ifndef OPENSSL_NO_MD2 +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define MD2_DIGEST_LENGTH 16 + +# if !defined(OPENSSL_NO_DEPRECATED_3_0) + +typedef unsigned char MD2_INT; + +# define MD2_BLOCK 16 + +typedef struct MD2state_st { + unsigned int num; + unsigned char data[MD2_BLOCK]; + MD2_INT cksm[MD2_BLOCK]; + MD2_INT state[MD2_BLOCK]; +} MD2_CTX; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *MD2_options(void); +OSSL_DEPRECATEDIN_3_0 int MD2_Init(MD2_CTX *c); +OSSL_DEPRECATEDIN_3_0 int MD2_Update(MD2_CTX *c, const unsigned char *data, + size_t len); +OSSL_DEPRECATEDIN_3_0 int MD2_Final(unsigned char *md, MD2_CTX *c); +OSSL_DEPRECATEDIN_3_0 unsigned char *MD2(const unsigned char *d, size_t n, + unsigned char *md); +# endif + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/md4.h b/OtherInc/openssl/include/openssl/md4.h new file mode 100644 index 0000000..6c150a6 --- /dev/null +++ b/OtherInc/openssl/include/openssl/md4.h @@ -0,0 +1,63 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_MD4_H +# define OPENSSL_MD4_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_MD4_H +# endif + +# include + +# ifndef OPENSSL_NO_MD4 +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define MD4_DIGEST_LENGTH 16 + +# if !defined(OPENSSL_NO_DEPRECATED_3_0) + +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD4_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ +# define MD4_LONG unsigned int + +# define MD4_CBLOCK 64 +# define MD4_LBLOCK (MD4_CBLOCK/4) + +typedef struct MD4state_st { + MD4_LONG A, B, C, D; + MD4_LONG Nl, Nh; + MD4_LONG data[MD4_LBLOCK]; + unsigned int num; +} MD4_CTX; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int MD4_Init(MD4_CTX *c); +OSSL_DEPRECATEDIN_3_0 int MD4_Update(MD4_CTX *c, const void *data, size_t len); +OSSL_DEPRECATEDIN_3_0 int MD4_Final(unsigned char *md, MD4_CTX *c); +OSSL_DEPRECATEDIN_3_0 unsigned char *MD4(const unsigned char *d, size_t n, + unsigned char *md); +OSSL_DEPRECATEDIN_3_0 void MD4_Transform(MD4_CTX *c, const unsigned char *b); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/md5.h b/OtherInc/openssl/include/openssl/md5.h new file mode 100644 index 0000000..77a5773 --- /dev/null +++ b/OtherInc/openssl/include/openssl/md5.h @@ -0,0 +1,62 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_MD5_H +# define OPENSSL_MD5_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_MD5_H +# endif + +# include + +# ifndef OPENSSL_NO_MD5 +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define MD5_DIGEST_LENGTH 16 + +# if !defined(OPENSSL_NO_DEPRECATED_3_0) +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! MD5_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ +# define MD5_LONG unsigned int + +# define MD5_CBLOCK 64 +# define MD5_LBLOCK (MD5_CBLOCK/4) + +typedef struct MD5state_st { + MD5_LONG A, B, C, D; + MD5_LONG Nl, Nh; + MD5_LONG data[MD5_LBLOCK]; + unsigned int num; +} MD5_CTX; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int MD5_Init(MD5_CTX *c); +OSSL_DEPRECATEDIN_3_0 int MD5_Update(MD5_CTX *c, const void *data, size_t len); +OSSL_DEPRECATEDIN_3_0 int MD5_Final(unsigned char *md, MD5_CTX *c); +OSSL_DEPRECATEDIN_3_0 unsigned char *MD5(const unsigned char *d, size_t n, + unsigned char *md); +OSSL_DEPRECATEDIN_3_0 void MD5_Transform(MD5_CTX *c, const unsigned char *b); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/mdc2.h b/OtherInc/openssl/include/openssl/mdc2.h new file mode 100644 index 0000000..5a7ee28 --- /dev/null +++ b/OtherInc/openssl/include/openssl/mdc2.h @@ -0,0 +1,55 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_MDC2_H +# define OPENSSL_MDC2_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_MDC2_H +# endif + +# include + +# ifndef OPENSSL_NO_MDC2 +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define MDC2_DIGEST_LENGTH 16 + +# if !defined(OPENSSL_NO_DEPRECATED_3_0) + +# define MDC2_BLOCK 8 + +typedef struct mdc2_ctx_st { + unsigned int num; + unsigned char data[MDC2_BLOCK]; + DES_cblock h, hh; + unsigned int pad_type; /* either 1 or 2, default 1 */ +} MDC2_CTX; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int MDC2_Init(MDC2_CTX *c); +OSSL_DEPRECATEDIN_3_0 int MDC2_Update(MDC2_CTX *c, const unsigned char *data, + size_t len); +OSSL_DEPRECATEDIN_3_0 int MDC2_Final(unsigned char *md, MDC2_CTX *c); +OSSL_DEPRECATEDIN_3_0 unsigned char *MDC2(const unsigned char *d, size_t n, + unsigned char *md); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/modes.h b/OtherInc/openssl/include/openssl/modes.h new file mode 100644 index 0000000..e190799 --- /dev/null +++ b/OtherInc/openssl/include/openssl/modes.h @@ -0,0 +1,219 @@ +/* + * Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_MODES_H +# define OPENSSL_MODES_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_MODES_H +# endif + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif +typedef void (*block128_f) (const unsigned char in[16], + unsigned char out[16], const void *key); + +typedef void (*cbc128_f) (const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int enc); + +typedef void (*ecb128_f) (const unsigned char *in, unsigned char *out, + size_t len, const void *key, + int enc); + +typedef void (*ctr128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16]); + +typedef void (*ccm128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + const unsigned char ivec[16], + unsigned char cmac[16]); + +void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); +void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], block128_f block); + +void CRYPTO_ctr128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], unsigned int *num, + block128_f block); + +void CRYPTO_ctr128_encrypt_ctr32(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], + unsigned char ecount_buf[16], + unsigned int *num, ctr128_f ctr); + +void CRYPTO_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + block128_f block); + +void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, + size_t length, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); +void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out, + size_t bits, const void *key, + unsigned char ivec[16], int *num, + int enc, block128_f block); + +size_t CRYPTO_cts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_cts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, unsigned char ivec[16], + block128_f block); +size_t CRYPTO_cts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +size_t CRYPTO_nistcts128_encrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); +size_t CRYPTO_nistcts128_decrypt_block(const unsigned char *in, + unsigned char *out, size_t len, + const void *key, + unsigned char ivec[16], + block128_f block); +size_t CRYPTO_nistcts128_decrypt(const unsigned char *in, unsigned char *out, + size_t len, const void *key, + unsigned char ivec[16], cbc128_f cbc); + +typedef struct gcm128_context GCM128_CONTEXT; + +GCM128_CONTEXT *CRYPTO_gcm128_new(void *key, block128_f block); +void CRYPTO_gcm128_init(GCM128_CONTEXT *ctx, void *key, block128_f block); +void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const unsigned char *iv, + size_t len); +int CRYPTO_gcm128_aad(GCM128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_gcm128_encrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_decrypt(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len); +int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, + const unsigned char *in, unsigned char *out, + size_t len, ctr128_f stream); +int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx, const unsigned char *tag, + size_t len); +void CRYPTO_gcm128_tag(GCM128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_gcm128_release(GCM128_CONTEXT *ctx); + +typedef struct ccm128_context CCM128_CONTEXT; + +void CRYPTO_ccm128_init(CCM128_CONTEXT *ctx, + unsigned int M, unsigned int L, void *key, + block128_f block); +int CRYPTO_ccm128_setiv(CCM128_CONTEXT *ctx, const unsigned char *nonce, + size_t nlen, size_t mlen); +void CRYPTO_ccm128_aad(CCM128_CONTEXT *ctx, const unsigned char *aad, + size_t alen); +int CRYPTO_ccm128_encrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_decrypt(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len); +int CRYPTO_ccm128_encrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +int CRYPTO_ccm128_decrypt_ccm64(CCM128_CONTEXT *ctx, const unsigned char *inp, + unsigned char *out, size_t len, + ccm128_f stream); +size_t CRYPTO_ccm128_tag(CCM128_CONTEXT *ctx, unsigned char *tag, size_t len); + +typedef struct xts128_context XTS128_CONTEXT; + +int CRYPTO_xts128_encrypt(const XTS128_CONTEXT *ctx, + const unsigned char iv[16], + const unsigned char *inp, unsigned char *out, + size_t len, int enc); + +size_t CRYPTO_128_wrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); + +size_t CRYPTO_128_unwrap(void *key, const unsigned char *iv, + unsigned char *out, + const unsigned char *in, size_t inlen, + block128_f block); +size_t CRYPTO_128_wrap_pad(void *key, const unsigned char *icv, + unsigned char *out, const unsigned char *in, + size_t inlen, block128_f block); +size_t CRYPTO_128_unwrap_pad(void *key, const unsigned char *icv, + unsigned char *out, const unsigned char *in, + size_t inlen, block128_f block); + +# ifndef OPENSSL_NO_OCB +typedef struct ocb128_context OCB128_CONTEXT; + +typedef void (*ocb128_f) (const unsigned char *in, unsigned char *out, + size_t blocks, const void *key, + size_t start_block_num, + unsigned char offset_i[16], + const unsigned char L_[][16], + unsigned char checksum[16]); + +OCB128_CONTEXT *CRYPTO_ocb128_new(void *keyenc, void *keydec, + block128_f encrypt, block128_f decrypt, + ocb128_f stream); +int CRYPTO_ocb128_init(OCB128_CONTEXT *ctx, void *keyenc, void *keydec, + block128_f encrypt, block128_f decrypt, + ocb128_f stream); +int CRYPTO_ocb128_copy_ctx(OCB128_CONTEXT *dest, OCB128_CONTEXT *src, + void *keyenc, void *keydec); +int CRYPTO_ocb128_setiv(OCB128_CONTEXT *ctx, const unsigned char *iv, + size_t len, size_t taglen); +int CRYPTO_ocb128_aad(OCB128_CONTEXT *ctx, const unsigned char *aad, + size_t len); +int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx, const unsigned char *in, + unsigned char *out, size_t len); +int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx, const unsigned char *in, + unsigned char *out, size_t len); +int CRYPTO_ocb128_finish(OCB128_CONTEXT *ctx, const unsigned char *tag, + size_t len); +int CRYPTO_ocb128_tag(OCB128_CONTEXT *ctx, unsigned char *tag, size_t len); +void CRYPTO_ocb128_cleanup(OCB128_CONTEXT *ctx); +# endif /* OPENSSL_NO_OCB */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/obj_mac.h b/OtherInc/openssl/include/openssl/obj_mac.h new file mode 100644 index 0000000..0e86027 --- /dev/null +++ b/OtherInc/openssl/include/openssl/obj_mac.h @@ -0,0 +1,5481 @@ +/* + * WARNING: do not edit! + * Generated by crypto/objects/objects.pl + * + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_OBJ_MAC_H +# define OPENSSL_OBJ_MAC_H +# pragma once + +#define SN_undef "UNDEF" +#define LN_undef "undefined" +#define NID_undef 0 +#define OBJ_undef 0L + +#define SN_itu_t "ITU-T" +#define LN_itu_t "itu-t" +#define NID_itu_t 645 +#define OBJ_itu_t 0L + +#define NID_ccitt 404 +#define OBJ_ccitt OBJ_itu_t + +#define SN_iso "ISO" +#define LN_iso "iso" +#define NID_iso 181 +#define OBJ_iso 1L + +#define SN_joint_iso_itu_t "JOINT-ISO-ITU-T" +#define LN_joint_iso_itu_t "joint-iso-itu-t" +#define NID_joint_iso_itu_t 646 +#define OBJ_joint_iso_itu_t 2L + +#define NID_joint_iso_ccitt 393 +#define OBJ_joint_iso_ccitt OBJ_joint_iso_itu_t + +#define SN_member_body "member-body" +#define LN_member_body "ISO Member Body" +#define NID_member_body 182 +#define OBJ_member_body OBJ_iso,2L + +#define SN_identified_organization "identified-organization" +#define NID_identified_organization 676 +#define OBJ_identified_organization OBJ_iso,3L + +#define SN_gmac "GMAC" +#define LN_gmac "gmac" +#define NID_gmac 1195 +#define OBJ_gmac OBJ_iso,0L,9797L,3L,4L + +#define SN_hmac_md5 "HMAC-MD5" +#define LN_hmac_md5 "hmac-md5" +#define NID_hmac_md5 780 +#define OBJ_hmac_md5 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,1L + +#define SN_hmac_sha1 "HMAC-SHA1" +#define LN_hmac_sha1 "hmac-sha1" +#define NID_hmac_sha1 781 +#define OBJ_hmac_sha1 OBJ_identified_organization,6L,1L,5L,5L,8L,1L,2L + +#define SN_x509ExtAdmission "x509ExtAdmission" +#define LN_x509ExtAdmission "Professional Information or basis for Admission" +#define NID_x509ExtAdmission 1093 +#define OBJ_x509ExtAdmission OBJ_identified_organization,36L,8L,3L,3L + +#define SN_certicom_arc "certicom-arc" +#define NID_certicom_arc 677 +#define OBJ_certicom_arc OBJ_identified_organization,132L + +#define SN_ieee "ieee" +#define NID_ieee 1170 +#define OBJ_ieee OBJ_identified_organization,111L + +#define SN_ieee_siswg "ieee-siswg" +#define LN_ieee_siswg "IEEE Security in Storage Working Group" +#define NID_ieee_siswg 1171 +#define OBJ_ieee_siswg OBJ_ieee,2L,1619L + +#define SN_international_organizations "international-organizations" +#define LN_international_organizations "International Organizations" +#define NID_international_organizations 647 +#define OBJ_international_organizations OBJ_joint_iso_itu_t,23L + +#define SN_wap "wap" +#define NID_wap 678 +#define OBJ_wap OBJ_international_organizations,43L + +#define SN_wap_wsg "wap-wsg" +#define NID_wap_wsg 679 +#define OBJ_wap_wsg OBJ_wap,1L + +#define SN_selected_attribute_types "selected-attribute-types" +#define LN_selected_attribute_types "Selected Attribute Types" +#define NID_selected_attribute_types 394 +#define OBJ_selected_attribute_types OBJ_joint_iso_itu_t,5L,1L,5L + +#define SN_clearance "clearance" +#define NID_clearance 395 +#define OBJ_clearance OBJ_selected_attribute_types,55L + +#define SN_ISO_US "ISO-US" +#define LN_ISO_US "ISO US Member Body" +#define NID_ISO_US 183 +#define OBJ_ISO_US OBJ_member_body,840L + +#define SN_X9_57 "X9-57" +#define LN_X9_57 "X9.57" +#define NID_X9_57 184 +#define OBJ_X9_57 OBJ_ISO_US,10040L + +#define SN_X9cm "X9cm" +#define LN_X9cm "X9.57 CM ?" +#define NID_X9cm 185 +#define OBJ_X9cm OBJ_X9_57,4L + +#define SN_ISO_CN "ISO-CN" +#define LN_ISO_CN "ISO CN Member Body" +#define NID_ISO_CN 1140 +#define OBJ_ISO_CN OBJ_member_body,156L + +#define SN_oscca "oscca" +#define NID_oscca 1141 +#define OBJ_oscca OBJ_ISO_CN,10197L + +#define SN_sm_scheme "sm-scheme" +#define NID_sm_scheme 1142 +#define OBJ_sm_scheme OBJ_oscca,1L + +#define SN_dsa "DSA" +#define LN_dsa "dsaEncryption" +#define NID_dsa 116 +#define OBJ_dsa OBJ_X9cm,1L + +#define SN_dsaWithSHA1 "DSA-SHA1" +#define LN_dsaWithSHA1 "dsaWithSHA1" +#define NID_dsaWithSHA1 113 +#define OBJ_dsaWithSHA1 OBJ_X9cm,3L + +#define SN_ansi_X9_62 "ansi-X9-62" +#define LN_ansi_X9_62 "ANSI X9.62" +#define NID_ansi_X9_62 405 +#define OBJ_ansi_X9_62 OBJ_ISO_US,10045L + +#define OBJ_X9_62_id_fieldType OBJ_ansi_X9_62,1L + +#define SN_X9_62_prime_field "prime-field" +#define NID_X9_62_prime_field 406 +#define OBJ_X9_62_prime_field OBJ_X9_62_id_fieldType,1L + +#define SN_X9_62_characteristic_two_field "characteristic-two-field" +#define NID_X9_62_characteristic_two_field 407 +#define OBJ_X9_62_characteristic_two_field OBJ_X9_62_id_fieldType,2L + +#define SN_X9_62_id_characteristic_two_basis "id-characteristic-two-basis" +#define NID_X9_62_id_characteristic_two_basis 680 +#define OBJ_X9_62_id_characteristic_two_basis OBJ_X9_62_characteristic_two_field,3L + +#define SN_X9_62_onBasis "onBasis" +#define NID_X9_62_onBasis 681 +#define OBJ_X9_62_onBasis OBJ_X9_62_id_characteristic_two_basis,1L + +#define SN_X9_62_tpBasis "tpBasis" +#define NID_X9_62_tpBasis 682 +#define OBJ_X9_62_tpBasis OBJ_X9_62_id_characteristic_two_basis,2L + +#define SN_X9_62_ppBasis "ppBasis" +#define NID_X9_62_ppBasis 683 +#define OBJ_X9_62_ppBasis OBJ_X9_62_id_characteristic_two_basis,3L + +#define OBJ_X9_62_id_publicKeyType OBJ_ansi_X9_62,2L + +#define SN_X9_62_id_ecPublicKey "id-ecPublicKey" +#define NID_X9_62_id_ecPublicKey 408 +#define OBJ_X9_62_id_ecPublicKey OBJ_X9_62_id_publicKeyType,1L + +#define OBJ_X9_62_ellipticCurve OBJ_ansi_X9_62,3L + +#define OBJ_X9_62_c_TwoCurve OBJ_X9_62_ellipticCurve,0L + +#define SN_X9_62_c2pnb163v1 "c2pnb163v1" +#define NID_X9_62_c2pnb163v1 684 +#define OBJ_X9_62_c2pnb163v1 OBJ_X9_62_c_TwoCurve,1L + +#define SN_X9_62_c2pnb163v2 "c2pnb163v2" +#define NID_X9_62_c2pnb163v2 685 +#define OBJ_X9_62_c2pnb163v2 OBJ_X9_62_c_TwoCurve,2L + +#define SN_X9_62_c2pnb163v3 "c2pnb163v3" +#define NID_X9_62_c2pnb163v3 686 +#define OBJ_X9_62_c2pnb163v3 OBJ_X9_62_c_TwoCurve,3L + +#define SN_X9_62_c2pnb176v1 "c2pnb176v1" +#define NID_X9_62_c2pnb176v1 687 +#define OBJ_X9_62_c2pnb176v1 OBJ_X9_62_c_TwoCurve,4L + +#define SN_X9_62_c2tnb191v1 "c2tnb191v1" +#define NID_X9_62_c2tnb191v1 688 +#define OBJ_X9_62_c2tnb191v1 OBJ_X9_62_c_TwoCurve,5L + +#define SN_X9_62_c2tnb191v2 "c2tnb191v2" +#define NID_X9_62_c2tnb191v2 689 +#define OBJ_X9_62_c2tnb191v2 OBJ_X9_62_c_TwoCurve,6L + +#define SN_X9_62_c2tnb191v3 "c2tnb191v3" +#define NID_X9_62_c2tnb191v3 690 +#define OBJ_X9_62_c2tnb191v3 OBJ_X9_62_c_TwoCurve,7L + +#define SN_X9_62_c2onb191v4 "c2onb191v4" +#define NID_X9_62_c2onb191v4 691 +#define OBJ_X9_62_c2onb191v4 OBJ_X9_62_c_TwoCurve,8L + +#define SN_X9_62_c2onb191v5 "c2onb191v5" +#define NID_X9_62_c2onb191v5 692 +#define OBJ_X9_62_c2onb191v5 OBJ_X9_62_c_TwoCurve,9L + +#define SN_X9_62_c2pnb208w1 "c2pnb208w1" +#define NID_X9_62_c2pnb208w1 693 +#define OBJ_X9_62_c2pnb208w1 OBJ_X9_62_c_TwoCurve,10L + +#define SN_X9_62_c2tnb239v1 "c2tnb239v1" +#define NID_X9_62_c2tnb239v1 694 +#define OBJ_X9_62_c2tnb239v1 OBJ_X9_62_c_TwoCurve,11L + +#define SN_X9_62_c2tnb239v2 "c2tnb239v2" +#define NID_X9_62_c2tnb239v2 695 +#define OBJ_X9_62_c2tnb239v2 OBJ_X9_62_c_TwoCurve,12L + +#define SN_X9_62_c2tnb239v3 "c2tnb239v3" +#define NID_X9_62_c2tnb239v3 696 +#define OBJ_X9_62_c2tnb239v3 OBJ_X9_62_c_TwoCurve,13L + +#define SN_X9_62_c2onb239v4 "c2onb239v4" +#define NID_X9_62_c2onb239v4 697 +#define OBJ_X9_62_c2onb239v4 OBJ_X9_62_c_TwoCurve,14L + +#define SN_X9_62_c2onb239v5 "c2onb239v5" +#define NID_X9_62_c2onb239v5 698 +#define OBJ_X9_62_c2onb239v5 OBJ_X9_62_c_TwoCurve,15L + +#define SN_X9_62_c2pnb272w1 "c2pnb272w1" +#define NID_X9_62_c2pnb272w1 699 +#define OBJ_X9_62_c2pnb272w1 OBJ_X9_62_c_TwoCurve,16L + +#define SN_X9_62_c2pnb304w1 "c2pnb304w1" +#define NID_X9_62_c2pnb304w1 700 +#define OBJ_X9_62_c2pnb304w1 OBJ_X9_62_c_TwoCurve,17L + +#define SN_X9_62_c2tnb359v1 "c2tnb359v1" +#define NID_X9_62_c2tnb359v1 701 +#define OBJ_X9_62_c2tnb359v1 OBJ_X9_62_c_TwoCurve,18L + +#define SN_X9_62_c2pnb368w1 "c2pnb368w1" +#define NID_X9_62_c2pnb368w1 702 +#define OBJ_X9_62_c2pnb368w1 OBJ_X9_62_c_TwoCurve,19L + +#define SN_X9_62_c2tnb431r1 "c2tnb431r1" +#define NID_X9_62_c2tnb431r1 703 +#define OBJ_X9_62_c2tnb431r1 OBJ_X9_62_c_TwoCurve,20L + +#define OBJ_X9_62_primeCurve OBJ_X9_62_ellipticCurve,1L + +#define SN_X9_62_prime192v1 "prime192v1" +#define NID_X9_62_prime192v1 409 +#define OBJ_X9_62_prime192v1 OBJ_X9_62_primeCurve,1L + +#define SN_X9_62_prime192v2 "prime192v2" +#define NID_X9_62_prime192v2 410 +#define OBJ_X9_62_prime192v2 OBJ_X9_62_primeCurve,2L + +#define SN_X9_62_prime192v3 "prime192v3" +#define NID_X9_62_prime192v3 411 +#define OBJ_X9_62_prime192v3 OBJ_X9_62_primeCurve,3L + +#define SN_X9_62_prime239v1 "prime239v1" +#define NID_X9_62_prime239v1 412 +#define OBJ_X9_62_prime239v1 OBJ_X9_62_primeCurve,4L + +#define SN_X9_62_prime239v2 "prime239v2" +#define NID_X9_62_prime239v2 413 +#define OBJ_X9_62_prime239v2 OBJ_X9_62_primeCurve,5L + +#define SN_X9_62_prime239v3 "prime239v3" +#define NID_X9_62_prime239v3 414 +#define OBJ_X9_62_prime239v3 OBJ_X9_62_primeCurve,6L + +#define SN_X9_62_prime256v1 "prime256v1" +#define NID_X9_62_prime256v1 415 +#define OBJ_X9_62_prime256v1 OBJ_X9_62_primeCurve,7L + +#define OBJ_X9_62_id_ecSigType OBJ_ansi_X9_62,4L + +#define SN_ecdsa_with_SHA1 "ecdsa-with-SHA1" +#define NID_ecdsa_with_SHA1 416 +#define OBJ_ecdsa_with_SHA1 OBJ_X9_62_id_ecSigType,1L + +#define SN_ecdsa_with_Recommended "ecdsa-with-Recommended" +#define NID_ecdsa_with_Recommended 791 +#define OBJ_ecdsa_with_Recommended OBJ_X9_62_id_ecSigType,2L + +#define SN_ecdsa_with_Specified "ecdsa-with-Specified" +#define NID_ecdsa_with_Specified 792 +#define OBJ_ecdsa_with_Specified OBJ_X9_62_id_ecSigType,3L + +#define SN_ecdsa_with_SHA224 "ecdsa-with-SHA224" +#define NID_ecdsa_with_SHA224 793 +#define OBJ_ecdsa_with_SHA224 OBJ_ecdsa_with_Specified,1L + +#define SN_ecdsa_with_SHA256 "ecdsa-with-SHA256" +#define NID_ecdsa_with_SHA256 794 +#define OBJ_ecdsa_with_SHA256 OBJ_ecdsa_with_Specified,2L + +#define SN_ecdsa_with_SHA384 "ecdsa-with-SHA384" +#define NID_ecdsa_with_SHA384 795 +#define OBJ_ecdsa_with_SHA384 OBJ_ecdsa_with_Specified,3L + +#define SN_ecdsa_with_SHA512 "ecdsa-with-SHA512" +#define NID_ecdsa_with_SHA512 796 +#define OBJ_ecdsa_with_SHA512 OBJ_ecdsa_with_Specified,4L + +#define OBJ_secg_ellipticCurve OBJ_certicom_arc,0L + +#define SN_secp112r1 "secp112r1" +#define NID_secp112r1 704 +#define OBJ_secp112r1 OBJ_secg_ellipticCurve,6L + +#define SN_secp112r2 "secp112r2" +#define NID_secp112r2 705 +#define OBJ_secp112r2 OBJ_secg_ellipticCurve,7L + +#define SN_secp128r1 "secp128r1" +#define NID_secp128r1 706 +#define OBJ_secp128r1 OBJ_secg_ellipticCurve,28L + +#define SN_secp128r2 "secp128r2" +#define NID_secp128r2 707 +#define OBJ_secp128r2 OBJ_secg_ellipticCurve,29L + +#define SN_secp160k1 "secp160k1" +#define NID_secp160k1 708 +#define OBJ_secp160k1 OBJ_secg_ellipticCurve,9L + +#define SN_secp160r1 "secp160r1" +#define NID_secp160r1 709 +#define OBJ_secp160r1 OBJ_secg_ellipticCurve,8L + +#define SN_secp160r2 "secp160r2" +#define NID_secp160r2 710 +#define OBJ_secp160r2 OBJ_secg_ellipticCurve,30L + +#define SN_secp192k1 "secp192k1" +#define NID_secp192k1 711 +#define OBJ_secp192k1 OBJ_secg_ellipticCurve,31L + +#define SN_secp224k1 "secp224k1" +#define NID_secp224k1 712 +#define OBJ_secp224k1 OBJ_secg_ellipticCurve,32L + +#define SN_secp224r1 "secp224r1" +#define NID_secp224r1 713 +#define OBJ_secp224r1 OBJ_secg_ellipticCurve,33L + +#define SN_secp256k1 "secp256k1" +#define NID_secp256k1 714 +#define OBJ_secp256k1 OBJ_secg_ellipticCurve,10L + +#define SN_secp384r1 "secp384r1" +#define NID_secp384r1 715 +#define OBJ_secp384r1 OBJ_secg_ellipticCurve,34L + +#define SN_secp521r1 "secp521r1" +#define NID_secp521r1 716 +#define OBJ_secp521r1 OBJ_secg_ellipticCurve,35L + +#define SN_sect113r1 "sect113r1" +#define NID_sect113r1 717 +#define OBJ_sect113r1 OBJ_secg_ellipticCurve,4L + +#define SN_sect113r2 "sect113r2" +#define NID_sect113r2 718 +#define OBJ_sect113r2 OBJ_secg_ellipticCurve,5L + +#define SN_sect131r1 "sect131r1" +#define NID_sect131r1 719 +#define OBJ_sect131r1 OBJ_secg_ellipticCurve,22L + +#define SN_sect131r2 "sect131r2" +#define NID_sect131r2 720 +#define OBJ_sect131r2 OBJ_secg_ellipticCurve,23L + +#define SN_sect163k1 "sect163k1" +#define NID_sect163k1 721 +#define OBJ_sect163k1 OBJ_secg_ellipticCurve,1L + +#define SN_sect163r1 "sect163r1" +#define NID_sect163r1 722 +#define OBJ_sect163r1 OBJ_secg_ellipticCurve,2L + +#define SN_sect163r2 "sect163r2" +#define NID_sect163r2 723 +#define OBJ_sect163r2 OBJ_secg_ellipticCurve,15L + +#define SN_sect193r1 "sect193r1" +#define NID_sect193r1 724 +#define OBJ_sect193r1 OBJ_secg_ellipticCurve,24L + +#define SN_sect193r2 "sect193r2" +#define NID_sect193r2 725 +#define OBJ_sect193r2 OBJ_secg_ellipticCurve,25L + +#define SN_sect233k1 "sect233k1" +#define NID_sect233k1 726 +#define OBJ_sect233k1 OBJ_secg_ellipticCurve,26L + +#define SN_sect233r1 "sect233r1" +#define NID_sect233r1 727 +#define OBJ_sect233r1 OBJ_secg_ellipticCurve,27L + +#define SN_sect239k1 "sect239k1" +#define NID_sect239k1 728 +#define OBJ_sect239k1 OBJ_secg_ellipticCurve,3L + +#define SN_sect283k1 "sect283k1" +#define NID_sect283k1 729 +#define OBJ_sect283k1 OBJ_secg_ellipticCurve,16L + +#define SN_sect283r1 "sect283r1" +#define NID_sect283r1 730 +#define OBJ_sect283r1 OBJ_secg_ellipticCurve,17L + +#define SN_sect409k1 "sect409k1" +#define NID_sect409k1 731 +#define OBJ_sect409k1 OBJ_secg_ellipticCurve,36L + +#define SN_sect409r1 "sect409r1" +#define NID_sect409r1 732 +#define OBJ_sect409r1 OBJ_secg_ellipticCurve,37L + +#define SN_sect571k1 "sect571k1" +#define NID_sect571k1 733 +#define OBJ_sect571k1 OBJ_secg_ellipticCurve,38L + +#define SN_sect571r1 "sect571r1" +#define NID_sect571r1 734 +#define OBJ_sect571r1 OBJ_secg_ellipticCurve,39L + +#define OBJ_wap_wsg_idm_ecid OBJ_wap_wsg,4L + +#define SN_wap_wsg_idm_ecid_wtls1 "wap-wsg-idm-ecid-wtls1" +#define NID_wap_wsg_idm_ecid_wtls1 735 +#define OBJ_wap_wsg_idm_ecid_wtls1 OBJ_wap_wsg_idm_ecid,1L + +#define SN_wap_wsg_idm_ecid_wtls3 "wap-wsg-idm-ecid-wtls3" +#define NID_wap_wsg_idm_ecid_wtls3 736 +#define OBJ_wap_wsg_idm_ecid_wtls3 OBJ_wap_wsg_idm_ecid,3L + +#define SN_wap_wsg_idm_ecid_wtls4 "wap-wsg-idm-ecid-wtls4" +#define NID_wap_wsg_idm_ecid_wtls4 737 +#define OBJ_wap_wsg_idm_ecid_wtls4 OBJ_wap_wsg_idm_ecid,4L + +#define SN_wap_wsg_idm_ecid_wtls5 "wap-wsg-idm-ecid-wtls5" +#define NID_wap_wsg_idm_ecid_wtls5 738 +#define OBJ_wap_wsg_idm_ecid_wtls5 OBJ_wap_wsg_idm_ecid,5L + +#define SN_wap_wsg_idm_ecid_wtls6 "wap-wsg-idm-ecid-wtls6" +#define NID_wap_wsg_idm_ecid_wtls6 739 +#define OBJ_wap_wsg_idm_ecid_wtls6 OBJ_wap_wsg_idm_ecid,6L + +#define SN_wap_wsg_idm_ecid_wtls7 "wap-wsg-idm-ecid-wtls7" +#define NID_wap_wsg_idm_ecid_wtls7 740 +#define OBJ_wap_wsg_idm_ecid_wtls7 OBJ_wap_wsg_idm_ecid,7L + +#define SN_wap_wsg_idm_ecid_wtls8 "wap-wsg-idm-ecid-wtls8" +#define NID_wap_wsg_idm_ecid_wtls8 741 +#define OBJ_wap_wsg_idm_ecid_wtls8 OBJ_wap_wsg_idm_ecid,8L + +#define SN_wap_wsg_idm_ecid_wtls9 "wap-wsg-idm-ecid-wtls9" +#define NID_wap_wsg_idm_ecid_wtls9 742 +#define OBJ_wap_wsg_idm_ecid_wtls9 OBJ_wap_wsg_idm_ecid,9L + +#define SN_wap_wsg_idm_ecid_wtls10 "wap-wsg-idm-ecid-wtls10" +#define NID_wap_wsg_idm_ecid_wtls10 743 +#define OBJ_wap_wsg_idm_ecid_wtls10 OBJ_wap_wsg_idm_ecid,10L + +#define SN_wap_wsg_idm_ecid_wtls11 "wap-wsg-idm-ecid-wtls11" +#define NID_wap_wsg_idm_ecid_wtls11 744 +#define OBJ_wap_wsg_idm_ecid_wtls11 OBJ_wap_wsg_idm_ecid,11L + +#define SN_wap_wsg_idm_ecid_wtls12 "wap-wsg-idm-ecid-wtls12" +#define NID_wap_wsg_idm_ecid_wtls12 745 +#define OBJ_wap_wsg_idm_ecid_wtls12 OBJ_wap_wsg_idm_ecid,12L + +#define SN_cast5_cbc "CAST5-CBC" +#define LN_cast5_cbc "cast5-cbc" +#define NID_cast5_cbc 108 +#define OBJ_cast5_cbc OBJ_ISO_US,113533L,7L,66L,10L + +#define SN_cast5_ecb "CAST5-ECB" +#define LN_cast5_ecb "cast5-ecb" +#define NID_cast5_ecb 109 + +#define SN_cast5_cfb64 "CAST5-CFB" +#define LN_cast5_cfb64 "cast5-cfb" +#define NID_cast5_cfb64 110 + +#define SN_cast5_ofb64 "CAST5-OFB" +#define LN_cast5_ofb64 "cast5-ofb" +#define NID_cast5_ofb64 111 + +#define LN_pbeWithMD5AndCast5_CBC "pbeWithMD5AndCast5CBC" +#define NID_pbeWithMD5AndCast5_CBC 112 +#define OBJ_pbeWithMD5AndCast5_CBC OBJ_ISO_US,113533L,7L,66L,12L + +#define SN_id_PasswordBasedMAC "id-PasswordBasedMAC" +#define LN_id_PasswordBasedMAC "password based MAC" +#define NID_id_PasswordBasedMAC 782 +#define OBJ_id_PasswordBasedMAC OBJ_ISO_US,113533L,7L,66L,13L + +#define SN_id_DHBasedMac "id-DHBasedMac" +#define LN_id_DHBasedMac "Diffie-Hellman based MAC" +#define NID_id_DHBasedMac 783 +#define OBJ_id_DHBasedMac OBJ_ISO_US,113533L,7L,66L,30L + +#define SN_rsadsi "rsadsi" +#define LN_rsadsi "RSA Data Security, Inc." +#define NID_rsadsi 1 +#define OBJ_rsadsi OBJ_ISO_US,113549L + +#define SN_pkcs "pkcs" +#define LN_pkcs "RSA Data Security, Inc. PKCS" +#define NID_pkcs 2 +#define OBJ_pkcs OBJ_rsadsi,1L + +#define SN_pkcs1 "pkcs1" +#define NID_pkcs1 186 +#define OBJ_pkcs1 OBJ_pkcs,1L + +#define LN_rsaEncryption "rsaEncryption" +#define NID_rsaEncryption 6 +#define OBJ_rsaEncryption OBJ_pkcs1,1L + +#define SN_md2WithRSAEncryption "RSA-MD2" +#define LN_md2WithRSAEncryption "md2WithRSAEncryption" +#define NID_md2WithRSAEncryption 7 +#define OBJ_md2WithRSAEncryption OBJ_pkcs1,2L + +#define SN_md4WithRSAEncryption "RSA-MD4" +#define LN_md4WithRSAEncryption "md4WithRSAEncryption" +#define NID_md4WithRSAEncryption 396 +#define OBJ_md4WithRSAEncryption OBJ_pkcs1,3L + +#define SN_md5WithRSAEncryption "RSA-MD5" +#define LN_md5WithRSAEncryption "md5WithRSAEncryption" +#define NID_md5WithRSAEncryption 8 +#define OBJ_md5WithRSAEncryption OBJ_pkcs1,4L + +#define SN_sha1WithRSAEncryption "RSA-SHA1" +#define LN_sha1WithRSAEncryption "sha1WithRSAEncryption" +#define NID_sha1WithRSAEncryption 65 +#define OBJ_sha1WithRSAEncryption OBJ_pkcs1,5L + +#define SN_rsaesOaep "RSAES-OAEP" +#define LN_rsaesOaep "rsaesOaep" +#define NID_rsaesOaep 919 +#define OBJ_rsaesOaep OBJ_pkcs1,7L + +#define SN_mgf1 "MGF1" +#define LN_mgf1 "mgf1" +#define NID_mgf1 911 +#define OBJ_mgf1 OBJ_pkcs1,8L + +#define SN_pSpecified "PSPECIFIED" +#define LN_pSpecified "pSpecified" +#define NID_pSpecified 935 +#define OBJ_pSpecified OBJ_pkcs1,9L + +#define SN_rsassaPss "RSASSA-PSS" +#define LN_rsassaPss "rsassaPss" +#define NID_rsassaPss 912 +#define OBJ_rsassaPss OBJ_pkcs1,10L + +#define SN_sha256WithRSAEncryption "RSA-SHA256" +#define LN_sha256WithRSAEncryption "sha256WithRSAEncryption" +#define NID_sha256WithRSAEncryption 668 +#define OBJ_sha256WithRSAEncryption OBJ_pkcs1,11L + +#define SN_sha384WithRSAEncryption "RSA-SHA384" +#define LN_sha384WithRSAEncryption "sha384WithRSAEncryption" +#define NID_sha384WithRSAEncryption 669 +#define OBJ_sha384WithRSAEncryption OBJ_pkcs1,12L + +#define SN_sha512WithRSAEncryption "RSA-SHA512" +#define LN_sha512WithRSAEncryption "sha512WithRSAEncryption" +#define NID_sha512WithRSAEncryption 670 +#define OBJ_sha512WithRSAEncryption OBJ_pkcs1,13L + +#define SN_sha224WithRSAEncryption "RSA-SHA224" +#define LN_sha224WithRSAEncryption "sha224WithRSAEncryption" +#define NID_sha224WithRSAEncryption 671 +#define OBJ_sha224WithRSAEncryption OBJ_pkcs1,14L + +#define SN_sha512_224WithRSAEncryption "RSA-SHA512/224" +#define LN_sha512_224WithRSAEncryption "sha512-224WithRSAEncryption" +#define NID_sha512_224WithRSAEncryption 1145 +#define OBJ_sha512_224WithRSAEncryption OBJ_pkcs1,15L + +#define SN_sha512_256WithRSAEncryption "RSA-SHA512/256" +#define LN_sha512_256WithRSAEncryption "sha512-256WithRSAEncryption" +#define NID_sha512_256WithRSAEncryption 1146 +#define OBJ_sha512_256WithRSAEncryption OBJ_pkcs1,16L + +#define SN_pkcs3 "pkcs3" +#define NID_pkcs3 27 +#define OBJ_pkcs3 OBJ_pkcs,3L + +#define LN_dhKeyAgreement "dhKeyAgreement" +#define NID_dhKeyAgreement 28 +#define OBJ_dhKeyAgreement OBJ_pkcs3,1L + +#define SN_pkcs5 "pkcs5" +#define NID_pkcs5 187 +#define OBJ_pkcs5 OBJ_pkcs,5L + +#define SN_pbeWithMD2AndDES_CBC "PBE-MD2-DES" +#define LN_pbeWithMD2AndDES_CBC "pbeWithMD2AndDES-CBC" +#define NID_pbeWithMD2AndDES_CBC 9 +#define OBJ_pbeWithMD2AndDES_CBC OBJ_pkcs5,1L + +#define SN_pbeWithMD5AndDES_CBC "PBE-MD5-DES" +#define LN_pbeWithMD5AndDES_CBC "pbeWithMD5AndDES-CBC" +#define NID_pbeWithMD5AndDES_CBC 10 +#define OBJ_pbeWithMD5AndDES_CBC OBJ_pkcs5,3L + +#define SN_pbeWithMD2AndRC2_CBC "PBE-MD2-RC2-64" +#define LN_pbeWithMD2AndRC2_CBC "pbeWithMD2AndRC2-CBC" +#define NID_pbeWithMD2AndRC2_CBC 168 +#define OBJ_pbeWithMD2AndRC2_CBC OBJ_pkcs5,4L + +#define SN_pbeWithMD5AndRC2_CBC "PBE-MD5-RC2-64" +#define LN_pbeWithMD5AndRC2_CBC "pbeWithMD5AndRC2-CBC" +#define NID_pbeWithMD5AndRC2_CBC 169 +#define OBJ_pbeWithMD5AndRC2_CBC OBJ_pkcs5,6L + +#define SN_pbeWithSHA1AndDES_CBC "PBE-SHA1-DES" +#define LN_pbeWithSHA1AndDES_CBC "pbeWithSHA1AndDES-CBC" +#define NID_pbeWithSHA1AndDES_CBC 170 +#define OBJ_pbeWithSHA1AndDES_CBC OBJ_pkcs5,10L + +#define SN_pbeWithSHA1AndRC2_CBC "PBE-SHA1-RC2-64" +#define LN_pbeWithSHA1AndRC2_CBC "pbeWithSHA1AndRC2-CBC" +#define NID_pbeWithSHA1AndRC2_CBC 68 +#define OBJ_pbeWithSHA1AndRC2_CBC OBJ_pkcs5,11L + +#define LN_id_pbkdf2 "PBKDF2" +#define NID_id_pbkdf2 69 +#define OBJ_id_pbkdf2 OBJ_pkcs5,12L + +#define LN_pbes2 "PBES2" +#define NID_pbes2 161 +#define OBJ_pbes2 OBJ_pkcs5,13L + +#define LN_pbmac1 "PBMAC1" +#define NID_pbmac1 162 +#define OBJ_pbmac1 OBJ_pkcs5,14L + +#define SN_pkcs7 "pkcs7" +#define NID_pkcs7 20 +#define OBJ_pkcs7 OBJ_pkcs,7L + +#define LN_pkcs7_data "pkcs7-data" +#define NID_pkcs7_data 21 +#define OBJ_pkcs7_data OBJ_pkcs7,1L + +#define LN_pkcs7_signed "pkcs7-signedData" +#define NID_pkcs7_signed 22 +#define OBJ_pkcs7_signed OBJ_pkcs7,2L + +#define LN_pkcs7_enveloped "pkcs7-envelopedData" +#define NID_pkcs7_enveloped 23 +#define OBJ_pkcs7_enveloped OBJ_pkcs7,3L + +#define LN_pkcs7_signedAndEnveloped "pkcs7-signedAndEnvelopedData" +#define NID_pkcs7_signedAndEnveloped 24 +#define OBJ_pkcs7_signedAndEnveloped OBJ_pkcs7,4L + +#define LN_pkcs7_digest "pkcs7-digestData" +#define NID_pkcs7_digest 25 +#define OBJ_pkcs7_digest OBJ_pkcs7,5L + +#define LN_pkcs7_encrypted "pkcs7-encryptedData" +#define NID_pkcs7_encrypted 26 +#define OBJ_pkcs7_encrypted OBJ_pkcs7,6L + +#define SN_pkcs9 "pkcs9" +#define NID_pkcs9 47 +#define OBJ_pkcs9 OBJ_pkcs,9L + +#define LN_pkcs9_emailAddress "emailAddress" +#define NID_pkcs9_emailAddress 48 +#define OBJ_pkcs9_emailAddress OBJ_pkcs9,1L + +#define LN_pkcs9_unstructuredName "unstructuredName" +#define NID_pkcs9_unstructuredName 49 +#define OBJ_pkcs9_unstructuredName OBJ_pkcs9,2L + +#define LN_pkcs9_contentType "contentType" +#define NID_pkcs9_contentType 50 +#define OBJ_pkcs9_contentType OBJ_pkcs9,3L + +#define LN_pkcs9_messageDigest "messageDigest" +#define NID_pkcs9_messageDigest 51 +#define OBJ_pkcs9_messageDigest OBJ_pkcs9,4L + +#define LN_pkcs9_signingTime "signingTime" +#define NID_pkcs9_signingTime 52 +#define OBJ_pkcs9_signingTime OBJ_pkcs9,5L + +#define LN_pkcs9_countersignature "countersignature" +#define NID_pkcs9_countersignature 53 +#define OBJ_pkcs9_countersignature OBJ_pkcs9,6L + +#define LN_pkcs9_challengePassword "challengePassword" +#define NID_pkcs9_challengePassword 54 +#define OBJ_pkcs9_challengePassword OBJ_pkcs9,7L + +#define LN_pkcs9_unstructuredAddress "unstructuredAddress" +#define NID_pkcs9_unstructuredAddress 55 +#define OBJ_pkcs9_unstructuredAddress OBJ_pkcs9,8L + +#define LN_pkcs9_extCertAttributes "extendedCertificateAttributes" +#define NID_pkcs9_extCertAttributes 56 +#define OBJ_pkcs9_extCertAttributes OBJ_pkcs9,9L + +#define SN_ext_req "extReq" +#define LN_ext_req "Extension Request" +#define NID_ext_req 172 +#define OBJ_ext_req OBJ_pkcs9,14L + +#define SN_SMIMECapabilities "SMIME-CAPS" +#define LN_SMIMECapabilities "S/MIME Capabilities" +#define NID_SMIMECapabilities 167 +#define OBJ_SMIMECapabilities OBJ_pkcs9,15L + +#define SN_SMIME "SMIME" +#define LN_SMIME "S/MIME" +#define NID_SMIME 188 +#define OBJ_SMIME OBJ_pkcs9,16L + +#define SN_id_smime_mod "id-smime-mod" +#define NID_id_smime_mod 189 +#define OBJ_id_smime_mod OBJ_SMIME,0L + +#define SN_id_smime_ct "id-smime-ct" +#define NID_id_smime_ct 190 +#define OBJ_id_smime_ct OBJ_SMIME,1L + +#define SN_id_smime_aa "id-smime-aa" +#define NID_id_smime_aa 191 +#define OBJ_id_smime_aa OBJ_SMIME,2L + +#define SN_id_smime_alg "id-smime-alg" +#define NID_id_smime_alg 192 +#define OBJ_id_smime_alg OBJ_SMIME,3L + +#define SN_id_smime_cd "id-smime-cd" +#define NID_id_smime_cd 193 +#define OBJ_id_smime_cd OBJ_SMIME,4L + +#define SN_id_smime_spq "id-smime-spq" +#define NID_id_smime_spq 194 +#define OBJ_id_smime_spq OBJ_SMIME,5L + +#define SN_id_smime_cti "id-smime-cti" +#define NID_id_smime_cti 195 +#define OBJ_id_smime_cti OBJ_SMIME,6L + +#define SN_id_smime_mod_cms "id-smime-mod-cms" +#define NID_id_smime_mod_cms 196 +#define OBJ_id_smime_mod_cms OBJ_id_smime_mod,1L + +#define SN_id_smime_mod_ess "id-smime-mod-ess" +#define NID_id_smime_mod_ess 197 +#define OBJ_id_smime_mod_ess OBJ_id_smime_mod,2L + +#define SN_id_smime_mod_oid "id-smime-mod-oid" +#define NID_id_smime_mod_oid 198 +#define OBJ_id_smime_mod_oid OBJ_id_smime_mod,3L + +#define SN_id_smime_mod_msg_v3 "id-smime-mod-msg-v3" +#define NID_id_smime_mod_msg_v3 199 +#define OBJ_id_smime_mod_msg_v3 OBJ_id_smime_mod,4L + +#define SN_id_smime_mod_ets_eSignature_88 "id-smime-mod-ets-eSignature-88" +#define NID_id_smime_mod_ets_eSignature_88 200 +#define OBJ_id_smime_mod_ets_eSignature_88 OBJ_id_smime_mod,5L + +#define SN_id_smime_mod_ets_eSignature_97 "id-smime-mod-ets-eSignature-97" +#define NID_id_smime_mod_ets_eSignature_97 201 +#define OBJ_id_smime_mod_ets_eSignature_97 OBJ_id_smime_mod,6L + +#define SN_id_smime_mod_ets_eSigPolicy_88 "id-smime-mod-ets-eSigPolicy-88" +#define NID_id_smime_mod_ets_eSigPolicy_88 202 +#define OBJ_id_smime_mod_ets_eSigPolicy_88 OBJ_id_smime_mod,7L + +#define SN_id_smime_mod_ets_eSigPolicy_97 "id-smime-mod-ets-eSigPolicy-97" +#define NID_id_smime_mod_ets_eSigPolicy_97 203 +#define OBJ_id_smime_mod_ets_eSigPolicy_97 OBJ_id_smime_mod,8L + +#define SN_id_smime_ct_receipt "id-smime-ct-receipt" +#define NID_id_smime_ct_receipt 204 +#define OBJ_id_smime_ct_receipt OBJ_id_smime_ct,1L + +#define SN_id_smime_ct_authData "id-smime-ct-authData" +#define NID_id_smime_ct_authData 205 +#define OBJ_id_smime_ct_authData OBJ_id_smime_ct,2L + +#define SN_id_smime_ct_publishCert "id-smime-ct-publishCert" +#define NID_id_smime_ct_publishCert 206 +#define OBJ_id_smime_ct_publishCert OBJ_id_smime_ct,3L + +#define SN_id_smime_ct_TSTInfo "id-smime-ct-TSTInfo" +#define NID_id_smime_ct_TSTInfo 207 +#define OBJ_id_smime_ct_TSTInfo OBJ_id_smime_ct,4L + +#define SN_id_smime_ct_TDTInfo "id-smime-ct-TDTInfo" +#define NID_id_smime_ct_TDTInfo 208 +#define OBJ_id_smime_ct_TDTInfo OBJ_id_smime_ct,5L + +#define SN_id_smime_ct_contentInfo "id-smime-ct-contentInfo" +#define NID_id_smime_ct_contentInfo 209 +#define OBJ_id_smime_ct_contentInfo OBJ_id_smime_ct,6L + +#define SN_id_smime_ct_DVCSRequestData "id-smime-ct-DVCSRequestData" +#define NID_id_smime_ct_DVCSRequestData 210 +#define OBJ_id_smime_ct_DVCSRequestData OBJ_id_smime_ct,7L + +#define SN_id_smime_ct_DVCSResponseData "id-smime-ct-DVCSResponseData" +#define NID_id_smime_ct_DVCSResponseData 211 +#define OBJ_id_smime_ct_DVCSResponseData OBJ_id_smime_ct,8L + +#define SN_id_smime_ct_compressedData "id-smime-ct-compressedData" +#define NID_id_smime_ct_compressedData 786 +#define OBJ_id_smime_ct_compressedData OBJ_id_smime_ct,9L + +#define SN_id_smime_ct_contentCollection "id-smime-ct-contentCollection" +#define NID_id_smime_ct_contentCollection 1058 +#define OBJ_id_smime_ct_contentCollection OBJ_id_smime_ct,19L + +#define SN_id_smime_ct_authEnvelopedData "id-smime-ct-authEnvelopedData" +#define NID_id_smime_ct_authEnvelopedData 1059 +#define OBJ_id_smime_ct_authEnvelopedData OBJ_id_smime_ct,23L + +#define SN_id_ct_routeOriginAuthz "id-ct-routeOriginAuthz" +#define NID_id_ct_routeOriginAuthz 1234 +#define OBJ_id_ct_routeOriginAuthz OBJ_id_smime_ct,24L + +#define SN_id_ct_rpkiManifest "id-ct-rpkiManifest" +#define NID_id_ct_rpkiManifest 1235 +#define OBJ_id_ct_rpkiManifest OBJ_id_smime_ct,26L + +#define SN_id_ct_asciiTextWithCRLF "id-ct-asciiTextWithCRLF" +#define NID_id_ct_asciiTextWithCRLF 787 +#define OBJ_id_ct_asciiTextWithCRLF OBJ_id_smime_ct,27L + +#define SN_id_ct_xml "id-ct-xml" +#define NID_id_ct_xml 1060 +#define OBJ_id_ct_xml OBJ_id_smime_ct,28L + +#define SN_id_ct_rpkiGhostbusters "id-ct-rpkiGhostbusters" +#define NID_id_ct_rpkiGhostbusters 1236 +#define OBJ_id_ct_rpkiGhostbusters OBJ_id_smime_ct,35L + +#define SN_id_ct_resourceTaggedAttest "id-ct-resourceTaggedAttest" +#define NID_id_ct_resourceTaggedAttest 1237 +#define OBJ_id_ct_resourceTaggedAttest OBJ_id_smime_ct,36L + +#define SN_id_ct_geofeedCSVwithCRLF "id-ct-geofeedCSVwithCRLF" +#define NID_id_ct_geofeedCSVwithCRLF 1246 +#define OBJ_id_ct_geofeedCSVwithCRLF OBJ_id_smime_ct,47L + +#define SN_id_ct_signedChecklist "id-ct-signedChecklist" +#define NID_id_ct_signedChecklist 1247 +#define OBJ_id_ct_signedChecklist OBJ_id_smime_ct,48L + +#define SN_id_smime_aa_receiptRequest "id-smime-aa-receiptRequest" +#define NID_id_smime_aa_receiptRequest 212 +#define OBJ_id_smime_aa_receiptRequest OBJ_id_smime_aa,1L + +#define SN_id_smime_aa_securityLabel "id-smime-aa-securityLabel" +#define NID_id_smime_aa_securityLabel 213 +#define OBJ_id_smime_aa_securityLabel OBJ_id_smime_aa,2L + +#define SN_id_smime_aa_mlExpandHistory "id-smime-aa-mlExpandHistory" +#define NID_id_smime_aa_mlExpandHistory 214 +#define OBJ_id_smime_aa_mlExpandHistory OBJ_id_smime_aa,3L + +#define SN_id_smime_aa_contentHint "id-smime-aa-contentHint" +#define NID_id_smime_aa_contentHint 215 +#define OBJ_id_smime_aa_contentHint OBJ_id_smime_aa,4L + +#define SN_id_smime_aa_msgSigDigest "id-smime-aa-msgSigDigest" +#define NID_id_smime_aa_msgSigDigest 216 +#define OBJ_id_smime_aa_msgSigDigest OBJ_id_smime_aa,5L + +#define SN_id_smime_aa_encapContentType "id-smime-aa-encapContentType" +#define NID_id_smime_aa_encapContentType 217 +#define OBJ_id_smime_aa_encapContentType OBJ_id_smime_aa,6L + +#define SN_id_smime_aa_contentIdentifier "id-smime-aa-contentIdentifier" +#define NID_id_smime_aa_contentIdentifier 218 +#define OBJ_id_smime_aa_contentIdentifier OBJ_id_smime_aa,7L + +#define SN_id_smime_aa_macValue "id-smime-aa-macValue" +#define NID_id_smime_aa_macValue 219 +#define OBJ_id_smime_aa_macValue OBJ_id_smime_aa,8L + +#define SN_id_smime_aa_equivalentLabels "id-smime-aa-equivalentLabels" +#define NID_id_smime_aa_equivalentLabels 220 +#define OBJ_id_smime_aa_equivalentLabels OBJ_id_smime_aa,9L + +#define SN_id_smime_aa_contentReference "id-smime-aa-contentReference" +#define NID_id_smime_aa_contentReference 221 +#define OBJ_id_smime_aa_contentReference OBJ_id_smime_aa,10L + +#define SN_id_smime_aa_encrypKeyPref "id-smime-aa-encrypKeyPref" +#define NID_id_smime_aa_encrypKeyPref 222 +#define OBJ_id_smime_aa_encrypKeyPref OBJ_id_smime_aa,11L + +#define SN_id_smime_aa_signingCertificate "id-smime-aa-signingCertificate" +#define NID_id_smime_aa_signingCertificate 223 +#define OBJ_id_smime_aa_signingCertificate OBJ_id_smime_aa,12L + +#define SN_id_smime_aa_smimeEncryptCerts "id-smime-aa-smimeEncryptCerts" +#define NID_id_smime_aa_smimeEncryptCerts 224 +#define OBJ_id_smime_aa_smimeEncryptCerts OBJ_id_smime_aa,13L + +#define SN_id_smime_aa_timeStampToken "id-smime-aa-timeStampToken" +#define NID_id_smime_aa_timeStampToken 225 +#define OBJ_id_smime_aa_timeStampToken OBJ_id_smime_aa,14L + +#define SN_id_smime_aa_ets_sigPolicyId "id-smime-aa-ets-sigPolicyId" +#define NID_id_smime_aa_ets_sigPolicyId 226 +#define OBJ_id_smime_aa_ets_sigPolicyId OBJ_id_smime_aa,15L + +#define SN_id_smime_aa_ets_commitmentType "id-smime-aa-ets-commitmentType" +#define NID_id_smime_aa_ets_commitmentType 227 +#define OBJ_id_smime_aa_ets_commitmentType OBJ_id_smime_aa,16L + +#define SN_id_smime_aa_ets_signerLocation "id-smime-aa-ets-signerLocation" +#define NID_id_smime_aa_ets_signerLocation 228 +#define OBJ_id_smime_aa_ets_signerLocation OBJ_id_smime_aa,17L + +#define SN_id_smime_aa_ets_signerAttr "id-smime-aa-ets-signerAttr" +#define NID_id_smime_aa_ets_signerAttr 229 +#define OBJ_id_smime_aa_ets_signerAttr OBJ_id_smime_aa,18L + +#define SN_id_smime_aa_ets_otherSigCert "id-smime-aa-ets-otherSigCert" +#define NID_id_smime_aa_ets_otherSigCert 230 +#define OBJ_id_smime_aa_ets_otherSigCert OBJ_id_smime_aa,19L + +#define SN_id_smime_aa_ets_contentTimestamp "id-smime-aa-ets-contentTimestamp" +#define NID_id_smime_aa_ets_contentTimestamp 231 +#define OBJ_id_smime_aa_ets_contentTimestamp OBJ_id_smime_aa,20L + +#define SN_id_smime_aa_ets_CertificateRefs "id-smime-aa-ets-CertificateRefs" +#define NID_id_smime_aa_ets_CertificateRefs 232 +#define OBJ_id_smime_aa_ets_CertificateRefs OBJ_id_smime_aa,21L + +#define SN_id_smime_aa_ets_RevocationRefs "id-smime-aa-ets-RevocationRefs" +#define NID_id_smime_aa_ets_RevocationRefs 233 +#define OBJ_id_smime_aa_ets_RevocationRefs OBJ_id_smime_aa,22L + +#define SN_id_smime_aa_ets_certValues "id-smime-aa-ets-certValues" +#define NID_id_smime_aa_ets_certValues 234 +#define OBJ_id_smime_aa_ets_certValues OBJ_id_smime_aa,23L + +#define SN_id_smime_aa_ets_revocationValues "id-smime-aa-ets-revocationValues" +#define NID_id_smime_aa_ets_revocationValues 235 +#define OBJ_id_smime_aa_ets_revocationValues OBJ_id_smime_aa,24L + +#define SN_id_smime_aa_ets_escTimeStamp "id-smime-aa-ets-escTimeStamp" +#define NID_id_smime_aa_ets_escTimeStamp 236 +#define OBJ_id_smime_aa_ets_escTimeStamp OBJ_id_smime_aa,25L + +#define SN_id_smime_aa_ets_certCRLTimestamp "id-smime-aa-ets-certCRLTimestamp" +#define NID_id_smime_aa_ets_certCRLTimestamp 237 +#define OBJ_id_smime_aa_ets_certCRLTimestamp OBJ_id_smime_aa,26L + +#define SN_id_smime_aa_ets_archiveTimeStamp "id-smime-aa-ets-archiveTimeStamp" +#define NID_id_smime_aa_ets_archiveTimeStamp 238 +#define OBJ_id_smime_aa_ets_archiveTimeStamp OBJ_id_smime_aa,27L + +#define SN_id_smime_aa_signatureType "id-smime-aa-signatureType" +#define NID_id_smime_aa_signatureType 239 +#define OBJ_id_smime_aa_signatureType OBJ_id_smime_aa,28L + +#define SN_id_smime_aa_dvcs_dvc "id-smime-aa-dvcs-dvc" +#define NID_id_smime_aa_dvcs_dvc 240 +#define OBJ_id_smime_aa_dvcs_dvc OBJ_id_smime_aa,29L + +#define SN_id_smime_aa_signingCertificateV2 "id-smime-aa-signingCertificateV2" +#define NID_id_smime_aa_signingCertificateV2 1086 +#define OBJ_id_smime_aa_signingCertificateV2 OBJ_id_smime_aa,47L + +#define SN_id_smime_alg_ESDHwith3DES "id-smime-alg-ESDHwith3DES" +#define NID_id_smime_alg_ESDHwith3DES 241 +#define OBJ_id_smime_alg_ESDHwith3DES OBJ_id_smime_alg,1L + +#define SN_id_smime_alg_ESDHwithRC2 "id-smime-alg-ESDHwithRC2" +#define NID_id_smime_alg_ESDHwithRC2 242 +#define OBJ_id_smime_alg_ESDHwithRC2 OBJ_id_smime_alg,2L + +#define SN_id_smime_alg_3DESwrap "id-smime-alg-3DESwrap" +#define NID_id_smime_alg_3DESwrap 243 +#define OBJ_id_smime_alg_3DESwrap OBJ_id_smime_alg,3L + +#define SN_id_smime_alg_RC2wrap "id-smime-alg-RC2wrap" +#define NID_id_smime_alg_RC2wrap 244 +#define OBJ_id_smime_alg_RC2wrap OBJ_id_smime_alg,4L + +#define SN_id_smime_alg_ESDH "id-smime-alg-ESDH" +#define NID_id_smime_alg_ESDH 245 +#define OBJ_id_smime_alg_ESDH OBJ_id_smime_alg,5L + +#define SN_id_smime_alg_CMS3DESwrap "id-smime-alg-CMS3DESwrap" +#define NID_id_smime_alg_CMS3DESwrap 246 +#define OBJ_id_smime_alg_CMS3DESwrap OBJ_id_smime_alg,6L + +#define SN_id_smime_alg_CMSRC2wrap "id-smime-alg-CMSRC2wrap" +#define NID_id_smime_alg_CMSRC2wrap 247 +#define OBJ_id_smime_alg_CMSRC2wrap OBJ_id_smime_alg,7L + +#define SN_id_alg_PWRI_KEK "id-alg-PWRI-KEK" +#define NID_id_alg_PWRI_KEK 893 +#define OBJ_id_alg_PWRI_KEK OBJ_id_smime_alg,9L + +#define SN_id_smime_cd_ldap "id-smime-cd-ldap" +#define NID_id_smime_cd_ldap 248 +#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L + +#define SN_id_smime_spq_ets_sqt_uri "id-smime-spq-ets-sqt-uri" +#define NID_id_smime_spq_ets_sqt_uri 249 +#define OBJ_id_smime_spq_ets_sqt_uri OBJ_id_smime_spq,1L + +#define SN_id_smime_spq_ets_sqt_unotice "id-smime-spq-ets-sqt-unotice" +#define NID_id_smime_spq_ets_sqt_unotice 250 +#define OBJ_id_smime_spq_ets_sqt_unotice OBJ_id_smime_spq,2L + +#define SN_id_smime_cti_ets_proofOfOrigin "id-smime-cti-ets-proofOfOrigin" +#define NID_id_smime_cti_ets_proofOfOrigin 251 +#define OBJ_id_smime_cti_ets_proofOfOrigin OBJ_id_smime_cti,1L + +#define SN_id_smime_cti_ets_proofOfReceipt "id-smime-cti-ets-proofOfReceipt" +#define NID_id_smime_cti_ets_proofOfReceipt 252 +#define OBJ_id_smime_cti_ets_proofOfReceipt OBJ_id_smime_cti,2L + +#define SN_id_smime_cti_ets_proofOfDelivery "id-smime-cti-ets-proofOfDelivery" +#define NID_id_smime_cti_ets_proofOfDelivery 253 +#define OBJ_id_smime_cti_ets_proofOfDelivery OBJ_id_smime_cti,3L + +#define SN_id_smime_cti_ets_proofOfSender "id-smime-cti-ets-proofOfSender" +#define NID_id_smime_cti_ets_proofOfSender 254 +#define OBJ_id_smime_cti_ets_proofOfSender OBJ_id_smime_cti,4L + +#define SN_id_smime_cti_ets_proofOfApproval "id-smime-cti-ets-proofOfApproval" +#define NID_id_smime_cti_ets_proofOfApproval 255 +#define OBJ_id_smime_cti_ets_proofOfApproval OBJ_id_smime_cti,5L + +#define SN_id_smime_cti_ets_proofOfCreation "id-smime-cti-ets-proofOfCreation" +#define NID_id_smime_cti_ets_proofOfCreation 256 +#define OBJ_id_smime_cti_ets_proofOfCreation OBJ_id_smime_cti,6L + +#define LN_friendlyName "friendlyName" +#define NID_friendlyName 156 +#define OBJ_friendlyName OBJ_pkcs9,20L + +#define LN_localKeyID "localKeyID" +#define NID_localKeyID 157 +#define OBJ_localKeyID OBJ_pkcs9,21L + +#define SN_ms_csp_name "CSPName" +#define LN_ms_csp_name "Microsoft CSP Name" +#define NID_ms_csp_name 417 +#define OBJ_ms_csp_name 1L,3L,6L,1L,4L,1L,311L,17L,1L + +#define SN_LocalKeySet "LocalKeySet" +#define LN_LocalKeySet "Microsoft Local Key set" +#define NID_LocalKeySet 856 +#define OBJ_LocalKeySet 1L,3L,6L,1L,4L,1L,311L,17L,2L + +#define OBJ_certTypes OBJ_pkcs9,22L + +#define LN_x509Certificate "x509Certificate" +#define NID_x509Certificate 158 +#define OBJ_x509Certificate OBJ_certTypes,1L + +#define LN_sdsiCertificate "sdsiCertificate" +#define NID_sdsiCertificate 159 +#define OBJ_sdsiCertificate OBJ_certTypes,2L + +#define OBJ_crlTypes OBJ_pkcs9,23L + +#define LN_x509Crl "x509Crl" +#define NID_x509Crl 160 +#define OBJ_x509Crl OBJ_crlTypes,1L + +#define OBJ_pkcs12 OBJ_pkcs,12L + +#define OBJ_pkcs12_pbeids OBJ_pkcs12,1L + +#define SN_pbe_WithSHA1And128BitRC4 "PBE-SHA1-RC4-128" +#define LN_pbe_WithSHA1And128BitRC4 "pbeWithSHA1And128BitRC4" +#define NID_pbe_WithSHA1And128BitRC4 144 +#define OBJ_pbe_WithSHA1And128BitRC4 OBJ_pkcs12_pbeids,1L + +#define SN_pbe_WithSHA1And40BitRC4 "PBE-SHA1-RC4-40" +#define LN_pbe_WithSHA1And40BitRC4 "pbeWithSHA1And40BitRC4" +#define NID_pbe_WithSHA1And40BitRC4 145 +#define OBJ_pbe_WithSHA1And40BitRC4 OBJ_pkcs12_pbeids,2L + +#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC "PBE-SHA1-3DES" +#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC "pbeWithSHA1And3-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC 146 +#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC OBJ_pkcs12_pbeids,3L + +#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC "PBE-SHA1-2DES" +#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC "pbeWithSHA1And2-KeyTripleDES-CBC" +#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC 147 +#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC OBJ_pkcs12_pbeids,4L + +#define SN_pbe_WithSHA1And128BitRC2_CBC "PBE-SHA1-RC2-128" +#define LN_pbe_WithSHA1And128BitRC2_CBC "pbeWithSHA1And128BitRC2-CBC" +#define NID_pbe_WithSHA1And128BitRC2_CBC 148 +#define OBJ_pbe_WithSHA1And128BitRC2_CBC OBJ_pkcs12_pbeids,5L + +#define SN_pbe_WithSHA1And40BitRC2_CBC "PBE-SHA1-RC2-40" +#define LN_pbe_WithSHA1And40BitRC2_CBC "pbeWithSHA1And40BitRC2-CBC" +#define NID_pbe_WithSHA1And40BitRC2_CBC 149 +#define OBJ_pbe_WithSHA1And40BitRC2_CBC OBJ_pkcs12_pbeids,6L + +#define OBJ_pkcs12_Version1 OBJ_pkcs12,10L + +#define OBJ_pkcs12_BagIds OBJ_pkcs12_Version1,1L + +#define LN_keyBag "keyBag" +#define NID_keyBag 150 +#define OBJ_keyBag OBJ_pkcs12_BagIds,1L + +#define LN_pkcs8ShroudedKeyBag "pkcs8ShroudedKeyBag" +#define NID_pkcs8ShroudedKeyBag 151 +#define OBJ_pkcs8ShroudedKeyBag OBJ_pkcs12_BagIds,2L + +#define LN_certBag "certBag" +#define NID_certBag 152 +#define OBJ_certBag OBJ_pkcs12_BagIds,3L + +#define LN_crlBag "crlBag" +#define NID_crlBag 153 +#define OBJ_crlBag OBJ_pkcs12_BagIds,4L + +#define LN_secretBag "secretBag" +#define NID_secretBag 154 +#define OBJ_secretBag OBJ_pkcs12_BagIds,5L + +#define LN_safeContentsBag "safeContentsBag" +#define NID_safeContentsBag 155 +#define OBJ_safeContentsBag OBJ_pkcs12_BagIds,6L + +#define SN_md2 "MD2" +#define LN_md2 "md2" +#define NID_md2 3 +#define OBJ_md2 OBJ_rsadsi,2L,2L + +#define SN_md4 "MD4" +#define LN_md4 "md4" +#define NID_md4 257 +#define OBJ_md4 OBJ_rsadsi,2L,4L + +#define SN_md5 "MD5" +#define LN_md5 "md5" +#define NID_md5 4 +#define OBJ_md5 OBJ_rsadsi,2L,5L + +#define SN_md5_sha1 "MD5-SHA1" +#define LN_md5_sha1 "md5-sha1" +#define NID_md5_sha1 114 + +#define LN_hmacWithMD5 "hmacWithMD5" +#define NID_hmacWithMD5 797 +#define OBJ_hmacWithMD5 OBJ_rsadsi,2L,6L + +#define LN_hmacWithSHA1 "hmacWithSHA1" +#define NID_hmacWithSHA1 163 +#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L + +#define SN_sm2 "SM2" +#define LN_sm2 "sm2" +#define NID_sm2 1172 +#define OBJ_sm2 OBJ_sm_scheme,301L + +#define SN_sm3 "SM3" +#define LN_sm3 "sm3" +#define NID_sm3 1143 +#define OBJ_sm3 OBJ_sm_scheme,401L + +#define SN_sm3WithRSAEncryption "RSA-SM3" +#define LN_sm3WithRSAEncryption "sm3WithRSAEncryption" +#define NID_sm3WithRSAEncryption 1144 +#define OBJ_sm3WithRSAEncryption OBJ_sm_scheme,504L + +#define SN_SM2_with_SM3 "SM2-SM3" +#define LN_SM2_with_SM3 "SM2-with-SM3" +#define NID_SM2_with_SM3 1204 +#define OBJ_SM2_with_SM3 OBJ_sm_scheme,501L + +#define LN_hmacWithSHA224 "hmacWithSHA224" +#define NID_hmacWithSHA224 798 +#define OBJ_hmacWithSHA224 OBJ_rsadsi,2L,8L + +#define LN_hmacWithSHA256 "hmacWithSHA256" +#define NID_hmacWithSHA256 799 +#define OBJ_hmacWithSHA256 OBJ_rsadsi,2L,9L + +#define LN_hmacWithSHA384 "hmacWithSHA384" +#define NID_hmacWithSHA384 800 +#define OBJ_hmacWithSHA384 OBJ_rsadsi,2L,10L + +#define LN_hmacWithSHA512 "hmacWithSHA512" +#define NID_hmacWithSHA512 801 +#define OBJ_hmacWithSHA512 OBJ_rsadsi,2L,11L + +#define LN_hmacWithSHA512_224 "hmacWithSHA512-224" +#define NID_hmacWithSHA512_224 1193 +#define OBJ_hmacWithSHA512_224 OBJ_rsadsi,2L,12L + +#define LN_hmacWithSHA512_256 "hmacWithSHA512-256" +#define NID_hmacWithSHA512_256 1194 +#define OBJ_hmacWithSHA512_256 OBJ_rsadsi,2L,13L + +#define SN_rc2_cbc "RC2-CBC" +#define LN_rc2_cbc "rc2-cbc" +#define NID_rc2_cbc 37 +#define OBJ_rc2_cbc OBJ_rsadsi,3L,2L + +#define SN_rc2_ecb "RC2-ECB" +#define LN_rc2_ecb "rc2-ecb" +#define NID_rc2_ecb 38 + +#define SN_rc2_cfb64 "RC2-CFB" +#define LN_rc2_cfb64 "rc2-cfb" +#define NID_rc2_cfb64 39 + +#define SN_rc2_ofb64 "RC2-OFB" +#define LN_rc2_ofb64 "rc2-ofb" +#define NID_rc2_ofb64 40 + +#define SN_rc2_40_cbc "RC2-40-CBC" +#define LN_rc2_40_cbc "rc2-40-cbc" +#define NID_rc2_40_cbc 98 + +#define SN_rc2_64_cbc "RC2-64-CBC" +#define LN_rc2_64_cbc "rc2-64-cbc" +#define NID_rc2_64_cbc 166 + +#define SN_rc4 "RC4" +#define LN_rc4 "rc4" +#define NID_rc4 5 +#define OBJ_rc4 OBJ_rsadsi,3L,4L + +#define SN_rc4_40 "RC4-40" +#define LN_rc4_40 "rc4-40" +#define NID_rc4_40 97 + +#define SN_des_ede3_cbc "DES-EDE3-CBC" +#define LN_des_ede3_cbc "des-ede3-cbc" +#define NID_des_ede3_cbc 44 +#define OBJ_des_ede3_cbc OBJ_rsadsi,3L,7L + +#define SN_rc5_cbc "RC5-CBC" +#define LN_rc5_cbc "rc5-cbc" +#define NID_rc5_cbc 120 +#define OBJ_rc5_cbc OBJ_rsadsi,3L,8L + +#define SN_rc5_ecb "RC5-ECB" +#define LN_rc5_ecb "rc5-ecb" +#define NID_rc5_ecb 121 + +#define SN_rc5_cfb64 "RC5-CFB" +#define LN_rc5_cfb64 "rc5-cfb" +#define NID_rc5_cfb64 122 + +#define SN_rc5_ofb64 "RC5-OFB" +#define LN_rc5_ofb64 "rc5-ofb" +#define NID_rc5_ofb64 123 + +#define SN_ms_ext_req "msExtReq" +#define LN_ms_ext_req "Microsoft Extension Request" +#define NID_ms_ext_req 171 +#define OBJ_ms_ext_req 1L,3L,6L,1L,4L,1L,311L,2L,1L,14L + +#define SN_ms_code_ind "msCodeInd" +#define LN_ms_code_ind "Microsoft Individual Code Signing" +#define NID_ms_code_ind 134 +#define OBJ_ms_code_ind 1L,3L,6L,1L,4L,1L,311L,2L,1L,21L + +#define SN_ms_code_com "msCodeCom" +#define LN_ms_code_com "Microsoft Commercial Code Signing" +#define NID_ms_code_com 135 +#define OBJ_ms_code_com 1L,3L,6L,1L,4L,1L,311L,2L,1L,22L + +#define SN_ms_ctl_sign "msCTLSign" +#define LN_ms_ctl_sign "Microsoft Trust List Signing" +#define NID_ms_ctl_sign 136 +#define OBJ_ms_ctl_sign 1L,3L,6L,1L,4L,1L,311L,10L,3L,1L + +#define SN_ms_sgc "msSGC" +#define LN_ms_sgc "Microsoft Server Gated Crypto" +#define NID_ms_sgc 137 +#define OBJ_ms_sgc 1L,3L,6L,1L,4L,1L,311L,10L,3L,3L + +#define SN_ms_efs "msEFS" +#define LN_ms_efs "Microsoft Encrypted File System" +#define NID_ms_efs 138 +#define OBJ_ms_efs 1L,3L,6L,1L,4L,1L,311L,10L,3L,4L + +#define SN_ms_smartcard_login "msSmartcardLogin" +#define LN_ms_smartcard_login "Microsoft Smartcard Login" +#define NID_ms_smartcard_login 648 +#define OBJ_ms_smartcard_login 1L,3L,6L,1L,4L,1L,311L,20L,2L,2L + +#define SN_ms_upn "msUPN" +#define LN_ms_upn "Microsoft User Principal Name" +#define NID_ms_upn 649 +#define OBJ_ms_upn 1L,3L,6L,1L,4L,1L,311L,20L,2L,3L + +#define SN_idea_cbc "IDEA-CBC" +#define LN_idea_cbc "idea-cbc" +#define NID_idea_cbc 34 +#define OBJ_idea_cbc 1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L + +#define SN_idea_ecb "IDEA-ECB" +#define LN_idea_ecb "idea-ecb" +#define NID_idea_ecb 36 + +#define SN_idea_cfb64 "IDEA-CFB" +#define LN_idea_cfb64 "idea-cfb" +#define NID_idea_cfb64 35 + +#define SN_idea_ofb64 "IDEA-OFB" +#define LN_idea_ofb64 "idea-ofb" +#define NID_idea_ofb64 46 + +#define SN_bf_cbc "BF-CBC" +#define LN_bf_cbc "bf-cbc" +#define NID_bf_cbc 91 +#define OBJ_bf_cbc 1L,3L,6L,1L,4L,1L,3029L,1L,2L + +#define SN_bf_ecb "BF-ECB" +#define LN_bf_ecb "bf-ecb" +#define NID_bf_ecb 92 + +#define SN_bf_cfb64 "BF-CFB" +#define LN_bf_cfb64 "bf-cfb" +#define NID_bf_cfb64 93 + +#define SN_bf_ofb64 "BF-OFB" +#define LN_bf_ofb64 "bf-ofb" +#define NID_bf_ofb64 94 + +#define SN_id_pkix "PKIX" +#define NID_id_pkix 127 +#define OBJ_id_pkix 1L,3L,6L,1L,5L,5L,7L + +#define SN_id_pkix_mod "id-pkix-mod" +#define NID_id_pkix_mod 258 +#define OBJ_id_pkix_mod OBJ_id_pkix,0L + +#define SN_id_pe "id-pe" +#define NID_id_pe 175 +#define OBJ_id_pe OBJ_id_pkix,1L + +#define SN_id_qt "id-qt" +#define NID_id_qt 259 +#define OBJ_id_qt OBJ_id_pkix,2L + +#define SN_id_kp "id-kp" +#define NID_id_kp 128 +#define OBJ_id_kp OBJ_id_pkix,3L + +#define SN_id_it "id-it" +#define NID_id_it 260 +#define OBJ_id_it OBJ_id_pkix,4L + +#define SN_id_pkip "id-pkip" +#define NID_id_pkip 261 +#define OBJ_id_pkip OBJ_id_pkix,5L + +#define SN_id_alg "id-alg" +#define NID_id_alg 262 +#define OBJ_id_alg OBJ_id_pkix,6L + +#define SN_id_cmc "id-cmc" +#define NID_id_cmc 263 +#define OBJ_id_cmc OBJ_id_pkix,7L + +#define SN_id_on "id-on" +#define NID_id_on 264 +#define OBJ_id_on OBJ_id_pkix,8L + +#define SN_id_pda "id-pda" +#define NID_id_pda 265 +#define OBJ_id_pda OBJ_id_pkix,9L + +#define SN_id_aca "id-aca" +#define NID_id_aca 266 +#define OBJ_id_aca OBJ_id_pkix,10L + +#define SN_id_qcs "id-qcs" +#define NID_id_qcs 267 +#define OBJ_id_qcs OBJ_id_pkix,11L + +#define SN_id_cp "id-cp" +#define NID_id_cp 1238 +#define OBJ_id_cp OBJ_id_pkix,14L + +#define SN_id_cct "id-cct" +#define NID_id_cct 268 +#define OBJ_id_cct OBJ_id_pkix,12L + +#define SN_id_ppl "id-ppl" +#define NID_id_ppl 662 +#define OBJ_id_ppl OBJ_id_pkix,21L + +#define SN_id_ad "id-ad" +#define NID_id_ad 176 +#define OBJ_id_ad OBJ_id_pkix,48L + +#define SN_id_pkix1_explicit_88 "id-pkix1-explicit-88" +#define NID_id_pkix1_explicit_88 269 +#define OBJ_id_pkix1_explicit_88 OBJ_id_pkix_mod,1L + +#define SN_id_pkix1_implicit_88 "id-pkix1-implicit-88" +#define NID_id_pkix1_implicit_88 270 +#define OBJ_id_pkix1_implicit_88 OBJ_id_pkix_mod,2L + +#define SN_id_pkix1_explicit_93 "id-pkix1-explicit-93" +#define NID_id_pkix1_explicit_93 271 +#define OBJ_id_pkix1_explicit_93 OBJ_id_pkix_mod,3L + +#define SN_id_pkix1_implicit_93 "id-pkix1-implicit-93" +#define NID_id_pkix1_implicit_93 272 +#define OBJ_id_pkix1_implicit_93 OBJ_id_pkix_mod,4L + +#define SN_id_mod_crmf "id-mod-crmf" +#define NID_id_mod_crmf 273 +#define OBJ_id_mod_crmf OBJ_id_pkix_mod,5L + +#define SN_id_mod_cmc "id-mod-cmc" +#define NID_id_mod_cmc 274 +#define OBJ_id_mod_cmc OBJ_id_pkix_mod,6L + +#define SN_id_mod_kea_profile_88 "id-mod-kea-profile-88" +#define NID_id_mod_kea_profile_88 275 +#define OBJ_id_mod_kea_profile_88 OBJ_id_pkix_mod,7L + +#define SN_id_mod_kea_profile_93 "id-mod-kea-profile-93" +#define NID_id_mod_kea_profile_93 276 +#define OBJ_id_mod_kea_profile_93 OBJ_id_pkix_mod,8L + +#define SN_id_mod_cmp "id-mod-cmp" +#define NID_id_mod_cmp 277 +#define OBJ_id_mod_cmp OBJ_id_pkix_mod,9L + +#define SN_id_mod_qualified_cert_88 "id-mod-qualified-cert-88" +#define NID_id_mod_qualified_cert_88 278 +#define OBJ_id_mod_qualified_cert_88 OBJ_id_pkix_mod,10L + +#define SN_id_mod_qualified_cert_93 "id-mod-qualified-cert-93" +#define NID_id_mod_qualified_cert_93 279 +#define OBJ_id_mod_qualified_cert_93 OBJ_id_pkix_mod,11L + +#define SN_id_mod_attribute_cert "id-mod-attribute-cert" +#define NID_id_mod_attribute_cert 280 +#define OBJ_id_mod_attribute_cert OBJ_id_pkix_mod,12L + +#define SN_id_mod_timestamp_protocol "id-mod-timestamp-protocol" +#define NID_id_mod_timestamp_protocol 281 +#define OBJ_id_mod_timestamp_protocol OBJ_id_pkix_mod,13L + +#define SN_id_mod_ocsp "id-mod-ocsp" +#define NID_id_mod_ocsp 282 +#define OBJ_id_mod_ocsp OBJ_id_pkix_mod,14L + +#define SN_id_mod_dvcs "id-mod-dvcs" +#define NID_id_mod_dvcs 283 +#define OBJ_id_mod_dvcs OBJ_id_pkix_mod,15L + +#define SN_id_mod_cmp2000 "id-mod-cmp2000" +#define NID_id_mod_cmp2000 284 +#define OBJ_id_mod_cmp2000 OBJ_id_pkix_mod,16L + +#define SN_info_access "authorityInfoAccess" +#define LN_info_access "Authority Information Access" +#define NID_info_access 177 +#define OBJ_info_access OBJ_id_pe,1L + +#define SN_biometricInfo "biometricInfo" +#define LN_biometricInfo "Biometric Info" +#define NID_biometricInfo 285 +#define OBJ_biometricInfo OBJ_id_pe,2L + +#define SN_qcStatements "qcStatements" +#define NID_qcStatements 286 +#define OBJ_qcStatements OBJ_id_pe,3L + +#define SN_ac_auditEntity "ac-auditEntity" +#define NID_ac_auditEntity 287 +#define OBJ_ac_auditEntity OBJ_id_pe,4L + +#define SN_ac_targeting "ac-targeting" +#define NID_ac_targeting 288 +#define OBJ_ac_targeting OBJ_id_pe,5L + +#define SN_aaControls "aaControls" +#define NID_aaControls 289 +#define OBJ_aaControls OBJ_id_pe,6L + +#define SN_sbgp_ipAddrBlock "sbgp-ipAddrBlock" +#define NID_sbgp_ipAddrBlock 290 +#define OBJ_sbgp_ipAddrBlock OBJ_id_pe,7L + +#define SN_sbgp_autonomousSysNum "sbgp-autonomousSysNum" +#define NID_sbgp_autonomousSysNum 291 +#define OBJ_sbgp_autonomousSysNum OBJ_id_pe,8L + +#define SN_sbgp_routerIdentifier "sbgp-routerIdentifier" +#define NID_sbgp_routerIdentifier 292 +#define OBJ_sbgp_routerIdentifier OBJ_id_pe,9L + +#define SN_ac_proxying "ac-proxying" +#define NID_ac_proxying 397 +#define OBJ_ac_proxying OBJ_id_pe,10L + +#define SN_sinfo_access "subjectInfoAccess" +#define LN_sinfo_access "Subject Information Access" +#define NID_sinfo_access 398 +#define OBJ_sinfo_access OBJ_id_pe,11L + +#define SN_proxyCertInfo "proxyCertInfo" +#define LN_proxyCertInfo "Proxy Certificate Information" +#define NID_proxyCertInfo 663 +#define OBJ_proxyCertInfo OBJ_id_pe,14L + +#define SN_tlsfeature "tlsfeature" +#define LN_tlsfeature "TLS Feature" +#define NID_tlsfeature 1020 +#define OBJ_tlsfeature OBJ_id_pe,24L + +#define SN_sbgp_ipAddrBlockv2 "sbgp-ipAddrBlockv2" +#define NID_sbgp_ipAddrBlockv2 1239 +#define OBJ_sbgp_ipAddrBlockv2 OBJ_id_pe,28L + +#define SN_sbgp_autonomousSysNumv2 "sbgp-autonomousSysNumv2" +#define NID_sbgp_autonomousSysNumv2 1240 +#define OBJ_sbgp_autonomousSysNumv2 OBJ_id_pe,29L + +#define SN_id_qt_cps "id-qt-cps" +#define LN_id_qt_cps "Policy Qualifier CPS" +#define NID_id_qt_cps 164 +#define OBJ_id_qt_cps OBJ_id_qt,1L + +#define SN_id_qt_unotice "id-qt-unotice" +#define LN_id_qt_unotice "Policy Qualifier User Notice" +#define NID_id_qt_unotice 165 +#define OBJ_id_qt_unotice OBJ_id_qt,2L + +#define SN_textNotice "textNotice" +#define NID_textNotice 293 +#define OBJ_textNotice OBJ_id_qt,3L + +#define SN_server_auth "serverAuth" +#define LN_server_auth "TLS Web Server Authentication" +#define NID_server_auth 129 +#define OBJ_server_auth OBJ_id_kp,1L + +#define SN_client_auth "clientAuth" +#define LN_client_auth "TLS Web Client Authentication" +#define NID_client_auth 130 +#define OBJ_client_auth OBJ_id_kp,2L + +#define SN_code_sign "codeSigning" +#define LN_code_sign "Code Signing" +#define NID_code_sign 131 +#define OBJ_code_sign OBJ_id_kp,3L + +#define SN_email_protect "emailProtection" +#define LN_email_protect "E-mail Protection" +#define NID_email_protect 132 +#define OBJ_email_protect OBJ_id_kp,4L + +#define SN_ipsecEndSystem "ipsecEndSystem" +#define LN_ipsecEndSystem "IPSec End System" +#define NID_ipsecEndSystem 294 +#define OBJ_ipsecEndSystem OBJ_id_kp,5L + +#define SN_ipsecTunnel "ipsecTunnel" +#define LN_ipsecTunnel "IPSec Tunnel" +#define NID_ipsecTunnel 295 +#define OBJ_ipsecTunnel OBJ_id_kp,6L + +#define SN_ipsecUser "ipsecUser" +#define LN_ipsecUser "IPSec User" +#define NID_ipsecUser 296 +#define OBJ_ipsecUser OBJ_id_kp,7L + +#define SN_time_stamp "timeStamping" +#define LN_time_stamp "Time Stamping" +#define NID_time_stamp 133 +#define OBJ_time_stamp OBJ_id_kp,8L + +#define SN_OCSP_sign "OCSPSigning" +#define LN_OCSP_sign "OCSP Signing" +#define NID_OCSP_sign 180 +#define OBJ_OCSP_sign OBJ_id_kp,9L + +#define SN_dvcs "DVCS" +#define LN_dvcs "dvcs" +#define NID_dvcs 297 +#define OBJ_dvcs OBJ_id_kp,10L + +#define SN_ipsec_IKE "ipsecIKE" +#define LN_ipsec_IKE "ipsec Internet Key Exchange" +#define NID_ipsec_IKE 1022 +#define OBJ_ipsec_IKE OBJ_id_kp,17L + +#define SN_capwapAC "capwapAC" +#define LN_capwapAC "Ctrl/provision WAP Access" +#define NID_capwapAC 1023 +#define OBJ_capwapAC OBJ_id_kp,18L + +#define SN_capwapWTP "capwapWTP" +#define LN_capwapWTP "Ctrl/Provision WAP Termination" +#define NID_capwapWTP 1024 +#define OBJ_capwapWTP OBJ_id_kp,19L + +#define SN_sshClient "secureShellClient" +#define LN_sshClient "SSH Client" +#define NID_sshClient 1025 +#define OBJ_sshClient OBJ_id_kp,21L + +#define SN_sshServer "secureShellServer" +#define LN_sshServer "SSH Server" +#define NID_sshServer 1026 +#define OBJ_sshServer OBJ_id_kp,22L + +#define SN_sendRouter "sendRouter" +#define LN_sendRouter "Send Router" +#define NID_sendRouter 1027 +#define OBJ_sendRouter OBJ_id_kp,23L + +#define SN_sendProxiedRouter "sendProxiedRouter" +#define LN_sendProxiedRouter "Send Proxied Router" +#define NID_sendProxiedRouter 1028 +#define OBJ_sendProxiedRouter OBJ_id_kp,24L + +#define SN_sendOwner "sendOwner" +#define LN_sendOwner "Send Owner" +#define NID_sendOwner 1029 +#define OBJ_sendOwner OBJ_id_kp,25L + +#define SN_sendProxiedOwner "sendProxiedOwner" +#define LN_sendProxiedOwner "Send Proxied Owner" +#define NID_sendProxiedOwner 1030 +#define OBJ_sendProxiedOwner OBJ_id_kp,26L + +#define SN_cmcCA "cmcCA" +#define LN_cmcCA "CMC Certificate Authority" +#define NID_cmcCA 1131 +#define OBJ_cmcCA OBJ_id_kp,27L + +#define SN_cmcRA "cmcRA" +#define LN_cmcRA "CMC Registration Authority" +#define NID_cmcRA 1132 +#define OBJ_cmcRA OBJ_id_kp,28L + +#define SN_cmcArchive "cmcArchive" +#define LN_cmcArchive "CMC Archive Server" +#define NID_cmcArchive 1219 +#define OBJ_cmcArchive OBJ_id_kp,29L + +#define SN_id_kp_bgpsec_router "id-kp-bgpsec-router" +#define LN_id_kp_bgpsec_router "BGPsec Router" +#define NID_id_kp_bgpsec_router 1220 +#define OBJ_id_kp_bgpsec_router OBJ_id_kp,30L + +#define SN_id_kp_BrandIndicatorforMessageIdentification "id-kp-BrandIndicatorforMessageIdentification" +#define LN_id_kp_BrandIndicatorforMessageIdentification "Brand Indicator for Message Identification" +#define NID_id_kp_BrandIndicatorforMessageIdentification 1221 +#define OBJ_id_kp_BrandIndicatorforMessageIdentification OBJ_id_kp,31L + +#define SN_cmKGA "cmKGA" +#define LN_cmKGA "Certificate Management Key Generation Authority" +#define NID_cmKGA 1222 +#define OBJ_cmKGA OBJ_id_kp,32L + +#define SN_id_it_caProtEncCert "id-it-caProtEncCert" +#define NID_id_it_caProtEncCert 298 +#define OBJ_id_it_caProtEncCert OBJ_id_it,1L + +#define SN_id_it_signKeyPairTypes "id-it-signKeyPairTypes" +#define NID_id_it_signKeyPairTypes 299 +#define OBJ_id_it_signKeyPairTypes OBJ_id_it,2L + +#define SN_id_it_encKeyPairTypes "id-it-encKeyPairTypes" +#define NID_id_it_encKeyPairTypes 300 +#define OBJ_id_it_encKeyPairTypes OBJ_id_it,3L + +#define SN_id_it_preferredSymmAlg "id-it-preferredSymmAlg" +#define NID_id_it_preferredSymmAlg 301 +#define OBJ_id_it_preferredSymmAlg OBJ_id_it,4L + +#define SN_id_it_caKeyUpdateInfo "id-it-caKeyUpdateInfo" +#define NID_id_it_caKeyUpdateInfo 302 +#define OBJ_id_it_caKeyUpdateInfo OBJ_id_it,5L + +#define SN_id_it_currentCRL "id-it-currentCRL" +#define NID_id_it_currentCRL 303 +#define OBJ_id_it_currentCRL OBJ_id_it,6L + +#define SN_id_it_unsupportedOIDs "id-it-unsupportedOIDs" +#define NID_id_it_unsupportedOIDs 304 +#define OBJ_id_it_unsupportedOIDs OBJ_id_it,7L + +#define SN_id_it_subscriptionRequest "id-it-subscriptionRequest" +#define NID_id_it_subscriptionRequest 305 +#define OBJ_id_it_subscriptionRequest OBJ_id_it,8L + +#define SN_id_it_subscriptionResponse "id-it-subscriptionResponse" +#define NID_id_it_subscriptionResponse 306 +#define OBJ_id_it_subscriptionResponse OBJ_id_it,9L + +#define SN_id_it_keyPairParamReq "id-it-keyPairParamReq" +#define NID_id_it_keyPairParamReq 307 +#define OBJ_id_it_keyPairParamReq OBJ_id_it,10L + +#define SN_id_it_keyPairParamRep "id-it-keyPairParamRep" +#define NID_id_it_keyPairParamRep 308 +#define OBJ_id_it_keyPairParamRep OBJ_id_it,11L + +#define SN_id_it_revPassphrase "id-it-revPassphrase" +#define NID_id_it_revPassphrase 309 +#define OBJ_id_it_revPassphrase OBJ_id_it,12L + +#define SN_id_it_implicitConfirm "id-it-implicitConfirm" +#define NID_id_it_implicitConfirm 310 +#define OBJ_id_it_implicitConfirm OBJ_id_it,13L + +#define SN_id_it_confirmWaitTime "id-it-confirmWaitTime" +#define NID_id_it_confirmWaitTime 311 +#define OBJ_id_it_confirmWaitTime OBJ_id_it,14L + +#define SN_id_it_origPKIMessage "id-it-origPKIMessage" +#define NID_id_it_origPKIMessage 312 +#define OBJ_id_it_origPKIMessage OBJ_id_it,15L + +#define SN_id_it_suppLangTags "id-it-suppLangTags" +#define NID_id_it_suppLangTags 784 +#define OBJ_id_it_suppLangTags OBJ_id_it,16L + +#define SN_id_it_caCerts "id-it-caCerts" +#define NID_id_it_caCerts 1223 +#define OBJ_id_it_caCerts OBJ_id_it,17L + +#define SN_id_it_rootCaKeyUpdate "id-it-rootCaKeyUpdate" +#define NID_id_it_rootCaKeyUpdate 1224 +#define OBJ_id_it_rootCaKeyUpdate OBJ_id_it,18L + +#define SN_id_it_certReqTemplate "id-it-certReqTemplate" +#define NID_id_it_certReqTemplate 1225 +#define OBJ_id_it_certReqTemplate OBJ_id_it,19L + +#define SN_id_regCtrl "id-regCtrl" +#define NID_id_regCtrl 313 +#define OBJ_id_regCtrl OBJ_id_pkip,1L + +#define SN_id_regInfo "id-regInfo" +#define NID_id_regInfo 314 +#define OBJ_id_regInfo OBJ_id_pkip,2L + +#define SN_id_regCtrl_regToken "id-regCtrl-regToken" +#define NID_id_regCtrl_regToken 315 +#define OBJ_id_regCtrl_regToken OBJ_id_regCtrl,1L + +#define SN_id_regCtrl_authenticator "id-regCtrl-authenticator" +#define NID_id_regCtrl_authenticator 316 +#define OBJ_id_regCtrl_authenticator OBJ_id_regCtrl,2L + +#define SN_id_regCtrl_pkiPublicationInfo "id-regCtrl-pkiPublicationInfo" +#define NID_id_regCtrl_pkiPublicationInfo 317 +#define OBJ_id_regCtrl_pkiPublicationInfo OBJ_id_regCtrl,3L + +#define SN_id_regCtrl_pkiArchiveOptions "id-regCtrl-pkiArchiveOptions" +#define NID_id_regCtrl_pkiArchiveOptions 318 +#define OBJ_id_regCtrl_pkiArchiveOptions OBJ_id_regCtrl,4L + +#define SN_id_regCtrl_oldCertID "id-regCtrl-oldCertID" +#define NID_id_regCtrl_oldCertID 319 +#define OBJ_id_regCtrl_oldCertID OBJ_id_regCtrl,5L + +#define SN_id_regCtrl_protocolEncrKey "id-regCtrl-protocolEncrKey" +#define NID_id_regCtrl_protocolEncrKey 320 +#define OBJ_id_regCtrl_protocolEncrKey OBJ_id_regCtrl,6L + +#define SN_id_regInfo_utf8Pairs "id-regInfo-utf8Pairs" +#define NID_id_regInfo_utf8Pairs 321 +#define OBJ_id_regInfo_utf8Pairs OBJ_id_regInfo,1L + +#define SN_id_regInfo_certReq "id-regInfo-certReq" +#define NID_id_regInfo_certReq 322 +#define OBJ_id_regInfo_certReq OBJ_id_regInfo,2L + +#define SN_id_alg_des40 "id-alg-des40" +#define NID_id_alg_des40 323 +#define OBJ_id_alg_des40 OBJ_id_alg,1L + +#define SN_id_alg_noSignature "id-alg-noSignature" +#define NID_id_alg_noSignature 324 +#define OBJ_id_alg_noSignature OBJ_id_alg,2L + +#define SN_id_alg_dh_sig_hmac_sha1 "id-alg-dh-sig-hmac-sha1" +#define NID_id_alg_dh_sig_hmac_sha1 325 +#define OBJ_id_alg_dh_sig_hmac_sha1 OBJ_id_alg,3L + +#define SN_id_alg_dh_pop "id-alg-dh-pop" +#define NID_id_alg_dh_pop 326 +#define OBJ_id_alg_dh_pop OBJ_id_alg,4L + +#define SN_id_cmc_statusInfo "id-cmc-statusInfo" +#define NID_id_cmc_statusInfo 327 +#define OBJ_id_cmc_statusInfo OBJ_id_cmc,1L + +#define SN_id_cmc_identification "id-cmc-identification" +#define NID_id_cmc_identification 328 +#define OBJ_id_cmc_identification OBJ_id_cmc,2L + +#define SN_id_cmc_identityProof "id-cmc-identityProof" +#define NID_id_cmc_identityProof 329 +#define OBJ_id_cmc_identityProof OBJ_id_cmc,3L + +#define SN_id_cmc_dataReturn "id-cmc-dataReturn" +#define NID_id_cmc_dataReturn 330 +#define OBJ_id_cmc_dataReturn OBJ_id_cmc,4L + +#define SN_id_cmc_transactionId "id-cmc-transactionId" +#define NID_id_cmc_transactionId 331 +#define OBJ_id_cmc_transactionId OBJ_id_cmc,5L + +#define SN_id_cmc_senderNonce "id-cmc-senderNonce" +#define NID_id_cmc_senderNonce 332 +#define OBJ_id_cmc_senderNonce OBJ_id_cmc,6L + +#define SN_id_cmc_recipientNonce "id-cmc-recipientNonce" +#define NID_id_cmc_recipientNonce 333 +#define OBJ_id_cmc_recipientNonce OBJ_id_cmc,7L + +#define SN_id_cmc_addExtensions "id-cmc-addExtensions" +#define NID_id_cmc_addExtensions 334 +#define OBJ_id_cmc_addExtensions OBJ_id_cmc,8L + +#define SN_id_cmc_encryptedPOP "id-cmc-encryptedPOP" +#define NID_id_cmc_encryptedPOP 335 +#define OBJ_id_cmc_encryptedPOP OBJ_id_cmc,9L + +#define SN_id_cmc_decryptedPOP "id-cmc-decryptedPOP" +#define NID_id_cmc_decryptedPOP 336 +#define OBJ_id_cmc_decryptedPOP OBJ_id_cmc,10L + +#define SN_id_cmc_lraPOPWitness "id-cmc-lraPOPWitness" +#define NID_id_cmc_lraPOPWitness 337 +#define OBJ_id_cmc_lraPOPWitness OBJ_id_cmc,11L + +#define SN_id_cmc_getCert "id-cmc-getCert" +#define NID_id_cmc_getCert 338 +#define OBJ_id_cmc_getCert OBJ_id_cmc,15L + +#define SN_id_cmc_getCRL "id-cmc-getCRL" +#define NID_id_cmc_getCRL 339 +#define OBJ_id_cmc_getCRL OBJ_id_cmc,16L + +#define SN_id_cmc_revokeRequest "id-cmc-revokeRequest" +#define NID_id_cmc_revokeRequest 340 +#define OBJ_id_cmc_revokeRequest OBJ_id_cmc,17L + +#define SN_id_cmc_regInfo "id-cmc-regInfo" +#define NID_id_cmc_regInfo 341 +#define OBJ_id_cmc_regInfo OBJ_id_cmc,18L + +#define SN_id_cmc_responseInfo "id-cmc-responseInfo" +#define NID_id_cmc_responseInfo 342 +#define OBJ_id_cmc_responseInfo OBJ_id_cmc,19L + +#define SN_id_cmc_queryPending "id-cmc-queryPending" +#define NID_id_cmc_queryPending 343 +#define OBJ_id_cmc_queryPending OBJ_id_cmc,21L + +#define SN_id_cmc_popLinkRandom "id-cmc-popLinkRandom" +#define NID_id_cmc_popLinkRandom 344 +#define OBJ_id_cmc_popLinkRandom OBJ_id_cmc,22L + +#define SN_id_cmc_popLinkWitness "id-cmc-popLinkWitness" +#define NID_id_cmc_popLinkWitness 345 +#define OBJ_id_cmc_popLinkWitness OBJ_id_cmc,23L + +#define SN_id_cmc_confirmCertAcceptance "id-cmc-confirmCertAcceptance" +#define NID_id_cmc_confirmCertAcceptance 346 +#define OBJ_id_cmc_confirmCertAcceptance OBJ_id_cmc,24L + +#define SN_id_on_personalData "id-on-personalData" +#define NID_id_on_personalData 347 +#define OBJ_id_on_personalData OBJ_id_on,1L + +#define SN_id_on_permanentIdentifier "id-on-permanentIdentifier" +#define LN_id_on_permanentIdentifier "Permanent Identifier" +#define NID_id_on_permanentIdentifier 858 +#define OBJ_id_on_permanentIdentifier OBJ_id_on,3L + +#define SN_XmppAddr "id-on-xmppAddr" +#define LN_XmppAddr "XmppAddr" +#define NID_XmppAddr 1209 +#define OBJ_XmppAddr OBJ_id_on,5L + +#define SN_SRVName "id-on-dnsSRV" +#define LN_SRVName "SRVName" +#define NID_SRVName 1210 +#define OBJ_SRVName OBJ_id_on,7L + +#define SN_NAIRealm "id-on-NAIRealm" +#define LN_NAIRealm "NAIRealm" +#define NID_NAIRealm 1211 +#define OBJ_NAIRealm OBJ_id_on,8L + +#define SN_id_on_SmtpUTF8Mailbox "id-on-SmtpUTF8Mailbox" +#define LN_id_on_SmtpUTF8Mailbox "Smtp UTF8 Mailbox" +#define NID_id_on_SmtpUTF8Mailbox 1208 +#define OBJ_id_on_SmtpUTF8Mailbox OBJ_id_on,9L + +#define SN_id_pda_dateOfBirth "id-pda-dateOfBirth" +#define NID_id_pda_dateOfBirth 348 +#define OBJ_id_pda_dateOfBirth OBJ_id_pda,1L + +#define SN_id_pda_placeOfBirth "id-pda-placeOfBirth" +#define NID_id_pda_placeOfBirth 349 +#define OBJ_id_pda_placeOfBirth OBJ_id_pda,2L + +#define SN_id_pda_gender "id-pda-gender" +#define NID_id_pda_gender 351 +#define OBJ_id_pda_gender OBJ_id_pda,3L + +#define SN_id_pda_countryOfCitizenship "id-pda-countryOfCitizenship" +#define NID_id_pda_countryOfCitizenship 352 +#define OBJ_id_pda_countryOfCitizenship OBJ_id_pda,4L + +#define SN_id_pda_countryOfResidence "id-pda-countryOfResidence" +#define NID_id_pda_countryOfResidence 353 +#define OBJ_id_pda_countryOfResidence OBJ_id_pda,5L + +#define SN_id_aca_authenticationInfo "id-aca-authenticationInfo" +#define NID_id_aca_authenticationInfo 354 +#define OBJ_id_aca_authenticationInfo OBJ_id_aca,1L + +#define SN_id_aca_accessIdentity "id-aca-accessIdentity" +#define NID_id_aca_accessIdentity 355 +#define OBJ_id_aca_accessIdentity OBJ_id_aca,2L + +#define SN_id_aca_chargingIdentity "id-aca-chargingIdentity" +#define NID_id_aca_chargingIdentity 356 +#define OBJ_id_aca_chargingIdentity OBJ_id_aca,3L + +#define SN_id_aca_group "id-aca-group" +#define NID_id_aca_group 357 +#define OBJ_id_aca_group OBJ_id_aca,4L + +#define SN_id_aca_role "id-aca-role" +#define NID_id_aca_role 358 +#define OBJ_id_aca_role OBJ_id_aca,5L + +#define SN_id_aca_encAttrs "id-aca-encAttrs" +#define NID_id_aca_encAttrs 399 +#define OBJ_id_aca_encAttrs OBJ_id_aca,6L + +#define SN_id_qcs_pkixQCSyntax_v1 "id-qcs-pkixQCSyntax-v1" +#define NID_id_qcs_pkixQCSyntax_v1 359 +#define OBJ_id_qcs_pkixQCSyntax_v1 OBJ_id_qcs,1L + +#define SN_ipAddr_asNumber "ipAddr-asNumber" +#define NID_ipAddr_asNumber 1241 +#define OBJ_ipAddr_asNumber OBJ_id_cp,2L + +#define SN_ipAddr_asNumberv2 "ipAddr-asNumberv2" +#define NID_ipAddr_asNumberv2 1242 +#define OBJ_ipAddr_asNumberv2 OBJ_id_cp,3L + +#define SN_id_cct_crs "id-cct-crs" +#define NID_id_cct_crs 360 +#define OBJ_id_cct_crs OBJ_id_cct,1L + +#define SN_id_cct_PKIData "id-cct-PKIData" +#define NID_id_cct_PKIData 361 +#define OBJ_id_cct_PKIData OBJ_id_cct,2L + +#define SN_id_cct_PKIResponse "id-cct-PKIResponse" +#define NID_id_cct_PKIResponse 362 +#define OBJ_id_cct_PKIResponse OBJ_id_cct,3L + +#define SN_id_ppl_anyLanguage "id-ppl-anyLanguage" +#define LN_id_ppl_anyLanguage "Any language" +#define NID_id_ppl_anyLanguage 664 +#define OBJ_id_ppl_anyLanguage OBJ_id_ppl,0L + +#define SN_id_ppl_inheritAll "id-ppl-inheritAll" +#define LN_id_ppl_inheritAll "Inherit all" +#define NID_id_ppl_inheritAll 665 +#define OBJ_id_ppl_inheritAll OBJ_id_ppl,1L + +#define SN_Independent "id-ppl-independent" +#define LN_Independent "Independent" +#define NID_Independent 667 +#define OBJ_Independent OBJ_id_ppl,2L + +#define SN_ad_OCSP "OCSP" +#define LN_ad_OCSP "OCSP" +#define NID_ad_OCSP 178 +#define OBJ_ad_OCSP OBJ_id_ad,1L + +#define SN_ad_ca_issuers "caIssuers" +#define LN_ad_ca_issuers "CA Issuers" +#define NID_ad_ca_issuers 179 +#define OBJ_ad_ca_issuers OBJ_id_ad,2L + +#define SN_ad_timeStamping "ad_timestamping" +#define LN_ad_timeStamping "AD Time Stamping" +#define NID_ad_timeStamping 363 +#define OBJ_ad_timeStamping OBJ_id_ad,3L + +#define SN_ad_dvcs "AD_DVCS" +#define LN_ad_dvcs "ad dvcs" +#define NID_ad_dvcs 364 +#define OBJ_ad_dvcs OBJ_id_ad,4L + +#define SN_caRepository "caRepository" +#define LN_caRepository "CA Repository" +#define NID_caRepository 785 +#define OBJ_caRepository OBJ_id_ad,5L + +#define SN_rpkiManifest "rpkiManifest" +#define LN_rpkiManifest "RPKI Manifest" +#define NID_rpkiManifest 1243 +#define OBJ_rpkiManifest OBJ_id_ad,10L + +#define SN_signedObject "signedObject" +#define LN_signedObject "Signed Object" +#define NID_signedObject 1244 +#define OBJ_signedObject OBJ_id_ad,11L + +#define SN_rpkiNotify "rpkiNotify" +#define LN_rpkiNotify "RPKI Notify" +#define NID_rpkiNotify 1245 +#define OBJ_rpkiNotify OBJ_id_ad,13L + +#define OBJ_id_pkix_OCSP OBJ_ad_OCSP + +#define SN_id_pkix_OCSP_basic "basicOCSPResponse" +#define LN_id_pkix_OCSP_basic "Basic OCSP Response" +#define NID_id_pkix_OCSP_basic 365 +#define OBJ_id_pkix_OCSP_basic OBJ_id_pkix_OCSP,1L + +#define SN_id_pkix_OCSP_Nonce "Nonce" +#define LN_id_pkix_OCSP_Nonce "OCSP Nonce" +#define NID_id_pkix_OCSP_Nonce 366 +#define OBJ_id_pkix_OCSP_Nonce OBJ_id_pkix_OCSP,2L + +#define SN_id_pkix_OCSP_CrlID "CrlID" +#define LN_id_pkix_OCSP_CrlID "OCSP CRL ID" +#define NID_id_pkix_OCSP_CrlID 367 +#define OBJ_id_pkix_OCSP_CrlID OBJ_id_pkix_OCSP,3L + +#define SN_id_pkix_OCSP_acceptableResponses "acceptableResponses" +#define LN_id_pkix_OCSP_acceptableResponses "Acceptable OCSP Responses" +#define NID_id_pkix_OCSP_acceptableResponses 368 +#define OBJ_id_pkix_OCSP_acceptableResponses OBJ_id_pkix_OCSP,4L + +#define SN_id_pkix_OCSP_noCheck "noCheck" +#define LN_id_pkix_OCSP_noCheck "OCSP No Check" +#define NID_id_pkix_OCSP_noCheck 369 +#define OBJ_id_pkix_OCSP_noCheck OBJ_id_pkix_OCSP,5L + +#define SN_id_pkix_OCSP_archiveCutoff "archiveCutoff" +#define LN_id_pkix_OCSP_archiveCutoff "OCSP Archive Cutoff" +#define NID_id_pkix_OCSP_archiveCutoff 370 +#define OBJ_id_pkix_OCSP_archiveCutoff OBJ_id_pkix_OCSP,6L + +#define SN_id_pkix_OCSP_serviceLocator "serviceLocator" +#define LN_id_pkix_OCSP_serviceLocator "OCSP Service Locator" +#define NID_id_pkix_OCSP_serviceLocator 371 +#define OBJ_id_pkix_OCSP_serviceLocator OBJ_id_pkix_OCSP,7L + +#define SN_id_pkix_OCSP_extendedStatus "extendedStatus" +#define LN_id_pkix_OCSP_extendedStatus "Extended OCSP Status" +#define NID_id_pkix_OCSP_extendedStatus 372 +#define OBJ_id_pkix_OCSP_extendedStatus OBJ_id_pkix_OCSP,8L + +#define SN_id_pkix_OCSP_valid "valid" +#define NID_id_pkix_OCSP_valid 373 +#define OBJ_id_pkix_OCSP_valid OBJ_id_pkix_OCSP,9L + +#define SN_id_pkix_OCSP_path "path" +#define NID_id_pkix_OCSP_path 374 +#define OBJ_id_pkix_OCSP_path OBJ_id_pkix_OCSP,10L + +#define SN_id_pkix_OCSP_trustRoot "trustRoot" +#define LN_id_pkix_OCSP_trustRoot "Trust Root" +#define NID_id_pkix_OCSP_trustRoot 375 +#define OBJ_id_pkix_OCSP_trustRoot OBJ_id_pkix_OCSP,11L + +#define SN_algorithm "algorithm" +#define LN_algorithm "algorithm" +#define NID_algorithm 376 +#define OBJ_algorithm 1L,3L,14L,3L,2L + +#define SN_md5WithRSA "RSA-NP-MD5" +#define LN_md5WithRSA "md5WithRSA" +#define NID_md5WithRSA 104 +#define OBJ_md5WithRSA OBJ_algorithm,3L + +#define SN_des_ecb "DES-ECB" +#define LN_des_ecb "des-ecb" +#define NID_des_ecb 29 +#define OBJ_des_ecb OBJ_algorithm,6L + +#define SN_des_cbc "DES-CBC" +#define LN_des_cbc "des-cbc" +#define NID_des_cbc 31 +#define OBJ_des_cbc OBJ_algorithm,7L + +#define SN_des_ofb64 "DES-OFB" +#define LN_des_ofb64 "des-ofb" +#define NID_des_ofb64 45 +#define OBJ_des_ofb64 OBJ_algorithm,8L + +#define SN_des_cfb64 "DES-CFB" +#define LN_des_cfb64 "des-cfb" +#define NID_des_cfb64 30 +#define OBJ_des_cfb64 OBJ_algorithm,9L + +#define SN_rsaSignature "rsaSignature" +#define NID_rsaSignature 377 +#define OBJ_rsaSignature OBJ_algorithm,11L + +#define SN_dsa_2 "DSA-old" +#define LN_dsa_2 "dsaEncryption-old" +#define NID_dsa_2 67 +#define OBJ_dsa_2 OBJ_algorithm,12L + +#define SN_dsaWithSHA "DSA-SHA" +#define LN_dsaWithSHA "dsaWithSHA" +#define NID_dsaWithSHA 66 +#define OBJ_dsaWithSHA OBJ_algorithm,13L + +#define SN_shaWithRSAEncryption "RSA-SHA" +#define LN_shaWithRSAEncryption "shaWithRSAEncryption" +#define NID_shaWithRSAEncryption 42 +#define OBJ_shaWithRSAEncryption OBJ_algorithm,15L + +#define SN_des_ede_ecb "DES-EDE" +#define LN_des_ede_ecb "des-ede" +#define NID_des_ede_ecb 32 +#define OBJ_des_ede_ecb OBJ_algorithm,17L + +#define SN_des_ede3_ecb "DES-EDE3" +#define LN_des_ede3_ecb "des-ede3" +#define NID_des_ede3_ecb 33 + +#define SN_des_ede_cbc "DES-EDE-CBC" +#define LN_des_ede_cbc "des-ede-cbc" +#define NID_des_ede_cbc 43 + +#define SN_des_ede_cfb64 "DES-EDE-CFB" +#define LN_des_ede_cfb64 "des-ede-cfb" +#define NID_des_ede_cfb64 60 + +#define SN_des_ede3_cfb64 "DES-EDE3-CFB" +#define LN_des_ede3_cfb64 "des-ede3-cfb" +#define NID_des_ede3_cfb64 61 + +#define SN_des_ede_ofb64 "DES-EDE-OFB" +#define LN_des_ede_ofb64 "des-ede-ofb" +#define NID_des_ede_ofb64 62 + +#define SN_des_ede3_ofb64 "DES-EDE3-OFB" +#define LN_des_ede3_ofb64 "des-ede3-ofb" +#define NID_des_ede3_ofb64 63 + +#define SN_desx_cbc "DESX-CBC" +#define LN_desx_cbc "desx-cbc" +#define NID_desx_cbc 80 + +#define SN_sha "SHA" +#define LN_sha "sha" +#define NID_sha 41 +#define OBJ_sha OBJ_algorithm,18L + +#define SN_sha1 "SHA1" +#define LN_sha1 "sha1" +#define NID_sha1 64 +#define OBJ_sha1 OBJ_algorithm,26L + +#define SN_dsaWithSHA1_2 "DSA-SHA1-old" +#define LN_dsaWithSHA1_2 "dsaWithSHA1-old" +#define NID_dsaWithSHA1_2 70 +#define OBJ_dsaWithSHA1_2 OBJ_algorithm,27L + +#define SN_sha1WithRSA "RSA-SHA1-2" +#define LN_sha1WithRSA "sha1WithRSA" +#define NID_sha1WithRSA 115 +#define OBJ_sha1WithRSA OBJ_algorithm,29L + +#define SN_ripemd160 "RIPEMD160" +#define LN_ripemd160 "ripemd160" +#define NID_ripemd160 117 +#define OBJ_ripemd160 1L,3L,36L,3L,2L,1L + +#define SN_ripemd160WithRSA "RSA-RIPEMD160" +#define LN_ripemd160WithRSA "ripemd160WithRSA" +#define NID_ripemd160WithRSA 119 +#define OBJ_ripemd160WithRSA 1L,3L,36L,3L,3L,1L,2L + +#define SN_blake2bmac "BLAKE2BMAC" +#define LN_blake2bmac "blake2bmac" +#define NID_blake2bmac 1201 +#define OBJ_blake2bmac 1L,3L,6L,1L,4L,1L,1722L,12L,2L,1L + +#define SN_blake2smac "BLAKE2SMAC" +#define LN_blake2smac "blake2smac" +#define NID_blake2smac 1202 +#define OBJ_blake2smac 1L,3L,6L,1L,4L,1L,1722L,12L,2L,2L + +#define SN_blake2b512 "BLAKE2b512" +#define LN_blake2b512 "blake2b512" +#define NID_blake2b512 1056 +#define OBJ_blake2b512 OBJ_blake2bmac,16L + +#define SN_blake2s256 "BLAKE2s256" +#define LN_blake2s256 "blake2s256" +#define NID_blake2s256 1057 +#define OBJ_blake2s256 OBJ_blake2smac,8L + +#define SN_sxnet "SXNetID" +#define LN_sxnet "Strong Extranet ID" +#define NID_sxnet 143 +#define OBJ_sxnet 1L,3L,101L,1L,4L,1L + +#define SN_X500 "X500" +#define LN_X500 "directory services (X.500)" +#define NID_X500 11 +#define OBJ_X500 2L,5L + +#define SN_X509 "X509" +#define NID_X509 12 +#define OBJ_X509 OBJ_X500,4L + +#define SN_commonName "CN" +#define LN_commonName "commonName" +#define NID_commonName 13 +#define OBJ_commonName OBJ_X509,3L + +#define SN_surname "SN" +#define LN_surname "surname" +#define NID_surname 100 +#define OBJ_surname OBJ_X509,4L + +#define LN_serialNumber "serialNumber" +#define NID_serialNumber 105 +#define OBJ_serialNumber OBJ_X509,5L + +#define SN_countryName "C" +#define LN_countryName "countryName" +#define NID_countryName 14 +#define OBJ_countryName OBJ_X509,6L + +#define SN_localityName "L" +#define LN_localityName "localityName" +#define NID_localityName 15 +#define OBJ_localityName OBJ_X509,7L + +#define SN_stateOrProvinceName "ST" +#define LN_stateOrProvinceName "stateOrProvinceName" +#define NID_stateOrProvinceName 16 +#define OBJ_stateOrProvinceName OBJ_X509,8L + +#define SN_streetAddress "street" +#define LN_streetAddress "streetAddress" +#define NID_streetAddress 660 +#define OBJ_streetAddress OBJ_X509,9L + +#define SN_organizationName "O" +#define LN_organizationName "organizationName" +#define NID_organizationName 17 +#define OBJ_organizationName OBJ_X509,10L + +#define SN_organizationalUnitName "OU" +#define LN_organizationalUnitName "organizationalUnitName" +#define NID_organizationalUnitName 18 +#define OBJ_organizationalUnitName OBJ_X509,11L + +#define SN_title "title" +#define LN_title "title" +#define NID_title 106 +#define OBJ_title OBJ_X509,12L + +#define LN_description "description" +#define NID_description 107 +#define OBJ_description OBJ_X509,13L + +#define LN_searchGuide "searchGuide" +#define NID_searchGuide 859 +#define OBJ_searchGuide OBJ_X509,14L + +#define LN_businessCategory "businessCategory" +#define NID_businessCategory 860 +#define OBJ_businessCategory OBJ_X509,15L + +#define LN_postalAddress "postalAddress" +#define NID_postalAddress 861 +#define OBJ_postalAddress OBJ_X509,16L + +#define LN_postalCode "postalCode" +#define NID_postalCode 661 +#define OBJ_postalCode OBJ_X509,17L + +#define LN_postOfficeBox "postOfficeBox" +#define NID_postOfficeBox 862 +#define OBJ_postOfficeBox OBJ_X509,18L + +#define LN_physicalDeliveryOfficeName "physicalDeliveryOfficeName" +#define NID_physicalDeliveryOfficeName 863 +#define OBJ_physicalDeliveryOfficeName OBJ_X509,19L + +#define LN_telephoneNumber "telephoneNumber" +#define NID_telephoneNumber 864 +#define OBJ_telephoneNumber OBJ_X509,20L + +#define LN_telexNumber "telexNumber" +#define NID_telexNumber 865 +#define OBJ_telexNumber OBJ_X509,21L + +#define LN_teletexTerminalIdentifier "teletexTerminalIdentifier" +#define NID_teletexTerminalIdentifier 866 +#define OBJ_teletexTerminalIdentifier OBJ_X509,22L + +#define LN_facsimileTelephoneNumber "facsimileTelephoneNumber" +#define NID_facsimileTelephoneNumber 867 +#define OBJ_facsimileTelephoneNumber OBJ_X509,23L + +#define LN_x121Address "x121Address" +#define NID_x121Address 868 +#define OBJ_x121Address OBJ_X509,24L + +#define LN_internationaliSDNNumber "internationaliSDNNumber" +#define NID_internationaliSDNNumber 869 +#define OBJ_internationaliSDNNumber OBJ_X509,25L + +#define LN_registeredAddress "registeredAddress" +#define NID_registeredAddress 870 +#define OBJ_registeredAddress OBJ_X509,26L + +#define LN_destinationIndicator "destinationIndicator" +#define NID_destinationIndicator 871 +#define OBJ_destinationIndicator OBJ_X509,27L + +#define LN_preferredDeliveryMethod "preferredDeliveryMethod" +#define NID_preferredDeliveryMethod 872 +#define OBJ_preferredDeliveryMethod OBJ_X509,28L + +#define LN_presentationAddress "presentationAddress" +#define NID_presentationAddress 873 +#define OBJ_presentationAddress OBJ_X509,29L + +#define LN_supportedApplicationContext "supportedApplicationContext" +#define NID_supportedApplicationContext 874 +#define OBJ_supportedApplicationContext OBJ_X509,30L + +#define SN_member "member" +#define NID_member 875 +#define OBJ_member OBJ_X509,31L + +#define SN_owner "owner" +#define NID_owner 876 +#define OBJ_owner OBJ_X509,32L + +#define LN_roleOccupant "roleOccupant" +#define NID_roleOccupant 877 +#define OBJ_roleOccupant OBJ_X509,33L + +#define SN_seeAlso "seeAlso" +#define NID_seeAlso 878 +#define OBJ_seeAlso OBJ_X509,34L + +#define LN_userPassword "userPassword" +#define NID_userPassword 879 +#define OBJ_userPassword OBJ_X509,35L + +#define LN_userCertificate "userCertificate" +#define NID_userCertificate 880 +#define OBJ_userCertificate OBJ_X509,36L + +#define LN_cACertificate "cACertificate" +#define NID_cACertificate 881 +#define OBJ_cACertificate OBJ_X509,37L + +#define LN_authorityRevocationList "authorityRevocationList" +#define NID_authorityRevocationList 882 +#define OBJ_authorityRevocationList OBJ_X509,38L + +#define LN_certificateRevocationList "certificateRevocationList" +#define NID_certificateRevocationList 883 +#define OBJ_certificateRevocationList OBJ_X509,39L + +#define LN_crossCertificatePair "crossCertificatePair" +#define NID_crossCertificatePair 884 +#define OBJ_crossCertificatePair OBJ_X509,40L + +#define SN_name "name" +#define LN_name "name" +#define NID_name 173 +#define OBJ_name OBJ_X509,41L + +#define SN_givenName "GN" +#define LN_givenName "givenName" +#define NID_givenName 99 +#define OBJ_givenName OBJ_X509,42L + +#define SN_initials "initials" +#define LN_initials "initials" +#define NID_initials 101 +#define OBJ_initials OBJ_X509,43L + +#define LN_generationQualifier "generationQualifier" +#define NID_generationQualifier 509 +#define OBJ_generationQualifier OBJ_X509,44L + +#define LN_x500UniqueIdentifier "x500UniqueIdentifier" +#define NID_x500UniqueIdentifier 503 +#define OBJ_x500UniqueIdentifier OBJ_X509,45L + +#define SN_dnQualifier "dnQualifier" +#define LN_dnQualifier "dnQualifier" +#define NID_dnQualifier 174 +#define OBJ_dnQualifier OBJ_X509,46L + +#define LN_enhancedSearchGuide "enhancedSearchGuide" +#define NID_enhancedSearchGuide 885 +#define OBJ_enhancedSearchGuide OBJ_X509,47L + +#define LN_protocolInformation "protocolInformation" +#define NID_protocolInformation 886 +#define OBJ_protocolInformation OBJ_X509,48L + +#define LN_distinguishedName "distinguishedName" +#define NID_distinguishedName 887 +#define OBJ_distinguishedName OBJ_X509,49L + +#define LN_uniqueMember "uniqueMember" +#define NID_uniqueMember 888 +#define OBJ_uniqueMember OBJ_X509,50L + +#define LN_houseIdentifier "houseIdentifier" +#define NID_houseIdentifier 889 +#define OBJ_houseIdentifier OBJ_X509,51L + +#define LN_supportedAlgorithms "supportedAlgorithms" +#define NID_supportedAlgorithms 890 +#define OBJ_supportedAlgorithms OBJ_X509,52L + +#define LN_deltaRevocationList "deltaRevocationList" +#define NID_deltaRevocationList 891 +#define OBJ_deltaRevocationList OBJ_X509,53L + +#define SN_dmdName "dmdName" +#define NID_dmdName 892 +#define OBJ_dmdName OBJ_X509,54L + +#define LN_pseudonym "pseudonym" +#define NID_pseudonym 510 +#define OBJ_pseudonym OBJ_X509,65L + +#define SN_role "role" +#define LN_role "role" +#define NID_role 400 +#define OBJ_role OBJ_X509,72L + +#define LN_organizationIdentifier "organizationIdentifier" +#define NID_organizationIdentifier 1089 +#define OBJ_organizationIdentifier OBJ_X509,97L + +#define SN_countryCode3c "c3" +#define LN_countryCode3c "countryCode3c" +#define NID_countryCode3c 1090 +#define OBJ_countryCode3c OBJ_X509,98L + +#define SN_countryCode3n "n3" +#define LN_countryCode3n "countryCode3n" +#define NID_countryCode3n 1091 +#define OBJ_countryCode3n OBJ_X509,99L + +#define LN_dnsName "dnsName" +#define NID_dnsName 1092 +#define OBJ_dnsName OBJ_X509,100L + +#define SN_X500algorithms "X500algorithms" +#define LN_X500algorithms "directory services - algorithms" +#define NID_X500algorithms 378 +#define OBJ_X500algorithms OBJ_X500,8L + +#define SN_rsa "RSA" +#define LN_rsa "rsa" +#define NID_rsa 19 +#define OBJ_rsa OBJ_X500algorithms,1L,1L + +#define SN_mdc2WithRSA "RSA-MDC2" +#define LN_mdc2WithRSA "mdc2WithRSA" +#define NID_mdc2WithRSA 96 +#define OBJ_mdc2WithRSA OBJ_X500algorithms,3L,100L + +#define SN_mdc2 "MDC2" +#define LN_mdc2 "mdc2" +#define NID_mdc2 95 +#define OBJ_mdc2 OBJ_X500algorithms,3L,101L + +#define SN_id_ce "id-ce" +#define NID_id_ce 81 +#define OBJ_id_ce OBJ_X500,29L + +#define SN_subject_directory_attributes "subjectDirectoryAttributes" +#define LN_subject_directory_attributes "X509v3 Subject Directory Attributes" +#define NID_subject_directory_attributes 769 +#define OBJ_subject_directory_attributes OBJ_id_ce,9L + +#define SN_subject_key_identifier "subjectKeyIdentifier" +#define LN_subject_key_identifier "X509v3 Subject Key Identifier" +#define NID_subject_key_identifier 82 +#define OBJ_subject_key_identifier OBJ_id_ce,14L + +#define SN_key_usage "keyUsage" +#define LN_key_usage "X509v3 Key Usage" +#define NID_key_usage 83 +#define OBJ_key_usage OBJ_id_ce,15L + +#define SN_private_key_usage_period "privateKeyUsagePeriod" +#define LN_private_key_usage_period "X509v3 Private Key Usage Period" +#define NID_private_key_usage_period 84 +#define OBJ_private_key_usage_period OBJ_id_ce,16L + +#define SN_subject_alt_name "subjectAltName" +#define LN_subject_alt_name "X509v3 Subject Alternative Name" +#define NID_subject_alt_name 85 +#define OBJ_subject_alt_name OBJ_id_ce,17L + +#define SN_issuer_alt_name "issuerAltName" +#define LN_issuer_alt_name "X509v3 Issuer Alternative Name" +#define NID_issuer_alt_name 86 +#define OBJ_issuer_alt_name OBJ_id_ce,18L + +#define SN_basic_constraints "basicConstraints" +#define LN_basic_constraints "X509v3 Basic Constraints" +#define NID_basic_constraints 87 +#define OBJ_basic_constraints OBJ_id_ce,19L + +#define SN_crl_number "crlNumber" +#define LN_crl_number "X509v3 CRL Number" +#define NID_crl_number 88 +#define OBJ_crl_number OBJ_id_ce,20L + +#define SN_crl_reason "CRLReason" +#define LN_crl_reason "X509v3 CRL Reason Code" +#define NID_crl_reason 141 +#define OBJ_crl_reason OBJ_id_ce,21L + +#define SN_invalidity_date "invalidityDate" +#define LN_invalidity_date "Invalidity Date" +#define NID_invalidity_date 142 +#define OBJ_invalidity_date OBJ_id_ce,24L + +#define SN_delta_crl "deltaCRL" +#define LN_delta_crl "X509v3 Delta CRL Indicator" +#define NID_delta_crl 140 +#define OBJ_delta_crl OBJ_id_ce,27L + +#define SN_issuing_distribution_point "issuingDistributionPoint" +#define LN_issuing_distribution_point "X509v3 Issuing Distribution Point" +#define NID_issuing_distribution_point 770 +#define OBJ_issuing_distribution_point OBJ_id_ce,28L + +#define SN_certificate_issuer "certificateIssuer" +#define LN_certificate_issuer "X509v3 Certificate Issuer" +#define NID_certificate_issuer 771 +#define OBJ_certificate_issuer OBJ_id_ce,29L + +#define SN_name_constraints "nameConstraints" +#define LN_name_constraints "X509v3 Name Constraints" +#define NID_name_constraints 666 +#define OBJ_name_constraints OBJ_id_ce,30L + +#define SN_crl_distribution_points "crlDistributionPoints" +#define LN_crl_distribution_points "X509v3 CRL Distribution Points" +#define NID_crl_distribution_points 103 +#define OBJ_crl_distribution_points OBJ_id_ce,31L + +#define SN_certificate_policies "certificatePolicies" +#define LN_certificate_policies "X509v3 Certificate Policies" +#define NID_certificate_policies 89 +#define OBJ_certificate_policies OBJ_id_ce,32L + +#define SN_any_policy "anyPolicy" +#define LN_any_policy "X509v3 Any Policy" +#define NID_any_policy 746 +#define OBJ_any_policy OBJ_certificate_policies,0L + +#define SN_policy_mappings "policyMappings" +#define LN_policy_mappings "X509v3 Policy Mappings" +#define NID_policy_mappings 747 +#define OBJ_policy_mappings OBJ_id_ce,33L + +#define SN_authority_key_identifier "authorityKeyIdentifier" +#define LN_authority_key_identifier "X509v3 Authority Key Identifier" +#define NID_authority_key_identifier 90 +#define OBJ_authority_key_identifier OBJ_id_ce,35L + +#define SN_policy_constraints "policyConstraints" +#define LN_policy_constraints "X509v3 Policy Constraints" +#define NID_policy_constraints 401 +#define OBJ_policy_constraints OBJ_id_ce,36L + +#define SN_ext_key_usage "extendedKeyUsage" +#define LN_ext_key_usage "X509v3 Extended Key Usage" +#define NID_ext_key_usage 126 +#define OBJ_ext_key_usage OBJ_id_ce,37L + +#define SN_freshest_crl "freshestCRL" +#define LN_freshest_crl "X509v3 Freshest CRL" +#define NID_freshest_crl 857 +#define OBJ_freshest_crl OBJ_id_ce,46L + +#define SN_inhibit_any_policy "inhibitAnyPolicy" +#define LN_inhibit_any_policy "X509v3 Inhibit Any Policy" +#define NID_inhibit_any_policy 748 +#define OBJ_inhibit_any_policy OBJ_id_ce,54L + +#define SN_target_information "targetInformation" +#define LN_target_information "X509v3 AC Targeting" +#define NID_target_information 402 +#define OBJ_target_information OBJ_id_ce,55L + +#define SN_no_rev_avail "noRevAvail" +#define LN_no_rev_avail "X509v3 No Revocation Available" +#define NID_no_rev_avail 403 +#define OBJ_no_rev_avail OBJ_id_ce,56L + +#define SN_anyExtendedKeyUsage "anyExtendedKeyUsage" +#define LN_anyExtendedKeyUsage "Any Extended Key Usage" +#define NID_anyExtendedKeyUsage 910 +#define OBJ_anyExtendedKeyUsage OBJ_ext_key_usage,0L + +#define SN_netscape "Netscape" +#define LN_netscape "Netscape Communications Corp." +#define NID_netscape 57 +#define OBJ_netscape 2L,16L,840L,1L,113730L + +#define SN_netscape_cert_extension "nsCertExt" +#define LN_netscape_cert_extension "Netscape Certificate Extension" +#define NID_netscape_cert_extension 58 +#define OBJ_netscape_cert_extension OBJ_netscape,1L + +#define SN_netscape_data_type "nsDataType" +#define LN_netscape_data_type "Netscape Data Type" +#define NID_netscape_data_type 59 +#define OBJ_netscape_data_type OBJ_netscape,2L + +#define SN_netscape_cert_type "nsCertType" +#define LN_netscape_cert_type "Netscape Cert Type" +#define NID_netscape_cert_type 71 +#define OBJ_netscape_cert_type OBJ_netscape_cert_extension,1L + +#define SN_netscape_base_url "nsBaseUrl" +#define LN_netscape_base_url "Netscape Base Url" +#define NID_netscape_base_url 72 +#define OBJ_netscape_base_url OBJ_netscape_cert_extension,2L + +#define SN_netscape_revocation_url "nsRevocationUrl" +#define LN_netscape_revocation_url "Netscape Revocation Url" +#define NID_netscape_revocation_url 73 +#define OBJ_netscape_revocation_url OBJ_netscape_cert_extension,3L + +#define SN_netscape_ca_revocation_url "nsCaRevocationUrl" +#define LN_netscape_ca_revocation_url "Netscape CA Revocation Url" +#define NID_netscape_ca_revocation_url 74 +#define OBJ_netscape_ca_revocation_url OBJ_netscape_cert_extension,4L + +#define SN_netscape_renewal_url "nsRenewalUrl" +#define LN_netscape_renewal_url "Netscape Renewal Url" +#define NID_netscape_renewal_url 75 +#define OBJ_netscape_renewal_url OBJ_netscape_cert_extension,7L + +#define SN_netscape_ca_policy_url "nsCaPolicyUrl" +#define LN_netscape_ca_policy_url "Netscape CA Policy Url" +#define NID_netscape_ca_policy_url 76 +#define OBJ_netscape_ca_policy_url OBJ_netscape_cert_extension,8L + +#define SN_netscape_ssl_server_name "nsSslServerName" +#define LN_netscape_ssl_server_name "Netscape SSL Server Name" +#define NID_netscape_ssl_server_name 77 +#define OBJ_netscape_ssl_server_name OBJ_netscape_cert_extension,12L + +#define SN_netscape_comment "nsComment" +#define LN_netscape_comment "Netscape Comment" +#define NID_netscape_comment 78 +#define OBJ_netscape_comment OBJ_netscape_cert_extension,13L + +#define SN_netscape_cert_sequence "nsCertSequence" +#define LN_netscape_cert_sequence "Netscape Certificate Sequence" +#define NID_netscape_cert_sequence 79 +#define OBJ_netscape_cert_sequence OBJ_netscape_data_type,5L + +#define SN_ns_sgc "nsSGC" +#define LN_ns_sgc "Netscape Server Gated Crypto" +#define NID_ns_sgc 139 +#define OBJ_ns_sgc OBJ_netscape,4L,1L + +#define SN_org "ORG" +#define LN_org "org" +#define NID_org 379 +#define OBJ_org OBJ_iso,3L + +#define SN_dod "DOD" +#define LN_dod "dod" +#define NID_dod 380 +#define OBJ_dod OBJ_org,6L + +#define SN_iana "IANA" +#define LN_iana "iana" +#define NID_iana 381 +#define OBJ_iana OBJ_dod,1L + +#define OBJ_internet OBJ_iana + +#define SN_Directory "directory" +#define LN_Directory "Directory" +#define NID_Directory 382 +#define OBJ_Directory OBJ_internet,1L + +#define SN_Management "mgmt" +#define LN_Management "Management" +#define NID_Management 383 +#define OBJ_Management OBJ_internet,2L + +#define SN_Experimental "experimental" +#define LN_Experimental "Experimental" +#define NID_Experimental 384 +#define OBJ_Experimental OBJ_internet,3L + +#define SN_Private "private" +#define LN_Private "Private" +#define NID_Private 385 +#define OBJ_Private OBJ_internet,4L + +#define SN_Security "security" +#define LN_Security "Security" +#define NID_Security 386 +#define OBJ_Security OBJ_internet,5L + +#define SN_SNMPv2 "snmpv2" +#define LN_SNMPv2 "SNMPv2" +#define NID_SNMPv2 387 +#define OBJ_SNMPv2 OBJ_internet,6L + +#define LN_Mail "Mail" +#define NID_Mail 388 +#define OBJ_Mail OBJ_internet,7L + +#define SN_Enterprises "enterprises" +#define LN_Enterprises "Enterprises" +#define NID_Enterprises 389 +#define OBJ_Enterprises OBJ_Private,1L + +#define SN_dcObject "dcobject" +#define LN_dcObject "dcObject" +#define NID_dcObject 390 +#define OBJ_dcObject OBJ_Enterprises,1466L,344L + +#define SN_mime_mhs "mime-mhs" +#define LN_mime_mhs "MIME MHS" +#define NID_mime_mhs 504 +#define OBJ_mime_mhs OBJ_Mail,1L + +#define SN_mime_mhs_headings "mime-mhs-headings" +#define LN_mime_mhs_headings "mime-mhs-headings" +#define NID_mime_mhs_headings 505 +#define OBJ_mime_mhs_headings OBJ_mime_mhs,1L + +#define SN_mime_mhs_bodies "mime-mhs-bodies" +#define LN_mime_mhs_bodies "mime-mhs-bodies" +#define NID_mime_mhs_bodies 506 +#define OBJ_mime_mhs_bodies OBJ_mime_mhs,2L + +#define SN_id_hex_partial_message "id-hex-partial-message" +#define LN_id_hex_partial_message "id-hex-partial-message" +#define NID_id_hex_partial_message 507 +#define OBJ_id_hex_partial_message OBJ_mime_mhs_headings,1L + +#define SN_id_hex_multipart_message "id-hex-multipart-message" +#define LN_id_hex_multipart_message "id-hex-multipart-message" +#define NID_id_hex_multipart_message 508 +#define OBJ_id_hex_multipart_message OBJ_mime_mhs_headings,2L + +#define SN_zlib_compression "ZLIB" +#define LN_zlib_compression "zlib compression" +#define NID_zlib_compression 125 +#define OBJ_zlib_compression OBJ_id_smime_alg,8L + +#define OBJ_csor 2L,16L,840L,1L,101L,3L + +#define OBJ_nistAlgorithms OBJ_csor,4L + +#define OBJ_aes OBJ_nistAlgorithms,1L + +#define SN_aes_128_ecb "AES-128-ECB" +#define LN_aes_128_ecb "aes-128-ecb" +#define NID_aes_128_ecb 418 +#define OBJ_aes_128_ecb OBJ_aes,1L + +#define SN_aes_128_cbc "AES-128-CBC" +#define LN_aes_128_cbc "aes-128-cbc" +#define NID_aes_128_cbc 419 +#define OBJ_aes_128_cbc OBJ_aes,2L + +#define SN_aes_128_ofb128 "AES-128-OFB" +#define LN_aes_128_ofb128 "aes-128-ofb" +#define NID_aes_128_ofb128 420 +#define OBJ_aes_128_ofb128 OBJ_aes,3L + +#define SN_aes_128_cfb128 "AES-128-CFB" +#define LN_aes_128_cfb128 "aes-128-cfb" +#define NID_aes_128_cfb128 421 +#define OBJ_aes_128_cfb128 OBJ_aes,4L + +#define SN_id_aes128_wrap "id-aes128-wrap" +#define NID_id_aes128_wrap 788 +#define OBJ_id_aes128_wrap OBJ_aes,5L + +#define SN_aes_128_gcm "id-aes128-GCM" +#define LN_aes_128_gcm "aes-128-gcm" +#define NID_aes_128_gcm 895 +#define OBJ_aes_128_gcm OBJ_aes,6L + +#define SN_aes_128_ccm "id-aes128-CCM" +#define LN_aes_128_ccm "aes-128-ccm" +#define NID_aes_128_ccm 896 +#define OBJ_aes_128_ccm OBJ_aes,7L + +#define SN_id_aes128_wrap_pad "id-aes128-wrap-pad" +#define NID_id_aes128_wrap_pad 897 +#define OBJ_id_aes128_wrap_pad OBJ_aes,8L + +#define SN_aes_192_ecb "AES-192-ECB" +#define LN_aes_192_ecb "aes-192-ecb" +#define NID_aes_192_ecb 422 +#define OBJ_aes_192_ecb OBJ_aes,21L + +#define SN_aes_192_cbc "AES-192-CBC" +#define LN_aes_192_cbc "aes-192-cbc" +#define NID_aes_192_cbc 423 +#define OBJ_aes_192_cbc OBJ_aes,22L + +#define SN_aes_192_ofb128 "AES-192-OFB" +#define LN_aes_192_ofb128 "aes-192-ofb" +#define NID_aes_192_ofb128 424 +#define OBJ_aes_192_ofb128 OBJ_aes,23L + +#define SN_aes_192_cfb128 "AES-192-CFB" +#define LN_aes_192_cfb128 "aes-192-cfb" +#define NID_aes_192_cfb128 425 +#define OBJ_aes_192_cfb128 OBJ_aes,24L + +#define SN_id_aes192_wrap "id-aes192-wrap" +#define NID_id_aes192_wrap 789 +#define OBJ_id_aes192_wrap OBJ_aes,25L + +#define SN_aes_192_gcm "id-aes192-GCM" +#define LN_aes_192_gcm "aes-192-gcm" +#define NID_aes_192_gcm 898 +#define OBJ_aes_192_gcm OBJ_aes,26L + +#define SN_aes_192_ccm "id-aes192-CCM" +#define LN_aes_192_ccm "aes-192-ccm" +#define NID_aes_192_ccm 899 +#define OBJ_aes_192_ccm OBJ_aes,27L + +#define SN_id_aes192_wrap_pad "id-aes192-wrap-pad" +#define NID_id_aes192_wrap_pad 900 +#define OBJ_id_aes192_wrap_pad OBJ_aes,28L + +#define SN_aes_256_ecb "AES-256-ECB" +#define LN_aes_256_ecb "aes-256-ecb" +#define NID_aes_256_ecb 426 +#define OBJ_aes_256_ecb OBJ_aes,41L + +#define SN_aes_256_cbc "AES-256-CBC" +#define LN_aes_256_cbc "aes-256-cbc" +#define NID_aes_256_cbc 427 +#define OBJ_aes_256_cbc OBJ_aes,42L + +#define SN_aes_256_ofb128 "AES-256-OFB" +#define LN_aes_256_ofb128 "aes-256-ofb" +#define NID_aes_256_ofb128 428 +#define OBJ_aes_256_ofb128 OBJ_aes,43L + +#define SN_aes_256_cfb128 "AES-256-CFB" +#define LN_aes_256_cfb128 "aes-256-cfb" +#define NID_aes_256_cfb128 429 +#define OBJ_aes_256_cfb128 OBJ_aes,44L + +#define SN_id_aes256_wrap "id-aes256-wrap" +#define NID_id_aes256_wrap 790 +#define OBJ_id_aes256_wrap OBJ_aes,45L + +#define SN_aes_256_gcm "id-aes256-GCM" +#define LN_aes_256_gcm "aes-256-gcm" +#define NID_aes_256_gcm 901 +#define OBJ_aes_256_gcm OBJ_aes,46L + +#define SN_aes_256_ccm "id-aes256-CCM" +#define LN_aes_256_ccm "aes-256-ccm" +#define NID_aes_256_ccm 902 +#define OBJ_aes_256_ccm OBJ_aes,47L + +#define SN_id_aes256_wrap_pad "id-aes256-wrap-pad" +#define NID_id_aes256_wrap_pad 903 +#define OBJ_id_aes256_wrap_pad OBJ_aes,48L + +#define SN_aes_128_xts "AES-128-XTS" +#define LN_aes_128_xts "aes-128-xts" +#define NID_aes_128_xts 913 +#define OBJ_aes_128_xts OBJ_ieee_siswg,0L,1L,1L + +#define SN_aes_256_xts "AES-256-XTS" +#define LN_aes_256_xts "aes-256-xts" +#define NID_aes_256_xts 914 +#define OBJ_aes_256_xts OBJ_ieee_siswg,0L,1L,2L + +#define SN_aes_128_cfb1 "AES-128-CFB1" +#define LN_aes_128_cfb1 "aes-128-cfb1" +#define NID_aes_128_cfb1 650 + +#define SN_aes_192_cfb1 "AES-192-CFB1" +#define LN_aes_192_cfb1 "aes-192-cfb1" +#define NID_aes_192_cfb1 651 + +#define SN_aes_256_cfb1 "AES-256-CFB1" +#define LN_aes_256_cfb1 "aes-256-cfb1" +#define NID_aes_256_cfb1 652 + +#define SN_aes_128_cfb8 "AES-128-CFB8" +#define LN_aes_128_cfb8 "aes-128-cfb8" +#define NID_aes_128_cfb8 653 + +#define SN_aes_192_cfb8 "AES-192-CFB8" +#define LN_aes_192_cfb8 "aes-192-cfb8" +#define NID_aes_192_cfb8 654 + +#define SN_aes_256_cfb8 "AES-256-CFB8" +#define LN_aes_256_cfb8 "aes-256-cfb8" +#define NID_aes_256_cfb8 655 + +#define SN_aes_128_ctr "AES-128-CTR" +#define LN_aes_128_ctr "aes-128-ctr" +#define NID_aes_128_ctr 904 + +#define SN_aes_192_ctr "AES-192-CTR" +#define LN_aes_192_ctr "aes-192-ctr" +#define NID_aes_192_ctr 905 + +#define SN_aes_256_ctr "AES-256-CTR" +#define LN_aes_256_ctr "aes-256-ctr" +#define NID_aes_256_ctr 906 + +#define SN_aes_128_ocb "AES-128-OCB" +#define LN_aes_128_ocb "aes-128-ocb" +#define NID_aes_128_ocb 958 + +#define SN_aes_192_ocb "AES-192-OCB" +#define LN_aes_192_ocb "aes-192-ocb" +#define NID_aes_192_ocb 959 + +#define SN_aes_256_ocb "AES-256-OCB" +#define LN_aes_256_ocb "aes-256-ocb" +#define NID_aes_256_ocb 960 + +#define SN_des_cfb1 "DES-CFB1" +#define LN_des_cfb1 "des-cfb1" +#define NID_des_cfb1 656 + +#define SN_des_cfb8 "DES-CFB8" +#define LN_des_cfb8 "des-cfb8" +#define NID_des_cfb8 657 + +#define SN_des_ede3_cfb1 "DES-EDE3-CFB1" +#define LN_des_ede3_cfb1 "des-ede3-cfb1" +#define NID_des_ede3_cfb1 658 + +#define SN_des_ede3_cfb8 "DES-EDE3-CFB8" +#define LN_des_ede3_cfb8 "des-ede3-cfb8" +#define NID_des_ede3_cfb8 659 + +#define OBJ_nist_hashalgs OBJ_nistAlgorithms,2L + +#define SN_sha256 "SHA256" +#define LN_sha256 "sha256" +#define NID_sha256 672 +#define OBJ_sha256 OBJ_nist_hashalgs,1L + +#define SN_sha384 "SHA384" +#define LN_sha384 "sha384" +#define NID_sha384 673 +#define OBJ_sha384 OBJ_nist_hashalgs,2L + +#define SN_sha512 "SHA512" +#define LN_sha512 "sha512" +#define NID_sha512 674 +#define OBJ_sha512 OBJ_nist_hashalgs,3L + +#define SN_sha224 "SHA224" +#define LN_sha224 "sha224" +#define NID_sha224 675 +#define OBJ_sha224 OBJ_nist_hashalgs,4L + +#define SN_sha512_224 "SHA512-224" +#define LN_sha512_224 "sha512-224" +#define NID_sha512_224 1094 +#define OBJ_sha512_224 OBJ_nist_hashalgs,5L + +#define SN_sha512_256 "SHA512-256" +#define LN_sha512_256 "sha512-256" +#define NID_sha512_256 1095 +#define OBJ_sha512_256 OBJ_nist_hashalgs,6L + +#define SN_sha3_224 "SHA3-224" +#define LN_sha3_224 "sha3-224" +#define NID_sha3_224 1096 +#define OBJ_sha3_224 OBJ_nist_hashalgs,7L + +#define SN_sha3_256 "SHA3-256" +#define LN_sha3_256 "sha3-256" +#define NID_sha3_256 1097 +#define OBJ_sha3_256 OBJ_nist_hashalgs,8L + +#define SN_sha3_384 "SHA3-384" +#define LN_sha3_384 "sha3-384" +#define NID_sha3_384 1098 +#define OBJ_sha3_384 OBJ_nist_hashalgs,9L + +#define SN_sha3_512 "SHA3-512" +#define LN_sha3_512 "sha3-512" +#define NID_sha3_512 1099 +#define OBJ_sha3_512 OBJ_nist_hashalgs,10L + +#define SN_shake128 "SHAKE128" +#define LN_shake128 "shake128" +#define NID_shake128 1100 +#define OBJ_shake128 OBJ_nist_hashalgs,11L + +#define SN_shake256 "SHAKE256" +#define LN_shake256 "shake256" +#define NID_shake256 1101 +#define OBJ_shake256 OBJ_nist_hashalgs,12L + +#define SN_hmac_sha3_224 "id-hmacWithSHA3-224" +#define LN_hmac_sha3_224 "hmac-sha3-224" +#define NID_hmac_sha3_224 1102 +#define OBJ_hmac_sha3_224 OBJ_nist_hashalgs,13L + +#define SN_hmac_sha3_256 "id-hmacWithSHA3-256" +#define LN_hmac_sha3_256 "hmac-sha3-256" +#define NID_hmac_sha3_256 1103 +#define OBJ_hmac_sha3_256 OBJ_nist_hashalgs,14L + +#define SN_hmac_sha3_384 "id-hmacWithSHA3-384" +#define LN_hmac_sha3_384 "hmac-sha3-384" +#define NID_hmac_sha3_384 1104 +#define OBJ_hmac_sha3_384 OBJ_nist_hashalgs,15L + +#define SN_hmac_sha3_512 "id-hmacWithSHA3-512" +#define LN_hmac_sha3_512 "hmac-sha3-512" +#define NID_hmac_sha3_512 1105 +#define OBJ_hmac_sha3_512 OBJ_nist_hashalgs,16L + +#define SN_kmac128 "KMAC128" +#define LN_kmac128 "kmac128" +#define NID_kmac128 1196 +#define OBJ_kmac128 OBJ_nist_hashalgs,19L + +#define SN_kmac256 "KMAC256" +#define LN_kmac256 "kmac256" +#define NID_kmac256 1197 +#define OBJ_kmac256 OBJ_nist_hashalgs,20L + +#define OBJ_dsa_with_sha2 OBJ_nistAlgorithms,3L + +#define SN_dsa_with_SHA224 "dsa_with_SHA224" +#define NID_dsa_with_SHA224 802 +#define OBJ_dsa_with_SHA224 OBJ_dsa_with_sha2,1L + +#define SN_dsa_with_SHA256 "dsa_with_SHA256" +#define NID_dsa_with_SHA256 803 +#define OBJ_dsa_with_SHA256 OBJ_dsa_with_sha2,2L + +#define OBJ_sigAlgs OBJ_nistAlgorithms,3L + +#define SN_dsa_with_SHA384 "id-dsa-with-sha384" +#define LN_dsa_with_SHA384 "dsa_with_SHA384" +#define NID_dsa_with_SHA384 1106 +#define OBJ_dsa_with_SHA384 OBJ_sigAlgs,3L + +#define SN_dsa_with_SHA512 "id-dsa-with-sha512" +#define LN_dsa_with_SHA512 "dsa_with_SHA512" +#define NID_dsa_with_SHA512 1107 +#define OBJ_dsa_with_SHA512 OBJ_sigAlgs,4L + +#define SN_dsa_with_SHA3_224 "id-dsa-with-sha3-224" +#define LN_dsa_with_SHA3_224 "dsa_with_SHA3-224" +#define NID_dsa_with_SHA3_224 1108 +#define OBJ_dsa_with_SHA3_224 OBJ_sigAlgs,5L + +#define SN_dsa_with_SHA3_256 "id-dsa-with-sha3-256" +#define LN_dsa_with_SHA3_256 "dsa_with_SHA3-256" +#define NID_dsa_with_SHA3_256 1109 +#define OBJ_dsa_with_SHA3_256 OBJ_sigAlgs,6L + +#define SN_dsa_with_SHA3_384 "id-dsa-with-sha3-384" +#define LN_dsa_with_SHA3_384 "dsa_with_SHA3-384" +#define NID_dsa_with_SHA3_384 1110 +#define OBJ_dsa_with_SHA3_384 OBJ_sigAlgs,7L + +#define SN_dsa_with_SHA3_512 "id-dsa-with-sha3-512" +#define LN_dsa_with_SHA3_512 "dsa_with_SHA3-512" +#define NID_dsa_with_SHA3_512 1111 +#define OBJ_dsa_with_SHA3_512 OBJ_sigAlgs,8L + +#define SN_ecdsa_with_SHA3_224 "id-ecdsa-with-sha3-224" +#define LN_ecdsa_with_SHA3_224 "ecdsa_with_SHA3-224" +#define NID_ecdsa_with_SHA3_224 1112 +#define OBJ_ecdsa_with_SHA3_224 OBJ_sigAlgs,9L + +#define SN_ecdsa_with_SHA3_256 "id-ecdsa-with-sha3-256" +#define LN_ecdsa_with_SHA3_256 "ecdsa_with_SHA3-256" +#define NID_ecdsa_with_SHA3_256 1113 +#define OBJ_ecdsa_with_SHA3_256 OBJ_sigAlgs,10L + +#define SN_ecdsa_with_SHA3_384 "id-ecdsa-with-sha3-384" +#define LN_ecdsa_with_SHA3_384 "ecdsa_with_SHA3-384" +#define NID_ecdsa_with_SHA3_384 1114 +#define OBJ_ecdsa_with_SHA3_384 OBJ_sigAlgs,11L + +#define SN_ecdsa_with_SHA3_512 "id-ecdsa-with-sha3-512" +#define LN_ecdsa_with_SHA3_512 "ecdsa_with_SHA3-512" +#define NID_ecdsa_with_SHA3_512 1115 +#define OBJ_ecdsa_with_SHA3_512 OBJ_sigAlgs,12L + +#define SN_RSA_SHA3_224 "id-rsassa-pkcs1-v1_5-with-sha3-224" +#define LN_RSA_SHA3_224 "RSA-SHA3-224" +#define NID_RSA_SHA3_224 1116 +#define OBJ_RSA_SHA3_224 OBJ_sigAlgs,13L + +#define SN_RSA_SHA3_256 "id-rsassa-pkcs1-v1_5-with-sha3-256" +#define LN_RSA_SHA3_256 "RSA-SHA3-256" +#define NID_RSA_SHA3_256 1117 +#define OBJ_RSA_SHA3_256 OBJ_sigAlgs,14L + +#define SN_RSA_SHA3_384 "id-rsassa-pkcs1-v1_5-with-sha3-384" +#define LN_RSA_SHA3_384 "RSA-SHA3-384" +#define NID_RSA_SHA3_384 1118 +#define OBJ_RSA_SHA3_384 OBJ_sigAlgs,15L + +#define SN_RSA_SHA3_512 "id-rsassa-pkcs1-v1_5-with-sha3-512" +#define LN_RSA_SHA3_512 "RSA-SHA3-512" +#define NID_RSA_SHA3_512 1119 +#define OBJ_RSA_SHA3_512 OBJ_sigAlgs,16L + +#define SN_hold_instruction_code "holdInstructionCode" +#define LN_hold_instruction_code "Hold Instruction Code" +#define NID_hold_instruction_code 430 +#define OBJ_hold_instruction_code OBJ_id_ce,23L + +#define OBJ_holdInstruction OBJ_X9_57,2L + +#define SN_hold_instruction_none "holdInstructionNone" +#define LN_hold_instruction_none "Hold Instruction None" +#define NID_hold_instruction_none 431 +#define OBJ_hold_instruction_none OBJ_holdInstruction,1L + +#define SN_hold_instruction_call_issuer "holdInstructionCallIssuer" +#define LN_hold_instruction_call_issuer "Hold Instruction Call Issuer" +#define NID_hold_instruction_call_issuer 432 +#define OBJ_hold_instruction_call_issuer OBJ_holdInstruction,2L + +#define SN_hold_instruction_reject "holdInstructionReject" +#define LN_hold_instruction_reject "Hold Instruction Reject" +#define NID_hold_instruction_reject 433 +#define OBJ_hold_instruction_reject OBJ_holdInstruction,3L + +#define SN_data "data" +#define NID_data 434 +#define OBJ_data OBJ_itu_t,9L + +#define SN_pss "pss" +#define NID_pss 435 +#define OBJ_pss OBJ_data,2342L + +#define SN_ucl "ucl" +#define NID_ucl 436 +#define OBJ_ucl OBJ_pss,19200300L + +#define SN_pilot "pilot" +#define NID_pilot 437 +#define OBJ_pilot OBJ_ucl,100L + +#define LN_pilotAttributeType "pilotAttributeType" +#define NID_pilotAttributeType 438 +#define OBJ_pilotAttributeType OBJ_pilot,1L + +#define LN_pilotAttributeSyntax "pilotAttributeSyntax" +#define NID_pilotAttributeSyntax 439 +#define OBJ_pilotAttributeSyntax OBJ_pilot,3L + +#define LN_pilotObjectClass "pilotObjectClass" +#define NID_pilotObjectClass 440 +#define OBJ_pilotObjectClass OBJ_pilot,4L + +#define LN_pilotGroups "pilotGroups" +#define NID_pilotGroups 441 +#define OBJ_pilotGroups OBJ_pilot,10L + +#define LN_iA5StringSyntax "iA5StringSyntax" +#define NID_iA5StringSyntax 442 +#define OBJ_iA5StringSyntax OBJ_pilotAttributeSyntax,4L + +#define LN_caseIgnoreIA5StringSyntax "caseIgnoreIA5StringSyntax" +#define NID_caseIgnoreIA5StringSyntax 443 +#define OBJ_caseIgnoreIA5StringSyntax OBJ_pilotAttributeSyntax,5L + +#define LN_pilotObject "pilotObject" +#define NID_pilotObject 444 +#define OBJ_pilotObject OBJ_pilotObjectClass,3L + +#define LN_pilotPerson "pilotPerson" +#define NID_pilotPerson 445 +#define OBJ_pilotPerson OBJ_pilotObjectClass,4L + +#define SN_account "account" +#define NID_account 446 +#define OBJ_account OBJ_pilotObjectClass,5L + +#define SN_document "document" +#define NID_document 447 +#define OBJ_document OBJ_pilotObjectClass,6L + +#define SN_room "room" +#define NID_room 448 +#define OBJ_room OBJ_pilotObjectClass,7L + +#define LN_documentSeries "documentSeries" +#define NID_documentSeries 449 +#define OBJ_documentSeries OBJ_pilotObjectClass,9L + +#define SN_Domain "domain" +#define LN_Domain "Domain" +#define NID_Domain 392 +#define OBJ_Domain OBJ_pilotObjectClass,13L + +#define LN_rFC822localPart "rFC822localPart" +#define NID_rFC822localPart 450 +#define OBJ_rFC822localPart OBJ_pilotObjectClass,14L + +#define LN_dNSDomain "dNSDomain" +#define NID_dNSDomain 451 +#define OBJ_dNSDomain OBJ_pilotObjectClass,15L + +#define LN_domainRelatedObject "domainRelatedObject" +#define NID_domainRelatedObject 452 +#define OBJ_domainRelatedObject OBJ_pilotObjectClass,17L + +#define LN_friendlyCountry "friendlyCountry" +#define NID_friendlyCountry 453 +#define OBJ_friendlyCountry OBJ_pilotObjectClass,18L + +#define LN_simpleSecurityObject "simpleSecurityObject" +#define NID_simpleSecurityObject 454 +#define OBJ_simpleSecurityObject OBJ_pilotObjectClass,19L + +#define LN_pilotOrganization "pilotOrganization" +#define NID_pilotOrganization 455 +#define OBJ_pilotOrganization OBJ_pilotObjectClass,20L + +#define LN_pilotDSA "pilotDSA" +#define NID_pilotDSA 456 +#define OBJ_pilotDSA OBJ_pilotObjectClass,21L + +#define LN_qualityLabelledData "qualityLabelledData" +#define NID_qualityLabelledData 457 +#define OBJ_qualityLabelledData OBJ_pilotObjectClass,22L + +#define SN_userId "UID" +#define LN_userId "userId" +#define NID_userId 458 +#define OBJ_userId OBJ_pilotAttributeType,1L + +#define LN_textEncodedORAddress "textEncodedORAddress" +#define NID_textEncodedORAddress 459 +#define OBJ_textEncodedORAddress OBJ_pilotAttributeType,2L + +#define SN_rfc822Mailbox "mail" +#define LN_rfc822Mailbox "rfc822Mailbox" +#define NID_rfc822Mailbox 460 +#define OBJ_rfc822Mailbox OBJ_pilotAttributeType,3L + +#define SN_info "info" +#define NID_info 461 +#define OBJ_info OBJ_pilotAttributeType,4L + +#define LN_favouriteDrink "favouriteDrink" +#define NID_favouriteDrink 462 +#define OBJ_favouriteDrink OBJ_pilotAttributeType,5L + +#define LN_roomNumber "roomNumber" +#define NID_roomNumber 463 +#define OBJ_roomNumber OBJ_pilotAttributeType,6L + +#define SN_photo "photo" +#define NID_photo 464 +#define OBJ_photo OBJ_pilotAttributeType,7L + +#define LN_userClass "userClass" +#define NID_userClass 465 +#define OBJ_userClass OBJ_pilotAttributeType,8L + +#define SN_host "host" +#define NID_host 466 +#define OBJ_host OBJ_pilotAttributeType,9L + +#define SN_manager "manager" +#define NID_manager 467 +#define OBJ_manager OBJ_pilotAttributeType,10L + +#define LN_documentIdentifier "documentIdentifier" +#define NID_documentIdentifier 468 +#define OBJ_documentIdentifier OBJ_pilotAttributeType,11L + +#define LN_documentTitle "documentTitle" +#define NID_documentTitle 469 +#define OBJ_documentTitle OBJ_pilotAttributeType,12L + +#define LN_documentVersion "documentVersion" +#define NID_documentVersion 470 +#define OBJ_documentVersion OBJ_pilotAttributeType,13L + +#define LN_documentAuthor "documentAuthor" +#define NID_documentAuthor 471 +#define OBJ_documentAuthor OBJ_pilotAttributeType,14L + +#define LN_documentLocation "documentLocation" +#define NID_documentLocation 472 +#define OBJ_documentLocation OBJ_pilotAttributeType,15L + +#define LN_homeTelephoneNumber "homeTelephoneNumber" +#define NID_homeTelephoneNumber 473 +#define OBJ_homeTelephoneNumber OBJ_pilotAttributeType,20L + +#define SN_secretary "secretary" +#define NID_secretary 474 +#define OBJ_secretary OBJ_pilotAttributeType,21L + +#define LN_otherMailbox "otherMailbox" +#define NID_otherMailbox 475 +#define OBJ_otherMailbox OBJ_pilotAttributeType,22L + +#define LN_lastModifiedTime "lastModifiedTime" +#define NID_lastModifiedTime 476 +#define OBJ_lastModifiedTime OBJ_pilotAttributeType,23L + +#define LN_lastModifiedBy "lastModifiedBy" +#define NID_lastModifiedBy 477 +#define OBJ_lastModifiedBy OBJ_pilotAttributeType,24L + +#define SN_domainComponent "DC" +#define LN_domainComponent "domainComponent" +#define NID_domainComponent 391 +#define OBJ_domainComponent OBJ_pilotAttributeType,25L + +#define LN_aRecord "aRecord" +#define NID_aRecord 478 +#define OBJ_aRecord OBJ_pilotAttributeType,26L + +#define LN_pilotAttributeType27 "pilotAttributeType27" +#define NID_pilotAttributeType27 479 +#define OBJ_pilotAttributeType27 OBJ_pilotAttributeType,27L + +#define LN_mXRecord "mXRecord" +#define NID_mXRecord 480 +#define OBJ_mXRecord OBJ_pilotAttributeType,28L + +#define LN_nSRecord "nSRecord" +#define NID_nSRecord 481 +#define OBJ_nSRecord OBJ_pilotAttributeType,29L + +#define LN_sOARecord "sOARecord" +#define NID_sOARecord 482 +#define OBJ_sOARecord OBJ_pilotAttributeType,30L + +#define LN_cNAMERecord "cNAMERecord" +#define NID_cNAMERecord 483 +#define OBJ_cNAMERecord OBJ_pilotAttributeType,31L + +#define LN_associatedDomain "associatedDomain" +#define NID_associatedDomain 484 +#define OBJ_associatedDomain OBJ_pilotAttributeType,37L + +#define LN_associatedName "associatedName" +#define NID_associatedName 485 +#define OBJ_associatedName OBJ_pilotAttributeType,38L + +#define LN_homePostalAddress "homePostalAddress" +#define NID_homePostalAddress 486 +#define OBJ_homePostalAddress OBJ_pilotAttributeType,39L + +#define LN_personalTitle "personalTitle" +#define NID_personalTitle 487 +#define OBJ_personalTitle OBJ_pilotAttributeType,40L + +#define LN_mobileTelephoneNumber "mobileTelephoneNumber" +#define NID_mobileTelephoneNumber 488 +#define OBJ_mobileTelephoneNumber OBJ_pilotAttributeType,41L + +#define LN_pagerTelephoneNumber "pagerTelephoneNumber" +#define NID_pagerTelephoneNumber 489 +#define OBJ_pagerTelephoneNumber OBJ_pilotAttributeType,42L + +#define LN_friendlyCountryName "friendlyCountryName" +#define NID_friendlyCountryName 490 +#define OBJ_friendlyCountryName OBJ_pilotAttributeType,43L + +#define SN_uniqueIdentifier "uid" +#define LN_uniqueIdentifier "uniqueIdentifier" +#define NID_uniqueIdentifier 102 +#define OBJ_uniqueIdentifier OBJ_pilotAttributeType,44L + +#define LN_organizationalStatus "organizationalStatus" +#define NID_organizationalStatus 491 +#define OBJ_organizationalStatus OBJ_pilotAttributeType,45L + +#define LN_janetMailbox "janetMailbox" +#define NID_janetMailbox 492 +#define OBJ_janetMailbox OBJ_pilotAttributeType,46L + +#define LN_mailPreferenceOption "mailPreferenceOption" +#define NID_mailPreferenceOption 493 +#define OBJ_mailPreferenceOption OBJ_pilotAttributeType,47L + +#define LN_buildingName "buildingName" +#define NID_buildingName 494 +#define OBJ_buildingName OBJ_pilotAttributeType,48L + +#define LN_dSAQuality "dSAQuality" +#define NID_dSAQuality 495 +#define OBJ_dSAQuality OBJ_pilotAttributeType,49L + +#define LN_singleLevelQuality "singleLevelQuality" +#define NID_singleLevelQuality 496 +#define OBJ_singleLevelQuality OBJ_pilotAttributeType,50L + +#define LN_subtreeMinimumQuality "subtreeMinimumQuality" +#define NID_subtreeMinimumQuality 497 +#define OBJ_subtreeMinimumQuality OBJ_pilotAttributeType,51L + +#define LN_subtreeMaximumQuality "subtreeMaximumQuality" +#define NID_subtreeMaximumQuality 498 +#define OBJ_subtreeMaximumQuality OBJ_pilotAttributeType,52L + +#define LN_personalSignature "personalSignature" +#define NID_personalSignature 499 +#define OBJ_personalSignature OBJ_pilotAttributeType,53L + +#define LN_dITRedirect "dITRedirect" +#define NID_dITRedirect 500 +#define OBJ_dITRedirect OBJ_pilotAttributeType,54L + +#define SN_audio "audio" +#define NID_audio 501 +#define OBJ_audio OBJ_pilotAttributeType,55L + +#define LN_documentPublisher "documentPublisher" +#define NID_documentPublisher 502 +#define OBJ_documentPublisher OBJ_pilotAttributeType,56L + +#define SN_id_set "id-set" +#define LN_id_set "Secure Electronic Transactions" +#define NID_id_set 512 +#define OBJ_id_set OBJ_international_organizations,42L + +#define SN_set_ctype "set-ctype" +#define LN_set_ctype "content types" +#define NID_set_ctype 513 +#define OBJ_set_ctype OBJ_id_set,0L + +#define SN_set_msgExt "set-msgExt" +#define LN_set_msgExt "message extensions" +#define NID_set_msgExt 514 +#define OBJ_set_msgExt OBJ_id_set,1L + +#define SN_set_attr "set-attr" +#define NID_set_attr 515 +#define OBJ_set_attr OBJ_id_set,3L + +#define SN_set_policy "set-policy" +#define NID_set_policy 516 +#define OBJ_set_policy OBJ_id_set,5L + +#define SN_set_certExt "set-certExt" +#define LN_set_certExt "certificate extensions" +#define NID_set_certExt 517 +#define OBJ_set_certExt OBJ_id_set,7L + +#define SN_set_brand "set-brand" +#define NID_set_brand 518 +#define OBJ_set_brand OBJ_id_set,8L + +#define SN_setct_PANData "setct-PANData" +#define NID_setct_PANData 519 +#define OBJ_setct_PANData OBJ_set_ctype,0L + +#define SN_setct_PANToken "setct-PANToken" +#define NID_setct_PANToken 520 +#define OBJ_setct_PANToken OBJ_set_ctype,1L + +#define SN_setct_PANOnly "setct-PANOnly" +#define NID_setct_PANOnly 521 +#define OBJ_setct_PANOnly OBJ_set_ctype,2L + +#define SN_setct_OIData "setct-OIData" +#define NID_setct_OIData 522 +#define OBJ_setct_OIData OBJ_set_ctype,3L + +#define SN_setct_PI "setct-PI" +#define NID_setct_PI 523 +#define OBJ_setct_PI OBJ_set_ctype,4L + +#define SN_setct_PIData "setct-PIData" +#define NID_setct_PIData 524 +#define OBJ_setct_PIData OBJ_set_ctype,5L + +#define SN_setct_PIDataUnsigned "setct-PIDataUnsigned" +#define NID_setct_PIDataUnsigned 525 +#define OBJ_setct_PIDataUnsigned OBJ_set_ctype,6L + +#define SN_setct_HODInput "setct-HODInput" +#define NID_setct_HODInput 526 +#define OBJ_setct_HODInput OBJ_set_ctype,7L + +#define SN_setct_AuthResBaggage "setct-AuthResBaggage" +#define NID_setct_AuthResBaggage 527 +#define OBJ_setct_AuthResBaggage OBJ_set_ctype,8L + +#define SN_setct_AuthRevReqBaggage "setct-AuthRevReqBaggage" +#define NID_setct_AuthRevReqBaggage 528 +#define OBJ_setct_AuthRevReqBaggage OBJ_set_ctype,9L + +#define SN_setct_AuthRevResBaggage "setct-AuthRevResBaggage" +#define NID_setct_AuthRevResBaggage 529 +#define OBJ_setct_AuthRevResBaggage OBJ_set_ctype,10L + +#define SN_setct_CapTokenSeq "setct-CapTokenSeq" +#define NID_setct_CapTokenSeq 530 +#define OBJ_setct_CapTokenSeq OBJ_set_ctype,11L + +#define SN_setct_PInitResData "setct-PInitResData" +#define NID_setct_PInitResData 531 +#define OBJ_setct_PInitResData OBJ_set_ctype,12L + +#define SN_setct_PI_TBS "setct-PI-TBS" +#define NID_setct_PI_TBS 532 +#define OBJ_setct_PI_TBS OBJ_set_ctype,13L + +#define SN_setct_PResData "setct-PResData" +#define NID_setct_PResData 533 +#define OBJ_setct_PResData OBJ_set_ctype,14L + +#define SN_setct_AuthReqTBS "setct-AuthReqTBS" +#define NID_setct_AuthReqTBS 534 +#define OBJ_setct_AuthReqTBS OBJ_set_ctype,16L + +#define SN_setct_AuthResTBS "setct-AuthResTBS" +#define NID_setct_AuthResTBS 535 +#define OBJ_setct_AuthResTBS OBJ_set_ctype,17L + +#define SN_setct_AuthResTBSX "setct-AuthResTBSX" +#define NID_setct_AuthResTBSX 536 +#define OBJ_setct_AuthResTBSX OBJ_set_ctype,18L + +#define SN_setct_AuthTokenTBS "setct-AuthTokenTBS" +#define NID_setct_AuthTokenTBS 537 +#define OBJ_setct_AuthTokenTBS OBJ_set_ctype,19L + +#define SN_setct_CapTokenData "setct-CapTokenData" +#define NID_setct_CapTokenData 538 +#define OBJ_setct_CapTokenData OBJ_set_ctype,20L + +#define SN_setct_CapTokenTBS "setct-CapTokenTBS" +#define NID_setct_CapTokenTBS 539 +#define OBJ_setct_CapTokenTBS OBJ_set_ctype,21L + +#define SN_setct_AcqCardCodeMsg "setct-AcqCardCodeMsg" +#define NID_setct_AcqCardCodeMsg 540 +#define OBJ_setct_AcqCardCodeMsg OBJ_set_ctype,22L + +#define SN_setct_AuthRevReqTBS "setct-AuthRevReqTBS" +#define NID_setct_AuthRevReqTBS 541 +#define OBJ_setct_AuthRevReqTBS OBJ_set_ctype,23L + +#define SN_setct_AuthRevResData "setct-AuthRevResData" +#define NID_setct_AuthRevResData 542 +#define OBJ_setct_AuthRevResData OBJ_set_ctype,24L + +#define SN_setct_AuthRevResTBS "setct-AuthRevResTBS" +#define NID_setct_AuthRevResTBS 543 +#define OBJ_setct_AuthRevResTBS OBJ_set_ctype,25L + +#define SN_setct_CapReqTBS "setct-CapReqTBS" +#define NID_setct_CapReqTBS 544 +#define OBJ_setct_CapReqTBS OBJ_set_ctype,26L + +#define SN_setct_CapReqTBSX "setct-CapReqTBSX" +#define NID_setct_CapReqTBSX 545 +#define OBJ_setct_CapReqTBSX OBJ_set_ctype,27L + +#define SN_setct_CapResData "setct-CapResData" +#define NID_setct_CapResData 546 +#define OBJ_setct_CapResData OBJ_set_ctype,28L + +#define SN_setct_CapRevReqTBS "setct-CapRevReqTBS" +#define NID_setct_CapRevReqTBS 547 +#define OBJ_setct_CapRevReqTBS OBJ_set_ctype,29L + +#define SN_setct_CapRevReqTBSX "setct-CapRevReqTBSX" +#define NID_setct_CapRevReqTBSX 548 +#define OBJ_setct_CapRevReqTBSX OBJ_set_ctype,30L + +#define SN_setct_CapRevResData "setct-CapRevResData" +#define NID_setct_CapRevResData 549 +#define OBJ_setct_CapRevResData OBJ_set_ctype,31L + +#define SN_setct_CredReqTBS "setct-CredReqTBS" +#define NID_setct_CredReqTBS 550 +#define OBJ_setct_CredReqTBS OBJ_set_ctype,32L + +#define SN_setct_CredReqTBSX "setct-CredReqTBSX" +#define NID_setct_CredReqTBSX 551 +#define OBJ_setct_CredReqTBSX OBJ_set_ctype,33L + +#define SN_setct_CredResData "setct-CredResData" +#define NID_setct_CredResData 552 +#define OBJ_setct_CredResData OBJ_set_ctype,34L + +#define SN_setct_CredRevReqTBS "setct-CredRevReqTBS" +#define NID_setct_CredRevReqTBS 553 +#define OBJ_setct_CredRevReqTBS OBJ_set_ctype,35L + +#define SN_setct_CredRevReqTBSX "setct-CredRevReqTBSX" +#define NID_setct_CredRevReqTBSX 554 +#define OBJ_setct_CredRevReqTBSX OBJ_set_ctype,36L + +#define SN_setct_CredRevResData "setct-CredRevResData" +#define NID_setct_CredRevResData 555 +#define OBJ_setct_CredRevResData OBJ_set_ctype,37L + +#define SN_setct_PCertReqData "setct-PCertReqData" +#define NID_setct_PCertReqData 556 +#define OBJ_setct_PCertReqData OBJ_set_ctype,38L + +#define SN_setct_PCertResTBS "setct-PCertResTBS" +#define NID_setct_PCertResTBS 557 +#define OBJ_setct_PCertResTBS OBJ_set_ctype,39L + +#define SN_setct_BatchAdminReqData "setct-BatchAdminReqData" +#define NID_setct_BatchAdminReqData 558 +#define OBJ_setct_BatchAdminReqData OBJ_set_ctype,40L + +#define SN_setct_BatchAdminResData "setct-BatchAdminResData" +#define NID_setct_BatchAdminResData 559 +#define OBJ_setct_BatchAdminResData OBJ_set_ctype,41L + +#define SN_setct_CardCInitResTBS "setct-CardCInitResTBS" +#define NID_setct_CardCInitResTBS 560 +#define OBJ_setct_CardCInitResTBS OBJ_set_ctype,42L + +#define SN_setct_MeAqCInitResTBS "setct-MeAqCInitResTBS" +#define NID_setct_MeAqCInitResTBS 561 +#define OBJ_setct_MeAqCInitResTBS OBJ_set_ctype,43L + +#define SN_setct_RegFormResTBS "setct-RegFormResTBS" +#define NID_setct_RegFormResTBS 562 +#define OBJ_setct_RegFormResTBS OBJ_set_ctype,44L + +#define SN_setct_CertReqData "setct-CertReqData" +#define NID_setct_CertReqData 563 +#define OBJ_setct_CertReqData OBJ_set_ctype,45L + +#define SN_setct_CertReqTBS "setct-CertReqTBS" +#define NID_setct_CertReqTBS 564 +#define OBJ_setct_CertReqTBS OBJ_set_ctype,46L + +#define SN_setct_CertResData "setct-CertResData" +#define NID_setct_CertResData 565 +#define OBJ_setct_CertResData OBJ_set_ctype,47L + +#define SN_setct_CertInqReqTBS "setct-CertInqReqTBS" +#define NID_setct_CertInqReqTBS 566 +#define OBJ_setct_CertInqReqTBS OBJ_set_ctype,48L + +#define SN_setct_ErrorTBS "setct-ErrorTBS" +#define NID_setct_ErrorTBS 567 +#define OBJ_setct_ErrorTBS OBJ_set_ctype,49L + +#define SN_setct_PIDualSignedTBE "setct-PIDualSignedTBE" +#define NID_setct_PIDualSignedTBE 568 +#define OBJ_setct_PIDualSignedTBE OBJ_set_ctype,50L + +#define SN_setct_PIUnsignedTBE "setct-PIUnsignedTBE" +#define NID_setct_PIUnsignedTBE 569 +#define OBJ_setct_PIUnsignedTBE OBJ_set_ctype,51L + +#define SN_setct_AuthReqTBE "setct-AuthReqTBE" +#define NID_setct_AuthReqTBE 570 +#define OBJ_setct_AuthReqTBE OBJ_set_ctype,52L + +#define SN_setct_AuthResTBE "setct-AuthResTBE" +#define NID_setct_AuthResTBE 571 +#define OBJ_setct_AuthResTBE OBJ_set_ctype,53L + +#define SN_setct_AuthResTBEX "setct-AuthResTBEX" +#define NID_setct_AuthResTBEX 572 +#define OBJ_setct_AuthResTBEX OBJ_set_ctype,54L + +#define SN_setct_AuthTokenTBE "setct-AuthTokenTBE" +#define NID_setct_AuthTokenTBE 573 +#define OBJ_setct_AuthTokenTBE OBJ_set_ctype,55L + +#define SN_setct_CapTokenTBE "setct-CapTokenTBE" +#define NID_setct_CapTokenTBE 574 +#define OBJ_setct_CapTokenTBE OBJ_set_ctype,56L + +#define SN_setct_CapTokenTBEX "setct-CapTokenTBEX" +#define NID_setct_CapTokenTBEX 575 +#define OBJ_setct_CapTokenTBEX OBJ_set_ctype,57L + +#define SN_setct_AcqCardCodeMsgTBE "setct-AcqCardCodeMsgTBE" +#define NID_setct_AcqCardCodeMsgTBE 576 +#define OBJ_setct_AcqCardCodeMsgTBE OBJ_set_ctype,58L + +#define SN_setct_AuthRevReqTBE "setct-AuthRevReqTBE" +#define NID_setct_AuthRevReqTBE 577 +#define OBJ_setct_AuthRevReqTBE OBJ_set_ctype,59L + +#define SN_setct_AuthRevResTBE "setct-AuthRevResTBE" +#define NID_setct_AuthRevResTBE 578 +#define OBJ_setct_AuthRevResTBE OBJ_set_ctype,60L + +#define SN_setct_AuthRevResTBEB "setct-AuthRevResTBEB" +#define NID_setct_AuthRevResTBEB 579 +#define OBJ_setct_AuthRevResTBEB OBJ_set_ctype,61L + +#define SN_setct_CapReqTBE "setct-CapReqTBE" +#define NID_setct_CapReqTBE 580 +#define OBJ_setct_CapReqTBE OBJ_set_ctype,62L + +#define SN_setct_CapReqTBEX "setct-CapReqTBEX" +#define NID_setct_CapReqTBEX 581 +#define OBJ_setct_CapReqTBEX OBJ_set_ctype,63L + +#define SN_setct_CapResTBE "setct-CapResTBE" +#define NID_setct_CapResTBE 582 +#define OBJ_setct_CapResTBE OBJ_set_ctype,64L + +#define SN_setct_CapRevReqTBE "setct-CapRevReqTBE" +#define NID_setct_CapRevReqTBE 583 +#define OBJ_setct_CapRevReqTBE OBJ_set_ctype,65L + +#define SN_setct_CapRevReqTBEX "setct-CapRevReqTBEX" +#define NID_setct_CapRevReqTBEX 584 +#define OBJ_setct_CapRevReqTBEX OBJ_set_ctype,66L + +#define SN_setct_CapRevResTBE "setct-CapRevResTBE" +#define NID_setct_CapRevResTBE 585 +#define OBJ_setct_CapRevResTBE OBJ_set_ctype,67L + +#define SN_setct_CredReqTBE "setct-CredReqTBE" +#define NID_setct_CredReqTBE 586 +#define OBJ_setct_CredReqTBE OBJ_set_ctype,68L + +#define SN_setct_CredReqTBEX "setct-CredReqTBEX" +#define NID_setct_CredReqTBEX 587 +#define OBJ_setct_CredReqTBEX OBJ_set_ctype,69L + +#define SN_setct_CredResTBE "setct-CredResTBE" +#define NID_setct_CredResTBE 588 +#define OBJ_setct_CredResTBE OBJ_set_ctype,70L + +#define SN_setct_CredRevReqTBE "setct-CredRevReqTBE" +#define NID_setct_CredRevReqTBE 589 +#define OBJ_setct_CredRevReqTBE OBJ_set_ctype,71L + +#define SN_setct_CredRevReqTBEX "setct-CredRevReqTBEX" +#define NID_setct_CredRevReqTBEX 590 +#define OBJ_setct_CredRevReqTBEX OBJ_set_ctype,72L + +#define SN_setct_CredRevResTBE "setct-CredRevResTBE" +#define NID_setct_CredRevResTBE 591 +#define OBJ_setct_CredRevResTBE OBJ_set_ctype,73L + +#define SN_setct_BatchAdminReqTBE "setct-BatchAdminReqTBE" +#define NID_setct_BatchAdminReqTBE 592 +#define OBJ_setct_BatchAdminReqTBE OBJ_set_ctype,74L + +#define SN_setct_BatchAdminResTBE "setct-BatchAdminResTBE" +#define NID_setct_BatchAdminResTBE 593 +#define OBJ_setct_BatchAdminResTBE OBJ_set_ctype,75L + +#define SN_setct_RegFormReqTBE "setct-RegFormReqTBE" +#define NID_setct_RegFormReqTBE 594 +#define OBJ_setct_RegFormReqTBE OBJ_set_ctype,76L + +#define SN_setct_CertReqTBE "setct-CertReqTBE" +#define NID_setct_CertReqTBE 595 +#define OBJ_setct_CertReqTBE OBJ_set_ctype,77L + +#define SN_setct_CertReqTBEX "setct-CertReqTBEX" +#define NID_setct_CertReqTBEX 596 +#define OBJ_setct_CertReqTBEX OBJ_set_ctype,78L + +#define SN_setct_CertResTBE "setct-CertResTBE" +#define NID_setct_CertResTBE 597 +#define OBJ_setct_CertResTBE OBJ_set_ctype,79L + +#define SN_setct_CRLNotificationTBS "setct-CRLNotificationTBS" +#define NID_setct_CRLNotificationTBS 598 +#define OBJ_setct_CRLNotificationTBS OBJ_set_ctype,80L + +#define SN_setct_CRLNotificationResTBS "setct-CRLNotificationResTBS" +#define NID_setct_CRLNotificationResTBS 599 +#define OBJ_setct_CRLNotificationResTBS OBJ_set_ctype,81L + +#define SN_setct_BCIDistributionTBS "setct-BCIDistributionTBS" +#define NID_setct_BCIDistributionTBS 600 +#define OBJ_setct_BCIDistributionTBS OBJ_set_ctype,82L + +#define SN_setext_genCrypt "setext-genCrypt" +#define LN_setext_genCrypt "generic cryptogram" +#define NID_setext_genCrypt 601 +#define OBJ_setext_genCrypt OBJ_set_msgExt,1L + +#define SN_setext_miAuth "setext-miAuth" +#define LN_setext_miAuth "merchant initiated auth" +#define NID_setext_miAuth 602 +#define OBJ_setext_miAuth OBJ_set_msgExt,3L + +#define SN_setext_pinSecure "setext-pinSecure" +#define NID_setext_pinSecure 603 +#define OBJ_setext_pinSecure OBJ_set_msgExt,4L + +#define SN_setext_pinAny "setext-pinAny" +#define NID_setext_pinAny 604 +#define OBJ_setext_pinAny OBJ_set_msgExt,5L + +#define SN_setext_track2 "setext-track2" +#define NID_setext_track2 605 +#define OBJ_setext_track2 OBJ_set_msgExt,7L + +#define SN_setext_cv "setext-cv" +#define LN_setext_cv "additional verification" +#define NID_setext_cv 606 +#define OBJ_setext_cv OBJ_set_msgExt,8L + +#define SN_set_policy_root "set-policy-root" +#define NID_set_policy_root 607 +#define OBJ_set_policy_root OBJ_set_policy,0L + +#define SN_setCext_hashedRoot "setCext-hashedRoot" +#define NID_setCext_hashedRoot 608 +#define OBJ_setCext_hashedRoot OBJ_set_certExt,0L + +#define SN_setCext_certType "setCext-certType" +#define NID_setCext_certType 609 +#define OBJ_setCext_certType OBJ_set_certExt,1L + +#define SN_setCext_merchData "setCext-merchData" +#define NID_setCext_merchData 610 +#define OBJ_setCext_merchData OBJ_set_certExt,2L + +#define SN_setCext_cCertRequired "setCext-cCertRequired" +#define NID_setCext_cCertRequired 611 +#define OBJ_setCext_cCertRequired OBJ_set_certExt,3L + +#define SN_setCext_tunneling "setCext-tunneling" +#define NID_setCext_tunneling 612 +#define OBJ_setCext_tunneling OBJ_set_certExt,4L + +#define SN_setCext_setExt "setCext-setExt" +#define NID_setCext_setExt 613 +#define OBJ_setCext_setExt OBJ_set_certExt,5L + +#define SN_setCext_setQualf "setCext-setQualf" +#define NID_setCext_setQualf 614 +#define OBJ_setCext_setQualf OBJ_set_certExt,6L + +#define SN_setCext_PGWYcapabilities "setCext-PGWYcapabilities" +#define NID_setCext_PGWYcapabilities 615 +#define OBJ_setCext_PGWYcapabilities OBJ_set_certExt,7L + +#define SN_setCext_TokenIdentifier "setCext-TokenIdentifier" +#define NID_setCext_TokenIdentifier 616 +#define OBJ_setCext_TokenIdentifier OBJ_set_certExt,8L + +#define SN_setCext_Track2Data "setCext-Track2Data" +#define NID_setCext_Track2Data 617 +#define OBJ_setCext_Track2Data OBJ_set_certExt,9L + +#define SN_setCext_TokenType "setCext-TokenType" +#define NID_setCext_TokenType 618 +#define OBJ_setCext_TokenType OBJ_set_certExt,10L + +#define SN_setCext_IssuerCapabilities "setCext-IssuerCapabilities" +#define NID_setCext_IssuerCapabilities 619 +#define OBJ_setCext_IssuerCapabilities OBJ_set_certExt,11L + +#define SN_setAttr_Cert "setAttr-Cert" +#define NID_setAttr_Cert 620 +#define OBJ_setAttr_Cert OBJ_set_attr,0L + +#define SN_setAttr_PGWYcap "setAttr-PGWYcap" +#define LN_setAttr_PGWYcap "payment gateway capabilities" +#define NID_setAttr_PGWYcap 621 +#define OBJ_setAttr_PGWYcap OBJ_set_attr,1L + +#define SN_setAttr_TokenType "setAttr-TokenType" +#define NID_setAttr_TokenType 622 +#define OBJ_setAttr_TokenType OBJ_set_attr,2L + +#define SN_setAttr_IssCap "setAttr-IssCap" +#define LN_setAttr_IssCap "issuer capabilities" +#define NID_setAttr_IssCap 623 +#define OBJ_setAttr_IssCap OBJ_set_attr,3L + +#define SN_set_rootKeyThumb "set-rootKeyThumb" +#define NID_set_rootKeyThumb 624 +#define OBJ_set_rootKeyThumb OBJ_setAttr_Cert,0L + +#define SN_set_addPolicy "set-addPolicy" +#define NID_set_addPolicy 625 +#define OBJ_set_addPolicy OBJ_setAttr_Cert,1L + +#define SN_setAttr_Token_EMV "setAttr-Token-EMV" +#define NID_setAttr_Token_EMV 626 +#define OBJ_setAttr_Token_EMV OBJ_setAttr_TokenType,1L + +#define SN_setAttr_Token_B0Prime "setAttr-Token-B0Prime" +#define NID_setAttr_Token_B0Prime 627 +#define OBJ_setAttr_Token_B0Prime OBJ_setAttr_TokenType,2L + +#define SN_setAttr_IssCap_CVM "setAttr-IssCap-CVM" +#define NID_setAttr_IssCap_CVM 628 +#define OBJ_setAttr_IssCap_CVM OBJ_setAttr_IssCap,3L + +#define SN_setAttr_IssCap_T2 "setAttr-IssCap-T2" +#define NID_setAttr_IssCap_T2 629 +#define OBJ_setAttr_IssCap_T2 OBJ_setAttr_IssCap,4L + +#define SN_setAttr_IssCap_Sig "setAttr-IssCap-Sig" +#define NID_setAttr_IssCap_Sig 630 +#define OBJ_setAttr_IssCap_Sig OBJ_setAttr_IssCap,5L + +#define SN_setAttr_GenCryptgrm "setAttr-GenCryptgrm" +#define LN_setAttr_GenCryptgrm "generate cryptogram" +#define NID_setAttr_GenCryptgrm 631 +#define OBJ_setAttr_GenCryptgrm OBJ_setAttr_IssCap_CVM,1L + +#define SN_setAttr_T2Enc "setAttr-T2Enc" +#define LN_setAttr_T2Enc "encrypted track 2" +#define NID_setAttr_T2Enc 632 +#define OBJ_setAttr_T2Enc OBJ_setAttr_IssCap_T2,1L + +#define SN_setAttr_T2cleartxt "setAttr-T2cleartxt" +#define LN_setAttr_T2cleartxt "cleartext track 2" +#define NID_setAttr_T2cleartxt 633 +#define OBJ_setAttr_T2cleartxt OBJ_setAttr_IssCap_T2,2L + +#define SN_setAttr_TokICCsig "setAttr-TokICCsig" +#define LN_setAttr_TokICCsig "ICC or token signature" +#define NID_setAttr_TokICCsig 634 +#define OBJ_setAttr_TokICCsig OBJ_setAttr_IssCap_Sig,1L + +#define SN_setAttr_SecDevSig "setAttr-SecDevSig" +#define LN_setAttr_SecDevSig "secure device signature" +#define NID_setAttr_SecDevSig 635 +#define OBJ_setAttr_SecDevSig OBJ_setAttr_IssCap_Sig,2L + +#define SN_set_brand_IATA_ATA "set-brand-IATA-ATA" +#define NID_set_brand_IATA_ATA 636 +#define OBJ_set_brand_IATA_ATA OBJ_set_brand,1L + +#define SN_set_brand_Diners "set-brand-Diners" +#define NID_set_brand_Diners 637 +#define OBJ_set_brand_Diners OBJ_set_brand,30L + +#define SN_set_brand_AmericanExpress "set-brand-AmericanExpress" +#define NID_set_brand_AmericanExpress 638 +#define OBJ_set_brand_AmericanExpress OBJ_set_brand,34L + +#define SN_set_brand_JCB "set-brand-JCB" +#define NID_set_brand_JCB 639 +#define OBJ_set_brand_JCB OBJ_set_brand,35L + +#define SN_set_brand_Visa "set-brand-Visa" +#define NID_set_brand_Visa 640 +#define OBJ_set_brand_Visa OBJ_set_brand,4L + +#define SN_set_brand_MasterCard "set-brand-MasterCard" +#define NID_set_brand_MasterCard 641 +#define OBJ_set_brand_MasterCard OBJ_set_brand,5L + +#define SN_set_brand_Novus "set-brand-Novus" +#define NID_set_brand_Novus 642 +#define OBJ_set_brand_Novus OBJ_set_brand,6011L + +#define SN_des_cdmf "DES-CDMF" +#define LN_des_cdmf "des-cdmf" +#define NID_des_cdmf 643 +#define OBJ_des_cdmf OBJ_rsadsi,3L,10L + +#define SN_rsaOAEPEncryptionSET "rsaOAEPEncryptionSET" +#define NID_rsaOAEPEncryptionSET 644 +#define OBJ_rsaOAEPEncryptionSET OBJ_rsadsi,1L,1L,6L + +#define SN_ipsec3 "Oakley-EC2N-3" +#define LN_ipsec3 "ipsec3" +#define NID_ipsec3 749 + +#define SN_ipsec4 "Oakley-EC2N-4" +#define LN_ipsec4 "ipsec4" +#define NID_ipsec4 750 + +#define SN_whirlpool "whirlpool" +#define NID_whirlpool 804 +#define OBJ_whirlpool OBJ_iso,0L,10118L,3L,0L,55L + +#define SN_cryptopro "cryptopro" +#define NID_cryptopro 805 +#define OBJ_cryptopro OBJ_member_body,643L,2L,2L + +#define SN_cryptocom "cryptocom" +#define NID_cryptocom 806 +#define OBJ_cryptocom OBJ_member_body,643L,2L,9L + +#define SN_id_tc26 "id-tc26" +#define NID_id_tc26 974 +#define OBJ_id_tc26 OBJ_member_body,643L,7L,1L + +#define SN_id_GostR3411_94_with_GostR3410_2001 "id-GostR3411-94-with-GostR3410-2001" +#define LN_id_GostR3411_94_with_GostR3410_2001 "GOST R 34.11-94 with GOST R 34.10-2001" +#define NID_id_GostR3411_94_with_GostR3410_2001 807 +#define OBJ_id_GostR3411_94_with_GostR3410_2001 OBJ_cryptopro,3L + +#define SN_id_GostR3411_94_with_GostR3410_94 "id-GostR3411-94-with-GostR3410-94" +#define LN_id_GostR3411_94_with_GostR3410_94 "GOST R 34.11-94 with GOST R 34.10-94" +#define NID_id_GostR3411_94_with_GostR3410_94 808 +#define OBJ_id_GostR3411_94_with_GostR3410_94 OBJ_cryptopro,4L + +#define SN_id_GostR3411_94 "md_gost94" +#define LN_id_GostR3411_94 "GOST R 34.11-94" +#define NID_id_GostR3411_94 809 +#define OBJ_id_GostR3411_94 OBJ_cryptopro,9L + +#define SN_id_HMACGostR3411_94 "id-HMACGostR3411-94" +#define LN_id_HMACGostR3411_94 "HMAC GOST 34.11-94" +#define NID_id_HMACGostR3411_94 810 +#define OBJ_id_HMACGostR3411_94 OBJ_cryptopro,10L + +#define SN_id_GostR3410_2001 "gost2001" +#define LN_id_GostR3410_2001 "GOST R 34.10-2001" +#define NID_id_GostR3410_2001 811 +#define OBJ_id_GostR3410_2001 OBJ_cryptopro,19L + +#define SN_id_GostR3410_94 "gost94" +#define LN_id_GostR3410_94 "GOST R 34.10-94" +#define NID_id_GostR3410_94 812 +#define OBJ_id_GostR3410_94 OBJ_cryptopro,20L + +#define SN_id_Gost28147_89 "gost89" +#define LN_id_Gost28147_89 "GOST 28147-89" +#define NID_id_Gost28147_89 813 +#define OBJ_id_Gost28147_89 OBJ_cryptopro,21L + +#define SN_gost89_cnt "gost89-cnt" +#define NID_gost89_cnt 814 + +#define SN_gost89_cnt_12 "gost89-cnt-12" +#define NID_gost89_cnt_12 975 + +#define SN_gost89_cbc "gost89-cbc" +#define NID_gost89_cbc 1009 + +#define SN_gost89_ecb "gost89-ecb" +#define NID_gost89_ecb 1010 + +#define SN_gost89_ctr "gost89-ctr" +#define NID_gost89_ctr 1011 + +#define SN_id_Gost28147_89_MAC "gost-mac" +#define LN_id_Gost28147_89_MAC "GOST 28147-89 MAC" +#define NID_id_Gost28147_89_MAC 815 +#define OBJ_id_Gost28147_89_MAC OBJ_cryptopro,22L + +#define SN_gost_mac_12 "gost-mac-12" +#define NID_gost_mac_12 976 + +#define SN_id_GostR3411_94_prf "prf-gostr3411-94" +#define LN_id_GostR3411_94_prf "GOST R 34.11-94 PRF" +#define NID_id_GostR3411_94_prf 816 +#define OBJ_id_GostR3411_94_prf OBJ_cryptopro,23L + +#define SN_id_GostR3410_2001DH "id-GostR3410-2001DH" +#define LN_id_GostR3410_2001DH "GOST R 34.10-2001 DH" +#define NID_id_GostR3410_2001DH 817 +#define OBJ_id_GostR3410_2001DH OBJ_cryptopro,98L + +#define SN_id_GostR3410_94DH "id-GostR3410-94DH" +#define LN_id_GostR3410_94DH "GOST R 34.10-94 DH" +#define NID_id_GostR3410_94DH 818 +#define OBJ_id_GostR3410_94DH OBJ_cryptopro,99L + +#define SN_id_Gost28147_89_CryptoPro_KeyMeshing "id-Gost28147-89-CryptoPro-KeyMeshing" +#define NID_id_Gost28147_89_CryptoPro_KeyMeshing 819 +#define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing OBJ_cryptopro,14L,1L + +#define SN_id_Gost28147_89_None_KeyMeshing "id-Gost28147-89-None-KeyMeshing" +#define NID_id_Gost28147_89_None_KeyMeshing 820 +#define OBJ_id_Gost28147_89_None_KeyMeshing OBJ_cryptopro,14L,0L + +#define SN_id_GostR3411_94_TestParamSet "id-GostR3411-94-TestParamSet" +#define NID_id_GostR3411_94_TestParamSet 821 +#define OBJ_id_GostR3411_94_TestParamSet OBJ_cryptopro,30L,0L + +#define SN_id_GostR3411_94_CryptoProParamSet "id-GostR3411-94-CryptoProParamSet" +#define NID_id_GostR3411_94_CryptoProParamSet 822 +#define OBJ_id_GostR3411_94_CryptoProParamSet OBJ_cryptopro,30L,1L + +#define SN_id_Gost28147_89_TestParamSet "id-Gost28147-89-TestParamSet" +#define NID_id_Gost28147_89_TestParamSet 823 +#define OBJ_id_Gost28147_89_TestParamSet OBJ_cryptopro,31L,0L + +#define SN_id_Gost28147_89_CryptoPro_A_ParamSet "id-Gost28147-89-CryptoPro-A-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_A_ParamSet 824 +#define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet OBJ_cryptopro,31L,1L + +#define SN_id_Gost28147_89_CryptoPro_B_ParamSet "id-Gost28147-89-CryptoPro-B-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_B_ParamSet 825 +#define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet OBJ_cryptopro,31L,2L + +#define SN_id_Gost28147_89_CryptoPro_C_ParamSet "id-Gost28147-89-CryptoPro-C-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_C_ParamSet 826 +#define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet OBJ_cryptopro,31L,3L + +#define SN_id_Gost28147_89_CryptoPro_D_ParamSet "id-Gost28147-89-CryptoPro-D-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_D_ParamSet 827 +#define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet OBJ_cryptopro,31L,4L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet 828 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet OBJ_cryptopro,31L,5L + +#define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet "id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet 829 +#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet OBJ_cryptopro,31L,6L + +#define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet "id-Gost28147-89-CryptoPro-RIC-1-ParamSet" +#define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet 830 +#define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet OBJ_cryptopro,31L,7L + +#define SN_id_GostR3410_94_TestParamSet "id-GostR3410-94-TestParamSet" +#define NID_id_GostR3410_94_TestParamSet 831 +#define OBJ_id_GostR3410_94_TestParamSet OBJ_cryptopro,32L,0L + +#define SN_id_GostR3410_94_CryptoPro_A_ParamSet "id-GostR3410-94-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_A_ParamSet 832 +#define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet OBJ_cryptopro,32L,2L + +#define SN_id_GostR3410_94_CryptoPro_B_ParamSet "id-GostR3410-94-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_B_ParamSet 833 +#define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet OBJ_cryptopro,32L,3L + +#define SN_id_GostR3410_94_CryptoPro_C_ParamSet "id-GostR3410-94-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_C_ParamSet 834 +#define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet OBJ_cryptopro,32L,4L + +#define SN_id_GostR3410_94_CryptoPro_D_ParamSet "id-GostR3410-94-CryptoPro-D-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_D_ParamSet 835 +#define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet OBJ_cryptopro,32L,5L + +#define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet "id-GostR3410-94-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet 836 +#define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet OBJ_cryptopro,33L,1L + +#define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet "id-GostR3410-94-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet 837 +#define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet OBJ_cryptopro,33L,2L + +#define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet "id-GostR3410-94-CryptoPro-XchC-ParamSet" +#define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet 838 +#define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet OBJ_cryptopro,33L,3L + +#define SN_id_GostR3410_2001_TestParamSet "id-GostR3410-2001-TestParamSet" +#define NID_id_GostR3410_2001_TestParamSet 839 +#define OBJ_id_GostR3410_2001_TestParamSet OBJ_cryptopro,35L,0L + +#define SN_id_GostR3410_2001_CryptoPro_A_ParamSet "id-GostR3410-2001-CryptoPro-A-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_A_ParamSet 840 +#define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet OBJ_cryptopro,35L,1L + +#define SN_id_GostR3410_2001_CryptoPro_B_ParamSet "id-GostR3410-2001-CryptoPro-B-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_B_ParamSet 841 +#define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet OBJ_cryptopro,35L,2L + +#define SN_id_GostR3410_2001_CryptoPro_C_ParamSet "id-GostR3410-2001-CryptoPro-C-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_C_ParamSet 842 +#define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet OBJ_cryptopro,35L,3L + +#define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet "id-GostR3410-2001-CryptoPro-XchA-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet 843 +#define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet OBJ_cryptopro,36L,0L + +#define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet "id-GostR3410-2001-CryptoPro-XchB-ParamSet" +#define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet 844 +#define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet OBJ_cryptopro,36L,1L + +#define SN_id_GostR3410_94_a "id-GostR3410-94-a" +#define NID_id_GostR3410_94_a 845 +#define OBJ_id_GostR3410_94_a OBJ_id_GostR3410_94,1L + +#define SN_id_GostR3410_94_aBis "id-GostR3410-94-aBis" +#define NID_id_GostR3410_94_aBis 846 +#define OBJ_id_GostR3410_94_aBis OBJ_id_GostR3410_94,2L + +#define SN_id_GostR3410_94_b "id-GostR3410-94-b" +#define NID_id_GostR3410_94_b 847 +#define OBJ_id_GostR3410_94_b OBJ_id_GostR3410_94,3L + +#define SN_id_GostR3410_94_bBis "id-GostR3410-94-bBis" +#define NID_id_GostR3410_94_bBis 848 +#define OBJ_id_GostR3410_94_bBis OBJ_id_GostR3410_94,4L + +#define SN_id_Gost28147_89_cc "id-Gost28147-89-cc" +#define LN_id_Gost28147_89_cc "GOST 28147-89 Cryptocom ParamSet" +#define NID_id_Gost28147_89_cc 849 +#define OBJ_id_Gost28147_89_cc OBJ_cryptocom,1L,6L,1L + +#define SN_id_GostR3410_94_cc "gost94cc" +#define LN_id_GostR3410_94_cc "GOST 34.10-94 Cryptocom" +#define NID_id_GostR3410_94_cc 850 +#define OBJ_id_GostR3410_94_cc OBJ_cryptocom,1L,5L,3L + +#define SN_id_GostR3410_2001_cc "gost2001cc" +#define LN_id_GostR3410_2001_cc "GOST 34.10-2001 Cryptocom" +#define NID_id_GostR3410_2001_cc 851 +#define OBJ_id_GostR3410_2001_cc OBJ_cryptocom,1L,5L,4L + +#define SN_id_GostR3411_94_with_GostR3410_94_cc "id-GostR3411-94-with-GostR3410-94-cc" +#define LN_id_GostR3411_94_with_GostR3410_94_cc "GOST R 34.11-94 with GOST R 34.10-94 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_94_cc 852 +#define OBJ_id_GostR3411_94_with_GostR3410_94_cc OBJ_cryptocom,1L,3L,3L + +#define SN_id_GostR3411_94_with_GostR3410_2001_cc "id-GostR3411-94-with-GostR3410-2001-cc" +#define LN_id_GostR3411_94_with_GostR3410_2001_cc "GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom" +#define NID_id_GostR3411_94_with_GostR3410_2001_cc 853 +#define OBJ_id_GostR3411_94_with_GostR3410_2001_cc OBJ_cryptocom,1L,3L,4L + +#define SN_id_GostR3410_2001_ParamSet_cc "id-GostR3410-2001-ParamSet-cc" +#define LN_id_GostR3410_2001_ParamSet_cc "GOST R 3410-2001 Parameter Set Cryptocom" +#define NID_id_GostR3410_2001_ParamSet_cc 854 +#define OBJ_id_GostR3410_2001_ParamSet_cc OBJ_cryptocom,1L,8L,1L + +#define SN_id_tc26_algorithms "id-tc26-algorithms" +#define NID_id_tc26_algorithms 977 +#define OBJ_id_tc26_algorithms OBJ_id_tc26,1L + +#define SN_id_tc26_sign "id-tc26-sign" +#define NID_id_tc26_sign 978 +#define OBJ_id_tc26_sign OBJ_id_tc26_algorithms,1L + +#define SN_id_GostR3410_2012_256 "gost2012_256" +#define LN_id_GostR3410_2012_256 "GOST R 34.10-2012 with 256 bit modulus" +#define NID_id_GostR3410_2012_256 979 +#define OBJ_id_GostR3410_2012_256 OBJ_id_tc26_sign,1L + +#define SN_id_GostR3410_2012_512 "gost2012_512" +#define LN_id_GostR3410_2012_512 "GOST R 34.10-2012 with 512 bit modulus" +#define NID_id_GostR3410_2012_512 980 +#define OBJ_id_GostR3410_2012_512 OBJ_id_tc26_sign,2L + +#define SN_id_tc26_digest "id-tc26-digest" +#define NID_id_tc26_digest 981 +#define OBJ_id_tc26_digest OBJ_id_tc26_algorithms,2L + +#define SN_id_GostR3411_2012_256 "md_gost12_256" +#define LN_id_GostR3411_2012_256 "GOST R 34.11-2012 with 256 bit hash" +#define NID_id_GostR3411_2012_256 982 +#define OBJ_id_GostR3411_2012_256 OBJ_id_tc26_digest,2L + +#define SN_id_GostR3411_2012_512 "md_gost12_512" +#define LN_id_GostR3411_2012_512 "GOST R 34.11-2012 with 512 bit hash" +#define NID_id_GostR3411_2012_512 983 +#define OBJ_id_GostR3411_2012_512 OBJ_id_tc26_digest,3L + +#define SN_id_tc26_signwithdigest "id-tc26-signwithdigest" +#define NID_id_tc26_signwithdigest 984 +#define OBJ_id_tc26_signwithdigest OBJ_id_tc26_algorithms,3L + +#define SN_id_tc26_signwithdigest_gost3410_2012_256 "id-tc26-signwithdigest-gost3410-2012-256" +#define LN_id_tc26_signwithdigest_gost3410_2012_256 "GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)" +#define NID_id_tc26_signwithdigest_gost3410_2012_256 985 +#define OBJ_id_tc26_signwithdigest_gost3410_2012_256 OBJ_id_tc26_signwithdigest,2L + +#define SN_id_tc26_signwithdigest_gost3410_2012_512 "id-tc26-signwithdigest-gost3410-2012-512" +#define LN_id_tc26_signwithdigest_gost3410_2012_512 "GOST R 34.10-2012 with GOST R 34.11-2012 (512 bit)" +#define NID_id_tc26_signwithdigest_gost3410_2012_512 986 +#define OBJ_id_tc26_signwithdigest_gost3410_2012_512 OBJ_id_tc26_signwithdigest,3L + +#define SN_id_tc26_mac "id-tc26-mac" +#define NID_id_tc26_mac 987 +#define OBJ_id_tc26_mac OBJ_id_tc26_algorithms,4L + +#define SN_id_tc26_hmac_gost_3411_2012_256 "id-tc26-hmac-gost-3411-2012-256" +#define LN_id_tc26_hmac_gost_3411_2012_256 "HMAC GOST 34.11-2012 256 bit" +#define NID_id_tc26_hmac_gost_3411_2012_256 988 +#define OBJ_id_tc26_hmac_gost_3411_2012_256 OBJ_id_tc26_mac,1L + +#define SN_id_tc26_hmac_gost_3411_2012_512 "id-tc26-hmac-gost-3411-2012-512" +#define LN_id_tc26_hmac_gost_3411_2012_512 "HMAC GOST 34.11-2012 512 bit" +#define NID_id_tc26_hmac_gost_3411_2012_512 989 +#define OBJ_id_tc26_hmac_gost_3411_2012_512 OBJ_id_tc26_mac,2L + +#define SN_id_tc26_cipher "id-tc26-cipher" +#define NID_id_tc26_cipher 990 +#define OBJ_id_tc26_cipher OBJ_id_tc26_algorithms,5L + +#define SN_id_tc26_cipher_gostr3412_2015_magma "id-tc26-cipher-gostr3412-2015-magma" +#define NID_id_tc26_cipher_gostr3412_2015_magma 1173 +#define OBJ_id_tc26_cipher_gostr3412_2015_magma OBJ_id_tc26_cipher,1L + +#define SN_magma_ctr_acpkm "magma-ctr-acpkm" +#define NID_magma_ctr_acpkm 1174 +#define OBJ_magma_ctr_acpkm OBJ_id_tc26_cipher_gostr3412_2015_magma,1L + +#define SN_magma_ctr_acpkm_omac "magma-ctr-acpkm-omac" +#define NID_magma_ctr_acpkm_omac 1175 +#define OBJ_magma_ctr_acpkm_omac OBJ_id_tc26_cipher_gostr3412_2015_magma,2L + +#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik "id-tc26-cipher-gostr3412-2015-kuznyechik" +#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik 1176 +#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik OBJ_id_tc26_cipher,2L + +#define SN_kuznyechik_ctr_acpkm "kuznyechik-ctr-acpkm" +#define NID_kuznyechik_ctr_acpkm 1177 +#define OBJ_kuznyechik_ctr_acpkm OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik,1L + +#define SN_kuznyechik_ctr_acpkm_omac "kuznyechik-ctr-acpkm-omac" +#define NID_kuznyechik_ctr_acpkm_omac 1178 +#define OBJ_kuznyechik_ctr_acpkm_omac OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik,2L + +#define SN_id_tc26_agreement "id-tc26-agreement" +#define NID_id_tc26_agreement 991 +#define OBJ_id_tc26_agreement OBJ_id_tc26_algorithms,6L + +#define SN_id_tc26_agreement_gost_3410_2012_256 "id-tc26-agreement-gost-3410-2012-256" +#define NID_id_tc26_agreement_gost_3410_2012_256 992 +#define OBJ_id_tc26_agreement_gost_3410_2012_256 OBJ_id_tc26_agreement,1L + +#define SN_id_tc26_agreement_gost_3410_2012_512 "id-tc26-agreement-gost-3410-2012-512" +#define NID_id_tc26_agreement_gost_3410_2012_512 993 +#define OBJ_id_tc26_agreement_gost_3410_2012_512 OBJ_id_tc26_agreement,2L + +#define SN_id_tc26_wrap "id-tc26-wrap" +#define NID_id_tc26_wrap 1179 +#define OBJ_id_tc26_wrap OBJ_id_tc26_algorithms,7L + +#define SN_id_tc26_wrap_gostr3412_2015_magma "id-tc26-wrap-gostr3412-2015-magma" +#define NID_id_tc26_wrap_gostr3412_2015_magma 1180 +#define OBJ_id_tc26_wrap_gostr3412_2015_magma OBJ_id_tc26_wrap,1L + +#define SN_magma_kexp15 "magma-kexp15" +#define NID_magma_kexp15 1181 +#define OBJ_magma_kexp15 OBJ_id_tc26_wrap_gostr3412_2015_magma,1L + +#define SN_id_tc26_wrap_gostr3412_2015_kuznyechik "id-tc26-wrap-gostr3412-2015-kuznyechik" +#define NID_id_tc26_wrap_gostr3412_2015_kuznyechik 1182 +#define OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik OBJ_id_tc26_wrap,2L + +#define SN_kuznyechik_kexp15 "kuznyechik-kexp15" +#define NID_kuznyechik_kexp15 1183 +#define OBJ_kuznyechik_kexp15 OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik,1L + +#define SN_id_tc26_constants "id-tc26-constants" +#define NID_id_tc26_constants 994 +#define OBJ_id_tc26_constants OBJ_id_tc26,2L + +#define SN_id_tc26_sign_constants "id-tc26-sign-constants" +#define NID_id_tc26_sign_constants 995 +#define OBJ_id_tc26_sign_constants OBJ_id_tc26_constants,1L + +#define SN_id_tc26_gost_3410_2012_256_constants "id-tc26-gost-3410-2012-256-constants" +#define NID_id_tc26_gost_3410_2012_256_constants 1147 +#define OBJ_id_tc26_gost_3410_2012_256_constants OBJ_id_tc26_sign_constants,1L + +#define SN_id_tc26_gost_3410_2012_256_paramSetA "id-tc26-gost-3410-2012-256-paramSetA" +#define LN_id_tc26_gost_3410_2012_256_paramSetA "GOST R 34.10-2012 (256 bit) ParamSet A" +#define NID_id_tc26_gost_3410_2012_256_paramSetA 1148 +#define OBJ_id_tc26_gost_3410_2012_256_paramSetA OBJ_id_tc26_gost_3410_2012_256_constants,1L + +#define SN_id_tc26_gost_3410_2012_256_paramSetB "id-tc26-gost-3410-2012-256-paramSetB" +#define LN_id_tc26_gost_3410_2012_256_paramSetB "GOST R 34.10-2012 (256 bit) ParamSet B" +#define NID_id_tc26_gost_3410_2012_256_paramSetB 1184 +#define OBJ_id_tc26_gost_3410_2012_256_paramSetB OBJ_id_tc26_gost_3410_2012_256_constants,2L + +#define SN_id_tc26_gost_3410_2012_256_paramSetC "id-tc26-gost-3410-2012-256-paramSetC" +#define LN_id_tc26_gost_3410_2012_256_paramSetC "GOST R 34.10-2012 (256 bit) ParamSet C" +#define NID_id_tc26_gost_3410_2012_256_paramSetC 1185 +#define OBJ_id_tc26_gost_3410_2012_256_paramSetC OBJ_id_tc26_gost_3410_2012_256_constants,3L + +#define SN_id_tc26_gost_3410_2012_256_paramSetD "id-tc26-gost-3410-2012-256-paramSetD" +#define LN_id_tc26_gost_3410_2012_256_paramSetD "GOST R 34.10-2012 (256 bit) ParamSet D" +#define NID_id_tc26_gost_3410_2012_256_paramSetD 1186 +#define OBJ_id_tc26_gost_3410_2012_256_paramSetD OBJ_id_tc26_gost_3410_2012_256_constants,4L + +#define SN_id_tc26_gost_3410_2012_512_constants "id-tc26-gost-3410-2012-512-constants" +#define NID_id_tc26_gost_3410_2012_512_constants 996 +#define OBJ_id_tc26_gost_3410_2012_512_constants OBJ_id_tc26_sign_constants,2L + +#define SN_id_tc26_gost_3410_2012_512_paramSetTest "id-tc26-gost-3410-2012-512-paramSetTest" +#define LN_id_tc26_gost_3410_2012_512_paramSetTest "GOST R 34.10-2012 (512 bit) testing parameter set" +#define NID_id_tc26_gost_3410_2012_512_paramSetTest 997 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetTest OBJ_id_tc26_gost_3410_2012_512_constants,0L + +#define SN_id_tc26_gost_3410_2012_512_paramSetA "id-tc26-gost-3410-2012-512-paramSetA" +#define LN_id_tc26_gost_3410_2012_512_paramSetA "GOST R 34.10-2012 (512 bit) ParamSet A" +#define NID_id_tc26_gost_3410_2012_512_paramSetA 998 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetA OBJ_id_tc26_gost_3410_2012_512_constants,1L + +#define SN_id_tc26_gost_3410_2012_512_paramSetB "id-tc26-gost-3410-2012-512-paramSetB" +#define LN_id_tc26_gost_3410_2012_512_paramSetB "GOST R 34.10-2012 (512 bit) ParamSet B" +#define NID_id_tc26_gost_3410_2012_512_paramSetB 999 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetB OBJ_id_tc26_gost_3410_2012_512_constants,2L + +#define SN_id_tc26_gost_3410_2012_512_paramSetC "id-tc26-gost-3410-2012-512-paramSetC" +#define LN_id_tc26_gost_3410_2012_512_paramSetC "GOST R 34.10-2012 (512 bit) ParamSet C" +#define NID_id_tc26_gost_3410_2012_512_paramSetC 1149 +#define OBJ_id_tc26_gost_3410_2012_512_paramSetC OBJ_id_tc26_gost_3410_2012_512_constants,3L + +#define SN_id_tc26_digest_constants "id-tc26-digest-constants" +#define NID_id_tc26_digest_constants 1000 +#define OBJ_id_tc26_digest_constants OBJ_id_tc26_constants,2L + +#define SN_id_tc26_cipher_constants "id-tc26-cipher-constants" +#define NID_id_tc26_cipher_constants 1001 +#define OBJ_id_tc26_cipher_constants OBJ_id_tc26_constants,5L + +#define SN_id_tc26_gost_28147_constants "id-tc26-gost-28147-constants" +#define NID_id_tc26_gost_28147_constants 1002 +#define OBJ_id_tc26_gost_28147_constants OBJ_id_tc26_cipher_constants,1L + +#define SN_id_tc26_gost_28147_param_Z "id-tc26-gost-28147-param-Z" +#define LN_id_tc26_gost_28147_param_Z "GOST 28147-89 TC26 parameter set" +#define NID_id_tc26_gost_28147_param_Z 1003 +#define OBJ_id_tc26_gost_28147_param_Z OBJ_id_tc26_gost_28147_constants,1L + +#define SN_INN "INN" +#define LN_INN "INN" +#define NID_INN 1004 +#define OBJ_INN OBJ_member_body,643L,3L,131L,1L,1L + +#define SN_OGRN "OGRN" +#define LN_OGRN "OGRN" +#define NID_OGRN 1005 +#define OBJ_OGRN OBJ_member_body,643L,100L,1L + +#define SN_SNILS "SNILS" +#define LN_SNILS "SNILS" +#define NID_SNILS 1006 +#define OBJ_SNILS OBJ_member_body,643L,100L,3L + +#define SN_OGRNIP "OGRNIP" +#define LN_OGRNIP "OGRNIP" +#define NID_OGRNIP 1226 +#define OBJ_OGRNIP OBJ_member_body,643L,100L,5L + +#define SN_subjectSignTool "subjectSignTool" +#define LN_subjectSignTool "Signing Tool of Subject" +#define NID_subjectSignTool 1007 +#define OBJ_subjectSignTool OBJ_member_body,643L,100L,111L + +#define SN_issuerSignTool "issuerSignTool" +#define LN_issuerSignTool "Signing Tool of Issuer" +#define NID_issuerSignTool 1008 +#define OBJ_issuerSignTool OBJ_member_body,643L,100L,112L + +#define SN_classSignTool "classSignTool" +#define LN_classSignTool "Class of Signing Tool" +#define NID_classSignTool 1227 +#define OBJ_classSignTool OBJ_member_body,643L,100L,113L + +#define SN_classSignToolKC1 "classSignToolKC1" +#define LN_classSignToolKC1 "Class of Signing Tool KC1" +#define NID_classSignToolKC1 1228 +#define OBJ_classSignToolKC1 OBJ_member_body,643L,100L,113L,1L + +#define SN_classSignToolKC2 "classSignToolKC2" +#define LN_classSignToolKC2 "Class of Signing Tool KC2" +#define NID_classSignToolKC2 1229 +#define OBJ_classSignToolKC2 OBJ_member_body,643L,100L,113L,2L + +#define SN_classSignToolKC3 "classSignToolKC3" +#define LN_classSignToolKC3 "Class of Signing Tool KC3" +#define NID_classSignToolKC3 1230 +#define OBJ_classSignToolKC3 OBJ_member_body,643L,100L,113L,3L + +#define SN_classSignToolKB1 "classSignToolKB1" +#define LN_classSignToolKB1 "Class of Signing Tool KB1" +#define NID_classSignToolKB1 1231 +#define OBJ_classSignToolKB1 OBJ_member_body,643L,100L,113L,4L + +#define SN_classSignToolKB2 "classSignToolKB2" +#define LN_classSignToolKB2 "Class of Signing Tool KB2" +#define NID_classSignToolKB2 1232 +#define OBJ_classSignToolKB2 OBJ_member_body,643L,100L,113L,5L + +#define SN_classSignToolKA1 "classSignToolKA1" +#define LN_classSignToolKA1 "Class of Signing Tool KA1" +#define NID_classSignToolKA1 1233 +#define OBJ_classSignToolKA1 OBJ_member_body,643L,100L,113L,6L + +#define SN_kuznyechik_ecb "kuznyechik-ecb" +#define NID_kuznyechik_ecb 1012 + +#define SN_kuznyechik_ctr "kuznyechik-ctr" +#define NID_kuznyechik_ctr 1013 + +#define SN_kuznyechik_ofb "kuznyechik-ofb" +#define NID_kuznyechik_ofb 1014 + +#define SN_kuznyechik_cbc "kuznyechik-cbc" +#define NID_kuznyechik_cbc 1015 + +#define SN_kuznyechik_cfb "kuznyechik-cfb" +#define NID_kuznyechik_cfb 1016 + +#define SN_kuznyechik_mac "kuznyechik-mac" +#define NID_kuznyechik_mac 1017 + +#define SN_magma_ecb "magma-ecb" +#define NID_magma_ecb 1187 + +#define SN_magma_ctr "magma-ctr" +#define NID_magma_ctr 1188 + +#define SN_magma_ofb "magma-ofb" +#define NID_magma_ofb 1189 + +#define SN_magma_cbc "magma-cbc" +#define NID_magma_cbc 1190 + +#define SN_magma_cfb "magma-cfb" +#define NID_magma_cfb 1191 + +#define SN_magma_mac "magma-mac" +#define NID_magma_mac 1192 + +#define SN_camellia_128_cbc "CAMELLIA-128-CBC" +#define LN_camellia_128_cbc "camellia-128-cbc" +#define NID_camellia_128_cbc 751 +#define OBJ_camellia_128_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,2L + +#define SN_camellia_192_cbc "CAMELLIA-192-CBC" +#define LN_camellia_192_cbc "camellia-192-cbc" +#define NID_camellia_192_cbc 752 +#define OBJ_camellia_192_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,3L + +#define SN_camellia_256_cbc "CAMELLIA-256-CBC" +#define LN_camellia_256_cbc "camellia-256-cbc" +#define NID_camellia_256_cbc 753 +#define OBJ_camellia_256_cbc 1L,2L,392L,200011L,61L,1L,1L,1L,4L + +#define SN_id_camellia128_wrap "id-camellia128-wrap" +#define NID_id_camellia128_wrap 907 +#define OBJ_id_camellia128_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,2L + +#define SN_id_camellia192_wrap "id-camellia192-wrap" +#define NID_id_camellia192_wrap 908 +#define OBJ_id_camellia192_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,3L + +#define SN_id_camellia256_wrap "id-camellia256-wrap" +#define NID_id_camellia256_wrap 909 +#define OBJ_id_camellia256_wrap 1L,2L,392L,200011L,61L,1L,1L,3L,4L + +#define OBJ_ntt_ds 0L,3L,4401L,5L + +#define OBJ_camellia OBJ_ntt_ds,3L,1L,9L + +#define SN_camellia_128_ecb "CAMELLIA-128-ECB" +#define LN_camellia_128_ecb "camellia-128-ecb" +#define NID_camellia_128_ecb 754 +#define OBJ_camellia_128_ecb OBJ_camellia,1L + +#define SN_camellia_128_ofb128 "CAMELLIA-128-OFB" +#define LN_camellia_128_ofb128 "camellia-128-ofb" +#define NID_camellia_128_ofb128 766 +#define OBJ_camellia_128_ofb128 OBJ_camellia,3L + +#define SN_camellia_128_cfb128 "CAMELLIA-128-CFB" +#define LN_camellia_128_cfb128 "camellia-128-cfb" +#define NID_camellia_128_cfb128 757 +#define OBJ_camellia_128_cfb128 OBJ_camellia,4L + +#define SN_camellia_128_gcm "CAMELLIA-128-GCM" +#define LN_camellia_128_gcm "camellia-128-gcm" +#define NID_camellia_128_gcm 961 +#define OBJ_camellia_128_gcm OBJ_camellia,6L + +#define SN_camellia_128_ccm "CAMELLIA-128-CCM" +#define LN_camellia_128_ccm "camellia-128-ccm" +#define NID_camellia_128_ccm 962 +#define OBJ_camellia_128_ccm OBJ_camellia,7L + +#define SN_camellia_128_ctr "CAMELLIA-128-CTR" +#define LN_camellia_128_ctr "camellia-128-ctr" +#define NID_camellia_128_ctr 963 +#define OBJ_camellia_128_ctr OBJ_camellia,9L + +#define SN_camellia_128_cmac "CAMELLIA-128-CMAC" +#define LN_camellia_128_cmac "camellia-128-cmac" +#define NID_camellia_128_cmac 964 +#define OBJ_camellia_128_cmac OBJ_camellia,10L + +#define SN_camellia_192_ecb "CAMELLIA-192-ECB" +#define LN_camellia_192_ecb "camellia-192-ecb" +#define NID_camellia_192_ecb 755 +#define OBJ_camellia_192_ecb OBJ_camellia,21L + +#define SN_camellia_192_ofb128 "CAMELLIA-192-OFB" +#define LN_camellia_192_ofb128 "camellia-192-ofb" +#define NID_camellia_192_ofb128 767 +#define OBJ_camellia_192_ofb128 OBJ_camellia,23L + +#define SN_camellia_192_cfb128 "CAMELLIA-192-CFB" +#define LN_camellia_192_cfb128 "camellia-192-cfb" +#define NID_camellia_192_cfb128 758 +#define OBJ_camellia_192_cfb128 OBJ_camellia,24L + +#define SN_camellia_192_gcm "CAMELLIA-192-GCM" +#define LN_camellia_192_gcm "camellia-192-gcm" +#define NID_camellia_192_gcm 965 +#define OBJ_camellia_192_gcm OBJ_camellia,26L + +#define SN_camellia_192_ccm "CAMELLIA-192-CCM" +#define LN_camellia_192_ccm "camellia-192-ccm" +#define NID_camellia_192_ccm 966 +#define OBJ_camellia_192_ccm OBJ_camellia,27L + +#define SN_camellia_192_ctr "CAMELLIA-192-CTR" +#define LN_camellia_192_ctr "camellia-192-ctr" +#define NID_camellia_192_ctr 967 +#define OBJ_camellia_192_ctr OBJ_camellia,29L + +#define SN_camellia_192_cmac "CAMELLIA-192-CMAC" +#define LN_camellia_192_cmac "camellia-192-cmac" +#define NID_camellia_192_cmac 968 +#define OBJ_camellia_192_cmac OBJ_camellia,30L + +#define SN_camellia_256_ecb "CAMELLIA-256-ECB" +#define LN_camellia_256_ecb "camellia-256-ecb" +#define NID_camellia_256_ecb 756 +#define OBJ_camellia_256_ecb OBJ_camellia,41L + +#define SN_camellia_256_ofb128 "CAMELLIA-256-OFB" +#define LN_camellia_256_ofb128 "camellia-256-ofb" +#define NID_camellia_256_ofb128 768 +#define OBJ_camellia_256_ofb128 OBJ_camellia,43L + +#define SN_camellia_256_cfb128 "CAMELLIA-256-CFB" +#define LN_camellia_256_cfb128 "camellia-256-cfb" +#define NID_camellia_256_cfb128 759 +#define OBJ_camellia_256_cfb128 OBJ_camellia,44L + +#define SN_camellia_256_gcm "CAMELLIA-256-GCM" +#define LN_camellia_256_gcm "camellia-256-gcm" +#define NID_camellia_256_gcm 969 +#define OBJ_camellia_256_gcm OBJ_camellia,46L + +#define SN_camellia_256_ccm "CAMELLIA-256-CCM" +#define LN_camellia_256_ccm "camellia-256-ccm" +#define NID_camellia_256_ccm 970 +#define OBJ_camellia_256_ccm OBJ_camellia,47L + +#define SN_camellia_256_ctr "CAMELLIA-256-CTR" +#define LN_camellia_256_ctr "camellia-256-ctr" +#define NID_camellia_256_ctr 971 +#define OBJ_camellia_256_ctr OBJ_camellia,49L + +#define SN_camellia_256_cmac "CAMELLIA-256-CMAC" +#define LN_camellia_256_cmac "camellia-256-cmac" +#define NID_camellia_256_cmac 972 +#define OBJ_camellia_256_cmac OBJ_camellia,50L + +#define SN_camellia_128_cfb1 "CAMELLIA-128-CFB1" +#define LN_camellia_128_cfb1 "camellia-128-cfb1" +#define NID_camellia_128_cfb1 760 + +#define SN_camellia_192_cfb1 "CAMELLIA-192-CFB1" +#define LN_camellia_192_cfb1 "camellia-192-cfb1" +#define NID_camellia_192_cfb1 761 + +#define SN_camellia_256_cfb1 "CAMELLIA-256-CFB1" +#define LN_camellia_256_cfb1 "camellia-256-cfb1" +#define NID_camellia_256_cfb1 762 + +#define SN_camellia_128_cfb8 "CAMELLIA-128-CFB8" +#define LN_camellia_128_cfb8 "camellia-128-cfb8" +#define NID_camellia_128_cfb8 763 + +#define SN_camellia_192_cfb8 "CAMELLIA-192-CFB8" +#define LN_camellia_192_cfb8 "camellia-192-cfb8" +#define NID_camellia_192_cfb8 764 + +#define SN_camellia_256_cfb8 "CAMELLIA-256-CFB8" +#define LN_camellia_256_cfb8 "camellia-256-cfb8" +#define NID_camellia_256_cfb8 765 + +#define OBJ_aria 1L,2L,410L,200046L,1L,1L + +#define SN_aria_128_ecb "ARIA-128-ECB" +#define LN_aria_128_ecb "aria-128-ecb" +#define NID_aria_128_ecb 1065 +#define OBJ_aria_128_ecb OBJ_aria,1L + +#define SN_aria_128_cbc "ARIA-128-CBC" +#define LN_aria_128_cbc "aria-128-cbc" +#define NID_aria_128_cbc 1066 +#define OBJ_aria_128_cbc OBJ_aria,2L + +#define SN_aria_128_cfb128 "ARIA-128-CFB" +#define LN_aria_128_cfb128 "aria-128-cfb" +#define NID_aria_128_cfb128 1067 +#define OBJ_aria_128_cfb128 OBJ_aria,3L + +#define SN_aria_128_ofb128 "ARIA-128-OFB" +#define LN_aria_128_ofb128 "aria-128-ofb" +#define NID_aria_128_ofb128 1068 +#define OBJ_aria_128_ofb128 OBJ_aria,4L + +#define SN_aria_128_ctr "ARIA-128-CTR" +#define LN_aria_128_ctr "aria-128-ctr" +#define NID_aria_128_ctr 1069 +#define OBJ_aria_128_ctr OBJ_aria,5L + +#define SN_aria_192_ecb "ARIA-192-ECB" +#define LN_aria_192_ecb "aria-192-ecb" +#define NID_aria_192_ecb 1070 +#define OBJ_aria_192_ecb OBJ_aria,6L + +#define SN_aria_192_cbc "ARIA-192-CBC" +#define LN_aria_192_cbc "aria-192-cbc" +#define NID_aria_192_cbc 1071 +#define OBJ_aria_192_cbc OBJ_aria,7L + +#define SN_aria_192_cfb128 "ARIA-192-CFB" +#define LN_aria_192_cfb128 "aria-192-cfb" +#define NID_aria_192_cfb128 1072 +#define OBJ_aria_192_cfb128 OBJ_aria,8L + +#define SN_aria_192_ofb128 "ARIA-192-OFB" +#define LN_aria_192_ofb128 "aria-192-ofb" +#define NID_aria_192_ofb128 1073 +#define OBJ_aria_192_ofb128 OBJ_aria,9L + +#define SN_aria_192_ctr "ARIA-192-CTR" +#define LN_aria_192_ctr "aria-192-ctr" +#define NID_aria_192_ctr 1074 +#define OBJ_aria_192_ctr OBJ_aria,10L + +#define SN_aria_256_ecb "ARIA-256-ECB" +#define LN_aria_256_ecb "aria-256-ecb" +#define NID_aria_256_ecb 1075 +#define OBJ_aria_256_ecb OBJ_aria,11L + +#define SN_aria_256_cbc "ARIA-256-CBC" +#define LN_aria_256_cbc "aria-256-cbc" +#define NID_aria_256_cbc 1076 +#define OBJ_aria_256_cbc OBJ_aria,12L + +#define SN_aria_256_cfb128 "ARIA-256-CFB" +#define LN_aria_256_cfb128 "aria-256-cfb" +#define NID_aria_256_cfb128 1077 +#define OBJ_aria_256_cfb128 OBJ_aria,13L + +#define SN_aria_256_ofb128 "ARIA-256-OFB" +#define LN_aria_256_ofb128 "aria-256-ofb" +#define NID_aria_256_ofb128 1078 +#define OBJ_aria_256_ofb128 OBJ_aria,14L + +#define SN_aria_256_ctr "ARIA-256-CTR" +#define LN_aria_256_ctr "aria-256-ctr" +#define NID_aria_256_ctr 1079 +#define OBJ_aria_256_ctr OBJ_aria,15L + +#define SN_aria_128_cfb1 "ARIA-128-CFB1" +#define LN_aria_128_cfb1 "aria-128-cfb1" +#define NID_aria_128_cfb1 1080 + +#define SN_aria_192_cfb1 "ARIA-192-CFB1" +#define LN_aria_192_cfb1 "aria-192-cfb1" +#define NID_aria_192_cfb1 1081 + +#define SN_aria_256_cfb1 "ARIA-256-CFB1" +#define LN_aria_256_cfb1 "aria-256-cfb1" +#define NID_aria_256_cfb1 1082 + +#define SN_aria_128_cfb8 "ARIA-128-CFB8" +#define LN_aria_128_cfb8 "aria-128-cfb8" +#define NID_aria_128_cfb8 1083 + +#define SN_aria_192_cfb8 "ARIA-192-CFB8" +#define LN_aria_192_cfb8 "aria-192-cfb8" +#define NID_aria_192_cfb8 1084 + +#define SN_aria_256_cfb8 "ARIA-256-CFB8" +#define LN_aria_256_cfb8 "aria-256-cfb8" +#define NID_aria_256_cfb8 1085 + +#define SN_aria_128_ccm "ARIA-128-CCM" +#define LN_aria_128_ccm "aria-128-ccm" +#define NID_aria_128_ccm 1120 +#define OBJ_aria_128_ccm OBJ_aria,37L + +#define SN_aria_192_ccm "ARIA-192-CCM" +#define LN_aria_192_ccm "aria-192-ccm" +#define NID_aria_192_ccm 1121 +#define OBJ_aria_192_ccm OBJ_aria,38L + +#define SN_aria_256_ccm "ARIA-256-CCM" +#define LN_aria_256_ccm "aria-256-ccm" +#define NID_aria_256_ccm 1122 +#define OBJ_aria_256_ccm OBJ_aria,39L + +#define SN_aria_128_gcm "ARIA-128-GCM" +#define LN_aria_128_gcm "aria-128-gcm" +#define NID_aria_128_gcm 1123 +#define OBJ_aria_128_gcm OBJ_aria,34L + +#define SN_aria_192_gcm "ARIA-192-GCM" +#define LN_aria_192_gcm "aria-192-gcm" +#define NID_aria_192_gcm 1124 +#define OBJ_aria_192_gcm OBJ_aria,35L + +#define SN_aria_256_gcm "ARIA-256-GCM" +#define LN_aria_256_gcm "aria-256-gcm" +#define NID_aria_256_gcm 1125 +#define OBJ_aria_256_gcm OBJ_aria,36L + +#define SN_kisa "KISA" +#define LN_kisa "kisa" +#define NID_kisa 773 +#define OBJ_kisa OBJ_member_body,410L,200004L + +#define SN_seed_ecb "SEED-ECB" +#define LN_seed_ecb "seed-ecb" +#define NID_seed_ecb 776 +#define OBJ_seed_ecb OBJ_kisa,1L,3L + +#define SN_seed_cbc "SEED-CBC" +#define LN_seed_cbc "seed-cbc" +#define NID_seed_cbc 777 +#define OBJ_seed_cbc OBJ_kisa,1L,4L + +#define SN_seed_cfb128 "SEED-CFB" +#define LN_seed_cfb128 "seed-cfb" +#define NID_seed_cfb128 779 +#define OBJ_seed_cfb128 OBJ_kisa,1L,5L + +#define SN_seed_ofb128 "SEED-OFB" +#define LN_seed_ofb128 "seed-ofb" +#define NID_seed_ofb128 778 +#define OBJ_seed_ofb128 OBJ_kisa,1L,6L + +#define SN_sm4_ecb "SM4-ECB" +#define LN_sm4_ecb "sm4-ecb" +#define NID_sm4_ecb 1133 +#define OBJ_sm4_ecb OBJ_sm_scheme,104L,1L + +#define SN_sm4_cbc "SM4-CBC" +#define LN_sm4_cbc "sm4-cbc" +#define NID_sm4_cbc 1134 +#define OBJ_sm4_cbc OBJ_sm_scheme,104L,2L + +#define SN_sm4_ofb128 "SM4-OFB" +#define LN_sm4_ofb128 "sm4-ofb" +#define NID_sm4_ofb128 1135 +#define OBJ_sm4_ofb128 OBJ_sm_scheme,104L,3L + +#define SN_sm4_cfb128 "SM4-CFB" +#define LN_sm4_cfb128 "sm4-cfb" +#define NID_sm4_cfb128 1137 +#define OBJ_sm4_cfb128 OBJ_sm_scheme,104L,4L + +#define SN_sm4_cfb1 "SM4-CFB1" +#define LN_sm4_cfb1 "sm4-cfb1" +#define NID_sm4_cfb1 1136 +#define OBJ_sm4_cfb1 OBJ_sm_scheme,104L,5L + +#define SN_sm4_cfb8 "SM4-CFB8" +#define LN_sm4_cfb8 "sm4-cfb8" +#define NID_sm4_cfb8 1138 +#define OBJ_sm4_cfb8 OBJ_sm_scheme,104L,6L + +#define SN_sm4_ctr "SM4-CTR" +#define LN_sm4_ctr "sm4-ctr" +#define NID_sm4_ctr 1139 +#define OBJ_sm4_ctr OBJ_sm_scheme,104L,7L + +#define SN_hmac "HMAC" +#define LN_hmac "hmac" +#define NID_hmac 855 + +#define SN_cmac "CMAC" +#define LN_cmac "cmac" +#define NID_cmac 894 + +#define SN_rc4_hmac_md5 "RC4-HMAC-MD5" +#define LN_rc4_hmac_md5 "rc4-hmac-md5" +#define NID_rc4_hmac_md5 915 + +#define SN_aes_128_cbc_hmac_sha1 "AES-128-CBC-HMAC-SHA1" +#define LN_aes_128_cbc_hmac_sha1 "aes-128-cbc-hmac-sha1" +#define NID_aes_128_cbc_hmac_sha1 916 + +#define SN_aes_192_cbc_hmac_sha1 "AES-192-CBC-HMAC-SHA1" +#define LN_aes_192_cbc_hmac_sha1 "aes-192-cbc-hmac-sha1" +#define NID_aes_192_cbc_hmac_sha1 917 + +#define SN_aes_256_cbc_hmac_sha1 "AES-256-CBC-HMAC-SHA1" +#define LN_aes_256_cbc_hmac_sha1 "aes-256-cbc-hmac-sha1" +#define NID_aes_256_cbc_hmac_sha1 918 + +#define SN_aes_128_cbc_hmac_sha256 "AES-128-CBC-HMAC-SHA256" +#define LN_aes_128_cbc_hmac_sha256 "aes-128-cbc-hmac-sha256" +#define NID_aes_128_cbc_hmac_sha256 948 + +#define SN_aes_192_cbc_hmac_sha256 "AES-192-CBC-HMAC-SHA256" +#define LN_aes_192_cbc_hmac_sha256 "aes-192-cbc-hmac-sha256" +#define NID_aes_192_cbc_hmac_sha256 949 + +#define SN_aes_256_cbc_hmac_sha256 "AES-256-CBC-HMAC-SHA256" +#define LN_aes_256_cbc_hmac_sha256 "aes-256-cbc-hmac-sha256" +#define NID_aes_256_cbc_hmac_sha256 950 + +#define SN_chacha20_poly1305 "ChaCha20-Poly1305" +#define LN_chacha20_poly1305 "chacha20-poly1305" +#define NID_chacha20_poly1305 1018 + +#define SN_chacha20 "ChaCha20" +#define LN_chacha20 "chacha20" +#define NID_chacha20 1019 + +#define SN_dhpublicnumber "dhpublicnumber" +#define LN_dhpublicnumber "X9.42 DH" +#define NID_dhpublicnumber 920 +#define OBJ_dhpublicnumber OBJ_ISO_US,10046L,2L,1L + +#define SN_brainpoolP160r1 "brainpoolP160r1" +#define NID_brainpoolP160r1 921 +#define OBJ_brainpoolP160r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,1L + +#define SN_brainpoolP160t1 "brainpoolP160t1" +#define NID_brainpoolP160t1 922 +#define OBJ_brainpoolP160t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,2L + +#define SN_brainpoolP192r1 "brainpoolP192r1" +#define NID_brainpoolP192r1 923 +#define OBJ_brainpoolP192r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,3L + +#define SN_brainpoolP192t1 "brainpoolP192t1" +#define NID_brainpoolP192t1 924 +#define OBJ_brainpoolP192t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,4L + +#define SN_brainpoolP224r1 "brainpoolP224r1" +#define NID_brainpoolP224r1 925 +#define OBJ_brainpoolP224r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,5L + +#define SN_brainpoolP224t1 "brainpoolP224t1" +#define NID_brainpoolP224t1 926 +#define OBJ_brainpoolP224t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,6L + +#define SN_brainpoolP256r1 "brainpoolP256r1" +#define NID_brainpoolP256r1 927 +#define OBJ_brainpoolP256r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,7L + +#define SN_brainpoolP256t1 "brainpoolP256t1" +#define NID_brainpoolP256t1 928 +#define OBJ_brainpoolP256t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,8L + +#define SN_brainpoolP320r1 "brainpoolP320r1" +#define NID_brainpoolP320r1 929 +#define OBJ_brainpoolP320r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,9L + +#define SN_brainpoolP320t1 "brainpoolP320t1" +#define NID_brainpoolP320t1 930 +#define OBJ_brainpoolP320t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,10L + +#define SN_brainpoolP384r1 "brainpoolP384r1" +#define NID_brainpoolP384r1 931 +#define OBJ_brainpoolP384r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,11L + +#define SN_brainpoolP384t1 "brainpoolP384t1" +#define NID_brainpoolP384t1 932 +#define OBJ_brainpoolP384t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,12L + +#define SN_brainpoolP512r1 "brainpoolP512r1" +#define NID_brainpoolP512r1 933 +#define OBJ_brainpoolP512r1 1L,3L,36L,3L,3L,2L,8L,1L,1L,13L + +#define SN_brainpoolP512t1 "brainpoolP512t1" +#define NID_brainpoolP512t1 934 +#define OBJ_brainpoolP512t1 1L,3L,36L,3L,3L,2L,8L,1L,1L,14L + +#define OBJ_x9_63_scheme 1L,3L,133L,16L,840L,63L,0L + +#define OBJ_secg_scheme OBJ_certicom_arc,1L + +#define SN_dhSinglePass_stdDH_sha1kdf_scheme "dhSinglePass-stdDH-sha1kdf-scheme" +#define NID_dhSinglePass_stdDH_sha1kdf_scheme 936 +#define OBJ_dhSinglePass_stdDH_sha1kdf_scheme OBJ_x9_63_scheme,2L + +#define SN_dhSinglePass_stdDH_sha224kdf_scheme "dhSinglePass-stdDH-sha224kdf-scheme" +#define NID_dhSinglePass_stdDH_sha224kdf_scheme 937 +#define OBJ_dhSinglePass_stdDH_sha224kdf_scheme OBJ_secg_scheme,11L,0L + +#define SN_dhSinglePass_stdDH_sha256kdf_scheme "dhSinglePass-stdDH-sha256kdf-scheme" +#define NID_dhSinglePass_stdDH_sha256kdf_scheme 938 +#define OBJ_dhSinglePass_stdDH_sha256kdf_scheme OBJ_secg_scheme,11L,1L + +#define SN_dhSinglePass_stdDH_sha384kdf_scheme "dhSinglePass-stdDH-sha384kdf-scheme" +#define NID_dhSinglePass_stdDH_sha384kdf_scheme 939 +#define OBJ_dhSinglePass_stdDH_sha384kdf_scheme OBJ_secg_scheme,11L,2L + +#define SN_dhSinglePass_stdDH_sha512kdf_scheme "dhSinglePass-stdDH-sha512kdf-scheme" +#define NID_dhSinglePass_stdDH_sha512kdf_scheme 940 +#define OBJ_dhSinglePass_stdDH_sha512kdf_scheme OBJ_secg_scheme,11L,3L + +#define SN_dhSinglePass_cofactorDH_sha1kdf_scheme "dhSinglePass-cofactorDH-sha1kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha1kdf_scheme 941 +#define OBJ_dhSinglePass_cofactorDH_sha1kdf_scheme OBJ_x9_63_scheme,3L + +#define SN_dhSinglePass_cofactorDH_sha224kdf_scheme "dhSinglePass-cofactorDH-sha224kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha224kdf_scheme 942 +#define OBJ_dhSinglePass_cofactorDH_sha224kdf_scheme OBJ_secg_scheme,14L,0L + +#define SN_dhSinglePass_cofactorDH_sha256kdf_scheme "dhSinglePass-cofactorDH-sha256kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha256kdf_scheme 943 +#define OBJ_dhSinglePass_cofactorDH_sha256kdf_scheme OBJ_secg_scheme,14L,1L + +#define SN_dhSinglePass_cofactorDH_sha384kdf_scheme "dhSinglePass-cofactorDH-sha384kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha384kdf_scheme 944 +#define OBJ_dhSinglePass_cofactorDH_sha384kdf_scheme OBJ_secg_scheme,14L,2L + +#define SN_dhSinglePass_cofactorDH_sha512kdf_scheme "dhSinglePass-cofactorDH-sha512kdf-scheme" +#define NID_dhSinglePass_cofactorDH_sha512kdf_scheme 945 +#define OBJ_dhSinglePass_cofactorDH_sha512kdf_scheme OBJ_secg_scheme,14L,3L + +#define SN_dh_std_kdf "dh-std-kdf" +#define NID_dh_std_kdf 946 + +#define SN_dh_cofactor_kdf "dh-cofactor-kdf" +#define NID_dh_cofactor_kdf 947 + +#define SN_ct_precert_scts "ct_precert_scts" +#define LN_ct_precert_scts "CT Precertificate SCTs" +#define NID_ct_precert_scts 951 +#define OBJ_ct_precert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,2L + +#define SN_ct_precert_poison "ct_precert_poison" +#define LN_ct_precert_poison "CT Precertificate Poison" +#define NID_ct_precert_poison 952 +#define OBJ_ct_precert_poison 1L,3L,6L,1L,4L,1L,11129L,2L,4L,3L + +#define SN_ct_precert_signer "ct_precert_signer" +#define LN_ct_precert_signer "CT Precertificate Signer" +#define NID_ct_precert_signer 953 +#define OBJ_ct_precert_signer 1L,3L,6L,1L,4L,1L,11129L,2L,4L,4L + +#define SN_ct_cert_scts "ct_cert_scts" +#define LN_ct_cert_scts "CT Certificate SCTs" +#define NID_ct_cert_scts 954 +#define OBJ_ct_cert_scts 1L,3L,6L,1L,4L,1L,11129L,2L,4L,5L + +#define SN_jurisdictionLocalityName "jurisdictionL" +#define LN_jurisdictionLocalityName "jurisdictionLocalityName" +#define NID_jurisdictionLocalityName 955 +#define OBJ_jurisdictionLocalityName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,1L + +#define SN_jurisdictionStateOrProvinceName "jurisdictionST" +#define LN_jurisdictionStateOrProvinceName "jurisdictionStateOrProvinceName" +#define NID_jurisdictionStateOrProvinceName 956 +#define OBJ_jurisdictionStateOrProvinceName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,2L + +#define SN_jurisdictionCountryName "jurisdictionC" +#define LN_jurisdictionCountryName "jurisdictionCountryName" +#define NID_jurisdictionCountryName 957 +#define OBJ_jurisdictionCountryName 1L,3L,6L,1L,4L,1L,311L,60L,2L,1L,3L + +#define SN_id_scrypt "id-scrypt" +#define LN_id_scrypt "scrypt" +#define NID_id_scrypt 973 +#define OBJ_id_scrypt 1L,3L,6L,1L,4L,1L,11591L,4L,11L + +#define SN_tls1_prf "TLS1-PRF" +#define LN_tls1_prf "tls1-prf" +#define NID_tls1_prf 1021 + +#define SN_hkdf "HKDF" +#define LN_hkdf "hkdf" +#define NID_hkdf 1036 + +#define SN_sshkdf "SSHKDF" +#define LN_sshkdf "sshkdf" +#define NID_sshkdf 1203 + +#define SN_sskdf "SSKDF" +#define LN_sskdf "sskdf" +#define NID_sskdf 1205 + +#define SN_x942kdf "X942KDF" +#define LN_x942kdf "x942kdf" +#define NID_x942kdf 1207 + +#define SN_x963kdf "X963KDF" +#define LN_x963kdf "x963kdf" +#define NID_x963kdf 1206 + +#define SN_id_pkinit "id-pkinit" +#define NID_id_pkinit 1031 +#define OBJ_id_pkinit 1L,3L,6L,1L,5L,2L,3L + +#define SN_pkInitClientAuth "pkInitClientAuth" +#define LN_pkInitClientAuth "PKINIT Client Auth" +#define NID_pkInitClientAuth 1032 +#define OBJ_pkInitClientAuth OBJ_id_pkinit,4L + +#define SN_pkInitKDC "pkInitKDC" +#define LN_pkInitKDC "Signing KDC Response" +#define NID_pkInitKDC 1033 +#define OBJ_pkInitKDC OBJ_id_pkinit,5L + +#define SN_X25519 "X25519" +#define NID_X25519 1034 +#define OBJ_X25519 1L,3L,101L,110L + +#define SN_X448 "X448" +#define NID_X448 1035 +#define OBJ_X448 1L,3L,101L,111L + +#define SN_ED25519 "ED25519" +#define NID_ED25519 1087 +#define OBJ_ED25519 1L,3L,101L,112L + +#define SN_ED448 "ED448" +#define NID_ED448 1088 +#define OBJ_ED448 1L,3L,101L,113L + +#define SN_kx_rsa "KxRSA" +#define LN_kx_rsa "kx-rsa" +#define NID_kx_rsa 1037 + +#define SN_kx_ecdhe "KxECDHE" +#define LN_kx_ecdhe "kx-ecdhe" +#define NID_kx_ecdhe 1038 + +#define SN_kx_dhe "KxDHE" +#define LN_kx_dhe "kx-dhe" +#define NID_kx_dhe 1039 + +#define SN_kx_ecdhe_psk "KxECDHE-PSK" +#define LN_kx_ecdhe_psk "kx-ecdhe-psk" +#define NID_kx_ecdhe_psk 1040 + +#define SN_kx_dhe_psk "KxDHE-PSK" +#define LN_kx_dhe_psk "kx-dhe-psk" +#define NID_kx_dhe_psk 1041 + +#define SN_kx_rsa_psk "KxRSA_PSK" +#define LN_kx_rsa_psk "kx-rsa-psk" +#define NID_kx_rsa_psk 1042 + +#define SN_kx_psk "KxPSK" +#define LN_kx_psk "kx-psk" +#define NID_kx_psk 1043 + +#define SN_kx_srp "KxSRP" +#define LN_kx_srp "kx-srp" +#define NID_kx_srp 1044 + +#define SN_kx_gost "KxGOST" +#define LN_kx_gost "kx-gost" +#define NID_kx_gost 1045 + +#define SN_kx_gost18 "KxGOST18" +#define LN_kx_gost18 "kx-gost18" +#define NID_kx_gost18 1218 + +#define SN_kx_any "KxANY" +#define LN_kx_any "kx-any" +#define NID_kx_any 1063 + +#define SN_auth_rsa "AuthRSA" +#define LN_auth_rsa "auth-rsa" +#define NID_auth_rsa 1046 + +#define SN_auth_ecdsa "AuthECDSA" +#define LN_auth_ecdsa "auth-ecdsa" +#define NID_auth_ecdsa 1047 + +#define SN_auth_psk "AuthPSK" +#define LN_auth_psk "auth-psk" +#define NID_auth_psk 1048 + +#define SN_auth_dss "AuthDSS" +#define LN_auth_dss "auth-dss" +#define NID_auth_dss 1049 + +#define SN_auth_gost01 "AuthGOST01" +#define LN_auth_gost01 "auth-gost01" +#define NID_auth_gost01 1050 + +#define SN_auth_gost12 "AuthGOST12" +#define LN_auth_gost12 "auth-gost12" +#define NID_auth_gost12 1051 + +#define SN_auth_srp "AuthSRP" +#define LN_auth_srp "auth-srp" +#define NID_auth_srp 1052 + +#define SN_auth_null "AuthNULL" +#define LN_auth_null "auth-null" +#define NID_auth_null 1053 + +#define SN_auth_any "AuthANY" +#define LN_auth_any "auth-any" +#define NID_auth_any 1064 + +#define SN_poly1305 "Poly1305" +#define LN_poly1305 "poly1305" +#define NID_poly1305 1061 + +#define SN_siphash "SipHash" +#define LN_siphash "siphash" +#define NID_siphash 1062 + +#define SN_ffdhe2048 "ffdhe2048" +#define NID_ffdhe2048 1126 + +#define SN_ffdhe3072 "ffdhe3072" +#define NID_ffdhe3072 1127 + +#define SN_ffdhe4096 "ffdhe4096" +#define NID_ffdhe4096 1128 + +#define SN_ffdhe6144 "ffdhe6144" +#define NID_ffdhe6144 1129 + +#define SN_ffdhe8192 "ffdhe8192" +#define NID_ffdhe8192 1130 + +#define SN_modp_1536 "modp_1536" +#define NID_modp_1536 1212 + +#define SN_modp_2048 "modp_2048" +#define NID_modp_2048 1213 + +#define SN_modp_3072 "modp_3072" +#define NID_modp_3072 1214 + +#define SN_modp_4096 "modp_4096" +#define NID_modp_4096 1215 + +#define SN_modp_6144 "modp_6144" +#define NID_modp_6144 1216 + +#define SN_modp_8192 "modp_8192" +#define NID_modp_8192 1217 + +#define SN_ISO_UA "ISO-UA" +#define NID_ISO_UA 1150 +#define OBJ_ISO_UA OBJ_member_body,804L + +#define SN_ua_pki "ua-pki" +#define NID_ua_pki 1151 +#define OBJ_ua_pki OBJ_ISO_UA,2L,1L,1L,1L + +#define SN_dstu28147 "dstu28147" +#define LN_dstu28147 "DSTU Gost 28147-2009" +#define NID_dstu28147 1152 +#define OBJ_dstu28147 OBJ_ua_pki,1L,1L,1L + +#define SN_dstu28147_ofb "dstu28147-ofb" +#define LN_dstu28147_ofb "DSTU Gost 28147-2009 OFB mode" +#define NID_dstu28147_ofb 1153 +#define OBJ_dstu28147_ofb OBJ_dstu28147,2L + +#define SN_dstu28147_cfb "dstu28147-cfb" +#define LN_dstu28147_cfb "DSTU Gost 28147-2009 CFB mode" +#define NID_dstu28147_cfb 1154 +#define OBJ_dstu28147_cfb OBJ_dstu28147,3L + +#define SN_dstu28147_wrap "dstu28147-wrap" +#define LN_dstu28147_wrap "DSTU Gost 28147-2009 key wrap" +#define NID_dstu28147_wrap 1155 +#define OBJ_dstu28147_wrap OBJ_dstu28147,5L + +#define SN_hmacWithDstu34311 "hmacWithDstu34311" +#define LN_hmacWithDstu34311 "HMAC DSTU Gost 34311-95" +#define NID_hmacWithDstu34311 1156 +#define OBJ_hmacWithDstu34311 OBJ_ua_pki,1L,1L,2L + +#define SN_dstu34311 "dstu34311" +#define LN_dstu34311 "DSTU Gost 34311-95" +#define NID_dstu34311 1157 +#define OBJ_dstu34311 OBJ_ua_pki,1L,2L,1L + +#define SN_dstu4145le "dstu4145le" +#define LN_dstu4145le "DSTU 4145-2002 little endian" +#define NID_dstu4145le 1158 +#define OBJ_dstu4145le OBJ_ua_pki,1L,3L,1L,1L + +#define SN_dstu4145be "dstu4145be" +#define LN_dstu4145be "DSTU 4145-2002 big endian" +#define NID_dstu4145be 1159 +#define OBJ_dstu4145be OBJ_dstu4145le,1L,1L + +#define SN_uacurve0 "uacurve0" +#define LN_uacurve0 "DSTU curve 0" +#define NID_uacurve0 1160 +#define OBJ_uacurve0 OBJ_dstu4145le,2L,0L + +#define SN_uacurve1 "uacurve1" +#define LN_uacurve1 "DSTU curve 1" +#define NID_uacurve1 1161 +#define OBJ_uacurve1 OBJ_dstu4145le,2L,1L + +#define SN_uacurve2 "uacurve2" +#define LN_uacurve2 "DSTU curve 2" +#define NID_uacurve2 1162 +#define OBJ_uacurve2 OBJ_dstu4145le,2L,2L + +#define SN_uacurve3 "uacurve3" +#define LN_uacurve3 "DSTU curve 3" +#define NID_uacurve3 1163 +#define OBJ_uacurve3 OBJ_dstu4145le,2L,3L + +#define SN_uacurve4 "uacurve4" +#define LN_uacurve4 "DSTU curve 4" +#define NID_uacurve4 1164 +#define OBJ_uacurve4 OBJ_dstu4145le,2L,4L + +#define SN_uacurve5 "uacurve5" +#define LN_uacurve5 "DSTU curve 5" +#define NID_uacurve5 1165 +#define OBJ_uacurve5 OBJ_dstu4145le,2L,5L + +#define SN_uacurve6 "uacurve6" +#define LN_uacurve6 "DSTU curve 6" +#define NID_uacurve6 1166 +#define OBJ_uacurve6 OBJ_dstu4145le,2L,6L + +#define SN_uacurve7 "uacurve7" +#define LN_uacurve7 "DSTU curve 7" +#define NID_uacurve7 1167 +#define OBJ_uacurve7 OBJ_dstu4145le,2L,7L + +#define SN_uacurve8 "uacurve8" +#define LN_uacurve8 "DSTU curve 8" +#define NID_uacurve8 1168 +#define OBJ_uacurve8 OBJ_dstu4145le,2L,8L + +#define SN_uacurve9 "uacurve9" +#define LN_uacurve9 "DSTU curve 9" +#define NID_uacurve9 1169 +#define OBJ_uacurve9 OBJ_dstu4145le,2L,9L + +#define SN_aes_128_siv "AES-128-SIV" +#define LN_aes_128_siv "aes-128-siv" +#define NID_aes_128_siv 1198 + +#define SN_aes_192_siv "AES-192-SIV" +#define LN_aes_192_siv "aes-192-siv" +#define NID_aes_192_siv 1199 + +#define SN_aes_256_siv "AES-256-SIV" +#define LN_aes_256_siv "aes-256-siv" +#define NID_aes_256_siv 1200 + +#endif /* OPENSSL_OBJ_MAC_H */ + +#ifndef OPENSSL_NO_DEPRECATED_3_0 + +#define SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm SN_magma_ctr_acpkm +#define NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm NID_magma_ctr_acpkm +#define OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm OBJ_magma_ctr_acpkm + +#define SN_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac SN_magma_ctr_acpkm_omac +#define NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac NID_magma_ctr_acpkm_omac +#define OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac OBJ_magma_ctr_acpkm_omac + +#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm SN_kuznyechik_ctr_acpkm +#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm NID_kuznyechik_ctr_acpkm +#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm OBJ_kuznyechik_ctr_acpkm + +#define SN_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac SN_kuznyechik_ctr_acpkm_omac +#define NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac NID_kuznyechik_ctr_acpkm_omac +#define OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac OBJ_kuznyechik_ctr_acpkm_omac + +#define SN_id_tc26_wrap_gostr3412_2015_magma_kexp15 SN_magma_kexp15 +#define NID_id_tc26_wrap_gostr3412_2015_magma_kexp15 NID_magma_kexp15 +#define OBJ_id_tc26_wrap_gostr3412_2015_magma_kexp15 OBJ_magma_kexp15 + +#define SN_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 SN_kuznyechik_kexp15 +#define NID_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 NID_kuznyechik_kexp15 +#define OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 OBJ_kuznyechik_kexp15 + +#define SN_grasshopper_ecb SN_kuznyechik_ecb +#define NID_grasshopper_ecb NID_kuznyechik_ecb + +#define SN_grasshopper_ctr SN_kuznyechik_ctr +#define NID_grasshopper_ctr NID_kuznyechik_ctr + +#define SN_grasshopper_ofb SN_kuznyechik_ofb +#define NID_grasshopper_ofb NID_kuznyechik_ofb + +#define SN_grasshopper_cbc SN_kuznyechik_cbc +#define NID_grasshopper_cbc NID_kuznyechik_cbc + +#define SN_grasshopper_cfb SN_kuznyechik_cfb +#define NID_grasshopper_cfb NID_kuznyechik_cfb + +#define SN_grasshopper_mac SN_kuznyechik_mac +#define NID_grasshopper_mac NID_kuznyechik_mac + +#endif /* OPENSSL_NO_DEPRECATED_3_0 */ diff --git a/OtherInc/openssl/include/openssl/objects.h b/OtherInc/openssl/include/openssl/objects.h new file mode 100644 index 0000000..9ea91c2 --- /dev/null +++ b/OtherInc/openssl/include/openssl/objects.h @@ -0,0 +1,183 @@ +/* + * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_OBJECTS_H +# define OPENSSL_OBJECTS_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_OBJECTS_H +# endif + +# include +# include +# include +# include + +# define OBJ_NAME_TYPE_UNDEF 0x00 +# define OBJ_NAME_TYPE_MD_METH 0x01 +# define OBJ_NAME_TYPE_CIPHER_METH 0x02 +# define OBJ_NAME_TYPE_PKEY_METH 0x03 +# define OBJ_NAME_TYPE_COMP_METH 0x04 +# define OBJ_NAME_TYPE_MAC_METH 0x05 +# define OBJ_NAME_TYPE_KDF_METH 0x06 +# define OBJ_NAME_TYPE_NUM 0x07 + +# define OBJ_NAME_ALIAS 0x8000 + +# define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 +# define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct obj_name_st { + int type; + int alias; + const char *name; + const char *data; +} OBJ_NAME; + +# define OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c) + +int OBJ_NAME_init(void); +int OBJ_NAME_new_index(unsigned long (*hash_func) (const char *), + int (*cmp_func) (const char *, const char *), + void (*free_func) (const char *, int, const char *)); +const char *OBJ_NAME_get(const char *name, int type); +int OBJ_NAME_add(const char *name, int type, const char *data); +int OBJ_NAME_remove(const char *name, int type); +void OBJ_NAME_cleanup(int type); /* -1 for everything */ +void OBJ_NAME_do_all(int type, void (*fn) (const OBJ_NAME *, void *arg), + void *arg); +void OBJ_NAME_do_all_sorted(int type, + void (*fn) (const OBJ_NAME *, void *arg), + void *arg); + +DECLARE_ASN1_DUP_FUNCTION_name(ASN1_OBJECT, OBJ) +ASN1_OBJECT *OBJ_nid2obj(int n); +const char *OBJ_nid2ln(int n); +const char *OBJ_nid2sn(int n); +int OBJ_obj2nid(const ASN1_OBJECT *o); +ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name); +int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name); +int OBJ_txt2nid(const char *s); +int OBJ_ln2nid(const char *s); +int OBJ_sn2nid(const char *s); +int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b); +const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, + int (*cmp) (const void *, const void *)); +const void *OBJ_bsearch_ex_(const void *key, const void *base, int num, + int size, + int (*cmp) (const void *, const void *), + int flags); + +# define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *, const void *); \ + static int nm##_cmp(type1 const *, type2 const *); \ + scope type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +# define DECLARE_OBJ_BSEARCH_CMP_FN(type1, type2, cmp) \ + _DECLARE_OBJ_BSEARCH_CMP_FN(static, type1, type2, cmp) +# define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) + +/*- + * Unsolved problem: if a type is actually a pointer type, like + * nid_triple is, then its impossible to get a const where you need + * it. Consider: + * + * typedef int nid_triple[3]; + * const void *a_; + * const nid_triple const *a = a_; + * + * The assignment discards a const because what you really want is: + * + * const int const * const *a = a_; + * + * But if you do that, you lose the fact that a is an array of 3 ints, + * which breaks comparison functions. + * + * Thus we end up having to cast, sadly, or unpack the + * declarations. Or, as I finally did in this case, declare nid_triple + * to be a struct, which it should have been in the first place. + * + * Ben, August 2008. + * + * Also, strictly speaking not all types need be const, but handling + * the non-constness means a lot of complication, and in practice + * comparison routines do always not touch their arguments. + */ + +# define IMPLEMENT_OBJ_BSEARCH_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + static type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define IMPLEMENT_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ + { \ + type1 const *a = a_; \ + type2 const *b = b_; \ + return nm##_cmp(a,b); \ + } \ + type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ + } \ + extern void dummy_prototype(void) + +# define OBJ_bsearch(type1,key,type2,base,num,cmp) \ + ((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN))) + +# define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \ + ((type2 *)OBJ_bsearch_ex_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \ + num,sizeof(type2), \ + ((void)CHECKED_PTR_OF(type1,cmp##_type_1), \ + (void)type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ + cmp##_BSEARCH_CMP_FN)),flags) + +int OBJ_new_nid(int num); +int OBJ_add_object(const ASN1_OBJECT *obj); +int OBJ_create(const char *oid, const char *sn, const char *ln); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define OBJ_cleanup() while(0) continue +#endif +int OBJ_create_objects(BIO *in); + +size_t OBJ_length(const ASN1_OBJECT *obj); +const unsigned char *OBJ_get0_data(const ASN1_OBJECT *obj); + +int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid); +int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid); +int OBJ_add_sigid(int signid, int dig_id, int pkey_id); +void OBJ_sigid_free(void); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/objectserr.h b/OtherInc/openssl/include/openssl/objectserr.h new file mode 100644 index 0000000..585217f --- /dev/null +++ b/OtherInc/openssl/include/openssl/objectserr.h @@ -0,0 +1,28 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_OBJECTSERR_H +# define OPENSSL_OBJECTSERR_H +# pragma once + +# include +# include +# include + + + +/* + * OBJ reason codes. + */ +# define OBJ_R_OID_EXISTS 102 +# define OBJ_R_UNKNOWN_NID 101 +# define OBJ_R_UNKNOWN_OBJECT_NAME 103 + +#endif diff --git a/OtherInc/openssl/include/openssl/ocsp.h b/OtherInc/openssl/include/openssl/ocsp.h new file mode 100644 index 0000000..5688381 --- /dev/null +++ b/OtherInc/openssl/include/openssl/ocsp.h @@ -0,0 +1,483 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\ocsp.h.in + * + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_OCSP_H +# define OPENSSL_OCSP_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_OCSP_H +# endif + +# include +# include +# include + +/* + * These definitions are outside the OPENSSL_NO_OCSP guard because although for + * historical reasons they have OCSP_* names, they can actually be used + * independently of OCSP. E.g. see RFC5280 + */ +/*- + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * -- value 7 is not used + * removeFromCRL (8), + * privilegeWithdrawn (9), + * aACompromise (10) } + */ +# define OCSP_REVOKED_STATUS_NOSTATUS -1 +# define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +# define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +# define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +# define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +# define OCSP_REVOKED_STATUS_SUPERSEDED 4 +# define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +# define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +# define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 +# define OCSP_REVOKED_STATUS_PRIVILEGEWITHDRAWN 9 +# define OCSP_REVOKED_STATUS_AACOMPROMISE 10 + + +# ifndef OPENSSL_NO_OCSP + +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +/* Various flags and values */ + +# define OCSP_DEFAULT_NONCE_LENGTH 16 + +# define OCSP_NOCERTS 0x1 +# define OCSP_NOINTERN 0x2 +# define OCSP_NOSIGS 0x4 +# define OCSP_NOCHAIN 0x8 +# define OCSP_NOVERIFY 0x10 +# define OCSP_NOEXPLICIT 0x20 +# define OCSP_NOCASIGN 0x40 +# define OCSP_NODELEGATED 0x80 +# define OCSP_NOCHECKS 0x100 +# define OCSP_TRUSTOTHER 0x200 +# define OCSP_RESPID_KEY 0x400 +# define OCSP_NOTIME 0x800 +# define OCSP_PARTIAL_CHAIN 0x1000 + +typedef struct ocsp_cert_id_st OCSP_CERTID; +typedef struct ocsp_one_request_st OCSP_ONEREQ; +typedef struct ocsp_req_info_st OCSP_REQINFO; +typedef struct ocsp_signature_st OCSP_SIGNATURE; +typedef struct ocsp_request_st OCSP_REQUEST; + +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_CERTID, OCSP_CERTID, OCSP_CERTID) +#define sk_OCSP_CERTID_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_value(sk, idx) ((OCSP_CERTID *)OPENSSL_sk_value(ossl_check_const_OCSP_CERTID_sk_type(sk), (idx))) +#define sk_OCSP_CERTID_new(cmp) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new(ossl_check_OCSP_CERTID_compfunc_type(cmp))) +#define sk_OCSP_CERTID_new_null() ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new_null()) +#define sk_OCSP_CERTID_new_reserve(cmp, n) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_CERTID_compfunc_type(cmp), (n))) +#define sk_OCSP_CERTID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_CERTID_sk_type(sk), (n)) +#define sk_OCSP_CERTID_free(sk) OPENSSL_sk_free(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_delete(sk, i) ((OCSP_CERTID *)OPENSSL_sk_delete(ossl_check_OCSP_CERTID_sk_type(sk), (i))) +#define sk_OCSP_CERTID_delete_ptr(sk, ptr) ((OCSP_CERTID *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr))) +#define sk_OCSP_CERTID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_pop(sk) ((OCSP_CERTID *)OPENSSL_sk_pop(ossl_check_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_shift(sk) ((OCSP_CERTID *)OPENSSL_sk_shift(ossl_check_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_CERTID_sk_type(sk),ossl_check_OCSP_CERTID_freefunc_type(freefunc)) +#define sk_OCSP_CERTID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr), (idx)) +#define sk_OCSP_CERTID_set(sk, idx, ptr) ((OCSP_CERTID *)OPENSSL_sk_set(ossl_check_OCSP_CERTID_sk_type(sk), (idx), ossl_check_OCSP_CERTID_type(ptr))) +#define sk_OCSP_CERTID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr), pnum) +#define sk_OCSP_CERTID_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_dup(sk) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_dup(ossl_check_const_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_copyfunc_type(copyfunc), ossl_check_OCSP_CERTID_freefunc_type(freefunc))) +#define sk_OCSP_CERTID_set_cmp_func(sk, cmp) ((sk_OCSP_CERTID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_ONEREQ, OCSP_ONEREQ, OCSP_ONEREQ) +#define sk_OCSP_ONEREQ_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_value(sk, idx) ((OCSP_ONEREQ *)OPENSSL_sk_value(ossl_check_const_OCSP_ONEREQ_sk_type(sk), (idx))) +#define sk_OCSP_ONEREQ_new(cmp) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new(ossl_check_OCSP_ONEREQ_compfunc_type(cmp))) +#define sk_OCSP_ONEREQ_new_null() ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new_null()) +#define sk_OCSP_ONEREQ_new_reserve(cmp, n) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_ONEREQ_compfunc_type(cmp), (n))) +#define sk_OCSP_ONEREQ_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_ONEREQ_sk_type(sk), (n)) +#define sk_OCSP_ONEREQ_free(sk) OPENSSL_sk_free(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_delete(sk, i) ((OCSP_ONEREQ *)OPENSSL_sk_delete(ossl_check_OCSP_ONEREQ_sk_type(sk), (i))) +#define sk_OCSP_ONEREQ_delete_ptr(sk, ptr) ((OCSP_ONEREQ *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr))) +#define sk_OCSP_ONEREQ_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_pop(sk) ((OCSP_ONEREQ *)OPENSSL_sk_pop(ossl_check_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_shift(sk) ((OCSP_ONEREQ *)OPENSSL_sk_shift(ossl_check_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_ONEREQ_sk_type(sk),ossl_check_OCSP_ONEREQ_freefunc_type(freefunc)) +#define sk_OCSP_ONEREQ_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr), (idx)) +#define sk_OCSP_ONEREQ_set(sk, idx, ptr) ((OCSP_ONEREQ *)OPENSSL_sk_set(ossl_check_OCSP_ONEREQ_sk_type(sk), (idx), ossl_check_OCSP_ONEREQ_type(ptr))) +#define sk_OCSP_ONEREQ_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr), pnum) +#define sk_OCSP_ONEREQ_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_dup(sk) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_dup(ossl_check_const_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_copyfunc_type(copyfunc), ossl_check_OCSP_ONEREQ_freefunc_type(freefunc))) +#define sk_OCSP_ONEREQ_set_cmp_func(sk, cmp) ((sk_OCSP_ONEREQ_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_compfunc_type(cmp))) + + +# define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +# define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +# define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +# define OCSP_RESPONSE_STATUS_TRYLATER 3 +# define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +# define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +typedef struct ocsp_resp_bytes_st OCSP_RESPBYTES; + +# define V_OCSP_RESPID_NAME 0 +# define V_OCSP_RESPID_KEY 1 + +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_RESPID, OCSP_RESPID, OCSP_RESPID) +#define sk_OCSP_RESPID_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_value(sk, idx) ((OCSP_RESPID *)OPENSSL_sk_value(ossl_check_const_OCSP_RESPID_sk_type(sk), (idx))) +#define sk_OCSP_RESPID_new(cmp) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new(ossl_check_OCSP_RESPID_compfunc_type(cmp))) +#define sk_OCSP_RESPID_new_null() ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new_null()) +#define sk_OCSP_RESPID_new_reserve(cmp, n) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_RESPID_compfunc_type(cmp), (n))) +#define sk_OCSP_RESPID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_RESPID_sk_type(sk), (n)) +#define sk_OCSP_RESPID_free(sk) OPENSSL_sk_free(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_delete(sk, i) ((OCSP_RESPID *)OPENSSL_sk_delete(ossl_check_OCSP_RESPID_sk_type(sk), (i))) +#define sk_OCSP_RESPID_delete_ptr(sk, ptr) ((OCSP_RESPID *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr))) +#define sk_OCSP_RESPID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_pop(sk) ((OCSP_RESPID *)OPENSSL_sk_pop(ossl_check_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_shift(sk) ((OCSP_RESPID *)OPENSSL_sk_shift(ossl_check_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_RESPID_sk_type(sk),ossl_check_OCSP_RESPID_freefunc_type(freefunc)) +#define sk_OCSP_RESPID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr), (idx)) +#define sk_OCSP_RESPID_set(sk, idx, ptr) ((OCSP_RESPID *)OPENSSL_sk_set(ossl_check_OCSP_RESPID_sk_type(sk), (idx), ossl_check_OCSP_RESPID_type(ptr))) +#define sk_OCSP_RESPID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr), pnum) +#define sk_OCSP_RESPID_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_dup(sk) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_dup(ossl_check_const_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_copyfunc_type(copyfunc), ossl_check_OCSP_RESPID_freefunc_type(freefunc))) +#define sk_OCSP_RESPID_set_cmp_func(sk, cmp) ((sk_OCSP_RESPID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_compfunc_type(cmp))) + + +typedef struct ocsp_revoked_info_st OCSP_REVOKEDINFO; + +# define V_OCSP_CERTSTATUS_GOOD 0 +# define V_OCSP_CERTSTATUS_REVOKED 1 +# define V_OCSP_CERTSTATUS_UNKNOWN 2 + +typedef struct ocsp_cert_status_st OCSP_CERTSTATUS; +typedef struct ocsp_single_response_st OCSP_SINGLERESP; + +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_SINGLERESP, OCSP_SINGLERESP, OCSP_SINGLERESP) +#define sk_OCSP_SINGLERESP_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_value(sk, idx) ((OCSP_SINGLERESP *)OPENSSL_sk_value(ossl_check_const_OCSP_SINGLERESP_sk_type(sk), (idx))) +#define sk_OCSP_SINGLERESP_new(cmp) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new(ossl_check_OCSP_SINGLERESP_compfunc_type(cmp))) +#define sk_OCSP_SINGLERESP_new_null() ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new_null()) +#define sk_OCSP_SINGLERESP_new_reserve(cmp, n) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_SINGLERESP_compfunc_type(cmp), (n))) +#define sk_OCSP_SINGLERESP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_SINGLERESP_sk_type(sk), (n)) +#define sk_OCSP_SINGLERESP_free(sk) OPENSSL_sk_free(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_delete(sk, i) ((OCSP_SINGLERESP *)OPENSSL_sk_delete(ossl_check_OCSP_SINGLERESP_sk_type(sk), (i))) +#define sk_OCSP_SINGLERESP_delete_ptr(sk, ptr) ((OCSP_SINGLERESP *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr))) +#define sk_OCSP_SINGLERESP_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_pop(sk) ((OCSP_SINGLERESP *)OPENSSL_sk_pop(ossl_check_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_shift(sk) ((OCSP_SINGLERESP *)OPENSSL_sk_shift(ossl_check_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_SINGLERESP_sk_type(sk),ossl_check_OCSP_SINGLERESP_freefunc_type(freefunc)) +#define sk_OCSP_SINGLERESP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr), (idx)) +#define sk_OCSP_SINGLERESP_set(sk, idx, ptr) ((OCSP_SINGLERESP *)OPENSSL_sk_set(ossl_check_OCSP_SINGLERESP_sk_type(sk), (idx), ossl_check_OCSP_SINGLERESP_type(ptr))) +#define sk_OCSP_SINGLERESP_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr), pnum) +#define sk_OCSP_SINGLERESP_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_dup(sk) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_dup(ossl_check_const_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_copyfunc_type(copyfunc), ossl_check_OCSP_SINGLERESP_freefunc_type(freefunc))) +#define sk_OCSP_SINGLERESP_set_cmp_func(sk, cmp) ((sk_OCSP_SINGLERESP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_compfunc_type(cmp))) + + +typedef struct ocsp_response_data_st OCSP_RESPDATA; + +typedef struct ocsp_basic_response_st OCSP_BASICRESP; + +typedef struct ocsp_crl_id_st OCSP_CRLID; +typedef struct ocsp_service_locator_st OCSP_SERVICELOC; + +# define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +# define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +# define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p) + +# define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p) + +# define PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ + (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST, \ + bp,(char **)(x),cb,NULL) + +# define PEM_read_bio_OCSP_RESPONSE(bp,x,cb) (OCSP_RESPONSE *)PEM_ASN1_read_bio(\ + (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE, \ + bp,(char **)(x),cb,NULL) + +# define PEM_write_bio_OCSP_REQUEST(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\ + bp,(char *)(o), NULL,NULL,0,NULL,NULL) + +# define PEM_write_bio_OCSP_RESPONSE(bp,o) \ + PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\ + bp,(char *)(o), NULL,NULL,0,NULL,NULL) + +# define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o) + +# define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o) + +# define ASN1_BIT_STRING_digest(data,type,md,len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len) + +# define OCSP_CERTSTATUS_dup(cs)\ + (OCSP_CERTSTATUS*)ASN1_dup((i2d_of_void *)i2d_OCSP_CERTSTATUS,\ + (d2i_of_void *)d2i_OCSP_CERTSTATUS,(char *)(cs)) + +DECLARE_ASN1_DUP_FUNCTION(OCSP_CERTID) + +OSSL_HTTP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, + const OCSP_REQUEST *req, int buf_size); +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef OSSL_HTTP_REQ_CTX OCSP_REQ_CTX; +# define OCSP_REQ_CTX_new(io, buf_size) \ + OSSL_HTTP_REQ_CTX_new(io, io, buf_size) +# define OCSP_REQ_CTX_free OSSL_HTTP_REQ_CTX_free +# define OCSP_REQ_CTX_http(rctx, op, path) \ + (OSSL_HTTP_REQ_CTX_set_expected(rctx, NULL, 1 /* asn1 */, 0, 0) && \ + OSSL_HTTP_REQ_CTX_set_request_line(rctx, strcmp(op, "POST") == 0, \ + NULL, NULL, path)) +# define OCSP_REQ_CTX_add1_header OSSL_HTTP_REQ_CTX_add1_header +# define OCSP_REQ_CTX_i2d(r, it, req) \ + OSSL_HTTP_REQ_CTX_set1_req(r, "application/ocsp-request", it, req) +# define OCSP_REQ_CTX_set1_req(r, req) \ + OCSP_REQ_CTX_i2d(r, ASN1_ITEM_rptr(OCSP_REQUEST), (ASN1_VALUE *)(req)) +# define OCSP_REQ_CTX_nbio OSSL_HTTP_REQ_CTX_nbio +# define OCSP_REQ_CTX_nbio_d2i OSSL_HTTP_REQ_CTX_nbio_d2i +# define OCSP_sendreq_nbio(p, r) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(r, (ASN1_VALUE **)(p), \ + ASN1_ITEM_rptr(OCSP_RESPONSE)) +# define OCSP_REQ_CTX_get0_mem_bio OSSL_HTTP_REQ_CTX_get0_mem_bio +# define OCSP_set_max_response_length OSSL_HTTP_REQ_CTX_set_max_response_length +# endif + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, const X509 *subject, + const X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + const X509_NAME *issuerName, + const ASN1_BIT_STRING *issuerKey, + const ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, const X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, + X509 *signer, + EVP_PKEY *key, + const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +const ASN1_OCTET_STRING *OCSP_resp_get0_signature(const OCSP_BASICRESP *bs); +const X509_ALGOR *OCSP_resp_get0_tbs_sigalg(const OCSP_BASICRESP *bs); +const OCSP_RESPDATA *OCSP_resp_get0_respdata(const OCSP_BASICRESP *bs); +int OCSP_resp_get0_signer(OCSP_BASICRESP *bs, X509 **signer, + STACK_OF(X509) *extra_certs); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +const ASN1_GENERALIZEDTIME *OCSP_resp_get0_produced_at(const OCSP_BASICRESP* bs); +const STACK_OF(X509) *OCSP_resp_get0_certs(const OCSP_BASICRESP *bs); +int OCSP_resp_get0_id(const OCSP_BASICRESP *bs, + const ASN1_OCTET_STRING **pid, + const X509_NAME **pname); +int OCSP_resp_get1_id(const OCSP_BASICRESP *bs, + ASN1_OCTET_STRING **pid, + X509_NAME **pname); + +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +# define OCSP_parse_url(url, host, port, path, ssl) \ + OSSL_HTTP_parse_url(url, ssl, NULL, host, port, NULL, path, NULL, NULL) + +int OCSP_id_issuer_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); +int OCSP_id_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, + ASN1_INTEGER **pserial, OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, + OCSP_CERTID *cid, + int status, int reason, + ASN1_TIME *revtime, + ASN1_TIME *thisupd, + ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, + X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); +int OCSP_basic_sign_ctx(OCSP_BASICRESP *brsp, + X509 *signer, EVP_MD_CTX *ctx, + STACK_OF(X509) *certs, unsigned long flags); +int OCSP_RESPID_set_by_name(OCSP_RESPID *respid, X509 *cert); +int OCSP_RESPID_set_by_key_ex(OCSP_RESPID *respid, X509 *cert, + OSSL_LIB_CTX *libctx, const char *propq); +int OCSP_RESPID_set_by_key(OCSP_RESPID *respid, X509 *cert); +int OCSP_RESPID_match_ex(OCSP_RESPID *respid, X509 *cert, OSSL_LIB_CTX *libctx, + const char *propq); +int OCSP_RESPID_match(OCSP_RESPID *respid, X509 *cert); + +X509_EXTENSION *OCSP_crlID_new(const char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char *tim); + +X509_EXTENSION *OCSP_url_svcloc_new(const X509_NAME *issuer, const char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, + int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, const ASN1_OBJECT *obj, int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, + int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, + int *idx); +int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); +const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *x); + +DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) +DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) +DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) +DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) +DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) +DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) +DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) + +const char *OCSP_response_status_str(long s); +const char *OCSP_cert_status_str(long s); +const char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST *a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + + +# ifdef __cplusplus +} +# endif +# endif /* !defined(OPENSSL_NO_OCSP) */ +#endif diff --git a/OtherInc/openssl/include/openssl/ocsperr.h b/OtherInc/openssl/include/openssl/ocsperr.h new file mode 100644 index 0000000..46a0523 --- /dev/null +++ b/OtherInc/openssl/include/openssl/ocsperr.h @@ -0,0 +1,53 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_OCSPERR_H +# define OPENSSL_OCSPERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_OCSP + + +/* + * OCSP reason codes. + */ +# define OCSP_R_CERTIFICATE_VERIFY_ERROR 101 +# define OCSP_R_DIGEST_ERR 102 +# define OCSP_R_DIGEST_NAME_ERR 106 +# define OCSP_R_DIGEST_SIZE_ERR 107 +# define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD 122 +# define OCSP_R_ERROR_IN_THISUPDATE_FIELD 123 +# define OCSP_R_MISSING_OCSPSIGNING_USAGE 103 +# define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE 124 +# define OCSP_R_NOT_BASIC_RESPONSE 104 +# define OCSP_R_NO_CERTIFICATES_IN_CHAIN 105 +# define OCSP_R_NO_RESPONSE_DATA 108 +# define OCSP_R_NO_REVOKED_TIME 109 +# define OCSP_R_NO_SIGNER_KEY 130 +# define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 110 +# define OCSP_R_REQUEST_NOT_SIGNED 128 +# define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA 111 +# define OCSP_R_ROOT_CA_NOT_TRUSTED 112 +# define OCSP_R_SIGNATURE_FAILURE 117 +# define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND 118 +# define OCSP_R_STATUS_EXPIRED 125 +# define OCSP_R_STATUS_NOT_YET_VALID 126 +# define OCSP_R_STATUS_TOO_OLD 127 +# define OCSP_R_UNKNOWN_MESSAGE_DIGEST 119 +# define OCSP_R_UNKNOWN_NID 120 +# define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE 129 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/opensslconf.h b/OtherInc/openssl/include/openssl/opensslconf.h new file mode 100644 index 0000000..1e83371 --- /dev/null +++ b/OtherInc/openssl/include/openssl/opensslconf.h @@ -0,0 +1,17 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_OPENSSLCONF_H +# define OPENSSL_OPENSSLCONF_H +# pragma once + +# include +# include + +#endif /* OPENSSL_OPENSSLCONF_H */ diff --git a/OtherInc/openssl/include/openssl/opensslv.h b/OtherInc/openssl/include/openssl/opensslv.h new file mode 100644 index 0000000..01cf113 --- /dev/null +++ b/OtherInc/openssl/include/openssl/opensslv.h @@ -0,0 +1,114 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\opensslv.h.in + * + * Copyright 1999-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_OPENSSLV_H +# define OPENSSL_OPENSSLV_H +# pragma once + +# ifdef __cplusplus +extern "C" { +# endif + +/* + * SECTION 1: VERSION DATA. These will change for each release + */ + +/* + * Base version macros + * + * These macros express version number MAJOR.MINOR.PATCH exactly + */ +# define OPENSSL_VERSION_MAJOR 3 +# define OPENSSL_VERSION_MINOR 0 +# define OPENSSL_VERSION_PATCH 3 + +/* + * Additional version information + * + * These are also part of the new version scheme, but aren't part + * of the version number itself. + */ + +/* Could be: #define OPENSSL_VERSION_PRE_RELEASE "-alpha.1" */ +# define OPENSSL_VERSION_PRE_RELEASE "" +/* Could be: #define OPENSSL_VERSION_BUILD_METADATA "+fips" */ +/* Could be: #define OPENSSL_VERSION_BUILD_METADATA "+vendor.1" */ +# define OPENSSL_VERSION_BUILD_METADATA "" + +/* + * Note: The OpenSSL Project will never define OPENSSL_VERSION_BUILD_METADATA + * to be anything but the empty string. Its use is entirely reserved for + * others + */ + +/* + * Shared library version + * + * This is strictly to express ABI version, which may or may not + * be related to the API version expressed with the macros above. + * This is defined in free form. + */ +# define OPENSSL_SHLIB_VERSION 3 + +/* + * SECTION 2: USEFUL MACROS + */ + +/* For checking general API compatibility when preprocessing */ +# define OPENSSL_VERSION_PREREQ(maj,min) \ + ((OPENSSL_VERSION_MAJOR << 16) + OPENSSL_VERSION_MINOR >= ((maj) << 16) + (min)) + +/* + * Macros to get the version in easily digested string form, both the short + * "MAJOR.MINOR.PATCH" variant (where MAJOR, MINOR and PATCH are replaced + * with the values from the corresponding OPENSSL_VERSION_ macros) and the + * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and + * OPENSSL_VERSION_BUILD_METADATA_STR appended. + */ +# define OPENSSL_VERSION_STR "3.0.3" +# define OPENSSL_FULL_VERSION_STR "3.0.3" + +/* + * SECTION 3: ADDITIONAL METADATA + * + * These strings are defined separately to allow them to be parsable. + */ +# define OPENSSL_RELEASE_DATE "3 May 2022" + +/* + * SECTION 4: BACKWARD COMPATIBILITY + */ + +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.3 3 May 2022" + +/* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */ +# ifdef OPENSSL_VERSION_PRE_RELEASE +# define _OPENSSL_VERSION_PRE_RELEASE 0x0L +# else +# define _OPENSSL_VERSION_PRE_RELEASE 0xfL +# endif +# define OPENSSL_VERSION_NUMBER \ + ( (OPENSSL_VERSION_MAJOR<<28) \ + |(OPENSSL_VERSION_MINOR<<20) \ + |(OPENSSL_VERSION_PATCH<<4) \ + |_OPENSSL_VERSION_PRE_RELEASE ) + +# ifdef __cplusplus +} +# endif + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_OPENSSLV_H +# endif + +#endif /* OPENSSL_OPENSSLV_H */ diff --git a/OtherInc/openssl/include/openssl/ossl_typ.h b/OtherInc/openssl/include/openssl/ossl_typ.h new file mode 100644 index 0000000..82a5898 --- /dev/null +++ b/OtherInc/openssl/include/openssl/ossl_typ.h @@ -0,0 +1,16 @@ +/* + * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * The original was renamed to + * + * This header file only exists for compatibility reasons with older + * applications which #include . + */ +# include diff --git a/OtherInc/openssl/include/openssl/param_build.h b/OtherInc/openssl/include/openssl/param_build.h new file mode 100644 index 0000000..f29fdb2 --- /dev/null +++ b/OtherInc/openssl/include/openssl/param_build.h @@ -0,0 +1,63 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PARAM_BUILD_H +# define OPENSSL_PARAM_BUILD_H +# pragma once + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +OSSL_PARAM_BLD *OSSL_PARAM_BLD_new(void); +OSSL_PARAM *OSSL_PARAM_BLD_to_param(OSSL_PARAM_BLD *bld); +void OSSL_PARAM_BLD_free(OSSL_PARAM_BLD *bld); + +int OSSL_PARAM_BLD_push_int(OSSL_PARAM_BLD *bld, const char *key, int val); +int OSSL_PARAM_BLD_push_uint(OSSL_PARAM_BLD *bld, const char *key, + unsigned int val); +int OSSL_PARAM_BLD_push_long(OSSL_PARAM_BLD *bld, const char *key, + long int val); +int OSSL_PARAM_BLD_push_ulong(OSSL_PARAM_BLD *bld, const char *key, + unsigned long int val); +int OSSL_PARAM_BLD_push_int32(OSSL_PARAM_BLD *bld, const char *key, + int32_t val); +int OSSL_PARAM_BLD_push_uint32(OSSL_PARAM_BLD *bld, const char *key, + uint32_t val); +int OSSL_PARAM_BLD_push_int64(OSSL_PARAM_BLD *bld, const char *key, + int64_t val); +int OSSL_PARAM_BLD_push_uint64(OSSL_PARAM_BLD *bld, const char *key, + uint64_t val); +int OSSL_PARAM_BLD_push_size_t(OSSL_PARAM_BLD *bld, const char *key, + size_t val); +int OSSL_PARAM_BLD_push_time_t(OSSL_PARAM_BLD *bld, const char *key, + time_t val); +int OSSL_PARAM_BLD_push_double(OSSL_PARAM_BLD *bld, const char *key, + double val); +int OSSL_PARAM_BLD_push_BN(OSSL_PARAM_BLD *bld, const char *key, + const BIGNUM *bn); +int OSSL_PARAM_BLD_push_BN_pad(OSSL_PARAM_BLD *bld, const char *key, + const BIGNUM *bn, size_t sz); +int OSSL_PARAM_BLD_push_utf8_string(OSSL_PARAM_BLD *bld, const char *key, + const char *buf, size_t bsize); +int OSSL_PARAM_BLD_push_utf8_ptr(OSSL_PARAM_BLD *bld, const char *key, + char *buf, size_t bsize); +int OSSL_PARAM_BLD_push_octet_string(OSSL_PARAM_BLD *bld, const char *key, + const void *buf, size_t bsize); +int OSSL_PARAM_BLD_push_octet_ptr(OSSL_PARAM_BLD *bld, const char *key, + void *buf, size_t bsize); + +# ifdef __cplusplus +} +# endif +#endif /* OPENSSL_PARAM_BUILD_H */ diff --git a/OtherInc/openssl/include/openssl/params.h b/OtherInc/openssl/include/openssl/params.h new file mode 100644 index 0000000..d75eab0 --- /dev/null +++ b/OtherInc/openssl/include/openssl/params.h @@ -0,0 +1,160 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PARAMS_H +# define OPENSSL_PARAMS_H +# pragma once + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# define OSSL_PARAM_UNMODIFIED ((size_t)-1) + +# define OSSL_PARAM_END \ + { NULL, 0, NULL, 0, 0 } + +# define OSSL_PARAM_DEFN(key, type, addr, sz) \ + { (key), (type), (addr), (sz), OSSL_PARAM_UNMODIFIED } + +/* Basic parameter types without return sizes */ +# define OSSL_PARAM_int(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_INTEGER, (addr), sizeof(int)) +# define OSSL_PARAM_uint(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_UNSIGNED_INTEGER, (addr), \ + sizeof(unsigned int)) +# define OSSL_PARAM_long(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_INTEGER, (addr), sizeof(long int)) +# define OSSL_PARAM_ulong(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_UNSIGNED_INTEGER, (addr), \ + sizeof(unsigned long int)) +# define OSSL_PARAM_int32(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_INTEGER, (addr), sizeof(int32_t)) +# define OSSL_PARAM_uint32(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_UNSIGNED_INTEGER, (addr), \ + sizeof(uint32_t)) +# define OSSL_PARAM_int64(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_INTEGER, (addr), sizeof(int64_t)) +# define OSSL_PARAM_uint64(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_UNSIGNED_INTEGER, (addr), \ + sizeof(uint64_t)) +# define OSSL_PARAM_size_t(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_UNSIGNED_INTEGER, (addr), sizeof(size_t)) +# define OSSL_PARAM_time_t(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_INTEGER, (addr), sizeof(time_t)) +# define OSSL_PARAM_double(key, addr) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_REAL, (addr), sizeof(double)) + +# define OSSL_PARAM_BN(key, bn, sz) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_UNSIGNED_INTEGER, (bn), (sz)) +# define OSSL_PARAM_utf8_string(key, addr, sz) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_UTF8_STRING, (addr), sz) +# define OSSL_PARAM_octet_string(key, addr, sz) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_OCTET_STRING, (addr), sz) + +# define OSSL_PARAM_utf8_ptr(key, addr, sz) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_UTF8_PTR, (addr), sz) +# define OSSL_PARAM_octet_ptr(key, addr, sz) \ + OSSL_PARAM_DEFN((key), OSSL_PARAM_OCTET_PTR, (addr), sz) + +/* Search an OSSL_PARAM array for a matching name */ +OSSL_PARAM *OSSL_PARAM_locate(OSSL_PARAM *p, const char *key); +const OSSL_PARAM *OSSL_PARAM_locate_const(const OSSL_PARAM *p, const char *key); + +/* Basic parameter type run-time construction */ +OSSL_PARAM OSSL_PARAM_construct_int(const char *key, int *buf); +OSSL_PARAM OSSL_PARAM_construct_uint(const char *key, unsigned int *buf); +OSSL_PARAM OSSL_PARAM_construct_long(const char *key, long int *buf); +OSSL_PARAM OSSL_PARAM_construct_ulong(const char *key, unsigned long int *buf); +OSSL_PARAM OSSL_PARAM_construct_int32(const char *key, int32_t *buf); +OSSL_PARAM OSSL_PARAM_construct_uint32(const char *key, uint32_t *buf); +OSSL_PARAM OSSL_PARAM_construct_int64(const char *key, int64_t *buf); +OSSL_PARAM OSSL_PARAM_construct_uint64(const char *key, uint64_t *buf); +OSSL_PARAM OSSL_PARAM_construct_size_t(const char *key, size_t *buf); +OSSL_PARAM OSSL_PARAM_construct_time_t(const char *key, time_t *buf); +OSSL_PARAM OSSL_PARAM_construct_BN(const char *key, unsigned char *buf, + size_t bsize); +OSSL_PARAM OSSL_PARAM_construct_double(const char *key, double *buf); +OSSL_PARAM OSSL_PARAM_construct_utf8_string(const char *key, char *buf, + size_t bsize); +OSSL_PARAM OSSL_PARAM_construct_utf8_ptr(const char *key, char **buf, + size_t bsize); +OSSL_PARAM OSSL_PARAM_construct_octet_string(const char *key, void *buf, + size_t bsize); +OSSL_PARAM OSSL_PARAM_construct_octet_ptr(const char *key, void **buf, + size_t bsize); +OSSL_PARAM OSSL_PARAM_construct_end(void); + +int OSSL_PARAM_allocate_from_text(OSSL_PARAM *to, + const OSSL_PARAM *paramdefs, + const char *key, const char *value, + size_t value_n, int *found); + +int OSSL_PARAM_get_int(const OSSL_PARAM *p, int *val); +int OSSL_PARAM_get_uint(const OSSL_PARAM *p, unsigned int *val); +int OSSL_PARAM_get_long(const OSSL_PARAM *p, long int *val); +int OSSL_PARAM_get_ulong(const OSSL_PARAM *p, unsigned long int *val); +int OSSL_PARAM_get_int32(const OSSL_PARAM *p, int32_t *val); +int OSSL_PARAM_get_uint32(const OSSL_PARAM *p, uint32_t *val); +int OSSL_PARAM_get_int64(const OSSL_PARAM *p, int64_t *val); +int OSSL_PARAM_get_uint64(const OSSL_PARAM *p, uint64_t *val); +int OSSL_PARAM_get_size_t(const OSSL_PARAM *p, size_t *val); +int OSSL_PARAM_get_time_t(const OSSL_PARAM *p, time_t *val); + +int OSSL_PARAM_set_int(OSSL_PARAM *p, int val); +int OSSL_PARAM_set_uint(OSSL_PARAM *p, unsigned int val); +int OSSL_PARAM_set_long(OSSL_PARAM *p, long int val); +int OSSL_PARAM_set_ulong(OSSL_PARAM *p, unsigned long int val); +int OSSL_PARAM_set_int32(OSSL_PARAM *p, int32_t val); +int OSSL_PARAM_set_uint32(OSSL_PARAM *p, uint32_t val); +int OSSL_PARAM_set_int64(OSSL_PARAM *p, int64_t val); +int OSSL_PARAM_set_uint64(OSSL_PARAM *p, uint64_t val); +int OSSL_PARAM_set_size_t(OSSL_PARAM *p, size_t val); +int OSSL_PARAM_set_time_t(OSSL_PARAM *p, time_t val); + +int OSSL_PARAM_get_double(const OSSL_PARAM *p, double *val); +int OSSL_PARAM_set_double(OSSL_PARAM *p, double val); + +int OSSL_PARAM_get_BN(const OSSL_PARAM *p, BIGNUM **val); +int OSSL_PARAM_set_BN(OSSL_PARAM *p, const BIGNUM *val); + +int OSSL_PARAM_get_utf8_string(const OSSL_PARAM *p, char **val, size_t max_len); +int OSSL_PARAM_set_utf8_string(OSSL_PARAM *p, const char *val); + +int OSSL_PARAM_get_octet_string(const OSSL_PARAM *p, void **val, size_t max_len, + size_t *used_len); +int OSSL_PARAM_set_octet_string(OSSL_PARAM *p, const void *val, size_t len); + +int OSSL_PARAM_get_utf8_ptr(const OSSL_PARAM *p, const char **val); +int OSSL_PARAM_set_utf8_ptr(OSSL_PARAM *p, const char *val); + +int OSSL_PARAM_get_octet_ptr(const OSSL_PARAM *p, const void **val, + size_t *used_len); +int OSSL_PARAM_set_octet_ptr(OSSL_PARAM *p, const void *val, + size_t used_len); + +int OSSL_PARAM_get_utf8_string_ptr(const OSSL_PARAM *p, const char **val); +int OSSL_PARAM_get_octet_string_ptr(const OSSL_PARAM *p, const void **val, + size_t *used_len); + +int OSSL_PARAM_modified(const OSSL_PARAM *p); +void OSSL_PARAM_set_all_unmodified(OSSL_PARAM *p); + +OSSL_PARAM *OSSL_PARAM_dup(const OSSL_PARAM *p); +OSSL_PARAM *OSSL_PARAM_merge(const OSSL_PARAM *p1, const OSSL_PARAM *p2); +void OSSL_PARAM_free(OSSL_PARAM *p); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/pem.h b/OtherInc/openssl/include/openssl/pem.h new file mode 100644 index 0000000..80940df --- /dev/null +++ b/OtherInc/openssl/include/openssl/pem.h @@ -0,0 +1,538 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PEM_H +# define OPENSSL_PEM_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_PEM_H +# endif + +# include +# include +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PEM_BUFSIZE 1024 + +# define PEM_STRING_X509_OLD "X509 CERTIFICATE" +# define PEM_STRING_X509 "CERTIFICATE" +# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" +# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" +# define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" +# define PEM_STRING_X509_CRL "X509 CRL" +# define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" +# define PEM_STRING_PUBLIC "PUBLIC KEY" +# define PEM_STRING_RSA "RSA PRIVATE KEY" +# define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" +# define PEM_STRING_DSA "DSA PRIVATE KEY" +# define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" +# define PEM_STRING_PKCS7 "PKCS7" +# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" +# define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" +# define PEM_STRING_PKCS8INF "PRIVATE KEY" +# define PEM_STRING_DHPARAMS "DH PARAMETERS" +# define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" +# define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" +# define PEM_STRING_DSAPARAMS "DSA PARAMETERS" +# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" +# define PEM_STRING_ECPARAMETERS "EC PARAMETERS" +# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" +# define PEM_STRING_PARAMETERS "PARAMETERS" +# define PEM_STRING_CMS "CMS" + +# define PEM_TYPE_ENCRYPTED 10 +# define PEM_TYPE_MIC_ONLY 20 +# define PEM_TYPE_MIC_CLEAR 30 +# define PEM_TYPE_CLEAR 40 + +/* + * These macros make the PEM_read/PEM_write functions easier to maintain and + * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or + * IMPLEMENT_PEM_rw_cb(...) + */ + +# define PEM_read_cb_fnsig(name, type, INTYPE, readname) \ + type *PEM_##readname##_##name(INTYPE *out, type **x, \ + pem_password_cb *cb, void *u) +# define PEM_read_cb_ex_fnsig(name, type, INTYPE, readname) \ + type *PEM_##readname##_##name##_ex(INTYPE *out, type **x, \ + pem_password_cb *cb, void *u, \ + OSSL_LIB_CTX *libctx, \ + const char *propq) + +# define PEM_write_fnsig(name, type, OUTTYPE, writename) \ + int PEM_##writename##_##name(OUTTYPE *out, const type *x) +# define PEM_write_cb_fnsig(name, type, OUTTYPE, writename) \ + int PEM_##writename##_##name(OUTTYPE *out, const type *x, \ + const EVP_CIPHER *enc, \ + const unsigned char *kstr, int klen, \ + pem_password_cb *cb, void *u) +# define PEM_write_ex_fnsig(name, type, OUTTYPE, writename) \ + int PEM_##writename##_##name##_ex(OUTTYPE *out, const type *x, \ + OSSL_LIB_CTX *libctx, \ + const char *propq) +# define PEM_write_cb_ex_fnsig(name, type, OUTTYPE, writename) \ + int PEM_##writename##_##name##_ex(OUTTYPE *out, const type *x, \ + const EVP_CIPHER *enc, \ + const unsigned char *kstr, int klen, \ + pem_password_cb *cb, void *u, \ + OSSL_LIB_CTX *libctx, \ + const char *propq) + +# ifdef OPENSSL_NO_STDIO + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ +# endif +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ +# endif +# else + +# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ + type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str, fp, \ + (void **)x, cb, u); \ + } + +# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ + PEM_write_fnsig(name, type, FILE, write) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1, str, out, \ + x, NULL, NULL, 0, NULL, NULL); \ + } + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp(name, type, str, asn1) +# endif + +# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ + PEM_write_cb_fnsig(name, type, FILE, write) \ + { \ + return PEM_ASN1_write((i2d_of_void *)i2d_##asn1, str, out, \ + x, enc, kstr, klen, cb, u); \ + } + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) +# endif +# endif + +# define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + type *PEM_read_bio_##name(BIO *bp, type **x, \ + pem_password_cb *cb, void *u) \ + { \ + return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str, bp, \ + (void **)x, cb, u); \ + } + +# define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + PEM_write_fnsig(name, type, BIO, write_bio) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1, str, out, \ + x, NULL,NULL,0,NULL,NULL); \ + } + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio(name, type, str, asn1) +# endif + +# define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + PEM_write_cb_fnsig(name, type, BIO, write_bio) \ + { \ + return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1, str, out, \ + x, enc, kstr, klen, cb, u); \ + } + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) +# endif + +# define IMPLEMENT_PEM_write(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp(name, type, str, asn1) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) +# endif + +# define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) +# endif + +# define IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + IMPLEMENT_PEM_read_fp(name, type, str, asn1) + +# define IMPLEMENT_PEM_rw(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write(name, type, str, asn1) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_const(name, type, str, asn1) +# endif + +# define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ + IMPLEMENT_PEM_read(name, type, str, asn1) \ + IMPLEMENT_PEM_write_cb(name, type, str, asn1) + +/* These are the same except they are for the declarations */ + +/* + * The mysterious 'extern' that's passed to some macros is innocuous, + * and is there to quiet pre-C99 compilers that may complain about empty + * arguments in macro calls. + */ +# if defined(OPENSSL_NO_STDIO) + +# define DECLARE_PEM_read_fp_attr(attr, name, type) /**/ +# define DECLARE_PEM_read_fp_ex_attr(attr, name, type) /**/ +# define DECLARE_PEM_write_fp_attr(attr, name, type) /**/ +# define DECLARE_PEM_write_fp_ex_attr(attr, name, type) /**/ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DECLARE_PEM_write_fp_const_attr(attr, name, type) /**/ +# endif +# define DECLARE_PEM_write_cb_fp_attr(attr, name, type) /**/ +# define DECLARE_PEM_write_cb_fp_ex_attr(attr, name, type) /**/ + +# else + +# define DECLARE_PEM_read_fp_attr(attr, name, type) \ + attr PEM_read_cb_fnsig(name, type, FILE, read); +# define DECLARE_PEM_read_fp_ex_attr(attr, name, type) \ + attr PEM_read_cb_fnsig(name, type, FILE, read); \ + attr PEM_read_cb_ex_fnsig(name, type, FILE, read); + +# define DECLARE_PEM_write_fp_attr(attr, name, type) \ + attr PEM_write_fnsig(name, type, FILE, write); +# define DECLARE_PEM_write_fp_ex_attr(attr, name, type) \ + attr PEM_write_fnsig(name, type, FILE, write); \ + attr PEM_write_ex_fnsig(name, type, FILE, write); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DECLARE_PEM_write_fp_const_attr(attr, name, type) \ + attr PEM_write_fnsig(name, type, FILE, write); +# endif +# define DECLARE_PEM_write_cb_fp_attr(attr, name, type) \ + attr PEM_write_cb_fnsig(name, type, FILE, write); +# define DECLARE_PEM_write_cb_fp_ex_attr(attr, name, type) \ + attr PEM_write_cb_fnsig(name, type, FILE, write); \ + attr PEM_write_cb_ex_fnsig(name, type, FILE, write); + +# endif + +# define DECLARE_PEM_read_fp(name, type) \ + DECLARE_PEM_read_fp_attr(extern, name, type) +# define DECLARE_PEM_write_fp(name, type) \ + DECLARE_PEM_write_fp_attr(extern, name, type) +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DECLARE_PEM_write_fp_const(name, type) \ + DECLARE_PEM_write_fp_const_attr(extern, name, type) +# endif +# define DECLARE_PEM_write_cb_fp(name, type) \ + DECLARE_PEM_write_cb_fp_attr(extern, name, type) + +# define DECLARE_PEM_read_bio_attr(attr, name, type) \ + attr PEM_read_cb_fnsig(name, type, BIO, read_bio); +# define DECLARE_PEM_read_bio_ex_attr(attr, name, type) \ + attr PEM_read_cb_fnsig(name, type, BIO, read_bio); \ + attr PEM_read_cb_ex_fnsig(name, type, BIO, read_bio); +# define DECLARE_PEM_read_bio(name, type) \ + DECLARE_PEM_read_bio_attr(extern, name, type) +# define DECLARE_PEM_read_bio_ex(name, type) \ + DECLARE_PEM_read_bio_ex_attr(extern, name, type) + +# define DECLARE_PEM_write_bio_attr(attr, name, type) \ + attr PEM_write_fnsig(name, type, BIO, write_bio); +# define DECLARE_PEM_write_bio_ex_attr(attr, name, type) \ + attr PEM_write_fnsig(name, type, BIO, write_bio); \ + attr PEM_write_ex_fnsig(name, type, BIO, write_bio); +# define DECLARE_PEM_write_bio(name, type) \ + DECLARE_PEM_write_bio_attr(extern, name, type) +# define DECLARE_PEM_write_bio_ex(name, type) \ + DECLARE_PEM_write_bio_ex_attr(extern, name, type) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DECLARE_PEM_write_bio_const_attr(attr, name, type) \ + attr PEM_write_fnsig(name, type, BIO, write_bio); +# define DECLARE_PEM_write_bio_const(name, type) \ + DECLARE_PEM_write_bio_const_attr(extern, name, type) +# endif + +# define DECLARE_PEM_write_cb_bio_attr(attr, name, type) \ + attr PEM_write_cb_fnsig(name, type, BIO, write_bio); +# define DECLARE_PEM_write_cb_bio_ex_attr(attr, name, type) \ + attr PEM_write_cb_fnsig(name, type, BIO, write_bio); \ + attr PEM_write_cb_ex_fnsig(name, type, BIO, write_bio); +# define DECLARE_PEM_write_cb_bio(name, type) \ + DECLARE_PEM_write_cb_bio_attr(extern, name, type) +# define DECLARE_PEM_write_cb_ex_bio(name, type) \ + DECLARE_PEM_write_cb_bio_ex_attr(extern, name, type) + +# define DECLARE_PEM_write_attr(attr, name, type) \ + DECLARE_PEM_write_bio_attr(attr, name, type) \ + DECLARE_PEM_write_fp_attr(attr, name, type) +# define DECLARE_PEM_write_ex_attr(attr, name, type) \ + DECLARE_PEM_write_bio_ex_attr(attr, name, type) \ + DECLARE_PEM_write_fp_ex_attr(attr, name, type) +# define DECLARE_PEM_write(name, type) \ + DECLARE_PEM_write_attr(extern, name, type) +# define DECLARE_PEM_write_ex(name, type) \ + DECLARE_PEM_write_ex_attr(extern, name, type) +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DECLARE_PEM_write_const_attr(attr, name, type) \ + DECLARE_PEM_write_bio_const_attr(attr, name, type) \ + DECLARE_PEM_write_fp_const_attr(attr, name, type) +# define DECLARE_PEM_write_const(name, type) \ + DECLARE_PEM_write_const_attr(extern, name, type) +# endif +# define DECLARE_PEM_write_cb_attr(attr, name, type) \ + DECLARE_PEM_write_cb_bio_attr(attr, name, type) \ + DECLARE_PEM_write_cb_fp_attr(attr, name, type) +# define DECLARE_PEM_write_cb_ex_attr(attr, name, type) \ + DECLARE_PEM_write_cb_bio_ex_attr(attr, name, type) \ + DECLARE_PEM_write_cb_fp_ex_attr(attr, name, type) +# define DECLARE_PEM_write_cb(name, type) \ + DECLARE_PEM_write_cb_attr(extern, name, type) +# define DECLARE_PEM_write_cb_ex(name, type) \ + DECLARE_PEM_write_cb_ex_attr(extern, name, type) +# define DECLARE_PEM_read_attr(attr, name, type) \ + DECLARE_PEM_read_bio_attr(attr, name, type) \ + DECLARE_PEM_read_fp_attr(attr, name, type) +# define DECLARE_PEM_read_ex_attr(attr, name, type) \ + DECLARE_PEM_read_bio_ex_attr(attr, name, type) \ + DECLARE_PEM_read_fp_ex_attr(attr, name, type) +# define DECLARE_PEM_read(name, type) \ + DECLARE_PEM_read_attr(extern, name, type) +# define DECLARE_PEM_read_ex(name, type) \ + DECLARE_PEM_read_ex_attr(extern, name, type) +# define DECLARE_PEM_rw_attr(attr, name, type) \ + DECLARE_PEM_read_attr(attr, name, type) \ + DECLARE_PEM_write_attr(attr, name, type) +# define DECLARE_PEM_rw_ex_attr(attr, name, type) \ + DECLARE_PEM_read_ex_attr(attr, name, type) \ + DECLARE_PEM_write_ex_attr(attr, name, type) +# define DECLARE_PEM_rw(name, type) \ + DECLARE_PEM_rw_attr(extern, name, type) +# define DECLARE_PEM_rw_ex(name, type) \ + DECLARE_PEM_rw_ex_attr(extern, name, type) +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define DECLARE_PEM_rw_const_attr(attr, name, type) \ + DECLARE_PEM_read_attr(attr, name, type) \ + DECLARE_PEM_write_const_attr(attr, name, type) +# define DECLARE_PEM_rw_const(name, type) \ + DECLARE_PEM_rw_const_attr(extern, name, type) +# endif +# define DECLARE_PEM_rw_cb_attr(attr, name, type) \ + DECLARE_PEM_read_attr(attr, name, type) \ + DECLARE_PEM_write_cb_attr(attr, name, type) +# define DECLARE_PEM_rw_cb_ex_attr(attr, name, type) \ + DECLARE_PEM_read_ex_attr(attr, name, type) \ + DECLARE_PEM_write_cb_ex_attr(attr, name, type) +# define DECLARE_PEM_rw_cb(name, type) \ + DECLARE_PEM_rw_cb_attr(extern, name, type) +# define DECLARE_PEM_rw_cb_ex(name, type) \ + DECLARE_PEM_rw_cb_ex_attr(extern, name, type) + +int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); +int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, + pem_password_cb *callback, void *u); + +int PEM_read_bio(BIO *bp, char **name, char **header, + unsigned char **data, long *len); +# define PEM_FLAG_SECURE 0x1 +# define PEM_FLAG_EAY_COMPATIBLE 0x2 +# define PEM_FLAG_ONLY_B64 0x4 +int PEM_read_bio_ex(BIO *bp, char **name, char **header, + unsigned char **data, long *len, unsigned int flags); +int PEM_bytes_read_bio_secmem(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, + void *u); +int PEM_write_bio(BIO *bp, const char *name, const char *hdr, + const unsigned char *data, long len); +int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, + const char *name, BIO *bp, pem_password_cb *cb, + void *u); +void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, + const void *x, const EVP_CIPHER *enc, + const unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +STACK_OF(X509_INFO) +*PEM_X509_INFO_read_bio_ex(BIO *bp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u, OSSL_LIB_CTX *libctx, + const char *propq); + +int PEM_X509_INFO_write_bio(BIO *bp, const X509_INFO *xi, EVP_CIPHER *enc, + const unsigned char *kstr, int klen, + pem_password_cb *cd, void *u); + +#ifndef OPENSSL_NO_STDIO +int PEM_read(FILE *fp, char **name, char **header, + unsigned char **data, long *len); +int PEM_write(FILE *fp, const char *name, const char *hdr, + const unsigned char *data, long len); +void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, + pem_password_cb *cb, void *u); +int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, + const void *x, const EVP_CIPHER *enc, + const unsigned char *kstr, int klen, + pem_password_cb *callback, void *u); +STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, + pem_password_cb *cb, void *u); +STACK_OF(X509_INFO) +*PEM_X509_INFO_read_ex(FILE *fp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, + void *u, OSSL_LIB_CTX *libctx, const char *propq); +#endif + +int PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); +int PEM_SignUpdate(EVP_MD_CTX *ctx, const unsigned char *d, unsigned int cnt); +int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, + unsigned int *siglen, EVP_PKEY *pkey); + +/* The default pem_password_cb that's used internally */ +int PEM_def_callback(char *buf, int num, int rwflag, void *userdata); +void PEM_proc_type(char *buf, int type); +void PEM_dek_info(char *buf, const char *type, int len, const char *str); + +# include + +DECLARE_PEM_rw(X509, X509) +DECLARE_PEM_rw(X509_AUX, X509) +DECLARE_PEM_rw(X509_REQ, X509_REQ) +DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) +DECLARE_PEM_rw(X509_CRL, X509_CRL) +DECLARE_PEM_rw(X509_PUBKEY, X509_PUBKEY) +DECLARE_PEM_rw(PKCS7, PKCS7) +DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) +DECLARE_PEM_rw(PKCS8, X509_SIG) +DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) +# ifndef OPENSSL_NO_DEPRECATED_3_0 +DECLARE_PEM_rw_cb_attr(OSSL_DEPRECATEDIN_3_0, RSAPrivateKey, RSA) +DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, RSAPublicKey, RSA) +DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, RSA_PUBKEY, RSA) +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_DSA +DECLARE_PEM_rw_cb_attr(OSSL_DEPRECATEDIN_3_0, DSAPrivateKey, DSA) +DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, DSA_PUBKEY, DSA) +DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, DSAparams, DSA) +# endif +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_EC +DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, ECPKParameters, EC_GROUP) +DECLARE_PEM_rw_cb_attr(OSSL_DEPRECATEDIN_3_0, ECPrivateKey, EC_KEY) +DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, EC_PUBKEY, EC_KEY) +# endif +# endif + +# ifndef OPENSSL_NO_DH +# ifndef OPENSSL_NO_DEPRECATED_3_0 +DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, DHparams, DH) +DECLARE_PEM_write_attr(OSSL_DEPRECATEDIN_3_0, DHxparams, DH) +# endif +# endif +DECLARE_PEM_rw_cb_ex(PrivateKey, EVP_PKEY) +DECLARE_PEM_rw_ex(PUBKEY, EVP_PKEY) + +int PEM_write_bio_PrivateKey_traditional(BIO *bp, const EVP_PKEY *x, + const EVP_CIPHER *enc, + const unsigned char *kstr, int klen, + pem_password_cb *cb, void *u); + +/* Why do these take a signed char *kstr? */ +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, const EVP_PKEY *x, int nid, + const char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_bio_PKCS8PrivateKey(BIO *, const EVP_PKEY *, const EVP_CIPHER *, + const char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_bio(BIO *bp, const EVP_PKEY *x, const EVP_CIPHER *enc, + const char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, const EVP_PKEY *x, int nid, + const char *kstr, int klen, + pem_password_cb *cb, void *u); +EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +# ifndef OPENSSL_NO_STDIO +int i2d_PKCS8PrivateKey_fp(FILE *fp, const EVP_PKEY *x, const EVP_CIPHER *enc, + const char *kstr, int klen, + pem_password_cb *cb, void *u); +int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, const EVP_PKEY *x, int nid, + const char *kstr, int klen, + pem_password_cb *cb, void *u); +int PEM_write_PKCS8PrivateKey_nid(FILE *fp, const EVP_PKEY *x, int nid, + const char *kstr, int klen, + pem_password_cb *cb, void *u); + +EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, + void *u); + +int PEM_write_PKCS8PrivateKey(FILE *fp, const EVP_PKEY *x, const EVP_CIPHER *enc, + const char *kstr, int klen, + pem_password_cb *cd, void *u); +# endif +EVP_PKEY *PEM_read_bio_Parameters_ex(BIO *bp, EVP_PKEY **x, + OSSL_LIB_CTX *libctx, const char *propq); +EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); +int PEM_write_bio_Parameters(BIO *bp, const EVP_PKEY *x); + +EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); +EVP_PKEY *b2i_PrivateKey_bio(BIO *in); +EVP_PKEY *b2i_PublicKey_bio(BIO *in); +int i2b_PrivateKey_bio(BIO *out, const EVP_PKEY *pk); +int i2b_PublicKey_bio(BIO *out, const EVP_PKEY *pk); +EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); +EVP_PKEY *b2i_PVK_bio_ex(BIO *in, pem_password_cb *cb, void *u, + OSSL_LIB_CTX *libctx, const char *propq); +int i2b_PVK_bio(BIO *out, const EVP_PKEY *pk, int enclevel, + pem_password_cb *cb, void *u); +int i2b_PVK_bio_ex(BIO *out, const EVP_PKEY *pk, int enclevel, + pem_password_cb *cb, void *u, + OSSL_LIB_CTX *libctx, const char *propq); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/pem2.h b/OtherInc/openssl/include/openssl/pem2.h new file mode 100644 index 0000000..a8a5325 --- /dev/null +++ b/OtherInc/openssl/include/openssl/pem2.h @@ -0,0 +1,19 @@ +/* + * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PEM2_H +# define OPENSSL_PEM2_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_PEM2_H +# endif +# include +#endif diff --git a/OtherInc/openssl/include/openssl/pemerr.h b/OtherInc/openssl/include/openssl/pemerr.h new file mode 100644 index 0000000..18f6d9e --- /dev/null +++ b/OtherInc/openssl/include/openssl/pemerr.h @@ -0,0 +1,58 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PEMERR_H +# define OPENSSL_PEMERR_H +# pragma once + +# include +# include +# include + + + +/* + * PEM reason codes. + */ +# define PEM_R_BAD_BASE64_DECODE 100 +# define PEM_R_BAD_DECRYPT 101 +# define PEM_R_BAD_END_LINE 102 +# define PEM_R_BAD_IV_CHARS 103 +# define PEM_R_BAD_MAGIC_NUMBER 116 +# define PEM_R_BAD_PASSWORD_READ 104 +# define PEM_R_BAD_VERSION_NUMBER 117 +# define PEM_R_BIO_WRITE_FAILURE 118 +# define PEM_R_CIPHER_IS_NULL 127 +# define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 +# define PEM_R_EXPECTING_DSS_KEY_BLOB 131 +# define PEM_R_EXPECTING_PRIVATE_KEY_BLOB 119 +# define PEM_R_EXPECTING_PUBLIC_KEY_BLOB 120 +# define PEM_R_EXPECTING_RSA_KEY_BLOB 132 +# define PEM_R_HEADER_TOO_LONG 128 +# define PEM_R_INCONSISTENT_HEADER 121 +# define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 +# define PEM_R_KEYBLOB_TOO_SHORT 123 +# define PEM_R_MISSING_DEK_IV 129 +# define PEM_R_NOT_DEK_INFO 105 +# define PEM_R_NOT_ENCRYPTED 106 +# define PEM_R_NOT_PROC_TYPE 107 +# define PEM_R_NO_START_LINE 108 +# define PEM_R_PROBLEMS_GETTING_PASSWORD 109 +# define PEM_R_PVK_DATA_TOO_SHORT 124 +# define PEM_R_PVK_TOO_SHORT 125 +# define PEM_R_READ_KEY 111 +# define PEM_R_SHORT_HEADER 112 +# define PEM_R_UNEXPECTED_DEK_IV 130 +# define PEM_R_UNSUPPORTED_CIPHER 113 +# define PEM_R_UNSUPPORTED_ENCRYPTION 114 +# define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 +# define PEM_R_UNSUPPORTED_PUBLIC_KEY_TYPE 110 + +#endif diff --git a/OtherInc/openssl/include/openssl/pkcs12.h b/OtherInc/openssl/include/openssl/pkcs12.h new file mode 100644 index 0000000..f0da086 --- /dev/null +++ b/OtherInc/openssl/include/openssl/pkcs12.h @@ -0,0 +1,350 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\pkcs12.h.in + * + * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_PKCS12_H +# define OPENSSL_PKCS12_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_PKCS12_H +# endif + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define PKCS12_KEY_ID 1 +# define PKCS12_IV_ID 2 +# define PKCS12_MAC_ID 3 + +/* Default iteration count */ +# ifndef PKCS12_DEFAULT_ITER +# define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +# endif + +# define PKCS12_MAC_KEY_LENGTH 20 + +# define PKCS12_SALT_LEN 8 + +/* It's not clear if these are actually needed... */ +# define PKCS12_key_gen PKCS12_key_gen_utf8 +# define PKCS12_add_friendlyname PKCS12_add_friendlyname_utf8 + +/* MS key usage constants */ + +# define KEY_EX 0x10 +# define KEY_SIG 0x80 + +typedef struct PKCS12_MAC_DATA_st PKCS12_MAC_DATA; + +typedef struct PKCS12_st PKCS12; + +typedef struct PKCS12_SAFEBAG_st PKCS12_SAFEBAG; + +SKM_DEFINE_STACK_OF_INTERNAL(PKCS12_SAFEBAG, PKCS12_SAFEBAG, PKCS12_SAFEBAG) +#define sk_PKCS12_SAFEBAG_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_value(sk, idx) ((PKCS12_SAFEBAG *)OPENSSL_sk_value(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk), (idx))) +#define sk_PKCS12_SAFEBAG_new(cmp) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new(ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp))) +#define sk_PKCS12_SAFEBAG_new_null() ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new_null()) +#define sk_PKCS12_SAFEBAG_new_reserve(cmp, n) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new_reserve(ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp), (n))) +#define sk_PKCS12_SAFEBAG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (n)) +#define sk_PKCS12_SAFEBAG_free(sk) OPENSSL_sk_free(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_delete(sk, i) ((PKCS12_SAFEBAG *)OPENSSL_sk_delete(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (i))) +#define sk_PKCS12_SAFEBAG_delete_ptr(sk, ptr) ((PKCS12_SAFEBAG *)OPENSSL_sk_delete_ptr(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr))) +#define sk_PKCS12_SAFEBAG_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_pop(sk) ((PKCS12_SAFEBAG *)OPENSSL_sk_pop(ossl_check_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_shift(sk) ((PKCS12_SAFEBAG *)OPENSSL_sk_shift(ossl_check_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS12_SAFEBAG_sk_type(sk),ossl_check_PKCS12_SAFEBAG_freefunc_type(freefunc)) +#define sk_PKCS12_SAFEBAG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr), (idx)) +#define sk_PKCS12_SAFEBAG_set(sk, idx, ptr) ((PKCS12_SAFEBAG *)OPENSSL_sk_set(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (idx), ossl_check_PKCS12_SAFEBAG_type(ptr))) +#define sk_PKCS12_SAFEBAG_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr), pnum) +#define sk_PKCS12_SAFEBAG_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_dup(sk) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_dup(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_copyfunc_type(copyfunc), ossl_check_PKCS12_SAFEBAG_freefunc_type(freefunc))) +#define sk_PKCS12_SAFEBAG_set_cmp_func(sk, cmp) ((sk_PKCS12_SAFEBAG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp))) + + +typedef struct pkcs12_bag_st PKCS12_BAGS; + +# define PKCS12_ERROR 0 +# define PKCS12_OK 1 + +/* Compatibility macros */ + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 + +# define M_PKCS12_bag_type PKCS12_bag_type +# define M_PKCS12_cert_bag_type PKCS12_cert_bag_type +# define M_PKCS12_crl_bag_type PKCS12_cert_bag_type + +# define PKCS12_certbag2x509 PKCS12_SAFEBAG_get1_cert +# define PKCS12_certbag2scrl PKCS12_SAFEBAG_get1_crl +# define PKCS12_bag_type PKCS12_SAFEBAG_get_nid +# define PKCS12_cert_bag_type PKCS12_SAFEBAG_get_bag_nid +# define PKCS12_x5092certbag PKCS12_SAFEBAG_create_cert +# define PKCS12_x509crl2certbag PKCS12_SAFEBAG_create_crl +# define PKCS12_MAKE_KEYBAG PKCS12_SAFEBAG_create0_p8inf +# define PKCS12_MAKE_SHKEYBAG PKCS12_SAFEBAG_create_pkcs8_encrypt + +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 ASN1_TYPE *PKCS12_get_attr(const PKCS12_SAFEBAG *bag, + int attr_nid); +#endif + +ASN1_TYPE *PKCS8_get_attr(PKCS8_PRIV_KEY_INFO *p8, int attr_nid); +int PKCS12_mac_present(const PKCS12 *p12); +void PKCS12_get0_mac(const ASN1_OCTET_STRING **pmac, + const X509_ALGOR **pmacalg, + const ASN1_OCTET_STRING **psalt, + const ASN1_INTEGER **piter, + const PKCS12 *p12); + +const ASN1_TYPE *PKCS12_SAFEBAG_get0_attr(const PKCS12_SAFEBAG *bag, + int attr_nid); +const ASN1_OBJECT *PKCS12_SAFEBAG_get0_type(const PKCS12_SAFEBAG *bag); +int PKCS12_SAFEBAG_get_nid(const PKCS12_SAFEBAG *bag); +int PKCS12_SAFEBAG_get_bag_nid(const PKCS12_SAFEBAG *bag); +const ASN1_TYPE *PKCS12_SAFEBAG_get0_bag_obj(const PKCS12_SAFEBAG *bag); +const ASN1_OBJECT *PKCS12_SAFEBAG_get0_bag_type(const PKCS12_SAFEBAG *bag); + +X509 *PKCS12_SAFEBAG_get1_cert(const PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_SAFEBAG_get1_crl(const PKCS12_SAFEBAG *bag); +const STACK_OF(PKCS12_SAFEBAG) * +PKCS12_SAFEBAG_get0_safes(const PKCS12_SAFEBAG *bag); +const PKCS8_PRIV_KEY_INFO *PKCS12_SAFEBAG_get0_p8inf(const PKCS12_SAFEBAG *bag); +const X509_SIG *PKCS12_SAFEBAG_get0_pkcs8(const PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_cert(X509 *x509); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_crl(X509_CRL *crl); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_secret(int type, int vtype, const unsigned char *value, int len); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_pkcs8(X509_SIG *p8); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt(int pbe_nid, + const char *pass, + int passlen, + unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8inf); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt_ex(int pbe_nid, + const char *pass, + int passlen, + unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8inf, + OSSL_LIB_CTX *ctx, + const char *propq); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(const X509_SIG *p8, const char *pass, + int passlen); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt_ex(const X509_SIG *p8, const char *pass, + int passlen, OSSL_LIB_CTX *ctx, + const char *propq); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(const PKCS12_SAFEBAG *bag, + const char *pass, int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey_ex(const PKCS12_SAFEBAG *bag, + const char *pass, int passlen, + OSSL_LIB_CTX *ctx, + const char *propq); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8); +X509_SIG *PKCS8_encrypt_ex(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8, + OSSL_LIB_CTX *ctx, const char *propq); +X509_SIG *PKCS8_set0_pbe(const char *pass, int passlen, + PKCS8_PRIV_KEY_INFO *p8inf, X509_ALGOR *pbe); +X509_SIG *PKCS8_set0_pbe_ex(const char *pass, int passlen, + PKCS8_PRIV_KEY_INFO *p8inf, X509_ALGOR *pbe, + OSSL_LIB_CTX *ctx, const char *propq); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags); +PKCS7 *PKCS12_pack_p7encdata_ex(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags, + OSSL_LIB_CTX *ctx, const char *propq); + +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, + int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(const PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, + int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_utf8(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, + const unsigned char *name, int namelen); +int PKCS12_add1_attr_by_NID(PKCS12_SAFEBAG *bag, int nid, int type, + const unsigned char *bytes, int len); +int PKCS12_add1_attr_by_txt(PKCS12_SAFEBAG *bag, const char *attrname, int type, + const unsigned char *bytes, int len); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs, + int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +const STACK_OF(X509_ATTRIBUTE) * +PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag); +unsigned char *PKCS12_pbe_crypt(const X509_ALGOR *algor, + const char *pass, int passlen, + const unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de); +unsigned char *PKCS12_pbe_crypt_ex(const X509_ALGOR *algor, + const char *pass, int passlen, + const unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de, OSSL_LIB_CTX *libctx, + const char *propq); +void *PKCS12_item_decrypt_d2i(const X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + const ASN1_OCTET_STRING *oct, int zbuf); +void *PKCS12_item_decrypt_d2i_ex(const X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + const ASN1_OCTET_STRING *oct, int zbuf, + OSSL_LIB_CTX *libctx, + const char *propq); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt_ex(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf, + OSSL_LIB_CTX *ctx, + const char *propq); +PKCS12 *PKCS12_init(int mode); +PKCS12 *PKCS12_init_ex(int mode, OSSL_LIB_CTX *ctx, const char *propq); + +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_asc_ex(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_uni_ex(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); +int PKCS12_key_gen_utf8(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_utf8_ex(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); + +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de); +int PKCS12_PBE_keyivgen_ex(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de, + OSSL_LIB_CTX *libctx, const char *propq); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2asc(const unsigned char *uni, int unilen); +unsigned char *OPENSSL_utf82uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2utf8(const unsigned char *uni, int unilen); + +DECLARE_ASN1_FUNCTIONS(PKCS12) +DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) +DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) +DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) + +DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) +DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +PKCS12 *PKCS12_create(const char *pass, const char *name, EVP_PKEY *pkey, + X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, + int iter, int mac_iter, int keytype); +PKCS12 *PKCS12_create_ex(const char *pass, const char *name, EVP_PKEY *pkey, + X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, + int iter, int mac_iter, int keytype, + OSSL_LIB_CTX *ctx, const char *propq); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, const char *pass); +PKCS12_SAFEBAG *PKCS12_add_key_ex(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, const char *pass, + OSSL_LIB_CTX *ctx, const char *propq); + +PKCS12_SAFEBAG *PKCS12_add_secret(STACK_OF(PKCS12_SAFEBAG) **pbags, + int nid_type, const unsigned char *value, int len); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, const char *pass); +int PKCS12_add_safe_ex(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, const char *pass, + OSSL_LIB_CTX *ctx, const char *propq); + +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); +PKCS12 *PKCS12_add_safes_ex(STACK_OF(PKCS7) *safes, int p7_nid, + OSSL_LIB_CTX *ctx, const char *propq); + +int i2d_PKCS12_bio(BIO *bp, const PKCS12 *p12); +# ifndef OPENSSL_NO_STDIO +int i2d_PKCS12_fp(FILE *fp, const PKCS12 *p12); +# endif +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +# ifndef OPENSSL_NO_STDIO +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +# endif +int PKCS12_newpass(PKCS12 *p12, const char *oldpass, const char *newpass); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/pkcs12err.h b/OtherInc/openssl/include/openssl/pkcs12err.h new file mode 100644 index 0000000..933c832 --- /dev/null +++ b/OtherInc/openssl/include/openssl/pkcs12err.h @@ -0,0 +1,45 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PKCS12ERR_H +# define OPENSSL_PKCS12ERR_H +# pragma once + +# include +# include +# include + + + +/* + * PKCS12 reason codes. + */ +# define PKCS12_R_CANT_PACK_STRUCTURE 100 +# define PKCS12_R_CONTENT_TYPE_NOT_DATA 121 +# define PKCS12_R_DECODE_ERROR 101 +# define PKCS12_R_ENCODE_ERROR 102 +# define PKCS12_R_ENCRYPT_ERROR 103 +# define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120 +# define PKCS12_R_INVALID_NULL_ARGUMENT 104 +# define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105 +# define PKCS12_R_INVALID_TYPE 112 +# define PKCS12_R_IV_GEN_ERROR 106 +# define PKCS12_R_KEY_GEN_ERROR 107 +# define PKCS12_R_MAC_ABSENT 108 +# define PKCS12_R_MAC_GENERATION_ERROR 109 +# define PKCS12_R_MAC_SETUP_ERROR 110 +# define PKCS12_R_MAC_STRING_SET_ERROR 111 +# define PKCS12_R_MAC_VERIFY_FAILURE 113 +# define PKCS12_R_PARSE_ERROR 114 +# define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116 +# define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118 +# define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119 + +#endif diff --git a/OtherInc/openssl/include/openssl/pkcs7.h b/OtherInc/openssl/include/openssl/pkcs7.h new file mode 100644 index 0000000..097d2db --- /dev/null +++ b/OtherInc/openssl/include/openssl/pkcs7.h @@ -0,0 +1,427 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\pkcs7.h.in + * + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_PKCS7_H +# define OPENSSL_PKCS7_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_PKCS7_H +# endif + +# include +# include +# include + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + + +/*- +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct PKCS7_CTX_st { + OSSL_LIB_CTX *libctx; + char *propq; +} PKCS7_CTX; + +typedef struct pkcs7_issuer_and_serial_st { + X509_NAME *issuer; + ASN1_INTEGER *serial; +} PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; + ASN1_OCTET_STRING *enc_digest; + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + /* The private key to sign with */ + EVP_PKEY *pkey; + const PKCS7_CTX *ctx; +} PKCS7_SIGNER_INFO; +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7_SIGNER_INFO, PKCS7_SIGNER_INFO, PKCS7_SIGNER_INFO) +#define sk_PKCS7_SIGNER_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_value(sk, idx) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_value(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk), (idx))) +#define sk_PKCS7_SIGNER_INFO_new(cmp) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new(ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp))) +#define sk_PKCS7_SIGNER_INFO_new_null() ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_SIGNER_INFO_new_reserve(cmp, n) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp), (n))) +#define sk_PKCS7_SIGNER_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (n)) +#define sk_PKCS7_SIGNER_INFO_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_delete(sk, i) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_delete(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (i))) +#define sk_PKCS7_SIGNER_INFO_delete_ptr(sk, ptr) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr))) +#define sk_PKCS7_SIGNER_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_pop(sk) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_pop(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_shift(sk) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_shift(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk),ossl_check_PKCS7_SIGNER_INFO_freefunc_type(freefunc)) +#define sk_PKCS7_SIGNER_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr), (idx)) +#define sk_PKCS7_SIGNER_INFO_set(sk, idx, ptr) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_set(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (idx), ossl_check_PKCS7_SIGNER_INFO_type(ptr))) +#define sk_PKCS7_SIGNER_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr), pnum) +#define sk_PKCS7_SIGNER_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_dup(sk) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_copyfunc_type(copyfunc), ossl_check_PKCS7_SIGNER_INFO_freefunc_type(freefunc))) +#define sk_PKCS7_SIGNER_INFO_set_cmp_func(sk, cmp) ((sk_PKCS7_SIGNER_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp))) + + +typedef struct pkcs7_recip_info_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ + const PKCS7_CTX *ctx; +} PKCS7_RECIP_INFO; +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7_RECIP_INFO, PKCS7_RECIP_INFO, PKCS7_RECIP_INFO) +#define sk_PKCS7_RECIP_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_value(sk, idx) ((PKCS7_RECIP_INFO *)OPENSSL_sk_value(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk), (idx))) +#define sk_PKCS7_RECIP_INFO_new(cmp) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new(ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp))) +#define sk_PKCS7_RECIP_INFO_new_null() ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_RECIP_INFO_new_reserve(cmp, n) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp), (n))) +#define sk_PKCS7_RECIP_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (n)) +#define sk_PKCS7_RECIP_INFO_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_delete(sk, i) ((PKCS7_RECIP_INFO *)OPENSSL_sk_delete(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (i))) +#define sk_PKCS7_RECIP_INFO_delete_ptr(sk, ptr) ((PKCS7_RECIP_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr))) +#define sk_PKCS7_RECIP_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_pop(sk) ((PKCS7_RECIP_INFO *)OPENSSL_sk_pop(ossl_check_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_shift(sk) ((PKCS7_RECIP_INFO *)OPENSSL_sk_shift(ossl_check_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_RECIP_INFO_sk_type(sk),ossl_check_PKCS7_RECIP_INFO_freefunc_type(freefunc)) +#define sk_PKCS7_RECIP_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr), (idx)) +#define sk_PKCS7_RECIP_INFO_set(sk, idx, ptr) ((PKCS7_RECIP_INFO *)OPENSSL_sk_set(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (idx), ossl_check_PKCS7_RECIP_INFO_type(ptr))) +#define sk_PKCS7_RECIP_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr), pnum) +#define sk_PKCS7_RECIP_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_dup(sk) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_copyfunc_type(copyfunc), ossl_check_PKCS7_RECIP_INFO_freefunc_type(freefunc))) +#define sk_PKCS7_RECIP_INFO_set_cmp_func(sk, cmp) ((sk_PKCS7_RECIP_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp))) + + + +typedef struct pkcs7_signed_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + struct pkcs7_st *contents; +} PKCS7_SIGNED; +/* + * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about + * merging the two + */ + +typedef struct pkcs7_enc_content_st { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; + const PKCS7_CTX *ctx; +} PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; +} PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; +} PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENCRYPT; + +typedef struct pkcs7_st { + /* + * The following is non NULL if it contains ASN1 encoding of this + * structure + */ + unsigned char *asn1; + long length; +# define PKCS7_S_HEADER 0 +# define PKCS7_S_BODY 1 +# define PKCS7_S_TAIL 2 + int state; /* used during processing */ + int detached; + ASN1_OBJECT *type; + /* content as defined by the type */ + /* + * all encryption/message digests are applied to the 'contents', leaving + * out the 'type' field. + */ + union { + char *ptr; + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + /* Anything else */ + ASN1_TYPE *other; + } d; + PKCS7_CTX ctx; +} PKCS7; +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7, PKCS7, PKCS7) +#define sk_PKCS7_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_sk_type(sk)) +#define sk_PKCS7_value(sk, idx) ((PKCS7 *)OPENSSL_sk_value(ossl_check_const_PKCS7_sk_type(sk), (idx))) +#define sk_PKCS7_new(cmp) ((STACK_OF(PKCS7) *)OPENSSL_sk_new(ossl_check_PKCS7_compfunc_type(cmp))) +#define sk_PKCS7_new_null() ((STACK_OF(PKCS7) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_new_reserve(cmp, n) ((STACK_OF(PKCS7) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_compfunc_type(cmp), (n))) +#define sk_PKCS7_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_sk_type(sk), (n)) +#define sk_PKCS7_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_delete(sk, i) ((PKCS7 *)OPENSSL_sk_delete(ossl_check_PKCS7_sk_type(sk), (i))) +#define sk_PKCS7_delete_ptr(sk, ptr) ((PKCS7 *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr))) +#define sk_PKCS7_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_pop(sk) ((PKCS7 *)OPENSSL_sk_pop(ossl_check_PKCS7_sk_type(sk))) +#define sk_PKCS7_shift(sk) ((PKCS7 *)OPENSSL_sk_shift(ossl_check_PKCS7_sk_type(sk))) +#define sk_PKCS7_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_sk_type(sk),ossl_check_PKCS7_freefunc_type(freefunc)) +#define sk_PKCS7_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr), (idx)) +#define sk_PKCS7_set(sk, idx, ptr) ((PKCS7 *)OPENSSL_sk_set(ossl_check_PKCS7_sk_type(sk), (idx), ossl_check_PKCS7_type(ptr))) +#define sk_PKCS7_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr), pnum) +#define sk_PKCS7_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_sk_type(sk)) +#define sk_PKCS7_dup(sk) ((STACK_OF(PKCS7) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_sk_type(sk))) +#define sk_PKCS7_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_sk_type(sk), ossl_check_PKCS7_copyfunc_type(copyfunc), ossl_check_PKCS7_freefunc_type(freefunc))) +#define sk_PKCS7_set_cmp_func(sk, cmp) ((sk_PKCS7_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_compfunc_type(cmp))) + + + +# define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +# define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +# define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +# define PKCS7_get_attributes(si) ((si)->unauth_attr) + +# define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +# define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +# define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +# define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +# define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +# define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +# define PKCS7_set_detached(p,v) \ + PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) +# define PKCS7_get_detached(p) \ + PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) + +# define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +# define PKCS7_TEXT 0x1 +# define PKCS7_NOCERTS 0x2 +# define PKCS7_NOSIGS 0x4 +# define PKCS7_NOCHAIN 0x8 +# define PKCS7_NOINTERN 0x10 +# define PKCS7_NOVERIFY 0x20 +# define PKCS7_DETACHED 0x40 +# define PKCS7_BINARY 0x80 +# define PKCS7_NOATTR 0x100 +# define PKCS7_NOSMIMECAP 0x200 +# define PKCS7_NOOLDMIMETYPE 0x400 +# define PKCS7_CRLFEOL 0x800 +# define PKCS7_STREAM 0x1000 +# define PKCS7_NOCRL 0x2000 +# define PKCS7_PARTIAL 0x4000 +# define PKCS7_REUSE_DIGEST 0x8000 +# define PKCS7_NO_DUAL_CONTENT 0x10000 + +/* Flags: for compatibility with older code */ + +# define SMIME_TEXT PKCS7_TEXT +# define SMIME_NOCERTS PKCS7_NOCERTS +# define SMIME_NOSIGS PKCS7_NOSIGS +# define SMIME_NOCHAIN PKCS7_NOCHAIN +# define SMIME_NOINTERN PKCS7_NOINTERN +# define SMIME_NOVERIFY PKCS7_NOVERIFY +# define SMIME_DETACHED PKCS7_DETACHED +# define SMIME_BINARY PKCS7_BINARY +# define SMIME_NOATTR PKCS7_NOATTR + +/* CRLF ASCII canonicalisation */ +# define SMIME_ASCIICRLF 0x80000 + +DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) + +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, + const EVP_MD *type, unsigned char *md, + unsigned int *len); +# ifndef OPENSSL_NO_STDIO +PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp, const PKCS7 *p7); +# endif +DECLARE_ASN1_DUP_FUNCTION(PKCS7) +PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp, const PKCS7 *p7); +int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); +int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); + +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) +DECLARE_ASN1_FUNCTIONS(PKCS7) +PKCS7 *PKCS7_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) +DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) + +DECLARE_ASN1_NDEF_FUNCTION(PKCS7) +DECLARE_ASN1_PRINT_FUNCTION(PKCS7) + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_type_is_other(PKCS7 *p7); +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); +int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); +int PKCS7_add_certificate(PKCS7 *p7, X509 *x509); +int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509); +int PKCS7_content_new(PKCS7 *p7, int nid); +int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *x509); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, + X509_ALGOR **pdig, X509_ALGOR **psig); +void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); +int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); +int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); +int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); +int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_get_octet_string(PKCS7 *p7); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, + void *data); +int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *value); +ASN1_TYPE *PKCS7_get_attribute(const PKCS7_SIGNER_INFO *si, int nid); +ASN1_TYPE *PKCS7_get_signed_attribute(const PKCS7_SIGNER_INFO *si, int nid); +int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); +PKCS7 *PKCS7_sign_ex(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags, OSSL_LIB_CTX *libctx, + const char *propq); + +PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, + X509 *signcert, EVP_PKEY *pkey, + const EVP_MD *md, int flags); + +int PKCS7_final(PKCS7 *p7, BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, + int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +PKCS7 *PKCS7_encrypt_ex(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, int flags, + OSSL_LIB_CTX *libctx, const char *propq); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, + int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, + const unsigned char *md, int mdlen); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7_ex(BIO *bio, BIO **bcont, PKCS7 **p7); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); + +BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/pkcs7err.h b/OtherInc/openssl/include/openssl/pkcs7err.h new file mode 100644 index 0000000..ceb1a50 --- /dev/null +++ b/OtherInc/openssl/include/openssl/pkcs7err.h @@ -0,0 +1,63 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PKCS7ERR_H +# define OPENSSL_PKCS7ERR_H +# pragma once + +# include +# include +# include + + + +/* + * PKCS7 reason codes. + */ +# define PKCS7_R_CERTIFICATE_VERIFY_ERROR 117 +# define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER 144 +# define PKCS7_R_CIPHER_NOT_INITIALIZED 116 +# define PKCS7_R_CONTENT_AND_DATA_PRESENT 118 +# define PKCS7_R_CTRL_ERROR 152 +# define PKCS7_R_DECRYPT_ERROR 119 +# define PKCS7_R_DIGEST_FAILURE 101 +# define PKCS7_R_ENCRYPTION_CTRL_FAILURE 149 +# define PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 150 +# define PKCS7_R_ERROR_ADDING_RECIPIENT 120 +# define PKCS7_R_ERROR_SETTING_CIPHER 121 +# define PKCS7_R_INVALID_NULL_POINTER 143 +# define PKCS7_R_INVALID_SIGNED_DATA_TYPE 155 +# define PKCS7_R_NO_CONTENT 122 +# define PKCS7_R_NO_DEFAULT_DIGEST 151 +# define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND 154 +# define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE 115 +# define PKCS7_R_NO_SIGNATURES_ON_DATA 123 +# define PKCS7_R_NO_SIGNERS 142 +# define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE 104 +# define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR 124 +# define PKCS7_R_PKCS7_ADD_SIGNER_ERROR 153 +# define PKCS7_R_PKCS7_DATASIGN 145 +# define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 127 +# define PKCS7_R_SIGNATURE_FAILURE 105 +# define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND 128 +# define PKCS7_R_SIGNING_CTRL_FAILURE 147 +# define PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 148 +# define PKCS7_R_SMIME_TEXT_ERROR 129 +# define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE 106 +# define PKCS7_R_UNABLE_TO_FIND_MEM_BIO 107 +# define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST 108 +# define PKCS7_R_UNKNOWN_DIGEST_TYPE 109 +# define PKCS7_R_UNKNOWN_OPERATION 110 +# define PKCS7_R_UNSUPPORTED_CIPHER_TYPE 111 +# define PKCS7_R_UNSUPPORTED_CONTENT_TYPE 112 +# define PKCS7_R_WRONG_CONTENT_TYPE 113 +# define PKCS7_R_WRONG_PKCS7_TYPE 114 + +#endif diff --git a/OtherInc/openssl/include/openssl/prov_ssl.h b/OtherInc/openssl/include/openssl/prov_ssl.h new file mode 100644 index 0000000..d3e0896 --- /dev/null +++ b/OtherInc/openssl/include/openssl/prov_ssl.h @@ -0,0 +1,34 @@ +/* + * Copyright 2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PROV_SSL_H +# define OPENSSL_PROV_SSL_H +# pragma once + +# ifdef __cplusplus +extern "C" { +# endif + +/* SSL/TLS related defines useful to providers */ + +# define SSL_MAX_MASTER_KEY_LENGTH 48 + +# define SSL3_VERSION 0x0300 +# define TLS1_VERSION 0x0301 +# define TLS1_1_VERSION 0x0302 +# define TLS1_2_VERSION 0x0303 +# define TLS1_3_VERSION 0x0304 +# define DTLS1_VERSION 0xFEFF +# define DTLS1_2_VERSION 0xFEFD +# define DTLS1_BAD_VER 0x0100 + +# ifdef __cplusplus +} +# endif +#endif /* OPENSSL_PROV_SSL_H */ diff --git a/OtherInc/openssl/include/openssl/proverr.h b/OtherInc/openssl/include/openssl/proverr.h new file mode 100644 index 0000000..ad67a8f --- /dev/null +++ b/OtherInc/openssl/include/openssl/proverr.h @@ -0,0 +1,148 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PROVERR_H +# define OPENSSL_PROVERR_H +# pragma once + +# include +# include +# include + + + +/* + * PROV reason codes. + */ +# define PROV_R_ADDITIONAL_INPUT_TOO_LONG 184 +# define PROV_R_ALGORITHM_MISMATCH 173 +# define PROV_R_ALREADY_INSTANTIATED 185 +# define PROV_R_BAD_DECRYPT 100 +# define PROV_R_BAD_ENCODING 141 +# define PROV_R_BAD_LENGTH 142 +# define PROV_R_BAD_TLS_CLIENT_VERSION 161 +# define PROV_R_BN_ERROR 160 +# define PROV_R_CIPHER_OPERATION_FAILED 102 +# define PROV_R_DERIVATION_FUNCTION_INIT_FAILED 205 +# define PROV_R_DIGEST_NOT_ALLOWED 174 +# define PROV_R_ENTROPY_SOURCE_STRENGTH_TOO_WEAK 186 +# define PROV_R_ERROR_INSTANTIATING_DRBG 188 +# define PROV_R_ERROR_RETRIEVING_ENTROPY 189 +# define PROV_R_ERROR_RETRIEVING_NONCE 190 +# define PROV_R_FAILED_DURING_DERIVATION 164 +# define PROV_R_FAILED_TO_CREATE_LOCK 180 +# define PROV_R_FAILED_TO_DECRYPT 162 +# define PROV_R_FAILED_TO_GENERATE_KEY 121 +# define PROV_R_FAILED_TO_GET_PARAMETER 103 +# define PROV_R_FAILED_TO_SET_PARAMETER 104 +# define PROV_R_FAILED_TO_SIGN 175 +# define PROV_R_FIPS_MODULE_CONDITIONAL_ERROR 227 +# define PROV_R_FIPS_MODULE_ENTERING_ERROR_STATE 224 +# define PROV_R_FIPS_MODULE_IN_ERROR_STATE 225 +# define PROV_R_GENERATE_ERROR 191 +# define PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 165 +# define PROV_R_INDICATOR_INTEGRITY_FAILURE 210 +# define PROV_R_INSUFFICIENT_DRBG_STRENGTH 181 +# define PROV_R_INVALID_AAD 108 +# define PROV_R_INVALID_CONFIG_DATA 211 +# define PROV_R_INVALID_CONSTANT_LENGTH 157 +# define PROV_R_INVALID_CURVE 176 +# define PROV_R_INVALID_CUSTOM_LENGTH 111 +# define PROV_R_INVALID_DATA 115 +# define PROV_R_INVALID_DIGEST 122 +# define PROV_R_INVALID_DIGEST_LENGTH 166 +# define PROV_R_INVALID_DIGEST_SIZE 218 +# define PROV_R_INVALID_INPUT_LENGTH 230 +# define PROV_R_INVALID_ITERATION_COUNT 123 +# define PROV_R_INVALID_IV_LENGTH 109 +# define PROV_R_INVALID_KEY 158 +# define PROV_R_INVALID_KEY_LENGTH 105 +# define PROV_R_INVALID_MAC 151 +# define PROV_R_INVALID_MGF1_MD 167 +# define PROV_R_INVALID_MODE 125 +# define PROV_R_INVALID_OUTPUT_LENGTH 217 +# define PROV_R_INVALID_PADDING_MODE 168 +# define PROV_R_INVALID_PUBINFO 198 +# define PROV_R_INVALID_SALT_LENGTH 112 +# define PROV_R_INVALID_SEED_LENGTH 154 +# define PROV_R_INVALID_SIGNATURE_SIZE 179 +# define PROV_R_INVALID_STATE 212 +# define PROV_R_INVALID_TAG 110 +# define PROV_R_INVALID_TAG_LENGTH 118 +# define PROV_R_INVALID_UKM_LENGTH 200 +# define PROV_R_INVALID_X931_DIGEST 170 +# define PROV_R_IN_ERROR_STATE 192 +# define PROV_R_KEY_SETUP_FAILED 101 +# define PROV_R_KEY_SIZE_TOO_SMALL 171 +# define PROV_R_LENGTH_TOO_LARGE 202 +# define PROV_R_MISMATCHING_DOMAIN_PARAMETERS 203 +# define PROV_R_MISSING_CEK_ALG 144 +# define PROV_R_MISSING_CIPHER 155 +# define PROV_R_MISSING_CONFIG_DATA 213 +# define PROV_R_MISSING_CONSTANT 156 +# define PROV_R_MISSING_KEY 128 +# define PROV_R_MISSING_MAC 150 +# define PROV_R_MISSING_MESSAGE_DIGEST 129 +# define PROV_R_MISSING_OID 209 +# define PROV_R_MISSING_PASS 130 +# define PROV_R_MISSING_SALT 131 +# define PROV_R_MISSING_SECRET 132 +# define PROV_R_MISSING_SEED 140 +# define PROV_R_MISSING_SESSION_ID 133 +# define PROV_R_MISSING_TYPE 134 +# define PROV_R_MISSING_XCGHASH 135 +# define PROV_R_MODULE_INTEGRITY_FAILURE 214 +# define PROV_R_NOT_A_PRIVATE_KEY 221 +# define PROV_R_NOT_A_PUBLIC_KEY 220 +# define PROV_R_NOT_INSTANTIATED 193 +# define PROV_R_NOT_PARAMETERS 226 +# define PROV_R_NOT_SUPPORTED 136 +# define PROV_R_NOT_XOF_OR_INVALID_LENGTH 113 +# define PROV_R_NO_KEY_SET 114 +# define PROV_R_NO_PARAMETERS_SET 177 +# define PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 178 +# define PROV_R_OUTPUT_BUFFER_TOO_SMALL 106 +# define PROV_R_PARENT_CANNOT_GENERATE_RANDOM_NUMBERS 228 +# define PROV_R_PARENT_CANNOT_SUPPLY_ENTROPY_SEED 187 +# define PROV_R_PARENT_LOCKING_NOT_ENABLED 182 +# define PROV_R_PARENT_STRENGTH_TOO_WEAK 194 +# define PROV_R_PATH_MUST_BE_ABSOLUTE 219 +# define PROV_R_PERSONALISATION_STRING_TOO_LONG 195 +# define PROV_R_PSS_SALTLEN_TOO_SMALL 172 +# define PROV_R_REQUEST_TOO_LARGE_FOR_DRBG 196 +# define PROV_R_REQUIRE_CTR_MODE_CIPHER 206 +# define PROV_R_RESEED_ERROR 197 +# define PROV_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES 222 +# define PROV_R_SEED_SOURCES_MUST_NOT_HAVE_A_PARENT 229 +# define PROV_R_SELF_TEST_KAT_FAILURE 215 +# define PROV_R_SELF_TEST_POST_FAILURE 216 +# define PROV_R_TAG_NOT_NEEDED 120 +# define PROV_R_TAG_NOT_SET 119 +# define PROV_R_TOO_MANY_RECORDS 126 +# define PROV_R_UNABLE_TO_FIND_CIPHERS 207 +# define PROV_R_UNABLE_TO_GET_PARENT_STRENGTH 199 +# define PROV_R_UNABLE_TO_GET_PASSPHRASE 159 +# define PROV_R_UNABLE_TO_INITIALISE_CIPHERS 208 +# define PROV_R_UNABLE_TO_LOAD_SHA256 147 +# define PROV_R_UNABLE_TO_LOCK_PARENT 201 +# define PROV_R_UNABLE_TO_RESEED 204 +# define PROV_R_UNSUPPORTED_CEK_ALG 145 +# define PROV_R_UNSUPPORTED_KEY_SIZE 153 +# define PROV_R_UNSUPPORTED_MAC_TYPE 137 +# define PROV_R_UNSUPPORTED_NUMBER_OF_ROUNDS 152 +# define PROV_R_URI_AUTHORITY_UNSUPPORTED 223 +# define PROV_R_VALUE_ERROR 138 +# define PROV_R_WRONG_FINAL_BLOCK_LENGTH 107 +# define PROV_R_WRONG_OUTPUT_BUFFER_SIZE 139 +# define PROV_R_XOF_DIGESTS_NOT_ALLOWED 183 +# define PROV_R_XTS_DATA_UNIT_IS_TOO_LARGE 148 +# define PROV_R_XTS_DUPLICATED_KEYS 149 + +#endif diff --git a/OtherInc/openssl/include/openssl/provider.h b/OtherInc/openssl/include/openssl/provider.h new file mode 100644 index 0000000..dc86ff5 --- /dev/null +++ b/OtherInc/openssl/include/openssl/provider.h @@ -0,0 +1,60 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_PROVIDER_H +# define OPENSSL_PROVIDER_H +# pragma once + +# include + +# ifdef __cplusplus +extern "C" { +# endif + +/* Set the default provider search path */ +int OSSL_PROVIDER_set_default_search_path(OSSL_LIB_CTX *, const char *path); + +/* Load and unload a provider */ +OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *, const char *name); +OSSL_PROVIDER *OSSL_PROVIDER_try_load(OSSL_LIB_CTX *, const char *name, + int retain_fallbacks); +int OSSL_PROVIDER_unload(OSSL_PROVIDER *prov); +int OSSL_PROVIDER_available(OSSL_LIB_CTX *, const char *name); +int OSSL_PROVIDER_do_all(OSSL_LIB_CTX *ctx, + int (*cb)(OSSL_PROVIDER *provider, void *cbdata), + void *cbdata); + +const OSSL_PARAM *OSSL_PROVIDER_gettable_params(const OSSL_PROVIDER *prov); +int OSSL_PROVIDER_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]); +int OSSL_PROVIDER_self_test(const OSSL_PROVIDER *prov); +int OSSL_PROVIDER_get_capabilities(const OSSL_PROVIDER *prov, + const char *capability, + OSSL_CALLBACK *cb, + void *arg); + +const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov, + int operation_id, + int *no_cache); +void OSSL_PROVIDER_unquery_operation(const OSSL_PROVIDER *prov, + int operation_id, const OSSL_ALGORITHM *algs); +void *OSSL_PROVIDER_get0_provider_ctx(const OSSL_PROVIDER *prov); +const OSSL_DISPATCH *OSSL_PROVIDER_get0_dispatch(const OSSL_PROVIDER *prov); + +/* Add a built in providers */ +int OSSL_PROVIDER_add_builtin(OSSL_LIB_CTX *, const char *name, + OSSL_provider_init_fn *init_fn); + +/* Information */ +const char *OSSL_PROVIDER_get0_name(const OSSL_PROVIDER *prov); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/rand.h b/OtherInc/openssl/include/openssl/rand.h new file mode 100644 index 0000000..ad3054f --- /dev/null +++ b/OtherInc/openssl/include/openssl/rand.h @@ -0,0 +1,123 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_RAND_H +# define OPENSSL_RAND_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_RAND_H +# endif + +# include +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Default security strength (in the sense of [NIST SP 800-90Ar1]) + * + * NIST SP 800-90Ar1 supports the strength of the DRBG being smaller than that + * of the cipher by collecting less entropy. The current DRBG implementation + * does not take RAND_DRBG_STRENGTH into account and sets the strength of the + * DRBG to that of the cipher. + */ +# define RAND_DRBG_STRENGTH 256 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +struct rand_meth_st { + int (*seed) (const void *buf, int num); + int (*bytes) (unsigned char *buf, int num); + void (*cleanup) (void); + int (*add) (const void *buf, int num, double randomness); + int (*pseudorand) (unsigned char *buf, int num); + int (*status) (void); +}; + +OSSL_DEPRECATEDIN_3_0 int RAND_set_rand_method(const RAND_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 const RAND_METHOD *RAND_get_rand_method(void); +# ifndef OPENSSL_NO_ENGINE +OSSL_DEPRECATEDIN_3_0 int RAND_set_rand_engine(ENGINE *engine); +# endif + +OSSL_DEPRECATEDIN_3_0 RAND_METHOD *RAND_OpenSSL(void); +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define RAND_cleanup() while(0) continue +# endif +int RAND_bytes(unsigned char *buf, int num); +int RAND_priv_bytes(unsigned char *buf, int num); + +/* + * Equivalent of RAND_priv_bytes() but additionally taking an OSSL_LIB_CTX and + * a strength. + */ +int RAND_priv_bytes_ex(OSSL_LIB_CTX *ctx, unsigned char *buf, size_t num, + unsigned int strength); + +/* + * Equivalent of RAND_bytes() but additionally taking an OSSL_LIB_CTX and + * a strength. + */ +int RAND_bytes_ex(OSSL_LIB_CTX *ctx, unsigned char *buf, size_t num, + unsigned int strength); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 int RAND_pseudo_bytes(unsigned char *buf, int num); +# endif + +EVP_RAND_CTX *RAND_get0_primary(OSSL_LIB_CTX *ctx); +EVP_RAND_CTX *RAND_get0_public(OSSL_LIB_CTX *ctx); +EVP_RAND_CTX *RAND_get0_private(OSSL_LIB_CTX *ctx); + +int RAND_set_DRBG_type(OSSL_LIB_CTX *ctx, const char *drbg, const char *propq, + const char *cipher, const char *digest); +int RAND_set_seed_source_type(OSSL_LIB_CTX *ctx, const char *seed, + const char *propq); + +void RAND_seed(const void *buf, int num); +void RAND_keep_random_devices_open(int keep); + +# if defined(__ANDROID__) && defined(__NDK_FPABI__) +__NDK_FPABI__ /* __attribute__((pcs("aapcs"))) on ARM */ +# endif +void RAND_add(const void *buf, int num, double randomness); +int RAND_load_file(const char *file, long max_bytes); +int RAND_write_file(const char *file); +const char *RAND_file_name(char *file, size_t num); +int RAND_status(void); + +# ifndef OPENSSL_NO_EGD +int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes); +int RAND_egd(const char *path); +int RAND_egd_bytes(const char *path, int bytes); +# endif + +int RAND_poll(void); + +# if defined(_WIN32) && (defined(BASETYPES) || defined(_WINDEF_H)) +/* application has to include in order to use these */ +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void RAND_screen(void); +OSSL_DEPRECATEDIN_1_1_0 int RAND_event(UINT, WPARAM, LPARAM); +# endif +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/OtherInc/openssl/include/openssl/randerr.h b/OtherInc/openssl/include/openssl/randerr.h new file mode 100644 index 0000000..b5e08e4 --- /dev/null +++ b/OtherInc/openssl/include/openssl/randerr.h @@ -0,0 +1,68 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_RANDERR_H +# define OPENSSL_RANDERR_H +# pragma once + +# include +# include +# include + + + +/* + * RAND reason codes. + */ +# define RAND_R_ADDITIONAL_INPUT_TOO_LONG 102 +# define RAND_R_ALREADY_INSTANTIATED 103 +# define RAND_R_ARGUMENT_OUT_OF_RANGE 105 +# define RAND_R_CANNOT_OPEN_FILE 121 +# define RAND_R_DRBG_ALREADY_INITIALIZED 129 +# define RAND_R_DRBG_NOT_INITIALISED 104 +# define RAND_R_ENTROPY_INPUT_TOO_LONG 106 +# define RAND_R_ENTROPY_OUT_OF_RANGE 124 +# define RAND_R_ERROR_ENTROPY_POOL_WAS_IGNORED 127 +# define RAND_R_ERROR_INITIALISING_DRBG 107 +# define RAND_R_ERROR_INSTANTIATING_DRBG 108 +# define RAND_R_ERROR_RETRIEVING_ADDITIONAL_INPUT 109 +# define RAND_R_ERROR_RETRIEVING_ENTROPY 110 +# define RAND_R_ERROR_RETRIEVING_NONCE 111 +# define RAND_R_FAILED_TO_CREATE_LOCK 126 +# define RAND_R_FUNC_NOT_IMPLEMENTED 101 +# define RAND_R_FWRITE_ERROR 123 +# define RAND_R_GENERATE_ERROR 112 +# define RAND_R_INSUFFICIENT_DRBG_STRENGTH 139 +# define RAND_R_INTERNAL_ERROR 113 +# define RAND_R_IN_ERROR_STATE 114 +# define RAND_R_NOT_A_REGULAR_FILE 122 +# define RAND_R_NOT_INSTANTIATED 115 +# define RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED 128 +# define RAND_R_PARENT_LOCKING_NOT_ENABLED 130 +# define RAND_R_PARENT_STRENGTH_TOO_WEAK 131 +# define RAND_R_PERSONALISATION_STRING_TOO_LONG 116 +# define RAND_R_PREDICTION_RESISTANCE_NOT_SUPPORTED 133 +# define RAND_R_PRNG_NOT_SEEDED 100 +# define RAND_R_RANDOM_POOL_OVERFLOW 125 +# define RAND_R_RANDOM_POOL_UNDERFLOW 134 +# define RAND_R_REQUEST_TOO_LARGE_FOR_DRBG 117 +# define RAND_R_RESEED_ERROR 118 +# define RAND_R_SELFTEST_FAILURE 119 +# define RAND_R_TOO_LITTLE_NONCE_REQUESTED 135 +# define RAND_R_TOO_MUCH_NONCE_REQUESTED 136 +# define RAND_R_UNABLE_TO_CREATE_DRBG 143 +# define RAND_R_UNABLE_TO_FETCH_DRBG 144 +# define RAND_R_UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER 141 +# define RAND_R_UNABLE_TO_GET_PARENT_STRENGTH 138 +# define RAND_R_UNABLE_TO_LOCK_PARENT 140 +# define RAND_R_UNSUPPORTED_DRBG_FLAGS 132 +# define RAND_R_UNSUPPORTED_DRBG_TYPE 120 + +#endif diff --git a/OtherInc/openssl/include/openssl/rc2.h b/OtherInc/openssl/include/openssl/rc2.h new file mode 100644 index 0000000..ff633fd --- /dev/null +++ b/OtherInc/openssl/include/openssl/rc2.h @@ -0,0 +1,68 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_RC2_H +# define OPENSSL_RC2_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_RC2_H +# endif + +# include + +# ifndef OPENSSL_NO_RC2 +# ifdef __cplusplus +extern "C" { +# endif + +# define RC2_BLOCK 8 +# define RC2_KEY_LENGTH 16 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef unsigned int RC2_INT; + +# define RC2_ENCRYPT 1 +# define RC2_DECRYPT 0 + +typedef struct rc2_key_st { + RC2_INT data[64]; +} RC2_KEY; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void RC2_set_key(RC2_KEY *key, int len, + const unsigned char *data, int bits); +OSSL_DEPRECATEDIN_3_0 void RC2_ecb_encrypt(const unsigned char *in, + unsigned char *out, RC2_KEY *key, + int enc); +OSSL_DEPRECATEDIN_3_0 void RC2_encrypt(unsigned long *data, RC2_KEY *key); +OSSL_DEPRECATEDIN_3_0 void RC2_decrypt(unsigned long *data, RC2_KEY *key); +OSSL_DEPRECATEDIN_3_0 void RC2_cbc_encrypt(const unsigned char *in, + unsigned char *out, long length, + RC2_KEY *ks, unsigned char *iv, + int enc); +OSSL_DEPRECATEDIN_3_0 void RC2_cfb64_encrypt(const unsigned char *in, + unsigned char *out, long length, + RC2_KEY *schedule, + unsigned char *ivec, + int *num, int enc); +OSSL_DEPRECATEDIN_3_0 void RC2_ofb64_encrypt(const unsigned char *in, + unsigned char *out, long length, + RC2_KEY *schedule, + unsigned char *ivec, + int *num); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/rc4.h b/OtherInc/openssl/include/openssl/rc4.h new file mode 100644 index 0000000..600b288 --- /dev/null +++ b/OtherInc/openssl/include/openssl/rc4.h @@ -0,0 +1,47 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_RC4_H +# define OPENSSL_RC4_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_RC4_H +# endif + +# include + +# ifndef OPENSSL_NO_RC4 +# include +# ifdef __cplusplus +extern "C" { +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef struct rc4_key_st { + RC4_INT x, y; + RC4_INT data[256]; +} RC4_KEY; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *RC4_options(void); +OSSL_DEPRECATEDIN_3_0 void RC4_set_key(RC4_KEY *key, int len, + const unsigned char *data); +OSSL_DEPRECATEDIN_3_0 void RC4(RC4_KEY *key, size_t len, + const unsigned char *indata, + unsigned char *outdata); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/rc5.h b/OtherInc/openssl/include/openssl/rc5.h new file mode 100644 index 0000000..de83352 --- /dev/null +++ b/OtherInc/openssl/include/openssl/rc5.h @@ -0,0 +1,79 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_RC5_H +# define OPENSSL_RC5_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_RC5_H +# endif + +# include + +# ifndef OPENSSL_NO_RC5 +# ifdef __cplusplus +extern "C" { +# endif + +# define RC5_32_BLOCK 8 +# define RC5_32_KEY_LENGTH 16/* This is a default, max is 255 */ + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define RC5_ENCRYPT 1 +# define RC5_DECRYPT 0 + +# define RC5_32_INT unsigned int + +/* + * This are the only values supported. Tweak the code if you want more The + * most supported modes will be RC5-32/12/16 RC5-32/16/8 + */ +# define RC5_8_ROUNDS 8 +# define RC5_12_ROUNDS 12 +# define RC5_16_ROUNDS 16 + +typedef struct rc5_key_st { + /* Number of rounds */ + int rounds; + RC5_32_INT data[2 * (RC5_16_ROUNDS + 1)]; +} RC5_32_KEY; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int RC5_32_set_key(RC5_32_KEY *key, int len, + const unsigned char *data, + int rounds); +OSSL_DEPRECATEDIN_3_0 void RC5_32_ecb_encrypt(const unsigned char *in, + unsigned char *out, + RC5_32_KEY *key, + int enc); +OSSL_DEPRECATEDIN_3_0 void RC5_32_encrypt(unsigned long *data, RC5_32_KEY *key); +OSSL_DEPRECATEDIN_3_0 void RC5_32_decrypt(unsigned long *data, RC5_32_KEY *key); +OSSL_DEPRECATEDIN_3_0 void RC5_32_cbc_encrypt(const unsigned char *in, + unsigned char *out, long length, + RC5_32_KEY *ks, unsigned char *iv, + int enc); +OSSL_DEPRECATEDIN_3_0 void RC5_32_cfb64_encrypt(const unsigned char *in, + unsigned char *out, long length, + RC5_32_KEY *schedule, + unsigned char *ivec, int *num, + int enc); +OSSL_DEPRECATEDIN_3_0 void RC5_32_ofb64_encrypt(const unsigned char *in, + unsigned char *out, long length, + RC5_32_KEY *schedule, + unsigned char *ivec, int *num); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/ripemd.h b/OtherInc/openssl/include/openssl/ripemd.h new file mode 100644 index 0000000..900ee31 --- /dev/null +++ b/OtherInc/openssl/include/openssl/ripemd.h @@ -0,0 +1,59 @@ +/* + * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_RIPEMD_H +# define OPENSSL_RIPEMD_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_RIPEMD_H +# endif + +# include + +# ifndef OPENSSL_NO_RMD160 +# include +# include + +# define RIPEMD160_DIGEST_LENGTH 20 + +# ifdef __cplusplus +extern "C" { +# endif +# if !defined(OPENSSL_NO_DEPRECATED_3_0) + +# define RIPEMD160_LONG unsigned int + +# define RIPEMD160_CBLOCK 64 +# define RIPEMD160_LBLOCK (RIPEMD160_CBLOCK/4) + +typedef struct RIPEMD160state_st { + RIPEMD160_LONG A, B, C, D, E; + RIPEMD160_LONG Nl, Nh; + RIPEMD160_LONG data[RIPEMD160_LBLOCK]; + unsigned int num; +} RIPEMD160_CTX; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int RIPEMD160_Init(RIPEMD160_CTX *c); +OSSL_DEPRECATEDIN_3_0 int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, + size_t len); +OSSL_DEPRECATEDIN_3_0 int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); +OSSL_DEPRECATEDIN_3_0 unsigned char *RIPEMD160(const unsigned char *d, size_t n, + unsigned char *md); +OSSL_DEPRECATEDIN_3_0 void RIPEMD160_Transform(RIPEMD160_CTX *c, + const unsigned char *b); +# endif + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/rsa.h b/OtherInc/openssl/include/openssl/rsa.h new file mode 100644 index 0000000..a55c972 --- /dev/null +++ b/OtherInc/openssl/include/openssl/rsa.h @@ -0,0 +1,604 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_RSA_H +# define OPENSSL_RSA_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_RSA_H +# endif + +# include + +# include +# include +# include +# include +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# endif +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# ifndef OPENSSL_RSA_MAX_MODULUS_BITS +# define OPENSSL_RSA_MAX_MODULUS_BITS 16384 +# endif + +# define RSA_3 0x3L +# define RSA_F4 0x10001L + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* The types RSA and RSA_METHOD are defined in ossl_typ.h */ + +# define OPENSSL_RSA_FIPS_MIN_MODULUS_BITS 2048 + +# ifndef OPENSSL_RSA_SMALL_MODULUS_BITS +# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 +# endif + +/* exponent limit enforced for "large" modulus only */ +# ifndef OPENSSL_RSA_MAX_PUBEXP_BITS +# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 +# endif +/* based on RFC 8017 appendix A.1.2 */ +# define RSA_ASN1_VERSION_DEFAULT 0 +# define RSA_ASN1_VERSION_MULTI 1 + +# define RSA_DEFAULT_PRIME_NUM 2 + +# define RSA_METHOD_FLAG_NO_CHECK 0x0001 +# define RSA_FLAG_CACHE_PUBLIC 0x0002 +# define RSA_FLAG_CACHE_PRIVATE 0x0004 +# define RSA_FLAG_BLINDING 0x0008 +# define RSA_FLAG_THREAD_SAFE 0x0010 +/* + * This flag means the private key operations will be handled by rsa_mod_exp + * and that they do not depend on the private key components being present: + * for example a key stored in external hardware. Without this flag + * bn_mod_exp gets called when private key components are absent. + */ +# define RSA_FLAG_EXT_PKEY 0x0020 + +/* + * new with 0.9.6j and 0.9.7b; the built-in + * RSA implementation now uses blinding by + * default (ignoring RSA_FLAG_BLINDING), + * but other engines might not need it + */ +# define RSA_FLAG_NO_BLINDING 0x0080 +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ +/* + * Does nothing. Previously this switched off constant time behaviour. + */ +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define RSA_FLAG_NO_CONSTTIME 0x0000 +# endif +/* deprecated name for the flag*/ +/* + * new with 0.9.7h; the built-in RSA + * implementation now uses constant time + * modular exponentiation for secret exponents + * by default. This flag causes the + * faster variable sliding window method to + * be used for all exponents. + */ +# ifndef OPENSSL_NO_DEPRECATED_0_9_8 +# define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME +# endif + +/*- + * New with 3.0: use part of the flags to denote exact type of RSA key, + * some of which are limited to specific signature and encryption schemes. + * These different types share the same RSA structure, but indicate the + * use of certain fields in that structure. + * Currently known are: + * RSA - this is the "normal" unlimited RSA structure (typenum 0) + * RSASSA-PSS - indicates that the PSS parameters are used. + * RSAES-OAEP - no specific field used for the moment, but OAEP padding + * is expected. (currently unused) + * + * 4 bits allow for 16 types + */ +# define RSA_FLAG_TYPE_MASK 0xF000 +# define RSA_FLAG_TYPE_RSA 0x0000 +# define RSA_FLAG_TYPE_RSASSAPSS 0x1000 +# define RSA_FLAG_TYPE_RSAESOAEP 0x2000 + +int EVP_PKEY_CTX_set_rsa_padding(EVP_PKEY_CTX *ctx, int pad_mode); +int EVP_PKEY_CTX_get_rsa_padding(EVP_PKEY_CTX *ctx, int *pad_mode); + +int EVP_PKEY_CTX_set_rsa_pss_saltlen(EVP_PKEY_CTX *ctx, int saltlen); +int EVP_PKEY_CTX_get_rsa_pss_saltlen(EVP_PKEY_CTX *ctx, int *saltlen); + +int EVP_PKEY_CTX_set_rsa_keygen_bits(EVP_PKEY_CTX *ctx, int bits); +int EVP_PKEY_CTX_set1_rsa_keygen_pubexp(EVP_PKEY_CTX *ctx, BIGNUM *pubexp); +int EVP_PKEY_CTX_set_rsa_keygen_primes(EVP_PKEY_CTX *ctx, int primes); +int EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen(EVP_PKEY_CTX *ctx, int saltlen); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int EVP_PKEY_CTX_set_rsa_keygen_pubexp(EVP_PKEY_CTX *ctx, BIGNUM *pubexp); +# endif + +/* Salt length matches digest */ +# define RSA_PSS_SALTLEN_DIGEST -1 +/* Verify only: auto detect salt length */ +# define RSA_PSS_SALTLEN_AUTO -2 +/* Set salt length to maximum possible */ +# define RSA_PSS_SALTLEN_MAX -3 +/* Old compatible max salt length for sign only */ +# define RSA_PSS_SALTLEN_MAX_SIGN -2 + +int EVP_PKEY_CTX_set_rsa_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); +int EVP_PKEY_CTX_set_rsa_mgf1_md_name(EVP_PKEY_CTX *ctx, const char *mdname, + const char *mdprops); +int EVP_PKEY_CTX_get_rsa_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD **md); +int EVP_PKEY_CTX_get_rsa_mgf1_md_name(EVP_PKEY_CTX *ctx, char *name, + size_t namelen); +int EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); +int EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md_name(EVP_PKEY_CTX *ctx, + const char *mdname); + +int EVP_PKEY_CTX_set_rsa_pss_keygen_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); +int EVP_PKEY_CTX_set_rsa_pss_keygen_md_name(EVP_PKEY_CTX *ctx, + const char *mdname, + const char *mdprops); + +int EVP_PKEY_CTX_set_rsa_oaep_md(EVP_PKEY_CTX *ctx, const EVP_MD *md); +int EVP_PKEY_CTX_set_rsa_oaep_md_name(EVP_PKEY_CTX *ctx, const char *mdname, + const char *mdprops); +int EVP_PKEY_CTX_get_rsa_oaep_md(EVP_PKEY_CTX *ctx, const EVP_MD **md); +int EVP_PKEY_CTX_get_rsa_oaep_md_name(EVP_PKEY_CTX *ctx, char *name, + size_t namelen); +int EVP_PKEY_CTX_set0_rsa_oaep_label(EVP_PKEY_CTX *ctx, void *label, int llen); +int EVP_PKEY_CTX_get0_rsa_oaep_label(EVP_PKEY_CTX *ctx, unsigned char **label); + +# define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1) +# define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 2) + +# define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 3) +# define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4) +# define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 5) + +# define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 6) +# define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 7) +# define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 8) + +# define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 9) +# define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 10) + +# define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 11) +# define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12) + +# define EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES (EVP_PKEY_ALG_CTRL + 13) + +# define RSA_PKCS1_PADDING 1 +# define RSA_NO_PADDING 3 +# define RSA_PKCS1_OAEP_PADDING 4 +# define RSA_X931_PADDING 5 + +/* EVP_PKEY_ only */ +# define RSA_PKCS1_PSS_PADDING 6 +# define RSA_PKCS1_WITH_TLS_PADDING 7 + +# define RSA_PKCS1_PADDING_SIZE 11 + +# define RSA_set_app_data(s,arg) RSA_set_ex_data(s,0,arg) +# define RSA_get_app_data(s) RSA_get_ex_data(s,0) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 RSA *RSA_new(void); +OSSL_DEPRECATEDIN_3_0 RSA *RSA_new_method(ENGINE *engine); +OSSL_DEPRECATEDIN_3_0 int RSA_bits(const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 int RSA_size(const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 int RSA_security_bits(const RSA *rsa); + +OSSL_DEPRECATEDIN_3_0 int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d); +OSSL_DEPRECATEDIN_3_0 int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q); +OSSL_DEPRECATEDIN_3_0 int RSA_set0_crt_params(RSA *r, + BIGNUM *dmp1, BIGNUM *dmq1, + BIGNUM *iqmp); +OSSL_DEPRECATEDIN_3_0 int RSA_set0_multi_prime_params(RSA *r, + BIGNUM *primes[], + BIGNUM *exps[], + BIGNUM *coeffs[], + int pnum); +OSSL_DEPRECATEDIN_3_0 void RSA_get0_key(const RSA *r, + const BIGNUM **n, const BIGNUM **e, + const BIGNUM **d); +OSSL_DEPRECATEDIN_3_0 void RSA_get0_factors(const RSA *r, + const BIGNUM **p, const BIGNUM **q); +OSSL_DEPRECATEDIN_3_0 int RSA_get_multi_prime_extra_count(const RSA *r); +OSSL_DEPRECATEDIN_3_0 int RSA_get0_multi_prime_factors(const RSA *r, + const BIGNUM *primes[]); +OSSL_DEPRECATEDIN_3_0 void RSA_get0_crt_params(const RSA *r, + const BIGNUM **dmp1, + const BIGNUM **dmq1, + const BIGNUM **iqmp); +OSSL_DEPRECATEDIN_3_0 +int RSA_get0_multi_prime_crt_params(const RSA *r, const BIGNUM *exps[], + const BIGNUM *coeffs[]); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *RSA_get0_n(const RSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *RSA_get0_e(const RSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *RSA_get0_d(const RSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *RSA_get0_p(const RSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *RSA_get0_q(const RSA *d); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *RSA_get0_dmp1(const RSA *r); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *RSA_get0_dmq1(const RSA *r); +OSSL_DEPRECATEDIN_3_0 const BIGNUM *RSA_get0_iqmp(const RSA *r); +OSSL_DEPRECATEDIN_3_0 const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *r); +OSSL_DEPRECATEDIN_3_0 void RSA_clear_flags(RSA *r, int flags); +OSSL_DEPRECATEDIN_3_0 int RSA_test_flags(const RSA *r, int flags); +OSSL_DEPRECATEDIN_3_0 void RSA_set_flags(RSA *r, int flags); +OSSL_DEPRECATEDIN_3_0 int RSA_get_version(RSA *r); +OSSL_DEPRECATEDIN_3_0 ENGINE *RSA_get0_engine(const RSA *r); +# endif /* !OPENSSL_NO_DEPRECATED_3_0 */ + +# define EVP_RSA_gen(bits) \ + EVP_PKEY_Q_keygen(NULL, NULL, "RSA", (size_t)(0 + (bits))) + +/* Deprecated version */ +# ifndef OPENSSL_NO_DEPRECATED_0_9_8 +OSSL_DEPRECATEDIN_0_9_8 RSA *RSA_generate_key(int bits, unsigned long e, void + (*callback) (int, int, void *), + void *cb_arg); +# endif + +/* New version */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, + BN_GENCB *cb); +/* Multi-prime version */ +OSSL_DEPRECATEDIN_3_0 int RSA_generate_multi_prime_key(RSA *rsa, int bits, + int primes, BIGNUM *e, + BN_GENCB *cb); + +OSSL_DEPRECATEDIN_3_0 +int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, + BIGNUM *q1, BIGNUM *q2, + const BIGNUM *Xp1, const BIGNUM *Xp2, + const BIGNUM *Xp, const BIGNUM *Xq1, + const BIGNUM *Xq2, const BIGNUM *Xq, + const BIGNUM *e, BN_GENCB *cb); +OSSL_DEPRECATEDIN_3_0 int RSA_X931_generate_key_ex(RSA *rsa, int bits, + const BIGNUM *e, + BN_GENCB *cb); + +OSSL_DEPRECATEDIN_3_0 int RSA_check_key(const RSA *); +OSSL_DEPRECATEDIN_3_0 int RSA_check_key_ex(const RSA *, BN_GENCB *cb); + /* next 4 return -1 on error */ +OSSL_DEPRECATEDIN_3_0 +int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, + RSA *rsa, int padding); +OSSL_DEPRECATEDIN_3_0 +int RSA_private_encrypt(int flen, const unsigned char *from, unsigned char *to, + RSA *rsa, int padding); +OSSL_DEPRECATEDIN_3_0 +int RSA_public_decrypt(int flen, const unsigned char *from, unsigned char *to, + RSA *rsa, int padding); +OSSL_DEPRECATEDIN_3_0 +int RSA_private_decrypt(int flen, const unsigned char *from, unsigned char *to, + RSA *rsa, int padding); +OSSL_DEPRECATEDIN_3_0 void RSA_free(RSA *r); +/* "up" the RSA object's reference count */ +OSSL_DEPRECATEDIN_3_0 int RSA_up_ref(RSA *r); +OSSL_DEPRECATEDIN_3_0 int RSA_flags(const RSA *r); + +OSSL_DEPRECATEDIN_3_0 void RSA_set_default_method(const RSA_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 const RSA_METHOD *RSA_get_default_method(void); +OSSL_DEPRECATEDIN_3_0 const RSA_METHOD *RSA_null_method(void); +OSSL_DEPRECATEDIN_3_0 const RSA_METHOD *RSA_get_method(const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 int RSA_set_method(RSA *rsa, const RSA_METHOD *meth); + +/* these are the actual RSA functions */ +OSSL_DEPRECATEDIN_3_0 const RSA_METHOD *RSA_PKCS1_OpenSSL(void); + +DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(OSSL_DEPRECATEDIN_3_0, + RSA, RSAPublicKey) +DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(OSSL_DEPRECATEDIN_3_0, + RSA, RSAPrivateKey) +# endif /* !OPENSSL_NO_DEPRECATED_3_0 */ + +int RSA_pkey_ctx_ctrl(EVP_PKEY_CTX *ctx, int optype, int cmd, int p1, void *p2); + +struct rsa_pss_params_st { + X509_ALGOR *hashAlgorithm; + X509_ALGOR *maskGenAlgorithm; + ASN1_INTEGER *saltLength; + ASN1_INTEGER *trailerField; + /* Decoded hash algorithm from maskGenAlgorithm */ + X509_ALGOR *maskHash; +}; + +DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS) +DECLARE_ASN1_DUP_FUNCTION(RSA_PSS_PARAMS) + +typedef struct rsa_oaep_params_st { + X509_ALGOR *hashFunc; + X509_ALGOR *maskGenFunc; + X509_ALGOR *pSourceFunc; + /* Decoded hash algorithm from maskGenFunc */ + X509_ALGOR *maskHash; +} RSA_OAEP_PARAMS; + +DECLARE_ASN1_FUNCTIONS(RSA_OAEP_PARAMS) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_STDIO +OSSL_DEPRECATEDIN_3_0 int RSA_print_fp(FILE *fp, const RSA *r, int offset); +# endif + +OSSL_DEPRECATEDIN_3_0 int RSA_print(BIO *bp, const RSA *r, int offset); + +/* + * The following 2 functions sign and verify a X509_SIG ASN1 object inside + * PKCS#1 padded RSA encryption + */ +OSSL_DEPRECATEDIN_3_0 int RSA_sign(int type, const unsigned char *m, + unsigned int m_length, unsigned char *sigret, + unsigned int *siglen, RSA *rsa); +OSSL_DEPRECATEDIN_3_0 int RSA_verify(int type, const unsigned char *m, + unsigned int m_length, + const unsigned char *sigbuf, + unsigned int siglen, RSA *rsa); + +/* + * The following 2 function sign and verify a ASN1_OCTET_STRING object inside + * PKCS#1 padded RSA encryption + */ +OSSL_DEPRECATEDIN_3_0 +int RSA_sign_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +int RSA_verify_ASN1_OCTET_STRING(int type, + const unsigned char *m, unsigned int m_length, + unsigned char *sigbuf, unsigned int siglen, + RSA *rsa); + +OSSL_DEPRECATEDIN_3_0 int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 void RSA_blinding_off(RSA *rsa); +OSSL_DEPRECATEDIN_3_0 BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx); + +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl); +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl); +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +OSSL_DEPRECATEDIN_3_0 int PKCS1_MGF1(unsigned char *mask, long len, + const unsigned char *seed, long seedlen, + const EVP_MD *dgst); +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, + const unsigned char *p, int pl); +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen, + const unsigned char *f, int fl, int rsa_len, + const unsigned char *p, int pl); +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + const unsigned char *param, int plen, + const EVP_MD *md, const EVP_MD *mgf1md); +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen, + const unsigned char *from, int flen, + int num, + const unsigned char *param, int plen, + const EVP_MD *md, const EVP_MD *mgf1md); +OSSL_DEPRECATEDIN_3_0 int RSA_padding_add_none(unsigned char *to, int tlen, + const unsigned char *f, int fl); +OSSL_DEPRECATEDIN_3_0 int RSA_padding_check_none(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +OSSL_DEPRECATEDIN_3_0 int RSA_padding_add_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl); +OSSL_DEPRECATEDIN_3_0 int RSA_padding_check_X931(unsigned char *to, int tlen, + const unsigned char *f, int fl, + int rsa_len); +OSSL_DEPRECATEDIN_3_0 int RSA_X931_hash_id(int nid); + +OSSL_DEPRECATEDIN_3_0 +int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const unsigned char *EM, + int sLen); +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, const EVP_MD *Hash, + int sLen); + +OSSL_DEPRECATEDIN_3_0 +int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + const unsigned char *EM, int sLen); + +OSSL_DEPRECATEDIN_3_0 +int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM, + const unsigned char *mHash, + const EVP_MD *Hash, const EVP_MD *mgf1Hash, + int sLen); + +# define RSA_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_RSA, l, p, newf, dupf, freef) +OSSL_DEPRECATEDIN_3_0 int RSA_set_ex_data(RSA *r, int idx, void *arg); +OSSL_DEPRECATEDIN_3_0 void *RSA_get_ex_data(const RSA *r, int idx); + +DECLARE_ASN1_DUP_FUNCTION_name_attr(OSSL_DEPRECATEDIN_3_0, RSA, RSAPublicKey) +DECLARE_ASN1_DUP_FUNCTION_name_attr(OSSL_DEPRECATEDIN_3_0, RSA, RSAPrivateKey) + +/* + * If this flag is set the RSA method is FIPS compliant and can be used in + * FIPS mode. This is set in the validated module method. If an application + * sets this flag in its own methods it is its responsibility to ensure the + * result is compliant. + */ + +# define RSA_FLAG_FIPS_METHOD 0x0400 + +/* + * If this flag is set the operations normally disabled in FIPS mode are + * permitted it is then the applications responsibility to ensure that the + * usage is compliant. + */ + +# define RSA_FLAG_NON_FIPS_ALLOW 0x0400 +/* + * Application has decided PRNG is good enough to generate a key: don't + * check. + */ +# define RSA_FLAG_CHECKED 0x0800 + +OSSL_DEPRECATEDIN_3_0 RSA_METHOD *RSA_meth_new(const char *name, int flags); +OSSL_DEPRECATEDIN_3_0 void RSA_meth_free(RSA_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 RSA_METHOD *RSA_meth_dup(const RSA_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 const char *RSA_meth_get0_name(const RSA_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 int RSA_meth_set1_name(RSA_METHOD *meth, + const char *name); +OSSL_DEPRECATEDIN_3_0 int RSA_meth_get_flags(const RSA_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 int RSA_meth_set_flags(RSA_METHOD *meth, int flags); +OSSL_DEPRECATEDIN_3_0 void *RSA_meth_get0_app_data(const RSA_METHOD *meth); +OSSL_DEPRECATEDIN_3_0 int RSA_meth_set0_app_data(RSA_METHOD *meth, + void *app_data); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_pub_enc(const RSA_METHOD *meth)) (int flen, + const unsigned char *from, + unsigned char *to, + RSA *rsa, int padding); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_pub_enc(RSA_METHOD *rsa, + int (*pub_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, + int padding)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_pub_dec(const RSA_METHOD *meth)) (int flen, + const unsigned char *from, + unsigned char *to, + RSA *rsa, int padding); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_pub_dec(RSA_METHOD *rsa, + int (*pub_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, + int padding)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_priv_enc(const RSA_METHOD *meth)) (int flen, + const unsigned char *from, + unsigned char *to, + RSA *rsa, int padding); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_priv_enc(RSA_METHOD *rsa, + int (*priv_enc) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, + int padding)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_priv_dec(const RSA_METHOD *meth)) (int flen, + const unsigned char *from, + unsigned char *to, + RSA *rsa, int padding); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_priv_dec(RSA_METHOD *rsa, + int (*priv_dec) (int flen, const unsigned char *from, + unsigned char *to, RSA *rsa, + int padding)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_mod_exp(const RSA_METHOD *meth)) (BIGNUM *r0, + const BIGNUM *i, + RSA *rsa, BN_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_mod_exp(RSA_METHOD *rsa, + int (*mod_exp) (BIGNUM *r0, const BIGNUM *i, RSA *rsa, + BN_CTX *ctx)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_bn_mod_exp(const RSA_METHOD *meth)) (BIGNUM *r, + const BIGNUM *a, + const BIGNUM *p, + const BIGNUM *m, + BN_CTX *ctx, + BN_MONT_CTX *m_ctx); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_bn_mod_exp(RSA_METHOD *rsa, + int (*bn_mod_exp) (BIGNUM *r, + const BIGNUM *a, + const BIGNUM *p, + const BIGNUM *m, + BN_CTX *ctx, + BN_MONT_CTX *m_ctx)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_init(const RSA_METHOD *meth)) (RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_init(RSA_METHOD *rsa, int (*init) (RSA *rsa)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_finish(const RSA_METHOD *meth)) (RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_finish(RSA_METHOD *rsa, int (*finish) (RSA *rsa)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_sign(const RSA_METHOD *meth)) (int type, + const unsigned char *m, + unsigned int m_length, + unsigned char *sigret, + unsigned int *siglen, + const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_sign(RSA_METHOD *rsa, + int (*sign) (int type, const unsigned char *m, + unsigned int m_length, + unsigned char *sigret, unsigned int *siglen, + const RSA *rsa)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_verify(const RSA_METHOD *meth)) (int dtype, + const unsigned char *m, + unsigned int m_length, + const unsigned char *sigbuf, + unsigned int siglen, + const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_verify(RSA_METHOD *rsa, + int (*verify) (int dtype, const unsigned char *m, + unsigned int m_length, + const unsigned char *sigbuf, + unsigned int siglen, const RSA *rsa)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_keygen(const RSA_METHOD *meth)) (RSA *rsa, int bits, + BIGNUM *e, BN_GENCB *cb); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_keygen(RSA_METHOD *rsa, + int (*keygen) (RSA *rsa, int bits, BIGNUM *e, + BN_GENCB *cb)); +OSSL_DEPRECATEDIN_3_0 +int (*RSA_meth_get_multi_prime_keygen(const RSA_METHOD *meth)) (RSA *rsa, + int bits, + int primes, + BIGNUM *e, + BN_GENCB *cb); +OSSL_DEPRECATEDIN_3_0 +int RSA_meth_set_multi_prime_keygen(RSA_METHOD *meth, + int (*keygen) (RSA *rsa, int bits, + int primes, BIGNUM *e, + BN_GENCB *cb)); +#endif /* !OPENSSL_NO_DEPRECATED_3_0 */ + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/rsaerr.h b/OtherInc/openssl/include/openssl/rsaerr.h new file mode 100644 index 0000000..c58463c --- /dev/null +++ b/OtherInc/openssl/include/openssl/rsaerr.h @@ -0,0 +1,107 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_RSAERR_H +# define OPENSSL_RSAERR_H +# pragma once + +# include +# include +# include + + + +/* + * RSA reason codes. + */ +# define RSA_R_ALGORITHM_MISMATCH 100 +# define RSA_R_BAD_E_VALUE 101 +# define RSA_R_BAD_FIXED_HEADER_DECRYPT 102 +# define RSA_R_BAD_PAD_BYTE_COUNT 103 +# define RSA_R_BAD_SIGNATURE 104 +# define RSA_R_BLOCK_TYPE_IS_NOT_01 106 +# define RSA_R_BLOCK_TYPE_IS_NOT_02 107 +# define RSA_R_DATA_GREATER_THAN_MOD_LEN 108 +# define RSA_R_DATA_TOO_LARGE 109 +# define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 110 +# define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 132 +# define RSA_R_DATA_TOO_SMALL 111 +# define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 122 +# define RSA_R_DIGEST_DOES_NOT_MATCH 158 +# define RSA_R_DIGEST_NOT_ALLOWED 145 +# define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 112 +# define RSA_R_DMP1_NOT_CONGRUENT_TO_D 124 +# define RSA_R_DMQ1_NOT_CONGRUENT_TO_D 125 +# define RSA_R_D_E_NOT_CONGRUENT_TO_1 123 +# define RSA_R_FIRST_OCTET_INVALID 133 +# define RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE 144 +# define RSA_R_INVALID_DIGEST 157 +# define RSA_R_INVALID_DIGEST_LENGTH 143 +# define RSA_R_INVALID_HEADER 137 +# define RSA_R_INVALID_KEYPAIR 171 +# define RSA_R_INVALID_KEY_LENGTH 173 +# define RSA_R_INVALID_LABEL 160 +# define RSA_R_INVALID_LENGTH 181 +# define RSA_R_INVALID_MESSAGE_LENGTH 131 +# define RSA_R_INVALID_MGF1_MD 156 +# define RSA_R_INVALID_MODULUS 174 +# define RSA_R_INVALID_MULTI_PRIME_KEY 167 +# define RSA_R_INVALID_OAEP_PARAMETERS 161 +# define RSA_R_INVALID_PADDING 138 +# define RSA_R_INVALID_PADDING_MODE 141 +# define RSA_R_INVALID_PSS_PARAMETERS 149 +# define RSA_R_INVALID_PSS_SALTLEN 146 +# define RSA_R_INVALID_REQUEST 175 +# define RSA_R_INVALID_SALT_LENGTH 150 +# define RSA_R_INVALID_STRENGTH 176 +# define RSA_R_INVALID_TRAILER 139 +# define RSA_R_INVALID_X931_DIGEST 142 +# define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 +# define RSA_R_KEY_PRIME_NUM_INVALID 165 +# define RSA_R_KEY_SIZE_TOO_SMALL 120 +# define RSA_R_LAST_OCTET_INVALID 134 +# define RSA_R_MGF1_DIGEST_NOT_ALLOWED 152 +# define RSA_R_MISSING_PRIVATE_KEY 179 +# define RSA_R_MODULUS_TOO_LARGE 105 +# define RSA_R_MP_COEFFICIENT_NOT_INVERSE_OF_R 168 +# define RSA_R_MP_EXPONENT_NOT_CONGRUENT_TO_D 169 +# define RSA_R_MP_R_NOT_PRIME 170 +# define RSA_R_NO_PUBLIC_EXPONENT 140 +# define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 +# define RSA_R_N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES 172 +# define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 +# define RSA_R_OAEP_DECODING_ERROR 121 +# define RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 148 +# define RSA_R_PADDING_CHECK_FAILED 114 +# define RSA_R_PAIRWISE_TEST_FAILURE 177 +# define RSA_R_PKCS_DECODING_ERROR 159 +# define RSA_R_PSS_SALTLEN_TOO_SMALL 164 +# define RSA_R_PUB_EXPONENT_OUT_OF_RANGE 178 +# define RSA_R_P_NOT_PRIME 128 +# define RSA_R_Q_NOT_PRIME 129 +# define RSA_R_RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT 180 +# define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED 130 +# define RSA_R_SLEN_CHECK_FAILED 136 +# define RSA_R_SLEN_RECOVERY_FAILED 135 +# define RSA_R_SSLV3_ROLLBACK_ATTACK 115 +# define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116 +# define RSA_R_UNKNOWN_ALGORITHM_TYPE 117 +# define RSA_R_UNKNOWN_DIGEST 166 +# define RSA_R_UNKNOWN_MASK_DIGEST 151 +# define RSA_R_UNKNOWN_PADDING_TYPE 118 +# define RSA_R_UNSUPPORTED_ENCRYPTION_TYPE 162 +# define RSA_R_UNSUPPORTED_LABEL_SOURCE 163 +# define RSA_R_UNSUPPORTED_MASK_ALGORITHM 153 +# define RSA_R_UNSUPPORTED_MASK_PARAMETER 154 +# define RSA_R_UNSUPPORTED_SIGNATURE_TYPE 155 +# define RSA_R_VALUE_MISSING 147 +# define RSA_R_WRONG_SIGNATURE_LENGTH 119 + +#endif diff --git a/OtherInc/openssl/include/openssl/safestack.h b/OtherInc/openssl/include/openssl/safestack.h new file mode 100644 index 0000000..159ccf2 --- /dev/null +++ b/OtherInc/openssl/include/openssl/safestack.h @@ -0,0 +1,297 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\safestack.h.in + * + * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_SAFESTACK_H +# define OPENSSL_SAFESTACK_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_SAFESTACK_H +# endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define STACK_OF(type) struct stack_st_##type + +/* Helper macro for internal use */ +# define SKM_DEFINE_STACK_OF_INTERNAL(t1, t2, t3) \ + STACK_OF(t1); \ + typedef int (*sk_##t1##_compfunc)(const t3 * const *a, const t3 *const *b); \ + typedef void (*sk_##t1##_freefunc)(t3 *a); \ + typedef t3 * (*sk_##t1##_copyfunc)(const t3 *a); \ + static ossl_unused ossl_inline t2 *ossl_check_##t1##_type(t2 *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const OPENSSL_STACK *ossl_check_const_##t1##_sk_type(const STACK_OF(t1) *sk) \ + { \ + return (const OPENSSL_STACK *)sk; \ + } \ + static ossl_unused ossl_inline OPENSSL_STACK *ossl_check_##t1##_sk_type(STACK_OF(t1) *sk) \ + { \ + return (OPENSSL_STACK *)sk; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_compfunc ossl_check_##t1##_compfunc_type(sk_##t1##_compfunc cmp) \ + { \ + return (OPENSSL_sk_compfunc)cmp; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_copyfunc ossl_check_##t1##_copyfunc_type(sk_##t1##_copyfunc cpy) \ + { \ + return (OPENSSL_sk_copyfunc)cpy; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_freefunc ossl_check_##t1##_freefunc_type(sk_##t1##_freefunc fr) \ + { \ + return (OPENSSL_sk_freefunc)fr; \ + } + +# define SKM_DEFINE_STACK_OF(t1, t2, t3) \ + STACK_OF(t1); \ + typedef int (*sk_##t1##_compfunc)(const t3 * const *a, const t3 *const *b); \ + typedef void (*sk_##t1##_freefunc)(t3 *a); \ + typedef t3 * (*sk_##t1##_copyfunc)(const t3 *a); \ + static ossl_unused ossl_inline int sk_##t1##_num(const STACK_OF(t1) *sk) \ + { \ + return OPENSSL_sk_num((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_value(const STACK_OF(t1) *sk, int idx) \ + { \ + return (t2 *)OPENSSL_sk_value((const OPENSSL_STACK *)sk, idx); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new(sk_##t1##_compfunc compare) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new((OPENSSL_sk_compfunc)compare); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_null(void) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_null(); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_reserve(sk_##t1##_compfunc compare, int n) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_reserve((OPENSSL_sk_compfunc)compare, n); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_reserve(STACK_OF(t1) *sk, int n) \ + { \ + return OPENSSL_sk_reserve((OPENSSL_STACK *)sk, n); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_free(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_free((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_zero(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_zero((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_delete(STACK_OF(t1) *sk, int i) \ + { \ + return (t2 *)OPENSSL_sk_delete((OPENSSL_STACK *)sk, i); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_delete_ptr(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return (t2 *)OPENSSL_sk_delete_ptr((OPENSSL_STACK *)sk, \ + (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_push(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_push((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_unshift(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_unshift((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_pop(STACK_OF(t1) *sk) \ + { \ + return (t2 *)OPENSSL_sk_pop((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_shift(STACK_OF(t1) *sk) \ + { \ + return (t2 *)OPENSSL_sk_shift((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_pop_free(STACK_OF(t1) *sk, sk_##t1##_freefunc freefunc) \ + { \ + OPENSSL_sk_pop_free((OPENSSL_STACK *)sk, (OPENSSL_sk_freefunc)freefunc); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_insert(STACK_OF(t1) *sk, t2 *ptr, int idx) \ + { \ + return OPENSSL_sk_insert((OPENSSL_STACK *)sk, (const void *)ptr, idx); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_set(STACK_OF(t1) *sk, int idx, t2 *ptr) \ + { \ + return (t2 *)OPENSSL_sk_set((OPENSSL_STACK *)sk, idx, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_find((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find_ex(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_find_ex((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find_all(STACK_OF(t1) *sk, t2 *ptr, int *pnum) \ + { \ + return OPENSSL_sk_find_all((OPENSSL_STACK *)sk, (const void *)ptr, pnum); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_sort(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_sort((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_is_sorted(const STACK_OF(t1) *sk) \ + { \ + return OPENSSL_sk_is_sorted((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) * sk_##t1##_dup(const STACK_OF(t1) *sk) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_dup((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_deep_copy(const STACK_OF(t1) *sk, \ + sk_##t1##_copyfunc copyfunc, \ + sk_##t1##_freefunc freefunc) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_deep_copy((const OPENSSL_STACK *)sk, \ + (OPENSSL_sk_copyfunc)copyfunc, \ + (OPENSSL_sk_freefunc)freefunc); \ + } \ + static ossl_unused ossl_inline sk_##t1##_compfunc sk_##t1##_set_cmp_func(STACK_OF(t1) *sk, sk_##t1##_compfunc compare) \ + { \ + return (sk_##t1##_compfunc)OPENSSL_sk_set_cmp_func((OPENSSL_STACK *)sk, (OPENSSL_sk_compfunc)compare); \ + } + +# define DEFINE_STACK_OF(t) SKM_DEFINE_STACK_OF(t, t, t) +# define DEFINE_STACK_OF_CONST(t) SKM_DEFINE_STACK_OF(t, const t, t) +# define DEFINE_SPECIAL_STACK_OF(t1, t2) SKM_DEFINE_STACK_OF(t1, t2, t2) +# define DEFINE_SPECIAL_STACK_OF_CONST(t1, t2) \ + SKM_DEFINE_STACK_OF(t1, const t2, t2) + +/*- + * Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * + * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; +typedef const char *OPENSSL_CSTRING; + +/*- + * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned + * above, instead of a single char each entry is a NUL-terminated array of + * chars. So, we have to implement STRING specially for STACK_OF. This is + * dealt with in the autogenerated macros below. + */ +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_STRING, char, char) +#define sk_OPENSSL_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_value(sk, idx) ((char *)OPENSSL_sk_value(ossl_check_const_OPENSSL_STRING_sk_type(sk), (idx))) +#define sk_OPENSSL_STRING_new(cmp) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new(ossl_check_OPENSSL_STRING_compfunc_type(cmp))) +#define sk_OPENSSL_STRING_new_null() ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_STRING_new_reserve(cmp, n) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_STRING_compfunc_type(cmp), (n))) +#define sk_OPENSSL_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_STRING_sk_type(sk), (n)) +#define sk_OPENSSL_STRING_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_delete(sk, i) ((char *)OPENSSL_sk_delete(ossl_check_OPENSSL_STRING_sk_type(sk), (i))) +#define sk_OPENSSL_STRING_delete_ptr(sk, ptr) ((char *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr))) +#define sk_OPENSSL_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_pop(sk) ((char *)OPENSSL_sk_pop(ossl_check_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_shift(sk) ((char *)OPENSSL_sk_shift(ossl_check_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_STRING_sk_type(sk),ossl_check_OPENSSL_STRING_freefunc_type(freefunc)) +#define sk_OPENSSL_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr), (idx)) +#define sk_OPENSSL_STRING_set(sk, idx, ptr) ((char *)OPENSSL_sk_set(ossl_check_OPENSSL_STRING_sk_type(sk), (idx), ossl_check_OPENSSL_STRING_type(ptr))) +#define sk_OPENSSL_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr), pnum) +#define sk_OPENSSL_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_dup(sk) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_copyfunc_type(copyfunc), ossl_check_OPENSSL_STRING_freefunc_type(freefunc))) +#define sk_OPENSSL_STRING_set_cmp_func(sk, cmp) ((sk_OPENSSL_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_CSTRING, const char, char) +#define sk_OPENSSL_CSTRING_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_value(sk, idx) ((const char *)OPENSSL_sk_value(ossl_check_const_OPENSSL_CSTRING_sk_type(sk), (idx))) +#define sk_OPENSSL_CSTRING_new(cmp) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new(ossl_check_OPENSSL_CSTRING_compfunc_type(cmp))) +#define sk_OPENSSL_CSTRING_new_null() ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_CSTRING_new_reserve(cmp, n) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_CSTRING_compfunc_type(cmp), (n))) +#define sk_OPENSSL_CSTRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_CSTRING_sk_type(sk), (n)) +#define sk_OPENSSL_CSTRING_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_delete(sk, i) ((const char *)OPENSSL_sk_delete(ossl_check_OPENSSL_CSTRING_sk_type(sk), (i))) +#define sk_OPENSSL_CSTRING_delete_ptr(sk, ptr) ((const char *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr))) +#define sk_OPENSSL_CSTRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_pop(sk) ((const char *)OPENSSL_sk_pop(ossl_check_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_shift(sk) ((const char *)OPENSSL_sk_shift(ossl_check_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_CSTRING_sk_type(sk),ossl_check_OPENSSL_CSTRING_freefunc_type(freefunc)) +#define sk_OPENSSL_CSTRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr), (idx)) +#define sk_OPENSSL_CSTRING_set(sk, idx, ptr) ((const char *)OPENSSL_sk_set(ossl_check_OPENSSL_CSTRING_sk_type(sk), (idx), ossl_check_OPENSSL_CSTRING_type(ptr))) +#define sk_OPENSSL_CSTRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr), pnum) +#define sk_OPENSSL_CSTRING_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_dup(sk) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_copyfunc_type(copyfunc), ossl_check_OPENSSL_CSTRING_freefunc_type(freefunc))) +#define sk_OPENSSL_CSTRING_set_cmp_func(sk, cmp) ((sk_OPENSSL_CSTRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_compfunc_type(cmp))) + + +#if !defined(OPENSSL_NO_DEPRECATED_3_0) +/* + * This is not used by OpenSSL. A block of bytes, NOT nul-terminated. + * These should also be distinguished from "normal" stacks. + */ +typedef void *OPENSSL_BLOCK; +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_BLOCK, void, void) +#define sk_OPENSSL_BLOCK_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_value(sk, idx) ((void *)OPENSSL_sk_value(ossl_check_const_OPENSSL_BLOCK_sk_type(sk), (idx))) +#define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new(ossl_check_OPENSSL_BLOCK_compfunc_type(cmp))) +#define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_BLOCK_new_reserve(cmp, n) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_BLOCK_compfunc_type(cmp), (n))) +#define sk_OPENSSL_BLOCK_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_BLOCK_sk_type(sk), (n)) +#define sk_OPENSSL_BLOCK_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_delete(sk, i) ((void *)OPENSSL_sk_delete(ossl_check_OPENSSL_BLOCK_sk_type(sk), (i))) +#define sk_OPENSSL_BLOCK_delete_ptr(sk, ptr) ((void *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr))) +#define sk_OPENSSL_BLOCK_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_pop(sk) ((void *)OPENSSL_sk_pop(ossl_check_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_shift(sk) ((void *)OPENSSL_sk_shift(ossl_check_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_BLOCK_sk_type(sk),ossl_check_OPENSSL_BLOCK_freefunc_type(freefunc)) +#define sk_OPENSSL_BLOCK_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr), (idx)) +#define sk_OPENSSL_BLOCK_set(sk, idx, ptr) ((void *)OPENSSL_sk_set(ossl_check_OPENSSL_BLOCK_sk_type(sk), (idx), ossl_check_OPENSSL_BLOCK_type(ptr))) +#define sk_OPENSSL_BLOCK_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr), pnum) +#define sk_OPENSSL_BLOCK_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_dup(sk) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_copyfunc_type(copyfunc), ossl_check_OPENSSL_BLOCK_freefunc_type(freefunc))) +#define sk_OPENSSL_BLOCK_set_cmp_func(sk, cmp) ((sk_OPENSSL_BLOCK_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_compfunc_type(cmp))) + +#endif + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/seed.h b/OtherInc/openssl/include/openssl/seed.h new file mode 100644 index 0000000..edb218a --- /dev/null +++ b/OtherInc/openssl/include/openssl/seed.h @@ -0,0 +1,113 @@ +/* + * Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Neither the name of author nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef OPENSSL_SEED_H +# define OPENSSL_SEED_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_SEED_H +# endif + +# include + +# ifndef OPENSSL_NO_SEED +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# define SEED_BLOCK_SIZE 16 +# define SEED_KEY_LENGTH 16 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* look whether we need 'long' to get 32 bits */ +# ifdef AES_LONG +# ifndef SEED_LONG +# define SEED_LONG 1 +# endif +# endif + + +typedef struct seed_key_st { +# ifdef SEED_LONG + unsigned long data[32]; +# else + unsigned int data[32]; +# endif +} SEED_KEY_SCHEDULE; +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], + SEED_KEY_SCHEDULE *ks); +OSSL_DEPRECATEDIN_3_0 +void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); +OSSL_DEPRECATEDIN_3_0 +void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], + unsigned char d[SEED_BLOCK_SIZE], + const SEED_KEY_SCHEDULE *ks); +OSSL_DEPRECATEDIN_3_0 +void SEED_ecb_encrypt(const unsigned char *in, + unsigned char *out, + const SEED_KEY_SCHEDULE *ks, int enc); +OSSL_DEPRECATEDIN_3_0 +void SEED_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t len, + const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], + int enc); +OSSL_DEPRECATEDIN_3_0 +void SEED_cfb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], + int *num, int enc); +OSSL_DEPRECATEDIN_3_0 +void SEED_ofb128_encrypt(const unsigned char *in, unsigned char *out, + size_t len, const SEED_KEY_SCHEDULE *ks, + unsigned char ivec[SEED_BLOCK_SIZE], + int *num); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/self_test.h b/OtherInc/openssl/include/openssl/self_test.h new file mode 100644 index 0000000..ee4949e --- /dev/null +++ b/OtherInc/openssl/include/openssl/self_test.h @@ -0,0 +1,92 @@ +/* + * Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_SELF_TEST_H +# define OPENSSL_SELF_TEST_H +# pragma once + +# include /* OSSL_CALLBACK */ + +# ifdef __cplusplus +extern "C" { +# endif + +/* The test event phases */ +# define OSSL_SELF_TEST_PHASE_NONE "None" +# define OSSL_SELF_TEST_PHASE_START "Start" +# define OSSL_SELF_TEST_PHASE_CORRUPT "Corrupt" +# define OSSL_SELF_TEST_PHASE_PASS "Pass" +# define OSSL_SELF_TEST_PHASE_FAIL "Fail" + +/* Test event categories */ +# define OSSL_SELF_TEST_TYPE_NONE "None" +# define OSSL_SELF_TEST_TYPE_MODULE_INTEGRITY "Module_Integrity" +# define OSSL_SELF_TEST_TYPE_INSTALL_INTEGRITY "Install_Integrity" +# define OSSL_SELF_TEST_TYPE_CRNG "Continuous_RNG_Test" +# define OSSL_SELF_TEST_TYPE_PCT "Conditional_PCT" +# define OSSL_SELF_TEST_TYPE_KAT_CIPHER "KAT_Cipher" +# define OSSL_SELF_TEST_TYPE_KAT_ASYM_CIPHER "KAT_AsymmetricCipher" +# define OSSL_SELF_TEST_TYPE_KAT_DIGEST "KAT_Digest" +# define OSSL_SELF_TEST_TYPE_KAT_SIGNATURE "KAT_Signature" +# define OSSL_SELF_TEST_TYPE_PCT_SIGNATURE "PCT_Signature" +# define OSSL_SELF_TEST_TYPE_KAT_KDF "KAT_KDF" +# define OSSL_SELF_TEST_TYPE_KAT_KA "KAT_KA" +# define OSSL_SELF_TEST_TYPE_DRBG "DRBG" + +/* Test event sub categories */ +# define OSSL_SELF_TEST_DESC_NONE "None" +# define OSSL_SELF_TEST_DESC_INTEGRITY_HMAC "HMAC" +# define OSSL_SELF_TEST_DESC_PCT_RSA_PKCS1 "RSA" +# define OSSL_SELF_TEST_DESC_PCT_ECDSA "ECDSA" +# define OSSL_SELF_TEST_DESC_PCT_DSA "DSA" +# define OSSL_SELF_TEST_DESC_CIPHER_AES_GCM "AES_GCM" +# define OSSL_SELF_TEST_DESC_CIPHER_AES_ECB "AES_ECB_Decrypt" +# define OSSL_SELF_TEST_DESC_CIPHER_TDES "TDES" +# define OSSL_SELF_TEST_DESC_ASYM_RSA_ENC "RSA_Encrypt" +# define OSSL_SELF_TEST_DESC_ASYM_RSA_DEC "RSA_Decrypt" +# define OSSL_SELF_TEST_DESC_MD_SHA1 "SHA1" +# define OSSL_SELF_TEST_DESC_MD_SHA2 "SHA2" +# define OSSL_SELF_TEST_DESC_MD_SHA3 "SHA3" +# define OSSL_SELF_TEST_DESC_SIGN_DSA "DSA" +# define OSSL_SELF_TEST_DESC_SIGN_RSA "RSA" +# define OSSL_SELF_TEST_DESC_SIGN_ECDSA "ECDSA" +# define OSSL_SELF_TEST_DESC_DRBG_CTR "CTR" +# define OSSL_SELF_TEST_DESC_DRBG_HASH "HASH" +# define OSSL_SELF_TEST_DESC_DRBG_HMAC "HMAC" +# define OSSL_SELF_TEST_DESC_KA_DH "DH" +# define OSSL_SELF_TEST_DESC_KA_ECDH "ECDH" +# define OSSL_SELF_TEST_DESC_KDF_HKDF "HKDF" +# define OSSL_SELF_TEST_DESC_KDF_SSKDF "SSKDF" +# define OSSL_SELF_TEST_DESC_KDF_X963KDF "X963KDF" +# define OSSL_SELF_TEST_DESC_KDF_X942KDF "X942KDF" +# define OSSL_SELF_TEST_DESC_KDF_PBKDF2 "PBKDF2" +# define OSSL_SELF_TEST_DESC_KDF_SSHKDF "SSHKDF" +# define OSSL_SELF_TEST_DESC_KDF_TLS12_PRF "TLS12_PRF" +# define OSSL_SELF_TEST_DESC_KDF_KBKDF "KBKDF" +# define OSSL_SELF_TEST_DESC_KDF_TLS13_EXTRACT "TLS13_KDF_EXTRACT" +# define OSSL_SELF_TEST_DESC_KDF_TLS13_EXPAND "TLS13_KDF_EXPAND" +# define OSSL_SELF_TEST_DESC_RNG "RNG" + +void OSSL_SELF_TEST_set_callback(OSSL_LIB_CTX *libctx, OSSL_CALLBACK *cb, + void *cbarg); +void OSSL_SELF_TEST_get_callback(OSSL_LIB_CTX *libctx, OSSL_CALLBACK **cb, + void **cbarg); + +OSSL_SELF_TEST *OSSL_SELF_TEST_new(OSSL_CALLBACK *cb, void *cbarg); +void OSSL_SELF_TEST_free(OSSL_SELF_TEST *st); + +void OSSL_SELF_TEST_onbegin(OSSL_SELF_TEST *st, const char *type, + const char *desc); +int OSSL_SELF_TEST_oncorrupt_byte(OSSL_SELF_TEST *st, unsigned char *bytes); +void OSSL_SELF_TEST_onend(OSSL_SELF_TEST *st, int ret); + +# ifdef __cplusplus +} +# endif +#endif /* OPENSSL_SELF_TEST_H */ diff --git a/OtherInc/openssl/include/openssl/sha.h b/OtherInc/openssl/include/openssl/sha.h new file mode 100644 index 0000000..6e65a04 --- /dev/null +++ b/OtherInc/openssl/include/openssl/sha.h @@ -0,0 +1,138 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_SHA_H +# define OPENSSL_SHA_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_SHA_H +# endif + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# define SHA_DIGEST_LENGTH 20 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/*- + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * ! SHA_LONG has to be at least 32 bits wide. ! + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ +# define SHA_LONG unsigned int + +# define SHA_LBLOCK 16 +# define SHA_CBLOCK (SHA_LBLOCK*4)/* SHA treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ +# define SHA_LAST_BLOCK (SHA_CBLOCK-8) + +typedef struct SHAstate_st { + SHA_LONG h0, h1, h2, h3, h4; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num; +} SHA_CTX; + +OSSL_DEPRECATEDIN_3_0 int SHA1_Init(SHA_CTX *c); +OSSL_DEPRECATEDIN_3_0 int SHA1_Update(SHA_CTX *c, const void *data, size_t len); +OSSL_DEPRECATEDIN_3_0 int SHA1_Final(unsigned char *md, SHA_CTX *c); +OSSL_DEPRECATEDIN_3_0 void SHA1_Transform(SHA_CTX *c, const unsigned char *data); +# endif + +unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md); + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SHA256_CBLOCK (SHA_LBLOCK*4)/* SHA-256 treats input data as a + * contiguous array of 32 bit wide + * big-endian values. */ + +typedef struct SHA256state_st { + SHA_LONG h[8]; + SHA_LONG Nl, Nh; + SHA_LONG data[SHA_LBLOCK]; + unsigned int num, md_len; +} SHA256_CTX; + +OSSL_DEPRECATEDIN_3_0 int SHA224_Init(SHA256_CTX *c); +OSSL_DEPRECATEDIN_3_0 int SHA224_Update(SHA256_CTX *c, + const void *data, size_t len); +OSSL_DEPRECATEDIN_3_0 int SHA224_Final(unsigned char *md, SHA256_CTX *c); +OSSL_DEPRECATEDIN_3_0 int SHA256_Init(SHA256_CTX *c); +OSSL_DEPRECATEDIN_3_0 int SHA256_Update(SHA256_CTX *c, + const void *data, size_t len); +OSSL_DEPRECATEDIN_3_0 int SHA256_Final(unsigned char *md, SHA256_CTX *c); +OSSL_DEPRECATEDIN_3_0 void SHA256_Transform(SHA256_CTX *c, + const unsigned char *data); +# endif + +unsigned char *SHA224(const unsigned char *d, size_t n, unsigned char *md); +unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md); + +# define SHA224_DIGEST_LENGTH 28 +# define SHA256_DIGEST_LENGTH 32 +# define SHA384_DIGEST_LENGTH 48 +# define SHA512_DIGEST_LENGTH 64 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* + * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64 + * being exactly 64-bit wide. See Implementation Notes in sha512.c + * for further details. + */ +/* + * SHA-512 treats input data as a + * contiguous array of 64 bit + * wide big-endian values. + */ +# define SHA512_CBLOCK (SHA_LBLOCK*8) +# if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) +# define SHA_LONG64 unsigned __int64 +# elif defined(__arch64__) +# define SHA_LONG64 unsigned long +# else +# define SHA_LONG64 unsigned long long +# endif + +typedef struct SHA512state_st { + SHA_LONG64 h[8]; + SHA_LONG64 Nl, Nh; + union { + SHA_LONG64 d[SHA_LBLOCK]; + unsigned char p[SHA512_CBLOCK]; + } u; + unsigned int num, md_len; +} SHA512_CTX; + +OSSL_DEPRECATEDIN_3_0 int SHA384_Init(SHA512_CTX *c); +OSSL_DEPRECATEDIN_3_0 int SHA384_Update(SHA512_CTX *c, + const void *data, size_t len); +OSSL_DEPRECATEDIN_3_0 int SHA384_Final(unsigned char *md, SHA512_CTX *c); +OSSL_DEPRECATEDIN_3_0 int SHA512_Init(SHA512_CTX *c); +OSSL_DEPRECATEDIN_3_0 int SHA512_Update(SHA512_CTX *c, + const void *data, size_t len); +OSSL_DEPRECATEDIN_3_0 int SHA512_Final(unsigned char *md, SHA512_CTX *c); +OSSL_DEPRECATEDIN_3_0 void SHA512_Transform(SHA512_CTX *c, + const unsigned char *data); +# endif + +unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md); +unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/srp.h b/OtherInc/openssl/include/openssl/srp.h new file mode 100644 index 0000000..a86fa5d --- /dev/null +++ b/OtherInc/openssl/include/openssl/srp.h @@ -0,0 +1,285 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\srp.h.in + * + * Copyright 2004-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2004, EdelKey Project. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + * + * Originally written by Christophe Renou and Peter Sylvester, + * for the EdelKey project. + */ + + + +#ifndef OPENSSL_SRP_H +# define OPENSSL_SRP_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_SRP_H +# endif + +#include + +#ifndef OPENSSL_NO_SRP +# include +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 + +typedef struct SRP_gN_cache_st { + char *b64_bn; + BIGNUM *bn; +} SRP_gN_cache; +SKM_DEFINE_STACK_OF_INTERNAL(SRP_gN_cache, SRP_gN_cache, SRP_gN_cache) +#define sk_SRP_gN_cache_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_value(sk, idx) ((SRP_gN_cache *)OPENSSL_sk_value(ossl_check_const_SRP_gN_cache_sk_type(sk), (idx))) +#define sk_SRP_gN_cache_new(cmp) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new(ossl_check_SRP_gN_cache_compfunc_type(cmp))) +#define sk_SRP_gN_cache_new_null() ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new_null()) +#define sk_SRP_gN_cache_new_reserve(cmp, n) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new_reserve(ossl_check_SRP_gN_cache_compfunc_type(cmp), (n))) +#define sk_SRP_gN_cache_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_gN_cache_sk_type(sk), (n)) +#define sk_SRP_gN_cache_free(sk) OPENSSL_sk_free(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_delete(sk, i) ((SRP_gN_cache *)OPENSSL_sk_delete(ossl_check_SRP_gN_cache_sk_type(sk), (i))) +#define sk_SRP_gN_cache_delete_ptr(sk, ptr) ((SRP_gN_cache *)OPENSSL_sk_delete_ptr(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr))) +#define sk_SRP_gN_cache_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_pop(sk) ((SRP_gN_cache *)OPENSSL_sk_pop(ossl_check_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_shift(sk) ((SRP_gN_cache *)OPENSSL_sk_shift(ossl_check_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_gN_cache_sk_type(sk),ossl_check_SRP_gN_cache_freefunc_type(freefunc)) +#define sk_SRP_gN_cache_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr), (idx)) +#define sk_SRP_gN_cache_set(sk, idx, ptr) ((SRP_gN_cache *)OPENSSL_sk_set(ossl_check_SRP_gN_cache_sk_type(sk), (idx), ossl_check_SRP_gN_cache_type(ptr))) +#define sk_SRP_gN_cache_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr), pnum) +#define sk_SRP_gN_cache_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_dup(sk) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_dup(ossl_check_const_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_copyfunc_type(copyfunc), ossl_check_SRP_gN_cache_freefunc_type(freefunc))) +#define sk_SRP_gN_cache_set_cmp_func(sk, cmp) ((sk_SRP_gN_cache_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_compfunc_type(cmp))) + + + +typedef struct SRP_user_pwd_st { + /* Owned by us. */ + char *id; + BIGNUM *s; + BIGNUM *v; + /* Not owned by us. */ + const BIGNUM *g; + const BIGNUM *N; + /* Owned by us. */ + char *info; +} SRP_user_pwd; +SKM_DEFINE_STACK_OF_INTERNAL(SRP_user_pwd, SRP_user_pwd, SRP_user_pwd) +#define sk_SRP_user_pwd_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_value(sk, idx) ((SRP_user_pwd *)OPENSSL_sk_value(ossl_check_const_SRP_user_pwd_sk_type(sk), (idx))) +#define sk_SRP_user_pwd_new(cmp) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new(ossl_check_SRP_user_pwd_compfunc_type(cmp))) +#define sk_SRP_user_pwd_new_null() ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new_null()) +#define sk_SRP_user_pwd_new_reserve(cmp, n) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new_reserve(ossl_check_SRP_user_pwd_compfunc_type(cmp), (n))) +#define sk_SRP_user_pwd_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_user_pwd_sk_type(sk), (n)) +#define sk_SRP_user_pwd_free(sk) OPENSSL_sk_free(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_delete(sk, i) ((SRP_user_pwd *)OPENSSL_sk_delete(ossl_check_SRP_user_pwd_sk_type(sk), (i))) +#define sk_SRP_user_pwd_delete_ptr(sk, ptr) ((SRP_user_pwd *)OPENSSL_sk_delete_ptr(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr))) +#define sk_SRP_user_pwd_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_pop(sk) ((SRP_user_pwd *)OPENSSL_sk_pop(ossl_check_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_shift(sk) ((SRP_user_pwd *)OPENSSL_sk_shift(ossl_check_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_user_pwd_sk_type(sk),ossl_check_SRP_user_pwd_freefunc_type(freefunc)) +#define sk_SRP_user_pwd_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr), (idx)) +#define sk_SRP_user_pwd_set(sk, idx, ptr) ((SRP_user_pwd *)OPENSSL_sk_set(ossl_check_SRP_user_pwd_sk_type(sk), (idx), ossl_check_SRP_user_pwd_type(ptr))) +#define sk_SRP_user_pwd_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr), pnum) +#define sk_SRP_user_pwd_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_dup(sk) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_dup(ossl_check_const_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_copyfunc_type(copyfunc), ossl_check_SRP_user_pwd_freefunc_type(freefunc))) +#define sk_SRP_user_pwd_set_cmp_func(sk, cmp) ((sk_SRP_user_pwd_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_compfunc_type(cmp))) + + +OSSL_DEPRECATEDIN_3_0 +SRP_user_pwd *SRP_user_pwd_new(void); +OSSL_DEPRECATEDIN_3_0 +void SRP_user_pwd_free(SRP_user_pwd *user_pwd); + +OSSL_DEPRECATEDIN_3_0 +void SRP_user_pwd_set_gN(SRP_user_pwd *user_pwd, const BIGNUM *g, + const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +int SRP_user_pwd_set1_ids(SRP_user_pwd *user_pwd, const char *id, + const char *info); +OSSL_DEPRECATEDIN_3_0 +int SRP_user_pwd_set0_sv(SRP_user_pwd *user_pwd, BIGNUM *s, BIGNUM *v); + +typedef struct SRP_VBASE_st { + STACK_OF(SRP_user_pwd) *users_pwd; + STACK_OF(SRP_gN_cache) *gN_cache; +/* to simulate a user */ + char *seed_key; + const BIGNUM *default_g; + const BIGNUM *default_N; +} SRP_VBASE; + +/* + * Internal structure storing N and g pair + */ +typedef struct SRP_gN_st { + char *id; + const BIGNUM *g; + const BIGNUM *N; +} SRP_gN; +SKM_DEFINE_STACK_OF_INTERNAL(SRP_gN, SRP_gN, SRP_gN) +#define sk_SRP_gN_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_value(sk, idx) ((SRP_gN *)OPENSSL_sk_value(ossl_check_const_SRP_gN_sk_type(sk), (idx))) +#define sk_SRP_gN_new(cmp) ((STACK_OF(SRP_gN) *)OPENSSL_sk_new(ossl_check_SRP_gN_compfunc_type(cmp))) +#define sk_SRP_gN_new_null() ((STACK_OF(SRP_gN) *)OPENSSL_sk_new_null()) +#define sk_SRP_gN_new_reserve(cmp, n) ((STACK_OF(SRP_gN) *)OPENSSL_sk_new_reserve(ossl_check_SRP_gN_compfunc_type(cmp), (n))) +#define sk_SRP_gN_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_gN_sk_type(sk), (n)) +#define sk_SRP_gN_free(sk) OPENSSL_sk_free(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_delete(sk, i) ((SRP_gN *)OPENSSL_sk_delete(ossl_check_SRP_gN_sk_type(sk), (i))) +#define sk_SRP_gN_delete_ptr(sk, ptr) ((SRP_gN *)OPENSSL_sk_delete_ptr(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr))) +#define sk_SRP_gN_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_pop(sk) ((SRP_gN *)OPENSSL_sk_pop(ossl_check_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_shift(sk) ((SRP_gN *)OPENSSL_sk_shift(ossl_check_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_gN_sk_type(sk),ossl_check_SRP_gN_freefunc_type(freefunc)) +#define sk_SRP_gN_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr), (idx)) +#define sk_SRP_gN_set(sk, idx, ptr) ((SRP_gN *)OPENSSL_sk_set(ossl_check_SRP_gN_sk_type(sk), (idx), ossl_check_SRP_gN_type(ptr))) +#define sk_SRP_gN_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr), pnum) +#define sk_SRP_gN_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_dup(sk) ((STACK_OF(SRP_gN) *)OPENSSL_sk_dup(ossl_check_const_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_gN) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_gN_sk_type(sk), ossl_check_SRP_gN_copyfunc_type(copyfunc), ossl_check_SRP_gN_freefunc_type(freefunc))) +#define sk_SRP_gN_set_cmp_func(sk, cmp) ((sk_SRP_gN_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_compfunc_type(cmp))) + + + +OSSL_DEPRECATEDIN_3_0 +SRP_VBASE *SRP_VBASE_new(char *seed_key); +OSSL_DEPRECATEDIN_3_0 +void SRP_VBASE_free(SRP_VBASE *vb); +OSSL_DEPRECATEDIN_3_0 +int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); + +OSSL_DEPRECATEDIN_3_0 +int SRP_VBASE_add0_user(SRP_VBASE *vb, SRP_user_pwd *user_pwd); + +/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ +OSSL_DEPRECATEDIN_3_0 +SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); + +OSSL_DEPRECATEDIN_3_0 +char *SRP_create_verifier_ex(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +char *SRP_create_verifier(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g); +OSSL_DEPRECATEDIN_3_0 +int SRP_create_verifier_BN_ex(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, const BIGNUM *N, + const BIGNUM *g, OSSL_LIB_CTX *libctx, + const char *propq); +OSSL_DEPRECATEDIN_3_0 +int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, const BIGNUM *N, + const BIGNUM *g); + +# define SRP_NO_ERROR 0 +# define SRP_ERR_VBASE_INCOMPLETE_FILE 1 +# define SRP_ERR_VBASE_BN_LIB 2 +# define SRP_ERR_OPEN_FILE 3 +# define SRP_ERR_MEMORY 4 + +# define DB_srptype 0 +# define DB_srpverifier 1 +# define DB_srpsalt 2 +# define DB_srpid 3 +# define DB_srpgN 4 +# define DB_srpinfo 5 +# undef DB_NUMBER +# define DB_NUMBER 6 + +# define DB_SRP_INDEX 'I' +# define DB_SRP_VALID 'V' +# define DB_SRP_REVOKED 'R' +# define DB_SRP_MODIF 'v' + +/* see srp.c */ +OSSL_DEPRECATEDIN_3_0 +char *SRP_check_known_gN_param(const BIGNUM *g, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +SRP_gN *SRP_get_default_gN(const char *id); + +/* server side .... */ +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_server_key(const BIGNUM *A, const BIGNUM *v, const BIGNUM *u, + const BIGNUM *b, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_B_ex(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, + const BIGNUM *v, OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_B(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, + const BIGNUM *v); + +OSSL_DEPRECATEDIN_3_0 +int SRP_Verify_A_mod_N(const BIGNUM *A, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_u_ex(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_u(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N); + +/* client side .... */ + +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_x_ex(const BIGNUM *s, const char *user, const char *pass, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_x(const BIGNUM *s, const char *user, const char *pass); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_A(const BIGNUM *a, const BIGNUM *N, const BIGNUM *g); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_client_key_ex(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, + const BIGNUM *x, const BIGNUM *a, const BIGNUM *u, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_client_key(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, + const BIGNUM *x, const BIGNUM *a, const BIGNUM *u); +OSSL_DEPRECATEDIN_3_0 +int SRP_Verify_B_mod_N(const BIGNUM *B, const BIGNUM *N); + +# define SRP_MINIMAL_N 1024 + +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/* This method ignores the configured seed and fails for an unknown user. */ +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 +SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/srtp.h b/OtherInc/openssl/include/openssl/srtp.h new file mode 100644 index 0000000..d64606e --- /dev/null +++ b/OtherInc/openssl/include/openssl/srtp.h @@ -0,0 +1,56 @@ +/* + * Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * DTLS code by Eric Rescorla + * + * Copyright (C) 2006, Network Resonance, Inc. Copyright (C) 2011, RTFM, Inc. + */ + +#ifndef OPENSSL_SRTP_H +# define OPENSSL_SRTP_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_D1_SRTP_H +# endif + +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define SRTP_AES128_CM_SHA1_80 0x0001 +# define SRTP_AES128_CM_SHA1_32 0x0002 +# define SRTP_AES128_F8_SHA1_80 0x0003 +# define SRTP_AES128_F8_SHA1_32 0x0004 +# define SRTP_NULL_SHA1_80 0x0005 +# define SRTP_NULL_SHA1_32 0x0006 + +/* AEAD SRTP protection profiles from RFC 7714 */ +# define SRTP_AEAD_AES_128_GCM 0x0007 +# define SRTP_AEAD_AES_256_GCM 0x0008 + +# ifndef OPENSSL_NO_SRTP + +__owur int SSL_CTX_set_tlsext_use_srtp(SSL_CTX *ctx, const char *profiles); +__owur int SSL_set_tlsext_use_srtp(SSL *ssl, const char *profiles); + +__owur STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles(SSL *ssl); +__owur SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile(SSL *s); + +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/OtherInc/openssl/include/openssl/ssl.h b/OtherInc/openssl/include/openssl/ssl.h new file mode 100644 index 0000000..441b818 --- /dev/null +++ b/OtherInc/openssl/include/openssl/ssl.h @@ -0,0 +1,2599 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\ssl.h.in + * + * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * Copyright 2005 Nokia. All rights reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_SSL_H +# define OPENSSL_SSL_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_SSL_H +# endif + +# include +# include +# include +# include +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# include +# include +# endif +# include +# include +# include +# include + +# include +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* OpenSSL version number for ASN.1 encoding of the session information */ +/*- + * Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +# define SSL_SESSION_ASN1_VERSION 0x0001 + +# define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +# define SSL_MAX_SID_CTX_LENGTH 32 + +# define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512/8) +# define SSL_MAX_KEY_ARG_LENGTH 8 +/* SSL_MAX_MASTER_KEY_LENGTH is defined in prov_ssl.h */ + +/* The maximum number of encrypt/decrypt pipelines we can support */ +# define SSL_MAX_PIPELINES 32 + +/* text strings for the ciphers */ + +/* These are used to specify which ciphers to use and not to use */ + +# define SSL_TXT_LOW "LOW" +# define SSL_TXT_MEDIUM "MEDIUM" +# define SSL_TXT_HIGH "HIGH" +# define SSL_TXT_FIPS "FIPS" + +# define SSL_TXT_aNULL "aNULL" +# define SSL_TXT_eNULL "eNULL" +# define SSL_TXT_NULL "NULL" + +# define SSL_TXT_kRSA "kRSA" +# define SSL_TXT_kDHr "kDHr"/* this cipher class has been removed */ +# define SSL_TXT_kDHd "kDHd"/* this cipher class has been removed */ +# define SSL_TXT_kDH "kDH"/* this cipher class has been removed */ +# define SSL_TXT_kEDH "kEDH"/* alias for kDHE */ +# define SSL_TXT_kDHE "kDHE" +# define SSL_TXT_kECDHr "kECDHr"/* this cipher class has been removed */ +# define SSL_TXT_kECDHe "kECDHe"/* this cipher class has been removed */ +# define SSL_TXT_kECDH "kECDH"/* this cipher class has been removed */ +# define SSL_TXT_kEECDH "kEECDH"/* alias for kECDHE */ +# define SSL_TXT_kECDHE "kECDHE" +# define SSL_TXT_kPSK "kPSK" +# define SSL_TXT_kRSAPSK "kRSAPSK" +# define SSL_TXT_kECDHEPSK "kECDHEPSK" +# define SSL_TXT_kDHEPSK "kDHEPSK" +# define SSL_TXT_kGOST "kGOST" +# define SSL_TXT_kGOST18 "kGOST18" +# define SSL_TXT_kSRP "kSRP" + +# define SSL_TXT_aRSA "aRSA" +# define SSL_TXT_aDSS "aDSS" +# define SSL_TXT_aDH "aDH"/* this cipher class has been removed */ +# define SSL_TXT_aECDH "aECDH"/* this cipher class has been removed */ +# define SSL_TXT_aECDSA "aECDSA" +# define SSL_TXT_aPSK "aPSK" +# define SSL_TXT_aGOST94 "aGOST94" +# define SSL_TXT_aGOST01 "aGOST01" +# define SSL_TXT_aGOST12 "aGOST12" +# define SSL_TXT_aGOST "aGOST" +# define SSL_TXT_aSRP "aSRP" + +# define SSL_TXT_DSS "DSS" +# define SSL_TXT_DH "DH" +# define SSL_TXT_DHE "DHE"/* same as "kDHE:-ADH" */ +# define SSL_TXT_EDH "EDH"/* alias for DHE */ +# define SSL_TXT_ADH "ADH" +# define SSL_TXT_RSA "RSA" +# define SSL_TXT_ECDH "ECDH" +# define SSL_TXT_EECDH "EECDH"/* alias for ECDHE" */ +# define SSL_TXT_ECDHE "ECDHE"/* same as "kECDHE:-AECDH" */ +# define SSL_TXT_AECDH "AECDH" +# define SSL_TXT_ECDSA "ECDSA" +# define SSL_TXT_PSK "PSK" +# define SSL_TXT_SRP "SRP" + +# define SSL_TXT_DES "DES" +# define SSL_TXT_3DES "3DES" +# define SSL_TXT_RC4 "RC4" +# define SSL_TXT_RC2 "RC2" +# define SSL_TXT_IDEA "IDEA" +# define SSL_TXT_SEED "SEED" +# define SSL_TXT_AES128 "AES128" +# define SSL_TXT_AES256 "AES256" +# define SSL_TXT_AES "AES" +# define SSL_TXT_AES_GCM "AESGCM" +# define SSL_TXT_AES_CCM "AESCCM" +# define SSL_TXT_AES_CCM_8 "AESCCM8" +# define SSL_TXT_CAMELLIA128 "CAMELLIA128" +# define SSL_TXT_CAMELLIA256 "CAMELLIA256" +# define SSL_TXT_CAMELLIA "CAMELLIA" +# define SSL_TXT_CHACHA20 "CHACHA20" +# define SSL_TXT_GOST "GOST89" +# define SSL_TXT_ARIA "ARIA" +# define SSL_TXT_ARIA_GCM "ARIAGCM" +# define SSL_TXT_ARIA128 "ARIA128" +# define SSL_TXT_ARIA256 "ARIA256" +# define SSL_TXT_GOST2012_GOST8912_GOST8912 "GOST2012-GOST8912-GOST8912" +# define SSL_TXT_CBC "CBC" + +# define SSL_TXT_MD5 "MD5" +# define SSL_TXT_SHA1 "SHA1" +# define SSL_TXT_SHA "SHA"/* same as "SHA1" */ +# define SSL_TXT_GOST94 "GOST94" +# define SSL_TXT_GOST89MAC "GOST89MAC" +# define SSL_TXT_GOST12 "GOST12" +# define SSL_TXT_GOST89MAC12 "GOST89MAC12" +# define SSL_TXT_SHA256 "SHA256" +# define SSL_TXT_SHA384 "SHA384" + +# define SSL_TXT_SSLV3 "SSLv3" +# define SSL_TXT_TLSV1 "TLSv1" +# define SSL_TXT_TLSV1_1 "TLSv1.1" +# define SSL_TXT_TLSV1_2 "TLSv1.2" + +# define SSL_TXT_ALL "ALL" + +/*- + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +# define SSL_TXT_CMPALL "COMPLEMENTOFALL" +# define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* + * The following cipher list is used by default. It also is substituted when + * an application-defined cipher list string starts with 'DEFAULT'. + * This applies to ciphersuites for TLSv1.2 and below. + * DEPRECATED IN 3.0.0, in favor of OSSL_default_cipher_list() + * Update both macro and function simultaneously + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL" +/* + * This is the default set of TLSv1.3 ciphersuites + * DEPRECATED IN 3.0.0, in favor of OSSL_default_ciphersuites() + * Update both macro and function simultaneously + */ +# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ + "TLS_CHACHA20_POLY1305_SHA256:" \ + "TLS_AES_128_GCM_SHA256" +# endif +/* + * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always + * starts with a reasonable order, and all we have to do for DEFAULT is + * throwing out anonymous and unencrypted ciphersuites! (The latter are not + * actually enabled by ALL, but "ALL:RSA" would enable some of them.) + */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +# define SSL_SENT_SHUTDOWN 1 +# define SSL_RECEIVED_SHUTDOWN 2 + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +# define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* + * This is needed to stop compilers complaining about the 'struct ssl_st *' + * function parameters used to prototype callbacks in SSL_CTX. + */ +typedef struct ssl_st *ssl_crock_st; +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; +typedef struct tls_sigalgs_st TLS_SIGALGS; +typedef struct ssl_conf_ctx_st SSL_CONF_CTX; +typedef struct ssl_comp_st SSL_COMP; + +STACK_OF(SSL_CIPHER); +STACK_OF(SSL_COMP); + +/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ +typedef struct srtp_protection_profile_st { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; +SKM_DEFINE_STACK_OF_INTERNAL(SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE) +#define sk_SRTP_PROTECTION_PROFILE_num(sk) OPENSSL_sk_num(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_value(sk, idx) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_value(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx))) +#define sk_SRTP_PROTECTION_PROFILE_new(cmp) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp))) +#define sk_SRTP_PROTECTION_PROFILE_new_null() ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_null()) +#define sk_SRTP_PROTECTION_PROFILE_new_reserve(cmp, n) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_reserve(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp), (n))) +#define sk_SRTP_PROTECTION_PROFILE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (n)) +#define sk_SRTP_PROTECTION_PROFILE_free(sk) OPENSSL_sk_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_zero(sk) OPENSSL_sk_zero(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_delete(sk, i) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (i))) +#define sk_SRTP_PROTECTION_PROFILE_delete_ptr(sk, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete_ptr(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))) +#define sk_SRTP_PROTECTION_PROFILE_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_pop(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_pop(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_shift(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_shift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk),ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc)) +#define sk_SRTP_PROTECTION_PROFILE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), (idx)) +#define sk_SRTP_PROTECTION_PROFILE_set(sk, idx, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_set(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))) +#define sk_SRTP_PROTECTION_PROFILE_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), pnum) +#define sk_SRTP_PROTECTION_PROFILE_sort(sk) OPENSSL_sk_sort(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_dup(sk) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_dup(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_deep_copy(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_copyfunc_type(copyfunc), ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc))) +#define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(sk, cmp) ((sk_SRTP_PROTECTION_PROFILE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp))) + + + +typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data, + int len, void *arg); +typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len, + STACK_OF(SSL_CIPHER) *peer_ciphers, + const SSL_CIPHER **cipher, void *arg); + +/* Extension context codes */ +/* This extension is only allowed in TLS */ +#define SSL_EXT_TLS_ONLY 0x0001 +/* This extension is only allowed in DTLS */ +#define SSL_EXT_DTLS_ONLY 0x0002 +/* Some extensions may be allowed in DTLS but we don't implement them for it */ +#define SSL_EXT_TLS_IMPLEMENTATION_ONLY 0x0004 +/* Most extensions are not defined for SSLv3 but EXT_TYPE_renegotiate is */ +#define SSL_EXT_SSL3_ALLOWED 0x0008 +/* Extension is only defined for TLS1.2 and below */ +#define SSL_EXT_TLS1_2_AND_BELOW_ONLY 0x0010 +/* Extension is only defined for TLS1.3 and above */ +#define SSL_EXT_TLS1_3_ONLY 0x0020 +/* Ignore this extension during parsing if we are resuming */ +#define SSL_EXT_IGNORE_ON_RESUMPTION 0x0040 +#define SSL_EXT_CLIENT_HELLO 0x0080 +/* Really means TLS1.2 or below */ +#define SSL_EXT_TLS1_2_SERVER_HELLO 0x0100 +#define SSL_EXT_TLS1_3_SERVER_HELLO 0x0200 +#define SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS 0x0400 +#define SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST 0x0800 +#define SSL_EXT_TLS1_3_CERTIFICATE 0x1000 +#define SSL_EXT_TLS1_3_NEW_SESSION_TICKET 0x2000 +#define SSL_EXT_TLS1_3_CERTIFICATE_REQUEST 0x4000 + +/* Typedefs for handling custom extensions */ + +typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type, + const unsigned char **out, size_t *outlen, + int *al, void *add_arg); + +typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type, + const unsigned char *out, void *add_arg); + +typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type, + const unsigned char *in, size_t inlen, + int *al, void *parse_arg); + + +typedef int (*SSL_custom_ext_add_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char **out, + size_t *outlen, X509 *x, + size_t chainidx, + int *al, void *add_arg); + +typedef void (*SSL_custom_ext_free_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char *out, + void *add_arg); + +typedef int (*SSL_custom_ext_parse_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char *in, + size_t inlen, X509 *x, + size_t chainidx, + int *al, void *parse_arg); + +/* Typedef for verification callback */ +typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx); + +/* Typedef for SSL async callback */ +typedef int (*SSL_async_callback_fn)(SSL *s, void *arg); + +#define SSL_OP_BIT(n) ((uint64_t)1 << (uint64_t)n) + +/* + * SSL/TLS connection options. + */ + /* Disable Extended master secret */ +# define SSL_OP_NO_EXTENDED_MASTER_SECRET SSL_OP_BIT(0) + /* Cleanse plaintext copies of data delivered to the application */ +# define SSL_OP_CLEANSE_PLAINTEXT SSL_OP_BIT(1) + /* Allow initial connection to servers that don't support RI */ +# define SSL_OP_LEGACY_SERVER_CONNECT SSL_OP_BIT(2) + /* Enable support for Kernel TLS */ +# define SSL_OP_ENABLE_KTLS SSL_OP_BIT(3) +# define SSL_OP_TLSEXT_PADDING SSL_OP_BIT(4) +# define SSL_OP_SAFARI_ECDHE_ECDSA_BUG SSL_OP_BIT(6) +# define SSL_OP_IGNORE_UNEXPECTED_EOF SSL_OP_BIT(7) +# define SSL_OP_ALLOW_CLIENT_RENEGOTIATION SSL_OP_BIT(8) +# define SSL_OP_DISABLE_TLSEXT_CA_NAMES SSL_OP_BIT(9) + /* In TLSv1.3 allow a non-(ec)dhe based kex_mode */ +# define SSL_OP_ALLOW_NO_DHE_KEX SSL_OP_BIT(10) + /* + * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added + * in OpenSSL 0.9.6d. Usually (depending on the application protocol) + * the workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include it + * in SSL_OP_ALL. Added in 0.9.6e + */ +# define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS SSL_OP_BIT(11) + /* DTLS options */ +# define SSL_OP_NO_QUERY_MTU SSL_OP_BIT(12) + /* Turn on Cookie Exchange (on relevant for servers) */ +# define SSL_OP_COOKIE_EXCHANGE SSL_OP_BIT(13) + /* Don't use RFC4507 ticket extension */ +# define SSL_OP_NO_TICKET SSL_OP_BIT(14) +# ifndef OPENSSL_NO_DTLS1_METHOD + /* + * Use Cisco's version identifier of DTLS_BAD_VER + * (only with deprecated DTLSv1_client_method()) + */ +# define SSL_OP_CISCO_ANYCONNECT SSL_OP_BIT(15) +# endif + /* As server, disallow session resumption on renegotiation */ +# define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION SSL_OP_BIT(16) + /* Don't use compression even if supported */ +# define SSL_OP_NO_COMPRESSION SSL_OP_BIT(17) + /* Permit unsafe legacy renegotiation */ +# define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION SSL_OP_BIT(18) + /* Disable encrypt-then-mac */ +# define SSL_OP_NO_ENCRYPT_THEN_MAC SSL_OP_BIT(19) + /* + * Enable TLSv1.3 Compatibility mode. This is on by default. A future + * version of OpenSSL may have this disabled by default. + */ +# define SSL_OP_ENABLE_MIDDLEBOX_COMPAT SSL_OP_BIT(20) + /* + * Prioritize Chacha20Poly1305 when client does. + * Modifies SSL_OP_CIPHER_SERVER_PREFERENCE + */ +# define SSL_OP_PRIORITIZE_CHACHA SSL_OP_BIT(21) + /* + * Set on servers to choose the cipher according to server's preferences. + */ +# define SSL_OP_CIPHER_SERVER_PREFERENCE SSL_OP_BIT(22) + /* + * If set, a server will allow a client to issue a SSLv3.0 version + * number as latest version supported in the premaster secret, even when + * TLSv1.0 (version 3.1) was announced in the client hello. Normally + * this is forbidden to prevent version rollback attacks. + */ +# define SSL_OP_TLS_ROLLBACK_BUG SSL_OP_BIT(23) + /* + * Switches off automatic TLSv1.3 anti-replay protection for early data. + * This is a server-side option only (no effect on the client). + */ +# define SSL_OP_NO_ANTI_REPLAY SSL_OP_BIT(24) +# define SSL_OP_NO_SSLv3 SSL_OP_BIT(25) +# define SSL_OP_NO_TLSv1 SSL_OP_BIT(26) +# define SSL_OP_NO_TLSv1_2 SSL_OP_BIT(27) +# define SSL_OP_NO_TLSv1_1 SSL_OP_BIT(28) +# define SSL_OP_NO_TLSv1_3 SSL_OP_BIT(29) +# define SSL_OP_NO_DTLSv1 SSL_OP_BIT(26) +# define SSL_OP_NO_DTLSv1_2 SSL_OP_BIT(27) + /* Disallow all renegotiation */ +# define SSL_OP_NO_RENEGOTIATION SSL_OP_BIT(30) + /* + * Make server add server-hello extension from early version of + * cryptopro draft, when GOST ciphersuite is negotiated. Required for + * interoperability with CryptoPro CSP 3.x + */ +# define SSL_OP_CRYPTOPRO_TLSEXT_BUG SSL_OP_BIT(31) + +/* + * Option "collections." + */ +# define SSL_OP_NO_SSL_MASK \ + ( SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 \ + | SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3 ) +# define SSL_OP_NO_DTLS_MASK \ + ( SSL_OP_NO_DTLSv1 | SSL_OP_NO_DTLSv1_2 ) + +/* Various bug workarounds that should be rather harmless. */ +# define SSL_OP_ALL \ + ( SSL_OP_CRYPTOPRO_TLSEXT_BUG | SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS \ + | SSL_OP_TLSEXT_PADDING | SSL_OP_SAFARI_ECDHE_ECDSA_BUG ) + +/* + * OBSOLETE OPTIONS retained for compatibility + */ + +# define SSL_OP_MICROSOFT_SESS_ID_BUG 0x0 +# define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x0 +# define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x0 +# define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 +# define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x0 +# define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +# define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x0 +# define SSL_OP_TLS_D5_BUG 0x0 +# define SSL_OP_TLS_BLOCK_PADDING_BUG 0x0 +# define SSL_OP_SINGLE_ECDH_USE 0x0 +# define SSL_OP_SINGLE_DH_USE 0x0 +# define SSL_OP_EPHEMERAL_RSA 0x0 +# define SSL_OP_NO_SSLv2 0x0 +# define SSL_OP_PKCS1_CHECK_1 0x0 +# define SSL_OP_PKCS1_CHECK_2 0x0 +# define SSL_OP_NETSCAPE_CA_DN_BUG 0x0 +# define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x0 + +/* + * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): + */ +# define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001U +/* + * Make it possible to retry SSL_write() with changed buffer location (buffer + * contents must stay the same!); this is not the default to avoid the + * misconception that non-blocking SSL_write() behaves like non-blocking + * write(): + */ +# define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002U +/* + * Never bother the application with retries if the transport is blocking: + */ +# define SSL_MODE_AUTO_RETRY 0x00000004U +/* Don't attempt to automatically build certificate chain */ +# define SSL_MODE_NO_AUTO_CHAIN 0x00000008U +/* + * Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) Released buffers are freed. + */ +# define SSL_MODE_RELEASE_BUFFERS 0x00000010U +/* + * Send the current time in the Random fields of the ClientHello and + * ServerHello records for compatibility with hypothetical implementations + * that require it. + */ +# define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020U +# define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040U +/* + * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications + * that reconnect with a downgraded protocol version; see + * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your + * application attempts a normal handshake. Only use this in explicit + * fallback retries, following the guidance in + * draft-ietf-tls-downgrade-scsv-00. + */ +# define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080U +/* + * Support Asynchronous operation + */ +# define SSL_MODE_ASYNC 0x00000100U + +/* + * When using DTLS/SCTP, include the terminating zero in the label + * used for computing the endpoint-pair shared secret. Required for + * interoperability with implementations having this bug like these + * older version of OpenSSL: + * - OpenSSL 1.0.0 series + * - OpenSSL 1.0.1 series + * - OpenSSL 1.0.2 series + * - OpenSSL 1.1.0 series + * - OpenSSL 1.1.1 and 1.1.1a + */ +# define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U + +/* Cert related flags */ +/* + * Many implementations ignore some aspects of the TLS standards such as + * enforcing certificate chain algorithms. When this is set we enforce them. + */ +# define SSL_CERT_FLAG_TLS_STRICT 0x00000001U + +/* Suite B modes, takes same values as certificate verify flags */ +# define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 + +/* Perform all sorts of protocol violations for testing purposes */ +# define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 + +/* Flags for building certificate chains */ +/* Treat any existing certificates as untrusted CAs */ +# define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 +/* Don't include root CA in chain */ +# define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 +/* Just check certificates already there */ +# define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 +/* Ignore verification errors */ +# define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 +/* Clear verification errors from queue */ +# define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 + +/* Flags returned by SSL_check_chain */ +/* Certificate can be used with this session */ +# define CERT_PKEY_VALID 0x1 +/* Certificate can also be used for signing */ +# define CERT_PKEY_SIGN 0x2 +/* EE certificate signing algorithm OK */ +# define CERT_PKEY_EE_SIGNATURE 0x10 +/* CA signature algorithms OK */ +# define CERT_PKEY_CA_SIGNATURE 0x20 +/* EE certificate parameters OK */ +# define CERT_PKEY_EE_PARAM 0x40 +/* CA certificate parameters OK */ +# define CERT_PKEY_CA_PARAM 0x80 +/* Signing explicitly allowed as opposed to SHA1 fallback */ +# define CERT_PKEY_EXPLICIT_SIGN 0x100 +/* Client CA issuer names match (always set for server cert) */ +# define CERT_PKEY_ISSUER_NAME 0x200 +/* Cert type matches client types (always set for server cert) */ +# define CERT_PKEY_CERT_TYPE 0x400 +/* Cert chain suitable to Suite B */ +# define CERT_PKEY_SUITEB 0x800 + +# define SSL_CONF_FLAG_CMDLINE 0x1 +# define SSL_CONF_FLAG_FILE 0x2 +# define SSL_CONF_FLAG_CLIENT 0x4 +# define SSL_CONF_FLAG_SERVER 0x8 +# define SSL_CONF_FLAG_SHOW_ERRORS 0x10 +# define SSL_CONF_FLAG_CERTIFICATE 0x20 +# define SSL_CONF_FLAG_REQUIRE_PRIVATE 0x40 +/* Configuration value types */ +# define SSL_CONF_TYPE_UNKNOWN 0x0 +# define SSL_CONF_TYPE_STRING 0x1 +# define SSL_CONF_TYPE_FILE 0x2 +# define SSL_CONF_TYPE_DIR 0x3 +# define SSL_CONF_TYPE_NONE 0x4 +# define SSL_CONF_TYPE_STORE 0x5 + +/* Maximum length of the application-controlled segment of a a TLSv1.3 cookie */ +# define SSL_COOKIE_LENGTH 4096 + +/* + * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they + * cannot be used to clear bits. + */ + +uint64_t SSL_CTX_get_options(const SSL_CTX *ctx); +uint64_t SSL_get_options(const SSL *s); +uint64_t SSL_CTX_clear_options(SSL_CTX *ctx, uint64_t op); +uint64_t SSL_clear_options(SSL *s, uint64_t op); +uint64_t SSL_CTX_set_options(SSL_CTX *ctx, uint64_t op); +uint64_t SSL_set_options(SSL *s, uint64_t op); + +# define SSL_CTX_set_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL) +# define SSL_CTX_clear_mode(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL) +# define SSL_clear_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_MODE,(op),NULL) +# define SSL_set_mode(ssl,op) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL) +# define SSL_get_mode(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL) +# define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL) +# define DTLS_set_link_mtu(ssl, mtu) \ + SSL_ctrl((ssl),DTLS_CTRL_SET_LINK_MTU,(mtu),NULL) +# define DTLS_get_link_min_mtu(ssl) \ + SSL_ctrl((ssl),DTLS_CTRL_GET_LINK_MIN_MTU,0,NULL) + +# define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +# define SSL_CTX_set_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_set_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CERT_FLAGS,(op),NULL) +# define SSL_CTX_clear_cert_flags(ctx,op) \ + SSL_CTX_ctrl((ctx),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) +# define SSL_clear_cert_flags(s,op) \ + SSL_ctrl((s),SSL_CTRL_CLEAR_CERT_FLAGS,(op),NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, + void (*cb) (int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +# define SSL_get_extms_support(s) \ + SSL_ctrl((s),SSL_CTRL_GET_EXTMS_SUPPORT,0,NULL) + +# ifndef OPENSSL_NO_SRP +/* see tls_srp.c */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 __owur int SSL_SRP_CTX_init(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 int SSL_SRP_CTX_free(SSL *ctx); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 __owur int SSL_srp_server_param_with_username(SSL *s, + int *ad); +OSSL_DEPRECATEDIN_3_0 __owur int SRP_Calc_A_param(SSL *s); +# endif +# endif + +/* 100k max cert list */ +# define SSL_MAX_CERT_LIST_DEFAULT (1024*100) + +# define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024*20) + +/* + * This callback type is used inside SSL_CTX, SSL, and in the functions that + * set them. It is used to override the generation of SSL/TLS session IDs in + * a server. Return value should be zero on an error, non-zero to proceed. + * Also, callbacks should themselves check if the id they generate is unique + * otherwise the SSL handshake will fail with an error - callbacks can do + * this using the 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in + * is set at the maximum size the session ID can be. In SSLv3/TLSv1 it is 32 + * bytes. The callback can alter this length to be less if desired. It is + * also an error for the callback to set the size to zero. + */ +typedef int (*GEN_SESSION_CB) (SSL *ssl, unsigned char *id, + unsigned int *id_len); + +# define SSL_SESS_CACHE_OFF 0x0000 +# define SSL_SESS_CACHE_CLIENT 0x0001 +# define SSL_SESS_CACHE_SERVER 0x0002 +# define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER) +# define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +# define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +# define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +# define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE) +# define SSL_SESS_CACHE_UPDATE_TIME 0x0400 + +LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx); +# define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL) +# define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL) +# define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL) +# define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL) +# define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL) +# define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL) +# define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL) +# define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL) +# define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL) +# define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL) +# define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, + int (*new_session_cb) (struct ssl_st *ssl, + SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, + void (*remove_session_cb) (struct ssl_ctx_st + *ctx, + SSL_SESSION *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (struct ssl_ctx_st *ctx, + SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, + SSL_SESSION *(*get_session_cb) (struct ssl_st + *ssl, + const unsigned char + *data, int len, + int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (struct ssl_st *ssl, + const unsigned char *data, + int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, + void (*cb) (const SSL *ssl, int type, int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type, + int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, + int (*client_cert_cb) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509, + EVP_PKEY **pkey); +# ifndef OPENSSL_NO_ENGINE +__owur int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); +# endif +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, + int (*app_gen_cookie_cb) (SSL *ssl, + unsigned char + *cookie, + unsigned int + *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, + int (*app_verify_cookie_cb) (SSL *ssl, + const unsigned + char *cookie, + unsigned int + cookie_len)); + +void SSL_CTX_set_stateless_cookie_generate_cb( + SSL_CTX *ctx, + int (*gen_stateless_cookie_cb) (SSL *ssl, + unsigned char *cookie, + size_t *cookie_len)); +void SSL_CTX_set_stateless_cookie_verify_cb( + SSL_CTX *ctx, + int (*verify_stateless_cookie_cb) (SSL *ssl, + const unsigned char *cookie, + size_t cookie_len)); +# ifndef OPENSSL_NO_NEXTPROTONEG + +typedef int (*SSL_CTX_npn_advertised_cb_func)(SSL *ssl, + const unsigned char **out, + unsigned int *outlen, + void *arg); +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, + SSL_CTX_npn_advertised_cb_func cb, + void *arg); +# define SSL_CTX_set_npn_advertised_cb SSL_CTX_set_next_protos_advertised_cb + +typedef int (*SSL_CTX_npn_select_cb_func)(SSL *s, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, + SSL_CTX_npn_select_cb_func cb, + void *arg); +# define SSL_CTX_set_npn_select_cb SSL_CTX_set_next_proto_select_cb + +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); +# define SSL_get0_npn_negotiated SSL_get0_next_proto_negotiated +# endif + +__owur int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + const unsigned char *client, + unsigned int client_len); + +# define OPENSSL_NPN_UNSUPPORTED 0 +# define OPENSSL_NPN_NEGOTIATED 1 +# define OPENSSL_NPN_NO_OVERLAP 2 + +__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned int protos_len); +__owur int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned int protos_len); +typedef int (*SSL_CTX_alpn_select_cb_func)(SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + SSL_CTX_alpn_select_cb_func cb, + void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned int *len); + +# ifndef OPENSSL_NO_PSK +/* + * the maximum length of the buffer given to callbacks containing the + * resulting identity/psk + */ +# define PSK_MAX_IDENTITY_LEN 256 +# define PSK_MAX_PSK_LEN 512 +typedef unsigned int (*SSL_psk_client_cb_func)(SSL *ssl, + const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); +void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb); +void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb); + +typedef unsigned int (*SSL_psk_server_cb_func)(SSL *ssl, + const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, SSL_psk_server_cb_func cb); +void SSL_set_psk_server_callback(SSL *ssl, SSL_psk_server_cb_func cb); + +__owur int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); +__owur int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint); +const char *SSL_get_psk_identity_hint(const SSL *s); +const char *SSL_get_psk_identity(const SSL *s); +# endif + +typedef int (*SSL_psk_find_session_cb_func)(SSL *ssl, + const unsigned char *identity, + size_t identity_len, + SSL_SESSION **sess); +typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md, + const unsigned char **id, + size_t *idlen, + SSL_SESSION **sess); + +void SSL_set_psk_find_session_callback(SSL *s, SSL_psk_find_session_cb_func cb); +void SSL_CTX_set_psk_find_session_callback(SSL_CTX *ctx, + SSL_psk_find_session_cb_func cb); +void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb); +void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx, + SSL_psk_use_session_cb_func cb); + +/* Register callbacks to handle custom TLS Extensions for client or server. */ + +__owur int SSL_CTX_has_client_custom_ext(const SSL_CTX *ctx, + unsigned int ext_type); + +__owur int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, + unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +__owur int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, + unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +__owur int SSL_CTX_add_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + unsigned int context, + SSL_custom_ext_add_cb_ex add_cb, + SSL_custom_ext_free_cb_ex free_cb, + void *add_arg, + SSL_custom_ext_parse_cb_ex parse_cb, + void *parse_arg); + +__owur int SSL_extension_supported(unsigned int ext_type); + +# define SSL_NOTHING 1 +# define SSL_WRITING 2 +# define SSL_READING 3 +# define SSL_X509_LOOKUP 4 +# define SSL_ASYNC_PAUSED 5 +# define SSL_ASYNC_NO_JOBS 6 +# define SSL_CLIENT_HELLO_CB 7 +# define SSL_RETRY_VERIFY 8 + +/* These will only be used when doing non-blocking IO */ +# define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +# define SSL_want_read(s) (SSL_want(s) == SSL_READING) +# define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +# define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) +# define SSL_want_retry_verify(s) (SSL_want(s) == SSL_RETRY_VERIFY) +# define SSL_want_async(s) (SSL_want(s) == SSL_ASYNC_PAUSED) +# define SSL_want_async_job(s) (SSL_want(s) == SSL_ASYNC_NO_JOBS) +# define SSL_want_client_hello_cb(s) (SSL_want(s) == SSL_CLIENT_HELLO_CB) + +# define SSL_MAC_FLAG_READ_MAC_STREAM 1 +# define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 +# define SSL_MAC_FLAG_READ_MAC_TLSTREE 4 +# define SSL_MAC_FLAG_WRITE_MAC_TLSTREE 8 + +/* + * A callback for logging out TLS key material. This callback should log out + * |line| followed by a newline. + */ +typedef void (*SSL_CTX_keylog_cb_func)(const SSL *ssl, const char *line); + +/* + * SSL_CTX_set_keylog_callback configures a callback to log key material. This + * is intended for debugging use with tools like Wireshark. The cb function + * should log line followed by a newline. + */ +void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb); + +/* + * SSL_CTX_get_keylog_callback returns the callback configured by + * SSL_CTX_set_keylog_callback. + */ +SSL_CTX_keylog_cb_func SSL_CTX_get_keylog_callback(const SSL_CTX *ctx); + +int SSL_CTX_set_max_early_data(SSL_CTX *ctx, uint32_t max_early_data); +uint32_t SSL_CTX_get_max_early_data(const SSL_CTX *ctx); +int SSL_set_max_early_data(SSL *s, uint32_t max_early_data); +uint32_t SSL_get_max_early_data(const SSL *s); +int SSL_CTX_set_recv_max_early_data(SSL_CTX *ctx, uint32_t recv_max_early_data); +uint32_t SSL_CTX_get_recv_max_early_data(const SSL_CTX *ctx); +int SSL_set_recv_max_early_data(SSL *s, uint32_t recv_max_early_data); +uint32_t SSL_get_recv_max_early_data(const SSL *s); + +#ifdef __cplusplus +} +#endif + +# include +# include +# include /* This is mostly sslv3 with a few tweaks */ +# include /* Datagram TLS */ +# include /* Support for the use_srtp extension */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These need to be after the above set of includes due to a compiler bug + * in VisualStudio 2015 + */ +SKM_DEFINE_STACK_OF_INTERNAL(SSL_CIPHER, const SSL_CIPHER, SSL_CIPHER) +#define sk_SSL_CIPHER_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_value(sk, idx) ((const SSL_CIPHER *)OPENSSL_sk_value(ossl_check_const_SSL_CIPHER_sk_type(sk), (idx))) +#define sk_SSL_CIPHER_new(cmp) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new(ossl_check_SSL_CIPHER_compfunc_type(cmp))) +#define sk_SSL_CIPHER_new_null() ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_null()) +#define sk_SSL_CIPHER_new_reserve(cmp, n) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_reserve(ossl_check_SSL_CIPHER_compfunc_type(cmp), (n))) +#define sk_SSL_CIPHER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_CIPHER_sk_type(sk), (n)) +#define sk_SSL_CIPHER_free(sk) OPENSSL_sk_free(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_delete(sk, i) ((const SSL_CIPHER *)OPENSSL_sk_delete(ossl_check_SSL_CIPHER_sk_type(sk), (i))) +#define sk_SSL_CIPHER_delete_ptr(sk, ptr) ((const SSL_CIPHER *)OPENSSL_sk_delete_ptr(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))) +#define sk_SSL_CIPHER_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_pop(sk) ((const SSL_CIPHER *)OPENSSL_sk_pop(ossl_check_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_shift(sk) ((const SSL_CIPHER *)OPENSSL_sk_shift(ossl_check_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_CIPHER_sk_type(sk),ossl_check_SSL_CIPHER_freefunc_type(freefunc)) +#define sk_SSL_CIPHER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), (idx)) +#define sk_SSL_CIPHER_set(sk, idx, ptr) ((const SSL_CIPHER *)OPENSSL_sk_set(ossl_check_SSL_CIPHER_sk_type(sk), (idx), ossl_check_SSL_CIPHER_type(ptr))) +#define sk_SSL_CIPHER_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), pnum) +#define sk_SSL_CIPHER_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_dup(sk) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_dup(ossl_check_const_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_copyfunc_type(copyfunc), ossl_check_SSL_CIPHER_freefunc_type(freefunc))) +#define sk_SSL_CIPHER_set_cmp_func(sk, cmp) ((sk_SSL_CIPHER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(SSL_COMP, SSL_COMP, SSL_COMP) +#define sk_SSL_COMP_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_value(sk, idx) ((SSL_COMP *)OPENSSL_sk_value(ossl_check_const_SSL_COMP_sk_type(sk), (idx))) +#define sk_SSL_COMP_new(cmp) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new(ossl_check_SSL_COMP_compfunc_type(cmp))) +#define sk_SSL_COMP_new_null() ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_null()) +#define sk_SSL_COMP_new_reserve(cmp, n) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_reserve(ossl_check_SSL_COMP_compfunc_type(cmp), (n))) +#define sk_SSL_COMP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_COMP_sk_type(sk), (n)) +#define sk_SSL_COMP_free(sk) OPENSSL_sk_free(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_delete(sk, i) ((SSL_COMP *)OPENSSL_sk_delete(ossl_check_SSL_COMP_sk_type(sk), (i))) +#define sk_SSL_COMP_delete_ptr(sk, ptr) ((SSL_COMP *)OPENSSL_sk_delete_ptr(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))) +#define sk_SSL_COMP_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_pop(sk) ((SSL_COMP *)OPENSSL_sk_pop(ossl_check_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_shift(sk) ((SSL_COMP *)OPENSSL_sk_shift(ossl_check_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_COMP_sk_type(sk),ossl_check_SSL_COMP_freefunc_type(freefunc)) +#define sk_SSL_COMP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), (idx)) +#define sk_SSL_COMP_set(sk, idx, ptr) ((SSL_COMP *)OPENSSL_sk_set(ossl_check_SSL_COMP_sk_type(sk), (idx), ossl_check_SSL_COMP_type(ptr))) +#define sk_SSL_COMP_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), pnum) +#define sk_SSL_COMP_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_dup(sk) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_dup(ossl_check_const_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_copyfunc_type(copyfunc), ossl_check_SSL_COMP_freefunc_type(freefunc))) +#define sk_SSL_COMP_set_cmp_func(sk, cmp) ((sk_SSL_COMP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_compfunc_type(cmp))) + + +/* compatibility */ +# define SSL_set_app_data(s,arg) (SSL_set_ex_data(s,0,(char *)(arg))) +# define SSL_get_app_data(s) (SSL_get_ex_data(s,0)) +# define SSL_SESSION_set_app_data(s,a) (SSL_SESSION_set_ex_data(s,0, \ + (char *)(a))) +# define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s,0)) +# define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx,0)) +# define SSL_CTX_set_app_data(ctx,arg) (SSL_CTX_set_ex_data(ctx,0, \ + (char *)(arg))) +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void SSL_set_debug(SSL *s, int debug); +# endif + +/* TLSv1.3 KeyUpdate message types */ +/* -1 used so that this is an invalid value for the on-the-wire protocol */ +#define SSL_KEY_UPDATE_NONE -1 +/* Values as defined for the on-the-wire protocol */ +#define SSL_KEY_UPDATE_NOT_REQUESTED 0 +#define SSL_KEY_UPDATE_REQUESTED 1 + +/* + * The valid handshake states (one for each type message sent and one for each + * type of message received). There are also two "special" states: + * TLS = TLS or DTLS state + * DTLS = DTLS specific state + * CR/SR = Client Read/Server Read + * CW/SW = Client Write/Server Write + * + * The "special" states are: + * TLS_ST_BEFORE = No handshake has been initiated yet + * TLS_ST_OK = A handshake has been successfully completed + */ +typedef enum { + TLS_ST_BEFORE, + TLS_ST_OK, + DTLS_ST_CR_HELLO_VERIFY_REQUEST, + TLS_ST_CR_SRVR_HELLO, + TLS_ST_CR_CERT, + TLS_ST_CR_CERT_STATUS, + TLS_ST_CR_KEY_EXCH, + TLS_ST_CR_CERT_REQ, + TLS_ST_CR_SRVR_DONE, + TLS_ST_CR_SESSION_TICKET, + TLS_ST_CR_CHANGE, + TLS_ST_CR_FINISHED, + TLS_ST_CW_CLNT_HELLO, + TLS_ST_CW_CERT, + TLS_ST_CW_KEY_EXCH, + TLS_ST_CW_CERT_VRFY, + TLS_ST_CW_CHANGE, + TLS_ST_CW_NEXT_PROTO, + TLS_ST_CW_FINISHED, + TLS_ST_SW_HELLO_REQ, + TLS_ST_SR_CLNT_HELLO, + DTLS_ST_SW_HELLO_VERIFY_REQUEST, + TLS_ST_SW_SRVR_HELLO, + TLS_ST_SW_CERT, + TLS_ST_SW_KEY_EXCH, + TLS_ST_SW_CERT_REQ, + TLS_ST_SW_SRVR_DONE, + TLS_ST_SR_CERT, + TLS_ST_SR_KEY_EXCH, + TLS_ST_SR_CERT_VRFY, + TLS_ST_SR_NEXT_PROTO, + TLS_ST_SR_CHANGE, + TLS_ST_SR_FINISHED, + TLS_ST_SW_SESSION_TICKET, + TLS_ST_SW_CERT_STATUS, + TLS_ST_SW_CHANGE, + TLS_ST_SW_FINISHED, + TLS_ST_SW_ENCRYPTED_EXTENSIONS, + TLS_ST_CR_ENCRYPTED_EXTENSIONS, + TLS_ST_CR_CERT_VRFY, + TLS_ST_SW_CERT_VRFY, + TLS_ST_CR_HELLO_REQ, + TLS_ST_SW_KEY_UPDATE, + TLS_ST_CW_KEY_UPDATE, + TLS_ST_SR_KEY_UPDATE, + TLS_ST_CR_KEY_UPDATE, + TLS_ST_EARLY_DATA, + TLS_ST_PENDING_EARLY_DATA_END, + TLS_ST_CW_END_OF_EARLY_DATA, + TLS_ST_SR_END_OF_EARLY_DATA +} OSSL_HANDSHAKE_STATE; + +/* + * Most of the following state values are no longer used and are defined to be + * the closest equivalent value in the current state machine code. Not all + * defines have an equivalent and are set to a dummy value (-1). SSL_ST_CONNECT + * and SSL_ST_ACCEPT are still in use in the definition of SSL_CB_ACCEPT_LOOP, + * SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP and SSL_CB_CONNECT_EXIT. + */ + +# define SSL_ST_CONNECT 0x1000 +# define SSL_ST_ACCEPT 0x2000 + +# define SSL_ST_MASK 0x0FFF + +# define SSL_CB_LOOP 0x01 +# define SSL_CB_EXIT 0x02 +# define SSL_CB_READ 0x04 +# define SSL_CB_WRITE 0x08 +# define SSL_CB_ALERT 0x4000/* used in callback */ +# define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ) +# define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE) +# define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP) +# define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT) +# define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP) +# define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT) +# define SSL_CB_HANDSHAKE_START 0x10 +# define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +# define SSL_in_connect_init(a) (SSL_in_init(a) && !SSL_is_server(a)) +# define SSL_in_accept_init(a) (SSL_in_init(a) && SSL_is_server(a)) +int SSL_in_init(const SSL *s); +int SSL_in_before(const SSL *s); +int SSL_is_init_finished(const SSL *s); + +/* + * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you + * should not need these + */ +# define SSL_ST_READ_HEADER 0xF0 +# define SSL_ST_READ_BODY 0xF1 +# define SSL_ST_READ_DONE 0xF2 + +/*- + * Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. + */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* + * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 3 options are + * 'ored' with SSL_VERIFY_PEER if they are desired + */ +# define SSL_VERIFY_NONE 0x00 +# define SSL_VERIFY_PEER 0x01 +# define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +# define SSL_VERIFY_CLIENT_ONCE 0x04 +# define SSL_VERIFY_POST_HANDSHAKE 0x08 + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define OpenSSL_add_ssl_algorithms() SSL_library_init() +# define SSLeay_add_ssl_algorithms() SSL_library_init() +# endif + +/* More backward compatibility */ +# define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_cipher_bits(s,np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +# define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +# define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +# define SSL_get_time(a) SSL_SESSION_get_time(a) +# define SSL_set_time(a,b) SSL_SESSION_set_time((a),(b)) +# define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +# define SSL_set_timeout(a,b) SSL_SESSION_set_timeout((a),(b)) + +# define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id) +# define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id) + +DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) +# define SSL_AD_REASON_OFFSET 1000/* offset to get SSL_R_... value + * from SSL_AD_... */ +/* These alert types are for SSLv3 and TLSv1 */ +# define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +/* fatal */ +# define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE +/* fatal */ +# define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC +# define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +# define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +/* fatal */ +# define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE +/* fatal */ +# define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE +/* Not for TLS */ +# define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE +# define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +# define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +# define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +# define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +# define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +/* fatal */ +# define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER +/* fatal */ +# define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA +/* fatal */ +# define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED +/* fatal */ +# define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR +# define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +/* fatal */ +# define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION +/* fatal */ +# define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION +/* fatal */ +# define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY +/* fatal */ +# define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR +# define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +# define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +# define SSL_AD_MISSING_EXTENSION TLS13_AD_MISSING_EXTENSION +# define SSL_AD_CERTIFICATE_REQUIRED TLS13_AD_CERTIFICATE_REQUIRED +# define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +# define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +# define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +# define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +# define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +/* fatal */ +# define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY +/* fatal */ +# define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK +# define SSL_AD_NO_APPLICATION_PROTOCOL TLS1_AD_NO_APPLICATION_PROTOCOL +# define SSL_ERROR_NONE 0 +# define SSL_ERROR_SSL 1 +# define SSL_ERROR_WANT_READ 2 +# define SSL_ERROR_WANT_WRITE 3 +# define SSL_ERROR_WANT_X509_LOOKUP 4 +# define SSL_ERROR_SYSCALL 5/* look at error stack/return + * value/errno */ +# define SSL_ERROR_ZERO_RETURN 6 +# define SSL_ERROR_WANT_CONNECT 7 +# define SSL_ERROR_WANT_ACCEPT 8 +# define SSL_ERROR_WANT_ASYNC 9 +# define SSL_ERROR_WANT_ASYNC_JOB 10 +# define SSL_ERROR_WANT_CLIENT_HELLO_CB 11 +# define SSL_ERROR_WANT_RETRY_VERIFY 12 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SSL_CTRL_SET_TMP_DH 3 +# define SSL_CTRL_SET_TMP_ECDH 4 +# define SSL_CTRL_SET_TMP_DH_CB 6 +# endif + +# define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +# define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +# define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +# define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +# define SSL_CTRL_GET_FLAGS 13 +# define SSL_CTRL_EXTRA_CHAIN_CERT 14 +# define SSL_CTRL_SET_MSG_CALLBACK 15 +# define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 +/* only applies to datagram connections */ +# define SSL_CTRL_SET_MTU 17 +/* Stats */ +# define SSL_CTRL_SESS_NUMBER 20 +# define SSL_CTRL_SESS_CONNECT 21 +# define SSL_CTRL_SESS_CONNECT_GOOD 22 +# define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +# define SSL_CTRL_SESS_ACCEPT 24 +# define SSL_CTRL_SESS_ACCEPT_GOOD 25 +# define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +# define SSL_CTRL_SESS_HIT 27 +# define SSL_CTRL_SESS_CB_HIT 28 +# define SSL_CTRL_SESS_MISSES 29 +# define SSL_CTRL_SESS_TIMEOUTS 30 +# define SSL_CTRL_SESS_CACHE_FULL 31 +# define SSL_CTRL_MODE 33 +# define SSL_CTRL_GET_READ_AHEAD 40 +# define SSL_CTRL_SET_READ_AHEAD 41 +# define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +# define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +# define SSL_CTRL_SET_SESS_CACHE_MODE 44 +# define SSL_CTRL_GET_SESS_CACHE_MODE 45 +# define SSL_CTRL_GET_MAX_CERT_LIST 50 +# define SSL_CTRL_SET_MAX_CERT_LIST 51 +# define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 +/* see tls1.h for macros based on these */ +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +# define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +# define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +# define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +# define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +# define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT 60 */ +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 */ +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 */ +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +# define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 +# endif +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 +# define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 +# define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 +# define SSL_CTRL_SET_SRP_ARG 78 +# define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 +# define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 +# define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 +# define DTLS_CTRL_GET_TIMEOUT 73 +# define DTLS_CTRL_HANDLE_TIMEOUT 74 +# define SSL_CTRL_GET_RI_SUPPORT 76 +# define SSL_CTRL_CLEAR_MODE 78 +# define SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB 79 +# define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +# define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 +# define SSL_CTRL_CHAIN 88 +# define SSL_CTRL_CHAIN_CERT 89 +# define SSL_CTRL_GET_GROUPS 90 +# define SSL_CTRL_SET_GROUPS 91 +# define SSL_CTRL_SET_GROUPS_LIST 92 +# define SSL_CTRL_GET_SHARED_GROUP 93 +# define SSL_CTRL_SET_SIGALGS 97 +# define SSL_CTRL_SET_SIGALGS_LIST 98 +# define SSL_CTRL_CERT_FLAGS 99 +# define SSL_CTRL_CLEAR_CERT_FLAGS 100 +# define SSL_CTRL_SET_CLIENT_SIGALGS 101 +# define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 +# define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 +# define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 +# define SSL_CTRL_BUILD_CERT_CHAIN 105 +# define SSL_CTRL_SET_VERIFY_CERT_STORE 106 +# define SSL_CTRL_SET_CHAIN_CERT_STORE 107 +# define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 +# define SSL_CTRL_GET_PEER_TMP_KEY 109 +# define SSL_CTRL_GET_RAW_CIPHERLIST 110 +# define SSL_CTRL_GET_EC_POINT_FORMATS 111 +# define SSL_CTRL_GET_CHAIN_CERTS 115 +# define SSL_CTRL_SELECT_CURRENT_CERT 116 +# define SSL_CTRL_SET_CURRENT_CERT 117 +# define SSL_CTRL_SET_DH_AUTO 118 +# define DTLS_CTRL_SET_LINK_MTU 120 +# define DTLS_CTRL_GET_LINK_MIN_MTU 121 +# define SSL_CTRL_GET_EXTMS_SUPPORT 122 +# define SSL_CTRL_SET_MIN_PROTO_VERSION 123 +# define SSL_CTRL_SET_MAX_PROTO_VERSION 124 +# define SSL_CTRL_SET_SPLIT_SEND_FRAGMENT 125 +# define SSL_CTRL_SET_MAX_PIPELINES 126 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE 127 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB 128 +# define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG 129 +# define SSL_CTRL_GET_MIN_PROTO_VERSION 130 +# define SSL_CTRL_GET_MAX_PROTO_VERSION 131 +# define SSL_CTRL_GET_SIGNATURE_NID 132 +# define SSL_CTRL_GET_TMP_KEY 133 +# define SSL_CTRL_GET_NEGOTIATED_GROUP 134 +# define SSL_CTRL_SET_RETRY_VERIFY 136 +# define SSL_CTRL_GET_VERIFY_CERT_STORE 137 +# define SSL_CTRL_GET_CHAIN_CERT_STORE 138 +# define SSL_CERT_SET_FIRST 1 +# define SSL_CERT_SET_NEXT 2 +# define SSL_CERT_SET_SERVER 3 +# define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)(arg)) +# define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl,DTLS_CTRL_HANDLE_TIMEOUT,0, NULL) +# define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL) +# define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL) +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SSL_CTX_set_tmp_dh(ctx,dh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)(dh)) +# endif +# define SSL_CTX_set_dh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_DH_AUTO,onoff,NULL) +# define SSL_set_dh_auto(s, onoff) \ + SSL_ctrl(s,SSL_CTRL_SET_DH_AUTO,onoff,NULL) +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SSL_set_tmp_dh(ssl,dh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)(dh)) +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh)) +# define SSL_set_tmp_ecdh(ssl,ecdh) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)(ecdh)) +# endif +# define SSL_CTX_add_extra_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)(x509)) +# define SSL_CTX_get_extra_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,0,px509) +# define SSL_CTX_get_extra_chain_certs_only(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_EXTRA_CHAIN_CERTS,1,px509) +# define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) +# define SSL_CTX_set0_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,0,(char *)(sk)) +# define SSL_CTX_set1_chain(ctx,sk) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN,1,(char *)(sk)) +# define SSL_CTX_add0_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,0,(char *)(x509)) +# define SSL_CTX_add1_chain_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_CHAIN_CERT,1,(char *)(x509)) +# define SSL_CTX_get0_chain_certs(ctx,px509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_CTX_clear_chain_certs(ctx) \ + SSL_CTX_set0_chain(ctx,NULL) +# define SSL_CTX_build_cert_chain(ctx, flags) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_CTX_select_current_cert(ctx,x509) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509)) +# define SSL_CTX_set_current_cert(ctx, op) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_CTX_set0_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st)) +# define SSL_CTX_set1_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st)) +# define SSL_CTX_get0_verify_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_VERIFY_CERT_STORE,0,(char *)(st)) +# define SSL_CTX_set0_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st)) +# define SSL_CTX_set1_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st)) +# define SSL_CTX_get0_chain_cert_store(ctx,st) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_CHAIN_CERT_STORE,0,(char *)(st)) +# define SSL_set0_chain(s,sk) \ + SSL_ctrl(s,SSL_CTRL_CHAIN,0,(char *)(sk)) +# define SSL_set1_chain(s,sk) \ + SSL_ctrl(s,SSL_CTRL_CHAIN,1,(char *)(sk)) +# define SSL_add0_chain_cert(s,x509) \ + SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,0,(char *)(x509)) +# define SSL_add1_chain_cert(s,x509) \ + SSL_ctrl(s,SSL_CTRL_CHAIN_CERT,1,(char *)(x509)) +# define SSL_get0_chain_certs(s,px509) \ + SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERTS,0,px509) +# define SSL_clear_chain_certs(s) \ + SSL_set0_chain(s,NULL) +# define SSL_build_cert_chain(s, flags) \ + SSL_ctrl(s,SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +# define SSL_select_current_cert(s,x509) \ + SSL_ctrl(s,SSL_CTRL_SELECT_CURRENT_CERT,0,(char *)(x509)) +# define SSL_set_current_cert(s,op) \ + SSL_ctrl(s,SSL_CTRL_SET_CURRENT_CERT, op, NULL) +# define SSL_set0_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,0,(char *)(st)) +# define SSL_set1_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_VERIFY_CERT_STORE,1,(char *)(st)) +#define SSL_get0_verify_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_GET_VERIFY_CERT_STORE,0,(char *)(st)) +# define SSL_set0_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,0,(char *)(st)) +# define SSL_set1_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_SET_CHAIN_CERT_STORE,1,(char *)(st)) +#define SSL_get0_chain_cert_store(s,st) \ + SSL_ctrl(s,SSL_CTRL_GET_CHAIN_CERT_STORE,0,(char *)(st)) + +# define SSL_get1_groups(s, glist) \ + SSL_ctrl(s,SSL_CTRL_GET_GROUPS,0,(int*)(glist)) +# define SSL_CTX_set1_groups(ctx, glist, glistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS,glistlen,(int *)(glist)) +# define SSL_CTX_set1_groups_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(s)) +# define SSL_set1_groups(s, glist, glistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_GROUPS,glistlen,(char *)(glist)) +# define SSL_set1_groups_list(s, str) \ + SSL_ctrl(s,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(str)) +# define SSL_get_shared_group(s, n) \ + SSL_ctrl(s,SSL_CTRL_GET_SHARED_GROUP,n,NULL) +# define SSL_get_negotiated_group(s) \ + SSL_ctrl(s,SSL_CTRL_GET_NEGOTIATED_GROUP,0,NULL) +# define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist)) +# define SSL_CTX_set1_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(s)) +# define SSL_set1_sigalgs(s, slist, slistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_SIGALGS,slistlen,(int *)(slist)) +# define SSL_set1_sigalgs_list(s, str) \ + SSL_ctrl(s,SSL_CTRL_SET_SIGALGS_LIST,0,(char *)(str)) +# define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist)) +# define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(s)) +# define SSL_set1_client_sigalgs(s, slist, slistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS,slistlen,(int *)(slist)) +# define SSL_set1_client_sigalgs_list(s, str) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_SIGALGS_LIST,0,(char *)(str)) +# define SSL_get0_certificate_types(s, clist) \ + SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)(clist)) +# define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen, \ + (char *)(clist)) +# define SSL_set1_client_certificate_types(s, clist, clistlen) \ + SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)(clist)) +# define SSL_get_signature_nid(s, pn) \ + SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NID,0,pn) +# define SSL_get_peer_signature_nid(s, pn) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn) +# define SSL_get_peer_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_TMP_KEY,0,pk) +# define SSL_get_tmp_key(s, pk) \ + SSL_ctrl(s,SSL_CTRL_GET_TMP_KEY,0,pk) +# define SSL_get0_raw_cipherlist(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_RAW_CIPHERLIST,0,plst) +# define SSL_get0_ec_point_formats(s, plst) \ + SSL_ctrl(s,SSL_CTRL_GET_EC_POINT_FORMATS,0,plst) +# define SSL_CTX_set_min_proto_version(ctx, version) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) +# define SSL_CTX_set_max_proto_version(ctx, version) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) +# define SSL_CTX_get_min_proto_version(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) +# define SSL_CTX_get_max_proto_version(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) +# define SSL_set_min_proto_version(s, version) \ + SSL_ctrl(s, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) +# define SSL_set_max_proto_version(s, version) \ + SSL_ctrl(s, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) +# define SSL_get_min_proto_version(s) \ + SSL_ctrl(s, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) +# define SSL_get_max_proto_version(s) \ + SSL_ctrl(s, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) + +const char *SSL_group_to_name(SSL *s, int id); + +/* Backwards compatibility, original 1.1.0 names */ +# define SSL_CTRL_GET_SERVER_TMP_KEY \ + SSL_CTRL_GET_PEER_TMP_KEY +# define SSL_get_server_tmp_key(s, pk) \ + SSL_get_peer_tmp_key(s, pk) + +int SSL_set0_tmp_dh_pkey(SSL *s, EVP_PKEY *dhpkey); +int SSL_CTX_set0_tmp_dh_pkey(SSL_CTX *ctx, EVP_PKEY *dhpkey); + +/* + * The following symbol names are old and obsolete. They are kept + * for compatibility reasons only and should not be used anymore. + */ +# define SSL_CTRL_GET_CURVES SSL_CTRL_GET_GROUPS +# define SSL_CTRL_SET_CURVES SSL_CTRL_SET_GROUPS +# define SSL_CTRL_SET_CURVES_LIST SSL_CTRL_SET_GROUPS_LIST +# define SSL_CTRL_GET_SHARED_CURVE SSL_CTRL_GET_SHARED_GROUP + +# define SSL_get1_curves SSL_get1_groups +# define SSL_CTX_set1_curves SSL_CTX_set1_groups +# define SSL_CTX_set1_curves_list SSL_CTX_set1_groups_list +# define SSL_set1_curves SSL_set1_groups +# define SSL_set1_curves_list SSL_set1_groups_list +# define SSL_get_shared_curve SSL_get_shared_group + + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* Provide some compatibility macros for removed functionality. */ +# define SSL_CTX_need_tmp_RSA(ctx) 0 +# define SSL_CTX_set_tmp_rsa(ctx,rsa) 1 +# define SSL_need_tmp_RSA(ssl) 0 +# define SSL_set_tmp_rsa(ssl,rsa) 1 +# define SSL_CTX_set_ecdh_auto(dummy, onoff) ((onoff) != 0) +# define SSL_set_ecdh_auto(dummy, onoff) ((onoff) != 0) +/* + * We "pretend" to call the callback to avoid warnings about unused static + * functions. + */ +# define SSL_CTX_set_tmp_rsa_callback(ctx, cb) while(0) (cb)(NULL, 0, 0) +# define SSL_set_tmp_rsa_callback(ssl, cb) while(0) (cb)(NULL, 0, 0) +# endif +__owur const BIO_METHOD *BIO_f_ssl(void); +__owur BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +__owur BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +__owur BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +__owur int BIO_ssl_copy_session_id(BIO *to, BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +__owur int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); +__owur SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); +__owur SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq, + const SSL_METHOD *meth); +int SSL_CTX_up_ref(SSL_CTX *ctx); +void SSL_CTX_free(SSL_CTX *); +__owur long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); +__owur long SSL_CTX_get_timeout(const SSL_CTX *ctx); +__owur X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +void SSL_CTX_set1_cert_store(SSL_CTX *, X509_STORE *); +__owur int SSL_want(const SSL *s); +__owur int SSL_clear(SSL *s); + +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); + +__owur const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +__owur const SSL_CIPHER *SSL_get_pending_cipher(const SSL *s); +__owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +__owur const char *SSL_CIPHER_get_version(const SSL_CIPHER *c); +__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); +__owur const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); +__owur const char *OPENSSL_cipher_name(const char *rfc_name); +__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c); +__owur uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c); +__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c); +__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c); +__owur const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c); +__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c); + +__owur int SSL_get_fd(const SSL *s); +__owur int SSL_get_rfd(const SSL *s); +__owur int SSL_get_wfd(const SSL *s); +__owur const char *SSL_get_cipher_list(const SSL *s, int n); +__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size); +__owur int SSL_get_read_ahead(const SSL *s); +__owur int SSL_pending(const SSL *s); +__owur int SSL_has_pending(const SSL *s); +# ifndef OPENSSL_NO_SOCK +__owur int SSL_set_fd(SSL *s, int fd); +__owur int SSL_set_rfd(SSL *s, int fd); +__owur int SSL_set_wfd(SSL *s, int fd); +# endif +void SSL_set0_rbio(SSL *s, BIO *rbio); +void SSL_set0_wbio(SSL *s, BIO *wbio); +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +__owur BIO *SSL_get_rbio(const SSL *s); +__owur BIO *SSL_get_wbio(const SSL *s); +__owur int SSL_set_cipher_list(SSL *s, const char *str); +__owur int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str); +__owur int SSL_set_ciphersuites(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +__owur int SSL_get_verify_mode(const SSL *s); +__owur int SSL_get_verify_depth(const SSL *s); +__owur SSL_verify_cb SSL_get_verify_callback(const SSL *s); +void SSL_set_verify(SSL *s, int mode, SSL_verify_cb callback); +void SSL_set_verify_depth(SSL *s, int depth); +void SSL_set_cert_cb(SSL *s, int (*cb) (SSL *ssl, void *arg), void *arg); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 __owur int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, + const unsigned char *d, long len); +# endif +__owur int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +__owur int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, + long len); +__owur int SSL_use_certificate(SSL *ssl, X509 *x); +__owur int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); +__owur int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey, + STACK_OF(X509) *chain, int override); + + +/* serverinfo file format versions */ +# define SSL_SERVERINFOV1 1 +# define SSL_SERVERINFOV2 2 + +/* Set serverinfo data for the current active cert. */ +__owur int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, + size_t serverinfo_length); +__owur int SSL_CTX_use_serverinfo_ex(SSL_CTX *ctx, unsigned int version, + const unsigned char *serverinfo, + size_t serverinfo_length); +__owur int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +#endif + +__owur int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +__owur int SSL_use_certificate_file(SSL *ssl, const char *file, int type); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, + int type); +#endif +__owur int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, + int type); +__owur int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, + int type); +/* PEM type */ +__owur int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); +__owur int SSL_use_certificate_chain_file(SSL *ssl, const char *file); +__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +__owur STACK_OF(X509_NAME) +*SSL_load_client_CA_file_ex(const char *file, OSSL_LIB_CTX *libctx, + const char *propq); +__owur int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); +int SSL_add_store_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *uri); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define SSL_load_error_strings() \ + OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \ + | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) +# endif + +__owur const char *SSL_state_string(const SSL *s); +__owur const char *SSL_rstate_string(const SSL *s); +__owur const char *SSL_state_string_long(const SSL *s); +__owur const char *SSL_rstate_string_long(const SSL *s); +__owur long SSL_SESSION_get_time(const SSL_SESSION *s); +__owur long SSL_SESSION_set_time(SSL_SESSION *s, long t); +__owur long SSL_SESSION_get_timeout(const SSL_SESSION *s); +__owur long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +__owur int SSL_SESSION_get_protocol_version(const SSL_SESSION *s); +__owur int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version); + +__owur const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s); +__owur int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname); +void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s, + const unsigned char **alpn, + size_t *len); +__owur int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s, + const unsigned char *alpn, + size_t len); +__owur const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s); +__owur int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher); +__owur int SSL_SESSION_has_ticket(const SSL_SESSION *s); +__owur unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s); +void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick, + size_t *len); +__owur uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s); +__owur int SSL_SESSION_set_max_early_data(SSL_SESSION *s, + uint32_t max_early_data); +__owur int SSL_copy_session_id(SSL *to, const SSL *from); +__owur X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +__owur int SSL_SESSION_set1_id_context(SSL_SESSION *s, + const unsigned char *sid_ctx, + unsigned int sid_ctx_len); +__owur int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid, + unsigned int sid_len); +__owur int SSL_SESSION_is_resumable(const SSL_SESSION *s); + +__owur SSL_SESSION *SSL_SESSION_new(void); +__owur SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, + unsigned int *len); +const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s, + unsigned int *len); +__owur unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +# ifndef OPENSSL_NO_STDIO +int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); +# endif +int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); +int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x); +int SSL_SESSION_up_ref(SSL_SESSION *ses); +void SSL_SESSION_free(SSL_SESSION *ses); +__owur int i2d_SSL_SESSION(const SSL_SESSION *in, unsigned char **pp); +__owur int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session); +int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session); +__owur int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb); +__owur int SSL_set_generate_session_id(SSL *s, GEN_SESSION_CB cb); +__owur int SSL_has_matching_session_id(const SSL *s, + const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, + long length); + +# ifdef OPENSSL_X509_H +__owur X509 *SSL_get0_peer_certificate(const SSL *s); +__owur X509 *SSL_get1_peer_certificate(const SSL *s); +/* Deprecated in 3.0.0 */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SSL_get_peer_certificate SSL_get1_peer_certificate +# endif +# endif + +__owur STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +__owur int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +__owur int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +__owur SSL_verify_cb SSL_CTX_get_verify_callback(const SSL_CTX *ctx); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb callback); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, + int (*cb) (X509_STORE_CTX *, void *), + void *arg); +void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb) (SSL *ssl, void *arg), + void *arg); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, + long len); +# endif +__owur int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +__owur int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, + const unsigned char *d, long len); +__owur int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +__owur int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d); +__owur int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey, + STACK_OF(X509) *chain, int override); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); +pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx); +void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx); +void SSL_set_default_passwd_cb(SSL *s, pem_password_cb *cb); +void SSL_set_default_passwd_cb_userdata(SSL *s, void *u); +pem_password_cb *SSL_get_default_passwd_cb(SSL *s); +void *SSL_get_default_passwd_cb_userdata(SSL *s); + +__owur int SSL_CTX_check_private_key(const SSL_CTX *ctx); +__owur int SSL_check_private_key(const SSL *ctx); + +__owur int SSL_CTX_set_session_id_context(SSL_CTX *ctx, + const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL *SSL_new(SSL_CTX *ctx); +int SSL_up_ref(SSL *s); +int SSL_is_dtls(const SSL *s); +__owur int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +__owur int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose); +__owur int SSL_set_purpose(SSL *ssl, int purpose); +__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust); +__owur int SSL_set_trust(SSL *ssl, int trust); + +__owur int SSL_set1_host(SSL *s, const char *hostname); +__owur int SSL_add1_host(SSL *s, const char *hostname); +__owur const char *SSL_get0_peername(SSL *s); +void SSL_set_hostflags(SSL *s, unsigned int flags); + +__owur int SSL_CTX_dane_enable(SSL_CTX *ctx); +__owur int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md, + uint8_t mtype, uint8_t ord); +__owur int SSL_dane_enable(SSL *s, const char *basedomain); +__owur int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector, + uint8_t mtype, const unsigned char *data, size_t dlen); +__owur int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki); +__owur int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector, + uint8_t *mtype, const unsigned char **data, + size_t *dlen); +/* + * Bridge opacity barrier between libcrypt and libssl, also needed to support + * offline testing in test/danetest.c + */ +SSL_DANE *SSL_get0_dane(SSL *ssl); +/* + * DANE flags + */ +unsigned long SSL_CTX_dane_set_flags(SSL_CTX *ctx, unsigned long flags); +unsigned long SSL_CTX_dane_clear_flags(SSL_CTX *ctx, unsigned long flags); +unsigned long SSL_dane_set_flags(SSL *ssl, unsigned long flags); +unsigned long SSL_dane_clear_flags(SSL *ssl, unsigned long flags); + +__owur int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +__owur int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + +__owur X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); +__owur X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); + +# ifndef OPENSSL_NO_SRP +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, + char *(*cb) (SSL *, void *)); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, + int (*cb) (SSL *, void *)); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, + int (*cb) (SSL *, int *, void *)); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); + +OSSL_DEPRECATEDIN_3_0 +int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, + BIGNUM *sa, BIGNUM *v, char *info); +OSSL_DEPRECATEDIN_3_0 +int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, + const char *grp); + +OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_g(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_N(SSL *s); + +OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_username(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_userinfo(SSL *s); +# endif +# endif + +/* + * ClientHello callback and helpers. + */ + +# define SSL_CLIENT_HELLO_SUCCESS 1 +# define SSL_CLIENT_HELLO_ERROR 0 +# define SSL_CLIENT_HELLO_RETRY (-1) + +typedef int (*SSL_client_hello_cb_fn) (SSL *s, int *al, void *arg); +void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb, + void *arg); +int SSL_client_hello_isv2(SSL *s); +unsigned int SSL_client_hello_get0_legacy_version(SSL *s); +size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_session_id(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_ciphers(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_compression_methods(SSL *s, + const unsigned char **out); +int SSL_client_hello_get1_extensions_present(SSL *s, int **out, size_t *outlen); +int SSL_client_hello_get0_ext(SSL *s, unsigned int type, + const unsigned char **out, size_t *outlen); + +void SSL_certs_clear(SSL *s); +void SSL_free(SSL *ssl); +# ifdef OSSL_ASYNC_FD +/* + * Windows application developer has to include windows.h to use these. + */ +__owur int SSL_waiting_for_async(SSL *s); +__owur int SSL_get_all_async_fds(SSL *s, OSSL_ASYNC_FD *fds, size_t *numfds); +__owur int SSL_get_changed_async_fds(SSL *s, OSSL_ASYNC_FD *addfd, + size_t *numaddfds, OSSL_ASYNC_FD *delfd, + size_t *numdelfds); +__owur int SSL_CTX_set_async_callback(SSL_CTX *ctx, SSL_async_callback_fn callback); +__owur int SSL_CTX_set_async_callback_arg(SSL_CTX *ctx, void *arg); +__owur int SSL_set_async_callback(SSL *s, SSL_async_callback_fn callback); +__owur int SSL_set_async_callback_arg(SSL *s, void *arg); +__owur int SSL_get_async_status(SSL *s, int *status); + +# endif +__owur int SSL_accept(SSL *ssl); +__owur int SSL_stateless(SSL *s); +__owur int SSL_connect(SSL *ssl); +__owur int SSL_read(SSL *ssl, void *buf, int num); +__owur int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); + +# define SSL_READ_EARLY_DATA_ERROR 0 +# define SSL_READ_EARLY_DATA_SUCCESS 1 +# define SSL_READ_EARLY_DATA_FINISH 2 + +__owur int SSL_read_early_data(SSL *s, void *buf, size_t num, + size_t *readbytes); +__owur int SSL_peek(SSL *ssl, void *buf, int num); +__owur int SSL_peek_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); +__owur ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size, + int flags); +__owur int SSL_write(SSL *ssl, const void *buf, int num); +__owur int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written); +__owur int SSL_write_early_data(SSL *s, const void *buf, size_t num, + size_t *written); +long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +# define SSL_EARLY_DATA_NOT_SENT 0 +# define SSL_EARLY_DATA_REJECTED 1 +# define SSL_EARLY_DATA_ACCEPTED 2 + +__owur int SSL_get_early_data_status(const SSL *s); + +__owur int SSL_get_error(const SSL *s, int ret_code); +__owur const char *SSL_get_version(const SSL *s); + +/* This sets the 'default' SSL version that SSL_new() will create */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); +# endif + +# ifndef OPENSSL_NO_SSL3_METHOD +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_client_method(void); +# endif +# endif + +#define SSLv23_method TLS_method +#define SSLv23_server_method TLS_server_method +#define SSLv23_client_method TLS_client_method + +/* Negotiate highest available SSL/TLS version */ +__owur const SSL_METHOD *TLS_method(void); +__owur const SSL_METHOD *TLS_server_method(void); +__owur const SSL_METHOD *TLS_client_method(void); + +# ifndef OPENSSL_NO_TLS1_METHOD +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_client_method(void); +# endif +# endif + +# ifndef OPENSSL_NO_TLS1_1_METHOD +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_client_method(void); +# endif +# endif + +# ifndef OPENSSL_NO_TLS1_2_METHOD +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_client_method(void); +# endif +# endif + +# ifndef OPENSSL_NO_DTLS1_METHOD +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_client_method(void); +# endif +# endif + +# ifndef OPENSSL_NO_DTLS1_2_METHOD +/* DTLSv1.2 */ +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_client_method(void); +# endif +# endif + +__owur const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ +__owur const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ +__owur const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ + +__owur size_t DTLS_get_data_mtu(const SSL *s); + +__owur STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); +__owur STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx); +__owur STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s); +__owur STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s); + +__owur int SSL_do_handshake(SSL *s); +int SSL_key_update(SSL *s, int updatetype); +int SSL_get_key_update_type(const SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +__owur int SSL_renegotiate_pending(const SSL *s); +int SSL_new_session_ticket(SSL *s); +int SSL_shutdown(SSL *s); +__owur int SSL_verify_client_post_handshake(SSL *s); +void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val); +void SSL_set_post_handshake_auth(SSL *s, int val); + +__owur const SSL_METHOD *SSL_CTX_get_ssl_method(const SSL_CTX *ctx); +__owur const SSL_METHOD *SSL_get_ssl_method(const SSL *s); +__owur int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +__owur const char *SSL_alert_type_string_long(int value); +__owur const char *SSL_alert_type_string(int value); +__owur const char *SSL_alert_desc_string_long(int value); +__owur const char *SSL_alert_desc_string(int value); + +void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +__owur const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s); +__owur const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx); +__owur int SSL_add1_to_CA_list(SSL *ssl, const X509 *x); +__owur int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x); +__owur const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +__owur STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +__owur STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +__owur int SSL_add_client_CA(SSL *ssl, X509 *x); +__owur int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +__owur long SSL_get_default_timeout(const SSL *s); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define SSL_library_init() OPENSSL_init_ssl(0, NULL) +# endif + +__owur char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +__owur STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk); + +__owur SSL *SSL_dup(SSL *ssl); + +__owur X509 *SSL_get_certificate(const SSL *ssl); +/* + * EVP_PKEY + */ +struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); + +__owur X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); +__owur EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); +__owur int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl, int mode); +__owur int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl, int mode); +__owur int SSL_get_shutdown(const SSL *ssl); +__owur int SSL_version(const SSL *ssl); +__owur int SSL_client_version(const SSL *s); +__owur int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_file(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_store(SSL_CTX *ctx); +__owur int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile); +__owur int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath); +__owur int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore); +__owur int SSL_CTX_load_verify_locations(SSL_CTX *ctx, + const char *CAfile, + const char *CApath); +# define SSL_get0_session SSL_get_session/* just peek at pointer */ +__owur SSL_SESSION *SSL_get_session(const SSL *ssl); +__owur SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +__owur SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb) (const SSL *ssl, int type, int val)); +void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type, + int val); +__owur OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl); + +void SSL_set_verify_result(SSL *ssl, long v); +__owur long SSL_get_verify_result(const SSL *ssl); +__owur STACK_OF(X509) *SSL_get0_verified_chain(const SSL *s); + +__owur size_t SSL_get_client_random(const SSL *ssl, unsigned char *out, + size_t outlen); +__owur size_t SSL_get_server_random(const SSL *ssl, unsigned char *out, + size_t outlen); +__owur size_t SSL_SESSION_get_master_key(const SSL_SESSION *sess, + unsigned char *out, size_t outlen); +__owur int SSL_SESSION_set1_master_key(SSL_SESSION *sess, + const unsigned char *in, size_t len); +uint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *sess); + +#define SSL_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, l, p, newf, dupf, freef) +__owur int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +#define SSL_SESSION_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, l, p, newf, dupf, freef) +__owur int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); +#define SSL_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, l, p, newf, dupf, freef) +__owur int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); + +__owur int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +# define SSL_CTX_sess_set_cache_size(ctx,t) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL) +# define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL) +# define SSL_CTX_set_session_cache_mode(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL) +# define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL) + +# define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +# define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m) +# define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL) +# define SSL_CTX_set_read_ahead(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL) +# define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_CTX_set_max_cert_list(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) +# define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL) +# define SSL_set_max_cert_list(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL) + +# define SSL_CTX_set_max_send_fragment(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) +# define SSL_set_max_send_fragment(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_SEND_FRAGMENT,m,NULL) +# define SSL_CTX_set_split_send_fragment(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL) +# define SSL_set_split_send_fragment(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_SPLIT_SEND_FRAGMENT,m,NULL) +# define SSL_CTX_set_max_pipelines(ctx,m) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_PIPELINES,m,NULL) +# define SSL_set_max_pipelines(ssl,m) \ + SSL_ctrl(ssl,SSL_CTRL_SET_MAX_PIPELINES,m,NULL) +# define SSL_set_retry_verify(ssl) \ + (SSL_ctrl(ssl,SSL_CTRL_SET_RETRY_VERIFY,0,NULL) > 0) + +void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len); +void SSL_set_default_read_buffer_len(SSL *s, size_t len); + +# ifndef OPENSSL_NO_DH +# ifndef OPENSSL_NO_DEPRECATED_3_0 +/* NB: the |keylength| is only applicable when is_export is true */ +OSSL_DEPRECATEDIN_3_0 +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +OSSL_DEPRECATEDIN_3_0 +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh) (SSL *ssl, int is_export, + int keylength)); +# endif +# endif + +__owur const COMP_METHOD *SSL_get_current_compression(const SSL *s); +__owur const COMP_METHOD *SSL_get_current_expansion(const SSL *s); +__owur const char *SSL_COMP_get_name(const COMP_METHOD *comp); +__owur const char *SSL_COMP_get0_name(const SSL_COMP *comp); +__owur int SSL_COMP_get_id(const SSL_COMP *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +__owur STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) + *meths); +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define SSL_COMP_free_compression_methods() while(0) continue +# endif +__owur int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); + +const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); +int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c); +int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c); +int SSL_bytes_to_cipher_list(SSL *s, const unsigned char *bytes, size_t len, + int isv2format, STACK_OF(SSL_CIPHER) **sk, + STACK_OF(SSL_CIPHER) **scsvs); + +/* TLS extensions functions */ +__owur int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +__owur int SSL_set_session_ticket_ext_cb(SSL *s, + tls_session_ticket_ext_cb_fn cb, + void *arg); + +/* Pre-shared secret session resumption functions */ +__owur int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn session_secret_cb, + void *arg); + +void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx, + int (*cb) (SSL *ssl, + int + is_forward_secure)); + +void SSL_set_not_resumable_session_callback(SSL *ssl, + int (*cb) (SSL *ssl, + int is_forward_secure)); + +void SSL_CTX_set_record_padding_callback(SSL_CTX *ctx, + size_t (*cb) (SSL *ssl, int type, + size_t len, void *arg)); +void SSL_CTX_set_record_padding_callback_arg(SSL_CTX *ctx, void *arg); +void *SSL_CTX_get_record_padding_callback_arg(const SSL_CTX *ctx); +int SSL_CTX_set_block_padding(SSL_CTX *ctx, size_t block_size); + +int SSL_set_record_padding_callback(SSL *ssl, + size_t (*cb) (SSL *ssl, int type, + size_t len, void *arg)); +void SSL_set_record_padding_callback_arg(SSL *ssl, void *arg); +void *SSL_get_record_padding_callback_arg(const SSL *ssl); +int SSL_set_block_padding(SSL *ssl, size_t block_size); + +int SSL_set_num_tickets(SSL *s, size_t num_tickets); +size_t SSL_get_num_tickets(const SSL *s); +int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets); +size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define SSL_cache_hit(s) SSL_session_reused(s) +# endif + +__owur int SSL_session_reused(const SSL *s); +__owur int SSL_is_server(const SSL *s); + +__owur __owur SSL_CONF_CTX *SSL_CONF_CTX_new(void); +int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); +void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); +unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); +__owur unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, + unsigned int flags); +__owur int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); + +void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); +void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); + +__owur int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); +__owur int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); +__owur int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); + +void SSL_add_ssl_module(void); +int SSL_config(SSL *s, const char *name); +int SSL_CTX_config(SSL_CTX *ctx, const char *name); + +# ifndef OPENSSL_NO_SSL_TRACE +void SSL_trace(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); +# endif + +# ifndef OPENSSL_NO_SOCK +int DTLSv1_listen(SSL *s, BIO_ADDR *client); +# endif + +# ifndef OPENSSL_NO_CT + +/* + * A callback for verifying that the received SCTs are sufficient. + * Expected to return 1 if they are sufficient, otherwise 0. + * May return a negative integer if an error occurs. + * A connection should be aborted if the SCTs are deemed insufficient. + */ +typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx, + const STACK_OF(SCT) *scts, void *arg); + +/* + * Sets a |callback| that is invoked upon receipt of ServerHelloDone to validate + * the received SCTs. + * If the callback returns a non-positive result, the connection is terminated. + * Call this function before beginning a handshake. + * If a NULL |callback| is provided, SCT validation is disabled. + * |arg| is arbitrary userdata that will be passed to the callback whenever it + * is invoked. Ownership of |arg| remains with the caller. + * + * NOTE: A side-effect of setting a CT callback is that an OCSP stapled response + * will be requested. + */ +int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback, + void *arg); +int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx, + ssl_ct_validation_cb callback, + void *arg); +#define SSL_disable_ct(s) \ + ((void) SSL_set_validation_callback((s), NULL, NULL)) +#define SSL_CTX_disable_ct(ctx) \ + ((void) SSL_CTX_set_validation_callback((ctx), NULL, NULL)) + +/* + * The validation type enumerates the available behaviours of the built-in SSL + * CT validation callback selected via SSL_enable_ct() and SSL_CTX_enable_ct(). + * The underlying callback is a static function in libssl. + */ +enum { + SSL_CT_VALIDATION_PERMISSIVE = 0, + SSL_CT_VALIDATION_STRICT +}; + +/* + * Enable CT by setting up a callback that implements one of the built-in + * validation variants. The SSL_CT_VALIDATION_PERMISSIVE variant always + * continues the handshake, the application can make appropriate decisions at + * handshake completion. The SSL_CT_VALIDATION_STRICT variant requires at + * least one valid SCT, or else handshake termination will be requested. The + * handshake may continue anyway if SSL_VERIFY_NONE is in effect. + */ +int SSL_enable_ct(SSL *s, int validation_mode); +int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode); + +/* + * Report whether a non-NULL callback is enabled. + */ +int SSL_ct_is_enabled(const SSL *s); +int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx); + +/* Gets the SCTs received from a connection */ +const STACK_OF(SCT) *SSL_get0_peer_scts(SSL *s); + +/* + * Loads the CT log list from the default location. + * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, + * the log information loaded from this file will be appended to the + * CTLOG_STORE. + * Returns 1 on success, 0 otherwise. + */ +int SSL_CTX_set_default_ctlog_list_file(SSL_CTX *ctx); + +/* + * Loads the CT log list from the specified file path. + * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, + * the log information loaded from this file will be appended to the + * CTLOG_STORE. + * Returns 1 on success, 0 otherwise. + */ +int SSL_CTX_set_ctlog_list_file(SSL_CTX *ctx, const char *path); + +/* + * Sets the CT log list used by all SSL connections created from this SSL_CTX. + * Ownership of the CTLOG_STORE is transferred to the SSL_CTX. + */ +void SSL_CTX_set0_ctlog_store(SSL_CTX *ctx, CTLOG_STORE *logs); + +/* + * Gets the CT log list used by all SSL connections created from this SSL_CTX. + * This will be NULL unless one of the following functions has been called: + * - SSL_CTX_set_default_ctlog_list_file + * - SSL_CTX_set_ctlog_list_file + * - SSL_CTX_set_ctlog_store + */ +const CTLOG_STORE *SSL_CTX_get0_ctlog_store(const SSL_CTX *ctx); + +# endif /* OPENSSL_NO_CT */ + +/* What the "other" parameter contains in security callback */ +/* Mask for type */ +# define SSL_SECOP_OTHER_TYPE 0xffff0000 +# define SSL_SECOP_OTHER_NONE 0 +# define SSL_SECOP_OTHER_CIPHER (1 << 16) +# define SSL_SECOP_OTHER_CURVE (2 << 16) +# define SSL_SECOP_OTHER_DH (3 << 16) +# define SSL_SECOP_OTHER_PKEY (4 << 16) +# define SSL_SECOP_OTHER_SIGALG (5 << 16) +# define SSL_SECOP_OTHER_CERT (6 << 16) + +/* Indicated operation refers to peer key or certificate */ +# define SSL_SECOP_PEER 0x1000 + +/* Values for "op" parameter in security callback */ + +/* Called to filter ciphers */ +/* Ciphers client supports */ +# define SSL_SECOP_CIPHER_SUPPORTED (1 | SSL_SECOP_OTHER_CIPHER) +/* Cipher shared by client/server */ +# define SSL_SECOP_CIPHER_SHARED (2 | SSL_SECOP_OTHER_CIPHER) +/* Sanity check of cipher server selects */ +# define SSL_SECOP_CIPHER_CHECK (3 | SSL_SECOP_OTHER_CIPHER) +/* Curves supported by client */ +# define SSL_SECOP_CURVE_SUPPORTED (4 | SSL_SECOP_OTHER_CURVE) +/* Curves shared by client/server */ +# define SSL_SECOP_CURVE_SHARED (5 | SSL_SECOP_OTHER_CURVE) +/* Sanity check of curve server selects */ +# define SSL_SECOP_CURVE_CHECK (6 | SSL_SECOP_OTHER_CURVE) +/* Temporary DH key */ +# define SSL_SECOP_TMP_DH (7 | SSL_SECOP_OTHER_PKEY) +/* SSL/TLS version */ +# define SSL_SECOP_VERSION (9 | SSL_SECOP_OTHER_NONE) +/* Session tickets */ +# define SSL_SECOP_TICKET (10 | SSL_SECOP_OTHER_NONE) +/* Supported signature algorithms sent to peer */ +# define SSL_SECOP_SIGALG_SUPPORTED (11 | SSL_SECOP_OTHER_SIGALG) +/* Shared signature algorithm */ +# define SSL_SECOP_SIGALG_SHARED (12 | SSL_SECOP_OTHER_SIGALG) +/* Sanity check signature algorithm allowed */ +# define SSL_SECOP_SIGALG_CHECK (13 | SSL_SECOP_OTHER_SIGALG) +/* Used to get mask of supported public key signature algorithms */ +# define SSL_SECOP_SIGALG_MASK (14 | SSL_SECOP_OTHER_SIGALG) +/* Use to see if compression is allowed */ +# define SSL_SECOP_COMPRESSION (15 | SSL_SECOP_OTHER_NONE) +/* EE key in certificate */ +# define SSL_SECOP_EE_KEY (16 | SSL_SECOP_OTHER_CERT) +/* CA key in certificate */ +# define SSL_SECOP_CA_KEY (17 | SSL_SECOP_OTHER_CERT) +/* CA digest algorithm in certificate */ +# define SSL_SECOP_CA_MD (18 | SSL_SECOP_OTHER_CERT) +/* Peer EE key in certificate */ +# define SSL_SECOP_PEER_EE_KEY (SSL_SECOP_EE_KEY | SSL_SECOP_PEER) +/* Peer CA key in certificate */ +# define SSL_SECOP_PEER_CA_KEY (SSL_SECOP_CA_KEY | SSL_SECOP_PEER) +/* Peer CA digest algorithm in certificate */ +# define SSL_SECOP_PEER_CA_MD (SSL_SECOP_CA_MD | SSL_SECOP_PEER) + +void SSL_set_security_level(SSL *s, int level); +__owur int SSL_get_security_level(const SSL *s); +void SSL_set_security_callback(SSL *s, + int (*cb) (const SSL *s, const SSL_CTX *ctx, + int op, int bits, int nid, + void *other, void *ex)); +int (*SSL_get_security_callback(const SSL *s)) (const SSL *s, + const SSL_CTX *ctx, int op, + int bits, int nid, void *other, + void *ex); +void SSL_set0_security_ex_data(SSL *s, void *ex); +__owur void *SSL_get0_security_ex_data(const SSL *s); + +void SSL_CTX_set_security_level(SSL_CTX *ctx, int level); +__owur int SSL_CTX_get_security_level(const SSL_CTX *ctx); +void SSL_CTX_set_security_callback(SSL_CTX *ctx, + int (*cb) (const SSL *s, const SSL_CTX *ctx, + int op, int bits, int nid, + void *other, void *ex)); +int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx)) (const SSL *s, + const SSL_CTX *ctx, + int op, int bits, + int nid, + void *other, + void *ex); +void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex); +__owur void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx); + +/* OPENSSL_INIT flag 0x010000 reserved for internal use */ +# define OPENSSL_INIT_NO_LOAD_SSL_STRINGS 0x00100000L +# define OPENSSL_INIT_LOAD_SSL_STRINGS 0x00200000L + +# define OPENSSL_INIT_SSL_DEFAULT \ + (OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS) + +int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); + +# ifndef OPENSSL_NO_UNIT_TEST +__owur const struct openssl_ssl_test_functions *SSL_test_functions(void); +# endif + +__owur int SSL_free_buffers(SSL *ssl); +__owur int SSL_alloc_buffers(SSL *ssl); + +/* Status codes passed to the decrypt session ticket callback. Some of these + * are for internal use only and are never passed to the callback. */ +typedef int SSL_TICKET_STATUS; + +/* Support for ticket appdata */ +/* fatal error, malloc failure */ +# define SSL_TICKET_FATAL_ERR_MALLOC 0 +/* fatal error, either from parsing or decrypting the ticket */ +# define SSL_TICKET_FATAL_ERR_OTHER 1 +/* No ticket present */ +# define SSL_TICKET_NONE 2 +/* Empty ticket present */ +# define SSL_TICKET_EMPTY 3 +/* the ticket couldn't be decrypted */ +# define SSL_TICKET_NO_DECRYPT 4 +/* a ticket was successfully decrypted */ +# define SSL_TICKET_SUCCESS 5 +/* same as above but the ticket needs to be renewed */ +# define SSL_TICKET_SUCCESS_RENEW 6 + +/* Return codes for the decrypt session ticket callback */ +typedef int SSL_TICKET_RETURN; + +/* An error occurred */ +#define SSL_TICKET_RETURN_ABORT 0 +/* Do not use the ticket, do not send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_IGNORE 1 +/* Do not use the ticket, send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_IGNORE_RENEW 2 +/* Use the ticket, do not send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_USE 3 +/* Use the ticket, send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_USE_RENEW 4 + +typedef int (*SSL_CTX_generate_session_ticket_fn)(SSL *s, void *arg); +typedef SSL_TICKET_RETURN (*SSL_CTX_decrypt_session_ticket_fn)(SSL *s, SSL_SESSION *ss, + const unsigned char *keyname, + size_t keyname_length, + SSL_TICKET_STATUS status, + void *arg); +int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx, + SSL_CTX_generate_session_ticket_fn gen_cb, + SSL_CTX_decrypt_session_ticket_fn dec_cb, + void *arg); +int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len); +int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len); + +typedef unsigned int (*DTLS_timer_cb)(SSL *s, unsigned int timer_us); + +void DTLS_set_timer_cb(SSL *s, DTLS_timer_cb cb); + + +typedef int (*SSL_allow_early_data_cb_fn)(SSL *s, void *arg); +void SSL_CTX_set_allow_early_data_cb(SSL_CTX *ctx, + SSL_allow_early_data_cb_fn cb, + void *arg); +void SSL_set_allow_early_data_cb(SSL *s, + SSL_allow_early_data_cb_fn cb, + void *arg); + +/* store the default cipher strings inside the library */ +const char *OSSL_default_cipher_list(void); +const char *OSSL_default_ciphersuites(void); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/ssl2.h b/OtherInc/openssl/include/openssl/ssl2.h new file mode 100644 index 0000000..428ead0 --- /dev/null +++ b/OtherInc/openssl/include/openssl/ssl2.h @@ -0,0 +1,30 @@ +/* + * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_SSL2_H +# define OPENSSL_SSL2_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_SSL2_H +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +# define SSL2_VERSION 0x0002 + +# define SSL2_MT_CLIENT_HELLO 1 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/ssl3.h b/OtherInc/openssl/include/openssl/ssl3.h new file mode 100644 index 0000000..49bd51f --- /dev/null +++ b/OtherInc/openssl/include/openssl/ssl3.h @@ -0,0 +1,347 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_SSL3_H +# define OPENSSL_SSL3_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_SSL3_H +# endif + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Signalling cipher suite value from RFC 5746 + * (TLS_EMPTY_RENEGOTIATION_INFO_SCSV) + */ +# define SSL3_CK_SCSV 0x030000FF + +/* + * Signalling cipher suite value from draft-ietf-tls-downgrade-scsv-00 + * (TLS_FALLBACK_SCSV) + */ +# define SSL3_CK_FALLBACK_SCSV 0x03005600 + +# define SSL3_CK_RSA_NULL_MD5 0x03000001 +# define SSL3_CK_RSA_NULL_SHA 0x03000002 +# define SSL3_CK_RSA_RC4_40_MD5 0x03000003 +# define SSL3_CK_RSA_RC4_128_MD5 0x03000004 +# define SSL3_CK_RSA_RC4_128_SHA 0x03000005 +# define SSL3_CK_RSA_RC2_40_MD5 0x03000006 +# define SSL3_CK_RSA_IDEA_128_SHA 0x03000007 +# define SSL3_CK_RSA_DES_40_CBC_SHA 0x03000008 +# define SSL3_CK_RSA_DES_64_CBC_SHA 0x03000009 +# define SSL3_CK_RSA_DES_192_CBC3_SHA 0x0300000A + +# define SSL3_CK_DH_DSS_DES_40_CBC_SHA 0x0300000B +# define SSL3_CK_DH_DSS_DES_64_CBC_SHA 0x0300000C +# define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 0x0300000D +# define SSL3_CK_DH_RSA_DES_40_CBC_SHA 0x0300000E +# define SSL3_CK_DH_RSA_DES_64_CBC_SHA 0x0300000F +# define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 0x03000010 + +# define SSL3_CK_DHE_DSS_DES_40_CBC_SHA 0x03000011 +# define SSL3_CK_EDH_DSS_DES_40_CBC_SHA SSL3_CK_DHE_DSS_DES_40_CBC_SHA +# define SSL3_CK_DHE_DSS_DES_64_CBC_SHA 0x03000012 +# define SSL3_CK_EDH_DSS_DES_64_CBC_SHA SSL3_CK_DHE_DSS_DES_64_CBC_SHA +# define SSL3_CK_DHE_DSS_DES_192_CBC3_SHA 0x03000013 +# define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA SSL3_CK_DHE_DSS_DES_192_CBC3_SHA +# define SSL3_CK_DHE_RSA_DES_40_CBC_SHA 0x03000014 +# define SSL3_CK_EDH_RSA_DES_40_CBC_SHA SSL3_CK_DHE_RSA_DES_40_CBC_SHA +# define SSL3_CK_DHE_RSA_DES_64_CBC_SHA 0x03000015 +# define SSL3_CK_EDH_RSA_DES_64_CBC_SHA SSL3_CK_DHE_RSA_DES_64_CBC_SHA +# define SSL3_CK_DHE_RSA_DES_192_CBC3_SHA 0x03000016 +# define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA SSL3_CK_DHE_RSA_DES_192_CBC3_SHA + +# define SSL3_CK_ADH_RC4_40_MD5 0x03000017 +# define SSL3_CK_ADH_RC4_128_MD5 0x03000018 +# define SSL3_CK_ADH_DES_40_CBC_SHA 0x03000019 +# define SSL3_CK_ADH_DES_64_CBC_SHA 0x0300001A +# define SSL3_CK_ADH_DES_192_CBC_SHA 0x0300001B + +/* a bundle of RFC standard cipher names, generated from ssl3_ciphers[] */ +# define SSL3_RFC_RSA_NULL_MD5 "TLS_RSA_WITH_NULL_MD5" +# define SSL3_RFC_RSA_NULL_SHA "TLS_RSA_WITH_NULL_SHA" +# define SSL3_RFC_RSA_DES_192_CBC3_SHA "TLS_RSA_WITH_3DES_EDE_CBC_SHA" +# define SSL3_RFC_DHE_DSS_DES_192_CBC3_SHA "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA" +# define SSL3_RFC_DHE_RSA_DES_192_CBC3_SHA "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA" +# define SSL3_RFC_ADH_DES_192_CBC_SHA "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA" +# define SSL3_RFC_RSA_IDEA_128_SHA "TLS_RSA_WITH_IDEA_CBC_SHA" +# define SSL3_RFC_RSA_RC4_128_MD5 "TLS_RSA_WITH_RC4_128_MD5" +# define SSL3_RFC_RSA_RC4_128_SHA "TLS_RSA_WITH_RC4_128_SHA" +# define SSL3_RFC_ADH_RC4_128_MD5 "TLS_DH_anon_WITH_RC4_128_MD5" + +# define SSL3_TXT_RSA_NULL_MD5 "NULL-MD5" +# define SSL3_TXT_RSA_NULL_SHA "NULL-SHA" +# define SSL3_TXT_RSA_RC4_40_MD5 "EXP-RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_MD5 "RC4-MD5" +# define SSL3_TXT_RSA_RC4_128_SHA "RC4-SHA" +# define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5" +# define SSL3_TXT_RSA_IDEA_128_SHA "IDEA-CBC-SHA" +# define SSL3_TXT_RSA_DES_40_CBC_SHA "EXP-DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_64_CBC_SHA "DES-CBC-SHA" +# define SSL3_TXT_RSA_DES_192_CBC3_SHA "DES-CBC3-SHA" + +# define SSL3_TXT_DH_DSS_DES_40_CBC_SHA "EXP-DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_64_CBC_SHA "DH-DSS-DES-CBC-SHA" +# define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA "DH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DH_RSA_DES_40_CBC_SHA "EXP-DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_64_CBC_SHA "DH-RSA-DES-CBC-SHA" +# define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA "DH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_DHE_DSS_DES_40_CBC_SHA "EXP-DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_64_CBC_SHA "DHE-DSS-DES-CBC-SHA" +# define SSL3_TXT_DHE_DSS_DES_192_CBC3_SHA "DHE-DSS-DES-CBC3-SHA" +# define SSL3_TXT_DHE_RSA_DES_40_CBC_SHA "EXP-DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_64_CBC_SHA "DHE-RSA-DES-CBC-SHA" +# define SSL3_TXT_DHE_RSA_DES_192_CBC3_SHA "DHE-RSA-DES-CBC3-SHA" + +/* + * This next block of six "EDH" labels is for backward compatibility with + * older versions of OpenSSL. New code should use the six "DHE" labels above + * instead: + */ +# define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA "EXP-EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA "EDH-DSS-DES-CBC-SHA" +# define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA "EDH-DSS-DES-CBC3-SHA" +# define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA "EXP-EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA "EDH-RSA-DES-CBC-SHA" +# define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA "EDH-RSA-DES-CBC3-SHA" + +# define SSL3_TXT_ADH_RC4_40_MD5 "EXP-ADH-RC4-MD5" +# define SSL3_TXT_ADH_RC4_128_MD5 "ADH-RC4-MD5" +# define SSL3_TXT_ADH_DES_40_CBC_SHA "EXP-ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_64_CBC_SHA "ADH-DES-CBC-SHA" +# define SSL3_TXT_ADH_DES_192_CBC_SHA "ADH-DES-CBC3-SHA" + +# define SSL3_SSL_SESSION_ID_LENGTH 32 +# define SSL3_MAX_SSL_SESSION_ID_LENGTH 32 + +# define SSL3_MASTER_SECRET_SIZE 48 +# define SSL3_RANDOM_SIZE 32 +# define SSL3_SESSION_ID_SIZE 32 +# define SSL3_RT_HEADER_LENGTH 5 + +# define SSL3_HM_HEADER_LENGTH 4 + +# ifndef SSL3_ALIGN_PAYLOAD + /* + * Some will argue that this increases memory footprint, but it's not + * actually true. Point is that malloc has to return at least 64-bit aligned + * pointers, meaning that allocating 5 bytes wastes 3 bytes in either case. + * Suggested pre-gaping simply moves these wasted bytes from the end of + * allocated region to its front, but makes data payload aligned, which + * improves performance:-) + */ +# define SSL3_ALIGN_PAYLOAD 8 +# else +# if (SSL3_ALIGN_PAYLOAD&(SSL3_ALIGN_PAYLOAD-1))!=0 +# error "insane SSL3_ALIGN_PAYLOAD" +# undef SSL3_ALIGN_PAYLOAD +# endif +# endif + +/* + * This is the maximum MAC (digest) size used by the SSL library. Currently + * maximum of 20 is used by SHA1, but we reserve for future extension for + * 512-bit hashes. + */ + +# define SSL3_RT_MAX_MD_SIZE 64 + +/* + * Maximum block size used in all ciphersuites. Currently 16 for AES. + */ + +# define SSL_RT_MAX_CIPHER_BLOCK_SIZE 16 + +# define SSL3_RT_MAX_EXTRA (16384) + +/* Maximum plaintext length: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_PLAIN_LENGTH 16384 +/* Maximum compression overhead: defined by SSL/TLS standards */ +# define SSL3_RT_MAX_COMPRESSED_OVERHEAD 1024 + +/* + * The standards give a maximum encryption overhead of 1024 bytes. In + * practice the value is lower than this. The overhead is the maximum number + * of padding bytes (256) plus the mac size. + */ +# define SSL3_RT_MAX_ENCRYPTED_OVERHEAD (256 + SSL3_RT_MAX_MD_SIZE) +# define SSL3_RT_MAX_TLS13_ENCRYPTED_OVERHEAD 256 + +/* + * OpenSSL currently only uses a padding length of at most one block so the + * send overhead is smaller. + */ + +# define SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD \ + (SSL_RT_MAX_CIPHER_BLOCK_SIZE + SSL3_RT_MAX_MD_SIZE) + +/* If compression isn't used don't include the compression overhead */ + +# ifdef OPENSSL_NO_COMP +# define SSL3_RT_MAX_COMPRESSED_LENGTH SSL3_RT_MAX_PLAIN_LENGTH +# else +# define SSL3_RT_MAX_COMPRESSED_LENGTH \ + (SSL3_RT_MAX_PLAIN_LENGTH+SSL3_RT_MAX_COMPRESSED_OVERHEAD) +# endif +# define SSL3_RT_MAX_ENCRYPTED_LENGTH \ + (SSL3_RT_MAX_ENCRYPTED_OVERHEAD+SSL3_RT_MAX_COMPRESSED_LENGTH) +# define SSL3_RT_MAX_TLS13_ENCRYPTED_LENGTH \ + (SSL3_RT_MAX_PLAIN_LENGTH + SSL3_RT_MAX_TLS13_ENCRYPTED_OVERHEAD) +# define SSL3_RT_MAX_PACKET_SIZE \ + (SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH) + +# define SSL3_MD_CLIENT_FINISHED_CONST "\x43\x4C\x4E\x54" +# define SSL3_MD_SERVER_FINISHED_CONST "\x53\x52\x56\x52" + +/* SSL3_VERSION is defined in prov_ssl.h */ +# define SSL3_VERSION_MAJOR 0x03 +# define SSL3_VERSION_MINOR 0x00 + +# define SSL3_RT_CHANGE_CIPHER_SPEC 20 +# define SSL3_RT_ALERT 21 +# define SSL3_RT_HANDSHAKE 22 +# define SSL3_RT_APPLICATION_DATA 23 + +/* Pseudo content types to indicate additional parameters */ +# define TLS1_RT_CRYPTO 0x1000 +# define TLS1_RT_CRYPTO_PREMASTER (TLS1_RT_CRYPTO | 0x1) +# define TLS1_RT_CRYPTO_CLIENT_RANDOM (TLS1_RT_CRYPTO | 0x2) +# define TLS1_RT_CRYPTO_SERVER_RANDOM (TLS1_RT_CRYPTO | 0x3) +# define TLS1_RT_CRYPTO_MASTER (TLS1_RT_CRYPTO | 0x4) + +# define TLS1_RT_CRYPTO_READ 0x0000 +# define TLS1_RT_CRYPTO_WRITE 0x0100 +# define TLS1_RT_CRYPTO_MAC (TLS1_RT_CRYPTO | 0x5) +# define TLS1_RT_CRYPTO_KEY (TLS1_RT_CRYPTO | 0x6) +# define TLS1_RT_CRYPTO_IV (TLS1_RT_CRYPTO | 0x7) +# define TLS1_RT_CRYPTO_FIXED_IV (TLS1_RT_CRYPTO | 0x8) + +/* Pseudo content types for SSL/TLS header info */ +# define SSL3_RT_HEADER 0x100 +# define SSL3_RT_INNER_CONTENT_TYPE 0x101 + +# define SSL3_AL_WARNING 1 +# define SSL3_AL_FATAL 2 + +# define SSL3_AD_CLOSE_NOTIFY 0 +# define SSL3_AD_UNEXPECTED_MESSAGE 10/* fatal */ +# define SSL3_AD_BAD_RECORD_MAC 20/* fatal */ +# define SSL3_AD_DECOMPRESSION_FAILURE 30/* fatal */ +# define SSL3_AD_HANDSHAKE_FAILURE 40/* fatal */ +# define SSL3_AD_NO_CERTIFICATE 41 +# define SSL3_AD_BAD_CERTIFICATE 42 +# define SSL3_AD_UNSUPPORTED_CERTIFICATE 43 +# define SSL3_AD_CERTIFICATE_REVOKED 44 +# define SSL3_AD_CERTIFICATE_EXPIRED 45 +# define SSL3_AD_CERTIFICATE_UNKNOWN 46 +# define SSL3_AD_ILLEGAL_PARAMETER 47/* fatal */ + +# define TLS1_HB_REQUEST 1 +# define TLS1_HB_RESPONSE 2 + + +# define SSL3_CT_RSA_SIGN 1 +# define SSL3_CT_DSS_SIGN 2 +# define SSL3_CT_RSA_FIXED_DH 3 +# define SSL3_CT_DSS_FIXED_DH 4 +# define SSL3_CT_RSA_EPHEMERAL_DH 5 +# define SSL3_CT_DSS_EPHEMERAL_DH 6 +# define SSL3_CT_FORTEZZA_DMS 20 +/* + * SSL3_CT_NUMBER is used to size arrays and it must be large enough to + * contain all of the cert types defined for *either* SSLv3 and TLSv1. + */ +# define SSL3_CT_NUMBER 12 + +# if defined(TLS_CT_NUMBER) +# if TLS_CT_NUMBER != SSL3_CT_NUMBER +# error "SSL/TLS CT_NUMBER values do not match" +# endif +# endif + +/* No longer used as of OpenSSL 1.1.1 */ +# define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS 0x0001 + +/* Removed from OpenSSL 1.1.0 */ +# define TLS1_FLAGS_TLS_PADDING_BUG 0x0 + +# define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 + +/* Set if we encrypt then mac instead of usual mac then encrypt */ +# define TLS1_FLAGS_ENCRYPT_THEN_MAC_READ 0x0100 +# define TLS1_FLAGS_ENCRYPT_THEN_MAC TLS1_FLAGS_ENCRYPT_THEN_MAC_READ + +/* Set if extended master secret extension received from peer */ +# define TLS1_FLAGS_RECEIVED_EXTMS 0x0200 + +# define TLS1_FLAGS_ENCRYPT_THEN_MAC_WRITE 0x0400 + +# define TLS1_FLAGS_STATELESS 0x0800 + +/* Set if extended master secret extension required on renegotiation */ +# define TLS1_FLAGS_REQUIRED_EXTMS 0x1000 + +# define SSL3_MT_HELLO_REQUEST 0 +# define SSL3_MT_CLIENT_HELLO 1 +# define SSL3_MT_SERVER_HELLO 2 +# define SSL3_MT_NEWSESSION_TICKET 4 +# define SSL3_MT_END_OF_EARLY_DATA 5 +# define SSL3_MT_ENCRYPTED_EXTENSIONS 8 +# define SSL3_MT_CERTIFICATE 11 +# define SSL3_MT_SERVER_KEY_EXCHANGE 12 +# define SSL3_MT_CERTIFICATE_REQUEST 13 +# define SSL3_MT_SERVER_DONE 14 +# define SSL3_MT_CERTIFICATE_VERIFY 15 +# define SSL3_MT_CLIENT_KEY_EXCHANGE 16 +# define SSL3_MT_FINISHED 20 +# define SSL3_MT_CERTIFICATE_URL 21 +# define SSL3_MT_CERTIFICATE_STATUS 22 +# define SSL3_MT_SUPPLEMENTAL_DATA 23 +# define SSL3_MT_KEY_UPDATE 24 +# ifndef OPENSSL_NO_NEXTPROTONEG +# define SSL3_MT_NEXT_PROTO 67 +# endif +# define SSL3_MT_MESSAGE_HASH 254 +# define DTLS1_MT_HELLO_VERIFY_REQUEST 3 + +/* Dummy message type for handling CCS like a normal handshake message */ +# define SSL3_MT_CHANGE_CIPHER_SPEC 0x0101 + +# define SSL3_MT_CCS 1 + +/* These are used when changing over to a new cipher */ +# define SSL3_CC_READ 0x001 +# define SSL3_CC_WRITE 0x002 +# define SSL3_CC_CLIENT 0x010 +# define SSL3_CC_SERVER 0x020 +# define SSL3_CC_EARLY 0x040 +# define SSL3_CC_HANDSHAKE 0x080 +# define SSL3_CC_APPLICATION 0x100 +# define SSL3_CHANGE_CIPHER_CLIENT_WRITE (SSL3_CC_CLIENT|SSL3_CC_WRITE) +# define SSL3_CHANGE_CIPHER_SERVER_READ (SSL3_CC_SERVER|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_CLIENT_READ (SSL3_CC_CLIENT|SSL3_CC_READ) +# define SSL3_CHANGE_CIPHER_SERVER_WRITE (SSL3_CC_SERVER|SSL3_CC_WRITE) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/sslerr.h b/OtherInc/openssl/include/openssl/sslerr.h new file mode 100644 index 0000000..a4746d7 --- /dev/null +++ b/OtherInc/openssl/include/openssl/sslerr.h @@ -0,0 +1,343 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_SSLERR_H +# define OPENSSL_SSLERR_H +# pragma once + +# include +# include +# include + + + +/* + * SSL reason codes. + */ +# define SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 291 +# define SSL_R_APP_DATA_IN_HANDSHAKE 100 +# define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272 +# define SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE 158 +# define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 +# define SSL_R_BAD_CIPHER 186 +# define SSL_R_BAD_DATA 390 +# define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 106 +# define SSL_R_BAD_DECOMPRESSION 107 +# define SSL_R_BAD_DH_VALUE 102 +# define SSL_R_BAD_DIGEST_LENGTH 111 +# define SSL_R_BAD_EARLY_DATA 233 +# define SSL_R_BAD_ECC_CERT 304 +# define SSL_R_BAD_ECPOINT 306 +# define SSL_R_BAD_EXTENSION 110 +# define SSL_R_BAD_HANDSHAKE_LENGTH 332 +# define SSL_R_BAD_HANDSHAKE_STATE 236 +# define SSL_R_BAD_HELLO_REQUEST 105 +# define SSL_R_BAD_HRR_VERSION 263 +# define SSL_R_BAD_KEY_SHARE 108 +# define SSL_R_BAD_KEY_UPDATE 122 +# define SSL_R_BAD_LEGACY_VERSION 292 +# define SSL_R_BAD_LENGTH 271 +# define SSL_R_BAD_PACKET 240 +# define SSL_R_BAD_PACKET_LENGTH 115 +# define SSL_R_BAD_PROTOCOL_VERSION_NUMBER 116 +# define SSL_R_BAD_PSK 219 +# define SSL_R_BAD_PSK_IDENTITY 114 +# define SSL_R_BAD_RECORD_TYPE 443 +# define SSL_R_BAD_RSA_ENCRYPT 119 +# define SSL_R_BAD_SIGNATURE 123 +# define SSL_R_BAD_SRP_A_LENGTH 347 +# define SSL_R_BAD_SRP_PARAMETERS 371 +# define SSL_R_BAD_SRTP_MKI_VALUE 352 +# define SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST 353 +# define SSL_R_BAD_SSL_FILETYPE 124 +# define SSL_R_BAD_VALUE 384 +# define SSL_R_BAD_WRITE_RETRY 127 +# define SSL_R_BINDER_DOES_NOT_VERIFY 253 +# define SSL_R_BIO_NOT_SET 128 +# define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 129 +# define SSL_R_BN_LIB 130 +# define SSL_R_CALLBACK_FAILED 234 +# define SSL_R_CANNOT_CHANGE_CIPHER 109 +# define SSL_R_CANNOT_GET_GROUP_NAME 299 +# define SSL_R_CA_DN_LENGTH_MISMATCH 131 +# define SSL_R_CA_KEY_TOO_SMALL 397 +# define SSL_R_CA_MD_TOO_WEAK 398 +# define SSL_R_CCS_RECEIVED_EARLY 133 +# define SSL_R_CERTIFICATE_VERIFY_FAILED 134 +# define SSL_R_CERT_CB_ERROR 377 +# define SSL_R_CERT_LENGTH_MISMATCH 135 +# define SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED 218 +# define SSL_R_CIPHER_CODE_WRONG_LENGTH 137 +# define SSL_R_CLIENTHELLO_TLSEXT 226 +# define SSL_R_COMPRESSED_LENGTH_TOO_LONG 140 +# define SSL_R_COMPRESSION_DISABLED 343 +# define SSL_R_COMPRESSION_FAILURE 141 +# define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE 307 +# define SSL_R_COMPRESSION_LIBRARY_ERROR 142 +# define SSL_R_CONNECTION_TYPE_NOT_SET 144 +# define SSL_R_CONTEXT_NOT_DANE_ENABLED 167 +# define SSL_R_COOKIE_GEN_CALLBACK_FAILURE 400 +# define SSL_R_COOKIE_MISMATCH 308 +# define SSL_R_COPY_PARAMETERS_FAILED 296 +# define SSL_R_CUSTOM_EXT_HANDLER_ALREADY_INSTALLED 206 +# define SSL_R_DANE_ALREADY_ENABLED 172 +# define SSL_R_DANE_CANNOT_OVERRIDE_MTYPE_FULL 173 +# define SSL_R_DANE_NOT_ENABLED 175 +# define SSL_R_DANE_TLSA_BAD_CERTIFICATE 180 +# define SSL_R_DANE_TLSA_BAD_CERTIFICATE_USAGE 184 +# define SSL_R_DANE_TLSA_BAD_DATA_LENGTH 189 +# define SSL_R_DANE_TLSA_BAD_DIGEST_LENGTH 192 +# define SSL_R_DANE_TLSA_BAD_MATCHING_TYPE 200 +# define SSL_R_DANE_TLSA_BAD_PUBLIC_KEY 201 +# define SSL_R_DANE_TLSA_BAD_SELECTOR 202 +# define SSL_R_DANE_TLSA_NULL_DATA 203 +# define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED 145 +# define SSL_R_DATA_LENGTH_TOO_LONG 146 +# define SSL_R_DECRYPTION_FAILED 147 +# define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 +# define SSL_R_DH_KEY_TOO_SMALL 394 +# define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 +# define SSL_R_DIGEST_CHECK_FAILED 149 +# define SSL_R_DTLS_MESSAGE_TOO_BIG 334 +# define SSL_R_DUPLICATE_COMPRESSION_ID 309 +# define SSL_R_ECC_CERT_NOT_FOR_SIGNING 318 +# define SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE 374 +# define SSL_R_EE_KEY_TOO_SMALL 399 +# define SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST 354 +# define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 150 +# define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 151 +# define SSL_R_ERROR_SETTING_TLSA_BASE_DOMAIN 204 +# define SSL_R_EXCEEDS_MAX_FRAGMENT_SIZE 194 +# define SSL_R_EXCESSIVE_MESSAGE_SIZE 152 +# define SSL_R_EXTENSION_NOT_RECEIVED 279 +# define SSL_R_EXTRA_DATA_IN_MESSAGE 153 +# define SSL_R_EXT_LENGTH_MISMATCH 163 +# define SSL_R_FAILED_TO_INIT_ASYNC 405 +# define SSL_R_FRAGMENTED_CLIENT_HELLO 401 +# define SSL_R_GOT_A_FIN_BEFORE_A_CCS 154 +# define SSL_R_HTTPS_PROXY_REQUEST 155 +# define SSL_R_HTTP_REQUEST 156 +# define SSL_R_ILLEGAL_POINT_COMPRESSION 162 +# define SSL_R_ILLEGAL_SUITEB_DIGEST 380 +# define SSL_R_INAPPROPRIATE_FALLBACK 373 +# define SSL_R_INCONSISTENT_COMPRESSION 340 +# define SSL_R_INCONSISTENT_EARLY_DATA_ALPN 222 +# define SSL_R_INCONSISTENT_EARLY_DATA_SNI 231 +# define SSL_R_INCONSISTENT_EXTMS 104 +# define SSL_R_INSUFFICIENT_SECURITY 241 +# define SSL_R_INVALID_ALERT 205 +# define SSL_R_INVALID_CCS_MESSAGE 260 +# define SSL_R_INVALID_CERTIFICATE_OR_ALG 238 +# define SSL_R_INVALID_COMMAND 280 +# define SSL_R_INVALID_COMPRESSION_ALGORITHM 341 +# define SSL_R_INVALID_CONFIG 283 +# define SSL_R_INVALID_CONFIGURATION_NAME 113 +# define SSL_R_INVALID_CONTEXT 282 +# define SSL_R_INVALID_CT_VALIDATION_TYPE 212 +# define SSL_R_INVALID_KEY_UPDATE_TYPE 120 +# define SSL_R_INVALID_MAX_EARLY_DATA 174 +# define SSL_R_INVALID_NULL_CMD_NAME 385 +# define SSL_R_INVALID_SEQUENCE_NUMBER 402 +# define SSL_R_INVALID_SERVERINFO_DATA 388 +# define SSL_R_INVALID_SESSION_ID 999 +# define SSL_R_INVALID_SRP_USERNAME 357 +# define SSL_R_INVALID_STATUS_RESPONSE 328 +# define SSL_R_INVALID_TICKET_KEYS_LENGTH 325 +# define SSL_R_LENGTH_MISMATCH 159 +# define SSL_R_LENGTH_TOO_LONG 404 +# define SSL_R_LENGTH_TOO_SHORT 160 +# define SSL_R_LIBRARY_BUG 274 +# define SSL_R_LIBRARY_HAS_NO_CIPHERS 161 +# define SSL_R_MISSING_DSA_SIGNING_CERT 165 +# define SSL_R_MISSING_ECDSA_SIGNING_CERT 381 +# define SSL_R_MISSING_FATAL 256 +# define SSL_R_MISSING_PARAMETERS 290 +# define SSL_R_MISSING_PSK_KEX_MODES_EXTENSION 310 +# define SSL_R_MISSING_RSA_CERTIFICATE 168 +# define SSL_R_MISSING_RSA_ENCRYPTING_CERT 169 +# define SSL_R_MISSING_RSA_SIGNING_CERT 170 +# define SSL_R_MISSING_SIGALGS_EXTENSION 112 +# define SSL_R_MISSING_SIGNING_CERT 221 +# define SSL_R_MISSING_SRP_PARAM 358 +# define SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION 209 +# define SSL_R_MISSING_TMP_DH_KEY 171 +# define SSL_R_MISSING_TMP_ECDH_KEY 311 +# define SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA 293 +# define SSL_R_NOT_ON_RECORD_BOUNDARY 182 +# define SSL_R_NOT_REPLACING_CERTIFICATE 289 +# define SSL_R_NOT_SERVER 284 +# define SSL_R_NO_APPLICATION_PROTOCOL 235 +# define SSL_R_NO_CERTIFICATES_RETURNED 176 +# define SSL_R_NO_CERTIFICATE_ASSIGNED 177 +# define SSL_R_NO_CERTIFICATE_SET 179 +# define SSL_R_NO_CHANGE_FOLLOWING_HRR 214 +# define SSL_R_NO_CIPHERS_AVAILABLE 181 +# define SSL_R_NO_CIPHERS_SPECIFIED 183 +# define SSL_R_NO_CIPHER_MATCH 185 +# define SSL_R_NO_CLIENT_CERT_METHOD 331 +# define SSL_R_NO_COMPRESSION_SPECIFIED 187 +# define SSL_R_NO_COOKIE_CALLBACK_SET 287 +# define SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER 330 +# define SSL_R_NO_METHOD_SPECIFIED 188 +# define SSL_R_NO_PEM_EXTENSIONS 389 +# define SSL_R_NO_PRIVATE_KEY_ASSIGNED 190 +# define SSL_R_NO_PROTOCOLS_AVAILABLE 191 +# define SSL_R_NO_RENEGOTIATION 339 +# define SSL_R_NO_REQUIRED_DIGEST 324 +# define SSL_R_NO_SHARED_CIPHER 193 +# define SSL_R_NO_SHARED_GROUPS 410 +# define SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS 376 +# define SSL_R_NO_SRTP_PROFILES 359 +# define SSL_R_NO_SUITABLE_DIGEST_ALGORITHM 297 +# define SSL_R_NO_SUITABLE_GROUPS 295 +# define SSL_R_NO_SUITABLE_KEY_SHARE 101 +# define SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM 118 +# define SSL_R_NO_VALID_SCTS 216 +# define SSL_R_NO_VERIFY_COOKIE_CALLBACK 403 +# define SSL_R_NULL_SSL_CTX 195 +# define SSL_R_NULL_SSL_METHOD_PASSED 196 +# define SSL_R_OCSP_CALLBACK_FAILURE 305 +# define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 197 +# define SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED 344 +# define SSL_R_OVERFLOW_ERROR 237 +# define SSL_R_PACKET_LENGTH_TOO_LONG 198 +# define SSL_R_PARSE_TLSEXT 227 +# define SSL_R_PATH_TOO_LONG 270 +# define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 199 +# define SSL_R_PEM_NAME_BAD_PREFIX 391 +# define SSL_R_PEM_NAME_TOO_SHORT 392 +# define SSL_R_PIPELINE_FAILURE 406 +# define SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR 278 +# define SSL_R_PRIVATE_KEY_MISMATCH 288 +# define SSL_R_PROTOCOL_IS_SHUTDOWN 207 +# define SSL_R_PSK_IDENTITY_NOT_FOUND 223 +# define SSL_R_PSK_NO_CLIENT_CB 224 +# define SSL_R_PSK_NO_SERVER_CB 225 +# define SSL_R_READ_BIO_NOT_SET 211 +# define SSL_R_READ_TIMEOUT_EXPIRED 312 +# define SSL_R_RECORD_LENGTH_MISMATCH 213 +# define SSL_R_RECORD_TOO_SMALL 298 +# define SSL_R_RENEGOTIATE_EXT_TOO_LONG 335 +# define SSL_R_RENEGOTIATION_ENCODING_ERR 336 +# define SSL_R_RENEGOTIATION_MISMATCH 337 +# define SSL_R_REQUEST_PENDING 285 +# define SSL_R_REQUEST_SENT 286 +# define SSL_R_REQUIRED_CIPHER_MISSING 215 +# define SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING 342 +# define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 345 +# define SSL_R_SCT_VERIFICATION_FAILED 208 +# define SSL_R_SERVERHELLO_TLSEXT 275 +# define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 277 +# define SSL_R_SHUTDOWN_WHILE_IN_INIT 407 +# define SSL_R_SIGNATURE_ALGORITHMS_ERROR 360 +# define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE 220 +# define SSL_R_SRP_A_CALC 361 +# define SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES 362 +# define SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG 363 +# define SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE 364 +# define SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH 232 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME 319 +# define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE 320 +# define SSL_R_SSL3_SESSION_ID_TOO_LONG 300 +# define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 +# define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044 +# define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 +# define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 +# define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 +# define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 +# define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 +# define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 +# define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 +# define SSL_R_SSL_COMMAND_SECTION_EMPTY 117 +# define SSL_R_SSL_COMMAND_SECTION_NOT_FOUND 125 +# define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 228 +# define SSL_R_SSL_HANDSHAKE_FAILURE 229 +# define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS 230 +# define SSL_R_SSL_NEGATIVE_LENGTH 372 +# define SSL_R_SSL_SECTION_EMPTY 126 +# define SSL_R_SSL_SECTION_NOT_FOUND 136 +# define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED 301 +# define SSL_R_SSL_SESSION_ID_CONFLICT 302 +# define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 273 +# define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH 303 +# define SSL_R_SSL_SESSION_ID_TOO_LONG 408 +# define SSL_R_SSL_SESSION_VERSION_MISMATCH 210 +# define SSL_R_STILL_IN_INIT 121 +# define SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED 1116 +# define SSL_R_TLSV13_ALERT_MISSING_EXTENSION 1109 +# define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 +# define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 +# define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 +# define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 +# define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 +# define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 +# define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 +# define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 +# define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 +# define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 +# define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 +# define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 +# define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 +# define SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE 1114 +# define SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE 1113 +# define SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE 1111 +# define SSL_R_TLSV1_UNRECOGNIZED_NAME 1112 +# define SSL_R_TLSV1_UNSUPPORTED_EXTENSION 1110 +# define SSL_R_TLS_ILLEGAL_EXPORTER_LABEL 367 +# define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST 157 +# define SSL_R_TOO_MANY_KEY_UPDATES 132 +# define SSL_R_TOO_MANY_WARN_ALERTS 409 +# define SSL_R_TOO_MUCH_EARLY_DATA 164 +# define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 314 +# define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS 239 +# define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES 242 +# define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES 243 +# define SSL_R_UNEXPECTED_CCS_MESSAGE 262 +# define SSL_R_UNEXPECTED_END_OF_EARLY_DATA 178 +# define SSL_R_UNEXPECTED_EOF_WHILE_READING 294 +# define SSL_R_UNEXPECTED_MESSAGE 244 +# define SSL_R_UNEXPECTED_RECORD 245 +# define SSL_R_UNINITIALIZED 276 +# define SSL_R_UNKNOWN_ALERT_TYPE 246 +# define SSL_R_UNKNOWN_CERTIFICATE_TYPE 247 +# define SSL_R_UNKNOWN_CIPHER_RETURNED 248 +# define SSL_R_UNKNOWN_CIPHER_TYPE 249 +# define SSL_R_UNKNOWN_CMD_NAME 386 +# define SSL_R_UNKNOWN_COMMAND 139 +# define SSL_R_UNKNOWN_DIGEST 368 +# define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 250 +# define SSL_R_UNKNOWN_PKEY_TYPE 251 +# define SSL_R_UNKNOWN_PROTOCOL 252 +# define SSL_R_UNKNOWN_SSL_VERSION 254 +# define SSL_R_UNKNOWN_STATE 255 +# define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 338 +# define SSL_R_UNSOLICITED_EXTENSION 217 +# define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 257 +# define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 315 +# define SSL_R_UNSUPPORTED_PROTOCOL 258 +# define SSL_R_UNSUPPORTED_SSL_VERSION 259 +# define SSL_R_UNSUPPORTED_STATUS_TYPE 329 +# define SSL_R_USE_SRTP_NOT_NEGOTIATED 369 +# define SSL_R_VERSION_TOO_HIGH 166 +# define SSL_R_VERSION_TOO_LOW 396 +# define SSL_R_WRONG_CERTIFICATE_TYPE 383 +# define SSL_R_WRONG_CIPHER_RETURNED 261 +# define SSL_R_WRONG_CURVE 378 +# define SSL_R_WRONG_SIGNATURE_LENGTH 264 +# define SSL_R_WRONG_SIGNATURE_SIZE 265 +# define SSL_R_WRONG_SIGNATURE_TYPE 370 +# define SSL_R_WRONG_SSL_VERSION 266 +# define SSL_R_WRONG_VERSION_NUMBER 267 +# define SSL_R_X509_LIB 268 +# define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 269 + +#endif diff --git a/OtherInc/openssl/include/openssl/sslerr_legacy.h b/OtherInc/openssl/include/openssl/sslerr_legacy.h new file mode 100644 index 0000000..ccf6d3b --- /dev/null +++ b/OtherInc/openssl/include/openssl/sslerr_legacy.h @@ -0,0 +1,468 @@ +/* + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * This header file preserves symbols from pre-3.0 OpenSSL. + * It should never be included directly, as it's already included + * by the public sslerr.h headers, and since it will go away some + * time in the future. + */ + +#ifndef OPENSSL_SSLERR_LEGACY_H +# define OPENSSL_SSLERR_LEGACY_H +# pragma once + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int ERR_load_SSL_strings(void); + +/* Collected _F_ macros from OpenSSL 1.1.1 */ + +/* + * SSL function codes. + */ +# define SSL_F_ADD_CLIENT_KEY_SHARE_EXT 0 +# define SSL_F_ADD_KEY_SHARE 0 +# define SSL_F_BYTES_TO_CIPHER_LIST 0 +# define SSL_F_CHECK_SUITEB_CIPHER_LIST 0 +# define SSL_F_CIPHERSUITE_CB 0 +# define SSL_F_CONSTRUCT_CA_NAMES 0 +# define SSL_F_CONSTRUCT_KEY_EXCHANGE_TBS 0 +# define SSL_F_CONSTRUCT_STATEFUL_TICKET 0 +# define SSL_F_CONSTRUCT_STATELESS_TICKET 0 +# define SSL_F_CREATE_SYNTHETIC_MESSAGE_HASH 0 +# define SSL_F_CREATE_TICKET_PREQUEL 0 +# define SSL_F_CT_MOVE_SCTS 0 +# define SSL_F_CT_STRICT 0 +# define SSL_F_CUSTOM_EXT_ADD 0 +# define SSL_F_CUSTOM_EXT_PARSE 0 +# define SSL_F_D2I_SSL_SESSION 0 +# define SSL_F_DANE_CTX_ENABLE 0 +# define SSL_F_DANE_MTYPE_SET 0 +# define SSL_F_DANE_TLSA_ADD 0 +# define SSL_F_DERIVE_SECRET_KEY_AND_IV 0 +# define SSL_F_DO_DTLS1_WRITE 0 +# define SSL_F_DO_SSL3_WRITE 0 +# define SSL_F_DTLS1_BUFFER_RECORD 0 +# define SSL_F_DTLS1_CHECK_TIMEOUT_NUM 0 +# define SSL_F_DTLS1_HEARTBEAT 0 +# define SSL_F_DTLS1_HM_FRAGMENT_NEW 0 +# define SSL_F_DTLS1_PREPROCESS_FRAGMENT 0 +# define SSL_F_DTLS1_PROCESS_BUFFERED_RECORDS 0 +# define SSL_F_DTLS1_PROCESS_RECORD 0 +# define SSL_F_DTLS1_READ_BYTES 0 +# define SSL_F_DTLS1_READ_FAILED 0 +# define SSL_F_DTLS1_RETRANSMIT_MESSAGE 0 +# define SSL_F_DTLS1_WRITE_APP_DATA_BYTES 0 +# define SSL_F_DTLS1_WRITE_BYTES 0 +# define SSL_F_DTLSV1_LISTEN 0 +# define SSL_F_DTLS_CONSTRUCT_CHANGE_CIPHER_SPEC 0 +# define SSL_F_DTLS_CONSTRUCT_HELLO_VERIFY_REQUEST 0 +# define SSL_F_DTLS_GET_REASSEMBLED_MESSAGE 0 +# define SSL_F_DTLS_PROCESS_HELLO_VERIFY 0 +# define SSL_F_DTLS_RECORD_LAYER_NEW 0 +# define SSL_F_DTLS_WAIT_FOR_DRY 0 +# define SSL_F_EARLY_DATA_COUNT_OK 0 +# define SSL_F_FINAL_EARLY_DATA 0 +# define SSL_F_FINAL_EC_PT_FORMATS 0 +# define SSL_F_FINAL_EMS 0 +# define SSL_F_FINAL_KEY_SHARE 0 +# define SSL_F_FINAL_MAXFRAGMENTLEN 0 +# define SSL_F_FINAL_RENEGOTIATE 0 +# define SSL_F_FINAL_SERVER_NAME 0 +# define SSL_F_FINAL_SIG_ALGS 0 +# define SSL_F_GET_CERT_VERIFY_TBS_DATA 0 +# define SSL_F_NSS_KEYLOG_INT 0 +# define SSL_F_OPENSSL_INIT_SSL 0 +# define SSL_F_OSSL_STATEM_CLIENT13_READ_TRANSITION 0 +# define SSL_F_OSSL_STATEM_CLIENT13_WRITE_TRANSITION 0 +# define SSL_F_OSSL_STATEM_CLIENT_CONSTRUCT_MESSAGE 0 +# define SSL_F_OSSL_STATEM_CLIENT_POST_PROCESS_MESSAGE 0 +# define SSL_F_OSSL_STATEM_CLIENT_PROCESS_MESSAGE 0 +# define SSL_F_OSSL_STATEM_CLIENT_READ_TRANSITION 0 +# define SSL_F_OSSL_STATEM_CLIENT_WRITE_TRANSITION 0 +# define SSL_F_OSSL_STATEM_SERVER13_READ_TRANSITION 0 +# define SSL_F_OSSL_STATEM_SERVER13_WRITE_TRANSITION 0 +# define SSL_F_OSSL_STATEM_SERVER_CONSTRUCT_MESSAGE 0 +# define SSL_F_OSSL_STATEM_SERVER_POST_PROCESS_MESSAGE 0 +# define SSL_F_OSSL_STATEM_SERVER_POST_WORK 0 +# define SSL_F_OSSL_STATEM_SERVER_PRE_WORK 0 +# define SSL_F_OSSL_STATEM_SERVER_PROCESS_MESSAGE 0 +# define SSL_F_OSSL_STATEM_SERVER_READ_TRANSITION 0 +# define SSL_F_OSSL_STATEM_SERVER_WRITE_TRANSITION 0 +# define SSL_F_PARSE_CA_NAMES 0 +# define SSL_F_PITEM_NEW 0 +# define SSL_F_PQUEUE_NEW 0 +# define SSL_F_PROCESS_KEY_SHARE_EXT 0 +# define SSL_F_READ_STATE_MACHINE 0 +# define SSL_F_SET_CLIENT_CIPHERSUITE 0 +# define SSL_F_SRP_GENERATE_CLIENT_MASTER_SECRET 0 +# define SSL_F_SRP_GENERATE_SERVER_MASTER_SECRET 0 +# define SSL_F_SRP_VERIFY_SERVER_PARAM 0 +# define SSL_F_SSL3_CHANGE_CIPHER_STATE 0 +# define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM 0 +# define SSL_F_SSL3_CTRL 0 +# define SSL_F_SSL3_CTX_CTRL 0 +# define SSL_F_SSL3_DIGEST_CACHED_RECORDS 0 +# define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC 0 +# define SSL_F_SSL3_ENC 0 +# define SSL_F_SSL3_FINAL_FINISH_MAC 0 +# define SSL_F_SSL3_FINISH_MAC 0 +# define SSL_F_SSL3_GENERATE_KEY_BLOCK 0 +# define SSL_F_SSL3_GENERATE_MASTER_SECRET 0 +# define SSL_F_SSL3_GET_RECORD 0 +# define SSL_F_SSL3_INIT_FINISHED_MAC 0 +# define SSL_F_SSL3_OUTPUT_CERT_CHAIN 0 +# define SSL_F_SSL3_READ_BYTES 0 +# define SSL_F_SSL3_READ_N 0 +# define SSL_F_SSL3_SETUP_KEY_BLOCK 0 +# define SSL_F_SSL3_SETUP_READ_BUFFER 0 +# define SSL_F_SSL3_SETUP_WRITE_BUFFER 0 +# define SSL_F_SSL3_WRITE_BYTES 0 +# define SSL_F_SSL3_WRITE_PENDING 0 +# define SSL_F_SSL_ADD_CERT_CHAIN 0 +# define SSL_F_SSL_ADD_CERT_TO_BUF 0 +# define SSL_F_SSL_ADD_CERT_TO_WPACKET 0 +# define SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT 0 +# define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT 0 +# define SSL_F_SSL_ADD_CLIENTHELLO_USE_SRTP_EXT 0 +# define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK 0 +# define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK 0 +# define SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT 0 +# define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT 0 +# define SSL_F_SSL_ADD_SERVERHELLO_USE_SRTP_EXT 0 +# define SSL_F_SSL_BAD_METHOD 0 +# define SSL_F_SSL_BUILD_CERT_CHAIN 0 +# define SSL_F_SSL_BYTES_TO_CIPHER_LIST 0 +# define SSL_F_SSL_CACHE_CIPHERLIST 0 +# define SSL_F_SSL_CERT_ADD0_CHAIN_CERT 0 +# define SSL_F_SSL_CERT_DUP 0 +# define SSL_F_SSL_CERT_NEW 0 +# define SSL_F_SSL_CERT_SET0_CHAIN 0 +# define SSL_F_SSL_CHECK_PRIVATE_KEY 0 +# define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT 0 +# define SSL_F_SSL_CHECK_SRP_EXT_CLIENTHELLO 0 +# define SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG 0 +# define SSL_F_SSL_CHOOSE_CLIENT_VERSION 0 +# define SSL_F_SSL_CIPHER_DESCRIPTION 0 +# define SSL_F_SSL_CIPHER_LIST_TO_BYTES 0 +# define SSL_F_SSL_CIPHER_PROCESS_RULESTR 0 +# define SSL_F_SSL_CIPHER_STRENGTH_SORT 0 +# define SSL_F_SSL_CLEAR 0 +# define SSL_F_SSL_CLIENT_HELLO_GET1_EXTENSIONS_PRESENT 0 +# define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD 0 +# define SSL_F_SSL_CONF_CMD 0 +# define SSL_F_SSL_CREATE_CIPHER_LIST 0 +# define SSL_F_SSL_CTRL 0 +# define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY 0 +# define SSL_F_SSL_CTX_ENABLE_CT 0 +# define SSL_F_SSL_CTX_MAKE_PROFILES 0 +# define SSL_F_SSL_CTX_NEW 0 +# define SSL_F_SSL_CTX_SET_ALPN_PROTOS 0 +# define SSL_F_SSL_CTX_SET_CIPHER_LIST 0 +# define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE 0 +# define SSL_F_SSL_CTX_SET_CT_VALIDATION_CALLBACK 0 +# define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT 0 +# define SSL_F_SSL_CTX_SET_SSL_VERSION 0 +# define SSL_F_SSL_CTX_SET_TLSEXT_MAX_FRAGMENT_LENGTH 0 +# define SSL_F_SSL_CTX_USE_CERTIFICATE 0 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1 0 +# define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE 0 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY 0 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1 0 +# define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE 0 +# define SSL_F_SSL_CTX_USE_PSK_IDENTITY_HINT 0 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY 0 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1 0 +# define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE 0 +# define SSL_F_SSL_CTX_USE_SERVERINFO 0 +# define SSL_F_SSL_CTX_USE_SERVERINFO_EX 0 +# define SSL_F_SSL_CTX_USE_SERVERINFO_FILE 0 +# define SSL_F_SSL_DANE_DUP 0 +# define SSL_F_SSL_DANE_ENABLE 0 +# define SSL_F_SSL_DERIVE 0 +# define SSL_F_SSL_DO_CONFIG 0 +# define SSL_F_SSL_DO_HANDSHAKE 0 +# define SSL_F_SSL_DUP_CA_LIST 0 +# define SSL_F_SSL_ENABLE_CT 0 +# define SSL_F_SSL_GENERATE_PKEY_GROUP 0 +# define SSL_F_SSL_GENERATE_SESSION_ID 0 +# define SSL_F_SSL_GET_NEW_SESSION 0 +# define SSL_F_SSL_GET_PREV_SESSION 0 +# define SSL_F_SSL_GET_SERVER_CERT_INDEX 0 +# define SSL_F_SSL_GET_SIGN_PKEY 0 +# define SSL_F_SSL_HANDSHAKE_HASH 0 +# define SSL_F_SSL_INIT_WBIO_BUFFER 0 +# define SSL_F_SSL_KEY_UPDATE 0 +# define SSL_F_SSL_LOAD_CLIENT_CA_FILE 0 +# define SSL_F_SSL_LOG_MASTER_SECRET 0 +# define SSL_F_SSL_LOG_RSA_CLIENT_KEY_EXCHANGE 0 +# define SSL_F_SSL_MODULE_INIT 0 +# define SSL_F_SSL_NEW 0 +# define SSL_F_SSL_NEXT_PROTO_VALIDATE 0 +# define SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT 0 +# define SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT 0 +# define SSL_F_SSL_PARSE_CLIENTHELLO_USE_SRTP_EXT 0 +# define SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT 0 +# define SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT 0 +# define SSL_F_SSL_PARSE_SERVERHELLO_USE_SRTP_EXT 0 +# define SSL_F_SSL_PEEK 0 +# define SSL_F_SSL_PEEK_EX 0 +# define SSL_F_SSL_PEEK_INTERNAL 0 +# define SSL_F_SSL_READ 0 +# define SSL_F_SSL_READ_EARLY_DATA 0 +# define SSL_F_SSL_READ_EX 0 +# define SSL_F_SSL_READ_INTERNAL 0 +# define SSL_F_SSL_RENEGOTIATE 0 +# define SSL_F_SSL_RENEGOTIATE_ABBREVIATED 0 +# define SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT 0 +# define SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT 0 +# define SSL_F_SSL_SESSION_DUP 0 +# define SSL_F_SSL_SESSION_NEW 0 +# define SSL_F_SSL_SESSION_PRINT_FP 0 +# define SSL_F_SSL_SESSION_SET1_ID 0 +# define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 0 +# define SSL_F_SSL_SET_ALPN_PROTOS 0 +# define SSL_F_SSL_SET_CERT 0 +# define SSL_F_SSL_SET_CERT_AND_KEY 0 +# define SSL_F_SSL_SET_CIPHER_LIST 0 +# define SSL_F_SSL_SET_CT_VALIDATION_CALLBACK 0 +# define SSL_F_SSL_SET_FD 0 +# define SSL_F_SSL_SET_PKEY 0 +# define SSL_F_SSL_SET_RFD 0 +# define SSL_F_SSL_SET_SESSION 0 +# define SSL_F_SSL_SET_SESSION_ID_CONTEXT 0 +# define SSL_F_SSL_SET_SESSION_TICKET_EXT 0 +# define SSL_F_SSL_SET_TLSEXT_MAX_FRAGMENT_LENGTH 0 +# define SSL_F_SSL_SET_WFD 0 +# define SSL_F_SSL_SHUTDOWN 0 +# define SSL_F_SSL_SRP_CTX_INIT 0 +# define SSL_F_SSL_START_ASYNC_JOB 0 +# define SSL_F_SSL_UNDEFINED_FUNCTION 0 +# define SSL_F_SSL_UNDEFINED_VOID_FUNCTION 0 +# define SSL_F_SSL_USE_CERTIFICATE 0 +# define SSL_F_SSL_USE_CERTIFICATE_ASN1 0 +# define SSL_F_SSL_USE_CERTIFICATE_FILE 0 +# define SSL_F_SSL_USE_PRIVATEKEY 0 +# define SSL_F_SSL_USE_PRIVATEKEY_ASN1 0 +# define SSL_F_SSL_USE_PRIVATEKEY_FILE 0 +# define SSL_F_SSL_USE_PSK_IDENTITY_HINT 0 +# define SSL_F_SSL_USE_RSAPRIVATEKEY 0 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1 0 +# define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE 0 +# define SSL_F_SSL_VALIDATE_CT 0 +# define SSL_F_SSL_VERIFY_CERT_CHAIN 0 +# define SSL_F_SSL_VERIFY_CLIENT_POST_HANDSHAKE 0 +# define SSL_F_SSL_WRITE 0 +# define SSL_F_SSL_WRITE_EARLY_DATA 0 +# define SSL_F_SSL_WRITE_EARLY_FINISH 0 +# define SSL_F_SSL_WRITE_EX 0 +# define SSL_F_SSL_WRITE_INTERNAL 0 +# define SSL_F_STATE_MACHINE 0 +# define SSL_F_TLS12_CHECK_PEER_SIGALG 0 +# define SSL_F_TLS12_COPY_SIGALGS 0 +# define SSL_F_TLS13_CHANGE_CIPHER_STATE 0 +# define SSL_F_TLS13_ENC 0 +# define SSL_F_TLS13_FINAL_FINISH_MAC 0 +# define SSL_F_TLS13_GENERATE_SECRET 0 +# define SSL_F_TLS13_HKDF_EXPAND 0 +# define SSL_F_TLS13_RESTORE_HANDSHAKE_DIGEST_FOR_PHA 0 +# define SSL_F_TLS13_SAVE_HANDSHAKE_DIGEST_FOR_PHA 0 +# define SSL_F_TLS13_SETUP_KEY_BLOCK 0 +# define SSL_F_TLS1_CHANGE_CIPHER_STATE 0 +# define SSL_F_TLS1_CHECK_DUPLICATE_EXTENSIONS 0 +# define SSL_F_TLS1_ENC 0 +# define SSL_F_TLS1_EXPORT_KEYING_MATERIAL 0 +# define SSL_F_TLS1_GET_CURVELIST 0 +# define SSL_F_TLS1_PRF 0 +# define SSL_F_TLS1_SAVE_U16 0 +# define SSL_F_TLS1_SETUP_KEY_BLOCK 0 +# define SSL_F_TLS1_SET_GROUPS 0 +# define SSL_F_TLS1_SET_RAW_SIGALGS 0 +# define SSL_F_TLS1_SET_SERVER_SIGALGS 0 +# define SSL_F_TLS1_SET_SHARED_SIGALGS 0 +# define SSL_F_TLS1_SET_SIGALGS 0 +# define SSL_F_TLS_CHOOSE_SIGALG 0 +# define SSL_F_TLS_CLIENT_KEY_EXCHANGE_POST_WORK 0 +# define SSL_F_TLS_COLLECT_EXTENSIONS 0 +# define SSL_F_TLS_CONSTRUCT_CERTIFICATE_AUTHORITIES 0 +# define SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST 0 +# define SSL_F_TLS_CONSTRUCT_CERT_STATUS 0 +# define SSL_F_TLS_CONSTRUCT_CERT_STATUS_BODY 0 +# define SSL_F_TLS_CONSTRUCT_CERT_VERIFY 0 +# define SSL_F_TLS_CONSTRUCT_CHANGE_CIPHER_SPEC 0 +# define SSL_F_TLS_CONSTRUCT_CKE_DHE 0 +# define SSL_F_TLS_CONSTRUCT_CKE_ECDHE 0 +# define SSL_F_TLS_CONSTRUCT_CKE_GOST 0 +# define SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE 0 +# define SSL_F_TLS_CONSTRUCT_CKE_RSA 0 +# define SSL_F_TLS_CONSTRUCT_CKE_SRP 0 +# define SSL_F_TLS_CONSTRUCT_CLIENT_CERTIFICATE 0 +# define SSL_F_TLS_CONSTRUCT_CLIENT_HELLO 0 +# define SSL_F_TLS_CONSTRUCT_CLIENT_KEY_EXCHANGE 0 +# define SSL_F_TLS_CONSTRUCT_CLIENT_VERIFY 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_ALPN 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_CERTIFICATE 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_COOKIE 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_EC_PT_FORMATS 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_EMS 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_ETM 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_HELLO 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_KEY_EXCHANGE 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_MAXFRAGMENTLEN 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_NPN 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_PADDING 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_POST_HANDSHAKE_AUTH 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_PSK 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_SCT 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_SERVER_NAME 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_SESSION_TICKET 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_SIG_ALGS 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_SRP 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP 0 +# define SSL_F_TLS_CONSTRUCT_CTOS_VERIFY 0 +# define SSL_F_TLS_CONSTRUCT_ENCRYPTED_EXTENSIONS 0 +# define SSL_F_TLS_CONSTRUCT_END_OF_EARLY_DATA 0 +# define SSL_F_TLS_CONSTRUCT_EXTENSIONS 0 +# define SSL_F_TLS_CONSTRUCT_FINISHED 0 +# define SSL_F_TLS_CONSTRUCT_HELLO_REQUEST 0 +# define SSL_F_TLS_CONSTRUCT_HELLO_RETRY_REQUEST 0 +# define SSL_F_TLS_CONSTRUCT_KEY_UPDATE 0 +# define SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET 0 +# define SSL_F_TLS_CONSTRUCT_NEXT_PROTO 0 +# define SSL_F_TLS_CONSTRUCT_SERVER_CERTIFICATE 0 +# define SSL_F_TLS_CONSTRUCT_SERVER_HELLO 0 +# define SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE 0 +# define SSL_F_TLS_CONSTRUCT_STOC_ALPN 0 +# define SSL_F_TLS_CONSTRUCT_STOC_CERTIFICATE 0 +# define SSL_F_TLS_CONSTRUCT_STOC_COOKIE 0 +# define SSL_F_TLS_CONSTRUCT_STOC_CRYPTOPRO_BUG 0 +# define SSL_F_TLS_CONSTRUCT_STOC_DONE 0 +# define SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA 0 +# define SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA_INFO 0 +# define SSL_F_TLS_CONSTRUCT_STOC_EC_PT_FORMATS 0 +# define SSL_F_TLS_CONSTRUCT_STOC_EMS 0 +# define SSL_F_TLS_CONSTRUCT_STOC_ETM 0 +# define SSL_F_TLS_CONSTRUCT_STOC_HELLO 0 +# define SSL_F_TLS_CONSTRUCT_STOC_KEY_EXCHANGE 0 +# define SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE 0 +# define SSL_F_TLS_CONSTRUCT_STOC_MAXFRAGMENTLEN 0 +# define SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG 0 +# define SSL_F_TLS_CONSTRUCT_STOC_PSK 0 +# define SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE 0 +# define SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME 0 +# define SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET 0 +# define SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST 0 +# define SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS 0 +# define SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_VERSIONS 0 +# define SSL_F_TLS_CONSTRUCT_STOC_USE_SRTP 0 +# define SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO 0 +# define SSL_F_TLS_FINISH_HANDSHAKE 0 +# define SSL_F_TLS_GET_MESSAGE_BODY 0 +# define SSL_F_TLS_GET_MESSAGE_HEADER 0 +# define SSL_F_TLS_HANDLE_ALPN 0 +# define SSL_F_TLS_HANDLE_STATUS_REQUEST 0 +# define SSL_F_TLS_PARSE_CERTIFICATE_AUTHORITIES 0 +# define SSL_F_TLS_PARSE_CLIENTHELLO_TLSEXT 0 +# define SSL_F_TLS_PARSE_CTOS_ALPN 0 +# define SSL_F_TLS_PARSE_CTOS_COOKIE 0 +# define SSL_F_TLS_PARSE_CTOS_EARLY_DATA 0 +# define SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS 0 +# define SSL_F_TLS_PARSE_CTOS_EMS 0 +# define SSL_F_TLS_PARSE_CTOS_KEY_SHARE 0 +# define SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN 0 +# define SSL_F_TLS_PARSE_CTOS_POST_HANDSHAKE_AUTH 0 +# define SSL_F_TLS_PARSE_CTOS_PSK 0 +# define SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES 0 +# define SSL_F_TLS_PARSE_CTOS_RENEGOTIATE 0 +# define SSL_F_TLS_PARSE_CTOS_SERVER_NAME 0 +# define SSL_F_TLS_PARSE_CTOS_SESSION_TICKET 0 +# define SSL_F_TLS_PARSE_CTOS_SIG_ALGS 0 +# define SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT 0 +# define SSL_F_TLS_PARSE_CTOS_SRP 0 +# define SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST 0 +# define SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS 0 +# define SSL_F_TLS_PARSE_CTOS_USE_SRTP 0 +# define SSL_F_TLS_PARSE_STOC_ALPN 0 +# define SSL_F_TLS_PARSE_STOC_COOKIE 0 +# define SSL_F_TLS_PARSE_STOC_EARLY_DATA 0 +# define SSL_F_TLS_PARSE_STOC_EARLY_DATA_INFO 0 +# define SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS 0 +# define SSL_F_TLS_PARSE_STOC_KEY_SHARE 0 +# define SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN 0 +# define SSL_F_TLS_PARSE_STOC_NPN 0 +# define SSL_F_TLS_PARSE_STOC_PSK 0 +# define SSL_F_TLS_PARSE_STOC_RENEGOTIATE 0 +# define SSL_F_TLS_PARSE_STOC_SCT 0 +# define SSL_F_TLS_PARSE_STOC_SERVER_NAME 0 +# define SSL_F_TLS_PARSE_STOC_SESSION_TICKET 0 +# define SSL_F_TLS_PARSE_STOC_STATUS_REQUEST 0 +# define SSL_F_TLS_PARSE_STOC_SUPPORTED_VERSIONS 0 +# define SSL_F_TLS_PARSE_STOC_USE_SRTP 0 +# define SSL_F_TLS_POST_PROCESS_CLIENT_HELLO 0 +# define SSL_F_TLS_POST_PROCESS_CLIENT_KEY_EXCHANGE 0 +# define SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE 0 +# define SSL_F_TLS_PROCESS_AS_HELLO_RETRY_REQUEST 0 +# define SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST 0 +# define SSL_F_TLS_PROCESS_CERT_STATUS 0 +# define SSL_F_TLS_PROCESS_CERT_STATUS_BODY 0 +# define SSL_F_TLS_PROCESS_CERT_VERIFY 0 +# define SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC 0 +# define SSL_F_TLS_PROCESS_CKE_DHE 0 +# define SSL_F_TLS_PROCESS_CKE_ECDHE 0 +# define SSL_F_TLS_PROCESS_CKE_GOST 0 +# define SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE 0 +# define SSL_F_TLS_PROCESS_CKE_RSA 0 +# define SSL_F_TLS_PROCESS_CKE_SRP 0 +# define SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE 0 +# define SSL_F_TLS_PROCESS_CLIENT_HELLO 0 +# define SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE 0 +# define SSL_F_TLS_PROCESS_ENCRYPTED_EXTENSIONS 0 +# define SSL_F_TLS_PROCESS_END_OF_EARLY_DATA 0 +# define SSL_F_TLS_PROCESS_FINISHED 0 +# define SSL_F_TLS_PROCESS_HELLO_REQ 0 +# define SSL_F_TLS_PROCESS_HELLO_RETRY_REQUEST 0 +# define SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT 0 +# define SSL_F_TLS_PROCESS_KEY_EXCHANGE 0 +# define SSL_F_TLS_PROCESS_KEY_UPDATE 0 +# define SSL_F_TLS_PROCESS_NEW_SESSION_TICKET 0 +# define SSL_F_TLS_PROCESS_NEXT_PROTO 0 +# define SSL_F_TLS_PROCESS_SERVER_CERTIFICATE 0 +# define SSL_F_TLS_PROCESS_SERVER_DONE 0 +# define SSL_F_TLS_PROCESS_SERVER_HELLO 0 +# define SSL_F_TLS_PROCESS_SKE_DHE 0 +# define SSL_F_TLS_PROCESS_SKE_ECDHE 0 +# define SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE 0 +# define SSL_F_TLS_PROCESS_SKE_SRP 0 +# define SSL_F_TLS_PSK_DO_BINDER 0 +# define SSL_F_TLS_SCAN_CLIENTHELLO_TLSEXT 0 +# define SSL_F_TLS_SETUP_HANDSHAKE 0 +# define SSL_F_USE_CERTIFICATE_CHAIN_FILE 0 +# define SSL_F_WPACKET_INTERN_INIT_LEN 0 +# define SSL_F_WPACKET_START_SUB_PACKET_LEN__ 0 +# define SSL_F_WRITE_STATE_MACHINE 0 +# endif + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/stack.h b/OtherInc/openssl/include/openssl/stack.h new file mode 100644 index 0000000..f0c5c54 --- /dev/null +++ b/OtherInc/openssl/include/openssl/stack.h @@ -0,0 +1,90 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_STACK_H +# define OPENSSL_STACK_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_STACK_H +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stack_st OPENSSL_STACK; /* Use STACK_OF(...) instead */ + +typedef int (*OPENSSL_sk_compfunc)(const void *, const void *); +typedef void (*OPENSSL_sk_freefunc)(void *); +typedef void *(*OPENSSL_sk_copyfunc)(const void *); + +int OPENSSL_sk_num(const OPENSSL_STACK *); +void *OPENSSL_sk_value(const OPENSSL_STACK *, int); + +void *OPENSSL_sk_set(OPENSSL_STACK *st, int i, const void *data); + +OPENSSL_STACK *OPENSSL_sk_new(OPENSSL_sk_compfunc cmp); +OPENSSL_STACK *OPENSSL_sk_new_null(void); +OPENSSL_STACK *OPENSSL_sk_new_reserve(OPENSSL_sk_compfunc c, int n); +int OPENSSL_sk_reserve(OPENSSL_STACK *st, int n); +void OPENSSL_sk_free(OPENSSL_STACK *); +void OPENSSL_sk_pop_free(OPENSSL_STACK *st, void (*func) (void *)); +OPENSSL_STACK *OPENSSL_sk_deep_copy(const OPENSSL_STACK *, + OPENSSL_sk_copyfunc c, + OPENSSL_sk_freefunc f); +int OPENSSL_sk_insert(OPENSSL_STACK *sk, const void *data, int where); +void *OPENSSL_sk_delete(OPENSSL_STACK *st, int loc); +void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *st, const void *p); +int OPENSSL_sk_find(OPENSSL_STACK *st, const void *data); +int OPENSSL_sk_find_ex(OPENSSL_STACK *st, const void *data); +int OPENSSL_sk_find_all(OPENSSL_STACK *st, const void *data, int *pnum); +int OPENSSL_sk_push(OPENSSL_STACK *st, const void *data); +int OPENSSL_sk_unshift(OPENSSL_STACK *st, const void *data); +void *OPENSSL_sk_shift(OPENSSL_STACK *st); +void *OPENSSL_sk_pop(OPENSSL_STACK *st); +void OPENSSL_sk_zero(OPENSSL_STACK *st); +OPENSSL_sk_compfunc OPENSSL_sk_set_cmp_func(OPENSSL_STACK *sk, + OPENSSL_sk_compfunc cmp); +OPENSSL_STACK *OPENSSL_sk_dup(const OPENSSL_STACK *st); +void OPENSSL_sk_sort(OPENSSL_STACK *st); +int OPENSSL_sk_is_sorted(const OPENSSL_STACK *st); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define _STACK OPENSSL_STACK +# define sk_num OPENSSL_sk_num +# define sk_value OPENSSL_sk_value +# define sk_set OPENSSL_sk_set +# define sk_new OPENSSL_sk_new +# define sk_new_null OPENSSL_sk_new_null +# define sk_free OPENSSL_sk_free +# define sk_pop_free OPENSSL_sk_pop_free +# define sk_deep_copy OPENSSL_sk_deep_copy +# define sk_insert OPENSSL_sk_insert +# define sk_delete OPENSSL_sk_delete +# define sk_delete_ptr OPENSSL_sk_delete_ptr +# define sk_find OPENSSL_sk_find +# define sk_find_ex OPENSSL_sk_find_ex +# define sk_push OPENSSL_sk_push +# define sk_unshift OPENSSL_sk_unshift +# define sk_shift OPENSSL_sk_shift +# define sk_pop OPENSSL_sk_pop +# define sk_zero OPENSSL_sk_zero +# define sk_set_cmp_func OPENSSL_sk_set_cmp_func +# define sk_dup OPENSSL_sk_dup +# define sk_sort OPENSSL_sk_sort +# define sk_is_sorted OPENSSL_sk_is_sorted +# endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/OtherInc/openssl/include/openssl/store.h b/OtherInc/openssl/include/openssl/store.h new file mode 100644 index 0000000..3c1445e --- /dev/null +++ b/OtherInc/openssl/include/openssl/store.h @@ -0,0 +1,369 @@ +/* + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_STORE_H +# define OPENSSL_STORE_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_OSSL_STORE_H +# endif + +# include +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +/*- + * The main OSSL_STORE functions. + * ------------------------------ + * + * These allow applications to open a channel to a resource with supported + * data (keys, certs, crls, ...), read the data a piece at a time and decide + * what to do with it, and finally close. + */ + +typedef struct ossl_store_ctx_st OSSL_STORE_CTX; + +/* + * Typedef for the OSSL_STORE_INFO post processing callback. This can be used + * to massage the given OSSL_STORE_INFO, or to drop it entirely (by returning + * NULL). + */ +typedef OSSL_STORE_INFO *(*OSSL_STORE_post_process_info_fn)(OSSL_STORE_INFO *, + void *); + +/* + * Open a channel given a URI. The given UI method will be used any time the + * loader needs extra input, for example when a password or pin is needed, and + * will be passed the same user data every time it's needed in this context. + * + * Returns a context reference which represents the channel to communicate + * through. + */ +OSSL_STORE_CTX * +OSSL_STORE_open(const char *uri, const UI_METHOD *ui_method, void *ui_data, + OSSL_STORE_post_process_info_fn post_process, + void *post_process_data); +OSSL_STORE_CTX * +OSSL_STORE_open_ex(const char *uri, OSSL_LIB_CTX *libctx, const char *propq, + const UI_METHOD *ui_method, void *ui_data, + const OSSL_PARAM params[], + OSSL_STORE_post_process_info_fn post_process, + void *post_process_data); + +/* + * Control / fine tune the OSSL_STORE channel. |cmd| determines what is to be + * done, and depends on the underlying loader (use OSSL_STORE_get0_scheme to + * determine which loader is used), except for common commands (see below). + * Each command takes different arguments. + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int OSSL_STORE_ctrl(OSSL_STORE_CTX *ctx, int cmd, + ... /* args */); +OSSL_DEPRECATEDIN_3_0 int OSSL_STORE_vctrl(OSSL_STORE_CTX *ctx, int cmd, + va_list args); +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 + +/* + * Common ctrl commands that different loaders may choose to support. + */ +/* int on = 0 or 1; STORE_ctrl(ctx, STORE_C_USE_SECMEM, &on); */ +# define OSSL_STORE_C_USE_SECMEM 1 +/* Where custom commands start */ +# define OSSL_STORE_C_CUSTOM_START 100 + +# endif + +/* + * Read one data item (a key, a cert, a CRL) that is supported by the OSSL_STORE + * functionality, given a context. + * Returns a OSSL_STORE_INFO pointer, from which OpenSSL typed data can be + * extracted with OSSL_STORE_INFO_get0_PKEY(), OSSL_STORE_INFO_get0_CERT(), ... + * NULL is returned on error, which may include that the data found at the URI + * can't be figured out for certain or is ambiguous. + */ +OSSL_STORE_INFO *OSSL_STORE_load(OSSL_STORE_CTX *ctx); + +/* + * Check if end of data (end of file) is reached + * Returns 1 on end, 0 otherwise. + */ +int OSSL_STORE_eof(OSSL_STORE_CTX *ctx); + +/* + * Check if an error occurred + * Returns 1 if it did, 0 otherwise. + */ +int OSSL_STORE_error(OSSL_STORE_CTX *ctx); + +/* + * Close the channel + * Returns 1 on success, 0 on error. + */ +int OSSL_STORE_close(OSSL_STORE_CTX *ctx); + +/* + * Attach to a BIO. This works like OSSL_STORE_open() except it takes a + * BIO instead of a uri, along with a scheme to use when reading. + * The given UI method will be used any time the loader needs extra input, + * for example when a password or pin is needed, and will be passed the + * same user data every time it's needed in this context. + * + * Returns a context reference which represents the channel to communicate + * through. + * + * Note that this function is considered unsafe, all depending on what the + * BIO actually reads. + */ +OSSL_STORE_CTX *OSSL_STORE_attach(BIO *bio, const char *scheme, + OSSL_LIB_CTX *libctx, const char *propq, + const UI_METHOD *ui_method, void *ui_data, + const OSSL_PARAM params[], + OSSL_STORE_post_process_info_fn post_process, + void *post_process_data); + +/*- + * Extracting OpenSSL types from and creating new OSSL_STORE_INFOs + * --------------------------------------------------------------- + */ + +/* + * Types of data that can be ossl_stored in a OSSL_STORE_INFO. + * OSSL_STORE_INFO_NAME is typically found when getting a listing of + * available "files" / "tokens" / what have you. + */ +# define OSSL_STORE_INFO_NAME 1 /* char * */ +# define OSSL_STORE_INFO_PARAMS 2 /* EVP_PKEY * */ +# define OSSL_STORE_INFO_PUBKEY 3 /* EVP_PKEY * */ +# define OSSL_STORE_INFO_PKEY 4 /* EVP_PKEY * */ +# define OSSL_STORE_INFO_CERT 5 /* X509 * */ +# define OSSL_STORE_INFO_CRL 6 /* X509_CRL * */ + +/* + * Functions to generate OSSL_STORE_INFOs, one function for each type we + * support having in them, as well as a generic constructor. + * + * In all cases, ownership of the object is transferred to the OSSL_STORE_INFO + * and will therefore be freed when the OSSL_STORE_INFO is freed. + */ +OSSL_STORE_INFO *OSSL_STORE_INFO_new(int type, void *data); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_NAME(char *name); +int OSSL_STORE_INFO_set0_NAME_description(OSSL_STORE_INFO *info, char *desc); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_PARAMS(EVP_PKEY *params); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_PUBKEY(EVP_PKEY *pubkey); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_PKEY(EVP_PKEY *pkey); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_CERT(X509 *x509); +OSSL_STORE_INFO *OSSL_STORE_INFO_new_CRL(X509_CRL *crl); + +/* + * Functions to try to extract data from a OSSL_STORE_INFO. + */ +int OSSL_STORE_INFO_get_type(const OSSL_STORE_INFO *info); +void *OSSL_STORE_INFO_get0_data(int type, const OSSL_STORE_INFO *info); +const char *OSSL_STORE_INFO_get0_NAME(const OSSL_STORE_INFO *info); +char *OSSL_STORE_INFO_get1_NAME(const OSSL_STORE_INFO *info); +const char *OSSL_STORE_INFO_get0_NAME_description(const OSSL_STORE_INFO *info); +char *OSSL_STORE_INFO_get1_NAME_description(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get0_PARAMS(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get1_PARAMS(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get0_PUBKEY(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get1_PUBKEY(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get0_PKEY(const OSSL_STORE_INFO *info); +EVP_PKEY *OSSL_STORE_INFO_get1_PKEY(const OSSL_STORE_INFO *info); +X509 *OSSL_STORE_INFO_get0_CERT(const OSSL_STORE_INFO *info); +X509 *OSSL_STORE_INFO_get1_CERT(const OSSL_STORE_INFO *info); +X509_CRL *OSSL_STORE_INFO_get0_CRL(const OSSL_STORE_INFO *info); +X509_CRL *OSSL_STORE_INFO_get1_CRL(const OSSL_STORE_INFO *info); + +const char *OSSL_STORE_INFO_type_string(int type); + +/* + * Free the OSSL_STORE_INFO + */ +void OSSL_STORE_INFO_free(OSSL_STORE_INFO *info); + + +/*- + * Functions to construct a search URI from a base URI and search criteria + * ----------------------------------------------------------------------- + */ + +/* OSSL_STORE search types */ +# define OSSL_STORE_SEARCH_BY_NAME 1 /* subject in certs, issuer in CRLs */ +# define OSSL_STORE_SEARCH_BY_ISSUER_SERIAL 2 +# define OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT 3 +# define OSSL_STORE_SEARCH_BY_ALIAS 4 + +/* To check what search types the scheme handler supports */ +int OSSL_STORE_supports_search(OSSL_STORE_CTX *ctx, int search_type); + +/* Search term constructors */ +/* + * The input is considered to be owned by the caller, and must therefore + * remain present throughout the lifetime of the returned OSSL_STORE_SEARCH + */ +OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_name(X509_NAME *name); +OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_issuer_serial(X509_NAME *name, + const ASN1_INTEGER + *serial); +OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_key_fingerprint(const EVP_MD *digest, + const unsigned char + *bytes, size_t len); +OSSL_STORE_SEARCH *OSSL_STORE_SEARCH_by_alias(const char *alias); + +/* Search term destructor */ +void OSSL_STORE_SEARCH_free(OSSL_STORE_SEARCH *search); + +/* Search term accessors */ +int OSSL_STORE_SEARCH_get_type(const OSSL_STORE_SEARCH *criterion); +X509_NAME *OSSL_STORE_SEARCH_get0_name(const OSSL_STORE_SEARCH *criterion); +const ASN1_INTEGER *OSSL_STORE_SEARCH_get0_serial(const OSSL_STORE_SEARCH + *criterion); +const unsigned char *OSSL_STORE_SEARCH_get0_bytes(const OSSL_STORE_SEARCH + *criterion, size_t *length); +const char *OSSL_STORE_SEARCH_get0_string(const OSSL_STORE_SEARCH *criterion); +const EVP_MD *OSSL_STORE_SEARCH_get0_digest(const OSSL_STORE_SEARCH *criterion); + +/* + * Add search criterion and expected return type (which can be unspecified) + * to the loading channel. This MUST happen before the first OSSL_STORE_load(). + */ +int OSSL_STORE_expect(OSSL_STORE_CTX *ctx, int expected_type); +int OSSL_STORE_find(OSSL_STORE_CTX *ctx, const OSSL_STORE_SEARCH *search); + + +/*- + * Function to fetch a loader and extract data from it + * --------------------------------------------------- + */ + +typedef struct ossl_store_loader_st OSSL_STORE_LOADER; + +OSSL_STORE_LOADER *OSSL_STORE_LOADER_fetch(OSSL_LIB_CTX *libctx, + const char *scheme, + const char *properties); +int OSSL_STORE_LOADER_up_ref(OSSL_STORE_LOADER *loader); +void OSSL_STORE_LOADER_free(OSSL_STORE_LOADER *loader); +const OSSL_PROVIDER *OSSL_STORE_LOADER_get0_provider(const OSSL_STORE_LOADER * + loader); +const char *OSSL_STORE_LOADER_get0_properties(const OSSL_STORE_LOADER *loader); +const char *OSSL_STORE_LOADER_get0_description(const OSSL_STORE_LOADER *loader); +int OSSL_STORE_LOADER_is_a(const OSSL_STORE_LOADER *loader, + const char *scheme); +void OSSL_STORE_LOADER_do_all_provided(OSSL_LIB_CTX *libctx, + void (*fn)(OSSL_STORE_LOADER *loader, + void *arg), + void *arg); +int OSSL_STORE_LOADER_names_do_all(const OSSL_STORE_LOADER *loader, + void (*fn)(const char *name, void *data), + void *data); + +/*- + * Function to register a loader for the given URI scheme. + * ------------------------------------------------------- + * + * The loader receives all the main components of an URI except for the + * scheme. + */ + +# ifndef OPENSSL_NO_DEPRECATED_3_0 + +/* struct ossl_store_loader_ctx_st is defined differently by each loader */ +typedef struct ossl_store_loader_ctx_st OSSL_STORE_LOADER_CTX; +typedef OSSL_STORE_LOADER_CTX *(*OSSL_STORE_open_fn) + (const OSSL_STORE_LOADER *loader, const char *uri, + const UI_METHOD *ui_method, void *ui_data); +typedef OSSL_STORE_LOADER_CTX *(*OSSL_STORE_open_ex_fn) + (const OSSL_STORE_LOADER *loader, + const char *uri, OSSL_LIB_CTX *libctx, const char *propq, + const UI_METHOD *ui_method, void *ui_data); + +typedef OSSL_STORE_LOADER_CTX *(*OSSL_STORE_attach_fn) + (const OSSL_STORE_LOADER *loader, BIO *bio, + OSSL_LIB_CTX *libctx, const char *propq, + const UI_METHOD *ui_method, void *ui_data); +typedef int (*OSSL_STORE_ctrl_fn) + (OSSL_STORE_LOADER_CTX *ctx, int cmd, va_list args); +typedef int (*OSSL_STORE_expect_fn) + (OSSL_STORE_LOADER_CTX *ctx, int expected); +typedef int (*OSSL_STORE_find_fn) + (OSSL_STORE_LOADER_CTX *ctx, const OSSL_STORE_SEARCH *criteria); +typedef OSSL_STORE_INFO *(*OSSL_STORE_load_fn) + (OSSL_STORE_LOADER_CTX *ctx, const UI_METHOD *ui_method, void *ui_data); +typedef int (*OSSL_STORE_eof_fn)(OSSL_STORE_LOADER_CTX *ctx); +typedef int (*OSSL_STORE_error_fn)(OSSL_STORE_LOADER_CTX *ctx); +typedef int (*OSSL_STORE_close_fn)(OSSL_STORE_LOADER_CTX *ctx); + +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +OSSL_STORE_LOADER *OSSL_STORE_LOADER_new(ENGINE *e, const char *scheme); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_open(OSSL_STORE_LOADER *loader, + OSSL_STORE_open_fn open_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_open_ex(OSSL_STORE_LOADER *loader, + OSSL_STORE_open_ex_fn open_ex_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_attach(OSSL_STORE_LOADER *loader, + OSSL_STORE_attach_fn attach_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_ctrl(OSSL_STORE_LOADER *loader, + OSSL_STORE_ctrl_fn ctrl_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_expect(OSSL_STORE_LOADER *loader, + OSSL_STORE_expect_fn expect_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_find(OSSL_STORE_LOADER *loader, + OSSL_STORE_find_fn find_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_load(OSSL_STORE_LOADER *loader, + OSSL_STORE_load_fn load_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_eof(OSSL_STORE_LOADER *loader, + OSSL_STORE_eof_fn eof_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_error(OSSL_STORE_LOADER *loader, + OSSL_STORE_error_fn error_function); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_LOADER_set_close(OSSL_STORE_LOADER *loader, + OSSL_STORE_close_fn close_function); +OSSL_DEPRECATEDIN_3_0 +const ENGINE *OSSL_STORE_LOADER_get0_engine(const OSSL_STORE_LOADER *loader); +OSSL_DEPRECATEDIN_3_0 +const char * OSSL_STORE_LOADER_get0_scheme(const OSSL_STORE_LOADER *loader); +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_register_loader(OSSL_STORE_LOADER *loader); +OSSL_DEPRECATEDIN_3_0 +OSSL_STORE_LOADER *OSSL_STORE_unregister_loader(const char *scheme); +# endif + +/*- + * Functions to list STORE loaders + * ------------------------------- + */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int OSSL_STORE_do_all_loaders(void (*do_function)(const OSSL_STORE_LOADER *loader, + void *do_arg), + void *do_arg); +# endif + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/storeerr.h b/OtherInc/openssl/include/openssl/storeerr.h new file mode 100644 index 0000000..00529c8 --- /dev/null +++ b/OtherInc/openssl/include/openssl/storeerr.h @@ -0,0 +1,49 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_STOREERR_H +# define OPENSSL_STOREERR_H +# pragma once + +# include +# include +# include + + + +/* + * OSSL_STORE reason codes. + */ +# define OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE 107 +# define OSSL_STORE_R_BAD_PASSWORD_READ 115 +# define OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC 113 +# define OSSL_STORE_R_FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST 121 +# define OSSL_STORE_R_INVALID_SCHEME 106 +# define OSSL_STORE_R_IS_NOT_A 112 +# define OSSL_STORE_R_LOADER_INCOMPLETE 116 +# define OSSL_STORE_R_LOADING_STARTED 117 +# define OSSL_STORE_R_NOT_A_CERTIFICATE 100 +# define OSSL_STORE_R_NOT_A_CRL 101 +# define OSSL_STORE_R_NOT_A_NAME 103 +# define OSSL_STORE_R_NOT_A_PRIVATE_KEY 102 +# define OSSL_STORE_R_NOT_A_PUBLIC_KEY 122 +# define OSSL_STORE_R_NOT_PARAMETERS 104 +# define OSSL_STORE_R_NO_LOADERS_FOUND 123 +# define OSSL_STORE_R_PASSPHRASE_CALLBACK_ERROR 114 +# define OSSL_STORE_R_PATH_MUST_BE_ABSOLUTE 108 +# define OSSL_STORE_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES 119 +# define OSSL_STORE_R_UI_PROCESS_INTERRUPTED_OR_CANCELLED 109 +# define OSSL_STORE_R_UNREGISTERED_SCHEME 105 +# define OSSL_STORE_R_UNSUPPORTED_CONTENT_TYPE 110 +# define OSSL_STORE_R_UNSUPPORTED_OPERATION 118 +# define OSSL_STORE_R_UNSUPPORTED_SEARCH_TYPE 120 +# define OSSL_STORE_R_URI_AUTHORITY_UNSUPPORTED 111 + +#endif diff --git a/OtherInc/openssl/include/openssl/symhacks.h b/OtherInc/openssl/include/openssl/symhacks.h new file mode 100644 index 0000000..816f8f9 --- /dev/null +++ b/OtherInc/openssl/include/openssl/symhacks.h @@ -0,0 +1,39 @@ +/* + * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_SYMHACKS_H +# define OPENSSL_SYMHACKS_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_SYMHACKS_H +# endif + +# include + +/* Case insensitive linking causes problems.... */ +# if defined(OPENSSL_SYS_VMS) +# undef ERR_load_CRYPTO_strings +# define ERR_load_CRYPTO_strings ERR_load_CRYPTOlib_strings +# undef OCSP_crlID_new +# define OCSP_crlID_new OCSP_crlID2_new + +# undef d2i_ECPARAMETERS +# define d2i_ECPARAMETERS d2i_UC_ECPARAMETERS +# undef i2d_ECPARAMETERS +# define i2d_ECPARAMETERS i2d_UC_ECPARAMETERS +# undef d2i_ECPKPARAMETERS +# define d2i_ECPKPARAMETERS d2i_UC_ECPKPARAMETERS +# undef i2d_ECPKPARAMETERS +# define i2d_ECPKPARAMETERS i2d_UC_ECPKPARAMETERS + +# endif + +#endif /* ! defined HEADER_VMS_IDHACKS_H */ diff --git a/OtherInc/openssl/include/openssl/tls1.h b/OtherInc/openssl/include/openssl/tls1.h new file mode 100644 index 0000000..d6e9331 --- /dev/null +++ b/OtherInc/openssl/include/openssl/tls1.h @@ -0,0 +1,1223 @@ +/* + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * Copyright 2005 Nokia. All rights reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_TLS1_H +# define OPENSSL_TLS1_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_TLS1_H +# endif + +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Default security level if not overridden at config time */ +# ifndef OPENSSL_TLS_SECURITY_LEVEL +# define OPENSSL_TLS_SECURITY_LEVEL 1 +# endif + +/* TLS*_VERSION constants are defined in prov_ssl.h */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define TLS_MAX_VERSION TLS1_3_VERSION +# endif + +/* Special value for method supporting multiple versions */ +# define TLS_ANY_VERSION 0x10000 + +# define TLS1_VERSION_MAJOR 0x03 +# define TLS1_VERSION_MINOR 0x01 + +# define TLS1_1_VERSION_MAJOR 0x03 +# define TLS1_1_VERSION_MINOR 0x02 + +# define TLS1_2_VERSION_MAJOR 0x03 +# define TLS1_2_VERSION_MINOR 0x03 + +# define TLS1_get_version(s) \ + ((SSL_version(s) >> 8) == TLS1_VERSION_MAJOR ? SSL_version(s) : 0) + +# define TLS1_get_client_version(s) \ + ((SSL_client_version(s) >> 8) == TLS1_VERSION_MAJOR ? SSL_client_version(s) : 0) + +# define TLS1_AD_DECRYPTION_FAILED 21 +# define TLS1_AD_RECORD_OVERFLOW 22 +# define TLS1_AD_UNKNOWN_CA 48/* fatal */ +# define TLS1_AD_ACCESS_DENIED 49/* fatal */ +# define TLS1_AD_DECODE_ERROR 50/* fatal */ +# define TLS1_AD_DECRYPT_ERROR 51 +# define TLS1_AD_EXPORT_RESTRICTION 60/* fatal */ +# define TLS1_AD_PROTOCOL_VERSION 70/* fatal */ +# define TLS1_AD_INSUFFICIENT_SECURITY 71/* fatal */ +# define TLS1_AD_INTERNAL_ERROR 80/* fatal */ +# define TLS1_AD_INAPPROPRIATE_FALLBACK 86/* fatal */ +# define TLS1_AD_USER_CANCELLED 90 +# define TLS1_AD_NO_RENEGOTIATION 100 +/* TLSv1.3 alerts */ +# define TLS13_AD_MISSING_EXTENSION 109 /* fatal */ +# define TLS13_AD_CERTIFICATE_REQUIRED 116 /* fatal */ +/* codes 110-114 are from RFC3546 */ +# define TLS1_AD_UNSUPPORTED_EXTENSION 110 +# define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111 +# define TLS1_AD_UNRECOGNIZED_NAME 112 +# define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113 +# define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114 +# define TLS1_AD_UNKNOWN_PSK_IDENTITY 115/* fatal */ +# define TLS1_AD_NO_APPLICATION_PROTOCOL 120 /* fatal */ + +/* ExtensionType values from RFC3546 / RFC4366 / RFC6066 */ +# define TLSEXT_TYPE_server_name 0 +# define TLSEXT_TYPE_max_fragment_length 1 +# define TLSEXT_TYPE_client_certificate_url 2 +# define TLSEXT_TYPE_trusted_ca_keys 3 +# define TLSEXT_TYPE_truncated_hmac 4 +# define TLSEXT_TYPE_status_request 5 +/* ExtensionType values from RFC4681 */ +# define TLSEXT_TYPE_user_mapping 6 +/* ExtensionType values from RFC5878 */ +# define TLSEXT_TYPE_client_authz 7 +# define TLSEXT_TYPE_server_authz 8 +/* ExtensionType values from RFC6091 */ +# define TLSEXT_TYPE_cert_type 9 + +/* ExtensionType values from RFC4492 */ +/* + * Prior to TLSv1.3 the supported_groups extension was known as + * elliptic_curves + */ +# define TLSEXT_TYPE_supported_groups 10 +# define TLSEXT_TYPE_elliptic_curves TLSEXT_TYPE_supported_groups +# define TLSEXT_TYPE_ec_point_formats 11 + + +/* ExtensionType value from RFC5054 */ +# define TLSEXT_TYPE_srp 12 + +/* ExtensionType values from RFC5246 */ +# define TLSEXT_TYPE_signature_algorithms 13 + +/* ExtensionType value from RFC5764 */ +# define TLSEXT_TYPE_use_srtp 14 + +/* ExtensionType value from RFC7301 */ +# define TLSEXT_TYPE_application_layer_protocol_negotiation 16 + +/* + * Extension type for Certificate Transparency + * https://tools.ietf.org/html/rfc6962#section-3.3.1 + */ +# define TLSEXT_TYPE_signed_certificate_timestamp 18 + +/* + * ExtensionType value for TLS padding extension. + * http://tools.ietf.org/html/draft-agl-tls-padding + */ +# define TLSEXT_TYPE_padding 21 + +/* ExtensionType value from RFC7366 */ +# define TLSEXT_TYPE_encrypt_then_mac 22 + +/* ExtensionType value from RFC7627 */ +# define TLSEXT_TYPE_extended_master_secret 23 + +/* ExtensionType value from RFC4507 */ +# define TLSEXT_TYPE_session_ticket 35 + +/* As defined for TLS1.3 */ +# define TLSEXT_TYPE_psk 41 +# define TLSEXT_TYPE_early_data 42 +# define TLSEXT_TYPE_supported_versions 43 +# define TLSEXT_TYPE_cookie 44 +# define TLSEXT_TYPE_psk_kex_modes 45 +# define TLSEXT_TYPE_certificate_authorities 47 +# define TLSEXT_TYPE_post_handshake_auth 49 +# define TLSEXT_TYPE_signature_algorithms_cert 50 +# define TLSEXT_TYPE_key_share 51 + +/* Temporary extension type */ +# define TLSEXT_TYPE_renegotiate 0xff01 + +# ifndef OPENSSL_NO_NEXTPROTONEG +/* This is not an IANA defined extension number */ +# define TLSEXT_TYPE_next_proto_neg 13172 +# endif + +/* NameType value from RFC3546 */ +# define TLSEXT_NAMETYPE_host_name 0 +/* status request value from RFC3546 */ +# define TLSEXT_STATUSTYPE_ocsp 1 + +/* ECPointFormat values from RFC4492 */ +# define TLSEXT_ECPOINTFORMAT_first 0 +# define TLSEXT_ECPOINTFORMAT_uncompressed 0 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime 1 +# define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 2 +# define TLSEXT_ECPOINTFORMAT_last 2 + +/* Signature and hash algorithms from RFC5246 */ +# define TLSEXT_signature_anonymous 0 +# define TLSEXT_signature_rsa 1 +# define TLSEXT_signature_dsa 2 +# define TLSEXT_signature_ecdsa 3 +# define TLSEXT_signature_gostr34102001 237 +# define TLSEXT_signature_gostr34102012_256 238 +# define TLSEXT_signature_gostr34102012_512 239 + +/* Total number of different signature algorithms */ +# define TLSEXT_signature_num 7 + +# define TLSEXT_hash_none 0 +# define TLSEXT_hash_md5 1 +# define TLSEXT_hash_sha1 2 +# define TLSEXT_hash_sha224 3 +# define TLSEXT_hash_sha256 4 +# define TLSEXT_hash_sha384 5 +# define TLSEXT_hash_sha512 6 +# define TLSEXT_hash_gostr3411 237 +# define TLSEXT_hash_gostr34112012_256 238 +# define TLSEXT_hash_gostr34112012_512 239 + +/* Total number of different digest algorithms */ + +# define TLSEXT_hash_num 10 + +/* Flag set for unrecognised algorithms */ +# define TLSEXT_nid_unknown 0x1000000 + +/* ECC curves */ + +# define TLSEXT_curve_P_256 23 +# define TLSEXT_curve_P_384 24 + +/* OpenSSL value to disable maximum fragment length extension */ +# define TLSEXT_max_fragment_length_DISABLED 0 +/* Allowed values for max fragment length extension */ +# define TLSEXT_max_fragment_length_512 1 +# define TLSEXT_max_fragment_length_1024 2 +# define TLSEXT_max_fragment_length_2048 3 +# define TLSEXT_max_fragment_length_4096 4 + +int SSL_CTX_set_tlsext_max_fragment_length(SSL_CTX *ctx, uint8_t mode); +int SSL_set_tlsext_max_fragment_length(SSL *ssl, uint8_t mode); + +# define TLSEXT_MAXLEN_host_name 255 + +__owur const char *SSL_get_servername(const SSL *s, const int type); +__owur int SSL_get_servername_type(const SSL *s); +/* + * SSL_export_keying_material exports a value derived from the master secret, + * as specified in RFC 5705. It writes |olen| bytes to |out| given a label and + * optional context. (Since a zero length context is allowed, the |use_context| + * flag controls whether a context is included.) It returns 1 on success and + * 0 or -1 otherwise. + */ +__owur int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, + const char *label, size_t llen, + const unsigned char *context, + size_t contextlen, int use_context); + +/* + * SSL_export_keying_material_early exports a value derived from the + * early exporter master secret, as specified in + * https://tools.ietf.org/html/draft-ietf-tls-tls13-23. It writes + * |olen| bytes to |out| given a label and optional context. It + * returns 1 on success and 0 otherwise. + */ +__owur int SSL_export_keying_material_early(SSL *s, unsigned char *out, + size_t olen, const char *label, + size_t llen, + const unsigned char *context, + size_t contextlen); + +int SSL_get_peer_signature_type_nid(const SSL *s, int *pnid); +int SSL_get_signature_type_nid(const SSL *s, int *pnid); + +int SSL_get_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +int SSL_get_shared_sigalgs(SSL *s, int idx, + int *psign, int *phash, int *psignandhash, + unsigned char *rsig, unsigned char *rhash); + +__owur int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain); + +# define SSL_set_tlsext_host_name(s,name) \ + SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,\ + (void *)name) + +# define SSL_set_tlsext_debug_callback(ssl, cb) \ + SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,\ + (void (*)(void))cb) + +# define SSL_set_tlsext_debug_arg(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0,arg) + +# define SSL_get_tlsext_status_type(ssl) \ + SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE,0,NULL) + +# define SSL_set_tlsext_status_type(ssl, type) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type,NULL) + +# define SSL_get_tlsext_status_exts(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0,arg) + +# define SSL_set_tlsext_status_exts(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0,arg) + +# define SSL_get_tlsext_status_ids(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0,arg) + +# define SSL_set_tlsext_status_ids(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0,arg) + +# define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \ + SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0,arg) + +# define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \ + SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen,arg) + +# define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \ + SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,\ + (void (*)(void))cb) + +# define SSL_TLSEXT_ERR_OK 0 +# define SSL_TLSEXT_ERR_ALERT_WARNING 1 +# define SSL_TLSEXT_ERR_ALERT_FATAL 2 +# define SSL_TLSEXT_ERR_NOACK 3 + +# define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0,arg) + +# define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET_TLSEXT_TICKET_KEYS,keylen,keys) +# define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_TICKET_KEYS,keylen,keys) + +# define SSL_CTX_get_tlsext_status_cb(ssl, cb) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB,0,(void *)cb) +# define SSL_CTX_set_tlsext_status_cb(ssl, cb) \ + SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,\ + (void (*)(void))cb) + +# define SSL_CTX_get_tlsext_status_arg(ssl, arg) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG,0,arg) +# define SSL_CTX_set_tlsext_status_arg(ssl, arg) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0,arg) + +# define SSL_CTX_set_tlsext_status_type(ssl, type) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type,NULL) + +# define SSL_CTX_get_tlsext_status_type(ssl) \ + SSL_CTX_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE,0,NULL) + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define SSL_CTX_set_tlsext_ticket_key_cb(ssl, cb) \ + SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,\ + (void (*)(void))cb) +# endif +int SSL_CTX_set_tlsext_ticket_key_evp_cb + (SSL_CTX *ctx, int (*fp)(SSL *, unsigned char *, unsigned char *, + EVP_CIPHER_CTX *, EVP_MAC_CTX *, int)); + +/* PSK ciphersuites from 4279 */ +# define TLS1_CK_PSK_WITH_RC4_128_SHA 0x0300008A +# define TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008B +# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C +# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D +# define TLS1_CK_DHE_PSK_WITH_RC4_128_SHA 0x0300008E +# define TLS1_CK_DHE_PSK_WITH_3DES_EDE_CBC_SHA 0x0300008F +# define TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA 0x03000090 +# define TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA 0x03000091 +# define TLS1_CK_RSA_PSK_WITH_RC4_128_SHA 0x03000092 +# define TLS1_CK_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x03000093 +# define TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA 0x03000094 +# define TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA 0x03000095 + +/* PSK ciphersuites from 5487 */ +# define TLS1_CK_PSK_WITH_AES_128_GCM_SHA256 0x030000A8 +# define TLS1_CK_PSK_WITH_AES_256_GCM_SHA384 0x030000A9 +# define TLS1_CK_DHE_PSK_WITH_AES_128_GCM_SHA256 0x030000AA +# define TLS1_CK_DHE_PSK_WITH_AES_256_GCM_SHA384 0x030000AB +# define TLS1_CK_RSA_PSK_WITH_AES_128_GCM_SHA256 0x030000AC +# define TLS1_CK_RSA_PSK_WITH_AES_256_GCM_SHA384 0x030000AD +# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA256 0x030000AE +# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA384 0x030000AF +# define TLS1_CK_PSK_WITH_NULL_SHA256 0x030000B0 +# define TLS1_CK_PSK_WITH_NULL_SHA384 0x030000B1 +# define TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA256 0x030000B2 +# define TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA384 0x030000B3 +# define TLS1_CK_DHE_PSK_WITH_NULL_SHA256 0x030000B4 +# define TLS1_CK_DHE_PSK_WITH_NULL_SHA384 0x030000B5 +# define TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA256 0x030000B6 +# define TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA384 0x030000B7 +# define TLS1_CK_RSA_PSK_WITH_NULL_SHA256 0x030000B8 +# define TLS1_CK_RSA_PSK_WITH_NULL_SHA384 0x030000B9 + +/* NULL PSK ciphersuites from RFC4785 */ +# define TLS1_CK_PSK_WITH_NULL_SHA 0x0300002C +# define TLS1_CK_DHE_PSK_WITH_NULL_SHA 0x0300002D +# define TLS1_CK_RSA_PSK_WITH_NULL_SHA 0x0300002E + +/* AES ciphersuites from RFC3268 */ +# define TLS1_CK_RSA_WITH_AES_128_SHA 0x0300002F +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA 0x03000030 +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA 0x03000031 +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA 0x03000032 +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA 0x03000033 +# define TLS1_CK_ADH_WITH_AES_128_SHA 0x03000034 +# define TLS1_CK_RSA_WITH_AES_256_SHA 0x03000035 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA 0x03000036 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA 0x03000037 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA 0x03000038 +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA 0x03000039 +# define TLS1_CK_ADH_WITH_AES_256_SHA 0x0300003A + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_RSA_WITH_NULL_SHA256 0x0300003B +# define TLS1_CK_RSA_WITH_AES_128_SHA256 0x0300003C +# define TLS1_CK_RSA_WITH_AES_256_SHA256 0x0300003D +# define TLS1_CK_DH_DSS_WITH_AES_128_SHA256 0x0300003E +# define TLS1_CK_DH_RSA_WITH_AES_128_SHA256 0x0300003F +# define TLS1_CK_DHE_DSS_WITH_AES_128_SHA256 0x03000040 + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000041 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000042 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000043 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA 0x03000044 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x03000045 +# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA 0x03000046 + +/* TLS v1.2 ciphersuites */ +# define TLS1_CK_DHE_RSA_WITH_AES_128_SHA256 0x03000067 +# define TLS1_CK_DH_DSS_WITH_AES_256_SHA256 0x03000068 +# define TLS1_CK_DH_RSA_WITH_AES_256_SHA256 0x03000069 +# define TLS1_CK_DHE_DSS_WITH_AES_256_SHA256 0x0300006A +# define TLS1_CK_DHE_RSA_WITH_AES_256_SHA256 0x0300006B +# define TLS1_CK_ADH_WITH_AES_128_SHA256 0x0300006C +# define TLS1_CK_ADH_WITH_AES_256_SHA256 0x0300006D + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000084 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000085 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000086 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA 0x03000087 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x03000088 +# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA 0x03000089 + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_CK_RSA_WITH_SEED_SHA 0x03000096 +# define TLS1_CK_DH_DSS_WITH_SEED_SHA 0x03000097 +# define TLS1_CK_DH_RSA_WITH_SEED_SHA 0x03000098 +# define TLS1_CK_DHE_DSS_WITH_SEED_SHA 0x03000099 +# define TLS1_CK_DHE_RSA_WITH_SEED_SHA 0x0300009A +# define TLS1_CK_ADH_WITH_SEED_SHA 0x0300009B + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256 0x0300009C +# define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384 0x0300009D +# define TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 0x0300009E +# define TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384 0x0300009F +# define TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256 0x030000A0 +# define TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384 0x030000A1 +# define TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256 0x030000A2 +# define TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384 0x030000A3 +# define TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256 0x030000A4 +# define TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384 0x030000A5 +# define TLS1_CK_ADH_WITH_AES_128_GCM_SHA256 0x030000A6 +# define TLS1_CK_ADH_WITH_AES_256_GCM_SHA384 0x030000A7 + +/* CCM ciphersuites from RFC6655 */ +# define TLS1_CK_RSA_WITH_AES_128_CCM 0x0300C09C +# define TLS1_CK_RSA_WITH_AES_256_CCM 0x0300C09D +# define TLS1_CK_DHE_RSA_WITH_AES_128_CCM 0x0300C09E +# define TLS1_CK_DHE_RSA_WITH_AES_256_CCM 0x0300C09F +# define TLS1_CK_RSA_WITH_AES_128_CCM_8 0x0300C0A0 +# define TLS1_CK_RSA_WITH_AES_256_CCM_8 0x0300C0A1 +# define TLS1_CK_DHE_RSA_WITH_AES_128_CCM_8 0x0300C0A2 +# define TLS1_CK_DHE_RSA_WITH_AES_256_CCM_8 0x0300C0A3 +# define TLS1_CK_PSK_WITH_AES_128_CCM 0x0300C0A4 +# define TLS1_CK_PSK_WITH_AES_256_CCM 0x0300C0A5 +# define TLS1_CK_DHE_PSK_WITH_AES_128_CCM 0x0300C0A6 +# define TLS1_CK_DHE_PSK_WITH_AES_256_CCM 0x0300C0A7 +# define TLS1_CK_PSK_WITH_AES_128_CCM_8 0x0300C0A8 +# define TLS1_CK_PSK_WITH_AES_256_CCM_8 0x0300C0A9 +# define TLS1_CK_DHE_PSK_WITH_AES_128_CCM_8 0x0300C0AA +# define TLS1_CK_DHE_PSK_WITH_AES_256_CCM_8 0x0300C0AB + +/* CCM ciphersuites from RFC7251 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM 0x0300C0AC +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM 0x0300C0AD +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM_8 0x0300C0AE +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM_8 0x0300C0AF + +/* TLS 1.2 Camellia SHA-256 ciphersuites from RFC5932 */ +# define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BA +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 0x030000BB +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BC +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 0x030000BD +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x030000BE +# define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA256 0x030000BF + +# define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C0 +# define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 0x030000C1 +# define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C2 +# define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 0x030000C3 +# define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0x030000C4 +# define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA256 0x030000C5 + +/* ECC ciphersuites from RFC4492 */ +# define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA 0x0300C001 +# define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA 0x0300C002 +# define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C003 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0x0300C004 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0x0300C005 + +# define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA 0x0300C006 +# define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA 0x0300C007 +# define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA 0x0300C008 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0x0300C009 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0x0300C00A + +# define TLS1_CK_ECDH_RSA_WITH_NULL_SHA 0x0300C00B +# define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA 0x0300C00C +# define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA 0x0300C00D +# define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA 0x0300C00E +# define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA 0x0300C00F + +# define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA 0x0300C010 +# define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA 0x0300C011 +# define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA 0x0300C012 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA 0x0300C013 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA 0x0300C014 + +# define TLS1_CK_ECDH_anon_WITH_NULL_SHA 0x0300C015 +# define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA 0x0300C016 +# define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA 0x0300C017 +# define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA 0x0300C018 +# define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA 0x0300C019 + +/* SRP ciphersuites from RFC 5054 */ +# define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA 0x0300C01A +# define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA 0x0300C01B +# define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA 0x0300C01C +# define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA 0x0300C01D +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA 0x0300C01E +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA 0x0300C01F +# define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA 0x0300C020 +# define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA 0x0300C021 +# define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA 0x0300C022 + +/* ECDH HMAC based ciphersuites from RFC5289 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256 0x0300C023 +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384 0x0300C024 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256 0x0300C025 +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384 0x0300C026 +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256 0x0300C027 +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384 0x0300C028 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256 0x0300C029 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384 0x0300C02A + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02B +# define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02C +# define TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0x0300C02D +# define TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0x0300C02E +# define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0x0300C02F +# define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0x0300C030 +# define TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256 0x0300C031 +# define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032 + +/* ECDHE PSK ciphersuites from RFC5489 */ +# define TLS1_CK_ECDHE_PSK_WITH_RC4_128_SHA 0x0300C033 +# define TLS1_CK_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0x0300C034 +# define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA 0x0300C035 +# define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA 0x0300C036 + +# define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0x0300C037 +# define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0x0300C038 + +/* NULL PSK ciphersuites from RFC4785 */ +# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA 0x0300C039 +# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA256 0x0300C03A +# define TLS1_CK_ECDHE_PSK_WITH_NULL_SHA384 0x0300C03B + +/* Camellia-CBC ciphersuites from RFC6367 */ +# define TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C072 +# define TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C073 +# define TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C074 +# define TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C075 +# define TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C076 +# define TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C077 +# define TLS1_CK_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0x0300C078 +# define TLS1_CK_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 0x0300C079 + +# define TLS1_CK_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C094 +# define TLS1_CK_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C095 +# define TLS1_CK_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C096 +# define TLS1_CK_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C097 +# define TLS1_CK_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C098 +# define TLS1_CK_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C099 +# define TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0x0300C09A +# define TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0x0300C09B + +/* draft-ietf-tls-chacha20-poly1305-03 */ +# define TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305 0x0300CCA8 +# define TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 0x0300CCA9 +# define TLS1_CK_DHE_RSA_WITH_CHACHA20_POLY1305 0x0300CCAA +# define TLS1_CK_PSK_WITH_CHACHA20_POLY1305 0x0300CCAB +# define TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305 0x0300CCAC +# define TLS1_CK_DHE_PSK_WITH_CHACHA20_POLY1305 0x0300CCAD +# define TLS1_CK_RSA_PSK_WITH_CHACHA20_POLY1305 0x0300CCAE + +/* TLS v1.3 ciphersuites */ +# define TLS1_3_CK_AES_128_GCM_SHA256 0x03001301 +# define TLS1_3_CK_AES_256_GCM_SHA384 0x03001302 +# define TLS1_3_CK_CHACHA20_POLY1305_SHA256 0x03001303 +# define TLS1_3_CK_AES_128_CCM_SHA256 0x03001304 +# define TLS1_3_CK_AES_128_CCM_8_SHA256 0x03001305 + +/* Aria ciphersuites from RFC6209 */ +# define TLS1_CK_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C050 +# define TLS1_CK_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C051 +# define TLS1_CK_DHE_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C052 +# define TLS1_CK_DHE_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C053 +# define TLS1_CK_DH_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C054 +# define TLS1_CK_DH_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C055 +# define TLS1_CK_DHE_DSS_WITH_ARIA_128_GCM_SHA256 0x0300C056 +# define TLS1_CK_DHE_DSS_WITH_ARIA_256_GCM_SHA384 0x0300C057 +# define TLS1_CK_DH_DSS_WITH_ARIA_128_GCM_SHA256 0x0300C058 +# define TLS1_CK_DH_DSS_WITH_ARIA_256_GCM_SHA384 0x0300C059 +# define TLS1_CK_DH_anon_WITH_ARIA_128_GCM_SHA256 0x0300C05A +# define TLS1_CK_DH_anon_WITH_ARIA_256_GCM_SHA384 0x0300C05B +# define TLS1_CK_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 0x0300C05C +# define TLS1_CK_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 0x0300C05D +# define TLS1_CK_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 0x0300C05E +# define TLS1_CK_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 0x0300C05F +# define TLS1_CK_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C060 +# define TLS1_CK_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C061 +# define TLS1_CK_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 0x0300C062 +# define TLS1_CK_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 0x0300C063 +# define TLS1_CK_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06A +# define TLS1_CK_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06B +# define TLS1_CK_DHE_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06C +# define TLS1_CK_DHE_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06D +# define TLS1_CK_RSA_PSK_WITH_ARIA_128_GCM_SHA256 0x0300C06E +# define TLS1_CK_RSA_PSK_WITH_ARIA_256_GCM_SHA384 0x0300C06F + +/* a bundle of RFC standard cipher names, generated from ssl3_ciphers[] */ +# define TLS1_RFC_RSA_WITH_AES_128_SHA "TLS_RSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_AES_128_SHA "TLS_DHE_DSS_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_SHA "TLS_DHE_RSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ADH_WITH_AES_128_SHA "TLS_DH_anon_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_RSA_WITH_AES_256_SHA "TLS_RSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_AES_256_SHA "TLS_DHE_DSS_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_SHA "TLS_DHE_RSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ADH_WITH_AES_256_SHA "TLS_DH_anon_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_RSA_WITH_NULL_SHA256 "TLS_RSA_WITH_NULL_SHA256" +# define TLS1_RFC_RSA_WITH_AES_128_SHA256 "TLS_RSA_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_RSA_WITH_AES_256_SHA256 "TLS_RSA_WITH_AES_256_CBC_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_AES_128_SHA256 "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_SHA256 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_AES_256_SHA256 "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_SHA256 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256" +# define TLS1_RFC_ADH_WITH_AES_128_SHA256 "TLS_DH_anon_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_ADH_WITH_AES_256_SHA256 "TLS_DH_anon_WITH_AES_256_CBC_SHA256" +# define TLS1_RFC_RSA_WITH_AES_128_GCM_SHA256 "TLS_RSA_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_RSA_WITH_AES_256_GCM_SHA384 "TLS_RSA_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_GCM_SHA256 "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_GCM_SHA384 "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_DHE_DSS_WITH_AES_128_GCM_SHA256 "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_AES_256_GCM_SHA384 "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_ADH_WITH_AES_128_GCM_SHA256 "TLS_DH_anon_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_ADH_WITH_AES_256_GCM_SHA384 "TLS_DH_anon_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_RSA_WITH_AES_128_CCM "TLS_RSA_WITH_AES_128_CCM" +# define TLS1_RFC_RSA_WITH_AES_256_CCM "TLS_RSA_WITH_AES_256_CCM" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_CCM "TLS_DHE_RSA_WITH_AES_128_CCM" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_CCM "TLS_DHE_RSA_WITH_AES_256_CCM" +# define TLS1_RFC_RSA_WITH_AES_128_CCM_8 "TLS_RSA_WITH_AES_128_CCM_8" +# define TLS1_RFC_RSA_WITH_AES_256_CCM_8 "TLS_RSA_WITH_AES_256_CCM_8" +# define TLS1_RFC_DHE_RSA_WITH_AES_128_CCM_8 "TLS_DHE_RSA_WITH_AES_128_CCM_8" +# define TLS1_RFC_DHE_RSA_WITH_AES_256_CCM_8 "TLS_DHE_RSA_WITH_AES_256_CCM_8" +# define TLS1_RFC_PSK_WITH_AES_128_CCM "TLS_PSK_WITH_AES_128_CCM" +# define TLS1_RFC_PSK_WITH_AES_256_CCM "TLS_PSK_WITH_AES_256_CCM" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_CCM "TLS_DHE_PSK_WITH_AES_128_CCM" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_CCM "TLS_DHE_PSK_WITH_AES_256_CCM" +# define TLS1_RFC_PSK_WITH_AES_128_CCM_8 "TLS_PSK_WITH_AES_128_CCM_8" +# define TLS1_RFC_PSK_WITH_AES_256_CCM_8 "TLS_PSK_WITH_AES_256_CCM_8" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_CCM_8 "TLS_PSK_DHE_WITH_AES_128_CCM_8" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_CCM_8 "TLS_PSK_DHE_WITH_AES_256_CCM_8" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CCM "TLS_ECDHE_ECDSA_WITH_AES_128_CCM" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CCM "TLS_ECDHE_ECDSA_WITH_AES_256_CCM" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CCM_8 "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CCM_8 "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8" +# define TLS1_3_RFC_AES_128_GCM_SHA256 "TLS_AES_128_GCM_SHA256" +# define TLS1_3_RFC_AES_256_GCM_SHA384 "TLS_AES_256_GCM_SHA384" +# define TLS1_3_RFC_CHACHA20_POLY1305_SHA256 "TLS_CHACHA20_POLY1305_SHA256" +# define TLS1_3_RFC_AES_128_CCM_SHA256 "TLS_AES_128_CCM_SHA256" +# define TLS1_3_RFC_AES_128_CCM_8_SHA256 "TLS_AES_128_CCM_8_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_NULL_SHA "TLS_ECDHE_ECDSA_WITH_NULL_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_NULL_SHA "TLS_ECDHE_RSA_WITH_NULL_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_DES_192_CBC3_SHA "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_CBC_SHA "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_CBC_SHA "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ECDH_anon_WITH_NULL_SHA "TLS_ECDH_anon_WITH_NULL_SHA" +# define TLS1_RFC_ECDH_anon_WITH_DES_192_CBC3_SHA "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_ECDH_anon_WITH_AES_128_CBC_SHA "TLS_ECDH_anon_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ECDH_anon_WITH_AES_256_CBC_SHA "TLS_ECDH_anon_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_SHA256 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_SHA384 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_SHA256 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_SHA384 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_PSK_WITH_NULL_SHA "TLS_PSK_WITH_NULL_SHA" +# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA "TLS_DHE_PSK_WITH_NULL_SHA" +# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA "TLS_RSA_PSK_WITH_NULL_SHA" +# define TLS1_RFC_PSK_WITH_3DES_EDE_CBC_SHA "TLS_PSK_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_PSK_WITH_AES_128_CBC_SHA "TLS_PSK_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_PSK_WITH_AES_256_CBC_SHA "TLS_PSK_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_DHE_PSK_WITH_3DES_EDE_CBC_SHA "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_CBC_SHA "TLS_DHE_PSK_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_CBC_SHA "TLS_DHE_PSK_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_RSA_PSK_WITH_3DES_EDE_CBC_SHA "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_RSA_PSK_WITH_AES_128_CBC_SHA "TLS_RSA_PSK_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_RSA_PSK_WITH_AES_256_CBC_SHA "TLS_RSA_PSK_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_PSK_WITH_AES_128_GCM_SHA256 "TLS_PSK_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_PSK_WITH_AES_256_GCM_SHA384 "TLS_PSK_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_GCM_SHA256 "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_GCM_SHA384 "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_AES_128_GCM_SHA256 "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_AES_256_GCM_SHA384 "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384" +# define TLS1_RFC_PSK_WITH_AES_128_CBC_SHA256 "TLS_PSK_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_PSK_WITH_AES_256_CBC_SHA384 "TLS_PSK_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_PSK_WITH_NULL_SHA256 "TLS_PSK_WITH_NULL_SHA256" +# define TLS1_RFC_PSK_WITH_NULL_SHA384 "TLS_PSK_WITH_NULL_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_AES_128_CBC_SHA256 "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_AES_256_CBC_SHA384 "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA256 "TLS_DHE_PSK_WITH_NULL_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_NULL_SHA384 "TLS_DHE_PSK_WITH_NULL_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_AES_128_CBC_SHA256 "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_AES_256_CBC_SHA384 "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA256 "TLS_RSA_PSK_WITH_NULL_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_NULL_SHA384 "TLS_RSA_PSK_WITH_NULL_SHA384" +# define TLS1_RFC_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_AES_128_CBC_SHA "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_AES_256_CBC_SHA "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_AES_128_CBC_SHA256 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_PSK_WITH_AES_256_CBC_SHA384 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA "TLS_ECDHE_PSK_WITH_NULL_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA256 "TLS_ECDHE_PSK_WITH_NULL_SHA256" +# define TLS1_RFC_ECDHE_PSK_WITH_NULL_SHA384 "TLS_ECDHE_PSK_WITH_NULL_SHA384" +# define TLS1_RFC_SRP_SHA_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA" +# define TLS1_RFC_SRP_SHA_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA" +# define TLS1_RFC_SRP_SHA_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_CHACHA20_POLY1305 "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_CHACHA20_POLY1305 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_PSK_WITH_CHACHA20_POLY1305 "TLS_PSK_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_ECDHE_PSK_WITH_CHACHA20_POLY1305 "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_CHACHA20_POLY1305 "TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_CHACHA20_POLY1305 "TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256" +# define TLS1_RFC_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_ADH_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_RSA_WITH_CAMELLIA_256_CBC_SHA256 "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256" +# define TLS1_RFC_ADH_WITH_CAMELLIA_256_CBC_SHA256 "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256" +# define TLS1_RFC_RSA_WITH_CAMELLIA_256_CBC_SHA "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA" +# define TLS1_RFC_ADH_WITH_CAMELLIA_256_CBC_SHA "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA" +# define TLS1_RFC_RSA_WITH_CAMELLIA_128_CBC_SHA "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA" +# define TLS1_RFC_ADH_WITH_CAMELLIA_128_CBC_SHA "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256" +# define TLS1_RFC_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384" +# define TLS1_RFC_RSA_WITH_SEED_SHA "TLS_RSA_WITH_SEED_CBC_SHA" +# define TLS1_RFC_DHE_DSS_WITH_SEED_SHA "TLS_DHE_DSS_WITH_SEED_CBC_SHA" +# define TLS1_RFC_DHE_RSA_WITH_SEED_SHA "TLS_DHE_RSA_WITH_SEED_CBC_SHA" +# define TLS1_RFC_ADH_WITH_SEED_SHA "TLS_DH_anon_WITH_SEED_CBC_SHA" +# define TLS1_RFC_ECDHE_PSK_WITH_RC4_128_SHA "TLS_ECDHE_PSK_WITH_RC4_128_SHA" +# define TLS1_RFC_ECDH_anon_WITH_RC4_128_SHA "TLS_ECDH_anon_WITH_RC4_128_SHA" +# define TLS1_RFC_ECDHE_ECDSA_WITH_RC4_128_SHA "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA" +# define TLS1_RFC_ECDHE_RSA_WITH_RC4_128_SHA "TLS_ECDHE_RSA_WITH_RC4_128_SHA" +# define TLS1_RFC_PSK_WITH_RC4_128_SHA "TLS_PSK_WITH_RC4_128_SHA" +# define TLS1_RFC_RSA_PSK_WITH_RC4_128_SHA "TLS_RSA_PSK_WITH_RC4_128_SHA" +# define TLS1_RFC_DHE_PSK_WITH_RC4_128_SHA "TLS_DHE_PSK_WITH_RC4_128_SHA" +# define TLS1_RFC_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DHE_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DHE_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DH_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DH_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DHE_DSS_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DHE_DSS_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DH_DSS_WITH_ARIA_128_GCM_SHA256 "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DH_DSS_WITH_ARIA_256_GCM_SHA384 "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DH_anon_WITH_ARIA_128_GCM_SHA256 "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DH_anon_WITH_ARIA_256_GCM_SHA384 "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_PSK_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_PSK_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_DHE_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_DHE_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384" +# define TLS1_RFC_RSA_PSK_WITH_ARIA_128_GCM_SHA256 "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256" +# define TLS1_RFC_RSA_PSK_WITH_ARIA_256_GCM_SHA384 "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384" + + +/* + * XXX Backward compatibility alert: Older versions of OpenSSL gave some DHE + * ciphers names with "EDH" instead of "DHE". Going forward, we should be + * using DHE everywhere, though we may indefinitely maintain aliases for + * users or configurations that used "EDH" + */ +# define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA "DHE-DSS-RC4-SHA" + +# define TLS1_TXT_PSK_WITH_NULL_SHA "PSK-NULL-SHA" +# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA "DHE-PSK-NULL-SHA" +# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA "RSA-PSK-NULL-SHA" + +/* AES ciphersuites from RFC3268 */ +# define TLS1_TXT_RSA_WITH_AES_128_SHA "AES128-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA "DH-DSS-AES128-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA "DH-RSA-AES128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA "DHE-DSS-AES128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA "DHE-RSA-AES128-SHA" +# define TLS1_TXT_ADH_WITH_AES_128_SHA "ADH-AES128-SHA" + +# define TLS1_TXT_RSA_WITH_AES_256_SHA "AES256-SHA" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA "DH-DSS-AES256-SHA" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA "DH-RSA-AES256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA "DHE-DSS-AES256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA "DHE-RSA-AES256-SHA" +# define TLS1_TXT_ADH_WITH_AES_256_SHA "ADH-AES256-SHA" + +/* ECC ciphersuites from RFC4492 */ +# define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA "ECDH-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA "ECDH-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA "ECDH-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA "ECDH-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA "ECDH-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA "ECDHE-ECDSA-NULL-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA "ECDHE-ECDSA-RC4-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA "ECDHE-ECDSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA "ECDHE-ECDSA-AES128-SHA" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA "ECDHE-ECDSA-AES256-SHA" + +# define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA "ECDH-RSA-NULL-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA "ECDH-RSA-RC4-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA "ECDH-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA "ECDH-RSA-AES128-SHA" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA "ECDH-RSA-AES256-SHA" + +# define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA "ECDHE-RSA-NULL-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA "ECDHE-RSA-RC4-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA "ECDHE-RSA-DES-CBC3-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA "ECDHE-RSA-AES256-SHA" + +# define TLS1_TXT_ECDH_anon_WITH_NULL_SHA "AECDH-NULL-SHA" +# define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA "AECDH-RC4-SHA" +# define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA "AECDH-DES-CBC3-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA "AECDH-AES128-SHA" +# define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA "AECDH-AES256-SHA" + +/* PSK ciphersuites from RFC 4279 */ +# define TLS1_TXT_PSK_WITH_RC4_128_SHA "PSK-RC4-SHA" +# define TLS1_TXT_PSK_WITH_3DES_EDE_CBC_SHA "PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA" +# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA" + +# define TLS1_TXT_DHE_PSK_WITH_RC4_128_SHA "DHE-PSK-RC4-SHA" +# define TLS1_TXT_DHE_PSK_WITH_3DES_EDE_CBC_SHA "DHE-PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_DHE_PSK_WITH_AES_128_CBC_SHA "DHE-PSK-AES128-CBC-SHA" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_CBC_SHA "DHE-PSK-AES256-CBC-SHA" +# define TLS1_TXT_RSA_PSK_WITH_RC4_128_SHA "RSA-PSK-RC4-SHA" +# define TLS1_TXT_RSA_PSK_WITH_3DES_EDE_CBC_SHA "RSA-PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA "RSA-PSK-AES128-CBC-SHA" +# define TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA "RSA-PSK-AES256-CBC-SHA" + +/* PSK ciphersuites from RFC 5487 */ +# define TLS1_TXT_PSK_WITH_AES_128_GCM_SHA256 "PSK-AES128-GCM-SHA256" +# define TLS1_TXT_PSK_WITH_AES_256_GCM_SHA384 "PSK-AES256-GCM-SHA384" +# define TLS1_TXT_DHE_PSK_WITH_AES_128_GCM_SHA256 "DHE-PSK-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_GCM_SHA384 "DHE-PSK-AES256-GCM-SHA384" +# define TLS1_TXT_RSA_PSK_WITH_AES_128_GCM_SHA256 "RSA-PSK-AES128-GCM-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_AES_256_GCM_SHA384 "RSA-PSK-AES256-GCM-SHA384" + +# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA256 "PSK-AES128-CBC-SHA256" +# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA384 "PSK-AES256-CBC-SHA384" +# define TLS1_TXT_PSK_WITH_NULL_SHA256 "PSK-NULL-SHA256" +# define TLS1_TXT_PSK_WITH_NULL_SHA384 "PSK-NULL-SHA384" + +# define TLS1_TXT_DHE_PSK_WITH_AES_128_CBC_SHA256 "DHE-PSK-AES128-CBC-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_CBC_SHA384 "DHE-PSK-AES256-CBC-SHA384" +# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA256 "DHE-PSK-NULL-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_NULL_SHA384 "DHE-PSK-NULL-SHA384" + +# define TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA256 "RSA-PSK-AES128-CBC-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA384 "RSA-PSK-AES256-CBC-SHA384" +# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA256 "RSA-PSK-NULL-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_NULL_SHA384 "RSA-PSK-NULL-SHA384" + +/* SRP ciphersuite from RFC 5054 */ +# define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA "SRP-DSS-3DES-EDE-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA "SRP-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA "SRP-RSA-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA "SRP-DSS-AES-128-CBC-SHA" +# define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA "SRP-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA "SRP-RSA-AES-256-CBC-SHA" +# define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA "SRP-DSS-AES-256-CBC-SHA" + +/* Camellia ciphersuites from RFC4132 */ +# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA "CAMELLIA128-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA "DH-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA "DH-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA "DHE-DSS-CAMELLIA128-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA "DHE-RSA-CAMELLIA128-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA "ADH-CAMELLIA128-SHA" + +# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA "CAMELLIA256-SHA" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA "DH-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA "DH-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA "DHE-DSS-CAMELLIA256-SHA" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA "DHE-RSA-CAMELLIA256-SHA" +# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA "ADH-CAMELLIA256-SHA" + +/* TLS 1.2 Camellia SHA-256 ciphersuites from RFC5932 */ +# define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA256 "CAMELLIA128-SHA256" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 "DH-DSS-CAMELLIA128-SHA256" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 "DH-RSA-CAMELLIA128-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 "DHE-DSS-CAMELLIA128-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "DHE-RSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA256 "ADH-CAMELLIA128-SHA256" + +# define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA256 "CAMELLIA256-SHA256" +# define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 "DH-DSS-CAMELLIA256-SHA256" +# define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 "DH-RSA-CAMELLIA256-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 "DHE-DSS-CAMELLIA256-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 "DHE-RSA-CAMELLIA256-SHA256" +# define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA256 "ADH-CAMELLIA256-SHA256" + +# define TLS1_TXT_PSK_WITH_CAMELLIA_128_CBC_SHA256 "PSK-CAMELLIA128-SHA256" +# define TLS1_TXT_PSK_WITH_CAMELLIA_256_CBC_SHA384 "PSK-CAMELLIA256-SHA384" +# define TLS1_TXT_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "DHE-PSK-CAMELLIA128-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "DHE-PSK-CAMELLIA256-SHA384" +# define TLS1_TXT_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 "RSA-PSK-CAMELLIA128-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 "RSA-PSK-CAMELLIA256-SHA384" +# define TLS1_TXT_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-PSK-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-PSK-CAMELLIA256-SHA384" + +/* SEED ciphersuites from RFC4162 */ +# define TLS1_TXT_RSA_WITH_SEED_SHA "SEED-SHA" +# define TLS1_TXT_DH_DSS_WITH_SEED_SHA "DH-DSS-SEED-SHA" +# define TLS1_TXT_DH_RSA_WITH_SEED_SHA "DH-RSA-SEED-SHA" +# define TLS1_TXT_DHE_DSS_WITH_SEED_SHA "DHE-DSS-SEED-SHA" +# define TLS1_TXT_DHE_RSA_WITH_SEED_SHA "DHE-RSA-SEED-SHA" +# define TLS1_TXT_ADH_WITH_SEED_SHA "ADH-SEED-SHA" + +/* TLS v1.2 ciphersuites */ +# define TLS1_TXT_RSA_WITH_NULL_SHA256 "NULL-SHA256" +# define TLS1_TXT_RSA_WITH_AES_128_SHA256 "AES128-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_SHA256 "AES256-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_128_SHA256 "DH-DSS-AES128-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_128_SHA256 "DH-RSA-AES128-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA256 "DHE-DSS-AES128-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256 "DHE-RSA-AES128-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_SHA256 "DH-DSS-AES256-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_SHA256 "DH-RSA-AES256-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA256 "DHE-DSS-AES256-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256 "DHE-RSA-AES256-SHA256" +# define TLS1_TXT_ADH_WITH_AES_128_SHA256 "ADH-AES128-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_SHA256 "ADH-AES256-SHA256" + +/* TLS v1.2 GCM ciphersuites from RFC5288 */ +# define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256 "AES128-GCM-SHA256" +# define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384 "AES256-GCM-SHA384" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256 "DHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384 "DHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DH_RSA_WITH_AES_128_GCM_SHA256 "DH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_DH_RSA_WITH_AES_256_GCM_SHA384 "DH-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_DHE_DSS_WITH_AES_128_GCM_SHA256 "DHE-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_AES_256_GCM_SHA384 "DHE-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_DH_DSS_WITH_AES_128_GCM_SHA256 "DH-DSS-AES128-GCM-SHA256" +# define TLS1_TXT_DH_DSS_WITH_AES_256_GCM_SHA384 "DH-DSS-AES256-GCM-SHA384" +# define TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256 "ADH-AES128-GCM-SHA256" +# define TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384 "ADH-AES256-GCM-SHA384" + +/* CCM ciphersuites from RFC6655 */ +# define TLS1_TXT_RSA_WITH_AES_128_CCM "AES128-CCM" +# define TLS1_TXT_RSA_WITH_AES_256_CCM "AES256-CCM" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_CCM "DHE-RSA-AES128-CCM" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_CCM "DHE-RSA-AES256-CCM" + +# define TLS1_TXT_RSA_WITH_AES_128_CCM_8 "AES128-CCM8" +# define TLS1_TXT_RSA_WITH_AES_256_CCM_8 "AES256-CCM8" +# define TLS1_TXT_DHE_RSA_WITH_AES_128_CCM_8 "DHE-RSA-AES128-CCM8" +# define TLS1_TXT_DHE_RSA_WITH_AES_256_CCM_8 "DHE-RSA-AES256-CCM8" + +# define TLS1_TXT_PSK_WITH_AES_128_CCM "PSK-AES128-CCM" +# define TLS1_TXT_PSK_WITH_AES_256_CCM "PSK-AES256-CCM" +# define TLS1_TXT_DHE_PSK_WITH_AES_128_CCM "DHE-PSK-AES128-CCM" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_CCM "DHE-PSK-AES256-CCM" + +# define TLS1_TXT_PSK_WITH_AES_128_CCM_8 "PSK-AES128-CCM8" +# define TLS1_TXT_PSK_WITH_AES_256_CCM_8 "PSK-AES256-CCM8" +# define TLS1_TXT_DHE_PSK_WITH_AES_128_CCM_8 "DHE-PSK-AES128-CCM8" +# define TLS1_TXT_DHE_PSK_WITH_AES_256_CCM_8 "DHE-PSK-AES256-CCM8" + +/* CCM ciphersuites from RFC7251 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CCM "ECDHE-ECDSA-AES128-CCM" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CCM "ECDHE-ECDSA-AES256-CCM" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CCM_8 "ECDHE-ECDSA-AES128-CCM8" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CCM_8 "ECDHE-ECDSA-AES256-CCM8" + +/* ECDH HMAC based ciphersuites from RFC5289 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256 "ECDHE-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384 "ECDHE-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_SHA256 "ECDH-ECDSA-AES128-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_SHA384 "ECDH-ECDSA-AES256-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256 "ECDHE-RSA-AES128-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384 "ECDHE-RSA-AES256-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_SHA256 "ECDH-RSA-AES128-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_SHA384 "ECDH-RSA-AES256-SHA384" + +/* ECDH GCM based ciphersuites from RFC5289 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "ECDHE-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "ECDHE-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 "ECDH-ECDSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 "ECDH-ECDSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "ECDHE-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "ECDHE-RSA-AES256-GCM-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_AES_128_GCM_SHA256 "ECDH-RSA-AES128-GCM-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384" + +/* TLS v1.2 PSK GCM ciphersuites from RFC5487 */ +# define TLS1_TXT_PSK_WITH_AES_128_GCM_SHA256 "PSK-AES128-GCM-SHA256" +# define TLS1_TXT_PSK_WITH_AES_256_GCM_SHA384 "PSK-AES256-GCM-SHA384" + +/* ECDHE PSK ciphersuites from RFC 5489 */ +# define TLS1_TXT_ECDHE_PSK_WITH_RC4_128_SHA "ECDHE-PSK-RC4-SHA" +# define TLS1_TXT_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA "ECDHE-PSK-3DES-EDE-CBC-SHA" +# define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA "ECDHE-PSK-AES128-CBC-SHA" +# define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA "ECDHE-PSK-AES256-CBC-SHA" + +# define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA256 "ECDHE-PSK-AES128-CBC-SHA256" +# define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA384 "ECDHE-PSK-AES256-CBC-SHA384" + +# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA "ECDHE-PSK-NULL-SHA" +# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA256 "ECDHE-PSK-NULL-SHA256" +# define TLS1_TXT_ECDHE_PSK_WITH_NULL_SHA384 "ECDHE-PSK-NULL-SHA384" + +/* Camellia-CBC ciphersuites from RFC6367 */ +# define TLS1_TXT_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-ECDSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-ECDSA-CAMELLIA256-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDH-ECDSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDH-ECDSA-CAMELLIA256-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDHE-RSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDHE-RSA-CAMELLIA256-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 "ECDH-RSA-CAMELLIA128-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 "ECDH-RSA-CAMELLIA256-SHA384" + +/* draft-ietf-tls-chacha20-poly1305-03 */ +# define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 "ECDHE-RSA-CHACHA20-POLY1305" +# define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "ECDHE-ECDSA-CHACHA20-POLY1305" +# define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 "DHE-RSA-CHACHA20-POLY1305" +# define TLS1_TXT_PSK_WITH_CHACHA20_POLY1305 "PSK-CHACHA20-POLY1305" +# define TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305 "ECDHE-PSK-CHACHA20-POLY1305" +# define TLS1_TXT_DHE_PSK_WITH_CHACHA20_POLY1305 "DHE-PSK-CHACHA20-POLY1305" +# define TLS1_TXT_RSA_PSK_WITH_CHACHA20_POLY1305 "RSA-PSK-CHACHA20-POLY1305" + +/* Aria ciphersuites from RFC6209 */ +# define TLS1_TXT_RSA_WITH_ARIA_128_GCM_SHA256 "ARIA128-GCM-SHA256" +# define TLS1_TXT_RSA_WITH_ARIA_256_GCM_SHA384 "ARIA256-GCM-SHA384" +# define TLS1_TXT_DHE_RSA_WITH_ARIA_128_GCM_SHA256 "DHE-RSA-ARIA128-GCM-SHA256" +# define TLS1_TXT_DHE_RSA_WITH_ARIA_256_GCM_SHA384 "DHE-RSA-ARIA256-GCM-SHA384" +# define TLS1_TXT_DH_RSA_WITH_ARIA_128_GCM_SHA256 "DH-RSA-ARIA128-GCM-SHA256" +# define TLS1_TXT_DH_RSA_WITH_ARIA_256_GCM_SHA384 "DH-RSA-ARIA256-GCM-SHA384" +# define TLS1_TXT_DHE_DSS_WITH_ARIA_128_GCM_SHA256 "DHE-DSS-ARIA128-GCM-SHA256" +# define TLS1_TXT_DHE_DSS_WITH_ARIA_256_GCM_SHA384 "DHE-DSS-ARIA256-GCM-SHA384" +# define TLS1_TXT_DH_DSS_WITH_ARIA_128_GCM_SHA256 "DH-DSS-ARIA128-GCM-SHA256" +# define TLS1_TXT_DH_DSS_WITH_ARIA_256_GCM_SHA384 "DH-DSS-ARIA256-GCM-SHA384" +# define TLS1_TXT_DH_anon_WITH_ARIA_128_GCM_SHA256 "ADH-ARIA128-GCM-SHA256" +# define TLS1_TXT_DH_anon_WITH_ARIA_256_GCM_SHA384 "ADH-ARIA256-GCM-SHA384" +# define TLS1_TXT_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 "ECDHE-ECDSA-ARIA128-GCM-SHA256" +# define TLS1_TXT_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 "ECDHE-ECDSA-ARIA256-GCM-SHA384" +# define TLS1_TXT_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 "ECDH-ECDSA-ARIA128-GCM-SHA256" +# define TLS1_TXT_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 "ECDH-ECDSA-ARIA256-GCM-SHA384" +# define TLS1_TXT_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 "ECDHE-ARIA128-GCM-SHA256" +# define TLS1_TXT_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 "ECDHE-ARIA256-GCM-SHA384" +# define TLS1_TXT_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 "ECDH-ARIA128-GCM-SHA256" +# define TLS1_TXT_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 "ECDH-ARIA256-GCM-SHA384" +# define TLS1_TXT_PSK_WITH_ARIA_128_GCM_SHA256 "PSK-ARIA128-GCM-SHA256" +# define TLS1_TXT_PSK_WITH_ARIA_256_GCM_SHA384 "PSK-ARIA256-GCM-SHA384" +# define TLS1_TXT_DHE_PSK_WITH_ARIA_128_GCM_SHA256 "DHE-PSK-ARIA128-GCM-SHA256" +# define TLS1_TXT_DHE_PSK_WITH_ARIA_256_GCM_SHA384 "DHE-PSK-ARIA256-GCM-SHA384" +# define TLS1_TXT_RSA_PSK_WITH_ARIA_128_GCM_SHA256 "RSA-PSK-ARIA128-GCM-SHA256" +# define TLS1_TXT_RSA_PSK_WITH_ARIA_256_GCM_SHA384 "RSA-PSK-ARIA256-GCM-SHA384" + +# define TLS_CT_RSA_SIGN 1 +# define TLS_CT_DSS_SIGN 2 +# define TLS_CT_RSA_FIXED_DH 3 +# define TLS_CT_DSS_FIXED_DH 4 +# define TLS_CT_ECDSA_SIGN 64 +# define TLS_CT_RSA_FIXED_ECDH 65 +# define TLS_CT_ECDSA_FIXED_ECDH 66 +# define TLS_CT_GOST01_SIGN 22 +# define TLS_CT_GOST12_IANA_SIGN 67 +# define TLS_CT_GOST12_IANA_512_SIGN 68 +# define TLS_CT_GOST12_LEGACY_SIGN 238 +# define TLS_CT_GOST12_LEGACY_512_SIGN 239 + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define TLS_CT_GOST12_SIGN TLS_CT_GOST12_LEGACY_SIGN +# define TLS_CT_GOST12_512_SIGN TLS_CT_GOST12_LEGACY_512_SIGN +# endif + +/* + * when correcting this number, correct also SSL3_CT_NUMBER in ssl3.h (see + * comment there) + */ +# define TLS_CT_NUMBER 12 + +# if defined(SSL3_CT_NUMBER) +# if TLS_CT_NUMBER != SSL3_CT_NUMBER +# error "SSL/TLS CT_NUMBER values do not match" +# endif +# endif + +# define TLS1_FINISH_MAC_LENGTH 12 + +# define TLS_MD_MAX_CONST_SIZE 22 +# define TLS_MD_CLIENT_FINISH_CONST "client finished" +# define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 +# define TLS_MD_SERVER_FINISH_CONST "server finished" +# define TLS_MD_SERVER_FINISH_CONST_SIZE 15 +# define TLS_MD_KEY_EXPANSION_CONST "key expansion" +# define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 +# define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" +# define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" +# define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 +# define TLS_MD_IV_BLOCK_CONST "IV block" +# define TLS_MD_IV_BLOCK_CONST_SIZE 8 +# define TLS_MD_MASTER_SECRET_CONST "master secret" +# define TLS_MD_MASTER_SECRET_CONST_SIZE 13 +# define TLS_MD_EXTENDED_MASTER_SECRET_CONST "extended master secret" +# define TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE 22 + +# ifdef CHARSET_EBCDIC +# undef TLS_MD_CLIENT_FINISH_CONST +/* + * client finished + */ +# define TLS_MD_CLIENT_FINISH_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_FINISH_CONST +/* + * server finished + */ +# define TLS_MD_SERVER_FINISH_CONST "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_KEY_EXPANSION_CONST +/* + * key expansion + */ +# define TLS_MD_KEY_EXPANSION_CONST "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e" + +# undef TLS_MD_CLIENT_WRITE_KEY_CONST +/* + * client write key + */ +# define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_SERVER_WRITE_KEY_CONST +/* + * server write key + */ +# define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79" + +# undef TLS_MD_IV_BLOCK_CONST +/* + * IV block + */ +# define TLS_MD_IV_BLOCK_CONST "\x49\x56\x20\x62\x6c\x6f\x63\x6b" + +# undef TLS_MD_MASTER_SECRET_CONST +/* + * master secret + */ +# define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" +# undef TLS_MD_EXTENDED_MASTER_SECRET_CONST +/* + * extended master secret + */ +# define TLS_MD_EXTENDED_MASTER_SECRET_CONST "\x65\x78\x74\x65\x6e\x64\x65\x64\x20\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" +# endif + +/* TLS Session Ticket extension struct */ +struct tls_session_ticket_ext_st { + unsigned short length; + void *data; +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/trace.h b/OtherInc/openssl/include/openssl/trace.h new file mode 100644 index 0000000..2820013 --- /dev/null +++ b/OtherInc/openssl/include/openssl/trace.h @@ -0,0 +1,312 @@ +/* + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_TRACE_H +# define OPENSSL_TRACE_H +# pragma once + +# include + +# include + +# ifdef __cplusplus +extern "C" { +# endif + +/* + * TRACE CATEGORIES + */ + +/* + * The trace messages of the OpenSSL libraries are organized into different + * categories. For every trace category, the application can register a separate + * tracer callback. When a callback is registered, a so called trace channel is + * created for this category. This channel consists essentially of an internal + * BIO which sends all trace output it receives to the registered application + * callback. + * + * The ALL category can be used as a fallback category to register a single + * channel which receives the output from all categories. However, if the + * application intends to print the trace channel name in the line prefix, + * it is better to register channels for all categories separately. + * (This is how the openssl application does it.) + */ +# define OSSL_TRACE_CATEGORY_ALL 0 /* The fallback */ +# define OSSL_TRACE_CATEGORY_TRACE 1 +# define OSSL_TRACE_CATEGORY_INIT 2 +# define OSSL_TRACE_CATEGORY_TLS 3 +# define OSSL_TRACE_CATEGORY_TLS_CIPHER 4 +# define OSSL_TRACE_CATEGORY_CONF 5 +# ifndef OPENSSL_NO_ENGINE +# define OSSL_TRACE_CATEGORY_ENGINE_TABLE 6 +# define OSSL_TRACE_CATEGORY_ENGINE_REF_COUNT 7 +# endif +# define OSSL_TRACE_CATEGORY_PKCS5V2 8 +# define OSSL_TRACE_CATEGORY_PKCS12_KEYGEN 9 +# define OSSL_TRACE_CATEGORY_PKCS12_DECRYPT 10 +# define OSSL_TRACE_CATEGORY_X509V3_POLICY 11 +# define OSSL_TRACE_CATEGORY_BN_CTX 12 +# define OSSL_TRACE_CATEGORY_CMP 13 +# define OSSL_TRACE_CATEGORY_STORE 14 +# define OSSL_TRACE_CATEGORY_DECODER 15 +# define OSSL_TRACE_CATEGORY_ENCODER 16 +# define OSSL_TRACE_CATEGORY_REF_COUNT 17 +/* Count of available categories. */ +# define OSSL_TRACE_CATEGORY_NUM 18 + +/* Returns the trace category number for the given |name| */ +int OSSL_trace_get_category_num(const char *name); + +/* Returns the trace category name for the given |num| */ +const char *OSSL_trace_get_category_name(int num); + +/* + * TRACE CONSUMERS + */ + +/* + * Enables tracing for the given |category| by providing a BIO sink + * as |channel|. If a null pointer is passed as |channel|, an existing + * trace channel is removed and tracing for the category is disabled. + * + * Returns 1 on success and 0 on failure + */ +int OSSL_trace_set_channel(int category, BIO* channel); + +/* + * Attach a prefix and a suffix to the given |category|, to be printed at the + * beginning and at the end of each trace output group, i.e. when + * OSSL_trace_begin() and OSSL_trace_end() are called. + * If a null pointer is passed as argument, the existing prefix or suffix is + * removed. + * + * They return 1 on success and 0 on failure + */ +int OSSL_trace_set_prefix(int category, const char *prefix); +int OSSL_trace_set_suffix(int category, const char *suffix); + +/* + * OSSL_trace_cb is the type tracing callback provided by the application. + * It MUST return the number of bytes written, or 0 on error (in other words, + * it can never write zero bytes). + * + * The |buffer| will always contain text, which may consist of several lines. + * The |data| argument points to whatever data was provided by the application + * when registering the tracer function. + * + * The |category| number is given, as well as a |cmd| number, described below. + */ +typedef size_t (*OSSL_trace_cb)(const char *buffer, size_t count, + int category, int cmd, void *data); +/* + * Possible |cmd| numbers. + */ +# define OSSL_TRACE_CTRL_BEGIN 0 +# define OSSL_TRACE_CTRL_WRITE 1 +# define OSSL_TRACE_CTRL_END 2 + +/* + * Enables tracing for the given |category| by creating an internal + * trace channel which sends the output to the given |callback|. + * If a null pointer is passed as callback, an existing trace channel + * is removed and tracing for the category is disabled. + * + * NOTE: OSSL_trace_set_channel() and OSSL_trace_set_callback() are mutually + * exclusive. + * + * Returns 1 on success and 0 on failure + */ +int OSSL_trace_set_callback(int category, OSSL_trace_cb callback, void *data); + +/* + * TRACE PRODUCERS + */ + +/* + * Returns 1 if tracing for the specified category is enabled, otherwise 0 + */ +int OSSL_trace_enabled(int category); + +/* + * Wrap a group of tracing output calls. OSSL_trace_begin() locks tracing and + * returns the trace channel associated with the given category, or NULL if no + * channel is associated with the category. OSSL_trace_end() unlocks tracing. + * + * Usage: + * + * BIO *out; + * if ((out = OSSL_trace_begin(category)) != NULL) { + * ... + * BIO_fprintf(out, ...); + * ... + * OSSL_trace_end(category, out); + * } + * + * See also the convenience macros OSSL_TRACE_BEGIN and OSSL_TRACE_END below. + */ +BIO *OSSL_trace_begin(int category); +void OSSL_trace_end(int category, BIO *channel); + +/* + * OSSL_TRACE* Convenience Macros + */ + +/* + * When the tracing feature is disabled, these macros are defined to + * produce dead code, which a good compiler should eliminate. + */ + +/* + * OSSL_TRACE_BEGIN, OSSL_TRACE_END - Define a Trace Group + * + * These two macros can be used to create a block which is executed only + * if the corresponding trace category is enabled. Inside this block, a + * local variable named |trc_out| is defined, which points to the channel + * associated with the given trace category. + * + * Usage: (using 'TLS' as an example category) + * + * OSSL_TRACE_BEGIN(TLS) { + * + * BIO_fprintf(trc_out, ... ); + * + * } OSSL_TRACE_END(TLS); + * + * + * This expands to the following code + * + * do { + * BIO *trc_out = OSSL_trace_begin(OSSL_TRACE_CATEGORY_TLS); + * if (trc_out != NULL) { + * ... + * BIO_fprintf(trc_out, ...); + * } + * OSSL_trace_end(OSSL_TRACE_CATEGORY_TLS, trc_out); + * } while (0); + * + * The use of the inner '{...}' group and the trailing ';' is enforced + * by the definition of the macros in order to make the code look as much + * like C code as possible. + * + * Before returning from inside the trace block, it is necessary to + * call OSSL_TRACE_CANCEL(category). + */ + +# if !defined OPENSSL_NO_TRACE && !defined FIPS_MODULE + +# define OSSL_TRACE_BEGIN(category) \ + do { \ + BIO *trc_out = OSSL_trace_begin(OSSL_TRACE_CATEGORY_##category); \ + \ + if (trc_out != NULL) + +# define OSSL_TRACE_END(category) \ + OSSL_trace_end(OSSL_TRACE_CATEGORY_##category, trc_out); \ + } while (0) + +# define OSSL_TRACE_CANCEL(category) \ + OSSL_trace_end(OSSL_TRACE_CATEGORY_##category, trc_out) \ + +# else + +# define OSSL_TRACE_BEGIN(category) \ + do { \ + BIO *trc_out = NULL; \ + if (0) + +# define OSSL_TRACE_END(category) \ + } while(0) + +# define OSSL_TRACE_CANCEL(category) \ + ((void)0) + +# endif + +/* + * OSSL_TRACE_ENABLED() - Check whether tracing is enabled for |category| + * + * Usage: + * + * if (OSSL_TRACE_ENABLED(TLS)) { + * ... + * } + */ +# if !defined OPENSSL_NO_TRACE && !defined FIPS_MODULE + +# define OSSL_TRACE_ENABLED(category) \ + OSSL_trace_enabled(OSSL_TRACE_CATEGORY_##category) + +# else + +# define OSSL_TRACE_ENABLED(category) (0) + +# endif + +/* + * OSSL_TRACE*() - OneShot Trace Macros + * + * These macros are intended to produce a simple printf-style trace output. + * Unfortunately, C90 macros don't support variable arguments, so the + * "vararg" OSSL_TRACEV() macro has a rather weird usage pattern: + * + * OSSL_TRACEV(category, (trc_out, "format string", ...args...)); + * + * Where 'channel' is the literal symbol of this name, not a variable. + * For that reason, it is currently not intended to be used directly, + * but only as helper macro for the other oneshot trace macros + * OSSL_TRACE(), OSSL_TRACE1(), OSSL_TRACE2(), ... + * + * Usage: + * + * OSSL_TRACE(INIT, "Hello world!\n"); + * OSSL_TRACE1(TLS, "The answer is %d\n", 42); + * OSSL_TRACE2(TLS, "The ultimate question to answer %d is '%s'\n", + * 42, "What do you get when you multiply six by nine?"); + */ + +# if !defined OPENSSL_NO_TRACE && !defined FIPS_MODULE + +# define OSSL_TRACEV(category, args) \ + OSSL_TRACE_BEGIN(category) \ + BIO_printf args; \ + OSSL_TRACE_END(category) + +# else + +# define OSSL_TRACEV(category, args) ((void)0) + +# endif + +# define OSSL_TRACE(category, text) \ + OSSL_TRACEV(category, (trc_out, "%s", text)) + +# define OSSL_TRACE1(category, format, arg1) \ + OSSL_TRACEV(category, (trc_out, format, arg1)) +# define OSSL_TRACE2(category, format, arg1, arg2) \ + OSSL_TRACEV(category, (trc_out, format, arg1, arg2)) +# define OSSL_TRACE3(category, format, arg1, arg2, arg3) \ + OSSL_TRACEV(category, (trc_out, format, arg1, arg2, arg3)) +# define OSSL_TRACE4(category, format, arg1, arg2, arg3, arg4) \ + OSSL_TRACEV(category, (trc_out, format, arg1, arg2, arg3, arg4)) +# define OSSL_TRACE5(category, format, arg1, arg2, arg3, arg4, arg5) \ + OSSL_TRACEV(category, (trc_out, format, arg1, arg2, arg3, arg4, arg5)) +# define OSSL_TRACE6(category, format, arg1, arg2, arg3, arg4, arg5, arg6) \ + OSSL_TRACEV(category, (trc_out, format, arg1, arg2, arg3, arg4, arg5, arg6)) +# define OSSL_TRACE7(category, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + OSSL_TRACEV(category, (trc_out, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7)) +# define OSSL_TRACE8(category, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ + OSSL_TRACEV(category, (trc_out, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)) +# define OSSL_TRACE9(category, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ + OSSL_TRACEV(category, (trc_out, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)) + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/ts.h b/OtherInc/openssl/include/openssl/ts.h new file mode 100644 index 0000000..5136e4e --- /dev/null +++ b/OtherInc/openssl/include/openssl/ts.h @@ -0,0 +1,503 @@ +/* + * Copyright 2006-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_TS_H +# define OPENSSL_TS_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_TS_H +# endif + +# include + +# ifndef OPENSSL_NO_TS +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +# include +# include + +typedef struct TS_msg_imprint_st TS_MSG_IMPRINT; +typedef struct TS_req_st TS_REQ; +typedef struct TS_accuracy_st TS_ACCURACY; +typedef struct TS_tst_info_st TS_TST_INFO; + +/* Possible values for status. */ +# define TS_STATUS_GRANTED 0 +# define TS_STATUS_GRANTED_WITH_MODS 1 +# define TS_STATUS_REJECTION 2 +# define TS_STATUS_WAITING 3 +# define TS_STATUS_REVOCATION_WARNING 4 +# define TS_STATUS_REVOCATION_NOTIFICATION 5 + +/* Possible values for failure_info. */ +# define TS_INFO_BAD_ALG 0 +# define TS_INFO_BAD_REQUEST 2 +# define TS_INFO_BAD_DATA_FORMAT 5 +# define TS_INFO_TIME_NOT_AVAILABLE 14 +# define TS_INFO_UNACCEPTED_POLICY 15 +# define TS_INFO_UNACCEPTED_EXTENSION 16 +# define TS_INFO_ADD_INFO_NOT_AVAILABLE 17 +# define TS_INFO_SYSTEM_FAILURE 25 + + +typedef struct TS_status_info_st TS_STATUS_INFO; + +typedef struct TS_resp_st TS_RESP; + +DECLARE_ASN1_ALLOC_FUNCTIONS(TS_REQ) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(TS_REQ, TS_REQ) +DECLARE_ASN1_DUP_FUNCTION(TS_REQ) + +#ifndef OPENSSL_NO_STDIO +TS_REQ *d2i_TS_REQ_fp(FILE *fp, TS_REQ **a); +int i2d_TS_REQ_fp(FILE *fp, const TS_REQ *a); +#endif +TS_REQ *d2i_TS_REQ_bio(BIO *fp, TS_REQ **a); +int i2d_TS_REQ_bio(BIO *fp, const TS_REQ *a); + +DECLARE_ASN1_ALLOC_FUNCTIONS(TS_MSG_IMPRINT) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(TS_MSG_IMPRINT, TS_MSG_IMPRINT) +DECLARE_ASN1_DUP_FUNCTION(TS_MSG_IMPRINT) + +#ifndef OPENSSL_NO_STDIO +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_fp(FILE *fp, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_fp(FILE *fp, const TS_MSG_IMPRINT *a); +#endif +TS_MSG_IMPRINT *d2i_TS_MSG_IMPRINT_bio(BIO *bio, TS_MSG_IMPRINT **a); +int i2d_TS_MSG_IMPRINT_bio(BIO *bio, const TS_MSG_IMPRINT *a); + +DECLARE_ASN1_ALLOC_FUNCTIONS(TS_RESP) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(TS_RESP, TS_RESP) +DECLARE_ASN1_DUP_FUNCTION(TS_RESP) + +#ifndef OPENSSL_NO_STDIO +TS_RESP *d2i_TS_RESP_fp(FILE *fp, TS_RESP **a); +int i2d_TS_RESP_fp(FILE *fp, const TS_RESP *a); +#endif +TS_RESP *d2i_TS_RESP_bio(BIO *bio, TS_RESP **a); +int i2d_TS_RESP_bio(BIO *bio, const TS_RESP *a); + +DECLARE_ASN1_ALLOC_FUNCTIONS(TS_STATUS_INFO) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(TS_STATUS_INFO, TS_STATUS_INFO) +DECLARE_ASN1_DUP_FUNCTION(TS_STATUS_INFO) + +DECLARE_ASN1_ALLOC_FUNCTIONS(TS_TST_INFO) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(TS_TST_INFO, TS_TST_INFO) +DECLARE_ASN1_DUP_FUNCTION(TS_TST_INFO) +TS_TST_INFO *PKCS7_to_TS_TST_INFO(PKCS7 *token); + +#ifndef OPENSSL_NO_STDIO +TS_TST_INFO *d2i_TS_TST_INFO_fp(FILE *fp, TS_TST_INFO **a); +int i2d_TS_TST_INFO_fp(FILE *fp, const TS_TST_INFO *a); +#endif +TS_TST_INFO *d2i_TS_TST_INFO_bio(BIO *bio, TS_TST_INFO **a); +int i2d_TS_TST_INFO_bio(BIO *bio, const TS_TST_INFO *a); + +DECLARE_ASN1_ALLOC_FUNCTIONS(TS_ACCURACY) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(TS_ACCURACY, TS_ACCURACY) +DECLARE_ASN1_DUP_FUNCTION(TS_ACCURACY) + +int TS_REQ_set_version(TS_REQ *a, long version); +long TS_REQ_get_version(const TS_REQ *a); + +int TS_STATUS_INFO_set_status(TS_STATUS_INFO *a, int i); +const ASN1_INTEGER *TS_STATUS_INFO_get0_status(const TS_STATUS_INFO *a); + +const STACK_OF(ASN1_UTF8STRING) * +TS_STATUS_INFO_get0_text(const TS_STATUS_INFO *a); + +const ASN1_BIT_STRING * +TS_STATUS_INFO_get0_failure_info(const TS_STATUS_INFO *a); + +int TS_REQ_set_msg_imprint(TS_REQ *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_REQ_get_msg_imprint(TS_REQ *a); + +int TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT *a, X509_ALGOR *alg); +X509_ALGOR *TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT *a); + +int TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT *a, unsigned char *d, int len); +ASN1_OCTET_STRING *TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT *a); + +int TS_REQ_set_policy_id(TS_REQ *a, const ASN1_OBJECT *policy); +ASN1_OBJECT *TS_REQ_get_policy_id(TS_REQ *a); + +int TS_REQ_set_nonce(TS_REQ *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_REQ_get_nonce(const TS_REQ *a); + +int TS_REQ_set_cert_req(TS_REQ *a, int cert_req); +int TS_REQ_get_cert_req(const TS_REQ *a); + +STACK_OF(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ *a); +void TS_REQ_ext_free(TS_REQ *a); +int TS_REQ_get_ext_count(TS_REQ *a); +int TS_REQ_get_ext_by_NID(TS_REQ *a, int nid, int lastpos); +int TS_REQ_get_ext_by_OBJ(TS_REQ *a, const ASN1_OBJECT *obj, int lastpos); +int TS_REQ_get_ext_by_critical(TS_REQ *a, int crit, int lastpos); +X509_EXTENSION *TS_REQ_get_ext(TS_REQ *a, int loc); +X509_EXTENSION *TS_REQ_delete_ext(TS_REQ *a, int loc); +int TS_REQ_add_ext(TS_REQ *a, X509_EXTENSION *ex, int loc); +void *TS_REQ_get_ext_d2i(TS_REQ *a, int nid, int *crit, int *idx); + +/* Function declarations for TS_REQ defined in ts/ts_req_print.c */ + +int TS_REQ_print_bio(BIO *bio, TS_REQ *a); + +/* Function declarations for TS_RESP defined in ts/ts_resp_utils.c */ + +int TS_RESP_set_status_info(TS_RESP *a, TS_STATUS_INFO *info); +TS_STATUS_INFO *TS_RESP_get_status_info(TS_RESP *a); + +/* Caller loses ownership of PKCS7 and TS_TST_INFO objects. */ +void TS_RESP_set_tst_info(TS_RESP *a, PKCS7 *p7, TS_TST_INFO *tst_info); +PKCS7 *TS_RESP_get_token(TS_RESP *a); +TS_TST_INFO *TS_RESP_get_tst_info(TS_RESP *a); + +int TS_TST_INFO_set_version(TS_TST_INFO *a, long version); +long TS_TST_INFO_get_version(const TS_TST_INFO *a); + +int TS_TST_INFO_set_policy_id(TS_TST_INFO *a, ASN1_OBJECT *policy_id); +ASN1_OBJECT *TS_TST_INFO_get_policy_id(TS_TST_INFO *a); + +int TS_TST_INFO_set_msg_imprint(TS_TST_INFO *a, TS_MSG_IMPRINT *msg_imprint); +TS_MSG_IMPRINT *TS_TST_INFO_get_msg_imprint(TS_TST_INFO *a); + +int TS_TST_INFO_set_serial(TS_TST_INFO *a, const ASN1_INTEGER *serial); +const ASN1_INTEGER *TS_TST_INFO_get_serial(const TS_TST_INFO *a); + +int TS_TST_INFO_set_time(TS_TST_INFO *a, const ASN1_GENERALIZEDTIME *gtime); +const ASN1_GENERALIZEDTIME *TS_TST_INFO_get_time(const TS_TST_INFO *a); + +int TS_TST_INFO_set_accuracy(TS_TST_INFO *a, TS_ACCURACY *accuracy); +TS_ACCURACY *TS_TST_INFO_get_accuracy(TS_TST_INFO *a); + +int TS_ACCURACY_set_seconds(TS_ACCURACY *a, const ASN1_INTEGER *seconds); +const ASN1_INTEGER *TS_ACCURACY_get_seconds(const TS_ACCURACY *a); + +int TS_ACCURACY_set_millis(TS_ACCURACY *a, const ASN1_INTEGER *millis); +const ASN1_INTEGER *TS_ACCURACY_get_millis(const TS_ACCURACY *a); + +int TS_ACCURACY_set_micros(TS_ACCURACY *a, const ASN1_INTEGER *micros); +const ASN1_INTEGER *TS_ACCURACY_get_micros(const TS_ACCURACY *a); + +int TS_TST_INFO_set_ordering(TS_TST_INFO *a, int ordering); +int TS_TST_INFO_get_ordering(const TS_TST_INFO *a); + +int TS_TST_INFO_set_nonce(TS_TST_INFO *a, const ASN1_INTEGER *nonce); +const ASN1_INTEGER *TS_TST_INFO_get_nonce(const TS_TST_INFO *a); + +int TS_TST_INFO_set_tsa(TS_TST_INFO *a, GENERAL_NAME *tsa); +GENERAL_NAME *TS_TST_INFO_get_tsa(TS_TST_INFO *a); + +STACK_OF(X509_EXTENSION) *TS_TST_INFO_get_exts(TS_TST_INFO *a); +void TS_TST_INFO_ext_free(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_count(TS_TST_INFO *a); +int TS_TST_INFO_get_ext_by_NID(TS_TST_INFO *a, int nid, int lastpos); +int TS_TST_INFO_get_ext_by_OBJ(TS_TST_INFO *a, const ASN1_OBJECT *obj, + int lastpos); +int TS_TST_INFO_get_ext_by_critical(TS_TST_INFO *a, int crit, int lastpos); +X509_EXTENSION *TS_TST_INFO_get_ext(TS_TST_INFO *a, int loc); +X509_EXTENSION *TS_TST_INFO_delete_ext(TS_TST_INFO *a, int loc); +int TS_TST_INFO_add_ext(TS_TST_INFO *a, X509_EXTENSION *ex, int loc); +void *TS_TST_INFO_get_ext_d2i(TS_TST_INFO *a, int nid, int *crit, int *idx); + +/* + * Declarations related to response generation, defined in ts/ts_resp_sign.c. + */ + +/* Optional flags for response generation. */ + +/* Don't include the TSA name in response. */ +# define TS_TSA_NAME 0x01 + +/* Set ordering to true in response. */ +# define TS_ORDERING 0x02 + +/* + * Include the signer certificate and the other specified certificates in + * the ESS signing certificate attribute beside the PKCS7 signed data. + * Only the signer certificates is included by default. + */ +# define TS_ESS_CERT_ID_CHAIN 0x04 + +/* Forward declaration. */ +struct TS_resp_ctx; + +/* This must return a unique number less than 160 bits long. */ +typedef ASN1_INTEGER *(*TS_serial_cb) (struct TS_resp_ctx *, void *); + +/* + * This must return the seconds and microseconds since Jan 1, 1970 in the sec + * and usec variables allocated by the caller. Return non-zero for success + * and zero for failure. + */ +typedef int (*TS_time_cb) (struct TS_resp_ctx *, void *, long *sec, + long *usec); + +/* + * This must process the given extension. It can modify the TS_TST_INFO + * object of the context. Return values: !0 (processed), 0 (error, it must + * set the status info/failure info of the response). + */ +typedef int (*TS_extension_cb) (struct TS_resp_ctx *, X509_EXTENSION *, + void *); + +typedef struct TS_resp_ctx TS_RESP_CTX; + +/* Creates a response context that can be used for generating responses. */ +TS_RESP_CTX *TS_RESP_CTX_new(void); +TS_RESP_CTX *TS_RESP_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +void TS_RESP_CTX_free(TS_RESP_CTX *ctx); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_cert(TS_RESP_CTX *ctx, X509 *signer); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_signer_key(TS_RESP_CTX *ctx, EVP_PKEY *key); + +int TS_RESP_CTX_set_signer_digest(TS_RESP_CTX *ctx, + const EVP_MD *signer_digest); +int TS_RESP_CTX_set_ess_cert_id_digest(TS_RESP_CTX *ctx, const EVP_MD *md); + +/* This parameter must be set. */ +int TS_RESP_CTX_set_def_policy(TS_RESP_CTX *ctx, const ASN1_OBJECT *def_policy); + +/* No additional certs are included in the response by default. */ +int TS_RESP_CTX_set_certs(TS_RESP_CTX *ctx, STACK_OF(X509) *certs); + +/* + * Adds a new acceptable policy, only the default policy is accepted by + * default. + */ +int TS_RESP_CTX_add_policy(TS_RESP_CTX *ctx, const ASN1_OBJECT *policy); + +/* + * Adds a new acceptable message digest. Note that no message digests are + * accepted by default. The md argument is shared with the caller. + */ +int TS_RESP_CTX_add_md(TS_RESP_CTX *ctx, const EVP_MD *md); + +/* Accuracy is not included by default. */ +int TS_RESP_CTX_set_accuracy(TS_RESP_CTX *ctx, + int secs, int millis, int micros); + +/* + * Clock precision digits, i.e. the number of decimal digits: '0' means sec, + * '3' msec, '6' usec, and so on. Default is 0. + */ +int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, + unsigned clock_precision_digits); +/* At most we accept usec precision. */ +# define TS_MAX_CLOCK_PRECISION_DIGITS 6 + +/* Maximum status message length */ +# define TS_MAX_STATUS_LENGTH (1024 * 1024) + +/* No flags are set by default. */ +void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); + +/* Default callback always returns a constant. */ +void TS_RESP_CTX_set_serial_cb(TS_RESP_CTX *ctx, TS_serial_cb cb, void *data); + +/* Default callback uses the gettimeofday() and gmtime() system calls. */ +void TS_RESP_CTX_set_time_cb(TS_RESP_CTX *ctx, TS_time_cb cb, void *data); + +/* + * Default callback rejects all extensions. The extension callback is called + * when the TS_TST_INFO object is already set up and not signed yet. + */ +/* FIXME: extension handling is not tested yet. */ +void TS_RESP_CTX_set_extension_cb(TS_RESP_CTX *ctx, + TS_extension_cb cb, void *data); + +/* The following methods can be used in the callbacks. */ +int TS_RESP_CTX_set_status_info(TS_RESP_CTX *ctx, + int status, const char *text); + +/* Sets the status info only if it is still TS_STATUS_GRANTED. */ +int TS_RESP_CTX_set_status_info_cond(TS_RESP_CTX *ctx, + int status, const char *text); + +int TS_RESP_CTX_add_failure_info(TS_RESP_CTX *ctx, int failure); + +/* The get methods below can be used in the extension callback. */ +TS_REQ *TS_RESP_CTX_get_request(TS_RESP_CTX *ctx); + +TS_TST_INFO *TS_RESP_CTX_get_tst_info(TS_RESP_CTX *ctx); + +/* + * Creates the signed TS_TST_INFO and puts it in TS_RESP. + * In case of errors it sets the status info properly. + * Returns NULL only in case of memory allocation/fatal error. + */ +TS_RESP *TS_RESP_create_response(TS_RESP_CTX *ctx, BIO *req_bio); + +/* + * Declarations related to response verification, + * they are defined in ts/ts_resp_verify.c. + */ + +int TS_RESP_verify_signature(PKCS7 *token, STACK_OF(X509) *certs, + X509_STORE *store, X509 **signer_out); + +/* Context structure for the generic verify method. */ + +/* Verify the signer's certificate and the signature of the response. */ +# define TS_VFY_SIGNATURE (1u << 0) +/* Verify the version number of the response. */ +# define TS_VFY_VERSION (1u << 1) +/* Verify if the policy supplied by the user matches the policy of the TSA. */ +# define TS_VFY_POLICY (1u << 2) +/* + * Verify the message imprint provided by the user. This flag should not be + * specified with TS_VFY_DATA. + */ +# define TS_VFY_IMPRINT (1u << 3) +/* + * Verify the message imprint computed by the verify method from the user + * provided data and the MD algorithm of the response. This flag should not + * be specified with TS_VFY_IMPRINT. + */ +# define TS_VFY_DATA (1u << 4) +/* Verify the nonce value. */ +# define TS_VFY_NONCE (1u << 5) +/* Verify if the TSA name field matches the signer certificate. */ +# define TS_VFY_SIGNER (1u << 6) +/* Verify if the TSA name field equals to the user provided name. */ +# define TS_VFY_TSA_NAME (1u << 7) + +/* You can use the following convenience constants. */ +# define TS_VFY_ALL_IMPRINT (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_IMPRINT \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) +# define TS_VFY_ALL_DATA (TS_VFY_SIGNATURE \ + | TS_VFY_VERSION \ + | TS_VFY_POLICY \ + | TS_VFY_DATA \ + | TS_VFY_NONCE \ + | TS_VFY_SIGNER \ + | TS_VFY_TSA_NAME) + +typedef struct TS_verify_ctx TS_VERIFY_CTX; + +int TS_RESP_verify_response(TS_VERIFY_CTX *ctx, TS_RESP *response); +int TS_RESP_verify_token(TS_VERIFY_CTX *ctx, PKCS7 *token); + +/* + * Declarations related to response verification context, + */ +TS_VERIFY_CTX *TS_VERIFY_CTX_new(void); +void TS_VERIFY_CTX_init(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_free(TS_VERIFY_CTX *ctx); +void TS_VERIFY_CTX_cleanup(TS_VERIFY_CTX *ctx); +int TS_VERIFY_CTX_set_flags(TS_VERIFY_CTX *ctx, int f); +int TS_VERIFY_CTX_add_flags(TS_VERIFY_CTX *ctx, int f); +BIO *TS_VERIFY_CTX_set_data(TS_VERIFY_CTX *ctx, BIO *b); +unsigned char *TS_VERIFY_CTX_set_imprint(TS_VERIFY_CTX *ctx, + unsigned char *hexstr, long len); +X509_STORE *TS_VERIFY_CTX_set_store(TS_VERIFY_CTX *ctx, X509_STORE *s); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define TS_VERIFY_CTS_set_certs(ctx, cert) TS_VERIFY_CTX_set_certs(ctx,cert) +# endif +STACK_OF(X509) *TS_VERIFY_CTX_set_certs(TS_VERIFY_CTX *ctx, STACK_OF(X509) *certs); + +/*- + * If ctx is NULL, it allocates and returns a new object, otherwise + * it returns ctx. It initialises all the members as follows: + * flags = TS_VFY_ALL_IMPRINT & ~(TS_VFY_TSA_NAME | TS_VFY_SIGNATURE) + * certs = NULL + * store = NULL + * policy = policy from the request or NULL if absent (in this case + * TS_VFY_POLICY is cleared from flags as well) + * md_alg = MD algorithm from request + * imprint, imprint_len = imprint from request + * data = NULL + * nonce, nonce_len = nonce from the request or NULL if absent (in this case + * TS_VFY_NONCE is cleared from flags as well) + * tsa_name = NULL + * Important: after calling this method TS_VFY_SIGNATURE should be added! + */ +TS_VERIFY_CTX *TS_REQ_to_TS_VERIFY_CTX(TS_REQ *req, TS_VERIFY_CTX *ctx); + +/* Function declarations for TS_RESP defined in ts/ts_resp_print.c */ + +int TS_RESP_print_bio(BIO *bio, TS_RESP *a); +int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a); +int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a); + +/* Common utility functions defined in ts/ts_lib.c */ + +int TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num); +int TS_OBJ_print_bio(BIO *bio, const ASN1_OBJECT *obj); +int TS_ext_print_bio(BIO *bio, const STACK_OF(X509_EXTENSION) *extensions); +int TS_X509_ALGOR_print_bio(BIO *bio, const X509_ALGOR *alg); +int TS_MSG_IMPRINT_print_bio(BIO *bio, TS_MSG_IMPRINT *msg); + +/* + * Function declarations for handling configuration options, defined in + * ts/ts_conf.c + */ + +X509 *TS_CONF_load_cert(const char *file); +STACK_OF(X509) *TS_CONF_load_certs(const char *file); +EVP_PKEY *TS_CONF_load_key(const char *file, const char *pass); +const char *TS_CONF_get_tsa_section(CONF *conf, const char *section); +int TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb, + TS_RESP_CTX *ctx); +#ifndef OPENSSL_NO_ENGINE +int TS_CONF_set_crypto_device(CONF *conf, const char *section, + const char *device); +int TS_CONF_set_default_engine(const char *name); +#endif +int TS_CONF_set_signer_cert(CONF *conf, const char *section, + const char *cert, TS_RESP_CTX *ctx); +int TS_CONF_set_certs(CONF *conf, const char *section, const char *certs, + TS_RESP_CTX *ctx); +int TS_CONF_set_signer_key(CONF *conf, const char *section, + const char *key, const char *pass, + TS_RESP_CTX *ctx); +int TS_CONF_set_signer_digest(CONF *conf, const char *section, + const char *md, TS_RESP_CTX *ctx); +int TS_CONF_set_def_policy(CONF *conf, const char *section, + const char *policy, TS_RESP_CTX *ctx); +int TS_CONF_set_policies(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_digests(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_accuracy(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_clock_precision_digits(const CONF *conf, const char *section, + TS_RESP_CTX *ctx); +int TS_CONF_set_ordering(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_tsa_name(CONF *conf, const char *section, TS_RESP_CTX *ctx); +int TS_CONF_set_ess_cert_id_chain(CONF *conf, const char *section, + TS_RESP_CTX *ctx); +int TS_CONF_set_ess_cert_id_digest(CONF *conf, const char *section, + TS_RESP_CTX *ctx); + +# ifdef __cplusplus +} +# endif +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/tserr.h b/OtherInc/openssl/include/openssl/tserr.h new file mode 100644 index 0000000..e1b943e --- /dev/null +++ b/OtherInc/openssl/include/openssl/tserr.h @@ -0,0 +1,67 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_TSERR_H +# define OPENSSL_TSERR_H +# pragma once + +# include +# include +# include + + +# ifndef OPENSSL_NO_TS + + +/* + * TS reason codes. + */ +# define TS_R_BAD_PKCS7_TYPE 132 +# define TS_R_BAD_TYPE 133 +# define TS_R_CANNOT_LOAD_CERT 137 +# define TS_R_CANNOT_LOAD_KEY 138 +# define TS_R_CERTIFICATE_VERIFY_ERROR 100 +# define TS_R_COULD_NOT_SET_ENGINE 127 +# define TS_R_COULD_NOT_SET_TIME 115 +# define TS_R_DETACHED_CONTENT 134 +# define TS_R_ESS_ADD_SIGNING_CERT_ERROR 116 +# define TS_R_ESS_ADD_SIGNING_CERT_V2_ERROR 139 +# define TS_R_ESS_SIGNING_CERTIFICATE_ERROR 101 +# define TS_R_INVALID_NULL_POINTER 102 +# define TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE 117 +# define TS_R_MESSAGE_IMPRINT_MISMATCH 103 +# define TS_R_NONCE_MISMATCH 104 +# define TS_R_NONCE_NOT_RETURNED 105 +# define TS_R_NO_CONTENT 106 +# define TS_R_NO_TIME_STAMP_TOKEN 107 +# define TS_R_PKCS7_ADD_SIGNATURE_ERROR 118 +# define TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR 119 +# define TS_R_PKCS7_TO_TS_TST_INFO_FAILED 129 +# define TS_R_POLICY_MISMATCH 108 +# define TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 120 +# define TS_R_RESPONSE_SETUP_ERROR 121 +# define TS_R_SIGNATURE_FAILURE 109 +# define TS_R_THERE_MUST_BE_ONE_SIGNER 110 +# define TS_R_TIME_SYSCALL_ERROR 122 +# define TS_R_TOKEN_NOT_PRESENT 130 +# define TS_R_TOKEN_PRESENT 131 +# define TS_R_TSA_NAME_MISMATCH 111 +# define TS_R_TSA_UNTRUSTED 112 +# define TS_R_TST_INFO_SETUP_ERROR 123 +# define TS_R_TS_DATASIGN 124 +# define TS_R_UNACCEPTABLE_POLICY 125 +# define TS_R_UNSUPPORTED_MD_ALGORITHM 126 +# define TS_R_UNSUPPORTED_VERSION 113 +# define TS_R_VAR_BAD_VALUE 135 +# define TS_R_VAR_LOOKUP_FAILURE 136 +# define TS_R_WRONG_CONTENT_TYPE 114 + +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/txt_db.h b/OtherInc/openssl/include/openssl/txt_db.h new file mode 100644 index 0000000..af169a3 --- /dev/null +++ b/OtherInc/openssl/include/openssl/txt_db.h @@ -0,0 +1,63 @@ +/* + * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_TXT_DB_H +# define OPENSSL_TXT_DB_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_TXT_DB_H +# endif + +# include +# include +# include +# include + +# define DB_ERROR_OK 0 +# define DB_ERROR_MALLOC 1 +# define DB_ERROR_INDEX_CLASH 2 +# define DB_ERROR_INDEX_OUT_OF_RANGE 3 +# define DB_ERROR_NO_INDEX 4 +# define DB_ERROR_INSERT_INDEX_CLASH 5 +# define DB_ERROR_WRONG_NUM_FIELDS 6 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OPENSSL_STRING *OPENSSL_PSTRING; +DEFINE_SPECIAL_STACK_OF(OPENSSL_PSTRING, OPENSSL_STRING) + +typedef struct txt_db_st { + int num_fields; + STACK_OF(OPENSSL_PSTRING) *data; + LHASH_OF(OPENSSL_STRING) **index; + int (**qual) (OPENSSL_STRING *); + long error; + long arg1; + long arg2; + OPENSSL_STRING *arg_row; +} TXT_DB; + +TXT_DB *TXT_DB_read(BIO *in, int num); +long TXT_DB_write(BIO *out, TXT_DB *db); +int TXT_DB_create_index(TXT_DB *db, int field, int (*qual) (OPENSSL_STRING *), + OPENSSL_LH_HASHFUNC hash, OPENSSL_LH_COMPFUNC cmp); +void TXT_DB_free(TXT_DB *db); +OPENSSL_STRING *TXT_DB_get_by_index(TXT_DB *db, int idx, + OPENSSL_STRING *value); +int TXT_DB_insert(TXT_DB *db, OPENSSL_STRING *value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/OtherInc/openssl/include/openssl/types.h b/OtherInc/openssl/include/openssl/types.h new file mode 100644 index 0000000..de9f166 --- /dev/null +++ b/OtherInc/openssl/include/openssl/types.h @@ -0,0 +1,236 @@ +/* + * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_TYPES_H +# define OPENSSL_TYPES_H +# pragma once + +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# include +# include +# include + +typedef struct ossl_provider_st OSSL_PROVIDER; /* Provider Object */ + +# ifdef NO_ASN1_TYPEDEFS +# define ASN1_INTEGER ASN1_STRING +# define ASN1_ENUMERATED ASN1_STRING +# define ASN1_BIT_STRING ASN1_STRING +# define ASN1_OCTET_STRING ASN1_STRING +# define ASN1_PRINTABLESTRING ASN1_STRING +# define ASN1_T61STRING ASN1_STRING +# define ASN1_IA5STRING ASN1_STRING +# define ASN1_UTCTIME ASN1_STRING +# define ASN1_GENERALIZEDTIME ASN1_STRING +# define ASN1_TIME ASN1_STRING +# define ASN1_GENERALSTRING ASN1_STRING +# define ASN1_UNIVERSALSTRING ASN1_STRING +# define ASN1_BMPSTRING ASN1_STRING +# define ASN1_VISIBLESTRING ASN1_STRING +# define ASN1_UTF8STRING ASN1_STRING +# define ASN1_BOOLEAN int +# define ASN1_NULL int +# else +typedef struct asn1_string_st ASN1_INTEGER; +typedef struct asn1_string_st ASN1_ENUMERATED; +typedef struct asn1_string_st ASN1_BIT_STRING; +typedef struct asn1_string_st ASN1_OCTET_STRING; +typedef struct asn1_string_st ASN1_PRINTABLESTRING; +typedef struct asn1_string_st ASN1_T61STRING; +typedef struct asn1_string_st ASN1_IA5STRING; +typedef struct asn1_string_st ASN1_GENERALSTRING; +typedef struct asn1_string_st ASN1_UNIVERSALSTRING; +typedef struct asn1_string_st ASN1_BMPSTRING; +typedef struct asn1_string_st ASN1_UTCTIME; +typedef struct asn1_string_st ASN1_TIME; +typedef struct asn1_string_st ASN1_GENERALIZEDTIME; +typedef struct asn1_string_st ASN1_VISIBLESTRING; +typedef struct asn1_string_st ASN1_UTF8STRING; +typedef struct asn1_string_st ASN1_STRING; +typedef int ASN1_BOOLEAN; +typedef int ASN1_NULL; +# endif + +typedef struct asn1_type_st ASN1_TYPE; +typedef struct asn1_object_st ASN1_OBJECT; +typedef struct asn1_string_table_st ASN1_STRING_TABLE; + +typedef struct ASN1_ITEM_st ASN1_ITEM; +typedef struct asn1_pctx_st ASN1_PCTX; +typedef struct asn1_sctx_st ASN1_SCTX; + +# ifdef _WIN32 +# undef X509_NAME +# undef X509_EXTENSIONS +# undef PKCS7_ISSUER_AND_SERIAL +# undef PKCS7_SIGNER_INFO +# undef OCSP_REQUEST +# undef OCSP_RESPONSE +# endif + +# ifdef BIGNUM +# undef BIGNUM +# endif + +typedef struct bio_st BIO; +typedef struct bignum_st BIGNUM; +typedef struct bignum_ctx BN_CTX; +typedef struct bn_blinding_st BN_BLINDING; +typedef struct bn_mont_ctx_st BN_MONT_CTX; +typedef struct bn_recp_ctx_st BN_RECP_CTX; +typedef struct bn_gencb_st BN_GENCB; + +typedef struct buf_mem_st BUF_MEM; + +STACK_OF(BIGNUM); +STACK_OF(BIGNUM_const); + +typedef struct err_state_st ERR_STATE; + +typedef struct evp_cipher_st EVP_CIPHER; +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; +typedef struct evp_md_st EVP_MD; +typedef struct evp_md_ctx_st EVP_MD_CTX; +typedef struct evp_mac_st EVP_MAC; +typedef struct evp_mac_ctx_st EVP_MAC_CTX; +typedef struct evp_pkey_st EVP_PKEY; + +typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; + +typedef struct evp_pkey_method_st EVP_PKEY_METHOD; +typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; + +typedef struct evp_keymgmt_st EVP_KEYMGMT; + +typedef struct evp_kdf_st EVP_KDF; +typedef struct evp_kdf_ctx_st EVP_KDF_CTX; + +typedef struct evp_rand_st EVP_RAND; +typedef struct evp_rand_ctx_st EVP_RAND_CTX; + +typedef struct evp_keyexch_st EVP_KEYEXCH; + +typedef struct evp_signature_st EVP_SIGNATURE; + +typedef struct evp_asym_cipher_st EVP_ASYM_CIPHER; + +typedef struct evp_kem_st EVP_KEM; + +typedef struct evp_Encode_Ctx_st EVP_ENCODE_CTX; + +typedef struct hmac_ctx_st HMAC_CTX; + +typedef struct dh_st DH; +typedef struct dh_method DH_METHOD; + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef struct dsa_st DSA; +typedef struct dsa_method DSA_METHOD; +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef struct rsa_st RSA; +typedef struct rsa_meth_st RSA_METHOD; +# endif +typedef struct rsa_pss_params_st RSA_PSS_PARAMS; + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef struct ec_key_st EC_KEY; +typedef struct ec_key_method_st EC_KEY_METHOD; +# endif + +typedef struct rand_meth_st RAND_METHOD; +typedef struct rand_drbg_st RAND_DRBG; + +typedef struct ssl_dane_st SSL_DANE; +typedef struct x509_st X509; +typedef struct X509_algor_st X509_ALGOR; +typedef struct X509_crl_st X509_CRL; +typedef struct x509_crl_method_st X509_CRL_METHOD; +typedef struct x509_revoked_st X509_REVOKED; +typedef struct X509_name_st X509_NAME; +typedef struct X509_pubkey_st X509_PUBKEY; +typedef struct x509_store_st X509_STORE; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +typedef struct x509_object_st X509_OBJECT; +typedef struct x509_lookup_st X509_LOOKUP; +typedef struct x509_lookup_method_st X509_LOOKUP_METHOD; +typedef struct X509_VERIFY_PARAM_st X509_VERIFY_PARAM; + +typedef struct x509_sig_info_st X509_SIG_INFO; + +typedef struct pkcs8_priv_key_info_st PKCS8_PRIV_KEY_INFO; + +typedef struct v3_ext_ctx X509V3_CTX; +typedef struct conf_st CONF; +typedef struct ossl_init_settings_st OPENSSL_INIT_SETTINGS; + +typedef struct ui_st UI; +typedef struct ui_method_st UI_METHOD; + +typedef struct engine_st ENGINE; +typedef struct ssl_st SSL; +typedef struct ssl_ctx_st SSL_CTX; + +typedef struct comp_ctx_st COMP_CTX; +typedef struct comp_method_st COMP_METHOD; + +typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; +typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; +typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; +typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; + +typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID; +typedef struct DIST_POINT_st DIST_POINT; +typedef struct ISSUING_DIST_POINT_st ISSUING_DIST_POINT; +typedef struct NAME_CONSTRAINTS_st NAME_CONSTRAINTS; + +typedef struct crypto_ex_data_st CRYPTO_EX_DATA; + +typedef struct ossl_http_req_ctx_st OSSL_HTTP_REQ_CTX; +typedef struct ocsp_response_st OCSP_RESPONSE; +typedef struct ocsp_responder_id_st OCSP_RESPID; + +typedef struct sct_st SCT; +typedef struct sct_ctx_st SCT_CTX; +typedef struct ctlog_st CTLOG; +typedef struct ctlog_store_st CTLOG_STORE; +typedef struct ct_policy_eval_ctx_st CT_POLICY_EVAL_CTX; + +typedef struct ossl_store_info_st OSSL_STORE_INFO; +typedef struct ossl_store_search_st OSSL_STORE_SEARCH; + +typedef struct ossl_lib_ctx_st OSSL_LIB_CTX; + +typedef struct ossl_dispatch_st OSSL_DISPATCH; +typedef struct ossl_item_st OSSL_ITEM; +typedef struct ossl_algorithm_st OSSL_ALGORITHM; +typedef struct ossl_param_st OSSL_PARAM; +typedef struct ossl_param_bld_st OSSL_PARAM_BLD; + +typedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); + +typedef struct ossl_encoder_st OSSL_ENCODER; +typedef struct ossl_encoder_ctx_st OSSL_ENCODER_CTX; +typedef struct ossl_decoder_st OSSL_DECODER; +typedef struct ossl_decoder_ctx_st OSSL_DECODER_CTX; + +typedef struct ossl_self_test_st OSSL_SELF_TEST; + +#ifdef __cplusplus +} +#endif + +#endif /* OPENSSL_TYPES_H */ diff --git a/OtherInc/openssl/include/openssl/ui.h b/OtherInc/openssl/include/openssl/ui.h new file mode 100644 index 0000000..835b0eb --- /dev/null +++ b/OtherInc/openssl/include/openssl/ui.h @@ -0,0 +1,407 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\ui.h.in + * + * Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_UI_H +# define OPENSSL_UI_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_UI_H +# endif + +# include + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# endif +# include +# include +# include +# include + +/* For compatibility reasons, the macro OPENSSL_NO_UI is currently retained */ +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifdef OPENSSL_NO_UI_CONSOLE +# define OPENSSL_NO_UI +# endif +# endif + +# ifdef __cplusplus +extern "C" { +# endif + +/* + * All the following functions return -1 or NULL on error and in some cases + * (UI_process()) -2 if interrupted or in some other way cancelled. When + * everything is fine, they return 0, a positive value or a non-NULL pointer, + * all depending on their purpose. + */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/*- + The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is useful when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +# define UI_INPUT_FLAG_ECHO 0x01 +/* + * Use a default password. Where that password is found is completely up to + * the application, it might for example be in the user data set with + * UI_add_user_data(). It is not recommended to have more than one input in + * each UI being marked with this flag, or the application might get + * confused. + */ +# define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/*- + * The user of these routines may want to define flags of their own. The core + * UI won't look at those, but will pass them on to the method routines. They + * must use higher bits so they don't get confused with the UI bits above. + * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + * example of use is this: + * + * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + * +*/ +# define UI_INPUT_FLAG_USER_BASE 16 + +/*- + * The following function helps construct a prompt. + * phrase_desc is a textual short description of the phrase to enter, + * for example "pass phrase", and + * object_name is the name of the object + * (which might be a card name or a file name) or NULL. + * The returned string shall always be allocated on the heap with + * OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). + * + * If the ui_method doesn't contain a pointer to a user-defined prompt + * constructor, a default string is built, looking like this: + * + * "Enter {phrase_desc} for {object_name}:" + * + * So, if phrase_desc has the value "pass phrase" and object_name has + * the value "foo.key", the resulting string is: + * + * "Enter pass phrase for foo.key:" +*/ +char *UI_construct_prompt(UI *ui_method, + const char *phrase_desc, const char *object_name); + +/* + * The following function is used to store a pointer to user-specific data. + * Any previous such pointer will be returned and replaced. + * + * For callback purposes, this function makes a lot more sense than using + * ex_data, since the latter requires that different parts of OpenSSL or + * applications share the same ex_data index. + * + * Note that the UI_OpenSSL() method completely ignores the user data. Other + * methods may not, however. + */ +void *UI_add_user_data(UI *ui, void *user_data); +/* + * Alternatively, this function is used to duplicate the user data. + * This uses the duplicator method function. The destroy function will + * be used to free the user data in this case. + */ +int UI_dup_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); +int UI_get_result_length(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* + * Give a user interface parameterised control commands. This can be used to + * send down an integer, a data pointer or a function pointer, as well as be + * used to get information from a UI. + */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f) (void)); + +/* The commands */ +/* + * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + * OpenSSL error stack before printing any info or added error messages and + * before any prompting. + */ +# define UI_CTRL_PRINT_ERRORS 1 +/* + * Check if a UI_process() is possible to do again with the same instance of + * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + * if not. + */ +# define UI_CTRL_IS_REDOABLE 2 + +/* Some methods may use extra data */ +# define UI_set_app_data(s,arg) UI_set_ex_data(s,0,arg) +# define UI_get_app_data(s) UI_get_ex_data(s,0) + +# define UI_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, l, p, newf, dupf, freef) +int UI_set_ex_data(UI *r, int idx, void *arg); +void *UI_get_ex_data(const UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +# ifndef OPENSSL_NO_UI_CONSOLE + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + +# endif + +/* + * NULL method. Literally does nothing, but may serve as a placeholder + * to avoid internal default. + */ +const UI_METHOD *UI_null(void); + +/* ---------- For method writers ---------- */ +/*- + A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called with all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* + * The UI_STRING type is the data structure that contains all the needed info + * about a string or a prompt, including test data for a verification prompt. + */ +typedef struct ui_string_st UI_STRING; + +SKM_DEFINE_STACK_OF_INTERNAL(UI_STRING, UI_STRING, UI_STRING) +#define sk_UI_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_value(sk, idx) ((UI_STRING *)OPENSSL_sk_value(ossl_check_const_UI_STRING_sk_type(sk), (idx))) +#define sk_UI_STRING_new(cmp) ((STACK_OF(UI_STRING) *)OPENSSL_sk_new(ossl_check_UI_STRING_compfunc_type(cmp))) +#define sk_UI_STRING_new_null() ((STACK_OF(UI_STRING) *)OPENSSL_sk_new_null()) +#define sk_UI_STRING_new_reserve(cmp, n) ((STACK_OF(UI_STRING) *)OPENSSL_sk_new_reserve(ossl_check_UI_STRING_compfunc_type(cmp), (n))) +#define sk_UI_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_UI_STRING_sk_type(sk), (n)) +#define sk_UI_STRING_free(sk) OPENSSL_sk_free(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_delete(sk, i) ((UI_STRING *)OPENSSL_sk_delete(ossl_check_UI_STRING_sk_type(sk), (i))) +#define sk_UI_STRING_delete_ptr(sk, ptr) ((UI_STRING *)OPENSSL_sk_delete_ptr(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr))) +#define sk_UI_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_pop(sk) ((UI_STRING *)OPENSSL_sk_pop(ossl_check_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_shift(sk) ((UI_STRING *)OPENSSL_sk_shift(ossl_check_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_UI_STRING_sk_type(sk),ossl_check_UI_STRING_freefunc_type(freefunc)) +#define sk_UI_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr), (idx)) +#define sk_UI_STRING_set(sk, idx, ptr) ((UI_STRING *)OPENSSL_sk_set(ossl_check_UI_STRING_sk_type(sk), (idx), ossl_check_UI_STRING_type(ptr))) +#define sk_UI_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr), pnum) +#define sk_UI_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_dup(sk) ((STACK_OF(UI_STRING) *)OPENSSL_sk_dup(ossl_check_const_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(UI_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_UI_STRING_sk_type(sk), ossl_check_UI_STRING_copyfunc_type(copyfunc), ossl_check_UI_STRING_freefunc_type(freefunc))) +#define sk_UI_STRING_set_cmp_func(sk, cmp) ((sk_UI_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_compfunc_type(cmp))) + + +/* + * The different types of strings that are currently supported. This is only + * needed by method authors. + */ +enum UI_string_types { + UIT_NONE = 0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ +}; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(const char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener) (UI *ui)); +int UI_method_set_writer(UI_METHOD *method, + int (*writer) (UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher) (UI *ui)); +int UI_method_set_reader(UI_METHOD *method, + int (*reader) (UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer) (UI *ui)); +int UI_method_set_data_duplicator(UI_METHOD *method, + void *(*duplicator) (UI *ui, void *ui_data), + void (*destructor)(UI *ui, void *ui_data)); +int UI_method_set_prompt_constructor(UI_METHOD *method, + char *(*prompt_constructor) (UI *ui, + const char + *phrase_desc, + const char + *object_name)); +int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data); +int (*UI_method_get_opener(const UI_METHOD *method)) (UI *); +int (*UI_method_get_writer(const UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_flusher(const UI_METHOD *method)) (UI *); +int (*UI_method_get_reader(const UI_METHOD *method)) (UI *, UI_STRING *); +int (*UI_method_get_closer(const UI_METHOD *method)) (UI *); +char *(*UI_method_get_prompt_constructor(const UI_METHOD *method)) + (UI *, const char *, const char *); +void *(*UI_method_get_data_duplicator(const UI_METHOD *method)) (UI *, void *); +void (*UI_method_get_data_destructor(const UI_METHOD *method)) (UI *, void *); +const void *UI_method_get_ex_data(const UI_METHOD *method, int idx); + +/* + * The following functions are helpers for method writers to access relevant + * data from a UI_STRING. + */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* + * Return the optional action string to output (the boolean prompt + * instruction) + */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +int UI_get_result_string_length(UI_STRING *uis); +/* + * Return the string to test the result against. Only useful with verifies. + */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); +int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len); + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); +UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag); + + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/uierr.h b/OtherInc/openssl/include/openssl/uierr.h new file mode 100644 index 0000000..473b04e --- /dev/null +++ b/OtherInc/openssl/include/openssl/uierr.h @@ -0,0 +1,38 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_UIERR_H +# define OPENSSL_UIERR_H +# pragma once + +# include +# include +# include + + + +/* + * UI reason codes. + */ +# define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS 104 +# define UI_R_INDEX_TOO_LARGE 102 +# define UI_R_INDEX_TOO_SMALL 103 +# define UI_R_NO_RESULT_BUFFER 105 +# define UI_R_PROCESSING_ERROR 107 +# define UI_R_RESULT_TOO_LARGE 100 +# define UI_R_RESULT_TOO_SMALL 101 +# define UI_R_SYSASSIGN_ERROR 109 +# define UI_R_SYSDASSGN_ERROR 110 +# define UI_R_SYSQIOW_ERROR 111 +# define UI_R_UNKNOWN_CONTROL_COMMAND 106 +# define UI_R_UNKNOWN_TTYGET_ERRNO_VALUE 108 +# define UI_R_USER_DATA_DUPLICATION_UNSUPPORTED 112 + +#endif diff --git a/OtherInc/openssl/include/openssl/whrlpool.h b/OtherInc/openssl/include/openssl/whrlpool.h new file mode 100644 index 0000000..05ba463 --- /dev/null +++ b/OtherInc/openssl/include/openssl/whrlpool.h @@ -0,0 +1,62 @@ +/* + * Copyright 2005-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_WHRLPOOL_H +# define OPENSSL_WHRLPOOL_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_WHRLPOOL_H +# endif + +# include + +# ifndef OPENSSL_NO_WHIRLPOOL +# include +# include +# ifdef __cplusplus +extern "C" { +# endif + +# define WHIRLPOOL_DIGEST_LENGTH (512/8) + +# if !defined(OPENSSL_NO_DEPRECATED_3_0) + +# define WHIRLPOOL_BBLOCK 512 +# define WHIRLPOOL_COUNTER (256/8) + +typedef struct { + union { + unsigned char c[WHIRLPOOL_DIGEST_LENGTH]; + /* double q is here to ensure 64-bit alignment */ + double q[WHIRLPOOL_DIGEST_LENGTH / sizeof(double)]; + } H; + unsigned char data[WHIRLPOOL_BBLOCK / 8]; + unsigned int bitoff; + size_t bitlen[WHIRLPOOL_COUNTER / sizeof(size_t)]; +} WHIRLPOOL_CTX; +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int WHIRLPOOL_Init(WHIRLPOOL_CTX *c); +OSSL_DEPRECATEDIN_3_0 int WHIRLPOOL_Update(WHIRLPOOL_CTX *c, + const void *inp, size_t bytes); +OSSL_DEPRECATEDIN_3_0 void WHIRLPOOL_BitUpdate(WHIRLPOOL_CTX *c, + const void *inp, size_t bits); +OSSL_DEPRECATEDIN_3_0 int WHIRLPOOL_Final(unsigned char *md, WHIRLPOOL_CTX *c); +OSSL_DEPRECATEDIN_3_0 unsigned char *WHIRLPOOL(const void *inp, size_t bytes, + unsigned char *md); +# endif + +# ifdef __cplusplus +} +# endif +# endif + +#endif diff --git a/OtherInc/openssl/include/openssl/x509.h b/OtherInc/openssl/include/openssl/x509.h new file mode 100644 index 0000000..eda5d70 --- /dev/null +++ b/OtherInc/openssl/include/openssl/x509.h @@ -0,0 +1,1276 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\x509.h.in + * + * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_X509_H +# define OPENSSL_X509_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_X509_H +# endif + +# include +# include +# include +# include +# include +# include +# include +# include +# include + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# include +# include +# include +# endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Needed stacks for types defined in other headers */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_NAME, X509_NAME, X509_NAME) +#define sk_X509_NAME_num(sk) OPENSSL_sk_num(ossl_check_const_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_value(sk, idx) ((X509_NAME *)OPENSSL_sk_value(ossl_check_const_X509_NAME_sk_type(sk), (idx))) +#define sk_X509_NAME_new(cmp) ((STACK_OF(X509_NAME) *)OPENSSL_sk_new(ossl_check_X509_NAME_compfunc_type(cmp))) +#define sk_X509_NAME_new_null() ((STACK_OF(X509_NAME) *)OPENSSL_sk_new_null()) +#define sk_X509_NAME_new_reserve(cmp, n) ((STACK_OF(X509_NAME) *)OPENSSL_sk_new_reserve(ossl_check_X509_NAME_compfunc_type(cmp), (n))) +#define sk_X509_NAME_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_NAME_sk_type(sk), (n)) +#define sk_X509_NAME_free(sk) OPENSSL_sk_free(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_zero(sk) OPENSSL_sk_zero(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_delete(sk, i) ((X509_NAME *)OPENSSL_sk_delete(ossl_check_X509_NAME_sk_type(sk), (i))) +#define sk_X509_NAME_delete_ptr(sk, ptr) ((X509_NAME *)OPENSSL_sk_delete_ptr(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr))) +#define sk_X509_NAME_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_pop(sk) ((X509_NAME *)OPENSSL_sk_pop(ossl_check_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_shift(sk) ((X509_NAME *)OPENSSL_sk_shift(ossl_check_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_NAME_sk_type(sk),ossl_check_X509_NAME_freefunc_type(freefunc)) +#define sk_X509_NAME_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr), (idx)) +#define sk_X509_NAME_set(sk, idx, ptr) ((X509_NAME *)OPENSSL_sk_set(ossl_check_X509_NAME_sk_type(sk), (idx), ossl_check_X509_NAME_type(ptr))) +#define sk_X509_NAME_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr), pnum) +#define sk_X509_NAME_sort(sk) OPENSSL_sk_sort(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_dup(sk) ((STACK_OF(X509_NAME) *)OPENSSL_sk_dup(ossl_check_const_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_NAME) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_NAME_sk_type(sk), ossl_check_X509_NAME_copyfunc_type(copyfunc), ossl_check_X509_NAME_freefunc_type(freefunc))) +#define sk_X509_NAME_set_cmp_func(sk, cmp) ((sk_X509_NAME_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509, X509, X509) +#define sk_X509_num(sk) OPENSSL_sk_num(ossl_check_const_X509_sk_type(sk)) +#define sk_X509_value(sk, idx) ((X509 *)OPENSSL_sk_value(ossl_check_const_X509_sk_type(sk), (idx))) +#define sk_X509_new(cmp) ((STACK_OF(X509) *)OPENSSL_sk_new(ossl_check_X509_compfunc_type(cmp))) +#define sk_X509_new_null() ((STACK_OF(X509) *)OPENSSL_sk_new_null()) +#define sk_X509_new_reserve(cmp, n) ((STACK_OF(X509) *)OPENSSL_sk_new_reserve(ossl_check_X509_compfunc_type(cmp), (n))) +#define sk_X509_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_sk_type(sk), (n)) +#define sk_X509_free(sk) OPENSSL_sk_free(ossl_check_X509_sk_type(sk)) +#define sk_X509_zero(sk) OPENSSL_sk_zero(ossl_check_X509_sk_type(sk)) +#define sk_X509_delete(sk, i) ((X509 *)OPENSSL_sk_delete(ossl_check_X509_sk_type(sk), (i))) +#define sk_X509_delete_ptr(sk, ptr) ((X509 *)OPENSSL_sk_delete_ptr(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr))) +#define sk_X509_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_pop(sk) ((X509 *)OPENSSL_sk_pop(ossl_check_X509_sk_type(sk))) +#define sk_X509_shift(sk) ((X509 *)OPENSSL_sk_shift(ossl_check_X509_sk_type(sk))) +#define sk_X509_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_sk_type(sk),ossl_check_X509_freefunc_type(freefunc)) +#define sk_X509_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr), (idx)) +#define sk_X509_set(sk, idx, ptr) ((X509 *)OPENSSL_sk_set(ossl_check_X509_sk_type(sk), (idx), ossl_check_X509_type(ptr))) +#define sk_X509_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr), pnum) +#define sk_X509_sort(sk) OPENSSL_sk_sort(ossl_check_X509_sk_type(sk)) +#define sk_X509_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_sk_type(sk)) +#define sk_X509_dup(sk) ((STACK_OF(X509) *)OPENSSL_sk_dup(ossl_check_const_X509_sk_type(sk))) +#define sk_X509_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_sk_type(sk), ossl_check_X509_copyfunc_type(copyfunc), ossl_check_X509_freefunc_type(freefunc))) +#define sk_X509_set_cmp_func(sk, cmp) ((sk_X509_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_sk_type(sk), ossl_check_X509_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_REVOKED, X509_REVOKED, X509_REVOKED) +#define sk_X509_REVOKED_num(sk) OPENSSL_sk_num(ossl_check_const_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_value(sk, idx) ((X509_REVOKED *)OPENSSL_sk_value(ossl_check_const_X509_REVOKED_sk_type(sk), (idx))) +#define sk_X509_REVOKED_new(cmp) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new(ossl_check_X509_REVOKED_compfunc_type(cmp))) +#define sk_X509_REVOKED_new_null() ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new_null()) +#define sk_X509_REVOKED_new_reserve(cmp, n) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new_reserve(ossl_check_X509_REVOKED_compfunc_type(cmp), (n))) +#define sk_X509_REVOKED_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_REVOKED_sk_type(sk), (n)) +#define sk_X509_REVOKED_free(sk) OPENSSL_sk_free(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_zero(sk) OPENSSL_sk_zero(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_delete(sk, i) ((X509_REVOKED *)OPENSSL_sk_delete(ossl_check_X509_REVOKED_sk_type(sk), (i))) +#define sk_X509_REVOKED_delete_ptr(sk, ptr) ((X509_REVOKED *)OPENSSL_sk_delete_ptr(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr))) +#define sk_X509_REVOKED_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_pop(sk) ((X509_REVOKED *)OPENSSL_sk_pop(ossl_check_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_shift(sk) ((X509_REVOKED *)OPENSSL_sk_shift(ossl_check_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_REVOKED_sk_type(sk),ossl_check_X509_REVOKED_freefunc_type(freefunc)) +#define sk_X509_REVOKED_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr), (idx)) +#define sk_X509_REVOKED_set(sk, idx, ptr) ((X509_REVOKED *)OPENSSL_sk_set(ossl_check_X509_REVOKED_sk_type(sk), (idx), ossl_check_X509_REVOKED_type(ptr))) +#define sk_X509_REVOKED_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr), pnum) +#define sk_X509_REVOKED_sort(sk) OPENSSL_sk_sort(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_dup(sk) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_dup(ossl_check_const_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_copyfunc_type(copyfunc), ossl_check_X509_REVOKED_freefunc_type(freefunc))) +#define sk_X509_REVOKED_set_cmp_func(sk, cmp) ((sk_X509_REVOKED_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_CRL, X509_CRL, X509_CRL) +#define sk_X509_CRL_num(sk) OPENSSL_sk_num(ossl_check_const_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_value(sk, idx) ((X509_CRL *)OPENSSL_sk_value(ossl_check_const_X509_CRL_sk_type(sk), (idx))) +#define sk_X509_CRL_new(cmp) ((STACK_OF(X509_CRL) *)OPENSSL_sk_new(ossl_check_X509_CRL_compfunc_type(cmp))) +#define sk_X509_CRL_new_null() ((STACK_OF(X509_CRL) *)OPENSSL_sk_new_null()) +#define sk_X509_CRL_new_reserve(cmp, n) ((STACK_OF(X509_CRL) *)OPENSSL_sk_new_reserve(ossl_check_X509_CRL_compfunc_type(cmp), (n))) +#define sk_X509_CRL_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_CRL_sk_type(sk), (n)) +#define sk_X509_CRL_free(sk) OPENSSL_sk_free(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_zero(sk) OPENSSL_sk_zero(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_delete(sk, i) ((X509_CRL *)OPENSSL_sk_delete(ossl_check_X509_CRL_sk_type(sk), (i))) +#define sk_X509_CRL_delete_ptr(sk, ptr) ((X509_CRL *)OPENSSL_sk_delete_ptr(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr))) +#define sk_X509_CRL_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_pop(sk) ((X509_CRL *)OPENSSL_sk_pop(ossl_check_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_shift(sk) ((X509_CRL *)OPENSSL_sk_shift(ossl_check_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_CRL_sk_type(sk),ossl_check_X509_CRL_freefunc_type(freefunc)) +#define sk_X509_CRL_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr), (idx)) +#define sk_X509_CRL_set(sk, idx, ptr) ((X509_CRL *)OPENSSL_sk_set(ossl_check_X509_CRL_sk_type(sk), (idx), ossl_check_X509_CRL_type(ptr))) +#define sk_X509_CRL_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr), pnum) +#define sk_X509_CRL_sort(sk) OPENSSL_sk_sort(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_dup(sk) ((STACK_OF(X509_CRL) *)OPENSSL_sk_dup(ossl_check_const_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_CRL) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_CRL_sk_type(sk), ossl_check_X509_CRL_copyfunc_type(copyfunc), ossl_check_X509_CRL_freefunc_type(freefunc))) +#define sk_X509_CRL_set_cmp_func(sk, cmp) ((sk_X509_CRL_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_compfunc_type(cmp))) + + +/* Flags for X509_get_signature_info() */ +/* Signature info is valid */ +# define X509_SIG_INFO_VALID 0x1 +/* Signature is suitable for TLS use */ +# define X509_SIG_INFO_TLS 0x2 + +# define X509_FILETYPE_PEM 1 +# define X509_FILETYPE_ASN1 2 +# define X509_FILETYPE_DEFAULT 3 + +# define X509v3_KU_DIGITAL_SIGNATURE 0x0080 +# define X509v3_KU_NON_REPUDIATION 0x0040 +# define X509v3_KU_KEY_ENCIPHERMENT 0x0020 +# define X509v3_KU_DATA_ENCIPHERMENT 0x0010 +# define X509v3_KU_KEY_AGREEMENT 0x0008 +# define X509v3_KU_KEY_CERT_SIGN 0x0004 +# define X509v3_KU_CRL_SIGN 0x0002 +# define X509v3_KU_ENCIPHER_ONLY 0x0001 +# define X509v3_KU_DECIPHER_ONLY 0x8000 +# define X509v3_KU_UNDEF 0xffff + +struct X509_algor_st { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; +} /* X509_ALGOR */ ; + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; +} X509_VAL; + +typedef struct X509_sig_st X509_SIG; + +typedef struct X509_name_entry_st X509_NAME_ENTRY; + +SKM_DEFINE_STACK_OF_INTERNAL(X509_NAME_ENTRY, X509_NAME_ENTRY, X509_NAME_ENTRY) +#define sk_X509_NAME_ENTRY_num(sk) OPENSSL_sk_num(ossl_check_const_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_value(sk, idx) ((X509_NAME_ENTRY *)OPENSSL_sk_value(ossl_check_const_X509_NAME_ENTRY_sk_type(sk), (idx))) +#define sk_X509_NAME_ENTRY_new(cmp) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new(ossl_check_X509_NAME_ENTRY_compfunc_type(cmp))) +#define sk_X509_NAME_ENTRY_new_null() ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new_null()) +#define sk_X509_NAME_ENTRY_new_reserve(cmp, n) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new_reserve(ossl_check_X509_NAME_ENTRY_compfunc_type(cmp), (n))) +#define sk_X509_NAME_ENTRY_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_NAME_ENTRY_sk_type(sk), (n)) +#define sk_X509_NAME_ENTRY_free(sk) OPENSSL_sk_free(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_zero(sk) OPENSSL_sk_zero(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_delete(sk, i) ((X509_NAME_ENTRY *)OPENSSL_sk_delete(ossl_check_X509_NAME_ENTRY_sk_type(sk), (i))) +#define sk_X509_NAME_ENTRY_delete_ptr(sk, ptr) ((X509_NAME_ENTRY *)OPENSSL_sk_delete_ptr(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr))) +#define sk_X509_NAME_ENTRY_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_pop(sk) ((X509_NAME_ENTRY *)OPENSSL_sk_pop(ossl_check_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_shift(sk) ((X509_NAME_ENTRY *)OPENSSL_sk_shift(ossl_check_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_NAME_ENTRY_sk_type(sk),ossl_check_X509_NAME_ENTRY_freefunc_type(freefunc)) +#define sk_X509_NAME_ENTRY_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr), (idx)) +#define sk_X509_NAME_ENTRY_set(sk, idx, ptr) ((X509_NAME_ENTRY *)OPENSSL_sk_set(ossl_check_X509_NAME_ENTRY_sk_type(sk), (idx), ossl_check_X509_NAME_ENTRY_type(ptr))) +#define sk_X509_NAME_ENTRY_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr), pnum) +#define sk_X509_NAME_ENTRY_sort(sk) OPENSSL_sk_sort(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_dup(sk) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_dup(ossl_check_const_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_copyfunc_type(copyfunc), ossl_check_X509_NAME_ENTRY_freefunc_type(freefunc))) +#define sk_X509_NAME_ENTRY_set_cmp_func(sk, cmp) ((sk_X509_NAME_ENTRY_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_compfunc_type(cmp))) + + +# define X509_EX_V_NETSCAPE_HACK 0x8000 +# define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st X509_EXTENSION; +SKM_DEFINE_STACK_OF_INTERNAL(X509_EXTENSION, X509_EXTENSION, X509_EXTENSION) +#define sk_X509_EXTENSION_num(sk) OPENSSL_sk_num(ossl_check_const_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_value(sk, idx) ((X509_EXTENSION *)OPENSSL_sk_value(ossl_check_const_X509_EXTENSION_sk_type(sk), (idx))) +#define sk_X509_EXTENSION_new(cmp) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new(ossl_check_X509_EXTENSION_compfunc_type(cmp))) +#define sk_X509_EXTENSION_new_null() ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new_null()) +#define sk_X509_EXTENSION_new_reserve(cmp, n) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new_reserve(ossl_check_X509_EXTENSION_compfunc_type(cmp), (n))) +#define sk_X509_EXTENSION_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_EXTENSION_sk_type(sk), (n)) +#define sk_X509_EXTENSION_free(sk) OPENSSL_sk_free(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_zero(sk) OPENSSL_sk_zero(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_delete(sk, i) ((X509_EXTENSION *)OPENSSL_sk_delete(ossl_check_X509_EXTENSION_sk_type(sk), (i))) +#define sk_X509_EXTENSION_delete_ptr(sk, ptr) ((X509_EXTENSION *)OPENSSL_sk_delete_ptr(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr))) +#define sk_X509_EXTENSION_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_pop(sk) ((X509_EXTENSION *)OPENSSL_sk_pop(ossl_check_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_shift(sk) ((X509_EXTENSION *)OPENSSL_sk_shift(ossl_check_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_EXTENSION_sk_type(sk),ossl_check_X509_EXTENSION_freefunc_type(freefunc)) +#define sk_X509_EXTENSION_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr), (idx)) +#define sk_X509_EXTENSION_set(sk, idx, ptr) ((X509_EXTENSION *)OPENSSL_sk_set(ossl_check_X509_EXTENSION_sk_type(sk), (idx), ossl_check_X509_EXTENSION_type(ptr))) +#define sk_X509_EXTENSION_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr), pnum) +#define sk_X509_EXTENSION_sort(sk) OPENSSL_sk_sort(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_dup(sk) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_dup(ossl_check_const_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_copyfunc_type(copyfunc), ossl_check_X509_EXTENSION_freefunc_type(freefunc))) +#define sk_X509_EXTENSION_set_cmp_func(sk, cmp) ((sk_X509_EXTENSION_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_compfunc_type(cmp))) + +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; +typedef struct x509_attributes_st X509_ATTRIBUTE; +SKM_DEFINE_STACK_OF_INTERNAL(X509_ATTRIBUTE, X509_ATTRIBUTE, X509_ATTRIBUTE) +#define sk_X509_ATTRIBUTE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_value(sk, idx) ((X509_ATTRIBUTE *)OPENSSL_sk_value(ossl_check_const_X509_ATTRIBUTE_sk_type(sk), (idx))) +#define sk_X509_ATTRIBUTE_new(cmp) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new(ossl_check_X509_ATTRIBUTE_compfunc_type(cmp))) +#define sk_X509_ATTRIBUTE_new_null() ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new_null()) +#define sk_X509_ATTRIBUTE_new_reserve(cmp, n) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new_reserve(ossl_check_X509_ATTRIBUTE_compfunc_type(cmp), (n))) +#define sk_X509_ATTRIBUTE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_ATTRIBUTE_sk_type(sk), (n)) +#define sk_X509_ATTRIBUTE_free(sk) OPENSSL_sk_free(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_delete(sk, i) ((X509_ATTRIBUTE *)OPENSSL_sk_delete(ossl_check_X509_ATTRIBUTE_sk_type(sk), (i))) +#define sk_X509_ATTRIBUTE_delete_ptr(sk, ptr) ((X509_ATTRIBUTE *)OPENSSL_sk_delete_ptr(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr))) +#define sk_X509_ATTRIBUTE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_pop(sk) ((X509_ATTRIBUTE *)OPENSSL_sk_pop(ossl_check_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_shift(sk) ((X509_ATTRIBUTE *)OPENSSL_sk_shift(ossl_check_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_ATTRIBUTE_sk_type(sk),ossl_check_X509_ATTRIBUTE_freefunc_type(freefunc)) +#define sk_X509_ATTRIBUTE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr), (idx)) +#define sk_X509_ATTRIBUTE_set(sk, idx, ptr) ((X509_ATTRIBUTE *)OPENSSL_sk_set(ossl_check_X509_ATTRIBUTE_sk_type(sk), (idx), ossl_check_X509_ATTRIBUTE_type(ptr))) +#define sk_X509_ATTRIBUTE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr), pnum) +#define sk_X509_ATTRIBUTE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_dup(sk) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_dup(ossl_check_const_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_copyfunc_type(copyfunc), ossl_check_X509_ATTRIBUTE_freefunc_type(freefunc))) +#define sk_X509_ATTRIBUTE_set_cmp_func(sk, cmp) ((sk_X509_ATTRIBUTE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_compfunc_type(cmp))) + +typedef struct X509_req_info_st X509_REQ_INFO; +typedef struct X509_req_st X509_REQ; +typedef struct x509_cert_aux_st X509_CERT_AUX; +typedef struct x509_cinf_st X509_CINF; + +/* Flags for X509_print_ex() */ + +# define X509_FLAG_COMPAT 0 +# define X509_FLAG_NO_HEADER 1L +# define X509_FLAG_NO_VERSION (1L << 1) +# define X509_FLAG_NO_SERIAL (1L << 2) +# define X509_FLAG_NO_SIGNAME (1L << 3) +# define X509_FLAG_NO_ISSUER (1L << 4) +# define X509_FLAG_NO_VALIDITY (1L << 5) +# define X509_FLAG_NO_SUBJECT (1L << 6) +# define X509_FLAG_NO_PUBKEY (1L << 7) +# define X509_FLAG_NO_EXTENSIONS (1L << 8) +# define X509_FLAG_NO_SIGDUMP (1L << 9) +# define X509_FLAG_NO_AUX (1L << 10) +# define X509_FLAG_NO_ATTRIBUTES (1L << 11) +# define X509_FLAG_NO_IDS (1L << 12) +# define X509_FLAG_EXTENSIONS_ONLY_KID (1L << 13) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +# define XN_FLAG_SEP_MASK (0xf << 16) + +# define XN_FLAG_COMPAT 0/* Traditional; use old X509_NAME_print */ +# define XN_FLAG_SEP_COMMA_PLUS (1 << 16)/* RFC2253 ,+ */ +# define XN_FLAG_SEP_CPLUS_SPC (2 << 16)/* ,+ spaced: more readable */ +# define XN_FLAG_SEP_SPLUS_SPC (3 << 16)/* ;+ spaced */ +# define XN_FLAG_SEP_MULTILINE (4 << 16)/* One line per field */ + +# define XN_FLAG_DN_REV (1 << 20)/* Reverse DN order */ + +/* How the field name is shown */ + +# define XN_FLAG_FN_MASK (0x3 << 21) + +# define XN_FLAG_FN_SN 0/* Object short name */ +# define XN_FLAG_FN_LN (1 << 21)/* Object long name */ +# define XN_FLAG_FN_OID (2 << 21)/* Always use OIDs */ +# define XN_FLAG_FN_NONE (3 << 21)/* No field names */ + +# define XN_FLAG_SPC_EQ (1 << 23)/* Put spaces round '=' */ + +/* + * This determines if we dump fields we don't recognise: RFC2253 requires + * this. + */ + +# define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +# define XN_FLAG_FN_ALIGN (1 << 25)/* Align field names to 20 + * characters */ + +/* Complete set of RFC2253 flags */ + +# define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \ + XN_FLAG_SEP_COMMA_PLUS | \ + XN_FLAG_DN_REV | \ + XN_FLAG_FN_SN | \ + XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +# define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \ + ASN1_STRFLGS_ESC_QUOTE | \ + XN_FLAG_SEP_CPLUS_SPC | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_SN) + +/* readable multiline form */ + +# define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \ + ASN1_STRFLGS_ESC_MSB | \ + XN_FLAG_SEP_MULTILINE | \ + XN_FLAG_SPC_EQ | \ + XN_FLAG_FN_LN | \ + XN_FLAG_FN_ALIGN) + +typedef struct X509_crl_info_st X509_CRL_INFO; + +typedef struct private_key_st { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; +} X509_PKEY; + +typedef struct X509_info_st { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; +} X509_INFO; +SKM_DEFINE_STACK_OF_INTERNAL(X509_INFO, X509_INFO, X509_INFO) +#define sk_X509_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_value(sk, idx) ((X509_INFO *)OPENSSL_sk_value(ossl_check_const_X509_INFO_sk_type(sk), (idx))) +#define sk_X509_INFO_new(cmp) ((STACK_OF(X509_INFO) *)OPENSSL_sk_new(ossl_check_X509_INFO_compfunc_type(cmp))) +#define sk_X509_INFO_new_null() ((STACK_OF(X509_INFO) *)OPENSSL_sk_new_null()) +#define sk_X509_INFO_new_reserve(cmp, n) ((STACK_OF(X509_INFO) *)OPENSSL_sk_new_reserve(ossl_check_X509_INFO_compfunc_type(cmp), (n))) +#define sk_X509_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_INFO_sk_type(sk), (n)) +#define sk_X509_INFO_free(sk) OPENSSL_sk_free(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_delete(sk, i) ((X509_INFO *)OPENSSL_sk_delete(ossl_check_X509_INFO_sk_type(sk), (i))) +#define sk_X509_INFO_delete_ptr(sk, ptr) ((X509_INFO *)OPENSSL_sk_delete_ptr(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr))) +#define sk_X509_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_pop(sk) ((X509_INFO *)OPENSSL_sk_pop(ossl_check_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_shift(sk) ((X509_INFO *)OPENSSL_sk_shift(ossl_check_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_INFO_sk_type(sk),ossl_check_X509_INFO_freefunc_type(freefunc)) +#define sk_X509_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr), (idx)) +#define sk_X509_INFO_set(sk, idx, ptr) ((X509_INFO *)OPENSSL_sk_set(ossl_check_X509_INFO_sk_type(sk), (idx), ossl_check_X509_INFO_type(ptr))) +#define sk_X509_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr), pnum) +#define sk_X509_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_dup(sk) ((STACK_OF(X509_INFO) *)OPENSSL_sk_dup(ossl_check_const_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_INFO_sk_type(sk), ossl_check_X509_INFO_copyfunc_type(copyfunc), ossl_check_X509_INFO_freefunc_type(freefunc))) +#define sk_X509_INFO_set_cmp_func(sk, cmp) ((sk_X509_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_compfunc_type(cmp))) + + +/* + * The next 2 structures and their 8 routines are used to manipulate Netscape's + * spki structures - useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ +} NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR sig_algor; + ASN1_BIT_STRING *signature; +} NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; +} NETSCAPE_CERT_SEQUENCE; + +/*- Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { + X509_ALGOR *keyfunc; + X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { +/* Usually OCTET STRING but could be anything */ + ASN1_TYPE *salt; + ASN1_INTEGER *iter; + ASN1_INTEGER *keylength; + X509_ALGOR *prf; +} PBKDF2PARAM; + +#ifndef OPENSSL_NO_SCRYPT +typedef struct SCRYPT_PARAMS_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *costParameter; + ASN1_INTEGER *blockSize; + ASN1_INTEGER *parallelizationParameter; + ASN1_INTEGER *keyLength; +} SCRYPT_PARAMS; +#endif + +#ifdef __cplusplus +} +#endif + +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +# define X509_EXT_PACK_UNKNOWN 1 +# define X509_EXT_PACK_STRING 2 + +# define X509_extract_key(x) X509_get_pubkey(x)/*****/ +# define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +# define X509_name_cmp(a,b) X509_NAME_cmp((a),(b)) + +void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); +X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl), + int (*crl_free) (X509_CRL *crl), + int (*crl_lookup) (X509_CRL *crl, + X509_REVOKED **ret, + const + ASN1_INTEGER *serial, + const + X509_NAME *issuer), + int (*crl_verify) (X509_CRL *crl, + EVP_PKEY *pk)); +void X509_CRL_METHOD_free(X509_CRL_METHOD *m); + +void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); +void *X509_CRL_get_meth_data(X509_CRL *crl); + +const char *X509_verify_cert_error_string(long n); + +int X509_verify(X509 *a, EVP_PKEY *r); +int X509_self_signed(X509 *cert, int verify_signature); + +int X509_REQ_verify_ex(X509_REQ *a, EVP_PKEY *r, OSSL_LIB_CTX *libctx, + const char *propq); +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len); +char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent); +int X509_signature_print(BIO *bp, const X509_ALGOR *alg, + const ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +ASN1_OCTET_STRING *X509_digest_sig(const X509 *cert, + EVP_MD **md_used, int *md_is_fallback); +int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); + +X509 *X509_load_http(const char *url, BIO *bio, BIO *rbio, int timeout); +X509_CRL *X509_CRL_load_http(const char *url, BIO *bio, BIO *rbio, int timeout); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# include /* OSSL_HTTP_REQ_CTX_nbio_d2i */ +# define X509_http_nbio(rctx, pcert) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(rctx, pcert, ASN1_ITEM_rptr(X509)) +# define X509_CRL_http_nbio(rctx, pcrl) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(rctx, pcrl, ASN1_ITEM_rptr(X509_CRL)) +# endif + +# ifndef OPENSSL_NO_STDIO +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp, const X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPrivateKey_fp(FILE *fp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPublicKey_fp(FILE *fp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSA_PUBKEY_fp(FILE *fp, const RSA *rsa); +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_DSA +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSA_PUBKEY_fp(FILE *fp, const DSA *dsa); +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSAPrivateKey_fp(FILE *fp, const DSA *dsa); +# endif +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_EC +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_EC_PUBKEY_fp(FILE *fp, const EC_KEY *eckey); +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey_fp(FILE *fp, const EC_KEY *eckey); +# endif /* OPENSSL_NO_EC */ +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ +X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp, const X509_SIG *p8); +X509_PUBKEY *d2i_X509_PUBKEY_fp(FILE *fp, X509_PUBKEY **xpk); +int i2d_X509_PUBKEY_fp(FILE *fp, const X509_PUBKEY *xpk); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, const PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_ex_fp(FILE *fp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); +# endif + +X509 *d2i_X509_bio(BIO *bp, X509 **x509); +int i2d_X509_bio(BIO *bp, const X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPrivateKey_bio(BIO *bp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPublicKey_bio(BIO *bp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSA_PUBKEY_bio(BIO *bp, const RSA *rsa); +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_DSA +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSA_PUBKEY_bio(BIO *bp, const DSA *dsa); +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSAPrivateKey_bio(BIO *bp, const DSA *dsa); +# endif +# endif + +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_EC +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_EC_PUBKEY_bio(BIO *bp, const EC_KEY *eckey); +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey_bio(BIO *bp, const EC_KEY *eckey); +# endif /* OPENSSL_NO_EC */ +# endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp, const X509_SIG *p8); +X509_PUBKEY *d2i_X509_PUBKEY_bio(BIO *bp, X509_PUBKEY **xpk); +int i2d_X509_PUBKEY_bio(BIO *bp, const X509_PUBKEY *xpk); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, const PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_ex_bio(BIO *bp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); + +DECLARE_ASN1_DUP_FUNCTION(X509) +DECLARE_ASN1_DUP_FUNCTION(X509_ALGOR) +DECLARE_ASN1_DUP_FUNCTION(X509_ATTRIBUTE) +DECLARE_ASN1_DUP_FUNCTION(X509_CRL) +DECLARE_ASN1_DUP_FUNCTION(X509_EXTENSION) +DECLARE_ASN1_DUP_FUNCTION(X509_PUBKEY) +DECLARE_ASN1_DUP_FUNCTION(X509_REQ) +DECLARE_ASN1_DUP_FUNCTION(X509_REVOKED) +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, + void *pval); +void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype, + const void **ppval, const X509_ALGOR *algor); +void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); +int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); +int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src); + +DECLARE_ASN1_DUP_FUNCTION(X509_NAME) +DECLARE_ASN1_DUP_FUNCTION(X509_NAME_ENTRY) + +int X509_cmp_time(const ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(const ASN1_TIME *s); +int X509_cmp_timeframe(const X509_VERIFY_PARAM *vpm, + const ASN1_TIME *start, const ASN1_TIME *end); +ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, + int offset_day, long offset_sec, time_t *t); +ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char *X509_get_default_cert_area(void); +const char *X509_get_default_cert_dir(void); +const char *X509_get_default_cert_file(void); +const char *X509_get_default_cert_dir_env(void); +const char *X509_get_default_cert_file_env(void); +const char *X509_get_default_private_dir(void); + +X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey); + +DECLARE_ASN1_FUNCTIONS(X509_ALGOR) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS) +DECLARE_ASN1_FUNCTIONS(X509_VAL) + +DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) + +X509_PUBKEY *X509_PUBKEY_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); +EVP_PKEY *X509_PUBKEY_get0(const X509_PUBKEY *key); +EVP_PKEY *X509_PUBKEY_get(const X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); +long X509_get_pathlen(X509 *x); +DECLARE_ASN1_ENCODE_FUNCTIONS_only(EVP_PKEY, PUBKEY) +EVP_PKEY *d2i_PUBKEY_ex(EVP_PKEY **a, const unsigned char **pp, long length, + OSSL_LIB_CTX *libctx, const char *propq); +# ifndef OPENSSL_NO_DEPRECATED_3_0 +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0,RSA, RSA_PUBKEY) +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_DSA +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0,DSA, DSA_PUBKEY) +# endif +# endif +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# ifndef OPENSSL_NO_EC +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, EC_KEY, EC_PUBKEY) +# endif +# endif + +DECLARE_ASN1_FUNCTIONS(X509_SIG) +void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **palg, + const ASN1_OCTET_STRING **pdigest); +void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **palg, + ASN1_OCTET_STRING **pdigest); + +DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS(X509_REQ) +X509_REQ *X509_REQ_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS) + +DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) + +DECLARE_ASN1_FUNCTIONS(X509_NAME) + +int X509_NAME_set(X509_NAME **xn, const X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(X509_CINF) +DECLARE_ASN1_FUNCTIONS(X509) +X509 *X509_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) + +#define X509_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509, l, p, newf, dupf, freef) +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(const X509 *r, int idx); +DECLARE_ASN1_ENCODE_FUNCTIONS_only(X509,X509_AUX) + +int i2d_re_X509_tbs(X509 *x, unsigned char **pp); + +int X509_SIG_INFO_get(const X509_SIG_INFO *siginf, int *mdnid, int *pknid, + int *secbits, uint32_t *flags); +void X509_SIG_INFO_set(X509_SIG_INFO *siginf, int mdnid, int pknid, + int secbits, uint32_t flags); + +int X509_get_signature_info(X509 *x, int *mdnid, int *pknid, int *secbits, + uint32_t *flags); + +void X509_get0_signature(const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg, const X509 *x); +int X509_get_signature_nid(const X509 *x); + +void X509_set0_distinguishing_id(X509 *x, ASN1_OCTET_STRING *d_id); +ASN1_OCTET_STRING *X509_get0_distinguishing_id(X509 *x); +void X509_REQ_set0_distinguishing_id(X509_REQ *x, ASN1_OCTET_STRING *d_id); +ASN1_OCTET_STRING *X509_REQ_get0_distinguishing_id(X509_REQ *x); + +int X509_alias_set1(X509 *x, const unsigned char *name, int len); +int X509_keyid_set1(X509 *x, const unsigned char *id, int len); +unsigned char *X509_alias_get0(X509 *x, int *len); +unsigned char *X509_keyid_get0(X509 *x, int *len); + +DECLARE_ASN1_FUNCTIONS(X509_REVOKED) +DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS(X509_CRL) +X509_CRL *X509_CRL_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); +int X509_CRL_get0_by_serial(X509_CRL *crl, + X509_REVOKED **ret, const ASN1_INTEGER *serial); +int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); + +X509_PKEY *X509_PKEY_new(void); +void X509_PKEY_free(X509_PKEY *a); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +X509_INFO *X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char *X509_NAME_oneline(const X509_NAME *a, char *buf, int size); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey); +OSSL_DEPRECATEDIN_3_0 +int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, + unsigned char *md, unsigned int *len); +OSSL_DEPRECATEDIN_3_0 +int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey, + const EVP_MD *type); +#endif +int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data, + unsigned char *md, unsigned int *len); +int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + EVP_PKEY *pkey); +int ASN1_item_verify_ctx(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + EVP_MD_CTX *ctx); +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, const void *data, + EVP_PKEY *pkey, const EVP_MD *md); +int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + const void *data, EVP_MD_CTX *ctx); + +#define X509_VERSION_1 0 +#define X509_VERSION_2 1 +#define X509_VERSION_3 2 + +long X509_get_version(const X509 *x); +int X509_set_version(X509 *x, long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER *X509_get_serialNumber(X509 *x); +const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x); +int X509_set_issuer_name(X509 *x, const X509_NAME *name); +X509_NAME *X509_get_issuer_name(const X509 *a); +int X509_set_subject_name(X509 *x, const X509_NAME *name); +X509_NAME *X509_get_subject_name(const X509 *a); +const ASN1_TIME * X509_get0_notBefore(const X509 *x); +ASN1_TIME *X509_getm_notBefore(const X509 *x); +int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm); +const ASN1_TIME *X509_get0_notAfter(const X509 *x); +ASN1_TIME *X509_getm_notAfter(const X509 *x); +int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +int X509_up_ref(X509 *x); +int X509_get_signature_type(const X509 *x); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define X509_get_notBefore X509_getm_notBefore +# define X509_get_notAfter X509_getm_notAfter +# define X509_set_notBefore X509_set1_notBefore +# define X509_set_notAfter X509_set1_notAfter +#endif + + +/* + * This one is only used so that a binary form can output, as in + * i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x), &buf) + */ +X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x); +const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x); +void X509_get0_uids(const X509 *x, const ASN1_BIT_STRING **piuid, + const ASN1_BIT_STRING **psuid); +const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x); + +EVP_PKEY *X509_get0_pubkey(const X509 *x); +EVP_PKEY *X509_get_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); + +#define X509_REQ_VERSION_1 0 + +long X509_REQ_get_version(const X509_REQ *req); +int X509_REQ_set_version(X509_REQ *x, long version); +X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req); +int X509_REQ_set_subject_name(X509_REQ *req, const X509_NAME *name); +void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +void X509_REQ_set0_signature(X509_REQ *req, ASN1_BIT_STRING *psig); +int X509_REQ_set1_signature_algo(X509_REQ *req, X509_ALGOR *palg); +int X509_REQ_get_signature_nid(const X509_REQ *req); +int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +EVP_PKEY *X509_REQ_get0_pubkey(X509_REQ *req); +X509_PUBKEY *X509_REQ_get_X509_PUBKEY(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int *X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, + const STACK_OF(X509_EXTENSION) *exts, int nid); +int X509_REQ_add_extensions(X509_REQ *req, const STACK_OF(X509_EXTENSION) *ext); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +#define X509_CRL_VERSION_1 0 +#define X509_CRL_VERSION_2 1 + +int X509_CRL_set_version(X509_CRL *x, long version); +int X509_CRL_set_issuer_name(X509_CRL *x, const X509_NAME *name); +int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); +int X509_CRL_up_ref(X509_CRL *crl); + +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate +# define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate +#endif + +long X509_CRL_get_version(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl); +OSSL_DEPRECATEDIN_1_1_0 ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl); +#endif +X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl); +const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl); +STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl); +void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +int X509_CRL_get_signature_nid(const X509_CRL *crl); +int i2d_re_X509_CRL_tbs(X509_CRL *req, unsigned char **pp); + +const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x); +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); +const STACK_OF(X509_EXTENSION) * +X509_REVOKED_get0_extensions(const X509_REVOKED *r); + +X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, + EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); + +int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey); + +int X509_check_private_key(const X509 *x509, const EVP_PKEY *pkey); +int X509_chain_check_suiteb(int *perror_depth, + X509 *x, STACK_OF(X509) *chain, + unsigned long flags); +int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +# ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +# endif + +# define X509_ADD_FLAG_DEFAULT 0 +# define X509_ADD_FLAG_UP_REF 0x1 +# define X509_ADD_FLAG_PREPEND 0x2 +# define X509_ADD_FLAG_NO_DUP 0x4 +# define X509_ADD_FLAG_NO_SS 0x8 +int X509_add_cert(STACK_OF(X509) *sk, X509 *cert, int flags); +int X509_add_certs(STACK_OF(X509) *sk, STACK_OF(X509) *certs, int flags); + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +# define X509_NAME_hash(x) X509_NAME_hash_ex(x, NULL, NULL, NULL) +OSSL_DEPRECATEDIN_3_0 int X509_certificate_type(const X509 *x, + const EVP_PKEY *pubkey); +#endif +unsigned long X509_NAME_hash_ex(const X509_NAME *x, OSSL_LIB_CTX *libctx, + const char *propq, int *ok); +unsigned long X509_NAME_hash_old(const X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +int X509_aux_print(BIO *out, X509 *x, int indent); +# ifndef OPENSSL_NO_STDIO +int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print_fp(FILE *bp, X509 *x); +int X509_CRL_print_fp(FILE *bp, X509_CRL *x); +int X509_REQ_print_fp(FILE *bp, X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent, + unsigned long flags); +# endif + +int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, + unsigned long flags); +int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print(BIO *bp, X509 *x); +int X509_ocspid_print(BIO *bp, X509 *x); +int X509_CRL_print_ex(BIO *out, X509_CRL *x, unsigned long nmflag); +int X509_CRL_print(BIO *bp, X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, + unsigned long cflag); +int X509_REQ_print(BIO *bp, X509_REQ *req); + +int X509_NAME_entry_count(const X509_NAME *name); +int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid, + char *buf, int len); +int X509_NAME_get_text_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, + char *buf, int len); + +/* + * NOTE: you should be passing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. + */ +int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos); +int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len, int loc, + int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, + const unsigned char *bytes, + int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type, + const unsigned char *bytes, + int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj); +int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, + const unsigned char *bytes, int len); +ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne); +ASN1_STRING * X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne); +int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne); + +int X509_NAME_get0_der(const X509_NAME *nm, const unsigned char **pder, + size_t *pderlen); + +int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + const ASN1_OBJECT *obj, int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); + +int X509_get_ext_count(const X509 *x); +int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos); +int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(const X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void *X509_get_ext_d2i(const X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(const X509_CRL *x); +int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj, + int lastpos); +int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void *X509_CRL_get_ext_d2i(const X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(const X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj, + int lastpos); +int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit, + int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *x, int nid, int *crit, + int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, + ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + const ASN1_OBJECT *obj, int crit, + ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data); +ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(const X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, + const ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) + **x, const ASN1_OBJECT *obj, + int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) + **x, int nid, int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) + **x, const char *attrname, + int type, + const unsigned char *bytes, + int len); +void *X509at_get0_data_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *x, + const ASN1_OBJECT *obj, int lastpos, int type); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, + const unsigned char *bytes, + int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, + const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, + void *data); +int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, const X509_NAME *name, + const ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk, const X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(PBEPARAM) +DECLARE_ASN1_FUNCTIONS(PBE2PARAM) +DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) +#ifndef OPENSSL_NO_SCRYPT +DECLARE_ASN1_FUNCTIONS(SCRYPT_PARAMS) +#endif + +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen); +int PKCS5_pbe_set0_algor_ex(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen, + OSSL_LIB_CTX *libctx); + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, + const unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe_set_ex(int alg, int iter, + const unsigned char *salt, int saltlen, + OSSL_LIB_CTX *libctx); + +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid); +X509_ALGOR *PKCS5_pbe2_set_iv_ex(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid, + OSSL_LIB_CTX *libctx); + +#ifndef OPENSSL_NO_SCRYPT +X509_ALGOR *PKCS5_pbe2_set_scrypt(const EVP_CIPHER *cipher, + const unsigned char *salt, int saltlen, + unsigned char *aiv, uint64_t N, uint64_t r, + uint64_t p); +#endif + +X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen); +X509_ALGOR *PKCS5_pbkdf2_set_ex(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen, + OSSL_LIB_CTX *libctx); + +/* PKCS#8 utilities */ + +DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) + +EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8); +EVP_PKEY *EVP_PKCS82PKEY_ex(const PKCS8_PRIV_KEY_INFO *p8, OSSL_LIB_CTX *libctx, + const char *propq); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey); + +int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, + int version, int ptype, void *pval, + unsigned char *penc, int penclen); +int PKCS8_pkey_get0(const ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + const X509_ALGOR **pa, const PKCS8_PRIV_KEY_INFO *p8); + +const STACK_OF(X509_ATTRIBUTE) * +PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8); +int PKCS8_pkey_add1_attr(PKCS8_PRIV_KEY_INFO *p8, X509_ATTRIBUTE *attr); +int PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type, + const unsigned char *bytes, int len); +int PKCS8_pkey_add1_attr_by_OBJ(PKCS8_PRIV_KEY_INFO *p8, const ASN1_OBJECT *obj, + int type, const unsigned char *bytes, int len); + + +int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, + int ptype, void *pval, + unsigned char *penc, int penclen); +int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, const X509_PUBKEY *pub); +int X509_PUBKEY_eq(const X509_PUBKEY *a, const X509_PUBKEY *b); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/x509_vfy.h b/OtherInc/openssl/include/openssl/x509_vfy.h new file mode 100644 index 0000000..e04df0d --- /dev/null +++ b/OtherInc/openssl/include/openssl/x509_vfy.h @@ -0,0 +1,894 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\x509_vfy.h.in + * + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_X509_VFY_H +# define OPENSSL_X509_VFY_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_X509_VFY_H +# endif + +/* + * Protect against recursion, x509.h and x509_vfy.h each include the other. + */ +# ifndef OPENSSL_X509_H +# include +# endif + +# include +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/*- +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +typedef enum { + X509_LU_NONE = 0, + X509_LU_X509, X509_LU_CRL +} X509_LOOKUP_TYPE; + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_LU_RETRY -1 +#define X509_LU_FAIL 0 +#endif + +SKM_DEFINE_STACK_OF_INTERNAL(X509_LOOKUP, X509_LOOKUP, X509_LOOKUP) +#define sk_X509_LOOKUP_num(sk) OPENSSL_sk_num(ossl_check_const_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_value(sk, idx) ((X509_LOOKUP *)OPENSSL_sk_value(ossl_check_const_X509_LOOKUP_sk_type(sk), (idx))) +#define sk_X509_LOOKUP_new(cmp) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new(ossl_check_X509_LOOKUP_compfunc_type(cmp))) +#define sk_X509_LOOKUP_new_null() ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new_null()) +#define sk_X509_LOOKUP_new_reserve(cmp, n) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new_reserve(ossl_check_X509_LOOKUP_compfunc_type(cmp), (n))) +#define sk_X509_LOOKUP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_LOOKUP_sk_type(sk), (n)) +#define sk_X509_LOOKUP_free(sk) OPENSSL_sk_free(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_zero(sk) OPENSSL_sk_zero(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_delete(sk, i) ((X509_LOOKUP *)OPENSSL_sk_delete(ossl_check_X509_LOOKUP_sk_type(sk), (i))) +#define sk_X509_LOOKUP_delete_ptr(sk, ptr) ((X509_LOOKUP *)OPENSSL_sk_delete_ptr(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr))) +#define sk_X509_LOOKUP_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_pop(sk) ((X509_LOOKUP *)OPENSSL_sk_pop(ossl_check_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_shift(sk) ((X509_LOOKUP *)OPENSSL_sk_shift(ossl_check_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_LOOKUP_sk_type(sk),ossl_check_X509_LOOKUP_freefunc_type(freefunc)) +#define sk_X509_LOOKUP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr), (idx)) +#define sk_X509_LOOKUP_set(sk, idx, ptr) ((X509_LOOKUP *)OPENSSL_sk_set(ossl_check_X509_LOOKUP_sk_type(sk), (idx), ossl_check_X509_LOOKUP_type(ptr))) +#define sk_X509_LOOKUP_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr), pnum) +#define sk_X509_LOOKUP_sort(sk) OPENSSL_sk_sort(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_dup(sk) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_dup(ossl_check_const_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_copyfunc_type(copyfunc), ossl_check_X509_LOOKUP_freefunc_type(freefunc))) +#define sk_X509_LOOKUP_set_cmp_func(sk, cmp) ((sk_X509_LOOKUP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_OBJECT, X509_OBJECT, X509_OBJECT) +#define sk_X509_OBJECT_num(sk) OPENSSL_sk_num(ossl_check_const_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_value(sk, idx) ((X509_OBJECT *)OPENSSL_sk_value(ossl_check_const_X509_OBJECT_sk_type(sk), (idx))) +#define sk_X509_OBJECT_new(cmp) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new(ossl_check_X509_OBJECT_compfunc_type(cmp))) +#define sk_X509_OBJECT_new_null() ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new_null()) +#define sk_X509_OBJECT_new_reserve(cmp, n) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new_reserve(ossl_check_X509_OBJECT_compfunc_type(cmp), (n))) +#define sk_X509_OBJECT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_OBJECT_sk_type(sk), (n)) +#define sk_X509_OBJECT_free(sk) OPENSSL_sk_free(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_zero(sk) OPENSSL_sk_zero(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_delete(sk, i) ((X509_OBJECT *)OPENSSL_sk_delete(ossl_check_X509_OBJECT_sk_type(sk), (i))) +#define sk_X509_OBJECT_delete_ptr(sk, ptr) ((X509_OBJECT *)OPENSSL_sk_delete_ptr(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr))) +#define sk_X509_OBJECT_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_pop(sk) ((X509_OBJECT *)OPENSSL_sk_pop(ossl_check_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_shift(sk) ((X509_OBJECT *)OPENSSL_sk_shift(ossl_check_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_OBJECT_sk_type(sk),ossl_check_X509_OBJECT_freefunc_type(freefunc)) +#define sk_X509_OBJECT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr), (idx)) +#define sk_X509_OBJECT_set(sk, idx, ptr) ((X509_OBJECT *)OPENSSL_sk_set(ossl_check_X509_OBJECT_sk_type(sk), (idx), ossl_check_X509_OBJECT_type(ptr))) +#define sk_X509_OBJECT_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr), pnum) +#define sk_X509_OBJECT_sort(sk) OPENSSL_sk_sort(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_dup(sk) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_dup(ossl_check_const_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_copyfunc_type(copyfunc), ossl_check_X509_OBJECT_freefunc_type(freefunc))) +#define sk_X509_OBJECT_set_cmp_func(sk, cmp) ((sk_X509_OBJECT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_VERIFY_PARAM, X509_VERIFY_PARAM, X509_VERIFY_PARAM) +#define sk_X509_VERIFY_PARAM_num(sk) OPENSSL_sk_num(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_value(sk, idx) ((X509_VERIFY_PARAM *)OPENSSL_sk_value(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk), (idx))) +#define sk_X509_VERIFY_PARAM_new(cmp) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new(ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp))) +#define sk_X509_VERIFY_PARAM_new_null() ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new_null()) +#define sk_X509_VERIFY_PARAM_new_reserve(cmp, n) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new_reserve(ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp), (n))) +#define sk_X509_VERIFY_PARAM_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (n)) +#define sk_X509_VERIFY_PARAM_free(sk) OPENSSL_sk_free(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_zero(sk) OPENSSL_sk_zero(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_delete(sk, i) ((X509_VERIFY_PARAM *)OPENSSL_sk_delete(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (i))) +#define sk_X509_VERIFY_PARAM_delete_ptr(sk, ptr) ((X509_VERIFY_PARAM *)OPENSSL_sk_delete_ptr(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr))) +#define sk_X509_VERIFY_PARAM_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_pop(sk) ((X509_VERIFY_PARAM *)OPENSSL_sk_pop(ossl_check_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_shift(sk) ((X509_VERIFY_PARAM *)OPENSSL_sk_shift(ossl_check_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_VERIFY_PARAM_sk_type(sk),ossl_check_X509_VERIFY_PARAM_freefunc_type(freefunc)) +#define sk_X509_VERIFY_PARAM_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr), (idx)) +#define sk_X509_VERIFY_PARAM_set(sk, idx, ptr) ((X509_VERIFY_PARAM *)OPENSSL_sk_set(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (idx), ossl_check_X509_VERIFY_PARAM_type(ptr))) +#define sk_X509_VERIFY_PARAM_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr), pnum) +#define sk_X509_VERIFY_PARAM_sort(sk) OPENSSL_sk_sort(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_dup(sk) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_dup(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_copyfunc_type(copyfunc), ossl_check_X509_VERIFY_PARAM_freefunc_type(freefunc))) +#define sk_X509_VERIFY_PARAM_set_cmp_func(sk, cmp) ((sk_X509_VERIFY_PARAM_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp))) + + +/* This is used for a table of trust checking functions */ +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust) (struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; +SKM_DEFINE_STACK_OF_INTERNAL(X509_TRUST, X509_TRUST, X509_TRUST) +#define sk_X509_TRUST_num(sk) OPENSSL_sk_num(ossl_check_const_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_value(sk, idx) ((X509_TRUST *)OPENSSL_sk_value(ossl_check_const_X509_TRUST_sk_type(sk), (idx))) +#define sk_X509_TRUST_new(cmp) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new(ossl_check_X509_TRUST_compfunc_type(cmp))) +#define sk_X509_TRUST_new_null() ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new_null()) +#define sk_X509_TRUST_new_reserve(cmp, n) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new_reserve(ossl_check_X509_TRUST_compfunc_type(cmp), (n))) +#define sk_X509_TRUST_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_TRUST_sk_type(sk), (n)) +#define sk_X509_TRUST_free(sk) OPENSSL_sk_free(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_zero(sk) OPENSSL_sk_zero(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_delete(sk, i) ((X509_TRUST *)OPENSSL_sk_delete(ossl_check_X509_TRUST_sk_type(sk), (i))) +#define sk_X509_TRUST_delete_ptr(sk, ptr) ((X509_TRUST *)OPENSSL_sk_delete_ptr(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr))) +#define sk_X509_TRUST_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_pop(sk) ((X509_TRUST *)OPENSSL_sk_pop(ossl_check_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_shift(sk) ((X509_TRUST *)OPENSSL_sk_shift(ossl_check_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_TRUST_sk_type(sk),ossl_check_X509_TRUST_freefunc_type(freefunc)) +#define sk_X509_TRUST_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr), (idx)) +#define sk_X509_TRUST_set(sk, idx, ptr) ((X509_TRUST *)OPENSSL_sk_set(ossl_check_X509_TRUST_sk_type(sk), (idx), ossl_check_X509_TRUST_type(ptr))) +#define sk_X509_TRUST_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr), pnum) +#define sk_X509_TRUST_sort(sk) OPENSSL_sk_sort(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_dup(sk) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_dup(ossl_check_const_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_copyfunc_type(copyfunc), ossl_check_X509_TRUST_freefunc_type(freefunc))) +#define sk_X509_TRUST_set_cmp_func(sk, cmp) ((sk_X509_TRUST_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_compfunc_type(cmp))) + + +/* standard trust ids */ +# define X509_TRUST_DEFAULT 0 /* Only valid in purpose settings */ +# define X509_TRUST_COMPAT 1 +# define X509_TRUST_SSL_CLIENT 2 +# define X509_TRUST_SSL_SERVER 3 +# define X509_TRUST_EMAIL 4 +# define X509_TRUST_OBJECT_SIGN 5 +# define X509_TRUST_OCSP_SIGN 6 +# define X509_TRUST_OCSP_REQUEST 7 +# define X509_TRUST_TSA 8 +/* Keep these up to date! */ +# define X509_TRUST_MIN 1 +# define X509_TRUST_MAX 8 + +/* trust_flags values */ +# define X509_TRUST_DYNAMIC (1U << 0) +# define X509_TRUST_DYNAMIC_NAME (1U << 1) +/* No compat trust if self-signed, preempts "DO_SS" */ +# define X509_TRUST_NO_SS_COMPAT (1U << 2) +/* Compat trust if no explicit accepted trust EKUs */ +# define X509_TRUST_DO_SS_COMPAT (1U << 3) +/* Accept "anyEKU" as a wildcard rejection OID and as a wildcard trust OID */ +# define X509_TRUST_OK_ANY_EKU (1U << 4) + +/* check_trust return codes */ +# define X509_TRUST_TRUSTED 1 +# define X509_TRUST_REJECTED 2 +# define X509_TRUST_UNTRUSTED 3 + +int X509_TRUST_set(int *t, int trust); +int X509_TRUST_get_count(void); +X509_TRUST *X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int), + const char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(const X509_TRUST *xp); +char *X509_TRUST_get0_name(const X509_TRUST *xp); +int X509_TRUST_get_trust(const X509_TRUST *xp); + +int X509_trusted(const X509 *x); +int X509_add1_trust_object(X509 *x, const ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, const ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); +STACK_OF(ASN1_OBJECT) *X509_get0_trust_objects(X509 *x); +STACK_OF(ASN1_OBJECT) *X509_get0_reject_objects(X509 *x); + +int (*X509_TRUST_set_default(int (*trust) (int, X509 *, int))) (int, X509 *, + int); +int X509_check_trust(X509 *x, int id, int flags); + +int X509_verify_cert(X509_STORE_CTX *ctx); +int X509_STORE_CTX_verify(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_build_chain(X509 *target, STACK_OF(X509) *certs, + X509_STORE *store, int with_self_signed, + OSSL_LIB_CTX *libctx, const char *propq); + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +typedef int (*X509_STORE_CTX_verify_cb)(int, X509_STORE_CTX *); +int X509_STORE_CTX_print_verify_cb(int ok, X509_STORE_CTX *ctx); +typedef int (*X509_STORE_CTX_verify_fn)(X509_STORE_CTX *); +typedef int (*X509_STORE_CTX_get_issuer_fn)(X509 **issuer, + X509_STORE_CTX *ctx, X509 *x); +typedef int (*X509_STORE_CTX_check_issued_fn)(X509_STORE_CTX *ctx, + X509 *x, X509 *issuer); +typedef int (*X509_STORE_CTX_check_revocation_fn)(X509_STORE_CTX *ctx); +typedef int (*X509_STORE_CTX_get_crl_fn)(X509_STORE_CTX *ctx, + X509_CRL **crl, X509 *x); +typedef int (*X509_STORE_CTX_check_crl_fn)(X509_STORE_CTX *ctx, X509_CRL *crl); +typedef int (*X509_STORE_CTX_cert_crl_fn)(X509_STORE_CTX *ctx, + X509_CRL *crl, X509 *x); +typedef int (*X509_STORE_CTX_check_policy_fn)(X509_STORE_CTX *ctx); +typedef STACK_OF(X509) + *(*X509_STORE_CTX_lookup_certs_fn)(X509_STORE_CTX *ctx, + const X509_NAME *nm); +typedef STACK_OF(X509_CRL) + *(*X509_STORE_CTX_lookup_crls_fn)(const X509_STORE_CTX *ctx, + const X509_NAME *nm); +typedef int (*X509_STORE_CTX_cleanup_fn)(X509_STORE_CTX *ctx); + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +# define X509_STORE_CTX_set_app_data(ctx,data) \ + X509_STORE_CTX_set_ex_data(ctx,0,data) +# define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx,0) + +# define X509_L_FILE_LOAD 1 +# define X509_L_ADD_DIR 2 +# define X509_L_ADD_STORE 3 +# define X509_L_LOAD_STORE 4 + +# define X509_LOOKUP_load_file(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL) + +# define X509_LOOKUP_add_dir(x,name,type) \ + X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL) + +# define X509_LOOKUP_add_store(x,name) \ + X509_LOOKUP_ctrl((x),X509_L_ADD_STORE,(name),0,NULL) + +# define X509_LOOKUP_load_store(x,name) \ + X509_LOOKUP_ctrl((x),X509_L_LOAD_STORE,(name),0,NULL) + +# define X509_LOOKUP_load_file_ex(x, name, type, libctx, propq) \ +X509_LOOKUP_ctrl_ex((x), X509_L_FILE_LOAD, (name), (long)(type), NULL,\ + (libctx), (propq)) + +# define X509_LOOKUP_load_store_ex(x, name, libctx, propq) \ +X509_LOOKUP_ctrl_ex((x), X509_L_LOAD_STORE, (name), 0, NULL, \ + (libctx), (propq)) + +# define X509_LOOKUP_add_store_ex(x, name, libctx, propq) \ +X509_LOOKUP_ctrl_ex((x), X509_L_ADD_STORE, (name), 0, NULL, \ + (libctx), (propq)) + +# define X509_V_OK 0 +# define X509_V_ERR_UNSPECIFIED 1 +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +# define X509_V_ERR_UNABLE_TO_GET_CRL 3 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +# define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +# define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +# define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +# define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +# define X509_V_ERR_CERT_NOT_YET_VALID 9 +# define X509_V_ERR_CERT_HAS_EXPIRED 10 +# define X509_V_ERR_CRL_NOT_YET_VALID 11 +# define X509_V_ERR_CRL_HAS_EXPIRED 12 +# define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +# define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +# define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +# define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +# define X509_V_ERR_OUT_OF_MEM 17 +# define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +# define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +# define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +# define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +# define X509_V_ERR_CERT_REVOKED 23 +# define X509_V_ERR_NO_ISSUER_PUBLIC_KEY 24 +# define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +# define X509_V_ERR_INVALID_PURPOSE 26 +# define X509_V_ERR_CERT_UNTRUSTED 27 +# define X509_V_ERR_CERT_REJECTED 28 + +/* These are 'informational' when looking for issuer cert */ +# define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +# define X509_V_ERR_AKID_SKID_MISMATCH 30 +# define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +# define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 +# define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +# define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +# define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +# define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +# define X509_V_ERR_INVALID_NON_CA 37 +# define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +# define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +# define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 +# define X509_V_ERR_INVALID_EXTENSION 41 +# define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +# define X509_V_ERR_NO_EXPLICIT_POLICY 43 +# define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +# define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 +# define X509_V_ERR_UNNESTED_RESOURCE 46 +# define X509_V_ERR_PERMITTED_VIOLATION 47 +# define X509_V_ERR_EXCLUDED_VIOLATION 48 +# define X509_V_ERR_SUBTREE_MINMAX 49 +/* The application is not happy */ +# define X509_V_ERR_APPLICATION_VERIFICATION 50 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +# define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +# define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 +/* Another issuer check debug option */ +# define X509_V_ERR_PATH_LOOP 55 +/* Suite B mode algorithm violation */ +# define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +# define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +# define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +# define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +# define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +# define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 +/* Host, email and IP check errors */ +# define X509_V_ERR_HOSTNAME_MISMATCH 62 +# define X509_V_ERR_EMAIL_MISMATCH 63 +# define X509_V_ERR_IP_ADDRESS_MISMATCH 64 +/* DANE TLSA errors */ +# define X509_V_ERR_DANE_NO_MATCH 65 +/* security level errors */ +# define X509_V_ERR_EE_KEY_TOO_SMALL 66 +# define X509_V_ERR_CA_KEY_TOO_SMALL 67 +# define X509_V_ERR_CA_MD_TOO_WEAK 68 +/* Caller error */ +# define X509_V_ERR_INVALID_CALL 69 +/* Issuer lookup error */ +# define X509_V_ERR_STORE_LOOKUP 70 +/* Certificate transparency */ +# define X509_V_ERR_NO_VALID_SCTS 71 + +# define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 72 +/* OCSP status errors */ +# define X509_V_ERR_OCSP_VERIFY_NEEDED 73 /* Need OCSP verification */ +# define X509_V_ERR_OCSP_VERIFY_FAILED 74 /* Couldn't verify cert through OCSP */ +# define X509_V_ERR_OCSP_CERT_UNKNOWN 75 /* Certificate wasn't recognized by the OCSP responder */ + +# define X509_V_ERR_UNSUPPORTED_SIGNATURE_ALGORITHM 76 +# define X509_V_ERR_SIGNATURE_ALGORITHM_MISMATCH 77 + +/* Errors in case a check in X509_V_FLAG_X509_STRICT mode fails */ +# define X509_V_ERR_SIGNATURE_ALGORITHM_INCONSISTENCY 78 +# define X509_V_ERR_INVALID_CA 79 +# define X509_V_ERR_PATHLEN_INVALID_FOR_NON_CA 80 +# define X509_V_ERR_PATHLEN_WITHOUT_KU_KEY_CERT_SIGN 81 +# define X509_V_ERR_KU_KEY_CERT_SIGN_INVALID_FOR_NON_CA 82 +# define X509_V_ERR_ISSUER_NAME_EMPTY 83 +# define X509_V_ERR_SUBJECT_NAME_EMPTY 84 +# define X509_V_ERR_MISSING_AUTHORITY_KEY_IDENTIFIER 85 +# define X509_V_ERR_MISSING_SUBJECT_KEY_IDENTIFIER 86 +# define X509_V_ERR_EMPTY_SUBJECT_ALT_NAME 87 +# define X509_V_ERR_EMPTY_SUBJECT_SAN_NOT_CRITICAL 88 +# define X509_V_ERR_CA_BCONS_NOT_CRITICAL 89 +# define X509_V_ERR_AUTHORITY_KEY_IDENTIFIER_CRITICAL 90 +# define X509_V_ERR_SUBJECT_KEY_IDENTIFIER_CRITICAL 91 +# define X509_V_ERR_CA_CERT_MISSING_KEY_USAGE 92 +# define X509_V_ERR_EXTENSIONS_REQUIRE_VERSION_3 93 +# define X509_V_ERR_EC_KEY_EXPLICIT_PARAMS 94 + +/* Certificate verify flags */ +# ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define X509_V_FLAG_CB_ISSUER_CHECK 0x0 /* Deprecated */ +# endif +/* Use check time instead of current time */ +# define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +# define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +# define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +# define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +# define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +# define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +# define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +# define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +# define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +# define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +# define X509_V_FLAG_NOTIFY_POLICY 0x800 +/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ +# define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 +/* Delta CRL support */ +# define X509_V_FLAG_USE_DELTAS 0x2000 +/* Check self-signed CA signature */ +# define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +# define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Suite B 128 bit only mode: not normally used */ +# define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +# define X509_V_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +# define X509_V_FLAG_SUITEB_128_LOS 0x30000 +/* Allow partial chains if at least one certificate is in trusted store */ +# define X509_V_FLAG_PARTIAL_CHAIN 0x80000 +/* + * If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.1.0. Setting this flag + * will force the behaviour to match that of previous versions. + */ +# define X509_V_FLAG_NO_ALT_CHAINS 0x100000 +/* Do not check certificate/CRL validity against current time */ +# define X509_V_FLAG_NO_CHECK_TIME 0x200000 + +# define X509_VP_FLAG_DEFAULT 0x1 +# define X509_VP_FLAG_OVERWRITE 0x2 +# define X509_VP_FLAG_RESET_FLAGS 0x4 +# define X509_VP_FLAG_LOCKED 0x8 +# define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +# define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, X509_LOOKUP_TYPE type, + const X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, + X509_LOOKUP_TYPE type, + const X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, + X509_OBJECT *x); +int X509_OBJECT_up_ref_count(X509_OBJECT *a); +X509_OBJECT *X509_OBJECT_new(void); +void X509_OBJECT_free(X509_OBJECT *a); +X509_LOOKUP_TYPE X509_OBJECT_get_type(const X509_OBJECT *a); +X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a); +int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj); +X509_CRL *X509_OBJECT_get0_X509_CRL(const X509_OBJECT *a); +int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *v); +int X509_STORE_lock(X509_STORE *ctx); +int X509_STORE_unlock(X509_STORE *ctx); +int X509_STORE_up_ref(X509_STORE *v); +STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(const X509_STORE *v); +STACK_OF(X509) *X509_STORE_get1_all_certs(X509_STORE *st); +STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *st, + const X509_NAME *nm); +STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(const X509_STORE_CTX *st, + const X509_NAME *nm); +int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags); +int X509_STORE_set_purpose(X509_STORE *ctx, int purpose); +int X509_STORE_set_trust(X509_STORE *ctx, int trust); +int X509_STORE_set1_param(X509_STORE *ctx, const X509_VERIFY_PARAM *pm); +X509_VERIFY_PARAM *X509_STORE_get0_param(const X509_STORE *ctx); + +void X509_STORE_set_verify(X509_STORE *ctx, X509_STORE_CTX_verify_fn verify); +#define X509_STORE_set_verify_func(ctx, func) \ + X509_STORE_set_verify((ctx),(func)) +void X509_STORE_CTX_set_verify(X509_STORE_CTX *ctx, + X509_STORE_CTX_verify_fn verify); +X509_STORE_CTX_verify_fn X509_STORE_get_verify(const X509_STORE *ctx); +void X509_STORE_set_verify_cb(X509_STORE *ctx, + X509_STORE_CTX_verify_cb verify_cb); +# define X509_STORE_set_verify_cb_func(ctx,func) \ + X509_STORE_set_verify_cb((ctx),(func)) +X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(const X509_STORE *ctx); +void X509_STORE_set_get_issuer(X509_STORE *ctx, + X509_STORE_CTX_get_issuer_fn get_issuer); +X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(const X509_STORE *ctx); +void X509_STORE_set_check_issued(X509_STORE *ctx, + X509_STORE_CTX_check_issued_fn check_issued); +X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(const X509_STORE *ctx); +void X509_STORE_set_check_revocation(X509_STORE *ctx, + X509_STORE_CTX_check_revocation_fn check_revocation); +X509_STORE_CTX_check_revocation_fn + X509_STORE_get_check_revocation(const X509_STORE *ctx); +void X509_STORE_set_get_crl(X509_STORE *ctx, + X509_STORE_CTX_get_crl_fn get_crl); +X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(const X509_STORE *ctx); +void X509_STORE_set_check_crl(X509_STORE *ctx, + X509_STORE_CTX_check_crl_fn check_crl); +X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(const X509_STORE *ctx); +void X509_STORE_set_cert_crl(X509_STORE *ctx, + X509_STORE_CTX_cert_crl_fn cert_crl); +X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(const X509_STORE *ctx); +void X509_STORE_set_check_policy(X509_STORE *ctx, + X509_STORE_CTX_check_policy_fn check_policy); +X509_STORE_CTX_check_policy_fn X509_STORE_get_check_policy(const X509_STORE *ctx); +void X509_STORE_set_lookup_certs(X509_STORE *ctx, + X509_STORE_CTX_lookup_certs_fn lookup_certs); +X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(const X509_STORE *ctx); +void X509_STORE_set_lookup_crls(X509_STORE *ctx, + X509_STORE_CTX_lookup_crls_fn lookup_crls); +#define X509_STORE_set_lookup_crls_cb(ctx, func) \ + X509_STORE_set_lookup_crls((ctx), (func)) +X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(const X509_STORE *ctx); +void X509_STORE_set_cleanup(X509_STORE *ctx, + X509_STORE_CTX_cleanup_fn cleanup); +X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(const X509_STORE *ctx); + +#define X509_STORE_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE, l, p, newf, dupf, freef) +int X509_STORE_set_ex_data(X509_STORE *ctx, int idx, void *data); +void *X509_STORE_get_ex_data(const X509_STORE *ctx, int idx); + +X509_STORE_CTX *X509_STORE_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +X509_STORE_CTX *X509_STORE_CTX_new(void); + +int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + +void X509_STORE_CTX_free(X509_STORE_CTX *ctx); +int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *trust_store, + X509 *target, STACK_OF(X509) *untrusted); +void X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_STORE *X509_STORE_CTX_get0_store(const X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_cert(const X509_STORE_CTX *ctx); +STACK_OF(X509)* X509_STORE_CTX_get0_untrusted(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_untrusted(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + X509_STORE_CTX_verify_cb verify); +X509_STORE_CTX_verify_cb X509_STORE_CTX_get_verify_cb(const X509_STORE_CTX *ctx); +X509_STORE_CTX_verify_fn X509_STORE_CTX_get_verify(const X509_STORE_CTX *ctx); +X509_STORE_CTX_get_issuer_fn X509_STORE_CTX_get_get_issuer(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_issued_fn X509_STORE_CTX_get_check_issued(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_revocation_fn X509_STORE_CTX_get_check_revocation(const X509_STORE_CTX *ctx); +X509_STORE_CTX_get_crl_fn X509_STORE_CTX_get_get_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_crl_fn X509_STORE_CTX_get_check_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_cert_crl_fn X509_STORE_CTX_get_cert_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_policy_fn X509_STORE_CTX_get_check_policy(const X509_STORE_CTX *ctx); +X509_STORE_CTX_lookup_certs_fn X509_STORE_CTX_get_lookup_certs(const X509_STORE_CTX *ctx); +X509_STORE_CTX_lookup_crls_fn X509_STORE_CTX_get_lookup_crls(const X509_STORE_CTX *ctx); +X509_STORE_CTX_cleanup_fn X509_STORE_CTX_get_cleanup(const X509_STORE_CTX *ctx); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +# define X509_STORE_CTX_get_chain X509_STORE_CTX_get0_chain +# define X509_STORE_CTX_set_chain X509_STORE_CTX_set0_untrusted +# define X509_STORE_CTX_trusted_stack X509_STORE_CTX_set0_trusted_stack +# define X509_STORE_get_by_subject X509_STORE_CTX_get_by_subject +# define X509_STORE_get1_certs X509_STORE_CTX_get1_certs +# define X509_STORE_get1_crls X509_STORE_CTX_get1_crls +/* the following macro is misspelled; use X509_STORE_get1_certs instead */ +# define X509_STORE_get1_cert X509_STORE_CTX_get1_certs +/* the following macro is misspelled; use X509_STORE_get1_crls instead */ +# define X509_STORE_get1_crl X509_STORE_CTX_get1_crls +#endif + +X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m); +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); +X509_LOOKUP_METHOD *X509_LOOKUP_store(void); + +typedef int (*X509_LOOKUP_ctrl_fn)(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); +typedef int (*X509_LOOKUP_ctrl_ex_fn)( + X509_LOOKUP *ctx, int cmd, const char *argc, long argl, char **ret, + OSSL_LIB_CTX *libctx, const char *propq); + +typedef int (*X509_LOOKUP_get_by_subject_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_subject_ex_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + X509_OBJECT *ret, + OSSL_LIB_CTX *libctx, + const char *propq); +typedef int (*X509_LOOKUP_get_by_issuer_serial_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + const ASN1_INTEGER *serial, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_fingerprint_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const unsigned char* bytes, + int len, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_alias_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const char *str, + int len, + X509_OBJECT *ret); + +X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name); +void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method, + int (*new_item) (X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD* method)) + (X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_free(X509_LOOKUP_METHOD *method, + void (*free_fn) (X509_LOOKUP *ctx)); +void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD* method)) + (X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method, + int (*init) (X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD* method)) + (X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_shutdown(X509_LOOKUP_METHOD *method, + int (*shutdown) (X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD* method)) + (X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_ctrl(X509_LOOKUP_METHOD *method, + X509_LOOKUP_ctrl_fn ctrl_fn); +X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_subject_fn fn); +X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_issuer_serial(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_issuer_serial_fn fn); +X509_LOOKUP_get_by_issuer_serial_fn X509_LOOKUP_meth_get_get_by_issuer_serial( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_fingerprint_fn fn); +X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_alias_fn fn); +X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias( + const X509_LOOKUP_METHOD *method); + + +int X509_STORE_add_cert(X509_STORE *ctx, X509 *x); +int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x); + +int X509_STORE_CTX_get_by_subject(const X509_STORE_CTX *vs, + X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret); +X509_OBJECT *X509_STORE_CTX_get_obj_by_subject(X509_STORE_CTX *vs, + X509_LOOKUP_TYPE type, + const X509_NAME *name); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); +int X509_LOOKUP_ctrl_ex(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, + char **ret, OSSL_LIB_CTX *libctx, const char *propq); + +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_file_ex(X509_LOOKUP *ctx, const char *file, int type, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file_ex(X509_LOOKUP *ctx, const char *file, int type, + OSSL_LIB_CTX *libctx, const char *propq); + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret); +int X509_LOOKUP_by_subject_ex(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, + const ASN1_INTEGER *serial, + X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const unsigned char *bytes, int len, + X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const char *str, int len, X509_OBJECT *ret); +int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data); +void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx); +X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +int X509_STORE_load_file(X509_STORE *ctx, const char *file); +int X509_STORE_load_path(X509_STORE *ctx, const char *path); +int X509_STORE_load_store(X509_STORE *ctx, const char *store); +int X509_STORE_load_locations(X509_STORE *ctx, + const char *file, + const char *dir); +int X509_STORE_set_default_paths(X509_STORE *ctx); + +int X509_STORE_load_file_ex(X509_STORE *ctx, const char *file, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_STORE_load_store_ex(X509_STORE *ctx, const char *store, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_STORE_load_locations_ex(X509_STORE *ctx, const char *file, + const char *dir, OSSL_LIB_CTX *libctx, + const char *propq); +int X509_STORE_set_default_paths_ex(X509_STORE *ctx, OSSL_LIB_CTX *libctx, + const char *propq); + +#define X509_STORE_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, l, p, newf, dupf, freef) +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data); +void *X509_STORE_CTX_get_ex_data(const X509_STORE_CTX *ctx, int idx); +int X509_STORE_CTX_get_error(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s); +int X509_STORE_CTX_get_error_depth(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error_depth(X509_STORE_CTX *ctx, int depth); +X509 *X509_STORE_CTX_get_current_cert(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_current_cert(X509_STORE_CTX *ctx, X509 *x); +X509 *X509_STORE_CTX_get0_current_issuer(const X509_STORE_CTX *ctx); +X509_CRL *X509_STORE_CTX_get0_current_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(const X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get0_chain(const X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *target); +void X509_STORE_CTX_set0_verified_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, + time_t t); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(const X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(const X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_num_untrusted(const X509_STORE_CTX *ctx); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* + * Bridge opacity barrier between libcrypt and libssl, also needed to support + * offline testing in test/danetest.c + */ +void X509_STORE_CTX_set0_dane(X509_STORE_CTX *ctx, SSL_DANE *dane); +#define DANE_FLAG_NO_DANE_EE_NAMECHECKS (1L << 0) + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_auth_level(X509_VERIFY_PARAM *param, int auth_level); +time_t X509_VERIFY_PARAM_get_time(const X509_VERIFY_PARAM *param); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, + STACK_OF(ASN1_OBJECT) *policies); + +int X509_VERIFY_PARAM_set_inh_flags(X509_VERIFY_PARAM *param, + uint32_t flags); +uint32_t X509_VERIFY_PARAM_get_inh_flags(const X509_VERIFY_PARAM *param); + +char *X509_VERIFY_PARAM_get0_host(X509_VERIFY_PARAM *param, int idx); +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +unsigned int X509_VERIFY_PARAM_get_hostflags(const X509_VERIFY_PARAM *param); +char *X509_VERIFY_PARAM_get0_peername(const X509_VERIFY_PARAM *param); +void X509_VERIFY_PARAM_move_peername(X509_VERIFY_PARAM *, X509_VERIFY_PARAM *); +char *X509_VERIFY_PARAM_get0_email(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, + const char *email, size_t emaillen); +char *X509_VERIFY_PARAM_get1_ip_asc(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, + const unsigned char *ip, size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, + const char *ipasc); + +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_auth_level(const X509_VERIFY_PARAM *param); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_count(void); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +/* Non positive return values are errors */ +#define X509_PCY_TREE_FAILURE -2 /* Failure to satisfy explicit policy */ +#define X509_PCY_TREE_INVALID -1 /* Inconsistent or invalid extensions */ +#define X509_PCY_TREE_INTERNAL 0 /* Internal error, most likely malloc */ + +/* + * Positive return values form a bit mask, all but the first are internal to + * the library and don't appear in results from X509_policy_check(). + */ +#define X509_PCY_TREE_VALID 1 /* The policy tree is valid */ +#define X509_PCY_TREE_EMPTY 2 /* The policy tree is empty */ +#define X509_PCY_TREE_EXPLICIT 4 /* Explicit policy required */ + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, + int i); + +STACK_OF(X509_POLICY_NODE) + *X509_policy_tree_get0_policies(const X509_POLICY_TREE *tree); + +STACK_OF(X509_POLICY_NODE) + *X509_policy_tree_get0_user_policies(const X509_POLICY_TREE *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(const X509_POLICY_LEVEL *level, + int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) + *X509_policy_node_get0_qualifiers(const X509_POLICY_NODE *node); +const X509_POLICY_NODE + *X509_policy_node_get0_parent(const X509_POLICY_NODE *node); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/OtherInc/openssl/include/openssl/x509err.h b/OtherInc/openssl/include/openssl/x509err.h new file mode 100644 index 0000000..a56facd --- /dev/null +++ b/OtherInc/openssl/include/openssl/x509err.h @@ -0,0 +1,68 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_X509ERR_H +# define OPENSSL_X509ERR_H +# pragma once + +# include +# include +# include + + + +/* + * X509 reason codes. + */ +# define X509_R_AKID_MISMATCH 110 +# define X509_R_BAD_SELECTOR 133 +# define X509_R_BAD_X509_FILETYPE 100 +# define X509_R_BASE64_DECODE_ERROR 118 +# define X509_R_CANT_CHECK_DH_KEY 114 +# define X509_R_CERTIFICATE_VERIFICATION_FAILED 139 +# define X509_R_CERT_ALREADY_IN_HASH_TABLE 101 +# define X509_R_CRL_ALREADY_DELTA 127 +# define X509_R_CRL_VERIFY_FAILURE 131 +# define X509_R_ERROR_GETTING_MD_BY_NID 141 +# define X509_R_ERROR_USING_SIGINF_SET 142 +# define X509_R_IDP_MISMATCH 128 +# define X509_R_INVALID_ATTRIBUTES 138 +# define X509_R_INVALID_DIRECTORY 113 +# define X509_R_INVALID_DISTPOINT 143 +# define X509_R_INVALID_FIELD_NAME 119 +# define X509_R_INVALID_TRUST 123 +# define X509_R_ISSUER_MISMATCH 129 +# define X509_R_KEY_TYPE_MISMATCH 115 +# define X509_R_KEY_VALUES_MISMATCH 116 +# define X509_R_LOADING_CERT_DIR 103 +# define X509_R_LOADING_DEFAULTS 104 +# define X509_R_METHOD_NOT_SUPPORTED 124 +# define X509_R_NAME_TOO_LONG 134 +# define X509_R_NEWER_CRL_NOT_NEWER 132 +# define X509_R_NO_CERTIFICATE_FOUND 135 +# define X509_R_NO_CERTIFICATE_OR_CRL_FOUND 136 +# define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 105 +# define X509_R_NO_CRL_FOUND 137 +# define X509_R_NO_CRL_NUMBER 130 +# define X509_R_PUBLIC_KEY_DECODE_ERROR 125 +# define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 +# define X509_R_SHOULD_RETRY 106 +# define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN 107 +# define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY 108 +# define X509_R_UNKNOWN_KEY_TYPE 117 +# define X509_R_UNKNOWN_NID 109 +# define X509_R_UNKNOWN_PURPOSE_ID 121 +# define X509_R_UNKNOWN_SIGID_ALGS 144 +# define X509_R_UNKNOWN_TRUST_ID 120 +# define X509_R_UNSUPPORTED_ALGORITHM 111 +# define X509_R_WRONG_LOOKUP_TYPE 112 +# define X509_R_WRONG_TYPE 122 + +#endif diff --git a/OtherInc/openssl/include/openssl/x509v3.h b/OtherInc/openssl/include/openssl/x509v3.h new file mode 100644 index 0000000..78c390b --- /dev/null +++ b/OtherInc/openssl/include/openssl/x509v3.h @@ -0,0 +1,1450 @@ +/* + * WARNING: do not edit! + * Generated by makefile from include\openssl\x509v3.h.in + * + * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + + + +#ifndef OPENSSL_X509V3_H +# define OPENSSL_X509V3_H +# pragma once + +# include +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define HEADER_X509V3_H +# endif + +# include +# include +# include +# include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void *(*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE) (void *); +typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long); +typedef int (*X509V3_EXT_I2D) (const void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) * + (*X509V3_EXT_I2V) (const struct v3_ext_method *method, void *ext, + STACK_OF(CONF_VALUE) *extlist); +typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, + STACK_OF(CONF_VALUE) *values); +typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, + void *ext); +typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R) (const struct v3_ext_method *method, void *ext, + BIO *out, int indent); +typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { + int ext_nid; + int ext_flags; +/* If this is set the following four fields are ignored */ + ASN1_ITEM_EXP *it; +/* Old style ASN1 calls */ + X509V3_EXT_NEW ext_new; + X509V3_EXT_FREE ext_free; + X509V3_EXT_D2I d2i; + X509V3_EXT_I2D i2d; +/* The following pair is used for string extensions */ + X509V3_EXT_I2S i2s; + X509V3_EXT_S2I s2i; +/* The following pair is used for multi-valued extensions */ + X509V3_EXT_I2V i2v; + X509V3_EXT_V2I v2i; +/* The following are used for raw extensions */ + X509V3_EXT_I2R i2r; + X509V3_EXT_R2I r2i; + void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { + char *(*get_string) (void *db, const char *section, const char *value); + STACK_OF(CONF_VALUE) *(*get_section) (void *db, const char *section); + void (*free_string) (void *db, char *string); + void (*free_section) (void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info for producing X509 v3 extensions*/ +struct v3_ext_ctx { +# define X509V3_CTX_TEST 0x1 +# ifndef OPENSSL_NO_DEPRECATED_3_0 +# define CTX_TEST X509V3_CTX_TEST +# endif +# define X509V3_CTX_REPLACE 0x2 + int flags; + X509 *issuer_cert; + X509 *subject_cert; + X509_REQ *subject_req; + X509_CRL *crl; + X509V3_CONF_METHOD *db_meth; + void *db; + EVP_PKEY *issuer_pkey; +/* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +SKM_DEFINE_STACK_OF_INTERNAL(X509V3_EXT_METHOD, X509V3_EXT_METHOD, X509V3_EXT_METHOD) +#define sk_X509V3_EXT_METHOD_num(sk) OPENSSL_sk_num(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_value(sk, idx) ((X509V3_EXT_METHOD *)OPENSSL_sk_value(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk), (idx))) +#define sk_X509V3_EXT_METHOD_new(cmp) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new(ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp))) +#define sk_X509V3_EXT_METHOD_new_null() ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new_null()) +#define sk_X509V3_EXT_METHOD_new_reserve(cmp, n) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new_reserve(ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp), (n))) +#define sk_X509V3_EXT_METHOD_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (n)) +#define sk_X509V3_EXT_METHOD_free(sk) OPENSSL_sk_free(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_zero(sk) OPENSSL_sk_zero(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_delete(sk, i) ((X509V3_EXT_METHOD *)OPENSSL_sk_delete(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (i))) +#define sk_X509V3_EXT_METHOD_delete_ptr(sk, ptr) ((X509V3_EXT_METHOD *)OPENSSL_sk_delete_ptr(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr))) +#define sk_X509V3_EXT_METHOD_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_pop(sk) ((X509V3_EXT_METHOD *)OPENSSL_sk_pop(ossl_check_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_shift(sk) ((X509V3_EXT_METHOD *)OPENSSL_sk_shift(ossl_check_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509V3_EXT_METHOD_sk_type(sk),ossl_check_X509V3_EXT_METHOD_freefunc_type(freefunc)) +#define sk_X509V3_EXT_METHOD_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr), (idx)) +#define sk_X509V3_EXT_METHOD_set(sk, idx, ptr) ((X509V3_EXT_METHOD *)OPENSSL_sk_set(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (idx), ossl_check_X509V3_EXT_METHOD_type(ptr))) +#define sk_X509V3_EXT_METHOD_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr), pnum) +#define sk_X509V3_EXT_METHOD_sort(sk) OPENSSL_sk_sort(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_dup(sk) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_dup(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_deep_copy(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_copyfunc_type(copyfunc), ossl_check_X509V3_EXT_METHOD_freefunc_type(freefunc))) +#define sk_X509V3_EXT_METHOD_set_cmp_func(sk, cmp) ((sk_X509V3_EXT_METHOD_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp))) + + +/* ext_flags values */ +# define X509V3_EXT_DYNAMIC 0x1 +# define X509V3_EXT_CTX_DEP 0x2 +# define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { + int ca; + ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + +typedef struct PKEY_USAGE_PERIOD_st { + ASN1_GENERALIZEDTIME *notBefore; + ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { + ASN1_OBJECT *type_id; + ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { +# define GEN_OTHERNAME 0 +# define GEN_EMAIL 1 +# define GEN_DNS 2 +# define GEN_X400 3 +# define GEN_DIRNAME 4 +# define GEN_EDIPARTY 5 +# define GEN_URI 6 +# define GEN_IPADD 7 +# define GEN_RID 8 + int type; + union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_TYPE *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, + * uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ + } d; +} GENERAL_NAME; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +SKM_DEFINE_STACK_OF_INTERNAL(ACCESS_DESCRIPTION, ACCESS_DESCRIPTION, ACCESS_DESCRIPTION) +#define sk_ACCESS_DESCRIPTION_num(sk) OPENSSL_sk_num(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_value(sk, idx) ((ACCESS_DESCRIPTION *)OPENSSL_sk_value(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk), (idx))) +#define sk_ACCESS_DESCRIPTION_new(cmp) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new(ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp))) +#define sk_ACCESS_DESCRIPTION_new_null() ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new_null()) +#define sk_ACCESS_DESCRIPTION_new_reserve(cmp, n) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new_reserve(ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp), (n))) +#define sk_ACCESS_DESCRIPTION_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (n)) +#define sk_ACCESS_DESCRIPTION_free(sk) OPENSSL_sk_free(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_zero(sk) OPENSSL_sk_zero(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_delete(sk, i) ((ACCESS_DESCRIPTION *)OPENSSL_sk_delete(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (i))) +#define sk_ACCESS_DESCRIPTION_delete_ptr(sk, ptr) ((ACCESS_DESCRIPTION *)OPENSSL_sk_delete_ptr(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr))) +#define sk_ACCESS_DESCRIPTION_push(sk, ptr) OPENSSL_sk_push(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_pop(sk) ((ACCESS_DESCRIPTION *)OPENSSL_sk_pop(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_shift(sk) ((ACCESS_DESCRIPTION *)OPENSSL_sk_shift(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ACCESS_DESCRIPTION_sk_type(sk),ossl_check_ACCESS_DESCRIPTION_freefunc_type(freefunc)) +#define sk_ACCESS_DESCRIPTION_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr), (idx)) +#define sk_ACCESS_DESCRIPTION_set(sk, idx, ptr) ((ACCESS_DESCRIPTION *)OPENSSL_sk_set(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (idx), ossl_check_ACCESS_DESCRIPTION_type(ptr))) +#define sk_ACCESS_DESCRIPTION_find(sk, ptr) OPENSSL_sk_find(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr), pnum) +#define sk_ACCESS_DESCRIPTION_sort(sk) OPENSSL_sk_sort(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_dup(sk) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_dup(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_deep_copy(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_copyfunc_type(copyfunc), ossl_check_ACCESS_DESCRIPTION_freefunc_type(freefunc))) +#define sk_ACCESS_DESCRIPTION_set_cmp_func(sk, cmp) ((sk_ACCESS_DESCRIPTION_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_NAME, GENERAL_NAME, GENERAL_NAME) +#define sk_GENERAL_NAME_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_value(sk, idx) ((GENERAL_NAME *)OPENSSL_sk_value(ossl_check_const_GENERAL_NAME_sk_type(sk), (idx))) +#define sk_GENERAL_NAME_new(cmp) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new(ossl_check_GENERAL_NAME_compfunc_type(cmp))) +#define sk_GENERAL_NAME_new_null() ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_NAME_new_reserve(cmp, n) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_NAME_compfunc_type(cmp), (n))) +#define sk_GENERAL_NAME_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_NAME_sk_type(sk), (n)) +#define sk_GENERAL_NAME_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_delete(sk, i) ((GENERAL_NAME *)OPENSSL_sk_delete(ossl_check_GENERAL_NAME_sk_type(sk), (i))) +#define sk_GENERAL_NAME_delete_ptr(sk, ptr) ((GENERAL_NAME *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr))) +#define sk_GENERAL_NAME_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_pop(sk) ((GENERAL_NAME *)OPENSSL_sk_pop(ossl_check_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_shift(sk) ((GENERAL_NAME *)OPENSSL_sk_shift(ossl_check_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_NAME_sk_type(sk),ossl_check_GENERAL_NAME_freefunc_type(freefunc)) +#define sk_GENERAL_NAME_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr), (idx)) +#define sk_GENERAL_NAME_set(sk, idx, ptr) ((GENERAL_NAME *)OPENSSL_sk_set(ossl_check_GENERAL_NAME_sk_type(sk), (idx), ossl_check_GENERAL_NAME_type(ptr))) +#define sk_GENERAL_NAME_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr), pnum) +#define sk_GENERAL_NAME_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_dup(sk) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_copyfunc_type(copyfunc), ossl_check_GENERAL_NAME_freefunc_type(freefunc))) +#define sk_GENERAL_NAME_set_cmp_func(sk, cmp) ((sk_GENERAL_NAME_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_compfunc_type(cmp))) + + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; +typedef STACK_OF(ASN1_INTEGER) TLS_FEATURE; +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_NAMES, GENERAL_NAMES, GENERAL_NAMES) +#define sk_GENERAL_NAMES_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_value(sk, idx) ((GENERAL_NAMES *)OPENSSL_sk_value(ossl_check_const_GENERAL_NAMES_sk_type(sk), (idx))) +#define sk_GENERAL_NAMES_new(cmp) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new(ossl_check_GENERAL_NAMES_compfunc_type(cmp))) +#define sk_GENERAL_NAMES_new_null() ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_NAMES_new_reserve(cmp, n) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_NAMES_compfunc_type(cmp), (n))) +#define sk_GENERAL_NAMES_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_NAMES_sk_type(sk), (n)) +#define sk_GENERAL_NAMES_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_delete(sk, i) ((GENERAL_NAMES *)OPENSSL_sk_delete(ossl_check_GENERAL_NAMES_sk_type(sk), (i))) +#define sk_GENERAL_NAMES_delete_ptr(sk, ptr) ((GENERAL_NAMES *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr))) +#define sk_GENERAL_NAMES_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_pop(sk) ((GENERAL_NAMES *)OPENSSL_sk_pop(ossl_check_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_shift(sk) ((GENERAL_NAMES *)OPENSSL_sk_shift(ossl_check_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_NAMES_sk_type(sk),ossl_check_GENERAL_NAMES_freefunc_type(freefunc)) +#define sk_GENERAL_NAMES_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr), (idx)) +#define sk_GENERAL_NAMES_set(sk, idx, ptr) ((GENERAL_NAMES *)OPENSSL_sk_set(ossl_check_GENERAL_NAMES_sk_type(sk), (idx), ossl_check_GENERAL_NAMES_type(ptr))) +#define sk_GENERAL_NAMES_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr), pnum) +#define sk_GENERAL_NAMES_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_dup(sk) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_copyfunc_type(copyfunc), ossl_check_GENERAL_NAMES_freefunc_type(freefunc))) +#define sk_GENERAL_NAMES_set_cmp_func(sk, cmp) ((sk_GENERAL_NAMES_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_compfunc_type(cmp))) + + +typedef struct DIST_POINT_NAME_st { + int type; + union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; + } name; +/* If relativename then this contains the full distribution point name */ + X509_NAME *dpname; +} DIST_POINT_NAME; +/* All existing reasons */ +# define CRLDP_ALL_REASONS 0x807f + +# define CRL_REASON_NONE -1 +# define CRL_REASON_UNSPECIFIED 0 +# define CRL_REASON_KEY_COMPROMISE 1 +# define CRL_REASON_CA_COMPROMISE 2 +# define CRL_REASON_AFFILIATION_CHANGED 3 +# define CRL_REASON_SUPERSEDED 4 +# define CRL_REASON_CESSATION_OF_OPERATION 5 +# define CRL_REASON_CERTIFICATE_HOLD 6 +# define CRL_REASON_REMOVE_FROM_CRL 8 +# define CRL_REASON_PRIVILEGE_WITHDRAWN 9 +# define CRL_REASON_AA_COMPROMISE 10 + +struct DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + GENERAL_NAMES *CRLissuer; + int dp_reasons; +}; + +SKM_DEFINE_STACK_OF_INTERNAL(DIST_POINT, DIST_POINT, DIST_POINT) +#define sk_DIST_POINT_num(sk) OPENSSL_sk_num(ossl_check_const_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_value(sk, idx) ((DIST_POINT *)OPENSSL_sk_value(ossl_check_const_DIST_POINT_sk_type(sk), (idx))) +#define sk_DIST_POINT_new(cmp) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new(ossl_check_DIST_POINT_compfunc_type(cmp))) +#define sk_DIST_POINT_new_null() ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new_null()) +#define sk_DIST_POINT_new_reserve(cmp, n) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new_reserve(ossl_check_DIST_POINT_compfunc_type(cmp), (n))) +#define sk_DIST_POINT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_DIST_POINT_sk_type(sk), (n)) +#define sk_DIST_POINT_free(sk) OPENSSL_sk_free(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_zero(sk) OPENSSL_sk_zero(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_delete(sk, i) ((DIST_POINT *)OPENSSL_sk_delete(ossl_check_DIST_POINT_sk_type(sk), (i))) +#define sk_DIST_POINT_delete_ptr(sk, ptr) ((DIST_POINT *)OPENSSL_sk_delete_ptr(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr))) +#define sk_DIST_POINT_push(sk, ptr) OPENSSL_sk_push(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_pop(sk) ((DIST_POINT *)OPENSSL_sk_pop(ossl_check_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_shift(sk) ((DIST_POINT *)OPENSSL_sk_shift(ossl_check_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_DIST_POINT_sk_type(sk),ossl_check_DIST_POINT_freefunc_type(freefunc)) +#define sk_DIST_POINT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr), (idx)) +#define sk_DIST_POINT_set(sk, idx, ptr) ((DIST_POINT *)OPENSSL_sk_set(ossl_check_DIST_POINT_sk_type(sk), (idx), ossl_check_DIST_POINT_type(ptr))) +#define sk_DIST_POINT_find(sk, ptr) OPENSSL_sk_find(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr), pnum) +#define sk_DIST_POINT_sort(sk) OPENSSL_sk_sort(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_dup(sk) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_dup(ossl_check_const_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_deep_copy(ossl_check_const_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_copyfunc_type(copyfunc), ossl_check_DIST_POINT_freefunc_type(freefunc))) +#define sk_DIST_POINT_set_cmp_func(sk, cmp) ((sk_DIST_POINT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_compfunc_type(cmp))) + + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +struct AUTHORITY_KEYID_st { + ASN1_OCTET_STRING *keyid; + GENERAL_NAMES *issuer; + ASN1_INTEGER *serial; +}; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +SKM_DEFINE_STACK_OF_INTERNAL(SXNETID, SXNETID, SXNETID) +#define sk_SXNETID_num(sk) OPENSSL_sk_num(ossl_check_const_SXNETID_sk_type(sk)) +#define sk_SXNETID_value(sk, idx) ((SXNETID *)OPENSSL_sk_value(ossl_check_const_SXNETID_sk_type(sk), (idx))) +#define sk_SXNETID_new(cmp) ((STACK_OF(SXNETID) *)OPENSSL_sk_new(ossl_check_SXNETID_compfunc_type(cmp))) +#define sk_SXNETID_new_null() ((STACK_OF(SXNETID) *)OPENSSL_sk_new_null()) +#define sk_SXNETID_new_reserve(cmp, n) ((STACK_OF(SXNETID) *)OPENSSL_sk_new_reserve(ossl_check_SXNETID_compfunc_type(cmp), (n))) +#define sk_SXNETID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SXNETID_sk_type(sk), (n)) +#define sk_SXNETID_free(sk) OPENSSL_sk_free(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_zero(sk) OPENSSL_sk_zero(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_delete(sk, i) ((SXNETID *)OPENSSL_sk_delete(ossl_check_SXNETID_sk_type(sk), (i))) +#define sk_SXNETID_delete_ptr(sk, ptr) ((SXNETID *)OPENSSL_sk_delete_ptr(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr))) +#define sk_SXNETID_push(sk, ptr) OPENSSL_sk_push(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_pop(sk) ((SXNETID *)OPENSSL_sk_pop(ossl_check_SXNETID_sk_type(sk))) +#define sk_SXNETID_shift(sk) ((SXNETID *)OPENSSL_sk_shift(ossl_check_SXNETID_sk_type(sk))) +#define sk_SXNETID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SXNETID_sk_type(sk),ossl_check_SXNETID_freefunc_type(freefunc)) +#define sk_SXNETID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr), (idx)) +#define sk_SXNETID_set(sk, idx, ptr) ((SXNETID *)OPENSSL_sk_set(ossl_check_SXNETID_sk_type(sk), (idx), ossl_check_SXNETID_type(ptr))) +#define sk_SXNETID_find(sk, ptr) OPENSSL_sk_find(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr), pnum) +#define sk_SXNETID_sort(sk) OPENSSL_sk_sort(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SXNETID_sk_type(sk)) +#define sk_SXNETID_dup(sk) ((STACK_OF(SXNETID) *)OPENSSL_sk_dup(ossl_check_const_SXNETID_sk_type(sk))) +#define sk_SXNETID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SXNETID) *)OPENSSL_sk_deep_copy(ossl_check_const_SXNETID_sk_type(sk), ossl_check_SXNETID_copyfunc_type(copyfunc), ossl_check_SXNETID_freefunc_type(freefunc))) +#define sk_SXNETID_set_cmp_func(sk, cmp) ((sk_SXNETID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_compfunc_type(cmp))) + + + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct ISSUER_SIGN_TOOL_st { + ASN1_UTF8STRING *signTool; + ASN1_UTF8STRING *cATool; + ASN1_UTF8STRING *signToolCert; + ASN1_UTF8STRING *cAToolCert; +} ISSUER_SIGN_TOOL; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +SKM_DEFINE_STACK_OF_INTERNAL(POLICYQUALINFO, POLICYQUALINFO, POLICYQUALINFO) +#define sk_POLICYQUALINFO_num(sk) OPENSSL_sk_num(ossl_check_const_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_value(sk, idx) ((POLICYQUALINFO *)OPENSSL_sk_value(ossl_check_const_POLICYQUALINFO_sk_type(sk), (idx))) +#define sk_POLICYQUALINFO_new(cmp) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new(ossl_check_POLICYQUALINFO_compfunc_type(cmp))) +#define sk_POLICYQUALINFO_new_null() ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new_null()) +#define sk_POLICYQUALINFO_new_reserve(cmp, n) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new_reserve(ossl_check_POLICYQUALINFO_compfunc_type(cmp), (n))) +#define sk_POLICYQUALINFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICYQUALINFO_sk_type(sk), (n)) +#define sk_POLICYQUALINFO_free(sk) OPENSSL_sk_free(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_zero(sk) OPENSSL_sk_zero(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_delete(sk, i) ((POLICYQUALINFO *)OPENSSL_sk_delete(ossl_check_POLICYQUALINFO_sk_type(sk), (i))) +#define sk_POLICYQUALINFO_delete_ptr(sk, ptr) ((POLICYQUALINFO *)OPENSSL_sk_delete_ptr(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr))) +#define sk_POLICYQUALINFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_pop(sk) ((POLICYQUALINFO *)OPENSSL_sk_pop(ossl_check_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_shift(sk) ((POLICYQUALINFO *)OPENSSL_sk_shift(ossl_check_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICYQUALINFO_sk_type(sk),ossl_check_POLICYQUALINFO_freefunc_type(freefunc)) +#define sk_POLICYQUALINFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr), (idx)) +#define sk_POLICYQUALINFO_set(sk, idx, ptr) ((POLICYQUALINFO *)OPENSSL_sk_set(ossl_check_POLICYQUALINFO_sk_type(sk), (idx), ossl_check_POLICYQUALINFO_type(ptr))) +#define sk_POLICYQUALINFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr), pnum) +#define sk_POLICYQUALINFO_sort(sk) OPENSSL_sk_sort(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_dup(sk) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_dup(ossl_check_const_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_copyfunc_type(copyfunc), ossl_check_POLICYQUALINFO_freefunc_type(freefunc))) +#define sk_POLICYQUALINFO_set_cmp_func(sk, cmp) ((sk_POLICYQUALINFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_compfunc_type(cmp))) + + + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +SKM_DEFINE_STACK_OF_INTERNAL(POLICYINFO, POLICYINFO, POLICYINFO) +#define sk_POLICYINFO_num(sk) OPENSSL_sk_num(ossl_check_const_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_value(sk, idx) ((POLICYINFO *)OPENSSL_sk_value(ossl_check_const_POLICYINFO_sk_type(sk), (idx))) +#define sk_POLICYINFO_new(cmp) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new(ossl_check_POLICYINFO_compfunc_type(cmp))) +#define sk_POLICYINFO_new_null() ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new_null()) +#define sk_POLICYINFO_new_reserve(cmp, n) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new_reserve(ossl_check_POLICYINFO_compfunc_type(cmp), (n))) +#define sk_POLICYINFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICYINFO_sk_type(sk), (n)) +#define sk_POLICYINFO_free(sk) OPENSSL_sk_free(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_zero(sk) OPENSSL_sk_zero(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_delete(sk, i) ((POLICYINFO *)OPENSSL_sk_delete(ossl_check_POLICYINFO_sk_type(sk), (i))) +#define sk_POLICYINFO_delete_ptr(sk, ptr) ((POLICYINFO *)OPENSSL_sk_delete_ptr(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr))) +#define sk_POLICYINFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_pop(sk) ((POLICYINFO *)OPENSSL_sk_pop(ossl_check_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_shift(sk) ((POLICYINFO *)OPENSSL_sk_shift(ossl_check_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICYINFO_sk_type(sk),ossl_check_POLICYINFO_freefunc_type(freefunc)) +#define sk_POLICYINFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr), (idx)) +#define sk_POLICYINFO_set(sk, idx, ptr) ((POLICYINFO *)OPENSSL_sk_set(ossl_check_POLICYINFO_sk_type(sk), (idx), ossl_check_POLICYINFO_type(ptr))) +#define sk_POLICYINFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr), pnum) +#define sk_POLICYINFO_sort(sk) OPENSSL_sk_sort(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_dup(sk) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_dup(ossl_check_const_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_copyfunc_type(copyfunc), ossl_check_POLICYINFO_freefunc_type(freefunc))) +#define sk_POLICYINFO_set_cmp_func(sk, cmp) ((sk_POLICYINFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_compfunc_type(cmp))) + + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +SKM_DEFINE_STACK_OF_INTERNAL(POLICY_MAPPING, POLICY_MAPPING, POLICY_MAPPING) +#define sk_POLICY_MAPPING_num(sk) OPENSSL_sk_num(ossl_check_const_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_value(sk, idx) ((POLICY_MAPPING *)OPENSSL_sk_value(ossl_check_const_POLICY_MAPPING_sk_type(sk), (idx))) +#define sk_POLICY_MAPPING_new(cmp) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new(ossl_check_POLICY_MAPPING_compfunc_type(cmp))) +#define sk_POLICY_MAPPING_new_null() ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new_null()) +#define sk_POLICY_MAPPING_new_reserve(cmp, n) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new_reserve(ossl_check_POLICY_MAPPING_compfunc_type(cmp), (n))) +#define sk_POLICY_MAPPING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICY_MAPPING_sk_type(sk), (n)) +#define sk_POLICY_MAPPING_free(sk) OPENSSL_sk_free(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_zero(sk) OPENSSL_sk_zero(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_delete(sk, i) ((POLICY_MAPPING *)OPENSSL_sk_delete(ossl_check_POLICY_MAPPING_sk_type(sk), (i))) +#define sk_POLICY_MAPPING_delete_ptr(sk, ptr) ((POLICY_MAPPING *)OPENSSL_sk_delete_ptr(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr))) +#define sk_POLICY_MAPPING_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_pop(sk) ((POLICY_MAPPING *)OPENSSL_sk_pop(ossl_check_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_shift(sk) ((POLICY_MAPPING *)OPENSSL_sk_shift(ossl_check_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICY_MAPPING_sk_type(sk),ossl_check_POLICY_MAPPING_freefunc_type(freefunc)) +#define sk_POLICY_MAPPING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr), (idx)) +#define sk_POLICY_MAPPING_set(sk, idx, ptr) ((POLICY_MAPPING *)OPENSSL_sk_set(ossl_check_POLICY_MAPPING_sk_type(sk), (idx), ossl_check_POLICY_MAPPING_type(ptr))) +#define sk_POLICY_MAPPING_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr), pnum) +#define sk_POLICY_MAPPING_sort(sk) OPENSSL_sk_sort(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_dup(sk) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_dup(ossl_check_const_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_copyfunc_type(copyfunc), ossl_check_POLICY_MAPPING_freefunc_type(freefunc))) +#define sk_POLICY_MAPPING_set_cmp_func(sk, cmp) ((sk_POLICY_MAPPING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_compfunc_type(cmp))) + + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_SUBTREE, GENERAL_SUBTREE, GENERAL_SUBTREE) +#define sk_GENERAL_SUBTREE_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_value(sk, idx) ((GENERAL_SUBTREE *)OPENSSL_sk_value(ossl_check_const_GENERAL_SUBTREE_sk_type(sk), (idx))) +#define sk_GENERAL_SUBTREE_new(cmp) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new(ossl_check_GENERAL_SUBTREE_compfunc_type(cmp))) +#define sk_GENERAL_SUBTREE_new_null() ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_SUBTREE_new_reserve(cmp, n) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_SUBTREE_compfunc_type(cmp), (n))) +#define sk_GENERAL_SUBTREE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_SUBTREE_sk_type(sk), (n)) +#define sk_GENERAL_SUBTREE_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_delete(sk, i) ((GENERAL_SUBTREE *)OPENSSL_sk_delete(ossl_check_GENERAL_SUBTREE_sk_type(sk), (i))) +#define sk_GENERAL_SUBTREE_delete_ptr(sk, ptr) ((GENERAL_SUBTREE *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr))) +#define sk_GENERAL_SUBTREE_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_pop(sk) ((GENERAL_SUBTREE *)OPENSSL_sk_pop(ossl_check_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_shift(sk) ((GENERAL_SUBTREE *)OPENSSL_sk_shift(ossl_check_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_SUBTREE_sk_type(sk),ossl_check_GENERAL_SUBTREE_freefunc_type(freefunc)) +#define sk_GENERAL_SUBTREE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr), (idx)) +#define sk_GENERAL_SUBTREE_set(sk, idx, ptr) ((GENERAL_SUBTREE *)OPENSSL_sk_set(ossl_check_GENERAL_SUBTREE_sk_type(sk), (idx), ossl_check_GENERAL_SUBTREE_type(ptr))) +#define sk_GENERAL_SUBTREE_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr), pnum) +#define sk_GENERAL_SUBTREE_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_dup(sk) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_copyfunc_type(copyfunc), ossl_check_GENERAL_SUBTREE_freefunc_type(freefunc))) +#define sk_GENERAL_SUBTREE_set_cmp_func(sk, cmp) ((sk_GENERAL_SUBTREE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_compfunc_type(cmp))) + + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; +} PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; +} PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + +struct ISSUING_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +}; + +/* Values in idp_flags field */ +/* IDP present */ +# define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +# define IDP_INVALID 0x2 +/* onlyuser true */ +# define IDP_ONLYUSER 0x4 +/* onlyCA true */ +# define IDP_ONLYCA 0x8 +/* onlyattr true */ +# define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +# define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +# define IDP_REASONS 0x40 + +# define X509V3_conf_err(val) ERR_add_error_data(6, \ + "section:", (val)->section, \ + ",name:", (val)->name, ",value:", (val)->value) + +# define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, X509V3_CTX_TEST) +# define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +# define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0,0,0,0, \ + 0,0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table} + +# define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0,0,0,0, \ + NULL} + +#define EXT_UTF8STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_UTF8STRING), \ + 0,0,0,0, \ + (X509V3_EXT_I2S)i2s_ASN1_UTF8STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_UTF8STRING, \ + 0,0,0,0, \ + NULL} + +# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +/* X509_PURPOSE stuff */ + +# define EXFLAG_BCONS 0x1 +# define EXFLAG_KUSAGE 0x2 +# define EXFLAG_XKUSAGE 0x4 +# define EXFLAG_NSCERT 0x8 + +# define EXFLAG_CA 0x10 +# define EXFLAG_SI 0x20 /* self-issued, maybe not self-signed */ +# define EXFLAG_V1 0x40 +# define EXFLAG_INVALID 0x80 +/* EXFLAG_SET is set to indicate that some values have been precomputed */ +# define EXFLAG_SET 0x100 +# define EXFLAG_CRITICAL 0x200 +# define EXFLAG_PROXY 0x400 + +# define EXFLAG_INVALID_POLICY 0x800 +# define EXFLAG_FRESHEST 0x1000 +# define EXFLAG_SS 0x2000 /* cert is apparently self-signed */ + +# define EXFLAG_BCONS_CRITICAL 0x10000 +# define EXFLAG_AKID_CRITICAL 0x20000 +# define EXFLAG_SKID_CRITICAL 0x40000 +# define EXFLAG_SAN_CRITICAL 0x80000 +# define EXFLAG_NO_FINGERPRINT 0x100000 + +# define KU_DIGITAL_SIGNATURE 0x0080 +# define KU_NON_REPUDIATION 0x0040 +# define KU_KEY_ENCIPHERMENT 0x0020 +# define KU_DATA_ENCIPHERMENT 0x0010 +# define KU_KEY_AGREEMENT 0x0008 +# define KU_KEY_CERT_SIGN 0x0004 +# define KU_CRL_SIGN 0x0002 +# define KU_ENCIPHER_ONLY 0x0001 +# define KU_DECIPHER_ONLY 0x8000 + +# define NS_SSL_CLIENT 0x80 +# define NS_SSL_SERVER 0x40 +# define NS_SMIME 0x20 +# define NS_OBJSIGN 0x10 +# define NS_SSL_CA 0x04 +# define NS_SMIME_CA 0x02 +# define NS_OBJSIGN_CA 0x01 +# define NS_ANY_CA (NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA) + +# define XKU_SSL_SERVER 0x1 +# define XKU_SSL_CLIENT 0x2 +# define XKU_SMIME 0x4 +# define XKU_CODE_SIGN 0x8 +# define XKU_SGC 0x10 /* Netscape or MS Server-Gated Crypto */ +# define XKU_OCSP_SIGN 0x20 +# define XKU_TIMESTAMP 0x40 +# define XKU_DVCS 0x80 +# define XKU_ANYEKU 0x100 + +# define X509_PURPOSE_DYNAMIC 0x1 +# define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose) (const struct x509_purpose_st *, const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +SKM_DEFINE_STACK_OF_INTERNAL(X509_PURPOSE, X509_PURPOSE, X509_PURPOSE) +#define sk_X509_PURPOSE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_value(sk, idx) ((X509_PURPOSE *)OPENSSL_sk_value(ossl_check_const_X509_PURPOSE_sk_type(sk), (idx))) +#define sk_X509_PURPOSE_new(cmp) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new(ossl_check_X509_PURPOSE_compfunc_type(cmp))) +#define sk_X509_PURPOSE_new_null() ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new_null()) +#define sk_X509_PURPOSE_new_reserve(cmp, n) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new_reserve(ossl_check_X509_PURPOSE_compfunc_type(cmp), (n))) +#define sk_X509_PURPOSE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_PURPOSE_sk_type(sk), (n)) +#define sk_X509_PURPOSE_free(sk) OPENSSL_sk_free(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_delete(sk, i) ((X509_PURPOSE *)OPENSSL_sk_delete(ossl_check_X509_PURPOSE_sk_type(sk), (i))) +#define sk_X509_PURPOSE_delete_ptr(sk, ptr) ((X509_PURPOSE *)OPENSSL_sk_delete_ptr(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr))) +#define sk_X509_PURPOSE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_pop(sk) ((X509_PURPOSE *)OPENSSL_sk_pop(ossl_check_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_shift(sk) ((X509_PURPOSE *)OPENSSL_sk_shift(ossl_check_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_PURPOSE_sk_type(sk),ossl_check_X509_PURPOSE_freefunc_type(freefunc)) +#define sk_X509_PURPOSE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr), (idx)) +#define sk_X509_PURPOSE_set(sk, idx, ptr) ((X509_PURPOSE *)OPENSSL_sk_set(ossl_check_X509_PURPOSE_sk_type(sk), (idx), ossl_check_X509_PURPOSE_type(ptr))) +#define sk_X509_PURPOSE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr), pnum) +#define sk_X509_PURPOSE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_dup(sk) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_dup(ossl_check_const_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_copyfunc_type(copyfunc), ossl_check_X509_PURPOSE_freefunc_type(freefunc))) +#define sk_X509_PURPOSE_set_cmp_func(sk, cmp) ((sk_X509_PURPOSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_compfunc_type(cmp))) + + + +# define X509_PURPOSE_SSL_CLIENT 1 +# define X509_PURPOSE_SSL_SERVER 2 +# define X509_PURPOSE_NS_SSL_SERVER 3 +# define X509_PURPOSE_SMIME_SIGN 4 +# define X509_PURPOSE_SMIME_ENCRYPT 5 +# define X509_PURPOSE_CRL_SIGN 6 +# define X509_PURPOSE_ANY 7 +# define X509_PURPOSE_OCSP_HELPER 8 +# define X509_PURPOSE_TIMESTAMP_SIGN 9 + +# define X509_PURPOSE_MIN 1 +# define X509_PURPOSE_MAX 9 + +/* Flags for X509V3_EXT_print() */ + +# define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +# define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +# define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +# define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +# define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +# define X509V3_ADD_OP_MASK 0xfL +# define X509V3_ADD_DEFAULT 0L +# define X509V3_ADD_APPEND 1L +# define X509V3_ADD_REPLACE 2L +# define X509V3_ADD_REPLACE_EXISTING 3L +# define X509V3_ADD_KEEP_EXISTING 4L +# define X509V3_ADD_DELETE 5L +# define X509V3_ADD_SILENT 0x10 + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +DECLARE_ASN1_FUNCTIONS(ISSUER_SIGN_TOOL) + +int SXNET_add_id_asc(SXNET **psx, const char *zone, const char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, const char *user, + int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, const char *user, + int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, const char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) + +DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) +DECLARE_ASN1_DUP_FUNCTION(GENERAL_NAME) +int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, + STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); +char *i2s_ASN1_IA5STRING(X509V3_EXT_METHOD *method, ASN1_IA5STRING *ia5); +ASN1_IA5STRING *s2i_ASN1_IA5STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); +char *i2s_ASN1_UTF8STRING(X509V3_EXT_METHOD *method, ASN1_UTF8STRING *utf8); +ASN1_UTF8STRING *s2i_ASN1_UTF8STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, + GENERAL_NAME *gen, + STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, + STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +DECLARE_ASN1_FUNCTIONS(OTHERNAME) +DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) +int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); +void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); +void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + const ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a); + +DECLARE_ASN1_ALLOC_FUNCTIONS(TLS_FEATURE) + +DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) +DECLARE_ASN1_FUNCTIONS(POLICYINFO) +DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) +DECLARE_ASN1_FUNCTIONS(USERNOTICE) +DECLARE_ASN1_FUNCTIONS(NOTICEREF) + +DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) +DECLARE_ASN1_FUNCTIONS(DIST_POINT) +DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) +DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT) + +int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, const X509_NAME *iname); + +int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); +int NAME_CONSTRAINTS_check_CN(X509 *x, NAME_CONSTRAINTS *nc); + +DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) +DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) + +DECLARE_ASN1_ITEM(POLICY_MAPPING) +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) +DECLARE_ASN1_ITEM(POLICY_MAPPINGS) + +DECLARE_ASN1_ITEM(GENERAL_SUBTREE) +DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) + +DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) +DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) + +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) +DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) + +GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, int gen_type, + const char *value, int is_nc); + +# ifdef OPENSSL_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, + int is_nc); + +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, + const char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name, + const char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section, + STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + X509V3_CTX *ctx, int ext_nid, + const char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *name, const char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); +# endif + +char *X509V3_get_string(X509V3_CTX *ctx, const char *name, const char *section); +STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); +/* For API backward compatibility, this is separate from X509V3_set_ctx(): */ +int X509V3_set_issuer_pkey(X509V3_CTX *ctx, EVP_PKEY *pkey); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const ASN1_INTEGER *aint); +ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const char *value); +char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, const ASN1_ENUMERATED *aint); +char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, + const ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *x, int nid, int *crit, + int *idx); + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, + int crit, unsigned long flags); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* The new declarations are in crypto.h, but the old ones were here. */ +# define hex_to_string OPENSSL_buf2hexstr +# define string_to_hex OPENSSL_hexstr2buf +#endif + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, + int indent); +#ifndef OPENSSL_NO_STDIO +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); +#endif +int X509V3_extensions_print(BIO *out, const char *title, + const STACK_OF(X509_EXTENSION) *exts, + unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_PURPOSE_set(int *p, int purpose); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_check_akid(const X509 *issuer, const AUTHORITY_KEYID *akid); +void X509_set_proxy_flag(X509 *x); +void X509_set_proxy_pathlen(X509 *x, long l); +long X509_get_proxy_pathlen(X509 *x); + +uint32_t X509_get_extension_flags(X509 *x); +uint32_t X509_get_key_usage(X509 *x); +uint32_t X509_get_extended_key_usage(X509 *x); +const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x); +const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x); +const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x); +const ASN1_INTEGER *X509_get0_authority_serial(X509 *x); + +int X509_PURPOSE_get_count(void); +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_by_sname(const char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck) (const X509_PURPOSE *, const X509 *, int), + const char *name, const char *sname, void *arg); +char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(const X509_PURPOSE *xp); +void X509_PURPOSE_cleanup(void); +int X509_PURPOSE_get_id(const X509_PURPOSE *); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); +/* Flags for X509_check_* functions */ + +/* + * Always check subject name for host match even if subject alt names present + */ +# define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +# define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +# define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 +/* Never check the subject CN */ +# define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT 0x20 +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +# define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); +SKM_DEFINE_STACK_OF_INTERNAL(X509_POLICY_NODE, X509_POLICY_NODE, X509_POLICY_NODE) +#define sk_X509_POLICY_NODE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_value(sk, idx) ((X509_POLICY_NODE *)OPENSSL_sk_value(ossl_check_const_X509_POLICY_NODE_sk_type(sk), (idx))) +#define sk_X509_POLICY_NODE_new(cmp) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new(ossl_check_X509_POLICY_NODE_compfunc_type(cmp))) +#define sk_X509_POLICY_NODE_new_null() ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new_null()) +#define sk_X509_POLICY_NODE_new_reserve(cmp, n) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new_reserve(ossl_check_X509_POLICY_NODE_compfunc_type(cmp), (n))) +#define sk_X509_POLICY_NODE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_POLICY_NODE_sk_type(sk), (n)) +#define sk_X509_POLICY_NODE_free(sk) OPENSSL_sk_free(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_delete(sk, i) ((X509_POLICY_NODE *)OPENSSL_sk_delete(ossl_check_X509_POLICY_NODE_sk_type(sk), (i))) +#define sk_X509_POLICY_NODE_delete_ptr(sk, ptr) ((X509_POLICY_NODE *)OPENSSL_sk_delete_ptr(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr))) +#define sk_X509_POLICY_NODE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_pop(sk) ((X509_POLICY_NODE *)OPENSSL_sk_pop(ossl_check_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_shift(sk) ((X509_POLICY_NODE *)OPENSSL_sk_shift(ossl_check_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_POLICY_NODE_sk_type(sk),ossl_check_X509_POLICY_NODE_freefunc_type(freefunc)) +#define sk_X509_POLICY_NODE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr), (idx)) +#define sk_X509_POLICY_NODE_set(sk, idx, ptr) ((X509_POLICY_NODE *)OPENSSL_sk_set(ossl_check_X509_POLICY_NODE_sk_type(sk), (idx), ossl_check_X509_POLICY_NODE_type(ptr))) +#define sk_X509_POLICY_NODE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr), pnum) +#define sk_X509_POLICY_NODE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_dup(sk) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_dup(ossl_check_const_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_copyfunc_type(copyfunc), ossl_check_X509_POLICY_NODE_freefunc_type(freefunc))) +#define sk_X509_POLICY_NODE_set_cmp_func(sk, cmp) ((sk_X509_POLICY_NODE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_compfunc_type(cmp))) + + + +#ifndef OPENSSL_NO_RFC3779 +typedef struct ASRange_st { + ASN1_INTEGER *min, *max; +} ASRange; + +# define ASIdOrRange_id 0 +# define ASIdOrRange_range 1 + +typedef struct ASIdOrRange_st { + int type; + union { + ASN1_INTEGER *id; + ASRange *range; + } u; +} ASIdOrRange; + +SKM_DEFINE_STACK_OF_INTERNAL(ASIdOrRange, ASIdOrRange, ASIdOrRange) +#define sk_ASIdOrRange_num(sk) OPENSSL_sk_num(ossl_check_const_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_value(sk, idx) ((ASIdOrRange *)OPENSSL_sk_value(ossl_check_const_ASIdOrRange_sk_type(sk), (idx))) +#define sk_ASIdOrRange_new(cmp) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new(ossl_check_ASIdOrRange_compfunc_type(cmp))) +#define sk_ASIdOrRange_new_null() ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new_null()) +#define sk_ASIdOrRange_new_reserve(cmp, n) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new_reserve(ossl_check_ASIdOrRange_compfunc_type(cmp), (n))) +#define sk_ASIdOrRange_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASIdOrRange_sk_type(sk), (n)) +#define sk_ASIdOrRange_free(sk) OPENSSL_sk_free(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_zero(sk) OPENSSL_sk_zero(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_delete(sk, i) ((ASIdOrRange *)OPENSSL_sk_delete(ossl_check_ASIdOrRange_sk_type(sk), (i))) +#define sk_ASIdOrRange_delete_ptr(sk, ptr) ((ASIdOrRange *)OPENSSL_sk_delete_ptr(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr))) +#define sk_ASIdOrRange_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_pop(sk) ((ASIdOrRange *)OPENSSL_sk_pop(ossl_check_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_shift(sk) ((ASIdOrRange *)OPENSSL_sk_shift(ossl_check_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASIdOrRange_sk_type(sk),ossl_check_ASIdOrRange_freefunc_type(freefunc)) +#define sk_ASIdOrRange_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr), (idx)) +#define sk_ASIdOrRange_set(sk, idx, ptr) ((ASIdOrRange *)OPENSSL_sk_set(ossl_check_ASIdOrRange_sk_type(sk), (idx), ossl_check_ASIdOrRange_type(ptr))) +#define sk_ASIdOrRange_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr), pnum) +#define sk_ASIdOrRange_sort(sk) OPENSSL_sk_sort(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_dup(sk) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_dup(ossl_check_const_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_deep_copy(ossl_check_const_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_copyfunc_type(copyfunc), ossl_check_ASIdOrRange_freefunc_type(freefunc))) +#define sk_ASIdOrRange_set_cmp_func(sk, cmp) ((sk_ASIdOrRange_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_compfunc_type(cmp))) + + +typedef STACK_OF(ASIdOrRange) ASIdOrRanges; + +# define ASIdentifierChoice_inherit 0 +# define ASIdentifierChoice_asIdsOrRanges 1 + +typedef struct ASIdentifierChoice_st { + int type; + union { + ASN1_NULL *inherit; + ASIdOrRanges *asIdsOrRanges; + } u; +} ASIdentifierChoice; + +typedef struct ASIdentifiers_st { + ASIdentifierChoice *asnum, *rdi; +} ASIdentifiers; + +DECLARE_ASN1_FUNCTIONS(ASRange) +DECLARE_ASN1_FUNCTIONS(ASIdOrRange) +DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) +DECLARE_ASN1_FUNCTIONS(ASIdentifiers) + +typedef struct IPAddressRange_st { + ASN1_BIT_STRING *min, *max; +} IPAddressRange; + +# define IPAddressOrRange_addressPrefix 0 +# define IPAddressOrRange_addressRange 1 + +typedef struct IPAddressOrRange_st { + int type; + union { + ASN1_BIT_STRING *addressPrefix; + IPAddressRange *addressRange; + } u; +} IPAddressOrRange; + +SKM_DEFINE_STACK_OF_INTERNAL(IPAddressOrRange, IPAddressOrRange, IPAddressOrRange) +#define sk_IPAddressOrRange_num(sk) OPENSSL_sk_num(ossl_check_const_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_value(sk, idx) ((IPAddressOrRange *)OPENSSL_sk_value(ossl_check_const_IPAddressOrRange_sk_type(sk), (idx))) +#define sk_IPAddressOrRange_new(cmp) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new(ossl_check_IPAddressOrRange_compfunc_type(cmp))) +#define sk_IPAddressOrRange_new_null() ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new_null()) +#define sk_IPAddressOrRange_new_reserve(cmp, n) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new_reserve(ossl_check_IPAddressOrRange_compfunc_type(cmp), (n))) +#define sk_IPAddressOrRange_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_IPAddressOrRange_sk_type(sk), (n)) +#define sk_IPAddressOrRange_free(sk) OPENSSL_sk_free(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_zero(sk) OPENSSL_sk_zero(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_delete(sk, i) ((IPAddressOrRange *)OPENSSL_sk_delete(ossl_check_IPAddressOrRange_sk_type(sk), (i))) +#define sk_IPAddressOrRange_delete_ptr(sk, ptr) ((IPAddressOrRange *)OPENSSL_sk_delete_ptr(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr))) +#define sk_IPAddressOrRange_push(sk, ptr) OPENSSL_sk_push(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_pop(sk) ((IPAddressOrRange *)OPENSSL_sk_pop(ossl_check_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_shift(sk) ((IPAddressOrRange *)OPENSSL_sk_shift(ossl_check_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_IPAddressOrRange_sk_type(sk),ossl_check_IPAddressOrRange_freefunc_type(freefunc)) +#define sk_IPAddressOrRange_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr), (idx)) +#define sk_IPAddressOrRange_set(sk, idx, ptr) ((IPAddressOrRange *)OPENSSL_sk_set(ossl_check_IPAddressOrRange_sk_type(sk), (idx), ossl_check_IPAddressOrRange_type(ptr))) +#define sk_IPAddressOrRange_find(sk, ptr) OPENSSL_sk_find(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr), pnum) +#define sk_IPAddressOrRange_sort(sk) OPENSSL_sk_sort(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_dup(sk) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_dup(ossl_check_const_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_deep_copy(ossl_check_const_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_copyfunc_type(copyfunc), ossl_check_IPAddressOrRange_freefunc_type(freefunc))) +#define sk_IPAddressOrRange_set_cmp_func(sk, cmp) ((sk_IPAddressOrRange_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_compfunc_type(cmp))) + + +typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; + +# define IPAddressChoice_inherit 0 +# define IPAddressChoice_addressesOrRanges 1 + +typedef struct IPAddressChoice_st { + int type; + union { + ASN1_NULL *inherit; + IPAddressOrRanges *addressesOrRanges; + } u; +} IPAddressChoice; + +typedef struct IPAddressFamily_st { + ASN1_OCTET_STRING *addressFamily; + IPAddressChoice *ipAddressChoice; +} IPAddressFamily; + +SKM_DEFINE_STACK_OF_INTERNAL(IPAddressFamily, IPAddressFamily, IPAddressFamily) +#define sk_IPAddressFamily_num(sk) OPENSSL_sk_num(ossl_check_const_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_value(sk, idx) ((IPAddressFamily *)OPENSSL_sk_value(ossl_check_const_IPAddressFamily_sk_type(sk), (idx))) +#define sk_IPAddressFamily_new(cmp) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new(ossl_check_IPAddressFamily_compfunc_type(cmp))) +#define sk_IPAddressFamily_new_null() ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new_null()) +#define sk_IPAddressFamily_new_reserve(cmp, n) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new_reserve(ossl_check_IPAddressFamily_compfunc_type(cmp), (n))) +#define sk_IPAddressFamily_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_IPAddressFamily_sk_type(sk), (n)) +#define sk_IPAddressFamily_free(sk) OPENSSL_sk_free(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_zero(sk) OPENSSL_sk_zero(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_delete(sk, i) ((IPAddressFamily *)OPENSSL_sk_delete(ossl_check_IPAddressFamily_sk_type(sk), (i))) +#define sk_IPAddressFamily_delete_ptr(sk, ptr) ((IPAddressFamily *)OPENSSL_sk_delete_ptr(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr))) +#define sk_IPAddressFamily_push(sk, ptr) OPENSSL_sk_push(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_pop(sk) ((IPAddressFamily *)OPENSSL_sk_pop(ossl_check_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_shift(sk) ((IPAddressFamily *)OPENSSL_sk_shift(ossl_check_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_IPAddressFamily_sk_type(sk),ossl_check_IPAddressFamily_freefunc_type(freefunc)) +#define sk_IPAddressFamily_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr), (idx)) +#define sk_IPAddressFamily_set(sk, idx, ptr) ((IPAddressFamily *)OPENSSL_sk_set(ossl_check_IPAddressFamily_sk_type(sk), (idx), ossl_check_IPAddressFamily_type(ptr))) +#define sk_IPAddressFamily_find(sk, ptr) OPENSSL_sk_find(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr), pnum) +#define sk_IPAddressFamily_sort(sk) OPENSSL_sk_sort(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_dup(sk) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_dup(ossl_check_const_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_deep_copy(ossl_check_const_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_copyfunc_type(copyfunc), ossl_check_IPAddressFamily_freefunc_type(freefunc))) +#define sk_IPAddressFamily_set_cmp_func(sk, cmp) ((sk_IPAddressFamily_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_compfunc_type(cmp))) + + + +typedef STACK_OF(IPAddressFamily) IPAddrBlocks; + +DECLARE_ASN1_FUNCTIONS(IPAddressRange) +DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) +DECLARE_ASN1_FUNCTIONS(IPAddressChoice) +DECLARE_ASN1_FUNCTIONS(IPAddressFamily) + +/* + * API tag for elements of the ASIdentifer SEQUENCE. + */ +# define V3_ASID_ASNUM 0 +# define V3_ASID_RDI 1 + +/* + * AFI values, assigned by IANA. It'd be nice to make the AFI + * handling code totally generic, but there are too many little things + * that would need to be defined for other address families for it to + * be worth the trouble. + */ +# define IANA_AFI_IPV4 1 +# define IANA_AFI_IPV6 2 + +/* + * Utilities to construct and extract values from RFC3779 extensions, + * since some of the encodings (particularly for IP address prefixes + * and ranges) are a bit tedious to work with directly. + */ +int X509v3_asid_add_inherit(ASIdentifiers *asid, int which); +int X509v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int X509v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int X509v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int X509v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned X509v3_addr_get_afi(const IPAddressFamily *f); +int X509v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int X509v3_asid_is_canonical(ASIdentifiers *asid); +int X509v3_addr_is_canonical(IPAddrBlocks *addr); +int X509v3_asid_canonize(ASIdentifiers *asid); +int X509v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int X509v3_asid_inherits(ASIdentifiers *asid); +int X509v3_addr_inherits(IPAddrBlocks *addr); +int X509v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int X509v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int X509v3_asid_validate_path(X509_STORE_CTX *); +int X509v3_addr_validate_path(X509_STORE_CTX *); +int X509v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, + int allow_inheritance); +int X509v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, int allow_inheritance); + +#endif /* OPENSSL_NO_RFC3779 */ + +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_STRING, ASN1_STRING, ASN1_STRING) +#define sk_ASN1_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_value(sk, idx) ((ASN1_STRING *)OPENSSL_sk_value(ossl_check_const_ASN1_STRING_sk_type(sk), (idx))) +#define sk_ASN1_STRING_new(cmp) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new(ossl_check_ASN1_STRING_compfunc_type(cmp))) +#define sk_ASN1_STRING_new_null() ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_STRING_new_reserve(cmp, n) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_STRING_compfunc_type(cmp), (n))) +#define sk_ASN1_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_STRING_sk_type(sk), (n)) +#define sk_ASN1_STRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_delete(sk, i) ((ASN1_STRING *)OPENSSL_sk_delete(ossl_check_ASN1_STRING_sk_type(sk), (i))) +#define sk_ASN1_STRING_delete_ptr(sk, ptr) ((ASN1_STRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr))) +#define sk_ASN1_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_pop(sk) ((ASN1_STRING *)OPENSSL_sk_pop(ossl_check_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_shift(sk) ((ASN1_STRING *)OPENSSL_sk_shift(ossl_check_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_STRING_sk_type(sk),ossl_check_ASN1_STRING_freefunc_type(freefunc)) +#define sk_ASN1_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr), (idx)) +#define sk_ASN1_STRING_set(sk, idx, ptr) ((ASN1_STRING *)OPENSSL_sk_set(ossl_check_ASN1_STRING_sk_type(sk), (idx), ossl_check_ASN1_STRING_type(ptr))) +#define sk_ASN1_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr), pnum) +#define sk_ASN1_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_dup(sk) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_copyfunc_type(copyfunc), ossl_check_ASN1_STRING_freefunc_type(freefunc))) +#define sk_ASN1_STRING_set_cmp_func(sk, cmp) ((sk_ASN1_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_compfunc_type(cmp))) + + +/* + * Admission Syntax + */ +typedef struct NamingAuthority_st NAMING_AUTHORITY; +typedef struct ProfessionInfo_st PROFESSION_INFO; +typedef struct Admissions_st ADMISSIONS; +typedef struct AdmissionSyntax_st ADMISSION_SYNTAX; +DECLARE_ASN1_FUNCTIONS(NAMING_AUTHORITY) +DECLARE_ASN1_FUNCTIONS(PROFESSION_INFO) +DECLARE_ASN1_FUNCTIONS(ADMISSIONS) +DECLARE_ASN1_FUNCTIONS(ADMISSION_SYNTAX) +SKM_DEFINE_STACK_OF_INTERNAL(PROFESSION_INFO, PROFESSION_INFO, PROFESSION_INFO) +#define sk_PROFESSION_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_value(sk, idx) ((PROFESSION_INFO *)OPENSSL_sk_value(ossl_check_const_PROFESSION_INFO_sk_type(sk), (idx))) +#define sk_PROFESSION_INFO_new(cmp) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new(ossl_check_PROFESSION_INFO_compfunc_type(cmp))) +#define sk_PROFESSION_INFO_new_null() ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new_null()) +#define sk_PROFESSION_INFO_new_reserve(cmp, n) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PROFESSION_INFO_compfunc_type(cmp), (n))) +#define sk_PROFESSION_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PROFESSION_INFO_sk_type(sk), (n)) +#define sk_PROFESSION_INFO_free(sk) OPENSSL_sk_free(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_delete(sk, i) ((PROFESSION_INFO *)OPENSSL_sk_delete(ossl_check_PROFESSION_INFO_sk_type(sk), (i))) +#define sk_PROFESSION_INFO_delete_ptr(sk, ptr) ((PROFESSION_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr))) +#define sk_PROFESSION_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_pop(sk) ((PROFESSION_INFO *)OPENSSL_sk_pop(ossl_check_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_shift(sk) ((PROFESSION_INFO *)OPENSSL_sk_shift(ossl_check_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PROFESSION_INFO_sk_type(sk),ossl_check_PROFESSION_INFO_freefunc_type(freefunc)) +#define sk_PROFESSION_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr), (idx)) +#define sk_PROFESSION_INFO_set(sk, idx, ptr) ((PROFESSION_INFO *)OPENSSL_sk_set(ossl_check_PROFESSION_INFO_sk_type(sk), (idx), ossl_check_PROFESSION_INFO_type(ptr))) +#define sk_PROFESSION_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr), pnum) +#define sk_PROFESSION_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_dup(sk) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_dup(ossl_check_const_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_copyfunc_type(copyfunc), ossl_check_PROFESSION_INFO_freefunc_type(freefunc))) +#define sk_PROFESSION_INFO_set_cmp_func(sk, cmp) ((sk_PROFESSION_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(ADMISSIONS, ADMISSIONS, ADMISSIONS) +#define sk_ADMISSIONS_num(sk) OPENSSL_sk_num(ossl_check_const_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_value(sk, idx) ((ADMISSIONS *)OPENSSL_sk_value(ossl_check_const_ADMISSIONS_sk_type(sk), (idx))) +#define sk_ADMISSIONS_new(cmp) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new(ossl_check_ADMISSIONS_compfunc_type(cmp))) +#define sk_ADMISSIONS_new_null() ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new_null()) +#define sk_ADMISSIONS_new_reserve(cmp, n) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new_reserve(ossl_check_ADMISSIONS_compfunc_type(cmp), (n))) +#define sk_ADMISSIONS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ADMISSIONS_sk_type(sk), (n)) +#define sk_ADMISSIONS_free(sk) OPENSSL_sk_free(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_zero(sk) OPENSSL_sk_zero(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_delete(sk, i) ((ADMISSIONS *)OPENSSL_sk_delete(ossl_check_ADMISSIONS_sk_type(sk), (i))) +#define sk_ADMISSIONS_delete_ptr(sk, ptr) ((ADMISSIONS *)OPENSSL_sk_delete_ptr(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr))) +#define sk_ADMISSIONS_push(sk, ptr) OPENSSL_sk_push(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_pop(sk) ((ADMISSIONS *)OPENSSL_sk_pop(ossl_check_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_shift(sk) ((ADMISSIONS *)OPENSSL_sk_shift(ossl_check_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ADMISSIONS_sk_type(sk),ossl_check_ADMISSIONS_freefunc_type(freefunc)) +#define sk_ADMISSIONS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr), (idx)) +#define sk_ADMISSIONS_set(sk, idx, ptr) ((ADMISSIONS *)OPENSSL_sk_set(ossl_check_ADMISSIONS_sk_type(sk), (idx), ossl_check_ADMISSIONS_type(ptr))) +#define sk_ADMISSIONS_find(sk, ptr) OPENSSL_sk_find(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr), pnum) +#define sk_ADMISSIONS_sort(sk) OPENSSL_sk_sort(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_dup(sk) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_dup(ossl_check_const_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_deep_copy(ossl_check_const_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_copyfunc_type(copyfunc), ossl_check_ADMISSIONS_freefunc_type(freefunc))) +#define sk_ADMISSIONS_set_cmp_func(sk, cmp) ((sk_ADMISSIONS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_compfunc_type(cmp))) + +typedef STACK_OF(PROFESSION_INFO) PROFESSION_INFOS; + +const ASN1_OBJECT *NAMING_AUTHORITY_get0_authorityId( + const NAMING_AUTHORITY *n); +const ASN1_IA5STRING *NAMING_AUTHORITY_get0_authorityURL( + const NAMING_AUTHORITY *n); +const ASN1_STRING *NAMING_AUTHORITY_get0_authorityText( + const NAMING_AUTHORITY *n); +void NAMING_AUTHORITY_set0_authorityId(NAMING_AUTHORITY *n, + ASN1_OBJECT* namingAuthorityId); +void NAMING_AUTHORITY_set0_authorityURL(NAMING_AUTHORITY *n, + ASN1_IA5STRING* namingAuthorityUrl); +void NAMING_AUTHORITY_set0_authorityText(NAMING_AUTHORITY *n, + ASN1_STRING* namingAuthorityText); + +const GENERAL_NAME *ADMISSION_SYNTAX_get0_admissionAuthority( + const ADMISSION_SYNTAX *as); +void ADMISSION_SYNTAX_set0_admissionAuthority( + ADMISSION_SYNTAX *as, GENERAL_NAME *aa); +const STACK_OF(ADMISSIONS) *ADMISSION_SYNTAX_get0_contentsOfAdmissions( + const ADMISSION_SYNTAX *as); +void ADMISSION_SYNTAX_set0_contentsOfAdmissions( + ADMISSION_SYNTAX *as, STACK_OF(ADMISSIONS) *a); +const GENERAL_NAME *ADMISSIONS_get0_admissionAuthority(const ADMISSIONS *a); +void ADMISSIONS_set0_admissionAuthority(ADMISSIONS *a, GENERAL_NAME *aa); +const NAMING_AUTHORITY *ADMISSIONS_get0_namingAuthority(const ADMISSIONS *a); +void ADMISSIONS_set0_namingAuthority(ADMISSIONS *a, NAMING_AUTHORITY *na); +const PROFESSION_INFOS *ADMISSIONS_get0_professionInfos(const ADMISSIONS *a); +void ADMISSIONS_set0_professionInfos(ADMISSIONS *a, PROFESSION_INFOS *pi); +const ASN1_OCTET_STRING *PROFESSION_INFO_get0_addProfessionInfo( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_addProfessionInfo( + PROFESSION_INFO *pi, ASN1_OCTET_STRING *aos); +const NAMING_AUTHORITY *PROFESSION_INFO_get0_namingAuthority( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_namingAuthority( + PROFESSION_INFO *pi, NAMING_AUTHORITY *na); +const STACK_OF(ASN1_STRING) *PROFESSION_INFO_get0_professionItems( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_professionItems( + PROFESSION_INFO *pi, STACK_OF(ASN1_STRING) *as); +const STACK_OF(ASN1_OBJECT) *PROFESSION_INFO_get0_professionOIDs( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_professionOIDs( + PROFESSION_INFO *pi, STACK_OF(ASN1_OBJECT) *po); +const ASN1_PRINTABLESTRING *PROFESSION_INFO_get0_registrationNumber( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_registrationNumber( + PROFESSION_INFO *pi, ASN1_PRINTABLESTRING *rn); + +# ifdef __cplusplus +} +# endif +#endif diff --git a/OtherInc/openssl/include/openssl/x509v3err.h b/OtherInc/openssl/include/openssl/x509v3err.h new file mode 100644 index 0000000..1ae3a56 --- /dev/null +++ b/OtherInc/openssl/include/openssl/x509v3err.h @@ -0,0 +1,93 @@ +/* + * Generated by util/mkerr.pl DO NOT EDIT + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_X509V3ERR_H +# define OPENSSL_X509V3ERR_H +# pragma once + +# include +# include +# include + + + +/* + * X509V3 reason codes. + */ +# define X509V3_R_BAD_IP_ADDRESS 118 +# define X509V3_R_BAD_OBJECT 119 +# define X509V3_R_BN_DEC2BN_ERROR 100 +# define X509V3_R_BN_TO_ASN1_INTEGER_ERROR 101 +# define X509V3_R_DIRNAME_ERROR 149 +# define X509V3_R_DISTPOINT_ALREADY_SET 160 +# define X509V3_R_DUPLICATE_ZONE_ID 133 +# define X509V3_R_EMPTY_KEY_USAGE 169 +# define X509V3_R_ERROR_CONVERTING_ZONE 131 +# define X509V3_R_ERROR_CREATING_EXTENSION 144 +# define X509V3_R_ERROR_IN_EXTENSION 128 +# define X509V3_R_EXPECTED_A_SECTION_NAME 137 +# define X509V3_R_EXTENSION_EXISTS 145 +# define X509V3_R_EXTENSION_NAME_ERROR 115 +# define X509V3_R_EXTENSION_NOT_FOUND 102 +# define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED 103 +# define X509V3_R_EXTENSION_VALUE_ERROR 116 +# define X509V3_R_ILLEGAL_EMPTY_EXTENSION 151 +# define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG 152 +# define X509V3_R_INVALID_ASNUMBER 162 +# define X509V3_R_INVALID_ASRANGE 163 +# define X509V3_R_INVALID_BOOLEAN_STRING 104 +# define X509V3_R_INVALID_CERTIFICATE 158 +# define X509V3_R_INVALID_EMPTY_NAME 108 +# define X509V3_R_INVALID_EXTENSION_STRING 105 +# define X509V3_R_INVALID_INHERITANCE 165 +# define X509V3_R_INVALID_IPADDRESS 166 +# define X509V3_R_INVALID_MULTIPLE_RDNS 161 +# define X509V3_R_INVALID_NAME 106 +# define X509V3_R_INVALID_NULL_ARGUMENT 107 +# define X509V3_R_INVALID_NULL_VALUE 109 +# define X509V3_R_INVALID_NUMBER 140 +# define X509V3_R_INVALID_NUMBERS 141 +# define X509V3_R_INVALID_OBJECT_IDENTIFIER 110 +# define X509V3_R_INVALID_OPTION 138 +# define X509V3_R_INVALID_POLICY_IDENTIFIER 134 +# define X509V3_R_INVALID_PROXY_POLICY_SETTING 153 +# define X509V3_R_INVALID_PURPOSE 146 +# define X509V3_R_INVALID_SAFI 164 +# define X509V3_R_INVALID_SECTION 135 +# define X509V3_R_INVALID_SYNTAX 143 +# define X509V3_R_ISSUER_DECODE_ERROR 126 +# define X509V3_R_MISSING_VALUE 124 +# define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS 142 +# define X509V3_R_NEGATIVE_PATHLEN 168 +# define X509V3_R_NO_CONFIG_DATABASE 136 +# define X509V3_R_NO_ISSUER_CERTIFICATE 121 +# define X509V3_R_NO_ISSUER_DETAILS 127 +# define X509V3_R_NO_POLICY_IDENTIFIER 139 +# define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED 154 +# define X509V3_R_NO_PUBLIC_KEY 114 +# define X509V3_R_NO_SUBJECT_DETAILS 125 +# define X509V3_R_OPERATION_NOT_DEFINED 148 +# define X509V3_R_OTHERNAME_ERROR 147 +# define X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED 155 +# define X509V3_R_POLICY_PATH_LENGTH 156 +# define X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED 157 +# define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159 +# define X509V3_R_SECTION_NOT_FOUND 150 +# define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS 122 +# define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID 123 +# define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT 111 +# define X509V3_R_UNKNOWN_EXTENSION 129 +# define X509V3_R_UNKNOWN_EXTENSION_NAME 130 +# define X509V3_R_UNKNOWN_OPTION 120 +# define X509V3_R_UNSUPPORTED_OPTION 117 +# define X509V3_R_UNSUPPORTED_TYPE 167 +# define X509V3_R_USER_TOO_LONG 132 + +#endif diff --git a/OtherInc/openssl/lib/engines-3/capi.dll b/OtherInc/openssl/lib/engines-3/capi.dll new file mode 100644 index 0000000000000000000000000000000000000000..d189dfe3713fa1d36f8b678025bf58815a76af17 GIT binary patch literal 53248 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୊?EZ{EF3 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 literal 0 HcmV?d00001 diff --git a/OtherInc/openssl/lib/engines-3/loader_attic.dll b/OtherInc/openssl/lib/engines-3/loader_attic.dll new file mode 100644 index 0000000000000000000000000000000000000000..becf458ca03e644a39be4f577a624b392d8c2fcd GIT binary patch literal 61952 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 literal 0 HcmV?d00001 diff --git a/OtherInc/openssl/lib/libcrypto.lib b/OtherInc/openssl/lib/libcrypto.lib new file mode 100644 index 0000000000000000000000000000000000000000..f5a9fdd63e03d1726c5ec3552cf67122de686fcc GIT binary patch literal 1256052 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�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 QLsL4EMz)&P6sldG85&%qglnDbX8{xYNeW z&aHdoH_&Qw6G7)_H7qwRQlEWZ2Qr8w-ArqDa4)g}2|rL2OIACdScg5W{}FGn0O$HnZau zT@-wZ_zum6_dHHsApVPK;NAH6_w zu)Aki=lw~ZHPIpkbmS*?_BAHBbXfb|ZUCsXjgYl%apc;)H}w)Ll5?R(hH;nf7Nq~Cna_3NIZrg6>LUhQ@?>{R+AT8CicTGJp5V1GSa}62 zG4P40hxK%RbNqXGy*Q?cwA#fmuob z;UNhG$*>=Wp`;;Xt;=P39poXs`<<8rI2;-snXSEwbTQ>W+@d2{WZKiyZqfA zP4+S`Ghi|TE2uBHaiq!z2JMCY4B-o;3WkZauKcHPZQV>2Z4G(9(9cGWyf;pPZokY& z+>Qx_wsqpe9-P9b_wMoq zte5@-DAf1VM@Ykb2%hrb##VJPu=hdQkL!;x6dESYa7uY*+=ds;aMJYvw(A$MI4mXU zDK6UhZJ24tne#APZ^lbqcJN)pldE^5Trld>e{RFQ_rINA`wbed5Hd@={CaxT9#>PZ zT6aSwCwmA@EQF6Z2{iG8rCbJn0$x%G1+L6Yrk#o6E<)G z__Z&W3letRE8D0SrXsLK4j<&DSfG4mmiGefMfWeclp7-Kch|qT*CLrKcE>CW52>N- z&_tK`3D&iWyHdhkDxjQh*Z2RF<=&-+;I!0xjmFZb^#rFi4`ysJ(Ee9za9b%d;CvqF z%*QDNd}tS#ubSw5{SB|?>RP!?xFf=bzTnrh<5M_kuB@>L7rLS>ROL!U&D9Jxpf;uJ z^D^>4!AM|_t_A2J{+f^a8h{=152iuh8F4vjFX|4wD=3=ltKVsLugt#(lZILmF8te_ zz+CmL^`wChSSDLPeS;grOPTV6`qVtGWgzRha}&zElEOmP^Ia z9Kie{94sT{VW7aT@=0u;J2I7dQY3h$A>BW?9Vgsfuuw_m7*0LG&>kMO!Z>SzM|$EN ziZ9Q88j&rnqV{>{7h$5-&_f}3)66uXy#GSFAul~en%l7q?)EHg~X zF!K5E=I!~(@y+?=MLr)!T0ahvO5&`q@>;T|a7CF=U)O-AIci5yK)z=#tm2G3RF~uR z{z^PnUPM9B)Hk?mj2)q z1Y95f9v&~w6O*qPYF18IrI=u^*wi-F42l(`hLn6z{}@gMk451)wTBmLhI}Y%-phQ= zI9H>ZLDK4ZbAT^3P{`Q#@2l%e+%kuam7Yi1s?vlTt@N{5Y!~L$%ql}n8R&Pr&8My1 zTVDH6+6#W-s&c%f&4OJK^CfQweXVjnV-qrKZ_6iG1K#caUT^VZy>7UWau>O!#~p0P zcOL+GiRJL~3pgGZKZ1ds%v=Xt6JPX|9?9`VR{r{_KelWgEroN@JIo8l`F)`g6mE-_ z(7y}-)9o+teQ!TSYsOH)!CTL_ALY#xQ~Gg~XXQG|3sy6L zGYxP|N~z+Y1U5>;*PGpK)OxU#T3?J3lLO||9(4RSxD3jKvgW`glGca) zc$oMyxy)ntnFfjjcjo>W8AT^FqLew&aocRoTiOeL;#e$aCyx|oIANst0<+Fr9R1Bi z*CujHkM&3~=FPC27dHZ$>+EXci@wrGkuz5LGb6>4_D$jM9B0Ki$1gR6%5l*e(nzqV z;ly#d%A-Fn4LkZ1TO9p)zXWxcqS^M z?6l#Q(l)zo={F3zp<>{)&Fs`b>Xph054C)@pN^E846y2;7APLE!g5j`RTaHM08YQsG&(;I&nL4k%ex(dd0zC4q%F)H=_8usM*wiwjRsMPlSK3^u3HG&5^ z{Sx{NVF3O3y$hd^VMrATmG*J1U-};76|#my3ZRcQ=hYS0Ye-`s@OTSGR&y87+%T{5 zv|IgmIr(-T3V|7w8qa^6S2LqhA6}^RhL4o<)s9+ZjMVcLkLpp)A6}~ZPAF4`jd?Fs zJ#MM#Cl(fgK`2+K>AFItIayl_`Eqi0H~A9Pom!PH-Q=!GySdMvMhArOi_ z%jjPWh1_cywRA}{WmooF!N)fQ!l>tp+vr<|r+etz?=+#dW>c#$hOK)c1_GD6m2~~c zXE12$J_7}@x9GMqKn#}smm$#=;r@lzK@cbuQZTK%yl{h;%3*b5io+Hk!NCo)riFZP zhfrpp!Jy$zpwuuJG=shY^O$-CHV&)1=m}Uetni}slV+yMbBia%xUG9QmH_HzD}2*SeQ(x6C!1U>;vt?__}t zA0~`-f5brG;&&eo&rjki#VYC|Dfr-StJE?WG-dO{rlpXa;=|W+C-OY#dfo(HF61SW!h^ zM4FkZ%6$$T4$}b&YEUjTWYP%SJ!lD5|THet+Q{FCRwwk zNyta(=0u!`h=_=Yh=_=Yh=_=Yh=_=Yh=_=Yh;z<4=bUrSIcKeN`oG`joO|w@?YDpP zKIi<;x!)hpeeQFg;SgNVaSL>sSc1|Pv7(`%DE8T7M{Y}=J90&MD40EsZbr+($BDU% z6O*%Zv)LXo>PE0~FUmFvW*_vKC4b0BTUf|?jp7f(k*tDv^$m^AmnpG5QsPz&?(X5&zy%u6{^S zqRm6IoquT?A@h(k3*M&ZF_++XA-SVKD)_)GUweTg_d|(gU-?Eu)sv?c{4C>}-{g~X zb{1!wzAqV@L4lO}$TknMD3Be5OwM-+mZ}wJCOYE+6O(bIw>*du&^ExuVn`u|pl)}jv#Cml;^PR<6;Sdj(3YEyqEtBkBCEkhD zvapHt{B$ES$E^SE1aSS^081; zsWk_NLhS8)NL%-Fwp=akE=*u2FrO_Ev!E4L_!{8MZ2A^-il+%HD22`P>P*=tD2M9D z`$p`-0{vVj7bXrHog&Gr}(teVz6$8T-?w<86w29hP!X=J*K8f z$|;iumv}D3bj<=4;^DrNjjqu_vo}3G+z>)`Nnb)y6j8*!Tp*?VT6JmdoyM?7@mkTb z+4+gs)Pyix_LH}bxGY?a+0QeC>LsP-`qa%G&vWb6GE<}`XUnv3i z>C@5$B^Q&7bwfi@Z4`DIYAc6KnbhQL43OvX+7iubZWIZ|7SF4)hYY#gNz7NS(>di_ zX0H~+dtO3lF3q6QH;#|6_79`ewB=1>s;Z40RzJ?O38fI4OIdH+b<_%i>k< z@$eWkm637MNQ%TA?HXR1y@WB8oO@c*Qn^^)RaI12iqdFT&_s4$&+x6o=0pyBjy=s^ zi)yMUCk0N4lGv0If>SEO5_V({_SHvwx`zAgnlK&-K7S1FPR8dwYtkZN_|~4$1GK`} z;_*_(ieFWhQhwbS9_b%%VEHzyiqZ2y$w?mA;%+7u0@2kt|JFn7W1Ng+x2T6|NhF~f zLiEN%8EIO7g*K+d$nBxfTBYYoY7;AjNDnNcD)LPyofWYYGESpw?3BuL3eF{urW6Gi zh1x43YX^^@;}&?=RgZ~PL@s%YlgsFp+E1DHG;ROIn5kP5Q8o0W45BmwjH4 z<^3MfWWKY$O(`7{QpV$+^nTC=>{SY1>#dRr@2#x7JhDkO4=vgiL*xu@O)7|%IYeEs zD~1|P^R$ZoR|!}!SlGNHE*Ph7T-r9P_-c=BvS01BlY)g|ds40U4t&vrN3qt6b7dY* z=&_Y-(0lagQ0vvXl7+_a2<%X9*hXx4*{zuuM4jyT-7Q1x_1$Ia)l+(;CVA{VemQik zIX$WfpLhM44OcTerPBC#i7_Eci!tLfTgR9Eyo{REr?^2A8yX!1qFcH~zTf#- zyW?-pOCe`nzB45KeG;(Fo{71?gUzzQ_V1KXv^A&F1UB5I?X~4B^vRT-w++P3{0p~c%{zVC5mgARj~rYChC%f?7*FW zC*>?T@lMRtZxfm5w53M)&bw=35R}43bkxKk&cC?~^RyS_71<64uyEQG272+FY=w;D zR`l@PYxiX+CCubQAKPLK zBvJ7thp%FsBvJS(jCD3D*?5S!d?BBXfRqjqnNVWJn7qz0?WB>IwNIlj?YjG#6# zNr@+ZQ+TUoK|G#FT_-6s#^o^*1Fx1GLCNjYy;R9OF*57erVF-F&n@-w+T@WOvx7_@ zx4AYCgKpL>X%%@Gs%1e;vD?X}1LRU&OeC-jBGndjab$ZBwBeZOr0xue;5_~*;>@YilJjeMu8{ zjWr=?s>um_lX~)wLPf9tokDkF z!kbx|#fz77cbN@vg&=ZD$$oV{ev+ptrKrT~^h%^z1kBMKv38jpz=){WSSbky*LipB z&1uhTMCR0vIWy48;aw_;f73#hXgIOp=@Bth857^`*_du3;pM{ba@ny{QNA{$Sl3?R zx$c9+B4t6yIC zz1W^vqhWxw;>6PiOw*mYaa8cI|0nK8R8>SsYrZH0b{;`uKyxIB^KO@ELyfte4PYaOgqQk%sC^u=;b!)3U$C>unj zYLn-mjo9J=Z$@(vE4}Gx?C8zP!qwz7?k4h^oW&%UOeF$=Ov5%?$MbG7O1)QH<2^2w z7v!F~Ixh==4S%_s+o>hwje<^E#DdU5iWwef9oSSpJ9C$k7^<*gG)~@fY%i;eUShO2 zo88%R5rGI32hA#5LU6>S$=Ra(xIrvIBQ{&J8^^KEL8B@Z!GGj7Mvr%~v@rv(bylck zo!D~ATKCQPSZ$DUR%7-Ok4GR{MaIpNN$4b%QHsyhiDr43%+NIAevAHx(HEm)0W><=`$>h+PvX#XvPVp&vb2z$J5r2p7yolkVmqPPDRc~X#~ zU?P4ud!XT6gn3yMi1Crjokwgu9yvYC4=U0$TqYwByrdWeNfrgBh+Z2#Lxc6c!9qNQ zHn&pZ6Kz5TgLHysoO6Un%H7b)Ie zkj0tGiAVRYiqa@7pJ{WekjHFle!%vz{v{amVvHRsLCNja#P~2pio8@$7FFhDAZY+~nIZL>rIr`Tj^{>_tN9_+E;OtIxrYF=lktOD<_u7t z$}%f@af_w!qV-y^&-BsKuARUTXXCEmzL3B7WQS<8SY;MiGE(Ma`6A+uGa$3*2m3^j zwyWu^J5`m0W@Qy8@tQY^^Kh7w*zk4q1NKPJ^I`SeT`o=IqpDb=Ws~Pjm3&4%e^V`H znbapsQ;#QB$Vco|6&Fs2GEg(hc;pOW&F0H4QPu`>$21v-4hNrtaB?M41&X)#)hDa_ zpq=aSQBsKos?xADEx=NG0#@lttW@;63p<{P3HCmwriG}4?jvBvEUC$CnKQV#G%6KCMC2IJO*@(nyrGKho~-Gph|j=KL<=^FuhS zVdXNf+eGYm7@#}sNYPkWA>W}cD5E%)yr?Pg$8^bpf9N`w6N&4Ac+8Ds-vfo7&WN;8 zlFE};S;k7l6-u&~PmK@Qm4)=I7}wdX#!0*nXzgfaLlND$kufE)A#aG-7HzrV36Trc zjzOVoqm|omnKJmjxHyM1{bFV0HbUub_}*a`6)$rPe4VI1ivR2Utys&HI&Wc47R1qR zO5HOVOH_{URttH>2r|PEFPvrbZe6cg@^&fhLMxSW(PmY(3(ZW$uq3p)JdwUyplO`U zKRKcaKNub-xz-RbMZdu1&YLpkkPSVIlX>&Dam+br-_4i1U#QgiTSQ__1$Wa|o)D?i zER@{?_!1X$8Yw0Fq3#pS0yg%RLhR9HcPKVaEO@rxW4(%xp z@za@@2uL)Nv2B;>k_IfK&eQY9x&{iN3YFl?&?7s=Ad0eBaERyE<8|OSeji)`*Ad% z8CUg)!%jjZu_qvPM4HEpyN1W1{@&;6&{0)??ld*`jfKJ0i<9X%x93ckL{eQuI&FOy zGFo9YmGo{qP>fp7t^7-D)oWI!ehMa{WqoE`)nitsO+04YH9R&ee>cj+%BPpVB|Z1@ zFVYduQ>Wc|Ft+3FJB7y~wu!S&a}8G63#(6skbKQ5Xn7rLMsl(6eOexUreItdNzY92 z@`5ZXR6b&!kod#g!u*2E>=kN1)7opRVW*x_N%~D@BtmE}r!SF3Ix4ZhXJ&DWf~p^9 zKT>M1ZKsRd+KUrQu@hAkOk~bqVu=b)oPu!e3pfhZ%LB8qWR^5=fYOBpo?CFtb=Km} z>FGr)HXpm5zBGG&8n-|=R*wZ#CRrcm_)V<$q|X^isl8rYn2V>d5rO-Om!dG|C5u^^ zSO{csBHO(Ot8wh*=~Wzfs`zCJ%f-XwX_4w6a{B3XfF%+5pDT^tk?vdAGPkCQGFwLB zTy@ts>N+k}N)^46QmRI}j2JhT7gm>WRwrFBh%R%2Q?1}GJ&v$UWG~$7X<2bo@kmc+ zf?IrF9YCj+E(WK~9J?y>h~17)tT+|khxb)LzMVWAOhI{K?BA>_#<&O<7R zNF-8fjOSC&yJ;^PI=XYWpWZhcKJrr(R8A(Ng*VcFVr|j7&&RW7eav~Y1tQ9GI12lOq^d? zNJnJm@+g^o;l=pOPYC0ssBm@;YGsi@OQK1>mT0P@FY0!SFz?}^pOR-m75QTRV>36-?(7w&|9C)CY8gTs{X)K%uTO-Q zK{S-js=kOhOqiP46?6>{aP?V$3qFVzhIGvp|%VYxM&$h6so`CJg7`; zM5Bo90YBtAmSab$wO++H?oHDn%Uy;>#fG$DeQ?g}Xc2$V-f}b>rggGi<)6 zyYMvK5AK1QN5T?{w$C97<}S-cRQF=HH>{D2z-i*4vw1SC2XLeZbH7)zbUJAhdlnkTQ>QiD)9Zt>0*eJ;Q0jr@2QmEvK^Q68BnFIoha zWo3~;hr9gl+8SsSZ=c;4u^46AU=?qVI6aC3FI&k#e8TcZ;N*jaAqA;t;kDMVI3x0d zX)Iez7Sl**ez`Lwxhj?%uuNdUKCDCaXSwAbyJYm$m4rjlL#5b&H8ZJvWV!514 z$Sg%sjP}$U1O3=;Nbi1yFkae@E0l|r#_LP?I3`vKViiynMkE7t*G6M+im@m#J#TL9 z;|idvio&^t+sT4xCXNDAwb|M- zcgYakQ?RNLSmte*<&}xFE~Y4g$QJ{05J!K~Cu2qPGO-b`dgU*@9A%5AvXc|b z)BEx8$Td_|WrSI!@&co?ow8mNGF9Z~HNkR&IPzjK(I{Ff(RlV=EX8Q`5p=GK{19A9 zz2ydRPNY+Qh$lm_g_TZG!CaaH@?4^OF)<;7mioiuDNLT7I zu@PupN0Jdns@3LPTihPeGR$gzX%;UqgUmBT+zi2qygm!rFoMu7b!lZF^YL+FCcGej&6A?A>|2*EHHK?ol=?~QlP z;mZ9D;Y33)gUmBT*oF|pHWykB3Ay(aBE$jTUd-Y2$|Rk?1w|l zN%67ZtvL}3o_+4;1Ljn#A#8HUyp-~5-K9BK-n^|sxMmI-zsHu#r9}5@oe<9}80C24 zoy2)_J7w|=qH@X1!cAlnt`laNM8wpul61%PiqR2#<#1x|e4{I-g-D{dJJUjvv^3_y zyxYY&T%MmZZ^*JvRZ~TuiLW^q+GvHh{4jQ^p-@%iuV(3jBx$vvS9!YP3vbcN)V+|j z%bEu#G@SA7u2FlwP)B1G@uQK+REf{-2BH^#PY|y$>)vZ#G0`1!ZSrmA>dlOjGTF@1 zp)H2*q=`l6z>#Eymg5d=!UIS=${S=EAvA>DU1Ud%VY~IJJLeZ(G~c*=&^;TbA?SK* ziT(`BP4=F2mY0t|IWegeexsYEM3`8uZY63>ZW!yJRHc{qG|#qQM2?tJ4o|jkXK|Do z0a$pZ7%GyiPb15N<2N6#Z%fVQg}r zn#+U4WX8mKJb{=vAE)-Zj!I3Wvxpd1UctCHlle~MD-J_3YZvBCd9tVSxiA^WJg-^6 zAZ6ZGkojg~zzNjWd@UR=BFyS3rCMP%fxQ4&!@PYqJ$r1%U^;thhniRJ$N*AmCi-~0 z&t{_OV$WZgn9XWafkeZkKKQu=Yq6+)VaaU7P2+{Gqf(oXG!2ts z*%>nqt;LvJF-vq&t=N^b!dnJ{VymP!W>yO;yos+43PKL1`SzaKU_$QyrPNMkdgz`H4T^1F(BkCve5PaL4aCk*23K02e&Flyf7`1W6K2_41+f> zCrmf|k%xS`j!4BL2TkK;yv>_9gtl&elQzuKMdaR(X?=yd$W?^Ta)$Z$Z8_yCvC{I* z@Oi!&Nh#lij`-H|&G4hfv)z$2{+!vK`YF-=a<#P^#rj3cx0(n4wE_Ph21s@%aI=39JPr#A!N36N~&jtoVBtP ziiv4c4`lYL`QS6yA|p$I-S$vyA}0IX&InIwVsDO3Q~M0z#Pg&l^EkXoDMWR!^DChE zIK?71z|ea|oA^u}?D#a?a;+%nwSI~BNv7XmnZnC0QwPtszgf65z44(an5fWq>HU_{ zXR-c@48%OXL=i$4B_+**iNOgUT9Xdg7Cq4 z9V|xcSWX;u$NKP!lW7E7R3l1{wTTK*s2z>MNWTV8gls+W?M%%WnvOo>EbE1aS3nx) zP!Fk$)Vf$53wjYws(qwhQd3HRZ8#`Uxp~V~luz&0VjQCh)iNt~Lzn1AOnJ(!T_h(R zwGdS*vSWRU64OH{GmV0thG8rbI>}jPWK{}3zXghG0(;)VilF#MvOYdAdWjkM)!npKTgACyk!tK zp=}V6$wGM#tgCq##*V&}U()7s_P$9`oh$MMJ`vAI$ZeN#@B{6_gr!%*&VHr7Yv7il z5q0TJSHsRsEwqkC$m^%-jo$9?m1~@Yk~WyADlcS}#kugc#9f#^6060UKd$orW^rdn zo}W4=LFhSV?_uop9m9#d-tK!71TP!IbD5hu$w8w;V1DB8sH!=(NQbg`hLB5X2qWt}7^MgZxEH6XqQt69m4#i6!y5Nqh@a23BIhi+z@{w6w64 z2b`-s-z=r+bf$^y#Z{E|!h-2`NX(4;*?Fd87JR$9s`5g+mxs3QT<#_4NzIo5Ro6lX z3oK=Txq9BTm4%Dx`}3;G2vHDt;uGF8izO)JhDqL)jF~ zP3t9>t302TPmG_TGfiZ((h+>7V-{KVx&VwpP9?ve;fZxi3qq|PzM_z~B$Tw7gr4JbXAYY- zR^m}Ex{gaPPF!}cS~Bn6T~rDi3^?}nOw}eRxs5BLMzaVCinsSt`YxTOfy`xzd$c>Z zfN_%4H$}%SOrPoc9CUK&Y42I*4RLB}oZ^rTRpL68bAt0mOz*| zo8cxFG4~M*NVAPfZc{8h6JAtun@~bpFhR#Hv{KQmH6HgAN=UN~I&Kk4NV5n!Sdg2a zaOM8ya{y4I&~R}632E%^5^^L4NBqV$B`U#hTb`mDk5SZ=-X@kKBS)!cg$|mLg3xoq z0LVB&$T%26NCHjdd>3uxWBA_Y;84B4hi~)E#6&=5@yXZ-35S+PB3bEJ{h0mKNIc7m z2<%VH5V+0>UU0mBWMFt`Xdonp2;$F1_v}h|8O!C2s!Bq325cryf`0OThLoo3QqVze z?j*-=YTy9$M$gEAy=%biI37JvR4a=4H4MF;Sel(B=5C>2$kmEnDa2ryhltQZVG(~; z%CE66ZFVBIHC-p9g;b;j3O@FD$4R8B62ekyO#o_2owTtWZyPm-R!tOfoyb*IO+#gR zU2$0lWGfQ$XlCI07tJpan zXNM)Nmz##hZi;icmtY0ZXR%u#6giNqy`8;1?3@+!C?zcM0)?ibGInTzq97t#G^|@P z(V)uACeQt3Vs+jEry(s*HSxQ_FU)ihL|>n{t{nXI6`hG?O2yq&DfZi&9Fi z{g*DyN6Zx0OiQe^{>wy#_h0^Ql`gsjAGY*-78qH>E>_d8I!S4|Zk$iYw@4|yChx0f zVj{o|3{AO7mt@W1ND&@EHBJWAYw1Iw$kE7Nha zazUBIVk9*8;C6J347w4GRC+_Cs>Gj7AG8oca(O%1ZJ&vgK#Z(5P$P?stS2-S(g&JL z+q>bhuz9@CI3`rH5}r^oRJ*4c78+aj40$x&n;>BYnD_` zEwjhNxp78e_WmxEzEfS+GYzTfN}xo`tV%T!`IGi=CJVe}kd?ft@HFRfX%53yc}|i1 zEhyvMvK2;7IL=ojDu^S`?SRNa4PwiSA1}@BzJ-Rf!>*Rllar`KJIN_}kX^p!A@%!7 zEAP96MueBmHWHo8Ig-%y<7vQ96UZqdJfqBRRk(YnR_wxUNHNqv5VoR!OrgbIGKplr zCN#pcsr_r@2B#?YO>)E7s<~klA+c(1P=XCpzk?yt#FANHNmgh%14Bc%jt!g1O!hpd zk?Dj5K8kYt^itmACp*Rv*1peECa}p~aD<2D)%?Cc*+#8yB}bpkFpWZ9MYpa|pH40% z1^b&XvpRq)$*rk@jpiZb3=K_LGBCvutfX)S{%L z7IeRKE~gSZlx6*!PYF?GHnsyJyAGQWR8`Y3jdRko(&!kKL9?c17 z5HzDV^DCO#+Mb0$GvBc(uI)8aRez=G67$g!R9iDu#mYnc*6SK1RlR&+b!7_YDYE&7 z%=tvhe8|q2nr3~nO_UvQn$_M!$U-x!rnNT_RNLoNdyNlHZ03tq$3kr&9vQuvUr`y? z_ACsV`Hod`ZLg84`fFNyO{xpE*QnO4y_}?mpDJdPlq3@MQK-0Coi(vA^|r~VlTm0m zDfB#wNyjYc8zYLsitN++zQOv)X*pph!IVj5A97l+`bhJ7RV^RMlu0rk^5%e8rl&GQ zm~{r3PKIDwb~b$=R!Of}DwA4a8yM1BO!A3UoaGaltesLNy`u`U9-Q#4O5r!n1yiNT z%$~c`ruGF!3fF9$uwNC)<4IHsUt5;6p+&REC|Ijinpunb%yepH&KW6e`Ka4QHm&g6 z%dn1bKC_Z%2-hah;lvQx#DknL#WKDNG_K>@OZSbJdJV=?Y)Lr zt+ZJk6@t4k#~+a;vehKE)-UlMN$rc$IB7lOBY*ffI@^-f;EEJtetT`1bVW4@&p z`BaLANS{Vid6P(ned@6skl+U1V&*RqXj&Gxyo$MEN_EV0UGC)pxesZgUr?vs4cpH zurFH+m8lDM*+Y9DDzQy(IoNZK-A*OUvFvAe#m?apBZls8NYs*Hx@2LGQP0xH?o>>q z<IxwPHK6kf@}Q=iq@uD%_gcSpAL_j5!W+IwYU*C-$FBPsTl^7s8=nuMo2Ar8;qK~ z)AeO$V;N>+EJRjk*b85_AsE+^qT8=w3pKMVSCK|gF@CH8YRxy%6bx?do+ajkZpa^h z6W|HVR@+Sx%%Uz@D8oRUI~gmj^XL6Ou8`$f^$g+|Qhw`b{L?$fc&+)fM62K)=AlKVfLY_Dt1A|_`I4a zR-C|WV_j3sqApp;T|KtY(ypFxneFP~is%mqd7Ix^0Y!OaA}%jHsI1iRH!+xwK{@hreAOkyO6BFA+|G`{)r*s2ZIk)oEa|0KBBnpLrKMTK zp_4U)m<7f#QcCvu0Grv9-UM$5VdRL?F^pI;=0cWAlsOOeA$%Ind{!Z@P>?Jf&9%ZRPiZuv z>5W2@!2G3#6b{jgker5oAF2sKRjn>9neVRRyS_Z%MdT>0nIE@Z;JLU8OwAkKm7Ne} z%;Vz;1zVdSvBg&8CLBbT>cxH^467p3{ON;qLus0yd}o;O;0c=TDjwruQAWI#B}}tSs6vwR+7m)C;x6p}ylxfaT>?Gg9W(X0Xy8La@LY zN%3LcE^6K$Y_2+rW`AKCAG&MWp!_FiEvM+gCX+8U@^rYxmq07}ai`suo1~9SpcVb3 zv1v_Tl&bmT$ICWjXu8lB$+y5n?l79-$DWMXBq?5Bvc!|<#dN0JS}aW;PQNSFbj*C{ zZV8^e>C5J@t=VvxakF$trVWT@+fDjbx;#x1(|``h$QpS4(0zq+)DBN4H!0|y1lNn?!jqGSm# znCD{tR<3bGuUSq_h%F8&AFZX+YnILCN!C=KCs~!BTbQGB(s96AAcCk-)@mv?Ktj@d z*rJ@B7N0wPF3g6n(WwD7}-Rm{55m}b1QlV26@Uax3;3vH6$k)c@AbCOJerEy-Q|NNxphBY3W8I*lsLViq04WC9x^o zU1xXJm~eFXJ*C>M2v-yTR#EC%sgm2^3G>`sasC23M&P#AtS|wCB~eSeCifcFFzHpx zaPyGWhGZNls(rX=Xks5Isy)3?XySv?q@UuwgiS)w3ai))sewkVu(BT2x@|O3t5}7J zuNs^&3VDb(ROm35SYy*@WF0f!LeOxWl`cc8{PC`E`)toKgIr_~cn`$m5D zcAx8Jh)%Q6XO7Xxs-+!1U};zGwLG_i}EJk!Y{7xy%(SRg(0Y(W}V{3|C9L)Z1lM)*2?gY8kq^ zCdPrH+J~;LiG84`_OzR8;)BwppU~gw=0Pj0!lC`9@@Y-NdQ2y zvhO##IA2zy9kn9Nd>3JC?8jGSw} zrGrDQEw?^0Hd;52%GumM=TW? zMtr_#F68(aWzIw2NdK|Zjp445u9K$vUMwqzv!iq3O-gQCg=FWs@#R=s2=t< zE-Z*Gz|ujW#rO!P#kk z3zA1Q(bRab9;QiYFrMydjh+ON4lCxm{TjW1u`l){MoGGeW(grQJszZsXy%8|bU$(0 z-^@!S={}nGMkdvz-pJ~*C3jgr*nI|5+R2Z)rK=gurUH{Ra-=UwJy#^|(zH2gTRYOg zS_pNrvlHE-8P^6YyI#UtKEm)q#^DVskRXjLxv$r7((X}v@>#w|kBXfq^Tivpubp?L zj_1UVw|Y73vZq;^q?R?gIyXobDZAWYx9m0WksiP6m<8N~#k^=+`+{xMISaXOliWSpyE1dP zvVa{QSPAjF2}y<)7}m4U;pIHJmQrA7)@}zj%L`#07|FW%n?lxHp(J~B=gJq7Y_D#* z`lw45^9w6oGb`fV1RGG&Fn0I!4EZ{_s!GD}c8|>eAeYR>8*VZ!!gavRs+OFgtrYUfIgCgX)Nd znLnvd#cfv52}YO~SjFn>l#+8!8oX<_KroKt#9KJO%!eCGbJDPp=gWag)U{0X3>MaBk4Y}XQ5dH$eE|AZtW-- z4}~~{F}GPZFiuQGeB#1e3%VA%m(|2r&NZWq_)4!IW$uzn^5q*z-mw{n(wj&`nBFYX z14()oQoc+TeA3maAd_zxF*)@+JwJs_aHg%VE>GOfCk5Upqi}n3hJLuO%v0n#_@IxL zZWzp;C72+YE?ShMNHmdco-N`l*IA>8^2A(PxO^8L8yEOoo2>E|#y<%`Va%48FU1FY1|EMyrF-`MqP#m;_NQU(^i#_vwrXOziZ_PHjLA5xt{ zE4|lkt(Y>};5l6Oy#_;%^1!^u{QZ zX5Wr0FbdY@gftdnZtf`5-mHF=!cDr&q7;@jDTHFg4S8G}X~>O4aN+UCY4K?m+VbpF ze$P+E*4_!SdwwdmJi9j~Z18Ag!b*LW)`v3eGJr z1QIogoqeCghU}!4B^R;Nx;1{uEC?cNX{J*sItiEh$B}w`{rep1DXY-ODP5K=&+rO;>`N`EzwA zpJUNDF^=<)Rd!$flUBAFOGrIMxRi%?FgfvNj`AQwnxn<@J^VdsSbd>HJ6~x8jrHhn zMD1g8=9McfcX@hl#*XGqp5+IR5x2;lw{a$_iHoZO3Fm@QEc_@}1RDqAo z&rc18?<9{*GJvrRGHj-c7K?ViXr8iU22>^Z+U(PW;Y^}7S>>}&OZVc)<5NVQH`@F7 z#!0yScaP4bO+GU-HgN_f=uz%sWDhZ+6f20j>_ihYdnDf|N|VW{Rq^>jsfs@B!iX{` zB?H@p{4)uf_H5#mD_tlgOYAI%7ksYOt+L4z3r@_QmRA=S@m(g|xWy$j5vroM;i|LO zBxD@hOOfIVG%I&Zceac+D{2jVP1Y7o_$omh{M zc5zKYD#RIps@jL=9|6dt)nLLjo^7WC<{b98B$7%FCb>Gh56aLRg zZY|*GgA;?VW!#sUN{BxTOCkGs?NTY3eg4|ANky~`YHFA2L>^$$QHxYwxkb`33szQ& z71LA8P-3}F&`@^FX00quE(n5Z%Zn%vIQrm3?~6WsWwun|xu&h;{Z5o}meP5mY&|(D za~m<*aGTh3a&cPWW=SA{C58ww>voA}uRGH}Sih;$Zjg5FiNO5azfb7A;LO0#pgXt8 zo5kxhW0^}Lv0CobXqjZ9bE?rbI=I(75x{BuRU;F)Fef@^9j|Y2>}20aSKWLlSrrOC z0_?k`Z-kJeL@-C|BmIN75MmG{-YtED2z$VO`@j*oBr*GkyLx*^`bI|`ja(|6#$b=2 zS&3&Z&+l#EsRiD5n7}jqS*%=7xu&ncmJ-3B_I$mfH$)>okr%v@CM1 zu}F}S>12exI*FrFlFM|daEQaeqyEk>%;UCudCoM%3JX{C%6X$Q+_GSfoJ$1LuH%}G z41`N$j%|vftEUG=+vx2Z?HTDGuJ;cORzE2S56g3QajfUU!t8m>RRUegbt_CGq(PinI0agAcYnPRnvN=@ zz77B6a86G$!KUp$dZ$9c_YJiFOkZ!k|72fC0K&~Qx@8tOZx`gks=w>zpo!5VGRY3T zQ{o1RU=EHA43NmXOTh_!Xml0?lGju3Q_5(FiG|HDI>&lf_W;d7A}g`8yofeIBP>Vz zoZJ)?VxVAl8V4dKR2A~MP56~@&c$vHhtv!re>1;>nfZV-xr zCXwV0_G1_9XxBg%&oQZymh~P{!^eUoV;(!0yRRpq;E(r@_M_x86CtNotT*x(L_bzP zJ~Yx_KkW{=bls*eZC$0=;@c+um<8B8jaFVr_^T@m!*NXVbRjFT?VxD=GXpYK8fACa zXn#+m2mN||qzgsuyLUyL!s+Q7srMi2@4-aIe!Zo?&s(VqVs~=1(X%j*?O`kZ_9?cB zK#vr1{>b$C>Dk4Vk?9w%PMa6Yf{B!KD?8H&RC_`6BLj`ze!O!zJe1Ol4;*n};`bi6 z=Xm(xBVAF(Wlo8ggwsEQDdNz`X<89`rI7MRhX=Y&*YOc;muN&e2^i0(B+}xw#`4oY zlQ$_7ypZrmyJWTN<)Q-DO>?Yw%BQoRTxp(k=u#d^m`f#gk}xJdJ7PW_6nXJlW3ecE zrV`(vA(5pb?iokHroin5)3e$#+7&Jnr>_Uu-H2YuCFKm?I&983^*c~Z4)*nM8Dr;M zB4JF?i%LeYq}-`5iqDR3$wUVCxdGg3co zzR~82vX4m!6O(Dv@ijt!Zf4g}pz<2yo!)1nS{Y|!!adeE(ip`nXI*~&WPA%Tw?Um5 z#GRmxKnjCP%N8tR)JVqeRK0Jox39NhKG8Kc+I36FBSoG<(K_*oA$0jb$&fyl(L?rTqP~o%NlxPs8iUpZSM1D4(2*rtlYt)B^d_m_@ z;ve+seVsBT_Db}OIw{~I8!4zBc=w&*)KPN*(xI^`RM5*tX=cUWU8R{7wc9SJ6j0`)X zlnJ&;W#|(uH3$^mXuYdG=4*Q72BGAS3~;yZTCj$&+G8HznQXEigFx^=GKaMjVwB{} zG0dYm(@8Ss=x{gYE;KKh*QWMq;(a`Kq%5@NyH z5U8|dQSUp6NpU^oE3->F%^J7qBd3S45{pwc#xi@U)jWtSH_^4C0yngU7)OvH)7ZmU zRWiqV^woKun;^JOwZ63<(_egYv&*dQky;%?M$u#p&6BHhplVKplGxXe_l=}!(@?rh zoZ;@iPMbtmrN|}YaEia8j9Yt;aX&;rc(?Y9?)5XSVgFld(YKr8FcsWUyddM9?CNQx z-pX^6FyoJQ9qWT{<~qtUcD!-*j>Y`dOT*-qTyjqbQgHYwbeK2X68mxE;y{#0rf&zt zTO*1Tu31OG#Ly2B&NcW+oZF0}7Y&P0!63*a+s}!*27B3@*qJFxX^%Vb{$aanLlZ=$ z(!zAo=3z~!76;5dnU$!_k<7WJ2eD>@{0zzEfe?kXW0mB9?6+NZ&?<6(>_ZHJ989-# zX*e*ZnSzH-)iew#7gh}{osQePh18eW(4?ZNoro#7)$-w>ps*M#IvG04>4SO*+^4ys zUc&uRV;FaFL$NAlVq#-ImrSyWTuavT$GQe2Gsy^hWat=f9Wfrz8Y+d1f9kZqi8WvH z!75bWpfUGNVPvSJmOk9)ovB%n5GGlz2`e{JON!oo%2@V{PHMLE+bW(eGf%O=97mKG zS?REj$Tjg4r6gWLrm|!F5;?trz{A5rt?E383;u0e&pnk=snG>DEwWj+=`zItYyPP} zaU~!`1#U_q<2!N5CKMny;juQl6jKv%F5$idlShY33l=mo(IAUUW2mcd*d5m9XBmhN z7c&2iVJ!662@j!DnPA(h95Y^7B{RXfw#CxOWSY-dKZpaKIy^?kM4Clbh?3vYo_b>d zYws?m>54E;;hx^B-A|zlHwmLg%kTW^qvqlE*hp88U;1T&+ zDfhUAtg%8HYKbCdA;nvE5bbZNW#NONglnWEyl^Qzg}X}|kh#e8A}FkXh(6bw^1wjj z^#d%okU@qXDPv*R@oXjyYM>^8%46{iTqUkiMKXuUlJ_y(%n#aSAXhu+bz+%aOiu59 zaZRIZ;FckO&usMJT4VV}o@fwAUL9L}y2rx3uA?TIWRLm17mjDH1jDYubun5JNiK>b zCA86FFC}NhuUy&?@jNXL5zp9CxdxgS<=#@UMyjZPQ637E34}*6g|Sp3E3s+GM0#F2 z>3-Kbc9+7Z5n@(fAMw3YWCo$&hpCVmyeu~eRG!E#+SluRmT8{OTdob%_ChfV_Dc9O z9gHZ~BvQC>QXTxuwi@LuipHlJKf6vxs;B?%W>)`jFGg7QO2iIpL4;wi1cS$2tB)+s zDZcnxQ2xi!r z6Ny0}c;QKRRvz_E3)7w1@ghKW(SZSI}+Y-@a#AlqPB{CNUE_Qb+d*x=$ zu1`fytjOLt%O=+fEAEP8+$bd$bZeX?Qvv76J#m39<+{~!Wj^YRO{@J=!2lx46?^3z zTL>jT?TbtFBol02fBi;VDinPGd@${mi(zCM-7?fpX&2O%)2y zVxLi0?@7TjRJxwqMSu zlx=GTaSFpem6f~MjFqY&c5>sIwUI*3m%G-2iIj6IKTaV=@NO?MJu56vi!#EN+uUpf zq%iT*ZZ|_rSCkPqyE#g{BpkWT%`&Bs^2t^=$0Y*Bi+kNXEnaIZzs-$P+1@v+;%ixo zi1?;lS2P)4mKfVeXJ@pzNt!nXU6`S`hGTpr35!o$`|+0XT4S*&D{DdA2aRkXXEAlV z)`B6KWqVQB>?ST#?8s&}!y%WH!}qy4B9}2X+3DuFM8cSHF6nZbZcd{!ASzF}m`iov zF(;V;&&#-1Ekr~q$;hEm2t^}$io`YHxLgQS5i;B9W|>Sv(voZZw z?y{f>`=9*Yw}P05U>>%my>G#UOUo84V$?{+PTAvT!&2laG`fAwWfhm`Oe{1Q*OVI9 z9*iRHDhqqxRAKTR`C*$I;|HO_kGtHML6j;MWKs}A&E^K7lu>Yg@0<1S_dO;l@vrQ0 z3pR33T(XLr*j#>+ONEo#Qsg;N;$kUB?0qwF$fd-hu)odP6?BTV-{;1x*xom(!FC%( zL_DX>ZkCrW6UT0EvQsO!DajC}Ot9_T2~RsCH3$@5*yhH#K`8lduUn$hy>C$(wz_2k z;SEblZs95tqa_r`zbpm~`(OQIK73 zx>R_l+uWi76-qu@vES#G=t-8b(>6CkPeQ`C`c}29 z76Oqg;rP98(jx7BOB%Y%O_xgl!6NN%%k7d*vzEKtxV_YB9_&UpZe~RVt{=u+uKJB~ zY#d7(zQ2tJ!F5_#+RirNqqz5t^ThVHrb-f%wAsyCq|3x1o81hDTr!T|?dBwO9zciT)LD}Ax%oL@x$J-is zgqKX*wPew~aEVK$(!xxX%?`Q54ic3aw!#T|5NkHb^*p0YAVeYUSXE*>}bunbEO%c!Wwp2ve%FChQ@ZfTY zQQ6$Skk*DVH#%X>_wJ?YCpP@8VJBkEovL{yC@j{BPR5$mOSYdd)*)U7S=zIWgU&D$ zlaR^&K}#mrl9l!jCT5Zmw%j^s=~Bq}r457LvZR(i!tTLj79@n}cSBi@|1Gto=-oCz zTQnIf7O*3Unkd$aQVVDGF0x3NLPo+(niw`05pG%nv`I~uiDP!XMSIsygs8wxk!5_@ zD!4L4IhXQKQcO+64LeD6CXY^FYq5zs8W|>JA@EIjJ~~{;`E(avpi`M(le&m>Dr=2 zZ^`r`D84g~nDW5b&OFazJM%Od3p?zVi}6bWmB->4xJtf670DbXOWx^DJQH7fomgfE zk&C4J#Wi6kp0T%kjr>kMjpc7$6OG-sI&s>Cmpmq!^lG-;C0^Q@7iDIt46oHvS`rCw zZYy3gB|Gzy(Co$ISJF$|nMY}CXC70;X^c(3IXgr2Qc)fXlnF%Waa$dUC6Sfbv}7VZ zFCDiPFGk;83ZF)Zy9v89k1>N#@WV#D$PEIOms)|%g?wk8a1&cCrJIZt-fb@wZS7Ug z@P$Zedbyg;h?i@WC|+5)8loCMzcY^n?j^z_?&e6@+bhAad-0+lvNJErc-*!6$l}c7 zyEN@O0#lXo%_|p~Oqk*nR3_yaKMHex#rm-BN7RblX$@f-daEyXIRge}<<6^)2Yvcs;Z#0?U`lzW?eRJmB#jFDraVgOVa z_$&Ne$JtIH2)s*fRu`iu z^~PWNdc&`rzqrj;jKp4Qmm%;|v_Jb|eD}i+{0|$5n82_P` z>f^w{mxBZB_~Dl7jliZ?v{Ww#t^)Hv(o)?A)L#jIK<|&XRPP7&y$UwKjvqrDflaS& zsa^%F|8e*S9s|z4rltBUaN;Lgs*eGOUW;@BJAbmJdJC}Sb%+yi%}=#d_X5uVmtWsf zJqgVHG~x(MzM-Xh2sryQE!F3M!8f*49|aEnEYc2ads9pGYGD1(wN#gY$AJrPZmGTi z4E%gc^&w#YTM#a=;}?*Rz%_3L7kCJ$|041LIP^B82iW>cE!FFR>)wt$0IFXG7kC_) zc?aSE4F3w!0~~oL@&f4mRip>l`Yx0M(E4jF)k}eAfxF+`QauIC|2o10PQ9n4`Xtc( z8!gp)fZgwHsoo51`c32o@C>l>K9nJF+i$g0p8}4(zoq&JaOk&T1MK(!${)D)cipzV20M+leR4)dqk04#ZBf!}|Ksf=&KZ-gE z?D@l%>P^6PA8V;z23!U1_#@;gaN^@gGqCHA!2z!O1kwsT1>Er`E!D%o)F+Woz_CAV zson?d{8UTzHsFRoL;e7@Pq$R}0FME4e~vf+Q=e(69sth#1>yqKKZ`sD4*ez40qp!7 z>KRb`E5sjo5}5jYOLad`|7(;XaO4Y!8_@ALE!EqBZTBIcfNTC1X$77D7Vn1*Fz|P1 zd%%td;1{ULtJvz~sY7BXInm;0M_K2>bvW z{uvzL3NZI5+72-IFQ|t=$73jKVAH>%EP$)P+~X)W;MBjNUI5)sAWUHUzay`J>dBUB z3Ai5^{1225u=^>*2e{@xp#vTO&OF^xeHs|}FT@=qe`#y=Nuc}M*6Mx0?v~c-Ex?x6*6J0&Gr(LM`~dY@ zYxN1>XnSk*9$?3Y*6K|_>zB1wcLPrVGuO3N_W>hc-dcSS=-3E?uSObxhk)@d2pc%^HLcaVfGt~*PT*-^ z>T6r8&jClbAzr|?uWPMd2|NqTZ%5pL+rA#@1oq$1TD=w6`VFnstAO=85O?4a;LJCI z1034fTD=|E`c23K;8|d07yJNcz8QH5?AwjJ1U7sN?16`Y@f%yKj{)7^+FHFIxN#5C z4qX3j@B=&xtaKnO;M`uM9XQd6v;+HYYOUS@Y}?mby#~1E=GN*S;0fTu{?_UXz`y~N z5wPPRIKaB+wN^{OL%{eUgbj3lJMs>w9d4~I15W^x-_crq1~_~K=>j%=XKVE`;3_b4 zw6*#yaJ&n72W;y`-T_Yo=X#Lmz`@?u>TSTrK9nKwIB@n@YxQwp-z~@opmrSL0S^Q9 ze#8Yhd;&g!8*Xi_UJa}pKzxA*fWecnP#|Tmh!)NE6UKhB^am9!HvhXMmL#AdbMfQ?1qKfq~Nq3+O$A`~!A<7xDqvep_qx zTHxC6h7Ir_FnG4L`T(%IfqVouokN;|CxOWc`ZW@B>^0F3qA20B7%Ltv(GLyA$;V*ge-;y%E@Ov9)>$a0R$y9_; zV|T$0*m5_@0C*ZW`#s2epyM927ohgNt<_6`E5Q7VQO>~G??bx-244a$aOC?@7Qohf zTdUUt8-D<83}}5R$_7~XgXnjFtH6bqAuoa6A8M`M3v7Qm$`-f^-0{PxBfyzgz%S7G zBdBA*hF7Ak0S^Q9A4R(XI$woy02S8^ErgYOP)etb0A;0el`f_S5KdfbDNUo&)QD24x650-Sjx>K4%X zv&bjlx;G(?z$3u;&!NnK!*50!fgL}Ox&W+y3&I5+07ibHwfYFK=dI8It-px)1CIdX zZ-YH>@R!j3fDLa)xWGfe;4dR@fJ5&Z;?0|j0iv9<Z%>dV%%tLHh+B21b4Z{UFf$-qz|vK*w()|AFh?hk6BE0j7Qnet;wI zNBF?*-^O3yh7Z6WQ2QN(2~;0MdVnjyrQbyyfVmGLp1{oSAw1yRhmjY+so#fBp#Bl$ zJ5c`vTmvH?MOz2ze~9`9-1aeyAHd`vAuoW%kHasp^vA8$Q^2K9pdJ8s{|Wj7;O1B0K&Utsvpk*C0s&mi5v;lIEb2Hf~rlnt=)FVS{@*3ZEw z@Cb0*Um;Gw@z0|ifqj3Cz5&?w1+*pL3NZ6GNDnY@AKEU^@wdn;V8{KaGr;D*LpuT1 zJ%F?T4*&yykGKGbA4J^)cK!p}6macBsOP|wz~nz79l*fDsDr@%e?mC{8y-Pj0GnBBcKjRu0y~~STLHHHJIWK-^d#y&aNU2P zJb@>Gb59}dz={7v`vUenjrs;`{4c~2cpNx;1$7BH_}}0FyRV{;12+5*`UC(IjOsG* z6fpO{C{N(rv#8;MA8RTwrixTlGoc=vTB=?*n#kYOCG~Z2L;s0!zUSRxN+p5n1gL~SlPXoQ*hByOzI@+qY z1Dp4@RWAps&bDe1cn~;yQ(JXEFut#?`Z#d-W^jS6``fBl0oNQrnE(#}rw+nDFz`H- z1#sd}TlFbm;MO;Vh?|>dSegxOR!S8IV-VN+J+E%><*wocly#ja!xYXTN zJp!ESfemn^7hGUxUt9GWpgM-|fro%Iw;+7r_;J)DU{8Nr^+ure1pEMx0Hj?d`Auo(5Jfv{erSgR{tg zV9y<>JHUoJ!2zBErsfbop!;H5^&VjBJn9v21(;cAt3C_#E+P+rJugI9z~&{S54Z}< zEu;Pb<15HZ;K(ZS0N8d3Z3t$j3*aeW>Rz-LVE6}6?!eKP!Vj?P2T^Xo zrk5dIK=ngtYrqr0*_R_PffGNBdJ7zS1>z3e@FR#Hu;G>P4_pOSezdK66sW%nT%hB} z;1}5VYV;YvHzX5FcDfD^3Q^48R zqa6W|5X)IQk2)2e!Nw?HZ_l5#<9s0^IgC)I;FdFCm|SeQyUB*zwEA51{srw(4Hs zNnr6;&`$xA?}QC-^jDF0z_xdx+=1G!A@6`^fW>#iKQQ_0h$k@k9`rH5(ceJ30Xp7` zaDd&viF5;7--r4ST=!e3(?IS0$OoYHw~<%CW59(Ez$Y;IJMamd`5?+482??=L*Uql zkQYGb@4+{)cnX;NDB25f<`3Z$82K1{0lj|&U%;M^ zqx}FI{}^clo&xUv1Z;r%pP+nzBcDV&0&e_Mqy^aWDdY!G`!kdU@FXzvY1BKQ`_IuH zfJ2`_y9c)Y1JuYuuzLR$a^A3=D)_&-AqOg@S-0xtav+8J=+F@ymO{444eaPV=I39#+o zP|mY~*aAoY7q-BTXHmz14gZJq0qd$-^-|zz;KCQxs)vA? zb+zhYVDgJ=)#rin^|k6#z|k+MRUZS6UQ?^y5A6KXTJ=_7+qJdob-<>UTJ;j(8DOy$ zK7ccAwd&Krv0APA5OA=)R=pe8y#cns4PREP-VAKJ4%fhrFRxW^0yb}~Rj&ayeMPN$ zHBfDWPv8My_$zDGM}W@jYt`F;tzU)kf!58n>R#X~u=Lfn>M>wy3v7Vfz6O7Rb6acG zeZZNoMVf%_ZHO1p@pXs?uw{F#dLyvy>uc59fh{+{H?ZLwYSqhtXMmL*wdzq|@*8W_ z7l84dwdym#_&3$6&jP)>kUv1jHzQ5JmfbbXU24_3Z-FiF2ypI36Nkdur9Y zfNkGat6mG#I#4daRbX*1@)EeM6aImLn@|qG;eEC0J;1J;k!Qf>{WZ*8YSsD!wd!u* z3E;v(*aEjbuU35y7(4`9;PAJ@7T9&TR=ow-@*RjHu>MG`ng{L&M!vIFeH=J)v{ta0`)slK0xmrd;_ER%)JmkfD23T z0o0cfFW~43@&-7#iu?tRT*6=A$cs>(K<8!n25!6ybsgAqH}VR&@p~W#I`6?>VCVND zY+&1qkq+QlVDbCVR{-^wpqzoj-;ewTw%-d5u~4Y2EN=+A&{zl8b&Y<)ZGDsb&D*Q!?l&jRkfg`_$vIKU#8|@CL{W{_Sta}go2H*;C$8Vs%0O#HdAHa#&F{iL@ECCRLulW?!0#bW zz`+kAPQaeuM|}b|d<1O}cp8}h1GGV4@}nqQVEhkJ2EgHup{@eE{|I#kxaQ-q0iFad z{4vT482JR+3~=~QPzQnSpF}+XHvK8u8SoS^^C{#PaQ4rTPr!*!V+;Wf{W-=Xpz|~M z3+(y}q#fA&S=2k=+P_5o0G#kr%+8FCbjty1zlb0at;= z`;f=L@ZTalpyPhj3t-dVp??Ri02dxWI{_~IJ^D_d{vg^5aP%LLcA)bi#0}{9NAxei z&WDkIz~+BKo&(oEf_e#D^Up{xa0OU=6lDO+{R{d{VDT}u9boZaQGbB>$Ds!<{2Ss2 zoO=Rk0w(_*aRH{D#9v_MKOhHgdkTFZ(EXo?6VUNA${o1jzmOha+ZDtK*!JJJ2DV;B zJ_6VM58?)FdroL3tamw$`N=5xaa?nSHMcuUOf(6`l9yg8Q`Vs+N*27xV?HU zuz7uZ^*UhFm$X-}2ew_)UcDLE^`-6AyMWGX+wqL3z1rW>UVRAYZEdeU0`#`ES04qs zYwcJ+X~+Dd9nXi_s~b18S8oG$eOY_;PN3sD_yIb>f_Ua+v-1Y6%!@%TMwO988XE(Q3_W@_Vy1n`gaBNFE)=gmlHSh!M+1g&c1=#wv z?N~QyuhwsCukHb!0H(eUK7do(+pA9k$G#qE0QTR2Gy(g+0dWI%?P#yw4(#~G_UcW* zww=fWVEZ@WFR*1-d-Y17`sVg(5x5^XwHxsPj(-dC0oZ>dd;z<@6+VDXd)lj)0nY%J zz76pK<~!P}r+~@5NHb9HY_C2B9J#5zdOxsdUwidNV8hMr)r)~AfjjmiKY%j_+N)0h zhYunjft}B5uigM`IMiOf0;s;dy;=bt1Evlm&w%moXsw+y%b;A~T44CghT!E$D_UaK}vJbw1!DEOkaQqhJA#nIO$^qEl-(I}~*m(lw4s5>_ z0z{U~eGq7P4e}P)Py?QxN zjkQ;I16P4dNN5c7(9bC1HIpcuz-EHAuM3`ccVT6yU!xN zz|IEB3D|rN^&Z$Xf%X8@CJ`pE?mXHFux_fodI|72Ff)z30M5+dFL37e_Ua2j{Q}Ac zI5vyC0XpwM7{Cp8qCA03bI23m+KcVgy}(sqX&(6u+_3;(!0;mS7dZ4n#2e^bf)8N( zGU5kpS%D9rwu<-w&jOb&AuoW%7qw$u1o60xdJY`93w06LeK*1fHhd4#0z3;`z6UnI z@KY%&{JOWI;6nPB{{~&CELoY-9 z0y=&OaR#=(9B~D%{b7UyJPKTR1>y*d{78HCX<+!3umukNDC!Zg?^W;t?Ef+N0Cv6_ ze}U~k4qw2t!2E0A0~q-U*aC-M3l6a5CsAL3YhQ;p2V4Q}_$jngVEFauuYi3&jrs{} zego<}@C>l@Gw5@G@i(H*0Ed1S`37u%Q+xFqVExY_kAX*kGjB%T0^L8~UcDFScni3| z_Fn)OxaO@$EAS|A+b_0Pp8}4)4QT>){1VzKPRqT`z~Ns*n85aTBTQiZuOm$0abWU2Xk);!-#|G6yWfj81+4!~ z)DPf3VBmeITR`V;A>V)F; z!1mvRf1vhZ)M?;JVCwe~2cY*ONH?(i4-j8q|3{HFVB;Tx3p@dw{TT8SIP^zom%#Rq zqn-iR{xRA*@EGv_?A`TS6{)B=wdZhi_Tf%Bi)SoEouR+*V#0+_^Ay3GL^y|0|B5vURkmn})0&<||EvyZQzl}bF zpgVYt0k6BLJN$t*_i#Og-$#z%`2g3$4@i56??LrPhzYzO<9qM}+B`AHO{o49-vgg# zm;-QojvfZ`0(}WDq47)99>QK>-XQoj@&J!F$Px6n=y&)7UEbjuhad^Z=ip~ z>mg)9(kJve1ZQGC!1|2&fNW^<1#v<2SJWCxX5k#5-_T?55mK|U?jiO&))a*Nz_S(n zej*2Oejy(C1sT7wZXo#&u7P@gac>CB!5jkrANm^}LNuY+&q9eOL-Ae@CE1Y5QgRxC zI7$`+iTOmpY!+S{drQ{?86-KRq`r-cY9vTdlh!s5jDVYmSaZ09w6F|vK za4SK{X!rx2N>cI|>XoA8D1?-zWIgzlK@PwNQqmnhLRwkW24aISZxB|FlD!Zdj2b~u zdBhFwA(V`TKhUWH>Ix~Ll-z~bikJfkuSD^_4<(f<;|QT)xG#8BL98H$BR|N5w5q5t zL`P7v9|EeO2H;*Dc>t+_b0HhrMIuJ1R}(dXuqez4_}9WU;1-S8fYe4_@EX!%Pyc{Hc+xL z&IPLpdK|K#O(J52xTdHlgeRe%5ZH{8jZich*MM7d#0-C+LkcC&A-)A-g0NIv13@iu z4fv%|vJ~7~p-(|fM{OV*+O)b)P)7*qiMoMLFWe9K-jrm(Q%LAT z$$5zAi!}fx`%y9<)c#llkOgf9V68*aK&&N*8id+{|6tS!+=k%Z@C&*O#hgOIFvJaE z!;vfajzFBCj>IztvLJmF)*r--#{5F*F~|+v$D+R=2fB>Iy&-u#?hO$W&{q&N5q%53 zlMpX>OhyfXPQjdkI2AF0IE|9wkOKp!BSz>y19J*}XCe;hGzsk8CCf|NNpLgHK; zA$}g_4;s%$Z$ZKWtP6-;h`xpRMaUJR7o+zfdkGg=k0Y}JzjE$%dq-;WrkhmGKK=>Ba z2}*9IWG(n@!#CItaatz5|~t_;(1risvlEUc($h z#0g1nafH-& zm~ZIt9?v`I@&RiehJQr8KcO!m2Qo5o9wdLpI1uv%c|i5Ar~`y$q0SKe4RZ#5*_d1K z`i{8+w;$*ekbmNN2JA271mrhzgd7BUgW(ShlueQa?G%$dgm~2?S0PR_$xTSm@ijyn zCOHey)FekC%rwbP2((PH6~b)%JA^tWSr6VW6YtNMgm*JZcX$hFxlD2&>baZbI7H?) z$zcf0W0JMtpVuTS!P5iRf}GDJ!-063q%UMcMt+mLhYnsQ_Ld;-0w#G0Dc%?x8W%Ll zb%^u95n>COa;^8(&wQGcL8CK(NUIphUDAS2i$&mplq z;)K``#0jAl5D)l;VvfPRBJK}*C0q-?Afqzs3MpYGxeEzZFjo*0j=6yFs)z$BMW8Pr zxEkgR{Hr5J@U4Nl0^dlJ%mvSyCYcIW6z&0kpnomo3SFX6XGpD$oS|`yiJvP>l3WM( zhQ_g|H`J?(K7q)3$OmHTqc#v3huT1J1LOt%@g`Xg-VJeYa8EGFLhx*4lEvWB7_oqR z6O+sYk3`e~Je#5p;Fe^P@t`(CO@U8FPeTs$Z;skR_Y{+4LYEe(6Qrl&2whsDhafG@ z#Qs<0)C##kN;-~^)Y>GMA)<{*wnOQ*hzXo_CK(Aopj~^^0qS)y$$5zCh z=!~@nIncig<_o%a#eE?y1J^=KH_Qw8cSj9C?_rXm@C8zOA_fTWh5iK3-WU&Zpi3Xb z3Gscgjv%BT?g{Sw5g+`5i~(35kUkLSLi`|%2N8o&fAAiHdxAO?aluna7=}56>cdU4 z8v;k5Prz#=@&{`aY79BhWin9E8v*Sc?!c75xa_)3D|s&vc9d>I~!sWF~3}KcM?82-iT^V$=izmf-#nuoS%rZp%zE7Wn0OPC_FZH5NZEjxA!Q?;u@JWj^?<0&hzIIz zK`%l0R;*tL+J^c-$adrgfjbZ! zrXU|cUEmk=K8QG>%OP9~0}o^EL&g!r4Q-BM?L*oz^b#Z;$Jh{e0`WrRNz6TjoVeNNIs9;A?gCw0F=Cl=KI^#A`Jqf5tV?_zP+Yv0w4* zh43u&2?Tt@x&(W0aX8ux6hi?hgNAiPBe!dplbEOH(~MT@Ki4+-Z0l`S$7Sj8fJ z;UhFwEpi+JHH$0~lq)K{y8@%UNVQ_yr?R(97dq@E#IFEOHSlRX{voh2mcD7LqDrULm3qu7{$P z5fA8LI0v$zO%>b=;=)l=s8rP=o542%_X4MyMTWyiNU3g-s}NBGp?WQx1HRG73)tEge(!;EATGut*CDPB>ID9=7Fi5>UEB+@A-x`I35oSB{ETAZ zGdqY2d>df?z%3s00)HT*ArJ=LPtVMPC6Khq;BP5Ix=^yTNY)Y6v;dVIuN?m`S(}N=`;>;5G$)1V5nN zRLm8`Ov8O4XgZ!R;4uTwHuwUmGcgBHZx-eY0%v0mfX+eOkOgUTG1m}34|5Db^RaHh za{=N3eIf1%WD%Z&@E%eYqaF~o1akqwOY!UgYZ=CcEJ$CD93XN9a)6R6ac|I9VH|i1 zNvpBOA$$#L0HxRBxd)!>@Js@IJ#qnd1Lh4fA#Ed`s}QpZ_lD}5afFa9SeM|x6=Q(^ zHq;EH)l}{Yb{>mvFU^h?MS^vkFjkSiD)?nA;=tOp3chV=kG*O4DM zHxLhqH&I{6g!EfjACPt%y$f-7kT*o#MO+Yk5B&jN_ikagLgs~v~ zF`kQ%^aOJTaZeEkgg?V`14=(fUBKf7Y6#9tYf6&{I_!s9wR1VICp#QK&AP=$0Xvl${ zj7>g52i7K!A%U~;866yX8+%-B5-HeZKZJ=k*$)1aO%{WczD}nGROsO(igHI&BrFUA*K+nflyzYYy{uJHkl8)pG}5CHnb~Zle-XI6g7i@ zVm4U_mOtW!Oh_$`7$7D9<3U6Tn;eF)l876MmO{qTcWn5-Zu{I>c7CvF`*i zg&}?jtYVYp;1!Noz`d$XCITOU`al+RsD}DOYIW2JB5T-WFZf5|8c=KET=)p7QHTi= zYTX+ z(T9))T^i!Pke+}%A-)m%3Mw^5-5{U|@&k`Vn~Vp(DQXRW{&!45?9I?a;F*kEAWw4~ zfu^9JL2Q8|xTT_hz^^6d4t&yZ1h-bGHOT2U-mk&9|2wwE5i;5!KS*tBlZO!34z-7{ z_BK9WY?Gi4=y~w#h_S${6KW4)XUs9YhLkSo1E}5=HHY8~^bnNnhHJsAJMIsp2WkP& zA)zN~01>@#F8KCFA48r#7$4NWh!Jw2Z$F!SflmE#KWIDvF+%u2Tnj#fupU7ijF=!3 zQij;%Dnt%N9#DE1;)guLQDfjoV16JQGDf1GA!QVL2ck#gnE<87U|t~4Sd0(WI9v8gs-&8QHWTD-Uk2Gcs7E%1~J2HNLY(=q53-13PRUotwQ() z9HG)i{5ynhLR=8M8FK{zTd+=`=vJGo1mA5qLecG53*f&4xr5(M{5$yU!V!FSWB$N* z59S2?_M*4IZy&w}kNv1GhzC$B5D#MQz%S@|2uJ9982tpjkKk+Qc@*`BcE>RPkbWGm zJ&<$)&qkiggiz4!S@;F8r0`F7rsEs3(Pgd zzC`R0{R;Pkh}W1~2zi4(fuOfILhw7p0m1L_S`C38aD?EGhzm-7LJxp{Cgv18J|kyv z|AL+c=PUXioGio*&NqAwPBy*eo4w(od>yWf1v_Lr1eABkYVZj`9f7ZaTEJ^a2t^(cSP?Y`-%7{> ztjZV{_%Mg`hA)s-#Ub}0J{)mFrK*SZ#A~9c(UK3+L zTolHD@LCSp58=^>6?|(uWInjXIQaPk{Za>g0uLc77UzI>UEBxcdgxJj56Sg0FAyGw zbHJwo&H*+axx!0GZ0L~F5SrkSjo{Y^xq{vp{RG+2t_f-g@rkH6RBwv-pmdT$mV(pF zA;aMhbV){TklGyc3{fc#*$qWoAO~jh)0AeO!d3Q{XWjwF7+y)&PhzQD=A#NwZLA2%nAKhu}F_Ti`YqF+dii%|pBpH6JlR&;mSH zz-u9L1a=YT1TrCYG2(^TCCCXvmSQ~cT!#J!emUw34THI0tf|&3fDmqBr0i2-t{x!P8+R_$g>UO z0J|N156>ZC2i6mW?nKPsz6&*gFVJQ;))6G^!8s7R7kvpH`%qKJfsFm=T}V8Dd4Pz6 z4%rJO4S5g$YyLwpc)9BUc;PGFuvKZ*W<_mF-H`9kbz^e|L9 zgSvs=S*%ZRJBRUsKaXqREhJyS+(E=e^e_~?Vp$+^gQAiRrohv(2(z&Q{py6~A{7bz*Z@R?y3@sM3)BIH1Z z;vz30QFW2i5Tv=tQgG8h}@ISzp)#sN1A=fE%MV&fc$cUA76wIz+j<$X*D@jdQ>~kBf|iKhP;J#(~BjE^-n=^C3U*@^q2OkOLj^ zyU1OL^1{6!sDO*CggoB37i2>|S<8&dpSkV3?l6efP82q{X65r0yg1dtM>Bq>EolQJZbl*QldD~F#` z%aagNfrOHZq!Ou2!blYoPO6d!QjJt6HAp0>Nuo$C?1!#RVn`hlOX`w(q&|rw4M;p` zND@dR(wHBF#uLX--l|3zAA&k~Gqaq?6X@p|+$QX^;07JCaVMGwDLQk_^%f zp8@MZdXiqGH|azAl76H=89)Y-L1Zu)LWYuI_^kQ}GLnqK@AJlxv1A+>PbQFwWD=Q7 zrjV&*8ktUJ;P3IwBD2XHGMCK5zNrOdAz4HglO<#+Sw@zV75Eu^6cnFohUjrZD5j z6k&=o#Tb94I1|8>U`jHjn9@ucCXgx11Tp29V5U41!c<^FnTkv$rZN-8RAIuIs!Rk^ zjj7JmU?Q2COcYa#iDqguF-#pMmZ{6sW9l<;OamsKX~-lnjhMzv6DE;q$|Nz(m}I6o zlftxMQkj-a8qBw|qIx}6Eu1p5gjp@$xV0tpWnBGhurZ3Zv z>CX&c1~P+~!ORe5C^L*1&WvD2GNYK$%ot`YGmaV0OkgH5lbFfO6lN+jjhW8OU}iG2 znAyx6W-c?2na?a>7BY*N#mo|BDYJ}O&a7ZoGOL)?%o=7bvyNHMY+yDro0!ea7G^86 zjoHrZV0JRQnBB}CW-qgk+0Ptc4l;+B!^{!pD07TC&YWOQGN+i+%o*k^bB;OBTwpFT zmzc}U73L~)jk(U;U~V$EnA^-9<}P!Oxz9Xc9x{)Z$IKJvDf5hZ&b(k=GOw7|%p2w{ z^NxAXd|*B@pO{SMGxLS{%49L$m~7@d^Mm=x{9=AHf0(~a4)Y&FScYX;j^$Z_6bcHV>PZ^Bi!H!?5!;w;!X~m!*(A0Zo6I(6 zQ`i=4D%+AxV_UK5Y-_d++m>y|wr4xA9obH7XSNI5mCazgvEA7oY)`fq+nepf_GSCA z{n-KRKz0y2m>t3nWrwlD*%9nWb`(3B9m9@g$Fbwt3G7665<8il!cJwUvD4WZ>`ZnR zJDZ)u&SmGZ^VtRLLUs|mm|emyWtXwb*%j`rzUyPMs^?q&C}``H8RLG}=Pm_5QCWskAP*%RzZ_7r=XJ;R=5&#~v(3+zSq z5__4w!d_*svDeuf>`nF-dz-z(-evEx_t^*RL-rB-n0>-NWuLLn*%$0f_7(e@eZ#(G z-?8u659~+w6Pw9?X1}ms*(~-Oo6UY_f3QEB&j9$Y@olgrO}aRoSUt{~^b72>JxJ0fgm&7&WlDXzw z3fF>5&f-vdUJiazFa@9 zKR19I$PMBKb3?eH+%Rr9H-a0RX5Yq+)CI&M9;f!oM!;x=gU`o%^7(l$z5wsd7vz2TLcA|unD^t0 z@J0Dzygy%@58zAiCHYc(X}$~}$d~1V_;P$OU!D))EAXLwMZOYWnGfTu@Zo$_K7y~t zSLbW+k$g=)im$~-^R@XHz78MD*X8T+_4zoy0Uysd5TfQCNp6|eSXwGx=Hk zY<>y|H6Oev-od(HvgUf!T;oc@xS>${9itY|BojEBd`J|@PZ(Sf+Wa- zBB+8U=z<|o!4xdP797DPxCyxgcOkcsN60I92>Aq0A-~`y6cD_Hf`X4wNbnU33w}Zo zp{P(y@E3{;0YV9(q)VPAzY{`LOu`6Qm83J3AKc1p|%hs)DdEZx@7Mcqw zLJJ{PXep!#t%P);wa`XrE3^~Z3mt@xLMNfK&_(DfWC-1a?m`ctr_f92E%Xuk3jKus z!T@2QFi03I3=xJ3!-V0&2w|i!N*FDS5ylGRgz>@zVWKcem@G^YrV7)9>B0%tA;rf^HRE!+|A3ipKj!UN%<@JM(pJQ1D>&xGf~3*n{kN_Z{25#9># zg!jS+;iK?L$P_*cUxcqhmher;7QPEVgrCAM;kWQd_$%ZH{|Q87L{{WPUKB)8ltfun zL{-#8T{J{0nxZAzq9eLQH!+v!F6I{Vh?C#;yNF%I46&QoUF;$D6nlxi#Xe$Rv7gvq z93T!92Z@8lA>vSRm^fSj5UA!UQ6mN;Q#XI6%@t$~Jd>}p)ABm5}C*o7_nfP3MA-)t}iLb>s;#={Z z_+I=VeiT26nc`>hi}+Q{62FPr;&<_f_*48P{ucj;f5jZ}Kaog`#7dmROM)ayk|axt zq)M8kONK-xQ?evmawM1JCgqacrQA{;DX-)q<&!+6{F0YcK=PIfNEM~ao|O7*1rQk>L4ikBKn2~s1evD8FLl$uIOQZp%8YA&Tn zEu>VbrIaSMlG3HtQX8qQ)J|$Ib&xtroutlE7pbe1A$60wOFg8XQZK2u)JN(o^^^Kb z1Ehh{AZf5PL>ej$lZHzpq><7nX|yy(8Y_*H#!C~ViP9u#vNT1SDovB7OEaXI(kyAV zG)I~%&6DO!3#5h8B5AR-L|Q5>la@;>q?OVtX|=RQS}U!S)=L|tjnXD*v$RFpDs7Xt zOFN{U(k^MYv`5-2?UVLP2c(12A?dJmL^>)Rla5O#q?6Jq>9ll4IxC%%&Px}hi_#_O zvUEkdDqWMVOE;vO(kbVs@?-IMN152T0EBk8g9M0zSclb%a2q?ghw>9zDmdMmw? z-b){(kJ2Y8Q~E4@k-kb<(l;qv`Y!#DeoDWj-_jrHuaqPGClQ&ES(%f0S&&6pl4V(u zRaujD*^sGh%9d=)j_i`%op zR4yj_%f;mYxrAI&E+vsq+sWCJW?JdkCw;CW94!3czJ?6QJy4EmZ!*5IL zd-;R>QT`-n%Ae&g@>e-a{w8P3-{l|jPx+VpTmB>em2>3(WTG$%t8fah2#TmkimWJ# zs%VO?7z$NP1^bc|M{y}`N-o7+$*ts3@+uxmKE+eXuXrg16mO-V;-eH&e3inApHf6A zsuWZFmEuZ(QbH-Ilu}A7Wt2drtP-S@Q-YQ9N{CWH2~{d8m6Xa#m{LUvSE?!zN;Rdr zQbUPUYAR7mEhSp1t;8sGlvt&%QctO`#3>Dwc%`9|pfpk%D@~L{rKysnG*gn5=1Pjv zLP=FxDrrh9C0%K)v{BkB?UeRP2c@IZN$IR~QMxJ_N;jpu(nIN~^ip~&eU!dRKc&Ai zKpChEQU)tSl%dKnWwitWx29KS*fg2Rx4|iwaPkWy|O{ssBBU;D_fMU$~I-Y zvP0Ra>{50sdz8J(K4rghKsl%!QVuIel%vWq<+yS}IjNjdPAg}Wv&uQ;ymCRgs9aJm zD_4}O$~EP>aznYP+){2Uca*!zJ>|agKzXPNNcB|S_%&Qmv^*skPK-wYD0g)=^{Cx@tYOz8a@CP~+8xYJ%EGZLBs?6V;|_lG;p7R-3CS zY6~@0ZKHu}1I!GO?4pE1y!_?vG2z8`7N*%3^QOBy|)bZ*Bb)q^+ovcn#r>fJ`>FNx1raDWV ztH>A4x=3BDE>V}N%hcuS3U#HrN?on4QP-;L)b;8Hb)&jT-K=g=x2oIJ z?dlG7r@Bkst?p6xs{7Ra>H+njdPqI29#M~~$JFEM3H79UN*@{s3HDp+ZS{_NSG}j+S0AVk)ko@M^@;jaeWpHFU#KtDSL$o^jrvx7 zr@mJ|s2|l&YNq;G{i1$Vv(#^Dw)$QDq5f2VslU}f>R&ZS#UC2i7>(69jn@QC)Fe&T z6iwAMP1g*KYNlpsw&rLq%}vXtxof$#JX&7OL(8XmYWX!Ut$^mO71VsRLYl8uSo710 zXhpSRn!i?D3(!hvCACsoX|0SFsFl@%v~pUoR$dFyDrlivMXi!nSqsyuXyIB_EkdiN zRo7~0ky=eHN~@(sYqhl)t&SF})z#{0^|d&yfflbd)DpBtT4Sw=mZ&w=lC)-8vesNn z(OPJ!T1zcWYo(=Yt+h5^8kSL>(s z*9K?S7{Mrb3oQQBy2j5byqr;XPpXcM(b+GK5tHdULZP1j~r>)mEXdAUn+GcHwwpH7v zZP#{aJGEWfZf%dYSKFuU*A8e0wL{ur?TB_%JEk4iPG~2!Q`%|mjCNK#r=8a>Xcx6h z+GXvEc2&EkUDs}CH?>>ZZS9VBSG%X(*B)pOwMW`x?TPkOd!{|tUT811SK4dsjrLZ1 zr@hxcXdkstTBi0{`=Wi-vb1knw)S27q5af;X}`5U+Fvb4!yjtZ8J*QRo!13j)FoZk z6ZWe#w(jUI-A&J>yX(32JbGT;L(ivs>iKmqy@2km7u0?9Lb|VBSohP5 z=tcEny1!mr570~KCG}GHbE9SSK)tLUq?gl!_40a%UO^AlE9#Z>%6gbyMGx1j>JfT1 z{Hf0xdZb=ckJ4-D(Ryt?Mz5pC>UH&cdVM`kZ=lEP4fO=Qk=|Huq9^K2^(4KSo~$?5 zQ}h;ks@_sh(_883dTYIn-d1m?x7R!99raFnXT6KwRnO47>D~1ndQZKV-dpdZ_tpF9 z{q+I*Kz)!tSRbMf)raZB^%43=eUv_0AES@e$LZts3Hn5Rl0I3VqEFSQ>C^QY`b>S6 zK3kuo&(-JY^YsP#LVc0GSYM(q)tBkZ^%eR`eU-jiU!$+p*Xir^4f;lXlfD^$AaSd{ zP2aBX(0A&)^xgU%eXqVx->)Cg59){X!}<~ZsD4a8uAk6P>ZkP6`WgMKeojBHU(he= zm-Nf}75%DyO~0<+&~NIu^xOI!{jPpbzpp>gAL@_v$NCffss2oVuD{S<>aXf zB1Tc8nBi{}Hv)_jMoFWTQQ9bD1R7^1fo`;7y}LF15d*f?SwHI5m_jT6R6O~7sZ(5N0&_dLg7N&l*2rWvB zQGZ&T2GA0;BrQct(=s%WmZd?o91W)BX$Y-ALuo}?iB_gzv(;l=Z?L~XjKD00GNBh$ObRZo>2h$;RC>=(J z(-Cwe9YsgeF?1{)N5|6%bRwNZC*zNmOr_K4bUK61q_gO3I)~1s^XPoKfG(tq=wiBr zE~U%pa=L=9q^sy^x`wXB9|KuWH_(lA6WvU=(5-YE-A;GVopcx7P502fbRXSM572}3 z5Iszf(4+JiJx)*1lk^llP0!G?^c+1;FVKth61_~X(5v(sy-sh?oAegFP4CdV^d7xW zAJB*N5q(Ub(5LhneNJD{m-H2VP2bSB^c{UqKhTf#6V0Tb=@W~^D)tY_9YnQpc=+n8<5c4m9CgW1vSWOg>Y zm|e{bvzyu7>|ypadzrn>K4xFDpV{9WU=B0~nS;$C=1_B(Ioup!jx%`N6ubDO!{++prCcbU7*J?36>pSj;WU>-CNnTO3I=27#Q zdE7iT`P_VAzBFH%ugy2+Tl1ay-uz&GG(VY{=4bPZ`PIxaznR(Qck_q&)BI)r zHvgD^%^dST6aRx5i?uk5w**VHBulmwOSLphw+xF~re#^S4!=C{180+zQ`(DJbgS-w_b%g-ue6}5_4{#J1-z$#&tv`Sf}tuj`iRn`i!%2~ly zc`L-KfRBGxv?^JZtuU*K6>e3vBCKjwb*qLIY1Oo%tXfvIRojZO>R7Q>U8|l|--@#u zSn*avE5T}HHMW{qiB?l9$!caLTg|N$tA&+nwY1W#R#v*z+G=C9wc1(jtqxX4tCQ8) z>SA@ZGOTV^cdLih)9PjQw)$9ot$tR2Yk)P-8e|Q&hFC+bVb*YKgf-F{WsSDRSYxem z)_7}zHPM=6O}3_3Q>|&%bZdq+)0$#}vlx@ujsu3I;(o7OGswspt4Yu&T%TMw*< z)+6h&^~8E=J+q!$FRYi=E9#vn#;X_O|W3x7A^R{4%wq(n;Vym`h>$YK2+q5m)wjJALyV<#HcRRP8$Ifee z*!gTvJHPE^7qGqUg0_!c$o91h+kSQtyQp2v_P2}M0d@(yq+QA`ZI`hF?Xq@|UCs`+ z%iAG#1v}KPXjif;+hKMUJKU~nN7&Wu>UIq~(ynPo*|qFwyS5!;*Rf;mx^_Lgz8z;b zu;cB9c7ol=ZfrNP6YZvUlHJTswwv22b_+YzZfU34t?YEWwcW;UYqzu8+a2tVb|<^D z-No)|XV~5B?sgBmr`^l$ZTGSJ+WqYQ_5gdJJ;)wx53z^Z!|dVq2z#VG${uZxvB%ou z?D6&ld!jwbo@`ICr`pr(>GlkJrajA^ZO^gi+VkxB_5ypMy~ti{FR_=}%k1U$3VWr! z%3f`+vDez`?Dh5rd!xO{-fVBNx7yq6?e-3Pr@hPGZSS%7+WYMN_5u5#eaJp+AF+?x z$L!-G)%rhUu4ZQrr)+V|}H_5=H& z{m6c7Ke3DI zPCm!e$?teM1srdupyT5da(tb_j-OM+De4q+{GH-XfK$RL>6CIxJ7t_eY;+EC$~nPK zc_+lF;DkCAok~t+C(NnhggaH82&bA;-KpV3IyIdrr%p*Qw{!cjBA| zPQ265NpKoDjh!Y=qSMq#!e-uNr@52jv~W_LmQI?}%1L)xJ8hh{PCKW))4}QJbaFa7 zU7W5?hSSaI?(}eaI=!6UP9LYQ)6ePe3~&ZIgPg(65ND_}%o*;Ca7H?#oYBr0XDl|Q zj&~+F6P-!UWM_&q)tTl@cV;*)w$+ecWyX0om9ykx3 zN6usCiSyKX<~(;^I4_-7&THq5^VWIiymvleyWb}#)A{UtalSfP&NnC9`R@F1emcLL z-_9TBuao0o)18ZPu`bTVy9Af$l3cP&aj7oNrMnClb(t>9WxE`g%jM?E<#KoBcI9#9 zb$Ph*xjbDA{vRLwzg=Vhc8&epHTG}U*uPz4|8|Z2+coxY*Vw;ZWB+!I{o6J6Z`atr zU1R@tjs4p-_HWnNzg=Vhc8&epHTG}U*uPz4|8|Z2+coxY*Vw;ZWB+!I{o6J6Z`atr zU1R@tjs4p-_HWnNzg=Vhc8&epHTG}U*uPz4|4(*}<#&0x3b?#o1zkR_LM~rdVV9q) zh^wfpn9JW)+!f#|;VS7W#Q^>2sgo`^=9jr``xjp-?Eq`X(PtzH;*6rTGjM^6MwRVe%U%ziINDC%^e`@ll zCx2%0XD5Gd^5-XiVe%Ize`)fUCx2z~S0{gM^4BMSWAZmAe{1r$Cx2)1cPD>u^7kkI zVDb+q|7h}$C;w#fPbZ%nzQ*v+4PSHk=ZAk`_!ozNY513ie`WYrhktGO*N1;&_&0}t zYxuW^e`ol2hsiJuUu*dHhJSzf4~GA6_>YGFc=%6-|8)4zhW~u{FNXhe_^*cldiZaK z|91HAhW~!}ABO*N_@9RVdH7$3uRZ*)!~Zrs7#{|x`{usu8)c81+yZ+JYsJG?jS4_`67KRg+p4hO^Ga5Q{zI37-h)8X0h z!SI#Chr>t1R}Eih_`1W_8@~Q99lpUZ8_tIF;bNE%m&5bn#jqH@dU!cp4cEiXupDlO zkB8N;9`1(C@M`#Ecs+bNd};WG!#5hf@$gNCZ#sOl;hPWNV)&NBw;I0n@NI@~JAAw0 z+YjGi_>RMO8ou-JU54*Ee7E7d58q?>p2PPVzW4BbhVMIkzv252KVbNQ!w(vM@bE*1 zA3FT7;fD`DV)&86j~agT@MDG_JN&re#}7YY_=&?$8h-NdQ-+^9{Iubx4?ko0nZwT- ze)jNlhMzn9yy52$zhL-!@N0%&JN&xg*AKs8 z_>IGF8h-QeTZZ2{{I=n@55Hshox|@Me)sTuhTl803|8vgR|SBAej{I%h)4}W9$o5SB4{`T;9 zhQB-fz2WZ<|6urs!#^7S@$gTEe>!~bYkiHc_0L-JKWoYVtR?^dp(TIK&rP>?cJ@wA zrn`G5JIDJ+r~8Ko)63O--X$#Vy70~X6X3f~_fJj`{UpUN!1MXtgX!$zda+(FmN(m* zyBEvV;_lNBNqBB%*NdCy_b}Y9mX~u$W&h@Kxeh6abS2YTs`Zy4gz(%agfNT?F+KU{ z;B@=LS_29GY&`_d^X1Lm{N`?bc)6W)=S!S;L%9zx*Bkc#JG?oyqfpGE$VXCuV2ljrjG4rWKyK}x7#Y8gyl z&S`@NTDk??+F^i1oG3S&>*;KL-lmR<>w=@)UdX3MR#IQ23>LvN7xV7@A0F$ z9PjQOpcqf~ziMyybpPod9Q0QkZ%y&$QPVCqws%b?p9m;fl z2lIO#g>0?CVj7_q(BLB8{`Q+~8U@Vp3*_P+obJ85cRW46PO95Cq$o2XPKgOB=H-xJ z0v_LZqf3M$o@Lw$S9F>p0qN#Kyqk+Rzx~s_r&A|6gICMt%WORd&z?N-?McE}P6-tu z4*xh?v8u_6om5K^*sjUEe34AI= z4v&sVQ`CR7bD9SfET@F&gU{!yyXocC>^Xb3K-js6(dFQ#+TWPK@_ML_wLi%WQQkJeMy-0 zHM_l?Ud--hR$CeOTFT(!Zhl=e0=m5_1~0rt7zt8ebv}Dve71M6vll!6lZ0j!ouDa% z@qwvVRE^HzB8j6z28GYB=ChmJhC__f*bOExEJ`OAwAX}ZH<*CsEyrb!#j8!TFKy2v zwdq2D2SMQ)lT~psznpEZ?xxqXbsF|qGFS7P=XWn+?uv2b7;&e2P1^TSmYzV<`Rf=n zq0`IM0~mXg2Y?4LF01(L)9JzfZi|nXi?KY_jhZZLcw#p3ePilgCds1o!7 zbNo|eWypys!R6|DcD49Y$iUaPB$?{f=US>%SXdEZL{g#C58r(71s@;v@_c?XUrFv4 zEO!3Ym=o1BB`F{BC|1#WLcPL zB*7Kmf)A7Y7QRmaYHLKc%}p=QX9xQq>>ZzMKWVM9Cgu9B38iQ?1$7aW^z3v;s;>;4 z6XLBlW3}NXLUCpZan+WfBCciX#5Ba)V~SSv?~u9_kKgI23(mk$mvzQU?jP)*?00+P zNXUsqxTJ$FMg{@b%ZtrbvLS-&yV=>*d>Zhxn=q?9+gygQs2_%Pxwt`3iUow!dtpgq zjUfx?yFK#7)&kSUrCBIL*+XAotzn&9PN^|%o5;6!%L|zVHMDaO&#Zb|;tQ_eq2Y~0zHEhHesD*3n>M>% zVc30*ia_E>S|oikTVMv2ML4@!!e!mgHd>o3j19i0cP}sx&WsfCe6w0%MR5An%QIFA znF&jhX1B!X9IM!iH3Yt;zfBP(OP>;C#>CSly}60PJv)8x@Oc09qv`&^9 ziA{7Vs?a5rAab$owys z>pNKjPQ#{5QLUO3uvWr8PUwvjxW-Oei@3IQf;S*qofM-3ZUs zay_TMImZ-Wd2=I!1r6MOica+P-E=j-TUi~u)R3--Pd5M-48l23k(i0}2{zp3)90Jn zYKBcE(;kzU-ePbh>!X<;#)T4&B=$+*znGtGp63#3o)ODRzIeWxT~BY8H!zyJ+0}Hu zS}oCKFxQJEIyNb50O1BE-^TMvD{p-*0W(?%zH5{?N%MHqylHa-ck!DU8l5(sW&|7K60k?)xurARIv%#<+ z07^s4#i!NoJUvl`F~F^b5;}T+=j81Y^!*Z<={0U=3v)O`%r}-O;z~;}RRVcAV5H5+ z?*&J3Ib>~4D68c)l3mSp{*+i`LbbspHUZu-lySpNQLFsK0;NRQT%XNXPUqOlB|zQg zW`aF+bVL?Gep_svo3K@~^Hzr2rO7NaGL!2T+Y+V0+-}xbt!4J5`ipq{m1}Tq-M+G~ zOVKgp^}Q{FTu5Z1Yw=#}xl%YO7@O}|y=%01bBk-vN)vB!_-hPF&K<=ombR7}ip6wD z@wlF^6pE~_OCnQoxC{jkOu+UVq<9Dx|4U-2WrkW`N;LXXB6sJvQ@H7?nK`2Mjju5l z)_3<3#@Y;)SwskuofHgqhY1p|?eBsvWe7E0V9n6FIi*TxT(X16oC_(yF4`+)bBl7D zvArs8`;{-!t60L4m@{wrsTFlFee`7iU{{V>EN?JDX4Wm(GQ)r|Y(v`+19UM=E{Cv3 zNmc9MMJGGOn%p?|vx#GxQhFgd0gYnAl|+EHa9@ zEf=gJasg<$t~YF0E-e5p*Lr#NYCipVBLfV_T<}hukE_D1KVEgYOr=yHl>#AQm7*0R0=7`|9u5YnI%|vguZf18VOreQO#Y|JB($#hmTq4Nq zxBP-sTB9~A)+LJr-N{1w=$zMgvf;P>WTu9!E1sZ1(o~?-6z~`R`&=0r$l8%bdqhgj zAy?TYheOvmZTWn8J(v0Q!SwmL3ZJXvVm)KG#N92Vk>OIT2&Fo0&@GFP&FLG=AIt(C zexZ+VZGFDWzxC!@UHpxA`uuNhadu0&y$5DUIu}k2l(@P)-}?N6FC?)Zl>DcW^!8it z_(*TOx%F0x^yV8`I7V`$tp}eUi}l8Xx3dbWSdeEd!M7fMJ{P!(^^VhNF#;HLvKX`+ zn4a!XqVx#f%%6)TOTiFcnt$d`nU@MzsdC_ z#Uatb^yLbU@xr=qBB=@3?=7)@ z$=i@VP}*X{TS(K_T8}=ZQqF|tCYpft0;gNFaS@U+3fH=!4~AXAOVA3R$q%byYNQHG zJs6W==T$ZQ1Vg|D7Dh2L&oZE=@xQei$iLojaY_Zn?<&Jw$MBe`92CYIEH zh?ih4$(}QioI?T3D`X(KgA61;kb%q1jXL|A8{{FS;1S$xODRyKENj&Vw0>E6vtPQr zCIL9%p=9?30MB!+;|j~H>-h%DgC(sJCTNi}nLkog`5k#QN@j>Pyedsgf2wtr zVWKEUg1Ed;G{jL|>caTD3~(6=E`@;ew+!aWPsWvOiFQPJe zJA22c`;Yf`aIpL6@X7wpKJEo*IeQciS$epXbm!?dHk@oTQ;x?KLHYeF;?q^A?dbXXeJ>XJQIRN-M;puKqDpA!p_!f z?bOHEicT?olq|IZ@QK!ydtdd$|?1%AmLsKp(=MxxrSPK z(x*yJVnutdW3G`oPKt0Txfhvar$`qYig<`4JVK_}O?=WCFde(8@=}8DTt_>{D%*}+NVAF;;_>_yM!vi@M;$5M#Vt|^_c`~qnXiOa$?FssTj96C3P5~V zdA6L|L$O;QbXh&*JYQR;dJzcmtV~9W>~|r-cV|x6~HxGETfm?fY%A+)=PP_k|Y4*<)A`sQHp~_U$&3g z9naUXq&1o^1B?-I?P)yb9S;M!nApUbW5=P%PV_65in|AOiXe7l2-uS^MIdb~F}SQv za#+~oo^uC;f?~cJn%(B6)=1*3@gPYXEeO*mXKiJ2qpwWqYs{0K&KkHcYgcb=T&FqT zMy)F-Hg@>buU+q?Aal{(ZD`Vi)|wKe<4lH9jZEbrpvA%(6Nfb(V#>OMF6lDp()`lZ z0?Q~ksE3nuJme#1drOdKek5e$W%3~fE~V>j9{7n%4D57YRyZX;*@d>K1TceV$L0~c zAu4eeSO&rQb0(dpzzwb}mV%Fv3J1|VyjibO_duyVNrv}TO7s~v`wm$Xuadf2a@k(E z_|xf3f>~!)DEJcNcBQP6G)gBkrEupP%SYIDmuwU0B=L~1js{ofN0lTJw*qsC^h^Lx z*;rocOzrNLoWF1cJAl7){A9YjkJW^uLwDG-MrG<$ajHEZe{^(uIOW3y`TziOs3EN3 zP>luV(*O++xK7_Y-rL^IM|QD;Bt4=gk%)SQNypZKLR(DxsxtC!sNDoP5awo8n-zDk z(sVwgB?PYslTA)ikeG{^2%8%$8*x{}^kF!ws+)D%?2YWYSspULA+#l4lt>52jDL2w zyk4B^&S`|qaI`qa#uJ9dh36?)sWu3z;WB>F_~+->S>(RjbpQzAP$tu4d0kJPTvKbiFD1vjRe0nh zF$Wk^sMQ-=F3!4J6?Y!a9fxT^iH)2AuHs`~dcX1c~@OUrv$PPhUd%)9$oDWFP?`Sf@OM_n< z_15GTR)cYT+T0+QU{*i!J7->U7RW}qh39s2c7;w^R~iI%xy1AtlJgenkiBMG!O%Vh z!Wa%aF&|C$KG=TZPT6z_B9|>owb6u%*T*)p!a72yme+T3^s}FV+&b@yWup#j zO)F2-3965r@uwBy4b1}ucq1kdio^)>i}@R^EQ+=QCA>S~9Z^Eh;sD=*Zf z1@xLWoi)=;AjTG~BoE`5PN*+2JJ@FatHOuU66*Ks6G^h20uq@N{eZgLg; z_G8B+XF4LME4yUzaf&*9h@)oHhi^T|0MCj|<%o-BI#qy2TntEkUs|j(IQQHZPH(zc z@P@q^e#=c1>8Mjc`@R$s`O0HD0oESSK{y2|$CTt?mB;JKlU$K>UPSTCw&>%bTt`Wd zIe|=ZR+ou7R7?p;|C9n~NO+AiKSt!>hqgH9pl-R?6uadjAq`!9B2~G_mZcBn3Y5BB zB<6CZBC(6b*eF#hgH!^KGC=|vN|w_)f}r#%PoxOzHIrrX9g8CDEsEh%9)_HKG3c|G zd-%xJ-!VWiT`|~wPs@n)PH96H;^I^$$?1qXEC;Q2_i?lsB+Vo%>kK|Z`$*XOOTGYT-O0A| z%?OhIR{4KKEDK(=p$ z#ows$rchCd5Nj`**aR>2nRuhWam>Z91h7M6W(pFFnLzU77LOGqT?fP2 z0n|0EOCfAH!LK8n9Xo!zLYrSt4aI_`z#gz-AL5`T-qF~d;@IBJdW{1XyC;X(-ocKV z9@%9OJ6_0zmViD8lOko(+mWPSte0n>VuXlQa0YW>@l$SD5Y(}VkN^B?d4>g_bfcL} zy0*?=xFEqpxBO`}iK~}*y}{=riVY$qz3lCv_p?#~#%SnlJKdFgH7FVMp_j=CBoX6y0 z3Te3&j`cIl<56aIHOfT`oW5vVj;PAeJxsuRN z_{B`_^v#n?!!-|YsoF}gp5hX;c4`KO5T`S$|4Ppd%^Z-6n(A%KmxS>W!B;48S&AL0 zCr|HJR_4$S%#})Ngx4a(9h-zWEH|PU_85GDr8acpBDzaDW3}OWf-h&mD}|EKYoEkF z%RI=FTPt3hO5JsK7!H$`Qx$M(J!k1vOP?D{2{+isYVD z#QRc-N@UO!r6pcTm6z6x^L&P(w2!KbYse={9p-2$T5{dg8kS~p8W_VP-sZ%>9y<~^ z{@^TAm^fOu*rBS-4s4apIK-`|*_g+0<;5i=Y+UT(WqmKR65QrUNkhhN#ph5qnn}F? z;UZwGFpc0mn$AZ!%*J^Raosa>f{a^uZzyZRTL;^8>wy@np(Ov4h}^WXOvzhiiZ>a! z9Gh7frqVLda}P|~#>tklgwhbi$ge_anCKQ#&k552qjzCEq8vcSN+3E?2_&_ZAZS$y z#9}27iAF=D(hwmEUz?HOtrbOhI>R$%H**vTz86CzOii)^%J4h6DcV}q&FZ?2oDhSm zHH5p};s_-rh5XiT=9At05=zZdV_ckJ_L7Nde5JJ91~o{rz5=%{`A{ma$GgICT5b8u7C2|M!CQsV02M>G0m87*jWJ_ZyX>P zCtqC1simf>G-*Q|$T$v>R4$R`NCsJp*Qkog{r-wCH67)nm3?_tLe5s>PO?5jT_vMj zzDmf%u>_CbbJ$-QeG$FS)XQ^}v(6X$N^Ldc;h$cO0=DYY5g68~w>S|Jtt4oD2TaHP zH0!g?;_7Z;Cc{R&yN~(b=|^tKH9#`?^E_%J2k-75@T)FNIRA#GZZ7S#Wyay|C41#M z$CVe@?EE#JOp%wDGoLOjSYiy|#!*Q<0r~MXV@w+YDX8-V&5On5TB^|`c(NVBdpjX` zynV16fr>x9hUAh|C@-rv6zaIh!}6mC;0L2T%HpPjO@Weni>e$MuH;L2Rjvd#<;#R7 z9c*(hKOK?D9&>gDu-hGZG*b$!lvv!nQ07w5itJ~2xmbx&msC^#R}g1otZ4eleqvX6 zCn2aD< zvm`p28;Mm)xK16i#kwK(Hh2S6@Bek}mv0c`@DBfQ<)mmxpIwjjXfpz3l4?obN)4+B zlng#kD%u7z^fFPzGHy%vflH1?@%0 zxv_3uf{#V$<;e*Be1$TWl)AQ}^(-x8u}9-|o~*?{t($!y79B@3Ynevqqk@eKH7d|& z3X_|VSH$&FRsz-NI9_lzAwj28hFz^N7%D@6ioY%)dD^~1&~D#BiaGaOK@O|MP5l6t z$Ghy6_=&wKMkb7;(<@erQ`e9ecdU{co@g+htmk&B(v9?T5>I-$Qs>0#j*Hk>$0an~ zFEbxR#C1~=>~>S6WDnQvbPC5vuap@opVxM9&PSaFR#&P!(~GxGlydO(Sa712S4Q`p6A9(G#ysF7t^A0 zSG7q%t`l~cd9|zq>&g5M;k3ieLqko5+@x$#Or$%Y^*~J;R91)mgQE`0J=2yKcV~O( z&PgwcL!4!_bLMSIM|jnzgW{>;hg&0rw>vo7e-G|z3twVrvwXJS0r^d=58fCdbl^5w zLpc4Fxdl|OLrVO>!yEa1TGmMkmzL$Q(&ingd-7H6(g+rzt)%^1+rK z%BwJ2uZ)apNep$CMd3Co^TV?eQq-0T zgZ%7-^JoScKKc}E{inT#)D;(I8_wM)+%mTi)_!*`z~`eZg1Z@USrO^u|^^a(cazl*IdLoAk7x74=KXJvB{ouSSXU4n|LH zO4A!5t(^DPhd)>7qRQ$dx@4)vpc(H>Oz&M+8fj~MHc1W~638!AULRM5jux{1FI&Fur9l;9m`wqMm zd9?ERCKay_<1~bvA1tYsuEdhz^w!1;g-gJu#ssCTbnfyXr7LbB){Z<=U`id=oXJdC zOtYh*%w#Lam8gu$c5-j@+M`ICj5S&uA$E&H%00y)xwWmF;b)eV@yF{hr_)!4MDF%Q zIU-rcbkzW5;*e^82yA_a!z~06i_j`WI{;>uM%T z4tH1pZF#oz&M6b$l@mXYa0i{sD;aRvD@Vyn!&Mr*-5KL#BnyOy1Vc&*=rI+sEoR6w z?aonT`R%hWz=wyAty~2wnF;0u%Ha-+6Gzxi^sH6RpW#LZf_3@{tMVY+mas)Wun(Y0 zWr-w;Ga#oSq&0#0-V ziqIMkQt2Qo#%Zk$5tDJL0XQI+JYv>J4D@+&>4`$>(eWp%JAdic?C0 zDy1kqq5u$GIT7lV6XmI+AAwP!=6250!ph$h*-$=4DVpEUvX$NY4J2faK6=3yl4(@6_AM8 zl_mhC49>^l{ZzUxfw7!9NU)6Naxjlf1j)9-P`~YDN-=>9#p*Y>DGSo=w;_wrFXSSR zGRan~hN0GCh-Pc4-71N-wQTIweKCSv9c}p68$6!Z&Yl`0fZUlUEYDdCaF(aB)bM!f zj&>I?x4=~h52tcOFEB^l<}`Fm8O5#>@2FNIRY@0{RI=;cO&}Vnn_f9IGysh*7R`x! zEfNW;`ROIMOiST%<#m#)*HkR?HX&^oIo*Cc*-b9huc07G-+0oe%1ywLma(f%#x)E> zs&*l0>s}O&N<~g}9ScNdmgNdaOSG&s7*KPJG&_miH4WFycIAwF8G9lNnac*d7KEat zb-f@`riR&mN{G?Q06(C~OA5os#jmK@oMz=S z1otgR0Gjx?Hc0JiLkQl{A2d}&s zp1OHy+bJ>b{M=%X&~b7l_Z~4Ow#8TQhn3WlB@Y;N@zs*wWDLdB2)bQaD@SN6d^d18 zo8L~aW@mHWUt)xkfg3diixEZs{mO zY^jrU3)wBNw@kFpt^m1Omt!Jiju9c`vQ;`YSIdw3<#eXgG*D%HabYFjzUXM!k1IlX zSk2eZFUxRij5;P$wv(lIUC*vYDs_!DJo#Qpw@TWMJ}1xXQ5}y_ zMgf_#DO&FLG7AvB!CA&bEv?f)8Lx35=s50iFP_@E520o&8=;RIl0?t7)@%FVFc;mr zn?hrKRdy)EURmMK&-k_IHBaYwo0k|A#^lB6dwKb$WzsH5tfZHQ>om^saqyO9%sWAX z);kgGcqf5JypyAKU4x@{9D`Bw=3cfeBgnh%wNmH}rP__;2fCvozQ{)@7HpN!tpXST<*0ZffIt!M9r9eE6{L$W@xx{JQEG6_%AXWOx3X za(f;efEdw^=W4u#ND?`CQs}m0?s)pf$@Fo0iQrzTIs>65#}Vbt&s70DMbT*#iOkAO zm;TZyF%8O?)o1pcnW@`z2I^?@$UbePETcUqlb0c7w_=o%_tJx@B@Y7D`sadJ z*ZZkDdll>4*odh)4rvpgk;<4eoHCt$mrhMMYOhC5EHd=#DvSvj^}Yo9U3yBMUAj5- z(M$r*y;-@$x>uFCjjCfgr<_+-a9tZO>xn30jLXRqb#KF`CAbM@@d5~v686zra1 z5y`nn?5Y2rK@+A@^`PmCR+CP2na1hIm~z|67@ui4*ynB7)T{zYKCILy=~adtix00L z>I0vWVVDOmW?q?c_@FGfNHZ7AO?>InGREV!b;8w5P6xAo z#>J;7dTzQYnclGMrm0U!jOwI%Z?7$d2zHMWgg&kWv?$bRkc^GY0q!}NRIXZDeQ_dF z@wq5bl|8eWWu~R}DHr_cAC~E&`W)((yTmp?a?3TeaYIHJ1r94UIl@xj2}{C%`+;MB!g!MRmq+fo1EGvT+92jT-Rr#+DIQAWuGp+vF~F z`@)`=Eq;@*ONkvP#MU@kyWY6!GDsvps9^G|*(cJomgfSzR6_Mn zAbH|ghs9*e22Cu#O})}u~4Kp z!aN!uYw?4rilG`(RMc1QAYv>;+d1W^y$Ym_H5Hy?h^3F~Sjgx=dc`!KR*!pf(qrW# z9=AMll<`6p*Y^?mPQDDYZFr5&ny)sc*m%Sj~JDb zdPXIb`;4kE^pswxef^R?VpJscjEZ>Qs7SfTs4}@@R6^?y{iW7OA1mL8Q8CJRq3<`U z61OrceD;W6Z;?{g!}(}zT=U=Iu^i~iSsUSYVTtH?AJd`6adBqobwVvMM!uabR-Y^| zRH*I0UzHA>e!N+v)9qsZMJ>}X+7&$3dV*>b!=y3w+`bd`uwL6ueXLQ?cH(3y;N2*q zELSxaLv<)ugIyl-?qQ>$zQua)*yw02ukiY(hf^*vx@runNEliQ)Qmv|jbl)O?j3^~ zhkiyU4>p1FRez};ryRoVV2x<5uZsKLkrpFL7QT`Ra!Aw}|BzHI2`7jvO=x4+&#(P_ zDpTVM58?a9QJ{~Eqbl#iU~Rh@iw*2!~yml)s%Ae^Ipz&zt$SP0m&?wBP z-;0F0XdP-!_lsc;{zbYsH3fNafd@Xy2dzelr_<+F~KD*7!Joz%E5ZsA64d-F61mpbMAa48C*S-s>Y%LcoPH+?67LUqH zZxz6+WJa_BynrU}#yMEki4Lxt(1@}ZxUG#B?ibnFN+xBJA;I>bl*0NgX1W>)^9W|z zJQN^TO;@PRO+RzrMkEL3u*K_I9@0Iv=LQ5^|s)lsT_h3}@uc9D@>(u|a%dMKCG zfvK<=%B4+6DQ-eac@t8qTM*Q4X}%eWVv?s4)1WA(f^(dww zK};y#PWvCHyWiuJ8!-*4dj6w~SB1 zYow~-bG-Z_pWqFq6wzGV22Mq;30CX~r=kZm3mwobenDBssRxK?M?5kEZpBkVBOc*a zJfI!%fVSeXmRj)yZN*D)Bc2gz@dR$fBif2b)QPvgd(+D$!D2M$cnk1Np9q5`_KVs1 zi`kZ~-r}c(u(t0vWYT^CPd(woUkmijHg3LLq+?JW9t>qjH(u-7Fs3TPN+9dbLdn`K zXo_MeYeE9){R|7dp|+kvF_ZL#W9v%_Q_+*he4hLYa-Fe!7rDx>ICo2_k-#_Q#8anS zYK9!Snh*AMui&*l<@8r>ezwwS0n7{Rl#m0q@=bJ{(+)E%{^*f{j zT1e;RJiA)NM1Pa>xVEOZzIL@J0k0kslYb+zs0x9ssZU-kR#&&nC2jk|)4hY;y zxx9NZUmc(mu2K-*y7#)jyN56Ap5aB?bnHVBy0!{~CDurY1LJJs%CDnsd?^#(6WMvOT%6C%hVbc)fc7{=kD2lD?0Rv9&lJd7MvaE( z#u=j@u8wCn&ztNM91=)iOraZJ!4O*^jcbokV)bTvdU*IGNngVfzXo#(e1LMdd<@z& z0QQQIQmJ4`=gA=wA;Z&Mcvbv2HM`?aH9P(~UCnOR`o%s5li5ApMgNEYN~AY)q&H)v zH(jJ1bcj!PceYA2{7#wSXG&haz_N3AfDdkO!*EX0eoh~s?%=FyLsG3YFpJ!Pq7k4} z)b=xc4)%Ee^dqaA1{NPS+u#GXD|~=x9}WF8SWf4!HPe`UOy}A0lTJb=ZH(BLR=nN) zVnvn_u_BX-g{pWw{mT7=H&B0g?*{?v+jDS(gMspvw~-m+=IQ- zlb!7&Tx{j5wI_RDe1?aMQYSJ(l&b5;(;O1*`MItKC2kPxqnf zJ-j6(-o1oHl1vq4@NsTw(O6>r+%$*sjp2->_Xa9pnqC&jI4sg7w2;-}Or%ZNwVI5j zgBS$3(7Qb2ht)I?4V`HN``VLMU*8FY~k*S=(5qWrd0VdTW*XefVN zLKw|}YtTk@Ahr|>E^SS>@EA8ew<^DH^y66k%`(d6EeYULT34v5^c#gMfwd6;mgo$~ z(RW6XvRge$*yRJJ5{m&%oA0VW+CJIeIo`uBDDWX#A$DiCsKbUxT7%nJ-yTU#s!9in z(M&G37ENLxb~74`o`(m%c3&mB0 zflXB#?(#LHQ^|$WCfu#w7=e{n>b9lfL2O^K6@#x;BW2xKxF`pj**|!kz9=shk)RwY z0U_42y_3_PPQjc=uIveIw3-M`tqJPr)sZ@hcQso@iK^`oE8W%{Ub%_p6(wbF6=l7c z>G$O5(MP9w4qbsRwZ!MsJ2~3jKHc`_Pj@C*h$%>n7+Vda0SS>1zMjbo?OCV*{w_Cm6jKs%s67(6ly33-aWo z(1dWu<+#!a zRv>1HI&$&|qKR`s*3uJ{Upr0JDTnj$@cYdDHgL97xL9x1$pTzaILQ3 z1xoSH@hwgJAV|p#0_iA|WkWzMNsg^cs(^4bbc4B9VO!qJSM!gJHAx9%GskC_FhFyr z=umuUpeQ}yUg$)?<_UGoQ#2w+!YyxaGZl#?s3O5%;gX^(K!(IzEv7_5m0?}#Hr;r% zhyXa8&KX!(PA6p>k$6E4u!&}=f@DdVt5kJ?utjmPIme3oEZJ$H@s|zTS!;#B^2lQ% zUOdTHbeSxyM7TQ>HDgLp#nAV0a+%r0$|NLZDkzeFsExuUA(YT;n5RRXy|3ptSODZ> z0eCStP;|sj~y1OJwlLjeI#Qu;MV9Hq??s&F~*5S%_FWk;}?N;t)$KnO!U#H_ig%^^!u= zFq|%D;g*157mG_=_e~(g!`Aj{3x}Em2${Daeh&+B>rJMVnyrFZh77?w;8iuY-~{3m z;j33z(vQ&HMi)PfOIF*`$87b)oU7yYOEe2S;-z=9Qp$qH#*(4wt@NXoI^hl09bHUw z-i1LHM?yP8ECFTY>=;7}0#n^i2*I7&*F9XGq4j_ZVcQvwO!VZ?nbR1V`4YP0yXBJ} zFGC{qi;E^XnY$HkKDW_sg0Q*BUzyh3AwKK#MaVV`rQiG1Lqef zcgq!xxJeop6_ukUVstn=+MKcRSJ7l8ZZ)I0>;1ZX5KEq)*y)s=JscIY1BZ&OQ0q3U z)TfuT1&#n;E_Yh3^?&Yop8w>}_(AMd@s zo8Pcutfwz{A?RfLph{d^+zO8%taK+axp&O&U5;>QQd+^{CbIb**Q~8ILJ+nxc?yA3oSQIqoH> zZ}GJvjOKz%ri)vClfIYQYJQ0s9p;xG=wXaDUHDs!w(cQQX$Lk%Z4{$b-pg4jM>AgG z=;XS3HKrOf&W>e@=A@a;WPgxv^|VQkxgx~&PNR+LsU4TX_~tV@amT$0<6SME!!2~8 zb=?eOnEJFguGEgEz}{skV!;&f%#@|B}SQ^EiXQ;tX>(Z*>7&kC?H$u+GM``v z!uQOm#`pHNckv0(stkn?axQS}sb~)Sm1Y!c(*2w zCv6=r=_Zop0fP~as!K}|qihLf`%9~k=;>AqJnq5eg*scuw?XS!-bp_*!uT9*7ORB# z9^K-clPb;ySDXO!Qe{^)b!oQ41j>pm&vCvAtx^`~d|IMnS!It!bfYH6K7Wl@PjE<% zABXYdG{Nx&;SS1#kgrQbeB9MCjAM!6WVIjL`C(7=iAurxsIC_!y{v1;#4(-A_ilwR z8Z^?tCoC{*$J!Q1xQG(Ep-jA9bG=1!I(~}JI{CfS8ug~>nB|UmlY|&-95sYE7|+1N zFJ@NZ})@kC(rV3RW5KvMo}>AyE)&1b@ww*1U#6Y$nq&@zEPxDdbXsS zpzC)NcWvLyS89AUf4+ms`;>>yFwCS7GQstQjGQ*`E#tG4M@aAX<)SK-uZbpmI#_&q z`DzbGSl{OZ6{XQNyb$?x`Lg((I)Bk1J;QNvVO<`s6&&HUiR={v*B!ihM-K5hNSS8_ zqmYdy_}(!kts|G*9_utXaJj$Ug(JsrL>IESK;2>r^$6labSPg&jR(%r8V_8bUE`7c z{u&RwV>O@Gg{-|>a{~1k98`kZv{t>o*r!<9R-LK&eYe&t^^AJJs^mbJyV_==kk&W-n1tU*Yy%?G9K&U6TVLz7rAz(MKu*M6t>< zH-QAxZC||z9O;D$0r3V>eyx7Xl@{a5;NbKqcPddsbq>zcoP+Z)6+!P~i6-ykS&H|m z(AxWWGMjCB_(DtPN+HDb1YMt+T#wahlXRkc*Hkm%O@4kWtM*MJY_8SR9KljrV)8vB zvKH@ET*`PN)9joYp00DMxoYQ>=)q6)O{mA>oKrWY&(Lv5(s(GJ6QHMQ zXwpkYtG$vpVv7iF?M{+`pM`z7l6S#4t)D(hd!`KzN0a2LXctQ?{iIs2XnN=;W-b|lz*~G$&NdET zqUe#XmN#iZw2GupBkCEPPIms~#D3EHN@AbJlTXuBvsK3Y7-BybDPv_!pHS=-ax-2^ zd1rC7kV3^^1KzQb2tHZ{5rKfiM@y`h;n*O@&^THaO9Hdip-XKRh0v+{LeyiBr8Wws z)>)ubIt#SQFbb{FSt0dJqo#NCR#-a5QHUMuD8$A*B5Aa&9RqPO?tvO*Isk4gKlua9VsAg;LVh@3EJzwQQBfgRa9HXz(x>AN-{ z?5zzPAAW$>E{=KcLCyl+uq}NLsJFV4x{lgCqB=*!mtSPcba!^Sn-t1}!9v6?Hy zGIlH2^5$%gN2eQJ9E)16RvQe#&+w774!LyEB{6EE&i(WdPrTL(>n8;jw0k(R;rPclYRvYrB`qg`qfLyShWeQTO6T`lm9yTsB zcUk;ebIY*CjXt@=A^t`x*CcRjLLpjbVJOn`(nEmhL+~9#JZcz>-ZB#p%?-H}Vg-*eJV^v>4Y?)5FrOpnSX zcAmp>CLo8<*C0t$22-`GGYz0uq>di#ZRzYtlPqB-SwfN|f)%d@ja382`Tp+XD&c}C ze+g@py{FUdlLIdLaCy522l7ZL zX9k{XgS5gfK(12JR9DynMrM47r;uDu#O2^&R3_lI&@??4RV;D)*@rbGWB4q&a5ef9 z6q`scu58=nXxyxcra+`)4g!x9&S-5(jL?_{@lo?IV$VdB)X(QLO@)zbb4i#tnT(B^ zjd0YaQ^05ug7=z1By=K;X`mQb8)?k`nAwO88mX_<$`;AnvBwNYo6K-ymzmPoW-gL* z{OV7$nQAcFXu@85TQjh=+Dr(A&S;xP&sdecb!G|gqt5s0PE|{IqXVzzH3bg9VN)6&vzQf$JVaC{fuVcqT7_(&~b~I;{)}~1qw`-&3 zYOPgJ_0~lJpKaqzy0P;Nj;KmH@>&Q1`v#fPd#8}=_K;b|+k~(*?V_NSu?wN{^+hv9 zlBOJ4&AkK*5t9i#XN0T6X}nt!A8lupX{@aoZNzHoHb?GWyUTdh_A=hKzf7vypvSEp zVgQGC=K0F-$@XJBEhiHS1s`qanr!7>Q5u)2`q6Hg zW_jKG%V6r1DaoLhpqs30z8S^F#N~l}!MtJ56fA92@(Af{hTCv_RdtN02j_a!zJ4WD zQA9t@_3Vp+c=DZ9WB@#lU6xi!1q}NW&e7@-mQ1DiX0_7}7<1s>9ym zxQoc$;VZVg(h>=?nnF|pb=+8&DH=W<^EyVA>--r?&kI{A>_(W2lOFe9d+|N!GYIVg zu0y|@X=#fw%7-)y5ZeiD1q+8O%>A*I=D56KGeNKH8W#gz5@$lZ+>NCMd8J4X@TE8v zA;w1}JT%-m5J}Aunn<_2P|nJL)n{3uJQgaLlf!%>3HHY2ur8}Nwam*6Ygdu{lpvPs zaC5kryKhza&2!3GWGM%)^hLuG`1Wnxo-;)nhBL+Yz+M&%+IajhML**Ub9h6lMSLVK zPI~h}7_0am!G&llzZKdDmDm}r1-FZqCF$wYcOT;eN|g6aE-041QiIUB>nbCbi$Iv` zh4MX+l30eOC+}_NOm5HSTUb3amApAk;pyU4is~SjM@F%0n^h|DtK=9&KXrv=Vwa*r zW1=JkC1FAw8;<|BLy0%16&xd|;MMR$;#8Cz?d|FI>FM#5ue9c2lwlw29q&K> z$f3LY@0M+UR_NP!F;Jl7GBS``$Jf+k%yNi7Q5&;u8Y+o=+1w;~{~J zhD1KVd$#!OK+N7iAKf4qcVE9AvVE|NWya%ud<`gV5^3REy3eGgmfTvJ%l3E=>$d*D zg68I6=?>)i$%a(&aQywma}#-6s(&w?x79Rh5r9g12Dr2Y(dFf!UXLeH%{f|D7O6_y z(2*Q!agCct>a`JS+OW4yjZ>sTiTM`X<%~gqjzkw{`P4oSRHdvy*MSu1(JDB6U{4GJ zj;i6}f7;?xy*l#x8VTZXkxSEJZg}9O@N=An^K9Ii3UC@TzAfjd++#&0Y6jD8fiznR zLB-j#r-hxMJfBMWD=CC#4)1N5TAswF9F1hnM`3VkrczQ~dXqZF`Eq<83EyK#J7tRUxDAe$1eNIUMoU@kAvqUVQ&OGO zc&?#$q<|O-$#bqL`C#GiE=j$Du~ zQS#g6ta&5C3h~-g1&HBT{Td%CIrH&12WBZ=3Y+YEA5EXhxBHIJ?;e(psm4{YHL7Yo z#HIa@+_Ar-0!XwHbo^g@w*91ulfe=%LoP0dANgxr<~JmhKqzSh*r)S!`{)P{-rKsC zCSh1IvIx2~6Q8Dce2C?-6FgiHh7%Ra`eO|rt(I8Q;46fD&;d2m&XUq(@d?=y?4M*CSst+@I{ z6{eA*e)y3bUeqd-&sa*0nuQ%7j?hghBh;iGkhNhX%aZgADoGe1v5q+)w&NwAn@R{O zwO@9~N>DxIKzAiUygAMJv;39^zx9BPgvAEYFI~@8Sm_DSD;f1TNcPMN(-eC4iGCaw|C!OGZB#hTQ(L3u;EUe3UW0+$Fh-*@8J>THC zl`kr$S931B2%VpC%|Gv^yT^~-wcgFh_yPlEPKPEVibruvNnjV~o%z7#aXq;*6lC8_EMPjf6ZSRq{k#a#ZvFm7;YsH$WL^W7 z>EZU?ksar?7Eq&>Sm4xlz=Im-1|Pb{KnVAEn|%cl!0vGJ~A&Rl%Lxx6s9n(+~PO&OgP zTbJa*-`BTT`EkLIeUME&apvZhfJ?kDwB%XI%(D2HAMDM+D2f-dE0$+y(>4vOr*oOy z;+4U)6Pt7XI5VK?<#H?^%T~Xj;zNn{e1k=57`!<0au4RCc)+!!jKM5>dj*($F<1!| zQRS4|h;Mq#)(JfCL) z!M7;=J(iwP)x2^Ws8O@36Wt52@sV~g5u?YCh&1Svom0FSkuM$QpxH+br{`yx$f=F! z_)9u3|88Rj`Hn6(jWa<1Vhf{&VRQL8ygctu>Hs|9nN|1VGc1GkoTS{u#cSCdTO<~f z6WuQkHz7B4eVLTHWdgbI^k%ZSiBGA`d7+q8S9%!816WXbXqI#VeE|i?Qfnf>qqTe=?qm;}6=Bw+ z$mQ9?t-LaZ@{%pP3<-sqk0Qx?NC82V0mK-oSLg^wQT(i&t;n=@p62!6T zBO%J56K0=xL0l9CUG55`ypD0lVs>>t-A2CY_apyXlS-uXD}GDD45tMnGjrDCpAAy!V_XpDrQdAxV&HEybhT$UdO}bATKHxogA%k;fsnOL_F(}(K zQ;h8~`aiH76?^0{?fqZg@N;U<57HAaOwf+fNFTCDLRX+X<xWb?j(wEvot&5wM36*(H#jmaw9UQ~7p#6=14 zWrPi`FTz23)LxMb5RSXygJs;^WnalHXj$e7JRAb!-8ESNjVbazS^9>NkCGZiS}F-N z*z^-*_X6@98XT$fu4?+V&NG0K^Q*+z9sRVtyE zC&w_!ullrDo4Setl&_xeKgAs}oIR1f;|j~B>=|jbJQO6QsR{BqgesL}wVqdJIXLv( zq#_2=OP++3Jieq}nJbP{i!+fIvLFD%{#(fj;wS&?H&{~xSN>dFMrJXk&gFSNi$c)n zU}1I~vY8m!2+KF$Tey7rxT4wORfS$`;W^@nsfi{@p%{J{M5mFC5wlKyWziwpAY?A! z&^#J7EY%s)k99?aRnh3i>ZcKdcoc(3D+bY84BfM~BU*S4(n^94+uGZZ@`*OQDQyP^ zM0!uv6`>lw#zd&boTHHMb29^H5SAz_++I?QNsw@diKgCG^@$f%S{eYP@AgbAd~l0d z22!Z&RNt0}z~k;QM6di{ppE#h$dl$<@;GfRwtB2Ssd8K)Rr65JdG*Mt^N2K=OLlZk zt>{Ekh&-B9RW&)}$tXVEor+>3C_ehhmoy6@IYr4mS_3QGWmV#cCFrLkQu=-42!>HN zGE{R_n398(p|Ld?M}7+HtP5cTH>*u@8RafZi^s`NpPlF)Y%06QvI;zi(miO~VZ)IY z0FZe@(>Y5;N&4~JQB9swv?Yp4=UhUkkin{FD7bYG83=tuMzb0+!Ws_kH&9ZSQG>qU z=+RQ=(W8YPq+uxCNJC0}Nlj1(6VSR>3B=;l0~`iBff8MQAh}Ub!1XL5>>{FTe4e2O zeblL=)Y+E0dQJpJk;WmF9$cGN()uLe>^)Id^C4a8eD2wJOwpjSibH>DNWIx7_C z2>J655zZFwSam8K`I3Si8>J{6Rz=X`|1k|l=*mWdAJkN7t@Tr~NKEhMJ$d)=xEidm z`T8pV@N~NSC{4VvsLZMIse)Ew4X`<5@D@4JH=Qj4mvwS%SupwB^chCdZ*0l7JAc0Q zdHY%R&Y$g1pPlYM(MK_E@q$SOBZEV0t>6=p zEe`y^n_qXU<)@y84yF~KU@g94wfF@^%1L~JQG6n;_*&bLOFA$80*}|2z~$lkl)S*` zVdWL+6kEehY}t2kqDkB+8=$;GJ1=R{Z~h zy1c?O*lk`s`P8CnoW)vOA=tFqc+#GOz~a`LQWDitc8fuBrx=7g#UR`kgXsOmAV*sa zqOKU?si9!}^^K6*#ZoWGf}etv-;A0TNt}@p_N8ICBCA>DM9j+QW}o45$-&|2KE8cp zjjsS)fpc^f_4Kiv?8O0vXZ#8C$Iq{PZ~yqo(c$3}_jCGaahI0hGd-=~7eE*BOE^Vg z=kdWCQye+uz_ z1)Z+(LaAfVJ-)~4VzD^7rRBI}^JH{W!l( z;gZKz85#%rGsEN=F}<&mmMo0|)nV1zNkd&?PI7ZG!-t$OP{BHic+ zJaq=bEF=lI@1m-LZm^gLCu7Nr&b4hAQl!#ROlGB~eQhwD*Jv%WVAeA_Naf);Af(oc zDOWI~wOJO{fGtsa0TKO*2l8^F0`u~PW3$^L`hjwXN29QArf6ci&7qwh6lW|APvx~Z zAC^5g2cYZM>@7l_qICX&gO120Adbj|QKkohK|G)txLh&ZfAkC=QnlHa#>B-#LuGW7 z;#Y8<3U(vqmBdl1TxPGRuKYPSuY(N2RB*%)opmFeQ1Ie_e3zq2UT8WPs3=8^ISZ%C zj6r)i^V!Q*C?Q*U1`Th4Ios3o;>2=(nX6>CgNqI!62m0|Lyj38fV&tW#bT!*Sc#O7 z7!hA&d@tYP$WaZAtZ)JR6#6SHyd>+fzDLd|6hD=_Bw0epiRz}}dV{;>SjH+a&tBw^ zU*ss@f~R6#koUJg!#HMEDB5Q1A6``!RgnSvzH+LT^d*~#-U6-pw8dHOe zt$h1PX^&~AK8+Ft%?kq=4fZTMb^OS@6YhF;$Jc>#glNMEL1~Wcx@;-1cGxY89B#{r zN>lHuKq%d^g3^pneS+y)qHc5r3dgIpPMKV*9$K0!9fNwCu%x#P%>WZkJap=!=(N*- ze5J+pV;M^`=d_O`S@fu~B3Mz2n=dh3!z~~h5Hi9uN?1jxrIJ~k^Tjb%aK(j`EvP`n zMhZs#j^-Y|5dCepC!Jr>XAYR!^jmD$|aRgNRtBA8D_?nPWIY+#u*psRPDPntrTrNCk; zvUbzNAnBf1B=_qeCu}UE6;dfNRu=pP3%)?R%>M3PE?h?4J z0q7p{8m{h@lvp24SqaKwf2XX0R+W`B?p=;VOQb56IOses63GQx^1FgX(r5!!?c@4` ze#x=$`|+0~S`EMgRt8}L7c+vadpMEoRA~sx`aq;J8EcqhzJ_Ec$wf$uu()_lbwx*G zv{Fa|R&%Ui;7aXijLhH%s}>oBdf1UT!>zW6mMxJPSgapQnCgaE32s{^orb_ z%BO71b^7*{NO2lVG+1gh(%=oq>wAzKhTyIw+NY#dcrhq68T7LERID)cst|;SuB3XZ zG%F3%qBPo;R~(6r;s}l?hon|HZjR6LR&#tpIDtrkoCdlZ)O1!y) zGK44&a`i(F){UbgnEF;yv&0M(Y4!6#Jck;)*@F9A4B_I5-0ajlg1Px&lQhE8rOh~PQrpw$WLl!OvCmt#fbimDp{wALY4N5Iqyp>aiAj2 zr+N&<^m|n}YHcu|DK2hk9hMz{n1g+FtF<0G>T@x_y-RD#Rm}9#Loe=Y9umO=zW0<( z#N&nPPJGhtsj{o(@+F4;c51B?KQXMXy7s`YOyTRg_gEk&-JfL{p<{`p^C6+LFRa?1kEegTS>57j4`#3Ryry5tER?>V5R&PU zyYu|IYA^Pa1{gClyphqic6te-je8b?_}1Dr7fQ!17h=b472=3H76u;H%!5Bw7V&%v%PE|= z#HkdS@Q(i@DY-ViVp64-h;{pB#7^ZFxV8rO7@5l=qh;`{WfX#Z2_0kASgn!Nji_IR zuJdUJ50aF?Z8DYPsXZ#}{$W@nQMuV1x)vmat_2lJ$ASv6V?l*DVnM>tu^{5_LT6Bv67VRu`yOptc{hlo;M`kIy|Bs(=Kpr+Wf9~ zWi4SR`1JT09`t}aGe4%`IHXq$3Q4ns0{B^eMmdzoOIii>YZ3+Z+ApXtxuPgy5RpZW zeccCm9Nalz2J?`BfznFssJ?zI6J^JOq92vEWci4^WnWVtPG2nZLR}zIi}{^4Y4CyU zWz}ciRUoJ6z)w6ZDYeuwNhGRUlx$<(&gZLp7;rf8R&T1eo?Ae#P&r_Bnj* z*V%{RMMLx!(hynVdl@h^3@yA#!3{S8EsiMzDfIk-a=pZEz0mej+8kPwJ>C=egS)det4cocQTTlm4Y_X04ghkCPFsNG`8qjcgta8Pr&)@XMl?E1$AV;P zGK`T1#WI91C#ZTPoFTxwI7#Xl(;e(;qLMZeH#Mu6aU4@Kz2c25L@O@)i4H7_?hdRL z+Y`l)9uig-*A2mE&#^Q;E< zyM#3zIM%AeLO!E#vqzt9(>EJ(Q3@enN|Cur!QG*ENlBM`>mp(np)b6p zl&^7FxNfF`#b$a<7l;W1KJzCrO@YNhxtk9ytz5$Jns1|U^f4V_u1=%mF+M5{FW{ia zX_}&d>-}U(oo2xH`nVLLC6sApp}Ce5!I~MzDQjMLc)1J#@vB6oe}Me5g9EP^`u08LT2kPs|~jTFh-$JT5^A8y@_Ozli_>p7m( zWAn=c5t!Wgo-^&SZfXe&O${KWbI0?Dv<{1?x+0F7vrq|){z;gB zSn!l5e!4^G#Uov8^3{(5`kG0-ur&KJ5DT#L1`R$fhtt-Z+gqG`M@NvIzKK^kt`sZ= zVY}%(Hjtul*G@+DY3w2Wf3D~-><#NO8t_ARhg28K>4IjMLzi#D)JW(+w6V-xpwr5c)+>4PC@c!r38}VR)hB36o6ei5IJpr$)T`uf| zhsW`0g6HP-5_~?xV;6E;oZ3sMNOFnyscNv3f=OW>Ev10Z4{6f*UP7Y44ACB9(zvO( zfJ(6lfMLN13HOfmOA;aWnr{J87Z-S*gCD2x1ap2;KD%dh>$=cdzxXHRh1u4V!O&wxz%<|4lHlVkIPKRO*7 zC3EC5N|aH8QFou>V}(fYB&Jwk=$4-kx<==KEeZE!pe6y~gqy|rw$Efkr;@%PgeN=D zESl6@35qa%$zkhXrijA%*&+(tXNfpH`RL$uJKf8y%g+vOr5h2tej2)@k-vpgASe_)p%h#n^^GLcNln_^$TK&XPUI#4Z8g}*{>9bOsXxOMK?OAGZ?GMXhCYq*|4cbbp2zpFcVX(ma0DFa5iF2PpiL{jb{FJ>{$CvRvUx zQPX8LIHX*2$WrY+DKs`+Cs1jtCf6#f>8)kg9JOXU^!y4`TaYn}v{a1TFN6{6BJ6L! zIhJZ6RVfxilbSxltxH8tevI(=IJe$q>EKPpqzJX?JG^6tp1Nt9MIzV5G2zAvQ`cEa zhF)bn6H@Pyp=~Dnr+ZI1{tgx{VA{!aijz@pqcuUR(g{`<4TE;x(9*}&LWV|Zk~X|b z+|VX@_brv_!S0^Emf^(rA6sdRB@pW-9f+-zKI2+ePrFy*y26jjL%yyIg3|xWTBYrV z_UQMJZm!c>cQ4`+le>E&GeJS?7_-yY0FRFEhiYJLysr>|BUFfmPx09w)pLi_jbhWINN4{Z{!ReetZ*ZOg9^tP&!XQTP1UofmBDNOU{7Jb7 z3rS3)h1@^)OLTKS!}hEBDf{+oOo)L11M$6KYl#jhjl5xcKY3F={rC_blcUss;>lZYyWY3W=R1{>~OzO%+ zG*c#;Qx3c>N2bk0FF*ix@=zpo>7ATWqBx1yR?5PtjES`9PEXp{O3+pTJ3%Z7`0myq zfwe;BkEMhnLd}!ndg>?o6L4!noG~^?J*4X!ZBfH=f*5L({IXY%?+%=2+8|)_BWl_! z5F&J{-vVho@bt3oZu!fCJ00llU?!WV+vMc2Y)ua&ibNGbS29pK-GvPxX0n1Q6g}1= zgfInxDl-M3tJ9ZjTpul2K`S>Q39{2A%6sf)|1XO#$2NveG%%}7tm2}zi$s%-Hc^zl zd_F%J{%3;dKYgp_FDc>q6s&DuLF9bs?Ars~rBG_^INBoveU`7Z3Iq2vD(InCL@Gyl z4<^i`UwN9;94H{Mj7lelzZW=8YzugsUQ}9O7nIgd{^%WEzS2eO8l%dTbJ71<ja4Pc=>-VU*$u~H}4P_YJ=18RyRi;ld1jw*A5D{8N1*Pqih26;hU8BE9_ ztTV)Ab5#ahoK&BI%qlThBsQfI0`aux?1Y{p#7t*`kdt1b_h=L9F)8+4v>N*s)Q4Ma zS1^mWpqr&tP=b|JqUwcJP_Td+N;J!-;3UHoi=c03e_)YGeAB(1T?~`cQ$)tzT~L$; zJ40$mR@ejfA3RnEt06JKDuAw9Ef%K$Yyo&#-_eEPsTmcx!{Imixn97sr%NZnJ5f== z)Tm!2&}ju;bkrXP6_>4<6~mi?%rv_4Zx?@ebcW49e?Kk0)ea|<&|WuNb2QZUJ1rgi zlHnO4oB@{!5=9L2Bz>`aPIJMs|ElS!Lc9F~Z_P3g8A&G?!UMphAONP)1dcXa7u+< zgMx{_;8lWr-oMr7eqA)?l_O^?oD*g+e9lxPCsLb}S1!7?khT~b&P0x6WWe(55V zCg_2!REmBW%De263twsvbo4~h?p7Oqq(#!`!orA`o@11J&zM=`T19ORc#eXfDv^x7 z7d)^zMVV}IU!ojSNr4adV+{s$_jSF;=`Cl>d^X5>JvofBblRwm*_Nyv8GQB!zC-au z0ts%#4Fi>nr@!dG&o~Kr1(WG z4Ost4d9gyVDdocEmH@bf-5PtIwV-zWtD;l6Z~vij!X!{5<5$$$J8R#0D5z##6}`AZ z$5L9hdQq1Yn@^_e7T}wJty$DNg}ZLJaX=9-s#*==yMh;_tJq$2`)IwCC85doo&2ncml z05eL|ip4sjR6QNxN@Q!~Bn@Qih>S9+XP$hRON$^9E$v&{<)0_>-z?G3Xec@P=*@y| z8E@@O^k7y%WF8(ZuQmi?Yae7}ZA`&|Ih#(8UCf0?=#VuY0v1u3B7%c8d)&;gOX?l4 zodG}Fre#81He>nwr(2vJb&QEjZE0Kwb~++xqsqb*B{jt{$g|NzQ!;PX%0qKRNY!kE zjRn?$ZSZ265@Nc$Ej|49mV0a3_D4{3Df1BCYL?&7=A`@BdEnvlg zXvbq>w029h-bhMVG?EhiBzgTmCRPz-@ z6Fo{pZFQ_=eYiN!D-mL;2JKtv#>6UJTT>-#gOX&7`0({oH&@e>%c#p$y3V7LbsnGo z^%_sl;YLfkOlV8z?Nv8qxUS%S+WaN#Kx0AT1+KM#pZgn6fQw|hC*YT3*xeo9wy(@{ zOs<{{0l(?)-rB`(nXpl|0~#XLnh77jn((-UAeZiGQa7)~odkYiR&*x? z5XrQY*cbwl+G!ZG=66P)a7yjV`e`Ymo#(@sJE@#%NcX!1O?ukiALLL$t2_;8`*hf` z&@x>4D_ob3XihTDqkoN|$H%{nq&j?V#_p!8Zj_bxHuBRV=Y0$x^&f=*BA4nmX zygu9=|AL1;a|K@6G8%^8e*ImSlJM7Wj(;rz-n=%|Fbv19ei@hW`qghniADlSJD$a_ zN52?l8416;cCx04ZmjJaUIv{>?i+)mL400*;hrm$0_s|g#YCXHd8;!4!J1$pY2&NZ z2fW{?!nB-uYO{j5q^7$;*ngMXHakBbzHL!1IDI*;vA@!Ff5ZzC57Ln&f;2f=wkHKi z>*6VeQbeX;3|_T87tkZob@$JdV?ZL}UOC6e&4&q%XL+2iF$_PXr70exyMh^~R>(VS zIufyyR8F3qx7F=jPp3?h5h%1#Lv^JTA*5$UB%UTkq4O*tsBj&J1XPBvYiZlh1 zfW!8dX@46Q&1!YC(w1h5j$)e>X_(ZB^elwEF_lX9@k-WCxRI6jtz_+XD_Q&7N`BZs z%jv-LGs+<}LkBZWA1NeTPrF`yP7Xu$1pX~osh9=BuAVJ`Ezz`hXk_ry-3-+?8N?*p zE%#Vlvw1XXx$2>cGpzJei)0G^qYBZ8hB>m+t#wa{Al*~@oD(%=;_Bre+a~mVr6*2A zu^+TV3!FcZ-8f4`W5~K==^lh%j$O~ju!DC(I~?1AQ&F!1=JR(N3EcobiKLzG#lCKM zt-UT?dcIr_Xn(Kp)T`AH4K}j*Zr%+aaCA@2>@w}kcHQC)f|l-}tTo7p?C_0bvcg5p zxX-Ct_Q?b{0|$2kBzm-Kgb}k7g=xWFltkCNQJ5C)M`46)LhL^|aT`$Rf$iD5*$Iw4 z^UG&59MhM&i|{txk5HkvlMfSY^vN6C_}cT-V;fz3ZdRhozDVFXa0CVDmIubrcR|Q>7bG9k{cI0)~GzwWJ$SN)&?De*#_k$WCl|VoeS*oNEsw&Gp^o9 z{U(#E<=t|%dAUlPPI42yYOOsVVvcb!+7O)#Hc9qVbv{Z;F*)hhG@xlvpsURayFaSZ z{>06U>Gr+012$(8aB_+03fW@PT$;qlW*0Pa&662|M%E0R#Re`#_d=V|x5aivpYPj$ z+SVymZqALlSR!8;+ADQqGZw6i*4S`=YkG?Au*B{1n{7RzFBX}l$rwhbDzI)`5h(p_ zvIi@%^6@3LboX_?$-XVWL6rwvHnHKXh8R_YQsVT}xILwIA-2*kW9q4Vw96W+ren6p zl^)eiQp;kuld~9KiK@N6(&Pd<37CJy;k^4|;e7jJGmSZwJ^6OI7RTwhTAVKGg`9HB zaHuVdKcRWru3?h_ONe@wm9j&j@}<0{5~3)?ZTy+IWkYAhg(!ZjwoK4yg?sv?ZE{|4Qf*12nB@%hTRh)-ghmOO09uZefkT& zkQUpR;SOh6#?9Wa++nHnO@^C zwlpvXlihh?*2RK(td}rM-PKAekMcDIA%b|n#7kjc+cFWE9JhY2sKT9LLE2^mG!|*R z8`ae`0+Y~bX?iJj!)oE%C(Eik%fs!gmzHL%ug1e8~rXf-cVq1ax**{yI%4|Fuls0BE1&*1F z)+oks&;+zdO5BI{3xD>Zfo-wAN(rqNg+}h(%!||E)r6{q5$&S zhiIkU2R`Pc1$N%D9(kAm9r+;Ysz1T*C^GKQ4HX|}keFYK| zheVws9&h8SfcXxe^%>L3***)78}kEM2!kmOAj|(8Q=@ z%EVepsDuRfyR9DJsg{y~KXOCajBRG?J6Npt3n|;h%lc_`CwGEn zp&3x-tdgu-oFmZ@Dko#g({NMy4BGi}PI>o4DHqPn?h?=uslWle?XJ#TiJX2k*D_xp zNv|Ras>o=rw$)8%iWBEn2k9bVyp3bR{#j&#-Oa&8YbLa;XYS5vGnq1;iYx-bRnh3W}uE$t6@Gd6KRB-Aay`0 z*YQiwG&2yJrUpahWtO<|8XQY+#<*11oIEhwjCkLb0i46b>8|$SsN_Y)p3`|_Codhl zoQ$9hvBr^*&V5IW8U8s>-y~Ck0CwctW+)N z@G7q`bNWJG*J4&EIQR>seCo;5ODC482TC&*X_8B+{g4q~%vwNOItJ7?9ZO&`o?yab zPb$vMpespK2BPsUSbZ!!Ro8%M?^XePW1P)SJ`YoRHrO7Zz~#mk=Ax?beTOGK-ZYX? zRZ@NrJV%#8arrUIE{oEUE3;LYV}Plfr2tNGoEw1P6LC68!<63AN>PjGzt z5eMYM-6$1{=Z6w@Q#}Ftd0++AOt2Qaz;-Mt^k~mZ#moe_&^sQ!z@!%u^v6RrtdYBK z*yvHpRfuL3V{)`-Cj(YBOy-N~kRff)!mclsg_8Il=9&=%#5Uln~GR&YKgk@P0;FeU(i(b9@LHi;zG3l@8#l~Z6s3RPA&lu?{l!V zis;><0*LBo_C1n_O-D2x9Rx)AQEH>_9Lp?`{B>icf+TD4ZpNjdp}&@0+spvteWI|wQuqCy?&;o z{1!t&CF%W%h8!lqhD2HLoEJR>N_3M%J`|t)Ic0%3&>lx4jhIHIxD;MI71fiYE+o{0 z7+ORnbFK1&q&3?B)urVzYWe&H_oaxenOeX2Ide=%Y{s;u#3tJO<&yD^+9<8lDrftb z7C9W@NXBsVYuz)IN;A+oia~5$0bm0Mz>iNS#j5oDvSJh zDx$>ErmUB2IQXlIw3UfY&CJL6G|BBgn(M-Kqm^1bwVsg zCt4jefx}#1n->wO&}|bvbi#WNr$>)Wm;PdsBFB0wAn~zO#4dP63yuh$20K?;OF3iV~dGQOe)!E zv-#!OM$`&Y>=P7%BvDK#g=158e!z z(Yw&(@SSKQU6qO-bX6kj5j;yGBN3Aeq8f)9+oHT4o2nIz>Y$oo9Tcb9JXmXok%?BJ zlC0Evfn!y;Yxs1)L73;=uI_9-onPP+5xaBbu|y(bXADY0HjFupoL~|rE^;H@``!BX zAAFhB^y+h<-dIO<>H18 zDy3UudV)Du{=)vXeql2;m^g!uma`*#qmq{{j!{#Gsxw2cp@Bvh)oVml$A~sVeqzl; zG4xitHn>EVCf+D6wYU7j+^&XC6r0KA;jjGG@#AG6j`a^@=uXKS{RZ@ zNXe3bl}6Ve@FYe%D;8%k(ZK*4ur;?uRI+pjPu>TvUCs0a;D*m+8&{eUT2+jZuDq*@ z8*J61fK@Bs@JFNK9-kdv8^>eWxZAhGLf!yDwf**c{pzFwB_VECLW9~7s74b92rE%I zx=Pb6n=|9N&)xa~Ykh5NN=?G(!)p0h!$lg(^VwcX+!oW$_2`tlWeY(`BwZp+e$Q!+ zd>z(g5G|Ek8&%@5igdJ1Qn?-2io#3_T&Ku7PijOJKTz=f@{91<3c|fD)!@U7!SL+> z3pY+*A#@5^1wB*&y6rPyfW!F+Y;wXN!a5Jjw^{SmvOLPs6Y|3Y9^eW&sk!MxJ_IRd zJC@bg1>b12EQ1CvFYx^;^?Ss@T^7naWwQs3!XT+-<Lt(kZ?oao3Wt*G@yj z<{`N6eF*(I<0MYwi||@QndljpDG+uWEvPQ)ZkXh!2sCa`{XODwJ%_NV?Sw$$u!p!% ztk^>(C#HVM2^}jrD^*PJb-f4;OKuika;m!pK2p6f9)M*iqOki_k%H)fl3D`Gk2nd5 zi921ji?}y-4Pc9_>p{%gzLK-Nz&Nr+s@0dw%|oe<&`1OqGq?;m3BFFg(^Z$yw`tD= zyR8mQDt~`ipGv?OE z<8bY(3rpLqkqbuY!h+$>Ra#m!1tTgohavafCuOX@E_1$2(^J^Y`aRGGWqFLeO}5mH zBCkx62&0eBsPPFKZG2+rH9liu;}a4!KG7rNCVHrQ0;tNd(KFh!c?}K=JT>yXgd#BZ zVKR>3fl;CTTrF;&`bRjiN)dE%@&XN-Xt-IB2ON<@0{kYpnnvusY&7kpl8pP?8f&PG zdWN6)j7LgDs?7h7JE#6bXKpZ&66&CDBUfPJAJtqF>)Gr`e}LELPWQpZicEL#y5iz< zU_oOQ#bMiKld2}bn3vl5Nh%h-j+3kE#75J}oT}Z2T657ZEAg?npb4^*&Gi#kYgI8B zP#!S}ONhAh(xlPuA*G?-@PBD|;`c4;N*}Yu4d3PU4Nt5z3#DV%^l2P++E%fcwO@)Z ze_Rr5AnBPDE@BR@rQu(>k3YPILX) zE#OThAc8cKEG_i>kJ;p_()@ z$eA-C5^m^dRnC$!**s{H6X`{kLX_XtNeU^it-xhICeA0OXhfZ!1jMV!`DsKBC8X<^ z0``1QlbP_fQYO5$tw5ktjL&Tczo-T)uWa!TaxLR}sDlcIH7RJQlLB^hQ{j$eY}i`= zQ;#M@Y!)hx!Yik-kziD*WFUYuPJQ~a75jTwn zs^IhwYDCU% ztSE#XCEvT<=;P$;bHU>^Y8K$UI@8tHBH9w)Y$(?2bW+jN|shK_7TeOadj-0a2g zCv&%ju9jhE#zKPM`JNkv6Pvo3+WR4*wKn<;Zc1^jxLtn1u!j3{oWp5|^9dDluBIY^ zpJ`ZMAWmhBl!Vdo#QhRc;;~XOJ}x|V`L$jofo3U>SUE8*qj+MMr&wCMMaJ)0N4X9Z z`%sY&6!#~KS{;Gy6x-#~TCAa@u0V51XOT>FEksn;>O>40o5`VsSVzQ9Gb9X;ZZv0% z<~$w$LUo|{;^BP5<;5Hdc+U=F!=CHrWiyQu^dN2U^l*O6glGSK)&=M0t2j1^;c8q6_B z%;7fd_G(JrA3pbZvaC1mNX%KO0G;^@EUCu2-ik(03U{f8VjG#Jy!d+FwuN(~NCh)J)X;~va0rB4 zW;Yp4y80P>7R%sUkHTHBmtCe)h)aBVqk-jz4}Rh@TJsJd zb>~L4K13ka8w!Y=R-J%odDiuaR0KKS!#Mj==jaR+7PX~3B$+*}E3`--mfYYzll6uU z=-F`~EsAlCl>d@+oby!0p{E*>KgGROEs_iM;$j0lx7_u$>9YYQBtP9b8GTL+=^Z~0 z)4YUVOqZn~qHBmsbk!%s);(Q-6{D8K6$Z z4LDjTaNyPk^|r4O4-R+0BVgeRr?6c|Y+ZI`$r)+K=(%vvNT2)*vZL?agG_RL&1Zv$ zfjTWkRi=yY=?>yS?E3IB%!VP)fLnPEmoq)fiUqY6mUfboU61BR>v8FNg4J`|M5`rr zvw+gaZQJ-OVYY`=#g7f4$vXPR%5Qsw)igGZg7*Awz>-XO%(6(34#{iH5Ps0Ah^cQk zgwh%NzWNh~d?V1;bm>%7?PnV?i+`JvWvtSBUsaatw8ABcGV2o--1E+XEN!VLsiHFCE z!?e4DTxFuXxbt*%Tv^pRo~aIrp?>}oqGF%QxsZed6=#-_iW7dY;>6Um@>-Ce)C|cw zWFuAPm@fP`mn(ZaEBzmWO35-kFu&|5?_NAGgpIn?y(<^-D+e$!o z{1K3G&=S#K4^vz|e!q0RC6Qf)6WLZZQG;5fNqr=x*IOW}bPH*mf^77t5#=B<C>yKG* z{1IEOZ81h>*p#cAJ~Pn-a)<^Mb^|ySx3lI7L{sJrb}Eeg#>Tmvc&uIQ)R2<&hGxR5 zdgGuGvG`&2PppBAshFNdwJ|eF<17`lQ56^5ski{4iW4}hNU%6ff!5U&utS;xOQfmK z(@!Vw$F-GM0*z(B8s;?7$2BK-y!HebYp^nmYca8TO(uF@n+ZRt(Zm*N^}`<@t`BIH zSt6|_z-yK1IAGSAI`BEu&zWt+Gf195`AtAa`Guj|(Q^iY;yLMv;u)`s@7K>Oy*!d@ zMxjEseY?=vN}m>OWey{kz&fD;$$`Xf43oI8gg|>LEG%ZQDr9IVaM1!ClRM%XNrE#; zCfYBON;LCcrW@NO+L$+}xHZNKM248bjvkQTm~Y65$JDek-&B;uS~Ssm)=XHn}R&dBca(G=B|Fx01eR2-fq;?xH2?(>aeJZiK`Crb2x|$1&2rTH{Ng(%83jW1~Cpfk8 z@X$6lHN{lZ>1Gf|e{<1#qEqKL${h0ur)3!P(OzWbodsyN`=5^Y{tUa$pXp)WXRPO( z6Bsob>@c=A2B@)Y=oED%%r0nUa?CyIcv#+u**X_<%BN)Q*A)uD(XT++Os7JZ^^&0Q zl_!WT7SSZ)&O4Nr)ccN#J-G2AmzRV_EmKoEw<{8^o^i8rYW1-?p)1p~bYm=`f8{cG z@4#g0u7~tVJR|yKxT8V|4bUTC#eh|?HP%hsh)>9*((${Ik42cBd4R&=d63P^0=N$+OTAaveF*Q&YT97IF zge@fYWQbSeDGp2N6V*zn>bP9#@0mnUdb+t#yxb{V=ncmmjtRJiZl#3Y2 zR}M9;#pZfhBFVG=rnUoUIm^2&X_O0le9f4zrC^WV7Gq6Ve=Z7b0UtrP>rK5?RVgPW zPTPfI^)knHw;0xoC0-L;+%DV20!AZ8@+d-psoR_kUR`Cc7IGh-O{?}$Ixw}Qp4dtC z*0$ci$m^y$a_j)EBynq(8^zo*t!JfPGg7c>JnQkIRld=}@s%3-)-hX0SP_K_x*ZwD zKsQ-#afq=!#cB;Im@lcClQBJgd9c&_9?y7*t7VR;QSclV7Hq?CCEM(F!*207YA!ph zek@-0+vP|D_a=2UL%Q0c>lN+1ucqp#!pu`DJLu^)BRik=99=g zu?5xjm^BahW3+siy= zQ;aQ&cth7JluF8<)8rQORbArhN>^#gjp>}YK5C2=`_-S8-O({uq86h&e{zib+y9&7 zLwejk+`TzE`lV;)P}Yy(AP;Q0Rz=>X?^Q23v88fUo050TtTZ3(l-_hZ9xhlGW&KOv zgy`B+@{Tu=XCM{(;FOk_>fEB=fCs0&_|%W5z5mYE;VQ{N zh{a0~BB%&m2YEhg_cWD`uNZL9vM-w?$Yae_0(JmW803{tnh`{aRtw)WyaCY$Oxam6 z;sQeC$SV>CL=tMk=}jVi%*Tb~&;0Pak44gl-`#pIZl+U}k3KCp9a)6F_gtl8*aR_K zX$cLZG*vVe3+_|BFH`3cnoB=6MT<5FMDb-S%2u()<$2wNx9 zM-z2*QW8h4v-ELQe4nGvuCAdcqg$lI=w$)o5?2)M#G|RpEq|-34FPN$;Sj*yUtE7w z+9J`#?IjAp9SN}fAZrACu6l{crN&7*=Xq+W?WJw1EMLuzoR(^{e*EX?^{Y2=rqNn) zOS{9G&|;^K$~KTbW#VZe)OI8&Sy!+(fRi_dqcj z=*^5I9!-oY9?uL2rU%iZz#wC*7e6Ip;5m8ksKwwa9~QJ$n>k)Bo2jW@H>2vDTBH{uokvG4C($Vx-pOPavY2u-mE{5(S?M+EWdES?D_m;d^T$^lH2WAl_jRU}`8#QAR|MHs%VK zVB&q+l^N7HbNi{y#NKx91g@X&lv`#h9jXz}yq4luV;Cv^{&}o`zVCB>xtslWxm~aR z>$Wx0eSMSbo2zL#(vn+D?XPG|&ZY!p467mB|2jrwxU3}^I5H>2GG+md(Kcm6dhOXb z4zyEa^vy9}E*{-xeIm}xvAQ{i635=OHfcb0;0-+9##(YuyUYBm7~^Xj*jJU zb<5Npa+cIP+{ychJyB7I(3nx71GO40tW>E%txkoRsw&J>x?yC0dbHPAw<44fV6P$x z?o@=pUPXX)D*~)n5wek9MHuTH)~g6%t|GgaH@*f;v}S#W*G1lV z;Y74jzb@{+E{@g890*Lq3bNl~P}Zq2DaV1SmlY<2`HS>nrMH|1oS1?WS5Bd(J@`_v zm1B}=l}yvUI1^P95Y1?pN&1G-OnNQ*aG^!TS>7*SJKx?C*mjVJFCEE>i}>0$Qx#+f z>K$I;kMoVPH3kC#KWuIYS>h7lM|FUbzUR|d#qB@#`;M^mZ4qM|TEoZtZz{}( zi{BSE<3zJsXR4_n(@a&K?$wcxr+c-R20z_r3|=s^^?bU&Q{%$+?s)j+l`SYyfBhw* z8kaUTsSlA%b+&h^I{1l#NW&%yf1R0{;(-XfpZRy*lb}*4WO!Ps^;%q(zkIqs z`c-8@VGdi*L~~;SlTE#tW-3MjHSbJhIf)}Q8v7lJ-^a&FO+?XSI4G}ww>+;0pAIyi za){EJxdUmbn*z^IufH`nhku4dPtRSP?ihoZ&)uM{w zCmW#UVa#66Dbi1$G=D^c6Nl|)o+&54Pk?hr_f+(!DgoC?tUDz|u8yiOAuf^Ew3 z#u5kcHu5?Y2$>0&|f?EK&-dBt}9`uTv0q@vJ@ zui_LCHd9%Yy^!3PMAG!5VoZ5H7B`O&g|uf$tNY`}8ZKZaP@pzhXQVmaDJC#j;Y1S0 zlSvfoS=k;_UAd6VN+Xgi1-&x+b~2xxTut#88WCrYeqbluakEUvLL9Xk8qKE~`wX(f zT4Js_yyYqFS&*ITGP@CI`M|g<`T5!$d3L0zr)F zzxzhlaM$P=>X=(bUD-0dYiJGcWjJDDIx(4!wJ*;R8kb@7mX#Tdjx*IN85*9Qzq{}a zRRANVkOMh4Q+!i(T?7&q2B*D(b=s@IuE7e>Z85>n&2*&AO!BDF0+z7VET3<-!r>Lp zdh01%&1bl~lB<6E`PxMO4CHbtX?#BO%hSpAB(ji<1hP0qBr5U=RAA5pF`zyz#H+Qn z5(Pl3Dj%Iib#kT&9y*?wOiFRytMN_&M*j!O+DuLYHmEP zmkYS#T?9u^<|-U+;*~hIn^e^D?z$i$K6@HvupTB06*txd8Brx8Ulhv<-BG~mJ(6H@ zO;+_{+iY=nx7_eu(3|!14$I7r0W*HOi{ftovVOn|$!(uFR~2W+S9fU`xx)&&QkKA; zU2_Wyfi#Sg-_Fa;B%OX|Yh1oH0BbD87HF zRD4_q59x|M(J70s%e!v_mK;|12uf*5bj?YSV*3c6Xq9=leJl^$+Y+Gy@|%iE15&bb zaoCuP0|3X__K33BB>6R;aIPfw5hJ8m{dd z=du+F=Ts`y1Wz0c;FzYL;`a?c(;7Uf(~5=S#LY%@)Wx5dUW~| z2T_s&yg%BbXYRh=;hc)l;VD${4@Grf*+Apu!3NvG)y zUZ;Op;VS#hM$KwEY!55cNG%hpjD$eqj3l1n4Kcpi$X0=X^`dQ(DS``qSZtet7Alr_>p(&l-w4( zyJMW-vDSdt-VZV5$hx`RKOEz3Y&nuSL{8l^$RX2RT^}e}+em8R<{n`SbiZ=xan2I= z_gcn8#h}+Bd0B8q?pF`>(zH?(R0>-Px5qeOYUQQ+9;51gB&f5zFQnw6BD=XzM1v>A z8xqZ{6=(;W|Bl6Ln=z&W%a^?j<>nN;_HnykJ-)1-=^A{Tq;ZzF`vwPqCk5n{Bc*_h z(Y0qb#|jJ^F|W$G64)*j6SCCM+L$@W8+aPXVMu&YibR3mK!VsW5P(5Vy?QUo75EIK z09Eat(+Oy_MQcQw!TMLAuT8t`R!9O>f5*2PZUTpiV)gTd5d``27(i=%`*wM;D8TOP z>LE-f?oJcz`{!N)wH-&Kpd)>*ST9>_`CZDnYpFM`__!0(9!cJ`d3Ph@mb#vxXYq_g zDbUMT-aUw`YwE_S01EmqeBv>Dqpb;%>8Q4&gBJNwOh$Kjvtgi4c~1{PEz~qF*Q;0M6%Si))CM_w$$aHm(bE;ku;67giT6_~uz$?r)oO zG{xa{j_rb~w41dBAjd`3?rIGA@Tb)Y1~hE9QWGd6X?R$yaNzP`eIizHZS9AzFE8-h ztS|1`4|?nvOOK* z!T$f%U2_tuFv#l&_h9le=;ZO`T&wpx^YHH z;h|wW;KYI4L1b7EzJl($y#S6I7XrvUL-jD*!EOL9^Ib1%#whN~#1b*SI_U$dT^?l% zExW?Sz6~8tUJ6k3%8W1hHSL=J5w{nY2p4^Jod`2*j$WP2uliZYcT#*k4&;tYv{swd zQp^Bd6}QU=L|YIm`Y5->`kXLAVRnCziPV0sLQgKoWLW(gC;W2Jt{wKC^Mx3rW%?_Ua{hx^9zXWslgEbI4!^&yt>oE$KA`^jS1qH4%2Zbv1-e`Cvp*D?&} z{d96Vz0w~jC5HwF|C_ET&6+$ops4P#r7P;jTTzz;K?PaoKbUGWS^ZHRoX^82htCG^z`H8?8fY;sH!ncs4hMdp6^az ziM~*VIVzT62@8gC%WRCR#bGFt%RpZmdse(yvEG=jM@B^BB!(aa3E(67f-35w*quz@ zuybBo0_MAINt^b^jtF-%q>?i3byOaIy_d&-!ltIK^?WKilQ0%{jOfsLJ*FoAs@>M67r6a#z-Ihny6hyTrYx zW^_=zFBti{HDZs7yxK_=U4@RN`58&cGTBV^9&yGrG5s04V!kS?Q%PoG_b)duDBA$b z5eDd=wk5@Xz?Ky6&)Sks^fR`kQjFVDVLfb1it~Uifj9CIY3|)^<}v%aeEZ>Ya)qM@ z*WomrEK0FNwx}3F??-;^=Iz<+WO6;bIQRS6s-XmoVUAv2m~Yz7gsexh)I3pcnj_3; zbNdu`M*tg#oK8iE6n16T7MyuX!Mj>iT;tUv*46W7 zPj_^Z%JBa4sMy5oKFw`C^fjqYsgx_dAiVjywM#2rQem^-3L~8Rwk#iM5Vu=!_J6Op zbfv{;g?Cu~QD^Z~Wo9@%I-wJ9WKroDS#16hqx%LfHB!t!(>g(dZWDE`p;gt=FG49u zT^Xto`!!IiLyteXk2wXZr9IhVoV1-uRQd753%Ax_mnff%51Wyh)OH>zo>5G{@`Xoz z3E=sTn`Yv+rM4e2c)-yuwW==i3R4A8(e3rniUD1zcT1|`)AyG$gj>w(`@6?ZNBFi- z&OIH1)EaO+&bdnt=iDVoN+ds^W6@7=B#jB3u$a&l zJ4uDhyJE|VSBd++xWnvvy5$RO)3X#WtNK8n&AQDIPUDOn=ZG`5ysi1oPzV9(Zbj*6+<@mWO2IVuUEa}*qra};pbITjx0 z91GBOj)mcnb1Zy8uu(v6bP|{un+g(n+j+iWg13It11t1tZu}g0Xv=XyX~vD|nVHN_ zE!X$snDPDfHLhC6LBu>kKN^B%7sbT8`EaF*@&by(IdO%u&G6ICVy`icxRwiF(AdN+ z_Z>N|XB+=jG6)^yd0L-d9M5ndEQ7w{bwFEXK>od~^!L?4TzJizs{=QW>-*Jp_B?7h zvB;Ot7d(o0J{l)BI^h%wI+a=RXEE4zZDQ?A?zbCS#Fw6W)T4O2tYz*Z_ADMF2&#sS z-(D1#lNLgr<+1sy@1ke7oWXL-;;j;UHhUYdHx+=5?91c&cJYWgH@~hJ3gAthyhNj; z_(hJLNeDWQw_w{@D3!V-PfPDtJH2^~DqUot-t^LfFC0fHhPP+tfH9?QkS$q5C?qz# z)q80i3Wux9ZaD7O2+rz0ZaCz2UR^XU0N{3`3LB44-){1Z7#`Qpx>1aP^dybkGaD2` zzFVW($_PuZ(~NP@e&|7W6eDAQKqZ8a>x4MQm9jsi6@KgHfKr$TAM+SPIyJ^<$5X-p z#^&NR;^H_eLEmiH${y(iT`C0&Vnb|j*UlP?JSx&!xZ$zZ6&`9`afDiL938DUhB0Hb zTwTpK#;!RwmaaWEmX1Mch6B3knxv3&P&*?=Da5q5Q3JEHOFF6Vxv54X!~MsGM?lx) z2#k#>BcZA?78(#?9pw--W;6}&nu}#o=LcF(A-1kP5!kgP0y{QTpsq@~cEc%0lrmx~ zoOIMm3`a*J$$O14ZAz8lJNBj1dtNbY?!4muT#~}fF?Eb4mzRpgeYk75e3iSvhGfHT{>|cc z^@y8*%&s8C6-1CE-u;5FOzLo=sx7{Ruvv#9u<9|ZG-oXJMcn5Bvk|i+s!FFOEB8p} zd%4`cp2|#ngZjnUKaXK!g`H2&-VM0A#2ja($~K5x7_MA;yv1fqWf_gd&ixy*e!gAe zX~<4GY=>TNw|jg#-u`1YDM}G`!qqU+VqCWC3p^+mFFnp1#&$~=F6jbVhIXYSx3LvK z*T;2e(Lp0SZkz%Z(oBfeE{RKWj1El24~ zb4)E@8Lu-K4yi@G`DxqQS$Q)P`oJDDBgXscB6!S*2p=~K<`}6ypF$^2n&mD2SUUA@k|v>f}9L9fZK;LPyOl zN7_J22TZU#j3a{9}1%bSizdEInNW$V6G70UgJhUJlhr@puPVrMyC(0EB$ z&Y`*|rk>Bq3IbElhj;DY$EQ>IJC>f^8rc@k`v&@t?Z0RADPA9l>6mxNraOjA=4VgCg#q4@>#()EGzR5m(2}{eHHX=;>J}9U(4A zL?t_*px~D^rq0gzQcBGu&h=9lPb};cqq(nuzb>$jp!;k?aT@z!)o!}dl6U(D30}XS zUh$Mj9-Xg5)mtl7EVES_#`@Y;Xnx8wA1m*WX%j<%F5ga%Q=~v<*r+YTMiUu=7^Y4{ zl{k@9+CNXFfK6`svN9f29u-TSAT4Y&|OawHMq4xu#Y)`*~K`I09F2ho#bLET|7YV%;Yg z73Y3Q7k0FRE=*gS)m$P{H=N>q+LPHOIsmIi%Ew&nPPueSV^v4Lal=9VJSaTF>3baq zXuy1Oxm|sSixAt_C2BqvB-9Z(J-PhzaK!G#8f^(e z`B+BOOaOaoqweA=#eHaU^CNOSY^qh)!dXLeh8=TV^X1Y@%Mt!LuKYTyPP_K_w zI8a{2dQ$scD<$m>2nFrtdALU<5w1Hmvg%8M+>B9rwU9wRvOsQ5F!j4*W^#Q|(xcWN zMhjLuSeUfieNv{q5vHQucCfuBrHHzWKumuTi0>={G(ANl!};`oe0!mng~T*JM)YpE zP&2tCllo@Zvob(oziz^Q@1xYG@4G#a;qhLWS-P!}@m_Bv_)w3`Jk^|H^@Ve_ro5l+ zos?OphgN7***uMli^$Memnk{?-k9S4Tp17bX=d#7>xP9Ll;LocZCY*R?9{k6T0e`% zf)8|D^^B{Y^jBQV?tssr5|8_h%rR=MvHzfyeIHWM(2rEK=SwO>=uaf7d+C?olnoL9r&D7%2m+W z;P@VLu`hZ41Z%hUrEKZit4`@u>_}G)pZl+9Eux;vF@>pk`+^Px+%9laM|;01l0hu; z2t&j()=pdyR$r%*%&=QLviNiojcX>i{=&+wv8<7ek9g-poP8%CM*7S}khsUR5(3R<>esb@LTBHp}6|AMcK2 zZQkHo2{$iFM6|M-7HPy(pFmoN8R*?{n@I(R`TL0}!sd2)jMW6C<~Kv34y*54m;hV} zDu!d#rr}s(m< zr5Y_8VkMOnktli;`+92L7f!4JXl3H8m9Ff@A?4NJ-# zYUuclKi6S%IE9wbAm5@o*GO`gOezOWXin8D-;J*KA8?I`UF|@q)Q@zjsQSG5txS5g zl2fy%8l*Y2nScYg`Cu z%#WreRXav=gyF{XFio~etxrl2xdEbEH3fOusK;-d$Yg;|#(g*`H30Q@Mv}ojHZtiQ zU2%(D$zdayMGLk(oGHDYUmb7TP3yg}B28uB(h!g$JSBbUc#3CMLCIinb$h_X$ zZOB|GWp6nR?9!wm3Vl%MViu~Z@$~a>GoSo19WF65yRefGi^}G+m~6ZYT)Ow!9YMKl zWFe>#orHhiOwKw|Dr6;9z)7R&?)>^{GCPOuE8ojSP_UJ%Kri{j>4Z5jVDpVqf(HF^DzpOm72b z#EV^NMXY@B4JWo#3Aq%F_hNS1Y&T*}+iBCWGJR39l`QmS1dS++jsK^W!rVWpl+>+$ zPAP_WOexGds+3Qk`QS}5i0LPM1G0T6%f7nka498rc(gjflsd4sWzHc3R%j**Ial-% zc#*c|7K>yWnnwLr+wYkpZPaYzA`|hhV2iskg`bX;+n$-4t#S3V*jDRS0Bwg<1xP7) zXOX23xK^GYx%#@+h5kkl&Jl=t@cojWw8JneE>-6oX%{iEnRmBr7wu=l%W!)2_7AmeR1vPPK0c%|?EAF3fc;`B zO3&`B_gidlm(!w@SiRoCq_haFbaQfyyUXs%th%-Yksoe<{Urj-)ZhxdOT6=BX6sDW z6L=!6ds3-Bm;9}wzi_BbCYWKT(CN{yb*R27gh74MG_w4pY1C^p z#!kMz)F8d%TCL;DS1B~m`m9{lxBO*?orpz%eYluRFZ1y{0hsp(09@KnsnPOOFk*Z9%M+XX zENP8{D&z;;Q@w7R(yP?fUr#kcQ;AUpWCcemBiVX+s+LV7j8-?z+wr1^-pN%<_m^RY zq4Jeg^x&fOzp3hIFm;7x7Smyt#phd}5$nPuS2jm{0@939k|}fBDVb)wBNMsScm~=P zt)Xi4MqLUr-12L$sF!NE3M0g_YL78fbsO}!_@eBuBD7xWYJ)oSz$aW?KU1z{g8c?MT6%^;}P6x zJch!?BP47*0y>%}sMmOmXP~z%UDWR@X=o}PZ#sAv|E9$B+YwhrvFtkfk zGZTF)kqeT+ZwbMO9mEsJFi}E+G}vahr)Y$mLBZ}{VW)z<#+!=3P%!#39rczC&ot?- z{iq9;kujFgV2mZQn{g4*_cu_nQvy%#@QhFu&UkBb0BQI7#mV&)r{S)z5OC5d{;O=4 zF5vOy&`0)3W!{4%%6M*>Cv^$aw=Jf6!aS{g=efL`B50(I%9<|R+x+AjH+Y&Wd@4~{ zbETHY!iwey(1p0BW0|keu=W)!Vr7WlN^9HSDw&!{EvjV%TjsuCRHmDZcGNZzF_ek$(t1jZ9C?VG9;Wfg9dzbY-lF%Bb**iUtJ+Eu z6UP}?a7m-C#ZHJ)0?Q!H_2g&F$=_QlimL$3GHX7V#yF^}MTzYY1ti<$gF@<1e4JQ^gBpXkH z`z4|&wjSf8bg~~A=LJUZrp`X#ZWioi7JKasV!EG9M1735wTo7?uy`Wc$klyJrb|%} z91!iuWh3opOR&xsTYtjNg@dW=M8!S+C?rwu@vI$UE&;Hwq43NK9_{Fo1fw<*O6p?k z6A!CoAq4r%GL7i3{4PUU zA`xO@cQslf=&7TNuX}-+@4Sp?yP@18dm%a*LPy`(Mmhy1G%7IBdj%#eE^ylWmybB$ zsUcz2SJOGB#MhtL3LkJKHr|(1J9)Xzl1E17E%;QI_blSvY0cP~Y0ivHFTcYRm6zZb zguCReTQXDINLeb#V!kI6kotmwr5(VI`! ze)LeoWs9tkOiUESN?{9>k9?Qh$4oOY%h-9qu#6&X{#^e~58&^jf6#wo1!TB}#H{Fy zznI$LDb?$ndD?xZbtn;|N(n(TuZE77aeO+Q3FSHt89gw#*0W3*saxVr>q0AK-*hlo zS125@8>)uwN)E>EiWx;#I@wp?sT8hk6~YfFl32Qm zBydcTgpVqc82XANw5LeMVnq_<71`!LX|iJ`G6FV_e4~v7XnLhUWH3yp(M>0kP)Y5i z!oc#Vx0XtY)vBY1{dCw!-(jPa93RtNJZFDgT!oWba#!BqK3xx|Z%arH3!5!ucAX%l zvqT~%h7X5`dxasp-H?$*Q1H4s4D=`KNeUY z8y6q`IWLYUN^8mVGT5uj#DQU6g@ZzPQXVb3erk6B5QKW+<5RC*6J2Z{z)!rL@UmV1 zH>g*QVV3`l}(`8laT5JJ(D(-i^zy;SrU@!VID}$2{MM4ROt~Z zUDuKj2TJ;2s%$JgV{)k+*`_k4m<7GmP}egwMi!qe5vJVkH;9<_8^rV$T_&$YQG|y_ zJnY#k1MT?lVX1Sq-qtH3xssj?_H;r0dHCq)hOnfYk!llDx7ulZ=~SD*UbPAPnQ9YX zuiAvUYKw6c?TcT&H_$dWVV)=kj%3tHBvO&!ZeJqM>w~DS#}Lu={6-W}h8tXgaDH(; zJJIVAf-DB9#w#m({qA?_2z7ht4H3|}E8&0M&#ulcFD}kX-78^uyL!=!#0^r%5E@x7 zKR2otLKB6LuLm4LqNkB~Y{Gz2x3>o{p1%rl3Y5`+cmVDtN77PfktqpO50MzGlNlw$ zf=zYiCe=t82F8Y6eKkxZHSf3JF} zYOy4q4FdH+mhDgEl{bEZywCxVA zmY80QKb}+u+|AVs!NS!GDs=NIkU%PH zf%e3Y%Z+AlZ?3WRN1ouY7|-gp#Fj8k`Sn6iD8Q`uba}+ph=#}Mv6jN?vO+LsoD0Ha zuTufWaZ9Fn<=$k=9CDIraN9IBYu7v#L0jPLSiew=2ZiG2E$}vj>o4hiFCnHhHH9tA z369GLVu)%*5X~jW;O!3FvtnpiXT*vr^hnf)>GgYar$7~!u_zf_=_|~pz9ZnQ2BtE% z;C-Uj`xlVhzA_3bdD=j<+v8TkTMxE#N;;fp8Y>nt{ z6#j7qET9gJ)l3*}gGHSDaj`QKKb`&=0{ongmCEwn>VQm+HR_KSe@;)Mti$$zNTQp_ zvl5wM5q6GX8*_F%-UViLbN*)hEY;1|>4eo8S0sNKcpp&m9M^KZD_K>^1TrfY^h(}S z^Y!ILk5W{Ur^QQq4Y7)ddLn4hlhcEn=CR_^B(KLVj*-+X*&&W7l<^Ur0q=ah$t=p{ zNOHT0!s%-+ZZpcDr*i5MPBTQ5cNevM@SL3EMo#$ar`0oHOGLhW~;RBS_b%+?ZuQpJNLQ*CL^ zE-wDOxg=NTK0$|u;rOF{*OG0gafI(=8lK(WPkEYzjM^TZ8DuzDiY0m{iM**nCUJI> zvmhhMQ8Z@=f<-MuNV$Bv{(hxCpo$LVdW%fMox4{c2HA8)EZe0fhJzA_X{?QFR+;fY zgIo54t#1>Im_lV8)fttO{6F2~tb9>!sVZgnb^mgYt=V0sPLE&#+(XBdPYk2VCx)L= zzF_=j4Y9Eu}s3mZ0J!Q~5z&OQ2q>0M*&aZ@Vu!NkOLcGAz}8I0Q*EsXd;TR~|# zP}_I3MG!ARceSNBLTwQT?L-4}>6&cljr-Uv&Cps;yDJgzfy|bn4^C z`H?2M-=6iC9#I;We<_V;s?Rq)jf!@R*r|DYbbXdfW^HUbXYDGNat7H>QF8)oij9n$ zcIe?PQ?jeei*#x(qz7v^&|pdvRI>rg;Uki< zA4D&H)qJg1Y1JK9ir7@hQ)B*l#;Noy~m;^zBl){ zEeZcv=^iQ5`);WhhIptGN=QJj)g>M^dc}QT$VJw= ztXl+XtB{1M?ilW?Yb3B&vM=A}t|u3UC=5kd(66E{6?jNW?Z^E}MRi>RrTKtf$7O?t zL%@9Npjk0n-*fV7xrqc1t>Ivc z6?W2{itAN9Us~AExBgl#YV@#nxo5_%p%#Xc6N~o_jwK8j7NwNjB1fVn*|mit!FAY_ z%y-&ECxiS6J+fir1nA;1P$S;ZNW(KquXI=eBzJ&of8wULcbp*Vc@%M)dJ@UjaejS) zW7%}zESgv~)R&|tr1JPxvz9dB@@y>|mSxy)w{(+(cxPjbEyaVh8gz;L)Y9Y#2F_6L zcEG8Yq7g25-Yt)3hxIp`Ve=sw!+?t%X)b4$Qx#Ksj!`>P%P_7+ez0*=z#+X+2aUef zR5`e{$6G3|_l~w^=HVjgPim9f*Cm}KR|mkoZDeV!qxOyCfUTq52OM}$)?rtJbvdr;BmeFhEHF079x;U z*tU-&RyREFpN5~Xe+sYtoc#p@xYk!5%G*gqQ+5~mZOQu{GMK=%WNBV@DBsO~yTR6J z#JI3`*}CWIcrX;u?Rs6EGJd}>QKVKD#>f00Gh}~6yY=qWE=ggX%y_8jn2Bq?!e!&? z76qeraE^@>3?J@z#Flpqce-BU=yy88$GUFCkKD2%ryfw_PS>&QR!v2uW@ukl2}K@JO73?~$KjxM%MG5y`+^t36*v z{*bWFfW|P7K=EMK@a{m?Si0`Jv5XF2%tptM%m+hKI-&isgiuZ&HcLUfBLguMcMolK z+M%+<-iw5E&8dOnSiCTJ_iRIiK>>kXaZ-9WS-lZp(^rNOA)7@wlye5XNnitef#FiW0wdKarwdKY#YRk;lwPixfu@KUEWN(fqR&Qd9{WxL$ zE< z^{{aIiak-IPtJruvHBagk$oJ$Vl;U)!Ssgta6!X-8#l~rFkw(qP$g1bG&lK(Cs*Cz zMnp3SB$Dm-`G_#z*GrnjvWfo|@=Py_+xEf@yE@BrG<;o~Q7?IHIo?#SqNz6#lfvy6)lD80`q?Y4ze%-$sNUvMlBq zw=8B^>HWK^CYfQ}V3=v#@R)_WwYViNtkzGN9>fKoF1F-{EPo^E-^^H>$anfcP$K%p$V7L& zFOf};D@51JGO*k2O=1O3f_<#)$I+EO38wwVo z6N%QlRH5yO|^ZI4-@M3nO73A#_ues?)VJKL^6m)(RqdijF@=|U@f46Y* z?pj+yaehI)VbBDZWz(J(Uv76~9Jqi}*$0c2&MPR>-mc;zQ8a)ud40FjLn5f%T?K@d z4>|rc#j=Zb5st&|FOL|ogRtJvTr{Nfaa-e^7~&X}QyfTCpy;cSaDqH#(z5vCjGl_0I#Dn=AQ9<<)_;T%)|X0O@Q>{& zui9X^4&ui@h-P$9zx#!EVKyW8(dswcD9qVCYCy2bOvZXEk&+X`;ylJli_f9{W zGMr9-#OlHKwtS_cs-7$wb9AHo`Vl$GG|!3HPi zuRUg~54iYW4=tIG7SH{BM1oux|2gegm|(w<99O!@pNc)knl$AdXwWQlg|Tf!W&_b~ zzfN?sK`XngU{04O3mj@u?XX+o(GYSsW@?MBacG|x^`6+N6eMsefT%X^PzKR^PM@&k z!YTA%ieI3}yK_SC-HF`w-3<2pD}j-JB?anof#8mZHm`oaH%HMM3gU7S##;;zD>W)g6pvc#>0klx7PxLyTrx*3RWPp0!zwBe zL0y@-q-wM%GFNz!fwL4>)XO~4b2vmxi)0D5|d>#^q^OH*7J>zm4NTNIXh19c zmo;6@u0N-(;;9!X%~S>)K5Xy5aQXKy>r2Ac0zATp@0*pMRh5<<7)P9 zb^^!8M;K>Q4dczhll3#=MK3d4o-7MW&kZ?rVG6=Fq|JyYWl z_L!$3IlXD(p{p}(e4N7tri$%Tor=k1(CCb>69W1ThM0gpzkCa?r;H;@nqQtyt|wuV zpg>ex3=+yLvmibs6&4F!`eNufqk$W@<>lMy zF=s6G4`M+3^YmT7ikFDnYs=IG{B->>x|6PICV!Zm4Aw+5G@rbiB9$r#OSdMF`SqAW z#QG$1DaUVcQh%5}#Ee63Mw{7h1klV0o?G?2lIkN2Ur#<0k{#yc{4^Lt5)0-rvrC=? z`dq2!wC~VXe5PNGBtm(6MKY7IR0yxM-}^&2C6REDc)<6-M;_p;xp86*M-BPAVTtkx zYVy08aq$%$JjM=}7{f1=yG~bixB_0FGkyN|&E(7>R~PRv?xUM|&0k%7`kbd1aN2Y= z`}CYRRhu$X%2m<%Rt-;adP%o$w8btqh(t8{snahdwNjnrh8XD*7)@mr-x8XlMH66r zhBb4OMOJ{#UxPXu!g@IsdL*x6PTX)YnO+X;0F|>wPQxW;gB`@RE%T>FGX^XWojW2U z7+ZoI=D6nP3|~@GW&8%TBj}M0j}?`7mnA32;w9ETVil*;8A||YrZ0U}D{H49%uhs&Ww`6kRlt8R zbBaW^Z6~3iz{WtCn~X731_6;Wy!B=|JZX02#~AKtm^?aKlvS$&PB!vtdw%O^hxLY+ zB4TyC7>TYjN)M3xKxKtY?5xst?68t`EM|3lYa`WyBw|xcZR3TgFeB9^D*!?KZr~U% zRSc67BCeLEs3vgCm=7EmavV6e=&mU~FERMQaY{omWg9rINYox#UMFx|lZJugin_pY zLv)O^(q-Vd5^dw>vPFU8nx=+_or)@AjVFsOANVprT*aEeaizP!aYIDBy%9y=xDq?@ z;fCw@u%O%caD~G7a7AI>)QgwxlC%V=C=8QIScLsk?gvV-l|hA$DQ!0fOdv-z;utW) zaSXUXaSXVirt?zJIIeIfI!tnGbU4vWbeM^8bT~mSI-JQl9xWBwVp%FW%n70?s{`af z;lbv{3s!ucDujy;XYLaJG^(Z0ZXN|)1~TTGrReA|5nXgR5u@mEMqG3_)2maL^-&RE zQ+9>v($_$+mQ||i1QozY38KSXSRWlWWD&(JNC}6k=x_n)8{I~SBh1R}Mu#b}i~>tN zNV*#EYAjbrhe=k2baYrjCOWJz=a-5)Y;>4Yb)&b2Fd7frRwN#C1bKFC#RAwqr-x3qQeT2p*IDz z&qhU-(P06&=y1h+bhtq_IxG+y9cG9_nmRgc>DFTU(P5PmvD6kFZb*p$8)ekcDmAr@ z4(rr$bXfC<=&%D+mu?~JC_1du_M^j^FN_W|i;WHw(M5+dQALLn%|(ZqtfIq>qN2ls zY@@>hGSOjym;r&}jz`Dh!@aQ9=x`;N=y0Q(=&%B8bXbBq6x)z)bhxo#p|F0tH>!^r zH%!Nj4PD2KHRxi-4GwhqTW9)av-Kn;g^7?voHK;JU5opf4Ok4j=v{z6e0fJ`OMe!YR+pc-vlZovQT0EsZ_WF%Y>EyoEjRUBg2&* zsiA^i4c|*nzP<#>@I`5JORx2{0IwvtUHx@)z6_^VVr|_@DdA_od!HzXm6Uz^>L>5m zU--THyl=kj(icCtto&QdJ@oI?(V5nIh5DH|>aKd;fiHihz4w(OcHPrTU$kt(bg^Kf ze%GZErpiT07X4W;dzw@7KmN*AWxXvL^2B`tK+ zpJj=o5l*hLN8Jgpix;ATmFBqhQbv_s7cnYDEMGJlFI=>rykt>-wq5RxWcRl>q^w*B zN?Wt2M6+6v=sD=eKk6z2eQ4BW2o2>02qv0c>z>BFgUG=u1(7+XX4fYeuqzXVXxAhP zokuwSVfUgFv8^+tUv-6nf7-Q$L=>wEnNZgg^zXcqz(oBG;z+5Zdoqp1h1z^XrsTMH zQ9U#-h3P7d^2WKg*UM}9BSXCWr;9n*ywJNI6 zyS`b9jOZHz$J`68gspQFzmRqOKB6`$LCl^K=wZ!LFrX2shT%(uUJ*-dUJ+|lUQtEY zELCcec;*aZ@IJ|Ww$iM*O}BJ>-5vc)GMt-(-on_(Hk*E z(ChCKJFf)HNmEcnQc}EJP->)H(Nc_Dk?0Fo5mH=SkVHhhQe`Z>5nB{o&|3VPi7N7K zDXq1lXt(0daqdQw5pGXyv2BgnsJ2Eqp6y84=zB42%^yXtHHV2?GuR^5^i#yD^UoZm zPQOHanh7~F-TuxoX+dbwXhE!TXhEwUmm-5X_FP~@o$H@9-rOiP(yT}=#w^Jty4+|% zT)BZVcHF2XYHTPaUaZL?QrrMl+u!&by?`?Es@Nn@Jb4gCZMw4Cg0-|DvRaGKx<|^O zW#{6koJK@Y+wT@TWtxqeW@0a1+Tao?Wl9d$wZBDCQ_zm~O43!4mXKL;K(I=!vwg-n2v{*KjG8sxWy)R0G| zh>%C4amb_nGo$fq{KG_rNuWY(Zn|@9p+#6VJ2e!vf>|c&_hEx=t0CFl0oD! zlEHwDWE7%}WE47gR`Ej>-R-3$#unX3ziM=Yf7<9qB8uonCe-ML{+**6Ow`d0M@qiW zlgZ%}Y8mh=rA7uaM~MSeHJIo|VPk)nf0XD3{S?uS^ixMSGEGD`GNn$7Qpr>tqn1Tc zOSNh^qoj0Is2u-~xAOpxs_6Q7C;}=df(Qy|1OxW1M1Uv(q!VQzK9|Ff^U;s1cS{oK$%|4D9jL-&clx?%V%x4L2Y zh(cMz2f5V^-AB6WhW}H2btCX$pt_;^EKuFx9~!C~=1&5%g{m8d-}Y8F0-x!t8{(&d z>W1;p%+(F!pYrO4@R3*Pt*RTw-$&IA<8PR%8~hIg)eZVlSKaXb=&f$#{-mpJ@DIGz zjljQqs~frx0@V%OhyLn@?lZrY(^WTof6S^I{(tpXHv*sds~d)o0@V%u$G+-D;4@I& z2>fAgzg*yFeYGR-sju2$`ovf5Fn+A7b_D*wAic2{F7Qh}lg}#-fwVi&|K|HuT^+>V z`3C+hun0_lqu)`OKlk^!p})=7;pYD{WBnvBhp_5m@n0Fgis>8c{!pm8@V`%2bqV|& zsJiga%vBffhgMaWz#sdnF8mX3Eg zG70}Fw@l*ySD$ZTWsE?Xg#Of6`p6w8<7WX;O`rROWgqjL+56W~GVEWixqs&W-uy>8 zUhMx}-@#)22fDx5P$u#Ij;{dX|66CT@E0g$t(Ld$wKf2bA|;yp22l&Lv~5z}tTm z_|VtyUj^AS9$%2>)M!+VS?d^u#JL zxj%-4M6rJv?fb#|&!!4ARC|Zb<#am} zJfYRQJR8dHQ)!#~$HxC(oc&1uA^im*A%*$B(U-W7|C@;v($wZmNn_u6_@Dv>?%wqw z>A#}?(U&Y3;uF1TNC^MhNxo0Gki;tF`y`xxhkX#@|DA}yC-iw0`hVX4(cc~t(%AbG z{i9$=FZTa6ExLWDj_fuv-zBCUyJ))a&HkJ#h44#xE6xMDzv92roUn*+o#qq_Y2WX~ zYya>sNnbStYEC@=qrm^uX-<9Lr=&SEeLr~rNtzQhjrecoxFY)^mg6ctat$MOBUdP7 z&VZ5Eb}~TjgyWIRW6eeQ28+~^)|~!-x-}Q>`<#AntM3QzKb4R0e>192Gq_S~7U{Qk zZ#)nZLJPKCfpW{9T=^`QvRDYH&1?MWDbo~&NUw$npBW7eke3!*cfA@T7hu*Dk=e5) z`Q}FY47rZmcgUqB)fu;-1()6tF@sG%-`j80_o}dt8~a|;U7FHDoa^81P&C2~!bD=# z@lS0gwJvNTvL@BK?56b;_PT__ncB?vj99*lG4eS@N=Z=gcMBfz}p zbpGplDB~3~@lEvpSIF0KY+f&|3uH8YE^d`eS-(l zH&CxzR5$@ z--NZ|)5Y2DjtR|t7EoOF()PZAI4axc|GM)T_FW!^-$lvV2XnEy>kC;`8MP#&DzN~7 zdg`MqYe)kgfz)8x0i*#n-XFG|G@z9AHwlgg_<~lQ$G>~_-({4tl;+X1G^9wzEjdaBo?Dx!jz`fi`zX_QqR>C=aM=K?XxC%|(@!eFxg@r^-q-3oaUJ>A3}# zcEsa{?~tXfZsxl2AWJjBiutS3k&U!so)wv3c%_LEVm>kBY?s}Y8L@^)L<1{5qsX6} zY0~Bv`IDNtOm<|LJq@J+0i|h3Z@<3q%q`N}=lrxlx32eXUeiGSKPr(Rd--hW`?o1) zs)e|)0BZUg_pApZ`%tg+=^Ipet&ONGX=d4if(mE^ST8Xr-#kt0r4AwksI;_Ty`=a5 z_55>;Sr;++srWQ{>{kdGWZ4lQPPx+MU=BqL^&lIRd!@A*&F>>c_Z_DB4TIG56!u)D zO%PX_jO2~{VD=W0w>~1%!<(i-m0v|j-rrV5T_$O#i7I#p!IsA&7@nTMU4=ZZWJ*M z=Ko{8f{3_(kN!t$GU|&KRJy%BGCcomcZAd&(bKr zgqTQ$<<||Mmff>)Em4~wsv27i=JuoQeOJ@mHnpHCn_Ez~8j!K>97S=>5SzV+-n@eX zodOZY^d{fkq=>w^pWCXrwYiYhs7R2*ZoJlgT@6NT;U}8Thp|o8K7z2)WFYHhw`Vy; zQ!OpYwj{f)Z~oap>KXs`-%e6TS+e8P)ACOST7Bc6e@~HCx3VNd6D_@tQH=5M-BcdU zwYFpfvn5Xk;(vwfg1Z>&PQ_2{3c}gW08c`S%e1220((;FZl)c^x}OAgb_55nwKd zHg2_v=CZ3mRO5?~l+k^wpP_N>CNNR5AZ-)D`iv|6?G0L=uOOmDFe%Limhi~NUvH8n z><+o}Doa|rUNB|}#q3S~sQnW$nGfd{!<_tYiwAPHukl6i~-#08bUKS=p; zVt}Z-Dp#Z9*lH@LAaiIr{qYRS9Fi~_1$^?l3%G^PJh+Cq4$MVipEMWkb=MizYB_nb zKA5XUi$R6D;h6I4Xs@y_=Bm(TFv`2G?OQ>koQ$bTG#c#)FKqkeYT~9~E(%kmXBYXG z;N&xx z7gGkDCXz8!dVJC9nf=gDTWR(56RD{wiljwVylK&QZ&MuT61h%#Vh9eiyu`q#XLOpI zNo2Q3X77xuBBN+N1LO-oNkjvlQVB4v@RB zgY)#9h|=09vK{a3_=Ka^_C?WEoK$o;m@>`Oj=PxL^5`U z((>{9x_cV`LxSG4d$3iA_t>=wgKYXP98;ea}Z*Zqn$!D{>Wi z1EfcL?tAGL<5SX$+x5^nwt9i*QaTO-xHY(nU<_1hX*mu@6Z0Zo+69)ja;-` zq%{}G+2PXIDKqF7G>2AD{Xs0g(T%v1zuJA zK%@dAC`|e=M3c$HSq$7U``%Q6s` zU354qv})II@82MNzyU`;@gv6Sxv-oW}+JJ z2G;6F+dA{}EaL^D61@d7?&&vxpLm#HCaTdKP<8saW101|Qa&{k*&3;f0|#mSi3IiV zWrgDx*Jj*_fXmLeCB&vDd$g2TcmDgUPz2HMvk!Tv?Ibfj*`Au{NfHdAto}mVaI(`j zvJI0lQ$vL|SuX1EU30oD*WxK=u96r6Er&&?yzCANoUS43ErtN8bnk@e3W-?MEc_Oe)rKi1c zi|p?gfLK=$(j@e~M;Bx@DUn-F(u(;K5Vg2LS_gKkrio+z`QBV$o6a9=w}NcbSBR_B zHZ=fJYwzDZLzmc1zZV@I_ArgdJ>^IB>i5sgSWj8q*XD1)w$tfSLGvKX_sXLk?r{|c zFDCt(Ay848E-fdp8O4%{T_KzC4I*mDJW5kR&V2ZfuKYyzw|=VsEeISS%CBC~L)G(% z|C}b9{2iczR7ai(*3rx(?!%O)e-D^SMi*GAZ81l=mHHvTRM?@8YX7r8Y;%P&^dAF6 z_KpW^OP3#2VEG3PcxESA{+UJ|Zbp|Uf_3u5(l@hdoy;;3Q_?h#BgL+Xhi9bM3DDSm z9jERgjh$_xvgQ7GtbBa21mtc_APdR-vRftk%ml-ytV*KzVj0& z?`;0X#B;h*Vv`+%Rp=;K|F!Ck;9ZmRjZ{^!HL&9i+RQ&fcKlaBR1sMtt2*z`R~FOC z_|3>v6WszEcmB@9Yskj^F7T|5A;@Yhs*z>(Sk5H8R zhmp-9{TU##2ex3F zygU!s+Cl?tyFwXnp^>M?)&lwFckHy1Z=S8bIIAurueKyJ z$8TY-W%;POQ>X5sgH+wg2=H@Xt%QlPG!aCtr+@hJHbt##1R_qAWtm8`9+~kDKTDM< zGOd$kY0X08o3iZ3Lo~i?1u|;SmX#G%`S-pxa|`9?>jWYUapa{0QDf_)KX0d~alOD) zv0~Af?H5LK*Hv^RC>&L4|OZ?gm(ALbuM<9q}(Vlk)xL-qLp%S zboKpYgEt|fl_8SXAz%sj7XIZrWqO-+WZ!GK*y+g1i)M9Z!nUh4t6LBiD6cdV#5V2s z=3J*b{#L|9>MK3IXlBD|OgTq0yUkBEJUontSelHwKGy8~H;4AJw_A|GFiUgM&hGc8 z%B-V(svQD?SJ*K z{P-{je*(`muI3Ezo*5syZ*yJiQAg>%%>xFSihX)SYf@q0Nup&3XzW&Ox42~@t+U}E z=DoaWSH=^Jb}&E#TM4F7z2_*RJ>pTRzwagAa>!50tr{{tO=Xw=i`ymA@}X$#%fgvA zC{8&nQv268Ylr#gd&>zT&aa+*;y6W|IXWUMZpHPn+Z4mvrW@~$JSkEY^gf}rI5BO~R$7avL?Tch zlkVPASCP$Wo-vo7yz?3VI zFtPWL?KG3;j6C~5xG<$91bh4A-amPX*5!GDsHk=T=CRViDZ5C@3j&kbSHb*9O9_av z(M6XL@uEOfk`aLF`R%xy`$HM=l931pRa!!zsRugG<}vwYBM%Lzyru%Zsnz8xZqKg> zJVo{#%wqAc-r#z3Rb;BLbD$@?-WSIYQyzOwB&INLi9!MS(FM`t;w6*!Q;p)fk(1tfjwk1}z4mb|1ukCrYuypJ@usGpjfF|+jo+Tvub zY&g)Pe;#_`Xazx{}j&ph9+X^Z0#K6L=s% zO!sJZr}(&q3i;j{ReLwpJRUUARMkAfftJqft8FOHh{gRx=se_g6GR--N~i9mh@(V+ z<#C0=(kViUvAa~aZe2WX$T>fR#S!v-3&GWqrwsCv|R)0(wZ z-7M*+S-1)%Bl+m>BbShDkL1$2#HO-`K9%G)$fD$&-nEo0N+~@JY$3_c8XCvb<+rY; zaV)K8p(Igy9MMig(@t~w4NZ^c(t37ip>=N--BqJ2D!d1k#b95Wj4C*l2ai5Q-lz;9 z!-v>Mnc2g3ER* zJ?Y|vOOH9)=|4OpW;I25e>PgFD6QAaspzwWjy$_bweu;Y@QY|At)HXVeX^4bMf z^lwjH+)nvYXn^UxNkj7_v8!YiND3-a)xX%doYwKv0V)|zTe{1|Ufk6BIOBxyLS9;s zF}>D&D$n#Q8M%B?gO%wYf7rQ;X0>vFN&D|s!z(W*@K8Sv|7a!UOI37CH(Rx7)Kno1 zt+eifHM?rjhu0{^eMp-K!ffrvBn*t=S49 zSmbe?adTIZ$E{&aM$S)u^#Gf=X4KfLWD{!|*=?hGMz>Tm*2vG#+!(op{QPr>s$i5+ z{QN`Db=kczY!-RW_8&>IJ6 zUh814iZKSh?#s7++eE&uE~Y9OWz=uhY5SE!p^RIPb6aV)I2&vE;t##&-va=j(`cHD z`6_-W=H6b>|kt`0YyhjFAj}hTn{2lcdMJl=iPYE+ACw(Wy?TrOys(qk} zUOnI|9)3CD0QriS1ZJAc>2cbe$-)wmmlbfkJ@U?F;x-YuZkB%r?_S%SjsM9BW!$EE zZf?y`5L88$(meen--&2u;3?Bwush(2*m99}2bvp+O0*V5>?v_oPEf?&!oW*%x;^~C zc2y_xz)nHf@r9SDn%>etM&XV0OaklYs?(U?uMlORrNw%ZtPcA~Q$Yq;c5EqrLq{tE z)fGFy%H+zgP7qoB+^8hK8?&{UniAVrK{gMF6<(UbPpP#r6Vse7(e%lVEZRf(Gki}5 zomPl85Z!iHe}~O(HKo#{i{gVdBL?54_~2z9Io4*gr{!Nt)USMI)E(a6*4D^U)A0fH z^`+g#`H7x(ex5tE9z80?&Yjp39AayW^oXJuA$wSjB@`pH7pU&^grHG7cbc}Fs2vPc ziuQsjYly4S4Wf1wsH$W|=Q8GOsl0*CWpwgU;~d~HkL7Vt| zxKuu#Cn zXot3|pXf|YRdWUe*nzd~S{q4Ay9H=zgV>FP13j9{?r|xI+L4ytTKDEb($ZJ_RHQPp zT8gTLUk?AzHL4bN*OR!Nqb&?3BfHW>#ThAd?~!x)iJNrqQ4fJVz(vRG64PT{v8f&v zH+2I~?M!-rzX#gWKu=?5`_M%>(qj#BvHNFKUO{_J3yW%e~6Gu|GTo@l)ZDm%((r~AXm5PswQ>zJt|Vn8eD?+Po{ z(Msy==O(&hQ?yiPs+PcB{YcjAE|*hm{*fPN5YxA8`OGq^XlQ=6lQlAOvuI(aWJelV zsXIlVT1!^y4L=pN-AR)`mfif37cP*^kJXb{T~^ctK^t1=!C(V)uCAY%SdxX&hH+7S~Btuzx<5VAkL zv6?Cf2?1srJ4zkv5S!tpXA*k=;xV5K|O%i-3HfO3RSDWLr`Kq*QijN%JU)>ChTjcqMK< z)dW&?#Pnn_-BF<@$5K~qAw6*hSQZJZG!5uU*nrObKI^mqje<5sdV=;LPt|UEIh4uQ zPftvCDCtB&yUQOhyt#ySmtB5d{5``L>5&CF)-SK@T}L^VTgP=LIn$FV|4@=+p^DP| zowl7L@8I!Mna|bKRP52JZ@lrvY+Ci{ejX}iOOGe8*6Ulpx{20Be?3WK?XCIu4InnF zwtn1I+5s8hqwz*wUJ2Ax)dA4?!JlF>`DxIBdakd=l7C4-ls)DR_c4mH2O**s>k_Y5 zm7YzoI;t+{wS`v4U`SPRLJH{6jqKM}kPf}6rv~kPrv^D=_L84^OHZRy@94Qi=~xX# z-OVS@TTH|udLnK1Xbu(c#DEcf;ET{xG@@_oiPX=Se_aK%rpc?%5^boSMsZF4X`r%k zsa(%BR9hIPr?Cwzc4bj~ur##7XOV|U!r^+Rl3f;5Jt?*|@gzz3j-JN7lh!=CqcEuQ zItuK~%dLuEBzyC&$Yha++bO0o()I?#IYkZ**-Y{92tC!Elr5kkMyCBmh5nQ?D^M8#G3f^ z{Re3jKk~Dj&c5K<7wJ(1b&B^Arfj50bhMGBq*93@-%Ae;<*##$@$pjZZ1X>Or@nS= zzJ8SYus=5N_^}1=nJYCqgLYJ3ESt*rZ^nvjWqCMUZL|S<2>&yCObIQK+~TJ44xfqUZme~$|64# z*+H~}KbCKIn^w&ZQ+$H8$0yB7auy)TY8)-(TLnbl~(l!a$!9h17_?wAe3)JA*!Eaj5KSg$M24*5r z_c8P!U_Nv{f!t4tdF{YlDI ze$>-CwQUj8K)}gM2eRi;b(@_JWxSbso~k}mQ2m%btt0Q>ou%i|mRVY?L&0t*SbN|9 zHH5#vHd{~hHg6~xQ!t0EZobQJ`kSLC##6US{&^^uj=#VD4a%kG>Up3nD65}{m9^#i zZDReTXQ{Y#07Q=um;OA9qQ`j#mP5fgaU|KvoIiPY!OsSoSge*EMbtwzV{7-NY)PE4ud*tcA=*7jj?J)N}bwo9QasURTBl{vE6HnLoc{Iqm;QvPQP zXh^N*g;o%0aexHMda@&kWXkz%EI$ph#7BZAQkn!RT$4*(-bia~sh*@Jp97IenZyro zQ)IHtM{{e6VrF!9`|*hPkCCTY9-yhY85_i|bzAl4dlxGLEM>7WTF=?PuHtrhrJe^K zy_eMy)bCZLU(K9QHjb+TENXy&fw?RXY5#lQ{=#FC)d8M@NEwadfmyF-kX6jkk(9*A zAnvJCdcj4~#x(&}vQuo$k+=4M)&DR1ZDM5xSS(r9@3&A{*B7+=kVmjJnA{Rn)x=Jl&@5v-lfLoAo@{ zHYTk*AU|DvXw?DAJ+|m+>iX1xzq|WgtrJvl+o~rfC_2vx#&h}Be!SCvo1Pc6F15jl zyYAA;->#>@OG2b)4_MH~jo!$hb+|)M%kAM}abK|dsd{7#zeD|0JM~m`{Zt@+&RkY( zEoE4{^hA#>O=Hb?$*~Ih0D#^+J0;~L&E#%BGnKyxsUY(KRh!{e%Ipbcv^{B+8 z>*%8N$b!6Rcac-8sM2`AKvvuRk0R1i^Ai?RG?lIAf+OqFGJ=TX=$3!@p29&ROLI7F z9tA!5z)w}KHhv}fsY50r9sbFGbc(8SmqyOrL&U=-B3%%xfCy~B+TpLP4`sw0ACV3< zY1lQ&&LYy7^mpgqB8@rXFS4CMxN;i3FLQ&W+HE{%zKcfB?jxL{G5fEq+8bzKZxrnZCCXZl<8eJ zbJJ7R%r3|-w?&=c`*$}4W*V!zhz?J7d{OLmbKfI-DE7MPWzzdN?4q80YcGn2zC8X@ z4#h*abS!9qrB^4C%)Yz^KhttsM`Ok}|B``K@b;f(sPIU^WSK?{{q#M3P2_jReEGW z>^JBApHEQiS5Qx-=Ns~^GiV+^D|dY_&0`@it#wp~7R`CNT)@eXDX4tBT%px<;uSXV z)T}?`9ea0v_BMIP`wTn^f0Uf(2J<%}`}?Cbe?<&Lq@*gerCf^@r-@e7Kx1xEm_BJ5 zh+x;Y`sXN(W-&8Ob0!DJS}#0S{wi7P`+dY#VJUQtw;-Opb^`fE{al4>%L4|Q%N3U9 z1Q&SAjwtd*=dj?FrR;aID+3EQwk7+C+B+|Yw~+fOPi@F>0(J&iQfK}*ytS1=c9nA zMov_PdHUkK9IC>UF;m^nnk9Jw3^Oe`+mwyMB%J75m~=dFU>nh)-MzgHL9@K#XwAY zY=Oph*)eMg&F0fyZkMPQop?$cwAu7L^Y0d#%}Qos&}P%s@HE$-%4VXP*#x=e;gAaa zwdE>aVvpzR*VE$dE(ddDY|ksjj#74MJwla&3H|2tyBVI*lN0T!b{Fj^^hoO`ghsMj zgl;5$Vfr(x=|EoM28M~U79UJG?9ByrZ)0O`f6Ao6)!8Hv}mSeo? zJ|0K`WycidV+UJ>o~3;3*#HL%C9OATA2>DnI^R>Q;iI{2VR7PxH%eGTdN$;&nqC%r z7$In^u#bChqy6pYd@P1iaVszCF0He4={l-_)H1Nr6vVA)#`X;wvVtV59iXwt^@QcE zWX8%}ZJ9x=Isq2DTPpu7)Yn<3z&A@m8LMu9m278o7OZjHyL!hplC55Vmy+gCARCA) zD!(ej;yPVXqzJ-#Q{*+~bA$De7=9&z5AT z$Fa%h2}3GvCBYt1M)PluQ`bd=k4MjtJ+!(O zee&fd;xzSgP$^b=u7IW=D%oT$X?im+M~%HeeKl)pe1DYs0h;?s?8ttKGu4ymOtFK< ziln6jv-NU(ZLaYxyv#(K0v`r+Fk;yt-YMMD$ML04@$OinmKIf69;;C88dX`^ z__?0CS}MES)0>sodtL;~%8R%k48C)TxX~8eu&{7JU=`f)XWrXI+?TDm5s^XRmRS7b zZQ{1I;MQ*#9C<%^u-IwhwzJ?ygazk~l$XN8cTncnKESnTYLuN-)F}~Ny7EDa4Lj&) zyjN7gEtsgfvw#1z^;F&IsN=a3Y+>PbpZBesxdr=T{fMwgpVSfc#pNR}HDDjQH0cV}JAD`BUMy?mC~F_!H5 zbsLCgQVILY+Rm4W-PMxKbS_9^zO+E@t7_dW*^%|aMYE+u?z0)=_}hrDSh5=;*CfqG z@qN*OpJ!0S-Cf646mf$L>2^08KX1~*OJijuB^eU3lZB7&<1hL4^s-o0n5FBQlBz$d zeeA5ihMyDa72u`X6M20n-xdm00B<%ebdIvkR|7mJC`QX`37EIH;{IMqtk-lb@Wg{W z3&h`dU;X+nY2@nxmZ}ICc$ko9W?l+qwB9C~lGqnS+!LCuyhXj7nwggn%PJx0xh&b3 z0lnS*`-L|))7#x|SW%I<^0Nu#JrmdcEcF7%2FTF7$V!QNoM-*EV;8aF0<6Jymv|6S zmWAqpJ(?WhuY%aTtiCQMdmOm0g16(Km0mb}H?4_yFO8SPl~_(>S$=w~8n5@;eKdEH zBS9>5D$$Rczd4T4oFy1o!HLt|(|7W>3=_SqlvsCP@(E(#EUO_%8`IlQ<}W)W`DpB( zThuTr%R=47e|I^??;3F!S*&f!q2TNdlJ0!xXZT&4eRM<>buA=a%T=H77xDTUSz)~5 zlyBdPIA)BD(| zd9t;EV%RUOyTC*I8P$0ec|<3oEAbU*hJPJ2aUacanu)5WwvFn0H%C6Tg7!Z8nTT#j zN*cJzReEMoOuDLT>m#9z>C!Rz(MPvf#FU;(ux}OpRn0Y2n{exR$%?!Ok}oTH5TL8$c5U5Bx|%NX6xmwTVf}EWk}Iiev%f&KfJ*BQvhe*o_gG7wd4P_JnvSLQ z2E_bF`W@Iq72$zKR$f~Q(lVk-^cP<~$}7=>Ok8FK9BD2myR9q#78i}}#wJr&(bx{w zaowQlS9WYs?AW4k4!;rdO(QEv@!XFyXP+d=-qO?3#Rt@7B|~vRnRycrQ1{{xBg{~l*tSaa1`~mp)9Tb@vo0iW&Ry6Ew|kU4WhJcU<}uk?|FmvdEfQX>;nYzAn2??-HV?|`D!Lb^W%XkG z?$-}}#8h;sP?`i{h^qUVtS8Izk&l#~f|GkCBl%j{pRdwLjyBP-F_V@L#GVZzQn+Uw z<0U%NJPwu@=G(%cS*t!Gb~W|Yee7ki0&J=nFi1-UX3bIU6rZ)RdXko)puY(DgOt#9 z{63>k0<`{`nr=w2k9WFZKb~WbGt-n*TTx%mot!D>sV`@|Kx9HDD#-c34DPF%c%5SR z37DxyR#3UGzb9^SDC2(Wp%qYPQ-A^;e=1{IM&Bs$zbwQev*>3qx%JDuouoP5WKt-u@$=STy z0K)zLK>d->^jnvFZDc!XAll0WY+>3&HML^*+!%Jm7nM#Sib!_@_%z4|7#EB zL(_FEd~KAhWGIH89Z_}z#kXJUXqH>z^6MOEOG1V3&eN)!p(Cp5jY9Q+w`Tmam}1Uv zbUa1%0HB-C#Qb%M^2=|1G!+#iz&U*Sxg*5+&c{(uzd@rH|3QUwGQk)(zxI z|5#gpC3(^xd^9B|4p3F`>AoR5C?fjNOY%6iW-%S=X;B@zwU6r3tZP(DVR1`Kh@!vK zQ#YKU=x?Tp8{MI6RO_fN0#tg916>*Wd-t_uFJ}dqD*M1eL^OSW=5CtD*M8A5CX zmmW`~F|JRuZxCsYk7NVKVw8}ItzWdCNOOH8H&}AgB;)~VJXvu$d4Qk1r2etV>2{6v zF63W3fIZ$?dF^Sk$Md|j0S-@+MQg0IbjX+1X|V4y`O=@gJZk??65)aSwImKBVCUkCx6%y$?WZ|| zK7%)AJJL=t-i*X9u~fRJ6IC_WwdQ)hmbYNdgUR7aME z;>8oAY`pt)m7mtikqVkVq*~W&hWFk;Y+iX z(CRpT;_v#d@zY#(cRIN8L7El`B8@g(UcEuxikZ2z7_C{lCn<{E=b!9Mv&Xk&4_Rt9 z{(?fjGnz=S+flV?`jUE#zV=>p6i7e^e%Rr-I3<$V(*tu?|S9Bj=K5x9UuazHT3Z; zdZA@!-fT6pgD7&#v=JvMLf>VmqH`Puv>wy+c6-ANkZ`DYti%Z#f`*2Ocd2)vrDJenu9t zvoTwpUjtF zH5F^H0kDDF;_7CFv2StoUf;rH@0)+?kF4Rk(u0PoT>r!Dv%HUO6HS$Yo8y6k?MP%-SSztm=naTZ$8O7}oZuY(9(-Aq+PHV5h~p-DT6up!|HLc5jF6nk|+0vn;9*pk) zD8HuG9m@Q!7^p5TtvV}%>I|QL^YKcmGh78^b=C!~>Wz<2Izy}aniV;PS$9wVcQH_n zdPP*BtyEXKZpF3?zGX8n^b+jHiQk=|I>QYsI@!}$4|}sv2sEU19PvMCUf>Y%Z|22U zWzWId-gjTsP2^i|0X{FPdHo4#e*Q-Qt@55vPUbIJ-$vhn4ZZ>@kXzflbqm?FJAlfX zO&kegV5wxjH{QLqgXa6LC6{inpgoHG%Z)tP)%mw>lLreaMBOg!W9XWdx>^f1yN(2h zjlF!)BFX8n*~K76iS)IajyX)y7ckJf*!#2N<8(rcjBM@~$iMVxFS=rO$V%E9E@-_RhL~&+Z ztqU7S*5W#%mV3dC=1yVv{M%IA@{c+myR9F?U$QD;AX_1&=M_}fR#e)uiR!x#8HgTM zIEi(|tCSX4#R2CQ9VZ+7u#atXrlhf^3(>{NN{UVcm;PYZSvn0|(nn+Oug3}sBuhfR ztmMchIb?kv(UWjXj{FJ%<2d-sLsw}WOX+#AEk{~9pfM$nyl|P$LzULkteREihUqYvP%J`WUWqx@HK^^biJ&*0CZkWeRG`iJ_>_Eh_Ed zQ*?jY6MnuUF|cDVm?I_Hb#qM7J)~XbAydT)LXs8>PhLinRxnXj<#1@#W)@q^?_sFu zV=CL9MEABGt$6ulD3kC>6HUd4qMMXjzCCFPosNFW$4h{1p3*vlVxZH196CiYP^gc^ z%UmpW&)tBhbWn8D(qz;b*s}4jt4Uj*Hjra@@f>5N*Cptv89#0uKWkFSK($KvrHQD{ zal9+PwXL#&X!rI(c10y)`SAsko_cihVLAa)#lX#tr^P9imK5X;y|?r_K=IHs1|lqq zOG}7!x6ebR_K@yY)$xLmcY=mXJmicvv?1UY;_~gl`P_K6_!$;&1k=j*)c68!C>$-_5HZ=`g z?<(Qht~kWfYXz*%&QAMnTAk17xYk1~OGJ55sZ-Z4QeITcPei3%X%et_ZCu4~Q%qf3 zPeRU8URS|LzEtGN92&_w1{$l9P@|*}XvxZlJXeFEk6b0sRaZ~6^ZT;vX|W!UE8kR9 zHy)I8E}Lq6^{l8`+#sz(w1U(6i2m`+kvT*U%ZuKz`OAXn(sPXHH9t<}HS_v;(LDpj z>6WL1yu0DeQtQY@gq!H`_GCMIs5)pf-p4ljAdPv1iOWMYs%p@TD;aaNE7ZH)k5_2# zH&Ucyk>$r4tmc@cacgKFw1EZHO37u{HQIyiR_pj-VmHi#jfPvA4RZA4sw?YCu^RbU>?%i9)j;Imol}3v zrnUQGfXAJ?Qfm#m=Z}1syqxyg8e4O%R9Su<0sgZ^Tiqu9OL_B=IxFGZ_DsJ_{3dzx z)!1whq4zmDc0YA;G!^(ttu`3>(WRc=N0K)a$U(5%Ao}Wb=JElGq?;qYD$5P3w|$O{ zxk6neEiAcK3NLF{P!G%KircOcy=9(sr0&vmu>X2_*6uUpsiUmvLA2j~||4 z-J1U@uI>F)_VN!kjH_Y-js5+`sQsj|9sEqvp43kbY@Ksi9a?Ge z=_zUK(n;~DGE`gKT~nSr}~TSq9oQ`}Xktls~^Na9M#~m39GJarV`H zD`~8IL$129MmG7=zh1aNHd*ttlbx|DqCVi=o_9>+Jw$I9Si$pd&7RtKk-S^1k*C1B zA!}IaK+HMXM~d^)yrxOXEvV=ONB`{d7bx$ynTcc!E!9SPrGSb<#^Ez}i5zbx(?U^3 zMsf9M=d{ffSKCcwH}mDG4tJ7Z7^E!{imMCt8N8a}>I8wRX0;$IICD#-J7kR#Arpr# z(sK)}QStZ^cgPwgS##CwZ-IK!^upsd((F0}c6zFskwz=`<+lc{p_SXmPh~fgyX{&s zd%Y?D`h?<%grwM|6i@W^6KUc2f>ULgH(0rq#th32W#nW7nboCJ69iFZwF&JX)^LBw z-w;jVye{pumeK6a(@q`P&DV-yprNxJJqOjKr2 zVwuX6i`q|?DJ_@Uvs2fOTD`D_T6*dLmy(Wd5R)#bG-WqcUHd_%mZl_r0G4TTPQn>l zr!Es$k)&Ww%dR+egXYu?h-&0SJHW%f>9LtAtR5Y;Ynv`n&06MO@|>Qgu@Vxv3{hI6 zP*kzEOnZLAWICX;-79t$7ajMOT|ua>-7EC|3sl$cFOn&uv8B6Qbg&3qhapV|(djpp z-#Jb;c>tydam1GuxNw7_sevMy4jx-fwhEck-OUb=%!5QS6)Ewhh4NYka;@oU&dn6v z47MO6gQ-H|3fXHmlEiO{T(%D!Ph;IzaD+-E-aTQ&dXo4pKu%9(7yaABL%%8{-ue6= zYf0iEBA0>=MS6{V|DqU22K5fTEs`mm0|PBBFNkouyq6;%JuFJdNZvLR zKe$Np4%3lilNpZ1%eY)3D=*4T!n!oPKoP)jJ=Nn(aoFgzZT@u`#aHb<_%(}m#@-Q` zFie-06LibWDK+6N)i>W2na=!op`kv_msSovOL5K!9g*GEPvMo-1zFOT0&zEAS+|e4 z?}=P>z5ifWZr_2^yGfJY*K=(tByX&em=45}51gHqL$Zz(naai(#aQiYeYKxrtWlO+ z&1Or93|FvzfYb*YSK@sOABc2iGmNC})ac47lKMkSt}>}X*F?*6&K+bmJ`(Bhf)#12 z0V4QCoqpI$5&US8$-JMVzk>M%E9q1B&zoo^jS;DySQUFCAb!m_^wU1_^B?P(330S~ z>sdaAA#JZvHRI9h#cvaNtVnLCj*Kkjj74?$?#L%1S=l;5K6k}N*D;#kae6L$f5)XL zVn)%$i@j5qP;@a~V6woKq6|TmrPmLzR0R+2-c0s+f}ZMekya@iVPvVAxj#Hkmg-YW zF1sSgRXiLn>J0G1c@!pgj}& z#lF0XHO)k`6j6Q+fm6wY3Jl94d-XY>I#T29`M=)_S>`24pPwMh{DqF17~~jsmRVg@KKFW5}cfWTUGO z)5Q)T#VUD~4`d1V|MZ30ab2R_KjOln)IWd$;yDL zydBC9){p#PC*=n-MJCfE4LbvAeL{N~<-3pOdl|D#

D~x^*A=MIZMo7fYDd-?l_ZWQC*8#j#0YpfND#`qiOG&>x#H(Th93j2WVj6>B|`=wCBsh< zQZn3*kdomJ9isYwfbjV0CtE)u##pv~#^i0Vbr0Zb;qNhoq~P%5HuQuI{ndmbPukE^ zHpFx3M%{NK>=>|GgBuQo?qqsU-E4Eek>u8{;qDE7$D);2#wknqUSjlbT-!R>Kity| z+fw}t*U`fFNp5B~%SS3JKs=-G`#VihoUN=G{Z7C~Z;}CyhW<(HF%*4BV5trLgTq0D z$B4j*@$owuOF*#r=a8zi8 zup*wG_J&O>XH%VmrkeKBx7nr&>E8yH*mC$?ghamZzY$Ws!g~mb1d;#f5WDeE_#MQ& zp@H5$yMm|M`Ey)z2Alm-(j5qMqCFcx$j zpc+9J3(#+*dUf55{&poery;6-a5u@W#$T%9N9Z?qm*m=!b?elcpl*snH9wR;hhR2( z+TuQ{+bF=>Lv|N?O4b~`=+wfglkmTgy$bpktn*669}0X`Q->p@Y-*VaMUJqcBTXoJ zlnvGB5Vd$P!rK@IR}nmpB0`aB$sAOJbRdTjFmBT`GAsv{lA#G9B}20bMOtjA)r6wQ z*if4Z<)v(>U56-F9l~RsOej>#^zn!ND+nG(UN*W=v{48IWDZ4FGI1O7=1a}7g{=lA zWhRduLTVf%1nzMT?y=j!JxSw6@_G;wHk(32axX$k)2EnFq+Ae~}Rc$D`mhgZlmv|(dd-t*}s-`?7NMhFh2%(4p!L^J%%6`%?lOIum24 z?&hvd?$XaZc+*hm5{=N*zjh?BY`i<2Eqd=S5n+Q5)`ITB++psBan0Cq;xM`E05vAZ zogUljfvy(#I8tych&QkeDZZf*d^U9_rKA8a-vNfI4ZeUc;czW{BSJD|jc|{EOiCj+ z*%0>#sI(v0(2s10dju4edjwSIr#AF+8{!@T1-;9LxJN*x-D5-d>JaVWdW0Qg)}nA| zC+~lzc$4Mr2fkr6IaG`t1K9oh#_L6s!^Iv@CSQp3`n+B6IU`VU|8;hD4-R*3?B~vb z&H=M^VBwK99XTOK9R>Q~Vo>!ar$O_G?b2M^HQeQmp~qBBD{5$MgTGB98;5&OK4ZA2 zGmBgh0E$ZHd_!~JNXb-ek9jzt8`T8<LQ(N9F=I*XOVPLR-{b1LovUR;1dxpvuY^gdVe!}U!eQWzqA1XVwcX;T80~ejp z+t+ zq&}K=s6ILeMo!+?+dWncYF7iTE~gpVu&a5HE2MQ?Y|=lbbUXub&$Fh~J&cVe-kVC- z!+=CBY}3h|-6MmYo4U3b_z2+8wKl_z-JRY2YkLN|*7vY1$OL;1mk529;h{$f)QiLR z4#)&u&Lr>nyH|7>D#61GAzn1Cuz0$Z6Y_Rp9J-x_r|1@8%BaGjV#*}C$Pbl}C+1Z; z@Vwo1-aQO{NvMQvl6m+SAsqM&v!(8-@%PHY=RO+#O(ERDFJm11%)`_0L;9v}_O|Ka zVusNJ13y$uJsTY2i(epJ%&qy)@V&s~2aI_9XJGpp7|NG�Epfn}K6!R~npYp%Szy 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�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 QLsL4EMz)&P6sldG85&%qglnDbX8{xYNeW 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

{~mcUNqP-~omGp`^UTU~L^ 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 GD*p#8y~J<; literal 0 HcmV?d00001 diff --git a/OtherLib/libssl.lib b/OtherLib/libssl.lib new file mode 100644 index 0000000000000000000000000000000000000000..64d43c26ac4dedebb1f649400ec99e5d83f74103 GIT binary patch literal 126770 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%0Df~vUT#vr$KtCPETr?^# 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 literal 0 HcmV?d00001 diff --git a/OtherLib/zlibstatic.lib b/OtherLib/zlibstatic.lib new file mode 100644 index 0000000000000000000000000000000000000000..cd97648b8bf5f15ee42c6e5cb98cbc1eab1e8fa8 GIT binary patch literal 116008 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

{~mcUNqP-~omGp`^UTU~L^ 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 GD*p#8y~J<; literal 0 HcmV?d00001 diff --git a/OtherInc/openssl/lib/libssl.lib b/OtherInc/openssl/lib/libssl.lib new file mode 100644 index 0000000000000000000000000000000000000000..64d43c26ac4dedebb1f649400ec99e5d83f74103 GIT binary patch literal 126770 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%0Df~vUT#vr$KtCPETr?^# zP&oLF&F~nl@D&H(Cr-mR +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + RAPIDJSON_ASSERT(buffer != 0); + RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = reinterpret_cast(buffer); + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + RAPIDJSON_DELETE(ownBaseAllocator_); + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while (chunkHead_ && chunkHead_ != userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + if (chunkHead_ && chunkHead_ == userBuffer_) + chunkHead_->size = 0; // Clear user buffer + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + if (!size) + return NULL; + + size = RAPIDJSON_ALIGN(size); + if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity) + if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) + return NULL; + + void *buffer = reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size; + chunkHead_->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + if (newSize == 0) + return NULL; + + originalSize = RAPIDJSON_ALIGN(originalSize); + newSize = RAPIDJSON_ALIGN(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) { + size_t increment = static_cast(newSize - originalSize); + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + if (void* newBuffer = Malloc(newSize)) { + if (originalSize) + std::memcpy(newBuffer, originalPtr, originalSize); + return newBuffer; + } + else + return NULL; + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) { (void)ptr; } // Do nothing + +private: + //! Copy constructor is not permitted. + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */; + //! Copy assignment operator is not permitted. + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */; + + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + \return true if success. + */ + bool AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator()); + if (ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) { + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + return true; + } + else + return false; + } + + static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + void *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/OtherInc/rapidjson/document.h b/OtherInc/rapidjson/document.h new file mode 100644 index 0000000..e3e20df --- /dev/null +++ b/OtherInc/rapidjson/document.h @@ -0,0 +1,2575 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include "memorystream.h" +#include "encodedstream.h" +#include // placement new +#include + +RAPIDJSON_DIAG_PUSH +#ifdef _MSC_VER +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_OFF(effc++) +#if __GNUC__ >= 6 +RAPIDJSON_DIAG_OFF(terminate) // ignore throwing RAPIDJSON_ASSERT in RAPIDJSON_NOEXCEPT functions +#endif +#endif // __GNUC__ + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS +#include // std::iterator, std::random_access_iterator_tag +#endif + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template +class GenericValue; + +template +class GenericDocument; + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template +struct GenericMember { + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template +class GenericMemberIterator + : public std::iterator >::Type> { + + friend class GenericValue; + template friend class GenericMemberIterator; + + typedef GenericMember PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef std::iterator BaseType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator NonConstIterator; + + //! Pointer to (const) GenericMember + typedef typename BaseType::pointer Pointer; + //! Reference to (const) GenericMember + typedef typename BaseType::reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef typename BaseType::difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; } + bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; } + bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; } + bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; } + bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; } + bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; } + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template +struct GenericMemberIterator; + +//! non-const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain pointer as iterator type + typedef GenericMember* Iterator; +}; +//! const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain const pointer as iterator type + typedef const GenericMember* Iterator; +}; + +#endif // RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array +#ifndef __clang__ // -Wdocumentation + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + template + GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer +#ifndef __clang__ // -Wdocumentation + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + explicit GenericStringRef(const CharType* str) + : s(str), length(internal::StrLen(str)){ RAPIDJSON_ASSERT(s != 0); } + + //! Create constant string reference from pointer and length +#ifndef __clang__ // -Wdocumentation + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ +#endif + GenericStringRef(const CharType* str, SizeType len) + : s(str), length(len) { RAPIDJSON_ASSERT(s != 0); } + + GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} + + GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; } + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + //! Disallow construction from non-const array + template + GenericStringRef(CharType (&str)[N]) /* = delete */; +}; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template +inline GenericStringRef StringRef(const CharType* str) { + return GenericStringRef(str, internal::StrLen(str)); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template +inline GenericStringRef StringRef(const CharType* str, size_t length) { + return GenericStringRef(str, SizeType(length)); +} + +#if RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. +*/ +template +inline GenericStringRef StringRef(const std::basic_string& str) { + return GenericStringRef(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template struct IsGenericValueImpl::Type, typename Void::Type> + : IsBaseOf, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template struct IsGenericValue : IsGenericValueImpl::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// TypeHelper + +namespace internal { + +template +struct TypeHelper {}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsBool(); } + static bool Get(const ValueType& v) { return v.GetBool(); } + static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } + static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static int Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt64(); } + static int64_t Get(const ValueType& v) { return v.GetInt64(); } + static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } + static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint64(); } + static uint64_t Get(const ValueType& v) { return v.GetUint64(); } + static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } + static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsDouble(); } + static double Get(const ValueType& v) { return v.GetDouble(); } + static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } + static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsFloat(); } + static float Get(const ValueType& v) { return v.GetFloat(); } + static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } + static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } +}; + +template +struct TypeHelper { + typedef const typename ValueType::Ch* StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return v.GetString(); } + static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } + static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; + +#if RAPIDJSON_HAS_STDSTRING +template +struct TypeHelper > { + typedef std::basic_string StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } + static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; +#endif + +template +struct TypeHelper { + typedef typename ValueType::Array ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(ValueType& v) { return v.GetArray(); } + static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } + static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstArray ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(const ValueType& v) { return v.GetArray(); } +}; + +template +struct TypeHelper { + typedef typename ValueType::Object ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(ValueType& v) { return v.GetObject(); } + static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } + static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstObject ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(const ValueType& v) { return v.GetObject(); } +}; + +} // namespace internal + +// Forward declarations +template class GenericArray; +template class GenericObject; + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template > +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + typedef GenericValue ValueType; //!< Value type of itself. + typedef GenericArray Array; + typedef GenericArray ConstArray; + typedef GenericObject Object; + typedef GenericObject ConstObject; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { + rhs.data_.f.flags = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Moving from a GenericDocument is not permitted. + template + GenericValue(GenericDocument&& rhs); + + //! Move assignment from a GenericDocument is not permitted. + template + GenericValue& operator=(GenericDocument&& rhs); +#endif + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { + static const uint16_t defaultFlags[7] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + RAPIDJSON_ASSERT(type <= kNumberType); + data_.f.flags = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \see CopyFrom() + */ + template< typename SourceAllocator > + GenericValue(const GenericValue& rhs, Allocator & allocator); + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template + explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 +#else + explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT +#endif + : data_() { + // safe-guard against failing SFINAE + RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); + data_.f.flags = b ? kTrueFlag : kFalseFlag; + } + + //! Constructor for int value. + explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i; + data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u; + data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i64; + data_.f.flags = kNumberInt64Flag; + if (i64 >= 0) { + data_.f.flags |= kNumberUint64Flag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u64; + data_.f.flags = kNumberUint64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + data_.f.flags |= kInt64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Constructor for Array. + /*! + \param a An array obtained by \c GetArray(). + \note \c Array is always pass-by-value. + \note the source array is moved into this value and the sourec array becomes empty. + */ + GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { + a.value_.data_ = Data(); + a.value_.data_.f.flags = kArrayFlag; + } + + //! Constructor for Object. + /*! + \param o An object obtained by \c GetObject(). + \note \c Object is always pass-by-value. + \note the source object is moved into this value and the sourec object becomes empty. + */ + GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { + o.value_.data_ = Data(); + o.value_.data_.f.flags = kObjectFlag; + } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(data_.f.flags) { + case kArrayFlag: + { + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(e); + } + break; + + case kObjectFlag: + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(GetMembersPointer()); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast(GetStringPointer())); + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + RAPIDJSON_ASSERT(this != &rhs); + this->~GenericValue(); + RawAssign(rhs); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + */ + template + GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator) { + RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.value, b.value); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Linear time complexity (number of all values in the subtree and total lengths of all strings). + */ + template + bool operator==(const GenericValue& rhs) const { + typedef GenericValue RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) { + double a = GetDouble(); // May convert from integer to double. + double b = rhs.GetDouble(); // Ditto + return a >= b && a <= b; // Prevent -Wfloat-equal + } + else + return data_.n.u64 == rhs.data_.n.u64; + + default: + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template + bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } + bool IsNull() const { return data_.f.flags == kNullFlag; } + bool IsFalse() const { return data_.f.flags == kFalseFlag; } + bool IsTrue() const { return data_.f.flags == kTrueFlag; } + bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } + bool IsObject() const { return data_.f.flags == kObjectFlag; } + bool IsArray() const { return data_.f.flags == kArrayFlag; } + bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } + bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } + bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } + bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } + bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } + bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } + bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } + + // Checks whether a number can be losslessly converted to a double. + bool IsLosslessDouble() const { + if (!IsNumber()) return false; + if (IsUint64()) { + uint64_t u = GetUint64(); + volatile double d = static_cast(u); + return (d >= 0.0) + && (d < static_cast(std::numeric_limits::max())) + && (u == static_cast(d)); + } + if (IsInt64()) { + int64_t i = GetInt64(); + volatile double d = static_cast(i); + return (d >= static_cast(std::numeric_limits::min())) + && (d < static_cast(std::numeric_limits::max())) + && (i == static_cast(d)); + } + return true; // double, int, uint are always lossless + } + + // Checks whether a number is a float (possible lossy). + bool IsFloat() const { + if ((data_.f.flags & kDoubleFlag) == 0) + return false; + double d = GetDouble(); + return d >= -3.4028234e38 && d <= 3.4028234e38; + } + // Checks whether a number can be losslessly converted to a float. + bool IsLosslessFloat() const { + if (!IsNumber()) return false; + double a = GetDouble(); + if (a < static_cast(-std::numeric_limits::max()) + || a > static_cast(std::numeric_limits::max())) + return false; + double b = static_cast(static_cast(a)); + return a >= b && a <= b; // Prevent -Wfloat-equal + } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template + GenericValue& operator[](const GenericValue& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + RAPIDJSON_ASSERT(false); // see above note + + // This will generate -Wexit-time-destructors in clang + // static GenericValue NullValue; + // return NullValue; + + // Use static buffer and placement-new to prevent destruction + static char buffer[sizeof(GenericValue)]; + return *new (buffer) GenericValue(); + } + } + template + const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } + +#if RAPIDJSON_HAS_STDSTRING + //! Get a value from an object associated with name (string object). + GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } + const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } +#endif + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + +#if RAPIDJSON_HAS_STDSTRING + //! Check whether a member exists in the object with string object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } +#endif + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template + bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template + MemberIterator FindMember(const GenericValue& name) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } + +#if RAPIDJSON_HAS_STDSTRING + //! Find member by string object name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + */ + MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } + ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } +#endif + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + + ObjectData& o = data_.o; + if (o.size >= o.capacity) { + if (o.capacity == 0) { + o.capacity = kDefaultObjectCapacity; + SetMembersPointer(reinterpret_cast(allocator.Malloc(o.capacity * sizeof(Member)))); + } + else { + SizeType oldCapacity = o.capacity; + o.capacity += (oldCapacity + 1) / 2; // grow by factor 1.5 + SetMembersPointer(reinterpret_cast(allocator.Realloc(GetMembersPointer(), oldCapacity * sizeof(Member), o.capacity * sizeof(Member)))); + } + } + Member* members = GetMembersPointer(); + members[o.size].name.RawAssign(name); + members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Add a string object as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { + GenericValue v(value, allocator); + return AddMember(name, v, allocator); + } +#endif + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A string value as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(GenericValue& name, T value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } +#endif + + template + bool RemoveMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + + MemberIterator last(GetMembersPointer() + (data_.o.size - 1)); + if (data_.o.size > 1 && m != last) + *m = *last; // Move the last one to this place + else + m->~Member(); // Only one left, just destroy + --data_.o.size; + return m; + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; itr != last; ++itr) + itr->~Member(); + std::memmove(&*pos, &*last, static_cast(MemberEnd() - last) * sizeof(Member)); + data_.o.size -= static_cast(last - first); + return pos; + } + + //! Erase a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Linear time complexity. + */ + bool EraseMember(const Ch* name) { + GenericValue n(StringRef(name)); + return EraseMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } +#endif + + template + bool EraseMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + EraseMember(m); + return true; + } + else + return false; + } + + Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return GetElementsPointer()[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + GetElementsPointer()[data_.a.size++].RawAssign(value); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + GetElementsPointer()[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(data_.a.size > 0); + RAPIDJSON_ASSERT(GetElementsPointer() != 0); + RAPIDJSON_ASSERT(first >= Begin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(pos, last, static_cast(End() - last) * sizeof(GenericValue)); + data_.a.size -= static_cast(last - first); + return pos; + } + + Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } + ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } + + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } + + //! Get the value as double type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. + */ + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) + } + + //! Get the value as float type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. + */ + float GetFloat() const { + return static_cast(GetDouble()); + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(f); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { this->~GenericValue(); SetStringRaw(StringRef(s, length), allocator); return *this; } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(s, internal::StrLen(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(s.data(), SizeType(s.size()), allocator); } +#endif + + //@} + + //!@name Array + //@{ + + //! Templated version for checking whether this value is type T. + /*! + \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string + */ + template + bool Is() const { return internal::TypeHelper::Is(*this); } + + template + T Get() const { return internal::TypeHelper::Get(*this); } + + template + T Get() { return internal::TypeHelper::Get(*this); } + + template + ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } + + template + ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) + return false; + if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + return false; + for (const GenericValue* v = Begin(); v != End(); ++v) + if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); + + default: + RAPIDJSON_ASSERT(GetType() == kNumberType); + if (IsDouble()) return handler.Double(data_.n.d); + else if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else return handler.Uint64(data_.n.u64); + } + } + +private: + template friend class GenericValue; + template friend class GenericDocument; + + enum { + kBoolFlag = 0x0008, + kNumberFlag = 0x0010, + kIntFlag = 0x0020, + kUintFlag = 0x0040, + kInt64Flag = 0x0080, + kUint64Flag = 0x0100, + kDoubleFlag = 0x0200, + kStringFlag = 0x0400, + kCopyFlag = 0x0800, + kInlineStrFlag = 0x1000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0x07 + }; + + static const SizeType kDefaultArrayCapacity = 16; + static const SizeType kDefaultObjectCapacity = 16; + + struct Flag { +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION + char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer +#elif RAPIDJSON_64BIT + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes +#else + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes +#endif + uint16_t flags; + }; + + struct String { + SizeType length; + SizeType hashcode; //!< reserved + const Ch* str; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, + // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } + inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct ObjectData { + SizeType size; + SizeType capacity; + Member* members; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct ArrayData { + SizeType size; + SizeType capacity; + GenericValue* elements; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + ObjectData o; + ArrayData a; + Flag f; + }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION + + RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } + RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } + RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } + RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } + RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } + RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + data_.f.flags = kArrayFlag; + if (count) { + GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + SetElementsPointer(e); + std::memcpy(e, values, count * sizeof(GenericValue)); + } + else + SetElementsPointer(0); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + data_.f.flags = kObjectFlag; + if (count) { + Member* m = static_cast(allocator.Malloc(count * sizeof(Member))); + SetMembersPointer(m); + std::memcpy(m, members, count * sizeof(Member)); + } + else + SetMembersPointer(0); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { + data_.f.flags = kConstStringFlag; + SetStringPointer(s); + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = 0; + if (ShortString::Usable(s.length)) { + data_.f.flags = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + data_.f.flags = kCopyStringFlag; + data_.s.length = s.length; + str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); + SetStringPointer(str); + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + // data_.f.flags = rhs.data_.f.flags; + rhs.data_.f.flags = kNullFlag; + } + + template + bool StringEqual(const GenericValue& rhs) const { + RAPIDJSON_ASSERT(IsString()); + RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template , typename StackAllocator = CrtAllocator> +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! Creates an empty document of specified type. + \param type Mandatory type of object to create. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + } + + //! Constructor + /*! Creates an empty document which type is Null. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //! Exchange the contents of this document with those of another. + /*! + \param rhs Another document. + \note Constant complexity. + \see GenericValue::Swap + */ + GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { + ValueType::Swap(rhs); + stack_.Swap(rhs.stack_); + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(parseResult_, rhs.parseResult_); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.doc, b.doc); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Populate this document by a generator which produces SAX events. + /*! \tparam Generator A functor with bool f(Handler) prototype. + \param g Generator functor which sends SAX events to the parameter. + \return The document itself for fluent API. + */ + template + GenericDocument& Populate(Generator& g) { + ClearStackOnExit scope(*this); + if (g(*this)) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + GenericReader reader( + stack_.HasAllocator() ? &stack_.GetAllocator() : 0); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse(is, *this); + if (parseResult_) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + MemoryStream ms(static_cast(str), length * sizeof(typename SourceEncoding::Ch)); + EncodedInputStream is(ms); + ParseStream(is); + return *this; + } + + template + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + template + GenericDocument& Parse(const std::basic_string& str) { + // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) + return Parse(str.c_str()); + } + + template + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str.c_str()); + } + + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str); + } +#endif // RAPIDJSON_HAS_STDSTRING + + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //! Implicit conversion to get the last parse result +#ifndef __clang // -Wdocumentation + /*! \return \ref ParseResult of the last parse operation + + \code + Document doc; + ParseResult ok = doc.Parse(json); + if (!ok) + printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); + \endcode + */ +#endif + operator ParseResult() const { return parseResult_; } + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + // template friend class GenericReader; // for parsing + template friend class GenericValue; // for deep copying + +public: + // Implementation of Handler + bool Null() { new (stack_.template Push()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } + + bool RawNumber(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument > Document; + +// defined here due to the dependency on GenericDocument +template +template +inline +GenericValue::GenericValue(const GenericValue& rhs, Allocator& allocator) +{ + switch (rhs.GetType()) { + case kObjectType: + case kArrayType: { // perform deep copy via SAX Handler + GenericDocument d(&allocator); + rhs.Accept(d); + RawAssign(*d.stack_.template Pop(1)); + } + break; + case kStringType: + if (rhs.data_.f.flags == kConstStringFlag) { + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + } else { + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + } + break; + default: + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + break; + } +} + +//! Helper class for accessing Value of array type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetArray(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericArray { +public: + typedef GenericArray ConstArray; + typedef GenericArray Array; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef ValueType* ValueIterator; // This may be const or non-const iterator + typedef const ValueT* ConstValueIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + + template + friend class GenericValue; + + GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} + GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } + ~GenericArray() {} + + SizeType Size() const { return value_.Size(); } + SizeType Capacity() const { return value_.Capacity(); } + bool Empty() const { return value_.Empty(); } + void Clear() const { value_.Clear(); } + ValueType& operator[](SizeType index) const { return value_[index]; } + ValueIterator Begin() const { return value_.Begin(); } + ValueIterator End() const { return value_.End(); } + GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } + GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + GenericArray PopBack() const { value_.PopBack(); return *this; } + ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + ValueIterator begin() const { return value_.Begin(); } + ValueIterator end() const { return value_.End(); } +#endif + +private: + GenericArray(); + GenericArray(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +//! Helper class for accessing Value of object type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetObject(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericObject { +public: + typedef GenericObject ConstObject; + typedef GenericObject Object; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator + typedef GenericMemberIterator ConstMemberIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename ValueType::Ch Ch; + + template + friend class GenericValue; + + GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} + GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } + ~GenericObject() {} + + SizeType MemberCount() const { return value_.MemberCount(); } + bool ObjectEmpty() const { return value_.ObjectEmpty(); } + template ValueType& operator[](T* name) const { return value_[name]; } + template ValueType& operator[](const GenericValue& name) const { return value_[name]; } +#if RAPIDJSON_HAS_STDSTRING + ValueType& operator[](const std::basic_string& name) const { return value_[name]; } +#endif + MemberIterator MemberBegin() const { return value_.MemberBegin(); } + MemberIterator MemberEnd() const { return value_.MemberEnd(); } + bool HasMember(const Ch* name) const { return value_.HasMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } +#endif + template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } + MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } + template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } +#if RAPIDJSON_HAS_STDSTRING + MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } +#endif + GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_STDSTRING + GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + void RemoveAllMembers() { return value_.RemoveAllMembers(); } + bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } +#endif + template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } + MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } + MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } + bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } +#endif + template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + MemberIterator begin() const { return value_.MemberBegin(); } + MemberIterator end() const { return value_.MemberEnd(); } +#endif + +private: + GenericObject(); + GenericObject(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/OtherInc/rapidjson/encodedstream.h b/OtherInc/rapidjson/encodedstream.h new file mode 100644 index 0000000..1450683 --- /dev/null +++ b/OtherInc/rapidjson/encodedstream.h @@ -0,0 +1,299 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODEDSTREAM_H_ +#define RAPIDJSON_ENCODEDSTREAM_H_ + +#include "stream.h" +#include "memorystream.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template +class EncodedInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Specialized for UTF8 MemoryStream. +template <> +class EncodedInputStream, MemoryStream> { +public: + typedef UTF8<>::Ch Ch; + + EncodedInputStream(MemoryStream& is) : is_(is) { + if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); + } + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) {} + void Flush() {} + Ch* PutBegin() { return 0; } + size_t PutEnd(Ch*) { return 0; } + + MemoryStream& is_; + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template +class EncodedOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template +class AutoUTFInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + DetectType(); + static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = reinterpret_cast(is_->Peek4()); + if (!c) + return; + + unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + unsigned pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam OutputByteStream type of output byte stream to be wrapped. +*/ +template +class AutoUTFOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + + static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef RAPIDJSON_ENCODINGS_FUNC + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/OtherInc/rapidjson/encodings.h b/OtherInc/rapidjson/encodings.h new file mode 100644 index 0000000..baa7c2b --- /dev/null +++ b/OtherInc/rapidjson/encodings.h @@ -0,0 +1,716 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODINGS_H_ +#define RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(overflow) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + PutUnsafe(os, static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { +#define COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) +#define TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + typename InputStream::Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = static_cast(c); + return true; + } + + unsigned char type = GetRange(static_cast(c)); + if (type >= 32) { + *codepoint = 0; + } else { + *codepoint = (0xFF >> type) & static_cast(c); + } + bool result = true; + switch (type) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + template + static bool Validate(InputStream& is, OutputStream& os) { +#define COPY() os.Put(c = is.Take()) +#define TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + Ch c; + COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange(static_cast(c))) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + typename InputByteStream::Ch c = Take(is); + if (static_cast(c) != 0xEFu) return c; + c = is.Take(); + if (static_cast(c) != 0xBBu) return c; + c = is.Take(); + if (static_cast(c) != 0xBFu) return c; + c = is.Take(); + return c; + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xEFu)); + os.Put(static_cast(0xBBu)); + os.Put(static_cast(0xBFu)); + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template +struct UTF16 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast((v >> 10) | 0xD800)); + os.Put((v & 0x3FF) | 0xDC00); + } + } + + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + PutUnsafe(os, static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + PutUnsafe(os, static_cast((v >> 10) | 0xD800)); + PutUnsafe(os, (v & 0x3FF) | 0xDC00); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + typename InputStream::Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = static_cast(c); + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (static_cast(c) & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (static_cast(c) & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + typename InputStream::Ch c; + os.Put(static_cast(c = is.Take())); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template +struct UTF16LE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(static_cast(c) & 0xFFu)); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + } +}; + +//! UTF-16 big endian encoding. +template +struct UTF16BE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 8; + c |= static_cast(is.Take()); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + os.Put(static_cast(static_cast(c) & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template +struct UTF32 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, codepoint); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template +struct UTF32LE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 24; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 24) & 0xFFu)); + } +}; + +//! UTF-32 big endian encoding. +template +struct UTF32BE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 24; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((c >> 24) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast(c & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast(codepoint & 0xFF)); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + PutUnsafe(os, static_cast(codepoint & 0xFF)); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + uint8_t c = static_cast(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + uint8_t c = static_cast(is.Take()); + os.Put(static_cast(c)); + return c <= 0x7F; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + uint8_t c = static_cast(Take(is)); + return static_cast(c); + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + + template + RAPIDJSON_FORCEINLINE static void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; + (*f[os.GetType()])(os, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template + RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::EncodeUnsafe(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +// Forward declaration. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c); + +//! Specialization of Transcoder with same source and target encoding. +template +struct Transcoder { + template + RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/OtherInc/rapidjson/error/en.h b/OtherInc/rapidjson/error/en.h new file mode 100644 index 0000000..2db838b --- /dev/null +++ b/OtherInc/rapidjson/error/en.h @@ -0,0 +1,74 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_EN_H_ +#define RAPIDJSON_ERROR_EN_H_ + +#include "error.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(covered-switch-default) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); + + case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_EN_H_ diff --git a/OtherInc/rapidjson/error/error.h b/OtherInc/rapidjson/error/error.h new file mode 100644 index 0000000..95cb31a --- /dev/null +++ b/OtherInc/rapidjson/error/error.h @@ -0,0 +1,155 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_ERROR_H_ +#define RAPIDJSON_ERROR_ERROR_H_ + +#include "../rapidjson.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +/*! \file error.h */ + +/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_CHARTYPE +#define RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_STRING +#define RAPIDJSON_ERROR_STRING(x) x +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { +public: + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Conversion to \c bool, returns \c true, iff !\ref IsError(). + operator bool() const { return !IsError(); } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_ERROR_H_ diff --git a/OtherInc/rapidjson/filereadstream.h b/OtherInc/rapidjson/filereadstream.h new file mode 100644 index 0000000..b56ea13 --- /dev/null +++ b/OtherInc/rapidjson/filereadstream.h @@ -0,0 +1,99 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEREADSTREAM_H_ +#define RAPIDJSON_FILEREADSTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(fp_ != 0); + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/OtherInc/rapidjson/filewritestream.h b/OtherInc/rapidjson/filewritestream.h new file mode 100644 index 0000000..6378dd6 --- /dev/null +++ b/OtherInc/rapidjson/filewritestream.h @@ -0,0 +1,104 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEWRITESTREAM_H_ +#define RAPIDJSON_FILEWRITESTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + size_t result = fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); + if (result < static_cast(current_ - buffer_)) { + // failure deliberately ignored at this time + // added to avoid warn_unused_result build errors + } + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/OtherInc/rapidjson/fwd.h b/OtherInc/rapidjson/fwd.h new file mode 100644 index 0000000..e8104e8 --- /dev/null +++ b/OtherInc/rapidjson/fwd.h @@ -0,0 +1,151 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FWD_H_ +#define RAPIDJSON_FWD_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +// encodings.h + +template struct UTF8; +template struct UTF16; +template struct UTF16BE; +template struct UTF16LE; +template struct UTF32; +template struct UTF32BE; +template struct UTF32LE; +template struct ASCII; +template struct AutoUTF; + +template +struct Transcoder; + +// allocators.h + +class CrtAllocator; + +template +class MemoryPoolAllocator; + +// stream.h + +template +struct GenericStringStream; + +typedef GenericStringStream > StringStream; + +template +struct GenericInsituStringStream; + +typedef GenericInsituStringStream > InsituStringStream; + +// stringbuffer.h + +template +class GenericStringBuffer; + +typedef GenericStringBuffer, CrtAllocator> StringBuffer; + +// filereadstream.h + +class FileReadStream; + +// filewritestream.h + +class FileWriteStream; + +// memorybuffer.h + +template +struct GenericMemoryBuffer; + +typedef GenericMemoryBuffer MemoryBuffer; + +// memorystream.h + +struct MemoryStream; + +// reader.h + +template +struct BaseReaderHandler; + +template +class GenericReader; + +typedef GenericReader, UTF8, CrtAllocator> Reader; + +// writer.h + +template +class Writer; + +// prettywriter.h + +template +class PrettyWriter; + +// document.h + +template +struct GenericMember; + +template +class GenericMemberIterator; + +template +struct GenericStringRef; + +template +class GenericValue; + +typedef GenericValue, MemoryPoolAllocator > Value; + +template +class GenericDocument; + +typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; + +// pointer.h + +template +class GenericPointer; + +typedef GenericPointer Pointer; + +// schema.h + +template +class IGenericRemoteSchemaDocumentProvider; + +template +class GenericSchemaDocument; + +typedef GenericSchemaDocument SchemaDocument; +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +template < + typename SchemaDocumentType, + typename OutputHandler, + typename StateAllocator> +class GenericSchemaValidator; + +typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/OtherInc/rapidjson/internal/biginteger.h b/OtherInc/rapidjson/internal/biginteger.h new file mode 100644 index 0000000..9d3e88c --- /dev/null +++ b/OtherInc/rapidjson/internal/biginteger.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_BIGINTEGER_H_ +#define RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) +#include // for _umul128 +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + BigInteger(const char* decimals, size_t length) : count_(1) { + RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(const BigInteger &rhs) + { + if (this != &rhs) { + count_ = rhs.count_; + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + return *this; + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(&digits_[count_ - 1 + offset], &digits_[count_ - 1], count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 5, + 5 * 5, + 5 * 5 * 5, + 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Assume this != rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + RAPIDJSON_ASSERT(cmp != 0); + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + void AppendDecimal64(const char* begin, const char* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + static uint64_t ParseUint64(const char* begin, const char* end) { + uint64_t r = 0; + for (const char* p = begin; p != end; ++p) { + RAPIDJSON_ASSERT(*p >= '0' && *p <= '9'); + r = r * 10u + static_cast(*p - '0'); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(a) * static_cast(b); + p += k; + *outHigh = static_cast(p >> 64); + return static_cast(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/OtherInc/rapidjson/internal/diyfp.h b/OtherInc/rapidjson/internal/diyfp.h new file mode 100644 index 0000000..c9fefdc --- /dev/null +++ b/OtherInc/rapidjson/internal/diyfp.h @@ -0,0 +1,258 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DIYFP_H_ +#define RAPIDJSON_DIYFP_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) +#include +#pragma intrinsic(_BitScanReverse64) +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +struct DiyFp { + DiyFp() : f(), e() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(f) * static_cast(rhs.f); + uint64_t h = static_cast(p >> 64); + uint64_t l = static_cast(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { +#if defined(_MSC_VER) && defined(_M_AMD64) + unsigned long index; + _BitScanReverse64(&index, f); + return DiyFp(f << (63 - index), e - (63 - index)); +#elif defined(__GNUC__) && __GNUC__ >= 4 + int s = __builtin_clzll(f); + return DiyFp(f << s, e - s); +#else + DiyFp res = *this; + while (!(res.f & (static_cast(1) << 63))) { + res.f <<= 1; + res.e--; + } + return res; +#endif + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : + static_cast(e + kDpExponentBias); + u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast(dk); + if (dk - k > 0.0) + k++; + + unsigned index = static_cast((k >> 3) + 1); + *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + unsigned index = (static_cast(exp) + 348u) / 8u; + *outExp = -348 + static_cast(index) * 8; + return GetCachedPowerByIndex(index); + } + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +RAPIDJSON_DIAG_OFF(padded) +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DIYFP_H_ diff --git a/OtherInc/rapidjson/internal/dtoa.h b/OtherInc/rapidjson/internal/dtoa.h new file mode 100644 index 0000000..8d6350e --- /dev/null +++ b/OtherInc/rapidjson/internal/dtoa.h @@ -0,0 +1,245 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DTOA_ +#define RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" +#include "ieee754.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline unsigned CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + // Will not reach 10 digits in DigitGen() + //if (n < 1000000000) return 9; + //return 10; + return 9; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + unsigned kappa = CountDecimalDigit32(p1); // kappa in [0, 9] + *len = 0; + + while (kappa > 0) { + uint32_t d = 0; + switch (kappa) { + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default:; + } + if (d || *len) + buffer[(*len)++] = static_cast('0' + static_cast(d)); + kappa--; + uint64_t tmp = (static_cast(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, static_cast(kPow10[kappa]) << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + int index = -static_cast(kappa); + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[-static_cast(kappa)] : 0)); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast('0' + static_cast(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast('0' + static_cast(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (0 <= k && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); + buffer[kk] = '.'; + if (0 > k + maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[kk + 2]; // Reserve one zero + } + else + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], static_cast(length)); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + if (length - kk > maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = maxDecimalPlaces + 1; i > 2; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[3]; // Reserve one zero + } + else + return &buffer[length + offset]; + } + else if (kk < -maxDecimalPlaces) { + // Truncate to zero + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { + RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); + Double d(value); + if (d.IsZero()) { + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K, maxDecimalPlaces); + } +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DTOA_ diff --git a/OtherInc/rapidjson/internal/ieee754.h b/OtherInc/rapidjson/internal/ieee754.h new file mode 100644 index 0000000..82bb0b9 --- /dev/null +++ b/OtherInc/rapidjson/internal/ieee754.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_IEEE754_ +#define RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d_(d) {} + Double(uint64_t u) : u_(u) {} + + double Value() const { return d_; } + uint64_t Uint64Value() const { return u_; } + + double NextPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + return Double(u_ + 1).Value(); + } + + bool Sign() const { return (u_ & kSignMask) != 0; } + uint64_t Significand() const { return u_ & kSignificandMask; } + int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } + + bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } + bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } + + static unsigned EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return static_cast(order) + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d_; + uint64_t u_; + }; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_IEEE754_ diff --git a/OtherInc/rapidjson/internal/itoa.h b/OtherInc/rapidjson/internal/itoa.h new file mode 100644 index 0000000..01a4e7e --- /dev/null +++ b/OtherInc/rapidjson/internal/itoa.h @@ -0,0 +1,304 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ITOA_ +#define RAPIDJSON_ITOA_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast('0' + static_cast(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + uint32_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u32toa(u, buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + if (value >= kTen8) + *buffer++ = cDigitsLut[d4 + 1]; + + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast('0' + static_cast(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast('0' + static_cast(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + uint64_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u64toa(u, buffer); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ITOA_ diff --git a/OtherInc/rapidjson/internal/meta.h b/OtherInc/rapidjson/internal/meta.h new file mode 100644 index 0000000..5a9aaa4 --- /dev/null +++ b/OtherInc/rapidjson/internal/meta.h @@ -0,0 +1,181 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_META_H_ +#define RAPIDJSON_INTERNAL_META_H_ + +#include "../rapidjson.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif +#if defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(6334) +#endif + +#if RAPIDJSON_HAS_CXX11_TYPETRAITS +#include +#endif + +//@cond RAPIDJSON_INTERNAL +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType TrueType; +typedef BoolType FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; +template struct SelectIfCond : SelectIfImpl::template Apply {}; +template struct SelectIf : SelectIfCond {}; + +template struct AndExprCond : FalseType {}; +template <> struct AndExprCond : TrueType {}; +template struct OrExprCond : TrueType {}; +template <> struct OrExprCond : FalseType {}; + +template struct BoolExpr : SelectIf::Type {}; +template struct NotExpr : SelectIf::Type {}; +template struct AndExpr : AndExprCond::Type {}; +template struct OrExpr : OrExprCond::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template struct AddConst { typedef const T Type; }; +template struct MaybeAddConst : SelectIfCond {}; +template struct RemoveConst { typedef T Type; }; +template struct RemoveConst { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template struct IsSame : FalseType {}; +template struct IsSame : TrueType {}; + +template struct IsConst : FalseType {}; +template struct IsConst : TrueType {}; + +template +struct IsMoreConst + : AndExpr::Type, typename RemoveConst::Type>, + BoolType::Value >= IsConst::Value> >::Type {}; + +template struct IsPointer : FalseType {}; +template struct IsPointer : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if RAPIDJSON_HAS_CXX11_TYPETRAITS + +template struct IsBaseOf + : BoolType< ::std::is_base_of::value> {}; + +#else // simplified version adopted from Boost + +template struct IsBaseOfImpl { + RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template struct IsBaseOf + : OrExpr, BoolExpr > >::Type {}; + +#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template struct EnableIfCond { typedef T Type; }; +template struct EnableIfCond { /* empty */ }; + +template struct DisableIfCond { typedef T Type; }; +template struct DisableIfCond { /* empty */ }; + +template +struct EnableIf : EnableIfCond {}; + +template +struct DisableIf : DisableIfCond {}; + +// SFINAE helpers +struct SfinaeTag {}; +template struct RemoveSfinaeTag; +template struct RemoveSfinaeTag { typedef T Type; }; + +#define RAPIDJSON_REMOVEFPTR_(type) \ + typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define RAPIDJSON_ENABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type * = NULL + +#define RAPIDJSON_DISABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type * = NULL + +#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type + +#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type + +} // namespace internal +RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/OtherInc/rapidjson/internal/pow10.h b/OtherInc/rapidjson/internal/pow10.h new file mode 100644 index 0000000..02f475d --- /dev/null +++ b/OtherInc/rapidjson/internal/pow10.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_POW10_ diff --git a/OtherInc/rapidjson/internal/regex.h b/OtherInc/rapidjson/internal/regex.h new file mode 100644 index 0000000..422a524 --- /dev/null +++ b/OtherInc/rapidjson/internal/regex.h @@ -0,0 +1,701 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_REGEX_H_ +#define RAPIDJSON_INTERNAL_REGEX_H_ + +#include "../allocators.h" +#include "../stream.h" +#include "stack.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +#ifndef RAPIDJSON_REGEX_VERBOSE +#define RAPIDJSON_REGEX_VERBOSE 0 +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// GenericRegex + +static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 +static const SizeType kRegexInvalidRange = ~SizeType(0); + +//! Regular expression engine with subset of ECMAscript grammar. +/*! + Supported regular expression syntax: + - \c ab Concatenation + - \c a|b Alternation + - \c a? Zero or one + - \c a* Zero or more + - \c a+ One or more + - \c a{3} Exactly 3 times + - \c a{3,} At least 3 times + - \c a{3,5} 3 to 5 times + - \c (ab) Grouping + - \c ^a At the beginning + - \c a$ At the end + - \c . Any character + - \c [abc] Character classes + - \c [a-c] Character class range + - \c [a-z0-9_] Character class combination + - \c [^abc] Negated character classes + - \c [^a-c] Negated character class range + - \c [\b] Backspace (U+0008) + - \c \\| \\\\ ... Escape characters + - \c \\f Form feed (U+000C) + - \c \\n Line feed (U+000A) + - \c \\r Carriage return (U+000D) + - \c \\t Tab (U+0009) + - \c \\v Vertical tab (U+000B) + + \note This is a Thompson NFA engine, implemented with reference to + Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", + https://swtch.com/~rsc/regexp/regexp1.html +*/ +template +class GenericRegex { +public: + typedef typename Encoding::Ch Ch; + + GenericRegex(const Ch* source, Allocator* allocator = 0) : + states_(allocator, 256), ranges_(allocator, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), + stateSet_(), state0_(allocator, 0), state1_(allocator, 0), anchorBegin_(), anchorEnd_() + { + GenericStringStream ss(source); + DecodedStream > ds(ss); + Parse(ds); + } + + ~GenericRegex() { + Allocator::Free(stateSet_); + } + + bool IsValid() const { + return root_ != kRegexInvalidState; + } + + template + bool Match(InputStream& is) const { + return SearchWithAnchoring(is, true, true); + } + + bool Match(const Ch* s) const { + GenericStringStream is(s); + return Match(is); + } + + template + bool Search(InputStream& is) const { + return SearchWithAnchoring(is, anchorBegin_, anchorEnd_); + } + + bool Search(const Ch* s) const { + GenericStringStream is(s); + return Search(is); + } + +private: + enum Operator { + kZeroOrOne, + kZeroOrMore, + kOneOrMore, + kConcatenation, + kAlternation, + kLeftParenthesis + }; + + static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' + static const unsigned kRangeCharacterClass = 0xFFFFFFFE; + static const unsigned kRangeNegationFlag = 0x80000000; + + struct Range { + unsigned start; // + unsigned end; + SizeType next; + }; + + struct State { + SizeType out; //!< Equals to kInvalid for matching state + SizeType out1; //!< Equals to non-kInvalid for split + SizeType rangeStart; + unsigned codepoint; + }; + + struct Frag { + Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} + SizeType start; + SizeType out; //!< link-list of all output states + SizeType minIndex; + }; + + template + class DecodedStream { + public: + DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } + unsigned Peek() { return codepoint_; } + unsigned Take() { + unsigned c = codepoint_; + if (c) // No further decoding when '\0' + Decode(); + return c; + } + + private: + void Decode() { + if (!Encoding::Decode(ss_, &codepoint_)) + codepoint_ = 0; + } + + SourceStream& ss_; + unsigned codepoint_; + }; + + State& GetState(SizeType index) { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + const State& GetState(SizeType index) const { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + Range& GetRange(SizeType index) { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + const Range& GetRange(SizeType index) const { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + template + void Parse(DecodedStream& ds) { + Allocator allocator; + Stack operandStack(&allocator, 256); // Frag + Stack operatorStack(&allocator, 256); // Operator + Stack atomCountStack(&allocator, 256); // unsigned (Atom per parenthesis) + + *atomCountStack.template Push() = 0; + + unsigned codepoint; + while (ds.Peek() != 0) { + switch (codepoint = ds.Take()) { + case '^': + anchorBegin_ = true; + break; + + case '$': + anchorEnd_ = true; + break; + + case '|': + while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + *operatorStack.template Push() = kAlternation; + *atomCountStack.template Top() = 0; + break; + + case '(': + *operatorStack.template Push() = kLeftParenthesis; + *atomCountStack.template Push() = 0; + break; + + case ')': + while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + if (operatorStack.Empty()) + return; + operatorStack.template Pop(1); + atomCountStack.template Pop(1); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '?': + if (!Eval(operandStack, kZeroOrOne)) + return; + break; + + case '*': + if (!Eval(operandStack, kZeroOrMore)) + return; + break; + + case '+': + if (!Eval(operandStack, kOneOrMore)) + return; + break; + + case '{': + { + unsigned n, m; + if (!ParseUnsigned(ds, &n)) + return; + + if (ds.Peek() == ',') { + ds.Take(); + if (ds.Peek() == '}') + m = kInfinityQuantifier; + else if (!ParseUnsigned(ds, &m) || m < n) + return; + } + else + m = n; + + if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') + return; + ds.Take(); + } + break; + + case '.': + PushOperand(operandStack, kAnyCharacterClass); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '[': + { + SizeType range; + if (!ParseRange(ds, &range)) + return; + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); + GetState(s).rangeStart = range; + *operandStack.template Push() = Frag(s, s, s); + } + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '\\': // Escape character + if (!CharacterEscape(ds, &codepoint)) + return; // Unsupported escape character + // fall through to default + + default: // Pattern character + PushOperand(operandStack, codepoint); + ImplicitConcatenation(atomCountStack, operatorStack); + } + } + + while (!operatorStack.Empty()) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + + // Link the operand to matching state. + if (operandStack.GetSize() == sizeof(Frag)) { + Frag* e = operandStack.template Pop(1); + Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); + root_ = e->start; + +#if RAPIDJSON_REGEX_VERBOSE + printf("root: %d\n", root_); + for (SizeType i = 0; i < stateCount_ ; i++) { + State& s = GetState(i); + printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); + } + printf("\n"); +#endif + } + + // Preallocate buffer for SearchWithAnchoring() + RAPIDJSON_ASSERT(stateSet_ == 0); + if (stateCount_ > 0) { + stateSet_ = static_cast(states_.GetAllocator().Malloc(GetStateSetSize())); + state0_.template Reserve(stateCount_); + state1_.template Reserve(stateCount_); + } + } + + SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { + State* s = states_.template Push(); + s->out = out; + s->out1 = out1; + s->codepoint = codepoint; + s->rangeStart = kRegexInvalidRange; + return stateCount_++; + } + + void PushOperand(Stack& operandStack, unsigned codepoint) { + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); + *operandStack.template Push() = Frag(s, s, s); + } + + void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { + if (*atomCountStack.template Top()) + *operatorStack.template Push() = kConcatenation; + (*atomCountStack.template Top())++; + } + + SizeType Append(SizeType l1, SizeType l2) { + SizeType old = l1; + while (GetState(l1).out != kRegexInvalidState) + l1 = GetState(l1).out; + GetState(l1).out = l2; + return old; + } + + void Patch(SizeType l, SizeType s) { + for (SizeType next; l != kRegexInvalidState; l = next) { + next = GetState(l).out; + GetState(l).out = s; + } + } + + bool Eval(Stack& operandStack, Operator op) { + switch (op) { + case kConcatenation: + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); + { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + Patch(e1.out, e2.start); + *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); + } + return true; + + case kAlternation: + if (operandStack.GetSize() >= sizeof(Frag) * 2) { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + SizeType s = NewState(e1.start, e2.start, 0); + *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); + return true; + } + return false; + + case kZeroOrOne: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); + return true; + } + return false; + + case kZeroOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(s, s, e.minIndex); + return true; + } + return false; + + default: + RAPIDJSON_ASSERT(op == kOneOrMore); + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(e.start, s, e.minIndex); + return true; + } + return false; + } + } + + bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { + RAPIDJSON_ASSERT(n <= m); + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); + + if (n == 0) { + if (m == 0) // a{0} not support + return false; + else if (m == kInfinityQuantifier) + Eval(operandStack, kZeroOrMore); // a{0,} -> a* + else { + Eval(operandStack, kZeroOrOne); // a{0,5} -> a? + for (unsigned i = 0; i < m - 1; i++) + CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? + for (unsigned i = 0; i < m - 1; i++) + Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? + } + return true; + } + + for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a + CloneTopOperand(operandStack); + + if (m == kInfinityQuantifier) + Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ + else if (m > n) { + CloneTopOperand(operandStack); // a{3,5} -> a a a a + Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? + for (unsigned i = n; i < m - 1; i++) + CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? + for (unsigned i = n; i < m; i++) + Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? + } + + for (unsigned i = 0; i < n - 1; i++) + Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? + + return true; + } + + static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } + + void CloneTopOperand(Stack& operandStack) { + const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation + SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) + State* s = states_.template Push(count); + memcpy(s, &GetState(src.minIndex), count * sizeof(State)); + for (SizeType j = 0; j < count; j++) { + if (s[j].out != kRegexInvalidState) + s[j].out += count; + if (s[j].out1 != kRegexInvalidState) + s[j].out1 += count; + } + *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); + stateCount_ += count; + } + + template + bool ParseUnsigned(DecodedStream& ds, unsigned* u) { + unsigned r = 0; + if (ds.Peek() < '0' || ds.Peek() > '9') + return false; + while (ds.Peek() >= '0' && ds.Peek() <= '9') { + if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 + return false; // overflow + r = r * 10 + (ds.Take() - '0'); + } + *u = r; + return true; + } + + template + bool ParseRange(DecodedStream& ds, SizeType* range) { + bool isBegin = true; + bool negate = false; + int step = 0; + SizeType start = kRegexInvalidRange; + SizeType current = kRegexInvalidRange; + unsigned codepoint; + while ((codepoint = ds.Take()) != 0) { + if (isBegin) { + isBegin = false; + if (codepoint == '^') { + negate = true; + continue; + } + } + + switch (codepoint) { + case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] + if (step == 2) { // Add trailing '-' + SizeType r = NewRange('-'); + RAPIDJSON_ASSERT(current != kRegexInvalidRange); + GetRange(current).next = r; + } + if (negate) + GetRange(start).start |= kRangeNegationFlag; + *range = start; + return true; + + case '\\': + if (ds.Peek() == 'b') { + ds.Take(); + codepoint = 0x0008; // Escape backspace character + } + else if (!CharacterEscape(ds, &codepoint)) + return false; + // fall through to default + + default: + switch (step) { + case 1: + if (codepoint == '-') { + step++; + break; + } + // fall through to step 0 for other characters + + case 0: + { + SizeType r = NewRange(codepoint); + if (current != kRegexInvalidRange) + GetRange(current).next = r; + if (start == kRegexInvalidRange) + start = r; + current = r; + } + step = 1; + break; + + default: + RAPIDJSON_ASSERT(step == 2); + GetRange(current).end = codepoint; + step = 0; + } + } + } + return false; + } + + SizeType NewRange(unsigned codepoint) { + Range* r = ranges_.template Push(); + r->start = r->end = codepoint; + r->next = kRegexInvalidRange; + return rangeCount_++; + } + + template + bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { + unsigned codepoint; + switch (codepoint = ds.Take()) { + case '^': + case '$': + case '|': + case '(': + case ')': + case '?': + case '*': + case '+': + case '.': + case '[': + case ']': + case '{': + case '}': + case '\\': + *escapedCodepoint = codepoint; return true; + case 'f': *escapedCodepoint = 0x000C; return true; + case 'n': *escapedCodepoint = 0x000A; return true; + case 'r': *escapedCodepoint = 0x000D; return true; + case 't': *escapedCodepoint = 0x0009; return true; + case 'v': *escapedCodepoint = 0x000B; return true; + default: + return false; // Unsupported escape character + } + } + + template + bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) const { + RAPIDJSON_ASSERT(IsValid()); + DecodedStream ds(is); + + state0_.Clear(); + Stack *current = &state0_, *next = &state1_; + const size_t stateSetSize = GetStateSetSize(); + std::memset(stateSet_, 0, stateSetSize); + + bool matched = AddState(*current, root_); + unsigned codepoint; + while (!current->Empty() && (codepoint = ds.Take()) != 0) { + std::memset(stateSet_, 0, stateSetSize); + next->Clear(); + matched = false; + for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { + const State& sr = GetState(*s); + if (sr.codepoint == codepoint || + sr.codepoint == kAnyCharacterClass || + (sr.codepoint == kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) + { + matched = AddState(*next, sr.out) || matched; + if (!anchorEnd && matched) + return true; + } + if (!anchorBegin) + AddState(*next, root_); + } + internal::Swap(current, next); + } + + return matched; + } + + size_t GetStateSetSize() const { + return (stateCount_ + 31) / 32 * 4; + } + + // Return whether the added states is a match state + bool AddState(Stack& l, SizeType index) const { + RAPIDJSON_ASSERT(index != kRegexInvalidState); + + const State& s = GetState(index); + if (s.out1 != kRegexInvalidState) { // Split + bool matched = AddState(l, s.out); + return AddState(l, s.out1) || matched; + } + else if (!(stateSet_[index >> 5] & (1 << (index & 31)))) { + stateSet_[index >> 5] |= (1 << (index & 31)); + *l.template PushUnsafe() = index; + } + return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. + } + + bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { + bool yes = (GetRange(rangeIndex).start & kRangeNegationFlag) == 0; + while (rangeIndex != kRegexInvalidRange) { + const Range& r = GetRange(rangeIndex); + if (codepoint >= (r.start & ~kRangeNegationFlag) && codepoint <= r.end) + return yes; + rangeIndex = r.next; + } + return !yes; + } + + Stack states_; + Stack ranges_; + SizeType root_; + SizeType stateCount_; + SizeType rangeCount_; + + static const unsigned kInfinityQuantifier = ~0u; + + // For SearchWithAnchoring() + uint32_t* stateSet_; // allocated by states_.GetAllocator() + mutable Stack state0_; + mutable Stack state1_; + bool anchorBegin_; + bool anchorEnd_; +}; + +typedef GenericRegex > Regex; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/OtherInc/rapidjson/internal/stack.h b/OtherInc/rapidjson/internal/stack.h new file mode 100644 index 0000000..022c9aa --- /dev/null +++ b/OtherInc/rapidjson/internal/stack.h @@ -0,0 +1,230 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +#include "../allocators.h" +#include "swap.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(stack_, rhs.stack_); + internal::Swap(stackTop_, rhs.stackTop_); + internal::Swap(stackEnd_, rhs.stackEnd_); + internal::Swap(initialCapacity_, rhs.initialCapacity_); + } + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template + RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { + // Expand the stack if needed + if (RAPIDJSON_UNLIKELY(stackTop_ + sizeof(T) * count > stackEnd_)) + Expand(count); + } + + template + RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + Reserve(count); + return PushUnsafe(count); + } + + template + RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { + RAPIDJSON_ASSERT(stackTop_ + sizeof(T) * count <= stackEnd_); + T* ret = reinterpret_cast(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast(stackTop_); + } + + template + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + const T* Top() const { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + T* End() { return reinterpret_cast(stackTop_); } + + template + const T* End() const { return reinterpret_cast(stackTop_); } + + template + T* Bottom() { return reinterpret_cast(stack_); } + + template + const T* Bottom() const { return reinterpret_cast(stack_); } + + bool HasAllocator() const { + return allocator_ != 0; + } + + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } + +private: + template + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STACK_H_ diff --git a/OtherInc/rapidjson/internal/strfunc.h b/OtherInc/rapidjson/internal/strfunc.h new file mode 100644 index 0000000..2edfae5 --- /dev/null +++ b/OtherInc/rapidjson/internal/strfunc.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +#include "../stream.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +//! Returns number of code points in a encoded string. +template +bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { + GenericStringStream is(s); + const typename Encoding::Ch* end = s + length; + SizeType count = 0; + while (is.src_ < end) { + unsigned codepoint; + if (!Encoding::Decode(is, &codepoint)) + return false; + count++; + } + *outCount = count; + return true; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/OtherInc/rapidjson/internal/strtod.h b/OtherInc/rapidjson/internal/strtod.h new file mode 100644 index 0000000..289c413 --- /dev/null +++ b/OtherInc/rapidjson/internal/strtod.h @@ -0,0 +1,269 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRTOD_ +#define RAPIDJSON_STRTOD_ + +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); + + BigInteger bS(bInt); + bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); + + BigInteger hS(1); + hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); + + BigInteger delta(0); + dS.Difference(bS, &delta); + + return delta.Compare(hS); +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +inline bool StrtodDiyFp(const char* decimals, size_t length, size_t decimalPosition, int exp, double* result) { + uint64_t significand = 0; + size_t i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < length; i++) { + if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) + break; + significand = significand * 10u + static_cast(decimals[i] - '0'); + } + + if (i < length && decimals[i] >= '5') // Rounding + significand++; + + size_t remaining = length - i; + const unsigned kUlpShift = 3; + const unsigned kUlp = 1 << kUlpShift; + int64_t error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + const int dExp = static_cast(decimalPosition) - static_cast(i) + exp; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 00000000), -60), // 10^1 + DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 00000000), -57), // 10^2 + DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 00000000), -54), // 10^3 + DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 00000000), -50), // 10^4 + DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 00000000), -47), // 10^5 + DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 00000000), -44), // 10^6 + DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp - 1; + RAPIDJSON_ASSERT(adjustment >= 0 && adjustment < 7); + v = v * kPow10[adjustment]; + if (length + static_cast(adjustment)> 19u) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const unsigned effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + unsigned precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + unsigned scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + static_cast(kUlp); + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + static_cast(precisionSize)); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + static_cast(error)) { + rounded.f++; + if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) + rounded.f >>= 1; + rounded.e++; + } + } + + *result = rounded.ToDouble(); + + return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); +} + +inline double StrtodBigInteger(double approx, const char* decimals, size_t length, size_t decimalPosition, int exp) { + const BigInteger dInt(decimals, length); + const int dExp = static_cast(decimalPosition) - static_cast(length) + exp; + Double a(approx); + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + return a.NextPositiveDouble(); +} + +inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) { + RAPIDJSON_ASSERT(d >= 0.0); + RAPIDJSON_ASSERT(length >= 1); + + double result; + if (StrtodFast(d, p, &result)) + return result; + + // Trim leading zeros + while (*decimals == '0' && length > 1) { + length--; + decimals++; + decimalPosition--; + } + + // Trim trailing zeros + while (decimals[length - 1] == '0' && length > 1) { + length--; + decimalPosition--; + exp++; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 780; + if (static_cast(length) > kMaxDecimalDigit) { + int delta = (static_cast(length) - kMaxDecimalDigit); + exp += delta; + decimalPosition -= static_cast(delta); + length = kMaxDecimalDigit; + } + + // If too small, underflow to zero + if (int(length) + exp < -324) + return 0.0; + + if (StrtodDiyFp(decimals, length, decimalPosition, exp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, length, decimalPosition, exp); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRTOD_ diff --git a/OtherInc/rapidjson/internal/swap.h b/OtherInc/rapidjson/internal/swap.h new file mode 100644 index 0000000..666e49f --- /dev/null +++ b/OtherInc/rapidjson/internal/swap.h @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_SWAP_H_ +#define RAPIDJSON_INTERNAL_SWAP_H_ + +#include "../rapidjson.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom swap() to avoid dependency on C++ header +/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. + \note This has the same semantics as std::swap(). +*/ +template +inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { + T tmp = a; + a = b; + b = tmp; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/OtherInc/rapidjson/istreamwrapper.h b/OtherInc/rapidjson/istreamwrapper.h new file mode 100644 index 0000000..f5fe289 --- /dev/null +++ b/OtherInc/rapidjson/istreamwrapper.h @@ -0,0 +1,115 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ISTREAMWRAPPER_H_ +#define RAPIDJSON_ISTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::istringstream + - \c std::stringstream + - \c std::wistringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wifstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_istream. +*/ + +template +class BasicIStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicIStreamWrapper(StreamType& stream) : stream_(stream), count_(), peekBuffer_() {} + + Ch Peek() const { + typename StreamType::int_type c = stream_.peek(); + return RAPIDJSON_LIKELY(c != StreamType::traits_type::eof()) ? static_cast(c) : '\0'; + } + + Ch Take() { + typename StreamType::int_type c = stream_.get(); + if (RAPIDJSON_LIKELY(c != StreamType::traits_type::eof())) { + count_++; + return static_cast(c); + } + else + return '\0'; + } + + // tellg() may return -1 when failed. So we count by ourself. + size_t Tell() const { return count_; } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + RAPIDJSON_ASSERT(sizeof(Ch) == 1); // Only usable for byte stream. + int i; + bool hasError = false; + for (i = 0; i < 4; ++i) { + typename StreamType::int_type c = stream_.get(); + if (c == StreamType::traits_type::eof()) { + hasError = true; + stream_.clear(); + break; + } + peekBuffer_[i] = static_cast(c); + } + for (--i; i >= 0; --i) + stream_.putback(peekBuffer_[i]); + return !hasError ? peekBuffer_ : 0; + } + +private: + BasicIStreamWrapper(const BasicIStreamWrapper&); + BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); + + StreamType& stream_; + size_t count_; //!< Number of characters read. Note: + mutable Ch peekBuffer_[4]; +}; + +typedef BasicIStreamWrapper IStreamWrapper; +typedef BasicIStreamWrapper WIStreamWrapper; + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/OtherInc/rapidjson/memorybuffer.h b/OtherInc/rapidjson/memorybuffer.h new file mode 100644 index 0000000..39bee1d --- /dev/null +++ b/OtherInc/rapidjson/memorybuffer.h @@ -0,0 +1,70 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYBUFFER_H_ +#define RAPIDJSON_MEMORYBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/OtherInc/rapidjson/memorystream.h b/OtherInc/rapidjson/memorystream.h new file mode 100644 index 0000000..1d71d8a --- /dev/null +++ b/OtherInc/rapidjson/memorystream.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYSTREAM_H_ +#define RAPIDJSON_MEMORYSTREAM_H_ + +#include "stream.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } + Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast(src_ - begin_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/OtherInc/rapidjson/msinttypes/inttypes.h b/OtherInc/rapidjson/msinttypes/inttypes.h new file mode 100644 index 0000000..1811128 --- /dev/null +++ b/OtherInc/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,316 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/OtherInc/rapidjson/msinttypes/stdint.h b/OtherInc/rapidjson/msinttypes/stdint.h new file mode 100644 index 0000000..3d4477b --- /dev/null +++ b/OtherInc/rapidjson/msinttypes/stdint.h @@ -0,0 +1,300 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we have to wrap include with 'extern "C++" {}' +// or compiler would give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if defined(__cplusplus) && !defined(_M_ARM) +extern "C" { +#endif +# include +#if defined(__cplusplus) && !defined(_M_ARM) +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/OtherInc/rapidjson/ostreamwrapper.h b/OtherInc/rapidjson/ostreamwrapper.h new file mode 100644 index 0000000..6f4667c --- /dev/null +++ b/OtherInc/rapidjson/ostreamwrapper.h @@ -0,0 +1,81 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_OSTREAMWRAPPER_H_ +#define RAPIDJSON_OSTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::ostringstream + - \c std::stringstream + - \c std::wpstringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wofstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_ostream. +*/ + +template +class BasicOStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} + + void Put(Ch c) { + stream_.put(c); + } + + void Flush() { + stream_.flush(); + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + BasicOStreamWrapper(const BasicOStreamWrapper&); + BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); + + StreamType& stream_; +}; + +typedef BasicOStreamWrapper OStreamWrapper; +typedef BasicOStreamWrapper WOStreamWrapper; + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/OtherInc/rapidjson/pointer.h b/OtherInc/rapidjson/pointer.h new file mode 100644 index 0000000..0206ac1 --- /dev/null +++ b/OtherInc/rapidjson/pointer.h @@ -0,0 +1,1358 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POINTER_H_ +#define RAPIDJSON_POINTER_H_ + +#include "document.h" +#include "internal/itoa.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode +*/ +enum PointerParseErrorCode { + kPointerParseErrorNone = 0, //!< The parse is successful + + kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' + kPointerParseErrorInvalidEscape, //!< Invalid escape + kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment + kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericPointer + +//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. +/*! + This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" + (https://tools.ietf.org/html/rfc6901). + + A JSON pointer is for identifying a specific value in a JSON document + (GenericDocument). It can simplify coding of DOM tree manipulation, because it + can access multiple-level depth of DOM tree with single API call. + + After it parses a string representation (e.g. "/foo/0" or URI fragment + representation (e.g. "#/foo/0") into its internal representation (tokens), + it can be used to resolve a specific value in multiple documents, or sub-tree + of documents. + + Contrary to GenericValue, Pointer can be copy constructed and copy assigned. + Apart from assignment, a Pointer cannot be modified after construction. + + Although Pointer is very convenient, please aware that constructing Pointer + involves parsing and dynamic memory allocation. A special constructor with user- + supplied tokens eliminates these. + + GenericPointer depends on GenericDocument and GenericValue. + + \tparam ValueType The value type of the DOM tree. E.g. GenericValue > + \tparam Allocator The allocator type for allocating memory for internal representation. + + \note GenericPointer uses same encoding of ValueType. + However, Allocator of GenericPointer is independent of Allocator of Value. +*/ +template +class GenericPointer { +public: + typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value + typedef typename ValueType::Ch Ch; //!< Character type from Value + + //! A token is the basic units of internal representation. + /*! + A JSON pointer string representation "/foo/123" is parsed to two tokens: + "foo" and 123. 123 will be represented in both numeric form and string form. + They are resolved according to the actual value type (object or array). + + For token that are not numbers, or the numeric value is out of bound + (greater than limits of SizeType), they are only treated as string form + (i.e. the token's index will be equal to kPointerInvalidIndex). + + This struct is public so that user can create a Pointer without parsing and + allocation, using a special constructor. + */ + struct Token { + const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. + SizeType length; //!< Length of the name. + SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. + }; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor. + GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A null-terminated, string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + */ + explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, internal::StrLen(source)); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source.c_str(), source.size()); + } +#endif + + //! Constructor that parses a string or URI fragment representation, with length of the source string. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param length Length of source. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Slightly faster than the overload without length. + */ + GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, length); + } + + //! Constructor with user-supplied tokens. + /*! + This constructor let user supplies const array of tokens. + This prevents the parsing process and eliminates allocation. + This is preferred for memory constrained environments. + + \param tokens An constant array of tokens representing the JSON pointer. + \param tokenCount Number of tokens. + + \b Example + \code + #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } + #define INDEX(i) { #i, sizeof(#i) - 1, i } + + static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; + static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); + // Equivalent to static const Pointer p("/foo/123"); + + #undef NAME + #undef INDEX + \endcode + */ + GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Destructor. + ~GenericPointer() { + if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. + Allocator::Free(tokens_); + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator. + GenericPointer& operator=(const GenericPointer& rhs) { + if (this != &rhs) { + // Do not delete ownAllcator + if (nameBuffer_) + Allocator::Free(tokens_); + + tokenCount_ = rhs.tokenCount_; + parseErrorOffset_ = rhs.parseErrorOffset_; + parseErrorCode_ = rhs.parseErrorCode_; + + if (rhs.nameBuffer_) + CopyFromRaw(rhs); // Normally parsed tokens. + else { + tokens_ = rhs.tokens_; // User supplied const tokens. + nameBuffer_ = 0; + } + } + return *this; + } + + //@} + + //!@name Append token + //@{ + + //! Append a token and return a new Pointer + /*! + \param token Token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Token& token, Allocator* allocator = 0) const { + GenericPointer r; + r.allocator_ = allocator; + Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + r.tokens_[tokenCount_].name = p; + r.tokens_[tokenCount_].length = token.length; + r.tokens_[tokenCount_].index = token.index; + return r; + } + + //! Append a name token with length, and return a new Pointer + /*! + \param name Name to be appended. + \param length Length of name. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { + Token token = { name, length, kPointerInvalidIndex }; + return Append(token, allocator); + } + + //! Append a name token without length, and return a new Pointer + /*! + \param name Name (const Ch*) to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) + Append(T* name, Allocator* allocator = 0) const { + return Append(name, StrLen(name), allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Append a name token, and return a new Pointer + /*! + \param name Name to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { + return Append(name.c_str(), static_cast(name.size()), allocator); + } +#endif + + //! Append a index token, and return a new Pointer + /*! + \param index Index to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(SizeType index, Allocator* allocator = 0) const { + char buffer[21]; + char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); + SizeType length = static_cast(end - buffer); + buffer[length] = '\0'; + + if (sizeof(Ch) == 1) { + Token token = { reinterpret_cast(buffer), length, index }; + return Append(token, allocator); + } + else { + Ch name[21]; + for (size_t i = 0; i <= length; i++) + name[i] = buffer[i]; + Token token = { name, length, index }; + return Append(token, allocator); + } + } + + //! Append a token by value, and return a new Pointer + /*! + \param token token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { + if (token.IsString()) + return Append(token.GetString(), token.GetStringLength(), allocator); + else { + RAPIDJSON_ASSERT(token.IsUint64()); + RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); + return Append(static_cast(token.GetUint64()), allocator); + } + } + + //!@name Handling Parse Error + //@{ + + //! Check whether this is a valid pointer. + bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } + + //! Get the parsing error offset in code unit. + size_t GetParseErrorOffset() const { return parseErrorOffset_; } + + //! Get the parsing error code. + PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } + + //@} + + //! Get the allocator of this pointer. + Allocator& GetAllocator() { return *allocator_; } + + //!@name Tokens + //@{ + + //! Get the token array (const version only). + const Token* GetTokens() const { return tokens_; } + + //! Get the number of tokens. + size_t GetTokenCount() const { return tokenCount_; } + + //@} + + //!@name Equality/inequality operators + //@{ + + //! Equality operator. + /*! + \note When any pointers are invalid, always returns false. + */ + bool operator==(const GenericPointer& rhs) const { + if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) + return false; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index || + tokens_[i].length != rhs.tokens_[i].length || + (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) + { + return false; + } + } + + return true; + } + + //! Inequality operator. + /*! + \note When any pointers are invalid, always returns true. + */ + bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + + //@} + + //!@name Stringify + //@{ + + //! Stringify the pointer into string representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + return Stringify(os); + } + + //! Stringify the pointer into URI fragment representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool StringifyUriFragment(OutputStream& os) const { + return Stringify(os); + } + + //@} + + //!@name Create value + //@{ + + //! Create a value in a subtree. + /*! + If the value is not exist, it creates all parent values and a JSON Null value. + So it always succeed and return the newly created or existing value. + + Remind that it may change types of parents according to tokens, so it + potentially removes previously stored values. For example, if a document + was an array, and "/foo" is used to create a value, then the document + will be changed to an object, and all existing array elements are lost. + + \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created (a JSON Null value), or already exists value. + */ + ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + bool exist = true; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + if (v->IsArray() && t->name[0] == '-' && t->length == 1) { + v->PushBack(ValueType().Move(), allocator); + v = &((*v)[v->Size() - 1]); + exist = false; + } + else { + if (t->index == kPointerInvalidIndex) { // must be object name + if (!v->IsObject()) + v->SetObject(); // Change to Object + } + else { // object name or array index + if (!v->IsArray() && !v->IsObject()) + v->SetArray(); // Change to Array + } + + if (v->IsArray()) { + if (t->index >= v->Size()) { + v->Reserve(t->index + 1, allocator); + while (t->index >= v->Size()) + v->PushBack(ValueType().Move(), allocator); + exist = false; + } + v = &((*v)[t->index]); + } + else { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) { + v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); + v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end + exist = false; + } + else + v = &m->value; + } + } + } + + if (alreadyExist) + *alreadyExist = exist; + + return *v; + } + + //! Creates a value in a document. + /*! + \param document A document to be resolved. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created, or already exists value. + */ + template + ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { + return Create(document, document.GetAllocator(), alreadyExist); + } + + //@} + + //!@name Query value + //@{ + + //! Query a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \return Pointer to the value if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a value cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return 0; + } + return v; + } + + //! Query a const value in a const subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Pointer to the value if it can be resolved. Otherwise null. + */ + const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { + return Get(const_cast(root), unresolvedTokenIndex); + } + + //@} + + //!@name Query a value with default + //@{ + + //! Query a value in a subtree with default value. + /*! + Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. + So that this function always succeed. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param defaultValue Default value to be cloned if the value was not exists. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); + } + + //! Query a value in a subtree with default null-terminated string. + ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a subtree with default std::basic_string. + ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } +#endif + + //! Query a value in a subtree with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { + return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); + } + + //! Query a value in a document with default value. + template + ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //! Query a value in a document with default null-terminated string. + template + ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a document with default std::basic_string. + template + ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } +#endif + + //! Query a value in a document with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(GenericDocument& document, T defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //@} + + //!@name Set a value + //@{ + + //! Set a value in a subtree, with move semantics. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be set. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = value; + } + + //! Set a value in a subtree, with copy semantics. + ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).CopyFrom(value, allocator); + } + + //! Set a null-terminated string in a subtree. + ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Set a std::basic_string in a subtree. + ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } +#endif + + //! Set a primitive value in a subtree. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value).Move(); + } + + //! Set a value in a document, with move semantics. + template + ValueType& Set(GenericDocument& document, ValueType& value) const { + return Create(document) = value; + } + + //! Set a value in a document, with copy semantics. + template + ValueType& Set(GenericDocument& document, const ValueType& value) const { + return Create(document).CopyFrom(value, document.GetAllocator()); + } + + //! Set a null-terminated string in a document. + template + ValueType& Set(GenericDocument& document, const Ch* value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Sets a std::basic_string in a document. + template + ValueType& Set(GenericDocument& document, const std::basic_string& value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } +#endif + + //! Set a primitive value in a document. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(GenericDocument& document, T value) const { + return Create(document) = value; + } + + //@} + + //!@name Swap a value + //@{ + + //! Swap a value with a value in a subtree. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be swapped. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).Swap(value); + } + + //! Swap a value with a value in a document. + template + ValueType& Swap(GenericDocument& document, ValueType& value) const { + return Create(document).Swap(value); + } + + //@} + + //! Erase a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Whether the resolved value is found and erased. + + \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. + */ + bool Erase(ValueType& root) const { + RAPIDJSON_ASSERT(IsValid()); + if (tokenCount_ == 0) // Cannot erase the root + return false; + + ValueType* v = &root; + const Token* last = tokens_ + (tokenCount_ - 1); + for (const Token *t = tokens_; t != last; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + return false; + v = &m->value; + } + break; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + return false; + v = &((*v)[t->index]); + break; + default: + return false; + } + } + + switch (v->GetType()) { + case kObjectType: + return v->EraseMember(GenericStringRef(last->name, last->length)); + case kArrayType: + if (last->index == kPointerInvalidIndex || last->index >= v->Size()) + return false; + v->Erase(v->Begin() + last->index); + return true; + default: + return false; + } + } + +private: + //! Clone the content from rhs to this. + /*! + \param rhs Source pointer. + \param extraToken Extra tokens to be allocated. + \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. + \return Start of non-occupied name buffer, for storing extra names. + */ + Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { + if (!allocator_) // allocator is independently owned. + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens + for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) + nameBufferSize += t->length; + + tokenCount_ = rhs.tokenCount_ + extraToken; + tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); + nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + if (rhs.tokenCount_ > 0) { + std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); + } + if (nameBufferSize > 0) { + std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); + } + + // Adjust pointers to name buffer + std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; + for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) + t->name += diff; + + return nameBuffer_ + nameBufferSize; + } + + //! Check whether a character should be percent-encoded. + /*! + According to RFC 3986 2.3 Unreserved Characters. + \param c The character (code unit) to be tested. + */ + bool NeedPercentEncode(Ch c) const { + return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); + } + + //! Parse a JSON String or its URI fragment representation into tokens. +#ifndef __clang__ // -Wdocumentation + /*! + \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. + \param length Length of the source string. + \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. + */ +#endif + void Parse(const Ch* source, size_t length) { + RAPIDJSON_ASSERT(source != NULL); + RAPIDJSON_ASSERT(nameBuffer_ == 0); + RAPIDJSON_ASSERT(tokens_ == 0); + + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + // Count number of '/' as tokenCount + tokenCount_ = 0; + for (const Ch* s = source; s != source + length; s++) + if (*s == '/') + tokenCount_++; + + Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); + Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + size_t i = 0; + + // Detect if it is a URI fragment + bool uriFragment = false; + if (source[i] == '#') { + uriFragment = true; + i++; + } + + if (i != length && source[i] != '/') { + parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; + goto error; + } + + while (i < length) { + RAPIDJSON_ASSERT(source[i] == '/'); + i++; // consumes '/' + + token->name = name; + bool isNumber = true; + + while (i < length && source[i] != '/') { + Ch c = source[i]; + if (uriFragment) { + // Decoding percent-encoding for URI fragment + if (c == '%') { + PercentDecodeStream is(&source[i], source + length); + GenericInsituStringStream os(name); + Ch* begin = os.PutBegin(); + if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { + parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; + goto error; + } + size_t len = os.PutEnd(begin); + i += is.Tell() - 1; + if (len == 1) + c = *name; + else { + name += len; + isNumber = false; + i++; + continue; + } + } + else if (NeedPercentEncode(c)) { + parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; + goto error; + } + } + + i++; + + // Escaping "~0" -> '~', "~1" -> '/' + if (c == '~') { + if (i < length) { + c = source[i]; + if (c == '0') c = '~'; + else if (c == '1') c = '/'; + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + i++; + } + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + } + + // First check for index: all of characters are digit + if (c < '0' || c > '9') + isNumber = false; + + *name++ = c; + } + token->length = static_cast(name - token->name); + if (token->length == 0) + isNumber = false; + *name++ = '\0'; // Null terminator + + // Second check for index: more than one digit cannot have leading zero + if (isNumber && token->length > 1 && token->name[0] == '0') + isNumber = false; + + // String to SizeType conversion + SizeType n = 0; + if (isNumber) { + for (size_t j = 0; j < token->length; j++) { + SizeType m = n * 10 + static_cast(token->name[j] - '0'); + if (m < n) { // overflow detection + isNumber = false; + break; + } + n = m; + } + } + + token->index = isNumber ? n : kPointerInvalidIndex; + token++; + } + + RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer + parseErrorCode_ = kPointerParseErrorNone; + return; + + error: + Allocator::Free(tokens_); + nameBuffer_ = 0; + tokens_ = 0; + tokenCount_ = 0; + parseErrorOffset_ = i; + return; + } + + //! Stringify to string or URI fragment representation. + /*! + \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. + \tparam OutputStream type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + RAPIDJSON_ASSERT(IsValid()); + + if (uriFragment) + os.Put('#'); + + for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + os.Put('/'); + for (size_t j = 0; j < t->length; j++) { + Ch c = t->name[j]; + if (c == '~') { + os.Put('~'); + os.Put('0'); + } + else if (c == '/') { + os.Put('~'); + os.Put('1'); + } + else if (uriFragment && NeedPercentEncode(c)) { + // Transcode to UTF8 sequence + GenericStringStream source(&t->name[j]); + PercentEncodeStream target(os); + if (!Transcoder >().Validate(source, target)) + return false; + j += source.Tell() - 1; + } + else + os.Put(c); + } + } + return true; + } + + //! A helper stream for decoding a percent-encoded sequence into code unit. + /*! + This stream decodes %XY triplet into code unit (0-255). + If it encounters invalid characters, it sets output code unit as 0 and + mark invalid, and to be checked by IsValid(). + */ + class PercentDecodeStream { + public: + typedef typename ValueType::Ch Ch; + + //! Constructor + /*! + \param source Start of the stream + \param end Past-the-end of the stream. + */ + PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} + + Ch Take() { + if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet + valid_ = false; + return 0; + } + src_++; + Ch c = 0; + for (int j = 0; j < 2; j++) { + c = static_cast(c << 4); + Ch h = *src_; + if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); + else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); + else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); + else { + valid_ = false; + return 0; + } + src_++; + } + return c; + } + + size_t Tell() const { return static_cast(src_ - head_); } + bool IsValid() const { return valid_; } + + private: + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. + const Ch* end_; //!< Past-the-end position. + bool valid_; //!< Whether the parsing is valid. + }; + + //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. + template + class PercentEncodeStream { + public: + PercentEncodeStream(OutputStream& os) : os_(os) {} + void Put(char c) { // UTF-8 must be byte + unsigned char u = static_cast(c); + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + os_.Put('%'); + os_.Put(hexDigits[u >> 4]); + os_.Put(hexDigits[u & 15]); + } + private: + OutputStream& os_; + }; + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Pointer. + Ch* nameBuffer_; //!< A buffer containing all names in tokens. + Token* tokens_; //!< A list of tokens. + size_t tokenCount_; //!< Number of tokens in tokens_. + size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. + PointerParseErrorCode parseErrorCode_; //!< Parsing error code. +}; + +//! GenericPointer for Value (UTF-8, default allocator). +typedef GenericPointer Pointer; + +//!@name Helper functions for GenericPointer +//@{ + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { + return pointer.Create(root, a); +} + +template +typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Create(root, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { + return pointer.Create(document); +} + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Create(document); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { + return pointer.Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { + return pointer.Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { + return GenericPointer(source, N - 1).Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Swap(root, value, a); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Swap(root, value, a); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Swap(document, value); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Swap(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +bool EraseValueByPointer(T& root, const GenericPointer& pointer) { + return pointer.Erase(root); +} + +template +bool EraseValueByPointer(T& root, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Erase(root); +} + +//@} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_POINTER_H_ diff --git a/OtherInc/rapidjson/prettywriter.h b/OtherInc/rapidjson/prettywriter.h new file mode 100644 index 0000000..0dcb0fe --- /dev/null +++ b/OtherInc/rapidjson/prettywriter.h @@ -0,0 +1,255 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Combination of PrettyWriter format flags. +/*! \see PrettyWriter::SetFormatOptions + */ +enum PrettyFormatOptions { + kFormatDefault = 0, //!< Default pretty formatting. + kFormatSingleLineArray = 1 //!< Format arrays on a single line. +}; + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of ouptut os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + + + explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {} + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //! Set pretty writer formatting options. + /*! \param options Formatting options. + */ + PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { + formatOptions_ = options; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::WriteNull(); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::WriteBool(b); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::WriteInt(i); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::WriteUint(u); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::WriteInt64(i64); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::WriteUint64(u64); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::WriteDouble(d); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + PrettyPrefix(kNumberType); + return Base::WriteString(str, length); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + PrettyPrefix(kStringType); + return Base::WriteString(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::WriteEndObject(); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::os_->Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::WriteEndArray(); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::os_->Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. + */ + bool RawValue(const Ch* json, size_t length, Type type) { PrettyPrefix(type); return Base::WriteRawValue(json, length); } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + if (formatOptions_ & kFormatSingleLineArray) + Base::os_->Put(' '); + } + + if (!(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, static_cast(indentChar_), count); + } + + Ch indentChar_; + unsigned indentCharCount_; + PrettyFormatOptions formatOptions_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/OtherInc/rapidjson/rapidjson.h b/OtherInc/rapidjson/rapidjson.h new file mode 100644 index 0000000..053b2ce --- /dev/null +++ b/OtherInc/rapidjson/rapidjson.h @@ -0,0 +1,615 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see RAPIDJSON_CONFIG + */ + +/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overriden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include // malloc(), realloc(), free(), size_t +#include // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_VERSION_STRING +// +// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. +// + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x +//!@endcond + +/*! \def RAPIDJSON_MAJOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Major version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_MINOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Minor version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_PATCH_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Patch version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_VERSION_STRING + \ingroup RAPIDJSON_CONFIG + \brief Version of RapidJSON in ".." string format. +*/ +#define RAPIDJSON_MAJOR_VERSION 1 +#define RAPIDJSON_MINOR_VERSION 1 +#define RAPIDJSON_PATCH_VERSION 0 +#define RAPIDJSON_VERSION_STRING \ + RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def RAPIDJSON_NAMESPACE + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref + RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define RAPIDJSON_NAMESPACE my::rapidjson + #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def RAPIDJSON_NAMESPACE_BEGIN + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see RAPIDJSON_NAMESPACE +*/ +/*! \def RAPIDJSON_NAMESPACE_END + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see RAPIDJSON_NAMESPACE +*/ +#ifndef RAPIDJSON_NAMESPACE +#define RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef RAPIDJSON_NAMESPACE_BEGIN +#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { +#endif +#ifndef RAPIDJSON_NAMESPACE_END +#define RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_HAS_STDSTRING +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def RAPIDJSON_HAS_STDSTRING + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#endif // !defined(RAPIDJSON_HAS_STDSTRING) + +#if RAPIDJSON_HAS_STDSTRING +#include +#endif // RAPIDJSON_HAS_STDSTRING + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +/*! \def RAPIDJSON_NO_INT64DEFINE + \ingroup RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef RAPIDJSON_NO_INT64DEFINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include +#include +#endif +//!@endcond +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_INT64DEFINE +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_FORCEINLINE + +#ifndef RAPIDJSON_FORCEINLINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def RAPIDJSON_ENDIAN + \ingroup RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_MSC_VER) && defined(_M_ARM) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(RAPIDJSON_DOXYGEN_RUNNING) +# define RAPIDJSON_ENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef RAPIDJSON_64BIT +#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) +#define RAPIDJSON_64BIT 1 +#else +#define RAPIDJSON_64BIT 0 +#endif +#endif // RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. Currently the default uses 4 bytes + alignment on 32-bit platforms and 8 bytes alignment for 64-bit platforms. + User can customize by defining the RAPIDJSON_ALIGN function macro. +*/ +#ifndef RAPIDJSON_ALIGN +#if RAPIDJSON_64BIT == 1 +#define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) +#else +#define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef RAPIDJSON_UINT64_C2 +#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_48BITPOINTER_OPTIMIZATION + +//! Use only lower 48-bit address for some pointers. +/*! + \ingroup RAPIDJSON_CONFIG + + This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. + The higher 16-bit can be used for storing other data. + \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. +*/ +#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 +#else +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 +#endif +#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION + +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 +#if RAPIDJSON_64BIT != 1 +#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 +#endif +#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) +#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) +#else +#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) +#define RAPIDJSON_GETPOINTER(type, p) (p) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_SIMD + +/*! \def RAPIDJSON_SIMD + \ingroup RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2 optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2 or SSE4.2 SIMD extensions on modern Intel-compatible + processors. + + To enable these optimizations, two different symbols can be defined; + \code + // Enable SSE2 optimization. + #define RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define RAPIDJSON_SSE42 + \endcode + + \c RAPIDJSON_SSE42 takes precedence, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ + || defined(RAPIDJSON_DOXYGEN_RUNNING) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_SIZETYPEDEFINE +#endif +RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref RAPIDJSON_ERRORS APIs. +*/ +#ifndef RAPIDJSON_ASSERT +#include +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_STATIC_ASSERT + +// Adopt from boost +#ifndef RAPIDJSON_STATIC_ASSERT +#ifndef __clang__ +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#endif +RAPIDJSON_NAMESPACE_BEGIN +template struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; +template struct StaticAssertTest {}; +RAPIDJSON_NAMESPACE_END + +#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) +#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) +#define RAPIDJSON_DO_JOIN2(X, Y) X##Y + +#if defined(__GNUC__) +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +#ifndef __clang__ +//!@endcond +#endif + +/*! \def RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ + RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY + +//! Compiler branching hint for expression with high probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression likely to be true. +*/ +#ifndef RAPIDJSON_LIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define RAPIDJSON_LIKELY(x) (x) +#endif +#endif + +//! Compiler branching hint for expression with low probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression unlikely to be true. +*/ +#ifndef RAPIDJSON_UNLIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define RAPIDJSON_UNLIKELY(x) (x) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define RAPIDJSON_GNUC \ + RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features + +#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if defined(__clang__) +#if __has_feature(cxx_rvalue_references) && \ + (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) + +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) +// (defined(_MSC_VER) && _MSC_VER >= ????) // not yet supported +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT noexcept +#else +#define RAPIDJSON_NOEXCEPT /* noexcept */ +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT + +// no automatic detection, yet +#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif + +#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1700) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 +#else +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR + +//!@endcond + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef RAPIDJSON_NEW +///! customization point for global \c new +#define RAPIDJSON_NEW(x) new x +#endif +#ifndef RAPIDJSON_DELETE +///! customization point for global \c delete +#define RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Type + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see RAPIDJSON_NAMESPACE +*/ +RAPIDJSON_NAMESPACE_BEGIN + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/OtherInc/rapidjson/reader.h b/OtherInc/rapidjson/reader.h new file mode 100644 index 0000000..19f8849 --- /dev/null +++ b/OtherInc/rapidjson/reader.h @@ -0,0 +1,1879 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "allocators.h" +#include "stream.h" +#include "encodedstream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" +#include + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(old-style-cast) +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ + RAPIDJSON_MULTILINEMACRO_END +#endif +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) +//!@endcond + +/*! \def RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef RAPIDJSON_PARSE_ERROR_NORETURN +#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def RAPIDJSON_PARSE_ERROR + \ingroup RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS +#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. + kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. + kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. + kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. + kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType length, bool copy); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast(*this).Default(); } + bool Bool(bool) { return static_cast(*this).Default(); } + bool Int(int) { return static_cast(*this).Default(); } + bool Uint(unsigned) { return static_cast(*this).Default(); } + bool Int64(int64_t) { return static_cast(*this).Default(); } + bool Uint64(uint64_t) { return static_cast(*this).Default(); } + bool Double(double) { return static_cast(*this).Default(); } + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } + bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast(*this).Default(); } + bool StartArray() { return static_cast(*this).Default(); } + bool EndArray(SizeType) { return static_cast(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + typename InputStream::Ch c; + while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') + s.Take(); +} + +inline const char* SkipWhitespace(const char* p, const char* end) { + while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + return p; +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY)); + if (r != 0) { // some of characters is non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The middle of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY)); + if (r != 0) { // some of characters is non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#endif // RAPIDJSON_SSE2 + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} + +template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { + is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse(is, handler); + } + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + template + void SkipWhitespaceAndComments(InputStream& is) { + SkipWhitespace(is); + + if (parseFlags & kParseCommentsFlag) { + while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { + if (Consume(is, '*')) { + while (true) { + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + else if (Consume(is, '*')) { + if (Consume(is, '/')) + break; + } + else + is.Take(); + } + } + else if (RAPIDJSON_LIKELY(Consume(is, '/'))) + while (is.Peek() != '\0' && is.Take() != '\n'); + else + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + + SkipWhitespace(is); + } + } + } + + // Parse object: { string : value, ... } + template + void ParseObject(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, '}')) { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString(is, handler, true); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++memberCount; + + switch (is.Peek()) { + case ',': + is.Take(); + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + break; + case '}': + is.Take(); + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy + } + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == '}') { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ',')) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + } + else if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == ']') { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + template + void ParseNull(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { + if (RAPIDJSON_UNLIKELY(!handler.Null())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseTrue(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseFalse(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { + if (RAPIDJSON_LIKELY(is.Peek() == expect)) { + is.Take(); + return true; + } + else + return false; + } + + // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(InputStream& is, size_t escapeOffset) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Peek(); + codepoint <<= 4; + codepoint += static_cast(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + is.Take(); + } + return codepoint; + } + + template + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} + RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push() = c; + ++length_; + } + + RAPIDJSON_FORCEINLINE void* Push(SizeType count) { + length_ += count; + return stack_.template Push(count); + } + + size_t Length() const { return length_; } + + Ch* Pop() { + return stack_.template Pop(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream(s, s); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream stackStream(stack_); + ParseStringToStream(s, stackStream); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (RAPIDJSON_UNLIKELY(!success)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template + RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + for (;;) { + // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. + if (!(parseFlags & kParseValidateEncodingFlag)) + ScanCopyUnescapedString(is, os); + + Ch c = is.Peek(); + if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape + size_t escapeOffset = is.Tell(); // For invalid escaping, report the inital '\\' as error offset + is.Take(); + Ch e = is.Peek(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { + is.Take(); + os.Put(static_cast(escape[static_cast(e)])); + } + else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode + is.Take(); + unsigned codepoint = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) { + // Handle UTF-16 surrogate pair + if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + unsigned codepoint2 = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + TEncoding::Encode(os, codepoint); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); + } + else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + if (c == '\0') + RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell()); + } + else { + size_t offset = is.Tell(); + if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? + !Transcoder::Validate(is, os) : + !Transcoder::Transcode(is, os)))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); + } + } + } + + template + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { + // Do nothing for generic version + } + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType length; + #ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; + #else + length = static_cast(__builtin_ffs(r) - 1); + #endif + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16, q += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + for (const char* pend = p + length; p != pend; ) + *q++ = *p++; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + p += length; + break; + } + } + + is.src_ = is.dst_ = p; + } +#endif + + template + class NumberStream; + + template + class NumberStream { + public: + typedef typename InputStream::Ch Ch; + + NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + RAPIDJSON_FORCEINLINE void Push(char) {} + + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const char* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {} + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put(static_cast(Base::is.Peek())); + return Base::is.Take(); + } + + RAPIDJSON_FORCEINLINE void Push(char c) { + stackStream.Put(c); + } + + size_t Length() { return stackStream.Length(); } + + const char* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream stackStream; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {} + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } + }; + + template + void ParseNumber(InputStream& is, Handler& handler) { + internal::StreamLocalCopy copy(is); + NumberStream s(*this, copy.s); + + size_t startOffset = s.Tell(); + double d = 0.0; + bool useNanOrInf = false; + + // Parse minus + bool minus = Consume(s, '-'); + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { + i = 0; + s.TakePush(); + } + else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { + i = static_cast(s.TakePush() - '0'); + + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 + if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 + if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + // Parse NaN or Infinity here + else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { + useNanOrInf = true; + if (RAPIDJSON_LIKELY(Consume(s, 'N') && Consume(s, 'a') && Consume(s, 'N'))) { + d = std::numeric_limits::quiet_NaN(); + } + else if (RAPIDJSON_LIKELY(Consume(s, 'I') && Consume(s, 'n') && Consume(s, 'f'))) { + d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); + if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') + && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + if (use64bit) { + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(d >= 1.7976931348623157e307)) // DBL_MAX / 10.0 + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (Consume(s, '.')) { + decimalPosition = s.Length(); + + if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = static_cast(i64); +#else + // Use double to store significand in 32-bit architecture + d = static_cast(use64bit ? i64 : i); +#endif + useDouble = true; + } + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (RAPIDJSON_LIKELY(d > 0.0)) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (Consume(s, 'e') || Consume(s, 'E')) { + if (!useDouble) { + d = static_cast(use64bit ? i64 : i); + useDouble = true; + } + + bool expMinus = false; + if (Consume(s, '+')) + ; + else if (Consume(s, '-')) + expMinus = true; + + if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = static_cast(s.Take() - '0'); + if (expMinus) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (exp >= 214748364) { // Issue #313: prevent overflow exponent + while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent + s.Take(); + } + } + } + else { // positive exp + int maxExp = 308 - expFrac; + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + + if (parseFlags & kParseNumbersAsStringsFlag) { + if (parseFlags & kParseInsituFlag) { + s.Pop(); // Pop stack no matter if it will be used or not. + typename InputStream::Ch* head = is.PutBegin(); + const size_t length = s.Tell() - startOffset; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + // unable to insert the \0 character here, it will erase the comma after this number + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + cont = handler.RawNumber(str, SizeType(length), false); + } + else { + SizeType numCharsToCopy = static_cast(s.Length()); + StringStream srcStream(s.Pop()); + StackStream dstStream(stack_); + while (numCharsToCopy--) { + Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); + } + dstStream.Put('\0'); + const typename TargetEncoding::Ch* str = dstStream.Pop(); + const SizeType length = static_cast(dstStream.Length()) - 1; + cont = handler.RawNumber(str, SizeType(length), true); + } + } + else { + size_t length = s.Length(); + const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + cont = handler.Double(minus ? -d : d); + } + else if (useNanOrInf) { + cont = handler.Double(d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(static_cast(~i64 + 1)); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(static_cast(~i + 1)); + else + cont = handler.Uint(i); + } + } + } + if (RAPIDJSON_UNLIKELY(!cont)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); + } + + // Parse any JSON value + template + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull (is, handler); break; + case 't': ParseTrue (is, handler); break; + case 'f': ParseFalse (is, handler); break; + case '"': ParseString(is, handler); break; + case '{': ParseObject(is, handler); break; + case '[': ParseArray (is, handler); break; + default : + ParseNumber(is, handler); + break; + + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingStartState = 0, + IterativeParsingFinishState, + IterativeParsingErrorState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingKeyValueDelimiterState, + IterativeParsingMemberValueState, + IterativeParsingMemberDelimiterState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingElementDelimiterState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState + }; + + enum { cIterativeParsingStateCount = IterativeParsingValueState + 1 }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) { + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || static_cast(c) < 256) + return static_cast(tokenMap[static_cast(c)]); + else + return NumberToken; + } + + RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + } + }; // End of G + + return static_cast(G[state][token]); + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template + RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + (void)token; + + switch (dst) { + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push(1) = n; + // Initialize and push the member/element count. + *stack_.template Push(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + RAPIDJSON_ASSERT(token == ColonToken); + is.Take(); + return dst; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top() = *stack_.template Top() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); + return IterativeParsingErrorState; + } + // Get member count. + SizeType c = *stack_.template Pop(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); + return IterativeParsingErrorState; + } + // Get element count. + SizeType c = *stack_.template Pop(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + default: + // This branch is for IterativeParsingValueState actually. + // Use `default:` rather than + // `case IterativeParsingValueState:` is for code coverage. + + // The IterativeParsingStartState is not enumerated in this switch-case. + // It is impossible for that case. And it can be caught by following assertion. + + // The IterativeParsingFinishState is not enumerated in this switch-case either. + // It is a "derivative" state which cannot triggered from Predict() directly. + // Therefore it cannot happen here. And it can be caught by following assertion. + RAPIDJSON_ASSERT(dst == IterativeParsingValueState); + + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + } + } + + template + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; + case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; + case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; + case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; + case IterativeParsingKeyValueDelimiterState: + case IterativeParsingArrayInitialState: + case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; + default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; + } + } + + template + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader, UTF8<> > Reader; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/OtherInc/rapidjson/schema.h b/OtherInc/rapidjson/schema.h new file mode 100644 index 0000000..b182aa2 --- /dev/null +++ b/OtherInc/rapidjson/schema.h @@ -0,0 +1,2006 @@ +// Tencent is pleased to support the open source community by making RapidJSON available-> +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License-> You may obtain a copy of the License at +// +// http://opensource->org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied-> See the License for the +// specific language governing permissions and limitations under the License-> + +#ifndef RAPIDJSON_SCHEMA_H_ +#define RAPIDJSON_SCHEMA_H_ + +#include "document.h" +#include "pointer.h" +#include // abs, floor + +#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 +#endif + +#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && !defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) +#define RAPIDJSON_SCHEMA_USE_STDREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_STDREGEX 0 +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX +#include "internal/regex.h" +#elif RAPIDJSON_SCHEMA_USE_STDREGEX +#include +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX +#define RAPIDJSON_SCHEMA_HAS_REGEX 1 +#else +#define RAPIDJSON_SCHEMA_HAS_REGEX 0 +#endif + +#ifndef RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_VERBOSE 0 +#endif + +#if RAPIDJSON_SCHEMA_VERBOSE +#include "stringbuffer.h" +#endif + +RAPIDJSON_DIAG_PUSH + +#if defined(__GNUC__) +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(weak-vtables) +RAPIDJSON_DIAG_OFF(exit-time-destructors) +RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) +RAPIDJSON_DIAG_OFF(variadic-macros) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Verbose Utilities + +#if RAPIDJSON_SCHEMA_VERBOSE + +namespace internal { + +inline void PrintInvalidKeyword(const char* keyword) { + printf("Fail keyword: %s\n", keyword); +} + +inline void PrintInvalidKeyword(const wchar_t* keyword) { + wprintf(L"Fail keyword: %ls\n", keyword); +} + +inline void PrintInvalidDocument(const char* document) { + printf("Fail document: %s\n\n", document); +} + +inline void PrintInvalidDocument(const wchar_t* document) { + wprintf(L"Fail document: %ls\n\n", document); +} + +inline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) { + printf("S: %*s%s\nD: %*s%s\n\n", depth * 4, " ", s, depth * 4, " ", d); +} + +inline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) { + wprintf(L"S: %*ls%ls\nD: %*ls%ls\n\n", depth * 4, L" ", s, depth * 4, L" ", d); +} + +} // namespace internal + +#endif // RAPIDJSON_SCHEMA_VERBOSE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_INVALID_KEYWORD_RETURN + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword) +#else +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) +#endif + +#define RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + context.invalidKeyword = keyword.GetString();\ + RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\ + return false;\ +RAPIDJSON_MULTILINEMACRO_END + +/////////////////////////////////////////////////////////////////////////////// +// Forward declarations + +template +class GenericSchemaDocument; + +namespace internal { + +template +class Schema; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaValidator + +class ISchemaValidator { +public: + virtual ~ISchemaValidator() {} + virtual bool IsValid() const = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaStateFactory + +template +class ISchemaStateFactory { +public: + virtual ~ISchemaStateFactory() {} + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&) = 0; + virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; + virtual void* CreateHasher() = 0; + virtual uint64_t GetHashCode(void* hasher) = 0; + virtual void DestroryHasher(void* hasher) = 0; + virtual void* MallocState(size_t size) = 0; + virtual void FreeState(void* p) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Hasher + +// For comparison of compound value +template +class Hasher { +public: + typedef typename Encoding::Ch Ch; + + Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} + + bool Null() { return WriteType(kNullType); } + bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } + bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Double(double d) { + Number n; + if (d < 0) n.u.i = static_cast(d); + else n.u.u = static_cast(d); + n.d = d; + return WriteNumber(n); + } + + bool RawNumber(const Ch* str, SizeType len, bool) { + WriteBuffer(kNumberType, str, len * sizeof(Ch)); + return true; + } + + bool String(const Ch* str, SizeType len, bool) { + WriteBuffer(kStringType, str, len * sizeof(Ch)); + return true; + } + + bool StartObject() { return true; } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType memberCount) { + uint64_t h = Hash(0, kObjectType); + uint64_t* kv = stack_.template Pop(memberCount * 2); + for (SizeType i = 0; i < memberCount; i++) + h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive + *stack_.template Push() = h; + return true; + } + + bool StartArray() { return true; } + bool EndArray(SizeType elementCount) { + uint64_t h = Hash(0, kArrayType); + uint64_t* e = stack_.template Pop(elementCount); + for (SizeType i = 0; i < elementCount; i++) + h = Hash(h, e[i]); // Use hash to achieve element order sensitive + *stack_.template Push() = h; + return true; + } + + bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } + + uint64_t GetHashCode() const { + RAPIDJSON_ASSERT(IsValid()); + return *stack_.template Top(); + } + +private: + static const size_t kDefaultSize = 256; + struct Number { + union U { + uint64_t u; + int64_t i; + }u; + double d; + }; + + bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } + + bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } + + bool WriteBuffer(Type type, const void* data, size_t len) { + // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ + uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); + const unsigned char* d = static_cast(data); + for (size_t i = 0; i < len; i++) + h = Hash(h, d[i]); + *stack_.template Push() = h; + return true; + } + + static uint64_t Hash(uint64_t h, uint64_t d) { + static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); + h ^= d; + h *= kPrime; + return h; + } + + Stack stack_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidationContext + +template +struct SchemaValidationContext { + typedef Schema SchemaType; + typedef ISchemaStateFactory SchemaValidatorFactoryType; + typedef typename SchemaType::ValueType ValueType; + typedef typename ValueType::Ch Ch; + + enum PatternValidatorType { + kPatternValidatorOnly, + kPatternValidatorWithProperty, + kPatternValidatorWithAdditionalProperty + }; + + SchemaValidationContext(SchemaValidatorFactoryType& f, const SchemaType* s) : + factory(f), + schema(s), + valueSchema(), + invalidKeyword(), + hasher(), + arrayElementHashCodes(), + validators(), + validatorCount(), + patternPropertiesValidators(), + patternPropertiesValidatorCount(), + patternPropertiesSchemas(), + patternPropertiesSchemaCount(), + valuePatternValidatorType(kPatternValidatorOnly), + propertyExist(), + inArray(false), + valueUniqueness(false), + arrayUniqueness(false) + { + } + + ~SchemaValidationContext() { + if (hasher) + factory.DestroryHasher(hasher); + if (validators) { + for (SizeType i = 0; i < validatorCount; i++) + factory.DestroySchemaValidator(validators[i]); + factory.FreeState(validators); + } + if (patternPropertiesValidators) { + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + factory.FreeState(patternPropertiesValidators); + } + if (patternPropertiesSchemas) + factory.FreeState(patternPropertiesSchemas); + if (propertyExist) + factory.FreeState(propertyExist); + } + + SchemaValidatorFactoryType& factory; + const SchemaType* schema; + const SchemaType* valueSchema; + const Ch* invalidKeyword; + void* hasher; // Only validator access + void* arrayElementHashCodes; // Only validator access this + ISchemaValidator** validators; + SizeType validatorCount; + ISchemaValidator** patternPropertiesValidators; + SizeType patternPropertiesValidatorCount; + const SchemaType** patternPropertiesSchemas; + SizeType patternPropertiesSchemaCount; + PatternValidatorType valuePatternValidatorType; + PatternValidatorType objectPatternValidatorType; + SizeType arrayElementIndex; + bool* propertyExist; + bool inArray; + bool valueUniqueness; + bool arrayUniqueness; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Schema + +template +class Schema { +public: + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef SchemaValidationContext Context; + typedef Schema SchemaType; + typedef GenericValue SValue; + friend class GenericSchemaDocument; + + Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator) : + allocator_(allocator), + enum_(), + enumCount_(), + not_(), + type_((1 << kTotalSchemaType) - 1), // typeless + validatorCount_(), + properties_(), + additionalPropertiesSchema_(), + patternProperties_(), + patternPropertyCount_(), + propertyCount_(), + minProperties_(), + maxProperties_(SizeType(~0)), + additionalProperties_(true), + hasDependencies_(), + hasRequired_(), + hasSchemaDependencies_(), + additionalItemsSchema_(), + itemsList_(), + itemsTuple_(), + itemsTupleCount_(), + minItems_(), + maxItems_(SizeType(~0)), + additionalItems_(true), + uniqueItems_(false), + pattern_(), + minLength_(0), + maxLength_(~SizeType(0)), + exclusiveMinimum_(false), + exclusiveMaximum_(false) + { + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename ValueType::ConstValueIterator ConstValueIterator; + typedef typename ValueType::ConstMemberIterator ConstMemberIterator; + + if (!value.IsObject()) + return; + + if (const ValueType* v = GetMember(value, GetTypeString())) { + type_ = 0; + if (v->IsString()) + AddType(*v); + else if (v->IsArray()) + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) + AddType(*itr); + } + + if (const ValueType* v = GetMember(value, GetEnumString())) + if (v->IsArray() && v->Size() > 0) { + enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { + typedef Hasher > EnumHasherType; + char buffer[256 + 24]; + MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer)); + EnumHasherType h(&hasherAllocator, 256); + itr->Accept(h); + enum_[enumCount_++] = h.GetHashCode(); + } + } + + if (schemaDocument) { + AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); + AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); + AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); + } + + if (const ValueType* v = GetMember(value, GetNotString())) { + schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document); + notValidatorIndex_ = validatorCount_; + validatorCount_++; + } + + // Object + + const ValueType* properties = GetMember(value, GetPropertiesString()); + const ValueType* required = GetMember(value, GetRequiredString()); + const ValueType* dependencies = GetMember(value, GetDependenciesString()); + { + // Gather properties from properties/required/dependencies + SValue allProperties(kArrayType); + + if (properties && properties->IsObject()) + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) + AddUniqueElement(allProperties, itr->name); + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) + AddUniqueElement(allProperties, *itr); + + if (dependencies && dependencies->IsObject()) + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + AddUniqueElement(allProperties, itr->name); + if (itr->value.IsArray()) + for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) + if (i->IsString()) + AddUniqueElement(allProperties, *i); + } + + if (allProperties.Size() > 0) { + propertyCount_ = allProperties.Size(); + properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); + for (SizeType i = 0; i < propertyCount_; i++) { + new (&properties_[i]) Property(); + properties_[i].name = allProperties[i]; + properties_[i].schema = GetTypeless(); + } + } + } + + if (properties && properties->IsObject()) { + PointerType q = p.Append(GetPropertiesString(), allocator_); + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { + SizeType index; + if (FindPropertyIndex(itr->name, &index)) + schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document); + } + } + + if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { + PointerType q = p.Append(GetPatternPropertiesString(), allocator_); + patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); + patternPropertyCount_ = 0; + + for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { + new (&patternProperties_[patternPropertyCount_]) PatternProperty(); + patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name); + schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document); + patternPropertyCount_++; + } + } + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) { + SizeType index; + if (FindPropertyIndex(*itr, &index)) { + properties_[index].required = true; + hasRequired_ = true; + } + } + + if (dependencies && dependencies->IsObject()) { + PointerType q = p.Append(GetDependenciesString(), allocator_); + hasDependencies_ = true; + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + SizeType sourceIndex; + if (FindPropertyIndex(itr->name, &sourceIndex)) { + if (itr->value.IsArray()) { + properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); + std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); + for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { + SizeType targetIndex; + if (FindPropertyIndex(*targetItr, &targetIndex)) + properties_[sourceIndex].dependencies[targetIndex] = true; + } + } + else if (itr->value.IsObject()) { + hasSchemaDependencies_ = true; + schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document); + properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; + validatorCount_++; + } + } + } + } + + if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { + if (v->IsBool()) + additionalProperties_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document); + } + + AssignIfExist(minProperties_, value, GetMinPropertiesString()); + AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); + + // Array + if (const ValueType* v = GetMember(value, GetItemsString())) { + PointerType q = p.Append(GetItemsString(), allocator_); + if (v->IsObject()) // List validation + schemaDocument->CreateSchema(&itemsList_, q, *v, document); + else if (v->IsArray()) { // Tuple validation + itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); + SizeType index = 0; + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) + schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document); + } + } + + AssignIfExist(minItems_, value, GetMinItemsString()); + AssignIfExist(maxItems_, value, GetMaxItemsString()); + + if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { + if (v->IsBool()) + additionalItems_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document); + } + + AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); + + // String + AssignIfExist(minLength_, value, GetMinLengthString()); + AssignIfExist(maxLength_, value, GetMaxLengthString()); + + if (const ValueType* v = GetMember(value, GetPatternString())) + pattern_ = CreatePattern(*v); + + // Number + if (const ValueType* v = GetMember(value, GetMinimumString())) + if (v->IsNumber()) + minimum_.CopyFrom(*v, *allocator_); + + if (const ValueType* v = GetMember(value, GetMaximumString())) + if (v->IsNumber()) + maximum_.CopyFrom(*v, *allocator_); + + AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); + AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); + + if (const ValueType* v = GetMember(value, GetMultipleOfString())) + if (v->IsNumber() && v->GetDouble() > 0.0) + multipleOf_.CopyFrom(*v, *allocator_); + } + + ~Schema() { + if (allocator_) { + allocator_->Free(enum_); + } + if (properties_) { + for (SizeType i = 0; i < propertyCount_; i++) + properties_[i].~Property(); + AllocatorType::Free(properties_); + } + if (patternProperties_) { + for (SizeType i = 0; i < patternPropertyCount_; i++) + patternProperties_[i].~PatternProperty(); + AllocatorType::Free(patternProperties_); + } + AllocatorType::Free(itemsTuple_); +#if RAPIDJSON_SCHEMA_HAS_REGEX + if (pattern_) { + pattern_->~RegexType(); + allocator_->Free(pattern_); + } +#endif + } + + bool BeginValue(Context& context) const { + if (context.inArray) { + if (uniqueItems_) + context.valueUniqueness = true; + + if (itemsList_) + context.valueSchema = itemsList_; + else if (itemsTuple_) { + if (context.arrayElementIndex < itemsTupleCount_) + context.valueSchema = itemsTuple_[context.arrayElementIndex]; + else if (additionalItemsSchema_) + context.valueSchema = additionalItemsSchema_; + else if (additionalItems_) + context.valueSchema = GetTypeless(); + else + RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString()); + } + else + context.valueSchema = GetTypeless(); + + context.arrayElementIndex++; + } + return true; + } + + RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { + if (context.patternPropertiesValidatorCount > 0) { + bool otherValid = false; + SizeType count = context.patternPropertiesValidatorCount; + if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) + otherValid = context.patternPropertiesValidators[--count]->IsValid(); + + bool patternValid = true; + for (SizeType i = 0; i < count; i++) + if (!context.patternPropertiesValidators[i]->IsValid()) { + patternValid = false; + break; + } + + if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { + if (!patternValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { + if (!patternValid || !otherValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + else if (!patternValid && !otherValid) // kPatternValidatorWithAdditionalProperty) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + + if (enum_) { + const uint64_t h = context.factory.GetHashCode(context.hasher); + for (SizeType i = 0; i < enumCount_; i++) + if (enum_[i] == h) + goto foundEnum; + RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString()); + foundEnum:; + } + + if (allOf_.schemas) + for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) + if (!context.validators[i]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString()); + + if (anyOf_.schemas) { + for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) + if (context.validators[i]->IsValid()) + goto foundAny; + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString()); + foundAny:; + } + + if (oneOf_.schemas) { + bool oneValid = false; + for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) + if (context.validators[i]->IsValid()) { + if (oneValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + else + oneValid = true; + } + if (!oneValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } + + if (not_ && context.validators[notValidatorIndex_]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString()); + + return true; + } + + bool Null(Context& context) const { + if (!(type_ & (1 << kNullSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + return CreateParallelValidator(context); + } + + bool Bool(Context& context, bool) const { + if (!(type_ & (1 << kBooleanSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + return CreateParallelValidator(context); + } + + bool Int(Context& context, int i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint(Context& context, unsigned u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Int64(Context& context, int64_t i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint64(Context& context, uint64_t u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Double(Context& context, double d) const { + if (!(type_ & (1 << kNumberSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) + return false; + + if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) + return false; + + if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) + return false; + + return CreateParallelValidator(context); + } + + bool String(Context& context, const Ch* str, SizeType length, bool) const { + if (!(type_ & (1 << kStringSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (minLength_ != 0 || maxLength_ != SizeType(~0)) { + SizeType count; + if (internal::CountStringCodePoint(str, length, &count)) { + if (count < minLength_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString()); + if (count > maxLength_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString()); + } + } + + if (pattern_ && !IsPatternMatch(pattern_, str, length)) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString()); + + return CreateParallelValidator(context); + } + + bool StartObject(Context& context) const { + if (!(type_ & (1 << kObjectSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (hasDependencies_ || hasRequired_) { + context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); + std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); + } + + if (patternProperties_) { // pre-allocate schema array + SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType + context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); + context.patternPropertiesSchemaCount = 0; + std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); + } + + return CreateParallelValidator(context); + } + + bool Key(Context& context, const Ch* str, SizeType len, bool) const { + if (patternProperties_) { + context.patternPropertiesSchemaCount = 0; + for (SizeType i = 0; i < patternPropertyCount_; i++) + if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; + } + + SizeType index; + if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; + context.valueSchema = GetTypeless(); + context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; + } + else + context.valueSchema = properties_[index].schema; + + if (context.propertyExist) + context.propertyExist[index] = true; + + return true; + } + + if (additionalPropertiesSchema_) { + if (additionalPropertiesSchema_ && context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; + context.valueSchema = GetTypeless(); + context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; + } + else + context.valueSchema = additionalPropertiesSchema_; + return true; + } + else if (additionalProperties_) { + context.valueSchema = GetTypeless(); + return true; + } + + if (context.patternPropertiesSchemaCount == 0) // patternProperties are not additional properties + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString()); + + return true; + } + + bool EndObject(Context& context, SizeType memberCount) const { + if (hasRequired_) + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].required) + if (!context.propertyExist[index]) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString()); + + if (memberCount < minProperties_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString()); + + if (memberCount > maxProperties_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString()); + + if (hasDependencies_) { + for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) + if (context.propertyExist[sourceIndex]) { + if (properties_[sourceIndex].dependencies) { + for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) + if (properties_[sourceIndex].dependencies[targetIndex] && !context.propertyExist[targetIndex]) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + else if (properties_[sourceIndex].dependenciesSchema) + if (!context.validators[properties_[sourceIndex].dependenciesValidatorIndex]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + } + + return true; + } + + bool StartArray(Context& context) const { + if (!(type_ & (1 << kArraySchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + context.arrayElementIndex = 0; + context.inArray = true; + + return CreateParallelValidator(context); + } + + bool EndArray(Context& context, SizeType elementCount) const { + context.inArray = false; + + if (elementCount < minItems_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString()); + + if (elementCount > maxItems_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString()); + + return true; + } + + // Generate functions for string literal according to Ch +#define RAPIDJSON_STRING_(name, ...) \ + static const ValueType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const ValueType v(s, sizeof(s) / sizeof(Ch) - 1);\ + return v;\ + } + + RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') + RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') + RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') + RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') + RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') + RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') + RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') + RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') + RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') + RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') + RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') + RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') + RAPIDJSON_STRING_(Not, 'n', 'o', 't') + RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') + RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') + RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') + RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') + +#undef RAPIDJSON_STRING_ + +private: + enum SchemaValueType { + kNullSchemaType, + kBooleanSchemaType, + kObjectSchemaType, + kArraySchemaType, + kStringSchemaType, + kNumberSchemaType, + kIntegerSchemaType, + kTotalSchemaType + }; + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + typedef internal::GenericRegex RegexType; +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + typedef std::basic_regex RegexType; +#else + typedef char RegexType; +#endif + + struct SchemaArray { + SchemaArray() : schemas(), count() {} + ~SchemaArray() { AllocatorType::Free(schemas); } + const SchemaType** schemas; + SizeType begin; // begin index of context.validators + SizeType count; + }; + + static const SchemaType* GetTypeless() { + static SchemaType typeless(0, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), 0); + return &typeless; + } + + template + void AddUniqueElement(V1& a, const V2& v) { + for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + if (*itr == v) + return; + V1 c(v, *allocator_); + a.PushBack(c, *allocator_); + } + + static const ValueType* GetMember(const ValueType& value, const ValueType& name) { + typename ValueType::ConstMemberIterator itr = value.FindMember(name); + return itr != value.MemberEnd() ? &(itr->value) : 0; + } + + static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsBool()) + out = v->GetBool(); + } + + static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) + out = static_cast(v->GetUint64()); + } + + void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { + if (const ValueType* v = GetMember(value, name)) { + if (v->IsArray() && v->Size() > 0) { + PointerType q = p.Append(name, allocator_); + out.count = v->Size(); + out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); + memset(out.schemas, 0, sizeof(Schema*)* out.count); + for (SizeType i = 0; i < out.count; i++) + schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document); + out.begin = validatorCount_; + validatorCount_ += out.count; + } + } + } + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString()); + if (!r->IsValid()) { + r->~RegexType(); + AllocatorType::Free(r); + r = 0; + } + return r; + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { + return pattern->Search(str); + } +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) + try { + return new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); + } + catch (const std::regex_error&) { + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { + std::match_results r; + return std::regex_search(str, str + length, r, *pattern); + } +#else + template + RegexType* CreatePattern(const ValueType&) { return 0; } + + static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } +#endif // RAPIDJSON_SCHEMA_USE_STDREGEX + + void AddType(const ValueType& type) { + if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; + else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; + else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; + else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; + else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; + else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; + else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); + } + + bool CreateParallelValidator(Context& context) const { + if (enum_ || context.arrayUniqueness) + context.hasher = context.factory.CreateHasher(); + + if (validatorCount_) { + RAPIDJSON_ASSERT(context.validators == 0); + context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + context.validatorCount = validatorCount_; + + if (allOf_.schemas) + CreateSchemaValidators(context, allOf_); + + if (anyOf_.schemas) + CreateSchemaValidators(context, anyOf_); + + if (oneOf_.schemas) + CreateSchemaValidators(context, oneOf_); + + if (not_) + context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_); + + if (hasSchemaDependencies_) { + for (SizeType i = 0; i < propertyCount_; i++) + if (properties_[i].dependenciesSchema) + context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema); + } + } + + return true; + } + + void CreateSchemaValidators(Context& context, const SchemaArray& schemas) const { + for (SizeType i = 0; i < schemas.count; i++) + context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]); + } + + // O(n) + bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { + SizeType len = name.GetStringLength(); + const Ch* str = name.GetString(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].name.GetStringLength() == len && + (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) + { + *outIndex = index; + return true; + } + return false; + } + + bool CheckInt(Context& context, int64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull()) { + if (minimum_.IsInt64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + else if (minimum_.IsUint64()) { + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); // i <= max(int64_t) < minimum.GetUint64() + } + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsInt64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + else if (maximum_.IsUint64()) + /* do nothing */; // i <= max(int64_t) < maximum_.GetUint64() + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckUint(Context& context, uint64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull()) { + if (minimum_.IsUint64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + else if (minimum_.IsInt64()) + /* do nothing */; // i >= 0 > minimum.Getint64() + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsUint64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + else if (maximum_.IsInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); // i >= 0 > maximum_ + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (i % multipleOf_.GetUint64() != 0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckDoubleMinimum(Context& context, double d) const { + if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + return true; + } + + bool CheckDoubleMaximum(Context& context, double d) const { + if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + return true; + } + + bool CheckDoubleMultipleOf(Context& context, double d) const { + double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); + double q = std::floor(a / b); + double r = a - q * b; + if (r > 0.0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + return true; + } + + struct Property { + Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} + ~Property() { AllocatorType::Free(dependencies); } + SValue name; + const SchemaType* schema; + const SchemaType* dependenciesSchema; + SizeType dependenciesValidatorIndex; + bool* dependencies; + bool required; + }; + + struct PatternProperty { + PatternProperty() : schema(), pattern() {} + ~PatternProperty() { + if (pattern) { + pattern->~RegexType(); + AllocatorType::Free(pattern); + } + } + const SchemaType* schema; + RegexType* pattern; + }; + + AllocatorType* allocator_; + uint64_t* enum_; + SizeType enumCount_; + SchemaArray allOf_; + SchemaArray anyOf_; + SchemaArray oneOf_; + const SchemaType* not_; + unsigned type_; // bitmask of kSchemaType + SizeType validatorCount_; + SizeType notValidatorIndex_; + + Property* properties_; + const SchemaType* additionalPropertiesSchema_; + PatternProperty* patternProperties_; + SizeType patternPropertyCount_; + SizeType propertyCount_; + SizeType minProperties_; + SizeType maxProperties_; + bool additionalProperties_; + bool hasDependencies_; + bool hasRequired_; + bool hasSchemaDependencies_; + + const SchemaType* additionalItemsSchema_; + const SchemaType* itemsList_; + const SchemaType** itemsTuple_; + SizeType itemsTupleCount_; + SizeType minItems_; + SizeType maxItems_; + bool additionalItems_; + bool uniqueItems_; + + RegexType* pattern_; + SizeType minLength_; + SizeType maxLength_; + + SValue minimum_; + SValue maximum_; + SValue multipleOf_; + bool exclusiveMinimum_; + bool exclusiveMaximum_; +}; + +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + *documentStack.template Push() = '/'; + char buffer[21]; + size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); + for (size_t i = 0; i < length; i++) + *documentStack.template Push() = buffer[i]; + } +}; + +// Partial specialized version for char to prevent buffer copying. +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + if (sizeof(SizeType) == 4) { + char *buffer = documentStack.template Push(1 + 10); // '/' + uint + *buffer++ = '/'; + const char* end = internal::u32toa(index, buffer); + documentStack.template Pop(static_cast(10 - (end - buffer))); + } + else { + char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 + *buffer++ = '/'; + const char* end = internal::u64toa(index, buffer); + documentStack.template Pop(static_cast(20 - (end - buffer))); + } + } +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// IGenericRemoteSchemaDocumentProvider + +template +class IGenericRemoteSchemaDocumentProvider { +public: + typedef typename SchemaDocumentType::Ch Ch; + + virtual ~IGenericRemoteSchemaDocumentProvider() {} + virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaDocument + +//! JSON schema document. +/*! + A JSON schema document is a compiled version of a JSON schema. + It is basically a tree of internal::Schema. + + \note This is an immutable class (i.e. its instance cannot be modified after construction). + \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. + \tparam Allocator Allocator type for allocating memory of this document. +*/ +template +class GenericSchemaDocument { +public: + typedef ValueT ValueType; + typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; + typedef Allocator AllocatorType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef internal::Schema SchemaType; + typedef GenericPointer PointerType; + friend class internal::Schema; + template + friend class GenericSchemaValidator; + + //! Constructor. + /*! + Compile a JSON document into schema document. + + \param document A JSON document as source. + \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. + \param allocator An optional allocator instance for allocating memory. Can be null. + */ + explicit GenericSchemaDocument(const ValueType& document, IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0) : + remoteProvider_(remoteProvider), + allocator_(allocator), + ownAllocator_(), + root_(), + schemaMap_(allocator, kInitialSchemaMapSize), + schemaRef_(allocator, kInitialSchemaRefSize) + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + // Generate root schema, it will call CreateSchema() to create sub-schemas, + // And call AddRefSchema() if there are $ref. + CreateSchemaRecursive(&root_, PointerType(), document, document); + + // Resolve $ref + while (!schemaRef_.Empty()) { + SchemaRefEntry* refEntry = schemaRef_.template Pop(1); + if (const SchemaType* s = GetSchema(refEntry->target)) { + if (refEntry->schema) + *refEntry->schema = s; + + // Create entry in map if not exist + if (!GetSchema(refEntry->source)) { + new (schemaMap_.template Push()) SchemaEntry(refEntry->source, const_cast(s), false, allocator_); + } + } + refEntry->~SchemaRefEntry(); + } + + RAPIDJSON_ASSERT(root_ != 0); + + schemaRef_.ShrinkToFit(); // Deallocate all memory for ref + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : + remoteProvider_(rhs.remoteProvider_), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + root_(rhs.root_), + schemaMap_(std::move(rhs.schemaMap_)), + schemaRef_(std::move(rhs.schemaRef_)) + { + rhs.remoteProvider_ = 0; + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + } +#endif + + //! Destructor + ~GenericSchemaDocument() { + while (!schemaMap_.Empty()) + schemaMap_.template Pop(1)->~SchemaEntry(); + + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Get the root schema. + const SchemaType& GetRoot() const { return *root_; } + +private: + //! Prohibit copying + GenericSchemaDocument(const GenericSchemaDocument&); + //! Prohibit assignment + GenericSchemaDocument& operator=(const GenericSchemaDocument&); + + struct SchemaRefEntry { + SchemaRefEntry(const PointerType& s, const PointerType& t, const SchemaType** outSchema, Allocator *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {} + PointerType source; + PointerType target; + const SchemaType** schema; + }; + + struct SchemaEntry { + SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} + ~SchemaEntry() { + if (owned) { + schema->~SchemaType(); + Allocator::Free(schema); + } + } + PointerType pointer; + SchemaType* schema; + bool owned; + }; + + void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + if (schema) + *schema = SchemaType::GetTypeless(); + + if (v.GetType() == kObjectType) { + const SchemaType* s = GetSchema(pointer); + if (!s) + CreateSchema(schema, pointer, v, document); + + for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) + CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document); + } + else if (v.GetType() == kArrayType) + for (SizeType i = 0; i < v.Size(); i++) + CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document); + } + + void CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + RAPIDJSON_ASSERT(pointer.IsValid()); + if (v.IsObject()) { + if (!HandleRefSchema(pointer, schema, v, document)) { + SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_); + new (schemaMap_.template Push()) SchemaEntry(pointer, s, true, allocator_); + if (schema) + *schema = s; + } + } + } + + bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document) { + static const Ch kRefString[] = { '$', 'r', 'e', 'f', '\0' }; + static const ValueType kRefValue(kRefString, 4); + + typename ValueType::ConstMemberIterator itr = v.FindMember(kRefValue); + if (itr == v.MemberEnd()) + return false; + + if (itr->value.IsString()) { + SizeType len = itr->value.GetStringLength(); + if (len > 0) { + const Ch* s = itr->value.GetString(); + SizeType i = 0; + while (i < len && s[i] != '#') // Find the first # + i++; + + if (i > 0) { // Remote reference, resolve immediately + if (remoteProvider_) { + if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(s, i - 1)) { + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const SchemaType* sc = remoteDocument->GetSchema(pointer)) { + if (schema) + *schema = sc; + return true; + } + } + } + } + } + else if (s[i] == '#') { // Local reference, defer resolution + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const ValueType* nv = pointer.Get(document)) + if (HandleRefSchema(source, schema, *nv, document)) + return true; + + new (schemaRef_.template Push()) SchemaRefEntry(source, pointer, schema, allocator_); + return true; + } + } + } + } + return false; + } + + const SchemaType* GetSchema(const PointerType& pointer) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (pointer == target->pointer) + return target->schema; + return 0; + } + + PointerType GetPointer(const SchemaType* schema) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (schema == target->schema) + return target->pointer; + return PointerType(); + } + + static const size_t kInitialSchemaMapSize = 64; + static const size_t kInitialSchemaRefSize = 64; + + IRemoteSchemaDocumentProviderType* remoteProvider_; + Allocator *allocator_; + Allocator *ownAllocator_; + const SchemaType* root_; //!< Root schema. + internal::Stack schemaMap_; // Stores created Pointer -> Schemas + internal::Stack schemaRef_; // Stores Pointer from $ref and schema which holds the $ref +}; + +//! GenericSchemaDocument using Value type. +typedef GenericSchemaDocument SchemaDocument; +//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaValidator + +//! JSON Schema Validator. +/*! + A SAX style JSON schema validator. + It uses a \c GenericSchemaDocument to validate SAX events. + It delegates the incoming SAX events to an output handler. + The default output handler does nothing. + It can be reused multiple times by calling \c Reset(). + + \tparam SchemaDocumentType Type of schema document. + \tparam OutputHandler Type of output handler. Default handler does nothing. + \tparam StateAllocator Allocator for storing the internal validation states. +*/ +template < + typename SchemaDocumentType, + typename OutputHandler = BaseReaderHandler, + typename StateAllocator = CrtAllocator> +class GenericSchemaValidator : + public internal::ISchemaStateFactory, + public internal::ISchemaValidator +{ +public: + typedef typename SchemaDocumentType::SchemaType SchemaType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename SchemaType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + + //! Constructor without output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + outputHandler_(GetNullHandler()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Constructor with output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + OutputHandler& outputHandler, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + outputHandler_(outputHandler), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Destructor. + ~GenericSchemaValidator() { + Reset(); + RAPIDJSON_DELETE(ownStateAllocator_); + } + + //! Reset the internal states. + void Reset() { + while (!schemaStack_.Empty()) + PopSchema(); + documentStack_.Clear(); + valid_ = true; + } + + //! Checks whether the current state is valid. + // Implementation of ISchemaValidator + virtual bool IsValid() const { return valid_; } + + //! Gets the JSON pointer pointed to the invalid schema. + PointerType GetInvalidSchemaPointer() const { + return schemaStack_.Empty() ? PointerType() : schemaDocument_->GetPointer(&CurrentSchema()); + } + + //! Gets the keyword of invalid schema. + const Ch* GetInvalidSchemaKeyword() const { + return schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword; + } + + //! Gets the JSON pointer pointed to the invalid value. + PointerType GetInvalidDocumentPointer() const { + return documentStack_.Empty() ? PointerType() : PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); + } + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + *documentStack_.template Push() = '\0';\ + documentStack_.template Pop(1);\ + internal::PrintInvalidDocument(documentStack_.template Bottom());\ +RAPIDJSON_MULTILINEMACRO_END +#else +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() +#endif + +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ + if (!valid_) return false; \ + if (!BeginValue() || !CurrentSchema().method arg1) {\ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\ + return valid_ = false;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ + for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ + if (context->hasher)\ + static_cast(context->hasher)->method arg2;\ + if (context->validators)\ + for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ + static_cast(context->validators[i_])->method arg2;\ + if (context->patternPropertiesValidators)\ + for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ + static_cast(context->patternPropertiesValidators[i_])->method arg2;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ + return valid_ = EndValue() && outputHandler_.method arg2 + +#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ + RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) + + bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext() ), ( )); } + bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool RawNumber(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + bool String(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + + bool StartObject() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); + return valid_ = outputHandler_.StartObject(); + } + + bool Key(const Ch* str, SizeType len, bool copy) { + if (!valid_) return false; + AppendToken(str, len); + if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); + return valid_ = outputHandler_.Key(str, len, copy); + } + + bool EndObject(SizeType memberCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); + if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); + } + + bool StartArray() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); + return valid_ = outputHandler_.StartArray(); + } + + bool EndArray(SizeType elementCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); + if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); + } + +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_ +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ +#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ +#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ + + // Implementation of ISchemaStateFactory + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root) { + return new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, +#if RAPIDJSON_SCHEMA_VERBOSE + depth_ + 1, +#endif + &GetStateAllocator()); + } + + virtual void DestroySchemaValidator(ISchemaValidator* validator) { + GenericSchemaValidator* v = static_cast(validator); + v->~GenericSchemaValidator(); + StateAllocator::Free(v); + } + + virtual void* CreateHasher() { + return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); + } + + virtual uint64_t GetHashCode(void* hasher) { + return static_cast(hasher)->GetHashCode(); + } + + virtual void DestroryHasher(void* hasher) { + HasherType* h = static_cast(hasher); + h->~HasherType(); + StateAllocator::Free(h); + } + + virtual void* MallocState(size_t size) { + return GetStateAllocator().Malloc(size); + } + + virtual void FreeState(void* p) { + return StateAllocator::Free(p); + } + +private: + typedef typename SchemaType::Context Context; + typedef GenericValue, StateAllocator> HashCodeArray; + typedef internal::Hasher HasherType; + + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + const SchemaType& root, +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth, +#endif + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(root), + outputHandler_(GetNullHandler()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(depth) +#endif + { + } + + StateAllocator& GetStateAllocator() { + if (!stateAllocator_) + stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator()); + return *stateAllocator_; + } + + bool BeginValue() { + if (schemaStack_.Empty()) + PushSchema(root_); + else { + if (CurrentContext().inArray) + internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); + + if (!CurrentSchema().BeginValue(CurrentContext())) + return false; + + SizeType count = CurrentContext().patternPropertiesSchemaCount; + const SchemaType** sa = CurrentContext().patternPropertiesSchemas; + typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; + bool valueUniqueness = CurrentContext().valueUniqueness; + if (CurrentContext().valueSchema) + PushSchema(*CurrentContext().valueSchema); + + if (count > 0) { + CurrentContext().objectPatternValidatorType = patternValidatorType; + ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; + SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; + va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); + for (SizeType i = 0; i < count; i++) + va[validatorCount++] = CreateSchemaValidator(*sa[i]); + } + + CurrentContext().arrayUniqueness = valueUniqueness; + } + return true; + } + + bool EndValue() { + if (!CurrentSchema().EndValue(CurrentContext())) + return false; + +#if RAPIDJSON_SCHEMA_VERBOSE + GenericStringBuffer sb; + schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb); + + *documentStack_.template Push() = '\0'; + documentStack_.template Pop(1); + internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom()); +#endif + + uint64_t h = CurrentContext().arrayUniqueness ? static_cast(CurrentContext().hasher)->GetHashCode() : 0; + + PopSchema(); + + if (!schemaStack_.Empty()) { + Context& context = CurrentContext(); + if (context.valueUniqueness) { + HashCodeArray* a = static_cast(context.arrayElementHashCodes); + if (!a) + CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); + for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) + if (itr->GetUint64() == h) + RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString()); + a->PushBack(h, GetStateAllocator()); + } + } + + // Remove the last token of document pointer + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') + ; + + return true; + } + + void AppendToken(const Ch* str, SizeType len) { + documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters + *documentStack_.template PushUnsafe() = '/'; + for (SizeType i = 0; i < len; i++) { + if (str[i] == '~') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '0'; + } + else if (str[i] == '/') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '1'; + } + else + *documentStack_.template PushUnsafe() = str[i]; + } + } + + RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, &schema); } + + RAPIDJSON_FORCEINLINE void PopSchema() { + Context* c = schemaStack_.template Pop(1); + if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { + a->~HashCodeArray(); + StateAllocator::Free(a); + } + c->~Context(); + } + + const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } + Context& CurrentContext() { return *schemaStack_.template Top(); } + const Context& CurrentContext() const { return *schemaStack_.template Top(); } + + static OutputHandler& GetNullHandler() { + static OutputHandler nullHandler; + return nullHandler; + } + + static const size_t kDefaultSchemaStackCapacity = 1024; + static const size_t kDefaultDocumentStackCapacity = 256; + const SchemaDocumentType* schemaDocument_; + const SchemaType& root_; + OutputHandler& outputHandler_; + StateAllocator* stateAllocator_; + StateAllocator* ownStateAllocator_; + internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) + internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) + bool valid_; +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth_; +#endif +}; + +typedef GenericSchemaValidator SchemaValidator; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidatingReader + +//! A helper class for parsing with validation. +/*! + This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). + + \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam SourceEncoding Encoding of the input stream. + \tparam SchemaDocumentType Type of schema document. + \tparam StackAllocator Allocator type for stack. +*/ +template < + unsigned parseFlags, + typename InputStream, + typename SourceEncoding, + typename SchemaDocumentType = SchemaDocument, + typename StackAllocator = CrtAllocator> +class SchemaValidatingReader { +public: + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename InputStream::Ch Ch; + + //! Constructor + /*! + \param is Input stream. + \param sd Schema document. + */ + SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), isValid_(true) {} + + template + bool operator()(Handler& handler) { + GenericReader reader; + GenericSchemaValidator validator(sd_, handler); + parseResult_ = reader.template Parse(is_, validator); + + isValid_ = validator.IsValid(); + if (isValid_) { + invalidSchemaPointer_ = PointerType(); + invalidSchemaKeyword_ = 0; + invalidDocumentPointer_ = PointerType(); + } + else { + invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); + invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); + invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); + } + + return parseResult_; + } + + const ParseResult& GetParseResult() const { return parseResult_; } + bool IsValid() const { return isValid_; } + const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } + const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } + const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } + +private: + InputStream& is_; + const SchemaDocumentType& sd_; + + ParseResult parseResult_; + PointerType invalidSchemaPointer_; + const Ch* invalidSchemaKeyword_; + PointerType invalidDocumentPointer_; + bool isValid_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_SCHEMA_H_ diff --git a/OtherInc/rapidjson/stream.h b/OtherInc/rapidjson/stream.h new file mode 100644 index 0000000..fef82c2 --- /dev/null +++ b/OtherInc/rapidjson/stream.h @@ -0,0 +1,179 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "rapidjson.h" + +#ifndef RAPIDJSON_STREAM_H_ +#define RAPIDJSON_STREAM_H_ + +#include "encodings.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits. + */ + enum { copyOptimization = 0 }; +}; + +//! Reserve n characters for writing to a stream. +template +inline void PutReserve(Stream& stream, size_t count) { + (void)stream; + (void)count; +} + +//! Write character to a stream, presuming buffer is reserved. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { + stream.Put(c); +} + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + PutReserve(stream, n); + for (size_t i = 0; i < n; i++) + PutUnsafe(stream, c); +} + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast(src_ - head_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast(src_ - head_); } + + // Write + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream > InsituStringStream; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STREAM_H_ diff --git a/OtherInc/rapidjson/stringbuffer.h b/OtherInc/rapidjson/stringbuffer.h new file mode 100644 index 0000000..78f34d2 --- /dev/null +++ b/OtherInc/rapidjson/stringbuffer.h @@ -0,0 +1,117 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#include "internal/stack.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push() = c; } + void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop(1); + } + + void Reserve(size_t count) { stack_.template Reserve(count); } + Ch* Push(size_t count) { return stack_.template Push(count); } + Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer > StringBuffer; + +template +inline void PutReserve(GenericStringBuffer& stream, size_t count) { + stream.Reserve(count); +} + +template +inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { + stream.PutUnsafe(c); +} + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + std::memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/OtherInc/rapidjson/writer.h b/OtherInc/rapidjson/writer.h new file mode 100644 index 0000000..94f22dd --- /dev/null +++ b/OtherInc/rapidjson/writer.h @@ -0,0 +1,610 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "stream.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include // placement new + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// WriteFlag + +/*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kWriteDefaultFlags definition. + + User can define this as any \c WriteFlag combinations. +*/ +#ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS +#define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags +#endif + +//! Combination of writeFlags +enum WriteFlag { + kWriteNoFlags = 0, //!< No flags are set. + kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. + kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. + kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS +}; + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + static const int kDefaultMaxDecimalPlaces = 324; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + int GetMaxDecimalPlaces() const { + return maxDecimalPlaces_; + } + + //! Sets the maximum number of decimal places for double output. + /*! + This setting truncates the output with specified number of decimal places. + + For example, + + \code + writer.SetMaxDecimalPlaces(3); + writer.StartArray(); + writer.Double(0.12345); // "0.123" + writer.Double(0.0001); // "0.0" + writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) + writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) + writer.EndArray(); + \endcode + + The default setting does not truncate any decimal places. You can restore to this setting by calling + \code + writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); + \endcode + */ + void SetMaxDecimalPlaces(int maxDecimalPlaces) { + maxDecimalPlaces_ = maxDecimalPlaces; + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } + bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } + bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } + bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + Prefix(kNumberType); + return EndValue(WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + Prefix(kStringType); + return EndValue(WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndObject()); + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndArray()); + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + */ + bool RawValue(const Ch* json, size_t length, Type type) { Prefix(type); return EndValue(WriteRawValue(json, length)); } + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + static const size_t kDefaultLevelDepth = 32; + + bool WriteNull() { + PutReserve(*os_, 4); + PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + PutReserve(*os_, 4); + PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); + } + else { + PutReserve(*os_, 5); + PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + if (!(writeFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char buffer[25]; + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const typename TargetEncoding::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + if (TargetEncoding::supportUnicode) + PutReserve(*os_, 2 + length * 6); // "\uxxxx..." + else + PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." + + PutUnsafe(*os_, '\"'); + GenericStringStream is(str); + while (ScanWriteUnescapedString(is, length)) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) + return false; + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); + } + else { + RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(lead ) & 15]); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(trail ) & 15]); + } + } + else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { + is.Take(); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, static_cast(escape[static_cast(c)])); + if (escape[static_cast(c)] == 'u') { + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); + PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); + } + } + else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + PutUnsafe(*os_, '\"'); + return true; + } + + bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { + return RAPIDJSON_LIKELY(is.Tell() < length); + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + bool WriteRawValue(const Ch* json, size_t length) { + PutReserve(*os_, length); + for (size_t i = 0; i < length; i++) { + RAPIDJSON_ASSERT(json[i] != '\0'); + PutUnsafe(*os_, json[i]); + } + return true; + } + + void Prefix(Type type) { + (void)type; + if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + // Flush the value if it is the top level one. + bool EndValue(bool ret) { + if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text + os_->Flush(); + return ret; + } + + OutputStream* os_; + internal::Stack level_stack_; + int maxDecimalPlaces_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(static_cast(11 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(static_cast(10 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(static_cast(21 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(static_cast(20 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). + if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + os_->Pop(static_cast(25 - (end - buffer))); + return true; +} + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (; p != endAligned; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType len; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + len = offset; +#else + len = static_cast(__builtin_ffs(r) - 1); +#endif + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#endif // defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + +RAPIDJSON_NAMESPACE_END + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/OtherLib/engines-3/capi.dll b/OtherLib/engines-3/capi.dll new file mode 100644 index 0000000000000000000000000000000000000000..d189dfe3713fa1d36f8b678025bf58815a76af17 GIT binary patch literal 53248 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୊?EZ{EF3 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 literal 0 HcmV?d00001 diff --git a/OtherLib/engines-3/loader_attic.dll b/OtherLib/engines-3/loader_attic.dll new file mode 100644 index 0000000000000000000000000000000000000000..becf458ca03e644a39be4f577a624b392d8c2fcd GIT binary patch literal 61952 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 literal 0 HcmV?d00001 diff --git a/OtherLib/libMinHook.x86.lib b/OtherLib/libMinHook.x86.lib new file mode 100644 index 0000000000000000000000000000000000000000..7435e436c2228de7a2c315b38e308ce42ebd6962 GIT binary patch literal 245350 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